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

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

pip install mido
 Downloading mido-1.3.2-py3-none-any.whl (54 kB)
 Downloading packaging-23.2-py3-none-any.whl (53 kB)
Installing collected packages: packaging, mido
Successfully installed mido-1.3.2 packaging-23.2

mido 官网文档

pip intall pygame
 pygame  2.5.2

安装文档 D:/Python39/Lib/site-packages/pygame/docs/generated/index.html

编写  test1_mido.py  如下

# -*- coding: utf-8 -*-
from mido import Message, MidiFile, MidiTrack
 
mid = MidiFile()    # 创建MIDI文件
track = MidiTrack() # 创建一个音轨
mid.tracks.append(track)

track.append(Message("program_change", channel=0, program=2, time=0))
# 创建各个音符,并添加到音轨中
map1 = {'C4':60, 'D4':62, 'E4':64, 'F4':65, 'G4':67, 'A4':69, 'B4':71, 'C5':72}
# do: C4 = 60
track.append(Message("note_on", note=60, velocity=96, time=0))
track.append(Message("note_off", note=60, velocity=0, time=500))
# re: D4 = 62 
track.append(Message("note_on", note=62, velocity=96, time=0))
track.append(Message("note_off", note=62, velocity=0, time=500))
# mi: E4 = 64
track.append(Message("note_on", note=64, velocity=96, time=0))
track.append(Message("note_off", note=64, velocity=0, time=500))
# fa: F4 = 65
track.append(Message("note_on", note=65, velocity=96, time=0))
track.append(Message("note_off", note=65, velocity=0, time=500))
# sol:G4 = 67
track.append(Message("note_on", note=67, velocity=96, time=0))
track.append(Message("note_off", note=67, velocity=0, time=500))
# la: A4 = 69
track.append(Message("note_on", note=69, velocity=96, time=0))
track.append(Message("note_off", note=69, velocity=0, time=500))
# si: B4 = 71
track.append(Message("note_on", note=71, velocity=96, time=0))
track.append(Message("note_off", note=71, velocity=0, time=500))
# do^: C5 = 72
track.append(Message("note_on", note=72, velocity=96, time=0))
track.append(Message("note_off", note=72, velocity=0, time=500))

mid.save("test1.mid")

运行 python test1_mido.py  生成文件 test1.mid

查看 mid文件内容 (Message),编写  mido_msg.py  如下

# -*- coding: utf-8 -*-
""" https://mido.readthedocs.io/en/latest/ """
import os
import sys
from tkinter import filedialog
from mido import MidiFile

# 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_msg.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)

print(f1)
try:
    # 打开 MIDI 文件
    mid = MidiFile(f1)
    # 遍历 MIDI 文件中的每个消息
    for i, track in enumerate(mid.tracks):
        print(f'Track {i}: {track.name}')
        for msg in track:
            print(msg)
except Exception as e:
    print(f"解析 MIDI 文件时出现错误: {e}")


运行  python mido_msg.py  happy_birthday.mid 

编写  play_mid.py  如下

# -*- coding: utf-8 -*-
import os
import sys
import time
from tkinter import filedialog
import traceback
import pygame
from pygame import mixer

def mixer_init():
    freq = 44100
    bitsize = -16
    channels = 2
    buffer = 2048
    mixer.init(freq, bitsize, channels, buffer)
    # optional volume 0 to 1.0
    mixer.music.set_volume(0.9)

def play_mid(file):
    if mixer.music.get_busy():
        mixer.music.fadeout(1000)
        mixer.music.stop() 
    clock = pygame.time.Clock()
    try:
        mixer.music.load(file)
    except:
        print(traceback.format_exc())
    mixer.music.play()
    while mixer.music.get_busy():
        clock.tick(30)

# 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 play_mid.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() not in ('.mid','.mp3'):
    print('ext is not (.mid , .mp3)')
    sys.exit(2)

time1 = time.time()
print(f1)
mixer_init()
try:
    play_mid(f1)
except KeyboardInterrupt as ex:
    # if user hits Ctrl+C then exit
    # (works only in console mode)
    mixer.music.fadeout(1000)
    mixer.music.stop()
    raise SystemExit from ex
mixer.music.stop()
time2 = time.time()
print("run time: %.3f s" % (time2-time1))

运行 python play_mid.py test1.mid

详细参阅:Python编曲实践(一):通过Mido和PyGame来编写和播放单轨MIDI文件

MidiEditor 打开 test1.mid 文件

Mac python2.7创作mid音乐文件 # 写文章初衷:   设计学生毕设想做一个音乐交互装置。简单来说,就是把图片变成音乐。   在完成了摄像头的拍摄和OpenCV的视觉识别之后(有时间的话之后再补这一块的代码),发现不知道如何将图片的信息转换成相应的音乐。   因为想使用树莓派,在搜索了很多的python库之后,找不到能够很好的将数组转换成对应音乐的代码。   接下来的部分,罗列了我使用过的库和相应的使用体验,以及我最后的使用方法。... 阅读详情

相关推荐

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

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

qm5132的博客 2040

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

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

东方佑 928

电脑版-MIDI简谱播放器 v2.0软件分享

它将传统简谱与 MIDI 技术结合,适合音乐教育、个人创作、MIDI 入门学习等场景。通过支持多音轨、MIDI 导入、图片导出等功能,极大地拓展了简谱的应用边界。它支持将数字简谱实时转换为 MIDI 音乐播放,并提供了 MIDI 文件导入、简谱图片导出、多音轨合成等专业功能。下方输入简谱内容,支持 1 2 3 4 5 6 7、#、'、.、-、[ ]、( ) 等语法。C、C#、D、D#、E、F、F#、G、G#、A、A#、B 大调。简谱语法 支持升降号、八度标记、时值延长、音符组、休止符等。

qq_32257509的博客 274

chatgpt赋能Python-python_mido

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

shengcaiy123的博客 560

用深度学习生成MIDI乐谱:事件序列建模与工程实践

音乐生成是人工智能与数字音频交叉的热门方向,核心思路并非直接合成波形,而是将乐谱抽象为离散事件序列。借助深度学习中的序列表征能力,从音符、力度到时间偏移都可以转化为token,让模型学习音乐的内在结构与风格规律。这种符号化生成方式具备极强的可控性,广泛应用于AI作曲辅助、伴奏生成与自动化和声编排等场景。针对具体任务,还需要解决词表设计、采样策略和轨道分离等工程问题。midiGenerator正是这一技术路线的典型实践,通过将MIDI文件解析为结构化事件并训练序列模型,能够生成可编辑、可播放的乐谱文件,为音乐

weixin_34348174的博客 409

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和PyGame来编写和播放单轨MIDI文件

使用Python通过Mido来进行MIDI单音轨编曲,通过PyGame.midi模块来播放MIDI音乐,示例音乐为《大海啊,故乡》,希望通过这一次探索来为AI编曲奠定基础。

_ 1万+

C#实战:如何用TSCLIB.dll实现TSC打印机的状态监控与异常处理(附完整代码)

本文详细介绍了如何利用C#和TSCLIB.dll构建企业级TSC打印机状态监控与智能异常处理系统。通过解析十六进制状态码、设计高可靠性的轮询引擎以及实现事件驱动的报警机制,开发者可以打造一个稳定、可观测的打印服务,有效保障物流仓储、生产制造等高频打印场景的业务连续性。

weixin_29227585的博客 64

Mido:Python MIDI编程的终极入门指南

Mido是一个功能强大的Python库,专为处理MIDI消息和端口而设计。无论你是音乐爱好者、程序员还是音乐技术探索者,Mido都能帮助你轻松创建、解析和发送MIDI数据,开启你的音乐编程之旅。 ## 什么是MIDI?为什么选择Mido? MIDI(Musical Instrument Digital Interface)是一种电子音乐设备之间通信的标准协议。它允许计算机、合成器、打击垫等设备

gitblog_00548的博客 997

VS Code ESP-IDF无法找到源文件、头文件波浪线解决

背景:想要编译小智AI项目,可以正常编译。但是一些头文件,例如#include <nvs.h>等无法找到。

Hot_Ant的博客 1490

CloudCompare横截面工具实战:从点云切片到轮廓提取的完整流程

本文详细介绍了CloudCompare软件中Cross Section工具的核心功能与实战流程。从交互式裁剪框的精准操控,到包络线提取的参数设置与优化,再到内部轮廓提取及批量处理技巧,完整解析了如何从三维点云中高效提取建筑立面、隧道断面等关键轮廓信息,是点云数据处理与分析的实用指南。

weixin_29290963的博客 284

perl:用 MIDI::Simple 生成midi文件,用 pygame 播放 mid文件

perl use MIDI::Simple 生成midi文件,用 pygame 播放 mid文件

belldeep的专栏 680

【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1314

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

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

_ 1万+

YOLO26涨点改进 | 全网独家,注意力创新改进篇 | Arxiv2025 | YOLO26引入MSLA多尺度线性注意力模块,高效提取多尺度特征和建模长程依赖,含多种创新改进,助力有效涨点

本文提出了一种多尺度线性注意力模块(MSLA)来优化YOLO26模型。MSLA通过并行使用不同尺寸的深度可分离卷积(3×3至9×9)提取多尺度特征,并结合线性注意力机制高效建模全局依赖关系。该模块显著提升了模型对多尺度目标的检测能力,同时保持了轻量化特性。实验表明,MSLA能有效增强小目标检测和复杂场景下的分割精度。文章详细介绍了MSLA的网络结构、核心优势及实现代码,并提供了两种集成MSLA的YOLO26改进方案,为实时目标检测任务提供了高效解决方案。

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

大聪明教你学Java | Seata 2.5 从下载到运行:全流程编译部署教程

Seata 2.5 版本带来了不少特性优化,但实际部署时却发现一个尴尬问题:全网找不到一篇完整覆盖「Git 源码下载→本地编译→环境配置→启动验证」的实操教程。作为一名踩遍无数坑才成功跑通的开发者,我深知这个过程的煎熬:Git 拉取源码后编译失败、依赖版本冲突、配置文件参数混乱、启动时端口占用或连接报错… 每一个坑都能耗费数小时排查。为了让后续开发者少走弯路,我将自己从0到1的完整实操经验整理成文,跟着步骤走即可成功运行 Seata 2.5.

不肯过江东丶 2071

【亲测免费】 开源项目Mido: MIDI处理库的指南与问题解答

**基础介绍** Mido([MIDI Objects for Python](https://github.com/mido/mido)***) 是一个专为Python设计的MIDI消息及端口处理库。它提供了一套方便的消息对象,支持与RtMidi、PortMidi和Pygame等后端交互,并且非常易于扩展以支持新的后端。利用Mido,开发者可以轻松地读写MIDI文件,发送接收MIDI消息,以及进...

gitblog_00540的博客 1216

汽车电子零部件(14):TMS热管理系统

TMS(thermal management system)热管理系统,这是新能源汽车诞生后随之而产生的一种新汽车零部件,一旦热管理失控会触发自燃,这种现象也是对EV来说是件头疼的事。汽车的热管理系统(TMS)是一个关键部件,有助于调节汽车电池组、车厢和其他车辆系统的温度。TMS的主要目的是在驾驶过程中保持最佳的电池性能和乘客舒适度。TMS使用各种加热和冷却系统来调节电池组和车厢的温度,并通过优化其使用,降低能耗,提高车辆的整体效率。

码农17年的博客 3161

Mido:用 Python 处理 MIDI,这一套就够了

Mido是一个功能强大的Python MIDI处理库,它简化了MIDI协议操作的复杂性。该库提供了统一的对象模型和端口API,支持创建和修改MIDI消息、读写MIDI文件、处理硬件输入输出等功能。Mido采用模块化设计,支持多种后端驱动(如RtMidi、PortMidi等),并实现了网络MIDI传输。安装简便,兼容Python 3.7+,附带命令行工具,适合开发音乐相关应用。其MIT许可证和活跃的社区支持使其成为Python处理MIDI的理想选择。

dongxilou269的博客 387

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Python MIDI编程神器Mido:从零开始构建音乐应用的全栈指南

在数字音乐创作和音频编程的世界中,Python开发者常常面临一个挑战:如何优雅地处理MIDI协议,将音乐理论与代码逻辑完美结合?Mido作为Python生态中专业的MIDI对象库,为这个难题提供了优雅的解决方案。无论你是音乐技术爱好者、音频应用开发者,还是想要探索音乐与代码结合的程序员,Mido都能让你以Pythonic的方式掌控MIDI世界。 ## 为什么Python开发者需要专业的MIDI处

gitblog_00265的博客 260

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

用Python代码写首《本草纲目》

大家好,我是宁一。 最近我的私人教练总是被黑。 人家厚积薄发,一周直播五次,实打实的带着大家锻炼,这都可以挑刺。 作为刘畊宏女孩,咱必须要支棱起来!! 也没啥其他技能,就用Python写首《本草纲目》给刘教练应援一下吧! 没错,Python不仅可以做数据分析,还可以用来写歌。 绝绝子! 用的是Python的mido库,先来测试几个音。 #导入mido库 from mido import Message, MidiFile, MidiTrack #创建.mid文件 mid = MidiFile()

腾讯云云开发布道师,慕课网合作讲师 3883

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

MIDI播放器新代码4-2026-8-15-11

本文介绍了一个基于Tkinter的MIDI文件播放器应用,支持系统默认音色和自定义音色库两种播放模式。主要功能包括:1) 通过pygame播放系统默认音色;2) 使用fluidsynth加载自定义SoundFont音色库;3) 提供音色切换功能(0-273);4) 音量调节和播放控制。程序采用多线程处理播放任务,避免阻塞UI,并支持Windows/Linux/macOS平台。该播放器特别适合需要测试不同MIDI音色的场景,界面简洁易用,包含文件浏览、播放状态显示和错误提示等功能。

qq_32257509的博客 193

# 发散创新:用Python构建基于规则的音乐生成系统 在人工智能与创意产业融合日益紧密的今天,**音乐生成不

方面 | AI生成 | 规则驱动 || 可解释性 | ❌ 黑箱 | ✅ 明确逻辑 || 控制精度 | ⚠️ 需训练 | ✅ 直接编程 || 快速迭代 | ❌ 慢 \ ✅ 几分钟改完 || 教学价值 | 一般 | ⭐⭐⭐⭐⭐ |这种架构非常适合教学场景、实验项目甚至嵌入式设备(如树莓派+扬声器)。你可以轻松地把它变成一个“按按钮生成不同风格旋律”的互动装置。📌建议下一步探索方向添加调式切换功能(大调→小调)引入循环结构(主歌-副歌)接入物理按钮或Arduino作为输入源。

aichiyv1234的博客 22

# 发散创新:用Python构建基于规则的音乐生成系统 在人工智能与创意产业融合日益紧密的今天,**音乐生成不再只是黑盒模型的专利**

self.pitch = pitch # MIDI编号 (60=C4)self.duration = duration # 秒数return f"

nihao2025123的博客 37
上一篇: clang:在 Win10 上编译 MIDI 音乐程序(一)
下一篇: python:music21 show() how to 调用 MuseScore3
belldeep
博客等级 码龄20年 1820粉丝 584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值