26: toques DTMF

editar

Se estiver usando linux, utilize o SwingOSC:

(
g = SwingOSC.default
GUI.swing
g.boot
)



(
// A classe Dictionary permite fazer uma tabela associativa;
// aqui associamos uma string (referente ao botão) com um par
// de frequências para o sintetizador
~dict = Dictionary [
	"1" -> [[697, 1209]],
	"2" -> [[770, 1209]],
	"3" -> [[852, 1209]],
	"4" -> [[697, 1336]],
	"5" -> [[770, 1336]],
	"6" -> [[852, 1336]],
	"7" -> [[697, 1477]],
	"8" -> [[770, 1477]],
	"9" -> [[852, 1477]],
	"*" -> [[697, 1633]],
	"0" -> [[770, 1633]],
	"#" -> [[852, 1633]],
	];
	
// Aqui definimos um SynthDef que toca um simples número por vez.
// Note que nossa estratégia é um pouco diferente do código feito em PD no livro:
// lá, são reusados novos valores para um par de osciladores 
// e aqui nós criamos um synth individual para cada número (tocando ele quando chamado, e parando-o
// quando necessário)

SynthDef(\dtmf, {|freq=#[770, 1633], out=0, amp=0.2, gate=1|
	var son, env;
	son = SinOsc.ar(freq, 0, amp).sum;
	env = EnvGen.ar(Env.asr(0.001, 1, 0.001), gate, doneAction: 1);
	Out.ar(out, Pan2.ar(son * env * amp));
}).memStore;


//Fazendo uma interface gráfica simples
~win = Window("telefone", Rect(0,1000,175,220)).front;
~win.view.decorator = FlowLayout(~win.view.bounds, 10@10, 10@10);
~win.view.decorator.gap = 2@2;
~size = 50@50;

//criaremos um botão, e associaremos um synth para cada botão
~array = {Button(~win.view, ~size)}!12;
~array2 = ["1","2","3","4","5","6","7","8","9","*","0","#"];
~arraySynth = {|i| Synth(\dtmf, [\freq, ~dict.at(~array2[i]), \gate, 1])}!12; 

12.do({|i|
	~arraySynth[i].run(0);
	~array[i].states_([[~array2[i], Color.black, Color.clear]]);
	~array[i].mouseDownAction_({|button|
		if (button.value == 0) {~arraySynth[i].run(1)} {nil}
		});
	~array[i].action_({|button|
		~arraySynth[i].run(0)
		})
	})
)