2015-09-13 1 views
0

EDIT 3:Как подключить один или два музыкальных инструмента к API веб-аудио и разделить стереосигнал?

Это была только проблема с Firefox, работает в Chrome, поэтому проблема решена, см. Ответ ниже. Спасибо Крису за вашу помощь!

EDIT 2:

Следуя совету Криса я изменил одну линию на GetUserMedia вызов, но он не работает на данный момент, может быть, я использую неправильный синтаксис, но эта функция не документирована:

if(navigator.getUserMedia){ 
    navigator.getUserMedia(
    { audio: { optional: [{ echoCancellation: false }] } } 
    ,function(stream){ init_stream(stream); } 
    ,function(err){ console.log('The following gUM error occured: ' + err); } 
); 
} 

Кроме того, теперь вы можете следовать ходу здесь:

http://jsfiddle.net/stratboy/aapafrbu/1/

EDIT 1:

Я сейчас играю на клавиатуре> миксер> behringer UCA222> mac (usb). Мой текущий код, чтобы увидеть некоторые данные, следующий. Я вижу изменение данных для канала, но не для канала, и, несмотря на то, что я делаю на микшере. В чем причина?

window.AudioContext = window.AudioContext || window.webkitAudioContext; 

navigator.getUserMedia = (navigator.getUserMedia || 
          navigator.webkitGetUserMedia || 
          navigator.mozGetUserMedia || 
          navigator.msGetUserMedia); 


var audiocontext = new (window.AudioContext || window.webkitAudioContext)(); 
var analyser_left = audiocontext.createAnalyser(); 
var analyser_right = audiocontext.createAnalyser(); 
var splitter = audiocontext.createChannelSplitter(2); 
var index = 0; 

function init_stream(stream){ 
    window.audiosource = audiocontext.createMediaStreamSource(stream); 

    audiosource.connect(splitter); 
    splitter.connect(analyser_left,0); 
    splitter.connect(analyser_right,1); 

    listen(); 
} 

function listen(){ 
    requestAnimationFrame(listen); 

    analyser_left.fftSize = 256; 
    var leftBufferLength = analyser_left.frequencyBinCount; 
    var leftDataArray = new Uint8Array(leftBufferLength); 

    analyser_left.getByteTimeDomainData(leftDataArray); 
    $('.monitor_left').html(JSON.stringify(leftDataArray)); 


    analyser_right.fftSize = 256; 
    var rightBufferLength = analyser_right.frequencyBinCount; 
    var rightDataArray = new Uint8Array(rightBufferLength); 

    analyser_right.getByteTimeDomainData(rightDataArray); 
    $('.monitor_right').html(JSON.stringify(rightDataArray)); 

} 

if(navigator.getUserMedia){ 
    navigator.getUserMedia(
    { audio: true } 
    ,function(stream){ init_stream(stream); } 
    ,function(err){ console.log('The following gUM error occured: ' + err); } 
); 
} 

Я хотел бы сыграть свою гитару в компьютере и проанализировать звуки через API веб-аудио. Я знаю, что можно использовать микрофон, но как насчет реального инструмента?

+0

Вы должны были бы получить предусилитель, подключить гитару к предусилителю, а затем взять выход из предварительного усилителя и подключить его к входу для микрофона. – idbehold

ответ

0

Итак, исходный вопрос состоял в том, чтобы подключить дополнительные инструменты/источники в реальном времени (например, инструмент и микрофон) к веб-аудио api и проанализировать поток.

Ответ почти да: P Как писал Крис, на данный момент невозможно получить несколько инструментов, но можно разделить стереосигнал! Итак, что я делаю, идет через микшер с двумя источниками (скажем, с клавиатурой и микрофоном), поместите один на левый канал и один справа. Затем подключитесь к какой-либо аудиокарте USB (в настоящее время я использую дешевый пользователь UCA222).

Похоже, что Firefox по-прежнему не может разделить сигнал, но Chrome может это сделать, и этого достаточно для меня. Некоторый рабочий код это, и это вполне очевидно:

window.AudioContext = window.AudioContext || window.webkitAudioContext; 

navigator.getUserMedia = (navigator.getUserMedia || 
          navigator.webkitGetUserMedia || 
          navigator.mozGetUserMedia || 
          navigator.msGetUserMedia); 


var audiocontext = new (window.AudioContext || window.webkitAudioContext)(); 
var analyser_left = audiocontext.createAnalyser(); 
var analyser_right = audiocontext.createAnalyser(); 
var splitter = audiocontext.createChannelSplitter(2); 
var index = 0; 

function init_stream(stream){ 
    window.audiosource = audiocontext.createMediaStreamSource(stream); 

    audiosource.connect(splitter); 
    splitter.connect(analyser_left,0); 
    splitter.connect(analyser_right,1); 

    listen(); 
} 

function listen(){ 
    requestAnimationFrame(listen); 

    analyser_left.fftSize = 256; 
    var leftBufferLength = analyser_left.frequencyBinCount; 
    var leftDataArray = new Uint8Array(leftBufferLength); 

    analyser_left.getByteTimeDomainData(leftDataArray); 
    $('.monitor_left').html(JSON.stringify(leftDataArray)); 


    analyser_right.fftSize = 256; 
    var rightBufferLength = analyser_right.frequencyBinCount; 
    var rightDataArray = new Uint8Array(rightBufferLength); 

    analyser_right.getByteTimeDomainData(rightDataArray); 
    $('.monitor_right').html(JSON.stringify(rightDataArray)); 

} 


if(navigator.getUserMedia){ 
    navigator.getUserMedia(
    { audio: true } 
    ,function(stream){ init_stream(stream); } 
    ,function(err){ console.log('The following gUM error occured: ' + err); } 
); 
} 

Окончательной скрипка, чтобы проверить здесь: jsfiddle.net/stratboy/aapafrbu

Вы можете видеть биты меняются во время игры.

Как веб-программист, я не понимаю, что нет событий 'onAudioSomething', которые можно поймать, когда одна заметка воспроизводится на клавиатуре. Но, может быть, это вполне логично, так как я предполагаю, что такие события часто бывают бесполезными на музыкальном произведении, так как обычно нет «нулевых очков» в усилении звука. Таким образом, можно анализировать источник путем опроса через requestAnimationFrame().

Надеется, что это помогает какому-то другой исследователю там :)

2

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

+0

Вау! Я был почти уверен, что не могу ..И еще 2 вопроса: что из классов/интерфейсов js вы используете для получения звука из usb? Из MDN я понял, как получить микрофон, но мне пока не ясно, какой правильный код для получения usb-источников. И q # 2: можно ли отдельно проанализировать 2 одновременных источника (например, usb + mic)? Я бы хотел сделать живое шоу с различными визуальными эффектами для клавиш [keyboards: source 1] и других инструментов [guitar + bass + sax: source 2]. – Stratboy

+1

Вы можете выбрать устройство ввода через getMediaDevices - я использую его в демо-версии входных эффектов (https://webaudiodemos.appspot.com/input/index.html) - соответствующий код запускается с https://github.com/ cwilso/саудиовход-эффекты/BLOB/Master/JS/effects.js # L216-L220. (Search for gotSources, чтобы увидеть, что он делает.) – cwilso

+0

При анализе отдельных источников - Chrome, по крайней мере, в настоящее время поддерживает только моно и стерео источники; вы могли бы, конечно, подавать свою клавиатуру и другие инструменты через отдельные каналы стерео входа и делать это именно так. (Вам нужно использовать ChannelSplitterNode для разделения на два выхода и запускать каждый через отдельный AnalyserNode.) Многоканальные (более стерео) входы - это ошибка, над которой мы работаем. Multi _device_, с другой стороны - с помощью микрофона для наушников и устройства ввода аудио USB одновременно - намного сложнее, и я не ожидаю работать в ближайшем будущем. – cwilso