Music as code
イントロ
Extempore というソフトウェアを触ってみた、という話。
コードを書くことで作曲できる、というシンプルでインパクトの強い特性を持ってます。
とても面白くて魅力的だったので共有。
Extempore is 何?
- 作者曰く
cyberphysical programming
らしいExtempore has its roots in 'live coding' of audiovisual media art
- extempore で辞書を引くと「即興的な」という意味の形容詞(副詞)だった
- 要するに「ライブコーディング即興コンサート」できる
xtlang
というプログラミング言語の実行環境- バックエンドに LLVM を使ってる
xtlang is 何?
- 高レイヤーは scheme
- 低レイヤーは C
という言語。CRuby と似てる。
インストール方法
homebrew 使ってるなら以下で一発
brew tap benswift/extempore brew install extempore
これだけだとまだ使えなくて
cd /usr/local/Cellar/extempore/0.xx ./compile-stdlib.sh
を実行する必要がある。
extempore を install し終わった後、ターミナルに説明が出るので見逃さないようにすること。
editor の準備
vim は知らない。
なお、extempore.el
は Github から入手してくる。
load-path
に置いて、extempore-mode
が使えるのであれば、準備は OK。
(vim に対応したファイルもあるっぽいから、ひょっとしたら対応しているのかも)
実行法
予めサーバーを立ち上げておく
cd /usr/local/Cellar/extempore/0.xx ./extempore
デフォルトだと TCP サーバーが port 7098 と 7099 で待ち構える。
あとはこの TCP サーバーに S式を送れば良い。
後はサーバーがコンパイルして、評価してくれる。
送り方は以下
- emacs 開く(extempore-mode を on にする)
C-x C-j
(M-x extempore-connect)- S式を評価する
C-x C-e
でもいいし、region を指定してC-c C-r
でも良い
簡単なんやで。
音を鳴らす
自分が作った適当なサンプル
(sys:load "libs/external/instruments_ext.xtm") (define-instrument synth synth_note_c synth_fx) (bind-func dsp:[SAMPLE,SAMPLE,i64,i64,SAMPLE*]* (lambda (in time chan dat) (synth in time chan dat))) (dsp:set! dsp) ;; Simplest pattern (play-note (now) synth 60 120 80000) ;; 半音階 (dotimes (i 13) (play-note (+ (now) (* i 5000)) synth (+ 60 i) 120 8000)) ;; Scale (let loop ((scale '(0 2 4 5 7 9 11 12)) (dur (map (lambda (n) (* n 10000)) '(1 1 1 1 1 1 1 4))) (time 0)) (play-note (+ (now) time) synth (+ 60 (car scale)) 120 (car dur)) (if (not (null? (cdr scale))) (loop (cdr scale) (cdr dur) (+ time 10000)))) ;; cadenza (define play-cadenza (lambda (time plist) (map (lambda (p) (play-note time piano p 180 40000)) (car plist)) (if (not (null? (cdr plist))) (callback (now) 'play-cadenza (+ time 40000) (cdr plist))))) (play-cadenza (now) '((41 53 62 65 72) (43 55 64 67 72) (31 43 62 65 67 71) (36 48 60 64 67 72)))
肝は play-note
という関数。これで音を鳴らす。引数は全部で 5 つ。
- 第一引数: time
- いつ音を鳴らすか
- 第二引数: instrument
- 楽器の名前
- 第三引数: pitch
- 音程
- 60 が真ん中の ド
- 以後、半音上がるごとに +1 される
- 第四引数: volume
- 音量
- 第五引数: during
- 音の長さ
終わり
以上、Extempore Documentation に大体書いてあることでした。
実際に触ってみると、ドキュメントには言語仕様が十分乗ってなくて、わからないことだらけ。
そんな時は extempore/extempore_lang.xtm at master · digego/extempore に置いてあるサンプルを頑張って読んでいくのが良さそう。
後、楽譜をコードに落としこむのは結構大変。
そういう使い方ではなくて、ランダムな音程、リズムを即興で出すことには優れていて、本当にそれっぽいく聞こえる。すごい。