Tidalcycles functionの使い方(随時更新)

TidalcyclesのFunctionについて、具体例とともに解説していきます。好きなときに随時更新していきます。

room/sz

いわゆるリバーブです。とりあえずかけると雰囲気がでます。

代表的な使い方
d1 $ s "bd*4" # room 0.8 # sz 0.8
記述# room x
(xは数字、基本は1以下)
# room 0.8
説明リバーブのセンド量を決める。xが大きいほどリバーブが深くかかる。
メモroomは、room reverbのroom。
記述# sz x
(xは数字、基本は1以下)
# room 0.8 #sz 0.8
説明リバーブタイムを決める。xが大きいほどリバーブタイムが長くなる。
メモszは、sizeの略。roomと組み合わせて使う。szだけでは使えない。

応用


応用1 リバーブタイムを可変する
d1 $ n "{0 2 3 2  0 3 4 5  0 3 5 3  0 5 3 2}%16" # s "house"
# room (slow 16 $ range 0.2 0.95 saw) # sz 0.95

応用2 たまに長いリバーブをつける
d1 $ n "{0 2 3 2  0 3 4 5  0 3 5 3  0 5 3 2}%16" # s "house"
# room "0  <0.95 0 0 0> 0 0" # sz 0.95

応用3(破壊的)
d1 $ n "{0 2 3 2  0 3 4 5  0 3 5 3  0 5 3 2}%16" # s "house"
# room (fast 2 $ range 4 0.1 sine) # sz (slow 6 $ range 0 3 sine)

応用1では、リバーブタイムをrangeを使って可変させています。slow 16 かつsawなので、16サイクルかけてゆっくりとリバーブが深くなっていきます。

応用2では、普段はroomを0にしておいて、ここぞというときだけ長いリバーブをかけるやり方です。4サイクルごとの2拍目に長いリバーブがかかります。

応用3では、roomとszを1以上にしています。リバーブがどんどん重なっていってカオスになります。音量が上がるので注意してください。

また、使い方に癖がありますが、dryというfunctionもあります。

記述# dry x
(xは数字)
# room 0.8 # dry 0.5
説明数字でリバーブのwet/dryの量を決める。
メモroomと組み合わせて使う。dryだけでは使えない。

この挙動が少し変わっていて、dry 0からdry 1まで徐々に上げていくと、リバーブが減っていき、dryな音になります。しかし、dry 2とすると、途端にwet 100%となりました。
wet / dryの割合は、以下のようになります。
(数字は私の感覚)
# dry 0 -> 50/50
# dry 0.5 -> 25/75
# dry 1 -> 0/100
# dry 2 -> 100/0
# dry 3 -> 200/0
# dry 4 -> 300/0

within

functionを1サイクルの特定の範囲にだけ反映したいときに使用します。範囲は数値で指定できます。

d1
$ within (0,0.25) (# speed 4)
$ s "[bass*16,bd*4]"
概要within (x,y) (function)
x,yは1以下の数字で、x<y<1になるようにする
within (0,0.25) (# speed 2)
説明functionを反映したいサイクル範囲を指定する。
例の場合、0から0.25サイクルまで# speed 2が反映される。
メモwithinは、「範囲内で」という意味。
( )内の数字を,(カンマ)で区切ることに注意。

x,yの値を1以上にしても1として扱われます。

x,yにはrange 0 1 sineやchoose[0,0.2]やrandは使用できず、実数を入れることしかできません。

応用

応用1 4サイクルの1拍目にだけリバーブをかける
d1
$ every 4 (within (0,1/16) (# room 2))
$ s "[bass*16,bd*4]"  # sz 2

応用2 4サイクルの頭だけフレーズを変える
d1
$ every 4 (within (0,4/16) (# up "[3 1 0 12] ~ ~ ~"))
$ s "[bass*16,bd*4,sn:2(2,4,1),hc(14,16)]" 

応用3 4サイクルごとに1拍目の音を消す
d1
$ every 4 (within (0,0.2) (|* gain 0))
$ slice 8 "0 1 2 3 4 5 6 7" $ s "breaks125"

応用4 4サイクルごとにsound自体を変える
d1
$ every 4 (within (0,0.2) (>| s "bd*64"))
$ slice 8 "0 1 2 3 4 5 6 7" $ s "breaks125"

応用5 4サイクルの最後にフィルを入れる
d1
$ whenmod 4 3 (within (10/16,1) (|*| speed "0.8*32"))
$ slice 8 "0 1 2 3 4 5 6 7" $ s "breaks125" # cut 1

x,yの値は分数が使えるので、1/16などにすると使い勝手がいいです。

応用5は、フィルに使えるので便利そうです。

while

withinと同様に、functionを1サイクルの特定の範囲にだけ反映したいときに使用します。範囲はtとf(trueとfalse)で指定します。withinよりも直感的に設定できるので、個人的にはこちらをおすすめします。

d1
$ while "f f f t" (# speed 4)
$ s "[bass*16,bd*4]"
概要while “(tとfのパターン)” (function)
while “f f f t” (# speed 2)
説明functionを反映したいサイクル範囲をtとfを使ったパターンで指定する。
例の場合、1サイクルのうちの3/4以降だけ# speed 2が反映される。
メモwhile “t(3,8)” (# speed 2) というように、ユークリッドシーケンスも使える。”t(3,8)”はt f f t f f t f”と同じ意味。

withinと同様に、whileを使えば、1サイクルの好きなタイミングだけにfunctionを適用できます。

d1
$ whenmod 4 3 (while "f f f t" (|*| speed "0.8*32"))
$ slice 8 "0 1 2 3 4 5 6 7" $ s "breaks125" # cut 1

spread/fastspread/spreadChoose

あるパターンに対して、複数のfunctionを一つずつ反映したい場合にspreadを使います。(同時に適用ではなく)

d1
$ spread ($) [fast 2,rev,(# speed 0.5)]
$ s "bd hc sn:2 hc*2"
記述spread ($) [function1,function2]
spread ($) [fast 2,rev,(# speed 0.5)]
説明spread ($)のあとに、functionをリスト化して使う。
上記コードだと、1サイクル目はfast 2がパターン”bd hc sn:2 hc*2″に反映され、2サイクル目はrevがパターンに反映され、3サイクル目に# speed 0.5が反映される。
メモfunctionは2つ以上でもOK。
Control function(gain,panなど)を使う場合は( # pan 0.1)のように、( )と#を使う。
spread ($)とspreadfは同じ。

「リスト化」とは、[ ]で囲い、, (カンマ)で区切ることを指します。

「リスト化する」といったら、[ xx , yy , zz ] という形式にする、と覚えておくと便利です。

今後も「リスト化する」という場面は出てきます。

また、($)という見慣れない文字が出ますが、忘れずにつけてください。

応用

応用1 spreadで複数のfunctionを使う
d1
$ whenmod 8 4 (spread ($) [fast 2,rev,(# lpf (rangex 200 20000 saw)),(|+| speed "1*8 0.5*6 2*16 3*8")])
$ slice 8 "0 1 2 3 4 5 6 7" $ s "breaks125" # cut 1

応用2 spreadChooseでfunctionをランダムにする
d1
$ whenmod 8 4 (spreadChoose ($) [fast 2,rev,(# lpf (rangex 200 20000 saw)),(|+| speed "1*8 0.5*6 2*16 3*8")])
$ slice 8 "0 1 2 3 4 5 6 7" $ s "breaks125" # cut 1

応用3 fastspreadで複数のfunctionを1サイクルの中に反映する
d1
$ whenmod 8 7 (fastspread ($) [fast 2,rev,(# lpf (rangex 200 20000 saw)),(|+| speed "1*8 0.5*6 2*16 3*8")])
$ slice 8 "0 1 2 3 4 5 6 7" $ s "breaks125" # cut 1


応用4 fastspreadを複数用意しておき、それをspreadでまとめる
let 
effect1 = fastspread ($) [fast 2,rev,(# lpf (rangex 200 20000 saw)),(|+| speed "1*8 0.5*6 2*16 3*8")]
effect2 = fastspread ($) [(# delay 0.9),(# room 0.95),fast 2,(# speed "-1")]
effect3 = fastspread ($) [(# coarse "32 16 2 32"),(# crush "1 4 16 8"),(# squiz "8 16 1 2"),(# distort 0.9)]
effect4 = fastspread ($) [ply 2,const $ s "bd*32"]

d1
$ whenmod 8 4 (spread ($) [effect1,effect2,effect3,effect4])
$ slice 8 "0 1 2 3 4 5 6 7" $ s "breaks125" # cut 1 # shape 0.8
概要spreadChoose ($) [function1,function2]
spreadChoose ($) [fast 2,rev]
説明パターンに反映されるfunctionがランダムに選ばれる。例の場合、サイクルごとにfast 2かrevのどちらかが選ばれる。fast 2が連続する場合もある。
メモランダムになるので予測できず面白い反面、ランダムのため同じfunctionが連続すると曲にハマらないことがある。
spreadChooseとspreadrは同じ。
概要fastspread ($) [function1,function2]
fastspread ($) [fast 2,rev]
説明1サイクルの中で、リスト化したfunctionが順番に反映される。例の場合、1サイクルの前半はfast 2が反映され、後半はrevが反映される。
メモfunctionが1サイクル内で次々に切り替わるので面白い効果が得られる。Tidalcyclesの良いところを引き出せるおすすめfunction。

spread ($)とspreadfは同じなので、spreadf と書いたほうが簡単ですが、それ以外のfastspreadやspreadChooseには($)を付ける必要があるので、($)をつけるかつけないかを迷うよりは、「spread系のときは必ず($)をつける」と覚えたほうがミスを避けられると思います。

seqPLoop

seqPLoopは、シーケンスを意図通りループさせたいときに使用します。DAWのようにトラックの抜き差しをしたい場合に便利です。

d1 $ seqPLoop[
(0,3,s "bd sn:2 bd*2 sn:2"),
(1,4,s"hc*8"),
(0,4,s"bass/4")
]
概要$ seqPLoop[
(x1,y1,function+pattern),
(x2,y2,function+pattern),
(x3,y3,function+pattern)
]
$ seqPLoop[
(0,3,s “bd*4”),
(1,4,s”hc*8″),
(0,4,s”bass/4″)
]
説明このループは4サイクルを繰り返す。その中で、bd*4は最初のサイクル(0サイクル)から3サイクルの直前まで再生される。hc*8は、0サイクルは再生されず、1サイクルの頭から3サイクル目まで再生される。bassは、/4になっているので0サイクル目だけ再生される。
なお、このLoopのサイクル数は、y1,y2,y3の中で一番大きい数によって決まる。例の場合はサイクル数4となる。
メモこれを使うと、曲の中でトラックの抜き差しができるので、1曲を完成させるのに向いている。例えば曲全体が24小節の場合、最初の4小節はイントロとして主旋律だけにし、5小節目からドラムとベースを入れ、アウトロの2小節は主旋律だけにする、といった使い方ができる。

応用

応用 曲の展開を作る
setcps(130/60/4)

d1 $ seqPLoop[
(2,14,s "[bd*4,sn:2(2,4,1)]" # crush 4)
,(4,14,s "hc*16" # gain "[0.9 0.8 0.9 0.7]*4")
,(0,14,s"bass1:1*16" # up "0 0 3 5  0 0 5 7  0 1 0 -2 0 0 12 7" 
# lpf (rangex 200 1000 rand) # lpq 0.3 # sustain (range 0.05 0.2 rand) # cut 1)
,(8,16,whenmod 8 6 (off 0.065 (# speed 2)) $ s"arpy*16"
# up "0 5 7 0  <3 0> <2 12> 0 12  7 5 0*<2 3> <3 5>  0 7 12 14*<4 1>")
]
# shape 0.5 # room 0.2

応用例では、よくある1曲の流れを作りました。

ベースだけでスタートし、2サイクルからbdとsnが入り、4サイクルからhcが入り、8サイクルからarpyが入ります。

14サイクルでbd,sn,hc,bassは止まり、最後の2サイクルではarpyだけが再生されます。

ここでのポイントは、arpyのwhenmodです。

最後の2サイクルだけoff 0.065 (# speed 2)をかけたかったのですが、whenmod 16 14 とすると、off〜 は反映されませんでした。whenmod 8 6とすると、off~は反映されました。

つまりこの場合、8-16サイクルだけ、whenmodとしてカウントされていることになります。

accelerate

accelerateは、再生するサンプルの再生速度を徐々に加速していくというエフェクトです。

d1 $ s "sine(3,8)"
# accelerate 1
概要# accelerate x
xは任意の数字
# accelerate 1
説明再生するサンプルを再生開始時から徐々に再生速度を加速していき、ピッチがだんだん上がっていくというエフェクト。1,2,3…はスピードアップなので、音程は徐々に高くなる。-1,-2,-3…はスピードダウンなので、音程はじょじょに低くなる。音色が大きく変わるので面白い効果が期待できる。
メモ数字が大きいと音が大きく変わるが、数字が大きすぎると変化が大きすぎてうまくいかないので、最初は1や2から試すのがおすすめ。

応用

d1
$ s "moog(32,32)"
# note "[0,4,7,9]"*2
# accelerate (slow 2 $ range (-0.03) 0.03 sine)
# legato 1
# room 0.9 # sz 0.9  # legato 1

応用のように、0.03や-0.03などの小数点を活用すると、カセットテープやレコードのような雰囲気の揺れを作ることができます。

jux

juxは、右チャンネルの音だけを変化させるfunctionです。juxは単調なパターンを複雑に変化させられるので、よく使われます。

d1 $ jux rev
$ s "[bd(3,8),moog(3,8)]" # legato 1
概要jux (function)
jux rev
説明juxtapose(並列する)の略。右チャンネルだけfunctionを適用する。このとき、左チャンネルはfunctionを適用せずそのまま再生される。
メモよく使われるのが jux rev とすると、右チャンネルだけパターンを逆再生する。このとき、左チャンネルはパターンを順方向に再生する。たった6文字で音が複雑に絡み合い複雑なパターンを構築できるのがメリット。
他にも、jux (0.125 <~)とすると、右チャンネルが0.125サイクル分後ろにシフトし、左チャンネルはそのまま再生する。

応用

応用1
d1 
$ jux (0.01 <~)
$ s "[bd(3,16,[0,-3,-6]),sn:2(2,4,1),hc(16,16)]"

応用2
d1 $ every 2 (jux (0.125 <~))
$ s "[bd(3,16,[0,-3,-6]),sn:2(2,4,1),hc(16,16)]"

応用1では、右チャンネルだけ短時間だけシフトすることで、左右に広がった感じになります。

応用2では、右チャンネルだけ0.125サイクルだけ後ろにシフトすることで、パターンが複雑になります。

crush

crushは、ビットクラッシャーのエフェクトです。音が歪んだ感じになります。

d1 $ s "bd hc sn:2 hc" 
# crush 2
概要# crush x
xは整数。
# crush 2
説明ビットクラッシャー。1から16までの値を取る。1だと破壊的。16だと違いがわからない。
メモ値が大きいほど効果が薄く、1が一番破壊的な音になる。

応用

d1 $ s "bd(5,16,[0,1,5,7])"
# crush (irand 8)

応用では、# crushの値をirandで変化させることで音色を大きく変化させています。

coarse

coarseは、サンプルレートを設定するエフェクトです。音を意図的に劣化させることで独特の雰囲気が出せます。

d1 $ s "bd hc sn hc*2" # coarse 32
概要# coarse x
xは整数。
# coarse 16
説明サンプルレートを設定する。1だともとのサンプルレート、2だと半分のサンプルレート、3だと1/3のサンプルレートになる。
メモ例えば48kHzのサンプリングレートのwavに対して、# coarse 3にするとサンプリングレートは16kHzに劣化する。ただこれによりザラザラとした質感の音になり、HipHopなどには合う音になることもある。

応用

応用1
d1 $ s "[bd hc sn hc]*2" # coarse "100 32 16 32"

応用2
d1 $ s "[bd hc sn hc*2]*2" # coarse (irand 128)

応用1では、coarseを”100 32 16 32″と変化させてわざと激しく劣化させて、ザラザラした音にしています。

応用2では、coarseにirand 128を適用して、0-128の範囲でランダムな値を取るようにしてランダム性をもたせています。

distort

distortは、ディストーションのエフェクトです。音が歪みます。

d1 $ s "bd hc sn hc*2" # distort 0.8
概要# distort x
xは基本的に0-1の範囲の値。
# distort 0.5
説明ディストーションのエフェクトがかかる。
メモ1にするとかなり歪む。

応用

d1 $ s "[bd*8,[~ hc]*4]" # distort (saw)

応用では、distortの値をsaw(0から1まで徐々に値が増えていく)とすることで、ディストーションが1サイクルの中で徐々に強くなっていきます。

shape

shapeは、おそらくコンプレッサーのようなエフェクト。音に迫力が出て、音がまとまる。

d1 $ s "bd hc sn hc*2" # shape 0.8
概要# shape x
xは基本的に0-1の範囲の値。
# shape 0.5
説明コンプレッサーがかかり、音が大きくなる。
メモ突然大きな音が出て耳を痛めないように、0.5程度から試すとよい。1以上の値にはできない

個人的には、shape 0.5くらいにすると、音のまとまりがよくなり迫力が出るので、すべてのトラックに使用しています。コンプレッサーはDTMでは一般的に非常によく使われます。

chop/loopAt

d1 $ loopAt 1 $ chop 16 $ s "breaks125"
概要chop x $ s “pattern”
chop 16 $ s “breaks125”
説明xの数だけpattern内のサンプルを分割し、そのx個のサンプルを1サイクルの中に順番に並べて再生する。例の場合、breaks125というサンプルを16個に分割し、分割した16個のサンプルをすべて1サイクルの中に順番に並べることになる。
メモ例えばbreaks125というサンプルは、1小節の16ビートドラムループが入っているので、xは16とか32に設定すると使いやすい。サンプル自体の長さが短い(bdなど)と効果がわかりにくい。

breaks125などの16ビートのドラムサンプルは、1小節16拍から成り立っているので、chop 16とすれば、各拍の音を抽出できます。そのため、chop 16にしてテンポを早くしても遅くしても、違和感なく再生できます。

ただbreaks125というサンプル自体のbpmは125なので、以下のようにすると、2分割したサンプルが順番に再生されますが、間が空いてしまい違和感のある音になってしまいます。

setcps (90/60/4)

d1 $ chop 2 $ s "breaks125"

そのため、ドラムループをchopする場合は、ドラムが何ビートで、何小節のものかを確認するほうが扱いやすいです。

例えば8ビートで2小節のドラムループであれば、chop 16としておけばよさそうですし、16ビートで4小節のドラムループであれば、chop 64とすればよさそうです。

またドラム以外でも、長めのサンプルやサンプリングした音源をchopするのも楽しいです。

応用

例えば、chop 4 $ s “1secsample” という例を考えます。

分割されたサンプルについて、例えば1秒のサンプルを4等分すると、0.25秒のサンプルが4つできます。これをA,B,C,Dと仮に名付けると、1サイクルの中でA,B,C,Dの順に再生されます。A,B,C,Dが再生されるタイミングは、1サイクルを4等分したタイミングとなります。($ s “A B C D” みたいになる)

このchop 4 $ s “1secsample”を速いテンポで再生すると、Aの再生が終わっていないのにBの再生が始まるので、AとBが重なる区間が発生します。

遅いテンポで再生すると、Aの再生が終わり、無音区間が空いてからBの再生が始まります。

この挙動を改善するために、loopAtを使うとよいです。

setcps (90/60/4)

d1 $ chop 2 $ s "breaks125"

d1 $ loopAt 1 $ chop 2 $ s "breaks125"

loopAtを使った場合と使っていない場合を比較してみてください。loopAtを使わないと、間が途切れますが、loopAtを使うと途切れません。loopAtは、loopAtのあとの数字のサイクルにサンプルの長さを合わせます。loopAt 2とすると、再生されるサンプルは2サイクル分の長さに引き伸ばします。

d1 $ loopAt 1 $ s "breaks125 breaks125:1" # legato 1

上記のようにすると、breaks125とbreaks125:1というサンプルは、1サイクルの長さに引き伸ばされます。そして実際に再生されるのは、サイクルの前半は引き伸ばされたbreaks125の前半が再生され、サイクルの後半はbreaks125:1の前半が再生されます。