subsequence 0.6.4__py3-none-any.whl

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 (78) hide show
  1. subsequence/__init__.py +231 -0
  2. subsequence/__main__.py +24 -0
  3. subsequence/assets/web/index.html +345 -0
  4. subsequence/cadences.py +113 -0
  5. subsequence/chord_graphs/__init__.py +100 -0
  6. subsequence/chord_graphs/aeolian_minor.py +158 -0
  7. subsequence/chord_graphs/chromatic_mediant.py +113 -0
  8. subsequence/chord_graphs/diminished.py +97 -0
  9. subsequence/chord_graphs/dorian_minor.py +127 -0
  10. subsequence/chord_graphs/functional_major.py +102 -0
  11. subsequence/chord_graphs/hooktheory_major.py +88 -0
  12. subsequence/chord_graphs/lydian_major.py +130 -0
  13. subsequence/chord_graphs/mixolydian.py +98 -0
  14. subsequence/chord_graphs/phrygian_minor.py +76 -0
  15. subsequence/chord_graphs/suspended.py +109 -0
  16. subsequence/chord_graphs/turnaround_global.py +157 -0
  17. subsequence/chord_graphs/whole_tone.py +77 -0
  18. subsequence/chords.py +419 -0
  19. subsequence/composition.py +6099 -0
  20. subsequence/conductor.py +238 -0
  21. subsequence/constants/__init__.py +24 -0
  22. subsequence/constants/durations.py +37 -0
  23. subsequence/constants/instruments/__init__.py +13 -0
  24. subsequence/constants/instruments/gm_cc.py +46 -0
  25. subsequence/constants/instruments/gm_drums.py +53 -0
  26. subsequence/constants/instruments/gm_instruments.py +32 -0
  27. subsequence/constants/instruments/roland_tr8s.py +320 -0
  28. subsequence/constants/instruments/vermona_drm1_drums.py +87 -0
  29. subsequence/constants/midi_notes.py +29 -0
  30. subsequence/constants/pulses.py +17 -0
  31. subsequence/constants/velocity.py +22 -0
  32. subsequence/definitions.py +232 -0
  33. subsequence/display.py +617 -0
  34. subsequence/easing.py +347 -0
  35. subsequence/event_emitter.py +109 -0
  36. subsequence/form_state.py +665 -0
  37. subsequence/forms.py +257 -0
  38. subsequence/groove.py +323 -0
  39. subsequence/harmonic_rhythm.py +83 -0
  40. subsequence/harmonic_state.py +352 -0
  41. subsequence/harmony.py +197 -0
  42. subsequence/held_notes.py +91 -0
  43. subsequence/helpers/__init__.py +0 -0
  44. subsequence/helpers/network.py +58 -0
  45. subsequence/helpers/wing.py +430 -0
  46. subsequence/intervals.py +436 -0
  47. subsequence/keystroke.py +249 -0
  48. subsequence/link_clock.py +128 -0
  49. subsequence/live_client.py +187 -0
  50. subsequence/live_reloader.py +298 -0
  51. subsequence/live_server.py +161 -0
  52. subsequence/melodic_state.py +483 -0
  53. subsequence/midi.py +97 -0
  54. subsequence/midi_utils.py +329 -0
  55. subsequence/mini_notation.py +164 -0
  56. subsequence/motifs.py +2356 -0
  57. subsequence/osc.py +194 -0
  58. subsequence/pattern.py +363 -0
  59. subsequence/pattern_algorithmic.py +2010 -0
  60. subsequence/pattern_builder.py +2589 -0
  61. subsequence/pattern_midi.py +1208 -0
  62. subsequence/progressions.py +1913 -0
  63. subsequence/py.typed +0 -0
  64. subsequence/roles.py +63 -0
  65. subsequence/sequence_utils.py +3123 -0
  66. subsequence/sequencer.py +2086 -0
  67. subsequence/tuning.py +453 -0
  68. subsequence/voicings.py +151 -0
  69. subsequence/web_ui.py +337 -0
  70. subsequence/weighted_graph.py +156 -0
  71. subsequence-0.6.4.dist-info/METADATA +208 -0
  72. subsequence-0.6.4.dist-info/RECORD +78 -0
  73. subsequence-0.6.4.dist-info/WHEEL +5 -0
  74. subsequence-0.6.4.dist-info/entry_points.txt +2 -0
  75. subsequence-0.6.4.dist-info/licenses/LICENSE +661 -0
  76. subsequence-0.6.4.dist-info/scm_file_list.json +193 -0
  77. subsequence-0.6.4.dist-info/scm_version.json +8 -0
  78. subsequence-0.6.4.dist-info/top_level.txt +1 -0
@@ -0,0 +1,208 @@
1
+ Metadata-Version: 2.4
2
+ Name: subsequence
3
+ Version: 0.6.4
4
+ Summary: A generative MIDI sequencer
5
+ Author-email: Simon Holliday <simon.holliday@protonmail.com>
6
+ License-Expression: AGPL-3.0-or-later
7
+ Project-URL: Repository, https://github.com/simonholliday/subsequence
8
+ Project-URL: Issues, https://github.com/simonholliday/subsequence/issues
9
+ Classifier: Programming Language :: Python :: 3
10
+ Requires-Python: >=3.10
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: mido>=1.3
14
+ Requires-Dist: python-rtmidi>=1.5
15
+ Requires-Dist: python-osc>=1.8
16
+ Requires-Dist: websockets>=12.0
17
+ Requires-Dist: pyyaml>=6.0
18
+ Requires-Dist: pymididefs>=0.2.5
19
+ Provides-Extra: test
20
+ Requires-Dist: pytest; extra == "test"
21
+ Requires-Dist: pytest-asyncio; extra == "test"
22
+ Provides-Extra: docs
23
+ Requires-Dist: pdoc>=14.0.0; extra == "docs"
24
+ Provides-Extra: dev
25
+ Requires-Dist: mypy>=1.8.0; extra == "dev"
26
+ Provides-Extra: link
27
+ Requires-Dist: aalink>=0.1.1; extra == "link"
28
+ Dynamic: license-file
29
+
30
+ # Subsequence
31
+
32
+ **A stateful algorithmic MIDI sequencer for Python.** Subsequence is a generative MIDI sequencer and algorithmic composition engine for your studio. It gives you a palette of algorithmic building blocks — Euclidean generators, cellular automata, L-systems, Markov chains — and a stateful engine that lets them interact and evolve over time, driving your hardware synths and VSTs with rock-solid timing.
33
+
34
+ It's designed for the musician who wants generative music with as much control — or chaos — as they choose, where patterns combine, react to context, and develop in ways that reward exploration. Unlike tools that loop a fixed pattern forever, Subsequence rebuilds every pattern fresh before each cycle, granting macro-level structural control and narrative evolution. Each rebuild has full context — the current chord, the composition section, the cycle count, shared data from other patterns. A Euclidean rhythm can thin itself as tension builds; a cellular automaton can seed from the harmony.
35
+
36
+ Use your own gear. Subsequence provides the logic; your Eurorack, Elektron boxes, or DAW provide the sound — with no fixed limits on tracks, polyphony, complexity, or pattern length.
37
+
38
+ > **What you need:** basic Python knowledge and any MIDI-controllable instrument. Whether you're an experienced coder or a musician learning Python for the first time, the API is designed to be approachable. Subsequence generates pure MIDI data; it does not produce sound itself.
39
+
40
+ **Want to dive in?** Learn it with the **[Cookbook ↗](https://subsequence.live/cookbook/)**, look things up in the **[API Reference ↗](https://subsequence.live/api/subsequence/index.html)**, or browse the full docs at **[subsequence.live ↗](https://subsequence.live)**.
41
+
42
+ ## Why Subsequence?
43
+
44
+ - **Between traditional and generative.** Most sequencers repeat a fixed loop; most live-coding environments are stateless. Subsequence rebuilds every pattern fresh each cycle with full context — current chord, section, history, shared data. Patterns that evolve, remember, and react.
45
+ - **Built-in harmonic intelligence.** An optional chord graph defines weighted chord and key transitions with adjustable gravity and automatic voice leading. Layer on cognitive harmony for Narmour-based melodic inertia — big leaps tend to reverse, small steps tend to continue.
46
+ - **Implicit compositional structure.** Predefined sections bring overarching musical form to a piece without getting stuck in infinite loops — music that grows and develops across defined movements.
47
+ - **Patterns that talk to each other.** Shared state (`composition.data`) lets autonomous generators cooperate without coupling. A drum pattern broadcasts its density; a bass pattern reads it to place complementary gaps. No callbacks, no wiring.
48
+ - **Precision and efficiency.** A hybrid timing strategy achieves typical pulse jitter of **< 5 μs** on Linux, with zero long-term drift — built for live performance and serious studio use.
49
+ - **Accessible Python, no CS degree required.** If you can configure a synth, you can write generative music here. Start with tiny scripts and learn as you go — it's the perfect project to tempt a musician into Python.
50
+ - **Explore, capture, produce.** Seed a session for deterministic output: explore freely, and when something clicks, the same seed recreates it exactly. Record to a standard multi-channel `.mid` file and bring it straight into your DAW.
51
+ - **Turn anything into music.** Patterns are plain Python functions, so any data source — live APIs, sensors, files, network streams — can drive musical decisions at rebuild time. If Python can read it, Subsequence can play it.
52
+ - **Microtonal-ready.** Scala `.scl` files and N-TET equal temperaments out of the box, realised via automatic per-note pitch bend — no MPE, no special hardware.
53
+
54
+ ## Quick example
55
+
56
+ This is all the code you need for a simple drum pattern:
57
+
58
+ ```python
59
+ import subsequence
60
+ import subsequence.constants.instruments.gm_drums as gm_drums
61
+
62
+ composition = subsequence.Composition(bpm=120)
63
+
64
+ @composition.pattern(channel=10, beats=4, drum_note_map=gm_drums.GM_DRUM_MAP)
65
+ def drums (p):
66
+
67
+ p.hit_steps("kick_1", [0, 4, 8, 12], velocity=100) # beats 1, 2, 3, 4
68
+ p.hit_steps("snare_1", [4, 12], velocity=90) # beats 2 and 4
69
+ p.hit_steps("hi_hat_closed", range(16), velocity=70) # every sixteenth
70
+
71
+ composition.play()
72
+ ```
73
+
74
+ ## Installation
75
+
76
+ Subsequence needs **Python 3.10+** and a MIDI destination — a hardware synth or drum machine, or a virtual MIDI port into your DAW or software instrument. It generates MIDI only; it makes no sound itself.
77
+
78
+ Install it into your project's virtual environment (no clone needed):
79
+
80
+ ```bash
81
+ pip install git+https://github.com/simonholliday/subsequence.git
82
+
83
+ # optional: Ableton Link tempo sync
84
+ pip install "subsequence[link] @ git+https://github.com/simonholliday/subsequence.git"
85
+ ```
86
+
87
+ Pin a piece to an exact release by appending a tag — `...subsequence.git@v0.6.2` — so it renders identically forever, whatever the library does next.
88
+
89
+ **Linux:** the ALSA backend needs your user in the `audio` group. If you hit `open /dev/snd/seq failed: Permission denied`:
90
+
91
+ ```bash
92
+ sudo usermod -a -G audio $USER # then log out and back in
93
+ ```
94
+
95
+ New to Subsequence? The Cookbook's **[Chapter 0 ↗](https://subsequence.live/cookbook/00-setup.html)** walks through installation, creating a virtual MIDI port on macOS / Windows / Linux, and your first sound, step by step. (Working from a clone instead? `pip install -e .` and hear it with `python examples/demo.py`.)
96
+
97
+ ## Documentation
98
+
99
+ Full documentation lives at **[subsequence.live ↗](https://subsequence.live)**.
100
+
101
+ | Resource | What it's for |
102
+ |---|---|
103
+ | **[Cookbook ↗](https://subsequence.live/cookbook/)** | **Learn it.** A narrative, fully runnable tutorial — from your first beat to generative composition, every concept earning the next. |
104
+ | **[API Reference ↗](https://subsequence.live/api/subsequence/index.html)** | **Look it up.** Every class, method, and function with full signatures and types, generated from source so it never drifts. |
105
+ | **[`api-cheatsheet.md`](api-cheatsheet.md)** | **Fast recall.** One-line signatures for the whole public surface, here in the repo. |
106
+ | **[`llms.txt` ↗](https://subsequence.live/llms.txt)** | **For AI agents.** A clean docs entry point, with the full-text bundle at [`llms-ctx.txt` ↗](https://subsequence.live/llms-ctx.txt). |
107
+
108
+ ## Design principles
109
+
110
+ Subsequence aims for *learn one verb, predict the rest*. A handful of conventions hold across the whole API:
111
+
112
+ - **Verbs share a common front.** The chord verbs (`chord`, `strum`, `arpeggio`, `broken_chord`) speak the same vocabulary — a chord or list of pitches, `root`, `velocity`, `count`, `beat` — so swapping one for another is usually a one-word change.
113
+ - **`(low, high)` means one random draw.** `velocity=(60, 90)` draws once per note from that range; a plain int is fixed.
114
+ - **One determinism knob: `seed=`.** Every generator takes `seed=` for a reproducible take (advanced: `rng=` to share a generator). Precedence is `rng=` > `seed=` > the pattern's `p.rng`.
115
+ - **Times are in beats; steps count grid slots.** `beat=`, `spacing=`, and `duration=` are in beats; `hit_steps`, `sequence`, and the decorator's `steps=` count grid steps.
116
+ - **Lenient names, strict numbers.** An unknown drum or voice *name* is dropped with a one-time warning (the rest of the pattern still plays); an unmapped CC/NRPN/RPN *number* raises, because a wrong control number is a real mistake.
117
+ - **Builders chain, accessors don't.** Methods that place or transform return the builder (`p.euclidean(...).swing(...)`); methods that read return plain data.
118
+
119
+ ## Performance
120
+
121
+ The internal master clock uses a hybrid sleep+spin strategy: it sleeps to within ~1 ms of each pulse, then busy-waits on `time.perf_counter()` for the remaining sub-millisecond interval. Pulse times are absolute offsets from the session start, so timing error never accumulates.
122
+
123
+ Measured jitter on Linux at 120 BPM (64 bars, 6144 pulses):
124
+
125
+ | Mode | Mean | P99 | Max | Long-term drift |
126
+ |---|---|---|---|---|
127
+ | Spin-wait on (default) | **3 μs** | 4 μs | ~100 μs\* | 0 |
128
+ | `asyncio.sleep` only | 853 μs | 1.37 ms | 1.72 ms | negligible |
129
+
130
+ <sub>\* Occasional spikes are Python GC pauses, not clock instability. Disable spin-wait (`composition.sequencer.disable_spin_wait()`) for ~1 ms jitter and lower CPU. Reproduce with `python benchmarks/clock_jitter.py --compare`.</sub>
131
+
132
+ ## Examples
133
+
134
+ The `examples/` directory holds self-documenting compositions. Because Subsequence emits pure MIDI, what you hear depends on the instruments you route to — the same code can drive a hardware monosynth, a VST orchestra, or anything between.
135
+
136
+ | Example | What it shows |
137
+ |---|---|
138
+ | `demo.py` / `demo_advanced.py` | Drums, bass, and an arpeggio over evolving E-aeolian harmony — the Composition API vs the Direct Pattern API, side by side. Start here. |
139
+ | `labyrinth.py` / `subharmonicon.py` | Fully documented recreations of two Moog semi-modular sequencers, every panel control exposed as a named variable. Exercise most of the API. |
140
+ | `arpeggiator.py` | Form sections, five patterns, cycle-dependent variation, Phrygian harmony, and section-aware muting. |
141
+ | `bresenham_poly.py` | Dense generative drums on a weighted-graph form (pulse → emerge → peak → dissolve); ghost fills, cellular automata, interlocking hats. |
142
+ | `emergence.py` | A six-section drum piece that breathes, builds, and breaks — Perlin fields, rare "fracture" eruptions, the full rhythm toolkit. |
143
+ | `frozen.py` | `freeze()` + `section_chords()` — a frozen verse and chorus alongside a live-generated bridge. |
144
+ | `iss.py` | Live International Space Station telemetry mapped to tempo, harmony, and arpeggio direction via `EasedValue`. |
145
+ | `link_sync.py` | Ableton Link synchronisation — join a LAN tempo/phase session, or start one for other apps to lock onto. |
146
+ | `live_init.py` + `live_patterns.py` | The file-watching live-coding workflow — edit and save to hear changes on the next bar. |
147
+ | `live_single_file.py` | The compact single-file variant that watches itself. |
148
+ | `load_patterns.py` | Registering patterns from a Python string (network or one-shot loads). |
149
+
150
+ Run any with `python examples/<name>.py`.
151
+
152
+ ## Roadmap
153
+
154
+ Recently shipped: the **[Cookbook and full API reference ↗](https://subsequence.live)** — a guided path from first sound to generative composition.
155
+
156
+ Planned, roughly in priority order:
157
+
158
+ - **Example library** — more short, single-screen compositions across styles (minimal techno, ambient generative, polyrhythmic, data-driven).
159
+ - **MIDI file import & analysis** — load `.mid` files and extract rhythmic or harmonic content to feed the algorithms (e.g. a Markov chain trained on a Bach invention).
160
+ - **Visual dashboard** — a richer real-time view of the chord graph, conductor signals, and active patterns.
161
+ - **Starter templates** — ready-made genre starting points for new compositions.
162
+ - **Network sync** — share conductor signals, progressions, and composition data between instances (tempo sync is already handled by Ableton Link).
163
+ - **Further out:** standalone Raspberry Pi mode, performance profiling, live-coding UX (editor integration), and CV/Gate output for modular synths.
164
+
165
+ ## Contributing and development
166
+
167
+ ```bash
168
+ git clone https://github.com/simonholliday/subsequence
169
+ cd subsequence
170
+ pip install -e ".[test]" # editable install with test deps
171
+
172
+ python -m pytest tests/ # run the suite (async tests use pytest-asyncio)
173
+ ```
174
+
175
+ For type checking, `pip install -e ".[dev]"` then `mypy subsequence/` — also enforced in CI on every pull request.
176
+
177
+ Feedback and ideas are very welcome — open a [Discussion ↗](https://github.com/simonholliday/subsequence/discussions) for questions, or an [Issue ↗](https://github.com/simonholliday/subsequence/issues) for bugs and feature requests.
178
+
179
+ ## Related projects
180
+
181
+ **[Subsample ↗](https://github.com/simonholliday/subsample)** — a sister project by the same author: a live sampler, automatic drum-kit builder, and MIDI sample instrument. Point a microphone at the world (or feed in recordings and sample packs) and Subsample captures, analyses, and maps every sound into a playable instrument automatically. Connect it to Subsequence over a virtual MIDI port, or enable OSC on both sides for richer event communication.
182
+
183
+ ## Credits
184
+
185
+ Subsequence makes use of these excellent open-source libraries:
186
+
187
+ | Library | Purpose | License |
188
+ |---|---|---|
189
+ | [mido ↗](https://github.com/mido/mido) | MIDI message handling and file I/O | MIT |
190
+ | [python-rtmidi ↗](https://github.com/SpotlightKid/python-rtmidi) | Real-time MIDI I/O | MIT |
191
+ | [python-osc ↗](https://github.com/attwad/python-osc) | OSC protocol support | Unlicense |
192
+ | [pymididefs ↗](https://github.com/simonholliday/PyMidiDefs) | Canonical MIDI 1.0/2.0 constant definitions | MIT |
193
+ | [websockets ↗](https://github.com/python-websockets/websockets) | Web UI dashboard communication | BSD-3-Clause |
194
+ | [aalink ↗](https://github.com/artfwo/aalink) *(optional)* | Ableton Link integration | GPL-3.0 |
195
+
196
+ [Ableton Link ↗](https://www.ableton.com/en/link/) is a technology by Ableton AG. The `aalink` Python wrapper is written by Artem Popov and licensed under GPL-3.0, which is compatible with Subsequence's AGPL-3.0 license.
197
+
198
+ ## Author
199
+
200
+ Subsequence was created by Simon Holliday ([simonholliday.com ↗](https://simonholliday.com/)), a senior technologist and a junior (but trying) musician. From running an electronic music label in the 2000s to prototyping new passive SONAR techniques for defence research, my work has often explored the intersection of code and sound. Subsequence was iterated over a series of proof-of-concept projects during 2025 and pulled together into this codebase in Spring 2026.
201
+
202
+ ## License
203
+
204
+ Subsequence is released under the [GNU Affero General Public License v3.0](LICENSE) (AGPLv3). You are free to use, modify, and distribute it under the terms of the AGPL. If you run a modified version as part of a network service, you must make the source code available to its users.
205
+
206
+ The core dependencies (mido, python-rtmidi, python-osc, websockets) are all permissively licensed (MIT, Unlicense, BSD-3-Clause). The optional Ableton Link integration uses `aalink` (GPL-3.0), compatible with the AGPL.
207
+
208
+ **Commercial licensing.** To use Subsequence in a proprietary or closed-source product without the obligations of the AGPL, contact simon.holliday@protonmail.com to discuss a commercial license.
@@ -0,0 +1,78 @@
1
+ subsequence/__init__.py,sha256=hTOyZ790Vz57TZkZW1Q4IbR6iZZcrT29IP-zQF95-W0,12384
2
+ subsequence/__main__.py,sha256=iRsscR3coZ2J24PGsI5NyvwvQuTmGMdOsHu6Alvga98,486
3
+ subsequence/cadences.py,sha256=-BdVlfaEXpLNBqJ_IZIOSF1VJsDSM9sO78oo-uPcitg,3455
4
+ subsequence/chords.py,sha256=eCGmu3G9zHvN38aC0Tqg0sWGlfKYhkEcJTMqxBvtHMg,12356
5
+ subsequence/composition.py,sha256=-_ZDFZxxNfNvB9eVdjzboUCSL2V-ga-fxD_8gzlrTFc,226433
6
+ subsequence/conductor.py,sha256=0xqMWlw87DobhOFeNJI1TWLZUPpr-D0O2jAotOtzGHs,6721
7
+ subsequence/definitions.py,sha256=D1KhkxhinxjtHxkQqIQ5YOH1EN6sVVeWvukQPGzIcnM,7588
8
+ subsequence/display.py,sha256=742reYrwGD0qVS7usf-yoLHpL8ISI2moJjHIS6SdJZ8,19018
9
+ subsequence/easing.py,sha256=D-iok0gi94gFDDRzZixs-ugTY03Qo7wz7Hv4Vf8RBTY,11902
10
+ subsequence/event_emitter.py,sha256=13FAnOtGUlNRAojYDoaraWxBx96K2u7_2RxekhqHLeI,2878
11
+ subsequence/form_state.py,sha256=rM14dYHZbArI-VO_Z9zEWKbuOHdFkjWviHZnERucihw,21347
12
+ subsequence/forms.py,sha256=Con25xzWeGh95FuWLpfUIxHxRStaykxMLd3piNJVZ_E,8542
13
+ subsequence/groove.py,sha256=FvHjR1le4IQcyERWBMOFYViErlZvEveO1fcy4JRq-pk,11561
14
+ subsequence/harmonic_rhythm.py,sha256=AnJiXNy6O8K87lw5wc9Ee2SeW9FWJqki4i6wycTDdXA,3218
15
+ subsequence/harmonic_state.py,sha256=aob73qYlqQhTOA6GydkoWrygTl2RBCholCeMaI-L5Wc,12297
16
+ subsequence/harmony.py,sha256=Rs32aOm7-e_hH-fAuMTRdXwCm-caRd1QbekfOQw4LQw,6337
17
+ subsequence/held_notes.py,sha256=g8uF7TDgx1Qw_aGyOzWIvm5O8QHrWWBv4fZEYn9gFy4,3420
18
+ subsequence/intervals.py,sha256=vaG6Py1ODLW2tmpvElCJQqbqWL7GnwFRCFUAYeeuaCk,14611
19
+ subsequence/keystroke.py,sha256=Pt1t4GZkd0xTC3M09nkMaenXZ8hVLopG1Ye_za89zgY,8314
20
+ subsequence/link_clock.py,sha256=blSJjIYKSwy8HkBNzXcqjba788LnUg-pC5uNATXny-8,4067
21
+ subsequence/live_client.py,sha256=1g_Zij0tcjICOkY80ylw_1VRLeq7UpvUnXmsqh4kRQI,4141
22
+ subsequence/live_reloader.py,sha256=6TNGhZzncIbqfFmzwissVkgIPGYH6PHTgCqaFfA7FbE,11433
23
+ subsequence/live_server.py,sha256=swVdSYUOAk2k9BEWnWE683Z22zYLbAxC_DKtdg5PMpI,4384
24
+ subsequence/melodic_state.py,sha256=xXxoCIbNxGUE6FwVthGQIsf2fYh2cyHgihgsCqKF68U,15185
25
+ subsequence/midi.py,sha256=3Zwk2hK5YoqmeGta6c_ds7Cc24K9gNqAJPbPJgFJ8Yk,2217
26
+ subsequence/midi_utils.py,sha256=7f4ET7cVB89shgwM4v8dcWPO5MntIgwZIhXtNSxgCd0,10181
27
+ subsequence/mini_notation.py,sha256=fmSVodJHf2UaON53gqrORjY-dKVVnxbw9Q0SttvvrN0,4119
28
+ subsequence/motifs.py,sha256=0bgLyAxtEvczDfekR_ThC2hRGwwLgVbPOJFfSDJ1J-k,83833
29
+ subsequence/osc.py,sha256=etJ9EcvXxtKFfW_R3KDejt5tHhw0ieiv2A1-VMUEMlg,5163
30
+ subsequence/pattern.py,sha256=5ioVEiZ6If9a82UhSf3pf-qhUCsT6_OmDuhPuPtPiLk,12760
31
+ subsequence/pattern_algorithmic.py,sha256=kCYzLXOBuYv-JO2sDXV5nz8PpPoGhSCPNQq3KyXE3sg,78186
32
+ subsequence/pattern_builder.py,sha256=HwGhwsOP5PKSab4RHtWhEIwG-ZH2uPMCqIuIdeON3k0,96776
33
+ subsequence/pattern_midi.py,sha256=ImHcghgzh8--gDfGawcAvhjXn8lSHGkovE5_6OvNws0,42113
34
+ subsequence/progressions.py,sha256=-zccUEfb7NdeyvdUmdlvDZL6kX8RQsBzj_5VrjOIADw,68598
35
+ subsequence/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ subsequence/roles.py,sha256=lStFd2YylhZyXnTQLTd3HeeMIhJy1OpY7QzNMMv6HvU,1795
37
+ subsequence/sequence_utils.py,sha256=2IofyRaQxanTHnXTVlNjSdkMXfz3cqukdkBNEisTD0c,100180
38
+ subsequence/sequencer.py,sha256=7lK7W4bFErGTlluU6E2HZ_C_hEkTVmjdOQEuh6tLBv4,75047
39
+ subsequence/tuning.py,sha256=3MPu8V1ThZ2AA0pA340IAaFV2ISAE9-UgvGCYyNZiRo,16839
40
+ subsequence/voicings.py,sha256=SEw0rWukTf0gO6scyfg97egOVoQLk2STEReW7XrwtEY,4642
41
+ subsequence/web_ui.py,sha256=rBpyGWzUroSWRqWGVL1LveBPlmuP_2G8ekj4s-fnXuU,11429
42
+ subsequence/weighted_graph.py,sha256=rgNHzykuqe1ugPWmpcI8p6LwHb71MWx41dRuQsTlL2A,3973
43
+ subsequence/assets/web/index.html,sha256=Dq7DIo4C0OEV1b_uYctwZlLMFUZQq-ixf205LkabuYk,11916
44
+ subsequence/chord_graphs/__init__.py,sha256=KVyGpwt243GdQpYshkme70frN4GQhbSaG8OJL3zt52g,2890
45
+ subsequence/chord_graphs/aeolian_minor.py,sha256=Yfxgpa8AC0ekq7WJkTwjcp6Pg6COW7jzoVVjo4zlaq4,6667
46
+ subsequence/chord_graphs/chromatic_mediant.py,sha256=r7SAeZRV4w319EVdMHwiOfn0bf92nBd9lzbw7ym1LqY,5105
47
+ subsequence/chord_graphs/diminished.py,sha256=k4JQXIod_2ltiEvKPq7fbXxsEUq0k4CTtHoRoxtBR7M,3770
48
+ subsequence/chord_graphs/dorian_minor.py,sha256=lylqFix9iZ7rXsjvywuLC4McJRhd7fjpbBTXKCBRQcs,5327
49
+ subsequence/chord_graphs/functional_major.py,sha256=Gf8v8hDb0g8nnGVzeBLqFGn64zQ7UOR_EWcJ9CKdzJI,4127
50
+ subsequence/chord_graphs/hooktheory_major.py,sha256=kXp0anpliM8SK7WJZr99r1DXJTo2qbiL5Sw2cmCtY1k,3810
51
+ subsequence/chord_graphs/lydian_major.py,sha256=npNKV4ewnigVnhEsG5tDSYxQ3TQ-MEQDSxx83KTCDe0,5307
52
+ subsequence/chord_graphs/mixolydian.py,sha256=5unYNGMUsSdyTt-DkilFMkpLjVuMLnVdcC16R4GpC_4,4015
53
+ subsequence/chord_graphs/phrygian_minor.py,sha256=bCBSGdDm2QI5PA3CppE5zLW8btp6CIXXU95uanJXsyQ,2918
54
+ subsequence/chord_graphs/suspended.py,sha256=Bozs_NaIKtfNeHoLcAgBE1FNxgQbZx16gyRrZgMbcxE,4693
55
+ subsequence/chord_graphs/turnaround_global.py,sha256=BsZefdn6UF1oaxJlnFC2zjKcDu-pZ9g9MCYIdhTGzhc,5947
56
+ subsequence/chord_graphs/whole_tone.py,sha256=UQiT0FzvEyh80ngxOPhonFoS7ElNkp3PFKuuyE_v8II,2468
57
+ subsequence/constants/__init__.py,sha256=VmYzKqKjNBakmmW2uuZa_JWW40Q2DQBL45q-OdRi35A,996
58
+ subsequence/constants/durations.py,sha256=p9T3889fxlfMEyZc9czbhbWlfY8zKksnlYXBgy16DVg,985
59
+ subsequence/constants/midi_notes.py,sha256=r0BoYDLSJMbbRe2J4DYNGZJlBtpFRah04MoLepL-Sr4,1054
60
+ subsequence/constants/pulses.py,sha256=mbKqUC5jBNpQVLPnyJc7KYYaeBelmhuxc4aXQAsiHQ4,546
61
+ subsequence/constants/velocity.py,sha256=PvtPx5ffrHA0hwVbpGD8GuQVVdAnDX638EuhtKb49wg,801
62
+ subsequence/constants/instruments/__init__.py,sha256=Sg6EnVDf_poM1-jV0u6Pw-T_0tD3vn2bxKnK6sH9XKE,666
63
+ subsequence/constants/instruments/gm_cc.py,sha256=ucvrLo7_4KALiedSXWOqhj2Z_0niLGqBoZOjaZlondI,1786
64
+ subsequence/constants/instruments/gm_drums.py,sha256=UmAP6i-jzsUHv4dpfEPIVZ1LHDb514mo2phyrx6mtCs,2229
65
+ subsequence/constants/instruments/gm_instruments.py,sha256=MrbC4KX92q4ZGJnKGnGtD5aAoe1EHahT8SZwFgIHaVQ,1005
66
+ subsequence/constants/instruments/roland_tr8s.py,sha256=mA3Dh5RHZ3kdKR6pwFMQIpFgRWJwZJA9rcSwIOFH19c,10074
67
+ subsequence/constants/instruments/vermona_drm1_drums.py,sha256=swnTZWuB5n8S90r4k67ot45rjHpv89WffUW2PpHsWi8,3608
68
+ subsequence/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
+ subsequence/helpers/network.py,sha256=As5SwlVnGQKSQoayEhtD7X581Z1oN0F-Y924L0SMZJ0,1479
70
+ subsequence/helpers/wing.py,sha256=xlY4ImlhF9Qd1jcE8Kjp4E4vM0ZVMo7KZXE8-gYecK8,12463
71
+ subsequence-0.6.4.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
72
+ subsequence-0.6.4.dist-info/METADATA,sha256=3QtGW1Rk6MITo0a2IQ0jTE2Ik96Af1jyoWQbdKdyz_Y,15568
73
+ subsequence-0.6.4.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
74
+ subsequence-0.6.4.dist-info/entry_points.txt,sha256=su7Q0QZz7gHEc3HKow6bUoO0YNN9QUcQphSqLMTUVBE,58
75
+ subsequence-0.6.4.dist-info/scm_file_list.json,sha256=qwaDrGsH2X44AP7VOl7VGNjcBTvnZuBEPM6fyrbSWng,6697
76
+ subsequence-0.6.4.dist-info/scm_version.json,sha256=7iAhouK-jPrdyaDscKZB8dXhfkyFcXOgEsTeD18s7-k,160
77
+ subsequence-0.6.4.dist-info/top_level.txt,sha256=drPof89nRU-JjLb6p0ZVhnKkVL00TrZTCLo676etMzk,12
78
+ subsequence-0.6.4.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (83.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ subsequence = subsequence.__main__:main