DAW悪戦苦闘記

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

自動作曲の探求 - ざっくりと3方策

MIDI検定の受験対策ばかりでは同じようなネタの繰り返しで飽きてしまうので、夏休みの自由課題研究というわけではないが少し趣向を変え、8月末あたりまで当面は自動作曲ツールについていろいろと集中的に探求しようと思う。

興味の動機

私のような素人かつDTM/DAW初級者がまったく白紙のキャンバスから一曲作り上げるのは非常に困難な上に下手すると苦痛ですらある。過去記事でも書いたように、コード進行理論を援用するという手もあるが、初級者だとコード進行だけではなかなか発想の喚起に繋がらず、正直言ってこの手法は結構上級レベルではないかと思う(私も何回か試してみた結果)。

となると、ある程度お膳立てされているリミックスが初級者には一番ふさわしい題材だとも言えるが、現状リミックスはクラブ・ミュージックがほぼ100%を占め、様式美というか暗黙の御作法みたいな縛りもあって、さすがにこればっかりではマンネリに陥りやすい。

そこで、完全自作とリミックスの中間みたいな塩梅のモチーフ生成手段として、自動作曲ツールに依拠するのも悪くはないか、と思った次第である。

自動作曲支援ツールの種類

ざっと調べてみたところ、私の勝手な理解では、ユーザの立場から見て概ね以下の3種に分類できると思う。

Webサービスやアプリの形態でお手軽にすぐ利用できるもの

これはユーザ側の知識や技量を前提としないタイプが多く、一番取っ付きやすい。有償のみならず無償で使えるものも少なくない。個人的に一番気になっているのはJukedeckであろうか。まだ全然試してはいないが、案の定機械学習モデルがベースとなっており、比較的クオリティが高そうである(制限付きで無償利用可能)。追って試用レポートを書く予定。これ以外にもいくつか試用候補はある。

www.jukedeck.com

 

お手軽アプリであれば、おそらく最も有名なのはカシオの Chordana Composer (iOSアプリ)だろうと思う。実は私もすでにiPadに入れていて何回か使用したことはあるが、今までまったく本気で使ってはいなかった代物である。

機能概要を見ると、創作曲のMIDIデータもメール送信できるらしく(今初めて気づいた)、この辺はもう少し深掘りして試用レポートを書こうかと思う。MIDIデータを Studio One や Tracktion に取り込んで加工編集すれば面白いことができそうだ。

ユーザによるプログラミングを要求するもの

今はニューラルネットを応用した機械学習モデルが主流となっている分野。AI・機械学習ブームのおかげで近年になって盛り上がりを見せている。

この種のものではGoogle発のMagentaプロジェクトが代表的な存在である。ただし、この分野は当然ながらPythonなどのプログラミングが最低限できないとお手上げである。Magentaについては、上手く行くかどうかは未知数だが、後日試してみたいと思う(まさしく夏休みの自由課題研究)。

magenta.tensorflow.org

イマジネーションを掻き立てやすい変わり種のシンセや音源

上記2者とやや趣が異なるが、作曲と呼んでもいいようなモチーフを生成してくれる進化したシンセや音源といった製品も出てきているようで、以前「DTMステーション」で紹介されていた BT PHOBOS などが典型かと思う。Tracktion社が出しているBioTekとかWaverazorなどもそれに近い印象を受ける。

www.dtmstation.com

MIDI検定1級課題曲をDominoで再生

MIDI検定1級課題曲の制作では、Studio One で作成した楽曲データのSMFにセットアップ・データを付け足し、Dominoで微修正を加えて完成形のSMFを書き出す*1。2016年課題曲を例にすれば、最終的には以下のようなMIDIチャネル構成とイベントリスト(一部)が出来上がる。

f:id:daw_jones:20170724194533p:plain

セットアップ・データの追加加工処理については、Pythonを使って一括バッチ処理で対応する手順・方法などを下記シリーズ記事にて書いたので参考まで。もちろんこれは手動編集でも全然問題はない。ただし、1級はトラック数が多いゆえに非常に手間が掛かることになると思う。

daw-jones.hatenablog.com

Dominoでの微修正項目

楽曲の基本データは Studio One 側で完成させるが、SMFとしてはまだ若干不完全なところが残っており、Dominoで最後の修正・調整後に最終成果物としてのSMFを書き出して完成となる。

コントロール・チェンジ等のごく一部修正

各トラック冒頭部分のピッチベンド・チェンジ(PB)およびコントロール・チェンジ(CC)のデータについては、一部でわずかな修正を加える必要がある。

実は Studio One から書き出したSMFでは、上記セットアップ・データとは別にPB/CCの初期値設定などが1小節目に入ってくる場合があるため、これらは削除するか、または必要であれば2小節目以降に移動する。

チェック対象は、PBおよびCCの3種(CC#1 Modulation、CC#11 Expression および、稀に CC#64 Hold1)のみ、しかも各トラックとも頭の部分だけである。したがって、手作業修正でも時間を要さず、きちんと目視確認して編集する方が簡単かつ確実だと思われる*2

注意すべきは、削除・移動する場合にはセットアップ・データの一部ではないことをイベントリストで確認することである(下図CC#11 Expression の例参照)。

f:id:daw_jones:20170723202138p:plain

ボリュームとパン

Studio One でのミキサー設定を相対基準として参考にしつつ、セットアップ・データ上に適当な値を入れる。これはPythonでのバッチ処理で対応を済ませてもよい。

各トラック毎ボリュームとパンの設定値は作業レポートに記入提出する必要があるが、評価の対象には入らないようなので、あまり凝った調整はしなくてもよいと思われる。

バーブとコーラス

バーブは全トラック共通の値(40とか50とか適当に)でも特に問題なかろう。コーラスは必須というわけでもないので全トラックともにゼロ設定で別に支障はないと思う。

なお、リバーブとコーラスについては作業レポートに記入する必要はなく、またどのみち評価対象外だから適当でよい。

ベンドレンジ

特定の楽器パート(トラック)によってはPBを表現手段として使うことがあるので、その場合はベンドレンジの設定を忘れないようにする。Studio One では Presence XT の方でベンドレンジを設定するが、この設定値はSMFには書き出されない。

2016年課題曲では、バスクラリネットで1箇所だけグリッサンドに対してPBを適用しており、ベンドレンジを"5"に設定する(下記記事参照)。

daw-jones.hatenablog.com

2016年MIDI検定1級課題曲をDominoで再生

GM音源再生は2級実技演習では散々やってきたが、今回初めて1級課題曲をGM音源で再生してみた。

案の定あまりにもチープなサウンドで、特にバイオリンが酷い音色であることに絶句するしかなかったが、この再生音質は1次審査の評価対象外だから特に気にする必要はない*3

要は、発音タイミングや、オクターブ等移調後のピッチがおかしくないかどうかを中心に、MIDIデータの正否を耳でざっくりチェックできれば十分と思う。

*1:CubaseSonarなどMIDIイベントリストの表示・編集機能が充実しているDAWを使うのであれば、ここで書いているようなDominoでの後工程処理は不要である。

*2:削除すべきか移動すべきか楽曲やパートによって例外があるため、ここは敢えてPythonでのバッチ処理では対応せず。

*3:1次の審査対象はMIDIデータ(ピッチとタイミング)のみ。また2次の芸術審査についてはGM音源を使わなければよい。

PythonでSMFを操作する (7) 不要メッセージの削除とファイル保存

前回からの続きだが、PythonによるSMFの編集加工シリーズは一旦これで終了とする。ここまでの一連の操作を経た修正後のSMFをDominoに読み込み、再生してみた結果については稿を改める。

daw-jones.hatenablog.com

不要メッセージの削除

前回まで放置したままであったが、Studio One から書き出したSMFに付け足される固有のメタメッセージは特に必要ではないためSMFから削除したい(下図参照)*1

f:id:daw_jones:20170722220059p:plain

 

本例のように、こうした不要メッセージの位置が固定されているのであれば、リストのpopメソッドを使って容易にピンポイントで削除できる。ここでは2番目のメタメッセージを削除する(インデックスはゼロ・ベースなので"1"を指定)。

# 2番目のメッセージを削除する
track1.pop(1)

 

固定位置でない場合は、例えばメッセージ・タイプで特定する(msg.type == 'sequencer_specific' というような条件で絞り込む)などして消去することになろう。ただし、全メッセージを上から下までスキャンするため処理効率は悪くなる。

編集後SMFオブジェクトのファイル保存

SMFオブジェクトは、ファイル書き出し保存のためのsaveメソッドを持つ。したがって、これを呼び出すだけで書き込み完了となる。

なお、ファイル・フォーマット種別はデフォルトではSMFオブジェクトが持つtype属性をそのまま引き継ぐ*2。Studio One から書き出したSMFはタイプ1なので、通常は特に指定しなくともタイプ1を継承して保存される。

# SMFオブジェクトmidをファイル名'smf_studio1_edited.mid'に保存する
mid.save('smf_studio1_edited.mid')

*1:MIDI検定では審査対象にならないのでそのまま放置しても別に問題はない。

*2:SMFオブジェクトの属性については過去記事を参照。

PythonでSMFを操作する (6) 移調

前回の続き(注: かなりマニアックです)。操作要領はほとんど同じである。

daw-jones.hatenablog.com

ノート番号と移調

MIDIでは音程をすべて半音単位のノート番号で管理しているので、移調・転調については各メッセージのノート番号を一斉に同一インターバルで加減すればよい。

たとえば1オクターブ下げたい場合、これは12半音下げることになるので、全メッセージのノート番号を12だけ減らせばよい。

ノート番号属性の修正

デルタタイムやチャネル同様に、MIDIメッセージ(ノート・オンまたはノート・オフ)はノート番号属性を持つので、この値を加減算して修正する。 

# ノート番号をnだけ加える関数
def transpose(track, n):
    for msg in track:
        if msg.type in ['note_on', 'note_off']:
            msg.note += n 

# 上記関数を呼び出して1オクターブ(12半音)下げる
transpose(track1, -12)

比較のために、修正前のメッセージ(ノート・オンまたはノート・オフの冒頭一部)と移調修正後のそれを下に例示しておく。

f:id:daw_jones:20170722213934p:plain

f:id:daw_jones:20170722214031p:plain

PythonでSMFを操作する (5) MIDIチャネル変更

前回の続き(注: かなりマニアックです)。今回は既存メッセージのMIDIチャネルを変更するが、要領は前回のデルタタイム修正とほぼ同じである。

daw-jones.hatenablog.com

Studio One で書き出したSMFの大きな問題

Studio One (Prime版)で Presence XT を使ってMIDI打ち込み再生した楽曲をSMFに書き出した場合、すべてのトラックのMIDIチャネルが"0"のままとなる*1

どうやら Presence XT は Kontakt のようなマルチチャネル出力に対応していないようなので、音色(概ねトラックに等しい)毎に出力MIDIチャネルを変える設定はできないと見受ける(下記チュートリアル参考)。

sleepfreaks-dtm.com

一括でチャネル値を変えるには

基本的な考え方は、デルタタイムの変更と同じで、対象トラックを構成する全メッセージの中でチャネル属性を持ったものにつき、そのチャネルの値を所望の値に置き換えるだけである。下例では、track1中のチャネルを"10"(Domino表記上はチャネル11)に変更している。

# チャネル変更のための関数
def modify_channel(track, channel):
    for msg in track:
        if hasattr(msg, "channel"):
            msg.channel = channel

# 上記関数を呼び出してチャネル修正
modify_channel(track1, 10)

実行結果は、当然ながら下記の通りとなる(冒頭メッセージのみ例示)。

f:id:daw_jones:20170722204811p:plain

*1:SMFのデータ上はゼロ・ベースの0〜15レンジ。Dominoに読み込むとチャネル1となる。

PythonでSMFを操作する (4) デルタタイム修正

前回記事の続き(注: かなりマニアックです)。今回は、前回未解決であった最初のノートオン・メッセージのデルタタイム、すなわち発音タイミングをシフトして修正する。

daw-jones.hatenablog.com

データ挿入に伴うズレ

途中挿入したセットアップ・データのメッセージ総数と送信経過時間を求める。以下のような簡単な関数を定義してみる。なお、各メッセージのデルタタイムは、そのtime属性*1を参照して引っ張り出せる。下記プログラム例では、msg.timeがそれに該当する。

# セットアップ・データのメッセージ総数と経過時間を求める関数
def setup_time(setup_msg):
    n = len(setup_msg)
    delta_time = sum([msg.time for msg in setup_msg])
    return (n, delta_time)

# 実際に計算してみると
nmsg, time_to_shift = setup_time(setup_msg)
print(nmsg, time_to_shift)

実際の計算結果は、15メッセージ (nmsg) かつ600ティック (time_to_shift) 分の長さとなる。したがって、冒頭から18 (= 3*2 + 15) メッセージ目に来る最初のノートオン・メッセージ*3につき、そのデルタタイムを600ティックだけ減らす必要がある。

該当メッセージのデルタタイム修正

該当メッセージのデルタタイム値を書き換えるには、そのメッセージ・オブジェクトのtime属性値を直接修正してしまえばよい。たとえば、以下の1行で事足りる。

# 該当メッセージのデルタタイム修正
track1[3 + nmsg].time -= time_to_shift

修正後のtrack1冒頭は下例の通りとなり、タイミングが修正されたことがわかる。

f:id:daw_jones:20170716173156p:plain

このように、メッセージ・オブジェクトの属性値を修正すれば、元からあるMIDIデータを色々と自由自在に変更修正可能で、MIDIチャネルや移調なども同様のやり方で簡単に編集できる。これらについては次回以降述べる。

*1:タイムと言いつつ値はティック単位である。ティックあたりの時間分解能(μs)は、メタトラックのテンポ設定値で定義される。

*2:元からあったメタメッセージ2件に、前々回に追加挿入したSysExメッセージ1件、計3件。

*3:本例ではたまたまノートオンだが、一般的にはコントロール・チェンジやピッチベンド・チェンジなどの可能性がある。

DominoでSMF保存した場合の注意点

今になって気づいたのだが、Domino上で各トラックの音色を選択設定した後にSMF保存すると、Domino独自の余計なバンクセレクトMSB/LSBメッセージが挿入されてしまう。

MIDI検定実技では、2級と1級を問わず、レギュレーション違反で減点対象になる可能性があるので、残さずに削除しておくべきと思われる。

現象

Dominoで音色設定すると、SMFに余分なバンクセレクトMSB/LSBメッセージ2行が書き足されてしまう。DominoからSMFとして書き出したものを再度Dominoに読み込んでみると確認できる(下図参照)。

f:id:daw_jones:20170717140505p:plain

対策 (1)

この不要メッセージは手動で削除した上で、SMFとして再保存する。多少手間が掛かってしまうが、三度再読み込みして不要メッセージが消去されたかどうか最終確認した方がよいだろう。2級2次試験の楽曲はトラック数が少ないので、このような手動対応でも全然問題ないと思う。

なお、この余計なバンクセレクトMSB/LSBがなくても指定音色(プログラム・チェンジ)によるDominoでの再生は可能である。

対策 (2)

2級にせよ1級にせよ、プログラム・チェンジを含めたシステム・セットアップデータはDominoで再生確認する前に、別途Dominoを使わずに追加する。すなわち、Studio One からベースとなるMIDIデータを書き出したSMFに、Pythonによるバッチ処理でセットアップデータを丸ごと書き込んでしまう。この場合は、Dominoで音色を選択操作する必要が一切ないため、Domino独自のバンクセレクト・メッセージが書き足されずに済む。

トラック数が非常に多い1級楽曲に関しては、このやり方でないと対応が難しいと思う。

確認作業

最終成果物としてのSMFは、再度Dominoに読み込んで、上記のような不要なメッセージが残存していないかどうか検証した方が安心である。念には念を入れるのであれば、さらにPythonのmidoパッケージを使い、SMFの各トラック冒頭部分を目視チェックするとより確実であろう(下記記事参照)*1

daw-jones.hatenablog.com

*1:むろんこれはPythonプログラミングができる人限定。MIDIのイベントリストを閲覧チェックできるDAWであればそれで十分であろう。