R和python之间的数据交换(music21)

时间:2016-03-13 01:06:37

标签: python r music21

我的目标是获取一个带有由R生成的数字列表的文本文件(例如1 2 3 4),并将这些数字“翻译”成音乐21个音符(也就是说,当每个音符用一个音符标识时,构成一个旋律。数)。

拥有数字列表,我有一个想法是创建一个R矢量,其中包含与music21音符名称匹配的字符串,并尝试使用音符名称而不是数字来获取新输出。但我不是很确定。此外,我不知道如何继续。

我还阅读了一些关于在Python中使用R作为子进程的主题,但同样,我无法清楚地理解它是如何工作的(运行子进程几乎使我可怜的旧笔记本电脑崩溃的事实与此有关...)

我该怎么办?

1 个答案:

答案 0 :(得分:3)

就个人而言,我会尝试只使用python。我意识到你对它没什么经验;但是python比R更通用,应该可以做任何R可以做的事情。尝试同时使用两者似乎会产生额外的复杂性和开销,而这些都是您根本不需要的。

看起来这音乐21记笔记和长度;但也有休息。假设您有一个名为“durations”的持续时间列表,以及一个名为notes的备注(和休止符)列表:

from music21 import *

mymusic = stream.Stream()

notes = ["F4", "F4", "rest", "F4"]
durations = [0.25, 1, 0.25, 1]

for n,d in zip(notes, durations):
    if n == "rest":
        mymusic.append(note.Rest(d))
    else:
        mymusic.append(note.Note(n,d))

mymusic.show("midi")

Music21使用一种称为流的特殊列表。我们先制作一个空流,然后用笔记和持续时间填充它。 Zip允许我们同时浏览两个列表。如果说这个音符应该是休息的话我们会chekc;如果是休息,我们会在正确的时间内添加其余部分,否则我们会继续添加正确持续时间的记录。 (注意我不是作曲家,你可以用你喜欢的方式生成笔记和持续时间:-))。

如果你真的想;你可以在R中写一个csv文件或一些注释和持续时间,并在python中读取它。但是,我认为在python中生成列表本身就是一种更清晰的方法。

感谢您向我介绍这个music21库,它看起来非常整洁。