Кажется, есть разница между Chrome / Firefox и Safari в том, как они обрабатывают сигналы, выходящие за пределы диапазона от -1 до + 1.
Если вы подключите все три генератора, сигнал теоретически может достичьмаксимум -3 и + 3.
Если вы убедитесь, что сигнал всегда остается в диапазоне от -1 до +1, добавив GainNode с усилением около 0,333 (1 / количество осцилляторов)все браузеры звучат одинаково.
Я обновил ваш фрагмент, чтобы добавить такой GainNode:
let audioContext;
let gainNode;
let touchEvent = 'ontouchstart' in window ? 'touchstart' : 'click';
let oscillators = [];
window.addEventListener(touchEvent, makeSound);
function makeSound(){
audioContext = new (window.AudioContext || window.webkitAudioContext)();
gainNode = audioContext.createGain();
gainNode.connect(audioContext.destination);
createOsc(43.653528929125486);
createOsc(220);
createOsc(164.81377845643496);
const currentTime = audioContext.currentTime;
oscillators.forEach(function(oscillator){
// The next line is probably not needed.
// currentTime = audioContext.currentTime;
oscillator.start(currentTime);
oscillator.stop(currentTime + 2);
});
}
function createOsc(freq){
cons oscillator = audioContext.createOscillator();
oscillator.frequency.value = freq;
oscillator.connect(gainNode);
oscillators.push(oscillator);
gainNode.gain.value = 1 / oscillators.length;
}