2017/04/22
R8C/M12Aでファミコン音源の実装
ルネサスのマイコン「R8C/M12A」でファミコン音源の実装を試みました。
「ファミコンなんて昔の8bitコンピュータだから余裕っしょ」
と考えていたら甘かった。。
ファミコンすごいわ。
最初はDDS(Direct Digital Synthesizer)を作り出したけれどフィルターがうまくいかなくてファミコンってどんなフィルター持ってるんだろうと調べたらフィルター持ってないことが分かりどーやってあんなに色んな音色を作り出しているのか気になって作ることになりました。
y[i] = y[i-1] + m * (x[i] - y[i-1])
この簡単なローパス・フィルタをうまく動かせないー
アナログシンセを作るにあたって自分が一番めんどいなーと思うのはオシレータのチューニング。なのでJUNO-106にならいオシレータはデジタルでDCOにすればいいかとR8C/M12Aでやってみたら意外に簡単にできたのでじゃあ1チップシンセにしてしまえーとやりだしたら三角関数が使えないわ小数使えないわで壁にぶち当たってます。
カットオフとレゾナンスは必須っす。
話は戻りファミコン音源。サンプル周波数32kHzでパルス派2個、三角波1個、ノイズ1個の計4個波形を生成しようと試みたけれど、クロックが20MHzの場合割り込み間隔が625クロックしかなくて生成が間に合わず(多分…)、16kHzに変更。でもそうするとPWMの幅を決める値がアバウトになりすぎてかなーり音痴になってしまう。じつは32kHzでも気にすれば気になるくらいのずれがあった。16kHzにして処理が間に合っても音痴では使いものにならない。
とゆーわけで考えた仕様がこれ。
MIDIノート69、鍵盤番号A4、周波数440Hzの場合、割り込み回数は32.363636…となって、0.363636…の部分が音痴の原因となる。
ので1周期は32回、2周期は64回、3周期は108回 + 1.090909…回となるので3周期したら割り込み1回スルーして0.090909…を誤差とするようにした。これで大分音痴は改善された。
今回は単体でスーパーマリオを演奏するようにしたけれどやっぱりMIDI機能つけたいなー。まぁこれはまた今度。