在Linux和/或Python中产生吉他和弦的最简单方法

14

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

我认为,即使我在正确的频率下产生多个正弦波的低级工作,由于包络需要正确,否则它将听起来像嗡嗡声而不是吉他声音,所以它也不会发出正确的声音。

令人兴奋的是,Linux的sox命令play可以使用以下命令产生一个相当令人信服的单个音符:

play -n synth 0 pluck E3

所以我真正想问的是,

a)是否可以塞入play命令以演奏整个和弦(理想情况下具有略微不同的启动时间以模拟拨片弦震) - 我尝试过这样做,但也许有一些bash魔法可以分叉一个进程,使其听起来正确。如果可以实现这一点,我将满足于从我的代码中调用bash命令(我不想重复发明轮子)。

b)(更好的选择)是否有一种方法在Python中实现这一点(吉他和弦声音)?我已经看到了一些可访问的Python MIDI库,但就我所知,MIDI并不适合我想要的声音。

3个回答

14

手册给出了以下示例:

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个通道,然后将它们混合到一个通道中。

结果是一个非常有说服力的吉他和弦;当然你可以很容易地改变音符或延迟。你还可以玩弄“吉他”的持续音和音调,或添加失真效果-请参阅手册了解详情。


好的,我会试一下。目前的解决方案相当不专业,如果你一遍又一遍地运行它,它可能会崩溃,但只要慢慢来,听起来还可以。- 我会尝试这个方法,并在接下来的几周内回复您。 - Sirex
太棒了!我会将这个答案设为被接受的答案,因为它听起来确实好多了。:-)谢谢! - Sirex
你有想法如何使用 pl 合成子命令来实现升降调吗? - sehe
@sehe,你可以直接使用#和b。例如,G#4表示高音G升。 - matt

7

a) 一种不太正规的方法是生成一个后台子进程来运行每个play命令。由于后台子进程不会让外壳等待它完成,因此您可以同时运行多个play。类似这样的东西将起作用:

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感到好奇,可以下载并尝试使用ChucK。

那个for循环似乎可以工作,尽管由于振幅的削减而有些剪切,但这是一个好的开始,谢谢 :-) -- 我大多数情况下都不考虑MIDI作为选项,因为它在每个最终用户的机器上听起来都不同。我会看看for循环能带给我的进展。 - Sirex
使用“vol”说明符进行修复。这看起来是可行的解决方案,谢谢! :-) - Sirex

4

a) 是否可以让play命令播放整个和弦?

如果您的音频架构支持它,您可以同时运行多个输出音频的命令。如果您使用的是ALSA,则需要在~/.asoundrc中使用dmix或其他变体。使用subprocess.Popen来生成多个子进程。如果这是一个bash脚本,您可以执行以下操作:

command1 &
command2 &
...
b)更好的方法是在Python中实现这个(吉他和弦声)吗?
将其编译为MIDI并通过软件合成器(如FluidSynth)输出。

今晚我会尝试这个,但是我使用的是 Fedora(我假设我的客户大多数也使用 Fedora 或 Ubuntu),但我正在使用 PulseAudio。昨晚我想到了 & 技巧,但当我尝试时,没有声音播放,直到我将进程带回前台,这有点失去了意义。关于 B) 我想知道 sox 是做什么的,因为我用 tuxguitar 中的每个乐器和 midi 音频都听起来很糟糕,但是 sox 听起来还可以。也许这只是一种错觉。 - Sirex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接