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分音符的ticks;1为SMPTE格式计时,后面的数值则是定义每秒中SMTPE帧的数量及每个SMTPE帧的tick
Mido
一、使用指导:
通过pip命令安装:
pip install mido
推荐使用清华镜像源:
pip install mido -i https://pypi.tuna.tsinghua.edu.cn/simple
使用前import mido
即可
二、打开
通过
mid=mido.MidiFile(“绝对路径或同目录下文件名”)
打开指定midi文件
每个音轨单独读取指令为`
track_n=mido.MidiTrack(mid.tracks[n])
(n从0开始)
track.name
可直接获取音轨名称,每个消息可按照下标单个读取
同时MidiTrack()
和MidiFile()
也可用作新音轨和新文件新建命令
三、遍历读取
示例代码:
import mido
mid = mido.MidiFile(“test.mid”)
for i, track in enumerate(mid.tracks):#enumerate():创建索引序列,索引初始为0print('Track {}: {}'.format(i, track.name))for msg in track:#每个音轨的消息遍历print(msg)
每个midi文件由多个音轨组成,mido称音轨为Track,其中Track 0 一般是全局音轨,其后跟随演奏音轨。
每个音轨包含若干条消息,消息可解释为相应音符,一般在全局音轨中放置元消息(mate massages)来指定mid文件的相关参数(速度/音轨数等)
mid.length=(以秒为单位的演奏总长度,float)
mid.type=(此midi文件类型)
.is_mate
可以返回判定是否是元消息
消息相关:
Message(type,note=60,velocity=96,time=480)
消息设定代码(示例)
track.append(mido.Message(type,note=60,velocity=96,time=480))
type 这个参数确定信号的类型(str)。基本的为note_on作为音符开始,note_off作为音符终止。
note 这个参数确定音符的音高。60代表中央C,每增加12,音高升高一个八度。
velocity 这个参数确定音符的音量。0表示静音,127表示最大音量。
time 这个参数确定消息所在的时间。这个时间以tick为单位,而在mido的默认配置中,1拍中有480个tick。所以要想生成一个长度为1拍的音符,应该设置其time值为480,而不是1。
注:time用480*n来表示会比较省力
另注:time是指这条消息与上一条消息的时间差(结尾对结尾)
四、参数设置
A音色
track.append(mido.Message('program_change', program=1, time=0))
其中,program参数确定了这个音轨的音色。
另注:除了打击乐通道以外,音色的默认值为Piano 1。
B曲速
track.append(mido.MetaMessage('set_tempo', tempo=500000, time=0))
其中,tempo参数确定了乐曲的速度。
tempo 值的含义是每一拍为多少微秒。500000表示每一拍为0.5秒(1us=1e6s),即每分钟120拍。bpm和tempo的换算公式为
bpm=(6×10^7)/tempo
C设置音轨名称
音轨名称
track.append(mido.MetaMessage('track_name', name='Piano', time=0))
其中,name参数确定了音轨的名称。
五、文件保存
mid.save(‘路径’)
MIDI文件基础及使用Python库mido操作MIDI文件相关推荐
- python分析pcap文件_利用Python库Scapy解析pcap文件的方法
每次写博客都是源于纳闷,python解析pcap这么常用的例子网上竟然没有,全是一堆命令行执行的python,能用吗?玩呢? pip安装scapy,然后解析pcap: import scapy fro ...
- python库——h5py读取h5文件
h5py读取h5文件 h5文件像文件夹一样,可以在组里新建子组,最后子组里新建dataset 现在我们来读取h5文件中的各级组名称和dataset #打开文件 f = h5py.File('E:\PI ...
- python中读取文件内容-深入学习python解析并读取PDF文件内容的方法
这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...
- python读取pdf文件_深入学习python解析并读取PDF文件内容的方法
这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...
- python解压到指定文件夹_在Python中压缩和解压文件
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 如果你已经使用计算机一段时间,你可能遇到了.zip扩展名的文件.它们是可以保存许多其他文件,文件夹和子文件 ...
- python 文档操作_Python 文件操作
一. Python 读写 创建文件 Python中对文件,文件夹(文件操作函数)的操作需要涉及到OS 模块和 shutil 模块 . 一) . OS模块 的基本操作 方法 功能 os.getcwd() ...
- python 文件上传下载,python实现上传下载文件功能
最近刚学python,遇到上传下载文件功能需求,记录下! django web项目,前端上传控件用的是uploadify. 文件上传 - 后台view 的 Python代码如下: @csrf_exem ...
- python的写操作_Python—文件读写操作
初识文件操作 使用open()函数打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了,根据打开文件的方式不同能够执行的操作也会有相应的差异. 打开文件的方式: r, w, a, ...
- python的open打开中文文件_Python笔记 —— 使用open打开和操作txt文件
打开:有两种方式 with open(r"data.txt", "r", encoding="utf-8") as f: f = open( ...
- python文件读写用到的库_python 读写txt文件并用jieba库进行中文分词
python用来批量处理一些数据的第一步吧. 对于我这样的的萌新.这是第一步. #encoding=utf-8 file='test.txt'fn=open(file,"r")pr ...
最新文章
- android中文字中间有超链接的实现方法
- java lamdba表达式效率_java8新特性Lambda表达式为什么运行效率低
- 在linux系统JDK安装中文字体
- 前端工程构建工具——Yeoman
- JS之 if语句函数 对接事件动作 函数更改css css对接需要换妆的区id或class
- JavaScript学习随记——对象
- 天气预报API接口 : 城市对应码(中国天气网)
- python两个数组合并、找出中位数_leetcode刷题记录-找出这两个有序数组的中位数(python版本)...
- windows server 2008 r2 x64 enterprise service pack1中aspjpeg.dll安装
- 函数参数中的中括号代表什么
- 状态空间模型与传递函数的转换关系+例题
- 学习MyBatis-Plus
- QT修改QPushButton的背景色和文字颜色
- htb_Escape (mssql渗透,winrm)
- JAVA中 什么是方法签名?what is method signature in java
- 实验吧-密码学(三)
- 怎么把HTML文件拉出来,怎么把网页HTML格式的文件
- Microsoft Excel 教程:如何在 Excel 中使用 XLOOKUP 函数?
- 单片机多功能电子琴课设_基于51单片机的电子琴设计
- 一文读懂马云、马化腾、李彦宏、库克等互联网大佬们都在乌镇干了啥