Slide 1

Slide 1 text

MML to MIDI 2.0 to DAW @Music LT vol. 1

Slide 2

Slide 2 text

What is this LT about? MML(c4e4g4>c4+1みたいな文字列)を MIDI 2.0データにコンパイルして、 それをDAWの楽曲データに変換するツールを 作っているので、その知見を紹介します。

Slide 3

Slide 3 text

MML in 2021? 今は特定分野(チップチューンとか)でしか 使われていない 今はDAWでVSTやAUを使う MMLだとせいぜいMIDIまで でも本来「どう打ち込むか」は「ジャンル」や 「音源の制約」とは関係ないはず テキストで編集したい

Slide 4

Slide 4 text

課題 ● MIDIの範囲ではショボくない…? ○ GM音色しか使えない…? ○ 7bitしかないパラメーターが … ○ パラメーター(コントロールチェンジ)の種類が … ● オーディオプラグインをどうやって使う? ○ プラグインを識別してトラックごとに指定する必要がある ○ パラメーターを(オートメーションや MIDIマッピングみたいに)操作できる必要がある ○ プラグインの状態を保存しておいて復元できる必要がある

Slide 5

Slide 5 text

MIDI 2.0 UMP ● MIDI 2.0仕様のひとつとして2020年に標準化 ● 16チャンネル * 16グループ = 256チャンネルになった ● 主にVSTやAUの機能としてサポートされているものがいろいろ増えた ○ 32ビットCC/ピッチベンド/プレッシャー ○ 16ビットのベロシティ ○ ノート別ピッチベンドやノート別コントローラー ○ ノートの属性(アーティキュレーションなど)

Slide 6

Slide 6 text

MML in 2021 ! ( [MML] → [MIDI 2.0 file] ) + [プラグイン定義] → [DAW(Tracktion) file] プラグイン定義には JUCE AudioPluginHostを 流用

Slide 7

Slide 7 text

MIDI 2.0対応MMLコンパイラ (atsushieno/mugene-ng) ● MMLコンパイラ = テキストからバイトストリームを生成するだけのツール(!) ● マクロを定義でき、ほとんどのMML命令はマクロで実装している。 __MIDI { #90 + $channel, $key, $vel } ● MIDI 2.0 UMP対応もただのバイト配列を生成するだけ __MIDI_NG { #40 + $channel / 16, #90 + $channel % 16, $key, 0, $vel / #100, $vel % #100, $attr / #100, $attr % #100 } ( [MML] → [MIDI 2.0 file] ) + [プラグイン定義] → [DAW(Tracktion) file]

Slide 8

Slide 8 text

Tracktion Engine / Waveform DAWへ (atsushieno/augene-ng) ● DAWは再生系がOSSなTracktion Waveformのみサポート(楽曲はXML) ● TracktionにMIDI 2インポート機能は(当然)無いのでここを自作 ● AudioPluginHostで作った定義を楽器名メタイベントでトラックと関連付け ● プラグインパラメーターを操作する ○ DAW側 (Tracktion): 「オートメーショントラック」に出力する ○ MIDI側: パラメーター設定はシステムエクスクルーシブで CCのように指定 ( [MML] → [MIDI 2.0 file] ) + [プラグイン定義] → [DAW(Tracktion) file]

Slide 9

Slide 9 text

作り込んだところ ● 編集中に何度も再生する場合はMIDI クリップだけを差し替える "Hot Reload" 機能 (プレイヤー) ● 制作環境に依存せずCI環境でMP3を レンダリングできることを実証 ● ちゃんとしたサンプル楽曲MML (atsushieno/augene-ng-production)

Slide 10

Slide 10 text

おまけ: MIDI 2.0 development libraries まだほとんど無い ● Apple CoreMIDI: Swift, ObjC, C++ (たぶん) ● juce-framework/JUCE (juce::universal_midi_packets): C++ ● atsushieno/ktmidi : Kotlin (Multiplatform) ● atsushieno/cmidi2 : header-only C