はじめに
こんにちは。バイトの片山です。
ここ最近TechrachoでTidalCyclesについて紹介することが多いですが、本日も取り上げていきたいと思います。
ネタが無いので苦し紛れの案ですが、Linux上でのTidalCyclesインストールについてやってみたらもしかしたら世界中で一人くらいは需要あるかなと思ってやってみることにしました。ただの備忘録かもしれない。
生でインストールするのは面倒なのでVirtualBox上の仮想マシンでやっていきます。
Ubuntuが一番オーソドックスでいいんだろうなとか思いつつ、天邪鬼な性格なので、openSUSEを使っていくことにしました。
が、openSUSEでTidal導入しつつ頑張って記事を書いていたら色々と問題が発生しまして、茨の道であることがわかりました。
SUSEでTidalは茨の道であるので諦めよう、ということを悟るために数時間は費やしました。
TidalCyclesを使いたい!という方は普通にDebianとかMintを使ったほうがいいと思います。
僕はUbuntuを使います。
LinuxでTidalCycles
仮想マシンの準備
VirtualBoxとUbuntu16.04のisoイメージを用意します。
あとは流れにしたがってインストールします。
なんか動きがもっさりしてるのでGUIはアンインストールすることにしました。
sudo apt -y purge ubuntu-desktop lightdm
スッキリです。
表示がレトロで使いにくいのでMacのターミナルからゲストOSのUbuntuにSSHできるようにすることにしました。こちらが参考になります。
VirtualBoxからポートフォワーディングを設定します。ホストOSのポートは使って無さそうなポートを適当に。ゲストポートはゲストOSの/etc/ssh/ssh-config
に記されているもので、普通は22番ポートになってるみたいです。
次にopenssh-serverを入れます。
sudo apt-get install openssh-server
あとはMacのターミナルからsshしてあげて、こんな感じに
$ ssh yuki@localhost -p 1234 2.3.1
The authenticity of host '[localhost]:1234 ([127.0.0.1]:1234)' can't be established.
ECDSA key fingerprint is SHA256:BgyxNdvMaq3/PxBGBs2iZ9NrIfYnQz/hFyG0ZWcR87Q.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:1234' (ECDSA) to the list of known hosts.
yuki@localhost's password:
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.10.0-28-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
69 packages can be updated.
56 updates are security updates.
Last login: Tue Aug 29 16:29:15 2017
yuki@yuki-VirtualBox:~$
入れます。
TidalCyclesをインストール
やっとTidalをインストールするための準備が整いました。
まずはHaskellを使えるようにします。
$ sudo apt-get install ghc cabal-install
cabalでTidalをインストールします。
$ cabal update
$ cabal install tidal
ここでトラブル発生です。インストールできません。発狂モノです。
yuki@yuki-VirtualBox:~/Documents$ cabal install tidal
Resolving dependencies...
Configuring zlib-0.6.1.2...
cabal: Missing dependency on a foreign library:
* Missing (or bad) header file: zlib.h
* Missing C library: z
This problem can usually be solved by installing the system package that
provides this library (you may need the "-dev" version). If the library is
already installed but in a non-standard location then you can use the flags
--extra-include-dirs= and --extra-lib-dirs= to specify where it is.
If the header file does exist, it may contain errors that are caught by the C
compiler at the preprocessing stage. In this case you can re-run configure
with the verbosity flag -v3 to see the error messages.
Failed to install zlib-0.6.1.2
cabal: Error: some packages failed to install:
streaming-commons-0.1.18 depends on zlib-0.6.1.2 which failed to install.
tidal-0.9.4 depends on zlib-0.6.1.2 which failed to install.
websockets-0.12.2.0 depends on zlib-0.6.1.2 which failed to install.
zlib-0.6.1.2 failed during the configure step. The exception was:
ExitFailure 1
ちょっとわけがわからなかったので、泣きそうになりながら色々試してたら
sudo apt-get install haskell-platform
をやってから、再度cabal install tidal
で通るようになりました。
sudo apt-get install ghc cabal-install
ではなくてsudo apt-get install haskell-platform
じゃないとダメなのかもしれません。
次にEmacsの準備をします。
sudo apt-get install emacs24 haskell-mode
.emacs
に以下を追加します。
(add-to-list 'load-path "~/projects/tidal")
(require 'haskell-mode)
(require 'tidal)
そしたらこちらのリンクのtidal.el
を~/projects/tidal
にぶち込みます。ディレクトリがない場合は作りましょう。
ぶち込むときはwgetを使ったりすればいいんじゃないでしょうか。
$ wget https://raw.githubusercontent.com/tidalcycles/Tidal/master/tidal.el
TidalCyclesを動かす
さて、私はいつも実際に作業しながら記事をチマチマと書くスタイルでやっているのですが、今、大変な問題に気づきました。
GUIないのでUbuntuでSuperCollider動かせないじゃん、という……
実はCUIからSuperColliderを動かす方法があったりするみたいですが、素人の僕にはよくわかりません。
ということで、Ubuntuで動かしているTidalCyclesのメッセージをOS XのSuperColliderに飛ばすことにしました。
調べてみると、VirtualBoxのポートフォワーディングでは、ホストからゲストへは制限があるものの、ゲストからホストへの通信は特に何も気にしなくても良いみたいな感じらしいです。
でもipとかどうなってんだよ、と思ったらどうやら、ホストのipは10.0.2.2
に設定されているみたいです。
ということで、UbuntuのTidalCyclesの方で、10.0.2.2
の57120ポートにメッセージを送る設定をしなければなりません。57120ポートというのはSuperColliderの受信ポートだったはずです。
これについてはこちらを参考にします。
少し書き換えてみます。
import Sound.Tidal.OscStream
let sendProcess = Shape {
params = [ S "s" Nothing
],
cpsStamp = False,
latency = 0.0
}
sendProcessSlang = OscSlang {
path = "/play2", --アドレスを/play2にしないとSuperColliderが反応しません
timestamp = NoStamp,
namedParams = True,
preamble = []
}
sendProcessStream = do
s <- makeConnection "10.0.2.2" 57120 sendProcessSlang --メッセージ送信先のIPアドレスとポート番号を指定
stream (Backend s $ (\_ _ _ -> return ())) sendProcess
s = makeS sendProcess "s"
s1 <- sendProcessStream
s2 <- sendProcessStream
s3 <- sendProcessStream
s4 <- sendProcessStream
let hush = mapM_ ($ silence) [s1, s2, s3, s4]
let solo = (>>) hush
OS X側でSuperColliderを開いてSuperDirt.start;
します。
次にTidalCyclesを起動して、上のコードを上から順番にEvalしていきます。
で、
s1 $ s "bd sn"
をEvalしてあげて音が出れば完璧です。
終わりに
ここまでやっておいてなんですが、UbuntuのGUI戻してSuperCollider入れればええやんっていう。つーかSSHするんだったらGUI消さなくてよかったやんという。
Macのターミナル -> (SSH) -> UbuntuのTidalCycles -> (OSC) -> MacのSuperCollider
という非常にアタマの悪い構造になってしまいました。
仮想マシンでTidalCyclesを動かしてゲストOSでSuperColliderを動かしたい、という奇特な方がいらっしゃればもしかしたら役に立つかもしれません。