Projetando sons no SuperCollider/DTMF
26: toques DTMF
editarSe 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)
})
})
)