Commit Graph

13 Commits

Author SHA1 Message Date
david 3cc497f632 refactor: 3-module pd architecture + viz non-blocking fix
- midi-in.pd: netreceive -> route -> unpack -> pitch/velocity outlets
- audio-out.pd: inlet~ -> dac~ abstraction
- synth.pd: consumer patch wiring midi-in -> voice -> audio-out
- led-matrix-viz.py: router socket non-blocking, registered with poller
- pd.rego: skip outlet/abstraction false positives in validation
2026-06-24 02:08:57 -07:00
david 242c74236f systemd services: midi-bridge, pd-synth-onboard, led-matrix-viz + install script 2026-06-24 01:36:36 -07:00
david f919af3d8b midi-bridge: normalize all MIDI channels to channel 1 2026-06-24 00:50:39 -07:00
david ed8cb7ca5a working synth: two detuned oscs, env~, lop~ (no slider for now) 2026-06-24 00:45:37 -07:00
david ccc40e4314 rebuild synth.pd from working components 2026-06-23 22:17:02 -07:00
david e098f32a32 fix synth: envelope driven by velocity not pitch, louder gain 2026-06-23 21:58:10 -07:00
david 7e8848d23c justfile: git-based deploy, streamlined recipes 2026-06-23 21:29:16 -07:00
david d239d58c44 onboard audio: JMISC HPH wiring, UCM fix, update scripts for git deploy 2026-06-23 21:25:51 -07:00
david a135dc4452 controller.pd: add MIDI passthrough for MPK Mini → board
Added notein→pack→noteout and ctlin→ctlout chains that forward all
incoming MIDI from the MPK Mini to the board's MIDI port. This means
physical keys/knobs now work alongside the GUI click buttons.
2026-06-23 14:44:05 -07:00
david 334e934dd7 stabilize systemd services: fix races, masked flooding, dependencies
- pd-synth: add After=usb-gadget-audio.service midi-bridge.service (was Wants= only, race)
- usb-gadget-audio: add Restart=on-failure After=sysinit.target
- pd-synth-i2s: fix Wants=configure-usb-audio.service → usb-gadget-audio.service
- detect-usb-role.sh: hardcode gadget role (all 4 detection methods always fail, skip 2s sleep)
- arduino-router-serial: masked on board (flooded 2173× restarts looking for nonexistent /dev/ttyGS0)
2026-06-23 14:31:11 -07:00
david f1b65eb4d9 fix led-matrix-viz: use select.poll() instead of settimeout, fix hang
The O_NONBLOCK flag set by setblocking(False) was not cleared by
settimeout(n) on this CPython/kernel combo, causing recvfrom to never
return data. Switched to explicit select.poll() with frame-interval
based timeout — simpler, more portable, and avoids the O_NONBLOCK trap.

Also fixes midi-bridge: add time.sleep(0.01) in no-data paths to
prevent 100% CPU spin from spurious POLLIN on f_midi rawmidi.
2026-06-23 00:34:33 -07:00
david dbd7c2cece auto-detect MIDI device, drop ALSA sequencer dependency, MPK Mini simulator
midi-bridge.py:
  - Auto-detect rawmidi device (gadget f_midi > env override > fallback)
  - Reconnect on ENODEV (device hotplug)
  - No longer needs MIDI_BRIDGE_DEV env var in common cases

start-synth.sh:
  - Remove all -alsamidi/-midiadddev flags (kernel lacks CONFIG_SND_SEQUENCER)
  - MIDI handled entirely by midi-bridge.service → UDP → netreceive
  - Host mode: same approach, no ALSA sequencer needed

mpk-mini-sim.pd:
  - New MPK Mini Mk II simulator (25 keys, 8 pads, 8 CC knobs)
  - Proper Pd #X obj format for all objects (bng, hsl, t, del, netsend, loadbang)
  - UDP output to board:8081, matching midi-bridge format

system: enable usb-gadget-audio.service at boot, load dwc3 module at boot
2026-06-22 23:10:38 -07:00
david 8cd796e3dd Initial commit: Arduino Uno Q USB Audio Synth project
- USB gadget (UAC1 + MIDI) with boot persistence
- USB host mode with auto-detection
- Pure Data synth patch with ALSA + UDP netreceive MIDI input
- MIDI rawmidi-to-UDP bridge (midi-bridge.py)
- LED matrix visualization (led-matrix-viz.py via arduino-router RPC)
- MCU sketch for LED matrix control (Arduino_RouterBridge + ArduinoGraphics)
- Conftest/OPA Rego policy validation suite for .pd files
- gen_synth_pd.py: programmatic .pd file generator
- System services: midi-bridge, led-matrix-viz, pd-synth-auto, usb-role-detect
- Justfile with deploy, enable, diagnostic recipes
- Diagnostic script (diag.sh)
2026-06-22 22:46:36 -07:00