2016-12-12 8 views
2

Контекст: Я пытаюсь реализовать конверт ADSR в WebAudioAPI, где Attack, Decay, Sustain и Release - все AudioParams, а «note on» и «note off» представлено входом значение 1 и 0 соответственно. Я использую четыре узла DynamicCompressor и много манипуляций с увеличением, чтобы добиться этого, поскольку компрессоры являются технически конвертирующими устройствами для атаки.WebAudioAPI: разделение двух выходов AudioNodes

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

Если это помогает, вот формула:

decayOffsetY = (1 - sustainLevel) * (attackDur + decayDur)/decayDur 

Обратите внимание, что sustainLevel, attackDur и decayDur все AudioParams.

Сложение, вычитание и умножение все довольно легко достижимы с использованием некоторых ConstantSourceNodes и GainNodes, но как мне пойти на деление?

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

log(decayDur)/5 

для достижения значения 1/decayDur, который будет подключен к другому GainNode. Но возможно ли даже выполнить команду Math.log, используя только AudioNodes?

ответ

2

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

+0

Ничего себе, я полностью упускал из виду волнорез как инструмент искажения. Я понимаю, что вход 'WaveShaperNode' ограничен диапазоном от -1 до 1, но этот лимит также применим и к выходу? – euwbah

+0

Хороший вопрос. Выход не ограничивается одним и тем же диапазоном; он должен быть произвольным, более или менее. –