5

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

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

我正在寻找的是可以...

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

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

fretboard.play([440, 880])

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

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

同时听一秒钟。

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

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

4

2 回答 2

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()

希望这有助于为您指明正确的方向!

于 2013-10-29T22:54:49.827 回答
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)
于 2013-10-30T10:53:04.533 回答