2011-11-29 4 views
0

Я создал класс 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; 

} 
+0

Можете ли вы дать лучшее описание проблемы? Возможно, если вы проведете тест, в котором вы используете 2 отличительных звука для _a и _s (высокочастотная синусоидальная волна?), Вы можете увидеть проблему на графике вывода. – AShelly

+0

Извините за поздний ответ, но мне пришлось отказаться от этого подхода из-за моего крайнего срока. Скорее всего, я вернусь к нему из личного интереса в более позднее время. –

ответ

0

Только предположение: не факт, что fade никогда не равен 1 происхождение вашей проблемы? Возможно, вы, возможно, напишите fade = i/(fadeStereoSamples - 1).

+0

Извините, но это не сработало. Он фактически решает только объем между двумя смешанными волнами. –

0

Не пытаетесь ли вы исчезать _a и исчезаете в _s? Похоже, вы делаете обратное - _a становится громче к концу.

Кроме того, почему вы начинаете в конце _s, а не в начале? Разве вы не должны смешивать конец _a с началом _s?

И я не уверен, почему вы описываете этот раздел как цикл. Должен быть только один переход за атаку, не так ли? Если вы назовете это несколько раз, _s станет тише и тише, так как вы переписываете его.

+0

Я написал пример, чтобы объяснить, почему я угасаю его так, как я. Надеюсь, поможет. :) –

+0

Я никогда не использовал ActionScript, но я написал MIDI-синтезатор, поэтому я понимаю, что вы пытаетесь решить. Меня смущает самая последняя часть вашего кода, где вы пишете сегмент кроссфейда обратно в хвост _s. Перезагрузится ли источник из источника, прежде чем вы снова вызовете эту функцию? Если нет, похоже, что вы будете постепенно смешиваться все больше и больше, изменяя его от линейного затухания до экспоненциального. – AShelly

+0

Или это называется только один раз как препроцессинг? В этом случае я бы посмотрел на ваши звуковые API-вызовы, поскольку это выглядит разумно. – AShelly

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