【问题标题】:Easiest way to produce guitar chords in linux and/or python在 linux 和/或 python 中产生吉他和弦的最简单方法
【发布时间】:2011-10-04 22:05:45
【问题描述】:

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

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

令人惊讶的是,linux sox 命令 play 可以产生一个非常令人信服的个人音符:

play -n synth 0 pluck E3

所以我真正要问的是,

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

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

【问题讨论】:

    标签: python linux bash audio guitar


    【解决方案1】:

    手册给出了这个例子:

    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 个通道延迟略微增加的时间,然后将它们混合成一个通道。

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

    【讨论】:

    • 不错。我试试看。目前的解决方案非常老套,我发现如果你一遍又一遍地运行它,它可能会崩溃,但只要你慢慢地做,听起来就可以了。 - 我试试这个并在接下来的几周内回来。
    • 太棒了!我会把公认的答案改成这样,因为它确实听起来好多了。 :-) 谢谢!
    • 您知道如何使用pl synth 子命令进行升/降调吗?
    • @sehe 你可以简单地使用 # 和 b 。例如,G#4 是一个高升 G。
    【解决方案2】:

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

    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 一起玩。

    【讨论】:

    • for 循环似乎可以工作,尽管由于幅度的原因有一些削波,但它是一个好的开始,谢谢 :-) - 我大多不考虑 midi 作为一个选项,因为它会听起来在每个最终用户的机器上都不同。我会看看 for 循环会把我带到哪里。
    • 用“vol”说明符修复。这看起来像是可行的解决方案,谢谢! :-)
    【解决方案3】:

    a) 是否可以硬塞播放命令来完成整个和弦...?

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

    command1 &
    command2 &
    ...
    

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

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

    【讨论】:

    • 今晚我会试试这个,但我在 Fedora 上(我假设我的客户的用户将主要在 Fedora 或 ubuntu 上)但我使用的是 pulseaudio。昨晚我想到了 & 把戏,但是当我尝试它时,直到我把这个过程带回到前台,它才发出声音,这有点失败了。关于 B)我想知道 sox 是做什么的,因为我用 tuxguitar 用 midi 尝试了每一种乐器,听起来像垃圾,但 sox 对我来说听起来不错。也许这是一种错觉。
    猜你喜欢
    • 2011-06-22
    • 2011-07-24
    • 2018-03-08
    • 1970-01-01
    • 2012-08-28
    • 2010-11-05
    • 2019-03-01
    • 2018-10-10
    相关资源
    最近更新 更多