ふと、↑出来るのではないか?というアイデアが浮かぶ。NDS_BGMFILER で MIDI 演奏する上で最大の課題は、PCM 波形データでメモリ不足になることだ。16ch というチャンネル数に加え、途中で音色変更する分も考えると全ての PCM 波形をオンメモリに置いておく方法しか思い付かなかった。
SDカードから随時読込みながら演奏するのって、mp3 や wav ファイルでは良くあることだが、これを 16ch 分の MIDI 演奏に応用するとどうなるか。そもそも、SDカードやメモリの帯域、CPUパワー的に行けるのか?という疑問が残る。
ただ、256×192 16bit の bmp 画像垂れ流しで、22~30fps の動画再生が出来ていることを考えると、SDカードの読込み速度は、およそ 2~3MB/sec 程度あるはず。32KHz、16bit、1秒分の読込みを考えると、逆算で PCM 30~45 ch 分の読込み帯域はあるのかな。
オンメモリに Note-On 直後の1秒分ぐらいの PCM 波形データは常に置いておき、1秒以上の PCM 波形はランタイムで SDカード から読むようにすれば、PCM波形でメモリ不足になる問題は少しだけ回避できるかもしれない。
これを実現しようとする場合、ARM7 で PCM バッファ充填用の周期割込みを発生させ、FIFO 通信で ARM9 に割込みを入れる。ARM9 の割込みから isnd_dtq() で SDカード読込みタスク へ通知し、実際の read 処理はタスクで行なう。read 中に次々に要求が来ても、データキューにキューイングされ、各チャンネルの PCM バッファが枯渇するまでに read が完了すれば問題はない。
重要なのはこの SD カード read タスクの優先度だ。DLDI パッチが当たった DSTT 対応のドライバは OS 非対応だからポーリング的に処理せざるを得ない。優先度を高くすると他の処理が何もできなくなるし、優先度を低くすると、read のための CPU 処理が滞ってしまう。う~む。
DMA 的な read 転送コマンドを発行するタスクの優先度を高くして、コマンド転送と同時にスリープし、転送完了割込みで起床できれば一番いい設計なのだけど、DSTT 用の DLDI パッチってどんな風になっているのだろう。