首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式创建旋律

以编程方式创建旋律
EN

Stack Overflow用户
提问于 2012-12-26 13:58:55
回答 1查看 573关注 0票数 0

我想用编程的方式来制作一些旋律。

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

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

我想通过以下方式使用它:

代码语言:javascript
复制
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) ])

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

它并不是必须完全那样,我可以接受一些限制(例如,一次只能播放三个音符),但重点是我不想弄脏原始的声音数据,处理混合不同声音剪辑的细节,以便播放和弦,声音剪辑,等等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-15 11:24:26

尝试使用Python前端的RTcmix。

它在OS上运行得最好,不过我在Ubuntu上使用它。这不是一个简单的构建过程,但你可以在他们的讨论列表中看到我的post,关于我在Ubuntu12.04上的安装过程。

他们有各种各样的仪器可供选择。我最喜欢的乐器之一是STRUM2,一种弹拨乐器。

下面是如何在Python中演奏几个音符。

代码语言:javascript
复制
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键数字转换为赫兹。

代码语言:javascript
复制
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

请查看他们网站上的文档以获取更复杂的示例,或者查看my Github repo中关于算法合成的Metalevel注释的几个章节的实现。如果你感兴趣的不仅仅是演奏手写的音符,我强烈推荐你去读一读这本书。它是为Lisp/Common Music编写的,但我的资源库中有很多Python/RTcmix的翻译版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14036535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档