我正在尝试使用Web Audio API,我的目标是创建一个数字吉他,其中每个弦都有一个实际吉他的初始声源,打开弦,然后我想动态生成所有其他音品位置声音.经过对该主题的一些研究(这对我来说都是新手),听起来这可能是通过改变源声音样本的频率来实现的.
问题是我已经看到很多用于改变合成sin波的算法,但没有改变音频样本的频率.以下是我的代码示例,以便更好地了解我是如何实现此目的的:
// Guitar chord buffer
var chordBuffer = null;
// Create audio context
var context = new webkitAudioContext();
// Load sound sample
var request = new XMLHttpRequest();
request.open('GET', 'chord.mp3', true);
request.responseType = 'arraybuffer';
request.onload = loadChord;
request.send();
// Handle guitar string "pluck"
$('.string').mouseenter(function(e){
e.preventDefault();
var source = context.createBufferSource();
source.buffer = chordBuffer;
// Create javaScriptNode so we can get at raw audio buffer
var jsnode = context.createJavaScriptNode(1024, 1, 1);
jsnode.onaudioprocess = changeFrequency;
// Connect nodes and play
source.connect(jsnode); …Run Code Online (Sandbox Code Playgroud) 是否可以使用Web Audio API服务器端(例如在Node.js中)?我想处理"离线"我的音频文件以应用音频效果(/sf/answers/567096841/).
Safari或Firefox都无法MediaElementSource使用Web Audio API 处理音频数据.
var audioContext, audioProcess, audioSource,
result = document.createElement('h3'),
output = document.createElement('span'),
mp3 = '//www.jonathancoulton.com/wp-content/uploads/encodes/Smoking_Monkey/mp3/09_First_of_May_mp3_3a69021.mp3',
ogg = '//upload.wikimedia.org/wikipedia/en/4/45/ACDC_-_Back_In_Black-sample.ogg',
gotData = false, data, audio = new Audio();
function connect() {
audioContext = window.AudioContext ? new AudioContext() : new webkitAudioContext(),
audioSource = audioContext.createMediaElementSource( audio ),
audioScript = audioContext.createScriptProcessor( 2048 );
audioSource.connect( audioScript );
audioSource.connect( audioContext.destination );
audioScript.connect( audioContext.destination );
audioScript.addEventListener('audioprocess', function(e){
if ((data = e.inputBuffer.getChannelData(0)[0]*3)) {
output.innerHTML = Math.abs(data).toFixed(3);
if (!gotData) gotData = true;
}
}, false);
} …Run Code Online (Sandbox Code Playgroud)尝试学习Audio API,但我得到BufferLoader类的Uncaught引用错误.我正在使用Chrome,它是最新的.本班不应该没有问题吗?
<html>
<head>
<script type=text/javascript>
window.onload = init;
var context;
var bufferLoader;
function init(){
context = new webkitAudioContext();
bufferLoader = new BufferLoader(
context,
[
' https://dl.dropboxusercontent.com/u/1957768/kdFFO3.wav',
' https://dl.dropboxusercontent.com/u/1957768/geniuse%20meodies.wav',
],
finishedLoading
);
bufferLoader.load();
}
function finishedLoading(bufferList){
//make two sources and play them
var source1 = context.createBufferSource();
var source2 = context.createBufferSource();
source1.buffer = bufferList[0];
source2.buffer = bufferList[1];
source1.connect(context.destination);
source2.connect(context.destination);
source1.start(0);
source2.start(0);
}
</script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Web Audio API来控制多声道设置中交互式音乐的播放.到目前为止,我已经设法在我的12声道声卡上将多达8个振荡器的声音引导到8个不同的声道,但是一旦我尝试使用超过8个声道,突然所有声道都被静音.经过大量研究后,我还注意到audioContext.currentTime卡在接近零的值上.
这是我的结果来自MAC OSX 10.8.5谷歌Chrome版本39.0.2171.27 beta(64位)和版本40.0.2192.0 canary(64位).
Safari不允许我处理超过2个频道FireFox找到我的12个频道,audioContext.destination.maxChannelCount但不管我是否尝试将振荡器连接到更高的数字,我都会继续将声音传送到第1和第2频道gain.connect(channelMerger, 0, i).
有没有人遇到类似的东西?有变通方法吗?
这是代码:
var AudioContext = window.AudioContext || window.webkitAudioContext;
var audioContext = new AudioContext();
var maxChannelCount = audioContext.destination.maxChannelCount;
// if set to max 8 it works fine in Chrome, but this line
// breaks the audio if the sound card has got more than 8 channels
audioContext.destination.channelCount = maxChannelCount;
audioContext.destination.channelCountMode = "explicit";
audioContext.destination.channelInterpretation = "discrete";
var channelMerger = audioContext.createChannelMerger(maxChannelCount);
channelMerger.channelCount = 1;
channelMerger.channelCountMode = …Run Code Online (Sandbox Code Playgroud) 我正在使用WebAudio构建Roland Juno-106合成器的仿真.实时WIP版本在这里.
如果截止频率或包络调制量在攻击或释放期间发生变化,同时滤波器同时被包络调制,我就会挂断如何更新滤波器.该代码位于此处.当前的实现并没有像模拟合成器那样响应,但我无法弄清楚如何计算它.
在真正的合成器上,滤波器立即由包络中的频率截止,包络调制量和当前级确定,但是上升或下降也可以平滑地继续.
我该如何模拟这种行为?
我正在使用getUserMedia API在浏览器中录制音频,然后将此音频发送到websocket服务器.此外,为了测试录音,我在Mac上使用soundflower作为输入设备,因此我可以播放波形文件,而不是说话麦克风.
客户端(JavaScript)
window.AudioContext = window.AudioContext || window.webkitAudioContext;
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
var audioContext = new AudioContext();
var wsClient = new WebSocket("ws://" + WEBSOCKET_URL + ":" + WEBSOCKET_PORT);
navigator.getUserMedia({audio: true}, function (stream) {
var input = audioContext.createMediaStreamSource(stream);
var recordNode = audioContext.createScriptProcessor(4096);
recordNode.onaudioprocess = recorderProcess;
input.connect(recordNode);
recordNode.connect(audioContext.destination);
}, function (e) {
console.error("No live audio input: " + e);
});
function recorderProcess(e) {
var buffer = e.inputBuffer.getChannelData(0);
wsClient.send(buffer);
}
Run Code Online (Sandbox Code Playgroud)
服务器端(python)
在服务器端,我只是在文件中写入块:
def onMessage(self, msg, …Run Code Online (Sandbox Code Playgroud) 通过访问用户的麦克风navigator.getUserMedia非常容易.但是,如果我使用移动浏览器并希望从远处获取音频,例如使用"扬声器"模式,该怎么办?
我将如何实现这一目标?似乎有本机应用程序可以实现这一点,但Web Audio呢?
这样做的目的是使用DTMF在设备之间发送消息.我已经通过我的笔记本电脑实现了这一点,因为它的麦克风可以远距离记录周围的音频,但我可以访问的任何手机似乎只能在"喉舌"附近录制音频,因此我必须将手机保持在非常靠近即使收到消息的可能性很小,也要使用扬声器.除非我能让移动麦克风从远处拾取音频,否则这会失败.
编辑:距离,我的意思是大于几英尺,而不是仅仅几厘米.环境声音,而不是麦克风旁边的声音.
我想通过将一首歌作为另一首歌的背景混合成单个源来混合两个音频源.
例如,我有输入:
<input id="files" type="file" name="files[]" multiple onchange="handleFilesSelect(event)"/>
Run Code Online (Sandbox Code Playgroud)
和脚本解码这个文件:
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new window.AudioContext();
var sources = [];
var files = [];
var mixed = {};
function handleFilesSelect(event){
if(event.target.files.length <= 1)
return false;
files = event.target.files;
readFiles(mixAudioSources);
}
function readFiles(index, callback){
var freader = new FileReader();
var i = index ? index : 0;
freader.onload = function (e) {
context.decodeAudioData(e.target.result, function (buf) {
sources[i] = context.createBufferSource();
sources[i].connect(context.destination);
sources[i].buffer = buf;
if(files.length > i+1){
readFiles(i + …Run Code Online (Sandbox Code Playgroud) web-audio-api ×10
javascript ×7
audio ×6
html5 ×5
getusermedia ×2
html5-audio ×2
chromium ×1
firefox ×1
macos ×1
mobile ×1
node.js ×1
safari ×1
synthesizer ×1
webkit ×1