DAW悪戦苦闘記

DAWやMIDIを通じてちまちまとDTMを楽しむ記録+MIDI検定1級到達記

PythonでSMFを操作する (3) セットアップデータ挿入

前回の続き(注: かなりマニアックです)。前準備は済んでいるものとする。

daw-jones.hatenablog.com

セットアップデータの生成

セットアップ用のデータは、コントロール・チェンジとプログラム・チェンジを組み合わせた一連のメッセージ・リストとして定義できる。

前回同様に、midoパッケージのMessageメソッドで個々のメッセージ・オブジェクトを生成し、それをリストとして繋げればよい。下例では、リスト化した一連のメッセージを変数setup_msgに格納している*1。中身は、協会テンプレでお馴染みのセットアップ・データそのままであるが*2、説明せずともほとんど自明だと思う。

# セットアップ用データのメッセージ・リスト定義
setup_msg = [Message('control_change', channel=0, control=0, value=121, time=480),
             Message('control_change', channel=0, control=32, value=0, time=10),
             Message('control_change', channel=0, control=0, value=0, time=10),
             Message('control_change', channel=0, control=32, value=4, time=0),
             Message('program_change', channel=0, program=68, time=0),
             Message('control_change', channel=0, control=7, value=102, time=10),
             Message('control_change', channel=0, control=10, value=64, time=10),
             Message('control_change', channel=0, control=11, value=127, time=10),
             Message('control_change', channel=0, control=91, value=58, time=10),
             Message('control_change', channel=0, control=93, value=0, time=10),
             Message('control_change', channel=0, control=101, value=0, time=10),
             Message('control_change', channel=0, control=100, value=0, time=10),
             Message('control_change', channel=0, control=6, value=2, time=10),
             Message('control_change', channel=0, control=101, value=127, time=10),
             Message('control_change', channel=0, control=100, value=127, time=10)]

該当トラックへのセットアップデータの挿入

あとは上で作ったメッセージの塊をトラック・オブジェクト(メッセージのリスト)の所定の位置に挿入するだけである。前回のSysExメッセージ挿入後であれば、メタメッセージ2件とあわせて、先頭から3件飛ばした位置に差し込むことになる。これは単なるリスト操作に過ぎない。

# セットアップ・データを所定位置に挿入する
track1[3:3] = setup_msg

挿入後のトラック冒頭は以下のような結果となる。

f:id:daw_jones:20170716161637p:plain

実はこのセットアップ・データの挿入に伴って一番最初のノートオン・メッセージのデルタタイムを修正する必要がある。なぜなら、セットアップ・データの送信時間だけタイミングがズレてしまうからである。これについては、次回詳述する。

*1:実際にはプログラム・チェンジなどの値は各トラックに応じて変更する。なお、プログラム・チェンジの値はゼロ・ベース(0〜127のレンジ)に変換する必要がある。

*2:本例はメロディ・トラック用のもの。リズム用トラックの場合は、一番先頭のバンクセレクトMSBの値を"120"とし、末尾5行のベンド・レンジ設定部分を省く。また本例では、DominoでSMF保存した際に追加された余計なバンクセレクトMSB/LSB(頭から3行目および4行目)を付けたままだが、本来は不要である。これについては後日補足する。