Skip to main content

A high performance MIDI file parser with comprehensible interface.

Project description

symusic

Build and upload to PyPI PyPI version Downloads Page Views Count Open In Colab

Symusic("Sybolic Music") is a cross-platform note level midi decoding library with lightening speed, which is over 100 times faster than mido, the main midi parsing library in python.

The library is written in cpp and based on minimidi. It offers a python binding using pybind11.

Here, we have added a tutorial.ipynb for you to learn about how to use the library.

Tutorial and Benchmark: Open In Colab

Features

  • You can just read a midi file like score = symusic.Score("path to midi", ttype="tick")
  • Writing back to midi is now supported! score.dump_midi("path")
  • Multiple time unit (ttype) is now supported (currently tick and quarter)
  • The tempo attribute in the tempo event represents quarter per minute (qpm)
  • We offer some batch operation functions for both Score and Track class:
    • shift_pitch(offset: int)
    • shift_velocity(offset: int)
    • shift_time(offset: float)
    • sort(key, reverse)
  • You can operate each note just like you did before in python (like PrettyMidi)
  • Extremely fast pickle is now supported

TODO

Notice that this library is under development:

  • Re-implement filter_notes and Note Array.

Installation

Use pre-compiled version

pip install symusic

Build from source

Make sure that your system has cmake and c++ compilers

git clone --recursive https://github.com/Yikai-Liao/symusic
pip install ./symusic

Benchmark

Parsing MIDI

  • test using mahler.mid from minimidi/example in colab
  • mido is writen in pure python, and only parses midi files to event level
  • pretty_midi and miditoolkit is based on mido, and parse midi files to note level
library time
symusic 21.8 ms ± 11.7 ms
MIDI.jl 128.024 ms
mido 5.68 s ± 2 s
pretty_midi 5.59 s ± 844 ms
miditoolkit 6.27 s ± 1.79 s
music21 8.59 s ± 1.2 s

Acknowledgement

  • minimidi : A fast and lightweight midi parsing library written in cpp, which is the foundation of this project.
  • pybind11 : A great header-only library to help you create python binding for your cpp code.
  • pybind11-stubgen A nice tool to generate stub files for pybind11 projects.
  • zpp_bits : An extraordinary fast and lightweight single header library for serialization and deserialization. I use it to support pickle.
  • geek_time_cpp The example code of the book "Modern C++ Programming Practice". We use the metamacro.h in it for shortening the code.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

symusic-0.2.4.tar.gz (1.5 MB view hashes)

Uploaded Source

Built Distributions

symusic-0.2.4-pp39-pypy39_pp73-win_amd64.whl (572.3 kB view hashes)

Uploaded PyPy Windows x86-64

symusic-0.2.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl (878.6 kB view hashes)

Uploaded PyPy manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

symusic-0.2.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.manylinux_2_27_aarch64.whl (821.1 kB view hashes)

Uploaded PyPy manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

symusic-0.2.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (1.2 MB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

symusic-0.2.4-cp312-cp312-win_amd64.whl (575.6 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

symusic-0.2.4-cp312-cp312-win32.whl (411.0 kB view hashes)

Uploaded CPython 3.12 Windows x86

symusic-0.2.4-cp312-cp312-musllinux_1_2_x86_64.whl (1.7 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

symusic-0.2.4-cp312-cp312-musllinux_1_2_aarch64.whl (1.6 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.2+ ARM64

symusic-0.2.4-cp312-cp312-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl (876.4 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

symusic-0.2.4-cp312-cp312-manylinux_2_28_aarch64.manylinux_2_27_aarch64.whl (814.4 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

symusic-0.2.4-cp312-cp312-macosx_11_0_arm64.whl (1.1 MB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

symusic-0.2.4-cp312-cp312-macosx_10_9_x86_64.whl (1.2 MB view hashes)

Uploaded CPython 3.12 macOS 10.9+ x86-64

symusic-0.2.4-cp311-cp311-win_amd64.whl (574.1 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

symusic-0.2.4-cp311-cp311-win32.whl (410.2 kB view hashes)

Uploaded CPython 3.11 Windows x86

symusic-0.2.4-cp311-cp311-musllinux_1_2_x86_64.whl (1.7 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

symusic-0.2.4-cp311-cp311-musllinux_1_2_aarch64.whl (1.7 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.2+ ARM64

symusic-0.2.4-cp311-cp311-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl (882.2 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

symusic-0.2.4-cp311-cp311-manylinux_2_28_aarch64.manylinux_2_27_aarch64.whl (817.5 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

symusic-0.2.4-cp311-cp311-macosx_11_0_arm64.whl (1.1 MB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

symusic-0.2.4-cp311-cp311-macosx_10_9_x86_64.whl (1.2 MB view hashes)

Uploaded CPython 3.11 macOS 10.9+ x86-64

symusic-0.2.4-cp310-cp310-win_amd64.whl (573.3 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

symusic-0.2.4-cp310-cp310-win32.whl (409.9 kB view hashes)

Uploaded CPython 3.10 Windows x86

symusic-0.2.4-cp310-cp310-musllinux_1_2_x86_64.whl (1.7 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

symusic-0.2.4-cp310-cp310-musllinux_1_2_aarch64.whl (1.6 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.2+ ARM64

symusic-0.2.4-cp310-cp310-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl (881.2 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

symusic-0.2.4-cp310-cp310-manylinux_2_28_aarch64.manylinux_2_27_aarch64.whl (816.6 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

symusic-0.2.4-cp310-cp310-macosx_11_0_arm64.whl (1.1 MB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

symusic-0.2.4-cp310-cp310-macosx_10_9_x86_64.whl (1.2 MB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

symusic-0.2.4-cp39-cp39-win_amd64.whl (520.3 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

symusic-0.2.4-cp39-cp39-win32.whl (410.1 kB view hashes)

Uploaded CPython 3.9 Windows x86

symusic-0.2.4-cp39-cp39-musllinux_1_2_x86_64.whl (1.7 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.2+ x86-64

symusic-0.2.4-cp39-cp39-musllinux_1_2_aarch64.whl (1.7 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.2+ ARM64

symusic-0.2.4-cp39-cp39-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl (880.5 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

symusic-0.2.4-cp39-cp39-manylinux_2_28_aarch64.manylinux_2_27_aarch64.whl (818.0 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

symusic-0.2.4-cp39-cp39-macosx_11_0_arm64.whl (1.1 MB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

symusic-0.2.4-cp39-cp39-macosx_10_9_x86_64.whl (1.2 MB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page