1

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

有了数字列表,我的一个想法是创建一个带有与 music21 音符名称匹配的字符串的 R 向量,并尝试使用音符名称而不是数字来获得新的输出。但我不太确定。此外,我不知道之后如何进行。

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

我该如何继续?

4

1 回答 1

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 让我们可以同时浏览两个列表。我们检查该音符是否应该是休息;如果它是一个休息,我们添加正确的持续时间的休息,否则我们继续添加正确持续时间的音符。(注意我不是作曲家,你可以用任何你喜欢的方式生成音符和持续时间:-))。

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

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

于 2016-03-13T03:05:34.117 回答