TFG Ayelo PDF
TFG Ayelo PDF
TFG Ayelo PDF
entrenamiento auditivo
psicoacústico
Grado en Ingeniería en Sonido e Imagen
en Telecomunicación
III
Agradecimientos
En primer lugar agradecer a mi tutor, Pedro José Ponce de León Amador, el cual creyó
en mi propuesta desde el primer momento, animándome a su desarrollo y aconsejándo-
me en cada problema o limitación que me encontraba.
Por último, agradecer a mis amigos de clase, pilar fundamental para haber llegado
hasta aquí. Gracias Manuel. Gracias Yolanda. Gracias Mónica. Han sido cuatro años ma-
ravillosos para mí, por lo que os agradezco todo lo que me habéis aportado y os deseo
una vida llena de oportunidades y alegrías.
Muchas gracias.
IV
Resumen
En el presente proyecto se va a desarrollar una suite de aplicaciones con interfaz grá-
fica para el entrenamiento auditivo. Las aplicaciones pretenden estar destinadas princi-
palmente a profesionales del sonido (productores, diseñadores sonoros, técnicos e inge-
nieros de sonido), si bien podrán ser utilizadas por cualquier usuario medio con un nivel
de informática básico.
El entrenamiento auditivo psicoacústico busca educar y afinar el oído para que éste
sea capaz de identificar y caracterizar las diferentes cualidades y parámetros del material
sonoro, lo cual se considera requisito indispensable para los profesionales del audio.
Nuestro grupo de aplicaciones buscará tratar el sonido desde sus diferentes paráme-
tros, como son la localización espacial, detección frecuencial, el ruido y la distorsión y
por último la ganancia y la dinámica. Para ello, se hará uso de Csound como lenguaje de
programación, apoyándonos en CsoundQt. Cada una de las aplicaciones contará además
con una interfaz gráfica desarrollada a partir de CsoundQt, una herramienta front-end de
desarrollo.
Cada una de las aplicaciones contará con una sección de prueba, en la que el usuario
podrá experimentar con todos los parámetros de dicha sección, buscando así la compren-
sión de los mismos. Por otro lado, cada aplicación también contará con una sección de
entrenamiento, donde realmente se pondrá a prueba al usuario en busca de una mejora
auditiva psicoacústica.
Abstract
In this project, a suite of applications with graphic interface for the auditive train-
ing will be developed. Those applications are ment to be used by sound proffessionals
mainly (producers, sound designers and sound engineers), but it could be used by any
user with a basic computing level.
The psychoacoustic ear training seeks for the education and tunning of the ear, in
order to make it capable of identifying and characterizing the different qualities and pa-
rameters of the sound material which is an essential requirement for the sound proffes-
sionals.
Our group of applications looks for proccessing the sound from its different param-
eters, as the spatial location, frequency detection, the noise and the distortion and lastly
the gain and the dinamics are. To achieve this, Csound will be the programming language
we will use, supported by CsoundQt. Every single application will also have a graphic
interface designed on CsoundQt which is a front-end design tool.
Each application will include a testing section, where the user may be able to experi-
ence every parameter of the section. This feature improves the comprehension of those
parameters. Furthermore, every application will have a training part, where the user will
try out its skills, improving the psychoacoustic auditive.
1 Introducción 1
1.1 Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 Organización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Marco teórico 3
2.1 Psicofísica y psicoacústica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.1 Fisiología humana . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.1.1 El sistema auditivo periférico . . . . . . . . . . . . . . . . 4
2.1.1.2 El sistema auditivo central . . . . . . . . . . . . . . . . . . 6
2.1.2 Umbrales de audición . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.2.1 El umbral absoluto . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.2.2 El umbral diferencial . . . . . . . . . . . . . . . . . . . . . 7
2.1.3 Métodos de medida . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.4 Bandas críticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1.5 Sonoridad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1.6 Altura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.1.7 Duración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.8 Timbre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.9 Localización espacial . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 Fundamentos del audio digital . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.1 Conversión AD/DA . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.1.1 Muestreo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.1.2 Cuantificación . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.1.3 Codificación . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3 Procesado y efectos de audio . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3.1 Frecuenciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.1.1 Ecualizadores . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.1.2 Distorsión (Overdrive) . . . . . . . . . . . . . . . . . . . . . 15
2.3.2 Dinámicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.2.1 Compresor . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.2.2 Puerta de ruido . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.3 Temporales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.3.1 Eco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3.3.2 Reverb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3.3.3 Delay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4 Obras y apps de entrenamiento auditivo disponibles . . . . . . . . . . . . . 16
2.4.1 Golden Ears . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4.2 SoundGym . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4.3 Train Your Ears . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
VII
2.4.4 iZotope Pro Audio Essentials . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.5 Quiztones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4.6 EarMaster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.5 Propuesta de este trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.6 Csound - Herramienta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.6.1 Csound . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.6.1.1 Funcionamiento de Csound . . . . . . . . . . . . . . . . . . 22
2.6.2 CsoundQt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.6.3 Otros front-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3 Metodología 26
3.1 Visión general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2 Apartados didácticos de la aplicación . . . . . . . . . . . . . . . . . . . . . 26
3.2.1 Reconocimiento espacial . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2.2 Reconocimiento frecuencial . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.3 Ruido y distorsión . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.4 Volumen y dinámica . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4 Diseño del sistema 31
4.1 Modos de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.1 Modo de prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.2 Modo de entrenamiento . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.1.3 Visión general de diseño . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2 Interfaz gráfica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.2.1 Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.2.1.1 Presets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2.2 Nuestro diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.2.1 Estructura general . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.2.2 Gama de colores . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3 Evaluación de los ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3.1 Auto evaluación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5 Implementación 40
5.1 Visión general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.2 Reconocimiento espacial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.2.1 Zona de pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.2.1.1 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2.1.2 Reverb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2.1.3 Situación espacial . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.2 Zona de prácticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.2.1 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.2.2 Situación espacial . . . . . . . . . . . . . . . . . . . . . . . 45
5.2.2.3 Reverb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2.2.4 Visualización . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2.2.5 Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.3 Reconocimiento frecuencial . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.3.1 Zona de pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.3.1.1 Muestra 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3.1.2 Muestra 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.3.2 Zona de prácticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.3.2.1 Generar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.3.2.2 Muestra 1 y Muestra 2 . . . . . . . . . . . . . . . . . . . . . 48
5.3.2.3 Respuestas - Muestra 1 y Muestra 2 . . . . . . . . . . . . . 49
5.3.2.4 Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.4 Ruido y Distorsión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.4.1 Zona de pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.4.1.1 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.4.1.2 Ruido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.4.1.3 Cuantización . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.4.1.4 Muestreo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.4.2 Zona de prácticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.4.2.1 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.4.2.2 Dificultad . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.4.2.3 ¿Qué degradación hay? . . . . . . . . . . . . . . . . . . . . 54
5.4.2.4 Respuestas - Ruido, Cuantización y Muestreo . . . . . . . 54
5.4.2.5 Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.5 Ganancia y Dinámica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.5.1 Zona de pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.5.1.1 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.5.1.2 Ganancia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.5.1.3 Dinámica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.5.2 Zona de prácticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.5.2.1 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.5.2.2 Ganancia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.5.2.3 Dinámica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.5.2.4 Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6 Conclusiones y trabajos futuros 61
6.1 Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2 Propuestas de trabajo futuras . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Bibliografía 63
Apéndices
A Código fuente - Reconocimiento espacial 65
B Código fuente - Reconocimiento frecuencial 73
C Código fuente - Ruido y distorsión 84
D Código fuente - Ganancia y dinámica 101
Índice de figuras
XI
5.3 Vista general de la aplicación “Reconocimiento frecuencial”. . . . . . . . . 47
5.4 Displays encargados de mostrar la onda elegida por el usuario. . . . . . . . 47
5.5 Sección de control de ambas muestras para la “Zona de prácticas”. . . . . 49
5.6 Sección de respuestas de ambas muestras para la “Zona de prácticas”. . . 49
5.7 Vista general de la aplicación “Ruido y Distorsión”. . . . . . . . . . . . . . 50
5.8 Vista general de la sección “Ruido”. . . . . . . . . . . . . . . . . . . . . . . 51
5.9 Vista general de la sección “Cuantización”. . . . . . . . . . . . . . . . . . . 52
5.10 Vista general de la sección “Cuantización”. . . . . . . . . . . . . . . . . . . 53
5.11 Vista general de la sección “¿Qué degradación hay?”. . . . . . . . . . . . . 54
5.12 Vista general de la sección de respuestas. . . . . . . . . . . . . . . . . . . . 55
5.13 Vista general de la aplicación “Ganancia y Dinámica”. . . . . . . . . . . . . 56
5.14 Vista general de la sección “Ganancia”. . . . . . . . . . . . . . . . . . . . . 57
5.15 Vista general de la sección “Dinámica”. . . . . . . . . . . . . . . . . . . . . 57
5.16 Vista general de la sección “Ganancia”. . . . . . . . . . . . . . . . . . . . . 59
5.17 Vista general de la sección “Dinámica”. . . . . . . . . . . . . . . . . . . . . 60
CAPÍTULO 1
Introducción
1.1 Motivación
Desde el comienzo de la música, uno de los grandes requisitos para el correcto desa-
rrollo de la misma ha sido, entre otras muchas facultades, la capacidad del intérprete en
la escucha, necesitando por tanto de un sentido del oído afinado y bien desarrollado.
Paralelamente al desarrollo de la música, y a comienzos del siglo XIX, se hizo cada
vez más importante tener la capacidad de poder grabarla y reproducirla de forma que
pudiese perdurar en el tiempo y ser escuchada por una gran masa de gente. En éste
punto nació la figura del técnico de sonido o ingeniero sonoro. Es fácil imaginar que
dicho técnico debía compartir con los músicos su capacidad auditiva para el correcto
desarrollo en la captación y mezcla musical.
El siguiente paso en nuestra historia se sitúa en 1965 en el Shea Stadium de Nueva
York. En esa fecha y lugar se llevó a cabo a mano de los todopoderosos Beatles el primer
concierto multitudinario, y con ello nació la industria de la música en directo. Es fácil
pensar que dicha industria aumentó la demanda de técnicos e ingenieros de sonido de
manera exponencial, aumentando así el reclamo de cada vez más profesionales capacita-
dos con las cualidades anteriormente mencionadas.
Llegados a este punto se puede deducir de manera sencilla y lógica el potencial que
posee ésta industria, con un fuerte reclamo en profesionales cualificados para hacer frente
a la gran demanda tanto de ingenieros y técnicos de estudio, como de música en directo,
teatros, radios, televisiones, etc.
1.2 Objetivos
El objetivo del proyecto es combinar la experiencia profesional desarrollada como téc-
nico de sonido durante los últimos 3 años con los conocimientos adquiridos estos últimos
años en la universidad, para desarrollar un software de entrenamiento auditivo median-
te síntesis digital de sonido enfocado a técnicos e ingenieros de sonido principalmente,
pero con la intención de que pueda llegar a ser útil para cualquier persona con ganas de
afinar y entrenar su audición.
Nuestro objetivo principal, y por tanto del proyecto, consiste en acabar con una serie
de aplicaciones basadas en lenguaje Csound y con interfaz gráfica para el entrenamiento
auditivo. Como objetivos específicos para completar el desarrollo del proyecto se estable-
cen los siguientes puntos:
Exploración de las características de Csound y sus interfaces gráficas que resulten
idóneas para la implementación de la aplicación.
Diseño del sistema de ejercicios de entrenamiento auditivo.
1
2 CAPÍTULO 1. INTRODUCCIÓN
1.3 Organización
La memoria de este proyecto se estructura en 6 secciones de contenido a parte de la
parte introductoria y una de documentación anexa.
En primer lugar se hace un repaso sobre los fundamentos básicos de audio y la psi-
coacústica con la idea de relacionar los conceptos teóricos con los posteriores resultados
prácticos, además de mostrar en base teórica las herramientas que se van a utilizar para
el desarrollo de nuestra aplicación.
La sección 3 explica la metodología que se va a utilizar para el desarrollo de cada una
de las aplicaciones, explicando los primeros pasos que se llevaron a cabo al comienzo
del proyecto y una explicación teórica de cada una de las aplicaciones y el porqué se ha
decidido llevarla a cabo.
En el capítulo 4 se hablará del diseño del sistema, empezando por los métodos de
trabajo que se van a implementar en cada aplicación, así como de la interfaz gráfica,
herramientas disponibles para su desarrollo y demás detalles relacionados. En el capítulo
5 se hablará de la implementación propia de cada una de las aplicaciones, enfocada desde
un punto de visa técnico y comentando decisiones tomadas para la escritura de cada una
dellas, así como una explicación sobre el código y su funcionamiento.
En el capítulo 6 se pretende evaluar cada una de las aplicaciones, bien desde un punto
de vista propio, como a través de profesionales del mundo del audio, recibiendo opinio-
nes para posibles mejoras futuras y, en general, una evaluación externa de las mismas.
Para terminar, tenemos el capítulo 7, en el que se hablará de las conclusiones sobre
el presente proyecto así como propuestas futuras relacionadas y que se nos ocurren am-
pliarán y mejorarán la funcionalidad de nuestras aplicaciones.
CAPÍTULO 2
Marco teórico
3
4 CAPÍTULO 2. MARCO TEÓRICO
A continuación se expone una descripción de cada una de las tres secciones en las que
se divide el sistema auditivo periférico:
Oído externo
El oído externo se compone por el pabellón auditivo (la oreja), la cual se encarga
de concentrar las ondas sonoras incidentes en el canal auditivo, el cual conduce las
ondas hasta el tímpano.
La ubicación lateral de los pabellones derecho e izquierdo en el ser humano ha
hecho prácticamente innecesaria la capacidad de movimiento de los mismos, a di-
ferencia de lo que sucede en muchos otros seres vivos que tienen una amplia ca-
pacidad de movimiento en sus pabellones, pudiendo enfocarlos en la dirección de
proveniencia del sonido. De esta manera se contribuye a la función del pabellón,
que es la de concentrar las ondas sonoras en el conducto auditivo externo.
La no linealidad en las funciones de transferencia del oído comienzan ya en el pa-
bellón, ya que por sus características físicas, éste tiene una frecuencia de resonancia
entre los 4.500 Hz y los 5.000 Hz.
El canal auditivo tiene unos 2,7 cm de media en su longitud, y un diámetro prome-
dio de 0,7 cm. Al comportarse como un tubo cerrado en el que oscila una columna
de aire, la frecuencia de resonancia del canal es de alrededor de los 3.200 Hz, lo que
provoca una ganancia subjetiva en la señal en este rango de frecuencias, siendo la
causa de la alta sensibilidad del oído en esta banda.[3]
Oído medio
El oído medio, en la fig. 2.2, está lleno de aire y está compuesto por el tímpano (es el
encargado de separar el oído externo del oído medio), los osículos (martillo, yunque
2.1. PSICOFÍSICA Y PSICOACÚSTICA 5
y estribo) que no es ni más ni menos que una cadena ósea de huesos minúsculos
conectados entre sí y la trompa de Eustaquio.
Figura 2.2: Esquema del sistema auditivo periférico con la cóclea desenrollada.[3]
La energía acústica recibida del oído externo a través del tímpano es transformada
en energía mecánica y se trasmite hasta la entrada del caracol (oído interno). De di-
cha transformación y transmisión se encargan los osículos, que además amplifican
el sonido y son los encargados de acoplar las impedancias de los diferentes medios
(aire-líquido). Todo ello se realiza a través de una membrana conocida como la ven-
tana oval. La trompa de Eustaquio sirve para igualar la presión de ambos lados del
tímpano, ya que dicha trompa está comunicada con la parte superior de la faringe,
y por tanto, con el aire exterior. [3]
Oído interno
El oído interno es la parte más importante del sistema auditivo desde el punto
de vista psicoacústico. Está formado por la cóclea o caracol, fig. 2.3, en donde se
encuentra la membrana basilar, la cual transforma las vibraciones mecánicas en
impulsos eléctricos. Además también se encuentran en el oído interno los canales
semicirculares y el nervio auditivo.
El fluido de la cóclea es excitado por el pie de estribo al empujar la ventana oval,
y estas ondas son las que se propagan hasta llegar a las células ciliares (también
conocidas como células capilares) del órgano de Corti. Dichas células, al ser estimu-
ladas, generan los impulsos eléctricos que las fibras nerviosas situadas en el nervio
auditivo transmiten al cerebro para su procesamiento. [3]
Transmisión ósea
Además, debemos tener en cuenta el factor de que el sonido no nos llega al oído in-
terno únicamente a través del oído medio (tímpano, osículos, etc), ya que las ondas
sonoras también son capaces de llegar al oído interno directamente por medio de
la oscilación de los huesos que componen el cráneo.
Es algo fácilmente observable y comprobable, ya que si colocamos un diapasón
para una frecuencia aleatoria dentro del espectro audible vibrando sobre el hueso
parietal o sobre el hueso mastoideo (detrás del pabellón auditivo), somos capaces
de escuchar su sonido sin necesidad de que nos llegue a través del oído medio.
Dado que el oído interno se encuentra dentro de una cavidad del hueso temporal,
las oscilaciones del cráneo hacen entrar en oscilación directamente al fluido linfáti-
co. Dado que se ha demostrado que cualquiera de las dos formas de recepción del
6 CAPÍTULO 2. MARCO TEÓRICO
sonido en el oído interno es igualmente efectiva, éste método es válido para per-
sonas que puedan sufrir de enfermedades en el oído medio para poder mejorar su
audición.
Como detalle interesante, saber que la transmisión ósea también es responsable de
que escuchemos nuestro timbre de voz de manera diferente a como la escuchan el
resto de personas.[3]
- El umbral absoluto
- El umbral diferencial
2.1. PSICOFÍSICA Y PSICOACÚSTICA 7
Figura 2.4: Distribución de las funciones a lo largo de los 2 hemisferios cerebrales para individuos
con lengua materna occidental.[4]
M ÉTODOS CLÁSICOS
Gustav Theodor Fechner (1881-1887) elaboró una serie de procedimientos experimen-
tales conocidos como "métodos psicofísicos clásicos", con la idea de poder deter-
minar así los umbrales absoluto y diferencias, y de esta manera poder verificar sus
hipótesis. Estos métodos son tres y se resumen de la siguiente manera:
• Método de los límites: También conocido como "Método de los cambios míni-
mos". En este método un experimentador es quien manipula la intensidad del
estímulo a estudiar de manera sistemática, mientras que los sujetos del estudio
se limitan únicamente a indicar si perciben o no el estímulo, además de indi-
car si perciben el estímulo en comparación de manera igual, menor o mayor al
estímulo estándar.
• Método de ajuste: También conocido como "Método de error promedio". Es uno
de los métodos más antiguos y fundamentales de la psicoacústica. Éste método
recibe su nombre por la manera en la que realiza su estudio, es decir, el sujeto
es quien debe ajustar la intensidad del estímulo hasta llegar a un punto en el
que lo percibe. Otra variante se basa en que es el sujeto quien debe ajustar la
intensidad del estímulo para intentar igualarla a un estímulo de referencia por
comparación.
• Método de estímulos constantes:También conocido como "Método de los casos
verdaderos y falsos". Al igual que sucedía con el método de los límites, el suje-
to debe informar cuando el estímulo que recibe es igual, mayor o menor a un
estímulo de referencia. La diferencia entre ambos métodos radica en que esta
vez los estímulos se presentan de manera aleatoria y no en orden secuencial,
tal y como ocurría en el método anteriormente visto. Al presentar los estímu-
los de manera aleatoria, se evitan errores de habituación y anticipación por
parte del sujeto.
M ÉTODOS ADAPTATIVOS
En los métodos adaptativos, tal y como su nombre indica, la manera de presentar
el estímulo se adapta dependiendo de las respuestas anteriores del sujeto. Es decir,
el nivel puede ser superior o inferior en cualquier momento. Algunos métodos clá-
sicos, como el método de los límites y el método de ajuste pueden concordar con
2.1. PSICOFÍSICA Y PSICOACÚSTICA 9
2.1.5 Sonoridad
Se trata de un atributo que nos permite ordenar sonidos en una escala del más fuerte
al más débil.
La sonoridad2 se trata de un atributo vinculado a la intensidad del sonido. No obstan-
te, tal y como se vio en la sección de umbrales de audibilidad, la sonoridad no depende
únicamente de la intensidad de un sonido, sino también de su frecuencia. Además, la
sonoridad es dependiente de otras variables, como pueden ser el ancho de banda, el con-
tenido frecuencial y la duración del sonido.
Para poder medir la sonoridad se estableció el parámetro conocido como “Nivel de
sonoridad", el cual determina cuán fuerte es escucha un sonido frente a otro. Es por tanto
un parámetro psicoacústico y no físico, ya que mide cómo se detecta un sonido de fuerte
frente a otro por el usuario.
1 Se habla de enmascaramiento cuando el umbral de audibilidad correspondiente a un sonido se eleva a
causa de la presencia de otro. Es decir, el enmascaramiento ocurre cuando la presencia de un sonido impide
la percepción de otro.
2 En inglés: “loudness"
10 CAPÍTULO 2. MARCO TEÓRICO
En la fig. 2.7 se observan las curvas isófonas o isofónicas, utilizadas para determinar
la sonoridad de un sonido senoidal puro. En el eje de las abscisas tenemos la frecuencia
y en el eje de ordenadas observamos el nivel físico SPL. Para un punto dado entre ambos
parámetros observamos que nos encontramos en una de las curvas isófonas, la cual nos
indica el nivel de sonoridad del sonido.
La sonoridad está directamente relacionada con la sensibilidad del sistema auditivo
frente al espectro audible. Por ejemplo, nuestro sistema auditivo es menos sensible en
bajas frecuencias, por tanto necesitamos un nivel SPL mucho mayor que en medias y altas
frecuencias para poder sentir el sonido como igual de fuerte. Es por tanto fácil determinar
que todos los sonidos contenidos en una misma curva de sonoridad se percibirán como
igual de fuertes aunque su nivel SPL sea diferente.
Además, a medida que aumenta el nivel de presión sonora las curvas se hacen más
planas, es decir, la dependencia de la frecuencia es menor a medida que aumenta el nivel
SPL.[13]
2.1.6 Altura
Se trata de una de las características más importantes para definir al sonido. Es de-
pendiente de la frecuencia del mismo, lo cuál se traduce en el número de vibraciones
por segundo. A mayor número de vibraciones por segundo, mayor es la frecuencia y por
tanto más agudo es el sonido, y viceversa, tal y como se observa en la fig. 2.8. Traducido
a una ejemplo práctico, para el caso de un instrumento de cuerda, como bien puede ser
una guitarra, cuando más fina, corta y tensa esté la cuerda, más agudo será el sonido y
viceversa. Para un instrumento de viento, el factor determinante es el tamaño del orificio
por el que se mueve la columna de viento, a mayor longitud, más grave será el sonido y
viceversa.
La altura o frecuencia de un sonido se mide en hercios (Hz), de donde 1 Hz es igual a
1 vibración por segundo.
El ser humano, por su fisiología tiene un rango de audición limitado en bajas y altas
frecuencias. El rango de audición se encuentra entre los 20 Hz hasta los 20000 Hz. Esto
quiere decir que ni por debajo de 20 Hz (infrasonidos), ni por encima de 20000 Hz (ultra-
sonidos), seremos capaces de escuchar nada, si bien éste margen es una media estadística,
2.1. PSICOFÍSICA Y PSICOACÚSTICA 11
por lo que no todo el mundo posee un margen tan amplio. Además, es importante men-
cionar que a medida que el ser humano se hace mayor, su rango audible se ve mermado,
especialmente en altas frecuencias, disminuyendo así la frecuencia máxima audible.[14]
2.1.7 Duración
Hablando sobre la duración es algo claro pensar en el tiempo como característica
principal que la define. Existe por tanto una duración objetiva, la cual se define como
la duración de los sonidos que es posible medir físicamente, y su unidad suele ser el
segundo. Por tanto, se trata del tiempo máximo de permanencia que pasa el sonido en
vibración. Muchas veces queda limitado por las características de producción del sonido,
como bien puede ser un instrumento musical acústico (no electrónico).
Además, también existe una duración mínima de los sonidos a partir de la cual, aun-
que un instrumento electrónico fuese capaz de generar sonidos muy breves, rápidos y
consecutivos, el oído los integraría como un único sonido y, por tanto, los percibiría co-
mo simultáneos.
Figura 2.9: Sonido largo y sin extinción (izquierda); Sonido corto y con un decaimiento rápido
(derecha)
En música por ejemplo existe otro tipo de forma para determinar la duración ya que
la medición del tiempo de cada sonido no se realiza de manera individual, si no que se
se hace por comparación los unos con los otros. Aún así, para ésta referencia relativa de
duraciones se necesita una referencia superior con la que establecer la duración absoluta.
Para ello existe la indicación de metrónomo, la cual nos indica el número de “golpes”
o “tiempos musicales” por minuto, expresadas en BPM1 . Por tanto, cuanto mayor sea
el número de BPM, más rápida será la música y por tanto menor será cada tiempo de
duración musical.[14]
2.1.8 Timbre
El timbre se trata de una cualidad que caracteriza al sonido desde un nivel perceptual.
Gracias al timbre somos capaces de distinguir la voz de distintas personas por ejemplo,
o un instrumento de otro aunque ambos estén sonando con la misma nota (altura).
1 BPM: Beats per minute. Golpes por minuto.
12 CAPÍTULO 2. MARCO TEÓRICO
Hablando de una manera más técnica, el timbre es una cualidad relacionada con el
espectro de cada sonido, tal y como se observa en la fig. 2.11. Es decir, la forma de onda
que lo define. Si bien el espectro no es lo único que define al timbre, si es un factor muy
importante, y tiene que ver con la cantidad y distribución de armónicos que posee un
sonido respecto a su fundamental (fig. 2.10). Además, otro factores que influyen en el
timbre pueden ser la envolvente temporal y espectral o el tipo de estructura de ruido que
presente.
Figura 2.10: Distintos timbres para una misma altura y duración. Se observa la composición ar-
mónica de cada uno en su espectro.[16]
Por tanto, sus caracterización viene dada por parámetros tanto espectrales como tem-
porales. De especial importancia para la caracterización del timbre de un sonido son las
formates, cuántos y en qué frecuencias del espectro aparecen.[16]
Nuestros oídos forman dos canales receptores independientes entre sí, sin interferen-
cia alguna entre ambos ni combinaciones entre las frecuencias recibidas por cada uno de
2.2. FUNDAMENTOS DEL AUDIO DIGITAL 13
ellos. Por tanto, las señales se reciben independientemente por cada oído y se crean dis-
tintos efectos en diferentes partes del cerebro, donde se procesan. Por tanto, únicamente
en el caso de que el nivel de la señal recibida sea extremadamente elevado, pequeñas
partes de energía se transferirán de un oído a otro, debido a la transferencia provocada
por los huesos craneales. El cerebro por tanto tomará la información recibida por ambos
oídos y la procesará comparando ambos impulsos nerviosos, interpretando de cada una
los aspectos que caracterizarán al sonido incidente, entre ellos su posición espacial.[15]
2.2.1.1 Muestreo
La conversión de una señal analógica en una digital empieza por realizar el muestreo
(sampling) de ésta. Este proceso consiste en tomar diferentes muestras de tensionas en
diferentes puntos de la onda y a incrementos de tiempo predeterminados. La frecuencia
a la que se realiza el muestreo se denomina tasa o frecuencia de muestreo y se mide
en hertzios. Para audio, a mayor número de muestras tomadas, mayor será la calidad y
fidelidad de la señal digital resultante.
Para determinar la frecuencia de muestreo mínima se utiliza el “Teorema de Nyquist”.
En él, se expone que para que una señal de audio pueda ser reconstruida sin perder cali-
dad, se debe utilizar una frecuencia de muestreo mayor al doble de la frecuencia máxima
contenida en la señal de audio analógico. Es decir: Fs >2*Fmax siendo Fs la frecuencia de
muestreo y Fmax la máxima frecuencia comprendida en la señal.
En caso de no cumplir dicho requisito, aparecerá aliasing, o ruido de muestreo. Este
ruido está provocado por utilizar una frecuencia de muestreo menor al doble de la fre-
cuencia máxima contenida en el audio, que suele ser 20 kHz, por lo que la frecuencia de
muestreo mínima recomendada debería ser 40 kHz, siendo el mínimo estandarizado 44,1
1 Analógico-Digital/Digital-Analógico
14 CAPÍTULO 2. MARCO TEÓRICO
kHz. Esa pequeña diferencia sirve para asegurar un margen que nos permita no tener
aliasing.
Durante el proceso de muestreo se asignan valores numéricos equivalentes a la ten-
sión o voltaje existente en diferentes puntos de la sinusoide, con la finalidad de realizar a
continuación el proceso de cuantización.
2.2.1.2 Cuantificación
Una vez hemos realizado el muestreo, se pasa al proceso de cuantificación. En él, se
cogen los valores de señal continua de la sección de muestreo, y se convierten en series
de valores numéricos decimales discretos, correspondientes a los diferentes niveles o va-
riaciones de voltajes que contiene la señal analógica.
Por tanto, la cuantificación representa el componente de muestreo de las variaciones
de valores de tensiones o voltajes tomados en diferentes puntos de la onda sinusoidal,
que permite medirlos y asignarles sus correspondientes valores en el sistema numérico
decimal, antes de convertir esos valores en sistema numérico binario.
Al igual que para el muestreo, para la cuantificación a mayor número de niveles en los
que representar la señal analógica, mayor será la calidad de la conversión. Dicho número
de niveles viene definido por la resolución del conversor, y se define en bits. El número de
niveles será igual a 2nºbits, siendo 16 bits el estándar recomendado para un CD de audio,
garantizando una conversión correcta y adecuada.
Cuando por ejemplo convertimos un audio con una resolución mayor a otra menor
nos aparece lo que se conoce como “ruido de cuantificación”. Es un ruido muy tenue
pero muy desagradable al oído humano. Para corregir dicho problema se añade un ruido
gaussiano muy tenue también para enmascararlo, llamado dither. El dither puede parecer
contraproducente, ya que al final se añade más ruido a la señal, pero éste es mucho más
agradable que el ruido de cuantificación, por lo que el oído lo tratará como más aceptable
y quedará enmascarado por la señal, la cuál estará a un nivel muy superior.
2.2.1.3 Codificación
Después de realizada la cuantificación, los valores de las tomas de voltajes se repre-
sentan numéricamente por medio de códigos y estándares previamente establecidos. Lo
más común es codificar la señal digital en código numérico binario.
Frecuenciales
Dinámicos
Temporales
2.3. PROCESADO Y EFECTOS DE AUDIO 15
2.3.1 Frecuenciales
Este tipo de efectos se basan en alterar el contenido en frecuencia de una señal de au-
dio, logrando conseguir un sonido más o menos brillante, además permitirnos modificar
cualidades de una canción ya grabada según se desee. Algunos de los tipos de efectos
basados en la alteración de la frecuencia son los ecualizadores y la distorsión.
2.3.1.1 Ecualizadores
Es un dispositivo electrónico que se encarga de modificar la respuesta en frecuencia
de un sistema, ya sea aumentando o disminuyendo diferentes bandas; Para ello modifica
en amplitud las frecuencias de la señal de audio, consiguiendo un aumento o disminu-
ción de volumen en la banda deseada. El objetivo de los ecualizadores es adaptar la señal
sonora a los gustos del usuario, ya sea para atenuar o eliminar frecuencias molestas, rui-
dos o interferencias que se mezclan con el sonido, como para simplemente, obtener una
salida que resulte más agradable o más adecuada al recinto.
2.3.2 Dinámicos
Están basados en la variación de amplitud y volumen de una señal, generando una
serie de efectos como el compresor o supresor o puerta de ruido.
2.3.2.1 Compresor
Se trata de realizar una reducción del rango dinámico de la señal que vamos a tratar,
es utilizado generalmente para reducción de ruido, producción, etc.
2.3.3 Temporales
Este tipo de efectos son producidos por la introducción de muestras retardadas en la
señal, produciendo alteraciones en determinados parámetros como la frecuencia, ampli-
tud y fase. A continuación vamos a describir algunos de los diferentes tipos de efectos
temporales más utilizados.
16 CAPÍTULO 2. MARCO TEÓRICO
2.3.3.1 Eco
El efecto eco consiste en añadir al audio original múltiples versiones retardadas y ate-
nuadas, imitando el eco original que se genera en la naturaleza. Para apreciar los retardos
como eco, el tiempo del retardo debe ser superior a 50 milisegundos (t >50 milisegundos);
Las versiones se van atenuando hasta que se vuelven imperceptibles.
2.3.3.2 Reverb
Este tipo de efectos es utilizado principalmente para modificar una serie de paráme-
tros que simulara un recinto acústico en concreto, pero además nos permite crear otro
tipo de sonidos más personalizados o de mayor riqueza de sonido.
2.3.3.3 Delay
Este tipo de efectos, también conocidos como retardos, se basan en generar retardo
en la señal, consiste en coger la señal de audio y volver a reproducirla después de un
periodo de tiempo, mezclada y escalada con la señal actual.
Vol. 1: Frecuencias
Ejercicios pensados para mejorar el reconocimiento e identificación en ligeras va-
riaciones de nivel y cortes a lo largo de las diez octavas principales del espectro
frecuencial. Se organiza en ejercicios progresivos en dificultad, desde simples au-
mentos en las diferentes octavas musicales hasta mínimas variaciones en octavas
de ruido rosa. Gracias a la gran diferencia de dificultad entre los ejercicios más sen-
cillos y los más complicados facilita el aprendizaje tanto de alumnos primerizos
como de los más avanzados.
2.4.2 SoundGym
SoundGym, fig. 2.13, simula ser una especie de gimnasio online para el entrenamiento
auditivo. Su objetivo es formar a productores de música e ingenieros de audio para me-
jorar su audición hasta poder llegar a detectar matices sonoros muy sutiles, desarrollar
habilidades de escucha profesional y poder llegar así al objetivo de obtener mejores y
más rápidas decisiones de cara a un entorno profesional de trabajo.
Para llevar a cabo todo lo anteriormente mencionado,
SoundGym hace uso de una interfaz gráfica amigable, llevan-
do a cabo los ejercicios propuestos en forma de divertidos
juegos de sonido. Gracias a su forma de trabajo y enfoque
didáctico, los miembros pueden mejorar así sus habilidades
de escucha más importantes y necesarias, tales como la de-
tección de frecuencias, compresión, coloración, detección de
diferencias de ganancia, impresión espacial, etc.
Cada juego se centra en mejorar una habilidad acústica Figura 2.13: Logo SoundGym
específica, ofreciendo así una experiencia de aprendizaje in-
tegral y efectiva. Además, y a diferencia del ejemplo visto anteriormente, SoundGym crea
un perfil de usuario al comenzar a utilizarlo, de forma que el usuario puede seguir sus
estadísticas de aprendizaje y el progreso en los ejercicios, además de seguir a amigos,
comparar puntuaciones, lograr objetivos, ganar previos, etc.
18 CAPÍTULO 2. MARCO TEÓRICO
Por todo lo visto, uno de los puntos fuertes de SoundGym frente a Golden Ears es su
forma de enfocar el aprendizaje como si fuese un juego, haciendo así el progreso mucho
más amigable y sencillo.
Éste nuevo método fue sugerido a la empresa Train Your Ears por el gurú de masteri-
zación Bob Katz.
2.4. OBRAS Y APPS DE ENTRENAMIENTO AUDITIVO DISPONIBLES 19
Ecualización
Compresión
Explorar.- Consiste en una interfaz gráfica con el vocabulario técnico de cada ámbi-
to enfocado a que el alumno entienda como funciona el audio y que características
tiene.
Practicar.- Interfaz gráfica a modo de juego con ejercicios sobre cada rama de estu-
dio para que el alumno pueda practicar y entrenar el oído de cara al modo Desafío.
Desafío.- Igual que el modo “Practicar” pero con un ranking de usuarios y registros
de puntuaciones. Se enfoca desde un punto de vista competitivo para fomentar las
ganas de mejora del alumno y sus ganas de practicar para aumentar su puntuación.
2.4.5 Quiztones
Quiztones, fig. 2.18, es una aplicación nativa disponible
para las plataformas Mac OS X, iOS y Android a un precio
reducido de 7,99† en su versión para OS X. Se trata, según
el propio desarrollador, de una aplicación de entrenamiento
auditivo enfocada para ingenieros de audio, productores y
músicos aficionados y profesionales. La aplicación está en-
focada en el apartado de frecuencias, utilizando tonos y rui-
dos alterados frecuencialmente, además de bucles musicales
Figura 2.18: Logo Quiztones y material del propio usuario. A dichos audios se les modi-
fica su espectro frecuencial según el nivel de dificultad y el
ejercicio seleccionado por el usuario, y éste debe acertar que modificación se le ha aplica-
do.
En la aplicación existían 3 tipos de ejercicios con diferentes dificultades cada uno se-
gún las exigencias del usuario. Los ejercicios eran los siguientes:
Tonos: Aplica al audio un tono puro a un nivel bastante reducido y el usuario debe
adivinar la frecuencia del tono aplicado eligiendo entre 4 opciones aleatorias.
EQ: La muestra de audio sufre una ecualización de pico o atenuación a una fre-
cuencia concreta y el usuario debe adivinar en que frecuencia se ha aplicado dicha
ecualización.
Ganancia: Este ejercicio se desmarca un poco de los dos anteriores y ofrece al usua-
rio la posibilidad de trabajar con diferencias sutiles de ganancia, teniendo que adi-
vinar el usuario la atenuación que se ha aplicado a la muestra original.
Si bien la aplicación es bastante más básica que las anteriores vistas, ofrece la posi-
bilidad de ser utilizada tanto en máquinas de sobremesa como en dispositivos móviles,
añadiendo así un plus de funcionalidad y versatilidad. Además destaca por poseer una
interfaz gráfica muy depurada y agradable, haciendo así mucho más ameno el entrena-
miento.
2.4.6 EarMaster
EarMaster, fig. 2.19, es un programa disponible para PC y
Mac OS X que va por su sexta edición. Se trata de una aplica-
ción completa para el entrenamiento del oído. La diferencia
clara de EarMaster respecto de las aplicaciones anteriores re-
side en que está enfocada desde un punto de vista mucho
más musical. Su público potencial, según el propio desarro-
Figura 2.19: Logo EarMaster
llador, son estudiantes de música, profesores de música, es-
cuelas y coros y músicos profesionales y amateurs.
Si bien su precio es un tanto elevado, ronda los 60†, está disponible en versión Pro,
y Teacher, dando así la facilidad a los profesores de disponer de una herramienta potente
para el desarrollo académico.
El motivo por el que se ha buscado desarrollar esta serie de aplicaciones para entre-
namiento auditivo existiendo ya alternativas comerciales como las vistas en la sección 2.4
es variado.
En primer lugar, la mayoría, y tal y como se ha dicho, son aplicaciones comerciales.
Algunas incluyen pagos para ampliar funcionalidades, otras son completamente de pa-
go, etc. En nuestro caso, se busca que sean gratuitas desde el primer momento y en su
totalidad, facilitando así el acceso a quien desee probarlas.
En segundo lugar, están basadas en lenguaje Csound, es decir, software libre. Esto es
un punto a su favor desde el punto de vista del desarrollo, ya que cualquiera que se
muestre interesado, podrá hacer uso del código fuente original para mejorar o añadir
funcionalidades, siendo todo ésto legal y gratuito.
En vistas de lo anterior, estas son las premisas con las que se busca una diferenciación
clara entre nuestras aplicaciones y las disponibles en la red, siendo pilares fundamentales
la gratuidad de las mismas y el uso de software libre para su desarrollo.
Por otro lado está la partitura, que es el segundo objeto relevante. Esta no es más que una
tabla o gráfica donde se especifica el orden de actuación de los instrumentos a lo largo
del tiempo. Por ejemplo, el clarinete toca tal cosa mientras el timbal reverbera en una sala
de tales características. Con Csound, el control sobre el sonido digital es absoluto (si se
encuentra el programa adecuado).
2.6.2 CsoundQt
Una vez llegados a este punto, cabe destacar la herra-
mienta final utilizada para el desarrollo del presente pro-
yecto. Tras varios intentos y pruebas con las herramientas
descritas anteriormente, se acabó decidiendo utilizar la he-
rramienta que ya habíamos testeado anteriormente en clase
de Síntesis Digital de Sonido, y que por tanto más se domina-
ba.
Figura 2.21: Logo CsoundQt
El motivo de la elección fue que, tras probar el resto de
opciones de programación gráfica en lenguaje Csound dispo-
nibles en el mercado, CsoundQt, fig. 2.21, es de las más completas, y sobre todo, una de
las que más información disponible tiene en la web. Esto es una prioridad a la hora de
1 Gestor de audio en Linux
24 CAPÍTULO 2. MARCO TEÓRICO
desarrollar un proyecto de esta envergadura ya que las dudas son muchas y muy varia-
das. Partiendo de esta base, otra de las posibles elecciones para el desarrollo del proyecto
fue Cabbage, pero se descartó precisamente por no disponer de suficiente información en
la web como para poder desarrollar el proyecto de manera satisfactoria.
Una vez llegados a este punto, y sabiendo de la elección de CsoundQt como herra-
mienta definitiva de cara a afrontar el proyecto, se hará una breve, pero concisa descrip-
ción de CsoundQt y de sus características y virtudes.
CsoundQt es un software front-end para lenguaje Csound que incorpora entre sus fun-
cionalidades un editor de resaltado con autocompletado. Además, posee la posibilidad
de incorporar widgets interactivos como parte de la edición GUI del progarma, fig. 2.22,
así como una ventana de ayuda integrada con asistencia para cada una de las funciones
de Csound.
26
3.2. APARTADOS DIDÁCTICOS DE LA APLICACIÓN 27
En la música sucede algo similar con la colocación espacial de los instrumentos. Se-
gún el género musical (ya sea música clásica, contemporáneas como el rock o el pop, etc)
la colocación de los instrumentos dentro del plano espacial, ya sea izquierda-derecha o
delante-detrás, es diferente. Para conseguir dicha colocación y dar la sensación de es-
pacialidad tal y como se situarían los músicos en un escenario por ejemplo, se utilizan
técnicas como la panoramización de instrumentos, el aumento de la reverberación, etc.
Como ejemplo claro tenemos una batería acústica. Para una batería acústica en géne-
ros de música moderna como pop o rock, y utilizando un estándar de 8 micrófonos para
sopnorizarla, podemos tener el siguiente esquema de localización estéreo:
Bombo - Centro
Caja - Centro
Charles - 20 % R1
Tom 1 - 10 % R
Tom 2 - 10 % L2
Tom base - 20 L
Aéreo L - 100 % L
Aéreo R - 100 % R
Como vemos, al final se trata de simular en la mezcla la colocación natural de los ins-
trumentos en el espacio, de manera que no se amontonen todo en el centro de la mezcla.
Los porcentajes anteriormente expuestos son sólo un ejemplo de como pueden ir colo-
cadas las panoramizaciones de cada elemento. Dicha tabla se puede modificar a criterio
personal de cada uno siempre que ofrezca buenos resultados.
Para el resto de instrumentos se hará algo similar, colocando elementos principales
como la voz o el bajo al centro, y abriendo otros como las guitarras y los coros a izquierda
y derecha, de manera que tengamos un estéreo rico y amplio, pero siempre manteniendo
lo principal de la canción en el centro de la mezcla.
Tal y como vemos en la fig. 3.1, se puede ver otro ejemplo de panoramización de los
instrumentos. Además se aprecia que además de la panoramización, existe también una
importancia relevante en la reverberación que se aplica a cada instrumento, así como su
nivel en la mezcla. Ambos detalles ayudan a definir la cercanía del instrumento al oyente.
Por ejemplo, si nos situamos en una sala, a mayor distancia, el sonido se atenúa, pier-
de altas frecuencias, y aumenta la sensación de reverberación debido a que nos llega una
relación de sonido directo y reflejado diferente. Si la fuente se encuentra a escasos me-
tros de nosotros, recibiremos en su mayoría sonido directo, y por tanto la sensación de
reverberación será menor.
Con todo lo visto, se pretende realizar un programa que sea capaz de implementar to-
do lo explicado y que por tanto facilite el entrenamiento y la asimilación de los conceptos
de planos sonoros, colocación espacial de la fuente de sonido, y, en definitiva, facilite al
alumno el entendimiento del plano estéreo y la distancia de la fuente de sonido al oyente.
Figura 3.2: Instrumentos con su colocación frecuencial a lo largo del espectro audible.
reducir de 24 bits a 16 bits, se suele enmascarar con un dither digital. En cualquier caso, es
interesante trabajar sobre este concepto con el objetivo de llegar a ser capaces de identifi-
carlo de oído, de manera que podamos ser un instrumento más de detección y por tanto
ser menos dependientes de herramientas externas.
Otro de los ruidos que suelen aparecer es el aliasing, causado por trabajar a una fre-
cuencia de muestreo inferior a 44.100 Hz, que es el estándar mínimo al que se garantiza
que la frecuencia de muestreo será mayor al doble de la frecuencia máxima audible. En
el momento en que reducimos la frecuencia por debajo de la anteriormente citada, em-
pieza a aparecer ruido de aliasing. Todo esto viene explicado en el teorema de Nyquist-
Shannon1 .
Figura 3.3: Ejemplo de una señal sin ruido blanco agregado, con ruido leve (10 dB SNR) y con
ruido intenso (20dB SNR).
En este capítulo nos vamos a meter de lleno en el desarrollo de las propias aplicacio-
nes en sí, hablando un poco de las decisiones que se han tomado previas a empezar a
escribir código propiamente dicho.
Estas decisiones son importantes ya que nos marcarán las pautas a seguir a la hora de
programar. Serán las encargadas de definirnos factores tan importantes como el flujo de
trabajo que seguirá el usuario mientras realiza los ejercicios, las indicaciones que debere-
mos darles para un correcto entendimiento del ejercicio así como un seguimiento de sus
resultados, etc.
Además de hablar de cómo están constituidas las aplicaciones y del método de fun-
cionamiento, se expondrán decisiones relevantes acerca de las decisiones tomadas acerca
de la interfaz gráfica, etc.
31
32 CAPÍTULO 4. DISEÑO DEL SISTEMA
tros con los que trabaja internamente la aplicación disponibles para el usuario. En ella el
usuario puede, y debe, practicar con ellos de forma que llegue a entender en qué afecta
cada uno de dichos parámetros al sonido.
De esta manera, podrá practicar para entender cómo funciona cada uno de dichos
parámetros y en qué y cuánto afecta su modificación en el sonido resultante.
Por ejemplo, en la imagen podemos observar cómo disponemos de dos osciladores
independientes, dónde es posible modificar parámetros tan diversos como la frecuencia
de los mismos, el tipo de onda o la amplitud. Además, disponemos de displays para que
el usuario pueda observar, además de escuchar, lo que está modificando.
por la salida convencional de audio del ordenador. El usuario deberá entonces adivinar
de oído dichos parámetros.
Al principio será complicado y costoso, pero a medida que el usuario entrene con la
aplicación y vaya puliendo su oído en el campo correspondiente, será capaz de interpre-
tar mejor lo que escucha y adivinar que tipo de modificación ha sufrido la muestra de
audio, es decir, lo que está sonando.
Como ejemplo, y al igual que en el apartado anterior, tenemos la aplicación de “Re-
conocimiento frecuencial”. En dicha aplicación, la “Zona de entrenamiento”, la cual se
puede ver en la fig. 4.2. En ella se aprecia que ya no están disponibles todos los paráme-
tros. Ahora el objetivo es que el usuario genere una muestra. Dicha muestra sonará y el
usuario deberá adivinar que parámetros contiene y colocarlos en la zona de “Respues-
tas”.
De esta forma, y repitiendo el proceso, el oído estará cada vez más entrenado y será
capaz de reconocer al instante qué está escuchando.
el entrenamiento y la comprensión total de cada uno de los campos del audio contenidos
en cada una de las aplicaciones.
El objetivo final es que el usuario pueda, en primer lugar, practicar y aprender, y en
segundo lugar aplicar los conocimientos adquiridos para entrenar y afinar el oído.
Es fácil pensar entonces en los pasos a seguir por un usuario nuevo:
2º Comenzar a practicar con dicho modo y observar cómo se comporta cada pará-
metro y en qué afecta dicha modificación al sonido resultante.
3º Una vez comprendidos todos los parámetros, procederá a leer las instrucciones
del “Modo de entrenamiento”.
4.2.1 Widgets
Una vez se decidió que se iba a utilizar CsoundQt en lugar de Cabbage como programa
front-end para realizar nuestro proyecto, tal y como ya se vio en la sección 2.6.2, las posi-
bilidades gráficas para interfaz se limitaron a lo que nos ofrecía únicamente CsoundQt.
4.2. INTERFAZ GRÁFICA 35
4.2.1.1 Presets
Otra funcionalidad que nos ofrece CsoundQt es la poder crear, guardar y cargar presets
desde la propia interfaz gráfica. Ahora bien, primero vamos a ver que es un preset.
Un preset es una configuración con unos valores determinados de uno o varios widgets.
Es decir, podemos guardar una configuración concreta de los widgets que deseemos para
poder así cargar dicha configuración cuando deseemos.
Para gestionar los presets, Csound hace uso de una serie de canales reservados para
gestionar la lectura de los mísmos, por ejemplo.
Para poder crear un preset en CsoundQt primero debemos crear todos los widgets que
queremos que formen parte de el. Una vez tengamos todos creados, debemos colocarlos
en la posición que deseemos que se guarden. Una vez tengamos todo colocado como
deseamos, deberemos pulsar en la ventana widgets con el botón derecho del ratón, y a
continuación en la opción Nuevo Preset. Una vez se nos habrá la ventana, deberemos
elegir un nombre y un número que identifiquen al preset, y de esta forma ya tendríamos
almacenado nuestro preset.
Para cargar un preset de manera sencilla, podremos volver a pulsar con el botón de-
recho sobre la ventana widgets y a continuación en la opción Cargar preset. Se nos abrirá
una ventana en donde podremos seleccionar con doble click sobre el preset que deseemos
cargar.
Ahora sí, hablaremos sobre los canales reservados para el uso de presets. Un canal
reservado es, en esencia, un identificador (el cual viene precedido por el símbolo “_”)
que implementa una función específica y propia de CsoundQt.
Por tanto, si creamos un widget y le colocamos en su nombre de canal un canal reser-
vado de CsoundQt, éste realizará una función específica asociada a dicho canal reservado.
Existen 3 canales reservados en CsoundQt relacionados con el uso de presets, los cuáles
se describen a continuación:
_GetPresetName: Obtiene el nombre del preset que está cargado en ese momento. Se
utiliza por ejemplo para mostrarlo a través de un display y que el usuario sepa en
todo momento sobre que preset está trabajando.
Tal y como vemos en la fig. 4.4, se ha diseñado una estructura general y clara sobre
la que irán diseñadas cada una de las 4 aplicaciones que componen nuestra suite. Dicho
esquema1 define claramente las secciones y los botones comunes a todas las aplicaciones.
Empezando por la parte superior observamos una barra general que contiene un bo-
tón llamado Start, el título de la aplicación en cuestión y otro botón complementario con
el rótulo de Stop. Ambos botones gestionan el arranque y la detención de CsoundQt a tra-
vés de dos canales reservados, de manera que el usuario no tenga que tocar la interfaz de
CsoundQt, ya que puede ser autónomo directamente desde nuestra interfaz. Dichos cana-
les reservados son _Play y _Stop, y nos facilitan el poder arrancar y detener el programa
desde un widget de nuestra interfaz.
A continuación, y separadas claramente por dos secciones independientes, tenemos
la “Zona de pruebas” y la “Zona de entrenamiento, comentadas anteriormente en la sección
4.1. Tal y como vemos en el esquema, ambas zonas están compuestas por su rótulo iden-
tificativo en la parte superior, una amplia zona destinada directamente a implementar
cada una de las secciones y por último, pero no menos importante, encontramos en la
parte inferior las “Instrucciones” pertenecientes a cada sección.
Figura 4.5: Ejemplo de diseño final, con la composición de colores y tipografías definitivas.
vios sobre audio, lo que nos limita inicialmente a un usuario adulto, es decir, no se espera
que un usuario infantil haga uso de las mismas. Partiendo de esta premisa se ha decidido
implementar un sistema de auto evaluación.
En caso de que una de las muestras se resista mucho por algún motivo y no seamos
capaces de acertar alguna de las respuestas, se ha implementado un botón “Soluciones”,
donde si se pulsa se colocará automáticamente en la zona de respuestas la respuesta
correcta a cada parámetros. De esta manera, cuando el usuario comience a entrenar y
no sea capaz de acertar alguno de los parámetros, podrá saber cual es la respuesta para
poder mejorar.
4.3. EVALUACIÓN DE LOS EJERCICIOS 39
La idea final es que sea el usuario quien se auto evalúe a base de rondas de entrena-
miento, buscando siempre la auto superación y la perfección en cada uno de los ejercicios
antes de pasar al siguiente, tal y como se observa en el flujo de trabajo de la fig. 4.6.
CAPÍTULO 5
Implementación
Llegados a este punto ya podemos asumir que tenemos un sistema diseñado y con
unas especificaciones claras y concisas, por lo que se deduce que a llegado el momento
de implementarlo. Para su implementación, tal y como se ha mencionado anteriormente
en el apartado 2.6.2, se utilizará CsoundQt como herramienta de desarrollo.
Antes de comenzar a describir la implementación específica de cada una de las cuatro
aplicaciones se pretende dejar claro que la secuencia de desarrollo no fue directa, es decir,
no se diseñó todo el sistema de aplicaciones y luego se desarrolló, si no que se fueron com-
plementando ambos procesos de manera paralela. De esta forma de trabajo, podíamos ir
desarrollando la siguiente aplicación habiendo aprendido de los errores cometidos en
la anterior y habiendo aprendido nuevas técnicas, pudiendo abrir las posibilidades. Por
tanto, la secuencia de desarrollo fue en primer lugar la aplicación de “Reconocimiento Es-
pacial”, seguida de “Reconocimiento Frecuencial”, tras la cuál se desarrolló una primera
versión de “Ruido y Degradación” a la que siguió “Ganancia y Dinámica”. Llegados a
este punto se realizaron modificaciones notables a “Ruido y Degradación” para añadir
funcionalidades a la misma, recomendadas por el tutor.
Por tanto, y vista la secuencia de trabajo seguida durante todo el desarrollo, vamos a
ver la implementación de cada una de las cuatro aplicaciones en orden cronológico a su
desarrollo.
40
5.1. VISIÓN GENERAL 41
tro proyecto, como son la frecuencia de muestreo (FS), el número de muestras por periodo
de control, el número de canales o si hubiera normalización a 0 dB.
A continuación definiremos e inicializaremos las variables globales que utilizarán du-
rante el programa. Es importante realizar este paso ya que Csound funciona de una mane-
ra diferente a lenguajes como C o C++. En Csound el programa está ejecutando el código
de los instrumentos en bucle, por lo que las variables que declaremos dentro de éstos se
resetearán en cada iteración. Para evitar eso debemos definirlas como variables globales
fuera de los instrumentos.
Tras la definición de las variables globales se declara el instrumento 10. Dicho ins-
trumento es un tanto especial ya que no manejará nada de audio, únicamente será el
encargado de hacer de puente de comunicación entre los widgets de la GUI y el progra-
ma. Se ha decidido realizarlo de esta forma por simplicidad en la programación y para
conseguir un control mayor a partir de un código más limpio y ordenado. Es importante
recordar que éste instrumento también debemos activarlo en la partitura (CsScore).
Después le siguen la declaración de los instrumentos 1 y 2, los cuáles definen la “Zona
de pruebas” y la “Zona de prácticas” respectivamente. En algún caso particular como en
el programa “Reconocimiento frecuencial” se ha necesitado definir 2 instrumentos para
cada una de las zonas nombradas, pero la estructura general es similar a la explicada, por
lo que se deja como algo meramente anecdótico.
1 ; CABECERA
2 < CsoundSynthesizer >
3 < CsOptions >
4 ; OPCIONES GENERALES DE CSOUND
5 </ CsOptions >
6 < CsInstruments >
7
8 sr = 44100 ; FS
9 ksmps = 128 ; N Ú MERO DE MUESTRAS POR PERIODO DE CONTROL
10 nchnls = 2 ; N Ú MERO DE CANALES
11 0 dbfs = 1.0 ; NORMALIZACI Ó N DEL NIVEL 0 dB
12
13 ; DECLARACI Ó N E INICIALIZACI Ó N DE VARIABLES GLOBALES
14
15 instr 10 ; INTERFAZ GR Á FICA GUI
16 ; INSTRUMENTO 10 ES EL ENCARGADO DE LA COMUNICACI Ó N GENERAL ENTRE LOS
WIDGETS GR Á FICOS Y EL PROGRAMA .
17 endin
18
19 instr 1 ; SECCI Ó N DE PRUEBA
20 ; INSTRUMENTO 1 DEFINE LA SECCION DE PRUEBA .
21 endin
22
23 instr 2 ; SECCI Ó N DE PR Á CTICAS
24 ; INSTRUMENTO 2 DEFINE LA SECCI Ó N DE PR Á CTICAS .
25 endin
26
27 ; INSTRUMENTOS ADICIONALES SI FUESEN NECESARIOS
28 </ CsInstruments >
29 < CsScore >
30 ; DEFINICI Ó N DE TABLAS DE ONDA
31 ; INICIALIZACI Ó N DE LOS INSTRUMENTOS
32 i 1 0 10000
33 i 2 0 10000
34 i 10 0 10000
35 e
36 </ CsScore >
37 </ CsoundSynthesizer >
42 CAPÍTULO 5. IMPLEMENTACIÓN
Por último se define la partitura en la que vienen activados cada uno de los instrumentos
definidos. Se activan en el instante 0 y se mantienen durante un largo periodo de tiempo
de manera que difícilmente se vaya a detener mientras el usuario trabaja con el.
Por otro lado, en la fig. 5.1 podemos observar el flujo de trabajo general dentro de
cada una de las aplicaciones, siendo éste flujo para la “Zona de prácticas”. El esquema
para la “Zona de pruebas” es abierto, ya que el usuario podrá modificar cada paráme-
tro de manera independiente, por lo que no se ha considerado mostrarlo por no poseer
ninguna utilidad. Por tanto, el esquema mostrado en la figura y perteneciente al flujo de
trabajo dentro de la “Zona de prácticas” será general y común a cada una de las cuatro
aplicaciones, asentando así una base de trabajo estándar que sea común a todas ellas.
5.2.1.1 Main
En esta sección encontramos la información principal y más importante a la hora de
trabajar en la “Zona de pruebas”. Podemos elegir con que tipo de audio deseamos traba-
jar, pudiendo elegir entre una lista de lo más variada (Rock&Roll, Instrumental, Locución,
Funk, Cine y muestra Live). Para desarrollar este menú desplegable se ha hecho uso del
widget Menu y una serie de condicionales if para detectar que muestra ha sido elegida
por el usuario y su asignación a una variable de audio concreta. Para las muestras hace
uso de varios archivos wav los cuáles deben estar contenidos dentro de la carpeta del pro-
yecto. Además hay varios detalles que comentar. Por ejemplo, para cargar los archivos
se utilizó la función soundin, la cuál reproduce en bucle la muestra seleccionada, facili-
tando así el trabajo al usuario, ya que de esta manera no dejará al programa nunca en
silencio. Además, y como funcionalidad extra, se ha añadido la posibilidad de trabajar
con el audio entrante por el micrófono del ordenador con el que se está trabajando. Es
una funcionalidad extra que se decidió añadir aún con el ligero problema de tener una
latencia de trabajo considerable.
Por otro lado nos encontramos un con la posibilidad de activar o desactivar la “Zona
de pruebas” desde un checkbox. Dicho checkbox vale 1 o 0 dependiendo de si está o no
activado, y a través de un sencillo condicional if podemos activar o no la salida de audio,
activando así la sección.
Para terminar tenemos una serie de displays que nos muestran los valores de ampli-
tud, balance y cantidad de reverb. Además, se consideró interesante la opción de imple-
mentar la cantidad de reverb y la amplitud en formato logarítmico, es decir, en decibelios.
Esto viene justificado por el factor de que a la hora de trabajar en una mesa o programa de
audio, siempre se trabaja en éste formato, y por tanto se acerca mucho más a la realidad
que si fuese en escala lineal.
5.2.1.2 Reverb
En esta ventana podemos modificar dos parámetros característicos de la reverb que
se aplica al sonido a medida que éste se aleja de la fuente. Para entender esto es fácil
pensar en una habitación en la que, si estamos cerca de la fuente sonora, la cantidad de
sonido directo que nos llega será mucho mayor que la de sonido reflejado. A medida
que nos alejamos de la fuente, ésta relación disminuye y por tanto la sensación de sonido
reverberado será mayor.
44 CAPÍTULO 5. IMPLEMENTACIÓN
Para ello se ha implementado una reverb sencilla en la que únicamente podemos mo-
dificar dos parámetros: el tamaño de la habitación y el amortiguamiento en altas frecuen-
cias.
Para implementar la reverberación se ha llevado un proceso similar a cómo se trabaja
en audio profesional. La reverberación no se aplica directamente en el audio, si no que
éste se manda a un canal independiente y se genera dicha reverberación. De ésta manera
aumentamos la cantidad de la misma únicamente aumentando el nivel de dicho canal. En
nuestro caso en vez un canal se ha creado un instrumento aparte, el cuál es el encargado
de generar la reverberación. Dependiendo del nivel de señal que le enviemos, el nivel de
la reverberación será mayor o menor.
Para la salida de audio utilizamos el opcode out, teniendo en cuenta en todo mo-
mento la cantidad de panoramización que debemos aplicar a cada uno de los dos cana-
les estéreo, para lo cual utilizamos la fórmula out aSal*(1-gkstereo),aSal*gkstereo,
asegurando así el estéreo de manera correcta a la salida de audio. Tras esto, gestiona la
cantidad de reverberación, la cual será directamente proporcional a lo lejos que estemos
de la fuente. Una vez esto, genera una variable global llamada gaRvbSend, que será el
envío de señal que hacemos a la reverberación, la cual está en otro instrumento.
Al final se trata de tener una señal seca1 sin reverberación y otra que contenga la
reverberación. De esta manera jugaremos con los niveles de ambas para añadir más o
menos cantidad de reverberación a la salida general de audio.
El instrumento que define la reverb recibe los parámetros de la sección “Reverb” de la
interfaz gráfica, y con ellos y la variable global explicada anteriormente, genera la rever-
beración y la saca por la salida de audio. Además, debemos tener en cuenta el estéreo a la
hora de sacar el sonido por la salida de audio, tanto para la señal wet como para la señal
dry.
1 En las reverberaciones profesionales, a la señal sin reverberación se le llama seca o dry, mientras que a la
5.2.2.3 Reverb
Al igual que en la sección anterior, esta también es una sección para las respuestas del
usuario. La diferencia radica en que en esta zona el usuario deberá responder la cantidad
de reverberación y el tamaño de la habitación que escucha en la muestra aleatoria. El
funcionamiento de los indicadores luminosos y el sistema de fallos funciona igual que en
el apartado anterior.
5.2.2.4 Visualización
Esta sección se añadió como un apoyo visual. Lo único que hace es mostrar en un
PAD XY similar al de la “Zona de pruebas” las respuestas que el usuario coloca en los
menús de la sección “Situación espacial” de respuestas. De esta manera, puede hacerse
una idea gráfica de dónde está situado el oyente en la sala.
46 CAPÍTULO 5. IMPLEMENTACIÓN
La modificación manual del PAD no afecta a ningún parámetro del programa y por
tanto únicamente funciona como widget de salida, y no de entrada.
5.2.2.5 Resultados
En esta sección, y tal y como aclara su nombre, tenemos los resultados de cada ejer-
cicio. Para ello, en primer lugar tenemos un display que nos muestra el número de fallos
de cada ejercicio. Para contabilizar los fallos se utiliza el sistema explicado en la sección
5.2.2.2. Al llegar al final de una vuelta del código, se almacenan en las variables auxiliares
de control el valor de la respuesta del usuario para cada uno de los menús de repuestas.
De esta manera, podremos comprobar en la siguiente vuelta si dicha respuesta ha sido
modificada, y en función de eso, sumar un fallo al contador, tal y como ya se ha men-
cionado previamente. A continuación, y mediante la función sprintfk, convertimos la
variable gkfallos, la cual tiene el formato 1.000, a una cadena de texto con el formato 1.
De esta manera, a la hora de mostrar el número de fallos, éste será un número entero y
sin decimales, los cuáles no nos interesan a la hora de dar un número de fallos.
Por último, y para terminar con la sección y la aplicación, nos encontramos con el
botón “Resultados”. Si el usuario pulsa en el, éste devuelve a los menús las repuestas a
cada variable. Se ha facilitado dicho botón para ocasiones en las que no se consiga acertar
alguna de las respuestas, poder conocer su solución y aprender para la próxima vez. Para
devolver las respuestas, únicamente gestionamos mediante un condicional if si el botón
ha sido pulsado, y mediante una pequeña adaptación de las variables aleatorias para que
coincidan con su posición en el menú de respuestas, éstas se devuelven a través de un
outvalue.
Para consultar el código fuente completo de la aplicación ver el Anexo A.
5.3.1.1 Muestra 1
En primer lugar, y como elemento característicos de esta aplicación respecto del resto,
existe la diferencia en que existen cuatro instrumentos, y no dos. Dos instrumentos son
los que definen cada una de las secciones de la “Zona de pruebas”, y los otros dos para
las secciones de “Muestra 1” y “Muestra 2” de la “Zona de prácticas”.
Una vez mencionado dicho detalle, y ya en la sección “Muestra 1”, nos encontramos
con un oscilador común, definido por el opcode oscilikt, al cual se le pasa por paráme-
tros de entrada la amplitud, la frecuencia y la tabla de onda que se desea utilizar, y éste
devuelve una variable de tipo audio con la señal resultante.
Para controlar sus parámetros de entrada se disponen de varios elementos de control
a disposición del usuario. En primer lugar, y para la amplitud, éste dispone de un widget
tipo knob o rotor para aumentar o disminuir la amplitud de la muestra resultante.
Por otro lado, y para la frecuencia, dispone de un sistema un tanto peculiar. En primer
lugar, dispone de un spinbox con unos valores que van del 1 al 10 en pasos de unidad, y
por otro lado, un menú con valores de x10, x100 y x1000. La frecuencia resultante entonces
será, el número del spinbox multiplicado por la potencia elegida en el menú. De esta
manera, el usuario dispone de una paleta de frecuencias discreta y controlada, al igual
que bien diferenciadas entre sí. Además, dispone de un display en el que se muestra la
frecuencia resultante y la amplitud.
Para terminar existe otro menú con un listado de tipos de onda, entre las que se inclu-
yen sinusoidal, diente de sierra, cuadrada, pulso, segmento y sigmoide. Cada una tiene
unas características armónicas diferentes y variadas, ofreciendo así una mayor riqueza y
variedad sonora al usuario. Para visualizar los tipos de onda se dispone de una pantalla
de visualización de un ciclo de onda en la parte inferior, tal y como se puede observar en
48 CAPÍTULO 5. IMPLEMENTACIÓN
la fig. 5.4. De esta forma, no sólo podemos escuchar, si no que también podemos “visua-
lizar” lo que suena.
Para la generación de los tipos de onda se hace uso de la función GEN10 de Csound, la
cuál nos permite crear una tabla de onda a partir de sus armónicos parciales, tal y cómo
vemos en el código inferior.
5.3.1.2 Muestra 2
La sección que nos acontece funciona y está declarada exactamente igual a la sec-
ción “Muestra 1”, ya que su funcionamiento es idéntico. La diferencia radica en que cada
una está declarada en un instrumento diferente e independiente, de manera que pode-
mos trabajar con uno, otro, o ambos de manera simultánea. Esto es muy útil para añadir
dificultad, mezclando dos tonos diferentes para complicar la identificación de cada uno.
Para activar o desactivar cada uno de ellos se ha implementado un spinbox en cada
uno a modo de botón de activación.
En este punto se han agrupado las dos secciones de la aplicación denominadas “Mues-
tra 1” y “Muestra 2” por ser iguales y no caer en la redundancia. En ellas disponemos de
los controles básicos para cada una de las muestras en la “Zona de prácticas”.
En primer lugar tenemos un botón tipo spinbox para activar o desactivar cada una de
las muestras. De esta forma, el usuario podrá entrenar con una muestra o ambas, según
quiera añadir más o menos dificultad. Cabe destacar que en cualquier caso se generan los
valores aleatorios y, por tanto, cada una de las muestras. Desde este control únicamente
las activamos por los auriculares o no.
5.3. RECONOCIMIENTO FRECUENCIAL 49
Para hacer más dinámica a la aplicación se han filtrado las respuestas en función de
si esa muestra está activada. Es decir, el contador de fallos no sumará fallos si el usuario
intenta responder los parámetros de una muestra que no esté activa, porque se sobre en-
tiende que no está trabajando con ella. Por tanto, para que el contador de fallos funcione,
y por tanto, la verificación de respuesta correcta, dicha muestra debe estar activa desde
su sección de control.
5.3.2.4 Resultados
Por último, tenemos la zona de “Resultados”, la cual funciona de manera similar a
la anteriormente mencionada en la aplicación anterior. Disponemos de un display para
mostrar los fallos que lleva el usuario en cada ejercicio, el cual únicamente sumará si la
muestra que está respondiendo está activa, evitando así sumar fallos por error de una
muestra con la que no se esté trabajando. Por otro lado disponemos de un botón de solu-
ciones, el cual devuelve en cualquier momento las soluciones a los menús de respuesta.
Dicho botón, y al igual que el contador de fallos, está filtrado según la muestra que esté
50 CAPÍTULO 5. IMPLEMENTACIÓN
activa, y, por tanto, únicamente devolverá las soluciones de la muestra que el usuario
tenga activa.
La devolución de resultados funciona por pasos. En primer lugar se comprueba si
el botón “Soluciones‘” ha sido pulsado, y en el caso de que valga 1, se comprueba si la
muestra está activa. Únicamente en el caso en que ambas variables valgan 1 se mostrarán
las soluciones en los menús correspondientes.
5.4.1.2 Ruido
En esta sección se trabaja con diferentes ruidos, con el objetivo de que el usuario sea
capaz de identificar cada uno de ellos. Se han incorporado los ruidos más habituales
dentro de una instalación de audio, como pueden ser ruido blanco, ruido rosa o ruido
eléctrico. Obviamente, en una instalación compleja nos pueden aparecer diferentes tipos
de ruido que nos puedan ensuciar la señal, pero sí es cierto que todos giran en torno a
estos tres mencionados anteriormente, por lo que se ha considerado suficiente incorporar
estos tres como tipos de ruido principales para trabajar.
Para la generación del ruido blanco y ruido rosa se han utilizado los opcodes pro-
pios de Csound noise y pinkish. A través de ellos, y únicamente pasando por entrada
la amplitud, éstos nos devuelven una variable de tipo audio con el ruido generado. Para
decidir cada uno de ellos únicamente debemos comprobar cuál está seleccionado en el
menú por parte del usuario, previa comprobación de si está activada la sección “Ruido”.
Por otro lado, y para la generación del ruido eléctrico, inicialmente se pensó en generarlo
de manera artificial. Al encontrarnos con problemas a la hora de crear un espectro armó-
nico rico y similar al ruido eléctrico real se decidió por introducir el ruido a través de
una muestra de audio externa, siempre buscando que el ruido fuese similar al que nos
podemos encontrar en una instalación real.
Para generar el audio de ruido eléctrico se montó una pista de grabación en el software
Logic Pro X, y, a través de una entrada de audio de la tarjeta de sonido externa se conectó
un cable, el cual se dejó al aire en el otro extremo. Al tocar dicho extremo con un metal
de algún elemento conectado a la corriente eléctrica, éste induce dicha señal en el cable y
podemos grabar la señal eléctrica. A través el previo de micrófono de la tarjeta podemos
conseguir un nivel adecuado para su posterior procesamiento.
Para realizar este proceso, tuvimos que realizarlo con mucho cuidado para proteger
el material de posibles subidas de tensión o problemas que pudieran deteriorar algún
circuito, pero ya sabíamos que funcionaría por experiencias anteriores, por lo que no fue
mayor problema. Tras esto, tratamos la señal grabada para adecuarla a niveles válidos
para nuestra aplicación.
5.4.1.3 Cuantización
En esta sección se puede trabajar con la cantidad de bits de cuantización de la muestra.
Para ello, debemos mencionar que todas las muestras están en calidad 44.100 Hz y 16 bits,
es decir, calidad de CD de audio estándar.
52 CAPÍTULO 5. IMPLEMENTACIÓN
Partiendo de esa base, en esta sección podemos reducir la cantidad de bits desde los 16
originales hasta 4, es decir, pasamos de 216 = 65536 niveles de cuantización a únicamente
24 = 16 niveles. Obviamente, dicha reducción es muy notoria, y por tanto, la calidad el
audio se ve mermada de forma notoria también. Para poder reducir la cantidad de bits se
ha colocado un slider con una rotulación en la parte inferior que nos indica la escala entre
la que nos movemos, tal y como se observa en la fig. 5.9.
5.4.1.4 Muestreo
5.4.2.2 Dificultad
Llegados a este punto comienza la complejidad de esta aplicación, la cual se dife-
rencia del resto en que el usuario puede elegir una dificultad concreta. Para ello se ha
colocado un menú en el que el usuario puede elegir la cantidad de degradaciones de las
anteriormente explicadas que quiere que se apliquen a la muestra del ejercicio.
La dificultad reside en que elige cuántas, pero no cuáles. Para realizar esto primero se
generan todos los parámetros aleatorios tal y como ya se ha mencionado anteriormente,
además de un parámetro aleatorio extra entre 0 y 2. Dicho parámetro se utilizará para
decidir que degradaciones se aplican dependiendo de la dificultad seleccionada.
Después se crean todas las degradaciones, cada una en una muestra de audio dife-
rente, y, dependiendo de la dificultad elegida y del número aleatorio, se aplicarán a la
muestra final las degradaciones correspondientes. Por ejemplo, en caso de elegir una de-
gradación sólo, comprobamos el número aleatorio que nos dice que degradación aplicar,
si dicho número vale 0 aplicamos ruido, si vale 1 cuantización y si vale 2, reducción de
54 CAPÍTULO 5. IMPLEMENTACIÓN
nera arreglamos el fallo y evitamos que contase fallos en la primera pulsación de manera
errónea, solucionando así el bug.
Para ver el código fuente completo se puede consultar el Anexo C.
5.4.2.5 Resultados
Por último tenemos la sección de resultados, en la cuál, y al igual que en todas las
aplicaciones, se mostrará el número de fallos cometido en cada ejercicio, además del ya
conocido botón de soluciones.
Para mostrar las soluciones de manera adecuada, y tal y como ya se ha comentado
antes, se hace uso del flag que nos indica que variables están entrando en juego en cada
ejercicio.
Por tanto, una vez habiendo comprobado si se ha pulsado el botón de soluciones,
comprobamos el flag en el que estamos. Dependiendo de su valor, devolveremos los va-
lores a los checks superiores, activando únicamente el de la degradación aplicada en ese
ejercicio y poniendo a 0 los que no. Por otro lado, deberemos mostrar las soluciones en la
zona de respuestas para los parámetros que forman parte de ese flag.
Deberemos realizar lo mismo para cada uno de los 6 flags, de manera que en cualquie-
ra de los casos se devuelvan las soluciones de manera correcta y sin mostrar respuestas
para parámetros que no entran en juego en cada ejercicio.
rio únicamente deberá trabajar con ambos presets y no deberá adivinar cada uno de los
parámetros que lo componen. Esto se ha decidido así por la extrema dificultad que su-
pondría adivinar parámetros tan dispares como el codo del procesador, el ataque o el
decaimiento.
5.5.1.2 Ganancia
Entramos en la sección “Ganancia”. Como se habrá podido observar, en la sección
“Main” de esta aplicación no existe posibilidad de controlar el volumen de la muestra.
Esto es debido a esta sección. En ella, el usuario dispone de un menú desplegable en el
que puede elegir una de las siete ganancias establecidas, las cuáles son 0 dB, -1 dB, -2 dB,
-3 dB, -6 dB, -9 dB, -12 dB. El motivo de que se hayan elegido las ganancias de manera
discreta y preestablecidas es porque así podremos aplicar dichas ganancias en la “Zona
de entrenamiento” y que puedan ser identificables. Si se hubiera utilizado un slider con
valores de ganancia infinitos, sería muy difícil preguntar al usuario por qué ganancia hay
aplicada a una muestra, o que seleccionase un nivel de dificultad a partir de la ganancia
aplicada.
Además, y para completar la sección, se ha aplicado un display para visualizar la ga-
nancia seleccionada. Es información redundante, ya que en el mismo menú de selección
se puede consultar, pero se ha creído conveniente para seguir con los sistemas de vi-
sualización de información que se vienen utilizando a lo largo de todas las aplicaciones,
manteniendo así la coherencia en el diseño.
5.5. GANANCIA Y DINÁMICA 57
5.5.1.3 Dinámica
Para terminar la “Zona de pruebas” tenemos la sección destinada a la dinámica. En
ella, el usuario dispone de un completo procesador de dinámica, en el cuál puede modifi-
car uno a uno cada uno de sus parámetros. Cada parámetro, tal y como se puede observar
en la fig. 5.15, dispone de un slider para controlarlo, así como un label en la zona inferior
con el parámetro al que corresponden y un display a la derecha para visualizar el valor
del parámetro que hay en cada momento.
Además, en la zona inferior disponemos de un spinbox para activar el procesador,
el cuál se aplicará a la muestra seleccionada, independientemente de la ganancia que
hayamos puesto en la sección “Ganancia”.
Por otro lado, disponemos de un combo de spinbox y display para poder seleccionar y
visualizar cada uno de los dos presets disponibles, compresor y puerta de ruido.
Ahora entraremos de lleno en la parte técnica, es decir, el código. Para poder imple-
mentar el procesador de dinámica nos apoyamos en primer lugar del código compress.csd
de la colección McCurdy de los ejemplos, en la sección DynamicsProcessing. Cuando obser-
vamos cómo funcionaba el opcode compress, implementamos nuestro propio procesador
dinámico, utilizando únicamente del código mencionado las tres líneas para convertir los
58 CAPÍTULO 5. IMPLEMENTACIÓN
sliders lineales en logarítmicos. Dicho código se puede observar en la parte inferior, y, apli-
cado a al opcode invalue de cada slider de entrada, convierte los valores que éste introduce
en escala logarítmica, de forma que para parámetros como el Ratio, nos pueden ser muy
útiles.
Mencionar que al principio tuvimos múltiples problemas con éstas líneas ya que en
la generación de la variable giExp100, utilizada para el Ratio, tal y como se observa en
el código inferior, ésta comprendía los valores entre 0 y 100, y no entre 1 y 100, como se
muestra en el código inferior. Esto nos ocasionó múltiples problemas, ya que al aplicar al
procesador valores para el ratio de compresión menores a 1, la salida de audio se dispara-
ba a valores incontrolables. Para solucionarlo, tuvimos que detectar la errata en el código
y subsanarla.
Una vez tuvimos configurados los sliders de manera adecuada, nos apoyamos en el
opcode compress de Csound para generar el procesado dinámico de la muestra activa.
Para ello, se le introducen los canales L y R de la muestra (en nuestro caso se introduce
la misma muestra al ser ésta mono), así como el nivel de umbral, los valores para el codo
bajo y alto del procesador, el ratio de compresión, el ataque, y el decaimiento, así como
un parámetro fijo llamado ilook, el cuál siempre vale 0.5.
Una vez procesada la muestra, ésta quedaba con un volumen muy bajo, por lo que se
introdujo un slider de corrección de ganancia1 , dejando la muestra procesada y corregida,
lista para ser sacada por la salida de audio de nuestro sistema.
5.5.2.2 Ganancia
Centrándonos ahora en el entrenamiento de la ganancia, éste se ha realizado de ma-
nera similar a aplicaciones comerciales conocidas y vistas en la sección 2.4. Para ello,
1 En inglés: Make up gain, disponible en cualquier procesador de dinámica.
5.5. GANANCIA Y DINÁMICA 59
el usuario debe seleccionar una dificultad, la cual viene caracterizada por la cantidad
de atenuación de la muestra. El ejercicio consistirá en identificar cuál, de dos muestras
aleatorias, es la atenuada y cuál posee el volumen original. Por tanto, a mayor atenua-
ción aplicada, más sencillo será identificarla. Este es el motivo por el cuál en la “Zona
de pruebas” las ganancias están preestablecidas, para poder utilizarlas como niveles de
dificultad en esta sección.
Por tanto, el usuario deberá, en primer lugar, seleccionar el nivel de atenuación, y
por tanto de dificultad, con el que quiere trabajar. tras esto, tendrá un spinbox asociado
a un display en el que podrá elegir que muestra desea escuchar, pudiendo elegir entre
“Muestra 1” y “Muestra 2”, tal y como observamos en la fig. 5.16.
Por tanto, se trata de un entrenamiento a ciegas, en las que el oído será la única he-
rramienta para acertar la respuesta atenuada. Dicha respuesta se deberá indicar en un
menú, el cuál mostrará un identificador luminoso en caso de acierto, tal y como ya veni-
mos viendo a lo largo de todo el proyecto.
Para generar una muestra atenuada, hacemos uso de un número aleatorio entre 0 y
1, creado en la sección del código donde se generan el resto de valores aleatorios. Dicho
número nos indicará que muestra de las dos es la atenuada en cada ejercicio.
En primer lugar debemos comprobar si la sección de entrenamiento está activada. Si
es así, convertimos la atenuación elegida en el nivel de dificultad de decibelios a esca-
la lineal. Tras esto, comprobaremos que muestra está seleccionada por el usuario para
escuchar, y, en función de eso y del número aleatorio que nos indica qué muestra esta-
rá atenuada, aplicaremos la atenuación a la correspondiente y dejaremos la otra con su
ganancia original.
Para la comprobación de resultados de esta sección tuvimos un problema similar al
que apareció en la aplicación de “Ruido y Distorsión” con el contador de fallos. Para
solucionarlo llevamos a cabo una medida similar a la tomada anteriormente, con la dife-
rencia de que para el caso que nos acontece existe un pequeño bug que no ha sido posible
solucionar, pero que no tiene mucha importancia.
El bug consiste en que, si recién arrancado el programa, en los siguientes 2 segundos,
el usuario pulsa el botón “Generar” muy rápido, el contador de fallos puede llegar a
mostrar un error en los resultados. Por tanto, se sugiere arrancar el programa y dejar que
corra 2-3 segundos antes de pulsar el botón para generar una muestra aleatoria.
No se ha considerado un fallo muy notable ya que el flujo habitual de trabajo de un
usuario es arrancar el programa, probar en la “Zona de pruebas” y, tras esto, comenzar
los ejercicios, por lo que no sería habitual que dicho bug apareciese.
5.5.2.3 Dinámica
El la siguiente sección, se trata el entrenamiento de la parte de dinámica. Esta sección
fue difícil de implementar con unos resultados satisfactorios debido a la dificultad de
entrenar parámetros asociados a un procesador de dinámica. Por ello, y para facilitar y
60 CAPÍTULO 5. IMPLEMENTACIÓN
5.5.2.4 Resultados
Para terminar nos encontramos con la sección de “Resultados”. En ella, y tal y como
se viene viendo en todas las aplicaciones, se muestran los fallos cometidos por el usuario
en cada uno de los ejercicios realizados, poniendo a 0 el contador cada vez que pulsa en
el botón “Generar” para comenzar un nuevo ejercicio.
Además, se incorpora el botón “Soluciones” a través del cuál se devuelven a los me-
nús las respuestas de cada ejercicio. Como ya viene siendo habitual, dichas respuestas
están filtradas, de manera que si por ejemplo estamos trabajando con ganancias, única-
mente se devolverán las respuestas de la ganancia, y no de la dinámica.
Por tanto, y en primer lugar, deberemos comprobar si estamos trabajando con ga-
nancias o con dinámica. Una vez hecho este paso, deberemos comprobar el valor del
número aleatorio que nos indica que muestra está atenuada o afectada por el procesador
de dinámica, y, dependiendo de en que caso estemos, devolver a sus menús la respuesta
correspondiente. Para este caso, y como únicamente debemos indicar si la afectada es la
muestra 1 o 2, pasamos por outvalue el valor de 1 o 0 al canal correspondiente, simplifi-
cando así el código al no depender de ninguna variable extra, ya que es posible pasar el
valor numérico de la respuesta directamente.
CAPÍTULO 6
Conclusiones y trabajos futuros
6.1 Conclusiones
Csound constituye una potente y versátil herramienta de desarrollo aplicada al mundo
del audio y la síntesis de sonido, tal y como se ha visto a lo largo del presente proyecto y
gracias a sus opcodes propios.
Como segundo matiz a destacar, tenemos CsoundQt, sin el cual no habría sido posible
la interacción entre widgets gráficos y el lenguaje Csound. Esto nos ha facilitado la posibi-
lidad de desarrollar una serie de aplicaciones con interfaz gráfica bastante completa en
cuanto funcionalidades y potencial.
Si bien las aplicaciones para entrenamiento auditivo son algo real y existente en la
actualidad, con propuestas profesionales que se mejoran y ofrecen por mucho respecto
a las nuestras, el objetivo del presente proyecto no era desarrollar una serie de aplica-
ciones comerciales, si no una base beta de las mismas sobre la que apoyarnos en futuros
proyectos.
Además, para su desarrollo se ha desarrollado un sistema completo de ejercicios, to-
dos ellos basados en el entrenamiento por repetición y mediante muestras de audio alea-
torias. Gracias a ello, el usuario deberá realizar un entrenamiento “a ciegas”. Éste método
de entrenamiento está de sobra validado por numerosas aplicaciones disponibles en el
mercado, tanto para entrenamiento de audio, como en otros muchos ámbitos.
En base al sistema de ejercicios desarrollado, como a la exploración de las funcionali-
dades que nos ofrecen tanto Csound como CsoundQt, y, finalmente, al desarrollo de cuatro
aplicaciones para entrenamiento auditivos psicoacústico, se pueden dar por concluidos
los objetivos iniciales del proyecto.
Quien desee, puede utilizar, modificar y distribuir el código fuente desarrollado en el
presente proyecto para lo que considere oportuno, especialmente si es para fines didácti-
vos y de aprendizaje.
61
62 CAPÍTULO 6. CONCLUSIONES Y TRABAJOS FUTUROS
[3] MAGGIOLO, D., El sistema auditivo periférico, 2003. Escuela universitaria de música
(Montevideo, Uruguay).
Disponible en http://www.eumus.edu.uy/docentes/maggiolo/acuapu/sap.html
[4] MAGGIOLO, D., El sistema auditivo central, 2003. Escuela universitaria de música
(Montevideo, Uruguay).
Disponible en http://www.eumus.edu.uy/docentes/maggiolo/acuapu/sac.html
[6] PÉREZ Cano, M., La audición humana 4.1.Umbrales psicológicos, 2004. Universidad e
Valladolid (Castilla y León, España).
Disponible en https://www.lpi.tel.uva.es/~nacho/docencia/ing_ond_1/
trabajos_04_05/io1/public_html/marcos.htm
[7] MAGGIOLO, D., Umbrales de audición, 2003. Escuela universitaria de música (Mon-
tevideo, Uruguay).
Disponible en http://www.eumus.edu.uy/docentes/maggiolo/acuapu/umb.html
[9] AZNAR Casanova, J.A., Los métodos psicofísicos directos o escalas psicofísicas, 2017. Uni-
versidad de Barcelona (Barcelona, España).
Disponible en http://www.ub.edu/pa1/node/73
63
64 BIBLIOGRAFÍA
[14] MINISTERIO DE EDUCACIÓN, Sonido y música con ordenador - Cualidades del sonido,
2017. Ministerio de Educación (España).
Disponible en http://www.ite.educacion.es/formacion/materiales/60/cd/02_
elsonido/2_cualidades_del_sonido.html
[15] ROYUELA del Val, J. y DE LA PARRA García, C., Escucha 3D y holofonía, 2. Escucha
binaural, 2004. Universidad de Valladolid (Castilla y León, España).
Disponible en https://www.lpi.tel.uva.es/~nacho/docencia/ing_ond_1/
trabajos_04_05/io1/public_html/marcos.htm
[16] IÑESTA Quereda, J. M., Síntesis Digital del Sonido, 2016. Departamento de Lenguajes
y Sonidos Informáticos, Universidad de Alicante (Alicante, España).
[17] MAGGIOLO, D., Timbre, 2003. Escuela universitaria de música (Montevideo, Uru-
guay).
Disponible en http://www.eumus.edu.uy/docentes/maggiolo/acuapu/tbr.html
[21] HEINTZ, J. y MCCURDY, I., Csound FLOSS Manual, 2005. FLOSS Manuals.
Disponible en http://www.write.flossmanuals.net/csound/preface/
1 ;--------------------------------------------------------------------------
2 ; RECONOCIMIENTO ESPACIAL v .1.0
3 ;--------------------------------------------------------------------------
4 ; C ó digo : Implementaci ó n de una aplicaci ó n para el entrenamiento auditivo
5 ; enfocada al reconocimiento espacial y la imagen est é reo .
6 ;--------------------------------------------------------------------------
7 ; Autor : Fernando Ayelo S á nchez
8 ;--------------------------------------------------------------------------
9 ; Fecha : 6 de Junio de 2017
10 ;--------------------------------------------------------------------------
11
12 < CsoundSynthesizer >
13
14 ; Secci ó n Opciones de Csound
15 < CsOptions >
16 -- displays ; Activamos este flag para visualizar los gr á ficos del interfaz .
17 </ CsOptions >
18 ; Dise ñ o de la orquesta
19 < CsInstruments >
20 ; Definimos las variables globales
21 sr = 44100 ; Frecuencia de muestreo
22 ksmps = 128 ; N ú mero de muestras calculadas por periodo de control
23 nchnls = 2 ; N ú mero de canales
24 0 dbfs = 1 ; Amplitud de referencia (0 dB )
25
26 ; Declaraci ó n e inicializaci ó n de las variables globales
27 gaRvbSend init 0
28 gaRvbSend2 init 0
29 gkAmple init 0
30 gkfallos init 0
31 gkamprand init 0
32 gkbal init 0
33 gktr init 0
34 gkhf init 0
35
36 ; inicializaci ó n de las variables de control para el sistema de fallos
37 gkres1 init 0
38 gkres2 init 0
39 gkres3 init 0
40 gkres4 init 0
41
42 ; inicializamos las variables aleatorias a 0
43 gkstereopr init 0
44 gkroompr init 0
45 gkhfpr init 0
46 gkamppr init 0
47 gkresbalmenu init 5
48
49 ; inicializamos las variables de validaci ó n a 0
65
66 APÉNDICE A. CÓDIGO FUENTE - RECONOCIMIENTO ESPACIAL
50 gkValidA init 0
51 gkValidB init 0
52 gkValidR init 0
53 gkValidH init 0
54
55 instr 10 ; Instrumento de comunicaci ó n con la interfaz gr á fica ( GUI )
56 ; instrumento de prueba
57 gkAmp invalue " amplitud "
58 gkmute invalue " muteoriginal "
59 gkstereo invalue " stereo "
60 gkmuestra invalue " muestra "
61
62 ; instrumento de pr á ctica
63 gkmuestra2 invalue " muestra2 "
64 gkmute2 invalue " muteoriginal2 "
65 gkAmp2 invalue " amplitud2 "
66 gkstereo2 invalue " stereo2 "
67 gkroom2 invalue " room2 "
68 gkhf2 invalue " hf2 "
69 gkgenerar invalue " generar "
70 gksoluc invalue " soluc "
71
72 ; valores para mostrar
73 kampdB = 10* log10 ( - gkAmp )
74 outvalue " amplitudpos " , kampdB
75 outvalue " balance " , ( gkstereo -0.5)
76 endin
77
78 instr 1 ; Instrumento de prueba
79 ; Carga de la muestra de audio seg ú n decida el usuario
80 if gkmuestra == 0 then
81 aMuestra soundin " muestra1 . wav " ,0
82 elseif gkmuestra == 1 then
83 aMuestra soundin " muestra2 . wav " ,0
84 elseif gkmuestra == 2 then
85 aMuestra soundin " muestra3 . wav " ,0
86 elseif gkmuestra == 3 then
87 aMuestra soundin " muestra4 . wav " ,0
88 elseif gkmuestra == 4 then
89 aMuestra soundin " muestra5 . wav " ,0
90 elseif gkmuestra == 5 then
91 aMuestra inch 1
92 endif
93
94 ; Adaptaci ó n de las variables entregadas por los widgets
95 kAmp = - gkAmp
96
97 aMuestra = kAmp * aMuestra ; Ajuste de la amplitud general
98 aSal = ( gkmute * aMuestra ) ; Mute para la muestra general
99
100 out aSal *(1 - gkstereo ) , aSal * gkstereo ; Salida de la muestra con la
posibilidad de est é reo
101
102 kRvbSendAmt = (1 - kAmp ) ; Ajuste de la cantidad de reverb
103 gaRvbSend = gaRvbSend + ( aSal * kRvbSendAmt ) ; Env í o de la se ñ al
para el instrumento de reverb
104
105 krvblog = 10* log10 ( kRvbSendAmt ) ; Adaptaci ó n a dB de la cantidad de
reverb
106 outvalue " reverbenv " , krvblog ; Env í o de la cantidad de reverb a la
interfaz GUI
107 endin
108
109 instr 2 ; Instrumento de practica
67
1 ;--------------------------------------------------------------------------
2 ; RECONOCIMIENTO FRECUENCIAL v .1.0
3 ;--------------------------------------------------------------------------
4 ; C ó digo : Implementaci ó n de una aplicaci ó n para el entrenamiento auditivo
5 ; enfocada al reconocimiento frecuencial y al espectro auditivo .
6 ;--------------------------------------------------------------------------
7 ; Autor : Fernando Ayelo S á nchez
8 ;--------------------------------------------------------------------------
9 ; Fecha : 6 de Junio de 2017
10 ;--------------------------------------------------------------------------
11
12 < CsoundSynthesizer >
13
14 ; Secci ó n Opciones de Csound
15 < CsOptions >
16 -- displays ; Activamos é ste flag para visualizar los gr á ficos del interfaz .
17 </ CsOptions >
18 ; Dise ñ o de la orquesta
19 < CsInstruments >
20 ; Definimos las variables globales
21 sr = 44100 ; Frecuencia de muestreo
22 ksmps = 128 ; N ú mero de muestras calculadas por periodo de control
23 nchnls = 1 ; N ú mero de canales
24 0 dbfs = 1 ; Amplitud de referencia (0 dB )
25
26 ; Declaraci ó n e inicializaci ó n de las variables globales
27 gkFrecu init 0
28 gkampltudres init 0
29 gkFrecu2 init 0
30 gkampltudres2 init 0
31 gkAmp3 init 0
32 gkFrecu3 init 0
33 gkfallos init 0
34 gkAmp4 init 0
35 gkFrecu4 init 0
36
37 ; inicializaci ó n de las variables de control para el sistema de fallos
38 gkres1 init 0
39 gkres2 init 0
40 gkres3 init 0
41 gkres12 init 0
42 gkres22 init 0
43 gkres32 init 0
44
45 ; inicializamos las variables de validaci ó n a 0
46 gkValidF init 0
47 gkValidM init 0
48 gkValidO init 0
49 gkValidF2 init 0
73
74 APÉNDICE B. CÓDIGO FUENTE - RECONOCIMIENTO FRECUENCIAL
50 gkValidM2 init 0
51 gkValidO2 init 0
52
53 ; inicializamos las variables aleatorias a 0
54
55 gkfr1 init 0
56 gkmulti1 init 0
57 gkonda init 0
58 gkfr2 init 0
59 gkmulti2 init 0
60 gkonda2 init 0
61
62 instr 10 ; Instrumento de comunicaci ó n con la interfaz gr á fica ( GUI )
63 ; Instrumento de prueba 1
64 gkAmp invalue " amplitud "
65 gkmute invalue " muteoriginal "
66 gkFrec invalue " frecuencia "
67 gkonda invalue " onda "
68 gkmulti invalue " multiplo "
69
70 ; Instrumento de prueba 2
71 gkAmp2 invalue " amplitud2 "
72 gkmute2 invalue " mute2 "
73 gkFrec2 invalue " frecuencia2 "
74 gkonda2 invalue " onda2 "
75 gkmulti2 invalue " multiplo2 "
76
77 ; Instrumento de entrenamiento 1
78 gkAmp3 invalue " amplitud3 "
79 gkmute3 invalue " muteoriginal2 "
80 gkfrec1res invalue " frec1res "
81 gkmulti1res invalue " multi1res "
82 gkonda1res invalue " onda1res "
83
84 gkgenerar1 invalue " generar1 "
85 gksoluc invalue " solucion "
86
87 ; Instrumento de entrenamiento 2
88 gkAmp4 invalue " amplitud4 "
89 gkmute4 invalue " mute3 "
90 gkfrec2res invalue " frec2res "
91 gkmulti2res invalue " multi2res "
92 gkonda2res invalue " onda2res "
93 endin
94
95 instr 1 ; Instrumento de prueba 1
96 ; Primero valoramos el m ú ltiplo de la frecuencia
97
98 if gkmulti == 0 then
99 gkFrecu = gkFrec * 10
100 elseif gkmulti == 1 then
101 gkFrecu = gkFrec * 100
102 elseif gkmulti == 2 then
103 gkFrecu = gkFrec * 1000
104 endif
105
106 Sdisp4 sprintfk " %02 d " , gkFrecu ; Creamos un string con el valor de la
frecuencia y lo mostramos en la interfaz GUI
107 outvalue " kFrecu " , Sdisp4
108
109 gkampltudres = 10* log10 ( gkAmp ) ; Adaptamos la amplitud a dB y mostramo en
la interfaz GUI
110 outvalue " amplitudres " , gkampltudres
111
75
477 gkfr2 = 5
478 elseif kfrecprem == 4 then
479 gkfr2 = 6
480 elseif kfrecprem == 5 then
481 gkfr2 = 7
482 elseif kfrecprem == 6 then
483 gkfr2 = 8
484 elseif kfrecprem == 7 then
485 gkfr2 = 9
486 elseif kfrecprem == 8 then
487 gkfr2 = 10
488 endif
489
490 ; Asignamos los valores reales de los m ú ltiplos y por tanto sacamos la
frecuencia aleatoria final
491
492 if kmulti == 0 then
493 gkmulti2 = 10
494 elseif kmulti == 1 then
495 gkmulti2 = 100
496 elseif kmulti == 2 then
497 gkmulti2 = 1000
498 endif
499
500 ; Asignamos los valores para los tipos de onda ya que el aleatorio no lo
genera como nosotros queremos
501
502 if ktipo == 0 then
503 gkonda2 = 1
504 elseif ktipo == 1 then
505 gkonda2 = 2
506 elseif ktipo == 2 then
507 gkonda2 = 3
508 elseif ktipo == 3 then
509 gkonda2 = 4
510 elseif ktipo == 4 then
511 gkonda2 = 5
512 elseif ktipo == 5 then
513 gkonda2 = 6
514 elseif ktipo == 6 then
515 gkonda2 = 7
516 endif
517
518
519 gkFrecu4 = gkfr2 * gkmulti2 ; Multiplicamos la frecuencia creada por su m ú
ltiplo para obtener la frecuencia final
520
521 ; Dependiendo del tipo de onda se genera la se ñ al necesaria a partir de
las tablas de onda declaradas en la partitura
522 aSal4 oscilikt gkAmp4 , gkFrecu4 , gkonda2
523
524 ; Sacamos el resultado controlando si est á o no en mute . Dividimos por dos
para que no sature al tratarse de una se ñ al mono
525 out ( gkmute4 * aSal4 ) /2
526
527 ; Pasamos la amplitud a formato dB y mostramos por interfaz GUI
528 gkampltudres4 = 10* log10 ( gkAmp4 )
529 outvalue " amplitudres4 " , gkampltudres4
530
531 ; Comprobaci ó n de resultados
532
533 ; comprobaci ó n de la frecuencia
534 if gkfr2 == kfrecres then
535 gkValidF2 = 1
82 APÉNDICE B. CÓDIGO FUENTE - RECONOCIMIENTO FRECUENCIAL
536 else
537 gkValidF2 = 0
538
539 if gkres12 == kfrecres then
540 gkfallos = gkfallos
541 else
542 gkfallos = gkfallos + 1
543 endif
544
545 endif
546
547 ; comprobaci ó n del m ú ltiplo
548 if gkmulti2 == kmultires then
549 gkValidM2 = 1
550 else
551 gkValidM2 = 0
552
553 if gkres22 == kmultires then
554 gkfallos = gkfallos
555 else
556 gkfallos = gkfallos + 1
557 endif
558
559 endif
560
561 ; comprobaci ó n del tipo de onda
562 if gkonda2 == kondares then
563 gkValidO2 = 1
564 else
565 gkValidO2 = 0
566
567 if gkres32 == kondares then
568 gkfallos = gkfallos
569 else
570 gkfallos = gkfallos + 1
571 endif
572
573 endif
574
575 ; Devolvemos indicaci ó n luminosa al usuario
576 outvalue " validFrec2 " , gkValidF2
577 outvalue " validMulti2 " , gkValidM2
578 outvalue " validOnda2 " , gkValidO2
579
580 ; Si se pulsa soluci ón , devuelve los valores a los men ú s con la soluci ó n
581 if gksoluc == 1 then
582
583 outvalue " frec2res " , kfrecprem
584 outvalue " multi2res " , kmulti
585 outvalue " onda2res " , ktipo
586
587 endif
588
589 ; Contador de fallos al final del ciclo
590 gkres12 = kfrecres
591 gkres22 = kmultires
592 gkres32 = kondares
593 ; Creamos una cadena de texto con el n ú mero de fallos y lo mostramos en la
interfaz gr á fica
594 Sdisp sprintfk " %02 d " , gkfallos
595 outvalue " fallos1 " , Sdisp
596
597 endin
598
83
1 ;--------------------------------------------------------------------------
2 ; RUIDO Y DISTORSI Ó N v .1.0
3 ;--------------------------------------------------------------------------
4 ; C ó digo : Implementaci ó n de una aplicaci ó n para el entrenamiento auditivo
5 ; enfocada al ruido y la distorsi ó n en el audio .
6 ;--------------------------------------------------------------------------
7 ; Autor : Fernando Ayelo S á nchez
8 ;--------------------------------------------------------------------------
9 ; Fecha : 6 de Junio de 2017
10 ;--------------------------------------------------------------------------
11
12 < CsoundSynthesizer >
13
14 ; Secci ó n " Opciones " de Csound
15 < CsOptions >
16 -- displays ; Activamos é ste flag para visualizar los gr á ficos del interfaz .
17 </ CsOptions >
18 ; Dise ñ o de la orquesta
19 < CsInstruments >
20 ; Definimos las variables globales
21 sr = 44100 ; Frecuencia de muestreo
22 ksmps = 1 ; N ú mero de muestras calculadas por periodo de control
23 nchnls = 2 ; N ú mero de canales
24
25 ; Inicializaci ó n de variables globales
26 gkstereo = 0.5
27 gkbitsprof init 0
28 gkfallos init 0
29 gkAmple init 0
30 gkAmplitud init 0
31 gkgenerar init 0
32 gkcontador init 0
33
34 ; inicializamos las variables de validaci ó n a 1 ( encendidas )
35 gkValidA init 1
36 gkValidN init 1
37 gkValidB init 1
38 gkValidS init 1
39
40 gkValidRuido init 1
41 gkValidCuant init 1
42 gkValidMues init 1
43
44 ; inicializaci ó n de las variables de control para el sistema de fallos
45 gkres1 init 0
46 gkres2 init 0
47 gkres3 init 0
48 gkres4 init 0
49 gkres5 init 1
84
85
50 gkres6 init 1
51 gkres7 init 1
52
53 ; Inicializamos a 0 para que empiece por la dificultad inicial , 1
degradaci ó n
54 outvalue " dificultad " ,0
55
56 instr 10 ; Instrumento de comunicaci ó n con la interfaz gr á fica ( GUI )
57 ktrig metro 10 ; Al necesitar por muestras independientes , utilizamos la
funci ó n metro para controlar las interacciones por pasos
58 if ( ktrig == 1) then
59
60 ; Instrumento de prueba
61 ; Main
62 gkAmp invalue " amplitud "
63 gkmute invalue " muteoriginal "
64 gkstereo invalue " stereo "
65 gkmuestra invalue " muestra "
66
67 outvalue " stereo " , gkstereo
68
69 gkamplitudres = 10* log10 ( gkAmp )
70 outvalue " ampres " , gkamplitudres
71 outvalue " panres " , gkstereo
72
73 ; Profundidad de bits
74 gkbitsprof invalue " bitsprof "
75 gkbitsmute invalue " bitsmute "
76
77 Sbits sprintfk " %02 d " , gkbitsprof
78 outvalue " bitsres " , Sbits
79
80 ; Ruido
81 gknoise invalue " noise "
82 gknoisemute invalue " noisemute "
83 gknoiseamp invalue " ampnoise "
84 gksolo invalue " solo "
85
86 outvalue " ampnoiseres " , gknoiseamp
87
88 ; Sampling
89 gksampmute invalue " sampmute "
90 gksamp invalue " samp "
91
92 Sfrecu sprintfk " %02 d " , 44100/ - gksamp
93 outvalue " sampres " , Sfrecu
94
95 ; Instrumento de pr á cticas
96 ; Main
97 gkmuestra2 invalue " muestra2 "
98 gkmute2 invalue " muteoriginal2 "
99 gkAmp2 invalue " amplitud2 "
100 gkgenerar invalue " generar "
101
102 gkamplitudres2 = 10* log10 ( gkAmp2 )
103 outvalue " ampres2 " , gkamplitudres2
104
105 ; Dificultad
106 gkdificultad invalue " dificultad "
107
108 ; Soluciones
109 gksoluc invalue " soluciones "
110
111 ; ¿ Que degradaci ó n hay ?
86 APÉNDICE C. CÓDIGO FUENTE - RUIDO Y DISTORSIÓN
174
175 ; Seccion de resolucion de bits
176 if gkbitsmute == 1 then ; Comprobamos si la secci ó n de cuantizaci ó n est á
activa . Si est á , generamos la muestra con la cuantizaci ó n
correspondiente
177
178 kvalues pow 2 , gkbitsprof
179 k16bit pow 2 , 16
180 ksig downsamp aMuestra
181 ksig = int ( ksig * ( kvalues / k16bit ) )
182 ksig = ksig * ( k16bit / kvalues )
183 aMuestra interp ksig
184
185 endif
186
187 ; Secci ó n de frecuencia de muestreo
188 kincr = - gksamp ; Adaptamos la variable del m ú ltiplo para la reducci ó n
de la frecuencia de muestreo
189
190 if gksampmute == 1 then ; Comprobamos si la secci ó n de muestreo est á
activa . Si est á , generamos la muestra con la reducci ó n de Fs
correspondiente
191 aMuestra fold aMuestra , kincr
192 endif
193
194 ; Procesamos aMuestra y la sacamos por salida de audio aplicando las
degradaciones correspondientes
195
196 aMuestra = gkAmp *( aMuestra + aNoise )
197 aSal = ( gkmute * aMuestra )
198
199 if gksolo == 1 then
200 outs aNoise /2 , aNoise /2
201 else
202 outs aSal *(1 - kstereo ) , aSal * kstereo
203 endif
204 endin
205
206 instr 2 ; Instrumento de entrenamiento
207 ; Carga de la muestra de audio seg ú n decida el usuario
208 if gkmuestra2 == 0 then
209 aMuestra2 diskin2 " muestra1 . wav " ,1 ,0 ,1
210 elseif gkmuestra2 == 1 then
211 aMuestra2 diskin2 " muestra2 . wav " ,1 ,0 ,1
212 elseif gkmuestra2 == 2 then
213 aMuestra2 diskin2 " muestra3 . wav " ,1 ,0 ,1
214 elseif gkmuestra2 == 3 then
215 aMuestra2 diskin2 " muestra4 . wav " ,1 ,0 ,1
216 elseif gkmuestra2 == 4 then
217 aMuestra2 diskin2 " muestra5 . wav " ,1 ,0 ,1
218 elseif gkmuestra2 == 5 then
219 aMuestra2 inch 1
220 endif
221
222 ; Asignaci ó n de las respuestas a su variable correspondiente
223 ; Variable de ruido
224 if gkruidores == 0 then
225 kruidousuario = 0
226 elseif gkruidores == 1 then
227 kruidousuario = 1
228 elseif gkruidores == 2 then
229 kruidousuario = 2
230 elseif gkruidores == 3 then
231 kruidousuario = -2
88 APÉNDICE C. CÓDIGO FUENTE - RUIDO Y DISTORSIÓN
232 endif
233
234 ; Variable de amplitud
235 if gkruidoampres == 0 then
236 kamplitud = 0
237 elseif gkruidoampres == 1 then
238 kamplitud = -1
239 elseif gkruidoampres == 2 then
240 kamplitud = -2
241 elseif gkruidoampres == 3 then
242 kamplitud = -3
243 elseif gkruidoampres == 4 then
244 kamplitud = -4
245 elseif gkruidoampres == 5 then
246 kamplitud = -5
247 elseif gkruidoampres == 6 then
248 kamplitud = -6
249 elseif gkruidoampres == 7 then
250 kamplitud = -7
251 elseif gkruidoampres == 8 then
252 kamplitud = -8
253 elseif gkruidoampres == 9 then
254 kamplitud = -9
255 elseif gkruidoampres == 10 then
256 kamplitud = -10
257 elseif gkruidoampres == 11 then
258 kamplitud = 20
259 endif
260
261 ; Variable de bits
262 if gkbitsres == 0 then
263 kbitsusuario = 4
264 elseif gkbitsres == 1 then
265 kbitsusuario = 5
266 elseif gkbitsres == 2 then
267 kbitsusuario = 6
268 elseif gkbitsres == 3 then
269 kbitsusuario = 7
270 elseif gkbitsres == 4 then
271 kbitsusuario = 8
272 elseif gkbitsres == 5 then
273 kbitsusuario = 9
274 elseif gkbitsres == 6 then
275 kbitsusuario = 10
276 elseif gkbitsres == 7 then
277 kbitsusuario = 11
278 elseif gkbitsres == 8 then
279 kbitsusuario = 12
280 elseif gkbitsres == 9 then
281 kbitsusuario = 13
282 elseif gkbitsres == 10 then
283 kbitsusuario = 14
284 elseif gkbitsres == 11 then
285 kbitsusuario = 40
286 endif
287
288 ; Variable de sampling
289 if gksampres == 0 then
290 ksampusuario = 10
291 elseif gksampres == 1 then
292 ksampusuario = 9
293 elseif gksampres == 2 then
294 ksampusuario = 8
295 elseif gksampres == 3 then
89
296 ksampusuario = 7
297 elseif gksampres == 4 then
298 ksampusuario = 6
299 elseif gksampres == 5 then
300 ksampusuario = 5
301 elseif gksampres == 6 then
302 ksampusuario = 4
303 elseif gksampres == 7 then
304 ksampusuario = 3
305 elseif gksampres == 8 then
306 ksampusuario = 2
307 elseif gksampres == 9 then
308 ksampusuario = 20
309 endif
310
311
312 ; Generaci ó n de valores aleatorios y reseteo de men ú s de usuario
313 ; si se pulsa generar , se generan los valores aleatorios y se ponen a 0
los men ú s
314 if gkgenerar == 1 then
315 ; Creamos el aleatorio del ruido
316 krnd2 randh 2 ,10 ,10
317 krnd2 = abs ( krnd2 )
318 kvar1 = round ( krnd2 )
319 gknoiserand = kvar1
320
321 ; Creamos el aleatorio de la amplitud
322 krnd randh 10 , 10 , 10
323 krnd = abs ( krnd )
324 kamprand = round ( krnd )
325 gkamprand = - kamprand
326
327 ; Creamos el aleatorio de bits
328 krnd3 randh 10 ,10 ,10
329 krnd3 = abs ( krnd3 )
330 kbitsrand = round ( krnd3 )
331 gkbitsrand = kbitsrand +4
332
333 ; Creamos el aleatorio de frecuencia de muestreo
334 krnd4 randh 8 ,10 ,10
335 krnd4 = abs ( krnd4 )
336 ksamprand = round ( krnd4 )
337 gksamprand = ksamprand +2
338
339 ; Ponemos a 0 los men ú s para el usuario
340 gkValidA = 0
341 gkValidN = 0
342 gkValidB = 0
343 gkValidS = 0
344
345 outvalue " ruidores " , 3
346 outvalue " ruidoampres " , 11
347 outvalue " bitsres2 " , 11
348 outvalue " sampres2 " , 9
349
350 ; Reseteamos la zona superior de checks de degradaciones para evitar
trampas
351 gkValidRuido = 0
352 gkValidCuant = 0
353 gkValidMues = 0
354
355 outvalue " checkruido " , 0
356 outvalue " checkmuestreo " , 0
357 outvalue " checkcuant " , 0
90 APÉNDICE C. CÓDIGO FUENTE - RUIDO Y DISTORSIÓN
358
359 ; Aleatorios para repartir el tipo de degradaciones
360 ; Genero un valor aleatorio entre 0 y 2 (1 a 3) que nos servir á para
aplicar una de las tres degradaciones de manera aleatorias
361 knum randh 2 ,10 ,10
362 knum = abs ( knum )
363 knumer = round ( knum )
364
365 ; Reseteamos el contador de fallos
366 gkfallos = 0
367
368 ; Ponemos el contador a 1 para saber el n ú mero de rondas que lleva
369 gkcontador = gkcontador +1
370
371 endif
372
373 ; Generamos el resultado dependiendo del tipo de onda
374 ; Seccion de resolucion de bits
375 kvalues pow 2 , gkbitsrand
376 k16bit pow 2 , 16
377 ksig downsamp aMuestra2
378 ksig = int ( ksig * ( kvalues / k16bit ) )
379 ksig = ksig * ( k16bit / kvalues )
380 aMuestrabits interp ksig
381
382 ; Seccion de ruidos
383 klog = gkamprand /10
384 gkAmple = 10^( klog )
385
386 if gknoiserand == 0 then
387 aNoise noise gkAmple *15000 , 0
388 elseif gknoiserand == 1 then
389 aNoise pinkish gkAmple *15000
390 elseif gknoiserand == 2 then
391 aNoise diskin2 " noise . wav " ,1 ,0 ,1
392 aNoise = aNoise * gkAmple
393 endif
394
395 ; Secci ó n de frecuencia de muestreo
396 aMuestramuestreo fold aMuestra2 , gksamprand
397
398 ; Dependiendo de la dificultad , aplicamos una , dos o tres degradaciones
399
400 if gkdificultad == 0 then
401 ; Dependiendo del n ú mero , aplico una degradaci ó n u otra a la salida 1 -
Ruido 2 - Cuantizaci ó n 3 - Muestreo
402 if knumer == 0 then ; Ruido
403 aMuestrafin = aMuestra2 + aNoise
404 gkflag = 0
405 elseif knumer == 1 then ; Cuantizacion
406 aMuestrafin = aMuestrabits
407 gkflag = 1
408 elseif knumer == 2 then ; Muestreo
409 aMuestrafin = aMuestramuestreo
410 gkflag = 2
411 endif
412
413 elseif gkdificultad == 1 then
414 ; Dependiendo del n ú mero , NO APLICO esa degradaci ó n a la salida 1 - Ruido
2 - Cuantizaci ó n 3 - Muestreo
415 if knumer == 0 then ; Ruido
416 aMuestrafin = ( aMuestrabits /2) +( aMuestramuestreo /2)
417 gkflag = 3
418 elseif knumer == 1 then ; Cuantizacion
91
523 else
524 gkfallos = gkfallos +1
525 endif
526 endif
527 endif
528
529 ; comprobaci ó n de frec . muestreo
530 if gksamprand == ksampusuario then
531 gkValidS = 1
532 else
533 gkValidS = 0
534 if gkres4 == ksampusuario then
535 gkfallos = gkfallos
536 else
537 if gkcontador == 4410 then ; Condicionante para solucionar bug en
el contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
538 gkfallos = gkfallos
539 else
540 gkfallos = gkfallos +1
541 endif
542 endif
543 endif
544
545 elseif gkflag == 2 then
546 if gkcheckcuant == 1 then
547 gkValidCuant = 1
548 else
549 gkValidCuant = 0
550 endif
551
552 if gkcheckruido == 1 then ; Segundo comprobamos si alguno de los checks
que no van en este flag se pulsan . Si se pulsan debemos hacen la
comprobaci ó n para sumar un fallo al contador
553 if gkcheckruido == gkres7 then
554 gkfallos = gkfallos
555 else
556 if gkcontador == 4410 then ; Condicionante para solucionar bug en el
contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
557 gkfallos = gkfallos
558 else
559 gkfallos = gkfallos +1
560 endif
561 endif
562 endif
563
564 if gkcheckmuestreo == 1 then ; Segundo comprobamos si alguno de los
checks que no van en este flag se pulsan . Si se pulsan debemos
hacen la comprobaci ó n para sumar un fallo al contador
565 if gkcheckmuestreo == gkres6 then
566 gkfallos = gkfallos
567 else
568 if gkcontador == 4410 then ; Condicionante para solucionar bug en el
contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
569 gkfallos = gkfallos
570 else
571 gkfallos = gkfallos +1
572 endif
573 endif
574 endif
575
576 ; comprobaci ó n de bits
94 APÉNDICE C. CÓDIGO FUENTE - RUIDO Y DISTORSIÓN
689 endif
690
691 ; comprobaci ó n de la amplitud
692 if gkamprand == kamplitud then
693 gkValidA = 1
694 else
695 gkValidA = 0
696 if gkres2 == kamplitud then
697 gkfallos = gkfallos
698 else
699 if gkcontador == 4410 then ; Condicionante para solucionar bug en
el contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
700 gkfallos = gkfallos
701 else
702 gkfallos = gkfallos +1
703 endif
704 endif
705 endif
706
707 ; comprobaci ó n de frec . muestreo
708 if gksamprand == ksampusuario then
709 gkValidS = 1
710 else
711 gkValidS = 0
712 if gkres4 == ksampusuario then
713 gkfallos = gkfallos
714 else
715 if gkcontador == 4410 then ; Condicionante para solucionar bug en
el contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
716 gkfallos = gkfallos
717 else
718 gkfallos = gkfallos +1
719 endif
720 endif
721 endif
722
723 elseif gkflag == 5 then
724 if gkcheckruido == 1 then
725 gkValidRuido = 1
726 else
727 gkValidRuido = 0
728 endif
729
730 if gkcheckcuant == 1 then
731 gkValidCuant = 1
732 else
733 gkValidCuant = 0
734 endif
735
736 if gkcheckmuestreo == 1 then ; Segundo comprobamos si alguno de los
checks que no van en este flag se pulsan . Si se pulsan debemos
hacen la comprobaci ó n para sumar un fallo al contador
737 if gkcheckmuestreo == gkres6 then
738 gkfallos = gkfallos
739 else
740 if gkcontador == 4410 then ; Condicionante para solucionar bug en el
contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
741 gkfallos = gkfallos
742 else
743 gkfallos = gkfallos +1
744 endif
97
745 endif
746 endif
747
748 ; comprobaci ó n del ruido
749 if gknoiserand == kruidousuario then
750 gkValidN = 1
751 else
752 gkValidN = 0
753 if gkres1 == kruidousuario then
754 gkfallos = gkfallos
755 else
756 if gkcontador == 4410 then ; Condicionante para solucionar bug en
el contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
757 gkfallos = gkfallos
758 else
759 gkfallos = gkfallos +1
760 endif
761 endif
762 endif
763
764 ; comprobaci ó n de la amplitud
765 if gkamprand == kamplitud then
766 gkValidA = 1
767 else
768 gkValidA = 0
769 if gkres2 == kamplitud then
770 gkfallos = gkfallos
771 else
772 if gkcontador == 4410 then ; Condicionante para solucionar bug en
el contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
773 gkfallos = gkfallos
774 else
775 gkfallos = gkfallos +1
776 endif
777 endif
778 endif
779
780 ; comprobaci ó n de bits
781 if gkbitsrand == kbitsusuario then
782 gkValidB = 1
783 else
784 gkValidB = 0
785 if gkres3 == kbitsusuario then
786 gkfallos = gkfallos
787 else
788 if gkcontador == 4410 then ; Condicionante para solucionar bug en
el contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
789 gkfallos = gkfallos
790 else
791 gkfallos = gkfallos +1
792 endif
793 endif
794 endif
795
796 elseif gkflag == 6 then
797 if gkcheckruido == 1 then
798 gkValidRuido = 1
799 else
800 gkValidRuido = 0
801 endif
802
98 APÉNDICE C. CÓDIGO FUENTE - RUIDO Y DISTORSIÓN
861 endif
862
863 ; comprobaci ó n de bits
864 if gkbitsrand == kbitsusuario then
865 gkValidB = 1
866 else
867 gkValidB = 0
868 if gkres3 == kbitsusuario then
869 gkfallos = gkfallos
870 else
871 if gkcontador == 4410 then ; Condicionante para solucionar bug en
el contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
872 gkfallos = gkfallos
873 else
874 gkfallos = gkfallos +1
875 endif
876 endif
877 endif
878 endif
879
880 ; Si se pulsa soluci ón , devuelve los valores a los men ú s
881 if gksoluc == 1 then
882 ; Correcci ó n de la variable de f . de muestreo para mostrar correctamente
la soluci ó n
883 if gksamprand == 2 then
884 kresultadofrecu = 8
885 elseif gksamprand == 3 then
886 kresultadofrecu = 7
887 elseif gksamprand == 4 then
888 kresultadofrecu = 6
889 elseif gksamprand == 5 then
890 kresultadofrecu = 5
891 elseif gksamprand == 6 then
892 kresultadofrecu = 4
893 elseif gksamprand == 7 then
894 kresultadofrecu = 3
895 elseif gksamprand == 8 then
896 kresultadofrecu = 2
897 elseif gksamprand == 9 then
898 kresultadofrecu = 1
899 elseif gksamprand == 10 then
900 kresultadofrecu = 0
901 endif
902
903 ; Soluciones dependiendo del flag en el que estemos
904 if gkflag == 0 then
905 outvalue " checkruido " , 1
906 outvalue " checkmuestreo " , 0
907 outvalue " checkcuant " , 0
908
909 outvalue " ruidores " , gknoiserand
910 outvalue " ruidoampres " , - gkamprand
911 elseif gkflag == 1 then
912 outvalue " checkruido " , 0
913 outvalue " checkmuestreo " , 1
914 outvalue " checkcuant " , 0
915
916 outvalue " sampres2 " , kresultadofrecu
917 elseif gkflag == 2 then
918 outvalue " checkruido " , 0
919 outvalue " checkmuestreo " , 0
920 outvalue " checkcuant " , 1
921
100 APÉNDICE C. CÓDIGO FUENTE - RUIDO Y DISTORSIÓN
1 ;--------------------------------------------------------------------------
2 ; GANANCIA Y DIN Á MICA v .1.0
3 ;--------------------------------------------------------------------------
4 ; C ó digo : Implementaci ó n de una aplicaci ó n para el entrenamiento auditivo
5 ; enfocada a la ganancia y la din á mica del sonido .
6 ;--------------------------------------------------------------------------
7 ; Autor : Fernando Ayelo S á nchez
8 ;--------------------------------------------------------------------------
9 ; Fecha : 6 de Junio de 2017
10 ;--------------------------------------------------------------------------
11
12 < CsoundSynthesizer >
13
14 ; Secci ó n Opciones de Csound
15 < CsOptions >
16 -- displays ; Activamos é ste flag para visualizar los gr á ficos del interfaz .
17 </ CsOptions >
18 ; Dise ñ o de la orquesta
19 < CsInstruments >
20 ; Definimos las variables globales
21 sr = 44100 ; Frecuencia de muestreo
22 ksmps = 16 ; N ú mero de muestras calculadas por periodo de control
23 nchnls = 2 ; N ú mero de canales
24
25 ; Declaraci ó n de tablas para crear sliders exponenciales
26 giExp1 ftgen 0 , 0 , 129 , -25 , 0 , 0.001 , 128 , 1.0
27 giExp2 ftgen 0 , 0 , 129 , -25 , 0 , 0.001 , 128 , 2.0
28 giExp100 ftgen 0 , 0 , 129 , -25 , 0 , 1 , 128 , 100.0
29
30 ; Declaraci ó n e inicializaci ó n de las variables globales
31 gkdifi init 0
32 gkresgain init 0
33 gkamplitud init 0
34 gkamprand init 0
35 gkcontador2 init 0
36 gkgenerar init 0
37
38 ; inicializamos las variables de validaci ó n a 0
39 gkValidG init 1
40 gkValidD init 1
41 gkfallos init 0
42
43 ; inicializaci ó n de las variables de control para el sistema de fallos
44 gkres1 init 0
45 gkres2 init 0
46
47 ; Al empezar colocamos el panorama en el centro
48 outvalue " stereo " , 0
49 outvalue " stereo2 " , 0
101
102 APÉNDICE D. CÓDIGO FUENTE - GANANCIA Y DINÁMICA
50
51 instr 10 ; Instrumento de comunicaci ó n con la interfaz gr á fica ( GUI )
52 ktrig metro 10 ; Al necesitar por muestras independientes , utilizamos la
funci ó n metro para controlar las interacciones por pasos
53 if ( ktrig == 1) then
54
55 ; Instrumento de prueba
56 ; Zona Main
57 gkmute invalue " muteoriginal "
58 gkstereo invalue " stereo "
59 gkmuestra invalue " muestra "
60
61 outvalue " panres " , gkstereo
62
63 ; Zona Ganancia
64 gkaten invalue " aten "
65
66 Sgain sprintfk " %02 d " , gkamplitud
67 outvalue " amplitud " , Sgain
68
69 ; Zona Din á mica
70 gkmutecomp invalue " mutecomp "
71 gkthresh invalue " thresh "
72 gklowknee invalue " knee "
73 gkhiknee invalue " hiknee "
74
75 kratio invalue " ratio "
76 gkratio tablei kratio , giExp100 , 1
77 outvalue " ratiores " , gkratio
78
79 katt invalue " att "
80 gkatt tablei katt , giExp1 , 1
81 outvalue " attres " , gkatt
82
83 krel invalue " rel "
84 gkrel tablei krel , giExp1 , 1
85 outvalue " resres " , gkrel
86
87 kgain invalue " makeup "
88 gkgain tablei kgain , giExp2 , 1
89 outvalue " makeres " , gkgain
90
91 ; Instrumento de entrenamiento
92 ; Zona Main
93 gkmute2 invalue " muteoriginal2 "
94 gkstereo2 invalue " stereo2 "
95 gkmuestra2 invalue " muestra2 "
96 gkgenerar invalue " generar "
97
98 outvalue " panres2 " , gkstereo2
99
100 ; Zona Gain
101 gkdifi invalue " dificultad "
102 gkselecc invalue " muestralisten "
103 gkresgain invalue " muestrares "
104
105 if gkselecc == 0 then
106 S1 = " Muestra 1 "
107 outvalue " muestramostrar " , S1
108 elseif gkselecc == 1 then
109 S2 = " Muestra 2 "
110 outvalue " muestramostrar " , S2
111 endif
112
103
336 endif
337 endif
338
339 aSal2 = ( gkmute2 * aMuestra2 ) ; Controlamos si est á activada la secci ó n
de entrenamiento
340 outs aSal2 *(1 - kstereo2 ) , aSal2 * kstereo2 ; Sacamos la salida en
formato est é reo
341
342 ; Comprobaci ó n de resultados
343 ; comprobaci ó n de ganancia
344 if gkmuesrand == 0 then
345 if kresgain == 0 then
346 gkValidG = 1
347 else
348 gkValidG = 0
349 if gkres1 == kresgain then
350 gkfallos = gkfallos
351 else
352 if gkcontador2 == 551 then ; Condicionantes para solucionar bug en
el contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
353 gkfallos = gkfallos
354 elseif gkcontador2 == 0 then
355 gkfallos = gkfallos
356 else
357 gkfallos = gkfallos +1
358 endif
359 endif
360 endif
361
362 elseif gkmuesrand == 1 then
363 if kresgain == 1 then
364 gkValidG = 1
365 else
366 gkValidG = 0
367 if gkres1 == kresgain then
368 gkfallos = gkfallos
369 else
370 if gkcontador2 == 551 then ; Condicionantes para solucionar bug en
el contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
371 gkfallos = gkfallos
372 else
373 gkfallos = gkfallos +1
374 endif
375 endif
376 endif
377 endif
378
379 ; Comprobaci ó n Din á mica
380 if gkmuesrand2 == 0 then
381 if kresdin == 0 then
382 gkValidD = 1
383 else
384 gkValidD = 0
385 if gkres2 == kresdin then
386 gkfallos = gkfallos
387 else
388 if gkcontador2 == 551 then ; Condicionantes para solucionar bug en
el contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
389 gkfallos = gkfallos
390 elseif gkcontador2 == 0 then
391 gkfallos = gkfallos
108 APÉNDICE D. CÓDIGO FUENTE - GANANCIA Y DINÁMICA
392 else
393 gkfallos = gkfallos +1
394 endif
395 endif
396 endif
397
398 elseif gkmuesrand2 == 1 then
399 if kresdin == 1 then
400 gkValidD = 1
401 else
402 gkValidD = 0
403 if gkres2 == kresdin then
404 gkfallos = gkfallos
405 else
406 if gkcontador2 == 551 then ; Condicionantes para solucionar bug en
el contador de fallos . De é sta manera no suma en la primera
generaci ó n de muestras
407 gkfallos = gkfallos
408 else
409 gkfallos = gkfallos +1
410 endif
411 endif
412 endif
413 endif
414
415
416 ; Si pulsamos en Soluci ón , colocamos los men ú s con los valores de la
soluci ó n
417 ; Si se pulsa soluci ón , devuelve los valores a los men ú s
418 if gksoluc == 1 then
419
420 if gkmutegain == 1 then
421 if gkmuesrand == 0 then
422 outvalue " muestrares " , 0
423 elseif gkmuesrand == 1 then
424 outvalue " muestrares " , 1
425 endif
426 endif
427 ; Debemos filtrar si estamos en la secci ó n ganancia o din á mica y a su
vez devolver la soluci ó n dependiendo del aleatorio
428 if gkmutedin == 1 then
429
430 if gkmuesrand2 == 0 then
431 outvalue " muestrares2 " , 0
432 elseif gkmuesrand2 == 1 then
433 outvalue " muestrares2 " , 1
434 endif
435 endif
436
437 endif
438
439 ; Contador de fallos al final del ciclo
440 gkres1 = kresgain
441 gkres2 = kresdin
442
443 ; Creamos una cadena de texto con el n ú mero de fallos y lo mostramos en
la interfaz gr á fica
444 Sdisp sprintfk " %02 d " , gkfallos
445 outvalue " fallos " , Sdisp
446
447 printk 1 , gkcontador2 , 50
448 endin
449 </ CsInstruments >
450 ; Dise ñ o de partitura
109