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.
1.7 KiB
1.7 KiB
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.