DAW悪戦苦闘記

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

PythonでSMFを操作する (1) 下準備と読み込み

今回より、少々マニアックにはなるが、PythonによるSMFの加工編集処理について何度かに分けて(五月雨式に)書いていく。なんでそんなことするの?、という根拠については以下に記す。なお最初に断っておくが、以下の話はあくまでMIDI検定実技対策上の要請であり、自主制作では一切必要ない。

今回は、使用するパッケージの紹介と、それを使ったSMFの中身の確認までをやってみる。

Pythonで自動処理する目的

Studio One から書き出したSMFは、そのままではSysExメッセージとセットアップ・データが書かれていないので*1、DominoなどのMIDI専用エディター兼シーケンサーなどを使って追加編集する必要がある。もちろん、ここまで機能対応しているDAWであれば、わざわざDominoに取り込まずとも自己完結することは言うまでもない。

問題は、1級の場合、トラック(楽器パート)の数が多いので、Domino上での手動によるコピーや編集が非常に面倒くさい、ということである。また繰り返し作業が多いということは、ミスを誘発する可能性もそれだけ高まる懸念がある。

なので、セットアップ・データの追加部分については、Pythonによる定型バッチ処理で対応して効率化を図りたい。そうすると、Dominoでの追加編集はボリュームやパンの微調整ぐらいで済む。

使用するパッケージ

PythonMIDIデータを読み書きするためのパッケージとしては、今現在は pretty_midi が主流であり、また一番使いやすいAPIだと思われる(3系対応)。

実はpretty_midiのベースはmidoパッケージらしく、SysExメッセージの追加挿入といったpretty_midiでは扱えない一部特殊な処理に関してはmidoを直接使わないと対応できない。

実際に試してみるとわかるが、midoパッケージ自体シンプルなデータ構造とAPIなので、MIDI検定3級以上の知識があれば難なく使いこなせる。なので、ここではすべてmidoパッケージを直接使ってみることにする。

さしあたりは、以下の2つのクラスしか使わないため、midoパッケージよりインポートしておく。

from mido import MidiFile, Message

SMFの中身を覗いてみる

試しにサンプルとして2級2次試験の2017年2月期練習曲No.1で制作したSMFを俎上に乗せる。

Studio One から書き出した直後のSMF

何度か繰り返し使うことになるので、各トラック内の全メッセージ内訳表示と、SMF全体の中身の表示させる関数を定義する。

# 各トラック毎の全メッセージを表示する
def dump_track(track_obj):
    for msg in track_obj:
        print(msg)

# 全トラックの全メッセージをトラック毎に表示する
def dump_smf(midi_obj):
    for i, track in enumerate(midi_obj.tracks):
        print(f"Track {i}: {track.name}")
        dump_track(track)

トラック・オブジェクトは、実態としてはMIDIメッセージのリスト構造になっているので、Pythonの通常のリスト操作をそのまま使うことで簡単に編集加工できる。

上記の定義関数を呼び出して、まずは Studio One から書き出したSMFの中身を見てみるとする。

# Studio One から書き出したSMFを mid に読み込む
mid = MidiFile('smf_studio1.mid')
dump_smf(mid)

これを実行すると、以下のような感じに表示される(jupyter notebook  上での実行結果):

f:id:daw_jones:20170704144229p:plain

ほとんど自明で逐一説明を要しないと思うが、上図はメタイベント・トラックと、オーボエの楽器パートを割り当てているトラック1の冒頭9行までを表示した。注目すべき点としては、

  • メタイベント*2のテンポ値は1拍の長さ(本例では4分音符一つ)をμs(マイクロ秒)単位で表示している。BPMに変換すると、60s/(638298μs/1000000) = 94 となり、BPM = 94 であることがわかる(実際にはこれとは逆方向に変換している)。
  • メタイベントには拍子データ(Time Signature)も書かれている。本例では4/4である。曲中で何度か拍子を変えると、変化するタイミング(Time値)とともにそのデータもすべてここに書かれる*3
  • メタイベント以外の各トラック冒頭2行目には Studio One 固有のメタメッセージ1件が書かれているが、これは特に必要というわけではなく、Dominoに取り込む前に消去してしまっても構わない。
  • トラックの冒頭部分には、SysExメッセージやコントロール・チェンジといったセットアップ・データがまだ何も付け足されていないことがわかる。
  • ノートオン/オフの各メッセージ末尾に書かれているTime値はいわゆるデルタタイムであり、直前メッセージからの送信間隔を示す。実はここではティック単位になっている(ので確認しやすい)。MIDIメッセージが小節の概念を持っていないことがわかると思う。

Dominoで編集後に書き出したSMF

同様に、Dominoで編集した最終成果物としてのSMFの中身を確認してみる。

# Dominoから書き出したSMFを mid2 に読み込む
mid2 = MidiFile('etude_2017-1.mid')
dump_smf(mid2)

これを実行すると、以下のような感じに表示される(メタイベントは上とほぼ同じなので省略):

f:id:daw_jones:20170704153536p:plain

上の Studio One から吐き出したSMFと見比べてみると色々と興味深い。上図で示したように、2級実技用のテンプレでお馴染みのセットアップ・データが付加されている。また、トラック1については冒頭にSysExメッセージも付く(データは10進表記)。目標としては、これら定型の付加データを全トラックについてPythonで追加処理したい、ということである。

ヘッダー情報はどこに

以上はすべてトラック・チャンクに関わるデータであるが、ヘッダー・チャンクの主要データを確認したい場合は、SMFを取り込んだオブジェクトの属性一覧を見ればよい。

# SMFオブジェクトの属性には何が含まれるか確認する
mid.__dict__

すると、以下のように辞書形式で属性一覧が表示される:

f:id:daw_jones:20170704162943p:plain

上図で明らかなように、Studio One から書き出したSMFの分解能は TPQN = 480 であることがわかる。

次は何をやるか

初回なので思ってた以上に長くなってしまったが、次回からはワンポイント・メモのような形でもう少し手短にまとめていきたい。

次はまず一番簡単なところから着手するとして、SysExメッセージの追記をやってみるとする。

*1:私が知らないだけであって、セットアップ・データ等を付加する方法はあるのかもしれない。しかし、たとえ書けたとしても、Studio One はMIDIのイベントリスト表示機能がないため、検証チェックと確認が難しいと思う。

*2:詳しくは、メタイベント一覧表などを参照。

*3:変拍子については、次の過去記事参照: 譜面解釈とMIDI表現 (2) 変拍子の対応 (Studio One)

譜面解釈とMIDI表現 (2) 変拍子の対応 (Studio One)

MIDI検定1級課題曲では変拍子は当たり前のように頻出しており、たとえば昨年の2016年課題曲では、43小節目の1小節だけ4/4から6/4に拍子が変わっている*1

因みに2級実技では、転調は2016年2月期の練習曲で1曲盛り込まれているが、変拍子については私が知る限りまだ出題されていないようである(下記の過去記事参照)。

daw-jones.hatenablog.com

 

Studio One で打ち込む場合の変拍子対応法はいたって簡単で、タイムライン上で拍子を変更したい小節の開始位置にカーソルを移動させ、右クリックでコンテキスト・メニューから Insert Time Signature を選ぶ。

f:id:daw_jones:20170702132034p:plain

その後に下図のような拍子入力ウィンドウで分子分母の値を修正入力すれば、指定の変拍子が挿入され、それにしたがって1小節あたりの拍子グリッド(縦線)の数も変わる。

f:id:daw_jones:20170702132146p:plain

f:id:daw_jones:20170702132450p:plain

 

変拍子は当然ながら書き出したSMFにも反映され、Dominoで取り込むと下例のようにメタイベント(Conductorトラック)で確認できる。なお、譜面のリハーサルマークやページ記録のために Studio One 内で付記したマーカーもこのメタイベントの中に書き出されるようであるが、MIDI検定では審査対象外なのでそのままの状態で問題ない。

f:id:daw_jones:20170702165406p:plain

*1:これは全然大したことない部類。変拍子については、2012年課題曲が非常に大掛かりな応用作品となっているようである。

譜面解釈とMIDI表現 (1) ハープのアルペジオ

今回から何度かに分けて(一気連続せずに五月雨式になるが)、MIDI検定1級課題曲における上級レベルの譜面解釈とそのMIDIデータによる再現方法に関し、1回1トピック限定で備忘録というか事典みたいな感じでまとめていきたいと思う。当然ながら、今までにやった2級実技演習ではまだ遭遇していないものを中心に取り上げて行く。

今回は、ハープのアルペジオ奏法について。

譜面上は、下例のように和音構成音の左側に波線が追記される。アルペジオ自体はハープに限った奏法ではなく、例えばピアノやギターなどでもほぼ同様の対応となるが、ギターについては譜面の書き方が下例と異なる場合がある(和音形式ではなく発音順に音をバラして記譜することが多いようだ)。詳しくは、公式ガイドブックの p.228 を参照。

f:id:daw_jones:20170629192046p:plain

 

上例記譜法の場合、特に指定がない限りは、下の音から順番に上の音を重ねる。重ねて行く速さは任意だが、32分音符で重ねれば問題ないだろうと思う。上例のように、低音部と高音部にまたがって波線が引かれている場合は、両者一体のコードとみなし、低域のアルペジオと高域のそれを切らないで連結して弾く。下図は、Studio One での打ち込み例である(縦線グリッドは32分音符単位)。

f:id:daw_jones:20170630192411p:plain

 

なお、アルペジオの一般的な記譜法とその演奏展開法については、下記サイトの「アルペッジョ」の項を参照(楽典.comは他装飾音などについても今後何回か参照する)。

楽典:装飾音

オーケストラと定位設定

MIDI検定1級の2016年課題曲のようなオーケストラ曲を制作する場合、各楽器パートの定位(パンポット)をどう設定するか、は一つの大きな課題となる。

常識的には、オーケストラの通例の配置パターン*1に合わせるのが無難だろうと思う。ちょっと聴いた感じでは、これだけでも割と本物っぽい印象を与える*2。たとえばコンサート・ホールで聴いているような効果を狙うのであればこれでよいと思う。

ただ、実際はどうもそう単純でもないらしく、クラシック曲レコーディングのミックスダウンでは必ずしもオーケストラの編成配置通りにパンを振っているわけではないそうである。要は配置通りにした場合、一部楽器同士で音色や周波数領域が被って音が埋没してしまう懸念があるということ。これについては下記記事を参照:

musicmaterial.jpn.org

 

正直このあたりは正解が特にあるわけでもないため、最後は自分の耳を頼りに確認調整するしかない。各楽曲に合わせて表現者の解釈は様々あってしかるべきなので、あくまで参考基準として知っておけばよいということだろう。

自分なりの結論としては、一応はオーケストラの配置パターンを出発点として、聴いた印象で違和感がある部分については微調整してズラす、という方策でいいと思う。

蛇足。オーケストラ曲は、本来は音楽科の専門課程でお作法をみっちり勉強しないと品質が担保されないであろうが、趣味のDTMでそこまで要求するのは荷が重過ぎるので、たとえば下記教本で最低限の常識レベルを養うのも一法かと。MIDI検定1級対策にも使えそうである。

www.stylenote.co.jp

*1:米国式(第1と第2バイオリンを左側に隣接配置)と欧州式(第1と第2バイオリンを左右両翼配置)の2種類あり、現代では前者が主流らしい。詳しくはWikipediaの記事などを参照。

*2:Studio One 3.5 Prime の内蔵音源 Presence XT を使った場合。MIDI検定1級程度の編成であれば、Prime版の音源だけでも十分間に合う。

MIDIイベントの複製共有 (Studio One)

Studio One の操作で、知ってるようで案外知らないかもしれない小技について。

編集画面では、Dキー押下で単純な複製 (Duplicate) が可能で、これはよく知られているし、私も頻繁に使う。他DAWのようにCtrlキー/Commandキーと組み合わせる必要がないため、作業効率が大きく向上し、非常に重宝する機能である。

ここでShiftキーも同時に押すと、Shift + D 押下で複製共有 (Duplicate Shared) となり、相互にMIDIデータを共有する依存関係となる。この時、共有関係となった各イベントの左下には共有マークが付く(下例参照)。

f:id:daw_jones:20170627143737p:plain

共有中のイベントをどれか一つ修正すると、同じ共有関係にある別のイベントもすべて同様に変化する。つまり親子関係にはなく、すべて対等に同期する。上例のように、イベントの配置は隣同士に連続していなくてもよい(離れた小節やトラックにまたがっていても構わない)。また、ベロシティやピッチベンド、コントロール・チェンジなどもすべて共有・同期する。

これは、同一パターン要素で構成されることが多いポピュラー曲の制作にはありがたい機能であり、頻繁な試行錯誤を繰り返す上で大変便利である。同様の機能を備える他DAWも少なくないとは思うが詳細は不明*1

ただし、複数の異なる共有関係が存在する場合、各イベント同士がどの共有依存関係で結びついているのか一瞥しただけではわからない。したがって、イベントの色分けで対応するなどの工夫が必要となり、そこだけ要注意である。

*1:Tracktion 5 の場合は、MIDIクリップをループ指定(クリップ上部の"L"アイコンを押下)して右に引き伸ばすと同期コピーできる。ただし、元のクリップと隣り合わせで連続する効果に限られる。

MIDIデータの移調方法 (再考)

以下の前回記事では、Studio One 側でMIDIデータ自体を移調編集してしまう方法を書いたが、効率的なワークフローの観点からはこれはあまり好ましくない方法だと判明したので、別法に改めたい。

daw-jones.hatenablog.com

daw-jones.hatenablog.com

Studio One では記譜通りに入力する

Studio One では記譜通りにMIDIデータを入力し、移調は再生対応とする。すなわち、下例のようにインスペクターを開き、実音に対応する Transpose の値を半音単位で各トラック毎に指定する。

f:id:daw_jones:20170626111934p:plain

 

Studio One ではMIDIデータは移調前の状態を保持して譜面に合わせ、MIDIデータ自体の移調編集はすべてDominoで一括加工する。この方法にした方がよい根拠は、以下の2点である:

  • MIDIノートのピッチとタイミングを後からチェックする際、移調後のデータだと検証が難しい。記譜通りであれば、譜面と照合して容易に確認できる。
  • 全休符を飛ばしてMIDIイベントを複数に分割して入力する場合、前回記事のように各イベント毎に移調を適用するとなると、何度も移調操作を繰り返して煩雑な上に、移調し忘れミスの恐れがある。

Dominoで一括移調する

上述のやり方で対処すると、Studio One から書き出したSMFは移調が反映されないままなので、Dominoで成果物SMFを作成する際にトラック毎に一括で移調編集する。

すなわち、移調対象のトラックを開いてMIDIノートをすべて選択後、メニューより イベント > トランスポーズ を選び、以下のような移調設定ウィンドウから操作する。

f:id:daw_jones:20170626114534p:plain

MIDIデータの移調方法 (Studio One)

以前の記事でも少し触れた通り、MIDI検定1級では様々な移調楽器への対応を迫られるため、これについて検証、確認しておく。

daw-jones.hatenablog.com

MIDIデータの移調方法

Studio One のみならず、多くのDAWでは移調対策として、

  • 再生時に自動的に移調する。MIDIデータは移調前の元の状態でよい。
  • 移調編集ツールを使ってMIDIデータそのものを移調して編集・作成する。

の2種類が用意されている。

前者の方がお手軽だが、この方法ではSMFに書き出した時に移調結果をMIDIデータに反映しない*1。したがって、すべてのMIDIイベントに対して直接トランスポーズを適用し、実際のノート・ピッチを移動させる必要がある。

具体的には、対象となるMIDIイベントをまとめて選択後、右クリックのコンテキスト・メニューより Transpose を選択して半音単位で移調させる。すると、MIDIのすべてのノート・ピッチが指定音数だけ移動することにより、移調後のMIDIデータが一括で作成される。

f:id:daw_jones:20170624223016p:plain

移調解釈が必要な楽器について

いわゆる移調楽器としては、ホルンやクラリネットなどの管楽器が典型で、譜面を見ると他のパートと調性が異なることから移調が必要だとすぐわかる。移調楽器と移調方法(記音と実音との関係)については下記Wikipediaの一覧表に詳しい。

移調楽器 - Wikipedia

上述のような移調楽器のほかに、ギターとベース(ベース系統の弦楽器なども含む)については記譜より1オクターブ下げてMIDIデータを書く必要がある。これはMIDIによる楽曲制作の慣習みたいなもので、半ば常識化しており、2級実技でさえも譜面上いちいち指定はされないので注意を要する。

1級の場合、楽曲のパートに移調楽器が含まれる際は、制作規定書に注意解説が掲載されるはずであるが、常識に任せるつもりですべての移調楽器について逐一指摘してくれるかどうかは定かでない。

たとえば、2016年課題曲にはクラリネット(Bb管)のほかに、同類のバスクラリネットが含まれるが、どういうわけかこれについての注意書きは一切ない。バスクラリネットの場合、通常のクラリネット同様に2半音下げるだけでなく、さらに1オクターブ下げる必要がある(音部記号がト音記号の時)。移調が必要なことは譜面からも自明であろうが、ベースなのでオクターブ下げるところまで対応しないといけない*2

なお、1オクターブ下げ対応は、コントラバスダブルベース)でも必要であるが、これについても制作規定書には特に注記はなかった。

*1:Studio One (Prime版) の場合。他のDAWでは反映させるためのオプションなどがあるかもしれない。

*2:これに限らずオクターブ調整を失念してしまうと1次審査通過は困難になるので神経を使う所である。