Contents
動画
コード
d1 $ sometimesBy "0.2 0.1 0 0.5" ((# coarse "<16 32>").(# bpf 500))
$ jux (iter "2 <1 4>".rev)$ hurry "<0.5 2> 3 1*3 <1 -2>" $ iter "<4 3>"
$ chunk 2 (hurry "4 0.5 -0.9 -4" .
(|*| room "0.8 0.1*10 0.5!3").(# sz "<0.9 0.1 0 0.3>"))
$ s "Kick:1 Hihat:5 Snare:5 Chord:19 Vocal:1 SFX"
# cut "<1 1 1 0>" |+ n "<0 1 2 3>" # speed (range 0.2 0.7 rand)
# pan (rand) # shape 0.5
hush
このコードではTidalCyclesデフォルト音源以外の音源を使用していますので、そのままコピペしても再生できませんのでご注意ください。
#と|+|と|*|の解説 演算子
概要
この解説は、このuserbaseのページを参考に作っています。
#や|+|などは、演算子と呼びます。
演算子を使って、パターンの「構造(structure)」と「値(value)」を結合することができます。
これを理解するにあたり、パターンの「構造」と「値」は分けて考える必要があります。
パターンの構造とは、d1 $ sound “bd hh sn hh” を再生すると、1サイクルの中でbd,hh,sn,hhの順番で、合計4回音が出ます。このタイミングのことをパターン構造と呼びます。
値とは、# gain 1.2 の”1.2″や、# speed 2 の”2″の数字のことです。
まず、この2つを区別して考えます。
演算子の種類
演算子は、以下の引用画像のような種類があります。
ちなみに、#は、この表の |> と全く同じです。
この表の見方は、以下です。
Function:演算子の機能。「値(value)」をどう計算するか決める。
加算する、除算する、掛け算する、割り算する、あまりを取る、左の値にする、右の値にする、がある。
Both,Left,Right:「構造(structure)」をどちら側から取るか、を決める。Leftは、左側のパターン構造が有効、Rightは、右側のパターン構造が有効、Bothは、両方のパターン構造を合算。
#と|>
まずは、使い慣れている#について説明します。
先程、#は|>と同じと記載しました。
|> (#)は、表を見ると、”Right values”つまり「右の値」を有効にし、「左のパターン構造」を有効にします。
d1 $ s "sine sine" # speed "1"
d1 $ s "sine sine" # speed "1 2 3 4"
例えば1行目について、#は右の「値」つまりspeedの値は「1」となります。
また|>は左のパターン構造が有効なので、”sine sine”のパターン構造が有効になります。
2行目では、# speed “1 2 3 4″のようにパターン構造を指定しても、#はパターン構造を左から取るので、再生されるパターン構造は変わりません。(つまり、”sine sine”というパターン構造で再生される。)
ただ、右の値が有効なので、1回目のsineはspeed 1、2回目のsineはspeed 3で再生されます。
また、以下のように、#を|>に変えても、再生される音は変わりません。
d1 $ s "sine sine" |> speed "1"
d1 $ s "sine sine" |> speed "1 2 3 4"
>| 右のパターン構造を有効にする
では、 |> を >| に変えるとどうなるでしょうか。
|> は左側のパターン構造が有効ですが、>|は右側のパターン構造が有効になります。
以下の例を実行してみてください。
d1 $ s "sine sine" >| speed "1"
d1 $ s "sine sine" >| speed "1 2 3 4"
1行目はsineが1サイクルに1回だけ再生、2行目はsineが4回再生されます。
つまり、”sine sine”という左側のパターン構造ではなく、”1″や”1 2 3 4″という右側のパターン構造が有効になった、ということです。
このように演算子を活用して構造と値を変えることができるので、以下のように、sやsound以外でパターン構造を組むことが可能になります。
例
d1 $ s "sine" >| speed "1 2*5 <3 5*4> 4*2"
パターン構造の合算(Both)
では、|>でも>|でもなく、|>|とするとどうなるでしょうか。
この場合、左右のパターン構造を合算したパターン構造になります。
例えば以下のコードを再生します。
d1 $ s "sine sine" |>| speed "1 2 3"
右の値をとりつつ、左右の構造を合算した構造になるので、最終的に以下のような構造になります。
| 1 | 1 | --Left structure "sine sine"
|>| | 1 | 2 | 3 | --Right structure "1 2 3"
= | 1 |2|2| 3 | --Both structure
結果的に再生される音は、以下と同じになりますね。
d1 $ s "sine [sine sine] sine" # speed "1 [2 2] 3"
|+| 加算
では、今度は|+| , + , |+ , +|について見てみます。
これらの演算子は、「値」を加算、つまり足し算します。
もちろん、先程のように|+や+|や|+|と記載することで、パターン構造も指定できます。
以下のコードを考えてみます。
d1 $ s "sine" |+| speed "1 2" |+| speed "2"
|+|は、表より、値の加算を表しますので、以下のようになります。
d1 $ s "sine" |+| speed "1 2" |+| speed "2"
| 1 | 2 |
|+| | 2 |
= | 3 | 4 | -- Both structure
同様に、|+は、以下になります。
d1 $ s "sine" |+| speed "1 2" |+ speed "2"
| 1 | 2 |
|+ | 2 |
= | 3 | 4 | --Left structure
同様に、+|は以下になります。
d1 $ s "sine" |+| speed "1 2" +| speed "2"
| 1 | 2 |
+| | 2 |
= | 3 | --Right structure
その他の演算子
他にも、|*|や|/|や|%|がありますが、上記の加算と同じように、*は掛け算、/は割り算、%は割り算の余り、を値に対して計算します。
右側と左側のどちらのパターン構造を有効にするかは、”|” の位置によって決まります。
参考
ここから先の記事は、実際の動作確認してみた記録を残していますので、読み飛ばしても構いません。
初期値
d1 $ s “sn”だけでspeedを特に指定しない場合、speedの初期値は1か0が入っている?と最初は推測していました。
しかし、以下コードの挙動を確認したところ、speedはデフォルトで1や0が入力されているのではなく、|+| speedや|-| speed を定義した時点で入力した値が反映されることがわかりました。
d1 $ s "sn" |+| speed "0 1*2 2 3"
d1 $ s "sn" |-| speed "0 1*2 2 3"
d1 $ s "sn" |*| speed "0 1*2 2 3"
d1 $ s "sine" |/| speed "0 1*2 2 3"
そのため、|+| speed “1”と定義したときに初めてspeedに”1″が反映されるということです。
everyを使った場合
everyなどを使い、soundより前に#を使ったときはどうなるでしょうか。
以下コードを実行してみてください。
d1
$ every 1 (# speed "2")
$ sound "bd hh sn sine"
2のスピードで”bd hh sn sine”のパターンが再生されます。
このとき、#は、「右の値」を有効にし、「左のパターン構造」を有効にします。
右の値、つまりspeed “2”が適用されます。
ただこのとき、左のパターン構造とはなにか、という話になりますが、ここでの左のパターン構造は、”bd hh sn sine”になるようです。
この仕様の詳細はuserbaseの資料からは読み解けませんでしたので、機会があれば追記します。