はじめに
公式ドキュメントのConditionsのページを見ると、every
やwhen
, whenmod
などのサイクル数を指定してそのときのエフェクトなどを設定する関数の説明と、その具体例が載っています。
when関数の基本的な使い方
他の関数についての説明はわかりやすかったものの、個人的にHaskellの知識が浅いこともあってwhen関数の例の理解に時間がかかったのでまとめておきます。
まずwhen関数の型定義は以下です。
Type: when :: (Int -> Bool) -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a
この(Int -> Bool)
部分は、Int
を引数としてBool
を返す関数を設定してあげればいいので、たとえば>=2
などが使えます。ちなみにこのInt
とはサイクル数のことを指しているので>=2
と設定すると「サイクル数が2以上のとき」という意味になります。
具体的にはこんな感じにかけます。
do
resetCyclesTo (-0.05)
d1 $ when (>=2) (|> speed 2) $ s "notes:2*2 house:5*3"
サイクル数が2以上になると、speedが2となるので音程が1オクターブあがるのがわかると思います。
ちなみにresetCyclesTo
関数については以下の記事を参照してください。resetCyclesTo (-0.05)
で「0サイクル目から再生」という意味になります。
when関数のドキュメントでの具体例
公式ドキュメントでは以下の例が記載されています。これは、「サイクル数文字列に数字の4が含まれている場合、striate 4エフェクトを適用」する、という意味になるのですが、自分はなぜこの意味になるのかわかっていませんでした。(.showってなんだ??となってました)
d1 $ when ((elem '4').show) (striate 4) $ sound "hh hc"
結論からいうと(elem '4').show
は合成関数で、引数x(Int)に対して、
elem '4' (show x)
という意味になります。いま引数xはIntなので、これをshow関数によって文字列化した後、elem関数の処理が走るわけです。
ちなみになぜこんな記法になっているかというと、数学における合成関数の書き方が
f(g(x)) = f∘g(x)
のように∘
でカッコを省略表現されるのと同じように、∘
の代わりに.
を使っている、といった感じなようです。
ためしに
elem '4' (show 14)
などのようにしてTidalCycles上で実行してみるとコンソールにTrueが返ってくるはずです。
エフェクトの合成
合成関数を使えばエフェクトも複数重ねられます。例えば
d1
$ every 4 (jux rev . fast 2 .(# speed 1.5))
$ s "notes:2*2 house:5*3"
とすれば、4サイクルに1回juc rev
, fast 2
, # speed 1.5
のエフェクトを同時に実行できます。