LoginSignup
1
2

More than 1 year has passed since last update.

【TidalCycles】指定したサイクル数のときのみの処理を実行

Posted at

はじめに

TidalCyclesは、Haskellライクなコードによってリズムパターンを生成できるソフトウェアです。
個人的にTidalCyclesで作曲していて、記事も書いているのでこちらもぜひみてください!

ある条件のサイクル数のときに処理を実行する

公式のドキュメントにいろいろな方法が紹介されています。

every

every関数を用いるとevery n 処理とした場合に、nの倍数サイクルごとに処理が適用されます。

たとえば以下の例だと0, 3, 6, 9, 12,...サイクル目にrevが適用されます

d1 $ every 3 rev $ n "0 1 [~ 2] 3" # sound "arpy"

every'

every関数ではnの倍数サイクルごとに処理されましたが、every'を用いることで、(nの倍数 + m)サイクルごとの処理が可能になります。

たとえば以下の例だと1, 4, 7, 10, 13,...サイクル目にrevが適用されます

d1 $ every' 3 1 rev $ n "0 1 [~ 2] 3" # sound "arpy"

when

when関数ではwhen 条件 処理としたときに、条件がTrueの場合のみ処理が適用されます。

ちなみにwhen関数のドキュメントにおける使用例が最初みたときにすぐ理解できなかったため、これは別記事に詳細にかきました。

when関数の型定義は以下です。

Type: when :: (Int -> Bool) -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a

この(Int -> Bool)部分は、Intを引数としてBoolを返す関数を設定してあげればいいので、たとえば>=2などが使えます。ちなみにこのIntとはサイクル数のことを指しているので>=2と設定すると「サイクル数が2以上のとき」という意味になります。

そのためたとえば

d1 $ when (>=2) (|> speed 2) $ s "notes:2*2 house:5*3"

のようにすれば、サイクル数が2以上になると、speedが2となるので音程が1オクターブあがるのがわかると思います。

whenmod

whenmod関数を用いると、whenmod n m 処理とした場合に、nサイクル中のmサイクル以降のみ処理が適用されます。

たとえば以下の例だと、fast 2が適用されるのは4,5,6,7,12,13,14,15,...サイクル目です。

d1 $ whenmod 8 4 (fast 2) (sound "notes:2*2 house:5*3")

具体的なサイクル数を指定して処理を実行

まず今回の処理はわかりやすいように0サイクル目からスタートさせたいのでresetCyclesTo関数を定義します。

import qualified Sound.Tidal.Tempo as T

resetCyclesTo n = T.changeTempo (sTempoMV tidal) (\t tempo -> tempo {T.atTime = t, T.atCycle = n})

resetCyclesTo関数についてはこちらの記事をご覧ください。

上で紹介したwhen関数を用いれば、「4サイクル目のみfast 2させたい」ということも実現できます。

do
  resetCyclesTo (-0.05)
  d2 $ when (==4) (fast 2) $ sound "notes:2*2 house:5*3"

もう少し変わった要件として、「1, 2, 5, 6サイクル目のみfast 2させたい」というときには以下のように実現できます。

do
  resetCyclesTo (-0.05)
  let
    elem' xs x = elem x xs
  d2 $ when (elem' [1,2,5,6]) (fast 2) $ sound "notes:2*2 house:5*3"

条件を「[1,2,5,6]にサイクル数が含まれているとき」としたいので、elem関数の第一引数と第二引数を入れ替えたelem'関数を定義しています。

1
2
0

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
1
2