Я создал класс SoundEnvelope для хранения пары патчей с раздельной атакой/выдержкой. Класс также предварительно обрабатывает цикл сустава, чтобы перекрестно сфокусироваться с последним выбранным количеством стереоэмплексов блока атаки, а смещение MP3-кодера 30 мс обрезается для правильного воспроизведения.AS3: проблема сглаживания звуковых данных ByteArray
Как для обрезки, так и для петли необходимы для моего проекта.
Теперь атака накапливается хорошо, плавно переходит в цикл сустейна, но цикл, кажется, пропускает некоторые данные в конце, и, похоже, он в основном связан с эффектом кроссфейдинга, вероятно, это проблема времени, но Я просто не могу найти проблему.
Для тех, кто не знаком с динамически обработанными звуками, вот function, я использую цикл с вилкой if-else, чтобы решить, находится ли кусок в атаке или переменная сустейна моего экземпляра SoundEnvelope.
[ОБНОВЛЕНИЕ]
@A Shelly:
звук конверт в профессиональный синтезатор состоит из последовательности атаки-распад-поддержания высвобождения. В моем случае атака и распад - это одна и та же часть, и релиз просто затухает в объеме сустейна, который должен зацикливаться на нем плавно.
Допустим, у нас есть сырой образец труба, которая идет как tfweeeewweeeewweeeewweeeep, и мой экстракт состоит из _a
= [tfweeeew] и _s
= [weeeewweeeewwe] частей. Теперь это может быть любой образец, и я использую равномерную атаку 0,5 сек и петлю поддержки 1,0 сек. Таким образом, чтобы сделать звук непрерывным, мне нужно погасить конец цикла, поскольку он не соответствует его собственному началу и в то же время постепенно исчезает в концевой части части атаки, что сделало бы образец черепицей бесшовной. Конечно, это будет производить небольшое хриплость в конечной точке образца, но это все-таки лучше, чем это поп в то время как перекручивание ... deewdeewdeewdeewdeew ...
[КОД]
Вот зациклившейся функция, я действительно надеюсь, что кто-то может мне помочь, спасибо заранее:
public function fadeLoop(fadeStereoSamples:uint):void {
var volume:Number;
var helper:ByteArray = new ByteArray();
var fade:Number;
// moves the pointer to the overlapping part's beginning of sustain and attack ByteArrays
// _a and _s are the two chunk arrays in the SoundEnvelope object
_a.position = _a.length - fadeStereoSamples * 8;
_s.position = _s.length - fadeStereoSamples * 8;
// crossfade through input amount of sample-pairs
for (var i:uint = 0; i < fadeStereoSamples; i++) {
fade = i/fadeStereoSamples;
// fadestep left
helper.writeFloat(_a.readFloat() * fade + _s.readFloat() * (1 - fade));
// fadestep right
helper.writeFloat(_a.readFloat() * fade + _s.readFloat() * (1 - fade));
}
_s.position = _s.length - fadeStereoSamples * 8;
for (i = 0; i < fadeStereoSamples; i++) {
helper.position = 0;
_s.writeFloat(helper.readFloat());
_s.writeFloat(helper.readFloat());
}
_a.position = 0;
_s.position = 0;
}
Можете ли вы дать лучшее описание проблемы? Возможно, если вы проведете тест, в котором вы используете 2 отличительных звука для _a и _s (высокочастотная синусоидальная волна?), Вы можете увидеть проблему на графике вывода. – AShelly
Извините за поздний ответ, но мне пришлось отказаться от этого подхода из-за моего крайнего срока. Скорее всего, я вернусь к нему из личного интереса в более позднее время. –