salut j'ai posté mon problème sur la mailinglist de scuser mais pas de réel solution du coup je tente ici,,
je ne pense pas que ça soit un problème si compliqué c'est juste que j'ai toujours des lacunes ...
j'éspère que quelqu'un pourrait m'aider. J'essaye juste de pouvoir appliquer ce pad xy, et de le pouvoir l'utiliser avec un pad (usb, ex:Korg) en utilisant CCresponder:
Le code c'est un pad XY qui te permet de morpher entre 4 preset de 10 paramètre d'un synthe
mon problème c'est qu'avec CCresponder j'arrive à modifier le GUI mais ça ne modifie pas les paramètres du synthe je voulais savoir qu'elle est la bonne manière d'écrire
voici mon problème:
///////////////////////o ///////////////////// ~c11C.remove; ~c11C= CCResponder({arg src, chan, num, val; defer {~slider.action ; t.x_(val/127); };},num: 0); //ne fonctionne pas ~c11D= CCResponder({arg src, chan, num, val; defer {~slider.action ;t.y_(val/127); };},num: 24);/// ///////////////////////////////////2d array////////////////////// //le reste du code ( ////GROUPS///////// ~synthgroup = Group.head(s); ~busgroup = Group.tail(s); ~fxgroup = Group.tail(s); /////SAMPLE GRANULATOR ////// ~samples1 = "sounds/*".pathMatch; ~samples_buffers1= List.new; //collection of buffers ~samples1.do{|item| var sf= SoundFile.new; if(sf.openRead(item), { if(sf.numChannels==2, { //mono file ~samples_buffers1.add(Buffer.readChannel(s, item, channels:[0])); //read left channel into both left and right }, { //stereo file ~samples_buffers1.add(Buffer.readChannel(s, item, channels:[0])); //read both left and right channels }); }, { ("file"+item+"could not be loaded").warn; }); sf.close; }; ~samples1_buffers.do{|x| x.postln}; SynthDef(\grain, {arg gate = 1,outbus=0,amp = 1,freqScale=0.1, level = 1,dur=0.1,pos=0,rate=1,interp=2,sndbuf, envbuf; var pan, env, freqdev, source, out; // a custom envelope var winenv; winenv = Env([0, 1, 0], [0.5, 0.5], [8, -8]); z = Buffer.sendCollection(s, winenv.discretize, 1); // use mouse x to control panning pan = MouseX.kr(-1, 1); env = EnvGen.kr( Env([0, 1, 0], [1, 1], \sin, 1), gate, levelScale: amp, doneAction: 2); source = GrainBuf.ar(2, Impulse.kr(10), dur, sndbuf, rate/*LFNoise1.kr.range(0.5, 2)*/, pos+LFNoise2.kr(0.1).range(0, 1), 2, pan, envbuf); out = Out.ar(outbus, PitchShift.ar(source,0.2, freqScale,0,0,0001)* env*level); out = Mix.ar([DelayC.ar(out,0.01,0.01),DelayC.ar(out,0.02,MouseX.kr(0.02,0))]); }).send(s); ) ( //Control Spec ~j1 = ControlSpec (0.01,0.5); ~k1 = ControlSpec (-25,25); ~l1 = ControlSpec (0.01,0.8); ~m1 = ControlSpec (0.1,0.5); ~n1 = ControlSpec(0,0.04); ~o1 = ControlSpec(0,2); ~p1 = ControlSpec(0.1,4); ~q1 = ControlSpec(0.1,100); ~r1 = ControlSpec(0.01, 1); ~s1 = ControlSpec(0.1, 25); ~t1 = ControlSpec(0.1, 4); ~u1 = ControlSpec(0, 13); ~v1 = ControlSpec(0,1); ~w1 = ControlSpec(0,10); ~x1 = ControlSpec(20,20000,\exp); ~y1 = ControlSpec(1,8,\lin,1); ~z1 = ControlSpec(1,300); ) ////sliders GUI b = Array.fill(10,0); x = Array.fill(10, {arg i; 30 * i + 10 }); y = 10; w = 20; h = 100; v = Window("test stuff", Rect(128, 64, 320, 120)).front; c = Array.fill( 10, { arg i; ~slider = Slider( v, Rect(x[i],y,w,h) ).action_({|v| b[i] = v.value; b[8]=1; b[3].postln; ~sourceA.setn(\rate,b[0],\freqScale,b[1],\sndbuf,~s1.map(b[2]),\pos,b[3],\dur,[4],\interp,b[5],\pos,b[6],\amp,b[7],\level,b[8],\pan,b[9]); }); }); //open dictionary ~store_preset = IdentityDictionary.new; //fill sliders with random numbers and store them. c.do({|i| i.valueAction_(0) }); ~store_preset[\preset0] = b.copy; //c.do({|i| i.valueAction_(1) }); b=[1,0.5,0.2,3,0.4,0.8,0.9,0.6,0.6,0.6]; ~store_preset[\preset1] = b.copy; //c.do({|i| i.valueAction_rrand(0,1.0) }); b=[0.9,0.3,0.1,0.2,0.9,0.5,0.1,0.1,0.6,0.7]; ~store_preset[\preset2] = b.copy; //c.do({|i| i.valueAction_(1)}); b=[1,1,1,1,1,1,1,1,1,1]; ~store_preset[\preset3] = b.copy; ~preset_lh = ~store_preset[\preset0]; ~preset_rh = ~store_preset[\preset1]; ~preset_lb = ~store_preset[\preset2]; ~preset_rb = ~store_preset[\preset3]; ~mix_output = Array.fill(10,0); /////2 D SLIDER w = Window(").+.(", Rect(100,Window.screenBounds.height-400, 300 ,300)); w.view.decorator = FlowLayout(w.view.bounds); t = Slider2D(w, Rect(0, 0,292, 292)) .y_(rrand(0,1.0)) .x_(rrand(0,1.0)) .background_( Color.black ) .knobColor_(Color.red) .action_({|v| ~quad_array_mix.value(v.x,v.y,~preset_lh,~preset_rh,~preset_lb,~preset_rb,10); ~update_gui.(); }); w.front; CmdPeriod.doOnce({w.close}); ~update_gui = { var count=0; ~mix_output.do({|i| c[count].valueAction_(i); count = count + 1; }); }; ~quad_array_mix = { arg x,y,lh,rh,lb,rb,n; n.do({|i| ~mix_output[i] = ~quad_mix.(x,y,lh[i],rh[i],lb[i],rb[i]); })}; ~quad_mix = { arg x,y,lh,rh,lb,rb; var val1,val2,val3,val4,sum; val1 = rh*x*y; val2 = lh*(1.0-x)*y; val3 = rb*x*(1.0-y); val4 = lb*(1.0-x)*(1.0-y); sum = val1+val2+val3+val4; }; ////make sound/// ~sourceA.free; ~sourceA= Synth.head(~synthgroup,\grain,[\freqScale,1,\level,1,\sndbuf, 2,\envbuf,-1,\rate,1,\dur,1,\pos,1]).publish(\sourceA); s.meter;
Merci tous
yau
Dernière modification par yau (2012-03-15 01:12:10)
Hors ligne
salut yau.
le problème est que ton code est un peu trop compliqué, pas facile à comprendre. le mieux est d'isoler la partie qui ne fonctionne pas, ce sera plus simple de t'aider.
un autre conseil, poste ton code dans les balises *code*, c'est beaucoup plus lisible.
par rapport à ton problème:
voilà un exemple avec une autre approche. les CCResponder changent les parametres du Synth et mettent à jour la GUI. l'idée est que tu peux faire la même chose soit avec la GUI, soit avec les Ctl MIDI, mais pas du MIDI vers la GUI vers ta fonction, c'est trop lent.
pas sûr que ce soit trèsclair ni ce que tu cherches mais on sait jamais (le code n'est *pas testé*...):
( s.waitForBoot{ SynthDef(\test, {|freq = 800, amp=0.3| var snd = SinOsc.ar( freq.lag(0.05), 0, amp.lag(0.05) ); Out.ar(0, snd) }).add; // wait for Synth to be sent to the server s.sync; // create Synth x = Synth.new(\test); // GUI w = Window().front; t = Slider2D(w, 200@200); t.action_{ |sl| x.set( \freq, \freq.asSpec.map(sl.x), \amp, \amp.asSpec.map(sl.y) ) }; // CCResponders c = CCResponder({ |src, chan, num, val| //change synth params and update GUI without the action num.switch( 0, { x.set(\freq, \freq.asSpec.map(val / 127)); {t.x_(val / 127)}.defer; }, 24, { x.set(\amp, \amp.asSpec.map(val / 127)); {t.y_(val / 127)}.defer; } ) }, num: [0, 24]); }; ) c.remove // cleanup CCResponder
Hors ligne
salut yvan
merci bcp pour l'aide et les conseils!!
ça marche nickel !
Hors ligne
euh enfait nan
le truc c'est que le slider2D il fait bouger les faders normalement; et que si je bouge avec le controlleur le fader il bouge pas alors qu'avec la souris ça marche .. à moins que ça soit possible de modifier les 10 paramètre en utilisant des presets directement à partir du CCResponder ?
En tt cas je vois les choses un peu plus clairement déjà
b = Array.fill(10,0); x = Array.fill(10, {arg i; 30 * i + 10 }); y = 10; w = 20; h = 100; v = Window("test stuff", Rect(128, 64, 320, 120)).front; c = Array.fill( 10, { arg i; ~slider = Slider( v, Rect(x[i],y,w,h) ).action_({|v| b[i] = v.value; b[8]=1; b[3].postln; ~sourceA.setn(\rate,b[0],\freqScale,b[1],\sndbuf,~s1,b[2],\pos,b[3],\dur,[4],\interp,b[5],\pos,b[6],\amp,b[7],\level,b[8],\pan,b[9]); }); }); plus loin .... w = Window(").+.(", Rect(100,Window.screenBounds.height-400, 300 ,300)); w.view.decorator = FlowLayout(w.view.bounds); t = Slider2D(w, Rect(0, 0,292, 292)) .y_(rrand(0,1.0)) .x_(rrand(0,1.0)) .background_( Color.black ) .knobColor_(Color.red) .action_({|v| ~quad_array_mix.value(v.x,v.y,~preset_lh,~preset_rh,~preset_lb,~preset_rb,10); ~update_gui.(); }); w.front;
Hors ligne
yes merci de ton aide du coup j'ai trouvé fallait juste rajouter
~quad_array_mix.value(
0,val/127,~preset_lh,~preset_rh,~preset_lb,~preset_rb,10
);
C'est claire que un code plus claire ça facilite pour l'instant c'est pas gagné mais je vais faire des efforts
merci
a bientot
( ~c11C.remove; ~c11C= CCResponder({ arg src, chan, num, val; ~quad_array_mix.value(0,val/127,~preset_lh,~preset_rh,~preset_lb,~preset_rb,10); defer { t.x_(val/127);~update_gui.(); }; }, num: 0); ~c11D.remove; ~c11D= CCResponder({ arg src, chan, num, val; ~quad_array_mix.value( 0,val/127,~preset_lh,~preset_rh,~preset_lb,~preset_rb,10 ); defer { t.y_(val/127);~update_gui.(); }; }, num: 24); )
Hors ligne
Pages: 1