INSTITUTO POLITECNICO NACIONAL¶max.esimez.ipn.mx/publicas/Sintetizador.pdfAng elica Correa Cid y...
Transcript of INSTITUTO POLITECNICO NACIONAL¶max.esimez.ipn.mx/publicas/Sintetizador.pdfAng elica Correa Cid y...
INSTITUTO POLITECNICO NACIONAL
ESCUELA SUPERIOR DE INGENIERIA MECANICA Y ELECTRICA
DEPARTAMENTO DE INGENIERIA EN COMUNICACIONES Y ELECTRONICA
ACADEMIA DE ACUSTICA
Diseno Elemental de un Sintetizador de Notas Musicales
T E S I S
Que para obtener el Tıtulo de
Ingeniero en Comunicaciones y Electronica
Presentan:
Victor Hugo Correa Cid
Ivan Guadalupe Contreras Mendez
Asesores:
Dr. Maximino Pena Guerrero
Ing. Jose de Jesus Negrete Redondo
Mexico D.F. Octubre 2005
Trabajo de tesis que forma parte de los resultadosobtenidos con nuestro proyecto de investigacion, MAN:Red Internet II de Audio Multimedia con Servidores yClientes Incrustados, numero de registro 20040733 asig-nado por la Coordinacion General de Posgrado e Investi-gacion del Instituto Politecnico Nacional durante febrero2004 a marzo 2005, desarrollado en el laboratorio de laacademia de acustica de la ESIME Zacatenco, y dirigidopor el Dr. Maximino Pena Guerrero.
ii
iii
RESUMEN
Actualmente los sintetizadores son instrumentos musicales que generan sonidos
controlando osciladores electronicos con un teclado de piano, o bien con dispositivos
electronicos digitales o analogicos. De esta forma es posible crear nuevos sonidos, o
bien sintetizar por ejemplo el sonido de una trompeta, flauta, o un saxofon. Para
lograr un sonido particular, la forma de onda que producen estos osciladores se puede
modificar cambiando los parametros que definen una nota musical (frecuencia), su
volumen (amplitud), y el timbre que permite identificar un instrumento de otro (fase
y cantidad de armonicos).
Esta tesis presenta el diseno basico de un sintetizador electronico digital de notas
musicales. Las caracterısticas que lo definen se describen dentro de un programa
que corre en una PC (Personal Computer). Nuestro sintetizador trabaja con base
en las series matematicas de Fourier. Sus “osciladores” son generadores de formas
de onda simples (funciones seno), los cuales se pueden modificar (timbre de una
nota) con barras y controles graficos en la pantalla de la computadora. La frecuencia
fundamental (nota) del conjunto de osciladores del sintetizador es controlada con
un teclado virtual de 12 notas, las cuales simulan las teclas fısicas de un piano de
concierto.
Los resultados que se obtienen son: nuestro sintetizador funcionando en un am-
biente grafico que genera un programa en Visual C++.NET y que tambien muestra
una serie de ventanas, las cuales contienen las formas de onda de los osciladores;
asımismo, un teclado grafico y barras que controlan la amplitud y frecuencia de los
osciladores. Por otra parte, el sonido que se produce cuando se activan las teclas
del sintetizador es reproducido con el sistema de audio estandar de la computadora.
Cabe mencionar que solo utilizamos seis osciladores, pero que esta restriccion, no ha
impedido la investigacion del funcionamiento basico de dicho dispositivo.
iv
OBJETIVO
Disenar un sintetizador basico de notas musicales para PC (Personal Computer),
utilizando algoritmos de programacion (en Visual C++.NET) y metodos numericos.
JUSTIFICACION
En la actualidad existen varios tipos de modelos de sintetizadores por hardware,
con los cuales es posible obtener sonidos de diversos instrumentos musicales, sin em-
bargo, para esto se necesita de multiples elementos electronicos, por lo que pueden
llegar hacer enormes, ocupar grandes espacios, ser estorbosos y poco practicos para
los usuarios. Al darnos cuenta de lo anterior observamos que un modelo por software
puede igualar o incluso superar a un modelo por hardware, ya que si se cuenta con una
PC, un musico o cualquier persona, puede tener acceso a un sintetizador en lugares
que normalmente no seria posible (avion, tren, autobus, etc.).
v
Agradecimientos
A mis padres:
Marıa Magdalena Cid Flores y Salomon Correa Medina, quienes con su apoyo
constante me han dado fuerzas para seguir adelante y nunca detenerme. Se que no
necesito escribir todo lo que significan para mı, pero quiero que sepan que siempre
estare para ustedes, ası como ustedes siempre han estado para mı. Nunca olviden que
los amo.
A mis hermanas:
Angelica Correa Cid y Alejandra Correa Cid, les agradezco por mostrarme el
camino para llegar hasta donde estoy, ya que sin su ejemplo y apoyo nunca lo hubiera
logrado. No encuentro palabras para expresar la bendicion que significa tener unas
hermanas como ustedes.
A mis profesores:
Agradezco a todos mis profesores, pero en especial al Dr. Maximino Pena Guerrero
y al Ing. Jose de Jesus Negrete Redondo, quienes me confiaron este trabajo de tesis
y me impulsaron a cumplir con el objetivo. Espero no haberlos defraudado!!!.
A la Virgen de Guadalupe:
Por que siempre estas cuando te necesito y se que ahı seguiras!!!.
Victor Hugo Correa Cid
vi
”El hombre es el unico ser de la naturalezaque tiene conciencia de que va a morir,por eso —y solo por eso— tengo un pro-fundo respeto por la raza humana, y creoque en un futuro sera mucho mejor queen el presente. Aun sabiendo que sus dıasestan contados y que todo acabara cuandomenos se lo espera, hace de la vida unalucha digna de un ser eterno. Lo que laspersonas llaman vanidad —dejar obras,hijos, hacer que su nombre no se olvide—yo lo considero la maxima expresion de ladignidad humana.
Paulo Coelho
El Peregrino (Diario de un mago).
vii
Agradezco infinitamente a Dios por darme la oportunidad de; vivir en este tiempo
y conocer a las personas que han marcado mi vida para siempre. A todas esas personas
gracias, por compartir conmigo momentos de alegrıas y tristezas.
A mis padres, Julia Mendez y Silvestre Contreras les agradezco el apoyo y pacien-
cia que me han brindando durante todos estos anos. Ası como tambien agradezco a
mi hermana Veronica que me brindo su apoyo en lo que necesitaba. Y muy especial-
mente le agradezco a mi abuela Delfina Hernandez (q.p.d), que en vida siempre se
preocupo por mis estudios y mi bienestar. No podıa faltar toda mi gratitud a, mi tıa
Marıa de la Cruz Mendez, a mi tıo Benito Cureno Mendez y familia.
A mis amigos: Arturo Inigo, Arturo Nava, Raul Hernandez, Leonel Rios y Denys
Basurto, humildemente les agradezco su confianza, su amistad y su companıa durante
todos estos anos. De la misma manera agradezco a: Lalo, Ulises, Oscar, Chucho,
Moreno, Hugo, Karla y Cristina, porque con todos ellos compartı momentos muy
agradables y siempre conte con ellos en los momentos difıciles.
Quiero brindarles toda mi gratitud y respeto a mis profesores, que saben valorar
su profesion y dıa con dıa dan lo mejor de sı mismos. Muy en especialmente al Dr.
Maximino Pena Guerrero y al Ing. Jose de Jesus Negrete Redondo, por la confianza
y el apoyo para la realizacion de esta tesis, igualmente a mis amigos Victor Hugo
Correa y Juan Simuta.
Al Instituto Politecnico Nacional y a la E.S.I.M.E.-Zacatenco... ¡simplemente mil
gracias! porque en ellos no solamente aprendı; matematicas y fısica, tambien aprendı;
que un buen ser humano es; humilde, sencillo y respeta al projimo.
Ivan Guadalupe Contreras Mendez.
viii
Quien ama la ciencia, la co-rreccion ama; mas aquel que escomo bruto, odia el reproche.
(Proverbios 12, 1)
Para el necio es recto su camino; masel hombre prudente oye el consejo.
(Proverbios 12, 15)
Hay quienes pretenden ser ricos,sin tener nada; hay quienes pre-tenden ser pobres, siendo muy ricos.
(Proverbios 13, 7)
ix
Indice general
1. Introduccion 5
1.1. Antecedentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2. Nuestro trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3. Organizacion del documento . . . . . . . . . . . . . . . . . . . . . . . 7
2. Instrumentos Musicales Electronicos y Digitales 9
2.1. Principios de funcionamiento . . . . . . . . . . . . . . . . . . . . . . . 9
2.2. El sintetizador como instrumento musical . . . . . . . . . . . . . . . . 11
2.3. Metodos de programacion de nuestro sistema . . . . . . . . . . . . . . 12
2.4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3. Aspectos del Diseno de Sintetizadores de Musica 17
3.1. Generadores electronicos de formas de onda . . . . . . . . . . . . . . 17
3.2. Tipos de osciladores . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3. Anatomıa de un sintetizador . . . . . . . . . . . . . . . . . . . . . . . 20
3.4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4. Diseno de Nuestro Sintetizador de Notas 25
4.1. Computadoras digitales . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.2. Estructuras del controlador (driver) de sonido . . . . . . . . . . . . . 27
4.3. Programacion de las funciones de onda . . . . . . . . . . . . . . . . . 31
4.4. Visualizacion de las formas de onda . . . . . . . . . . . . . . . . . . . 33
4.5. Anatomıa de una tarjeta de sonido . . . . . . . . . . . . . . . . . . . 35
4.6. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5. Diseno de la Interfaz Grafica 37
5.1. Pixeles y mapas de bits . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2. Ventanas, barras, y otros controles graficos . . . . . . . . . . . . . . . 38
5.3. Programando la interfase grafica . . . . . . . . . . . . . . . . . . . . . 38
5.4. Programando el controlador driver de sonido . . . . . . . . . . . . . . 48
1
5.5. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6. Pruebas y Resultados 51
6.1. Ambiente de compilacion y generacion de codigo . . . . . . . . . . . . 51
6.2. Aspecto visual del sintetizador . . . . . . . . . . . . . . . . . . . . . . 53
6.3. Control de parametros del sintetizador . . . . . . . . . . . . . . . . . 54
6.4. Controlando los armonicos . . . . . . . . . . . . . . . . . . . . . . . . 55
6.5. Control del teclado . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.6. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
7. Conclusiones y Trabajos Futuros 59
7.1. Trabajos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
2
Indice de figuras
3.1. Sintetizador elemental . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.1. Numero de muestras por cada ciclo. . . . . . . . . . . . . . . . . . . . 32
4.2. Representacion grafica de la Serie de Fourier, mediante un programa
disenado en C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.3. Diagrama a bloques de una tarjeta de sonido. . . . . . . . . . . . . . 36
5.1. Jerarquıa de ventanas. . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.2. Interfaz grafica de la aplicacion. . . . . . . . . . . . . . . . . . . . . . 40
6.1. Vista principal del sintetizador. . . . . . . . . . . . . . . . . . . . . . 52
6.2. Valores mınimo, central y maximo de la barra horizontal. . . . . . . . 53
6.3. Barras de desplazamiento verticales, con una amplitud modificada. . . 54
6.4. Tercer armonico con amplitud modificada. . . . . . . . . . . . . . . . 55
6.5. Quinto armonico con amplitud modificada. . . . . . . . . . . . . . . . 56
6.6. Todos los armonicos modificados . . . . . . . . . . . . . . . . . . . . . 56
6.7. Vista del Teclado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.8. a)Tecla en reposo. b)Tecla pulsada. . . . . . . . . . . . . . . . . . . . 58
3
Indice de tablas
6.1. Valores de las barras de desplazamiento . . . . . . . . . . . . . . . . . 58
4
Capıtulo 1
Introduccion
1.1. Antecedentes
Un dispositivo que genera los sonidos a partir de la combinacion de elementos
simples (normalmente senales periodicas y funciones matematicas) es conocido como
sintetizador. Con este artefacto se pueden crear nuevos sonidos ası como reproducir
los de los instrumentos musicales conocidos, la forma de la onda generada, es al-
terada en su duracion, altura y timbre, mediante el uso de dispositivos tales como
amplificadores, mezcladores, filtros, reverberadores, secuenciadores y moduladores de
frecuencia. Para encontrar los primeros sintetizadores de sonido debemos remontarnos
a 1906, ano de invencion del Telharmonium, mientras que en los anos veinte surge el
Theremin. Estos primeros aparatos eran analogicos y utilizaban osciladores electricos
como fuente sonora.
Sin embargo fue en la decada de 1960 que aparecio uno de los sintetizadores mas
famosos, el Moog, llamado ası por su inventor, el ingeniero estadounidense Robert
Moog. Este se controla con uno o mas teclados y con el es posible crear un numero
casi infinito de sonidos y pueden imitarse muchos instrumentos. El sintetizador Moog
no tiene memoria, lo que significa mover cerca de 60 botones para lograr el sonido
de algun instrumento, como un violın o una trompeta. Las posiciones de los botones
se apuntan en un cuaderno, ya que para hacer el sonido de un instrumento deben
desorganizarse las posiciones del instrumento anterior.
5
Una de las controversias que se han tenido en los ultimos anos, es si los sinte-
tizadores por software podıan desplazar a los modelos por hardware. Viendo que el
sonido de algunos modelos software, los han ido igualando, se decıa que la falta de
control sobre sus parametros, el hecho de tener fastuosos interfaces de pantalla pero
ningun potenciometro a mano, los ponıan en clara desventaja. Sin embargo hay que
decir que la mayorıa de los modelos digitales y estaciones de trabajo que se usan
actualmente, tienen complejas arquitecturas y grandes cantidades de parametros que
imposibilitan construir paneles de potenciometros que cubran todas las opciones (a
no ser que midiesen un par de metros cuadrados). De esta manera hay que tener
en cuenta, que en general las arquitecturas de los modelos por software actuales son
mucho mas amplias y ambiciosas.
1.2. Nuestro trabajo
Lo anterior expuesto nos llevo a crear el diseno basico de un sintetizador ele-
mental para PC (Personal Computer), el cual se basa en la manipulacion de senales
analogicas, llamadas formas de onda, que en nuestro caso seran de tipo sinusoidal.
Estas senales seran manipuladas mediante un proceso para obtener sonido por medio
de una sıntesis, llamado series de fourier. De esta manera sumando las salidas de
varios osciladores de forma de onda sinusoidal, se obtendran diversos timbres, segun
la amplitud que se le da a la frecuencia fundamental (la nota) y sus armonicos (notas
multiplos de la fundamental), los cuales permiten diferenciar un timbre de otro, por
ejemplo un violın de una flauta.
En la actualidad existen diferentes software que se enfocan en el desarrollo de
aplicaciones para Windows, tales como: C, C++, Borland, entre otros. Sin embargo,
las aplicaciones utilizadas en Windows, eran sencillas de usar para el usuario pero
difıciles de desarrollar para el programador. Por este motivo en febrero de 1993,
fue introducido uno de los mas conocidos y eficientes lenguajes de programacion
orientada a objetos, Visual C++, el cual ha ido evolucionando hasta llegar a su mas
6
reciente version, Visual C++ .Net o version 7 del mismo. Desarrollar aplicaciones en
un entorno de este tipo se vuelve una tarea un poco mas sencilla, el programador puede
crear la interfaz grafica (ventanas, barras de desplazamiento, botones, entre otras
cosas), sin necesidad de escribir nada de codigo. Tomando en cuenta lo anterior hemos
decidido usar para el desarrollo de este sintetizador, el software antes mencionado,
Visual C++ .Net.
1.3. Organizacion del documento
Esta tesis se encuentra estructurada de la siguiente manera. El capıtulo 2 presenta
los conceptos basicos que deben ser tomados en cuenta, para el desarrollo de nuestro
sintetizador, tales como: sonido, tipos de sıntesis, generacion de sonido en PC’s, entre
otros. El capıtulo 3 presenta los aspectos de diseno para el desarrollo de nuestro
sintetizador, de esta forma tomamos en cuenta el funcionamiento de los dispositivos
que pueden ser empleados para generar formas de onda (osciladores), tales como: los
tipo Hartley, Colpitts, LC, RC, VCO, 555, entre otros. Cabe mencionar que los disenos
anteriores son de caracter explicativo, ya que no seran implementados en nuestro
diseno. El capıtulo 4 presenta el proceso de diseno de las sıntesis de ondas, en el que
veremos las estructuras de audio mas importantes utilizadas para la comunicacion
entre el software y la tarjeta de sonido de la PC. Al mismo tiempo desarrollaremos
y explicaremos la funcion encargada de realizar la sıntesis de ondas, almacenandolas
en un buffer de audio. El capıtulo 5 presenta el diseno de la interfaz grafica, donde se
explicara paso a paso los diferentes puntos a seguir para el desarrollo del software y
definiremos algunos conceptos basicos tales como pıxel, mapa de bits, recurso grafico,
entre otros, necesarios para su mejor comprension. El capıtulo 6 presenta algunas
pruebas y resultados de nuestro proyecto final, describiremos su operacion y la forma
de obtener un archivo ejecutable del proyecto, para que este sea universal. Por ultimo
el capıtulo 7 presenta las conclusiones a las que llegamos al termino de este proyecto,
ası como algunas propuestas para la mejora del mismo.
7
Φ
8
Capıtulo 2
Instrumentos MusicalesElectronicos y Digitales
En este capıtulo trataremos algunos conceptos que son basicos para la comprension
de los demas capıtulos, como son ondas sonoras, caracterısticas del sonido, armonicos,
analisis de Fourier, sintetizadores, tecnicas de sıntesis, muestreo, modulacion, ge-
neracion de sonido en PC (Personal Computer), captura de sonido y lenguajes de
programacion.
2.1. Principios de funcionamiento
Cuando un cuerpo es excitado de alguna manera, las moleculas de aire que se
encuentran en contacto con la fuente se ponen en movimiento al mismo tiempo y
con la misma amplitud y fase que las superficies de dicha fuente, a esto se le conoce
como Sonido. A partir de este movimiento se desarrolla una onda sonora, cuando al
moverse las moleculas que estan en contacto con la fuente, ponen en movimiento a las
que se encuentran a continuacion y estas a su vez a las siguientes, produciendo una
reaccion en cadena y que continua de acuerdo al movimiento de la fuente en ambas
direcciones, generando aumento y disminucion de presion, haciendo que su efecto se
propague en todas direcciones.
Las principales caracterısticas del sonido son: frecuencia, amplitud, tono y timbre.
La frecuencia, es el numero de oscilaciones que se cumplen en un segundo dentro de
9
un movimiento vibratorio y es expresada en Hertz (Hz.), las frecuencias que percibe
el oıdo humano se encuentran entre los 20 Hz y 20,000 Hz. La amplitud esta definida,
como el grado de movimiento de las moleculas de aire en una onda. El tono nos permite
diferenciar un sonido grave de un sonido agudo, mientras mas ciclos completos ocurren
mas alto sera el tono. El timbre, es el atributo de la sensacion auditiva por el cual,
un escucha puede juzgar dos sonidos similares como diferentes entre sı [1].
Existen diferentes formas de onda, como la onda sinusoidal, cuadrada, diente
de sierra, etc, estas ondas nos permiten distinguir una nota musical de la misma
frecuencia e intensidad, producida por instrumentos diferentes. La forma de onda
viene determinada por una serie de vibraciones subsidiarias, que acompanan a una
vibracion primaria o fundamental del movimiento ondulatorio (especialmente en los
instrumentos musicales) llamados armonicos. Normalmente al hacer vibrar un cuerpo,
no obtenemos un sonido puro, sino un sonido compuesto de sonidos de diferentes
frecuencias. La frecuencia de los armonicos, siempre es un multiplo de la frecuencia
mas baja, llamada frecuencia fundamental o primer armonico.
En 1807, el matematico frances Joseph Fourier (1768-1830), envio un artıculo a
la Academia de Ciencias en Parıs. En el, presentaba una descripcion matematica de
problemas relacionados con la conduccion de calor. Una de las sorprendentes ramifica-
ciones del trabajo de Fourier, fue que muchas de las funciones mas conocidas podıan
expandirse en series infinitas e integrales que involucraban funciones trigonometricas,
llamadas series de Fourier. La idea es importante hoy en dıa, en el modelamiento de
muchos de los fenomenos en Fısica e Ingenierıa.
Un metodo matematico para obtener el espectro de potencia, como funcion de la
frecuencia para una forma de onda de la senal dada, es la transformada de Fourier,
que es utilizada para transformar una senal representada en el dominio del tiempo, al
dominio de la frecuencia, sin alterar su contenido de informacion, solamente es una
forma diferente de representarla.
Astronomo y matematico aleman nacido en Minden, Friedrich Bessel (1784-1846),
10
introdujo en matematicas las funciones de Bessel como solucion a ciertas ecuaciones
diferenciales. Las funciones son de gran importancia para determinar la distribucion
y el flujo del calor o la electricidad, y para la solucion de problemas relacionados con
el movimiento ondulatorio, la elasticidad y la hidrodinamica.
Llamadas funciones Splines, su gran popularidad se debe a que sus propiedades las
hacen ideales, para atacar problemas muy variados en diversas areas de la matematica,
tambien son muy utiles en el diseno grafico y en la solucion numerica de ecuaciones
diferenciales.
Constituye un proceso importante en diferentes areas de la ingenierıa, la con-
volucion representa una operacion y un concepto matematico, que constituyen una
aplicacion que permite la obtencion, de una solucion real que plantea la transmision de
informacion, la interaccion de dos cantidades en el tiempo y espacio, es la convolucion
de esas dos cantidades.
2.2. El sintetizador como instrumento musical
Aparecido en la decada de los sesentas, el sintetizador, es un dispositivo electronico
digital similar a un piano, que puede generar una gran variedad de sonidos musicales.
Se denominan sintetizadores porque obtienen el sonido por medio de una sıntesis
(proceso artificial), la cual se puede realizar por diferentes medios. Por ejemplo, los
primeros sintetizadores se basaban en la teorıa del analisis de Fourier y sumando
las salidas de varios osciladores de forma de onda senoidal, obtenıan diversos timbres
segun la amplitud que se le daba a la frecuencia fundamental (la nota) y sus armonicos.
Tambien utilizaban formas de onda del tipo diente de sierra, triangular y cuadrada,
cada una de las cuales tiene un rico y particular contenido armonico [7].
Robert Moog, construyo el primer sintetizador analogico que aun lleva su nombre,
el clasico Moog, el cual es un generador electronico de formas de onda, que puede
producir casi cualquier clase de senal periodica de audiofrecuencia.
Actualmente podemos encontrar diversas formas de generar senales de audio, a
11
continuacion mencionaremos las mas conocidas tecnicas de sıntesis: 1) Sıntesis Adi-
tiva, parte de la idea contenida en el teorema de Fourier, segun la cual todo sonido
periodico, por complejo que sea, es el resultante de la suma de ondas sinusoidales
sencillas de frecuencias multiplo, de una frecuencia base. El proceso de esta sıntesis,
fabrica sonidos mediante el modelo matematico, buscando la composicion armonica;
partiendo de pequenas series armonicas y precisando la frecuencia y la amplitud de
cada componente en cada instante. 2) Sıntesis Analoga o Substractiva, es la opcion
mas antigua y duradera, se fundamenta en lo contrario de la aditiva, en lugar de
ensamblar un sonido a partir de sus componentes, se sintetiza el resultado eliminando
los componentes no deseados de un sonido parcial muy rico.
La idea esencial es poder representar las variaciones de presion del sonido, en
forma de variaciones de tension. Los timbres se obtienen a partir de formas de onda
complejas (ricas en armonicos) a las que se les sustraen, mediante filtros, ciertas partes
de su estructura armonica. 3) Sıntesis Virtual, nace como la fusion de tres desarrollos
tecnicos de dinamica relacion, primero la formal constitucion del sintetizador como
instrumento expresivo y la busqueda de nuevas posibilidades para generar sonido,
segundo, el constante desarrollo de microchips, unidades complejas de circuitos di-
gitales, computacion multimedia y finalmente el desarrollo de sofisticadas piezas de
software, encontrandose ası, que una computadora posee las caracterısticas necesarias
para generar audio, modularlo y que es posible usar sonido previamente digitalizado
(samples).
2.3. Metodos de programacion de nuestro sistema
Para la generacion de sonido en la PC (Personal Computer) existen tecnicas uti-
lizadas en la Multimedia, multi (variedad) y media (medios). Se ha definido como
la herramienta que emplea la PC para integrar y controlar diferentes sistemas elec-
tronicos tales como: videodiscos, videocamaras, videocasetes, sintetizadores de video
y audio, etc. Podemos mencionar que en un entorno multimedia, los elementos basicos
12
de hardware son: 1) La unidad de CD-ROM (Compact Disc Read Only Memory) y
2) La tarjeta de sonido.
Se pueden utilizar diferentes tecnicas de programacion, para controlar los dispo-
sitivos multimedia sin ningun tipo de limitacion. Por ejemplo, para tener acceso a
la unidad de CD-ROM o a la tarjeta de sonido, el hardware, y los controladores de
los dispositivos a utilizar, deberan estar instalados y configurados para la PC. La
siguiente lista menciona el hardware que es necesario para los tipos de dispositivos
MCI (Media Control Interfase) mas utilizados en el ambiente de programacion Visual
C++: 1) El CD de audio es controlado por la unidad de CD-ROM, 2) El secuenciador
es controlado por la tarjeta de sonido, 3) El audio por forma de onda es controlado
por la tarjeta de sonido.
Para la administracion de recursos multimedia de una forma apropiada, deben
cerrarse los dispositivos MCI que se encuentren abiertos antes de salir de la aplicacion
o cerrar la ventana que contiene dichos dispositivos, podemos utilizar para ello la
funcion OnDestroy con el mensaje SetCommand (close). Estas son las principales
instrucciones, que se utilizan para cancelar la reproduccion de audio y video [2].
En algoritmos computacionales a la representacion electrica del sonido, se le conoce
como Audio. En el proceso de conversion de la forma analoga a la forma digital de una
senal y viceversa aparecen tres terminos matematicos: 1)el muestreo, 2)la cuantizacion
y 3)la codificacion. El muestreo, es el proceso de tomar medidas instantaneas de una
senal analoga cambiante en el tiempo, tal como la amplitud de una forma de onda
compleja, el Teorema de Muestreo o Teorema de Nyquist, establece que es posible
capturar toda la informacion de la forma de onda, si se utiliza una frecuencia de
muestreo del doble de la frecuencia mas elevada contenida en la forma de onda. La
cuantizacion, es el siguiente proceso para la reduccion de la senal analoga compleja;
este permite aproximar la muestra a uno de los niveles de una escala designada. La
codificacion, es la representacion de informacion analogica en una senal digital.
El sistema PCM (Modulacion por codificacion de Pulsos) convierte la informacion
13
de dos canales de audio a forma digital. Una portadora puede modularse de diferentes
modos, dependiendo del parametro de la misma sobre el que se actue. Se modula en
amplitud (AM) una onda que llamaremos portadora, cuando la distancia existente
entre el punto de la misma en el que la onda vale cero y los puntos en que toma
el valor maximo o mınimo se altera. La modulacion de frecuencia (FM) consiste en
variar la frecuencia de la onda portadora de acuerdo con la intensidad de la onda de
informacion. La amplitud de la onda modulada es constante e igual que la de la onda
portadora.
Para el procesamiento informatico del sonido es necesario realizar su captura me-
diante una PC y almacenarlo en memoria o disco. El proceso basico para la captura de
sonido es el siguiente: 1) El sonido se transmite por el aire hasta el microfono, el cual
transforma la senal acustica a niveles electricos, 2) La senal analogica pasa a traves
de un convertidor analogico/digital. Sus caracterısticas establecen la frecuencia y el
numero de bits por cada muestra, 3) Mediante un canal se copia cada muestra a la
memoria de la PC.
Cualquier lenguaje artificial que puede utilizarse para definir, una secuencia de
instrucciones para su procesamiento por una computadora, es llamado lenguaje de
programacion. Vistos a muy bajo nivel, los microprocesadores procesan exclusiva-
mente senales electronicas binarias (0 y 1). Dar una instruccion a un microprocesador,
es en realidad enviar series de unos y ceros con un espacio en el tiempo de una forma
determinada. Esta secuencia de senales se denomina codigo de maquina. El codigo
representa datos, numeros e instrucciones para manipularlos. Una manera mas facil
de comprender el codigo de maquina es dando a cada instruccion un mnemonico, como
por ejemplo STORE, ADD o JUMP. Esta abstraccion da como resultado el lenguaje
ensamblador, el cual es de muy bajo nivel y es especıfico de cada microprocesador.
Hay un alto nivel de abstraccion entre lo que se pide a la computadora y lo que
realmente comprende. Existe tambien una relacion compleja entre los lenguajes de
alto nivel y el codigo de maquina. Los lenguajes de alto nivel son normalmente faciles
14
de comprender, porque estan formados por elementos de lenguajes naturales, como
el ingles. En BASIC, el lenguaje de alto nivel mas conocido, los comandos como
por ejemplo: IF CONTADOR = 10 THEN STOP pueden utilizarse para pedir a la
computadora que pare si CONTADOR es igual a 10.
Por otra parte, el lenguaje de programacion C, fue desarrollado en 1972 por el
estadounidense Dennis Ritchie en los laboratorios Bell, el cual es un lenguaje de
programacion de proposito general que ofrece; economıa de sıntesis, control de flujo,
estructuras sencillas y un buen conjunto de operadores, tiene un campo de aplicacion
ilimitado por que no es un lenguaje de muy alto nivel, mas bien es pequeno y sencillo
y no esta especializado en ningun tipo de aplicacion, esto lo hace un lenguaje potente,
y se aprende en poco tiempo. Ahora hablemos del lenguaje C++, que es una version
orientada a objetos del lenguaje de programacion llamado C, este fue desarrollado
por Bjarne Stroustrup a comienzos de la decada de 1980 en los laboratorios Bell.
Ası mismo, en febrero de 1993, fue creado Microsoft Visual C++ 1.0, el cual
es un entorno de desarrollo disenado especialmente para crear aplicaciones graficas
orientadas a objetos, introduce la biblioteca MFC (Microsoft Foundation Class). Ac-
tualmente se cuenta con la version Visual C++.Net, la cual cuenta con una mayor
integracion; MFC, ATL (Active Template Library) y una nueva clase de servicios
web, convirtiendose en el entorno de desarrollo, si se quiere combinar el control y
el rendimiento de C++ con la compatibilidad con windows y el entorno .Net, tam-
bien permite numerosas caracterısticas de nivel profesional y con el podemos crear
aplicaciones para windows y la web muy eficaces.
Ahora hablaremos del sistema unix, el cual es un sistema operativo multitarea
y multiusuario. Esto quiere decir que el sistema puede ejecutar varios programas a
la vez, y que puede gestionar a varios usuarios simultaneamente. Fue desarrollado
originalmente por Ken Thompson y Dennis Ritchie en los laboratorios Bell en el
ano de 1969. Unix tiene diversas variantes (p.e. Linux) y se considera potente, mas
transportable e independiente de equipos concretos que otros sistemas operativos,
15
porque esta escrito en lenguaje C.
2.4. Resumen
En el desarrollo de este capıtulo tratamos conceptos basicos como: ondas sonoras,
caracterısticas del sonido, armonicos, analisis de Fourier, sintetizadores, tecnicas de
sıntesis, muestreo, modulacion, generacion de sonido en PC, captura de sonido y
lenguajes de programacion (C, C++, Visual C++, Unix).
16
Capıtulo 3
Aspectos del Diseno deSintetizadores de Musica
En este capıtulo presentaremos los aspectos de diseno de sintetizadores de musica,
ya que es necesario conocer su funcionamiento antes de ser implementado en algorit-
mos computacionales, por lo que mencionaremos varios tipos de osciladores basicos,
los cuales usan transistores y amplificadores operacionales, tales como: osciladores
RC, LC, VCO, Colpitts, Clapp, Hartley y el circuito integrado 555, describiendo cada
uno de ellos.
3.1. Generadores electronicos de formas de onda
Un oscilador, es un circuito que produce una forma de onda repetitiva en su salida,
con solo el voltaje de alimentacion de DC (Direct Current) como entrada, no requiere
de una senal de entrada repetitiva. Diferentes tipos de osciladores producen diversos
tipos de salidas, incluyendo ondas sinusoidales, cuadradas, triangulares y de diente
de sierra, estos se aplican ampliamente en casi todos los sistemas de comunicacion,
sistemas digitales y computadoras para generar frecuencias y senales de sincronizacion
requeridas. Un oscilador basico consta de: 1) Un amplificador para obtener la ganancia
(transistor o amplificador operacional) y 2) Un circuito de realimentacion positiva,
que produce desfasamiento y nos introduce atenuacion [4].
Mencionaremos ahora los principios de los osciladores: 1) La realimentacion po-
17
sitiva, se caracteriza por la condicion en que una parte del voltaje de salida de un
amplificador, se realimenta a la entrada sin desfasamiento neto, con esto se reforza la
senal de salida, esto es, se crea un lazo en donde la senal se sostiene a sı misma y se
produce una salida en forma sinusoidal continua, por lo tanto se produce la oscilacion.
2) Las condiciones para que ocurra la oscilacion son dos: la primera, el desfasamiento
alrededor del lazo de realimentacion debe ser 0◦, la segunda, la ganancia de volta-
je alrededor del lazo cerrado de realimentacion debe ser igual a la unidad. Y 3) La
condicion de arranque dice; que para que se inicie la oscilacion, la ganancia de voltaje
alrededor del lazo de realimentacion positiva debe ser mayor que 1, de tal manera
que para que la amplitud de salida pueda alcanzar un nivel deseado, la ganancia debe
decrecer enseguida hasta 1, con el fin de conservar ese nivel.
3.2. Tipos de osciladores
Dentro de los osciladores realimentados con circuitos RC (Resistencia-Capacitor)
se mencionaremos tres tipos que proporcionan salidas sinusoidales: 1) El oscilador
puente de Wien, su parte fundamental es una red de adelanto-atraso formada por
resistencias y capacitores y que se usa en el lazo de realimentacion positiva, esta
red tiene una frecuencia de resonancia, en donde el desfasamiento a traves de la red
es 0◦ y la atenuacion es 1/3. Por abajo de la frecuencia de resonancia predomina
la red de adelanto y la salida se adelanta a la entrada, por arriba de la frecuencia
de resonancia predomina la red de atraso y la salida se atrasa con respecto a la
entrada. 2) El oscilador de corrimiento de fase, consta de tres redes RC en el lazo
de realimentacion, que puede proporcionar un desfasamiento maximo que tiende a
90◦, la oscilacion ocurre a la frecuencia en donde el desfasamiento total a traves de
las tres redes RC es de 180◦. Y 3) El oscilador de T gemela, se conoce ası debido a
los dos filtros RC de tipo T, que son usados en el lazo de realimentacion negativa,
uno de los filtros T tiene una respuesta pasa-bajas y el otro una pasa-altas, estos
filtro son conectados en paralelo y producen una respuesta de un supresor de banda,
18
con frecuencia central igual a la frecuencia de oscilacion deseada. Comunmente estos
osciladores se usan para frecuencias hasta de 1MHz (Mega Hertz).
En osciladores que requieren frecuencias mas altas de oscilacion, normalmente se
usan elementos de realimentacion tipo LC (Bobina-Capacitor), a menudo se emplean
transistores como elementos de ganancia en estos osciladores, a continuacion nos
introduciremos en varios tipos de osciladores LC resonantes tales como: 1) El oscilador
Colpitts, denominado ası en honor de su inventor, en este tipo se usa un circuito LC
en el lazo de realimentacion, para proporcionar el desfasamiento necesario y poder
operar como filtro resonante que va a pasar solamente la frecuencia de oscilacion que
se requiere. 2) El oscilador Clapp es una variante del Colpitts, la diferencia basica es un
capacitor adicional en serie con el inductor, en el circuito resonante de realimentacion.
3) El oscilador Hartley, es semejante al Colpitts, salvo que la red de realimentacion
esta formada por dos inductores en serie y un capacitor en paralelo. 4) El oscilador
Armstrong, usa un acoplamiento por transformador, con lo cual se realimenta una
parte del voltaje de senal, algunas veces se le denomina oscilador de reaccion en
referencia al secundario del transformador, no es muy comun en comparacion con los
anteriormente mencionados, en principio por la desventaja que presenta el tamano
y el costo del transformador. Y 5) Los osciladores controlados por cristal, son muy
estables y exactos, por que usan un cristal piezoelectrico en el lazo de realimentacion,
con el fin de poder controlar la frecuencia.
Hemos tratado osciladores que a su salida la forma de onda es sinusoidal, sin
embargo, existen osciladores que la forma de onda a su salida puede ser una on-
da triangular, diente de sierra, o cuadrada, algunos de estos tipos se refieren como
generadores de senal o multivibradores.
Continuando con los osciladores existe un tipo que es controlado por voltaje
(VCO), cuya frecuencia puede cambiarse mediante un voltaje de control variable de
DC, los VCO’s pueden ser sinusoidales o no sinusoidales. Por ejemplo, para construir
un oscilador de diente de sierra controlado por voltaje, se puede emplear un inte-
19
grador con un amplificador operacional, que use un dispositivo de conmutacion PUT
(transistor de unı juntura programable) que se conecte en paralelo con el capacitor de
realimentacion. El PUT contiene un anodo, un catodo y una terminal de compuerta.
La compuerta esta siempre polarizada positivamente con respecto al catodo, cuando
el voltaje del anodo excede al de la compuerta en aproximadamente 0.7 V (Volts), el
PUT se enciende y opera como diodo polarizado directamente, si el voltaje del anodo
cae por debajo de este nivel, el PUT se apaga, al cumplirse estas condiciones junto
con la carga y descarga del capacitor obtenemos un generador de diente de sierra.
Por otra parte, tenemos a un circuito integrado muy versatil y con muchas apli-
caciones, el temporizador 555, el cual se vera como oscilador. Este oscilador consta
de dos comparadores, un circuito multivibrador biestable (flip-flop), un transistor de
descarga y un divisor de voltaje resistivo. El multivibrador biestable, es un dispositi-
vo digital de dos estados, cuya salida puede estar en un nivel alto de voltaje (set) o
en un nivel bajo de voltaje (reset), estos estados pueden cambiarse mediante senales
de entrada apropiadas. El 555 se puede conectar, para que opere en el modo astable
como oscilador no sinusoidal de carrera libre.
3.3. Anatomıa de un sintetizador
Trataremos ahora los componentes elementales de un sintetizador. Conforme van
pasando los anos la tecnologıa va progresando en el campo de la electronica, por
ejemplo, tenemos el caso del desarrollo y evolucion del transistor, con esto es posible
la construccion de generadores de sonido mas finos. Ası en 1964 Robert Moog, en
colaboracion con un musico llamado Herbert Deutsch, desarrollaron los primeros VCO
y VCA (Amplificador Controlado por Tension), un ano mas tarde, desarrolla los
filtros controlados VCF (Filtro Controlado por Tension), de pasa-bajas y pasa-altas,
de igual manera los ADSR (generador de envolvente), esto dio paso al nacimiento del
sintetizador analogico modular (llamado Moog en honor a su inventor). Mas adelante
se explicaremos los terminos anteriormente mencionados.
20
Figura 3.1: Sintetizador elemental
En la Figura 3.1 se muestra el diagrama a bloques de un sintetizador elemental, a
continuacion se describen cada uno de sus bloques: El teclado controlador esta com-
puesto por una fuente la cual va a suministrar tensiones que son proporcionales a la
tecla que se oprime, estas tensiones se utilizan para iniciar los generadores de envol-
vente. El VCO, es en este caso la fuente de sonido basica, la frecuencia de la senal
que genera se obtiene como suma algebraica de las tensiones de control aplicadas a
sus entradas, se usan con respuesta exponencial normalizada a 1V/Octava y disponen
de varias formas de onda, sinusoidal, diente de sierra, triangular y cuadrada, y cada
una de ellas dara un tipo de sonido peculiar y diferente, dado el distinto contenido
armonico que tienen.
El mezclador de audio, es un dispositivo que permite la combinacion de una serie
de senales de entrada deseadas, de manera que se obtiene otra senal que es la combi-
nacion de aquellas. El ADSR (Attack Decay Sustain Release), se refiere a cuatro zonas
21
caracterısticas de la amplitud de una senal de control, la zonas ADR se refiere a tiem-
pos, mientras que S se refiere a un nivel, estos generadores de envolvente controlaran
tanto la amplitud de la senal sonora como la respuesta del filtro. El VCA se combina
con un generador ADSR, para impartir a los sonidos que modifica unas determinadas
caracterısticas de ataque y decaimiento en su intensidad, de tal manera que permita
la simulacion de la dinamica de diversos instrumentos musicales, tambien es posible
modular en amplitud la senal que se procesa para anadir tremolos y otros efectos que
dependeran mucho de la frecuencia de la senal moduladora.
Por otro lado, el VCF es un elemento que permite el paso de determinadas frecuen-
cias de la senal de entrada y es el equivalente electrico de los resonadores acusticos de
los instrumentos tradicionales, como la caja del violın, que da el sonido caracterıstico
del instrumento, este se puede configurar en varios modos, pasa bajo, pasa alto, pasa
banda y supresor de banda, segun sea el efecto que deseamos resaltar o atenuar de la
onda basica generada por los VCO, se tiene que los parametros caracterısticos de un
filtro son la frecuencia de corte y la pendiente del filtro, que determina la atenuacion
de los sucesivos armonicos de la senal de entrada.
Ya por ultimo, el LFO (Low Frecuency Ocilator) generalmente se compone de
varios osciladores independientes controlados por tension, con varias formas de onda
cada uno y que se situan en la banda de bajas frecuencias, hasta unos 20Hz, su salida
puede usarse tanto para controlar la amplitud (tremolo), como la frecuencia (vibrato),
de los VCO, obteniendo sonoridades muy variadas. Por ultimo mencionaremos que
existen tecnicas para la generacion de ruido, por ejemplo, la de un algoritmo computa-
cional o un arreglo de dispositivos electronicos, los cuales suelen proporcionar ruido
blanco o rosa, ası como una salida de tension de control aleatoria, pero ajustable en
ciertos parametros, estas tres senales sirven para producir sonidos no convencionales
similares a los naturales, como el mar, el trueno y el siseo del aire.
22
3.4. Resumen
En este capıtulo presentamos varios tipos de osciladores, tales como: osciladores
RC, LC, VCO, Colpitts, Clapp, Hartley, describiendo cada uno de ellos, tambien se
presento un circuito integrado muy popular, llamado temporizador 555 en su forma
de oscilador, ası mismo describimos el diagrama de un sintetizador elemental, estos
conceptos son la antesala para el diseno basico de un sintetizador elemental, que mas
adelante presentaremos.
23
Φ
24
Capıtulo 4
Diseno de Nuestro Sintetizador deNotas
En este capıtulo presentaremos el diseno de nuestro sintetizador de notas mu-
sicales. Explicaremos con mas detalle la programacion de la sıntesis de onda y las
estructuras de sonido mas importantes que se requieren para la programacion del
driver que controla la tarjeta de sonido de una computadora digital PC.
4.1. Computadoras digitales
Una computadora digital funciona con base al procesamiento de numeros digitales,
y son el tipo de computadoras en el que se ha centrado el progreso moderno. Estas
se dividen en cuatro principales generaciones que son; 1) Primera generacion (1951-
1958), en la cual se usaron bulbos para almacenar la informacion y tarjetas perforadas
para cargar datos y programas. 2) Segunda generacion (1959-1964), con el invento del
transistor llego esta nueva generacion de computadoras, las cuales utilizaron cintas
y discos magneticos para almacenar informacion y disponıan de celdas fotoelectricas
para la mejor lectura de las tarjetas perforadas. 3) Tercera generacion (1964-1971),
aquı se da la llegada de los circuitos integrados a las computadoras, con lo cual se
incrementa el rendimiento de las maquinas, pudiendo ası trabajar a tal velocidad que
se podıa correr mas de un programa de manera simultanea. Las computadoras se
hicieron mas pequenas, mas rapidas y desprendıan menos calor. 4) Cuarta generacion
25
(1971-a la fecha), la colocacion de componentes mas pequenos en un chip, permite
crear el microprocesador, el cual rige las funciones principales en una computadora. Se
crean memorias electronicas, las cuales desechan a las memorias de nucleo magnetico
que se usaban anteriormente, aumentando ası su rapidez. Con la llegada de estas
tecnologıas, se hizo posible la creacion de la PC (Personal Computer).
Las computadoras siguen avanzando hasta nuestros dıas, creando mejores tecnicas
y desarrollando nuevas tecnologıas. Una parte importante de las computadoras hoy
en dıa es la Internet, que puede ser definida como red de redes, es decir, una red que
interconecta redes de computadoras entre sı. Una red de computadoras es un conjunto
de maquinas que se comunican a traves de algun medio (cable coaxial, fibra optica,
radiofrecuencia, lıneas telefonicas, etc.) con el objeto de compartir recursos.
Aunque se pueda pensar que internet inicio hace pocos anos, no es ası, sus inicios
nos remontan a la decada de los 60’s. En plena guerra frıa Estados Unidos creo una
red de uso exclusivamente militar, para que en caso de un ataque se pudiera tener
acceso a la informacion desde cualquier parte del paıs. El envio de datos deberıa
descansar en un mecanismo que pudiera manejar la destruccion parcial de la red, de
esta manera se decidio enviar la informacion en pequenos mensajes o paquetes, los
cuales contendrıan la direccion de destino, pero no una ruta especıfica para su arribo,
cada paquete buscarıa una ruta y al final el destinatario reensamblarıa el mensaje
original. Esta red se creo en 1969 y fue llamada ARPANET (Advanced Research
Projects Agency Network).
Esta red fue situada en diferentes universidades del paıs y crecio tanto que su
protocolo NCP (Network Control Protocol), quedo obsoleto. Entonces con el tiempo
se dio paso a un protocolo mas sofisticado, el TCP/IP (Transmission Control Pro-
tocol / Internet Protocol), que es el protocolo utilizado hasta nuestros dıas. TCP se
encarga de convertir los mensajes a paquetes en la maquina emisora y los reensambla
en la maquina destino, mientras que IP se encarga de buscar la ruta destino. En 1983
el segmento militar decide separarse de ARPANET y formar su propia red conocida
26
como MILNET (Militar Network). En 1984 la National Science Foundation, crea una
nueva red llamada NSFNET (National Science Foundation Network) y con un incre-
mento continuo de transmision de datos de la misma, logro absorber a ARPANET.
Sin embargo, el continuo crecimiento de nuevas redes de libre acceso, terminaron en
la union de estas con NSFNET, formando ası el embrion de lo que ahora es Internet.
Con la creacion de las paginas web y del primer explorador, Internet no ha dejado de
crecer y paso de ser una red de investigacion militar, a un negocio y eso ha sido lo
que impulsa su desarrollo.
4.2. Estructuras del controlador (driver) de sonido
Por otra parte, para el diseno de sıntesis de ondas, necesitamos conocer el fun-
cionamiento y caracterısticas principales de algunas funciones y estructuras que se
utilizaran posteriormente. Empecemos con la estructura WAVEFORMATEX, la cual
contiene la informacion mas comun de la forma de onda y define su formato, cuan-
do se requiere mayor informacion, esta sera incluida como primer miembro en otra
estructura con la informacion adicional. La siguiente es su estructura:
typedef struct {WORD wFormatTag;WORD nChannels;DWORD nSamplesPerSec;DWORD nAvgBytesPerSec;WORD nBlockAlign;WORD wBitsPerSample;WORD cbSize;}WAVEFORMATEX;
Donde, wFormatTag especifica el tipo de formato de la forma de onda; nChannels
especifica el numero de canales a utilizar, que puede ser monoaural para un canal
o estereo para dos canales; nSamplesPerSec es el numero de muestras por segun-
do que en cada canal se reproduciran o grabaran, si wFormatTag tiene especifica-
do WAVE FORMAT PCM, entonces los valores comunes de muestras por segundo
27
son: 8.0 KHz, 11.025 KHz, 22.05 KHz y 44.1 KHz; nAvgBytesPerSec requiere ha-
cer un promedio de la transferencia de datos en bytes por segundo, si wFormatTag
tiene especificado WAVE FORMAT PCM, entonces nAvgBytesPerSec debe ser igual
al producto de nSamplesPerSec y nBlockAlign; nBlockAlign es el alineamiento de
bloques en bytes, este es la unidad mınima de datos para el tipo de formato, si
wFormatTag tiene especificado WAVE FORMAT PCM, entonces nBlockAlign debe
ser igual al producto de nChannels y wBitsPerSample, dividido entre 8; wBitsPerSam-
ple son los bits por muestra para el tipo de formato, si wFormatTag tiene especificado
WAVE FORMAT PCM, entonces wBitsPerSample debe ser igual a 8 o 16; cbSize es
utilizada para agregar informacion extra de la estructura WAVEFORMATEX, cuando
el formato es diferente de PCM [9].
Quien se encarga de abrir el dispositivo de salida de la forma de onda es la funcion
waveOutOpen y su estructura es la siguiente:
MMRESULT waveOutOpen(LPHWAVEOUT {\it phwo},UINT uDeviceID,LPWAVEFORMATEX pwfx,DWORD dwCallback,DWORD dwCallbackInstance,DWORD fdwOpen );
Donde, phwo es ocupado para identificar y relacionar las diferentes funciones de
salida de forma de onda; uDeviceID identifica el dispositivo a utilizar, el cual puede
ser de entrada o salida; pwfx es una direccion de la estructura WAVEFORMATEX,
la cual identifica los datos de la forma de onda que seran enviados al dispositivo,
esta estructura sera vaciada inmediatamente despues que se pase a la funcion wave-
OutOpen; dwCallback es una direccion que asegura que la funcion regrese, ya sea
de un manejador de eventos, de un manejador de ventana, etc., esto dependera de
la bandera que se utilice (fdwOpen), si esta funcion no es usada, su valor puede
ser cero; dwCallbackInstance se usa para pasar datos al mecanismo de llamada de
regreso; fdwOpen es un parametro que usa banderas para abrir el dispositivo, las
28
banderas son las siguientes: CALLBACK EVENT permite manejar eventos; CALL-
BACK FUNCTION regresa algun procedimiento a una direccion; CALLBACK NULL
no tiene mecanismo de regreso y solo cuenta con los parametros iniciales; CALL-
BACK THREAD es un hilo identificado; CALLBACK WINDOW es un manejador de
ventana; WAVE ALLOWSYNC indica que un dispositivo de forma de onda sıncrono
puede estar abierto; WAVE FORMAT DIRECT especificada que el controlador ACM
(Audio Compression Manager) no llevara acabo las conversiones en los datos de audio;
WAVE FORMAT QUERY indica a waveOutOpen preguntar al dispositivo determina-
do si soporta el formato dado, pero el dispositivo no estara abierto; WAVE MAPPED
indica al parametro uDeviceID especificar un dispositivo de forma de onda para ser
mapeado.
Para detener el dispositivo de salida y reiniciar la corriente de posicion a cero, es
utilizada la funcion waveOutReset y su estructura es la siguiente:
MMRESULT waveOutReset(HWAVEOUT hwo);
donde hwo es el manejador del dispositivo de salida de forma de onda.
Una estructura importante es WAVEHDR, ya que define los parametros usados
para identificar un buffer de audio de forma de onda y su estructura es la siguiente:
typedef struct {LPSTR lpData;DWORD dwBufferLength;DWORD dwBytesRecorded;DWORD dwUser;DWORD dwLoops;DWORD dwFlags;
} WAVEHDR;
Donde, lpData es la direccion del buffer de la forma de onda; dwBufferLength es
la longitud en bytes del buffer; dwBytesRecorded es puesta cuando la estructura es
usada para entrada, este miembro especifica cuantos datos hay en el buffer; dwUser
son los datos de usuario; dwLoops es el numero de veces que la funcion se repite,
dentro de una iteracion; dwFlags son las banderas de abastecimiento de informacion
acerca del buffer: WHDR BEGINLOOP es el primer buffer en un lazo y solo puede
29
ser usado con buffer de salida; WHDR DONE es colocada en el controlador del dis-
positivo para indicar que ha finalizado el buffer y esta regresando a la aplicacion;
WHDR ENDLOOP es el ultimo buffer en el lazo y solo es usada con buffer de salida;
WHDR INQUEUE es puesto por windows para indicar que el buffer esta en cola para
tocar; WHDR PREPARED tambien es puesto por windows para preparar al buffer,
ya sea con una funcion de entrada o una de salida.
Para preparar un bloque de datos de la forma de onda y despues tocarlos utilizamos
la funcion waveOutPrepareHeader. Su estructura es la siguiente:
MMRESULT waveOutPrepareHeader(HWAVEOUT hwo,LPWAVEHDR pwh,UINT cbwh );
Donde, hwo es el manejador del dispositivo de salida de forma de onda; pwh
es una direccion de la estructura WAVEHDR, que define los bloques de datos para
prepararlos; cbwh es el tamano en bytes de la estructura WAVEHDR.
Una parte importante es la funcion waveOutWrite, ya que es la encargada de
mandar bloques de datos a la salida del dispositivo de forma de onda. Su estructura
es la siguiente:
MMRESULT waveOutWrite(HWAVEOUT hwo,LPWAVEHDR pwh,UINT cbwh );
Donde, hwo es el manejador del dispositivo de salida de forma de onda; pwh es
la direccion de una estructura WAVEHDR, la cual contiene informacion acerca del
bloque de datos; cbwh es el tamano en bytes de la estructura WAVEHDR.
Para limpiar la preparacion llevada a cabo por la funcion waveOutPrepareHeader
es utilizada la funcion waveOutUnprepareHeader, esta funcion debe ser llamada des-
pues de que el dispositivo haya finalizado con un bloque de datos y antes de liberar
el buffer. Su estructura es la siguiente:
30
MMRESULT waveOutUnprepareHeader(HWAVEOUT hwo,LPWAVEHDR pwh,UINT cbwh );
Donde, hwo es el manejador del dispositivo de salida de forma de onda; pwh
es la direccion de una estructura WAVEHDR, para identificar los datos que seran
limpiados; cbwh es el tamano en bytes de la estructura WAVEHDR.
Por ultimo tenemos a la funcion waveOutClose, que es la encargada de cerrar el
dispositivo de salida de forma de onda y su estructura es la siguiente:
MMRESULT waveOutClose( HWAVEOUT hwo );
Donde, hwo es el manejador del dispositivo de salida de forma de onda.
4.3. Programacion de las funciones de onda
Para la generacion de sonido en nuestro diseno, una de las funciones mas impor-
tantes es la que llamaremos FillBuffer. Esta funcion es la encargada de manipular las
diferentes formas de onda con las que trabajaremos, y tiene la siguiente estructura:
VOID FillBuffer ( LPBYTE pBuffer, int iFreq ){static double fAngle;
int i;for ( i = 0 ; i < BUFFER_SIZE ; i ++ ){pBuffer [i] = (BYTE) (127 + 127 * sin (fAngle));fAngle += 2 * PI * iFreq / SAMPLE_RATE ;if (fAngle > 2 * PI)fAngle - = 2 * PI;
}}
La funcion anterior genera datos digitales (bytes) que corresponden a una senal
analogica (en este caso un seno), que debe estar en el rango de frecuencias audibles
para el oıdo humano (de 20-20 KHz), esta sera almacenada en memoria con una razon
de muestras digitales que llamaremos SAMPLE RATE. Para generar una onda de 20
KHz es necesario que en cada ciclo se tomen mınimo dos muestras, por esta razon
31
el SAMPLE RATE toma el valor de 44100 Hz. Por ejemplo para generar una forma
de onda con una frecuencia de 8820 Hz por cada ciclo se tomaran 5 muestras, como
se muestra en la Figura 4.1, esto significa que el numero de muestras por segundo es
el SAMPLE RATE divido entre la frecuencia de la forma de onda. El seno de cada
muestra sera almacenado en la localidad de un buffer previamente definido.
Figura 4.1: Numero de muestras por cada ciclo.
Se puede aprovechar que la senal con la que se esta trabajando es una senal
periodica, de esta manera se puede trabajar con un solo ciclo incrementando las
localidades de memoria y repitiendo los angulos de fase. El primer angulo sera 0,
despues la variable fAngle es incrementada 2π veces la frecuencia dividida entre el
SAMPLE RATE, este procedimiento continua hasta que fAngle es mayor que 2π,
entonces sera decrementado en 2π para volver a retomar los angulos que ahora seran
almacenados en diferentes localidades de memoria de nuestro buffer. Cada localidad
de memoria es de 8 bits por esta razon la funcion seno esta dada entre 0 y 254 (00 a
FF) [8].
Por otro lado tenemos que, un seno es una porcion fundamental en la trigonometrıa,
en un triangulo rectangulo el valor del seno de un angulo agudo, es igual a la longi-
tud del cateto opuesto al angulo, dividida por la longitud de la hipotenusa. El valor
numerico del seno esta comprendido entre -1 y 1, la curva de este es el prototipo o
modelo de todas las sinusoides. Se tiene que un angulo representa la apertura de dos
lıneas que tienen un origen comun (vertice); un arco se define como la lınea circular
32
que rodea al angulo por el extremo de dos segmentos, las medidas de un angulo se
pueden expresar en radianes; el radian es el angulo cuyo arco tiene una longitud igual
al radio. Por lo tanto tenemos que, 1◦ = 0.01745 radianes y 1 radian = 57.3 grados, el
grado esta definido en trigonometrıa como el arco igual a 1/360 de la circunferencia
de un cırculo.
4.4. Visualizacion de las formas de onda
Mediante la sumatoria de senales simples, podemos obtener una senal compleja
que sea semejante a la forma de onda caracterıstica de algun instrumento musical.
Tomando en cuenta el teorema de Fourier, que dice: que por medio de la suma de
funciones periodicas de distinta frecuencia es posible obtener una senal compleja,
hemos creado un programa en Visual C++ que muestra graficamente el teorema de
Fourier [3].
En la Figura 4.2 se muestra el resultado de nuestro programa, que se encuentra
dividido en cuatro ventanas; en la primera se representa la frecuencia mas baja lla-
mada frecuencia fundamental; en las ventanas dos y tres se representan el tercer y
noveno armonico respectivamente, los cuales son multiplos de la frecuencia funda-
mental; en la ventana cuatro podemos observar una forma de onda compleja, la cual
es el resultado de la sumatoria de las tres ventanas anteriores.
Tenemos que una serie de Fourier esta representada por una sumatoria de senos
y cosenos, su representacion matematica es la siguiente:
f(t) = a0
∞∑
n=1
cos(kw0t) + bk
∞∑
n=1
sen(kw0t) (4.1)
Una senal por compleja que sea se puede representar mediante la funcion f(t),
las funciones pueden ser pares e impares, las funciones pares tienen una grafica que
debe ser geometrica respecto al eje vertical, las funciones impares tienen su grafica
simetrica con el origen, tambien existen funciones que no cumplen con la definicion
de funcion par e impar.
33
En las ventanas de la Figura 4.2 tenemos dos barras de desplazamiento, la barra
horizontal representa la frecuencia (kw0t), la barra vertical representa la amplitud de
la senal (a0, ak,bk). Si la senal es par entonces, bk = 0, y la senal estara represen-
tada por cosenos. Si la senal es impar entonces, a0 y ak = 0, por lo tanto la senal
estara representada por senos. En la ventana superior izquierda tenemos representada
a la senal: a seno(w0t); la ventana superior derecha representa: ak seno(3w0t); la ven-
tana inferior izquierda representa: ak seno(9w0t); y por ultimo en la ventana inferior
derecha, queda representada graficamente la sumatoria de las ventanas anteriormente
Figura 4.2: Representacion grafica de la Serie de Fourier, mediante un programadisenado en C++.
34
mencionadas, dando la funcion: f(t) = a seno(w0t)+akseno(3w0t)+akseno(9w0t), que
es la representacion de la Ecuacion 4.1.
Estas ventanas se implementan con un buffer y algunas estructuras de audio,
para obtener el sonido de las senales que representan dichas ventanas, por lo tanto,
vamos a obtener la respuesta grafica y el audio, que pueden ser semejantes a cualquier
instrumento musical.
4.5. Anatomıa de una tarjeta de sonido
Una parte muy importante de este proyecto es la tarjeta de sonido, ya que per-
mitira implementar la parte de audio en nuestro proyecto. En un principio la PC
(Personal Computer) no fue disenada para trabajar con sonido, sin embargo, con el
desarrollo de nuevas aplicaciones (video juegos, musica electronica, etc.), tuvo que ser
desarrollado un hardware disenado para controlar el sonido y que fuese compatible
con la PC, de esta manera en la decada de los 80’s aparece la tarjeta de sonido.
En la actualidad las tarjetas de sonido se encuentran divididas en dos partes: la
parte analogica y la parte MIDI (Musical Instrument Digital Interface) [6]. En la
Figura 4.3 se muestra el diagrama a bloques de una tarjeta de sonido.
Se puede observar que la parte analogica se encuentra subdividida en tres bloques;
el primero es un convertidor analogico-digital, que es el encargado de transformar los
datos analogicos de la entrada (microfono, guitarra, etc.) a datos digitales, ya que la
PC solo trabaja con este tipo de datos; en el segundo bloque se encuentran los drivers
de audio, que usa windows para manipular los datos que le pasara el primer bloque;
y por ultimo el tercer bloque es un convertidor digital-analogico, que realiza una
operacion inversa al primer bloque, para que el escucha pueda interpretar el sonido.
La segunda parte se encuentra dividida en cuatro bloques; los bloques de entrada
y salida son un receptor universal, los cuales se encargan de mandar y recibir datos;
el bloque del sintetizador de sonido, consta de dos formas de sintetizacion de datos,
una es sintetizacion FM, la cual se encarga de imitar el sonido por medio de formulas
35
Figura 4.3: Diagrama a bloques de una tarjeta de sonido.
matematicas y la otra es la sıntesis por tabla de onda, en la cual ya no se crea
musica computarizada, sino que se busca en una tabla con muestras de ondas del
instrumento deseado [5]. Cabe mencionar que la parte de MIDI no sera requerida
para este proyecto.
4.6. Resumen
En este capıtulo presentamos lo mas relevante del diseno de nuestro sintetizador de
notas musicales, tambien presentamos la programacion de las estructuras de audio,
ası como el metodo que utilizamos para realizar la sıntesis de onda y por ultimo
describimos como se encuentra estructurada una tarjeta de sonido. En el siguiente
capıtulo presentaremos el diseno de la interfaz la grafica de nuestro sistema.
36
Capıtulo 5
Diseno de la Interfaz Grafica
En este capıtulo presentaremos el diseno la interfaz grafica, la cual es el medio
de comunicacion entre el usuario y las estructuras utilizadas en el diseno de sıntesis
de ondas. Se plantearan conceptos necesarios para su comprension, tales como: pıxel,
mapa de bits, recurso grafico, ventana madre, ventana hija, sistema de coordenadas,
entre otros.
5.1. Pixeles y mapas de bits
Para dibujar sobre dispositivos graficos se utiliza la GDI (Graphics Device In-
terface), la cual se encarga de llamar las rutinas de diversos dispositivos (drivers de
video, impresora, y trazadores graficos). Las aplicaciones graficas utilizan un sistema
de coordenadas (x, y) en el area de dibujo, para saber la ubicacion de cada punto
que se encuentre en pantalla, el valor x da la ubicacion del punto sobre el eje x,
con la ubicacion predeterminada 0 en el extremo izquierdo, desplazandose de izquier-
da a derecha, el valor de y es la ubicacion del punto en el eje y, con la ubicacion
predeterminada 0 en el extremo superior, desplazandose de arriba hacia abajo.
Un punto que representa la menor unidad grafica de medida de una pantalla es
llamado pıxel. La imagen digital de algun dibujo es conocida como mapa de bits, la
imagen esta constituida por pıxeles, donde cada uno corresponde a uno o mas bits
del mapa, por ejemplo: un mapa de bits de un solo color requiere un bit por pıxel,
37
mientras que un mapa de bits de mas de un color requiere varios bits por pıxel.
5.2. Ventanas, barras, y otros controles graficos
Existen elementos que interactuan directamente con el usuario, tales como: cajas
de dialogo, ıconos, cursores, mapas de bits, etc., estos elementos son conocidos como
recursos. La lista de todos los recursos que utilice alguna aplicacion se encuentra en
un archivo con extension .rc, los recursos se guardan en un directorio y pueden ser
editados directamente (colocar barras de desplazamiento, cajas de texto, botones de
pulsacion, etc.), con los editores de recursos de Visual C++ [2].
Una ventana sirve de fondo para los controles y para los graficos, se pueden utilizar
tantas ventanas como se necesiten y dependiendo de la utilidad que se les de, estas
pueden ser de diferentes tipos. Se pueden crear ventanas desde el editor de dialogos de
Visual C++ o escribir el codigo en un archivo .cpp, como se muestra a continuacion:
CVentanaPpal::CVentanaPpal(){
// Crear la ventana principalCreate( NULL, "Windows - C++", WS_OVERLAPPEDWINDOW,CRect( 175, 100, 465, 300), NULL, NULL, 0, NULL );
}
Las ventanas estan organizadas jerarquicamente; una ventana padre o marco prin-
cipal, ventana cliente o area de cliente y ventana hija o ventana marco de documento,
la ventana padre es una ventana convencional; esto es, tiene una barra de tıtulo, una
barra de herramientas, un menu de control, un borde que permite redimensionar la
ventana y botones para maximizar, minimizar y cerrar la ventana, el area de cliente
de la ventana padre es denominada ventana cliente, en esta se contienen las ventanas
hijas, cada una de las cuales visualizan un documento(Figura 5.1).
5.3. Programando la interfase grafica
Una clase es una estructura de datos cuyos campos son metodos. Los metodos
tambien son conocidos como funciones, estos son la base de las aplicaciones y se
38
Figura 5.1: Jerarquıa de ventanas.
encuentran declaradas en diversos archivos de cabecera incluidos en Visual C++. Para
indicarle a una aplicacion en ejecucion, que ha sucedido algun evento (clic sobre un
boton, mover el raton, pulsar una tecla) es necesario enviar una notificacion la cual es
conocida como mensaje. La aplicacion responde con una accion, que esta determinada
por la ejecucion del codigo en una funcion, esto significa que enviar un mensaje
equivale a ejecutar una funcion dentro de una aplicacion.
Para la implementacion de la interfase de nuestra aplicacion contaremos con una
ventana como la que se muestra en la Figura 5.2, la cual mezclara una senal funda-
mental con cinco de sus armonicos, estas senales se visualizaran en la ventana ası como
la senal resultante. Contara tambien con una serie de botones, los cuales simularan
las teclas del piano y al hacer clic en ellas se escuchara la senal antes mencionada.
A continuacion explicamos el procedimiento para la realizacion del software antes
mencionado en el lenguaje de programacion Visual.C++.
Inicialmente necesitamos crear un documento vacio (esqueleto de la aplicacion),
para esto de clic en la orden new del menu file, esto invocara a Class Wizard, en la
pestana projects se elige una aplicacion MFC (Microsoft Foundation Class) AppWizard
[exe] y ponga el nombre del proyecto (en este caso lo llamaremos Sintetizador) y la
39
Figura 5.2: Interfaz grafica de la aplicacion.
localizacion, las otras opciones en esta ventana son las dadas por omision. En ese
momento comienzan los pasos que genera Class Wizard; en el paso 1 se elige un
documento simple; en los pasos 2 y 3 se toman las opciones por omision; en el paso 4
se desactivan las tres primeras casillas (Docking Toolbar, Inicial Status Bar y Printing
and Print Preview), dejando solo los controles 3D; en el paso 5 se toman las opciones
por omision; y en el paso 6 se elige la opcion CFormView del menu Base Class,
para obtener un formulario como vista principal. Al dar clic en el boton finalizar, se
muestra la informacion del proyecto que se realizara cuando demos clic en el boton
OK de esta ventana.
El paso siguiente es dibujar sobre la vista cinco barras verticales, las cuales contro-
laran la amplitud de los armonicos de la frecuencia fundamental, una barra horizontal
que servira como afinador y una caja de texto por cada barra, en donde se visua-
lizara en valor de la misma al ser pulsada. Cada objeto cuenta con un identificador
40
que es llamado ID, para modificarlo es necesario: entrar al cuadro de propiedades del
objeto y asignarle un nombre que sea comodo para ser manipulado. Cabe mencionar
que usted puede acomodar los botones como mas le convenga.
Para facilitar la entrada y salida de datos a traves de controles se utilizan variables
miembro que los representen, para que el codigo trabaje sobre esas variables y se olvide
de los controles. Ejecute Class Wizard (Ctrl.+ w), de clic en la pestana Member
Variables y seleccione el ID de la barra que desee, ahora pulse el boton Add Variable..
y anada para la barra horizontal la variable m CtrlBarraH1, para las barras verticales
agregue las variables m CtrlBarraV1 hasta m CtrlBarraV5, todas de categorıa Control
y tipo CScrollBar, para la caja de texto de la barra horizontal la variable aH1 y para
las cajas de texto de las barras verticales las variables aV1 hasta aV5, todas estas de
tipo int.
Para inicializar las barras de desplazamiento es necesario modificar la funcion
miembro OnInitialUpdate, ya que es la primera funcion de la vista en ejecutarse,
esta se encuentra en el archivo fuente sintetizadorview.cpp. Edite la funcion como se
muestra a continuacion:
void CSintetizadorView::OnInitialUpdate(){
CFormView::OnInitialUpdate();GetParentFrame()->RecalcLayout();ResizeParentToFit(false);
m_CtrlBarraH1.SetScrollRange(415, 466, false);m_CtrlBarraH1.SetScrollPos(440, false);
m_CtrlBarraV1.SetScrollRange(0, 16, false);m_CtrlBarraV1.SetScrollPos(0, false);.........
m_CtrlBarraV5.SetScrollRange(0, 16, false);m_CtrlBarraV5.SetScrollPos(0, false);
UpdateData(false);}
La funcion SetScrollRange asigna los valores mınimo y maximo para la barra de
41
desplazamiento especificada. La funcion SetScrollPos situa el cuadro de desplazamien-
to en la posicion indicada.
Cuando el usuario actue sobre una de las barras de desplazamiento se genera un
mensaje, si la barra es horizontal el mensaje sera WM HSCROLL y si la barra es
vertical el mensaje sera WM VSCROLL, esto hara que se ejecute la funcion asocia-
da OnHScroll o OnVScroll. Para esto invoque Class Wizard y de clic en la ventana
Message Maps, enseguida seleccionando la clase CSintetizadorView, el objeto CSinte-
tizadorView y el mensaje WM HSCROLL, de clic en el boton Add Fuction y despues
en el boton Edit Code y edite la funcion OnHScroll de la siguiente forma:
void CSintetizadorView::OnHScroll(UINT nSBCode, UINT nPos,CScrollBar* pScrollBar)
{int nNuevaPo = pScrollBar->GetScrollPos();
switch( nSBCode ){
case SB_LEFT:nNuevaPo = 415;break;
case SB_RIGHT:nNuevaPo = 466;break;
case SB_PAGERIGHT:nNuevaPo = min(466, nNuevaPo + 5);break;
case SB_PAGELEFT:nNuevaPo = max(415, nNuevaPo - 5);break;
case SB_LINERIGHT:nNuevaPo = min(466, nNuevaPo + 1);break;
case SB_LINELEFT:nNuevaPo = max(415, nNuevaPo - 1);break;
case SB_THUMBTRACK:nNuevaPo = nPos;break;default:;
}pScrollBar->SetScrollPos( nNuevaPo );
42
aH1 = m_CtrlBarraH1.GetScrollPos();Graficador();
CFormView::OnHScroll(nSBCode, nPos, pScrollBar);}
Un procedimiento similar se hace para la funcion OnVScroll, esta funcion se ejecu-
ta igual que la anterior pero ahora con el mensaje WM VSCROLL, y a continuacion
edıtela de la siguiente forma:
void CSintetizadorView::OnVScroll(UINT nSBCode, UINT nPos,CScrollBar* pScrollBar)
{int nNuevaPos = pScrollBar->GetScrollPos();l
switch( nSBCode ){
case SB_LEFT:nNuevaPos = 0;break;
case SB_RIGHT:nNuevaPos = 16;break;
case SB_PAGERIGHT:nNuevaPos = min(16, nNuevaPos + 2);break;
case SB_PAGELEFT:nNuevaPos = max(0, nNuevaPos - 2);break;
case SB_LINERIGHT:nNuevaPos = min(16, nNuevaPos + 1);break;
case SB_LINELEFT:nNuevaPos = max(0, nNuevaPos - 1);break;
case SB_THUMBTRACK:nNuevaPos = nPos;break;
CFormView::OnVScroll(nSBCode, nPos, pScrollBar);}
pScrollBar->SetScrollPos( nNuevaPos );aV1 = m_CtrlBarraV1.GetScrollPos();aV2 = m_CtrlBarraV2.GetScrollPos();aV3 = m_CtrlBarraV3.GetScrollPos();aV4 = m_CtrlBarraV4.GetScrollPos();aV5 = m_CtrlBarraV5.GetScrollPos();
43
Graficador();
CFormView::OnVScroll(nSBCode, nPos, pScrollBar);}
Las variables miembro aH1 y aV’s son igualadas con la posicion en la que se
encuentre la barra de desplazamiento para ser mandadas a la caja de texto y a la
funcion Graficador que mas tarde sera declarada. Para una mejor manipulacion de
estas variables, borre su declaracion que se encuentra en el archivo sintetizadorview.h
y declarelas como variables globales en el archivo sintetizadorview.cpp.
Al final de cada codigo estamos llamando a una funcion Graficador, esta funcion
es la encargada de dibujar la senal fundamental, los armonicos y la resultante en la
vista principal. Para darla de alta ocuparemos AppWizard, esto lo hacemos dando clic
en la pestana ClassView de la ventana WorkSpace, desplegamos el menu sintetizador
classes y damos clic derecho sobre la clase CSintetizadorView, al hacerlo aparecera un
menu y daremos clic sobre la opcion Add Member Function, aparecera una ventana
en donde preguntara el tipo de funcion, que sera void y la declaracion o nombre de
funcion, que sera Graficador. Edite esta funcion de la manera siguiente:
void CSintetizadorView::Graficador(){
CClientDC dc(this);CClientDC dc2(this);CClientDC dc3(this);CClientDC dc4(this);CClientDC dc5(this);CClientDC dc6(this);CClientDC dc7(this);
dc.SetMapMode(MM_ISOTROPIC);dc.SetViewportExt(630,20);dc.SetViewportOrg(47,400);
dc2.SetMapMode(MM_ISOTROPIC);dc2.SetViewportExt(630,20);dc2.SetViewportOrg(47,560);
dc3.SetMapMode(MM_ISOTROPIC);dc3.SetViewportExt(630,20);dc3.SetViewportOrg(250,416);
44
dc4.SetMapMode(MM_ISOTROPIC);dc4.SetViewportExt(630,20);dc4.SetViewportOrg(250,560);
dc5.SetMapMode(MM_ISOTROPIC);dc5.SetViewportExt(630,20);dc5.SetViewportOrg(450,416);
dc6.SetMapMode(MM_ISOTROPIC);dc6.SetViewportExt(630,20);dc6.SetViewportOrg(450,560);
dc7.SetMapMode(MM_ISOTROPIC);dc7.SetViewportExt(630,20);dc7.SetViewportOrg(700,420);
RedrawWindow();for(x=0;x<=2000; x ++){
w = (440*2*3.14);w2 = (880*2*3.14);w3 = (1320*2*3.14);w4 = (1760*2*3.14);w5 = (2200*2*3.14);w6 = (2640*2*3.14);
ysen=(int)(87+87*sin(x*w/440));ysen2=(int)(8+aV1*sin(x*w2/880));ysen3=(int)(8+aV2*sin(x*w3/1320));ysen4=(int)(8+aV3*sin(x*w4/1760));ysen5=(int)(8+aV4*sin(x*w5/2200));ysen6=(int)(8+aV5*sin(x*w6/2640));
resul=(int)((87+87*sin(x*w/440))+(8+aV1*sin(x*w2/440))+(8+aV2*sin(x*w3/440))+(8+aV3*sin(x*w4/440))+(8+aV4*sin(x*w5/440))+(8+aV5*sin(x*w6/440)));
dc.SetPixel(x*8,ysen*50,RGB(0,0,0));dc2.SetPixel(x*8,ysen2*300,RGB(0,0,0));dc3.SetPixel(x*8,ysen3*300,RGB(0,0,0));dc4.SetPixel(x*8,ysen4*300,RGB(0,0,0));dc5.SetPixel(x*8,ysen5*300,RGB(0,0,0));dc6.SetPixel(x*8,ysen6*300,RGB(0,0,0));dc7.SetPixel(x*12,resul*80,RGB(0,0,0));
}
UpdateData( false );}
Declare las variables ysen a ysen6, x y resul, como tipo int y las variables w a w6
de tipo double, todas como variables globales. La funcion RedrawWindow se encarga
de limpiar la pantalla cada vez que movemos las barras y se dibuja la funcion seno.
45
El CClientDC nos sirve para obtener el contexto de dispositivo del area de cliente y
acceder a sus atributos a traves de la funcion miembro de la clase del contexto de
dispositivo. La funcion SetMapMode se encarga de ajustar el sistema de coordenadas
a algun modo de proyeccion que en este caso es MM ISOTROPIC, el cual es un modo
que se puede personalizar, permitiendonos manipular el tamano de las figuras cuando
se redimensione la ventana. SetViewportExt establece la medida del ancho del dibujo.
SetViewportOrg situa el origen logico 0,0 de coordenadas, en algun punto del area
de cliente (las funciones expuestas en la funcion Graficador son opcionales). SetPixel
dibuja un punto en la pantalla, las coordenadas que utiliza son referidas por un for y
por el resultado de las operaciones matematicas, para que estas operaciones se lleven
a cabo se necesita declarar la librerıa math.h al inicio de sintetizadorview.cpp.
Siguiendo con la aplicacion se pretende visualizar la octava de un teclado en la
vista principal. El primer paso es dibujar trece botones en el formulario, acomodelos de
tal forma que aparenten el tamano de una tecla blanca y una tecla negra como las del
teclado. Cuando creamos un boton de mapa de bits es necesario poner su propiedad
Owner Draw a valor true, esto hace que se visualice el mapa de bits dependiendo del
estado del boton, enseguida anadiremos dos mapas de bits por cada boton para que
aparenten una tecla, una para cuando la tecla este pulsada y otra para cuando este en
reposo, los mapas de bits deben ser creados por usted en cualquier programa de edicion
de imagenes (Paint Brush, Corel Draw, etc.) en nuestro caso usamos Macromedia
Flash. Ahora abra el editor de recursos para importar estas imagenes como recursos
de tipo bitmap, asigne a cada una de las imagenes un ID compuesto por el titulo del
boton (en nuestro caso BOTON) mas una letra U o D (Up, Down) correspondiente al
estado del boton, ponga los ID entre comillas para sean considerados como cadenas y
no como constantes (BOTONU, BOTOND). En el archivo sintetizadorview.h declare
un objeto miembro de CBitmapButton.
class CSintetizadorView : public CFormView{
public:
46
CBitmapButton Boton1;// Overrides
}
Por ultimo, para cargar los recursos mapa de bits, el boton debe recibir el mensaje
AutoLoad, el cual tiene dos parametros: el ID del boton y la direccion al objeto. Esta
operacion se realiza desde la funcion miembro OnInitialUpdate.
void CSintetizadorView::OnInitialUpdate(){
CFormView::OnInitialUpdate();GetParentFrame()->RecalcLayout();ResizeParentToFit(false);
Boton1.AutoLoad(IDC_BOTON1, this);UpdateData(false);
}
Repita los pasos anteriores para los demas botones.
Cada vez que se pulsa un boton es generado el mensaje WM COMMAND, este
mensaje es manipulado por la funcion OnCommand, la cual se encargara de llamar a
la funcion fillplaybuffer y asignarle un valor dependiendo del boton pulsado. Ahora eje-
cute Class Wizard, seleccione la clase CSintetizadorView, el objeto CSintetizadorView
y el mensaje OnCommand, oprima el boton Add Function.. y enseguida Edit Code y
edite esta funcion de la siguiente manera, siguiendo la secuencia:
BOOL CSintetizadorView::OnCommand(WPARAM wParam, LPARAM lParam){
switch (wParam){case IDC_BOTON1:
raiz = pow(cua, -9);fillplaybuffer();break;
case IDC_BOTON2:raiz = pow(cua, -8);fillplaybuffer();break;
...
...
...case IDC_BOTON10:
raiz = 1;fillplaybuffer();
47
break;.........
case IDC_BOTON13:raiz = pow(cua, 3);fillplaybuffer();break;
}
return CFormView::OnCommand(wParam, lParam);}
5.4. Programando el controlador driver de sonido
El parametro wParam, contiene el elemento del recurso que ha hecho que se envıe
este mensaje, de esta manera mediante el uso de un switch, se puede identificar el
boton sobre el que se ha pulsado. El valor raiz es enviado a la funcion fillplaybuffer,
este valor determinara la nota que tocara cada boton, esto se explicara mas adelante.
La funcion fillplaybuffer es la encargada de llenar un buffer con los datos de la
senal fundamental y sus armonicos, y de mandarlos de la tarjeta de sonido. Utilizan-
do AppWizard declare la funcion fillplaybuffer de tipo void y edıtela de la siguiente
manera:
void CSintetizadorView::fillplaybuffer(){
HWAVEOUT fd;WAVEFORMATEX wf;WAVEHDR wh;wf.wFormatTag = WAVE_FORMAT_PCM;wf.nChannels = 1;wf.nSamplesPerSec = SAMPLE_RATE;wf.wBitsPerSample = 8;wf.nBlockAlign = 1;wf.nAvgBytesPerSec = SAMPLE_RATE;wf.cbSize = 0;
waveOutOpen(&fd, WAVE_MAPPER, &wf, 0, 0, CALLBACK_NULL);
for(i=0;i<MAXBUF;i++){
son[i]=(BYTE)((47+47*sin(fAngle))+(16+aV1*sin(fAngle2))+(16+aV2*sin(fAngle3))+(16+aV3*sin(fAngle4))+(16+aV4*sin(fAngle5))+(16+aV5*sin(fAngle6)));
48
fAngle += 2 * pi * aH1*raiz/SAMPLE_RATE;fAngle2 += 2 * pi * aH1*2*raiz/SAMPLE_RATE;fAngle3 += 2 * pi * aH1*3*raiz/SAMPLE_RATE;fAngle4 += 2 * pi * aH1*4*raiz/SAMPLE_RATE;fAngle5 += 2 * pi * aH1*5*raiz/SAMPLE_RATE;fAngle6 += 2 * pi * aH1*6*raiz/SAMPLE_RATE;
if(fAngle > 2*pi){
fAngle -= 2*pi;}
if(fAngle2 > 2*pi){
fAngle2 -= 2*pi;}
if(fAngle3 > 2*pi){
fAngle3 -= 2*pi;}
if(fAngle4 > 2*pi){
fAngle4 -= 2*pi;}
if(fAngle5 > 2*pi){
fAngle5 -= 2*pi;}
if(fAngle6 > 2*pi){
fAngle6 -= 2*pi;}
}wh.lpData = son;wh.dwBufferLength = MAXBUF;wh.dwFlags = 0L;wh.dwLoops = 0L;
waveOutPrepareHeader(fd, &wh, sizeof(WAVEHDR));waveOutWrite(fd, &wh, sizeof(WAVEHDR));Sleep(150);waveOutReset(fd);waveOutUnprepareHeader(fd, &wh, sizeof(WAVEHDR));waveOutClose(fd);
}
Declare las variables; i como tipo entero, fAngle a fAngle6 como tipo double y
son[MAXBUF] como tipo CHAR. La estructura utilizada para el llenado de buffer es
49
parecida a la funcion fillbuffer explicada en el capitulo 4, solo que en esta ocasion rea-
liza una serie de Fourier con los parametros antes mencionados. El parametro fAngle
recibe el valor de la barra horizontal, el cual tiene por default 440 Hz, al mismo tiempo
es multiplicado por un valor que corresponde al armonico en el que se encuentra y por
un valor raiz que es enviado por el boton que se pulso. Defina un parametro cua con
un valor de raız doceava de dos, este valor es el que determina el intervalo que hay de
una tecla a la siguiente, de esta manera en la funcion OnCommand, el parametro cua
es elevado a cierta potencia dependiendo del boton en el que se encuentre (nuestra
tecla central es la nota LA4) y se iguala a raiz (Ecuacion 5.1), el cual es enviado a
fAngle para determinar la nota. La frecuencia 440 Hz, se encuentra en el boton 10 y
es a partir de esta que se determinan las demas notas de la octava.
raiz = pow(cua,Boton); (5.1)
Defina las variables SAMPLE RATE con un valor de 11025, pi con un valor de
3.14159 y MAXBUF con un valor de 3200. Las estructuras utilizadas en esta fun-
cion ya han sido explicadas en el capıtulo 4, no olvide incluir el archivo de cabecera
mmsystem.h e incluir en las opciones de link la librerıa winmm.lib.
5.5. Resumen
En este capıtulo presentamos conceptos importantes para el diseno, tales como
sistema de coordenadas, pıxel, mapas de bits, recursos, entre otros. Al mismo tiempo
desarrollamos y explicamos los pasos a seguir para la implementacion del sintetizador,
mostrando cada uno de los principales programas para la manipulacion de audio
analogico.
50
Capıtulo 6
Pruebas y Resultados
En el capıtulo anterior explicamos como asignarle ciertos comportamientos a cada
uno de los elementos utilizados en este proyecto, tales como el rango a las barras de
desplazamiento, el sonido que se produce al pulsar los diferentes botones, dibujar las
diferentes senales ocupadas, etc. En este capıtulo presentamos algunos resultados de
nuestro sistema Sintetizador y describiremos su operacion.
6.1. Ambiente de compilacion y generacion de codi-
go
Usando el lenguaje de programacion Visual C++, realizamos un tipo de com-
pilacion llamado release, con esto conseguimos generar un archivo ejecutable Sinte-
tizador.exe que podra ser ejecutado en cualquier sistema operativo Windows (95 o
superior). Para generar un archivo ejecutable .exe de tipo release, es necesario llevar
acabo los siguientes pasos; a) Seleccione la configuracion Win32 Release de la caja de
herramientas Set Active Project Configuration, que se encuentra en el menu Build de
la barra de herramientas, b) Al cambiar de un tipo de compilacion a otra, debera es-
pecificar en las opciones de linker la librerıa winmm.lib, para esto presione ALT+F7,
seleccione la pestana Link, escriba la librerıa en la caja de texto Object/library modu-
les y presione el boton OK para hacerla valida, c) Y por ultimo en el menu Build
de la barra de herramientas, de clic en la opcion Build Sintetizador.exe. Cabe men-
51
Figura 6.1: Vista principal del sintetizador.
52
cionar que con el tipo de compilacion Debug, el archivo ejecutable no operara en
PC’s (Personal Computer) que no cuenten con el software Visual C++ instalado.
Una vez creado el archivo ejecutable este se encontrara en la carpeta release, la cual
esta ubicada en la carpeta principal de nuestro proyecto.
6.2. Aspecto visual del sintetizador
Al dar doble clic en el archivo Sintetizador.exe se visualizara nuestra aplicacion ya
terminada, esta tendra un aspecto similar al mostrado en la Figura 6.1. En la esquina
superior izquierda de esta figura se encuentra un marco con el tıtulo Afinador que
contiene; una barra horizontal y una caja de texto. La barra horizontal tiene un valor
inicial de 440 Hz, un valor maximo de 466 Hz y un valor mınimo de 415 Hz, como se
muestra en la Figura 6.2, cuando el usuario actue sobre la barra esta modificara su
valor, el cual se visualizara en la caja de texto y sera enviado a la funcion que esta rea-
lizando la sıntesis (fillplaybuffer). Esta funcion es la encargada de llenar el buffer de
audio para ser enviado a la tarjeta de sonido, lo cual significa que de acuerdo con los
valores maximos y mınimos en la barra, las teclas pueden llegar a subir o a bajar un
tono, por lo tanto, la barra nos servira como un afinador. Cuando el usuario actue
sobre la barra podra modificar el tono de las teclas para que este sea de su agrado.
Figura 6.2: Valores mınimo, central y maximo de la barra horizontal.
Debajo del marco Afinador, se encuentra un marco con el tıtulo Amplitud que
contiene cinco barras verticales y cinco cajas de texto. Las barras representan la
amplitud de los armonicos de la senal fundamental utilizados, los cuales se pueden
visualizar en la parte inferior izquierda de la vista. En la parte inferior derecha se
53
visualiza la senal resultante de la suma de los armonicos, la cual es enviada a la tarjeta
de sonido. Cuando el usuario actua sobre alguna de las barras verticales cambiara su
valor, el cual se visualizara en su respectiva caja de texto situada debajo de cada barra
como se muestra en la Figura 6.3. Las barras pueden obtener un valor mınimo de cero
y un maximo de dieciseis, esto es por razones de normalizacion, ya que en nuestro
programa fuente, la amplitud maxima de cada armonico es de treinta y dos, este
valor representa el 12.6% del 100% que nuestro buffer puede tocar sin distorsionar el
sonido (8 bits, de 0 a 254), siendo la senal fundamental la de mayor amplitud con un
37%. Cuando sumamos la senal fundamental con la amplitud maxima de los cinco
armonicos nos da el 100% de nuestro buffer.
Figura 6.3: Barras de desplazamiento verticales, con una amplitud modificada.
6.3. Control de parametros del sintetizador
Cuando el usuario actue sobre alguna de las barras su valor es enviado a la funcion
que se encarga de realizar la sıntesis para el llenado del buffer, al mismo tiempo es
enviado a una funcion encargada de graficar la senal fundamental, los armonicos
y la resultante (la funcion Graficador fue mostrada en el capıtulo 4). Por ejemplo,
cuando el usuario actua sobre la barra Arm 3 su valor es enviado a las funciones antes
mencionadas y se visualiza un cambio de amplitud en la senal ubicada en el marco
54
con el titulo Tercer Armonico, que encontramos en la parte inferior izquierda de la
vista principal del proyecto, al mismo tiempo visualizamos un cambio en la senal
resultante ubicada en el marco con tıtulo Resultante, que encontramos en la esquina
inferior derecha de la vista de nuestro proyecto, como se muestra en la Figura 6.4.
Figura 6.4: Tercer armonico con amplitud modificada.
Cuando el usuario actua sobre la barra Arm 5 el valor de este es enviado a la
funcion Graficador y se visualiza un cambio de amplitud en la senal ubicada en el
marco con el tıtulo Quinto Armonico, que se encuentra en la parte inferior izquierda
de la vista principal del proyecto, al mismo tiempo visualizamos un cambio en la senal
resultante ubicada en el marco con tıtulo Resultante, que encontramos en la esquina
inferior derecha de la vista de nuestro proyecto como se muestra en la Figura 6.5.
6.4. Controlando los armonicos
El usuario puede actuar sobre varias barras modificando diferentes armonicos,
cuando esto ocurra los valores de las barras seran enviados a las funciones antes
mencionadas y se visualizara un cambio en los marcos situados en la parte inferior de
la vista principal de nuestro proyecto como se muestra en la Figura 6.6.
55
Figura 6.5: Quinto armonico con amplitud modificada.
Figura 6.6: Todos los armonicos modificados
56
La razon por la que utilizamos solamente cinco armonicos es por fines practicos,
ya que uno de los principales objetivos es demostrar que se puede lograr una sıntesis
de audio mediante la serie de Fourier (usted puede adicionar o quitar el numero de
armonicos que desee, modificando el proyecto desde Visual C++).
6.5. Control del teclado
En la parte superior derecha encontramos un marco con el tıtulo Teclado como el
que se muestra en la Figura 6.7. El teclado esta conformado por 13 botones, que con
la ayuda de un par de mapas de bits simulan las teclas de un sintetizador, ya sean
en estado de reposo o presionadas como se muestran en la Figura 6.8, y su principal
objetivo es que el usuario tenga una vista mas amigable al interactuar con el proyecto.
Figura 6.7: Vista del Teclado.
El teclado cuenta con una frecuencia central de 440 Hz, que corresponde a la nota
LA4 y se encuentra ubicada en la tecla numero 10, es a partir de esta que se calcula
el valor de las demas teclas, multiplicando la frecuencia central por 12√
2 para subir
medio tono y se ubica en la tecla numero 11 y multiplicar la frecuencia central por
( 12√
2)−1 para bajar medio tono y se ubicara en la tecla numero 9, para las demas
teclas es necesario elevar el valor 12√
2 a una potencia positiva o negativa dependiendo
57
de la tecla (para mayor informacion consulte el capıtulo 4). Estos valores son enviados
a la funcion fillplaybuffer mencionada en capıtulos anteriores, para realizar el llenado
del buffer y enviarlo a la salida de la tarjeta de sonido.
Figura 6.8: a)Tecla en reposo. b)Tecla pulsada.
A continuacion se muestra una tabla, con los valores que deben tener las barras
para asemejarse a un Oboe o a un Organo de Jazz, el sonido fue comparado con un
sintetizador marca CASIO, modelo CT-680:
Tabla 6.1: Valores de las barras de desplazamiento
INTRUMENTO Afinador Arm2 Arm3 Arm4 Arm5 Arm3OBOE 450 12 10 0 8 8Organo de Jazz 450 16 0 0 14 11
6.6. Resumen
En este capıtulo presentamos la utilizacion de nuestro proyecto mostrando grafica
y textualmente los principales pasos a seguir para su funcionamiento basico. Cabe
mencionar que en este proyecto no se utiliza MIDI (Music Interfaz Digital Instru-
ment), se utiliza audio analogico digitalizado.
58
Capıtulo 7
Conclusiones y Trabajos Futuros
Esta tesis presento el diseno elemental de un sintetizador de notas musicales,
el cual describimos en un programa de computadora digital. Este dispositivo de
software produce sonidos mediante la generacion de senales periodicas y funciones
matematicas con la ayuda de elementos electronicos programados, tales como osci-
ladores, filtros, mezcladores de senales, etc. Fısicamente estos elementos son costosos
y ocupan grandes espacios, lo cual puede llegar a ser molesto para el usuario. Pen-
sando en esto ultimo, nos dimos cuenta que un modelo por software puede igualar
a un modelo por hardware y no ser estorboso, ya que lo unico que se necesita para
usarlo es una computadora digital (p.e. PC), que practicamente es necesaria en la
vida cotidiana de toda persona.
Para iniciar con la elaboracion de nuestro proyecto, primero debimos elegir un
lenguaje de programacion que permitiera disenar la interfase de usuario. Este lengua-
je deberıa ser accesible para el programador a fin de que los resultados obtenidos
pudieran observarse en una computadora estandar. El resultado de esta eleccion,
como ya se ha mencionado, fue el lenguaje de programacion Visual C++.NET, el
cual nos ofrecio ademas de su facil manejo, la oportunidad de crear objetos bastante
amigables para los usuarios. De esta manera, el diseno de nuestro sintetizador se ha
realizado con medios comunes en el mercado.
Desde un principio, las bases de nuestro proyecto estuvieron planteadas: crear
59
senales senoidales para representar una sumatoria, en otras palabras, programar una
Serie de Fourier. El resultado deberıa ser visible en la ventana principal del proyecto
para ver la forma de onda que se estarıa mandando a la tarjeta de sonido. Lo anterior
fue logrado programando funciones matematicas en Visual C++.NET, algunas de es-
tas funciones fueron la suma, la multiplicacion y el seno. Con estas funciones, algunas
veces llamadas primitivas, programamos nuestra Serie de Fourier para comprobar
las sıntesis de onda, con esto obtuvimos un numero bastante grande de valores, los
cuales tenıamos que almacenar en memoria operativa (buffer de audio) con el fin de
tener un mejor control de los datos.
Una vez generada la sıntesis, el siguiente paso fue enviar los datos almacenados en
nuestro buffer, a otro buffer que se encuantra asociado al driver de la tarjeta de
sonido (una Sound Blaster). Sin embargo, al iniciar este proceso nos dimos cuenta de
la poca informacion que existe sobre como programar drivers de sonido. Encontramos
varios libros y notas que hablaban acerca de como enviar un archivo WAVE, previa-
mente grabado, a la tarjeta de sonido, pero lo anterior no era suficiente; fue hasta que
se consulto el artıculo de una revista que hablaba acerca de la generacion de audio
por medio de una onda senoidal, que pudimos avanzar en nuestro proyecto. Esto nos
ayudo enormemente en nuestra investigacion, sin embargo, el artıculo esta escrito en
ingles, lo cual reafirmaba la poca informacion disponible en este paıs al respecto.
Para enviar los datos almacenados en el buffer a la tarjeta de sonido, ocupamos
instrucciones de audio de bajo nivel que se encuentran en la biblioteca de funciones
multimedia mmlib.lib. Algunas de las instrucciones de audio mas importantes son;
WavePrepareHeader() que se encarga de preparar al buffer para ser enviado a la
tarjeta de sonido, y WaveOutWrite() que se encarga de sacar los datos de la tarjeta
de sonido a los altavoces de la PC; estos procesos se explican mas detalladamente en
el capıtulo 4 de esta tesis.
Hecho lo anterior, los siguientes pasos fueron sencillos. Para la distribucion de las
notas del teclado utilizamos el valor matematico raız doceava de dos, que representa
60
el intervalo existente entre una nota y la siguiente (un semitono). El resultado de esta
operacion fue multiplicado por la frecuencia central utilizada (LA4=440Hz) con el fin
de encontrar la frecuencia de la siguiente nota (LA#), y ası sucesivamente. Cada uno
de estos valores fueron asignados a un boton ubicado en la vista principal y ası darle
el sonido de la nota correspondiente.
Para cambiar el timbre de nuestro sintetizador, controlamos las formas de onda
senoidales en su amplitud y frecuencia, esto se consiguio por medio de barras de
desplazamiento, asignandole el valor de dichas barras a las amplitudes y frecuencias
que se encuentran en la formula de la sıntesis de onda. De esta manera es posible no
solo escuchar algun instrumento como una trompeta o un oboe, sino tambien ver su
forma de onda al mismo tiempo.
En resumen, las principales contribuciones de esta tesis son las siguientes:
La realizacion de una Serie de Fourier con algoritmos de programacion y meto-
dos numericos.
La generacion de audio analogico por medio de una suma de senales.
La programacion de instrucciones de audio de bajo nivel con lo cual se facili-
tara la construccion software de drivers de sonido.
Tecnicas de graficacion en Visual C++.NET.
Y por ultimo, un sintetizador virtual para PC capaz de ejecutarse en sistemas
windows 95 o superior.
7.1. Trabajos Futuros
Continuando con los resultados de nuestra investigacion, presentamos algunas
sugerencias en cuanto a trabajos futuros. Pensamos que es posible implementar una
serie de elementos, en cuanto a estetica, funcionalidad, y aplicacion cientıfica.
61
Respecto a la estetica, se puede mejorar la apariencia de las barras verticales y la
barra horizontal, mediante la implementacion de perillas giratorias en tercera dimen-
sion, ası mismo, perfeccionar la apariencia del teclado. Ademas es posible mejorar
la graficacion de las senales mediante la implementacion de color y aumento de la
resolucion de la grafica.
En cuanto a funcionalidad, se pueden efectuar varias acciones para el mejoramien-
to del proyecto. Por ejemplo, solo se cuenta con la frecuencia fundamental y cinco
de sus armonicos, que son senales senoidales. Para resolver esta limitante se puede
implementar una mayor cantidad del contenido armonico a nuestro sistema, median-
te la integracion de formas de onda cuadrada, cosenoidal, diente de sierra, etc. Esto
permite obtener una mayor variedad de instrumentos musicales, ya que cada forma
de onda cuenta con diferente contenido armonico. Ası mismo, es posible crecer la
funcionalidad de nuestro sintetizador en cuanto a la amplitud, tono y timbre, inte-
grando generadores de ruido (blanco o rosa) y envolventes de onda. Esto permite la
simulacion dinamica de los instrumentos musicales, mediante el control del ataque,
decaimiento, sostenimiento y la relajacion tal como se ha descrito en el capıtulo tres.
Ya que en nuestro trabajo cuenta solo con una octava en el teclado, en el futuro se
pueden implementar cuatro o mas octavas para obtener un rango mayor de frecuen-
cias. Ademas, se puede agregar una funcion para que el sintetizador pueda dividir el
teclado en dos partes. Es decir, si cuenta con cuatro octavas, las primeras dos tocarıan
un instrumento, por ejemplo el piano y las dos octavas restantes tocarıan un acordeon
como lo hacen los sintetizadores profesionales. Se puede perfeccionar el teclado, para
que puedan ejecutarse acordes, esto es, aumentar el numero de teclas que se tocan al
mismo tiempo.
Como ya se sabe, la principal funcion de un sintetizador es generar una gran
variedad de sonidos, que simulen instrumentos musicales. Por ello, a este proyecto se
puede agregar un selector de instrumentos, esto es, tener configurado el sistema para
que con una perilla, pueda seleccionar el instrumento o los instrumentos que se deseen
62
tocar, por ejemplo un piano, un violın, una flauta, etc. Se tiene pensado realizar una
version comercial que pueda competir con la industria de los sintetizadores realizados
por software, en cuanto al costo y a la transportabilidad.
Respecto a las aplicaciones en la ciencia y en la tecnologıa los resultados obtenidos
pueden ser aprovechados en algunas areas como: Procesamiento de Senales Digita-
les (DSPs), reconocimiento de patrones de imagenes, reconocimiento de patrones de
sonido, e instrumentos de medicion como osciloscopios, generadores de funciones, me-
didores de ruido, e instrumentos de ultrasonido.
Por otra parte, para un musico puede ser de gran utilidad, ya que donde quiera
que el se encuentre haciendo su trabajo (tocando), si cuenta con una PC podra tener
a su alcance un sintetizador de sonidos. Ademas, en la educacion musical puede ser
de gran ayuda como material didactico, por ejemplo, aprender el orden de las notas
en un teclado e iniciarse dentro de la musica.
Por utlimo, cabe mencionar que esta tesis se ha desarrollado conjuntamente con
el Dr. Maximino Pena Guerrero y el Ing. Jose de Jesus Negrete, profesores de la
academia de acustica de la ESIME-Zacatenco. Actualmente se encuentran desarro-
llando mas proyectos en ciencia y tecnologıa acustica.
63
Bibliografıa
[1] Beristain, Sergio, AUDIO Ed. Particular, Mexico D.F., Agosto de 1998, 201 pgs.(p: 10)
[2] Ceballos, Fco. Javier, Visual C++ Aplicaciones para Win 32, Alfaomega Ra-Ma,Mexico 2004, 717 pgs. (p: 38)
[3] Ceballos, Fco. Javier, Visual C++ Programacion Avanzada en Win 32, Alfa-omega Ra-Ma, Mexico 2000, 852 pgs. (p: 33)
[4] Floyd, Thomas, Dispositivos Electronicos, LIMUSA Noriega Editores, 1996,Coleccion Textos Politecnicos, 974 pgs. (p: 17)
[5] Moog Robert A., “Voltaje-Controlled Electronic Music Modules”, R. A. MoogCo., Trumansburg, New York, Journal of the Audio Engeering Society, january,1968, vol. 16 No. 1. pp. 200-206. (p: 36)
[6] Moog Bob., “MIDI: Musical Instrument Digital Interface”, Journal of the AudioEngeering Society, may 1986, v. 34 No. 5. pp. 394-404. (p: 35)
[7] Pena G. M., Captura de Multiples Eventos MIDI en Tiempo de Ejecucion”.Inedita. Mexico. Tesis presentada para aspirar al grado de Doctor en Cienciasen Ingenierıa Electrica. Centro de Investigacion y de Estudios Avanzados delInstituto Politecnico Nacional, 2005. 160 pgs. (p: 11)
[8] Petzold, Charles, ”Exploring Wave Form Audio Generating Sine Waves in Soft-ware”, PC Magazine, November 26, 1991, pp 505-510. (p: 32)
[9] Petzold, Charles, Programing Windows, Microsoft Press, 1999, 1479 pgs. (p: 28)
64
Glosario
CAC: Computer Aided Composer, Composicion Asistida con Computadora. Colec-
cion de programas de software agrupados en un medio ambiente de computadora
digital que interactua con el usuario para estudiar, desarrollar, simular e interpretar
musica de cualquier tipo, incluyendo toda clase de sonidos.
Generador de tonos: Dispositivo electronico digital que puede generar una gran
variedad de sonidos musicales de acuerdo con las notas que recibe. Es un sinteti-
zador de sonidos similares a los producidos por instrumentos musicales. Se conecta,
a traves de la interfaz MIDI, a computadoras digitales o cualquier otro controlador
MIDI, los cuales envıan notas musicales en forma de comandos para reproducir la
musica de acuerdo con la informacion que tiene un archivo MIDI, u otra forma de
almacenamiento digital.
KL: Kernel for a musical Language, nucleo para un lenguaje musical. Compilador
de estructuras musicales desarrollado por el autor para estudiar el procesamiento
electronico de la musica. La entrada es un programa fuente que tiene cadenas de texto
escritas en lenguaje natural (do re mi[ fa sol sil fa]...) de las notas musicales
(solfeo). La salida son graficas, partituras, y/o el sonido de una cancion escrita en el
programa fuente.
MIDI: Musical Instrument Digital Interface, interfaz digital para instrumentos mu-
sicales. Protocolo de comunicaciones de hardware y software estandar disenado por
los fabricantes de instrumentos musicales electronicos.
Pentagrama: Grupo de cinco lıneas horizontales para escribir sımbolos graficos que
tiene el lenguaje musical y que determina una melodıa.
Sintetizador: Dispositivo electronico digital, similar a un piano, que puede generar
una gran variedad de sonidos musicales. Las notas son activadas por el sistema de
teclas, o tambien por aquellas que recibe a traves de su interfaz MIDI interconstruida
y conectada con computadoras digitales u otros dispositivos similares.
Sistema de tiempo real: Dispositivo que controla una aplicacion dedicada la cual
tiene restricciones temporales bien definidas.
65
Solfeo: Lenguaje natural musical, compuesto por las sılabas do, re, mi, fa, sol, la
y si, para ensenar musica cantando.
Tiempo real: Momento actual de respuesta al procesamiento inmediato de datos
que interactuan con procesos fısicos.
UART: Unasynchronous Asynchronous Reciver Transmitter, transmisor y receptor
sıncrono asıncrono. Dispositivo electronico digital de comunicaciones serial que trans-
forma datos con formato serie a paralelo para recibir o transmitir informacion. La
velocidad de transferencia, cuando se utiliza en instrumentos musicales electronicos,
es de 32,250 Bauds lo que permite enviar y recibir, en promedio, hasta 142 notas
musicales en un segundo.
VLSI: Very Large Scale Integration (integracion a escala muy elevada). Tecnica de
fabricacion de circuitos integrados electronicos en espacios bastantes reducidos.
66
Φ
67