Releases: simonholliday/subsequence
v0.6.2 - Feature Release
- Density methods
- Sequence helper functions
- README slim down and link to dedicated documentation site
- Allow empty steps to be valid
Full Changelog: v0.6.1...v0.6.2
v0.6.1 - Documentation formatting
Boring release. Just docstring formats for the upcoming documentation.
Full Changelog: v0.6.0...v0.6.1
v0.6.0 - Motifs, Phrases, Progressions
- new motifs.py (Motif/Phrase, +2,289), progressions.py (the unified Progression value, +1,861), forms/cadences/energy, melody engine v2, presets, composition.py (+2,471).
- New public API surface (Motif, Phrase, Progression, Form, Section, cadences, roles, sieve…).
- Various fixes
- Docstring formatting updates
Breaking changes:
- comp.seed is now a property" (comp.seed = 42, not comp.seed(42)); all RNG streams re-keyed → seeded playback changes for every existing seed.
- span-based progressions, live clock pre-commits a step, freeze() returns the new value; also removes progression.py/ChordTimeline (note tests/test_progression.py is deleted, −360).
Full Changelog: v0.5.1...v0.6.0
v0.5.1 - Terminology Adjustments
Changes to certain terms in order to remove ambiguity before next batch of work. Some breaking changes in here.
Full Changelog: v0.5.0...v0.5.1
v0.5.0 - API vocab overhaul, plus misc features and fixes
Breaking changes - API vocab has been unified for consistency:
- Decorators
@pattern/@layer/@trigger:unit=->step_duration= p.strum():offset=->spacing=p.swing():amount=->percent=p.evolve():steps=->length=p.fibonacci():steps=->count=(now a required argument)p.branch():seed=(pitch list) ->pitches=(and a new integerseed=for the RNG)p.cellular_2d(): the overloadedseed=split intoinitial_state=("center"/"random"/grid) + an integerseed=- Generators (euclidean, bresenham, cellular, etc.):
dropout=->probability=- and the meaning flipped to "chance a note plays" (1.0 = always), consistent withhit_steps/sequence - Also removed the pre-existing
cellular/generate_cellular_automatonno-op aliases
Behaviour change (not breaking but will sound different):
p.broken_chord()default velocity 100 -> 90, matching the softer chord/strum bucket. Velocity defaults are now routed through named constants (single 100 / chord 90 / generative 80 / cellular 60 / ghost 35).
New features:
- Declarative chord progressions - new
p.progression()andcomp.chords(), plusbetween(low, high, step=...)for irregular/quantised harmonic rhythm (newprogression.py+harmonic_rhythm.pymodules, new public exports). - Per-device latency compensation -
latency_mscan now be set at device initialization; the engine aligns faster devices to the slowest so multi-device rigs stay phase-tight. - Unified randomness controls -
seed=/rng=are now accepted consistently across the generative methods (precedencerng>seed> the pattern's own RNG).
Instruments & harmony
- Ambiguous GM drum mappings removed, drum map tidied; bumped to the latest PyMidiDefs.
- Chord-graph refinements (functional-major, aeolian/dorian-minor, lydian-major, chromatic-mediant) making more diatonic colour chords reachable.
Also various fixes and documentation corrections.
Full Changelog: v0.4.1...v0.5.0
v0.4.1 - Feature Release
- Create sandbox folder for local work
- Documentation improvements
- Add "detatched" articulation
- Add universal velocity tuple syntax
- Fix for crash in live-coding
Full Changelog: v0.4.0...v0.4.1
v0.4.0 - Feature Release
- CC name maps - string-based CC access in p.cc() / p.cc_ramp() via cc_name_map= on the decorator
- RPN/NRPN parameter control - p.nrpn(), p.rpn(), nrpn_ramp(), rpn_ramp() with name-map resolution and the same-pulse FIFO ordering fix in the sequencer
- MIDI mirroring - mirrors=[(device, channel), ...] on patterns/layers/triggers; runtime composition.mirror() / unmirror() / unmirror_all()
- Live coding (two flavours) - file-watching via composition.watch(path); in-memory string via composition.load_patterns(source); both share the diff-and-unregister pipeline via _apply_source_async. New composition.unregister(name) tears down sustaining notes across primary + mirrors.
- Multi-device output and aliases - midi_output(), midi_input() can be called repeatedly to register additional devices with optional name aliases
- Fixes to examples
Full Changelog: v0.3.4...v0.4.0
v0.3.4 - Features, Maintenance, Bug-Fixes
v0.3.4 - Features, Maintenance, Bug-Fixes
- MIDI constant definitions now sourced from PyMidiDefs (canonical source for MIDI 1.0/2.0 standards)
- All existing imports work unchanged: import subsequence.constants.midi_notes as notes, etc.
- New capabilities now available:
- notes.note_to_name(60) → "C4" and notes.name_to_note("Db4") → 61
- Octave -1 notes (C_NEG1 through B_NEG1, MIDI 0-11)
- GM instrument program map: import subsequence.constants.instruments.gm_instruments as gm
- CC constants now explicitly available: import subsequence.constants.midi_cc as cc
- Multi-device MIDI I/O (522e838, d299a0a, ebf9cf2, 137628c, 4d993c4) - full multi-input/output support with device aliases and cc_map/cc_forward routing
- MidiEvent refactor + _has_pitch_at_beat() helper (9dc2c48) - cleaner dataclass conversion, refactored euclidean/bresenham/ghost_fill
- Rounding error fix (91cdd95) - _has_pitch_at_beat() now uses truncation to match placement (beat-to-pulse consistency)
- scale_notes docstring (6772a70) - documented key/low independence and the silent-skip behavior
- CC realtime forwarding (ae64c80) - instant cc_forward with auto-routing
- Ghost fill bias modification (9ea8065) - bias results can now be passed and modified
- Tuner tone script (06853c9) - new example utility
- CC filter params constants (1ce9f26) - new constants file
Upgrade Instructions:
pip install -e . # Refreshes dependencies
Full Changelog: v0.3.3...v0.3.4
v0.3.3 - Features, Maintenance, Bug-Fixes
- Reordered _run() in sequencer.py to resolve device indices and share configuration before opening hardware ports.
- Internal MIDI setup now triggers before pattern building, ensuring the system tracks correctly even during the first cycle.
- Fixed a bug in MIDI device alias storage and improved tracking for the primary input alias.
- Resolved inconsistencies when following external clocks across multiple MIDI devices.
- Added subsequence/constants/midi_cc.py containing a comprehensive map of MIDI CC definitions.
- Added scripts/tuner_tone.py as a utility to help tune drifting analogue instruments using reference tones.
- Updated the MIDI observer script to use intuitive 1-indexed channels instead of 0-based.
- Standardized pulse lookups to use truncation
Full Changelog: v0.3.2...v0.3.3
v0.3.2 - Feature Release
- Multiple MIDI Device Support: A major architectural update to Composition, Sequencer, and MidiUtils allowing multiple input and output devices to be managed simultaneously.
- Customizable Ghost Fill Bias: You can now modify the results of a ghost fill bias calculation and pass them back into the ghost_fill method, enabling highly customized probability-based note placement.
- MIDI CC Realtime Forwarding: Added the ability to forward incoming MIDI CC messages to output devices in realtime, with a dedicated with a dedicated midi.py module for handling these low-latency messages.
Full Changelog: v0.3.1...v0.3.2