おしゃべりプログラムと言っても、すでに用意された音声(?)のようなものを発声するだけです。
自由におしゃべりできるわけではありません。
原理的には、下記のページが詳しいです。
http://www.geocities.jp/submarine600/html/p8/csm_voice.html
まず、FM源側の説明を。
CSM音声合成モードは、YM-2203(OPN)やYM-2608(OPNA)に搭載されています。他のチップにも搭載例があったかもしれません。
その「CSM」は「Composite Sinusoidal Model」の略であり、複合正弦波モデルということらしいです。
立派な名前が付いているのですが、OPNに搭載された機能としては意外と単純です。・FM音源のch3のオペレータ4つに、独立してF-Numberが設定できる。
・Timer-Aのオーバーフローでch.3は4オペレータが一括キーオンされる。これだけです。
OPN/OPNAにはもう一つ「効果音モード」というモードがありますが、
これは2番目「Timer-Aによるキーオン」が無いというだけの違いです。
iP6 Plus でも、いじっているのですが、全然うまくいきません。ぶつぶつぶつ。。。。とノイズだらけです。
音自体も、ノイズなのですが、なんといっても、音と音の間、無音期間が長すぎるのが気になりますね。
というわけで、カウントするところのソースリストをよーく見ました。
TimerAと、TimerBのカウントですが、fmgen では、下記のようになっています。
us μ秒づつ、減らします。おのおの、0以下になったら、オーバーフロー発動します。
TimerAは、引く値を、us<<16で、65536倍しています。
TimerBは、引く値を、us<<12で、4096倍しています。
つまり、TimerAは、TimerBよりも、小刻みに発動するので、分解能が高いと言うことでしょうか。。
65536倍って。。。ということは、usの数字は、大きすぎると、だめということですね。。(^^;;
これをしらなかったので、大きくすれば、するだけ、間隔が短くなると思っていました。(汗)
ちなみに、オーバーフローしても、プログラム自体は、何事もなかったかのように動き続けるので、注意が必要です。(^^;;
小さすぎても、なかなか発動してくれなかったりするのですが。
このタイミングも、問題かもしれませんが、無音期間が長いのは、それより、アタックとかのほうが問題ではないかと思っていますが。。(汗)
bool Timer::Count(int32 us) { bool event = false; if (timera_count) { timera_count -= us << 16; if (timera_count <= 0) { event = true; TimerA(); while (timera_count <= 0) timera_count += timera; if (regtc & 4) SetStatus(1); } } if (timerb_count) { timerb_count -= us << 12; if (timerb_count <= 0) { event = true; while (timerb_count <= 0) timerb_count += timerb; if (regtc & 8) SetStatus(2); } } return event; }
ちなみに、iP6 Plus 4.7 では、これらに対応してないので、おしゃべりプログラムを起動しても、何も言わないと思います。。。(汗)
すいません。。
ところが、66SRの おしゃべりプログラムは、どうも、CSMモードではなさそうです。 やはり、CSMモードのようです。
FM音源のステータスをチェックしていて、TimerAと、TimerBをチェックしているようです。
この辺は、さらに調べないといけませんね。