サウンドプログラミング

はじめに

この記事は 音楽ツール・ライブラリ・技術 Advent Calendar 2018 の 22 日目の記事です。

OPEN MUCOM88 とは PC-8801 シリーズ用 FM 音源ドライバーである "MUCOM88" のオープンソース版です。 12/20 の OBSLive にて発表がされ、同日公開されました。

発表されてまだ間もないところなので、軽く見た感じで記事にしたいと思います。あまり深堀はできていませんがご了承ください。

MUCOM88 とは

古代祐三氏によって開発された PC-8801 シリーズ用の FM 音源ドライバーです。一般向けには "MUSIC LALF" という名称で市販されていました。歴史的な背景は正確なところを語る自信がないので、 hally 氏の著作を是非ご一読ください。

※2018/12/23 追記
よく読み返してみたら MUCOM88 についての記述は特にされていませんでした。すいません。 MUCOM88 の前身となる SPLIT ~ MUCOM (Falcom ドライバー) については詳しく書かれています。全体的に読み応えのある良い本ですのでチップチューンに興味がある方へお勧めできます。

OPEN MUCOM88 の構成

2018/12 現在の First Commit 版ではオリジナルの 88 版と Windows 版が公開されています。

  • 88 版はオリジナルそのもので、 Z80 のアセンブラソースコードになっています。
  • Windows 版については下記のような構成になっています。
    • Z80 + OPNA エミュレーターの上にオリジナルの MUCOM88 を実行させている構造のようです。
    • コアに音声再生エンジン自体が統合されているため、コア自体が Windows に依存しています。他プラットフォームで動かすにはこの部分の切り離しからになると思います。

ライセンスは CC BY-NC-SA 4.0 となっていますが、 Windows 版についてはドライバー本体以外にライセンスの異なるライブラリが使用されています (リポジトリに一緒にコミットされているので別途ソースコードを入手する必要はありません) ので利用の際は各種ライブラリのライセンスも要確認です。また、 Windows の GUI アプリケーションである MUCOM88 Windows のソースコードは含まれていません。 (12/23 訂正) 含まれていました (hspplugin/mucom88win.hsp) 。確認不足ですいません。

Windows 版はプロジェクト (src/mucom88.vcxproj) を開き、ビルドをすると "mucom88.exe" というコンソールアプリケーションが生成されます。 MML のコンパイル、再生はこれで試せるのでコアの使い方はこれを見れば基本的な使い方は理解できそうです。

First Commit 版ではビルドエラーが出ましたが、該当箇所は私が試した範囲では通ることがなかったようなのでコメントアウトでいけました。 (mucomvmm.cpp - 469 行目の SetHL(ans); をコメントアウト)

とりあえず MML をコンパイルして再生するコードはこんな感じでした。

int main()
{
    CMucom mucom;
    mucom.Init();

    mucom.Reset(2);
    mucom.CompileFile("sampl1.muc", "sampl1.mub");

    mucom.Reset(0);
    mucom.LoadMusic("sampl1.mub");
    mucom.Play(0);

    mucom.PrintInfoBuffer();
    puts(mucom.GetMessageBuffer());

    while (!(GetKeyState(VK_RETURN) & 0x80000000))
    {
        ::Sleep(100);
    }

    mucom.Stop();

    return 0;
}
  • まず最初に Init を一度実行します。ウィンドウアプリケーションの場合はそのウィンドウのハンドルを指定します。
  • コンパイルする前、曲ロードして再生の前等、大きな処理をする前には Reset をする必要があります。 Reset しないと正しく処理が行われません。
  • PrintInfoBuffer と GetMessageBuffer を呼んでいるところは情報表示のためのものなのでなくても可です。
  • 再生は別スレッドで行われています。コンソールアプリだと再生開始後にすぐ終わってしまうため、最後に GetKeyState ループで終了待機させています。

再生エンジンが組み込まれているので Windows で鳴らすだけだったら簡単なのでよいですが、自力で鳴らすようにしたい場合はかなり読んで再生エンジンの切り離しをしないといけないので逆に大変そうです。

おわりに

とりあえずざっと試してみたところで記事にまとめてみました。

非常に有名なドライバーでありながら現代では入手自体が難しかったドライバーでしたが今回のオープン化、 Windows 対応により誰にでも使いやすいものになりました。オープンソース化により周辺環境に改善も進みそうですし、今後も楽しみです。

ライセンス

本記事は OPEN MUCOM88 のライセンス (CC BY-NC-SA 4.0) に準拠します。 (README.md / license.txt)