根据我的理解,来自振荡器的所有波从-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之间。
答案 0 :(得分:1)
方波振荡器的确从-1变为1,但并不完全符合您的预期,因为它是标准化的。由于带限制,在不连续处有一些振铃,所以实际的" square"波浪的顶部略低于1.
您可以为输出添加增益以将其放大一点。最好的解决方案是使用PeriodicWave创建自己的方波,但关闭此规范化。然后方形顶部的振幅为1,但波浪的某些部分将超过1。