SR BASICの音声合成

噂には聞いていましたが、かなり大変ですね。。
音声合成するときは、フォルマントデータという、パラメータ群を、PD7752に送る必要があるんです。


mkIIや、6601の場合は、、BIOSの中で、ループしながら、連続的にフォルマントデータを送出しつづけていました。

この場合、フォルマントデータは止めどなく流れてくるので、間が空きにくいです。


しかし、SRでは、BIOSはフォルマントデータを作成して、PD7752に開始を宣言するだけで、すぐに抜けてしまい、BASICに戻ります。
そして、VOICE割り込みを要請します。VOICE割り込みの中で、フォルマントデータを、1バイトずつ、送出します。

なぜこうなっているかというと、バックグラウンドで、音声合成を流しながら、すぐに、次の命令を実行出来るようにするためだと思われます。。


しかし、このVOICE割り込みというのが、結構時間のかかる処理で、その割には、1バイトずつしか、送ってくれない。。


PD7752エミュレータの方は、このデータが7バイト来てから、音声合成の波形作成を始める。

普通に、今までのルーチンを流用して、実行した場合、フォルマントデータが、かなりゆっくりやってくるので、音声合成の波形も、間がかなりあいた波形になってしまう。。


talk"f a." とやっても、

あ  あ   あ   あ   あ あ   あ  あ。。。


細切れ。。乙。
あーあという感じ。。


フォルマントデータを、ある程度貯めてから、やれば、少しはましになるかな?
全部貯めてから、発声すれば、確実だけど、それだと、発声タイミングが、異様に遅くなるのでダメ。。orz
はぅーん。これは大変だ。。


一つの手として、割り込み間隔を短くする。。
といっても、限界があるよなぁ。。波形を作っている間は、フォルマントデータ受け入れも停止するらしいし。。


やはり、pd7752のフォルマントデータを受け取る部分は、フォルマントデータをリングバッファに貯めて、波形を作るスレッドでは、フォルマントデータがある程度たまってきたら、波形を作成。。
音声合成のストリームの残りバイト数が減ってきたら、次のデータで波形作成するとか。。??

うーん。


いずれにせよ、今までの mkII や、6601と同じルーチンではだめということだ。。