第6話 BEEP音源ドライバー(前編)

「PC−8001は音楽を演奏できない。」

これは、N-BASICやN88-BASIC(初代)でゲームを作る者にとって、 大きな障害であった。具体的にいうと、 PC−8001や8801(初代)は、音楽演奏のための 装置を搭載しておらず、音といえば「ピー」というブザー(BEEP音)しか 鳴らせなかったのである。

だが、マニアというのは恐ろしい。PCユーザー達は、 この単純なブザーだけを使って、プログラムの力で音楽演奏を実現してしまっていた。

簡単にいえば、「ブザーを高速にON・OFFする」ことにより、 その切り替えのスピードに応じて、擬似的に音階を作り出せるのである。 原理は未だによくわからないのだが、 とにかくPC−8001のゲーム達は、その多くが 多彩な効果音やメロディを奏でていた。 特にI/Oか何かに載っていた(らしい)パックマンは、 スタート時にはちゃんとスタートミュージックが鳴り、 ゲーム中には「バグバグバグ・・・」という楽しげな効果音が鳴ることで、 本物感を演出していた。 どんな楽器にもないその独特の音色は、「本来音楽演奏ができない機械が 奏でている」という事実とも相まって、非常に魅力的なものに感じられた。

マシン語入門書やベーマガなどの書籍でもこのテクニックは紹介されていたし、 ベーマガでも、かなりの数の投稿プログラムがマシン語による音出しルーチンを搭載していた。 そんなベーマガの投稿プログラムコーナーで、ある時こんな一文を見た。

「なんとPC−8001で二重和音を出すルーチンを開発したので、 次回はそれを使ったものを投稿します。」

確か、1985年3月号の「CPU PANIC」だったろうか・・・? 前述のルーチンは、単音しか出すことができなかった。 和音を出すことは原理的に不可能な筈である。 だが、その常識を覆し、なんと二重和音をPCー8001で実現するという。 いったいどうやって・・・?

BEEPを使った二重和音演奏。ちょっとした一節だったが、 その概念は頭の片隅に残った。 (その「二重和音を使った投稿」には ついにお目にかかれなかったが。)

時は流れ、中学時代。ある日の 放課後、ふと、こんなことを考えた。

「2つの音を並列に(というか、超高速で交互に)処理したら いったいどうなるだろうか?」

それは、まったく単なる思い付きだった。どんな音が出るか想像もつかないが、 何か面白い音が出るかもしれない。なんとなく面白そうと感じ、 それを実現する機械語プログラムを書いてみた。 当時はPC−9801UV2を使っており、i8086を覚えたての頃だったろうか。 とにかく、さほど苦労することもなく、1時間も立たずにそのプログラムは完成した。

帰宅したあと、早速そのプログラムを試してみることにした。 UV2を立ち上げ、アセンブラを使ってそのルーチンを入力していく。 そして、実行。

・・・鳴った。和音だ。・・・それは確かに和音だった。 あわててもう一度鳴らしてみる。・・・間違いない。それは確かに和音に聞こえた。

「さすがは98だ。」これが16ビットの威力か。 こうして、信じられないくらいあっさりと、二重和音ルーチンは完成した。 そして開発中のゲームにこのルーチンを組み込み、ベーマガに投稿したが ボツった のであった。(ちなみにゲームは「BATTLE GAME」といって ドラクエの戦闘シーンだけを真似たものであった。)

そして今。NEVIOUSを作った余韻もさめやらず、 「PC−8001の限界に挑む」面白さを再び味わうべく、 あの時の和音ルーチンをPC−8001で再現・・・ PC−8001で二重和音演奏を実現するという実験を試みた。

アルゴリズムはかつて98で実現したものと同じであるが、 なにしろ低性能のPC−8001であるから、同じアルゴリズムだからといって 実現できるかどうかはわからない。とりあえずZ80用のコードを書き、 例の如くハンドアセンブルし、モニタから入力していく。

CTRL+B。POKE &hDFFF,30。POKE &hDFFE,50。DEFUSR=&hE000。2つの音階をメモリに書き込む。 準備は完了だ。OUT &h81,0。A=USR(0)。早速実行してみた。

「プー」

鳴った!そしてそれは確かに和音に聞こえた。成功である。 PC−8001でも和音は演奏できるのだ!興奮気味に、その後もいろいろな音階で 試してみる。組み合わせによっては和音かどうかよくわからない音もあったが、 大抵はちゃんと和音になっていた。


BATTLE GAME(PC-9801用)の音楽を紹介。 さすがに98、ちゃんと和音になっている。が、 音が細切れになってしまい連続音が出せないのが残念。

ちなみに8001用ゲームの音楽はこちらのページで聞けます。