Making「音声出力」その3

Home PC-6001mkII Program etc

 このページでは、音声出力のながら処理研究の過程を書いています。

Making「音声出力」 Top


2011/05/27〜29:マミさん
 P6オフを間近に控えた5/27のこと、突如ダイレクトメッセージが届いた。見てみると、JOTさんがこの「ながら音声」を使ったネタを公開してもいいか、との事。

 二つ返事でOKを出した後にネタを見てみると、なんとBGMを鳴らしながらしゃべらせてるときたものだ。確かに理論上はPLAY文と同時に音声を鳴らせるような事は言ったが、まさか作ってくれるとは思わなかった。

 はじめ公開する予定だったP6オフでは結局このネタは披露されず、どうしたのかなと思ったが、まあ色々事情があったらしい。かくして公に披露されたのはP6オフの翌日、ゲームレジェンドの終わり際だった。

 ただ、PC-6601実機ではまだタイミングがシビアなのか、肝心の音声が出なくなるときがあるようだ。なにか改善できる点を思いついたら、ルーチンを作り直すかな?あくまで思いつけばだけど(^_^;)。

2011/06/xx:解析その4
 さて、ながら音声も一段落したし、まだよくわかっていない部分を調べるか。

 よくわかっていない部分とは、ポートE3Hへの出力だ。とりあえず、以下の値については何が起こるのかがわかっている。
ポートE3Hの値内容
00H「終わりました」
01H「お待ち下さい」
02H「故障中です」
03H「いらっしゃいませ」
04H「ありがとうございました」
FEHポートE0H経由の音声データ流し込みモード

 この他の値を入れたら、いったいどうなるのか?mkII実機で試してみよう。

 まず、05Hから...意味不明の音が鳴る。06H〜3FHまで、この「音は鳴るけど音声になっていない」結果が続く。
 そして40H...「終わりました」の音声が出力された。80H, C0Hでも同様に「終わりました」の音声が出力された。どうやら、40H単位で同じ結果になるらしい。

 という事は、音声合成ROMにデータさえあったら最大64種類のプリセット音声を鳴らせる可能性があったのかな?あくまで推測だけど。

 そして、もっとも気になっていたFFHだ。FEHに特定の機能があるのだから、当然FFHにも何らかの機能があるだろう。という思いで設定するも、なにも起きない。音も鳴らない。

 あ、そうか。音が鳴らないのではなくて、リセットしているのかも?
 事実、mkII実機ではTALK文の実行後にステータスがエラー(ポートE0Hからの入力が30H)となっていても、OUT &HE3,&HFFとする事でステータスが00Hに戻る。

 という事で、結果はこんな感じとなった。
ポートE3Hの値内容
00H,40H,80H,C0H「終わりました」
01H,41H,81H,C1H「お待ち下さい」
02H,42H,82H,C2H「故障中です」
03H,43H,83H,C3H「いらっしゃいませ」
04H,44H,84H,C4H「ありがとうございました」
FEHポートE0H経由の音声データ流し込みモード
FFHリセット?
その他未使用(音声にならない音の出力)

 とりあえず、現在の音声出力ルーチンの最後に、ポートE3HへのFFH出力を追加しておくとしよう。

2011/06/26〜07/01:ザカリテ
 件の「マミさん」の動画を見ると、「ザカリテゲームっぽい」とコメントがあるのを発見。なるほど、ザカリテね...ザカリテか...ちょっとこれに音声を追加してみるか。

 とはいえ、ゲームの詳細がよくわかっていないので、まずは実物を見てみる。検索してみると、FM77AV版の動画が見つかった。また、この他にプログラムリストも別のところで発見。これで作れるかな?

 次に音声だ。「オレハウチュウノテイオウ」「ザ」「ザカリテダ」「コロシテヤル」「ヒキョウモノ」こんなものかな?「ザ」以外の音声は少し尺が長いので、「生麦生米生卵」の時に作った変換プログラムを使って倍速のデータにする。

 少々PLAY文にてこずったが、データも揃った。あとはこれを組み合わせるだけだ。

 サクサクと終わる予定だったが、なぜか「コロシテヤル」の音声部分で止まってしまう。なぜだろう?調べた結果、7バイトデータ出力前のエラーチェックを外した事が裏目にでたようだ。

 何らかの原因でポートE0Hからの入力がエラーになると、音声出力上の処理では何もせず、ステータスも実行中のまま変わらない状態となっていた。BASICでは音声出力の終了ステータスを待ち続けていたので、結果的に処理が止まったようだ。

 仕方がないので、7バイト出力前のエラーチェックを復活させ、エラー時はOUT E3H, FFHの出力とステータスの初期化を行うようにした。これで、音声合成ROMがエラーを返してもとりあえず続行は出来るだろう。

 こうして、「ザカリテの逆襲 for PC-6001mkII」が完成した。

2013/01/xx〜02/xx:再始動
 2013年、今年でPC-6001mkIIも30周年を迎える。これは何かせねば。

 そういえば、まだ音声データを結合して発声する事はできてなかったな。理屈上は、1つ目の音声の最後と2つ目の音声の最初をうまい具合につなげる音声データを新規に作成すれば音的につながりはするだろう。

 あと、音の速さを変えたり(「生麦生米生卵」)、音の高さを変えたり(「音階」)する実験も一応はできてるので、これらをうまく組み込めないかな?あわよくば、それをmkII上でリアルタイムで合成して...
などと風呂敷を広げた結果、にっちもさっちも行かなくなった。

 うだうだとしている間に、1ヶ月ちょっとが過ぎてしまった。少し順序だてて考え直そう。

 まず、最初に複数の音声を1つに繋げたい。そして繋がった音声が聞けるレベルにできるかを確かめたい。とすると、HSP等で音声データを結合加工して、この加工済の音声をmkIIで鳴らすのが先決だろう。音声結合のノウハウが貯まれば、mkII内でリアルタイムに結合することもできるかもしれない。

 こうして、まずは頭の中でゆっくりと音声結合の作成が始まった。

2013/02/xx:データ形式
 こういったプログラムを作成する際にいつも重要視するのはデータ形式だ。これによって、プログラムの作りやすさや応用のしやすさが決まると言っても過言ではない。

 まず、結合元となる音声データだ。TALK文で音声出力する際は、基本7バイト一組の音声データとなるが、一部は非7バイトデータとなる。このあたりは前に調べた通りだ。ただ、この状態だとなんとも加工し辛いので、中間的な音声データを作成する事にする。

 中間音声データだが、TALK文で生成されるような相対値データと相対値計算済の絶対値のデータ、どちらが良いだろうか?

 相対値データだと、音声データのつなぎ最初でどれだけ値の差分があるか求める分厄介だが、それ以外はTALK文用の音声データに戻すのは簡単そうだ。
 絶対値データだと、音声データのつなぎ部分の作成は比較的簡単そうだが、TALK文用の音声データに戻す処理が面倒になる。

 うーむ、どちらも一長一短があるな。ただ、今回は音声のつなぎ部分を楽に作成したいので、どちらかというと後者の絶対値データか。

 後で加工しやすくするのと、中間データを少しでも(バイナリエディタ上で)見やすくするため、以下のように16バイトを一組にしたデータ形式を考える。
12345678910111213141516
F-1B-1F-2B-2F-3B-3F-4B-4F-5B-5PitchAmpImpulse
/Noise
未使用

 まだ全くプログラムを作っていないが、まずはこんな所だろうか。

2013/02/xx:目標
 今回、音声ネタとしてチャレンジしてみたい曲がある。

 音の高さを変える必要もなく、また一音の長さも固定なこの曲、唯一の難点といえばテンポが速すぎることか。その曲は「初音ミクの消失」。

 意外と簡単にできるかもしれないし、逆にそもそも無理かもしれない。でも今年でPC-6001mkIIも30周年になる事だし、いっちょやってみるか。
 という事で、まずは脳内でイメージトレーニングを行う。

2013/02/xx:音声データ作成その1
 最終的に出力する音声データの作成にあたって、概ねこんな流れで行こうかと思う。
  1. 「あ」「い」等の単音をmkIIのTALK文で鳴らし、音声データを個々にファイル化する。
  2. (1)の音声データを、加工しやすい16バイトデータに変換する。
  3. 鳴らす音の順序データを読み込み、(2)のデータを結合する。
  4. (3)のデータを、音の速さの情報を元に端折りながら、mkIIで鳴らせる音声データに変換する。
 ちゃんと一繋がりの音声として聞こえるレベルになるかが重要なので、一音の長さや音の高さはまだ考えない。

 という事で、はじめにTALK文で2,3種類の音声を鳴らし、生成された音声データをファイル化する。少し長めにデータを取りたいので、TALK文では単音+伸ばし記号で出力しようかな。

 こうして取った音声データを、1フレーム16バイトの絶対値データに加工するプログラムをまず作成する。

 各値の初期値はCISCさん作成のプログラムから取ってきて、フレーム毎に各値の絶対値を計算する。16バイトデータは、音量0の部分は省いて出力する。
 ここまで、特に違和感のなさげなデータが出来上がったが、本当に間違っていないかは、この時点ではわからない。

※音声データの結合プログラムはこの時点ではなかったので、記述を3/6に移動...

2013/02/28〜03/03:音声データ作成その2
 次は、絶対値データを、音声合成ROMが理解する7バイト単位データに変換するプログラムを作成する。

 この部分は、前に「生麦生米生卵」のデータを作ったときに作成したプログラムが使えるかな?という事で、一部処理を流用してとりあえずプログラムを組み上げる。

 一音分だけ変換出力したデータをmkIIで鳴らそうとしたが、鳴らない。16バイト単位データにした時に情報の欠落はないので、ちゃんとなるはずなんだけどな。とプログラムを見直すと、ビット変換を行っていない部分や判定の誤り等が出てきた。

 はじめにmkIIから取得した音声データと同等になるよう、1つずつバグをつぶして行く。...これで大丈夫、でしょうか?ああ鳴りましたね。良かった。

 次に、高速の音声データにするため、速度用の変数を入れる。この変数で、元となる16バイト単位データを間引いて読み込めば、理論上任意の速度で鳴る音声データができる。

 結果は...音声が速くなると、やっぱり聞き取りづらいかな。ここは調整でなんとかなればいいが。

 並行して、mkIIのTALK文出力の生データを50音分揃える。「ん」や「っ」辺りが単体で出力できないが、これはまあ後回しにしておこう。


その2 Making「音声出力」 その4