Improvement batch on top of the validated system. STATE grows 27 -> 28 bytes (click_pos): both firmwares must be reflashed together, a version mix shows the disconnected banner. - Box-3 'Effets' tab: delay level/feedback/length sliders wired to three new CMD opcodes (0x10-0x12) calling the ml_delay setters that were only reachable over MIDI before. - visual metronome: STATE carries the click bar position; the click button flashes on each beat, brighter on beat 1. - input clip indicator: near-full-scale input turns the input VU red for 2 s (peak hold). - fix a regression from the VT100 removal: status messages could Serial.printf from the audio core (MIDI callbacks), busting the 1.088 ms budget. They are now staged and printed by core 0. - flush the link RX buffer after an SD operation so commands touched during the blocking save/load no longer replay in a burst afterwards. - static_assert on sizeof(link_state_t) in the shared header and TRACK_CNT == LINK_TRACK_CNT in the looper. - protocol.md updated: 28-byte layout, delay opcodes, real liveness rules (any valid frame, 8 s during SD operations). Verified: pio run SUCCESS, idf.py build OK, C host test OK, 5/5 pytest.
esp32_multitrack_looper
Looper audio 4 pistes sur ESP32 Audio Kit (codec ES8388), avec afficheur et surface de contrôle tactile sur ESP32-S3-BOX-3 reliée en UART.
Fork du looper de Marcel Licence (voir sa vidéo de présentation), étendu avec :
- migration du sketch Arduino en C++ modulaire (
src/*.cpp, build PlatformIO) ; - liaison UART vers une ESP32-S3-BOX-3 : état du looper à 20 Hz, commandes tactiles en retour (doc/protocol.md) ;
- firmware Box-3 ESP-IDF 5.4 + LVGL 9 (
box3_display/) : pads de pistes colorés + VU, transport, gains/pans, tempo, sessions SD ; - sauvegarde/chargement de sessions sur carte SD (WAV standards) ;
- fixes DSP : saturation à l'overdub (fini le wrap int16 audible), init PSRAM accélérée ;
- simulateur Python du protocole pour tester chaque carte séparément.
Matériel
| Élément | Rôle |
|---|---|
| ESP32 Audio Kit v2.2 (ESP32-A1S, ES8388, 4 Mo PSRAM) | moteur audio : 4 pistes ≈ 11,3 s @ 44,1 kHz en PSRAM |
| ESP32-S3-BOX-3 (+ dock) | afficheur LCD 320×240 + tactile |
| 3 fils Dupont | liaison UART (TX/RX croisés + GND) |
| Carte SD FAT32 (optionnel) | sessions |
Câblage complet et pinout : doc/wiring.md. En résumé : Audio Kit GPIO 22 → Box-3 GPIO 41, Audio Kit GPIO 23 ← Box-3 GPIO 40, GND↔GND. (Pas GPIO 21 : réservé PA_EN de l'ampli sur les révisions au routage AC101.)
Build
Firmware Audio Kit (PlatformIO)
pio run # build (arduino-esp32 2.0.2, référence)
pio run -t upload # flasher
pio device monitor # UI série VT100 @ 115200 (TeraTerm/minicom)
Envs alternatifs (targets.csv) : esp32_audio_kit_es8388_core_2_0_7,
esp32_audio_kit_es8388_core_1_0_6.
Depuis la migration en
src/*.cpp, le build Arduino IDE n'est plus supporté : PlatformIO uniquement.
Firmware Box-3 (ESP-IDF ≥ 5.3)
source ~/esp/esp-idf/export.sh
cd box3_display
idf.py set-target esp32s3
idf.py build
idf.py -p /dev/cu.usbmodemXXXX flash monitor
Les dépendances (BSP esp-box-3, LVGL 9) viennent du component registry.
Tests sans matériel
cc -Wall -Werror -o /tmp/test_link tests/test_link_protocol.c && /tmp/test_link
python3 -m pytest tests/test_link_sim.py -v
tests/link_sim.py sait aussi piloter le looper ou simuler un Audio Kit par
USB-série — voir doc/protocol.md.
Utilisation
Sur la Box-3
- Onglet Pistes : tap sur un pad = enregistrer/lire/overdub (même logique que les boutons : piste vide → enregistrement, piste pleine → lecture, etc.) ; tap sur une piste active = stop ; appui long = effacer. Couleurs : gris = vide, bleu = données (arrêtée), vert = lecture, rouge = enregistrement, orange = effacement. En bas : barre de position avec marqueur de longueur, boutons Len / ▶ / ■ / métronome / tempo (tap = +5 BPM), VU entrée/sortie.
- Onglet Réglages : gain + pan par piste, gain d'entrée, source Line/Mic, sessions SD (0–7) avec Save/Load et barre de progression.
Sur l'Audio Kit (boutons, avec le mod analogique)
- Key1 : fixer la longueur de boucle — Key2 : métronome on/off — Key3–Key6 : sélection/enregistrement pistes 1–4.
MIDI
Contrôleur MIDI par USB-série (mapping Edirol PCR-800 dans
src/app_config.inc, adaptable). L'UI série VT100 reste disponible en
parallèle à 115 200 bauds.
Sessions SD
Chaque session = /session_NN/track1..4.wav (mono 16 bit 44,1 kHz — rouvrables
dans un DAW) + meta.txt (longueur de boucle, tempo). La lecture s'arrête
pendant l'accès SD, la progression s'affiche sur la Box-3.
Structure du dépôt
src/ firmware Audio Kit (C++ PlatformIO)
loop_module.* cœur du looper (4 pistes PSRAM)
click_module.* métronome / tempo
status_module.* UI série VT100
link_module.* liaison UART vers la Box-3
sd_module.* sessions SD (WAV)
main.cpp setup/loop + tâche core 0 + audio
app_config.inc mappings MIDI/boutons
shared/looper_link.h protocole UART (source de vérité)
box3_display/ firmware Box-3 (ESP-IDF + LVGL)
tests/ test C host + simulateur/tests Python
doc/ protocol.md, wiring.md, board_info.md
docs/superpowers/ spec et plan de la feature Box-3
Crédits & licence
Code original © Marcel Licence, GPL v3 — extensions Box-3/SD © Clément Saillant, GPL v3. Docs utiles : ESP32 Audio Kit, guide synthé Arduino de Marcel.