gombeのブログ

マイコンの電子工作系PIC32/KiCad/C/C++/3D/

MachiKaniaでの音楽の再生

MachiKaniaマイコンの限界まで詰め込んだビデオゲームシステムですが、ビデオは素晴らしいのですが音楽がチープだったのでそれを改善するためのプロジェクト。

まず元々のプロジェクトでは音声出力はOC(OutCompare)を使ってコンペアマッチイベントでピンをトグルすることで目的の波形を生成しています。負荷率はほぼ0%に近く、おかげに常にDutyRatioが50%というものですが1chでおかげに出力が矩形波のみです。エンベロープはなしです。

ということで改善させてみました。使用を以下のようにまとめます。

・任意波形形式(テーブル参照方式)をとり、矩形波のみならず様々な波形を出力する。

例えば矩形波、オルガン、三角波、波形ではありませんがホワイトノイズなどを扱います。まあ2-3chですかね?負荷が結構高いのであまり同時に再生ができません。

エンベロープを実装し、音の減衰を再現する。

これが実は音の要素としてかなり重要になります。FF3のファミコン音源が私は大好きでいまも聞きながら書いていますが(ww)、音の減衰がかなり精密に作られていて、とてもすばらしいです。

・サンプリング16kで、出力周波数は200khz付近、周波数が高いのでテレビ内蔵のフィルターなどを用いて、元の回路そのままで再現可能にする。

当たり前ですが回路の拡張が必要だったら誰も使いません。そんなわけで回路はそのまま、機能のみ拡張(負荷も上がりますが)。とします。

まずはWaveTable方式について説明します。PCM音源とは異なる点がバッファのサイズです。本システムでは音源を再生するための十分な容量が確保できません。なので小さな一周期分のテーブルを用意してそれをぐるぐる回して再生します。テーブルはリング状になっていてそれの中をぐるぐるとインデックスが(以後Thetaと呼ぶ)を進めていきます。このテーブルが例えば矩形波や、三角波だったりするわけでテーブルの内容をそのまま出力します。ただし音程がありますのでThetaに加算する量は調整する必要があります。この辺の話は過去の記事を参考にしてください。まああくまでも個人的なメモであり、あまり読みやすくはないですが。http://elm-chan.org/works/mxb/report_j.htmlここがわかりやすいですね。ただし今回は波形の出始めに別の波形を搭載するというのはなしで。本当なら入れたいのですが処理が多くなりそうなので。。。

で、目標の音色を出せたとして、減衰計算も行います。これもここをみてください(雑)。

原理は以上ですがこれをそのまま実装するとものすごく負荷が高いです。ので簡単な方法に直します。まず、出力区間を以下とします。img_2682

この時の増減分を定義して、各区間にて現在の値に足し合わせます。

とりあえずソースコードはここからどうぞ。

https://github.com/elect-gombe/WAON_onMachiKania

コードはリファクタリングしますので。今はダーティーです。