PC-6001mk2/6601/SR 対応の XeGrader 制作中ですが、前回の PC-8001mk2/SR の BEEP とは異なり、立派な音楽再生用の PSG チップを搭載しています。まともに音を鳴らしまくると、処理負荷が大きいので今回はとにかく動作が軽いドライバを目指して再設計しました。また、PC-8001mk2/SR 版の MML である程度そのまま演奏できることも目指して作成しました。今回はここでその成果物を公開したいと思います。


  • 準備
最初に PSG Sound Composer アーカイブをダウンロードして圧縮を展開します。
※ アーカイブ内のテキストは等幅フォントで御覧ください。


修正履歴

* 20241116-0900  v1.0.0.9
- サウンドデータのバイナリサイズを8KBまで演奏可能に拡張
- mmlSample.txt のアレンジを梶原さん自ら行ったデータに変更
- 演奏終了時にサウンドミキサのフラグも操作するように
- 演奏の中断と再開を追加(PAUSE機能の実現
* 20241103-1120  v1.0.0.8
- 割り込み速度を16.6%遅くした
* 20241017-0920  v1.0.0.7
- PSGDrv.z80:再生終了後に謎の楽曲を奏でていたバグをFix
- PSGDrv.z80:再生終了後にCh.A,Ch.Bのワークを初期化していなかったバグをFix
- PSGDrv.z80:効果音発音終了時に再生優先度を初期化していなかったバグをFix
* 20241001-0830  v1.0.0.6
- データ変換時に選択されたモードを表示
- 効果音モードのデフォルト音長は%1とした ※%3に変更の可能性あり
- 効果音モードのチャンネル変更はエラーとした
- PSGDrv.z80:効果音再生を楽曲再生と同じ処理に
- PSGDrv.z80:演奏終了判定は1ch2chどちらも見るように
- PSGDrv.z80:使用チャンネルに応じてR7のMixerを操作
- PSGDrv.z80:効果音チャンネルをBGMタイマーでも操作してたバグをFix
- PSGDrv.z80:音を止める際に割り込み禁止にしていなかったバグをFix
- PSGDrv.z80:効果音の音程レジスタ番号を間違えていたバグをFix
* 20240930-1300  v1.0.0.5
- コンバート時の端数処理がチャンネル個別ではないバグをFix
- PSGDrv.z80: 音長が128以上の時に音長処理がスキップされていたバグをFix
* 20240929-1300  v1.0.0.4
- テンポコマンドを追加
- 再生時に音長カウント値の端数が発生した際に次回の音長に持ち越すように
- Lデフォルト音長に%が使用できるように(使用は非推奨
- 連続した休符は全て自動接続とした
- PSGDrv.z80 / Ch.Bが先に終了した際に謎のサウンドが再生されていたバグをFix
* 20240929-0800  v1.0.0.3  
- タイで音長接続の際半音指定が2重で効いてしまうバグをFix
* 20240928-1900  v1.0.0.2  
- 割り込みがかかる速度が1.5倍遅かったので調整
* 20240928-1530  v1.0.0.1 
- MMLテキストの行頭に ! を付与すると、その行をコメントとして扱うように
* 20240928-1300  v1.0.0.0
- 初版公開

Sound Composerを解凍した
次にエミュレータを用意します。ここでは PC6001VW4 で説明します。戦士カートリッジに対応しているPC-6001であれば、別のエミュレータでも構いません。参考までに私はメインチェックは PC6001V で行っていて、トレースデバッグに PC6001VW4 と使い分けています。PC-6001 の互換ROMの記事は下記で解説しています。



ごかん BASIC ROM やフォントデータを全て解凍して rom フォルダにコピーします。上書き確認が出たら全部「ファイルを置き換える」を選択します。コピーが全て完了したら、pc6001vw400\rom フォルダ内はこんな感じになっているはずです。
romフォルダの状態
この中で CGROM60m.62 というファイルがあると思いますが、これをコピーして CGROM60.62 をダミーで作ってしまいます。
CGROM60.62を作った
使用したアーカイブファイルは以下のとおりです。
正しく設定できたら pc6001vw400 フォルダ内の PC6001VW4.exe 起動して Model を PC-6001mkⅡ を選択します。
PC6001VW4起動設定
互換 ROM を使用するにもチェックを付けて Start Emulation ボタンを押します。
ここは「はい」を選択
起動時にこんな確認画面が出たら、こちらは「はい」を選択します。無事起動してごかんBASICのモード選択画面が表示されたら、準備 OK です。
ごかんBASICで起動
一旦エミュレータの起動を終了して、そのエミュレータのフォルダ pc6001vw400 を PSG Sound Composer に丸ごとコピーします。これで以下の流れで作曲できるようになりました。
  1. テキストエディタで MML を書く
  2. ConvSound でバイナリにコンバートする
  3. PC6001VW4 で実際に演奏させて確認する
準備完了
※ MIDIの入力端末用。まあ、最近はMIDIの需要が何処まであるかは疑問あったりしますが…

  • 作曲
MML はテキストで記述します。同梱されている mmlSample.txt は梶原さんが Newシティヒーロー用に描き下ろした楽曲です。こちらでほぼ全ての機能説明が分かります。MML の種類別の仕様は同梱の mmlDoc.txt をご参照ください。

なお、以下に簡単に注意点をまとめておきます。
  1. チャンネルのデフォルトは Ch.A です。
  2. 各行の先頭に 1: または 2: と記述するとチャンネル指定となります。
  3. 行頭にチャンネル指定がない場合は、直前のチャンネルが引き継がれます。
  4. 有効オクターブは 1-8 の範囲です。
  5. 音長が L1=96 を綺麗に割り切れない場合は演奏が保証されません。
  6. オクターブの上下では範囲外判定は行われません。
  7. ループでは、ループ末尾のオクターブがそのまま引き継がれます。
  8. エンベロープ設定を行ったチャンネルは自動的にエンベロープが有効です。
  9. 別のチャンネルでもエンベロープを有効にしたい場合はV16を指定します。
曲をMMLで記述したら、ConvSound.exe でバイナリ変換します。コマンドラインでファイル以外何も指定しなければ、その楽曲をコンバートしたデータが出力されますが、オプションで /P を指定すると、動作確認用の SoundPlayer.bin も同時に生成されます。試しに mmlSample.txt を変換してみます。このファイルを _convert.bat に D&D します。これだけで mmlSample.bin と SoundPlayer.bin が生成されます。
バイナリファイルが出来た
音楽演奏のチェックですが、エミュレータを使います。先に用意した PC6001VW4 を起動します。設定画面の下側、MEGA-ROM タイプを [戦士] に切り替えます。拡張 ROM イメージには自動生成されたSoundPlayer.bin を選択してください。この設定は記憶されますので、一度指定すれば以降は再設定の必要はありません。
PC6001VW4メガROM設定
[ Start Emulation.] ボタンを押して音楽演奏されれば OK です。以降は、p6vwemu4.exe を起動するだけで、直接エミュが起動して、サウンドの確認ができるようになります。
音楽再生中
作業を円滑にするため、p6vwemu4.exe のショートカットを作っておきましょう。ショートカット名の先頭に _(アンダースコア)をつけると、表示順が上位にきますので探しやすくなります。
ショートカットを用意した
※私でも名前を知ってる作曲ツールの大定番!

  • Z80 PSG ドライバ
解凍したフォルダ内に z80 フォルダがあります。ここに PSGDrv.z80 が格納されています。このソースプログラムは zlib license としています。BGM 再生部は動作確認済みですが、効果音処理部は作成したばかりで動作確認していません。こちらはオマケとしてお考えください。効果音データは PC-8001mk2 XeGrader のデータがまるっきりそのまま使えるはずの設計となっています。そのため、データの作成はこちらを参照してください。



本ドライバは一部自己書き換えを行っています。音楽演奏のメイン処理部は1箇所だけなので、そこをワークに置き換えれば動作しますが、演奏開始や停止などは、フラグを見ずに直接呼び出し先を変更することで対応しています。ROM でのご使用の場合は修正が必要となります。

以下、各ルーチンの簡単な説明です。

PSG.Initialize
ドライバ全体の初期化を行います。起動時割り込みがまだ動いていない状態で最初に一度だけこちらを呼び出してください。

PSG.SNDTimer
割り込みから呼び出されるエントリとなります。このラベルを割り込みから呼び出すようにしてください。PSGドライバでは AF,HL,DE,BC のレジスタ以外は使用しておりません。また、L1=96 前提で動作しています。もし、L1 のカウント値を変更したい場合、例えばL1=48とする場合は、ConvSound /L=48 とオプション指定して変換してください。

PSG.BGMTimer
MML解析と音楽演奏のメインです。ほんの僅かな改造で 3ch 演奏も可能になりますが、コンバーターは最大 2ch ですので、1ch を 3回コンバートして、自前でヘッダを付けて結合する必要はあります。音楽の終了判定は Ch.A だけで行っています。Ch.B に演奏データが残っていても無視しますので、その際は Ch.A と Ch.B を入れ替えてください。

PSG.BGMPlay
BGM演奏開始指定です。1ch と 2ch で初期化が異なります。また、その初期化は自己書き換えで実現していますのでご注意ください。

PSG.MusicPlay
音楽再生が終了するまで処理が戻らないブロックルーチンとなります。

以上です。おそらくは AY-3-8910 を搭載した Z80 マシンであれば、そのままに近い状態で動作するのではないかと思います。書き換えるとすれば、PSG.Reg / PSG.Write / PSG.Read / PSG.InActive のポート番号と、ワークエリアの位置ぐらいでしょうか。ROM で動作させる場合は、少し修正は多くなると思います。

何かあればコメント欄、または X @NAITOTokihiro までご質問ください。
以上、皆様のお役に立てば幸いです。
M-Audio USB MIDIキーボード 61鍵 ピアノ音源ソフト付属 Keystation61 III
inMusic
2018-08-02
※キーボードでコスパ優先ならこれかな。正直、よくわからんけど^^;