2016-12-04 3 views
0

컨텍스트를 기반으로 트리거 봉투 : 나는WebAudioAPI : 입력

지금까지 웹에 100 % 모듈 식 신디사이저를 만들기 위해 노력하고있어 나는의 여러 단계를 실행하는 데 사용되는 기능 봉투를 만들기위한 본 적이 자습서 엔벨로프,하지만 AudioNode의 출력을 기반으로 엔벨로프를 트리거하려면 어떻게해야합니까?

예를 들어 방형 파 발진기의 상승 에지에서 공격하고 하강 에지에서 해제합니까?

스크립트 프로세서 노드를 사용해야하는 (또는 성능이 저하 될 수 있습니까?) 또는 아직 알 수없는 더 좋은 방법이 있습니까? 미리

감사

명확화 :

입력 간단한 이진 게이트이다. 키를 누르고 있으면 1, 그렇지 않으면 0입니다.

AudioParams는 공격 시간, 감쇠 시간, 지속 레벨 및 릴리스 시간을 제어 할 수있는 몇 가지 매개 변수가 있어야합니다. 붕괴 레벨 (ADSR 엔벨로프의 피크)이 1이라고 가정합니다.

출력은 ADSR 엔벨로프 신호 자체입니다.

답변

1

아날로그 회로가있는 경우 구형파를 구별 할 수 있습니다. 전연에서의 양의 임펄스와 후연에서의 음의 임펄스. 이 임펄스 트레인을 RC 회로에 공급하십시오. 이것은 공격과 릴리스 단계를 생성합니다.

WebAudio에서 신호 하나의 샘플을 지연시키고 원본에서 빼는 방법으로 간단한 차별화를 수행 할 수 있습니다. RC 회로의 경우 BiquadFilterNode 또는 IIRFilterNode을 사용하여 원하는 결과를 얻을 수 있습니다.

좀 더 복잡한 ADSR 응답을 원한다면 어떻게해야할지 잘 모르겠습니다.

+0

필터 노드에서 어떤 메커니즘을 사용하여 콜백으로 사용하여 asdr을 트리거합니다. 다른 말로하면 그는 일종의 이벤트 리스너를 찾고 있다고 생각하니? – bob

+0

"다른"신호가 어떻게 보이는지, 사용 사례가 실제로 무엇인지에 대한 자세한 정보가 필요하다고 생각합니다. –

+0

답장을 보내 주셔서 감사합니다. 그것은 공격과 릴리스 단계를 얻는 관점에서 잘 작동하지만 궁극적으로는 쇠퇴 단계를 원할 것입니다. 나는이 방법을 일시적으로 사용할 것이다. 지금은 DynamicCompressor 노드와 일부 신호 이득 및 오프셋 조작을 실험하여 오디오 매개 변수가있는 완전한 ADSR을 얻을 수 있는지 확인합니다. – euwbah

1

트리거하는 데 사용 된 노드가 실제로 어떤 것을 트리거하는 방법을 잘 모르지만 (sourceNode.onended 이벤트를 사용하는 것 이외에는 궁극적으로 setValueAtTime 및 linearRampToValueAtTime을 사용하여 봉투를 처리해야한다고 생각합니다. .. 첨부 이득 노드에 다시, 당신은 공격 시간을 도출 방법, 유지 및 릴리스는 여전히 신비 여하튼

를,이 기본적인 요점은 내가 봉투 짓고 있어요 방법 :

var triggerAtTime = 10; 
var attackTime = 3; 
var sustainTime = 5; 
var releaseTime = 5; 

var attackVol = 0.8; 

var attackStartTime = triggerAtTime; 
var attackEndTime = triggerAtTime + attackTime; 

var releaseStartTime = attackEndTime + sustainTime; 
var releaseEndTime = releaseStartTime + releaseTime; 

var gainNode = ctx.createGain(); 
var gng = gainNode.gain; 

gng.setValueAtTime(0, attackStartTime); 
gng.linearRampToValueAtTime(attackVol, attackEndTime); 

gng.setValueAtTime(attackVol, releaseStartTime); 
gng.linearRampToValueAtTime(0, releaseEndTime); 

sourceNode.connect(gainNode); 
+0

답변 해 주셔서 감사합니다. 이것은 내가 이미 가지고있는 것이며 실제로 찾고있는 것은 다른 노드의 출력을 기반으로 setValueAtTime() 및 linearRampToValueAtTime() 함수를 트리거하는 방법입니다. 이 경우 모든 ADSR 시간은 하드 코드됩니다. 그러나 상승 에지가 '노트 온'으로 처리되고 하강 에지가 '노트 오프'로 간주되는 다른 구형파 발진기를 기반으로이 엔벨로프를 트리거하는 방법이 있습니까? – euwbah

+0

다른 노드가 구형파이면 간단한 필터를 사용하여 (적어도 부분적으로) 구현할 수 있습니다. 필터에 대한 입력은 방형 파이고 필터의 출력은 이득 노드의 이득을 설정합니다. 웨이브의 상승 에지에서 필터의 출력은 1까지 증가합니다. 트레일 링 에지에서 필터의 출력은 0으로 내려갑니다. 이러한 램프는 원치 않는 특정 대칭을 갖습니다. 보다 복잡한 계획이 필요할 것이다. –