저는 학습 프로젝트로서 어셈블리에 간단한 신스를 작성하고 있습니다. 근대 신디사이저에있는 몇 가지 고급 기능, 즉 ADSR 인 벨롭과 펄스 폭 변조를 구현하고 싶습니다. 사인파. 지금은 기본적으로 샘플을 손으로 생성하고 샘플 버퍼와 버퍼가 거의 비어있을 때 생성되는 인터럽트가있는 오디오 출력으로 샘플을 푸시합니다.어셈블리 오디오 합성을위한 데이터 구조
내가 계속 붙어있는 것은 '연속적인'파형을 생성하는 방법입니다. 지금은 파도의 단일 인스턴스에 대한 샘플을 생성하고 (톱 또는 펄스 임), 그 하나의 웨이브를 반복하여 연속 출력을 생성합니다. 상상할 수 있듯이 PWM 및 ADSR 엔벨로프에는 잘 맞지 않습니다. 따라서 펄스 폭이나 피치 (예 : 레가토)의 변조와 같이 즉석에서 조정할 수있는 온 디맨드 방식의 웨이브를 생성해야하지만,이를 메모리에서 효율적으로 표현하는 방법에 관해서는 난처한 편입니다 , 버퍼가 채워 졌을 때 웨이브 폼 생성을 '일시 중지'하고 인터럽트가 발생할 때 '다시 시작'하는 방법도 있습니다.
내가감사합니다 :-) 생각하는 올바른 방향으로 찔러으로 너무 많은 해결책을 찾는 게 아니에요
!
그래서 RAM에 어딘가에 파형을 생성 한 다음, 직접 렌더링 대신 신경 쓰지 않고 피드하는 것이 좋습니다. 그러나 지금은 단 하나의 파도 만 가지고 있습니다. 더 복잡한 물결이 메모리 어딘가에 저장되면 어떻게 임의의 길이의 지속과 같은 일을 할 것인가? 미리 렌더링 된 샘플에서 '루프 포인트'를 설정하는 것에 대해 생각했지만 주파수 나 펄스 폭을 변조하는 경우 루프는 잠재적으로 방대한 길이가되어야합니다.나는 퍼즐 조각을 놓치고 있다고 생각합니다. – dmkc
신디가 어떻게 구동되는지 더 알고 싶습니다. 대부분의 플러그인 이펙트/신스 (익숙한)의 경우 클라이언트는 주기적으로 '프로세스'기능을 호출하여 샘플 2 블록의 출력을 요청합니다. DSP에 대한 업데이트는 프로세스 요청간에 매개 변수로 변경된 이벤트 콜백을 통해 수행됩니다. 구현이 비슷합니까? – elSnape
그와 비슷합니다. 예. 제 질문은 대부분 피치와 펄스 폭 변조를 고려하여 2^2의 블록을 생성하는 방법에 관한 것입니다. – dmkc