2017-02-04 6 views
1

WebMIDI 컨트롤이있는 간단한 신시사이저를 구축하고 있습니다. 게인 노드는 오실레이터에 아무런 영향을 미치지 않으며, 전체 볼륨에서 전체 시간을 유지합니다. 또한 화음을 재생할 때 주파수는 정확하지만 흔들리고 삐걱 거리는 효과가 있습니다. 내 MIDI 컨트롤러로 연주 할 때 및 콘솔을 사용하여 신디사이저를 시작 및 중지 할 때 문제가 발생합니다. - 즉, [-1, + 1]여러 발진기가 비명을 지르며, 이득이 WebAudio에서 아무런 영향을 미치지 않습니다.

var synth = { 
    voices: {}, 

    start: function (note, vol) { 
     this.voices[note] = { 
      gain: audio.createGain(), 
      osc: audio.createOscillator() 
     } 

     this.voices[note].gain.connect(audio.destination); 

     this.voices[note].osc.frequency.value = noteToFreq(note); 
     this.voices[note].osc.connect(this.voices[note].gain); 

     this.voices[note].osc.start(0); 
     this.voices[note].gain.gain.setTargetAtTime(vol, audio.currentTime, 0.5); 
    }, 

    stop: function (note) { 
    this.voices[note].gain.gain.setTargetAtTime(0, audio.currentTime, 2); 
    this.voices[note].osc.stop(audio.currentTime + 2); 
    } 
} 

답변

1

발진기가 전체 범위 :

여기에 내 합성기 코드이다. 두 개의 신호를 더할 때 (예를 들어 두 신호를 같은 출력 노드에 연결하면 [-2, + 2]의 범위에있게되며, 시간의 일부는 클립됩니다. 값이 0.5 인 게인 노드를 통해 이들을 실행하고 (이상적으로는 게인을 조금 떨어 뜨리고 컴프레서/리미터를 통해 실행하십시오.)