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.
Files changed (308) hide show
  1. minihost-0.1.0/.github/workflows/build.yml +219 -0
  2. minihost-0.1.0/.gitignore +55 -0
  3. minihost-0.1.0/CHANGELOG.md +165 -0
  4. minihost-0.1.0/CMakeLists.txt +52 -0
  5. minihost-0.1.0/HOSTING_GUIDE.md +1102 -0
  6. minihost-0.1.0/LICENSE +674 -0
  7. minihost-0.1.0/Makefile +107 -0
  8. minihost-0.1.0/PKG-INFO +651 -0
  9. minihost-0.1.0/README.md +621 -0
  10. minihost-0.1.0/TODO.md +37 -0
  11. minihost-0.1.0/examples/basic_usage.py +209 -0
  12. minihost-0.1.0/examples/play_plugin.py +232 -0
  13. minihost-0.1.0/projects/example/CMakeLists.txt +4 -0
  14. minihost-0.1.0/projects/example/example.c +162 -0
  15. minihost-0.1.0/projects/libminihost/CMakeLists.txt +33 -0
  16. minihost-0.1.0/projects/libminihost/minihost.cpp +1270 -0
  17. minihost-0.1.0/projects/libminihost/minihost.h +328 -0
  18. minihost-0.1.0/projects/libminihost/minihost_chain.cpp +335 -0
  19. minihost-0.1.0/projects/libminihost/minihost_chain.h +113 -0
  20. minihost-0.1.0/projects/libminihost_audio/CMakeLists.txt +52 -0
  21. minihost-0.1.0/projects/libminihost_audio/midi_ringbuffer.cpp +138 -0
  22. minihost-0.1.0/projects/libminihost_audio/midi_ringbuffer.h +46 -0
  23. minihost-0.1.0/projects/libminihost_audio/minihost_audio.c +701 -0
  24. minihost-0.1.0/projects/libminihost_audio/minihost_audio.h +141 -0
  25. minihost-0.1.0/projects/libminihost_audio/minihost_midi.cpp +345 -0
  26. minihost-0.1.0/projects/libminihost_audio/minihost_midi.h +91 -0
  27. minihost-0.1.0/projects/libremidi/.gitignore +95 -0
  28. minihost-0.1.0/projects/libremidi/AUTHORS +64 -0
  29. minihost-0.1.0/projects/libremidi/CMakeLists.txt +76 -0
  30. minihost-0.1.0/projects/libremidi/LICENSE.md +83 -0
  31. minihost-0.1.0/projects/libremidi/README.md +147 -0
  32. minihost-0.1.0/projects/libremidi/cmake/libremidi-config.cmake.in +3 -0
  33. minihost-0.1.0/projects/libremidi/cmake/libremidi.alsa.cmake +50 -0
  34. minihost-0.1.0/projects/libremidi/cmake/libremidi.cppwinrt.cmake +99 -0
  35. minihost-0.1.0/projects/libremidi/cmake/libremidi.deps.cmake +56 -0
  36. minihost-0.1.0/projects/libremidi/cmake/libremidi.emscripten.cmake +10 -0
  37. minihost-0.1.0/projects/libremidi/cmake/libremidi.examples.cmake +112 -0
  38. minihost-0.1.0/projects/libremidi/cmake/libremidi.install.cmake +38 -0
  39. minihost-0.1.0/projects/libremidi/cmake/libremidi.jack.cmake +37 -0
  40. minihost-0.1.0/projects/libremidi/cmake/libremidi.keyboard.cmake +10 -0
  41. minihost-0.1.0/projects/libremidi/cmake/libremidi.library.cmake +79 -0
  42. minihost-0.1.0/projects/libremidi/cmake/libremidi.macos.cmake +22 -0
  43. minihost-0.1.0/projects/libremidi/cmake/libremidi.net.cmake +55 -0
  44. minihost-0.1.0/projects/libremidi/cmake/libremidi.pipewire.cmake +50 -0
  45. minihost-0.1.0/projects/libremidi/cmake/libremidi.sources.cmake +154 -0
  46. minihost-0.1.0/projects/libremidi/cmake/libremidi.tests.cmake +53 -0
  47. minihost-0.1.0/projects/libremidi/cmake/libremidi.unix.cmake +0 -0
  48. minihost-0.1.0/projects/libremidi/cmake/libremidi.warnings.cmake +20 -0
  49. minihost-0.1.0/projects/libremidi/cmake/libremidi.win32.cmake +11 -0
  50. minihost-0.1.0/projects/libremidi/cmake/libremidi.winmidi.cmake +77 -0
  51. minihost-0.1.0/projects/libremidi/cmake/libremidi.winmm.cmake +17 -0
  52. minihost-0.1.0/projects/libremidi/cmake/libremidi.winuwp.cmake +31 -0
  53. minihost-0.1.0/projects/libremidi/include/libremidi/api-c.h +41 -0
  54. minihost-0.1.0/projects/libremidi/include/libremidi/api.hpp +91 -0
  55. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw/config.hpp +81 -0
  56. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw/error_domain.hpp +0 -0
  57. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw/helpers.hpp +303 -0
  58. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw/midi_in.hpp +356 -0
  59. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw/midi_out.hpp +169 -0
  60. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw/observer.hpp +253 -0
  61. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw.hpp +32 -0
  62. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw_ump/config.hpp +27 -0
  63. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw_ump/helpers.hpp +68 -0
  64. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw_ump/midi_in.hpp +349 -0
  65. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw_ump/midi_out.hpp +99 -0
  66. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw_ump/observer.hpp +14 -0
  67. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_raw_ump.hpp +31 -0
  68. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq/config.hpp +65 -0
  69. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq/helpers.hpp +308 -0
  70. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq/midi_in.hpp +549 -0
  71. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq/midi_out.hpp +180 -0
  72. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq/observer.hpp +389 -0
  73. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq/shared_handler.hpp +195 -0
  74. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq.hpp +49 -0
  75. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq_ump/config.hpp +55 -0
  76. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq_ump/helpers.hpp +0 -0
  77. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq_ump/midi_out.hpp +146 -0
  78. minihost-0.1.0/projects/libremidi/include/libremidi/backends/alsa_seq_ump.hpp +69 -0
  79. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi/config.hpp +42 -0
  80. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi/error_domain.hpp +72 -0
  81. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi/helpers.hpp +353 -0
  82. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi/midi_in.hpp +154 -0
  83. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi/midi_out.hpp +178 -0
  84. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi/observer.hpp +217 -0
  85. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi.hpp +24 -0
  86. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi_ump/config.hpp +23 -0
  87. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi_ump/helpers.hpp +2 -0
  88. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi_ump/midi_in.hpp +152 -0
  89. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi_ump/midi_out.hpp +159 -0
  90. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi_ump/observer.hpp +20 -0
  91. minihost-0.1.0/projects/libremidi/include/libremidi/backends/coremidi_ump.hpp +24 -0
  92. minihost-0.1.0/projects/libremidi/include/libremidi/backends/dummy.hpp +109 -0
  93. minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/config.hpp +17 -0
  94. minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/helpers.hpp +17 -0
  95. minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/midi_access.cpp +22 -0
  96. minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/midi_access.hpp +303 -0
  97. minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/midi_in.cpp +79 -0
  98. minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/midi_in.hpp +38 -0
  99. minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/midi_out.cpp +63 -0
  100. minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/midi_out.hpp +33 -0
  101. minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/observer.cpp +105 -0
  102. minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten/observer.hpp +37 -0
  103. minihost-0.1.0/projects/libremidi/include/libremidi/backends/emscripten.hpp +32 -0
  104. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/config.hpp +49 -0
  105. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/error_domain.hpp +78 -0
  106. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/helpers.hpp +319 -0
  107. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/midi_in.hpp +117 -0
  108. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/midi_out.hpp +181 -0
  109. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/observer.hpp +223 -0
  110. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack/shared_handler.hpp +153 -0
  111. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack.hpp +39 -0
  112. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack_ump/config.hpp +33 -0
  113. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack_ump/midi_in.hpp +119 -0
  114. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack_ump/midi_out.hpp +184 -0
  115. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack_ump/observer.hpp +235 -0
  116. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack_ump/shared_handler.hpp +0 -0
  117. minihost-0.1.0/projects/libremidi/include/libremidi/backends/jack_ump.hpp +34 -0
  118. minihost-0.1.0/projects/libremidi/include/libremidi/backends/keyboard/config.hpp +154 -0
  119. minihost-0.1.0/projects/libremidi/include/libremidi/backends/keyboard/midi_in.hpp +112 -0
  120. minihost-0.1.0/projects/libremidi/include/libremidi/backends/keyboard.hpp +23 -0
  121. minihost-0.1.0/projects/libremidi/include/libremidi/backends/linux/alsa.hpp +461 -0
  122. minihost-0.1.0/projects/libremidi/include/libremidi/backends/linux/dylib_loader.hpp +85 -0
  123. minihost-0.1.0/projects/libremidi/include/libremidi/backends/linux/helpers.hpp +77 -0
  124. minihost-0.1.0/projects/libremidi/include/libremidi/backends/linux/pipewire.hpp +178 -0
  125. minihost-0.1.0/projects/libremidi/include/libremidi/backends/linux/udev.hpp +194 -0
  126. minihost-0.1.0/projects/libremidi/include/libremidi/backends/net/config.hpp +86 -0
  127. minihost-0.1.0/projects/libremidi/include/libremidi/backends/net/helpers.hpp +94 -0
  128. minihost-0.1.0/projects/libremidi/include/libremidi/backends/net/midi_in.hpp +437 -0
  129. minihost-0.1.0/projects/libremidi/include/libremidi/backends/net/midi_out.hpp +288 -0
  130. minihost-0.1.0/projects/libremidi/include/libremidi/backends/net/observer.hpp +14 -0
  131. minihost-0.1.0/projects/libremidi/include/libremidi/backends/network.hpp +26 -0
  132. minihost-0.1.0/projects/libremidi/include/libremidi/backends/network_ump.hpp +25 -0
  133. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/config.hpp +53 -0
  134. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/context.hpp +618 -0
  135. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/helpers.hpp +476 -0
  136. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/midi_in.hpp +133 -0
  137. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/midi_out.hpp +189 -0
  138. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/observer.hpp +66 -0
  139. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire/shared_handler.hpp +153 -0
  140. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire.hpp +32 -0
  141. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire_ump/config.hpp +36 -0
  142. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire_ump/midi_in.hpp +135 -0
  143. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire_ump/midi_out.hpp +185 -0
  144. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire_ump/observer.hpp +68 -0
  145. minihost-0.1.0/projects/libremidi/include/libremidi/backends/pipewire_ump.hpp +39 -0
  146. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmidi/config.hpp +34 -0
  147. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmidi/helpers.hpp +96 -0
  148. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmidi/midi_in.hpp +114 -0
  149. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmidi/midi_out.hpp +96 -0
  150. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmidi/observer.hpp +274 -0
  151. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmidi.hpp +24 -0
  152. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm/config.hpp +31 -0
  153. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm/error_domain.hpp +70 -0
  154. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm/helpers.hpp +74 -0
  155. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm/midi_in.hpp +292 -0
  156. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm/midi_out.hpp +164 -0
  157. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm/observer.hpp +268 -0
  158. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winmm.hpp +38 -0
  159. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winuwp/config.hpp +19 -0
  160. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winuwp/helpers.hpp +63 -0
  161. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winuwp/midi_in.hpp +98 -0
  162. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winuwp/midi_out.hpp +77 -0
  163. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winuwp/observer.hpp +295 -0
  164. minihost-0.1.0/projects/libremidi/include/libremidi/backends/winuwp.hpp +24 -0
  165. minihost-0.1.0/projects/libremidi/include/libremidi/backends.hpp +261 -0
  166. minihost-0.1.0/projects/libremidi/include/libremidi/client.cpp +47 -0
  167. minihost-0.1.0/projects/libremidi/include/libremidi/client.hpp +205 -0
  168. minihost-0.1.0/projects/libremidi/include/libremidi/cmidi2.hpp +3297 -0
  169. minihost-0.1.0/projects/libremidi/include/libremidi/config.hpp +70 -0
  170. minihost-0.1.0/projects/libremidi/include/libremidi/configurations.hpp +68 -0
  171. minihost-0.1.0/projects/libremidi/include/libremidi/defaults.hpp +98 -0
  172. minihost-0.1.0/projects/libremidi/include/libremidi/detail/conversion.hpp +291 -0
  173. minihost-0.1.0/projects/libremidi/include/libremidi/detail/memory.hpp +40 -0
  174. minihost-0.1.0/projects/libremidi/include/libremidi/detail/midi_api.hpp +48 -0
  175. minihost-0.1.0/projects/libremidi/include/libremidi/detail/midi_in.hpp +56 -0
  176. minihost-0.1.0/projects/libremidi/include/libremidi/detail/midi_out.hpp +89 -0
  177. minihost-0.1.0/projects/libremidi/include/libremidi/detail/midi_stream_decoder.hpp +479 -0
  178. minihost-0.1.0/projects/libremidi/include/libremidi/detail/observer.hpp +27 -0
  179. minihost-0.1.0/projects/libremidi/include/libremidi/detail/semaphore.hpp +23 -0
  180. minihost-0.1.0/projects/libremidi/include/libremidi/detail/ump_stream.hpp +61 -0
  181. minihost-0.1.0/projects/libremidi/include/libremidi/error.hpp +64 -0
  182. minihost-0.1.0/projects/libremidi/include/libremidi/error_handler.hpp +63 -0
  183. minihost-0.1.0/projects/libremidi/include/libremidi/input_configuration.hpp +132 -0
  184. minihost-0.1.0/projects/libremidi/include/libremidi/libremidi-c.cpp +507 -0
  185. minihost-0.1.0/projects/libremidi/include/libremidi/libremidi-c.h +275 -0
  186. minihost-0.1.0/projects/libremidi/include/libremidi/libremidi.cpp +210 -0
  187. minihost-0.1.0/projects/libremidi/include/libremidi/libremidi.hpp +279 -0
  188. minihost-0.1.0/projects/libremidi/include/libremidi/message.hpp +297 -0
  189. minihost-0.1.0/projects/libremidi/include/libremidi/midi_in.cpp +374 -0
  190. minihost-0.1.0/projects/libremidi/include/libremidi/midi_out.cpp +327 -0
  191. minihost-0.1.0/projects/libremidi/include/libremidi/observer.cpp +138 -0
  192. minihost-0.1.0/projects/libremidi/include/libremidi/observer_configuration.hpp +149 -0
  193. minihost-0.1.0/projects/libremidi/include/libremidi/output_configuration.hpp +21 -0
  194. minihost-0.1.0/projects/libremidi/include/libremidi/protocols/remote_control.hpp +858 -0
  195. minihost-0.1.0/projects/libremidi/include/libremidi/reader.cpp +752 -0
  196. minihost-0.1.0/projects/libremidi/include/libremidi/reader.hpp +75 -0
  197. minihost-0.1.0/projects/libremidi/include/libremidi/shared_context.hpp +33 -0
  198. minihost-0.1.0/projects/libremidi/include/libremidi/system_error2.hpp +3508 -0
  199. minihost-0.1.0/projects/libremidi/include/libremidi/ump.hpp +123 -0
  200. minihost-0.1.0/projects/libremidi/include/libremidi/ump_events.hpp +374 -0
  201. minihost-0.1.0/projects/libremidi/include/libremidi/writer.cpp +213 -0
  202. minihost-0.1.0/projects/libremidi/include/libremidi/writer.hpp +52 -0
  203. minihost-0.1.0/projects/midifile/.gitignore +29 -0
  204. minihost-0.1.0/projects/midifile/CMakeLists.txt +214 -0
  205. minihost-0.1.0/projects/midifile/LICENSE.txt +23 -0
  206. minihost-0.1.0/projects/midifile/Makefile +106 -0
  207. minihost-0.1.0/projects/midifile/Makefile.library +184 -0
  208. minihost-0.1.0/projects/midifile/Makefile.programs +183 -0
  209. minihost-0.1.0/projects/midifile/README.md +1601 -0
  210. minihost-0.1.0/projects/midifile/appveyor.yml +45 -0
  211. minihost-0.1.0/projects/midifile/include/Binasc.h +161 -0
  212. minihost-0.1.0/projects/midifile/include/MidiEvent.h +80 -0
  213. minihost-0.1.0/projects/midifile/include/MidiEventList.h +90 -0
  214. minihost-0.1.0/projects/midifile/include/MidiFile.h +340 -0
  215. minihost-0.1.0/projects/midifile/include/MidiMessage.h +220 -0
  216. minihost-0.1.0/projects/midifile/include/Options.h +157 -0
  217. minihost-0.1.0/projects/midifile/src/Binasc.cpp +2012 -0
  218. minihost-0.1.0/projects/midifile/src/MidiEvent.cpp +305 -0
  219. minihost-0.1.0/projects/midifile/src/MidiEventList.cpp +868 -0
  220. minihost-0.1.0/projects/midifile/src/MidiFile.cpp +3507 -0
  221. minihost-0.1.0/projects/midifile/src/MidiMessage.cpp +2392 -0
  222. minihost-0.1.0/projects/midifile/src/Options.cpp +1219 -0
  223. minihost-0.1.0/projects/midifile/tools/80off.cpp +136 -0
  224. minihost-0.1.0/projects/midifile/tools/README.md +66 -0
  225. minihost-0.1.0/projects/midifile/tools/asciimidi.cpp +82 -0
  226. minihost-0.1.0/projects/midifile/tools/base642midi.cpp +42 -0
  227. minihost-0.1.0/projects/midifile/tools/binasc.cpp +520 -0
  228. minihost-0.1.0/projects/midifile/tools/chaninfo.cpp +111 -0
  229. minihost-0.1.0/projects/midifile/tools/createmidifile.cpp +126 -0
  230. minihost-0.1.0/projects/midifile/tools/createmidifile2.cpp +85 -0
  231. minihost-0.1.0/projects/midifile/tools/deltatimes.cpp +431 -0
  232. minihost-0.1.0/projects/midifile/tools/drumtab.cpp +114 -0
  233. minihost-0.1.0/projects/midifile/tools/durations.cpp +184 -0
  234. minihost-0.1.0/projects/midifile/tools/echomidi.cpp +48 -0
  235. minihost-0.1.0/projects/midifile/tools/extractlyrics.cpp +129 -0
  236. minihost-0.1.0/projects/midifile/tools/henonfile.cpp +477 -0
  237. minihost-0.1.0/projects/midifile/tools/linkinfo.cpp +64 -0
  238. minihost-0.1.0/projects/midifile/tools/maxtick.cpp +70 -0
  239. minihost-0.1.0/projects/midifile/tools/mid2hex.cpp +74 -0
  240. minihost-0.1.0/projects/midifile/tools/mid2hum.cpp +922 -0
  241. minihost-0.1.0/projects/midifile/tools/mid2mat.cpp +956 -0
  242. minihost-0.1.0/projects/midifile/tools/mid2mtb.cpp +230 -0
  243. minihost-0.1.0/projects/midifile/tools/mid2svg.cpp +2439 -0
  244. minihost-0.1.0/projects/midifile/tools/midi2base64.cpp +41 -0
  245. minihost-0.1.0/projects/midifile/tools/midi2beep.cpp +135 -0
  246. minihost-0.1.0/projects/midifile/tools/midi2binasc.cpp +321 -0
  247. minihost-0.1.0/projects/midifile/tools/midi2chords.cpp +547 -0
  248. minihost-0.1.0/projects/midifile/tools/midi2melody.cpp +267 -0
  249. minihost-0.1.0/projects/midifile/tools/midi2notes.cpp +941 -0
  250. minihost-0.1.0/projects/midifile/tools/midi2skini.cpp +228 -0
  251. minihost-0.1.0/projects/midifile/tools/midi2text.cpp +194 -0
  252. minihost-0.1.0/projects/midifile/tools/midicat.cpp +200 -0
  253. minihost-0.1.0/projects/midifile/tools/mididiss.cpp +476 -0
  254. minihost-0.1.0/projects/midifile/tools/midiexcerpt.cpp +364 -0
  255. minihost-0.1.0/projects/midifile/tools/midimean.cpp +278 -0
  256. minihost-0.1.0/projects/midifile/tools/midimixup.cpp +226 -0
  257. minihost-0.1.0/projects/midifile/tools/midirange.cpp +87 -0
  258. minihost-0.1.0/projects/midifile/tools/midireg.cpp +124 -0
  259. minihost-0.1.0/projects/midifile/tools/miditickdur.cpp +142 -0
  260. minihost-0.1.0/projects/midifile/tools/miditime.cpp +161 -0
  261. minihost-0.1.0/projects/midifile/tools/midiuniq.cpp +99 -0
  262. minihost-0.1.0/projects/midifile/tools/mts-type2.cpp +112 -0
  263. minihost-0.1.0/projects/midifile/tools/mts-type9.cpp +156 -0
  264. minihost-0.1.0/projects/midifile/tools/peep2midi.cpp +353 -0
  265. minihost-0.1.0/projects/midifile/tools/perfid.cpp +296 -0
  266. minihost-0.1.0/projects/midifile/tools/readstatus.cpp +76 -0
  267. minihost-0.1.0/projects/midifile/tools/redexpress.cpp +306 -0
  268. minihost-0.1.0/projects/midifile/tools/removenote.cpp +60 -0
  269. minihost-0.1.0/projects/midifile/tools/retick.cpp +64 -0
  270. minihost-0.1.0/projects/midifile/tools/shutak.cpp +243 -0
  271. minihost-0.1.0/projects/midifile/tools/smfdur.cpp +200 -0
  272. minihost-0.1.0/projects/midifile/tools/sortnotes.cpp +225 -0
  273. minihost-0.1.0/projects/midifile/tools/stretch.cpp +112 -0
  274. minihost-0.1.0/projects/midifile/tools/sysextest.cpp +184 -0
  275. minihost-0.1.0/projects/midifile/tools/temper.cpp +745 -0
  276. minihost-0.1.0/projects/midifile/tools/text2midi.cpp +298 -0
  277. minihost-0.1.0/projects/midifile/tools/textmidi.cpp +145 -0
  278. minihost-0.1.0/projects/midifile/tools/timeinfo.cpp +88 -0
  279. minihost-0.1.0/projects/midifile/tools/toascii.cpp +123 -0
  280. minihost-0.1.0/projects/midifile/tools/tobin.cpp +83 -0
  281. minihost-0.1.0/projects/midifile/tools/tobinary.cpp +140 -0
  282. minihost-0.1.0/projects/midifile/tools/todec.cpp +99 -0
  283. minihost-0.1.0/projects/midifile/tools/tohex.cpp +77 -0
  284. minihost-0.1.0/projects/midifile/tools/type0.cpp +144 -0
  285. minihost-0.1.0/projects/midifile/tools/vlv.cpp +301 -0
  286. minihost-0.1.0/projects/midifile/visual-studio/README.md +16 -0
  287. minihost-0.1.0/projects/midifile/visual-studio/binasc.vcxproj +89 -0
  288. minihost-0.1.0/projects/midifile/visual-studio/createmidifile.vcxproj +89 -0
  289. minihost-0.1.0/projects/midifile/visual-studio/midifile.sln +13 -0
  290. minihost-0.1.0/projects/midifile/visual-studio/midifile.vcxproj +100 -0
  291. minihost-0.1.0/projects/midifile/visual-studio/stretch.vcxproj +89 -0
  292. minihost-0.1.0/projects/miniaudio/miniaudio.c +2 -0
  293. minihost-0.1.0/projects/miniaudio/miniaudio.h +39734 -0
  294. minihost-0.1.0/projects/minihost_c/CMakeLists.txt +4 -0
  295. minihost-0.1.0/projects/minihost_c/main.c +996 -0
  296. minihost-0.1.0/projects/minihost_cpp/CMakeLists.txt +5 -0
  297. minihost-0.1.0/projects/minihost_cpp/include/CLI11.hpp +12045 -0
  298. minihost-0.1.0/projects/minihost_cpp/main.cpp +913 -0
  299. minihost-0.1.0/pyproject.toml +66 -0
  300. minihost-0.1.0/scripts/download_juce.sh +33 -0
  301. minihost-0.1.0/src/minihost/__init__.py +70 -0
  302. minihost-0.1.0/src/minihost/_core.cpp +1518 -0
  303. minihost-0.1.0/src/minihost/_core.pyi +232 -0
  304. minihost-0.1.0/src/minihost/cli.py +559 -0
  305. minihost-0.1.0/src/minihost/py.typed +0 -0
  306. minihost-0.1.0/src/minihost/render.py +651 -0
  307. minihost-0.1.0/tests/test_minihost.py +1195 -0
  308. 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()