Tech Racho エンジニアの「?」を「!」に。
  • 開発

LinuxでTidalCyclesを動かす

はじめに

こんにちは。バイトの片山です。

ここ最近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

スッキリです。

sake

表示がレトロで使いにくいのでMacのターミナルからゲストOSのUbuntuにSSHできるようにすることにしました。こちらが参考になります。

VirtualBoxからポートフォワーディングを設定します。ホストOSのポートは使って無さそうなポートを適当に。ゲストポートはゲストOSの/etc/ssh/ssh-configに記されているもので、普通は22番ポートになってるみたいです。

sake

sake

次に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してあげて音が出れば完璧です。

sake

終わりに

ここまでやっておいてなんですが、UbuntuのGUI戻してSuperCollider入れればええやんっていう。つーかSSHするんだったらGUI消さなくてよかったやんという。

Macのターミナル -> (SSH) -> UbuntuのTidalCycles -> (OSC) -> MacのSuperColliderという非常にアタマの悪い構造になってしまいました。

仮想マシンでTidalCyclesを動かしてゲストOSでSuperColliderを動かしたい、という奇特な方がいらっしゃればもしかしたら役に立つかもしれません。

関連記事(サウンドとコンピュータ)

ライブコーディング入門:TidalCycles篇パート2

ライブコーディング入門:TidalCycles篇パート1

ライブコーディング入門:Sonic Pi篇パート1

python-oscを使ってみる:前編

python-oscを使ってみる:後編

応用編1: pythonとopenFrameworksをOSCで接続する

応用編2: PythonとopenFrameworksとPuredataをOSCで接続する

iPhoneとopenFrameworksをOSCで接続する


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。