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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
10 2
|
8天前
|
算法 Python
Python 大神修炼手册:图的深度优先&广度优先遍历,深入骨髓的解析
在 Python 编程中,掌握图的深度优先遍历(DFS)和广度优先遍历(BFS)是进阶的关键。这两种算法不仅理论重要,还能解决实际问题。本文介绍了图的基本概念、邻接表表示方法,并给出了 DFS 和 BFS 的 Python 实现代码示例,帮助读者深入理解并应用这些算法。
19 2
|
8天前
|
存储
文件太大不能拷贝到U盘怎么办?实用解决方案全解析
当我们试图将一个大文件拷贝到U盘时,却突然跳出提示“对于目标文件系统目标文件过大”。这种情况让人感到迷茫,尤其是在急需备份或传输数据的时候。那么,文件太大为什么会无法拷贝到U盘?又该如何解决?本文将详细分析这背后的原因,并提供几个实用的方法,帮助你顺利将文件传输到U盘。
|
10天前
|
开发者 Python
Python中__init__.py文件的作用
`__init__.py`文件在Python包管理中扮演着重要角色,通过标识目录为包、初始化包、控制导入行为、支持递归包结构以及定义包的命名空间,`__init__.py`文件为组织和管理Python代码提供了强大支持。理解并正确使用 `__init__.py`文件,可以帮助开发者更好地组织代码,提高代码的可维护性和可读性。
13 2
|
17天前
|
测试技术 开发者 Python
深入浅出:Python中的装饰器解析与应用###
【10月更文挑战第22天】 本文将带你走进Python装饰器的世界,揭示其背后的魔法。我们将一起探索装饰器的定义、工作原理、常见用法以及如何自定义装饰器,让你的代码更加简洁高效。无论你是Python新手还是有一定经验的开发者,相信这篇文章都能为你带来新的启发和收获。 ###
12 1
|
17天前
|
设计模式 测试技术 开发者
Python中的装饰器深度解析
【10月更文挑战第24天】在Python的世界中,装饰器是那些能够为函数或类“添彩”的魔法工具。本文将带你深入理解装饰器的概念、工作原理以及如何自定义装饰器,让你的代码更加优雅和高效。
|
26天前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。
|
27天前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
66 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0

推荐镜像

更多