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では一般的に非常によく使われます。

応用

応用1
d1 $ s "jvbass*16" # up (slow 4 $ range 0 1 sine) # shape (slow 3 $ range 0 1 sine)

応用1では、shapeを0から1の範囲でsineで変化させて、だんだん歪んだり戻ったりする効果を生み出しています。

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の前半が再生されます。

speed

speedは、サンプルの再生速度を変化させます。TidalCyclesでもかなり基本的でよく使うfunctionです。

d1 $ every 2 (# speed 2)
$ s "bd hc arpy arpy"
概要# speed x
xはどんな数でもよい
# speed 2
説明サンプルの再生速度がx倍になる。
メモxが2だと再生速度が2倍となり、その結果音の高さも1オクターブ上がる。
xが0.5だと再生速度が0.5倍になり、その結果音の高さが1オクターブ下がる。
xが-1だと再生速度が-1倍、つまり逆再生になる。

bdやsnなどの打楽器にspeedを使うと楽しいです。0.8とかにして少しピッチを下げるとかっこよくなる場合もあります。

arpyやbassのように、音程のあるサンプルに使うと、speedを変化させたときに音程が変わります。ただドレミファソラシドといった音階を鳴らすには、speedの親戚のupを使ったほうが便利です。

応用


応用1 speedをパターンで変える
d1 $ every 2 (# speed ("-1 -1 0.5 -0.5"))
$ s "bd hc*2 sn:2 hc*2"

応用2 stutと組み合わせる
d1 $ every 2 (stut' 8 0.03 (|* speed 1.5))
$ s "808bd:1 [bass hc] [808sd:2 hc] arpy"

応用3 ピッチを揺らす
d1 $ n "{0 5 3 2  0 3 4 5  0 3 5 3  0 6 5 2}%16" # s "house"
# speed (slow 4 $ range 0.97 1.03 sine)

応用1では、speedの値をパターン化して、-1を使って逆再生にしています。

応用2では、stutと組み合わせて、speedを1.5倍するのを繰り返して面白い効果にしています。

応用3では、slow 4 range 0.97 1.03 sine により、speedを0.97倍から1.03倍の間で変化させて、カセットテープやレコードのようなピッチの揺れを表現しています。

up

upは、サンプルの音程を変化させます。

d1 $ every 4 (# up 2)
$ s "bass*4 arpy*4"
概要# up x
xは主に整数
# up 2
説明xの値だけサンプルの音程が半音高くなる。xが1だと半音上がり、xが2だと全音上がり、xが12だと1オクターブ上がる。
音程が高くなるのは、サンプルの再生速度を変えているだけなので、かなりspeedと似ている。
# speed 2は、# up 12 と同じで、1オクターブ上がり、再生速度は倍になる。
メモbassやarpyなどの音程を持つサンプルに使うとわかりやすい。xの値はマイナスにもできるが、その場合は音程が下がる(speedと違って逆再生にはならない)。

upという名称を見ても最初はなんのことだかわかりませんでしたが、要するに音程を指定するfunctionです。# up 2 であれば、音程を2つupしているだけ(ドがレになる)です。

やっていることはspeedと同じで、再生速度を変えて、その結果音程が変わる、という動きです。

upは半音単位なので、# up (irand 12)とかにして音程にランダム性をもたせると、現代音楽風にはなりますが、一般的なメジャースケールの音階にはなりません。

これをメジャースケールどおりにしたい場合は、”scale”を使います。

ただscaleを使わなくても、# up 7(完全5度上)とか# up 12(1オクターブ上)を使えば、一般的な音階を外さないので、曲の調和を保つことができます。

応用

応用1 upをbassに使う

d1 $ up "0 _ ~ 0?     <7 12> -2 ~ -2     ~ <-2 -5> ~ <7 2>    12 ~ 2 3" # s "jvbass"

d2 $ stack[
s "bd(4,8)"
,s "sn:2(2,4,1)"
,ghost $ s "hc(4,8,1)"
]

応用2 ペンタトニックスケールの音だけを使ってランダム性をもたせる
d1 $ up "[0|2|4|7|9|12]*8" # s "jvbass"

応用3 半音よりもさらに中途半端な音程を使う
d1 $ s "jvbass*16" # up (slow 4 $ range 0 1 sine)

応用1では、upをbassに使ってベースのフレーズを作っています。パターン内の数字を入れ替えれば好きなフレーズを作れますね。

応用2では、ペンタトニックスケールの音だけを指定してランダム性をもたせています。(irand 12)とかにするよりは使いやすい音階になります。

応用3では、upを0から1の範囲でsineで変化させて、中途半端な音程にしています。speedだと半端な音程にはできても、意図した音階にするのは難しいですが、upなら意図した音程を中心に微妙にずれた音程を作ることができます。

off

offは、元のパターンはそのままで、そのパターンにfunctionを追加しつつ、数値分だけ遅らせて再生します。

d1 $ off (1/8) (# up 7) $ s "arpy*4"

memo: ↑は↓と同じ
d1 $ s "arpy*8" # up "[0 7]*4"


d1 $ off (1/8) (# speed 0.5) $ s "bd hc sn:2 hc"
概要off x (function)
xは数値。単位はcycle。
off 0.125 (# speed 2)
説明もとのパターンはそのまま再生しつつ、もとのパターンにfunctionを追加した上でxの分だけ遅らせて再生する。
説明が難しいので例を試してほしい。
メモ数値は(1/16)など分数にするとわかりやすい。数値を0にするとsuperimposeと同じ動きになり、原音と原音にfunctionを追加したものが同時に再生される。

説明だけ聞いてもわかりにくいですが、実際使ってみると便利で奥が深いfunctionです。

原音はそのまま再生しつつ、原音にfunctionを追加してそれを自由な場所に配置できる、という感じです。

曲に展開を加えたいときに便利で、たとえばアルペジオのフレーズに対して、whenmod 32 16 (off 0.125 (# up 12))とすれば、16サイクル目から# up 12を追加した音が0.125サイクル後に再生されて、豪華になります。

またoff 0 とかけば、superimposeと同じ動きになるので、簡単です。

応用

応用1 別の音を追加
d1 $ whenmod 4 2 (off (1/8) (# s "hc")) $ s "bd sn:2 bd sn:2"

応用2 アルペジオに変化をつける
d1 $ whenmod 4 2 (off (1/16) (|+ up "7")) $ up (arp "up" "c5'maj9'4 g5'maj9'4") # s "arpy" # room 0.9

応用3 ベース音にオクターブ上の音を追加してスラップ風にする
d1 $ sometimesBy 0.3 (off (1/16) (|+ up 12)) $ s "bass(9,16)" # up "0 3 5 7" # cut 1

応用1では、ドラムにハイハットを追加しています。音を「変化させる」のではなく「追加できる」のがoffの魅力です。

応用2では、アルペジオに|+ up 7 で5度上の音を1/16サイクル後に追加して複雑なアルペジオにしています。

応用3では、ベース音にたまに1オクターブ上の音を追加することで、ベースのスラップ音のようにしています。

このように、音を追加してフレーズを変化させることができるので、曲の展開を作るのに最適です。

fix

fixは、パターンを再生する中で、指定したn番号のときだけfunctionを適用できます。

d1 $ fix (# gain 2) (n 0) $ n "0 1 2 3" # s "house*4"
概要fix (function) (n x)
fix (|* gain 2) (n 0)
説明上記例では、nが0のときだけ|* gain 2を適用します。
メモまずはn番号での指定で動きを試すと理解しやすい。

簡単な使い方としては、オリジナルサンプルで一つのフォルダに複数音源を入れている場合に、特定のサンプルの音量だけを調整したいときに便利です。

応用

応用1 "house"フォルダの音から、nが0のときだけgainを2倍する  
d1 $ fix (|* gain 2) (n 0) $ n "0 3 3 3   4 3 3 3   0 3 3 3  4 3 3 0" # s "house" # cut 1

応用2 nの値を2つ指定する
d1 $ fix (|* gain 2) (n "[0,4]") $ n "0 3 3 3   4 3 3 3   0 3 3 3  4 3 3 0" # s "house" # cut 1

応用3 nではなくroomで条件を指定する (roomの値が0.9のときに# pan を反映)
d1 $ fix (# pan "<0 1>") (room "0.9") $ n "0 3 3 3   4 3 3 3   0 3 3 3  4 3 3 0" # s "house" # room "0 0 0 0    0.9 0 0.9 0   0 0 0.9 0   0.9 0 0 0"

似たものにcontrastがあります。これは、

d1 $ contrast (# speed 2) (# gain 2) (n 0)

のようにして、nが0のときは(# speed 2)を反映し、nが0以外のときは(# gain 2)を反映する、というif-else文のような動きができます。