Description
Implement the three-thread architecture: mido MIDI callbacks, OSC server daemon thread, and main thread for rendering + USB display transfer.
Tasks
Acceptance Criteria
- All three threads run concurrently without deadlocks
- Display updates at 30fps when parameters are changing
- Display doesn't black out during idle periods (keep-alive)
- Clean shutdown releases USB, stops OSC server, closes MIDI
Technical Notes
Main Thread: Push2 init → render loop (30fps) → display_frame()
mido Thread: @on_encoder_rotated → state.set_from_encoder() → osc_client.send()
OSC Thread: ThreadingOSCUDPServer → state.set_from_osc()
display_frame() is blocking USB (~2-5ms)
- Push2() must be created on main thread
Description
Implement the three-thread architecture: mido MIDI callbacks, OSC server daemon thread, and main thread for rendering + USB display transfer.
Tasks
display_frame()callsThreadingOSCUDPServeras daemon threadParameterStateobject with proper lockingAcceptance Criteria
Technical Notes
display_frame()is blocking USB (~2-5ms)