Advertisement
  1. Web Design
  2. Web Development

API веб-аудио: добавление звука в веб-приложение

Scroll to top
Read Time: 8 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)

Что случилось с аудио в Интернете? Какое-то время сеть была платформой, чтобы продемонстрировать ваш вкус в мелодиях. Из MIDI-версий The Final Countdown, пузырящихся в фоновом режиме, для автовоспроизведения MySpace mp3, которые были выброшены вам в лицо, звук был повсюду.

Но сейчас все не так. Теперь веб-разработчики держатся подальше от этого всего. К сожалению, звук переместился на заднее место в Интернете, в то время как нативные приложения процветают.

Подумайте о том, что звук уведомления слышен при получении электронной почты или небольшой поп, когда вы пытаетесь обновить приложение Twitter. Такие приложения показывают, как звук может быть неотъемлемой частью большого пользовательского интерфейса.

В этом уроке я покажу вам, как вернуть звук в Интернет, в хорошем смысле этого слова!

API веб-аудио

Web Audio API - это мощный, высокопроизводительный способ манипулирования звуком в браузере. Прежде чем продолжить этот учебник, вы можете проверить предыдущий учебник в этой серии, где я рассказал о том, как сделать базовый звук с помощью JavaScript, а также воспроизвести mp3-файл.

Для этого урока мы собираемся сделать макет страницы оплаты, которая дает нам обратную связь, что наш платеж будет успешным. Я буду использовать Bootstrap, чтобы все выглядело лучше.

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>

Вы заметите, что в самом низу я включил файл с именем «success-sound.js». Здесь мы напишем наш код, чтобы предоставить аудиоотчет для пользователя, когда их платеж будет успешным. Создав этот файл, первое, что мы хотим сделать, это создать AudioContext. Вы можете вспомнить из последнего учебника, что AudioContext - это то, как мы обращаемся к различным функциям API веб-аудио.

var context = new AudioContext();

Осцилляторы

Одна из лучших вещей в Web Audio API заключается в том, что она позволяет создавать звуки с нуля, даже не глядя на аудиофайл. Мы делаем это с помощью осцилляторов.

Осцилляторы - это способ создания тона, который мы слышим. Они делают это, создавая периодическую волну с определенной частотой. Форма этой волны меняется, но наиболее распространенными типами являются синусоидальные, квадратные, треугольные и пилообразные волны. Эти типы волн звучат иначе. Давайте создадим два осциллятора треугольной волны.

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

Осцилляторы довольно громкие по умолчанию, поэтому, если мы не хотим, чтобы наши пользователи испугались, мы должны немного уменьшить звук. Поскольку API веб-аудио работает, объединяя узлы вместе, чтобы проиграть звук, мы создаем и подключаем наши генераторы к GainNode.

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

Усиление узлов умножает громкость звука, входящего в указанный вами номер. Таким образом, в этом случае объем будет составлять одну десятую от передаваемого ему сигнала.

Давайте все подключим.

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);

Затем проверьте, что мы сделали всё правильно, играя осцилляторы в течение двух секунд.

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);

На этом этапе вы должны услышать тон при перезагрузке своей страницы. Не самый потрясающий звук, я уверен, вы согласитесь, но это только начало!

Осцилляторы, которые мы создали, играют по умолчанию на определенной частоте. Изменяя эту частоту, мы можем изменить музыкальную ноту, которую вы слышите, когда она воспроизводится. Это то, что сделает наш тон немного более приятным и ключом к ощущению, которое вы хотите вызвать, когда ваш пользователь его слышит. Давайте изменим наш осциллятор, чтобы проиграть отметку «B4», которая составляет 493,883 Гц.

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

Теперь, если мы перезагрузим страницу, вы услышите тон на другой высоте. На этот момент вы можете подумать: «Почему мы проигрывем два осциллятора с одинаковой высотой?» Ну, это приводит нас к небольшому трюку, который мы можем сделать, чтобы звук нашего тона был немного приятнее.

Если мы отфильтруем наши осцилляторы, чтобы их частоты были немного разными, мы получим хороший эффект хоруса, делая наш звук намного богаче.

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

Хотя наш маленький звук звучит намного лучше, он заканчивается довольно резко. Чтобы сделать его менее резким, мы должны быстро отменить громкость в конце звука; это также известно как «затухание». Это делается с помощью AudioParams, которые используются для автоматизации значений аудиоузлов, таких как усиление и частота. Мы перейдем к AudioParams более подробно в следующем учебнике этой серии.

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);

Мы хотим здесь убедиться, что громкость составляет 0,1, 0,05 секунды, прежде чем наш тон закончится. Затем продолжайте уменьшать громкость до тех пор, пока она не достигнет нуля, в то же время наш тон заканчивается.

Давайте соберем наш код в одну функцию и посмотрим, что у нас есть.

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
};

Чтобы сделать эту функцию немного более мощной, я удалил некоторые из переменных и разрешил передавать эти значения. Это позволяет нам играть разные ноты на разных частотах. Теперь пришло время проявить творческий подход!

Успешное выполнение

Подумайте о том, что вы хотите, чтобы ваши пользователи чувствовали, когда они только что купили что-то из вашего интернет-магазина. Это положительный опыт: кто-то купил то, что хотел, чтобы как-то улучшить свою жизнь, ошибок не было и транзакция была успешно обработана.

Аудио-показатель успеха на самом деле довольно прост. Музыкальный мотив, который поднимается в конце, всегда звучит намного радостнее, чем тот, который идет вниз. Вам даже не нужно иметь мелодию или целую кучу нот, чтобы передать это. Чтобы доказать эту теорию, давайте просто использовать две отдельные ноты для нашего мотива успеха.

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);

Ах, сладкий звук успеха.

Помните, что если осцилляторы вам не по душе, вы всегда можете использовать mp3-файл. Прочитайте предыдущий учебник, чтобы узнать, как это сделать.

Лучше всего обернуть эти два вызова playNote в один вызов функции, чтобы у нас был легкий хук для воспроизведения нашего звука.

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
};

Теперь вам решать, как вы хотите вызвать этот звук и какое событие вы хотите сыграть в ответ. Для целей данного руководства. давайте подделаем вызов Ajax, который занимает три секунды. Мы будем использовать это, чтобы сделать вид, что происходит транзакция на стороне сервера.

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

Все, что нам нужно сделать, это добавить слушателя событию в нашу кнопку «Купить сейчас».

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

Нажмите кнопку, подождите три секунды, а затем танцуйте и ликуйте, когда услышите звуковое подтверждение того, что ваша транзакция прошла успешно.

Можно изменить текст на кнопке, чтобы визуально показать, что что-то произошло, Bootstrap предоставляет некоторые вспомогательные функции кнопок для замены в тексте, указанном в атрибуте data. То как это работает, выходит за рамки данной статьи, но вот код для полноты картины.

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
});

Надеюсь, вы нашли этот учебник полезным. Код для этого учебника есть на GitHub, а также демоверсия нашего финального звука. Следующий учебник этой серии предназначен для тех из вас, кто поймал ошибку осциллятора; мы будем создавать веб-аудио синтезатор.

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.