2011-11-29 3 views
0

분할 공격/지속 샘플 쌍을 유지하기 위해 SoundEnvelope 클래스를 만들었습니다. 또한 클래스는 서스테인 루프를 사전 처리하여 공격 덩어리의 마지막으로 선택한 양의 스테레오 샘플을 크로스 페이드하고 30ms MP3 인코더 오프셋을 적절히 재생하기 위해 잘라냅니다.AS3 : ByteArray 사운드 데이터 루프 스무딩 문제

트리밍과 루핑 모두 내 프로젝트에 필수적입니다.

공격이 원활하게 지속되고 서스테인 루프로 원활하게 들어가지만 루프가 결국 일부 데이터를 건너 뛰는 것처럼 보일뿐 아니라 크로스 페이딩 효과와 관련이있는 것처럼 보입니다. 타이밍 문제 일 수도 있지만 나는 그 문제를 찾을 수없는 것 같습니다.

동적 처리 사운드에 익숙하지 않은 사용자의 경우 여기 function입니다. 청크가 내 SoundEnvelope 인스턴스의 공격 또는 지속 변수에 포함되는지 여부를 결정하기 위해 if-else 포크가있는 루프를 사용하고 있습니다.

[UPDATE]

@A Shelly: 전문 합성기에서 사운드 봉투 공격 붕괴 서스테인 방출 시퀀스로 구성된다. 필자의 경우 공격과 붕괴는 같은 부분이며, 릴리스는 서스테인의 볼륨을 페이드 아웃하고 있습니다. 서스테인 볼륨은 부드럽게 되돌아 가야합니다.

우리가 tfweeeewweeeewweeeewweeeep처럼가는 원시 트럼펫 샘플을 가지고,의 말을하자, 나의 추출물 _a = [tfweeeew]_s = [weeeewweeeewwe] 부분으로 구성되어 있습니다. 자, 이것은 어떤 샘플이든 될 수 있습니다. 그리고 나는 균일 한 0.5 초 공격과 1.0 초의 서스테인 루프를 사용하고 있습니다. 따라서 사운드를 연속적으로 만들기 위해서는 루프의 끝 부분을 페이드 아웃해야합니다. 왜냐하면 자체 시작 부분과 일치하지 않아서 공격 부분의 끝 부분이 동시에 사라져서 샘플 타일링을 매끄럽게 만들 수 있기 때문입니다. 여기

[CODE]

는 루프의 ... 물론,이 샘플의 엔드 포인트에서 약간의 breathiness을 생산하는 것입니다,하지만 여전히 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

글리치에 대한 더 자세한 설명을 제공 할 수 있습니까? 아마도 _a와 _s에 대해 두 개의 고유 한 사운드를 사용하는 테스트를 수행하면 (높은 주파수 대 낮은 주파수의 사인파?) 출력의 플롯에서 문제를 볼 수 있습니다. – AShelly

+0

늦게 답변을 드려 죄송합니다. 마감일로 인해이 접근법을 취소해야했습니다. 나중에 개인적 관심사로 돌아올 가능성이 큽니다. –

답변

0

그냥 추측 : fade 결코 하나가 문제의 기원과 동일 없다는 사실이 아니다? 아마도 fade = i/(fadeStereoSamples - 1)이라고 쓸 수 있습니다.

+0

죄송합니다. 작동하지 않았습니다. 실제로는 두 개의 혼합 된 파형 사이의 볼륨 만 결정합니다. –

0

_a를 페이드 아웃하고 _s를 페이드하려고하지 않습니까? 당신이 그 반대를하고있는 것처럼 보입니다 - _a는 끝쪽으로 점점 더 커집니다.

또한 시작 부분이 아닌 _ 끝 부분에서 시작하는 이유는 무엇입니까? _a의 ​​끝과 _s의 시작 부분을 섞어서는 안됩니까?

그리고 왜 내가 그 섹션을 반복으로 설명하는지 잘 모르겠습니다. 공격 당 하나의 전환 만 있어야합니다. 맞습니까? 여러 번 호출하면 _s는 덮어 쓰므로 더 조용하고 조용해질 것입니다.

+0

필자는 필자가 내가했던 것처럼 내가 퇴색 한 이유를 설명하기 위해 예제를 작성했다. 희망이 도움이됩니다. :) –

+0

ActionScript를 사용한 적이 없지만 MIDI 신디사이저를 작성 했으므로 해결하려는 내용을 이해합니다. 나는 코드의 마지막 부분에 혼란 스럽다. 여기서 crossfaded segment를 _s의 꼬리 부분에 다시 써 넣는다. 이 함수를 다시 호출하기 전에 _s가 소스에서 다시로드됩니다. 그렇지 않다면 점진적으로 _a를 점차 혼합하여 선형 페이드에서 지수로 변경하는 것처럼 보입니다. – AShelly

+0

아니면 전처리로 한 번만 호출됩니까? 어떤 경우에는 합리적인 것 같아서 오디오 API 호출을 살펴볼 것입니다. – AShelly