我想要实现的是在我的python应用程序中弹奏吉他和弦。如果需要,我知道(或者可以计算)和弦中的频率。
我在想,即使我做低水平的腿工作,在正确的频率上产生多个正弦波,它也不会听起来正确,因为包络也需要正确,否则它听起来不会像吉他,而更像是嗡嗡声。
有趣的是,linux sox命令播放可以产生一个相当令人信服的个人笔记:
play -n synth 0 pluck E3
所以我真正想问的是,
a)有没有可能硬塞play命令来做整个和弦(理想情况下,用稍微不同的开始时间来模拟plectrum弦击) --我还不能做到这一点,但也许有一些bash仙尘可以分叉一个进程或诸如此类,所以它听起来是正确的。如果这是可能的,我会满足于从我的代码中调用一个bash命令(我不喜欢重复发明轮子)。
b) (甚至更好)在python中有没有实现这一点的方法(吉他和弦)?我已经看到了一些可以访问的python midi库,但坦率地说,据我所知,midi并不适合我想要的声音。
发布于 2012-06-14 20:43: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个synth实例(作为单独的音频通道),通过稍微增加时间来延迟5个通道,然后将它们混合到单个通道。
结果是一个非常令人信服的吉他和弦;当然,你可以很容易地改变音符或延迟。你也可以使用“吉他”的音量和音调,或者添加超速效果--详情请参阅手册。
发布于 2011-07-14 07:11:35
a)黑客方法是派生一个背景子进程来运行每个play命令。因为背景子进程不会让shell等待它完成,所以您可以同时运行多个play。像这样的东西会起作用的:
for p in "C3" "E3" "G3"; do ( play -n synth 3 pluck $p & ); done我看到忍者贴出了和我写这篇文章基本相同的东西。
b)要认识到MIDI数据的关键点是,它更像是产生声音的高级配方,而不是声音本身。换句话说,每个MIDI音符都表示为音高、动态级别、开始和停止时间以及分类的其他元数据。实际的声音是由合成器产生的,不同的合成器以不同的质量水平完成这项工作。如果你不喜欢从你的MIDI文件中得到的声音,这不是MIDI的问题,而是你的合成器的问题,所以你只需要找一个更好的。(在实践中,这通常需要$$$;大多数免费或廉价的合成器都很糟糕。)
可以说,另一种选择是在引擎盖下挖掘,并实现一个算法来创建您自己的吉他声音。要做到这一点,你需要研究一下digital signal processing,特别是像Karplus-Strong algorithm这样的东西(创建合成弹奏弦音的许多方法中的一种)。这是一个令人着迷的主题,但如果您对声音合成的唯一接触是在play和创建MIDI文件的级别,那么您需要学习一些东西。此外,Python可能不是语言的最佳选择,因为执行速度非常关键。
如果你对DSP感兴趣,你可能想下载并使用ChucK。
发布于 2011-07-14 06:50:46
a)是否有可能硬塞播放命令来做整个和弦…?
如果您的声音架构支持它,您可以同时运行多个输出音频的命令。如果你使用的是ALSA,你需要在你的~/.asoundrc中使用dmix或者其他变种。使用subprocess.Popen派生许多子进程。如果假设这是一个bash脚本,您可以这样做:
command1 &
command2 &
...b) (甚至更好)在python中有没有实现这一点的方法(吉他和弦)?
编译成MIDI并通过像FluidSynth这样的软件合成器输出。
https://stackoverflow.com/questions/6686576
复制相似问题