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是为了使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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fbb5a87d6434bb12f0b08dacb67ed86274033bc5cc373e27fdefce11b057cd0e |
|
MD5 | 964d8f378bd65c32c055d217f2b5d068 |
|
BLAKE2b-256 | 2d58e72eb4044a31c273f0294a10ec62f90042883134e585aae35c42159e08d1 |