midigpt 0.2.2__tar.gz → 0.2.4__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 (264) hide show
  1. midigpt-0.2.4/.github/workflows/docs.yml +26 -0
  2. {midigpt-0.2.2 → midigpt-0.2.4}/.github/workflows/wheels.yml +22 -3
  3. {midigpt-0.2.2 → midigpt-0.2.4}/.gitignore +1 -1
  4. midigpt-0.2.4/.pre-commit-config.yaml +7 -0
  5. midigpt-0.2.4/CHANGELOG.md +74 -0
  6. midigpt-0.2.4/CITATION.cff +53 -0
  7. midigpt-0.2.4/CONTRIBUTING.md +1 -0
  8. midigpt-0.2.4/PKG-INFO +432 -0
  9. midigpt-0.2.4/README.md +383 -0
  10. midigpt-0.2.4/docs/api.md +238 -0
  11. midigpt-0.2.4/docs/assets/extra.css +122 -0
  12. midigpt-0.2.4/docs/assets/logo.svg +17 -0
  13. midigpt-0.2.4/docs/concepts.md +152 -0
  14. midigpt-0.2.4/docs/contributing.md +141 -0
  15. midigpt-0.2.4/docs/http.md +167 -0
  16. midigpt-0.2.4/docs/index.md +53 -0
  17. midigpt-0.2.4/docs/models.md +108 -0
  18. midigpt-0.2.4/docs/osc.md +76 -0
  19. midigpt-0.2.4/docs/quickstart.md +204 -0
  20. midigpt-0.2.4/docs/training.md +149 -0
  21. midigpt-0.2.4/mkdocs.yml +68 -0
  22. {midigpt-0.2.2 → midigpt-0.2.4}/pyproject.toml +39 -3
  23. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/__init__.py +9 -5
  24. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/_converters.py +38 -31
  25. midigpt-0.2.4/src/python/midigpt/_types.py +112 -0
  26. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/__init__.py +31 -30
  27. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/base.py +26 -22
  28. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/density.py +5 -5
  29. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/key_signature.py +30 -8
  30. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/note_duration.py +10 -8
  31. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/pitch_class_set.py +5 -5
  32. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/pitch_range.py +5 -5
  33. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/polyphony.py +5 -5
  34. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/quantile.py +31 -17
  35. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/silence.py +6 -6
  36. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/tension.py +43 -30
  37. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/__init__.py +10 -10
  38. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/bar_window.py +6 -4
  39. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/base.py +11 -5
  40. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/instrument_swap.py +2 -0
  41. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/mask_bar.py +11 -10
  42. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/score_window.py +4 -3
  43. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/track_permutation.py +2 -0
  44. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/transpose.py +3 -1
  45. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/velocity.py +3 -1
  46. midigpt-0.2.4/src/python/midigpt/http/__init__.py +3 -0
  47. midigpt-0.2.4/src/python/midigpt/http/server.py +217 -0
  48. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/__init__.py +5 -7
  49. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/base.py +18 -17
  50. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/config.py +59 -29
  51. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/engine.py +46 -29
  52. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/model/__init__.py +11 -6
  53. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/model/gpt2.py +25 -13
  54. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/model/registry.py +6 -5
  55. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/model/torchscript_adapter.py +10 -6
  56. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/model/transformer_lm_base.py +69 -17
  57. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/session.py +203 -122
  58. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/validation.py +35 -29
  59. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/gen.py +45 -48
  60. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/listen.py +4 -4
  61. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/piece_state.py +107 -88
  62. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/server.py +219 -164
  63. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/app.py +47 -27
  64. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/tokenizer/__init__.py +2 -2
  65. midigpt-0.2.4/src/python/midigpt/tokenizer/checkpoint.py +113 -0
  66. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/tokenizer/tokenizer.py +11 -9
  67. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/__init__.py +6 -3
  68. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/collator.py +5 -2
  69. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/data_module.py +27 -23
  70. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/dataset.py +117 -87
  71. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/lightning_module.py +19 -14
  72. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/preprocess.py +12 -4
  73. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/trainer.py +49 -27
  74. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/conftest.py +61 -43
  75. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/model/test_engine.py +18 -15
  76. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/model/test_gpt2.py +9 -18
  77. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/model/test_registry.py +7 -5
  78. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/model/test_torchscript_adapter.py +16 -23
  79. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/model/test_transformer_lm_base.py +23 -22
  80. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/session/test_ar.py +14 -15
  81. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/session/test_constraints.py +11 -17
  82. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/session/test_infill.py +10 -19
  83. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/session/test_kv_runner.py +10 -0
  84. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/session/test_modes.py +13 -7
  85. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_attributes.py +86 -69
  86. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_augmentation.py +144 -103
  87. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_checkpoint.py +50 -34
  88. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_config.py +4 -1
  89. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_converters.py +13 -6
  90. midigpt-0.2.4/tests/python/test_http.py +130 -0
  91. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_tokenizer.py +25 -23
  92. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_types.py +10 -12
  93. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_validation.py +89 -60
  94. midigpt-0.2.2/PKG-INFO +0 -556
  95. midigpt-0.2.2/README.md +0 -516
  96. midigpt-0.2.2/src/python/midigpt/_types.py +0 -79
  97. midigpt-0.2.2/src/python/midigpt/tokenizer/checkpoint.py +0 -68
  98. {midigpt-0.2.2 → midigpt-0.2.4}/.env.example +0 -0
  99. {midigpt-0.2.2 → midigpt-0.2.4}/CMakeLists.txt +0 -0
  100. {midigpt-0.2.2 → midigpt-0.2.4}/LICENSE +0 -0
  101. {midigpt-0.2.2 → midigpt-0.2.4}/cmake/dependencies.cmake +0 -0
  102. {midigpt-0.2.2 → midigpt-0.2.4}/include/nlohmann/json.hpp +0 -0
  103. {midigpt-0.2.2 → midigpt-0.2.4}/models/expressive_config.json +0 -0
  104. {midigpt-0.2.2 → midigpt-0.2.4}/models/ghost_config.json +0 -0
  105. {midigpt-0.2.2 → midigpt-0.2.4}/models/train_config.json +0 -0
  106. {midigpt-0.2.2 → midigpt-0.2.4}/models/yellow_config.json +0 -0
  107. {midigpt-0.2.2 → midigpt-0.2.4}/models/yellow_encoder.json +0 -0
  108. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/bindings/lib.cpp +0 -0
  109. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/core/logging.h +0 -0
  110. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/core/score.h +0 -0
  111. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/core/types.h +0 -0
  112. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/io/midi_reader.cpp +0 -0
  113. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/io/midi_reader.h +0 -0
  114. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/io/midi_writer.cpp +0 -0
  115. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/io/midi_writer.h +0 -0
  116. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/attribute_value_constraint.h +0 -0
  117. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/bar_attribute_value_constraint.h +0 -0
  118. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/constraint.h +0 -0
  119. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/constraint_graph.cpp +0 -0
  120. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/constraint_graph.h +0 -0
  121. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/density_constraint.cpp +0 -0
  122. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/density_constraint.h +0 -0
  123. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/grammar_constraint.cpp +0 -0
  124. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/grammar_constraint.h +0 -0
  125. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/polyphony_constraint.cpp +0 -0
  126. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/polyphony_constraint.h +0 -0
  127. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/sampling/generation_step.h +0 -0
  128. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/sampling/selection_mask.h +0 -0
  129. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/sampling/session_state.cpp +0 -0
  130. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/sampling/session_state.h +0 -0
  131. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/sampling/step_planner.cpp +0 -0
  132. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/sampling/step_planner.h +0 -0
  133. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/decoder.cpp +0 -0
  134. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/decoder.h +0 -0
  135. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/domain_transforms.h +0 -0
  136. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/encoder.cpp +0 -0
  137. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/encoder.h +0 -0
  138. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/encoder_config.cpp +0 -0
  139. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/encoder_config.h +0 -0
  140. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/vocabulary.cpp +0 -0
  141. {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/vocabulary.h +0 -0
  142. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/density_quantiles.json +0 -0
  143. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/inference.md +0 -0
  144. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/__init__.py +0 -0
  145. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/__init__.py +0 -0
  146. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/css/style.css +0 -0
  147. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/index.html +0 -0
  148. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/controllers/AppController.js +0 -0
  149. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/controllers/AudioController.js +0 -0
  150. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/controllers/MidiController.js +0 -0
  151. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/controllers/OscBridge.js +0 -0
  152. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/core/mvc.js +0 -0
  153. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/main.js +0 -0
  154. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/models/SessionModel.js +0 -0
  155. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/models/TrackModel.js +0 -0
  156. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/AttributeGraphView.js +0 -0
  157. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/ContextView.js +0 -0
  158. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/DebugView.js +0 -0
  159. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/ParamPanelView.js +0 -0
  160. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/PianoRollView.js +0 -0
  161. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/Splitters.js +0 -0
  162. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/TimingView.js +0 -0
  163. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/TrackHeaderView.js +0 -0
  164. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/TrackListView.js +0 -0
  165. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/TransportView.js +0 -0
  166. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/sf2/SOUNDFONTS.md +0 -0
  167. {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/utils.py +0 -0
  168. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/__init__.py +0 -0
  169. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/conftest.py +0 -0
  170. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/generate_edge_fixtures.py +0 -0
  171. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/6338816_Etude No. 4.mid +0 -0
  172. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/6354774_Macabre Waltz.mid +0 -0
  173. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Aicha.mid +0 -0
  174. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/All The Small Things.mid +0 -0
  175. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Funkytown.mid +0 -0
  176. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Girls Just Want to Have Fun.mid +0 -0
  177. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/I Gotta Feeling.mid +0 -0
  178. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/In Too Deep.mid +0 -0
  179. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Les Yeux Revolvers.mid +0 -0
  180. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_1.mid +0 -0
  181. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_10.mid +0 -0
  182. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_2.mid +0 -0
  183. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_3.mid +0 -0
  184. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_4.mid +0 -0
  185. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_5.mid +0 -0
  186. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_6.mid +0 -0
  187. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_7.mid +0 -0
  188. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_8.mid +0 -0
  189. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_9.mid +0 -0
  190. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Mr. Blue Sky.mid +0 -0
  191. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/POP909_008.mid +0 -0
  192. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/POP909_010.mid +0 -0
  193. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/POP909_022.mid +0 -0
  194. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/POP909_191.mid +0 -0
  195. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Shut Up.mid +0 -0
  196. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/What a Fool Believes.mid +0 -0
  197. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/d6caebd1964d9e4a3c5ea59525230e2a.mid +0 -0
  198. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/d8faddb8596fff7abb24d78666f73e4e.mid +0 -0
  199. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/edge_cross_bar_sustain.mid +0 -0
  200. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/edge_dense_polyphony.mid +0 -0
  201. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/edge_drums_and_melodic.mid +0 -0
  202. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/edge_time_sig_change.mid +0 -0
  203. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/edge_very_long_note.mid +0 -0
  204. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/empty.mid +0 -0
  205. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/pytest.ini +0 -0
  206. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_benchmark.py +0 -0
  207. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_benchmark_extensive.py +0 -0
  208. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_decode_parity.py +0 -0
  209. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_generation_extensive.py +0 -0
  210. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_infill_prompt_parity.py +0 -0
  211. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_midi_integrity.py +0 -0
  212. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_modes.py +0 -0
  213. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_osc_session.py +0 -0
  214. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_parity_raw.py +0 -0
  215. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_parity_raw_midi.py +0 -0
  216. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_step_planner_parity.py +0 -0
  217. {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_tokenization_parity.py +0 -0
  218. {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/doctest.h +0 -0
  219. {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_constraints.cpp +0 -0
  220. {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_domain_transforms.cpp +0 -0
  221. {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_io.cpp +0 -0
  222. {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_score.cpp +0 -0
  223. {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_session_state.cpp +0 -0
  224. {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_step_planner.cpp +0 -0
  225. {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_tokenizer.cpp +0 -0
  226. {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_vocabulary.cpp +0 -0
  227. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/6338816_Etude No. 4.mid +0 -0
  228. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/6354774_Macabre Waltz.mid +0 -0
  229. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Aicha.mid +0 -0
  230. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/All The Small Things.mid +0 -0
  231. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Funkytown.mid +0 -0
  232. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Girls Just Want to Have Fun.mid +0 -0
  233. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/I Gotta Feeling.mid +0 -0
  234. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/In Too Deep.mid +0 -0
  235. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Les Yeux Revolvers.mid +0 -0
  236. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_1.mid +0 -0
  237. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_10.mid +0 -0
  238. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_2.mid +0 -0
  239. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_3.mid +0 -0
  240. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_4.mid +0 -0
  241. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_5.mid +0 -0
  242. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_6.mid +0 -0
  243. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_7.mid +0 -0
  244. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_8.mid +0 -0
  245. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_9.mid +0 -0
  246. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Mr. Blue Sky.mid +0 -0
  247. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/POP909_008.mid +0 -0
  248. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/POP909_010.mid +0 -0
  249. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/POP909_022.mid +0 -0
  250. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/POP909_191.mid +0 -0
  251. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Shut Up.mid +0 -0
  252. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/What a Fool Believes.mid +0 -0
  253. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/d6caebd1964d9e4a3c5ea59525230e2a.mid +0 -0
  254. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/d8faddb8596fff7abb24d78666f73e4e.mid +0 -0
  255. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/edge_cross_bar_sustain.mid +0 -0
  256. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/edge_dense_polyphony.mid +0 -0
  257. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/edge_drums_and_melodic.mid +0 -0
  258. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/edge_time_sig_change.mid +0 -0
  259. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/edge_very_long_note.mid +0 -0
  260. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/empty.mid +0 -0
  261. {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/piano_bell.mid +0 -0
  262. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/TEST_IMPLEMENTATION_PLAN.md +0 -0
  263. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/model/__init__.py +0 -0
  264. {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/session/__init__.py +0 -0
@@ -0,0 +1,26 @@
1
+ name: Docs
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: write
10
+
11
+ jobs:
12
+ deploy:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+
17
+ - uses: actions/setup-python@v5
18
+ with:
19
+ python-version: "3.11"
20
+ cache: pip
21
+
22
+ - name: Install docs dependencies
23
+ run: pip install "mkdocs-material>=9.5" "mkdocstrings[python]>=0.24"
24
+
25
+ - name: Deploy to GitHub Pages
26
+ run: mkdocs gh-deploy --force
@@ -55,17 +55,36 @@ jobs:
55
55
  permissions:
56
56
  contents: write
57
57
  steps:
58
+ - uses: actions/checkout@v4
59
+
58
60
  - uses: actions/download-artifact@v4
59
61
  with:
60
62
  path: dist
61
63
  merge-multiple: true
62
64
 
65
+ - name: Extract changelog section for this tag
66
+ id: changelog
67
+ run: |
68
+ version="${GITHUB_REF#refs/tags/v}"
69
+ awk -v v="$version" '
70
+ $0 ~ "^## \\[?" v "\\]?" {flag=1; next}
71
+ flag && /^## / {exit}
72
+ flag {print}
73
+ ' CHANGELOG.md > release_notes.md
74
+ if [ ! -s release_notes.md ]; then
75
+ echo "No changelog entry found for v$version — falling back to auto-generated notes." >&2
76
+ echo "missing=true" >> "$GITHUB_OUTPUT"
77
+ else
78
+ echo "missing=false" >> "$GITHUB_OUTPUT"
79
+ fi
80
+
63
81
  - name: Publish release
64
82
  uses: softprops/action-gh-release@v2
65
83
  with:
66
84
  files: dist/*
67
- draft: true
68
- generate_release_notes: true
85
+ draft: false
86
+ body_path: release_notes.md
87
+ generate_release_notes: ${{ steps.changelog.outputs.missing == 'true' }}
69
88
 
70
89
  publish_pypi:
71
90
  name: Publish to PyPI
@@ -73,7 +92,7 @@ jobs:
73
92
  runs-on: ubuntu-latest
74
93
  if: startsWith(github.ref, 'refs/tags/v')
75
94
  environment:
76
- name: pypi
95
+ name: PyPI
77
96
  url: https://pypi.org/project/midigpt/
78
97
  permissions:
79
98
  id-token: write # required for PyPI Trusted Publishing (OIDC)
@@ -57,7 +57,7 @@ cmake_install.cmake
57
57
  notes/
58
58
  output/
59
59
  wandb/
60
- docs/
60
+ site/
61
61
 
62
62
  # Cluster-specific SLURM scripts and configs
63
63
  slurm/
@@ -0,0 +1,7 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.11.0
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix]
7
+ - id: ruff-format
@@ -0,0 +1,74 @@
1
+ # Changelog
2
+
3
+ All notable changes to `midigpt` are documented here.
4
+
5
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ The section header for a tagged release (e.g. `## [0.2.4]`) is extracted by
9
+ `.github/workflows/wheels.yml` and used as the GitHub Release body. Add a new
10
+ section above `[Unreleased]` before tagging.
11
+
12
+ ## [Unreleased]
13
+
14
+ ## [0.2.4] - 2026-06-03
15
+
16
+ ### Added
17
+ - Stateless HTTP server (`midigpt[http]` install extra) with end-to-end tests.
18
+ - `CITATION.cff` and root `CONTRIBUTING.md`.
19
+ - MkDocs documentation site, dark slate theme, brand styling, docs badge in README.
20
+ - Ruff + pre-commit linting setup.
21
+ - Curated `CHANGELOG.md` — release workflow now uses per-version sections as the GitHub Release body.
22
+ - Auto-publish GitHub Release on tag push (previously created a draft only).
23
+
24
+ ### Changed
25
+ - Checkpoint format migrated to safetensors (`format_version: 2`). The `.pt` packed-bundle loader still reads `format_version: 1`.
26
+
27
+ ### Fixed
28
+ - Session device mismatch on GPU inference.
29
+ - PyPI publish environment name.
30
+
31
+ ## [0.2.3] - 2026-06-01
32
+
33
+ ### Fixed
34
+ - Inference session bugs found in end-to-end testing.
35
+ - MSVC build: `TokenType` alias collision (C2365) replaced with non-conflicting `TT`.
36
+ - MSVC build: structured-binding failure over `std::pair<TokenType, int>`.
37
+ - GCC 14 / pybind11 build failure on `manylinux_2_28`.
38
+
39
+ ### Changed
40
+ - CI: upgraded `cibuildwheel` v2.21.3 → v3.4.1 to fix stale manylinux image.
41
+
42
+ ## [0.2.2] - 2026-05-31
43
+
44
+ ### Added
45
+ - HuggingFace Hub model loading via `InferenceEngine.from_pretrained`.
46
+ - Correct citation block in README.
47
+
48
+ ### Fixed
49
+ - Ghost microtiming: `use_microtiming=false` in config and README.
50
+ - HuggingFace repo ID: `Metacreation-Lab` → `Metacreation`.
51
+
52
+ ### Changed
53
+ - Studio exclusion, soundfont packaging, tension API tidy-up, Windows wheel fix.
54
+
55
+ ## [0.2.1] - 2026-05-30
56
+
57
+ ### Added
58
+ - `load_checkpoint` accepts a single-file `.pt` bundle (`format_version: 1`).
59
+ - Auto-publish to PyPI on tag via Trusted Publishing.
60
+
61
+ ### Changed
62
+ - Org rename: README, URLs, and version metadata aligned with `Metacreation-Lab`.
63
+ - Tension API removed from public surface.
64
+
65
+ ## [0.2.0] - 2026-05-29
66
+
67
+ ### Added
68
+ - First release of `midigpt` as a shipping Python package (refactor from research codebase).
69
+ - Tag-triggered wheel build workflow (`linux`/`macos`/`windows` × `cp310`/`cp311`/`cp312`).
70
+ - MIT LICENSE.
71
+ - `tqdm` in inference extras; training-test guards.
72
+
73
+ ### Fixed
74
+ - Wheel build: install `_core` extension; bump macOS deployment target to 10.15.
@@ -0,0 +1,53 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use this software, please cite it using the metadata below."
3
+ title: "MIDI-GPT: A Controllable Generative Model for Computer-Assisted Multitrack Music Composition"
4
+ version: 0.2.3
5
+ date-released: 2026-06-01
6
+ url: "https://github.com/Metacreation-Lab/MIDI-GPT"
7
+ repository-code: "https://github.com/Metacreation-Lab/MIDI-GPT"
8
+ license: MIT
9
+ type: software
10
+
11
+ authors:
12
+ - family-names: Pasquier
13
+ given-names: Philippe
14
+ affiliation: Simon Fraser University
15
+ - family-names: Ens
16
+ given-names: Jeff
17
+ affiliation: Simon Fraser University
18
+ - family-names: Fradet
19
+ given-names: Nathan
20
+ - family-names: Triana
21
+ given-names: Paul
22
+ affiliation: Simon Fraser University
23
+ - family-names: Rizzotti
24
+ given-names: Davide
25
+ - family-names: Rolland
26
+ given-names: Jean-Baptiste
27
+ - family-names: Safi
28
+ given-names: Maryam
29
+
30
+ preferred-citation:
31
+ type: article
32
+ title: "MIDI-GPT: A Controllable Generative Model for Computer-Assisted Multitrack Music Composition"
33
+ authors:
34
+ - family-names: Pasquier
35
+ given-names: Philippe
36
+ - family-names: Ens
37
+ given-names: Jeff
38
+ - family-names: Fradet
39
+ given-names: Nathan
40
+ - family-names: Triana
41
+ given-names: Paul
42
+ - family-names: Rizzotti
43
+ given-names: Davide
44
+ - family-names: Rolland
45
+ given-names: Jean-Baptiste
46
+ - family-names: Safi
47
+ given-names: Maryam
48
+ year: 2025
49
+ url: "https://arxiv.org/abs/2501.17011"
50
+ identifiers:
51
+ - type: other
52
+ value: "arXiv:2501.17011"
53
+ description: arXiv preprint
@@ -0,0 +1 @@
1
+ See the [Contributing guide](https://metacreation-lab.github.io/MIDI-GPT/contributing/) in the documentation.
midigpt-0.2.4/PKG-INFO ADDED
@@ -0,0 +1,432 @@
1
+ Metadata-Version: 2.2
2
+ Name: midigpt
3
+ Version: 0.2.4
4
+ Summary: GPT-2 transformer for symbolic music generation
5
+ Author: Metacreation Lab
6
+ License: MIT
7
+ Classifier: License :: OSI Approved :: MIT License
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.10
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Operating System :: MacOS
13
+ Classifier: Operating System :: POSIX :: Linux
14
+ Classifier: Operating System :: Microsoft :: Windows
15
+ Project-URL: Homepage, https://github.com/Metacreation-Lab/MIDI-GPT
16
+ Project-URL: Paper, https://arxiv.org/abs/2501.17011
17
+ Requires-Python: >=3.10
18
+ Provides-Extra: inference
19
+ Requires-Dist: torch>=2.0; extra == "inference"
20
+ Requires-Dist: numpy>=1.24; extra == "inference"
21
+ Requires-Dist: tqdm>=4.65; extra == "inference"
22
+ Requires-Dist: huggingface_hub>=0.22; extra == "inference"
23
+ Requires-Dist: safetensors>=0.4; extra == "inference"
24
+ Provides-Extra: train
25
+ Requires-Dist: midigpt[inference]; extra == "train"
26
+ Requires-Dist: lightning>=2.2; extra == "train"
27
+ Requires-Dist: datasets>=2.18; extra == "train"
28
+ Requires-Dist: pyarrow>=15.0; extra == "train"
29
+ Requires-Dist: python-dotenv>=1.0; extra == "train"
30
+ Provides-Extra: dev
31
+ Requires-Dist: pytest>=8.0; extra == "dev"
32
+ Requires-Dist: ruff>=0.4; extra == "dev"
33
+ Requires-Dist: mypy>=1.9; extra == "dev"
34
+ Provides-Extra: docs
35
+ Requires-Dist: mkdocs-material>=9.5; extra == "docs"
36
+ Requires-Dist: mkdocstrings[python]>=0.24; extra == "docs"
37
+ Provides-Extra: realtime
38
+ Requires-Dist: midigpt[inference]; extra == "realtime"
39
+ Requires-Dist: python-osc>=1.8; extra == "realtime"
40
+ Requires-Dist: flask>=3.0; extra == "realtime"
41
+ Requires-Dist: flask-socketio>=5.3; extra == "realtime"
42
+ Provides-Extra: http
43
+ Requires-Dist: midigpt[inference]; extra == "http"
44
+ Requires-Dist: fastapi>=0.111; extra == "http"
45
+ Requires-Dist: uvicorn[standard]>=0.29; extra == "http"
46
+ Provides-Extra: all
47
+ Requires-Dist: midigpt[realtime,train]; extra == "all"
48
+ Description-Content-Type: text/markdown
49
+
50
+ [![Metacreation Lab](https://drive.google.com/uc?export=view&id=1nzeq0DmD7hAYteRs5PA42150HIzO3Sz7)](https://metacreation.net/category/projects/)
51
+
52
+ # midigpt
53
+
54
+ [![PyPI](https://img.shields.io/pypi/v/midigpt)](https://pypi.org/project/midigpt/)
55
+ [![Python](https://img.shields.io/pypi/pyversions/midigpt)](https://pypi.org/project/midigpt/)
56
+ [![CI](https://img.shields.io/github/actions/workflow/status/Metacreation-Lab/MIDI-GPT/wheels.yml?branch=main&label=CI)](https://github.com/Metacreation-Lab/MIDI-GPT/actions/workflows/wheels.yml)
57
+ [![Docs](https://img.shields.io/badge/docs-online-blue)](https://metacreation-lab.github.io/MIDI-GPT/)
58
+ [![License: MIT](https://img.shields.io/github/license/Metacreation-Lab/MIDI-GPT)](LICENSE)
59
+ [![arXiv](https://img.shields.io/badge/arXiv-2501.17011-b31b1b)](https://arxiv.org/abs/2501.17011)
60
+ [![HuggingFace](https://img.shields.io/badge/HuggingFace-Metacreation%2FMIDI--GPT-FFD21E?logo=huggingface&logoColor=000)](https://huggingface.co/Metacreation/MIDI-GPT)
61
+
62
+ A transformer model for **computer-assisted multitrack music composition**.
63
+
64
+ - **Fill in missing bars** while preserving your existing arrangement
65
+ - **Generate new tracks** from scratch, conditioned on musical attributes
66
+ - **Steer the output** by controlling note density, polyphony, and note duration — globally or per bar
67
+ - **Integrate with your DAW** via a real-time OSC server
68
+ - **One-line setup** — load pretrained models from HuggingFace Hub, no compiler needed
69
+
70
+ ---
71
+
72
+ ## Installation
73
+
74
+ ```bash
75
+ pip install "midigpt[inference]"
76
+ ```
77
+
78
+ Pre-built wheels for CPython 3.10–3.12 on Linux (x86_64), macOS (x86_64 + arm64), and Windows (AMD64). No compiler needed.
79
+
80
+ | Extra | What it adds |
81
+ |---|---|
82
+ | `inference` | `torch>=2.0`, `tqdm`, `huggingface_hub` |
83
+ | `train` | PyTorch Lightning, HuggingFace `datasets`, `pyarrow`, `python-dotenv` |
84
+ | `realtime` | `python-osc`, Flask, Flask-SocketIO |
85
+ | `http` | FastAPI, uvicorn |
86
+ | `dev` | `pytest`, `ruff`, `mypy` |
87
+ | `all` | `realtime` + `train` |
88
+
89
+ ---
90
+
91
+ ## Quick start
92
+
93
+ Load a pretrained model from [HuggingFace Hub](https://huggingface.co/Metacreation/MIDI-GPT) and generate music in four lines:
94
+
95
+ ```python
96
+ from midigpt import Score, Track, Bar
97
+ from midigpt.inference import InferenceEngine, GenerationRequest, InferenceConfig, TrackPrompt
98
+
99
+ engine = InferenceEngine.from_pretrained("yellow")
100
+
101
+ # 4-bar score with one empty melodic track
102
+ score = Score(tracks=[Track(bars=[Bar() for _ in range(4)])])
103
+
104
+ result = engine.session(
105
+ score,
106
+ GenerationRequest(
107
+ tracks=[TrackPrompt(id=0, bars=[0, 1, 2, 3])],
108
+ config=InferenceConfig(model_dim=4, mask_mode="attention"),
109
+ ),
110
+ ).run()
111
+
112
+ total = sum(len(b.notes) for t in result.tracks for b in t.bars)
113
+ print(f"Generated {total} notes")
114
+ result.to_midi("output.mid")
115
+ ```
116
+
117
+ The model is downloaded once and cached by `huggingface_hub` in `~/.cache/huggingface/hub/`.
118
+
119
+ ---
120
+
121
+ ## Models
122
+
123
+ | Name | `num_bars_map` | Infill | Attributes | Download |
124
+ |---|---|---|---|---|
125
+ | `yellow` | 4, 8 | yes | note density, polyphony (min/max), note duration (min/max) | [yellow.pt](https://huggingface.co/Metacreation/MIDI-GPT/resolve/main/yellow.pt) |
126
+ | `ghost` | 4, 8, 12, 16 | yes | note density, polyphony (min/max), note duration (min/max) | coming soon |
127
+ | `expressive` | 4, 8 | yes | note density, polyphony (min/max), note duration (min/max) | coming soon |
128
+
129
+ `model_dim` in `InferenceConfig` is the context window in bars, not a vocabulary dimension — pass a value from the model's `num_bars_map`. `expressive` additionally encodes sub-grid timing via delta tokens.
130
+
131
+ ---
132
+
133
+ ## Inference API
134
+
135
+ ### Load a model
136
+
137
+ ```python
138
+ # By name (downloads from Metacreation/MIDI-GPT on HuggingFace Hub)
139
+ engine = InferenceEngine.from_pretrained("yellow") # or "ghost", "expressive"
140
+
141
+ # From a local .pt bundle
142
+ engine = InferenceEngine.from_checkpoint("path/to/model.pt")
143
+ ```
144
+
145
+ ### Infill existing bars
146
+
147
+ ```python
148
+ score = Score.from_midi("my_song.mid")
149
+
150
+ request = GenerationRequest(
151
+ tracks=[
152
+ TrackPrompt(id=0, bars=[4, 5, 6, 7]), # bars to regenerate
153
+ TrackPrompt(id=1, bars=[], ignore=True), # leave track 1 unchanged
154
+ ],
155
+ config=InferenceConfig(temperature=1.0, top_p=0.95, model_dim=8),
156
+ )
157
+
158
+ result = engine.session(score, request).run()
159
+ result.to_midi("output.mid")
160
+ ```
161
+
162
+ ### Autoregressive generation from scratch
163
+
164
+ ```python
165
+ request = GenerationRequest(
166
+ tracks=[
167
+ TrackPrompt(
168
+ id=0,
169
+ bars=[],
170
+ autoregressive=True,
171
+ attributes={"max_polyphony": 3}, # quantized attribute level
172
+ controls={"time_signature": 0}, # index into encoder TS list
173
+ ),
174
+ ],
175
+ config=InferenceConfig(temperature=1.0, model_dim=8, polyphony_hard_limit=4),
176
+ )
177
+ result = engine.session(score, request).run()
178
+ ```
179
+
180
+ ### Key types
181
+
182
+ | Class | Module | Purpose |
183
+ |---|---|---|
184
+ | `InferenceEngine` | `midigpt.inference` | Top-level loader and session factory |
185
+ | `GenerationRequest` | `midigpt.inference` | Bundle of per-track prompts and config |
186
+ | `TrackPrompt` | `midigpt.inference` | Per-track bars, mode, attributes, controls |
187
+ | `InferenceConfig` | `midigpt.inference` | Temperature, sampling filters, step planner |
188
+ | `SamplingSession` | `midigpt.inference` | Token-level sampling loop (returned by `session()`) |
189
+
190
+ ### `TrackPrompt` fields
191
+
192
+ | Field | Type | Default | Meaning |
193
+ |---|---|---|---|
194
+ | `id` | int | — | Track index in the score |
195
+ | `bars` | list[int] | — | Bars to generate |
196
+ | `autoregressive` | bool | `False` | Generate from scratch (no per-bar prompt) |
197
+ | `ignore` | bool | `False` | Omit this track from the token stream |
198
+ | `mask_bars` | list[int] | `[]` | Bars hidden with `MASK_BAR` (disjoint from `bars`) |
199
+ | `attributes` | dict[str,int] | `{}` | Quantized attribute overrides |
200
+ | `controls` | dict[str,Any] | `{}` | Token locks e.g. `{"time_signature": 0}` |
201
+ | `bar_attributes` | dict[int,dict] | `{}` | Per-bar attribute overrides (absolute bar index) |
202
+ | `bar_controls` | dict[int,dict] | `{}` | Per-bar control overrides (absolute bar index) |
203
+
204
+ ### Sampling filters
205
+
206
+ `InferenceConfig` exposes a four-stage logit-filtering pipeline (`top_k` → `top_p` → `mask_k` → `mask_p`):
207
+
208
+ | Field | Default | Meaning |
209
+ |---|---|---|
210
+ | `top_k` | `0` (off) | Keep top-k highest-probability tokens |
211
+ | `top_p` | `1.0` (off) | Nucleus: keep the smallest set summing to ≥ `top_p` |
212
+ | `mask_k` | `0` (off) | Remove the top-k most-likely tokens (novelty pressure) |
213
+ | `mask_p` | `0.0` (off) | Anti-nucleus: remove tokens summing to ≥ `mask_p` from the top |
214
+
215
+ A small `mask_k=1` or `mask_p=0.3` pushes the model off its most-confident picks — useful for getting diverse outputs when `novelty_check=True`.
216
+
217
+ ### Mask modes
218
+
219
+ Control how future bars appear in the context window:
220
+
221
+ | Mode | Behaviour |
222
+ |---|---|
223
+ | `"token"` | Encoder emits a `MaskBar` token (requires vocab support) |
224
+ | `"attention"` | Future bars zeroed in the KV cache via exact span masking |
225
+ | `"attention_approx"` | Single prefill mask + KV surgery; cheaper than `"attention"` |
226
+ | `"attention_skip"` | Future tokens filtered from input; `position_ids` passed explicitly |
227
+ | `"remove"` | Future bars omitted entirely from the token stream |
228
+
229
+ Set via `InferenceConfig(mask_mode="attention")`. `"attention"` works on all encoders; `"token"` requires the encoder vocab to include a `MaskBar` domain.
230
+
231
+ ### Attribute controls
232
+
233
+ Introspect available controls at runtime:
234
+
235
+ ```python
236
+ engine._analyzer.attribute_sizes() # {"note_density": 10, "min_polyphony": 10, ...}
237
+ engine._analyzer.attribute_value_labels() # {"note_density": ["very sparse", ...], ...}
238
+ engine._analyzer.attribute_track_types() # {"note_density": "melodic", ...}
239
+ ```
240
+
241
+ Pass quantized levels (integers in `[0, size)`) in `TrackPrompt.attributes`.
242
+
243
+ ---
244
+
245
+ ## Training
246
+
247
+ ### 1. Preprocess parquet shards
248
+
249
+ ```bash
250
+ python -m midigpt.training.preprocess \
251
+ --parquet /data/train/*.parquet \
252
+ --checkpoint models/yellow.pt
253
+ ```
254
+
255
+ Builds a valid-index cache so dataset initialization is instant on subsequent runs. Cached in `~/.midigpt/` (override with `MIDIGPT_CACHE`).
256
+
257
+ ### 2. Launch training
258
+
259
+ ```bash
260
+ python -m midigpt.training.trainer \
261
+ --config models/train_config.json \
262
+ --train-data /data/train/*.parquet \
263
+ --eval-data /data/valid/*.parquet \
264
+ --output-dir checkpoints/run_001
265
+ ```
266
+
267
+ ### 3. Python API
268
+
269
+ ```python
270
+ from midigpt.training.trainer import TrainConfig, train
271
+
272
+ config = TrainConfig.from_file("models/train_config.json")
273
+ train(config, train_path="/data/train/00000.parquet", eval_path="/data/valid/00000.parquet")
274
+ ```
275
+
276
+ `train()` uses PyTorch Lightning and writes a packed `.pt` bundle at the end of training containing weights, architecture config, and encoder config.
277
+
278
+ ### Key `TrainConfig` fields
279
+
280
+ | Field | Default | Notes |
281
+ |---|---|---|
282
+ | `n_embd` / `n_layer` / `n_head` | `512 / 6 / 8` | Model architecture |
283
+ | `max_seq_len` | `2048` | Token sequence cap |
284
+ | `infill_probability` | `0.75` | Fraction of samples trained with FillIn tokens |
285
+ | `mask_apply_probability` | `0.5` | Fraction of samples with `MASK_BAR` applied |
286
+ | `precision` | `"fp16"` | `"fp16"`, `"bf16"`, or `"fp32"` |
287
+ | `logger` | `"none"` | `"tensorboard"`, `"wandb"`, or `"none"` |
288
+ | `num_workers` | `0` | Must be 0 — the C++ MIDI parser is not fork-safe |
289
+
290
+ ---
291
+
292
+ ## HTTP server
293
+
294
+ ```bash
295
+ pip install "midigpt[http]"
296
+
297
+ # From a local checkpoint
298
+ midigpt-http --ckpt models/yellow.pt --port 8000
299
+
300
+ # From HuggingFace Hub (by name or repo ID)
301
+ midigpt-http --pretrained yellow --port 8000
302
+ midigpt-http --pretrained Metacreation/MIDI-GPT --hf-filename yellow.pt --port 8000
303
+ ```
304
+
305
+ A stateless REST API — every request carries the full score and generation parameters. The interactive API docs are available at `http://localhost:8000/docs`.
306
+
307
+ | Endpoint | Description |
308
+ |---|---|
309
+ | `GET /health` | Liveness probe |
310
+ | `GET /info` | Model capabilities and attribute sizes |
311
+ | `POST /generate` | `{score, request}` → `{score, timing}` |
312
+
313
+ ```bash
314
+ # Score: 1 melodic track, 4 empty bars — generate all 4 from scratch
315
+ curl -s -X POST http://localhost:8000/generate \
316
+ -H "Content-Type: application/json" \
317
+ -d '{
318
+ "score": {
319
+ "resolution": 480, "tempo": 500000,
320
+ "tracks": [{
321
+ "instrument": 0, "track_type": "melodic",
322
+ "bars": [
323
+ {"ts_numerator": 4, "ts_denominator": 4, "notes": []},
324
+ {"ts_numerator": 4, "ts_denominator": 4, "notes": []},
325
+ {"ts_numerator": 4, "ts_denominator": 4, "notes": []},
326
+ {"ts_numerator": 4, "ts_denominator": 4, "notes": []}
327
+ ]
328
+ }]
329
+ },
330
+ "request": {
331
+ "tracks": [{"id": 0, "bars": [0, 1, 2, 3]}],
332
+ "config": {"model_dim": 4}
333
+ }
334
+ }' | jq .score
335
+ ```
336
+
337
+ Use `--device cuda`, `--device mps`, or `--device auto` (default) to select the compute device.
338
+
339
+ ---
340
+
341
+ ## Real-time OSC server
342
+
343
+ ```bash
344
+ pip install "midigpt[realtime]"
345
+ midigpt-server --ckpt models/yellow.pt --port 7400
346
+ ```
347
+
348
+ Listens for OSC messages on a UDP port and streams generated notes back in real time. Generation is triggered bar-by-bar via `/midigpt/bar/end` on a background thread.
349
+
350
+ Selected OSC addresses:
351
+
352
+ | Address | Direction | Description |
353
+ |---|---|---|
354
+ | `/midigpt/session/init` | in | Start a new session |
355
+ | `/midigpt/track/create` | in | Register a track |
356
+ | `/midigpt/note` | in | Push an incoming note |
357
+ | `/midigpt/bar/end` | in | Signal bar end (triggers generation) |
358
+ | `/midigpt/param/set` | in | Adjust sampling parameters at runtime |
359
+ | `/midigpt/attr/set` | in | Set attribute overrides |
360
+ | `/midigpt/generated/note` | out | Emit a generated note |
361
+ | `/midigpt/generated/features` | out | Per-bar statistics |
362
+ | `/midigpt/capabilities` | out | Attribute support for the loaded checkpoint |
363
+
364
+ ---
365
+
366
+ ## Development
367
+
368
+ ### Setup
369
+
370
+ ```bash
371
+ git clone https://github.com/Metacreation-Lab/MIDI-GPT.git
372
+ cd MIDI-GPT
373
+ pip install -e ".[inference,dev]" # compiles the C++ extension in-place
374
+ ```
375
+
376
+ Prerequisites: Python 3.10+, CMake 3.21+, a C++20 compiler.
377
+
378
+ ### Tests
379
+
380
+ ```bash
381
+ # Python
382
+ pytest tests/python/
383
+ pytest tests/python -m "not slow and not inference" # CI subset (no model needed)
384
+
385
+ # C++
386
+ cmake -S . -B build_cpp -DCMAKE_BUILD_TYPE=Release
387
+ cmake --build build_cpp -j
388
+ ctest --test-dir build_cpp --output-on-failure
389
+ ```
390
+
391
+ ### Linting
392
+
393
+ ```bash
394
+ ruff check src/ tests/ # lint
395
+ ruff format src/ tests/ # format
396
+ ```
397
+
398
+ [pre-commit](https://pre-commit.com/) runs both automatically on commit:
399
+
400
+ ```bash
401
+ pip install pre-commit && pre-commit install
402
+ ```
403
+
404
+ ### Release
405
+
406
+ Tag a commit `vX.Y.Z` → `.github/workflows/wheels.yml` builds wheels on Linux / macOS / Windows × Python 3.10–3.12, drafts a GitHub Release, and publishes to PyPI via OIDC Trusted Publishing.
407
+
408
+ ### Logging
409
+
410
+ Set `MIDIGPT_LOG_LEVEL=DEBUG` (or a numeric level) before importing. Accepts both string names (`DEBUG`, `INFO`, `WARNING`) and integers.
411
+
412
+ ---
413
+
414
+ ## Citation
415
+
416
+ ```bibtex
417
+ @misc{pasquier2025midigptcontrollablegenerativemodel,
418
+ title={MIDI-GPT: A Controllable Generative Model for Computer-Assisted Multitrack Music Composition},
419
+ author={Philippe Pasquier and Jeff Ens and Nathan Fradet and Paul Triana and Davide Rizzotti and Jean-Baptiste Rolland and Maryam Safi},
420
+ year={2025},
421
+ eprint={2501.17011},
422
+ archivePrefix={arXiv},
423
+ primaryClass={cs.SD},
424
+ url={https://arxiv.org/abs/2501.17011},
425
+ }
426
+ ```
427
+
428
+ ---
429
+
430
+ ## License
431
+
432
+ MIT License — Copyright (c) 2026 Metacreation Lab. See [LICENSE](LICENSE).