Gameboy で FM音源?



ある波形を別な波形で加工する、という仕組みで様々な音を作り出すのがFM音源です。
この原理の基本的な部分を GB で実現してみようというのが今回の企画。

音源ドライバに組み込むつもりで色々試してみたのですが形になるほどの完成度では
なかったので、単品のテストとしてここに置いておくことにします。





■ Frequency Modulation 波形変調テスト?

・Frequency Modulation Synthesis gb_fm.zip (2009.04.10版)



・操作

十字キーでカーソル移動です。白く反転している所が現在選択中の値です。
Bボタンで発声。Aボタンは半音上げて発声します。
オクターブの所は左右で値が変わります。
セレクトボタンを押すと、REPEAT が反転し、音を継続的に鳴らします。もう一度押すと戻ります。
モジュレータ・キャリアのいずれかを選択した状態でスタートボタンを押すと、波形をエディットできます。
もう一度スタートボタンを押すと、エディット終了。

数式の W と M の部分を変更できます。 T は、波形の時間変化(読み出し位置)で 0-31 の値を取ります。
波形は -8〜7 の値を取り、キャリア波形がモジュレータ波形に変調されて出力波形になります。
下の画像は、上と同じパラメータ(精度は上げてあります)で出力したものです。





■ 原理?

PIC AVR 工作室
シンセ・アンプラグド
こちらのサイトを大変参考にさせていただきました。
・仕組みなど

2 オペレータです。フィードバック無し。もっとも初歩的な変調です。

FM 音源の変調式は F=Asin(ωct + I sin ωmt) というものだそうです。
原理としては、外側にある正弦波の読み出し位置を、内側にある正弦波で操作している、ということです。
いくつかの変数を用いてこの操作を行うことで、元の正弦波とは似ても似つかない 複雑な波形が出力されるというのがミソ。

GB では 4bit 32step の波形メモリ音源が使えます。
この波形メモリに、計算で出した値を入れて音を鳴らすと、波形変調っぽい音源のできあがりというわけです。

ただし、2オペレータFMといっても、本物の FM音源 にあるようなエンベロープ(AR,DR,SR,RR 等々おなじみのアレ)
を取り入れていないので、豊かな時間変化をするような「それっぽい」音にはなりません。
32step が再生周波数でぐるぐる回っているだけなので、地味さは否めません。

じゃあ 32stepをいくつか繋げればいいじゃないか、ということになるのですが…(それって PCM?)。
GB の波形メモリ音源は 32Hz 〜 65536Hz の音程周波数で発音でき、32stepを 1/32秒〜 1/65536秒で 1周させます。
32step の再生をつなげようと思うと、最短で 1/65536 秒毎に次の32step を書き込まなくてはなりません。
ところで GB の CPU は倍速モードで 8MHz (=8,388,608Hz)です。
8,388,608 / 65536 = 128 で、CPU が 128 クロック分走る間隔での書き換えが必要ということになります。
で、肝心の書き換え処理はというと、「転送処理のみ」に絞っても 320 クロックかかってしまいます。
これでは計算する暇なんてとてもありませんね。
人間の可聴域は 20Hz 〜 20000Hz あたりらしいのでそこまでシビアでもないですが、状況としては変わりません。

・いやそれにしても

4bit 32step というのはいくらなんでも、という感じですが、本家FM音源と違って元の波形が弄れます。
今回は元の波形も 4bit 32step ですが、テーブル引きにして256byteくらいの固定波形で精度向上というのもアリでしょう。
さらにソフト音源なので 2オペレータ でなくても良くて、4op だろうが 6op だろうが大丈夫だと思います。
ま、それでも 出力が 4bit 32step なのは変わらないのですが。

出力波形を手動でエディットしたほうが早い

といってしまってはおしまいです。
計算で波形が出力できるということは、係数に LFO を絡ませたりすることで、リアルタイムに音色が変化するような
音作りができる(かもしれない)のです。たぶん音符一つ分くらいの間隔なら大丈夫でしょう。

■ その他?

FM音源の仕組みを改めて調べてみたのですがとても難しかったです。
筆者の理解不足で至らない点をお詫びします。
いちおう英語版 Wikipedia の外部リンクあたりまでは調べてみたのですが、数式が多くて挫折。

パラメータなどは結構適当なので、こうした方が良いというのがありましたら教えていただければ。

計算部分だけならサクっと作れたのですが、インターフェースに手間取りました。
波形はプリセットをいくつか持っておくといいのだろうか…。



▲ TOP