2013-09-25 1 views
1

예 : 수제 VST 인스트루먼트로 곧 소리를 내고 시퀀서의이 노트가 15000 샘플 길이이고 노트가 processEvents에 의해 ON으로 설정되면, processReplace 함수는 사운드를 0에서 sampleFrames로 재생하기 시작합니다 (여기서는 예제에서 10000 임). 그러면 다음 번에 processReplace에서 루프에 들어갈 때 노트를 재생할 수있는 샘플 수가 5000 개가 될 것이지만 루프는 0에서 10000까지 재생됩니다 (노트에서 재생할 샘플보다 5000 개 더 많음). 연주 될 침묵의 샘플은 5000 개가 될 것이고 이는이 음이 5000 샘플이 될 때까지 꺼지지 않음을 의미합니다!VST SDK 2.4 Instrument - processReplace 및 processEvents

시퀀서의 새로운 사운드가 첫 번째 사운드 바로 뒤에 있으면 processReplace 함수는 processEvents가 설정 한 OFF의 짧은 시간을 보지 않고 다음 샘플을 첫 번째 사운드의 연속 사운드로 간주합니다. 루프가 다시 입력되면 새로운 음표 ON을 참조하십시오.

어떻게 이런 일이 일어나지 않도록 할 수 있습니까? 루프가 중간에 끝나면 processReplace 루프를 중지하려면 어떻게해야합니까?

답변

3

귀하의 질문에 대한 확신이 없지만 여기에 찔림이 있습니다.

들어오는 미디 노트 이벤트에서 processEvents에서 생성 할 사운드를 결정하면 processReplace에 대한 다음 호출이 일어나야합니다. 따라서 processEvents에서 발견 된 노트를 기억하고 processReplace 중에 출력해야하는 내부 상태가 필요합니다.

샘플의 길이 (귀하의 경우)가 버퍼가 들어갈 수있는 시간 (sampleFrames)보다 긴 경우 수행중인 작업과 이전 작업을 기억해야합니다. 귀하의 예제에서 샘플의 2/3가 재생되었고 다음 processReplace는 샘플의 1/3을 재생해야합니다.

미디 노트가 아직 꺼져 있지 않은 경우 (미디 노트 오프 이벤트를받지 못했을 경우) VSTi 플러그인으로 어떻게 처리할지 결정해야합니다. 따라서 동일한 샘플을 반복하여 두 번째 processEvents 호출에서 처음 1/3을 재생하고 나중에 샘플의 나머지 부분을 재생해야한다는 것을 기억하십시오.

이 시나리오에서 미디 노트 오프 메시지를받는 경우 - 해당 샘플을 재생할 때 올바른 시점에 멈추도록 플러그인의 processReplace 논리를 알려주는 내부 상태 (데이터)를 저장해야합니다. 많은 플러그인이 바로 가기를 사용하며 processReplace 버퍼의 sampleFrames와 동일한 샘플 블록에서이 정보를 처리합니다. 그러나 정확하고 싶다면 들어오는 Midi note 이벤트의 deltaFrames를 검사하고 processReplace 처리에서 오프셋을 고려해야합니다.

호스트 (DAW)는 processEvents 및 processReplace 메소드를 호출 할시기를 결정합니다. 일반적으로 플러그인 (인스턴스)의 전체 수명 동안 그렇게 계속됩니다. 따라서 플러그인이하는 일의 내부 상태를 유지하는 것이 중요합니다. 아무것도하지 않으면 출력 버퍼를 변경하지 않습니다 (제로 아웃).

희망이 있습니다. Marc

+0

당신의 대답은이 모든 내용을 다뤘습니다.이 부분은 "이 시나리오에서 어디에서나 미디 노트 오프 메시지를받는다면 ... ..."이 바로 내가 방황하는 내용이었습니다. 당신은 내가 새로운 길을 찾도록 만들었지 만, 내가 정말로 그것을 얻었는지보기 위해 그것을 생각하고 시험해보아야 할 것이라고 믿습니다. 감사. – Magnus

+0

우수. 다행히 도울 수있어. – obiwanjacobi

관련 문제