我是一名开发人员,但我对音频和音乐知之甚少。我正在尝试检测歌曲文件中的音符,我正在使用 p5.sound.js 和这个脚本。
我创建了两个数组 1) Midi 值,2) 该 midi 值的开始时间。然后我为那个 midi 值的持续时间创建第三个数组。
我的绘图功能如下所示。
function draw() {
background(200);
// array of values from -1 to 1
var timeDomain = fft.waveform(1024, 'float32');
var corrBuff = autoCorrelate(timeDomain);
beginShape();
for (var i = 0; i < corrBuff.length; i++) {
var w = map(i, 0, corrBuff.length, 0, width);
var h = map(corrBuff[i], -1, 1, height, 0);
curveVertex(w, h);
}
endShape();
fill(0);
text ('Center Clip: ' + centerClipThreshold, 20, 20);
line (0, height/2, width, height/2);
var freq = findFrequency(corrBuff);
t1_arr.push(source.currentTime());
midi_arr.push(freqToMidi(freq));
text ('Fundamental Frequency: ' + freq.toFixed(2), 20, 50);
}
这段代码给了我这样的数据
"midi": [
"66",
"74",
"68",
"62",
"69",
"75",
"72",
"66",
"73",
"72",....]
"start_time": [
"2.1066458333333333",
"2.1119791666666665",
"2.1386458333333334",
"2.1546458333333334",
"2.1653125",
"2.1866458333333334",
"2.2079791666666666",
"2.2559791666666666",
"2.2826458333333335",
"2.3093125",....]
"duration": [
5.3333333333332,
26.666666666667,
16,
10.666666666667,
21.333333333333,
21.333333333333,
48,
26.666666666667,
26.666666666666,
32,....]
问题是持续时间很短,也没有给出准确的结果。
形成这些数据,我正在尝试使用如下图制作工具,然后我将使用麦克风记录用户语音并将其与原始歌曲中的音符相匹配,并在最后显示分数。
图表截图
如果有更好的方法请建议我。