我想要实现的是从我的python应用程序中弹奏吉他和弦。如果需要,我知道(或可以计算)和弦中的频率。
我在想,即使我做了以正确的频率产生多个正弦波的低水平腿部工作,它也听起来不正确,因为信封也需要正确,否则听起来不像吉他但更多哼哼
目前,linux sox命令可以产生一个非常有说服力的个人注释:
play -n synth 0 pluck E3
所以我真的要问的是,
a)是否有可能将play命令用来做一个完整的和弦(理想情况下,开始时间略有不同以模拟拨弦乐器的行程) - 我无法做到这一点但是也许还有一些bash fairydust我会分叉一个过程,这样听起来是正确的。如果这是可能的,我会满足于从我的代码中调出一个bash命令(我不喜欢重新发明轮子)。
b)(甚至更好)有没有一种方法在python实现这个(吉他和弦声)?我已经看过一些可访问的python midi图书馆,但坦率地说midi并不适合我想要的声音,据我所知。
答案 0 :(得分: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个通道,然后将它们混合到单个通道。
结果是一个非常有说服力的吉他和弦;你当然可以很容易地改变音符或延迟。您还可以使用“吉他”的延音和音调,或添加过载效果 - 有关详细信息,请参阅手册。
答案 1 :(得分:6)
a)hackish方法是生成一个后台子进程来运行每个play
命令。由于后台子进程不会使shell等待它完成,因此您可以同时运行多个play
。像这样的东西会起作用:
for p in "C3" "E3" "G3"; do ( play -n synth 3 pluck $p & ); done
我看到ninjagecko发布的内容和我写的基本相同。
b)实现MIDI数据的关键点在于它更像是产生声音的高级配方,而不是声音本身。换句话说,每个MIDI音符表示为音高,动态电平,开始和停止时间以及各种其他元数据。实际声音由合成器产生,不同的合成器以不同的质量水平完成工作。如果你不喜欢你从MIDI文件中获得的声音,这对MIDI来说不是问题,这对你的合成器来说是一个问题,所以你只需找到一个更好的。 (实际上,这通常需要$$$;大多数免费或廉价的合成器都非常糟糕。)
另一种选择是实际挖掘引擎盖,可以这么说,并实现一种算法来创建自己的吉他声音。为此,您需要查看digital signal processing,特别是Karplus-Strong algorithm(创建合成弹拨弦乐声的多种方法之一)。这是一个引人入胜的主题,但是如果您对声音合成的唯一接触是play
并创建MIDI文件,那么您需要学习一些知识。另外,Python可能不是最好的语言选择,因为执行速度非常关键。
如果您对DSP感到好奇,可能需要下载并使用ChucK。
答案 2 :(得分:4)
a)是否可以将play命令用来做一个完整的和弦...?
如果您的声音架构支持它,您可以运行多个同时输出音频的命令。如果您使用的是ALSA,则需要~/.asoundrc
中的dmix或其他变体。使用subprocess.Popen
生成许多子进程。如果假设这是一个bash脚本,你可以这样做:
command1 &
command2 &
...
b)(甚至更好)有没有一种方法在python实现这个(吉他和弦声音)?
通过像FluidSynth这样的软件合成器编译成MIDI和输出。