13

我想要实现的是从我的 python 应用程序中弹奏吉他和弦。如果需要,我知道(或可以计算)和弦中的频率。

我在想,即使我在正确的频率下产生多个正弦波的低级腿工作,由于包络也需要正确,它听起来也不会正确,否则它听起来不会像吉他,但更像是嗡嗡声。

有趣的是,linux sox 命令 play 可以产生一个非常令人信服的个人注释:

play -n synth 0 pluck E3

所以我真正要问的是,

a) 是否有可能将 play 命令硬塞到一个完整的和弦上(理想情况下,开始时间略有不同以模拟拨片弦的敲击)——我无法做到这一点,但也许会有一些 bash 仙尘会分叉一个过程之类的,听起来不错。如果这是可能的,我会满足于从我的代码中调用一个 bash 命令(我不喜欢重新发明轮子)。

b)(甚至更好)python中有没有办法实现这个(吉他和弦声音)?我见过一些可访问的 python midi 库,但坦率地说,midi 并不适合我想要的声音,据我所知。

4

3 回答 3

13

手册给出了这个例子:

play -n synth pl G2 pl B2 pl D3 pl G3 pl D4 pl G4 \
               delay 0 .05 .1 .15 .2 .25 remix - fade 0 4 .1 norm -1

这会创建 6 个同步的合成器实例(作为单独的音频通道),将 5 个通道延迟略微增加时间,然后将它们混合为单个通道。

结果是一个非常令人信服的吉他和弦;您当然可以非常轻松地更改音符或延迟。您还可以演奏“吉他”的延音和音调,或添加过载效果 - 请参阅手册了解详细信息。

于 2012-06-14T12:43:12.537 回答
6

a) 骇人听闻的方法是生成一个后台子进程来运行每个play命令。由于后台子进程不会让 shell 等待它完成,因此您可以同时play运行多个 s。像这样的东西会起作用:

for p in "C3" "E3" "G3"; do ( play -n synth 3 pluck $p & ); done

我看到 ninjagecko 发布的内容与我写这篇文章的内容基本相同。

b) 实现 MIDI 数据的关键在于它更像是产生声音的高级配方,而不是声音本身。换句话说,每个 MIDI 音符都表示为音高、动态电平、开始和停止时间以及各种其他元数据。实际的声音是由合成器产生的,不同的合成器以不同的质量水平完成这项工作。如果您不喜欢从 MIDI 文件中获得的声音,这不是 MIDI 的问题,而是您的合成器的问题,所以您只需要找到一个更好的。(实际上,这通常需要 $$$;大多数免费或便宜的合成器都非常糟糕。)

另一种方法是实际挖掘引擎盖,可以这么说,并实施一种算法来创建您自己的吉他声音。为此,您需要研究数字信号处理,特别是Karplus-Strong 算法(创建合成弹拨弦声音的众多方法之一)。这是一个引人入胜的主题,但如果您只接触声音合成play并创建 MIDI 文件,那么您将需要学习一些东西。此外,Python 可能不是语言的最佳选择,因为执行速度非常关键。

如果您对 DSP 感兴趣,您可能想下载并使用ChuckK

于 2011-07-13T23:11:34.560 回答
4

a) 是否有可能将播放命令硬塞到一个完整的和弦上......?

如果您的声音架构支持它,您可以运行多个同时输出音频的命令。如果您使用 ALSA,则需要 .dmix 或其他变体~/.asoundrc。用于subprocess.Popen产生许多子进程。如果这假设是一个 bash 脚本,你可以这样做:

command1 &
command2 &
...

b)(甚至更好)python中有没有办法实现这一点(吉他和弦声音)?

通过 FluidSynth 等软件合成器编译为 MIDI 并输出。

于 2011-07-13T22:50:45.960 回答