Tidalでライブコーディング! - 実践編

## Tidalリズムの基本

前回の「[Tidalでライブコーディング! - セットアップ編](http://qiita.com/yoppa/items/41805cc6af62b1047a34)」に引き続いて、こんどはいよいよ実践編です。

Tidalのリズムの組み方の基本はとてもシンプルです。例えば以下の例。

```hs
d1 $sound "bd"
```

これをcommand-enterで評価すると、バスドラムが一定間隔のリズムを刻みます。この1行の命令にいくつかTidalの命令のポイントが詰まっています。

まず先頭の"d1"の"d"は、Dirtシンセサイザーを演奏するということを意味します。Tidalでは、d1〜d9まで8つのDirtシンセのためのトラックが用意されていて、それぞれ別個にパターンを組んだものをリズムを同期させて演奏することが可能となっています。次の"$sound"でDirtのサンプルを再生する意味になり、最後の"bd"がサンプル名になっています。

Dirtに格納されているサンプルは、Dirtをインストールいたフォルダ以下の"samples"に入っています。ここにフォルダに分かれて整理されていて、例えば"bd"の場合は、"bd"フォルダ内の最初のサンプルファイル"BT0A0A7.wav"が演奏されます。もし、bdフォルダ内の別のファイルを演奏したい場合はコロン「:」で区切って"bd:1, bd:2, bd:3..."と指定していきます。

<img width="775" alt="screenshot_523.png" src="https://qiita-image-store.s3.amazonaws.com/0/115058/dbc25811-e0ef-ed0a-7f23-2bdd420d46ea.png">

現在のリズムは、各小節の先頭、1拍目でbdが演奏されています。これを以下のように変更してみましょう。

```hs
d1 $sound "bd bd"
```

すると、1拍目と3拍目に演奏されるようになります。つまり、1行に書いた楽器がその小節の中で均等な間隔で演奏される仕組みです。これと同じリズムを以下のように書くこともできます。

```hs
d1 $sound "bd*2"
```

さらに

```hs
d1 $sound "bd*4"
```

というようにどんどん分割していけるわけです。

もちろん複数の音を鳴らすことも可能です。バスドラムとスネアを交互に鳴らしてみます。

```hs
d1 $ sound "bd:1 sn:3"
```

休符は ~ で表現します。

```hs
d1 $ sound "bd:1 sn:3 ~ sn:3"
```

演奏している音を止めるときはsilenceを指定します。

```hs
d1 silence
```

## リズムを分割、ネスト

もう少し複雑な例をみてみましょう。

```hs
d1 $ sound "bd:3 [sn:1*2] ~ bd:3"
```

ここで新たに大括弧 [] が出てきています。これは、分割されたリズムの中でさらに分割することを意味します。この例では2拍目でスネアを2回演奏することを意味します。さらにこれを入れ子状に複雑に組み合せていくことも可能です。

```hs
d1 $ sound "bd [[sn:1*2] bd] [sn:1 [bd*2]]"
```

## 音を混ぜる

"stack"という命令を使うと、1つのトラックの中に複数のリズムを重ねていくことが可能です。

```hs
stack[patten1, pattern2, pattern3....]
```

というように書いていきます。実際には、例えば以下のようになります。コンマで区切ってどんどんパターンを追加してMixしていけます。

```hs
d1 $ stack[
  sound "bd:3 [sn:1*2] ~ bd:3",
  sound "bass ~ bass:3 ~",
  sound "[~ cp]*4"
]
```

トラックごとに、音量や定位(パン)を指定することも可能です。|+| という記号で繋いで指定していきます。最後のトラックはランダムにパンを指定しています。

```hs
d1 $ 
stack[
  sound "bd:3 [sn:1*2] ~ bd:3" |+| gain "1.0",
  sound "bass ~ bass:3 ~" |+| gain "1.2",
  sound "[~ cp]*4"|+| gain "0.9" |+| pan rand
]
```

## モジューレーション

Tidalではパート全体に対して、様々な変化を加える関数が多数用意されています。これらを組み合わせるととても複雑なパターンが生まれます。例えば、jux という関数は左右で音をずらしたり反転させることで、複雑な定位を生成します。

```hs
d1 $ 
jux (rev) $
stack[
  sound "bd:3 [sn:1*2] ~ bd:3" |+| gain "1.0",
  sound "bass ~ bass:3 ~" |+| gain "1.2",
  sound "[~ cp]*4"|+| gain "0.8" |+| pan rand
]
```

gap や chop を使うと、音が細かくぶつ切りになります。

```hs
d1 $ 
jux (rev) $
chop 16 $
stack[
  sound "bd:3 [sn:1*2] ~ bd:3" |+| gain "1.0",
  sound "bass ~ bass:3 ~" |+| gain "1.2",
  sound "[~ cp]*4"|+| gain "0.8" |+| pan rand
]
```

毎回モジュレーションをかけるのではなく、特定のタイミングのみで適用することも可能です。たとえば、毎回4小節ごとにchopをかけ、6小節ごとにgapをかけてみましょう。everyという命令を使います。


```hs
d1 $ 
jux (rev) $
every 4 (chop 16) $
every 6 (gap 16) $
stack[
  sound "bd:3 [sn:1*2] ~ bd:3" |+| gain "1.0",
  sound "bass ~ bass:3 ~" |+| gain "1.2",
  sound "[~ cp]*4"|+| gain "0.8" |+| pan rand
]
```

さらに、juxのずらし方をすこしずつ変化させてみます。iterという命令をつかうと、数が小節ごとに増加していき指定した数でサイクルします。例えば、iter 4と指定すると、0, 1, 2, 3, 0, 1, 2, 3... というパターンが生まれます。

```hs
d1 $ 
jux (iter 4) $
every 4 (chop 16) $
every 6 (gap 16) $
stack[
  sound "bd:3 [sn:1*2] ~ bd:3" |+| gain "1.0",
  sound "bass ~ bass:3 ~" |+| gain "1.2",
  sound "[~ cp]*4"|+| gain "0.8" |+| pan rand
]
```

基本から徐々に積み上げていき、最終的にはとても複雑なリズムが生成されました!

- https://soundcloud.com/tadokoro/tidal-tutorial01

「[Tidalでライブコーディング! - 応用編 : SuperColliderとの連携](http://qiita.com/yoppa/items/ac04af38625e1c9027e5)」につづく!