Yikai-Liao / symusic

A cross platform note level midi decoding library with lightening speed, based on minimidi.
https://yikai-liao.github.io/symusic/
MIT License
108 stars 8 forks source link

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 hundreds of times faster (100x to 1000x depending on your file size) 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.

Open In Colab

And a document is also available. Not complete though.

Features

Known Bugs

Potential Dangling Pointer

The memory management logic for vectors in c++ is not the same as for python lists, so currently holding a reference to an element (e.g. a Note) inside a Score for an extended period of time poses a potential dangling pointer risk. Find more information here.

I'm trying to implement a container that is different from a c++ std::vector to solve this problem, which would be similar to the stable_vector in boost.

Strange Noise at the End of Synthesized Audio

Currently, synthesizing audio with symusic on linux gives a probability of hearing strange noise at the end of the audio. This phenomenon cannot be reproduced consistently and does not occur on windows.

You can temporarily fix this by adding a few seconds of notes at the end and removing those seconds of audio at the end.

It is important to note that the audio synthesis functionality was implemented by us rather than using an off-the-shelf project, and it is still experimental at this time. Feel free to give us feedback on any bugs you find.

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

library level absolute time relative time
minimidi event 2.86 ms 1.0x
symusic note 3.47 ms ± 113 µs 1.2x
midifile event 44.0 ms 15.4x
midifile note 45.6 ms 15.9x
MIDI.jl note 109.707 ms 38.4x
mido event 2.92 s ± 42.7 ms 1021.0x
miditoolkit note 3.15 s ± 38.2 ms 1101.4x
pretty_midi note 3.16 s ± 9.56 ms 1104.9x
music21 note 4.23 s ± 34.5 ms 1479.0x

Acknowledgement