使用aubio库获取乐谱

时间:2013-06-24 18:19:43

标签: fft aubio

嗯,这是我关于stackoverflow的第一个问题,所以有点兴奋:) 这是:我的输入是一个波形文件。现在,我用吉他录制了一首曲子。所以wave文件包含这个乐器录音。我想要做的是,获得正在播放的每个音符的乐谱(A,B,C等)。我听说过像FFT这样的技术,但考虑到我对如何使用FFT的了解不多,我想到了使用aubio库。

所以aubio提供: aubiopitch提取候选人和 aubiocut提取开始。

我被困的地方是:我如何获得使用aubio播放的音符的特定时间的频率? 据我说,aubiopitch和aubiocut会有所帮助,但我不明白如何在它们之间进行映射。任何帮助将不胜感激:)


嗨piem:谢谢你的回答。你能分析一下这个输出吗?

aubiopitch -i Reverse_Open.wav

  

1.408 68.9486465454

     

1.536 81.7372512817

     

1.664 164.290893555

     

1.792 164.464691162

     

1.92 82.6862487793

     

2.048 328.539306641

     

2.176 218.885116577

     

2.304 219.06237793

     

2.432 219.042160034

     

2.56 219.133621216

     

2.688 145.751785278

     

2.816 146.437744141

     

2.944 146.199829102

     

3.072 195.059829712

     

3.2 194.912689209

     

3.328 195.724975586

     

3.456 195.517547607

     

3.584 247.317428589

     

3.712 246.764221191

     

3.84 246.857452393

     

3.968 145.454727173

     

4.096 328.569610596

     

4.224 329.625823975

     

4.352 329.16619873

     

4.48 328.906402588

     

4.608 328.96786499

     

4.736 329.187835693

     

4.864 145.741394043

我对频率的说明是:E(82 approx),A(110),D(147),G(197),B(247),E(329.2)1.344,1.888,2.4,2.88,3.36,3.872 resp播放(根据aubiopitch,我认为是正确的)。 不知道如何从上面的输出中提取这6个音符及其时间?

1 个答案:

答案 0 :(得分:4)

aubiopitch输出元组列表。每个元组包含两个浮点数:

  • 以秒为单位的时间戳
  • 赫兹的基本频率

以下是关于吉他声音的示例:

$ aubiopitch -i guitar_Cold_Blood_-_Baby_I_Love_You.wav | head
0.000000 0.000000
0.005805 293.884338
0.011610 386.387207
0.017415 0.000000
0.023220 551.689758
0.029025 3608.569336
0.034830 3588.231201
0.040635 416.824066
0.046440 3606.715576
0.052245 417.116425

如果你很好奇(请),你可以获得最新的git版本并尝试演示脚本demo_pitch.py

$ ./python/demos/demo_pitch.py bass_Don_Ellis_-_Conquistador.wav

你会得到以下情节:

aubio pitch demo plot

  • 第一行代表波形。
  • 第二行,提取的音调轨道,以midi频率。
  • 第三,这些候选人的信心(使用yinfft算法)。

在这个低音线样本中,在瞬态攻击期间提取音高比在稳定状态下更具挑战性。在任意阈值(此处为0.8)以下找到的间距可以丢弃(绿色虚线),而其他可以保留(蓝色实线)。