我正在尝试制作一个简单的“虚拟划痕”,但我不知道背后的理论。由于我在google上发现没什么用,我在这里问:
示例代码/教程将非常感谢: - )
答案 0 :(得分:5)
当我划伤(向前移动轨道)时会发生什么?我提高了 样本的间距和/或速率?
考虑实际发生的事情:记录包含音频数据。记录针从记录中读取音频数据。随着记录旋转,播放位置改变。 (这与观看播放头在数字音频编辑器中移动音频文件非常相似。)
当您以更快的速度旋转记录时,您正在提高播放速率。音频更快更高音调。将播放速率提高2,音频将高出八度。
当您以较慢的速度旋转记录时,您正在降低播放速率。音频较慢且音调较低。将播放速率降低2,音频将降低八度。
记录只能通过加快或减慢物理记录来修改音频播放,这会影响音高和播放速率。某些音频软件可以独立改变音高和速率。记录球员不能。
(获取一个唱机和实验,听听它听起来像。)
如何使用音频处理算法模拟这种现象?
要模仿DJ刮擦记录,您需要能够在用户“刮擦”时调整音频的播放速率。
当用户加速记录时,加快播放速度。当用户减慢记录时,请降低播放速度。
当用户停止录制时,完全停止播放。
当用户反向旋转记录时,反转播放。
您无需更改音频的音高。更改播放速率将自动执行此操作。对音高的任何进一步调整都听起来不正确。
我对图书馆没有任何建议,但如果你花时间,这样的事情并不难实现。
答案 1 :(得分:1)
当你划伤时,你只是在针下来回移动记录。所以它相当于在音频文件的同一部分上反复循环前进和后退。我猜想速度介于正弦波和三角波之间。您需要对样本进行线性插值。
对于移动应用,我首先将屏幕的一个轴映射到音频文件中的时间范围。保留包含最后MotionEvent
的缓冲区。当下一个MotionEvent
到达时,根据(X,Y)
坐标计算映射的开始和结束位置。然后,计算两个MotionEvents
之间的经过时间。这为您提供了足够的信息,可以在正确的位置和速度下播放文件,并随着每个动作事件不断更新。
您可能需要对数据进行某种平滑处理,但这是一个起点。
答案 2 :(得分:1)
可变速率重采样器可能是合适的。这将加快播放速度并以相同的比例增加音高。
您可以跟踪“划痕”运动的角速度与正常的盘片旋转速度之间的比率,并将其用作局部重采样率。
比线性插值有更好的(更高音质)DSP方法进行速率重采样,例如使用可变宽度Sinc插值内核。