bonar note

京都のエンジニア bonar の技術的なことや技術的でない日常のブログです。

App::Randomizr - perl+pmmlで半自動作曲

先日 iTunes Store に出した楽曲「Saitama Life」を作成するためにちょっとしたスクリプトを書きまた。GarageBandで曲を作る際に、1から音楽を作るのは僕には難しかったし面倒なので、コード進行を指定してそのコード進行の中でランダムに音を選んでそれっぽくする、というものです。
#これは一般的にはアルペジエータ(?)という呼ぶみたいです。

手順的には、

  1. スクリプトで条件を指定してMML文書を作成
  2. それを pmml で midi ファイルに変換
  3. 生成された midi ファイルを GarageBand にドラッグ

といった感じですね。曲全体を作る訳ではなく、曲の「パーツ」を作る、っていう部分が他のアプリケーションとちょっと違うかもです。

特に何かすごい部分があるわけではなく自分用に作ったもので汚いかもですが、せっかくなので公開したいと思います。

前提条件

このスクリプトを動作させるためには、pmmlが必要です。pmmlは会津大学の西村先生が作ったMMLインタプリタで、MML文書ファイルをmidiデータに変換することが出来ます。

オリジナルの配布元にはもう無いっぽいので、以下のURLに準備しました(pmmlはGPLでございます)。
http://bonar.jp/package/pmml-0.2p1.tar.gz

上記をインストールしてパスを通して下さい。

App::Randomizr 自体のソースはこちら。
http://bonar.jp/package/App-Randomizr-0.01.tar.gz

perl Makefile.pl && make && make test && make install な感じで入れていただければと思います。

App::Randomizr、ブロック/コード/ビート について

配布パッケージの中にある randomizr.pl に様々なオプションを渡してmidiファイルを生成するのですが、前提として randomizr が音楽データをどういうモデルで把握しているかを知る必要があります。といって実際はシンプルで、

  1. 曲データは「ブロック」の集合である
  2. ブロックは「コード」と「ビート」で構成される

の2点のみです。例えば F-C-G-A というコード進行があった場合、このそれぞれの F, C, G, A がおのおの1つの「ブロック」になります。このそれぞれのブロックがコードとビートを持っているって感じですね。コードはそのままそのブロックがどのコード進行を担当するかという情報、ビートは音が発生するタイミングの配列です。

ビートは16個の数字列で表現され、全音符であれば 1000000000000000 となります。最初の音が3和音の場合は
3000000000000000 ですね。音階を指定することは出来ません。それはコード進行を参考にランダムに決定されます。また、致命的な欠点として、今の所16よりも細かい音を表現することが出来ず、休符もありません。

randomizr.pl にコマンドラインからブロックを指定する場合、

  コード:ビート

の形式で指定します。例えば、

E:1000100101000100
Am:3000000300000100
Cm7:all1 # all1 = 1111111111111111

といった感じです。ビートは入力するのが疲れるので、いくつかの省略表記が用意されています。こちらに関しては、App/Randomizr/Block.pm の中を見て頂ければと思います。

randomizr.pl の使い方

オプションは以下になります。

RANDOMIZR(1)          User Contributed Perl Documentation         RANDOMIZR(1)

NAME
         randomizr.pl

OPTIONS
         sound setting:

         block  − block expressin (comma seperated)
         tempo  − tempo
         octav  − octav (comma seperated, ex: 3,4,5)
         inst   − instrument code (41=violin)

         (experimental) bubble − bubble step (4 or 7)

         other options:

         help     − print instrument code list
         play     − play generated midi with QuickTime (Mac OS X only)
         nodelete − not unlink generated pml(score) file

tempo は曲のテンポ、octavはランダムに音を選ぶ際にどの高さまで許容するかを指定します。midiのオクターブ指定と同様に、1〜8までの値を設定します。また、instはmidiの音色番号を指定します(デフォルトはピアノ)。音色番号は以下のサイト等を参考にすると良いかもしれません。
http://www.izmi.jp/sol/glossary/gsxg/gm.html

blockオプションには先ほどのブロック表現をカンマ区切りで入力します。F-C-G-Aを全て全音符で指定する場合は

F:1000000000000000,C:1000000000000000,G:1000000000000000,A:1000000000000000

といった感じです。ビートは 4000000000000000 がデフォルトなので、それでよければ単に

F,C,G,A

でOKです。 -play に関しては便宜上付けたオプションで、このフラグが付いているとmidiファイル生成後にQuickTimeで作った音のパーツを再生します。ただし、これはQTのパスがスクリプトの中に直書きしてあってかなり
残念な感じなので直したいです。

つらつら書いて来ましたがまったくイメージ出来ないと思うので、コマンドラインのログと出来た音声ファイルを参照しながら見て行きましょう。

どんな感じかやってみる

とりあえず A-G-E-A というコード進行でてきとうに作ってみます。

bonar$ perl randomizr.pl --block=A:1000100101000100,G:1000100101000100,E:1000100101000100,A:1000100101000100 --inst=37 --tempo=90 --octav=1,2 -play
 - b|1000100101000100| [A  ] (A C# E    )
 - b|1000100101000100| [G  ] (G B D     )
 - b|1000100101000100| [E  ] (E G# B    )
 - b|1000100101000100| [A  ] (A C# E    )
-------------
score file created - rndmzr.20071202.19930.pml

テンポは90で音色は37(slap bass)を指定しました。octavは1か2のどちらかから自動選択されます。最後に作成したファイルのパスが表示されますが、.pmlファイルはmidiファイルが作成されると同時に消されます。同じファイル名で.midiのファイルがrandomizrと同じディレクトリに作成されます。

以下のような音声が出来るはずです。

Download

今度は違う音色で。54番はコーラス音です。

bonar$ perl randomizr.pl --block=A,G,E,A --inst=54 --tempo=90 --octav=3 -play
 - b|4000000000000000| [A  ] (A C# E    )
 - b|4000000000000000| [G  ] (G B D     )
 - b|4000000000000000| [E  ] (E G# B    )
 - b|4000000000000000| [A  ] (A C# E    )
-------------
score file created - rndmzr.20071202.20185.pml

ビートを省いているので、デフォルトの 4000000000000000 が使用されます。出来た音はこんな音です。

Download

次はピアノ音2つ。all1 は 1111111111111111 なので小刻みに音が鳴ってる感じですね。

bonar$ perl randomizr.pl --block=A:all1,G:all1,E:all1,A:all1 --inst=1 --tempo=90 --octav=4,5 -play
 - b|1111111111111111| [A  ] (A C# E    )
 - b|1111111111111111| [G  ] (G B D     )
 - b|1111111111111111| [E  ] (E G# B    )
 - b|1111111111111111| [A  ] (A C# E    )
-------------
score file created - rndmzr.20071202.20352.pml

bonar$ perl randomizr.pl --block=A:all1,G:all1,E:all1,A:all1 --inst=2 --tempo=90 --octav=3,4 -play
 - b|1111111111111111| [A  ] (A C# E    )
 - b|1111111111111111| [G  ] (G B D     )
 - b|1111111111111111| [E  ] (E G# B    )
 - b|1111111111111111| [A  ] (A C# E    )
-------------
score file created - rndmzr.20071202.20455.pml

同時に聴くとこんな感じです。

Download

これらを GarageBand でまとめて同時にならしてみるとこんな感じです。

f:id:bonar:20071202043450p:image:w300

Download

まとめ

なんだか教材ビデオのBGMみたいですが、聴けないこともないですよね。以下の記事の Saitama Life もこのスクリプトで作成した音をGarageBandでeffectかけたり音色を換えたりして作りました。

iTunes Store デビューへの道(完結編)
http://d.hatena.ne.jp/bonar/20071128/1196273616

基本的にランダムに音が選択されるのでスクリプトを実行するたびにできる音が違ったりして、かなり雑ではあるのですがこれはこれであまり楽器を弾いたりするのが得意じゃない僕のような人には楽しいかなと思いました。完全に言い訳ですが。コード進行に縛られすぎて個性がなくなる傾向があるので、あとはこの与えられたルールからどれだけ礼儀正しく逸脱できるかが勝負な気がします。

実はコード進行からわざとすこしはずれるような bubble というオプションも作成したのですが、今の所あまりうまくいっていない感じです(--bubble=7 はいい感じ)。

もう少し作り込んだら面白い音が出るかも!