Генерация звука на лету с помощью javascript / html5
можно ли создать постоянный звуковой поток с помощью javascript / html? Например, чтобы создать вечную синусоидальную волну, у меня была бы функция обратного вызова, которая вызывалась бы всякий раз, когда выходной буфер собирается стать пустым:
function getSampleAt(timestep)
{
return Math.sin(timestep);
}
(идея в том, чтобы использовать это, чтобы сделать интерактивный синтезатор. Я не знаю заранее, как долго будет нажата клавиша, поэтому я не могу использовать буфер фиксированной длины)
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 еще не распространяется на другие браузеры.
способы
чтобы создать кросс-браузерный синтезатор в настоящее время, вам, вероятно, придется вернуться к предварительно записанному аудио:
- используя длинные предварительно записанные OGG / mp3 образцы тонов, встраивая их в отдельные
audio
элементы и запуск и остановка их при нажатии клавиши.- встраивание 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
точно! Вы можете использовать синтезатор тона в этой демонстрации:
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); };