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.
- midigpt-0.2.4/.github/workflows/docs.yml +26 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/.github/workflows/wheels.yml +22 -3
- {midigpt-0.2.2 → midigpt-0.2.4}/.gitignore +1 -1
- midigpt-0.2.4/.pre-commit-config.yaml +7 -0
- midigpt-0.2.4/CHANGELOG.md +74 -0
- midigpt-0.2.4/CITATION.cff +53 -0
- midigpt-0.2.4/CONTRIBUTING.md +1 -0
- midigpt-0.2.4/PKG-INFO +432 -0
- midigpt-0.2.4/README.md +383 -0
- midigpt-0.2.4/docs/api.md +238 -0
- midigpt-0.2.4/docs/assets/extra.css +122 -0
- midigpt-0.2.4/docs/assets/logo.svg +17 -0
- midigpt-0.2.4/docs/concepts.md +152 -0
- midigpt-0.2.4/docs/contributing.md +141 -0
- midigpt-0.2.4/docs/http.md +167 -0
- midigpt-0.2.4/docs/index.md +53 -0
- midigpt-0.2.4/docs/models.md +108 -0
- midigpt-0.2.4/docs/osc.md +76 -0
- midigpt-0.2.4/docs/quickstart.md +204 -0
- midigpt-0.2.4/docs/training.md +149 -0
- midigpt-0.2.4/mkdocs.yml +68 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/pyproject.toml +39 -3
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/__init__.py +9 -5
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/_converters.py +38 -31
- midigpt-0.2.4/src/python/midigpt/_types.py +112 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/__init__.py +31 -30
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/base.py +26 -22
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/density.py +5 -5
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/key_signature.py +30 -8
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/note_duration.py +10 -8
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/pitch_class_set.py +5 -5
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/pitch_range.py +5 -5
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/polyphony.py +5 -5
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/quantile.py +31 -17
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/silence.py +6 -6
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/tension.py +43 -30
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/__init__.py +10 -10
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/bar_window.py +6 -4
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/base.py +11 -5
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/instrument_swap.py +2 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/mask_bar.py +11 -10
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/score_window.py +4 -3
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/track_permutation.py +2 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/transpose.py +3 -1
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/augmentation/velocity.py +3 -1
- midigpt-0.2.4/src/python/midigpt/http/__init__.py +3 -0
- midigpt-0.2.4/src/python/midigpt/http/server.py +217 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/__init__.py +5 -7
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/base.py +18 -17
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/config.py +59 -29
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/engine.py +46 -29
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/model/__init__.py +11 -6
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/model/gpt2.py +25 -13
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/model/registry.py +6 -5
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/model/torchscript_adapter.py +10 -6
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/model/transformer_lm_base.py +69 -17
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/session.py +203 -122
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/validation.py +35 -29
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/gen.py +45 -48
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/listen.py +4 -4
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/piece_state.py +107 -88
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/server.py +219 -164
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/app.py +47 -27
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/tokenizer/__init__.py +2 -2
- midigpt-0.2.4/src/python/midigpt/tokenizer/checkpoint.py +113 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/tokenizer/tokenizer.py +11 -9
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/__init__.py +6 -3
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/collator.py +5 -2
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/data_module.py +27 -23
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/dataset.py +117 -87
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/lightning_module.py +19 -14
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/preprocess.py +12 -4
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/training/trainer.py +49 -27
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/conftest.py +61 -43
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/model/test_engine.py +18 -15
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/model/test_gpt2.py +9 -18
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/model/test_registry.py +7 -5
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/model/test_torchscript_adapter.py +16 -23
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/model/test_transformer_lm_base.py +23 -22
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/session/test_ar.py +14 -15
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/session/test_constraints.py +11 -17
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/session/test_infill.py +10 -19
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/session/test_kv_runner.py +10 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/session/test_modes.py +13 -7
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_attributes.py +86 -69
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_augmentation.py +144 -103
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_checkpoint.py +50 -34
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_config.py +4 -1
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_converters.py +13 -6
- midigpt-0.2.4/tests/python/test_http.py +130 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_tokenizer.py +25 -23
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_types.py +10 -12
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/test_validation.py +89 -60
- midigpt-0.2.2/PKG-INFO +0 -556
- midigpt-0.2.2/README.md +0 -516
- midigpt-0.2.2/src/python/midigpt/_types.py +0 -79
- midigpt-0.2.2/src/python/midigpt/tokenizer/checkpoint.py +0 -68
- {midigpt-0.2.2 → midigpt-0.2.4}/.env.example +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/CMakeLists.txt +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/LICENSE +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/cmake/dependencies.cmake +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/include/nlohmann/json.hpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/models/expressive_config.json +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/models/ghost_config.json +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/models/train_config.json +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/models/yellow_config.json +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/models/yellow_encoder.json +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/bindings/lib.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/core/logging.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/core/score.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/core/types.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/io/midi_reader.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/io/midi_reader.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/io/midi_writer.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/io/midi_writer.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/attribute_value_constraint.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/bar_attribute_value_constraint.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/constraint.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/constraint_graph.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/constraint_graph.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/density_constraint.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/density_constraint.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/grammar_constraint.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/grammar_constraint.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/polyphony_constraint.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/masking/polyphony_constraint.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/sampling/generation_step.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/sampling/selection_mask.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/sampling/session_state.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/sampling/session_state.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/sampling/step_planner.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/sampling/step_planner.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/decoder.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/decoder.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/domain_transforms.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/encoder.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/encoder.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/encoder_config.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/encoder_config.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/vocabulary.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/cpp/tokenizer/vocabulary.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/attributes/density_quantiles.json +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/inference/inference.md +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/__init__.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/__init__.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/css/style.css +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/index.html +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/controllers/AppController.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/controllers/AudioController.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/controllers/MidiController.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/controllers/OscBridge.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/core/mvc.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/main.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/models/SessionModel.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/models/TrackModel.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/AttributeGraphView.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/ContextView.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/DebugView.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/ParamPanelView.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/PianoRollView.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/Splitters.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/TimingView.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/TrackHeaderView.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/TrackListView.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/js/views/TransportView.js +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/osc/studio/static/sf2/SOUNDFONTS.md +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/src/python/midigpt/utils.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/__init__.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/conftest.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/generate_edge_fixtures.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/6338816_Etude No. 4.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/6354774_Macabre Waltz.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Aicha.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/All The Small Things.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Funkytown.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Girls Just Want to Have Fun.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/I Gotta Feeling.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/In Too Deep.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Les Yeux Revolvers.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_1.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_10.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_2.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_3.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_4.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_5.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_6.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_7.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_8.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Maestro_9.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Mr. Blue Sky.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/POP909_008.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/POP909_010.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/POP909_022.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/POP909_191.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/Shut Up.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/What a Fool Believes.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/d6caebd1964d9e4a3c5ea59525230e2a.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/d8faddb8596fff7abb24d78666f73e4e.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/edge_cross_bar_sustain.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/edge_dense_polyphony.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/edge_drums_and_melodic.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/edge_time_sig_change.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/edge_very_long_note.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/midi/empty.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/pytest.ini +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_benchmark.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_benchmark_extensive.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_decode_parity.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_generation_extensive.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_infill_prompt_parity.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_midi_integrity.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_modes.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_osc_session.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_parity_raw.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_parity_raw_midi.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_step_planner_parity.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/comparison/test_tokenization_parity.py +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/doctest.h +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_constraints.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_domain_transforms.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_io.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_score.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_session_state.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_step_planner.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_tokenizer.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/cpp/test_vocabulary.cpp +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/6338816_Etude No. 4.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/6354774_Macabre Waltz.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Aicha.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/All The Small Things.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Funkytown.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Girls Just Want to Have Fun.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/I Gotta Feeling.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/In Too Deep.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Les Yeux Revolvers.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_1.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_10.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_2.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_3.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_4.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_5.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_6.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_7.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_8.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Maestro_9.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Mr. Blue Sky.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/POP909_008.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/POP909_010.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/POP909_022.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/POP909_191.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/Shut Up.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/What a Fool Believes.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/d6caebd1964d9e4a3c5ea59525230e2a.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/d8faddb8596fff7abb24d78666f73e4e.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/edge_cross_bar_sustain.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/edge_dense_polyphony.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/edge_drums_and_melodic.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/edge_time_sig_change.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/edge_very_long_note.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/empty.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/midi/piano_bell.mid +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/TEST_IMPLEMENTATION_PLAN.md +0 -0
- {midigpt-0.2.2 → midigpt-0.2.4}/tests/python/model/__init__.py +0 -0
- {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:
|
|
68
|
-
|
|
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:
|
|
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)
|
|
@@ -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
|
+
[](https://metacreation.net/category/projects/)
|
|
51
|
+
|
|
52
|
+
# midigpt
|
|
53
|
+
|
|
54
|
+
[](https://pypi.org/project/midigpt/)
|
|
55
|
+
[](https://pypi.org/project/midigpt/)
|
|
56
|
+
[](https://github.com/Metacreation-Lab/MIDI-GPT/actions/workflows/wheels.yml)
|
|
57
|
+
[](https://metacreation-lab.github.io/MIDI-GPT/)
|
|
58
|
+
[](LICENSE)
|
|
59
|
+
[](https://arxiv.org/abs/2501.17011)
|
|
60
|
+
[](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).
|