以编程方式创建旋律

时间:2012-12-26 05:58:55

标签: python audio

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

我并不关心音色,但如果我能听起来像听起来很酷的老式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) ])

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

它不一定就是这样,我会有一些限制(例如,同时只能演奏三个音符),但重点是我不想得到肮脏的原始声音数据,处理混合不同声音片段的细节,以便播放和弦,声音片段等。

1 个答案:

答案 0 :(得分:1)

使用Python前端尝试RTcmix。

尽管我在Ubuntu上使用它,但它在OS X上效果最好。这不是一个简单的构建过程,但您可以在他们的讨论列表中看到我的post关于我在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函数。找到它here

查看其网站上的文档以获取更复杂的示例,或者查看我的Github repo,其中包含来自Metalevel的 Notes的几个章节的实现,这是一个关于算法组合的文本。如果你想做的不仅仅是玩手工指定的音符,我强烈推荐阅读那本书。它是为Lisp / Common Music编写的,但我的repo有很多Python / RTcmix翻译。