Construindo efeitos sonoros com o ISoundFx
Transcrição
Construindo efeitos sonoros com o ISoundFx
Construindo efeitos sonoros com o ISoundFx Pedro Matos Motta¹, Eduardo M. de Freitas Jorge¹ ¹Universidade do Estado da Bahia - (UNEB), Salvador, BA - Brasil {[email protected], [email protected]} Resumo. Os dispositivos móveis atuais romperam com a limitação tecnológica que os impediam de processar efeitos sonoros em tempo real. Através de aplicações para smartphones, por exemplo, é possível plugar uma guitarra em um celular e ouvir os efeitos semelhantes às pedaleiras e amplificadores. Porém, para a criação de programas nesse contexto o nível de reuso de componentes prontos ainda é baixo gerando uma menor produtividade para concepção de aplicações de efeitos sonoros. Este trabalho propõe a criação de uma biblioteca de efeitos denominada de ISoundFx para plataforma iOS. O objetivo é reunir nesta biblioteca algoritmos de efeitos sonoros e o uso de recursos de hardware, permitindo que aplicações sejam desenvolvidas para smartphones e tablets em um menor espaço de tempo e por desenvolvedores que não necessitam de conhecimentos profundos nesta área. Abstract. Mobile devices have broken with the current technological limitations that prevented them from processing sound effects in real time. Through applications for smartphones, for example, you can plug a guitar into a phone and hear the effects similar to pedals and amps. However, for the creation of programs in this context the level of component reuse is still low ready generating less productivity for application design sound effects. This paper proposes the creation of a library of effects called for ISoundFx iOS platform. The goal is to gather algorithms in this library of sound effects and use of hardware resources, allowing applications to be developed for smartphones and tablets in a shorter time and for developers who do not require deep knowledge in this area. 1. Introdução O mercado de aplicações para dispositivos móveis dispõe de um número significativo de programas para fins musicais. Os usuários têm buscado cada vez mais por estas ferramentas que auxiliam na composição musical, principalmente pela praticidade de carregar um celular ao invés de caixas de som, pedais de efeitos, racks dentre outros equipamentos de som, não sendo necessário estar em um estúdio de gravação, mas em qualquer lugar (KRUEGER, 2008). A procura dos usuários por esse tipo de aplicativo cria um atrativo para os desenvolvedores. Porém, ao criar programas de efeitos sonoros para dispositivos móveis, existe uma dificuldade inerente ao tema, já que, é necessário um conhecimento em algoritmos de processamento de áudio. Alem disso, no ambiente de dispositivos móveis deve haver uma preocupação maior que nos computadores convencionais, pois existem limitações quanto ao poder de processamento, capacidade de memória dentre outros recursos, dificultando ainda mais a construção desses aplicativos. Neste contexto temos dois principais grupos de aplicações musicais que definem qual o tipo de algoritmo de áudio utilizado: efeitos de transformação sonora e os sintetizadores de áudio. As aplicações denominadas sintetizadoras sāo responsáveis por "gerar" um som (APPLE, 2012). Por exemplo, os aplicativos de instrumentos virtuais (bateria, flauta e violão). Já as de efeito de transformação, ou simplesmente de efeitos sonoros, promovem uma modificação em tempo de execução do som original captado de um ambiente externo, ou em um arquivo (APPLE, 2012). Temos os pedais de guitarra virtuais e os alteradores de tonalidade de voz como exemplo. Segundo os dados da Apple (2012) as aplicações que fazem parte do grupo de efeitos de transformação sonora possuem o código fonte fechado, ou seja, dificulta que outros programadores possam utilizar os algoritmos para a construção de outros programas, aumentando assim o esforço e o tempo de criação. Por tanto a existência de código open source ajudaria que desenvolvedores, com pouca experiência, desenvolvessem aplicações neste domínio. Diante disso, o presente trabalho objetiva criar uma biblioteca denominada ISoundFx com o foco no grupo de recursos de transformações sonoras. A biblioteca a ser especificada, traz algumas vantagens, por exemplo: reaproveitamento de código, já que este possui rotinas de utilização da API nativa de áudio, que estaria repetido nas diversas aplicações; e redução da complexidade, visto que o desenvolvedor precisa se preocupar apenas com a lógica da sua aplicação. Os passos para a concepção do ISoundFx são: (i) conceituação de alguns dos efeitos sonoros; (ii) análise do funcionamento do framework de áudio do iOS; (iii) implementação ISoundFx na plataforma iOS; (iv) por fim são desenvolvidos protótipos de aplicações usando o ISoundFx. 2. Efeitos Sonoros Os efeitos sonoros são comumente utilizados pelos guitarristas através do uso de pedais ou racks. Os efeitos mais utilizados por estes músicos são o de distorção, reverberação, echo, chorus e flanger. Nesta seção são apresentados dois dos principais efeitos: o echo e a distorção. Distorção, como sugere o nome, é um efeito provocado pela amplificação do sinal de áudio, a tal ponto que há uma perda de parte do som original descaracterizando-o (MENDES;GOULART, 2012). Este processo também pode ser denominado como clipping. Na Figura 1 é ilustrado o formato da onda original e os cortes realizados nas extremidades para gerar o efeito de distorção, dando um formato de onda quadrada. Os ajustes realizáveis no efeito de distorção são: Ganho: dita o nível de saturação da distorção; Tom: regula sem o som ficará mais agudo ou mais grave; Volume: regula a intensidade do som. Figura 1 - Formato de onda distorcida (BAITONA 2012) O efeito de Echo ou Delay é definido como a repetição do som original com um tempo de atraso definido. A cada repetição o som vai decaindo, ou seja, vai perdendo a intensidade até que não seja mais possível a audição (KRUEGER, 2012). A Figura 2 demonstra o sinal original e o sinal após a aplicação do efeito de delay. Este efeito tem os seguintes ajustes: Atraso: ajusta o intervalo em que as repetições vão ocorrer; Feedback: regula a quantidade de repetições; Level: dita o nível de intensidade das repetições. Figura 2 - Formato de Onda no efeito de delay Os efeitos apresentados serão retomados na seção 4, quando será exemplificado a criação deles utilizando o iSoundFx. 3. Arquitetura de áudio do iOS Para a compreensão do funcionamento do iSoundFx é necessário o conhecimento prévio da plataforma para qual ele foi designado. Esta seção faz uma breve descrição do suporte nativo do framework de áudio da plataforma iOS. Segundo a Apple (2012) a API de áudio do iOS provê diversas unidades divididas por camadas da Figura 3. Cada unidade possui um grau de abstração mais elevado na parte superior em relação a camada que está mais próxima dos drivers e hardwares. A escolha de qual unidade deverá ser utilizada no projeto é dada pela intenção do desenvolvedor. Caso ele queira maior flexibilidade, desempenho e controle a opção seria o Audio Unit. Se a intenção é tocar apenas uma amostra de áudio, por exemplo, a unidade Media Player seria a mais adequada. Figura 3 - Framework de áudio no iOS (APPLE, 2012) O uso do Audio Units é recomendado para as seguintes situações (APPLE, 2012): Utilização simultânea dos canais de entrada e saída de áudio com o mínimo de latência, como, por exemplo, um pedal de efeitos sonoros virtuais; Tocar amostras sintetizadas de áudio com eficiência; Uso para uma demanda específica de áudio como cancelamento de eco, mixagem ou equalização sonora; A partir desses dados o Audio Units é a unidade mais compatível com o ISoundFx devido a primeira situação contemplar o objetivo de capturar o áudio, processá-lo utilizando os efeitos musicais e em seguida tocar essa amostra de áudio. 4. ISoundFx O ISoundFX, junção dos nomes iOS + Sound + Effects, é uma biblioteca open source de uso restrito aos dispositivos móveis da Apple. Possui seu código fonte escrito nas linguagens C++ e Objetive-C. O principal objetivo desta pesquisa é mostrar as potencialidades do uso dessa biblioteca e como a mesma pode apoiar os desenvolvedores na construção de aplicações neste domínio. Para demonstrar a aplicabilidade do ISoundFX serão apresentados também dois exemplos de codificação que usam efeitos sonoros vistos na seção 3. Esta seção está subdividida nas seções de arquitetura do ISoundFx, onde é apresentado o funcionamento do ISoundFx, depois a criação dos efeitos e por fim a conclusão deste trabalho. 4.1 Arquitetura No desenvolvimento de aplicações para dispositivos móveis a arquitetura deve ser cuidadosamente projetada, devido as limitações quanto ao uso de processamento e memória, logo o ISoundFx foi projetado observando estas questões (ver Figura 4). Figura 4 - Arquitetura do ISoundFx: (a) Aplicação Hospedeira; (b) Biblioteca ISoundFx; (c) Framework nativo do iOS. Em “a” está a aplicação dita hospedeira que fará o uso da biblioteca. O acesso à biblioteca ISoundFx, representado por “b”, será feito através da camada de abstração denominada “Controle”. Na camada intermediária existem “n” efeitos dispostos de forma horizontal simbolizando que ao término do efeito anterior, mais à esquerda, o próximo efeito, da direita, será processado. Já a camada inferior denominada interface comum será feita a intermediação da biblioteca com o framework nativo, captando os recursos de entrada e saída, além de outros recursos disponíveis Audio Unit. O ISoundFx pode ser representado também por um ponto de vista mais detalhado, como pode ser observado no diagrama de classes da Figura 5. Para este projeto o padrão Strategy foi adotado visando facilitar a inclusão de novos efeitos ao projeto. Segue uma breve descrição das principais classes utilizadas: NativeAudio – É responsável por fazer o acesso ao framework de áudio nativo, o Audio Units, bem como configurar as propriedades das amostras de áudio e gerenciar o fluxo de Entrada e Saída (E/S); IEffect – É a interface comum entre os efeitos que possuirá como principal método o onSample que receberá o como parâmetros o stream de áudio recebido pelo NativeAudio e a quantidade de amostras; EffectImplement – É a classe que fará a implementação real do efeito. Cada efeito adicionado ao projeto terá que implementar o IEffect; Controller – É responsável por controlar as configurações dos efeitos e gerenciar parte dos processos da classe NativeAudio. É por meio deste que a aplicação fará o uso da biblioteca. A classe NativeAudio encapsula o funcionamento do Framework Audio Units simplificando o uso de áudio no iOS para a construção de aplicações de efeitos sonoros. É possível observar a quantidade de configurações que são necessárias para realizar uma simples captura de áudio pela documentação oficial da Apple. Após a breve descrição do funcionamento do ISoundFx, a próxima seção demonstra a criação de dois efeitos sonoros descritos na seção 2: o efeito de eco e distorção. Figura 5 - Diagrama de classes do ISoundFx 4.2 Criação dos Efeitos O primeiro passo para a criação de um efeito sonoro utilizando o ISoundFx é gerar uma classe que implemente a interface IEffect Esta forma o método onSample receberá por parâmetro as amostras de áudio dos canais esquerdo e direito e a quantidade dessas amostras. Por padrão a taxa de amostragem possui 16 bits e 44.100Hz. A seguir segue o exemplo de criação do efeito de eco. O efeito de eco ou delay como explicado na seção 2 pode ser brevemente descrito como a repetição do sinal original até o decaimento total do som. Uma Figura 6 - Fila Circular (PIMENTEL;CRISTINA 2012) estrutura de dados que é utilizada para a construção deste efeito é a fila circular (Figura 6). Ela funciona da seguinte forma: os dados são inseridos na fila e são removidos de acordo com a ordem de inserção. Para o caso do efeito de delay as amostras de áudio são inseridas na fila e conforme o tempo pré-definido as amostras são executadas e removidas da fila. Os parâmetros de configuração do efeito são: Level – Expressa a intensidade das repetições. Os estão entre 0 e 0,5; Feedback – É a quantidade de repetições. Os valores vão de 1 à 10; Delay – É o tempo entre as repetições. Os estão entre 0 até 5 segundos. Para o cálculo do decaimento do delay é necessário o uso das através das fórmulas abaixo: Sendo o levelFactor a variável que será multiplicada pela posição da amostra de áudio na fila circular, para obter o level de cada repetição do sinal. Na Figura 7 pode ser observado esse procedimento no último laço do “for”. for (int index = 0; index < inNumberFrames ; index++ ) { bufferLeft[bufferHead] = sampleBufferLeft[index]; bufferRight[bufferHead] = sampleBufferRight[index]; bufferHead++; if(bufferHead >= BUFFER_LENGTH - 1){ bufferHead = 0; } sampleBufferRight[index] *=.5; sampleBufferLeft[index] *=.5; } for(int i = 1 , j = feedback ; i < feedback; i++, j--){ bufferTail = (bufferHead - (delay + inNumberFrames) * i); if(bufferTail < 0){ bufferTail = (BUFFER_LENGTH - 1) - abs(bufferTail); } for (int index = 0; index < inNumberFrames ; index++ ) { sampleBufferLeft[index] += bufferLeft[bufferTail] * (level * j); sampleBufferRight[index] += bufferRight[bufferTail] * (level * j); bufferTail++; if(bufferTail >= BUFFER_LENGTH - 1){ bufferTail = 0; } } } Figura 7 - Algoritmo de Delay O efeito de distorção foi proveniente do trabalho de Krueger (2012), o algoritmo foi adaptado para o funcionamento no ISoundFx a partir das fórmulas abaixo: Sendo que fGanho corresponde ao nível de distorção dentro do intervalo de 0,1 à 0,7 e X a amostra de áudio. A Figura 8 expressa o as fórmulas de distorção aplicadas no algoritmo. Os parâmetros do efeito são: Gain – Corresponde a quantidade saturada; Level – É a intensidade da distorção. -(void)onStream : (UInt32) inNumberFrames sampleBufferLeft: (SInt32*) sampleBufferLeft sampleBufferRight: (SInt32*) sampleBufferRight{ SInt32 *x1, *x2; x1 = sampleBufferLeft; x2 = sampleBufferRight; for(int i = 0; i < inNumberFrames; i++){ x1[i] = ((1 + k) * x1[i]) / ( 1 + k * abs(x1[i]) ); x1[i] = x1[i] * level; x2[i] = x1[i]; } } Figura 8 - Algoritmo de Distorção 4.3 Considerações Finais Este trabalho apresentou o funcionamento do ISoundFx que é uma biblioteca de efeitos sonoros e a construção dos efeitos de distorção e delay. Para a concepção da biblioteca foram dados alguns fundamentos sobre o framework de áudio da plataforma iOS, o Audio Units e os efeitos construídos. O funcionamento dos efeitos em tempo real, a possibilidade da criação de novos efeitos sem grande impacto a estrutura do projeto e principalmente o encapsulamento do framework de áudio nativo são a principais características do ISoundFX . Algumas sugestões de trabalhos futuros: a construção de novos efeitos para a biblioteca, a criação de aplicações utilizando a biblioteca e por último, a criação de uma interface comum para configuração dos efeitos. Referências KRUEGER, Daniel. “Tratamento de sinais sonoros no computador simulando pedais virtuais”. Monografia de Ciência da Computação – Universidade do Vale do Itajaí. Itajaí. 2008. APPLE. “iOS Technology Overview”. Disponível em: <http://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/iPh oneOSTechOverview/iPhoneOSTechOverview.pdf>. Acessado em 18 de março de 2012. MENDES, Leandro Fernando; GOURLAT, Rafael Lopes. “Pedaleira multi-efeitos para guitarra com processamento digital de sinais”. Monografia do Curso de Engenharia Elétrica – Universidade Positivo. Curitiba. 2009. BAITONA. “Amplifier Distortion”. Disponível em: <http://www.baitona.net/forum/baitona53/bait23109/>. Acessado em 2 de junho de 2012. PIMENTEL, Graça; CRISTINA, Maria. “Fila Circular”. Disponível em: <http://www.icmc.usp.br/~sce182/fcirc.html/>. Acessado em 2 de junho de 2012.