2012年12月14日

音声合成の設計(4)

  音声合成の設計(3)で説明しているホルマントパラメータですが、実際には何を与えていいか分からないと思います。
  そのため、とりあえず TALK 文で音声を鳴らし、そのデータを使う事にします。

  この辺りの情報は、Oh!PC 1985年1月号で解析されています。


  BASICのTALK文では、
 1)命令を解釈し、
 2)VOICEROM から音声データを読み込み、
 3)そのデータから、uPD7752に出力するデータを組み立て、
 4)組み立てたデータを、0x0000〜のRAM領域に書き込みます。

  そのため、VRAMの1ページ分が使えない(上書きされる)仕様になっています。


  TALK文で音声を鳴らした後は、RAM上にその音声データが残っています。

  残っている場所は、mk2と66 でアドレスが違います。さらに66の場合は、通常の音声と、歌声でフォーマットが若干違います。


 ○通常の音声データ
  mk2
   0x01B3、0x01B4:データバイト数
   0x01B5〜:音声データ

  66
   0x03E6、0x03E7:データバイト数
   0x03E8〜:音声データ

  TALK "f2 aiueo." などと実行した時のホルマントデータが、0x01B5〜(0x03E8〜)に格納されます。また、その時のデータの総バイト数が、0x01B3、0x01B4(0x03E6、0x03E7)です。

  音声データ自体には、速度(例えば、TALK"f2 aiueo." の場合は、2になる)の情報はありません。これは、ポート0xE2の動作速度を使っているためです。

  10ms/20ms と、Normal/Slow/Fast の組み合わせ2×3の6通り分、速度を変えられます。TALK文の速度が1〜6と丁度対応しています。



voicetest.zip

  サンプルプログラムです。MODE=5、PAGE=2、で実行して下さい。

  サンプルプログラムでは、TALK文で音声をしゃべらせてから、RAM上に残っているデータをそのまま再生しています。当然、そのデータを別の場所に移して、使用する事も可能です。


 ○歌声データ
  66
   0x000D:0x01の時、歌声データ、0x00の時、通常の音声データ
   0x0011:音符長データ(0x0019〜)の個数
   0x0019〜:音符長データ、引き伸ばした時の音声データ
   0x03E6、0x03E7:データバイト数
   0x03E8〜:音声データ(+音階データ)

  0x03E6以降は、通常の音声データと同じですが、音階のデータも含まれたデータになっています。ただし、音節の長さのデータがないため、そのまま再生すると、短い音節のデータで再生されます。

  それぞれの音節を引き伸ばす時のデータ、及びそれぞれの音節の長さのデータが、0x0019以降に格納されています。5バイトで1つの固まりのデータで、データ数が0x0011に格納されています。

  例えば、talk "f2#doremi:cde" を実行した時、RAM のデータは以下のようになります。

0x000D:01 :1の時、歌声
0x0011:04 :0x0019からのデータ数

0x0019〜
33 00 17 09 a0 :1音節目のデータ
31 00 0f 09 d0 :2音節目のデータ
2f 00 11 09 b0 :3音節目のデータ
01 00 0e 00 00 :4音節目のデータ

それぞれの音節データは、
1バイト目:追加するデータのデータ長
2バイト目:未使用
3バイト目:0x03E8からの音節の長さ
4バイト目:追加するデータの1バイト目のデータ
5バイト目:追加するデータの7バイト目のデータ


0x03E6:ea 01 :0x03E8からのデータのバイト数

0x03E8:〜
08 02 7b 12 21 df 03 :00(ここから1音節目)
08 00 23 00 00 00 03 :01
08 00 00 00 00 00 03 :02
08 00 00 00 00 00 00 :03
08 00 00 00 00 00 00 :04
08 00 00 00 00 00 00 :05
08 00 00 00 00 00 00 :06
08 00 00 00 00 00 00 :07
08 00 00 00 00 00 00 :08
08 00 00 00 00 00 00 :09
08 00 00 00 00 00 00 :0A
0d 06 b9 fd f5 bd 30 :0B
09 07 79 f0 ef ff 60 :0C
09 00 78 00 00 00 70 :0D
09 00 08 00 00 00 60 :0E
09 00 00 00 00 00 50 :0F
09 00 00 10 00 00 40 :10
09 00 88 00 20 00 60 :11
09 00 b8 f0 f0 30 b0 :12
09 00 00 00 f0 30 c0 :13
09 00 10 00 f0 00 b0 :14
09 00 20 00 f0 f0 a0 :15
09 00 30 00 f0 00 a0 :16(ここまで1音節目)
09 00 f8 00 08 00 a7 :00(ここから2音節目)
09 00 f8 00 08 08 a0 :01
以下、省略。


  実際の歌声の再生時には、データを組み立てています。

 1)1音節目のデータを出力。(0x0019+2)の内容の7倍のバイト数、出力する。上の例だと、0x03E8からの 00 〜 16 を出力。

 2)1音節目の後に、追加でデータを出力。追加するデータは、
  1バイト目は、(0x0019+3)の内容
  2〜6バイト目は、0x00
  7バイト目は、(0x0019+4)の内容

  の7バイトを、(0x0019)回出力する。

  上の例だと、09 00 00 00 00 00 a0 を 0x33 回出力する。


 3)2音節目のデータを出力する。

 4)2音節目の後に追加でデータを出力。追加するデータは、
   09 00 00 00 00 00 d0

 5)以降、0x0011 で書かれている個数分、繰り返す。


  最終は、必ず 00 00 00 00 00 00 00 が出力されます。


  通常の音声データと同じように、歌声データも速度の情報はなく、ポート0xE2 の出力値で変更しています。



songtest.zip

  サンプルプログラムです。66 で MODE=5、PAGE=2、で実行して下さい。

  サンプルプログラムは、上記アルゴリズムの通りに歌声を再生しています。データをファイルに落とせば、mk2 上でも実行できます。





posted by えすび at 17:48| Comment(0) | P6解析:音声合成 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。