はじめに
TidalCyclesは、Haskellライクなコードによってリズムパターンを生成できるソフトウェアです。
個人的にTidalCyclesで作曲していて、記事も書いているのでこちらもぜひみてください!
ある条件のサイクル数のときに処理を実行する
公式のドキュメントにいろいろな方法が紹介されています。
またこれらについて、Qiitaでも詳しく記事を書いているので是非みてください
ある条件を満たしたときに処理を実行する
ただ、この方法だと、サイクル数起点でしか処理・エフェクトを適用できません。
例えば以下のように「d1,d2だけに同時にローパスフィルタをかける」みたいなことがしたいとします。
do
let
elem' xs x = elem x xs
mod' y x = mod x y
d1
-- $ (# lpf 400)
$ ifp ((elem' [0..2]).(mod' 4)) (# up "<0,-5>") (# up "<-1,-3>")
$ s "house!2 [~ house] ~ house"
# n 1 # gain 0.5 # room 0.2 # sz 0.8
# hpf (range 50 300 (slow 4 $ sine)) # pan 0.3
d2
-- $ (# lpf 2000)
$ s "~ ~ ~ tabla" # n (choose [15,3,4,5,10]) # pan rand
d3
$ s "click:2*2" # lpf 500 # gain 1.1
2つのコメントアウトを外してローパスフィルターをかけるのは面倒なので、例えば以下のような書き方ができると使い勝手がよさそうです
do
let
lpfOn = 0
elem' xs x = elem x xs
mod' y x = mod x y
d1
$ ifb (lpfOn==1) (# lpf 400)
$ ifp ((elem' [0..2]).(mod' 4)) (# up "<0,-5>") (# up "<-1,-3>")
$ s "house!2 [~ house] ~ house"
# n 1 # gain 0.5 # room 0.2 # sz 0.8
# hpf (range 50 300 (slow 4 $ sine)) # pan 0.3
d2
$ ifb (lpfOn==1) (# lpf 2000)
$ s "~ ~ ~ tabla" # n (choose [15,3,4,5,10]) # pan rand
d3
$ s "click:2*2" # lpf 500 # gain 1.1
letのlpfOnを0から1に変更するだけでd1とd2にローパスフィルターがかかるという仕組みです。
ということで、こういうことができるifb関数をつくってみました。以下のコードをBootTidal.hsに追記してTidalCyclesをrebootすればifb関数が使えます。
:{
ifb :: (Bool) -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a
ifb test f p = splitQueries $ p {query = apply}
where apply st | test = query (f p) st
| otherwise = query p st
:}