GUIのスライダーを使った波形を作ってみる。
↓こういうのを作るのの覚書。Guiでお絵かきした波形を鳴らすやつ。
まず、supercolliderでのWaveTableシンセの作成方法。
(1)Wave Tableを格納するBufferを用意
b = Buffer.alloc(s, 2048);
ウェーブテーブルで使う波形データ(Signal)のサイズは1024ぐらいがちょうどいい解像度とのこと。実際このSignalデータをウェーブテーブルとして使用するにはWave Tableフォーマットに変換する必要があり、変換後はデータ量が2倍になるので、Bufferを確保するサイズは2048に指定。
(2)波形データを作成
- Bufferクラスのsin3メソッドでデータを作成(加算合成が簡単)
- Envをシグナルに変換(波形から作りたい場合)
多分他にも色々やり方はあるがこの2パターンをよく使う。
//Bufferを直接sinの加算合成で埋める場合
(
var freqs, amps, phases, len=10;
freqs = Array.series(len);
amps = Array.fill(len, {arg i; 1/(i+1)});
phases = {pi.rand}!len;
b.sine3(freqs, amps, phases);
)
//envelopeを使う場合
(
var env, sig, wt;
env = Env([0,1,-1,0],[3,1,1],\sin); //この時durは実際の時間でなく比率
sig = env.asSignal(1024); //Signalに変換
wt = sig.asWavetable; //wavetableフォーマットに変換
b.loadCollection(wt); //Bufferに格納
)
(3)UGenのOSCで演奏する
波形を決め打ちじゃなくてランダムで生成しているような場合はLeakDCをかませていたほうが安全
{LeakDC.ar(Osc.ar(b, freq:440, mul:0.1))}.play
ここまでがWave Table基本。以下は、Guiと連携させてみたもの。
先ずスライダーとボタンのGuiを作成。
ボタンが押されたタイミングで、スライダーの値でenvelopeを作成⇒ウェーブテーブルで使える形式に変換⇒バッファーのデータを更新している
(
//sliderのguiを作る
var dot=100, width=350, height=100; //波形の点の数、sliderの縦横幅
w = Window.new;
m = MultiSliderView(w, Rect(0, 0, width, height));
m.value_(Array.fill(dot, {0.5})); //中央値で初期化
m.elasticMode=1; //sliderの自動サイズ調整
m.thumbSize = 2; //sliderの点のサイズ
m.background_(Color(1,1,1,0.2)); //背景に透明度を設定
//ゼロのラインを描く
w.drawFunc = {
Pen.line(Point(0,height/2), Point(width,height/2));
Pen.stroke;
};
//波形アップデート用ボタンを作る
b = Buffer.alloc(s, 2048);
p = Button(w, Rect(0, 120, 80, 30))
.states_([["update"]])
.action_({ //ボタンが押された時のアクション
var cs, level, env;
cs = ControlSpec(-1, 1, \lin, 0.00001, 0);
level = cs.map(m.value); //sliderから取得した値を-1~1で正規化
level.add(level.at(0)); //波形の頭とおしりのギャップ埋める
env = Env(level, 1, \sin).asSignal(1024).asWavetable;
b.loadCollection(env);
});
//guiの表示
w.front;
)
//演奏する
{Osc.ar(b, MouseX.kr(100,1000,1), mul:0.2)}.play;
「SuperCollider: Wave TableシンセとGuiの連携」への1件のフィードバック
コメントは停止中です。