Подтвердить что ты не робот

Как использовать createPeriodicWave вместо createScriptProcessor и getChannelData

Я нашел несколько библиотек, которые синтезируют инструмент с помощью API веб-аудио.

Один из них (Band.js) использует createOscillator() в сочетании с типом осциллятора (синус, квадрат,...) см. источник.

Но это звучит слишком синтетично (пример для прослушивания) Я хочу что-то более реалистичное, но я не хочу использовать предварительно скомпилированные звуковые фонты, поэтому его нужно синтезировать. Он также должен работать на мобильном устройстве.

Итак, я нашел другую библиотеку (musical.js), которая использует первые 32 гармоники в качестве матрицы в сочетании с createPeriodicWave см. источник, Тембр потрясающий, вы можете прослушать его

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

Существуют также некоторые значения для настройки и интерполяции гармоник и значений ADSR. Может быть, они только оптимизированы для звучания фортепиано?

Затем я нашел другую библиотеку (гитарный синтезатор), в которой есть действительно хороший тембр для гитары, слушать ее. Но эта библиотека не использует API createPeriodicWave. Вместо этого он использует createScriptProcessor и getChannelData в сочетании с некоторыми "простыми" вычислениями, но ничего подобного гармоникам в другой библиотеке, см. Источник

Итак, мой главный вопрос

Можно ли портировать гитарный синтезатор для использования API createPeriodicWave? Я хочу использовать тембр гитары в musicaljs. Так что я могу переключаться между тембром фортепиано и тембром гитары.

BTW: Найдена другая библиотека, которая синтезирует звуковые инструменты. Вот демон и здесь источник. Звук тоже приятный, но в music.js-библиотеке гораздо более красивый тембр. Но похоже, что он использует нечто похожее, как getChannelData, просто закодированное как WAVE. Он также не работает на моем мобильном устройстве с Android.

4b9b3361

Ответ 1

Это не ответ, просто некоторые мысли и заметки по этой теме.

Сам вопрос интересен для меня, я играю на гитаре, но у меня никогда не было шанса (до сих пор) касаться музыки в коде. Я читал немного теории и играл с music.js, и я чувствую, что я еще далек от решения.

Вот некоторые заметки, надеюсь, что они могут быть полезны:

1) Я собрал приведенный пример кода, извлеченного из musicial.js, см. web-audio-test.js и web-audio.html.

Настройка аудиоузлов для musicial.js, если я не ошибаюсь, заключается в следующем:

есть "хвостовая" часть, которая является общей для всех узлов и постоянно остается и "голова" - набор узлов, созданных для воспроизведения каждой ноты

| ------ HEAD (for each note)------ | --- TAIL (for all notes)----------- |
|                                   |                                     |
[ |Oscillator|->|Biquad|->|Gain|-> ] [|Gain|->|Dynamics  |->|Destination| ]
  | Periodic |  |Filter|  |ADSR|              |Compressor|
  | Wave     |

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

Итак, мы создаем генератор (или два) + фильтр + коэффициент усиления ADSR для воспроизведения каждой ноты. Таким образом мы создаем множество аудио узлов. Musicial.js обрабатывает это, создавая очередь заметок и передавая только ограниченный набор заметок в API веб-аудио.

Настройка гитарного синтезатора выглядит намного проще, и это всего лишь |Script Processor| -> | Output |. Образец гитарного звука генерируется из кода и подается в ScriptProcessor node, который действует как источник звука (например, если вы загрузили образец из файла). Не уверен, но, возможно, music.js также может использовать этот подход для упрощения кода.

2) Я играл с разными параметрами в musicial.js, но все же все звучит как пианино.

Когда я применяю басовые или гитарные коэффициенты из примеров волновых таблиц, это звучит по-другому, но все равно как пианино (особенно высокие ноты).

Настройки ADSR не меняют этот звук "фортепиано", но я думаю, что они не могут фактически превратить звук одного инструмента в звук другого.

Массивы mult и freq, которые используются для интерполяции гармоник в реальном/воображении на более высокую частоту, вероятно, более важны, но если мы держим их пустыми (без интерполяции), инструмент по-прежнему звучит как пианино.

То, что на самом деле нужно изменить для настройки звука, по-прежнему остается загадкой для меня.

Я видел вопрос, который вы опубликовали на github, надеюсь, что автор musicial.js сможет хотя бы дать некоторые подсказки.

3) Полезные ссылки/инструменты

Образцы аудио Google не содержат ничего подобного. Наиболее близким является wavetable synth example, где вы можете переключаться между различными волновыми таблицами.

В Firefox есть "Web Audio Editor" , где вы можете увидеть график аудиоустройств, очень удобный для изучения настройки звука.

4) Практическое решение.

Вы, наверное, уже об этом, на данный момент я бы использовал как musicial.js, так и гитарный синтезатор.

Простая обертка может унифицировать интерфейсы и предоставлять инструменты для фортепиано и гитары.