民间,
我正在努力解决与PCM数据播放持续时间相关的简单概念。非常感谢您的反馈。
我正在开发的应用程序播放音乐表中的吉他音符。
我已经实施了Jaffe-Smith算法用于吉他拔除。
https://ccrma.stanford.edu/~jos/Mohonk05/Extended_Karplus_Strong_EKS_Algorithm.html
假设我计算音符A(440 Hz)的样本一秒钟。
在11025的采样率下,我将存储11025个样本,这些样本可以作为PCM音频发送到计算机扬声器。
对于吉他上的所有独特音符,计算所有音符的样本需要相当长的时间。我想我会预先计算并将它们保存为二进制数据,并在应用程序运行时简单地加载它们。
到目前为止一切顺利。
现在,让我们说我想播放一首歌(各种音符列表)。假设这首歌需要以每分钟100次的速度播放。假设我必须为一个节拍或0.6秒(60/100)播放音符A.
重新计算样本0.6秒可能需要相当长的时间。
我可以简单地播放(11025 * 0.6)样本吗?这会产生任何副作用吗?
有没有更好的方法来实现我想要做的事情?
提前感谢您的帮助。
此致 彼得
答案 0 :(得分:1)
你基本上要做的是创造一把合成吉他,是吗?我可能会建议您选择采样器路线。
通过示例,我的意思是一小段音频(不是ADC或DAC意义上的单个样本)。
基本上,您可以将所需内容分为4个部分:
这四个部分按顺序工作,通常称为ADSR envelope。音符的攻击是初始声音。对于一把吉他,你会听到一个弹拨和一个音高的开始。当它逐渐消失时,衰变将成为字符串的样本。维持是一次又一次重复的样本,直到您释放密钥。发布样本是释放密钥时播放的内容。对于吉他,您可能会听到轻轻地将手指放回琴弦上以避免振动的样本。
现在,您可以实时生成所有这些示例,但可能会占用大量CPU资源。
关于你的问题:“我可以简单地播放(11025 * 0.6)样本吗?”是的,采样率为11025,音频为0.6秒。另外请记住,您应该向声卡发送连续的数据流,用0填充任何空白点(对于签名的PCM)。