自動作曲を手作業で真似る


戻る


<サンプルのMIDIファイル(SMFフォーマット1)が再生できない方はQuickTime Playerを使用してみてください>

最初に断っておくが、筆者は自動作曲ソフトのアルゴリズムなどを実際に勉強したことはまったくない。ただ当て推量で「こんな感じだろう」と予想しているだけである。また、真似できるようになって何が嬉しいのかというと、メリットはない。たんに技術的な好奇心が満たされるだけである。

自動作曲ソフト自体に興味がある人は、MACS(MACS97)というソフトが(今となっては古いソフトではあるが)衝撃的なくらいよくできているので一度試してみるとよいだろう。


準備

まずは乱数を用意しよう。数学的に正しい方法なら何を使ってもよいが、乱数発生ソフトを使うとラク。今回は0~9までの数字を60個ほど出力した(余るとは思うが、もし足りなくなったら追加する)。
8160131719 3412463044 5006775281 1322048657 4793507233 3575304128
キーとコード進行も決めておく。Key on Cで14516251の8小節パターンをやってみよう。テンポ120の8ビートでやる。

パターンさえ用意しておけばキーやテンポも自動で決められるが、アルゴリズムを作る方が面倒なので適当に決めてしまった。


基本アルゴリズム

ここではほぼ当てずっぽうでやっているが、音楽理論に基づいたルールをきちんと導入した方が、より強力なアルゴリズムになるだろう。

各パーツの最初の音には、コードのペンタトニックスケール上の音を使う。メジャーコード/マイナーコードの場合、乱数を5で割った余りが、0ならばi/i、1ならばii/iiib、2ならばiii/iv、3ならばv/v、4ならばvi/viibということにしよう。直前の音と最も近いオクターブを選ぶが、E4~A5の範囲からは外れないようにする。

メロディは3音を基本に考える。最初の音から「上行+上行」「上行+下行」「下行+上行」「下行+下行」の4パターンを考えればよい(サンプル)。今回はジグザグの多いメロにしようと思うので、乱数が0~1なら上行+上行、2~4なら上行+下行、5~6なら下行+上行、7~9なら下行+下行ということにしよう。同じ音程が続く場合は必ずタイで結ばれると考え、ここでは考慮しない。

メロディ進行は「順次+順次」「順次+跳躍」「跳躍+順次」を考えればよい。0~5が順次+順次、6~7が順次+跳躍、8~9が跳躍+順次とする。跳躍進行の行き先は「短3度以上離れたペンタトニックスケール上の音でもっとも近いもの」とする。順次進行はキーのダイアトニックトーンをそのまま使うが、メジャーコード上のivとマイナーコード上のviはアボイド扱いとし、もっとも近いダイアトニックトーンで代用する(これにより順次進行が跳躍進行に変わる)。

では、このアルゴリズムで、各小節に3音のパーツが2回入るように音を並べてみよう。乱数は
8160131719 3412463044 5006775281 1322048657 4793507233 3575304128
なので、最初の3つを使って「vから始まり、上行+上行、順次+跳躍」と決める。最初のコードはCなので「GAC」になる。次は「013」を使って「iから始まり、上行+上行、順次+順次」だから「CDE」、あとはこれを繰り返す。

コードがFに変わって「GFE」「DED」、Gに変わって「ABA」「ABA」、Cに変わって「AGA」「CDG」、Amに変わって「GAG」「ABD」、Dmに変わって「GFD」「GFD」、Gに変わって「ABA」「BDE」、Cに変わって「GEG」「EDC」になる(べた打ちしたサンプル)。

・・・おかしい。1小節につき6つの乱数を消費するはずなのだが、筆者の手元では「8160131719 3412463044 5006775281 1322048657 47」までしか使っていない。どこかで間違えたようだが見直すのも面倒なのでこのまま進めよう。メロディらしきものはできているので支障ない。


加工アルゴリズム

音楽理論を使って加工する。

小節内に休符を挟んで4度上行/5度下行以外の跳躍進行がある個所について、間にペンタトニックスケール上のトーン1つを挟んで「順次+順次」「順次+4度上行/5度下行」「4度上行/5度下行+順次」のいづれかに変える。小節の区切りに休符を挟んで4度上行/5度下行以外の跳躍進行がある個所について、間にペンタトニックスケール上のトーン1つを挟んで「順次+順次」に変える。この条件で作業できない跳躍進行は放置する(べた打ちしたサンプル)。

合計で4分休符分の休符がある小節について、最初のパーツがコードトーンで始まる場合はそのトーンを伸ばし、後ろのトーン2つを伸ばした分ずらず。最初のパーツがコードトーンで始まらず、2つめのパーツがコードトーンで始まる場合は、そのトーンを伸ばして伸ばした分前に移動する。同じ音符が隣り合った場合、合計4分音符分であれば1つの音符にまとめてしまう。

小節の途中に休符があり、かつ小節の最後にも休符がある小節について、パーツとパーツの間にコードトーンを1つ挟んで「順次+順次」「順次+4度上行/5度下行」「4度上行/5度下行+順次」のいづれかができるなら、挟み込む。1小節の途中に休符があり、かつ小節の最後に休符がない小節は、後ろのパーツを休符の分だけ前に移動する。

順次進行の上行または順次進行の下行が4回以上続くとき、その個所で最初に出現するコードトーンを伸ばし、その後最初に出現するペンタトニックスケール外の音を削除して、伸ばした音と削除した音の間にあった音を後ろにずらす。


完成

べた打ちしたサンプルと、それにドラムスを加えたもの

6小節目あたりがイマイチな感じがするが、なにしろ材料は乱数だけなので、気に入らなければ作り直せばよい(上記のアルゴリズムを、乱数を決めるところから標準MIDIファイルを書き出すところまでプログラムしてやれば、1秒とかからず作り直しができるはず:人間が当てずっぽうで作曲する場合と決定的に違うのはここだろう)。追記:トレモロ(おもに同音と2音)関連のアルゴリズムも入れておけばよかったかも。

実際に「自動作曲ソフト」として出回っているもののアルゴリズムは上記よりはるかに洗練されていると思うが、基本的には、乱数>パラメータに基づき確率で音を並べる>音楽理論で取捨選択や調整をする、という流れだと思う。パラメータを可変にして、旋法、対位法、和声法などの音楽理論をきちんと盛り込み、使用するスケールを多彩にしてやれば、もうちょっとそれっぽいものができるだろう。


別パターン

別の乱数
0421803067 3493250328 5234955902 4356654531 1451581466 8475499728
7810533697 7250102798 3752346019 4895800932 9848532918 5970457677
を使って、キーから見たペンタトニックスケールでメロディを組むパターン。Key on Gのカノン進行を元にする。

0~2はi(G)、3と4はv(D)、5はii(A)、6はiii(B)、7はvi(E)、8と9は休符として、直後の乱数が0~4なら8分、5~7なら4分、8か9なら付点4分の長さにしよう。G3~G5の範囲で音程間隔ができるだけ小さくなるように動かす(一番最初はG4にもっとも近いオクターブを選択)。

ざっとやってドラムスと重ねるとこんな感じになる。面倒なのでコード伴奏や音楽理論を元にした修正は入れていないが、最初に作ったものと比べて音がバラけた感じになっているのがわかるだろう(そういうアルゴリズムでやった)。乱数を2つセットで使って、00~99の2桁数と見れば、もっと細かく配分を調整することも可能だろう。

なお、新しめのソフトでMIDI Chord Helperというのもあり、こちらは「ルートからの距離」を基準にコード進行ベースの自動作曲をするようだ。自動作曲ソフトではないが、サウノスヴァルカ(リンクはコンセプト版)というのも雰囲気的には似ている。個人的に有望な気がする「基本パターン+バリエーション」の形のソフトも出てこないかな(真面目に探したわけではないのですでにあるかもしれない)。

オチがつかなかったがこれでおしまい。


オマケ

歌詞の自動生成もできるはずだよなぁ、と思っていたらJ-POPジェネレータというサイトがあるようだ。ぱっと見、パートごとに頻出フレーズ並べているようだが、コーパスみたいなものを作って力技で検索してやればもっと複雑なものも作れそうな気が(素人考えに)する。

ネックになりそうなのは「フレーズへの分割」作業で、ここを効率化できればあとは計算資源をぶん回すだけでけっこうイケるんじゃなかろうか。

たとえば、曲ごとに「スローテンポ」とか「男声」とか「ギター伴奏」などのカテゴリ属性をつけておき、条件検索して頻出フレーズを抽出、検索条件に特有ものは重みをプラスしつつ乱数で取捨、採用したフレーズと関連性の高いフレーズを選んでは配置、といった感じ。フレーズはもちろんあいまい一致で探しておく。

すでに触れたようにコーパスの作成がネックではあるが、うまくすれば、検索条件や他フレーズとの関連性による重みをどうつけるか、といったあたりでちょっと遊べそうな気がする。



急がば回れの目次に戻る / 音楽メモの目次にもどる

自滅への道トップページ