据我了解,振荡器的所有波都从-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变为1,但由于它已归一化,因此并没有达到您期望的效果。由于带宽限制,在不连续处会有一些振铃,因此波的实际“正方形”顶部略低于1。
您可以在输出中增加一个增益以将其放大一点。最好的解决方案是使用PeriodicWave创建自己的方波,但请关闭此归一化。然后,正方形顶部的振幅为1,但波的某些部分将超过1。
关于javascript - 如何在Web Audio中使OscillatorNode在0和1之间振荡?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33028393/