Haskellをちょっとかじったことがある人向けのTidalCyclesインストール on Windows

# はじめに
最近、以下の本を読みライブコーディングを始めました。この本の通りに音出してみただけですが楽しいです。
[演奏するプログラミング、ライブコーディングの思想と実践 ―Show Us Your Screens](https://www.amazon.co.jp/%E6%BC%94%E5%A5%8F%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%80%81%E3%83%A9%E3%82%A4%E3%83%96%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%80%9D%E6%83%B3%E3%81%A8%E5%AE%9F%E8%B7%B5-%E2%80%95Show-Us-Your-Screens/dp/4802511043/)

この本の中では、音楽のライブコーディング用のソフトとして、「Sonic Pi」「TidalCycles」が紹介されています。「Sonic Pi」はポンとインストールして終わりですが、「TidalCycles」については色々なプログラムを用意する必要があり、個別に入れていくとなると結構面倒です。
こうした手間を省くため以下の記事の通り、macであればHomebrew、windowsであればChocolateyで一括インストールすることが可能になっています。（前述の本の著者の方の記事なので、本に書いてある内容と同じです。）
[TidalCyclesのインストール2018年版](https://qiita.com/yoppa/items/fe21d7136f8f3aafd55c)

「Haskellなんて知らないけどライブコーディングしてみたい」という人は、上記の手順通りに設定すればそれでOKなのですが、Haskellの実行環境が既にある「ちょっとかじったことがある人」にとっては上記の手順でやってしまうと、Haskellの実行環境が重複してしまうリスクがあるかと思います。
そこで既にHaskell実行環境がある（もしくは今後HaskellをTidalCycles以外の用途で使用する予定のある）人向けのTidalCyclesのインストール方法を記載します。

# 必要なプログラム  
TidalCyclesで音を出すためには以下のプログラムが必要ということになっています。

- Git
- Haskell
- TidalCycles
- Atom & TidalCycles用プラグイン
- SuperCollider
- sc3-plugin
- SuperDirt

ここで私がひっかかるのは「Haskell」と「Atom」です。Haskellについては前述の通り。Atomについては、そもそも普段使わないエディタをTidalCyclesのためだけにインストールするのは避けたいところです。エディタ自体はコードの入力インターフェースとしての機能だけなんで何とかならんかな、と調べたら何とかなりました。
以下では個別のインストールについて語ります。

## Gitのインストール
さすがにHaskell使ってるけど、Gitは入っていないという人はなかなか居ないと思います。特別な作業は必要なく普通にGitがインストールされていればOKです。

## Haskellのインストール
本の手順では、[Haskell公式](https://www.haskell.org/)からHaskell Platformをダウンロードする、ということになっています。

少し話は変わりますが、私は以下のようなQiitaの記事を参考にHaskellを始めました。
[本気で Haskell したい人向けの Stack チュートリアル](https://qiita.com/waddlaw/items/49874f4cf9680e4b015)
[Haskell Stack とは何をするツールなのか](https://qiita.com/usamik26/items/672ed3c4451402bfc275)

参考にした記事内では、「Haskell Platform」の利用は推奨されておらず、「Stack（PythonにおけるPip、JavaScriptにおけるnpmのような存在）」が推奨されています。
試してみたところ、Haskell PlatformではなくStackがインストールされていれば、TidalCyclesは動きます。なので、Haskellを別の用途でも使う予定の人はStackをインストールしましょう。TidalCyclesはGHCというHaskellコンパイラを利用するので、Stackインストール後に`stack setup`でGHCをインストールしましょう。（詳細は上述の記事を参照のこと）
なお、Haskell PlatformでGHCをインストールした場合、コマンドラインで`ghci`と打てば対話的実行環境が立ち上がりますが、Stackからインストールした場合、`stack ghci`とする必要があります。

## TidalCyclesのインストール
本の手順では、`cabal`というツールでインストールを行っていますが、上述の記事ではこれまた`cabal`の利用は推奨されていません。ここでも`stack`を使ってインストールします。

```bash
stack install tidal
```

インストール処理には結構時間がかかりますが、打つコマンドはこれだけです。

## ~~Atom~~ VSCode & TidalCycles用プラグインのインストール
私は普段VSCodeを使っているので「VSCodeで何とかならんかな」と検索したところ、VSCodeの拡張機能にTidalCycles用のプラグインがありました[^1]。 なので、Atomを改めてインストールする必要はありません。

[TidalCycles for VSCode](https://marketplace.visualstudio.com/items?itemName=tidalcycles.vscode-tidalcycles)
この拡張機能をVSCodeからインストールすればOKです。

なお、TidalCyclesはエディタからGHCiにコードを投げて処理を行う仕組みのようですが、StackでGHCiをインストールした場合、前述の通り`ghci`ではなく、`stack ghci`とコマンドを打たないとGHCiが立ち上がりません。そのままにしておくとエディタは`ghci xxx`みたいな形でTidalCyclesにコマンドを投げようとしますので、これを`stack ghci xxx`という形に変更しなくてはなりません。
TidalCycles for VSCodeの設定に「Use Stack Ghci」というオプションがあるので、StackからGHCiを入れた場合はこれをオンにする必要があります。

## SuperCollider, sc3-plugin, SuperDirtのインストール
ここは特に変更ありません。公式サイトに行って、インストーラーをダウンロードしてインストールするのみです。

# おわりに
Haskellかじり始めの頃に「この言語面白いけど、何に使われてんだろ？」と思って調べたのが、TidalCyclesとの出会いでした。その時には、インストールがあまりに面倒臭そうだった＆インストールした後に何したら良いかイメージが湧かなかったので結局手出ししなかったのですが、そこから数年、冒頭の本を手にようやくTidalCyclesに入門することができました。
Haskellに興味がある人とライブコーディングに興味がある人、結構ジャンルが異なるような気がしますが、この記事がHaskellを入口にTidalCyclesに入門しようとしている人の一助になれば幸いです。

# おまけ - SuperColliderでコマンド打っても何も起こらず途方にくれている人へ
インストールとは全く関係ないですが、私がTidalCyclesで音出すまでに最も苦しんだ現象なので触れておきます。

上記の全てのインストールが終わり、「さあ音を出してみよう！まずはSupserColliderを起動してサーバ起動だ！」と意気込んで、立ち上げてコマンド打っても何も起こらない。そんな現象に苦しんでいる方いませんか。具体的には以下のような画面になったまんま何を起こらない、何も出来ない状態です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/91332/be3cf42f-b887-e398-a4dc-8e32b2e577fb.png)

- クラスライブラリのコンパイルは出来る
- ヘルプブラウザは「Sending request...」のまま
- コーディングブロックにコマンド入力してCtrl+Enterしても何も起こらない
- SuperColliderを閉じても、タスクマネージャに「sclang.exe」というプロセスが残る
- SuperColliderを上げ下げ繰り返すと「sclang.exe」が回数分だけ増える

この事象、割とメジャーな現象らしく[SuperColliderのGitHubのIssues](https://github.com/supercollider/supercollider/issues)でも度々報告が上がっています。コードを入力するIDE「scide.exe」と裏で処理を行う「sclang.exe」が何らかの理由により通信できないことが原因のようです。
困ったことに通信できない理由はユーザによりマチマチのようで、私はIsuuesに「これで解決したよ」と記載してあることを試してもうまくいきませんでした。[こういう人は私以外にも居るようです](https://github.com/supercollider/supercollider/issues/4135)。

GithubのIssuesを漁って途方にくれた後、さらにSuperColliderのメーリングリストを漁ったところ、とりあえずのワークアラウンドを発見することができました。
https://www.listarc.bham.ac.uk/lists/sc-users-2018/msg60683.html

この方の説明いわく、scideとsclangの通信には「名前付きパイプ」が使われているらしく、windowsのセキュリティ設定か何かで名前付きパイプの制限がかかっていると、この事象が起こるようです。
[この方の作ったテストツール](https://github.com/anthonyhawes/SCTest/releases)は匿名パイプでsclangと通信するので、上記セキュリティ設定にかからずsclangと通信できます。TidalCyclesから音を出すだけならサーバとSuperDirtが立ち上がれば良いので、私はSuperColliderのIDEは使わずにこのツールを使って、サーバとSuperDirtの起動を行っています。
セキュリティ設定を色々確認したのですが、結局「名前付きパイプ」に関する設定を発見することができず、根本的な解決はできませんでした。とりあえずTidalCyclesだけ使う分にはこれで問題無いので、今は良しとしています。

[^1]: どうでもいい話ですが、この拡張機能のフォーク元の作成者「kindohm」さんは、ミュージシャンとしても活動しており、spotifyで音源を聞くことができます。TidalCyclesでどんな曲が作れるか、その一例として参考になるかと思います。結構ストイックで好みの分かれる音楽ではありますが。https://open.spotify.com/artist/45KoVZ9rEpLd8pwR4jnvbv