【问题标题】:Playing streaming sounds in python from frequency, chords从频率,和弦在python中播放流声音
【发布时间】:2013-10-29 22:18:43
【问题描述】:

我正在开发一个将吉他和弦转换为班卓琴和弦的应用程序,并且在构建对象时,我还想制作一种音频“打印语句”,可以快速播放我的和弦选项卡/书面。

我发现自己很困惑如何使用 Python 同时播放多个声音而不需要进行某种混合工作,或者包含所有 pygame,或者写入文件。

我正在寻找的东西可以...

  1. 将频率——比如 440 产生一个 A,880 产生一个八度音——作为一个可迭代对象
  2. 播放它们无需写入磁盘,可能通过 MIDI 乐器。

在给定乐器调音的情况下,我有可以从音品转换为频率的功能,基于这些,我想说:

fretboard.play([440, 880])

并听到提示音。或者如果我可以指定时间...

fretboard.play([(440,1), (880,1)])

同时听一秒钟。

如果我想创作一些原始的旋律,那么简单地获得这种声音的最佳方法是什么,并且希望能够让我对其中的几个进行排序?

此外,如果这只是一种完全不同的编程,并且我的问题看起来很幼稚(“嘿,mittenchops,你需要了解更多关于频道的知识!”),请告诉我,特别是如果你可以指导我到很好的学习资源。

【问题讨论】:

    标签: python audio


    【解决方案1】:

    之前在寻找 Python 的声音分析时,我偶然发现了这个网站 PythonInMusic,它有很多 Python 的音乐软件链接。

    再回头看,我想我第一个尝试用来实时输出 MIDI 音符的东西叫做PyFluidSynth。这是一个用于 python 的 midi 合成器。以下是他们网站上的一些示例代码:

    import time
    import fluidsynth
    
    fs = fluidsynth.Synth()
    fs.start()
    
    sfid = fs.sfload("example.sf2")
    fs.program_select(0, sfid, 0, 0)
    
    fs.noteon(0, 60, 30)
    fs.noteon(0, 67, 30)
    fs.noteon(0, 76, 30)
    
    time.sleep(1.0)
    
    fs.noteoff(0, 60)
    fs.noteoff(0, 67)
    fs.noteoff(0, 76)
    
    time.sleep(1.0)
    
    fs.delete()
    

    希望能帮助您指明正确的方向!

    【讨论】:

    • 酷,谢谢!这是一个死项目还是什么?我成功下载并安装了它,但是,即使按照您从code.google.com/p/pyfluidsynth 复制的示例,我也会得到``` import time import fluidsynth fs = fluidsynth.Synth(): Traceback (last recent call last): File "",第 1 行,在 中 AttributeError: 'module' 对象没有属性 'Synth' ```
    • 你需要确保你也安装了 FluidSynth(不仅仅是 PyFluidSynth)这里是一篇文章的链接,介绍如何在 Windows 上执行此操作:stackoverflow.com/questions/5783913/… 和 Linux 上的更新链接/ OSX(因为要求部分列出的一个已关闭:sourceforge.net/apps/trac/fluidsynth
    • 这些是 MIDI 音符,但不是频率。尝试将任意频率转换为 MIDI 音符编号会产生 ArgumentError: argument 3: <type 'exceptions.TypeError'>: wrong type
    【解决方案2】:

    如果您使用的是 Windows,则可以使用无法同时弹奏多个音符的旧控制台上使用的方法获得类似的效果 - 例如,不要同时弹奏 C、E 和 G,而是弹奏 C然后 E 然后 G 非常快,可能在最后一个音符上保持一定程度(最好是补品)。这给出了和弦的效果,但如果你想演示吉他或班卓琴上不同的和弦是如何发声的(包括演奏相同和弦的不同方式之间的差异),它可能还不够好。但是,这种方法是可能的(至少在 Windows 上),无需使用标准库之外的任何东西。

    示例代码:

    import winsound
    import time
    
    def chord(root_frequency):
    winsound.Beep(int(root_frequency), 60)
    winsound.Beep(int(root_frequency*1.25), 60)
    winsound.Beep(int(root_frequency*1.5), 60)
    winsound.Beep(int(root_frequency*2), 100)
    
    while True:
        chord(261.626)
        time.sleep(0.35)
        chord(261.626)
        time.sleep(0.05)
        chord(233.082)
        time.sleep(0.35)
        chord(233.082)
        time.sleep(0.05)
        chord(207.652)
        time.sleep(0.35)
        chord(207.652)
        time.sleep(0.05)
        chord(195.998)
        time.sleep(0.35)
        chord(195.998)
        time.sleep(0.05)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多