1.3 PCM 限界ギリギリ活用法  turbo R に加えられた新しい機能が PCM。せっかく用意された機能だから、その性能をギリギリまで引き出したいと思うのが人情だ。そこで、BASIC からマシン語、水平走査線割り込みを利用した特殊な使い方まで、PCM の活用法を紹介する。 1.3.1 基礎編……BASIC での使い方  まずは BASIC を使った基本的なものから紹介しよう。  そもそも PCM は、マイクなどから入力した音声をデジタルに変換してメモリーに記憶させ、任意にそれを再生するものだ。  turbo R の場合、PCM データを記憶するのは、メイン RAM かビデオ RAM。サンプリングレートは、15.75キロヘルツ、7.875キロヘルツ、5.25キロヘルツ、3.9375キロヘルツの 4 種類から選択されることになる。この値が大きいほど、より質の高いサンプリングができるというわけだ。  BASIC から PCM を使う場合は、ふたつの命令を覚えておけばいい。使い方はあとにまとめておいたので、参考にしてね。基本的には、これらの命令を実行するだけで、PCM の録音や再生は可能になる。ただし、データを記憶する開始番地と終了番地の設定には、十分に注意する必要があるぞ。  まず最初に、BASIC の"CLEAR"命令で PCM データ用のメモリー領域を確保しておかないと、間違いなく暴走してしまう。たとえば C000H〜D0000H番地までを PCM データ用に使うときは、 CLEAR 200,&HC000 のようにしておこう。とりあえず、リスト 1.4 に簡単なサンプルプログラムを載せておいたので、これを入力して遊んでみるといいだろう。  もちろん、ビデオ RAM を PCM データ用に使う場合は。任意のどの番地にもデータを置くことができるので、開始番号や終了番号を気にする必要は無い。それにビデオ RAM の場合は、PCM データを目で確認することができる。最初に SCREEN 8 のように、スクリーンモードを設定してから PCM を録音すれば、画面にデータがズラズラっと表示された、おもしろいかもしれない。  基本的な PCM の録音、再生の方法は、以上のことを注意すれば大丈夫。さらに再生サンプリングレートを変化させれば、4 段階のスピードで再生することもできる。ただ、問題となるのは、PCMを再生しているとき。turbo R がそれにかかりっきりになってしまうので、PCM を再生しながら何かをするなんてことは、残念ながらできないのだ。 【リスト 1.4 (PCM1.BAS)】 1.3.2 PCM 関係の BASIC 命令 CALL PCMREC 書式 ●メイン RAM またはビデオ RAM への録音。  CALL PCMREC(@開始番地,終了番地,サンプリングレート[,[トリガーレベル],圧縮スイッチ][,S]) ●配列変数への録音。  CALL PCMREC(配列変数,[長さ],サンプリングレート[,[トリガーレベル],圧縮スイッチ]) サンプリングレートの設定 指定値 サンプリングレート 0 15.7500KHz 1 7.8750KHz 2 5.2599KHz 3 3.9375KHz トリガーレベルでは、録音が開始されるときの入力レベルを設定する。値は 0〜127 まで。この値以上の入力レベルになると録音が開始され、0 または省略した場合には、すぐに録音がはじまる。圧縮スイッチの設定は、1 で無音部分を圧縮し、0 または省略すると圧縮しない。 CALL PCMPLAY 書式 ●メイン RAM またはビデオ RAM からの再生  CALL PCMPLAY(@開始番地,終了番地,サンプリングレート[,S]) ●配列変数からの再生  CALL PCMPLAY(配列変数,[長さ],サンプリングレート)  PCMREC,PCMPLAYともに、高速モードでないときは、一時的に高速モードにしてから実行し、終了するともとの状態に戻ってくる。また、R800 の ROM モードで15.75KHz が指定された場合は、エラーになる。  録音、再生中に STOP キーが押されると、プログラムの実行中は中断される。PCM データの形式は、1〜255までが通常のデータで、0 は特殊なもの。あとに続く 1 バイトで指定された回数分だけ、0 レベル(127)を出力する。 1.3.3 BEEP 音を PCM で鳴らすのだ !  BASIC プログラムを実行しているときに、CTRL と STOP キーを同時に押してプログラムを中断されると、"ピッ"と BEEP 音が鳴るのは知っているよね。"LIST"命令でリストを表示させ、CTRL + STOP で止めたときも、同じように"ピッ"と音がする。BASIC の "SET BEEP"命令を使えば、音を変えることもできるけど、4 種類用意されているどの音も、いまひとつインパクトに欠けるのだ。  そこで、この BEEP 音を PCM 音で鳴らすとどうなるか。変なセリフを設定しておくと、ことあることに MSX がしゃべるので、けっこううるさくて楽しいかもしれない。  とういうわけで、リスト 1.5 の掲載したプログラムを実行すると、BEEP 音を PCM で鳴らせるようになる。もちろん turbo R 専用だ。それほど長いものでもないので、がんばって入力してほしい。  なお、このプログラムは。メイン RAM のページ 1(4000H〜60FFH番地まで)に置かれるので、このプログラムを実行したあとに、"CLEAR"命令でユーザーエリアの上限を B000H番地以上にしてもかまわない。ただし、メモリーディスク関係は使えないので、うっかり"CALL MEMINI"なんてやらないように。それから、BASIC の "BEEP" 命令を使うときは。 PRINT CHR$(7) を代わりに使わないと、BEEP 音が PCM にならない。注意しよう。  プログラムの使い方を説明する。 1 PCM BEEP セット  以降 BEEP 音が PCM になる。1 回実行しておけば、電源を切るまで設定は有効。また、CLEAR 文の設定を変更してもかまわない。 2 PCM BEEP リセット  BEEP 音を、もとの状態に戻す。"CALL SYSTEM"で DOS や DOS2 にするときは、かならずこのコマンドを実行すること。 3 PCM データ再生  現在設定されている PCM データを再生する。確認用に使おう。 4 PCM データ録音  PCM データを15.75キロヘルツで録音する。録音時は B000H〜CFFFH番地までのメモリーを使用。 5 PCM データ LOAD  拡張子が ".PCM" の、BSAVE 形式でセーブされた PCM データを読み出す。 6 PCM データ SAVE  "PCM データ録音"で録音した PCM データを、ディスクに記録する。 0 END  プログラムを終了する。もちろん、CTRL + STOP でもかまわない。 なお、簡単なメッセージが画面に表示されるので、参考にしよう。 【リスト 1.5(PCM2.BAS)】 1.3.4 上級編……マシン語で PCM を!  マシン語で PCM を使う場合、手っとり早いのが BIOS を使う方法。サンプリングレートや、トリガーレベルなどの設定は、BASIC のものとほぼ同じなので問題はないだろう。  ここでは上級編ということなので、この BIOS を使わずに、PCM を録音したり再生したりできるプログラムをふたつ紹介する。  BIOS を使う場合、サンプリングレートは15.75キロヘルツ、7.875キロヘルツ、5.25キロヘルツ、3.9375キロヘルツの4 種類しか選べない。63.5マイクロ秒ごとに値が変更される、システムタイマーで肩代わりしたのがここで紹介するプログラムが。  まずは、録音プログラムの使い方から説明しよう。HL レジスターには PCM データを格納するメモリーの先頭アドレスを、BCレジスターには録音するデータの大きさを、それぞれ設定しておく。そして E レジスターには、システムタイマーで何カウント分のウェイトを入れるのか、を設定する。16で、だいたい15.75キロヘルツに相当するかな。  再生プログラムのほうも同じ。HL レジスターに再生する PCM データの先頭アドレス、BC レジスターにはデータの大きさ、そして E レジスターにウェイトのカウント数を設定すればいい。  PCM 録音プログラムのリストの途中に、 0EDH,70H というヘンなものがあるけど、これは IN (HL),(C) という命令のこと。C レジスターのポートから値を読み、それをフラグだけに反映させる R800 独自の命令だ。  プログラムの原理はともあれ、とにかく使ってみよう。E レジスターの値を変えることで、音がいろいろに変化して楽しめるはずだ。 【リスト 1.6 (PCMREC.MAC)】 【リスト 1.7 (PCMPLAY.MAC)】 表 1.4:PCM用の I/Oポート ● ADDA(VUFF) : バッファモード D/A コンバーターの出力を指定する。D/A 時は 0(ダブルバッファー)、A/D 時は 1(シングルバッファー)にしよう。なお、リセット時はダブルバッファーの状態になっている。 ● MUTE : ミューティング制御 システム全体の音声出力をオンにしたり、オフにしたりする。 0 : 音声出力オフ(リセット時) 1 : 音声出力オン ● FILT : サンプリングホールド回路入力信号の選択 A/D 時にサンプリングホールド回路に入力する信号を、フィルターの出力信号にするか、基準信号にするかを選択する。0 で基準信号、1 でフィルター出力信号になる。リセット時は 0。 ● SEL : フィルター入力信号の選択 ローパスフィルターに入力する信号を、D/A コンバーターの出力信号にするか、マイクアンプの出力信号にするかを選択する。0 で D/A コンバーター出力信号、1 でマイクアンプ出力信号音。 ● SMPL : サンプリングホールド信号 入力信号をサンプルするか、ホールドするかを選択する。 0 : サンプル(リセット時) 1 : ホールド ● COMP : コンパレーターの出力信号 サンプルホールドの出力信号と D/A コンパレーターの出力信号を比較する。 0 : D/A 出力 > サンプルホールド出力 1 : D/A 出力 < サンプルホールド出力 ● D/A7〜D/A0 : D/A 出力データ PCM データを再生するときに、用意されたデータをここに出力することで、PCM 音を再生することができる。データの形式はアブソリュートバイナリーで、127 が 0レベルに相当する。 ● CT1、CT0 : カウンターデータ 63.5マイクロ秒ごとにカウントアップされる。D/A 時にはカウントアップに同期し、0A4H 番地に書かれたデータが繰り返し出力される。また0A4Hにデータを書き込みとカウンターはクリアーされる。