Faust: linguagem para síntese e processamento de áudio

Faust é uma linguagem de programação funcional específica para síntese sonora e processamento de áudio. Ela foi desenvolvida pelo time de pesquisadores Yann Orlarey, Dominique Fober e Stéphane Letz do GRAME, Centro Nacional de Criação Musical, da França. Sua primeira versão foi lançada em 2002 e desde então vem se tornando bastante usada pela comunidade de tecnologia musical.

Trata-se de uma linguagem de especificação de fluxos de controle e sinais de áudio. Com ela, é possível criar combinações complexas de módulos básicos como osciladores, filtros, geradores de ruído, amplificadores etc. Depois da estrutura definida, o compilador de Faust traduz o código para outras linguagens como Java, JavaScript, C++ etc. Dessa forma, o mesmo código pode servir para várias aplicações em plataformas diferentes. Os desenvolvedores do Faust garantem que essa tradução é feita da forma mais otimizada possível e, em alguns casos, o programa resultante pode ser mais performático do que o escrito diretamente da linguagem fim.

Dada essa característica, Faust está sendo utilizada para programação de módulos DSP (Processamento Digital de Sinal) em hardware. É o caso do recém-lançado Sharc Audio Module, um poderoso DSP que indica a utilização da linguagem Faust para seus desenvolvimento.

Para demonstrar um pouco de implementação em Faust, criamos um pequeno sintetizador de som que pode ser executado diretamente no browser usando o editor online da linguagem. É recomendado usar o Google Chrome, pois ele implementa melhor a versão da WebAudio API que é usada pelo Faust.

Para experimentar:

  1. Entre no Faust Editor;
  2. Copie e cole o código abaixo;
  3. Clique no botão de Play no lado esquerdo;
  4. Quando a nova janela se abrir, clique no quadradinho branco do lado do texto “ATIVAR NOTA”;
  5. Ajuste o knob do VOLUME;
  6. Mude os demais parâmetros.
import("stdfaust.lib");
waveGenerator = hgroup("[0]Gerador de Onda",
os.triangle(freq),os.square(freq),os.sawtooth(freq),os.osc(freq) : ba.selectn(4,wave))
with{
wave = nentry("[0]Forma da Onda",0,0,3,1);
freq = hslider("[1]FREQUENCIA",440,50,2000,0.01);
};
envelope = hgroup("[1]Envelope",en.adsr(attack, decay, sustain, release, gate)*gain)
with{
attack = hslider("[0]Attack[style:knob]",50,1,1000,1)*0.001;
decay = hslider("[1]Decay[style:knob]",50,1,1000,1)*0.001;
sustain = hslider("[2]Sustain[style:knob]",0.8,0.01,1,1);
release = hslider("[1]Release[style:knob]",50,1,1000,1)*0.001;
gain = hslider("[4]VOLUME[style:knob]",0.1,0,1,0.01);
gate = checkbox("[5]ATIVAR NOTA");
};
process = vgroup("Synth",waveGenerator*envelope);

Para explorar ainda mais as possibilidades do Faust, existe o Faust Playground que apresenta uma interface web com módulos que podem ser interligados para gerar o som sem precisar programar os códigos. Acesse o link, clique em “Load” e carregue algum exemplo para começar a experimentar.

Mais informações sobre a linguagem Faust podem ser acessadas no site oficial.

Deixe uma resposta