2011-12-10

Overtone: Clojureで音楽を書こう


この記事はClojure Advent Calendar 2011の10日目の記事として書いています。

12月1日からクリスマス25日まで毎日1ネタ、Clojureの記事を書くというこの企画。
せっかくなので前々から興味のあったOvertoneというライブラリの紹介をしてみようと思います。
Home // Overtone
overtone/overtone - GitHub

Overtoneは"Programmable Music"を目標とするシンセサイザーです。普通のシンセサイザーの操作とは違い、Clojureコードで音を作り音楽を書くことができます。
プログラマブル・シンセサイザーとしてはSuperColliderというのが前からあるそうで、それをClojureでラップした作りのようですね。
この記事では導入の仕方と簡単な音の作り方、最後にとあるクリスマスソングをOvertoneで書いてみたいと思います。


Overtoneを使ってみる
leiningenを使うとけっこう簡単に始められます(公式ドキュメントではcakeでのやり方も書いてある)。

$ lein new overtone-chrismas
$ cd overtone-chrismas

project.cljにOvertoneの設定をこんな感じに書き足します。

deltam's gist: 1454843 — Gist


$ lein deps
$ lein repl

あとはこのREPL上でやっていきます。



音を作る
正直言ってまだよく分かってません。Overtoneは薄いラッパのようでSuperColliderのコマンドを知らないと分かりにくい。とりあえずREADMEGetting Startedから使えそうなコードを持ってきて試してみました。

Internal Serverを立ち上げる
まずシンセサイザー用のサーバを立ち上げます。公式サイトによると内部サーバを起動する方法と外部サーバを使う方法があるみたいですが、ここでは内部サーバのほうを使います(外部サーバはSuperColliderのサーバに繋げる方法みたいなので別途インストールが必要。実際めんどい)。
こんな感じで内部サーバの準備をします。

user=> (use 'overtone.live)

; 内部サーバが起動するのでちょっと待つ
; いろいろメッセージが出た後にロゴが出てくる。
          _____                 __
         / __  /_  _____  _____/ /_____  ____  ___
        / / / / | / / _ \/ ___/ __/ __ \/ __ \/ _ \
       / /_/ /| |/ /  __/ /  / /_/ /_/ / / / /  __/
       \____/ |___/\___/_/   \__/\____/_/ /_/\___/

                          Programmable Music.


Hello deltam, may this be the start of a beautiful music hacking session...
nil
user=>


ビープ音を鳴らす

注意:以下のプログラムは実行するときは、ヘッドホンや音量に気をつけましょう。打ち間違えてノイジーな音が耳を直撃!なことになりますよー。
あと内部サーバ起動のときに音声の出力先を決めてるらしく、途中からヘッドホンのコードを抜き差しすると音が聞こえなくなったりしました。


README.mdにあるサンプルを写経。

user=> (demo 4 (pan2 (sin-osc 440)))

4秒間(demo 4)、ステレオ音声で(pan2)、440ヘルツの音(sin-osc 440)を鳴らすというコードです。いろいろ数値を変えてどんな音になるのか試してみましょう!

definstってやつを使うと楽器が定義できます。単純にビープ音を鳴らす楽器を定義しました。これだと(stop)を実行するまで止まらないので注意です。

user=> (definst beep [freq 440] (sin-osc freq))
#
user=> (beep)
29
user=> (stop)
nil
user=> (beep 200)
29
user=> (stop)
nil

これでだいたい音の作り方がわかりました!


クリスマスソングを書いてみよう
上記の方法だと周波数を指定しないと音を鳴らせません。もっと単純にピアノのように曲を書けないかなーと思って調べてみたんですが、よく分かりません。
ライブコーディングのムービーを見てみるとovertone.inst.pianoを使って曲を書いてるんですが、実際に使おうとすると「プラグインがないよー」と言われて使えない。たぶんSuperColliderにプラグインを追加して外部サーバに指定してOvertoneを立ち上げれば何とか成るのかな、と思うけど面倒臭いよね。

なので今回は単純にドレミ音階の周波数をまとめて定義して、それで曲を書いてみることにしました。
課題曲はクリスマスの定番、「ジングルベル」(参考楽譜、ついでに歌詞)。

deltam's gist: 1454843 — Gist

ロードして演奏してみます。


user=> (use 'overtone-chrismas.core :reload-all)

          _____                 __
         / __  /_  _____  _____/ /_____  ____  ___
        / / / / | / / _ \/ ___/ __/ __ \/ __ \/ _ \
       / /_/ /| |/ /  __/ /  / /_/ /_/ / / / /  __/
       \____/ |___/\___/_/   \__/\____/_/ /_/\___/

                          Programmable Music.


Hello deltam, may this be the start of a beautiful music hacking session...
nil
user=> (play-jingle-bells)
nil

楽譜の読み方も分からぬまま適当に写したので、ちょっと間延びした感じだけどちゃんとジングルベルの曲になってます。
曲が演奏できるようになると楽しくなってきますね!

まずは一番単純な方法で曲を書いて見ましたが、この方法だと音がぶつ切りになっていまいちです。Examplesを見るとちゃんと綺麗に音を鳴らす方法もあるので、興味が湧いた人は読むといいと思うよ! examples/basic.cljから読むと良いよ!

ライブコーディングのムービーをみると”ドギャーン”とか”ピポポ”とかいろんな音が作れるみたい。


Quick Intro to Live Programming with Overtone from Sam Aaron on Vimeo.



では予定がある人は良いクリスマスを! 無い人はOvertoneで遊ぼうぜ!

2 件のコメント:

Sam Aaron さんのコメント...

Fantastic introduction - thanks :-)

One tip - rather than specifying the frequencies directly, you can calculate them using something like:

(midi->hz (note :C4)) ;=> 261.625

Keep up the great work :-)

deltam さんのコメント...

> Sam Aaron

Thanks for your useful tips!

I'm a beginner in Overtone.
The music written in Clojure is fun!