跳转到主要内容

用于处理标准MIDI文件的Python工具包

项目描述

miditk-smf

用于处理标准MIDI文件的Python工具包

快速入门

安装

pip install miditk-smf

用法

from miditk.smf import MidiFileWriter

# Open file for writing in binary mode.
with open('minimal.mid', 'wb') as smf:
    # Create standard MIDI file writer.
    midi = MidiFileWriter(smf)

    # Write file and track header for Type 0 file, one track, 96 pulses per
    # quarter note (ppqn). These are also the default parameter values.
    midi.header(format=0, num_tracks=1, tick_division=96)
    midi.start_of_track()

    # Set tempo to 120 bpm in µsec per quarter note.
    # When no tempo is set in the MIDI file, sequencers will generally assume
    # it to be 120 bpm.
    midi.tempo(int(60_000_000 / 120))

    # Add MIDI events.
    midi.note_on(channel=0, note=0x40)
    # Advance 192 ticks (i.e. a half note).
    midi.update_ticks(192)
    midi.note_off(channel=0, note=0x40)

    # End track and midi file.
    midi.end_of_track()
    midi.eof()

更多示例,请参阅下面的用法示例部分。

概述

miditk-smf是一个通用库,用于解析和生成标准MIDI文件(SMF)。该包是位于公共顶级包命名空间miditk下的几个计划包的一部分。此包主要提供miditk.smf子包以处理标准MIDI文件。未来可能会开发和分发带有更多专业MIDI库和工具的附加子包,作为单独的包分发。

兼容性

miditk-smf与(C)Python >= 3.8和PyPy 3兼容。

安装

miditk-smf可以通过从pip安装Python包索引

pip install miditk-smf

它提供为源代码分发和适用于所有支持的Python版本和操作系统的通用Python wheel。它仅依赖于Python标准库。

包内容

miditk.common:

用于子包和通用数据类型的MIDI规范常量集合,用于处理MIDI事件。

miditk.smf:

基于事件的通用MIDI文件(SMF)解析和生成框架。

miditk.smf.api:

基本事件处理类,可以用于特殊事件处理的子类。

miditk.smf.converters:

将MIDI文件中使用的特殊数据类型转换为字节字符串和从字节字符串转换的函数集合。

miditk.smf.parser:

主要的二进制MIDI文件数据解析器。

miditk.smf.reader:

将解析器与事件处理类结合。

miditk.smf.sequence:

一个事件处理程序,它将MIDI文件中的所有MIDI事件存储在MidiSequence容器类中。

miditk.smf.writer:

将MIDI事件写入标准MIDI文件的事件处理程序。

使用示例

以下部分包含一些代码示例,演示了该包中不同模块的几个使用场景。更多示例请参阅源代码分发目录中的示例目录。

解析标准MIDI文件

miditk.smf模块提供了MidiSequence容器类,该类使用自己的MIDI事件处理类来收集解析midi文件的所有信息和事件。使用MidiSequence.fromfile()类方法解析标准MIDI文件。

然后,您可以使用返回的MidiSequence实例的几个便利方法来访问关于midi文件属性或事件的详细信息。

from miditk.smf import MidiSequence

# Do parsing
sequence = MidiSequence.fromfile(sys.argv[1])

# Print some info from the MIDI file header,
# e.g. number of tracks, events sequence name.
print(sequence)
# Print a list of events with event type, data and timestamp.
sequence.dump_events()

# Iterate over all sysex events in track 0.
# If track is not specified, sysex_events() yields all sysex events
# in all tracks.
for ev in sequence.sysex_events(track=0):
    print("Sysex event ({} bytes) @ {:.2f}".format(len(ev.data), ev.timestamp))

# Iterate over all events sorted by timestamp and then track.
for time, group in sequence.events_by_time():
    for ev in group:
        handle_event(ev)

流中更改MIDI事件

基于事件的解析允许在读取时(或通过MIDI输入接收)处理MIDI事件。您需要定义miditk.smf.BaseMidiEventHandlermiditk.smf.NullMidiEventHandler的子类,并仅覆盖您感兴趣的事件的事件处理方法。

以下示例将所有音符开启/关闭事件转换了一个八度(即12个半音)

import sys
from miditk.smf import MidiFileReader, MidiFileWriter

# MidiFileWriter is a sub-class of NullMidiEventHandler.
class Transposer(MidiFileWriter):
    """Transpose note values of all note on/off events by 1 octave."""

    def note_on(self, channel, note, velocity):
        super().note_on(self, channel, min(127, note + 12), velocity)

    def note_off(self, channel, note, velocity):
        super().note_off(self, channel, min(127, note + 12), velocity)

infile = sys.argv.pop(1)
outfile = sys.argv.pop(1)

# Create the parser and event handler
with open(outfile, 'wb') as smf:
    midiout = Transposer(smf)
    midiin = MidiFileReader(infile, midiout)

    # Now do the processing.
    midiin.read()

开发

克隆Git仓库

git clone https://github.com/SpotlightKid/miditk-smf.git
cd miditk-smf

安装tox

pip install tox

或通过您的Linux发行版软件包管理器,例如在debian/Ubuntu上

sudo apt-get install python-tox

或在Arch Linux上

sudo pacman -S python-tox

通过tox运行测试,以配置在tox.ini中的所有Python版本

tox

如果一切顺利,创建一个新的git分支,开始开发,然后通过在GitHub上打开pull请求来贡献您的更改。

代码质量保证

包含的Makefile已设置为运行多个Python静态代码检查和报告工具。要打印可用的Makefile目标和它们运行的工具的列表,只需运行

make

然后运行您选择的Makefile目标,例如

make flake8

除非另有说明,否则这些目标将直接运行所有工具,即不使用tox,这意味着它们需要在您的Python环境中安装。您可以使用[hatch]创建用于一般开发任务的虚拟环境或用于特定任务的虚拟环境,例如构建文档。在创建时,将自动将这些环境中的依赖项和工具安装到这些环境中

要显示定义的特殊环境

hatch env show

创建并进入例如“dev”环境

hatch --env dev shell

文档

包文档由Sphinx生成。文档可以通过以下方式构建

make docs

构建成功后,您的网络浏览器将打开文档索引。

作者和许可证

miditk包由Christopher Arndt编写,并许可在MIT许可证下。

《miditk.smf》子包的结构灵感来源于由Python Midi [^1]包,该包由maxm@maxm.dk编写。

[^1]: 原始网站,现已失效:http://www.mxm.dk/products/public/pythonmidi/

项目详情


下载文件

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

源代码分发

miditk_smf-0.3.1.tar.gz (40.8 kB 查看哈希值)

上传时间: 源代码

构建分发

miditk_smf-0.3.1-py3-none-any.whl (29.3 kB 查看哈希值)

上传时间: Python 3

支持