LoginSignup
0

More than 1 year has passed since last update.

【TidalCycles】when関数の使い方

Posted at

はじめに

公式ドキュメントのConditionsのページを見ると、everywhen, 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のエフェクトを同時に実行できます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0