MAC 499 - Trabalho de Formatura Supervisionado


ACMUS - Um Sistema para Projeto e Simulação da Acústica de Ambientes para Escuta Musical




Nome do aluno: Yang Yili
Nome do supervisor: Fábio Kon ( www.ime.usp.br/~kon)

Índice

Resumo
1. Introdução
2. Metodologias e ferramentas empregadas e tópicos estudados
3. Trabalhos correlatos
4. Sistema desenvolvido
5. Bibliografias utilizadas
6. Desafios e frustrações encontrados
7. Disciplinas relevantes do BCC no trabalho
8. Interação com membros da equipe
9. Aplicação de conceitos estudados no curso no contexto real
10. Conclusão
11. Agradecimentos


Resumo

Esta monografia é dividida em duas partes. A primeira parte descreve a iniciação científica feita no último ano do curso de ciência da computação como trabalho de formatura supervisionado. Esta iniciação tem como meta construir um software para a medição e gerenciamento acústico de ambientes com finalidades musicais e suporte à investigação de questões relacionadas ao controle e tratamento acústico de ambientes destinados a atividades musicais (auditórios, estúdios, pequenos teatros, etc...) e ao ensino (salas de aula, auditórios para palestras e seminários, etc...). A segunda parte descreve as experiências pessoais adquiridas durante a iniciação.

Introdução

Nas últimas três décadas, a incorporação de processos e desenvolvimentos tecnológicos variados nas diversas fases da produção musical tem apontado para a necessidade de uma maior interação entre músicos, técnicos e cientistas de outras áreas, entre elas a ciência da computação. Numa época em que cada vez mais nosso contato com a produção musical é mediado por tecnologias diversas (processos de gravação, alto-falantes, aparelhos de som, computadores, software e hardware variados), a aproximação da música com essas áreas se torna evidente e necessária.

Recentemente a área denominada acústica de salas vem ganhando notoriedade em função da demanda pela realização de projetos de estúdios de gravação, home-theaters, cinemas, teatros e salas de concerto. Algumas empresas têm se estabelecido no Brasil para suprir essa demanda, porém sua atuação baseia-se quase sempre no uso de tecnologias caríssimas e procedimentos padronizados e importados. Assim, ao mesmo tempo em que o mercado brasileiro apresenta uma alta demanda por especialistas em acústica de salas e por tecnologias para auxiliar o seu gerenciamento, parece que não existe nenhuma tecnologia nacional para isso e os poucos técnicos especializados no assunto dependem exclusivamente de ferramentas importadas a um alto custo.

Baseado nos motivos acima, surgiu o projeto ACMUS , que é um projeto temático financiado pela FAPESP na área de sistema da computação e tem por objetivo:


Como o projeto trata de vários assuntos, ele envolve professores do Departamento de Ciência da Computação do IME-USP e do Departamento de Música da ECA-USP, alunos de várias unidades da USP (IME, ECA, POLI, etc...) no nível de graduação e pós-graduação. O papel principal do nosso departamento, Ciência da Computação, é fornecer ferramentas e suportes computacionais.

A iniciação científica é inserida neste projeto com objetivos centrais:


Metodologias e ferramentas empregadas e tópicos estudados

Metodologias empregadas

No trabalho, foram empregados conceitos avançados de ciência da computação, incluindo metodologias de desenvolver software baseado em componentes, orientação a objetos, técnicas de otimização e heurísticas. Os detalhes serão descritos nos próximos parágrafos.

A metodologia global empregada para o trabalho é dividir o desenvolvimento em duas etapas. A primeira etapa é estudar ferramentas e tópicos relacionados, e depois familiarizar com eles, ou seja, começar com alguns programas relativamente simples. Agora na segunda etapa desenvolvemos o sistema.

A metodologia empregada para desenvolver o sistema é quebrá-lo em módulos, ou seja, em componentes. Cada componente tem uma funcionalidade específica e é feito independente; resumidamente, os componentes foram feitos em uma sequência de complexidade cada vez maior, isso significa começar com componente mais simples, fazê-lo, testá-lo e quando tudo estivesse certo, ir para o próximo que é mais complexo. Para implementar cada componente técnicas como refatoramento e reestruturação de códigos são usadas para melhorar a qualidade de código, garantindo sua funcionalidade também.

Antes de implementar um componente, sempre houve um período de estudo do tópico que abordaríamos. Como componentes têm funcionalidades diferentes logo tratam de assuntos diversos, e geralmente os assuntos não são muito ligados uns aos outros. Os tópicos estudados serão apresentados um pouco mais para frente.

Ferramentas utilizadas

A linguagem de programação utilizada para desenvolver o sistema foi Java, pois esta é segura, robusta, orientada a objetos e tem alto desempenho. Além disso, os seguintes motivos nos levam a escolhê-la:

  • Java é gratuita. Qualquer pessoa pode baixar compilador na página oficial dela para compilar e executar programa escrito em Java, o que facilitaria a distribuição do sistema.

Uma plataforma é o ambiente de hardware ou software em que um programa é executado. Algumas plataformas mais populares são Windows, Linux, Solaris e MacOS. A maioria das plataformas pode ser descrita como uma combinação do sistema operacional e hardware. A plataforma de Java se diferencia delas em que ela é uma plataforma somente de software que executa em cima de outras plataformas baseadas em hardware.

A plataforma de Java tem dois componentes: 1) Máquina Virtual de Java(Java VM - Java Virtual Machine), ela é a base e é transportada para várias plataformas baseadas em hardware. 2) Interface da Programação de Aplicativo de Java(Java API - Java Application Programming Interface), ela é uma grande coleção de componentes prontos que fornece capacidades úteis, bem como interface gráfica de usuário (GUI - Graphical User Interface). Esses componentes são agrupados em bibliotecas de classes e interfaces relacionadas, que são mais conhecidos como pacotes.

A seguinte figura mostra um programa executado na plataforma de Java, podemos perceber que Java VM e Java API separam o programa do hardware.

Java é uma plataforma poderosa de software, ela oferece as seguintes características:

Java também possui APIs para gráficos de 2D e 3D, acessibilidade, animação e mais. A seguinte figura mostra o que é incluído na Java 2 SDK.


Os principais pacotes estudados e utilizados para desenvolver o sistema são:

  • Java Applet

      Applets são programas escritos em Java e incluídos numa página HTML da mesma maneira que uma imagem é incluída para que possam ser executados dentro de um Java-habilitado navegador. Quando usuário usa um Java-habilitado navegador para visualizar página que contém applet, o código de applet é transferido para o sistema do usuário e executado pela Java VM do navegador. Applet é implementada através de criar uma subclasse da classe Applet, ela pode usar a maioria da Java API. A seguinte figura mostra a hierarquia da herança da classe Applet, essa hierarquia determina a maioria do que uma applet pode fazer e como.

      Carregar código através de rede é um risco de segurança clássico. Para applets em Java, este risco é reduzido, pois Java é projetada para ser segura - por exemplo, ela não permite ponteiros para memória aleatória. Mais ainda, navegadores reforçam segurança através das restrições como não permitir applets carregarem código escrito em linguagem que não seja Java, e não permitir applets lerem e escreverem arquivos no computador do navegador.

  • Java AWT

      O pacote AWT (Abstract Window Toolkit) faz parte da JFC (Java Foundation Classes) e oferece suporte a interface gráfica para programas em Java. Algumas características são:

      • um conjunto rico de componentes de interface gráfica;
      • um modelo robusto de tratar eventos;
      • ferramentas de gráficos e imagens, incluindo cor;
      • gerenciadores flexíveis de janela que não dependem do tamanho particular de janela ou da resolução de tela;

  • Java Swing

      O pacote Swing também faz parte da JFC. Ele fornece componentes desde botões até tabelas para construir interface gráfica. A maior diferença entre os componentes do AWT e os do Swing é que os do Swing são implementados sem código nativo e não são limitados pelas características da plataforma. Além disso, eles deixam programador especificar qual look and feel (visualização e percepção) a interface gráfica vai usar. Pelo contrário, os componentes do AWT sempre têm look and feel da plataforma.

  • Java Sound API

      Java Sound API oferece suporte de baixo nível às operações de áudio como reprodução, captura, mistura e síntese, favorecendo extensibilidade e flexibilidade.

  • JMF(Java Media Framework) API

      JMF permite que áudio, vídeo e outras mídias baseadas em tempo sejam adicionados em aplicativos e applets de Java. Ele extende as capacidades de multimídia na plataforma J2SE e é uma ferramenta poderosa para desenvolver tecnologia escalável.

    Tópicos estudados:

    Como o trabalho é interdisciplinar, foram estudados tópicos tanto na área da computação quanto na área de acústica e música. A união destes conhecimentos é fundamental para garantir o funcionamento do sistema.

    1. na área da computação:

    Programação orientada a objetos-Como Java é uma linguagem orientada a objetos, não faria sentido se fizesse programa procedural usando ela, portanto antes de usá-la, seria necessário aprender os princípios e as vantagens dela. Programação orientada a objetos (POO) é uma metodologia de programação adequada para desenvolver sistemas de grande porte, provendo modularidade e reusabilidade. A POO introduz uma abordagem na qual o programador visualiza seu programa como uma coleção de objetos cooperantes que se comunicam através de mensagens. Cada um dos objetos é instância de uma classe e todas as classes formam uma hierarquia de classes via relacionamento de herança. Alguns aspectos importantes para definir POO são:

      1.Uso de objetos, e não funções ou procedimentos como seu bloco básico para construir programas
      2.Objetos comunicam-se através de mensagens
      3.Cada objeto é instância de uma classe
      4.Classes estão relacionadas com outras via mecanismos de herança

    Formalmente, para ser considerada uma linguagem orientada a objetos, é preciso implementar quatro conceitos básicos: abstração, encapsulamento, herança e polimorfismo.

    Abstração é considerada como a habilidade de modelar características do mundo real do problema que o programador tenta resolver. As técnicas de abstração podem ser aplicadas para centralizar os recursos em uma superclasse e deixar a especialização para as classes específicas (subclasses) criadas a partir daquela. A programação em camadas é necessária para se ter um reaproveitamento de código com as classes abstratas.

    Encapsulamento é a base de toda a abordagem da POO; isto porque contribui fundamentalmente para diminuir os problemas causados pela interferência externa sobre os dados. Partindo desse princípio, toda e qualquer transação feita com esses dados só pode ser feita através de procedimentos dentro desse objeto, pelo envio de mensagens. Desta maneira, um dado está encapsulado por código de forma que só é visível na rotina onde foi criado; o mesmo acontece com uma rotina, que sendo encapsulada, suas operações internas são invisíveis às outras rotinas.

    Herança é um mecanismo que permite um grau alto de reutilizar código. Do ponto de vista prático, pode ser entendido como sendo um conjunto de instâncias criadas a partir de um outro conjunto de instâncias com características semelhantes, e os elementos desse subconjunto herdam todas as características do conjunto original. A idéia é fornecer um mecanismo simples mas muito poderoso para definir novas classes a partir de uma existente. Assim sendo, diz-se que essas novas classes herdam todos os membros (propriedades e métodos) da classe-mãe, o que torna o mecanismo de herança uma técnica muito eficiente para construir, organizar e reutilizar código.

    Polimorfismo, na informática, e em particular no universo da POO, é definido como sendo um código que possui "vários comportamentos" ou que produz "vários comportamentos"; em outras palavras, é um código que pode ser aplicado à várias classes de objetos. De maneira prática, isto quer dizer que a operação em questão mantém seu comportamento transparente para quaisquer tipos de argumentos.

    O paradigma da programação orientada a objetos possibilita a criação de sistemas que parecem teias, onde cada nó dessa teia é uma classe, mas cada classe pode ser aproveitada para construir outros nós da teia, bem como a reutilização desses nós em outros sistemas, diminuindo o tempo de codificação e depuração de códigos. É verdade que o tempo necessário para se criar um software usando POO é maior no início do projeto pela necessidade de identificar as classes abstratas. Quanto maior for a capacidade de abstração, maior será a reutilização de classes no sistema. Nessa abstração surgem as superclasses que têm elementos em comum e que serão utilizados nas subclasses; estes elementos sofrem, conforme a necessidade, o recurso do polimorfismo. No entanto, um bom software com técnicas de POO é gerado a partir do tempo gasto nessa etapa; quanto mais abstratas forem as suas classes primitivas, maior será a facilidade de implementar as classes específicas. Talvez um sistema possa ser implementado mais rápido com técnicas de programação procedural, porém terá sua manutenção comprometida na relação custo-tempo. Já no software orientado a objetos basta alterar na classe primitiva para que todas as classes derivadas percebam essa modificação, mas isso não acontece com programação procedural, pois todas as modificações têm que ser feitas em todos os módulos necessários.

    2. na área de acústica e música

    Tempo de reverberação-RT60 é uma medida acústica usada para calcular o tempo que um som leva para cair 60db numa sala grande, ainda há debate quanto ao valor de RT60 em salas pequenas, or em salas com RT60 menor que 1 segundo. Na maioria de salas, RT60 é longo nas frenquências baixas. Um RT60 longo tende a deixar o entendimento de palestra numa sala mais difícil, mas por outro lado, poderia ser agradável para algumas formas de música. Superfície e tamanho da sala são fatores que influenciam RT60. A fórmula mais usada para calcular RT60 é:

    RT60 = k*(V/Sa)

    Onde k é uma contante que é igual a 0.161 quando as unidades de medida são expressadas em metros e 0.049 quando as unidades são expressadas em feet. Sa é o total de absorção de superfície de uma sala expressado em sabins. (Foi o Wallace Sabine que derivou a fórmula na década 20 do século passado.) Ele é a soma de todas as áreas de superfície na sala multiplicadas por seus respectivos coeficientes de absorção. O coeficiente de absorção expressa o fator de absorção de materiais em uma dada frequência. A tabela de coeficientes de absorção para vários materiais pode ser encontrada em livros sobre acústica de sala.

    RT60 é uma ferramenta poderosa para predizer inteligibilidade, e para a seleção de materiais acústicos. Informação de RT60 também fornece diretriz para determinar onde alto-falantes serão essenciais para manter inteligibilidade de palestra. Por isso, teste de RT60 é padrão para certos projetos (por exemplo, teatros, cinemas), nos quais é necessário demonstar que um espaço irá alcançar o tempo de reverberação estipulado. Muitas vezes, é preciso medir para verificar resultados. Para obter RT60 válido, é importante eliminar, quando possível, barulhos causados por sistema de aquecimento, ar-condicionado, ventiladores, ou outros barulhos que poderiam interferir a medição, quando mais silenciosa a sala, mais fácil obter melhor resultado. A vantagem de usar teste de RT60 é que ele é livre de variáveis e direto.

    Frequência de ressonância-Frequência de ressonância é uma frequência natural de vibração determinada pelos parâmetros físicos do objeto vibrante. Algumas características das frequências de ressonância são:

      1. É fácil de fazer um objeto vibrar nas suas frequências de ressonância, difícil de fazer ele vibrar nas outras frequências.
      2. A maioria de objetos tem múltiplas frequências de ressonância.

    No sistema, o que nos importa é o cálculo das frequências de ressonância modal de uma sala. Em uma certa sala, há três tipos das freqüências de ressonância: axial, tangencial e oblíqua. Eles são determinados por medidas da sala. O cálculo das frequências é dado por:

    onde v é a velocidade de som (344 m/s), L, W, H são comprimento, largura e altura da sala, e p, q, r são números inteiros (0, 1, 2, 3....) e o cálculo deve ser feito para frequências até 300 Hz apenas. A separação entre frequências é dada em função de p, q, r: quando dois deles forem iguais a zero, o modo é axial; quando um deles for igual a zero, o modo é tangencial agora quando os três forem diferentes de zero, o modo é oblíquo.

    FFT (Fast Fourier Transform-Transformada Rápida de Fourier)-A tranformada de fourier, em nome de Jean Baptiste Joseph Fourier, é uma transformada de frequência que decompõe uma função em suas partes de seno e cosseno para várias frequências. O resultado é uma função no domínio de frequência, representando o espectro de frequência da função original. Para uma função contínua de uma variável f(t), a transformada de fourier F(f) é definida como :

    e a transformada inversa como:

    onde j é a raiz quadrada de -1 e e denota o exponente natural.

    DFT (Discrete Fourier Transform) é uma transformada de fourier aplicada a uma série de valores complexos e discretos produzindo análise da frequência de sinais discretos e não-periódicos. Considerando uma série complexa x(k) com N amostras da forma:

    onde

    que é um número complexo. A transformada de fourier desta série também tem N amostras e é definida como:

    A transformada inversa é definida como:

    A equação de DFT é muito complicada de calcular, pois ela requer muitas adições e multiplicações de números complexos. Mesmo para um sinal simples com oito amostras, precisaria de 49 multiplicações complexas e 56 adições complexas para computar DFT. Isso ainda é gerenciável, porém um sinal real poderia conter 1024 amostras que precisaria de mais de 20,000,000 multiplicações e adições complexas, o que seria difícil de gerenciar. FFT é um algoritmo eficiente para calcular a DFT e sua inversa, e é mais rápido para valores grandes de N, onde N é o número de amostras na sequência. Para resolver um problema de N, DFT levaria tempo em ordem de O(N^2), com FFT somente precisaria de tempo em ordem de O(NlogN). A idéia de FFT é divisão e conquista que quebra os N pontos originais de amostra em (N/2) sequências, pois uma série de problemas menores é mais fácil de resolver do que um grande. DFT requer (N-1)^2 multiplicações complexas e N(N-1) adições ao contrário da abordagem de FFT que quebra a sequência original em sequências com dois amostras só que somente requer 1 multiplicação, 2 adições e a recombinação dos pontos. Como o algoritmo divide a sequência em tamanhos iguais em cada passo, o número de amostras geralmente é limitado para a potência de 2.

    FFT transforma dados no domínio de tempo para o domínio de frequência, portanto ela é muito usada em análise de sinal. É comum para informação ser codificada nas senóides que formam um sinal, isso é verdade para sinais ocorrendo em natureza bem como para aqueles criados por homens . Porém a forma de onda no domínio de tempo não é importante, a informação chave é na frequência, usando FFT esta informação pode ser extraída. Para aplicar FFT, alguma técnica é necessária. Relembra-se que FFT computa o espectro de frequência a partir de um bloco de amostras da entrada chamado recorde de tempo(time record), além disso, FFT assume que este recorde de tempo é repetido ao longo do tempo. Isso causaria distorção no resultado quando a entrada não é periódica em relação ao recorde de tempo. Para resolver o problema, é usada a técnica de janela. Pois percebemos que a maioria dos problemas aparecem mais nos dois lados do recorde de tempo, se FFT pudesse ignorar os dois lados e concentrar no meio do recorde de tempo, poderíamos esperar um resultado mais próximo ao correto no domínio de frequência. Para isso, multiplicamos o recorde de tempo por uma função que é zero nos dois lados e muito grande no meio, assim poderíamos concentrar FFT no meio do recorde de tempo. Funções como esta são chamadas de funções de janela, pois elas nos obrigam a observar dados através de uma janela estreita. Através desta técnica, pode-se obter uma melhoria para processar dados não periódicos em relação ao recorde de tempo. Entretanto, é importante notar que foram modificados os dados de entrada e não podemos esperar um resultado perfeito. Algumas funções de janela mais utilizadas são:

    Além dos tópicos acima, foi estudado um pouco de física para entender melhor os conceitos de música e acústica como som, frequência de ressonância, vibração, etc...


    Trabalhos correlatos

    A primeira etapa da iniciação científica é uma fase de aprender as ferramentas utilizadas e familiarizar com elas. Nesta etapa, dois livros: Thinking in Java do Bruce Eckel e Core Java do Cay S. Horstmann e Gary Cornell eram mais estudados para reforçar os conhecimentos de programação orientada a objetos e interface gráfica. Antes de implementar o sistema, foram feitas algumas applets como base do sistema para serem executadas em navegadores. Applet é uma boa prática, basta ter um Java-habilitado navegador, já pode usá-la sem a necessidade de compilar o programa, pois o que está inserido na página é um arquivo .class que é arquivo executável de Java. Os navegadores mais usados como Microsoft Internet Explorer, Netscape geralmente têm suporte a Java. Desta maneira, applet facilita a distribuição de programa, sendo que encontrar um navegador em uma máquina é mais fácil que encontrar o compilador de Java. Cada applet desenvolvida realizava uma tarefa específica. Nesta fase, as principais ferramentas utilizadas foram os pacotes Java AWT e Java Applet.

    Três applets foram feitas, elas faziam:

      1. Calcular velocidade de som
      2. Mostrar gráfico de tempo de reverberação
      3. Mostrar gráfico de freqüências de ressonância

    Todas as applets foram testadas nos navegadores Internet Explorer e Netscape na plataforma Windows e Linux. Como esperávamos, a característica de Java ser portável garante o funcionamento. A interface de applets é muito parecida com a do sistema que será discutido, seus códigos e documentações estão disponíveis na página do projeto ACMUS , portanto aqui não vai entrar em detalhe sobre elas.

    Sistema desenvolvido

    A segunda etapa da iniciação científica é desenvolver o sistema. O pacote AWT foi substituído pelo Swing por o último ser mais sofisticado para construir interface gráfica. Foram feitos três módulos que correspondem três applets da fase anterior e alguns módulos novos.

    1. Menu principal

    Este é o menu principal para juntar alguns módulos. Na parte esquerda, são os módulos, ou seja, as tarefas que o aplicativo pode realizar. Na parte direita, são as descrições de cada módulo para que usuário possa saber o que cada módulo realmente faz. Usuário pode selecionar o nome do módulo para ler a descrição. Uma vez selecionado um módulo, usuário pode clicar no botão OK para o próximo passo ou no botão Quit para sair.

    2. Calculadora da Velocidade de Som

    Som se propaga através de ar como uma onda longitudinal. Onda de som, bem como a maioria de outros tipos de onda, pode ser descrita em termos do seguinte fenômeno:

    É importante notar que a velocidade de som em ar é determinada por uma combinação de fatores ambientais e não depende da amplitude, frequência or comprimento da onda de som. Este módulo tem temperatura e umidade, dois fatores principais, como entrada e calcula a velocidade de som nesta condição.

    3. Tempo de Reverberação Teórico RT60

    Os fatores que determinam RT60 são mais complicados que os que determinam a velocidade de som. Além das medidas da sala, devem ser considerados tamanho e material de paredes, pois cada material apresenta um coeficiente de absorção diferente que afeta RT60 de uma forma ou outra. Um cálculo mais cuidadoso ainda deve considerar janelas, pois obviamente parede e janela usam materiais diferentes. Este módulo mostra o gráfico de tempo de reverberação conforme medidas da sala, materiais da superfície e outras informações opcionais. Mais de uma janela de gráfico pode ser aberta para facilitar a comparação entre gráficos de entradas diferentes.

    4. Gráfico de Frequência de Ressonância

    Embora applet torne página mais interativa, existem restrições de segurança que navegadores impõem para impedir que applets comprometam segurança do sistema, as políticas mais comuns são:

    • Ela não pode ler ou escrever arquivos no computador do navegador.
    • Ela não pode ler algumas propriedades do sistema.
    • Janelas que uma applet cria têm aparências diferentes das que um aplicativo cria.

    Cada navegador tem um objeto gerenciador de segurança (SecurityManager) que implementa suas políticas de segurança. Quando o gerenciador de segurança detecta uma violação, ele lança uma exceção de SecurityException. A applet captura essa exceção e reage apropriadamente. Neste módulo, foi acrescentada uma funcionalidade nova que não podia ser feita com applet : salvar resultado em arquivo. A parte mais para cima são as medidas de sala que usuário fornece como entrada. Quando ele clica no botão Compute, aparece o gráfico de três frequências. A parte direita é uma tabela com os dados relevantes. Usuário pode clicar no botão Save File para salvar a tabela. A vantagem de salvar a tabela num arquivo é permitir fazer análise posterior e comparação entre dados de entradas diferentes. Devido às restrições de segunraça, a applet não tinha esta funcionalidade.

    Conforme a necessidade de pesquisa: 1. Os resultados são ordenados em ordem crescente em três tabelas correspondentes aos modos axiais, tangenciais e oblíquos. 2. A diferença entre cada frequência sucessiva é calculada. 3. A média dessa diferença é calculada. 4. Os resultados são mostrados em três gráficos contendo as frequências nos respectivos modos, de 0 a 300 Hz.

    5. Analisador de Espectro

    O matemático Fourier provou que qualquer função contínua poderia ser produzida como uma soma infinita de funções de seno e cosseno. O resultado tem grande importância para a reprodução e síntese de som. O processo de decompor som em seus componentes de seno e cosseno é chamado análise de Fourier. O som pode ser caracterizado em termos das amplitudes das funções de seno que o compõem. Este conjunto de números informa o conteúdo harmônico de som e é, às vezes, referido como o espectro harmônico de som. O conteúdo harmônico é o determinador mais importante da qualidade de uma nota musical.

    Uma vez sabe o conteúdo harmônico de um som a partir de análise de Fourier, seria capaz de sintetizar aquele som a partir de uma série de geradores de tom puro através de ajustar suas amplitudes e somá-las. Isso é chamado síntese de Fourier. Ondas geomêtricas são mais usadas em síntese de som por terem um complemento de harmônicos rico, esses harmônicos podem ser filtrados para produzir uma variedade de sons. Como faz síntese de som? Sinais periódicos podem ser convertidos em som através de ampliá-los. Uma maneira de fazer isso é simplesmente somar várias amplitudes dos harmônicos até que o timbre desejável seja obtido, chamando síntese aditiva. Outra maneira é começar com ondas geomêtricas, que são ricas em conteúdo harmônico, e filtrar os harmônicos para produzir um novo som, chamando síntese subtrativa.

    Se uma função contínua f(t) é periódica com período T, então ela pode ser aproximada arbitrariamente bem por uma série de Fourier:

    onde os coeficientes são dados por:

    O módulo Spectrum Analyser(Analisador de Espectro) é um módulo novo que não existia applet correspondente. Para usar este aplicativo, usuário precisa fornecer frequência, taxa de amostra e número de amostras, informações necessárias sobre o sinal a ser analisado, e escolher a função de janela para ser usada na FFT. Quando clicar na botão Draw Graph, será mostrado tanto o sinal quanto o espectro dele.

    O código fonte deste aplicativo pode ser obtido aqui.

    6. Analisador de Sinal

    O módulo Signal Analyser(Analisador de Sinal) também é um módulo novo. Ele tem a mesma idéia que Analisador de Espectro de usar FFT para analisar som. Ao invés de analisar uma onda geomêtrica e periódica, ele analisa um arquivo de som que seria mais realista na prática. As principais funcionalidades deste módulo são:

      a)integrar a funcionalidade de emitir som com a de gravar som.
      b)mostrar o gráfico FFT do som original e gravado.
      c)gerar gráfico mostrando a distorção do som gerado pela sala e pelo equipamento de áudio. Este gráfico será obtido, observando-se, para cada freqüência, as diferenças entre o som emitido e o som gravado.

    A interface é dividida em duas partes. A parte esquerda mostra o formato do arquivo de som. Encoding(codificação) indica a tecnologia usada para codificar áudio por este formato, incluindo aspectos do formato de som. Um tipo muito usado é PCM(Pulse-Code Modulation) que é uma representação linear da forma de som. Com PCM, o número armazenado em cada amostra é proporcional à amplitude instantânea da pressão de som naquele ponto. Outros tipos incluem mu-law e a-law que são mapeamentos não lineares da amplitude de som. Sample Rate(taxa de amostra) indica o número de amostras reproduzidas ou gravadas por segundo. Sample Size in Bits(número de bits por amostra) indica o número de bits em cada amostra. Sign(sinal) indica se os dados são com sinal ou não. Endian indica se os dados de som são armazenados em ordem de big-endian ou little-endian. Channels(canais) indica o número de canais de áudio(1 para único, 2 para estéreo). Taxa de amostra, número de bits por amostra e número de canais são parâmetros que caracterizam dados de som.

    A parte direita da interface são as funcionalidades. Inicialmente, somente o botão Choose File é ativado, usuário pode escolher um arquivo de som através de clicá-lo. Depois de ter selecionado o arquivo, os botões de Play/Record e Original FFT serão ativados. Usuário pode optar por visualizar o gráfico FFT do som original ou reproduzir e gravar o som original ao mesmo tempo. Caso quiser reproduzir e gravar o som, precisa colocar no campo File to Save o nome do arquivo para gravar. Em Java, existem cinco formatos disponíveis: AIFC, AIFF, AU, SND, WAVE. O que difere de um formato por outro é a técnica usada para a compressão de dados de áudio. Geralmente, é possível definir conversão entre formatos, porém com perda de informação. Depois de gravar o som, os dois últimos botões Record FFT e Difference FFT serão ativados. Daqui para frente, usuário pode realizar todas as funcionalidades disponíveis. Neste módulo, foi usado o pacote JMF que é opcional, não faz parte do compilador padrão de Java. Para poder compilar e executar o módulo corretamente, acesse à página JMF para baixar o pacote e instalar na máquina.

    Os seguintes gráficos FFT mostram resultado obtido de um arquivo de som:

    O primeiro é do som original, e o segundo é do som gravado. Eles mostram a evolução da intensidade de cada frequência ao longo do tempo. Percebe-se um deslocamento em relação ao eixo X no segundo gráfico comparando com o primeiro. Isso é a demora causada pelo equipamento de áudio. Ainda apareceram alguns barulhos que o primeiro não tinha, isso é por causa do ambiente de gravação. Essas são informações relevantes que queríamos descobrir.

    O código fonte deste módulo pode ser obtido aqui.

    Basicamente, toda interface é feita em Inglês para facilitar a distribuição do sistema. Qualquer pessoal no mundo inteiro pode baixar o código na página e colaborar com o projeto como queríamos. Durante o ano, já recebimos e-mails das pessoas de outros países que estão fazendo pesquisa na área similar e queriam trocar idéias e experiências.


    Bibliografias utilizadas

    [1] Aldred, John, Manual of Sound Recording, London: Fountain Press, 1972

    [2] Beranek, Leo L. (1962). Music, Acoustics, and Architecture. New York: John Wiley and Sons.

    [3] Roads, Curtis. The computer music tutorial. MIT press, Cambridge, Massachusetts, 1996.

    [4] Backus, John, The Acoustical Foundations of Music, 2nd Ed, W W Norton, New York, 1977

    [5] Benade, Arthur H., Fundamentals of Musical Acoustics, Oxford University Press, 1976

    [6] Beranek, Music, Acoustics and Architecture, Wiley, 1962

    [7] Berg, Richard E. e Stork, David G., The Physics of Sound, 2nd Ed., Prentice Hall, 1995

    [8] Borden, G. J. e Harris, K. S., Speech Science Primer: Physiology, Acoustics and Perception of Speech, 2nd Ed, Williams and Wilkins, 1984

    [9] P. Duhamel e M. Vetterli, "Fast Fourier transforms: a tutorial review and a state of the art," Signal Processing 19, 259-299, 1990

    [10] H. Guo e C. S. Burrus, "Fast approximate Fourier transform via wavelets transform," Proc. SPIE Intl. Soc. Opt. Eng. 2825, 250-259, 1996

    [11] H. Guo, G. A. Sitton, e C. S. Burrus, "The Quick Discrete Fourier Transform," Proc. IEEE Conf. Acoust. Speech and Sig. Processing (ICASSP) 3, 445-448, 1994

    [12] H. V. Sorensen, D. L. Jones, M. T. Heideman, e C. S. Burrus, "Real-valued fast Fourier transform algorithms," IEEE Trans. Acoust. Speech Sig. Processing ASSP-35, 849-863, 1987

    [13] Bruce Eckel, Thinking in Java, Prentice-Hall, 2002

    [14] Cay S. Horstmann e Gary Cornell , Core Java, Prentice-Hall

    [15] Página oficial de JMF

    [16] Página oficial de Java: http://java.sun.com


    Desafios e frustrações encontrados

    O trabalho não foi fácil, tive alguns momentos desafiadores, entre eles destacam-se:

      1. Apesar de gostar de ouvir música, nunca tinha tido contato com a área de música e acústica. Para fazer o trabalho, tive que estudar muito nessas áreas para ter conhecimento razoável. No estudo, alguns conceitos e terminologias eram muito novos para mim que exigiam um bom entendimento.

      2. Muitas fórmulas, principalmente as de FFT, exigiam uma boa base de cálculo. Depois de ter feito todas as matérias de cálculo, fiquei anos sem ter contato com ele. Para entender FFT, tive que ler livros de cálculo de novo para recordar.

      3. Nunca tinha feito um sistema tão grande como este sozinha. No curso tive vários projetos grandes, mas todos foram feitos em grupos de mais de três pessoas, a carga de trabalho era menor. Neste trabalho, fui única reponsável pelo sistema, garantindo que ele funcione como deveria. Usuário só vai ver a interface gráfica. O que está por atrás da interface gráfica são os códigos. O que está por atrás dos códigos são as tarefas pequenas mas fundamentais no cotidiano: estudar materiais, escrever códigos, testar e depurar programa. quando tivesse dúvidas, procurar na internet, consultar em livros ou perguntar para alguém que sabe. Através do trabalho, aprendi adotar uma postura positiva e trabalhar de forma independente. Foi uma experiência muito valiosa e gostei.

    Além dos desafios, a maioria das frustrações foi por causa de tempo. Nem sempre tudo ocorreu como esperado, principalmente quando houve problema inesperado no programa, o tempo levaria para resolver geralmente era muito difícil estimar, consequentemente atrasaria as atividades subsequentes. Mais ainda, acho que a qualidade dos códigos poderia ter sido melhor. Sendo uma linguagem orientada a objetos, Java tem alguns aspectos importantes que foram apresentados anteriormente, mas quando houve conflito entre funcionalidade do sistema e os princípios de POO, dei prioridade para que o sistema funcionasse. Isso se deve à falta de tempo e também ao que não sou muito experiente.


    Disciplinas relevantes do BCC no trabalho

    MAC 110 (Introdução à Computação), MAC 122 (Princípios de Desenvolvimento de Algoritmos) e MAC 323 (Estruturas de Dados): Essas são disciplinas básicas para alunos da computação. Adquiri nocões básicas de programação que estão sempre presentes no meu trabalho.

    MAC 211 (Laboratório de Programação I):É nesta disciplina que comecei fazer projeto grande de várias fases e me acostumar com a metodologia de implementar sistema em etapas. Foram apresentados noção de portabilidade, técnicas de depuração de programas, modularização de código e ferramentas auxiliares no desenvolvimento de programas, que ajudaram muito no meu trabalho.

    MAC 242 (Laboratório de Programação II): É nesta disciplina que aprendi Java, a linguagem de programação utilizada para desenvolver o sistema. Foram apresentados introdução à orientação a objetos, interface gráfica com usuário (GUI) e seu uso no desenvolvimento de programas, conceitos importantes no meu trabalho. Vale mencionar que o EP da disciplina era desenvolver interface gráfica usando Java Swing, o que forma uma base fundamental para meu trabalho.

    MAC 316 (Conceitos Fundamentais de Linguagem de Programação): Esta disciplina introduz os principais paradigmas de linguagem de programação e os conceitos fundamentais relacionados. Aproveitei muito a parte relacionada a linguagens orientadas a objetos, bem como polimorfismo, módulos, herança e hierarquias.

    MAC 332 (Engenharia de Software): Esta disciplina apresenta as atividades que compõem o processo de desenvolvimento de software. O sistema desenvolvido por mim não é muito simples, aprendi e utilizei diversas técnicas de gereciamento de projeto, interface com usuário, modelagem para projeto, verificação, teste, documentação, etc...

    Como Java é uma linguagem de programação orientada a objetos, sempre quis fazer disciplinas como MAC 441 (Programação Orientada a Objetos) ou MAC 413 (Tópicos Avançados de Programação Orientada a Objetos ) para aprofundar meu conhecimento desta área. Acredito que ajudaria a melhorar o código. Infelizmente, devido ao conflito de horário, não consegui cursá-las, o que realmente foi uma pena.

    Além das disciplinas na área da computação, queria mencionar algumas disciplinas básicas que tiveram papeis importantes no meu trabalho.

    MAT 138 (Álgebra I) e MAT 213 (Álgebra II): Como todos os módulos do sistema pedem algum tipo de cálculo, essas duas disciplinas formam uma base sólida para garantir que o sistema gere resultado correto.

    MAT 221 (Cálculo Diferencial e Integral IV): Nesta disciplina, foi apresentada série de Fourier que usei para implementar o módulo do gráfico FFT.

    FAP 137 (Física II): Nesta disciplina, tive contato com ondas eletromagnéticas e seu espectro que ajudaram um melhor entendimento de som no meu trabalho.

    Acredito que o currículo do BCC fornece aos alunos visão introdutória e ampla de diversas áreas da computação e oferece base necessária e formação sólida para que os alunos possam atuar em várias áreas quando se formarem ou aprofundar numa determinada área em que se interessarem.


    Interação com membros da equipe

    Como foi dito anteriormente, o projeto ACMUS envolve professores e alunos de várias unidades da USP, a formação dos membros da equipe é bem heterogênea, temos músicos, engenheiros, cientistas da computação. Tínhamos reuniões para apresentar novo trabalho, estudar tópico interessante ou assistir a palestra dada pelos convidados de fora. Essas atividades são fundamentais e importantes para meu trabalho. Ao longo do tempo, as pessoas que interessavam nesta área colaboram com nossa equipe e participam de reuniões.

    Durante a implementação do sistema, todos os membros da equipe sempre estiveram à disposição de me ajudar. Meu orientador, o Professor Fábio Kon possui ampla experiência no desenvolvimento de sistemas de software complexos, realiza pesquisas na área de computação musical há 12 anos e é principal responsável pela parte computacional do sistema. Ele indicava materiais relevantes aos assuntos como programação orientada a objetos, refatoração, interface gráfica para eu estudar, tirava eventuais dúvidas, revisava meu código para possíveis melhorias e achou alguns erros que eu não tinha descoberto pela falta de experiência. O professor Fernando Iazzetta é especialista em novas tecnologias para a música e é o responsável pelas disciplinas de Acústica do Departamento de Música da ECA-USP. No projeto, ele é responsável pelos conhecimentos específicos nas áreas de acústica e música. Ele me emprestava vários livros sobre assuntos musicais e tirava minhas dúvidas nesta área. Com a orientação dos dois professores experientes, consegui manter o equilíbrio entre parte computacional e musical que são dois componentes essenciais do sistema. Além dos professores, os alunos da equipe são muitos amigáveis. O aluno do mestrado Nelson Lago compartilhava seus resultados da pesquisa comigo, recomendava vários artigos, programas e páginas interessantes. Tudo isso facilitou muito meu trabalho.

    Usava muito máquinas do LCPD (Laboratório de Computação Paralela e Distribuída) para meu trabalho. O laboratório possui um ambiente muito agradável. Embora as pessoas pertençam a projetos diferentes, sempre houve uma compreensão profunda em relação ao uso da rede e a troca de experiências técnicas. Sendo aluna da graduação, conseguia tirar bastantes benefícios técnicos dos alunos da pós-graduação. Eles são muitos abertos a qualquer dúvida e discussão.

    Além da interação com pessoas da USP, tive uma interação muito construtiva com a lista de discussão mudial javasound-interest mailing list do Java Sound Interest Group. A lista foi montada por pessoas interessadas em desenvolver sistemas usando Java Sound. É um lugar onde usuários ajudam usuários, mas também pode ser vista participação de engenheiros de Sun Microsystems. Ela é o fórum principal para discussões relacionadas a Java Sound.

    Quando comecei fazer o módulo que desenhava gráfico FFT, os gráficos não estavam certos. Levei muito tempo pensando nisso. No fim, um aluno da Alemanha que estava fazendo pesquisa na área similar recomendou o pacote JMF. Antes, nem sabia que existia este pacote. Com isso, o programa conseguiu gerar resultado correto.

    Fiz o sistema sozinha, mas nunca me senti solidão, pois sabia que o espírito de colaboração estava sempre presente em todo lugar, todo momento.


    Aplicação de conceitos estudados no curso no contexto real

    Os principais conceitos estudados no curso que foram aplicados são os de programação orientada a objetos, interface gráfica e desenvolvimento de sistemas. Obviamente, os conceitos básicos da computação estão sempre presentes.

    A minha iniciação científica permitiu que eu pudesse concretizar teorias adquiridas em aulas para resolver problema prático, e consequentemente encurtou a distância entre teoria e prática. Os conceitos foram aplicados também são aplicáveis a outros projetos, sendo que programação orientada a objetos está cada vez mais empregada no desenvolvimento de sistemas, tornando-se o paradigma mais atual em termos de criação de softwares, interface gráfica é a tendência dominante para tornar software mais interativo com usuário, e finalmente os conceitos de desenvolvimento de sistemas são indispensáveis para qualquer projeto grande. Portanto a iniciação foi uma oportunidade excelente de me dar vivência prática das aplicações de ciência da computação, como o objetivo do trabalho de formatura.


    Conclusão

    Computação musical é uma área relativamente nova da computação, mas ela tem crescido muito rápido nos últimos anos. Muitas universidades começaram a ter esta linha de pesquisa. Mas no Brasil, são muito raras as iniciativas no sentido de desenvolver um trabalho de pesquisa direcionado à área de acústica musical. Os poucos trabalhos brasileiros de acústica ligados à produção musical estão muito mais voltados aos problemas da engenharia civil, engenharia elétrica e arquitetura do que aos problemas musicais específicos. Mesmo com a visível ampliação na quantidade de laboratórios de pesquisa musical no meio acadêmico ocorrida na última década, são poucas as vezes nas quais as questões de acústica musical são abordadas. Parece ser inexistente qualquer tentativa anterior de desenvolver software para dar suporte ao projeto e simulação acústica. Neste contexo, minha iniciação torna-se uma iniciativa nacional na área e será útil para músicos e engenheiros obterem dados e análises necessários.

    Além da consideração acadêmica, vale ressaltar algumas considerações pessoais. Primeiro acho que a iniciação ofereceu uma boa oportunidade para fazer pesquisa. No curso tivemos vários projetos grandes, mas nenhum deles exigia tanta pesquisa numa área específica como ela. Através da iniciação, aprendi buscar informação necessária nas fontes disponíveis como internet, livros de forma ativa e aperfeiçoar a capacidade de estudar sozinha. Ao mesmo tempo, a quantidade de códigos escritos também supera qualquer outro projeto, o que concretizou muitos conceitos adquiridos no curso. Segundo ela ofereceu uma boa oportunidade para descobrir para onde vou me especializar. Como foi dito, as matérias da graduação são introdutórias fornecendo uma visão geral de diversas áreas da computação. Para quem quer aprofundar mais, precisaria descobrir o caminho antes de tudo. Através da iniciação, descobri os assuntos e áreas que me interessavam e tenho mais certeza para onde vou indo.

    Finalmente, o mais importante é a experiência adquirida, não só para formação acadêmica, também me beneficiará na vida toda. Pois a vida real também é cheia de desafios, a atitude adotada decidiria destino diferente. Através da inicição, aprendi sempre enfrentar desafios com uma atitude positiva e ativa e nunca perder coragem e confiança. Não posso negar que sofri com os desafios, mas isso foi compensado pela satisfação e felicidade que senti quando os conquistei. Fugir nunca é uma solução, também não posso dizer que sempre consegui o que queria. Mas depois de ter esforçado, mesmo que não tenha conseguido, não me arrependeria no futuro.

    Quatro anos no BCC me ensinou muito mais do que conhecimentos acadêmicos: como me relaciono com professores, colegas, funcionários, como gerencio tempo de maneira eficiente, como lido com pressão, como organizo tarefas em tempo limitado, etc... Essas são experiências que enriqueceram minha vida. Depois de ter vivido no BCC, creio com mais firmeza que muitas coisas parecem impossíveis pela primeira vista, mas poderiam ser possíveis se tentasse, portanto nunca desista antes de todas tentativas. Sendo uma estrangeira, sinto muita gratidão de ter tido esta passagem internacional, pois agora consigo pensar de um ponto de vista diferente e ter uma visão mais ampla do mundo.

    Quando terminar a gradução, ninguém pode dizer que ainda é uma criança, por isso tenho que me comportar com disciplina, educação, sinceridade e responsabilidade. Neste momento posso dizer com certeza que o BCC contribuiu para minha maturidade tanto profissional quanto pessoal. Quantro anos não é um tempo muito longo em nossa vida, já tive vários quatro-ano e ainda terei vários quatro-ano, mas este quatro-ano é único, especial e inesquecível.


    Agradecimentos

    Finalmente, gostaria de agradecer às pessoas diretamente ou indiretamente envolvidas comigo durante o tempo todo, como

    a minha família que me criou e sempre me dá apóio durante a vida toda, não apenas nestes quatro anos.

    a equipe de ACMUS que me deu ajuda técnica diretamente, em particular, meu orientador Fábio Kon e o professor da ECA Fernando Iazzeta.

    todos os meus amigos pertos ou distantes que me acompanham, especialmente nos momentos difíceis. É uma felicidade sempre ter vocês do meu lado, não importa a distância e o tempo que nos separam.

    os professores que me passaram conhecimentos acadêmicos e experiências pessoais tal que eu pudesse crescer profissionalmente e pessoalmente.

    as pessoas da lista Java Sound que nunca vi e talvez nunca encontrarei, mas contribuíram para meu trabalho de forma muito importante. Com esta experiência, sinto que conhecimento não tem fronteira.

    Não fiz a lista com as pessoas a quem queria agradecer, seria enorme e muito provavelmente haveria alguma omissão. Acho que qualquer uma delas se encaixa numa das categorias acima. Posso dizer que sem elas, não chegaria aqui, portanto mais uma vez, no fundo do meu coração: Muito Obrigada a Todos!

    Yang Yili
    Last modified: Mon Dec 8 10:38:01 BRST 2003