要約！ spacemacs 上で TidalCycles を導入し音楽制作する

<a href="https://tidalcycles.org/"><img width="429" alt="ScreenShot 2017-11-05 20.08.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/25974/9785e351-0361-65a4-73c6-ee23e956a0df.png"></a>

この記事ではSpacemacsへの[TidalCycles](https://tidalcycles.org/)(以下Tidal)のインストール方法を紹介する。[公式のインストール方法](https://tidalcycles.org/getting_started.html)の要点のみを抜粋した。
Tidalとはなにかというと、コーディングにより音楽を作り出すというものである。専用の音楽ソフトは一切使わない。普段使っているエディタにインストールするものであり、エディタをDAW(Digital Audio Workstation)化することができる。

公式サイトにある動画をみるとわかりやすい。
https://www.youtube.com/watch?list=PLybSFICi4UliK17U6rxPneXAyxvmGAe5T&v=smQOiFt8e4Q

Tidal自体に音を鳴らす仕組みはなく、実態は合わせてインストールするSuperColliderという環境にある。TidalはHaskellからOSC(通信プロトコル)を送信し、SuperColliderがそれを受信して音を鳴らしている。他にも[Sonic Pi](http://sonic-pi.net/)(Ruby)や[FoxDot](http://foxdot.org/)(Python)、[Overtone](http://overtone.github.io/)(Clojure)もあるが、すべてローカルサーバー上で起動するSuperColliderに命令し音を鳴らしている。

Tidalの面白いところはコーディングで音楽を作れることである。つまり、開発者の能力で作曲できるのだ。
音楽作成経験ゼロの筆者でもコードがかければ以下のような音楽を簡単につくることができる。
https://soundcloud.com/mwrote/pattern003

インストールした時点で様々な音が用意されているので、すぐ音楽を作って遊ぶことができる。

### 対応しているEditorについて

公式ではAtomが推薦されているが他にも以下のEditorに対応している。

- [Sublime Textへのインストール](https://tidalcycles.org/getting_started.html#sublime-text)
- [Vimへのインストール](https://tidalcycles.org/getting_started.html#vim)
- (非公式)[VSCodeへのインストール](https://github.com/kindohm/vscode-tidalcycles)

本記事はEmacs限定だが、Atomの場合の要点は[ページ下部](#atomインストールショートカット版)にまとめたのでそちらを参照。

## Tidalの特徴

一番はコーディングしてその場で音を鳴らすことができるリアルタイム性である。
ライブのようなシーンに非常に向いている。ビジュアル化ツールと併用してVJすることも得意とする。

次にTidalの非常に簡素な命令文だ。例えば、以下の一行を書くだけで、ズンチャッという音がなる。

```
d1 $ sound "bd cp"
```

また、常に一定のリズムでリピートされるのも面白い。上の文一形でずっと音がなり続ける。

Tidalを使って作られたKindohm(Mike Hodnick)さんのアルバム「RISC Chip」を聞くとわかりやすい。
http://shop.conditional.club/album/risc-chip
結構しっかりしたEDM系の音楽のように聞こえるが、これがコードで書かれているので驚きである。
※spotifyで視聴可能
https://open.spotify.com/album/0epYgxq19wqfiU7jMqzUcA

## 筆者の環境

- MacOSX Sierra (MacBook Pro 2013 late)  
※Windowsでも動作確認済み

## この記事でセットアップすること

- Haskellの開発環境(spacemacsユーザーのみ)
- Tidalの開発環境

## 事前にインストールしておくもの

- [spacemacs](https://github.com/syl20bnr/spacemacs) or Emacs
- Homebrew

## インストールのアジェンダ

インストール全体が長いので以下のように分割する。

1. Haskellのインストール
2. Tidalのインストール
3. SuperDirtのインストール
3. EmacsのTidal環境セットアップ

## 1. Haskellのインストール

Haskellのビルド、パッケージ管理で現在主流となっているstackをインストールする。

```
$ brew install haskell-stack
```

### (spacemacs User Only) Haskellコーディング環境構築

```
$ stack install apply-refact hlint stylish-haskell hasktags hoogle
```
※``~/.local/bin``にインストールされる


<details><summary>ghcのバージョンが古いと怒られた場合</summary>
最新版のnaightlyビルドをインストールする。
~/.stack/global-project/stack.ymlのresolverを以下のように変更
``
resolver: nightly-2017-07-31
``
spacemacsのレイヤーに記載されている以下のパッケージをインストールする。
```
$ stack setup  ;;最新版がインストールされる
$ stack install apply-refact hlint stylish-haskell hasktags hoogle
```
</details>

## 2. Tidalのインストール

Tidalの実態をstackからインストールする。

```
$ stack setup
$ stack install tidal
```

## 3. SuperDirtのインストール

TidalCyclesがシンセ環境として参照しているSupercollider(アプリケーション)をインストールする

```
$ brew cask install supercollider
```

SuperDirtというSuperColliderサンプラーをインストール。
SuperColliderを起動し左カラムのテキストエディタに以下をコピペする。

```
include("SuperDirt")
```

Command + Enter をキーボードから入力しコード実行。
しばらく待ち、右下のコンソールに``SuperDirt installed``と表示されれば完了

### (オプション) sc3pluginsのインストール

[ここ](https://github.com/supercollider/sc3-plugins/releases)からインストールしたsupercolliderと同じバージョンのコンパイルされたsc3-pluginsをインストールする(Latest releaseのタグがついているもの)。

``~/Library/Application Support/SuperCollider/Extensions``に解凍した``SC3plugins``を移動する。

## 4. EmacsのTidal環境セットアップ

以下のサイトからtidal用のelispファイルをダウンロードし、ローカルに保存する。
https://raw.githubusercontent.com/tidalcycles/Tidal/master/tidal.el
※spacemacsユーザーは ~/.emacs.d/private/local 以下推薦

init.el(spacemacsユーザーは.spacemacs)にダウンロードしたファイルを読み込む記述を追加する
  
```
;; tidal.elを保存した場所を指定する
(load-file "~/.emacs.d/private/local/tidal.el")
(setq tidal-interpreter "/usr/local/bin/stack")
(setq tidal-interpreter-arguments
      (list "repl"
            "--ghci-options=-XOverloadedStrings"
        ))
```
C-x C-e 上記式を評価する。もしくはEmacsを再起動する。

### (オプション) EmacsからSuperColliderを直接起動する設定

わざわざSuperColliderというアプリを立ち上げて、SuperDirt.startと実行するのは手間である。Emacsから直接SuperColliderを立ち上げる方法は、こちらの方が書かれているので参考を載せておく。
※内部でLinuxのmkfifoコマンドを使用しているためWindowsでは動かない
http://www.rockhoppertech.com/blog/supercollider-with-emacs-on-osx/

## Tidalの動作確認

1. SuperColliderを起動し、``SuperDirt.start``をテキストエリアに貼り付ける
2. カーソルが1で貼り付けた行にあることを確認し、Command + Enter を実行する
3. アプリ右下のServerラベル右のエリアの文字が緑色になっていることを確認する
2. Emacsを起動し、スクラッチバッファを開き、C-c C-s(stack-start-haskell)を実行する
3. ``d1 $ sound "bd"``と入力しC-c。音がなるか確認する

以上で、Tidalのインストールは終了である。

## Atomインストールショートカット版

```
brew install haskell-stack
stack setup
stack install tidal
brew cask install supercollider
```

supercolliderを立ち上げ以下をコピペ

```
include("SuperDirt")
```

右下のコンソールに``SuperDirt installed``と表示されたらOKとりあえずアプリを終了する

1. Atom > Preference(⌘+,) > Install > ``tidalcycles``を検索 > Install
2. Atom再起動
3. Atom > Preference(⌘+,) > Packages > tidalcycles > Settings > Ghci Path > ``stack ghci``を入力
4. この記事の「TidalCyclesの動作確認」の方法で音が鳴っているか確認する