2017-02-04 5 views
1

Я строю простой синтезатор с помощью элемента управления WebMIDI. Узел усиления не влияет на осциллятор, он находится в полном объеме все время. Также, когда я воспроизвожу аккорды, частоты правильны, но есть эффект качания и визжа. Проблемы возникают при игре с моим MIDI-контроллером и при запуске и остановке синтезатора с помощью консоли.Множество осцилляторов визг, усиление не действует в 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

Осцилляторы полнодиапазонная - т.е. [-1, + 1]. Когда вы суммируете два сигнала (например, подключаете их к одному и тому же выходному узлу), они находятся в диапазоне [-2, + 2], которые будут скопированы некоторое время. Запустите их через узел усиления со значением = 0,5 и см. если это устраняет проблему. (В идеале вы немного снизите коэффициент усиления и запускаете их через компрессор/ограничитель.)