Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
MML to MIDI 2.0 to DAW
Atsushi Eno
December 14, 2021
Technology
1
1.1k
MML to MIDI 2.0 to DAW
at Music LT@1
https://iotlt.connpass.com/event/224144/
Atsushi Eno
December 14, 2021
Tweet
Share
More Decks by Atsushi Eno
See All by Atsushi Eno
Designing Audio Plugin Framework for Android
atsushieno
1
880
about: Music Tech Meetup
atsushieno
0
39
create music in 199x language for 2019 sequencer
atsushieno
0
150
[COSCUP2018] Language Server Protocol explained
atsushieno
1
1.8k
Xamarin最新情報2018 / what's up in Xamarin 2018 (JP)
atsushieno
3
2.8k
Embeddinator-4000: using .NET libraries in Android Studio
atsushieno
1
2.2k
.NET Fringe Japan 2018新年会short talk
atsushieno
0
170
Java Binding Tips and Tricks 2017
atsushieno
0
320
Embeddinator-4000から学ぶXamarinの基礎
atsushieno
1
6.4k
Other Decks in Technology
See All in Technology
Power BI Premiumでデータ準備!
hanaseleb
1
170
成長を続ける組織でのSRE戦略:プレモーテムによる信頼性の認識共有 SRE Next 2022
niwatakeru
7
1.7k
Steps toward self-service operations in eureka
fukubaka0825
0
320
OSINT/GEOINT ワークショップ 20220514 古橋資料
furuhashilab
1
180
CADDi HCMC Technology Center
caddi_eng
0
150
220428event_karibe_part
caddi_eng
0
180
実験!カオスエンジニアリング / How to Chaos Engineering
oracle4engineer
PRO
0
110
技術広報の役割を定義してみた 2022年春
afroscript
3
2.2k
エンジニアインターンの採用〜実際の開発への関与について for EM meetup#10
dmiyamoto
1
250
mROS 2のススメ
takasehideki
0
280
ITエンジニアを取り巻く環境とキャリアパス / A career path for Japanese IT engineers
takatama
0
500
msal.jsのあれこれ
takas0522
0
1.2k
Featured
See All Featured
Infographics Made Easy
chrislema
233
17k
Pencils Down: Stop Designing & Start Developing
hursman
112
9.8k
How to train your dragon (web standard)
notwaldorf
57
3.8k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
236
1M
Faster Mobile Websites
deanohume
294
28k
No one is an island. Learnings from fostering a developers community.
thoeni
9
1.1k
Designing for humans not robots
tammielis
241
23k
The MySQL Ecosystem @ GitHub 2015
samlambert
238
11k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
237
19k
How GitHub (no longer) Works
holman
296
140k
Practical Orchestrator
shlominoach
178
8.6k
Mobile First: as difficult as doing things right
swwweet
212
7.5k
Transcript
MML to MIDI 2.0 to DAW @Music LT vol. 1
What is this LT about? MML(c4e4g4>c4+1みたいな文字列)を MIDI 2.0データにコンパイルして、 それをDAWの楽曲データに変換するツールを 作っているので、その知見を紹介します。
MML in 2021? 今は特定分野(チップチューンとか)でしか 使われていない 今はDAWでVSTやAUを使う MMLだとせいぜいMIDIまで でも本来「どう打ち込むか」は「ジャンル」や 「音源の制約」とは関係ないはず テキストで編集したい
課題 • MIDIの範囲ではショボくない…? ◦ GM音色しか使えない…? ◦ 7bitしかないパラメーターが … ◦ パラメーター(コントロールチェンジ)の種類が
… • オーディオプラグインをどうやって使う? ◦ プラグインを識別してトラックごとに指定する必要がある ◦ パラメーターを(オートメーションや MIDIマッピングみたいに)操作できる必要がある ◦ プラグインの状態を保存しておいて復元できる必要がある
MIDI 2.0 UMP • MIDI 2.0仕様のひとつとして2020年に標準化 • 16チャンネル * 16グループ
= 256チャンネルになった • 主にVSTやAUの機能としてサポートされているものがいろいろ増えた ◦ 32ビットCC/ピッチベンド/プレッシャー ◦ 16ビットのベロシティ ◦ ノート別ピッチベンドやノート別コントローラー ◦ ノートの属性(アーティキュレーションなど)
MML in 2021 ! ( [MML] → [MIDI 2.0 file]
) + [プラグイン定義] → [DAW(Tracktion) file] プラグイン定義には JUCE AudioPluginHostを 流用
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]
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]
作り込んだところ • 編集中に何度も再生する場合はMIDI クリップだけを差し替える "Hot Reload" 機能 (プレイヤー) • 制作環境に依存せずCI環境でMP3を
レンダリングできることを実証 • ちゃんとしたサンプル楽曲MML (atsushieno/augene-ng-production)
おまけ: 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