# minihost TODO

## Completed

- [x] **MIDI input** - Add API to send MIDI events to plugins (notes, CC, pitch bend)
- [x] **MIDI output** - Capture MIDI generated by plugins (arpeggiators, MIDI effects)
- [x] **State save/load** - Save and restore plugin state for presets and session recall
- [x] **Parameter metadata** - Get parameter names, labels, units, and display strings
- [x] **Transport info** - Provide BPM, time signature, playhead position for tempo-synced plugins
- [x] **Tail time** - Query and handle plugin tail (reverbs, delays) after input stops
- [x] **Bypass** - Standard bypass functionality
- [x] **Parameter enumeration** - List all parameters with their ranges and properties
- [x] **Latency compensation** - Use reported latency for proper alignment
- [x] **Sample-accurate automation** - Parameter changes at specific sample positions within a block
- [x] **Thread safety** - Locking for parameter changes from non-audio threads
- [x] **Reset** - Clear internal state between unrelated audio segments
- [x] **Non-realtime mode** - Higher-quality algorithms for offline processing
- [x] **Plugin probe** - Get metadata without full instantiation
- [x] **Parameter text conversion** - Convert between normalized values and display strings
- [x] **Factory presets** - Access built-in plugin presets
- [x] **Sidechain support** - Multiple input bus configuration
- [x] **Bus layout queries** - Query plugin I/O topology
- [x] **Sample rate change** - Change sample rate without reloading, preserving parameter state
- [x] **Plugin scanning** - Discover plugins in a directory via `mh_scan_directory()`
- [x] **Double precision processing** - 64-bit audio processing via `mh_process_double()`
- [x] **Async plugin loading** - Background thread loading via `mh_open_async()`

## Non-goals

Intentionally omitted for headless/server use:

- Editor window management
- GUI hosting
- Preset browser UI
- Parameter change notifications (callbacks)
- MIDI learn
- Plugin shell/multi-instrument handling
