在linux和/或python中制作吉他和弦的最简单方法

Sir*_*rex 13 python linux audio bash guitar

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

我在想,即使我做了正确频率产生多个正弦波的低水平腿部工作,它也听起来不正确,因为信封也需要正确,否则听起来不像吉他,而是更多的嗡嗡声.

坦率地说,linux sox命令可以产生一个非常有说服力的个人注释:

play -n synth 0 pluck E3

所以我真的要问的是,

a)是否有可能将播放命令用于制作一个完整的和弦(理想情况下,开始时间略有不同以模拟拨弦乐器的行程) - 我无法做到这一点但是也许还有一些bash fairydust那就是叉子一个过程或类似的,所以听起来是对的.如果这是可能的,我会满足于从我的代码中调出一个bash命令(我不喜欢重新发明轮子).

b)(甚至更好)有没有一种方法在python实现这一点(吉他和弦声)?我已经看过一些可访问的python midi图书馆,但坦率地说midi不太适合我想要的声音,据我所知.

小智 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
Run Code Online (Sandbox Code Playgroud)

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

结果是一个非常有说服力的吉他和弦; 你当然可以很容易地改变音符或延迟.您还可以使用"吉他"的延音和音调,或添加过载效果 - 有关详细信息,请参阅手册.


Dav*_*d Z 6

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

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

我看到ninjagecko基本上和我写的一样.

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

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

如果您对DSP很好奇,可能需要下载并使用ChucK.