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

miditk-smf的Python项目详细描述


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

快速启动

安装:

$ pip install miditk-smf

用法:

frommiditk.smfimportMidiFileWriter# Open file for writing in binary mode.withopen('minimal.mid','wb')assmf:# 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(60000000/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()

有关更多示例,请参见下面的Usage examples部分。

概述

miditk-smf是用于分析和生成 标准MIDI文件(SMF)。该包是几个计划包的一部分 在公共顶级包命名空间miditk下。这个包裹主要是 提供用于处理标准MIDI文件的miditk.smf子包。 附加的带有更专业midi库和工具的子包将是 以后作为单独的包分发版分发。

兼容性

miditk-smf适用于python 2.7、python 3.4+和pypy2和py3。

安装

miditk-smf可通过pipPython Package Index安装:

$ pip install miditk-smf

它作为源发行版和 所有受支持的python版本和操作系统。这只取决于 python标准库和第三方模块six

包装内容

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文件的事件处理程序。

用法示例

下面的部分包含一些代码示例,其中演示了 包中不同模块的使用场景。有关更多示例,请参见 还有源发行版的examples目录中的脚本。

分析标准midi文件

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

然后可以使用返回的^{tt16}的几个方便方法$ 实例访问有关MIDI文件属性或事件的信息。

frommiditk.smfimportMidiSequence# Do parsingsequence=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.forevinsequence.sysex_events(track=0):print"Sysex event (%i bytes) @ %.2f"(len(ev.data),ev.timestamp)# Iterate over all events sorted by timestamp and then track.forevinsequence.events_by_time():handle_event(ev)

更改流中的MIDI事件

基于事件的解析允许在读取MIDI事件时处理它们(或 通过MIDI接收)。您需要定义 miditk.smf.BaseMidiEventHandlermiditk.smf.NullMidiEventHandler 并且只覆盖您所属事件的事件处理方法 感兴趣的。

下面的例子用一个八度音阶(即12)来转换所有的音符开/关事件 半色调):

importsysfrommiditk.smfimportMidiFileReader,MidiFileWriter# MidiFileWriter is a sub-class of NullMidiEventHandler.classTransposer(MidiFileWriter):"""Transpose note values of all note on/off events by 1 octave."""defnote_on(self,channel,note,velocity):super().note_on(self,channel,min(127,note+12),velocity)defnote_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 handlerwithopen(outfile,'wb')assmf:midiout=Transposer(smf)midiin=MidiFileReader(infile,midiout)# Now do the processing.midiin.read()

开发

复制回购:

$ 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 request来贡献您的更改。

代码qa

所包含的makefile被设置为运行几个python静态代码检查和 报告工具。打印可用makefile目标和工具的列表 他们跑,简单的跑:

$ make

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

$ make flake8

除非另有说明,否则这些目标运行所有工具直接的,也就是说没有毒性, 这意味着它们需要安装在python环境中,最好是 特定于项目的虚拟环境。创建虚拟环境和 安装所有受支持的工具及其依赖项运行:

$ mkvirtualenv miditk-smf
(miditk-smf)$ pip install -r requirements/dev.txt

文档

软件包文档由sphinx生成。可以构建文档 使用:

$ make docs

成功构建后,将在Web浏览器中打开文档索引。

作者和许可证

miditk包由christopher arndt编写,并根据 麻省理工学院执照。

miditk.smf子包的结构给 python midi package,由maxm@maxm.dk编写。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
junit cucumber为什么会找到“runTest.java”来运行测试?   在Eclipse中找不到java KeyPairGenerator   java NotSerializableException即使在实现Serializable之后   noclassdeffounderror(java字符串连接)为什么会出现这种异常?   java Guice:将接口绑定到由动态代理创建的实例   使用Spring数据neo4j创建空间索引时发生java错误   java对于需要在50多个excel文件上运行并且每个文件平均包含25k行的项目,最佳的方法是什么   javaNIO中的java缓冲区写入/发送消息问题   如何在Java/eclipse中添加不调用super()的警告   JavaSpring:mvcUrl映射错误的id   java应该在getInstance或构造函数中使用Init方法吗?   安卓中的java空指针异常错误   java Jsoup不能完全获取原始html代码