Você está na página 1de 101

INSTITUTO SUPERIOR DE ENGENHARIA DE LISBOA

rea Departamental de Engenharia de Electrnica e Telecomunicaes


e de Computadores

GUITAR SOLO TRACKER


Relatrio Final

Alaney Kilson Dria


(Licenciado)
TRABALHO DE PROJECTO REALIZADO PARA OBTENO DO GRAU
DE MESTRE EM ENGENHARIA INFORMTICA E DE COMPUTADORES

Jri:
Fernando Manuel Gomes de Sousa, Presidente do Jri
Jos Manuel Peixoto Nascimento, Vogal (arguente)
Manuel Martins Barata, Vogal (arguente)
Artur Jorge Ferreira, Vogal (orientador)

Maro de 2011

INSTITUTO SUPERIOR DE ENGENHARIA DE LISBOA


rea Departamental de Engenharia de Electrnica e Telecomunicaes
e de Computadores

GUITAR SOLO TRACKER


Relatrio Final

Alaney Kilson Dria


(Licenciado)
TRABALHO DE PROJECTO REALIZADO PARA OBTENO DO GRAU
DE MESTRE EM ENGENHARIA INFORMTICA E DE COMPUTADORES

Jri:
Fernando Manuel Gomes de Sousa, Presidente do Jri
Jos Manuel Peixoto Nascimento, Vogal (arguente)
Manuel Martins Barata, Vogal (arguente)
Artur Jorge Ferreira, Vogal (orientador)

Maro de 2011

Resumo
A motivao para este trabalho vem da necessidade que o autor tem em poder registar as notas
tocadas na guitarra durante o processo de improviso. Quando o msico est a improvisar na
guitarra, muitas vezes no se recorda das notas tocadas no momento, este trabalho trata o
desenvolvimento de uma aplicao para guitarristas, que permita registar as notas tocadas na
guitarra elctrica ou clssica. O sinal adquirido a partir da guitarra e processado com requisitos de
tempo real na captura do sinal.
As notas produzidas pela guitarra elctrica, ligada ao computador, so representadas no formato de
tablatura e/ou partitura. Para este efeito a aplicao capta o sinal proveniente da guitarra elctrica a
partir da placa de som do computador e utiliza algoritmos de deteco de frequncia e algoritmos de
estimao de durao de cada sinal para construir o registo das notas tocadas.
A aplicao desenvolvida numa perspectiva multi-plataforma, podendo ser executada em
diferentes sistemas operativos Windows e Linux, usando ferramentas e bibliotecas de domnio
pblico.
Os resultados obtidos mostram a possibilidade de afinar a guitarra com valores de erro na ordem de
2 Hz em relao s frequncias de afinao standard. A escrita da tablatura apresenta resultados
satisfatrios, mas que podem ser melhorados. Para tal ser necessrio melhorar a implementao de
tcnicas de processamento do sinal bem como a comunicao entre processos para resolver os
problemas encontrados nos testes efectuados.
Palavras chave: Reconhecimento automtico de notas musicais, Transcrio musical, Deteco e
estimao de frequncias, Fast Fourier Transform, Algoritmo de Goertzel, Auto-correlao.

Abstract
The motivation for this work comes from the author's need to be able to record the notes played on
guitar during the process of improvisation. When the musician is improvising on the guitar, often
does not remember the notes played at the time, this work addresses the development of an
application for guitarists. The application aims to register the notes played on a classic or electric
guitar. The signal is obtained from the guitar and processed with real-time requirements for audio
capture.
The notes produced by the electric guitar, connected to the computer, are presented in the form of a
tablature and/or score. In order to get this result, the application captures the signal of a guitar, by
the sound card of the computer, and uses frequency estimation and detection algorithms and signal
duration algorithms, in order to create the register of the notes played.
The application is developed in a multi-platform perspective, allowing to be run in different
operating systems, using tools and public domain libraries.
The obtained results show a possibility of tuning the guitar with an error within a 2 Hz range in
relation to the frequency tuning standard. However the writing of the tablature has not obtained
conclusive results regarding the level of reliability of the application. Therefore improvements of
the implementation of the signal processing in order to solve the problems found during testing and
interprocess communication, will be necessary.
Keywords: Automatic recognition of musical notes, Musical transcription, Detection and
estimations of frequencies, Fast Fourier Transform, Goertzel algorithm, Autocorrelation.

ndice
1 Introduo.........................................................................................................................................1
1.1 Solues existentes...................................................................................................................3
1.2 Descrio geral da soluo proposta.........................................................................................4
1.3 Organizao do texto................................................................................................................5
2 Formulao do problema..................................................................................................................7
2.1 Conceitos e terminologia associados msica.........................................................................7
2.1.1 Notao musical..............................................................................................................10
2.1.2 Representao das notas..................................................................................................11
2.2 Guitarra elctrica e equipamentos...........................................................................................15
2.2.1 Produo de som da guitarra elctrica............................................................................15
2.2.2 Escalas e frequncias da guitarra elctrica......................................................................17
2.2.3 Hardware e software.......................................................................................................18
2.3 Problema a resolver................................................................................................................19
3 Tcnicas de processamento de sinal para deteco de frequncia..................................................20
3.1 Algoritmo FFT........................................................................................................................20
3.2 Algoritmo Goertzel.................................................................................................................21
3.3 Auto-correlao......................................................................................................................23
3.4 Anlise comparativa das solues..........................................................................................24
3.5 Filtragem e decimao............................................................................................................26
3.5.1 Filtro passa-baixo de Chebyshev....................................................................................31
3.5.1.1 Implementao do Filtro.........................................................................................32
3.6 Tcnicas de janelas.................................................................................................................33
3.7 Tcnica de estimao da durao da nota...............................................................................33
3.8 Resumo...................................................................................................................................36
4 Soluo proposta e implementao................................................................................................39
4.1 Critrios de desenho da soluo..............................................................................................39
4.2 Arquitectura............................................................................................................................41
5 Aspectos de implementao e desenvolvimento............................................................................43
5.1 GST Transporter ....................................................................................................................43
5.1.1 Transporter comandos ....................................................................................................46
5.1.2 Classe CLogger...............................................................................................................47
5.1.3 Classe Frame...................................................................................................................48
5.1.4 Classe Config e ConfigManager.....................................................................................48
5.1.5 Classe CTimer.................................................................................................................49
5.1.6 Timer no sistema operativo Windows.............................................................................50
5.1.7 Timer no sistema operativo Linux..................................................................................50
5.2 Camada de udio....................................................................................................................50
5.2.1 Classe CAudioServer......................................................................................................51
5.2.2 Classe CAudioPort..........................................................................................................52
5.2.3 Classe CBuffer................................................................................................................53
5.3 Camada de processamento de sinal........................................................................................54
5.3.1 Classe CSignalProcessing...............................................................................................55

5.4 Camada de gravao...............................................................................................................56


5.4.1 Classe CAudioFileIO......................................................................................................56
5.5 Integrao entre servidor e interface grfica...........................................................................57
5.5.1 Integrao com ficheiro udio.........................................................................................59
5.5.2 Integrao com fila de mensagem...................................................................................60
5.6 Interface grfica......................................................................................................................61
5.6.1 Classe Transporter...........................................................................................................63
5.6.2 Classe libSndFile.............................................................................................................64
5.6.3 Janelas da aplicao........................................................................................................65
5.7 Testes unitrios.......................................................................................................................68
5.7.1 Testes unitrios do servidor udio.................................................................................68
5.7.2 Testes unitrios do Transporter.......................................................................................72
5.7.3 Teste unitrio da Interface grfica...................................................................................73
6 Avaliao Experimental.................................................................................................................75
6.1 Execuo do benchmark.........................................................................................................75
6.2 Afinao da guitarra................................................................................................................79
6.3 Deteco e apresentao das notas.........................................................................................81
6.3.1 Testes efectuados com a guitarra clssica.......................................................................81
6.3.2 Testes efectuados com guitarra elctrica.........................................................................82
7 Concluses......................................................................................................................................83
8 Anexo A - Tabelas com resultados de deteco de frequncia......................................................85
9 Anexo B - Clculos dos coeficientes..............................................................................................87
Referncias.........................................................................................................................................89

ndice de figuras
Figura 1: Screenshot do Guitar Pro (adaptado de [3])..........................................................................2
Figura 2: Screenshot da aplicao Guitar Rig (adaptado de [5])..........................................................2
Figura 3: Sintetizador Roland VG-99 (Adaptado de [6]).....................................................................3
Figura 4: Captadores para captar as notas da guitarra (adaptado de [8]).............................................4
Figura 5: Esquema de funcionamento da aplicao.............................................................................5
Figura 6: Teclado de piano, as teclas brancas so notas naturais e as pretas acidentes.......................7
Figura 7: Exemplo de uma oitava no piano..........................................................................................8
Figura 8: Exemplo do brao da guitarra com todas as notas (adaptado de [11]).................................8
Figura 9: Metrnomo analgico (adaptado de [13]).............................................................................9
Figura 10: Metrnomo TM-40 (adaptado de [14])...............................................................................9
Figura 11: Elementos de uma pauta musical......................................................................................10
Figura 12: Clave de Sol, F e D.......................................................................................................11
Figura 13: Notao musical para piano (adaptado de [15])................................................................11
Figura 14: Tabela com figuras musicais para representao de notas e pausas (Adaptado de [16])..12
Figura 15: Exemplos de aplicao das figuras em diferentes compassos (adaptado de [17])............12
Figura 16: Relao entre as figuras musicais (adaptado de [18]).......................................................13
Figura 17: Exemplo de tablatura para guitarra...................................................................................13
Figura 18: Exemplo de tablatura com efeitos ou tcnicas (adaptado de [22]) ..................................14
Figura 19: Exemplo de representao de Bend Up (adaptado de [23])..............................................14

Figura 20: Exemplo da tcnica Legato Slide (adaptado de [23]).......................................................14


Figura 21: Guitarra elctrica (adaptado de [24])................................................................................15
Figura 22: Captador de guitarra(adaptado de [25])............................................................................16
Figura 23: Funcionamento dos captadores (adaptado de [25])...........................................................16
Figura 24: Esquema de um captador magntico (adaptado de [26])..................................................17
Figura 25: Diagrama de bloco do filtro ordem II de Goertzel............................................................21
Figura 26: Diagrama de decimao....................................................................................................26
Figura 27: Resposta em frequncia do filtro tipo Bessel de ordem 4 (adaptado de [31]). O eixo x representa as frequncias em fraces da frequncia de amostragem, O eixo y a vermelho representa a
magnitude e normalizada da resposta do filtro, e y a azul a fase.......................................................27
Figura 28: Resposta em frequncia do filtro de Butterworth de ordem 4 (adaptado de [31]). O eixo x
representa as frequncias em fraces da frequncia de amostragem, O eixo y a vermelho representa
a magnitude e normalizada da resposta do filtro, e y a azul a fase.....................................................28
Figura 29: Resposta em frequncia do filtro de Chebyshev de ordem 4 (adaptado de [31]). O eixo x
representa as frequncias em fraces da frequncia de amostragem, O eixo y a vermelho representa
a magnitude e normalizada da resposta do filtro, e y a azul a fase.....................................................28
Figura 30: Resposta em frequncia do filtro de Bessel de ordem 8 (adaptado de [31]). O eixo x representa as frequncias em fraces da frequncia de amostragem, O eixo y a vermelho representa a
magnitude linear e normalizada da resposta do filtro, e y a azul a fase.............................................29
Figura 31: Resposta em frequncia do filtro de Butterworth de ordem 8 (adaptado de [31]). O eixo x
representa as frequncias em fraces da frequncia de amostragem, O eixo y a vermelho representa
a magnitude e normalizada da resposta do filtro, e y a azul a fase.....................................................30
Figura 32: Resposta em frequncia do filtro de Chebyshev de ordem 8 (adaptado de [31]). O eixo x
representa as frequncias em fraces da frequncia de amostragem, O eixo y a vermelho representa
a magnitude e normalizada da resposta do filtro, e y a azul a fase.....................................................30
Figura 33: Resposta em frequncia do filtro de Chebyshev com ripple de 20% (adaptado de [33]). 31
Figura 34: Resposta em frequncia do filtro de Chebyshev tipo I (adaptado de [34]).......................31
Figura 35: Resposta em frequncia de filtro de Chebyshev tipo II (Adaptado de [34]).....................32
Figura 36: Diagrama de filtro IIR na forma directa II (Adaptado de [36])........................................32
Figura 37: Sequncia da janela deslizante para o clculo da durao do sinal..................................35
Figura 38: Exemplo de uma arquitectura multicore ou multi-processador (Adaptado de [44]).........40
Figura 39: Comparao entre operaes escalares e operaes SIMD (adaptado de [46])................40
Figura 40: Arquitectura da aplicao.................................................................................................41
Figura 41: Camadas da aplicao.......................................................................................................41
Figura 42: Diagrama de blocos resumindo as bibliotecas utilizadas e sua aplicao.........................42
Figura 43: Sequncia de processamento do Transporter....................................................................44
Figura 44: Sequncia para a estimao de frequncias......................................................................45
Figura 45: Diagrama UML da classe CGSTTransporter....................................................................46
Figura 46: Diagrama UML da classe CLogger..................................................................................47
Figura 47: Diagrama UML da classe Frame......................................................................................48
Figura 48: Diagrama UML das classes Config e ConfigManager.....................................................48
Figura 49: Diagrama UML da camada de captura udio....................................................................51
Figura 50: 1 iterao entre o leitor e escritor.....................................................................................53
Figura 51: 2 iterao entre leitor e escritor........................................................................................53
Figura 52: M iterao entre leitor e escritor.......................................................................................54
Figura 53: Diagrama das classes da camada de processamento de sinal............................................55

Figura 54: Diagrama UML da classe CAudioFileIO.........................................................................57


Figura 55: Diagrama de integrao entre o GSTTransporter e a Interface grfica............................58
Figura 56: Diagrama geral da aplicao.............................................................................................63
Figura 57: Diagrama UML da classe GST.Transporter.....................................................................64
Figura 58: Diagrama UML do namespace LibSndFile com classes e enumerados...........................65
Figura 59: Guitar Solo Tracker janela principal.................................................................................66
Figura 60: Janela do Metrnomo........................................................................................................67
Figura 61: Janela do afinador de guitarra...........................................................................................67
Figura 62: Janela Transporter para iniciar e para o processo de deteco das notas..........................68
Figura 63: Interface grfica do Jack Audio Connection Kit...............................................................69
Figura 64: Resultado da execuo do teste.........................................................................................70
Figura 65: Picos mximos do sinal captado do microfone.................................................................70
Figura 66: Screenshoot do componente AudioTrack com desenho do sinal udio em forma de onda
............................................................................................................................................................73
Figura 67: Erro de deteco de frequncias (em Hz) com factor de decimao de 15, para as 49 notas........................................................................................................................................................76
Figura 68: Erro de deteco de frequncias com factor de decimao de 20, com as 49 notas.........77
Figura 69: Erro de deteco de frequncias com factor de decimao de 20, com as 45 notas descartando as notas com aliasing................................................................................................................78
Figura 70: Afinador Yamaha YT-120................................................................................................80
Figura 71: Desenho da tablatura como resultado de notas tocadas na guitarra clssica....................81
Figura 72: Brao da guitarra com as notas correspondentes a cada corda nos trastos (adaptado de
[76])....................................................................................................................................................84

ndice de tabelas
Tabela 1: As colunas representam as oitavas e as linhas a notas musicais........................................18
Tabela 2: Caractersticas dos computadores de desenvolvimento......................................................18
Tabela 3: Nmero de pontos com base em Fs com resoluo de 2 Hz..............................................22
Tabela 4: Razo entre a frequncia mnima 82,41 Hz e mxima 1174,66 Hz...................................25
Tabela 5: Complexidade dos algoritmos............................................................................................25
Tabela 6: Parmetros utilizados para analisar a resposta em frequncia dos filtros passa-baixo.......27
Tabela 7: Nmero de pontos da FFT, resoluo no tempo e frequncia............................................37
Tabela 8: Resumo dos parmetros utilizados para estimao da frequncia......................................37
Tabela 9: Parmetros passados ao executvel do Transporter ..........................................................43
Tabela 10: Ficheiros e classes pertencentes ao GSTTransporter.......................................................46
Tabela 11: Comandos passados ao GSTTransporter..........................................................................47
Tabela 12: Comparao das caractersticas das funes de temporizador disponibilizas pela API do
Windows.............................................................................................................................................50
Tabela 13: Classes pertencentes camada de udio...........................................................................51
Tabela 14: Classes pertencentes camada de processamento udio..................................................54
Tabela 15: Classes e ficheiros pertencentes camada de gravao udio.........................................56
Tabela 16: Classes pertencentes interface grfica...........................................................................62
Tabela 17: Condies dos testes executados......................................................................................68

Tabela 18: Lista de testes unitrios executados no AudioServer.......................................................69


Tabela 19: Lista de testes unitrios executados com CFileIO............................................................70
Tabela 20: Lista de testes unitrios executados com CSignalProcessing...........................................71
Tabela 21: Lista de testes unitrios executados com GSTTransporter...............................................72
Tabela 22: Lista de testes unitrios executados no GuitarSoloTrackerUI..........................................73
Tabela 23: Frequncias de cada corda na afinao standard..............................................................75
Tabela 24: Parmetros e resultados de teste.......................................................................................75
Tabela 25: Resumo de resultados dos testes para encontrar o melhor factor de decimao para as 6
frequncias..........................................................................................................................................79
Tabela 26: Comparao do desvio do afinador da aplicao com uma guitarra clssica e guitarra
elctrica afinadas usando o afinador Yamaha YT-120.......................................................................80
Tabela 27: Resultado de deteco de frequncias com factor de decimao de 15. As frequncias em
amarelo correspondem s de afinao standard.................................................................................85
Tabela 28: Resultado de deteco de frequncias com factor de decimao de 20. As frequncias em
amarelo correspondem s de afinao standard.................................................................................86

Lista de Acrnimos
ALSA Advance Linux Sound Architecture
API Application Programming Interface
ASIO Audio Stream Input Output
BPM Beat Per Minute
CPU Central Processing Unit
DFT Discrete Fourier Transform
DLL Dynamic Link Library
FFT Fast Fourier Transform
FFTW Fast Fourier Transform in the West
FLAC Free Lossless Audio Codec
GTK GIMP Tool Kit
JACK Jack Audio Connection Kit
LED Ligth Emmitting Diode
MIDI Musical Instrument Digital Interface
MSMQ Microsoft Message Queue
PC Personal Computer
SIMD Single Instruction Multiple Data
SSE Streaming SIMD Extensions
UML Unified Modeling Language
XML Extensible Markup Language

1 Introduo
A motivao para este trabalho vem da necessidade que o autor tem em poder registar as
notas tocadas na guitarra durante o processo de improviso. Quando o msico est a
improvisar na guitarra, muitas vezes no se recorda das notas tocadas no momento, este
trabalho trata o desenvolvimento de uma aplicao para guitarristas, que permita registar as
notas tocadas na guitarra elctrica ou clssica. O sinal adquirido a partir da guitarra e
processado com requisitos de tempo real na captura do sinal.
No momento de inspirao de um msico, o improviso normalmente o processo para
novas criaes. Para um guitarrista o processo normal para recordar o que foi improvisado,
consiste em gravar o improviso e mais tarde ouvir e analisar a gravao, para
posteriormente poder reproduzir e anotar o que foi tocado.
No caso de um guitarrista solo, existem tcnicas como leggato [1], shredding [2], assim
como speed picking [2] solo, em que so tocadas vrias notas por batida; neste caso difcil
detectar todas as notas apenas com a audio do sinal medida que este vai sendo
produzido.
Designa-se de speed picking a capacidade de se tocar vrias notas em BPM (Beat Per
Minute) superiores a 160. A tcnica de sweeping uma forma de se conseguir os speed
picking, tocando 6 cordas da guitarra, sequencialmente, para cima e para baixo, com a mo
direita, como se estivesse a varrer as cordas, enquanto a mo esquerda pressiona a corda
entre os trastos e toca 1 ou 2 notas por corda.
Para guitarristas, existem aplicaes para criar e editar tablaturas como o Guitar Pro 6 [3],
para fazer toda a composio na aplicao e ouvir em formato Musical Instrument Digital
Interface (MIDI) [4]. O Guitar Pro permite tambm ver acordes, escalas e imprimir em
formato de tablatura e partitura tudo o que o guitarrista compor. Contudo, esta aplicao no
permite captar sinais da guitarra; o guitarrista tem que gravar a msica que improvisou e
ouvir para tentar reproduzir as notas tocadas. A Figura 1 apresenta o screenshot do software
Guitar Pro 6.

Figura 1: Screenshot do Guitar Pro (adaptado de [3])

Observamos na Figura 1 uma tablatura e partitura criada no Guitar Pro 6, onde esquerda
possuem os elementos musicais para construo de uma partitura. O Guitar Rig [5]
apresentado na Figura 2, outra aplicao vocacionada para guitarristas, simulando um
pedal de efeitos no computador.

Figura 2: Screenshot da aplicao Guitar Rig (adaptado de [5])

O Guitar Rig realiza efeitos em tempo real com baixa latncia no computador, como se de
uma pedaleira real se tratasse. Uma aplicao com capacidade de criar tablatura para o
2

guitarrista a partir do que ele toca, iria permitir que o guitarrista no tivesse que gravar e
ouvir constantemente o que tinha tocado para o poder reproduzir, como tambm iria ajudar
no processo criativo da composio e improviso.
O objectivo do projecto consiste no desenvolvimento de uma aplicao que possibilite ao
msico gravar o som da guitarra durante o processo de improviso, detectar as notas tocadas
e automaticamente criar uma tablatura e/ou partitura. A captao/aquisio do sinal feita
em tempo real, mas no existem requisitos de tempo real no processamento e na
apresentao das notas. Assim, conseguir-se- uma aplicao capaz de auxiliar o guitarrista
no seu processo de composio.
As aplicaes existentes para guitarrista, em geral so divididas em dois tipos: aplicaes
para efeitos, como o Guitar Rig e para notao e composio musical. Comparativamente
com aplicaes de notao musical como Guitar Pro, a diferena seria que na aplicao o
guitarrista s necessitava de exprimir com a guitarra toda a sua criatividade, e a aplicao
automaticamente registava esse momento criativo.
Ao contrrio do que acontece com o Guitar Pro, por exemplo, seria necessrio que o
guitarrista gravasse, ou tomasse nota passo a passo do que estava a tocar, o que iria de certa
forma atrasar e perturbar todo o processo criativo. Com a soluo proposta Guitar Solo
Tracker, o guitarrista poder ter a aplicao a ser executada e ir tocando a guitarra, e ao
mesmo tempo que grava todo o som. O guitarrista poderia tambm estar a ensaiar com a
banda e gravar todo o ensaio, para depois poder corrigir; isso ajudaria o guitarrista a guardar
e registar qualquer momento de genialidade.

1.1 Solues existentes


A nvel de mercado, no existem produtos que possuam as mesmas funcionalidades, tanto
ao nvel de software como ao nvel de hardware. O dispositivo de hardware mais prximo
soluo que se pretende desenvolver, por requerer captura e identificao das notas tocadas
na guitarra o Roland VG-99 [6]. Este sintetiza o sinal vindo da guitarra elctrica, captado
por meio de captadores adaptados guitarra e um conversor MIDI apresentado na Figura 3
[7].

Figura 3: Sintetizador Roland VG-99 (Adaptado de [6])

O Roland VG-99, apresentado na Figura 3 responsvel pela sintetizao do sinal vindo da


guitarra. Desta forma torna possvel o guitarrista produzir o som com a guitarra e em
seguida reproduzir esse som como se fosse produzido por um piano, por exemplo. Para
captar o sinal da guitarra, este dispositivo possui um captador prprio que adicionado
guitarra, e ligado a um conversor MIDI, como apresenta a Figura 4 [8].
3

Figura 4: Captadores para captar as notas da guitarra (adaptado de [8])

Os captadores apresentados na Figura 4, tm que ser presos na guitarra e estes convertem as


vibraes das cordas em sinais MIDI. Este sistema caro comparativamente com uma
soluo por software, dado que necessrio comprar os captadores, o conversor MIDI e o
sintetizador.

1.2 Descrio geral da soluo proposta


A soluo desenvolvida neste trabalho tem o seguinte funcionamento:
A guitarra elctrica ligada ao computador atravs de uma placa de som. A aplicao
instalada no computador vai captar o sinal enviado pela guitarra elctrica e detectar a
frequncia do sinal enviado pela guitarra e com base na frequncia detectada, feito o
mapeamento para notas musicais. Na aquisio do sinal da guitarra calcula-se a durao da
nota para ser utilizada na criao de uma partitura. A Figura 5 apresenta o cenrio de
funcionamento e utilizao da aplicao.

Figura 5: Esquema de funcionamento da aplicao

O sinal udio da guitarra elctrica poder ou no passar por um pedal de efeito antes de ser
ligado ao PC. Ser realizado um estudo sobre a melhor opo entre ligar ao PC o sinal com
ou sem efeito. Esta anlise servir para se definir um esquema final, depois de se obter
como resultado a influncia que os diversos efeitos de guitarra podem ter na deteco do
sinal. No entanto, o sinal que ser enviado para a aplicao ser sem efeito. O facto do sinal
ter algum efeito, pode influenciar na deteco correcta das frequncias, porque muitos
efeitos envolvem a alterao das harmnicas do sinal da guitarra.
A deteco das notas feita mediante a utilizao de algoritmos de deteco de frequncia.
Opta-se pela Fast Fourier Transform (FFT), aps a anlise de vrios algoritmos. A
apresentao do resultado ao guitarrista feita num ficheiro de imagem representando uma
tablatura que contm as notas identificadas pela aplicao.
A aplicao foi desenvolvida em ambiente Linux, com a distribuio Fedora 14, de 64 bit,
usando as linguagens C/C++ e C#. Embora tenham sido desenvolvidas em Linux, as
bibliotecas utilizadas suportam outras plataformas. A ferramenta de desenvolvimento
utilizada foi o MonoDevelop [9] que tambm est disponvel para Windows.

1.3 Organizao do texto


O presente relatrio est organizado em 7 Captulos.
No Captulo 2 realiza-se a introduo ao problema, nomeadamente com conceitos e
terminologias associados msica (Captulo 2, seco 2.1). Esta introduo terminologia
importante para se compreender a ligao entre a msica e o processamento de sinal, bem
como para obter uma percepo mais detalhada do problema que se pretende resolver.
feita ainda no Captulo 2, a introduo s notas musicais, a sua notao em pauta e a relao
com frequncias. A partir da seco 2.2 descrito o equipamento que ser utilizado,
nomeadamente a guitarra elctrica, a sua constituio, a forma de produo de som e notas
musicais, e tambm a largura de banda associada. Na seco 2.3 descreve-se em pormenor o
problema que se pretende resolver.
No Captulo 3, abordado o estudo e anlise feita com algoritmos de deteco de
frequncia, onde so analisadas a FFT, Goertzel e auto-correlao [10]. So analisados os
algoritmos estudados escolhendo-se o que melhor se adequa ao problema.
O Captulo 4 descreve a soluo proposta para o problema. Aborda-se a arquitectura da
aplicao, e o esquema de funcionamento. A arquitectura da aplicao ilustra como a
aplicao foi dividida em vrias camadas funcionais, detalhando o tipo de funcionalidade de
cada camada no contexto geral. O esquema de funcionamento relata como o utilizador final,
o guitarrista, usa a aplicao, e como se interligam a guitarra elctrica e o computador.
O Captulo 5 apresenta os aspectos referentes ao desenvolvimento do projecto, as vrias
camadas e as classes que as constituem. Por cada classe apresentada uma tabela que
associa as classes aos ficheiros do projecto, e tambm o diagrama Unified Modeling
Language (UML) de cada classe. Tambm abordada neste Captulo, na seco 5.2 a
integrao entre as duas componentes principais da aplicao desenvolvida, nomeadamente
o GSTTransporter e a interface grfica.
5

No Captulo 6 reportam-se e analisam-se os resultados obtidos no funcionamento da


aplicao. analisada a preciso da deteco das notas e o desempenho da aplicao na
execuo da aplicao.
O relatrio termina no Captulo 7 com as concluses e descrio de possveis direces de
trabalho futuro que podero melhorar o desempenho da aplicao bem como introduzir
novas funcionalidades.

2 Formulao do problema
Neste captulo formulado o problema que se pretende resolver. So caracterizados todos
os elementos que fazem parte do problema e desenvolvimento da soluo. Introduzem-se
conceitos relacionados com a composio musical e sua representao, bem como as
caractersticas da guitarra elctrica e outros equipamentos de hardware e software que foram
utilizados no projecto.

2.1 Conceitos e terminologia associados msica


A msica pode ser definida como um conjunto de sons organizados, ou a arte de exprimir
sons. O som provm de vibrao de um corpo e tem 4 propriedades; frequncia, amplitude,
timbre e durao. A frequncia do som est relacionada com o maior ou menor nmero de
vibraes por segundo do corpo que o produz. A intensidade do som a potncia com que
se manifesta. O timbre a qualidade do som, sendo que cada instrumento tem um timbre
diferente. A durao o tempo que o som dura at extinguir-se.
O som representado como uma ou mais notas musicais; cada nota representa um tom ou
semitom. No conjunto, existem 12 notas musicais, constitudas por 7 naturais e 5 acidentes.
Tendo como exemplo o teclado do piano apresentado na Figura 6, as notas correspondem s
teclas brancas e as pretas correspondem aos acidentes.

Figura 6: Teclado de piano, as teclas brancas so notas naturais e as pretas acidentes

Cada nota natural tem uma designao: D, R, Mi, F, Sol, L, Si. As notas musicais
tambm podem ser representadas no formato angolosaxonico C, D, E, F, A, B, para as notas
de D a Si, respectivamente, como apresenta a Figura 7.
Na Figura 7, os acidentes so simbolizados como sendo a nota natural aumentada ou
diminuda de 1/2 tom com # (sustenido) ou b (bemol), respectivamente. Um sustenido eleva
a nota natural a um semitom enquanto um bemol baixa a nota um semitom.
Embora existam 12 notas, um instrumento como o piano possui mais do que 12 teclas. O
conjunto de 12 notas chamado uma oitava, as 12 notas so repetidas em todas as oitavas.
Num piano, o conjunto de 12 teclas, ou as oitavas, da esquerda para a direita correspondem
a sons mais agudos. Assim as notas mais direita tm sons mais agudos. A Figura 8
exemplifica uma oitava.
Em termos fsicos, o som corresponde a uma vibrao de determinada frequncia.
Consequentemente uma nota musical representa uma vibrao (frequncia), especfica que a
identifica como sendo um D ou uma das 12 notas. Com a variao das oitavas variam
tambm os valores da frequncia, sendo que as mais baixas formam sons graves e as mais
altas sons agudos. A nvel Europeu por conveno a nota (L) foi escolhida como
frequncia referncia de 440 Hz, na terceira oitava. Se pretendemos obter a mesma nota
7

numa oitava acima (na quarta oitava), multiplicamos a frequncia da nota proveniente da
oitava anterior por 2.

Figura 7: Exemplo de uma oitava no piano

Na Figura 7 podemos observar que uma oitava contabilizada pelo conjunto das 12 notas.
As frequncias das 12 notas musicais formam uma progresso geomtrica, cuja razo de
21/12 =1,059 . Significa que partindo de uma nota base, podemos obter as frequncias das
notas seguintes, atravs de,

f =2n /12440 Hz

(1)

em que n representa a distncia que a prxima nota est da frequncia referncia. Tambm
possvel calcular a nota correspondente a partir de uma frequncia. Na equao (2),
obtemos a distncia que a frequncia passada em f est da frequncia referncia. Dado que a
frequncia tomada como referncia corresponde nota L, notas esquerda de L tero
valor negativo, ou seja, uma distncia negativa, enquanto as que esto do lado do direito
tero valores positivos. Assim com a equao (2), tendo como centro a nota L, n pode ser
mapeada para a nota correspondente na oitava certa.

n=12log2 ( f /440)

(2)

Para que todas as notas estejam correctas necessrio que o instrumento esteja afinado, ou
seja, que todas as notas correspondam de facto frequncia esperada. A Figura 8 [11]
exemplifica o brao da guitarra com todas as notas, entre os 22 trastos.

Figura 8: Exemplo do brao da guitarra com todas as notas (adaptado de [11])

No caso da guitarra, as notas esto separadas por trastos, e a distncia de cada trasto um
semitom. Na Figura 9, cada linha representa uma corda na guitarra e cada coluna representa
o trasto. Cada corda pressionada contra o trasto produz um semitom.
Define-se compasso como sendo a diviso do tempo em partes iguais. Cada compasso
dividido em partes de igual durao, chamadas Tempos [12]. O tempo define o andamento
da msica e medido em Beat Per Minute (BPM). Define-se ritmo como a durao do som
com o tempo dentro de um compasso, a pulsao da msica.
8

Figura 9: Metrnomo analgico (adaptado de [13])

Um metrnomo um aparelho que serve para marcar o tempo da msica, ou seja, determina
a velocidade com que a msica tocada por todos os instrumentos. Quando uma banda toca
a mesma msica, ou mesmo quando algum quer reproduzir uma msica necessrio que se
mantenha a velocidade certa, para dar o ritmo e compasso certo da msica. A Figura 9 [13]
apresenta um metrnomo analgico.O metrnomo analgico mecnico, e composto por
um pndulo metlico com um peso deslizante, que utilizado para regular o andamento. O
metrnomo possui uma escala graduada em Beat Per Minute (BPM) por detrs do pndulo.
Quanto mais prximo estiver o peso do eixo, mais rpida a velocidade do pndulo; quanto
mais afastado, mais lenta ser essa velocidade. O balanar do pndulo para a esquerda e
para direita, produz internamente um som click, e este faz mover a corda. O metrnomo
digital electrnico e utiliza oscilador de quartzo para produzir a frequncia de cada batida.
A Figura 10 [14] apresenta um metrnomo digital.

Figura 10: Metrnomo TM-40 (adaptado de [14])

Actualmente j existem metrnomos digitais como o TM-40 da KORG [14], cuja principal
vantagem poder alterar os tons de click para cada compasso, regular o volume do som,
definir o nmero de BPM alinhados com o compasso.
Embora as notas estejam simbolizadas, no possvel representar todos os detalhes de uma
msica. Detalhes tais como o andamento da msica, as notas que so tocadas em cada
batida, os momentos de silncio, ou seja, tudo que possibilite que algum possa reproduzir a
msica tal qual quando foi criada. Para responder a essa necessidade foi desenvolvida
notao musical, com a representao em pauta musical.
9

2.1.1 Notao musical


Para que se pudesse de alguma forma registar todos os aspectos de uma msica, por forma
que pudesse ser reproduzida na ntegra por quem pretendesse, foi desenvolvida uma notao
musical, chamada pauta musical ou pentagrama.
A pauta musical, na Figura 11 dividida por 5 linhas verticais e 4 espaos, que se chamam
barra de diviso. distncia compreendida entre duas barras de diviso chama-se
compasso. O sinal de repetio indica que o que estiver entre este sinal deve ser tocado mais
uma vez. A frmula de compasso determina o nmero de tempos em que se divide cada
compasso; na Figura 11 apresentada uma diviso de 4, compasso quaternrio.

Figura 11: Elementos de uma pauta musical

Nas linhas horizontais e espaos so colocadas os smbolos que representam as notas. A


armadura colocada em cima das linhas ou nos espaos, transforma a nota a posta em
sustenido ou bemol.
A pauta comea pela definio da clave, sendo esta usada para definir o posicionamento das
notas. Existem 3 tipos de clave: Sol, F e D, como se apresenta na Figura 11.
As claves determinam onde comea a nota correspondente ao nome da clave. Observamos
que os smbolos de clave de F e D tm alturas diferentes e possuem o smbolo (:) no final.
A altura do smbolo determina que a linha entre os dois pontos representa a nota a qual a
clave tem o nome. A clave de sol mais utilizada para sons agudos, tais como, violino,
guitarra flauta, entre outros. A clave de F usada para sons graves, contra-baixo, baixo,
tuba, entre outros.

10

Figura 12: Clave de Sol, F e D

A clave de D usada para sons mdios como da viola, mas a sua aplicao rara. Para se
registar os sons do piano necessrio o uso de duas claves, uma para notas altas e outra para
notas baixas. Isso deve-se ao facto do piano possuir da esquerda para direita, tons graves a
agudos, e estes tons variam a sua oitava dependendo do nmero de teclas, mas
considerado como D central o localizado na 3 oitava. De baixo para cima representam-se
os sons mais graves at aos mais agudos, tal como se apresenta na Figura 13.

Figura 13: Notao musical para piano (adaptado de [15])

A Figura 14 exemplifica uma escala possvel num piano em partitura, mapeada para as
teclas correspondentes no piano. Neste caso podemos observar na parte inferior o smbolo
de clave de F e na parte superior a clave de Sol.

2.1.2 Representao das notas


Para representarmos as notas na pauta, estas so colocadas nas linhas, e o seu valor depende
da clave que est a ser usada. Tambm, para alm das notas, so representados os tempos
dos silncios ou pausas. A representao das notas e pausas feita de diferentes formas que
representam o seu valor a nvel temporal. A Figura 14 [16] apresenta uma Tabela que
contm os smbolos que representam as notas e pausas numa pauta musical. O nmero
relativo a cada smbolo, indica o tempo de durao da nota dentro do primeiro compasso ou
o nmero de vezes que esta nota cabe num compasso.

11

Figura 14: Tabela com figuras musicais para representao de notas e pausas (Adaptado
de [16])

Observa-se na Figura 15 que para cada nota est associada uma pausa com a mesma
durao, a alternncias entre notas musicais e pausas, produzindo a msica. A Figura 16
[17] exemplifica a aplicao destes smbolos em diferentes compassos.

Figura 15: Exemplos de aplicao das figuras em diferentes compassos (adaptado de [17])

Na Figura 15 observam-se os smbolos em diferentes compassos, temos 3 tipos de


compassos diferentes; binrio, ternrio e quaternrio. Verificamos que com base no
compasso e diviso s podemos ter duas, trs ou quatro notas, para os compassos binrio,
12

ternrio e quaternrio respectivamente. Cada uma destas figuras musicais est relacionada
entre si; a Figura 16 [18] apresenta a relao entre as figuras musicais.

Figura 16: Relao entre as figuras musicais (adaptado de [18])

Observa-se na Figura 16 que uma semibreve equivale a duas mnimas, uma mnima
equivale a 2 semnimas. Em geral podemos dizer que comeando das figuras musicais de
maior durao a semibreve, existe uma relao exponencial de base 2 entre as vrias figuras
musicais.
No caso da guitarra, o instrumento de foco neste projecto, existe outra forma de registar as
notas para quem no tenha conhecimento de leitura de pautas musicais. Para guitarristas,
anotam-se as notas da guitarra na forma de tablatura, tal como se apresenta na Figura 17.

Figura 17: Exemplo de tablatura para guitarra

Na tablatura apresentada, as linhas horizontais representam as cordas que os instrumentos


tm e os nmeros representam os trastos que devem ser pressionados para reproduzir a
msica.
A tablatura uma forma de notao musical, que indica onde colocar os dedos no
instrumento em vez de informar a nota. Esta forma de notao pode ser utilizada em todos
os instrumentos que usem trastos como a guitarra, guitarra-baixo e banjo, entre outros. Em
adio, na tablatura possvel para o caso da guitarra, adicionar notao para alguns efeitos
13

como slide [19], bending [20], tremolo [21] entre outros, tal como exemplificado na Figura
18 [22].

Figura 18: Exemplo de tablatura com efeitos ou tcnicas (adaptado de [22])

Podemos observar na Figura 18 uma partitura com a tablatura associada, esta forma de
representao comum nas msicas para guitarra, pois permite guitarristas que no saibam
ler pautas musicais reproduzirem a msica. Na Figura 18 possvel observar os nmeros
que simbolizam os trastos que so pressionados na guitarra e alguns destes possuem outros
smbolos associados. Estes smbolos, representam tcnicas e efeitos tocados na guitarra. As
Figuras 19 e 20 exemplificam alguns smbolos utilizados para representao de tcnicas ou
efeitos com a guitarra.

Figura 19: Exemplo de representao de Bend Up (adaptado de [23])

Na Figura 19 apresenta o smbolo para tcnica de bend, a seta a apontar para cima significa
bend up e a seta apontar para baixo bend down. A tcnica de bend [20], consiste em
empurrar a corda para cima ou para baixo, fazendo com que a nota varie de meio a um tom.
A inscrio de full em cima do smbolo, significa que a corda empurrada para cima at a
nota variar um tom. A seta que aponta para baixo, quando associada a seta de bend up,
significa que depois de efectuar o full bend o guitarrista volta a por a corda na posio
inicial em vez de a soltar.

Figura 20: Exemplo da tcnica Legato Slide (adaptado de [23])

14

A tcnica de Legato Slide [19] consiste em tocar uma nota num trasto e deslizar o dedo
sobre a corda, at ao prximo trasto, fazendo a nota variar a distncia entre o primeiro trasto
tocado e o ltimo. Existem diversos smbolos utilizados na tablatura para representar
diferentes tcnicas; alguns podem ser consultados em [23].

2.2 Guitarra elctrica e equipamentos


A aplicao ser desenvolvida para ser utilizada com uma guitarra elctrica. O uso da
guitarra elctrica impe uma limitao que existe somente pelo facto de se poder garantir
melhor qualidade na captura do som, dado que esta feita directamente da guitarra para um
amplificador ou placa de som. No entanto pode ser aplicada tambm a guitarras electroacsticas ou mesmo guitarras clssicas, por meio de microfone. A guitarra elctrica, como
constituda pelos elementos indicados na Figura 21 [24].
1. Mo ou paleta ou headstock

11. Potencimetros

2. Pestana

12. Cavalete (ou ponte)

3. Tarraxas ou cravelha

13. Protector de tampo (ou escudo)

4. Trastes/Trastos
5. Tirante ou Tensor
6. Marcao
7. Brao
8. Trculo (Junta do brao)
9. Corpo

Figura 21: Guitarra elctrica


(adaptado de [24])

10. Captadores

A guitarra elctrica apresentada na Figura 21, possui um corpo em madeira macia, ao


contrrio de uma guitarra clssica que possui um corpo oco de propagao acstica. Por este
motivo o som da guitarra elctrica natural baixo, sendo necessrio a utilizao de um
amplificador. O tipo de madeira utilizada no corpo, captadores, o material dos trastos, so
determinantes no timbre e tom da guitarra elctrica. No corpo da guitarra elctrica esto
incrustados elementos electrnicos como o potencimetro e captadores que permitem a
sada para ligao a um amplificador udio.

2.2.1 Produo de som da guitarra elctrica


A guitarra produz som fazendo vibrar as cordas que esto presas no brao ao corpo da
guitarra. Quando a guitarra tocada, produz um sinal de sada composto por frequncias tais
que correspondem a notas musicais. Pressionando a corda entre os trastos existentes no
brao, diminumos o seu comprimento fazendo com que a frequncia da corda seja maior,
quanto mais se prximo da ponte se estiver, produzindo diferentes sons. Quando os trastos
so premidos mais prximos do corpo da guitarra, como a distncia menor entre a seco
premida e a solta, a vibrao da corda produz um som mais agudo.
A guitarra elctrica possui exactamente o mesmo princpio de funcionamento de uma
guitarra normal (acstica); o que diferencia o modo como o som captado e propagado.
15

Na guitarra elctrica, existem dispositivos designados por captadores. Estes dispositivos


dispostos no corpo da guitarra, por baixo das cordas, captam a vibrao da corda que faz
variar o campo electromagntico da bobina que envolve o man, gerando uma corrente que
enviado para um amplificador. Para que o som da guitarra elctrica seja audvel necessrio
ligar a um amplificador de som, dado que no possui um corpo oco como a acstica e a
clssica. A Figura 22 [25] apresenta um captador para guitarras elctricas.

Figura 22: Captador de guitarra(adaptado de [25])

Podemos observar na Figura 20 um exemplo de um captador passivo. A diferena entre o


captador passivo e activo est relacionada com o facto do captador activo ser alimentado por
uma pilha introduzida no corpo da guitarra. A Figura 23 [25] exemplifica o funcionamento
bsico dos captadores na guitarra elctrica.

Figura 23: Funcionamento dos captadores (adaptado de [25])

Observamos na Figura 23 que os captadores so colocados por baixo das cordas para captar
a vibrao destas. A vibrao captada pelos manes permanentes e convertida em sinal
elctrico. A Figura 24 [26] exemplifica a forma como funciona internamente um captador
passivo.
16

Figura 24: Esquema de um captador magntico (adaptado de [26])

O princpio geral de produo do som o seguinte: a variao do campo magntico


convertida em tenso elctrica que quando amplificada produz som. A guitarra pode ter
cordas de diferentes materiais, sendo normalmente de ao, nquel e cobre. Cada corda tem
determinada espessura para produzir a vibrao correcta. As diferentes espessuras de cada
corda, influenciam no tom e a oitava que pode produzir, mas no influenciam as harmnicas
das notas.
Na sada da guitarra, o sinal analgico tem amplitude de 100 mV ou 1 V . A variao da
amplitude do sinal depende do tipo de captador. A principal diferena entre estes est na
definio do som obtido pelos dois tipos de captadores e na amplitude na sada do sinal,
sendo que os captadores activos conduzem a maior gama dinmica de amplitude no sinal.
O sinal sada da guitarra elctrica ligado a um amplificador de forma a tornar-se audvel.
Muitas vezes, entre a guitarra elctrica e o amplificador ligado um processador de efeitos,
tais como delay, distoro, chorus entre outros.

2.2.2 Escalas e frequncias da guitarra elctrica


A guitarra elctrica tem entre 22 a 24 trastos, e tipicamente 6 cordas. Comeando do topo
para baixo, cada corda tem uma espessura/seco diferente; as de maior seco produzem
som mais grave e as de menor seco produzem som mais agudo.
Cada corda, tocada em aberto (tocada sem se premir qualquer trasto), corresponde a uma
nota musical, Mi (E), L (A), R (D), Sol (G), Si (B) e Mi (E), de cima para baixo no brao
da guitarra, respectivamente. Premindo os trastos ao longo do brao em cada corda, permite
ir gerando as notas seguintes que cada corda possui.
A guitarra elctrica, produz frequncias entre 82,41 Hz e 1174 Hz. Assim, possui no
mximo 3 oitavas completas, como mostra a Tabela 1. Cada corda produz um conjunto de
frequncias quando tocadas e pressionadas nos trastos ao longo do brao da guitarra. No
processo de criao da tablatura, ser necessrio ter em conta a fisionomia das mos. Este
requisito importante para optimizar a apresentao das notas no brao da guitarra,
permitindo que quem toque o instrumento no tenha notas fora do alcance das mos e faa
menos movimentos desnecessrios. Por exemplo, ao tocar mais do que uma nota em
simultneo, com o dedo indicador no segundo trasto no possvel com os outros dedos
17

pressionar o dcimo trasto. Define-se como acorde a escrita ou execuo de duas ou mais
notas musicais em simultneo.

F
R
E
Q
U

C
I
A
S
(Hz)

NOTAS
A
Bb
B
C
C#
D
D#
E
F
F#
G
G#

20,6
21,83
23,12
24,5
25,96

2
27,5
29,14
30,87
32,7
34,65
36,71
38,89
41,2
43,65
46,25
49
51,91

3
55
58,27
61,74
65,41
69,3
73,42
77,78
82,41
87,31
92,5
98
103,83

OITAVAS
4
110
116,54
123,47
130,81
138,59
146,83
155,56
164,81
174,61
185
196
207,65

5
220
233,08
246,94
261,63
277,18
293,66
311,13
329,63
349,23
369,99
392
415,3

6
440
466,16
493,88
523,25
554,37
587,33
622,25
659,26
698,46
739,99
783,99
830,61

7
880
932,33
987,77
1046,5
1108,73
1174,66
1244,51
1318,51
1396,91
1479,98
1567,98
1661,22

Tabela 1: As colunas representam as oitavas e as linhas a notas musicais


As frequncias na banda de 82.41 Hz a 1174.66 Hz correspondem a uma guitarra elctrica
de 24 trastos, enquanto de 30 Hz a 359.23 Hz so frequncias de uma guitarra baixo.
Para os testes experimentais ser usada uma guitarra elctrica Yamaha EG112 com 22
trastos. No entanto, o tipo e modelo de guitarra elctrica no tem qualquer influncia na
aplicao.

2.2.3 Hardware e software


A aplicao desenvolvida tem suporte multi-plataforma, nomeadamente para os sistemas
operativos Linux e Windows XP/Vista/7 com processamento paralelo em computadores
com processadores multi-core. O suporte a vrios sistemas operativos, visa a dar
oportunidade ao guitarrista de escolher o sistemas operativos de sua preferncia.
Uma opo para suportar a portabilidade seria a utilizao da linguagem JAVA, mas no
seria to imediato tirar partido de bibliotecas j existentes em C/C++, nomeadamente da
FFT para processamento de sinal e seria mais lento. A vantagem de utilizao da linguagem
C/C++ em relao ao JAVA, prende-se principalmente na eficincia da realizao de
componentes crticos como processamento udio, a possibilidade de incluso de algumas
optimizaes usando paralelismo e instrues Single Instruction Multiple Data (SIMD)
como Streamming SIMD Extensions (SSE) e SSE2. A linguagem C/C++ proporciona maior
controlo e proximidade com o hardware.
Caractersticas

Computador 1

Computador 2

Sistema Operativo

Fedora 13 x86_64

Windows 7 32 bits

Processador

Intel Core i7

Intel Dual Core

Memria

4 Gb

2 Gb

Disco duro

1.5 Tb

100 Gb

Tabela 2: Caractersticas dos computadores de desenvolvimento

18

A aplicao foi desenvolvida e testada em computadores com as caractersticas apresentadas


na Tabela 2.

2.3 Problema a resolver


O problema a resolver consiste em conseguir de forma eficiente detectar as frequncias de
notas recolhidas de uma guitarra elctrica e estimar a durao destas, para construir uma
tablatura, sem que se percam as notas seguintes tocadas na guitarra. O processamento no
tem que ser realizado em tempo real mas a aquisio em tempo real. A possvel perda de
notas est relacionada com o nmero de notas que o guitarrista pode tocar numa batida de
metrnomo, considerando n BPM, onde n {46,...,180}.
A deteco de frequncias um problema comum na rea de processamento digital de sinal,
para o qual existem algoritmos como Goertzel [27], FFT [27] e auto-correlao [10]. Cada
um destes algoritmos possui caractersticas que sero determinantes para utilizao numa
soluo. Estes algoritmos foram analisados num trabalho prvio efectuado no mbito da
unidade curricular de Processamento de Sinal em Tempo Real (PSTR) e so apresentados
no captulo 3.
Outra componente do problema a deteco de tcnicas executadas enquanto o guitarrista
toca. No caso de um guitarrista solo, existem tcnicas como leggato, shredding [2], assim
como speed picking solo, em que so tocadas vrias notas por batida de forma sequencial;
neste caso difcil detectar todas as notas apenas com a audio do sinal medida que este
vai sendo produzido.

19

3 Tcnicas de processamento de sinal para deteco de


frequncia
Neste captulo analisam-se vrias tcnicas de processamento de sinal para estimao de
frequncia e durao da nota. O objectivo encontrar o algoritmo de deteco de
frequncias que mais se adequa deteco das notas da guitarra. Como mtricas de seleco
pretende-se escolher o algoritmo que possua a melhor preciso, menor complexidade na
implementao da soluo e no nmero de multiplicaes.

3.1 Algoritmo FFT


A Fast Fourier Transform (FFT) [10] um algoritmo eficiente para calcular a Transformada
de Fourier Discreta ou Discrete Fourier Transform (DFT) e sua inversa. A DFT um sinal
discreto de N amostras {x(0), x(1), x(2),..., x(N-1)} espectro, X[k], em N pontos de
amostragem para k= 0,1,2,3,...,N-1,em que k o ndice em frequncia, n o ndice no
2 k
N 1
j(
)n
X [k ]= x [n]e N , k=0,1, ... , N 1
(3)
n=0
tempo e X[k] so os coeficientes da DFT. A DFT gera N coeficientes de X[k] para k=
0,1,2,3,...,N-1. A resoluo em frequncia da DFT a N pontos dada por:
fs
= , onde fs a frequncia de amostragem
(4)
N
Podemos ento calcular uma frequncia fk (em Hz) correspondendo ao ndice k.
kf s
f k =k =
, k =0,1,. .., N1
N

(5)

De acordo com o ritmo de Nyquist, fs/2 corresponde ao ndice de frequncia k= N/2, em que
|X[k]| uma funo par de k, porque x[n] um sinal real. Assim sendo, s necessrio
amostrar o espectro onde k varia entre 0 e N/2. Atravs da aplicao da FFT e um nmero
adequado de amostras N possvel detectar todas as frequncias da guitarra.
A FFT apresenta complexidade logartmica de clculo, tornando-se muito interessante para
vrias aplicaes. Para um sinal com N pontos, realizam-se

N op=N log 2 ( N )

(6)

multiplicaes complexas. A DFT, sem optimizao, realiza N 2 multiplicaes complexas.


Cada multiplicao complexa corresponde a quatro multiplicaes reais e duas adies
reais.
Para o problema a ser resolvido no existe a necessidade de determinar cada nota com
exactido, sendo possvel encontrar um nmero de pontos adequado deteco de todas as
frequncias com o menor erro mdio possvel.

20

3.2 Algoritmo Goertzel


O algoritmo de Goertzel [27] detecta a presena de uma componente de frequncia. A
transformada Z associada ao sistema que realiza o algoritmo de Goertzel dada por
H k ( z )=

1W N k z1

1e j2 k/ N z1
.
k 1
k 1
1
2
(1W N z )( 1W N z ) 12 cos(2 k /N ) z +z
=

(7)

A FFT realiza a DFT de forma eficiente amostrando vrias frequncias do espectro. O


algoritmo de Goertzel detecta apenas frequncias especficas e implementa uma equao s
diferenas de segunda ordem, correspondente ao diagrama de blocos da Figura 25.

Figura 25: Diagrama de bloco do filtro ordem II de Goertzel

Para a deteco de frequncia necessrio calcular a magnitude do coeficiente X(k), dada


por

X ( k )2=2k ( N1)2 cos( 2 f k /f s) 2k ( N 2)+2k ( N2)

(8)

em que N o nmero de amostras de x[n].


Para uma dada frequncia a ser detectada, temos que calcular o valor do ndice k que
corresponde frequncia, e verificar neste ndice a magnitude do sinal para se poder afirmar
que o sinal contm a frequncia esperada. O algoritmo de Goertzel ao contrrio da FFT no
necessita que o nmero de pontos seja potncia de 2 o que d maior flexibilidade para
aumentar ou diminuir o nmero de pontos. A equao (9) serve para determinar o ndice k
para uma determinada frequncia de interesse, onde freq a frequncia de interesse, fs
frequncia de amostragem e N nmero de pontos.

k=

freq
N
fs

(9)

A maior problemtica relativamente ao objectivo, reside no facto de as frequncias que


pretendemos detectar terem valor baixo. Para podermos estimar todas as frequncias,
considerando resoluo de frequncia de 2 Hz e as frequncias de amostragem descritas,
seria necessrio um N igual aos apresentados na Tabela 3, usando as frequncias de
amostragem correspondentes. Ao escolher valores elevados de N, tem-se o problema de
21

falta de resoluo no tempo, ou seja, necessrio adquirir sinal durante um tempo excessivo
que pode ser muito superior ao tempo de durao da nota.

Freq. Amostragem
44100
22050
11025

N = Fs/ 2 Hz
22050
11025
5512,5

Resoluo no Tempo (s)


0,5
0,5
0,5

Tabela 3: Nmero de pontos com base em Fs com resoluo de 2 Hz


Podemos observar na Tabela 3 que os valores de N so muito grandes o que pode afectar o
tempo-real na pesquisa pela frequncia a detectar e tambm aumentar o recursos
computacionais. No PC podemos tentar vrias estratgias para optimizar a pesquisa pela
frequncia a determinar e diminuir N, para utilizao deste algoritmo.
Uma estratgia seria ter um nmero de pontos fixos para cada nota que se pretende detectar;
neste caso teramos 47 buffers no total. O nmero total de buffers a ser utilizado no
proporciona uma soluo ptima de implementar e nem a nvel de consumo de recursos
computacionais, dado que seria sempre necessrio fazer a cpia do sinal para os 47 buffers.
A segunda estratgia seria ter um buffer suficientemente grande para se obter todas as notas,
para optimizar a pesquisa, seriam utilizados previamente filtros para filtragem por oitava.
Assim sendo, antes do sinal passar pelo algoritmo, passavam por filtros e estes com base na
oitava iriam definir os pontos de pesquisa no buffer. Neste caso, estaramos sempre a
pesquisar no mximo por 12 notas e no mnimo 5, atendendo ao nmero de escalas que a
guitarra possui.
A problemtica desta soluo est no tamanho do buffer, que poder influenciar no tempo
de cpia e leitura das prximas amostras tocadas pelo guitarrista. Para resolver este
problema, podemos utilizar as tcnicas de double buffering, e multi-threading. Esta
estratgia s teria melhor aplicao para uma frequncia de amostragem mais baixa,
baseando na Tabela 3.
A terceira estratgia consiste em ter um nico buffer de tamanho N, mas para cada nota
dada uma dimenso diferente e menor que N. Neste caso a pesquisa por cada nota seria
limitada ao tamanho associado a cada nota. No entanto existe a possibilidade de termos
ndices de notas coincidentes, o que poder dificultar a identificao da nota. As notas
coincidentes ocorrem quando as mesmas notas mas em oitavas diferentes so calculadas na
mesma posio no buffer, criando uma indefinio de que nota est presente. Para optimizar
a pesquisa, tambm usamos filtros para determinar a oitava a que a nota pertence, por forma
a pesquisar somente pelas notas ou frequncias pertencentes oitava.
Em resumo, para aplicar o algoritmo de Goertzel para estimao das frequncias seria
necessrio aplicar estratgias diferentes para resolver os problemas encontrados no estudo.
Estas estratgias no representam uma melhor soluo para o problema que se pretende
resolver, pois envolvem maior complexidade no desenvolvimento, e no se consegue o
objectivo que a reduo do nmero de pontos de forma efectiva.

22

3.3 Auto-correlao
O algoritmo de auto-correlao em processamento de sinal determina a relao existente
entre o sinal e ele prprio ao longo do tempo. A auto-correlao representa o grau de
proximidade entre a verso original do sinal de entrada e uma verso desfasada do mesmo
sinal [28] [29].
Dado um sinal x(t), a auto-correlao do sinal contnuo por si prprio com um desfasamento
de dado por

R xx ( )=( x (t )x (t ))()= x (t +) x (t) dt = x (t ) x (t ) dt ,


(10)

onde, x corresponde a complexo conjugado do sinal x(t) e (*) representa a convoluo.


Com um sinal discreto a expresso da auto-correlao de x com desfasamento de k dada
por

R xx [k ]= x [n ] x [nk ].

(11)

A funo de auto-correlao apresenta as seguintes propriedades:

Simetria:

R f( )= Rf ( )

A auto-correlao de uma funo peridica de perodo t, tambm peridica com


mesmo perodo.
O maior valor de auto-correlao encontra-se em =0.

A auto-correlao pode ser realizada de forma eficiente atravs do clculo da FFT e IFFT
pelo teorema de WienerKhinchin, como apresenta nas seguinte expresses:

F R ( f )=FFT ( X ( t))

(12)

Dado F R ( f ) igual a FFT do sinal de entrada X(t), como apresentado em (12),


multiplicado por F R (f ) seu conjugado (13), resultando na funo densidade espectral de
potncia

S ( f )=F R ( f (t )) F R (f (t))

(13)

podemos determinar ento a auto-correlao calculando a Transformada de Fourier Inversa


de S(f) apresentada em (14)

R( )=IFFT (S(f )) .

(14)

Para estimar a frequncia usando este algoritmo necessrio calcular a correlao entre o
sinal de entrada no tempo 0 com o mesmo sinal desfasado no tempo T. Como o sinal
peridico, o valor de T a ser utilizado seria igual ao valor de resoluo em frequncia que se
23

pretende ter, e o nmero de pontos necessrio para estimar toda banda de frequncia da
guitarra elctrica. Depois de calculada a auto-correlao feita uma pesquisa pelo maior
valor energia no espectro, e retirado o ndice. Este ndice indica que perodo tem a
frequncia fundamental do sinal de entrada. Podemos calcular assim a frequncia tendo o
ndice do pico mximo utilizando (15) e (16)
N
t=NT s= , onde T s perodo de amostragem.
(15)
Fs
Em (15) calculamos a resoluo no tempo, onde N o nmero de pontos, T s o perodo e
F s a frequncia de amostragem. Com o valor do ndice calculamos o perodo dado por
t
tf=
,
(16)
k
onde t f o perodo da sinal de entrada, k o ndice do primeiro pico mximo e t a
resoluo em frequncia. Para obter o valor em frequncia aplicamos (17) e calculando a
inversa do do perodo t f .
1
f f=
(17)
tf
Ao contrrio da FFT, a auto-correlao permite estimar uma frequncia no domnio do
tempo, identificando a frequncia fundamental e suas harmnicas. A estimao da
frequncia usando a auto-correlao tambm pode ser aplicada para o problema a resolver,
e existe uma forma eficiente de calcular a auto-correlao usando a FFT e IFFT. No entanto,
dado que podemos simplesmente utilizar a FFT para fazer a estimao da frequncia, no h
necessidade de fazer a operao inversa.

3.4 Anlise comparativa das solues


No estudo inicial, na unidade curricular de PSTR, foram analisadas quais seriam os
melhores algoritmos para deteco de frequncias, e tambm os parmetros ptimos para o
nmero de amostras a considerar, a resoluo em frequncia, a frequncia de amostragem.
Foi efectuada uma prova do conceito em Matlab para testar os vrios algoritmos.
No caso da FFT o problema est sempre na resoluo de frequncia necessria para detectar
as notas, e este problema tambm partilhado com auto-correlao e Goertzel. Tendo em
conta que a aplicao no necessita de processamento de sinal em tempo real a questo
essencial no perder as amostras vindas da guitarra na fase de captura so sinal.
O uso de algoritmo de Goertzel [10] poderia ser interessante para determinar uma
frequncia especfica, mas muito comum na guitarra tocar acordes, e por este motivo
necessrio um estudo relativamente a estratgia em usar Goertzel. Tambm com este
algoritmo podamos tentar usar vrios vectores de amostras para detectar todas as notas
existentes no instrumento. Esta soluo no entanto poderia ser muito custosa, dado o
nmero de notas existentes na guitarra elctrica e tambm a dificuldade em detectar acordes.

24

A auto-correlao determina a frequncia fundamental de uma nota. Aps determinar a


frequncia fundamental, uma estratgia a usar seria fazer uso de filtragem para detectar a
escala a que a nota pertence.
A maior problemtica em usar estes algoritmos o nmero de pontos necessrios para
detectar as frequncias mais baixas, porque a resoluo de frequncia muito baixa para a
frequncia de amostragem que o sinal estaria a ser amostrado numa aplicao no PC.
A anlise da frequncia de amostragem, foi efectuada porque seria determinante para obter
o nmero de pontos necessrio ao processamento udio. Em trabalhos de udio profissional
a frequncia de amostragem utilizada de 44100 Hz ou superior. No entanto necessrio
analisar a razo entre a mxima e a mnima frequncia que poderiam obter em relao
frequncia mxima e mnima que a guitarra elctrica pode produzir, para determinar qual
ser a frequncia de amostragem escolhida. A Tabela 4 apresenta a razo entre a frequncia
de amostragem e as frequncia mnima e mxima produzidas pela guitarra elctrica.
Freq. Amostragem (Hz)
44100
22050
11025
8000

Fs/ 82.41
537,8
268,9
134,45
97,56

Fs / 1174.66
37,56
18,78
9,39
6,81

Tabela 4: Razo entre a frequncia mnima 82,41 Hz e mxima 1174,66 Hz

A razo de frequncia com o valor mais baixo est para a frequncia de amostragem de
8000 Hz ou de 11025 Hz. Dado que a mxima frequncia da guitarra elctrica de 1174 Hz,
uma amostragem de 8000 Hz suficiente para se poder detectar todas as notas da guitarra.
Para cada um dos algoritmos de estimao de frequncia era necessrio ter diferentes
abordagens em relao ao processamento udio, tendo em conta conseguir detectar notas,
estimar a durao das notas, e tambm a capacidade de detectar acordes.
Uma anlise comparativa da complexidade no nmero de multiplicaes entre os algoritmos
apresentada na Tabela 5, onde podemos verificar qual tem menor complexidade.
Algoritmos

Nmero de Multiplicaes

DFT

N 2 complexas

FFT

Nlog 2 (N )complexas

Goertzel

N reais+ 1complexa
Nlog 2 (N )2+N complexas

Auto-correlao

Tabela 5: Complexidade dos algoritmos


25

Nos 3 algoritmos o problema reside sempre na resoluo de frequncia necessria para


detectar as notas, e o facto da frequncia de amostragem ser elevada para aplicar qualquer
um dos algoritmos. Para reduzir o nmero de pontos, necessrio reduzir a frequncia de
amostragem. Uma tcnica utilizada para reduzir a frequncia de amostragem a decimao
[27] no tempo.

3.5 Filtragem e decimao


A decimao [27] corresponde diminuio da frequncia de amostragem de um sinal
amostrado a uma taxa superior a de Nyquist. No entanto se um sinal for amostrado na taxa
de Nyquist mas a sua largura de banda for reduzida por um filtro, a sua frequncia de
amostragem pode ser reduzida por decimao, evitando o fenmeno de aliasing [27].
A decimao no tempo aplicada para reduzir a frequncia de amostragem. Consiste em
recolher d*k amostras do sinal amostrado, onde d {1,..,} corresponde ao factor de
decimao e k {0,...,N-1} corresponde ao ndice da amostra no buffer e N nmero de
pontos do buffer. O factor de decimao corresponde a um valor inteiro, maior do que 0, tal
que dividido pela frequncia de amostragem real se obtm a frequncia de amostragem
efectiva (frequncia de amostragem reduzida); esta tcnica conhecida como subamostragem. A Figura 27 mostra o diagrama de decimao com factor de M.
X[n]

Y[n]=X[Mn]
Filtro
passa-baixo

Decimao
Factor M

Figura 26: Diagrama de decimao

Para que a sub-amostragem seja correcta necessrio reduzir a largura de banda do sinal
usando um filtro discreto passa-baixo. A decimao pode ser entendida como uma
compresso no tempo tal que provoca expanso na frequncia. Dado que a mxima
frequncia a ser gerada pela guitarra de 1174 Hz, como apresentada na Tabela 1, a reduo
da largura de banda tem que respeitar a ritmo de Nyquist de modo a no cortar esta
frequncia. Isto significa que necessrio implementar um filtro digital passa-baixo cuja
frequncia de corte superior a 1174 Hz.
Para a seleco do filtro passa-baixo, foi feita uma pesquisa por filtros que tivessem uma
resposta na frequncia de corte com maior preciso para uma ordem menor. A preciso na
frequncia de corte importante para que depois da decimao no exista aliasing [27]no
sinal, situao que iria dificultar a deteco de frequncias.
Para esta anlise, contribuiu a consulta do site de Tony Fisher [30], que desenvolveu uma
pgina web interactiva para desenho de filtros digitais. Mediante a utilizao da pgina do
mkfilter [31], desenvolvido por Tony Fisher, foi possvel analisar a resposta em frequncia
de filtros passa-baixo; Bessel [32], Butterworth [32] e Chebyshev [32]. No site com os
parmetros introduzidos, produz como sada coeficientes do filtro e a resposta em
frequncia. Os testes foram efectuados considerando os valores apresentados na Tabela 6.

26

Parmetro

Valor

Frequncia de amostragem

44100 Hz

Frequncia de corte

2000 Hz

Ordem do filtro

4e8

Ripple

-0,01 dB (s para o tipo Chebyshev)

Tabela 6: Parmetros utilizados para analisar a resposta em frequncia dos filtros passa-baixo
Dos 3 filtros, o escolhido foi o de Chebyshev, pelas caractersticas da resposta em
frequncia. Podemos comparar nas Figuras 27, 28 e 29, para um filtro de ordem 4 as
caractersticas da resposta em frequncia para cada um dos filtros. A Figura 27 apresenta a
resposta em frequncia do filtro passa-baixo de Bessel.

Figura 27: Resposta em frequncia do filtro tipo Bessel de ordem 4 (adaptado de [31]). O eixo x representa as frequncias em fraces da frequncia de amostragem, O eixo y a vermelho representa a magnitude e normalizada da resposta do filtro, e y a azul a fase.

Observamos na Figura 27 que a magnitude na frequncia de corte decresce muito


lentamente o que significa tambm que necessita de uma maior ordem para remover
efectivamente a frequncia desejada. O eixo x representa as frequncias em fraces da
frequncia de amostragem, o que significa, por exemplo, 0,5 representa na frequncia de
Nyquist corresponde a frequncia de 22050 Hz. Na Figura 29 apresenta a resposta em
frequncia
do
passa-baixo
de
Butterworth.

27

Figura 28: Resposta em frequncia do filtro de Butterworth de ordem 4 (adaptado de [31]). O eixo x representa as frequncias em fraces da frequncia de amostragem, O eixo y a vermelho representa a
magnitude e normalizada da resposta do filtro, e y a azul a fase.

Podemos observar comparativamente com o filtro de Bessel, que o de Butterworth, na


Figura 28, possui um declive mais acentuado na frequncia de corte. A Figura 29 apresenta
a resposta em frequncia do filtro de Chebyshev.

Figura 29: Resposta em frequncia do filtro de Chebyshev de ordem 4 (adaptado de [31]). O eixo x representa as frequncias em fraces da frequncia de amostragem, O eixo y a vermelho representa a
magnitude e normalizada da resposta do filtro, e y a azul a fase.

Com o filtro de Chebyshev verifica-se uma banda de transio estreita frequncia de corte e
o decremento da magnitude maior que no filtro de Butterworth. Em geral podemos
observar que para ordem 4, o filtro de Chebyshev apresenta melhor resultado na remoo da
28

frequncia, mas em nenhum dos casos h uma reduo mais prxima de zero da frequncia
de corte.
No decorrer de vrias anlises, a concluso de que um filtro de ordem 8 seria o suficiente
para obter a resposta em frequncia desejvel para o problema. As Figuras 30, 31 e 32,
apresentam as respostas em frequncia dos 3 filtros, utilizando ordem 8. A Figura 30
apresenta a resposta em frequncia do filtro de Bessel.

Figura 30: Resposta em frequncia do filtro de Bessel de ordem 8 (adaptado de [31]). O eixo x representa as frequncias em fraces da frequncia de amostragem, O eixo y a vermelho representa
a magnitude linear e normalizada da resposta do filtro, e y a azul a fase.

A Figura 31 apresenta a resposta em frequncia do filtro de Butterworth.

29

Figura 31: Resposta em frequncia do filtro de Butterworth de ordem 8 (adaptado de [31]). O eixo x
representa as frequncias em fraces da frequncia de amostragem, O eixo y a vermelho representa a
magnitude e normalizada da resposta do filtro, e y a azul a fase.

Verificamos que comparativamente com o filtro de Bessel, o de Butterworth tem melhor


atenuao na banda de corte. A Figura 32 apresenta a resposta em frequncia do filtro de
Chebyshev.

Figura 32: Resposta em frequncia do filtro de Chebyshev de ordem 8 (adaptado de [31]). O eixo x representa as frequncias em fraces da frequncia de amostragem, O eixo y a vermelho representa a
magnitude e normalizada da resposta do filtro, e y a azul a fase.

Fazendo uma comparao com os grficos anteriores, onde apresentada a resposta em


frequncia para os filtros de ordem 4, Figuras 27, 28 e 29; os filtros de ordem 8 possuem
uma banda de transio mais estreita na frequncia de corte. Comparando os 3 filtros de
ordem 8, podemos observar que o filtro de Chebyshev decrementa a sua magnitude mais
rpido que o filtro de Butterworth, ou seja, o filtro de Chebyshev tem um declive mais
acentuado, tornando o filtro mais adaptado para a soluo. A vantagem de ter um declive
30

mais acentuado na banda de corte, est relacionada com a proximidade a um filtro passabaixo ideal, e de ser necessrio menos iteraes ou ciclos para atenuar a amplitude a partir
da frequncia de corte. Dado que se optou pelo filtro de Chebyshev necessrio estudar
mais as caractersticas deste filtro para a implementao da soluo a ser desenvolvida.

3.5.1 Filtro passa-baixo de Chebyshev


O filtro de Chebyshev uma estratgia matemtica para obter uma atenuao mais rpida na
nas frequncias de corte, permitindo ter um ganho superior nas frequncias da banda de
passagem, enquanto reduz o ganho na banda de corte permitindo ter um ganho na
frequncia de banda de passagem que chamado ripple. Este filtro minimizam o erro entre
as caractersticas de um filtro ideal e o actual em relao banda de corte, diferenciando
somente no ganho extra nas frequncias de passagem. A Figura 33 [33] mostra a resposta
em frequncia de um filtro passa-baixo do tipo I, de Chebyshev.

Figura 33: Resposta em frequncia do filtro de Chebyshev com ripple de 20% (adaptado de [33])

Na Figura 33 quando o valor do ripple de 0%, que chamado mximo o filtro tem as
caractersticas de um filtro de Butterworth, por este motivo o filtro de Chebyshev uma
generalizao do filtro de Butterworth. Considerando um ripple de 0,5%, observa-se que o
ganho to pequeno que no possvel ser observado no grfico da Figura 33. A principal
vantagem em relao ao Butterworth est na atenuao mais ngreme na banda de corte, o
que significa que o corte da frequncia mais rpido do que o de Butterworth, o que
significa que o filtro de Chebyshev necessita de menor ordem para se aproximar s
caractersticas de um filtro ideal. Existem 2 tipos de filtros de Chebyshev: I e II [35]. A
principal diferena est no tipo II ser inversa do filtro do tipo I, como exemplificado nas
Figuras 34 e 35, respectivamente.

Figura 34: Resposta em frequncia do filtro de Chebyshev tipo I (adaptado de [34])

31

Na Figura 34 observamos o ripple na banda de passagem e uma rpida atenuao na banda


de corte, no tipo II o ripple est na banda de corte e atenuao no to acentuada, como
apresenta a Figura 35 [34].

Figura 35: Resposta em frequncia de filtro de Chebyshev tipo II (Adaptado de [34])

Para o problema a resolver ser utilizado o tipo I, porque o tipo II no atenua to rpido na
banda de corte. O ganho constante na banda de passagem no um requisito importante.
Desde que a frequncia das notas no seja removida ou muito atenuada, possvel detectar a
frequncia.

3.5.1.1 Implementao do Filtro


O filtro ser implementado com uma estrutura Infine Impulse Response (IIR), dado as
caractersticas do filtro de Chebyshev apresentar plos. Caracteriza-se como filtro IIR um
filtro digital cuja resposta impulsional diferente de zero num tempo infinito. Tambm
caracterizado por no s por atenuar frequncias mas tambm por adicionar ganho as
frequncias que se pretende deixar passar. Este pode ser descrito em termos de equao s
diferenas como
M

k=0

k=1

y [n]= b k x [nk ]+ ak y [nk ],

(18)

onde max(M,N) ordem, a e b os coeficientes, representando os plos e zeros


respectivamente e x[n] o sinal de entrada. A equao s diferenas (18) define como o sinal
de sada est relacionado com o sinal de entrada, e pode ser representado graficamente em
forma de diagrama, usando a forma directa II como apresenta a Figura 36 [36].

Figura 36: Diagrama de filtro IIR na forma directa II (Adaptado de [36])

32

Na forma directa II uma estrutura que permite a implementao de filtro IIR de forma
optimizada, consumindo menores recursos a nvel computacional. Tambm podemos
representar a equao (18) na forma de transformada Z, e obtemos
M

b0 (1b k z 1 )
H ( z )=

k=1
N

(1a k z

k=1

(19)

Na equao (19) podemos ver que a funo de transferncia de um filtro IIR uma funo
1
racional em z . Dado que o filtro de Chebyshev originalmente um filtro analgico e para
sinais contnuos, possvel transformar num filtro digital mediante aplicao de uma
transformao bilinear. A transformao bilinear um mtodo para transformar um sistema
de tempo contnuo noutro no tempo discreto e vice-versa. Baseia-se em mapear os valores
presentes num sistema em outro, usando mudana de varivel. Para o filtro, ser necessrio
mapear o plos encontrados no planos tal como apresentado em (45) anexo B, para o plano
z na forma da equao (19).

3.6 Tcnicas de janelas


As tcnicas de janelas de um sinal so conhecidos por poderem melhorar as caractersticas
espectrais do sinal, e desta forma melhorar a anlise espectral usando diferentes algoritmos
tais como os mencionados neste captulo. A tcnica de janela consiste em aplicar e
multiplicar as amostras do sinal por uma funo de janela. Existem vrias funes de
janelas, como por exemplo: Rectangular [37], Hanning [37], Hamming [37], Blackman [37]
entre outros.
A funo de Hamming dada por
W [n]=0.540.46cos (2

n
), n=0,1,2,... , N1.
N

(20)

Depois de calculados os coeficientes da janela, esta pode ser multiplicada pelas amostras de
entrada, e ao conjunto de amostras resultante aplicado o algoritmo de estimao de
frequncia.

3.7 Tcnica de estimao da durao da nota


Nesta seco analisa-se a estimao da durao da nota. Calculando a durao de cada nota
ser possvel, por exemplo elaborar uma partitura e fazer a converso em MIDI das notas
recebidas.
necessrio criar um metrnomo para definir a velocidade da msica, um quantizador, para
quantizar a notas por cada batida do metrnomo. A quantizao das notas corresponde
contagem do nmero de notas que ocorrem em cada batida de metrnomo. Definindo a
quantizao das notas podemos construir uma pauta musical de diferentes formas, porque
definimos quais so as bases de figuras musicais que sero apresentadas na pauta musical
33

por cada batida, mediante a durao de cada nota. Este facto depende da relao que as
figuras das notas musicais tm entre si.
Para estimar a nota necessrio contar a durao de cada amostra de sinal que recebido,
mas tambm necessrio estimar as pausas, ou seja, a durao do silncio. Os seguintes
parmetros so necessrio ter em conta quando pretendemos calcular o durao da nota:
BPM, frequncia de amostragem, compasso escolhido pelo utilizador, quantizao das notas
e o nmero de amostras recolhidas do sinal de entrada.
Seja N o nmero de amostras recolhidas frequncia de amostragem, Fs podemos dizer que
1
SampleInterval=N
[ms]
(21)
Fs
representa o intervalo de tempo que se recolhe um conjunto de N amostras em
milissegundos. Seja BPM o nmero de batidas por minuto, em segundos, obtemos
1000
BeatInterval=60
[ms],
(22)
BPM
que representam em milissegundos o intervalo de tempo entre cada batida de metrnomo.
Com base no compasso musical seleccionado, calcula-se o tempo total de um compasso na
partitura usando (23), dada por

TimeDivision=CompassBeatInterval [ms].

(23)

Com o valor de quantizao de notas, podemos calcular o intervalo mnimo de uma nota ou
pausa
BeatInterval
QuantizationInterval=
[ms].
(24)
Quantization
Com as equaes (21), (22), (23) e (24), podemos estimar a durao de cada nota ou pausa
musical utilizando duas estratgias. Uma soluo seria utilizar uma janela deslizante que
calcula a energia na frame udio. Quando esta energia inicia e diminui at um limiar
mnimo considerado que o sinal terminou; quando a energia maior que um limiar
mximo considerado como incio. A Figura 37 ilustra como a janela deslizante passa pelo
buffer de amostras, calculando a energia.

34

Figura 37: Sequncia da janela deslizante para o clculo da durao do sinal

Na Figura 37, N representa o tamanho do buffer e L da janela deslizante. Dado que a


frequncia de amostragem fixa, o ndice do incio do sinal e o ndice do fim da nota vo
fornecer a distncia entre o tempo final e o tempo inicial. Esta distncia multiplicada por
SampleInterval (21) e determina a durao da nota tocada na frame e dada como

Duration=SampleInterval( EndIndexStartIndex) [ms],

(25)

onde EndIndex e StartIndex correspondem ao ndice inicial e final, respectivamente. No


entanto esta soluo dada a frequncia de amostragem e o nmero de amostras recolhidas
necessita de uma dimenso de buffer demasiado elevada. A seguir apresentado um
exemplo para demonstrar a problemtica desta soluo.
Exemplo: Dado um compasso de 4, o metrnomo a 100 BPM, quantizao igual a 4
(significa que numa batida de metrnomo podem existir 4 notas), o nmero de amostras
igual a 1024 e a frequncia de amostragem de 44100 Hz, vamos calcular o tamanho do
buffer de amostras e o tamanho da janela deslizante.
Calcula-se o SampleInterval usando (21)

SampleInterval= 1024

1
= 23,22 [ ms]
44100

Calcula-se o intervalo de cada batida usando (22)

BeatInterval =60

1000
= 600 [ms ],
100

calcula-se o tempo total de cada diviso com a expresso,


35

TimeDivision=4600= 2400 [ ms] .


Com o valor da quantizao calculamos o intervalo mnimo de cada 4 notas numa batida de
100 BPM

QuantizationInterval=

600
=150 [ ms] .
4

Assumindo que se pretende determinar a menor durao de nota, calculamos o tamanho do


buffer necessrio para determinar a presena de uma nota de 150 ms

BufferSize =

QuantizationIntervaN 1501024
=
= 6614,98.
SampleInterval
23,22

Significa que para estimarmos um sinal de 150 ms de durao nas condies especificadas
neste exemplo precisaramos de ter um buffer de 6615 pontos, que iria ocupar muitos
recursos computacionais. necessrio realar que o aumento do nmero de batidas do
metrnomo diminui o tamanho necessrio para detectar 4 notas numa batida, e o processo
contrrio aumenta o tamanho do buffer. Os valores de quantizao tambm influenciam o
tamanho do buffer: a diminuio deste aumenta o tamanho do buffer e vice-versa.
Uma soluo menos dispendiosa a nvel de processamento seria contar simplesmente quanto
tempo uma dada frequncia se mantm presente. Dado que o intervalo das 1024 amostras
ser fixo, basta contar o nmero de vezes seguidas que a nota detectada, ou seja, quando
uma dada frequncia est presente, o valor da sua durao incrementado at que a
frequncia mude de valor. Em seguida, podemos estimar a durao da nota usando a relao
entre QuantizationInterval e SampleInterval, dada por
fraction=

QuantizationInterval 150 ms
=
=6,45,
SampleInterval
23,22ms

(26)

que representa o nmero de vezes que temos que receber uma frequncia para determinar
que a sua durao foi de 150 ms. Desta forma, contando o nmero de vezes consecutivas
que a frequncia detectada, podemos determinar a sua durao. A mesma soluo vlida
para a durao da pausa.

3.8 Resumo
Em resumo como algoritmo de estimao de frequncia optou-se pela FFT. Para resolver o
problema do nmero de pontos necessrio aplicar decimao de maneira a reduzir a
frequncia de amostragem. Tambm foi decidido, que para a aplicao da decimao
necessrio um filtro passa-baixo, e optou-se pela utilizao do filtro de Chebyshev tipo I.
Dado que reduzimos a frequncia de amostragem por um factor de decimao, significa que
podemos ento definir qual o nmero de pontos necessrios para detectar as frequncias.
Como a frequncia mxima a ser processada de 1174 Hz, como apresenta a Tabela 1,
significa que podemos encontrar o factor de decimao que reduza a frequncia at
36

amostragem at 2x1174 Hz = 2348 Hz, respeitando assim a frequncia de Nyquist. Neste


sentido significa que para uma frequncia de amostragem igual 44100 Hz, o factor de
decimao mximo para respeitar a frequncia de Nyquist dado por,
factor decimao=

fs 44100
=
= 18,78 (44 ),
fn 2348

onde fs a frequncia de amostragem e fn a frequncia de Nyquist. Calculando a resoluo


no tempo e na frequncia, obtemos os valores apresentados na Tabela 7, considerando o
factor de decimao igual a 18 e a frequncia de amostragem 44100 Hz a taxa efectiva de
amostragem ser de 2450 Hz.
Numero de pontos

Resoluo em frequncia (fs/N)


[KHz]

Resoluo no tempo (N/fs)


[ms]

1024

2,39

0,4

512

4,78

0,2

256

9,57

0,1

64

38,28

0,02

Tabela 7: Nmero de pontos da FFT, resoluo no tempo e frequncia


Verifica-se na Tabela 7, que com a decimao possvel obtermos uma resoluo mais
baixa com um nmero de pontos inferiores ao apresentados na Tabela 3, e que a partir de
512 a resoluo em frequncia aumenta, diminuindo a preciso. Com estes resultados o
nmero de pontos a ser utilizado para 512. A Tabela 8 resume todos os parmetros a
serem utilizados na estimao da frequncia.
Parmetros

Descrio / Valor

Algoritmo de estimao de
frequncia

FFT

FFT nmero de pontos

512

Tcnica de Janela

Hamming

Nmero de pontos da janela

512

Decimao

No tempo

Factor de decimao mximo

18

Filtro passa-baixo

Chebyshev Tipo I

Nmero de plos

Frequncia de corte

2000 Hz

Ripple

0,5 dB

Largura de banda da guitarra elctrica

82 1174 Hz

Tabela 8: Resumo dos parmetros utilizados para estimao da frequncia

Para melhorar a qualidade do espectro do sinal, optou-se por aplicar uma janela de
Hamming antes de se calcular a FFT, suavizando assim o sinal. A opo por utilizar a
frequncia de amostragem de 44100 Hz resume-se pelo facto de ser a frequncia de
amostragem mais utilizada em udio profissional, principalmente para gravao do sinal
37

vindo da guitarra elctrica. Mas este valor no fixo, depende exclusivamente da opo do
utilizador.
No Captulo 6 so apresentados resultados referentes aos testes efectuados com estes
parmetros. Analisa-se tambm os valores ideais dos parmetros que minimizam o erro de
deteco de frequncia.

38

4 Soluo proposta e implementao


Neste captulo estudada e analisada a soluo para o problema apresentado no captulo 2.
Apresenta-se pormenores sobre a soluo implementada e detalhes de implementao, bem
como as ferramentas utilizadas para o desenvolvimento da mesma.

4.1 Critrios de desenho da soluo


A escolha da tecnologia a ser utilizada no desenvolvimento do projecto foi baseada nas
seguintes consideraes:

Suporte multi-plataforma para os sistemas operativos , Linux e Windows.


Maior reutilizao possvel do cdigo.
Uso de programao concorrente, programao paralela e processamento digital de
sinal para deteco de frequncia.
Ambiente grfico para a aplicao, ilustrando as funcionalidades implementadas.

Para programao concorrente a primeira deciso foi de utilizao da API Pthread [38],
porque pode ser aplicada em qualquer um dos sistemas operativos alvo, com a linguagem
C++. No caso especfico do Windows, ser utilizada a biblioteca Pthreads-Win32 [38]. No
decorrer do desenvolvimento, com alguma pesquisa, foi encontrada a biblioteca Boost C++
[39]; Boost um conjunto de bibliotecas C++ com o objectivo de estender as
funcionalidades da linguagem C++, com suporte em vrios sistemas operativos.
Boost possui uma biblioteca de programao concorrente que se chama Boost Thread [40].
Esta biblioteca utilizada no desenvolvimento da aplicao em detrimento da API PThread.
A grande vantagem de se utilizar esta biblioteca, reside no desenvolvimento de cdigo C++
genrico e portvel para qualquer outra plataforma, sem que seja necessrio a incluso no
projecto de API externas. A biblioteca Boost Thread, disponibiliza para alm de mtodos
para criao de thread, objectos de sincronismo como mutex, semforos, variveis
condicionais e outros objectos de sincronismo como barries e future. Toda a programao
concorrente desenvolvida fazendo uso da biblioteca Boost Thread.
Outra vantagem da utilizao da biblioteca Boost no projecto a biblioteca Signal e Slots,
Boost Signals [41]. A biblioteca Boost Signal implementa funcionalidades semelhantes a
eventos e delegate em C#. Os signals representam callbacks com mltiplos alvos, e os slots
so callbacks receptores os quais o signals esto ligados e que so executados quando um
sinal emitido. A biblioteca Boost Signal2 ser utilizada no projecto para notificaes,
como por exemplo para iniciar a captura do sinal udio ou outras notificaes entre as
diferentes camadas da aplicao.
Para o projecto ser utilizada a segunda verso da biblioteca Boost Signal, designada por
Boost Signals2 [42]. A diferena entre as duas verses que a verso 2 suporta multithreading.
Para programao paralela, a escolha a utilizao de OpenMP [43] para a linguagem C/C+
+. A opo de utilizao do OpenMP resulta de 2 factores; o paralelismo ser introduzido por
meio de directivas includas no cdigo, o que no exige grandes mudanas neste; o facto de
39

estarmos numa arquitectura com memria partilhada. Na Figura 38 [44] apresentada a


arquitectura de um sistema multi-processador ou multicore.

Figura 38: Exemplo de uma arquitectura multicore ou multi-processador (Adaptado de [44])

O OpenMP utilizado para paralelismo funcional e permite tirar partido da tecnologia


multicore. Para paralelismo de dados pretende-se utilizar Assembler com instrues Single
Instruction Multiple Data (SIMD) para caso de alguma optimizao a nvel de operaes
com dados.
Para a aplicao de tcnicas de processamento de sinal digital, utilizada a biblioteca
FFTW [45] com a linguagem C/C++. Esta biblioteca suporta diferentes sistemas operativos
sem que seja necessrio alterar o cdigo. Outra caracterstica desta biblioteca estar
desenvolvida com suporte de SSE/SSE2/3DNow; estas instrues pertencem ao conjunto de
instrues chamadas SIMD. As instrues SIMD permitem num nico ciclo de CPU
efectuar operaes em dados armazenados de forma vectorial. Esse conjunto de instrues
permite manipular vrios dados simultaneamente, o que divide o tempo de operao, dos n
vectores, por ciclo de CPU. A Figura 39 [46] exemplifica a comparao entre uma operao
escalar e uma operao com SIMD.

Figura 39: Comparao entre operaes escalares e operaes SIMD (adaptado de [46])

Com as instrues SIMD o clculo da FFT [10] pode ser efectuado de forma mais eficiente
em computadores que suportem estas instrues, porque possvel operar vrios dados em
simultneo em cada ciclo de CPU.
Para suporte a udio ser utilizada a biblioteca RTAudio [47] em C/C++, que suporta a
gravao e reproduo de udio em tempo real nos sistemas operativos Linux, Windows e
MacOSX. Esta biblioteca simplifica o desenvolvimento antes iniciado para suportar os
40

vrios drivers de udio nos diferentes sistemas operativos. A biblioteca tem a capacidade de
enumerar os dispositivos udio, multi-canal e conexo dinmica entre dispositivos udio.
Para gravao de ficheiros udio, utilizada a biblioteca libsndfile [48]. Esta biblioteca
permite a leitura e gravao de ficheiros udio em diversos formatos. Suporta a definio da
frequncia de amostragem, nmero de canais e est disponvel para qualquer sistema
operativo.

4.2 Arquitectura
A aplicao tem uma arquitectura cliente-servidor, onde as duas componentes principais, o
GSTTransporter e a interface grfica, que so respectivamente servidor e cliente. O
GSTTransporter ou simplesmente Transporter corresponde a um executvel que processa
todo o sinal de entrada produzido pela guitarra elctrica, e tem como sada as notas musicais
que foram tocadas pelo guitarrista, e um ficheiro udio contendo a gravao de todo o sinal
produzido pela guitarra elctrica. A Figura 40 ilustra a arquitectura.

Figura 40: Arquitectura da aplicao

A interface grfica por onde o utilizador far a interaco com a aplicao, podendo
visualizar as notas produzidas pela guitarra, e alimentada pelas notas debitadas pelo
GSTTransporter.
A interface de captao de udio ser responsvel pela aquisio de udio na plataforma, e a
sua implementao ser dependente do sistema operativo. Esta interface permite a
interaco com a placa de som ou outro servidor de udio (Audio Stream Input Output
-ASIO no Windows ou Jack Audio Connection Kit-JACK no caso do Linux) para passar o
sinal udio camada de processamento de udio. Esta interface tambm ir definir a
frequncia de amostragem para aquisio do sinal. Na Figura 41, apresentam-se as camadas
da aplicao.

Interface de Utilizador da aplicao


Processamento
de udio
Interface de captura udio
ALSA/JACK

CoreAudio

DirectX/ASIO

Linux

Mac OSX

Windows

Figura 41: Camadas da aplicao

41

A camada de processamento de udio realizar deteco de frequncia e estimao da


durao do sinal udio vindo da interface de captao. Cada janela do sinal udio que for
captado, ser processada numa thread da thread pool, dando a possibilidade de processar a
prxima amostra udio.
Como a camada de processamento udio somente detecta a frequncia e calcula a durao
do sinal, estes dados so enviados para serem interpretados pelas aplicaes que se ligarem
ao Transporter. da responsabilidade da interface grfica dar a interpretao correcta da
informao envida pelo Transporter, e isto significa que o mapeamento de frequncias para
notas est fora de mbito do Transporter.
A interface de utilizador, ir permitir a interaco do guitarrista com a aplicao e receber
as informaes das notas tocadas da camada de transformao para apresentar ao utilizador.
Na interface de utilizador necessrio prever todas as sequncias de aces que o utilizador
possa efectuar. Parte do processamento udio foi desenvolvido no trabalho preliminar, como
a deteco de frequncia e mapeamento para uma nota musical.
As vrias camadas sero agrupadas, sero constitudos componentes com as diferentes
camadas. O objectivo ter em separado a componente de processamento das notas e a de
processamento de sinal captado pela guitarra elctrica. A Figura 42 resume as bibliotecas e
suas aplicaes.

Biblioteca Boost
Multi-Threading

Serializao
de
objectos

Thead e
Thread Pool

Mecanismo
de
sincronizao

Comunicao
entre
processos

Funes
de
callback

Mutex
Condicion
Lock

message_queue

Signal

Biblioteca
Libsndfile

Biblioteca
RtAudio

Biblioteca
FFTW

Leitura e escrita
de ficheiros udio

Leitura e escrita
de amostras

Clculo de
FFT

Camada de acesso
ao driver

Placa de Som

Figura 42: Diagrama de blocos resumindo as bibliotecas utilizadas e sua aplicao

42

5 Aspectos de implementao e desenvolvimento


Neste Captulo so abordados aspectos relativos ao desenvolvimento da aplicao. So
descritas as vrias classes que compem a aplicao e as suas caractersticas. A descrio de
cada componente est dividida pelas diferentes camadas. Existem 2 componentes principais
da aplicao: o GSTTransporter e a interface grfica. O GSTTransporter tem como
finalidade a captao, processamento e transformao do sinal da guitarra elctrica. A
interface grfica tem como funcionalidade a apresentao das notas tocadas, como a
possibilidade de correco feita pelo guitarrista.

5.1 GST Transporter


O GSTTransporter implementa todas as funcionalidades relativas sequncia de
processamento das amostras recebidas da guitarra at ao resultado final que so as notas
tocadas pelo guitarrista. Como resultado obtemos um ficheiro executvel. Ao executvel so
passados os seguintes parmetros, apresentados na Tabela 9.
Parmetros

Descrio

SampleRate

Valor para a frequncia de amostragem

NumBuffer

Nmero de buffer (double buffering, triple)

BufferSize

Tamanho do buffer do servidor udio

NumThreads

Nmero de threads que sero usados na pool de threads

AudioFormat

Formato udio que se deseja gravar o ficheiro

AudioFileName
AudioDriver

Nome do ficheiro udio


Driver que ser utilizado para a captura

AudioCDevice

Placa de som utilizada para captura

AudioPDevice

Placa de som utilizada para playback

SystemInfo
Log

Retorna informao relativa aos drivers e placas de som


encontradas no sistema onde est a executar.
Define se aplicao faz log ou no

Tabela 9: Parmetros passados ao executvel do Transporter


Os parmetros configuram a execuo do GSTTransporter, para depois poder iniciar todo o
processo de captura. Este componente disponibiliza uma interface para comunicao em
tempo real entre a interface grfica de onde sero dadas as ordens para comear a captura e
processamento dos sinais vindos da guitarra elctrica.
Os parmetros permitem iniciar o servidor udio com a escolha da placa de som que ser
utilizada para captao e para reproduo, no caso de existir mais do que uma placa de som
no computador do guitarrista. O driver seleccionado serve para escolher qual o software que
ser utilizado sobre as placas de som.
Alguns parmetros so partilhados pelas diferentes camadas que compem o
GSTTransporter. Outros so utilizados apenas por camadas especficas tais como
AudioFileIO, para definir o nome do ficheiro udio de sada, por exemplo.
43

Para analisar os parmetros passados ao executvel, utilizada a biblioteca Boost


program_options [49]. Esta biblioteca permite obter opes do programa quer sejam
passadas como parmetro ou por ficheiro de configurao. A Figura 43 ilustra a sequncia
de processamento de sinal efectuada pelo Transporter.

Figura 43: Sequncia de processamento do Transporter

O processamento feito numa threadpool, atravs de diferentes thread a processar os dados


sem que o Transporter perca amostras do sinal seguinte. Como a Figura 43 ilustra, a frame
contendo o sinal da guitarra captada, e registado o tempo que a frame foi captada
(timestamp) e calculada a durao do sinal e iniciada a estimao da frequncia. Quando
estes 3 processos terminam criado um objecto que contm 7 dados: timestamp, ndice, 6
frequncias, energia da frame, o pico mximo e mnimo, e a durao. Depois de criada a
nota, esta posta na fila de mensagem, que acessvel para outras aplicaes poderem
receber. A limitao de 6 notas musicais, est relacionada com o facto da guitarra ter 6
cordas, e premindo os trastos o mximo de notas que podero ser tocadas em simultneo so
6.
O processamento de cada frame executado em threads diferentes e neste sentido no h
garantia de qual ser o processamento que terminar primeiro. Assim, o timestamp regista o
valor do tempo no momento em que a frame do sinal adquirida, para determinar a ordem
certa de cada frame. Desta forma, as notas recebidas pelos clientes sero sempre
interpretadas na ordem certa.
A estimao das frequncias do sinal possui a sequncia ilustrada na Figura 44. Esta
sequncia executada pelas threads pertencentes threadpool sempre que receberem uma
amostra nova do sinal da guitarra elctrica. A threadpool foi desenvolvida usando a
biblioteca Boost threadpool [50], que permite a sua utilizao de forma independente do
sistema operativo.

44

Figura 44: Sequncia para a estimao de frequncias

Quando chega uma frame contendo o sinal da guitarra, esta passada por um filtro passabanda. Este filtro ir retirar todas as frequncias que no pertencem largura de frequncia
da guitarra. Em seguida feita a decimao do sinal baseado num factor de decimao
escolhido. Aplica-se ao sinal decimado uma janela de Hamming e posteriormente efectua-se
o clculo da FFT.
Com a potncia do espectro, feita uma pesquisa pelos mximos. Dado que podemos ter
vrias notas tocadas numa frame, foi definido um valor limiar de potncia a qual se
considera mximo. Assim, somente se procuram os ndices cujo valor ultrapasse o limiar.
Com os ndices destes valores mximos, calcula-se a frequncia correspondente e a nota
musical.
As notas so obtidas atravs da aproximao entre duas frequncias com as respectivas
notas. dividido o valor de frequncia calculada na estimao pelo intervalo superior e
inferior entre duas notas, o valor mais prximo de 1 assumido como sendo a nota mais
prxima associada frequncia.
O GSTTransporter devolve as frequncias e duraes detectadas e no as representaes das
notas; desta forma conseguimos tambm garantir que cada cliente possa dar o seguimento
que melhor pretende com esta informao: durao e frequncia. Um exemplo de aplicao
seria a transformao destas notas em MIDI [4].
O GSTTransporter constitudo por vrias camadas: captura de udio, processamento de
sinal, gravao, e timer. Tambm faz a recepo dos comandos vindos da interface grfica e
executa as operaes que foram transmitidas. A comunicao do GSTTransporter com
outras camadas feita atravs de mecanismo de comunicao baseado em sinais,
implementado com Boost Signals. Desta forma quando o GSTTransporter recebe a ordem
de iniciar a captura, envia um sinal para todas as outras camadas para iniciarem tambm o
45

processo de captura. Na Tabela 10, esto listados os ficheiros que constituem o


GSTTransporter.
Classes

Descrio

Ficheiro

CGSTTransporter

Implementa as funcionalidade do Transporter,


recepo de comandos e ligao com outras
camadas

Transporter.h
Transporter.cpp

Frame
Config
ConfigManager
main
CLogger
Commands

Estrutura de uma Frame detectada pelo


Transporter
Estrutura com dados de configurao
Incio da aplicao

Frame.h
Config.h
main.cpp

Escrita de log de mensagens do Transporter

Logger.h
Logger.cpp

Enumerado dos comandos do Transporter

Commads.h

Tabela 10: Ficheiros e classes pertencentes ao GSTTransporter


O diagrama UML da classe que implementa o CGSTransporter apresentado na Figura 45.

Figura 45: Diagrama UML da classe CGSTTransporter

Na Figura 45 podemos ver o diagrama de classes relacionadas com o Transporter. A classe


CGSTTransporter deriva de CAudioPort para permitir a esta componente ser adicionada ao
servidor udio. A classe Config contm membros que representam os valores para
configurar o Transporter, como a frequncia de amostragem, nmero de buffers entre
outros.
de salientar que o Transporter totalmente desacoplado da interface grfica, o que
permite exportar o mesmo para outras plataformas tendo somente que se implementar a
interface grfica.

5.1.1 Transporter comandos


O GSTTransporter possui uma thread responsvel por receber comandos enviados pela
interface grfica. Os comandos so guardados numa fila de mensagem implementada
46

utilizando o Boost message_queue [51]. O Boost message_queue envia e recebe bytes na


fila de mensagens. Para enviar objectos necessrio que estes sejam serializveis.
As mensagens esto definidas como sendo do tipo inteiro, e cada valor inteiro passado ao
Transporter corresponde a um determinado comando. O GSTTransporter possui uma
thread que fica bloqueada na fila de mensagens enquanto esta estiver vazia. Quando a fila
recebe uma mensagem a thread libertada e processa o cdigo de mensagem recebida. Na
Tabela 11 esto listados os comandos passados ao servidor e os seus cdigos.
Comando

Descrio

START

Inicia a captura e processamento das amostras

STOP

Pra a captura e o processamento das amostras

EXIT

Terminar o processo do Transporter

TUNER MODE ON/OFF


RUN BENCHMARK

Liga e desliga o modo de afinador


Calcular os melhores parmetros para deteco de
frequncia

Tabela 11: Comandos passados ao GSTTransporter


O comando para o modo afinador permite configurar o Transporter com diferentes valores
para detectar somente as frequncias correspondentes afinao das 6 cordas da guitarra
elctrica. O comando RUN BENCHMARK ordena a execuo de uma avaliao dos
melhores parmetros para configurar o Transporter de modo a obter menor erro possvel na
estimao das notas. Como sada produz um ficheiro Extensible Markup Language (XML)
[52] que contm os valores das notas a serem estimadas comparativamente com os valores
estimados. Tambm contm informao relativamente ao erro mximo, mnimo e mdio da
estimao de todas as notas.
A classe CGSTTransporter atravs de comunicao baseada em sinal faz a activao de
funcionalidades noutros componentes tais como o de gravao de udio, mas certas
alteraes s podem ser efectuadas quando o GSTTransporter no est a ser executado. Esta
limitao est relacionado com o facto de existirem parmetros como a quantizao e o
BPM, que no podem ser alterados durante o processo em que o Transporter est a fazer a
estimao da durao da nota, porque poder devolver dados incorrectos.

5.1.2 Classe CLogger


A classe CLogger abstracta, sendo responsvel por escrever um ficheiros de log do
Transporter. A Figura 46 apresenta o diagrama UML da classe CLogger.

Figura 46: Diagrama UML da classe CLogger

Na Figura 46 observamos os mtodos estticos para escrita do ficheiro log, sendo desta
forma possvel ver as chamadas que esto a decorrer no Transporter.
47

5.1.3 Classe Frame


A classe Frame representa uma frame recebida do servidor udio e processada pelo
Transporter onde so calculados as componentes do sinal. A Figura 47 apresenta o
diagrama UML da classe Frame.

Figura 47: Diagrama UML da classe Frame

Na Figura 47 observamos os membros da classe Frame. O TimeStamp serve para guardar o


tempo em que a frame foi processada, o Index corresponde o ndice da frame, Duration
corresponde a durao, MaxPeak e MinPeak correspondem ao valores mximo e mnimo
existentes na frame, respectivamente. O membro Energy corresponde a energia na frame e
Frequencies um array contendo as frequncias detectadas na frame.

5.1.4 Classe Config e ConfigManager


A classe Config contm todos os parmetros de configurao do Transporter como
membros. A classe ConfigManager tem mtodos estticos para ler e gravar ficheiros de
configurao. A Figura 48 apresenta o diagrama UML de ambas as classes.

Figura 48: Diagrama UML das classes Config e ConfigManager

Podemos observar na Figura 48 que a classe ConfigManager agrega um objecto do tipo


Config, e o Config depende da classe boost::serialization. A dependncia da classe Boost
48

serialization existe para permitir a serializao da classe Config num ficheiro XML. A
classe ConfigManager a responsvel pela escrita e leitura do ficheiro mediante a passagem
de um objecto do tipo Config.
A classe Config de grande importncia, porque ser onde estaro guardados vrios
parmetros que serviro tambm para configurar o processamento de sinal, e pode ser
utilizada pela interface grfica para ler ou escrever novas configuraes antes de executar o
Transporter.

5.1.5 Classe CTimer


A classe CTimer responsvel pela execuo de um temporizador. O temporizador serve
para obter os valores do tempo em que o Transporter est a executar a captura, ou para
retirar os valores de timestamp. Para a implementao do temporizador necessrio usar o
relgio do computador. Para se poder utilizar o relgio do computador, estamos
dependentes do sistema operativo onde a aplicao ir ser executada. Para implementar a
classe CTimer necessrio fazer uma implementao do relgio para cada um dos sistemas
operativos alvo, baseado nas API disponibilizadas por estes sistemas operativos.
A preciso do temporizador importante para que se possa gerar eventos com intervalos de
tempo correctos, caso se pretenda adicionar funcionalidades ao Transporter como a captura
durante um intervalo especfico de tempo. Quanto maior o nmero de bits do relgio do
computador, maior a preciso; por este motivo a deciso foi utilizar temporizadores na
ordem dos milissegundo ou micro-segundo.
O conjunto de bibliotecas Boost possui uma biblioteca que possibilita a utilizao do
temporizador, designada de Boost Timer [53]. No entanto, segundo a documentao da
mesma, refere que a implementao desta funo, embora tenha uma preciso alta, a
latncia na chamada era maior. Como pretendemos ter um temporizador que seja rpido e
preciso, no conveniente a utilizao desta biblioteca, optando-se assim por usar API
especficas de cada sistema operativo alvo.
Foram analisadas solues para temporizadores de alta preciso para os sistemas operativos
Windows, especificamente na verso Windows 7 32 bits e 64 bits, e no Fedora 14, a 64 bits.
Para o sistema Mac OsX no foi possvel analisar, dado que no presente momento no
existe um computador Mac OS X disponvel.
A classe CTimer est implementada, at a data, para suportar os sistemas operativos
Windows e Linux. Fazendo uso da biblioteca Boost Signals2 [42], esta classe disponibiliza
um sinal que chamado sempre que decorre o tempo configurado. Com o Signal, qualquer
classe que pretenda chamar algum mtodo num determinado intervalo de tempo, pode
registar esse mtodo no sinal.
Quanto feita a chamada ao mtodo Start da classe CTimer, esta inicia uma thread,
implementada com a biblioteca Boost Thread, que inicia a execuo do temporizador. O
mtodo Stop permite parar a execuo do temporizador.

49

A implementao do CTimer fazendo uso da API dos sistemas operativos, foi desenvolvida
utilizando macros para diferenciar a nvel de compilao o cdigo a ser utilizado para cada
um dos sistemas operativos. Esta deciso foi tomada dado que a implementao da classe
ser pequena e assim retira a necessidade de criao de interfaces e implementao para cada
um dos sistemas operativos alvo.

5.1.6 Timer no sistema operativo Windows


No sistema operativo Windows foram analisados vrios mtodos para obteno de um
temporizador preciso, nas quais as escolhidas para anlise pela sua preciso e simplicidade
de uso foram; timeGetTime [54], GetTickCount [55], QueryPerformanceCounter [56].
Apresenta-se na Tabela 12 uma comparao entre as 3 funes para decidir qual delas seria
mais adequada.
Funo

Caractersticas

TimeGetTime

- Preciso de 5 milissegundos
- Retorna o tempo decorrido desde que o Windows iniciou.
- Pode correr aproximadamente at 49,7 dias

GetTickCount

- Preciso de 10 a 16 milissegundos
- Retorna o tempo decorrido desde que o computador iniciou.
- Pode correr aproximadamente at 49,7 dias

- Em sistemas multi-processadores ou multi-core, no importa qual o


processador que foi chamado, muito embora possam ter valores de relgio
QueryPerformanceCounter diferentes.
- L o valor do contador directamente do relgio do CPU, para ter maior
preciso.

Tabela 12: Comparao das caractersticas das funes de temporizador disponibilizas


pela API do Windows
Dado que existe melhor preciso da funo QueryPerformanceCounter, e o facto de ser
independente do processador, torna esta funo mais favorvel para os requisitos da
aplicao.

5.1.7 Timer no sistema operativo Linux


No caso do Linux, est disponvel a funo clock_gettime [57], que recebe como parmetro
a fonte de onde se pretende retirar o valor do tempo. Esta funo tem uma resoluo de
segundos e nano-segundos. Para o corrente problema, dado que pretendemos o valor do
tempo do sistema, usamos como fonte clock_id a opo CLOCK_REALTIME [57]. Esta
uma funo em conformidade com a norma POSIX.1-2001.

5.2 Camada de udio


A camada de udio realiza a ligao entre a placa de som e a aplicao. Esta camada
constituda pelas classes apresentadas na Tabela 13.

50

Classes

Descrio

Ficheiro

CAudioServer

Usa a biblioteca RTAudio para abstrair dos


drivers e comunicar com a placa de som

AudioServer.h
AudioServer.cpp

CAudioPort

Representa uma porta de captura ou playback


no servidor

AudioPort.h
AudioPort.cpp

CBuffer

Pertence porta e onde os dados so escritos


e lidos

Buffer.h
Buffer.Cpp

CBufferInfo

Descreve a informao relativamente ao buffer

Buffer.h

Tabela 13: Classes pertencentes camada de udio


O diagrama de UML da camada de udio apresentado na Figura 49.

Figura 49: Diagrama UML da camada de captura udio

A Figura 49 apresenta a estrutura de classes UML que fazem parte da camada de captura de
udio. Podemos ver associadas estrutura de classes, mas sem muitos detalhes as classes
RTAudio, boost::thread, boost::mutex e boost::condition, que so as classes de bibliotecas
utilizadas para o desenvolvimento.

5.2.1 Classe CAudioServer


A classe CAudioServer o componente para interaco entre a placa de som e a aplicao.
desenvolvido com a utilizao da biblioteca RTAudio [30], as preocupaes relativamente
ao desenvolvimento dos drivers para diferentes sistemas operativos foram postas de parte. O
RTAudio suporta drivers nos 2 sistemas operativos sendo este um dos requisitos do
projecto.
A biblioteca RTAudio [30] tambm suporta canais udio mltiplos, mas para a nossa
aplicao s interessa um nico canal. Dado que o projecto est ser desenvolvido em Fedora
51

14, e muito embora a biblioteca RTAudio suporte alguns drivers como Advance Linux
Sound Architecture (ALSA) [34] e Jack Audio Connection Kit (JACK) [35] para udio no
Linux , na biblioteca ser adicionada uma nova API que o PulseAudio [36].
A arquitectura udio no Linux, disponibilizada pelo ALSA no permite que mais do que
uma aplicao tenha acesso a placa de som. O JACK veio resolver parte do problema,
porque permite que vrias aplicaes tenham acesso placa de som, e at mesmo
redireccionar entradas e sadas de uma aplicao para outra. No entanto, o JACK
vocacionado mais para aplicaes profissionais, que necessitam de baixa latncia e tempo
real, para alm de que o JACK no distribudo como fazendo parte da plataforma base do
Linux, e o facto de que quando se utiliza o JACK nenhuma outra aplicao que no o
suporte, tem acesso a placa de som.
O PulseAudio [36] veio resolver este problema: funciona como um proxy entre a placa de
som e as aplicaes. Faz uso do ALSA para ter acesso placa de som, suporta baixa
latncia e tempo real. O PulseAudio tambm permite s aplicaes usarem a placa de som
mesmo com o JACK ligado, porque o suporta. O PulseAudio j standard em vrias
distribuies Linux, o que motiva a incluso desta API na biblioteca RTAudio.
O servidor udio possui uma lista de portas com mtodos para escrita e leitura. Estas portas
so registadas no servidor, que as adiciona na lista de portas de captura ou portas de
playback, dependendo da direco escolhida se de input ou output.
As portas possuem 1 ou mais buffers, para escrita ou leitura, permitindo a adaptao das
portas caso se chegue concluso que o nmero de buffers para determinada porta no
suficiente. Esta opo particularmente importante para os casos onde necessrio fazer
processamento udio, e h necessidade de no perder amostras recolhidas da placa de som.

5.2.2 Classe CAudioPort


CAudioPort uma classe abstracta que representa uma porta de captura ou de playback que
conectada ao servidor udio. Todos os componentes que pretendam receber sinal udio ou
enviar sinal udio necessitam de registar a porta. Cada porta constituda por buffer de
escrita e de leitura. Os buffers esto implementados na classe CBuffer, que representa um
conjunto de n buffers.
Os componentes que pretendam receber sinais do servidor udio, derivam desta classe e
implementam os mtodos de escrita e leitura, Write e Read respectivamente. O mtodo
Read permite que o componente leia os sinais vindos do servidor udio, enquanto que o
mtodo Write permite escrever no servidor udio.
As portas tm prioridades, para definir a ordem onde ser inserida a porta quando
adicionadas lista de portas existentes na classe CAudioServer. Cada porta possui uma
nica direco, escrita ou leitura. Esta deciso tomada pelo facto de podermos fazer
captura de uma determinada placa de som e fazer a reproduo noutra placa de som
diferente, caso o computador em questo tenha mais do que uma placa de som, algo que
muito comum em ambientes profissionais.
52

5.2.3 Classe CBuffer


Cada porta conectada ao servidor udio composta por um buffer da classe CBuffer. Como
se pretende processar todo sinal udio recebido, sem que se tenha perda de amostras,
precisamos de garantir sincronismo entre a escrita do sinal e o processamento do mesmo.
Dado que a escrita e leitura so executadas por diferentes threads, estamos na presena de
um problema de sincronismo escritor/leitor.
A classe CBuffer suporta M buffers de tamanho N, criados mediante a passagem de
parmetros no mtodo Cbuffer::Create. Esta opo permite que se possa implementar
soluo de double buffering ou M buffering. A soluo de M buffers permite que se possa
ter uma thread a escrever no buffer enquanto outra thread l os dados do buffer.
A thread de leitura fica bloqueada espera que seja notificada pela thread de escrita assim
que a escrita num determinado buffer termina. Em seguida, a thread de escrita passa para o
buffer seguinte enquanto a thread de leitura escreve no buffer anterior. A escrita e leitura
nos buffers feita sempre de forma sequencial, assim, logo que uma thread termina de
processar um buffer, incrementa o nmero do buffer para aceder ao prximo. A Figura 50
ilustra a primeira iterao entre o leitor e escritor.

Figura 50: 1 iterao entre o leitor e escritor

Na segunda iterao o escritor notifica o leitor de que j pode ler o buffer 0, libertando o
lock do buffer, e em seguida passa para o buffer seguinte, ilustrado na Figura 51.

Figura 51: 2 iterao entre leitor e escritor

O processo repete-se at chegar ao ltimo buffer. Dependendo da velocidade de leitura do


leitor, este poder estar alguns buffers atrs do escritor. Quando chega ao ltimo buffer, a
thread escritora volta para o incio do buffer comeando o processo novamente.

53

Figura 52: M iterao entre leitor e escritor

Dado que se pretende ter um nmero de buffers configurvel, necessrio que cada buffer
tenha associado um lock. Est definido que a escrita e leitura nos buffers feita de forma
sequencial, o que significa que logo aps a escrita ou leitura num buffer, a thread move-se
para escrever ou ler o buffer seguinte. Quando qualquer das thread tenta aceder ao buffer,
verifica se este buffer est cheio ou vazio, para escrita e leitura respectivamente e fica em
espera. Tambm pode ocorrer que a thread que pretenda aceder ao buffer encontre o buffer
bloqueado porque outra thread j est a aceder; tal um comportamento expectvel e
necessrio para evitar conflitos de escrita e leitura nos dados.
Toda a implementao relacionada com os objectos de sincronismo foi desenvolvida
utilizado a biblioteca Boost Thread [40].
A principal vantagem de ter o nmero de buffer configurvel est na possibilidade de
adaptar cada porta necessidade na qual est conectada ao servidor udio. Um exemplo, a
necessidade de escrita no disco do sinal captado pelo servidor udio. Dado que a escrita no
disco poder ser mais lenta que, por exemplo, o processamento do sinal, existe maior
necessidade de aumentar o nmero de buffers e assim dar tempo suficiente para que a
operao de escrita no disco ocorra sem que se tenha perda de amostras do sinal.

5.3 Camada de processamento de sinal


A camada de processamento udio responsvel por todo o processamento de sinal
efectuado na aplicao. Implementa todos os mtodos necessrios para a aplicao. Esta
camada composta na realidade por um conjunto de classes e funes para estimao de
frequncia, transformao de notas musicais e clculo da durao de notas. A camada de
processamento udio composta pelas classes apresentadas na Tabela 14.
Classes

Descrio

Usa a biblioteca FFTW para clculo da DFT e


CSignalProcessing possui mtodos para processamento de sinal,
FFT, Hamming, MaximumPeak
XmlReport

Ficheiro
SignalProcessing.h
SignalProcessing.cpp

Escrita do ficheiro de benchmark em xml

Benchmark.h

Tabela 14: Classes pertencentes camada de processamento udio


O diagrama UML da camada de processamento udio apresentado na Figura 53.

54

Figura 53: Diagrama das classes da camada de processamento de sinal

Na Figura 53 observa-se no diagrama UML da classe CSignalProcessing todos os mtodos


disponveis para processamento de sinal. A classe inclui filtros passa-baixo, estimao de
frequncia usando FFT, clculo da energia do sinal, janela de Hamming, decimao e
calculo de pico mximo e mnimo de energia.

5.3.1 Classe CSignalProcessing


A classe CSignalProcessing implementa os vrios mtodos e algoritmos para fazer
processamento de sinal udio. O conjunto de solues para processamento de sinal,
contempla estimao de frequncia com algoritmo FFT usando a biblioteca FFTW,
aplicao de janela de Hamming, clculo da potncia do espectro do sinal e durao das
notas.
A biblioteca FFTW calcula a FFT a N pontos. A biblioteca utiliza vrios algoritmos, o
Cooley-Tukey, o Radix para nmeros primos e Split-Radix [58]. A FFTW calcula a FFT
sobre sinais representados na seguinte forma tempo-frequncia: com nmeros complexoscomplexos, real-complexo e real-real. Para esta soluo foi utilizada o clculo da FFT realcomplexo. O resultado da FFTW um array com simetria hermitiana, ou seja,

Y [k ]=Y [k +N /2] k =0,1,... , N ,

(27)

onde N o nmero de pontos, porque o sinal real no domnio do tempo.


Para estimar a frequncia detectada calculamos o mdulo do espectro pela FFT, e
procuramos o ndice onde este contm o valor mximo. Dada a simetria do array de
potncia do espectro, s necessrio pesquisar pelos mximos em metade do array. Dado
que podemos detectar vrias frequncias, a funo que pesquisa pelos mximos, acumula os
valores mximos encontrados cuja potncia do sinal seja maior que um determinado limiar
passado como parmetro. No mximo, podem ser tocadas 6 notas numa guitarra, formando
um acorde, o que significa que podemos detectar no mximo 6 frequncias em simultneo.

55

Outra caractersticas na estimao da frequncia est relacionada com a definio de uma


frequncia mxima e mnima. Esta definio permite optimizar a pesquisa no array de
potncia do espectro, por intermdio dos ndices correspondentes a frequncia mxima e
mnima. Desta forma a pesquisa inicia-se no ndice mximo.
Para fazer down-sampling do sinal usando decimao, a classe de processamento de sinal
possui um filtro passa-baixo, implementao do filtro de Chebyshev tipo I estudado no
captulo 3 seco 3.4.1. O filtro aplicado depois da recepo do sinal udio para remover
as frequncias que no cumpram com a regra de Nyquist antes de aplicar a decimao. A
frequncia de corte do filtro passa-baixo parametrizvel; para o caso da guitarra elctrica,
os valores so entre 82 Hz a 1175 Hz, o que significa que o filtro no deve cortar estas
frequncias.
A classe est desenvolvida por forma que se possa fazer a chamada das vrias
funcionalidades de forma separada.

5.4 Camada de gravao


importante que o guitarrista possa ouvir toda a msica que tocou, e por este motivo a
aplicao tem uma camada responsvel por gravar todo o sinal vindo da guitarra elctrica
num formato udio.
Esta camada no foi includa na arquitectura porque ela por si s representa uma
funcionalidade nova e no faz necessariamente parte da soluo a ser implementada. No
entanto o facto de ser possvel gravar o sinal num formato udio, torna possvel tambm a
utilizao do mesmo sinal para poder fazer um processamento posterior de todo o sinal.
Tambm abre possibilidades para os casos nos quais foram aplicadas algumas tcnicas de
guitarra como bending, se possa futuramente analisar e detectar estas tcnicas ou mesmo o
guitarrista corrigir e adicionar estas tcnicas na tablatura. A Tabela 15 apresenta os ficheiros
que implementam a camada de gravao.
Classe
CAudioFileIO

Descrio
Usa a biblioteca libsndfile para gravar o sinal
de entrada num ficheiro no formato udio.

Ficheiro
CAudioFileIO.h
CAudioFileIO.cpp

Tabela 15: Classes e ficheiros pertencentes camada de gravao udio

5.4.1 Classe CAudioFileIO


A classe CAudioFileIO responsvel por gravar o sinal udio num ficheiro. Esta classe est
implementada com a biblioteca libsndfile [48]. Esta biblioteca suporta a gravao de
ficheiros udio em vrios formatos (WAV, FLAC, OGG entre outros).
O ficheiro udio criado protegido por um lock de escrita exclusivo, para evitar que outro
processo ou thread possa escrever no ficheiro, mas permite ter outros processos ou threads
a ler do ficheiro. O diagrama UML correspondente a esta camada ilustrado na Figura 54.
56

Figura 54: Diagrama UML da classe CAudioFileIO

Na Figura 54, apresenta-se o diagrama UML da classe CaudioFileIO. Podemos observar os


mtodos Start e Stop que iniciam e param o processo de captura respectivamente. O mtodo
Start cria uma thread para fazer a captura. Como a classe CAudioFileIO deriva tambm de
AudioPort, o servidor udio far a chamada do mtodo virtual Capture passando o buffer
com amostras do sinal como parmetro. Na implementao do mtodo virtual Capture a
classe CAudioFileIO chama o mtodo Save que grava o sinal em formato udio, usando a
biblioteca libsndfile.
A biblioteca libsndfile para gravar ficheiros precisa do parmetro tamanho total do ficheiro.
Por este motivo foi necessrio utilizar uma estratgia para gravar continuamente o som
capturado da guitarra elctrica. A estratgia foi gravar cada frame no final do ficheiro. A
biblioteca libsndfile possui esta funcionalidade, bastando por cada frame que se recebe uma
amostra gravar o ficheiro. Desta forma possvel a escrita no ficheiro em tempo real.
A gravao no ficheiro tambm possibilita um processamento posteriormente ao guitarrista
ter finalizado de tocar, o que permite corrigir possveis erros na deteco. Quando o
guitarrista pra de tocar, torna possvel o processo de deteco de frequncias correr em
modo offline, e se possvel com parmetros que permitam melhorar a preciso da deteco
das notas musicais.

5.5 Integrao entre servidor e interface grfica


A aplicao tem duas componentes principais: o servidor, que faz a captura e transformao
dos sinais em notas musicais; a interface grfica que permite ao utilizador visualizar as
notas que esto a ser tocadas. Cada componente executa-se em processos diferentes, o que
torna necessrio desenvolver uma estratgia para que possa haver interaco entre o
servidor udio e o ambiente grfico. O servidor udio, uma aplicao standlone que
executada pela interface grfica, que vai efectuar todos os processos de captao do sinal
udio e converso em notas musicais. A interface grfica permite ao utilizador iniciar ou
parar o processo de captura do sinal; neste sentido existem duas formas de comunicao
entre a interface grfica e o GSTTransporter que so as seguintes: ficheiro udio e fila de
mensagem. A Figura 55 ilustra o diagrama de integrao entre o servidor e a interface
grfica.

57

Figura 55: Diagrama de integrao entre o GSTTransporter e a Interface grfica.

O servidor udio iniciado por meio de passagem de parmetros ao programa executvel.


Quando o servidor udio inicia a execuo, todo o sinal udio gravado num ficheiro no
formato especificado pelo utilizador por meio de parmetro. Os comandos que permitem
iniciar a captura so enviados por meio de fila de mensagem. As notas detectadas so
armazenadas numa fila de mensagens partilhada entre o servidor udio e a interface grfica.
Resumindo, a soluo para integrar o servidor e a interface grfica passa pela utilizao de
mtodos de comunicao entre processos. Para implementao destes mtodos utilizada a
biblioteca Boost Interprocess [51]. Esta biblioteca implementa vrios mtodos de
comunicao entre processos.
Para alm disso, necessrio integrar o cdigo do Transporter desenvolvido em C/C++
com o da interface desenvolvido em C#. Para este efeito foi necessrio desenvolver uma
camada de integrao entre C/C++ e o C#.
A necessidade de integrao de cdigo C++ tinha que ser resolvida de forma que se tivesse
o menor nmero de pontos de integrao possvel, mantendo a simplicidade da sua
implementao. O problema de integrao levantou-se quanto foi necessrio aceder
memria partilhada e fila de mensagem criada usando a biblioteca Boost interprocess,
porque no h mecanismos para aceder a esta memria directamente da plataforma .NET.
A comunicao entre processos na plataforma .NET pode ser feita utilizando Named Pipes,
Remoting, ou mesmo MicroSoft Message Queue (MSMQ). Mas para o cdigo C++ aceder a
estes mecanismos de comunicao entre processos envolveria uma maior complexidade e
custo de desenvolvimento. A opo recaiu em desenvolver uma biblioteca dinmica em C
que iria ser chamada pelo cdigo C#.
Dado que a comunicao entre o Transporter e a interface grfica feita atravs de fila de
mensagem. O nmero de funes a serem exportadas para C# no so muitas, e o ponto de
integrao nico. Neste sentido, de forma resumida necessrio criar uma forma de o
cdigo desenvolvido em C# possa aceder fila de mensagem desenvolvida em C++. Para
tal ser possvel, foi criada uma biblioteca dinmica em C/C++, que implementa o acesso a
fila de mensagem desenvolvida em C++ com a biblioteca Boost interprocess, para ler e
escrever na fila de mensagem. Recorre-se plataforma .NET, utilizando a InteropServices
do namespace System.Runtime.InteropServices [59]. O InteropServices permite carregar
bibliotecas desenvolvidos em cdigo nativo. O atributo DllImport [60] permite carregar uma
biblioteca dinmica implementada noutra linguagem e criar um entry point para o mtodo
implementado na DLL.
58

Como a aplicao est implementada para suportar vrios sistemas operativos, a biblioteca
dinmica tem uma extenso diferente para cada sistema operativo. No caso do Linux as
bibliotecas possuem extenso .so e na plataforma Windows .dll. Por este motivo na
biblioteca criada para integrao no ter uma extenso nem .so ou .dll. Desta forma no
ser necessrio criar um nome separado para cada plataforma. A diferena no formato
binrio gerado em cada sistema operativo implica que a biblioteca dinmica ter que ser
compilada separadamente em cada sistema operativo.
A biblioteca criada chama-se Transporter e implementa mtodos que permitem interaco
entre o GSTTransporter e a interface grfica. Os mtodos com implementao em C++ tm
que ser expostos como sendo extern C porque assim podem ser chamados como funes
C, o que facilita a importao. Quando o mtodo compilado como cdigo C++, o nome
alterado e a estrutura da chamada o mtodo pode tambm ser alterada dependendo do
compilador. Depois da biblioteca criada em C/C++, uma classe em C# foi criada que
importar todos os mtodos para .NET, permitindo assim o cdigo C# chamar cdigo nativo
C/C++.
No entanto, testes desta soluo revelaram que muito embora a biblioteca dinmica
estivesse a exportar as funcionalidades do cdigo C++ como cdigo C, as chamadas nos
mtodos internos da biblioteca Boost message_queue fazem chamada a estruturas
complexas em C++, o que no permitia que esta soluo fosse utilizada,e por este motivo
foi necessrio implementar outra soluo.
A soluo utilizada passou pela criao de um programa em C++ que responsvel por ler e
escrever na fila de mensagens. Este programa um executvel que recebe como parmetros
o nmero da mensagem a ser enviada e faz a escrita deste valor na fila de mensagem de
comandos. Quando esta aplicao executada sem parmetro, faz a leitura da fila de
mensagem que contm as frames e escreve no standard output no formato XML. Desta
forma a aplicao que executa tem que redireccionar a sada do standard output para ler e
receber a frame no formato XML. possvel observar a estrutura UML de uma frame na
seco 5.1.3 deste Captulo, Figura 48. O objecto do tipo Frame, escrito como um objecto
em XML no standard output mediante a implementao do operador de escrita<<. Desta
forma o programa responsvel pela leitura da frame na fila de mensagem e posterior escrita
no standard output escreve o objecto como uma estrutura XML.

5.5.1 Integrao com ficheiro udio


O ficheiro udio criado e escrito pelo GSTTransporter enquanto faz a captao do sinal
vindo da guitarra elctrica, permitindo enquanto isso a interface grfica fazer a leitura do
ficheiro para apresentao na aplicao. O ficheiro bloqueado para escrita no permitindo
que outro processo possa escrever no ficheiro enquanto o GSTTransporter executa a escrita.
Para implementar o lock no ficheiro utilizada o Boost File Lock [61]. O lock importante
tambm para no permitir que qualquer outro processo por exemplo tente apagar o ficheiro
enquanto este est a ser escrito.
Dado que a aplicao guarda um ficheiro contendo todo o sinal tocado pelo guitarrista,
possvel, por exemplo, fazer uma deteco mais afinada das notas tocadas pelo guitarrista
no modo offline. Este processamento pode ser mais demorado e utilizar parmetros na
59

deteco de frequncia mais precisa. Assim, o resultado deste ltimo processamento pode
ser comparado com o do processamento anterior, permitindo uma comparao e correco
por parte do utilizador.

5.5.2 Integrao com fila de mensagem


A fila de mensagem utilizada para passagem de comandos entre a interface grfica e o
Transporter e tambm para o envio de frames contendo informao das frequncias
detectadas. A fila de mensagem implementada usando Boost message_queue [38]. A
classe message_queue possui 3 mtodos para envio e 3 mtodos para recepo de
mensagens, send, try_send, timed_send, receive, try_receive e timed_receive. Para o
desenvolvimento da soluo so utilizados os mtodos send e receive, os quais ficam
bloqueados se a fila de mensagem estiver cheia ou vazia, respectivamente. Os mtodos que
iniciam com try_ e timed_, so mtodos que no bloqueiam quando a fila est cheia ou
vazia no send e receive.
Para a aplicao necessrio que os mtodos fiquem bloqueados enquanto no existem
mensagens na fila no caso da thread que faz a recepo dos comandos, e no caso de envio
de frames o mtodo utilizado ser no bloqueante. No Transporter existe uma thread para
recepo dos comandos vindos da interface grfica que mediante o cdigo recebido executa
determinadas aces.
Tal como referido no incio deste Captulo, a interface grfica que faz o envio de
comandos ao GSTTransporter, e este ltimo responsvel pela execuo deste comando.
No incio deste Captulo foi apresentada integrao entre a interface grfica, que est
desenvolvida em C# com a fila de mensagens desenvolvida em C/C++. As mensagens
enviadas pela interface grfica so valores do tipo inteiro que so processadas na aplicao.
O problema relativo ao acesso s filas de mensagem foi resolvido usando um processo que
faz a execuo de outro processo, onde o ltimo, desenvolvido em C++, responsvel por
ler e escrever na fila de mensagem. Para a interface grfica enviar mensagens e receber as
notas foi desenvolvido o projecto xcomm, que consiste numa aplicao que quando
executado com parmetros, escreve este valor na fila de mensagem correspondente aos
comandos. Quando executado sem parmetros o xcomm l o contedo da fila de mensagem
que contm as frames do Transporter e escreve no standard output, em formato XML.
No entanto, esta soluo no satisfatria a nvel de implementao, requerendo a anlise
de outra soluo. Uma investigao na biblioteca Boost message_queue, mostra que a fila
de mensagem implementada utilizando mapeamento de memria em ficheiro. Num
trabalho futuro o objectivo ser desenvolver uma estrutura em C# com as mesmas
caractersticas da Boost message_queue e assim permitir acesso directo entre a fila de
mensagem Boost e o Mono/.NET. A implementao em Mono/NET pode ser realizada com
a classe MemoryMappedFile [62]. Esta classe permite mapear o contedo de um ficheiro no
espao de endereos de uma aplicao, realizando a escrita e leitura de dados no ficheiro.

60

5.6 Interface grfica


Nesta seco analisa-se o desenvolvimento da interface grfica. A interface grfica a
forma do guitarrista interagir com a aplicao, e foi desenvolvida utilizando Mono, C# e
GTK-Sharp [63]. O objectivo da interface grfica permitir a visualizao das notas
detectadas em forma de tablatura, ter uma percepo visual do estado da aplicao e
interagir com o Transporter. Alguns componentes grficos, tais como a pista udio e
tablatura, tiveram que ser criados para permitir apresentar informao mais no mbito de
uma aplicao multimdia.
Pretendia-se que a tablatura inicial fosse em modo texto, mas existia maior complexidade na
apresentao em formato texto do que num formato grfico. Foram pesquisadas bibliotecas
que permitissem em tempo real a representao de notas musicais, tanto em forma de
tablatura como de partitura, na aplicao grfica. Como resultado da pesquisa foram
encontradas duas solues Open Source para criao de notao musical com base num
ficheiro texto, que contm instrues cuja compilao resulta numa partitura. Algumas das
solues encontradas foram LilyPond [64], MusicXML [65], ABC Notation [66] e VexFlow
[67]. Estas API baseiam-se na criao de partituras usando um ficheiro de texto escrito com
uma gramtica especfica e depois so compilados para sua apresentao. No projecto
pretende-se que as notas sejam mostradas logo que sejam desenhadas mas com formato
mais simples, visto que seria necessrio um ciclo de aprendizagem para adaptar a estruturas
das vrias API apresentadas.
A soluo para a tablatura foi de criar um componente grfico que desenha a tablatura
conforme recebe as notas. Os componentes pertencentes interface grfica so apresentados
e descritos na Tabela 16.
Classes
Main
Metronome

Descrio
Classe principal que inicia a aplicao
Janela que apresenta o metrnomo

GSTMainWindow Janela principal

Ficheiro
Main.cs
Metronome.cs
GSTMainWindow.cs

GuitarTuner

Janela que apresenta o afinador de guitarra

GuitarTuner.cs

SplashScreen

Janela inicial da aplicao enquanto carrega

SplashScreen.cs

SessionDocument

Widget que representa um sesso composta


por editor de tablatura e pista de udio

SessionDocument.cs

DlgSessionName

Caixa de dialogo para introduo do nome e


parmetros da sesso

DlgSessionName.cs

LibSndFile
TabScoreEditor
TimeLineBar
TabPageHeader
Transporter
TransporterControl

Classe para leitura e escrita de ficheiros udio


Widget para desenho da tablatura
Widget para desenho da barra de tempo
Widget para header da tabulao de sesses
Classe que implementa funcionalidade de
comunicao com o Transporter
Widget para controlar o Transporter, iniciar e
parar a captao

61

LibSndFile.cs
TabScoreEditor.cs
TimeLineBar.cs
TabPageHeader.cs
Transporter.cs
TransporterControl.cs

Classes

Descrio

Ficheiro

Fretboard

Widget que representa o brao de uma guitarra

Fretboard.cs

AudioTrack
AudioFormat.cs

Widget que implementa uma janela para


mostrar em formato WAVE o sinal udio

AudioTrack.cs

Definio do formato udio

AudioFormat.cs

DataChunk

Classe que representa os bytes do ficheiro


udio

DataChunk.cs

FMTChunk

Classe da especificao do ficheiro tipo


WAVE

FMTChunk.cs

RiffChunk

Classe da especificao do ficheiro tipo


WAVE

RiffChunk.cs

WaveFile

Classe que representa um ficheiro WAVE

WaveFile.cs

WaveFileReader

Classe para leitura de um ficheiro WAVE

WaveFileReader.cs

WaveFileWriter

Classes para escrita de ficheiro WAVE

WaveFileReader.cs

TabScore

Representa a estrutura de uma tablatura

TabScore.cs

Frame

Classe que representa uma frame do


Transporter

Transporter.cs

SessionDocument

Widget que representa um sesso composta


por editor de tablatura e pista de udio

SessionDocument.cs

DlgSessionName

Caixa de dialogo para introduo do nome e


parmetros da sesso

DlgSessionName.cs

StaffNote

Classe que representa uma conjunto de notas


da tablatura

StaffNote.cs

Freq2NoteUtil

Classe esttica para converso de frequncias


em notas musicais

Freq2NoteUtil.cs

AudioLevelMeter

Widget para desenhar o nvel do sinal udio

AudioLevelMeter.cs

AudioKnob

Widget para botes de controlo de volume

AudioKnob.cs

AudioSlider

Widget para desenho de slider para controlo


de volume

AudioSlider

Tabela 16: Classes pertencentes interface grfica


Para uma viso global da aplicao, a Figura 56 apresenta a estrutura da aplicao
organizada em blocos, onde se observa a interaco que cada camada tem e as
funcionalidades que esto inerentes a cada uma.

62

Interface grfica

Pista udio

Transporter
Controlos

Metrnomo

Afinador

Trablatura

Envia parmetros e
comandos
Transporter
Enviar comando

Ler frames

Temporizador

Notificao
de eventos

Executa
xcomm
L o
ficheiro

Escreve comandos

Fila
de mensagem

Comandos

L frames

Frame

L comandos

Escreve
frames
Transporter

Ficheiro
udio

Escreve o ficheiro
Gravao udio

Estimao de
Frequncia
Durao da nota

Figura 56: Diagrama geral da aplicao

O diagrama na Figura 56 pretende clarificar principalmente o modo como a interface grfica


est organizada e como a interaco entre os vrios componentes grficos. Em seces
anteriores foi descrito o desenvolvimento do Transporter, agora necessrio apresentar o
funcionamento da interface grfica. Dentro do bloco interface grfica os blocos verdes
representam classes que recebem notificao de eventos da classe Transporter.
Observamos ainda que o componente Pista de udio no tem ligao ao Transporter. A
pista udio faz uso do evento de actualizao de um ficheiro para poder ler o ficheiro e
desenhar a forma de onda do sinal udio.

5.6.1 Classe Transporter


O Transporter uma classe com mtodos estticos que implementa na interface grfica as
interaces com o Transporter. Todas as frames recebidas pelos componentes grficos so
lidos pela classe Transporter que notificar por meio de evento as classes inscritas na
recepo de frames. Esta classe possui um temporizador de intervalo configurvel em
63

milissegundo que define o perodo de tempo que deve ler uma frame da fila de mensagem.
O temporizador accionado quando seleccionado o mtodo Start, e no intervalo definido
retira uma frame no formato XML da fila de mensagens serializa-a, transformando-a num
objecto do tipo Frame. Em seguida notifica este evento a todas classes inscritas no evento
passando como parmetro o objecto Frame criado. A Figura 57 apresenta o diagrama UML
da classe Transporter.

Figura 57: Diagrama UML da classe GST.Transporter

Esta classe possui um membro do tipo ProcessStartInfo [68]. Este membro permite passar a
informao relativa a um processo para ser executado. Este membro preenchido com
informao do executvel do xcomm, uma das propriedades do ProcessStartInfo o
redireccionamento do standard output de um processo. Para o nosso caso necessrio o
redireccionamento do standard output porque precisamos receber a frame no formato XML
da aplicao xcomm. Desta forma quando a aplicao xcomm escrever no standard output
possvel receber os dados escritos.
O intervalo de tempo para actualizao definido medida do modo que o guitarrista
estiver a funcionar, modo afinador ou de transcrio musical. No caso de estar a utilizar o
modo afinador o intervalo de actualizao dos botes LED da interface grfica (Figura 61)
feita com base na percepo visual que o humano tem de uma imagem em tempo real. Neste
sentido realiza-se uma actualizao num intervalo de 20 a 30 milissegundos. No caso que se
est a proceder captura das amostras o intervalo de tempo ser baseado nos parmetros do
metrnomo, usando as equaes (39), (40), (41) e (40) apresentadas no Captulo 3 seco
3.6 para o clculo do intervalo.

5.6.2 Classe libSndFile


O libSndFile uma classe com mtodos estticos que implementa mtodos para escrita de
leitura de ficheiros udio. Dado no existir uma biblioteca que permita a leitura e escrita de
ficheiros udio em .NET, que no dependa directamente do sistema operativo, a opo
passou por utilizar os servios de interoperabilidade do .NET e exportar as funcionalidades
64

existentes na biblioteca dinmica libSndFile. A Figura 58 apresenta o diagrama UML da


classe libSndFile.

Figura 58: Diagrama UML do namespace LibSndFile com classes e enumerados

Podemos observar na Figura 58 que, nem todos os mtodos existentes na biblioteca


dinmica libSndFile foram implementados, apenas os necessrios para permitir a leitura de
ficheiro. Esta classe ser utilizada para fazer a leitura do ficheiro udio pelo componente
que desenha a pista udio.
Para importao do cdigo em C para C# foi utilizado o atributo DllImport [69],
especificando o nome do EntryPoint na biblioteca dinmica libSndFile. Para a estrutura
SndFileInfo usou-se o atributo StructLayout [70] definido como sequencial para permitir o
mapeamento desta estrutura com a estrutura existente na biblioteca dinmica.
No mtodo Open, necessrio retornar um apontador que corresponde ao apontador para o
ficheiro no cdigo unmanager este apontador corresponde ao tipo IntPtr [71] no cdigo C#.
Este mtodo tambm recebe um parmetro do tipo string que representa o nome do ficheiro
a ser aberto, para ser reconhecido na biblioteca dinmica, visto que essa espera um
apontador de caracteres, necessrio usar MarshalAs [72], com UnmanageType.LPStr [72],
que converte a string em cdigo managed para um apontador de caracteres em cdigo
unmanaged.

5.6.3 Janelas da aplicao


O ecr principal da aplicao, apresentado na Figura 59, permite interaco do guitarrista
com a aplicao e a visualizao das notas tocadas pelo guitarrista.
65

Figura 59: Guitar Solo Tracker janela principal

A interface grfica tem uma barra de ferramentas (1 na Figura 59) onde disponibiliza botes
para abrir uma nova sesso, metrnomo e o afinador de guitarra (2 na Figura 59), onde sero
apresentadas as notas detectadas pela aplicao. Em 3 a rea de apresentao do sinal
udio em forma de onda. A apresentao deste sinal feita com base no ficheiro que
gravado enquanto o guitarrista toca a guitarra. A rea 4 contm os controlos do Transporter
que permitem iniciar e parar todo o processo de captao do sinal. Na rea 5 apresenta-se o
brao da guitarra, que permite a alterao e edio das notas que estiverem erradas na
deteco. A edio das notas s poder ser feita quando a aplicao no estiver em modo de
captura.
Quando o guitarrista inicia a aplicao, criada uma sesso. Uma sesso no Guitar Solo
Tracker representa o conjunto de notas detectadas de udio gravado, que na Figura 59 esto
indicados como 2 e 3 respectivamente. Neste sentido, o guitarrista pode criar vrias sesses
e por cada uma tocar a msica e detectar as notas.
Quando seleccionado o menu do metrnomo na barra de ferramentas, esta abre a janela do
metrnomo. Esta janela permite definir os valores de BPM, o nmero de batidas, ligar e
desligar o metrnomo. A Figura 60 mostra o metrnomo da aplicao.
66

Figura 60: Janela do Metrnomo

Quando o guitarrista escolhe o valor do tempo, o tipo de batida e liga o metrnomo fazendo
click no boto Metronome On, este permite visualizar os batimentos do metrnomo. Os
parmetros escolhidos no metrnomo so enviados para o Transporter antes de iniciar a
captura. Estes parmetros so importantes para a estimao da durao da nota O tempo
determina a velocidade e a batida a acentuao da nota quando o metrnomo est em
execuo. A quantizao vai determinar o nmero de notas assumida em cada batimento de
metrnomo. Os dados do metrnomo s podem ser alterados quando o Transporter no
estiver em execuo.
O menu Guitar Tuner quando seleccionado abre a janela do afinador de guitarra. A Figura
61 apresenta a janela do afinador de guitarra.

Figura 61: Janela do afinador de guitarra

O guitarrista quando pretende afinar a guitarra, basta comear a tocar as cordas e


automaticamente os botes LED vo marcando se a frequncia est prxima da frequncia
base da afinao. Quando a nota est afinada na frequncia certa, o LED de cor verde fica
aceso, caso contrrio os LED vermelhos ficam acesos. Os LED vermelhos esquerda e
direita do LED verde mostram que a nota est abaixo ou acima da afinao correcta. O
afinador tambm apresenta as frequncias que esto a ser detectadas da guitarra, a nota
correspondente e a percentagem de desvio em relao afinao (Percent na Figura 61).
A janela do Transporter permite controlar o incio e o fim de todo o processo de captao e
deteco das notas. A Figura 62 mostra a janela do Transporter.
67

Figura 62: Janela Transporter para iniciar e para o processo de deteco das notas

O guitarrista prime o boto de play para iniciar a captao e comea a tocar a guitarra, e o
boto stop para parar.

5.7 Testes unitrios


Nesta seco trata-se a avaliao experimental da aplicao e os resultados obtidos
comparativamente com os resultados esperados. Como resultado final pretende-se que um
guitarrista possa tocar solos at pelo menos 180 BPM e todas as notas sejam identificadas
com o mnimo de erro mdio. A aplicao desenvolvida dever produzir como resultado
final o toque do guitarrista num ficheiro de imagem em formato de tablatura que representa
as notas produzidas na guitarra elctrica. O formato tablatura no possui informao de
durao das notas, somente apresenta por cada linha o nmero do trasto que foi pressionado
no brao da guitarra elctrica.
A aplicao foi testada medida que se desenvolveu cada componente com testes unitrios.
Para efectuar a avaliao desenvolveram-se pequenos testes unitrios apresentados de
seguida, por cada camada, classe ou componente do projecto.
Os testes foram efectuados no Linux Fedora 14 64 bits, utilizando para captar o sinal udio
um microfone, ligado placa de som do computador. O computador possui uma nica placa
de som. A Tabela 17 apresenta as condies em que so executadas os testes.
Parmetros de teste

Valor

Frequncia de amostragem

44100 Hz

Tamanho do bufer do Servidor


udio

1024

N de Buffers

Nmero de pontos FFT

1024

Janela

Hamming

Tabela 17: Condies dos testes executados

5.7.1 Testes unitrios do servidor udio


A Tabela 18 lista os testes executados para a camada de captao do sinal udio. Para
execuo dos testes est criado um projecto que serve de testes dos componentes. O
projecto AudioServeTestUnit, utilizado para criar uma aplicao de demonstrao onde
so testados os vrios componentes da aplicao.

68

Classes

CAudioServer

Testes
1.
2.
3.
4.
5.

Deteco das placas de som existentes no computador.


Deteco dos drivers suportados no sistema operativo.
Funcionamento da classe Buffer com suporte de mais do que um
buffer.
Captao do sinal vindo da placa de som usando um microfone.
Escrita do sinal numa instncia de AudioPort adicionada ao
servidor como uma porta udio.

Tabela 18: Lista de testes unitrios executados no AudioServer


Os testes foram executados utilizando JACK [73] como servidor udio em tempo real. Com
o JACK em execuo qualquer aplicao que se ligar a este servidor, ter disponvel os
dispositivos udio escolhidos no JACK. O JACK, por meio de sua interface grfica, permite
definir determinados parmetros como a frequncia de amostragem, o tamanho do buffer, o
driver da placa de som e a placa de som que se pretende utilizar. Estes parmetros sero
partilhados com todas as aplicaes que se ligarem ao JACK.
O ALSA [74] o driver principal utilizado em plataformas Linux, utilizado para comunicar
com a placa de som. O driver ALSA est disponvel em qualquer distribuio Linux. A
restrio do ALSA em suportar somente uma aplicao com acesso a placa de som, no
possibilitou testes com este driver directamente, mas dado que o JACK utiliza o ALSA no
haver influncia no resultado em ser um driver ou outro.
A Figura 64 mostra os dispositivos udio disponibilizados pelo JACK para escrita e leitura
na execuo dos testes.

Figura 63: Interface grfica do Jack Audio Connection Kit

A Figura 64 mostra os resultados para os testes efectuados ao AudioServer de 1 a 4,


apresentados na Tabela 17. possvel verificar na Figura 65 que a aplicao lista os drivers
udio suportados no sistema operativo e que aps escolha do JACK como driver, a lista de
dispositivos de som mostra um nico dispositivo que system, que est de acordo com o
que a interface do JACK apresentada na Figura 64.
Para efectuar o teste 5 da Tabela 17, que corresponde a verificar se adicionando uma porta
udio o servidor udio escrevia correctamente, na aplicao de testes foi adicionada uma
classe CDemo que deriva de CAudioPort e esta foi adicionada como sendo uma porta de
69

captura ao servidor udio. Na classe CDemo sempre que esta recebe uma amostra, exibe o
mximo valor existente no buffer na consola.

Figura 64: Resultado da execuo do teste

Embora o JACK tenha um valor especfico para o tamanho do buffer de captao, as portas
que se ligam ao servidor udio do GSTTransporter podem definir um tamanho diferente do
servidor. Alguns resultados anormais foram obtidos quando o tamanho do buffer e da porta
udio menor que o tamanho do buffer existente no servidor JACK. Foi observado que no
resultado do pico mximo se obtinham valores sem significado.
A Figura 65 apresenta o resultado obtido na aplicao de teste na consola, que mostra as
variaes do pico mximo quando h captao de sinal.

Figura 65: Picos mximos do sinal captado do microfone

A lista de classes da camada de gravao do ficheiro apresentada na Tabela 19.


Camadas/Classes
CFileIO

Testes
Gravao do sinal captado pelo servidor udio
Leitura de um ficheiro udio

Tabela 19: Lista de testes unitrios executados com CFileIO


70

Para efectuar o teste de gravao foi adicionada uma instncia do tipo CFileIO ao projecto
de testes tento como resultado esperado um ficheiro udio de formato WAVE contendo
udio gravado pelo microfone na execuo do teste. Como resultado, o teste produziu um
ficheiro demo.wav, cujo contedo tem todo o som captado no momento do teste. O teste 2
foi efectuado fazendo a leitura do ficheiro udio gravado.
A Tabela 20 lista os testes efectuados para a classe de processamento de sinal.
Camadas/Classes
CSignalProcessing

Testes
1.
2.
3.
4.

Clculo de energia e pico mximo do sinal


Clculo da durao do sinal
Estimao de frequncia usando a FFTW
Filtro passa-baixo e decimao

Tabela 20: Lista de testes unitrios executados com CSignalProcessing


Para calcular a durao da nota foi testado utilizando ficheiros com notas musicais de
durao especfica e observada a contabilizao da durao da frequncia da nota. Quando
calculada uma frequncia um contador vai verificar quanto tempo se encontra a mesma
frequncia e com base neste valor podemos estimar a durao da nota. O valor da frequncia
sempre guardado como sendo a ltima frequncia estimada sempre a frequncia ltima
frequncia diferente da actual. Quando as frequncias so iguais incrementado o tempo
de durao da mesma. O problema no clculo era que a deteco da frequncia presente
para amostras do sinal da guitarra varia o valor da frequncia estimada, o que leva a
contagem da durao para valores diferentes dos esperados.
Para resolver este problema, foi utilizado os valores do erro mximo e mnimo obtidos da
execuo do benchmark. Assim, a comparao entre a ltima frequncia e a frequncias
actual feita tendo em considerao os valor mximo e mnimo de erro. Esta soluo
permitiu contabilizar a durao da frequncia presente, mesmo com as pequenas oscilaes
no valor da frequncia. O clculo da durao no tem que ser preciso, bastando a
aproximao a um valor que corresponda a configurao de batimento e quantizao da
msica. O calculo para a durao do silncio feito usando o mesmo procedimento,
considerando a frequncia de 0 como sendo o silncio. O silncio considerado quando a
energia do sinal chega at um valor de limiar determinado, como por exemplo -20 dB.
Testes efectuados com amostras do sinais constitudos por dois sinais espaados por 1
segundo de silncio permitiu verificar se calculada correctamente a durao dos silncio, o
resultado foi aproximado a 1 segundo.
Feitos os testes foram identificados 2 problemas: na estimao das frequncias; a existncia
de rudo no sinal de entrada e a frequncia de amostragem demasiado alta que implica
baixar a resoluo na frequncia. Para o rudo necessrio remover estas e outras
frequncias que no constem na largura de banda guitarra elctrica. Para resolver a questo
da frequncia de amostragem elevada foi necessrio aplicar decimao ou sub-amostragem,
com um filtro passa-baixo, que corresponde ao teste 4.
Depois de aplicada a decimao, os resultados da deteco de frequncia melhorou,
permitindo o clculo da FFT com 512 pontos, sendo suficiente para detectar as notas
musicais. Outros resultados sero apresentados no Captulo 6, com vrios parmetros. A
71

execuo do benchmark, suportada na classe CSignalProcessing permitiu chegar a


parmetros ptimos para a deteco de frequncia.

5.7.2 Testes unitrios do Transporter


A Tabela 21 lista os testes efectuados com o GSTTransporter.
Camadas/Classes

CGSTTransporter

Testes
1.
2.
3.
4.
5.
6.
7.
8.

Passagem de parmetros ao executvel GSTTransporter


Criao da fila de mensagem
Execuo da thread de processamento dos comandos
Execuo da thread pool
Escrita das notas na fila de mensagem
Incio simultneo de todas as camadas
Escrita do ficheiro udio
Recepo de comandos da interface grfica

Tabela 21: Lista de testes unitrios executados com GSTTransporter


Para efectuar os testes do Transporter foi criado um projecto para testar a criao e conexo
com a memria partilhada e envio mensagens de teste usando a fila de mensagens. O
Transporter possui uma classe esttica que responsvel por criar um ficheiro log de todo o
processo que est a decorrer no executvel, permitindo desta forma registar os processos
que esto a decorrer dentro da aplicao. Para efectuar o primeiro teste, na entrada da
aplicao feito log dos parmetros que foram passados ao Transporter e verificados se no
log se os mesmos esto correctos e executam as configuraes desejadas.
Para o caso dos testes 2 e 3, a criao da memria partilhada foi executada com sucesso.
Para verificar se a fila de mensagem foi criada, no Linux basta ir para o directrio /dev/shm
e observar se existe um ficheiro com o nome que foi atribudo fila de mensagem. O
Transporter possui uma classe com mtodos estticos para fazer log de todo o processo que
decorre dentro na execuo, a classe CLogger. Esta classe escreve num ficheiro definido, as
ocorrncias do Transporter para efeito de debug. Fazendo uso do CLogger foi possvel
efectuar os testes sobre os comandos enviados ao Transporter, via fila de mensagem,
mediante a escrita no ficheiro da mensagem recebida pelo Transporter.
Com o programa de testes enviou-se mensagens para fila de mensagem de modo a que o
Transporter escrevesse no ficheiro de log os comandos que estavam a ser recebidos. Dado
que a fila de mensagens suporta somente bytes, as mensagens a serem enviadas esto
limitadas a valores inteiros de 0 255.
Depois de criao da fila de mensagem onde sero enviadas todas as notas detectadas, a
aplicao escreveu algumas notas e foi testado se seria possvel ler as notas escritas pelo
Transporter na fila de mensagem. Este teste corresponde ao nmero 5 e foi executado com
sucesso, ou seja, foi possvel depois do Transporter escrever uma nota musical e obter a
mesma nota noutro processo usando a fila de mensagem.
O teste nmero 6 permite verificar se todos os componentes associados ao Transporter
necessitam de ser iniciados simultaneamente. Como resultado pretende-se verificar que a
aplicao est a escrever pelo menos o ficheiro udio, que faz parte do teste 8.
72

5.7.3 Teste unitrio da Interface grfica


A Tabela 22 lista os testes efectuados para a interface grfica.
Camadas/Classes

GuitarSoloTrackerUI

Testes
1.
2.
3.
4.
5.
6.
7.

Execuo do executvel GSTTransporter


Escrita da fila de mensagem
Recepo das notas detectadas no GSTTransporter
Afinador
Metrnomo
Componente AudioTrack, verificar o desenho da onda do sinal
udio criado pelo GSTTransporter no componente
Apresentao da tablatura

Tabela 22: Lista de testes unitrios executados no GuitarSoloTrackerUI


O teste nmero 1 na Tabela 22 baseou-se em executar a aplicao. Para efectuar os 2, 3 e 4
foi necessrio criar uma aplicao para aceder memria partilhada, e dentro da interface
grfica executada. A classe do Transporter a que executa a aplicao comm e esta faz a
escrita e leitura nas filas de mensagem.
O afinador numa primeira fase tinha dificuldades na actualizao das imagens, mas
funciona em pleno dependendo a afinao unicamente da preciso do Transporter. Os testes
efectuados tinham como objectivo verificar se os vrios componentes da interface grfica
eram apresentados correctamente.
O metrnomo independente do Transporter e permite visualizar o batimento, com o
nmero de batidas configurvel.
O componente AudioTrack no possibilitava a leitura de ficheiros usando a biblioteca
libsndFile, o que requereu a pesquisa de outra soluo para leitura de ficheiros WAVE em
C#. Depois de uma pesquisa foi possvel encontrar uma pgina que contm classes em C#
para leitura de ficheiros WAVE baseado na especificao, no programa WAV2GIF [75].
Com esta classe foi possvel a leitura de um ficheiro WAVE e efectuar o desenho da onda,
como apresenta a Figura 66.

Figura 66: Screenshoot do componente AudioTrack com desenho do sinal udio em forma de onda

Na Figura 66 observa-se o desenho em forma de onda de um sinal udio no componente


AudioTrack. Este componente possui uma barra com linha do tempo por cima, para
verificar. A soluo usando da classe libSndFile no lia o contedo do ficheiro udio o que
pode ser um problema relacionado com a biblioteca em si, pois os testes efectuado quer com
Mono quer com o .NET no funcionavam correctamente. No entanto esta soluo no est
descartada dado que esta biblioteca permite a leitura de variados formatos de ficheiros
udio.
Para testar a apresentao de notas na tablatura foi necessrio criar um componente que
desenha o formato de tablatura, porque a representao na forma de texto seria mais
73

complexa. Este componente, 2 na Figura 59 ser actualizada sempre que receber uma nota
musical, como possvel ver na Figura 59, desenha a tablatura correctamente.

74

6 Avaliao Experimental
Neste Captulo apresentam-se os resultados obtidos pela aplicao. Tambm se analisa de
forma grfica a preciso da deteco de frequncias das notas. Os testes foram efectuados
considerando a captao por um microfone com uma guitarra clssica e a captao por
ligao directa da guitarra elctrica ao PC.

6.1 Execuo do benchmark


Para efectuar os testes foi executado um benchmark da deteco de frequncias, onde os
parmetros associados a classe CSignalProcessing so variados com o objectivo de se
encontrar o que tem melhor resultado. A comparao dos resultados feita utilizando
valores calculados do erro mdio. O erro mdio calculado somando todos os erros
associados deteco das notas. Para este efeito so produzidas frequncias que
representam todas as notas da guitarra elctrica que se pretende detectar em forma de ondas
sinusoidais e em seguida executa-se a deteco de cada uma das notas. O resultado da
deteco comparado com a frequncia original e desta forma calculado o erro de
deteco. Estes testes tambm permitem ver qual o erro mnimo e mximo que se obtm
na deteco.
Foram executados benchmark para encontrar duas configuraes diferentes: uma para
deteco normal de todas as notas musicais e outra para deteco das 6 frequncias
correspondentes a 6 cordas da guitarra para o modo de afinao. A diferena est que no
caso da afinao s pretendemos ter uma melhor preciso nas frequncias correspondentes
afinao das notas, deixando as outras todas indiferentes. A Tabela 23 apresenta as
frequncias para afinao da guitarra, considerando uma afinao standard.
Notas

Frequncias (Hz)

82,40

110

148

196

247

329,63

Tabela 23: Frequncias de cada corda na afinao standard


Baseado na Tabela 23 verifica-se a proximidade dos valores de deteco no benchmark
somente para as 6 frequncias. Para testes com todas as frequncias os valores so baseados
nas frequncias da Tabela 1. Os benchmark efectuados, foram executados variando os
valores do factor de decimao e consequentemente a frequncia de corte. O factor de
decimao para o caso da avaliao de todas as notas da guitarra elctrica chega a um valor
mximo que respeite a frequncia de Nyquist, caso contrrio obtemos aliasing na deteco.
A Tabela 24 apresenta os parmetros utilizados para a execuo do benchmark para
deteco de todas as frequncias, e as Figuras 67, 68 e 69 apresentam o grfico de erro de
estimao.
Sample
Rate Hz

Buffer
Size

FFT
Factor de
N Pontos decimao

Down
Sampling

Erro
Mnimo Hz

Erro
Mximo
Hz

Erro
Mdio Hz

44100

1024

512

15

2940

-3,98

3,68

0,507

44100

1024

512

20

2205

-3.21

430,76

18,14

44100

1024

512

20

2205

-3.21

4,83

0,43

Tabela 24: Parmetros e resultados de teste


75

Figura 67: Erro de deteco de frequncias (em Hz) com factor de decimao de 15, para as 49
notas

Na Figura 67 a linha vermelha representa o erro mdio obtido no teste.


76

Figura 68: Erro de deteco de frequncias com factor de decimao de 20, com as 49 notas

Observa-se na Figura 68 um erro mximo elevado de 430,76, resultado de aliasing porque a


frequncia de sub-amostragem no respeitar o critrio de Nyquist na frequncia mxima.
77

Figura 69: Erro de deteco de frequncias com factor de decimao de 20, com as 45 notas descartando as notas com aliasing

Na Figura 69 temos o grfico da Figura 68 aps retirar os valores de erro muito elevado.
Alguns destes erros so consequncia do aliasing do sinal quando passa no filtro passabaixo. Desta forma possvel analisar e comparar melhor os valores de erro. Com o grfico
78

da Figura 69 podemos concluir que a partir de um factor de decimao de 20 o erro de


deteco para todas as notas elevado. No entanto, estes parmetros podem ser teis para a
utilizao na afinao da guitarra, dado que para afinar somente necessrio detectar as 6
frequncias apresentadas na Tabela 23. Neste sentido, dado que no caso da afinao a
frequncia mxima a estimar de 329,63 Hz, significa que possvel ento aumentar o
factor de decimao de modo a obter para as 6 frequncias um valor de erro o mais baixo
possvel. A Tabela 25 resume os testes efectuados para encontrar o melhor factor de
decimao.
Factor\Frequncias
(Hz)

82,40

110

147

196

247

329,63

Erro
mdio

15

2,07

0,96

3,34

0,83

0,08

2,31

1,59

16

1,72

2,4

1,56

2,28

0,61

1,31

1,64

20

0,64

2,39

0,47

2,26

1,52

2,36

1,60

25

3,22

3,26

2,19

3,12

2,38

2,36

2,75

30

2,07

3,83

3,34

3,70

0,08

2,36

2,56

Tabela 25: Resumo de resultados dos testes para encontrar o melhor factor de decimao para as 6 frequncias
Na Tabela 25 o factor de decimao de 15 e 20 so os que apresentam melhor valor de erro
mdio absoluto. Um factor que influencia tambm os resultados da deteco a preciso do
tipo float, devido aos vrios arredondamentos sofridos durante operaes matemticas nas
casas decimais, mas ainda assim se consegue resultados bastante prximos da frequncia
que se pretende estimar. Tambm necessrio ter em conta que os valores de frequncias
produzidos pela vibrao das cordas da guitarra no so exactos. Os valores de erro mximo
e mnimo podem ser utilizados para melhorar a aproximao frequncia original.
Conclumos que para deteco de todas as notas, o factor de decimao de 15 apresenta
melhor valor de erro mximo e mnimo, como demonstra o grfico da Figura 67, e este o
valor utilizado pela aplicao tanto para afinao como para estimao das notas.

6.2 Afinao da guitarra


A afinao da guitarra foi testada de duas formas: captura por meio de um microfone;
captura ligando a guitarra directamente ao computador. Um problema apresentado na
deteco com microfone o rudo ambiente que poderia dificultar deteco das frequncias,
mas o som da guitarra perto do microfone era suficiente para que o rudo ambiente no
afecte em demasia os resultados. Foi necessrio ajustar os valores de limiar do rudo para
-25 dB para cortar o rudo ambiente e assim somente se observar alteraes dos LED do
afinador para os sons com potncia superior do rudo.
Para comparar se a afinao da aplicao corresponde a uma afinao prxima da standard,
afinou-se a guitarra com o afinador Yamaha YT-120, apresentado na Figura 71, e
comparou-se o resultado com o afinador da aplicao.

79

Figura 70: Afinador Yamaha YT-120

A Figura 71 apresenta o afinador da Yamaha YT-120 utilizado para afinar a guitarra antes
de efectuar a comparao com o afinador da aplicao. possvel que diferentes afinadores
tenham preciso diferente; infelizmente no existem dados tcnicos referentes preciso
deste afinador. A Tabela 26 apresenta o resultado de uma guitarra afinada anteriormente
com o afinador YT-120 e a comparao com o resultado obtido pelo afinador da aplicao.
O objectivo verificar de quanto o afinador da aplicao se desvia da afinao standard
numa guitarra j afinada. Os testes foram efectuados para guitarra clssica e elctrica.
Frequncias (Hz)

82,40

110

147

196

247

329,63

Guitarra clssica
Desvio (%)

Guitarra elctrica
Desvio (%)

Tabela 26: Comparao do desvio do afinador da aplicao com uma


guitarra clssica e guitarra elctrica afinadas usando o afinador Yamaha YT-120
Com a guitarra clssica, a maior dificuldade foi na deteco da frequncia 196 Hz
correspondente a nota G/Sol, porque na aplicao se obtinha a frequncia da nota numa
escala acima. Para corrigir foi necessrio alterar no afinador da aplicao para aceitar
tambm o valor 392 Hz. A frequncia 82,40 Hz s vezes oscilava entre 80 a 86 tendo
desvios de 1 a 4%. Para a nota ter melhor deteco era necessrio tocar vrias vezes a corda.
Para o caso da guitarra elctrica, o principal problema foi a amplificao do sinal que tem
grande influncia na deteco da notas. Outro problema identificado na deteco das
frequncias 82,40 e 329,63 prende-se no facto de com a amplificao o resultado da
deteco apresentava frequncias de 247 Hz, que corresponde a nota B (Si). Este problema
deve-se ao facto de quando a corda da guitarra vibra numa nota ela tambm produz outras
frequncias que somadas correspondem a um acorde da nota tocada; neste caso um acorde
da E possui a nota B. Como a pesquisa pela nota baseada nos mximos de potncia do
espectro, o que ocorre que na componente B existe uma maior potncia que a componente
E. Este comportamento est directamente relacionado com o ganho de entrada da guitarra,
quando aumentamos o ganho na entrada o afinador apresenta a nota E em vez de B.
Tambm se observou que a escrita de notas na fila de mensagem e o facto destas quando
esto cheias no permitirem a escrita at que sejam lidas as mensagens, para o caso
especfico do afinador no permite descartar as frames antes pelas frames actuais, o que
torna a actualizao da interface grfica no correspondente com o que foi tocado na
guitarra.
80

Conclui-se que a afinao da aplicao consegue uma boa preciso, mas que sofre grande
influncia do ganho do sinal. As notas foram detectadas tanto com guitarra clssica como
com guitarra elctrica, onde esta ltima apresenta mais dificuldade na deteco quando
ligada ao computador sem amplificao externa. Constatou-se tambm que possvel
detectar as notas de acordes sem que fosse necessrio determinar as notas que compe o
acorde, ou seja, dado que um acorde constitudo por vrias notas, o somatrio destas
determinam a nota base do acorde; desta forma quando tocada um acorde, a nota base que
d o nome ao acorde detectada. Recomenda-se para o caso da guitarra elctrica que a
afinao da mesma seja feita sem efeito, ou seja, com som original da guitarra para que o
resultado seja fivel.

6.3 Deteco e apresentao das notas


Nesta seco analisa-se a deteco e apresentao das notas musicais enquanto a guitarra
tocada em real-time. Para efeito os testes so efectuados com guitarra elctrica e guitarra
clssica. O objectivo obter o desenho da tablatura enquanto a guitarra tocada. A tablatura
pode ser gravada em formato XML e tambm como uma imagem. Para efeito de testes so
utilizados as configuraes apresentadas na Tabela 24.

6.3.1 Testes efectuados com a guitarra clssica


O primeiro teste efectuado com a guitarra clssica, com a captao por meio de um
microfone mostrava nas posies corrente do cursor valores dos trastos mas de forma pouco
perceptvel para que se pudesse realmente estabelecer uma comparao de aproximao ao
que foi tocado na guitarra clssica, como apresenta a Figura 71, notas tocadas com 40 BPM.

Figura 71: Desenho da tablatura como resultado de notas tocadas na guitarra clssica

Podemos observar na Figura 71 que por vrias vezes a notas esto sobrepostas o que retira a
visibilidade do resultado. Este problema decorre pelo facto de a todo momento se est a
determinar 6 frequncias independentemente de na guitarra s ter sido tocada uma nota. O
que ocorre muitas vezes, que restantes frequncias encontradas ficam sobrepostas na
mesma corda e posio, como visvel na Figura 71. A soluo para este problema implica
a necessidade de melhoria na pesquisa de mais do que um mximo no espectro de potncia
da FFT no Transporter e tambm eliminao de rudo.

81

Depois de alterado a aplicao para somente mostrar uma frequncia, o teste foi executado
tocando cada corda da guitarra sem trasto premidos. Os resultados foram inconclusivos
dado que no foi possvel verificar se a nota apresentada correspondia a nota correcta, dado
a quantidade de notas apresentadas na tablatura no estarem sincronizadas com a nota
produzida na guitarra. Tambm no foi possvel encontrar um padro que permiti-se
identificar um comportamento especfico quando uma nota especfica tocada na guitarra.

6.3.2 Testes efectuados com guitarra elctrica


Os testes efectuados com a guitarra elctrica no foram tambm conclusivos pelo mesmos
factores da guitarra clssica. Durante os testes deparou-se com o problema das frequncias
estimadas estarem algumas vezes uma ou das oitavas acima. A vibrao das cordas faz
variar a nota por vrias frequncias o que dificulta a escolha da nota tocada. A amplificao
do sinal da guitarra elctrica tambm importante porque tem grande influncia no
resultado da estimao das frequncias. O ganho pode ser controlado pelo volume do
microfone disponibilizado pelo sistema operativo.
Outro problema encontrado est relacionado com BPM configurado para desenhar a
tablatura. Se o valor de BPM for baixo em relao ao que o guitarrista est a tocar, ocorre a
sobreposio de notas enquanto o cursor da tablatura est na mesma posio. Isso significa
que o guitarrista que o nmero de batimentos configurado tem que ser igual ou maior do que
o guitarrista est a tocar, ou aumentar o valor da quantizao. Este problema tambm est
relacionado com a sincronia entre a escrita de notas na fila de mensagem e a leitura do
Transporter.
Em relao a fila de mensagem de frames, o facto de no se aceder directamente a fila de
mensagem e ter que se usar um processo para fazer a leitura da mesma num perodo
especfico de tempo torna a escrita da notas pouco precisas, porque o momento que feito a
leitura da frame pode no coincidir com o tempo correcto na tablatura. Foi possvel observar
no ficheiro log do Transporter que muitas frames no so enviadas para fila de mensagem
por esta estar cheia, o que implica que a taxa de escrita da fila de mensagem e de leitura no
so proporcionais. Uma possvel soluo para este problema foi aumentar o tamanho da fila
de mensagem do valor inicial de 1000 para 2000 e aumentar tambm o ritmo de leitura da
fila de mensagem por meio do aumento do BPM para 100. No entanto, o aumento do
tamanho da fila de mensagem aumenta tambm a latncia de actualizao da nota na
interface grfica. Resumindo, para o problema de sincronismo ser resolvido necessrio
implementar o acesso directo a fila de mensagem em C#.

82

7 Concluses
Este trabalho tinha como objectivo desenvolver uma aplicao que fosse capaz de captar o
sinal da guitarra elctrica e apresentar ao utilizador as notas tocadas pelo guitarrista. O
objectivo da aplicao ajudar o guitarrista a lembrar as notas tocadas numa msica num
momento de inspirao ou improviso. Sem esta aplicao, o guitarrista teria que gravar e
ouvir vrias vezes o que tocou para registar as notas tocadas.
Dadas as caractersticas da guitarra elctrica, principalmente do sinal produzido pela mesma
a soluo para detectar as notas tocadas pelo guitarrista passou por determinar as
frequncias geradas pelas cordas da guitarra quando tocadas. Para resolver este problema,
foram analisados 3 algoritmos de estimao de frequncia: Goertzel, auto-correlao e a
FFT. Da anlise dos 3 algoritmos estudados, os resultados levaram a escolher a FFT para
estimao de frequncia. Para o desenvolvimento do projecto foi utilizada a biblioteca
FFTW para clculo da FFT.
Todo o processo de deteco de frequncias, foi elaborado tendo em conta as tcnicas
aprendidas durante disciplinas de processamento udio e de programao. Estas tcnicas
incluem double buffering, janela, filtragem, multithreading e comunicao entre processos.
A aplicao foi desenvolvida usando as linguagens, C/C++ e C#; C++ foi utilizada para
programao de troos de cdigo crticos relacionados com o processamento de sinal, e C#
para o desenvolvimento da interface grfica.
Neste desenvolvimento no se tirou partido ainda da arquitectura multicore por meio de
programao paralela de forma explcita, no entanto foram utilizadas tcnicas de
programao concorrente. A aplicao de programao paralela ser estudada num trabalho
futuro para melhorar o desempenho da aplicao em computadores com multi-processador
ou multicore, caso num trabalho futuro se revelar necessrio.
A abordagem da soluo foi baseada numa arquitectura servidor/cliente. O servidor uma
aplicao que se executa num processo independente e o cliente corresponde interface
grfica que tambm se executa num processo independente. A principal vantagem o
desacoplamento entre as duas partes, principalmente pelo facto de estarem desenvolvidas
em linguagens diferentes. Desta forma tambm permite que outra aplicao possa ligar ao
servidor e receber as notas musicais detectadas.
O processo mais crtico foi a preciso na deteco das notas e estimao da sua durao das
notas. O processamento do sinal gerado pela guitarra foi efectuado em modo online, quando
o guitarrista est a tocar. Os testes revelaram que para afinao era possvel estimar as
frequncias correspondentes afinao standard com uma percentagem de erro mximo de
2 e 4 Hz para guitarra clssica e guitarra elctrica respectivamente. No entanto para a
criao da tablatura, o principal problema estava no facto de no se conseguir distinguir a
nota tocada com qualquer padro no resultados apresentados. A existncia de uma diferena
no intervalo de leitura por parte da interface grfica faz com vrias notas seriam perdidas,
levando a necessidade de leitura das notas de uma forma mais directa e mais sncrona com o
processamento de sinal.

83

Existem melhorias a serem implementadas para melhor apresentar a tablatura, que far parte
do trabalho futuro a ser desenvolvido. Numa primeira fase ser resolver a questo da fila de
mensagem de modo a permitir menor perdas notas por parte do escritor por causa da demora
do leitor. Para este efeito ser implementada a fila de mensagem com base na biblioteca
Boost Interprocess::message_queue em C# usando mapeamento de memria em ficheiro.
Ter que ser melhorado o Transporter de modo a que esteja sincronizado com o batimentos
escolhidos pelo guitarrista, enviar frames somente quando o sinal for considerando uma
nota, baseando num valor limiar para determinar se o sinal ou no uma nota. Neste
sentido, sempre que a frame captada no for considerada uma nota no envidada para a
fila de mensagem. Na aplicao no utilizado dados referentes a durao da nota, mas no
trabalho futuro estes dados sero usados para implementao da partitura.
O trabalho futuro ir envolver a deteco de algumas tcnicas que o guitarrista pode
executar durante o improviso, tais como bending, slide, tremolo. Para efectuar a deteco
destas tcnicas necessrio fazer uma anlise do sinal da guitarra, estudar como o sinal
varia para cada uma das tcnicas, e com base neste estudo analisar tcnicas que permitam
detectar variaes do sinal por forma a identificar a tcnica em causa.
O trabalho futuro tambm ir investigar algoritmos ou solues para optimizao das notas
na tablatura, tendo em conta a estrutura das mos e o posicionamento das notas no brao da
guitarra. Este estudo tem como objectivo diminuir o nmero de notas que tm que ser
transladadas para melhor optimizao quando o guitarrista estiver a tocar a guitarra.
Este problema existe porque no brao da guitarra, a partir do 5o trasto de cada corda todas a
notas podem ser encontradas nas cordas seguintes, na orientao das cordas de baixo para
cima, onde a corda mais baixa (E) representa a nota (E) mais grave na guitarra, como
apresenta a Figura 72 [76].

Figura 72: Brao da guitarra com as notas correspondentes a cada corda nos trastos (adaptado de [76])

Observa-se na Figura 72 que a partir do 5 trasto onde tem a nota A todas as notas seguintes
aparecem na corda seguinte. Neste caso a nota A na corda E corresponde a tocar a corda A
aberta, e C na corda E, tocada no 8 trasto corresponde a C tocada na corda A no terceiro
trasto. Significa que as notas de uma corda num dado trasto, correspondem mesma nota
noutro trasto adiante ou atrs. Neste caso se a aplicao detectar a nota C no 8 trasto da
corda E pode tambm escrever como C no 3 trasto da corda A. Neste caso se for detectada
a nota C da corda E no oitavo trasto, e a nota seguinte for a nota A no 2 trasto da corda G,
mais prtico para o guitarrista tocar C no 3 trasto da corda A, por causa da distncia entre
os trastos.

84

8 Anexo A - Tabelas com resultados de deteco de frequncia


Frequncia Original

Frequncia estimada

ndices

Erro

82,46

81,83

14

2,07

87,36

86,13

15

1,23

92,56

90,44

16

0,68

98,06

99,05

17

0,44

103,89

99,05

18

0,53

110,06

107,67

19

0,96

116,6

116,28

21

-3,98

123,53

124,89

22

-2,79

130,88

129,2

23

-1,19

138,66

137,81

24

0,84

146,9

146,43

25

3,34

155,63

155,04

27

0,59

164,88

163,65

29

-1,64

174,68

172,27

30

2,41

185,06

185,19

32

1,31

196,06

193,8

34

0,83

207,71

206,72

36

1,00

220,06

219,64

38

1,86

233,14

232,56

40

3,45

247

245,48

43

0,08

261,68

262,71

46

-2,46

277,23

275,63

48

1,61

293,71

292,85

51

0,86

311,17

314,38

54

1,09

329,67

327,3

57

2,36

349,26

348,84

61

-1,01

370,02

370,37

64

2,52

392,01

391,9

68

1,54

415,31

413,44

72

1,88

440

439,28

77

-2,15

466,15

465,12

81

1,04

493,86

495,26

86

0,03

523,21

525,41

91

0,68

554,31

551,25

96

3,06

587,26

590,01

102

1,56

622,17

624,46

108

2,01

659,15

658,92

115

-1,20

Tabela 27: Resultado de deteco de frequncias com factor de decimao de 15. As frequncias em
amarelo correspondem s de afinao standard

85

Frequncia Original
82,46
87,36
92,56
98,06
103,89
110,06
116,6
123,53
130,88
138,66
146,9
155,63
164,88
174,68
185,06
196,06
207,71
220,06
233,14
247
261,68
277,23
293,71
311,17
329,67
349,26
370,02
392,01
415,31
440
466,15
493,86
523,21
554,31
587,26
622,17
659,15
698,33
739,84
783,81
830,4
879,76
932,05
987,45
1046,14
1108,32
1174,2
1243,99
1317,93

Frequncia estimada
81,83
86,13
90,44
99,05
99,05
107,67
116,28
124,89
129,2
137,81
146,43
155,04
163,65
172,27
185,19
193,8
206,72
219,64
232,56
245,48
262,71
275,63
292,85
314,38
327,3
348,84
370,37
391,9
413,44
439,28
465,12
495,26
525,41
551,25
590,01
624,46
658,92
697,68
740,74
783,81
831,18
878,55
934,54
986,22
1046,51
1098,19
1029,29
960,38
887,17

ndices
19
20
21
23
23
25
27
29
30
32
34
36
38
40
43
45
48
51
54
57
61
64
68
73
76
81
86
91
96
102
108
115
122
128
137
145
153
162
172
182
193
204
217
229
243
255
239
223
206

Erro
0,64
1,23
2,12
-0,99
4,83
2,39
0,32
-1,36
1,68
0,84
0,47
0,59
1,23
2,41
-0,12
2,26
1
0,42
0,58
1,52
-1,03
1,61
0,86
-3,21
2,36
0,42
-0,35
0,11
1,88
0,72
1,04
-1,4
-2,2
3,06
-2,75
-2,3
0,23
0,65
-0,91
0
-0,78
1,2
-2,49
1,23
-0,37
10,13
144,91
283,61
430,76

Tabela 28: Resultado de deteco de frequncias com factor de decimao de 20. As frequncias em
amarelo correspondem s de afinao standard

86

9 Anexo B - Clculos dos coeficientes


Para calcular os coeficientes do filtro de Chebyshev do tipo I o ganho da resposta em
frequncia dada por
1
GN ()=H N ( j )=
,
(28)
2
1+ T N 2( )
onde N a ordem do filtro, a frequncia angular de corte, o factor de ripple da
banda de passagem, T n representa o polinmio de Chebyshev de ordem N e definido por

T N (x )= cos ( N arccos x ) ,x1,


cosh ( N arccos x) ,x>1,

(29)

e satisfaz a recursividade
T 0 (x )=1
T 1 (x)=x
T N +1 (x )=2 x T N (x)T N1 (x) .

(30)

Para N 1 , satisfaz as seguintes relaes:


1. Para x1 , o ganho do polinmio variam entre +1 e -1.
2. Para x>1 , o ganho incrementa monotonicamente com x.
3. T N (1)=1 para todo o N.
4. T N (0)=1 para N par e T N (0)=0 para N mpar.
5. T N ( x) Cruza o zero no intervalo de 1x1 .
Para determinarmos a localizao dos plos calcula-se factor de ripple com base no valor
escolhido em dB na banda de passagem.

= 10ripple em db/ 10 1.

(31)

Partindo da propriedade 1 do polinmio de Chebyshev sabemos que para os plos ocorrem


quando

j
1+2 T N 2 ()=0 T N = .

(32)

Fazendo =cos( ) , significa que =arccos() ,e no domnio dos nmeros complexos


obtemos

=arccos()=u+ jv

(33)

Relacionando (23) em 22, obtemos


j
T N =cos( N )=cos ( Nu)cosh ( Nv) j sin( Nu) sinh(Nv )= ,
87

(34)

o que significa que a parte real de T N em (24) tem que ser igual a zero. Ento necessrio
que
(35)
cos( Nu)cosh( Nv)=0
o que implica que cos( Nu)=0 . Para satisfazer esta condio significa que u ter os
seguintes valores
(36)
u=u k =(2k+1) /2N, k =0,1,. .., N 1.
Para estes valores de u, sin ( Nu)=1 , ento temos
1
sinh(Nv )= ,

(37)

que implica que v tem o seguinte valor


1
arsinh ( )
v =v 0=
.
N

(38)

Definindo s= j obtemos
s= j = j cos()= j cos (u+ jv)= j cos (( 2k+1)

+ j v0 )
2N

(39)

que d a localizao dos N plos no plano complexo como

s k =k + j k

(40)

onde
k =sinh( v 0)cos (

k
)
2N

(41)

e
k =cosh ( v 0)sin(

k
)
2N

para N valores de k onde


k =1,3,5,. .. ,( N 1) N par

(42)

(43)

e
k =0,2,4,... ,( N 1)

N mpar.

A resposta em frequncia para o filtro dada por


1
F(s)=
.
2
2
k s2 k s+( k +k )

88

(44)

(45)

Referncias
1: Leggato, Tcnica de legato na guitarra,03, 2011, http://www.5min.com/Video/Understanding-the-Legato-Technique-68806222
2: Youtube, Tcnica de shreding na guitarra,06, 2010, http://www.youtube.com/watch?
v=blhz99V6e94
3: Guitar Pro, Guitar Tablature editor, Scale Tools, chord diagrams, MIDI and ASCII import/export,03, 2011, http://www.guitar-pro.com/en/index.php
4: MIDI, MIDI,03, 2011, http://www.midi.org/aboutmidi/index.php
5: Guitar Rig, Software para efeitos de guitarra em tempo real no PC.,03, 2011, http://www.native-instruments.com/#/en/products/guitar/guitar-rig-4-pro/
6: Roland VG-99, Guitar synth from Roland,06, 2010, http://www.roland.com/products/en/VG99/features.html
7: Roland, Roland RG-99,09, 2010, http://www.roland.com/products/en/VG-99/index.html
8: Roland, Roland PickUps,09, 2010, http://www.roland.com/products/en/GK-3/index.html
9: MonoDevelop, MonoDevelop IDE,02, 2011, http://monodevelop.com/
10: S. Kuo, B. Lee, Real-Time Digital Signal Processing, 2001,Wiley
11: Guitar Master Class, Brao guitarra,09, 2010,
http://www.guitarmasterclass.net/guitar_forum/uploads/post-1167-1192068497.jpg
12: Eurico A. Cebolo, Livro Solfejo Mgico, 2002,Eurico A. Cebolo
13: Metrnomo, Metrnomo analgico,09, 2010,
http://umcantinhoumviolao.files.wordpress.com/2009/06/metronomo801ty9.jpg
14: KORG, Metronome Digital TM-40,01, 2010, http://korg.com/product.aspx?&pd=209
15: Pure Lessons, Escala de piano,02, 2011, http://www.purelessons.com/theory_sections.php
16: Figuras musicais, ,09, 2010, http://batera.files.wordpress.com/2006/10/figuras-e-pausas-musicais.gif?w=450
17: Adnipo Isesaki, Exemplo de compassos,01, 2011, http://www.adnipo-isesaki.com/?secao=aulasdemusica&id=15
18: Relao figuras, Relao entre figuras musicais,09, 2010, http://4.bp.blogspot.com/_qWILEZ71m7k/RqnhjCrcglI/AAAAAAAAAEs/B2VIgbkTHVY/s320/dicas_teoria3aa.GIF
19: Slide, Tcnica slide na guitarra,04, 2010, http://www.5min.com/Video/Lessons-For-Electric-Slide-Guitar-In-Standard-Tuning-162417200
20: Bending, Tcnica de bending na guitarra,02, 2010, http://www.youtube.com/watch?v=DiqApItNtzg
21: Tremolo, Efeito tremolo na guitarra.,06, 2010, http://www.ehow.co.uk/video_2378434_tremolo-effects-electric-guitar.html
22: Dario Cortese, Guitar Lesson,01, 2011,
http://www.dariocortese.com/lessons/guitarlessons/licks/2010-2/september/
23: www.howtoreadguitartabs.net, Tab Legend,01, 2011, http://www.howtoreadguitartabs.net/guitar-tab-legend.html
24: Cyfuss, Guitarra Elctrica,03, 2011,
http://www.cyfuss.com/curso_teorico_practico_de_musica/partes_de_la_guitarra_electrica
25: Howstuffworks, Funcionamento dos captadores,09, 2010, http://entertainment.howstuffworks.com/electric-guitar1.htm

26: Stellfner, Esquema de um captador,01, 2011, http://www.stellfner.com.br/Conceitos%20Pickup


%20Teoria.htm#magneto
27: Oppenheim, A., Schafer, R., Discrete-Time Signal Processing, 1999,Prentice Hall
28: Connexions, Autocorrelao,02, 2011, http://cnx.org/content/m10676/latest/
29: Patrick F. Dunn, Measurement and Data Analysis for Engineering and Science, 2005,McGraw
Hill
30: Tony Fisher, Interactive Digital Filter Design,01, 2011, http://www-users.cs.york.ac.uk/~fisher/
31: Tony Fisher, Butterworth / Bessel / Chebyshev Filters,01, 2011, http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html
32: Giovanni Bianchi and Roberto Sorrentino, Electronic filter simulation & design, 2007,McGrawHill Professional
33: Steven W. Smith, The Scientist and Engineer's Guide to Digital Signal Processing, 1997,DSP
Guide
34: Enotes, Chebyshev filter,02, 2011, http://www.enotes.com/topic/Chebyshev_filter
35: Connexions, Chebyshev Filter Properties,02, 2011, http://cnx.org/content/m16906/1.1/
36: Wikipedia, Diagrama Forma Directa II,02, 2011, http://en.wikipedia.org/wiki/Digital_filter
37: Julius O. Smith III, Anlise Espectral,02, 2011,
https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html
38: PThread-Win32, POSIX 1003.1-2001 Pthread implementation for Windows.,01, 2010,
http://sourceware.org/pthreads-win32/
39: Boost C++ Library, Conjunto de bibliotecas C++.,06, 2010, http://www.boost.org/
40: Boost Thread, Biblioteca para programao concorrente.,04, 2010,
http://www.boost.org/doc/libs/1_43_0/doc/html/thread.html
41: Boost Signals, Biblioteca para implementao de notificao publisher/subscriber.,04, 2010,
http://www.boost.org/doc/libs/1_43_0/doc/html/signals.html
42: Boost Signals2, Variante thread-safe da biblioteca Boost Signals.,04, 2010, http://www.boost.org/doc/libs/1_43_0/doc/html/signals2.html
43: OpenMP, Biblioteca em C para programao paralela, em sistemas multicore ou multiprocessadores, com memria partilhada.,01, 2009, http://openmp.org
44: Prof. Alan Kaminsky Department of Computer ScienceRochester Institute of Technology , Multi-processador,09, 2010, http://www.cs.rit.edu/~ark/lectures/pj03/notes.shtml
45: FFTW, Biblioteca em C/C++ que implementa o clculo da FFT (DFT) em uma ou mais dimenses.,5, 2009, http://www.fftw.org/
46: SIMD, ,09, 2010, http://www.kernel.org/pub/linux/kernel/people/geoff/cell/ps3-linux-docs/ps3linux-docs-08.06.09/CellProgrammingTutorial/BasicsOfSIMDProgramming.html
47: RTAudio, C++ classes that provide a common API (Application Programming Interface) for realtime audio input/output across Linux, Macintosh OS-X and Windows .,06, 2010, http://www.music.mcgill.ca/~gary/rtaudio/
48: Libsndfile, Biblioteca Libsndfile,09, 2010, http://www.mega-nerd.com/libsndfile/
49: boost program_option, boost program_option,09, 2010,
http://www.boost.org/doc/libs/1_44_0/doc/html/program_options.html
50: Boost threadpool, Boost Threadpool,09, 2010, http://threadpool.sourceforge.net/
51: Boost Interprocess, Boost Interprocess,04, 2010,
http://live.boost.org/doc/libs/1_44_0/doc/html/interprocess.html
52: W3, XML,03, 2011, http://www.w3.org/XML/

53: Boost Timer, Biblioteca Boost para funes de clock.,06, 2010,


http://www.boost.org/doc/libs/1_43_0/libs/timer/timer.htm
54: timeGetTime, Funo da API do Windows para retornar o relgio do sistema operativo.,05,
2010, http://msdn.microsoft.com/en-us/library/dd757629%28VS.85%29.aspx
55: GetTickCount, Funo da API do Windows para retornar o nmero em milissegundos desde de
que o sistema operativo iniciou.,05, 2010, http://msdn.microsoft.com/enus/library/ms724408%28VS.85%29.aspx
56: QueryPerformanceCounter, Retorna o valor actual do contador de alta resoluo.,05, 2010,
http://msdn.microsoft.com/en-us/library/ms644904%28VS.85%29.aspx
57: clock_gettime, retorna o conjunto do tempo de um clk_id especfico.,05, 2010, http://linux.die.net/man/3/clock_gettime
58: FFTW , FFTW 3.3,03, 2011, http://www.fftw.org/doc/Introduction.html
59: .Net Interop, .Net Interop,09, 2010, http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.aspx
60: DllImport, DllImport,09, 2010, http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx
61: boost file_lock, Boost File Lock,09, 2010, http://www.boost.org/doc/libs/1_43_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.file_lock
62: MicroSoft, .Net Memory Mapped File,02, 2011, http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile.aspx
63: GTK sharp, GTK-Sharp,09, 2010, http://www.mono-project.com/GtkSharp
64: LilyPond, LilyPond music notation libray,02, 2011, http://lilypond.org/
65: Music XML, MusicXML,02, 2011, http://www.musicxml.org/
66: ABC Notation, ABC Notation,02, 2011, http://abcnotation.com/
67: VexFlow, VexFlow Music Engraving in JavaScript and HTML5,02, 2011, http://vexflow.com/
68: Microsoft, ProcessStartInfo,02, 2010, http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo_properties.aspx
69: Microsoft, DllImport,02, 2011, http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx
70: Microsoft, StructLayout,02, 2011, http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx
71: Microsoft, IntPtr,02, 2011, http://msdn.microsoft.com/en-us/library/system.intptr
%28v=VS.100%29.aspx
72: Microsoft, MarshalAs,02, 2011, http://msdn.microsoft.com/en-us/library/s9ts558h
%28v=VS.100%29.aspx
73: Jack Audio Connection Kit, Jack Audio Connection Kit,06, 2010, http://jackaudio.org/
74: ALSA (Advance Linux Sound Architecture), Arquitectura udio e MIDI para Linux.,06, 2010,
http://www.alsa-project.org/
75: Stuart Cam, Wav2Gif,02, 2011, http://blog.codebrain.co.uk/post/2009/04/30/C-Sharp-WAV2GIF.aspx
76: Guitar Fretboard Diagram, Guitar Fretboard Diagram,02, 2011, http://www.guitarfretboarddiagram.com/

Você também pode gostar