読者です 読者をやめる 読者になる 読者になる

scramble cadenza

技術ネタのガラクタ置き場

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.elGithub から入手してくる。
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 に置いてあるサンプルを頑張って読んでいくのが良さそう。

後、楽譜をコードに落としこむのは結構大変。
そういう使い方ではなくて、ランダムな音程、リズムを即興で出すことには優れていて、本当にそれっぽいく聞こえる。すごい。