yoppa.org


前橋工科大学 – サウンドプログラミング2025

Strudel入門 3 – 最初のエフェクト

Strudelの基本としてサウンド(sound)とノート(note)を修得しました。次は様々なエフェクトを試していきましょう。

いくつかの基本的な効果

ローパスフィルタ

note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>")
.sound("sawtooth").lpf(800)

lpf =ローパスフィルター​​​

  • lpfを200に変更してください。音がこもっているのが分かります。クラブのドアを閉めて目の前に立っているような感じを想像してみてください
  • さあ、ドアを開けてみましょう… 5000 に変更します。明るくなるのに注目してください!

フィルターのパターン

note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>")
.sound("sawtooth").lpf("200 1000 200 1000")
  • さらに値を追加してみましょう
  • lpfのパターンが全体のリズムを変えないことに注目してください
  • Waves で自動化する方法については後ほど学習します

vowel (母音)

note("<[c3,g3,e4] [bb2,f3,d4] [a2,f3,c4] [bb2,g3,eb4]>")
.sound("sawtooth").vowel("<a e i o>")

ゲイン (音量)

$: sound("hh*16").gain("[.25 1]*4")

$: sound("bd*4,[~ sd:1]*2")
  • リズムはダイナミクスが重要です!
  • 取り外して.gain(…)、音がいかにフラットであるかに注意してください

上記のすべてを組み合わせて、小さな曲を作ってみましょう。

$: sound("hh*8").gain("[.25 1]*4")

$: sound("bd*4,[~ sd:1]*2")

$: note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>")
.sound("sawtooth").lpf("200 1000 200 1000")

$: note("<[c3,g3,e4] [bb2,f3,d4] [a2,f3,c4] [bb2,g3,eb4]>")
.sound("sawtooth").vowel("<a e i o>")

ADSRエンベロープでサウンドを形作る

note("c3 bb2 f3 eb3")
.sound("sawtooth").lpf(600)
.attack(.1)
.decay(.1)
.sustain(.25)
.release(.2)

数字が何を表しているか調べてみましょう。次の数字を比較してみましょう。

  • attack: .5 vs 0
  • decay: .5 vs 0
  • sustain: 1 vs .25 vs 0
  • release: 0 vs .5 vs 1
  • attack:フェードインにかかる時間
  • decay:減衰して持続するまでにかかる時間
  • sustain:減衰後のレベル
  • release: 音符が終わってからフェードアウトするまでの時間
height:360

adsr 短縮表記

note("c3 bb2 f3 eb3")
.sound("sawtooth").lpf(600)
.adsr(".1:.1:.5:.2")

ディレイ (delay)

$: note("[~ [<[d3,a3,f4]!2 [d3,bb3,g4]!2> ~]]*2")
.sound("gm_electric_guitar_muted").delay(.5)

$: sound("bd rim").bank("RolandTR707").delay(".5")
  • delay0から1の間の値を試してください。ちなみに、.5は0.5
  • .delay(“.8:.125”) を使用するとどうなりますか?
    2番目の数字が何をするか推測できますか?
  • .delay(“.8:.06:.8”) を使用するとどうなりますか?
    3番目の数字が何をするのか推測できますか?
delay("a:b:c")
  • a: ディレイボリューム
  • b: 遅延時間
  • c: フィードバック(数字が小さいほどフェードが早くなります)

room、別名リバーブ

n("<4 [3@3 4] [<2 0> ~@16] ~>")
.scale("D4:minor").sound("gm_accordion:2")
.room(2)
  • さまざまな値を試してください。
  • ディレイも追加してください!

ちょっとしたダブチューン

$: note("[~ [<[d3,a3,f4]!2 [d3,bb3,g4]!2> ~]]*2")
.sound("gm_electric_guitar_muted").delay(.5)

$: sound("bd rim").bank("RolandTR707").delay(.5)

$: n("<4 [3@3 4] [<2 0> ~@16] ~>")
.scale("D4:minor").sound("gm_accordion:2")
.room(2).gain(.5)

ベースを追加して完成させましょう。

$: note("[~ [<[d3,a3,f4]!2 [d3,bb3,g4]!2> ~]]*2")
.sound("gm_electric_guitar_muted").delay(.5)

$: sound("bd rim").bank("RolandTR707").delay(.5)

$: n("<4 [3@3 4] [<2 0> ~@16] ~>")
.scale("D4:minor").sound("gm_accordion:2")
.room(2).gain(.4)

$: n("[0 [~ 0] 4 [3 2] [0 ~] [0 ~] <0 2> ~]/2")
.scale("D2:minor")
.sound("sawtooth,triangle").lpf(800)

.hush()スタック内のパターンの 1 つの最後に追加してみてください…

pan (定位)

sound("numbers:1 numbers:2 numbers:3 numbers:4")
.pan("0 0.3 .6 1")

スピード

sound("bd rim [~ bd] rim").speed("<1 2 -1 -2>").room(.2)

slowとfast

sound("bd*4,~ rim ~ cp").slow(2)
  • 値を変更してください。 slowをfastに置き換えてみてください。
  • 次のようなパターンを使用するとどうなりますか.fast(“<1 [2 4]>”)?

ちなみに、ミニ表記では、fastは*であり、slowは です/。

sound("[bd*4,~ rim ~ cp]*<1 [2 4]>")

信号による変調

値を段階的に変更する代わりに、信号で制御することもできます。

sound("hh*16").gain(sine)
  • 信号の基本波形は sine, saw, square, tri です
  • ランダム信号も試してみてください。 rand, perlin
  • ゲインはピアノロールの透明度として視覚化されます。

範囲を設定する

デフォルトでは、波は0から1の間で振動します。これを次のようにrangeで変更できます。

sound("hh*16").lpf(saw.range(500, 2000))
  • 範囲の値を反転するとどうなりますか?

変調速度を低速/高速で変更できます。

note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>")
.sound("sawtooth")
.lpf(sine.range(100, 2000).slow(4))

全体の変調が繰り返されるには 8 サイクルかかります。

パターン効果

これまで見てきた機能のほとんどは、サウンドのシーケンス、音符の演奏、エフェクトのコントロールなど、他の音楽プログラムが通常実行できる機能です。

この章では、tidal に特有の機能について説明します。

revでパターンを反転

n("0 1 [4 3] 2 0 2 [~ 3] 4").sound("jazz").rev()

パターンを左に再生し、juxで右に変更

n("0 1 [4 3] 2 0 2 [~ 3] 4").sound("jazz").jux(rev)

これは次と同じです:

$: n("0 1 [4 3] 2 0 2 [~ 3] 4").sound("jazz").pan(0)
$: n("0 1 [4 3] 2 0 2 [~ 3] 4").sound("jazz").pan(1).rev()

ここで何が起こるかを視覚化してみましょう。

$: n("0 1 [4 3] 2 0 2 [~ 3] 4").sound("jazz").pan(0).color("cyan")
$: n("0 1 [4 3] 2 0 2 [~ 3] 4").sound("jazz").pan(1).color("magenta").rev()
  • // を行の前に追加して、2つのうち1つをコメントアウトしてみてください。

複数のテンポ

note("c2, eb3 g3 [bb3 c4]").sound("piano").slow("0.5,1,1.5")

これは、以下と同じです

$: note("c2, eb3 g3 [bb3 c4]").s("piano").slow(0.5).color('cyan')
$: note("c2, eb3 g3 [bb3 c4]").s("piano").slow(1).color('magenta')
$: note("c2, eb3 g3 [bb3 c4]").s("piano").slow(1.5).color('yellow')
  • //行の前に追加して1つまたは複数をコメントアウトしてみてください

add (追加)

setcpm(60)
note("c2 [eb3,g3] ".add("<0 <1 -1>>"))
.color("<cyan <magenta yellow>>").adsr("[.1 0]:.2:[1 0]")
.sound("gm_acoustic_bass").room(.5)
  • 音符に数字を追加すると、その音符は数字として扱われます。

好きなだけ追加できます。

setcpm(60)
note("c2 [eb3,g3]".add("<0 <1 -1>>").add("0,7"))
.color("<cyan <magenta yellow>>").adsr("[.1 0]:.2:[1 0]")
.sound("gm_acoustic_bass").room(.5)

スケールで追加

n("0 [2 4] <3 5> [~ <4 1>]".add("<0 [0,2,4]>"))
.scale("C5:minor").release(.5)
.sound("gm_xylophone").room(.5)

時間を積む

$: n("0 [2 4] <3 5> [~ <4 1>]".add("<0 [0,2,4]>"))
.scale("C5:minor")
.sound("gm_xylophone")
.room(.4).delay(.125)
$: note("c2 [eb3,g3]".add("<0 <1 -1>>"))
.adsr("[.1 0]:.2:[1 0]")
.sound("gm_acoustic_bass")
.room(.5)
$: n("0 1 [2 3] 2").sound("jazz").jux(rev)

ply

sound("hh hh, bd rim [~ cp] rim").bank("RolandTR707").ply(2)

これは以下と同じです

sound("hh*2 hh*2, bd*2 rim*2 [~ cp*2] rim*2").bank("RolandTR707")
  • 関数をパターン化してみましょうply。例えば、”<1 2 1 3>”

off

n("0 [4 <3 2>] <2 3> [~ 1]"
.off(1/16, x=>x.add(4))
//.off(1/8, x=>x.add(7))
).scale("<C5:minor Db5:mixolydian>/2")
.s("triangle").room(.5).dec(.1)

.off(1/16, x=>x.add(4))という表記は、次のように表されます。

  • 元のパターン x を取得する
  • x に .add(4) を適用して変更
  • 元のパターンに対して1/16周期分オフセットして再生する。

off は他のサウンドを変更するのにも便利で、ネストすることもできます。

s("bd sd [rim bd] sd,[~ hh]*4").bank("CasioRZ1")
.off(2/16, x=>x.speed(1.5).gain(.25)
.off(3/16, y=>y.vowel("<a e i o>*8")))

アンケート

アンケート