如何动态更改 .wav 或 .实时使用arduino的aiff文件
How can I dynamically change the speed of a .wav or. aiff file using an arduino in real time
我正在研究光剑的原型,它可以在移动时改变嗡嗡声的音调和音量。当前的解决方案仅改变音量(简单),听起来不够逼真。我知道我需要使用 .wav 或 .aiff(不像 mp3 那样有损)来完成此操作。理想情况下,我正在寻找一种轻量级解决方案,因为我计划 运行 在 Arduino Nano extra 上对其进行最终迭代。所以,问题是,如何改变 .wav 或 .aiff 的速度 read/output(从而改变声音的音调)?无论计算能力如何,有谁知道可以实时完成此任务的任何方法吗?
嗯...我不完全确定这将如何工作。我的理解是 .wav 和 .aiff 文件是原始音频(也许这就是为什么你说你需要使用它们)我确实找到了这个答案 Python change pitch of wav file 但它使用 python,这不适用于您的 Arduino,但您可以使用 C++ 应用此技术。也许其他对此了解更多的人可以看一下并解释如何在 C++ 中完成
要更改音频样本流的音调,您需要更改其采样率。做到这一点的“简单”方法是改变音频硬件采样时钟的频率,例如如果您想将播放音高提高 10%,您可以将 DAC 设置为每秒转换 52,800 个样本,而不是正常的每秒 48,000 个样本。
但是,在我使用过的大多数平台上,您无法对输出采样率设置进行那种级别的控制。通常它们只允许您从少数“标准”输出速率中进行选择,例如 44100、48000、96000 等。然而,也许 Arduino 允许对 DAC 的采样率进行细粒度控制;在这种情况下,您有一个简单的解决方案。
如果不是,另一种方法是更改您提供给音频设备的样本流的内容,使其表现得像在以不同的速率播放样本。这称为 sample rate conversion,准确地做到这一点非常重要。如果您不需要准确性(例如,因为您只是在做光剑音效并且向输出添加噪音不是问题),您可以通过在需要时简单地删除每个(第 n 个)样本来完成快速而肮脏的工作增加音高,或者在您想要降低音高时重复每个(第 n 个)样本。 n 的值将由您想要的“虚拟采样率”与音频输出的实际采样率之比决定;您需要做一些数学运算才能弄清楚,但这应该不会太难。
如果,OTOH,你想要一个质量不错的采样率转换,不会在输出中添加伪影和噪声,那么你会想要使用合适的采样率转换库,比如 libsamplerate to handle the necessary math for you. It does a very good job of avoiding added noise and artifacts, and you can specify varying levels of quality if you need to trade off quality to get reduced CPU usage. For a real-time effect, you'd probably want to use the callback interface 这样您就可以即时更改音高比。
请注意,以上两种方法中的任何一种不仅会改变播放的音调,还会改变播放的持续时间——例如如果您将音效的感知音调提高 10%,您最终也会得到比原始音效快 10% 完成播放的音效。如果你想改变声音的音调 而不 改变它的持续时间,那里有 algorithms 可以做到这一点,但我没有任何经验所以我无法评论它们对这个用例的适用性。
我正在研究光剑的原型,它可以在移动时改变嗡嗡声的音调和音量。当前的解决方案仅改变音量(简单),听起来不够逼真。我知道我需要使用 .wav 或 .aiff(不像 mp3 那样有损)来完成此操作。理想情况下,我正在寻找一种轻量级解决方案,因为我计划 运行 在 Arduino Nano extra 上对其进行最终迭代。所以,问题是,如何改变 .wav 或 .aiff 的速度 read/output(从而改变声音的音调)?无论计算能力如何,有谁知道可以实时完成此任务的任何方法吗?
嗯...我不完全确定这将如何工作。我的理解是 .wav 和 .aiff 文件是原始音频(也许这就是为什么你说你需要使用它们)我确实找到了这个答案 Python change pitch of wav file 但它使用 python,这不适用于您的 Arduino,但您可以使用 C++ 应用此技术。也许其他对此了解更多的人可以看一下并解释如何在 C++ 中完成
要更改音频样本流的音调,您需要更改其采样率。做到这一点的“简单”方法是改变音频硬件采样时钟的频率,例如如果您想将播放音高提高 10%,您可以将 DAC 设置为每秒转换 52,800 个样本,而不是正常的每秒 48,000 个样本。
但是,在我使用过的大多数平台上,您无法对输出采样率设置进行那种级别的控制。通常它们只允许您从少数“标准”输出速率中进行选择,例如 44100、48000、96000 等。然而,也许 Arduino 允许对 DAC 的采样率进行细粒度控制;在这种情况下,您有一个简单的解决方案。
如果不是,另一种方法是更改您提供给音频设备的样本流的内容,使其表现得像在以不同的速率播放样本。这称为 sample rate conversion,准确地做到这一点非常重要。如果您不需要准确性(例如,因为您只是在做光剑音效并且向输出添加噪音不是问题),您可以通过在需要时简单地删除每个(第 n 个)样本来完成快速而肮脏的工作增加音高,或者在您想要降低音高时重复每个(第 n 个)样本。 n 的值将由您想要的“虚拟采样率”与音频输出的实际采样率之比决定;您需要做一些数学运算才能弄清楚,但这应该不会太难。
如果,OTOH,你想要一个质量不错的采样率转换,不会在输出中添加伪影和噪声,那么你会想要使用合适的采样率转换库,比如 libsamplerate to handle the necessary math for you. It does a very good job of avoiding added noise and artifacts, and you can specify varying levels of quality if you need to trade off quality to get reduced CPU usage. For a real-time effect, you'd probably want to use the callback interface 这样您就可以即时更改音高比。
请注意,以上两种方法中的任何一种不仅会改变播放的音调,还会改变播放的持续时间——例如如果您将音效的感知音调提高 10%,您最终也会得到比原始音效快 10% 完成播放的音效。如果你想改变声音的音调 而不 改变它的持续时间,那里有 algorithms 可以做到这一点,但我没有任何经验所以我无法评论它们对这个用例的适用性。