如何在Web Audio中将OscillatorNode设置为0到1之间?

时间:2015-10-09 01:12:19

标签: javascript audio web-audio

根据我的理解,来自振荡器的所有波从-1振荡到1。

我想让它们从0到1振荡,仍然使用正弦波和方波。

为什么呢?例如,只有音调的颤音(音调永远不会低于主音符,就像吉他颤音一样)。

在颤音的情况下。我最接近的是在两个音符的中间弹奏音符并从那里振荡,但音调并不完全正确:



window.AudioContext = window.AudioContext || window.webkitAudioContext;
var audioContext = new AudioContext();

// notes are semitones from soundFreq
var soundFreq = 440; // a4
var mainNote = 0.0;  // a4
var bendNote = 4.0;  // c#4 (major third interval)

// nSoundSource is the sound we're playing, on the a4
var nSoundSource = audioContext.createOscillator();
nSoundSource.type = 'triangle';
nSoundSource.frequency.value = soundFreq; // a4

// at 1 second sound plays the note between a4 and c#4: b4
nSoundSource.frequency.setValueAtTime(
  intervalToFrequency((mainNote + bendNote) / 2) * soundFreq,
  audioContext.currentTime + 1.0
);

// at 3 seconds, sound returns to a4
nSoundSource.frequency.setValueAtTime(
  soundFreq,
  audioContext.currentTime + 3.0
);


// gain to change the detune of the played sound
var nGainSoundFreq = audioContext.createGain();

// if amplitude is the whole interval (400 cents), the value should be half of that, so in this case 200 cents
nGainSoundFreq.gain.value = ((mainNote + bendNote) / 2) * 100; // 200 cents up and down

// oscillator to make the vibrato on the gain
var nGainSoundFreqOsc = audioContext.createOscillator();
nGainSoundFreqOsc.type = 'square'; // try with sine too
nGainSoundFreqOsc.frequency.value = 3;
nGainSoundFreqOsc.start(audioContext.currentTime + 1.0);
nGainSoundFreqOsc.stop(audioContext.currentTime + 3.0);

// enable vibrato
nGainSoundFreqOsc.connect(nGainSoundFreq);
nGainSoundFreq.connect(nSoundSource.detune);

// play the sound
nSoundSource.connect(audioContext.destination);
nSoundSource.start(audioContext.currentTime);
nSoundSource.stop(audioContext.currentTime + 4.0);


// helper to convert semitones to frequency
function intervalToFrequency(interval) {
    return Math.pow(2, interval / 12);
}




我知道我可以使用其他技术来实现颤音,这不是重点。我想知道是否可以使NodeOscillator振荡在0和1之间。

1 个答案:

答案 0 :(得分:1)

方波振荡器的确从-1变为1,但并不完全符合您的预期,因为它是标准化的。由于带限制,在不连续处有一些振铃,所以实际的" square"波浪的顶部略低于1.

您可以为输出添加增益以将其放大一点。最好的解决方案是使用PeriodicWave创建自己的方波,但关闭此规范化。然后方形顶部的振幅为1,但波浪的某些部分将超过1。