美文网首页
python 解析 MIDI 文件并生成 MIDI 文件

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

作者: 孙庚辛 | 来源:发表于2020-08-22 16:55 被阅读0次

以下程序将 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')


相关文章

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

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

  • Python | 读取 midi 文件

    这个真的是费了好大好大好的的劲才弄出来。。。 格式 头区块 (Head Chunk) 头区块字符长度 一般为 6 ...

  • 播放Midi文件

    播放midi文件,将谱子在钢琴面上展示出来1.midi文件列表,都是网上找来的,我不懂音乐 2.播放界面

  • 啷个哩个啷

    今天开始玩miditrail 网站:midishow此网站MIDI资源较多,并且更新频率较高,MIDI文件比较容易...

  • MIDI文件格式解析

    MIDI文件由两部分构成:Header Chunk(MThd)+ Track Chunk(MTrk) “Chunk...

  • PowerPoint 2013-2016、PowerPoint

    PowerPoint 支持的音频文件格式: AIFF 音频文件:.aiff AU 音频文件:.au MIDI 文件...

  • Android 节奏大师游戏开发

    制作一款音乐应用仿节奏大师, 1.选择 MIDI 音乐文件解析2.选择 OpenGL 绘制界面 一、Android...

  • 基于keras的人工作曲代码积累

    utils.py 包含的函数有 def convert_midi_to_mp3():: 将神经网络生成的MIDI文...

  • 如何看懂一份MIDI文件

    前言 MIDI 文件是在做音乐应用时,很可能会遇到的一种文件格式。Github上面有相关的类库,可以用来解析MID...

  • MIDI文件格式分析

    MIDI文件属于二进制文件,这种文件一般都有如下基本结构: 文件头+数据描述。 文件头一般包括文件的类型,因为Mi...

网友评论

      本文标题:python 解析 MIDI 文件并生成 MIDI 文件

      本文链接:https://www.haomeiwen.com/subject/gmbvjktx.html