66SR付属ディスクの  おしゃべりプログラム (fmgenで、CSMを使う)

おしゃべりプログラムと言っても、すでに用意された音声(?)のようなものを発声するだけです。
自由におしゃべりできるわけではありません。

原理的には、下記のページが詳しいです。
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をチェックしているようです。

この辺は、さらに調べないといけませんね。