= [[ProjectName]] [[ProjectDescription]] ブログ(コメントなど): [http://kamide.b.sourceforge.jp/pwmdac_synth_lib/ PWMDAC_Synthライブラリ] 最近の Arduino では tone() 関数が搭載され、単音の矩形波を簡単に出せるようになりました。 しかし、この方法では和音を出したり、矩形波以外の波形を出すのは困難です。 この[[ProjectName]]を使えば6重和音まで出せて、しかも矩形波だけでなく 正弦波、三角波、のこぎり波、ユーザー定義の波形も出すことができ、 さらにADSRエンベロープによる減衰で「ポーン」という感じの音色にすることもできます。 == どうやって実現してるの? 人間の可聴周波数は 20Hz ~ 20kHz 程度ですが、 ArduinoのPWM周波数はデフォルトで約490Hzになっているため、 そのままでは 1kHz 前後の高い音を乗せることができません。 高い音を乗せるためにはPWM周波数をもっと上げる必要がありますが、 そのためにはAVRマイコンのレジスタを設定し直す必要があります。 このライブラリでは、AVRマイコンのレジスタを設定し直して PWM周波数を最大(30kHz以上すなわち超音波の領域)に設定し、 高い可聴周波数の音も乗せられるようにします。 最大化されたPWM周波数に応じ、割り込みサービスルーチン ISR() が数十マイクロ秒ごとの正確なタイミングで呼び出されます。 この ISR() 呼び出しのタイミングでプログラムメモリ(PROGMEM)上の波形テーブルをもとに、 現時点の瞬間におけるパルス幅を計算して設定します。 これを延々と繰り返すことで、波形テーブル通りの音がPWM変調されて出力されます。 音階(音の周波数)は、波形テーブルの現在位置(位相)をどれくらいのスピードで進めるかを表す「位相速度」に変換されます。 位相速度の分を ISR() 呼び出しごとに位相に加算し、現時点の瞬間が波形のどこであるか(位相)を特定します。 これにより正確な音階を出力することができるようになっています。 同時発音数だけパルス幅を足し算することで、和音を出すこともできるようになっています。 ただし処理時間にそれほど余裕がないため、処理時間のかかる命令を極力さけて最適化したうえで、 限られた同時発音数で発音させることになります。 == MIDI音源として使う [http://playground.arduino.cc/Main/MIDILibrary Arduino用MIDI ライブラリ]と組み合わせることで簡易MIDI音源を作ることも可能です。 付属のサンプルプログラム(Arduino IDE の「スケッチの例」からコンパイル可)に実装例がありますので参照してください。 なお、MIDI入出力の回路については[/users/kamide/pf/CAmiDion CAmiDion]の回路図を参照してください。 == 関数の使い方 中に入っている README.txt を参照してください。関数定義の詳細については PWMDAC_Synth.h もあわせて参照してください。 [[RepositoryInfo]] == リリースファイル (Release Files) Gitリポジトリ、または作業部屋にあるzipファイルを参照。 [[ReleaseList]] == 最近のコミット (Recent Commits) [[RecentCommit]] [[RepositoryReadme]] == 最近更新されたチケット (Latest updated Tickets) [[RecentTickets(limit=5)]] {{{ comment [[RecentBlog]] }}}