На самом деле это больше теоретический вопрос, но вот оно.:
Я разрабатываю звуковой блок с эффектами, и ему требуется равномощное перекрестное затухание между необработанными и обработанными сигналами.
Но я запутался в правильном способе отображения функции линейного фейдера на масштабный коэффициент (gain)для амплитуд сигналов сухих и влажных потоков.
По сути, я видел, как это делается с функциями cos/sin или квадратными корнями... по сути, аппроксимирующими логарифмические кривые. Но если наше восприятие амплитуды изначально логарифмическое, то не должны ли эти кривые, отображающие положение фейдера в амплитуду, на самом деле быть экспоненциальными?
Это то, что я имею в виду:
Предположения:
signal[i]
означает i-й образец в сигнале.fader
— это переменная со значением NSSlider.Первое наблюдение:
Мы воспринимаем амплитуду логарифмически. Итак, если у нас есть линейный фейдер и мы просто регулируем амплитуду сигнала, делая:signal[i] * fader
то, что мы воспринимаем, (слышим, независимо от математики), это что-то вроде:
Это так-называется дерьмовым фейдером-эффектом:. Мы переходим от тишины к резкому увеличению громкости в крайнем левом сегменте ползунка, а после середины громкость, кажется, не становится настолько громче.
Таким образом, чтобы сделать фейдер «правильным», мы вместо этого либо выражаем его в шкале дБ, а затем, что касается сигнала, делаем:signal[i] * 10^(fader/20)
или, если мы должны были сохранить единицы фейдера в [0, 1], мы можем сделать:signal[i] * (.001*10^(3*fader))
В любом случае, наше новое сопоставление NSSlider с переменной фейдера, которую мы будем использовать для умножения в нашем коде,теперь выглядит так:
Именно этого мы и хотим, потому что, поскольку мы воспринимаем амплитуду логарифмически, мы, по существу, отображаем от линейного(диапазона NSSLider 0-1)до экспоненциального и передавая этот экспоненциальный результат нашему логарифмическому восприятию. И получается, что:log(10^x)=x
таким образом, мы в конечном итоге воспринимаем изменение амплитуды линейным (то есть правильным)способом.
Отлично.
Теперь я думаю, что равный-мощный перекрестный переход между двумя сигналами(в данном случае сухой/влажный горизонтальный NSSlider для смешивания вместе входного сигнала в AU и обработанного выходного сигнала)от него по существу то же самое только с одним ползунком, воздействующим на оба гипотетических сигнала dry[i] и wet[i].
Таким образом, если мой ползунок находится в диапазоне от 0 до 100 и сухой заполнен-слева, а влажный заполнен-справа), в итоге я получу код в соответствии со строками:
Float32 outputSample, wetSample, drySample = <assume proper initialization>
Float32 mixLevel =.01 * GetParameter(kParameterTypeMixLevel);
Float32 wetPowerLevel =.001 * pow(10, (mixLevel*3));
Float32 dryPowerLevel =.001 * pow(10, ((-3*mixLevel)+1));
outputSample = (wetSample * wetPowerLevel) + (drySample * dryPowerLevel);
График которого будет:
И так же, как и раньше, поскольку мы воспринимаем амплитуду логарифмически, это экспоненциальное отображение должно фактически сделать ее там, где мы слышим кроссфейд, линейным.
Тем не менее, я видел реализации кроссфейда, использующие аппроксимацию логарифмических кривых. То есть вместо этого:
Но разве эти кривые не подчеркивают наше логарифмическое восприятие амплитуды?