2024年 10月 10日
WindowsのVSCode上で、MDX用のMMLの編集・コンパイル・演奏を一貫して行う
1.はじめに
X68000にて作曲・演奏する方法は色々とありますが、その一つがMMLを用いたものです。MMLはMusic Macro Languageの略で、テキストファイルベースで作曲(演奏させる音源への音量・音色等の指示含む)を行うことができます。ごく単純にいえば、「cdefgabc」とテキストで打ったものを、演奏ファイル(後述のmdxファイル)に変換し、それをmdxファイルのプレーヤーで演奏することで、ドレミファソラシドの音を鳴らすことができます。
上述の流れを整理すると、X68000でMMLベースで作曲・演奏させるには以下の三種類のソフトウェアが必要となります。
- 【作曲編集】mmlを記述するテキストファイルのエディタ(例:ED)
- 【MDX変換】mmlをmdx形式に変換するソフト(例:MXC、NOTE)
- 【MDX再生】mdxを再生するソフト(例:mxdrv16+mxp)
これらのソフトウェアは今でもネット上で入手可能ですので、X68000(実機・エミュレータ)で作曲・演奏させるには何ら問題はありません。とはいえ実機やエミュレータではなく、Windows機でやってみたいという方も全国に5000万人はいらっしゃると思います。上述の3ステップを切り分けて行うことももちろんできますが、本記事では、WindowsのVSCodeを用い、作曲編集・MDX変換・MDX再生を一気通貫で行う方法を紹介します。
なお、本記事は以下の@GOROmanさん、@Awed_Urshyさんのツイートにインスパイアされて整理したものであり、各種ツールの開発者の方々も含め、偉大な先人がいらっしゃったからこそ執筆し得たものです。この場を借りて謝意を示します。
2.simple_mdx_player.exeのコンパイル
最初に取り組んだのは「mdxを再生するソフト」の準備です。あうぇっどさんのツイートに「MXPにあたるものは、YosshinさんのSimple MDX Playerをコンパイル」とあったので、こちらのPortable mdx decoderのexampleディレクトリにあるsimple_mdx_playerを利用することとしました。
配布されているものはソースファイルであり、実行ファイルではないので、Windows上でコンパイルする必要があります。そのコンパイルには何かしらコンパイラが必要ということで、Mingw-w64をインストールしようとしたのですが、標準で配布されているものは一発でインストールできませんでした。結局Release of 14.2.0-rt_v12-rev0に置いてある「x86_64-14.2.0-release-posix-seh-msvcrt-rt_v12-rev0.7z」(msvcrtとある版は、Win7未満との互換性がキープできるとのことでこちら)をダウンロード、解凍しました。解凍する場所はどこでもよいが、解凍後のフォルダのbinディレクトリをPATH変数に追加することが大事です。例えば「c:\mingw64」にインストールしたとしたら、「c:\mingw64\bin」を追加することになります。
次に、simple_mdx_playerのコンパイルを行うフォルダ(\portable_mdx-master\examples\simple_mdx_player)にて、mingw32-makeを実行してコンパイルしようとしたのですが、うまく行きません。結局以下の通り「Makefile」「mxdrv_context.cpp」「main.c」を微修正したらmakeが通るようになりました(このことをgithubにコミットすべきなのでしょうが、現時点でやり方がよく分からずそのままです…)。
Makefile(以下の各所をコメントアウト・追記)
#### SDL2CONF = sdl2-config
# SDL2のインクルードディレクトリとライブラリディレクトリを設定(ダブルクォートで囲む)
SDL2_INCLUDE = "../SDL2-2.0.7/include"
SDL2_LIB = "../examples/SDL2-2.0.7/lib"
#### COMMON_FLAGS = -O3 -I$(DIR_INCLUDE) $(shell $(SDL2CONF) --cflags)
# SDL2を手動で指定
COMMON_FLAGS = -O3 -I$(DIR_INCLUDE) -I$(SDL2_INCLUDE)
#### LIBS = $(shell $(SDL2CONF) --libs)
# SDL2のライブラリの参照先を変更
LIBS = -L"../SDL2-2.0.7/lib/x64" -lSDL2main -lSDL2
#### rm -rf $(TARGET_DIR)
rmdir /S /Q objs
#### rm -f $(TARGET_FILE)
del $(TARGET_FILE)
#### 以下を追加
copy /Y "..\SDL2-2~1.7\lib\x64\SDL2.dll" .
mxdrv_context.cpp
72行目の「new(&impl->m_mtx) std::mutex();」を削除(またはコメントアウト)
main.c
math.hのインクルード(10行目に「#include <math.h>」を挿入)
上記修正を行ってコンパイルを行うと、当該フォルダに「simple_mdx_player.exe」「SDL2.dll」が出てくると思いますので、その二つのファイルを用いることになります。なお、どちらとも再配布は差し支えなさそうなライセンスのようですので、改変したファイルも含めsimple_mdx_player_changed.zipとしてネットに上げておきます(差支えがある、誤解があるようであればご指摘いただけると幸甚です)。
3.mmlをmdx形式に変換するソフトの導入
mmlをmdx形式に変換するソフトとしては、ここではnote.xを利用します。X68000実機であれば、「>note.x hogehoge.mml」とすることでhogehoge.mdxファイルが生成されますが、note.xはX68000用のアプリケーションですので、Windows上のコマンドプロンプトで同じことを行っても動作しません。そこでrun68というコマンド上のX68000のエミュレータソフト(色々と派生があるようですがRun68.exe 改造版にリンクしておきます)を間に挟みます。このアーカイブに含まれているrun68.exeを利用し「>run68.exe note.x hogehoge.mml」とすることでWindows上でもhogehoge.mdxファイルが生成されるようになります。
4.VSCode機能拡張「vscode-mdxmml」の導入
次にVSCode(既にインストール済みとします)の機能拡張である「vscode-mdxmml」の導入です。これを導入することでmmlファイル(musファイル含む)の編集画面のハイライトを行うことができます。インストール方法はリンク先のGoromanさんの説明のほうが分かりやすいので割愛しますが、vsixファイルをダウンロードして拡張機能としてインストールするだけです。この拡張機能がインストールされていると、以下画像のように、mml上のコマンドがハイライトされます。
5.VSCode機能拡張「Code Runner」の導入
「c:\mdx\」以下のディレクトリに、run68.exe、note.x、simple_mdx_player.exe、SDL2.dllが置いてあり、そのディレクトリ内にtest.mmlを保存・編集するとします。当該ディレクトリでいちいちコマンドプロンプトを開いて「>run68.exe note.x test.mml」や「simple_mdx_player.exe test.mdx」を実行するのは明らかに面倒です。これをVSCodeから一気通貫で実行するための機能拡張が「Code Runner」です。
Mac用の設定はGoromanさんがCodeRunner用の設定(Settings.json)を公開されているところですが、Windows用としては以下の内容を「"code-runner.executorMap": {(略)}」のセクションに引き続いて記載すればよいと思います。
"code-runner.executorMapByFileExtension": {
".mml": "cd $dir && run68.exe note.x $fileName && simple_mdx_player.exe -noVisualize $fileNameWithoutExt.mdx",
".mus": "cd $dir && run68.exe note.x $fileName && simple_mdx_player.exe -noVisualize $fileNameWithoutExt.mdx"
},
6.VSCodeでMMLファイルを編集・MDXファイルの演奏をしてみよう
後は、VSCodeでtest.mmlを開いて編集し、演奏させたいと思ったタイミングでVSCode右上の再生ボタンまたは「Ctrl+Alt+N」の同時押しを行うことで、mdxファイルへの変換とそのファイルの演奏が行われます。以下はVSCodeの出力コンソールでの表示です(白抜きの箇所は実際のディレクトリパスが記載されます)。
なお、以下画像のように音色と演奏内容の一部を選択したまま、上記操作を行うと、選択された部分のみが演奏されます。特定のパートだけ試行錯誤したいときは便利ですね。
おまけ:MDXファイルをMMLファイルに逆変換(2024年10月12日修正)
note.xはMMLをMDXに変換するわけですが、逆にMDXファイルをMMLに変換するソフトウェアもあり、tmdx2mus.rはその一つです。


当初run68.exeでtmdx2mus.rを動かそうとしたのですが、ArctanXさんが日記に「 tmdx2mus.r というものの存在を知ったが、run68.exe だとやっぱりエラーになってしまう」と書かれているとおり、うまく行きませんでした。
ところがその後、@kg68kさんより「run68xなら動作すると思います」とのありがたいコメントをいただきました。
ということで、早速以下のrun68xを試してみることにしました。
Windowsバイナリが配布されているわけではないので、ソースからビルドすることになります。その際以下の通りちょっと苦労しましたが、最終的に「[100%] Built target run68」との表示がなされるとともに、buildディレクトリにrun68.exeが生成されました。
- 開発環境がMinGWの場合、cmakeが必要です。
- cmakeでのビルドの前準備がなかなかうまく行きませんでした。結局MinGWを利用することの指定、警告メッセージを省略する指定、ICONVを使わない指定でお茶を濁しました(「> cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_C_FLAGS="-Wno-error -Wno-stringop-truncation -Wno-unused-function -Wno-unused-variable -Wno-maybe-uninitialized" -DCMAKE_CXX_FLAGS="-Wno-error -Wno-stringop-truncation -Wno-unused-function -Wno-unused-variable -Wno-maybe-uninitialized" -DUSE_ICONV=OFF」)。
- ビルド中も色々とエラーが出たのでエラーを見ながらソースの微修正(「doscall.c」と「fefunc.c」を微修正)。
単にexeファイルを実行すると以下のように表示されます。
>.\build\run68.exe
run68x 2.0.1 Copyright (C) 2024 TcbnErik
based on X68000 console emulator Ver.0.09a+MacOS
Created in 1996 by Yokko
Maintained since Oct. 1999 by masamic and Chack'n
Usage: run68 [options] execute_filename [commandline]
-himem=allocate high memory -f function call trace
-trmpu instruction trap
-debug run with debugger
-read-file-utf8 convert file encoding from UTF-8 on read
このrun68.exe経由でtmdx2mus.rを使ってhogehoge.mdxからhogehoge.musに変換させるには、(これらのファイルが全部同じディレクトリに置いてあるとすれば)コマンドプロンプトにて「> run68.exe tmdx2mus.r hogehoge.mdx」と入力・実行することになります。実際に試行してみたら、うまく動作しました。musファイルには当然、音色もメロディも全てテキスト形式で記載されていますので、好きなmdxファイルから、音色やメロディを参照し放題です。もちろん生成されたmusファイルは、上述のとおりVSCodeで編集したり、演奏させることも可能です。
最後になりますが、貴重なアドバイスをいただいた@kg68kさんに、この場を借りてお礼申し上げます。
by pn57
| 2024-10-10 03:35
| x68000
|
Comments(0)