2015年5月15日金曜日

Windows:FM音源鳴ってきた

ZMSのパーサーをじっくりと作りつつ、ようやくFM音源が鳴りだしてキタ!

今覚えているウチに「えーそうなの!?」みたいのを覚書しておこう!

■音色設定方法
音色の設定方式は、通常形式と、AL/FB分離形式というのがあるらしい。
FM音源使ってた時は、分離形式しか使ってなかったので、通常形式は
記憶の彼方に飛んでいっていた。しかし、OPMに書き込む為にはここは
避けては通れない。

AF(フィードバック/アルゴリズム) = (FL(フィードバックレベル)*8) + CON(FM operator connection)

という形でAFを作ったり、直接3bitづつFLとCONを書き込んだり。

まあ、分かれてる方が音が作りやすいわね。なんで一つになってたんだろ?

■音程がわかりにくい
X68kFM音源の神、GORRYさんがTWITTERで言っていた。

4MHzのYM2151にデータシート通りの音階を設定すると「3半音-8セント」ほど高い音が出る(Cを出したつもりがほぼD#の音階で鳴る)ので、そこはドライバ側で吸収する必要がある

ここをきっちり「3半音-8セント」で計算しないで「3半音」で計算して、8セントはデチューン命令でゲタをはかせて与えるという実装もそこそこある。うちのドライバが「^20(=8セント)が標準」だったのはそういう実装

ちなみにこの「3半音ずらす」ときに「単純にKCレジスタ設定値から3引く」と正しくない。KCレジスタに与える音階値は0-2,4-6,8-10,12-14だけが有効で、3,7,11,15は無効値なので

どうも、YM2151への供給クロックが、業務用3.579MHz / X68000用 4.00MHz
というような歴史があるらしく、その辺もしっかりとイミュレートしているx68sound.dll
なので、その通り音階を入れてあげないといけない。ここは面倒くさくてハマった。

なので、CとDは音程が狭い。なんだこれ。

■マルチメディアタイマーの発見
かなり正確に指定msecごとにCALLBACKしてくれるのがWindowsにあるらしい。
早速使ってみたら、いい感じ!!invokeの時は60分の1秒でしか色々できなかった
ので、結構ズレまくってた。

それでも16msecごとなんだけどね。描画があったりで時々ガッっとズレてた。絵は
少々ズレてもカ・ワ・イ・イでなんとかなったけど、音は流石にズレるとしんどい。
最近捨てたT3exのシーケンサーを思い出す。小節ごとにグっと待ちが発生する
ナイスなシーケンサー。

■繰り返し
これがハマった!!繰り返しの実装は本当に大変だった・・。ZMSでは簡単に

|:16 cdefg :|

なんて書けちゃうけど、これを実現するのは本当にめんどくさい!!ズレるのが
嫌だったから、イベントは絶対時間で持っておいたので、絶対時間の足し込みが
すげーめんどくさかった。でもなんとかなった・・かな?

0 件のコメント:

コメントを投稿