先日Ableton and Max Community Japan #011「作曲 VS 生成音楽」 | Peatixというイベントがあって、面白そうだったので聴講してみた。そこではAbletonというDAWを使っていて、これは持っていなかったけどアルゴリズムは簡単だったので、JavaScriptで実装してみた。
ひとことで言えば「白鍵をランダムに叩いてるだけ」のプログラム。音楽生成ロジックからDOM(一応Reactを使った)まで含めても70行ぐらいしかない、プログラム的にも音楽的にも単純なもの。
この講義によると
- ハ長調でランダムに数オクターブ分の音を鳴らす
- (音はハ長調から選ぶけど進行がランダムなので無調性音楽)
- 3つぐらいパート作る
- 適当にリバーブとディレイをかける
以上のとおりに音を鳴らすと、なんかアンビエントな感じになるらしい。自動作曲をするなら最初はとりあえずアンビエントな音楽を目指すと良いらしい。
音を鳴らすのにはTone.jsというnpmライブラリを使った。
https://github.com/Tonejs/Tone.js
Web Audio使って2行で音が鳴らせるやつ。たぶん内部実装はブラウザのAudio Contextに波形を書き込んでると思う。これに付いてるデフォルトのシンセサイザーみたいなやつを使った。本当は、講義ではアコースティックな音源を使ったほうが良いって言ってVSTi音源使ってたけどWeb Audioにそんな物は無い。
講義ではこのあと、完全ランダムではなくて適当な曲(ジョンケージのMIDIだった気がする)のマルコフ連鎖確率モデルを作って自動作曲をしていたけど、それをJavaScriptで再現するには入力の実装が面倒で作ってない。