Releases: simonholliday/subsequence
Releases · simonholliday/subsequence
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
v0.3.1 - Feature Release
- MIDI 'sidechain' support using p.duck_map() - allows patterns to easily react to kick or other trigger steps for sidechain ducking effects
- New easing & ramp helpers
Full Changelog: v0.3.0...v0.3.1
v0.3.0 - Feature Release
- Added specific shortcuts/methods for calculating progress through musical phrases of specific lengths.
- Added a MIDI observer script to facilitate MIDI controller setup and troubleshooting.
- Improved external MIDI clock handling: the engine now estimates BPM from incoming clock ticks before the MIDI "start" message is received.
- Added the ratchet pattern method for rapid subdivision of hits.
Full Changelog: v0.2.9...v0.3.0
v0.2.9 - Feature Release
- Implementation of alternative tuning systems, including support for parsing Scala (.scl) files.
Full Changelog: v0.2.8...v0.2.9
v0.2.8 - Feature Release
- Three new compositional mutation algorithms:
- p.evolve() - looping pitch buffer with per-cycle drift mutation
- p.branch() - fractal melodic variation via binary transform tree (retrograde, invert, transpose, rotate, compress, expand)
- p.quantize(strength=) - probabilistic quantization (0.0–1.0)
- Instrument emulations
- Moog Labyrinth example (dual polymetric generative sequencers with CORRUPT mutation)
- Moog Subharmonicon example (dual 4-step sequencers with subharmonic oscillators)
- Removed ambiguous length= - replaced with beats=, bars=, steps=+unit=
Full Changelog: v0.2.7...v0.2.8
v0.2.7 - Feature Release
- 1-Indexed MIDI Channels: Switched the default MIDI channel convention to be 1-indexed (e.g., channel 10 now correctly refers to the standard drum channel). This may require updates to existing compositions that relied on 0-indexed values.
- Terminology Clarification: Updated definitions and usage for bar vs. cycle and Narmour Implication-Realization (NIR) harmonic gravity.
- Parameter Consistency: Standardized parameter naming across the codebase (e.g., step vs. steps vs. spacing) and documented p.grid.
- Added scripts/generate_cheatsheet.py to automatically extract and document the public API surface (classes, methods, and sequence utilities).
- Created api-cheatsheet.md in the root directory for a quick reference to all core functions and algorithms.
- README Cleanup: Fixed misleading examples and updated outdated parameter references.
Full Changelog: v0.2.6...v0.2.7
v0.2.6 - Feature Release
- Ableton Link Support: Added integration for Ableton Link synchronization.
- Time Signature Support: Implemented global time signature configuration.
- Command Aliases: Added rotate as an alias for the roll command.
- Scale Utilities: Added scale_notes() and scale_pitch_classes() in intervals.py to generate MIDI note lists dynamically. Updated melodic_state.py and build_diatonic_chords() to utilize the new scale utilities.
- Mode Standardization: Standardized musical mode names (e.g., renamed natural_minor to aeolian).
- Documentation: Restructured the README.md for better clarity and updated all examples to use constants and scale utilities.
Full Changelog: v0.2.5...v0.2.6
v0.2.5 - Feature Release
- Real-time pattern triggering - New composition.trigger() API for one-shot patterns in response to external events (sensors, OSC, MIDI). Supports quantization (dur.QUARTER, dur.WHOLE, etc.), chord context injection, and thread-safe scheduling.
- Fluent method chaining - All public PatternBuilder methods now return self for fluent syntax
Full Changelog: v0.2.4...v0.2.5