Advertisement
  1. Web Design
  2. HTML

La Web Audio API: Crea Tu Propio Sintetizador Web

Scroll to top
Read Time: 6 min
This post is part of a series called The Web Audio API.
The Web Audio API: Adding Sound to Your Web App

() translation by (you can also view the original English article)

Robert Moog creó uno de los primeros sintetizadores modulares comerciales que cobró mucha fama. Sus inventos consistían de montones de cables y botones, permitiendo a los músicos crear sonidos nunca antes escuchados. Éstos instrumentos no eran baratos, costaban miles de dólares, incluso el modelo más básico.

Ahora, gracias a la Web Audio API, podemos crear nuestro propio sintetizador  que podemos configurar a nuestro gusto por el gran total de $0. No solo eso, podemos distribuir nuestro sintetizador instantáneamente a cualquiera no importando su ubicación en el mundo gracias a la web.

Si no has leído los tutoriales previos en ésta serie de Audio Web, te sugeriría retrocedieras y los leyeras antes de continuar con éste, pues cubren las bases de usar la Web Audio API y crear un sonido desde cero.

Iniciar

Comencemos por crear una página HTML básica.

1
<!doctype html>
2
<html>
3
    <head>
4
        <meta charset="utf-8">
5
        <meta name="viewport" content="width=device-width">
6
        <title>Add sound to your web app</title>
7
        <link rel="stylesheet" href="styles/main.css">
8
    </head>
9
    <body>
10
        <div class="container">
11
            <h1>Synthesizer!</h1>
12
        </div>
13
    </body>
14
</html>

Y algún estilo básico en nuestro archivo styles/main.css.

1
body {
2
    font-family: sans-serif;   
3
}
4
5
.container {
6
    margin: auto;
7
    width: 800px;
8
}

Teclado

Quizá lo más importante que necesita tu sintetizador es un teclado. Por fortuna, hemos creado un pequeño snippet de Javascript que agregará un teclado virtual a tu página. Descarga una copia de Qwerty Hancock y especifícalo en la parte inferior de tu página así.

1
<script src="scripts/qwerty-hancock.min.js"></script>

Luego agrega un div vacío a tu página con un id de "keyboard" (teclado).

1
<div id="keyboard"></div>

Éste es el lugar en la página en donde será insertado el teclado.

También queremos establecer un archivo JavaScript dedicado para nuestro sintetizador, asi que creemos eso también y especifiquémoslo después de donde hemos incluído Qwerty Hancock.

1
<script src="scripts/qwerty-hancock.min.js"></script>
2
<script src="scripts/synth.js"></script>

Dentro de synth.js inicializaremos nuestro teclado haciendo lo siguiente.

1
var keyboard = new QwertyHancock({
2
     id: 'keyboard',
3
     width: 600,
4
     height: 150,
5
     octaves: 2
6
});

Ésto dice a nuestra página insertar una instancia de nuestro teclado en el elemento con el id de "keyboard", redimensiónalo a 600 X 150 px, y haz que el número de teclas en el teclado cubran dos octavos. Guarda y actualiza tu navegador para ver un maravilloso teclado en la pantalla. Usa las teclas, tus dedos, o tu mouse para ver notas que se iluminan mientras las presionas.

Qwerty Hancok nos proporciona dos escuchadores de eventos, keyUp y KeyDown. Ésto nos permite conectar al teclado y escribir código que se ejecuta cuando el teclado es presionado. También nos dice que nota fue presionada, y su correspondiente frecuencia en hertz.

1
keyboard.keyDown = function (note, frequency) {
2
    console.log('Note', note, 'has been pressed');
3
    console.log('Its frequency is', frequency);
4
};
5
6
keyboard.keyUp = function (note, frequency) {
7
    console.log('Note', note, 'has been released');
8
    console.log('Its frequency was', frequency);
9
};

Oscilar Rudamente

Comencemos un oscilador cuando una tecla es presionada. Lo detendremos después de un segundo asi no continúa permanentemente.

1
var context = new AudioContext();
2
3
keyboard.keyDown = function (note, frequency) {
4
    var osc = context.createOscillator();
5
6
    osc.connect(context.destination);
7
8
    osc.start(context.currentTime);
9
    osc.stop(context.currentTime + 1);
10
};

¿Por qué estamos creando el oscilador dentro de la función keyDown? ¿No es eso ineficaz? Osciladores son diseñados para ser ligeros y ser desechados después de usarse. De hecho puedes usarlos solo una vez. Piensa en ellos como una clase de bizarro fuego artificial de sonido.

Ahora cuando presionamos una tecla, escuchamos un sonido. Es un poco fuerte, asi que creemos un gainNode para actuar como un control de volumen general.

1
var context = new AudioContext(),
2
    masterVolume = context.createGain();
3
4
masterVolume.gain.value = 0.3;
5
masterVolume.connect(context.destination);
6
7
keyboard.keyDown = function (note, frequency) {
8
    var osc = context.createOscillator();
9
10
    osc.connect(masterVolume);
11
    masterVolume.connect(context.destination);
12
13
    osc.start(context.currentTime);
14
    osc.stop(context.currentTime + 1);
15
};

Un teclado que toca una sola nota una y otra vez no es muy divertido, asi que conectemos la frecuencia al oscilador antes que comencemos a tocarlo.

1
osc.frequency.value = frequency;

Grandioso. Ahora necesitamos detener el oscilador que toca después de levantar una tecla en lugar de después de un segundo. Debido a que estamos creando el oscilador dentro de la función keyDown, necesitamos identificar que oscilador está tocando que frecuencia para detenerlo cuando la tecla es liberada. Una simple forma de hacer ésto es crear un objeto vacío y agregar las frecuencias como teclas, junto con que oscilador está tocando esa frecuencia como su valor.

1
var oscillators = {};
2
3
keyboard.keyDown = function (note, frequency) {
4
    // Previous code here

5
6
    oscillators[frequency] = osc;
7
8
    osc.start(context.currentTime);
9
};

Ésto significa que podemos fácilmente usar la frecuencia que tenemos de nuestra función noteUp para detener ese oscilador específico.

1
keyboard.keyUp = function (note, frequency) {
2
    oscillators[frequency].stop(context.currentTime);
3
};

¡Ahora tenemos un sintetizador (muy básico) totalmente funcionando  en el navegador! Ok, no suena magnífico por el momento, pero veamos si podemos cambiar eso.

Lo primero que tenemos que hacer es cambiar el tipo de onda que da el oscilador. Hay cuatro tipos básicos para elegir: sinusoide, cuadrada, triángular y diente de sierra. Cada forma de onda suena diferente. Toca varias de ellas y elige tu favorita. Para éste ejemplo, elegiré "sawtooth" (diente de sierra).

1
osc.type = 'sawtooth';

Bien, esa suena mejor.

Es muy raro que encuentres un sintetizador que use un solo oscilador. La mayoría de los sintetizadores logran su sonido al combinar diferentes osciladores de diferentes tipos. Veamos como suena si agregamos otro. Recuerda, necesitamos duplicar todas nuestras conexiones, y necesitaremos agregar osciladores de la misma frecuencia a un array (arreglo). Ésto significa que podemos iterar por ellos para detener todos los osciladores que están reproduciendo la misma nota.

1
keyboard.keyDown = function (note, frequency) {
2
    var osc = context.createOscillator(),
3
        osc2 = context.createOscillator();
4
5
    osc.frequency.value = frequency;
6
    osc.type = 'sawtooth';
7
8
    osc2.frequency.value = frequency;
9
    osc2.type = 'triangle';
10
11
    osc.connect(masterVolume);
12
    osc2.connect(masterVolume);
13
14
    masterVolume.connect(context.destination);
15
16
    oscillators[frequency] = [osc, osc2];
17
18
    osc.start(context.currentTime);
19
    osc2.start(context.currentTime);
20
};
21
22
keyboard.keyUp = function (note, frequency) {
23
    oscillators[frequency].forEach(function (oscillator) {
24
        oscillator.stop(context.currentTime);
25
    });
26
};

Para finalizar, usemos un truco que aprendimos en el tutorial previo. Podemos agregar un poco de coro para añadir más brillo a nuestro sonido al sintonizar los osciladores ligeramente.

1
osc.detune.value = -10;
2
osc2.detune.value = 10;

¡Precioso, un sintetizador Kraftwerk estaría orgulloso de él! Practica tocando con el artículo finalizado, o copia el repo en Github para modificar el sintetizador a tu gusto.

¡Sé el primero en conocer las nuevas traducciones–sigue @tutsplus_es en Twitter!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.