Pular para conteúdo

6.3 Usando Seus Próprios Synthdefs🔗

Criando um SynthDef🔗

Embora o FoxDot venha com seu próprio conjunto de SynthDefs para você controlar, talvez você queira escrever o seu próprio ou usar um que já tenha criado. Esta página mostra como escrever um SynthDef para ser usado com o FoxDot. Será necessário um conhecimento básico sobre SynthDefs do SuperCollider; se quiser saber mais, você pode visitar a documentação do SuperCollider sobre o assunto.

Vamos começar com um SynthDef muito básico escrito em SuperCollider, feito a partir de uma onda senoidal e um envelope percussivo básico. Se estivermos controlando a amplitude e o panorama também, ele poderá ficar mais ou menos assim:

SynthDef.new(\sine, {|amp=1, sus=1, pan=0, freq=0|
    var osc, env;
    osc=SinOsc.ar(freq, mul: amp);
    env=EnvGen.ar(
        Env.perc(attackTime: 0.01, releaseTime: sus),
        doneAction: 2
    );
    osc=(osc * env);
    osc = Pan2.ar(osc, pan);
    Out.ar(0, osc);
}).add;

Para acionar mensagens de sintetizador no SuperCollider a partir do FoxDot, basta fornecer ao FoxDot uma referência ao SynthDef. Você pode fazer isso executando o seguinte código no FoxDot:

sine = SynthDef("sine")

O sine à esquerda é como o FoxDot se referirá ao sintetizador, e o "sine" entre parênteses à direita é o nome do SynthDef no SuperCollider. Eles não precisam ter o mesmo nome, mas faz sentido manter a consistência. Depois de ter o SynthDef sine no FoxDot, você pode usá-lo com um objeto player como qualquer outro. Por exemplo:

p1 >> sine([0, 4, 6, 7], dur=1/2)

No entanto, se você tentar usar efeitos no FoxDot, verá que não funciona:

p1 >> sine([0, 4, 6, 7], dur=1/2, shape=0.5, chop=4)

Para poder "encadear" efeitos, você precisa fazer alguns ajustes no SynthDef do SuperCollider. Primeiro de tudo, você precisa fornecer ao SynthDef um argumento de bus, que armazenará a saída do sintetizador à medida que os efeitos forem adicionados. Em seguida, você precisa usar In.kr para o valor freq (você está atualmente lendo-o de um bus, não fornecendo-o diretamente) e, então, ReplaceOut.ar em vez de Out.ar na última linha, para que possamos gravar o sinal de áudio no barramento de efeitos em vez do dispositivo de áudio do seu computador. Seu novo SynthDef deve ficar mais ou menos assim:

SynthDef.new(\sine, {|amp=1, sus=1, pan=0, bus=0, freq=0|
    var osc, env;
    freq = In.kr(bus, 1);
    osc=SinOsc.ar(freq, mul: amp);
    env=EnvGen.ar(
        Env.perc(attackTime: 0.01, releaseTime: sus),
        doneAction: 0
    );
    osc=(osc * env);
    osc = Pan2.ar(osc, pan);
    ReplaceOut.ar(bus, osc);
}).add;

Salvando seu SynthDef🔗

Se você deseja salvar seu SynthDef (ou já o salvou) e deseja carregá-lo na memória do FoxDot, você pode usar a classe FileSynthDef. Você precisará nomear o arquivo com o mesmo nome do SynthDef. Portanto, no nosso exemplo acima, precisaríamos salvá-lo como sine.scd. O arquivo precisa ser salvo em FoxDot/osc/scsyndef, onde você encontrará os outros arquivos .scd usados pelo FoxDot. Você pode encontrá-lo acessando o diretório de instalação do Python e, em seguida, indo para /site-packages/FoxDot/osc/scsyndef.

Para carregar o SynthDef durante uma sessão FoxDot, crie o SynthDef e use o método .add() para carregá-lo no SuperCollider da seguinte maneira:

sine = FileSynthDef("sine")
sine.add()

Importante🔗

Certifique-se de que todos os argumentos doneAction estejam definidos como 0 para que o nó não seja liberado imediatamente. Efeitos como reverb ou echo exigem que o sintetizador não seja liberado até mais tarde. Usar um valor doneAction de 4 não liberará todos os nós e fará com que o SuperCollider fique sem memória – entao, tenha cuidado! Agora tente executar o código FoxDot abaixo e você deverá ouvir o som com os efeitos aplicados!

p1 >> sine([0, 4, 6, 7], dur=1/2, shape=0.5, chop=4)