【问题标题】:Changing duration of Guitar pluck in PCM data改变 PCM 数据中吉他弹拨的持续时间
【发布时间】:2011-12-02 11:57:43
【问题描述】:

伙计们,

我正在努力解决与 PCM 数据播放持续时间相关的简单概念。非常感谢您的反馈。

我正在开发的应用程序从乐谱中播放吉他音符。

我已经实现了用于吉他弹拨的 Jaffe-Smith 算法。

https://ccrma.stanford.edu/~jos/Mohonk05/Extended_Karplus_Strong_EKS_Algorithm.html.

假设我计算音符 A (440 Hz) 一秒钟的样本。

以 11025 的采样率,我将存储 11025 个可以作为 PCM 音频发送到计算机扬声器的样本。

对于吉他上的所有独特音符,计算所有音符的样本需要相当长的时间。我想我会预先计算并将它们保存为二进制数据,并在应用程序运行时简单地加载它们。

到目前为止一切顺利。

现在,假设我想播放一首歌曲(各种音符的列表)。假设这首歌需要以每分钟 100 拍的速度播放。假设我必须演奏音符 A 一拍或 0.6 秒 (60/100)。

重新计算 0.6 秒的样本可能需要相当长的时间。

我可以简单地播放 (11025 * 0.6) 个样本吗?这会产生任何副作用吗?

有没有更好的方法来实现我想要做的事情?

提前感谢您的帮助。

问候, 彼得

【问题讨论】:

    标签: audio core-audio audio-streaming


    【解决方案1】:

    您基本上想做的是制作合成吉他,是吗?我可能会建议您改用采样器路线。

    我所说的样本是指一小段音频(不是 ADC 或 DAC 意义上的单个样本)。

    基本上,您可以将需要的内容分成 4 个部分:

    • 攻击
    • 衰减
    • 维持
    • 发布

    这四个部分按此顺序工作,通常称为ADSR envelope。音符的起音是最初的声音。对于吉他,您将听到拨弦声和音高的开始。当它开始消失时,衰减将成为字符串的样本。延音是一遍又一遍地重复的样本,直到您松开琴键。释放样本是释放键时播放的内容。对于吉他,您可能会听到将手指轻轻放回琴弦以停止振动的示例。

    现在,您可以实时生成所有这些样本,但可能会占用大量 CPU。

    关于您的问题:“我可以简单地播放 (11025 * 0.6) 个样本吗?”是的,在 11025 的采样率下,这将是 0.6 秒的音频。另外请记住,您应该向声卡发送连续的数据流,用 0 填充任何空白点(对于签名的 PCM)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多