開発途中
NES(.nsf/.nsfe)、SNES(.spc/.spc2)、VGM(.vgm/.vgz)のチップチューンを編集可能なMIDIに変換し、ブラウザで試聴できます。一度セットアップすれば、普段の利用にターミナルは必要ありません。
miditrackはMac上だけで動作します。音源ファイル、MIDI、レンダリングした音声はすべてローカルに残ります。
クイックスタート
- Apple Silicon Macで、Releasesページから最新の
miditrack.zipをダウンロードし、展開してmiditrack.appを~/Applications(または/Applications)へ移動します。必要なPython・Node.jsランタイムはあらかじめアプリ内に同梱されています。Intel Macをお使いの場合、配布版はApple Silicon専用です——後述のIntel Mac向けにmiditrack.appをビルドするを参照してください。
- Homebrewでランタイム依存を導入します。Homebrewが未導入の場合は先にインストールしてください。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install fluid-synth ffmpeg rubberband
- General MIDI SoundFont(
.sf2/.sf3)をユーザーのSound Banksディレクトリへ配置します。SoundFontはアプリに同梱・ダウンロードされません。
mkdir -p ~/Library/Audio/Sounds/Banks
cp /path/to/GeneralMIDI.sf2 ~/Library/Audio/Sounds/Banks/
miditrack.appをダブルクリックするか、Dockへドラッグして起動してください——最初から全画面編集レイアウトで開き、アプリ全体が専用のウィンドウの中で完結するため、別途ブラウザタブが開くことはありません。詳細は後述のDockからmiditrackを起動するを、ターミナルから起動したい場合はコマンドラインオプションを参照してください。
- 対応する音源ファイルまたは
.midファイルをアップロード枠へ置き、編集・試聴してからMIDIまたはWAVをダウンロードします。
ソースからビルドする方法はコントリビューター向けに別途用意しています——miditrack/README_ja.mdを参照してください。
できること
- NES、SNES、VGM/VGZの音源をMIDIへ変換します。複数曲を含むNSF/SPCでは曲を選べます。
- 複数の音源ファイル、
.zipのリップパック、または音源と.m3uプレイリストをまとめてアップロードできます。プレイリストから曲名を取得できます。 - General MIDIの楽器を割り当て、トラック別の音量・ミュートを設定し、トラック一覧を並べ替え、よく使う楽器とアンサンブルプリセットをローカルに保存できます。
- 対応トラックではSoundFontまたは原曲の音源を選べます。原曲の音源はゲーム由来のSoundFontまたはチップレンダラーを使い、SoundFontは選択したGMバンクを使います。
- 拡大可能なピアノロールでノートを確認し、再生位置・ループを指定し、色・テーマ・レイアウトを選び、全画面編集レイアウトへ切り替えられます。
- 曲全体の速度・ピッチを変更し、
.miditrackプロジェクトを保存・再読込して、編集済みMIDIまたは高品質WAVをダウンロードできます。 - 速度・ピッチのバリエーションZIP、またはトラックごとにWAVを含むZIPを生成できます。
ツール構成
| ツール | 役割 | 主な使い方 |
|---|---|---|
| miditrack | ブラウザでの変換、編集、試聴、出力 | 普段の利用に推奨 |
| nsf2midi | NES/ファミコンの.nsf/.nsfeをMIDIへ変換 |
CLIから直接、またはmiditrackの変換 |
| spc2midi | SNESの.spc/.spc2をMIDIと任意のゲーム用SoundFontへ変換 |
CLIから直接、またはmiditrackの変換 |
| vgm2midi | VGM/VGZのコマンドログをMIDIへ変換 | CLIから直接、またはmiditrackの変換 |
| miditrack/midi2wav.sh | FluidSynthを使ってMIDIをWAVへ変換 | miditrackから使用、またはターミナルで直接実行 |
必要環境
- Apple SiliconまたはIntel Mac、Homebrew、初回ダウンロード用のインターネット接続
- 最新のリリースビルドの
miditrack.app、およびFluidSynth・ffmpeg・Rubber Band(brew install fluid-synth ffmpeg rubberbandでHomebrewから導入) - カスタムの
.sf2/.sf3は次の探索先へ配置します(先頭を推奨)。~/Library/Audio/Sounds/Banks/Library/Audio/Sounds/Banks/opt/homebrew/share/soundfonts(Apple Silicon版Homebrew)/usr/local/share/soundfonts(Intel版Homebrew)/opt/homebrew/share/fluid-synth/sf2(Apple Silicon版Homebrew)/usr/local/share/fluid-synth/sf2(Intel版Homebrew)
コンバーターのバイナリ(nsf2midi・spc2midi)とVGM原曲音源のネイティブヘルパーはApple Silicon・Intel両対応(Universal)でmiditrack.app内に同梱されているため、通常の音源変換、VGM原曲音源、実音声ステムのミックス、トラック別出力、速度/ピッチ変更のいずれもどちらのアーキテクチャでもビルド不要です。ヘルパーのソースを変更して再ビルドする場合だけ、CMakeとNinjaを導入してからvgm2midi/scripts/build-native.shを実行してください。一方、同梱のPython・Node.jsランタイムは、そのmiditrack.appをビルドしたMac自身のアーキテクチャに固定されます——配布版はApple Silicon上でビルドしているため、Intel Macでは起動できません。後述のIntel Mac向けにmiditrack.appをビルドするを参照してください。
miditrackの使い方
音源ファイルまたは.midをアップロード枠へ置き、トラックとピアノロールが1画面にまとまったメイン画面で編集します。プロジェクトを保存は編集可能なMIDI・変換設定・トラック選択・速度/ピッチ・ループ・プリセットを.miditrackアーカイブとしてダウンロードします。プロジェクトを開くはその状態を復元します。音源の再変換は不要です。レンダー済み音声と生成済みZIPは意図的にプロジェクトへ保存しません。
Finderからファイルを開く
miditrack.appは、Finderから直接、またはDockアイコンへドロップして、.miditrack、.mid、.midi、.nsf、.nsfe、.spc、.spc2、.vgm、.vgz、.zipを開けます。.miditrackはプロジェクトとして復元し、単体のMIDIはMIDIとして開き、その他の形式は音源ファイルとして開きます。現在のセッションが置き換わる場合は、確認を表示します。
.miditrackプロジェクトではmiditrackが既定のハンドラになります。ほかの形式では既存のプレイヤーやDAWを置き換えないよう、代替ハンドラとして登録します。これらの形式でも既定にしたい場合は、Finderの情報を見る → このアプリケーションで開く → miditrack → すべてを変更を選んでください。install.shで作成済みのアプリは意図的に上書きしません。Finderの関連付けを更新するには、古いアプリを退避してから再インストールしてください。
ファイル選択
ヘッダーの開くをクリックするとこのダイアログが開きます。音源が未読み込みの場合は起動時に自動的に表示されます。
アップロード枠 — 点線枠へファイルをドラッグするか、クリックしてファイルピッカーを開きます。対応形式: .mid / .midi / .nsf / .nsfe / .spc / .spc2 / .vgm / .vgz / .zip / .m3u。複数の音源ファイル、ZIPリップパック、音源と.m3uプレイリストをまとめてドロップできます。ZIPはファイル数200件まで、展開後512MiBまでです。ZIP内の.spcと.spc2は変換でき、.rsnだけなど対応ファイルがないZIPはその旨を表示します。
ファイル・曲のピッカー — 変換可能な音源が複数ある場合はファイルのドロップダウンが表示されます。複数曲を含む形式(NSF、SPCリップパック)ではその下に曲ピッカーが表示されます。
変換設定 — フォーマット検出後に表示されます。
- VGM/VGZ — ループ回数または秒数(同時指定不可)。原曲の音源(実機)を初期選択はノイズ・DAC・リズム系トラックをチップレンダリングに設定します(変換後も個別に切り替え可能)。OPN Ch3 SpecialをGMドラムに変換はYM2203/YM2608/YM2612 Ch3 Specialオペレータをキック・スネア・ハイハット・シンバル・タムへ近似します。
- NSF/NSFE — 秒数と任意のPALタイミング。
- SPC/SPC2 — ループ回数。
MIDIに変換をクリックして変換を開始します。このダイアログからプロジェクトを開く・プロジェクトを保存も行えます。変換が完了するとダイアログが閉じ、下記のメイン画面に結果が表示されます。
メイン画面
トラックパネルとピアノロールが常に1画面に並んで表示されます。別の音源を読み込む・変換し直す場合は、ヘッダーの開くからいつでも上記のダイアログを再度開けます。
トラックパネル(左) — 各行にはカラースウォッチ、トラック名、MIDIチャンネル(CH)、音源トグル、楽器セレクター、ミュート、ソロ、音量スライダーが並びます。トラック▲をクリックするとアルファベット順に並べ替え、もう一度クリックすると逆順になります。MIDIチャンネル10(パーカッション)と複数チャンネルにまたがるトラックは楽器を変更できません。
SF / 原曲 トグル — SFは選択したGeneral MIDI SoundFontでトラックを再生し、楽器選択も反映します。原曲はSPCではゲーム由来のSoundFont、NSF/VGMではハードウェア・チップレンダリングを使用します。原曲モードでも音量は調整できます。物理チャンネルを共有するVGMの行はまとめて切り替わります。曖昧な共有チャンネルは原曲として自動選択されません。Cmd(Windows/LinuxではCtrl)を押しながらクリックすると、同じ選択肢を持つ他の全トラックにも同じ設定を一括適用します。
楽器セレクター — General MIDIの楽器を選択します。星アイコンでお気に入りに登録できます。Cmd(Ctrl)を押しながらクリックすると、そのセレクターの現在の選択値を、変更可能な他の全トラックへ一括適用します(「変更しない」のままのトラックには適用されません)。
ミュート / ソロ — どちらもレンダリングされるプレビューに反映されます。Cmd(Ctrl)を押しながらミュートボタンをクリックすると、他の全トラックのミュート状態も同じ状態(ミュート/解除)へ一括で揃います。解除時は各トラックがそれぞれ個別に記憶している直前の音量に戻ります(音量の値自体は揃いません)。
編成プリセット — 現在の楽器と音源の設定を名前を付けて保存できます。プリセット適用中は楽器欄が役割セレクターに切り替わります。プリセットはブラウザにローカル保存されます。
SoundFont — 標準の探索先で見つかった.sf2/.sf3から選択します。高速(22.05kHz)は試聴用の速いレンダリング、品質(44.1kHz)はWAVダウンロードと同じ内容です。
トランスポート(右上) — ◀◀と▶▶は5秒ずつ巻き戻し/スキップし、⏮は先頭に戻り、▶/⏸で再生・一時停止を切り替えます。キーボードショートカットも利用できます: Spaceで再生/一時停止、左右カーソルで±1秒シーク、Shiftを押しながら左右カーソルで±5秒シーク、PageUp/PageDownで±10秒シーク、Homeで先頭、Endで最後尾、Cmd+←で先頭へ移動します。タイマーは現在位置と全体時間を表示します。
速度 — 再生倍率を0.1〜10倍で設定します。以降のすべてのレンダリングとWAVダウンロードへ反映されます。
ピッチ — −24〜+24半音でシフトします。パーカッションは移調されません。MIDIの0〜127の範囲外になるノートは除外されます。
音量 — セッション全体のマスター音量です。
ピアノロール(右) — 全トラックのノートをカラーのバーで縦鍵盤上に表示します。横スクロールで移動、ピンチまたはスクロールホイールでズームできます。クリックでシークします。
ピッチベンド — 各トラックのピッチベンドデータをノートエリア下部に表示します。
レンダリングは編集後に自動で開始し、完成済みレンダーはセッション内でキャッシュされます。最後の変更から短い待機時間の後にプレビューを更新します。新しいレンダーが必要な状態で再生を始めると、現在位置付近の短い区間を先に鳴らし、全尺WAVの完成後に正確な音声へクロスフェードします。原曲のチップ音源トラックは変換後にバックグラウンドで準備され、準備完了後はこの短いプレビューにも加わります。全尺WAVの生成中はスピナーが表示されたままになります。
MIDIをダウンロード / WAVをダウンロード(下部) — MIDIをダウンロードは現在の楽器割り当てを反映した編集済みMIDIを保存します。WAVをダウンロードは現在のトラック設定・速度・ピッチで44.1kHzステレオWAVを生成します。保存ファイル名欄で基本ファイル名を変更できます。
バリエーションをまとめて生成 — 速度倍率と半音値をカンマ区切りで入力し、バリエーションをZIPでダウンロードをクリックします。ZIPにMIDIも含めるで各組み合わせのMIDIファイルも追加できます。速度6個・移調8個・組み合わせ合計15件までです。試聴中の速度・ピッチは変更されません。
トラックごとに出力 — トラックごとにZIPでダウンロードで音があるトラックごとにWAVを作成します。原曲の音源トラックを1つにまとめるをオンにすると、原曲の音源チャンネルを1ファイルにまとめてハードウェアチャンネルごとのフルレンダリングを省けます。ファイル名末尾の_midiまたは_origでレンダー元を区別します。
SoundFont、トラック設定、出力ファイル名を変更すると、生成済みのバリエーションZIPとトラック別ZIPは無効になります。変更後に再生成してください。
環境設定
ヘッダーの歯車アイコンから環境設定パネルを開けます。変更は即座に反映され、次回起動時も引き継がれます。設定項目は見た目だけを変える表示設定と、レンダリングの動作を変える動作設定の2グループに分かれています。
表示設定
外観モードで配色をシステム追従・ライト・ダークから選びます。
表示言語でWeb UIを日本語・英語・システム追従から選びます。変更するとページが再読み込みされます。環境起因のエラーメッセージ(バイナリ未検出、レンダリングのタイムアウトなど)は、この設定に関わらず日本語のままです。アプリ版のネイティブメニューバーは即座には切り替わらず、次回起動時に反映されます。
ピアノロール
- *ノートを角丸にする*・*ノートに縁取りを付ける*・*グリッド線を表示*・*鍵盤を表示* — 各要素を個別に切り替えます。
- *高さ* — ピアノロールの高さを設定します。アプリ版では常にウィンドウの高さに追随し、この設定は反映されません。
- *背景色* / *グリッド線の色* — カスタムカラーを選ぶか、テーマ既定に戻せます。
- *トラック配色* — トラックごとのノートカラーの彩度を設定します。
- *縦グリッドの分割数* — 1拍あたりの分割数です。
トラック一覧 — *ノート数が0のトラックを非表示にする*で空のトラックを一覧から除外します。
動作設定
レンダリング同時処理数でFluidSynthのトラック分割・実機チップチャンネル・バリエーション一括生成の同時実行数を設定します。自動はマシンのCPUコア数から控えめな値を自動算出します。固定値(1/2/4/8)を選ぶと上書きできます。
制限と挙動
- MIDIチャンネル10は楽器変更の対象外です。複数チャンネルにまたがるトラック(format 0 MIDIを含む)も編集できません。
- 試聴はレンダリング後に再生する方式で、ライブソフトウェアシンセではありません。完成済みレンダーはセッション内でキャッシュされます。
.m3uの曲名対応付けはベストエフォートです。古い、または対応付けできないプレイリストはエラーにせず、曲名を変えません。
コマンドラインオプション
アプリバンドル内から直接実行するか、一度だけmiditrackコマンドを作成します。
ln -s ~/Applications/miditrack.app/Contents/Resources/project/miditrack/miditrack.sh /opt/homebrew/bin/miditrack
miditrack [MIDI_FILE] [--soundfont FILE] [--port PORT] [--no-token] [--no-browser]
| オプション | 説明 |
|---|---|
MIDI_FILE |
起動時に読み込む任意の.mid/.midiファイル。音源ファイルはブラウザからアップロードします。 |
-s, --soundfont FILE |
起動時の既定SoundFont。ブラウザからいつでも変更できます。 |
-p, --port PORT |
Web UIを起動する固定ポート番号。省略時(または0)は毎回空きポートを自動選択します。 |
--no-token |
起動トークン認証を無効化します。既定では起動のたびに新しいトークンが発行され、ブラウザがそのURLからトークンをクエリ文字列から消すため、ブックマークしたURLは次回の起動では無効になります。--port固定と併用すると、URLをそのままブックマークして毎回開けるようになりますが、このMac上の他のユーザー・プロセスからも127.0.0.1経由でアクセスできてしまうため、信頼できる環境でのみ使ってください。 |
--no-browser |
ブラウザタブを自動で開きません。 |
--version |
バージョンを表示して終了します。 |
ブラウザから「アプリ」として保存して使う
これはDockアプリとは独立した、別の起動方法です。miditrackはPWAとして保存できます(Chromeの「アプリをインストール」やSafariの「Dockに追加」など)。保存したアプリのアイコンは常にhttp://127.0.0.1:<ポート>/をトークン無しで開くため、この使い方をする場合は次の3つを組み合わせてください。
--port— アプリのアイコンが毎回同じURLを開けるよう、ポート番号を固定します。--no-token— アプリ起動時はURLにトークンを付けられないため、トークン認証自体を無効化します(信頼できる環境でのみ使用してください)。--no-browser— アプリのアイコンから開く運用では通常のブラウザタブは不要なため、起動時に自動で開かないようにします。
miditrack --port 51888 --no-token --no-browser
このコマンドでサーバーを起動しておき、保存したアプリのアイコンから開いてください。Safariの「Dockに追加」で保存する場合は、「miditrack」以外の名前を付けてください——Safariは保存したアプリを上記のDockアプリと同じ~/Applications/直下に置きます。
コマンドラインツールを使う
各コンバーターには完全なリファレンスがあります。ここでは一般的な例だけを示します。
nsf2midi
nsf2midi song.nsf song.mid
nsf2midi -l song.nsf
MDF音色定義、PALタイミング、チップ音声レンダリングはnsf2midi/README.mdを参照してください。
spc2midi
spc2midi song.spc song.mid
spc2midi --sf2 song.spc song.mid
SoundFont/DLS出力とループ処理はspc2midi/README.mdを参照してください。
midi2wav.sh
./miditrack/midi2wav.sh song.mid
./miditrack/midi2wav.sh -S song.mid
./miditrack/midi2wav.sh -s MySound.sf2 -f song.mid
midi2wav.shは、レンダリング前に使わないサンプルまで読み込むことを避けるため、既定でFluidSynthのSoundFontサンプル動的読込を使います。FluidSynthの事前読込時の出力と比較する場合だけ、--no-dynamic-sample-loadingを使います。
Intel Mac向けにmiditrack.appをビルドする
Releasesページで配布しているmiditrack.zipはApple Silicon上でビルドした、Apple Silicon専用のものです。同梱のPythonバックエンド・Node.jsランタイム・ネイティブアプリランチャーはすべてApple Siliconバイナリのため、Intel Macでは起動できません。現時点でIntel版やUniversal版のリリースはありません(同梱のnsf2midi・spc2midi・VGMネイティブヘルパーはUniversalなので問題ありません——アプリ自体が対応するPython・Node.jsランタイムとランチャーが無いために起動できないだけです)。
Intel Macで今すぐmiditrackを使うには、そのMac上でmiditrack.appを自分でビルドしてください。
- Xcode Command Line Toolsが未導入なら導入します:
xcode-select --install - Homebrewと
uv(固定バージョンのPythonランタイムを組み立てるのに使用)を導入します:brew install uv - このリポジトリをクローンし、ルートからパッケージングスクリプトを実行します。
git clone https://github.com/Nihondo/miditrack.git
cd miditrack
./scripts/build_app_bundle.sh --output ~/Applications/miditrack.app
このスクリプトはホストのアーキテクチャを自動判定し(uname -m)、対応するNode.jsをダウンロードし、対応するPyInstallerバックエンドを組み立て、対応するアーキテクチャ向けにSwiftランチャーをコンパイルします——Intel Macでも--output以外の引数は不要です。
- ローカルビルドは未署名のため、初回起動はGatekeeperにブロックされます。
miditrack.appを右クリックして開くを選ぶか、システム設定 → プライバシーとセキュリティから許可してください。 - クイックスタートの手順2〜3(Homebrewの音声ツールとSoundFontの配置)に進んでください。
git pull後の再ビルドも同じコマンドで行えます。スクリプトは--outputの指定先が既に存在すると上書きを拒否するため、先に既存のmiditrack.appを削除するかリネームしてください。
トラブルシューティング
- SoundFontが見つからない:
--soundfontを指定する、MIDI2WAV_SOUNDFONTを設定する、または上記のいずれかのディレクトリへ.sf2/.sf3を配置します。 - midi2wavが見つからない:
brew install fluid-synthでFluidSynthをインストールします。 - 同梱コンバーターが見つからない: リポジトリ内の元の場所へ戻すか、
NSF2MIDI_BIN、SPC2MIDI_BIN、VGM2MIDI_BINを設定します。 - 対応するSNESドライバが見つからない: そのSPCドライバは対応するVGMTransのファミリーではないため、変換できません。
- 変換可能な音源ファイルが見つからない: アップロードまたはZIPに対応する音源ファイルが含まれていません。
- ZIPファイルが不正: アーカイブが破損しているか、ZIPではありません。
- miditrackにはFlaskが必要: クイックスタートの手順で
.venvを作り直します。 - rubberbandが見つからない: 実音声ステムへ既定値以外の速度・ピッチを適用する前に、
brew install rubberbandでインストールします。
謝辞
- NotSoFatsoは、同梱するNES/ファミコン再生コアの基盤です。
- オリジナルの
nsf2midi.exe0.14は、このmacOS再実装とMDF形式互換の着想元です。 - VGMTransは、
spc2midiが使うSNESシーケンスパーサーを提供します。 - jkarenko/vgm2midiは、
vgm2midiの上流フォークです。 - FluidSynthは、SoundFont音声をレンダリングします。
- Rubber Band Libraryは、速度・ピッチ変更後の実音声ステムを同期します。
- DSEGは、同梱する再生タイマー用Webフォントを提供します。
ライセンス
| ツール | ライセンス |
|---|---|
| miditrack | MIT |
| nsf2midi | GPL-2.0-or-later |
| spc2midi | zlib |
| vgm2midi | MIT(同梱のネイティブヘルパーvgm2midi_stemsはlibvgmを静的リンクしており、全体としてはGPL-2.0-or-laterとして扱う必要があります——詳細はvgm2midi/NOTICE.mdを参照) |
完全なライセンスと帰属は、各サブプロジェクトのREADME.md、LICENSE、NOTICE.mdを参照してください。