python 解析 MIDI 文件并生成 MIDI 文件

简介: python 解析 MIDI 文件并生成 MIDI 文件

以下程序将 midi 文件解析出来, 并利用解析出来的音符重新生成一个一样的 midi 文件。

import mido
import sys
import json
def midifile_to_dict(mid):
    tracks = []
    for track in mid.tracks:
        tracks.append([vars(msg).copy() for msg in track])
    return {
        'ticks_per_beat': mid.ticks_per_beat,
        'tracks': tracks,
    }
mid = mido.MidiFile("Pianoboy-你离开的事实_爱给网_aigei_com.mid", clip=True)
dict_mid = midifile_to_dict(mid)
json_mid = json.dumps(dict_mid, indent=2)
print(json_mid)
track0 = (dict_mid["tracks"])[0]
track1 = (dict_mid["tracks"])[1]
track2 = (dict_mid["tracks"])[2]
######### EXTRACT MUSIC DATA FROM THE TWO MAIN TRACKS ##########
on_off1=[]
note1_on=[]
note1_off=[]
velocity1_on=[]
velocity1_off=[]
time1_on=[]
time1_off=[]
on_off2=[]
note2_on=[]
note2_off=[]
velocity2_on=[]
velocity2_off=[]
time2_on=[]
time2_off=[]
for i, msg in enumerate(track1):
    if msg["type"] is "note_on":
        on_off1.append(1)
        note1_on.append(msg["note"])
        velocity1_on.append(msg["velocity"])
        time1_on.append(msg["time"])
    if msg["type"] is "note_off":
        on_off1.append(0)
        note1_off.append(msg["note"])
        velocity1_off.append(msg["velocity"])
        time1_off.append(msg["time"])
for i, msg in enumerate(track2):
    if msg["type"] is "note_on":
        on_off2.append(1)
        note2_on.append(msg["note"])
        velocity2_on.append(msg["velocity"])
        time2_on.append(msg["time"])
    if msg["type"] is "note_off":
        on_off2.append(0)
        note2_off.append(msg["note"])
        velocity2_off.append(msg["velocity"])
        time2_off.append(msg["time"])
######### CREATE NEW MIDI FILE ############
outfile = mido.MidiFile()
outtrack0 = mid.tracks[0]
outtrack1 = mido.MidiTrack()
outtrack2 = mido.MidiTrack()
outfile.tracks.append(outtrack0)
outfile.tracks.append(outtrack1)
outfile.tracks.append(outtrack2)
for i in range(len(on_off1)):
    if on_off1[i]:
        outtrack1.append(mido.Message('note_on', note=note1_on.pop(0), velocity=velocity1_on.pop(0), time=time1_on.pop(0)))
    else:
        outtrack1.append(mido.Message('note_off', note=note1_off.pop(0), velocity=velocity1_off.pop(0), time=time1_off.pop(0)))
for i in range(len(on_off2)):
    if on_off2[i]:
        outtrack2.append(mido.Message('note_on', note=note2_on.pop(0), velocity=velocity2_on.pop(0), time=time2_on.pop(0)))
    else:
        outtrack2.append(mido.Message('note_off', note=note2_off.pop(0), velocity=velocity2_off.pop(0), time=time2_off.pop(0)))
outfile.save('createtest.mid')



目录
相关文章
|
1天前
|
存储 JSON 数据库
Python中列表数据的保存与读取:以txt文件为例
Python中列表数据的保存与读取:以txt文件为例
14 2
|
1天前
|
存储 NoSQL MongoDB
MongoDB数据库转换为表格文件的Python实现
MongoDB数据库转换为表格文件的Python实现
22 0
|
1天前
|
Shell Python
Python Stock guess_indicators_daily_job.py文件的调整
Python Stock guess_indicators_daily_job.py文件的调整
14 1
|
1天前
|
XML 前端开发 数据格式
BeautifulSoup 是一个 Python 库,用于从 HTML 和 XML 文件中提取数据
【5月更文挑战第10天】BeautifulSoup 是 Python 的一个库,用于解析 HTML 和 XML 文件,即使在格式不规范的情况下也能有效工作。通过创建 BeautifulSoup 对象并使用方法如 find_all 和 get,可以方便地提取和查找文档中的信息。以下是一段示例代码,展示如何安装库、解析 HTML 数据以及打印段落、链接和特定类名的元素。BeautifulSoup 还支持更复杂的查询和文档修改功能。
21 1
|
1天前
|
Python
Python知识点——文件和数据格式化
Python知识点——文件和数据格式化
5 0
|
1天前
|
存储 JSON 安全
Python中的文件操作与文件IO操作
【5月更文挑战第14天】在Python中,文件操作是常见任务,包括读取、写入和处理文件内容。`open()`函数是核心,接受文件路径和模式(如'r'、'w'、'a'、'b'和'+')参数。本文详细讨论了文件操作基础,如读写模式,以及文件IO操作,如读取、写入和移动指针。异常处理是关键,使用`try-except`捕获`FileNotFoundError`和`PermissionError`等异常。进阶技巧涉及`with`语句、`readline()`、`os`和`shutil`模块。数据序列化与反序列化方面,介绍了
13 0
|
1天前
|
Python
Python代码扫描目录下的文件并获取路径
【5月更文挑战第12天】Python代码扫描目录下的文件并获取路径
14 1
|
1天前
|
Python
python如何读取excel文件,并修改内容?
python如何读取excel文件,并修改内容?
7 0
|
1天前
|
Unix Linux 数据处理
使用Python批量复制文件夹及其子文件夹下的指定文件
使用Python批量复制文件夹及其子文件夹下的指定文件
14 1
|
1天前
|
Python
Python自动化办公实战案例:文件整理与邮件发送
Python自动化办公实战案例:文件整理与邮件发送
8 0

推荐镜像

更多