Генерация звука на лету с помощью javascript / html5


можно ли создать постоянный звуковой поток с помощью javascript / html? Например, чтобы создать вечную синусоидальную волну, у меня была бы функция обратного вызова, которая вызывалась бы всякий раз, когда выходной буфер собирается стать пустым:

function getSampleAt(timestep)
{
    return Math.sin(timestep);
}

(идея в том, чтобы использовать это, чтобы сделать интерактивный синтезатор. Я не знаю заранее, как долго будет нажата клавиша, поэтому я не могу использовать буфер фиксированной длины)

6 59

6 ответов:

использование аудиоэлемента HTML5

кроссбраузерный генеративный устойчивый звук с использованием JavaScript и audio элемент в настоящее время не представляется возможным, как Стивен Виттенс заметки в блоге о создании синтезатора на JavaScript:

"...там нет никакого способа, чтобы поставить в очередь куски синтезированного звука для бесшовного воспроизведения".

использование Web Audio API

The Web Audio API был разработан для облегчения Синтез аудио JavaScript. Сеть разработчиков Mozilla имеет Веб-Генератор Тона это работает в Firefox 4+ [демо 1]. Добавьте эти две строки в этот код, и у вас есть рабочий синтезатор с генеративным устойчивым звуком при нажатии клавиши [demo 2 - работает только в Firefox 4, сначала нажмите область "результаты", затем нажмите любую клавишу]:

window.onkeydown = start;  
window.onkeyup = stop;

ВВС страница в Web Audio API стоит тоже рассматривать. К сожалению, поддержка для веб-аудио API еще не распространяется на другие браузеры.

способы

чтобы создать кросс-браузерный синтезатор в настоящее время, вам, вероятно, придется вернуться к предварительно записанному аудио:

  1. используя длинные предварительно записанные OGG / mp3 образцы тонов, встраивая их в отдельные audio элементы и запуск и остановка их при нажатии клавиши.
  2. встраивание swf-файла, содержащего аудиоэлементы и управление воспроизведением с помощью JavaScript. (Этот представляется способ, что Google Les Paul Doodle работает.)

можно использовать Web Audio API в большинстве браузеров сейчас ( исключая IE и Opera Mini).

попробуйте этот код:

// one context per document
var context = new (window.AudioContext || window.webkitAudioContext)();
var osc = context.createOscillator(); // instantiate an oscillator
osc.type = 'sine'; // this is the default - also square, sawtooth, triangle
osc.frequency.value = 440; // Hz
osc.connect(context.destination); // connect it to the destination
osc.start(); // start the oscillator
osc.stop(context.currentTime + 2); // stop 2 seconds after the current time

Если вы хотите уменьшить громкость, вы можете сделать что-то вроде этого:

var context = new webkitAudioContext();
var osc = context.createOscillator();
var vol = context.createGain();

vol.gain.value = 0.1; // from 0 to 1, 1 full volume, 0 is muted
osc.connect(vol); // connect osc to vol
vol.connect(context.destination); // connect vol to context destination
osc.start(context.currentTime + 3); // start it three seconds from now

Я получил большую часть этого от экспериментов в хроме во время чтения Web Audio API рабочий проект, который я нашел по ссылке @brainjam.

Я надеюсь, что помогает. Наконец, это очень полезно для проверки различных объектов в инспекторе chrome (ctrl-shift-i).

Web Audio API подходит к Chrome. См.http://googlechrome.github.io/web-audio-samples/samples/audio/index.html

следуйте инструкциям в разделе "начало работы" там, а затем проверить очень впечатляющие демонстрации.

обновление(2017): сейчас это гораздо более зрелый интерфейс. С помощью API документированы в https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API

точно! Вы можете использовать синтезатор тона в этой демонстрации:

enter image description here

audioCtx = new(window.AudioContext || window.webkitAudioContext)();

show();

function show() {
  frequency = document.getElementById("fIn").value;
  document.getElementById("fOut").innerHTML = frequency + ' Hz';

  switch (document.getElementById("tIn").value * 1) {
    case 0: type = 'sine'; break;
    case 1: type = 'square'; break;
    case 2: type = 'sawtooth'; break;
    case 3: type = 'triangle'; break;
  }
  document.getElementById("tOut").innerHTML = type;

  volume = document.getElementById("vIn").value / 100;
  document.getElementById("vOut").innerHTML = volume;

  duration = document.getElementById("dIn").value;
  document.getElementById("dOut").innerHTML = duration + ' ms';
}

function beep() {
  var oscillator = audioCtx.createOscillator();
  var gainNode = audioCtx.createGain();

  oscillator.connect(gainNode);
  gainNode.connect(audioCtx.destination);

  gainNode.gain.value = volume;
  oscillator.frequency.value = frequency;
  oscillator.type = type;

  oscillator.start();

  setTimeout(
    function() {
      oscillator.stop();
    },
    duration
  );
};
frequency
<input type="range" id="fIn" min="40" max="6000" oninput="show()" />
<span id="fOut"></span><br>
type
<input type="range" id="tIn" min="0" max="3" oninput="show()" />
<span id="tOut"></span><br>
volume
<input type="range" id="vIn" min="0" max="100" oninput="show()" />
<span id="vOut"></span><br>
duration
<input type="range" id="dIn" min="1" max="5000" oninput="show()" />
<span id="dOut"></span>
<br>
<button onclick='beep();'>Play</button>

удачи!

Я получил решение от Houshalter здесь: как сделать Javascript звуковой сигнал?

вы можете клонировать и настраивать код здесь: Tone синтезатор демо на JS Bin

совместимые браузеры:

  • Chrome mobile & desktop
  • Firefox для мобильных и настольных Орега Mobile, Mini и настольного
  • браузер Android
  • Microsoft Edge browser
  • Safari на iPhone или iPad

Не Совместимы

  • Internet Explorer версии 11 (но работает на пограничном браузере)

Это не настоящий ответ на ваш вопрос, потому что вы попросили решение JavaScript, но вы можете использовать ActionScript. Он должен работать на всех основных браузерах.

вы можете вызывать функции ActionScript из JavaScript.

таким образом, вы можете обернуть функции генерации звука ActionScript и сделать их реализацию JavaScript. Просто используйте Adobe Flex для создания крошечного swf, а затем используйте его в качестве бэкэнда для вашего кода JavaScript.

это то, что я искал как навсегда и в конце концов мне удалось сделать это сам, как я хотел. Может быть, вам тоже понравится. Просто слайдер с частотой и нажмите вкл / выкл HTML

<pre>
<p class="texts">Frekvence [Hz]</p>
<input type="range" id="fIn" min="20" max="20000" step="100" value="1234" oninput="show()" />
<span id="fOut"></span><br>
<input class="off" type="button" id="btn1" value="Start / Stop" />
</div>
</pre>`enter code here

'

JAVASCRIPT



    buttonClickResult = function (){
        var button = document.getElementById('btn1');

        button.onclick = function buttonClicked()  {

            if(button.className=="off")  {
                button.className="on";
                oscOn ();
            }

            else if(button.className=="on")  {
                button.className="off";
                oscillator.disconnect();
            }
        }
    };

    buttonClickResult();

    var oscOn = function(){


        window.AudioContext = window.AudioContext || window.webkitAudioContext;
        var context = new AudioContext();
        var gainNode = context.createGain ? context.createGain() : context.createGainNode();

        //context = new window.AudioContext();
        oscillator = context.createOscillator(),
                oscillator.type ='sine';

        oscillator.frequency.value = document.getElementById("fIn").value;
        //gainNode = createGainNode();
        oscillator.connect(gainNode);
        gainNode.connect(context.destination);
        gainNode.gain.value = 1;
        oscillator.start(0);


    };