【问题标题】:How to detect notes from a .mp3 music file and then display a midi time graph如何从 .mp3 音乐文件中检测音符,然后显示 midi 时间图
【发布时间】:2020-01-06 09:34:05
【问题描述】:

我是一名开发人员,但我对音频和音乐知之甚少。 我正在尝试检测歌曲文件中的音符,我正在使用 p5.sound.js 和 this 脚本。

我创建了两个数组 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,....]

问题是持续时间很短,也没有给出准确的结果。

我正在尝试使用如下图制作工具,然后我将使用麦克风记录用户语音并将其与原始歌曲中的音符相匹配,并在最后显示乐谱。

图表截图

如果有更好的方法请给我建议。

【问题讨论】:

    标签: javascript audio fft p5.js pitch-detection


    【解决方案1】:

    懂一点乐理,懂一点音频。把这个和一粒盐一起吃。

    您的要求可能很难做到。通常,您可以在轨道中混合多种乐器。将每一个从混合轨道中分离出来被称为cocktail party problem,它没有一个简单的解决方案 - 事实上,解决它是一个活跃的研究领域。

    即使您将问题简化为只有一种乐器,该乐器也可以同时演奏多个音符。想想吉他上的和弦或典型的鼓声。

    最后,如果你让一个乐器一次只演奏一个音符,你可能会毫不费力地找到一些可追踪的东西。

    FFT 将在这里为您提供帮助。但是你需要在很短的时间内运行它——一个很小的时间窗口。在该窗口中,您可以查看它输出的频谱,以尝试找出乐器或歌手演奏的某些主要频率。但是会很吵。您可以查看每个短窗口中的主导频率并构建主导频率随时间变化的地图。这可能开始类似于您发布的 midi 图表。但它仍然需要大量的按摩才能最终形成“音符结构”。还有一个问题是特定音符不能仅由频率正确表示。可能有您需要考虑的次要频率或相位信息。

    不过还需要进一步研究。具有良好效果的音频处理不是那么简单的事情。同样适用于图像处理、ML 等。

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2016-06-05
      相关资源
      最近更新 更多