从频率,和弦中播放python中的流声音

时间:2013-10-29 22:18:44

标签: python audio

我正在开发一个将吉他和弦转换为班卓琴和弦的应用程序,当我正在构建对象时,我还想制作一种音频“打印声明”,它可以快速演奏我的和弦。标签/写入。

我发现自己很惊讶如何使用Python同时播放多个声音而不需要某种混音,或者包含所有的pygame,或者写入文件。

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

  1. 取频率 - 就像440一样产生一个A,880来产生一个八度 - 作为一个可迭代的
  2. 无需写入磁盘即可通过midi乐器播放它们。
  3. 我有适当的功能,可以从音品转换为频率,给定乐器调音,基于这些,我想说:

    fretboard.play([440, 880])
    

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

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

    同时听到每一个。

    简单地获取这种声音的最佳方法是什么,并且希望以某种方式让我对其中的几种进行排序,如果我想创建一些原始的旋律?

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

2 个答案:

答案 0 :(得分:2)

在寻找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()

希望这有助于指明你的方向!

答案 1 :(得分:1)

如果你在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)