如何从 MIDI 文件中提取单个和弦、休止符和音符?

2024-02-22

我正在制作一个程序,应该能够从某个 midi 文件中提取音符、休止符和和弦,并将音符和和弦的相应音高(以 midi 音调数字表示 - 它们从 0-127 开始)写入 csv 文件供以后使用。

对于这个项目,我使用 Python 库“Music21”。

 from music21 import *
 import pandas as pd


 #SETUP

 path = r"Pirates_TheCarib_midi\1225766-Pirates_of_The_Caribbean_Medley.mid"

 #create a function for taking parsing and extracting the notes
 def extract_notes(path):
     stm = converter.parse(path)

     treble = stm[0] #access the first part (if there is only one part)
     bass = stm[1]

     #note extraction
     notes_treble = []
     notes_bass = []
     for thisNote in treble.getElementsByClass("Note"):
         indiv_note = [thisNote.name, thisNote.pitch.midi, thisNote.offset]
         notes_treble.append(indiv_note)  # print's the note and the note's 
         offset

     for thisNote in bass.getElementsByClass("Note"):
         indiv_note = [thisNote.name, thisNote.pitch.midi, thisNote.offset]
         notes_bass.append(indiv_note) #add the notes to the bass

     return notes_treble, notes_bass

 #write to csv
 def to_csv(notes_array):
     df = pd.DataFrame(notes_array, index=None, columns=None)
     df.to_csv("attempt1_v1.csv")

 #using the functions
 notes_array = extract_notes(path)
 #to_csv(notes_array)

 #DEBUGGING
 stm = converter.parse(path)
 print(stm.parts)

这是我用作测试的分数的链接。https://musescore.com/user/1699036/scores/1225766 https://musescore.com/user/1699036/scores/1225766

当我运行 extract_notes 函数时,它返回两个空数组和行:

print(stm.parts)

它返回

<music21.stream.iterator.StreamIterator for Score:0x1b25dead550 @:0>

我很困惑它为什么这样做。该作品应由高音和低音两部分组成。如何将每个音符、和弦和休止符放入数组中,以便将其放入 csv 文件中?


这是我如何做到这一点的一小段。我需要获取特定乐器的所有音符、和弦和休止符。因此,首先我迭代了部分并找到了特定的乐器,然后检查它是什么类型的注释并将其附加。

你可以这样调用这个方法:

notes = get_notes_chords_rests(keyboard_instruments, "Pirates_of_The_Caribbean.mid")

其中 Keyboard_instruments 是乐器列表:

keyboard_instruments = ["KeyboardInstrument", "Piano", "Harpsichord", "Clavichord", "Celesta", ]

def get_notes_chords_rests(instrument_type, path):
    try:
        midi = converter.parse(path)
        parts = instrument.partitionByInstrument(midi)
        note_list = []
        for music_instrument in range(len(parts)):
            if parts.parts[music_instrument].id in instrument_type:
                for element_by_offset in stream.iterator.OffsetIterator(parts[music_instrument]):
                    for entry in element_by_offset:
                        if isinstance(entry, note.Note):
                            note_list.append(str(entry.pitch))
                        elif isinstance(entry, chord.Chord):
                            note_list.append('.'.join(str(n) for n in entry.normalOrder))
                        elif isinstance(entry, note.Rest):
                            note_list.append('Rest')
        return note_list
    except Exception as e:
        print("failed on ", path)
        pass

附:使用 try 块很重要,因为网络上的许多 midi 文件都已损坏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 MIDI 文件中提取单个和弦、休止符和音符? 的相关文章

随机推荐

  • 方案脚本与构建阶段脚本

    构建完成后 我想将一些文件复制到我的 Xcode 项目中 我发现我可以这样做 在 构建阶段 中使用自定义构建步骤 我还可以在方案编辑器中的不同 任务 之前和之后执行脚本 Build 这是我可以添加脚本的地方 Run Test Profile
  • 如何允许用户使用 Google Consumer Surveys API 访问调查结果?

    我使用以下方法创建了一项调查谷歌消费者调查 https www google com insights consumersurveys home 我想使用不同的帐户来检查调查结果 如何允许第二个 Google 帐户通过 API 访问调查 您
  • 可以直接跳转到 ViewAnimator 中的第二个视图

    我有一个ViewAnimator ViewSwitcher准确地说 具有与其关联的淡入 淡出动画和两个Views我在使用之间转换ViewAnimator showNext and ViewAnimator showPrevious 方法 我
  • WiX 修补无法正确更新文件

    我的 admin image 风格 WiX 测试补丁无法正确更新现有安装 使用 msiexec lx 时 我得到以下与修补 fi executable exe 相关的信息 MSI s 88 E0 12 32 41 716 Baseline
  • 在 graphviz 中使用符号字体/数学符号

    环境 graphviz 2 38 Windows 7 Using dot 我想生成如下所示的路径图来表示结构方程模型 好吧 这里只是一个简单的单因素测量模型 我想对某些节点和边使用希腊字母 并且实际上更喜欢如果我可以在点文件中使用类似 La
  • 智能颜色检测

    我们正在开发一个医疗调度系统 该系统允许用户根据特定状态定义要在日历上显示的颜色 我们遇到的问题是 如果用户选择深色背景颜色并且我们使用深色字体 则该字体不会显示 同样 如果他们选择浅色 而我们使用浅色字体 由于多种原因 我们不希望用户设置
  • 正则表达式性能 VS 纯粹迭代的最佳实践

    我想知道何时使用正则表达式 VS 是否有任何一般准则 string contains anotherString 和 或其他 String API 调用 虽然上面给出了决定 contains 是微不足道的 如果您可以在一次调用中完成此操作
  • WP 7 中 Uri.IsWellFormedUriString 实现中的错误?

    在 NET 4 控制台应用程序和 Silverlight 4 应用程序中 以下返回false Uri IsWellFormedUriString http msdn microsoft com en us library system ur
  • Fragment 元素包含未处理的扩展元素“util:RegistrySearch”

    学习如何创建 Wix Booloader 以便我可以使用我的 msi 安装包安装 NET Framework 无论如何 我遇到了未处理的扩展元素的错误 代码如下
  • 为什么我在这段代码中得到一个奇怪的数字?

    我想编写一个 C 程序来计算从 1 到 5 的整数的阶乘并以表格格式打印它们 然而 我总是收到一个奇怪的数字 这是代码 include
  • HTML/jQuery 表:水平滚动,固定第一(左)列

    我有一个表 显示一列测试名称 以及与测试相关的各种测试数据的多个 无限数量 列 由于会有多组数据 我想限制可以看到的数量 并且让用户能够水平滚动以显示 隐藏不同的数据组 接受的答案jquery表格列滑动效果 https stackoverf
  • 带 Retrofit 转换器的 Gson 反序列化器:所有响应只需要内部 JSON

    我正在使用一个总是这样响应的 API stuff i need title Hello title World status success and other things key version 208 status success 总
  • Seam - 列出所有组件

    我想获得所有组件的列表 以便我可以进一步处理它们 这可能吗 如果可以 我该怎么做 我不相信我可以观察所有 postCreate 事件 因为它只是完全匹配而不是正则表达式 Observer org jboss seam postCreate
  • Jupyter 拒绝在 Windows 上提供隐藏目录 (D:\)

    我正在尝试启动 Jupyter 其基本目录是我的第二个硬盘的根目录 我曾经能够使用 Ipython 3 x 很好地做到这一点 直到我升级到最新版本 如果我 cd 到 D 并输入jupyter notebook debug我得到的跟踪的末尾是
  • 获取 Microsoft OneDrive 管理的文件的完整文件属性

    Microsoft OneDrive 允许本地 远程或两种方式存储文件 这是由 Windows 10 中出现的新文件属性决定的 FILE ATTRIBUTE PINNED 0x00080000 FILE ATTRIBUTE UNPINNED
  • Django 以交错/交替方式合并 2 个查询集?

    在我的 Django 应用程序中 我有 2 个查询集same目的 我知道我可以使用 itertools 和链合并 2 个查询集 如下所示 from itertools import chain list chain first querys
  • Elixir/erlang 在哪里适合微服务方法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 最近 我一直在使用 docker compose 进行一些实验 以便部署多个协作微服务 我可以看到微服务提供的许多好处 而且现在有一个
  • 突出显示文本区域中的句子

    我必须编写一个程序 在其中必须突出显示 JTextarea 中的句子 我有一个文件 称为原始文件和摘要文件 原始文件将显示在文本区域框中 我必须在文本区域框中突出显示摘要文件的所有句子 例如 如果原始文件包含 Tendulkar 出生于孟买
  • 如何在Android中更改“MaterialDatePicker”的主题?

    我用过材质日期选择器为了选择一个日期 我也完成了这项任务 但是我无法更改主题标题和按钮 MaterialDatePicker Builder builder MaterialDatePicker materialDatePicker lon
  • 如何从 MIDI 文件中提取单个和弦、休止符和音符?

    我正在制作一个程序 应该能够从某个 midi 文件中提取音符 休止符和和弦 并将音符和和弦的相应音高 以 midi 音调数字表示 它们从 0 127 开始 写入 csv 文件供以后使用 对于这个项目 我使用 Python 库 Music21