5

我正在尝试制作一个简单的“虚拟刮刀”,但我不知道它背后的理论。由于我在谷歌上没有发现任何有用的东西,所以我在这里问它:

  • 当我划伤(向前移动曲目)时会发生什么?我是否提高了样本的音高和/或速率?
  • 如何使用音频处理算法模拟这种现象?

示例代码/教程将不胜感激:-)

4

3 回答 3

5

当我划伤(向前移动曲目)时会发生什么?我是否提高了样本的音高和/或速率?

想想实际发生了什么:一条记录​​包含音频数据。记录针从记录中读取音频数据。随着唱片旋转,播放位置发生变化。(这与在数字音频编辑器中观看播放头在音频文件中移动非常相似。)

当您在物理上更快地旋转记录时,您正在提高播放速率。音频更快,音高更高。将播放速率提高 2,音频将播放高八度。

当您以较慢的速度物理旋转记录时,您正在降低播放速率。音频既慢又低。将播放速率降低 2,音频将播放低八度。

记录只能通过加快或减慢物理记录来修改音频播放,这会同时影响音高和播放速率。一些音频软件可以独立改变音高和速率。电唱机不行。

(找个唱机,试听听它的声音。)

如何使用音频处理算法模拟这种现象?

要模拟 DJ 刮唱片,您需要能够在用户“刮”时调整音频的播放速率。

当用户加快录制速度时,加快播放速度。当用户放慢记录时,放慢播放速度。

当用户停止录制时,完全停止播放。

当用户反向旋转记录时,反向播放。

您无需更改音频的音高。更改播放速率将自动执行此操作。对音高的任何进一步调整听起来都是不正确的。

我对图书馆没有任何建议,但如果你花时间的话,这样的事情实施起来并不难。

于 2012-05-09T08:38:29.540 回答
1

当你刮擦时,你只是在针下来回移动唱片。所以这相当于在音频文件的同一部分反复向前和向后循环。我猜想速度介于正弦波和三角波之间。您需要对样本进行线性插值。

对于移动应用程序,我首先将屏幕的一个轴映射到音频文件中的时间范围。保留一个包含最后一个MotionEvent. 当下一个MotionEvent到达时,根据(X,Y)坐标计算映射的开始和结束位置。然后,计算两者之间经过的时间MotionEvents。这为您提供了足够的信息,可以以正确的位置和速度从文件中播放,并随着每个运动事件不断更新。

您可能需要对数据进行某种平滑处理,但这是一个起点。

于 2012-05-07T17:43:53.297 回答
1

A variable rate resampler might be appropriate. This will speed up the play rate and increase the pitch by the same ratio.

You would track ratio between the angular velocity of the "scratch" movement and the normal rate of platter rotation, and use that as the local resampling ratio.

There are a lot better (higher audio quality) DSP methods of doing rate resampling than linear interpolation, such as using a variable width Sinc interpolation kernel.

于 2012-05-07T18:59:37.387 回答