// title: modulo2 // author: lambda // description: // lo mismo que modulo pero usando slider2d // code: // Modulo // ukiyo-neko systems // // Modulo es un ejemplo de un programa en supercollider // Primero se describe un sintetizador ( // en Supercollider los sintetizadores son funciones cuyos argumentos podemos modular de diversas y múltiples maneras // Primero llamamos SynthDef que se come una funcion Ugen {esa cosa que tiene sombrero chino} como argumento // esta funcion le dice al servidor que cree una instancia de sintetizador y nos escupe un nombre para ese sinte // con ese nombre le podemos pedir cosas, que cambie parametros o que nos diga información sobre la función // por ejemplo frecuencia de una onda seno SynthDef(\modulo,{arg carrfreq=440, modfreq=10, moddepth=0.5; // Modulo es un ejemplo de modulaci'on de frecuencia (FM) simple // tiene 3 argumentos // carrfreq que es una freciencia base a la cual le sumamos una onda de seno // entonces la grafica de la frecuencia de nuestro nuevo sonido es una onda de seno modulada en frecuencia alrededor de //carrfreq con frecuencia // modfreq // que tanto modulamos la frecuencia depende de moddepth Out.ar(0, // SinOsc.ar(carrfreq + SinOsc.ar(modfreq,0,moddepth),0,0.25)!2) }).add; ) s.scope; ( var w, carrfreqslider, m1control, m1addslider, synth; ////////////////////// // Initialize Windows ////////////////////// Window.closeAll; s.scope; // we have the possibility of creating subwindows /* subwin = FlowView.new( parent: win, bounds: Rect(710, 230, 185, 150), margin: 10@10, gap: 10@10; );*/ //////////////////// // window creation //////////////////// w=Window("frequency modulation", Rect(100, 500, 400, 300),resizable: false); w.view.decorator = FlowLayout(w.view.bounds); w.front; w.onClose = {s.freeAll}; // What to do on close (or ctrl+period) CmdPeriod.doOnce({Window.closeAll}); //// window aesthetics w.background = Color.new(1,1,1,1); w.alpha = 0.95; /////////////// // synth creation/ ////////////////// a = Synth(\modulo); // create the slider with EXSlider carrfreqslider is how we address it carrfreqslider= EZSlider(w, 300@50, "carrfreq", ControlSpec(20, 5000, 'linear', 10, 440), {|ez| a.set(\carrfreq, ez.value)}); w.view.decorator.nextLine; w.view.decorator.nextLine; m1control = Slider2D(w,Rect(10,10,180,180)); // modfreqslider= EZSlider(w, 300@50, "modfreq", ControlSpec(1, 2000, 'linear', 1, 1), {|ez| a.set(\modfreq, ez.value)}); // // w.view.decorator.nextLine; // moddepthslider= EZSlider(w, 300@50, "moddepth", ControlSpec(0.01, 5000, 'linear', 0.01, 0.01), {|ez| a.set(\moddepth, ez.value)}); m1control.action = { a.set(\modfreq,m1control.x*100.0+1);//\moddepth,m1control.y*0.5+0.01).postln; a.set(\moddepth,m1control.y*1000.0);//\moddepth,m1control.y*0.5+0.01).postln; a.get(\modfreq,{arg value;("freq:" + value + "Hz").postln;}); a.get(\moddepth,{arg value;("depth:" + value + "Hz").postln;}); }; w.front; ) ( var w, carrfreqslider, modfreqslider, moddepthslider, synth; w=Window("frequency modulation", Rect(100, 400, 400, 300)); w.view.decorator = FlowLayout(w.view.bounds); c= Synth(\modulo); carrfreqslider= EZSlider(w, 300@50, "carrfreq", ControlSpec(20, 5000, 'linear', 10, 440), {|ez| c.set(\carrfreq, ez.value)}); w.view.decorator.nextLine; modfreqslider= EZSlider(w, 300@50, "modfreq", ControlSpec(1, 2000, 'linear', 1, 1), {|ez| c.set(\modfreq, ez.value)}); w.view.decorator.nextLine; moddepthslider= EZSlider(w, 300@50, "moddepth", ControlSpec(0.01, 5000, 'linear', 0.01, 0.01), {|ez| c.set(\moddepth, ez.value)}); w.front;