Overtoneオボエガキ

version date memo
0.1 2014/12/29 first
1.0 2015/1/1 実行, ネット動画関連追加

環境

OS Luxubuntu 12.04
Overtone 0.9.1
Clojure 1.6.0
Leiningen 2.5.0

必要な外部ソフトウェア

Linuxで行う場合、此処に書いてあるソフトウェアが必要なので、インストールする
Installing and starting jack · overtone/overtone Wiki · GitHub

# supercollider-serverは別に要らないかも知れない
sudo apt-get install supercollider-server
# Javaはインストール済みとする
sudo apt-get install jack-tools ant fftw3 qjackctl

プロジェクトの作成

次のリンクを参照する Clojureで音楽を奏でる | DevelopersIO
Leiningenを利用する

lein new music
cd music

依存するライブラリをmusic/project.cljに記述
Overtoneの最新バージョンは、GitHub - overtone/overtone: Collaborative Programmable Musicで確認する事

(defproject music "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [overtone "0.9.1"]
                 ])
# 下記のコマンドで、必要なライブラリのダウンロード
lein deps
# 別ターミナルで、qjackでaudio serverを立ち上げておく
# (又は、qjaclctlで起動しておく)
jackd -r -d alsa -r 44100
# musicフォルダに移動し、REPLを起動
cd music
lein repl
;; 下記を実行
(use 'overtone.live)
;; ダメな場合は下記を実行(外部サーバを立ち上げる)
;; (よくわからないがOS-Xでinternal-serverの起動が出来ないっぽい)
(use 'overtone.core)
(boot-external-server)

毎回明示的に、外部サーバを立ち上げるのは面倒なので、デフォルトの設定を変更する。
下記のファイルを修正する。
~/.overtone/config.clj

;; サーバの指定が、内部サーバ(下記)となっているので
:server :internal,
;; 外部サーバに変更する(下記)
:server :external,
;; 上記の様に変更すると、下記コマンドで起動するようになる
(use 'overtone.live)

実行

ファイルロード@REPL

leinを利用したサンプルプログラムと実行方法については、下記を参照の事。
Overtone: Clojureで音楽を書こう : サルノオボエガキ
ファイルは、src/[プロジェクト名]/core.cljと同じ階層に置いておき、use, requireでロード出来る。
use/requireの話は、下記リンクが詳しい
require と use - 水底で思うこと

;; src/music/core.clj
;; namespaceとファイル名は一致させた方が良いみたい
(ns music.core
  :use [...])
;; 上記の設定の場合、下記の様にロードする
;; (ファイル名さえ合っていればロードは可能。
;;  REPL上ではWarningが出る)
(use 'music.core)       ; 名前空間を保持しない(Pythonのfrom A import A1の様なもの)
(require 'music.core)   ; 名前空間を保持する(Pythonのimport A.A1の様なもの)
;; 再読み込みの場合
;; (:reload-allで全再読み込み)
(use 'music.core :reload-all)
(require 'music.core :reload-all)
ファイル名について("-"問題)

詳しくは調査していないが、名前空間をat-allとしたい場合は、ファイル名をat_all.cljとしないとダメなようである。
下記リンクを実行しようとして、ファイル名をat-all.cljにした際に、use/requireが出来なかった。
因みにREPLでロードするときは、(use 'at-all)で良い。
overtone/at_all.clj at master · overtone/overtone · GitHub

(use 'overtone.live)でExceptionが発生する

(use 'overtone.live)で下記のようなエラーが発生した。

Exception Can't connect to native server - no compatible libraries for your system are available.  overtone.sc.machinery.server.connection/boot-internal-server (connection.clj:202)

(use 'overtone.core)を実行し、(boot-external-server)を実行すると、取り敢えず起動すると書いてあったので、
(参考: https://groups.google.com/forum/#!topic/overtone/Bi3R3jGewsI)
実行してみるが、下記のエラーが出て結局実行できない。

Connecting to external SuperCollider server: 127.0.0.1:48427
Exception in thread "Thread-10" java.io.IOException: Cannot run program "scsynth" (in directory "."): error=2, そのようなファイルやディレクトリはありません
	    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
	    at java.lang.Runtime.exec(Runtime.java:617)
	    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	    at java.lang.reflect.Method.invoke(Method.java:606)
	    at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)
	    at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28)
	    at overtone.sc.machinery.server.connection$external_booter.invoke(connection.clj:231)
	    at overtone.sc.machinery.server.connection$external_booter.invoke(connection.clj:227)
	    at overtone.sc.machinery.server.connection$boot_external_server$fn__3997.invoke(connection.clj:309)
	    at clojure.lang.AFn.run(AFn.java:24)
	    at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: error=2, そのようなファイルやディレクトリはありません
	    at java.lang.UNIXProcess.forkAndExec(Native Method)
	    at java.lang.UNIXProcess.<init>(UNIXProcess.java:186)
	      at java.lang.ProcessImpl.start(ProcessImpl.java:130)
	      at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
	      ... 12 more

overtoneのソースを見てみると、(use 'overtone.live)実行時のエラーは、scsynthが無い場合に発生するエラーらしいので、scsynthを下記コマンドによりインストールする。
Linuxの場合は、必要なソフトウェアがインストールされているかどうか確認する。(必要な外部ソフトウェア)
インストール後、(use 'overtone.live)は相変わらず、Exceptionを吐くが、(boot-external-server)は無事起動するようになった。

ネット動画(youtube, niconico)とかが固まる件

LeiningのREPLを起動し、JACKでSuperColliderの接続を行うとネットの動画(youtube, niconico)が固まる。
詳細な原因は不明であるが、JACKを終了すると、通常に再生されるので、JACKとFlash側の連携がとれていないんだろうと思い、調べてみるとPulseAudioとJACKの統合が必要との事であった。
下記のページを参考に、PulseAudioとJACKの統合を行う。
2.3.3. PulseAudio を JACK と統合する

# /etc/pulse/default.paをスーパユーザ権限で開く
sudo vim /etc/pulse/default.pa
# "#load-module module-alsa-sink"と書かれているコードの次辺りに下記のコードを記述する
load-module module-jack-sink
load-module module-jack-source

この設定を記述後、PC再起動なり、JACKの再起動なりを行うとQjackCtlの設定に"PulseAudio JACK Sink"と"PulseAudio JACK Source"が出てくるようになる。

JACKの接続を停止した場合

JACKの接続を停止し、再度接続を開始すると、ネット動画が固まるようになる。
取り敢えず、下記の手順で復旧できる。
1) ブラウザを落とす
2) JACKの接続を停止する
3) JACKの接続を開始する
4) ブラウザを起動する

stopメソッドについて

(use 'overtone.live) や (use 'overtone.core)をREPL上で実行しない場合、stopメソッドの名前空間のuseを行わないので、(stop)を実行してもエラーになる。
stopメソッドは、overtone.sc.serverに定義されているので、下記コマンドを打つか、overtone.live, overtone.coreの何れかをuseする必要がある。

;; 直に指定して実行する
(overtone.sc.server/stop)
;; 名前空間をuseして実行する
(use 'overtone.live)      ; 又は (use 'overtone.core)
(stop)