Advertisement
  1. Web Design
  2. Web Development

El audio web de API: Cómo añadir sonido a tu aplicación web

Scroll to top
Read Time: 9 min
This post is part of a series called The Web Audio API.
The Web Audio API: What Is It?
The Web Audio API: Make Your Own Web Synthesizer

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

¿Qué pasó con el audio en la web? Durante un tiempo, la web fue la plataforma para presumir tus gustos musicales. Desde versiones MIDI de The Final Countdown borbotando en el fondo, hasta la reproducción automática de mp3 de MySpace en tu cara, el sonido estaba en todas partes.

Ya no más.  Después de tanta decepción por estas atrocidades de experiencias de usuarios, los desarrolladores web se mantienen bien alejados de ella. Lamentablemente, el sonido ha pasado a un segundo plano en la web, mientras que las aplicaciones nativas florecen.

Piensa en el sonido de la notificación que escuchas al recibir un correo electrónico, o en el pequeño estallido cuando vas a actualizar la aplicación de Twitter. Estas aplicaciones muestran cómo el sonido puede ser parte integral de una gran experiencia de usuario.

En este tutorial te mostraré cómo devolver el sonido a la web, ¡de manera positiva!

El audio web de la API

El audio web de API es una forma potente y de alto rendimiento de manipular el sonido en el explorador. Antes de continuar con este tutorial, es posible que desees consultar el tutorial anterior de esta serie donde escribí el cómo hacer un sonido básico usando JavaScript, así como reproducir un archivo mp3.

Para este tutorial vamos a simular una página de pago que nos dará un audio el cual signifique que nuestro pagó fue hecho correctamente.  Usaré Bootstrap para hacer que las cosas se vean más rápido.

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="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
8
    </head>
9
    <body>
10
        <div class="container">
11
            <div class="row">
12
                <div class="col-md-6">
13
                    <h1>My shop</h1>
14
                    <p>Are you ready to buy this item?</p>
15
                    <form action="">
16
                        <div class="form-group">
17
                            <label>Name on card</label>
18
                            <input type="text" class="form-control" value="Guybrush Threepwood" />
19
                        </div>
20
                        <div class="form-group">
21
                            <label>Card number</label>
22
                            <input type="text" class="form-control" value="1234-1234-1234-1234" />
23
                        </div>
24
                    </form>
25
                    <button id="buy-now-button" type="button" class="btn btn-primary"
26
                        data-loading-text="Processing..." data-complete-text="Success!">Buy now</button>
27
                </div>
28
            </div>
29
        </div>
30
31
        <script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
32
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
33
        
34
        <script src="scripts/success-sound.js"></script>
35
    </body>
36
</html>

Notarás que en la parte inferior he incluido un archivo llamado "success-sound.js". Aquí es donde escribiremos nuestro código para proporcionar comentarios de audio al usuario cuando su pago se realice correctamente. Una vez que hayas creado este archivo, lo primero que queremos hacer es crear un AudioContext. Es posible que recuerdes del último tutorial que un AudioContext es la forma en que accedemos a las diversas funciones del audio web de API.

var contexto = new AudioContext();

Osciladores

Una de las mejores cosas del audio web de API es que nos permite crear sonidos desde cero sin siquiera mirar un archivo de audio. Hacemos esto usando osciladores.

Los osciladores son una forma de crear el tono que podemos escuchar. Lo hacen generando una onda periódica a una cierta frecuencia. La forma de esta onda varía, pero los tipos más comunes son las ondas seno, cuadradas, triangulares y de diente de sierra. Todos estos tipos de ondas suenan diferentes. Vamos a crear dos osciladores de onda triangular.

1
var osc1 = context.createOscillator(),
2
    osc2 = context.createOscillator();
3
    
4
osc1.type = 'triangle';
5
osc2.type = 'triangle';

Los osciladores son muy ruidosos por defecto, por lo que a menos que queramos dar a nuestros usuarios el susto de sus vidas, debemos bajar un poco el volumen. Debido a que la API de audio web funciona encadenando nodos para canalizar el sonido, creamos y conectamos nuestros osciladores a un GainNode.

1
var volume = context.createGain();
2
3
volume.gain.value = 0.1;

Los nodos de ganancia multiplican el volumen del sonido que entra por el número que especifiques. Por lo tanto, en este caso el volumen será una décima parte de la señal que le llega.

Vamos a conectar todo.

1
// Connect oscillators to the GainNode

2
osc1.connect(volume);
3
osc2.connect(volume);
4
5
// Connect GainNode to the speakers

6
volume.connect(context.destination);

Luego comprueba que lo hemos hecho bien tocando los osciladores durante dos segundos.

1
// How long to play oscillator for (in seconds)

2
var duration = 2;
3
4
// When to start playing the oscillators

5
var startTime = context.currentTime;
6
7
// Start the oscillators

8
osc1.start(startTime);
9
osc2.start(startTime);
10
11
// Stop the oscillators 2 seconds from now

12
osc1.stop(startTime + duration);
13
osc1.stop(startTime + duration);

En este punto deberías escuchar un tono cuando cargues tu página. No es el sonido más sorprendente, y sé que estás de acuerdo con ello, pero es un comienzo.

Los osciladores que hemos creado se reproducen a una frecuencia predeterminada. Al cambiar esta frecuencia, podemos cambiar la nota musical que escuchas cuando se toca. Esto es lo que hará que nuestro tono sea un poco más agradable y es clave para la sensación que quieres invocar cuando tu usuario lo escuche. Cambiemos nuestro oscilador para que toque en la nota "B4", que es de 493,883Hz.

1
var frequency = 493.883;
2
3
osc1.frequency.value = frequency;
4
osc2.frequency.value = frequency;

Ahora, si cargamos la página, escucharás el tono de una manera diferente.  Ya en este punto, estarás pensando: "¿Por qué tocamos dos osciladores con el mismo tono exactamente?" Bien, esto nos lleva a un pequeño truco que podemos hacer para que nuestro tono suene un poco mejor.

Si desafinamos nuestros osciladores para hacer que sus frecuencias sean ligeramente diferentes, terminamos con un bonito efecto de coro, haciendo que nuestro tono suene mucho mejor.

1
var frequency = 493.883;
2
3
osc1.frequency.value = frequency + 1;
4
osc2.frequency.value = frequency - 2;

Si bien nuestro pequeño sonido suena mucho mejor, termina muy abruptamente. Para que esto sea menos chocante, debemos bajar rápidamente el volumen al final del sonido; esto también se conoce como "desvanecimiento". Esto se hace a través de AudioParams que se utilizan para automatizar los valores de los nodos de audio, como la ganancia y la frecuencia. En el próximo tutorial de esta serie, hablaremos de AudioParams más detalladamente.

1
// Set the volume to be 0.1 just before the end of the tone

2
volume.gain.setValueAtTime(0.1, startTime + duration - 0.05);
3
4
// Make the volume ramp down to zero 0.1 seconds after the end of the tone

5
volume.gain.linearRampToValueAtTime(0, startTime + duration);

Lo que estamos diciendo aquí es que nos aseguremos de que el volumen está a 0,1, 0,05 segundos antes de que termine nuestro tono. A continuación, sigue bajando el volumen hasta que llegue a cero al mismo tiempo que termina nuestro tono.

Vamos a envolver nuestro código hasta ahora en una sola función y ver lo que tenemos.

1
// Play oscillators at certain frequency and for a certain time

2
var playNote = function (frequency, startTime, duration) {
3
    var osc1 = context.createOscillator(),
4
        osc2 = context.createOscillator(),
5
        volume = context.createGain();
6
7
    // Set oscillator wave type

8
    osc1.type = 'triangle';
9
    osc2.type = 'triangle';
10
11
    volume.gain.value = 0.1;    
12
13
    // Set up node routing

14
    osc1.connect(volume);
15
    osc2.connect(volume);
16
    volume.connect(context.destination);
17
18
    // Detune oscillators for chorus effect

19
    osc1.frequency.value = frequency + 1;
20
    osc2.frequency.value = frequency - 2;
21
22
    // Fade out

23
    volume.gain.setValueAtTime(0.1, startTime + duration - 0.05);
24
    volume.gain.linearRampToValueAtTime(0, startTime + duration);
25
26
    // Start oscillators

27
    osc1.start(startTime);
28
    osc2.start(startTime);
29
30
    // Stop oscillators

31
    osc1.stop(startTime + duration);
32
    osc2.stop(startTime + duration);
33
};

Para hacer esta función un poco más potente, he eliminado algunas de las variables y he permitido que pasen estos valores. Esto nos permite tocar diferentes notas a diferentes frecuencias. ¡Ahora es el momento de ser creativos!

Éxito

Piensa en lo que quieres que sientan tus usuarios cuando acaban de comprar algo en tu tienda online. Es una experiencia positiva: alguien ha comprado algo que quería para mejorar su vida de alguna manera, no ha habido errores y la transacción se ha procesado con éxito.

En cuanto al audio, la indicación del éxito es en realidad bastante sencilla. Un motivo musical que sube de tono al final siempre suena mucho más alegre que uno que baja. Ni siquiera necesitas tener una melodía o un montón de notas para transmitir esto. Para demostrar esta teoría, vamos a utilizar dos notas simples para nuestro motivo de éxito.

1
// Play a 'B' now that lasts for 0.116 seconds

2
playNote(493.883, context.currentTime, 0.116);
3
4
// Play an 'E' just as the previous note finishes, that lasts for 0.232 seconds

5
playNote(659.255, context.currentTime + 0.116, 0.232);

Ahh, el dulce sonido del éxito.

Recuerda que sino te divierte tocar con osciladores, también puedes utilizar un archivo mp3. Lee el tutorial anterior para ver cómo.

Es mejor envolver estas dos llamadas a playNote en una sola llamada de función para que tengamos un gancho fácil para reproducir nuestro sonido.

1
var playSuccessSound = function () {
2
    // Play a 'B' now that lasts for 0.116 seconds

3
    playNote(493.883, context.currentTime, 0.116);
4
5
    // Play an 'E' just as the previous note finishes, that lasts for 0.232 seconds

6
    playNote(659.255, context.currentTime + 0.116, 0.232);
7
};

Ahora depende de ti cómo quieres desencadenar este sonido y a qué evento deseas reproducirlo como reacción. A los efectos de este tutorial. vamos a fingir una llamada Ajax que tarda tres segundos. Utilizaremos esto para fingir que está ocurriendo alguna transacción del lado del servidor.

1
var myFakeAjaxCall = function (callback) {
2
    setTimeout(function () {
3
        callback();
4
    }, 3000);
5
};

Todo lo que tenemos que hacer ahora es añadir un receptor de eventos a nuestro botón de compra.

1
$('#buy-now-button').click(function () {
2
    myFakeAjaxCall(function () {
3
        playSuccessSound();
4
    });
5
});

Haz clic en el botón, espera tres segundos y, a continuación, baila con alegría mientras escucha la confirmación de audio de que tu transacción se realizó correctamente.

Para cambiar el texto del botón para indicar visualmente que algo ha sucedido, Bootstrap proporciona algunas funciones de ayuda al botón para intercambiar el texto proporcionado en un atributo de datos. Cómo funciona esto está fuera del alcance de este artículo, pero aquí está el código para completarlo.

1
$('#buy-now-button').click(function () {
2
    var that = this,
3
        $btn = $(this).button('loading');
4
5
    myFakeAjaxCall(function () {
6
        playSuccessSound();
7
        $btn.button('complete');
8
    });
9
});

Espero que este tutorial te haya resultado útil y te haya animado a añadir sonido (¡con responsabilidad!) a tu aplicación web. El código de este tutorial está en GitHub, así como una demostración de nuestro sonido final. El siguiente tutorial de esta serie es para aquellos que han cogido el gusto a los osciladores; construiremos un sintetizador de audio web.

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.