TidalcyclesのFunctionについて、具体例とともに解説していきます。好きなときに随時更新していきます。
Contents
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は、フィルに使えるので便利そうです。
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が連続すると曲にハマらないことがある。 |
概要 | 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
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
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サイクル分後ろにシフトし、左チャンネルはそのまま再生する。 |
応用
d1
$ jux (0.01 <~)
$ s "[bd(3,16,[0,-3,-6]),sn:2(2,4,1),hc(16,16)]"
右チャンネルだけ短時間だけシフトすることで、左右に広がった感じになります。
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で変化させることで音色を大きく変化させています。
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の前半が再生されます。