View on GitHub

clap-mml-render-tui

clap-mml-render-tui

clap-mml-render-tui

概要

MML TUI DAW(のようなもの)。Surge XT / Dexed / Vaporizer2 / Floe / Sforzando のリッチな音をMMLで手軽に楽しめます。Rustで書かれています。

用途

技術スタック

準備

Surge XTをinstallしてください

winget install "Surge XT"

install

cargo install --force --git https://github.com/cat2151/clap-mml-render-tui

実行

cmrt

TUI画面でMML入力して遊べます

play serverの実体

音を鳴らすのは別プロセスの play server です。実体は次の順で決まり、最初に見つかったものを使います。

  1. --play-server <PATH> で指定したフルパス(指定したものが無ければ、探索へ移らずエラーで止まります)
  2. cmrt と同じディレクトリの clap-mml-realtime-play-server
  3. 兄弟リポジトリの release ビルド(../clap-mml-play-server/target/release/

PATHは見ません。debugビルドのサーバーは先読みが4〜5倍遅く、演奏が小節の頭で途切れます。 debugビルドや素性の分からない実体を掴んでいるときは、画面の右上に警告が出ます。

cmrt --play-server "X:/projects/clap-mml-play-server/target/debug/clap-mml-realtime-play-server.exe"

対応オーディオプラグイン

AI生成ドキュメント

keyboard画面

vキーで、keyboard画面へ移動します。

chord chart画面

Ctrl+GCキーで、chord chart画面へ移動します。

1曲ぶんのコード進行の「構成」を俯瞰・編集する画面です。カーソルを動かすと、その行のコード進行が鳴ります。 h lで行内のchordを1つずつたどると、指したchordだけが鳴ります。

┌ Chord Chart ─────────────────────────────────────────────────────────────────┐
│ Key=C BPM120                                                                 │
│┌ Sections ───────────────────────┐┌ Arrangement ────────────────────────────┐│
││> 1 Intro    I-V                 ││  1 Intro    I-V                         ││
││  2 A        I-V-VIm-IV          ││  2 A        I-V-VIm-IV                  ││
││  3 B        IIm-V-I-VIm         ││> 3 A        I-V-VIm-IV                  ││
││                                 ││  4 B        IIm-V-I-VIm                 ││
│└─────────────────────────────────┘└─────────────────────────────────────────┘│
│ q:終了 ?:help                                                                │
└──────────────────────────────────────────────────────────────────────────────┘

キーバインドです。画面下段の1行にはq?しか出しません。全量は?キーで画面内に出ます。

キー pane 動作
Tab 共通 pane移動(Sections ⇔ Arrangementのトグル)
j k 共通 カーソル移動(行。移った先の行のコード進行が全部鳴ります)
h l 共通 行内のchord移動(指したchord 1つだけ鳴ります。行の端では隣の行へ繰り上がります)
PgUp PgDn 共通 カーソルを10行移動します
dd 共通 カーソル行を削除します(Sectionsで消すとArrangement上の参照も一緒に消えます)
Alt+↑ Alt+↓ 共通 カーソル行を上 / 下へ移動します
b 共通 ヘッダのKey / BPMを1行入力で書き換えます
Shift+P Space 共通 カーソル行のsectionを試聴します(鳴っていたら停止します)
? 共通 ヘルプ開閉(Escでも閉じます)
q 共通 アプリを終了します
g Sections コード進行カタログから抽選してsectionを追加します
r Sections カーソル行の進行を、名前を保ったまま抽選し直します
i Sections 進行を1行入力で編集します
n Sections 名前を1行入力で編集します
19 Arrangement その番号のsectionをカーソルの次に挿入します

編集するたびに自動保存されます。保存先は設定ディレクトリ配下の clap-mml-render-tui/history/chord_chart.json です(Windowsなら %LOCALAPPDATA%\clap-mml-render-tui\history\chord_chart.json)。保存する曲は常に1つです。 保存ファイルが無いときや読めないときは、画面を最初に開いた時点でgと同じ抽選を1回だけ行って section 1つから始めます(抽選できなければ空のままです)。

g / r の抽選に使うコード進行カタログはネットワークから取得します。キャッシュがまだ無い初回だけ 待たされます(待ち時間は log.txt の chord-chart: event=catalog-first-load elapsed_ms=... に残ります)。取得できていないときは 画面下段に「コード進行データがありません」と出ます。

設定

初回起動時に config.toml が自動作成されます。場所はOS標準の設定ディレクトリ配下です。

TUI / DAW の NORMAL モードで e を押すと config.toml を editor で開きます。editor を閉じた後はアプリを再起動します。

現在の設定例です。

# 【必須】使用する CLAP プラグイン
plugin_path = 'C:\Program Files\Common Files\CLAP\Surge Synth Team\Surge XT.clap'

# config.toml を開く editor 候補(左から順に試す)
editors = ["fresh", "zed", "code", "edit", "nano", "vim"]

input_midi  = "input.mid"

# output_midi, output_wav は自動的に設定ディレクトリ配下の
# clap-mml-render-tui/phrase/ または clap-mml-render-tui/daw/ に保存されます。
# 以下の値は内部的に使用されます。
output_midi = "output.mid"
output_wav  = "output.wav"

sample_rate = 48000
buffer_size = 512

# DAW のオフラインレンダリング同時実行数(1〜16)
offline_render_workers = 2

# オフラインレンダリング backend
# in_process: cmrt 本体プロセス内でレンダリングします。
# render_server: render-server 子プロセスへ POST /render してレンダリングします。
offline_render_backend = "in_process"
offline_render_server_workers = 4
offline_render_server_port = 62153
offline_render_server_command = ""

# リアルタイム再生 backend
realtime_audio_backend = "in_process"
realtime_play_server_port = 62154

# 起動時に自動再生するかどうか
# notepad モード: 現在行を即座に再生します。DAW モード: 曲先頭(measure 0)から演奏開始します。
autoplay_on_startup = true

# WAV ループブラウザーの検索対象ディレクトリ一覧
loop_dirs = []

# WAV ループディレクトリへ付与できるカテゴリ一覧
loop_categories = ["guitar", "drum", "bass", "spoken", "sequence"]

# Surge XT の標準値を変える場合だけ書く
[plugins."Surge XT"]
patches_dirs = [
  'C:\ProgramData\Surge XT\patches_factory',
  'C:\ProgramData\Surge XT\patches_3rdparty',
]

設定項目は次のとおりです。

項目 既定値 説明
plugins."Surge XT".plugin_path OSごとの Surge XT CLAP 標準パス Surge XT を標準外の場所へ入れた場合のパスです。
editors ["fresh", "zed", "code", "edit", "nano", "vim"] 左から順に試す editor 候補です。
input_midi input.mid 内部処理用の入力MIDIファイル名です。
output_midi output.mid 内部処理用の出力MIDIファイル名です。
output_wav output.wav 内部処理用の出力WAVファイル名です。
sample_rate 48000 レンダリング時のサンプルレートです。
buffer_size 512 レンダリング時のバッファサイズです。
offline_render_workers 2 in_process のレンダリング同時実行数です。
offline_render_backend in_process オフラインレンダリングの実行先です。
offline_render_server_workers 4 render_server の同時実行数です。
offline_render_server_port 62153 render_server の localhost port です。
offline_render_server_command 空文字 render_server の起動コマンドです。
realtime_audio_backend in_process リアルタイム再生の実行先です。
realtime_play_server_port 62154 play_server の localhost port です。
autoplay_on_startup true 起動直後に自動再生するかどうかです。
plugins."Surge XT".patches_dirs OSごとの Surge XT patches 標準ディレクトリ Surge XT の音色選択で検索するディレクトリ一覧です。
loop_dirs [] WAV ループブラウザーで検索するディレクトリ一覧です。変更後は cmrt scan-loops を実行します。
loop_categories ["guitar", "drum", "bass", "spoken", "sequence"] loop dirへ割り当てるカテゴリ一覧です。カテゴリoverlayのキーはカテゴリ名中の未使用英字から決まります。

OS別の plugin_path 既定値は次のとおりです。

OS別の patches_dirs 既定値は次のとおりです。

固定の既定プラグインと複数プラグイン

音色を指定していない行が鳴る既定プラグインは Surge XT 固定です。active_plugin による切り替えはありません。Dexed など他のプラグインは [plugins.<名前>] から混在カタログへ追加され、音色を明示した行で使われます。

組み込みプロファイルの中身は次のとおりで、パスは OS ごとの標準インストール先です。

名前 plugin_id patches_dirs 用途別カテゴリ
Surge XT org.surge-synth-team.surge-xt 上の表の OS 別既定値 Surge XT のカテゴリ名
Dexed com.digital-suburban.dexed Dexed の cartridge 置き場(Windows: %APPDATA%\DigitalSuburban\Dexed\Cartridges 全て空(=絞らない)
Vaporizer2 com.vastdynamics.VAST2 既定値なし。patches_dirs を書いてください Vaporizer2 のカテゴリ名(Pad / Bass / Arpeggio など)

名前は大文字小文字・空白・アンダースコアの違いを無視して照合します(Dexed / dexedSurge XT / surge_xt / SurgeXT はすべて同じ)。

標準以外の場所に入れている場合、音色置き場を補う場合、または組み込みに無いプラグインを使う場合だけ [plugins.<名前>] を書きます。書いた項目だけが組み込みの値を上書きするので、Surge XT のパスを変えたいだけなら、その table 内の plugin_path 1行で足ります。

# パスだけ差し替える。plugin_id と patches_dirs は組み込みの値のまま。
[plugins."Surge XT"]
plugin_path = 'D:\my\clap\Surge XT.clap'

# 組み込みに無いプラグインは全部書く。
[plugins.my_synth]
plugin_path  = 'D:\my\clap\MySynth.clap'
patches_dirs = ['D:\my\patches']
項目 説明
plugins.<名前>.plugin_path そのプラグインのパスです。
plugins.<名前>.plugin_id 期待する CLAP plugin ID です。省略できます。
plugins.<名前>.patches_dirs そのプラグインの音色置き場です。組み込みの値を消したいときは patches_dirs = [] と書きます。
plugins.<名前>.<用途>_patch_categories / <役>_patch_keywords 用途別 patch 自動選択の絞り込みです。7 つのキー名(chord_patch_categories / bass_patch_categories / arpeggio_patch_categories / drum_patch_categories / kick_patch_keywords / snare_patch_keywords / hihat_patch_keywords)を書けます。書いた項目だけがそのプラグインのときに効きます。書かなければそのプラグインの既定値(Surge XT はカテゴリ名、それ以外は「絞らない」)が使われます。
[plugins.Vaporizer2]
patches_dirs = ['D:\Vaporizer2\Presets']

offline_render_backend = "render_server" にすると、TUI側はCLAPプラグインを直接ロードせず、127.0.0.1:<offline_render_server_port>/render にMMLを送ってWAVを受け取ります。render-serverへの接続に失敗した場合、cmrtは子プロセスを起動し、通信エラー時は一度だけ再起動して再試行します。

updateコマンド

cmrt update

serverモード

cmrt --server

CLIモード

cmrt cde
cmrt CM7

patch-rolesコマンド

cmrt patch-roles
cmrt patch-roles --config C:\tmp\try.toml

render-mmlコマンド

cmrt render-mml --patch "AR Accent Arp.vvp"
cmrt render-mml --config C:\tmp\try.toml --out-dir C:\tmp\wav --patch "PD Juno Dream Pad.vvp" --poly-check

破壊的変更

今後

コンセプトのメモ

スコープ外