Clojure Overtone + Shadertone + emacsでライブコーディングをする!!(Overtone基本編)

2016年07月28日
投稿者:若山幸弘
カテゴリ:clojure タグ:

overtone-logo

overtone, emacs ciderの起動

前回、shadertoneをpullしたディレクトリに移動しemacsを起動します。

emacsにてM-x cider-jack-inを実行すると、
自動でclojure repl, overtoneが起動します。

overtoneを利用するにあたってのclojure基礎

これからコードのサンプルを記載していきますが、
それにあたってclojureの基礎をざっくりと紹介します。
既に基礎を押さえている方は次章まで読み飛ばして下さい。

グローバル変数

defといえば、ruby,python,scalaではメソッド宣言ですが、
clojureではその名前空間でグローバルな変数を宣言します。

ローカル変数

ローカル変数はletマクロで定義します。

逐次実行

ライブコーディングではリアルタイムにS式を評価していくので
コードブロックを一斉に実行するdoマクロは重宝します。

メソッド

メソッド宣言はdefnというマクロを利用します。
ブラケットの中には引数が格納されます。

配列(リスト、ベクター)

シーケンス型のオブジェクトとしてはベクター、リストの2種類があります。
どちらもdoseqやmapなどのイテレータメソッドで同様に扱うので今回のライブコーディングで
意識する必要はありません。
ベクターはランダムアクセスに強く、リストは要素の追加に強い特性があることから
ライブコーディングではベクターを多用することになります。

キーワード

rubyでいうところのシンボルです。
主にハッシュマップなどのキーとして利用することが多いです。

スレッディングマクロ(->)

メソッドチェーン風に上から下に処理を記述できるマクロです。
->マクロは関数の第1引数に処理が渡されます。

->>マクロは関数の第2引数の処理が渡されます。

名前空間の定義、ライブラリのインポート

fooという名前空間を定義しovertone.liveをoという名前でインポートする

サンプル用のファイルを作成

emacsにてサンプル用のファイルを作成します。
ファイル名はまぁ何でもよいので、今回はfoo.cljとします。
foo.cljに以下のコードを記入します。

名前空間を定義し必要なライブラリをインポートしています。
今回はovertone.liveのみを利用するのでovertone.liveをoという名前でuseしています。
名前空間名は何でもよいのですが、fooとしています。

definstマクロで音を鳴らすためのフォームを定義します。
(o/saw 220)としているので、220Hzのノコギリ波となります。
definstはsuper colliderのsynthdefの形式にコンパイルし呼び出し可能な
関数を返却するマクロです。
ですので(foo)というフォームにてfoo関数を呼び出すと音が鳴る。という仕組みです。
尚、(kill “オブジェクト名”)で音を停止します。

音を鳴らしてみる

emacsにて各式の末尾に移動し、上から順番にC-c C-e(cider-eval-last-sexp)していきます。
(foo)を評価した際に音が鳴るはずです。
最大音量にて再生されるので注意してください。
(kill foo)にて停止します。
(stop)にて現在再生されている全ての音を停止します。

音源を作成してみる

440hz, ボリューム30%

saw-wave1にゆらぎを加えたもの

saw-wave2に音の長さが3秒

ピアノっぽく叩いた感じ

コードを作成

先ほど作成したsaw-waveに音階を付けてみます。
midi-hz, note関数を利用して音階を設定する関数を作成します。
この関数で周波数ではなく、コードにて音を表現することができるようになりました。

続いてC4のメジャーコードで再生する関数を作成します。

時間差で関数を実行する

at関数で時間差実行が可能です。

metronomeを利用する

先程の時間差実行でライブコーディングすることも可能ですが、
metronomeを利用すればもっと楽に演奏コードを実装することが容易になります。
秒単位ではなく4分音符単位での表現が可能になります。

metronomeを利用して何が嬉しいかというと、以下のように動的にビートを
変化させることができるからです。
ライブコーディングでは欠かせない機能になります。

より汎用的に

sawやsinでも音源を作成することはできますが、
wavファイルなどの音源も利用することができます。
freesound-path関数でfreesoundというサイトから指定のidの音源を
ダウンロードし、バッファに格納します。
再生するにはdefinstと同様、(snare)のように呼びだして再生します。

player関数を定義しビートを作成しループさせると以下のようになります。

その先へ

上記のようにビートを作成し、再帰でループさせるのもアリですが、
次回はleipzigを利用し、より簡易にループを生成できる方法を紹介します。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です