3.2 IMPLEMENTAÇÃO
3.2.2 Plugins
Ao clicar em um botão, o preset ativo é salvo em memória e o preset referente ao botão clicado é carregado. Desta forma, o sistema permite ao usuário alterar ajustes de parâmetros sem a necessidade de salvá-lo a cada troca de preset.
Para salvar ou carregar um preset salvo em disco, foi desenvolvida a opção “Arquivo” do menu na tela principal, que possui opções para tais finalidades, conforme ilustra a Figura 54. Com essas funcionalidades implementadas, o requisito funcional RF04 foi integralmente atendido.
Figura 54. Menu Arquivo
As próximas seções abordam o processo de desenvolvimento e codificação, descrevendo as interfaces gráficas, trechos de código fonte e parâmetros, além de imagens de ondas sonoras que foram processadas pelos plugins.
3.2.2.1 Plugin Delay
Para implementar o efeito de Delay, foi utilizada uma técnica de estrutura de dados denominada buffer circular, na qual os dados são armazenados e lidos de forma circular em um vetor com tamanho limitado, onde a última posição do buffer é sucedida pela primeira. O som é armazenado nesse buffer para ser posteriormente acrescentado ao som original, simulando o efeito de Delay.
Os parâmetros implementados no plugin foram:
• Time: tempo entre as repetições do Delay;
• Feedback: quantidade de repetições;
• Level: intensidade do efeito; e
• On/Off: ativação e desativação do efeito.
Na Figura 55, está ilustrada a função processReplacing do plugin, onde é feito o processamento sonoro.
1 void Delay::processReplacing(float** inputs, float** outputs,
2 VstInt32 sampleFrames)
3 {
4 float* in1 = inputs[0]; //duas entradas 5 float* in2 = inputs[1];
6 float* out1 = outputs[0]; //duas saídas 7 float* out2 = outputs[1];
8
9 if (fEnabled > 0.5) //Delay 10 {
11 while (--sampleFrames >= 0)
12 {
13 float x1 = *in1++;
14 float x2 = *in2++;
15 float y1 = buffer1[cursor];
16 float y2 = buffer2[cursor];
17 long aux;
18
19 aux = cursor++;
20 buffer1[aux] = x1 + y1 * fFeedBack;
21 buffer2[aux] = x2 + y2 * fFeedBack;
22
23 if (cursor >= delay) cursor = 0;
24
25 *out1++ = x1 + (y1 * fOut);
26 *out2++ = x2 + (y2 * fOut);
27 }
28 }
29 else //Bypass 30 {
31 while (--sampleFrames >= 0)
32 {
33 *out1++ = *in1++;
34 *out2++ = *in2++;
35 }
36 } 37 }
Figura 55. Código fonte do plugin Delay
O IF da linha 9 divide o fluxo do processamento em duas partes: caso o parâmetro fEnabled seja maior que 0.5, o efeito de Delay é acrescentado ao som original, caso contrário as variáveis de saída (out1 e out2) apenas recebem o sinal de entrada, não efetuando nenhum processamento no som original. Os plugins foram implementados dessa forma para satisfazer o requisito funcional RF02, na qual foi definido que o sistema deverá permitir a utilização dos efeitos simultaneamente, pois dessa forma, não é preciso retirar o plugin da conexão para desativá-lo. Nas linhas 20 e 21 está o código que acrescenta o sinal no buffer e nas linhas 25 e 26 o Delay é acrescentado ao som original. A Figura 56 ilustra a interface do plugin Delay, e sua interface padrão no DK Guitar.
(a) (b)
Figura 56. (a) Interface do Delay; (b) Interface padrão do Delay no DK Guitar
Na Figura 57, a onda sonora inferior ilustra o resultado do efeito Delay aplicado na onda sonora superior.
Figura 57. Onda sonora do Delay
3.2.2.2 Plugin Overdrive
Para o desenvolvimento do efeito Overdrive, foram implementadas equações matemáticas aplicadas ao sinal de áudio, com propósito de modificar o formato da onda sonora. As equações
K = (2 * fGanho) / (1 - fGanho) Equação 1
X = ((1 + K) * X) / (1 + K * abs(X)) Equação 2
Onde:
• fGanho: é a quantidade de Overdrive cujo valores variam de 0.1 a 0.7; e
• X: corresponde ao sinal digital do áudio.
Os parâmetros implementados no plugin Overdrive foram:
• OverDrive: quantidade de saturação;
• Level: intensidade do efeito; e
• On/Off: ativação e desativação do efeito.
Na Figura 58, está ilustrada a função processReplacing do plugin, onde é feito o processamento sonoro.
1 void overdrive::processReplacing(float** inputs, float** outputs, VstInt32 sampleFrames)
2 {
3 float* in1 = inputs[0];
4 float* in2 = inputs[1];
5 float* out1 = outputs[0];
6 float* out2 = outputs[1];
7
8 if (fEnabled > 0.5) //overdrive 9 {
10 while (--sampleFrames >= 0)
11 {
12 float x1 = *in1++;
13 float x2 = *in2++;
14 float k1,k2;
15
16 k1 = 2*fGanho/(1-fGanho);
17 x1 = (1+k1)*x1/(1+k1*abs(x1));
18
19 k2 = 2*fGanho/(1-fGanho);
20 x2 = (1+k2)*x2/(1+k2*abs(x2));
21
22 *out1++ = x1 * fLevel;
23 *out2++ = x2 * fLevel;
24 }
25 }
26 else //Bypass 25 {
28 while (--sampleFrames >= 0)
29 {
30 *out1++ = *in1++;
31 *out2++ = *in2++;
32 }
36 } 34 }
Figura 58. Código fonte do plugin Overdrive
Nas linhas 16, 17, 19 e 20 estão implementadas as equações que transformam o sinal limpo em um sinal levemente distorcido, resultando o efeito de Overdrive. Na Figura 59 está ilustrada a interface do plugin Overdrive, e sua interface padrão no programa DK Guitar.
(a) (b)
Figura 59. (a) Interface do Overdrive; (b) Interface padrão do Overdrive no DK Guitar
Para a visualização gráfica da modificação que ocorre na onda sonora depois de ser processada pelo efeito Overdrive implementado, foi gravado um arquivo de áudio com o som da sexta corda solta de uma guitarra (nota Mi). Na parte superior da Figura 60 está ilustrada a onda sonora gerada pela guitarra, e na parte inferior a mesma onda depois de ser processada pelo plugin Overdrive.
Figura 60. Onda sonora do Overdrive
3.2.2.3 Plugin Distortion
A implementação do efeito Distortion foi baseada nas equações do efeito Overdrive. Para realizar modificações nestas equações, foi utilizado o programa SynthEdit. No SynthEdit foi criado um bloco WavePlayer para reproduzir um arquivo wave, um bloco Waveshaper2, na qual é possível expressar as equações matemáticas e um bloco SoundOut, para ouvir o resultado do processamento.
No bloco Waveshaper2, a equação resultante é a compilação das duas equações utilizadas na implementação do Overdrive, na qual o parâmetro fGain foi substituído por valores numéricos.O diagrama do SynthEdit está ilustrado na Figura 61.
Figura 61. Diagrama Distortion no SynthEdit
Depois de vários testes com diferentes valores, as equações do plugin Distortion ficaram da seguinte forma:
K = (2 * fGanho2) / (1 – fGanho2) Equação 3
X = ((fGanho1 + K) * X) / (fGanho1 + K * abs(X) ) Equação 4
Onde:
• fGanho1: quantidade do primeiro nível de saturação;
• fGanho2: quantidade do segundo nível de saturação; e
• X: sinal digital do áudio.
A Equação 3 do plugin Distortion permaneceu igual à Equação 1 do plugin Overdrive, apenas o nome da variável foi alterado. A principal diferença ficou na Equação 4, onde a constante 1 foi substituída por uma variável. Desta forma o plugin Distortion possui dois parâmetros para controlar o ganho. Os parâmetros que foram implementados no plugin Distortion são:
• Boost: quantidade de saturação da variável fGanho1;
• Gain: quantidade de saturação da variável fGanho2;
• Level: intensidade do efeito; e
• On/Off: ativação e desativação do efeito.
O código fonte do processamento sonoro do plugin Distortion está ilustrado na Figura 62.
1 void distortion::processReplacing(float** inputs, float** outputs,
2 VstInt32 sampleFrames)
3 {
4 float* in1 = inputs[0];
5 float* in2 = inputs[1];
6 float* out1 = outputs[0];
7 float* out2 = outputs[1];
8
9 if (fEnabled > 0.5) //distortion 10 {
11 while (--sampleFrames >= 0)
12 {
13 float x1 = *in1++;
14 float x2 = *in2++;
15 float k1, k2;
16
17 //esquerda
18 k1 = 2*fGanhoAux/(1-fGanhoAux);
19 x1 = (fBoostAux+k1)*x1/(fBoostAux+k1*abs(x1));
20 x1 = x1 * fOutput;
21
22 //direita
23 k2 = 2*fGanhoAux/(1-fGanhoAux);
24 x2 = (fBoostAux+k2)*x2/(fBoostAux+k2*abs(x2));
25 x2 = x2 * fOutput;
26
27 *out1++ = x1;
28 *out2++ = x2;
29 }
30 }
31 else //Bypass 32 {
33 while (--sampleFrames >= 0)
34 {
35 *out1++ = *in1++;
36 *out2++ = *in2++;
37 }
38 } 39 }
Figura 62. Código fonte do plugin Distortion
Nas linhas 18 e 23 está implementada a Equação 3, nas linhas 19 e 24 a Equação 4 e nas linhas 20 e 25 é aplicada a intensidade de saída do efeito. Na Figura 63 está ilustrada a interface do plugin Distortion, e sua interface padrão DK Guitar.
(a) (b)
Figura 63. (a) Interface do Distortion; (b) Interface padrão do Distortion no DK Guitar
O arquivo sonoro utilizado para ilustrar o efeito de Overdrive também foi utilizado para aplicar o efeito Distortion. A parte superior da Figura 64 ilustra a onda sonora original e a parte inferior mostra a onda sonora após ser processada pelo plugin Distortion.
Figura 64. Onda sonora do Distortion
3.2.2.4 Plugin Tremolo
Para o desenvolvimento do efeito Tremolo foi implementado um oscilador (LFO) que varia de 0 a 1 que é incrementado com o valor definido pelo parâmetro fTempo. Quanto menor for esse parâmetro mais devagar será o efeito Tremolo.
Os parâmetros implementados no plugin foram:
• Time: velocidade do efeito Tremolo;
• Mix: mistura o efeito com o som original; e
• On/Off: ativa e desativa o efeito.
Na Figura 65, está ilustrada a função processReplacing do plugin, onde é feito o processamento sonoro.
1 void Tremolo::processReplacing(float** inputs, float** outputs,
2 VstInt32 sampleFrames)
3 {
4 float* in1 = inputs[0];
5 float* in2 = inputs[1];
6 float* out1 = outputs[0];
7 float* out2 = outputs[1];
8
9 if (fEnabled > 0.5) //Tremolo 10 {
11 while (--sampleFrames >= 0)
12 {
13 float x1 = *in1++;
14 float x2 = *in2++;
15 LFO();
16
17 *out1++ = x1 * (1-fGanho) + (x1* fLFO * fGanho);
18 *out2++ = x2 * (1-fGanho) + (x2* fLFO * fGanho);
19 }
20 }
21 else //Bypass 22 {
23 while (--sampleFrames >= 0)
24 {
25 *out1++ = *in1++;
26 *out2++ = *in2++;
27 }
28 } 29 }
Figura 65. Código fonte do Plugin Tremolo
Nas linhas 17 e 18 o tremulo é acrescentado ao sinal original. O código “x * (1-fGanho)”
corresponde à porcentagem do som original e o “x* fLFO * fGanho” corresponde à porcentagem do efeito Tremolo. A Figura 66 ilustra a interface do plugin Tremolo e sua interface padrão no DK Guitar..
(a) (b)
Figura 66. (a) Interface do Tremolo; (b) Interface do Tremolo no DK Guitar
Para que seja possível perceber a presença do efeito Tremolo na onda sonora, ela tem que ser visualizada sem zoom. Como o oscilador é incrementado e decrementado com valores constantes, ele gera um gráfico de forma triangular, que está ilustrada na Figura 67.
Figura 67. Onda sonora do Tremolo 3.2.2.5 Plugin Chorus
O plugin Chorus foi implementado com o auxílio do programa SynthEdit, pois foram encontradas dificuldades para desenvolver a transformada de Fourier para efetuar a modulação necessária no sinal do áudio. No programa SynthEdit, foi utilizado o conhecimento adquirido sobre o funcionamento do efeito Chorus (descrito na Fundamentação Teórica) para o desenvolvimento do plugin. A interface gráfica criada seguiu o mesmo padrão dos outros plugins. Os parâmetros
• Depth: profundidade do efeito; e
• Mix: mixagem ou intensidade do efeito no sinal original.
Na Figura 68, está ilustrado o diagrama de blocos implementado no SynthEdit.
Figura 68. Diagrama Chorus no SynthEdit Onde:
• IO Mod: entrada e saída do sinal sonoro;
• DCA: controla a intensidade do sinal;
• Oscillator: oscilador de baixa freqüência;
• Fixed Values: valores fixos; e
• Delay: componente de Delay ou atraso do sinal.
Os dois componentes DCA da esquerda, são utilizados para fazer o processamento em
sinal passa normalmente para o componente Delay. Este componente está com o tempo de Delay fixo em 27 milissegundos. Um LFO ou oscilador de baixa freqüência está ligado ao Delay para fazer a modulação característica do efeito Chorus.
Para fazer a interface gráfica foi utilizado o mesmo layout do knob (potenciômetro) usado na implementação dos outros plugins. Na Figura 69, está ilustrada a interface do plugin Chorus implementada no software SynthEdit e sua interface padrão no DK Guitar.
(a) (b)
Figura 69. (a) Interface do Chorus; (b) Interface padrão do Chorus no DK Guitar
Na Figura 70, a onda sonora inferior ilustra o resultado do efeito Chorus aplicado na onda sonora superior.
Figura 70. Onda sonora do Chorus
3.2.2.6 Plugin Reverb
Assim como o Chorus, o plugin Reverb foi implementado com o auxílio do programa SynthEdit. No SynthEdit, foram utilizados blocos de filtros digitais do tipo Comb e Allpass para o desenvolvimento do Reverb. Os parâmetros implementados foram:
• Time: ajustar a duração ou tempo da reverberação;
• Tone: tonalidade ou equalização do efeito; e
• Mix: mixagem ou intensidade do efeito no sinal original.
Na Figura 71, está ilustrado o diagrama de blocos implementado no SynthEdit.
Figura 71. Diagrama Reverb no SynthEdit Onde:
• IO Mod: entrada e saída do sinal sonoro;
• Comb: este filtro adiciona um Delay com um curto intervalo de tempo acrescentando pequenas defasagens no som;
• Allpass: filtro Allpass, utilizado para passar todas as freqüências com a mesma amplitude;
• LevelAdj: utilizado pelo parâmetro Mix do plugin para controlar a intensidade do efeito Reverb no sinal original;
• DCA1 e DCA2: utilizado pelo botão On/Off para ativar e desativar o efeito; e
• Multiply: multiplica o valor do parâmetro Tone antes de passá-lo para o bloco Comb.
Na Figura 72, está ilustrada a interface do plugin Reverb implementada no software SynthEdit e sua interface padrão no DK Guitar.
(a) (b)
Figura 72. (a) Interface do Reverb; (b) Interface padrão do Reverb no DK Guitar
Na Figura 73, a onda sonora inferior ilustra o resultado do efeito Reverb aplicado na onda sonora superior.
Figura 73. Onda sonora do Reverb
3.2.2.7 Plugin Volume
A função do plugin Volume implementado é de controlar a intensidade de saída do áudio.
Pode ser utilizado para obter uma diferença de intensidade necessária entre dois presets. Por exemplo, um preset configurado para ser utilizado para o guitarrista executar um solo, geralmente possui maior intensidade que os outros presets.
O único parâmetro do plugin Volume é o fGain, que ajusta a intensidade de saída do sinal.
Na Figura 74, está ilustrada a função processReplacing do plugin, onde é feito o processamento sonoro.
1 void volume::processReplacing (float** inputs, float** outputs, 2 VstInt32 sampleFrames)
3 {
4 float* in1 = inputs[0];
5 float* in2 = inputs[1];
6 float* out1 = outputs[0];
7 float* out2 = outputs[1];
8
9 while (--sampleFrames >= 0) 10 {
11 *out1++ = *in1++ * fGain;
12 *out2++ = *in2++ * fGain;
13 } 14 }
Figura 74. Código fonte do plugin Volume
Nas linhas 11 e 12 o sinal de entrada é multiplicado pelo parâmetro fGain do plugin, alterando a amplitude do sinal. Na Figura 75 está ilustrada a interface do plugin Volume no programa DK Guitar.
Figura 75. Interface do Volume
Na parte superior da Figura 76 está ilustrada uma onda sonora, na qual a segunda onda é o resultado da utilização do plugin Volume.
Figura 76. Onda sonora do Volume