0

我想玩一点以编程方式制作旋律。

我并不真正关心音色,但如果我能让它听起来像老式的 8 位音乐,那就太酷了。

我希望能够通过简单地为每个音符指定它的长度、播放时间(从歌曲的开头开始)和音高来播放音乐。

我想以下列方式使用它:

from awesomeMelodyLibrary import play

# Perhaps play accepts an iterable of 3-tuples where 
# the items of the tuple are (pitch, duration_of_note, when_to_play)
# and then it would play those notes.
play([ (440, 200, 0),    # A4
       (440, 200, 200),
       (660, 200, 400),  # E5
       (660, 200, 600),
       (740, 200, 800),  # F#5
       (740, 200,1000),
       (660, 400,1200) ])

它会播放字母歌曲的开头。

它不必完全是那样,我会受到一些限制(例如,最多只能同时演奏三个音符),但关键是我不想弄脏原始的声音数据,处理混合不同声音片段的细节,以便播放和弦、声音片段等。

4

1 回答 1

1

尝试使用 Python 前端的 RTcmix。

它在 OS X 上效果最好,虽然我在 Ubuntu 上使用它。这不是一个简单的构建过程,但你可以在他们的讨论列表中看到我关于我在 Ubuntu 12.04 上的安装过程的帖子。

他们有各种可用的仪器。我的最爱之一是STRUM2,一种弹拨乐器。

下面介绍如何在 Python 中演奏一些音符。

from rtcmix import *
rtsetparams(44100, 2)
load("STRUM2")
noteOnset = 0 #in seconds
duration = 1.0 # in seconds
amplitude = 10000
pitch = 440 # specified in hertz
squish = 1
decay = 1.0
pan = .5 
STRUM2(noteOnset, duration, amplitude, pitch, squish, decay, pan)

默认情况下,它以赫兹为单位,但此功能可以将 MIDI 键号转换为赫兹。

def keynumToHertz(keynum):
  lowestfreq = 8.175 #C-1
  return lowestfreq * math.pow(2.0, float(keynum)/12.0)

如果您想以标准符号指定注释,('Bb6', 'G#8', 'F-1', 'A4')则可以使用nameToNum我编写的函数。在这里找到它。

查看他们网站上的文档以获取更复杂的示例,或者查看我的Github存储库,其中包含 Metalevel 中 Notes的几个章节的实现,这是关于算法组合的文本。如果您不仅仅对演奏指定的音符感兴趣,我强烈建议您阅读那本书。它是为 Lisp/Common Music 编写的,但我的仓库中有很多 Python/RTcmix 翻译。

于 2013-01-15T03:24:25.660 回答