Issues and pull requests are welcome.
Useful ground rules:
- The detector (
app/djidetect.py) is in daily use as an input device — changes to the DSP path, the calibration state machine, or the locking need a note on what you tested and how. - The realtime audio thread must never run Python DSP; keep all analysis on the worker thread.
- The physical-prior bounds are measured from real data, not tuned by feel. If you want to change them, include the measurements.
- UI stays native (AppKit via pyobjc) and matches the existing palette and type. No web views.
- Run
python -m py_compile app/*.pybefore opening a PR; there is no other build step.
If you have a different DJI mic (Mic 2, Mic 3), a calibration log from
sessions/ plus your device name is enough to start a port discussion.