在 WAV 文件中查找音符

Wes*_*man 5 python numpy scipy

我正在寻找如何将 WAV 文件中的数据分成其组成音符的方法。我使用以下命令加载 WAV 文件:

import scipy.io.wavfile as wavfile
rate, data = wavfile.read('scale.wav')
time = np.arange(len(data[:,0]))*1.0/rate
Run Code Online (Sandbox Code Playgroud)

并绘制

plt.plot(time, data[:,0])
plt.show()
Run Code Online (Sandbox Code Playgroud)

这给了我这张图片,这是有八个音符的钢琴音阶。我想要一种方法来隔离每个音符,以便我可以找到它的频率并找出正在演奏的音符。一旦我把笔记隔离出来,我就可以处理剩下的事情了。

我尝试过找到最大值,但是有太多并且需要多次迭代才能将其降低到我想要的最大值,并且这是一种不可靠的方法,因为进行太多迭代会消除一些较低幅度的峰值。及时获得笔记的长度也很好。

编辑:所以就像你们先生们所说的那样,这非常复杂。我现在想,我只想找到“极端”峰值,然后找到这些峰值之后的极端最小值,并将其用作我的注释,因为我们不需要太大的数据片段来找出这是频率。我遇到的问题是,有很多峰值,很难只找到我想要的峰值。有任何想法吗?

Wes*_*man 2

为了对此进行更新,这是我们最终使用的代码。它使用在列上平均的频谱图来找出音符的位置,然后使用谐波来找出该音符的主要频率。然后使用 abjab 在乐谱上绘制音符。并不完美,但在单簧管大调音阶上效果很好。

我们大胆地消除了输入音频中的噪音,有时还放大了声音。

这是代码。感谢你的帮助。