Как исправить звук нескольких осцилляторов, играющих одновременно, с помощью javascript web audio api - PullRequest
1 голос
/ 01 мая 2019

Я создаю звуковую инсталляцию с одновременным включением нескольких осцилляторов (максимум 5/6 из них будут играть в данный момент времени).Он нормально работает на рабочем столе в Firefox и Chrome, но в Safari он издает ужасный звук "kkrkrkrkrkrkrkrkrkr", если я играю более одного осциллятора за раз.Я использовал один и тот же компьютер для тестирования, поэтому с динамиками проблем нет.На телефоне это работает на iphone, но на андроиде он делает тот же самый эффект "krkrkrkr", если есть несколько осцилляторов, какой бы браузер я не использовал.Конечная цель установки должна отображаться на телефонах, и я не могу контролировать, какие браузеры будут использоваться

Вот упрощенная версия кода

let audioContext;
let touchEvent = 'ontouchstart' in window ? 'touchstart' : 'click';

let oscillators = [];


window.addEventListener(touchEvent, makeSound);

function makeSound(){
    audioContext = new (window.AudioContext || window.webkitAudioContext)();

    createOsc(43.653528929125486);
    createOsc(220);
    createOsc(164.81377845643496);

    currentTime = audioContext.currentTime;
    oscillators.forEach(function(oscillator){
        currentTime = audioContext.currentTime;
        oscillator.start(currentTime);
        oscillator.stop(currentTime + 2);
    });


}

function createOsc(freq){
    oscillator = audioContext.createOscillator();
    oscillator.frequency.value = freq;
    oscillator.connect(audioContext.destination);
    oscillators.push(oscillator);
}

Я пробовалиспользуя ChannelMergerNode, но это ничего не изменило

1 Ответ

0 голосов
/ 25 июня 2019

Кажется, есть разница между 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...