python:mido 提取 midi文件中某一音轨的音乐数据

【python脚本系列】利用mido库解析midi文件 【python脚本系列】利用mido库解析midi文件,实现与音效同学交流 Hallo大家好~~我是Lampard猿奋 昨天写了关于Midii数字化乐器接口的文章,介绍了midi是一组代表音乐参数(如音高,动态,节奏等等 )的标准化代码,是音乐与计算机之间交互的语言。那么这个语言究竟是怎么组成,是什么数据结构呢,下面就和大家一起打开这个黑盒 ... 阅读详情

pip install mido

使用 mido库可以方便地处理 MIDI 文件,提取其中音轨的音乐数据。

1.下面的程序会读取指定的 MIDI 文件,并提取指定编号音轨的音乐数据,主要包括音符事件等信息。

编写 mido_extract.py  如下

# -*- coding: utf-8 -*-
""" 用 mido 提取 midi文件中某一音轨的音乐数据 """
import os
import sys
from tkinter import filedialog
import mido

def extract_track_data(midi_file, track_no):
    try:
        track_data = []
        tracks = midi_file.tracks
        for i,track in enumerate(tracks):
            print(f"Track {i}: {track.name}")
        if track_no < len(tracks):
            track = tracks[track_no]
            for msg in track:
                if msg.type in ['note_on', 'note_off', 'control_change', 'program_change']:
                    track_data.append(msg)            
        else:
            print(f"音轨编号 {track_no} 超出范围,该MIDI文件共有 {len(tracks)}条音轨。")
        return track_data
    except:
        print(" 无法读取MIDI文件.")
        return None


def write_track_to_midi(track_data, output_file_path, original_mid):
    new_mid = mido.MidiFile(ticks_per_beat=original_mid.ticks_per_beat)
    new_track = mido.MidiTrack()
    for msg in track_data:
        new_track.append(msg)
    new_mid.tracks.append(new_track)
    new_mid.save(output_file_path)


# main()
if len(sys.argv) ==1:
    filetypes = [('mid file','.mid')]
    f1 = filedialog.askopenfilename(initialdir='D:/Music', filetypes=filetypes)
elif len(sys.argv) ==2:
    f1 = sys.argv[1]
else:
    print('usage: python mido_extract.py file1.mid')
    sys.exit(1)

if not os.path.exists(f1):
    print(f"{f1} is not exists.")
    sys.exit(2)

fn,ext = os.path.splitext(f1)
if ext.lower() != '.mid':
    print('ext is not .mid ')
    sys.exit(2)

midi_file_path = f1  # 替换为实际的MIDI文件路径
x = 1  # 替换为想要提取的音轨编号,从0开始
output_file_path = f"track_{x}.mid"  # 替换为输出的MIDI文件路径
try:
    original_mid = mido.MidiFile(midi_file_path)
    data = extract_track_data(original_mid, x)
    if data:
        write_track_to_midi(data, output_file_path, original_mid)
        print(f"已成功将track {x} 数据写入 {output_file_path}")
except mido.MidiFileError:
    print(f"无法读取MIDI文件 {midi_file_path}")

运行 python mido_extract.py moon_river.mid
生成 track_1.mid

上述代码中,extract_track_data函数负责提取指定音轨的数据,write_track_to_midi函数则将提取的数据写入新的 MIDI 文件。你需要把midi_file_path换成原始 MIDI 文件路径,track_number设为目标音轨编号,output_file_path指定输出文件路径。


2.下面的代码会复制保留原 MIDI 文件中 Track 0 的全部信息,同时提取 Track 1 的音乐数据,然后将它们合并到一个新的 MIDI 文件中。

编写 mido_extract1.py  如下

# -*- coding: utf-8 -*-
""" 用 mido 复制保留 Track 0 全部信息,提取 Track 1 音乐数据 """
import mido

def copy_track0_and_extract_track1(midi_file_path, output_file_path):
    try:
        # 读取原 MIDI 文件
        original_mid = mido.MidiFile(midi_file_path)

        if len(original_mid.tracks) < 2:
            print("MIDI 文件中没有足够的音轨(至少需要 2 条音轨)。")
            return

        # 创建新的 MIDI 文件,复制原文件的 ticks_per_beat
        new_mid = mido.MidiFile(ticks_per_beat=original_mid.ticks_per_beat)

        # 复制 Track 0 到新的 MIDI 文件
        new_mid.tracks.append(original_mid.tracks[0])

        # 提取 Track 1 的音乐数据
        track1 = original_mid.tracks[1]
        track1_data = []
        for msg in track1:
            if msg.type in ['note_on', 'note_off', 'control_change', 'program_change']:
                track1_data.append(msg)

        # 创建新的音轨并添加 Track 1 的数据
        new_track1 = mido.MidiTrack()
        for msg in track1_data:
            new_track1.append(msg)
        new_mid.tracks.append(new_track1)

        # 保存新的 MIDI 文件
        new_mid.save(output_file_path)
        print(f"已成功将 Track 0 信息和 Track 1 数据写入 {output_file_path}")

    except mido.MidiFileError:
        print(f"无法读取 MIDI 文件 {midi_file_path}")


if __name__ == "__main__":
    midi_file_path = "your_midi_file.mid"  # 替换为实际的 MIDI 文件路径
    output_file_path = "new_midi_file.mid"  # 替换为输出的 MIDI 文件路径
    copy_track0_and_extract_track1(midi_file_path, output_file_path)
    

代码说明:

  1. 读取原 MIDI 文件:使用 mido.MidiFile 读取指定路径的 MIDI 文件。
  2. 检查音轨数量:确保 MIDI 文件中至少有 2 条音轨。
  3. 创建新的 MIDI 文件:使用原文件的 ticks_per_beat 创建新的 MIDI 文件。
  4. 复制 Track 0:将原文件的 Track 0 直接添加到新的 MIDI 文件中。
  5. 提取 Track 1 数据:遍历 Track 1,提取 note_on、note_off、control_change 和 program_change 类型的消息。
  6. 创建新音轨并添加数据:创建一个新的音轨,并将提取的 Track 1 数据添加到该音轨中,然后将该音轨添加到新的 MIDI 文件中。
  7. 保存新的 MIDI 文件:将新的 MIDI 文件保存到指定的输出路径。

你需要将 midi_file_path 替换为实际的 MIDI 文件路径,将 output_file_path 替换为你希望保存的新 MIDI 文件的路径。

Python音乐生成:MIDI 1.midi标准音色表:https://blog.youkuaiyun.com/muyao987/article/details/106854562 2.midi cc控制器表:https://blog.youkuaiyun.com/muyao987/article/details/106854639 3.midi音符代码表:https://blog.youkuaiyun.com/muyao987/article/details/106854737 4.打击乐音色表:https://blog.youkuaiyun.com/muyao987/arti 阅读详情

相关推荐

AI音乐生成 | MIDI格式与Python mido库使用

kelly会在公众号「kelly学技术」不定期更新Python、机器学习、深度学习等文章,感兴趣的朋友可以关注一下,期待与您交流。MIDI用音符、控制参数等来记录音乐,而不是声音信号本身,用以告诉MIDI设备要做什么、怎么做。因此,MIDI文件不是一段真正声音,而是记录声音的信息,用以告诉声卡如何播放音乐的一组指令。最近一段时间会写自动生成音乐的系列文章,今天是第1篇:如何创建MIDI文件。音强:音振幅的大小,音强的不断变化是音乐表达情感的因素之一。time:与前一个音的间隔,单位为毫秒。

qm5132的博客 2040

midi 文件读取与写入(python mido)

【代码】midi 文件读取与写入(python mido)

东方佑 928

mido:适用于Python的MIDI对象

Mido-适用于Python的MIDI对象 Mido是用于处理MIDI消息和端口的库: >> > import mido >> > msg = mido . Message ( 'note_on' , note = 60 ) >> > msg . type 'note_on' >> > msg . note 60 >> > msg . bytes () [ 144 , 60 , 64 ] >> > msg . copy ( channel = 2 ) Message ( 'note_on' , channel = 2 , note = 60 , velocity = 64 , time = 0 ) port = mido . open_output ( 'Port Name' ) port . send ( msg ) with mido . open_input () as in

python:用 mido 生成 midi文件,用 pygame 播放 mid文件

python 用 mido 生成 midi文件,用 pygame 播放 mid文件

belldeep的专栏 1733

Abaqus梁模型仿真中的常见陷阱与优化策略

本文深入探讨了Abaqus梁模型仿真中的常见陷阱与优化策略,涵盖几何建模、材料属性设置、边界条件处理等关键环节。针对梁截面方向定义、网格划分、复合截面建模等典型问题,提供了实用的Python脚本示例和优化方案,帮助工程师避免计算错误并提升仿真精度。文章特别强调了动力分析中的网格密度要求和材料非线性考虑,为复杂工程应用提供专业指导。

weixin_29099217的博客 461

Jetson Orin Nano GPIO 实战,用 devmem 玩转 Pinmux 引脚复用配置

devmem 是一个直接读写寄存器的工具,通过 mmap 将 /dev/mem 中的物理地址区域映射到用户空间进程地址空间,从而实现直接读写,正常情况下在 /dev 下可以看到 mem。可以看到对应 bit5 bit6 分别为 1,对应配置为 E_IO_HV 为 ENABLE 以及 E_INPUT 为 ENABLE。需要 TRM 手册查看相关寄存器,以及安装 busybox,busybox 内置了 devmem。根据 TRM 手册,找到 I2C_SDA 的 pinmux 地址偏移是 0x18。

darcsdn 1644

MIDI文件基础及使用Python库mido操作MIDI文件

基础知识 MIDI文件头:4d 54 68 64 00 00 00 06 ff ff nn nn dd dd 4d 54 68 64:MThd 00 00 00 06:数据区长度六字节 ff ff:00 00-单音轨;00 01-多个同步音轨;00 10-多个不同步音轨 nn nn:音轨数目(含全局音轨和演奏音轨) dd dd:最高位为标记位,0为采用ticks计时,后面的数据为一个4分音符的ti...

X_i_n_w_e_i的博客 1万+

FPGA时序分析中的工艺角:从PVT原理到建立保持时间验证

在数字电路设计中,静态时序分析(STA)是确保芯片功能正确和性能达标的核心验证手段。其基本原理是通过计算信号在逻辑路径上的传播延迟,检查建立时间和保持时间是否满足寄存器采样要求。这项技术的核心价值在于,它能在芯片制造前就预测并消除时序违规,极大提高设计成功率。然而,实际芯片性能会受到工艺波动、电压变化和温度漂移(合称PVT)的显著影响。为了覆盖这些不确定性,时序分析必须采用基于工艺角的边界模型——用最慢的工艺角模型验证建立时间,用最快的工艺角模型验证保持时间。这种分析方法广泛应用于FPGA和ASIC设计流程

weixin_30181209的博客 198

python播放音乐:使用mido编写,播放多声轨MIDI文件音乐

前言: 人人都喜爱音乐,音乐丰富了我们的情感。在历史上,不乏有伟大的作曲家、钢琴家:巴赫、海顿、莫扎特、贝多芬、李斯特、肖邦、勃拉姆斯…… 我们可以在剧院里,音乐厅里听到美妙动听的音乐。当我看到钢琴家修长的手指在钢琴上飞快地舞动,奏出婉转的音乐,十分羡慕,相信你们也是一样。那怎样才能让电脑,手机播放出美妙的音乐呢? 今天,就让我,携您一起进入这美妙而又复杂的音乐世界吧。 基础——发声: 从前有个库...

Sui_da_xia的博客 9038

​开源大模型实战:GLM-4.1V-Thinking本地部署教程(附API调用代码)

​在AI应用从“能用”向“好用”进阶的当下,​的需求愈发强烈:企业需保障数据安全(如医疗影像、金融报告不外传),开发者追求定制化能力(如微调模型适配垂直场景),科研团队则依赖离线环境处理敏感数据。智谱AI开源的​(10B级参数,支持图像、视频、文档多模态推理)凭借的优势,成为本地部署的热门选择。不过,对于“不想折腾技术”的普通用户或快速验证需求的团队而言,​,无需安装配置,打开即用,堪称“零门槛”体验的捷径。本文将分为两部分:先手把手教你​(适合有技术背景的用户),再对比介绍。

gogoMark的博客 1340

车辆横向控制MPC实战:从‘老王模型’到CasADi求解的保姆级避坑指南

本文详细解析了车辆横向控制MPC的实战应用,从经典动力学模型选择到CasADi求解器的优化配置,提供了一套完整的避坑指南。重点介绍了车辆动力学模型的验证要点、CasADi环境的高效配置技巧以及MPC问题建模的核心要素,帮助开发者快速实现稳健的横向控制方案。

weixin_42524499的博客 346

Mido MIDI文件处理完全指南:从读取到修改

Mido是一个强大的Python MIDI处理库,提供了简单直观的API来处理MIDI消息和文件。本指南将带你了解如何使用Mido轻松实现MIDI文件的读取、解析和修改,即使你是编程新手也能快速上手。 ## 什么是MIDI文件? MIDI(Musical Instrument Digital Interface)是一种电子乐器之间以及电子乐器与计算机之间的通信标准。MIDI文件则是存储MIDI

gitblog_00992的博客 1011

传感器应用案例:压力传感器在工业自动化中的应用_(13).压力传感器的数据采集与处理

数据采集系统(Data Acquisition System, DAS)是连接传感器和控制系统的重要桥梁。它包括硬件(如数据采集卡、信号调理器)和软件(如数据采集软件、数据处理算法)两部分。信号调理:将传感器输出的模拟信号转换为适合AD转换的信号。AD转换:将模拟信号转换为数字信号。数据传输:将数字信号传输到控制系统或上位机。存储:将采集的数据存储在本地或远程数据库中。实时性:保证数据的实时性和准确性。压力传感器的数据采集与处理是工业自动化中不可或缺的一部分。

2401_87715305的博客 1620

Python编曲实践(四):向MIDI文件中添加鼓组音轨

如何用Python的Mido库,通过MIDI格式的默认鼓组频道来向MIDI文件中添加鼓轨

_ 2505

YOLOv11-seg 改进系列 | 引入原创 RSCD 重参数共享卷积分割头,增强 Head 表达力并压低计算量

本文提出一种改进的YOLOv11-seg分割头Segment_RSCD,通过重参数共享卷积增强表达能力。该模块在LSCD共享检测头基础上引入DiverseBranchBlock重参数卷积,保留三尺度预测与Proto掩码原型接口不变。相比原始Segment头,Segment_RSCD参数增加4%但计算量降低1.3%,在共享卷积结构中通过多分支补偿表达能力损失,同时利用Scale层保持尺度差异校准。该方法不改动Backbone/Neck结构,仅重构检测/分割头,实现训练期多路径聚合与部署期等效单分支的平衡。

qq_44224801的博客 183

YOLO26涨点改进 | 全网首发Conv独家改进篇 | CVPR 2025 | YOLO26引入FDConv频率动态卷积改进,含FDC3k2二次创新,小目标检测,能够捕捉更加丰富和复杂的特征信息

本文提出了一种频率动态卷积(FDConv)模块,用于改进YOLO26目标检测模型的性能。FDConv通过在傅里叶域内划分参数预算,构建具有频率多样性的权重,有效提升了模型对低频和高频信息的处理能力。该模块包含内核空间调制(KSM)和频率带调制(FBM)两个关键组件,分别实现空间级和频域级的动态调节。实验表明,FDConv仅增加3.6M参数就能超越其他需要大幅增加参数的方法,并在目标检测、实例分割等任务中表现优异。文章详细介绍了FDConv的原理、实现方法及在YOLO26中的集成方式,提供了完整的代码实现。

Ai缝合怪、助力小伙伴高效发论文 250

python中mid_Python生成音乐 之 mido库读取midi文件

midi文件记录的是一系列的弹奏动作.比如一首钢琴曲的midi文件:里面就是记录了弹奏钢琴曲的按键按下和松开等操作,并且记录了按键按下的时长,声音大小,乐器种类等参数.midi文件的后缀是mid:midi音乐文件然后midi音乐文件可以用下面的软件打开,这个软件是一个免费的软件:打开之后的效果:也可以用下面软件打开:(这个软件也是免费的,可以查看曲子的五线谱或者简谱之类的)下载midi文件可以用这...

weixin_39777543的博客 2544

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Python编曲实践(七):整整一百行Python代码写出黑人抬棺梗曲《Astronomia》的旋律

用整整一百行Python代码实现如今火爆全球的黑人抬棺梗曲《Astronomia》,带你学习Python编曲的基本知识

_ 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Python 播放音乐:使用 mido 编写,播放多声轨 MIDI 文件音乐

作者丨隋顺意来源丨萝卜大杂烩https://blog.youkuaiyun.com/Sui_da_xia/article/details/104495111人人都喜爱音乐,音乐丰富了我们的情感。在历...

<sdffdsfsdfdfs>sfsfsfsdfsdffds</sdfsDS>Fsd 1368

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

python音乐编程_使用Python编程制作一段Midi音符

用Python编程制作一段简单的音乐(I)前言对于一些不会写词的业余音乐爱好者来说,可能某一天突然产生了灵感想到一段旋律,然后用一些作曲软件把这段旋律记录下来,然后找一个常见的和弦走向,然后加上两条伴奏和鼓点,再做一些简单的混音。这样,一段“还凑活,听得下去”的音乐就出来了。我们在编程制作一段音乐的时候,也可以模仿业余爱好者的步骤,将整个流程分成如下五个部分。使用适当的模块来生成一段音符让程序生成...

weixin_39596739的博客 1906

终极指南:快速掌握Python MIDI处理库Mido的完整教程

Mido是一个专为Python设计的MIDI对象处理库,它让开发者能够轻松处理MIDI消息、操作MIDI文件,并与各种MIDI后端进行交互。这个免费开源工具为音乐编程、数字音频处理和自动化MIDI控制提供了强大的支持。 ## 🎵 为什么选择Mido库进行MIDI编程 Mido提供了简单直观的API接口,让初学者也能快速上手MIDI编程。它支持多种后端系统,包括RtMidi、PortMidi和

gitblog_01082的博客 391

chatgpt赋能Python-python_mido

Mido是Python中强大的MIDI库,可以让音乐家和开发人员在编程中轻松访问和操作MIDI数据。它提供了易于使用的接口,使得MIDI编程更加愉快和直观。无论您是制作音乐还是开发MIDI应用程序,Mido都是一个必备的工具。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。

shengcaiy123的博客 560

Python mido库实战:从零解析与生成MIDI音乐文件

MIDI(乐器数字接口)是一种广泛应用于音乐制作、游戏音效和嵌入式系统的数字乐谱协议。其核心原理在于通过指令序列(如音符开关、力度、音色变化)而非波形来记录音乐,这使得MIDI文件体积小巧且易于编程修改。在技术层面,MIDI文件由轨道和消息构成,通过增量时间系统实现精确的时序控制,为音乐的可编程性提供了基础。对于开发者和音乐技术爱好者而言,掌握MIDI编程能够解锁自动作曲、音乐可视化、算法生成背景音乐等创意应用场景。Python的mido库作为处理MIDI文件的轻量级工具,提供了清晰的API用于读写.mid

weixin_26869081的博客 219

从MIDI到代码:Musicpy实现音乐文件双向转换的高效方法

Musicpy是一款基于Python的音乐编程语言,通过音乐理论和算法,以简洁的语法编写音乐。本文将介绍如何使用Musicpy实现MIDI文件与代码之间的双向转换,帮助音乐爱好者和开发者轻松处理音乐文件。 ## 认识Musicpy:音乐编程的得力助手 🎵 Musicpy作为一款强大的音乐编程工具,提供了丰富的功能来处理音乐文件。它不仅支持MIDI文件的读写,还能将音乐数据转换为易于理解和编辑

gitblog_00679的博客 1033

Python MIDI编程:Mido库实战指南

Mido作为Python处理MIDI数据的核心库,提供了完整的MIDI消息处理、文件读写和端口控制功能。

fegfsf的博客 500

用 Python 播放多声轨 MIDI 文件音乐

文/世界上的霸主图片来源于网络投稿邮箱:pythonpost@163.com前言:人人都喜爱音乐,音乐丰富了我们的情感。在历史上,不乏有伟大的作曲家、钢琴家:巴赫、海顿、莫扎特、贝多...

Python中文社区 1940
上一篇: music21:伍佰 《挪威的森林》MIDI 音乐分析
下一篇: python:sklearn 决策树(Decision Tree)
belldeep
博客等级 码龄20年 1820粉丝 584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值