minihost 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- minihost-0.1.0/.github/workflows/build.yml +219 -0
- minihost-0.1.0/.gitignore +55 -0
- minihost-0.1.0/CHANGELOG.md +165 -0
- minihost-0.1.0/CMakeLists.txt +52 -0
- minihost-0.1.0/HOSTING_GUIDE.md +1102 -0
- minihost-0.1.0/LICENSE +674 -0
- minihost-0.1.0/Makefile +107 -0
- minihost-0.1.0/PKG-INFO +651 -0
- minihost-0.1.0/README.md +621 -0
- minihost-0.1.0/TODO.md +37 -0
- minihost-0.1.0/examples/basic_usage.py +209 -0
- minihost-0.1.0/examples/play_plugin.py +232 -0
- minihost-0.1.0/projects/example/CMakeLists.txt +4 -0
- minihost-0.1.0/projects/example/example.c +162 -0
- minihost-0.1.0/projects/libminihost/CMakeLists.txt +33 -0
- minihost-0.1.0/projects/libminihost/minihost.cpp +1270 -0
- minihost-0.1.0/projects/libminihost/minihost.h +328 -0
- minihost-0.1.0/projects/libminihost/minihost_chain.cpp +335 -0
- minihost-0.1.0/projects/libminihost/minihost_chain.h +113 -0
- minihost-0.1.0/projects/libminihost_audio/CMakeLists.txt +52 -0
- minihost-0.1.0/projects/libminihost_audio/midi_ringbuffer.cpp +138 -0
- minihost-0.1.0/projects/libminihost_audio/midi_ringbuffer.h +46 -0
- minihost-0.1.0/projects/libminihost_audio/minihost_audio.c +701 -0
- minihost-0.1.0/projects/libminihost_audio/minihost_audio.h +141 -0
- minihost-0.1.0/projects/libminihost_audio/minihost_midi.cpp +345 -0
- minihost-0.1.0/projects/libminihost_audio/minihost_midi.h +91 -0
- minihost-0.1.0/projects/libremidi/.gitignore +95 -0
- minihost-0.1.0/projects/libremidi/AUTHORS +64 -0
- minihost-0.1.0/projects/libremidi/CMakeLists.txt +76 -0
- minihost-0.1.0/projects/libremidi/LICENSE.md +83 -0
- minihost-0.1.0/projects/libremidi/README.md +147 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi-config.cmake.in +3 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.alsa.cmake +50 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.cppwinrt.cmake +99 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.deps.cmake +56 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.emscripten.cmake +10 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.examples.cmake +112 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.install.cmake +38 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.jack.cmake +37 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.keyboard.cmake +10 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.library.cmake +79 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.macos.cmake +22 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.net.cmake +55 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.pipewire.cmake +50 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.sources.cmake +154 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.tests.cmake +53 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.unix.cmake +0 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.warnings.cmake +20 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.win32.cmake +11 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.winmidi.cmake +77 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.winmm.cmake +17 -0
- minihost-0.1.0/projects/libremidi/cmake/libremidi.winuwp.cmake +31 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/api-c.h +41 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/api.hpp +91 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw/config.hpp +81 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw/error_domain.hpp +0 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw/helpers.hpp +303 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw/midi_in.hpp +356 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw/midi_out.hpp +169 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw/observer.hpp +253 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw.hpp +32 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw_ump/config.hpp +27 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw_ump/helpers.hpp +68 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw_ump/midi_in.hpp +349 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw_ump/midi_out.hpp +99 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw_ump/observer.hpp +14 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw_ump.hpp +31 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq/config.hpp +65 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq/helpers.hpp +308 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq/midi_in.hpp +549 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq/midi_out.hpp +180 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq/observer.hpp +389 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq/shared_handler.hpp +195 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq.hpp +49 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq_ump/config.hpp +55 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq_ump/helpers.hpp +0 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq_ump/midi_out.hpp +146 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq_ump.hpp +69 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi/config.hpp +42 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi/error_domain.hpp +72 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi/helpers.hpp +353 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi/midi_in.hpp +154 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi/midi_out.hpp +178 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi/observer.hpp +217 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi.hpp +24 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi_ump/config.hpp +23 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi_ump/helpers.hpp +2 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi_ump/midi_in.hpp +152 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi_ump/midi_out.hpp +159 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi_ump/observer.hpp +20 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi_ump.hpp +24 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/dummy.hpp +109 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/config.hpp +17 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/helpers.hpp +17 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/midi_access.cpp +22 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/midi_access.hpp +303 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/midi_in.cpp +79 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/midi_in.hpp +38 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/midi_out.cpp +63 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/midi_out.hpp +33 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/observer.cpp +105 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/observer.hpp +37 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten.hpp +32 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/config.hpp +49 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/error_domain.hpp +78 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/helpers.hpp +319 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/midi_in.hpp +117 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/midi_out.hpp +181 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/observer.hpp +223 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/shared_handler.hpp +153 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack.hpp +39 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack_ump/config.hpp +33 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack_ump/midi_in.hpp +119 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack_ump/midi_out.hpp +184 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack_ump/observer.hpp +235 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack_ump/shared_handler.hpp +0 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack_ump.hpp +34 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/keyboard/config.hpp +154 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/keyboard/midi_in.hpp +112 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/keyboard.hpp +23 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/linux/alsa.hpp +461 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/linux/dylib_loader.hpp +85 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/linux/helpers.hpp +77 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/linux/pipewire.hpp +178 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/linux/udev.hpp +194 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/net/config.hpp +86 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/net/helpers.hpp +94 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/net/midi_in.hpp +437 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/net/midi_out.hpp +288 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/net/observer.hpp +14 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/network.hpp +26 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/network_ump.hpp +25 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/config.hpp +53 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/context.hpp +618 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/helpers.hpp +476 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/midi_in.hpp +133 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/midi_out.hpp +189 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/observer.hpp +66 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/shared_handler.hpp +153 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire.hpp +32 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire_ump/config.hpp +36 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire_ump/midi_in.hpp +135 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire_ump/midi_out.hpp +185 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire_ump/observer.hpp +68 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire_ump.hpp +39 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmidi/config.hpp +34 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmidi/helpers.hpp +96 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmidi/midi_in.hpp +114 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmidi/midi_out.hpp +96 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmidi/observer.hpp +274 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmidi.hpp +24 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm/config.hpp +31 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm/error_domain.hpp +70 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm/helpers.hpp +74 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm/midi_in.hpp +292 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm/midi_out.hpp +164 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm/observer.hpp +268 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm.hpp +38 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winuwp/config.hpp +19 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winuwp/helpers.hpp +63 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winuwp/midi_in.hpp +98 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winuwp/midi_out.hpp +77 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winuwp/observer.hpp +295 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends/winuwp.hpp +24 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/backends.hpp +261 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/client.cpp +47 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/client.hpp +205 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/cmidi2.hpp +3297 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/config.hpp +70 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/configurations.hpp +68 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/defaults.hpp +98 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/detail/conversion.hpp +291 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/detail/memory.hpp +40 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/detail/midi_api.hpp +48 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/detail/midi_in.hpp +56 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/detail/midi_out.hpp +89 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/detail/midi_stream_decoder.hpp +479 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/detail/observer.hpp +27 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/detail/semaphore.hpp +23 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/detail/ump_stream.hpp +61 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/error.hpp +64 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/error_handler.hpp +63 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/input_configuration.hpp +132 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/libremidi-c.cpp +507 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/libremidi-c.h +275 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/libremidi.cpp +210 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/libremidi.hpp +279 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/message.hpp +297 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/midi_in.cpp +374 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/midi_out.cpp +327 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/observer.cpp +138 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/observer_configuration.hpp +149 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/output_configuration.hpp +21 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/protocols/remote_control.hpp +858 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/reader.cpp +752 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/reader.hpp +75 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/shared_context.hpp +33 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/system_error2.hpp +3508 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/ump.hpp +123 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/ump_events.hpp +374 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/writer.cpp +213 -0
- minihost-0.1.0/projects/libremidi/include/libremidi/writer.hpp +52 -0
- minihost-0.1.0/projects/midifile/.gitignore +29 -0
- minihost-0.1.0/projects/midifile/CMakeLists.txt +214 -0
- minihost-0.1.0/projects/midifile/LICENSE.txt +23 -0
- minihost-0.1.0/projects/midifile/Makefile +106 -0
- minihost-0.1.0/projects/midifile/Makefile.library +184 -0
- minihost-0.1.0/projects/midifile/Makefile.programs +183 -0
- minihost-0.1.0/projects/midifile/README.md +1601 -0
- minihost-0.1.0/projects/midifile/appveyor.yml +45 -0
- minihost-0.1.0/projects/midifile/include/Binasc.h +161 -0
- minihost-0.1.0/projects/midifile/include/MidiEvent.h +80 -0
- minihost-0.1.0/projects/midifile/include/MidiEventList.h +90 -0
- minihost-0.1.0/projects/midifile/include/MidiFile.h +340 -0
- minihost-0.1.0/projects/midifile/include/MidiMessage.h +220 -0
- minihost-0.1.0/projects/midifile/include/Options.h +157 -0
- minihost-0.1.0/projects/midifile/src/Binasc.cpp +2012 -0
- minihost-0.1.0/projects/midifile/src/MidiEvent.cpp +305 -0
- minihost-0.1.0/projects/midifile/src/MidiEventList.cpp +868 -0
- minihost-0.1.0/projects/midifile/src/MidiFile.cpp +3507 -0
- minihost-0.1.0/projects/midifile/src/MidiMessage.cpp +2392 -0
- minihost-0.1.0/projects/midifile/src/Options.cpp +1219 -0
- minihost-0.1.0/projects/midifile/tools/80off.cpp +136 -0
- minihost-0.1.0/projects/midifile/tools/README.md +66 -0
- minihost-0.1.0/projects/midifile/tools/asciimidi.cpp +82 -0
- minihost-0.1.0/projects/midifile/tools/base642midi.cpp +42 -0
- minihost-0.1.0/projects/midifile/tools/binasc.cpp +520 -0
- minihost-0.1.0/projects/midifile/tools/chaninfo.cpp +111 -0
- minihost-0.1.0/projects/midifile/tools/createmidifile.cpp +126 -0
- minihost-0.1.0/projects/midifile/tools/createmidifile2.cpp +85 -0
- minihost-0.1.0/projects/midifile/tools/deltatimes.cpp +431 -0
- minihost-0.1.0/projects/midifile/tools/drumtab.cpp +114 -0
- minihost-0.1.0/projects/midifile/tools/durations.cpp +184 -0
- minihost-0.1.0/projects/midifile/tools/echomidi.cpp +48 -0
- minihost-0.1.0/projects/midifile/tools/extractlyrics.cpp +129 -0
- minihost-0.1.0/projects/midifile/tools/henonfile.cpp +477 -0
- minihost-0.1.0/projects/midifile/tools/linkinfo.cpp +64 -0
- minihost-0.1.0/projects/midifile/tools/maxtick.cpp +70 -0
- minihost-0.1.0/projects/midifile/tools/mid2hex.cpp +74 -0
- minihost-0.1.0/projects/midifile/tools/mid2hum.cpp +922 -0
- minihost-0.1.0/projects/midifile/tools/mid2mat.cpp +956 -0
- minihost-0.1.0/projects/midifile/tools/mid2mtb.cpp +230 -0
- minihost-0.1.0/projects/midifile/tools/mid2svg.cpp +2439 -0
- minihost-0.1.0/projects/midifile/tools/midi2base64.cpp +41 -0
- minihost-0.1.0/projects/midifile/tools/midi2beep.cpp +135 -0
- minihost-0.1.0/projects/midifile/tools/midi2binasc.cpp +321 -0
- minihost-0.1.0/projects/midifile/tools/midi2chords.cpp +547 -0
- minihost-0.1.0/projects/midifile/tools/midi2melody.cpp +267 -0
- minihost-0.1.0/projects/midifile/tools/midi2notes.cpp +941 -0
- minihost-0.1.0/projects/midifile/tools/midi2skini.cpp +228 -0
- minihost-0.1.0/projects/midifile/tools/midi2text.cpp +194 -0
- minihost-0.1.0/projects/midifile/tools/midicat.cpp +200 -0
- minihost-0.1.0/projects/midifile/tools/mididiss.cpp +476 -0
- minihost-0.1.0/projects/midifile/tools/midiexcerpt.cpp +364 -0
- minihost-0.1.0/projects/midifile/tools/midimean.cpp +278 -0
- minihost-0.1.0/projects/midifile/tools/midimixup.cpp +226 -0
- minihost-0.1.0/projects/midifile/tools/midirange.cpp +87 -0
- minihost-0.1.0/projects/midifile/tools/midireg.cpp +124 -0
- minihost-0.1.0/projects/midifile/tools/miditickdur.cpp +142 -0
- minihost-0.1.0/projects/midifile/tools/miditime.cpp +161 -0
- minihost-0.1.0/projects/midifile/tools/midiuniq.cpp +99 -0
- minihost-0.1.0/projects/midifile/tools/mts-type2.cpp +112 -0
- minihost-0.1.0/projects/midifile/tools/mts-type9.cpp +156 -0
- minihost-0.1.0/projects/midifile/tools/peep2midi.cpp +353 -0
- minihost-0.1.0/projects/midifile/tools/perfid.cpp +296 -0
- minihost-0.1.0/projects/midifile/tools/readstatus.cpp +76 -0
- minihost-0.1.0/projects/midifile/tools/redexpress.cpp +306 -0
- minihost-0.1.0/projects/midifile/tools/removenote.cpp +60 -0
- minihost-0.1.0/projects/midifile/tools/retick.cpp +64 -0
- minihost-0.1.0/projects/midifile/tools/shutak.cpp +243 -0
- minihost-0.1.0/projects/midifile/tools/smfdur.cpp +200 -0
- minihost-0.1.0/projects/midifile/tools/sortnotes.cpp +225 -0
- minihost-0.1.0/projects/midifile/tools/stretch.cpp +112 -0
- minihost-0.1.0/projects/midifile/tools/sysextest.cpp +184 -0
- minihost-0.1.0/projects/midifile/tools/temper.cpp +745 -0
- minihost-0.1.0/projects/midifile/tools/text2midi.cpp +298 -0
- minihost-0.1.0/projects/midifile/tools/textmidi.cpp +145 -0
- minihost-0.1.0/projects/midifile/tools/timeinfo.cpp +88 -0
- minihost-0.1.0/projects/midifile/tools/toascii.cpp +123 -0
- minihost-0.1.0/projects/midifile/tools/tobin.cpp +83 -0
- minihost-0.1.0/projects/midifile/tools/tobinary.cpp +140 -0
- minihost-0.1.0/projects/midifile/tools/todec.cpp +99 -0
- minihost-0.1.0/projects/midifile/tools/tohex.cpp +77 -0
- minihost-0.1.0/projects/midifile/tools/type0.cpp +144 -0
- minihost-0.1.0/projects/midifile/tools/vlv.cpp +301 -0
- minihost-0.1.0/projects/midifile/visual-studio/README.md +16 -0
- minihost-0.1.0/projects/midifile/visual-studio/binasc.vcxproj +89 -0
- minihost-0.1.0/projects/midifile/visual-studio/createmidifile.vcxproj +89 -0
- minihost-0.1.0/projects/midifile/visual-studio/midifile.sln +13 -0
- minihost-0.1.0/projects/midifile/visual-studio/midifile.vcxproj +100 -0
- minihost-0.1.0/projects/midifile/visual-studio/stretch.vcxproj +89 -0
- minihost-0.1.0/projects/miniaudio/miniaudio.c +2 -0
- minihost-0.1.0/projects/miniaudio/miniaudio.h +39734 -0
- minihost-0.1.0/projects/minihost_c/CMakeLists.txt +4 -0
- minihost-0.1.0/projects/minihost_c/main.c +996 -0
- minihost-0.1.0/projects/minihost_cpp/CMakeLists.txt +5 -0
- minihost-0.1.0/projects/minihost_cpp/include/CLI11.hpp +12045 -0
- minihost-0.1.0/projects/minihost_cpp/main.cpp +913 -0
- minihost-0.1.0/pyproject.toml +66 -0
- minihost-0.1.0/scripts/download_juce.sh +33 -0
- minihost-0.1.0/src/minihost/__init__.py +70 -0
- minihost-0.1.0/src/minihost/_core.cpp +1518 -0
- minihost-0.1.0/src/minihost/_core.pyi +232 -0
- minihost-0.1.0/src/minihost/cli.py +559 -0
- minihost-0.1.0/src/minihost/py.typed +0 -0
- minihost-0.1.0/src/minihost/render.py +651 -0
- minihost-0.1.0/tests/test_minihost.py +1195 -0
- minihost-0.1.0/uv.lock +974 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
name: Build
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
tags: ['v*']
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [main]
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build-cli:
|
|
13
|
+
name: Build CLI (${{ matrix.os }})
|
|
14
|
+
runs-on: ${{ matrix.os }}
|
|
15
|
+
strategy:
|
|
16
|
+
fail-fast: false
|
|
17
|
+
matrix:
|
|
18
|
+
include:
|
|
19
|
+
- os: macos-14
|
|
20
|
+
artifact-name: cli-macos-universal
|
|
21
|
+
cmake-args: -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0
|
|
22
|
+
- os: ubuntu-22.04
|
|
23
|
+
artifact-name: cli-linux-x64
|
|
24
|
+
cmake-args: ""
|
|
25
|
+
- os: windows-2022
|
|
26
|
+
artifact-name: cli-windows-x64
|
|
27
|
+
cmake-args: -G "Visual Studio 17 2022"
|
|
28
|
+
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@v4
|
|
31
|
+
|
|
32
|
+
- name: Install Linux dependencies
|
|
33
|
+
if: runner.os == 'Linux'
|
|
34
|
+
run: |
|
|
35
|
+
sudo apt-get update
|
|
36
|
+
sudo apt-get install -y \
|
|
37
|
+
libasound2-dev \
|
|
38
|
+
libfreetype6-dev \
|
|
39
|
+
libfontconfig1-dev \
|
|
40
|
+
libwebkit2gtk-4.1-dev \
|
|
41
|
+
libgtk-3-dev \
|
|
42
|
+
libgl1-mesa-dev \
|
|
43
|
+
libcurl4-openssl-dev \
|
|
44
|
+
pkg-config
|
|
45
|
+
|
|
46
|
+
- name: Download JUCE
|
|
47
|
+
shell: bash
|
|
48
|
+
run: ./scripts/download_juce.sh
|
|
49
|
+
|
|
50
|
+
- name: Configure CMake
|
|
51
|
+
run: cmake -B build -DCMAKE_BUILD_TYPE=Release ${{ matrix.cmake-args }}
|
|
52
|
+
|
|
53
|
+
- name: Build
|
|
54
|
+
run: cmake --build build --config Release
|
|
55
|
+
|
|
56
|
+
- name: Collect artifacts (Unix)
|
|
57
|
+
if: runner.os != 'Windows'
|
|
58
|
+
run: |
|
|
59
|
+
mkdir -p dist
|
|
60
|
+
cp build/projects/minihost_c/minihost_c dist/ || true
|
|
61
|
+
cp build/projects/minihost_cpp/minihost_cpp dist/ || true
|
|
62
|
+
cp build/projects/libminihost/libminihost.a dist/ || true
|
|
63
|
+
cp projects/libminihost/minihost.h dist/
|
|
64
|
+
|
|
65
|
+
- name: Collect artifacts (Windows)
|
|
66
|
+
if: runner.os == 'Windows'
|
|
67
|
+
shell: bash
|
|
68
|
+
run: |
|
|
69
|
+
mkdir -p dist
|
|
70
|
+
cp build/projects/minihost_c/Release/minihost_c.exe dist/ || true
|
|
71
|
+
cp build/projects/minihost_cpp/Release/minihost_cpp.exe dist/ || true
|
|
72
|
+
cp build/projects/libminihost/Release/minihost.lib dist/ || true
|
|
73
|
+
cp projects/libminihost/minihost.h dist/
|
|
74
|
+
|
|
75
|
+
- uses: actions/upload-artifact@v4
|
|
76
|
+
with:
|
|
77
|
+
name: ${{ matrix.artifact-name }}
|
|
78
|
+
path: dist/
|
|
79
|
+
|
|
80
|
+
build-wheels:
|
|
81
|
+
name: Build wheels (${{ matrix.os }}, ${{ matrix.cibw_archs }})
|
|
82
|
+
runs-on: ${{ matrix.os }}
|
|
83
|
+
strategy:
|
|
84
|
+
fail-fast: false
|
|
85
|
+
matrix:
|
|
86
|
+
include:
|
|
87
|
+
- os: macos-14
|
|
88
|
+
cibw_archs: arm64 x86_64
|
|
89
|
+
artifact-name: wheels-macos
|
|
90
|
+
- os: ubuntu-22.04
|
|
91
|
+
cibw_archs: x86_64
|
|
92
|
+
artifact-name: wheels-linux-x64
|
|
93
|
+
- os: windows-2022
|
|
94
|
+
cibw_archs: AMD64
|
|
95
|
+
artifact-name: wheels-windows-x64
|
|
96
|
+
|
|
97
|
+
steps:
|
|
98
|
+
- uses: actions/checkout@v4
|
|
99
|
+
|
|
100
|
+
- uses: actions/setup-python@v5
|
|
101
|
+
with:
|
|
102
|
+
python-version: '3.12'
|
|
103
|
+
|
|
104
|
+
- name: Install cibuildwheel
|
|
105
|
+
run: pip install cibuildwheel
|
|
106
|
+
|
|
107
|
+
- name: Build wheels
|
|
108
|
+
env:
|
|
109
|
+
CIBW_ARCHS: ${{ matrix.cibw_archs }}
|
|
110
|
+
CIBW_BUILD: cp310-* cp311-* cp312-* cp313-* cp314-*
|
|
111
|
+
CIBW_SKIP: '*-musllinux_*'
|
|
112
|
+
CIBW_BEFORE_ALL_LINUX: >
|
|
113
|
+
yum install -y curl alsa-lib-devel freetype-devel fontconfig-devel
|
|
114
|
+
gtk3-devel mesa-libGL-devel libcurl-devel webkit2gtk3-devel pkgconfig &&
|
|
115
|
+
bash {project}/scripts/download_juce.sh
|
|
116
|
+
CIBW_BEFORE_ALL_MACOS: bash {project}/scripts/download_juce.sh
|
|
117
|
+
CIBW_ENVIRONMENT_MACOS: MACOSX_DEPLOYMENT_TARGET=11.0
|
|
118
|
+
CIBW_BEFORE_ALL_WINDOWS: bash {project}/scripts/download_juce.sh
|
|
119
|
+
run: cibuildwheel --output-dir wheelhouse
|
|
120
|
+
|
|
121
|
+
- uses: actions/upload-artifact@v4
|
|
122
|
+
with:
|
|
123
|
+
name: ${{ matrix.artifact-name }}
|
|
124
|
+
path: wheelhouse/*.whl
|
|
125
|
+
|
|
126
|
+
build-sdist:
|
|
127
|
+
name: Build source distribution
|
|
128
|
+
runs-on: ubuntu-22.04
|
|
129
|
+
steps:
|
|
130
|
+
- uses: actions/checkout@v4
|
|
131
|
+
|
|
132
|
+
- uses: actions/setup-python@v5
|
|
133
|
+
with:
|
|
134
|
+
python-version: '3.12'
|
|
135
|
+
|
|
136
|
+
- name: Install build tools
|
|
137
|
+
run: pip install build
|
|
138
|
+
|
|
139
|
+
- name: Build sdist
|
|
140
|
+
run: python -m build --sdist
|
|
141
|
+
|
|
142
|
+
- uses: actions/upload-artifact@v4
|
|
143
|
+
with:
|
|
144
|
+
name: sdist
|
|
145
|
+
path: dist/*.tar.gz
|
|
146
|
+
|
|
147
|
+
aggregate:
|
|
148
|
+
name: Aggregate artifacts
|
|
149
|
+
runs-on: ubuntu-22.04
|
|
150
|
+
needs: [build-cli, build-wheels, build-sdist]
|
|
151
|
+
steps:
|
|
152
|
+
- name: Download all artifacts
|
|
153
|
+
uses: actions/download-artifact@v4
|
|
154
|
+
with:
|
|
155
|
+
path: artifacts
|
|
156
|
+
|
|
157
|
+
- name: Organize artifacts
|
|
158
|
+
run: |
|
|
159
|
+
mkdir -p release/cli/macos-universal
|
|
160
|
+
mkdir -p release/cli/linux-x64
|
|
161
|
+
mkdir -p release/cli/windows-x64
|
|
162
|
+
mkdir -p release/wheels
|
|
163
|
+
mkdir -p release/sdist
|
|
164
|
+
|
|
165
|
+
# CLI binaries
|
|
166
|
+
cp -r artifacts/cli-macos-universal/* release/cli/macos-universal/ || true
|
|
167
|
+
cp -r artifacts/cli-linux-x64/* release/cli/linux-x64/ || true
|
|
168
|
+
cp -r artifacts/cli-windows-x64/* release/cli/windows-x64/ || true
|
|
169
|
+
|
|
170
|
+
# Wheels
|
|
171
|
+
cp artifacts/wheels-*/*.whl release/wheels/ || true
|
|
172
|
+
|
|
173
|
+
# Source distribution
|
|
174
|
+
cp artifacts/sdist/*.tar.gz release/sdist/ || true
|
|
175
|
+
|
|
176
|
+
# Summary
|
|
177
|
+
echo "=== Release Contents ==="
|
|
178
|
+
find release -type f | sort
|
|
179
|
+
|
|
180
|
+
- uses: actions/upload-artifact@v4
|
|
181
|
+
with:
|
|
182
|
+
name: minihost-all
|
|
183
|
+
path: release/
|
|
184
|
+
|
|
185
|
+
release:
|
|
186
|
+
name: Create release
|
|
187
|
+
runs-on: ubuntu-22.04
|
|
188
|
+
needs: [aggregate]
|
|
189
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
190
|
+
permissions:
|
|
191
|
+
contents: write
|
|
192
|
+
steps:
|
|
193
|
+
- name: Download aggregated artifacts
|
|
194
|
+
uses: actions/download-artifact@v4
|
|
195
|
+
with:
|
|
196
|
+
name: minihost-all
|
|
197
|
+
path: release
|
|
198
|
+
|
|
199
|
+
- name: Create archives
|
|
200
|
+
run: |
|
|
201
|
+
cd release
|
|
202
|
+
# Create platform-specific CLI archives
|
|
203
|
+
tar -czvf ../minihost-cli-macos-universal.tar.gz -C cli/macos-universal .
|
|
204
|
+
tar -czvf ../minihost-cli-linux-x64.tar.gz -C cli/linux-x64 .
|
|
205
|
+
cd cli/windows-x64 && zip -r ../../../minihost-cli-windows-x64.zip . && cd ../..
|
|
206
|
+
# Create wheels archive
|
|
207
|
+
cd wheels && zip -r ../../minihost-wheels.zip . && cd ..
|
|
208
|
+
cd ..
|
|
209
|
+
|
|
210
|
+
- name: Create GitHub Release
|
|
211
|
+
uses: softprops/action-gh-release@v2
|
|
212
|
+
with:
|
|
213
|
+
files: |
|
|
214
|
+
minihost-cli-macos-universal.tar.gz
|
|
215
|
+
minihost-cli-linux-x64.tar.gz
|
|
216
|
+
minihost-cli-windows-x64.zip
|
|
217
|
+
minihost-wheels.zip
|
|
218
|
+
release/sdist/*.tar.gz
|
|
219
|
+
generate_release_notes: true
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
.DS_Store
|
|
2
|
+
|
|
3
|
+
JUCE/
|
|
4
|
+
build/
|
|
5
|
+
dist/
|
|
6
|
+
__pycache__
|
|
7
|
+
.venv
|
|
8
|
+
.*_cache
|
|
9
|
+
|
|
10
|
+
# Prerequisites
|
|
11
|
+
*.d
|
|
12
|
+
|
|
13
|
+
# Compiled Object files
|
|
14
|
+
*.slo
|
|
15
|
+
*.lo
|
|
16
|
+
*.o
|
|
17
|
+
*.obj
|
|
18
|
+
|
|
19
|
+
# Precompiled Headers
|
|
20
|
+
*.gch
|
|
21
|
+
*.pch
|
|
22
|
+
|
|
23
|
+
# Linker files
|
|
24
|
+
*.ilk
|
|
25
|
+
|
|
26
|
+
# Debugger Files
|
|
27
|
+
*.pdb
|
|
28
|
+
|
|
29
|
+
# Compiled Dynamic libraries
|
|
30
|
+
*.so
|
|
31
|
+
*.dylib
|
|
32
|
+
*.dll
|
|
33
|
+
|
|
34
|
+
# Fortran module files
|
|
35
|
+
*.mod
|
|
36
|
+
*.smod
|
|
37
|
+
|
|
38
|
+
# Compiled Static libraries
|
|
39
|
+
*.lai
|
|
40
|
+
*.la
|
|
41
|
+
*.a
|
|
42
|
+
*.lib
|
|
43
|
+
|
|
44
|
+
# Executables
|
|
45
|
+
*.exe
|
|
46
|
+
*.out
|
|
47
|
+
*.app
|
|
48
|
+
|
|
49
|
+
# debug information files
|
|
50
|
+
*.dwo
|
|
51
|
+
|
|
52
|
+
# agents
|
|
53
|
+
.claude
|
|
54
|
+
CLAUDE.md
|
|
55
|
+
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [Unreleased]
|
|
4
|
+
|
|
5
|
+
## [0.1.0]
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
#### Plugin Chaining
|
|
10
|
+
|
|
11
|
+
- `MH_PluginChain` opaque struct for managing chains of plugins
|
|
12
|
+
- `mh_chain_create()` - Create a chain from an array of plugins (all must have same sample rate)
|
|
13
|
+
- `mh_chain_close()` - Close chain and free resources (does not close individual plugins)
|
|
14
|
+
- `mh_chain_process()` - Process audio through the chain
|
|
15
|
+
- `mh_chain_process_midi_io()` - Process audio with MIDI I/O (MIDI goes to first plugin only)
|
|
16
|
+
- `mh_chain_get_latency_samples()` - Get total chain latency (sum of all plugin latencies)
|
|
17
|
+
- `mh_chain_get_num_plugins()` - Get number of plugins in the chain
|
|
18
|
+
- `mh_chain_get_plugin()` - Get plugin from chain by index
|
|
19
|
+
- `mh_chain_get_num_input_channels()` - Get input channel count (from first plugin)
|
|
20
|
+
- `mh_chain_get_num_output_channels()` - Get output channel count (from last plugin)
|
|
21
|
+
- `mh_chain_get_sample_rate()` - Get sample rate (all plugins share same rate)
|
|
22
|
+
- `mh_chain_get_max_block_size()` - Get maximum block size
|
|
23
|
+
- `mh_chain_reset()` - Reset all plugins in the chain
|
|
24
|
+
- `mh_chain_set_non_realtime()` - Set non-realtime mode for all plugins
|
|
25
|
+
- `mh_chain_get_tail_seconds()` - Get maximum tail length (max of all plugin tails)
|
|
26
|
+
- `mh_audio_open_chain()` - Open audio device for real-time playback through a plugin chain
|
|
27
|
+
- Python `PluginChain` class with `process()`, `process_midi()`, `reset()`, `set_non_realtime()`, `get_plugin()` methods
|
|
28
|
+
- Python `PluginChain` properties: `num_plugins`, `latency_samples`, `num_input_channels`, `num_output_channels`, `sample_rate`, `tail_seconds`
|
|
29
|
+
- `AudioDevice` now accepts either `Plugin` or `PluginChain`
|
|
30
|
+
- `render_midi()`, `render_midi_stream()`, `render_midi_to_file()`, and `MidiRenderer` now accept either `Plugin` or `PluginChain`
|
|
31
|
+
|
|
32
|
+
#### Real-time Audio Playback (miniaudio integration)
|
|
33
|
+
|
|
34
|
+
- `MH_AudioDevice` opaque struct for audio device management
|
|
35
|
+
- `MH_AudioConfig` struct for device configuration (sample_rate, buffer_frames, output_channels, midi_input_port, midi_output_port)
|
|
36
|
+
- `MH_AudioInputCallback` typedef for effect plugin input audio
|
|
37
|
+
- `mh_audio_open()` - Open audio device for real-time playback through a plugin
|
|
38
|
+
- `mh_audio_close()` - Close audio device
|
|
39
|
+
- `mh_audio_start()` / `mh_audio_stop()` - Start/stop audio playback
|
|
40
|
+
- `mh_audio_is_playing()` - Check if audio is currently playing
|
|
41
|
+
- `mh_audio_set_input_callback()` - Set input callback for effect plugins
|
|
42
|
+
- `mh_audio_get_sample_rate()` - Get actual device sample rate
|
|
43
|
+
- `mh_audio_get_buffer_frames()` - Get actual buffer size
|
|
44
|
+
- `mh_audio_get_channels()` - Get number of output channels
|
|
45
|
+
- New `libminihost_audio` library using miniaudio for cross-platform audio I/O
|
|
46
|
+
|
|
47
|
+
#### Real-time MIDI I/O (libremidi integration)
|
|
48
|
+
|
|
49
|
+
- `MH_MidiPortInfo` struct for MIDI port information
|
|
50
|
+
- `MH_MidiPortCallback` typedef for port enumeration callbacks
|
|
51
|
+
- `mh_midi_enumerate_inputs()` / `mh_midi_enumerate_outputs()` - Enumerate available MIDI ports
|
|
52
|
+
- `mh_midi_get_num_inputs()` / `mh_midi_get_num_outputs()` - Get MIDI port count
|
|
53
|
+
- `mh_midi_get_input_name()` / `mh_midi_get_output_name()` - Get MIDI port name by index
|
|
54
|
+
- `mh_audio_connect_midi_input()` / `mh_audio_connect_midi_output()` - Connect MIDI ports to AudioDevice
|
|
55
|
+
- `mh_audio_disconnect_midi_input()` / `mh_audio_disconnect_midi_output()` - Disconnect MIDI
|
|
56
|
+
- `mh_audio_get_midi_input_port()` / `mh_audio_get_midi_output_port()` - Query connected MIDI ports
|
|
57
|
+
- Lock-free ring buffer for thread-safe MIDI transfer between MIDI and audio threads
|
|
58
|
+
|
|
59
|
+
#### Virtual MIDI Ports
|
|
60
|
+
|
|
61
|
+
- `mh_midi_in_open_virtual()` - Create a virtual MIDI input port (other apps can send MIDI to it)
|
|
62
|
+
- `mh_midi_out_open_virtual()` - Create a virtual MIDI output port (other apps can receive MIDI from it)
|
|
63
|
+
- `mh_audio_create_virtual_midi_input()` - Create virtual MIDI input for AudioDevice
|
|
64
|
+
- `mh_audio_create_virtual_midi_output()` - Create virtual MIDI output for AudioDevice
|
|
65
|
+
- `mh_audio_is_midi_input_virtual()` / `mh_audio_is_midi_output_virtual()` - Check if MIDI port is virtual
|
|
66
|
+
- `mh_audio_send_midi()` - Send MIDI events programmatically during real-time playback
|
|
67
|
+
- Virtual ports appear in system MIDI port lists, allowing DAWs and other apps to connect
|
|
68
|
+
- Platform support: macOS (CoreMIDI), Linux (ALSA); not supported on Windows
|
|
69
|
+
|
|
70
|
+
#### MIDI File Read/Write (midifile integration)
|
|
71
|
+
|
|
72
|
+
- Integrated `midifile` library for Standard MIDI File (SMF) read/write capability
|
|
73
|
+
- Python `MidiFile` class for creating, loading, and saving MIDI files
|
|
74
|
+
- Create MIDI files programmatically with note on/off, tempo, control change, program change, pitch bend events
|
|
75
|
+
- Load existing MIDI files and iterate through events
|
|
76
|
+
- Save MIDI files to disk
|
|
77
|
+
- Access event timing in both ticks and seconds
|
|
78
|
+
|
|
79
|
+
#### MIDI File Rendering
|
|
80
|
+
|
|
81
|
+
- `render_midi()` - Render MIDI file through plugin to numpy array
|
|
82
|
+
- `render_midi_stream()` - Generator yielding audio blocks for streaming/large files
|
|
83
|
+
- `render_midi_to_file()` - Render MIDI file directly to WAV file (16/24/32-bit)
|
|
84
|
+
- `MidiRenderer` class - Stateful renderer with progress tracking and fine-grained control
|
|
85
|
+
- Properties: `duration_seconds`, `progress`, `is_finished`, `current_time`
|
|
86
|
+
- Methods: `render_block()`, `render_all()`, `reset()`
|
|
87
|
+
- Automatic tempo map handling for correct timing
|
|
88
|
+
- Configurable tail length for reverb/delay tails
|
|
89
|
+
|
|
90
|
+
#### Core Utilities
|
|
91
|
+
|
|
92
|
+
- `mh_reset()` - Reset plugin internal state (clears delay lines, reverb tails, filter states)
|
|
93
|
+
- `mh_set_non_realtime()` - Enable higher-quality algorithms for offline/batch processing
|
|
94
|
+
- `mh_probe()` - Get plugin metadata without full instantiation
|
|
95
|
+
- `MH_PluginDesc` struct for plugin metadata (name, vendor, version, format, unique_id, MIDI flags, channel counts)
|
|
96
|
+
- `mh_set_sample_rate()` - Change sample rate without reloading plugin (preserves parameter state)
|
|
97
|
+
- `mh_get_sample_rate()` - Query current sample rate
|
|
98
|
+
- `MH_ScanCallback` typedef for plugin scanning callback
|
|
99
|
+
- `mh_scan_directory()` - Recursively scan directory for VST3/AudioUnit plugins
|
|
100
|
+
- `MH_PluginDesc.path` field added for scan results
|
|
101
|
+
- `mh_process_double()` - Process audio with 64-bit double precision
|
|
102
|
+
- `mh_supports_double()` - Check if plugin supports native double precision
|
|
103
|
+
- `MH_LoadCallback` typedef for async loading callback
|
|
104
|
+
- `mh_open_async()` - Load plugin in background thread
|
|
105
|
+
|
|
106
|
+
#### Parameter & Preset Access
|
|
107
|
+
|
|
108
|
+
- `mh_param_to_text()` - Convert normalized parameter value to display string (e.g., "2500 Hz")
|
|
109
|
+
- `mh_param_from_text()` - Convert display string to normalized value
|
|
110
|
+
- `mh_get_num_programs()` - Get number of factory presets
|
|
111
|
+
- `mh_get_program_name()` - Get factory preset name by index
|
|
112
|
+
- `mh_get_program()` / `mh_set_program()` - Get/set current factory preset
|
|
113
|
+
|
|
114
|
+
#### Bus Layout & Sidechain
|
|
115
|
+
|
|
116
|
+
- `MH_BusInfo` struct for bus information (name, channels, is_main, is_enabled)
|
|
117
|
+
- `mh_get_num_buses()` - Query number of input/output buses
|
|
118
|
+
- `mh_get_bus_info()` - Get detailed bus information
|
|
119
|
+
- `mh_open_ex()` - Open plugin with sidechain channel configuration
|
|
120
|
+
- `mh_process_sidechain()` - Process audio with sidechain input
|
|
121
|
+
- `mh_get_sidechain_channels()` - Query configured sidechain channel count
|
|
122
|
+
|
|
123
|
+
### Fixed
|
|
124
|
+
|
|
125
|
+
#### Linux Compilation
|
|
126
|
+
- Added Linux build dependencies to README.md (JUCE requires freetype, fontconfig, webkit2gtk, gtk3, etc.)
|
|
127
|
+
- Fixed `addFormat()` calls to use raw pointers instead of `std::make_unique<>()` (JUCE's API expects raw pointers)
|
|
128
|
+
- Added `POSITION_INDEPENDENT_CODE ON` to libminihost CMakeLists.txt for linking into shared libraries (e.g., Python module)
|
|
129
|
+
|
|
130
|
+
### Command Line Interface
|
|
131
|
+
|
|
132
|
+
- `minihost` CLI tool with subcommands for common operations:
|
|
133
|
+
- `probe` - Get plugin metadata without full instantiation
|
|
134
|
+
- `scan` - Recursively scan directory for VST3/AudioUnit plugins
|
|
135
|
+
- `info` - Show detailed plugin info (buses, presets, latency)
|
|
136
|
+
- `params` - List plugin parameters with current values
|
|
137
|
+
- `midi-ports` - List available MIDI input/output ports
|
|
138
|
+
- `play` - Real-time audio playback with MIDI input
|
|
139
|
+
- `render` - Render MIDI file through plugin to WAV (16/24/32-bit)
|
|
140
|
+
- `process` - Offline audio file processing through effects
|
|
141
|
+
- Global options: `--sample-rate`, `--block-size`
|
|
142
|
+
- JSON output support (`--json`) for probe, scan, params, midi-ports
|
|
143
|
+
- Plugin state and preset loading for render command
|
|
144
|
+
- Virtual MIDI port creation for play command
|
|
145
|
+
|
|
146
|
+
### Python Bindings
|
|
147
|
+
|
|
148
|
+
All C API additions are exposed in the Python `minihost` module:
|
|
149
|
+
|
|
150
|
+
- `minihost.AudioDevice` class for real-time audio playback with MIDI
|
|
151
|
+
- Constructor: `AudioDevice(plugin, sample_rate=0, buffer_frames=0, output_channels=0, midi_input_port=-1, midi_output_port=-1)`
|
|
152
|
+
- Methods: `start()`, `stop()`, `connect_midi_input()`, `connect_midi_output()`, `disconnect_midi_input()`, `disconnect_midi_output()`, `create_virtual_midi_input()`, `create_virtual_midi_output()`, `send_midi()`
|
|
153
|
+
- Properties: `is_playing`, `sample_rate`, `buffer_frames`, `channels`, `midi_input_port`, `midi_output_port`, `is_midi_input_virtual`, `is_midi_output_virtual`
|
|
154
|
+
- Context manager support (`with AudioDevice(plugin) as audio:`)
|
|
155
|
+
- `minihost.midi_get_input_ports()` - Get list of available MIDI input ports
|
|
156
|
+
- `minihost.midi_get_output_ports()` - Get list of available MIDI output ports
|
|
157
|
+
- `minihost.MidiFile` class for MIDI file read/write
|
|
158
|
+
- Methods: `load()`, `save()`, `add_track()`, `add_tempo()`, `add_note_on()`, `add_note_off()`, `add_control_change()`, `add_program_change()`, `add_pitch_bend()`, `get_events()`, `join_tracks()`, `split_tracks()`
|
|
159
|
+
- Properties: `num_tracks`, `ticks_per_quarter`, `duration_seconds`
|
|
160
|
+
- `minihost.probe(path)` - Module-level function for plugin metadata
|
|
161
|
+
- `minihost.scan_directory(path)` - Scan directory for plugins, returns list of metadata dicts
|
|
162
|
+
- `Plugin` constructor now accepts `sidechain_channels` parameter
|
|
163
|
+
- New properties: `non_realtime`, `num_programs`, `program`, `sidechain_channels`, `num_input_buses`, `num_output_buses`, `sample_rate` (read/write), `supports_double`
|
|
164
|
+
- New methods: `reset()`, `param_to_text()`, `param_from_text()`, `get_program_name()`, `get_bus_info()`, `process_sidechain()`, `process_double()`
|
|
165
|
+
- Note: For async loading in Python, use Python's `threading` module with the regular `Plugin()` constructor
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.20)
|
|
2
|
+
|
|
3
|
+
# Handle scikit-build-core vs standalone build
|
|
4
|
+
if(DEFINED SKBUILD_PROJECT_NAME)
|
|
5
|
+
project(${SKBUILD_PROJECT_NAME} VERSION ${SKBUILD_PROJECT_VERSION} LANGUAGES C CXX)
|
|
6
|
+
else()
|
|
7
|
+
project(minihost C CXX)
|
|
8
|
+
endif()
|
|
9
|
+
|
|
10
|
+
set(CMAKE_CXX_STANDARD 17)
|
|
11
|
+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
12
|
+
set(CMAKE_C_STANDARD 11)
|
|
13
|
+
|
|
14
|
+
# Allow JUCE_PATH to be set externally, default to ./JUCE
|
|
15
|
+
if(NOT DEFINED JUCE_PATH)
|
|
16
|
+
set(JUCE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/JUCE")
|
|
17
|
+
endif()
|
|
18
|
+
|
|
19
|
+
if(NOT EXISTS "${JUCE_PATH}/CMakeLists.txt")
|
|
20
|
+
message(FATAL_ERROR "JUCE not found at ${JUCE_PATH}. Run ./scripts/download_juce.sh or set -DJUCE_PATH=/path/to/JUCE")
|
|
21
|
+
endif()
|
|
22
|
+
|
|
23
|
+
add_subdirectory(${JUCE_PATH} ${CMAKE_CURRENT_BINARY_DIR}/JUCE)
|
|
24
|
+
|
|
25
|
+
# Add project subdirectories
|
|
26
|
+
add_subdirectory(projects/libminihost)
|
|
27
|
+
add_subdirectory(projects/libminihost_audio)
|
|
28
|
+
|
|
29
|
+
# midifile library (MIDI file read/write) - build library only, skip tools
|
|
30
|
+
set(BUILD_MIDILIBRARY_ONLY ON CACHE BOOL "Build only the midifile library" FORCE)
|
|
31
|
+
add_subdirectory(projects/midifile)
|
|
32
|
+
|
|
33
|
+
# Only build CLI tools for standalone builds (not Python wheel builds)
|
|
34
|
+
if(NOT DEFINED SKBUILD)
|
|
35
|
+
add_subdirectory(projects/minihost_c)
|
|
36
|
+
add_subdirectory(projects/minihost_cpp)
|
|
37
|
+
endif()
|
|
38
|
+
|
|
39
|
+
# Python bindings (only when building with scikit-build-core)
|
|
40
|
+
if(DEFINED SKBUILD)
|
|
41
|
+
find_package(Python REQUIRED COMPONENTS Interpreter Development.Module)
|
|
42
|
+
find_package(nanobind CONFIG REQUIRED)
|
|
43
|
+
|
|
44
|
+
nanobind_add_module(_core src/minihost/_core.cpp)
|
|
45
|
+
target_link_libraries(_core PRIVATE minihost minihost_audio midifile)
|
|
46
|
+
target_include_directories(_core PRIVATE
|
|
47
|
+
${CMAKE_CURRENT_SOURCE_DIR}/projects/libminihost
|
|
48
|
+
${CMAKE_CURRENT_SOURCE_DIR}/projects/libminihost_audio
|
|
49
|
+
${CMAKE_CURRENT_SOURCE_DIR}/projects/midifile/include)
|
|
50
|
+
|
|
51
|
+
install(TARGETS _core DESTINATION minihost)
|
|
52
|
+
endif()
|