使用带有 partitionByInstrument() 的 music21 读取 MIDI 文件以获取返回空列表的音符和和弦

Posted

技术标签:

【中文标题】使用带有 partitionByInstrument() 的 music21 读取 MIDI 文件以获取返回空列表的音符和和弦【英文标题】:reading MIDI file using music21 with partitionByInstrument() to get notes and chords returning empty list 【发布时间】:2020-10-18 13:37:12 【问题描述】:

我正在尝试使用github repository's .py file 中的代码(get_notes() 函数)从this midi file 中提取音符和和弦数据。这是从我正在使用的存储库中复制的确切代码:

def get_notes():
    """ Get all the notes and chords from the midi files in the ./midi_songs directory """
    notes = []

    for file in glob.glob("midi_songs/*.mid"):
        midi = converter.parse(file)

        print("Parsing %s" % file)

        notes_to_parse = None

        try: # file has instrument parts
            s2 = instrument.partitionByInstrument(midi)
            notes_to_parse = s2.parts[0].recurse() 
        except: # file has notes in a flat structure
            notes_to_parse = midi.flat.notes

        for element in notes_to_parse:
            if isinstance(element, note.Note):
                notes.append(str(element.pitch))
            elif isinstance(element, chord.Chord):
                notes.append('.'.join(str(n) for n in element.normalOrder))

    with open('data/notes', 'wb') as filepath:
        pickle.dump(notes, filepath)

    return notes

我的 midi 文件有多个乐器,我认为由于某种原因导致没有任何东西附加到笔记列表中。看到我刚刚克隆了存储库的代码并在我自己的 midi 文件上运行它,我不确定它为什么不起作用。我查看了 music21 的 partitionByInstrument() 的文档,并尝试通过更改来迭代不同的乐器:

notes_to_parse = s2.parts[0].recurse()

 notes_to_parse = s2.parts[1].recurse()

因为不同的部分应该是来自文件的不同乐器,但它仍然返回一个空列表。我该怎么办?

【问题讨论】:

【参考方案1】:

v6.1 添加了一项功能,可根据 MIDI 乐器名称和轨道名称消息创建 Instrument 对象。今天发布的 v6.5 添加了一项功能,用于删除在同一滴答声中的程序更改消息中还存在 Instrument 时导致的重复项。如果您试用 v6.5,您可能会发现它更易于使用。

【讨论】:

【参考方案2】:

这仅仅是因为它使用了它发现的第一个乐器,它没有关于音符、持续时间或偏移的数据。遍历工具,我得到了不同的返回完整列表的工具。

【讨论】:

以上是关于使用带有 partitionByInstrument() 的 music21 读取 MIDI 文件以获取返回空列表的音符和和弦的主要内容,如果未能解决你的问题,请参考以下文章

HBase - 使用带有值列表的一列与使用带有列列表的一列族的优缺点是啥?

如何使用带有或不带有 Appium 的 Robot Framework 集成 WinAppDriver?

使用带有 ajax Rest 调用的 Spring CSRF 和带有 Thymeleaf 的 HTML 页面

如何在带有 React 的 Typescript/JSX 中使用带有箭头函数的泛型?

优化数据库有啥更好的方法:使用带有不同过滤器的一堆存储过程,还是使用带有 if 条件的单个存储过程?

使用带有数据数组的 Yii2 和带有排序和过滤的 Gridview