L'électron rare 410d0cf273
CI / sanity (push) Successful in 17s
CI / host-tests (push) Successful in 22s
CI / box3-build (push) Failing after 15s
CI / build (push) Successful in 2m25s
feat: delay page, visual click, clip, hardening
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.
2026-08-06 14:52:44 +02:00
2026-03-11 00:12:32 +01:00
2026-08-04 14:37:57 +02:00
2021-04-10 22:56:21 +02:00

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 (07) 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 — Key3Key6 : sélection/enregistrement pistes 14.

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.

S
Description
ESP32 Audio Kit based multitrack looper
Readme GPL-3.0
3.3 MiB
Languages
C 67.7%
C++ 27.9%
Python 4.3%
CMake 0.1%