今度は複数のウェーブテーブルを作って、波形を動かしてみる。
こんな感じ。
ひとつのウェーブテーブルを作成して音を鳴らすまでは前回の記事に。
複数スライダーのGuiを作成する
今回は波形を描く用のスライダーを3つ作成する。MulthSliderViewを3つ分作って変数mに格納し、そのあとcollectでm配列のアイテム(各スライダー)ごとに描画の設定をしている。
var slide=3, dot=100, width=350, height=80; w = Window.new.front; m = Array.fill(slide,{arg i; MultiSliderView(w, Rect(0, i*height, width, height))}); m.collect({arg item; item.value_(Array.fill(dot, {0.5})); item.elasticMode=1; item.thumbSize = 2; item.background_(Color(1,1,1,0.2)); });
zeroラインの描画
各スライダーの背景に0.0位置のラインをPenで描画
w.drawFunc = { slide.do({ arg i; var px = (i*height)+(height/2); Pen.line(Point(0, px), Point(width,px)); Pen.stroke; }) };
Bufferの確保
サイズ2048のBufferを3つぶん作成。allocConsecutiveを使うと連続したbufnumのBufferを作成できて便利。ここではbufnum:0から2までのBufferを作成している。
b = Buffer.allocConsecutive( slide, s, 2048, bufnum:0 );
ボタンが押された時に実行される関数を作成
前回はButtonクラスのアクションファンクションに直接書いていたが、見た目がごちゃっとするので今回は分けてみた。
やっている中身は単ウェーブテーブルの時と一緒だが、今回はbに格納されているBufferそれぞれに処理をしている。(引数のbufにはb内のアイテム(Buffer)が、iにはdoごとにイテレーションされるカウンターが入ってくる)
f = { b.do({ arg buf, i; var cs, level, env; cs = ControlSpec(-1, 1, \lin, 0.00001, 0); level = cs.map(m[i].value); //mはスライダーの配列 level.add(level.at(0)); env = Env(level, 1, \sin).asSignal(1024).asWavetable; buf.loadCollection(env); }) }
関数fを実行するためのボタンを作成する。
p = Button(w, Rect(0, height*slide+20, 80, 30)) .states_([["update"]]) .action_({ f.value }); //関数fを実行する
バッファーのポジションを指定するためのスライダーを作る
今回は複数のバッファーに格納された複数ウェーブテーブルを混ぜて使う(使用するウェーブテーブルが入っているbufnumが0と1の場合、0.5を指定すれば0と1のウェーブテーブルがブレンドされたような波形になる⇒スムーズに波形から波形をトランスフォームさせることが可能)
今回はEZSliderクラスを使う。ControlSpecの部分でバッファーのポジションの範囲を設定している(今回はスライダーが3つなので、0~2の範囲)が、上限を2にすると何故か音が止まっちゃうので(原因はよくわからない。。)1.99までにしている。
また、アクションファンクションでSynthを格納するxにスライダーの値をセットしている。
g = EZSlider( w, // parent Rect(0,height*slide,width,20), // bounds " pos ", // label ControlSpec(maxval:1.99), // controlSpec { |ez| x.set(\pos, ez.value) } // action )
UGenを作る
複数ウェーブテーブルを使用するにはVOscを使用する。引数posでEZSliderからバッファーのポジションを受け取る。
( SynthDef(\wtSynth, { arg pos=0; var env, sn; sn = VOsc.ar(pos, mul:0.3); Out.ar(0, sn); }).add; ) x = Synth(\wtSynth);
全体のコード
https://github.com/rucochanman/SCLibrary/blob/master/Gui/waveTable