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)