bbf7c5dc75
Context: while inspecting the MBP we found ~/hydra-sc/, an earlier
prototype the user had built before AV-Live existed. It contained
working pieces we needed (Hantek firmware loader, OSC scope bridges,
SC↔Hydra ws relay, hydra patch). We also discovered that 00_load.scd
hard-coded ~base to the GrosMac dev path, which silently broke the
whole sclang engine on the MBP — every (~base ++ '...').load was
hitting a non-existent path and quietly failing. The user's existing
control/midi.scd is comprehensive but split into 5 IDE-friendly
top-level blocks, so it isn't .load-compatible and never auto-runs at
boot.
Approach: derive ~base from thisProcess.nowExecutingPath at load time
so the same project tree works from any absolute location. Migrate the
hydra-sc artifacts into AV-Live/{tools,sound_algo/control,
sound_algo/web/public/hydra} so everything lives in one repo. Add a
single-block live/midi_init.scd that does MIDIClient.init +
MIDIIn.connectAll + the default mapping in one .load-friendly chunk,
deferred 0.5s through AppClock so MIDI device discovery doesn't block
the main load chain. Old ~/hydra-sc/ on the MBP deleted, the orphan
hydra-sc-bridge node process (PID 41421 from a previous session)
killed.
Changes:
- sound_algo/00_load.scd : both ~base assignments now use
thisProcess.nowExecutingPath.dirname with fallback to the legacy
hard-coded path
- tools/hantek/{fx2_fwload,hantek_to_osc,hantek_osc_bridge}.py :
imported as-is, plus a new README explaining the firmware-load /
C++-or-sigrok choice and the macOS prerequisites (PulseView,
sigrok-cli, python-osc)
- sound_algo/control/hantek_receiver.scd : OSCdef \hantek that
exposes ~hPk1/~hRms1/~hPk2/~hRms2 from the Python bridge — kept as
alternate path to oscope-of's C++ driver
- sound_algo/control/hydra_send.scd : SC→Hydra OSC sender (was
sc_to_hydra.scd in hydra-sc) — analyzes SoundIn.ar(0) into rms /
centroid / flatness and sends to 127.0.0.1:8000
- sound_algo/web/public/hydra/external_patch.js : Hydra patch the
user pastes into hydra.ojack.xyz when running the external bridge
- sound_algo/live/midi_init.scd : single-block MIDI auto-init with
the same CC/note bindings as control/midi.scd plus new note
ranges for albums (notes 36-59 → ~playAlbum A-X), kicks
(notes 60-71 → ~kkAt index 0..11), melodies (72-83 → ~mmAt),
fx (84-95 → ~ffAt), CC 7 → master volume. Idempotent (frees
previous MIDIFunc on re-load), graceful when no MIDI device is
detected (skips mapping, prints note)
Impact: sclang now actually boots its engine on the MBP (~base path
was the silent killer). MIDI controllers connected at startup get
the default mapping automatically. The hydra-sc legacy is fully
absorbed into AV-Live so there's one place to find everything.
Note: live/midi_init.scd is NOT yet wired into live/_load.scd's
auto-load chain — that's a follow-up so we can verify the file
loads cleanly first.
Hantek 6022BL helper tools
Standalone Python scripts that handle the parts of the Hantek 6022BL USB
oscilloscope workflow that don't belong in the C++ visualizer
(oscope-of/src/HantekDevice).
| Script | Role |
|---|---|
fx2_fwload.py |
One-shot firmware uploader. The Hantek arrives as a bare Cypress FX2LP and needs fx2lafw-hantek-6022bl.fw pushed via vendor request 0xA0. After upload the device renumerates with VID:PID 1d50:608e. Uses libusb via ctypes (no pyusb dep). |
hantek_to_osc.py |
Alternative scope reader using sigrok-cli (instead of the C++ libusb path in oscope-of). Streams CH1/CH2 chunks as float32 over OSC to 127.0.0.1:57120 /scope. |
hantek_osc_bridge.py |
Variant of the above. Same end goal, different parsing strategy. |
Prerequisites (macOS)
- PulseView.app (ships libusb + the firmware blob)
brew install --cask pulseview - sigrok-cli (only needed for the Python scope readers)
brew install sigrok-cli - python-osc (only needed for the Python scope readers)
/usr/bin/python3 -m pip install --user python-osc
Workflow
Once per session : load the firmware
./fx2_fwload.py
This must run before either oscope-of's C++ driver or sigrok-cli can talk to the scope.
Then either :
- C++ path (default) — start
oscope-of(or the launcher) and the C++HantekDevicewill open the scope directly via libusb. - Python path (fallback / debugging) — start
./hantek_to_osc.pyand opensound_algo/control/hantek_receiver.scdin sclang to receive~hPk1 / ~hRms1 / ~hPk2 / ~hRms2updated at 50 Hz.
The two paths are mutually exclusive — only one process can hold the USB device at a time.