Skip to content

Instantly share code, notes, and snippets.

@yotamorimoto
Last active July 28, 2021 11:03
Show Gist options
  • Select an option

  • Save yotamorimoto/2330304 to your computer and use it in GitHub Desktop.

Select an option

Save yotamorimoto/2330304 to your computer and use it in GitHub Desktop.
fx
エフェクト作り
ライディーンのイントロ・フレーズをつくる
(
// ハイハットのようなパーカッション
// out 引数を用意
SynthDef(\prc, {| out=0, amp=0.1 |
var sig, env;
env = EnvGen.kr(Env.perc(0, 0.08), 1, amp, doneAction: 2);
sig = WhiteNoise.ar;
sig = sig * env;
Out.ar(out, sig);
}).add;
//コーラス効果(モノラルの音に広がりを与える)
// out 引数を用意
SynthDef(\chorus, {| out=0 |
var sig;
// モノラル入力を得る
sig = In.ar(out, 1) * 0.5;
// ディレイをかけ、FSinOsc によって遅れ値の変更を自動化
// 引数については DelayC のヘルプを参照
sig = DelayC.ar(sig, 1, FSinOsc.kr(0.25, [0, pi]).range(0.02, 0.03), 0.5, sig);
// 元の信号を上書する
ReplaceOut.ar(out, sig);
}).add;
)
注1:配列による表記の簡易化
SC では配列によって複数の信号を表現できる
上の FSinOsc の2番目の引数:位相に配列が渡されることで
sig = In.ar ではモノラルだった信号が配列の数だけ展開される
つまり下の2行が
sig = DelayC.ar(sig, 1, FSinOsc.kr(0.25, 0).range(0.02, 0.03), 0.5, sig);
sig = DelayC.ar(sig, 1, FSinOsc.kr(0.25, pi).range(0.02, 0.03), 0.5, sig);
1行で表現できる
sig = DelayC.ar(sig, 1, FSinOsc.kr(0.25, [0, pi]).range(0.02, 0.03), 0.5, sig);
下の例を聴き比べる
{ SinOsc.ar([400, 405], mul: 0.1) }.play;//ステレオ
{ SinOsc.ar(400, mul: 0.1) }.play;//モノラル
注2:.range メッセージについて
UGen クラスから派生したオブジェクト (SinOsc, DelayC など殆どの音処理に関するオブジェクト) は
.range(min, max) メッセージによって値の範囲を変更できる
本題に戻ります
ライディーン最初のフレーズ
(
// テンポ変更 bpm 142 くらいでしょうか
TempoClock.default.tempo = 142/60;
Pbind(\instrument, \prc,
\dur, Pseq([0.5, 0.25, 0.25], inf),
\amp, Pseq([0.3, 0.13, 0.13], inf)
).play;
)
モノラルで左側からだけ鳴る
(
// Pfxb はパターンにエフェクトをかける
// Pfxb(パターン、エフェクト名)
~prcA = Pfxb(
Pbind(\instrument, \prc,
\dur, Pseq([0.5, 0.25, 0.25], inf),
\amp, Pseq([0.3, 0.13, 0.13], inf)
),
\chorus
).play;
)
モノラルにコーラス効果がかかります
エフェクトを直接 prc のシンセ定義に組み込むこともできますが、
Pfxb の利点はエフェクトをモジュール化し再利用できるようにすることです
実践
Filter エフェクトをつくる
SC にはたくさんのフィルターがあります
Filter.allSubclasses.do(_.postln);//ポストウィンドウを見ます
上の中からヘルプファイルを参照し音色をかえるエフェクトをつくり
prc シンセにエフェクトをかける
また FSinOsc.kr(0.25, [0, pi]).range() を使いフィルターの変化を自動化する
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment