我如何将立体声音频文件(我目前正在使用WAV,但我也对MP3感兴趣,如果不同的话)分成左右两个声道,分别输入两个P5.sound.js库中的快速傅立叶变换(FFT)。
我已经在代码中写出了我认为我需要做的事情,但是我没有找到任何人通过Google搜索进行此操作的示例,而我所有的外行尝试都没有结果。
我将在下面分享我的内容,但老实说,这并不多。有问题的所有内容都会在设置函数中记录下来:
//variable for the p5 sound object
var sound = null;
var playing = false;
function preload(){
sound = loadSound('assets/leftRight.wav');
}
function setup(){
createCanvas(windowWidth, windowHeight);
background(0);
// I need to do something here to split the audio and return a AudioNode for just
// the left stereo channel. I have a feeling it's something like
// feeding audio.getBlob() to a FileReader() and some manipulation and then converting
// the result of FileReader() to a web audio API source node and feeding that into
// fft.setInput() like justTheLeftChannel is below, but I'm not understanding how to work
// with javascript audio methods and createChannelSplitter() and the attempts I've made
// have just turned up nothing.
fft = new p5.FFT();
fft.setInput(justTheLeftChannel);
}
function draw(){
sound.pan(-1)
background(0);
push();
noFill();
stroke(255, 0, 0);
strokeWeight(2);
beginShape();
//calculate the waveform from the fft.
var wave = fft.waveform();
for (var i = 0; i < wave.length; i++){
//for each element of the waveform map it to screen
//coordinates and make a new vertex at the point.
var x = map(i, 0, wave.length, 0, width);
var y = map(wave[i], -1, 1, 0, height);
vertex(x, y);
}
endShape();
pop();
}
function mouseClicked(){
if (!playing){
sound.loop();
playing = true;
} else {
sound.stop();
playing = false;
}
}
答案 0 :(得分:2)
我不是p5.js
专家,但是我已经与之合作了足够多的东西,以至于我认为必须有一种方法来解决blob /文件读取的整个问题。这些文档对于复杂的处理不是很有帮助,因此我在p5.Sound
源代码中做了一些研究,这就是我想出的:
// left channel
sound.setBuffer([sound.buffer.getChannelData(0)]);
// right channel
sound.setBuffer([sound.buffer.getChannelData(1)]);
Here's a working example-单击画布可在L / stereo / R音频播放和FFT视觉效果之间切换。
p5.SoundFile
具有setBuffer
方法,该方法可用于就地修改声音文件对象的音频内容。函数签名指定它接受一个缓冲区对象数组,如果该数组仅包含一项,它将产生一个单声道源-该源已经采用正确的格式来馈入FFT了!那么我们如何产生仅包含一个通道数据的缓冲区?
在整个源代码中,有通过sound.buffer.getChannelData()
进行单个通道操纵的示例。起初我很担心访问未记录的属性,但事实证明,由于p5.Sound
在幕后使用了WebAudio API,因此该buffer
实际上只是普通的旧WebAudio AudioBuffer,而getChannelData
方法是well-documented。
上述方法的唯一缺点是setBuffer
直接作用于SoundFile
,因此我为要分离的每个通道再次加载文件,但是我确定有一种解决方法那个。
快乐分手!