跳转到主要内容

A python 3 library for reading, writing and modifying midi files

项目描述

mxm.midifile是一个用于读取、写入和操作midi文件的Python包
=================================================================================

我创建mxm.midifile是为了使Python中读取和写入midi文件尽可能像Pythonic、简单和直接。它不处理实时midi数据,也没有计划扩展代码来处理。它是为Python 2.x重写的旧“midi”项目的完全重写。

我在大约7000个我在网上能找到的midi文件上测试了代码。它在解析方面很严格,不允许非法值,而野外midi文件中有些非法值。大约2%-3%的文件解析失败。其中大部分文件也无法在Windows媒体播放器中打开。其余的失败是因为非法值,如255的音符值。

我修复了我代码中能找到的所有解析错误。如果您发现任何错误,请告诉我。

Max M - maxm@mxm.dk


安装
------------

pip install mxm.midifile

编写midi文件
-------------------

如果您想*编写*midi文件,最简单的方法是

from mxm.midifile import MidiOutFile
out_file = open('file-generated.mid', 'wb')
midi = MidiOutFile(out_file)

midi.header(format=0, nTracks=1, division=96)
midi.start_of_track()

注:开启
midi.update_time(0)
midi.note_on(0, 0x40, 0x64)

一栏后关闭note
midi.update_time(96*4)
midi.note_off(0, 0x40, 0x40)

midi.update_time(0)
midi.end_of_track()


读取midi文件
-------------------

如果您想 *读取* 一个MIDI文件,最简单的方法是使用MidiToCode类。当MidiToCode从midi解析器获取midi事件时,它会打印出如果使用python代码通过mxm.midifile生成的事件会是什么样子。

from mxm.midifile import MidiInFile, MidiToCode
test_file = testdir('file-generated.mid')
midiIn = MidiInFile(MidiToCode(), test_file)
midiIn.read()

这将打印出

"""
midi = MidiOutFile('file.mid')

midi.header(format=0, nTracks=1, division=96)
midi.start_of_track()

注:开启
midi.update_time(0)
midi.note_on(0, 0x40, 0x64)

一栏后关闭note
midi.update_time(384)
midi.note_off(0, 0x40, 0x40)

midi.update_time(0)
midi.end_of_track()
"""

这本身并不很有用,但我发现,将MIDI文件转换为这样的代码,可以大大简化理解MIDI文件和使用这个库的方法。它基本上将任何MIDI轨道转换成了一个示例。此外,您还可以将打印的输出保存为.py文件。当您运行它时,它将生成一个MIDI文件

读取、更改并保存为新的MIDI文件
-----------------------------------------------

如果您想做一些有用的事情,比如转调MIDI文件中的音符,您必须创建"MidiOutFile"的子类,并重写一些方法以满足您的需求。

class Transposer(MidiOutFile)

"将所有音符通过'delta'半音转调"

delta = 24

def _transp(self, ch, note)
if ch != 9: # 不是鼓声!
if 0 <= (note+self.delta) <= 127: # 不转调出MIDI范围
note += self.
return note

def note_on(self, channel=0, note=0x40, velocity=0x40, use_running_status=False)
note = self._transp(channel, note)
MidiOutFile.note_on(self, channel, note, velocity, use_running_status)

def note_off(self, channel=0, note=0x40, velocity=0x40, use_running_status=False)
note = self._transp(channel, note)
MidiOutFile.note_off(self, channel, note, velocity, use_running_status)

in_file = exampledir('file.mid')
out_file = exampledir('file-transposed.mid')

midi_out = Transposer(out_file)
midi_in = MidiInFile(midi_out, in_file)
midi_in.read()


"src/midi_events.py"中的"MidiEvents"类是所有可以重写的用于您自己类的完整文档。它也是您必须创建子类以进行有用工作的类。

"src/midi_to_code.py"中的"MidiToCode"类是一个很好的简单示例,说明了如何为您自己的目的创建MidiEvents的完整子类。

mxm.midifile只读取和写入MIDI文件。在创建您自己的MIDI文件时,必须遵守一些规则。mxm.midifile不会为您做这些。因此,使用它可能创建出有问题的MIDI文件。如果您不确定,实际使用"MidiToCode"来分析一些好的MIDI文件并查看它们是如何做到的,这可能是有用的。

如果有兴趣,我将考虑创建一个"SafeMidiOutFile"类,这将有助于避免写入有问题的MIDI文件。

示例
--------

"examples"目录中有更多示例。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

mxm.midifile-1.1.tar.gz (43.9 kB 查看哈希)

上传时间

支持