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

data exchange between R and python (music21)

我的目标是获取一个文本文件,其中包含由 R 生成的数字列表(例如 1 2 3 4),并且 "translate" 将数字转换为 music21 音符(即,在每个音符时组成旋律用数字标识)。

有了数字列表,我的一个想法是创建一个 R 向量,其中包含与 music21 音符名称匹配的字符串,并尝试使用音符名称而不是数字获得新的输出。但我不太确定。另外,我也不知道之后怎么办。

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

我该如何继续?

就个人而言,我会尝试只使用 python。我知道你对此没有什么经验;但是 python 比 R 更通用,应该能够做任何 R 能做的事情。尝试同时使用两者似乎会产生您根本不需要的额外复杂性和开销。

看起来这首 music21 有笔记和长度;但是也有休息。假设您有一个名为 "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 让我们可以同时遍历两个列表。我们检查音符是否应该是休止符;如果是休止符,我们添加具有正确时长的休止符,否则我们继续添加具有正确时长的音符。 (请注意,我不是作曲家,您可以按照自己喜欢的方式生成音符和时长:-))。

如果你真的想;您可以在 R 中编写一个 csv 文件或一些音符和持续时间,然后在 python 中阅读。但是,我认为在 python 中生成列表本身是一种更简洁的方法。

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