2016-12-04 10 views
0

Контекст: Я пытаюсь сделать 100% модульный синтезатор на вебWebAudioAPI: Trigger огибающей на основе входного

До сих пор учебники я видел для изготовления конвертов, используемые функции, чтобы вызвать различные этапы конверт, но что, если я хочу вызвать конверт на основе вывода AudioNode?

Например, атакуйте по нарастающему фронту генератора квадратной волны и отпустите на падающем фронте?

Должен ли я прибегать к использованию узла сценария процессора (и страдать от производительности) или есть лучший способ сделать это, которого я еще не обнаружил?

Заранее спасибо

Пояснение:

вход представляет собой простой двоичный вентиль. 1, когда ключ удерживается нажатой, 0, когда он отсутствует.

Должно быть несколько параметров, которые являются AudioParams, которые позволят контролировать время атаки, время затухания, поддерживать уровень и время выпуска. Предполагается, что уровень затухания (пик огибающей ADSR) равен 1

Выходной сигнал является сигналом огибающей ADSR.

ответ

1

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

В WebAudio вы можете сделать простой дифференциатор, задерживая сигнал одного образца и вычитая его из оригинала. Для RC-схемы вы можете использовать BiquadFilterNode или IIRFilterNode для получения желаемого результата.

Я не совсем уверен, что делать, если вы хотите более сложный ответ ADSR.

+0

какой механизм в узле фильтра вы бы использовали в качестве обратного вызова для тигрования asdr. Другими словами, я думаю, он ищет какого-то слушателя событий? – bob

+0

Думаю, нам действительно нужна дополнительная информация о том, как выглядит «другой» сигнал и что такое прецедент. –

+0

Большое спасибо за ваш ответ! Он хорошо работает в плане получения фаз атаки и освобождения, но в конечном итоге мне также понадобится фаза распада. Я буду использовать этот метод временно. Прямо сейчас я экспериментирую с узлами DynamicCompressor и некоторым усилением сигнала и смещением, чтобы увидеть, могу ли я получить полный ADSR с conenctable звуковыми параметрами. – euwbah

1

Хотя я не совсем понимаю, где/как узел, используемый для запуска, фактически инициирует что-то (кроме использования события sourceNode.onended, в конечном счете, я считаю, что вам нужно будет обрабатывать конверт с помощью setValueAtTime и linearRampToValueAtTime .. на прикрепленный узел усиления Опять же, как вычислить время для атаки, поддержание и освобождение до сих пор загадка

Во всяком случае, это основная суть того, как я строй конверт:

var triggerAtTime = 10; 
var attackTime = 3; 
var sustainTime = 5; 
var releaseTime = 5; 

var attackVol = 0.8; 

var attackStartTime = triggerAtTime; 
var attackEndTime = triggerAtTime + attackTime; 

var releaseStartTime = attackEndTime + sustainTime; 
var releaseEndTime = releaseStartTime + releaseTime; 

var gainNode = ctx.createGain(); 
var gng = gainNode.gain; 

gng.setValueAtTime(0, attackStartTime); 
gng.linearRampToValueAtTime(attackVol, attackEndTime); 

gng.setValueAtTime(attackVol, releaseStartTime); 
gng.linearRampToValueAtTime(0, releaseEndTime); 

sourceNode.connect(gainNode); 
+0

Спасибо за ваш ответ. Это то, что у меня уже есть, и на самом деле я ищу, как вызвать функции setValueAtTime() и linearRampToValueAtTime() на основе вывода другого узла. В этом случае все времена ADSR были жестко запрограммированы. Но есть ли способ инициировать этот конверт, скажем, на основе другого прямоугольного осциллятора, где передний фронт рассматривается как «примечание», а падающий фронт - как «забыть»? – euwbah

+0

Если другой узел представляет собой прямоугольную волну, вы можете реализовать это (по крайней мере частично) с помощью простого фильтра. Вход в фильтр представляет собой прямоугольную волну, а выход фильтра устанавливает усиление узла усиления. На восходящем фронте волны выход фильтра будет увеличиваться до 1. На задней кромке выход фильтра уменьшается до 0. Эти пандусы имеют определенную симметрию, которую вы, возможно, не захотите. то потребуется более сложная схема. –

 Смежные вопросы

  • Нет связанных вопросов^_^