VOL.15 — PROGRESS REPORT

複数の音源が、同時に鳴る。
——FM音源ドライバの刷新と、専用エディタの誕生

はじめに——音を、正面から作る

前回の最後に、私はこう書いた。 「次回は、二つ目のZ80 CPUで、FM音源ドライバが鳴り始める話を——お届けしたい」と。

だが、計画を詰めていく中で、優先順位を入れ替える判断をした。

Z80への実装より先に、まずWindows上で作曲環境を作り、 実際にその環境で作曲・編曲作業を進めながら、 MMLの書式を決めよう。

理由は単純だが、過去の教訓もある。

Z80アセンブラで書いたドライバは、一度組み上げてしまうと書式の変更が非常に高くつく。

メモリも速度も限られた環境で、

「やっぱりこの表記が要る」「この命令は不要だった」を後から反映するのは、

ほとんど作り直しに等しくなる恐れがある。そのための検証作業にも時間がかかる。

書式が固まっていない段階でZ80へ降ろすべきではない。

そう思いなおし、実際にMMLを記述しながら、より使いやすいものに仕上げることを優先することにした。

というわけで、この期間の作業は二つになった。

VNStudioに載せるFM音源ドライバそのものの刷新——

OPNAとOPLL、そしてADPCM。複数のFM音源チップとPCMを同時に鳴らせるようにする。

そして、その音づくりのための専用のMMLエディタを、

新しく一本立ち上げたことである。

今回は、この二つのトピック——音源の話だけで一本お届けする。

第1章:OPNAとOPLL——「どちらか」ではなく「すべて同時再生へ」へ

Vol.9で語った

「失われたゲーム音楽文化のサルベージ」。

その具体的な手法として、

OPNA(YM2608)とOPLL(YM2413)の

エミュレーションコアを搭載することとしていた。

前者はPC-8801mkIIFAなどのサウンドボードIIの系譜、後者はMSX2のFMPACの系譜である。

今回、更に、X68000の系統であるOPM(YM2151)とADPCM(MSM6258)も搭載することとし、

同時再生を可能とした。

OPMとOPNAのあの特別な高音の響きのメロディーとPCMとの躍動感あるリズムのハーモニー。

OPLLの愛らしく太い音色。それらの「楽器」を同時に演奏できるのだ。

なお、FM音源ドライバの構成は、従来のレトロゲームなどの音源ドライバを複数分析することで知見を高め、

このドライバでは、ソフトウェアエンベロープやポルタメントなどの音のエフェクトのロジックを、音階発声(ノートオン・オフ)の上位で動かすことにより、

まるで、「FM音源がシンセサイザーになったかのようなサウンドを奏でる」ことを目指した。

第2章:オリジナルMMLエディタ——「RetroFM-Music Editor」

MMLをWindowsのテキストエディタなどで書いて、コマンドで再生して、また書き直す—— それでも作れないことはない。だが、 VNStudioの「まるでiPadで絵を描くように」という、基本思想を、ここでも実現しようと考えた。

そこで、FM音源ドライバ専用のMMLエディタを新規で開発することにした。

名前はRetroFM-Music Editor。

VNStudioと同様、WPF上で動作する、Windows向けの単体アプリケーションである。

RetroFM-Music Editorの画面。左からファイルツリー、MMLエディタ、プレイヤー/チャンネルモニタ
RetroFM-Music Editor。左からファイルツリー、MMLエディタ、プレイヤー/チャンネルモニタの3ペイン構成。再生中のコマンドがMML上でハイライトされ、右のモニタではOPLLとOPMの各チャンネルが同時に発音しているのがわかる。

画面は3ペイン構成だ。

左にファイルツリー、中央にMMLエディタ、右にプレイヤーとチャンネルモニタ。

それぞれ独立して表示・非表示を切り替えられ、

隠したペインの領域は残りのペインが完全に埋める。

この組み合わせも、ペイン幅も、次回起動時に復元される。

主な機能を挙げておく。

  • MMLシンタックスハイライト——制御コマンド・ディレクティブ・チャンネル宣言は青、音符と休符は濃色、コメントは緑がかった灰色
  • 再生中コマンドのハイライト——いま鳴っている音が、MMLのどの文字から来ているかを原文位置で追跡して光らせる
  • チャンネルモニタ——チップのプリミックス出力から求めた実測RMS(-60〜0 dB)のレベル/ピーク表示、ミニ鍵盤、リズム楽器(BD/SD/HH/CY/TM/RI)の個別発音表示
  • Mute / 複数選択Solo——同一チップの内部リズム3chはRHYという1本のストリップへ統合
  • シーク——無音レンダリングで音源の内部状態を再構築してから移動する。前方シークは差分だけを進め、後方シークは先頭から作り直す
  • ライブ編集ホットスワップ——MMLを書き換えると、再生位置を保ったまま演奏内容が差し替わる
  • CLI——48kHzステレオのWAVを書き出し、ピーク値・tick数・PCMのSHA-256を報告する

実際に演奏している様子を、動画で置いておく。

※この動画には音声が含まれます。再生の前に音量にご注意ください。

RetroFM-Music Editorでの演奏(音声が再生されます)。再生中のMMLコマンドが原文位置でハイライトされ、右のチャンネルモニタでOPLLとOPMが同時に鳴っているのが確認できる。

なお、UIの配色・フォント・角丸ボタン・スリムなスクロールバーは、

VNStudioのエディタと意図的に揃えてある。

同じ工房から出た道具に見えること——それも基本だが大切な概念だ。

音を作る道具を、音を鳴らす仕組みと同じ手で作る。
理想を実現するためには、一見遠回りに見えても、これがいちばん速いはずだ。

第3章:そして、次のステージへ——

ここまではすべて、Windows側の実装の話である。

このVNStudio上で作った作品は、

fmplay bgmの1行でこのFM音源セットを鳴らせる状態となり、Windows版は、ほぼ完成形が見えてきた。

そして次の挑戦は、VNStudioのX68000、FMTowns、PC9821などへのレトロコンピュータへの移植と、 XZ80へのFM音源ドライバの実装だ。

ここまで育てたVNStudioゲームエンジンと、ドライバの設計を

Z80やMC68000のアセンブラで書き直して、実際のマシンで動かすことだ。

C#で作った実装が正しく動いているぶん、

「何を作ればいいか」の作業の輪郭は、もう見えてきている。

「当時憧れた『夢のパソコン』で、実際に動くゲームを『自分』でつくる」

これを、このプロジェクトの本懐としたい。