Pakurino (5)
少し間があいてしまいましたが、スケッチ「FMmelody」のプログラムの説明に入りたいと思います。
まずは、ファイル構成と、各ファイルの簡単な説明からです。
ファイル構成
アーカイブ・ファイルを解凍すると「FMmelody」フォルダが作成され、その下には次のようなファイルがおさめられています。
- FMmelody.pde
- FMmelody スケッチ本体
- FMop.cpp
- FM 音源のオペレータ部分のプログラム
- NosDAC.cpp
- ノンオーバーサンプリング DAC をサポートするためのプログラム
- NosDAC.h
- NosDAC.cpp 用のヘッダ・ファイル
- PWMDAC.cpp
- 内蔵 TIMER1 を使った PWM による DAC をサポートするためのプログラム
- PWMDAC.h
- PWMDAC.h 用のヘッダ・ファイル
- fmtg.h
- FMmelody プログラム全体で使用するヘッダ・ファイル
- fnum4.cpp
- 16 MHz クロック用の F-NUMBER テーブル
- notedefs.h
- MIDI ノート番号と、音符の長さの数値の定義
- stab128.cpp
- 正弦波テーブル
- tables.cpp
- 各種テーブル
テーブルは C/C++ 言語の初期値付きの配列で実現しています。
配列を定義しているプログラム自体は、別の配列生成用プログラムによって自動的に生成しているので、配列部分をスケッチ本体とは別ファイルとし、テーブル変更時に容易に置き換えられるようにしています。
FMop.cpp、NosDAC.cpp、PWMDAC.cpp は、ライブラリ化を意識して別ファイルとしていますが、まだ完成度は低く、ライブラリとしての十分な独立性、一般性を持っていません。
PWM を使う場合には、NosDAC.cpp、NosDAC.h は必要なく、同様にノンオーバーサンプリング DAC を使う場合には PWMDAC.cpp、PWMDAC.h は必要ありません。
必要のないファイルを残しておいても必要のない関数はリンクされず、プログラムの動作には支障はありませんが、「割り込みサービスルーチン」は、その性質上、存在するだけでリンクされてしまいますから、「バイナリー・スケッチ・サイズ」が無駄に増えてしまいます。
PWMDAC.cpp は TIMER1 を使うので、同じ TIMER1 を使うオプション・ライブラリの「TimerOne」とは両立しません。
同様に、NosDAC.cpp は TIMER2 を使うので、同じ TIMER2 を使うオプション・ライブラリの「MsTimer2」とは両立しません。
PWMDAC + MsTimer2 あるいは NosDAC + TimerOne という組み合わせでは使えますが、前述のように、使わない側のファイルを残しておくと「割り込みサービスルーチン」がライブラリ側とバッティングします。