#######################################  PCM VOICE PLAYER “BREEZE” #######################################  8ビット機の世界において色々な方式の音声合成が試みられて来ましたが、いづれの 方式も台詞の内容を事前に知っていないと何を言っているのか判別が困難な位の音質で した。一方、今日主流の32〜64ビット機では、サンプリング音源により、非常に高 品質な音声合成が手軽に行えます。最新機の状況を知っているだけに、未だ8ビット機 をメイン・マシンとしている人達にとっては、サンプリング音源による高品質な音声合 成を自機種でも何とか実現したいと思うのが人情というものでしょう。  そんな貴方に朗報です。Z80パソコン各機種用のサンプリング音声再生プログラム “BREEZE”をここに発表します。誤解のないよう予め断っておきますが、本プロ グラムは“擬似”PCMではありません。 D/A変換をソフトウェアで実現している 本物のPCMです。  本プログラムでは量子化ビット数は8ビットに固定です。AMラジオや 一般加入電 話程度の品質なら32kBのデータで約4秒の再生が可能で、この程度の品質が得られ れば聞き流していても喋っている内容の判別は容易に出来ます。また、再生可能時間こ そ短くなるもののこれ以上の品質を得ることも可能です。 ///使用方法///  このプログラムは、基本的にOSに依存しません。  スタ−ト・アドレスはデフォルトでは$B000になっていますが、必要に応じて変 更してアセンブルし直して下さい。その際、アドレスの下位8ビットは、必ず、$00 にして下さい。  音声を再生するときは、HLレジスタにデータの先頭アドレスを入れた後、先頭アド レス(デフォルト時は$B000)をCALLして下さい。尚、汎用レジスタ(裏レジ スタ含む)とインデックス・レジスタの内容は総て破壊されるものと思ってください。 又、以下のとおり各種設定用ワーク・エリアを8バイト確保することとします。 アドレス 情報名 サイズ 先頭+$00 コール・アドレス +$08 クロック周波数 4 +$0C メモリ・アクセスのウェイト 1 (上位4ビット:0に固定/下位4ビット:M1サイクルのウェイト数) +$0D (未使用:0に固定) 3 ///機種別詳細/// (1)MZ80/1200/700/80B/2000/2200  ノン・マスカブル割り込み(NMI)が発生すると確実に暴走します。幸い、MZシ リーズではNMIは使用されていないようですが、独自の改造等で使用されている場合 は注意が必要です。  また、MZ−700では音声出力がメモリ・マップドI/Oになっているため、本プ ログラムを呼び出す前には、必ず、$E000以降にタイマー関係などのI/Oが割り 当てられる状態にしておいてください。 ///データ・フォーマット///  先頭32バイトには、再生に関する情報(=ヘッダ)が入っています。 アドレス 情報名 サイズ 先頭+$00 データ名称 8 +$08 データ本体のサイズ 2 +$0A (予約済,0で埋めておくこと!) 2 +$0C サンプリング周波数(Hz) 2 +$0E (予約済,0で埋めておくこと!) 2 +$10 (未使用,0で埋めておくこと!) 16 +$20 データ本体 任意  データ本体は、符号なし整数8ビットの線形サンプリング・データで1回のサンプリ ングで1バイト使用します。負のピークが$00,正のピークが$FF,GNDレベル が$80です。アドレスの若い方から順に1バイトづつサンプリング・データを格納し て行きます。  尚、このデータ・フォーマットのPCMデータをファイルとして保存する場合は、拡 張子に“BRZ”を付けることを提唱します。 ///パッチあてプログラム///  同一機種でもグレードによってCPUクロックやメモリ・アクセスのウェイトなどが 違っている場合があります。多少違っていても再生周波数がくるうくらいで特に問題は ないのですが、前述のワーク値を書き換えるユーティリティー「処理速度パッチャー」 を作りました。このプログラムを起動して対話式に必要事項(ファイル名、クロック周 波数、ウェイト・タイプ)に答えると自動的に本体ファイルの必要箇所を書き替えます。  尚、指定したファイルの内容はチェックしていません。よって、誤ってBREEZE 本体以外のファイルを指定すると無関係な部分を書き替えてしまうので注意が必要です。 ///注意事項///  これらのプログラムの著作権は放棄しませんが、非商用使用に限りコピー・フリーと します。ただし、実行プログラムのみの配布は堅くお断りします。必ず、ソースと配布 に関する規定を記述したドキュメントおよび「処理速度パッチャー」を添付して配布し てください。さらに、以下の配布用ファイル名以外では配布しないでください。 用途 機種 ファイル名 備考 保存用 自機種 BREEZE .BIN バイナリのみ 配布用 X1 BRZX1 .ASM ソース 〃 〃 〃 .BIN バイナリ 〃 MZ−2500 BRZ2500 .〃 〃 MZ−1500 BRZ1500 .〃 〃 MZ−80B/2000/2200 BRZ2000 .〃 〃 MZ−80/1200 BRZ80 .〃 〃 MZ−700 BRZ700 .〃 〃 PC−8801SR以降 BRZ88SR .〃 〃 MSX BRZMSX .〃 「処理速度パッチャー」 BRZPAT .〃 【表】配布用ファイル名一覧  これらのプログラムについての改造等は特に制限しません。その際、BREEZE上 位互換を謳うのは構いませんが、プログラム名にBREEZEを使用することは禁止し ます。必ず、本プログラムとの区別がつく名称を付けてください。  他の機種に移植しようという方で、この記事に書き切れなかった細かい事項について の質問があれば、すべて以下の連絡先にお願いします。今後、このプログラムの規格は 当方で管理していく予定です。 (過去の情報のため、連絡先は伏せました) ///コマンド・ラインからの利用///  コマンド・ラインからの使用は元々統一規格構想にはないということを了承してくだ さい。BREEZEは音楽鑑賞などを目的として製作したものではないですし、ハード 的な部分を含めてそういった用途に耐えうるだけの性能もありません。本プログラムは アプリケーション・プログラム中で音声を鳴らしたいという要求に応えるためのもので す。  どうしてもコマンド・ラインからコールしたいという人は、最終動作試験用のプログ ラム“SOSコール・オプション”を活用してください。これは、S−OS専用です。 以前紹介された中川氏製作のL−osAngelesでも動作可能です。データ・ファ イル名(拡張子は省略不可)をパラメータにして起動すれば、データをメモリに読み込 んだ後、デフォルト・ドライブ内の保存用ファイル名のBREEZEを立ち上げます。 各ファイルのロード・アドレスはセーブ時に指定した値に従います。また、BREEZ- E本体の起動については、セーブ時に指定した実行アドレスにジャンプするようになっ ています。 (コマンド例)* SOSBRZ.BIN:TEST.BRZ  また、レジスタに値をロードするよう本プログラムの直前にマシン語モニタなどで数 バイト打ち込んでも、再生データのアドレスは固定ながらコマンド・ラインからのコー ルが可能になります。BREEZEの先頭がデフォルト値でデータの先頭が$3000 の場合の例を以下に示します。 +0 +1 +2 AFFD 21 00 30 ///最後に///  今回の計画に御協力下さった皆様に、この場を借りて御礼申しあげます。 ///参考文献/// ソフトバンク Oh!FM '90年4月号「しゃべるんどすえ」 戸田浩 ソフトバンク 試験に出るX1 祝一平 ソフトバンク Oh!MZ '84年10月号「3重和音プログラム」 平野洋一郎 &山本耕司 ソフトバンク Oh!MZ '??年??月号「MZ1500全回路図」 電波新聞社 SuperMZ活用研究 小学館 PC8801シリーズ マシン語マスターバイブル 日高 徹 アスキー出版局 MSX2テクニカル・ハンドブック アスキー出版局 MSXturboRテクニカル・ハンドブック その他、各機種付属のマニュアル等 #######################################  PCM VOICE PLAYER “BREEZE” 補足 ####################################### ///プログラムの概要///  機種のハード構成に応じて以下の4種類のアルゴリズムを使い分けています。尚、方 式の名称は我々が勝手につけたものです。 (1)PSG線形近似出力法  PSGをD/AコンバータにしてPCM音声を鳴らします。PSGの各CHのアッテ ネータの特性は非線形ですが、3CH組み合わせることにより線形に近似して出力して います。アルゴリズムはOh!FMに載ったプログラムからの引用です。  これは、S/Nが優れています。 (2)PWM法  ロー・パス・フィルタ(LPF)を通すだけで復調出来る特性を利用して、パルス幅 変調(PWM)波をビープ音回路に出力します。通常、ビープ音回路にはLPFが内蔵 されているので、ハードの改造は不要です。PSGを搭載していない機種を対象として います。  これは、出力の直線性が良く、ダイナミック・レンジも最高ですが、S/Nが最も悪 くなります。 (3)内蔵DAC法  本体内蔵のPCM音源を利用します。名前を付けるまでもないですが…。  これは、S/N、出力の直線性、ダイナミック・レンジなどの特性は内蔵音源の特性 に依存します。 (4)PSG直接出力法  PSGをD/AコンバータにしてPCM音声を鳴らします。非線形性を考慮してPS Gのアッテネータ値を設定します。計算時の端数を時間軸方向に誤差拡散しています。 PSGのアクセスが遅い機種を対象にすることを想定していますが、今回、発表のもの では使用していません。  これは、出力の直線性が最も悪く、ダイナミック・レンジも最悪です。 機 種 方式 X1 (1) MZ80/1200/700/80B/2000/2200 (2) MZ1500/2500 (1) PC8801SR以降 (1) MSX初代/2/2+ (1)  〃 turboR (3) 【表】機種別プログラム一覧 ///次期構想///  PCM再生プログラムの次期構想として、以下の様な物“BLAST”(仮称)を考 えています。技術的問題により、タイマー割り込みが可能でPSGを持つ機種のみ対象 となります。はっきり言って構想のみです。実際の製作の目処は全く立っていません。 世間では、これを「企画倒れ」といいます。 (1)データ・フォーマットはBREEZE互換。 (2)PCMデータをメモリに読み込まずにファイルから直接再生する。 (3)バック・グランドにて再生する。 (4)ファイル・アクセスについては、OSに依存する。 (5)割り込みテーブルの領域はOS側で確保する。 ///未製作機種のファイル名///  S−OS対応機種について以下のとおり仮のファイル名だけ決めておきます。 用途 機種 ファイル名 備考 配布用 PC8001 BRZ8001 .ASM ソース 〃 〃 〃 .BIN バイナリ 〃 FM7/77 BRZFM7 .〃 〃 SMC−777 BRZSMC .〃 〃 PASOPIA BRZPSPA .〃 〃 PC9801 BRZ9801 .〃 〃 X68000 BRZX68 .〃 【表】配布用ファイル名一覧 ///よた話///  その昔、8ビット機に於いて色々な方式の音声合成が試みられていた頃はこのような 方式のプログラムは不思議と出てきませんでした。その理由は次のようなものでしょう。 (1)データの制作および入手が困難。 (2)RAM容量が少ない。 (3)方式の存在がユーザーに広く知られていない。 今日に於いては(3)は全く問題ないものとして、(2)は如何ともし難いですね。そ れでも、ある程度限定した使用法なら十分実用になると思います。先に上げた4秒とい う時間は短いようで長いものです。ちょっとした文ならば、ほとんどこの時間内に喋り 終えることができるでしょう。とすると、問題は(1)ですが、これについては今後の 検討課題とします。A/Dコンバータ基板の制作なども検討したいですね。 ///アイデア/// (1)喋りまくるテキスト・アドベンチャー  某ゲーム機で遊んでいて、やたら字を読まされるのにはガッカリしました。PCM再 生機能があるのに喋らせないのは大いに疑問です。CD−ROMだとなおさらです。  テキスト・アドベンチャーもドンドン喋らせると、また違う世界が見えてくるかもし れません。PCMデータがフロッピーの容量を圧迫するので、コンバータを改造して、 コンバート終了後はファイルにセーブしないで直接BREEZEで再生するようにする と美味しいかもしれません。 (2)サークルの会報  S−OS系サークルで発行しているディスク・マガジン形式の会報を喋らせると会員 の度肝を抜けます。 ///著作権/// プログラム 著作権者 MSX版BREEZE本体 筑紫高宏(turboR専用部分に限る) 上記以外BREEZE本体 スタッフ全員 (保田周作,森喜一郎,筑紫高宏,AYANY) PSGテーブル作成プログラム 保田周作 データ形式コンバーター  〃 データ・レコーダー 筑紫高宏(MSXturboR専用) 処理速度パッチャー AYANY DOSコール・オプション  〃 【表】著作権者一覧 文責:AYANY (EOF)