Я немного поэкспериментировал с API веб-аудио, и, как я упоминал в своем последнем блоге, существует множество встроенных способов управления звуком. В настоящее время я работаю над проектом с использованием handtrack.js (библиотека отслеживания рук, о которой я также недавно писал в блоге), которая принимает координаты руки, обнаруженной через веб-камеру, и переводит их в музыкальные ноты с помощью веб-аудио. . Это своего рода терменвокс для веб-камеры. Я экспериментировал со многими методами, контролируя громкость, используя фильтры, но одной вещи не хватало. API веб-аудио может принимать практически любое число, читать его как частоту в герцах и преобразовывать в музыкальный тон, но если вы что-то знаете о теории музыки, вы знаете, что в зависимости от музыкального строя, который вы хотите использовать, имеется конечное число нот. Web Audio API не имеет ничего готового, что могло бы создавать гаммы или настраивать ваш проект под них, поэтому мне пришлось найти свой собственный способ разобраться с этим. Мне не удалось найти массу информации по этому вопросу, поэтому я надеюсь, что другие, занимающиеся подобными проектами, сочтут этот блог полезным.

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

Но уравнение для математической распечатки простой 12-тоновой шкалы на самом деле довольно простое. Музыкальные гаммы логарифмические. Все, что вам нужно, это начальная частота и умножить ее на 2 ^ (1/12). Если бы мы хотели другой тон шкалы, все, что нам нужно было бы сделать, это изменить основание 12 на что-то другое. Я использовал цикл while, который может принимать любую начальную частоту в качестве аргумента и возвращать шкалу из 54 нот:

Затем я использовал другую функцию цикла while, чтобы настроить любую ноту на этот лад:

В моем проекте функция scaleCreator подключена к прослушивателям событий, поэтому при каждом нажатии кнопки создается новая шкала и сохраняется переменная «масштаб». Функция autoTune вызывается каждый раз, когда моим движением руки воспроизводится новый тон. Эти функции работали быстро и хорошо, но затем мне нужно было перейти к следующему проекту: настроить мой инструмент на определенные клавиши, например, настоящий терменвокс или автоарфу. В этой части стало намного проще опираться на мои предыдущие знания в области теории музыки, и все, что мне нужно было сделать, это настроить мою функцию scaleCreator.

Все, что нам нужно сделать, это взять хроматическую гамму, но включить только ноты, находящиеся через определенные промежутки времени. Вот как я изменил свою функцию scaleCreator:

Я использовал переменную-счетчик, которая отслеживает, где находится цикл while в хроматической шкале, и я проверяю счетчик по переменной «интервалы», чтобы увидеть, соответствует ли она выбранной шкале. Теперь все, что мне нужно сделать, это изменить интервалы, и я могу создать любую 12-тональную музыкальную гамму на свете! Я надеюсь, что этот блог смог помочь другим начинающим музыкантам веб-аудио, и следите за настройками, чтобы узнать больше об обновлениях моего терменвокса для веб-камеры!