diff --git a/README.md b/README.md index a955b0e..99ab67b 100644 --- a/README.md +++ b/README.md @@ -12,15 +12,15 @@ Batería, sampler de pads, bajo, FM, wavetable y polifónico, calculados en vivo

-HOME: la consola BX-1 con las seis máquinas +HOME: el mezclador de los seis canales BR-8: la batería TR -BITTAL: la tabla del oscilador en 2.5D -BP-1: la onda con el pad entre corchetes +BB-303: el panel de la TB-303 +BP-1: el Slicer cortando una toma

--- -> **Estado: 0.9.0-beta.** Corre en el aparato y se instala desde el navegador, plug and play, pero es una **beta**: se probó en un solo FM-1 y todavía cambia mucho (la 0.9.0-beta, todavía sin probar del todo en el aparato). **Una actualización puede borrar lo que guardaste** (patrones, canción, ajustes y tomas): hasta la v1 no hay compatibilidad hacia atrás. Ver [cómo instalar](docs/INSTALAR.md) y [cómo volver al firmware de fábrica](docs/INSTALAR.md#volver-al-firmware-de-fábrica). +> **Estado: 0.10.0-beta.** Corre en el aparato y se instala desde el navegador, plug and play, pero es una **beta**: se probó en un solo FM-1 y todavía cambia mucho (la 0.10.0-beta corre en el FM-1 del autor). **Una actualización puede borrar lo que guardaste** (patrones, escenas, ajustes y tomas): hasta la v1 no hay compatibilidad hacia atrás. Ver [cómo instalar](docs/INSTALAR.md) y [cómo volver al firmware de fábrica](docs/INSTALAR.md#volver-al-firmware-de-fábrica). ## El objetivo: una máquina hi-fi @@ -36,20 +36,19 @@ Bubba Machine busca **el mejor sonido que puede dar el hardware del FM-1**, sin Bubba Machine convierte el FM-1 en una groovebox de directo con **seis canales**, **cuatro gestos por botón y HOME en todas partes**: -- **T1 BR-8, batería estilo TR:** 16 instrumentos con su propia línea y su propio largo (polímetro), acento, repetición, flam, P-Locks y pasos que solo suenan en el fill. Roll y borrado estilo TR mientras suena. -- **T2 BP-1, sampler de pads:** 16 pads hechos con tus tomas, como un KO II o un OP-1 field. Cada pad tiene su inicio, su largo, su tono y su modo de tecla (sostenido puede seguir por la toma). Una rejilla como la de la batería los toca y BREAK la varía compás a compás. Grabadora propia y biblioteca de tomas. +- **T1 BR-8, batería estilo TR:** 16 instrumentos, cada uno con su largo (polímetro), con acentos, repeticiones y mutes, en un secuenciador por pasos con acceso rápido a cada instrumento. +- **BP-1 Slicer, el último canal:** corta una toma en 16 pads como un KO II o un OP-1 field (AUTO, 8 o 16 cortes) y escribe la secuencia que suena como el loop. Cada pad tiene su tono, nivel, modo, reversa, ataque, release y loop; una rejilla por pasos los toca. Puede grabar la mezcla en un pad. - **Pantalla en inglés**, para que se entienda en todo el mundo, con el español como paquete de idioma que se carga aparte ([cómo](docs/MANUAL.md#idioma-de-la-pantalla)). -- **T3-T6 eligen su máquina:** **BB-303** (bajo ácido sobre Open303), **B-MINI** (tres osciladores con filtro escalera), **BX-7** (FM de 6 operadores, lee bancos .syx de la DX7), **BITTAL** (wavetable que carga presets de Vital) y **BUNO-6** (polifónico con chorus). Banco de 92 sonidos, muchos históricos, y un [editor web](https://erbubar23.github.io/bubba-machine/control.html#sounds) para sumar los tuyos. Arpegiador, loopera, escala propia y MIDI OUT por canal. -- **HOME es la consola BX-1:** 10 patrones, los seis canales, mutes, solo, escenas y CUE en las teclas, y la mezcla y los efectos de cada canal. REC en la consola graba cualquier canal sin entrar (estilo SLOOP). -- **REC expresivo:** cada nota guarda su micro-tiempo, su largo y lo que moviste mientras la tocabas. -- **Tiempo por pista:** cada pista tiene su largo (1-64) y su velocidad (×2 a ×1/4). -- **Acordes en cuadrícula:** 16 acordes con su grado y su función por color. -- **Directo:** 4 escenas de mutes con cadenas, CUE, grabación de la canción, fills automáticos, 16 efectos punch-in y mutes por pista e instrumento que se mantienen al cambiar de patrón. -- **Guardado seguro** en flash (CRC, commit al final, wear-leveling y autoguardado al parar), MIDI IN, reloj externo y Split Sync. +- **Los demás canales eligen su máquina, y cada una es su instrumento:** al entrar, la máquina toma todo el FM-1 con el panel y los menús de la original. **BB-303** (la TB-303 sobre Open303, con ACCENT y SLIDE por paso y overdrive estilo TB-03), **B-MINI** (Minimoog), **BX-7** (el FM del FM-1: 6 operadores, 32 algoritmos, sus efectos y arpegiador), **BITTAL** (wavetable estilo Vital) y **BUNO-6** (Juno-6 con chorus). Sonidos de fábrica, muchos históricos, y MIDI OUT por canal. +- **HOME es el mezclador:** 9 patrones, los seis canales con volumen, filtro, delay y reverb, mutes, solo y 4 escenas de mutes por patrón (de fábrica la B deja todo muteado). +- **Patrones de fábrica:** recreaciones de *Da Funk* (Daft Punk), *Confusion* en la versión de *Blade* (New Order) y *Enjoy the Silence* (Depeche Mode), tocadas por las máquinas. +- **Grabación como SLOOP:** largo fijo que da la vuelta, cuantización de lo que tocas en vivo, paso a paso dentro de SEQ, y REC sostenido para borrar la secuencia del canal. +- **Tiempo por pista:** cada pista tiene su largo (1-64 pasos) y su velocidad. +- **Guardado seguro** en flash (CRC, commit al final, wear-leveling y autoguardado al parar), MIDI IN, reloj externo y salida de sync. ## Pruébalo -Abre el [emulador web](https://erbubar23.github.io/bubba-machine/emulador.html) en Chrome o Edge y pulsa *Encender*. Arranca con una demo; la barra espaciadora es PLAY. También funciona sin internet: abre `web/emulador.html` desde tu copia del repo. +Abre el [emulador web](https://erbubar23.github.io/bubba-machine/emulador.html) en Chrome o Edge y pulsa *Encender*. Arranca con el patrón 1 (*Da Funk*); la barra espaciadora es PLAY. También funciona sin internet: abre `web/emulador.html` desde tu copia del repo. ## Documentación @@ -81,11 +80,11 @@ M-VAVE y FM-1 son marcas de sus respectivos dueños. Este proyecto no está afil ## In English -**Bubba Machine** is a free (GPL-3.0-or-later) **hi-fi** groovebox firmware for the M-VAVE FM-1: BR-8 modeled drums, BP-1 pad sampler, and on T3-T6 your choice of BB-303 acid bass (after Open303), B-MINI, BX-7 FM (reads DX7 .syx banks), BITTAL wavetable (loads Vital presets) and BUNO-6 polysynth with chorus, plus the BX-1 console on HOME. Written from scratch in C99. +**Bubba Machine** is a free (GPL-3.0-or-later) **hi-fi** groovebox firmware for the M-VAVE FM-1: BR-8 modeled drums, the BP-1 Slicer, and on the other channels your choice of BB-303 (a TB-303 after Open303), B-MINI (Minimoog), BX-7 (the FM-1's own 6-operator FM), BITTAL wavetable and BUNO-6 (Juno-6) — each one taking over the FM-1 with the panel and menus of the real machine — plus a six-channel mixer on HOME and three factory patterns. Written from scratch in C99. - **The goal is hi-fi:** the best sound the FM-1's hardware can give. Every machine and the mix run at 44.1 kHz / 24-bit in floating point, everything is computed live (no low-res samples), each machine has its own engine modeled on the real one, and both 360 MHz cores can share the work (TWO CORES). Every change is measured on the device ([audio quality](docs/en/AUDIO.md)). -- **Status:** 0.9.0-beta. It runs on the device and installs from the browser, plug and play, but it is a **beta**: tested on a single FM-1 and still changing a lot (0.9.0-beta, not fully tried on the device yet). **An update may erase what you saved** (patterns, song, settings and takes): there is no backward compatibility until v1. You can also try it in the [web emulator](https://erbubar23.github.io/bubba-machine/emulador.html). +- **Status:** 0.10.0-beta. It runs on the device and installs from the browser, plug and play, but it is a **beta**: tested on a single FM-1 and still changing a lot (0.10.0-beta runs on the author's FM-1). **An update may erase what you saved** (patterns, scenes, settings and takes): there is no backward compatibility until v1. You can also try it in the [web emulator](https://erbubar23.github.io/bubba-machine/emulador.html). - **Website and docs in English:** [erbubar23.github.io/bubba-machine/en](https://erbubar23.github.io/bubba-machine/en/), with the [manual](docs/en/MANUAL.md), [install status](docs/en/INSTALL.md), [audio quality](docs/en/AUDIO.md) and [roadmap](docs/en/ROADMAP.md). The firmware screens are in English; Spanish is an optional language pack. Issues and pull requests in English are welcome. - **Clean room:** all project code is original; synthesis libraries (Plaits, msfa, Open303) and the community Vital presets in the factory bank keep their free licenses ([credits](docs/en/CREDITS.md)). Only hardware facts from public FM-1 reverse engineering were used. - M-VAVE and FM-1 are trademarks of their respective owners. This project is not affiliated with or endorsed by M-VAVE. diff --git a/assets/screens/00-home.png b/assets/screens/00-home.png index d6572be..0205bf8 100644 Binary files a/assets/screens/00-home.png and b/assets/screens/00-home.png differ diff --git a/assets/screens/01-home-mixer.png b/assets/screens/01-home-mixer.png index 8028006..1caf1da 100644 Binary files a/assets/screens/01-home-mixer.png and b/assets/screens/01-home-mixer.png differ diff --git a/assets/screens/01-home-play-drums.png b/assets/screens/01-home-play-drums.png new file mode 100644 index 0000000..3923583 Binary files /dev/null and b/assets/screens/01-home-play-drums.png differ diff --git a/assets/screens/01-home-play.png b/assets/screens/01-home-play.png index c447c7a..8af680d 100644 Binary files a/assets/screens/01-home-play.png and b/assets/screens/01-home-play.png differ diff --git a/assets/screens/02-seq-knobs.png b/assets/screens/02-seq-knobs.png new file mode 100644 index 0000000..227bb9c Binary files /dev/null and b/assets/screens/02-seq-knobs.png differ diff --git a/assets/screens/02-seq-tr.png b/assets/screens/02-seq-tr.png index c341f51..f18127d 100644 Binary files a/assets/screens/02-seq-tr.png and b/assets/screens/02-seq-tr.png differ diff --git a/assets/screens/03-seq-accents.png b/assets/screens/03-seq-accents.png new file mode 100644 index 0000000..96e8cfa Binary files /dev/null and b/assets/screens/03-seq-accents.png differ diff --git a/assets/screens/03-seq-bars.png b/assets/screens/03-seq-bars.png new file mode 100644 index 0000000..eda116f Binary files /dev/null and b/assets/screens/03-seq-bars.png differ diff --git a/assets/screens/03-seq-hit.png b/assets/screens/03-seq-hit.png new file mode 100644 index 0000000..f0f1ba4 Binary files /dev/null and b/assets/screens/03-seq-hit.png differ diff --git a/assets/screens/03-seq-plock.png b/assets/screens/03-seq-plock.png index 63311b6..e8a4584 100644 Binary files a/assets/screens/03-seq-plock.png and b/assets/screens/03-seq-plock.png differ diff --git a/assets/screens/03-seq-repeat.png b/assets/screens/03-seq-repeat.png new file mode 100644 index 0000000..c50b90d Binary files /dev/null and b/assets/screens/03-seq-repeat.png differ diff --git a/assets/screens/23-scenes.png b/assets/screens/23-scenes.png index 0e2a801..356bb07 100644 Binary files a/assets/screens/23-scenes.png and b/assets/screens/23-scenes.png differ diff --git a/assets/screens/24-glo-machines.png b/assets/screens/24-glo-machines.png new file mode 100644 index 0000000..f95cf63 Binary files /dev/null and b/assets/screens/24-glo-machines.png differ diff --git a/assets/screens/24c-glo-machines.png b/assets/screens/24c-glo-machines.png index bad12c0..3731013 100644 Binary files a/assets/screens/24c-glo-machines.png and b/assets/screens/24c-glo-machines.png differ diff --git a/assets/screens/24d-glo-heavy.png b/assets/screens/24d-glo-heavy.png new file mode 100644 index 0000000..dcd59f8 Binary files /dev/null and b/assets/screens/24d-glo-heavy.png differ diff --git a/assets/screens/24e-glo-tempo.png b/assets/screens/24e-glo-tempo.png new file mode 100644 index 0000000..7a47868 Binary files /dev/null and b/assets/screens/24e-glo-tempo.png differ diff --git a/assets/screens/24f-glo-fx.png b/assets/screens/24f-glo-fx.png new file mode 100644 index 0000000..664464a Binary files /dev/null and b/assets/screens/24f-glo-fx.png differ diff --git a/assets/screens/25-system-en.png b/assets/screens/25-system-en.png index d6572be..0205bf8 100644 Binary files a/assets/screens/25-system-en.png and b/assets/screens/25-system-en.png differ diff --git a/assets/screens/25-system-es.png b/assets/screens/25-system-es.png index 54e9570..795241c 100644 Binary files a/assets/screens/25-system-es.png and b/assets/screens/25-system-es.png differ diff --git a/assets/screens/37b-pads-es.png b/assets/screens/37b-pads-es.png index 862847e..e27aefb 100644 Binary files a/assets/screens/37b-pads-es.png and b/assets/screens/37b-pads-es.png differ diff --git a/assets/screens/51-seq-free-rec.png b/assets/screens/51-seq-free-rec.png index c012d69..aa1f606 100644 Binary files a/assets/screens/51-seq-free-rec.png and b/assets/screens/51-seq-free-rec.png differ diff --git a/assets/screens/80-bx7-arp.png b/assets/screens/80-bx7-arp.png new file mode 100644 index 0000000..7ee0b07 Binary files /dev/null and b/assets/screens/80-bx7-arp.png differ diff --git a/assets/screens/80-bx7-edit.png b/assets/screens/80-bx7-edit.png new file mode 100644 index 0000000..42a61f6 Binary files /dev/null and b/assets/screens/80-bx7-edit.png differ diff --git a/assets/screens/80-bx7-env.png b/assets/screens/80-bx7-env.png new file mode 100644 index 0000000..35f8745 Binary files /dev/null and b/assets/screens/80-bx7-env.png differ diff --git a/assets/screens/80-bx7-fx.png b/assets/screens/80-bx7-fx.png new file mode 100644 index 0000000..17c847b Binary files /dev/null and b/assets/screens/80-bx7-fx.png differ diff --git a/assets/screens/80-bx7-glo.png b/assets/screens/80-bx7-glo.png new file mode 100644 index 0000000..d5827ac Binary files /dev/null and b/assets/screens/80-bx7-glo.png differ diff --git a/assets/screens/80-bx7-lfo.png b/assets/screens/80-bx7-lfo.png new file mode 100644 index 0000000..2870ee1 Binary files /dev/null and b/assets/screens/80-bx7-lfo.png differ diff --git a/assets/screens/80-bx7-main.png b/assets/screens/80-bx7-main.png new file mode 100644 index 0000000..3b8e5f1 Binary files /dev/null and b/assets/screens/80-bx7-main.png differ diff --git a/assets/screens/80-bx7-pitch.png b/assets/screens/80-bx7-pitch.png new file mode 100644 index 0000000..16257f3 Binary files /dev/null and b/assets/screens/80-bx7-pitch.png differ diff --git a/assets/screens/80-bx7-seq-rec.png b/assets/screens/80-bx7-seq-rec.png new file mode 100644 index 0000000..7759621 Binary files /dev/null and b/assets/screens/80-bx7-seq-rec.png differ diff --git a/assets/screens/80-bx7-seq.png b/assets/screens/80-bx7-seq.png new file mode 100644 index 0000000..b53e4b5 Binary files /dev/null and b/assets/screens/80-bx7-seq.png differ diff --git a/assets/screens/81-b303-accent.png b/assets/screens/81-b303-accent.png new file mode 100644 index 0000000..6dc4235 Binary files /dev/null and b/assets/screens/81-b303-accent.png differ diff --git a/assets/screens/81-b303-fx.png b/assets/screens/81-b303-fx.png new file mode 100644 index 0000000..7b144bf Binary files /dev/null and b/assets/screens/81-b303-fx.png differ diff --git a/assets/screens/81-b303-fx2.png b/assets/screens/81-b303-fx2.png new file mode 100644 index 0000000..65f07de Binary files /dev/null and b/assets/screens/81-b303-fx2.png differ diff --git a/assets/screens/81-b303-lfo.png b/assets/screens/81-b303-lfo.png new file mode 100644 index 0000000..be59dd6 Binary files /dev/null and b/assets/screens/81-b303-lfo.png differ diff --git a/assets/screens/81-b303-panel.png b/assets/screens/81-b303-panel.png new file mode 100644 index 0000000..cf27517 Binary files /dev/null and b/assets/screens/81-b303-panel.png differ diff --git a/assets/screens/81-b303-panel2.png b/assets/screens/81-b303-panel2.png new file mode 100644 index 0000000..3f5bb12 Binary files /dev/null and b/assets/screens/81-b303-panel2.png differ diff --git a/assets/screens/81-b303-seq.png b/assets/screens/81-b303-seq.png new file mode 100644 index 0000000..bdac7f5 Binary files /dev/null and b/assets/screens/81-b303-seq.png differ diff --git a/assets/screens/81-b303-slide.png b/assets/screens/81-b303-slide.png new file mode 100644 index 0000000..d9c9de4 Binary files /dev/null and b/assets/screens/81-b303-slide.png differ diff --git a/assets/screens/82-mini-glo.png b/assets/screens/82-mini-glo.png new file mode 100644 index 0000000..3831f55 Binary files /dev/null and b/assets/screens/82-mini-glo.png differ diff --git a/assets/screens/82-mini-seq.png b/assets/screens/82-mini-seq.png new file mode 100644 index 0000000..fb11616 Binary files /dev/null and b/assets/screens/82-mini-seq.png differ diff --git a/assets/screens/82-mini-step.png b/assets/screens/82-mini-step.png new file mode 100644 index 0000000..5d4fe2c Binary files /dev/null and b/assets/screens/82-mini-step.png differ diff --git a/assets/screens/83-bmini-env.png b/assets/screens/83-bmini-env.png new file mode 100644 index 0000000..70fdcf8 Binary files /dev/null and b/assets/screens/83-bmini-env.png differ diff --git a/assets/screens/83-bmini-filter.png b/assets/screens/83-bmini-filter.png new file mode 100644 index 0000000..73b6e42 Binary files /dev/null and b/assets/screens/83-bmini-filter.png differ diff --git a/assets/screens/83-bmini-fx.png b/assets/screens/83-bmini-fx.png new file mode 100644 index 0000000..99f20af Binary files /dev/null and b/assets/screens/83-bmini-fx.png differ diff --git a/assets/screens/83-bmini-fx2.png b/assets/screens/83-bmini-fx2.png new file mode 100644 index 0000000..bd5f170 Binary files /dev/null and b/assets/screens/83-bmini-fx2.png differ diff --git a/assets/screens/83-bmini-lfo.png b/assets/screens/83-bmini-lfo.png new file mode 100644 index 0000000..09b75a1 Binary files /dev/null and b/assets/screens/83-bmini-lfo.png differ diff --git a/assets/screens/83-bmini-osc3.png b/assets/screens/83-bmini-osc3.png new file mode 100644 index 0000000..28725f7 Binary files /dev/null and b/assets/screens/83-bmini-osc3.png differ diff --git a/assets/screens/83-bmini-scl.png b/assets/screens/83-bmini-scl.png new file mode 100644 index 0000000..c7a17f7 Binary files /dev/null and b/assets/screens/83-bmini-scl.png differ diff --git a/assets/screens/84-buno-dco.png b/assets/screens/84-buno-dco.png new file mode 100644 index 0000000..77708f8 Binary files /dev/null and b/assets/screens/84-buno-dco.png differ diff --git a/assets/screens/84-buno-env.png b/assets/screens/84-buno-env.png new file mode 100644 index 0000000..5ab1f81 Binary files /dev/null and b/assets/screens/84-buno-env.png differ diff --git a/assets/screens/84-buno-fx2.png b/assets/screens/84-buno-fx2.png new file mode 100644 index 0000000..f6fec69 Binary files /dev/null and b/assets/screens/84-buno-fx2.png differ diff --git a/assets/screens/84-buno-lfo.png b/assets/screens/84-buno-lfo.png new file mode 100644 index 0000000..8ec85d5 Binary files /dev/null and b/assets/screens/84-buno-lfo.png differ diff --git a/assets/screens/84-buno-vcf.png b/assets/screens/84-buno-vcf.png new file mode 100644 index 0000000..bf94fe1 Binary files /dev/null and b/assets/screens/84-buno-vcf.png differ diff --git a/assets/screens/85-bittal-env2.png b/assets/screens/85-bittal-env2.png new file mode 100644 index 0000000..b07fe9d Binary files /dev/null and b/assets/screens/85-bittal-env2.png differ diff --git a/assets/screens/85-bittal-filter.png b/assets/screens/85-bittal-filter.png new file mode 100644 index 0000000..5eb5365 Binary files /dev/null and b/assets/screens/85-bittal-filter.png differ diff --git a/assets/screens/85-bittal-fx2.png b/assets/screens/85-bittal-fx2.png new file mode 100644 index 0000000..c8086c9 Binary files /dev/null and b/assets/screens/85-bittal-fx2.png differ diff --git a/assets/screens/85-bittal-lfo.png b/assets/screens/85-bittal-lfo.png new file mode 100644 index 0000000..f84ccb9 Binary files /dev/null and b/assets/screens/85-bittal-lfo.png differ diff --git a/assets/screens/85-bittal-osc1.png b/assets/screens/85-bittal-osc1.png new file mode 100644 index 0000000..5a04414 Binary files /dev/null and b/assets/screens/85-bittal-osc1.png differ diff --git a/assets/screens/85-bittal-playing.png b/assets/screens/85-bittal-playing.png new file mode 100644 index 0000000..59a4bd9 Binary files /dev/null and b/assets/screens/85-bittal-playing.png differ diff --git a/assets/screens/90-slicer-trim-zoom.png b/assets/screens/90-slicer-trim-zoom.png new file mode 100644 index 0000000..baee17b Binary files /dev/null and b/assets/screens/90-slicer-trim-zoom.png differ diff --git a/assets/screens/90-slicer-trim.png b/assets/screens/90-slicer-trim.png new file mode 100644 index 0000000..3179d8f Binary files /dev/null and b/assets/screens/90-slicer-trim.png differ diff --git a/assets/screens/91-slicer-sound.png b/assets/screens/91-slicer-sound.png new file mode 100644 index 0000000..3de392a Binary files /dev/null and b/assets/screens/91-slicer-sound.png differ diff --git a/assets/screens/92-slicer-env.png b/assets/screens/92-slicer-env.png new file mode 100644 index 0000000..c0400b0 Binary files /dev/null and b/assets/screens/92-slicer-env.png differ diff --git a/assets/screens/93-slicer-seq.png b/assets/screens/93-slicer-seq.png new file mode 100644 index 0000000..d035578 Binary files /dev/null and b/assets/screens/93-slicer-seq.png differ diff --git a/assets/screens/94-slicer-length.png b/assets/screens/94-slicer-length.png new file mode 100644 index 0000000..8579bd4 Binary files /dev/null and b/assets/screens/94-slicer-length.png differ diff --git a/assets/screens/95-slicer-fx.png b/assets/screens/95-slicer-fx.png new file mode 100644 index 0000000..9c83d2f Binary files /dev/null and b/assets/screens/95-slicer-fx.png differ diff --git a/assets/screens/96-slicer-glo.png b/assets/screens/96-slicer-glo.png new file mode 100644 index 0000000..756eef7 Binary files /dev/null and b/assets/screens/96-slicer-glo.png differ diff --git a/core/bm_acid.cpp b/core/bm_acid.cpp index d66e75c..73e6bc5 100644 --- a/core/bm_acid.cpp +++ b/core/bm_acid.cpp @@ -10,7 +10,7 @@ * the 150 Hz high-pass in its feedback), the measured CUTOFF / ENV MOD mapping, the accent circuit * (a 15 ms leaky integrator of the main envelope, added to the cutoff on accented notes, and the * main envelope added to the amp envelope), the fixed accent decay of 200 ms, the amp envelope - * (instant attack, 1.23 s decay, 0.5 ms / 50 ms release) and its 200 Hz declicker, the pitch slew + * (instant attack, 1.23 s decay, 1 ms / 50 ms release) and its 200 Hz declicker, the pitch slew * of the slide, and the fixed filters around the VCF (44.5 Hz high-pass before, 24.2 Hz high-pass * and a 7.5 Hz notch after), with Open303's values. Changes: float, one sample per output sample * (no 4x oversampling: the cutoff is capped at 10 kHz), filter coefficients every 8 samples, a @@ -40,7 +40,7 @@ struct OnePoleHp { float b0, a1; }; /* rosic OnePoleFilter HIGHPASS: y OnePoleHp hp_pre, hp_post, hp_fb; float n_b0, n_b1, n_a1, n_a2; /* notch (BANDREJECT), b2 = b0 */ float d_b0, d_a1, d_a2; /* declicker LP12 at 200 Hz, b1 = 2 b0, b2 = b0 */ -float k_dec, k_rc2, k_rel_n, k_rel_a; /* amp decay 1230 ms, accent RC 15 ms, releases 0.5 / 50 ms */ +float k_dec, k_rc2, k_rel_n, k_rel_a; /* amp decay 1230 ms, accent RC 15 ms, releases 1 / 50 ms (Open303's triggerNote) */ float c_acc; /* main envelope of an accented note: 200 ms */ const float CUT_LO = 313.8152786f, CUT_HI = 2394.411987f; /* Open303's measured cutoff range */ @@ -59,7 +59,7 @@ struct Acid { float acc, lvl; /* accent gain of the note (0 = none), level for quiet notes */ float mc, kslew, scaler, offset, cut_hz, rskew; uint8_t key[4]; /* the knobs the cached coefficients came from */ - uint8_t gate, accent, fresh; + uint8_t gate, accent, fresh, kslide; }; static_assert(sizeof(Acid) <= BM_VPOOL_BYTES && alignof(Acid) <= 8, "BB-303 voice does not fit the shared pool (bm_vpool.h)"); @@ -125,7 +125,10 @@ void coefs(Acid &z, const bm_acid_par *p) z.key[3] = dk; z.mc = z.accent ? c_acc : expf(-1.0f / (0.001f * decay_ms_of(p->dec) * fs_)); } - z.kslew = one_minus_exp(0.0002f * slide_ms_of(p->slide) * fs_); /* Open303: tau = 0.2 x slide time */ + if (z.fresh || z.kslide != p->slide) { + z.kslide = p->slide; + z.kslew = one_minus_exp(0.0002f * slide_ms_of(p->slide) * fs_); /* Open303: tau = 0.2 x slide time */ + } z.fresh = 0; } @@ -168,7 +171,7 @@ void bm_acid_init(float fs) } k_dec = one_minus_exp(1.230f * fs_); k_rc2 = one_minus_exp(0.015f * fs_); - k_rel_n = one_minus_exp(0.0005f * fs_); + k_rel_n = one_minus_exp(0.001f * fs_); k_rel_a = one_minus_exp(0.050f * fs_); c_acc = expf(-1.0f / (0.200f * fs_)); ready = 1; @@ -219,17 +222,19 @@ int bm_acid_render(int v, const bm_acid_par *p, float *out, int n) const bool sq = (p->wave & 1) != 0; const float krel = z.accent ? k_rel_a : k_rel_n, kslew = z.kslew; const float ampenv = 0.45f + 4.0f * z.acc; /* the MEG into the VCA (more with an accent) */ - float gout = GAIN * z.lvl, dlast = 0.0f; + const float fm = p->lfo_fm, lfo_oct = p->lfo_oct; + float gout = GAIN * z.lvl * p->amp0, dlast = 0.0f; + const float gstep = GAIN * z.lvl * (p->amp1 - p->amp0) / (float)n; /* the LFO on the level: a ramp, no clicks */ for (int i0 = 0; i0 < n; i0 += 8) { int i1 = i0 + 8 < n ? i0 + 8 : n; /* the cutoff: nominal x 2^(ENV MOD part + accent part), Open303::getSample */ - float oct = z.scaler * (z.menv - z.offset) + z.acc * z.rc2; + float oct = z.scaler * (z.menv - z.offset) + z.acc * z.rc2 + lfo_oct; filter_coefs(z, z.cut_hz * SemitonesToRatioSafe(12.0f * oct)); const float b0 = z.b0, b2 = 2.0f * z.b0, k = z.k, g2 = 2.0f * z.g; for (int i = i0; i < i1; i++) { /* pitch slew (the slide) and the oscillator, polyBLEP */ z.freq += kslew * (z.ftgt - z.freq); - float dt = z.freq; + float dt = z.freq * fm; float o = 2.0f * z.ph - 1.0f - blep(z.ph, dt); if (sq) { float p2 = z.ph + 0.5f; if (p2 >= 1.0f) p2 -= 1.0f; @@ -266,6 +271,7 @@ int bm_acid_render(int v, const bm_acid_par *p, float *out, int n) z.dz2 = d_b0 * a + d_a2 * d; dlast = d; out[i] = soft_limit(y * d * gout); + gout += gstep; } } /* NaN/inf in a state stays forever: once per block, back to zero and say so */ diff --git a/core/bm_acid.h b/core/bm_acid.h index 39663f5..ffee6db 100644 --- a/core/bm_acid.h +++ b/core/bm_acid.h @@ -15,8 +15,12 @@ extern "C" { #endif -/* the knobs, 0..127 (as on the panel: CUTOFF, RESO, ENV MOD, DECAY, ACCENT, SLIDE, WAVE) */ -typedef struct { uint8_t cut, res, env, dec, acc, slide, wave; } bm_acid_par; +/* the knobs, 0..127 (as on the panel: CUTOFF, RESO, ENV MOD, DECAY, ACCENT, SLIDE, WAVE), and what + * the LFO adds this block: octaves on the cutoff, a pitch ratio and the level from amp0 to amp1 */ +typedef struct { + uint8_t cut, res, env, dec, acc, slide, wave; + float lfo_oct, lfo_fm, amp0, amp1; +} bm_acid_par; void bm_acid_init(float fs); /* the fixed coefficients (when a channel becomes a BB-303) */ /* note: 0..127 (already transposed). accent: the step has an accent. legato: 1 = slide from the note diff --git a/core/bm_app.c b/core/bm_app.c index ef042d2..5fb81fb 100644 --- a/core/bm_app.c +++ b/core/bm_app.c @@ -14,13 +14,6 @@ static const uint16_t TRACK_COLORS[BM_TRACKS] = {C_ORANGE, C_PINK, C_ACID, C_CYAN, C_VIOLET, C_GREEN}; static const uint16_t KNOB_COLORS[4] = {C_CYAN, C_ORANGE, C_GREEN, C_PINK}; -const uint8_t bm_master_steps_tab[6] = {1, 2, 3, 4, 8, 0}; -const uint8_t bm_roll_ticks[BM_ROLL_RATES] = {48, 24, 12, 32, 16, 8}; -const char *const bm_roll_names[BM_ROLL_RATES] = {"1/8", "1/16", "1/32", "1/8T", "1/16T", "1/32T"}; -const uint16_t bm_roll_len_ticks[4] = {BM_PPQN, BM_PPQN * 2, BM_BAR_TICKS, BM_BAR_TICKS * 2}; -const char *const bm_roll_len_names[4] = {"1/4", "1/2", "1 BAR", "2 BARS"}; -const uint8_t bm_roll_tail_ticks[4] = {0, BM_TICKS_STEP, BM_TICKS_STEP * 2, BM_PPQN}; -const char *const bm_roll_tail_names[4] = {"OFF", "1/16", "1/8", "1/4"}; static const int16_t ENTER_MS[5] = {0, 250, 400, 800, -1}; const char *bm_track_name(const bm_app *a, int t) @@ -35,7 +28,7 @@ int bm_sound_count(const bm_app *a, int t) { if (bm_is_tr(&a->pat, t)) return BM_KITS_N; if (a->pat.trk[t].engine == ENG_ACID) return BM_AC_PRESETS; - if (a->pat.trk[t].engine == ENG_FM) return bm_fm_count(); + if (a->pat.trk[t].engine == ENG_FM) return BM_FM_PATCHES; /* bancos de usuario apagados hasta tener todas las máquinas */ int n = bm_snap_count(a->pat.trk[t].engine); return n ? n : 1; } @@ -137,19 +130,6 @@ void app_overlay(bm_app *a, int enc, const char *title, const char *val, const c o->until = a->now + UI_OVERLAY_MS; } -/* La pregunta la hace el control que se está atendiendo: sostenerlo (o volver a apretarlo) 2 s = sí. */ -void app_ask(bm_app *a, int kind, int arg, int arg2, const char *l1, const char *l2) -{ - a->ask = (uint8_t)kind; a->ask_arg = (uint8_t)arg; a->ask_arg2 = (uint8_t)arg2; - a->ask_ctl = a->cur_ctl; a->ask_t0 = a->now; - if (a->ask_ctl == ASK_ENC) a->ask_live = 1; - else if (a->ask_ctl & ASK_KEY) a->ask_live = a->keys_down[(a->ask_ctl & 0x7F) % BM_KEYS]; - else a->ask_live = (uint8_t)bm_gesture_is_down(&a->ges, a->ask_ctl); - snprintf(a->ask_text[0], sizeof a->ask_text[0], "%s", l1); - snprintf(a->ask_text[1], sizeof a->ask_text[1], "%s", l2 ? l2 : ""); - a->ov.on = 0; -} - int app_scale(const bm_app *a, int t, int *root) { const bm_track *tk = &a->pat.trk[t % BM_TRACKS]; @@ -176,13 +156,6 @@ int bm_app_track_step(const bm_app *a, int t, int lane) return (int)(n % (uint32_t)bm_trk_len(&a->pat, t, lane)); } -int bm_app_chord_track(const bm_app *a) -{ - if (app_kind(a, a->track) == KIND_NOTE) return a->track; - for (int t = 3; t < BM_TRACKS; t++) if (app_kind(a, t) == KIND_NOTE) return t; - return 2; -} - /* ------------------------------------------------------------ almacenamiento */ static const uint8_t *store_ptr(bm_app *a, int obj, int *len) { @@ -222,43 +195,6 @@ static int app_swap(void *u, int from, int to, bm_pattern *p) return 0; } -/* ------------------------------------------------------------ sampler: fuentes y dibujo */ -/* La onda como en un sampler: por columna, el pico [0] y el RMS [1] de las muestras [s0, s1), - * en 0..255 respecto de pk (el pico de la toma entera: el zoom no cambia la altura). */ -static uint32_t isqrt32(uint32_t v) -{ - uint32_t r = 0, b = 1u << 30; - while (b > v) b >>= 2; - while (b) { if (v >= r + b) { v -= r + b; r = (r >> 1) + b; } else r >>= 1; b >>= 2; } - return r; -} - -static uint32_t wave_peak(const int8_t *d, uint32_t len) -{ - uint32_t mx = 1; - for (uint32_t i = 0; d && i < len; i++) { uint32_t u = (uint32_t)(d[i] < 0 ? -d[i] : d[i]); if (u > mx) mx = u; } - return mx; -} - -static void wave_cols(uint8_t wave[2][232], const int8_t *d, uint32_t s0, uint32_t s1, uint32_t pk) -{ - memset(wave, 0, 2 * 232); - if (!d || s1 <= s0 || !pk) return; - uint32_t span = s1 - s0; - for (int x = 0; x < 232; x++) { - uint32_t a = s0 + (uint32_t)((uint64_t)span * (uint32_t)x / 232u), b = s0 + (uint32_t)((uint64_t)span * (uint32_t)(x + 1) / 232u); - if (b <= a) b = a + 1; - if (a >= s1) break; - if (b > s1) b = s1; - uint32_t mx = 0, sq = 0; - for (uint32_t i = a; i < b; i++) { uint32_t u = (uint32_t)(d[i] < 0 ? -d[i] : d[i]); if (u > mx) mx = u; sq += u * u; } - uint32_t rms = isqrt32(sq / (b - a)); - mx = mx * 255u / pk; rms = rms * 255u / pk; - wave[0][x] = (uint8_t)(mx > 255 ? 255 : mx); - wave[1][x] = (uint8_t)(rms > 255 ? 255 : rms); - } -} - bool bm_app_src_ok(const bm_app *a, uint8_t src) { if (src & BM_SRC_ROM) return src != BM_SRC_NONE && (src & 0x7F) < bm_rom_nloops; @@ -312,34 +248,6 @@ bool app_take_info(const bm_app *a, int src, bm_smp_src *m) return src >= 0 && src < BM_TAKES && bm_app_src_info(a, (uint8_t)src, m); } -/* La ventana de la onda: la toma entera (zoom 0) o, con zoom, alrededor de la muestra at (a un - * tercio, para ver más de lo que sigue). wave_ov guarda la toma entera para el mapa de arriba. */ -void app_wave_view(bm_app *a, int src, uint32_t at, int zoom) -{ - bm_smp_src m; - if (!app_take_info(a, src, &m) || !m.len) { - if (a->cut_wd) { memset(a->wave_cut, 0, sizeof a->wave_cut); memset(a->wave_ov, 0, sizeof a->wave_ov); } - a->cut_wd = NULL; a->cut_wlen = 0; a->cut_v0 = a->cut_v1 = 0; - return; - } - bool fresh = m.data != a->cut_wd || m.len != a->cut_wlen; - if (fresh) { - a->cut_pk = wave_peak(m.data, m.len); - uint8_t w[2][232]; - wave_cols(w, m.data, 0, m.len, a->cut_pk); - memcpy(a->wave_ov, w[0], sizeof a->wave_ov); - a->cut_wd = m.data; a->cut_wlen = m.len; - } - uint32_t span = m.len >> (zoom & 3); - if (span < 232) span = m.len < 232 ? m.len : 232; - if (at > m.len) at = m.len; - uint32_t v0 = at > span / 3 ? at - span / 3 : 0; - if (v0 + span > m.len) v0 = m.len - span; - if (!fresh && v0 == a->cut_v0 && v0 + span == a->cut_v1) return; - a->cut_v0 = v0; a->cut_v1 = v0 + span; - wave_cols(a->wave_cut, m.data, a->cut_v0, a->cut_v1, a->cut_pk); -} - /* El kit en el patrón: n pads desde los cortes marks[] de la toma src. Si seq, escribe en la * rejilla de T2 la secuencia que suena como la toma (cada pad en el paso donde empieza). */ static void kit_layout(bm_pattern *p, const bm_take *tk, int src, const uint32_t *marks, int n, bool seq) @@ -364,13 +272,6 @@ static void kit_layout(bm_pattern *p, const bm_take *tk, int src, const uint32_t } } -static bool grid_empty(const bm_tr *tr) -{ - for (int l = 0; l < BM_LANES; l++) - for (int s = 0; s < BM_STEPS; s++) if (tr->st[l][s] & ST_ON) return false; - return true; -} - int app_kit_from_take(bm_app *a, int src, int how) { if (src < 0 || src >= BM_TAKES || !a->take[src].valid) return 0; @@ -384,8 +285,12 @@ int app_kit_from_take(bm_app *a, int src, int how) n = how > BM_SLICES ? BM_SLICES : how; for (int i = 0; i < n; i++) m[i] = tk->len * (uint32_t)i / (uint32_t)n; } - app_undo_snapshot(a, 1); - kit_layout(&a->pat, tk, src, m, n, grid_empty(&a->pat.tr[1])); + /* 2026-10-22 (pedido del usuario): al cortar, la secuencia se escribe siempre (la de antes se va: + * sus pads ya no son los mismos) */ + bm_tr *tr = &a->pat.tr[1]; + memset(tr->st, 0, sizeof tr->st); + for (int i = 0; i < BM_LANE_LOCKS; i++) tr->lk[i].lane = 0xFF; + kit_layout(&a->pat, tk, src, m, n, true); a->sel_lane[1] = 0; app_edited(a); return n; @@ -578,52 +483,6 @@ static int write_pattern(bm_app *a, int obj) return bm_store_write(&a->store, (uint8_t)obj, a->pend, (uint16_t)n); } -static int load_into(bm_app *a, int obj) -{ - int len = 0; - const uint8_t *src = store_ptr(a, obj, &len); - if (src && len > 0 && bm_pattern_unpack(&a->pat, src, len) > 0) return 1; - empty_from(&a->pat); - return 0; -} - -/* Copia un canal (o el patrón entero) a otro patrón. Corre parado y con el audio en fade: - * guarda el actual, abre el destino, pega, lo guarda y vuelve a abrir el actual. */ -static int copy_to(bm_app *a, int dst, int trk) -{ - int cur = a->ctx.st.pattern; - if (a->pend_obj >= 0) return -1; - if (write_pattern(a, cur)) return -1; - a->dirty = 0; - if (trk >= 0) { /* el buffer de rehacer sirve de bolsa */ - memcpy(&a->redo, app_track_data(a, trk), app_track_size(trk)); - a->redo_track = -1; - bm_track tk = a->pat.trk[trk]; - uint8_t prm[BM_PRM]; - memcpy(prm, a->pat.prm[trk], BM_PRM); - bm_loop lp; - memset(&lp, 0, sizeof lp); - if (trk >= BM_TR_TRACKS) lp = a->pat.loop[trk - BM_TR_TRACKS]; - load_into(a, dst); - int o = bm_machine_conflict(&a->pat, trk, tk.engine); - if (o >= 0) { /* BUNO-6 y BITTAL, una vez por patrón: no se copia */ - load_into(a, cur); - bm_engines_sync(&a->ctx); - char b[30]; snprintf(b, sizeof b, TF("%s ALREADY ON T%d"), bm_engine_names[tk.engine], o + 1); - app_toast(a, b); - return 0; - } - memcpy(app_track_data(a, trk), &a->redo, app_track_size(trk)); - a->pat.trk[trk] = tk; - memcpy(a->pat.prm[trk], prm, BM_PRM); - if (trk >= BM_TR_TRACKS) a->pat.loop[trk - BM_TR_TRACKS] = lp; - } - int err = write_pattern(a, dst); - load_into(a, cur); - bm_engines_sync(&a->ctx); - return err; -} - static int exec_job(bm_app *a, int type, int arg) { char b[30]; @@ -643,8 +502,6 @@ static int exec_job(bm_app *a, int type, int arg) a->dirty = 0; return 0; } - case JOB_COPY_PAT: return copy_to(a, arg, -1); - case JOB_COPY_TRK: return copy_to(a, arg & 15, arg >> 4); case JOB_SAVE_SONG: { uint8_t buf[2 + 2 * BM_SONG_MAX + sizeof a->song.scene]; buf[0] = BM_SONG_VER; buf[1] = a->song.n; @@ -681,7 +538,10 @@ static int exec_job(bm_app *a, int type, int arg) if (app_kit_empty(a)) { /* el kit estaba vacío: la toma lo arma */ app_kit_from_take(a, id, 0); snprintf(b, sizeof b, TF("TAKE %02d: KIT READY"), id + 1); - } else snprintf(b, sizeof b, TF("TAKE %02d SAVED: TAKES > KIT"), id + 1); + } else { /* si no, queda entera en el pad elegido (EDIT > TRIM la corta) */ + app_pad_take(a, a->sel_lane[1] & 15, id); + snprintf(b, sizeof b, TF("TAKE %02d ON PAD %d"), id + 1, (a->sel_lane[1] & 15) + 1); + } app_toast(a, b); return 0; } @@ -710,7 +570,15 @@ static void jobs_run(bm_app *a) int flash = 0; for (int i = 0; i < a->njob; i++) if (a->job[i] != JOB_LOAD) flash = 1; if (flash) { - if (app_playing(a)) { app_toast(a, "STOP TO SAVE"); a->njob = 0; return; } + if (app_playing(a)) { /* sonando: espera a que pares (la flash pausa el audio) */ + int n = 0; + for (int i = 0; i < a->njob; i++) { + if (a->job[i] == JOB_LOAD) { exec_job(a, JOB_LOAD, a->job_arg[i]); continue; } + a->job[n] = a->job[i]; a->job_arg[n] = a->job_arg[i]; n++; + } + a->njob = n; + return; + } if (!a->pf.flash) { a->njob = 0; return; } if (a->cmdq.r != a->cmdq.w) return; if (!a->job_fading) { app_push(a, CMD_FADE, 1, 0, 0); a->job_fading = 1; return; } @@ -723,7 +591,7 @@ static void jobs_run(bm_app *a) if (err) app_toast(a, "FLASH ERROR"); } -/* ------------------------------------------------------------ demo de primer arranque */ +/* ------------------------------------------------------------ patrones de fábrica (primer arranque) */ static void ev_set(bm_pattern *p, int t, int s, int k, int note, int vel, int len, int prob) { bm_event *e = bm_ev(p, t, s, k); @@ -731,75 +599,146 @@ static void ev_set(bm_pattern *p, int t, int s, int k, int note, int vel, int le e->note = (uint8_t)note; e->vel = (uint8_t)vel; e->len = (uint8_t)len; e->prob = (uint8_t)prob; } -/* Patrón de pruebas: acid techno a 160 BPM en La menor. BR-8 con el kit 909, una línea de BB-303 - * con acentos y slides, BP-1 cortando la primera toma (si hay), acordes de BX-7, un pluck de BITTAL - * y un pad de BUNO-6 de cuatro compases (una nota larga). */ +/* Patrones de fábrica (2026-10-24, pedido del usuario): 1 DA FUNK, 2 BLADE, 3 ENJOY THE SILENCE. + * Los canales como vienen (BR-8, Slicer vacío, BB-303, B-MINI, BITTAL, BUNO-6). Tempo y tono de cada + * tema según Wikipedia, Hooktheory y bases de DJ; las líneas: + * - DA FUNK (Daft Punk, 111 BPM, Sol menor): no hay hoja publicada. La 303 usa las notas que da Attack + * Magazine (G A# C D# F, el primer 1/16 en silencio); el bajo es un Sol grave con cada bombo y el + * lead va en cuartas (Reverb Machine). El orden de las notas es nuestro, a oído. + * - BLADE (New Order, "Confusion", Pump Panel Reconstruction, 136 BPM, Sol menor): la 303 de la hoja + * de djjondent.blogspot.com (G y A#), con los acentos que propone un usuario en forums.adafruit.com. + * - ENJOY THE SILENCE (Depeche Mode, 113 BPM): la batería de drum-patterns.com y el estribillo de + * Hooktheory (Fm Ab Cm Eb, un compás cada uno; voces y bajo nuestros). + * La escena B de todos los patrones es todo muteado (scenes_default). */ static void tr_on(bm_tr *d, int lane, const char *pat, uint8_t extra) { for (int s = 0; pat[s] && s < BM_STEPS; s++) if (pat[s] == 'x' || pat[s] == 'X') d->st[lane][s] = (uint8_t)(ST_ON | (pat[s] == 'X' ? ST_ACC : 0) | extra); } -static void demo_pattern(bm_pattern *p, bm_song *song, const bm_take *tk, uint8_t take) +typedef struct { int8_t s, n; uint8_t acc, slide; } line303; /* acento = vel 127, slide = LIGA hasta la siguiente */ +static void put303(bm_pattern *p, int t, const line303 *L, int n) { - bm_pattern_init(p); - p->meta.bpm_x10 = 1600; p->meta.swing = 50; p->meta.root = 9; p->meta.scale = 1; - p->meta.master = 4; p->meta.fill_every = 4; p->meta.chord_set = 0; p->meta.strum = 0; - p->meta.dly_time = 2; p->meta.dly_fb = 45; p->meta.dly_mix = 40; - /* T1: 909 */ - bm_tr *d = &p->tr[0]; - bm_kit_apply(d, 1); - p->trk[0].source = 1; - tr_on(d, 0, "x...x...x...x...", 0); /* bombo */ - d->st[0][14] = ST_ON | (1 << ST_COND_SH); /* y uno más en el fill */ - tr_on(d, 2, ".x.x.x.x.x.x.x.x", 0); /* hat cerrado */ - tr_on(d, 3, "..x...x...x.....", 0); /* hat abierto a contratiempo */ - d->st[2][14] = ST_ON | ST_ACC | (1 << ST_RAT_SH); /* y un redoble x2 */ - tr_on(d, 5, "....x.......x...", 0); /* palmas */ - tr_on(d, 6, "...x.......x..x.", 0); /* rim */ - d->lane[6].level = 70; - tr_on(d, 12, "xxxxxxxxxxxx", 0); /* shaker de 12 contra 16 */ - d->lane[12].len = 12; d->lane[12].level = 45; - d->st[15][15] = ST_ON | (1 << ST_COND_SH); /* zap en el fill */ - d->lane[1].level = 0; - /* T2: el kit de pads sale de la primera toma (en los golpes) y la rejilla la toca en orden */ - p->trk[1].level = 70; - if (tk) { - uint32_t m[BM_SLICES]; - uint32_t bpm = tk->bpm_x10 ? tk->bpm_x10 : 1600; - int n = bm_slice_onsets(tk->data, tk->len, (uint32_t)BM_SMP_RATE * 150u / bpm, 64, m); - kit_layout(p, tk, take, m, n, true); + for (int i = 0; i < n; i++) + ev_set(p, t, L[i].s, 0, L[i].n, L[i].acc ? BM_VEL_ACC : BM_VEL_NORMAL, 1 | (L[i].slide ? BM_LEN_TIE : 0), 100); +} + +static void od_on(bm_pattern *p, int t, int gain) +{ + p->prm[t][AC_FX] = bm_acid_fx_set(p->prm[t][AC_FX], ACF_OD, 1); + p->prm[t][AC_OD_G] = (uint8_t)gain; +} + +static void snd(bm_pattern *p, int t, int preset) { p->trk[t].source = (uint8_t)preset; bm_preset_apply(p, t, preset); } + +static void scene4(bm_song *song, int pat, uint8_t a, uint8_t c, uint8_t d) /* A, C y D (la B es la de siempre) */ +{ + bm_scene *s = song->scene[pat]; + s[0].flags = s[2].flags = s[3].flags = SCN_STORED; + s[0].trk_mute = a; s[2].trk_mute = c; s[3].trk_mute = d; +} + +static void factory_da_funk(bm_pattern *p, bm_song *song) +{ + p->meta.bpm_x10 = 1110; p->meta.swing = 54; p->meta.root = 7; p->meta.scale = 1; + p->meta.dly_time = 2; p->meta.dly_fb = 40; p->meta.dly_mix = 35; p->meta.rv_mix = 45; + bm_tr *d = &p->tr[0]; /* T1: 909, cuatro en el piso */ + bm_kit_apply(d, 1); p->trk[0].source = 1; + tr_on(d, 0, "x...x...x...x...", 0); + tr_on(d, 5, "....x.......x...", 0); + tr_on(d, 2, "xxXxxxXxxxXxxxXx", 0); d->lane[2].level = 55; + /* T3: BB-303 ROBOT FUNK con OVERDRIVE (en el tema entra a la mitad: escena D) */ + snd(p, 2, 8); od_on(p, 2, 100); + static const line303 F[] = { + {1, 43, 1, 0}, {2, 55, 0, 1}, {3, 43, 0, 0}, {4, 46, 0, 0}, {5, 43, 1, 0}, {6, 53, 0, 0}, {7, 43, 0, 0}, + {8, 48, 0, 1}, {9, 51, 0, 0}, {10, 43, 1, 0}, {11, 41, 0, 0}, {12, 43, 0, 0}, {13, 58, 1, 1}, {14, 55, 0, 0}, {15, 53, 0, 0}}; + put303(p, 2, F, (int)(sizeof F / sizeof F[0])); + p->trk[2].length = 16; p->trk[2].send = 30; + /* T4: B-MINI WIZARD BASS, el Sol grave con cada bombo */ + snd(p, 3, 0); p->trk[3].length = 16; + for (int s = 0; s < 16; s += 4) ev_set(p, 3, s, 0, 31, 100, 1, 100); + /* T5: BITTAL CHORD STAB, la "insistencia": un Sol agudo en 1/16 con delay */ + snd(p, 4, 8); p->trk[4].length = 16; p->trk[4].send = 55; + for (int s = 0; s < 16; s++) ev_set(p, 4, s, 0, 79, s % 4 == 2 ? 95 : 70, 1, 100); + /* T6: BUNO-6 POP RIFF con DISTORTION, el lead en cuartas (dos compases) */ + snd(p, 5, 10); p->prm[5][PX_FX] |= 1u; p->prm[5][PX_DS_G] = 90; + p->trk[5].length = 32; p->trk[5].send = 20; p->trk[5].rsend = 30; + static const int8_t M[][3] = { + {0, 62, 2}, {2, 62, 1}, {3, 60, 1}, {4, 62, 2}, {6, 65, 2}, {8, 62, 2}, {10, 60, 1}, {11, 58, 1}, {12, 60, 2}, {14, 58, 1}, {15, 55, 1}, + {16, 55, 2}, {18, 58, 1}, {19, 60, 1}, {20, 62, 2}, {22, 70, 2}, {24, 67, 2}, {26, 65, 2}, {28, 62, 2}, {30, 60, 1}, {31, 58, 1}}; + for (unsigned i = 0; i < sizeof M / sizeof M[0]; i++) { + ev_set(p, 5, M[i][0], 0, M[i][1], 95, M[i][2], 100); + ev_set(p, 5, M[i][0], 1, M[i][1] + 5, 85, M[i][2], 100); } - /* T3: BB-303, la línea 303 (acento = vel 127, LIGA = slide); macros CUTOFF RESO ENV MOD DECAY */ - bm_track_set_engine(p, 2, ENG_ACID); - bm_track *t3 = &p->trk[2]; - t3->macro[0] = 28; t3->macro[1] = 108; t3->macro[2] = 105; t3->macro[3] = 58; t3->glide = 45; t3->accent = 115; - t3->length = 16; t3->send = 25; - static const struct { int8_t s, n; uint8_t acc, slide; } L[] = { - {0, 45, 1, 0}, {1, 45, 0, 0}, {2, 57, 1, 1}, {3, 45, 0, 0}, {4, 48, 0, 0}, {5, 45, 0, 1}, {6, 52, 1, 0}, - {8, 45, 0, 0}, {9, 57, 1, 0}, {10, 55, 0, 1}, {11, 52, 0, 0}, {12, 45, 1, 0}, {13, 48, 0, 1}, {14, 50, 0, 0}, {15, 45, 0, 0}}; - for (unsigned i = 0; i < sizeof L / sizeof L[0]; i++) - ev_set(p, 2, L[i].s, 0, L[i].n, L[i].acc ? BM_VEL_ACC : BM_VEL_NORMAL, 1 | (L[i].slide ? BM_LEN_TIE : 0), 100); - /* T4: BX-7, acordes de E.PIANO a contratiempo, con delay */ - p->trk[3].source = 0; p->trk[3].length = 32; p->trk[3].send = 45; p->trk[3].rsend = 30; - for (int k = 0; k < 3; k++) { static const int C[3] = {57, 60, 64}; ev_set(p, 3, 10, k, C[k], 90, 1, 100); ev_set(p, 3, 26, k, C[k] - 2 + (k == 1), 80, 1, 100); } - /* T5: BITTAL, un pluck que a veces no está */ - p->trk[4].source = 13; bm_preset_apply(p, 4, 13); - p->trk[4].length = 32; p->trk[4].send = 35; p->trk[4].rsend = 60; - { static const int8_t S[6] = {2, 6, 14, 18, 22, 30}, N[6] = {69, 72, 76, 74, 72, 76}; - for (int i = 0; i < 6; i++) ev_set(p, 4, S[i], 0, N[i], 85, 1, i % 3 == 2 ? 60 : 100); } - /* T6: BUNO-6, un pad de La menor que dura los cuatro compases */ - p->trk[5].source = 2; bm_preset_apply(p, 5, 2); - p->trk[5].length = 64; p->trk[5].send = 0; p->trk[5].rsend = 70; - for (int k = 0; k < 3; k++) { static const int C[3] = {57, 60, 64}; ev_set(p, 5, 0, k, C[k], 75, 64, 100); } - p->trk[0].level = 84; p->trk[2].level = 66; p->trk[3].level = 32; p->trk[4].level = 36; p->trk[5].level = 26; - p->meta.rv_mix = 70; + p->trk[0].level = 84; p->trk[2].level = 60; p->trk[3].level = 70; p->trk[4].level = 28; p->trk[5].level = 45; + scene4(song, 0, 0x00, 0x04, 0x30); /* A todo · C sin la 303 (el principio) · D la 303 con batería y bajo */ +} + +static void factory_blade(bm_pattern *p, bm_song *song) +{ + p->meta.bpm_x10 = 1360; p->meta.swing = 50; p->meta.root = 7; p->meta.scale = 1; + p->meta.dly_time = 2; p->meta.dly_fb = 35; p->meta.dly_mix = 30; p->meta.rv_mix = 50; + bm_tr *d = &p->tr[0]; + bm_kit_apply(d, 1); p->trk[0].source = 1; + tr_on(d, 0, "x...x...x...x...", 0); + tr_on(d, 3, "..x...x...x...x.", 0); d->lane[3].level = 65; + tr_on(d, 2, "xx.xxx.xxx.xxx.x", 0); d->lane[2].level = 50; + tr_on(d, 5, "....x.......x...", 0); + /* T3: BB-303 PHILLY 95, cuadrada, corte alto y OVERDRIVE fuerte; Sol (G3) y La# (A#2, A#3) */ + snd(p, 2, 7); od_on(p, 2, 115); + p->prm[2][AC_WAVE] = 1; p->trk[2].macro[0] = 95; + static const line303 B[] = { + {0, 55, 1, 0}, {3, 55, 1, 0}, {5, 46, 1, 0}, {6, 46, 1, 0}, {8, 46, 1, 0}, {10, 58, 1, 0}, {12, 58, 1, 0}, {13, 58, 1, 0}, {15, 58, 0, 0}}; + put303(p, 2, B, (int)(sizeof B / sizeof B[0])); + bm_ev(p, 2, 0, 0)->len = 3; bm_ev(p, 2, 10, 0)->len = 2; /* las notas sostenidas de la hoja */ + p->trk[2].length = 16; p->trk[2].send = 25; + /* T5: BITTAL SIREN, una nota larga cada cuatro compases, baja */ + snd(p, 4, 2); p->trk[4].length = 64; p->trk[4].rsend = 60; + ev_set(p, 4, 0, 0, 67, 80, 32, 100); + /* T6: BUNO-6 DARK RAVE, el acorde de Sol menor cada dos compases */ + snd(p, 5, 14); p->trk[5].length = 32; p->trk[5].rsend = 45; + for (int k = 0; k < 3; k++) { static const int C[3] = {55, 58, 62}; ev_set(p, 5, 0, k, C[k], 100, 2, 100); ev_set(p, 5, 22, k, C[k], 90, 1, 100); } + p->trk[0].level = 88; p->trk[2].level = 62; p->trk[4].level = 22; p->trk[5].level = 34; + scene4(song, 1, 0x00, 0x38, 0x01); /* A todo · C batería y 303 · D sin batería */ +} + +static void factory_enjoy(bm_pattern *p, bm_song *song) +{ + p->meta.bpm_x10 = 1130; p->meta.swing = 50; p->meta.root = 5; p->meta.scale = 1; + p->meta.dly_time = 1; p->meta.dly_fb = 30; p->meta.dly_mix = 25; p->meta.rv_mix = 55; + bm_tr *d = &p->tr[0]; /* T1: 909, la rejilla de dos compases */ + bm_kit_apply(d, 1); p->trk[0].source = 1; + tr_on(d, 0, "X...X...x...X...", 0); + tr_on(d, 2, "X...X..X.x..X...", 0); + tr_on(d, 3, "..x...x...x...x.", 0); d->lane[3].level = 50; + tr_on(d, 4, "....X..X....X.......X.......X...", 0); d->lane[4].len = 32; + tr_on(d, 5, "....X..X....X.......X.......X...", 0); d->lane[5].len = 32; d->lane[5].level = 60; + /* el estribillo: Fm Ab Cm Eb, un compás cada uno */ + static const int8_t R[4] = {41, 44, 36, 39}, C[4][3] = {{53, 56, 60}, {56, 60, 63}, {55, 60, 63}, {55, 58, 63}}; + snd(p, 3, 14); p->trk[3].length = 64; /* T4: B-MINI HIGHWAY BASS en corcheas */ + for (int b = 0; b < 4; b++) for (int s = 0; s < 16; s += 2) ev_set(p, 3, b * 16 + s, 0, R[b], s % 4 ? 85 : 100, 1, 100); + snd(p, 5, 3); p->trk[5].length = 64; p->trk[5].rsend = 55; /* T6: BUNO-6 PWM STRINGS */ + for (int b = 0; b < 4; b++) for (int k = 0; k < 3; k++) ev_set(p, 5, b * 16, k, C[b][k], 80, 16, 100); + p->trk[0].level = 84; p->trk[3].level = 72; p->trk[5].level = 36; + scene4(song, 2, 0x00, 0x20, 0x01); /* A todo · C batería y bajo · D sin batería */ +} + +#define BM_FACTORY_PATS 3 +static void factory_pattern(bm_pattern *p, bm_song *song, int i) +{ + bm_pattern_init(p); + p->meta.master = 4; p->meta.fill_every = 4; + if (i == 0) factory_da_funk(p, song); + else if (i == 1) factory_blade(p, song); + else factory_enjoy(p, song); +} + +/* La escena B de fábrica en todos los patrones: los seis canales muteados, la batería también (pedido del + * usuario, 2026-10-24). Queda hasta que se guarde otra encima. */ +static void scenes_default(bm_song *song) +{ memset(song->scene, 0, sizeof song->scene); - for (int s = 0; s < BM_SCENES; s++) song->scene[s].flags = SCN_STORED; - song->scene[0].trk_mute = 0x00; /* A: todo */ - song->scene[1].trk_mute = 0x38; /* B: batería, voces y acid */ - song->scene[2].trk_mute = 0x01; /* C: sin batería */ - song->scene[3].trk_mute = 0x3A; /* D: batería y acid */ + for (int p = 0; p < BM_PATTERNS; p++) { song->scene[p][1].flags = SCN_STORED; song->scene[p][1].trk_mute = (uint8_t)((1u << BM_TRACKS) - 1u); } } /* 0.4: sin loops de fábrica. El sampler toca tomas: las que se graban o se suben con @@ -817,7 +756,7 @@ static void midi_out_cb(void *u, uint8_t b) static void settings_defaults(bm_settings *s) { memset(s, 0, sizeof *s); - s->ver = BM_FMT; s->sync_ppqn = 2; s->drive = 25; s->led_dim = 1; s->autosave = 1; s->enter = 2; + s->ver = BM_FMT; s->factory = BM_FACTORY_VER; s->sync_ppqn = 2; s->drive = 25; s->led_dim = 1; s->autosave = 1; s->enter = 2; /* dual_core apagado: en 0.6.1 venía encendido y en el aparato iba más lento que un núcleo (123 % * contra ~105 %). Desde 0.6.2 usa el núcleo 1 por interrupción (hal/fm1/fm1_cpu1.c), a prueba. */ } @@ -840,26 +779,27 @@ void bm_app_init(bm_app *a, const bm_platform *pf, uint32_t now) a->ctx.swap = app_swap; a->ctx.swap_user = a; a->ctx.midi_out = midi_out_cb; a->ctx.midi_user = a; bm_gesture_init(&a->ges, app_on_gesture, a); - a->pend_obj = -1; a->undo_track = -1; a->redo_track = -1; a->held_step = -1; a->held_white = -1; - a->slice_sens = 64; a->pad_key = -1; a->rec_gate = 100; a->tie_from = -1; a->rec_step = -1; - a->pat_sel = -1; a->punch_key = -1; a->last_pad = -1; a->solo_key = -1; a->solo_track = -1; - a->song_rec_scene = 0xFF; a->mach_trk = BM_TR_TRACKS; a->ask_ctl = 0xFF; a->cur_ctl = 0xFF; - a->roll_rate = 1; a->roll_len = 2; a->roll_swing = 50; /* 1/16, rampa de un compás: lo mismo que arranca el audio */ + a->pend_obj = -1; a->held_step = -1; a->held_white = -1; + a->slice_sens = 64; a->pad_key = -1; + a->solo_key = -1; a->solo_track = -1; + a->mach_trk = BM_TR_TRACKS; static const uint8_t ln[BM_TRACKS] = {0, 0, 45, 57, 60, 64}; memcpy(a->last_note, ln, sizeof ln); for (int k = 0; k < BM_KEYS; k++) a->key_rec_step[k] = -1; settings_defaults(&a->set); a->battery = 100; - int fresh = 1; + scenes_default(&a->song); + int fresh = 1, mounted = 0; if (pf->flash && bm_store_mount(&a->store, pf->flash) == 0) { + mounted = 1; bm_settings s; int has_glob = bm_store_read_glob(&a->store, (uint8_t *)&s, sizeof s) == (int)sizeof s; int ok = has_glob && s.ver == BM_FMT, old = has_glob && !ok, oldpat = 0; for (int i = 0; i < BM_PATTERNS; i++) { /* patrones de otro formato: hasta la v1 no se convierten */ int len = 0; const uint8_t *p = store_ptr(a, i, &len); - if (p && len > (int)offsetof(bm_meta, fmt) && p[offsetof(bm_meta, fmt)] != BM_PAT_FMT) oldpat = 1; + if (p && len > (int)offsetof(bm_meta, fmt) && p[offsetof(bm_meta, fmt)] != BM_PAT_FMT && p[offsetof(bm_meta, fmt)] != 9) oldpat = 1; /* el 9 se lee */ } if (old) { /* datos de 0.2: se empieza de cero */ bm_store_format(&a->store, pf->flash); @@ -869,6 +809,10 @@ void bm_app_init(bm_app *a, const bm_platform *pf, uint32_t now) ok = 0; } if (ok) a->set = s; + if (ok && a->set.factory != BM_FACTORY_VER) { /* patrones de fábrica nuevos: los guardados se borran (tomas, sonidos y ajustes se quedan) */ + bm_store_format(&a->store, pf->flash); + a->set.factory = BM_FACTORY_VER; + } uint8_t b[2 + 2 * BM_SONG_MAX + sizeof a->song.scene]; /* otra versión (0.8: escenas con patrón): se ignora */ if (ok && bm_store_read(&a->store, BM_OBJ_SONG, b, sizeof b) == (int)sizeof b && b[0] == BM_SONG_VER) { a->song.n = b[1] > BM_SONG_MAX ? BM_SONG_MAX : b[1]; @@ -885,9 +829,12 @@ void bm_app_init(bm_app *a, const bm_platform *pf, uint32_t now) bm_takes_scan(pf->flash, pf->flash_map, pf->user, a->take); } bm_lang_use(a->set.lang ? bm_app_lang_pack(a) : NULL); - uint8_t first = BM_SRC_NONE; - for (int i = BM_TAKES - 1; i >= 0; i--) if (a->take[i].valid) first = (uint8_t)i; - if (fresh) { demo_pattern(&a->pat, &a->song, first < BM_TAKES ? &a->take[first] : NULL, first); a->dirty = 1; a->song_dirty = 1; a->set_dirty = 1; a->t_edit = now; } + if (fresh) { /* los de fábrica: el 1 queda cargado (se guarda solo), el 2 y el 3 se escriben ya */ + if (mounted) for (int i = 1; i < BM_FACTORY_PATS; i++) { factory_pattern(&a->pat, &a->song, i); write_pattern(a, i); } + factory_pattern(&a->pat, &a->song, 0); + a->set.last_pat = 0; + a->dirty = 1; a->song_dirty = 1; a->set_dirty = 1; a->t_edit = now; + } a->set.last_pat %= BM_PATTERNS; a->ctx.cur_pat = a->set.last_pat; a->ctx.st.pattern = a->set.last_pat; @@ -896,7 +843,6 @@ void bm_app_init(bm_app *a, const bm_platform *pf, uint32_t now) apply_settings(a); app_send_takes(a); a->view = V_BOOT; - a->page = PG_SEQ; a->boot_t = now; a->scr.force = 1; a->scr.budget = BM_SCR_BUDGET; @@ -917,146 +863,33 @@ void bm_app_master(bm_app *a, uint16_t adc) } /* ------------------------------------------------------------ navegación */ -/* 0.9: sin MACHINE (la máquina se cambia desde HOME) y sin MORE (es el GLO de la máquina) */ -static const uint8_t TABS_TR[] = {PG_SEQ, PG_SOUND, PG_INST, PG_MIX}; -static const uint8_t TABS_PADS[] = {PG_SEQ, PG_PADS, PG_BREAK, PG_TAKES, PG_MIX}; -/* T3-T6: ENV y LFO están en SOUND */ -static const uint8_t TABS_NOTE[] = {PG_SEQ, PG_SOUND, PG_MIX, PG_ARP, PG_LOOP}; - -int bm_app_tabs(const bm_app *a, int t, uint8_t out[8]) -{ - const uint8_t *s; int n; - if (bm_is_pads(t)) { s = TABS_PADS; n = (int)sizeof TABS_PADS; } - else if (app_kind(a, t) == KIND_TR) { s = TABS_TR; n = (int)sizeof TABS_TR; } - else { s = TABS_NOTE; n = (int)sizeof TABS_NOTE; } - memcpy(out, s, (size_t)n); - return n; -} - -const char *bm_page_name(int page) -{ - static const char *const N[PG_COUNT] = {"SEQ", "SOUND", "INSTR", "MIX", "GLO", "BREAK", "TAKES", "ARP", "LOOP", - "MIDI", "SCALE", "CHORDS", "RECORD", "PADS"}; - return page < PG_COUNT ? N[page] : ""; -} - -int app_page_ok(const bm_app *a, int t, int page) -{ - if (page == PG_SCL || page == PG_CHORDS || page == PG_MORE) return 1; - if (page == PG_REC) return t == 1; - uint8_t tabs[8]; - int n = bm_app_tabs(a, t, tabs); - for (int i = 0; i < n; i++) if (tabs[i] == page) return 1; - return 0; -} - -/* 0.9: HOME siempre vuelve a MIX; no hay "volver" a otra pantalla. Salir de la consola apaga SLOOP. */ +/* HOME es la consola: salir de ella apaga PLAY/REC y cierra las capas. */ void app_set_view(bm_app *a, int v) { - if (v != V_HOME && v != V_FXG && a->sloop) app_sloop(a, 0); + if (v != V_HOME && a->sloop) app_sloop(a, 0); + a->layer = L_NONE; a->layer_latch = 0; a->view = (uint8_t)v; a->ov.on = 0; a->clear_armed = 0; } +/* La rejilla por pasos de la batería y del Slicer (V_CH). */ void app_enter(bm_app *a, int t, int page) { - a->track = (uint8_t)(t % BM_TRACKS); - if (!app_page_ok(a, a->track, page)) page = PG_SEQ; - if (a->view == V_CH && a->page == PG_PADS && page != PG_PADS && a->take_dirty) /* la ganancia de la toma se guarda al salir */ - for (int i = 0; i < BM_TAKES; i++) if (a->take_dirty & (1u << i)) app_job(a, JOB_TAKE_META, i); - a->page = (uint8_t)page; - if (page != PG_REC && page != PG_MORE) a->ch_page[a->track] = (uint8_t)page; /* volver no pasa por su GLO */ - a->held_step = -1; a->held_white = -1; - a->mach_arm = 0; - app_set_view(a, V_CH); -} - -void app_select_track(bm_app *a, int t, int keep_page) -{ - if (t < 0 || t >= BM_TRACKS) return; + (void)page; + if (!bm_is_grid(&a->pat, t)) return; a->track = (uint8_t)t; a->held_step = -1; a->held_white = -1; a->mach_arm = 0; - if (a->view == V_CH) { - int pg = keep_page && app_page_ok(a, t, a->page) && a->page != PG_REC ? a->page : a->ch_page[t]; - if (!app_page_ok(a, t, pg)) pg = PG_SEQ; - a->page = (uint8_t)pg; - a->ch_page[t] = (uint8_t)pg; - int len = bm_trk_len(&a->pat, t, a->sel_lane[t]); - if (a->step_page * 16 >= len) a->step_page = 0; - } - char b[24]; - snprintf(b, sizeof b, "T%d %s", t + 1, T(bm_track_name(a, t))); - app_toast(a, b); + int len = bm_trk_len(&a->pat, t, a->sel_lane[t] & 15); + if (a->step_page * BM_PAGE_STEPS >= len) a->step_page = 0; + app_set_view(a, V_CH); } -/* ------------------------------------------------------------ undo, portapapeles */ +/* ------------------------------------------------------------ datos de un canal */ void *app_track_data(bm_app *a, int t) { return t < BM_TR_TRACKS ? (void *)&a->pat.tr[t] : (void *)&a->pat.nt[t - BM_TR_TRACKS]; } size_t app_track_size(int t) { return t < BM_TR_TRACKS ? sizeof(bm_tr) : sizeof(bm_notes); } -void app_undo_snapshot(bm_app *a, int t) -{ - memcpy(&a->undo, app_track_data(a, t), app_track_size(t)); - a->undo_track = (int8_t)t; - a->redo_track = -1; -} - -void app_do_undo(bm_app *a) -{ - if (a->undo_track < 0) { app_toast(a, "NOTHING TO UNDO"); return; } - int t = a->undo_track; - memcpy(&a->redo, app_track_data(a, t), app_track_size(t)); - a->redo_track = (int8_t)t; - app_push_ptr(a, CMD_TRACK_BULK, (uint8_t)t, &a->undo); - a->undo_track = -1; - app_edited(a); - char b[30]; snprintf(b, sizeof b, TF("UNDONE ON T%d"), t + 1); - app_toast(a, b); -} - -void app_do_redo(bm_app *a) -{ - if (a->redo_track < 0) { app_toast(a, "NOTHING TO REDO"); return; } - int t = a->redo_track; - memcpy(&a->undo, app_track_data(a, t), app_track_size(t)); - a->undo_track = (int8_t)t; - app_push_ptr(a, CMD_TRACK_BULK, (uint8_t)t, &a->redo); - a->redo_track = -1; - app_edited(a); - char b[30]; snprintf(b, sizeof b, TF("REDONE ON T%d"), t + 1); - app_toast(a, b); -} - -void app_clear_track(bm_app *a, int t) -{ - app_undo_snapshot(a, t); - app_push(a, CMD_TRACK_CLEAR, (uint8_t)t, 0, 0); - app_edited(a); - char b[30]; - snprintf(b, sizeof b, TF("T%d ERASED (HOME+OCT- UNDOES)"), t + 1); - app_toast(a, b); -} - -void app_copy_track(bm_app *a, int t) -{ - memcpy(&a->clip, app_track_data(a, t), app_track_size(t)); - a->clip_trk = a->pat.trk[t]; - a->clip_type = 2; a->clip_track = (uint8_t)t; - app_toast(a, "TRACK COPIED"); -} - -void app_paste_track(bm_app *a, int t) -{ - if (a->clip_type != 2 || app_kind(a, t) != bm_kind(&a->pat, a->clip_track) || (app_kind(a, t) == KIND_TR) != (a->clip_trk.engine == ENG_DRUM)) { - app_toast(a, "NOTHING TO PASTE HERE"); return; - } - app_undo_snapshot(a, t); - app_push_ptr(a, CMD_TRACK_BULK, (uint8_t)t, &a->clip); - app_edited(a); - app_toast(a, "TRACK PASTED"); -} - void app_init_sound(bm_app *a, int t) { if (app_kind(a, t) == KIND_NOTE) app_push(a, CMD_PRESET, (uint8_t)t, 0xFF, 0); /* los ajustes de fábrica de la máquina */ @@ -1074,11 +907,9 @@ int app_set_machine(bm_app *a, int t, int eng) { if (!bm_engine_ok(t, eng) || t < BM_TR_TRACKS || a->pat.trk[t].engine == eng) return -1; if (bm_machine_conflict(&a->pat, t, eng) >= 0) return -1; - if (a->undo_track == t) a->undo_track = -1; /* el undo tenía P-Locks de la otra máquina */ - if (a->redo_track == t) a->redo_track = -1; app_push(a, CMD_ENGINE, (uint8_t)t, (uint8_t)eng, 0); app_edited(a); - char b[30]; snprintf(b, sizeof b, "T%d = %s", t + 1, bm_engine_names[eng]); + char b[30]; snprintf(b, sizeof b, "T%d = %s", app_pos(t) + 1, bm_engine_names[eng]); app_toast(a, b); return 0; } @@ -1101,21 +932,6 @@ void app_select_pattern(bm_app *a, int idx) app_toast(a, b); } -/* SONG REC: cada ciclo que empieza queda escrito (el patrón y, si se lanzó una escena, la escena). - * El mismo patrón sin escena nueva suma una vuelta a la entrada de antes. */ -void app_song_rec_note(bm_app *a) -{ - const bm_status *st = &a->ctx.st; - uint8_t sc = st->scene_q != 0xFF ? st->scene_q : st->scene; /* la que entra en el primer compás también cuenta */ - int fresh = sc != 0xFF && sc != a->song_rec_scene; - uint8_t e = (uint8_t)((st->pattern & 15) | (fresh ? (sc + 1) << 4 : 0)); - if (fresh) a->song_rec_scene = sc; - uint8_t *last = a->song.n ? &a->song.pat[a->song.n - 1] : NULL; - if (last && !fresh && bm_song_pat(*last) == bm_song_pat(e) && a->song.rep[a->song.n - 1] < 16) a->song.rep[a->song.n - 1]++; - else if (a->song.n < BM_SONG_MAX) { a->song.pat[a->song.n] = e; a->song.rep[a->song.n] = 1; a->song.n++; } - a->song_dirty = 1; a->t_edit = a->now; -} - /* ------------------------------------------------------------ tick */ void bm_app_tick(bm_app *a, uint32_t now) { @@ -1125,8 +941,6 @@ void bm_app_tick(bm_app *a, uint32_t now) bm_gesture_poll(&a->ges, now); app_input_tick(a); app_tables(a); - /* PRESETS con HOME sostenido elige el patrón al soltar HOME (no carga ni guarda cada uno por el que pasa) */ - if (a->pat_sel >= 0 && a->layer != L_HOME && now - a->pat_sel_t > 500) { app_select_pattern(a, a->pat_sel); a->pat_sel = -1; } if (a->ov.on && (int32_t)(now - a->ov.until) > 0) a->ov.on = 0; if (a->toast_until && (int32_t)(now - a->toast_until) > 0) a->toast_until = 0; for (int t = 0; t < BM_TRACKS; t++) @@ -1138,33 +952,11 @@ void bm_app_tick(bm_app *a, uint32_t now) if (st->edits != a->edits_seen) { a->edits_seen = st->edits; app_edited(a); } if (st->clip) { st->clip = 0; a->clip_until = now + 200; } if (st->swap_fail) { st->swap_fail = 0; app_toast(a, "NO CHANGE: STOP AND SAVE"); } - if (a->layer == L_ERASE && app_playing(a) && a->erase_mask) { /* BORRAR sonando */ - int t = a->track; - if (bm_is_grid(&a->pat, t)) { - const bm_tr *tr = bm_trk_trc(&a->pat, t); - for (int l = 0; l < BM_LANES; l++) - if (a->erase_mask & (1u << l)) { - int s = bm_app_track_step(a, t, l); - if (s >= 0 && tr->st[l][s]) { app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)l, (uint8_t)s, 0); app_edited(a); } - } - } else if (a->erase_syn) { - int s = bm_app_track_step(a, t, -1), any = 0; - for (int k = 0; s >= 0 && k < BM_EVENTS; k++) if (!bm_event_empty(bm_evc(&a->pat, t, s, k))) any = 1; - if (any) { - bm_event e; bm_event_clear(&e); - for (int k = 0; k < BM_EVENTS; k++) app_push_ev(a, t, s, k, &e); - app_edited(a); - } - } - } - if (a->song_rec == 2 && app_playing(a)) { a->song_rec = 1; a->song_rec_loops = st->loops; app_song_rec_note(a); } /* SONG REC armado: empieza con PLAY */ - else if (a->song_rec == 1 && app_playing(a) && st->loops != a->song_rec_loops) { a->song_rec_loops = st->loops; app_song_rec_note(a); } if (st->smp_unsaved && !st->smp_rec && !app_playing(a) && !a->njob && a->pf.flash) { /* toma nueva: al parar */ app_job(a, JOB_SAVE_TAKE, 0); app_toast(a, "SAVING THE TAKE"); } - if (a->take_dirty && !app_playing(a) && !a->njob && a->pf.flash && now - a->t_edit > 1500 - && !(a->view == V_CH && a->page == PG_PADS)) + if (a->take_dirty && !app_playing(a) && !a->njob && a->pf.flash && now - a->t_edit > 1500) for (int i = 0; i < BM_TAKES; i++) if (a->take_dirty & (1u << i)) app_job(a, JOB_TAKE_META, i); if (a->set.autosave && !app_playing(a) && !a->njob && (a->dirty || a->pend_obj >= 0 || a->song_dirty || a->set_dirty) && now - a->t_edit > UI_AUTOSAVE_MS && a->pf.flash) { @@ -1179,12 +971,6 @@ void bm_app_tick(bm_app *a, uint32_t now) if (id < BM_TAKES && a->take[id].valid) app_job(a, JOB_TAKE_ERASE, id); } jobs_run(a); - if (a->view == V_CH && a->track == 1) { /* el dibujo de la onda que se ve */ - const bm_pad *pd = app_pad(a); - if (a->page == PG_PADS) app_wave_view(a, bm_pad_ok(pd) ? pd->src : -1, pd->start, a->cut_zoom); - else if (a->page == PG_TAKES) app_wave_view(a, bm_app_takes_sel(a), 0, 0); - else if (a->page == PG_REC) app_wave_view(a, BM_TAKE_NEW, 0, 0); - } app_leds(a); /* 25 cuadros por segundo como mucho, y un redibujo entero repartido en varios ticks (bm_gfx.h) */ if (a->pf.blit && bm_screen_due(&a->scr, now)) bm_screen_render(&a->scr, bm_app_draw, a, a->pf.blit, a->pf.user); diff --git a/core/bm_app.h b/core/bm_app.h index d1b014b..06cf67a 100644 --- a/core/bm_app.h +++ b/core/bm_app.h @@ -22,40 +22,50 @@ typedef struct { void *user; } bm_platform; -/* Pantallas (0.9). La consola (BX-1) es HOME: MIX y FX, y su GLO. Los canales usan V_CH con su - * página (pestaña). */ +/* Pantallas (1.0, etapa 1). HOME es el mezclador de 6 canales; GLO su menú global (SELECT MACHINE); + * V_CH es el secuenciador de la batería (el único canal con pantalla propia). PLAY/REC no es una + * pantalla: es HOME con el teclado tocando el canal del cursor. */ typedef enum { V_BOOT, - V_HOME, /* consola: MIX (HOME siempre vuelve aquí) */ - V_FXG, /* consola: FX = CHANNEL > DELAY > REVERB > MASTER */ - V_GLO, /* consola: GLO = TEMPO > MACHINES > SCALE > SONG */ - V_CH, /* un canal: a->page */ - V_SYSTEM, V_TIME, V_SAVE, V_COPYCH, /* HOME 2 s, SEQ 2 s, SAVE, HOME + EDIT */ + V_HOME, /* el mezclador (y PLAY/REC, si a->sloop) */ + V_GLO, /* menú global del mezclador: SELECT MACHINE */ + V_CH, /* el secuenciador de la batería */ + V_SYSTEM, V_SAVE, /* HOME 2 s, SAVE */ + V_MACH, /* la máquina de un canal de notas (2026-10-21: la BX-7) */ V_COUNT } bm_view; -enum { FXP_CHANNEL, FXP_DELAY, FXP_REVERB, FXP_MASTER, FXP_COUNT }; /* páginas del FX de la consola */ -enum { GP_TEMPO, GP_MACH, GP_SCALE, GP_SONG, GP_COUNT }; /* páginas del GLO de la consola */ +/* Páginas de la BX-7 (V_MACH), como los botones del FM-1 de fábrica: el mismo botón otra vez vuelve a + * MAIN; HOME sale a la consola. */ +enum { BXP_MAIN, BXP_SEQ, BXP_FX, BXP_ENV, BXP_LFO, BXP_EDIT, BXP_GLO, BXP_ARP, BXP_SCL, BXP_N }; /* SCL: el BB-303 (ACCENT / SLIDE por paso) */ +enum { BXE_OP1, BXE_OP6 = 5, BXE_PIT, BXE_GLO, BXE_N }; /* qué edita EDIT: un operador, el pitch EG o lo global */ +typedef struct { + uint8_t page; /* BXP_* */ + uint8_t sub[BXP_N]; /* la página de cada botón (SELECT) */ + uint8_t edit; /* BXE_* */ + uint8_t esub[BXE_N]; /* la página de cada cosa de EDIT */ + uint8_t fxpos, grab; /* FX: la casilla elegida y si SCL la tomó para moverla */ + uint8_t armed; /* REC parado: la primera nota arranca y graba */ + uint8_t step; /* SEQ, paso a paso (REC parado): el paso que se escribe */ + uint8_t chord, nslot; /* paso a paso: hay teclas del paso apretadas y cuántas notas lleva */ + uint8_t blk; /* BB-303 SCL: la página de 16 pasos */ + uint8_t vman, vpage; /* piano roll: K3 eligió la página que se ve (si no, sigue al cabezal / cursor) */ + int8_t vy; /* piano roll: K4 corre las alturas que se ven (semitonos) */ + uint8_t szoom, sbars; /* Slicer, TRIM: el zoom de la onda (0..3) y los compases que graba SAMPLE (1, 2 o 4) */ +} bm_bx7ui; -/* Páginas de un canal. Las pestañas dependen del tipo de canal (bm_app_tabs). PG_MORE es el GLO de - * la máquina (GLO dentro de ella): no es una pestaña. */ #define BM_MACH_MS 2000u /* cambio de máquina: la elegida se carga si se queda 2 s */ -typedef enum { - PG_SEQ, PG_SOUND, PG_INST, PG_MIX, PG_MORE, PG_BREAK, PG_TAKES, PG_ARP, PG_LOOP, PG_MIDI, - PG_SCL, PG_CHORDS, PG_REC, PG_PADS, PG_COUNT -} bm_page; - -/* Capas en vivo (mantener un botón). */ -typedef enum { - L_NONE, L_HOME, L_LEN, L_ERASE, L_ACC, L_REP, L_PUNCH, L_CHORDS, L_ARP, L_ROLL, L_COPY, L_TONE, L_LANEMUTE, L_FILL, - L_COUNT -} bm_layer; +/* SYSTEM (2026-10-21, más simple): las filas que se ven, de las de siempre (sys_val / system_change): + * reloj MIDI, sync, luces en reposo, idioma, versión. Las demás quedan como estaban. */ +#define BM_SYS_VIS 5 +static const uint8_t BM_SYS_ROWS[BM_SYS_VIS] = {0, 1, 5, 9, 10}; +#define BM_SAVE_ROWS 3 /* SAVE: guardar (con las escenas), guardar como, borrar el patrón */ +#define BM_GLO_PAGES 3 +typedef enum { PG_SEQ, PG_COUNT } bm_page; -/* Preguntas (0.9): se aceptan con el tiempo. Sostener 2 s el mismo botón o tecla que preguntó - * (o volver a apretarlo y sostenerlo); soltarlo antes, u otro control, es no. */ -enum { ASK_NONE, ASK_COPY_PAT, ASK_COPY_TRK, ASK_TAKE_DEL, ASK_INIT, ASK_KIT, ASK_DISCARD, ASK_COPY_CH }; -#define ASK_ENC 0xFEu /* preguntó una perilla: se acepta sola a los 2 s, otro control es no */ -#define ASK_KEY 0x80u /* ask_ctl = ASK_KEY | tecla; si no, el botón */ +/* Capas del secuenciador de la batería: un clic en su botón la abre y otro la cierra (o HOME); sostenerlo es lo + * mismo que un clic. */ +typedef enum { L_NONE, L_ACC, L_REP, L_HIT, L_INST, L_MUTE, L_LEN, L_COUNT } bm_layer; /* LFO, la negra 11, ENV, EDIT, SCL y (Slicer) SEQ otra vez: LENGTH AND SPEED */ typedef struct { uint8_t ver, clock, sync_mode, sync_ppqn, sync_lat, drive, led_dim, autosave, last_pat; @@ -63,9 +73,10 @@ typedef struct { uint8_t lang; /* 0 = inglés, 1 = el paquete de idioma de la flash */ uint8_t fast_lcd; /* 1 = SPI a 30 MHz con DMA (a prueba; el modo seguro lo apaga) */ uint8_t dual_core; /* 1 = el audio en los dos núcleos (a prueba; el modo seguro lo apaga) */ - uint8_t note_view; /* bit t = el canal t ve su SEQ como PIANO ROLL (GLO de la máquina > VIEW) */ + uint8_t factory; /* los patrones de fábrica que se escribieron (BM_FACTORY_VER); otro número los vuelve a escribir */ uint8_t rsv[18]; } bm_settings; +#define BM_FACTORY_VER 1 /* 1 (2026-10-24): DA FUNK, BLADE, ENJOY THE SILENCE */ typedef struct { uint8_t on, enc, pct, ghost; @@ -84,7 +95,7 @@ typedef struct { char label[6]; uint8_t led, live; uint16_t color; } bm_keyfn; #define BM_JOBS 10 enum { JOB_NONE, JOB_FLUSH_PEND, JOB_SAVE_CUR, JOB_SAVE_AS, JOB_SAVE_SONG, JOB_SAVE_GLOB, JOB_LOAD, - JOB_SAVE_TAKE, JOB_TAKE_META, JOB_TAKE_ERASE, JOB_COPY_PAT, JOB_COPY_TRK }; + JOB_SAVE_TAKE, JOB_TAKE_META, JOB_TAKE_ERASE }; typedef union { bm_tr tr; bm_notes nt; } bm_trackbuf; @@ -113,54 +124,32 @@ typedef struct bm_app { bm_take take[BM_TAKES]; bm_smp_src smp_send[1]; /* copia estable que lee el audio: la toma recién guardada */ bm_smp_src take_send[BM_TAKES]; /* las tomas, para los pads (CMD_SMP_TAKES) */ - uint8_t wave_cut[2][232]; /* PADS / TAKES: la ventana que se ve (pico y RMS) */ - uint8_t wave_ov[232]; /* la toma entera, para el mapa de arriba (picos) */ - uint8_t take_dirty, takes_row, cut_snap, cut_zoom; + uint8_t take_dirty, takes_row; volatile uint8_t ext_take_del; /* toma a borrar pedida desde afuera (id + 1), se borra en STOP */ int8_t pad_key; /* tecla que sostiene un pad (o una escucha) */ - const int8_t *cut_wd; /* lo que ya está dibujado en wave_cut / wave_ov */ - uint32_t cut_wlen, cut_v0, cut_v1, cut_pk; uint8_t slice_sens; /* sensibilidad de los cortes en los golpes (0..127) */ - bm_pad pad_clip; /* COPY / PASTE de un pad (con su nivel y su grupo) */ - uint8_t pad_clip_on, pad_clip_level, pad_clip_choke; + uint8_t len_page; /* Slicer, LENGTH AND SPEED: los largos que dan las blancas (0: 1-16 ... 3: 49-64) */ /* portapapeles, undo y redo (un canal) */ - bm_trackbuf clip; - bm_track clip_trk; - bm_event clip_step[BM_EVENTS]; - uint8_t clip_type, clip_track; /* 0 nada, 1 paso, 2 canal */ - bm_trackbuf undo, redo; - int8_t undo_track, redo_track; + bm_trackbuf scratch; /* bolsa de trabajo: un canal entero a medias */ /* UI */ bm_gesture ges; bm_screen scr; - uint8_t view, page, layer, track, step_page; + uint8_t view, layer, track, step_page; uint8_t mach_sel; /* cambio de máquina: la elegida (ENG_*) */ uint8_t mach_arm; /* 1 = la cuenta de 2 s corre (ALGORITHM la movió a otra) */ uint8_t mach_trk; /* el canal que cambia de máquina (la tarjeta o GLO > MACHINES) */ uint32_t mach_t0; /* cuándo se llegó a la elegida */ - uint8_t ch_page[BM_TRACKS]; /* última página de cada canal */ - uint8_t glo_back; /* GLO de la máquina: la página a la que vuelve GLO otra vez */ - uint8_t glo_page; /* GLO de la consola: GP_* */ uint8_t sel_lane[BM_TRACKS]; - uint8_t ed_page[BM_TRACKS]; /* página del editor de sonido (ANALOG) o del instrumento (batería) */ int8_t oct; - uint8_t rec, rec_before, rec_hold, fill; + uint8_t rec, fill; uint8_t sloop; /* SLOOP-REC (REC en la consola): las teclas tocan el canal del cursor */ - uint8_t card, card_turn; /* tarjeta del canal (blanca 11-16 sostenida en HOME): canal + 1 · se giró una perilla */ - uint8_t cue; /* CUE (negra 11 en HOME): 1 sostenida, 2 fija */ - uint8_t home_go; /* HOME + blanca 11-16: el canal + 1 al que se entra al soltar HOME */ - uint8_t scn_chain; /* escenas: una sostenida ya armó una cadena (soltarla no lanza) */ - uint8_t song_rec_scene; /* SONG REC: la escena que ya quedó escrita */ uint64_t rec_steps; /* REC de esta pasada: los pasos donde se grabó (las notas se ven en rojo) */ uint16_t rec_lanes; /* y los instrumentos (rejillas) */ - uint16_t home_mod; /* botones que se apretaron con HOME sostenido */ - uint8_t home_used; uint8_t box_on, box_track, box_hold; uint8_t box_mode, box_lane; /* recuadro de ALGORITHM en INSTR: BOX_LANE (instrumento) */ uint8_t layer_latch; /* la capa quedó abierta con un toque (FILL, ROLL, LFO): se cierra con la misma tecla o HOME */ - uint8_t nav_btn, nav_track, nav_page, nav_sub; /* botón + 1 que abrió la página del canal (0 = ninguno), para su luz */ uint32_t box_until; int8_t held_step, held_white; uint8_t held_edit, held_had_event, held_long, held_notes; @@ -169,49 +158,24 @@ typedef struct bm_app { uint8_t key_notes[BM_KEYS][4], key_nn[BM_KEYS], key_trk[BM_KEYS]; int8_t key_rec_step[BM_KEYS], key_rec_slot[BM_KEYS]; uint32_t key_rec_tick[BM_KEYS]; + uint32_t key_rec_bt[BM_KEYS]; /* btick al grabarla: lo que se sostuvo (rtick vuelve a 0 con el maestro) */ + uint8_t rec_vel; /* la fuerza de la última nota tocada: 127 se graba con ACCENT */ + uint8_t oct_used; /* el OCT sostenido ya se usó (transposición o los dos): al soltarlo no cambia la octava */ + uint32_t rec_clr_bt[BM_STEPS]; /* PLAY/REC: btick en que se reescribió cada paso (en la misma vuelta, se suma: un acorde) */ + uint64_t rec_clr_on; /* los pasos con rec_clr_bt válido */ + int8_t rec_clr_trk; /* de qué canal son */ uint32_t key_t0[BM_KEYS]; uint8_t key_role[BM_KEYS]; /* qué hizo la tecla al bajar (para soltarla bien) */ - uint16_t home_done; - uint8_t eng_pending, rec_now, solo_mask; - uint8_t hold_play; /* sampler: un paso sostenido está haciendo sonar el loop */ - uint8_t rec_free; /* canal + 1 que graba en libre: el largo se cierra al parar REC */ - uint32_t rec_free_t0; /* btick del inicio (0xFFFFFFFF = empieza con PLAY) */ - uint8_t chord_mod; - int8_t last_pad; - uint8_t prev_chord[4], prev_chord_n; - char chord_name[10], chord_roman[10]; uint8_t last_note[BM_TRACKS]; - int8_t pat_sel; - uint32_t pat_sel_t; uint16_t pat_held; /* blancas sostenidas en HOME: cadena de patrones */ uint8_t pchain[8], pchain_n; int8_t solo_key, solo_track; uint8_t solo_on, solo_saved; - uint16_t erase_mask; /* capa BORRAR sonando: instrumentos que se borran al pasar */ - uint8_t erase_syn; /* ROLL (ARP en T1 y T2): en vivo, no se guarda */ - uint8_t roll_rate; /* índice en bm_roll_ticks (0..BM_ROLL_RATES-1) */ - uint16_t roll_mask; /* blancas sostenidas que hacen roll */ - uint8_t roll_ramp; /* 0 plano, 1 CRESC, 2 DECRESC */ - uint8_t roll_len; /* largo de la rampa: índice en bm_roll_len_ticks */ - uint8_t roll_swing; /* 50..75 % */ - uint8_t roll_tail; /* la cola al soltar: índice en bm_roll_tail_ticks */ uint8_t brk_live; - uint8_t len_page; /* capa LARGO: OCT +/- = largos 17-64 */ - uint8_t launch_held, chain[8], chain_n; - uint8_t song_rec; - uint32_t song_rec_loops; - uint32_t tap_t[4]; - uint8_t tap_n; - uint8_t time_row, time_lane; - uint8_t menu_row, glo_row, more_row, save_row, save_target, song_cur, clear_armed; - uint8_t copy_src, copy_dst, copy_pat_dst, copy_trk; - uint8_t ask, ask_arg, ask_arg2; - uint8_t ask_ctl, ask_live; /* el control que preguntó (botón, ASK_KEY | tecla o ASK_ENC) y si está apretado */ - uint8_t cur_ctl; /* el control que se está atendiendo (para app_ask) */ - uint16_t ask_eat; /* botones cuyo gesto ya usó la pregunta: se ignoran hasta soltarlos */ - uint32_t ask_t0; /* desde cuándo se sostiene para el sí */ - char ask_text[2][30]; + uint8_t chain[8], chain_n; + uint8_t menu_row, save_row, save_target, clear_armed; + uint8_t glo_page; /* GLO de HOME: 0 MACHINES, 1 TEMPO (y escala), 2 MASTER FX (PRESETS la cambia) */ uint32_t clear_t; bm_overlay ov; char toast[30]; @@ -223,18 +187,11 @@ typedef struct bm_app { uint8_t last_trig[BM_TRACKS]; uint32_t trig_until[BM_TRACKS]; uint32_t lane_flash[BM_TRACKS][BM_LANES]; - int8_t punch_key; uint32_t clip_until; uint16_t edits_seen; uint8_t cpu; /* carga del audio en % (la cabecera) */ - uint8_t rec_gate; /* REC de notas: el largo con que se graban (10..100 %, 100 = TIE) */ - int8_t rec_micro; /* REC de notas: corrimiento en ticks (-12..12) */ - uint8_t mix_page, fx_page; /* FX otra vez: DUCK · en la página FX de HOME: DELAY > REVERB > MASTER */ int8_t move; /* MOVE de HOME (PRESETS): -63..63, en vivo, no se guarda */ - int8_t tie_from; /* paso sostenido para una nota larga (blanca + otra blanca) */ - int8_t rec_step; /* REC en un canal de notas: el paso que editan ALGORITHM (gate) y PRESETS (micro) */ uint32_t wt_sig[2]; /* BITTAL: qué tablas están armadas en RAM */ - uint8_t knob_rec; /* REC: la nota sostenida graba lo que se mueve en K1-K4 */ /* perillas: aceleración por el tiempo entre giros, detents crudos y la perilla que gira */ uint32_t enc_t[ENC_COUNT]; /* cuándo giró cada perilla por última vez */ int8_t enc_raw; /* detents de este giro, sin acelerar (0 fuera de un giro) */ @@ -244,6 +201,7 @@ typedef struct bm_app { uint8_t stick_id; uint8_t snap_buf[BM_SNAP_MAX]; /* un sonido que llega de afuera (bm_app_sound_load) */ uint16_t snap_len; + bm_bx7ui bx; /* la BX-7 (core/bm_bx7.c) */ } bm_app; void bm_app_init(bm_app *a, const bm_platform *pf, uint32_t now); @@ -280,9 +238,6 @@ void bm_app_src_name(const bm_app *a, uint8_t src, char *buf, int cap); bool bm_app_src_info(const bm_app *a, uint8_t src, bm_smp_src *out); /* para el dibujo */ -int bm_app_layer(const bm_app *a); -int bm_app_tabs(const bm_app *a, int t, uint8_t out[8]); /* pestañas de un canal */ -const char *bm_page_name(int page); void bm_app_legend(const bm_app *a, bm_legend out[4]); /* Qué hacen ahora las tres perillas grandes (SELECT, ALGORITHM, PRESETS): un nombre corto, o "-" * si no hacen nada aquí. Sale del mismo reparto que bm_app_encoder. */ @@ -290,15 +245,7 @@ void bm_app_bigknobs(const bm_app *a, const char **sel, const char **alg, const void bm_app_keymap(const bm_app *a, bm_keyfn out[BM_KEYS], char *title, int cap, uint16_t *color, const char **h1, const char **h2); /* qué hace cada tecla ahora (nombre corto) y su luz: lo mismo que se ve en la tira de teclas */ void bm_app_keys(const bm_app *a, bm_keyfn out[BM_KEYS]); -const char *bm_pad_mode_name(int mode); /* ONESHOT, KEY, THRU, LOOP */ void bm_app_draw(bm_gfx *g, void *user); -void bm_fmt_macro(const bm_app *a, int track, int i, int v, char *buf, int cap); -const char *bm_macro_name(const bm_app *a, int track, int i); -/* editor de sonido por páginas (ANALOG en SONIDO, el instrumento de batería en INSTR) */ -const bm_ppage *bm_app_ed_pages(const bm_app *a, int t, int *n); -int bm_app_ed_on(const bm_app *a); -int bm_app_ed_value(const bm_app *a, int t, const bm_pdef *d); -const char *bm_app_ed_name(const bm_app *a, int t, const bm_pdef *d); const char *bm_track_name(const bm_app *a, int t); const char *bm_kit_name(int kit); /* KO-808, KO-909 (ROM) o SINTE */ const char *bm_sound_name(const bm_app *a, int t); /* kit, timbre o banco de ondas del canal */ @@ -307,23 +254,9 @@ uint16_t bm_track_color(int t); uint16_t bm_knob_color(int i); const char *bm_lane_name(const bm_app *a, int t, int lane); int bm_app_track_step(const bm_app *a, int t, int lane); /* paso que suena (lane < 0: canal de notas) */ -int bm_app_chord_track(const bm_app *a); int bm_app_enter_ms(const bm_app *a); /* -1 = OFF */ uint32_t bm_app_rec_room(const bm_app *a); /* muestras que caben en la próxima toma */ -uint8_t bm_app_takes_sel(const bm_app *a); /* fuente marcada en TOMAS */ -int bm_app_more_count(const bm_app *a); /* filas del GLO de la máquina */ -void bm_app_more_row(const bm_app *a, int i, const char **name, char *val, int cap); -int bm_app_glo_count(const bm_app *a); /* filas de la página del GLO de la consola */ -void bm_app_glo_row(const bm_app *a, int i, const char **name, char *val, int cap); -/* una tecla sostenida que hace algo a los 2 s (escena: guardarla): 0..255 hacia los 2 s, o -1 */ +/* una escena guardada sostenida: el anillo hacia los 2 s en que se borra (0..255), o -1 */ int bm_app_key_ring(const bm_app *a, char *label, int cap); -/* la pregunta: cuánto falta para el sí (0..255) y cómo se dice el control que preguntó */ -int bm_app_ask_progress(const bm_app *a); -void bm_app_ask_hint(const bm_app *a, char *buf, int cap); -static inline bool bm_app_roll_view(const bm_app *a, int t) { return (a->set.note_view >> t) & 1; } -#define BM_ROLL_RATES 6 /* 1/8 1/16 1/32 1/8T 1/16T 1/32T */ -extern const char *const bm_roll_names[BM_ROLL_RATES]; -extern const char *const bm_roll_len_names[4]; -extern const char *const bm_roll_tail_names[4]; #endif diff --git a/core/bm_app_int.h b/core/bm_app_int.h index db1ba3d..ceb5296 100644 --- a/core/bm_app_int.h +++ b/core/bm_app_int.h @@ -23,56 +23,88 @@ void app_edited(bm_app *a); /* avisos */ void app_toast(bm_app *a, const char *msg); void app_overlay(bm_app *a, int enc, const char *title, const char *val, const char *unit, int pct, int ghost, uint16_t col); -void app_ask(bm_app *a, int kind, int arg, int arg2, const char *l1, const char *l2); + +/* Orden de los canales en pantalla (1.0): batería, cuatro que eligen máquina y el Slicer al final. + * El canal de pantalla n (0-5) es la pista interna BM_ORDER[n]. */ +static const uint8_t BM_ORDER[BM_TRACKS] = {0, 2, 3, 5, 4, 1}; +static inline int app_pos(int t) { for (int i = 0; i < BM_TRACKS; i++) if (BM_ORDER[i] == t) return i; return 0; } +static inline int app_fixed(int t) { return t == 0 || t == 1; } /* la batería y el Slicer no eligen */ /* estado */ static inline int app_playing(const bm_app *a) { return a->ctx.st.playing; } static inline int app_kind(const bm_app *a, int t) { return bm_kind(&a->pat, t); } -static inline int app_midi(const bm_app *a, int t) { (void)a; (void)t; return 0; } /* 0.6: MIDI es MIDI OUT por canal */ enum { BOX_LANE = 2 }; static inline int app_engine(const bm_app *a, int t) { return a->pat.trk[t].engine; } int app_scale(const bm_app *a, int t, int *root); /* escala del canal (o la del proyecto) */ void app_set_view(bm_app *a, int v); void app_enter(bm_app *a, int t, int page); /* entra a un canal y a una página */ -void app_select_track(bm_app *a, int t, int keep_page); -int app_page_ok(const bm_app *a, int t, int page); /* guardado y tomas */ void app_job(bm_app *a, int type, int arg); void app_save_jobs(bm_app *a, int with_cur); void app_send_takes(bm_app *a); /* las tomas guardadas al audio (para los pads) */ bool app_take_info(const bm_app *a, int src, bm_smp_src *m); /* toma 0..7 o BM_TAKE_NEW */ -void app_wave_view(bm_app *a, int src, uint32_t at, int zoom); /* dibujo de una toma (si cambió) */ /* Kit desde una toma (how: 0 en los golpes, 8 o 16 partes iguales): los pads 1..n son sus cortes. - * Si la rejilla de T2 está vacía, también escribe la secuencia que suena como la toma. Devuelve n. */ + * También escribe la secuencia que suena como la toma (la de antes se borra). Devuelve n. */ int app_kit_from_take(bm_app *a, int src, int how); void app_pad_take(bm_app *a, int pad, int src); /* la toma entera en un pad */ -static inline bm_pad *app_pad(bm_app *a) { return &a->pat.pad[a->sel_lane[1] & 15]; } /* el pad elegido */ static inline bool app_kit_empty(const bm_app *a) { for (int i = 0; i < BM_LANES; i++) if (bm_pad_ok(&a->pat.pad[i])) return false; return true; } void app_select_pattern(bm_app *a, int idx); -void app_undo_snapshot(bm_app *a, int t); -void app_do_undo(bm_app *a); -void app_do_redo(bm_app *a); -void app_clear_track(bm_app *a, int t); -void app_copy_track(bm_app *a, int t); -void app_paste_track(bm_app *a, int t); void *app_track_data(bm_app *a, int t); size_t app_track_size(int t); void app_init_sound(bm_app *a, int t); int app_set_machine(bm_app *a, int t, int eng); /* T3-T6: otra máquina (las notas quedan); 0 = se cambió */ int app_machine_track(const bm_app *a, int engine); /* el canal T3-T6 con esa máquina, o -1 */ -void app_song_rec_note(bm_app *a); /* SONG REC: escribe el ciclo que empieza */ /* entrada (bm_input.c) */ void app_sloop(bm_app *a, int on); /* SLOOP-REC en la consola: las teclas tocan el canal del cursor y graban */ void app_on_gesture(void *u, int id, bm_gkind k); void app_input_tick(bm_app *a); void app_leds(bm_app *a); +/* lo de la entrada que comparte la BX-7 */ +int app_lst(const bm_app *a, int d); /* un giro como pasos de lista (+-1 por detent) */ +void app_play_notes(bm_app *a, int k, int t, const uint8_t *notes, int n, int vel); /* toca (y con REC graba) */ +void app_rec_at(bm_app *a, int k, int t, const uint8_t *notes, int n, uint32_t rt); /* graba en el tick rt */ +void app_note_keys(const bm_app *a, bm_keyfn *K, int t); /* el teclado cromático de un canal de notas */ +void app_rec_set(bm_app *a, int on); +void app_enc_source(bm_app *a, int t, int d); /* PRESETS: el sonido del canal */ +void app_layer_legend(const bm_app *a, bm_legend *L, int k, const char *name, const char *val, int pct); +/* lo de la entrada que comparte el Slicer (core/bm_slicer.c) */ +void app_pad_down(bm_app *a, int k, int pad); /* una tecla toca (y con REC sonando graba) un pad */ +void app_slicer_grid(bm_app *a, int layer); /* a la rejilla del Slicer (V_CH), con esa capa abierta (o ninguna) */ +void app_kit_len(bm_app *a, int t, int k, int d); /* el largo de todos los instrumentos o pads del canal (1-64 pasos) */ + +/* la máquina de un canal de notas por dentro (V_MACH, bm_mach.c): la reparte según la máquina */ +bool mach_has(int engine); /* tiene pantalla propia (las de notas) */ +int mach_view_page(const bm_app *a); /* la página de 16 pasos que muestra el piano roll */ +int app_mach_shown(const bm_app *a); /* GLO de la máquina: la que se ve en MACHINE (la elegida o la que suena) */ +void app_mach_pick(bm_app *a, int d); /* GLO de la máquina, MACHINE: las disponibles; quedarse 2 s la carga */ +int mach_len(const bm_app *a); /* el largo del canal del cursor, en pasos */ +bool mach_step_mode(const bm_app *a); /* REC parado en el SEQ de una máquina: paso a paso */ +void mach_key_up(bm_app *a, int k); /* una tecla soltada (paso a paso: el cursor avanza) */ +void mach_cursor(bm_app *a, int d); /* SEQ: SELECT mueve el cursor de paso */ +void app_step_rec(bm_app *a); /* REC parado en el SEQ: grabar paso a paso */ +int mach_page_of(int engine, int btn); /* la página BXP_* de ese botón en esa máquina, o -1 */ +void mach_enter(bm_app *a, int t, int page); /* entrar a la máquina del canal t en la página BXP_* */ +bool mach_button(bm_app *a, int id, bm_gkind k); /* true = lo usó */ +void mach_key(bm_app *a, int k, int w, int b); +void mach_encoder(bm_app *a, int id, int d); +void mach_legend_view(const bm_app *a, bm_legend L[4]); +void mach_bigknobs(const bm_app *a, const char **sel, const char **alg, const char **pre); +void mach_keys(const bm_app *a, bm_keyfn K[BM_KEYS]); +uint8_t mach_btn_led(const bm_app *a, int i); +const char *mach_title(const bm_app *a, char *buf, int cap); /* "LFO 1/2", "EDIT OP3 2/6"... */ +/* la BX-7 (bm_bx7.c) */ +bool bx7_button(bm_app *a, int id, bm_gkind k); +void bx7_key(bm_app *a, int k, int w, int b); +void bx7_encoder(bm_app *a, int id, int d); +void bx7_legend(const bm_app *a, bm_legend L[4]); +void bx7_bigknobs(const bm_app *a, const char **sel, const char **alg, const char **pre); +void bx7_keys(const bm_app *a, bm_keyfn K[BM_KEYS]); +uint8_t bx7_btn_led(const bm_app *a, int i); +int bx7_page_of(int btn); +const char *bx7_title(const bm_app *a, char *buf, int cap); -extern const uint8_t bm_master_steps_tab[6]; -extern const uint8_t bm_roll_ticks[BM_ROLL_RATES]; -extern const uint16_t bm_roll_len_ticks[4]; -extern const uint8_t bm_roll_tail_ticks[4]; #endif diff --git a/core/bm_audio.c b/core/bm_audio.c index f964c10..903586d 100644 --- a/core/bm_audio.c +++ b/core/bm_audio.c @@ -180,12 +180,16 @@ static void apply(bm_ctx *c, const bm_cmd *k) case CMD_SET_PRM: if (k->a < BM_TRACKS && k->b < BM_PRM) c->pat->prm[k->a][k->b] = k->c; break; + case CMD_FMV: + if (k->a < BM_FMV_BYTES) { c->pat->fmv[k->a] = (uint8_t)bm_clampi(k->b, 0, bm_fmv_max(k->a)); c->fmv_gen++; } + break; case CMD_PRESET: if (k->a >= BM_TRACKS) break; if (bm_is_tr(c->pat, k->a)) bm_kit_apply(bm_trk_tr(c->pat, k->a), k->b); else if (k->b == 0xFF) { bm_prm_defaults(c->pat, k->a); break; } /* INIT SOUND: el preset queda */ else bm_preset_apply(c->pat, k->a, k->b); c->pat->trk[k->a].source = k->b; + c->fmv_gen++; break; case CMD_LANE_MUTE: if (k->a < BM_TRACKS && bm_is_grid(c->pat, k->a)) bm_trk_tr(c->pat, k->a)->mute = (uint16_t)k->u.i; @@ -337,7 +341,7 @@ static void apply(bm_ctx *c, const bm_cmd *k) c->roll_cfg.ramp = k->a; c->roll_cfg.swing = k->b; c->roll_cfg.tail = k->c; c->roll_cfg.ramp_len = (uint16_t)k->u.i; break; - case CMD_REC: c->rec = k->a; break; + case CMD_REC: c->rec = k->a; c->rec_trk = k->b; break; case CMD_LOOP: bm_loop_cmd(c, k->a, k->b, k->c); break; case CMD_STRUM: { uint8_t n[4] = {(uint8_t)k->u.i, (uint8_t)(k->u.i >> 8), (uint8_t)(k->u.i >> 16), (uint8_t)(k->u.i >> 24)}; diff --git a/core/bm_audio.h b/core/bm_audio.h index e5d860e..207d602 100644 --- a/core/bm_audio.h +++ b/core/bm_audio.h @@ -63,7 +63,7 @@ typedef enum { CMD_MIDI, /* a=byte MIDI entrante */ CMD_ARP, /* a=pista b=0/1 (capa ARP) */ CMD_ROLL, /* a=canal de rejilla b=línea c=0/1 (0: sigue la cola) i=ticks entre golpes (0 = los mismos) */ - CMD_REC, /* a=0/1: grabación en vivo (para el roll) */ + CMD_REC, /* a=0/1: grabación en vivo (para el roll y el arpegiador) b=el canal que graba */ CMD_LOOP, /* a=pista synth b=acción (1 REC, 2 borrar, 3 on/off, 4 compases=c) */ CMD_STRUM, /* a=pista b=n c=vel i=notas empaquetadas (4 x 8 bit) */ CMD_ALL_OFF, @@ -74,7 +74,8 @@ typedef enum { CMD_PAD_KEY, /* tecla de un pad: a=1 suena el pad b (vel c) mientras se sostiene · a=0 soltar */ CMD_ROLL_CFG, /* ROLL: a=rampa (0 no, 1 CRESC, 2 DECRESC) b=swing 50..75 c=cola en ticks i=largo de la rampa */ CMD_CLONE, /* a=canal de origen b=destino (T3-T6): su máquina y su sonido (HOME + EDIT) */ - CMD_MUTE_CUE /* a=bits de los canales cuyo mute cambia en el próximo compás (CUE de HOME; parado: ya) */ + CMD_MUTE_CUE, /* a=bits de los canales cuyo mute cambia en el próximo compás (CUE de HOME; parado: ya) */ + CMD_FMV /* la voz de la BX-7: a=byte (0..155) b=valor */ } bm_cmd_type; typedef struct { @@ -196,14 +197,21 @@ struct bm_engine { uint8_t track; uint8_t lock_next[4]; uint8_t legato_next; + uint8_t live_next; /* la próxima nota viene del teclado (no del secuenciador) */ + uint8_t held[8], nheld; /* máquinas de una voz: las teclas sostenidas, para volver a la anterior al soltar */ + uint8_t lfo_restart; /* BUNO-6: se tocó después de soltar todo, el retardo del LFO vuelve a empezar */ + float lfo_s, lfo_g; /* BB-303: el LFO suavizado (0..1) y el nivel del bloque anterior */ uint8_t machine; /* la máquina con que se armó (ENG_*): si cambia, se reinicia */ }; extern const bm_engine_vt bm_eng_drum, bm_eng_sampler, bm_eng_wave, bm_eng_acid, bm_eng_fm, bm_eng_midi_out; /* FM: lo que hacen las macros y los ajustes (prm del canal) sobre el patch (para la pantalla) */ -int bm_fm_alg_of(const bm_track *t, const uint8_t *prm); /* algoritmo 1..32 */ -int bm_fm_fb_of(const bm_track *t, int m2); /* realimentación 0..7 */ -void bm_fm_patch_of(const bm_track *t, const uint8_t *prm, const bm_voice *v, uint8_t *p); /* v NULL = las macros del canal */ +int bm_fm_alg_of(const bm_pattern *pat); /* algoritmo de la BX-7: 1..32 */ +void bm_bx7_fx(struct bm_ctx *c, int t, int32_t *buf, uint32_t n); /* core/bm_bx7fx.c: la cadena de efectos de la BX-7 */ +void bm_bx7_fx_reset(void); +void bm_acid_fx(struct bm_ctx *c, int t, int32_t *buf, uint32_t n); /* el OVERDRIVE del BB-303 (si está prendido) */ +void bm_px_fx(struct bm_ctx *c, int t, int32_t *buf, uint32_t n); /* la DISTORTION de B-MINI, BUNO-6 y BITTAL (si está prendida) */ +void bm_fm_patch_of(const bm_pattern *pat, int track, const bm_voice *v, uint8_t *p); /* v NULL = las macros del canal */ extern const char *const bm_acid_names[2]; /* sierra o cuadrada */ const bm_engine_vt *bm_engine_vt_for(int engine); @@ -211,9 +219,13 @@ const bm_engine_vt *bm_engine_vt_for(int engine); typedef struct { uint8_t on; uint8_t held[8], n; + uint8_t ord[8]; /* las mismas notas, en el orden en que se tocaron (modo ORDER) */ + uint8_t down; /* teclas que siguen sostenidas (LATCH: la próxima después de soltar todas empieza otra) */ uint8_t idx, cur, playing; uint16_t gate_left; } bm_arp; +/* modos del arpegiador (bm_track.arp_mode), los del FM-1 de fábrica */ +enum { ARP_OFF, ARP_UP, ARP_DOWN, ARP_INCL, ARP_EXCL, ARP_RANDOM, ARP_ORDER, ARP_REPEAT, ARP_MODES }; typedef struct { uint8_t lane, vel; uint16_t ticks; } bm_retrig; @@ -247,6 +259,8 @@ typedef struct bm_ctx { /* reloj */ uint32_t spt_q16, acc_q16, sample_clock; uint8_t playing, fill, ext_clock, song_on, rec; + uint8_t rec_trk; /* el canal que graba (CMD_REC b): el arpegiador graba lo que toca ahí */ + uint32_t live_held[BM_TRACKS][4]; /* las notas que se están tocando en vivo (bit por nota): al grabar no se repiten desde el patrón */ uint32_t rtick, btick; int8_t queued; int8_t scene_q; @@ -330,6 +344,7 @@ typedef struct bm_ctx { * BM_PAR_ELIGE se elige el reparto de los 64 posibles que deja más parejos los dos núcleos. * Los costos suben de golpe y bajan despacio: los picos (fills, acordes nuevos) cuentan. */ uint32_t (*now)(void); + uint8_t fmv_gen; /* sube con cada cambio de la voz de la BX-7 (CMD_FMV, preset) */ uint8_t par_auto; uint16_t par_n; uint32_t cost[BM_TRACKS], cost_over; /* ticks de now por render */ diff --git a/core/bm_b303.c b/core/bm_b303.c new file mode 100644 index 0000000..ead7d05 --- /dev/null +++ b/core/bm_b303.c @@ -0,0 +1,223 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later + * Copyright (C) 2026 Erbubar23 */ +/* Bubba Machine — el BB-303 por dentro: la TB-303 de Roland en el FM-1 (2026-10-22). + * + * El panel de la 303 en las perillas, en su orden: + * K1-K4 CUTOFF, RESO, ENV MOD, DECAY (la fila del medio del panel) + * ALGORITHM ACCENT (la perilla de la derecha del panel) · OCT sostenido + ALGORITHM: TUNING + * EDIT otra vez: la página 2: TUNING, WAVE (SAW / SQUARE), SLIDE (el tiempo), VOLUME + * PRESETS los sonidos de fábrica + * Tocar ligado (apretar la siguiente antes de soltar) = SLIDE; con REC se graba. + * Botones: EDIT el panel (MAIN), SEQ el piano roll, FX los efectos del TB-03 (página 1 OVERDRIVE; + * FX otra vez, página 2 DELAY y REVERB, que son los envíos del canal), SCL el ACCENT de cada paso (SCL + * otra vez: el SLIDE de cada paso; las 16 blancas son los 16 pasos de la página, SELECT cambia de + * página), LFO el LFO (un añadido: la 303 no tiene), ARP el arpegiador, GLO el MIDI. Un menú con + * páginas (EDIT, FX, SCL, ARP) no se sale: su botón otra vez pasa a la página siguiente, en círculo; + * se sale con otro menú o HOME. El de una sola página, otra vez, vuelve al panel. ENV no hace nada. */ +#include +#include +#include +#include "bm_mach.h" +#include "bm_util.h" +#include "bm_params.h" +#include "bm_lang.h" + +static const char *const WAVES[2] = {"SAW", "SQUARE"}; + +static const bxp P_MAIN[2][4] = { + {{"CUTOFF", K_MAC, 0, 0, 127, F_OHZ, NULL}, {"RESO", K_MAC, 1, 0, 127, F_PCT, NULL}, + {"ENV MOD", K_MAC, 2, 0, 127, F_PCT, NULL}, {"DECAY", K_MAC, 3, 0, 127, F_DMS, NULL}}, + {{"TUNING", K_TRK, TRK(transpose), 0, 48, F_TRSP, NULL}, {"WAVE", K_PRM, AC_WAVE, 0, 1, F_LIST, WAVES}, + {"SLIDE", K_TRK, TRK(glide), 0, 127, F_GLIDE, NULL}, {"VOLUME", K_TRK, TRK(level), 0, 127, F_PCT, NULL}}}; +static const bxp P_ACCENT = {"ACCENT", K_TRK, TRK(accent), 0, 127, F_PCT, NULL}; +static const bxp P_TUNING = {"TUNING", K_TRK, TRK(transpose), 0, 48, F_TRSP, NULL}; /* = el editor (bm_ac_pages) */ +static const bxp P_FX[2][4] = { + {{"DRIVE", K_PRM, AC_OD_G, 0, 127, F_PCT, NULL}, {"TONE", K_PRM, AC_OD_T, 0, 127, F_PCT, NULL}, + {"LEVEL", K_PRM, AC_OD_L, 0, 127, F_PCT, NULL}, {"ON", K_ON, ACF_OD, 0, 1, F_ONOFF, NULL}}, + {{"DELAY", K_TRK, TRK(send), 0, 127, F_PCT, NULL}, {"DLY ON", K_ON, ACF_DELAY, 0, 1, F_ONOFF, NULL}, + {"REVERB", K_TRK, TRK(rsend), 0, 127, F_PCT, NULL}, {"REV ON", K_ON, ACF_REVERB, 0, 1, F_ONOFF, NULL}}}; +const char *const b303_fx_names[ACF_N] = {"OVERDRIVE", "DELAY", "REVERB"}; +static const bxp P_LFO[4] = { + {"RATE", K_PRM, AC_LFO_RATE, 0, AC_LFO_RATES - 1, F_LIST, bm_acid_lfo_rates}, + {"DEPTH", K_PRM, AC_LFO_DEPTH, 0, 127, F_PCT, NULL}, + {"WAVE", K_PRM, AC_LFO_WAVE, 0, ACW_N - 1, F_LIST, bm_acid_lfo_waves}, + {"DEST", K_PRM, AC_LFO_DEST, 0, ACL_DESTS - 1, F_LIST, bm_acid_lfo_dests}}; +static const bxp P_NONE[4] = {NONE, NONE, NONE, NONE}; +static const char *const PAGE_NAMES[BXP_N] = {"PANEL", "SEQ", "FX", "", "LFO", "", "GLO", "ARP", "ACCENT"}; + +int b303_page_of(int btn) +{ + switch (btn) { + case BTN_EDIT: return BXP_MAIN; + case BTN_SEQ: return BXP_SEQ; + case BTN_FX: return BXP_FX; + case BTN_GLO: return BXP_GLO; + case BTN_ARP: return BXP_ARP; + case BTN_LFO: return BXP_LFO; + case BTN_SCL: return BXP_SCL; + default: return -1; + } +} + +static const bxp *cur(const bm_app *a, int *n) +{ + const bm_bx7ui *u = &a->bx; + switch (u->page) { + case BXP_SEQ: *n = 1; return MACH_SEQ; + case BXP_FX: *n = 2; return P_FX[u->sub[BXP_FX] % 2]; + case BXP_LFO: *n = 1; return P_LFO; + case BXP_SCL: *n = 1; return P_NONE; + case BXP_GLO: *n = 2; return MACH_GLO[u->sub[BXP_GLO] % 2]; + case BXP_ARP: *n = 2; return MACH_ARP[u->sub[BXP_ARP] % 2]; + default: *n = 2; return P_MAIN[u->sub[BXP_MAIN] % 2]; + } +} + +/* el panel está a la vista: se ve girar la perilla, sin el recuadro grande encima */ +static bool panel(const bm_app *a) { return a->bx.page == BXP_MAIN; } + +static void turned(bm_app *a, int k, const bxp *p, int v) +{ + if (v < 0) return; + if (panel(a)) { a->ov.on = 0; return; } + char b[12], ti[22]; + mach_fmt(p, v, b, sizeof b); + snprintf(ti, sizeof ti, "%s %s", a->bx.page == BXP_FX ? "FX" : a->bx.page == BXP_LFO ? "LFO" : "BB-303", T(p->name)); + app_overlay(a, k, ti, b, "", mach_pct(p, v), p->fmt == F_TRSP ? 128 : -1, k >= 0 ? bm_knob_color(k) : C_ORANGE); +} + +bool b303_button(bm_app *a, int id, bm_gkind k) +{ + int p = b303_page_of(id); + if (p < 0) return true; /* lo demás no hace nada en la 303 */ + if (k != G_TAP && k != G_HOLD) return true; + bm_bx7ui *u = &a->bx; + int n = p == BXP_MAIN || p == BXP_FX || p == BXP_SCL || p == BXP_ARP || p == BXP_GLO ? 2 : 1; /* sus páginas */ + if (u->page != p) { /* otro menú: entra en su página 1 */ + u->page = (uint8_t)p; + u->sub[p] = 0; + if (p == BXP_SCL) u->blk = (uint8_t)(u->step % mach_len(a) / 16); + } else if (n > 1) u->sub[p] = (uint8_t)((u->sub[p] + 1) % n); /* con páginas: la siguiente, en círculo */ + else u->page = BXP_MAIN; /* de una página: otra vez, el panel */ + a->ov.on = 0; + return true; +} + +/* SCL: la blanca w prende o apaga el ACCENT (o el SLIDE) del paso w de la página; un paso sin nota no. + * La usa también el B-MINI (ACCENT y GLIDE). */ +void mach_scl_toggle(bm_app *a, int w) +{ + int t = a->track, s = a->bx.blk * 16 + w; + bool slide = a->bx.sub[BXP_SCL] % 2 != 0; + if (s >= mach_len(a)) return; + bool has = false, on = false; + for (int e = 0; e < BM_EVENTS; e++) { + const bm_event *ev = bm_evc(&a->pat, t, s, e); + if (bm_event_empty(ev)) continue; + has = true; + on |= slide ? (ev->len & BM_LEN_TIE) != 0 : ev->vel >= BM_VEL_ACC; + } + char b[24]; + if (!has) { snprintf(b, sizeof b, TF("STEP %d: NO NOTE"), s + 1); app_toast(a, b); return; } + for (int e = 0; e < BM_EVENTS; e++) { + bm_event ev = *bm_evc(&a->pat, t, s, e); + if (bm_event_empty(&ev)) continue; + if (slide) ev.len = (uint8_t)(on ? ev.len & ~BM_LEN_TIE : ev.len | BM_LEN_TIE); + else ev.vel = (uint8_t)(on ? 100 : BM_VEL_ACC); + app_push_ev(a, t, s, e, &ev); + } + app_edited(a); +} + +void b303_key(bm_app *a, int k, int w, int b) +{ + (void)b; + if (a->bx.page == BXP_SCL) { if (w >= 0 && w < 16) mach_scl_toggle(a, w); return; } /* las negras: nada */ + mach_play(a, k, 100); +} + +/* SCL: las 16 blancas son los pasos de la página; ON = con ACCENT (o SLIDE), DIM = con nota */ +void b303_keys(const bm_app *a, bm_keyfn K[BM_KEYS]) +{ + memset(K, 0, sizeof(bm_keyfn) * BM_KEYS); + int t = a->track, L = mach_len(a); + bool slide = a->bx.sub[BXP_SCL] % 2 != 0; + for (int w = 0; w < 16; w++) { + int s = a->bx.blk * 16 + w; + bm_keyfn *f = &K[bm_white_key(w)]; + if (s >= L) continue; + bool has = false, on = false; + for (int e = 0; e < BM_EVENTS; e++) { + const bm_event *ev = bm_evc(&a->pat, t, s, e); + if (bm_event_empty(ev)) continue; + has = true; + on |= slide ? (ev->len & BM_LEN_TIE) != 0 : ev->vel >= BM_VEL_ACC; + } + snprintf(f->label, sizeof f->label, "%d", s + 1); + f->led = on ? LED_ON : has ? LED_DIM : LED_OFF; + f->color = slide ? C_GREEN : C_ORANGE; + f->live = (uint8_t)(a->ctx.st.playing && bm_app_track_step(a, t, -1) == s); + } +} + +void b303_encoder(bm_app *a, int id, int d) +{ + bm_bx7ui *u = &a->bx; + int n; + switch (id) { + case ENC_SELECT: + if (u->page == BXP_SCL) { /* la página de 16 pasos */ + int nb = (mach_len(a) + 15) / 16; + u->blk = (uint8_t)((u->blk + app_lst(a, d) + nb * 8) % nb); + } + return; /* las páginas, con su botón */ + case ENC_ALGO: + if (bm_gesture_is_down(&a->ges, BTN_OCT_DN) || bm_gesture_is_down(&a->ges, BTN_OCT_UP)) { /* OCT + ALGORITHM: TUNING */ + a->oct_used = 1; + turned(a, -1, &P_TUNING, mach_turn(a, &P_TUNING, app_lst(a, d))); + return; + } + turned(a, -1, &P_ACCENT, mach_turn(a, &P_ACCENT, d)); + return; + case ENC_PRESETS: app_enc_source(a, a->track, d); return; + default: break; + } + int k = id - ENC_K1; + if (k < 0 || k > 3) return; + const bxp *P = cur(a, &n); + turned(a, k, &P[k], mach_turn(a, &P[k], d)); +} + +void b303_legend(const bm_app *a, bm_legend L[4]) +{ + int n; + mach_legend(a, cur(a, &n), L); +} + +void b303_bigknobs(const bm_app *a, const char **sel, const char **alg, const char **pre) +{ + int n; + cur(a, &n); + *sel = a->bx.page == BXP_SCL ? "STEPS" : a->bx.page == BXP_SEQ ? "STEP" : "-"; + *alg = "ACCENT"; + *pre = "PRESET"; +} + +uint8_t b303_btn_led(const bm_app *a, int i) +{ + int p = b303_page_of(i); + if (p < 0) return LED_OFF; + return p == a->bx.page ? LED_ON : LED_DIM; +} + +const char *b303_title(const bm_app *a, char *buf, int cap) +{ + int n; + cur(a, &n); + const bm_bx7ui *u = &a->bx; + if (u->page == BXP_FX) snprintf(buf, (size_t)cap, "FX %d/2 %s", u->sub[BXP_FX] % 2 + 1, T(u->sub[BXP_FX] % 2 ? "DELAY REVERB" : "OVERDRIVE")); + else if (u->page == BXP_SCL) snprintf(buf, (size_t)cap, "%s %d-%d", T(u->sub[BXP_SCL] % 2 ? "SLIDE" : "ACCENT"), u->blk * 16 + 1, u->blk * 16 + 16); + else if (n > 1) snprintf(buf, (size_t)cap, "%s %d/%d", T(PAGE_NAMES[u->page % BXP_N]), u->sub[u->page % BXP_N] % n + 1, n); + else snprintf(buf, (size_t)cap, "%s", T(PAGE_NAMES[u->page % BXP_N])); + return buf; +} diff --git a/core/bm_bx7.c b/core/bm_bx7.c new file mode 100644 index 0000000..706e67a --- /dev/null +++ b/core/bm_bx7.c @@ -0,0 +1,296 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later + * Copyright (C) 2026 Erbubar23 */ +/* Bubba Machine — la BX-7 por dentro: el FM-1 de fábrica adaptado a Bubba (2026-10-21). + * + * Se entra desde HOME con el cursor en su canal: SEQ, FX, ENV, LFO, EDIT o ARP llevan directo a esa + * página (la tecla blanca del canal sigue entrando a tocar en PLAY/REC). Adentro, como en el FM-1: + * ALGORITHM el algoritmo (1-32), con el dibujo · OCT sostenido + ALGORITHM: transposición ±12 + * PRESETS los sonidos de fábrica (los bancos de usuario, apagados hasta tener todas las máquinas) + * SELECT la página del botón (o la casilla en FX) · K1-K4 lo que dice la pantalla + * OCT -/+ la octava (±3); los dos juntos: octava y transposición a 0 + * FX ENV LFO EDIT GLO ARP SEQ: su página; el mismo botón otra vez vuelve a MAIN · HOME a la consola + * SCL en FX toma la casilla elegida y SELECT la mueve en la cadena (otra vez SCL la suelta) + * REC sonando: graba ya; parado: se arma y la primera nota arranca y graba (vacío: toma + * libre, el largo se cierra con REC); sostenido 2 s: borra las notas del canal + * EDIT negras 1-6 OP1-OP6, 7 PIT (envolvente de afinación), 8 GLO (algoritmo, feedback...), + * 9 MONO, 10 POLY; las blancas siguen tocando + * Todo lo de la voz se escribe con CMD_FMV en pat->fmv; lo que va encima (BRIGHT, la página ENV) en + * el canal; los efectos en prm (BX_*). */ +#include +#include +#include +#include +#include "bm_mach.h" +#include "bm_util.h" +#include "bm_params.h" +#include "bm_fm.h" +#include "bm_rom.h" +#include "bm_lang.h" + +static const char *const WAVES[6] = {"TRI", "SAW DN", "SAW UP", "SQUARE", "SINE", "S&H"}; +static const char *const CURVES[4] = {"-LIN", "-EXP", "+EXP", "+LIN"}; +static const char *const MODES[2] = {"RATIO", "FIXED"}; +static const char *const FTYPES[3] = {"LP", "BP", "HP"}; + +static const bxp P_MAIN[1][4] = {{ + {"FEEDBACK", K_FMV, BM_FM_FB, 0, 7, F_INT, NULL}, {"BRIGHT", K_MAC, 0, 0, 127, F_BIP, NULL}, + {"PORTA", K_TRK, TRK(glide), 0, 127, F_PCT, NULL}, {"KEY VEL", K_TRK, TRK(accent), 0, 127, F_PCT, NULL}}}; +static const bxp P_ENV[1][4] = {{ + {"ATTACK", K_TRK, TRK(attack), 0, 127, F_PCT, NULL}, {"DECAY", K_MAC, 2, 0, 127, F_BIP, NULL}, + {"SUSTAIN", K_TRK, TRK(sustain), 0, 127, F_BIP, NULL}, {"RELEASE", K_MAC, 3, 0, 127, F_BIP, NULL}}}; +static const bxp P_LFO[2][4] = { + {{"WAVE", K_FMV, 142, 0, 5, F_LIST, WAVES}, {"SPEED", K_FMV, 137, 0, 99, F_INT, NULL}, + {"PMD", K_FMV, 139, 0, 99, F_INT, NULL}, {"AMD", K_FMV, 140, 0, 99, F_INT, NULL}}, + {{"DELAY", K_FMV, 138, 0, 99, F_INT, NULL}, {"P SENS", K_FMV, 143, 0, 7, F_INT, NULL}, + {"LFO SYNC", K_FMV, 141, 0, 1, F_ONOFF, NULL}, {"OSC SYNC", K_FMV, 136, 0, 1, F_ONOFF, NULL}}}; +static const bxp P_GLO2[4] = {{"TRANSP", K_TRK, TRK(transpose), 12, 36, F_TRSP, NULL}, NONE, MACH_QUANT, {"RESET", K_RST, 0, 0, 1, F_INT, NULL}}; /* GLO pág 2 */ +/* FX: una página por casilla, en el orden de las casillas del FM-1; K4 siempre ON/OFF */ +static const bxp P_FX[BXF_N][4] = { + {{"TYPE", K_PRM, BX_FLT_T, 0, 2, F_LIST, FTYPES}, {"CUTOFF", K_PRM, BX_FLT_C, 0, 127, F_HZ, NULL}, + {"RESO", K_PRM, BX_FLT_Q, 0, 127, F_PCT, NULL}, {"ON", K_ON, BXF_FILTER, 0, 1, F_ONOFF, NULL}}, + {{"SEND", K_TRK, TRK(rsend), 0, 127, F_PCT, NULL}, NONE, NONE, {"ON", K_ON, BXF_REVERB, 0, 1, F_ONOFF, NULL}}, + {{"SEND", K_TRK, TRK(send), 0, 127, F_PCT, NULL}, NONE, NONE, {"ON", K_ON, BXF_DELAY, 0, 1, F_ONOFF, NULL}}, + {{"GAIN", K_PRM, BX_DST_G, 0, 127, F_PCT, NULL}, {"TONE", K_PRM, BX_DST_T, 0, 127, F_PCT, NULL}, + {"LEVEL", K_PRM, BX_DST_L, 0, 127, F_PCT, NULL}, {"ON", K_ON, BXF_DIST, 0, 1, F_ONOFF, NULL}}, + {{"RATE", K_PRM, BX_CHO_F, 0, 127, F_PCT, NULL}, {"DEPTH", K_PRM, BX_CHO_D, 0, 127, F_PCT, NULL}, + {"MIX", K_PRM, BX_CHO_M, 0, 127, F_PCT, NULL}, {"ON", K_ON, BXF_CHORUS, 0, 1, F_ONOFF, NULL}}, + {{"RATE", K_PRM, BX_PHA_F, 0, 127, F_PCT, NULL}, {"DEPTH", K_PRM, BX_PHA_D, 0, 127, F_PCT, NULL}, + {"MIX", K_PRM, BX_PHA_M, 0, 127, F_PCT, NULL}, {"ON", K_ON, BXF_PHASER, 0, 1, F_ONOFF, NULL}}}; +const char *const bx7_fx_names[BXF_N] = {"FILTER", "REVERB", "DELAY", "DIST", "CHORUS", "PHASER"}; +/* EDIT: un operador en 6 páginas, como el FM-1 */ +static const bxp P_OP[6][4] = { + {{"RATE 1", K_OP, FMO_R1, 0, 99, F_INT, NULL}, {"RATE 2", K_OP, FMO_R2, 0, 99, F_INT, NULL}, + {"RATE 3", K_OP, FMO_R3, 0, 99, F_INT, NULL}, {"RATE 4", K_OP, FMO_R4, 0, 99, F_INT, NULL}}, + {{"LEVEL 1", K_OP, FMO_L1, 0, 99, F_INT, NULL}, {"LEVEL 2", K_OP, FMO_L2, 0, 99, F_INT, NULL}, + {"LEVEL 3", K_OP, FMO_L3, 0, 99, F_INT, NULL}, {"LEVEL 4", K_OP, FMO_L4, 0, 99, F_INT, NULL}}, + {{"DETUNE", K_OP, FMO_DT, 0, 14, F_DT, NULL}, {"COARSE", K_OP, FMO_FC, 0, 31, F_INT, NULL}, + {"FINE", K_OP, FMO_FF, 0, 99, F_INT, NULL}, {"MODE", K_OP, FMO_MODE, 0, 1, F_LIST, MODES}}, + {{"AMP MOD", K_OP, FMO_AMS, 0, 3, F_INT, NULL}, {"VEL SENS", K_OP, FMO_KVS, 0, 7, F_INT, NULL}, + {"OUT LVL", K_OP, FMO_OL, 0, 99, F_INT, NULL}, NONE}, + {{"L DEPTH", K_OP, FMO_LD, 0, 99, F_INT, NULL}, {"R DEPTH", K_OP, FMO_RD, 0, 99, F_INT, NULL}, + {"BREAK", K_OP, FMO_BP, 0, 99, F_NOTE, NULL}, NONE}, + {{"L CURVE", K_OP, FMO_LC, 0, 3, F_LIST, CURVES}, {"R CURVE", K_OP, FMO_RC, 0, 3, F_LIST, CURVES}, + {"RATE SCL", K_OP, FMO_RS, 0, 7, F_INT, NULL}, NONE}}; /* (el orden de las páginas del manual del FM-1) */ +static const char *const OP_PAGES[6] = {"RATES", "LEVELS", "FREQ", "OUTPUT", "SCALING", "CURVES"}; +static const bxp P_PIT[2][4] = { + {{"RATE 1", K_FMV, 126, 0, 99, F_INT, NULL}, {"RATE 2", K_FMV, 127, 0, 99, F_INT, NULL}, + {"RATE 3", K_FMV, 128, 0, 99, F_INT, NULL}, {"RATE 4", K_FMV, 129, 0, 99, F_INT, NULL}}, + {{"LEVEL 1", K_FMV, 130, 0, 99, F_INT, NULL}, {"LEVEL 2", K_FMV, 131, 0, 99, F_INT, NULL}, + {"LEVEL 3", K_FMV, 132, 0, 99, F_INT, NULL}, {"LEVEL 4", K_FMV, 133, 0, 99, F_INT, NULL}}}; +static const bxp P_EGLO[1][4] = {{ + {"ALGORITHM", K_FMV, BM_FM_ALG, 0, 31, F_P1, NULL}, {"FEEDBACK", K_FMV, BM_FM_FB, 0, 7, F_INT, NULL}, + {"OSC SYNC", K_FMV, 136, 0, 1, F_ONOFF, NULL}, {"TRANSP", K_FMV, BM_FM_TRSP, 0, 48, F_TRSP, NULL}}}; + +static const char *const PAGE_NAMES[BXP_N] = {"MAIN", "SEQ", "FX", "ENV", "LFO", "EDIT", "GLO", "ARP"}; + +int bx7_page_of(int btn) +{ + switch (btn) { + case BTN_SEQ: return BXP_SEQ; + case BTN_FX: return BXP_FX; + case BTN_ENV: return BXP_ENV; + case BTN_LFO: return BXP_LFO; + case BTN_EDIT: return BXP_EDIT; + case BTN_GLO: return BXP_GLO; + case BTN_ARP: return BXP_ARP; + default: return -1; + } +} + +static int page_btn(int p) +{ + static const int8_t B[BXP_N] = {-1, BTN_SEQ, BTN_FX, BTN_ENV, BTN_LFO, BTN_EDIT, BTN_GLO, BTN_ARP}; + return p >= 0 && p < BXP_N ? B[p] : -1; +} + +static int fx_at(const bm_app *a, int pos) { return a->pat.prm[a->track][BX_ORD0 + pos % BXF_N] % BXF_N; } + +/* las 4 perillas de la página de ahora y cuántas páginas tiene (SELECT) */ +static const bxp *cur(const bm_app *a, int *n) +{ + const bm_bx7ui *u = &a->bx; + switch (u->page) { + case BXP_SEQ: *n = 1; return MACH_SEQ; + case BXP_ENV: *n = 1; return P_ENV[0]; + case BXP_LFO: *n = 2; return P_LFO[u->sub[BXP_LFO] % 2]; + case BXP_GLO: *n = 2; return u->sub[BXP_GLO] % 2 ? P_GLO2 : MACH_GLO[0]; + case BXP_ARP: *n = 2; return MACH_ARP[u->sub[BXP_ARP] % 2]; + case BXP_FX: *n = 1; return P_FX[fx_at(a, u->fxpos)]; + case BXP_EDIT: + if (u->edit == BXE_PIT) { *n = 2; return P_PIT[u->esub[BXE_PIT] % 2]; } + if (u->edit == BXE_GLO) { *n = 1; return P_EGLO[0]; } + *n = 6; return P_OP[u->esub[u->edit % BXE_N] % 6]; + default: *n = 1; return P_MAIN[0]; + } +} + +static int sub_of(const bm_app *a) +{ + const bm_bx7ui *u = &a->bx; + if (u->page == BXP_EDIT) return u->esub[u->edit % BXE_N]; + return u->sub[u->page % BXP_N]; +} + +/* girar una perilla de la página */ +static void set(bm_app *a, int k, const bxp *p, int d) +{ + int v = mach_turn(a, p, d); + if (v < 0) return; + char b[12], ti[22]; + mach_fmt(p, v, b, sizeof b); + if (a->bx.page == BXP_EDIT && a->bx.edit <= BXE_OP6) snprintf(ti, sizeof ti, "OP%d %s", a->bx.edit + 1, T(p->name)); + else if (a->bx.page == BXP_FX) snprintf(ti, sizeof ti, "%s %s", T(bx7_fx_names[fx_at(a, a->bx.fxpos)]), T(p->name)); + else snprintf(ti, sizeof ti, "BX-7 %s", T(p->name)); + app_overlay(a, k, ti, b, "", mach_pct(p, v), -1, bm_knob_color(k)); +} + +/* ------------------------------------------------------------ entrar, botones, teclas, perillas */ +bool bx7_button(bm_app *a, int id, bm_gkind k) +{ + switch (id) { + case BTN_SCL: + if ((k == G_TAP || k == G_HOLD) && a->bx.page == BXP_FX) { + int f = fx_at(a, a->bx.fxpos); + if (!a->bx.grab && (f == BXF_REVERB || f == BXF_DELAY)) { app_toast(a, "SEND: ALWAYS AFTER THE FX"); return true; } + a->bx.grab = (uint8_t)!a->bx.grab; + app_toast(a, a->bx.grab ? "SELECT MOVES IT" : "PLACED"); + } + return true; + default: break; + } + int p = bx7_page_of(id); + if (p < 0) return true; /* lo demás no hace nada en la máquina */ + if (k != G_TAP && k != G_HOLD) return true; + bm_bx7ui *u = &a->bx; + int n; + if (u->page != p) { /* otro menú: entra en su página 1 */ + u->page = (uint8_t)p; + if (p == BXP_EDIT) u->esub[u->edit % BXE_N] = 0; else u->sub[p] = 0; + } else if (cur(a, &n), n > 1) { /* con páginas: la siguiente, en círculo (no sale) */ + if (p == BXP_EDIT) u->esub[u->edit % BXE_N] = (uint8_t)((u->esub[u->edit % BXE_N] + 1) % n); + else u->sub[p] = (uint8_t)((u->sub[p] + 1) % n); + } else u->page = BXP_MAIN; /* de una página: otra vez, MAIN */ + a->bx.grab = 0; + a->ov.on = 0; + return true; +} + +void bx7_key(bm_app *a, int k, int w, int b) +{ + int t = a->track; + if (a->bx.page == BXP_EDIT && b >= 0) { /* EDIT: las negras eligen qué editar */ + if (b <= BXE_GLO) { a->bx.edit = (uint8_t)b; a->ov.on = 0; return; } + if (b == 8 || b == 9) { + app_push(a, CMD_SET_PRM, (uint8_t)t, BX_MONO, (uint8_t)(b == 8)); + app_edited(a); + app_toast(a, b == 8 ? "MONO" : "POLY"); + } + return; + } + (void)w; + mach_play(a, k, 105); +} + +void bx7_encoder(bm_app *a, int id, int d) +{ + int t = a->track, n; + bm_bx7ui *u = &a->bx; + char b[16]; + switch (id) { + case ENC_SELECT: + if (u->page == BXP_FX) { + int np = (u->fxpos + app_lst(a, d) + BXF_N * 4) % BXF_N; + if (u->grab) { /* SCL tomada: la casilla se mueve en la cadena */ + uint8_t x = a->pat.prm[t][BX_ORD0 + u->fxpos], y = a->pat.prm[t][BX_ORD0 + np]; + app_push(a, CMD_SET_PRM, (uint8_t)t, (uint8_t)(BX_ORD0 + u->fxpos), y); + app_push(a, CMD_SET_PRM, (uint8_t)t, (uint8_t)(BX_ORD0 + np), x); + app_edited(a); + } + u->fxpos = (uint8_t)np; + a->ov.on = 0; + return; + } + return; /* las páginas, con su botón */ + case ENC_ALGO: + if (bm_gesture_is_down(&a->ges, BTN_OCT_DN) || bm_gesture_is_down(&a->ges, BTN_OCT_UP)) { /* OCT + ALGORITHM: transposición */ + a->oct_used = 1; + int v = bm_clampi(a->pat.trk[t].transpose + app_lst(a, d), 12, 36); + app_set_track(a, t, TRK(transpose), v); + snprintf(b, sizeof b, v > 24 ? "+%d ST" : "%d ST", v - 24); + app_overlay(a, -1, "TRANSPOSE", b, "", (v - 12) * 255 / 24, 128, C_ORANGE); + return; + } + { + int v = (a->pat.fmv[BM_FM_ALG] % 32 + app_lst(a, d) + 64) % 32; + app_push(a, CMD_FMV, BM_FM_ALG, (uint8_t)v, 0); + app_edited(a); + snprintf(b, sizeof b, "%d", v + 1); + if (u->page == BXP_MAIN || (u->page == BXP_EDIT && u->edit != BXE_PIT)) + a->ov.on = 0; /* el dibujo está a la vista: se ve cambiar */ + else + app_overlay(a, -1, "ALGORITHM", b, "", v * 255 / 31, -1, C_ORANGE); + } + return; + case ENC_PRESETS: app_enc_source(a, t, d); return; + default: break; + } + int k = id - ENC_K1; + if (k < 0 || k > 3) return; + const bxp *P = cur(a, &n); + set(a, k, &P[k], d); +} + +void bx7_legend(const bm_app *a, bm_legend L[4]) +{ + int n; + mach_legend(a, cur(a, &n), L); +} + +void bx7_bigknobs(const bm_app *a, const char **sel, const char **alg, const char **pre) +{ + int n; + cur(a, &n); + *sel = a->bx.page == BXP_FX ? "SLOT" : a->bx.page == BXP_SEQ ? "STEP" : "-"; + *alg = "ALG"; + *pre = "PRESET"; +} + +void bx7_keys(const bm_app *a, bm_keyfn K[BM_KEYS]) +{ + memset(K, 0, sizeof(bm_keyfn) * BM_KEYS); + app_note_keys(a, K, a->track); + if (a->bx.page != BXP_EDIT) return; + static const char *const EK[10] = {"OP1", "OP2", "OP3", "OP4", "OP5", "OP6", "PIT", "GLO", "MONO", "POLY"}; + int mono = a->pat.prm[a->track][BX_MONO] != 0; + for (int i = 0; i < BM_BLACKS; i++) { + bm_keyfn *f = &K[bm_black_key(i)]; + memset(f, 0, sizeof *f); + if (i >= 10) continue; + snprintf(f->label, sizeof f->label, "%s", EK[i]); + f->led = i < 8 ? (i == a->bx.edit ? LED_ON : LED_DIM) : ((i == 8) == mono ? LED_ON : LED_DIM); + f->color = C_ORANGE; + } +} + +uint8_t bx7_btn_led(const bm_app *a, int i) +{ + if (i == BTN_SCL) return a->bx.page != BXP_FX ? LED_OFF : a->bx.grab ? LED_BREATH : LED_DIM; + int p = bx7_page_of(i); + if (p < 0) return LED_OFF; + return p == a->bx.page ? LED_ON : LED_DIM; +} + +const char *bx7_title(const bm_app *a, char *buf, int cap) +{ + int n; + cur(a, &n); + const bm_bx7ui *u = &a->bx; + if (u->page == BXP_EDIT) { + if (u->edit <= BXE_OP6) snprintf(buf, (size_t)cap, "OP%d %s", u->edit + 1, T(OP_PAGES[u->esub[u->edit] % 6])); + else snprintf(buf, (size_t)cap, "%s", u->edit == BXE_PIT ? (u->esub[BXE_PIT] % 2 ? "PITCH LEVELS" : "PITCH RATES") : "VOICE"); + } else if (u->page == BXP_FX) snprintf(buf, (size_t)cap, "FX %s", T(bx7_fx_names[fx_at(a, u->fxpos)])); + else if (n > 1) snprintf(buf, (size_t)cap, "%s %d/%d", T(PAGE_NAMES[u->page % BXP_N]), sub_of(a) % n + 1, n); + else snprintf(buf, (size_t)cap, "%s", T(PAGE_NAMES[u->page % BXP_N])); + (void)page_btn; + return buf; +} diff --git a/core/bm_bx7fx.c b/core/bm_bx7fx.c new file mode 100644 index 0000000..a2eedd6 --- /dev/null +++ b/core/bm_bx7fx.c @@ -0,0 +1,159 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later + * Copyright (C) 2026 Erbubar23 */ +/* Bubba Machine — los efectos propios de la BX-7 y el OVERDRIVE del BB-303. La BX-7, como la cadena del FM-1 de fábrica: filtro, + * distorsión, chorus y phaser, en el orden de sus casillas (BX_ORD0..5). La reverb y el delay de la + * cadena son los envíos del canal en la mezcla (core/bm_dsp.c): no se procesan dos veces. + * + * Solo calcula lo que está prendido (BX_FXON): con todo apagado no cuesta nada. Hay una sola BX-7 + * por patrón (es pesada), así que el estado es uno solo. Trabaja sobre el búfer del canal (int32, + * 32768 ~ una voz a todo volumen) antes del filtro DJ y del drive del canal. */ +#include +#include +#include "bm_audio.h" +#include "bm_params.h" +#include "bm_util.h" + +#define CH_N 2048u /* 46 ms a 44.1 kHz: el chorus barre 6-26 ms */ + +static struct { + float lp, bp; /* filtro de estado variable (Chamberlin, dos pasadas) */ + float tone; /* el tono de la distorsión (un polo) */ + float cbuf[CH_N]; uint32_t cw; float clfo; /* chorus */ + float ap[4], pfb, plfo; /* phaser: cuatro pasa-todo */ +} S; + +static float od_tone[BM_TRACKS]; /* el BB-303 puede estar en varios canales */ + +void bm_bx7_fx_reset(void) { memset(&S, 0, sizeof S); memset(od_tone, 0, sizeof od_tone); } + +/* 0..127 -> 100 Hz..20 kHz (logarítmico, como el CutOff del FM-1) */ +static float cut_hz(int v) { return 100.0f * powf(200.0f, (float)v / 127.0f); } + +static void fx_filter(float *x, uint32_t n, const uint8_t *p) +{ + float f = 2.0f * sinf(3.14159265f * fminf(cut_hz(p[BX_FLT_C]), 18000.0f) / (2.0f * (float)BM_FS)); /* dos pasadas por muestra */ + float q = 1.9f - 1.75f * (float)p[BX_FLT_Q] / 127.0f; /* Q 0..127: de suave a resonante */ + int type = p[BX_FLT_T] % 3; + float lp = S.lp, bp = S.bp; + for (uint32_t i = 0; i < n; i++) { + float hp = 0.0f; + for (int k = 0; k < 2; k++) { + lp += f * bp; + hp = x[i] - lp - q * bp; + bp += f * hp; + } + x[i] = type == 0 ? lp : type == 1 ? bp : hp; + } + if (!(fabsf(lp) < 1e6f) || !(fabsf(bp) < 1e6f)) lp = bp = 0.0f; /* NaN o desborde: de cero */ + S.lp = lp; S.bp = bp; +} + +/* recorte suave con tono de un polo: la distorsión de la BX-7 y el OVERDRIVE del BB-303 */ +static void fx_dist(float *x, uint32_t n, int gain, int tone, int level, float *st) +{ + float drive = 1.0f + (float)gain * 0.25f, lvl = (float)level / 127.0f / sqrtf(drive) * 1.4f; + float k = 0.05f + 0.9f * (float)tone / 127.0f, t = *st; + for (uint32_t i = 0; i < n; i++) { + float v = x[i] * (drive / 32768.0f); /* el canal: 32768 = una voz a pleno */ + v = v / (1.0f + fabsf(v)); /* recorte suave, sin exp */ + t += k * (v - t); + x[i] = t * lvl * 32768.0f; + } + *st = (fabsf(t) < 1e6f) ? t : 0.0f; +} + +static float ch_read(float d) +{ + float pos = (float)S.cw - d; + while (pos < 0.0f) pos += (float)CH_N; + uint32_t i0 = (uint32_t)pos, i1 = (i0 + 1u) & (CH_N - 1u); + float fr = pos - (float)i0; + return S.cbuf[i0 & (CH_N - 1u)] * (1.0f - fr) + S.cbuf[i1] * fr; +} + +static void fx_chorus(float *x, uint32_t n, const uint8_t *p) +{ + float rate = (0.05f + 4.0f * (float)p[BX_CHO_F] / 127.0f) / (float)BM_FS; + float mid = 0.016f * (float)BM_FS, dep = 0.010f * (float)BM_FS * (float)p[BX_CHO_D] / 127.0f; + float mix = (float)p[BX_CHO_M] / 127.0f; + for (uint32_t i = 0; i < n; i++) { + S.cbuf[S.cw] = x[i]; + S.clfo += rate; if (S.clfo >= 1.0f) S.clfo -= 1.0f; + float tri = 4.0f * fabsf(S.clfo - 0.5f) - 1.0f; + float w = ch_read(mid + dep * tri); + S.cw = (S.cw + 1u) & (CH_N - 1u); + x[i] = x[i] * (1.0f - 0.5f * mix) + w * mix; + } +} + +static void fx_phaser(float *x, uint32_t n, const uint8_t *p) +{ + float rate = (0.03f + 3.0f * (float)p[BX_PHA_F] / 127.0f) / (float)BM_FS; + float dep = (float)p[BX_PHA_D] / 127.0f, mix = (float)p[BX_PHA_M] / 127.0f; + float fb = S.pfb; + for (uint32_t i = 0; i < n; i++) { + S.plfo += rate; if (S.plfo >= 1.0f) S.plfo -= 1.0f; + float tri = 4.0f * fabsf(S.plfo - 0.5f) - 1.0f; + float a = 0.55f + 0.4f * dep * tri; /* coeficiente de los pasa-todo */ + float v = x[i] + fb * 0.5f; + for (int k = 0; k < 4; k++) { + float y = -a * v + S.ap[k]; + S.ap[k] = v + a * y; + v = y; + } + fb = v; + x[i] = x[i] * (1.0f - 0.5f * mix) + v * mix; + } + if (!(fabsf(fb) < 1e6f)) { fb = 0.0f; memset(S.ap, 0, sizeof S.ap); } + S.pfb = fb; +} + +void bm_bx7_fx(bm_ctx *c, int t, int32_t *buf, uint32_t n) +{ + const uint8_t *p = c->pat->prm[t]; + uint8_t on = p[BX_FXON]; + if (!(on & (1u << BXF_FILTER | 1u << BXF_DIST | 1u << BXF_CHORUS | 1u << BXF_PHASER))) return; + float x[BM_BLOCK]; + if (n > BM_BLOCK) n = BM_BLOCK; + for (uint32_t i = 0; i < n; i++) x[i] = (float)buf[i]; + for (int k = 0; k < BXF_N; k++) { + int f = p[BX_ORD0 + k] % BXF_N; + if (!(on & (1u << f))) continue; + switch (f) { + case BXF_FILTER: fx_filter(x, n, p); break; + case BXF_DIST: fx_dist(x, n, p[BX_DST_G], p[BX_DST_T], p[BX_DST_L], &S.tone); break; + case BXF_CHORUS: fx_chorus(x, n, p); break; + case BXF_PHASER: fx_phaser(x, n, p); break; + default: break; /* reverb y delay: envíos de la mezcla */ + } + } + for (uint32_t i = 0; i < n; i++) { + float v = x[i]; + if (v != v) v = 0.0f; /* NaN: silencio, nunca al bus */ + buf[i] = (int32_t)(v > 2.0e9f ? 2.0e9f : v < -2.0e9f ? -2.0e9f : v); + } +} + +/* B-MINI, BUNO-6, BITTAL: la DISTORTION del POLY D (DRIVE, TONE, LEVEL), el recorte del OVERDRIVE del BB-303 */ +void bm_px_fx(bm_ctx *c, int t, int32_t *buf, uint32_t n) +{ + const uint8_t *p = c->pat->prm[t]; + if (!bm_px_fx_on(p, c->pat->trk[t].engine, PXF_DIST)) return; + float x[BM_BLOCK]; + if (n > BM_BLOCK) n = BM_BLOCK; + for (uint32_t i = 0; i < n; i++) x[i] = (float)buf[i]; + fx_dist(x, n, p[PX_DS_G], p[PX_DS_T], p[PX_DS_L], &od_tone[t]); + for (uint32_t i = 0; i < n; i++) buf[i] = (int32_t)(x[i] > 2.0e9f ? 2.0e9f : x[i] < -2.0e9f ? -2.0e9f : x[i]); +} + +/* BB-303: el OVERDRIVE del TB-03, antes del filtro DJ y del drive del canal (DELAY y REVERB son los envíos) */ +void bm_acid_fx(bm_ctx *c, int t, int32_t *buf, uint32_t n) +{ + const uint8_t *p = c->pat->prm[t]; + if (!bm_acid_fx_on(p, ACF_OD)) return; + float x[BM_BLOCK]; + if (n > BM_BLOCK) n = BM_BLOCK; + for (uint32_t i = 0; i < n; i++) x[i] = (float)buf[i]; + fx_dist(x, n, p[AC_OD_G], p[AC_OD_T], p[AC_OD_L], &od_tone[t]); + for (uint32_t i = 0; i < n; i++) buf[i] = (int32_t)(x[i] > 2.0e9f ? 2.0e9f : x[i] < -2.0e9f ? -2.0e9f : x[i]); +} diff --git a/core/bm_config.h b/core/bm_config.h index 30d6111..2d3a35f 100644 --- a/core/bm_config.h +++ b/core/bm_config.h @@ -4,10 +4,11 @@ #ifndef BM_CONFIG_H #define BM_CONFIG_H -#define BM_VERSION_STR "0.9.0-beta" +#define BM_VERSION_STR "0.10.0-beta" #define BM_FMT 3 /* generación de ajustes y tomas (0.3 no lee los de 0.2) */ -#define BM_PAT_FMT 8 /* formato de patrones. Hasta la v1 no se leen formatos anteriores */ -#define BM_PRM 48 /* parámetros de sonido por canal, además de las 4 macros (= BM_SNAP_PRM) */ +#define BM_PAT_FMT 10 /* formato de patrones (10: prm de 56). Hasta la v1 solo se lee además el anterior (9) */ +#define BM_FMV_BYTES 156 /* la voz de la BX-7 en el patrón (= BM_FM_PATCH, VCED de la DX7) */ +#define BM_PRM 56 /* parámetros de sonido por canal, además de las 4 macros (los snapshots guardan los 48 primeros) */ /* ---- Audio (SPEC_V3 §1.4, §3.1) ---- */ #define BM_FS_OUT 44118u /* ≈ 24 MHz / 544, fijo por hardware */ @@ -24,7 +25,8 @@ #define BM_EVENTS 4 /* eventos por paso */ #define BM_PPQN 96 #define BM_TICKS_STEP 24 /* 96 PPQN / 4 semicorcheas */ -#define BM_PATTERNS 10 /* 0.9: W1-W10 en HOME (los objetos 10-15 de la flash se ignoran) */ +#define BM_PATTERNS 9 /* HOME: W1-W9 (los objetos 9-15 de la flash se ignoran) */ +#define BM_CH_W0 10 /* HOME: las blancas 11-16 son los canales; la 10, espacio de seguridad sin función */ #define BM_SONG_MAX 64 #define BM_PAT_MAX_EVENTS 768 #define BM_LANES 16 /* instrumentos de las pistas TR (T1 batería, T2 sampler) */ @@ -68,14 +70,19 @@ /* ---- Pantalla (§1.2, §6.3) ---- */ #define BM_LCD_W 240 #define BM_LCD_H 240 -/* 0.6: cuatro franjas (docs/DISENO_0.6.md §5.2) */ +/* 2026-10-22: cada perilla se dibuja una sola vez. Donde la pantalla ya muestra K1-K4 (un panel, + * una lista) no va la franja de perillas y el visor llega hasta el teclado; si no, la franja va + * entre el visor y el teclado. El teclado y la fila de las perillas grandes, siempre abajo. */ #define BM_STATUS_H 24 /* cabecera: máquina, PLAY/REC, patrón, BPM, CPU */ #define BM_CTX_Y 24 /* visor: lo propio de cada pantalla */ -#define BM_CTX_H 112 -#define BM_KEYS_Y 136 /* teclado: negras 136-149, blancas = pasos 151-167 */ +#define BM_CTX_H 112 /* con la franja de perillas (24..135) */ +#define BM_CTX_H_TALL 170 /* sin ella (24..193) */ +#define BM_LEGEND_Y 136 /* perillas K1-K4: dial, valor y nombre (cuando la pantalla no las muestra) */ +#define BM_LEGEND_H 58 +#define BM_KEYS_Y 194 /* teclado: negras 194-207, blancas = pasos 209-225 */ #define BM_KEYS_H 32 -#define BM_LEGEND_Y 168 /* perillas K1-K4: dial, valor y nombre */ -#define BM_LEGEND_H 72 +#define BM_FOOT_Y 226 /* SELECT, ALGORITHM y PRESETS: qué hacen aquí */ +#define BM_FOOT_H 14 #define BM_STRIP_H 8 /* franja de render */ #define BM_TILE_W 60 /* 4 tiles por franja: solo se envía lo que cambió */ diff --git a/core/bm_dsp.c b/core/bm_dsp.c index c38999d..090f572 100644 --- a/core/bm_dsp.c +++ b/core/bm_dsp.c @@ -116,23 +116,29 @@ static void rv_step(float x, float decay, float damp, float *oL, float *oR) *oR = 0.6f * (rv_tap(&rl[5], 260) + rv_tap(&rl[5], 2000) - rv_tap(&rl[6], 1240) + rv_tap(&rl[7], 1990) - rv_tap(&rl[9], 1580) - rv_tap(&rl[10], 280)); } -/* ------------------------------------------------------------ chorus de BUNO-6 (dos tomas de un BBD) +/* ------------------------------------------------------------ chorus del Juno (dos tomas de un BBD) + * El de BUNO-6 y el CHORUS I / II del B-MINI, uno por canal de notas (el B-MINI puede estar en varios). * Mono de entrada, estéreo de salida: el mismo retardo modulado con el LFO en fase opuesta en cada * lado. Velocidades y retardos de los citados para el Juno-60 (a confirmar con el manual de servicio). */ #define CH_LEN 512u -static float ch_buf[CH_LEN], ch_lfo, ch_lpL, ch_lpR; -static uint32_t ch_w; /* siempre < CH_LEN: como float, un contador libre pierde los decimales a los 6 min (2^24) */ +typedef struct { + float buf[CH_LEN], lfo, lpL, lpR; + uint32_t w; /* siempre < CH_LEN: como float, un contador libre pierde los decimales a los 6 min (2^24) */ + uint8_t on; +} chorus_st; +static chorus_st CHS[BM_SYN_TRACKS + 1]; /* uno por canal de notas y el del Slicer (T2), al final */ +static inline int ch_slot(int t) { return t >= BM_TR_TRACKS ? t - BM_TR_TRACKS : BM_SYN_TRACKS; } static const float CH_RATE[BN_CHORUSES] = {0.0f, 0.513f, 0.863f, 9.75f}; static const float CH_MIN_MS[BN_CHORUSES] = {0.0f, 1.66f, 1.66f, 3.30f}; static const float CH_MAX_MS[BN_CHORUSES] = {0.0f, 5.35f, 5.35f, 3.70f}; -static inline float ch_read(float dly) +static inline float ch_read(const chorus_st *h, float dly) { - float rp = (float)ch_w - dly; + float rp = (float)h->w - dly; if (rp < 0.0f) rp += (float)CH_LEN; uint32_t i0 = (uint32_t)rp; float f = rp - (float)i0; - float a = ch_buf[i0 & (CH_LEN - 1u)], b = ch_buf[(i0 + 1u) & (CH_LEN - 1u)]; + float a = h->buf[i0 & (CH_LEN - 1u)], b = h->buf[(i0 + 1u) & (CH_LEN - 1u)]; return a + (b - a) * f; } @@ -140,8 +146,7 @@ static inline float ch_read(float dly) void bm_dsp_reset(void) { rv_init(); - memset(ch_buf, 0, sizeof ch_buf); - ch_lfo = ch_lpL = ch_lpR = 0.0f; ch_w = 0; + memset(CHS, 0, sizeof CHS); } void bm_dsp_tick(bm_ctx *c) @@ -216,10 +221,15 @@ static int32_t mix_track(bm_ctx *c, int t, uint32_t n, float *L, float *R, float float gl = g * (float)bm_pan_l[tr->pan & 127] * K15; float gr = g * (float)bm_pan_r[tr->pan & 127] * K15; float gs = snd ? g * (float)tr->send * (1.0f / 128.0f) : 0.0f; + if (!bm_send_on(c->pat, t, 0)) gs = 0.0f; /* DELAY apagado en el FX de la máquina */ int32_t pk = 0; float dk = t >= 1 ? (float)tr->duck * (1.0f / 127.0f) : 0.0f; - int chm = tr->engine == ENG_BUNO ? c->pat->prm[t][BN_CHORUS] % BN_CHORUSES : 0; - if (chm && lr) { /* BUNO-6: chorus estéreo (con ducking) */ + int chm = bm_px_eng(tr->engine) ? bm_px_chorus(c->pat->prm[t], tr->engine) : 0; /* BUNO-6 con I+II; los otros OFF, I, II */ + if (t == 0) chm = 0; /* la batería no tiene */ + chorus_st *h = chm ? &CHS[ch_slot(t)] : NULL; + if (h && lr && !h->on) { memset(h->buf, 0, sizeof h->buf); h->lpL = h->lpR = 0.0f; } /* recién prendido: sin restos */ + if (t && lr) CHS[ch_slot(t)].on = (uint8_t)(chm != 0); /* (la pasada de solo envío no cuenta) */ + if (h && lr) { /* BUNO-6 y B-MINI: chorus estéreo (con ducking) */ float rate = CH_RATE[chm] / (float)BM_FS; float mn = CH_MIN_MS[chm] * 0.001f * (float)BM_FS, mx = CH_MAX_MS[chm] * 0.001f * (float)BM_FS; float mid = 0.5f * (mn + mx), dep = 0.5f * (mx - mn); @@ -235,12 +245,12 @@ static int32_t mix_track(bm_ctx *c, int t, uint32_t n, float *L, float *R, float /* ducking a la entrada del chorus: el eco del BBD lo sigue 2-5 ms después (no se * oye) y cuesta una multiplicación. dk = 0: sin ducking (SC viejo, no importa) */ float v = (float)xi * (1.0f - SC[i] * dk); - ch_lpL += kl * (v - ch_lpL); ch_lpR += kl * (ch_lpL - ch_lpR); - ch_buf[ch_w] = ch_lpR; - ch_lfo += rate; if (ch_lfo >= 1.0f) ch_lfo -= 1.0f; - float tri = 4.0f * fabsf(ch_lfo - 0.5f) - 1.0f; - float wl = ch_read(mid + dep * tri), wr = mono ? wl : ch_read(mid - dep * tri); - ch_w = (ch_w + 1u) & (CH_LEN - 1u); + h->lpL += kl * (v - h->lpL); h->lpR += kl * (h->lpL - h->lpR); + h->buf[h->w] = h->lpR; + h->lfo += rate; if (h->lfo >= 1.0f) h->lfo -= 1.0f; + float tri = 4.0f * fabsf(h->lfo - 0.5f) - 1.0f; + float wl = ch_read(h, mid + dep * tri), wr = mono ? wl : ch_read(h, mid - dep * tri); + h->w = (h->w + 1u) & (CH_LEN - 1u); L[i] += (v + wl) * cl; R[i] += (v + wr) * cr; S[i] += v * gs; } } else if (!lr) { /* solo el envío (BEAT FX OFF, antes del efecto) */ @@ -276,7 +286,8 @@ static void dsp_guard(bm_ctx *c) if (bad(c->sc_env)) { c->sc_env = 0.0f; fix++; } if (bad(c->d_acc + c->d_prev + c->d_cur)) { c->d_acc = c->d_prev = c->d_cur = 0.0f; fix++; } if (bad(rv_lp1 + rv_lp2 + rv_bw + rv_fb1 + rv_fb2 + rv_acc + rv_prevL + rv_prevR + rv_curL + rv_curR)) { rv_init(); fix++; } - if (bad(ch_lfo + ch_lpL + ch_lpR)) { memset(ch_buf, 0, sizeof ch_buf); ch_lfo = ch_lpL = ch_lpR = 0.0f; fix++; } + for (int i = 0; i <= BM_SYN_TRACKS; i++) + if (bad(CHS[i].lfo + CHS[i].lpL + CHS[i].lpR)) { memset(CHS[i].buf, 0, sizeof CHS[i].buf); CHS[i].lfo = CHS[i].lpL = CHS[i].lpR = 0.0f; fix++; } if (bad(c->mf_ic1[0] + c->mf_ic1[1] + c->mf_ic2[0] + c->mf_ic2[1])) { c->mf_ic1[0] = c->mf_ic1[1] = c->mf_ic2[0] = c->mf_ic2[1] = 0.0f; fix++; } if (bad(c->pf_ic1[0] + c->pf_ic1[1] + c->pf_ic2[0] + c->pf_ic2[1] + c->gate_g + c->sh_l + c->sh_r)) { c->pf_ic1[0] = c->pf_ic1[1] = c->pf_ic2[0] = c->pf_ic2[1] = c->gate_g = c->sh_l = c->sh_r = 0.0f; fix++; @@ -323,10 +334,14 @@ void bm_dsp_mix(bm_ctx *c, int32_t *out, uint32_t n) if (!(c->tact & (1u << t))) continue; const bm_track *tr = &c->pat->trk[t]; int32_t *x = c->tbuf[t]; + if (tr->engine == ENG_FM) bm_bx7_fx(c, t, x, n); /* BX-7: su cadena de efectos (lo que esté prendido) */ + else if (tr->engine == ENG_ACID) bm_acid_fx(c, t, x, n); /* BB-303: su OVERDRIVE */ + else if (bm_px_eng(tr->engine)) bm_px_fx(c, t, x, n); /* B-MINI, BUNO-6, BITTAL y el Slicer: su DISTORTION (el CHORUS, en la mezcla) */ dj_filter(c, t, tr->djf, x, n); if (tr->drive) ch_drive(x, n, tr->drive); float g = (float)tr->level * (1.0f / 400.0f) * K15; float rs = (float)tr->rsend * (1.0f / 128.0f); + if (!bm_send_on(c->pat, t, 1)) rs = 0.0f; /* REVERB apagada en el FX de la máquina */ if (tr->engine == ENG_BITTAL) rs += bm_bt_macro(c->pat->prm[t], tr->macro, BTM_SPACE) * 0.8f; /* macro SPACE */ float grv = g * (rs < 0.0f ? 0.0f : rs); if (grv > 0.0f) { diff --git a/core/bm_engines.c b/core/bm_engines.c index 1afa2a7..a1c778e 100644 --- a/core/bm_engines.c +++ b/core/bm_engines.c @@ -35,7 +35,7 @@ static int voice_prio(const bm_voice *v) } /* voces como máximo por máquina dentro del pool (BP-1 pads, BB-303, B-MINI, BX-7, BITTAL, BUNO-6) */ -static const uint8_t VCAP[ENG_COUNT] = {BM_V_DRUM_N, 6, 1, 1, 6, 4, 6}; +static const uint8_t VCAP[ENG_COUNT] = {BM_V_DRUM_N, 6, 1, 1, 8, 4, 6}; /* BX-7: 8 voces (2026-10-21) */ bm_voice *bm_voice_get(bm_ctx *c, int track, uint8_t note, uint8_t vel, const uint8_t lk[4], uint8_t legato) { @@ -125,7 +125,33 @@ static void take_locks(bm_engine *e, uint8_t lk[4]) static void common_init(bm_engine *e) { for (int i = 0; i < 4; i++) e->lock_next[i] = BM_LOCK_NONE; - e->legato_next = 0; + e->legato_next = 0; e->live_next = 0; e->nheld = 0; + e->lfo_s = 0.5f; e->lfo_g = 1.0f; +} + +/* Las teclas sostenidas de una máquina de una voz (la última arriba). Si la pista no tiene ninguna + * voz con la tecla apretada, lo que quedó es de antes (un STOP, un cambio de patrón): se vacía. */ +static void held_on(bm_engine *e, uint8_t note, bool gated) +{ + if (!gated) e->nheld = 0; + for (int i = 0; i < e->nheld; i++) + if (e->held[i] == note) { memmove(&e->held[i], &e->held[i + 1], (size_t)(e->nheld - i - 1)); e->nheld--; break; } + if (e->nheld >= 8) { memmove(&e->held[0], &e->held[1], 7); e->nheld = 7; } + e->held[e->nheld++] = note; +} + +/* soltar: la que queda arriba es la que sigue sonando (0xFF: ninguna) */ +static int held_off(bm_engine *e, uint8_t note) +{ + for (int i = 0; i < e->nheld; i++) + if (e->held[i] == note) { memmove(&e->held[i], &e->held[i + 1], (size_t)(e->nheld - i - 1)); e->nheld--; break; } + return e->nheld ? e->held[e->nheld - 1] : 0xFF; +} + +static bool track_gated(const bm_ctx *c, int t) +{ + for (int i = 0; i < BM_VOICES; i++) if (c->voice[i].active && c->voice[i].track == t && c->voice[i].gate && !c->voice[i].fade) return true; + return false; } static void common_set_macro(bm_engine *e, uint8_t id, uint8_t val) @@ -158,6 +184,38 @@ static void acid_par(const bm_ctx *c, const bm_voice *v, const bm_track *t, int { p->cut = eff(v, t, 0); p->res = eff(v, t, 1); p->env = eff(v, t, 2); p->dec = eff(v, t, 3); p->acc = t->accent; p->slide = t->glide; p->wave = c->pat->prm[track][AC_WAVE] & 1; + p->lfo_oct = 0.0f; p->lfo_fm = 1.0f; p->amp0 = p->amp1 = 1.0f; +} + +/* El LFO del canal, una vez por bloque: al compás (sonando, desde el PLAY; parado, el reloj libre), con + * su fase dentro del tick. El valor se suaviza un poco (los patrones de pasos no hacen clic). */ +typedef struct { float oct, fm, amp0, amp1; int res; } acid_mod; + +static void acid_lfo(bm_engine *e, acid_mod *m) +{ + bm_ctx *c = e->ctx; + const uint8_t *prm = c->pat->prm[e->track]; + float d = (float)prm[AC_LFO_DEPTH] * (1.0f / 127.0f); + m->oct = 0.0f; m->fm = 1.0f; m->amp0 = m->amp1 = 1.0f; m->res = 0; + if (d <= 0.0f) { e->lfo_s = 0.5f; e->lfo_g = 1.0f; return; } + uint32_t per = bm_acid_lfo_ticks[prm[AC_LFO_RATE] % AC_LFO_RATES]; + uint32_t pos = c->playing ? c->btick : c->st.free_ticks; + float frac = c->spt_q16 ? (float)c->acc_q16 / (float)c->spt_q16 : 0.0f; + if (frac > 1.0f) frac = 1.0f; + float ph = ((float)(pos % per) + frac) / (float)per; + float u = bm_acid_lfo_shape(prm[AC_LFO_WAVE] % ACW_N, ph >= 1.0f ? 0.9999f : ph, pos / per); + e->lfo_s += 0.5f * (u - e->lfo_s); + float b = 2.0f * e->lfo_s - 1.0f; /* -1..1 alrededor de la perilla */ + switch (prm[AC_LFO_DEST] % ACL_DESTS) { + case ACL_PITCH: m->fm = exp2f(d * b); break; /* hasta una octava */ + case ACL_RESO: m->res = (int)(d * b * 127.0f); break; + case ACL_VOLUME: { + float g = 1.0f - d * (1.0f - e->lfo_s); /* de la perilla para abajo: PUMP y GATE cortan */ + m->amp0 = e->lfo_g; m->amp1 = g; e->lfo_g = g; + break; + } + default: m->oct = 2.0f * d * b; break; /* CUTOFF: hasta dos octavas para cada lado */ + } } static void acid_voice_start(bm_engine *e, bm_voice *v, uint8_t note, uint8_t vel, const uint8_t lk[4], uint8_t legato) @@ -184,11 +242,13 @@ static void acid_note_on(bm_engine *e, uint8_t note, uint8_t vel) bm_ctx *c = e->ctx; uint8_t lk[4]; take_locks(e, lk); - uint8_t legato = e->legato_next; + /* SLIDE: del secuenciador, solo el paso con TIE; del teclado, tocar ligado (la anterior sigue apretada) */ + uint8_t slide = e->legato_next; e->legato_next = 0; + held_on(e, note, track_gated(c, e->track)); for (int i = 0; i < BM_VOICES; i++) { /* mono: la misma voz */ bm_voice *v = &c->voice[i]; - if (v->active && v->track == e->track && !v->fade) { acid_voice_start(e, v, note, vel, lk, legato && v->gate); return; } + if (v->active && v->track == e->track && !v->fade) { acid_voice_start(e, v, note, vel, lk, (slide || e->live_next) && v->gate); return; } } bm_voice *v = bm_voice_get(c, e->track, note, vel, lk, 0); if (v) acid_voice_start(e, v, note, vel, lk, 0); @@ -201,12 +261,16 @@ static bool acid_process(bm_engine *e, int32_t *buf, uint16_t frames) bool any = false; static float tmp2[2][BM_BLOCK]; float *tmp = tmp2[c->par_on ? (c->par_mask >> e->track) & 1 : 0]; + acid_mod m; + acid_lfo(e, &m); for (int vi = 0; vi < BM_VOICES; vi++) { bm_voice *v = &c->voice[vi]; if (!v->active || v->track != e->track) continue; any = true; bm_acid_par p; acid_par(c, v, t, e->track, &p); + if (m.res) p.res = (uint8_t)bm_clampi((int)p.res + m.res, 0, 127); + p.lfo_oct = m.oct; p.lfo_fm = m.fm; p.amp0 = m.amp0; p.amp1 = m.amp1; int alive = bm_acid_render(vi, &p, tmp, frames); if (alive < 0) { c->st.nan_fix++; alive = 0; } if (!v->fade) for (uint16_t i = 0; i < frames; i++) buf[i] += (int32_t)(tmp[i] * 32768.0f); @@ -568,6 +632,7 @@ static void wv_voice_start(bm_engine *e, bm_voice *v, uint8_t note, uint8_t vel, v->stage = ENV_ATK; v->fade = 0; v->pend = 0; v->age = ++c->age; v->env = 1 << 30; uint8_t m[4]; wv_macros(v, t, m); + if (t->engine == ENG_BUNO && !track_gated(c, e->track)) e->lfo_restart = 1; /* (el LFO: su retardo vuelve a empezar) */ bm_wv_start((int)(v - c->voice), t->engine, c->pat->prm[e->track], m, note_of(c, t, note), vel / 127.0f, legato); } @@ -587,6 +652,7 @@ static void wv_note_on(bm_engine *e, uint8_t note, uint8_t vel) uint8_t tie = e->legato_next; e->legato_next = 0; int mode = wv_mode(c, e->track); + if (mode != WM_POLY) held_on(e, note, track_gated(c, e->track)); if (mode != WM_POLY) { /* una voz: la que suena, si hay */ bm_voice *best = NULL; for (int i = 0; i < BM_VOICES; i++) { @@ -594,7 +660,7 @@ static void wv_note_on(bm_engine *e, uint8_t note, uint8_t vel) if (v->active && v->track == e->track && !v->fade && (!best || v->gate > best->gate || v->age > best->age)) best = v; } if (best) { - int leg = best->gate && (mode == WM_LEGATO || tie) ? 1 : 2; + int leg = best->gate && (mode == WM_LEGATO || tie) ? (tie ? 3 : 1) : 2; /* 3: ligada por el paso */ wv_voice_start(e, best, note, vel, lk, (uint8_t)leg); return; } @@ -606,10 +672,12 @@ static void wv_note_on(bm_engine *e, uint8_t note, uint8_t vel) static void wv_note_off(bm_engine *e, uint8_t note) { bm_ctx *c = e->ctx; + int back = wv_mode(c, e->track) != WM_POLY ? held_off(e, note) : 0xFF; for (int i = 0; i < BM_VOICES; i++) { bm_voice *v = &c->voice[i]; if (v->pend && v->pend_track == e->track && v->pend_note == note) v->pend = 0; if (v->active && v->track == e->track && v->note == note && v->gate) { + if (back != 0xFF) { wv_voice_start(e, v, (uint8_t)back, v->vel, v->lk, 1); continue; } /* a la que sigue apretada, ligada */ v->gate = 0; v->stage = ENV_REL; bm_wv_release(i); } @@ -635,6 +703,7 @@ static bool wv_process(bm_engine *e, int32_t *buf, uint16_t frames) for (int i = 0; i < 4; i++) locks |= v->lk[i] != BM_LOCK_NONE; } if (t->engine == ENG_BUNO && !locks && bm_wv_para(prm, t->macro)) flags = WV_PARA; + if (t->engine == ENG_MINI || t->engine == ENG_BUNO) { bm_wv_lfo(e->track, t->engine, prm, frames, lane, e->lfo_restart); e->lfo_restart = 0; } if (t->engine == ENG_BITTAL && nv > 1) flags = WV_READERS_ALL / nv; for (int vi = 0; vi < BM_VOICES; vi++) { bm_voice *v = &c->voice[vi]; @@ -664,66 +733,61 @@ static void wv_init(bm_engine *e) { common_init(e); } const bm_engine_vt bm_eng_wave = {wv_init, wv_note_on, wv_note_off, common_set_macro, wv_process, wv_voice_start}; static void acid_note_off(bm_engine *e, uint8_t note) { + bool cur = false; + for (int i = 0; i < BM_VOICES; i++) cur |= e->ctx->voice[i].active && e->ctx->voice[i].track == e->track && e->ctx->voice[i].note == note && e->ctx->voice[i].gate; + if (!cur) held_off(e, note); bm_ctx *c = e->ctx; for (int i = 0; i < BM_VOICES; i++) { bm_voice *v = &c->voice[i]; if (v->pend && v->pend_track == e->track && v->pend_note == note) v->pend = 0; - if (v->active && v->track == e->track && v->note == note && v->gate) { v->gate = 0; v->stage = ENV_REL; bm_acid_release(i); } + if (v->active && v->track == e->track && v->note == note && v->gate) { + int back = held_off(e, note); + if (back != 0xFF) { acid_voice_start(e, v, (uint8_t)back, v->vel, v->lk, 1); continue; } /* vuelve deslizando a la que sigue apretada */ + v->gate = 0; v->stage = ENV_REL; bm_acid_release(i); + } } } const bm_engine_vt bm_eng_acid = {acid_init, acid_note_on, acid_note_off, common_set_macro, acid_process, acid_voice_start}; /* ------------------------------------------------------------ FM: 6 operadores (msfa, core/bm_fm.cpp) - * El patch de fábrica (PRESETS) y encima las macros, con 64 = el patch tal cual: - * MOD LVL nivel de los moduladores (±32) FEEDBACK realimentación (±4) - * DECAY tiempos de caída (R2-R3) de todos RELEASE la salida (R4) de todos - * Encima también los ajustes del canal: el algoritmo (FX_ALG, 0 = el del patch), el LFO (FX_L*, 0 = - * el del patch) y R1 ATK (attack del canal). Polifónico; una nota con LIGA sigue con glide (PORTA). */ + * BX-7: la voz del patrón (pat->fmv: PRESETS la carga, las páginas la editan) y encima BRIGHT y la + * página ENV (bm_fm_patch_of). Polifónico; una nota con LIGA sigue con glide (PORTA). */ static uint8_t fm_m(const bm_voice *v, const bm_track *t, int i) { return v ? eff(v, t, i) : t->macro[i]; } -int bm_fm_alg_of(const bm_track *t, const uint8_t *prm) -{ - int a = prm[FX_ALG]; - return a >= 1 && a <= 32 ? a : bm_fm_patch(t->source)[BM_FM_ALG] % 32 + 1; -} - -int bm_fm_fb_of(const bm_track *t, int m2) -{ - return bm_clampi(bm_fm_patch(t->source)[BM_FM_FB] + (m2 - 64) / 16, 0, 7); -} +int bm_fm_alg_of(const bm_pattern *pat) { return pat->fmv[BM_FM_ALG] % 32 + 1; } -void bm_fm_patch_of(const bm_track *t, const uint8_t *prm, const bm_voice *v, uint8_t *p) +/* 2026-10-21: la base es la voz del patrón (pat->fmv, editable como en el FM-1: algoritmo, + * feedback, LFO y cada operador van directo ahí). Encima, la página ENV y BRIGHT, con 64 = la voz + * tal cual: BRIGHT (macro 0) los niveles de los moduladores, ATTACK (attack del canal) el R1 de + * todos, DECAY (macro 2) R2-R3, SUSTAIN (sustain del canal) el L3 de las portadoras y RELEASE + * (macro 3) el R4. */ +void bm_fm_patch_of(const bm_pattern *pat, int track, const bm_voice *v, uint8_t *p) { - memcpy(p, bm_fm_patch(t->source), BM_FM_PATCH); - int m1 = fm_m(v, t, 0), m2 = fm_m(v, t, 1), m3 = fm_m(v, t, 2), m4 = fm_m(v, t, 3); - p[BM_FM_ALG] = (uint8_t)(bm_fm_alg_of(t, prm) - 1); - p[BM_FM_FB] = (uint8_t)bm_fm_fb_of(t, m2); - for (int i = 0; i < 4; i++) if (prm[FX_LSPD + i]) p[137 + i] = (uint8_t)bm_clampi(prm[FX_LSPD + i] - 1, 0, 99); /* LFS LFD LPMD LAMD */ - if (prm[FX_LPMD] > 1 && !(p[143] & 7)) p[143] = 3; /* PMD sin sensibilidad en el patch: una media */ + const bm_track *t = &pat->trk[track]; + memcpy(p, pat->fmv, BM_FM_PATCH); + int m1 = fm_m(v, t, 0), m3 = fm_m(v, t, 2), m4 = fm_m(v, t, 3); + p[BM_FM_ALG] %= 32; p[BM_FM_FB] &= 7; uint8_t car = bm_fm_carriers(p[BM_FM_ALG]); - int dec = (m3 - 64) / 3, atk = t->attack * 70 / 127, rel = (m4 - 64) / 2; + int dec = (m3 - 64) / 3, atk = t->attack * 70 / 127, rel = (m4 - 64) / 2, sus = ((int)t->sustain - 64) * 3 / 4; for (int op = 0; op < 6; op++) { uint8_t *o = p + op * BM_FM_OP; if (!(car & (1u << op))) o[FMO_OL] = (uint8_t)bm_clampi(o[FMO_OL] + (m1 - 64) / 2, 0, 99); - else if (prm[FX_LAMD] > 1 && !o[FMO_AMS]) o[FMO_AMS] = 2; /* AMD: las portadoras lo sienten */ - o[FMO_R2] = (uint8_t)bm_clampi(o[FMO_R2] - dec, 1, 99); - o[FMO_R3] = (uint8_t)bm_clampi(o[FMO_R3] - dec, 1, 99); - o[FMO_R4] = (uint8_t)bm_clampi(o[FMO_R4] - dec - rel, 1, 99); + else if (sus) o[FMO_L3] = (uint8_t)bm_clampi(o[FMO_L3] + sus, 0, 99); + if (dec) { o[FMO_R2] = (uint8_t)bm_clampi(o[FMO_R2] - dec, 1, 99); o[FMO_R3] = (uint8_t)bm_clampi(o[FMO_R3] - dec, 1, 99); } + if (dec || rel) o[FMO_R4] = (uint8_t)bm_clampi(o[FMO_R4] - dec - rel, 1, 99); /* en 64: la voz tal cual (un rate 0 sigue en 0) */ if (atk) o[FMO_R1] = (uint8_t)bm_clampi(o[FMO_R1] < 99 - atk ? o[FMO_R1] : 99 - atk, 1, 99); } } -static uint32_t fm_sig(const bm_voice *v, const bm_track *t, const uint8_t *prm) +static uint32_t fm_sig(const bm_ctx *c, const bm_voice *v, const bm_track *t) { - uint32_t h = (uint32_t)(t->source ^ t->attack) + 31u * prm[FX_ALG]; - for (int i = 0; i < 4; i++) h = h * 31u + prm[FX_LSPD + i]; - return (uint32_t)fm_m(v, t, 0) | (uint32_t)fm_m(v, t, 1) << 7 | (uint32_t)fm_m(v, t, 2) << 14 | (uint32_t)fm_m(v, t, 3) << 21 - | (h & 15u) << 28; + uint32_t h = (uint32_t)(t->source ^ t->attack ^ (t->sustain << 1)) + 31u * c->fmv_gen; + return (uint32_t)fm_m(v, t, 0) | (uint32_t)fm_m(v, t, 2) << 7 | (uint32_t)fm_m(v, t, 3) << 14 | (h & 0x3FFu) << 21; } static int fm_note(const bm_ctx *c, const bm_track *t, uint8_t note) { - return bm_clampi(note + (int)t->transpose - 24 + (int)c->pat->meta.transpose - 24, 0, 127); + return bm_clampi(note + (int)t->transpose - 24 + (int)c->pat->meta.transpose - 24 + (int)(c->pat->fmv[BM_FM_TRSP] % 49) - 24, 0, 127); /* + TRANSPOSE de la voz (DX7: 24 = C3) */ } static void fm_voice_start(bm_engine *e, bm_voice *v, uint8_t note, uint8_t vel, const uint8_t lk[4], uint8_t legato) @@ -735,8 +799,8 @@ static void fm_voice_start(bm_engine *e, bm_voice *v, uint8_t note, uint8_t vel, int glide = legato && v->active && v->track == e->track && v->gate && !v->fade; int from = glide ? fm_note(c, t, v->note) : fm_note(c, t, note); memcpy(v->lk, lk, 4); - bm_fm_patch_of(t, c->pat->prm[e->track], v, p); - v->ic1 = (int32_t)fm_sig(v, t, c->pat->prm[e->track]); + bm_fm_patch_of(c->pat, e->track, v, p); + v->ic1 = (int32_t)fm_sig(c, v, t); if (glide) { /* ligado: cambia de nota sin redisparar */ v->note = note; v->vel = vel; bm_fm_update(vi, p, fm_note(c, t, note), vel, t->glide); @@ -754,6 +818,19 @@ static void fm_note_on(bm_engine *e, uint8_t note, uint8_t vel) take_locks(e, lk); uint8_t legato = e->legato_next; e->legato_next = 0; + if (c->pat->prm[e->track][BX_MONO]) { /* MONO (EDIT): una voz; con otra sostenida, sigue con glide */ + bm_voice *last = NULL; + for (int i = 0; i < BM_VOICES; i++) { + bm_voice *v = &c->voice[i]; + if (!v->active || v->track != e->track || v->fade) continue; + if (v->gate && (!last || v->age > last->age)) last = v; + } + for (int i = 0; i < BM_VOICES; i++) { /* las que quedan sonando (soltadas) se cortan */ + bm_voice *v = &c->voice[i]; + if (v != last && v->active && v->track == e->track && !v->fade) { v->gate = 0; v->stage = ENV_REL; bm_fm_release(i); } + } + if (last) { fm_voice_start(e, last, note, vel, lk, 1); return; } + } if (legato) { /* LIGA: la última voz sigue con glide (PORTA) */ bm_voice *last = NULL; for (int i = 0; i < BM_VOICES; i++) { @@ -789,10 +866,10 @@ static bool fm_process(bm_engine *e, int32_t *buf, uint16_t frames) bm_voice *v = &c->voice[vi]; if (!v->active || v->track != e->track) continue; any = true; - uint32_t sig = fm_sig(v, t, c->pat->prm[e->track]); + uint32_t sig = fm_sig(c, v, t); if ((int32_t)sig != v->ic1) { /* se movió una perilla: el patch cambia en vivo */ uint8_t p[BM_FM_PATCH]; - bm_fm_patch_of(t, c->pat->prm[e->track], v, p); + bm_fm_patch_of(c->pat, e->track, v, p); bm_fm_update(vi, p, fm_note(c, t, v->note), v->vel, -1); v->ic1 = (int32_t)sig; } diff --git a/core/bm_fm.cpp b/core/bm_fm.cpp index 2c1c2b8..dd2f25f 100644 --- a/core/bm_fm.cpp +++ b/core/bm_fm.cpp @@ -149,6 +149,7 @@ void bm_fm_start(int v, int t, const uint8_t *patch, int note, int vel, int src, z.alg = patch[BM_FM_ALG] & 31; z.gain = gain_for(z.alg); z.note.init(patch, note, vel, src, porta, &ctl(t)); + if (patch[136]) z.note.oscSync(); /* OSC KEY SYNC: la fase vuelve a 0 en cada nota (como Dexed) */ z.lfo.reset(patch + 137); z.lfo.keydown(); z.pos = _N_; @@ -163,6 +164,7 @@ void bm_fm_update(int v, const uint8_t *patch, int note, int vel, int porta) z.alg = patch[BM_FM_ALG] & 31; z.gain = gain_for(z.alg); z.note.update(patch, note, vel, porta, &ctl(z.track)); + z.lfo.reset(patch + 137); /* el LFO editado llega a lo que suena (no toca la fase) */ } void bm_fm_release(int v) diff --git a/core/bm_gesture.c b/core/bm_gesture.c index 87b1913..9d2e742 100644 --- a/core/bm_gesture.c +++ b/core/bm_gesture.c @@ -15,16 +15,19 @@ void bm_gesture_init(bm_gesture *g, bm_gesture_cb cb, void *user) { memset(g, 0, sizeof *g); g->cb = cb; g->user = user; - for (int i = 0; i < BTN_COUNT; i++) cfg(g, i, 1, 1, 0, 1, 0); /* toque + capa al mantener */ + /* 1.0: solo SCL, EDIT, ENV y LFO tienen capa (dentro del secuenciador de la batería; REPETIR va en + * la negra 11). Los demás son de un toque, sin importar cuánto dure. */ + for (int i = 0; i < BTN_COUNT; i++) cfg(g, i, 0, 0, 0, 1, 0); + cfg(g, BTN_SCL, 1, 1, 0, 1, 0); /* capa MUTE (silenciar sonidos) */ + cfg(g, BTN_EDIT, 1, 1, 0, 1, 0); /* capa INSTRUMENTO (modelo) */ + cfg(g, BTN_ENV, 1, 1, 0, 1, 0); /* capa SONIDO (golpe) */ + cfg(g, BTN_LFO, 1, 1, 0, 1, 0); /* capa ACENTOS */ cfg(g, BTN_PLAY, 0, 0, 1, 0, 0); cfg(g, BTN_OCT_DN, 0, 0, 1, 0, 0); cfg(g, BTN_OCT_UP, 0, 0, 1, 0, 0); - cfg(g, BTN_HOME, 1, 1, 0, 1, UI_LONG_MS); /* capa CONTROLADOR · 2 s: SISTEMA */ - cfg(g, BTN_SEQ, 1, 1, 0, 1, UI_LONG_MS); /* capa LARGO Y VELOCIDAD · 2 s: TIEMPO */ - cfg(g, BTN_EDIT, 1, 1, 0, 1, UI_LONG_MS); /* capa BORRAR · 2 s: TOMAS / SONIDO INICIAL */ - cfg(g, BTN_SAVE, 1, 1, 0, 1, UI_LONG_MS); /* capa COPIAR PATRON · 2 s: guardado rápido */ - /* REC: mantener = grabar mientras. Sin 2 s fijos: bm_app_button los pide al bajar con - * bm_gesture_set_long (LOOP: borrar el loop; en un canal sin grabar nada: borrar la pista). */ + cfg(g, BTN_HOME, 0, 0, 0, 1, UI_LONG_MS); /* 2 s: SISTEMA */ + cfg(g, BTN_SAVE, 0, 0, 0, 1, UI_LONG_MS); /* 2 s: guardado rápido */ + cfg(g, BTN_REC, 0, 0, 0, 1, UI_LONG_MS); /* 2 s en la BX-7: borra las notas del canal */ } void bm_gesture_set_long(bm_gesture *g, int id, uint16_t long_ms) diff --git a/core/bm_input.c b/core/bm_input.c index 574650c..d3cf767 100644 --- a/core/bm_input.c +++ b/core/bm_input.c @@ -1,112 +1,33 @@ /* SPDX-License-Identifier: GPL-3.0-or-later * Copyright (C) 2026 Erbubar23 */ -/* Bubba Machine — entrada (DISENO_3.0): cuatro gestos por botón, HOME en todas partes, - * ALGORITHM que navega, teclas por página y capas, perillas y su leyenda. */ +/* Bubba Machine — entrada (1.0, etapa 1): HOME es el mezclador de 6 canales y todo su teclado, sus + * botones y sus perillas son de la consola. PLAY/REC es HOME con el teclado tocando el canal del cursor. + * La batería tiene su secuenciador (V_CH); las demás máquinas solo se asignan y se tocan. */ #include #include #include -#include "bm_app_int.h" +#include "bm_mach.h" #include "bm_util.h" #include "bm_rom.h" #include "bm_params.h" #include "bm_drums.h" #include "bm_snap.h" -#include "bm_fm.h" - -static const char *const MAC_TR[4] = {"TONE", "TUNE", "DECAY", "COLOR"}; -static const char *const GEN_NAMES[4] = {"VARY", "ANCHOR", "REPEAT", "BREAK"}; -static const char *const MAC_PAD[4] = {"FILTER", "PITCH", "DECAY", "START"}; -static const char *const DLY_NAMES[4] = {"1/16", "1/8", "3/16", "1/4"}; -static const char *const EXT_NAMES[5] = {"TRIAD", "+7", "+9", "SUS2", "SUS4"}; -static const char *const ARP_MODES[5] = {"OFF", "UP", "DOWN", "UP-DN", "RAND"}; -static const char *const ARP_RATES[3] = {"1/8", "1/16", "1/32"}; -static const char *const VOICINGS[3] = {"CLOSED", "OPEN", "LED"}; + static const char *const RAT_NAMES[5] = {"X1", "X2", "X3", "X4", "FLAM"}; -static const char *const COND_NAMES[3] = {"ALWAYS", "FILL ONLY", "NO FILL"}; -static const char *const SNAP_NAMES[3] = {"OFF", "1/16", "1/8"}; -static const char *const PUNCH_NAMES[16] = {"S4", "S8", "S16", "S32", "R8", "R4", "TAPE", "GATE", "LPF", "HPF", "BIT", "SR", "DLY", "ECHO", "K-LO", "K-HI"}; -enum { ROLE_NONE, ROLE_MUTE, ROLE_FILL, ROLE_PAT, ROLE_SCENE, ROLE_BRKFX, ROLE_LMUTE, ROLE_NOTE, ROLE_FILLK, ROLE_PAD, ROLE_PREVIEW, ROLE_CMOD, - ROLE_CHAN, /* blanca 11-16 en la consola: el cursor; sostenida, la tarjeta del canal */ - ROLE_CUE, /* negra 11 en la consola */ - ROLE_HILO, /* negra 11 en la batería y los pads: toque HI/LO, sostenida MUTE de instrumentos */ - ROLE_ACC, /* negra 1 en SLOOP (batería y pads): los golpes que suenan mientras la sostienes, con acento */ - ROLE_SCNDONE }; /* tecla de escena que ya hizo lo suyo (cadena o guardada a los 2 s): soltarla no hace nada */ +#define SCENE_B0 7 /* las escenas A-D: negras 8-11 (la 7 sin función) */ +enum { ROLE_NONE, ROLE_MUTE, ROLE_PAT, ROLE_PATUSED, ROLE_SCENE, ROLE_SCNDONE, ROLE_CHAN, ROLE_SOLOADD, ROLE_PAD, ROLE_LREP }; -static bool console(const bm_app *a) { return a->view == V_HOME || a->view == V_FXG || a->view == V_GLO; } +static bool console(const bm_app *a) { return a->view == V_HOME || a->view == V_GLO; } -const char *bm_macro_name(const bm_app *a, int t, int i) -{ - if (t == 1) return MAC_PAD[i & 3]; - if (bm_is_tr(&a->pat, t)) return MAC_TR[i & 3]; - if (a->pat.trk[t].engine == ENG_BITTAL) { /* la macro dice a dónde va */ - int dst = a->pat.prm[t][BT_M1D + 2 * (i & 3)]; - return dst ? bm_btm_names[dst % BTM_TARGETS] : "MACRO"; - } - const bm_pdef *d = bm_engine_macro(a->pat.trk[t].engine, i); /* el nombre de su página */ - return d ? d->name : "MACRO"; -} +/* La batería (T1) es la única máquina con secuenciador propio */ +static bool drums_track(const bm_app *a, int t) { return bm_is_tr(&a->pat, t); } /* ------------------------------------------------------------ formato */ -static void fmt_ms(uint32_t ms, char *b, int cap) -{ - if (ms >= 1000) snprintf(b, (size_t)cap, "%u.%uS", (unsigned)(ms / 1000), (unsigned)((ms % 1000) / 100)); - else snprintf(b, (size_t)cap, "%uMS", (unsigned)ms); -} - -static void fmt_hz(uint32_t hz, char *b, int cap) -{ - if (hz >= 1000) snprintf(b, (size_t)cap, "%u.%02uK", (unsigned)(hz / 1000), (unsigned)((hz % 1000) / 10)); - else snprintf(b, (size_t)cap, "%uHZ", (unsigned)hz); -} - static void fmt_pct(int v, char *b, int cap) { snprintf(b, (size_t)cap, "%d%%", v * 100 / 127); } -static void fmt_pan(int v, char *b, int cap) -{ - if (v == 64) snprintf(b, (size_t)cap, "C"); - else if (v < 64) snprintf(b, (size_t)cap, "L%d", (64 - v) * 50 / 64); - else snprintf(b, (size_t)cap, "R%d", (v - 64) * 50 / 63); -} - -static void fmt_master(int m, char *b, int cap) -{ - if (!m) snprintf(b, (size_t)cap, "INF"); - else snprintf(b, (size_t)cap, "%d", m * 16); -} - -static void fmt_semi(int v, char *b, int cap) { snprintf(b, (size_t)cap, "%+d ST", v - 24); } - -void bm_fmt_macro(const bm_app *a, int t, int i, int v, char *b, int cap) -{ - if (t == 1) { /* pads: FILTER PITCH DECAY START */ - if (i == 1) snprintf(b, (size_t)cap, "%+d ST", (v - 64) * 12 / 63); - else if ((i == 0 || i == 2) && v >= 127) snprintf(b, (size_t)cap, "OFF"); - else fmt_pct(v, b, cap); - return; - } - if (bm_is_tr(&a->pat, t)) { /* batería: 64 = el kit tal cual */ - if (i == 1) snprintf(b, (size_t)cap, "%+d ST", ((v - 64) * 3) / 8); - else snprintf(b, (size_t)cap, "%+d", v - 64); - return; - } - if (bm_engine_paged(a->pat.trk[t].engine)) { /* la definición de la macro en sus páginas */ - if (a->pat.trk[t].engine == ENG_FM && (i & 3) == 1) { snprintf(b, (size_t)cap, "FB %d", bm_fm_fb_of(&a->pat.trk[t], v)); return; } - const bm_pdef *d = bm_engine_macro(a->pat.trk[t].engine, i); - if (d) bm_prm_fmt(d, v, b, cap); else fmt_pct(v, b, cap); - return; - } - switch (i) { - case 0: fmt_hz(bm_cutoff_hz(v), b, cap); break; - case 1: fmt_pct(v, b, cap); break; - case 2: fmt_ms(bm_decay_ms(v), b, cap); break; - default: fmt_pct(v, b, cap); break; - } -} - -static bool lock_mode(const bm_app *a) { return a->held_step >= 0 && a->held_long; } static int tr_lane(const bm_app *a) { return a->sel_lane[a->track] & 15; } -static int seq_page(const bm_app *a) { return a->view == V_CH && a->page == PG_SEQ; } +static bool seq_page(const bm_app *a) { return a->view == V_CH; } /* Perillas: `d` llega acelerado (para 0..127 y el BPM); las listas, los largos y los pasos usan los * detents tal cual (lst): uno por detent, ninguno se pierde ni se salta. Fuera de un giro (o si el @@ -119,17 +40,7 @@ static int lst(const bm_app *a, int d) } static int wrap(int v, int n) { return n > 0 ? ((v % n) + n) % n : 0; } - -/* ¿una nota larga que empezó antes sigue sonando en el paso s? */ -static int note_covers(const bm_app *a, int t, int s) -{ - for (int b = 1; b < BM_STEPS && b <= s; b++) - for (int k = 0; k < BM_EVENTS; k++) { - const bm_event *e = bm_evc(&a->pat, t, s - b, k); - if (!bm_event_empty(e) && (int)(e->len & BM_LEN_MASK) > b) return 1; - } - return 0; -} +int app_lst(const bm_app *a, int d) { return lst(a, d); } static int syn_step_events(const bm_app *a, int t, int s, int idx[4]) { @@ -139,103 +50,10 @@ static int syn_step_events(const bm_app *a, int t, int s, int idx[4]) return n; } -/* ------------------------------------------------------------ GLO de la máquina (0.9: MORE adentro) - * Notas: VIEW, LENGTH, SPEED, TRANSPOSE, ACCENT, MIDI OUT (y su canal), INIT SOUND · BR-8: LENGTH, - * SPEED, ACCENT, INIT KIT · BP-1: LENGTH, SPEED, ACCENT, INTERPOLATION, INIT. */ -enum { ROW_VIEW, ROW_ACC, ROW_LEN, ROW_SPEED, ROW_TRANSP, ROW_MIDIOUT, ROW_MIDICH, ROW_INTERP, ROW_INIT }; - -static int more_rows(const bm_app *a, int t, uint8_t out[10]) -{ - int n = 0, note = app_kind(a, t) == KIND_NOTE; - if (note) out[n++] = ROW_VIEW; - out[n++] = ROW_LEN; out[n++] = ROW_SPEED; - if (note) out[n++] = ROW_TRANSP; - out[n++] = ROW_ACC; - if (note) { out[n++] = ROW_MIDIOUT; if (a->pat.trk[t].midi_out) out[n++] = ROW_MIDICH; } - if (t == 1) out[n++] = ROW_INTERP; - out[n++] = ROW_INIT; - return n; -} - -static const char *const ROW_NAMES[] = {"VIEW", "ACCENT", "LENGTH", "SPEED", "TRANSPOSE", "MIDI OUT", "MIDI CHANNEL", "INTERPOLATION", "INIT SOUND"}; - -void bm_app_more_row(const bm_app *a, int i, const char **name, char *val, int cap) -{ - uint8_t rows[10]; - int n = more_rows(a, a->track, rows), t = a->track; - const bm_track *tk = &a->pat.trk[t]; - val[0] = 0; - if (i < 0 || i >= n) { *name = ""; return; } - *name = ROW_NAMES[rows[i]]; - switch (rows[i]) { - case ROW_VIEW: snprintf(val, (size_t)cap, "%s", bm_app_roll_view(a, t) ? "PIANO ROLL" : "NOTES"); break; - case ROW_INIT: *name = bm_is_tr(&a->pat, t) ? "INIT KIT" : t == 1 ? "INIT" : "INIT SOUND"; snprintf(val, (size_t)cap, "TURN"); break; - case ROW_ACC: fmt_pct(tk->accent, val, cap); break; - case ROW_LEN: snprintf(val, (size_t)cap, TF("%d STEPS"), bm_trk_len(&a->pat, t, bm_is_grid(&a->pat, t) ? 0 : -1)); break; - case ROW_SPEED: snprintf(val, (size_t)cap, "%s", bm_speed_names[tk->speed % SPD_COUNT]); break; - case ROW_TRANSP: fmt_semi(tk->transpose, val, cap); break; - case ROW_MIDICH: snprintf(val, (size_t)cap, "%d", tk->midi_ch + 1); break; - case ROW_MIDIOUT: snprintf(val, (size_t)cap, "%s", tk->midi_out ? "ON" : "OFF"); break; - case ROW_INTERP: snprintf(val, (size_t)cap, "%s", tk->interp ? "HERMITE" : "LINEAR"); break; - default: break; - } -} - -int bm_app_more_count(const bm_app *a) { uint8_t r[10]; return more_rows(a, a->track, r); } - -/* ------------------------------------------------------------ GLO de la consola (0.9) - * TEMPO: BPM SWING MASTER LENGTH TRANSPOSE AUTO FILL · MACHINES: T1-T6 (T3-T6 eligen, con la espera - * de 2 s) · SCALE: ROOT SCALE KEYS IN SCALE BASE CHORD · SONG: las entradas (su propia lista). */ -static const char *const FE_NAMES[4] = {"OFF", "EVERY 2", "EVERY 4", "EVERY 8"}; -static int fe_index(int fe) { return fe == 2 ? 1 : fe == 4 ? 2 : fe == 8 ? 3 : 0; } - -int bm_app_glo_count(const bm_app *a) -{ - switch (a->glo_page) { - case GP_TEMPO: return 5; - case GP_MACH: return BM_TRACKS; - case GP_SCALE: return 4; - default: return a->song.n; - } -} - -void bm_app_glo_row(const bm_app *a, int i, const char **name, char *val, int cap) -{ - const bm_meta *m = &a->pat.meta; - size_t n = (size_t)cap; - val[0] = 0; *name = ""; - switch (a->glo_page) { - case GP_TEMPO: { - static const char *const NM[5] = {"BPM", "SWING", "MASTER LENGTH", "TRANSPOSE", "AUTO FILL"}; - if (i < 0 || i >= 5) return; - *name = NM[i]; - if (i == 0) snprintf(val, n, "%d.%d", m->bpm_x10 / 10, m->bpm_x10 % 10); - else if (i == 1) snprintf(val, n, "%d%%", m->swing); - else if (i == 2) { if (m->master) snprintf(val, n, TF("%d STEPS"), m->master * 16); else snprintf(val, n, "INF"); } - else if (i == 3) fmt_semi(m->transpose, val, cap); - else snprintf(val, n, "%s", FE_NAMES[fe_index(m->fill_every)]); - return; - } - case GP_MACH: - if (i < 0 || i >= BM_TRACKS) return; - *name = bm_engine_names[a->pat.trk[i].engine % ENG_COUNT]; - snprintf(val, n, "%s", i < BM_TR_TRACKS ? "FIXED" : ""); - return; - case GP_SCALE: { - static const char *const NM[4] = {"ROOT", "SCALE", "KEYS IN SCALE", "BASE CHORD"}; - if (i < 0 || i >= 4) return; - *name = NM[i]; - if (i == 0) snprintf(val, n, "%s", bm_note_names[m->root % 12]); - else if (i == 1) snprintf(val, n, "%s", bm_scale_names[m->scale % BM_SCALES]); - else if (i == 2) snprintf(val, n, "%s", m->scale_lock ? "ON" : "OFF"); - else snprintf(val, n, "%s", EXT_NAMES[m->voicing % 5]); - return; - } - default: return; - } -} - /* ------------------------------------------------------------ leyenda de las perillas */ +static void L4(bm_legend *L, int i, const char *name, const char *val, int pct); +void app_layer_legend(const bm_app *a, bm_legend *L, int k, const char *name, const char *val, int pct) { (void)a; L4(L, k, name, val, pct); } + static void L4(bm_legend *L, int i, const char *name, const char *val, int pct) { snprintf(L[i].name, 10, "%s", name); @@ -243,430 +61,82 @@ static void L4(bm_legend *L, int i, const char *name, const char *val, int pct) L[i].pct = (uint8_t)bm_clampi(pct, 0, 255); } -/* GLO de la consola: K1-K4 = las filas de la página (las mismas que cambia ALGORITHM) */ -static void legend_glo(const bm_app *a, bm_legend *L) -{ - const bm_meta *m = &a->pat.meta; - char b[12]; - switch (a->glo_page) { - case GP_TEMPO: - snprintf(b, sizeof b, "%d.%d", m->bpm_x10 / 10, m->bpm_x10 % 10); L4(L, 0, "BPM", b, (m->bpm_x10 - 400) * 255 / 2000); - snprintf(b, sizeof b, "%d%%", m->swing); L4(L, 1, "SWING", b, (m->swing - 50) * 255 / 25); - fmt_master(m->master, b, sizeof b); L4(L, 2, "MASTER", b, m->master ? m->master * 31 : 255); - fmt_semi(m->transpose, b, sizeof b); L4(L, 3, "TRANSP", b, m->transpose * 5); - return; - case GP_SCALE: - L4(L, 0, "ROOT", bm_note_names[m->root % 12], m->root * 23); - snprintf(b, sizeof b, "%.8s", bm_scale_names[m->scale % BM_SCALES]); L4(L, 1, "SCALE", b, m->scale * 31); - L4(L, 2, "KEYS IN", m->scale_lock ? "ON" : "OFF", m->scale_lock ? 255 : 0); - L4(L, 3, "CHORD", EXT_NAMES[m->voicing % 5], m->voicing * 63); - return; - case GP_SONG: - if (a->song.n) { - uint8_t e = a->song.pat[a->song_cur % a->song.n]; - snprintf(b, sizeof b, "A%02d", bm_song_pat(e) + 1); L4(L, 0, "PATTERN", b, bm_song_pat(e) * 28); - snprintf(b, sizeof b, "x%d", a->song.rep[a->song_cur % a->song.n]); L4(L, 1, "TIMES", b, a->song.rep[a->song_cur % a->song.n] * 16); - } - L4(L, 3, "SONG", a->ctx.st.song_on ? "ON" : "OFF", a->ctx.st.song_on ? 255 : 0); - return; - default: return; /* MACHINES: solo SELECT y ALGORITHM */ - } -} - -static void legend_mix(const bm_app *a, int t, bm_legend *L) -{ - const bm_track *tr = &a->pat.trk[t]; - char b[12]; - if (a->mix_page && a->view == V_CH) { - if (t >= 1) { fmt_pct(tr->duck, b, sizeof b); L4(L, 0, "DUCK", b, tr->duck * 2); } else L4(L, 0, "DUCK", "SOURCE", 0); - return; - } - snprintf(b, sizeof b, "%d", tr->level); L4(L, 0, "LEVEL", b, tr->level * 2); - fmt_pan(tr->pan, b, sizeof b); L4(L, 1, "PAN", b, tr->pan * 2); - fmt_pct(tr->send, b, sizeof b); L4(L, 2, "DELAY", b, tr->send * 2); - fmt_pct(tr->rsend, b, sizeof b); L4(L, 3, "REVERB", b, tr->rsend * 2); -} - -/* HOME (BX-1): el canal del cursor y el master */ -static const char *const BEATFX_N[17] = {"OFF", "STUT 4", "STUT 8", "STUT 16", "STUT 32", "REV 8", "REV 4", "TAPE", "GATE", - "LPF", "HPF", "BIT", "SR", "THROW", "FREEZE", "KILL LO", "KILL HI"}; +/* HOME: el canal del cursor como una tira de mezclador (K1-K4 = VOLUME, FILTER, DELAY, REVERB) */ static void legend_home(const bm_app *a, bm_legend *L) { const bm_track *tr = &a->pat.trk[a->track]; - const bm_meta *m = &a->pat.meta; char b[12]; - (void)m; int p = !tr->djf || tr->djf == 64 ? 0 : tr->djf < 64 ? -(int)tr->djf : (int)tr->djf - 64; - snprintf(b, sizeof b, "%d", tr->level); L4(L, 0, "LEVEL", b, tr->level * 2); + fmt_pct(tr->level, b, sizeof b); L4(L, 0, "VOLUME", b, tr->level * 2); if (!p) snprintf(b, sizeof b, "OPEN"); else snprintf(b, sizeof b, "%s %d", p < 0 ? "LP" : "HP", p < 0 ? -p : p); L4(L, 1, "FILTER", b, (p + 64) * 2); fmt_pct(tr->send, b, sizeof b); L4(L, 2, "DELAY", b, tr->send * 2); fmt_pct(tr->rsend, b, sizeof b); L4(L, 3, "REVERB", b, tr->rsend * 2); } -/* La página del FX de la consola que mandan K1-K4 (con FX sostenido, el PUNCH: la del delay) */ -static int fx_kpage(const bm_app *a) { return a->layer == L_PUNCH ? FXP_DELAY : a->fx_page % FXP_COUNT; } - -static void legend_fx(const bm_app *a, bm_legend *L) -{ - const bm_meta *m = &a->pat.meta; - char b[12]; - int pg = fx_kpage(a); - if (pg == FXP_CHANNEL) { /* el canal del cursor: DRIVE PAN DUCK BEAT FX */ - const bm_track *tr = &a->pat.trk[a->track]; - if (tr->drive) fmt_pct(tr->drive, b, sizeof b); else snprintf(b, sizeof b, "OFF"); - L4(L, 0, "DRIVE", b, tr->drive * 2); - fmt_pan(tr->pan, b, sizeof b); L4(L, 1, "PAN", b, tr->pan * 2); - if (a->track) { fmt_pct(tr->duck, b, sizeof b); L4(L, 2, "DUCK", b, tr->duck * 2); } else L4(L, 2, "DUCK", "SOURCE", 0); - L4(L, 3, "BEAT FX", tr->bfx_off ? "OFF" : "ON", tr->bfx_off ? 0 : 255); - return; - } - if (pg == FXP_MASTER) { - if (m->mfilt >= 60 && m->mfilt <= 68) snprintf(b, sizeof b, "OPEN"); - else if (m->mfilt < 60) snprintf(b, sizeof b, "LP %d", m->mfilt); - else snprintf(b, sizeof b, "HP %d", m->mfilt - 64); - L4(L, 0, "MST FILT", b, m->mfilt * 2); - L4(L, 1, "BEAT FX", BEATFX_N[m->beatfx % 17], m->beatfx * 15); - fmt_pct(a->set.drive, b, sizeof b); L4(L, 2, "DRIVE", b, a->set.drive * 2); - return; - } - if (pg == FXP_REVERB) { - fmt_pct(m->rv_size, b, sizeof b); L4(L, 0, "SIZE", b, m->rv_size * 2); - fmt_pct(m->rv_damp, b, sizeof b); L4(L, 1, "DAMP", b, m->rv_damp * 2); - fmt_pct(m->rv_mix, b, sizeof b); L4(L, 2, "REV MIX", b, m->rv_mix * 2); - fmt_ms(bm_decay_ms(m->sc_release / 2), b, sizeof b); L4(L, 3, "SC REL", b, m->sc_release * 2); - return; - } - L4(L, 0, "DLY TIME", DLY_NAMES[m->dly_time & 3], (m->dly_time & 3) * 85); - fmt_pct(m->dly_fb, b, sizeof b); L4(L, 1, "FEEDBACK", b, m->dly_fb * 2); - fmt_pct(m->dly_mix, b, sizeof b); L4(L, 2, "DLY MIX", b, m->dly_mix * 2); - fmt_ms(bm_decay_ms(m->sc_release / 2), b, sizeof b); L4(L, 3, "SC REL", b, m->sc_release * 2); -} - -static void legend_macros(const bm_app *a, int t, bm_legend *L) -{ - const bm_track *tr = &a->pat.trk[t]; - char b[12]; - for (int i = 0; i < 4; i++) { bm_fmt_macro(a, t, i, tr->macro[i], b, sizeof b); L4(L, i, bm_macro_name(a, t, i), b, tr->macro[i] * 2); } -} - -static void legend_midi(const bm_app *a, int t, bm_legend *L) -{ - const bm_track *tr = &a->pat.trk[t]; - char b[12]; - snprintf(b, sizeof b, "%d", tr->midi_ch + 1); L4(L, 0, "CHANNEL", b, tr->midi_ch * 17); - snprintf(b, sizeof b, "%d", tr->macro[1] + 1); L4(L, 1, "PROG", b, tr->macro[1] * 2); - snprintf(b, sizeof b, "%d", tr->macro[2]); L4(L, 2, "CC1 MOD", b, tr->macro[2] * 2); - snprintf(b, sizeof b, "%d", tr->macro[3]); L4(L, 3, "CC74", b, tr->macro[3] * 2); -} - -static void legend_chords(const bm_app *a, bm_legend *L) -{ - const bm_meta *m = &a->pat.meta; - char b[12]; - snprintf(b, sizeof b, "%.8s", bm_chord_set_names[m->chord_set % BM_CHORD_SETS]); L4(L, 0, "SET", b, m->chord_set * 127); - snprintf(b, sizeof b, "%.8s", VOICINGS[m->chord_voicing % 3]); L4(L, 1, "VOICING", b, m->chord_voicing * 127); - snprintf(b, sizeof b, "%d", m->chord_oct); L4(L, 2, "OCTAVE", b, (m->chord_oct - 1) * 51); - snprintf(b, sizeof b, "%dMS", m->strum); L4(L, 3, "STRUM", b, m->strum * 4); -} - -static void legend_arp(const bm_app *a, int t, bm_legend *L) -{ - const bm_track *tr = &a->pat.trk[t]; - char b[12]; - L4(L, 0, "MODE", ARP_MODES[tr->arp_mode % 5], tr->arp_mode * 63); - L4(L, 1, "RATE", ARP_RATES[tr->arp_rate % 3], tr->arp_rate * 127); - snprintf(b, sizeof b, "%d", tr->arp_oct); L4(L, 2, "OCTAVES", b, tr->arp_oct * 85); - snprintf(b, sizeof b, "%d%%", tr->arp_gate); L4(L, 3, "GATE", b, tr->arp_gate * 255 / 100); -} - -static void legend_len(const bm_app *a, bm_legend *L) -{ - int t = a->track; - char b[12]; - int len = bm_trk_len(&a->pat, t, bm_is_grid(&a->pat, t) ? tr_lane(a) : -1); - snprintf(b, sizeof b, "%d", len); L4(L, 0, "LENGTH", b, len * 4); - L4(L, 1, "SPEED", bm_speed_names[a->pat.trk[t].speed % SPD_COUNT], (SPD_COUNT - 1 - a->pat.trk[t].speed) * 51); -} - -uint8_t bm_app_takes_sel(const bm_app *a) -{ - uint8_t list[BM_TAKES + 8]; - int n = bm_app_sources(a, list); - if (!n) return BM_SRC_NONE; - return list[a->takes_row % n]; -} - -/* ------------------------------------------------------------ editor de sonido por páginas - * B-MINI, BITTAL y BUNO-6: los ajustes de la máquina (bm_params.h) en SONIDO. Batería: el instrumento elegido - * (bm_lane_pages) en INSTR. K1-K4 = los 4 de la página; SELECT recorre las páginas y sigue a la - * pestaña de al lado al llegar al borde; el botón de la página otra vez = la siguiente. */ -const bm_ppage *bm_app_ed_pages(const bm_app *a, int t, int *n) -{ - if (bm_is_tr(&a->pat, t)) { *n = BM_LANE_PAGES; return bm_lane_pages; } - return bm_engine_pages(a->pat.trk[t].engine, n); -} - -int bm_app_ed_on(const bm_app *a) -{ - int n, t = a->track; - if (a->view != V_CH || !bm_app_ed_pages(a, t, &n)) return 0; - return bm_is_tr(&a->pat, t) ? a->page == PG_INST : a->page == PG_SOUND; -} - -int bm_app_ed_value(const bm_app *a, int t, const bm_pdef *d) -{ - if (bm_is_tr(&a->pat, t)) return ((const uint8_t *)&bm_trk_trc(&a->pat, t)->lane[tr_lane(a)])[d->slot & 7]; - return bm_prm_get(&a->pat, t, d); -} - -const char *bm_app_ed_name(const bm_app *a, int t, const bm_pdef *d) -{ - if (bm_is_tr(&a->pat, t) && d->slot == LN_COLOR) /* COLOR dice qué hace en ese modelo */ - return bm_drm_color[bm_trk_trc(&a->pat, t)->lane[tr_lane(a)].model % DRM_COUNT]; - return d->name; -} - -static void ed_set(bm_app *a, int t, const bm_pdef *d, int v) -{ - if (bm_is_tr(&a->pat, t)) { app_push_i(a, CMD_SET_LANE, (uint8_t)t, (uint8_t)tr_lane(a), d->slot & 7, v); app_edited(a); return; } - if (d->slot & PS_M0) { app_set_track(a, t, d->slot & 3, v); return; } - if (bm_ps_trk(d->slot)) { app_set_track(a, t, d->slot & 0x3F, v); return; } /* ACCENT, GLIDE, TRANSPOSE... */ - uint8_t s[2], x[2]; - int n = bm_prm_split(d, v, s, x); - for (int i = 0; i < n; i++) app_push(a, CMD_SET_PRM, (uint8_t)t, s[i], x[i]); - app_edited(a); -} - -/* el valor de un ajuste en palabras: las macros como en SEQ; el algoritmo de BX-7 dice el del patch */ -static void ed_fmt(const bm_app *a, int t, const bm_pdef *d, int v, char *b, int cap) -{ - if (!bm_is_tr(&a->pat, t) && (d->slot & PS_M0)) { bm_fmt_macro(a, t, d->slot & 3, v, b, cap); return; } - if (d->fmt == PF_ALG && !v) { snprintf(b, (size_t)cap, "%d *", bm_fm_alg_of(&a->pat.trk[t], a->pat.prm[t])); return; } - bm_prm_fmt(d, v, b, cap); -} - -static bool fmt_bip(int f) { return f == PF_BIP || f == PF_SEMI || f == PF_DSEMI || f == PF_CENT || f == PF_TRSP || f == PF_MOD; } - -static void ed_turn(bm_app *a, int t, int k, int d) -{ - int n; - const bm_ppage *pg = bm_app_ed_pages(a, t, &n); - if (!pg || !n) return; - const bm_ppage *P = &pg[a->ed_page[t] % n]; - if (k >= P->n) return; - const bm_pdef *def = &P->p[k]; - int cur = bm_app_ed_value(a, t, def); - int step = def->max <= 16 ? lst(a, d) : d; /* listas: de a una */ - int lo = bm_is_tr(&a->pat, t) && def->slot == LN_LEN ? 1 : 0; - int nv = bm_clampi(cur + step, lo, def->max); - if (nv == cur) return; - ed_set(a, t, def, nv); - char b[12], ti[22]; - if (bm_is_tr(&a->pat, t)) bm_prm_fmt(def, nv, b, sizeof b); - else ed_fmt(a, t, def, nv, b, sizeof b); - if (bm_is_tr(&a->pat, t)) snprintf(ti, sizeof ti, "%s %s", T(bm_lane_name(a, t, tr_lane(a))), T(bm_app_ed_name(a, t, def))); - else snprintf(ti, sizeof ti, "%s %s", T(P->name), T(def->name)); - app_overlay(a, k, ti, b, "", nv * 255 / (def->max ? def->max : 1), fmt_bip(def->fmt) ? 128 : -1, bm_knob_color(k)); -} - - -static void legend_editor(const bm_app *a, int t, bm_legend *L) +static int lane_val(const bm_app *a, int slot) { - int n; - const bm_ppage *pg = bm_app_ed_pages(a, t, &n); - if (!pg || !n) return; - const bm_ppage *P = &pg[a->ed_page[t] % n]; - char b[12]; - for (int k = 0; k < P->n; k++) { - int v = bm_app_ed_value(a, t, &P->p[k]); - if (bm_is_tr(&a->pat, t)) bm_prm_fmt(&P->p[k], v, b, sizeof b); else ed_fmt(a, t, &P->p[k], v, b, sizeof b); - L4(L, k, bm_app_ed_name(a, t, &P->p[k]), b, v * 255 / (P->p[k].max ? P->p[k].max : 1)); - } + return ((const uint8_t *)&bm_trk_trc(&a->pat, a->track)->lane[tr_lane(a)])[slot & 7]; } -/* PADS: TRIM (START LENGTH ZOOM SNAP) · SOUND (PITCH LEVEL PLAY DIR) · ENV (ATTACK RELEASE CHOKE TEMPO) */ -static void legend_pads(const bm_app *a, bm_legend *L) +/* K1-K4 de las capas de sonido: página 0 = el golpe (TUNE DECAY TONE COLOR), 1 = el instrumento (MODEL LEVEL CHOKE) */ +static void legend_lane(const bm_app *a, bm_legend *L, int page) { - const bm_pad *p = &a->pat.pad[a->sel_lane[1] & 15]; - const bm_lane *ln = &a->pat.tr[1].lane[a->sel_lane[1] & 15]; + const bm_ppage *P = &bm_lane_pages[page]; char b[12]; - bool ok = bm_pad_ok(p); - switch (a->ed_page[1] % 4) { - case 0: { - unsigned st = (unsigned)((uint32_t)p->start * 1000u / BM_SMP_RATE), ln_ms = (unsigned)((uint32_t)p->len * 1000u / BM_SMP_RATE); - snprintf(b, sizeof b, "%u.%03uS", st / 1000, st % 1000); L4(L, 0, "START", ok ? b : "-", ok && a->cut_wlen ? (int)((uint32_t)p->start * 255u / a->cut_wlen) : 0); - snprintf(b, sizeof b, "%u MS", ln_ms); L4(L, 1, "LENGTH", ok ? b : "-", ok && a->cut_wlen ? (int)((uint32_t)p->len * 255u / a->cut_wlen) : 0); - snprintf(b, sizeof b, "X%d", 1 << (a->cut_zoom & 3)); L4(L, 2, "ZOOM", b, a->cut_zoom * 85); - L4(L, 3, "SNAP", SNAP_NAMES[a->cut_snap % 3], a->cut_snap * 127); - break; - } - case 1: - snprintf(b, sizeof b, "%+d ST", p->pitch - 24); L4(L, 0, "PITCH", b, p->pitch * 255 / 48); - snprintf(b, sizeof b, "%d", ln->level); L4(L, 1, "LEVEL", b, ln->level * 2); - L4(L, 2, "PLAY", bm_pad_mode_name(p->mode), p->mode * 85); - L4(L, 3, "DIR", (p->flags & PAD_REV) ? "REV" : "FWD", (p->flags & PAD_REV) ? 255 : 0); - break; - case 3: - snprintf(b, sizeof b, "%d%%", p->loop_s * 100 / 255); L4(L, 0, "LOOP IN", ok ? b : "-", p->loop_s); - if (p->loop_e) snprintf(b, sizeof b, "%d%%", p->loop_e * 100 / 255); else snprintf(b, sizeof b, "WHOLE"); - L4(L, 1, "LOOP OUT", ok ? b : "-", p->loop_e); - L4(L, 2, "PLAY", bm_pad_mode_name(p->mode), p->mode * 85); - break; - default: - fmt_ms(bm_attack_ms(p->attack), b, sizeof b); L4(L, 0, "ATTACK", b, p->attack * 2); - fmt_ms(bm_decay_ms(p->release), b, sizeof b); L4(L, 1, "RELEASE", b, p->release * 2); - if (ln->choke) snprintf(b, sizeof b, "%d", ln->choke); else snprintf(b, sizeof b, "OFF"); - L4(L, 2, "CHOKE", b, ln->choke * 85); - L4(L, 3, "TEMPO", (p->flags & PAD_TEMPO) ? "SYNC" : "OFF", (p->flags & PAD_TEMPO) ? 255 : 0); - break; + for (int k = 0; k < (page == 1 ? 3 : P->n); k++) { + const bm_pdef *d = &P->p[k]; + int v = lane_val(a, d->slot); + bm_prm_fmt(d, v, b, sizeof b); + const char *nm = d->slot == LN_COLOR ? bm_drm_color[lane_val(a, LN_MODEL) % DRM_COUNT] : d->name; + L4(L, k, nm, b, v * 255 / (d->max ? d->max : 1)); } } static void legend_view(const bm_app *a, bm_legend *L); +static void legend_glo(const bm_app *a, bm_legend *L); void bm_app_legend(const bm_app *a, bm_legend L[4]) { memset(L, 0, sizeof(bm_legend) * 4); - int t = a->track; - const bm_track *tr = &a->pat.trk[t]; - const bm_meta *m = &a->pat.meta; + const bm_track *tr = &a->pat.trk[a->track]; char b[12]; switch (a->layer) { - case L_HOME: legend_home(a, L); return; /* HOME sostenido: la tira del canal, como en la consola */ - case L_TONE: /* K1 BPM y K2 SWING, como en HOME y en TEMPO */ - snprintf(b, sizeof b, "%d", (m->bpm_x10 + 5) / 10); L4(L, 0, "BPM", b, (m->bpm_x10 - 400) * 255 / 2000); - snprintf(b, sizeof b, "%d%%", m->swing); L4(L, 1, "SWING", b, (m->swing - 50) * 255 / 25); - fmt_semi(m->transpose, b, sizeof b); L4(L, 2, "TRANSP", b, m->transpose * 5); - snprintf(b, sizeof b, "%+d", ((int)m->transpose - 24) / 12); L4(L, 3, "OCTAVE", b, m->transpose * 5); - return; - case L_LEN: legend_len(a, L); return; case L_ACC: fmt_pct(tr->accent, b, sizeof b); L4(L, 0, "ACCENT", b, tr->accent * 2); return; - case L_REP: if (app_kind(a, t) == KIND_NOTE) { fmt_ms((uint32_t)tr->glide * 500 / 127, b, sizeof b); L4(L, 0, "GLIDE", b, tr->glide * 2); } return; - case L_PUNCH: legend_fx(a, L); return; - case L_CHORDS: legend_chords(a, L); return; - case L_ARP: legend_arp(a, t, L); return; - case L_ROLL: /* K1 velocidad, K2 rampa, K3 swing, K4 cola */ - L4(L, 0, "RATE", bm_roll_names[a->roll_rate % BM_ROLL_RATES], a->roll_rate * 51); - L4(L, 1, a->roll_ramp == 1 ? "CRESC" : a->roll_ramp == 2 ? "DECRESC" : "RAMP", bm_roll_len_names[a->roll_len & 3], a->roll_len * 85); - snprintf(b, sizeof b, "%d%%", a->roll_swing); L4(L, 2, "SWING", b, (a->roll_swing - 50) * 255 / 25); - L4(L, 3, "TAIL", bm_roll_tail_names[a->roll_tail & 3], a->roll_tail * 85); + case L_HIT: legend_lane(a, L, 0); return; + case L_INST: legend_lane(a, L, 1); return; + case L_REP: case L_MUTE: return; + case L_LEN: { /* Slicer: el largo del pad elegido y la velocidad del canal */ + int len = bm_trk_len(&a->pat, a->track, tr_lane(a)); + snprintf(b, sizeof b, len > 1 ? "%d STEPS" : "%d STEP", len); L4(L, 0, "LENGTH", b, (len - 1) * 255 / (BM_STEPS - 1)); + L4(L, 1, "SPEED", bm_speed_names[tr->speed % SPD_COUNT], (SPD_COUNT - 1 - tr->speed % SPD_COUNT) * 51); return; - case L_COPY: snprintf(b, sizeof b, "A%02d", a->ctx.st.pattern + 1); L4(L, 0, "FROM", b, 0); return; - case L_ERASE: return; - default: break; /* MUTE y FILL: las perillas siguen con lo de SEQ */ + } + default: break; } legend_view(a, L); } static void legend_view(const bm_app *a, bm_legend *L) { - int t = a->track; - const bm_track *tr = &a->pat.trk[t]; - const bm_meta *m = &a->pat.meta; char b[12]; switch (a->view) { case V_HOME: legend_home(a, L); return; + case V_MACH: mach_legend_view(a, L); return; case V_GLO: legend_glo(a, L); return; - case V_FXG: legend_fx(a, L); return; - case V_TIME: { - int row = a->time_row; - const bm_track *rt = &a->pat.trk[row]; - if (bm_is_grid(&a->pat, row)) { - const bm_tr *g = bm_trk_trc(&a->pat, row); - snprintf(b, sizeof b, "%d", g->lane[0].len); L4(L, 0, "LENGTH", b, g->lane[0].len * 4); - L4(L, 1, "SPEED", bm_speed_names[rt->speed % SPD_COUNT], (SPD_COUNT - 1 - rt->speed) * 51); - if (row != 1) { - L4(L, 2, "INSTRUM", bm_lane_name(a, row, a->time_lane), a->time_lane * 17); - snprintf(b, sizeof b, "%d", g->lane[a->time_lane].len); L4(L, 3, "LANE LEN", b, g->lane[a->time_lane].len * 4); - } - } else { - snprintf(b, sizeof b, "%d", rt->length); L4(L, 0, "LENGTH", b, rt->length * 4); - L4(L, 1, "SPEED", bm_speed_names[rt->speed % SPD_COUNT], (SPD_COUNT - 1 - rt->speed) * 51); - } - return; - } case V_SAVE: snprintf(b, sizeof b, "A%02d", a->save_target + 1); L4(L, 0, "TARGET", b, a->save_target * 17); return; case V_SYSTEM: L4(L, 0, "VALUE", "ALGO", 0); return; - case V_CH: break; - default: return; - } - if (lock_mode(a) && a->page == PG_SEQ) { - for (int i = 0; i < 4; i++) { - int val = tr->macro[i]; - if (bm_is_grid(&a->pat, t)) { - int lv = bm_tr_lock_get(bm_trk_trc(&a->pat, t), a->held_step, tr_lane(a), i); - if (lv >= 0) { val = lv; L[i].locked = 1; } - } else { - int idx[4]; - int n = syn_step_events(a, t, a->held_step, idx); - if (n && bm_evc(&a->pat, t, a->held_step, idx[0])->lk[i] != BM_LOCK_NONE) { val = bm_evc(&a->pat, t, a->held_step, idx[0])->lk[i]; L[i].locked = 1; } - } - bm_fmt_macro(a, t, i, val, b, sizeof b); - L4(L, i, bm_macro_name(a, t, i), b, val * 2); - } - return; - } - int kind = app_kind(a, t); - switch (a->page) { - case PG_SEQ: - if (app_midi(a, t)) legend_midi(a, t, L); - else legend_macros(a, t, L); - return; - case PG_SOUND: - if (kind == KIND_TR) legend_macros(a, t, L); - else legend_editor(a, t, L); - return; - case PG_INST: legend_editor(a, t, L); return; - case PG_MIX: legend_mix(a, t, L); return; - case PG_MORE: { - bm_legend tmp[4]; - memset(tmp, 0, sizeof tmp); - legend_len(a, tmp); /* K1 LENGTH, K2 SPEED como en la capa de SEQ y en TIME */ - L[0] = tmp[0]; L[1] = tmp[1]; - fmt_pct(tr->accent, b, sizeof b); L4(L, 2, "ACCENT", b, tr->accent * 2); - if (kind == KIND_NOTE) { fmt_semi(tr->transpose, b, sizeof b); L4(L, 3, "TRANSP", b, tr->transpose * 5); } - return; - } - case PG_BREAK: - for (int i = 0; i < 4; i++) { fmt_pct(tr->gen[i], b, sizeof b); L4(L, i, GEN_NAMES[i], b, tr->gen[i] * 2); } - return; - case PG_TAKES: { - uint8_t src = bm_app_takes_sel(a); - if (src != BM_SRC_NONE && !(src & BM_SRC_ROM)) { - const bm_take *tk = &a->take[src]; - snprintf(b, sizeof b, "%d", (tk->bpm_x10 + 5) / 10); L4(L, 0, "BPM", b, (tk->bpm_x10 - 400) * 255 / 2000); - snprintf(b, sizeof b, "%d", tk->bars); L4(L, 1, "BARS", b, tk->bars * 31); - int db = ((int)tk->gain - 64) * 6 / 64; - snprintf(b, sizeof b, "%+d DB", db); L4(L, 2, "GAIN", b, tk->gain * 2); - } else if (src != BM_SRC_NONE) { - const bm_rom_loop *l = &bm_rom_loops[src & 0x7F]; - snprintf(b, sizeof b, "%d", l->bpm_x10 / 10); L4(L, 0, "BPM", b, 0); - snprintf(b, sizeof b, "%d", l->bars); L4(L, 1, "BARS", b, 0); - L4(L, 2, "FACTORY", "FIXED", 0); + case V_CH: + if (a->held_step >= 0 && a->held_long) { /* paso sostenido: K1 acento, K2 repetición */ + uint8_t v = bm_trk_trc(&a->pat, a->track)->st[tr_lane(a)][a->held_step]; + int rat = (v & ST_FLAM) ? 4 : (v & ST_RAT_MASK) >> ST_RAT_SH; + L4(L, 0, "ACCENT", (v & ST_ACC) ? "ON" : "OFF", (v & ST_ACC) ? 255 : 0); + L4(L, 1, "REPEAT", RAT_NAMES[rat], rat * 63); + return; } + if (bm_is_pads(a->track)) { slicer_grid_legend(a, L); return; } /* LEVEL LENGTH PITCH RELEASE del pad */ + legend_lane(a, L, 2); return; - } - case PG_ARP: if (kind == KIND_NOTE) legend_arp(a, t, L); return; /* las rejillas: ARP es la capa ROLL */ - case PG_LOOP: { - const bm_loop *lp = &a->pat.loop[t >= 2 ? t - 2 : 0]; - L4(L, 0, "LOOP", lp->on ? "ON" : "OFF", lp->on ? 255 : 0); - snprintf(b, sizeof b, "%d", lp->bars); L4(L, 1, "BARS", b, lp->bars * 63); - return; - } - case PG_MIDI: legend_midi(a, t, L); return; - case PG_SCL: { - int root, sc = app_scale(a, t, &root); - L4(L, 0, "ROOT", bm_note_names[root], root * 23); - if (tr->scl == 0xFF) snprintf(b, sizeof b, "PROJECT"); else snprintf(b, sizeof b, "%.8s", bm_scale_names[sc]); - L4(L, 1, "SCALE", b, tr->scl == 0xFF ? 0 : (sc + 1) * 25); - L4(L, 2, "CHORD", EXT_NAMES[m->voicing % 5], m->voicing * 63); - L4(L, 3, "LOCK", m->scale_lock ? "ON" : "OFF", m->scale_lock ? 255 : 0); - return; - } - case PG_CHORDS: legend_chords(a, L); return; - case PG_REC: L4(L, 0, "START", a->rec_now ? "NOW" : "BAR", a->rec_now ? 255 : 0); L4(L, 1, "SOURCE", "MIX", 0); return; - case PG_PADS: legend_pads(a, L); return; default: return; } } @@ -676,61 +146,20 @@ static void legend_view(const bm_app *a, bm_legend *L) void bm_app_bigknobs(const bm_app *a, const char **sel, const char **alg, const char **pre) { const char *S = "-", *A = "-", *P = "-"; - int t = a->track, kind = app_kind(a, t), e = a->pat.trk[t].engine; - switch (a->layer) { - case L_HOME: S = "TRACK"; A = "BPM .1"; P = "PATTERN"; goto out; - case L_ROLL: goto out; /* ROLL: K1-K4 y las negras; las grandes, nada */ - case L_NONE: case L_LANEMUTE: case L_FILL: break; /* MUTE y FILL: siguen con lo de SEQ */ - default: goto out; /* las otras capas solo usan K1-K4 */ - } - if (a->view == V_CH && a->page == PG_SEQ && a->rec && kind == KIND_NOTE && a->held_step < 0) { S = "STEP"; A = "GATE"; P = "MICRO"; goto out; } - if (a->view == V_CH && a->page == PG_SEQ && a->held_step >= 0) { - S = "ACCENT"; - if (bm_is_grid(&a->pat, t)) { A = "REPEAT"; P = "COND"; } else { A = "PROB"; P = "LENGTH"; } - goto out; - } - { - const char *snd = bm_is_pads(t) ? "TAKE" : kind == KIND_TR ? "KIT" : e == ENG_FM ? "PATCH" : "SOUND"; - if (a->card && console(a)) { /* la tarjeta del canal: la máquina y su sonido */ - int ct = a->card - 1; - S = "TRACK"; A = ct >= BM_TR_TRACKS ? "MACHINE" : "-"; - P = bm_is_pads(ct) ? "TAKE" : app_kind(a, ct) == KIND_TR ? "KIT" : app_engine(a, ct) == ENG_FM ? "PATCH" : "SOUND"; - goto out; - } - switch (a->view) { - case V_HOME: S = "TRACK"; A = "BPM"; P = snd; goto out; - case V_FXG: S = "PAGE"; A = "BPM"; P = "MOVE"; goto out; - case V_GLO: - P = "MOVE"; - if (a->glo_page == GP_MACH) { S = "TRACK"; A = a->track >= BM_TR_TRACKS ? "MACHINE" : "-"; } - else if (a->glo_page == GP_SONG) { if (a->song.n) { S = "ENTRY"; A = "PATTERN"; } } - else { S = "ROW"; A = "VALUE"; } - goto out; - default: break; - } - } + int t = a->track; + if (a->layer) { if (a->layer == L_INST) A = "MODEL"; else if (a->layer == L_LEN) A = "PAD"; goto out; } /* las capas usan K1-K4 */ switch (a->view) { + case V_HOME: S = "TRACK"; A = "BPM"; P = drums_track(a, t) ? "KIT" : bm_is_pads(t) ? "TAKE" : "SOUND"; break; + case V_GLO: /* las páginas, con GLO */ + if (a->glo_page == 0) { S = "TRACK"; A = app_fixed(t) ? "-" : "MACHINE"; } + else if (a->glo_page == 1) A = "BPM"; + break; case V_SYSTEM: S = "ROW"; A = "VALUE"; break; case V_SAVE: S = "ROW"; A = "TARGET"; P = "TARGET"; break; - case V_TIME: S = "TRACK"; A = "TRACK"; break; - case V_COPYCH: S = "TARGET"; A = "TARGET"; break; case V_CH: - S = a->page == PG_MORE ? "ROW" : "PAGE"; - if (a->page == PG_MORE) A = "VALUE"; - else if (a->page == PG_TAKES) A = "TAKE"; - else if (a->page != PG_REC) - switch (e) { - case ENG_DRUM: A = "INSTR"; break; - case ENG_BREAK: A = "PAD"; break; - case ENG_ACID: A = "WAVE"; break; - case ENG_MINI: A = "MODE"; break; - case ENG_FM: A = "ALG"; break; - case ENG_BITTAL: A = "TABLE"; break; - case ENG_BUNO: A = "CHORUS"; break; - default: break; - } - P = bm_is_pads(t) ? "TAKE" : kind == KIND_TR ? "KIT" : e == ENG_FM ? "PATCH" : "SOUND"; + if (bm_is_pads(t)) { A = "PAD"; P = "TAKE"; } else { A = "INSTR"; P = "KIT"; } break; + case V_MACH: mach_bigknobs(a, &S, &A, &P); break; default: break; } out: @@ -741,7 +170,7 @@ void bm_app_bigknobs(const bm_app *a, const char **sel, const char **alg, const * Las luces son blancas y solo dicen el estado; la tira de teclas de la pantalla nombra cada tecla * con la misma intensidad. Una sola gramática en todas las pantallas: * OFF no hay nada: sin función, hueco vacío que no hace nada, fuera del largo - * DIM disponible pero quieto o vacío, o con contenido pero callado (muteado, NO-FILL) + * DIM disponible pero quieto o vacío, o con contenido pero callado (muteado) * MID tiene contenido y va a sonar; una referencia (carril con pasos, patrón guardado, tónica) * ON elegido, sostenido, activo ahora, o el destello de un golpe (live) * BLINK solo el cabezal o lo que está en cola @@ -760,6 +189,8 @@ static bm_keyfn *KB(bm_keyfn *K, int b, const char *l, uint8_t led, uint16_t c) return k; } +static void KL(bm_keyfn *K, int k, const char *l) { snprintf(K[k].label, sizeof K[k].label, "%s", l); } + /* La tira muestra 3 letras: cada instrumento de los kits tiene su nombre corto fijo (KICK y KICK2, * o los tres TOM, no pueden leerse iguales). Si se le cambió el modelo, el del modelo. */ static const char KIT_SHORT[BM_KITS_N][BM_LANES][4] = { @@ -803,34 +234,28 @@ static uint8_t lane_live(const bm_app *a, int t, int ln) return (uint8_t)(a->now < a->lane_flash[t][ln] && !((bm_trk_trc(&a->pat, t)->mute >> ln) & 1)); } -static int step_pages(const bm_app *a); -static int notes_empty(const bm_app *a, int t); -static void note_keys(const bm_app *a, bm_keyfn *K, int t); -static void lane_whites(const bm_app *a, bm_keyfn *K, int t); +/* Páginas de pasos del secuenciador (los compases de 16 pasos del instrumento elegido) */ +static int step_pages(const bm_app *a) +{ + int pages = (bm_trk_len(&a->pat, a->track, tr_lane(a)) + 15) / 16; + return pages > 0 ? pages : 1; +} -/* 0.9: las páginas de pasos en las negras 9 (<) y 10 (>): MID si hay página para ese lado */ +/* negras 9 y 10 = el compás anterior / siguiente (en círculo). Se ven siempre (pedido del usuario, + * 2026-10-20): con un solo compás quedan tenues y al tocarlas lo dicen. */ static void page_blacks(const bm_app *a, bm_keyfn *K) { - int last = step_pages(a) - 1; - KB(K, 8, "<", a->step_page > 0 ? LED_MID : LED_OFF, C_WHITE); - KB(K, 9, ">", a->step_page < last ? LED_MID : LED_OFF, C_WHITE); + uint8_t led = step_pages(a) < 2 ? LED_DIM : LED_MID; + KB(K, 8, "<", led, C_WHITE); + KB(K, 9, ">", led, C_WHITE); } -/* Las negras de un canal de batería o de pads: 1-8 eligen y tocan un instrumento del banco, 11 cambia - * de banco (HI/LO; sostenida, MUTE de instrumentos mientras la sostienes). En SEQ, 9 y 10 = páginas. */ -static void tr_blacks(const bm_app *a, bm_keyfn *K, int t, bool seq) +static int notes_empty(const bm_app *a, int t) { - const bm_tr *tr = bm_trk_trc(&a->pat, t); - int lane = tr_lane(a), bank = (lane / 8) * 8; - bool other = false; - for (int i = 0; i < 8; i++) { - int ln = bank + i; - bm_keyfn *k = KB(K, i, lane_short(a, t, ln), lane_led(tr, ln, lane), bm_track_color(t)); - k->live = (uint8_t)(lane_has(tr, ln) && lane_live(a, t, ln)); - if (!other) other = lane_has(tr, (ln + 8) & 15); - } - if (seq) page_blacks(a, K); - KB(K, 10, lane < 8 ? "HI" : "LO", lane >= 8 ? LED_ON : (other ? LED_MID : LED_DIM), C_WHITE); + for (int s = 0; s < BM_STEPS; s++) + for (int k = 0; k < BM_EVENTS; k++) + if (!bm_event_empty(bm_evc(&a->pat, t, s, k))) return 0; + return 1; } /* el canal tiene algo que suena (golpes o notas) */ @@ -842,12 +267,13 @@ static bool track_any(const bm_app *a, int t) return false; } -/* La consola (HOME, su FX y su GLO, y HOME sostenido en cualquier lado): - * blancas 1-10 patrones 01-10: ON el actual, BLINK en cola o el siguiente de la cadena, MID guardado, DIM vacío - * blancas 11-16 canales T1-T6: ON el cursor, MID con pasos (destella con cada golpe), DIM vacío, BREATH la tarjeta - * negras 1-6 mutes: MID suena (destella), DIM muteado, BLINK en CUE, ON solo - * negras 7-10 escenas A-D: ON la activa, BLINK en cola, MID guardada, DIM vacía - * negra 11 CUE: DIM apagado, BREATH armado */ +/* El mezclador (HOME y su GLO): + * blancas 1-9 patrones 01-09: ON el actual, BLINK en cola (entra al final del compás), MID guardado, apagado vacío + * blanca 10 sin función: espacio entre los patrones y los canales (no se cambia de patrón por error) + * blancas 11-16 canales T1-T6: ON el cursor, MID con pasos (destella con cada golpe), DIM vacío + * negras 1-6 mutes: MID suena (destella), DIM muteado, ON solo + * negra 7 sin función + * negras 8-11 escenas A-D: ON la activa, BLINK en cola, MID guardada, DIM vacía (con un patrón sostenido: guardar) */ static void map_console(const bm_app *a, bm_keyfn *K) { const bm_status *st = &a->ctx.st; @@ -856,328 +282,289 @@ static void map_console(const bm_app *a, bm_keyfn *K) bool has = bm_store_has(&a->store, (uint8_t)w) || w == st->pattern || a->pend_obj == w; bool q = w == st->queued && st->queued != st->pattern; snprintf(b, sizeof b, "%02d", w + 1); - KW(K, w, b, w == st->pattern ? LED_ON : q ? LED_BLINK : has ? LED_MID : LED_DIM, w == st->pattern ? C_WHITE : q ? C_CYAN : 0); + KW(K, w, b, w == st->pattern ? LED_ON : q ? LED_BLINK : has ? LED_MID : LED_OFF, w == st->pattern ? C_WHITE : q ? C_CYAN : 0); } - for (int t = 0; t < BM_TRACKS; t++) { + for (int n = 0; n < BM_TRACKS; n++) { + int t = BM_ORDER[n]; bool any = track_any(a, t); - uint8_t led = a->card == t + 1 ? LED_BREATH : a->home_go == t + 1 ? LED_BLINK : t == a->track ? LED_ON : any ? LED_MID : LED_DIM; - snprintf(b, sizeof b, "T%d", t + 1); - KW(K, 10 + t, b, led, bm_track_color(t))->live = (uint8_t)(any && !a->pat.trk[t].mute && a->now < a->trig_until[t] && !a->card); + snprintf(b, sizeof b, "T%d", n + 1); + KW(K, BM_CH_W0 + n, b, t == a->track ? LED_ON : any ? LED_MID : LED_DIM, bm_track_color(t))->live = + (uint8_t)(any && !a->pat.trk[t].mute && a->now < a->trig_until[t]); } - for (int t = 0; t < BM_TRACKS; t++) { + for (int n = 0; n < BM_TRACKS; n++) { + int t = BM_ORDER[n]; bool mute = a->pat.trk[t].mute != 0; - uint8_t led = a->solo_on && a->solo_track == t ? LED_ON : ((st->cue_x >> t) & 1) ? LED_BLINK : mute ? LED_DIM : LED_MID; - snprintf(b, sizeof b, "M%d", t + 1); - KB(K, t, b, led, bm_track_color(t))->live = (uint8_t)(!mute && led == LED_MID && a->now < a->trig_until[t]); + uint8_t led = a->solo_on && a->solo_track == t ? LED_ON : mute ? LED_DIM : LED_MID; + snprintf(b, sizeof b, "M%d", n + 1); + KB(K, n, b, led, bm_track_color(t))->live = (uint8_t)(!mute && led == LED_MID && a->now < a->trig_until[t]); } for (int s = 0; s < BM_SCENES; s++) { - snprintf(b, sizeof b, "%c", 'A' + s); - KB(K, 6 + s, b, st->scene == s ? LED_ON : st->scene_q == s ? LED_BLINK : (a->song.scene[s].flags & SCN_STORED) ? LED_MID : LED_DIM, C_CYAN); + snprintf(b, sizeof b, a->pat_held ? "S%c" : "%c", 'A' + s); + KB(K, SCENE_B0 + s, b, st->scene == s ? LED_ON : st->scene_q == s ? LED_BLINK : (a->song.scene[st->pattern % BM_PATTERNS][s].flags & SCN_STORED) ? LED_MID : LED_DIM, C_CYAN); } - KB(K, 10, "CUE", a->cue ? LED_BREATH : LED_DIM, C_ORANGE); } -/* GLO de la consola > SONG: blancas 1-10 agregan el patrón, negras 7-10 ponen (o quitan) una escena - * en la entrada elegida, negra 11 la borra. Los canales y los mutes siguen siendo de la consola. */ -static void map_song(const bm_app *a, bm_keyfn *K) +/* ------------------------------------------------------------ notas y teclado de PLAY/REC */ +/* las máquinas de bajo (BB-303 y B-MINI) tocan una octava más abajo, en el canal que estén */ +static int bass_machine(const bm_app *a, int t) { int e = app_engine(a, t); return e == ENG_ACID || e == ENG_MINI; } + +/* la nota de una tecla en PLAY/REC: cromática desde F, con la octava corrida por OCT -/+ */ +static int key_note(const bm_app *a, int t, int k) { - map_console(a, K); - int cur = a->song.n ? a->song.pat[a->song_cur % a->song.n] : -1; - char b[6]; - for (int w = 0; w < BM_PATTERNS; w++) { - bool has = bm_store_has(&a->store, (uint8_t)w) || w == a->ctx.st.pattern; - snprintf(b, sizeof b, "%02d", w + 1); - KW(K, w, b, cur >= 0 && bm_song_pat((uint8_t)cur) == w ? LED_ON : has ? LED_MID : LED_DIM, C_WHITE); - } - for (int s = 0; s < BM_SCENES; s++) { - snprintf(b, sizeof b, "+%c", 'A' + s); - bool on = cur >= 0 && bm_song_scene((uint8_t)cur) == s; - KB(K, 6 + s, b, !a->song.n ? LED_OFF : on ? LED_ON : (a->song.scene[s].flags & SCN_STORED) ? LED_MID : LED_DIM, C_CYAN); - } - KB(K, 10, "DEL", a->song.n ? LED_DIM : LED_OFF, C_RED); + return BM_KEY_BASE_NOTE + k + 12 * a->oct - (bass_machine(a, t) ? 12 : 0); } -/* SLOOP-REC: las teclas tocan la máquina del cursor. Notas: las 27 cromáticas desde F (con KEYS IN - * SCALE, la escala en las blancas y los acordes en las negras). Batería y pads: las blancas son los 16 - * instrumentos y la negra 1 ACC (los golpes que tocas mientras la sostienes van con acento). */ -static void map_sloop(const bm_app *a, bm_keyfn *K) +/* las notas que el canal t acaba de tocar desde sus pasos (para que destellen sus teclas) */ +static int live_notes(const bm_app *a, int t, uint8_t out[4]) { - int t = a->track; - if (app_kind(a, t) == KIND_NOTE) { note_keys(a, K, t); return; } - lane_whites(a, K, t); - KB(K, 0, "ACC", LED_DIM, C_WHITE); + if (!(a->now < a->trig_until[t])) return 0; + int s = bm_app_track_step(a, t, -1), idx[4]; + if (s < 0) return 0; + int n = syn_step_events(a, t, s, idx); + for (int i = 0; i < n; i++) out[i] = bm_evc(&a->pat, t, s, idx[i])->note; + return n; } -static void map_steps(const bm_app *a, bm_keyfn *K, int mode) +static uint8_t note_in(int note, const uint8_t *nn, int n) { - /* mode 0: acento · 1: repetir/ligar · 2: borrar · 3: solo en el fill - * Un paso vacío está disponible (DIM) donde la capa lo crea: acento, y en batería repetir y fill. */ - int t = a->track, kind = app_kind(a, t); - uint8_t empty = (mode == 0 || (kind != KIND_NOTE && (mode == 1 || mode == 3))) ? LED_DIM : LED_OFF; - for (int w = 0; w < 16; w++) { - int s = a->step_page * 16 + w; - const char *l = ""; - uint8_t led = empty; - if (kind == KIND_NOTE) { - if (s >= a->pat.trk[t].length) { KW(K, w, "", LED_OFF, 0); continue; } - int idx[4], n = syn_step_events(a, t, s, idx); - if (n) { - const bm_event *e = bm_evc(&a->pat, t, s, idx[0]); - if (mode == 3) { - l = e->prob == BM_PROB_FILL ? "F" : e->prob == BM_PROB_NOFILL ? "-" : ""; - led = e->prob == BM_PROB_FILL ? LED_ON : e->prob == BM_PROB_NOFILL ? LED_DIM : LED_MID; - } - else if (mode == 0) { l = e->vel >= BM_VEL_ACC ? "A" : e->vel <= BM_VEL_GHOST ? "G" : ""; led = e->vel >= BM_VEL_ACC ? LED_ON : LED_MID; } - else if (mode == 1) { l = (e->len & BM_LEN_TIE) ? "TIE" : ""; led = (e->len & BM_LEN_TIE) ? LED_ON : LED_MID; } - else { l = "X"; led = LED_MID; } - } - } else { - const bm_tr *tr = bm_trk_trc(&a->pat, t); - int lane = tr_lane(a); - if (s >= tr->lane[lane].len) { KW(K, w, "", LED_OFF, 0); continue; } - uint8_t v = tr->st[lane][s]; - int on = (v & ST_ON) != 0; - if (on) { - int rat = (v & ST_FLAM) ? 4 : (v & ST_RAT_MASK) >> ST_RAT_SH; - int cond = (v & ST_COND_MASK) >> ST_COND_SH; - if (mode == 3) { l = cond == 1 ? "F" : cond == 2 ? "-" : ""; led = cond == 1 ? LED_ON : cond == 2 ? LED_DIM : LED_MID; } - else if (mode == 0) { l = (v & ST_ACC) ? "A" : ""; led = (v & ST_ACC) ? LED_ON : LED_MID; } - else if (mode == 1) { l = RAT_NAMES[rat]; if (!rat) l = ""; led = rat ? LED_ON : LED_MID; } - else { l = "X"; led = LED_MID; } - } - } - if (s == bm_app_track_step(a, t, kind == KIND_NOTE ? -1 : tr_lane(a))) led = LED_BLINK; - KW(K, w, l, led, mode == 0 ? C_WHITE : mode == 1 ? C_YELLOW : mode == 3 ? C_ORANGE : C_RED); - } + for (int i = 0; i < n; i++) if (nn[i] == note) return 1; + return 0; } -/* Las blancas como los 16 instrumentos. act: los sostenidos (ON). - * MUTE: con pasos y sonando MID y destella con cada golpe, muteado DIM, vacío OFF. - * ERASE: con pasos MID (muteado o no), vacío OFF (no hay nada que borrar). - * ROLL: todos suenan: vacío DIM, con pasos MID, y destellan. */ -enum { LM_MUTE, LM_ERASE, LM_ROLL }; +/* El teclado de un canal de notas en PLAY/REC: cromático (la escala DIM, la tónica MID, fuera de la + * escala OFF) */ +static void note_keys(const bm_app *a, bm_keyfn *K, int t); +void app_note_keys(const bm_app *a, bm_keyfn *K, int t) { note_keys(a, K, t); } -static void map_lanes(const bm_app *a, bm_keyfn *K, int t, uint16_t act, int mode) +static void note_keys(const bm_app *a, bm_keyfn *K, int t) { - const bm_tr *tr = bm_trk_trc(&a->pat, t); - for (int w = 0; w < 16; w++) { - bool has = lane_has(tr, w), mute = (tr->mute >> w) & 1; - uint8_t led, live = 0; - if (mode == LM_MUTE) { led = has ? (mute ? LED_DIM : LED_MID) : LED_OFF; live = (uint8_t)(has && lane_live(a, t, w)); } - else if (mode == LM_ERASE) led = has ? LED_MID : LED_OFF; - else { led = has ? LED_MID : LED_DIM; live = lane_live(a, t, w); } - if ((act >> w) & 1) led = LED_ON; - KW(K, w, lane_short(a, t, w), led, bm_track_color(t))->live = live; + int root, sc = app_scale(a, t, &root), sl = bm_scale_len(sc); + uint8_t nn[4]; + int nl = live_notes(a, t, nn); + uint16_t col = bm_track_color(t); + uint16_t pcs = 0; + for (int d = 0; d < sl; d++) pcs |= (uint16_t)(1u << (bm_scale_note(root, sc, d, 0) % 12)); + for (int k = 0; k < BM_KEYS; k++) { + int note = key_note(a, t, k), pc = (note + 120) % 12; + KL(K, k, bm_note_names[pc]); + K[k].led = pc == root ? LED_MID : ((pcs >> pc) & 1) ? LED_DIM : LED_OFF; + K[k].color = col; + K[k].live = note_in(note, nn, nl); } } -static void map_chords(const bm_app *a, bm_keyfn *K) +/* Las blancas de un canal de batería o de pads en PLAY/REC: los 16 instrumentos, como un selector */ +static void lane_whites(const bm_app *a, bm_keyfn *K, int t) { - static const uint16_t FN[3] = {C_BLUE, C_GREEN, C_ORANGE}; - const bm_meta *m = &a->pat.meta; - int root, sc = app_scale(a, bm_app_chord_track(a), &root); - for (int p = 0; p < 16; p++) { - bm_pad_chord pc = bm_chord_pad(m->chord_set, p); - char rn[10]; - bm_roman(root, sc, pc.degree, pc.ext, rn, sizeof rn); - rn[4] = 0; - KW(K, p, rn, p == a->last_pad ? LED_ON : LED_DIM, FN[bm_chord_function(pc.degree)]); - } - static const char *const MODS[4] = {"+7", "+9", "S2", "S4"}; - for (int b = 0; b < 4; b++) KB(K, b, MODS[b], (a->chord_mod >> b) & 1 ? LED_ON : LED_DIM, C_YELLOW); -} - + const bm_tr *tr = bm_trk_trc(&a->pat, t); + for (int w = 0; w < 16; w++) + KW(K, w, lane_short(a, t, w), lane_led(tr, w, tr_lane(a)), bm_track_color(t))->live = (uint8_t)(lane_has(tr, w) && lane_live(a, t, w)); +} + +/* PLAY/REC: las teclas tocan la máquina del cursor. Notas: las 27 cromáticas desde F. Batería y + * sampler: las blancas son los 16 instrumentos o pads. */ +static void map_sloop(const bm_app *a, bm_keyfn *K) +{ + int t = a->track; + if (app_kind(a, t) == KIND_NOTE) note_keys(a, K, t); else lane_whites(a, K, t); +} + +/* mode 0: acento · 1: repetir · 2: borrar. En acento y repetir los pasos con golpe quedan MID y los + * que tienen la marca ON (pedido del usuario 2026-10-21: antes los golpes sin marca iban apagados y + * no se veía dónde había sonido); vacíos apagados, sin el paso que suena. */ +static void map_steps(const bm_app *a, bm_keyfn *K, int mode) +{ + int t = a->track; + const bm_tr *tr = bm_trk_trc(&a->pat, t); + int lane = tr_lane(a); + for (int w = 0; w < 16; w++) { + int s = a->step_page * 16 + w; + const char *l = ""; + uint8_t led = LED_OFF; + if (s >= tr->lane[lane].len) { KW(K, w, "", LED_OFF, 0); continue; } + uint8_t v = tr->st[lane][s]; + if (v & ST_ON) { + int rat = (v & ST_FLAM) ? 4 : (v & ST_RAT_MASK) >> ST_RAT_SH; + if (mode == 0) { l = (v & ST_ACC) ? "A" : "-"; led = (v & ST_ACC) ? LED_ON : LED_MID; } + else if (mode == 1) { l = rat ? RAT_NAMES[rat] : "-"; led = rat ? LED_ON : LED_MID; } + else { l = "X"; led = LED_MID; } + } + if (mode == 2 && s == bm_app_track_step(a, t, lane)) led = LED_BLINK; + KW(K, w, l, led, mode == 0 ? C_WHITE : mode == 1 ? C_YELLOW : C_RED); + } +} + +/* Las blancas como los 16 instrumentos: con pasos MID, vacío OFF; en MUTE, el muteado DIM (y destella al sonar) */ +static void map_lanes(const bm_app *a, bm_keyfn *K, int t, int mute_mode) +{ + const bm_tr *tr = bm_trk_trc(&a->pat, t); + for (int w = 0; w < 16; w++) { + bool has = lane_has(tr, w), mute = (tr->mute >> w) & 1; + if (mute_mode) { /* MUTE: fijo; suena = fuerte, muteado = tenue (aunque no tenga golpes) */ + KW(K, w, lane_short(a, t, w), mute ? LED_DIM : has ? LED_ON : LED_OFF, bm_track_color(t)); + continue; + } + uint8_t led = has ? LED_MID : LED_OFF; + if (w == tr_lane(a)) led = LED_ON; + KW(K, w, lane_short(a, t, w), led, bm_track_color(t))->live = (uint8_t)(has && lane_live(a, t, w)); + } +} + +/* Navegación: las negras 1-8 son los instrumentos de la página de sonidos (la elegida ON) y 9/10 los compases */ +static void nav_blacks(const bm_app *a, bm_keyfn *K) +{ + int t = a->track, lane = tr_lane(a), bank = (lane / 8) * 8; + const bm_tr *tg = bm_trk_trc(&a->pat, t); + for (int i = 0; i < 8; i++) + KB(K, i, lane_short(a, t, bank + i), lane_led(tg, bank + i, lane), bm_track_color(t))->live = (uint8_t)(lane_has(tg, bank + i) && lane_live(a, t, bank + i)); + page_blacks(a, K); +} + +/* LFO, ENV, EDIT y SCL de la batería: las negras 1-8 son acceso rápido a los instrumentos de la + * página de sonidos, sin sonar (en SCL mutean, como su blanca); 10 y 11 = el compás anterior / + * siguiente; la 9 nada. */ +static void layer_blacks(const bm_app *a, bm_keyfn *K) +{ + int t = a->track, lane = tr_lane(a), bank = (lane / 8) * 8; + const bm_tr *tg = bm_trk_trc(&a->pat, t); + for (int i = 0; i < 8; i++) { + int l = bank + i; + if (a->layer == L_MUTE) { + bool has = lane_has(tg, l), mute = (tg->mute >> l) & 1; + KB(K, i, lane_short(a, t, l), mute ? LED_DIM : has ? LED_ON : LED_OFF, bm_track_color(t)); + } else KB(K, i, lane_short(a, t, l), lane_led(tg, l, lane), bm_track_color(t))->live = (uint8_t)(lane_has(tg, l) && lane_live(a, t, l)); + } + uint8_t led = step_pages(a) < 2 ? LED_DIM : LED_MID; + KB(K, 9, "<", led, C_WHITE); + KB(K, 10, ">", led, C_WHITE); +} + /* Las pistas del visor de cada capa: la línea 1 dice qué hacen teclas y perillas, la 2 empieza * siempre por cómo se sale. CONTROL = VERBO OBJETO, dos espacios entre pares, hasta 38 letras, los * controles con el nombre impreso en el equipo. */ void bm_app_keymap(const bm_app *a, bm_keyfn K[BM_KEYS], char *title, int cap, uint16_t *color, const char **h1, const char **h2) { memset(K, 0, sizeof(bm_keyfn) * BM_KEYS); - int t = a->track, kind = app_kind(a, t); - const bm_meta *m = &a->pat.meta; - char b[8]; + int t = a->track; *h1 = ""; *h2 = ""; *color = C_WHITE; title[0] = 0; - int L = a->layer; - switch (L) { - case L_HOME: - snprintf(title, (size_t)cap, "HOME"); - *h1 = "W1-10 PATTERN W11-16 GO TO MACHINE"; - *h2 = "EXIT: RELEASE HOME B1-6 MUTE"; - map_console(a, K); - return; - case L_LEN: { - snprintf(title, (size_t)cap, "LENGTH AND SPEED"); - *color = bm_track_color(t); - *h1 = "WHITE = SET LENGTH BLACK 11 = +16"; - *h2 = "EXIT: RELEASE SEQ BLACK 1-6 = SPEED"; - int len = bm_trk_len(&a->pat, t, kind == KIND_NOTE ? -1 : tr_lane(a)); - for (int w = 0; w < 16; w++) { - int v = a->len_page * 16 + w + 1; - snprintf(b, sizeof b, "%d", v); - KW(K, w, b, v == len ? LED_ON : (v < len ? LED_MID : LED_DIM), bm_track_color(t)); - } - static const char *const SP[SPD_COUNT] = {"X2", "3/2", "X1", "3/4", "1/2", "1/4"}; - for (int s = 0; s < SPD_COUNT; s++) KB(K, s, SP[s], a->pat.trk[t].speed == s ? LED_ON : LED_DIM, C_WHITE); - int spb = BM_BAR_TICKS / bm_speed_tps[a->pat.trk[t].speed % SPD_COUNT]; - for (int c = 1; c <= 4; c++) { snprintf(b, sizeof b, "%dBR", c); KB(K, 5 + c, b, len == c * spb ? LED_ON : LED_DIM, C_YELLOW); } - KB(K, 10, "+16", a->len_page ? LED_ON : LED_MID, C_WHITE); /* 1-16 > 17-32 > 33-48 > 49-64 */ - return; - } - case L_ERASE: { - bool con = console(a); - snprintf(title, (size_t)cap, "ERASE"); - *color = C_RED; - *h1 = app_playing(a) ? "HOLD WHITE = ERASE LIVE B6 = UNDO" - : kind == KIND_TR ? "WHITE = ERASE INSTRUMENT B6 = UNDO" : "WHITE = ERASE STEP BLACK 6 = UNDO"; - *h2 = con ? "EXIT: RELEASE EDIT B7-10 = CLR SCENE" : "EXIT: RELEASE EDIT BLACK 7 = REDO"; - if (kind == KIND_TR) map_lanes(a, K, t, a->erase_mask, LM_ERASE); - else { map_steps(a, K, 2); if (!con) page_blacks(a, K); } - KB(K, 0, "CPY", LED_DIM, C_WHITE); KB(K, 1, "PST", LED_DIM, C_WHITE); KB(K, 2, "CLR", LED_DIM, C_RED); - if (t == 1) KB(K, 3, "CAPT", LED_DIM, C_YELLOW); - KB(K, 5, "UND", a->undo_track >= 0 ? LED_MID : LED_OFF, C_WHITE); - if (con) /* EDIT sostenido + escena = vaciarla */ - for (int s = 0; s < BM_SCENES; s++) { - snprintf(b, sizeof b, "X%c", 'A' + s); - KB(K, 6 + s, b, (a->song.scene[s].flags & SCN_STORED) ? LED_MID : LED_OFF, C_CYAN); - } - else KB(K, 6, "RED", a->redo_track >= 0 ? LED_MID : LED_OFF, C_WHITE); - return; - } + switch (a->layer) { case L_ACC: - snprintf(title, (size_t)cap, "ACCENT"); - *h1 = kind == KIND_NOTE ? "WHITE = CYCLE ACCENT AND GHOST" : "WHITE = TOGGLE ACCENT"; - *h2 = "EXIT: RELEASE ENV BLACK 9/10 = PAGE"; + snprintf(title, (size_t)cap, "ACCENTS"); + *h1 = "WHITE = TOGGLE ACCENT K1 = AMOUNT"; + *h2 = "EXIT: LFO OR HOME BLACK = SOUND, BAR"; map_steps(a, K, 0); - page_blacks(a, K); + layer_blacks(a, K); return; case L_REP: - snprintf(title, (size_t)cap, kind == KIND_NOTE ? "TIE" : "REPEAT"); + snprintf(title, (size_t)cap, "REPEAT"); *color = C_YELLOW; - *h1 = kind == KIND_NOTE ? "WHITE = TIE TO NEXT NOTE K1 = GLIDE" : "WHITE = CYCLE X1-X4 AND FLAM"; - *h2 = a->layer_latch ? "EXIT: LFO OR HOME BLACK 9/10 = PAGE" : "EXIT: RELEASE LFO BLACK 9/10 = PAGE"; + *h1 = "WHITE = CYCLE X1-X4 AND FLAM"; + *h2 = a->layer_latch ? "EXIT: BLACK 11 OR HOME" : "EXIT: RELEASE BLACK 11"; map_steps(a, K, 1); - page_blacks(a, K); - return; - case L_PUNCH: - snprintf(title, (size_t)cap, "PUNCH-IN"); - *color = C_RED; - *h1 = "WHITE = PLAY EFFECT BLACK 1-6 = MUTE"; - *h2 = "EXIT: RELEASE FX"; - for (int w = 0; w < 16; w++) KW(K, w, PUNCH_NAMES[w], a->ctx.st.punch == w ? LED_ON : (a->ctx.arena_busy && w <= 6 ? LED_OFF : LED_DIM), C_YELLOW); - for (int i = 0; i < BM_TRACKS; i++) { - bool mute = a->pat.trk[i].mute != 0; - snprintf(b, sizeof b, "M%d", i + 1); - KB(K, i, b, mute ? LED_DIM : LED_MID, bm_track_color(i))->live = (uint8_t)(!mute && a->now < a->trig_until[i]); - } - return; - case L_CHORDS: - snprintf(title, (size_t)cap, "CHORDS"); - *color = C_GREEN; - *h1 = "WHITE = PLAY CHORD BLACK 1-4 = EXTEND"; - *h2 = "EXIT: RELEASE SCL"; - map_chords(a, K); + nav_blacks(a, K); + KB(K, 10, "RPT", LED_BREATH, C_YELLOW); return; - case L_ARP: case L_ROLL: - if (L == L_ROLL) { /* blancas: los 16 instrumentos o pads */ - static const char *const RT[BM_ROLL_RATES] = {"8", "16", "32", "8T", "16T", "32T"}; - snprintf(title, (size_t)cap, "ROLL"); - *color = bm_track_color(t); - *h1 = "HOLD WHITE = ROLL BLACK 1-6 = RATE"; - if (a->layer_latch) *h2 = a->rec ? "EXIT: ARP OR HOME REC IS RECORDING" : "EXIT: ARP OR HOME BLACK 11 = FILL"; - else *h2 = a->rec ? "EXIT: RELEASE ARP REC IS RECORDING" : "EXIT: RELEASE ARP BLACK 11 = FILL"; - map_lanes(a, K, t, a->roll_mask, LM_ROLL); - for (int r = 0; r < BM_ROLL_RATES; r++) KB(K, r, RT[r], a->roll_rate == r ? LED_ON : LED_DIM, C_WHITE); - KB(K, 6, "CRE", a->roll_ramp == 1 ? LED_ON : LED_DIM, C_CYAN); - KB(K, 7, "DEC", a->roll_ramp == 2 ? LED_ON : LED_DIM, C_CYAN); - KB(K, 10, "FIL", a->fill ? LED_ON : LED_DIM, C_ORANGE); - } else { - snprintf(title, (size_t)cap, "ARPEGGIO"); - *color = bm_track_color(t); - *h1 = "HOLD KEYS = ARPEGGIATE IN TEMPO"; - *h2 = "EXIT: RELEASE ARP"; - for (int k = 0; k < BM_KEYS; k++) { - int note = BM_KEY_BASE_NOTE + k + 12 * a->oct; - snprintf(K[k].label, sizeof K[k].label, "%s", bm_note_names[note % 12]); - K[k].led = LED_DIM; K[k].color = bm_track_color(t); - } - } + case L_HIT: + snprintf(title, (size_t)cap, "SOUND"); + *color = bm_track_color(t); + *h1 = "WHITE = PICK AND HEAR K1-K4 = THE HIT"; + *h2 = "EXIT: ENV OR HOME BLACK = SOUND, BAR"; + map_lanes(a, K, t, 0); + layer_blacks(a, K); return; - case L_COPY: - snprintf(title, (size_t)cap, "COPY PATTERN"); - *color = C_YELLOW; - *h1 = "WHITE = PASTE BLACK+WHITE = ONE TRACK"; - *h2 = "EXIT: RELEASE SAVE"; - for (int w = 0; w < BM_PATTERNS; w++) { - snprintf(b, sizeof b, "%02d", w + 1); - KW(K, w, b, w == a->ctx.st.pattern ? LED_ON : (bm_store_has(&a->store, (uint8_t)w) ? LED_MID : LED_DIM), C_YELLOW); - } - for (int i = 0; i < BM_TRACKS; i++) { - snprintf(b, sizeof b, "T%d", i + 1); - KB(K, i, b, LED_DIM, bm_track_color(i)); /* sostenida: ON (app_leds) */ - } + case L_INST: + snprintf(title, (size_t)cap, "INSTRUMENT"); + *color = bm_track_color(t); + *h1 = "ALGORITHM = THIS DRUM'S SOUND K1-K3"; + *h2 = "EXIT: EDIT OR HOME WHITE = PICK"; + map_lanes(a, K, t, 0); + layer_blacks(a, K); return; - case L_TONE: - snprintf(title, (size_t)cap, "TRANSPOSE"); - *color = C_CYAN; - *h1 = "KEYS = TRANSPOSE PROJECT K2 = OCTAVE"; - *h2 = "EXIT: RELEASE GLO PLAY = TAP TEMPO"; - for (int k = 0; k < BM_KEYS; k++) { - int off = k - 7; - snprintf(K[k].label, sizeof K[k].label, off > 0 ? "+%d" : "%d", off); /* el snprintf del SDK no tiene %+d */ - K[k].led = (24 + off == m->transpose) ? LED_ON : (off == 0 ? LED_MID : LED_DIM); - K[k].color = C_CYAN; + case L_LEN: { /* Slicer, SEQ otra vez (como la capa de antes) */ + snprintf(title, (size_t)cap, "LENGTH/SPEED"); + *color = bm_track_color(t); + char b[6]; + int len = bm_trk_len(&a->pat, t, tr_lane(a)); + for (int w = 0; w < 16; w++) { /* blancas: el largo del pad elegido */ + int v = a->len_page * 16 + w + 1; + snprintf(b, sizeof b, "%d", v); + KW(K, w, b, v == len ? LED_ON : (v < len ? LED_MID : LED_DIM), bm_track_color(t)); } - return; - case L_LANEMUTE: case L_FILL: { - bool fill = L == L_FILL; - snprintf(title, (size_t)cap, fill ? "FILL" : "MUTE INSTRUMENTS"); - *color = fill ? C_ORANGE : bm_track_color(t); - if (fill) { - *h1 = "WHITE = MAKE NOTE FILL-ONLY"; - *h2 = a->layer_latch ? "EXIT: BLACK 11 OR HOME" : "EXIT: RELEASE BLACK 11"; - map_steps(a, K, 3); - page_blacks(a, K); - } else { - *h1 = "WHITE = TOGGLE MUTE BLACK 1-8 = PLAY"; - *h2 = "EXIT: RELEASE BLACK 11"; - map_lanes(a, K, t, 0, LM_MUTE); - if (kind == KIND_TR) tr_blacks(a, K, t, false); /* las negras siguen eligiendo instrumento */ + static const char *const SP[SPD_COUNT] = {"X2", "3/2", "X1", "3/4", "1/2", "1/4"}; + for (int s = 0; s < SPD_COUNT; s++) KB(K, s, SP[s], a->pat.trk[t].speed == s ? LED_ON : LED_DIM, C_WHITE); /* negras 1-6: la velocidad */ + int spb = BM_BAR_TICKS / bm_speed_tps[a->pat.trk[t].speed % SPD_COUNT]; + for (int c = 1; c <= 4; c++) { /* negras 7-10: 1 a 4 compases */ + snprintf(b, sizeof b, "%dBR", c); + KB(K, 5 + c, b, c * spb > BM_STEPS ? LED_OFF : len == c * spb ? LED_ON : LED_DIM, C_YELLOW); } - KB(K, 10, "X", LED_BREATH, fill ? C_ORANGE : C_RED); /* sostenida: ON (app_leds) */ + KB(K, 10, "+16", a->len_page ? LED_ON : LED_MID, C_WHITE); /* 1-16 > 17-32 > 33-48 > 49-64 */ return; } + case L_MUTE: + snprintf(title, (size_t)cap, "MUTE SOUNDS"); + *color = C_RED; + *h1 = "WHITE = MUTE OR PLAY THAT SOUND"; + *h2 = "EXIT: SCL OR HOME BLACK = SOUND, BAR"; + map_lanes(a, K, t, 1); + layer_blacks(a, K); + return; default: break; } - if (a->view == V_CH && a->page == PG_CHORDS) map_chords(a, K); } -/* ------------------------------------------------------------ notas y grabación en vivo */ -static void rec_syn(bm_app *a, int k, int t, const uint8_t *notes, int n) +/* ------------------------------------------------------------ grabación en vivo */ +static void rec_syn(bm_app *a, int k, int t, const uint8_t *notes, int n) { app_rec_at(a, k, t, notes, n, a->ctx.st.rtick); } + +void app_rec_at(bm_app *a, int k, int t, const uint8_t *notes, int n, uint32_t rt) { int tps = bm_speed_tps[a->pat.trk[t].speed % SPD_COUNT]; int len = a->pat.trk[t].length ? a->pat.trk[t].length : 16; - uint32_t rt = a->ctx.st.rtick; uint32_t q = (rt + (uint32_t)tps / 2) / (uint32_t)tps; + int master = bm_master_steps(&a->pat.meta) * BM_TICKS_STEP; + if (master) q %= ((uint32_t)master + (uint32_t)tps - 1u) / (uint32_t)tps; /* pasado el final del maestro: el 0 */ int s = (int)(q % (uint32_t)len); int micro = bm_clampi((int)(rt - q * (uint32_t)tps), -11, 11); /* lo que se adelantó o se atrasó */ if (micro > -3 && micro < 3) micro = 0; /* lo que está casi en el paso, en el paso */ + micro = micro * (a->pat.trk[t].qfree & 3) / 4; /* QUANT (GLO): 100 % = justo en el paso */ a->key_rec_step[k] = (int8_t)s; + uint32_t bt = a->ctx.st.playing ? a->ctx.st.btick : 0; /* REC armado: todavía no arrancó, empieza en 0 */ a->key_rec_tick[k] = rt; + a->key_rec_bt[k] = bt; a->key_rec_slot[k] = -1; a->rec_steps |= 1ull << s; /* esta pasada: se ve en rojo */ + uint8_t busy = 0; /* las casillas de las teclas que siguen apretadas */ + for (int k2 = 0; k2 < BM_KEYS; k2++) + if (k2 != k && a->keys_down[k2] && a->key_trk[k2] == t && a->key_rec_step[k2] >= 0 && a->key_rec_slot[k2] >= 0) + busy |= (uint8_t)(1u << a->key_rec_slot[k2]); + /* Reescribe: lo que había en el paso se borra la primera vez que lo tocas en esta vuelta; lo que + * tocas otra vez en la misma vuelta (un acorde) se suma. Lo que no tocas sigue como estaba. */ + uint8_t gone = 0; + uint32_t loop = (uint32_t)len * (uint32_t)tps; + uint32_t same = loop > (uint32_t)tps ? loop - (uint32_t)tps : (uint32_t)tps / 2u; + if (a->rec_clr_trk != t) { a->rec_clr_on = 0; a->rec_clr_trk = (int8_t)t; } + if (!((a->rec_clr_on >> s) & 1u) || bt - a->rec_clr_bt[s] >= same) { + bm_event z; + bm_event_clear(&z); + for (int e = 0; e < BM_EVENTS; e++) + if (!((busy >> e) & 1u) && !bm_event_empty(bm_evc(&a->pat, t, s, e))) { app_push_ev(a, t, s, e, &z); gone |= (uint8_t)(1u << e); } + } + a->rec_clr_bt[s] = bt; a->rec_clr_on |= 1ull << s; for (int i = 0; i < n; i++) { int slot = -1; for (int e = 0; e < BM_EVENTS; e++) { const bm_event *ev = bm_evc(&a->pat, t, s, e); - if (!bm_event_empty(ev) && ev->note == notes[i]) { slot = e; break; } - if (slot < 0 && bm_event_empty(ev)) slot = e; + bool empty = ((gone >> e) & 1u) || bm_event_empty(ev); /* (lo borrado recién: la cola todavía no lo aplicó) */ + if (!empty && ev->note == notes[i]) { slot = e; break; } + if (slot < 0 && empty && !((busy >> e) & 1u)) slot = e; /* (su gate cortaría a la otra) */ } + if (slot >= 0) gone &= (uint8_t)~(1u << slot); if (slot < 0) continue; bm_event ev; bm_event_clear(&ev); ev.note = notes[i]; ev.len = 1; ev.micro = (int8_t)micro; + if (a->rec_vel >= 127) ev.vel = BM_VEL_ACC; /* BB-303: LFO sostenido */ app_push_ev(a, t, s, slot, &ev); if (a->key_rec_slot[k] < 0) a->key_rec_slot[k] = (int8_t)slot; } @@ -1190,26 +577,26 @@ static int quant_step(const bm_app *a, int t, int len) return (int)(((a->ctx.st.rtick + (uint32_t)tps / 2) / (uint32_t)tps) % (uint32_t)(len ? len : 16)); } -/* un golpe grabado (en SLOOP con ACC sostenida, con acento) */ +/* un golpe grabado: sobrescribe el paso (se suma a lo que ya estaba) */ static void rec_tr(bm_app *a, int t, int lane) { const bm_tr *tr = bm_trk_trc(&a->pat, t); int s = quant_step(a, t, tr->lane[lane].len); - uint8_t acc = a->sloop && a->keys_down[bm_black_key(0)] ? ST_ACC : 0; - app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)lane, (uint8_t)s, (uint8_t)(tr->st[lane][s] | ST_ON | acc)); + uint8_t v = (uint8_t)(tr->st[lane][s] | ST_ON); + if (bm_gesture_is_down(&a->ges, BTN_OCT_UP)) v |= ST_ACC; /* OCT+ sostenido: golpe fuerte = acento */ + else if (bm_gesture_is_down(&a->ges, BTN_OCT_DN)) v &= (uint8_t)~ST_ACC; /* OCT- sostenido: suave */ + app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)lane, (uint8_t)s, v); a->rec_steps |= 1ull << s; a->rec_lanes |= (uint16_t)(1u << (lane & 15)); app_edited(a); } -static void play_notes(bm_app *a, int k, int t, const uint8_t *notes, int n, int vel, int strum) +static void play_notes(bm_app *a, int k, int t, const uint8_t *notes, int n, int vel); +void app_play_notes(bm_app *a, int k, int t, const uint8_t *notes, int n, int vel) { play_notes(a, k, t, notes, n, vel); } + +static void play_notes(bm_app *a, int k, int t, const uint8_t *notes, int n, int vel) { - if (strum && n > 1) { - int32_t packed = 0; - for (int i = 0; i < n && i < 4; i++) packed |= (int32_t)notes[i] << (8 * i); - app_push_i(a, CMD_STRUM, (uint8_t)t, (uint8_t)n, (uint8_t)vel, packed); - } else { - for (int i = 0; i < n; i++) app_push(a, CMD_NOTE_ON, (uint8_t)t, notes[i], (uint8_t)vel); - } + for (int i = 0; i < n; i++) app_push(a, CMD_NOTE_ON, (uint8_t)t, notes[i], (uint8_t)vel); + a->rec_vel = (uint8_t)vel; memcpy(a->key_notes[k], notes, (size_t)n); a->key_nn[k] = (uint8_t)n; a->key_trk[k] = (uint8_t)t; @@ -1217,708 +604,93 @@ static void play_notes(bm_app *a, int k, int t, const uint8_t *notes, int n, int a->key_rec_step[k] = -1; if (a->rec && app_playing(a) && !seq_page(a)) { if (bm_is_grid(&a->pat, t)) rec_tr(a, t, notes[0] & 15); - else if (a->ctx.st.loop_mode[t - 2] == LOOP_OFF) rec_syn(a, k, t, notes, n); - } -} - -static int chord_ext(const bm_app *a, int base) -{ - if (a->chord_mod & 1) return 1; - if (a->chord_mod & 2) return 2; - if (a->chord_mod & 4) return 3; - if (a->chord_mod & 8) return 4; - return base; -} - -static void play_pad(bm_app *a, int k, int pad) -{ - const bm_meta *m = &a->pat.meta; - int t = bm_app_chord_track(a), root, sc = app_scale(a, t, &root); - bm_pad_chord pc = bm_chord_pad(m->chord_set, pad); - int ext = chord_ext(a, pc.ext); - uint8_t notes[4]; - int n = bm_chord_notes(root, sc, pc.degree, ext, m->chord_oct + a->oct, notes); - if (m->chord_voicing == 1 && n >= 3) notes[1] = (uint8_t)bm_clampi(notes[1] + 12, 0, 127); - if (m->chord_voicing == 2 && a->prev_chord_n) { /* conducción de voces */ - int avg = 0; - for (int i = 0; i < a->prev_chord_n; i++) avg += a->prev_chord[i]; - avg /= a->prev_chord_n; - for (int i = 0; i < n; i++) { - while (notes[i] - avg > 6 && notes[i] >= 12) notes[i] -= 12; - while (avg - notes[i] > 6 && notes[i] <= 115) notes[i] += 12; - } - } - memcpy(a->prev_chord, notes, (size_t)n); - a->prev_chord_n = (uint8_t)n; - bm_chord_name(root, sc, pc.degree, ext, a->chord_name, sizeof a->chord_name); - bm_roman(root, sc, pc.degree, ext, a->chord_roman, sizeof a->chord_roman); - a->last_pad = (int8_t)pad; - play_notes(a, k, t, notes, n, 95, 1); -} - -/* las máquinas de bajo (BB-303 y B-MINI) tocan una octava más abajo, en el canal que estén */ -static int bass_machine(const bm_app *a, int t) { int e = app_engine(a, t); return e == ENG_ACID || e == ENG_MINI; } -static int base_oct(const bm_app *a, int t) { return (bass_machine(a, t) ? 2 : 3) + a->oct; } - -/* Tocar el instrumento del canal con una tecla (páginas que no son SEQ). */ -static void play_key_down(bm_app *a, int k, int w, int b) -{ - int t = a->track, kind = app_kind(a, t); - const bm_meta *m = &a->pat.meta; - if (kind == KIND_TR) { - if (w >= 0) { - uint8_t n = (uint8_t)w; - a->sel_lane[t] = (uint8_t)w; - play_notes(a, k, t, &n, 1, 110, 0); - } - return; - } - int root, sc = app_scale(a, t, &root); - if ((a->view == V_CH && a->page == PG_SCL) || m->scale_lock) { - if (w >= 0) { - uint8_t n = (uint8_t)bm_scale_note(root, sc, w, base_oct(a, t)); - play_notes(a, k, t, &n, 1, 105, 0); - } else if (b < 7) { - uint8_t notes[4]; - int ext = chord_ext(a, m->voicing % 5); - int n = bm_chord_notes(root, sc, b, ext, base_oct(a, t), notes); - bm_chord_name(root, sc, b, ext, a->chord_name, sizeof a->chord_name); - bm_roman(root, sc, b, ext, a->chord_roman, sizeof a->chord_roman); - play_notes(a, k, t, notes, n, 95, 1); - } else { a->chord_mod |= (uint8_t)(1u << (b - 7)); a->key_role[k] = ROLE_CMOD; } - return; - } - int note = BM_KEY_BASE_NOTE + k + 12 * a->oct - (bass_machine(a, t) ? 12 : 0); - uint8_t n = (uint8_t)bm_clampi(note, 0, 127); - play_notes(a, k, t, &n, 1, 105, 0); -} - -/* ------------------------------------------------------------ SEQ: pasos */ -static void seq_step_down(bm_app *a, int w) -{ - int t = a->track, kind = app_kind(a, t); - if (a->held_white >= 0) { /* notas: blanca sostenida + otra = una nota larga */ - int s2 = a->step_page * BM_PAGE_STEPS + w, s = a->held_step; - if (kind != KIND_NOTE || s < 0 || s2 <= s) return; - int l = s2 - s + 1; - for (int e = 0; e < BM_EVENTS; e++) { - bm_event ev = *bm_evc(&a->pat, t, s, e); - if (bm_event_empty(&ev)) continue; - ev.len = (uint8_t)l; ev.gate = 0; - app_push_ev(a, t, s, e, &ev); - } - a->held_edit = 1; - app_edited(a); - char b[24]; snprintf(b, sizeof b, TF("LONG NOTE: %d STEPS"), l); - app_toast(a, b); - return; - } - int s = a->step_page * BM_PAGE_STEPS + w; - int len = bm_trk_len(&a->pat, t, kind == KIND_NOTE ? -1 : tr_lane(a)); - if (s >= len) { app_toast(a, "OUTSIDE THE LENGTH"); return; } - app_undo_snapshot(a, t); - a->held_white = (int8_t)w; a->held_step = (int8_t)s; - a->held_long = 0; a->held_edit = 0; a->held_notes = 0; a->step_t0 = a->now; - if (kind == KIND_TR) { - int lane = tr_lane(a); - a->held_had_event = (bm_trk_trc(&a->pat, t)->st[lane][s] & ST_ON) != 0; - if (!a->held_had_event) { app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)lane, (uint8_t)s, ST_ON); app_edited(a); } - return; - } - int idx[4]; - int n = syn_step_events(a, t, s, idx); - a->held_had_event = n > 0; - if (!n) { - bm_event e; bm_event_clear(&e); - e.note = a->last_note[t]; - app_push_ev(a, t, s, 0, &e); - app_edited(a); - } -} - -static void seq_step_up(bm_app *a, int w) -{ - if (w != a->held_white) return; - int t = a->track, s = a->held_step; - if (s >= 0 && a->held_had_event && !a->held_long && !a->held_edit) { - if (bm_is_grid(&a->pat, t)) { app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)tr_lane(a), (uint8_t)s, 0); app_edited(a); } - else { - bm_event e; bm_event_clear(&e); - for (int k = 0; k < BM_EVENTS; k++) app_push_ev(a, t, s, k, &e); - app_edited(a); - } - } - a->held_white = -1; a->held_step = -1; a->held_long = 0; a->held_edit = 0; -} - -/* nota en el paso sostenido (negras 1-8 = grados de la escala) */ -static void step_note(bm_app *a, int note) -{ - int t = a->track, s = a->held_step; - int idx[4], n = syn_step_events(a, t, s, idx); - a->held_edit = 1; - for (int j = 0; j < n; j++) - if (bm_evc(&a->pat, t, s, idx[j])->note == note && (a->held_had_event || a->held_notes)) { /* ya estaba: se quita */ - bm_event e; bm_event_clear(&e); - app_push_ev(a, t, s, idx[j], &e); app_edited(a); - return; - } - int slot = -1; - if (!a->held_had_event && !a->held_notes) slot = n ? idx[0] : 0; /* el primero reemplaza la nota de relleno */ - else for (int e = 0; e < BM_EVENTS && slot < 0; e++) if (bm_event_empty(bm_evc(&a->pat, t, s, e))) slot = e; - if (slot < 0) { app_toast(a, "4 NOTES PER STEP"); return; } - bm_event e; - if (n) e = *bm_evc(&a->pat, t, s, idx[0]); else bm_event_clear(&e); - e.note = (uint8_t)note; - app_push_ev(a, t, s, slot, &e); - a->held_notes++; - a->last_note[t] = (uint8_t)note; - app_edited(a); -} - -/* ------------------------------------------------------------ negra 11: FILL (notas) y MUTE (batería, pads) - * Notas: un toque deja abierta la pantalla de FILL (se cierra con la misma tecla o con HOME); - * mantenerla = solo mientras la sostienes; el fill suena mientras está abierta. Batería y pads (0.9): - * un toque cambia de banco (HI/LO) y sostenerla abre MUTE de instrumentos mientras la sostienes. */ -static void enc_fill_every(bm_app *a, int d); - -static void key_screen_open(bm_app *a, int k, int L) -{ - a->layer = (uint8_t)L; - a->layer_latch = 1; - a->ov.on = 0; - a->key_role[k] = L == L_FILL ? ROLE_FILLK : ROLE_LMUTE; - a->key_t0[k] = a->now; - if (L == L_FILL) { app_push(a, CMD_FILL, 1, 0, 0); a->fill = 1; } -} - -static void hilo(bm_app *a) /* batería y pads: el otro banco de 8 */ -{ - int t = a->track; - a->sel_lane[t] = (uint8_t)((tr_lane(a) + 8) % 16); - app_toast(a, bm_is_pads(t) ? (tr_lane(a) < 8 ? "PADS 1-8" : "PADS 9-16") : tr_lane(a) < 8 ? "INSTRUMENTS 1-8" : "INSTRUMENTS 9-16"); -} - -/* ------------------------------------------------------------ ROLL: ARP en las rejillas (T1, T2) - * Como el ROLL de una TR-8: un toque de ARP deja la pantalla abierta (se cierra con ARP o HOME), - * sostener ARP = solo mientras lo sostienes. Blanca sostenida = ese instrumento o pad se repite; - * negras 1-6 la velocidad, 7/8 CRESC/DECRESC, 11 el fill mientras la sostienes. Todo en vivo: no se - * guarda. Con REC el roll se graba como pasos con repetición (y la rampa, como acentos). */ -static void roll_cfg_send(bm_app *a) -{ - app_push_i(a, CMD_ROLL_CFG, a->roll_ramp, a->roll_swing, bm_roll_tail_ticks[a->roll_tail & 3], bm_roll_len_ticks[a->roll_len & 3]); -} - -static void roll_stop(bm_app *a) /* las blancas sueltan (sigue la cola) */ -{ - for (int l = 0; l < BM_LANES; l++) if (a->roll_mask & (1u << l)) app_push_i(a, CMD_ROLL, a->track, (uint8_t)l, 0, 0); - a->roll_mask = 0; -} - -static void roll_set_rate(bm_app *a, int r) -{ - a->roll_rate = (uint8_t)bm_clampi(r, 0, BM_ROLL_RATES - 1); - app_overlay(a, 0, "ROLL RATE", bm_roll_names[a->roll_rate], "", a->roll_rate * 51, -1, bm_knob_color(0)); - for (int l = 0; l < BM_LANES; l++) if (a->roll_mask & (1u << l)) app_push_i(a, CMD_ROLL, a->track, (uint8_t)l, 1, bm_roll_ticks[a->roll_rate]); -} - -static void roll_open(bm_app *a) -{ - if (a->view != V_CH) app_enter(a, a->track, a->ch_page[a->track]); /* la máquina, entera */ - a->layer = L_ROLL; - a->layer_latch = 1; - a->ov.on = 0; - a->roll_mask = 0; - roll_cfg_send(a); -} - -static void key_screen_close(bm_app *a) -{ - if (a->layer == L_FILL) { app_push(a, CMD_FILL, 0, 0, 0); a->fill = 0; } - if (a->layer == L_FILL || a->layer == L_LANEMUTE || (a->layer_latch && a->layer == L_REP)) a->layer = L_NONE; - if (a->layer == L_ROLL && a->layer_latch) { roll_stop(a); a->layer = L_NONE; } - a->layer_latch = 0; -} - -/* LFO en una máquina sin página de LFO (BR-8, BP-1, BB-303, MIDI): un toque deja abierta su - * capa de mantener (REPETIR en las de pasos, LIGAR en las de notas) hasta LFO otra vez o HOME. */ -static bool lfo_has_page(const bm_app *a, int t) -{ - return app_kind(a, t) == KIND_NOTE && !app_midi(a, t) && bm_engine_page_of(app_engine(a, t), EPG_LFO) >= 0; -} - -static void lfo_latch(bm_app *a) -{ - if (a->layer) return; /* nunca dos capas a la vez */ - if (a->view != V_CH) app_enter(a, a->track, a->ch_page[a->track]); /* la capa es de la máquina */ - a->layer = L_REP; - a->layer_latch = 1; - a->ov.on = 0; -} - -/* FILL: la blanca deja ese golpe (o esa nota) solo para el fill, u otra vez como siempre */ -static void paint_fill(bm_app *a, int w) -{ - int t = a->track, s = a->step_page * 16 + w, kind = app_kind(a, t); - app_undo_snapshot(a, t); - if (kind == KIND_NOTE) { - if (s >= a->pat.trk[t].length) return; - int idx[4], n = syn_step_events(a, t, s, idx); - if (!n) { app_toast(a, "STEP HAS NO NOTES: WRITE THEM IN SEQ"); return; } - int fill = bm_evc(&a->pat, t, s, idx[0])->prob != BM_PROB_FILL; - for (int j = 0; j < n; j++) { - bm_event e = *bm_evc(&a->pat, t, s, idx[j]); - e.prob = fill ? BM_PROB_FILL : 100; - app_push_ev(a, t, s, idx[j], &e); - } - app_toast(a, fill ? "ONLY IN THE FILL" : "ALWAYS PLAYS"); - app_edited(a); - return; - } - const bm_tr *tr = bm_trk_trc(&a->pat, t); - int lane = tr_lane(a); - if (s >= tr->lane[lane].len) return; - uint8_t v = tr->st[lane][s]; - int cond = (v & ST_COND_MASK) >> ST_COND_SH; - if (!(v & ST_ON)) v = (uint8_t)(ST_ON | (1u << ST_COND_SH)); /* vacío: golpe solo en el fill */ - else if (cond == 1) v = 0; /* ya era del fill: se borra */ - else v = (uint8_t)((v & ~ST_COND_MASK) | (1u << ST_COND_SH)); /* golpe normal: pasa al fill */ - app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)lane, (uint8_t)s, v); - app_edited(a); -} - -/* ------------------------------------------------------------ capas: pasos pintados */ -static void paint_accent(bm_app *a, int w) -{ - int t = a->track, s = a->step_page * 16 + w, kind = app_kind(a, t); - app_undo_snapshot(a, t); - if (kind == KIND_NOTE) { - if (s >= a->pat.trk[t].length) return; - int idx[4], n = syn_step_events(a, t, s, idx); - if (!n) { bm_event e; bm_event_clear(&e); e.note = a->last_note[t]; e.vel = BM_VEL_ACC; app_push_ev(a, t, s, 0, &e); app_edited(a); return; } - for (int j = 0; j < n; j++) { - bm_event e = *bm_evc(&a->pat, t, s, idx[j]); - e.vel = e.vel >= BM_VEL_ACC ? BM_VEL_GHOST : e.vel <= BM_VEL_GHOST ? BM_VEL_NORMAL : BM_VEL_ACC; - app_push_ev(a, t, s, idx[j], &e); - } - app_edited(a); - return; - } - const bm_tr *tr = bm_trk_trc(&a->pat, t); - int lane = tr_lane(a); - if (s >= tr->lane[lane].len) return; - uint8_t v = tr->st[lane][s]; - app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)lane, (uint8_t)s, (v & ST_ON) ? (v ^ ST_ACC) : (ST_ON | ST_ACC)); - app_edited(a); -} - -static void paint_repeat(bm_app *a, int w) -{ - int t = a->track, s = a->step_page * 16 + w, kind = app_kind(a, t); - app_undo_snapshot(a, t); - if (kind == KIND_NOTE) { - if (s >= a->pat.trk[t].length) return; - int idx[4], n = syn_step_events(a, t, s, idx); - for (int j = 0; j < n; j++) { - bm_event e = *bm_evc(&a->pat, t, s, idx[j]); - e.len = (e.len & BM_LEN_TIE) ? (uint8_t)(e.len & BM_LEN_MASK) : (uint8_t)(e.len | BM_LEN_TIE); - app_push_ev(a, t, s, idx[j], &e); - } - if (n) app_edited(a); - return; - } - const bm_tr *tr = bm_trk_trc(&a->pat, t); - int lane = tr_lane(a); - if (s >= tr->lane[lane].len) return; - uint8_t v = tr->st[lane][s]; - int ln = lane; - if (!(v & ST_ON)) v = ST_ON; - int r = (v & ST_FLAM) ? 4 : (v & ST_RAT_MASK) >> ST_RAT_SH; - r = (r + 1) % 5; - v = (uint8_t)(v & ~(ST_RAT_MASK | ST_FLAM)); - if (r == 4) v |= ST_FLAM; else v |= (uint8_t)(r << ST_RAT_SH); - app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)ln, (uint8_t)s, v); - app_edited(a); -} - -static void set_len(bm_app *a, int t, int len) -{ - len = bm_clampi(len, 1, BM_STEPS); - if (bm_is_grid(&a->pat, t)) { for (int l = 0; l < BM_LANES; l++) app_push_i(a, CMD_SET_LANE, (uint8_t)t, (uint8_t)l, 0, len); app_edited(a); } - else app_set_track(a, t, TRK_OFF(length), len); - char b[24]; snprintf(b, sizeof b, TF("T%d LENGTH %d"), t + 1, len); - app_toast(a, b); -} - -/* El sampler: CAPT escribe en la rejilla lo que BREAK está haciendo en este compás (el pad que - * cambió, las repeticiones y los silencios). La reversa y la media velocidad no se guardan. */ -static void capture(bm_app *a) -{ - const bm_tr *tr = &a->pat.tr[1]; - const bm_ctx *c = &a->ctx; - app_undo_snapshot(a, 1); - uint32_t blk = c->st.gen_blk; - int n = 0; - for (int k = 0; k < 16; k++) { - uint8_t sub = c->gen_sl[k], fx = c->gen_fx[k]; - if (sub == 0xFF && !(fx & (GEN_RT_MASK | GEN_SKIP))) continue; - uint32_t at = blk * 16u + (uint32_t)k; - uint8_t keep = 0; - int first = -1; - for (int l = 0; l < BM_LANES; l++) { - int len = tr->lane[l].len ? tr->lane[l].len : 16, s = (int)(at % (uint32_t)len); - if (!(tr->st[l][s] & ST_ON)) continue; - if (first < 0) { first = l; keep = tr->st[l][s]; } - if (sub != 0xFF || (fx & GEN_SKIP)) app_push_i(a, CMD_SET_TRSTEP, 1, (uint8_t)l, (uint8_t)s, 0); - } - if (first < 0 || (fx & GEN_SKIP)) { n += first >= 0; continue; } - int l = sub != 0xFF ? sub : first; - int len = tr->lane[l].len ? tr->lane[l].len : 16, s = (int)(at % (uint32_t)len); - uint8_t v = (uint8_t)((keep & ~(ST_RAT_MASK | ST_FLAM | ST_LOCK)) | ST_ON); - int rt = fx & GEN_RT_MASK; - if (rt >= 1 && rt <= 3) v |= (uint8_t)(rt << ST_RAT_SH); - app_push_i(a, CMD_SET_TRSTEP, 1, (uint8_t)l, (uint8_t)s, v); - n++; - } - app_edited(a); - char b[30]; snprintf(b, sizeof b, TF("CAPTURED: %d STEPS"), n); - app_toast(a, b); -} - -/* ------------------------------------------------------------ PADS (T2) */ -static const char *const PAD_MODE_N[PAD_MODES] = {"ONESHOT", "KEY", "THRU", "LOOP"}; -const char *bm_pad_mode_name(int mode) { return PAD_MODE_N[(unsigned)mode % PAD_MODES]; } - -static uint32_t snap_len(const bm_app *a, const bm_take *tk) -{ - uint32_t bpm = tk->bpm_x10 ? tk->bpm_x10 : a->pat.meta.bpm_x10; - uint32_t eighth = (uint32_t)BM_SMP_RATE * 300u / bpm; /* muestras por corchea */ - return a->cut_snap == 1 ? eighth / 2 : a->cut_snap == 2 ? eighth : 0; -} - -static uint32_t snap_to(const bm_app *a, const bm_take *tk, uint32_t pos) -{ - uint32_t step = snap_len(a, tk); - return step ? ((pos + step / 2) / step) * step : pos; -} - -/* la ganancia, el BPM o los compases de una toma cambiaron */ -static void take_changed(bm_app *a, int id) -{ - a->take_dirty |= (uint8_t)(1u << id); - a->t_edit = a->now; - app_send_takes(a); -} - -static const bm_take *pad_take(const bm_app *a, const bm_pad *p) -{ - return p->src < BM_TAKES && a->take[p->src].valid ? &a->take[p->src] : NULL; -} - -/* Una tecla toca un pad: sostenida, según su modo (ONESHOT, KEY, THRU, LOOP). Con REC sonando, - * el golpe queda en la línea del pad. */ -static void pad_down(bm_app *a, int k, int pad) -{ - a->key_role[k] = ROLE_PAD; - a->pad_key = (int8_t)k; - a->sel_lane[1] = (uint8_t)pad; - app_push(a, CMD_PAD_KEY, 1, (uint8_t)pad, a->sloop && a->keys_down[bm_black_key(0)] ? 127 : 110); /* SLOOP: ACC */ - if (a->rec && app_playing(a)) rec_tr(a, 1, pad); -} - -/* Escuchar un trozo de una toma (TAKES): sostenido sigue por la toma. */ -static void preview_down(bm_app *a, int k, int src, uint32_t start, uint32_t len) -{ - a->key_role[k] = ROLE_PREVIEW; - a->pad_key = (int8_t)k; - app_push_i(a, CMD_SMP_PREVIEW, 1, (uint8_t)src, 0, (int32_t)(start | len << 16)); -} - -static void pad_toast(bm_app *a, const char *fmt) -{ - char b[30]; snprintf(b, sizeof b, fmt, a->sel_lane[1] % 16 + 1); - app_toast(a, b); -} - -/* N1-N4 de PADS: copiar, pegar, vaciar, y el inicio al golpe más cercano */ -static void pad_copy(bm_app *a) -{ - int l = a->sel_lane[1] & 15; - a->pad_clip = a->pat.pad[l]; - a->pad_clip_level = a->pat.tr[1].lane[l].level; a->pad_clip_choke = a->pat.tr[1].lane[l].choke; - a->pad_clip_on = 1; - pad_toast(a, TF("PAD %d COPIED")); -} - -static void pad_paste(bm_app *a) -{ - if (!a->pad_clip_on) { app_toast(a, "NOTHING TO PASTE HERE"); return; } - int l = a->sel_lane[1] & 15; - a->pat.pad[l] = a->pad_clip; - app_push_i(a, CMD_SET_LANE, 1, (uint8_t)l, 1, a->pad_clip_level); - app_push_i(a, CMD_SET_LANE, 1, (uint8_t)l, 7, a->pad_clip_choke); - app_edited(a); - pad_toast(a, TF("PASTED ON PAD %d")); -} - -static void pad_clear(bm_app *a) -{ - bm_pad_clear(app_pad(a)); - app_edited(a); - pad_toast(a, TF("PAD %d EMPTY")); -} - -static void pad_hit(bm_app *a) -{ - bm_pad *p = app_pad(a); - const bm_take *tk = pad_take(a, p); - if (!tk) { app_toast(a, "EMPTY PAD: TAKES > PAD"); return; } - uint32_t m[BM_SLICES], bpm = tk->bpm_x10 ? tk->bpm_x10 : a->pat.meta.bpm_x10; - int n = bm_slice_onsets(tk->data, tk->len, (uint32_t)BM_SMP_RATE * 75u / bpm, 127, m); - uint32_t best = p->start, d = 0xFFFFFFFFu, end = (uint32_t)p->start + p->len; - for (int i = 0; i < n; i++) { - uint32_t x = m[i] > p->start ? m[i] - p->start : p->start - m[i]; - if (x < d && m[i] + 64 < end) { d = x; best = m[i]; } - } - p->start = (uint16_t)best; p->len = (uint16_t)(end - best); - app_edited(a); - app_toast(a, "START ON THE HIT"); -} - -/* K de la página TRIM: mueve el inicio (el final queda) o el largo. Sin SNAP, dos columnas de la - * ventana por paso; con SNAP, de rejilla en rejilla. */ -static void pad_trim(bm_app *a, int which, int d) -{ - bm_pad *p = app_pad(a); - const bm_take *tk = pad_take(a, p); - if (!tk) { app_toast(a, "EMPTY PAD: TAKES > PAD"); return; } - uint32_t step = snap_len(a, tk), span = a->cut_v1 > a->cut_v0 ? a->cut_v1 - a->cut_v0 : tk->len; - int32_t px = (int32_t)(span / 116u); - if (px < 8) px = 8; - int32_t end = (int32_t)p->start + p->len; - if (which == 0) { - int32_t s = (int32_t)p->start; - s = step ? (int32_t)snap_to(a, tk, (uint32_t)s) + lst(a, d) * (int32_t)step : s + d * px; - s = bm_clampi(s, 0, end - 64); - p->start = (uint16_t)s; p->len = (uint16_t)(end - s); - } else { - int32_t e = step ? (int32_t)snap_to(a, tk, (uint32_t)end) + lst(a, d) * (int32_t)step : end + d * px; - e = bm_clampi(e, (int32_t)p->start + 64, (int32_t)tk->len); - p->len = (uint16_t)(e - (int32_t)p->start); - } - app_edited(a); -} - -static void pad_sound(bm_app *a, int k, int d) -{ - bm_pad *p = app_pad(a); - int l = a->sel_lane[1] & 15; - const bm_lane *ln = &a->pat.tr[1].lane[l]; - char b[16]; - if (!bm_pad_ok(p)) { app_toast(a, "EMPTY PAD: TAKES > PAD"); return; } - if (a->ed_page[1] == 1) { /* SOUND: PITCH LEVEL PLAY DIR */ - if (k == 0) { p->pitch = (uint8_t)bm_clampi(p->pitch + lst(a, d), 0, 48); snprintf(b, sizeof b, "%+d", p->pitch - 24); app_overlay(a, 0, "PITCH", b, "ST", p->pitch * 255 / 48, 128, bm_knob_color(0)); } - else if (k == 1) { int v = bm_clampi(ln->level + d, 0, 127); app_push_i(a, CMD_SET_LANE, 1, (uint8_t)l, 1, v); snprintf(b, sizeof b, "%d", v); app_overlay(a, 1, "LEVEL", b, "", v * 2, -1, bm_knob_color(1)); } - else if (k == 2) { p->mode = (uint8_t)wrap(p->mode + lst(a, d), PAD_MODES); app_overlay(a, 2, "PLAY", PAD_MODE_N[p->mode], "", p->mode * 85, -1, bm_knob_color(2)); } - else { p->flags = (uint8_t)(d > 0 ? p->flags | PAD_REV : p->flags & ~PAD_REV); app_overlay(a, 3, "DIR", (p->flags & PAD_REV) ? "REV" : "FWD", "", (p->flags & PAD_REV) ? 255 : 0, -1, bm_knob_color(3)); } - } else if (a->ed_page[1] == 3) { /* LOOP: dónde empieza y termina el sustain */ - if (k == 0) { p->loop_s = (uint8_t)bm_clampi(p->loop_s + d, 0, 254); if (p->loop_e && p->loop_e <= p->loop_s) p->loop_e = (uint8_t)(p->loop_s + 1); snprintf(b, sizeof b, "%d", p->loop_s * 100 / 255); app_overlay(a, 0, "LOOP IN", b, "%", p->loop_s, -1, bm_knob_color(0)); } - else if (k == 1) { int v = bm_clampi(p->loop_e + d, 0, 255); if (v && v <= p->loop_s) v = p->loop_s + 1; p->loop_e = (uint8_t)v; if (v) snprintf(b, sizeof b, "%d", v * 100 / 255); else snprintf(b, sizeof b, "WHOLE"); app_overlay(a, 1, "LOOP OUT", b, v ? "%" : "", v, -1, bm_knob_color(1)); } - else if (k == 2) { p->mode = (uint8_t)wrap(p->mode + lst(a, d), PAD_MODES); app_overlay(a, 2, "PLAY", PAD_MODE_N[p->mode], "", p->mode * 85, -1, bm_knob_color(2)); } - if (k <= 1 && p->mode != PAD_LOOP) { p->mode = PAD_LOOP; app_toast(a, "PLAY = LOOP: HELD REPEATS THE LOOP"); } - } else { /* ENV: ATTACK RELEASE CHOKE TEMPO */ - if (k == 0) { p->attack = (uint8_t)bm_clampi(p->attack + d, 0, 127); } - else if (k == 1) { p->release = (uint8_t)bm_clampi(p->release + d, 0, 127); } - else if (k == 2) { int v = bm_clampi(ln->choke + lst(a, d), 0, 3); app_push_i(a, CMD_SET_LANE, 1, (uint8_t)l, 7, v); } - else p->flags = (uint8_t)(d > 0 ? p->flags | PAD_TEMPO : p->flags & ~PAD_TEMPO); /* derecha SYNC */ - } - app_edited(a); -} - -/* Un kit desde la toma marcada en TAKES (pregunta si el kit ya tiene pads). */ -static void kit_ask(bm_app *a, int src, int how) -{ - if (src >= BM_TAKES || !a->take[src].valid) { app_toast(a, "NO TAKE"); return; } - if (app_kit_empty(a)) { - int n = app_kit_from_take(a, src, how); - char b[30]; snprintf(b, sizeof b, TF("KIT: %d PADS"), n); - app_toast(a, b); - return; + else if (a->ctx.st.loop_mode[t - 2] == LOOP_OFF && !a->pat.trk[t].arp_mode) rec_syn(a, k, t, notes, n); /* con ARP graba el arpegiador */ } - char l1[30]; snprintf(l1, sizeof l1, TF("NEW KIT FROM TAKE %02d?"), src + 1); - app_ask(a, ASK_KIT, src, how, l1, "THE PADS ARE REPLACED"); -} - -/* ------------------------------------------------------------ teclas */ -/* GLO de la consola > SONG: blancas 1-10 agregan el patrón, negras 7-10 ponen (o quitan) una escena - * en la entrada elegida, negra 11 la borra. */ -static void song_append(bm_app *a, int p) -{ - if (a->song.n >= BM_SONG_MAX) { app_toast(a, "SONG FULL"); return; } - a->song.pat[a->song.n] = (uint8_t)(p & 15); a->song.rep[a->song.n] = 1; - a->song_cur = a->song.n++; - a->song_dirty = 1; a->t_edit = a->now; -} - -static void song_scene(bm_app *a, int s) -{ - if (!a->song.n) { app_toast(a, "ADD A PATTERN FIRST"); return; } - uint8_t *e = &a->song.pat[a->song_cur % a->song.n]; - int cur = bm_song_scene(*e); - *e = (uint8_t)(bm_song_pat(*e) | (cur == s ? 0 : (s + 1) << 4)); /* la misma otra vez: se quita */ - a->song_dirty = 1; a->t_edit = a->now; - char b[24]; - if (cur == s) snprintf(b, sizeof b, TF("ENTRY %d: NO SCENE"), a->song_cur + 1); - else snprintf(b, sizeof b, TF("ENTRY %d: SCENE %c"), a->song_cur + 1, 'A' + s); - app_toast(a, b); -} - -static void song_delete(bm_app *a) -{ - if (!a->song.n) return; - for (int i = a->song_cur; i + 1 < a->song.n; i++) { a->song.pat[i] = a->song.pat[i + 1]; a->song.rep[i] = a->song.rep[i + 1]; } - a->song.n--; - if (a->song_cur >= a->song.n && a->song_cur) a->song_cur--; - a->song_dirty = 1; a->t_edit = a->now; -} - -/* Grabación libre (como una loopera): en un canal de notas vacío, REC no tiene largo fijo. - * Al parar REC, el canal queda con los compases completos que tocaste (1-4) y cada nota - * con lo que la sostuviste. */ -static int notes_empty(const bm_app *a, int t) -{ - for (int s = 0; s < BM_STEPS; s++) - for (int k = 0; k < BM_EVENTS; k++) if (!bm_event_empty(bm_evc(&a->pat, t, s, k))) return 0; - return 1; -} - -static void free_rec_start(bm_app *a) -{ - int t = a->track; - if (app_kind(a, t) != KIND_NOTE || !notes_empty(a, t)) return; - a->rec_free = (uint8_t)(t + 1); - a->rec_free_t0 = app_playing(a) ? a->ctx.st.btick : 0xFFFFFFFFu; - app_set_track(a, t, TRK_OFF(length), BM_STEPS); - app_toast(a, "FREE REC: REC AGAIN CLOSES"); } -static void free_rec_close(bm_app *a) -{ - int t = a->rec_free - 1; - a->rec_free = 0; - int spb = BM_BAR_TICKS / bm_speed_tps[a->pat.trk[t].speed % SPD_COUNT]; - int bars = 1; - if (a->rec_free_t0 != 0xFFFFFFFFu) { - uint32_t el = a->ctx.st.btick - a->rec_free_t0; - bars = bm_clampi((int)((el + BM_BAR_TICKS / 2) / BM_BAR_TICKS), 1, 4); - } - int len = bm_clampi(bars * spb, 1, BM_STEPS); - /* lo grabado se dobla sobre el largo nuevo, en su mismo lugar del compás */ - bm_notes *nb = &a->redo.nt; - a->redo_track = -1; - for (int s = 0; s < BM_STEPS; s++) for (int k = 0; k < BM_EVENTS; k++) bm_event_clear(&nb->ev[s][k]); - for (int s = 0; s < BM_STEPS; s++) - for (int k = 0; k < BM_EVENTS; k++) { - const bm_event *e = bm_evc(&a->pat, t, s, k); - if (bm_event_empty(e)) continue; - int d = s % len; - for (int j = 0; j < BM_EVENTS; j++) - if (bm_event_empty(&nb->ev[d][j])) { nb->ev[d][j] = *e; break; } - else if (nb->ev[d][j].note == e->note) break; - } - app_push_ptr(a, CMD_TRACK_BULK, (uint8_t)t, nb); - app_set_track(a, t, TRK_OFF(length), len); - char b[30]; snprintf(b, sizeof b, bars > 1 ? TF("T%d: %d BARS") : TF("T%d: %d BAR"), t + 1, bars); - app_toast(a, b); -} +/* ------------------------------------------------------------ REC y PLAY/REC + * Como SLOOP: se graba sobre el largo que tiene el canal; al llegar al final da la vuelta y lo que + * tocas reescribe sus pasos. Grabar nunca alarga el canal. */ +/* REC: lo que tocas reescribe los pasos que tocas del canal del cursor */ +static void rec_set(bm_app *a, int on); +void app_rec_set(bm_app *a, int on) { rec_set(a, on); } -/* REC: grabar en el canal del cursor (con el canal vacío, en libre) o dejar de grabar */ static void rec_set(bm_app *a, int on) { a->rec = (uint8_t)on; - app_push(a, CMD_REC, a->rec, 0, 0); - if (a->rec) { app_undo_snapshot(a, a->track); a->rec_steps = 0; a->rec_lanes = 0; } + a->rec_clr_on = 0; + app_push(a, CMD_REC, a->rec, a->track, 0); + if (a->rec) { a->rec_steps = 0; a->rec_lanes = 0; } app_toast(a, a->rec ? "REC ON" : "REC OFF"); - if (a->rec) free_rec_start(a); - else if (a->rec_free) free_rec_close(a); } -/* SLOOP-REC (REC en MIX o FX): la consola arma el canal del cursor y las teclas dejan de ser del - * mezclador: tocan esa máquina y graban con el REC expresivo. REC otra vez = el mezclador. */ +/* REC parado en el SEQ de una máquina: paso a paso (las teclas escriben en el paso del cursor). Con + * PLAY sigue grabando en vivo. */ +void app_step_rec(bm_app *a) +{ + a->rec = 1; + app_push(a, CMD_REC, 1, a->track, 0); + a->rec_steps = 0; a->rec_lanes = 0; + app_toast(a, "STEP REC"); +} + +/* PLAY/REC: HOME en la misma pantalla, pero el teclado deja de ser del mezclador y toca (y graba) la + * máquina del cursor. Se entra con la blanca del canal del cursor (o con REC, ya grabando); se sale + * con HOME. */ void app_sloop(bm_app *a, int on) { if (!on == !a->sloop) return; a->sloop = (uint8_t)(on ? 1 : 0); - a->card = 0; a->mach_arm = 0; - if (a->rec != a->sloop) rec_set(a, a->sloop); - if (a->sloop) { char b[30]; snprintf(b, sizeof b, TF("SLOOP: T%d %s"), a->track + 1, bm_track_name(a, a->track)); app_toast(a, b); } + if (!on && a->rec) rec_set(a, 0); } -/* SLOOP: SELECT cambió de canal. La grabación libre del anterior se cierra y la del nuevo empieza - * (si está vacío); deshacer y el rojo de "esta pasada" pasan al nuevo. */ +/* PLAY/REC: SELECT cambió de canal: la grabación (y el arpegiador) pasa al nuevo, con el rojo de + * "esta pasada". */ static void sloop_follow(bm_app *a) { - if (a->rec_free) free_rec_close(a); if (!a->rec) return; - app_undo_snapshot(a, a->track); + app_push(a, CMD_REC, a->rec, a->track, 0); /* el arpegiador graba en el canal nuevo */ a->rec_steps = 0; a->rec_lanes = 0; - free_rec_start(a); - char b[30]; snprintf(b, sizeof b, TF("SLOOP: T%d %s"), a->track + 1, bm_track_name(a, a->track)); - app_toast(a, b); } -/* Mute de un canal: con CUE (y sonando), cambia en el próximo compás junto con lo demás */ +/* ------------------------------------------------------------ mutes, escenas y canales */ static void toggle_mute(bm_app *a, int t) { char b[24]; - if (a->cue && app_playing(a)) { - app_push(a, CMD_MUTE_CUE, (uint8_t)(1u << t), 0, 0); - snprintf(b, sizeof b, TF("T%d: NEXT BAR"), t + 1); - app_toast(a, b); - return; - } bool muted = !a->pat.trk[t].mute; /* el patrón cambia cuando el audio lo aplica */ app_set_track(a, t, TRK_OFF(mute), muted ? 1 : 0); snprintf(b, sizeof b, "%s %s", bm_track_name(a, t), T(muted ? "MUTED" : "ON")); app_toast(a, b); } -static void toggle_lane_mute(bm_app *a, int t, int lane) -{ - uint16_t m = (uint16_t)(bm_trk_trc(&a->pat, t)->mute ^ (1u << lane)); - app_push_i(a, CMD_LANE_MUTE, (uint8_t)t, 0, 0, m); - app_edited(a); - char b[24]; snprintf(b, sizeof b, "%s %s", T(bm_lane_name(a, t, lane)), T((m >> lane) & 1 ? "MUTE" : "PLAYS")); - app_toast(a, b); -} +/* Escenas: cada patrón tiene 4, una foto de los mutes. Guardar: la blanca de un patrón sostenida + la + * negra de la escena (se guarda en ese patrón). Una escena guardada del patrón que suena, con un toque, + * entra en el próximo compás (parado: ya). Borrar: la negra de la escena sostenida 3 s. */ +#define SCENE_DEL_MS 3000u +static bm_scene *scn(const bm_app *a, int pat, int s) { return (bm_scene *)&a->song.scene[pat % BM_PATTERNS][s]; } -/* ------------------------------------------------------------ escenas (0.9: solo mutes, del proyecto) - * Toque en una vacía = guardar los mutes de ahora · toque en una guardada = entra en el próximo compás - * (parado: ya) · 2 s = guardar encima · EDIT sostenido + escena = vaciarla · A sostenida + C, B = una - * cadena que avanza cada ciclo maestro. */ -static void scene_store(bm_app *a, int s) +static void scene_store(bm_app *a, int pat, int s) { - bm_scene *sc = &a->song.scene[s]; + bm_scene *sc = scn(a, pat, s); uint16_t lm[BM_TR_TRACKS]; sc->trk_mute = bm_mutes_get(&a->pat, lm); memcpy(sc->lane_mute, lm, sizeof lm); sc->flags = SCN_STORED; a->song_dirty = 1; a->t_edit = a->now; - char b[24]; snprintf(b, sizeof b, TF("SCENE %c STORED"), 'A' + s); + char b[30]; snprintf(b, sizeof b, TF("SCENE %c A%02d STORED"), 'A' + s, pat + 1); app_toast(a, b); } static void scene_clear(bm_app *a, int s) { - memset(&a->song.scene[s], 0, sizeof a->song.scene[s]); + memset(scn(a, a->ctx.st.pattern, s), 0, sizeof(bm_scene)); a->song_dirty = 1; a->t_edit = a->now; - char b[24]; snprintf(b, sizeof b, TF("SCENE %c CLEARED"), 'A' + s); + char b[24]; snprintf(b, sizeof b, TF("SCENE %c DELETED"), 'A' + s); app_toast(a, b); } static void scene_launch(bm_app *a, int s) { - a->chain_n = 1; a->chain[0] = (uint8_t)s; app_push(a, CMD_SCENE, (uint8_t)s, 0, 0); char b[24]; snprintf(b, sizeof b, app_playing(a) ? TF("SCENE %c: NEXT BAR") : TF("SCENE %c"), 'A' + s); app_toast(a, b); @@ -1927,103 +699,164 @@ static void scene_launch(bm_app *a, int s) static void scene_key(bm_app *a, int k, int s) { a->key_role[k] = ROLE_SCENE; a->key_t0[k] = a->now; - uint8_t held = (uint8_t)(a->launch_held & ~(1u << s)); - a->launch_held |= (uint8_t)(1u << s); - if (!held) return; /* sola: hace lo suyo al soltarla */ - if (!a->scn_chain) { /* la cadena empieza por la sostenida */ - a->chain_n = 0; - for (int i = 0; i < BM_SCENES && !a->chain_n; i++) if ((held >> i) & 1) a->chain[a->chain_n++] = (uint8_t)i; - } - if (a->chain_n < 8) a->chain[a->chain_n++] = (uint8_t)s; - a->scn_chain = 1; - app_push_ptr(a, CMD_CHAIN, a->chain_n, a->chain); - for (int i = 0; i < BM_KEYS; i++) if (a->keys_down[i] && a->key_role[i] == ROLE_SCENE) a->key_role[i] = ROLE_SCNDONE; - char b[24]; snprintf(b, sizeof b, TF("CHAIN OF %d SCENES"), a->chain_n); - app_toast(a, b); + if (!a->pat_held) return; /* sola: un toque la lanza, 3 s la borra */ + int pat = 0; + while (!((a->pat_held >> pat) & 1)) pat++; /* el patrón sostenido */ + scene_store(a, pat, s); /* con un patrón sostenido: guardar los mutes de ahora */ + a->key_role[k] = ROLE_SCNDONE; + for (int i = 0; i < BM_KEYS; i++) /* el patrón sostenido sirvió de modificador: no se elige */ + if (a->keys_down[i] && a->key_role[i] == ROLE_PAT) a->key_role[i] = ROLE_PATUSED; } -/* La tecla de un canal (blancas 11-16): baja = el cursor; sostenida = su tarjeta (app_input_tick); - * con HOME sostenido, a esa máquina al soltar HOME. */ +static void mach_reset(bm_app *a, int t); + +/* La tecla de un canal (blancas 11-16): con el cursor ya en él entra a PLAY/REC; si no, mueve el cursor. */ static void chan_key(bm_app *a, int k, int t) { - a->key_role[k] = ROLE_CHAN; a->key_t0[k] = a->now; - if (a->layer == L_HOME) { a->home_go = (uint8_t)(t + 1); a->track = (uint8_t)t; return; } - if (a->card) return; /* una tarjeta a la vez */ + a->key_role[k] = ROLE_CHAN; + if (a->view == V_GLO) { a->track = (uint8_t)t; mach_reset(a, t); return; } + if (t == a->track) { app_sloop(a, 1); return; } a->track = (uint8_t)t; - a->card_turn = 0; } -/* La consola: blancas 1-10 patrones, 11-16 canales; negras 1-6 mutes, 7-10 escenas, 11 CUE. */ +/* El mezclador: blancas 1-9 patrones (se eligen al soltar), 10 nada, 11-16 canales; negras 1-6 mutes, 7 sin + * función, 8-11 escenas. */ static void console_key(bm_app *a, int k, int w, int b) { if (w >= 0) { - if (w >= BM_PATTERNS) { chan_key(a, k, w - BM_PATTERNS); return; } + if (w >= BM_CH_W0) { chan_key(a, k, BM_ORDER[w - BM_CH_W0]); return; } + if (w >= BM_PATTERNS) return; /* la 10: espacio de seguridad */ a->key_role[k] = ROLE_PAT; - if (a->pat_held & ~(1u << w)) { /* otra blanca sostenida: cadena */ - if (a->pchain_n < 8) a->pchain[a->pchain_n++] = (uint8_t)w; - app_push_ptr(a, CMD_PCHAIN, a->pchain_n, a->pchain); - char t[24]; snprintf(t, sizeof t, TF("CHAIN OF %d PATTERNS"), a->pchain_n); - app_toast(a, t); - } else { - a->pchain_n = 0; - a->pchain[a->pchain_n++] = (uint8_t)w; - app_select_pattern(a, w); - } a->pat_held |= (uint16_t)(1u << w); return; } - if (b < 6) { a->key_role[k] = ROLE_MUTE; a->key_t0[k] = a->now; return; } - if (b < 10) { scene_key(a, k, b - 6); return; } - a->key_role[k] = ROLE_CUE; a->key_t0[k] = a->now; /* CUE: mientras la sostienes; un toque la deja fija */ - a->cue |= 1; + if (b < 6) { + a->key_t0[k] = a->now; + if (a->solo_on) { toggle_mute(a, BM_ORDER[b]); a->key_role[k] = ROLE_SOLOADD; return; } /* en SOLO: ese canal se suma */ + a->key_role[k] = ROLE_MUTE; + return; + } + if (b >= SCENE_B0 && b < SCENE_B0 + BM_SCENES) scene_key(a, k, b - SCENE_B0); } -static void song_key(bm_app *a, int k, int w, int b) +/* Una tecla toca un pad del sampler: sostenida, según su modo (ONESHOT, KEY, THRU, LOOP). Con REC + * sonando, el golpe queda en la línea del pad. */ +static void pad_down(bm_app *a, int k, int pad) { - if (w >= 0 && w < BM_PATTERNS) { song_append(a, w); return; } - if (b >= 6 && b < 10) { song_scene(a, b - 6); return; } - if (b == 10) { song_delete(a); return; } - console_key(a, k, w, b); /* los canales y los mutes siguen siendo de la consola */ + a->key_role[k] = ROLE_PAD; + a->pad_key = (int8_t)k; + a->sel_lane[1] = (uint8_t)pad; + app_push(a, CMD_PAD_KEY, 1, (uint8_t)pad, 110); + if (a->rec && app_playing(a)) rec_tr(a, 1, pad); } -/* SLOOP-REC: las teclas tocan (y graban) el canal del cursor */ +void app_pad_down(bm_app *a, int k, int pad) { pad_down(a, k, pad & 15); } + +/* PLAY/REC: las teclas tocan (y graban) el canal del cursor */ static void sloop_key(bm_app *a, int k, int w, int b) { + (void)b; int t = a->track; - if (app_kind(a, t) == KIND_NOTE) { play_key_down(a, k, w, b); return; } - if (w >= 0) { - a->sel_lane[t] = (uint8_t)w; - if (bm_is_pads(t)) { pad_down(a, k, w); return; } - uint8_t n = (uint8_t)w; - play_notes(a, k, t, &n, 1, a->keys_down[bm_black_key(0)] ? 127 : 110, 0); + if (app_kind(a, t) == KIND_NOTE) { + uint8_t n = (uint8_t)bm_clampi(key_note(a, t, k), 0, 127); + play_notes(a, k, t, &n, 1, 105); return; } - if (b == 0) a->key_role[k] = ROLE_ACC; /* ACC: los golpes de mientras, con acento */ + if (w < 0) return; /* las negras de la batería y del sampler: sin función */ + a->sel_lane[t] = (uint8_t)w; + if (bm_is_pads(t)) { pad_down(a, k, w); return; } + uint8_t n = (uint8_t)w; + int vel = bm_gesture_is_down(&a->ges, BTN_OCT_UP) ? 127 : bm_gesture_is_down(&a->ges, BTN_OCT_DN) ? 55 : 100; /* como SLOOP */ + play_notes(a, k, t, &n, 1, vel); } -/* B9 / B10: las páginas de pasos */ -static void step_page_turn(bm_app *a, int d) +/* ------------------------------------------------------------ secuenciador de la batería: pasos */ +static void step_page_set(bm_app *a, int p) { int pages = step_pages(a); - a->step_page = (uint8_t)bm_clampi(a->step_page + d, 0, pages - 1); - char b[24]; snprintf(b, sizeof b, TF("PAGE %d/%d"), a->step_page + 1, pages); + if (pages < 2) { app_toast(a, "ONE BAR ONLY"); return; } /* con un solo compás no hay a dónde ir */ + p = (p % pages + pages) % pages; /* en círculo */ + a->step_page = (uint8_t)p; + char b[24]; snprintf(b, sizeof b, TF("BAR %d/%d"), p + 1, pages); app_toast(a, b); } -/* las negras de la batería y de los pads fuera de las capas: 1-8 eligen (y tocan) un instrumento, - * 11 toque HI/LO o sostenida MUTE de instrumentos (app_input_tick) */ -static void tr_black_key(bm_app *a, int k, int b) +static void seq_step_down(bm_app *a, int w) { int t = a->track; - if (b < 8) { - int lane = (tr_lane(a) / 8) * 8 + b; - a->sel_lane[t] = (uint8_t)lane; - if (bm_is_pads(t)) { pad_down(a, k, lane); return; } - uint8_t n = (uint8_t)lane; - play_notes(a, k, t, &n, 1, 100, 0); - } else if (b == 10) { a->key_role[k] = ROLE_HILO; a->key_t0[k] = a->now; } + int s = a->step_page * BM_PAGE_STEPS + w; + int len = bm_trk_len(&a->pat, t, tr_lane(a)); + if (s >= len) { app_toast(a, "OUTSIDE THE LENGTH"); return; } + a->held_white = (int8_t)w; a->held_step = (int8_t)s; + a->held_long = 0; a->held_edit = 0; a->held_notes = 0; a->step_t0 = a->now; + int lane = tr_lane(a); + a->held_had_event = (bm_trk_trc(&a->pat, t)->st[lane][s] & ST_ON) != 0; + if (!a->held_had_event) { app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)lane, (uint8_t)s, ST_ON); app_edited(a); } +} + +static void seq_step_up(bm_app *a, int w) +{ + if (w != a->held_white) return; + int t = a->track, s = a->held_step; + if (s >= 0 && a->held_had_event && !a->held_long && !a->held_edit) { + app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)tr_lane(a), (uint8_t)s, 0); app_edited(a); + } + a->held_white = -1; a->held_step = -1; a->held_long = 0; a->held_edit = 0; +} + +/* Una capa abierta con un toque queda hasta que la cierre el mismo botón, otro botón o HOME */ +static void key_screen_close(bm_app *a) +{ + if (a->layer_latch) a->layer = L_NONE; + a->layer_latch = 0; +} + +static void layer_latch_open(bm_app *a, int L) +{ + if (a->layer || a->view != V_CH) return; /* nunca dos capas a la vez */ + a->layer = (uint8_t)L; + a->layer_latch = 1; + a->ov.on = 0; +} + +static void toggle_lane_mute(bm_app *a, int t, int lane) +{ + uint16_t m = (uint16_t)(bm_trk_trc(&a->pat, t)->mute ^ (1u << lane)); + app_push_i(a, CMD_LANE_MUTE, (uint8_t)t, 0, 0, m); + app_edited(a); + char b[24]; snprintf(b, sizeof b, "%s %s", T(bm_lane_name(a, t, lane)), T((m >> lane) & 1 ? "MUTE" : "PLAYS")); + app_toast(a, b); +} + +/* ------------------------------------------------------------ capas: pasos pintados */ +static void paint_accent(bm_app *a, int w) +{ + int t = a->track, s = a->step_page * 16 + w; + const bm_tr *tr = bm_trk_trc(&a->pat, t); + int lane = tr_lane(a); + if (s >= tr->lane[lane].len) return; + uint8_t v = tr->st[lane][s]; + app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)lane, (uint8_t)s, (v & ST_ON) ? (v ^ ST_ACC) : (ST_ON | ST_ACC)); + app_edited(a); } +static void paint_repeat(bm_app *a, int w) +{ + int t = a->track, s = a->step_page * 16 + w; + const bm_tr *tr = bm_trk_trc(&a->pat, t); + int lane = tr_lane(a); + if (s >= tr->lane[lane].len) return; + uint8_t v = tr->st[lane][s]; + if (!(v & ST_ON)) v = ST_ON; + int r = (v & ST_FLAM) ? 4 : (v & ST_RAT_MASK) >> ST_RAT_SH; + r = (r + 1) % 5; + v = (uint8_t)(v & ~(ST_RAT_MASK | ST_FLAM)); + if (r == 4) v |= ST_FLAM; else v |= (uint8_t)(r << ST_RAT_SH); + app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)lane, (uint8_t)s, v); + app_edited(a); +} + +/* ------------------------------------------------------------ teclas */ static void key_release(bm_app *a, int k, int w, int b) { if (a->key_nn[k]) { @@ -2032,287 +865,136 @@ static void key_release(bm_app *a, int k, int w, int b) if (a->key_rec_step[k] >= 0 && a->key_rec_slot[k] >= 0 && app_kind(a, t) == KIND_NOTE) { int tps = bm_speed_tps[a->pat.trk[t].speed % SPD_COUNT]; int s = a->key_rec_step[k]; - uint32_t held = a->ctx.st.rtick - a->key_rec_tick[k]; /* lo que la sostuviste, en ticks */ + uint32_t held = a->ctx.st.btick - a->key_rec_bt[k]; /* lo que la sostuviste, en ticks (btick no vuelve a 0 con el maestro) */ int steps = (int)(held / (uint32_t)tps), frac = (int)(held % (uint32_t)tps), gate = 0; if (frac * 8 > tps) { steps++; gate = frac * 100 / tps; if (gate >= 90) gate = 0; } if (steps < 1) { steps = 1; gate = bm_clampi(frac * 100 / tps, 10, 99); if (gate >= 90) gate = 0; } - if (!a->rec_free) { /* el compás corta la nota (auto-gate clip) */ + { /* el compás corta la nota (auto-gate clip) */ int spb = BM_BAR_TICKS / tps, end = (s / spb + 1) * spb; if (s + steps > end) { steps = end - s; gate = 0; } } - steps = bm_clampi(steps, 1, BM_STEPS); + int Lc = a->pat.trk[t].length ? a->pat.trk[t].length : 16; /* y nunca más que el canal: no se pisa a sí misma */ + steps = bm_clampi(steps, 1, Lc < BM_STEPS ? Lc : BM_STEPS); + uint8_t tie = 0; + if (a->pat.trk[t].engine == ENG_ACID) { /* BB-303: tocada ligada = SLIDE hasta la siguiente */ + int L = a->pat.trk[t].length ? a->pat.trk[t].length : 16; + for (int k2 = 0; k2 < BM_KEYS; k2++) + if (k2 != k && a->keys_down[k2] && a->key_nn[k2] && a->key_trk[k2] == t && a->key_rec_step[k2] >= 0 && + (int32_t)(a->key_rec_bt[k2] - a->key_rec_bt[k]) > 0) { + int dist = (a->key_rec_step[k2] - s + L) % L; + if (dist >= 1) { steps = dist; gate = 0; tie = BM_LEN_TIE; } + break; + } + } for (int e = 0; e < BM_EVENTS; e++) { bm_event ev = *bm_evc(&a->pat, t, s, e); for (int i = 0; i < a->key_nn[k]; i++) - if (!bm_event_empty(&ev) && ev.note == a->key_notes[k][i]) { ev.len = (uint8_t)steps; ev.gate = (uint8_t)gate; app_push_ev(a, t, s, e, &ev); } + if (!bm_event_empty(&ev) && ev.note == a->key_notes[k][i]) { ev.len = (uint8_t)(steps | tie); ev.gate = (uint8_t)gate; app_push_ev(a, t, s, e, &ev); } } } a->key_nn[k] = 0; a->key_rec_step[k] = -1; } - if (a->punch_key == k) { app_push(a, CMD_PUNCH, 0xFF, 0, 0); a->punch_key = -1; } - bool tap = a->now - a->key_t0[k] < UI_HOLD_MS; + if (a->view == V_MACH) mach_key_up(a, k); switch (a->key_role[k]) { case ROLE_MUTE: if (a->solo_key == k && a->solo_on) { /* fin del solo: vuelven los mutes de antes */ - for (int t = 0; t < BM_TRACKS; t++) app_set_track(a, t, TRK_OFF(mute), (a->solo_saved >> t) & 1); - a->solo_on = 0; a->solo_key = -1; - } else if (b >= 0 && b < 6) toggle_mute(a, b); - if (a->solo_key == k) a->solo_key = -1; - break; - case ROLE_FILL: app_push(a, CMD_FILL, 0, 0, 0); a->fill = 0; break; - case ROLE_SCENE: /* sola y corta: guardar (vacía) o lanzar */ - if (b >= 6 && b < 10) { - int s = b - 6; - if (a->song.scene[s].flags & SCN_STORED) scene_launch(a, s); else scene_store(a, s); - } - break; - case ROLE_CHAN: - if (w >= BM_PATTERNS && a->card == w - BM_PATTERNS + 1) { /* la tarjeta: soltar = entrar (si no se giró nada) */ - int t = w - BM_PATTERNS; - a->card = 0; a->mach_arm = 0; - if (!a->card_turn) app_enter(a, t, a->ch_page[t]); - } + for (int t = 0; t < BM_TRACKS; t++) app_set_track(a, t, TRK_OFF(mute), (a->solo_saved >> t) & 1); + a->solo_on = 0; a->solo_key = -1; + app_toast(a, "SOLO OFF"); + } else if (b >= 0 && b < 6) toggle_mute(a, BM_ORDER[b]); + if (a->solo_key == k) a->solo_key = -1; break; - case ROLE_CUE: - a->cue &= (uint8_t)~1u; - if (tap) a->cue ^= 2; /* un toque la deja fija; otro la suelta */ - app_toast(a, a->cue ? "CUE: MUTES AND SCENES ON THE NEXT BAR" : "CUE OFF"); + case ROLE_PAT: /* un toque: el patrón entra al final del compás */ + if (w >= 0 && w < BM_PATTERNS) app_select_pattern(a, w); break; - case ROLE_HILO: - if (a->layer == L_LANEMUTE && !a->layer_latch) a->layer = L_NONE; /* sostenida: MUTE mientras la sostenías */ - else if (tap) hilo(a); + case ROLE_SCENE: /* un toque: lanzar la escena (si está guardada) */ + if (b >= SCENE_B0 && b < SCENE_B0 + BM_SCENES && (scn(a, a->ctx.st.pattern, b - SCENE_B0)->flags & SCN_STORED)) scene_launch(a, b - SCENE_B0); break; - case ROLE_BRKFX: - if (b >= 8) { a->brk_live &= (uint8_t)~(1u << (b - 8)); app_push(a, CMD_BRK_LIVE, a->brk_live, 0, 0); } + case ROLE_LREP: /* mantenida: solo mientras la sostienes; un toque la deja abierta */ + if (a->layer == L_REP && a->layer_latch && a->now - a->key_t0[k] >= UI_HOLD_MS) key_screen_close(a); break; case ROLE_PAD: /* solo la última tecla de pad lo suelta */ if (a->pad_key == k) { app_push(a, CMD_PAD_KEY, 0, (uint8_t)(a->sel_lane[1] & 15), 0); a->pad_key = -1; } break; - case ROLE_PREVIEW: - if (a->pad_key == k) { app_push(a, CMD_SMP_PREVIEW, 0, 0, 0); a->pad_key = -1; } - break; - case ROLE_CMOD: /* solo el modificador suelta su +7/+9/SUS: un acorde no */ - if (b >= 0 && b < 4) a->chord_mod &= (uint8_t)~(1u << b); - else if (b >= 7 && b <= 10) a->chord_mod &= (uint8_t)~(1u << (b - 7)); - break; - case ROLE_LMUTE: case ROLE_FILLK: /* mantenida: era solo mientras la sostenías */ - if (a->layer_latch && !tap) key_screen_close(a); - break; default: break; } a->key_role[k] = ROLE_NONE; a->key_t0[k] = 0; - if (b >= 6 && b < 10) { - a->launch_held &= (uint8_t)~(1u << (b - 6)); - if (!a->launch_held) a->scn_chain = 0; - } if (w >= 0) { - if (a->roll_mask & (1u << w)) { a->roll_mask &= (uint16_t)~(1u << w); app_push_i(a, CMD_ROLL, a->track, (uint8_t)w, 0, 0); } - a->erase_mask &= (uint16_t)~(1u << w); - if (!a->erase_mask) a->erase_syn = 0; - a->pat_held &= (uint16_t)~(1u << w); + if (w < BM_PATTERNS) a->pat_held &= (uint16_t)~(1u << w); seq_step_up(a, w); } } -static void layer_key(bm_app *a, int k, int w, int b) +/* Elegir (y escuchar) un instrumento */ +static void pick_lane(bm_app *a, int k, int lane) { - int t = a->track, kind = app_kind(a, t); - switch (a->layer) { - case L_HOME: console_key(a, k, w, b); return; - case L_LEN: - if (w >= 0) set_len(a, t, a->len_page * 16 + w + 1); - else if (b == 10) { /* +16: 1-16 > 17-32 > 33-48 > 49-64 */ - a->len_page = (uint8_t)((a->len_page + 1) % 4); - char s[24]; snprintf(s, sizeof s, TF("LENGTHS %d-%d"), a->len_page * 16 + 1, a->len_page * 16 + 16); app_toast(a, s); - } else if (b >= 6 && b <= 9) { /* compases completos */ - int spb = BM_BAR_TICKS / bm_speed_tps[a->pat.trk[t].speed % SPD_COUNT]; - set_len(a, t, (b - 5) * spb); - } else if (b < SPD_COUNT) { - app_set_track(a, t, TRK_OFF(speed), b); - char s[24]; snprintf(s, sizeof s, TF("T%d SPEED %s"), t + 1, bm_speed_names[b]); - app_toast(a, s); - } - return; - case L_ACC: if (w >= 0) paint_accent(a, w); else if (b == 8 || b == 9) step_page_turn(a, b == 9 ? 1 : -1); return; - case L_REP: if (w >= 0) paint_repeat(a, w); else if (b == 8 || b == 9) step_page_turn(a, b == 9 ? 1 : -1); return; - case L_LANEMUTE: case L_FILL: - if (b == 10) { if (a->layer_latch) key_screen_close(a); return; } /* la misma tecla: salir */ - if (w >= 0) { - if (a->layer == L_FILL) paint_fill(a, w); - else if (kind == KIND_TR) toggle_lane_mute(a, t, w); - return; - } - if (a->layer == L_FILL) { if (b == 8 || b == 9) step_page_turn(a, b == 9 ? 1 : -1); return; } - if (kind == KIND_TR && b >= 0 && b < 8) { /* elegir (y escuchar) un instrumento */ - int lane = (tr_lane(a) / 8) * 8 + b; - a->sel_lane[t] = (uint8_t)lane; - if (bm_is_pads(t)) { pad_down(a, k, lane); return; } - uint8_t n = (uint8_t)lane; - play_notes(a, k, t, &n, 1, 100, 0); - } - return; - case L_PUNCH: - if (w >= 0) { app_push(a, CMD_PUNCH, (uint8_t)w, 0, 0); a->punch_key = (int8_t)k; } - else if (b < 6) toggle_mute(a, b); - return; - case L_ERASE: - if (b >= 0) { - bool con = console(a); - if (b == 0) app_copy_track(a, t); - else if (b == 1) app_paste_track(a, t); - else if (b == 2) app_clear_track(a, t); - else if (b == 3 && t == 1) capture(a); - else if (b == 5) app_do_undo(a); - else if (con && b >= 6 && b < 10) scene_clear(a, b - 6); /* en la consola: vaciar la escena */ - else if (b == 6) app_do_redo(a); - else if ((b == 8 || b == 9) && kind == KIND_NOTE && !con) step_page_turn(a, b == 9 ? 1 : -1); - return; - } - if (kind == KIND_TR) { - if (app_playing(a)) { if (!a->erase_mask) app_undo_snapshot(a, t); a->erase_mask |= (uint16_t)(1u << w); } - else { - const bm_tr *tr = bm_trk_trc(&a->pat, t); - app_undo_snapshot(a, t); - for (int s = 0; s < BM_STEPS; s++) if (tr->st[w][s]) app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)w, (uint8_t)s, 0); - app_edited(a); - char m[24]; snprintf(m, sizeof m, TF("%s ERASED"), T(bm_lane_name(a, t, w))); app_toast(a, m); - } - } else { - if (app_playing(a)) { if (!a->erase_syn) app_undo_snapshot(a, t); a->erase_syn = 1; a->erase_mask |= (uint16_t)(1u << w); } - else { - int s = a->step_page * 16 + w; - app_undo_snapshot(a, t); - bm_event e; bm_event_clear(&e); for (int kk = 0; kk < BM_EVENTS; kk++) app_push_ev(a, t, s, kk, &e); - app_edited(a); - } - } - return; - case L_ROLL: - if (w >= 0) { - a->roll_mask |= (uint16_t)(1u << w); - a->sel_lane[t] = (uint8_t)w; - app_push_i(a, CMD_ROLL, (uint8_t)t, (uint8_t)w, 1, bm_roll_ticks[a->roll_rate % BM_ROLL_RATES]); - } else if (b >= 0 && b < BM_ROLL_RATES) roll_set_rate(a, b); - else if (b == 6 || b == 7) { /* CRESC / DECRESC: otra vez, plano */ - int r = b == 6 ? 1 : 2; - a->roll_ramp = (uint8_t)(a->roll_ramp == r ? 0 : r); - roll_cfg_send(a); - } else if (b == 10) { app_push(a, CMD_FILL, 1, 0, 0); a->fill = 1; a->key_role[k] = ROLE_FILL; } /* FILL + ROLL */ - return; - case L_CHORDS: - if (w >= 0) play_pad(a, k, w); - else if (b < 4) { a->chord_mod |= (uint8_t)(1u << b); a->key_role[k] = ROLE_CMOD; } - return; - case L_ARP: { - int note = BM_KEY_BASE_NOTE + k + 12 * a->oct - (bass_machine(a, t) ? 12 : 0); - uint8_t n = (uint8_t)bm_clampi(note, 0, 127); - play_notes(a, k, t, &n, 1, 105, 0); - return; - } - case L_COPY: - if (w >= 0 && w < BM_PATTERNS) { - if (app_playing(a)) { app_toast(a, "STOP TO COPY"); return; } - if (w == a->ctx.st.pattern) { app_toast(a, "IT IS THE CURRENT PATTERN"); return; } - int trk = -1; - for (int i = 0; i < BM_TRACKS; i++) if (a->keys_down[bm_black_key(i)]) trk = i; - char l1[30], l2[30]; - if (trk >= 0) snprintf(l1, sizeof l1, TF("COPY T%d TO A%02d?"), trk + 1, w + 1); - else snprintf(l1, sizeof l1, TF("COPY A%02d TO A%02d?"), a->ctx.st.pattern + 1, w + 1); - snprintf(l2, sizeof l2, TF("A%02d ALREADY HAS DATA"), w + 1); - if (bm_store_has(&a->store, (uint8_t)w)) app_ask(a, trk >= 0 ? ASK_COPY_TRK : ASK_COPY_PAT, w, trk, l1, l2); - else if (trk >= 0) { app_job(a, JOB_COPY_TRK, w | (trk << 4)); app_toast(a, "TRACK COPIED"); } - else { app_job(a, JOB_COPY_PAT, w); app_toast(a, "PATTERN COPIED"); } - } - return; - case L_TONE: { - int tp = bm_clampi(24 + k - 7, 0, 48); - app_set_meta(a, META_OFF(transpose), tp); - char s[24]; snprintf(s, sizeof s, TF("TRANSPOSE %+d"), tp - 24); - app_toast(a, s); - return; - } - default: return; - } + a->sel_lane[a->track] = (uint8_t)lane; + uint8_t n = (uint8_t)lane; + play_notes(a, k, a->track, &n, 1, 100); } -static void seq_keys(bm_app *a, int k, int w, int b) +/* LENGTH AND SPEED (Slicer): el largo del pad elegido en pasos, la velocidad del canal */ +static void pad_len_set(bm_app *a, int len) { - int t = a->track, kind = app_kind(a, t); - if (w >= 0) { seq_step_down(a, w); return; } - if (b == 8 || b == 9) { step_page_turn(a, b == 9 ? 1 : -1); return; } /* < y > */ - if (kind == KIND_TR) { tr_black_key(a, k, b); return; } - if (b < 8) { /* notas: grados de la escala */ - int root, sc = app_scale(a, t, &root); - int note = bm_scale_note(root, sc, b, base_oct(a, t)); - if (a->held_step >= 0) { step_note(a, note); return; } - uint8_t n = (uint8_t)note; - play_notes(a, k, t, &n, 1, 105, 0); - if (a->rec && app_playing(a) && a->ctx.st.loop_mode[t - 2] == LOOP_OFF) rec_syn(a, k, t, &n, 1); - } else key_screen_open(a, k, L_FILL); + int t = a->track, lane = tr_lane(a); + len = bm_clampi(len, 1, BM_STEPS); + app_push_i(a, CMD_SET_LANE, (uint8_t)t, (uint8_t)lane, LN_LEN, len); + app_edited(a); + if (a->step_page * 16 >= len) a->step_page = (uint8_t)((len - 1) / 16); + char b[24]; snprintf(b, sizeof b, TF("P%d LENGTH %d"), lane + 1, len); + app_toast(a, b); } -static void page_keys(bm_app *a, int k, int w, int b) +static void speed_set(bm_app *a, int s) { - int t = a->track, kind = app_kind(a, t); - switch (a->page) { - case PG_SEQ: seq_keys(a, k, w, b); return; - case PG_CHORDS: - if (w >= 0) play_pad(a, k, w); - else if (b < 4) { a->chord_mod |= (uint8_t)(1u << b); a->key_role[k] = ROLE_CMOD; } - return; - case PG_TAKES: { - uint8_t src = bm_app_takes_sel(a); - if (src >= BM_TAKES || !a->take[src].valid) { if (w >= 0 || b < 4) app_toast(a, "NO TAKE"); return; } - const bm_take *tk = &a->take[src]; - if (w >= 0) { /* la toma en 16 partes: sostenida sigue */ - preview_down(a, k, src, tk->len * (uint32_t)w / 16u, tk->len / 16u); - return; - } - if (b == 0) kit_ask(a, src, 0); /* KIT en los golpes */ - else if (b == 1 || b == 2) kit_ask(a, src, b == 1 ? 16 : 8); - else if (b == 3) { /* la toma entera en el pad elegido */ - app_pad_take(a, a->sel_lane[1] & 15, src); - char m[30]; snprintf(m, sizeof m, TF("TAKE %02d > PAD %d"), src + 1, (a->sel_lane[1] & 15) + 1); - app_toast(a, m); - } else if (b == 10) { - char l1[30]; snprintf(l1, sizeof l1, TF("DELETE TAKE %02d?"), src + 1); - app_ask(a, ASK_TAKE_DEL, src, 0, l1, "CANNOT BE UNDONE"); - } + int t = a->track; + s = bm_clampi(s, 0, SPD_COUNT - 1); + app_set_track(a, t, TRK_OFF(speed), s); + char b[24]; snprintf(b, sizeof b, TF("T%d SPEED %s"), app_pos(t) + 1, bm_speed_names[s]); + app_toast(a, b); +} + +static void len_key(bm_app *a, int w, int b) +{ + int t = a->track; + if (w >= 0) { pad_len_set(a, a->len_page * 16 + w + 1); return; } + if (b < SPD_COUNT) { speed_set(a, b); return; } + if (b >= 6 && b <= 9) { /* compases completos */ + int spb = BM_BAR_TICKS / bm_speed_tps[a->pat.trk[t].speed % SPD_COUNT]; + if ((b - 5) * spb <= BM_STEPS) pad_len_set(a, (b - 5) * spb); return; } - case PG_REC: /* grabando, las teclas no suenan; después, escuchar la toma nueva */ - if (w >= 0 && !a->ctx.st.smp_rec && a->ctx.st.smp_unsaved) { - uint32_t len = a->ctx.smp[0].len; - preview_down(a, k, BM_TAKE_NEW, len * (uint32_t)w / 16u, len / 16u); - } - return; - case PG_PADS: - if (w >= 0) { pad_down(a, k, w); return; } - if (b == 0) pad_copy(a); - else if (b == 1) pad_paste(a); - else if (b == 2) pad_clear(a); - else if (b == 3) pad_hit(a); - else if (b >= 8) { /* REV, HALF, STUTTER mientras se sostienen */ - a->key_role[k] = ROLE_BRKFX; - a->brk_live |= (uint8_t)(1u << (b - 8)); - app_push(a, CMD_BRK_LIVE, a->brk_live, 0, 0); - } - return; - default: break; + if (b == 10) { /* +16: 1-16 > 17-32 > 33-48 > 49-64 */ + a->len_page = (uint8_t)((a->len_page + 1) % 4); + char s[24]; snprintf(s, sizeof s, TF("LENGTHS %d-%d"), a->len_page * 16 + 1, a->len_page * 16 + 16); + app_toast(a, s); } - if (kind == KIND_TR && b >= 0) { tr_black_key(a, k, b); return; } - play_key_down(a, k, w, b); } -/* La pregunta: el control que preguntó la acepta sostenido 2 s; soltarlo antes, u otro, es no. */ -static void ask_no(bm_app *a, int same) +static void layer_key(bm_app *a, int k, int w, int b) { - int was = a->ask; - a->ask = ASK_NONE; - if (was == ASK_DISCARD && same) { app_set_view(a, V_HOME); app_toast(a, "TAKE KEPT (NOT SAVED)"); } /* HOME otra vez: la toma queda y HOME sale */ - else app_toast(a, "CANCELED"); + int t = a->track; + if (a->layer == L_LEN) { len_key(a, w, b); return; } + if (a->layer != L_REP && b >= 0) { /* LFO, ENV, EDIT y SCL */ + int lane = (tr_lane(a) / 8) * 8 + b; + if (b < 8 && a->layer == L_MUTE) toggle_lane_mute(a, t, lane); /* acceso rápido: mutea */ + else if (b < 8) a->sel_lane[t] = (uint8_t)lane; /* acceso rápido: elige, sin sonar */ + else if (b == 9 || b == 10) step_page_set(a, a->step_page + (b == 10 ? 1 : -1)); /* los compases, en círculo */ + return; + } + if (b >= 0 && b < 8) { pick_lane(a, k, (tr_lane(a) / 8) * 8 + b); return; } /* navegar: los instrumentos de la página */ + if (b == 8 || b == 9) { step_page_set(a, a->step_page + (b == 9 ? 1 : -1)); return; } /* y los compases, en círculo */ + if (b == 10) { if (a->layer == L_REP && a->layer_latch) key_screen_close(a); return; } + if (w < 0) return; + switch (a->layer) { + case L_ACC: paint_accent(a, w); return; + case L_REP: paint_repeat(a, w); return; + case L_HIT: case L_INST: pick_lane(a, k, w); return; + case L_MUTE: toggle_lane_mute(a, t, w); return; + default: return; + } } void bm_app_key(bm_app *a, int k, int down, uint32_t now) @@ -2323,339 +1005,88 @@ void bm_app_key(bm_app *a, int k, int down, uint32_t now) if (a->keys_down[k]) return; a->keys_down[k] = 1; bm_gesture_other(&a->ges, now); - if (bm_gesture_is_down(&a->ges, BTN_HOME)) a->home_used = 1; } else { if (!a->keys_down[k]) return; a->keys_down[k] = 0; } if (a->view == V_BOOT) return; - a->cur_ctl = (uint8_t)(ASK_KEY | k); - if (a->ask) { - if (a->ask_ctl == (ASK_KEY | k)) { /* la tecla que preguntó */ - if (down) { a->ask_live = 1; a->ask_t0 = now; return; } - ask_no(a, 1); - } else if (down) { ask_no(a, 0); return; } /* otra tecla: no (y no hace nada más) */ - } int w = bm_key_white_index(k), b = bm_key_black_index(k); if (!down) { key_release(a, k, w, b); return; } if (a->layer) { layer_key(a, k, w, b); return; } switch (a->view) { - case V_HOME: case V_FXG: + case V_HOME: if (a->sloop) sloop_key(a, k, w, b); else console_key(a, k, w, b); return; - case V_GLO: - if (a->glo_page == GP_SONG) song_key(a, k, w, b); else console_key(a, k, w, b); + case V_GLO: console_key(a, k, w, b); return; + case V_MACH: mach_key(a, k, w, b); return; + case V_CH: + if (w >= 0) seq_step_down(a, w); + else if (b >= 0 && b < 8) pick_lane(a, k, (tr_lane(a) / 8) * 8 + b); /* negras 1-8: eligen (y tocan) un instrumento de la página de sonidos */ + else if (b == 10) { /* negra 11: la página de REPEAT (un toque la deja abierta) */ + a->key_role[k] = ROLE_LREP; a->key_t0[k] = a->now; + layer_latch_open(a, L_REP); + } + else if (b == 8 || b == 9) step_page_set(a, a->step_page + (b == 9 ? 1 : -1)); /* negras 9 y 10: el compás anterior / siguiente */ return; - case V_CH: page_keys(a, k, w, b); return; - default: play_key_down(a, k, w, b); return; + default: return; /* SYSTEM y SAVE: el teclado no hace nada */ } } /* ------------------------------------------------------------ botones */ -static bool oct_ok(const bm_app *a); - -static int layer_of(const bm_app *a, int id) -{ - switch (id) { - case BTN_HOME: return L_HOME; - case BTN_SEQ: return L_LEN; - case BTN_EDIT: return L_ERASE; - case BTN_ENV: return L_ACC; - case BTN_LFO: return L_REP; - case BTN_FX: return L_PUNCH; - case BTN_SCL: return L_CHORDS; - case BTN_ARP: return bm_is_grid(&a->pat, a->track) ? L_ROLL : L_ARP; - case BTN_SAVE: return L_COPY; - case BTN_GLO: return L_TONE; - default: return L_NONE; - } -} - -static void open_layer(bm_app *a, int id) -{ - if (a->layer) return; /* nunca dos capas a la vez */ - if (id == BTN_EDIT && a->view == V_COPYCH) return; /* COPY TRACK: EDIT sostenido 2 s pega */ - int L = layer_of(a, id); - if (!L) return; - if (L == L_ARP && app_kind(a, a->track) != KIND_NOTE) return; - a->layer = (uint8_t)L; - a->ov.on = 0; - if (L == L_ARP) app_push(a, CMD_ARP, a->track, 1, 0); - if (L == L_ROLL) { a->roll_mask = 0; roll_cfg_send(a); } - if (L == L_ERASE) { a->erase_mask = 0; a->erase_syn = 0; } - if (L == L_LEN) { - int len = bm_trk_len(&a->pat, a->track, app_kind(a, a->track) == KIND_NOTE ? -1 : 0); - a->len_page = (uint8_t)((len - 1) / 16); - } -} - -static void close_layer(bm_app *a, int id) -{ - int L = layer_of(a, id); - if (L == L_ROLL && a->layer == L_ARP) L = L_ARP; - if (L == L_ARP && a->layer == L_ROLL) L = L_ROLL; - if (!L || a->layer != L) return; - if (L == L_PUNCH) { app_push(a, CMD_PUNCH, 0xFF, 0, 0); a->punch_key = -1; } - if (L == L_ARP) app_push(a, CMD_ARP, a->track, 0, 0); - if (L == L_ROLL) { roll_stop(a); a->layer_latch = 0; } - if (L == L_ERASE) { a->erase_mask = 0; a->erase_syn = 0; } - a->layer = L_NONE; -} - -/* El GLO de la consola en una de sus páginas */ -static void glo_open(bm_app *a, int page) -{ - a->glo_page = (uint8_t)(page % GP_COUNT); - a->glo_row = 0; - a->card = 0; a->mach_arm = 0; - app_set_view(a, V_GLO); -} - -/* Toque de un botón. En la consola: FX su FX (otra vez, la página siguiente), SCL y GLO su GLO; los - * demás entran a la máquina del cursor en esa página. Dentro de una máquina: su página; otra vez, la - * siguiente. GLO dentro de la máquina: su GLO; otra vez, de vuelta. */ -static void button_page(bm_app *a, int id) -{ - int t = a->track, kind = app_kind(a, t), midi = app_midi(a, t); - if (console(a)) { - switch (id) { - case BTN_FX: - if (a->view == V_FXG) a->fx_page = (uint8_t)((a->fx_page + 1) % FXP_COUNT); - else { a->fx_page = FXP_CHANNEL; a->card = 0; app_set_view(a, V_FXG); } - return; - case BTN_SCL: glo_open(a, GP_SCALE); return; - case BTN_GLO: - if (a->view == V_GLO) { a->glo_page = (uint8_t)((a->glo_page + 1) % GP_COUNT); a->glo_row = 0; a->mach_arm = 0; } - else glo_open(a, GP_TEMPO); - return; - default: break; - } - } - int cur = a->view == V_CH ? a->page : -1, pg = PG_SEQ; - switch (id) { - case BTN_SEQ: - if (cur == PG_SEQ) pg = bm_is_pads(t) ? PG_BREAK : (kind == KIND_NOTE && !midi) ? PG_LOOP : PG_SEQ; - else pg = PG_SEQ; - break; - case BTN_EDIT: - if (bm_is_pads(t)) { /* PADS: TRIM > SOUND > ENV */ - if (cur == PG_PADS) a->ed_page[t] = (uint8_t)((a->ed_page[t] + 1) % 4); - pg = PG_PADS; - } else if (midi) pg = PG_MIDI; - else if (kind == KIND_TR) { /* SONIDO > INSTR (2 páginas) > SONIDO */ - if (cur == PG_SOUND) { pg = PG_INST; a->ed_page[t] = 0; } - else if (cur == PG_INST && a->ed_page[t] + 1 < BM_LANE_PAGES) { pg = PG_INST; a->ed_page[t]++; } - else pg = PG_SOUND; - } else { /* SOUND: vuelve a la última; otra vez, la siguiente */ - int np; bm_engine_pages(app_engine(a, t), &np); - if (cur == PG_SOUND && np) a->ed_page[t] = (uint8_t)((a->ed_page[t] + 1) % np); - pg = PG_SOUND; - } - break; - case BTN_ENV: - if (bm_is_pads(t)) { a->ed_page[t] = 2; pg = PG_PADS; } - else if (kind == KIND_TR) { pg = PG_INST; if (cur != PG_INST) a->ed_page[t] = 0; } - else if (midi) pg = PG_MIDI; - else { /* su envolvente; otra vez, la segunda */ - int e1 = bm_engine_page_of(app_engine(a, t), EPG_ENV1), e2 = bm_engine_page_of(app_engine(a, t), EPG_ENV2); - a->ed_page[t] = (uint8_t)(cur == PG_SOUND && a->ed_page[t] == e1 ? e2 : e1); - pg = PG_SOUND; - } - break; - case BTN_LFO: - if (!lfo_has_page(a, t)) { lfo_latch(a); return; } /* sin LFO: su capa queda abierta */ - a->ed_page[t] = (uint8_t)bm_engine_page_of(app_engine(a, t), EPG_LFO); - pg = PG_SOUND; - break; - case BTN_FX: - if (cur == PG_MIX) a->mix_page ^= 1; else a->mix_page = 0; - pg = PG_MIX; - break; - case BTN_SCL: pg = cur == PG_SCL ? PG_CHORDS : PG_SCL; break; - case BTN_ARP: pg = PG_ARP; break; - case BTN_GLO: /* el GLO de la máquina; otra vez, de vuelta */ - if (cur == PG_MORE) { pg = a->glo_back; break; } - a->glo_back = (uint8_t)(cur >= 0 ? cur : a->ch_page[t]); - a->more_row = 0; - pg = PG_MORE; - break; - default: return; - } - app_enter(a, t, pg); - a->nav_btn = 0; /* su luz: este botón, mientras sigas aquí */ - if (a->view == V_CH && a->page == pg && id != BTN_GLO) { - a->nav_btn = (uint8_t)(id + 1); a->nav_track = a->track; a->nav_page = a->page; a->nav_sub = a->ed_page[a->track]; - } -} - -/* SONG REC: sonando, el ciclo que suena ya cuenta; parado, queda armado y empieza con PLAY (2) */ -static void song_rec_toggle(bm_app *a) +/* OCT -/+: en el secuenciador de la batería (y en su PLAY/REC) cambian la página de sonidos; en + * PLAY/REC de una máquina de notas, la octava. En el mezclador no hacen nada. */ +static bool oct_ok(const bm_app *a) { - a->song_rec = (uint8_t)(a->song_rec ? 0 : app_playing(a) ? 1 : 2); - a->song_rec_loops = a->ctx.st.loops; - a->song_rec_scene = 0xFF; - if (a->song_rec == 1) app_song_rec_note(a); - app_toast(a, a->song_rec ? "SONG REC ON" : "SONG REC OFF"); + if (a->view == V_CH) return true; + return a->view == V_HOME && a->sloop && (app_kind(a, a->track) == KIND_NOTE || drums_track(a, a->track)); /* batería: sostenidos dan golpes suaves / fuertes */ } -static void home_combo(bm_app *a, int id) +/* la capa de la rejilla que abre cada botón: en la batería LFO, ENV, EDIT y SCL; en el Slicer LFO, SCL y + * SEQ otra vez (LENGTH AND SPEED): su EDIT, ENV, FX y GLO son páginas de la máquina (V_MACH) */ +static int layer_of(const bm_app *a, int id) { - a->home_used = 1; + bool pads = bm_is_pads(a->track); switch (id) { - case BTN_OCT_DN: app_do_undo(a); break; - case BTN_OCT_UP: app_do_redo(a); break; - case BTN_PLAY: app_push(a, CMD_PLAY, app_playing(a) ? 2 : 1, 0, 0); app_toast(a, "FROM STEP 1"); break; - case BTN_REC: song_rec_toggle(a); break; - case BTN_SEQ: glo_open(a, GP_SONG); break; - case BTN_FX: if (a->view == V_FXG) a->fx_page = (uint8_t)((a->fx_page + 1) % FXP_COUNT); else { a->fx_page = FXP_CHANNEL; app_set_view(a, V_FXG); } break; - case BTN_SCL: glo_open(a, GP_SCALE); break; - case BTN_GLO: if (a->view == V_GLO) a->glo_page = (uint8_t)((a->glo_page + 1) % GP_COUNT); else glo_open(a, GP_TEMPO); break; - case BTN_SAVE: a->save_row = 1; a->save_target = (uint8_t)((a->ctx.st.pattern + 1) % BM_PATTERNS); app_set_view(a, V_SAVE); break; - case BTN_EDIT: { - a->copy_src = a->track; - int k = app_kind(a, a->track); - a->copy_dst = 0xFF; - for (int i = 1; i < BM_TRACKS && a->copy_dst == 0xFF; i++) { - int d = (a->track + i) % BM_TRACKS; - if (d == 1 || bm_is_pads(a->track)) continue; - if (app_kind(a, d) == k) a->copy_dst = (uint8_t)d; - } - if (a->copy_dst == 0xFF) { app_toast(a, "THE SAMPLER IS NOT COPIED"); break; } - app_set_view(a, V_COPYCH); - break; - } - default: app_toast(a, "HOME + THIS BUTTON: NOTHING"); break; - } -} - -static void copy_channel(bm_app *a) -{ - int s = a->copy_src, d = a->copy_dst; - int ks = app_kind(a, s); - char b[30]; - if (ks == KIND_NOTE) { /* la máquina viaja con el canal */ - int o = bm_machine_conflict(&a->pat, d, a->pat.trk[s].engine); - if (o >= 0 && o != d) { /* BUNO-6 y BITTAL: una vez por patrón */ - snprintf(b, sizeof b, TF("%s ALREADY ON T%d"), bm_engine_names[a->pat.trk[s].engine], o + 1); - app_toast(a, b); - return; - } - } - app_undo_snapshot(a, d); - if (ks == KIND_NOTE) app_push(a, CMD_CLONE, (uint8_t)s, (uint8_t)d, 0); - memcpy(&a->clip, app_track_data(a, s), app_track_size(s)); - app_push_ptr(a, CMD_TRACK_BULK, (uint8_t)d, &a->clip); - const uint8_t *src = (const uint8_t *)&a->pat.trk[s]; - for (unsigned off = 0; off < sizeof(bm_track); off++) - if (off != TRK_OFF(engine) && off != TRK_OFF(mute) && off != TRK_OFF(midi_ch)) app_push(a, CMD_SET_TRACK, (uint8_t)d, (uint8_t)off, src[off]); - app_edited(a); - snprintf(b, sizeof b, TF("T%d COPIED TO T%d"), s + 1, d + 1); - app_toast(a, b); - app_enter(a, d, PG_SEQ); -} - -static void ask_yes(bm_app *a) -{ - int k = a->ask, x = a->ask_arg, y = a->ask_arg2; - a->ask = ASK_NONE; - char b[30]; - switch (k) { - case ASK_COPY_PAT: app_job(a, JOB_COPY_PAT, x); app_toast(a, "PATTERN COPIED"); break; - case ASK_COPY_TRK: app_job(a, JOB_COPY_TRK, x | (y << 4)); app_toast(a, "TRACK COPIED"); break; - case ASK_TAKE_DEL: - app_job(a, JOB_TAKE_ERASE, x); - snprintf(b, sizeof b, TF("TAKE %02d DELETED"), x + 1); - app_toast(a, b); - break; - case ASK_KIT: { int n = app_kit_from_take(a, x, y); snprintf(b, sizeof b, TF("KIT: %d PADS"), n); app_toast(a, b); break; } - case ASK_INIT: - if (bm_is_tr(&a->pat, x)) { app_push(a, CMD_PRESET, (uint8_t)x, a->pat.trk[x].source, 0); app_edited(a); } /* INIT KIT: el kit como vino */ - app_init_sound(a, x); - break; - case ASK_DISCARD: - if (a->ctx.st.smp_unsaved && !a->ctx.st.smp_rec) { app_push_ptr(a, CMD_SMP_DISCARD, 0, &a->smp_send[0]); app_toast(a, "TAKE DISCARDED"); } - break; - default: break; - } -} - -/* REC 2 s = borrar la pista del canal (en la consola, el del cursor), en vivo y sin preguntar (HOME + - * OCT- lo deshace). Solo una pulsación que no graba nada: nunca en la GRABADORA (ahí sostener REC - * graba la mezcla), ni con la grabadora o una loopera grabando o armadas. Se mira al bajar REC y otra - * vez a los 2 s. */ -static bool rec_erase_ok(const bm_app *a) -{ - const bm_status *st = &a->ctx.st; - if (a->layer || a->ask) return false; - if (a->view != V_CH && a->view != V_HOME && a->view != V_FXG) return false; - if (a->view == V_CH && (a->page == PG_REC || a->page == PG_TAKES || a->page == PG_LOOP)) return false; - if (st->smp_rec || st->smp_armed) return false; - for (int i = 0; i < BM_SYN_TRACKS; i++) { - int lm = st->loop_mode[i]; - if (lm == LOOP_ARMED || lm == LOOP_REC || lm == LOOP_DUB) return false; + case BTN_SCL: return L_MUTE; + case BTN_LFO: return L_ACC; + case BTN_ENV: return pads ? L_NONE : L_HIT; + case BTN_EDIT: return pads ? L_NONE : L_INST; + case BTN_SEQ: return pads ? L_LEN : L_NONE; + default: return L_NONE; } - for (int k = 0; k < BM_KEYS; k++) if (a->keys_down[k]) return false; /* una nota sostenida graba */ - return true; } -/* Mientras REC estuvo abajo, ¿se grabó algo? Cualquier cambio en el patrón (tecla, MIDI, perilla, - * roll, loopera: todo pasa por app_edited). Tocar una tecla o una perilla además cancela los 2 s. */ -static bool rec_hold_wrote(const bm_app *a) +/* a la rejilla del Slicer, con esa capa abierta (LFO, SCL) o ninguna */ +void app_slicer_grid(bm_app *a, int layer) { - return (int32_t)(a->t_edit - a->ges.b[BTN_REC].t0) >= 0; + app_sloop(a, 0); + app_enter(a, 1, PG_SEQ); + if (layer) layer_latch_open(a, layer); } -static void tap_tempo(bm_app *a) +/* OCT -/+ en la batería: la página de sonidos (8 instrumentos: 1-8 o 9-16); el instrumento elegido + * se queda en su lugar de la página. */ +static void sound_page(bm_app *a, int dir) { - if (a->tap_n && a->now - a->tap_t[(a->tap_n - 1) & 3] > 2000) a->tap_n = 0; - a->tap_t[a->tap_n & 3] = a->now; - a->tap_n++; - if (a->tap_n < 2) { app_toast(a, "TAP"); return; } - int n = a->tap_n > 4 ? 4 : a->tap_n; - uint32_t first = a->tap_t[(a->tap_n - n) & 3], last = a->tap_t[(a->tap_n - 1) & 3]; - uint32_t iv = (last - first) / (uint32_t)(n - 1); - if (!iv) return; - int bpm = bm_clampi((int)(600000u / iv), 400, 2400); - app_push_i(a, CMD_SET_BPM, 0, 0, 0, bpm); app_edited(a); - char b[16]; snprintf(b, sizeof b, "%d.%d", bpm / 10, bpm % 10); - app_overlay(a, -1, "TAP TEMPO", b, "BPM", (bpm - 400) * 255 / 2000, -1, C_CYAN); + int t = a->track, lane = tr_lane(a), pg = lane / 8; + int np = bm_clampi(pg + dir, 0, BM_LANES / 8 - 1); + if (np == pg) return; + a->sel_lane[t] = (uint8_t)(np * 8 + lane % 8); + app_toast(a, np ? "SOUNDS 9-16" : "SOUNDS 1-8"); } void app_on_gesture(void *u, int id, bm_gkind k) { bm_app *a = (bm_app *)u; if (a->view == V_BOOT) return; - uint16_t bit = (uint16_t)(1u << id); - a->cur_ctl = (uint8_t)id; - if (a->ask_eat & bit) return; /* la pregunta ya usó este botón: hasta soltarlo */ - if (a->ask) { - if (id == a->ask_ctl) return; /* el que preguntó: lo mira bm_app_button */ - if (k == G_PRESS || k == G_TAP || k == G_HOLD) { ask_no(a, 0); a->ask_eat |= bit; return; } /* otro botón: no */ - } - if (id != BTN_HOME && (a->home_mod & bit)) { /* HOME + botón = su versión global */ - if ((k == G_TAP || k == G_HOLD || k == G_PRESS) && !(a->home_done & bit)) { a->home_done |= bit; home_combo(a, id); } - return; - } - /* ARP en una rejilla (T1, T2) = ROLL: un toque la deja abierta y otro la cierra; sostener ARP con - * ella abierta = queda solo mientras lo sostienes (se cierra al soltar). */ - if (id == BTN_ARP && bm_is_grid(&a->pat, a->track) && (!a->layer || a->layer == L_ROLL || a->layer_latch)) { - if (k == G_TAP) { - if (a->layer == L_ROLL) close_layer(a, id); - else { key_screen_close(a); roll_open(a); } /* FILL o LFO abiertas: ROLL en su lugar */ - return; - } - if (k == G_HOLD && a->layer == L_ROLL) { a->layer_latch = 0; return; } - } - /* pantalla abierta con un toque (FILL, ROLL, la capa de LFO): HOME la cierra; otro botón la cierra - * y hace lo suyo (LFO otra vez: solo la cierra). PLAY y OCT -/+ no la cierran, y en ROLL tampoco - * REC (graba el roll). */ - if (a->layer_latch && id != BTN_PLAY && id != BTN_OCT_DN && id != BTN_OCT_UP && !(id == BTN_REC && a->layer == L_ROLL)) { + if (a->view == V_MACH && mach_button(a, id, k)) return; /* la máquina toma sus botones (PLAY, SAVE y HOME siguen) */ + /* capa abierta con un toque: HOME la cierra; otro botón la cierra y hace lo suyo (el suyo otra + * vez: solo la cierra). PLAY y OCT -/+ no la cierran. */ + if (a->layer_latch && id != BTN_PLAY && id != BTN_OCT_DN && id != BTN_OCT_UP) { if (id == BTN_HOME) { if (k == G_TAP) { key_screen_close(a); return; } - if (k == G_HOLD) key_screen_close(a); /* y se abre la capa de HOME */ - } - else if (k == G_PRESS || k == G_TAP || k == G_HOLD) { - bool same = id == BTN_LFO && k == G_TAP && a->layer == L_REP; + } else if (k == G_TAP || k == G_HOLD) { + bool same = layer_of(a, id) == a->layer; key_screen_close(a); if (same) return; } @@ -2664,174 +1095,114 @@ void app_on_gesture(void *u, int id, bm_gkind k) switch (id) { case BTN_PLAY: if (k != G_PRESS) return; - if (a->layer == L_TONE) { tap_tempo(a); return; } app_push(a, CMD_PLAY, app_playing(a) ? 0 : 1, 0, 0); + if (a->bx.armed && !app_playing(a)) { a->bx.armed = 0; rec_set(a, 1); } /* REC armado: PLAY también arranca la toma */ /* con el reloj externo, PLAY espera los pulsos MIDI: sin ellos no avanza nada y parecía * colgado (dos veces en el aparato, con CLOCK cambiado sin querer en SYSTEM) */ if (!app_playing(a) && a->set.clock && !a->ctx.st.ext_ok) app_toast(a, "EXT CLOCK: WAITING FOR MIDI"); return; - case BTN_OCT_DN: case BTN_OCT_UP: /* 0.9: siempre la octava (en la batería y los pads, nada) */ + case BTN_OCT_DN: case BTN_OCT_UP: if (k != G_PRESS || !oct_ok(a)) return; + if (a->view == V_CH) { sound_page(a, id == BTN_OCT_UP ? 1 : -1); return; } + if (drums_track(a, a->track)) return; /* PLAY/REC de la batería: se sostienen (golpes suaves / fuertes) */ a->oct = (int8_t)bm_clampi(a->oct + (id == BTN_OCT_UP ? 1 : -1), -2, 2); snprintf(b, sizeof b, TF("OCTAVE %+d"), a->oct); app_toast(a, b); return; - case BTN_REC: - if (k == G_TAP) { - if (a->view == V_CH && a->track == 1 && a->page != PG_PADS && a->layer != L_ROLL) { /* en PADS y en ROLL, REC graba lo que tocas */ - if (a->page != PG_REC) { app_enter(a, 1, PG_REC); } - if (a->ctx.st.smp_rec || a->ctx.st.smp_armed) { app_push(a, CMD_SMP_REC, 0, 0, 0); return; } - uint32_t room = bm_app_rec_room(a); - if (!room) { app_toast(a, "TAKES FULL: DELETE ONE"); return; } - app_push_i(a, CMD_SMP_REC, a->rec_now ? 1 : 2, 0, 0, (int32_t)room); - app_toast(a, a->rec_now ? "RECORDING" : app_playing(a) ? "STARTS ON THE BAR" : "ARMED: PLAY TO RECORD"); - } else if (a->view == V_CH && a->page == PG_LOOP) app_push(a, CMD_LOOP, a->track, 1, 0); - else if (a->view == V_HOME || a->view == V_FXG) app_sloop(a, !a->sloop); /* SLOOP-REC */ - else if (a->view == V_GLO && a->glo_page == GP_SONG) song_rec_toggle(a); - else rec_set(a, !a->rec); - } else if (k == G_HOLD) { /* grabar solo mientras lo sostienes */ - if (a->view == V_CH && a->page == PG_REC) { /* en la GRABADORA: la mezcla, ya */ - uint32_t room = bm_app_rec_room(a); - if (!room) { app_toast(a, "TAKES FULL: DELETE ONE"); return; } - app_push_i(a, CMD_SMP_REC, 1, 0, 0, (int32_t)room); - a->rec_hold = 2; - } else if ((a->view == V_HOME || a->view == V_FXG) && !a->sloop) { /* la consola: SLOOP mientras lo sostienes */ - app_sloop(a, 1); - a->rec_hold = 3; - } else { /* notas, golpes o slices fijos */ - a->rec_before = a->rec; a->rec = 1; a->rec_hold = 1; - app_push(a, CMD_REC, 1, 0, 0); - app_undo_snapshot(a, a->track); - } - } else if (k == G_RELEASE || k == G_LONG) { - bool wrote = k == G_LONG && rec_hold_wrote(a); /* antes de soltar la grabación */ - if (a->rec_hold == 2) app_push(a, CMD_SMP_REC, 0, 0, 0); - else if (a->rec_hold == 3) app_sloop(a, 0); - else if (a->rec_hold == 1) { a->rec = a->rec_before; app_push(a, CMD_REC, a->rec, 0, 0); } - a->rec_hold = 0; - if (k != G_LONG) return; - /* 2 s (bm_app_button decide al bajar si los hay): en LOOP borran el loop; en un canal - * (o en la consola, el del cursor), la pista, sin preguntar (en vivo) y con HOME + OCT- - * para deshacer. Si mientras lo sostenías se grabó algo, no se borra nada. */ - if (a->view == V_CH && a->page == PG_LOOP) { app_push(a, CMD_LOOP, a->track, 2, 0); app_toast(a, "LOOP ERASED"); } - else if (!wrote && rec_erase_ok(a)) app_clear_track(a, a->track); /* toma la foto para deshacer */ + case BTN_REC: /* grabar: solo en el mezclador y su PLAY/REC */ + if (k == G_LONG && (a->view == V_HOME || a->view == V_CH)) { /* 2 s: borra el canal del cursor, sonando o parado */ + if (a->rec) rec_set(a, 0); + app_push(a, CMD_TRACK_CLEAR, a->track, 0, 0); + app_edited(a); + char b[24]; snprintf(b, sizeof b, TF("T%d CLEARED"), app_pos(a->track) + 1); + app_toast(a, b); + return; } + if (k != G_TAP || a->view != V_HOME) return; + if (a->sloop) rec_set(a, !a->rec); + else { app_sloop(a, 1); rec_set(a, 1); } return; - case BTN_GLO: - if (k == G_TAP) button_page(a, id); - else if (k == G_HOLD) open_layer(a, id); - else if (k == G_RELEASE) close_layer(a, id); + case BTN_GLO: /* el menú global del mezclador */ + if (k != G_TAP) return; + if (a->view == V_CH && bm_is_pads(a->track)) { mach_enter(a, a->track, BXP_GLO); return; } /* la rejilla del Slicer: su GLO */ + if (a->view == V_HOME) { mach_reset(a, a->track); a->glo_page = 0; app_set_view(a, V_GLO); } + else if (a->view == V_GLO) { a->mach_arm = 0; a->glo_page = (uint8_t)wrap(a->glo_page + 1, BM_GLO_PAGES); a->ov.on = 0; } /* la página siguiente; sale HOME */ return; case BTN_SAVE: if (k == G_TAP) { if (a->view == V_SAVE) { switch (a->save_row) { - case 0: + case 0: /* el patrón y, si cambiaron, las escenas */ app_save_jobs(a, 1); + if (a->song_dirty) app_job(a, JOB_SAVE_SONG, 0); snprintf(b, sizeof b, TF("SAVED A%02d"), a->ctx.st.pattern + 1); - app_toast(a, app_playing(a) ? "STOP TO SAVE" : b); + app_toast(a, app_playing(a) ? "SAVES WHEN STOPPED" : b); break; case 1: app_save_jobs(a, 0); app_job(a, JOB_SAVE_AS, a->save_target); snprintf(b, sizeof b, TF("SAVED AS A%02d"), a->save_target + 1); - app_toast(a, app_playing(a) ? "STOP TO SAVE" : b); + app_toast(a, app_playing(a) ? "SAVES WHEN STOPPED" : b); break; - case 2: app_job(a, JOB_SAVE_SONG, 0); app_toast(a, "SONG AND SCENES SAVED"); break; - case 3: + case 2: if (a->clear_armed && a->now - a->clear_t < 3000) { for (int t = 0; t < BM_TRACKS; t++) app_push(a, CMD_TRACK_CLEAR, (uint8_t)t, 0, 0); app_edited(a); a->clear_armed = 0; app_toast(a, "PATTERN CLEARED"); } else { a->clear_armed = 1; a->clear_t = a->now; app_toast(a, "SAVE AGAIN = CLEAR"); } break; - default: - snprintf(b, sizeof b, TF("%d EVENTS"), bm_pattern_count_events(&a->pat)); - app_toast(a, b); + default: break; } } else app_set_view(a, V_SAVE); - } else if (k == G_HOLD) open_layer(a, id); - else if (k == G_RELEASE) close_layer(a, id); - else if (k == G_LONG) { - close_layer(a, id); + } else if (k == G_LONG) { app_save_jobs(a, 1); - app_toast(a, app_playing(a) ? "STOP TO SAVE" : "QUICK SAVE"); + app_toast(a, app_playing(a) ? "SAVES WHEN STOPPED" : "QUICK SAVE"); } return; - case BTN_HOME: + case BTN_HOME: /* salir: a la consola; 2 s: SYSTEM */ if (k == G_TAP) { - if (a->view == V_CH && a->page == PG_REC && a->ctx.st.smp_unsaved && !a->ctx.st.smp_rec) { /* la toma sin guardar: preguntar */ - app_ask(a, ASK_DISCARD, 0, 0, "DISCARD THE NEW TAKE?", "IT IS NOT SAVED YET"); - return; - } - if (a->view == V_COPYCH) app_toast(a, "CANCELED"); - a->card = 0; a->mach_arm = 0; - app_set_view(a, V_HOME); /* 0.9: HOME siempre vuelve a MIX */ - } else if (k == G_HOLD) { a->home_used = 0; a->home_go = 0; open_layer(a, id); } - else if (k == G_RELEASE) { - close_layer(a, id); - if (a->pat_sel >= 0) { app_select_pattern(a, a->pat_sel); a->pat_sel = -1; } /* el patrón que quedó en PRESETS */ - if (a->home_go) { int t = a->home_go - 1; a->home_go = 0; app_enter(a, t, a->ch_page[t]); } /* HOME + blanca 11-16 */ - } else if (k == G_LONG) { close_layer(a, id); app_set_view(a, V_SYSTEM); } + a->mach_arm = 0; + app_sloop(a, 0); + app_set_view(a, V_HOME); + } else if (k == G_LONG) { app_sloop(a, 0); app_set_view(a, V_SYSTEM); } return; default: break; } - if (k == G_TAP) button_page(a, id); - else if (k == G_HOLD) open_layer(a, id); - else if (k == G_RELEASE) close_layer(a, id); - else if (k == G_LONG) { - close_layer(a, id); - if (id == BTN_SEQ) { a->time_row = a->track; app_set_view(a, V_TIME); } - else if (id == BTN_EDIT) { - if (a->view == V_COPYCH) copy_channel(a); /* COPY TRACK: EDIT 2 s pega */ - else if (a->track == 1) app_enter(a, 1, PG_TAKES); - else { snprintf(b, sizeof b, TF("INIT SOUND ON T%d?"), a->track + 1); app_ask(a, ASK_INIT, a->track, 0, b, "THE SOUND SETTINGS ARE LOST"); } - } + /* Un clic entra y otro sale: SEQ abre el secuenciador de la batería y lo cierra; LFO, ENV y EDIT, + * ahí dentro, abren su capa y la cierran (sostener es lo mismo que un clic). En HOME, con el cursor + * en la batería, cada uno lleva directo a lo suyo: SEQ al secuenciador, LFO/ENV/EDIT a su capa. */ + if (k != G_TAP && k != G_HOLD) return; + int L = layer_of(a, id); + if (bm_is_pads(a->track) && (a->view == V_HOME || a->view == V_CH)) { /* el Slicer: SEQ, LFO y SCL su rejilla; EDIT, ENV y FX sus páginas */ + int p = slicer_page_of(id); + if (a->view == V_HOME && (id == BTN_SEQ || L)) app_slicer_grid(a, id == BTN_SEQ ? L_NONE : L); + else if (a->view == V_CH && L) layer_latch_open(a, L); /* SEQ otra vez: LENGTH AND SPEED */ + else if (p >= 0 && !(a->view == V_HOME && id == BTN_GLO)) mach_enter(a, a->track, p); /* (GLO en HOME es el de la consola) */ + return; + } + if (a->view == V_HOME && mach_has(a->pat.trk[a->track].engine)) { /* una máquina de notas: cada botón a su página */ + int p = mach_page_of(a->pat.trk[a->track].engine, id); + if (p >= 0 && id != BTN_GLO) mach_enter(a, a->track, p); + return; + } + if (a->view == V_HOME) { + if (!drums_track(a, a->track) || (id != BTN_SEQ && !L)) return; + app_sloop(a, 0); + app_enter(a, a->track, PG_SEQ); + if (L) layer_latch_open(a, L); + return; } + if (a->view != V_CH) return; + if (id == BTN_SEQ) { app_set_view(a, V_HOME); return; } + if (L) layer_latch_open(a, L); } void bm_app_button(bm_app *a, int id, int down, uint32_t now) { a->now = now; if (id < 0 || id >= BTN_COUNT) return; - uint16_t bit = (uint16_t)(1u << id); - if (down && id != BTN_HOME && bm_gesture_is_down(&a->ges, BTN_HOME)) { a->home_mod |= bit; a->home_done &= (uint16_t)~bit; a->home_used = 1; } - if (down && id == BTN_REC) { /* REC 2 s: en LOOP borra el loop; en un canal (o la consola), la pista */ - bool lp = a->view == V_CH && a->page == PG_LOOP && !a->layer; - bool ers = !bm_gesture_is_down(&a->ges, BTN_HOME) && rec_erase_ok(a); - bm_gesture_set_long(&a->ges, BTN_REC, (uint16_t)(lp || ers ? UI_LONG_MS : 0)); - } - if (down && id == BTN_EDIT) /* EDIT 2 s: en una máquina INIT / TAKES, en COPY TRACK pegar */ - bm_gesture_set_long(&a->ges, BTN_EDIT, (uint16_t)(a->view == V_CH || a->view == V_COPYCH ? UI_LONG_MS : 0)); - if (a->ask && id == a->ask_ctl) { /* el botón que preguntó: sostenido 2 s = sí, soltarlo = no */ - if (down) { a->ask_live = 1; a->ask_t0 = now; } - else { a->ask_eat |= bit; ask_no(a, 1); } - } if (down) bm_gesture_down(&a->ges, id, now); else bm_gesture_up(&a->ges, id, now); - if (!down) { a->home_mod &= (uint16_t)~bit; a->home_done &= (uint16_t)~bit; a->ask_eat &= (uint16_t)~bit; } -} - -/* ------------------------------------------------------------ perillas */ -static void enc_macro(bm_app *a, int t, int i, int d) -{ - int v = bm_clampi(a->pat.trk[t].macro[i] + d, 0, 127); - app_set_track(a, t, (uint8_t)i, v); - if (a->rec && app_playing(a) && app_kind(a, t) == KIND_NOTE) /* REC: la nota sostenida graba la perilla */ - for (int k = 0; k < BM_KEYS; k++) { - if (a->key_rec_step[k] < 0 || a->key_trk[k] != t) continue; - for (int e = 0; e < BM_EVENTS; e++) { - bm_event ev = *bm_evc(&a->pat, t, a->key_rec_step[k], e); - if (bm_event_empty(&ev)) continue; - ev.lk[i] = (uint8_t)v; - app_push_ev(a, t, a->key_rec_step[k], e, &ev); - } - a->knob_rec = 1; - } - char b[12], ti[22]; - bm_fmt_macro(a, t, i, v, b, sizeof b); - snprintf(ti, sizeof ti, "T%d %s", t + 1, T(bm_macro_name(a, t, i))); - app_overlay(a, i, ti, b, "", v * 2, -1, bm_knob_color(i)); } static void enc_track_u8(bm_app *a, int t, int k, uint8_t off, int cur, int d, int lo, int hi, const char *name, int pct_mul) @@ -2840,220 +1211,70 @@ static void enc_track_u8(bm_app *a, int t, int k, uint8_t off, int cur, int d, i app_set_track(a, t, off, v); char b[12], ti[22]; fmt_pct(v, b, sizeof b); - snprintf(ti, sizeof ti, "T%d %s", t + 1, T(name)); + snprintf(ti, sizeof ti, "T%d %s", app_pos(t) + 1, T(name)); app_overlay(a, k, ti, b, "", v * pct_mul, -1, k >= 0 ? bm_knob_color(k) : C_WHITE); } -static void enc_step_grid(bm_app *a, int id, int d) +/* GLO de HOME, páginas TEMPO y MASTER FX: lo del proyecto entero */ +typedef struct { const char *name; uint8_t off, lo, hi; } glo_par; +static const glo_par GLO_P[2][4] = { + {{"SWING", offsetof(bm_meta, swing), 50, 75}, {"SCALE", offsetof(bm_meta, scale), 0, BM_SCALES - 1}, + {"ROOT", offsetof(bm_meta, root), 0, 11}, {"TRANSP", offsetof(bm_meta, transpose), 12, 36}}, + {{"DLY TIME", offsetof(bm_meta, dly_time), 0, 3}, {"DLY FDBK", offsetof(bm_meta, dly_fb), 0, 127}, + {"REV SIZE", offsetof(bm_meta, rv_size), 0, 127}, {"REV MIX", offsetof(bm_meta, rv_mix), 0, 127}}}; +static const char *const DLY_T[4] = {"1/16", "1/8", "3/16", "1/4"}; + +static void glo_fmt(int pg, int k, int v, char *b, int cap) { - int t = a->track, s = a->held_step, lane = tr_lane(a); - const bm_tr *tr = bm_trk_trc(&a->pat, t); - uint8_t bb; - bb = tr->st[lane][s]; - if (!(bb & ST_ON)) { app_toast(a, "EMPTY STEP"); return; } - a->held_long = 1; a->held_edit = 1; - char b[16], ti[22]; - if (id >= ENC_K1 && id <= ENC_K4) { - int i = id - ENC_K1; - int cur = bm_tr_lock_get(tr, s, lane, i); - if (cur < 0) cur = a->pat.trk[t].macro[i]; - int v = bm_clampi(cur + d, 0, 127); - app_push_i(a, CMD_TR_LOCK, (uint8_t)t, (uint8_t)lane, (uint8_t)s, (i << 8) | v); - app_edited(a); - bm_fmt_macro(a, t, i, v, b, sizeof b); - snprintf(ti, sizeof ti, "P-LOCK %02d %s", s + 1, T(bm_macro_name(a, t, i))); - app_overlay(a, i, ti, b, "", v * 2, a->pat.trk[t].macro[i] * 2, bm_knob_color(i)); - return; - } - if (id == ENC_SELECT) { - bb = d > 0 ? (uint8_t)(bb | ST_ACC) : (uint8_t)(bb & ~ST_ACC); - snprintf(b, sizeof b, "%s", (bb & ST_ACC) ? "ACCENT" : "NORMAL"); - snprintf(ti, sizeof ti, TF("STEP %02d HIT"), s + 1); - } else if (id == ENC_ALGO) { - int r = (bb & ST_FLAM) ? 4 : ((bb & ST_RAT_MASK) >> ST_RAT_SH); - r = bm_clampi(r + lst(a, d), 0, 4); - bb = (uint8_t)(bb & ~(ST_RAT_MASK | ST_FLAM)); - if (r == 4) bb |= ST_FLAM; else bb |= (uint8_t)(r << ST_RAT_SH); - snprintf(b, sizeof b, "%s", RAT_NAMES[r]); - snprintf(ti, sizeof ti, TF("STEP %02d REPEAT"), s + 1); - } else { - int c = (bb & ST_COND_MASK) >> ST_COND_SH; - c = bm_clampi(c + lst(a, d), 0, 2); - bb = (uint8_t)((bb & ~ST_COND_MASK) | (c << ST_COND_SH)); - snprintf(b, sizeof b, "%s", COND_NAMES[c]); - snprintf(ti, sizeof ti, TF("STEP %02d CONDITION"), s + 1); - } - app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)lane, (uint8_t)s, bb); - app_edited(a); - app_overlay(a, -1, ti, b, "", 128, -1, C_WHITE); + if (pg == 1 && k == 1) snprintf(b, (size_t)cap, "%s", bm_scale_names[v % BM_SCALES]); + else if (pg == 1 && k == 2) snprintf(b, (size_t)cap, "%s", bm_note_names[v % 12]); + else if (pg == 1 && k == 3) snprintf(b, (size_t)cap, v > 24 ? "+%d" : "%d", v - 24); + else if (pg == 1 && k == 0) snprintf(b, (size_t)cap, "%d%%", v); + else if (pg == 2 && k == 0) snprintf(b, (size_t)cap, "%s", DLY_T[v & 3]); + else snprintf(b, (size_t)cap, "%d%%", (v * 100 + 63) / 127); } -static void enc_step_syn(bm_app *a, int id, int d) +static void glo_knob(bm_app *a, int k, int d) { - int t = a->track, s = a->held_step; - int idx[4]; - int n = syn_step_events(a, t, s, idx); - if (!n) { app_toast(a, "EMPTY STEP"); return; } - a->held_long = 1; a->held_edit = 1; - char b[16] = "", ti[22]; - if (id >= ENC_K1 && id <= ENC_K4) { - int i = id - ENC_K1; - const bm_event *e0 = bm_evc(&a->pat, t, s, idx[0]); - int base = e0->lk[i] != BM_LOCK_NONE ? e0->lk[i] : a->pat.trk[t].macro[i]; - int v = bm_clampi(base + d, 0, 127); - for (int j = 0; j < n; j++) { bm_event e = *bm_evc(&a->pat, t, s, idx[j]); e.lk[i] = (uint8_t)v; app_push_ev(a, t, s, idx[j], &e); } - bm_fmt_macro(a, t, i, v, b, sizeof b); - snprintf(ti, sizeof ti, "P-LOCK %02d %s", s + 1, T(bm_macro_name(a, t, i))); - app_overlay(a, i, ti, b, "", v * 2, a->pat.trk[t].macro[i] * 2, bm_knob_color(i)); - app_edited(a); - return; - } - const char *nm = ""; - for (int j = 0; j < n; j++) { - bm_event e = *bm_evc(&a->pat, t, s, idx[j]); - if (id == ENC_SELECT) { /* acento: normal > acento > fantasma */ - int lv = e.vel >= BM_VEL_ACC ? 2 : e.vel <= BM_VEL_GHOST ? 0 : 1; - lv = bm_clampi(lv + lst(a, d), 0, 2); - e.vel = lv == 2 ? BM_VEL_ACC : lv == 0 ? BM_VEL_GHOST : BM_VEL_NORMAL; - if (j == 0) snprintf(b, sizeof b, "%s", lv == 2 ? "ACCENT" : lv == 0 ? "GHOST" : "NORMAL"); - nm = "HIT"; - } else if (id == ENC_ALGO) { - int p = e.prob == BM_PROB_FILL ? 101 : e.prob == BM_PROB_NOFILL ? 102 : e.prob; - if (p <= 100) p = bm_clampi(p + d * 5, 0, 102); else p = bm_clampi(p + lst(a, d), 95, 102); - e.prob = p == 101 ? BM_PROB_FILL : p == 102 ? BM_PROB_NOFILL : (uint8_t)bm_clampi(p, 0, 100); - if (j == 0) { if (p == 101) snprintf(b, sizeof b, "FILL ONLY"); else if (p == 102) snprintf(b, sizeof b, "NO FILL"); else snprintf(b, sizeof b, "%d%%", e.prob); } - nm = "PROB/FILL"; - } else { - int cur = (e.len & BM_LEN_TIE) ? 17 : (e.len & BM_LEN_MASK); - cur = bm_clampi(cur + d, 1, 17); - e.len = cur == 17 ? (uint8_t)(1 | BM_LEN_TIE) : (uint8_t)cur; - if (j == 0) { if (cur == 17) snprintf(b, sizeof b, "TIE"); else snprintf(b, sizeof b, TF("%d STEPS"), cur); } - nm = "LENGTH"; - } - app_push_ev(a, t, s, idx[j], &e); - } - snprintf(ti, sizeof ti, TF("STEP %02d %s"), s + 1, T(nm)); - app_overlay(a, -1, ti, b, "", 128, -1, C_WHITE); - app_edited(a); + int pg = a->glo_page; + if (pg < 1 || pg > 2) return; + const glo_par *p = &GLO_P[pg - 1][k]; + int cur = ((const uint8_t *)&a->pat.meta)[p->off]; + int v = bm_clampi(cur + (p->hi - p->lo <= 24 ? lst(a, d) : d), p->lo, p->hi); + if (v == cur) return; + app_set_meta(a, p->off, v); + char b[12]; + glo_fmt(pg, k, v, b, sizeof b); + app_overlay(a, k, p->name, b, "", (v - p->lo) * 255 / (p->hi - p->lo), -1, bm_knob_color(k)); } -static bool enc_global(bm_app *a, int k, int d) +static void legend_glo(const bm_app *a, bm_legend *L) { - bm_meta *m = &a->pat.meta; - char b[16]; - switch (k) { - case 0: { - int bpm = bm_clampi(m->bpm_x10 + d * 10, 400, 2400); - app_push_i(a, CMD_SET_BPM, 0, 0, 0, bpm); app_edited(a); - snprintf(b, sizeof b, "%d.%d", bpm / 10, bpm % 10); - app_overlay(a, -1, "TEMPO", b, "BPM", (bpm - 400) * 255 / 2000, -1, C_TEMPO); - a->ov.beat = 1; - return true; - } - case 1: { - int sw = bm_clampi(m->swing + lst(a, d), 50, 75); - app_set_meta(a, META_OFF(swing), sw); - snprintf(b, sizeof b, "%d", sw); - app_overlay(a, 1, "SWING 50=STRAIGHT", b, "%", (sw - 50) * 255 / 25, -1, bm_knob_color(1)); - return true; - } - case 2: { - int i = 0; - while (i < 6 && bm_master_steps_tab[i] != m->master) i++; - i = bm_clampi((i >= 6 ? 3 : i) + lst(a, d), 0, 5); - app_set_meta(a, META_OFF(master), bm_master_steps_tab[i]); - fmt_master(bm_master_steps_tab[i], b, sizeof b); - app_overlay(a, 2, "MASTER LENGTH", b, bm_master_steps_tab[i] ? "STEPS" : "", i * 51, -1, bm_knob_color(2)); - return true; - } - case 3: - a->set.drive = (uint8_t)bm_clampi(a->set.drive + d, 0, 127); - app_push(a, CMD_DRIVE, a->set.drive, 0, 0); - a->set_dirty = 1; a->t_edit = a->now; - fmt_pct(a->set.drive, b, sizeof b); - app_overlay(a, 3, "DRIVE (SOFT-CLIP)", b, "", a->set.drive * 2, -1, bm_knob_color(3)); - return true; - default: return false; + int pg = a->glo_page; + if (pg < 1 || pg > 2) return; + char b[12]; + for (int k = 0; k < 4; k++) { + const glo_par *p = &GLO_P[pg - 1][k]; + int v = ((const uint8_t *)&a->pat.meta)[p->off]; + glo_fmt(pg, k, v, b, sizeof b); + L4(L, k, p->name, b, (v - p->lo) * 255 / (p->hi - p->lo)); } } -static void enc_fill_every(bm_app *a, int d) +/* HOME, ALGORITHM: el BPM del proyecto (global) */ +static void enc_bpm(bm_app *a, int d) { - static const uint8_t FE[4] = {0, 2, 4, 8}; bm_meta *m = &a->pat.meta; + int bpm = bm_clampi(m->bpm_x10 + d * 10, 400, 2400); char b[16]; - int i = 0; - while (i < 4 && FE[i] != m->fill_every) i++; - i = bm_clampi((i >= 4 ? 0 : i) + lst(a, d), 0, 3); - app_set_meta(a, META_OFF(fill_every), FE[i]); - if (FE[i]) snprintf(b, sizeof b, TF("EVERY %d"), FE[i]); else snprintf(b, sizeof b, "OFF"); - app_overlay(a, -1, "AUTOMATIC FILL", b, FE[i] ? "BARS" : "", i * 85, -1, C_WHITE); -} - -static void enc_transpose(bm_app *a, int d) -{ - int tp = bm_clampi(a->pat.meta.transpose + d, 0, 48); - app_set_meta(a, META_OFF(transpose), tp); - char b[12]; snprintf(b, sizeof b, "%+d", tp - 24); - app_overlay(a, -1, "PROJECT TRANSPOSE", b, "ST", tp * 5, 120, C_CYAN); -} - -/* REC expresivo en el paso marcado (docs/DISENO_0.6.md §8): el largo del último paso y el corrimiento */ -/* en pantalla: 100 = TIE (liga con la siguiente), 95 = el paso entero (gate 0), 10..90 = el porcentaje */ -static int ev_gate_ui(const bm_event *e) { return (e->len & BM_LEN_TIE) ? 100 : e->gate ? e->gate : 95; } - -static void enc_rec(bm_app *a, int id, int d) -{ - int t = a->track, len = bm_trk_len(&a->pat, t, -1); - char b[16]; - if (a->rec_step < 0 || a->rec_step >= len) a->rec_step = (int8_t)bm_clampi(a->step_page * 16, 0, len - 1); - if (id == ENC_SELECT) { - a->rec_step = (int8_t)bm_clampi(a->rec_step + lst(a, d), 0, len - 1); - a->step_page = (uint8_t)(a->rec_step / 16); - snprintf(b, sizeof b, "%d", a->rec_step + 1); - app_overlay(a, -1, "REC STEP", b, "", a->rec_step * 255 / (len > 1 ? len - 1 : 1), -1, C_RED); - return; - } - int s = a->rec_step, n = 0, shown = 0; - for (int e = 0; e < BM_EVENTS; e++) { - bm_event ev = *bm_evc(&a->pat, t, s, e); - if (bm_event_empty(&ev)) continue; - if (id == ENC_ALGO) { - int g = bm_clampi(ev_gate_ui(&ev) + 5 * lst(a, d), 10, 100); - ev.len = (uint8_t)((ev.len & BM_LEN_MASK) | (g >= 100 ? BM_LEN_TIE : 0)); - ev.gate = (uint8_t)(g >= 95 ? 0 : g); - shown = g; - } else { - ev.micro = (int8_t)bm_clampi(ev.micro + lst(a, d), -11, 11); - shown = ev.micro; - } - app_push_ev(a, t, s, e, &ev); - n++; - } - if (!n) { app_toast(a, "EMPTY STEP: PLAY A NOTE THERE FIRST"); return; } - app_edited(a); - if (id == ENC_ALGO) { - a->rec_gate = (uint8_t)shown; - if (shown >= 100) snprintf(b, sizeof b, "TIE"); else snprintf(b, sizeof b, "%d", shown); - app_overlay(a, -1, "GATE LENGTH", b, shown >= 100 ? "" : "%", shown * 255 / 100, -1, C_GREEN); - } else { - a->rec_micro = (int8_t)shown; - snprintf(b, sizeof b, "%+d", shown); - app_overlay(a, -1, "MICRO TIMING", b, "TICKS", (shown + 11) * 255 / 22, 128, C_ORANGE); - } -} - -static void enc_bpm_fine(bm_app *a, int d) -{ - int bpm = bm_clampi(a->pat.meta.bpm_x10 + lst(a, d), 400, 2400); app_push_i(a, CMD_SET_BPM, 0, 0, 0, bpm); app_edited(a); - char b[12]; snprintf(b, sizeof b, "%d.%d", bpm / 10, bpm % 10); - app_overlay(a, -1, "TEMPO (FINE)", b, "BPM", (bpm - 400) * 255 / 2000, -1, C_TEMPO); + snprintf(b, sizeof b, "%d.%d", bpm / 10, bpm % 10); + app_overlay(a, -1, "TEMPO", b, "BPM", (bpm - 400) * 255 / 2000, -1, C_TEMPO); a->ov.beat = 1; } -/* Controles bipolares (MOVE, filtro DJ, PAN): el centro retiene 2 detents antes de salir, y un giro - * que lo cruza se para en él (como la zona OPEN del filtro del master). */ +/* Controles bipolares (el filtro DJ): el centro retiene 2 detents antes de salir, y un giro que lo + * cruza se para en él. */ static int center_stop(bm_app *a, int cur, int d, int c, int lo, int hi) { int nv = bm_clampi(cur + d, lo, hi); @@ -3081,65 +1302,41 @@ static void fmt_djf(uint8_t djf, char *b, int cap) else snprintf(b, (size_t)cap, "%s %d", p < 0 ? "LP" : "HP", p < 0 ? -p : p); } -/* HOME (0.7), K1-K4: el canal del cursor como una tira de mezclador: nivel, filtro DJ, delay, reverb */ +/* HOME, K1-K4: el canal del cursor como una tira de mezclador: VOLUME, FILTER (DJ), DELAY, REVERB */ static void enc_home(bm_app *a, int k, int d) { int t = a->track; const bm_track *tr = &a->pat.trk[t]; char b[16], ti[22]; switch (k) { - case 0: - snprintf(ti, sizeof ti, TF("T%d LEVEL"), t + 1); - enc_track_u8(a, t, 0, TRK_OFF(level), tr->level, d, 0, 127, ti, 2); - return; + case 0: enc_track_u8(a, t, 0, TRK_OFF(level), tr->level, d, 0, 127, "VOLUME", 2); return; case 1: { int p = center_stop(a, djf_pos(tr->djf), d, 0, -63, 63); app_set_track(a, t, TRK_OFF(djf), djf_of(p)); a->pat.trk[t].djf = djf_of(p); fmt_djf(djf_of(p), b, sizeof b); - snprintf(ti, sizeof ti, TF("T%d FILTER"), t + 1); + snprintf(ti, sizeof ti, TF("T%d FILTER"), app_pos(t) + 1); app_overlay(a, 1, ti, b, "", (p + 64) * 2, 128, bm_knob_color(1)); return; } - case 2: - snprintf(ti, sizeof ti, TF("T%d DELAY"), t + 1); - enc_track_u8(a, t, 2, TRK_OFF(send), tr->send, d, 0, 127, ti, 2); - return; - case 3: - snprintf(ti, sizeof ti, TF("T%d REVERB"), t + 1); - enc_track_u8(a, t, 3, TRK_OFF(rsend), tr->rsend, d, 0, 127, ti, 2); - return; + case 2: enc_track_u8(a, t, 2, TRK_OFF(send), tr->send, d, 0, 127, "DELAY", 2); return; + case 3: enc_track_u8(a, t, 3, TRK_OFF(rsend), tr->rsend, d, 0, 127, "REVERB", 2); return; default: return; } } -/* HOME, PRESETS = MOVE (0.7): una perilla que mueve toda la mezcla. A la izquierda cierra el filtro - * del master y manda la mezcla al eco; a la derecha abre el pasa-altos y la lava en la reverb. En - * vivo: no se guarda. Los patrones se eligen con las blancas. */ -static void enc_move(bm_app *a, int d) -{ - a->move = (int8_t)center_stop(a, a->move, d, 0, -63, 63); - app_push(a, CMD_MOVE, (uint8_t)a->move, 0, 0); - char b[8]; - snprintf(b, sizeof b, "%+d", a->move); - app_overlay(a, -1, a->move < 0 ? "MOVE DARK + ECHO" : a->move > 0 ? "MOVE BRIGHT + WASH" : "MOVE OFF", - a->move ? b : "0", "", (a->move + 64) * 2, 128, C_PINK); -} - -static void box_turn_in(bm_app *a, int d, int lane); - -/* Cambio de máquina (T3-T6), desde la consola: la tarjeta del canal (su blanca sostenida + ALGORITHM) - * o GLO > MACHINES. ALGORITHM mueve la elegida entre las 5, sin pregunta; quedarse 2 s en una la - * carga (en vivo: se elige girando y se suelta); irse antes, o soltar la tarjeta, cancela. Una pesada - * (BUNO-6, BITTAL) que ya está en otro canal no arranca la cuenta. La máquina queda por patrón. */ +/* Asignar una máquina a un canal (T3-T6), desde GLO > SELECT MACHINE: ALGORITHM mueve la elegida + * entre las 4, sin pregunta; quedarse 2 s en una la carga (en vivo: se elige girando y se suelta); + * irse antes, o salir de GLO, cancela. Una pesada (BUNO-6, BITTAL) que ya está en otro canal no + * arranca la cuenta. La máquina queda por patrón. */ static void mach_reset(bm_app *a, int t) /* empieza en la que suena, sin cuenta */ { a->mach_trk = (uint8_t)t; a->mach_sel = a->pat.trk[t].engine; a->mach_arm = 0; } -static void mach_turn(bm_app *a, int t, int d) +static void glo_mach_turn(bm_app *a, int t, int d) { - if (t < BM_TR_TRACKS) { app_toast(a, "T1 AND T2 ARE FIXED MACHINES"); return; } + if (app_fixed(t)) { app_toast(a, "THIS MACHINE IS FIXED"); return; } if (a->mach_trk != t) mach_reset(a, t); int i = 0; while (i < BM_MACHINES && bm_machines[i] != a->mach_sel) i++; @@ -3151,99 +1348,67 @@ static void mach_turn(bm_app *a, int t, int d) a->mach_arm = 0; if (a->mach_sel == a->pat.trk[t].engine) return; /* la que suena: nada que cargar */ int o = bm_machine_conflict(&a->pat, t, a->mach_sel); - if (o >= 0) { - char b[30]; snprintf(b, sizeof b, TF("%s ALREADY ON T%d"), bm_engine_names[a->mach_sel], o + 1); - app_toast(a, b); - return; - } - a->mach_arm = 1; -} - -/* la cuenta: a los 2 s en la misma, el canal cambia de máquina (mientras la tarjeta o GLO > MACHINES siga abierta) */ -static void mach_tick(bm_app *a) -{ - if (!a->mach_arm) return; - bool open = (a->card && a->card - 1 == a->mach_trk) || (a->view == V_GLO && a->glo_page == GP_MACH && a->track == a->mach_trk); - if (!open || a->layer) { a->mach_arm = 0; return; } - if (a->now - a->mach_t0 < BM_MACH_MS) return; - a->mach_arm = 0; - app_set_machine(a, a->mach_trk, a->mach_sel); -} - -/* ALGORITHM dentro de un canal: el modo de su máquina (docs/DISENO_0.6.md §5.3) */ -static void enc_mode(bm_app *a, int d) -{ - int t = a->track; - const bm_track *tr = &a->pat.trk[t]; - char b[20]; - switch (tr->engine) { - case ENG_DRUM: box_turn_in(a, d, 1); return; /* el instrumento */ - case ENG_BREAK: { /* el pad */ - int p = bm_clampi((a->sel_lane[1] & 15) + lst(a, d), 0, BM_LANES - 1); - a->sel_lane[1] = (uint8_t)p; - app_wave_view(a, a->pat.pad[p].src, a->pat.pad[p].start, a->cut_zoom); - snprintf(b, sizeof b, TF("PAD %d"), p + 1); - app_toast(a, b); - return; - } - case ENG_ACID: { /* la forma de onda: derecha SQUARE */ - int v = d > 0; - if (v == (a->pat.prm[t][AC_WAVE] & 1)) return; - app_push(a, CMD_SET_PRM, (uint8_t)t, AC_WAVE, (uint8_t)v); - a->pat.prm[t][AC_WAVE] = (uint8_t)v; - app_edited(a); - app_overlay(a, -1, "BB-303 WAVEFORM", v ? "SQUARE" : "SAW", "", v * 255, -1, bm_track_color(t)); - return; - } - case ENG_MINI: { /* derecha LEGATO, izquierda MONO */ - int v = d > 0; - if (v == (a->pat.prm[t][MN_MODE] != 0)) return; - app_push(a, CMD_SET_PRM, (uint8_t)t, MN_MODE, (uint8_t)v); - a->pat.prm[t][MN_MODE] = (uint8_t)v; - app_edited(a); - app_overlay(a, -1, "B-MINI MODE", v ? "LEGATO" : "MONO", "", v * 255, -1, bm_track_color(t)); - return; - } - case ENG_FM: { /* el algoritmo, 1..32 */ - int alg = bm_clampi(bm_fm_alg_of(tr, a->pat.prm[t]) + lst(a, d), 1, 32); - app_push(a, CMD_SET_PRM, (uint8_t)t, FX_ALG, (uint8_t)alg); - a->pat.prm[t][FX_ALG] = (uint8_t)alg; - app_edited(a); - snprintf(b, sizeof b, "%d", alg); - app_overlay(a, -1, "BX-7 ALGORITHM", b, "/ 32", (alg - 1) * 8, -1, bm_track_color(t)); - return; - } - case ENG_BITTAL: { /* la tabla del oscilador 1 */ - int n = bm_snap_count(ENG_BITTAL); - int v = bm_clampi(a->pat.prm[t][BT_TAB1] + lst(a, d), 0, n); - app_push(a, CMD_SET_PRM, (uint8_t)t, BT_TAB1, (uint8_t)v); - a->pat.prm[t][BT_TAB1] = (uint8_t)v; - app_edited(a); - app_overlay(a, -1, "OSC 1 TABLE", v ? bm_snap_name(ENG_BITTAL, v - 1) : "OWN", "", v * 255 / (n ? n : 1), -1, bm_track_color(t)); + if (o >= 0) { + char b[30]; snprintf(b, sizeof b, TF("%s ALREADY ON T%d"), bm_engine_names[a->mach_sel], app_pos(o) + 1); + app_toast(a, b); return; } - case ENG_BUNO: { /* el chorus */ - int v = wrap(a->pat.prm[t][BN_CHORUS] + lst(a, d), BN_CHORUSES); - app_push(a, CMD_SET_PRM, (uint8_t)t, BN_CHORUS, (uint8_t)v); - a->pat.prm[t][BN_CHORUS] = (uint8_t)v; - app_edited(a); - app_overlay(a, -1, "BUNO-6 CHORUS", bm_bn_chorus_names[v], "", v * 85, -1, bm_track_color(t)); + if (bm_engine_heavy(a->mach_sel) && bm_heavy_count(&a->pat, t) >= BM_HEAVY_MAX) { /* dice dónde están, para cambiar una de ellas */ + char b[30]; int n = snprintf(b, sizeof b, "%s", T("2 HEAVY ON")); + for (int i = 0; i < BM_TRACKS && n < (int)sizeof b - 4; i++) { + int o = BM_ORDER[i]; + if (o != t && bm_engine_heavy(a->pat.trk[o].engine)) n += snprintf(b + n, sizeof b - (size_t)n, " T%d", i + 1); + } + app_toast(a, b); return; } - default: return; + a->mach_arm = 1; +} + +/* El GLO de cada máquina, MACHINE: solo las que este canal puede tener ahora (una pesada que ya está + * en otro canal, o una tercera pesada, no aparecen); quedarse 2 s en una la carga, como en HOME. */ +static bool mach_avail(const bm_app *a, int t, int e) +{ + if (e == a->pat.trk[t].engine) return true; + if (!bm_engine_ok(t, e) || bm_machine_conflict(&a->pat, t, e) >= 0) return false; + return !(bm_engine_heavy(e) && bm_heavy_count(&a->pat, t) >= BM_HEAVY_MAX); +} + +int app_mach_shown(const bm_app *a) { return a->mach_trk == a->track ? a->mach_sel : a->pat.trk[a->track].engine; } + +void app_mach_pick(bm_app *a, int d) +{ + int t = a->track; + if (a->mach_trk != t) mach_reset(a, t); + int i = 0; + while (i < BM_MACHINES && bm_machines[i] != a->mach_sel) i++; + if (i >= BM_MACHINES) i = 0; + for (int n = lst(a, d), dir = n > 0 ? 1 : -1; n; n -= dir) { /* saltando las que no se pueden */ + int j = i + dir; + while (j >= 0 && j < BM_MACHINES && !mach_avail(a, t, bm_machines[j])) j += dir; + if (j < 0 || j >= BM_MACHINES) break; + i = j; } + a->mach_sel = bm_machines[i]; + a->mach_t0 = a->now; + a->mach_arm = (uint8_t)(a->mach_sel != a->pat.trk[t].engine); + char ti[22]; + snprintf(ti, sizeof ti, "T%d %s", app_pos(t) + 1, T("MACHINE")); + app_overlay(a, 1, ti, bm_engine_names[a->mach_sel], "", i * 255 / (BM_MACHINES - 1), -1, bm_knob_color(1)); } -static void enc_pattern(bm_app *a, int d) +/* la cuenta: a los 2 s en la misma, el canal cambia de máquina (mientras su GLO siga abierto) */ +static void mach_tick(bm_app *a) { - int base = a->pat_sel >= 0 ? a->pat_sel : a->ctx.st.pattern; - a->pat_sel = (int8_t)bm_clampi(base + lst(a, d), 0, BM_PATTERNS - 1); - a->pat_sel_t = a->now; - char b[8]; snprintf(b, sizeof b, "A%02d", a->pat_sel + 1); - app_overlay(a, -1, app_playing(a) ? "PATTERN (QUEUED)" : "PATTERN", b, "", a->pat_sel * 17, -1, C_WHITE); + if (!a->mach_arm) return; + bool glo = a->view == V_GLO || (a->view == V_MACH && a->bx.page == BXP_GLO); + if (!glo || a->track != a->mach_trk) { a->mach_arm = 0; return; } + if (a->now - a->mach_t0 < BM_MACH_MS) return; + a->mach_arm = 0; + app_set_machine(a, a->mach_trk, a->mach_sel); } -/* ALGORITHM en INSTR (batería): un recuadro dice a qué instrumento vas; al rato lo eliges (y suena). */ +/* ALGORITHM en el secuenciador de la batería: un recuadro dice a qué instrumento vas; al rato lo eliges (y suena). */ static void box_commit(bm_app *a) { a->box_on = 0; @@ -3254,10 +1419,9 @@ static void box_commit(bm_app *a) app_toast(a, b); } -static void box_turn_in(bm_app *a, int d, int lane) +static void box_turn(bm_app *a, int d) { - (void)lane; - if (!a->box_on || a->box_mode != BOX_LANE) { a->box_track = a->track; a->box_lane = (uint8_t)tr_lane(a); a->box_mode = BOX_LANE; } + if (!a->box_on) { a->box_track = a->track; a->box_lane = (uint8_t)tr_lane(a); a->box_mode = BOX_LANE; } a->box_lane = (uint8_t)bm_clampi(a->box_lane + lst(a, d), 0, BM_LANES - 1); int ms = bm_app_enter_ms(a); a->box_on = 1; a->box_hold = 0; @@ -3265,18 +1429,14 @@ static void box_turn_in(bm_app *a, int d, int lane) a->box_until = a->now + (uint32_t)ms; } +/* PRESETS: el sonido del canal (el kit de la batería, la toma del sampler, el preset de cada máquina) */ +static void enc_source(bm_app *a, int t, int d); +void app_enc_source(bm_app *a, int t, int d) { enc_source(a, t, d); } + static void enc_source(bm_app *a, int t, int d) { char b[16]; int kind = app_kind(a, t); - if (app_midi(a, t)) { - int v = bm_clampi(a->pat.trk[t].macro[1] + lst(a, d), 0, 127); - app_set_track(a, t, 1, v); - app_push(a, CMD_MIDI_SEND, (uint8_t)(0xC0 | (a->pat.trk[t].midi_ch & 15)), (uint8_t)v, 0xFF); - snprintf(b, sizeof b, "%d", v + 1); - app_overlay(a, -1, "MIDI PROGRAM", b, "", v * 2, -1, bm_track_color(t)); - return; - } if (bm_is_pads(t)) { /* la toma entera en el pad elegido */ uint8_t list[BM_TAKES + 8]; int n = bm_app_sources(a, list), i = 0, pad = a->sel_lane[1] & 15; @@ -3291,120 +1451,22 @@ static void enc_source(bm_app *a, int t, int d) } int lim = bm_sound_count(a, t), e = a->pat.trk[t].engine; int v = wrap(a->pat.trk[t].source % lim + lst(a, d), lim); - if (kind == KIND_TR && a->enc_new) app_undo_snapshot(a, t); /* el kit de antes: HOME + OCT- (una vez por giro) */ if (kind == KIND_TR || bm_engine_paged(e)) { app_push(a, CMD_PRESET, (uint8_t)t, (uint8_t)v, 0); app_edited(a); } else app_set_track(a, t, TRK_OFF(source), v); a->pat.trk[t].source = (uint8_t)v; char ti[22]; - if (kind == KIND_TR) snprintf(ti, sizeof ti, "T%d KIT", t + 1); - else snprintf(ti, sizeof ti, "T%d %s %s", t + 1, bm_engine_names[e % ENG_COUNT], T(e == ENG_FM ? "PATCH" : "SOUND")); + if (kind == KIND_TR) snprintf(ti, sizeof ti, "T%d KIT", app_pos(t) + 1); + else snprintf(ti, sizeof ti, "T%d %s %s", app_pos(t) + 1, bm_engine_names[e % ENG_COUNT], T("SOUND")); app_overlay(a, -1, ti, bm_sound_name(a, t), "", v * 255 / (lim > 1 ? lim - 1 : 1), -1, bm_track_color(t)); } -/* GLO de la máquina: ALGORITHM cambia la fila */ -static void more_change(bm_app *a, int d) -{ - uint8_t rows[10]; - int n = more_rows(a, a->track, rows), t = a->track; - if (a->more_row >= n) a->more_row = (uint8_t)(n - 1); - const bm_track *tk = &a->pat.trk[t]; - char b[30]; - switch (rows[a->more_row]) { - case ROW_VIEW: /* a la derecha PIANO ROLL, a la izquierda NOTES */ - if ((d > 0) == bm_app_roll_view(a, t)) return; - a->set.note_view = (uint8_t)(d > 0 ? a->set.note_view | (1u << t) : a->set.note_view & ~(1u << t)); - a->set_dirty = 1; a->t_edit = a->now; - app_toast(a, d > 0 ? "VIEW: PIANO ROLL (THE WHOLE LOOP)" : "VIEW: NOTES"); - return; - case ROW_MIDIOUT: /* a la derecha ON, a la izquierda OFF */ - if ((d > 0) == (tk->midi_out != 0)) return; - app_set_track(a, t, TRK_OFF(midi_out), d > 0); - app_toast(a, d > 0 ? "MIDI OUT ON: NOTES ALSO GO OUT" : "MIDI OUT OFF"); - return; - case ROW_ACC: enc_track_u8(a, t, -1, TRK_OFF(accent), tk->accent, d, 0, 127, "ACCENT", 2); return; - case ROW_LEN: set_len(a, t, bm_trk_len(&a->pat, t, bm_is_grid(&a->pat, t) ? 0 : -1) + lst(a, d)); return; - case ROW_SPEED: { - int v = bm_clampi(tk->speed + -lst(a, d), 0, SPD_COUNT - 1); - app_set_track(a, t, TRK_OFF(speed), v); - snprintf(b, sizeof b, TF("T%d SPEED"), t + 1); - app_overlay(a, -1, b, bm_speed_names[v], "", (SPD_COUNT - 1 - v) * 51, -1, C_WHITE); - return; - } - case ROW_TRANSP: { - int v = bm_clampi(tk->transpose + lst(a, d), 0, 48); - app_set_track(a, t, TRK_OFF(transpose), v); - char vb[12]; fmt_semi(v, vb, sizeof vb); - snprintf(b, sizeof b, TF("T%d TRANSPOSE"), t + 1); - app_overlay(a, -1, b, vb, "", v * 5, 120, C_WHITE); - return; - } - case ROW_MIDICH: { - int v = bm_clampi(tk->midi_ch + lst(a, d), 0, 15); - app_set_track(a, t, TRK_OFF(midi_ch), v); - char vb[8]; snprintf(vb, sizeof vb, "%d", v + 1); - app_overlay(a, -1, "MIDI CHANNEL", vb, "", v * 17, -1, C_WHITE); - return; - } - case ROW_INTERP: if ((d > 0) != (tk->interp != 0)) app_set_track(a, t, TRK_OFF(interp), d > 0); return; /* derecha HERMITE */ - default: /* INIT: a la derecha pregunta; 2 s sin tocar nada = sí */ - if (d < 0 || a->ask) return; - snprintf(b, sizeof b, bm_is_tr(&a->pat, t) ? TF("INIT KIT ON T%d?") : TF("INIT SOUND ON T%d?"), t + 1); - app_ask(a, ASK_INIT, t, 0, b, "THE SOUND SETTINGS ARE LOST"); - return; - } -} - -/* Las sub-páginas de la página del canal (las que recorre SELECT antes de cambiar de pestaña): las - * páginas del editor (SOUND, INSTR), las de PADS y MIX y su DUCK. */ -static uint8_t *sub_page(bm_app *a, int *n) -{ - int t = a->track; - *n = 0; - if (a->view != V_CH) return NULL; - switch (a->page) { - case PG_SOUND: case PG_INST: - if (!bm_app_ed_on(a) || !bm_app_ed_pages(a, t, n)) { *n = 0; return NULL; } - return &a->ed_page[t]; - case PG_PADS: *n = 4; return &a->ed_page[1]; - case PG_MIX: *n = 2; return &a->mix_page; - default: return NULL; - } -} - -static void tabs_turn(bm_app *a, int d) -{ - uint8_t tabs[8]; - int n = bm_app_tabs(a, a->track, tabs), i = 0; - while (i < n && tabs[i] != a->page) i++; - if (i >= n) i = d > 0 ? 0 : n - 1; - else i = (i + (d > 0 ? 1 : n - 1)) % n; - app_enter(a, a->track, tabs[i]); - int sn; - uint8_t *sp = sub_page(a, &sn); /* a la derecha entra por la primera, a la izquierda por la última */ - if (sp && sn > 0) *sp = (uint8_t)(d > 0 ? 0 : sn - 1); -} - -/* SELECT en un canal: de a un detent, la sub-página siguiente y, en el borde, la pestaña de al lado. - * En el GLO de la máquina, las filas. */ -static void select_turn(bm_app *a, int d) -{ - int r = lst(a, d), s = r > 0 ? 1 : -1; - if (a->page == PG_MORE) { a->more_row = (uint8_t)bm_clampi(a->more_row + r, 0, bm_app_more_count(a) - 1); return; } - for (int i = 0; i < (r > 0 ? r : -r); i++) { - int n; - uint8_t *sp = sub_page(a, &n); - if (sp && n > 0 && *sp % n + s >= 0 && *sp % n + s < n) *sp = (uint8_t)(*sp % n + s); - else tabs_turn(a, s); - } -} - static void system_change(bm_app *a, int d) { bm_settings *s = &a->set; /* los interruptores: a la derecha = encendido (o el siguiente), a la izquierda = apagado; nunca * dan la vuelta, así que girar de más no los cambia otra vez */ int on = d > 0; - switch (a->menu_row) { + switch (BM_SYS_ROWS[a->menu_row % BM_SYS_VIS]) { case 0: /* derecha EXTERNAL, izquierda INTERNAL */ if (on == s->clock) return; s->clock = (uint8_t)on; app_push(a, CMD_CLOCK, s->clock, 0, 0); @@ -3442,261 +1504,94 @@ static void system_change(bm_app *a, int d) a->set_dirty = 1; a->t_edit = a->now; } -/* GLO de la consola > SCALE: ROOT, SCALE, KEYS IN SCALE, BASE CHORD (k = la perilla, -1 = ALGORITHM) */ -static void scale_change(bm_app *a, int row, int d, int k) -{ - const bm_meta *m = &a->pat.meta; - const char *val = ""; - static const char *const NM[4] = {"PROJECT ROOT", "PROJECT SCALE", "KEYS IN SCALE", "BASE CHORD"}; - row &= 3; - if (row == 0) { int nv = wrap(m->root + lst(a, d), 12); app_set_meta(a, META_OFF(root), nv); val = bm_note_names[nv]; } - else if (row == 1) { int nv = wrap(m->scale + lst(a, d), BM_SCALES); app_set_meta(a, META_OFF(scale), nv); val = bm_scale_names[nv]; } - else if (row == 2) { int nv = d > 0; if (nv != m->scale_lock) app_set_meta(a, META_OFF(scale_lock), nv); val = nv ? "ON" : "OFF"; } - else { int nv = wrap(m->voicing + lst(a, d), 5); app_set_meta(a, META_OFF(voicing), nv); val = EXT_NAMES[nv]; } - app_overlay(a, k, NM[row], val, "", 128, -1, k >= 0 ? bm_knob_color(k) : C_WHITE); -} +/* Aceleración por el tiempo entre giros de cada perilla (no por cuántos detents juntó el bucle, que + * depende de la pantalla): rápido = x2 o x4 en los valores continuos. Las listas usan lst(). */ +#define ENC_FAST_MS 18u /* menos de esto por detent: x4 */ +#define ENC_MED_MS 35u /* menos de esto: x2 */ +#define ENC_GESTURE_MS 800u /* quieta más que esto: el giro empieza un gesto nuevo */ -/* GLO de la consola > SONG: el patrón de la entrada elegida (sin tocar su escena) */ -static void song_entry_pat(bm_app *a, int d) +/* K de una capa de sonido: un parámetro del instrumento elegido */ +static void lane_set(bm_app *a, int slot, int v) { - if (!a->song.n) return; - uint8_t *e = &a->song.pat[a->song_cur % a->song.n]; - int p = bm_clampi(bm_song_pat(*e) + lst(a, d), 0, BM_PATTERNS - 1); - *e = (uint8_t)((*e & 0xF0) | p); - a->song_dirty = 1; a->t_edit = a->now; + app_push_i(a, CMD_SET_LANE, (uint8_t)a->track, (uint8_t)tr_lane(a), (uint8_t)slot, v); + app_edited(a); } -/* GLO de la consola: ALGORITHM cambia la fila (TEMPO, SCALE), la máquina (MACHINES) o el patrón de la - * entrada (SONG) */ -static void glo_change(bm_app *a, int d) +static void enc_lane(bm_app *a, int page, int k, int d) { - switch (a->glo_page) { - case GP_TEMPO: - if (a->glo_row <= 2) enc_global(a, a->glo_row, d); - else if (a->glo_row == 3) enc_transpose(a, lst(a, d)); - else enc_fill_every(a, d); - return; - case GP_MACH: mach_turn(a, a->track, d); return; - case GP_SCALE: scale_change(a, a->glo_row, d, -1); return; - default: song_entry_pat(a, d); return; - } + const bm_pdef *def = &bm_lane_pages[page].p[k]; + int cur = lane_val(a, def->slot), step = def->max <= 16 ? lst(a, d) : d; + int nv = bm_clampi(cur + step, 0, def->max); + if (nv == cur) return; + lane_set(a, def->slot, nv); + char b[12], ti[22]; + bm_prm_fmt(def, nv, b, sizeof b); + snprintf(ti, sizeof ti, "%s %s", T(bm_lane_name(a, a->track, tr_lane(a))), T(def->slot == LN_COLOR ? bm_drm_color[lane_val(a, LN_MODEL) % DRM_COUNT] : def->name)); + app_overlay(a, k, ti, b, "", nv * 255 / (def->max ? def->max : 1), -1, bm_knob_color(k)); } -/* K1-K4 en el GLO de la consola: TEMPO BPM SWING MASTER TRANSPOSE · SCALE ROOT SCALE KEYS CHORD · - * SONG K1 patrón, K2 vueltas, K4 SONG */ -static void glo_knob(bm_app *a, int k, int d) +/* ALGORITHM en EDIT: el sonido de este instrumento = su modelo de batería (se puede combinar cualquiera con cualquiera) */ +static void enc_model(bm_app *a, int d) { - switch (a->glo_page) { - case GP_TEMPO: if (k <= 2) enc_global(a, k, d); else enc_transpose(a, lst(a, d)); return; - case GP_SCALE: scale_change(a, k, d, k); return; - case GP_SONG: - if (k == 0) song_entry_pat(a, d); - else if (k == 1 && a->song.n) { int i = a->song_cur % a->song.n; a->song.rep[i] = (uint8_t)bm_clampi(a->song.rep[i] + lst(a, d), 1, 16); a->song_dirty = 1; a->t_edit = a->now; } - else if (k == 3) { /* a la derecha ON, a la izquierda OFF */ - int v = d > 0; - if (v != (a->ctx.st.song_on != 0)) { app_push(a, CMD_SONG, (uint8_t)v, 0, 0); app_toast(a, v ? "SONG ON" : "SONG OFF"); } - } - return; - default: return; - } + int nv = wrap(lane_val(a, LN_MODEL) + lst(a, d), DRM_COUNT); + lane_set(a, LN_MODEL, nv); + app_push(a, CMD_NOTE_ON, (uint8_t)a->track, (uint8_t)tr_lane(a), 100); + char ti[22]; + snprintf(ti, sizeof ti, "%s", T(bm_lane_name(a, a->track, tr_lane(a)))); + app_overlay(a, -1, ti, bm_drm_names[nv], "", nv * 255 / (DRM_COUNT - 1), -1, bm_track_color(a->track)); } -/* HOME FX > CHANNEL: el canal del cursor. K1 DRIVE (soft-clip), K2 PAN, K3 DUCK, K4 BEAT FX (ON/OFF: - * el efecto de BEAT FX o del PUNCH lo toca o no, como el botón de cada canal de un MX-1) */ -static void fx_channel(bm_app *a, int k, int d) +/* K1-K4 en el secuenciador de la batería. Con un paso sostenido: K1 su acento, K2 su repetición + * (sin abrir capas). Si no: LEVEL del instrumento elegido, LENGTH del kit entero (todos los + * instrumentos, 1-64 pasos), DECAY y TONE del elegido. */ +static void kit_len(bm_app *a, int d) { app_kit_len(a, a->track, 1, d); } + +void app_kit_len(bm_app *a, int t, int k, int d) { - int t = a->track; - const bm_track *tr = &a->pat.trk[t]; - char b[16], ti[22]; - switch (k) { - case 0: { - int v = bm_clampi(tr->drive + d, 0, 127); - app_set_track(a, t, TRK_OFF(drive), v); - if (v) fmt_pct(v, b, sizeof b); else snprintf(b, sizeof b, "OFF"); - snprintf(ti, sizeof ti, TF("T%d DRIVE"), t + 1); - app_overlay(a, 0, ti, b, "", v * 2, -1, bm_knob_color(0)); - return; - } - case 1: { - int nv = center_stop(a, tr->pan, d, 64, 0, 127); /* el centro retiene */ - app_set_track(a, t, TRK_OFF(pan), nv); - fmt_pan(nv, b, sizeof b); - snprintf(ti, sizeof ti, TF("T%d PAN"), t + 1); - app_overlay(a, 1, ti, b, "", nv * 2, 128, bm_knob_color(1)); - return; - } - case 2: - if (t == 0) { app_overlay(a, 2, "DUCK", "T1 IS THE SOURCE", "", 0, -1, bm_knob_color(2)); return; } - enc_track_u8(a, t, 2, TRK_OFF(duck), tr->duck, d, 0, 127, "DUCK (SIDECHAIN)", 2); - return; - default: { - int off = d < 0; /* a la derecha ON, a la izquierda OFF */ - if (off != tr->bfx_off) app_set_track(a, t, TRK_OFF(bfx_off), off); - snprintf(ti, sizeof ti, TF("T%d BEAT FX"), t + 1); - app_overlay(a, 3, ti, off ? "OFF" : "ON", "", off ? 0 : 255, -1, bm_knob_color(3)); - return; - } - } + const bm_tr *tr = bm_trk_trc(&a->pat, t); + int cur = tr->lane[tr_lane(a)].len ? tr->lane[tr_lane(a)].len : 16; + int v = bm_clampi(cur + d, 1, BM_STEPS); + if (v == cur) return; + for (int l = 0; l < BM_LANES; l++) app_push_i(a, CMD_SET_LANE, (uint8_t)t, (uint8_t)l, LN_LEN, v); + app_edited(a); + if (a->step_page * 16 >= v) a->step_page = (uint8_t)((v - 1) / 16); + char b[12], ti[22]; + snprintf(b, sizeof b, v > 1 ? "%d STEPS" : "%d STEP", v); + snprintf(ti, sizeof ti, "T%d %s", app_pos(t) + 1, T("LENGTH")); + app_overlay(a, k, ti, b, "", (v - 1) * 255 / (BM_STEPS - 1), -1, bm_knob_color(k)); } -static void enc_channel(bm_app *a, int id, int d) +static void seq_knob(bm_app *a, int k, int d) { - int t = a->track, kind = app_kind(a, t), k = id - ENC_K1; - const bm_track *tr = &a->pat.trk[t]; - bm_meta *m = &a->pat.meta; - char b[16], ti[22]; - if (id == ENC_PRESETS) { enc_source(a, t, d); return; } - if (id == ENC_SELECT) { select_turn(a, d); return; } - if (id == ENC_ALGO) { - if (a->page == PG_MORE) { more_change(a, d); return; } - if (a->page == PG_TAKES) { - uint8_t list[BM_TAKES + 8]; - int n = bm_app_sources(a, list); - if (!n) return; - a->takes_row = (uint8_t)bm_clampi(a->takes_row + lst(a, d), 0, n - 1); - return; - } - if (a->page == PG_REC) { app_toast(a, "THE SAMPLER STAYS HERE"); return; } - enc_mode(a, d); - return; - } - if (k < 0 || k > 3) return; - switch (a->page) { - case PG_SEQ: - if (app_midi(a, t)) goto midi; - enc_macro(a, t, k, d); - return; - case PG_SOUND: - if (kind == KIND_TR) { enc_macro(a, t, k, d); return; } - ed_turn(a, t, k, d); - return; - case PG_INST: ed_turn(a, t, k, d); return; - case PG_MIX: goto mix; - case PG_MORE: - if (k == 0) set_len(a, t, bm_trk_len(&a->pat, t, bm_is_grid(&a->pat, t) ? tr_lane(a) : -1) + lst(a, d)); - else if (k == 1) { int v = bm_clampi(tr->speed + -lst(a, d), 0, SPD_COUNT - 1); app_set_track(a, t, TRK_OFF(speed), v); app_overlay(a, 1, "SPEED", bm_speed_names[v], "", (SPD_COUNT - 1 - v) * 51, -1, bm_knob_color(1)); } - else if (k == 2) enc_track_u8(a, t, 2, TRK_OFF(accent), tr->accent, d, 0, 127, "ACCENT", 2); - else if (kind == KIND_NOTE) { int v = bm_clampi(tr->transpose + lst(a, d), 0, 48); app_set_track(a, t, TRK_OFF(transpose), v); fmt_semi(v, b, sizeof b); app_overlay(a, 3, "TRANSPOSE", b, "", v * 5, 120, bm_knob_color(3)); } - return; - case PG_BREAK: enc_track_u8(a, 1, k, (uint8_t)(TRK_OFF(gen) + k), tr->gen[k], d, 0, 127, GEN_NAMES[k], 2); return; - case PG_TAKES: { - uint8_t src = bm_app_takes_sel(a); - if (src == BM_SRC_NONE || (src & BM_SRC_ROM)) { app_toast(a, "FACTORY IS READ ONLY"); return; } - bm_take *tk = &a->take[src]; - if (k == 0) { tk->bpm_x10 = (uint16_t)bm_clampi(tk->bpm_x10 + d * 10, 400, 2400); snprintf(b, sizeof b, "%d", tk->bpm_x10 / 10); app_overlay(a, 0, "TAKE BPM", b, "BPM", (tk->bpm_x10 - 400) * 255 / 2000, -1, bm_knob_color(0)); } - else if (k == 1) { tk->bars = (uint8_t)bm_clampi(tk->bars + lst(a, d), 1, 8); snprintf(b, sizeof b, "%d", tk->bars); app_overlay(a, 1, "BARS", b, "", tk->bars * 31, -1, bm_knob_color(1)); } - else if (k == 2) { tk->gain = (uint8_t)bm_clampi(tk->gain + d, 8, 127); snprintf(b, sizeof b, "%+d", ((int)tk->gain - 64) * 6 / 64); app_overlay(a, 2, "GAIN", b, "DB", tk->gain * 2, 128, bm_knob_color(2)); } - else return; - take_changed(a, src); - return; - } - case PG_ARP: - if (kind != KIND_NOTE) return; /* las rejillas: ARP es la capa ROLL */ - goto arp; - case PG_LOOP: - if (k == 0 && (d > 0) != (a->pat.loop[t - 2].on != 0)) { app_push(a, CMD_LOOP, (uint8_t)t, 3, 0); app_edited(a); } /* derecha ON */ - if (k == 1) { - const bm_loop *lp = &a->pat.loop[t - 2]; - int nb = lp->bars == 1 ? (d > 0 ? 2 : 1) : lp->bars == 2 ? (d > 0 ? 4 : 1) : (d > 0 ? 4 : 2); - app_push(a, CMD_LOOP, (uint8_t)t, 4, (uint8_t)nb); app_edited(a); - snprintf(b, sizeof b, "%d", nb); - app_overlay(a, 1, "LOOP BARS", b, "", nb * 63, -1, bm_knob_color(1)); - } - return; - case PG_MIDI: goto midi; - case PG_SCL: { - const char *val = ""; - if (k == 0) { - if (tr->scl == 0xFF) { int nv = wrap(m->root + lst(a, d), 12); app_set_meta(a, META_OFF(root), nv); val = bm_note_names[nv]; } - else { int nv = wrap(tr->scl_root + lst(a, d), 12); app_set_track(a, t, TRK_OFF(scl_root), nv); val = bm_note_names[nv]; } - } else if (k == 1) { - int cur = tr->scl == 0xFF ? -1 : tr->scl; - int nv = bm_clampi(cur + lst(a, d), -1, BM_SCALES - 1); - if (cur == -1 && nv == 0) app_set_track(a, t, TRK_OFF(scl_root), m->root); - app_set_track(a, t, TRK_OFF(scl), nv < 0 ? 0xFF : nv); - val = nv < 0 ? "PROJECT" : bm_scale_names[nv]; - } else if (k == 2) { int nv = wrap(m->voicing + lst(a, d), 5); app_set_meta(a, META_OFF(voicing), nv); val = EXT_NAMES[nv]; } - else { int nv = d > 0; if (nv != m->scale_lock) app_set_meta(a, META_OFF(scale_lock), nv); val = nv ? "ON" : "OFF"; } - static const char *const NM[4] = {"ROOT", "TRACK SCALE", "BASE CHORD", "KEYS IN SCALE"}; - app_overlay(a, k, NM[k], val, "", 128, -1, bm_knob_color(k)); - return; - } - case PG_CHORDS: goto chords; - case PG_REC: if (k == 0 && (d > 0) != (a->rec_now != 0)) { a->rec_now = d > 0; app_toast(a, a->rec_now ? "STARTS WHEN YOU PRESS REC" : "STARTS ON THE BAR"); } return; - case PG_PADS: - if (a->ed_page[1] == 0) { /* TRIM: START LENGTH ZOOM SNAP */ - if (k <= 1) pad_trim(a, k, d); - else if (k == 2) a->cut_zoom = (uint8_t)bm_clampi(a->cut_zoom + lst(a, d), 0, 3); - else a->cut_snap = (uint8_t)bm_clampi(a->cut_snap + lst(a, d), 0, 2); - } else pad_sound(a, k, d); - return; - default: return; - } -mix: - { - if (a->mix_page && a->view == V_CH) { /* FX otra vez: DUCK */ - if (k) return; - if (t == 0) { app_overlay(a, 0, "DUCK", "T1 IS THE SOURCE", "", 0, -1, bm_knob_color(0)); return; } - enc_track_u8(a, t, 0, TRK_OFF(duck), tr->duck, d, 0, 127, "DUCK (SIDECHAIN)", 2); - return; + if (a->held_step >= 0) { + if (k > 1) return; + int t = a->track, lane = tr_lane(a), s = a->held_step; + uint8_t v = bm_trk_trc(&a->pat, t)->st[lane][s]; + if (!(v & ST_ON)) return; + if (k == 0) v = (uint8_t)(d > 0 ? v | ST_ACC : v & ~ST_ACC); + else { + int r = (v & ST_FLAM) ? 4 : (v & ST_RAT_MASK) >> ST_RAT_SH; + r = bm_clampi(r + lst(a, d), 0, 4); + v = (uint8_t)(v & ~(ST_RAT_MASK | ST_FLAM)); + if (r == 4) v |= ST_FLAM; else v |= (uint8_t)(r << ST_RAT_SH); } - static const uint8_t OFFS[4] = {TRK_OFF(level), TRK_OFF(pan), TRK_OFF(send), TRK_OFF(rsend)}; - const uint8_t cur[4] = {tr->level, tr->pan, tr->send, tr->rsend}; - int nv = k == 1 ? center_stop(a, cur[k], d, 64, 0, 127) : bm_clampi(cur[k] + d, 0, 127); /* PAN: el centro retiene */ - app_set_track(a, t, OFFS[k], nv); - if (k == 1) fmt_pan(nv, b, sizeof b); else if (k == 0) snprintf(b, sizeof b, "%d", nv); else fmt_pct(nv, b, sizeof b); - static const char *const NM[4] = {"LEVEL", "PAN", "DELAY SEND", "REVERB SEND"}; - snprintf(ti, sizeof ti, "T%d %s", t + 1, T(NM[k])); - app_overlay(a, k, ti, b, "", nv * 2, k == 1 ? 128 : -1, bm_knob_color(k)); - return; - } -midi: - { - static const uint8_t CC[4] = {0, 0, 1, 74}; - if (k == 0) { int v = bm_clampi(tr->midi_ch + lst(a, d), 0, 15); app_set_track(a, t, TRK_OFF(midi_ch), v); snprintf(b, sizeof b, "%d", v + 1); app_overlay(a, 0, "MIDI CHANNEL", b, "", v * 17, -1, bm_knob_color(0)); return; } - if (k == 1) { enc_source(a, t, d); return; } - int v = bm_clampi(tr->macro[k] + d, 0, 127); - app_set_track(a, t, (uint8_t)k, v); - app_push(a, CMD_MIDI_SEND, (uint8_t)(0xB0 | (tr->midi_ch & 15)), CC[k], (uint8_t)v); - snprintf(b, sizeof b, "%d", v); snprintf(ti, sizeof ti, "CC %d", CC[k]); - app_overlay(a, k, ti, b, "", v * 2, -1, bm_knob_color(k)); - return; - } -arp: - { - int nv; - if (k == 0) { nv = wrap(tr->arp_mode + lst(a, d), 5); app_set_track(a, t, TRK_OFF(arp_mode), nv); app_overlay(a, 0, "ARP MODE", ARP_MODES[nv], "", nv * 63, -1, bm_knob_color(0)); } - if (k == 1) { nv = bm_clampi(tr->arp_rate + lst(a, d), 0, 2); app_set_track(a, t, TRK_OFF(arp_rate), nv); app_overlay(a, 1, "ARP RATE", ARP_RATES[nv], "", nv * 127, -1, bm_knob_color(1)); } - if (k == 2) { nv = bm_clampi(tr->arp_oct + lst(a, d), 1, 3); app_set_track(a, t, TRK_OFF(arp_oct), nv); snprintf(b, sizeof b, "%d", nv); app_overlay(a, 2, "ARP OCTAVES", b, "", nv * 85, -1, bm_knob_color(2)); } - if (k == 3) { nv = bm_clampi(tr->arp_gate + d, 10, 100); app_set_track(a, t, TRK_OFF(arp_gate), nv); snprintf(b, sizeof b, "%d", nv); app_overlay(a, 3, "ARP GATE", b, "%", nv * 255 / 100, -1, bm_knob_color(3)); } + app_push_i(a, CMD_SET_TRSTEP, (uint8_t)t, (uint8_t)lane, (uint8_t)s, v); + app_edited(a); + a->held_edit = 1; a->held_long = 1; /* soltarlo no lo borra */ return; } -chords: - { - const char *val = ""; - if (k == 0) { int nv = wrap(m->chord_set + lst(a, d), BM_CHORD_SETS); app_set_meta(a, META_OFF(chord_set), nv); val = bm_chord_set_names[nv]; } - if (k == 1) { int nv = wrap(m->chord_voicing + lst(a, d), 3); app_set_meta(a, META_OFF(chord_voicing), nv); val = VOICINGS[nv]; a->prev_chord_n = 0; } - if (k == 2) { int nv = bm_clampi(m->chord_oct + lst(a, d), 1, 5); app_set_meta(a, META_OFF(chord_oct), nv); snprintf(b, sizeof b, "%d", nv); val = b; } - if (k == 3) { int nv = bm_clampi(m->strum + 2 * lst(a, d), 0, 60); app_set_meta(a, META_OFF(strum), nv); snprintf(b, sizeof b, "%d", nv); val = b; } - static const char *const NM[4] = {"CHORD SET", "VOICING", "OCTAVE", "STRUM (MS)"}; - app_overlay(a, k, NM[k], val, "", 128, -1, bm_knob_color(k)); - } + if (bm_is_pads(a->track)) { slicer_grid_knob(a, k, d); return; } /* LEVEL LENGTH PITCH RELEASE del pad */ + if (k == 1) { kit_len(a, d); return; } + enc_lane(a, 2, k, d); } -static void enc_dispatch(bm_app *a, int id, int d, uint32_t now); - -/* Aceleración por el tiempo entre giros de cada perilla (no por cuántos detents juntó el bucle, que - * depende de la pantalla): rápido = x2 o x4 en los valores continuos. Las listas usan lst(). */ -#define ENC_FAST_MS 18u /* menos de esto por detent: x4 */ -#define ENC_MED_MS 35u /* menos de esto: x2 */ -#define ENC_GESTURE_MS 800u /* quieta más que esto: el giro empieza un gesto nuevo */ +static void enc_dispatch(bm_app *a, int id, int d); void bm_app_encoder(bm_app *a, int id, int d, uint32_t now) { a->now = now; if (!d || a->view == V_BOOT || id < 0 || id >= ENC_COUNT) return; bm_gesture_other(&a->ges, now); - if (bm_gesture_is_down(&a->ges, BTN_HOME)) a->home_used = 1; d = bm_clampi(d, -100, 100); uint32_t dt = now - a->enc_t[id]; a->enc_t[id] = now; @@ -3704,201 +1599,68 @@ void bm_app_encoder(bm_app *a, int id, int d, uint32_t now) a->enc_new = dt > ENC_GESTURE_MS; a->enc_raw = (int8_t)d; a->enc_cur = (uint8_t)(id + 1); - a->cur_ctl = ASK_ENC; int mul = per < ENC_FAST_MS ? 4 : per < ENC_MED_MS ? 2 : 1; - enc_dispatch(a, id, d * mul, now); + enc_dispatch(a, id, d * mul); a->enc_raw = 0; a->enc_cur = 0; } -static void enc_dispatch(bm_app *a, int id, int d, uint32_t now) +static void enc_dispatch(bm_app *a, int id, int d) { int k = id - ENC_K1; - bm_meta *m = &a->pat.meta; - char b[16]; - (void)now; - - /* una pregunta: la perilla que preguntó (ALGORITHM a la derecha en INIT) sigue; otra es no */ - if (a->ask) { - if (!(a->ask_ctl == ASK_ENC && id == ENC_ALGO && d > 0)) ask_no(a, 0); - return; - } - /* la tarjeta del canal abierta: ALGORITHM = su máquina, PRESETS = su sonido; girar algo = soltar no entra */ - if (a->card && console(a) && !a->layer) { - int ct = a->card - 1; - a->card_turn = 1; - if (id == ENC_ALGO) { mach_turn(a, ct, d); return; } - if (id == ENC_PRESETS) { enc_source(a, ct, d); return; } - } - /* capas primero: las perillas siguen a la capa */ + if (a->view == V_MACH) { mach_encoder(a, id, d); return; } + /* capas: las perillas siguen a la capa */ switch (a->layer) { - case L_HOME: /* HOME sostenido: la consola en cualquier lado */ - if (id == ENC_SELECT) a->track = (uint8_t)bm_clampi(a->track + lst(a, d), 0, BM_TRACKS - 1); - else if (id == ENC_ALGO) enc_bpm_fine(a, d); /* HOME + ALGORITHM: décimas de BPM */ - else if (id == ENC_PRESETS) enc_pattern(a, d); /* se elige al soltar HOME */ - else if (k >= 0 && k <= 3) enc_home(a, k, d); - return; - case L_TONE: /* GLO sostenido: K1 BPM, K2 SWING como en todas partes */ - if (k == 0 || k == 1) enc_global(a, k, d); - else if (k == 2) enc_transpose(a, lst(a, d)); - else if (k == 3) enc_transpose(a, 12 * lst(a, d)); - return; - case L_LEN: - if (k == 0) set_len(a, a->track, bm_trk_len(&a->pat, a->track, app_kind(a, a->track) == KIND_NOTE ? -1 : 0) + lst(a, d)); - else if (k == 1) { int v = bm_clampi(a->pat.trk[a->track].speed + -lst(a, d), 0, SPD_COUNT - 1); app_set_track(a, a->track, TRK_OFF(speed), v); app_overlay(a, 1, "SPEED", bm_speed_names[v], "", (SPD_COUNT - 1 - v) * 51, -1, bm_knob_color(1)); } - return; case L_ACC: if (k == 0) enc_track_u8(a, a->track, 0, TRK_OFF(accent), a->pat.trk[a->track].accent, d, 0, 127, "ACCENT", 2); return; - case L_REP: if (k == 0 && app_kind(a, a->track) == KIND_NOTE) enc_track_u8(a, a->track, 0, TRK_OFF(glide), a->pat.trk[a->track].glide, d, 0, 127, "GLIDE", 2); return; - case L_ROLL: - if (k == 0) roll_set_rate(a, a->roll_rate + lst(a, d)); /* K1 = lo mismo que las negras 1-6 */ - else if (k == 1) { /* K2 = largo de la rampa */ - a->roll_len = (uint8_t)bm_clampi(a->roll_len + lst(a, d), 0, 3); - app_overlay(a, 1, a->roll_ramp == 1 ? "CRESC" : a->roll_ramp == 2 ? "DECRESC" : "RAMP", bm_roll_len_names[a->roll_len], "", a->roll_len * 85, -1, bm_knob_color(1)); - } else if (k == 2) { /* K3 = swing del roll */ - a->roll_swing = (uint8_t)bm_clampi(a->roll_swing + d, 50, 75); - snprintf(b, sizeof b, "%d%%", a->roll_swing); - app_overlay(a, 2, "ROLL SWING", b, "", (a->roll_swing - 50) * 255 / 25, -1, bm_knob_color(2)); - } else if (k == 3) { /* K4 = cola al soltar */ - a->roll_tail = (uint8_t)bm_clampi(a->roll_tail + lst(a, d), 0, 3); - app_overlay(a, 3, "ROLL TAIL", bm_roll_tail_names[a->roll_tail], "", a->roll_tail * 85, -1, bm_knob_color(3)); - } else return; - if (k > 0) roll_cfg_send(a); + case L_HIT: if (k >= 0 && k <= 3) enc_lane(a, 0, k, d); return; + case L_INST: + if (id == ENC_ALGO) enc_model(a, d); + else if (k >= 0 && k <= 2) enc_lane(a, 1, k, d); return; - case L_FILL: case L_LANEMUTE: /* pantallas de MUTE y FILL: las perillas siguen con lo de SEQ */ - if (id == ENC_SELECT) key_screen_close(a); /* cambiar de página cierra la pantalla */ - break; - case L_PUNCH: case L_CHORDS: case L_ARP: case L_ERASE: case L_COPY: - if (a->layer == L_PUNCH && k >= 0 && k <= 3) break; - if ((a->layer == L_CHORDS || a->layer == L_ARP) && k >= 0 && k <= 3) break; + case L_REP: case L_MUTE: return; + case L_LEN: /* Slicer: K1 el largo del pad, K2 la velocidad; ALGORITHM el pad */ + if (id == ENC_ALGO) box_turn(a, d); + else if (k == 0) pad_len_set(a, bm_trk_len(&a->pat, a->track, tr_lane(a)) + lst(a, d)); + else if (k == 1) speed_set(a, a->pat.trk[a->track].speed - lst(a, d)); return; default: break; } - if (a->layer == L_PUNCH) goto fxg; - if (a->layer == L_CHORDS) { uint8_t pg = a->page; a->page = PG_CHORDS; enc_channel(a, id, d); a->page = pg; return; } - if (a->layer == L_ARP) { uint8_t pg = a->page; a->page = PG_ARP; enc_channel(a, id, d); a->page = pg; return; } - - /* REC en un canal de notas: SELECT = el paso, ALGORITHM = su gate (10..100 %, 100 = TIE), PRESETS = su micro-timing */ - if (a->rec && a->view == V_CH && a->page == PG_SEQ && app_kind(a, a->track) == KIND_NOTE && a->held_step < 0 - && (id == ENC_SELECT || id == ENC_ALGO || id == ENC_PRESETS)) { enc_rec(a, id, d); return; } - /* paso sostenido > lista > canal > HOME. Con un paso sostenido PRESETS es la condición (golpes) o - * el largo (notas), nunca el kit: cambiarlo ahí reemplazaba los 16 instrumentos sin querer. */ - if (a->view == V_CH && a->page == PG_SEQ && a->held_step >= 0) { - if (bm_is_grid(&a->pat, a->track)) enc_step_grid(a, id, d); else enc_step_syn(a, id, d); - return; - } - /* el FX y el GLO de la consola: PRESETS = MOVE */ - if (id == ENC_PRESETS && (a->view == V_FXG || a->view == V_GLO)) { enc_move(a, d); return; } switch (a->view) { - case V_HOME: /* MIX: el canal del cursor */ - if (id == ENC_ALGO) enc_global(a, 0, d); /* ALGORITHM = BPM (HOME + ALGORITHM: décimas) */ + case V_HOME: /* el mezclador: SELECT el canal, ALGORITHM el BPM, PRESETS el sonido */ + if (id == ENC_ALGO) enc_bpm(a, d); else if (id == ENC_SELECT) { int t0 = a->track; - a->track = (uint8_t)bm_clampi(a->track + lst(a, d), 0, BM_TRACKS - 1); - if (a->sloop && a->track != t0) sloop_follow(a); /* SLOOP: el teclado sigue al canal */ + a->track = BM_ORDER[wrap(app_pos(a->track) + lst(a, d), BM_TRACKS)]; /* de arriba a abajo, y vuelve al 1 */ + if (a->sloop && a->track != t0) sloop_follow(a); /* PLAY/REC: el teclado sigue al canal */ } - else if (id == ENC_PRESETS) enc_source(a, a->track, d); /* su kit, patch o sonido (el kit se deshace) */ + else if (id == ENC_PRESETS) enc_source(a, a->track, d); else enc_home(a, k, d); return; - case V_GLO: - if (id == ENC_SELECT) { - if (a->glo_page == GP_MACH) { a->track = (uint8_t)bm_clampi(a->track + lst(a, d), BM_TR_TRACKS, BM_TRACKS - 1); mach_reset(a, a->track); } - else if (a->glo_page == GP_SONG) { if (a->song.n) a->song_cur = (uint8_t)bm_clampi(a->song_cur + lst(a, d), 0, a->song.n - 1); } - else a->glo_row = (uint8_t)bm_clampi(a->glo_row + lst(a, d), 0, bm_app_glo_count(a) - 1); - } else if (id == ENC_ALGO) glo_change(a, d); - else if (k >= 0 && k <= 3) glo_knob(a, k, d); + case V_GLO: /* PRESETS: la página; MACHINES: SELECT el canal, ALGORITHM su máquina */ + if (a->glo_page == 0) { + if (id == ENC_SELECT) { a->track = BM_ORDER[wrap(app_pos(a->track) + lst(a, d), BM_TRACKS)]; mach_reset(a, a->track); } + else if (id == ENC_ALGO) glo_mach_turn(a, a->track, d); + return; + } + if (a->glo_page == 1 && id == ENC_ALGO) { enc_bpm(a, d); return; } + if (k >= 0 && k <= 3) glo_knob(a, k, d); return; case V_SYSTEM: - if (id == ENC_SELECT) a->menu_row = (uint8_t)bm_clampi(a->menu_row + lst(a, d), 0, 10); + if (id == ENC_SELECT) a->menu_row = (uint8_t)bm_clampi(a->menu_row + lst(a, d), 0, BM_SYS_VIS - 1); else if (id == ENC_ALGO || id == ENC_K1) system_change(a, d); return; case V_SAVE: /* PRESETS = el patrón de destino, como ALGORITHM */ - if (id == ENC_SELECT) a->save_row = (uint8_t)bm_clampi(a->save_row + lst(a, d), 0, 4); + if (id == ENC_SELECT) a->save_row = (uint8_t)bm_clampi(a->save_row + lst(a, d), 0, BM_SAVE_ROWS - 1); else if (id == ENC_ALGO || id == ENC_K1 || id == ENC_PRESETS) a->save_target = (uint8_t)bm_clampi(a->save_target + lst(a, d), 0, BM_PATTERNS - 1); a->clear_armed = 0; return; - case V_TIME: { - if (id == ENC_SELECT || id == ENC_ALGO) { a->time_row = (uint8_t)bm_clampi(a->time_row + lst(a, d), 0, BM_TRACKS - 1); return; } - int row = a->time_row; - const bm_track *rt = &a->pat.trk[row]; - char ti[22]; - if (k == 0) set_len(a, row, bm_trk_len(&a->pat, row, bm_is_grid(&a->pat, row) ? 0 : -1) + lst(a, d)); - else if (k == 1) { - int nv = bm_clampi(rt->speed + -lst(a, d), 0, SPD_COUNT - 1); /* a la derecha = más rápido */ - app_set_track(a, row, TRK_OFF(speed), nv); - snprintf(ti, sizeof ti, TF("T%d SPEED"), row + 1); - app_overlay(a, 1, ti, bm_speed_names[nv], "", (SPD_COUNT - 1 - nv) * 51, -1, bm_knob_color(1)); - } else if (k == 2 && bm_is_grid(&a->pat, row) && row != 1) { /* T2: cada pad tiene su largo en la capa LENGTH */ - a->time_lane = (uint8_t)bm_clampi(a->time_lane + lst(a, d), 0, 15); - } else if (k == 3 && bm_is_grid(&a->pat, row) && row != 1) { - const bm_lane *ln = &bm_trk_trc(&a->pat, row)->lane[a->time_lane]; - int nv = bm_clampi(ln->len + lst(a, d), 1, 64); - app_push_i(a, CMD_SET_LANE, (uint8_t)row, a->time_lane, 0, nv); app_edited(a); - snprintf(b, sizeof b, "%d", nv); snprintf(ti, sizeof ti, TF("%s LENGTH"), T(bm_lane_name(a, row, a->time_lane))); - app_overlay(a, 3, ti, b, "STEPS", nv * 4, -1, bm_knob_color(3)); - } - return; - } - case V_FXG: /* SELECT = CHANNEL > DELAY > REVERB > MASTER, ALGORITHM = BPM */ - if (id == ENC_SELECT) { a->fx_page = (uint8_t)bm_clampi(a->fx_page + lst(a, d), 0, FXP_COUNT - 1); return; } - if (id == ENC_ALGO) { enc_global(a, 0, d); return; } - goto fxg; - case V_COPYCH: - if (id == ENC_ALGO || id == ENC_SELECT) { - int ks = app_kind(a, a->copy_src), dst = a->copy_dst; - for (int i = 0; i < BM_TRACKS; i++) { - dst = (dst + (d > 0 ? 1 : BM_TRACKS - 1)) % BM_TRACKS; - if (dst == a->copy_src || dst == 1) continue; - if (app_kind(a, dst) == ks) break; - } - a->copy_dst = (uint8_t)dst; - } + case V_CH: /* secuenciador de la batería */ + if (id == ENC_PRESETS) enc_source(a, a->track, d); + else if (id == ENC_ALGO) box_turn(a, d); + else if (k >= 0 && k <= 3) seq_knob(a, k, d); return; - case V_CH: enc_channel(a, id, d); return; default: return; } -fxg: - if (k < 0 || k > 3) return; - switch (fx_kpage(a)) { - case FXP_CHANNEL: fx_channel(a, k, d); return; - case FXP_MASTER: /* MASTER: filtro, BEAT FX, drive */ - if (k == 0) { - int nv = bm_clampi(m->mfilt + d, 0, 127); - app_set_meta(a, META_OFF(mfilt), nv); - if (nv >= 60 && nv <= 68) snprintf(b, sizeof b, "OPEN"); else if (nv < 60) snprintf(b, sizeof b, "LP %d", nv); else snprintf(b, sizeof b, "HP %d", nv - 64); - app_overlay(a, 0, "MASTER FILTER", b, "", nv * 2, 128, bm_knob_color(0)); - } else if (k == 1) { - int nv = bm_clampi(m->beatfx + lst(a, d), 0, 16); - app_set_meta(a, META_OFF(beatfx), nv); - app_overlay(a, 1, "BEAT FX", BEATFX_N[nv], "", nv * 15, -1, bm_knob_color(1)); - } else if (k == 2) enc_global(a, 3, d); /* DRIVE */ - return; - case FXP_REVERB: - if (k < 3) { /* REVERB: tamaño, amortiguación, mezcla */ - static const uint8_t RO[3] = {META_OFF(rv_size), META_OFF(rv_damp), META_OFF(rv_mix)}; - const uint8_t cur[3] = {m->rv_size, m->rv_damp, m->rv_mix}; - int nv = bm_clampi(cur[k] + d, 0, 127); - app_set_meta(a, RO[k], nv); - fmt_pct(nv, b, sizeof b); - static const char *const NM[3] = {"REVERB SIZE", "REVERB DAMP", "REVERB MIX"}; - app_overlay(a, k, NM[k], b, "", nv * 2, -1, bm_knob_color(k)); - return; - } - break; /* K4: SC REL, como en el delay */ - default: break; - } - if (k == 0) { - int nv = bm_clampi(m->dly_time + lst(a, d), 0, 3); - app_set_meta(a, META_OFF(dly_time), nv); - app_overlay(a, 0, "DELAY TIME", DLY_NAMES[nv], "", nv * 85, -1, bm_knob_color(0)); - } else { - static const uint8_t OFFS[4] = {0, META_OFF(dly_fb), META_OFF(dly_mix), META_OFF(sc_release)}; - const uint8_t cur[4] = {0, m->dly_fb, m->dly_mix, m->sc_release}; - int nv = bm_clampi(cur[k] + d, 0, 127); - app_set_meta(a, OFFS[k], nv); - if (k == 3) fmt_ms(bm_decay_ms(nv / 2), b, sizeof b); else fmt_pct(nv, b, sizeof b); - static const char *const NM[4] = {"", "DELAY FEEDBACK", "DELAY MIX", "SIDECHAIN RELEASE"}; - app_overlay(a, k, NM[k], b, "", nv * 2, -1, bm_knob_color(k)); - } } /* ------------------------------------------------------------ tick de la entrada */ @@ -3906,45 +1668,25 @@ void app_input_tick(bm_app *a) { uint32_t now = a->now; mach_tick(a); - if (a->ask && a->ask_live && now - a->ask_t0 >= UI_LONG_MS) { /* sostenido 2 s: sí */ - if (a->ask_ctl < BTN_COUNT) a->ask_eat |= (uint16_t)(1u << a->ask_ctl); /* lo que siga de ese botón no cuenta */ - ask_yes(a); - } if (a->held_white >= 0 && !a->held_long && now - a->step_t0 >= UI_HOLD_MS) a->held_long = 1; - if (a->rec_free && a->rec_free_t0 == 0xFFFFFFFFu && app_playing(a)) a->rec_free_t0 = a->ctx.st.btick; /* empieza con PLAY */ - if (a->fill && a->layer != L_FILL) { /* el fill suena solo con su pantalla abierta o su tecla sostenida */ - int held = 0; - for (int k = 0; k < BM_KEYS; k++) if (a->keys_down[k] && (a->key_role[k] == ROLE_FILL || a->key_role[k] == ROLE_FILLK)) held = 1; - if (!held) { app_push(a, CMD_FILL, 0, 0, 0); a->fill = 0; } - } for (int k = 0; k < BM_KEYS; k++) { if (!a->keys_down[k] || !a->key_t0[k] || now - a->key_t0[k] < UI_HOLD_MS) continue; switch (a->key_role[k]) { case ROLE_MUTE: /* negra sostenida en la consola: solo */ if (!a->solo_on) { - int t = bm_key_black_index(k); + int t = BM_ORDER[bm_key_black_index(k)]; a->solo_saved = 0; for (int i = 0; i < BM_TRACKS; i++) if (a->pat.trk[i].mute) a->solo_saved |= (uint8_t)(1u << i); for (int i = 0; i < BM_TRACKS; i++) app_set_track(a, i, TRK_OFF(mute), i != t); a->solo_on = 1; a->solo_key = (int8_t)k; a->solo_track = (int8_t)t; - char b[16]; snprintf(b, sizeof b, "SOLO T%d", t + 1); + char b[16]; snprintf(b, sizeof b, "SOLO T%d", app_pos(t) + 1); app_toast(a, b); } break; - case ROLE_CHAN: /* blanca 11-16 sostenida: la tarjeta del canal */ - if (!a->card && !a->layer && console(a) && !a->sloop) { - int t = bm_key_white_index(k) - BM_PATTERNS; - a->card = (uint8_t)(t + 1); - mach_reset(a, t); - a->ov.on = 0; - } - break; - case ROLE_HILO: /* negra 11 sostenida (batería, pads): MUTE de instrumentos */ - if (!a->layer && a->view == V_CH && bm_is_grid(&a->pat, a->track)) { a->layer = L_LANEMUTE; a->layer_latch = 0; a->ov.on = 0; } - break; - case ROLE_SCENE: /* escena 2 s: guardar encima */ - if (now - a->key_t0[k] >= UI_LONG_MS) { - scene_store(a, bm_key_black_index(k) - 6); + case ROLE_SCENE: /* escena 2 s: borrarla (si estaba guardada) */ + if (now - a->key_t0[k] >= SCENE_DEL_MS) { + int s = bm_key_black_index(k) - SCENE_B0; + if (s >= 0 && s < BM_SCENES && (scn(a, a->ctx.st.pattern, s)->flags & SCN_STORED)) scene_clear(a, s); a->key_role[k] = ROLE_SCNDONE; } break; @@ -3954,41 +1696,23 @@ void app_input_tick(bm_app *a) if (a->box_on && (int32_t)(now - a->box_until) >= 0) box_commit(a); } -/* ------------------------------------------------------------ anillos y preguntas (para el dibujo) */ +/* ------------------------------------------------------------ anillos (para el dibujo) */ +/* una escena guardada sostenida: el anillo hacia los 2 s en que se borra */ int bm_app_key_ring(const bm_app *a, char *label, int cap) { for (int k = 0; k < BM_KEYS; k++) { if (!a->keys_down[k] || a->key_role[k] != ROLE_SCENE) continue; + int s = bm_key_black_index(k) - SCENE_B0; + if (s < 0 || s >= BM_SCENES || !(scn(a, a->ctx.st.pattern, s)->flags & SCN_STORED)) continue; uint32_t el = a->now - a->key_t0[k]; if (el < UI_HOLD_MS) continue; - snprintf(label, (size_t)cap, TF("STORE SCENE %c"), 'A' + bm_key_black_index(k) - 6); - uint32_t p = (el - UI_HOLD_MS) * 255u / (UI_LONG_MS - UI_HOLD_MS); + snprintf(label, (size_t)cap, TF("DELETE SCENE %c"), 'A' + s); + uint32_t p = (el - UI_HOLD_MS) * 255u / (SCENE_DEL_MS - UI_HOLD_MS); return (int)(p > 255 ? 255 : p); } return -1; } -int bm_app_ask_progress(const bm_app *a) -{ - if (!a->ask || !a->ask_live) return 0; - uint32_t p = (a->now - a->ask_t0) * 255u / UI_LONG_MS; - return (int)(p > 255 ? 255 : p); -} - -void bm_app_ask_hint(const bm_app *a, char *buf, int cap) -{ - static const char *const BN[BTN_COUNT] = {"OCT-", "OCT+", "FX", "SCL", "ENV", "LFO", "EDIT", "GLO", "HOME", "SAVE", "ARP", "SEQ", "PLAY", "REC"}; - size_t n = (size_t)cap; - if (a->ask_ctl == ASK_ENC) { snprintf(buf, n, "%s", T("2 S = YES ANY CONTROL = NO")); return; } - char c[12]; - if (a->ask_ctl & ASK_KEY) { - int k = a->ask_ctl & 0x7F, w = bm_key_white_index(k); - if (w >= 0) snprintf(c, sizeof c, TF("WHITE %d"), w + 1); else snprintf(c, sizeof c, TF("BLACK %d"), bm_key_black_index(k) + 1); - } else snprintf(c, sizeof c, "%s", a->ask_ctl < BTN_COUNT ? BN[a->ask_ctl] : "?"); - if (a->ask_live) snprintf(buf, n, TF("KEEP HOLDING %s = YES"), c); - else snprintf(buf, n, TF("HOLD %s 2 S = YES"), c); -} - /* ------------------------------------------------------------ LEDs */ static uint8_t led_last[BM_LEDS]; @@ -4003,96 +1727,46 @@ static void led(bm_app *a, int id, uint8_t lvl) if (a->pf.led) a->pf.led(a->pf.user, id, lvl); } -/* El botón de la página del canal: el que la abrió (button_page) mientras sigas en ella; si no, - * el que la abre según la página (y en las de un editor por páginas, la envolvente o el LFO). */ -static int page_button(const bm_app *a) -{ - int t = a->track; - if (a->nav_btn && a->nav_track == t && a->nav_page == a->page && a->nav_sub == a->ed_page[t]) return a->nav_btn - 1; - switch (a->page) { - case PG_SEQ: case PG_LOOP: case PG_BREAK: return BTN_SEQ; - case PG_SOUND: - if (app_kind(a, t) == KIND_NOTE && bm_engine_paged(app_engine(a, t))) { - int e = app_engine(a, t), p = a->ed_page[t]; - if (p == bm_engine_page_of(e, EPG_ENV1) || p == bm_engine_page_of(e, EPG_ENV2)) return BTN_ENV; - if (p == bm_engine_page_of(e, EPG_LFO)) return BTN_LFO; - } - return BTN_EDIT; - case PG_PADS: return a->ed_page[t] == 2 ? BTN_ENV : BTN_EDIT; - case PG_INST: case PG_TAKES: case PG_MIDI: return BTN_EDIT; - case PG_MIX: return BTN_FX; - case PG_SCL: case PG_CHORDS: return BTN_SCL; - case PG_ARP: return BTN_ARP; - case PG_MORE: return BTN_GLO; - default: return -1; - } -} - -/* El botón sostenido de cada capa (respira). MUTE y FILL se abren con una tecla: ninguno. */ +/* El botón sostenido de cada capa (respira) */ static int layer_button(int L) { switch (L) { - case L_HOME: return BTN_HOME; + case L_ACC: return BTN_LFO; + case L_HIT: return BTN_ENV; + case L_INST: return BTN_EDIT; + case L_MUTE: return BTN_SCL; case L_LEN: return BTN_SEQ; - case L_ERASE: return BTN_EDIT; - case L_ACC: return BTN_ENV; - case L_REP: return BTN_LFO; - case L_PUNCH: return BTN_FX; - case L_CHORDS: return BTN_SCL; - case L_ARP: case L_ROLL: return BTN_ARP; - case L_COPY: return BTN_SAVE; - case L_TONE: return BTN_GLO; - default: return -1; /* L_NONE, L_LANEMUTE, L_FILL */ + default: return -1; /* REPEAT se abre con la negra 11 */ } } -/* El botón de "dónde estás" en cada pantalla. En la consola (MIX, su FX y su GLO) es HOME. */ +/* El botón de "dónde estás" en cada pantalla */ static int view_button(const bm_app *a) { - if (console(a)) return BTN_HOME; switch (a->view) { - case V_SYSTEM: return BTN_HOME; - case V_TIME: return BTN_SEQ; + case V_HOME: case V_SYSTEM: return BTN_HOME; + case V_GLO: return BTN_GLO; case V_SAVE: return BTN_SAVE; - case V_CH: return page_button(a); + case V_CH: return BTN_SEQ; default: return -1; } } -/* En la consola, el otro botón que abre la misma página (MID): FX, GLO (y SCL en SCALE, SEQ en SONG). - * En MIX, SEQ y EDIT entran a la máquina del cursor. */ -static int alias_button(const bm_app *a, int i) +/* ¿el botón hace algo en esta pantalla? (los que no, quedan apagados) */ +static bool btn_used(const bm_app *a, int i) { switch (a->view) { - case V_FXG: return i == BTN_FX; - case V_GLO: return i == BTN_GLO || (i == BTN_SCL && a->glo_page == GP_SCALE) || (i == BTN_SEQ && a->glo_page == GP_SONG); - case V_HOME: return i == BTN_SEQ || i == BTN_EDIT; - default: return 0; - } -} - -/* Páginas de pasos del canal (B9 / B10 en SEQ y en ACENTO, REPETIR, BORRAR y FILL). */ -static int step_pages(const bm_app *a) -{ - int t = a->track, len = bm_trk_len(&a->pat, t, app_kind(a, t) == KIND_NOTE ? -1 : tr_lane(a)); - int pages = (len + 15) / 16; - return pages > 0 ? pages : 1; -} - -/* HOME + EDIT: hay otro canal del mismo tipo para copiar (home_combo) */ -static bool copy_target(const bm_app *a) -{ - if (bm_is_pads(a->track)) return false; - int k = app_kind(a, a->track); - for (int i = 1; i < BM_TRACKS; i++) { - int d = (a->track + i) % BM_TRACKS; - if (d != 1 && app_kind(a, d) == k) return true; + case V_HOME: return i == BTN_HOME || i == BTN_GLO || i == BTN_SAVE || i == BTN_REC || + ((i == BTN_SEQ || layer_of(a, i)) && bm_is_grid(&a->pat, a->track)) || + (i != BTN_GLO && mach_page_of(a->pat.trk[a->track].engine, i) >= 0); /* la máquina: sus páginas */ + case V_GLO: return i == BTN_HOME || i == BTN_GLO || i == BTN_SAVE; + case V_CH: return i == BTN_HOME || i == BTN_SAVE || i == BTN_SEQ || layer_of(a, i) || (bm_is_pads(a->track) && slicer_page_of(i) >= 0); + default: return i == BTN_HOME || i == BTN_SAVE; } - return false; } -/* Hay algo sin guardar (el patrón, la canción, una toma o su ganancia). Los ajustes no: SAVE no - * los escribe, se guardan solos. */ +/* Hay algo sin guardar (el patrón, las escenas o una toma). Los ajustes no: SAVE no los escribe, se + * guardan solos. */ static bool unsaved(const bm_app *a) { return a->dirty || a->song_dirty || a->pend_obj >= 0 || a->take_dirty || a->ctx.st.smp_unsaved; @@ -4104,7 +1778,7 @@ static bool writing(const bm_app *a) return a->job_fading; } -/* Un patrón o una escena en cola (no las cadenas, que siempre tienen el siguiente en cola). */ +/* Un patrón o una escena en cola */ static bool queued(const bm_app *a) { const bm_status *st = &a->ctx.st; @@ -4120,58 +1794,30 @@ static uint8_t play_led(const bm_app *a) static uint8_t rec_led(const bm_app *a) { - const bm_status *st = &a->ctx.st; - int t = a->track, lm = LOOP_OFF; - if (t >= BM_TR_TRACKS && t < BM_TRACKS && app_kind(a, t) == KIND_NOTE) lm = st->loop_mode[t - BM_TR_TRACKS]; - bool smp = a->view != V_CH || t == 1; /* la grabadora: no dentro de otra máquina */ - if ((smp && st->smp_rec) || a->rec_hold || lm == LOOP_REC) return LED_BLINK; /* grabando */ - if ((smp && st->smp_armed) || lm == LOOP_ARMED) return LED_BREATH; /* armado */ - if (a->rec || lm == LOOP_DUB) return LED_ON; /* REC de notas, SLOOP, sobregrabación */ - return LED_DIM; -} - -/* 0.9: OCT -/+ siempre cambian la octava donde las teclas tocan notas: dentro de una máquina de notas - * (también en SEQ), en SLOOP y en la consola (la octava de SLOOP). En la batería y los pads, nada. */ -static bool oct_ok(const bm_app *a) -{ - if (a->view == V_BOOT || a->view == V_COPYCH) return false; - if (a->layer == L_CHORDS || (a->view == V_CH && a->page == PG_CHORDS)) return true; - return app_kind(a, a->track) == KIND_NOTE; + if (a->view != V_HOME) return LED_OFF; + return a->rec ? LED_ON : LED_DIM; /* sobregrabando / disponible */ } static uint8_t oct_led(const bm_app *a, int up) { if (!oct_ok(a)) return LED_OFF; - return (up ? a->oct > 0 : a->oct < 0) ? LED_ON : LED_DIM; /* octava corrida */ + if (a->view == V_CH) return (up ? tr_lane(a) >= 8 : tr_lane(a) < 8) ? LED_ON : LED_DIM; /* la página de sonidos */ + if (drums_track(a, a->track)) return bm_gesture_is_down(&a->ges, up ? BTN_OCT_UP : BTN_OCT_DN) ? LED_ON : LED_DIM; + return (up ? a->oct > 0 : a->oct < 0) ? LED_ON : LED_DIM; /* octava corrida */ } /* La luz de un botón. Blancas: dicen el estado, nunca la función (eso lo dice la pantalla). * OFF no hace nada aquí · DIM disponible · MID significado especial ahora · ON dónde estás o un - * estado que queda · BLINK te necesita ya · BREATH armado o pendiente. - * Precedencia: pregunta > HOME sostenido > capa sostenida > pantalla. */ + * estado que queda · BLINK te necesita ya · BREATH armado o pendiente. */ static uint8_t btn_led(const bm_app *a, int i) { - if (a->ask) return i == a->ask_ctl ? LED_BLINK : LED_OFF; /* el que preguntó: sostenerlo = sí */ - if (a->view == V_COPYCH) return i == BTN_EDIT ? LED_BLINK : i == BTN_HOME ? LED_ON : LED_OFF; /* EDIT 2 s pega, HOME no */ - if (a->layer == L_HOME) { /* HOME sostenido: los que tienen HOME + */ - switch (i) { - case BTN_HOME: return LED_ON; - case BTN_OCT_DN: return a->undo_track >= 0 ? LED_MID : LED_OFF; - case BTN_OCT_UP: return a->redo_track >= 0 ? LED_MID : LED_OFF; - case BTN_EDIT: return copy_target(a) ? LED_MID : LED_OFF; - case BTN_REC: return a->song_rec ? LED_ON : LED_MID; - case BTN_SEQ: case BTN_FX: case BTN_SCL: case BTN_GLO: case BTN_SAVE: case BTN_PLAY: return LED_MID; - default: return LED_OFF; - } - } - if (a->layer) { /* capa sostenida, o MUTE / FILL abiertas */ - int L = a->layer; - if (i == layer_button(L)) return LED_BREATH; + if (a->view == V_MACH && i != BTN_PLAY && i != BTN_SAVE) return mach_btn_led(a, i); + if (a->layer) { /* capa sostenida, o REPETIR abierta */ + if (i == layer_button(a->layer)) return LED_BREATH; switch (i) { case BTN_OCT_DN: case BTN_OCT_UP: return oct_led(a, i == BTN_OCT_UP); - case BTN_PLAY: return L == L_TONE ? LED_MID : play_led(a); /* TONE: tap tempo */ - case BTN_REC: { uint8_t r = rec_led(a); return r == LED_DIM ? LED_OFF : r; } - case BTN_HOME: return a->layer_latch ? LED_MID : LED_OFF; /* FILL, ROLL, LFO: salir */ + case BTN_PLAY: return play_led(a); + case BTN_HOME: return a->layer_latch ? LED_MID : LED_OFF; default: return LED_OFF; } } @@ -4179,189 +1825,60 @@ static uint8_t btn_led(const bm_app *a, int i) case BTN_PLAY: return play_led(a); case BTN_REC: return rec_led(a); case BTN_OCT_DN: case BTN_OCT_UP: return oct_led(a, i == BTN_OCT_UP); - case BTN_HOME: /* dentro de un canal: salir a la consola */ + case BTN_HOME: if (queued(a) && !console(a)) return LED_BLINK; /* patrón o escena en cola */ + if (a->sloop) return LED_MID; /* PLAY/REC: HOME es la salida */ break; case BTN_SAVE: - if (a->view == V_SAVE && a->clear_armed && a->now - a->clear_t < 3000) return LED_BLINK; /* SAVE otra vez = borrar */ - if (writing(a)) return LED_ON; - if (a->view != V_SAVE && a->view != V_CH && unsaved(a)) return LED_BREATH; /* global: no dentro de la máquina */ - break; - case BTN_SEQ: - if (a->song_rec && a->view != V_CH) return LED_BLINK; /* SONG REC (de la consola) */ + if (writing(a)) return app_playing(a) ? LED_BLINK : LED_ON; /* sonando: se escribe al parar */ + if (a->view != V_SAVE && a->view != V_CH && unsaved(a)) return LED_BREATH; /* global: no dentro del secuenciador */ break; default: break; } if (i == view_button(a)) return LED_ON; - if (alias_button(a, i)) return LED_MID; - return LED_DIM; + return btn_used(a, i) ? LED_DIM : LED_OFF; } /* Qué hace cada tecla ahora y cómo está su luz. Las luces del FM-1 son blancas: solo dicen el estado * (la gramática está arriba, en el mapa del teclado), así que la pantalla muestra estos mismos nombres - * (tira de teclas) y la luz y el dibujo salen siempre de aquí. Dentro de un canal las teclas son la - * superficie de esa máquina; en la consola, las de la consola (o, en SLOOP, las de la máquina). */ -static void KL(bm_keyfn *K, int k, const char *l) { snprintf(K[k].label, sizeof K[k].label, "%s", l); } - -/* las notas que el canal t acaba de tocar desde sus pasos (para que destellen sus teclas) */ -static int live_notes(const bm_app *a, int t, uint8_t out[4]) -{ - if (!(a->now < a->trig_until[t])) return 0; - int s = bm_app_track_step(a, t, -1), idx[4]; - if (s < 0) return 0; - int n = syn_step_events(a, t, s, idx); - for (int i = 0; i < n; i++) out[i] = bm_evc(&a->pat, t, s, idx[i])->note; - return n; -} - -static uint8_t note_in(int note, const uint8_t *nn, int n) -{ - for (int i = 0; i < n; i++) if (nn[i] == note) return 1; - return 0; -} - -/* El teclado de un canal de notas fuera de SEQ: cromático (la escala DIM, la tónica MID, fuera de la - * escala OFF) o, con KEYS IN SCALE o en SCALE, la escala en las blancas y los acordes en las negras. */ -static void note_keys(const bm_app *a, bm_keyfn *K, int t) -{ - int root, sc = app_scale(a, t, &root), sl = bm_scale_len(sc); - uint8_t nn[4]; - int nl = live_notes(a, t, nn); - uint16_t col = bm_track_color(t); - if (a->pat.meta.scale_lock || (a->view == V_CH && a->page == PG_SCL)) { - static const char *const R[7] = {"I", "II", "III", "IV", "V", "VI", "VII"}; - static const char *const X[4] = {"+7", "+9", "S2", "S4"}; - for (int w = 0; w < 16; w++) { - int note = bm_scale_note(root, sc, w, base_oct(a, t)); - KW(K, w, bm_note_names[note % 12], (w % sl) == 0 ? LED_MID : LED_DIM, col)->live = note_in(note, nn, nl); - } - for (int b = 0; b < 7; b++) KB(K, b, R[b], LED_DIM, col); - for (int b = 7; b < 11; b++) KB(K, b, X[b - 7], (a->chord_mod >> (b - 7)) & 1 ? LED_ON : LED_DIM, C_YELLOW); - return; - } - uint16_t pcs = 0; - for (int d = 0; d < sl; d++) pcs |= (uint16_t)(1u << (bm_scale_note(root, sc, d, 0) % 12)); - for (int k = 0; k < BM_KEYS; k++) { - int note = BM_KEY_BASE_NOTE + k + 12 * a->oct - (bass_machine(a, t) ? 12 : 0), pc = (note + 120) % 12; - KL(K, k, bm_note_names[pc]); - K[k].led = pc == root ? LED_MID : ((pcs >> pc) & 1) ? LED_DIM : LED_OFF; - K[k].color = col; - K[k].live = note_in(note, nn, nl); - } -} - -/* Las blancas de un canal de batería fuera de SEQ: los 16 instrumentos, como un selector */ -static void lane_whites(const bm_app *a, bm_keyfn *K, int t) -{ - const bm_tr *tr = bm_trk_trc(&a->pat, t); - for (int w = 0; w < 16; w++) - KW(K, w, lane_short(a, t, w), lane_led(tr, w, tr_lane(a)), bm_track_color(t))->live = (uint8_t)(lane_has(tr, w) && lane_live(a, t, w)); -} - + * (tira de teclas) y la luz y el dibujo salen siempre de aquí. */ static void keys_fill(const bm_app *a, bm_keyfn K[BM_KEYS]) { - const bm_status *st = &a->ctx.st; - int t = a->track, kind = app_kind(a, t); + int t = a->track; char title[24], b8[8]; uint16_t col; const char *h1, *h2; - if (a->layer || (a->view == V_CH && a->page == PG_CHORDS)) { bm_app_keymap(a, K, title, sizeof title, &col, &h1, &h2); return; } + if (a->layer) { bm_app_keymap(a, K, title, sizeof title, &col, &h1, &h2); return; } memset(K, 0, sizeof(bm_keyfn) * BM_KEYS); - if (console(a)) { /* la consola */ - if (a->sloop && a->view != V_GLO) map_sloop(a, K); - else if (a->view == V_GLO && a->glo_page == GP_SONG) map_song(a, K); - else map_console(a, K); - return; - } - if (a->view != V_CH) { /* las demás pantallas tocan el canal */ - if (kind == KIND_NOTE) note_keys(a, K, t); else lane_whites(a, K, t); + switch (a->view) { + case V_HOME: + if (a->sloop) map_sloop(a, K); else map_console(a, K); return; - } - switch (a->page) { - case PG_SEQ: + case V_GLO: map_console(a, K); return; + case V_MACH: mach_keys(a, K); return; + case V_CH: { + const bm_tr *tr = bm_trk_trc(&a->pat, t); + int lane = tr_lane(a); for (int w = 0; w < 16; w++) { int s = a->step_page * 16 + w; uint8_t l = LED_OFF; snprintf(b8, sizeof b8, "%d", s + 1); - if (kind == KIND_NOTE) { - int idx[4]; - if (s < a->pat.trk[t].length) { - l = syn_step_events(a, t, s, idx) ? LED_ON : note_covers(a, t, s) ? LED_MID : LED_OFF; - if (s == bm_app_track_step(a, t, -1)) l = LED_BLINK; - } - } else { - const bm_tr *tr = bm_trk_trc(&a->pat, t); - int lane = tr_lane(a); - if (s < tr->lane[lane].len) { - uint8_t bb = tr->st[lane][s]; - l = (bb & ST_ON) ? ((bb & ST_LOCK) ? LED_BREATH : LED_ON) : LED_OFF; - if (s == bm_app_track_step(a, t, lane)) l = LED_BLINK; - } + if (s < tr->lane[lane].len) { + uint8_t bb = tr->st[lane][s]; + l = (bb & ST_ON) ? ((bb & ST_LOCK) ? LED_BREATH : LED_ON) : w % 4 == 0 ? LED_DIM : LED_OFF; /* tiempos 1-4: tenues */ + if (s == bm_app_track_step(a, t, lane)) l = LED_BLINK; } KW(K, w, b8, l, 0); } - if (kind != KIND_NOTE) { tr_blacks(a, K, t, true); return; } - { - int root, sc = app_scale(a, t, &root), idx[4], n = 0; - if (a->held_step >= 0) n = syn_step_events(a, t, a->held_step, idx); - for (int b = 0; b < 8; b++) { /* grados: ON los que tiene el paso sostenido */ - int note = bm_scale_note(root, sc, b, base_oct(a, t)); - uint8_t l = LED_DIM; - for (int i = 0; i < n; i++) if (bm_evc(&a->pat, t, a->held_step, idx[i])->note == note) l = LED_ON; - KB(K, b, bm_note_names[note % 12], l, bm_track_color(t)); - } - page_blacks(a, K); - KB(K, 10, "FIL", a->fill ? LED_ON : LED_DIM, C_ORANGE); - } - return; - case PG_PADS: - for (int w = 0; w < 16; w++) { - snprintf(b8, sizeof b8, "%d", w + 1); - KW(K, w, b8, w == (a->sel_lane[1] & 15) ? LED_ON : (bm_pad_ok(&a->pat.pad[w]) ? LED_MID : LED_OFF), bm_track_color(1))->live = - (uint8_t)(a->now < a->lane_flash[1][w]); - } - { - static const char *const CB[4] = {"CPY", "PST", "CLR", "HIT"}; - static const char *const FX[3] = {"REV", "HLF", "STU"}; - for (int b = 0; b < 4; b++) KB(K, b, CB[b], LED_DIM, C_WHITE); - for (int b = 8; b < 11; b++) KB(K, b, FX[b - 8], (a->brk_live >> (b - 8)) & 1 ? LED_ON : LED_DIM, C_YELLOW); - } - return; - case PG_TAKES: { /* sin toma marcada no hacen nada */ - uint8_t src = bm_app_takes_sel(a); - uint8_t l = src < BM_TAKES && a->take[src].valid ? LED_DIM : LED_OFF; - static const char *const TB[4] = {"HIT", "16", "8", "PAD"}; - for (int w = 0; w < 16; w++) { snprintf(b8, sizeof b8, "%d", w + 1); KW(K, w, b8, l, C_WHITE); } - for (int b = 0; b < 4; b++) KB(K, b, TB[b], l, C_WHITE); - KB(K, 10, "DEL", l, C_RED); + nav_blacks(a, K); + KB(K, 10, "RPT", LED_DIM, C_YELLOW); return; } - case PG_REC: /* después de grabar: escuchar la toma */ - if (st->smp_unsaved && !st->smp_rec) - for (int w = 0; w < 16; w++) { snprintf(b8, sizeof b8, "%d", w + 1); KW(K, w, b8, LED_DIM, C_RED); } - return; - default: - if (kind == KIND_NOTE) note_keys(a, K, t); - else { lane_whites(a, K, t); tr_blacks(a, K, t, false); } - return; + default: return; /* SYSTEM y SAVE: el teclado no hace nada */ } } void bm_app_keys(const bm_app *a, bm_keyfn K[BM_KEYS]) { keys_fill(a, K); - if (a->ask && (a->ask_ctl & ASK_KEY) && a->ask_ctl != ASK_ENC) { /* la tecla que preguntó: sostenerla = sí */ - int k = (a->ask_ctl & 0x7F) % BM_KEYS; - K[k].led = LED_BLINK; K[k].live = 0; - if (!K[k].label[0]) KL(K, k, "YES"); - } - if (!a->box_on) return; - /* el recuadro de ALGORITHM en INSTR: parpadea la tecla del instrumento al que vas */ - int k = -1, t = a->track; - if (a->box_mode == BOX_LANE && !a->layer && a->view == V_CH && app_kind(a, t) == KIND_TR) { - int ln = a->box_lane & 15; - if (a->page == PG_SEQ) { if (ln / 8 == tr_lane(a) / 8) k = bm_black_key(ln % 8); } - else if (a->page != PG_PADS && a->page != PG_TAKES && a->page != PG_REC) k = bm_white_key(ln); - } - if (k >= 0 && K[k].label[0]) { K[k].led = LED_BLINK; K[k].live = 0; } } void app_leds(bm_app *a) @@ -4375,7 +1892,6 @@ void app_leds(bm_app *a) for (int i = 0; i < BTN_COUNT; i++) led(a, i, btn_led(a, i)); bm_keyfn K[BM_KEYS]; bm_app_keys(a, K); - int ak = a->ask && (a->ask_ctl & ASK_KEY) && a->ask_ctl != ASK_ENC ? (a->ask_ctl & 0x7F) % BM_KEYS : -1; for (int k = 0; k < BM_KEYS; k++) /* sostenida (si hace algo) o un golpe que suena: ON */ - led(a, BM_LED_KEY0 + k, k == ak ? LED_BLINK : (a->keys_down[k] && K[k].label[0]) || K[k].live ? LED_ON : K[k].led); + led(a, BM_LED_KEY0 + k, (a->keys_down[k] && K[k].label[0]) || K[k].live ? LED_ON : K[k].led); } diff --git a/core/bm_mach.c b/core/bm_mach.c new file mode 100644 index 0000000..87f0dd3 --- /dev/null +++ b/core/bm_mach.c @@ -0,0 +1,436 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later + * Copyright (C) 2026 Erbubar23 */ +/* Bubba Machine — la máquina de un canal de notas por dentro (V_MACH), 2026-10-22. + * + * Se entra desde HOME con el cursor en el canal y un botón de menú: cada máquina dice qué botones + * tiene (mach_page_of) y a qué página llevan. Adentro la máquina toma el FM-1 entero; HOME sale. + * Todas tienen su piano roll (SEQ) con REC tipo SLOOP y sus menús, como el aparato de verdad: la BX-7 + * (core/bm_bx7.c), el BB-303 (core/bm_b303.c) y las de panel, B-MINI, BUNO-6 y BITTAL (core/bm_panel.c). */ +#include +#include +#include +#include +#include "bm_mach.h" +#include "bm_util.h" +#include "bm_params.h" +#include "bm_fm.h" +#include "bm_lang.h" + +static const char *const ARPM[ARP_MODES] = {"OFF", "UP", "DOWN", "INCL", "EXCL", "RANDOM", "ORDER", "REPEAT"}; +static const char *const ARPR[3] = {"1/8", "1/16", "1/32"}; + +const bxp MACH_SEQ[4] = { + NONE, {"SPEED", K_TRK, TRK(speed), 0, SPD_COUNT - 1, F_LIST, bm_speed_names}, + {"PAGE", K_VIEWX, 0, 0, 3, F_P1, NULL}, {"SCROLL", K_VIEWY, 0, 16, 112, F_BIP, NULL}}; /* K3/K4: recorrer el piano roll */ +/* el GLO de cada máquina: lo primero, el largo; después cambiar de máquina (solo las que se pueden) */ +const bxp MACH_GLO[2][4] = { + {{"LENGTH", K_LEN, 0, 1, BM_STEPS, F_STEPS, NULL}, {"MACHINE", K_MACH, 0, 0, ENG_COUNT - 1, F_LIST, bm_engine_names}, + {"MIDI CH", K_TRK, TRK(midi_ch), 0, 15, F_CH, NULL}, {"MIDI OUT", K_TRK, TRK(midi_out), 0, 1, F_ONOFF, NULL}}, + {NONE, NONE, MACH_QUANT, {"RESET", K_RST, 0, 0, 1, F_INT, NULL}}}; +const char *const MACH_QUANTS[4] = {"25%", "50%", "75%", "100%"}; +const bxp MACH_ARP[2][4] = { + {{"MODE", K_TRK, TRK(arp_mode), 0, ARP_MODES - 1, F_LIST, ARPM}, {"OCTAVE", K_TRK, TRK(arp_oct), 1, 4, F_INT, NULL}, + {"RATE", K_TRK, TRK(arp_rate), 0, 2, F_LIST, ARPR}, {"GATE", K_TRK, TRK(arp_gate), 20, 100, F_RAWPCT, NULL}}, /* FM-1: 20-100 % */ + {{"LATCH", K_LATCH, 0, 0, 1, F_ONOFF, NULL}, NONE, NONE, NONE}}; + +static int op_byte(const bm_app *a, int field) { return (5 - a->bx.edit % 6) * BM_FM_OP + field; } /* OPn está en el dato 6-n */ +static int eng_of(const bm_app *a) { return a->pat.trk[a->track].engine; } +static int latch_prm(const bm_app *a) { return eng_of(a) == ENG_FM ? BX_LATCH : bm_panel_eng(eng_of(a)) ? PX_LATCH : AC_LATCH; } + +static int fx_on(const bm_app *a, int slot) +{ + const uint8_t *p = a->pat.prm[a->track]; + return eng_of(a) == ENG_ACID ? bm_acid_fx_on(p, slot) : bm_px_eng(eng_of(a)) ? bm_px_fx_on(p, eng_of(a), slot) : (p[BX_FXON] >> slot) & 1; +} + +int mach_get(const bm_app *a, const bxp *p) +{ + const bm_track *tr = &a->pat.trk[a->track]; + switch (p->kind) { + case K_FMV: return a->pat.fmv[p->idx]; + case K_OP: return a->pat.fmv[op_byte(a, p->idx)]; + case K_TRK: return ((const uint8_t *)tr)[p->idx]; + case K_MAC: return tr->macro[p->idx & 3]; + case K_PRM: return a->pat.prm[a->track][p->idx]; + case K_LEN: return bm_clampi(tr->length ? tr->length : 16, 1, BM_STEPS); + case K_ON: return fx_on(a, p->idx); + case K_LATCH: return a->pat.prm[a->track][latch_prm(a)] != 0; + case K_MACH: return app_mach_shown(a); + case K_VIEWX: return mach_view_page(a); + case K_VIEWY: return 64 + a->bx.vy; + case K_QUANT: return 3 - (tr->qfree & 3); + case K_PRMI: return p->max - a->pat.prm[a->track][p->idx]; + case K_R3: { int r = a->pat.prm[a->track][p->idx]; return r >= MN_R_LO ? 0 : r + 1; } + default: return 0; + } +} + +void mach_fmt(const bxp *p, int v, char *b, int cap) +{ + static const char *const NN[12] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"}; + switch (p->fmt) { + case F_P1: snprintf(b, (size_t)cap, "%d", v + 1); break; + case F_LIST: snprintf(b, (size_t)cap, "%s", p->list && v >= 0 && v <= p->max ? p->list[v] : "?"); break; + case F_ONOFF: snprintf(b, (size_t)cap, "%s", v ? "ON" : "OFF"); break; + case F_BIP: snprintf(b, (size_t)cap, v > 64 ? "+%d" : "%d", v - 64); break; /* el snprintf del SDK no tiene %+d */ + case F_PCT: snprintf(b, (size_t)cap, "%d%%", (v * 100 + 63) / 127); break; + case F_RAWPCT: snprintf(b, (size_t)cap, "%d%%", v); break; + case F_TRSP: snprintf(b, (size_t)cap, v > 24 ? "+%d" : "%d", v - 24); break; + case F_DT: snprintf(b, (size_t)cap, v > 7 ? "+%d" : "%d", v - 7); break; + case F_HZ: { unsigned hz = (unsigned)(100.0f * powf(200.0f, (float)v / 127.0f)); if (hz < 1000) snprintf(b, (size_t)cap, "%u HZ", hz); else snprintf(b, (size_t)cap, "%u.%uK", hz / 1000, hz % 1000 / 100); break; } + case F_NOTE: { int n = v + 21; snprintf(b, (size_t)cap, n / 12 - 2 < 0 ? "%s-%d" : "%s%d", NN[n % 12], n / 12 - 2 < 0 ? 2 - n / 12 : n / 12 - 2); break; } /* DX7: 0 = A-1, 39 = C3 */ + case F_BARS: snprintf(b, (size_t)cap, v > 1 ? "%d BARS" : "%d BAR", v); break; + case F_STEPS: snprintf(b, (size_t)cap, v > 1 ? "%d STEPS" : "%d STEP", v); break; + case F_CH: snprintf(b, (size_t)cap, "%d", v + 1); break; + case F_MIX: /* B-MINI: a la izquierda el OSC 3, a la derecha el LFO */ + if (v <= 0) snprintf(b, (size_t)cap, "%s", "OSC 3"); + else if (v >= 127) snprintf(b, (size_t)cap, "%s", "LFO"); + else { int l = (v * 100 + 63) / 127; snprintf(b, (size_t)cap, "%d/%d", 100 - l, l); } + break; + case F_OHZ: case F_DMS: case F_GLIDE: case F_PHZ: case F_TIME: case F_RATE: case F_SEMI: case F_CENT: { /* como en el editor */ + static const uint8_t PF[] = {PF_OHZ, PF_DMS, PF_GLIDE, PF_HZ, PF_TIME, PF_RATE, 0, PF_SEMI, PF_CENT}; + bm_pdef d = {p->name, 0, 0, p->max, PF[p->fmt - F_OHZ], NULL}; + bm_prm_fmt(&d, v, b, cap); + break; + } + default: snprintf(b, (size_t)cap, "%d", v); break; + } +} + +int mach_pct(const bxp *p, int v) { return p->max > p->lo ? (v - p->lo) * 255 / (p->max - p->lo) : 0; } + +int mach_turn(bm_app *a, const bxp *p, int d) +{ + int t = a->track; + if (p->kind == K_NONE) return -1; + if (p->kind == K_MACH) { app_mach_pick(a, d); return -1; } /* la cuenta y el aviso: bm_input.c */ + if (p->kind == K_VIEWX) { /* la página de 16 pasos que se ve */ + int np = (mach_len(a) + 15) / 16, v = bm_clampi(mach_view_page(a) + app_lst(a, d), 0, np - 1); + a->bx.vman = 1; a->bx.vpage = (uint8_t)v; + return v; + } + if (p->kind == K_VIEWY) { /* las alturas que se ven, de a semitono */ + a->bx.vy = (int8_t)bm_clampi(a->bx.vy + app_lst(a, d), -48, 48); + return 64 + a->bx.vy; + } + if (p->kind == K_RST) { /* el sonido vuelve al del preset */ + app_push(a, CMD_PRESET, (uint8_t)t, a->pat.trk[t].source, 0); + app_edited(a); + app_toast(a, eng_of(a) == ENG_FM ? "VOICE RESET" : "SOUND RESET"); + return -1; + } + int cur_v = mach_get(a, p), step = p->max - p->lo <= 16 ? app_lst(a, d) : d; + if (p->kind == K_ON || p->kind == K_LATCH) step = d > 0 ? 1 : -1; + int v = bm_clampi(cur_v + step, p->lo, p->max); + if (v == cur_v) return -1; + switch (p->kind) { + case K_FMV: app_push(a, CMD_FMV, p->idx, (uint8_t)v, 0); app_edited(a); break; + case K_OP: app_push(a, CMD_FMV, (uint8_t)op_byte(a, p->idx), (uint8_t)v, 0); app_edited(a); break; + case K_TRK: + app_set_track(a, t, p->idx, v); + if (p->idx == TRK(arp_mode) && !v) app_push(a, CMD_ARP, (uint8_t)t, 0, 0); /* sin arpegiador: suelta lo que tenía */ + break; + case K_MAC: app_set_track(a, t, (uint8_t)(offsetof(bm_track, macro) + (p->idx & 3)), v); break; + case K_PRM: app_push(a, CMD_SET_PRM, (uint8_t)t, p->idx, (uint8_t)v); app_edited(a); break; + case K_LATCH: app_push(a, CMD_SET_PRM, (uint8_t)t, (uint8_t)latch_prm(a), (uint8_t)v); app_edited(a); break; + case K_LEN: app_set_track(a, t, TRK(length), v); break; + case K_QUANT: app_set_track(a, t, TRK(qfree), 3 - v); break; + case K_PRMI: app_push(a, CMD_SET_PRM, (uint8_t)t, p->idx, (uint8_t)(p->max - v)); app_edited(a); break; + case K_R3: app_push(a, CMD_SET_PRM, (uint8_t)t, p->idx, (uint8_t)(v ? v - 1 : MN_R_LO)); app_edited(a); break; + case K_ON: { + uint8_t m; + if (eng_of(a) == ENG_ACID) { + m = bm_acid_fx_set(a->pat.prm[t][AC_FX], p->idx, v); + app_push(a, CMD_SET_PRM, (uint8_t)t, AC_FX, m); + } else if (bm_px_eng(eng_of(a))) { /* bit 0 DISTORTION prendida, bit 1 REVERB apagada */ + uint8_t bit = p->idx == PXF_DIST ? 1u : 2u; + m = a->pat.prm[t][PX_FX]; + m = (uint8_t)((p->idx == PXF_DIST) == !!v ? m | bit : m & ~bit); + app_push(a, CMD_SET_PRM, (uint8_t)t, PX_FX, m); + } else { + m = a->pat.prm[t][BX_FXON]; + m = (uint8_t)(v ? m | (1u << p->idx) : m & ~(1u << p->idx)); + app_push(a, CMD_SET_PRM, (uint8_t)t, BX_FXON, m); + } + app_edited(a); + break; + } + default: break; + } + return v; +} + +void mach_legend(const bm_app *a, const bxp *P, bm_legend L[4]) +{ + char b[12]; + for (int k = 0; k < 4; k++) { + if (P[k].kind == K_NONE) continue; + int v = mach_get(a, &P[k]); + if (P[k].kind == K_RST) snprintf(b, sizeof b, "%s", "TURN"); + else mach_fmt(&P[k], v, b, sizeof b); + app_layer_legend(a, L, k, P[k].name, b, mach_pct(&P[k], v)); + } +} + +bool mach_oct(bm_app *a, int id, bm_gkind k) +{ + char b[30]; + if (id != BTN_OCT_DN && id != BTN_OCT_UP) return false; + int other = id == BTN_OCT_UP ? BTN_OCT_DN : BTN_OCT_UP; + if (k == G_PRESS) { + a->oct_used = 0; + if (bm_gesture_is_down(&a->ges, other)) { /* los dos: todo a cero, como el FM-1 */ + a->oct = 0; + a->oct_used = 1; + app_set_track(a, a->track, TRK(transpose), 24); + app_toast(a, "OCTAVE 0 TRANSPOSE 0"); + } + return true; + } + if (k != G_UP || a->oct_used) return true; /* al soltar; sostenido con ALGORITHM era transposición */ + a->oct_used = 1; + a->oct = (int8_t)bm_clampi(a->oct + (id == BTN_OCT_UP ? 1 : -1), -3, 3); + snprintf(b, sizeof b, a->oct > 0 ? TF("OCTAVE +%d") : TF("OCTAVE %d"), a->oct); + app_toast(a, b); + return true; +} + +void mach_rec(bm_app *a, bm_gkind k) +{ + int t = a->track; + char b[30]; + if (k == G_LONG) { /* 2 s: borra las notas del canal */ + if (a->rec) app_rec_set(a, 0); + a->bx.armed = 0; + app_push(a, CMD_TRACK_CLEAR, (uint8_t)t, 0, 0); + app_edited(a); + snprintf(b, sizeof b, TF("T%d CLEARED"), app_pos(t) + 1); + app_toast(a, b); + return; + } + if (k != G_TAP) return; + if (a->rec) { app_rec_set(a, 0); a->bx.armed = 0; return; } + if (a->bx.armed) { a->bx.armed = 0; app_toast(a, "REC OFF"); return; } + if (a->ctx.st.playing) app_rec_set(a, 1); + else if (a->bx.page == BXP_SEQ) { /* parado en el SEQ: paso a paso, desde el paso del cursor */ + a->bx.chord = 0; + if (a->bx.step >= mach_len(a)) a->bx.step = 0; + app_step_rec(a); + } else { a->bx.armed = 1; app_toast(a, "REC ARMED: PLAY A NOTE"); } +} + +int mach_len(const bm_app *a) +{ + int L = a->pat.trk[a->track].length; + return L > 0 && L <= BM_STEPS ? L : 16; +} + +/* la página de 16 pasos que muestra el piano roll: la que se eligió con K3, si no la del cabezal + * (sonando) o la del cursor (parado) */ +int mach_view_page(const bm_app *a) +{ + int L = mach_len(a), np = (L + 15) / 16; + if (a->bx.vman) return a->bx.vpage < np ? a->bx.vpage : np - 1; + int s = a->ctx.st.playing ? bm_app_track_step(a, a->track, -1) : a->bx.step; + if (s < 0) s = 0; + return (s % L) / 16; +} + +bool mach_step_mode(const bm_app *a) { return a->rec && !a->ctx.st.playing && a->view == V_MACH && a->bx.page == BXP_SEQ; } + +/* Paso a paso: la primera tecla reescribe el paso del cursor (lo de antes se borra), las que se suman + * mientras está apretada hacen un acorde; al soltarlas todas, el cursor pasa al siguiente. Cada nota, + * un paso de largo (los largos se graban sonando). */ +static void step_write(bm_app *a, uint8_t note, int vel) +{ + bm_bx7ui *u = &a->bx; + int t = a->track, s = u->step % mach_len(a); + bm_event ev; + if (!u->chord) { + bm_event_clear(&ev); + for (int e = 0; e < BM_EVENTS; e++) app_push_ev(a, t, s, e, &ev); + u->chord = 1; u->nslot = 0; + } + if (u->nslot >= BM_EVENTS) return; + bm_event_clear(&ev); + ev.note = note; ev.len = 1; + ev.vel = (uint8_t)bm_clampi(vel, 1, BM_VEL_ACC - 1); /* el ACCENT del BB-303 se pone con SCL */ + app_push_ev(a, t, s, u->nslot++, &ev); + a->rec_steps |= 1ull << s; + app_edited(a); +} + +void mach_key_up(bm_app *a, int k) +{ + bm_bx7ui *u = &a->bx; + if (!u->chord) return; + for (int k2 = 0; k2 < BM_KEYS; k2++) if (k2 != k && a->keys_down[k2]) return; /* el acorde sigue apretado */ + u->chord = 0; + u->step = (uint8_t)((u->step + 1) % mach_len(a)); +} + +void mach_cursor(bm_app *a, int d) +{ + int L = mach_len(a); + a->bx.chord = 0; a->bx.vman = 0; /* el roll vuelve a seguir al cursor */ + a->bx.step = (uint8_t)(((a->bx.step % L) + d % L + L) % L); +} + +int mach_play(bm_app *a, int k, int vel) +{ + int t = a->track; + uint8_t n = (uint8_t)bm_clampi(BM_KEY_BASE_NOTE + k + 12 * a->oct, 0, 127); + if (mach_step_mode(a)) { /* REC parado en el SEQ: escribe en el paso del cursor */ + app_play_notes(a, k, t, &n, 1, vel); + step_write(a, n, vel); + return 1; + } + if (a->bx.armed && !a->ctx.st.playing) { /* armado: la primera nota arranca y graba */ + a->bx.armed = 0; + app_push(a, CMD_PLAY, 1, 0, 0); + app_rec_set(a, 1); + app_play_notes(a, k, t, &n, 1, vel); + if (a->pat.trk[t].arp_mode) return 0; + app_rec_at(a, k, t, &n, 1, 0); + return 1; + } + app_play_notes(a, k, t, &n, 1, vel); + return a->key_rec_step[k] >= 0; +} + +uint8_t mach_common_led(const bm_app *a, int i) +{ + if (i == BTN_HOME) return LED_DIM; + if (i == BTN_REC) return a->rec ? LED_ON : a->bx.armed ? LED_BREATH : LED_DIM; + if (i == BTN_OCT_DN) return a->oct < 0 ? LED_ON : LED_DIM; + if (i == BTN_OCT_UP) return a->oct > 0 ? LED_ON : LED_DIM; + return 0xFF; +} + +void mach_head(bm_app *a) { a->bx.grab = 0; a->bx.armed = 0; a->bx.chord = 0; } + +/* ------------------------------------------------------------ el reparto según la máquina del canal */ +bool mach_has(int engine) { return engine == ENG_FM || engine == ENG_ACID || bm_panel_eng(engine) || engine == ENG_BREAK; } + +int mach_page_of(int engine, int btn) +{ + switch (engine) { + case ENG_FM: return bx7_page_of(btn); + case ENG_ACID: return b303_page_of(btn); + case ENG_BREAK: return slicer_page_of(btn); + default: return bm_panel_eng(engine) ? panel_page_of(btn) : -1; + } +} + +void mach_enter(bm_app *a, int t, int page) +{ + app_sloop(a, 0); + a->track = (uint8_t)t; + a->bx.page = (uint8_t)(page >= 0 && page < BXP_N ? page : BXP_MAIN); + a->bx.vman = 0; a->bx.vy = 0; + mach_head(a); + app_set_view(a, V_MACH); +} + +bool mach_button(bm_app *a, int id, bm_gkind k) +{ + switch (id) { + case BTN_PLAY: case BTN_SAVE: return false; + case BTN_HOME: /* sale a la consola: la grabación termina */ + if (k == G_TAP) { if (a->rec) app_rec_set(a, 0); mach_head(a); } + return false; + default: break; + } + if (eng_of(a) == ENG_BREAK) return slicer_button(a, id, k); /* el Slicer: REC graba pads, OCT nada */ + if (id == BTN_REC) { mach_rec(a, k); return true; } + if (mach_oct(a, id, k)) return true; + switch (eng_of(a)) { + case ENG_FM: return bx7_button(a, id, k); + case ENG_ACID: return b303_button(a, id, k); + default: return panel_button(a, id, k); + } +} + +void mach_key(bm_app *a, int k, int w, int b) +{ + switch (eng_of(a)) { + case ENG_FM: bx7_key(a, k, w, b); return; + case ENG_ACID: b303_key(a, k, w, b); return; + case ENG_BREAK: slicer_key(a, k, w, b); return; + default: panel_key(a, k, w, b); return; + } +} + +void mach_encoder(bm_app *a, int id, int d) +{ + if (eng_of(a) == ENG_BREAK) { slicer_encoder(a, id, d); return; } + if (a->bx.page == BXP_SEQ && id == ENC_SELECT) { mach_cursor(a, app_lst(a, d)); return; } /* SEQ: SELECT mueve el cursor de paso */ + switch (eng_of(a)) { + case ENG_FM: bx7_encoder(a, id, d); return; + case ENG_ACID: b303_encoder(a, id, d); return; + default: panel_encoder(a, id, d); return; + } +} + +void mach_legend_view(const bm_app *a, bm_legend L[4]) +{ + switch (eng_of(a)) { + case ENG_FM: bx7_legend(a, L); return; + case ENG_ACID: b303_legend(a, L); return; + case ENG_BREAK: slicer_legend(a, L); return; + default: panel_legend(a, L); return; + } +} + +void mach_bigknobs(const bm_app *a, const char **sel, const char **alg, const char **pre) +{ + switch (eng_of(a)) { + case ENG_FM: bx7_bigknobs(a, sel, alg, pre); return; + case ENG_ACID: b303_bigknobs(a, sel, alg, pre); return; + case ENG_BREAK: slicer_bigknobs(a, sel, alg, pre); return; + default: panel_bigknobs(a, sel, alg, pre); return; + } +} + +void mach_keys(const bm_app *a, bm_keyfn K[BM_KEYS]) +{ + if (eng_of(a) == ENG_FM) { bx7_keys(a, K); return; } + if (eng_of(a) == ENG_BREAK) { slicer_keys(a, K); return; } + if (a->bx.page == BXP_SCL) { b303_keys(a, K); return; } /* BB-303 y las de panel: los pasos */ + memset(K, 0, sizeof(bm_keyfn) * BM_KEYS); + app_note_keys(a, K, a->track); +} + +uint8_t mach_btn_led(const bm_app *a, int i) +{ + if (eng_of(a) == ENG_BREAK) return slicer_btn_led(a, i); + uint8_t c = mach_common_led(a, i); + if (c != 0xFF) return c; + switch (eng_of(a)) { + case ENG_FM: return bx7_btn_led(a, i); + case ENG_ACID: return b303_btn_led(a, i); + default: return panel_btn_led(a, i); + } +} + +const char *mach_title(const bm_app *a, char *buf, int cap) +{ + switch (eng_of(a)) { + case ENG_FM: return bx7_title(a, buf, cap); + case ENG_ACID: return b303_title(a, buf, cap); + case ENG_BREAK: return slicer_title(a, buf, cap); + default: return panel_title(a, buf, cap); + } +} + +/* ¿la pantalla de la máquina ya muestra K1-K4 (su panel, o la lista de GLO, ARP y LFO)? Entonces no va + * la franja de perillas de abajo: cada perilla se dibuja una sola vez. */ +bool mach_knobs_shown(const bm_app *a) +{ + int p = a->bx.page; + switch (eng_of(a)) { + case ENG_FM: return p == BXP_GLO || p == BXP_ARP; + case ENG_BREAK: return slicer_knobs_shown(a); + default: return p == BXP_MAIN || p == BXP_LFO || p == BXP_GLO || p == BXP_ARP; /* BB-303 y las de panel */ + } +} diff --git a/core/bm_mach.h b/core/bm_mach.h new file mode 100644 index 0000000..aa9eed8 --- /dev/null +++ b/core/bm_mach.h @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later + * Copyright (C) 2026 Erbubar23 */ +/* Bubba Machine — lo que comparten las máquinas de los canales de notas por dentro (V_MACH): cómo se + * describe una perilla de una página, cómo se lee, se escribe y se muestra, y lo que se toca igual en + * todas (OCT, REC tipo SLOOP, la nota que arranca la grabación, la página SEQ). Cada máquina tiene sus + * menús (core/bm_bx7.c, core/bm_b303.c y core/bm_panel.c: B-MINI, BUNO-6, BITTAL). */ +#ifndef BM_MACH_H +#define BM_MACH_H + +#include "bm_app_int.h" + +/* qué mueve una perilla: un byte de la voz de la BX-7 (K_FMV) o de su operador (K_OP), un campo del + * canal, una macro, un byte de prm, el largo en compases, el ON/OFF de una casilla de FX, volver al + * preset, o el LATCH del arpegiador. K_PRMI: un byte de prm al revés (max - v); K_R3: el RANGE del OSC 3 + * del B-MINI, con LO primero (en prm va al final, MN_R_LO). */ +enum { K_NONE, K_FMV, K_OP, K_TRK, K_MAC, K_PRM, K_LEN, K_ON, K_RST, K_LATCH, K_MACH, K_VIEWX, K_VIEWY, K_QUANT, + K_PRMI, K_R3, + K_SLICE }; /* el Slicer: un campo del pad elegido o de su ventana (core/bm_slicer.c) */ +enum { F_INT, F_P1, F_LIST, F_ONOFF, F_BIP, F_PCT, F_RAWPCT, F_TRSP, F_DT, F_HZ, F_NOTE, F_BARS, F_STEPS, F_CH, + F_OHZ, F_DMS, F_GLIDE, /* el corte, la caída y el slide del BB-303 */ + F_PHZ, F_TIME, F_RATE, F_MIX, /* las de panel: el corte, un tiempo, la velocidad del LFO, MOD MIX (OSC 3 / LFO) */ + F_SEMI, F_CENT }; /* BITTAL: TRANSP en semitonos, FINE en cents */ +typedef struct { const char *name; uint8_t kind, idx, lo, max, fmt; const char *const *list; } bxp; + +#define TRK(f) ((uint8_t)offsetof(bm_track, f)) +#define NONE {"", K_NONE, 0, 0, 0, F_INT, NULL} + +extern const bxp MACH_SEQ[4]; /* SEQ: SPEED; K3/K4 recorren el piano roll */ +extern const bxp MACH_GLO[2][4]; /* GLO: LENGTH, MACHINE, MIDI CH, MIDI OUT; pág 2 QUANT (K3), RESET */ +extern const char *const MACH_QUANTS[4]; +#define MACH_QUANT {"QUANT", K_QUANT, 0, 0, 3, F_LIST, MACH_QUANTS} /* PLAY+REC: 25 50 75 100 % */ +extern const bxp MACH_ARP[2][4]; /* ARP: MODE OCTAVE RATE GATE / LATCH */ + +int mach_get(const bm_app *a, const bxp *p); +void mach_fmt(const bxp *p, int v, char *b, int cap); +int mach_pct(const bxp *p, int v); +/* gira la perilla k: escribe el valor y devuelve el nuevo (-1 si no cambió; el título lo arma quien llama) */ +int mach_turn(bm_app *a, const bxp *p, int d); +void mach_legend(const bm_app *a, const bxp *P, bm_legend L[4]); +bool mach_oct(bm_app *a, int id, bm_gkind k); /* OCT -/+ (los dos: todo a 0); true = lo usó */ +void mach_rec(bm_app *a, bm_gkind k); /* REC tipo SLOOP; sostenido 2 s borra el canal */ +/* toca la nota de la tecla k con esa fuerza; con REC armado la primera nota arranca y graba. Devuelve 1 + * si grabó la nota (para marcarle acento o slide). */ +int mach_play(bm_app *a, int k, int vel); +uint8_t mach_common_led(const bm_app *a, int i); /* HOME, REC y OCT: 0xFF si no es uno de esos */ +void mach_head(bm_app *a); /* al entrar: sin grabación armada ni casilla tomada */ +bool mach_knobs_shown(const bm_app *a); /* la pantalla ya muestra K1-K4: sin la franja de perillas */ + +/* el BB-303 (core/bm_b303.c) */ +int b303_page_of(int btn); +bool b303_button(bm_app *a, int id, bm_gkind k); +void b303_key(bm_app *a, int k, int w, int b); +void b303_encoder(bm_app *a, int id, int d); +void b303_legend(const bm_app *a, bm_legend L[4]); +void b303_bigknobs(const bm_app *a, const char **sel, const char **alg, const char **pre); +uint8_t b303_btn_led(const bm_app *a, int i); +const char *b303_title(const bm_app *a, char *buf, int cap); +void b303_keys(const bm_app *a, bm_keyfn K[BM_KEYS]); /* SCL: las blancas son los pasos */ +extern const char *const b303_fx_names[ACF_N]; +void mach_scl_toggle(bm_app *a, int w); /* SCL: el ACCENT (o SLIDE / GLIDE) del paso w de la página */ + +/* las de panel: B-MINI, BUNO-6, BITTAL (core/bm_panel.c) */ +int panel_page_of(int btn); +bool panel_button(bm_app *a, int id, bm_gkind k); +void panel_key(bm_app *a, int k, int w, int b); +void panel_encoder(bm_app *a, int id, int d); +void panel_legend(const bm_app *a, bm_legend L[4]); +void panel_bigknobs(const bm_app *a, const char **sel, const char **alg, const char **pre); +uint8_t panel_btn_led(const bm_app *a, int i); +const char *panel_title(const bm_app *a, char *buf, int cap); +int panel_sub(const bm_app *a); /* la página del menú que se ve */ +const bxp *panel_knobs(const bm_app *a); /* sus cuatro perillas */ +int panel_edit_n(const bm_app *a); /* las secciones de EDIT y sus nombres */ +const char *panel_edit_name(const bm_app *a, int i); +extern const char *const panel_fx_names[PXF_N]; +extern const char *const bmini_r3_names[6]; + +/* el Slicer (core/bm_slicer.c): EDIT (TRIM, SOUND), ENV, FX y GLO; SEQ, LFO y SCL son su rejilla (V_CH) */ +int slicer_page_of(int btn); +bool slicer_button(bm_app *a, int id, bm_gkind k); +void slicer_key(bm_app *a, int k, int w, int b); +void slicer_encoder(bm_app *a, int id, int d); +void slicer_legend(const bm_app *a, bm_legend L[4]); +void slicer_bigknobs(const bm_app *a, const char **sel, const char **alg, const char **pre); +uint8_t slicer_btn_led(const bm_app *a, int i); +const char *slicer_title(const bm_app *a, char *buf, int cap); +void slicer_keys(const bm_app *a, bm_keyfn K[BM_KEYS]); +void slicer_status(const bm_app *a, char *b, int cap, uint16_t *col); /* la cabecera: SAMPLE o el pad y su toma */ +bool slicer_knobs_shown(const bm_app *a); +int slicer_sub(const bm_app *a); +const bxp *slicer_knobs(const bm_app *a); +int slicer_get(const bm_app *a, const bxp *p); +void slicer_fmt(const bm_app *a, const bxp *p, int v, char *b, int cap); +int slicer_pct(const bm_app *a, const bxp *p, int v); +int slicer_turn(bm_app *a, const bxp *p, int d); +bool slicer_live(const bm_app *a, const bxp *p); /* ¿la perilla hace algo ahora? */ +bool slicer_take(const bm_app *a, int pad, bm_smp_src *m); /* la toma del pad (si tiene) */ +void slicer_view(const bm_app *a, uint32_t *v0, uint32_t *v1); /* TRIM: la ventana de la onda, en muestras */ +void slicer_grid_knob(bm_app *a, int k, int d); /* la rejilla: LEVEL, LENGTH, PITCH y RELEASE */ +void slicer_grid_legend(const bm_app *a, bm_legend L[4]); +extern const char *const slicer_mode_names[PAD_MODES]; + +#endif diff --git a/core/bm_panel.c b/core/bm_panel.c new file mode 100644 index 0000000..019423a --- /dev/null +++ b/core/bm_panel.c @@ -0,0 +1,314 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later + * Copyright (C) 2026 Erbubar23 */ +/* Bubba Machine — las máquinas de panel por dentro: B-MINI (Minimoog, con los menús del POLY D de + * Behringer), BUNO-6 (Juno-6) y BITTAL (Vital), 2026-10-22. Cada sección del panel en su botón: + * EDIT el panel, una sección por página (con pestañas arriba) + * ENV sus envolventes (una página cada una) + * LFO su modulación (BITTAL: y los destinos de sus 4 macros) + * FX DISTORTION (DRIVE, TONE, LEVEL); pág 2 CHORUS y REVERB (el DELAY, desde HOME) + * SCL el ACCENT de cada paso; SCL otra vez: el GLIDE de cada paso (como la 303) + * SEQ, ARP y GLO como en las demás máquinas + * ALGORITHM el corte del filtro, en cualquier página · PRESETS los sonidos + * Un menú con páginas no se sale: su botón otra vez pasa a la siguiente, en círculo; se sale con otro + * menú o HOME. El de una página (y SEQ), otra vez, vuelve al panel. */ +#include +#include +#include +#include "bm_mach.h" +#include "bm_util.h" +#include "bm_params.h" +#include "bm_lang.h" + +#define VOLUME {"VOLUME", K_TRK, TRK(level), 0, 127, F_PCT, NULL} +static const bxp P_NONE[4] = {NONE, NONE, NONE, NONE}; + +/* ------------------------------------------------------------ B-MINI: el Minimoog, como el POLY D */ +static const char *const MN_RANGES[5] = {"32'", "16'", "8'", "4'", "2'"}; +const char *const bmini_r3_names[6] = {"LO", "32'", "16'", "8'", "4'", "2'"}; +static const char *const MN_WAVES_N[MN_WAVES] = {"TRI", "SHARK", "SAW", "SQUARE", "WIDE", "NARROW"}; +static const char *const MN_MODES[2] = {"MONO", "LEGATO"}; +static const char *const MN_LWAVES[2] = {"TRI", "SQUARE"}; +static const char *const MN_DESTS[MN_LDESTS] = {"OSC", "FILTER", "BOTH"}; +static const bxp MN_EDIT[5][4] = { + {{"CUTOFF", K_MAC, 0, 0, 127, F_PHZ, NULL}, {"EMPHASIS", K_MAC, 1, 0, 127, F_PCT, NULL}, + {"CONTOUR", K_MAC, 2, 0, 127, F_PCT, NULL}, {"KBD CTRL", K_PRM, MN_KEYT, 0, 127, F_PCT, NULL}}, + {{"RANGE", K_PRM, MN_R1, 0, 4, F_LIST, MN_RANGES}, {"WAVE", K_PRM, MN_W1, 0, MN_WAVES - 1, F_LIST, MN_WAVES_N}, + {"LEVEL", K_PRM, MN_L1, 0, 127, F_PCT, NULL}, {"TUNE", K_PRM, MN_TUNE, 0, 127, F_BIP, NULL}}, + {{"RANGE", K_PRM, MN_R2, 0, 4, F_LIST, MN_RANGES}, {"FREQ", K_PRM, MN_T2, 0, 127, F_BIP, NULL}, + {"WAVE", K_PRM, MN_W2, 0, MN_WAVES - 1, F_LIST, MN_WAVES_N}, {"LEVEL", K_PRM, MN_L2, 0, 127, F_PCT, NULL}}, + {{"RANGE", K_R3, MN_R3, 0, 5, F_LIST, bmini_r3_names}, {"FREQ", K_PRM, MN_T3, 0, 127, F_BIP, NULL}, + {"WAVE", K_PRM, MN_W3, 0, MN_WAVES - 1, F_LIST, MN_WAVES_N}, {"LEVEL", K_PRM, MN_L3, 0, 127, F_PCT, NULL}}, + {{"NOISE", K_PRM, MN_NOISE, 0, 127, F_PCT, NULL}, {"GLIDE", K_PRM, MN_GLIDE, 0, 127, F_TIME, NULL}, + {"MODE", K_PRM, MN_MODE, 0, 1, F_LIST, MN_MODES}, VOLUME}}; +static const char *const MN_EDIT_N[5] = {"FILTER", "OSC 1", "OSC 2", "OSC 3", "OUTPUT"}; +static const bxp MN_ENV[2][4] = { + {{"ATTACK", K_PRM, MN_FA, 0, 127, F_TIME, NULL}, {"DECAY", K_PRM, MN_FD, 0, 127, F_TIME, NULL}, + {"SUSTAIN", K_PRM, MN_FS, 0, 127, F_PCT, NULL}, {"RELEASE", K_PRM, MN_FR, 0, 127, F_TIME, NULL}}, + {{"ATTACK", K_PRM, MN_AA, 0, 127, F_TIME, NULL}, {"DECAY", K_PRM, MN_AD, 0, 127, F_TIME, NULL}, + {"SUSTAIN", K_PRM, MN_AS, 0, 127, F_PCT, NULL}, {"RELEASE", K_PRM, MN_AR, 0, 127, F_TIME, NULL}}}; +static const char *const MN_ENV_N[2] = {"FILTER", "LOUDNESS"}; +static const bxp MN_LFO[2][4] = { + {{"RATE", K_PRM, MN_LRATE, 0, 127, F_RATE, NULL}, {"WAVE", K_PRM, MN_LWAVE, 0, 1, F_LIST, MN_LWAVES}, + {"MOD MIX", K_PRMI, MN_MIX, 0, 127, F_MIX, NULL}, {"AMOUNT", K_PRM, MN_LAMT, 0, 127, F_PCT, NULL}}, + {{"DEST", K_PRM, MN_LDEST, 0, MN_LDESTS - 1, F_LIST, MN_DESTS}, NONE, NONE, NONE}}; +static const char *const MN_LFO_N[2] = {"", "DEST"}; + +/* ------------------------------------------------------------ BUNO-6: el Juno-6 */ +static const char *const BN_RANGES[3] = {"16'", "8'", "4'"}; +static const char *const BN_PWM_N[BN_PWMS] = {"LFO", "MANUAL", "ENV"}; +static const char *const BN_HPFS[4] = {"0", "1", "2", "3"}; +static const char *const BN_POLS[2] = {"+", "-"}; +static const char *const BN_VCAS[2] = {"ENV", "GATE"}; +static const bxp BN_EDIT[5][4] = { + {{"FREQ", K_MAC, 0, 0, 127, F_PHZ, NULL}, {"RES", K_MAC, 1, 0, 127, F_PCT, NULL}, + {"ENV", K_MAC, 2, 0, 127, F_PCT, NULL}, {"LFO", K_MAC, 3, 0, 127, F_PCT, NULL}}, + {{"RANGE", K_PRM, BN_RANGE, 0, 2, F_LIST, BN_RANGES}, {"PULSE", K_PRM, BN_PULSE, 0, 1, F_ONOFF, NULL}, + {"SAW", K_PRM, BN_SAW, 0, 1, F_ONOFF, NULL}, {"SUB", K_PRM, BN_SUB, 0, 127, F_PCT, NULL}}, + {{"LFO", K_PRM, BN_LFODCO, 0, 127, F_PCT, NULL}, {"PWM", K_PRM, BN_PWM, 0, 127, F_PCT, NULL}, + {"PWM MODE", K_PRM, BN_PWMSRC, 0, BN_PWMS - 1, F_LIST, BN_PWM_N}, {"NOISE", K_PRM, BN_NOISE, 0, 127, F_PCT, NULL}}, + {{"HPF", K_PRM, BN_HPF, 0, 3, F_LIST, BN_HPFS}, {"ENV +/-", K_PRM, BN_ENVPOL, 0, 1, F_LIST, BN_POLS}, + {"KYBD", K_PRM, BN_KEYT, 0, 127, F_PCT, NULL}, {"VELO", K_PRM, BN_VELF, 0, 127, F_PCT, NULL}}, + {{"ENV/GATE", K_PRM, BN_VCA, 0, 1, F_LIST, BN_VCAS}, {"VELO", K_PRM, BN_VELA, 0, 127, F_PCT, NULL}, NONE, VOLUME}}; +static const char *const BN_EDIT_N[5] = {"VCF", "DCO", "DCO MOD", "VCF MOD", "VCA"}; +static const bxp BN_ENV[1][4] = { + {{"ATTACK", K_PRM, BN_A, 0, 127, F_TIME, NULL}, {"DECAY", K_PRM, BN_D, 0, 127, F_TIME, NULL}, + {"SUSTAIN", K_PRM, BN_S, 0, 127, F_PCT, NULL}, {"RELEASE", K_PRM, BN_R, 0, 127, F_TIME, NULL}}}; +static const char *const BN_ENV_N[1] = {""}; +static const bxp BN_LFO[1][4] = { + {{"RATE", K_PRM, BN_LRATE, 0, 127, F_RATE, NULL}, {"DELAY", K_PRM, BN_LDELAY, 0, 127, F_TIME, NULL}, NONE, NONE}}; +static const char *const BN_LFO_N[1] = {""}; + +/* ------------------------------------------------------------ BITTAL: Vital */ +static const char *const BT_UNIS[4] = {"1", "2", "3", "4"}; +static const char *const BT_FILTERS_N[BT_FILTERS] = {"LP 24", "LP 12", "BP", "HP", "LADDER", "OFF"}; +static const char *const BT_MODES[WM_MODES] = {"POLY", "MONO", "LEGATO"}; +static const char *const BT_LSHAPES_N[BT_LSHAPES] = {"SINE", "TRI", "SAW", "SQUARE", "RANDOM"}; +static const char *const BT_LDESTS_N[BT_LDESTS] = {"PITCH", "CUTOFF", "POSITION", "LEVEL"}; +#define BT_OSC(L, S, P, U) {{"LEVEL", K_PRM, L, 0, 127, F_PCT, NULL}, {"TRANSP", K_PRM, S, 0, 127, F_SEMI, NULL}, \ + {"FRAME", K_PRM, P, 0, 127, F_PCT, NULL}, {"UNISON", K_PRM, U, 0, 3, F_LIST, BT_UNIS}} +#define BT_OSCP(D, F, T) {{"DETUNE", K_PRM, D, 0, 127, F_PCT, NULL}, {"FINE", K_PRM, F, 0, 127, F_CENT, NULL}, \ + {"TABLE", K_PRM, T, 0, 63, F_INT, NULL}, NONE} +static const bxp BT_EDIT[7][4] = { + BT_OSC(BT_L1, BT_S1, BT_P1, BT_U1), BT_OSCP(BT_D1, BT_F1, BT_TAB1), + BT_OSC(BT_L2, BT_S2, BT_P2, BT_U2), BT_OSCP(BT_D2, BT_F2, BT_TAB2), + {{"MODEL", K_PRM, BT_FT, 0, BT_FILTERS - 1, F_LIST, BT_FILTERS_N}, {"CUTOFF", K_PRM, BT_CUT, 0, 127, F_PHZ, NULL}, + {"RESO", K_PRM, BT_RES, 0, 127, F_PCT, NULL}, {"DRIVE", K_PRM, BT_DRIVE, 0, 127, F_PCT, NULL}}, + {{"ENV2 AMT", K_PRM, BT_FENV, 0, 127, F_BIP, NULL}, {"KEYTRK", K_PRM, BT_KEYT, 0, 127, F_PCT, NULL}, + {"VELO", K_PRM, BT_VELF, 0, 127, F_PCT, NULL}, {"ENV2 POS", K_PRM, BT_EPOS, 0, 127, F_PCT, NULL}}, + {{"MODE", K_PRM, BT_MODE, 0, WM_MODES - 1, F_LIST, BT_MODES}, {"GLIDE", K_PRM, BT_GLIDE, 0, 127, F_TIME, NULL}, + {"VELO", K_PRM, BT_VELA, 0, 127, F_PCT, NULL}, VOLUME}}; +static const char *const BT_EDIT_N[7] = {"OSC 1", "OSC 1 +", "OSC 2", "OSC 2 +", "FILTER", "FILTER +", "VOICE"}; +static const bxp BT_ENV[2][4] = { + {{"ATTACK", K_PRM, BT_AA, 0, 127, F_TIME, NULL}, {"DECAY", K_PRM, BT_AD, 0, 127, F_TIME, NULL}, + {"SUSTAIN", K_PRM, BT_AS, 0, 127, F_PCT, NULL}, {"RELEASE", K_PRM, BT_AR, 0, 127, F_TIME, NULL}}, + {{"ATTACK", K_PRM, BT_MA, 0, 127, F_TIME, NULL}, {"DECAY", K_PRM, BT_MD, 0, 127, F_TIME, NULL}, + {"SUSTAIN", K_PRM, BT_MS, 0, 127, F_PCT, NULL}, {"RELEASE", K_PRM, BT_MR, 0, 127, F_TIME, NULL}}}; +static const char *const BT_ENV_N[2] = {"ENV 1", "ENV 2"}; +#define BT_MAC(n1, d1, a1, n2, d2, a2) {{n1 " TO", K_PRM, d1, 0, BTM_TARGETS - 1, F_LIST, bm_btm_names}, \ + {n1 " AMT", K_PRM, a1, 0, 127, F_BIP, NULL}, \ + {n2 " TO", K_PRM, d2, 0, BTM_TARGETS - 1, F_LIST, bm_btm_names}, \ + {n2 " AMT", K_PRM, a2, 0, 127, F_BIP, NULL}} +static const bxp BT_LFO[3][4] = { + {{"SHAPE", K_PRM, BT_LSHAPE, 0, BT_LSHAPES - 1, F_LIST, BT_LSHAPES_N}, {"RATE", K_PRM, BT_LRATE, 0, 127, F_RATE, NULL}, + {"DEST", K_PRM, BT_LDEST, 0, BT_LDESTS - 1, F_LIST, BT_LDESTS_N}, {"AMOUNT", K_PRM, BT_LAMT, 0, 127, F_PCT, NULL}}, + BT_MAC("M1", BT_M1D, BT_M1A, "M2", BT_M2D, BT_M2A), + BT_MAC("M3", BT_M3D, BT_M3A, "M4", BT_M4D, BT_M4A)}; +static const char *const BT_LFO_N[3] = {"", "MACRO 1-2", "MACRO 3-4"}; + +/* ------------------------------------------------------------ los efectos, iguales en las tres */ +static const bxp PX_FX1[4] = {{"DRIVE", K_PRM, PX_DS_G, 0, 127, F_PCT, NULL}, {"TONE", K_PRM, PX_DS_T, 0, 127, F_PCT, NULL}, + {"LEVEL", K_PRM, PX_DS_L, 0, 127, F_PCT, NULL}, {"ON", K_ON, PXF_DIST, 0, 1, F_ONOFF, NULL}}; +#define PX_FX2(...) {{__VA_ARGS__}, NONE, {"REVERB", K_TRK, TRK(rsend), 0, 127, F_PCT, NULL}, {"REV ON", K_ON, PXF_REVERB, 0, 1, F_ONOFF, NULL}} +static const bxp PX_FX2_STD[4] = PX_FX2("CHORUS", K_PRM, PX_CHORUS, 0, 2, F_LIST, bm_px_chorus_names); +static const bxp PX_FX2_BN[4] = PX_FX2("CHORUS", K_PRM, BN_CHORUS, 0, BN_CHORUSES - 1, F_LIST, bm_bn_chorus_names); /* el del Juno, con I+II */ +const char *const panel_fx_names[PXF_N] = {"DISTORTION", "CHORUS", "REVERB"}; + +typedef struct { + const char *name; /* para el recuadro: "B-MINI CUTOFF" */ + int edit_n; const bxp (*edit)[4]; const char *const *edit_names; + int env_n; const bxp (*env)[4]; const char *const *env_names; + int lfo_n; const bxp (*lfo)[4]; const char *const *lfo_names; + const bxp *fx2; + bxp algo; /* ALGORITHM: el corte */ +} pmach; + +static const pmach PM[3] = { + {"B-MINI", 5, MN_EDIT, MN_EDIT_N, 2, MN_ENV, MN_ENV_N, 2, MN_LFO, MN_LFO_N, PX_FX2_STD, + {"CUTOFF", K_MAC, 0, 0, 127, F_PHZ, NULL}}, + {"BUNO-6", 5, BN_EDIT, BN_EDIT_N, 1, BN_ENV, BN_ENV_N, 1, BN_LFO, BN_LFO_N, PX_FX2_BN, + {"FREQ", K_MAC, 0, 0, 127, F_PHZ, NULL}}, + {"BITTAL", 7, BT_EDIT, BT_EDIT_N, 2, BT_ENV, BT_ENV_N, 3, BT_LFO, BT_LFO_N, PX_FX2_STD, + {"CUTOFF", K_PRM, BT_CUT, 0, 127, F_PHZ, NULL}}}; + +static const pmach *pm_of(const bm_app *a) +{ + int e = a->pat.trk[a->track].engine; + return &PM[e == ENG_BUNO ? 1 : e == ENG_BITTAL ? 2 : 0]; +} + +int panel_page_of(int btn) +{ + switch (btn) { + case BTN_EDIT: return BXP_MAIN; + case BTN_SEQ: return BXP_SEQ; + case BTN_FX: return BXP_FX; + case BTN_ENV: return BXP_ENV; + case BTN_LFO: return BXP_LFO; + case BTN_SCL: return BXP_SCL; + case BTN_ARP: return BXP_ARP; + case BTN_GLO: return BXP_GLO; + default: return -1; + } +} + +static int pages(const pmach *m, int p) +{ + switch (p) { + case BXP_MAIN: return m->edit_n; + case BXP_ENV: return m->env_n; + case BXP_LFO: return m->lfo_n; + case BXP_SEQ: return 1; + default: return 2; + } +} + +int panel_sub(const bm_app *a) { return a->bx.sub[a->bx.page % BXP_N] % pages(pm_of(a), a->bx.page); } + +static const bxp *cur(const bm_app *a, int *n) +{ + const pmach *m = pm_of(a); + *n = pages(m, a->bx.page); + int s = panel_sub(a); + switch (a->bx.page) { + case BXP_SEQ: return MACH_SEQ; + case BXP_ENV: return m->env[s]; + case BXP_LFO: return m->lfo[s]; + case BXP_FX: return s ? m->fx2 : PX_FX1; + case BXP_SCL: return P_NONE; + case BXP_GLO: return MACH_GLO[s]; + case BXP_ARP: return MACH_ARP[s]; + default: return m->edit[s]; + } +} + +const bxp *panel_knobs(const bm_app *a) { int n; return cur(a, &n); } + +/* el panel está a la vista: se ve girar la perilla, sin el recuadro grande encima (ALGORITHM se ve + * solo si está en la página, como el CUTOFF del B-MINI en FILTER) */ +static bool on_panel(const bm_app *a, int k, const bxp *p) +{ + if (a->bx.page != BXP_MAIN) return false; + if (k >= 0) return true; + const bxp *P = pm_of(a)->edit[panel_sub(a)]; + for (int i = 0; i < 4; i++) if (P[i].kind == p->kind && P[i].idx == p->idx) return true; + return false; +} + +static void turned(bm_app *a, int k, const bxp *p, int v) +{ + if (v < 0) return; + if (on_panel(a, k, p)) { a->ov.on = 0; return; } + char b[12], ti[22]; + mach_fmt(p, v, b, sizeof b); + const char *pre = a->bx.page == BXP_FX ? "FX" : a->bx.page == BXP_LFO ? "LFO" : a->bx.page == BXP_ENV ? "ENV" : pm_of(a)->name; + snprintf(ti, sizeof ti, "%s %s", pre, T(p->name)); + app_overlay(a, k, ti, b, "", mach_pct(p, v), p->fmt == F_BIP || p->fmt == F_SEMI || p->fmt == F_CENT ? 128 : -1, + k >= 0 ? bm_knob_color(k) : C_ORANGE); +} + +bool panel_button(bm_app *a, int id, bm_gkind k) +{ + int p = panel_page_of(id); + if (p < 0) return true; /* lo demás no hace nada */ + if (k != G_TAP && k != G_HOLD) return true; + bm_bx7ui *u = &a->bx; + int n = pages(pm_of(a), p); + if (u->page != p) { /* otro menú: entra en su página 1 */ + u->page = (uint8_t)p; + u->sub[p] = 0; + if (p == BXP_SCL) u->blk = (uint8_t)(u->step % mach_len(a) / 16); + } else if (n > 1) u->sub[p] = (uint8_t)((u->sub[p] + 1) % n); /* la siguiente, en círculo */ + else u->page = BXP_MAIN; /* de una página: otra vez, el panel */ + a->ov.on = 0; + return true; +} + +void panel_key(bm_app *a, int k, int w, int b) +{ + (void)b; + if (a->bx.page == BXP_SCL) { if (w >= 0 && w < 16) mach_scl_toggle(a, w); return; } /* las negras: nada */ + mach_play(a, k, 105); +} + +void panel_encoder(bm_app *a, int id, int d) +{ + bm_bx7ui *u = &a->bx; + int n; + switch (id) { + case ENC_SELECT: + if (u->page == BXP_SCL) { /* la página de 16 pasos */ + int nb = (mach_len(a) + 15) / 16; + u->blk = (uint8_t)((u->blk + app_lst(a, d) + nb * 8) % nb); + } + return; /* las páginas, con su botón */ + case ENC_ALGO: { /* el corte, en cualquier página */ + const bxp *p = &pm_of(a)->algo; + turned(a, -1, p, mach_turn(a, p, d)); + return; + } + case ENC_PRESETS: app_enc_source(a, a->track, d); return; + default: break; + } + int k = id - ENC_K1; + if (k < 0 || k > 3) return; + const bxp *P = cur(a, &n); + turned(a, k, &P[k], mach_turn(a, &P[k], d)); +} + +void panel_legend(const bm_app *a, bm_legend L[4]) +{ + int n; + mach_legend(a, cur(a, &n), L); +} + +void panel_bigknobs(const bm_app *a, const char **sel, const char **alg, const char **pre) +{ + *sel = a->bx.page == BXP_SCL ? "STEPS" : a->bx.page == BXP_SEQ ? "STEP" : "-"; + *alg = pm_of(a)->algo.name; + *pre = "PRESET"; +} + +uint8_t panel_btn_led(const bm_app *a, int i) +{ + int p = panel_page_of(i); + if (p < 0) return LED_OFF; + return p == a->bx.page ? LED_ON : LED_DIM; +} + +const char *panel_title(const bm_app *a, char *buf, int cap) +{ + const pmach *m = pm_of(a); + const bm_bx7ui *u = &a->bx; + int n = pages(m, u->page), s = panel_sub(a); + switch (u->page) { + case BXP_MAIN: snprintf(buf, (size_t)cap, "%s %d/%d", T(m->edit_names[s]), s + 1, n); break; + case BXP_ENV: + if (n > 1) snprintf(buf, (size_t)cap, "ENV %d/%d %s", s + 1, n, T(m->env_names[s])); + else snprintf(buf, (size_t)cap, "%s", "ENV"); + break; + case BXP_LFO: + if (n > 1) snprintf(buf, (size_t)cap, m->lfo_names[s][0] ? "LFO %d/%d %s" : "LFO %d/%d", s + 1, n, T(m->lfo_names[s])); + else snprintf(buf, (size_t)cap, "%s", "LFO"); + break; + case BXP_FX: snprintf(buf, (size_t)cap, "FX %d/2 %s", s + 1, T(s ? "CHORUS REVERB" : "DISTORTION")); break; + case BXP_SCL: snprintf(buf, (size_t)cap, "%s %d-%d", T(s ? "GLIDE" : "ACCENT"), u->blk * 16 + 1, u->blk * 16 + 16); break; + case BXP_GLO: snprintf(buf, (size_t)cap, "GLO %d/2", s + 1); break; + case BXP_ARP: snprintf(buf, (size_t)cap, "ARP %d/2", s + 1); break; + default: snprintf(buf, (size_t)cap, "%s", "SEQ"); break; + } + return buf; +} + +/* el panel: cuántas secciones tiene EDIT y cómo se llaman */ +int panel_edit_n(const bm_app *a) { return pm_of(a)->edit_n; } +const char *panel_edit_name(const bm_app *a, int i) { return pm_of(a)->edit_names[i % pm_of(a)->edit_n]; } diff --git a/core/bm_params.c b/core/bm_params.c index 349d0fe..7ee233e 100644 --- a/core/bm_params.c +++ b/core/bm_params.c @@ -74,15 +74,14 @@ const bm_ppage bm_mn_pages[BM_MN_PAGES] = { P("VEL FILT", MN_VELF, 40, 127, PF_PCT, 0), P("VEL LVL", MN_VELA, 40, 127, PF_PCT, 0)}}, }; -/* BX-7: ALGORITHM (con el dibujo), EG, VOICE y LFO. Las macros y el LFO van encima del patch. */ +/* BX-7 (2026-10-21): lo que va encima de la voz (pat->fmv), con 64 = la voz tal cual. La voz misma + * (algoritmo, feedback, LFO, operadores) se edita byte a byte con CMD_FMV desde core/bm_bx7.c. + * MAIN: lo de la pantalla principal · ENV: el ADSR de volumen del FM-1 de fábrica. */ const bm_ppage bm_fx_pages[BM_FX_PAGES] = { - {"ALGORITHM", 4, {P("ALG", FX_ALG, 0, 32, PF_ALG, 0), P("FEEDBACK", PS_M0 + 1, 64, 127, PF_BIP, 0), - P("MOD LVL", PS_M0 + 0, 64, 127, PF_BIP, 0), P("KEY VEL", PS_TRK(accent), 100, 127, PF_PCT, 0)}}, - {"EG", 3, {P("R1 ATK", PS_TRK(attack), 0, 127, PF_PCT, 0), P("R2-3 DEC", PS_M0 + 2, 64, 127, PF_BIP, 0), - P("R4 REL", PS_M0 + 3, 64, 127, PF_BIP, 0)}}, - {"VOICE", 2, {P("PORTA", PS_TRK(glide), 30, 127, PF_PCT, 0), P("TRANSP", PS_TRK(transpose), 24, 48, PF_TRSP, 0)}}, - {"LFO", 4, {P("SPEED", FX_LSPD, 0, 100, PF_OVR, 0), P("DELAY", FX_LDLY, 0, 100, PF_OVR, 0), - P("PMD", FX_LPMD, 0, 100, PF_OVR, 0), P("AMD", FX_LAMD, 0, 100, PF_OVR, 0)}}, + {"MAIN", 3, {P("BRIGHT", PS_M0 + 0, 64, 127, PF_BIP, 0), P("PORTA", PS_TRK(glide), 0, 127, PF_PCT, 0), + P("KEY VEL", PS_TRK(accent), 100, 127, PF_PCT, 0)}}, + {"ENV", 4, {P("ATTACK", PS_TRK(attack), 0, 127, PF_PCT, 0), P("DECAY", PS_M0 + 2, 64, 127, PF_BIP, 0), + P("SUSTAIN", PS_TRK(sustain), 64, 127, PF_BIP, 0), P("RELEASE", PS_M0 + 3, 64, 127, PF_BIP, 0)}}, }; /* BUNO-6: el panel del Juno-6 de izquierda a derecha */ @@ -149,8 +148,8 @@ static const bm_pdef MN_FDEC = P("F DECAY", PS_M0 + 3, 64, 127, PF_BIP, 0); static const bm_pdef BT_MAC[4] = {P("MACRO 1", PS_M0 + 0, 64, 127, PF_PCT, 0), P("MACRO 2", PS_M0 + 1, 0, 127, PF_PCT, 0), P("MACRO 3", PS_M0 + 2, 0, 127, PF_PCT, 0), P("MACRO 4", PS_M0 + 3, 0, 127, PF_PCT, 0)}; -/* T3-T6: las 5 máquinas, en el orden de la página MACHINE */ -const uint8_t bm_machines[BM_MACHINES] = {ENG_ACID, ENG_MINI, ENG_FM, ENG_BITTAL, ENG_BUNO}; +/* T3-T6: las máquinas que se eligen, en el orden de GLO > SELECT MACHINE */ +const uint8_t bm_machines[BM_MACHINES] = {ENG_ACID, ENG_MINI, ENG_BUNO, ENG_BITTAL, ENG_FM}; const char *bm_machine_origin(int engine) { @@ -173,6 +172,9 @@ const bm_ppage bm_lane_pages[BM_LANE_PAGES] = { P("TONE", LN_TONE, 64, 127, PF_PCT, 0), P("COLOR", LN_COLOR, 64, 127, PF_PCT, 0)}}, {"INSTRUMENT", 4, {P("MODEL", LN_MODEL, 0, DRM_COUNT - 1, PF_LIST, DRM_LIST), P("LEVEL", LN_LEVEL, 100, 127, PF_INT, 0), P("CHOKE", LN_CHOKE, 0, 3, PF_LIST, CHOKES), P("LENGTH", LN_LEN, 16, 64, PF_INT, 0)}}, + /* el secuenciador sin capa (2026-10-21): lo que más se toca del instrumento elegido */ + {"SEQ", 4, {P("LEVEL", LN_LEVEL, 100, 127, PF_INT, 0), P("LENGTH", LN_LEN, 16, 64, PF_INT, 0), /* LENGTH: todo el kit */ + P("DECAY", LN_DECAY, 64, 127, PF_PCT, 0), P("TONE", LN_TONE, 64, 127, PF_PCT, 0)}}, }; /* AFINA: semitonos = (tune - 64) * 3 / 8 sobre el tono base del modelo (bm_drm_base_hz). @@ -304,6 +306,101 @@ void bm_prm_defaults(bm_pattern *p, int t) for (int i = 0; i < n; i++) for (int k = 0; k < pg[i].n; k++) if (pg[i].p[k].slot != PS_TRK(transpose)) prm_set(p, t, &pg[i].p[k], pg[i].p[k].def); /* el tono del canal queda */ + if (e == ENG_FM) bm_bx7_fx_defaults(p->prm[t]); + if (e == ENG_ACID) bm_acid_fx_defaults(p->prm[t]); + if (bm_px_eng(e)) bm_px_fx_defaults(p->prm[t]); +} + +typedef char bm_assert_px[(BM_SNAP_PRM <= PX_FX) ? 1 : -1]; /* un preset no pisa los efectos */ + +void bm_px_fx_defaults(uint8_t *prm) +{ + prm[PX_FX] = 0; + prm[PX_DS_G] = 60; prm[PX_DS_T] = 70; prm[PX_DS_L] = 90; + prm[PX_CHORUS] = 0; prm[PX_LATCH] = 0; +} + +const char *const bm_px_chorus_names[3] = {"OFF", "I", "II"}; + +void bm_acid_fx_defaults(uint8_t *prm) +{ + prm[AC_FX] = 0; + prm[AC_OD_G] = 60; prm[AC_OD_T] = 70; prm[AC_OD_L] = 90; + prm[AC_LATCH] = 0; + prm[AC_LFO_RATE] = 4; prm[AC_LFO_DEPTH] = 0; prm[AC_LFO_WAVE] = ACW_SINE; prm[AC_LFO_DEST] = ACL_CUTOFF; /* 1 compás, apagado */ +} + +const uint16_t bm_acid_lfo_ticks[AC_LFO_RATES] = {24, 48, 96, 192, 384, 768, 1536, 3072}; +const char *const bm_acid_lfo_rates[AC_LFO_RATES] = {"1/16", "1/8", "1/4", "1/2", "1 BAR", "2 BARS", "4 BARS", "8 BARS"}; +const char *const bm_acid_lfo_waves[ACW_N] = {"SINE", "TRIANGLE", "SAW UP", "SAW DOWN", "SQUARE", "S&H", "PUMP", "GATE", "STEPS", "3-3-2", "BUILD"}; +const char *const bm_acid_lfo_dests[ACL_DESTS] = {"CUTOFF", "PITCH", "RESO", "VOLUME"}; + +/* los patrones: 16 pasos por ciclo (con RATE = 1 BAR, uno por semicorchea) */ +static const uint8_t LFO_GATE[16] = {1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1}; /* trance gate */ +static const uint8_t LFO_STEPS[16] = {0, 96, 45, 127, 19, 76, 114, 38, 6, 102, 57, 127, 25, 83, 51, 121}; /* una línea de filtro */ +static const uint8_t LFO_332[16] = {1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0}; /* tresillo: 3 + 3 + 2 */ + +float bm_acid_lfo_shape(int wave, float ph, uint32_t cyc) +{ + if (ph < 0.0f) ph = 0.0f; + if (ph >= 1.0f) ph = 0.9999f; + int st = (int)(ph * 16.0f); + float in = ph * 16.0f - (float)st; /* dentro del paso, 0..1 */ + switch (wave) { + case ACW_TRI: return ph < 0.5f ? 2.0f * ph : 2.0f - 2.0f * ph; + case ACW_SAWUP: return ph; + case ACW_SAWDN: return 1.0f - ph; + case ACW_SQUARE: return ph < 0.5f ? 1.0f : 0.0f; + case ACW_SH: { /* un valor por ciclo, el mismo en cada vuelta del patrón */ + uint32_t h = (cyc + 1u) * 2654435761u; + h ^= h >> 15; h *= 2246822519u; h ^= h >> 13; + return (float)(h & 1023u) * (1.0f / 1023.0f); + } + case ACW_PUMP: { /* cuatro bombeos por ciclo: abajo en el golpe, sube rápido */ + float q = ph * 4.0f; + q -= (float)(int)q; + float r = 1.0f - q; + return 1.0f - r * r * r; + } + case ACW_GATE: return LFO_GATE[st] ? 1.0f : 0.0f; + case ACW_STEPS: return (float)LFO_STEPS[st] * (1.0f / 127.0f); + case ACW_332: { /* cada golpe arriba y cae hasta el siguiente */ + int k = st; + while (k > 0 && !LFO_332[k]) k--; + float since = (float)(st - k) + in; + return 1.0f / (1.0f + 1.5f * since); + } + case ACW_BUILD: return (float)st * (1.0f / 15.0f); /* una escalera que sube: con 4 u 8 compases, una subida */ + default: return 0.5f - 0.5f * cosf(6.2831853f * ph); /* SINE */ + } +} + +bool bm_send_on(const bm_pattern *p, int t, int rev) +{ + switch (p->trk[t].engine) { + case ENG_FM: return (p->prm[t][BX_FXON] >> (rev ? BXF_REVERB : BXF_DELAY)) & 1u; + case ENG_ACID: return bm_acid_fx_on(p->prm[t], rev ? ACF_REVERB : ACF_DELAY); + case ENG_MINI: case ENG_BUNO: case ENG_BITTAL: case ENG_BREAK: return !rev || bm_px_fx_on(p->prm[t], p->trk[t].engine, PXF_REVERB); /* el DELAY, desde HOME */ + default: return true; + } +} + +void bm_bx7_fx_defaults(uint8_t *prm) +{ + for (int i = BX_FX_FIRST; i <= BX_LATCH; i++) prm[i] = 0; + prm[BX_FXON] = (uint8_t)(1u << BXF_REVERB | 1u << BXF_DELAY); /* los envíos de la mezcla, como siempre */ + for (int i = 0; i < BXF_N; i++) prm[BX_ORD0 + i] = (uint8_t)i; + prm[BX_FLT_C] = 90; prm[BX_FLT_Q] = 30; + prm[BX_DST_G] = 40; prm[BX_DST_T] = 80; prm[BX_DST_L] = 90; + prm[BX_CHO_F] = 30; prm[BX_CHO_D] = 60; prm[BX_CHO_M] = 50; + prm[BX_PHA_F] = 30; prm[BX_PHA_D] = 80; prm[BX_PHA_M] = 50; +} + +static int bx_ord_ok(const uint8_t *prm) +{ + unsigned seen = 0; + for (int i = 0; i < BXF_N; i++) { if (prm[BX_ORD0 + i] >= BXF_N) return 0; seen |= 1u << prm[BX_ORD0 + i]; } + return seen == (1u << BXF_N) - 1u; } /* El preset: en BB-303 uno de bm_ac_presets; en BX-7 el patch (source) con los ajustes de fábrica @@ -312,9 +409,19 @@ void bm_preset_apply(bm_pattern *p, int t, int preset) { int eng = p->trk[t].engine; if (!bm_engine_paged(eng)) return; - bm_prm_defaults(p, t); - if (eng == ENG_FM) return; - if (eng == ENG_ACID) { + if (eng == ENG_FM) { /* la voz del preset, para editarla; los efectos y MONO/POLY quedan */ + uint8_t keep[BX_LATCH + 1]; + memcpy(keep, p->prm[t], sizeof keep); + bm_prm_defaults(p, t); + if (bx_ord_ok(keep)) memcpy(p->prm[t] + BX_FX_FIRST, keep + BX_FX_FIRST, (size_t)(BX_LATCH + 1 - BX_FX_FIRST)); + memcpy(p->fmv, bm_fm_patch(preset), BM_FMV_BYTES); + return; + } + if (eng == ENG_ACID) { /* el sonido del preset; los efectos y LATCH quedan */ + uint8_t keep[AC_NPRM]; + memcpy(keep, p->prm[t], sizeof keep); + bm_prm_defaults(p, t); + if (keep[AC_OD_G] || keep[AC_OD_T] || keep[AC_OD_L]) memcpy(p->prm[t] + AC_FX, keep + AC_FX, (size_t)(AC_NPRM - AC_FX)); const bm_ac_preset *a = &bm_ac_presets[(preset % BM_AC_PRESETS + BM_AC_PRESETS) % BM_AC_PRESETS]; bm_track *k = &p->trk[t]; k->macro[0] = a->cut; k->macro[1] = a->res; k->macro[2] = a->env; k->macro[3] = a->dec; @@ -322,12 +429,19 @@ void bm_preset_apply(bm_pattern *p, int t, int preset) p->prm[t][AC_WAVE] = a->wave; return; } + uint8_t keep[BM_PRM]; /* B-MINI, BUNO-6, BITTAL: sus efectos y LATCH quedan */ + memcpy(keep, p->prm[t], sizeof keep); + bm_prm_defaults(p, t); int n = bm_snap_count(eng); if (!n) return; const uint8_t *s = bm_snap_get(eng, (preset % n + n) % n); if (!s) return; - memcpy(p->prm[t], s + 40, BM_PRM < BM_SNAP_PRM ? BM_PRM : BM_SNAP_PRM); + memcpy(p->prm[t], s + 40, BM_PRM < BM_SNAP_PRM ? BM_PRM : BM_SNAP_PRM); /* (los efectos, PX_*, no están: quedan) */ memcpy(p->trk[t].macro, s + 36, 4); + if (bm_panel_eng(eng)) { + if (keep[PX_DS_G] || keep[PX_DS_T] || keep[PX_DS_L]) memcpy(p->prm[t] + PX_FX, keep + PX_FX, (size_t)(PX_END - PX_FX)); + else bm_px_fx_defaults(p->prm[t]); + } if (eng == ENG_BITTAL) { p->prm[t][BT_TAB1] = 0; p->prm[t][BT_TAB2] = 0; } } @@ -365,7 +479,7 @@ void bm_prm_fmt(const bm_pdef *d, int v, char *b, int cap) case PF_GLIDE: snprintf(b, (size_t)cap, "%d MS", (v + 8) * 1000 / 254); break; case PF_MOD: if (v == 64) snprintf(b, (size_t)cap, "OFF"); - else snprintf(b, (size_t)cap, v < 64 ? "OSC %d%%" : "FILT %d%%", ((v < 64 ? 64 - v : v - 64) * 200 + 63) / 127); + else { int pc = ((v < 64 ? 64 - v : v - 64) * 200 + 63) / 127; snprintf(b, (size_t)cap, v < 64 ? "OSC %d%%" : "FILT %d%%", pc > 100 ? 100 : pc); } break; case PF_ALG: if (v) snprintf(b, (size_t)cap, "%d", v); else snprintf(b, (size_t)cap, "PATCH"); break; case PF_OVR: if (v) snprintf(b, (size_t)cap, "%d", v - 1); else snprintf(b, (size_t)cap, "PATCH"); break; diff --git a/core/bm_params.h b/core/bm_params.h index cad8409..a528b93 100644 --- a/core/bm_params.h +++ b/core/bm_params.h @@ -42,8 +42,34 @@ typedef struct { typedef struct { const char *name; uint8_t n; bm_pdef p[4]; } bm_ppage; /* ------------------------------------------------------------ BB-303 (TB-303): VCO, VCF y ENV - * macros: 0 CUTOFF, 1 RESO, 2 ENV MOD, 3 DECAY · PRESETS: los sonidos de bm_ac_presets */ -enum { AC_WAVE, AC_NPRM }; + * macros: 0 CUTOFF, 1 RESO, 2 ENV MOD, 3 DECAY · PRESETS: los sonidos de bm_ac_presets + * 2026-10-22: sus efectos, como los del TB-03 de Roland: OVERDRIVE (aquí) y DELAY / REVERB, que son + * los envíos del canal en la mezcla. AC_FX: bit 0 = OVERDRIVE prendido, bits 1 y 2 = DELAY y REVERB + * APAGADOS (así un patrón de antes, con 0, suena como siempre). AC_LATCH: el arpegiador sigue. */ +enum { AC_WAVE, AC_FX, AC_OD_G, AC_OD_T, AC_OD_L, AC_LATCH, AC_LFO_RATE, AC_LFO_DEPTH, AC_LFO_WAVE, AC_LFO_DEST, AC_NPRM }; +/* El LFO del BB-303 (la 303 no tiene; es un añadido): va al compás (RATE = lo que dura un ciclo), con + * las formas de siempre y patrones de 16 pasos hechos para darle movimiento a una línea. DEPTH 0 = nada. */ +enum { ACL_CUTOFF, ACL_PITCH, ACL_RESO, ACL_VOLUME, ACL_DESTS }; +enum { ACW_SINE, ACW_TRI, ACW_SAWUP, ACW_SAWDN, ACW_SQUARE, ACW_SH, ACW_PUMP, ACW_GATE, ACW_STEPS, ACW_332, ACW_BUILD, ACW_N }; +#define AC_LFO_RATES 8 +extern const uint16_t bm_acid_lfo_ticks[AC_LFO_RATES]; /* ticks de un ciclo (96 por negra) */ +extern const char *const bm_acid_lfo_rates[AC_LFO_RATES]; +extern const char *const bm_acid_lfo_waves[ACW_N]; +extern const char *const bm_acid_lfo_dests[ACL_DESTS]; +float bm_acid_lfo_shape(int wave, float ph, uint32_t cyc); /* 0..1 en la fase ph (0..1) del ciclo número cyc */ +enum { ACF_OD, ACF_DELAY, ACF_REVERB, ACF_N }; /* las casillas, en el orden fijo del TB-03 */ +static inline bool bm_acid_fx_on(const uint8_t *prm, int f) +{ + return f == ACF_OD ? (prm[AC_FX] & 1u) != 0 : !(prm[AC_FX] & (1u << f)); +} +static inline uint8_t bm_acid_fx_set(uint8_t m, int f, int on) +{ + uint8_t b = (uint8_t)(1u << f); + return (uint8_t)((f == ACF_OD) == !!on ? m | b : m & ~b); +} +void bm_acid_fx_defaults(uint8_t *prm); /* OVERDRIVE apagado con sus valores de fábrica; envíos prendidos */ +/* el envío de delay (rev 0) o reverb (rev 1) del canal: lo apaga el FX de la BX-7 o del BB-303 */ +bool bm_send_on(const bm_pattern *p, int t, int rev); #define BM_AC_PAGES 2 extern const bm_ppage bm_ac_pages[BM_AC_PAGES]; typedef struct { const char *name; uint8_t cut, res, env, dec, acc, glide, wave; } bm_ac_preset; @@ -51,20 +77,36 @@ typedef struct { const char *name; uint8_t cut, res, env, dec, acc, glide, wave; extern const bm_ac_preset bm_ac_presets[BM_AC_PRESETS]; /* ------------------------------------------------------------ B-MINI (Minimoog): tres osciladores y escalera - * macros: 0 CUTOFF, 1 EMPHASIS, 2 CONTOUR (cantidad de la envolvente), 3 F DECAY (64 = la de la página) */ + * macros: 0 CUTOFF, 1 EMPHASIS, 2 CONTOUR (cantidad de la envolvente), 3 F DECAY (64 = la de la página) + * 2026-10-22, sus menús como los del POLY D de Behringer: la modulación mezcla el OSC 3 y el LFO + * (MN_MIX = lo que pone el OSC 3; 0 = solo el LFO, como antes) y va a los osciladores, al filtro o a + * los dos; el LFO es triángulo o cuadrada; el OSC 3 tiene el rango LO (MN_R3 = MN_R_LO: un LFO más). + * Sus efectos, los de las máquinas de panel (PX_*, más abajo). */ enum { MN_W1, MN_R1, MN_L1, MN_W2, MN_R2, MN_T2, MN_L2, MN_W3, MN_R3, MN_T3, MN_L3, MN_NOISE, MN_DRIVE, MN_KEYT, MN_VELF, MN_FA, MN_FD, MN_FS, MN_FR, MN_AA, MN_AD, MN_AS, MN_AR, - MN_LRATE, MN_LAMT, MN_LDEST, MN_GLIDE, MN_MODE, MN_VELA, MN_TUNE, MN_NPRM }; + MN_LRATE, MN_LAMT, MN_LDEST, MN_GLIDE, MN_MODE, MN_VELA, MN_TUNE, MN_LWAVE, MN_MIX, MN_NPRM }; enum { MN_WAVE_TRI, MN_WAVE_SHARK, MN_WAVE_SAW, MN_WAVE_SQR, MN_WAVE_WIDE, MN_WAVE_NARROW, MN_WAVES }; -enum { MN_D_PITCH, MN_D_CUT, MN_LDESTS }; +enum { MN_D_PITCH, MN_D_CUT, MN_D_BOTH, MN_LDESTS }; +#define MN_R_LO 5 /* OSC 3: el rango LO (después de 32' 16' 8' 4' 2') */ enum { WM_POLY, WM_MONO, WM_LEGATO, WM_MODES }; #define BM_MN_PAGES 9 extern const bm_ppage bm_mn_pages[BM_MN_PAGES]; -/* ------------------------------------------------------------ BX-7 (DX7): el patch y encima los ajustes - * macros: 0 MOD LVL, 1 FEEDBACK, 2 DECAY (R2-3), 3 RELEASE (R4); 64 = el patch tal cual */ -enum { FX_ALG, FX_LSPD, FX_LDLY, FX_LPMD, FX_LAMD, FX_NPRM }; -#define BM_FX_PAGES 4 +/* ------------------------------------------------------------ BX-7 (DX7): la voz (pat->fmv) y encima + * macros: 0 BRIGHT, 2 DECAY (R2-3), 3 RELEASE (R4); 64 = la voz tal cual. Después de FX_LAMD (sin uso + * desde 2026-10-21: la voz se edita entera) los efectos propios, como en el FM-1 de fábrica: seis + * casillas (filtro, reverb, delay, distorsión, chorus, phaser) en el orden BX_ORD0..5; reverb y delay + * son los envíos del canal en la mezcla (no se procesan dos veces). BX_MONO: MONO/POLY de EDIT; + * BX_LATCH: el arpegiador sigue con las teclas sueltas. */ +enum { FX_ALG, FX_LSPD, FX_LDLY, FX_LPMD, FX_LAMD, + BX_FXON, BX_ORD0, BX_ORD1, BX_ORD2, BX_ORD3, BX_ORD4, BX_ORD5, + BX_FLT_T, BX_FLT_C, BX_FLT_Q, BX_DST_G, BX_DST_T, BX_DST_L, BX_CHO_F, BX_CHO_D, BX_CHO_M, + BX_PHA_F, BX_PHA_D, BX_PHA_M, BX_MONO, BX_LATCH, FX_NPRM }; +enum { BXF_FILTER, BXF_REVERB, BXF_DELAY, BXF_DIST, BXF_CHORUS, BXF_PHASER, BXF_N }; /* las casillas, como en el FM-1 */ +#define BX_FX_FIRST BX_FXON +#define BX_FX_LAST BX_PHA_M +void bm_bx7_fx_defaults(uint8_t *prm); /* los efectos de fábrica: todo apagado salvo los envíos, orden 0..5 */ +#define BM_FX_PAGES 2 extern const bm_ppage bm_fx_pages[BM_FX_PAGES]; /* ------------------------------------------------------------ BUNO-6 (Juno-6): un DCO por voz y chorus @@ -97,9 +139,27 @@ extern const char *const bm_btm_names[BTM_TARGETS]; /* cuánto mueve la macro i (0..127, 64 = nada) el destino dest en un canal BITTAL: -1..1 */ float bm_bt_macro(const uint8_t *prm, const uint8_t mac[4], int dest); +/* ------------------------------------------------------------ máquinas de panel: B-MINI, BUNO-6, BITTAL + * (2026-10-22) Sus menús son los del B-MINI (core/bm_panel.c) y sus efectos los mismos: DISTORTION + * (DRIVE, TONE, LEVEL), CHORUS I / II (el del Juno; BUNO-6 usa el suyo, BN_CHORUS, con I+II) y la + * REVERB, que es el envío del canal; el DELAY solo se maneja desde HOME. Viven en las últimas casillas + * de prm, que los snapshots no guardan: un preset no los pisa. PX_FX: bit 0 = DISTORTION prendida, + * bit 1 = REVERB APAGADA (así 0 suena como siempre). PX_LATCH: el arpegiador sigue. */ +enum { PX_FX = 48, PX_DS_G, PX_DS_T, PX_DS_L, PX_CHORUS, PX_LATCH, PX_END }; +enum { PXF_DIST, PXF_CHORUS, PXF_REVERB, PXF_N }; /* las casillas, en el orden de la cadena */ +static inline bool bm_panel_eng(int e) { return e == ENG_MINI || e == ENG_BUNO || e == ENG_BITTAL; } +static inline bool bm_px_eng(int e) { return bm_panel_eng(e) || e == ENG_BREAK; } /* con estos efectos: las de panel y el Slicer */ +static inline int bm_px_chorus(const uint8_t *prm, int eng) { return eng == ENG_BUNO ? prm[BN_CHORUS] % BN_CHORUSES : prm[PX_CHORUS] % 3; } +static inline bool bm_px_fx_on(const uint8_t *prm, int eng, int f) +{ + return f == PXF_DIST ? (prm[PX_FX] & 1u) != 0 : f == PXF_CHORUS ? bm_px_chorus(prm, eng) != 0 : !(prm[PX_FX] & 2u); +} +void bm_px_fx_defaults(uint8_t *prm); /* DISTORTION apagada con sus valores de fábrica, sin chorus, REVERB prendida */ +extern const char *const bm_px_chorus_names[3]; /* OFF, I, II */ + /* ------------------------------------------------------------ batería: un instrumento (bm_lane) */ enum { LN_LEN, LN_LEVEL, LN_TUNE, LN_DECAY, LN_MODEL, LN_TONE, LN_COLOR, LN_CHOKE }; /* = campos de bm_lane */ -#define BM_LANE_PAGES 2 +#define BM_LANE_PAGES 3 extern const bm_ppage bm_lane_pages[BM_LANE_PAGES]; /* slot = campo LN_* */ typedef struct { char name[6]; uint8_t model, tune, decay, tone, color, level, choke; } bm_kit_lane; diff --git a/core/bm_pattern.c b/core/bm_pattern.c index fe4e39d..6efc98c 100644 --- a/core/bm_pattern.c +++ b/core/bm_pattern.c @@ -12,7 +12,7 @@ typedef char bm_assert_track[(sizeof(bm_track) == 48) ? 1 : -1]; typedef char bm_assert_meta[(sizeof(bm_meta) == 64) ? 1 : -1]; typedef char bm_assert_notes[(sizeof(bm_tr) <= sizeof(bm_notes)) ? 1 : -1]; typedef char bm_assert_lane[(sizeof(bm_lane) == 8) ? 1 : -1]; -typedef char bm_assert_prm[(BT_NPRM <= BM_PRM && MN_NPRM <= BM_PRM && BN_NPRM <= BM_PRM) ? 1 : -1]; +typedef char bm_assert_prm[((int)BT_NPRM <= (int)PX_FX && (int)MN_NPRM <= (int)PX_FX && (int)BN_NPRM <= (int)PX_FX && PX_END <= BM_PRM) ? 1 : -1]; const uint8_t bm_speed_tps[SPD_COUNT] = {12, 16, 24, 32, 48, 96}; const char *const bm_speed_names[SPD_COUNT] = {"X2", "X3/2", "X1", "X3/4", "X1/2", "X1/4"}; @@ -83,15 +83,26 @@ void bm_track_clear_events(bm_pattern *p, int track) bm_event_clear(bm_ev(p, track, s, e)); } +/* El tope de cada byte de la voz de la DX7 (VCED): 6 operadores de 21 y 30 de la voz */ +int bm_fmv_max(int i) +{ + static const uint8_t OP[21] = {99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 3, 3, 7, 3, 7, 99, 1, 31, 99, 14}; + static const uint8_t V[30] = {99, 99, 99, 99, 99, 99, 99, 99, 31, 7, 1, 99, 99, 99, 99, 1, 5, 7, 48, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 63}; + if (i < 0 || i >= BM_FMV_BYTES) return 0; + return i < 126 ? OP[i % 21] : V[i - 126]; +} + int bm_track_engine(int track) { - static const uint8_t E[BM_TRACKS] = {ENG_DRUM, ENG_BREAK, ENG_ACID, ENG_FM, ENG_BITTAL, ENG_BUNO}; + static const uint8_t E[BM_TRACKS] = {ENG_DRUM, ENG_BREAK, ENG_ACID, ENG_MINI, ENG_BITTAL, ENG_BUNO}; return E[(unsigned)track % BM_TRACKS]; } bool bm_engine_ok(int track, int engine) { - if (track >= BM_TR_TRACKS && track < BM_TRACKS) return engine >= ENG_ACID && engine < ENG_COUNT; + if (track >= BM_TR_TRACKS && track < BM_TRACKS) /* 2026-10-21: solo la batería y el Slicer son fijos */ + return engine == ENG_ACID || engine == ENG_MINI || engine == ENG_BUNO || engine == ENG_BITTAL || engine == ENG_FM; return engine == bm_track_engine(track); } @@ -103,12 +114,21 @@ int bm_machine_conflict(const bm_pattern *p, int track, int engine) return -1; } +int bm_heavy_count(const bm_pattern *p, int skip) +{ + int n = 0; + for (int o = BM_TR_TRACKS; o < BM_TRACKS; o++) + if (o != skip && bm_engine_heavy(p->trk[o].engine)) n++; + return n; +} + /* la máquina y su primer preset, sin P-Locks en las notas (los de otra máquina no significan nada) */ static void machine_put(bm_pattern *p, int track, int engine) { bm_track *t = &p->trk[track]; t->engine = (uint8_t)engine; t->source = 0; + memset(p->prm[track], 0, BM_PRM); /* nada de la máquina anterior (los efectos de la BX-7 vuelven a fábrica) */ bm_preset_apply(p, track, 0); for (int s = 0; s < BM_STEPS; s++) for (int k = 0; k < BM_EVENTS; k++) { @@ -121,6 +141,7 @@ void bm_track_set_engine(bm_pattern *p, int track, int engine) { if (track < BM_TR_TRACKS || !bm_engine_ok(track, engine)) return; if (p->trk[track].engine == engine || bm_machine_conflict(p, track, engine) >= 0) return; + if (bm_engine_heavy(engine) && bm_heavy_count(p, track) >= BM_HEAVY_MAX) return; machine_put(p, track, engine); } @@ -140,6 +161,10 @@ static void heavy_fix(bm_pattern *p) } if (!changed) break; } + /* más pesadas que las que caben: la que no es de fábrica en su canal vuelve a la de fábrica */ + for (int t = BM_TRACKS - 1; t >= BM_TR_TRACKS && bm_heavy_count(p, -1) > BM_HEAVY_MAX; t--) + if (bm_engine_heavy(p->trk[t].engine) && bm_track_engine(t) != p->trk[t].engine && !bm_engine_heavy(bm_track_engine(t))) + machine_put(p, t, bm_track_engine(t)); } void bm_pattern_init(bm_pattern *p) @@ -157,6 +182,7 @@ void bm_pattern_init(bm_pattern *p) bm_kit_apply(&p->tr[0], 0); p->meta.rv_size = 80; p->meta.rv_damp = 60; p->meta.rv_mix = 90; p->meta.mfilt = 64; for (int t = BM_TR_TRACKS; t < BM_TRACKS; t++) bm_preset_apply(p, t, p->trk[t].source); + bm_px_fx_defaults(p->prm[1]); /* el Slicer: sus efectos (como las de panel) */ } int bm_master_steps(const bm_meta *m) { return m->master * BM_PAGE_STEPS; } @@ -300,6 +326,8 @@ int bm_pattern_pack(const bm_pattern *p, uint8_t *out, int cap) } NEED((int)sizeof p->pad); memcpy(out + o, p->pad, sizeof p->pad); o += (int)sizeof p->pad; + NEED((int)sizeof p->fmv); + memcpy(out + o, p->fmv, sizeof p->fmv); o += (int)sizeof p->fmv; return o; } @@ -338,15 +366,21 @@ int bm_pattern_unpack(bm_pattern *p, const uint8_t *in, int len) { int o = 0; GET(64 + (int)sizeof p->trk); - if (in[offsetof(bm_meta, fmt)] != BM_PAT_FMT) return -1; /* hasta la v1, sin compatibilidad hacia atrás */ + int fmt = in[offsetof(bm_meta, fmt)]; + if (fmt != BM_PAT_FMT && fmt != 9) return -1; /* hasta la v1: el de ahora y el anterior (prm de 48) */ bm_pattern_init(p); memcpy(&p->meta, in, 64); p->meta.bpm_x10 = (uint16_t)(in[0] | (in[1] << 8)); p->meta.fmt = BM_PAT_FMT; o = 64; memcpy(p->trk, in + o, sizeof p->trk); o += (int)sizeof p->trk; - GET((int)sizeof p->prm); - memcpy(p->prm, in + o, sizeof p->prm); o += (int)sizeof p->prm; + if (fmt == 9) { + GET(BM_TRACKS * 48); + for (int t = 0; t < BM_TRACKS; t++) { memcpy(p->prm[t], in + o, 48); memset(p->prm[t] + 48, 0, BM_PRM - 48); o += 48; } + } else { + GET((int)sizeof p->prm); + memcpy(p->prm, in + o, sizeof p->prm); o += (int)sizeof p->prm; + } for (int t = 0; t < BM_TRACKS; t++) { /* T1 y T2 no cambian de máquina */ uint8_t e = p->trk[t].engine; if (!bm_engine_ok(t, e)) { p->trk[t].engine = (uint8_t)bm_track_engine(t); p->trk[t].source = 0; bm_preset_apply(p, t, 0); } @@ -377,6 +411,15 @@ int bm_pattern_unpack(bm_pattern *p, const uint8_t *in, int len) } } heavy_fix(p); /* BUNO-6 y BITTAL, una vez cada una */ + for (int t = BM_TR_TRACKS; t < BM_TRACKS; t++) /* BB-303 de antes de sus FX: los de fábrica */ + if (p->trk[t].engine == ENG_ACID && !p->prm[t][AC_OD_G] && !p->prm[t][AC_OD_T] && !p->prm[t][AC_OD_L]) { + uint8_t m = p->prm[t][AC_FX]; + bm_acid_fx_defaults(p->prm[t]); + p->prm[t][AC_FX] = m; + } + for (int t = 1; t < BM_TRACKS; t++) /* B-MINI, BUNO-6, BITTAL de antes de sus FX: los de fábrica */ + if (bm_px_eng(p->trk[t].engine) && !p->prm[t][PX_DS_G] && !p->prm[t][PX_DS_T] && !p->prm[t][PX_DS_L]) + bm_px_fx_defaults(p->prm[t]); for (int t = 0; t < BM_SYN_TRACKS; t++) { GET(3); bm_loop *lp = &p->loop[t]; @@ -398,6 +441,9 @@ int bm_pattern_unpack(bm_pattern *p, const uint8_t *in, int len) if (d->mode >= PAD_MODES) d->mode = PAD_ONESHOT; if (d->pitch > 48) d->pitch = 24; } + GET((int)sizeof p->fmv); + memcpy(p->fmv, in + o, sizeof p->fmv); o += (int)sizeof p->fmv; + for (int i = 0; i < BM_FMV_BYTES; i++) if (p->fmv[i] > bm_fmv_max(i)) p->fmv[i] = (uint8_t)bm_fmv_max(i); if (p->meta.bpm_x10 < 400 || p->meta.bpm_x10 > 2400) p->meta.bpm_x10 = 1200; if (p->meta.swing < 50 || p->meta.swing > 75) p->meta.swing = 50; if (p->meta.master > 8) p->meta.master = 4; @@ -410,6 +456,7 @@ int bm_pattern_unpack(bm_pattern *p, const uint8_t *in, int len) if (tk->length < 1 || tk->length > BM_STEPS) tk->length = 16; if (tk->scl != 0xFF && tk->scl >= BM_SCALES) tk->scl = 0xFF; tk->scl_root %= 12; tk->midi_ch &= 15; + if (tk->qfree > 3) tk->qfree = 0; if (tk->pitch > 48) tk->pitch = 24; } return o; diff --git a/core/bm_pattern.h b/core/bm_pattern.h index 71bf235..94c5963 100644 --- a/core/bm_pattern.h +++ b/core/bm_pattern.h @@ -107,7 +107,7 @@ typedef struct { uint8_t arp_mode, arp_rate, arp_oct, arp_gate; uint8_t speed; /* SPD_* */ uint8_t length; /* notas: 1..64 pasos (TR: largo por instrumento) */ - uint8_t engine; /* ENG_*: T1 y T2 fijos; T3-T6 una de las 5 máquinas de notas */ + uint8_t engine; /* ENG_*: T1 y T2 fijos; T3-T6 una de las 4 máquinas de notas */ uint8_t accent; /* cuánto más fuerte suena un acento (0 = igual) */ uint8_t midi_ch; /* MIDI: canal 0..15 */ uint8_t scl_root, scl; /* escala propia del canal; scl 0xFF = la del proyecto */ @@ -119,7 +119,8 @@ typedef struct { uint8_t djf; /* filtro DJ del canal (K2 de HOME): 0 abierto, 1-63 pasa-bajos, 65-127 pasa-altos */ uint8_t drive; /* HOME FX > CHANNEL K1: soft-clip mono del canal (0 = apagado, no cuesta nada) */ uint8_t bfx_off; /* HOME FX > CHANNEL K4: 1 = el BEAT FX (y el PUNCH) no toca este canal (0 = sí, como siempre) */ - uint8_t rsv[4]; + uint8_t qfree; /* PLAY+REC: lo que se deja sin cuantizar, 0 = 100 % (de fábrica), 1 = 75, 2 = 50, 3 = 25 % */ + uint8_t rsv[3]; } bm_track; /* ------------------------------------------------------------ metadatos: 64 bytes */ @@ -152,6 +153,7 @@ typedef struct { bm_notes nt[BM_SYN_TRACKS]; /* T3..T6 */ bm_loop loop[BM_SYN_TRACKS]; uint8_t prm[BM_TRACKS][BM_PRM]; /* parámetros del motor de cada canal (bm_params.h) */ + uint8_t fmv[BM_FMV_BYTES]; /* BX-7 (una sola por patrón): su voz entera, editable como en el FM-1 */ } bm_pattern; /* Escenas y canción (0.9): una escena = solo mutes (los 6 canales y los instrumentos de BR-8 y @@ -162,9 +164,9 @@ typedef struct { uint8_t n; uint8_t pat[BM_SONG_MAX]; /* patrón (bits 0-3) | (escena + 1) << 4 */ uint8_t rep[BM_SONG_MAX]; - bm_scene scene[BM_SCENES]; + bm_scene scene[BM_PATTERNS][BM_SCENES]; /* 4 escenas por patrón */ } bm_song; -#define BM_SONG_VER 2 /* el objeto canción + escenas en la flash: otro número se ignora (sin conversión) */ +#define BM_SONG_VER 4 /* el objeto canción + escenas en la flash: otro número se ignora (sin conversión) */ static inline int bm_song_pat(uint8_t e) { return e & 15; } static inline int bm_song_scene(uint8_t e) { return (e >> 4) - 1; } /* -1 = sin escena */ @@ -190,10 +192,14 @@ void bm_track_defaults(bm_track *t, int track); void bm_tr_defaults(bm_tr *tr); void bm_pattern_init(bm_pattern *p); void bm_track_clear_events(bm_pattern *p, int track); -bool bm_engine_ok(int track, int engine); /* T1 BR-8, T2 BP-1; T3-T6 cualquiera de las 5 máquinas de notas */ +bool bm_engine_ok(int track, int engine); /* T1 BR-8 y T2 BP-1 fijos; T3-T6 eligen entre BB-303, B-MINI, BUNO-6, BITTAL y BX-7 */ int bm_track_engine(int track); /* la máquina de fábrica del canal */ -/* BUNO-6 (~32 % de CPU, un solo chorus) y BITTAL (sus tablas en RAM): una sola vez por patrón */ -static inline bool bm_engine_heavy(int engine) { return engine == ENG_BUNO || engine == ENG_BITTAL; } +int bm_fmv_max(int i); /* el valor más alto del byte i de la voz de la BX-7 (VCED) */ +/* BUNO-6 (~32 % de CPU, un solo chorus), BITTAL (sus tablas en RAM) y BX-7 (8 voces FM): cada una una + * sola vez por patrón, y no más de BM_HEAVY_MAX a la vez (2026-10-21) */ +#define BM_HEAVY_MAX 2 +static inline bool bm_engine_heavy(int engine) { return engine == ENG_BUNO || engine == ENG_BITTAL || engine == ENG_FM; } +int bm_heavy_count(const bm_pattern *p, int skip); /* pesadas en el patrón, sin contar el canal skip (-1: todas) */ /* el otro canal que ya tiene esa máquina pesada (-1 si no hay o si no es pesada) */ int bm_machine_conflict(const bm_pattern *p, int track, int engine); /* T3-T6: cambia de máquina. Las notas, el largo y la mezcla quedan; el sonido pasa al primer preset diff --git a/core/bm_rom.h b/core/bm_rom.h index 35e4483..b47032c 100644 --- a/core/bm_rom.h +++ b/core/bm_rom.h @@ -21,7 +21,7 @@ typedef struct { extern const bm_rom_loop bm_rom_loops[]; /* Patches de fábrica del motor FM (tools/gen_fm.py): voz de la DX7 sin empaquetar, 156 bytes. */ -#define BM_FM_PATCHES 20 +#define BM_FM_PATCHES 31 extern const uint8_t bm_fm_rom[BM_FM_PATCHES][156]; extern const char bm_fm_names[BM_FM_PATCHES][9]; extern const int bm_rom_nloops; diff --git a/core/bm_seq.c b/core/bm_seq.c index 569236f..1ad6bd3 100644 --- a/core/bm_seq.c +++ b/core/bm_seq.c @@ -9,6 +9,7 @@ * compás y con una semilla, qué slice suena en cada paso. */ #include #include "bm_audio.h" +#include "bm_params.h" #include "bm_util.h" static const uint8_t ARP_RATE[3] = {48, 24, 12}; @@ -177,6 +178,8 @@ void bm_gen_decide(bm_ctx *c, uint32_t blk) c->gen_blk = blk + 1; } +static bool live_now(const bm_ctx *c, int t, uint8_t note); + static void fire_tr(bm_ctx *c, int t, uint32_t n, int tps, bool fill) { const bm_tr *tr = bm_trk_tr(c->pat, t); @@ -196,6 +199,7 @@ static void fire_tr(bm_ctx *c, int t, uint32_t n, int tps, bool fill) int cond = (b & ST_COND_MASK) >> ST_COND_SH; if ((cond == 1 && !fill) || (cond == 2 && fill)) continue; uint8_t note = (uint8_t)l; + if (live_now(c, t, note)) continue; /* se está tocando en vivo (grabando): no dos veces */ if (sub != 0xFF) { if (fired) continue; note = sub; } /* BREAK cambió el pad: suena uno solo */ if (fx & GEN_REV) note |= BRK_REV; if (fx & GEN_HALF) note |= BRK_HALF; @@ -208,13 +212,20 @@ static void fire_tr(bm_ctx *c, int t, uint32_t n, int tps, bool fill) /* ------------------------------------------------------------ canales de notas */ /* Una nota del paso s. El largo es en pasos; con gate (REC expresivo) el último paso suena solo ese * porcentaje, y con TIE se liga a la siguiente (slide). */ +/* grabando ese canal, la nota que se está tocando en vivo no se repite desde el patrón (recién grabada + * un poco antes del paso, sonaría dos veces y su gate cortaría la que sostienes) */ +static bool live_now(const bm_ctx *c, int t, uint8_t note) +{ + return c->rec && c->rec_trk == t && ((c->live_held[t][(note & 127) >> 5] >> (note & 31)) & 1u); +} + static int fire_ev(bm_ctx *c, int t, int s, int k, int tps, bool fill) { int i = t - BM_TR_TRACKS; const bm_track *tr = &c->pat->trk[t]; bm_engine *e = &c->eng[t]; const bm_event *ev = bm_evc(c->pat, t, s, k); - if (bm_event_empty(ev) || tr->mute) return 0; + if (bm_event_empty(ev) || tr->mute || live_now(c, t, ev->note)) return 0; if (ev->prob == BM_PROB_FILL) { if (!fill) return 0; } else if (ev->prob == BM_PROB_NOFILL) { if (fill) return 0; } else if (!c->fill && ev->prob < 100 && (bm_xorshift32(&c->rng) % 100u) >= ev->prob) return 0; @@ -225,13 +236,14 @@ static int fire_ev(bm_ctx *c, int t, int s, int k, int tps, bool fill) if (legato) e->vt->set_macro(e, BM_MACRO_LEGATO, 1); int nv = bm_vel(c, t, 0); int vel = ev->vel >= BM_VEL_ACC ? 127 : bm_clampi(nv * ev->vel / BM_VEL_NORMAL, 1, 127); + if ((tr->engine == ENG_ACID || tr->engine == ENG_MINI) && ev->vel < BM_VEL_ACC) vel = bm_clampi(ev->vel, 1, 110); /* 303 y B-MINI: acento = 127, el del paso (SCL) */ e->vt->note_on(e, ev->note, (uint8_t)vel); if (c->gate[i][k].ticks && prev != ev->note) e->vt->note_off(e, prev); int l = ev->len & BM_LEN_MASK; if (l < 1) l = 1; c->gate[i][k].note = ev->note; c->gate[i][k].tie = (ev->len & BM_LEN_TIE) ? 1 : 0; - int ticks = c->gate[i][k].tie ? l * tps + tps / 4 : l * tps - 4; + int ticks = c->gate[i][k].tie ? l * tps + tps / 2 : l * tps - 4; if (!c->gate[i][k].tie && ev->gate >= 10 && ev->gate < 100) ticks = (l - 1) * tps + bm_clampi(tps * ev->gate / 100, 2, tps - 2); c->gate[i][k].ticks = (uint16_t)(ticks > 1 ? ticks : 1); return 1; @@ -260,7 +272,9 @@ static void fire_syn(bm_ctx *c, int t, uint32_t n, int tps, bool fill) { const bm_track *tr = &c->pat->trk[t]; int len = tr->length ? tr->length : 16; - int s = (int)(n % (uint32_t)len), s1 = (int)((n + 1) % (uint32_t)len); + int master = bm_master_steps(&c->pat->meta) * BM_TICKS_STEP; + uint32_t n1 = master && (n + 1) * (uint32_t)tps >= (uint32_t)master ? 0 : n + 1; /* el maestro vuelve a 0 */ + int s = (int)(n % (uint32_t)len), s1 = (int)(n1 % (uint32_t)len); int fired = 0; for (int k = 0; k < BM_EVENTS; k++) { const bm_event *ev = bm_evc(c->pat, t, s, k); @@ -380,6 +394,7 @@ void bm_mutes_set(bm_pattern *p, uint8_t tm, const uint16_t lm[BM_TR_TRACKS]) static void do_swap(bm_ctx *c, int to) { + c->dq_n = 0; /* lo que esperaba era del patrón de antes */ if (to < 0 || to == c->cur_pat || !c->swap) return; syn_gates_off(c); uint16_t lm[BM_TR_TRACKS]; @@ -404,8 +419,8 @@ static void do_swap(bm_ctx *c, int to) static void apply_scene(bm_ctx *c, int idx) { - if (!c->song || idx < 0 || idx >= BM_SCENES || !(c->song->scene[idx].flags & SCN_STORED)) return; - const bm_scene *s = &c->song->scene[idx]; + if (!c->song || idx < 0 || idx >= BM_SCENES || !(c->song->scene[c->cur_pat % BM_PATTERNS][idx].flags & SCN_STORED)) return; + const bm_scene *s = &c->song->scene[c->cur_pat % BM_PATTERNS][idx]; bm_mutes_set(c->pat, s->trk_mute, s->lane_mute); c->st.scene = (uint8_t)idx; c->st.edits++; @@ -436,9 +451,19 @@ static void scene_step(bm_ctx *c) c->st.scene_q = c->scene_q < 0 ? 0xFF : (uint8_t)c->scene_q; } -/* Cada compás: la escena que se lanzó y los mutes de CUE, todo junto (después del cambio de patrón). */ +/* Cada compás: el patrón en cola (entra desde su primer paso), la escena que se lanzó y los mutes de + * CUE, todo junto. Un patrón en cola espera al final del compás en curso, no al del ciclo maestro. */ static void bar(bm_ctx *c) { + if (c->queued >= 0 && c->pchain_n <= 1) { + int to = c->queued; + c->queued = -1; + c->st.queued = 0xFF; + if (to != c->cur_pat) { + do_swap(c, to); + if (c->cur_pat == to) { c->rtick = 0; c->st.loops++; } /* si el cambio falló, sigue el patrón de antes */ + } + } if (c->scene_q >= 0 && c->scene_bar) scene_step(c); if (c->cue_x) { for (int t = 0; t < BM_TRACKS; t++) if ((c->cue_x >> t) & 1) c->pat->trk[t].mute ^= 1; @@ -568,6 +593,36 @@ static bool arp_active(const bm_ctx *c, int t) return c->arp[t].on || c->pat->trk[t].arp_mode != 0; } +/* Con REC sonando en este canal, la nota del arpegiador queda en el patrón (2026-10-21: "lo que + * arpegia se graba"): en el paso más cercano, con su largo en pasos o su gate si es más corta. */ +static void arp_record(bm_ctx *c, int t, uint8_t note, int ticks) +{ + int tps = bm_track_tps(c, t), len = c->pat->trk[t].length ? c->pat->trk[t].length : 16; + int master = bm_master_steps(&c->pat->meta) * BM_TICKS_STEP; + uint32_t q = (c->rtick + (uint32_t)tps / 2u) / (uint32_t)tps; + if (master) q %= ((uint32_t)master + (uint32_t)tps - 1u) / (uint32_t)tps; /* pasado el final del maestro: el 0 */ + int s = (int)(q % (uint32_t)len), slot = -1; + for (int k = 0; k < BM_EVENTS; k++) { + const bm_event *ev = bm_evc(c->pat, t, s, k); + if (!bm_event_empty(ev) && ev->note == note) { slot = k; break; } + if (slot < 0 && bm_event_empty(ev)) slot = k; + } + if (slot < 0) return; + bm_event *ev = bm_ev(c->pat, t, s, slot); + bm_event_clear(ev); + ev->note = note; ev->vel = 100; + ev->len = (uint8_t)bm_clampi((ticks + tps / 2) / tps, 1, BM_STEPS); + ev->gate = ticks < tps ? (uint8_t)bm_clampi(ticks * 100 / tps, 10, 89) : 0; +} + +static bool arp_latch(const bm_ctx *c, int t) +{ + int eng = c->pat->trk[t].engine; + return (eng == ENG_FM && c->pat->prm[t][BX_LATCH]) || (eng == ENG_ACID && c->pat->prm[t][AC_LATCH]) || (bm_panel_eng(eng) && c->pat->prm[t][PX_LATCH]); +} + +/* El arpegiador del FM-1 de fábrica: UP, DOWN, INCL (sube y baja repitiendo los extremos), EXCL (sin + * repetirlos), RANDOM, ORDER (como se tocaron) y REPEAT (cada nota dos veces), de 1 a 4 octavas. */ static void arp_tick(bm_ctx *c) { for (int t = BM_TR_TRACKS; t < BM_TRACKS; t++) { @@ -576,25 +631,33 @@ static void arp_tick(bm_ctx *c) const bm_track *tr = &c->pat->trk[t]; bm_engine *e = &c->eng[t]; if (a->playing && a->gate_left && --a->gate_left == 0) { e->vt->note_off(e, a->cur); a->playing = 0; } + if (a->n && a->down == 0 && !arp_latch(c, t)) { /* LATCH se apagó con las teclas sueltas: para (FM-1) */ + a->n = 0; + if (a->playing) { e->vt->note_off(e, a->cur); a->playing = 0; } + } if (!arp_active(c, t) || a->n == 0) continue; uint8_t rate = ARP_RATE[tr->arp_rate % 3]; - if (c->st.free_ticks % rate) continue; + if ((c->playing ? c->btick : c->st.free_ticks) % rate) continue; /* sonando: en fase con el compás */ if (a->playing) { e->vt->note_off(e, a->cur); a->playing = 0; } - int oct = tr->arp_oct < 1 ? 1 : (tr->arp_oct > 3 ? 3 : tr->arp_oct); + int oct = tr->arp_oct < 1 ? 1 : (tr->arp_oct > 4 ? 4 : tr->arp_oct); int total = a->n * oct; - int mode = tr->arp_mode ? tr->arp_mode : 1; + int mode = tr->arp_mode % ARP_MODES ? tr->arp_mode % ARP_MODES : ARP_UP; + const uint8_t *src = mode == ARP_ORDER ? a->ord : a->held; int i; - if (mode == 4) i = (int)(bm_xorshift32(&c->rng) % (uint32_t)total); - else if (mode == 2) { i = total - 1 - (a->idx % total); a->idx++; } - else if (mode == 3 && total > 1) { int period = 2 * total - 2, p = a->idx % period; i = p < total ? p : period - p; a->idx++; } + if (mode == ARP_RANDOM) i = (int)(bm_xorshift32(&c->rng) % (uint32_t)total); + else if (mode == ARP_DOWN) { i = total - 1 - (a->idx % total); a->idx++; } + else if (mode == ARP_EXCL && total > 1) { int period = 2 * total - 2, p = a->idx % period; i = p < total ? p : period - p; a->idx++; } + else if (mode == ARP_INCL) { int period = 2 * total, p = a->idx % period; i = p < total ? p : period - 1 - p; a->idx++; } + else if (mode == ARP_REPEAT) { i = (a->idx / 2) % total; a->idx++; } else { i = a->idx % total; a->idx++; } - int note = a->held[i % a->n] + 12 * (i / a->n); + int note = src[i % a->n] + 12 * (i / a->n); a->cur = (uint8_t)(note > 127 ? 127 : note); e->vt->note_on(e, a->cur, 100); if (c->lp[t - BM_TR_TRACKS].mode == LOOP_REC || c->lp[t - BM_TR_TRACKS].mode == LOOP_DUB) loop_record(c, t - BM_TR_TRACKS, a->cur, 100); a->playing = 1; a->gate_left = (uint16_t)(rate * (tr->arp_gate ? tr->arp_gate : 50) / 100); if (!a->gate_left) a->gate_left = 1; + if (c->rec && c->playing && c->rec_trk == t) arp_record(c, t, a->cur, a->gate_left); } } @@ -688,21 +751,34 @@ void bm_live_note(bm_ctx *c, int t, uint8_t note, uint8_t vel, int on) { if (t < 0 || t >= BM_TRACKS) return; bm_engine *e = &c->eng[t]; + if (on && !(t >= BM_TR_TRACKS && is_note(c, t) && arp_active(c, t))) c->live_held[t][(note & 127) >> 5] |= 1u << (note & 31); + else if (!on) c->live_held[t][(note & 127) >> 5] &= ~(1u << (note & 31)); if (!on) for (int i = 0; i < 8; i++) if (c->strum[i].vel && c->strum[i].track == t && c->strum[i].note == note) c->strum[i].vel = 0; if (t >= BM_TR_TRACKS && is_note(c, t) && arp_active(c, t)) { bm_arp *a = &c->arp[t]; + int latch = arp_latch(c, t); if (on) { + if (latch && a->down == 0) a->n = 0; /* LATCH: soltaste todas, esto es otro acorde */ + if (a->down < 255) a->down++; for (int i = 0; i < a->n; i++) if (a->held[i] == note) return; if (a->n >= 8) return; + a->ord[a->n] = note; int i = a->n++; while (i > 0 && a->held[i - 1] > note) { a->held[i] = a->held[i - 1]; i--; } a->held[i] = note; if (a->n == 1) a->idx = 0; } else { + int in = 0; + for (int i = 0; i < a->n; i++) in |= a->held[i] == note; + if (!in && a->down == 0) { e->vt->note_off(e, note); return; } /* sonó antes de prender el arpegiador */ + if (a->down) a->down--; + if (latch) return; /* LATCH: sigue sonando lo que tocaste */ + for (int i = 0; i < a->n; i++) + if (a->held[i] == note) { memmove(&a->held[i], &a->held[i + 1], (size_t)(a->n - i - 1)); break; } for (int i = 0; i < a->n; i++) - if (a->held[i] == note) { memmove(&a->held[i], &a->held[i + 1], (size_t)(a->n - i - 1)); a->n--; break; } + if (a->ord[i] == note) { memmove(&a->ord[i], &a->ord[i + 1], (size_t)(a->n - i - 1)); a->n--; break; } if (a->n == 0 && a->playing) { e->vt->note_off(e, a->cur); a->playing = 0; } } return; @@ -710,7 +786,9 @@ void bm_live_note(bm_ctx *c, int t, uint8_t note, uint8_t vel, int on) if (t >= BM_TR_TRACKS && is_note(c, t)) loop_record(c, t - BM_TR_TRACKS, note, on ? vel : 0); if (on) { if (t == 1) note = (uint8_t)(note | (((c->brk_live & 1) ? BRK_REV : 0) | ((c->brk_live & 2) ? BRK_HALF : 0))); + e->live_next = 1; e->vt->note_on(e, note, vel); + e->live_next = 0; if (bm_is_tr(c->pat, t)) c->st.lane_trig[t] |= (uint16_t)(1u << (note & 15)); } else e->vt->note_off(e, note); } diff --git a/core/bm_slicer.c b/core/bm_slicer.c new file mode 100644 index 0000000..22f2737 --- /dev/null +++ b/core/bm_slicer.c @@ -0,0 +1,450 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later + * Copyright (C) 2026 Erbubar23 */ +/* Bubba Machine — el Slicer (T2) por dentro, 2026-10-22: un sampler de pads como el KO II que ya + * teníamos (cada pad, su inicio y su largo dentro de una toma; pueden encimarse). Sus botones: + * SEQ la rejilla por pasos (V_CH, la de la batería); SEQ otra vez: LENGTH AND SPEED + * LFO, SCL en la rejilla: ACCENTS y MUTE PADS + * EDIT TRIM: la onda de la toma con el pad, START LENGTH ZOOM; negras AUTO, 8 y 16 cortan la + * toma del pad en los pads 1..n y escriben la secuencia que suena como ella; la negra 11 + * (SAMPLE) graba lo que suena (K4: cuántos compases) · SOUND: PITCH LEVEL MODE REVERSE + * ENV ATTACK RELEASE y el loop del modo LOOP (LOOP START / END) + * FX como las de panel: DISTORTION; pág 2 CHORUS y REVERB (el DELAY, desde HOME) + * GLO LENGTH (todos los pads), MIDI CH, MIDI OUT; pág 2 RESET + * blancas los 16 pads (suena y se elige) · ALGORITHM el pad · PRESETS su toma (entera) + * Un menú con páginas no se sale: su botón otra vez pasa a la siguiente; el de una página, otra vez, + * vuelve a la rejilla. HOME sale a la consola. */ +#include +#include +#include "bm_mach.h" +#include "bm_util.h" +#include "bm_params.h" +#include "bm_lang.h" + +#define SL 1 /* el canal del Slicer (pista interna T2) */ + +const char *const slicer_mode_names[PAD_MODES] = {"ONESHOT", "KEY", "THRU", "LOOP"}; +static const char *const DIRS[2] = {"FWD", "REV"}; +static const char *const ZOOMS[4] = {"X1", "X2", "X4", "X8"}; + +/* lo que mueve cada perilla del Slicer (además de las de siempre: K_PRM, K_ON, K_TRK) */ +enum { S_START = 1, S_LEN, S_ZOOM, S_BARS, S_PITCH, S_LEVEL, S_MODE, S_REV, S_ATK, S_REL, S_LOOPS, S_LOOPE, S_KLEN, S_RST }; +#define SK(n, id, mx) {n, K_SLICE, id, 0, mx, F_INT, NULL} + +static const bxp SL_EDIT[2][4] = { + {SK("START", S_START, 255), SK("LENGTH", S_LEN, 255), SK("ZOOM", S_ZOOM, 3), SK("SAMPLE", S_BARS, 2)}, + {SK("PITCH", S_PITCH, 48), SK("LEVEL", S_LEVEL, 127), SK("MODE", S_MODE, PAD_MODES - 1), SK("REVERSE", S_REV, 1)}}; +static const char *const SL_EDIT_N[2] = {"TRIM", "SOUND"}; +static const bxp SL_ENV[4] = {SK("ATTACK", S_ATK, 127), SK("RELEASE", S_REL, 127), SK("LOOP IN", S_LOOPS, 254), SK("LOOP OUT", S_LOOPE, 255)}; +static const bxp SL_FX[2][4] = { + {{"DRIVE", K_PRM, PX_DS_G, 0, 127, F_PCT, NULL}, {"TONE", K_PRM, PX_DS_T, 0, 127, F_PCT, NULL}, + {"LEVEL", K_PRM, PX_DS_L, 0, 127, F_PCT, NULL}, {"ON", K_ON, PXF_DIST, 0, 1, F_ONOFF, NULL}}, + {{"CHORUS", K_PRM, PX_CHORUS, 0, 2, F_LIST, bm_px_chorus_names}, NONE, + {"REVERB", K_TRK, TRK(rsend), 0, 127, F_PCT, NULL}, {"REV ON", K_ON, PXF_REVERB, 0, 1, F_ONOFF, NULL}}}; +static const bxp SL_GLO[2][4] = { + {SK("LENGTH", S_KLEN, BM_STEPS), NONE, {"MIDI CH", K_TRK, TRK(midi_ch), 0, 15, F_CH, NULL}, {"MIDI OUT", K_TRK, TRK(midi_out), 0, 1, F_ONOFF, NULL}}, + {NONE, NONE, NONE, SK("RESET", S_RST, 1)}}; +/* la rejilla (V_CH): LEVEL, LENGTH (todos los pads), PITCH y RELEASE del pad elegido */ +static const bxp SL_GRID[4] = {SK("LEVEL", S_LEVEL, 127), SK("LENGTH", S_KLEN, BM_STEPS), SK("PITCH", S_PITCH, 48), SK("RELEASE", S_REL, 127)}; + +static int pad_sel(const bm_app *a) { return a->sel_lane[SL] & 15; } +static bm_pad *pad_of(bm_app *a) { return &a->pat.pad[pad_sel(a)]; } +static const bm_pad *cpad(const bm_app *a) { return &a->pat.pad[pad_sel(a)]; } + +int slicer_page_of(int btn) +{ + switch (btn) { + case BTN_EDIT: return BXP_MAIN; + case BTN_ENV: return BXP_ENV; + case BTN_FX: return BXP_FX; + case BTN_GLO: return BXP_GLO; + default: return -1; /* SEQ, LFO y SCL: la rejilla */ + } +} + +static int pages(int p) { return p == BXP_ENV ? 1 : 2; } +int slicer_sub(const bm_app *a) { return a->bx.sub[a->bx.page % BXP_N] % pages(a->bx.page); } + +const bxp *slicer_knobs(const bm_app *a) +{ + int s = slicer_sub(a); + switch (a->bx.page) { + case BXP_ENV: return SL_ENV; + case BXP_FX: return SL_FX[s]; + case BXP_GLO: return SL_GLO[s]; + default: return SL_EDIT[s]; + } +} + +/* ------------------------------------------------------------ la toma del pad y la ventana de TRIM */ +bool slicer_take(const bm_app *a, int pad, bm_smp_src *m) +{ + const bm_pad *p = &a->pat.pad[pad & 15]; + return bm_pad_ok(p) && bm_app_src_info(a, p->src, m) && m->len; +} + +/* la ventana de la onda: la toma entera (X1) o, con zoom, alrededor del inicio del pad (a un tercio, + * para ver más de lo que sigue) */ +void slicer_view(const bm_app *a, uint32_t *v0, uint32_t *v1) +{ + bm_smp_src m; + *v0 = *v1 = 0; + if (!slicer_take(a, pad_sel(a), &m)) return; + uint32_t span = m.len >> (a->bx.szoom & 3), at = cpad(a)->start; + if (span < 232) span = m.len < 232 ? m.len : 232; + uint32_t s = at > span / 3 ? at - span / 3 : 0; + if (s + span > m.len) s = m.len - span; + *v0 = s; *v1 = s + span; +} + +/* compases que entran en una toma nueva (SAMPLE): 1, 2 o 4, los que caben en la RAM de grabación */ +static uint32_t bar_samples(const bm_app *a) { return (uint32_t)BM_SMP_RATE * 2400u / (a->pat.meta.bpm_x10 ? a->pat.meta.bpm_x10 : 1200u); } +static int bars_of(int i) { return 1 << (i & 3); } +static int bars_max(const bm_app *a) /* el índice más alto que cabe (0 = 1 compás) */ +{ + int i = 2; + while (i > 0 && (uint32_t)bars_of(i) * bar_samples(a) > BM_SMP_REC_MAX) i--; + return i; +} +static int bars_idx(const bm_app *a) { int i = a->bx.sbars > 2 ? 0 : a->bx.sbars, mx = bars_max(a); return i > mx ? mx : i; } + +/* ------------------------------------------------------------ leer y escribir */ +int slicer_get(const bm_app *a, const bxp *p) +{ + if (p->kind != K_SLICE) return mach_get(a, p); + const bm_pad *d = cpad(a); + const bm_tr *tr = &a->pat.tr[SL]; + switch (p->idx) { + case S_START: return d->start; + case S_LEN: return d->len; + case S_ZOOM: return a->bx.szoom & 3; + case S_BARS: return bars_idx(a); + case S_PITCH: return d->pitch; + case S_LEVEL: return tr->lane[pad_sel(a)].level; + case S_MODE: return d->mode % PAD_MODES; + case S_REV: return (d->flags & PAD_REV) != 0; + case S_ATK: return d->attack; + case S_REL: return d->release; + case S_LOOPS: return d->loop_s; + case S_LOOPE: return d->loop_e; + case S_KLEN: return tr->lane[pad_sel(a)].len ? tr->lane[pad_sel(a)].len : 16; + default: return 0; + } +} + +/* ¿la perilla hace algo ahora? (el loop solo en modo LOOP; el pad vacío no tiene sonido que tocar) */ +bool slicer_live(const bm_app *a, const bxp *p) +{ + if (p->kind == K_NONE) return false; + if (p->kind != K_SLICE) return true; + bool ok = bm_pad_ok(cpad(a)); + switch (p->idx) { + case S_LOOPS: case S_LOOPE: return ok && cpad(a)->mode == PAD_LOOP; + case S_START: case S_LEN: case S_PITCH: case S_MODE: case S_REV: case S_ATK: case S_REL: return ok; + default: return true; + } +} + +static void ms(char *b, int cap, uint32_t samples) +{ + unsigned t = (unsigned)(samples * 1000u / BM_SMP_RATE); + if (t >= 1000) snprintf(b, (size_t)cap, "%u.%03u S", t / 1000, t % 1000); + else snprintf(b, (size_t)cap, "%u MS", t); +} + +void slicer_fmt(const bm_app *a, const bxp *p, int v, char *b, int cap) +{ + if (p->kind != K_SLICE) { mach_fmt(p, v, b, cap); return; } + switch (p->idx) { + case S_START: case S_LEN: ms(b, cap, (uint32_t)v); break; + case S_ZOOM: snprintf(b, (size_t)cap, "%s", ZOOMS[v & 3]); break; + case S_BARS: snprintf(b, (size_t)cap, v ? "%d BARS" : "%d BAR", bars_of(v)); break; + case S_PITCH: snprintf(b, (size_t)cap, v > 24 ? "+%d ST" : "%d ST", v - 24); break; /* el snprintf del SDK no tiene %+d */ + case S_MODE: snprintf(b, (size_t)cap, "%s", slicer_mode_names[v % PAD_MODES]); break; + case S_REV: snprintf(b, (size_t)cap, "%s", DIRS[v & 1]); break; + case S_ATK: snprintf(b, (size_t)cap, "%u MS", (unsigned)bm_attack_ms(v)); break; + case S_REL: case S_LEVEL: snprintf(b, (size_t)cap, "%d%%", (v * 100 + 63) / 127); break; + case S_LOOPS: snprintf(b, (size_t)cap, "%d%%", v * 100 / 255); break; + case S_LOOPE: if (v) snprintf(b, (size_t)cap, "%d%%", v * 100 / 255); else snprintf(b, (size_t)cap, "%s", "END"); break; + case S_KLEN: snprintf(b, (size_t)cap, v > 1 ? "%d STEPS" : "%d STEP", v); break; + case S_RST: snprintf(b, (size_t)cap, "%s", "TURN"); break; + default: snprintf(b, (size_t)cap, "%d", v); break; + } +} + +int slicer_pct(const bm_app *a, const bxp *p, int v) +{ + if (p->kind != K_SLICE) return mach_pct(p, v); + bm_smp_src m; + switch (p->idx) { + case S_START: return slicer_take(a, pad_sel(a), &m) ? (int)((uint32_t)v * 255u / m.len) : 0; + case S_LEN: return slicer_take(a, pad_sel(a), &m) ? (int)((uint32_t)v * 255u / m.len) : 0; + case S_BARS: return v * 127; + case S_KLEN: return (v - 1) * 255 / (BM_STEPS - 1); + default: return p->max ? v * 255 / p->max : 0; + } +} + +/* Todos los pads vuelven al sonido de fábrica (los cortes quedan) y los efectos a los de fábrica */ +static void sound_reset(bm_app *a) +{ + for (int i = 0; i < BM_LANES; i++) { + bm_pad *d = &a->pat.pad[i]; + d->pitch = 24; d->mode = PAD_ONESHOT; d->flags &= (uint8_t)~PAD_REV; + d->attack = 0; d->release = 20; d->loop_s = 0; d->loop_e = 0; /* como un pad nuevo (bm_pad_clear) */ + app_push_i(a, CMD_SET_LANE, SL, (uint8_t)i, LN_LEVEL, 100); + } + bm_px_fx_defaults(a->pat.prm[SL]); + app_edited(a); + app_toast(a, "SOUND RESET"); +} + +/* K de TRIM: START mueve el inicio (el final queda), LENGTH el final. De a dos columnas de la ventana + * por detent (con aceleración); ni más corto que 64 muestras ni fuera de la toma. */ +static int trim(bm_app *a, int which, int d) +{ + bm_smp_src m; + if (!slicer_take(a, pad_sel(a), &m)) return -1; + bm_pad *p = pad_of(a); + uint32_t v0, v1; + slicer_view(a, &v0, &v1); + int32_t px = (int32_t)((v1 - v0) / 116u); + if (px < 8) px = 8; + int32_t end = (int32_t)p->start + p->len; + if (end > (int32_t)m.len) end = (int32_t)m.len; + if (which == 0) { + int32_t s = bm_clampi((int32_t)p->start + d * px, 0, end - 64); + p->start = (uint16_t)s; p->len = (uint16_t)(end - s); + } else { + int32_t e = bm_clampi(end + d * px, (int32_t)p->start + 64, (int32_t)m.len); + p->len = (uint16_t)(e - (int32_t)p->start); + } + app_edited(a); + return which ? p->len : p->start; +} + +int slicer_turn(bm_app *a, const bxp *p, int d) +{ + if (p->kind != K_SLICE) return mach_turn(a, p, d); + if (!slicer_live(a, p)) return -1; /* sin función ahora: no hace nada */ + bm_pad *q = pad_of(a); + int l = pad_sel(a), cur = slicer_get(a, p), v; + int step = p->max <= 16 ? app_lst(a, d) : d; + switch (p->idx) { + case S_START: return trim(a, 0, d); + case S_LEN: return trim(a, 1, d); + case S_ZOOM: v = bm_clampi(cur + step, 0, 3); a->bx.szoom = (uint8_t)v; return v == cur ? -1 : v; + case S_BARS: v = bm_clampi(cur + step, 0, bars_max(a)); a->bx.sbars = (uint8_t)v; return v == cur ? -1 : v; + case S_RST: sound_reset(a); return -1; + case S_KLEN: app_kit_len(a, SL, p == &SL_GRID[1] ? 1 : 0, d); return -1; /* el aviso lo da ella (K2 en la rejilla, K1 en GLO) */ + default: break; + } + v = bm_clampi(cur + step, 0, p->max); + if (v == cur) return -1; + switch (p->idx) { + case S_PITCH: q->pitch = (uint8_t)v; break; + case S_LEVEL: app_push_i(a, CMD_SET_LANE, SL, (uint8_t)l, LN_LEVEL, v); break; + case S_MODE: q->mode = (uint8_t)v; break; + case S_REV: q->flags = (uint8_t)(v ? q->flags | PAD_REV : q->flags & ~PAD_REV); break; + case S_ATK: q->attack = (uint8_t)v; break; + case S_REL: q->release = (uint8_t)v; break; + case S_LOOPS: q->loop_s = (uint8_t)v; if (q->loop_e && q->loop_e <= v) q->loop_e = (uint8_t)(v + 1); break; + case S_LOOPE: if (v && v <= q->loop_s) v = q->loop_s + 1; q->loop_e = (uint8_t)v; break; + default: return -1; + } + app_edited(a); + return v; +} + +void slicer_legend_of(const bm_app *a, const bxp *P, bm_legend L[4]) +{ + char b[12]; + for (int k = 0; k < 4; k++) { + if (!slicer_live(a, &P[k])) continue; /* sin función: nada (ni el nombre) */ + int v = slicer_get(a, &P[k]); + slicer_fmt(a, &P[k], v, b, sizeof b); + app_layer_legend(a, L, k, P[k].name, b, slicer_pct(a, &P[k], v)); + } +} + +void slicer_legend(const bm_app *a, bm_legend L[4]) { slicer_legend_of(a, slicer_knobs(a), L); } + +/* el giro: en TRIM y SOUND las perillas están dibujadas (sin el recuadro grande); en las demás, la + * línea de arriba dice qué se movió */ +static void turned(bm_app *a, int k, const bxp *p, int v) +{ + if (v < 0) return; + if (a->view == V_MACH && a->bx.page == BXP_MAIN) { a->ov.on = 0; return; } + char b[12], ti[22]; + slicer_fmt(a, p, v, b, sizeof b); + snprintf(ti, sizeof ti, "P%d %s", pad_sel(a) + 1, T(p->name)); + app_overlay(a, k, ti, b, "", slicer_pct(a, p, v), p->idx == S_PITCH && p->kind == K_SLICE ? 128 : -1, bm_knob_color(k)); +} + +/* la rejilla (V_CH): K1-K4 del pad elegido */ +void slicer_grid_knob(bm_app *a, int k, int d) { if (k >= 0 && k < 4) turned(a, k, &SL_GRID[k], slicer_turn(a, &SL_GRID[k], d)); } +void slicer_grid_legend(const bm_app *a, bm_legend L[4]) { slicer_legend_of(a, SL_GRID, L); } + +/* ------------------------------------------------------------ cortar y grabar */ +static void cut(bm_app *a, int how) +{ + const bm_pad *p = cpad(a); + if (!bm_pad_ok(p) || p->src >= BM_TAKES) return; /* pad vacío: no hay qué cortar */ + int n = app_kit_from_take(a, p->src, how); + char b[30]; + snprintf(b, sizeof b, TF("%d PADS + SEQUENCE"), n); + app_toast(a, b); +} + +/* SAMPLE: graba lo que suena (la mezcla) desde el próximo compás, los compases de K4; parado, + * empieza con PLAY. Otra vez: para. La toma se guarda al parar y queda en el pad elegido. */ +static void sample(bm_app *a) +{ + const bm_status *st = &a->ctx.st; + if (st->smp_rec || st->smp_armed) { app_push_i(a, CMD_SMP_REC, 0, 0, 0, 0); app_toast(a, "SAMPLE STOPPED"); return; } + if (st->smp_unsaved) { app_toast(a, "STOP: THE LAST SAMPLE IS SAVED FIRST"); return; } + uint32_t cap = (uint32_t)bars_of(bars_idx(a)) * bar_samples(a); + if (cap > BM_SMP_REC_MAX) cap = BM_SMP_REC_MAX; + if (cap > bm_app_rec_room(a)) { app_toast(a, "NO ROOM: DELETE A TAKE"); return; } + app_push_i(a, CMD_SMP_REC, 2, 0, 0, (int32_t)cap); + app_toast(a, app_playing(a) ? "SAMPLE: NEXT BAR" : "SAMPLE ARMED: PRESS PLAY"); +} + +/* ------------------------------------------------------------ botones, teclas y perillas */ +bool slicer_button(bm_app *a, int id, bm_gkind k) +{ + if (id == BTN_REC) { /* REC: graba los pads que tocas; 2 s borra la secuencia */ + if (k == G_LONG) mach_rec(a, k); + else if (k == G_TAP) app_rec_set(a, !a->rec); + return true; + } + if (k != G_TAP && k != G_HOLD) return true; + if (id == BTN_SEQ || id == BTN_LFO || id == BTN_SCL) { /* la rejilla, o su capa */ + app_slicer_grid(a, id == BTN_LFO ? L_ACC : id == BTN_SCL ? L_MUTE : L_NONE); + return true; + } + int p = slicer_page_of(id); + if (p < 0) return true; /* lo demás (OCT, ARP...) no hace nada */ + bm_bx7ui *u = &a->bx; + if (u->page != p) { u->page = (uint8_t)p; u->sub[p] = 0; } + else if (pages(p) > 1) u->sub[p] = (uint8_t)((u->sub[p] + 1) % pages(p)); /* la siguiente, en círculo */ + else { app_slicer_grid(a, L_NONE); return true; } /* de una página: otra vez, la rejilla */ + a->ov.on = 0; + return true; +} + +void slicer_key(bm_app *a, int k, int w, int b) +{ + if (w >= 0) { app_pad_down(a, k, w); return; } /* blancas: los pads */ + if (a->bx.page != BXP_MAIN || slicer_sub(a) != 0) return; /* las negras, solo en TRIM */ + switch (b) { + case 0: cut(a, 0); return; /* AUTO: en los golpes */ + case 1: cut(a, 8); return; + case 2: cut(a, 16); return; + case 10: sample(a); return; + default: return; + } +} + +void slicer_encoder(bm_app *a, int id, int d) +{ + char b[24]; + switch (id) { + case ENC_SELECT: return; /* las páginas, con su botón */ + case ENC_ALGO: { /* el pad */ + int v = bm_clampi(pad_sel(a) + app_lst(a, d), 0, BM_LANES - 1); + if (v == pad_sel(a)) return; + a->sel_lane[SL] = (uint8_t)v; + if (bm_pad_ok(cpad(a))) bm_app_src_name(a, cpad(a)->src, b, sizeof b); else snprintf(b, sizeof b, "%s", T("EMPTY")); + char ti[12]; snprintf(ti, sizeof ti, TF("PAD %d"), v + 1); + if (a->bx.page == BXP_MAIN) a->ov.on = 0; /* TRIM y SOUND ya lo muestran */ + else app_overlay(a, -1, ti, b, "", v * 17, -1, bm_track_color(SL)); + return; + } + case ENC_PRESETS: app_enc_source(a, SL, d); return; /* la toma del pad, entera */ + default: break; + } + int k = id - ENC_K1; + if (k < 0 || k > 3) return; + const bxp *P = slicer_knobs(a); + turned(a, k, &P[k], slicer_turn(a, &P[k], d)); +} + +void slicer_bigknobs(const bm_app *a, const char **sel, const char **alg, const char **pre) +{ + (void)a; + *sel = "-"; *alg = "PAD"; *pre = "TAKE"; +} + +uint8_t slicer_btn_led(const bm_app *a, int i) +{ + switch (i) { + case BTN_HOME: return LED_DIM; + case BTN_REC: return a->rec ? LED_ON : LED_DIM; + case BTN_SEQ: case BTN_LFO: case BTN_SCL: return LED_DIM; + default: break; + } + int p = slicer_page_of(i); + if (p < 0) return LED_OFF; + return p == a->bx.page ? LED_ON : LED_DIM; +} + +const char *slicer_title(const bm_app *a, char *buf, int cap) +{ + int s = slicer_sub(a); + switch (a->bx.page) { + case BXP_ENV: snprintf(buf, (size_t)cap, "%s", "ENV"); break; + case BXP_FX: snprintf(buf, (size_t)cap, "FX %d/2 %s", s + 1, T(s ? "CHORUS REVERB" : "DISTORTION")); break; + case BXP_GLO: snprintf(buf, (size_t)cap, "GLO %d/2", s + 1); break; + default: snprintf(buf, (size_t)cap, "%s %d/2", T(SL_EDIT_N[s]), s + 1); break; + } + return buf; +} + +/* las blancas son los 16 pads: el elegido ON, con toma MID (destella al sonar), vacío OFF. En TRIM, las + * negras AUTO, 8 y 16 (con un pad que tenga toma) y SAMPLE (armado respira, grabando ON). */ +void slicer_keys(const bm_app *a, bm_keyfn K[BM_KEYS]) +{ + memset(K, 0, sizeof(bm_keyfn) * BM_KEYS); + uint16_t col = bm_track_color(SL); + char b[6]; + for (int w = 0; w < 16; w++) { + bm_keyfn *f = &K[bm_white_key(w)]; + bool ok = bm_pad_ok(&a->pat.pad[w]); + snprintf(b, sizeof b, "P%d", w + 1); + snprintf(f->label, sizeof f->label, "%s", b); + f->led = w == pad_sel(a) ? LED_ON : ok ? LED_MID : LED_OFF; + f->color = col; + f->live = (uint8_t)(ok && a->now < a->lane_flash[SL][w]); + } + if (a->bx.page != BXP_MAIN || slicer_sub(a) != 0) return; + bool ok = bm_pad_ok(cpad(a)) && cpad(a)->src < BM_TAKES; + static const char *const CUT[3] = {"AUTO", "8", "16"}; + for (int i = 0; i < 3; i++) { + bm_keyfn *f = &K[bm_black_key(i)]; + snprintf(f->label, sizeof f->label, "%s", CUT[i]); + f->led = ok ? LED_MID : LED_OFF; f->color = C_CYAN; + } + const bm_status *st = &a->ctx.st; + bm_keyfn *f = &K[bm_black_key(10)]; + snprintf(f->label, sizeof f->label, "%s", "SMP"); + f->led = st->smp_rec ? LED_ON : st->smp_armed ? LED_BREATH : LED_DIM; f->color = C_RED; +} + +/* la cabecera: lo que graba SAMPLE, o el pad elegido y su toma */ +void slicer_status(const bm_app *a, char *b, int cap, uint16_t *col) +{ + const bm_status *st = &a->ctx.st; + *col = C_WHITE; + if (st->smp_rec) { + unsigned t = (unsigned)(st->smp_len * 10u / BM_SMP_RATE); + snprintf(b, (size_t)cap, TF("SAMPLING %u.%u S"), t / 10, t % 10); + *col = C_RED; + return; + } + if (st->smp_armed) { snprintf(b, (size_t)cap, "%s", T(app_playing(a) ? "SAMPLE: NEXT BAR" : "SAMPLE ARMED")); *col = C_RED; return; } + char tk[16]; + if (bm_pad_ok(cpad(a))) bm_app_src_name(a, cpad(a)->src, tk, sizeof tk); else snprintf(tk, sizeof tk, "%s", T("EMPTY")); + snprintf(b, (size_t)cap, "P%d %s", pad_sel(a) + 1, tk); +} + +bool slicer_knobs_shown(const bm_app *a) { return a->bx.page == BXP_MAIN || a->bx.page == BXP_GLO; } diff --git a/core/bm_store.h b/core/bm_store.h index 4d5f971..8a5fe73 100644 --- a/core/bm_store.h +++ b/core/bm_store.h @@ -12,7 +12,7 @@ typedef struct { int (*program)(uint32_t addr, const void *src, uint32_t n); /* <= 256 B, sin cruzar página */ } bm_flash_ops; -#define BM_OBJ_PATTERN0 0 /* 0..BM_PATTERNS-1 (10..15 se ignoran al montar) */ +#define BM_OBJ_PATTERN0 0 /* 0..BM_PATTERNS-1 (los de después se ignoran al montar) */ #define BM_OBJ_SONG 16 #define BM_OBJ_COUNT 17 #define BM_STORE_SLOTS ((BM_STORE_HI - BM_STORE_LO) / BM_SLOT_SIZE) diff --git a/core/bm_ui_draw.c b/core/bm_ui_draw.c index c35ce12..00dcf9f 100644 --- a/core/bm_ui_draw.c +++ b/core/bm_ui_draw.c @@ -1,35 +1,39 @@ /* SPDX-License-Identifier: GPL-3.0-or-later * Copyright (C) 2026 Erbubar23 */ -/* Bubba Machine — pantallas (docs/DISENO_0.6.md §5). Cuatro franjas en todas: +/* Bubba Machine — pantallas (1.0, etapa 1): HOME (el mezclador y su PLAY/REC), su GLO, el secuenciador + * de la batería, SAVE y SYSTEM. Franjas (2026-10-22: cada perilla se dibuja una sola vez): * y 0..23 cabecera: la máquina, PLAY/REC, patrón, BPM, CPU (anillo de la pulsación de 2 s) - * y 24..135 visor: en un canal, sus pestañas arriba y la página debajo - * y 136..167 teclado: las 11 negras y las 16 blancas (= los 16 pasos) con lo que hace cada una - * y 168..239 perillas: K1-K4 con su dial, su valor y su nombre, en su orden físico + * y 24..135 visor: la pantalla de ahora (hasta 193 si la pantalla ya muestra K1-K4) + * y 136..193 perillas: K1-K4 con su dial, su valor y su nombre, en su orden físico (si el visor no las muestra) + * y 194..225 teclado: las 11 negras y las 16 blancas (= los 16 pasos) con lo que hace cada una + * y 226..239 SELECT, ALGORITHM y PRESETS: qué hacen aquí * Todo el texto en pantalla va en ASCII (la fuente no tiene acentos). */ #include #include +#include #include "bm_app_int.h" +#include "bm_mach.h" #include "bm_rom.h" #include "bm_util.h" -#include "bm_fm.h" #include "bm_drums.h" #include "bm_params.h" #include "bm_snap.h" +#include "bm_fm.h" #include "bm_wt.h" -#include +#include "bm_wave.h" +#include "bm_acid.h" -#define PY 36 /* primera fila útil de una página de canal (debajo de las pestañas) */ +#define PY 36 /* primera fila útil de una pantalla de canal */ /* La miga del dibujo (0.7, temporal): qué parte de la pantalla se estaba dibujando. Si el * procesador falla, hal/fm1/sdk/wl82_debug.c la guarda en la huella y la consola la muestra. * 0 = fuera del dibujo. */ volatile uint8_t bm_ui_paso; #define PASO(n) (bm_ui_paso = (uint8_t)(n)) -#define VB 135 /* última fila del visor */ +#define VB 135 /* última fila del visor (con la franja de perillas) */ +#define VT 193 /* última fila del visor sin la franja */ static uint16_t dim(uint16_t c) { return (uint16_t)((c >> 1) & 0x7BEF); } -static float bm_clampf(float v, float lo, float hi) { return v < lo ? lo : (v > hi ? hi : v); } - /* ------------------------------------------------------------ cabecera */ static void draw_ring(bm_gfx *g, int cx, int cy, int p, uint16_t c) { @@ -39,40 +43,30 @@ static void draw_ring(bm_gfx *g, int cx, int cy, int p, uint16_t c) for (int i = 0; i < 24; i++) gfx_fill(g, cx + CS[i][0], cy + CS[i][1], 2, 2, i < n ? c : C_DGREY); } -/* la consola (BX-1): MIX, su FX y su GLO */ -static bool console_view(const bm_app *a) { return a->view == V_HOME || a->view == V_FXG || a->view == V_GLO; } - -/* El nombre de lo que se toca: BX-1 en la consola, la máquina del canal adentro (y en SLOOP). */ static const char *machine_title(const bm_app *a, uint16_t *col) { - bool ch = a->view == V_CH || (a->layer && a->layer != L_HOME) || (a->sloop && console_view(a) && !a->layer); + bool ch = a->view == V_CH || a->view == V_MACH || (a->sloop && a->view == V_HOME); *col = ch ? bm_track_color(a->track) : C_CYAN; if (ch) return bm_track_name(a, a->track); - switch (a->view) { /* MIX, FX y GLO son páginas de BX-1 */ + switch (a->view) { case V_SYSTEM: return "SYSTEM"; - case V_TIME: return "TIME"; case V_SAVE: return "SAVE"; default: return "BX-1"; } } -/* "<": HOME vuelve a MIX (la consola) desde aquí: desde todas partes menos MIX. */ -static bool home_goes_back(const bm_app *a) { return a->view != V_HOME; } +/* "<": HOME vuelve al mezclador desde aquí: desde todas partes menos el mezclador (y su PLAY/REC, que también sale con HOME). */ +static bool home_goes_back(const bm_app *a) { return a->view != V_HOME || a->sloop; } /* adónde lleva mantener un botón 2 s (lo mismo que decide app_on_gesture) */ -static const char *hold_target(const bm_app *a, int id, char *b, int cap) +static const char *hold_target(const bm_app *a, int id) { - switch (id) { - case BTN_HOME: return "SYSTEM"; - case BTN_SEQ: return "TIME"; - case BTN_EDIT: return a->view == V_COPYCH ? "PASTE" : a->track == 1 ? "TAKES" : "INIT SOUND"; - case BTN_SAVE: return "QUICK SAVE"; - case BTN_REC: - if (a->view == V_CH && a->page == PG_LOOP) return "ERASE LOOP"; - snprintf(b, (size_t)cap, TF("ERASE T%d"), a->track + 1); + static char b[12]; + if (id == BTN_REC && (a->view == V_HOME || a->view == V_CH || a->view == V_MACH)) { /* REC 2 s: borra el canal */ + snprintf(b, sizeof b, TF("CLEAR T%d"), app_pos(a->track) + 1); return b; - default: return NULL; } + return id == BTN_HOME ? "SYSTEM" : id == BTN_SAVE ? "QUICK SAVE" : NULL; } /* el autoguardado no tapa la pantalla con un aviso: es una marca en la cabecera */ @@ -86,8 +80,8 @@ static void draw_status(bm_gfx *g, const bm_app *a) gfx_fill(g, 0, 0, BM_LCD_W, 23, C_BLACK); if (st->playing) for (int i = 0; i < 9; i++) gfx_vline(g, 4 + i, 7 + i / 2, 10 - (i / 2) * 2, C_GREEN); else gfx_fill(g, 4, 8, 8, 8, C_GREY); - bool recording = a->rec || st->smp_rec || a->song_rec || st->smp_armed; - if (recording && (!(st->smp_rec || a->song_rec || st->smp_armed) || ((a->now / 250) & 1))) gfx_disc(g, 18, 12, 3, st->smp_armed ? C_YELLOW : C_RED); + bool recording = a->rec; + if (recording && ((a->now / 250) & 1)) gfx_disc(g, 18, 12, 3, C_RED); uint16_t mc; const char *mt = machine_title(a, &mc); int tx = 25; @@ -100,12 +94,11 @@ static void draw_status(bm_gfx *g, const bm_app *a) int qx = x + gfx_text(g, x, 3, b, C_WHITE, 1) + 1; bool queued = st->queued != 0xFF && st->queued != st->pattern; if (queued) { - uint16_t qc = st->pchain_n > 1 ? C_CYAN : C_YELLOW; + uint16_t qc = C_YELLOW; snprintf(b, sizeof b, ">A%02d", st->queued + 1); gfx_text(g, qx, 3, b, qc, 1); if (st->playing) { /* pulsos que faltan para el cambio */ - uint32_t m = (uint32_t)bm_master_steps(&a->pat.meta) * BM_TICKS_STEP; - uint32_t left = m ? (m > st->rtick ? m - st->rtick : 0) : BM_BAR_TICKS - st->btick % BM_BAR_TICKS; + uint32_t left = BM_BAR_TICKS - st->btick % BM_BAR_TICKS; /* el patrón en cola entra al final del compás */ int beats = (int)((left + BM_PPQN - 1) / BM_PPQN); for (int i = 0; i < 4; i++) gfx_fill(g, x + 20 + i * 5, 14, 4, 5, beats > 4 ? dim(qc) : (i < beats ? qc : C_DDGREY)); } @@ -116,8 +109,8 @@ static void draw_status(bm_gfx *g, const bm_app *a) if (!queued && st->scene_q != 0xFF) { snprintf(b, sizeof b, ">%c", 'A' + st->scene_q); gfx_small(g, x + 20, 14, b, C_CYAN); } else if (!queued && st->scene != 0xFF) { snprintf(b, sizeof b, "%c", 'A' + st->scene); gfx_small(g, x + 20, 14, b, C_CYAN); } /* los 6 canales: su color = suena, rojo = mute, blanco = golpe, borde = solo */ - for (int t = 0; t < BM_TRACKS; t++) { - int cx = x + t * 7; + for (int n = 0; n < BM_TRACKS; n++) { + int t = BM_ORDER[n], cx = x + n * 7; bool mu = a->pat.trk[t].mute; gfx_fill(g, cx, 20, 5, 2, mu ? C_RED : (a->now < a->trig_until[t] ? C_WHITE : bm_track_color(t))); if (a->solo_on && a->solo_track == t) gfx_rect(g, cx - 1, 19, 7, 4, C_WHITE); @@ -128,29 +121,19 @@ static void draw_status(bm_gfx *g, const bm_app *a) gfx_text_r(g, 186, 5, b, C_TEMPO, 2); if (bpm % 10) { snprintf(b, sizeof b, ".%d", bpm % 10); gfx_small(g, 187, 4, b, C_TEMPO); } gfx_small(g, 187, 14, a->set.clock ? (st->ext_ok ? "EXT" : "EXT?") : "BPM", a->set.clock && !st->ext_ok ? C_RED : C_GREY); - /* REC: el largo de las notas que se graban · si no, la CPU */ - int hid = -1, p = a->ask ? -1 : bm_gesture_progress(&a->ges, a->now, &hid); /* la pregunta tiene su barra */ + /* la pulsación de 2 s: el anillo y adónde lleva (HOME: SYSTEM, SAVE: guardado rápido, una escena: borrarla) · si no, la CPU */ + int hid = -1, p = bm_gesture_progress(&a->ges, a->now, &hid); char kl[22]; - int kp = p < 0 && !a->ask ? bm_app_key_ring(a, kl, sizeof kl) : -1; /* una tecla de escena sostenida: guardar a los 2 s */ - bool slot = false; /* la esquina de arriba quedó ocupada */ - if (p >= 0 || kp >= 0) { /* la pulsación de 2 s: el anillo y adónde lleva */ + int kp = p < 0 ? bm_app_key_ring(a, kl, sizeof kl) : -1; + const char *to = p >= 0 ? hold_target(a, hid) : kp >= 0 ? kl : NULL; + if (p >= 0 && !to) p = -1; /* un botón sin pulsación de 2 s: nada */ + if (p >= 0 || kp >= 0) { draw_ring(g, 210, 12, p >= 0 ? p : kp, C_YELLOW); - const char *to = p >= 0 ? hold_target(a, hid, b, sizeof b) : kl; - if (to) { /* tapa el BPM mientras dura */ - int w = gfx_text_w(to, 1), x0 = 186 - gfx_text_w("888", 2); - if (198 - w - 3 < x0) x0 = 198 - w - 3; - gfx_fill(g, x0, 2, 201 - x0, 20, C_BLACK); - gfx_text(g, 198 - w - 1, 9, to, C_YELLOW, 1); - } - slot = true; - } else if (a->rec && app_kind(a, a->track) == KIND_NOTE) { - if (a->rec_gate >= 100) snprintf(b, sizeof b, "TIE"); else snprintf(b, sizeof b, "G%d%%", a->rec_gate); - gfx_small(g, 202, 4, b, C_GREEN); - gfx_small(g, 202, 14, "REC", C_RED); - slot = true; + int w = gfx_text_w(to, 1), x0 = 186 - gfx_text_w("888", 2); /* tapa el BPM mientras dura */ + if (198 - w - 3 < x0) x0 = 198 - w - 3; + gfx_fill(g, x0, 2, 201 - x0, 20, C_BLACK); + gfx_text(g, 198 - w - 1, 9, to, C_YELLOW, 1); } else if (a->cpu > 95) gfx_small(g, 202, 14, "CPU!", C_RED); /* solo si el audio no alcanza */ - if (st->fill && st->playing) { gfx_small(g, 202, 4, "FILL", C_ORANGE); slot = true; } - if (!slot && st->song_on) gfx_small(g, 202, 4, "SONG", C_CYAN); if (toast_autosave(a)) gfx_disc(g, 223, 19, 2, C_GREEN); /* autoguardado: una marca, sin tapar nada */ /* batería, vertical */ int bp = a->battery; @@ -193,7 +176,7 @@ static void draw_legend(bm_gfx *g, const bm_app *a) bm_app_legend(a, L); PASO(29); /* SYSTEM: K1 muestra el valor de la fila, no el nombre de otra perilla */ - if (a->view == V_SYSTEM && !a->layer && L[0].name[0]) sys_val(a, a->menu_row, L[0].val, sizeof L[0].val); + if (a->view == V_SYSTEM && !a->layer && L[0].name[0]) sys_val(a, BM_SYS_ROWS[a->menu_row % BM_SYS_VIS], L[0].val, sizeof L[0].val); } gfx_fill(g, 0, BM_LEGEND_Y, BM_LCD_W, BM_LEGEND_H, C_BLACK); gfx_hline(g, 0, BM_LEGEND_Y, BM_LCD_W, C_DDGREY); @@ -201,31 +184,38 @@ static void draw_legend(bm_gfx *g, const bm_app *a) int x = i * 60, cx = x + 30; uint16_t kc = bm_knob_color(i); bool hi = a->ov.on && a->ov.enc == i; - if (i) gfx_vline(g, x, BM_LEGEND_Y + 4, 54, C_DDGREY); - if (!L[i].name[0]) { draw_dial(g, cx, BM_LEGEND_Y + 19, 0, -1, C_DDGREY, false); continue; } - if (hi) gfx_rect(g, x + 2, BM_LEGEND_Y + 2, 56, 58, kc); - draw_dial(g, cx, BM_LEGEND_Y + 19, L[i].pct, -1, kc, hi); - gfx_text_c(g, cx, BM_LEGEND_Y + 37, L[i].val, L[i].locked ? kc : C_WHITE, 1); - if (L[i].locked) gfx_fill(g, x + 53, BM_LEGEND_Y + 38, 4, 4, kc); + if (i) gfx_vline(g, x, BM_LEGEND_Y + 4, 50, C_DDGREY); + if (!L[i].name[0]) { draw_dial(g, cx, BM_LEGEND_Y + 17, 0, -1, C_DDGREY, false); continue; } + if (hi) gfx_rect(g, x + 2, BM_LEGEND_Y + 2, 56, 55, kc); + draw_dial(g, cx, BM_LEGEND_Y + 17, L[i].pct, -1, kc, hi); + gfx_text_c(g, cx, BM_LEGEND_Y + 33, L[i].val, L[i].locked ? kc : C_WHITE, 1); + if (L[i].locked) gfx_fill(g, x + 53, BM_LEGEND_Y + 34, 4, 4, kc); char nm[11]; snprintf(nm, sizeof nm, "%.9s", T(L[i].name)); - gfx_text_c(g, cx, BM_LEGEND_Y + 49, nm, kc, 1); + gfx_text_c(g, cx, BM_LEGEND_Y + 45, nm, kc, 1); } } /* Las tres perillas grandes, en su orden del panel (SELECT, ALGORITHM, PRESETS): qué hacen aquí, - * o "-" si aquí no hacen nada. Una fila chica debajo de los diales. */ + * o "-" si aquí no hacen nada. La fila de abajo, con letra grande (2026-10-22: antes casi no se + * leía): el nombre de la perilla en una etiqueta y lo que hace al lado. */ static void draw_bigknobs(bm_gfx *g, const bm_app *a) { - if (!gfx_strip_hit(g, 232, 6)) return; + if (!gfx_strip_hit(g, BM_FOOT_Y, BM_FOOT_H)) return; const char *v[3]; static const char *const N[3] = {"SEL", "ALG", "PRE"}; bm_app_bigknobs(a, &v[0], &v[1], &v[2]); + gfx_fill(g, 0, BM_FOOT_Y, BM_LCD_W, BM_FOOT_H, C_BLACK); for (int i = 0; i < 3; i++) { - int x = 4 + i * 80; + int x = 1 + i * 80, y = BM_FOOT_Y + 3; bool dead = !v[i][0] || (v[i][0] == '-' && !v[i][1]); bool hi = a->ov.on && a->ov.knob == (i == 0 ? ENC_SELECT : i == 1 ? ENC_ALGO : ENC_PRESETS) + 1; - gfx_small(g, x, 232, N[i], dead ? C_DGREY : C_GREY); - gfx_small(g, x + gfx_small_w(N[i]) + 4, 232, dead ? "-" : v[i], hi ? a->ov.color : dead ? C_DGREY : C_WHITE); + int w = gfx_small_w(N[i]) + 4; + gfx_fill(g, x, y - 1, w, 9, dead ? C_DDGREY : C_DGREY); + gfx_small(g, x + 2, y + 1, N[i], dead ? C_DGREY : C_WHITE); + char b[12]; + snprintf(b, sizeof b, "%.10s", dead ? "-" : T(v[i])); + if (gfx_text_w(b, 1) > 78 - w - 3) b[(78 - w - 3) / 6] = 0; /* que no pise a la siguiente */ + gfx_text(g, x + w + 3, y, b, hi ? a->ov.color : dead ? C_DGREY : C_WHITE, 1); } } @@ -237,62 +227,6 @@ static void header(bm_gfx *g, const char *title, const char *sub, uint16_t col) gfx_hline(g, 4, 44, 232, C_DDGREY); } -/* Las ayudas (0.7): se ven los primeros HINT_MS de cada página y después se van; la franja de teclas - * y las perillas siguen diciendo qué hace cada cosa. Antes eran ~40 líneas fijas en pantalla. */ -#define HINT_MS 4000u -static bool hints_on; -/* Una línea de ayuda: en la 5x7 si cabe (hasta 38 letras), si no en la 3x5. Texto fijo: solo cuesta - * el primer cuadro (el render manda lo que cambió). */ -static void note_s(bm_gfx *g, int y, const char *s) -{ - if (!s || !s[0]) return; - if (gfx_text_w(s, 1) <= 228) { - if (y > VB - 6) y = VB - 6; - if (gfx_strip_hit(g, y, 8)) gfx_text(g, 6, y, s, C_GREY, 1); - } else if (gfx_strip_hit(g, y, 6)) gfx_small(g, 4, y, s, C_GREY); -} -static void hint(bm_gfx *g, int y, const char *s) { if (hints_on && gfx_strip_hit(g, y, 8)) gfx_text(g, 6, y, s, C_GREY, 1); } -static void hint_s(bm_gfx *g, int y, const char *s) { if (hints_on) note_s(g, y, s); } - -static void hints_update(const bm_app *a) -{ - static uint32_t key = 0xFFFFFFFFu, t0; - uint32_t k = (uint32_t)a->view | (uint32_t)a->page << 8 | (uint32_t)a->layer << 16 | (uint32_t)a->track << 24 - | (uint32_t)a->ed_page[a->track] << 28 | (uint32_t)a->fx_page << 30; - if (k != key) { key = k; t0 = a->now; } - hints_on = a->now - t0 < HINT_MS; -} - -/* Las páginas de la consola (BX-1): MIX y FX (HOME siempre vuelve a MIX) y su GLO; la actual en cian. - * A la derecha, las sub-páginas de la actual (FX y GLO las recorren con su botón) o lo que se diga. */ -static void home_pages(bm_gfx *g, const bm_app *a, const char *sub, uint16_t subc) -{ - if (!gfx_strip_hit(g, 25, 10)) return; - static const uint8_t V[3] = {V_HOME, V_FXG, V_GLO}; - static const char *const N[3] = {"MIX", "FX", "GLO"}; - int x = 4; - for (int i = 0; i < 3; i++) { - int w = gfx_small_w(N[i]); - if (a->view == V[i]) { gfx_fill(g, x - 2, 25, w + 4, 9, C_CYAN); gfx_small(g, x, 27, N[i], C_BLACK); } - else gfx_small(g, x, 27, N[i], C_GREY); - x += w + 8; - } - if (a->view == V_FXG || a->view == V_GLO) { /* sus páginas: la actual en blanco */ - static const char *const FP[FXP_COUNT] = {"CHANNEL", "DELAY", "REVERB", "MASTER"}; - static const char *const GP[GP_COUNT] = {"TEMPO", "MACHINES", "SCALE", "SONG"}; - const char *const *P = a->view == V_FXG ? FP : GP; - int n = a->view == V_FXG ? FXP_COUNT : GP_COUNT, cur = a->view == V_FXG ? a->fx_page % FXP_COUNT : a->glo_page % GP_COUNT; - int xr = 236; - for (int i = n - 1; i >= 0; i--) { - xr -= gfx_small_w(P[i]); - gfx_small(g, xr, 27, P[i], i == cur ? C_WHITE : C_DGREY); - xr -= 5; - } - return; - } - if (sub) gfx_small(g, 236 - gfx_small_w(sub), 27, sub, subc); -} - static void row(bm_gfx *g, int y, bool sel, const char *l, const char *r) { if (!gfx_strip_hit(g, y, 12)) return; @@ -308,16 +242,6 @@ static void grid(bm_gfx *g, int x0, int y0, int w, int h, int step) if (gfx_strip_hit(g, y, 1)) for (int x = x0; x < x0 + w; x += step) gfx_fill(g, x, y, 1, 1, C_DDGREY); } -static int src_name(const bm_app *a, int t, char *b, int cap) -{ - if (t == 1) { /* el sampler: cuántos pads tiene el kit */ - int n = 0; - for (int i = 0; i < BM_LANES; i++) n += bm_pad_ok(&a->pat.pad[i]); - return n ? snprintf(b, (size_t)cap, TF("%d PADS"), n) : snprintf(b, (size_t)cap, "%s", T("NO KIT")); - } - return snprintf(b, (size_t)cap, "%s", bm_sound_name(a, t)); -} - /* ¿el canal tiene golpe/nota en el paso absoluto s? (0 nada, 1 golpe o comienzo, 2 nota que sigue) */ static int track_has(const bm_app *a, int t, int s) { @@ -395,23 +319,6 @@ static void draw_keys(bm_gfx *g, const bm_app *a) int k = bm_black_key(i), wi = bm_key_white_index(k - 1); key_cell(g, a, (wi + 1) * 15 - 8, BM_KEYS_Y + 2, 16, 12, &K[k], a->keys_down[k], 0); } - /* SEQ de un canal de notas: las notas largas (TIE) como una barra continua sobre sus pasos */ - int t = a->track; - if (a->view == V_CH && a->page == PG_SEQ && app_kind(a, t) == KIND_NOTE && !a->layer && !bm_app_roll_view(a, t)) { - int p0 = a->step_page * 16, len = a->pat.trk[t].length ? a->pat.trk[t].length : 16; - for (int s = p0 - 16; s < p0 + 16; s++) { - if (s < 0 || s >= len) continue; - for (int k = 0; k < BM_EVENTS; k++) { - const bm_event *e = bm_evc(&a->pat, t, s, k); - if (bm_event_empty(e)) continue; - int l = (e->len & BM_LEN_MASK) + ((e->len & BM_LEN_TIE) ? 1 : 0); - if (l < 2) continue; - int x0 = (s - p0) * 15, x1 = (s - p0 + l) * 15 - 2; - x0 = bm_clampi(x0, 0, 239); x1 = bm_clampi(x1, 0, 239); - if (x1 > x0) gfx_fill(g, x0, BM_KEYS_Y + BM_KEYS_H - 2, x1 - x0, 2, C_GREEN); - } - } - } } static void lane_pads(bm_gfx *g, const bm_app *a, int t, int y0, int rowh) @@ -440,75 +347,30 @@ static void lane_pads(bm_gfx *g, const bm_app *a, int t, int y0, int rowh) } } -/* ------------------------------------------------------------ pestañas del canal */ -/* qué hace tocar otra vez el botón de esta página (como decide button_page) */ -static bool again_name(const bm_app *a, char *b, int cap) -{ - int t = a->track, kind = app_kind(a, t), eng = app_engine(a, t); - bool midi = app_midi(a, t); - const char *s = NULL; - switch (a->page) { - case PG_SEQ: s = bm_is_pads(t) ? "BREAK" : (kind == KIND_NOTE && !midi) ? "LOOP" : NULL; break; - case PG_BREAK: case PG_LOOP: s = "SEQ"; break; - case PG_SOUND: - if (kind == KIND_TR) s = bm_lane_pages[0].name; - else if (bm_engine_paged(eng)) { int np; const bm_ppage *pp = bm_engine_pages(eng, &np); if (np > 1) s = pp[(a->ed_page[t] + 1) % np].name; } - break; - case PG_INST: s = a->ed_page[t] + 1 < BM_LANE_PAGES ? bm_lane_pages[a->ed_page[t] + 1].name : "SOUND"; break; - case PG_MIX: s = a->mix_page ? "MIX" : (t ? "DUCK" : NULL); break; - case PG_SCL: s = "CHORDS"; break; - case PG_CHORDS: s = "SCALE"; break; - case PG_MORE: s = "BACK"; break; - case PG_PADS: { static const char *const PN[4] = {"TRIM", "SOUND", "ENV", "LOOP"}; s = PN[(a->ed_page[1] + 1) % 4]; break; } - default: break; - } - if (!s) return false; - snprintf(b, (size_t)cap, "%s %s", T("AGAIN:"), T(s)); - return true; -} - -static void draw_tabs(bm_gfx *g, const bm_app *a) -{ - if (!gfx_strip_hit(g, 24, 12)) return; - int t = a->track; - uint8_t tabs[8]; - int n = bm_app_tabs(a, t, tabs), in = 0; - for (int i = 0; i < n; i++) if (tabs[i] == a->page) in = 1; - /* 0.7: el nombre de la página actual y un punto por página (la actual, más larga). SELECT las recorre. */ - uint16_t tc = bm_track_color(t); - int xo = 4 + gfx_text(g, 4, 25, bm_page_name(a->page), in ? tc : C_WHITE, 1) + 6; - char b[24]; - if (a->oct) { snprintf(b, sizeof b, "O%c%d", a->oct < 0 ? '-' : '+', a->oct < 0 ? -a->oct : a->oct); gfx_small(g, xo, 27, b, C_YELLOW); } - int x = 236 - (n - 1) * 6 - 12; - if (again_name(a, b, sizeof b)) gfx_small(g, x - 6 - gfx_small_w(b), 27, b, C_GREY); - for (int i = 0; i < n; i++) { - bool cur = tabs[i] == a->page; - gfx_fill(g, x, 28, cur ? 10 : 3, 3, cur ? tc : C_DGREY); - x += cur ? 14 : 6; - } - gfx_hline(g, 0, 34, BM_LCD_W, C_DDGREY); -} - /* ------------------------------------------------------------ HOME: BX-1, el mezclador */ static void draw_sloop(bm_gfx *g, const bm_app *a); /* Una fila por canal: la máquina, su secuencia (pulsos para los golpes, bloques para las notas - * largas), el efecto que más usa y su volumen. SELECT (o su blanca 11-16) mueve el cursor; SEQ o EDIT - * entran, y sostener su blanca abre su tarjeta. En SLOOP, el canal del cursor en PIANO ROLL. */ + * largas), el filtro y su ganancia. SELECT (o la blanca de su canal) mueve el cursor; la blanca del canal + * del cursor entra a PLAY/REC y SEQ abre el secuenciador de la batería. En PLAY/REC, el canal del cursor + * en PIANO ROLL. */ static void draw_home(bm_gfx *g, const bm_app *a) { const bm_status *st = &a->ctx.st; char b[16]; if (a->sloop) { draw_sloop(g, a); return; } - home_pages(g, a, a->cue ? "CUE" : a->move ? (a->move < 0 ? "MOVE DARK" : "MOVE BRIGHT") : NULL, a->cue ? C_ORANGE : C_PINK); - for (int t = 0; t < BM_TRACKS; t++) { - int y = 33 + t * 16; + if (gfx_strip_hit(g, 25, 10)) { + gfx_fill(g, 2, 25, gfx_small_w("MIXER") + 4, 9, C_CYAN); + gfx_small(g, 4, 27, "MIXER", C_BLACK); + } + for (int n = 0; n < BM_TRACKS; n++) { + int t = BM_ORDER[n], y = 33 + n * 16; if (!gfx_strip_hit(g, y, 16)) continue; const bm_track *tr = &a->pat.trk[t]; uint16_t col = tr->mute ? C_DGREY : bm_track_color(t); bool sel = t == a->track; if (sel) { gfx_fill(g, 0, y, BM_LCD_W, 15, C_DDGREY); gfx_fill(g, 0, y, 2, 15, C_CYAN); } - snprintf(b, sizeof b, "%d", t + 1); + snprintf(b, sizeof b, "%d", n + 1); gfx_text(g, 5, y + 4, b, sel ? C_CYAN : C_GREY, 1); gfx_text(g, 15, y + 4, bm_track_name(a, t), tr->mute ? C_GREY : col, 1); uint32_t n = st->tn[t]; @@ -528,56 +390,23 @@ static void draw_home(bm_gfx *g, const bm_app *a) gfx_fill(g, 200, y + 9, 26, 2, C_DDGREY); gfx_fill(g, 200, y + 9, pk, 2, C_GREEN); if (tr->mute) gfx_text(g, 230, y + 4, "M", C_RED, 1); else if (a->now < a->trig_until[t]) gfx_disc(g, 233, y + 7, 3, col); - if ((st->cue_x >> t) & 1) gfx_rect(g, 227, y + 1, 12, 13, C_ORANGE); /* CUE: cambia en el próximo compás */ } } -/* La tarjeta del canal (su blanca sostenida en HOME): soltar = entrar; ALGORITHM = la máquina (T3-T6, - * con la espera de 2 s; las pesadas, una a la vez), PRESETS = su sonido. Girar algo = soltar no entra. */ -static void draw_card(bm_gfx *g, const bm_app *a) +/* ------------------------------------------------------------ SEQ: rejilla TR */ +/* OCT -/+ cambian la página de sonidos de la batería: la página va como una tecla (borde y nombre) + * para que se vea que la cambian ellos. Devuelve el ancho. */ +static int page_tag(bm_gfx *g, const bm_app *a, int xr, int y, int h, uint16_t c) { - int t = a->card - 1; - if (t < 0 || !gfx_strip_hit(g, 26, 110)) return; - uint16_t col = bm_track_color(t); - char b[40]; - gfx_fill(g, 2, 26, 236, 109, C_BLACK); - gfx_rect(g, 2, 26, 236, 109, col); - snprintf(b, sizeof b, "T%d", t + 1); - int x = 8 + gfx_text(g, 8, 30, b, col, 2) + 8; - gfx_text(g, x, 30, bm_track_name(a, t), C_WHITE, 2); - snprintf(b, sizeof b, "%s %s", T(bm_is_pads(t) ? "TAKE" : app_kind(a, t) == KIND_TR ? "KIT" : "SOUND"), bm_sound_name(a, t)); - gfx_small(g, 8, 47, b, C_GREY); - if (t < BM_TR_TRACKS) gfx_text_c(g, 120, 74, "FIXED MACHINE", C_GREY, 1); - else - for (int i = 0; i < BM_MACHINES; i++) { /* las 5 máquinas: la elegida resaltada, la que suena con > */ - int e = bm_machines[i], y = 55 + i * 11; - if (!gfx_strip_hit(g, y, 11)) continue; - int other = bm_machine_conflict(&a->pat, t, e); - bool sel = e == a->mach_sel && a->mach_trk == t, on = e == a->pat.trk[t].engine, off = other >= 0; - if (sel) gfx_fill(g, 6, y, 228, 10, off ? C_DDGREY : col); - uint16_t fg = off ? C_DGREY : sel ? C_BLACK : C_WHITE; - gfx_text(g, 10, y + 2, on ? ">" : " ", fg, 1); - gfx_text(g, 18, y + 2, bm_engine_names[e], fg, 1); - if (off) { snprintf(b, sizeof b, TF("ON T%d"), other + 1); gfx_small(g, 230 - gfx_small_w(b), y + 3, b, C_GREY); } - else if (sel && a->mach_arm == 1) { /* la espera: la barra se llena en 2 s */ - uint32_t dt = a->now - a->mach_t0; - unsigned left = dt >= BM_MACH_MS ? 0 : (unsigned)(BM_MACH_MS - dt + 99) / 100; - snprintf(b, sizeof b, TF("LOAD IN %u.%u S"), left / 10, left % 10); - gfx_small(g, 230 - gfx_small_w(b), y + 3, b, C_BLACK); - gfx_fill(g, 6, y + 9, (int)(dt >= BM_MACH_MS ? 228 : dt * 228u / BM_MACH_MS), 1, C_WHITE); - } else if (bm_engine_heavy(e)) gfx_small(g, 230 - gfx_small_w("ONE AT A TIME"), y + 3, "ONE AT A TIME", sel ? C_BLACK : C_DGREY); - } - if (gfx_strip_hit(g, 112, 22)) { - if (a->card_turn) snprintf(b, sizeof b, "%s", T("RELEASE = STAY ON MIX")); - else snprintf(b, sizeof b, TF("RELEASE = ENTER %s"), bm_track_name(a, t)); - gfx_text_c(g, 120, 113, b, C_WHITE, 1); - gfx_small(g, 120 - gfx_small_w(t < BM_TR_TRACKS ? "PRE = SOUND" : "ALG = MACHINE PRE = SOUND") / 2, 124, - t < BM_TR_TRACKS ? "PRE = SOUND" : "ALG = MACHINE PRE = SOUND", C_GREY); - } + const char *s = (a->sel_lane[a->track] & 15) >= 8 ? "OCT 9-16" : "OCT 1-8"; + int w = gfx_small_w(s) + 6; + gfx_rect(g, xr - w, y, w, h, c); + gfx_small(g, xr - w + 3, y + (h - 5) / 2, s, c); + return w; } -/* ------------------------------------------------------------ SEQ: rejilla TR */ -/* Batería: la sección que tocan las negras 1-8 (instrumentos 1-8 o 9-16, la negra 9 cambia). */ +/* Batería: 8 instrumentos por página de sonidos (1-8 o 9-16; OCT -/+ cambia) y los 16 pasos del compás + * que ves (las negras 9 y 10 cambian el compás). */ static void draw_seq_tr(bm_gfx *g, const bm_app *a) { int t = a->track, sel = a->sel_lane[t], base = (sel / 8) * 8; @@ -594,17 +423,10 @@ static void draw_seq_tr(bm_gfx *g, const bm_app *a) gfx_fill(g, 0, PY - 1, 240, 9, C_DGREY); gfx_text(g, 4, PY, b, C_YELLOW, 1); } else { - if (bm_is_pads(t)) { - char nm[40]; - const bm_pad *pd = &a->pat.pad[sel]; - snprintf(b, sizeof b, TF("PAD %d"), sel + 1); - int x = gfx_text(g, 4, PY, b, C_WHITE, 1) + 8; - if (bm_pad_ok(pd)) { bm_app_src_name(a, pd->src, nm, sizeof nm); gfx_small(g, x, PY + 1, nm, C_GREY); } - else gfx_small(g, x, PY + 1, "EMPTY", C_GREY); - } else gfx_text(g, 4, PY, bm_lane_name(a, t, sel), C_WHITE, 1); + gfx_text(g, 4, PY, bm_lane_name(a, t, sel), C_WHITE, 1); int len = tr->lane[sel].len; - snprintf(b, sizeof b, "%s P%d/%d L%d", base ? "9-16" : "1-8", a->step_page + 1, (len + 15) / 16, len); - gfx_text_r(g, 236, PY, b, C_GREY, 1); + snprintf(b, sizeof b, TF("BAR %d/%d %d STEPS"), a->step_page + 1, (len + 15) / 16, len); + page_tag(g, a, 236 - gfx_text_r(g, 236, PY, b, C_GREY, 1) - 5, PY - 1, 9, C_WHITE); } } for (int i = 0; i < 8; i++) { @@ -640,126 +462,6 @@ static void draw_seq_tr(bm_gfx *g, const bm_app *a) } } -/* SEQ de un canal de notas: piano roll de la página con el largo de cada nota (las ligadas en - * verde menta, como una sola nota larga), y los compases del canal. */ -static void draw_seq_syn(bm_gfx *g, const bm_app *a) -{ - const bm_status *st = &a->ctx.st; - int t = a->track; - const bm_track *trk = &a->pat.trk[t]; - uint16_t col = bm_track_color(t); - char b[30], c2[12]; - int len = trk->length ? trk->length : 16; - int ps = bm_app_track_step(a, t, -1); - int spb = BM_BAR_TICKS / bm_speed_tps[trk->speed % SPD_COUNT]; - if (gfx_strip_hit(g, PY, 9)) { - if (a->held_step >= 0 && a->held_long) snprintf(c2, sizeof c2, TF("STEP %02d"), a->held_step + 1); - else bm_note_str(a->last_note[t], c2, sizeof c2); - gfx_text(g, 4, PY, c2, C_WHITE, 1); - if (a->rec_free == t + 1) { - uint32_t el = a->rec_free_t0 == 0xFFFFFFFFu ? 0 : st->btick - a->rec_free_t0; - snprintf(b, sizeof b, TF("FREE REC %u.%u"), (unsigned)(el / BM_BAR_TICKS + 1), (unsigned)(el / BM_PPQN % 4 + 1)); - gfx_fill(g, 52, PY - 1, gfx_text_w(b, 1) + 4, 9, C_RED); - gfx_text(g, 54, PY, b, C_BLACK, 1); - } else if (a->oct) { snprintf(b, sizeof b, a->oct > 0 ? "OCT +%d" : "OCT %d", a->oct); gfx_small(g, 56, PY + 1, b, C_GREY); } - if (len % spb == 0) snprintf(b, sizeof b, TF("%d BARS %s"), len / spb, bm_speed_names[trk->speed % SPD_COUNT]); - else snprintf(b, sizeof b, "L%d %s", len, bm_speed_names[trk->speed % SPD_COUNT]); - gfx_text_r(g, 236, PY, b, C_GREY, 1); - } - int p0 = a->step_page * 16, lo = 127, hi = 0; - for (int s = 0; s < 16 && p0 + s < len; s++) - for (int k = 0; k < BM_EVENTS; k++) { - const bm_event *e = bm_evc(&a->pat, t, p0 + s, k); - if (bm_event_empty(e)) continue; - if (e->note < lo) lo = e->note; - if (e->note > hi) hi = e->note; - } - if (lo > hi) { lo = a->last_note[t] - 6; hi = a->last_note[t] + 6; } - while (hi - lo < 12) { hi++; if (hi - lo < 12) lo--; } - if (hi - lo > 24) lo = hi - 24; - int R = hi - lo + 1, ry = PY + 10, rh = 74, row = rh / R; - if (row < 2) row = 2; - rh = row * R; - if (gfx_strip_hit(g, ry, rh + 2)) { - for (int s = 0; s < 16; s++) { /* columnas = las 16 blancas */ - int ab = p0 + s, x = s * 15; - gfx_fill(g, x, ry, 15, rh, ab == ps ? C_DDGREY : C_BLACK); - if (ab >= len) { gfx_fill(g, x + 6, ry + rh / 2, 2, 2, C_DDGREY); continue; } - if (s % 4 == 0) gfx_vline(g, x, ry, rh, s ? C_DGREY : C_GREY); - else for (int y = ry; y < ry + rh; y += 4) gfx_fill(g, x, y, 1, 1, C_DDGREY); - if (ab == ps) gfx_fill(g, x, ry, 14, 2, C_ORANGE); - } - for (int n = lo; n <= hi; n++) - if (n % 12 == 0) gfx_hline(g, 0, ry + (hi - n) * row + row / 2, 240, C_DGREY); - for (int s = -16; s < 16; s++) { - int ab = p0 + s; - if (ab < 0 || ab >= len) continue; - for (int k = 0; k < BM_EVENTS; k++) { - const bm_event *e = bm_evc(&a->pat, t, ab, k); - if (bm_event_empty(e) || e->note < lo || e->note > hi) continue; - int l = e->len & BM_LEN_MASK; - if (l < 1) l = 1; - bool tie = (e->len & BM_LEN_TIE) || l > 1; - int x0 = s * 15 + e->micro * 15 / 24, x1 = (s + l) * 15 - 2; - if (e->len & BM_LEN_TIE) x1 += 3; - else if (e->gate) x1 = (s + l - 1) * 15 + 15 * e->gate / 100 - 1; - if (x1 <= 0) continue; - if (x0 < 0) x0 = 0; - if (x1 > 239) x1 = 239; - int y = ry + (hi - e->note) * row; - uint16_t c = e->vel >= BM_VEL_ACC ? C_WHITE : tie ? C_GREEN : col; - if (e->vel <= BM_VEL_GHOST) gfx_rect(g, x0, y, x1 - x0, row, c); - else gfx_fill(g, x0, y, x1 - x0, row - (row > 3), c); - if (s >= 0) gfx_fill(g, x0, y, 2, row, C_WHITE); - bool wk = e->prob < 100 || e->prob == BM_PROB_FILL || e->prob == BM_PROB_NOFILL; - if (wk && s >= 0) gfx_fill(g, x0 + 3, y, 2, row, C_BLACK); - } - } - if (a->held_step >= 0 && a->held_long && a->held_step / 16 == a->step_page) gfx_rect(g, (a->held_step % 16) * 15 - 1, ry, 16, rh, C_YELLOW); - if (a->rec && a->rec_step >= 0 && a->rec_step / 16 == a->step_page) gfx_rect(g, (a->rec_step % 16) * 15, ry, 15, rh, C_RED); - snprintf(b, sizeof b, "%s", bm_note_names[hi % 12]); - gfx_small(g, 236 - gfx_small_w(b), ry + 1, b, C_GREY); - bm_note_str(lo, c2, sizeof c2); - gfx_small(g, 236 - gfx_small_w(c2), ry + rh - 6, c2, C_GREY); - } - int oy = ry + rh + 3; - if (a->held_step >= 0 && a->held_long) { - if (!gfx_strip_hit(g, oy, VB - oy + 1)) return; - const bm_event *e = NULL; - for (int k = 0; k < BM_EVENTS; k++) if (!bm_event_empty(bm_evc(&a->pat, t, a->held_step, k))) { e = bm_evc(&a->pat, t, a->held_step, k); break; } - gfx_fill(g, 0, oy, 240, VB - oy + 1, C_DDGREY); - if (!e) { gfx_small(g, 4, oy + 3, "EMPTY STEP - HOLD + ANOTHER WHITE = LONG NOTE", C_GREY); return; } - int nn = 0; char notes[24] = ""; - for (int k = 0; k < BM_EVENTS; k++) { - const bm_event *x = bm_evc(&a->pat, t, a->held_step, k); - if (bm_event_empty(x)) continue; - char nb[6]; bm_note_str(x->note, nb, sizeof nb); - size_t l = strlen(notes); - snprintf(notes + l, sizeof notes - l, "%s%s", nn++ ? " " : "", nb); - } - gfx_small(g, 4, oy + 3, notes, C_WHITE); - if (e->len & BM_LEN_TIE) snprintf(b, sizeof b, "TIE"); else snprintf(b, sizeof b, TF("%d STEPS"), e->len & BM_LEN_MASK); - gfx_small(g, 120, oy + 3, b, C_GREEN); - if (e->prob == BM_PROB_FILL) snprintf(b, sizeof b, "FILL"); else if (e->prob == BM_PROB_NOFILL) snprintf(b, sizeof b, "NO FILL"); else snprintf(b, sizeof b, "%d%%", e->prob); - gfx_small(g, 180, oy + 3, b, C_YELLOW); - gfx_small(g, 4, oy + 11, "SELECT HIT - ALGORITHM PROB - PRESETS LENGTH", C_GREY); - return; - } - if (gfx_strip_hit(g, oy, VB - oy + 1)) { /* los compases del canal y el seguidor */ - int bars = (len + spb - 1) / spb; - if (bars < 1) bars = 1; - int bw = 232 / bars; - for (int k = 0; k < bars; k++) { - int x = 4 + k * bw; - bool cur = a->step_page * 16 / spb == k || (a->step_page * 16 + 15) / spb == k; - gfx_rect(g, x, oy, bw - 2, 10, cur ? col : C_DGREY); - snprintf(b, sizeof b, "%d", k + 1); - gfx_small(g, x + 2, oy + 3, b, cur ? C_WHITE : C_GREY); - } - if (ps >= 0) { int px = 4 + ps * (bw * bars) / len; gfx_fill(g, px, oy + 11, 2, 4, C_ORANGE); } - } -} - /* ------------------------------------------------------------ PIANO ROLL (0.9) * El loop entero del canal (1-4 compases) con las filas de alturas ajustadas a lo que hay (hasta 3 * octavas); a la izquierda un teclado vertical que destella con lo que suena. En la batería y los pads, @@ -819,20 +521,29 @@ static bool roll_sounding(const bm_app *a, int t, int note) return false; } -static void draw_seq_roll(bm_gfx *g, const bm_app *a, int t, int y0, int y1, bool win) +/* page >= 0: solo esa página de 16 pasos (las máquinas: cada 16 pasos, una página); -1: el loop entero */ +static void draw_seq_roll(bm_gfx *g, const bm_app *a, int t, int y0, int y1, bool win, int page) { if (!gfx_strip_hit(g, y0 - 2, y1 - y0 + 2)) return; /* el corchete va 2 filas arriba */ static uint32_t lf; /* el reparto, una vez por cuadro */ if (lf != g->frame) { lf = g->frame; roll_layout(a, t); } bool grid = bm_is_grid(&a->pat, t); uint16_t col = bm_track_color(t); - int R = grid ? rl.n : rl.hi - rl.lo + 1, L = rl.len ? rl.len : 16, H = y1 - y0; + int lo = rl.lo, hi = rl.hi; /* las máquinas: K4 corre las alturas */ + if (page >= 0 && !grid && a->bx.vy) { + int sh = bm_clampi(a->bx.vy, -lo, 127 - hi); + lo += sh; hi += sh; + } + int R = grid ? rl.n : hi - lo + 1, L = rl.len ? rl.len : 16, H = y1 - y0; if (R < 1) R = 1; int rh = bm_clampi(H / R, 2, 12), top = y0 + (H - R * rh) / 2, x0 = 15, W = 239 - x0; int spb = BM_BAR_TICKS / bm_speed_tps[a->pat.trk[t].speed % SPD_COUNT]; int ps = bm_app_track_step(a, t, grid ? (rl.n ? rl.lane[0] : 0) : -1); bool red = a->rec && a->rec_steps; -#define RX(s) (x0 + (s) * W / L) + int v0 = 0, VL = L; /* los pasos que se ven */ + if (page >= 0) { v0 = page * 16; VL = 16; win = false; } + int v1 = v0 + VL < L ? v0 + VL : L; +#define RX(s) (x0 + ((s) - v0) * W / VL) /* el fondo: los 16 pasos de las blancas en gris (con su corchete), compases y tiempos */ if (win) { int p0 = a->step_page * 16, p1 = p0 + 16 > L ? L : p0 + 16; @@ -841,11 +552,12 @@ static void draw_seq_roll(bm_gfx *g, const bm_app *a, int t, int y0, int y1, boo gfx_hline(g, RX(p0), top + R * rh + 1, RX(p1) - RX(p0) + 1, C_WHITE); gfx_vline(g, RX(p0), top - 2, 2, C_WHITE); gfx_vline(g, RX(p1), top - 2, 2, C_WHITE); } - for (int s = 0; s <= L; s++) { + if (v1 < v0 + VL) gfx_fill(g, RX(v1), top, RX(v0 + VL) - RX(v1), R * rh, C_DDGREY); /* después del largo */ + for (int s = v0; s <= v1; s++) { uint16_t c = s % spb == 0 ? C_DGREY : s % 4 == 0 ? C_DDGREY : 0; if (c) gfx_vline(g, RX(s), top, R * rh, c); } - if (ps >= 0 && ps < L) gfx_vline(g, RX(ps), top, R * rh, C_ORANGE); /* el cabezal */ + if (ps >= v0 && ps < v1) gfx_vline(g, RX(ps), top, R * rh, C_ORANGE); /* el cabezal */ for (int r = 0; r < R; r++) { int y = top + r * rh; if (!gfx_strip_hit(g, y, rh)) continue; @@ -859,7 +571,7 @@ static void draw_seq_roll(bm_gfx *g, const bm_app *a, int t, int y0, int y1, boo } const bm_tr *tr = bm_trk_trc(&a->pat, t); int ll = tr->lane[l].len ? tr->lane[l].len : 16; - for (int s = 0; s < L; s++) { + for (int s = v0; s < v1; s++) { uint8_t v = tr->st[l][s % ll]; if (!(v & ST_ON)) continue; bool mine = red && ((a->rec_steps >> (s % 64)) & 1) && ((a->rec_lanes >> l) & 1); @@ -869,7 +581,7 @@ static void draw_seq_roll(bm_gfx *g, const bm_app *a, int t, int y0, int y1, boo } continue; } - int note = rl.hi - r; /* el teclado vertical */ + int note = hi - r; /* el teclado vertical */ int pc = note % 12; bool blk = pc == 1 || pc == 3 || pc == 6 || pc == 8 || pc == 10, on = roll_sounding(a, t, note); gfx_fill(g, 0, y, blk ? 9 : 14, rh - (rh > 2), on ? col : blk ? C_DGREY : C_GREY); @@ -879,11 +591,12 @@ static void draw_seq_roll(bm_gfx *g, const bm_app *a, int t, int y0, int y1, boo for (int s = 0; s < L; s++) for (int k = 0; k < BM_EVENTS; k++) { const bm_event *e = bm_evc(&a->pat, t, s, k); - if (bm_event_empty(e) || e->note > rl.hi || e->note < rl.lo) continue; - int y = top + (rl.hi - e->note) * rh; + if (bm_event_empty(e) || e->note > hi || e->note < lo) continue; + int y = top + (hi - e->note) * rh; if (!gfx_strip_hit(g, y, rh)) continue; int l = e->len & BM_LEN_MASK; if (l < 1) l = 1; + if (s >= v0 + VL || s + l <= v0) continue; /* fuera de la página */ int xa = RX(s) + e->micro * (W / L) / 24, xb = RX(s + l) - 1; if (e->len & BM_LEN_TIE) xb += 2; else if (e->gate) xb = RX(s + l - 1) + (RX(s + l) - RX(s + l - 1)) * e->gate / 100 - 1; @@ -894,1481 +607,1209 @@ static void draw_seq_roll(bm_gfx *g, const bm_app *a, int t, int y0, int y1, boo if (e->vel <= BM_VEL_GHOST) gfx_rect(g, xa, y, xb > xa ? xb - xa : 1, rh, c); else gfx_fill(g, xa, y, xb > xa ? xb - xa : 1, rh - (rh > 3), c); } - if (a->held_step >= 0 && a->held_long && a->held_step < L) gfx_rect(g, RX(a->held_step) - 1, top, RX(a->held_step + 1) - RX(a->held_step) + 2, R * rh, C_YELLOW); + if (page < 0 && a->held_step >= 0 && a->held_long && a->held_step < L) gfx_rect(g, RX(a->held_step) - 1, top, RX(a->held_step + 1) - RX(a->held_step) + 2, R * rh, C_YELLOW); + } + if (page >= 0 && mach_step_mode(a)) { /* paso a paso: el paso que se escribe */ + int cs = a->bx.step % L; + if (cs >= v0 && cs < v1) { + gfx_rect(g, RX(cs), top - 2, RX(cs + 1) - RX(cs) + 1, R * rh + 4, C_YELLOW); + gfx_rect(g, RX(cs) + 1, top - 1, RX(cs + 1) - RX(cs) - 1, R * rh + 2, C_YELLOW); + } } #undef RX } -/* SEQ de un canal de notas con VIEW = PIANO ROLL: las mismas teclas que NOTES (las blancas son los 16 - * pasos del corchete, B9/B10 lo mueven, B1-B8 los grados), el dibujo es el loop entero. */ -static void draw_seq_pianoroll(bm_gfx *g, const bm_app *a) -{ - int t = a->track; - const bm_track *trk = &a->pat.trk[t]; - if (gfx_strip_hit(g, PY, 9)) { - char b[30], c2[12]; - int len = trk->length ? trk->length : 16, spb = BM_BAR_TICKS / bm_speed_tps[trk->speed % SPD_COUNT]; - if (a->held_step >= 0 && a->held_long) snprintf(c2, sizeof c2, TF("STEP %02d"), a->held_step + 1); - else bm_note_str(a->last_note[t], c2, sizeof c2); - gfx_text(g, 4, PY, c2, C_WHITE, 1); - snprintf(b, sizeof b, TF("STEPS %d-%d"), a->step_page * 16 + 1, a->step_page * 16 + 16 > len ? len : a->step_page * 16 + 16); - gfx_small(g, 56, PY + 1, b, C_CYAN); - if (len % spb == 0) snprintf(b, sizeof b, TF("%d BARS %s"), len / spb, bm_speed_names[trk->speed % SPD_COUNT]); - else snprintf(b, sizeof b, "L%d %s", len, bm_speed_names[trk->speed % SPD_COUNT]); - gfx_text_r(g, 236, PY, b, C_GREY, 1); - } - draw_seq_roll(g, a, t, PY + 12, VB, true); -} +/* V_MACH SEQ: la página de 16 pasos que se ve: la del cabezal sonando, la del cursor parado */ +static int mach_roll_page(const bm_app *a, int t) { (void)t; return mach_view_page(a); } -/* SLOOP-REC en la consola: el canal del cursor en PIANO ROLL, las teclas lo tocan */ +/* PLAY/REC: el canal del cursor en PIANO ROLL; el teclado lo toca (y, con REC, lo sobregraba) */ static void draw_sloop(bm_gfx *g, const bm_app *a) { int t = a->track; if (gfx_strip_hit(g, 25, 10)) { char b[32]; gfx_fill(g, 0, 25, BM_LCD_W, 10, a->rec ? C_RED : C_DGREY); - snprintf(b, sizeof b, TF("SLOOP T%d %s"), t + 1, bm_track_name(a, t)); + snprintf(b, sizeof b, TF("%s T%d %s"), a->rec ? "REC" : "PLAY", app_pos(t) + 1, bm_track_name(a, t)); gfx_text(g, 4, 26, b, C_BLACK, 1); - if (a->rec_free == t + 1) snprintf(b, sizeof b, "%s", T("FREE REC")); - else if (app_kind(a, t) == KIND_NOTE) snprintf(b, sizeof b, a->oct > 0 ? "OCT +%d" : "OCT %d", a->oct); /* el snprintf del SDK no tiene %+d */ - else snprintf(b, sizeof b, "%s", T("B1 = ACCENT")); + if (app_kind(a, t) == KIND_NOTE) snprintf(b, sizeof b, a->oct > 0 ? "OCT +%d" : "OCT %d", a->oct); /* el snprintf del SDK no tiene %+d */ + else if (bm_is_tr(&a->pat, t)) /* batería: OCT sostenidos = golpes suaves / fuertes */ + snprintf(b, sizeof b, "%s", T(bm_gesture_is_down(&a->ges, BTN_OCT_UP) ? "HARD" : bm_gesture_is_down(&a->ges, BTN_OCT_DN) ? "SOFT" : "OCT- SOFT OCT+ HARD")); + else b[0] = 0; gfx_text_r(g, 236, 26, b, C_BLACK, 1); } - draw_seq_roll(g, a, t, 39, VB, false); + draw_seq_roll(g, a, t, 39, VB, false, -1); } -/* ------------------------------------------------------------ SONIDO */ -/* BB-303: dos ciclos de la forma de onda, y el filtro como una curva. */ -static void draw_synth(bm_gfx *g, const bm_app *a, int t, int x0, int y0, int w, int h) +/* GLO del mezclador > SELECT MACHINE: T1 y T2 fijos; en T3-T6, ALGORITHM elige (2 s en una la carga) */ +static void mach_list(bm_gfx *g, const bm_app *a, int y0, int rh); + +static void draw_glo(bm_gfx *g, const bm_app *a) { - const bm_track *tr = &a->pat.trk[t]; - gfx_rect(g, x0, y0, w, h, C_DDGREY); - grid(g, x0 + 2, y0 + 2, w - 4, h - 4, 8); - gfx_hline(g, x0 + 1, y0 + h / 2, w - 2, C_DDGREY); - int sq = a->pat.prm[t][AC_WAVE] & 1; - int py = -1, cw = (w - 4) / 2; - for (int x = 0; x < w - 4; x++) { - int ph = (x % cw) * 256 / cw, s = sq ? (ph < 128 ? 100 : -100) : 127 - ph; - int y = y0 + h / 2 - s * (h / 2 - 6) / 128; - if (py >= 0) gfx_line(g, x0 + 1 + x, py, x0 + 2 + x, y, C_CYAN); - py = y; + char b[30]; + static const char *const PG[BM_GLO_PAGES] = {"SELECT MACHINE", "TEMPO AND SCALE", "MASTER FX"}; + if (gfx_strip_hit(g, 25, 10)) { + gfx_fill(g, 2, 25, gfx_small_w("GLO") + 4, 9, C_CYAN); + gfx_small(g, 4, 27, "GLO", C_BLACK); + snprintf(b, sizeof b, "%s %d/%d", T(PG[a->glo_page % BM_GLO_PAGES]), a->glo_page % BM_GLO_PAGES + 1, BM_GLO_PAGES); + gfx_small(g, 236 - gfx_small_w(b), 27, b, C_WHITE); + } + if (a->glo_page) { /* TEMPO / MASTER FX: las cuatro perillas en lista */ + mach_list(g, a, 40, 38); + return; } - int fx = x0 + 4 + tr->macro[0] * (w - 30) / 127, peak = tr->macro[1] * 14 / 127; - for (int x = x0 + 4; x < x0 + w - 4; x++) { - int y = x < fx - 12 ? y0 + 8 : x < fx ? y0 + 8 - peak * (x - fx + 12) / 12 : y0 + 8 + (x - fx) * 2 / 3; - if (y < y0 + h - 2) gfx_fill(g, x, bm_clampi(y, y0 + 1, y0 + h - 2), 1, 2, C_ORANGE); + for (int n = 0; n < BM_TRACKS; n++) { + int t = BM_ORDER[n], y = PY + 2 + n * 13; + if (!gfx_strip_hit(g, y, 13)) continue; + bool sel = t == a->track, fixed = app_fixed(t); + uint16_t col = bm_track_color(t); + if (sel) { gfx_fill(g, 0, y, BM_LCD_W, 12, C_DDGREY); gfx_fill(g, 0, y, 2, 12, C_CYAN); } + snprintf(b, sizeof b, "T%d", n + 1); + gfx_text(g, 6, y + 2, b, fixed ? C_GREY : col, 1); + int e = sel && a->mach_trk == t ? a->mach_sel : a->pat.trk[t].engine; + int other = fixed ? -1 : bm_machine_conflict(&a->pat, t, e); + bool pending = sel && a->mach_trk == t && e != a->pat.trk[t].engine; + snprintf(b, sizeof b, pending ? "< %s >" : "%s", bm_engine_names[e % ENG_COUNT]); + gfx_text(g, 28, y + 2, b, fixed ? C_GREY : other >= 0 ? C_DGREY : sel ? C_WHITE : C_GREY, 1); + if (fixed) gfx_small(g, 236 - gfx_small_w("FIXED"), y + 3, "FIXED", C_DGREY); + else if (other >= 0) { snprintf(b, sizeof b, TF("ON T%d"), app_pos(other) + 1); gfx_small(g, 236 - gfx_small_w(b), y + 3, b, C_GREY); } + else if (pending && a->mach_arm == 1) { + uint32_t dt = a->now - a->mach_t0; + unsigned left = dt >= BM_MACH_MS ? 0 : (unsigned)(BM_MACH_MS - dt + 99) / 100; + snprintf(b, sizeof b, TF("LOAD IN %u.%u S"), left / 10, left % 10); + gfx_small(g, 236 - gfx_small_w(b), y + 3, b, C_YELLOW); + gfx_fill(g, 2, y + 11, (int)(dt >= BM_MACH_MS ? 236 : dt * 236u / BM_MACH_MS), 1, C_WHITE); + } else if (!pending) gfx_small(g, 236 - gfx_small_w(bm_machine_origin(e)), y + 3, bm_machine_origin(e), C_DGREY); } } -/* BX-7: la topología del algoritmo como en una DX7: portadoras abajo, moduladores encima, la - * realimentación como un lazo. Cada operador con su nivel y su relación de frecuencia. */ -static void draw_fm(bm_gfx *g, const bm_app *a, int t, int x0, int y0, int w, int h) + +/* ------------------------------------------------------------ globales */ +enum { SYS_ROWS = 11 }; +static void sys_val(const bm_app *a, int i, char *v, int cap) { - if (!gfx_strip_hit(g, y0, h + 1)) return; - /* el patch y la topología, una vez por cuadro (no una por franja) */ - static struct { uint32_t frame; int t, alg, bx[6], by[6]; uint8_t p[BM_FM_PATCH], car, mods[6]; int8_t fb[2]; } L; - if (L.frame != g->frame || L.t != t) { - L.frame = g->frame; L.t = t; - uint8_t *p = L.p, *mods = L.mods; - bm_fm_patch_of(&a->pat.trk[t], a->pat.prm[t], NULL, p); - int alg = L.alg = p[BM_FM_ALG] & 31; - uint8_t car = L.car = bm_fm_carriers(alg); - bm_fm_alg_graph(alg, mods, L.fb); - /* profundidad: las portadoras en 0; un modulador, uno más que su destino */ - int depth[6] = {0, 0, 0, 0, 0, 0}, maxd = 0; - for (int it = 0; it < 6; it++) - for (int i = 0; i < 6; i++) - for (int j = 0; j < 6; j++) - if (mods[j] & (1u << i)) if (depth[i] < depth[j] + 1) depth[i] = depth[j] + 1; - for (int i = 0; i < 6; i++) if (depth[i] > maxd) maxd = depth[i]; - /* columnas: las portadoras de izquierda a derecha (OP1 primero), sus cadenas encima */ - float cx[6]; int placed[6] = {0, 0, 0, 0, 0, 0}, col = 0; - for (int pass = 0; pass < 2; pass++) - for (int op = 1; op <= 6; op++) { - int i = 6 - op; - if (placed[i]) continue; - bool carrier = (car >> i) & 1; - if (pass == 0 && !carrier) continue; - int tgt = -1; - for (int j = 0; j < 6; j++) if (mods[j] & (1u << i)) { tgt = j; break; } - if (tgt >= 0 && placed[tgt]) { - int sib = 0; /* hermanos ya puestos sobre el mismo destino */ - for (int k = 0; k < 6; k++) if (k != i && placed[k] && (mods[tgt] & (1u << k))) sib++; - cx[i] = cx[tgt] + (float)sib; - if (sib) { cx[i] = (float)col; col++; } - } else { cx[i] = (float)col; col++; } - placed[i] = 1; - } - int ncol = col > 0 ? col : 1; - float cw = (float)(w - 8) / (float)ncol; - int rh = (h - 18) / (maxd + 1); - if (rh > 22) rh = 22; - for (int i = 0; i < 6; i++) { - L.bx[i] = x0 + 4 + (int)(cx[i] * cw + cw / 2.0f) - 9; - L.by[i] = y0 + h - 18 - depth[i] * rh - 12; - } - } - const uint8_t *p = L.p, *mods = L.mods, car = L.car; - const int8_t *fb = L.fb; - const int *bx = L.bx, *by = L.by, alg = L.alg; - gfx_rect(g, x0, y0, w, h, C_DDGREY); - grid(g, x0 + 2, y0 + 2, w - 4, h - 4, 8); - uint16_t tc = bm_track_color(t); - for (int j = 0; j < 6; j++) /* conexiones */ - for (int i = 0; i < 6; i++) - if (mods[j] & (1u << i)) gfx_line(g, bx[i] + 9, by[i] + 12, bx[j] + 9, by[j], C_GREY); - for (int i = 0; i < 6; i++) if ((car >> i) & 1) gfx_vline(g, bx[i] + 9, by[i] + 12, y0 + h - 14 - by[i] - 12, C_GREY); - gfx_hline(g, x0 + 4, y0 + h - 14, w - 8, C_DGREY); - if (fb[0] >= 0 && fb[1] >= 0) { /* la realimentación */ - int a0 = fb[0], a1 = fb[1]; - int xr = bx[a0] + 20; - gfx_hline(g, bx[a0] + 18, by[a0] + 6, 4, C_ORANGE); - gfx_vline(g, xr, by[a1] - 3, by[a0] + 6 - (by[a1] - 3) + 1, C_ORANGE); - gfx_hline(g, bx[a1] + 9, by[a1] - 3, xr - bx[a1] - 9, C_ORANGE); - gfx_vline(g, bx[a1] + 9, by[a1] - 3, 3, C_ORANGE); - } - char b[12]; - for (int i = 0; i < 6; i++) { - const uint8_t *o = p + i * BM_FM_OP; - bool c = (car >> i) & 1; - int lv = o[FMO_OL] * 16 / 99; - gfx_fill(g, bx[i], by[i], 18, 12, c ? tc : C_DGREY); - gfx_fill(g, bx[i], by[i] + 12 - lv * 12 / 16, 2, lv * 12 / 16, C_WHITE); /* nivel */ - snprintf(b, sizeof b, "%d", 6 - i); - gfx_text(g, bx[i] + 7, by[i] + 3, b, c ? C_BLACK : C_WHITE, 1); + const bm_settings *s = &a->set; + size_t n = (size_t)cap; + switch (i) { + case 0: snprintf(v, n, "%s", s->clock ? "EXTERNAL" : "INTERNAL"); break; + case 1: snprintf(v, n, "%s", s->sync_mode ? "SPLIT L/R" : "STEREO"); break; + case 2: snprintf(v, n, "%d PPQN", s->sync_ppqn); break; + case 3: snprintf(v, n, "%d MS", s->sync_lat); break; + case 4: snprintf(v, n, "%s", s->autosave ? "ON" : "OFF"); break; + case 5: snprintf(v, n, "%s", s->led_dim == 0 ? "OFF" : (s->led_dim == 1 ? "DIM" : "MEDIUM")); break; + case 6: snprintf(v, n, "%s", s->fast_lcd ? "ON (TEST)" : "OFF"); break; + case 7: snprintf(v, n, "%s", s->dual_core ? "ON (TEST)" : "OFF"); break; + case 8: { + int nt = 0; for (int k = 0; k < BM_TAKES; k++) nt += a->take[k].valid; + unsigned fs = (unsigned)(bm_takes_free(a->take) * 10u / BM_SMP_RATE); + snprintf(v, n, TF("%d+%d, FREE %u.%uS"), nt, bm_snaps_user_n(), fs / 10, fs % 10); + break; } - snprintf(b, sizeof b, "ALG %d", alg + 1); - gfx_text(g, x0 + 4, y0 + h - 10, b, C_ORANGE, 1); - snprintf(b, sizeof b, "FB %d", p[BM_FM_FB]); - gfx_small(g, x0 + 56, y0 + h - 9, b, C_ORANGE); - for (int i = 0; i < 6; i++) { /* relaciones de frecuencia, OP1..OP6 */ - const uint8_t *o = p + (5 - i) * BM_FM_OP; - int fc = o[FMO_FC], ff = o[FMO_FF]; - if (o[FMO_MODE]) snprintf(b, sizeof b, "FX"); - else { int r100 = (fc ? fc * 100 : 50) * (100 + ff) / 100; if (r100 % 100) snprintf(b, sizeof b, "%d.%d", r100 / 100, r100 % 100 / 10); else snprintf(b, sizeof b, "%d", r100 / 100); } - gfx_small(g, x0 + 86 + i * 24, y0 + h - 9, b, C_GREY); + case 9: snprintf(v, n, "%s", bm_lang_name()); break; + default: snprintf(v, n, "%s", BM_VERSION_STR); break; } } -/* La onda espejada, como en un sampler: el pico en el tono oscuro y el RMS encima, a todo color. */ -static void draw_wave(bm_gfx *g, const uint8_t wave[2][232], int x0, int y, int w, int h, int c0, int c1, - int hl0, int hl1, uint16_t col, uint16_t hcol) +static void draw_system(bm_gfx *g, const bm_app *a) { - int mid = y + h / 2, half = h / 2 - 1; - for (int x = 0; x < w - 2; x++) { - int c = c0 + (c1 - c0) * x / (w - 2); - if (c < 0 || c >= 232) continue; - bool hi = c >= hl0 && c < hl1; - uint16_t k = hi ? hcol : col; - int p = wave[0][c] * half / 255, r = wave[1][c] * half / 255; - if (p > 0) gfx_vline(g, x0 + 1 + x, mid - p, 2 * p + 1, hi ? C_GREY : dim(k)); - if (r > 0) gfx_vline(g, x0 + 1 + x, mid - r, 2 * r + 1, k); - else gfx_vline(g, x0 + 1 + x, mid, 1, dim(k)); + enum { NR = SYS_ROWS }; + char v[20]; + static const char *const L[NR] = {"CLOCK", "SYNC OUT", "SYNC PPQN", "SYNC LATENCY", "AUTOSAVE", "IDLE LEDS", "FAST SCREEN", "TWO CORES", + "TAKES+SOUNDS", N_("LANGUAGE"), "VERSION"}; + for (int i = 0; i < BM_SYS_VIS; i++) { /* solo lo básico (2026-10-21) */ + int r = BM_SYS_ROWS[i]; + if (!gfx_strip_hit(g, 30 + i * 14, 14)) continue; + sys_val(a, r, v, sizeof v); + row(g, 30 + i * 14, i == a->menu_row, T(L[r]), v); } } -/* ------------------------------------------------------------ BP-1: sampler de pads (T2) */ -static void take_map(bm_gfx *g, const bm_app *a, int src, uint32_t len, int y, int h, int hl) +static void draw_save(bm_gfx *g, const bm_app *a) { - if (!gfx_strip_hit(g, y, h + 1) || !len) return; - uint16_t col = bm_track_color(1); - const bm_pad *ph = hl >= 0 ? &a->pat.pad[hl] : NULL; - int s0 = ph ? (int)((uint64_t)ph->start * 232u / len) : -1, s1 = ph ? (int)((uint64_t)(ph->start + ph->len) * 232u / len) : -1; - gfx_fill(g, 4, y, 232, h, C_DDGREY); - for (int x = 0; x < 232; x++) { - int p = a->wave_ov[x] * (h / 2 - 1) / 255; - gfx_vline(g, 4 + x, y + h / 2 - p, 2 * p + 1, x >= s0 && x < s1 ? col : C_GREY); - } - for (int i = 0; i < BM_LANES; i++) { - const bm_pad *p = &a->pat.pad[i]; - if (!bm_pad_ok(p) || p->src != src) continue; - int x0 = 4 + (int)((uint64_t)p->start * 231u / len), x1 = 4 + (int)((uint64_t)(p->start + p->len) * 231u / len); - gfx_hline(g, x0, y, x1 - x0 > 1 ? x1 - x0 : 1, i == hl ? C_WHITE : dim(col)); - gfx_vline(g, x0, y, 3, i == hl ? C_WHITE : C_GREY); - } - if (a->cut_v1 > a->cut_v0 && a->cut_v1 - a->cut_v0 < len) { - int v0 = (int)((uint64_t)a->cut_v0 * 232u / len), v1 = (int)((uint64_t)a->cut_v1 * 232u / len); - gfx_rect(g, 4 + v0, y, v1 - v0 > 2 ? v1 - v0 : 2, h, C_WHITE); + char r0[24], r1[24], r4[24]; + snprintf(r0, sizeof r0, "A%02d", a->ctx.st.pattern + 1); + snprintf(r1, sizeof r1, "A%02d", a->save_target + 1); + snprintf(r4, sizeof r4, "%d", bm_pattern_count_events(&a->pat)); + header(g, "SAVE", a->dirty ? "UNSAVED" : "SAVED", C_WHITE); + row(g, 50, a->save_row == 0, "SAVE", r0); + row(g, 66, a->save_row == 1, "SAVE AS", r1); + row(g, 82, a->save_row == 2, a->clear_armed ? "CLEAR? SAVE AGAIN" : "CLEAR PATTERN", NULL); + (void)r4; + gfx_small(g, 4, 122, a->ctx.st.playing ? "ONLY WHEN STOPPED (CUTS AUDIO)" : "ONLY WHEN STOPPED - SAVE 2 S: QUICK SAVE", a->ctx.st.playing ? C_ORANGE : C_GREY); +} + +/* ------------------------------------------------------------ el sonido de la batería (ENV y EDIT) */ +/* El instrumento elegido y su golpe dibujado (como en 0.9): la onda espejada que dura lo que DECAY y + * oscila con TUNE sobre el tono del modelo. Se calcula solo cuando cambia (expf y sinf por x). */ +#define HIT_W 228 +static int16_t hit_y[HIT_W]; +static uint8_t hit_key[4]; +static int hit_hz; + +static void hit_seg(bm_gfx *g, int xa, int ya, int xb, int yb, uint16_t c) +{ + if ((ya > yb ? ya : yb) < g->cy0 || (ya < yb ? ya : yb) >= g->cy1) return; + gfx_line(g, xa, ya, xb, yb, c); +} + +static void draw_hit(bm_gfx *g, const bm_app *a, int y0, int h) +{ + int t = a->track, lane = a->sel_lane[t] & 15; + const bm_lane *ln = &bm_trk_trc(&a->pat, t)->lane[lane]; + int model = ln->model % DRM_COUNT; + uint16_t col = bm_track_color(t); + char b[32]; + if (gfx_strip_hit(g, y0, 9)) { + snprintf(b, sizeof b, "%d %s - %s", lane + 1, T(bm_lane_name(a, t, lane)), T(bm_drm_names[model])); + gfx_text(g, 4, y0, b, C_WHITE, 1); } - const bm_status *st = &a->ctx.st; - if (st->smp_pos_src == src && st->smp_pos < len) gfx_vline(g, 4 + (int)((uint64_t)st->smp_pos * 231u / len), y, h, C_ORANGE); + int x0 = 6, wy = y0 + 13, wh = h - 13, mid = wy + wh / 2; + if (!gfx_strip_hit(g, wy - 2, wh + 4)) return; + gfx_rect(g, x0 - 2, wy - 2, HIT_W + 4, wh + 4, C_DDGREY); + gfx_hline(g, x0, mid, HIT_W, C_DDGREY); + int dec = 6 + ln->decay * (HIT_W - 12) / 127, n = dec < HIT_W ? dec : HIT_W; + const uint8_t key[4] = {(uint8_t)model, ln->tune, (uint8_t)dec, (uint8_t)wh}; + if (memcmp(key, hit_key, sizeof key)) { + memcpy(hit_key, key, sizeof key); + float hz = (float)bm_drm_base_hz[model] * exp2f((float)(ln->tune - 64) * 0.375f / 12.0f); + for (int x = 0; x < n; x++) + hit_y[x] = (int16_t)(sinf((float)x * 0.12f * hz / 300.0f) * expf(-4.0f * (float)x / (float)dec) * (float)(wh / 2 - 3)); + hit_hz = (int)(hz + 0.5f); + } + for (int x = 1; x < n; x++) { + hit_seg(g, x0 + x - 1, mid - hit_y[x - 1], x0 + x, mid - hit_y[x], col); + hit_seg(g, x0 + x - 1, mid + hit_y[x - 1], x0 + x, mid + hit_y[x], dim(col)); + } + snprintf(b, sizeof b, "%d HZ", hit_hz); + gfx_small(g, x0 + HIT_W - gfx_small_w(b) - 2, wy + 2, b, C_GREY); } -/* PADS: el editor del pad elegido, como un KO II o un OP-1 field. Arriba el mapa de su toma; en - * el medio la onda grande con el pad entre corchetes cian y su loop (sustain) en verde menta. */ -static void draw_pads(bm_gfx *g, const bm_app *a) +/* ------------------------------------------------------------ capas: lo que hace cada tecla */ +/* ACENTOS y REPETIR: los pasos del compás del instrumento elegido, cada uno encima de su blanca + * (mismo ancho que la franja de teclas), para ver qué paso estás tocando. Con golpe: el color del + * canal; con acento (o repetición): blanco (o amarillo) y su marca; el que suena, subrayado. */ +static void draw_steps_ref(bm_gfx *g, const bm_app *a, int y0) { - PASO(12); - int sel = a->sel_lane[1] & 15, page = a->ed_page[1] % 4; - const bm_pad *p = &a->pat.pad[sel]; - const bm_status *st = &a->ctx.st; - uint16_t col = bm_track_color(1); - char b[40]; - bool ok = bm_pad_ok(p) && a->cut_wlen; - uint32_t len = a->cut_wlen; - if (gfx_strip_hit(g, PY, 9)) { - snprintf(b, sizeof b, TF("PAD %d"), sel + 1); - int x = gfx_text(g, 4, PY, b, C_WHITE, 1) + 10; - if (ok) { bm_app_src_name(a, p->src, b, sizeof b); gfx_small(g, x, PY + 1, b, C_GREY); } - static const char *const PG[4] = {N_("TRIM"), N_("SOUND"), N_("ENV"), N_("LOOP")}; - int xr = 236; - for (int i = 3; i >= 0; i--) { - xr -= gfx_small_w(PG[i]); - gfx_small(g, xr, PY + 1, PG[i], i == page ? C_ORANGE : C_GREY); - xr -= 6; + int t = a->track, lane = a->sel_lane[t] & 15; + const bm_tr *tr = bm_trk_trc(&a->pat, t); + uint16_t col = bm_track_color(t); + int len = tr->lane[lane].len, rep = a->layer == L_REP; + char b[24]; + if (gfx_strip_hit(g, y0, 9)) { + snprintf(b, sizeof b, "%d %s", lane + 1, T(bm_lane_name(a, t, lane))); + gfx_text(g, 4, y0, b, col, 1); + snprintf(b, sizeof b, TF("BAR %d/%d"), a->step_page + 1, (len + 15) / 16); + gfx_text_r(g, 236, y0, b, C_GREY, 1); + } + /* los otros instrumentos de la página en gris, una línea fina cada uno: para acentuar sabiendo + * dónde caen el bombo o la caja (pedido del usuario 2026-10-21) */ + int base = (lane / 8) * 8, gy = y0 + 11; + for (int i = 0; i < 8; i++) { + int l = base + i, ry = gy + i * 3; + if (l == lane || !gfx_strip_hit(g, ry, 2)) continue; + int ll = tr->lane[l].len ? tr->lane[l].len : 16; + for (int w = 0; w < 16; w++) { + int s = a->step_page * 16 + w; + if (s < ll && (tr->st[l][s] & ST_ON)) gfx_fill(g, w * 15 + 1, ry, 12, 2, C_DGREY); } } - if (!ok) { - if (gfx_strip_hit(g, PY + 24, 40)) { - gfx_text_c(g, 120, PY + 28, "EMPTY PAD", C_WHITE, 1); - gfx_small(g, 120 - gfx_small_w("TAKES (HOLD EDIT): BLACK 1 = KIT FROM A TAKE") / 2, PY + 44, "TAKES (HOLD EDIT): BLACK 1 = KIT FROM A TAKE", C_GREY); - gfx_small(g, 120 - gfx_small_w("BLACK 4 = THE TAKE ON THIS PAD") / 2, PY + 52, "BLACK 4 = THE TAKE ON THIS PAD", C_GREY); + int y = gy + 26, h = 22; + if (!gfx_strip_hit(g, y, h + 3)) return; + int ps = bm_app_track_step(a, t, lane); + for (int w = 0; w < 16; w++) { + int s = a->step_page * 16 + w, x = w * 15; + if (s >= len) { gfx_fill(g, x + 6, y + h / 2, 2, 2, C_DDGREY); continue; } + uint8_t v = tr->st[lane][s]; + int rat = (v & ST_FLAM) ? 4 : (v & ST_RAT_MASK) >> ST_RAT_SH; + bool on = (v & ST_ON) != 0, mark = on && (rep ? rat != 0 : (v & ST_ACC) != 0); + if (on) gfx_fill(g, x, y, 14, h, mark ? (rep ? C_YELLOW : C_WHITE) : dim(col)); + else gfx_rect(g, x, y, 14, h, w % 4 == 0 ? C_DGREY : C_DDGREY); + snprintf(b, sizeof b, "%d", s + 1); + gfx_small(g, x + (14 - gfx_small_w(b)) / 2 + 1, y + 3, b, mark ? C_BLACK : on ? C_WHITE : C_DGREY); + if (mark) { + static const char *const R[5] = {"", "X2", "X3", "X4", "FL"}; + const char *m = rep ? R[rat] : "A"; + gfx_small(g, x + (14 - gfx_small_w(m)) / 2 + 1, y + 13, m, C_BLACK); } - hint_s(g, VB - 6, "WHITE = PLAY AND PICK A PAD - PRESETS = ITS TAKE"); - return; + if (s == ps) gfx_fill(g, x, y + h + 1, 14, 2, C_ORANGE); } - take_map(g, a, p->src, len, PY + 10, 9, sel); - int wy = PY + 21, wh = 58; - uint32_t v0 = a->cut_v0, v1 = a->cut_v1 > a->cut_v0 ? a->cut_v1 : len, span = v1 - v0; -#define VX(q) (5 + (int)(((int64_t)(q) - (int64_t)v0) * 230 / (int64_t)span)) - if (gfx_strip_hit(g, wy, wh + 1)) { - uint32_t a0 = p->start, a1 = (uint32_t)p->start + p->len; - int bx0 = bm_clampi(VX(a0), 4, 236), bx1 = bm_clampi(VX(a1), 4, 236); - if (bx1 > bx0) gfx_fill(g, bx0, wy, bx1 - bx0, wh, C_DDGREY); - gfx_hline(g, 4, wy + wh / 2, 232, C_DDGREY); - int hl0 = (int)(((int64_t)a0 - v0) * 232 / (int64_t)span), hl1 = (int)(((int64_t)a1 - v0) * 232 / (int64_t)span); - draw_wave(g, a->wave_cut, 4, wy, 232, wh, 0, 232, hl0, hl1, dim(col), C_CYAN); - if (p->mode == PAD_LOOP && (bm_pad_has_loop(p) || page == 3)) { /* el loop de sustain */ - uint32_t l0 = p->start + bm_pad_loop_start(p), l1 = p->start + bm_pad_loop_end(p); - int lx0 = bm_clampi(VX(l0), 4, 236), lx1 = bm_clampi(VX(l1), 4, 236); - gfx_fill(g, lx0, wy + wh - 3, lx1 - lx0 > 1 ? lx1 - lx0 : 1, 3, C_GREEN); - gfx_small(g, lx0 + 2, wy + wh - 10, "LOOP", C_GREEN); - } - if (a->cut_snap) { - uint32_t bpm = a->take[p->src].bpm_x10 ? a->take[p->src].bpm_x10 : a->pat.meta.bpm_x10; - uint32_t snap = (uint32_t)BM_SMP_RATE * (a->cut_snap == 1 ? 150u : 300u) / bpm; - if (snap && span / snap < 116) - for (uint32_t q = (v0 + snap - 1) / snap * snap; q < v1; q += snap) gfx_vline(g, VX(q), wy + wh - 4, 4, C_GREY); - } - for (int i = 0; i < BM_LANES; i++) { - const bm_pad *o = &a->pat.pad[i]; - if (i == sel || !bm_pad_ok(o) || o->src != p->src || o->start < v0 || o->start >= v1) continue; - int x = VX(o->start); - gfx_vline(g, x, wy, wh, C_DGREY); - snprintf(b, sizeof b, "%d", i + 1); - gfx_small(g, x + 2, wy + 2, b, C_GREY); - } - if (a0 >= v0 && a0 < v1) { - int x = VX(a0); - gfx_vline(g, x, wy, wh, C_CYAN); gfx_hline(g, x, wy, 5, C_CYAN); gfx_hline(g, x, wy + wh - 1, 5, C_CYAN); - gfx_fill(g, x, wy + 2, 9, 7, C_CYAN); - snprintf(b, sizeof b, "%d", sel + 1); - gfx_small(g, x + 2, wy + 3, b, C_BLACK); - } - if (a1 > v0 && a1 <= v1) { - int x = VX(a1) - 1; - gfx_vline(g, x, wy, wh, C_CYAN); gfx_hline(g, x - 4, wy, 5, C_CYAN); gfx_hline(g, x - 4, wy + wh - 1, 5, C_CYAN); - } - if (st->smp_pos_src == p->src && st->smp_pos >= v0 && st->smp_pos < v1) gfx_vline(g, VX(st->smp_pos), wy, wh, C_ORANGE); - } -#undef VX - PASO(14); - if (gfx_strip_hit(g, wy + wh + 2, 6)) { - unsigned ms = (unsigned)((uint32_t)p->len * 1000u / BM_SMP_RATE); - snprintf(b, sizeof b, "%s %+d ST %u MS%s%s", T(bm_pad_mode_name(p->mode)), p->pitch - 24, ms, - (p->flags & PAD_REV) ? " REV" : "", (p->flags & PAD_TEMPO) ? " SYNC" : ""); - gfx_small(g, 4, wy + wh + 2, b, C_WHITE); - snprintf(b, sizeof b, "X%d", 1 << (a->cut_zoom & 3)); - gfx_small(g, 236 - gfx_small_w(b), wy + wh + 2, b, C_GREY); - } - PASO(15); - bool holding = a->pad_key >= 0 && a->keys_down[a->pad_key]; - static const char *const HL[4] = {N_("K1 START - K2 END - EDIT = SOUND, ENV, LOOP"), N_("K3 PLAY: ONESHOT, KEY, THRU OR LOOP"), N_("ATTACK, RELEASE, CHOKE GROUP, TEMPO SYNC"), - N_("HELD: THE LOOP REPEATS - RELEASED: TO THE END")}; - hint_s(g, VB - 6, holding ? "HELD: KEY, THRU AND LOOP KEEP PLAYING" : HL[page]); } -/* BREAK: la fila YOU (lo que programaste) y la fila PLAYS (lo que BREAK hace sonar este compás). */ -static void draw_break(bm_gfx *g, const bm_app *a) +/* LENGTH AND SPEED (Slicer): los 8 pads de la página, cada uno con su largo (una barra de 1 a 64 + * pasos, con los compases marcados); el elegido encendido */ +static void lane_lengths(bm_gfx *g, const bm_app *a, int y0) { - const bm_status *st = &a->ctx.st; - const bm_track *tk = &a->pat.trk[1]; - const bm_tr *tr = &a->pat.tr[1]; - uint16_t col = bm_track_color(1); - char b[30]; - bool on = tk->gen[0] || tk->gen[2] || tk->gen[3]; - if (gfx_strip_hit(g, PY, 9)) gfx_text(g, 4, PY, on ? "THE GRID, VARIED EVERY BAR" : "ALL AT 0: THE GRID AS IS", on ? C_WHITE : C_GREY, 1); - uint32_t blk = st->gen_blk; - int cur = st->playing ? (int)(st->tn[1] % 16u) : -1; - int ty = PY + 18, sy = PY + 46; - if (gfx_strip_hit(g, ty - 8, 58)) { - gfx_small(g, 2, ty - 7, "YOU", C_GREY); - gfx_small(g, 2, sy - 7, "PLAYS", C_GREY); - for (int k = 0; k < 16; k++) { - int x = 1 + k * 15, main = -1; - for (int l = 0; l < BM_LANES && main < 0; l++) { - int len = tr->lane[l].len ? tr->lane[l].len : 16; - if (!((tr->mute >> l) & 1) && (tr->st[l][(blk * 16u + (uint32_t)k) % (uint32_t)len] & ST_ON)) main = l; - } - uint16_t bg = k == cur ? C_WHITE : main >= 0 ? C_DDGREY : C_BLACK; - gfx_fill(g, x, ty, 13, 18, bg); - if (main >= 0) { snprintf(b, sizeof b, "%d", main + 1); gfx_small(g, x + 7 - gfx_small_w(b) / 2, ty + 7, b, k == cur ? C_BLACK : C_GREY); } - else gfx_fill(g, x + 5, ty + 8, 2, 2, C_DGREY); - uint8_t pl = st->gen_sl[k], fx = st->gen_fx[k]; - bool changed = pl != 0xFF && pl != main; - gfx_fill(g, x, sy, 13, 18, k == cur ? C_WHITE : pl != 0xFF ? (changed ? col : C_DDGREY) : C_BLACK); - uint16_t fg = k == cur || changed ? C_BLACK : C_WHITE; - if (pl != 0xFF) { snprintf(b, sizeof b, "%d", pl + 1); gfx_small(g, x + 7 - gfx_small_w(b) / 2, sy + 7, b, fg); } - else if (fx & GEN_SKIP) gfx_text(g, x + 4, sy + 5, "-", C_RED, 1); - if (fx & GEN_RT_MASK) gfx_fill(g, x + 1, sy + 15, 11, 2, C_ORANGE); - if (fx & GEN_REV) gfx_small(g, x + 1, sy + 1, "<", fg); - if (fx & GEN_HALF) gfx_small(g, x + 9, sy + 1, "H", fg); - } - } - hint_s(g, PY + 70, "VARY: OTHER PADS - ANCHOR: THE BEATS STAY"); - hint_s(g, PY + 78, "REPEAT: RETRIGS - BREAK: REVERSE, HALF, SILENCE"); - hint_s(g, PY + 88, "HOLD EDIT + BLACK 4 = CAPTURE INTO THE GRID"); -} - -/* ------------------------------------------------------------ el dibujo del visor, guardado - * El cuadro recorre la escena una vez por franja (30 veces). Las curvas del visor de SOUND (filtro, - * ondas, LFO, el golpe de la batería, la tabla de BITTAL) cuestan exp/log/seno por cada x: se - * calculan cuando cambia lo que dibujan y cada franja las recorre desde aquí. Se ve una sola a la - * vez: la clave dice cuál es y con qué valores. ~1.4 KB. */ -#define CV_W 228 -static union { - int16_t y[2][CV_W]; /* curvas: la fila de cada x, desde y0 */ - uint8_t tab[1368]; /* BITTAL: los frames uno tras otro, desde su fila de arriba (8 x 171 como mucho) */ -} cv; -static int32_t cv_x[8]; /* lo demás de la curva: marcas, la barra del ENV, Hz */ -static uint8_t cv_key[24], cv_len; - -/* ¿lo guardado es de esta clave? Si no, la anota: el que llama lo calcula de nuevo */ -static bool cv_fresh(const uint8_t *key, int len) -{ - if (len == cv_len && !memcmp(cv_key, key, (size_t)len)) return true; - memcpy(cv_key, key, (size_t)len); - cv_len = (uint8_t)len; - return false; -} - -/* un tramo de la curva solo si toca la franja (los demás ni llaman a gfx_line) */ -static void seg(bm_gfx *g, int xa, int ya, int xb, int yb, uint16_t c) -{ - if (ya < 0) return; /* como el "py >= 0" de siempre */ - if ((ya > yb ? ya : yb) < g->cy0 || (ya < yb ? ya : yb) >= g->cy1) return; - gfx_line(g, xa, ya, xb, yb, c); -} - -/* ------------------------------------------------------------ editor de sonido por páginas */ -static float mini_wave(int w, float p) /* las formas de B-MINI */ -{ - float saw = 1.0f - 2.0f * p, tri = p < 0.5f ? 4.0f * p - 1.0f : 3.0f - 4.0f * p; - switch (w) { - case MN_WAVE_TRI: return tri; - case MN_WAVE_SHARK: return 0.5f * (tri + saw); - case MN_WAVE_SQR: return p < 0.5f ? 1.0f : -1.0f; - case MN_WAVE_WIDE: return p < 0.3f ? 1.0f : -1.0f; - case MN_WAVE_NARROW: return p < 0.12f ? 1.0f : -1.0f; - default: return saw; + int t = a->track, sel = a->sel_lane[t] & 15, base = (sel / 8) * 8; + const bm_tr *tr = bm_trk_trc(&a->pat, t); + uint16_t col = bm_track_color(t); + int spb = BM_BAR_TICKS / bm_speed_tps[a->pat.trk[t].speed % SPD_COUNT]; + char b[12]; + for (int i = 0; i < 8; i++) { + int l = base + i, y = y0 + i * 11, len = tr->lane[l].len ? tr->lane[l].len : 16; + if (!gfx_strip_hit(g, y, 10)) continue; + bool s = l == sel; + if (s) gfx_fill(g, 0, y, 240, 10, C_DDGREY); + snprintf(b, sizeof b, "P%d", l + 1); + gfx_small(g, 2, y + 3, b, s ? C_WHITE : C_GREY); + gfx_fill(g, 20, y + 2, len * 3, 6, s ? col : dim(col)); /* 64 pasos = 192 px */ + for (int c = spb; c < BM_STEPS; c += spb) gfx_vline(g, 20 + c * 3, y + 1, 8, C_DGREY); + snprintf(b, sizeof b, "%d", len); + gfx_small(g, 236 - gfx_small_w(b), y + 3, b, s ? C_WHITE : C_GREY); } } -/* B-MINI: los tres osciladores sumados (el de la página resaltado) · BUNO-6: el DCO con su PWM */ -static void ed_wave(bm_gfx *g, const bm_app *a, int t, int x0, int y0, int w, int h, int page) +/* La franja del teclado ya muestra cada tecla con su luz; el visor dice qué capa es y cómo se usa. */ +static void draw_layer(bm_gfx *g, const bm_app *a) { - const uint8_t *q = a->pat.prm[t]; - int eng = a->pat.trk[t].engine, mid = y0 + h / 2; - bool two = eng == ENG_MINI && page >= 0 && page <= 2; /* el oscilador de la página, encima */ - uint16_t col = C_CYAN; - gfx_hline(g, x0, mid, w, C_DDGREY); - if (w > CV_W) return; - const uint8_t key[] = {1, (uint8_t)eng, (uint8_t)(page + 1), (uint8_t)w, (uint8_t)h, q[BN_PWM], q[BN_SAW], q[BN_PULSE], q[BN_SUB], - q[MN_W1], q[MN_W2], q[MN_W3], q[MN_R1], q[MN_R2], q[MN_R3], q[MN_L1], q[MN_L2], q[MN_L3]}; - if (!cv_fresh(key, sizeof key)) { - static const float RG[5] = {0.25f, 0.5f, 1.0f, 2.0f, 4.0f}; - for (int x = 0; x < w; x++) { - float p = (float)x * 2.0f / (float)w, y, y2 = 0.0f; - if (eng == ENG_BUNO) { - float ph = p - (float)(int)p, pw = 0.5f - 0.46f * (float)q[BN_PWM] / 127.0f * 0.5f; - y = (q[BN_SAW] ? 1.0f - 2.0f * ph : 0.0f) + (q[BN_PULSE] ? (ph < pw ? 1.0f : -1.0f) : 0.0f); - float ps = p * 0.5f; ps -= (float)(int)ps; - y += (float)q[BN_SUB] / 127.0f * (ps < 0.5f ? 1.0f : -1.0f); - y *= 0.6f; - } else { - static const uint8_t W[3] = {MN_W1, MN_W2, MN_W3}, R[3] = {MN_R1, MN_R2, MN_R3}, L[3] = {MN_L1, MN_L2, MN_L3}; - y = 0.0f; - int sel = page >= 0 && page <= 2 ? page : -1; - for (int k = 0; k < 3; k++) { - float pk = p * RG[q[R[k]] % 5] / RG[q[R[0]] % 5]; pk -= (float)(int)pk; - float v = mini_wave(q[W[k]] % MN_WAVES, pk) * (float)q[L[k]] / 127.0f; - y += v * 0.45f; - if (k == sel) y2 = v; - } - if (sel < 0) y2 = 0.0f; - } - cv.y[0][x] = (int16_t)(h / 2 - (int)(bm_clampf(y, -1.2f, 1.2f) * (float)(h / 2 - 3))); - cv.y[1][x] = (int16_t)(h / 2 - (int)(y2 * (float)(h / 2 - 3))); - } - } - for (int x = 1; x < w; x++) { /* en el orden de siempre: se pisan igual */ - seg(g, x0 + x - 1, y0 + cv.y[0][x - 1], x0 + x, y0 + cv.y[0][x], col); - if (two) seg(g, x0 + x - 1, y0 + cv.y[1][x - 1], x0 + x, y0 + cv.y[1][x], C_ORANGE); + static char title[24]; /* el mapa de la capa: una vez por cuadro */ + static uint16_t col; + static const char *h1, *h2; + static uint32_t mf; + if (mf != g->frame) { + bm_keyfn K[BM_KEYS]; /* aquí solo hace falta el título y las ayudas */ + mf = g->frame; + bm_app_keymap(a, K, title, sizeof title, &col, &h1, &h2); } + if (gfx_strip_hit(g, 26, 20)) { + gfx_fill(g, 0, 26, BM_LCD_W, 18, col); + gfx_text(g, 6, 28, title, C_BLACK, 2); + char b[24]; + snprintf(b, sizeof b, "T%d", app_pos(a->track) + 1); + if (a->layer_latch) { /* abierta con un toque: queda hasta cerrarla */ + gfx_small(g, 236 - gfx_small_w("LATCHED"), 28, "LATCHED", C_BLACK); + gfx_small(g, 236 - gfx_small_w(b), 36, b, C_BLACK); + page_tag(g, a, 236 - gfx_small_w(b) - 4, 34, 9, C_BLACK); + } else page_tag(g, a, 234 - gfx_text_r(g, 234, 32, b, C_BLACK, 1) - 4, 31, 9, C_BLACK); + } + /* Lo que la capa toca, no una copia de la franja de teclas: en MUTE los instrumentos (mute en rojo, + * destello al sonar); en ENV y EDIT el sonido elegido y su golpe; en ACENTOS y REPETIR los pasos + * del compás encima de sus blancas. */ + if (a->layer == L_LEN) lane_lengths(g, a, 48); + else if (a->layer == L_MUTE) lane_pads(g, a, a->track, 47, 14); + else if (a->layer == L_HIT || a->layer == L_INST) draw_hit(g, a, 47, 58); + else if (a->layer == L_ACC || a->layer == L_REP) draw_steps_ref(g, a, 48); + /* cómo se usa (se va a los 4 s) y cómo se sale (queda) */ } -/* BITTAL: la tabla en 2.5D, los frames uno detrás del otro; el de la posición actual en cian */ -static void ed_table(bm_gfx *g, const bm_app *a, int t, int x0, int y0, int w, int h, int osc) +/* ------------------------------------------------------------ recuadro, pregunta, overlay, toast */ +/* ALGORITHM en INSTR (batería): el instrumento al que vas */ +static void draw_box(bm_gfx *g, const bm_app *a) { - int slot = osc & 1; - if (!bm_wt_ready(slot)) { gfx_text_c(g, x0 + w / 2, y0 + h / 2 - 3, "NO TABLE", C_GREY, 1); return; } - const uint8_t *q = a->pat.prm[t]; - int nf = bm_wt_frames(slot); - float pos = (float)q[slot ? BT_P2 : BT_P1] / 127.0f + bm_bt_macro(q, a->pat.trk[t].macro, slot ? BTM_POS2 : BTM_POS1) + bm_bt_macro(q, a->pat.trk[t].macro, BTM_POS); - pos = bm_clampf(pos, 0.0f, 1.0f); - int curf = (int)(pos * (float)(nf - 1) + 0.5f); - int dx = 7, dy = 5, ww = w - 8 - dx * (nf - 1), hh = h - 6 - dy * (nf - 1); - if (hh < 16) hh = 16; - if (nf < 1 || ww < 1 || nf * ww > (int)sizeof cv.tab || hh > 255) return; - uint32_t sig = a->wt_sig[slot]; - const uint8_t key[] = {2, (uint8_t)slot, (uint8_t)nf, (uint8_t)ww, (uint8_t)hh, - (uint8_t)sig, (uint8_t)(sig >> 8), (uint8_t)(sig >> 16), (uint8_t)(sig >> 24)}; - if (!cv_fresh(key, sizeof key)) /* la tabla solo cambia si se rearma */ - for (int f = 0; f < nf; f++) { - int n; - const int16_t *d = bm_wt_data(slot, f, 3, &n); /* 128 muestras para dibujar */ - for (int x = 0; x < ww; x++) cv.tab[f * ww + x] = (uint8_t)(hh / 2 - (int)d[x * n / ww] * (hh / 2 - 1) / 32768); - } - for (int f = nf - 1; f >= 0; f--) { - int ox = x0 + 4 + f * dx, oy = y0 + 3 + (nf - 1 - f) * dy; - if (oy + hh <= g->cy0 || oy >= g->cy1) continue; /* el frame entero, fuera de la franja */ - uint16_t c = f == curf ? C_CYAN : (f < curf ? C_DGREY : dim(C_VIOLET)); - const uint8_t *ty = cv.tab + f * ww; - for (int x = 1; x < ww; x++) seg(g, ox + x - 1, oy + ty[x - 1], ox + x, oy + ty[x], c); - } + int t = a->track; + if (!gfx_strip_hit(g, 50, 70)) return; + gfx_fill(g, 40, 50, 160, 68, C_BLACK); + gfx_rect(g, 40, 50, 160, 68, bm_track_color(t)); + gfx_rect(g, 41, 51, 158, 66, bm_track_color(t)); char b[24]; - snprintf(b, sizeof b, "WT FRAME %d/%d", curf + 1, nf); - gfx_small(g, x0 + 4, y0 + h - 6, b, C_WHITE); - snprintf(b, sizeof b, "UNISON %d", (q[slot ? BT_U2 : BT_U1] & 3) + 1); - gfx_small(g, x0 + w - gfx_small_w(b) - 4, y0 + h - 6, b, C_GREY); + snprintf(b, sizeof b, "%d", a->box_lane + 1); + gfx_text_c(g, 120, 58, b, bm_track_color(t), 4); + const bm_lane *ln = &bm_trk_trc(&a->pat, t)->lane[a->box_lane & 15]; + if (bm_is_pads(t)) { /* un pad del Slicer: su toma */ + char tk[16]; + if (bm_pad_ok(&a->pat.pad[a->box_lane & 15])) bm_app_src_name(a, a->pat.pad[a->box_lane & 15].src, tk, sizeof tk); + else snprintf(tk, sizeof tk, "%s", T("EMPTY")); + snprintf(b, sizeof b, "%s - %s", T(bm_lane_name(a, t, a->box_lane)), tk); + } else snprintf(b, sizeof b, "%s - %s", T(bm_lane_name(a, t, a->box_lane)), T(bm_drm_short[ln->model % DRM_COUNT])); + gfx_text_c(g, 120, 92, b, C_WHITE, 1); + int left = (int)(a->box_until - a->now); + int w = bm_clampi(left * 140 / 400, 0, 140); + gfx_fill(g, 50, 108, 140, 3, C_DGREY); + gfx_fill(g, 50, 108, 140 - w, 3, bm_track_color(t)); } -static float ed_filter_db(int type, float w, float qv) /* respuesta del filtro, w = f / corte */ +/* K1-K4: una línea con el nombre y el valor en la fila de arriba (pestañas o título), sin tapar la + * rejilla ni el paso sostenido; el dial de abajo ya marca cuál giró. */ +static void draw_overlay_line(bm_gfx *g, const bm_app *a) { - float w2 = w * w; - float d1 = sqrtf((1.0f - w2) * (1.0f - w2) + w2 / (qv * qv)); - float qb = 0.5f + 0.02f * qv, d2 = sqrtf((1.0f - w2) * (1.0f - w2) + w2 / (qb * qb)); - float m; - switch (type) { - case 1: m = 1.0f / d1; break; /* LP 12 */ - case 2: m = (w / qv) / d1 * 1.5f; break; /* BP */ - case 3: m = w2 / d1; break; /* HP */ - default: m = 1.0f / (d1 * d2); break; /* LP 24 y escalera */ - } - return 20.0f * log10f(m > 1e-6f ? m : 1e-6f); + const bm_overlay *o = &a->ov; + bool tall = a->layer || a->view == V_SAVE; + int h = tall ? 21 : 11; /* también tapa el título grande de esas pantallas */ + if (!gfx_strip_hit(g, 24, h)) return; + gfx_fill(g, 0, 24, BM_LCD_W, h, C_BLACK); + int y = 24 + (h - 7) / 2; + gfx_text(g, 4, y, o->title, o->color, 1); + int x = 236; + if (o->unit[0]) x -= gfx_text_r(g, x, y, o->unit, C_GREY, 1) + 4; + gfx_text_r(g, x, y, o->val, C_WHITE, 1); + gfx_fill(g, 0, 24 + h - 1, BM_LCD_W, 1, C_DDGREY); + gfx_fill(g, 0, 24 + h - 1, o->pct * BM_LCD_W / 255, 1, o->color); } -static void ed_filter(bm_gfx *g, const bm_app *a, int t, int x0, int y0, int w, int h) +static void draw_overlay(bm_gfx *g, const bm_app *a) { - const bm_track *tk = &a->pat.trk[t]; - const uint8_t *q = a->pat.prm[t]; - int eng = tk->engine, type = 0, cut, res, envb; - if (eng == ENG_BITTAL) { type = q[BT_FT] % BT_FILTERS; cut = q[BT_CUT]; res = q[BT_RES]; envb = q[BT_FENV]; if (type == BT_F_LADDER) type = 0; } - else { cut = tk->macro[0]; res = tk->macro[1]; envb = tk->macro[2]; } /* B-MINI y BUNO-6: CONTOUR / ENV */ - if (eng == ENG_BITTAL && q[BT_FT] == BT_F_OFF) { gfx_text_c(g, x0 + w / 2, y0 + h / 2, "FILTER OFF", C_GREY, 1); return; } - if (w > CV_W) return; - int hpf = eng == ENG_BUNO ? q[BN_HPF] : 0; - const uint8_t key[] = {3, (uint8_t)(eng == ENG_BITTAL), (uint8_t)type, (uint8_t)cut, (uint8_t)res, (uint8_t)envb, (uint8_t)hpf, (uint8_t)w, (uint8_t)h}; - enum { XA, XB, ENV_ON, HPF_X, MK0 }; /* cv_x: lo que no es la curva */ - if (!cv_fresh(key, sizeof key)) { /* 228 x (exp2f, 2 sqrtf, log10f): solo si cambió */ - float env = eng == ENG_BITTAL ? (float)(envb - 64) / 63.0f * 72.0f : (float)envb / 127.0f * 72.0f; - float fc = bm_cut_hz(cut), qv = bm_reso_q(res); - cv_x[ENV_ON] = env != 0.0f; - if (env != 0.0f) { - float fe = fc * exp2f(env / 12.0f); - cv_x[XA] = (int)((log2f(bm_clampf(fc, 20.0f, 20000.0f) / 20.0f)) / 10.0f * (float)w); - cv_x[XB] = (int)((log2f(bm_clampf(fe, 20.0f, 20000.0f) / 20.0f)) / 10.0f * (float)w); - } - for (int x = 0; x < w; x++) { - float f = 20.0f * exp2f((float)x * 10.0f / (float)w); - float db = bm_clampf(ed_filter_db(type, f / fc, qv), -36.0f, 18.0f); - cv.y[0][x] = (int16_t)(int)((18.0f - db) / 54.0f * (float)(h - 6)); - } - static const float F[3] = {100.0f, 1000.0f, 10000.0f}; - for (int k = 0; k < 3; k++) cv_x[MK0 + k] = (int)(log2f(F[k] / 20.0f) / 10.0f * (float)w); - static const float HZ[4] = {0.0f, 120.0f, 250.0f, 520.0f}; - if (hpf) cv_x[HPF_X] = (int)(log2f(HZ[hpf & 3] / 20.0f) / 10.0f * (float)w); - } - if (cv_x[ENV_ON]) { - int xa = x0 + cv_x[XA], xb = x0 + cv_x[XB]; - gfx_fill(g, xa < xb ? xa : xb, y0 + h - 4, (xa < xb ? xb - xa : xa - xb) + 1, 3, C_GREEN); - } - int y0db = y0 + h * 18 / 54; - gfx_hline(g, x0, y0db, w, C_DDGREY); - for (int x = 1; x < w; x++) seg(g, x0 + x - 1, y0 + cv.y[0][x - 1], x0 + x, y0 + cv.y[0][x], C_ORANGE); - static const char *const N[3] = {"100", "1K", "10K"}; - for (int k = 0; k < 3; k++) { - int x = x0 + cv_x[MK0 + k]; - gfx_vline(g, x, y0 + h - 8, 3, C_DGREY); - gfx_small(g, x - 4, y0 + h - 12, N[k], C_GREY); - } - if (hpf) { /* el pasa-altos de BUNO-6 */ - int x = x0 + cv_x[HPF_X]; - gfx_fill(g, x0, y0 + 2, x - x0, 3, C_PINK); - gfx_small(g, x0 + 2, y0 + 6, "HPF", C_PINK); + const bm_overlay *o = &a->ov; + if (o->knob >= ENC_K1 + 1 && o->knob <= ENC_K4 + 1 && !o->beat) { draw_overlay_line(g, a); return; } + if (!gfx_strip_hit(g, 46, 84)) return; + gfx_fill(g, 12, 46, 216, 84, C_BLACK); + gfx_rect(g, 12, 46, 216, 84, o->color); + gfx_rect(g, 13, 47, 214, 82, o->color); + grid(g, 16, 50, 208, 76, 6); + gfx_text(g, 20, 52, o->title, C_GREY, 1); + if (o->knob) { /* la perilla grande que se giró, en la esquina */ + static const char *const KN[ENC_COUNT] = {"SELECT", "ALGORITHM", "K1", "K2", "K3", "K4", "PRESETS"}; + gfx_small(g, 222 - gfx_small_w(KN[(o->knob - 1) % ENC_COUNT]), 53, KN[(o->knob - 1) % ENC_COUNT], o->color); } -} - -static void ed_adsr(bm_gfx *g, int x0, int y0, int w, int h, int A, int D, int S, int R) -{ - int a = 2 + A * (w / 4) / 127, d = 2 + D * (w / 4) / 127, r = 2 + R * (w / 4) / 127, s = w - a - d - r - 4; - int yb = y0 + h - 2, sy = yb - S * (h - 4) / 127; - int x1 = x0 + a, x2 = x1 + d, x3 = x2 + (s > 8 ? s : 8), x4 = x3 + r; - for (int o = 0; o < 2; o++) { - gfx_line(g, x0, yb + o, x1, y0 + 2 + o, bm_knob_color(0)); - gfx_line(g, x1, y0 + 2 + o, x2, sy + o, bm_knob_color(1)); - gfx_line(g, x2, sy + o, x3, sy + o, bm_knob_color(2)); - gfx_line(g, x3, sy + o, x4, yb + o, bm_knob_color(3)); + int w = gfx_text(g, 20, 68, o->val, C_WHITE, gfx_text_w(o->val, 3) > 196 ? 2 : 3); + if (o->unit[0]) gfx_text(g, 26 + w, 78, o->unit, C_GREY, 2); + if (o->beat) { /* el beat, en el color del tempo */ + const bm_status *st = &a->ctx.st; + int cur = st->playing ? (int)((st->btick / BM_PPQN) % 4) : -1; + for (int i = 0; i < 4; i++) gfx_fill(g, 20 + i * 51, 108, 47, 12, i == cur ? o->color : dim(dim(o->color))); + return; } + gfx_fill(g, 20, 110, 200, 8, C_DGREY); + gfx_fill(g, 20, 110, o->pct * 200 / 255, 8, o->color); + if (o->ghost != 255) gfx_fill(g, 19 + o->ghost * 200 / 255, 106, 2, 16, C_WHITE); } -static void ed_lfo(bm_gfx *g, int x0, int y0, int w, int h, int shape, int amt, uint16_t col) +static void draw_toast(bm_gfx *g, const bm_app *a) { - int mid = y0 + h / 2; - gfx_hline(g, x0, mid, w, C_DDGREY); - if (w > CV_W) return; - const uint8_t key[] = {4, (uint8_t)shape, (uint8_t)amt, (uint8_t)w, (uint8_t)h}; - if (!cv_fresh(key, sizeof key)) { - uint32_t rng = 12345; - float sh = 0.0f; - for (int x = 0; x < w; x++) { - float p = (float)x * 3.0f / (float)w, ph = p - (float)(int)p, y; - switch (shape) { - case 0: y = sinf(6.2831853f * ph); break; - case 1: y = 4.0f * fabsf(ph - 0.5f) - 1.0f; break; - case 2: y = 1.0f - 2.0f * ph; break; - case 3: y = ph < 0.5f ? 1.0f : -1.0f; break; - default: - if (x == 0 || (int)((float)(x - 1) * 3.0f / (float)w * 2.0f) != (int)(p * 2.0f)) sh = (float)(int32_t)(rng = rng * 1664525u + 1013904223u) / 2147483648.0f; - y = sh; - break; - } - cv.y[0][x] = (int16_t)(h / 2 - (int)(y * (float)(h / 2 - 3) * (0.25f + 0.75f * (float)amt / 127.0f))); - } - } - for (int x = 1; x < w; x++) seg(g, x0 + x - 1, y0 + cv.y[0][x - 1], x0 + x, y0 + cv.y[0][x], amt ? col : C_DGREY); + if (!gfx_strip_hit(g, 118, 16)) return; + gfx_fill(g, 0, 118, BM_LCD_W, 16, C_DGREY); + gfx_hline(g, 0, 118, BM_LCD_W, C_CYAN); + gfx_text_c(g, 120, 122, a->toast, C_WHITE, 1); } -/* BITTAL: las 4 macros con su destino y lo que mueven ahora */ -static void ed_macros(bm_gfx *g, const bm_app *a, int t, int x0, int y0, int w, int h) -{ - const uint8_t *q = a->pat.prm[t]; - char b[24]; - (void)w; (void)h; - for (int i = 0; i < 4; i++) { - int y = y0 + 4 + i * 15; - if (!gfx_strip_hit(g, y, 14)) continue; - int dst = q[BT_M1D + 2 * i] % BTM_TARGETS, amt = (int)q[BT_M1A + 2 * i] - 64, v = a->pat.trk[t].macro[i]; - snprintf(b, sizeof b, "M%d", i + 1); - gfx_text(g, x0 + 4, y + 3, b, bm_knob_color(i), 1); - gfx_text(g, x0 + 24, y + 3, bm_btm_names[dst], dst ? C_WHITE : C_GREY, 1); - snprintf(b, sizeof b, "%+d", amt * 100 / 63); - gfx_small(g, x0 + 100, y + 4, b, C_GREY); - gfx_fill(g, x0 + 130, y + 4, 90, 5, C_DDGREY); - gfx_fill(g, x0 + 130, y + 4, v * 90 / 127, 5, bm_knob_color(i)); - } -} +/* ------------------------------------------------------------ BX-7 (V_MACH): el FM-1 de fábrica, con nuestra cara */ +extern const char *const bx7_fx_names[BXF_N]; -static void draw_editor(bm_gfx *g, const bm_app *a) +/* La topología del algoritmo como en una DX7: portadoras abajo, moduladores encima, la realimentación + * como un lazo; cada operador con su nivel (la barra blanca) y abajo las relaciones de frecuencia. */ +static void draw_fm(bm_gfx *g, const bm_app *a, int t, int x0, int y0, int w, int h, int sel) { - int t = a->track, n; - const bm_ppage *pg = bm_app_ed_pages(a, t, &n); - if (!pg || !n) return; - int cur = a->ed_page[t] % n, tr = bm_is_tr(&a->pat, t), eng = a->pat.trk[t].engine; - const bm_ppage *P = &pg[cur]; - uint16_t col = bm_track_color(t); - char b[32]; - if (gfx_strip_hit(g, PY, 9)) { - if (tr) { - const bm_lane *ln = &bm_trk_trc(&a->pat, t)->lane[a->sel_lane[t] & 15]; - snprintf(b, sizeof b, "%s - %s", T(bm_lane_name(a, t, a->sel_lane[t] & 15)), T(bm_drm_names[ln->model % DRM_COUNT])); - } else snprintf(b, sizeof b, "%s", bm_sound_name(a, t)); - gfx_text(g, 4, PY, b, C_WHITE, 1); - if (!tr && (eng == ENG_MINI || eng == ENG_BITTAL || eng == ENG_BUNO)) { /* la huella del snapshot: #A4F9 */ - const uint8_t *s = bm_snap_get(eng, a->pat.trk[t].source); - if (s) { snprintf(b, sizeof b, "#%04X", (unsigned)(s[8] | s[9] << 8)); gfx_small(g, 236 - gfx_small_w(b), PY + 1, b, C_DGREY); } - } - } - if (gfx_strip_hit(g, PY + 10, 9)) { - gfx_text(g, 4, PY + 10, P->name, col, 1); - for (int i = 0; i < n; i++) { - int x = 236 - (n - i) * 7; - if (i == cur) gfx_fill(g, x, PY + 11, 5, 5, col); else gfx_rect(g, x, PY + 11, 5, 5, C_DGREY); - } - } - int x0 = 6, y0 = PY + 21, w = 228, h = VB - y0 - 1; - if (!gfx_strip_hit(g, y0 - 2, h + 4)) return; - gfx_rect(g, x0 - 2, y0 - 2, w + 4, h + 4, C_DDGREY); - const uint8_t *q = a->pat.prm[t]; - if (tr) { - const bm_lane *ln = &bm_trk_trc(&a->pat, t)->lane[a->sel_lane[t] & 15]; - int dec = 6 + ln->decay * (w - 12) / 127, mid = y0 + h / 2, n = dec < w ? dec : w; - gfx_hline(g, x0, mid, w, C_DDGREY); - if (n > CV_W) return; - const uint8_t key[] = {5, (uint8_t)(ln->model % DRM_COUNT), ln->tune, (uint8_t)dec, (uint8_t)w, (uint8_t)h}; - if (!cv_fresh(key, sizeof key)) { /* el golpe: expf y sinf por x, solo si cambió */ - float hz = (float)bm_drm_base_hz[ln->model % DRM_COUNT] * exp2f((float)(ln->tune - 64) * 0.375f / 12.0f); - for (int x = 0; x < n; x++) { - float e = expf(-4.0f * (float)x / (float)dec); - float s = sinf((float)x * 0.12f * hz / 300.0f) * e; - cv.y[0][x] = (int16_t)(h / 2 - (int)(s * (float)(h / 2 - 4))); - cv.y[1][x] = (int16_t)(h / 2 + (int)(s * (float)(h / 2 - 4))); + if (!gfx_strip_hit(g, y0, h + 1)) return; + static struct { uint32_t frame; int t, alg, bx[6], by[6]; uint8_t p[BM_FM_PATCH], car, mods[6]; int8_t fb[2]; } L; + if (L.frame != g->frame || L.t != t) { + L.frame = g->frame; L.t = t; + uint8_t *p = L.p, *mods = L.mods; + bm_fm_patch_of(&a->pat, t, NULL, p); + int alg = L.alg = p[BM_FM_ALG] & 31; + uint8_t car = L.car = bm_fm_carriers(alg); + bm_fm_alg_graph(alg, mods, L.fb); + int depth[6] = {0, 0, 0, 0, 0, 0}, maxd = 0; + for (int it = 0; it < 6; it++) + for (int i = 0; i < 6; i++) + for (int j = 0; j < 6; j++) + if (mods[j] & (1u << i)) if (depth[i] < depth[j] + 1) depth[i] = depth[j] + 1; + for (int i = 0; i < 6; i++) if (depth[i] > maxd) maxd = depth[i]; + float cx[6]; int placed[6] = {0, 0, 0, 0, 0, 0}, col = 0; + for (int pass = 0; pass < 2; pass++) + for (int op = 1; op <= 6; op++) { + int i = 6 - op; + if (placed[i]) continue; + bool carrier = (car >> i) & 1; + if (pass == 0 && !carrier) continue; + int tgt = -1; + for (int j = 0; j < 6; j++) if (mods[j] & (1u << i)) { tgt = j; break; } + if (tgt >= 0 && placed[tgt]) { + int sib = 0; + for (int k = 0; k < 6; k++) if (k != i && placed[k] && (mods[tgt] & (1u << k))) sib++; + cx[i] = cx[tgt] + (float)sib; + if (sib) { cx[i] = (float)col; col++; } + } else { cx[i] = (float)col; col++; } + placed[i] = 1; } - cv_x[0] = (int)(hz + 0.5f); - } - for (int x = 1; x < n; x++) { - seg(g, x0 + x - 1, y0 + cv.y[0][x - 1], x0 + x, y0 + cv.y[0][x], col); - seg(g, x0 + x - 1, y0 + cv.y[1][x - 1], x0 + x, y0 + cv.y[1][x], dim(col)); - } - snprintf(b, sizeof b, "%d HZ", (int)cv_x[0]); - gfx_small(g, x0 + w - gfx_small_w(b) - 2, y0 + 2, b, C_GREY); - return; - } - const bm_track *tk = &a->pat.trk[t]; - if (eng == ENG_BITTAL) { /* OSC 1, OSC 1 +, OSC 2, OSC 2 +, FILTER, FILTER +, ENV 1, ENV 2, LFO 1, MACRO x2, VOICE */ - if (cur <= 3) ed_table(g, a, t, x0, y0, w, h, cur >= 2); - else if (cur == 4 || cur == 5) ed_filter(g, a, t, x0, y0, w, h); - else if (cur == 6) ed_adsr(g, x0, y0, w, h, q[BT_AA], q[BT_AD], q[BT_AS], q[BT_AR]); - else if (cur == 7) ed_adsr(g, x0, y0, w, h, q[BT_MA], q[BT_MD], q[BT_MS], q[BT_MR]); - else if (cur == 8) ed_lfo(g, x0, y0, w, h, q[BT_LSHAPE] % BT_LSHAPES, q[BT_LAMT], col); - else if (cur == 9 || cur == 10) ed_macros(g, a, t, x0, y0, w, h); - else { - static const char *const M[WM_MODES] = {"POLY: UP TO 4 VOICES", "MONO: ONE VOICE, RETRIGGERS", "LEGATO: ONE VOICE, TIED"}; - gfx_text_c(g, 120, y0 + h / 2 - 4, M[q[BT_MODE] % WM_MODES], C_WHITE, 1); - } - } else if (eng == ENG_MINI) { /* CONTROL, OSC 1-3, MIXER, FILTER, F CONTOUR, L CONTOUR, OUTPUT */ - if (cur == 0) ed_lfo(g, x0, y0, w, h, 1, q[MN_LAMT], col); - else if (cur <= 4) ed_wave(g, a, t, x0, y0, w, h, cur <= 3 ? cur - 1 : -1); - else if (cur == 5) ed_filter(g, a, t, x0, y0, w, h); - else if (cur == 6) ed_adsr(g, x0, y0, w, h, q[MN_FA], q[MN_FD], q[MN_FS], q[MN_FR]); - else if (cur == 7) ed_adsr(g, x0, y0, w, h, q[MN_AA], q[MN_AD], q[MN_AS], q[MN_AR]); - else gfx_text_c(g, 120, y0 + h / 2 - 4, q[MN_MODE] ? "LEGATO: TIED NOTES GLIDE" : "MONO: EVERY NOTE RETRIGGERS", C_WHITE, 1); - } else if (eng == ENG_ACID) { /* VCO VCF y ENV */ - if (cur == 0) draw_synth(g, a, t, x0, y0, w, h); - else ed_adsr(g, x0, y0, w, h, 0, tk->macro[3], 0, 10); - if (hints_on) gfx_small(g, x0 + 4, y0 + h - 8, "ACCENT OPENS THE FILTER - TIE = SLIDE", C_GREY); - } else if (eng == ENG_FM) { /* ALGORITHM, EG, VOICE, LFO */ - if (cur == 3) ed_lfo(g, x0, y0, w, h, 1, q[FX_LPMD] || q[FX_LAMD] ? 100 : 0, col); - else if (cur == 2) { - snprintf(b, sizeof b, TF("PORTA WITH TIE %+d ST"), (int)tk->transpose - 24); - gfx_text_c(g, 120, y0 + h / 2 - 4, b, C_WHITE, 1); - } else if (cur == 1) ed_adsr(g, x0, y0, w, h, tk->attack, tk->macro[2], 90, tk->macro[3]); - else draw_fm(g, a, t, x0, y0, w, h); - } else { /* BUNO-6: LFO, DCO, DCO WAVE, HPF VCF, VCF MOD, VCA, ENV, CHORUS */ - if (cur == 0) ed_lfo(g, x0, y0, w, h, 1, 90, col); - else if (cur <= 2) ed_wave(g, a, t, x0, y0, w, h, cur); - else if (cur <= 4) ed_filter(g, a, t, x0, y0, w, h); - else if (cur == 5) gfx_text_c(g, 120, y0 + h / 2 - 4, q[BN_VCA] ? "VCA: GATE" : "VCA: ENV", C_WHITE, 1); - else if (cur == 6) ed_adsr(g, x0, y0, w, h, q[BN_A], q[BN_D], q[BN_S], q[BN_R]); - else { - int ch = q[BN_CHORUS] % BN_CHORUSES; - snprintf(b, sizeof b, "CHORUS %s", bm_bn_chorus_names[ch]); - gfx_text(g, x0 + 6, y0 + h / 2 - 8, b, ch ? C_PINK : C_GREY, 2); - if (hints_on) gfx_small(g, x0 + 6, y0 + h - 8, "ALGORITHM = CHORUS", C_GREY); + int ncol = col > 0 ? col : 1; + float cw = (float)(w - 8) / (float)ncol; + int rh = (h - 18) / (maxd + 1); + if (rh > 22) rh = 22; + for (int i = 0; i < 6; i++) { + L.bx[i] = x0 + 4 + (int)(cx[i] * cw + cw / 2.0f) - 9; + L.by[i] = y0 + h - 18 - depth[i] * rh - 12; } } -} - -/* GLO de la consola > MACHINES: T1 y T2 fijos; en T3-T6, ALGORITHM elige (2 s en una la carga) */ -static void draw_glo_mach(bm_gfx *g, const bm_app *a) -{ - char b[30]; - for (int t = 0; t < BM_TRACKS; t++) { - int y = PY + 2 + t * 13; - if (!gfx_strip_hit(g, y, 13)) continue; - bool sel = t == a->track, fixed = t < BM_TR_TRACKS; - uint16_t col = bm_track_color(t); - if (sel) { gfx_fill(g, 0, y, BM_LCD_W, 12, C_DDGREY); gfx_fill(g, 0, y, 2, 12, C_CYAN); } - snprintf(b, sizeof b, "T%d", t + 1); - gfx_text(g, 6, y + 2, b, fixed ? C_GREY : col, 1); - int e = sel && a->mach_trk == t ? a->mach_sel : a->pat.trk[t].engine; - int other = fixed ? -1 : bm_machine_conflict(&a->pat, t, e); - bool pending = sel && a->mach_trk == t && e != a->pat.trk[t].engine; - snprintf(b, sizeof b, pending ? "< %s >" : "%s", bm_engine_names[e % ENG_COUNT]); - gfx_text(g, 28, y + 2, b, fixed ? C_GREY : other >= 0 ? C_DGREY : sel ? C_WHITE : C_GREY, 1); - if (fixed) gfx_small(g, 236 - gfx_small_w("FIXED"), y + 3, "FIXED", C_DGREY); - else if (other >= 0) { snprintf(b, sizeof b, TF("ON T%d"), other + 1); gfx_small(g, 236 - gfx_small_w(b), y + 3, b, C_GREY); } - else if (pending && a->mach_arm == 1) { - uint32_t dt = a->now - a->mach_t0; - unsigned left = dt >= BM_MACH_MS ? 0 : (unsigned)(BM_MACH_MS - dt + 99) / 100; - snprintf(b, sizeof b, TF("LOAD IN %u.%u S"), left / 10, left % 10); - gfx_small(g, 236 - gfx_small_w(b), y + 3, b, C_YELLOW); - gfx_fill(g, 2, y + 11, (int)(dt >= BM_MACH_MS ? 236 : dt * 236u / BM_MACH_MS), 1, C_WHITE); - } else if (!pending) gfx_small(g, 236 - gfx_small_w(bm_machine_origin(e)), y + 3, bm_machine_origin(e), C_DGREY); + const uint8_t *p = L.p, *mods = L.mods, car = L.car; + const int8_t *fb = L.fb; + const int *bx = L.bx, *by = L.by, alg = L.alg; + gfx_rect(g, x0, y0, w, h, C_DDGREY); + grid(g, x0 + 2, y0 + 2, w - 4, h - 4, 8); + uint16_t tc = bm_track_color(t); + for (int j = 0; j < 6; j++) + for (int i = 0; i < 6; i++) + if (mods[j] & (1u << i)) gfx_line(g, bx[i] + 9, by[i] + 12, bx[j] + 9, by[j], C_GREY); + for (int i = 0; i < 6; i++) if ((car >> i) & 1) gfx_vline(g, bx[i] + 9, by[i] + 12, y0 + h - 14 - by[i] - 12, C_GREY); + gfx_hline(g, x0 + 4, y0 + h - 14, w - 8, C_DGREY); + if (fb[0] >= 0 && fb[1] >= 0) { + int a0 = fb[0], a1 = fb[1]; + int xr = bx[a0] + 20; + gfx_hline(g, bx[a0] + 18, by[a0] + 6, 4, C_ORANGE); + gfx_vline(g, xr, by[a1] - 3, by[a0] + 6 - (by[a1] - 3) + 1, C_ORANGE); + gfx_hline(g, bx[a1] + 9, by[a1] - 3, xr - bx[a1] - 9, C_ORANGE); + gfx_vline(g, bx[a1] + 9, by[a1] - 3, 3, C_ORANGE); } - note_s(g, VB - 6, "SELECT = TRACK ALGORITHM = MACHINE (2 S)"); -} - -static void draw_sound(bm_gfx *g, const bm_app *a); - -/* El GLO de la máquina (GLO dentro de ella; GLO otra vez = de vuelta): SELECT la fila, ALGORITHM el valor */ -static void draw_more(bm_gfx *g, const bm_app *a) -{ - int n = bm_app_more_count(a), t = a->track; - char v[40]; - if (gfx_strip_hit(g, PY, 9)) { - if (t >= BM_TR_TRACKS) { - snprintf(v, sizeof v, TF("CHANGE: HOLD T%d ON HOME + ALG"), t + 1); - gfx_small(g, 4, PY + 1, v, C_GREY); - } else gfx_small(g, 4, PY + 1, "FIXED MACHINE", C_DGREY); - } - int first = a->more_row > 7 ? a->more_row - 7 : 0; - for (int i = 0; i < 8 && first + i < n; i++) { - const char *nm; - int y = PY + 9 + i * 11; - if (!gfx_strip_hit(g, y, 11)) continue; /* la fila, solo si se dibuja */ - bm_app_more_row(a, first + i, &nm, v, sizeof v); - row(g, y, first + i == a->more_row, nm, v); + char b[12]; + for (int i = 0; i < 6; i++) { + const uint8_t *o = p + i * BM_FM_OP; + bool c = (car >> i) & 1; + int lv = o[FMO_OL] * 16 / 99; + gfx_fill(g, bx[i], by[i], 18, 12, c ? tc : C_DGREY); + gfx_fill(g, bx[i], by[i] + 12 - lv * 12 / 16, 2, lv * 12 / 16, C_WHITE); + if (sel == 5 - i) gfx_rect(g, bx[i] - 2, by[i] - 2, 22, 16, C_WHITE); /* el operador que se edita */ + snprintf(b, sizeof b, "%d", 6 - i); + gfx_text(g, bx[i] + 7, by[i] + 3, b, c ? C_BLACK : C_WHITE, 1); } -} - -static void draw_sound(bm_gfx *g, const bm_app *a) -{ - int t = a->track; - if (bm_is_tr(&a->pat, t)) { - if (gfx_strip_hit(g, PY, 9)) { - gfx_text(g, 4, PY, "KIT", C_GREY, 1); gfx_text(g, 28, PY, bm_sound_name(a, t), C_WHITE, 1); - gfx_small(g, 80, PY + 1, "MODELED", C_ORANGE); - if (hints_on) gfx_small(g, 150, PY + 1, "PRESETS = ANOTHER KIT", C_GREY); - } - lane_pads(g, a, t, PY + 10, 22); - return; + snprintf(b, sizeof b, "ALG %d", alg + 1); + gfx_text(g, x0 + 4, y0 + h - 10, b, C_ORANGE, 1); + snprintf(b, sizeof b, "FB %d", p[BM_FM_FB]); + gfx_small(g, x0 + 56, y0 + h - 9, b, C_ORANGE); + for (int i = 0; i < 6; i++) { + const uint8_t *o = p + (5 - i) * BM_FM_OP; + int fc = o[FMO_FC], ff = o[FMO_FF]; + if (o[FMO_MODE]) snprintf(b, sizeof b, "FX"); + else { int r100 = (fc ? fc * 100 : 50) * (100 + ff) / 100; if (r100 % 100) snprintf(b, sizeof b, "%d.%d", r100 / 100, r100 % 100 / 10); else snprintf(b, sizeof b, "%d", r100 / 100); } + gfx_small(g, x0 + 86 + i * 24, y0 + h - 9, b, i == sel ? C_WHITE : C_GREY); } - draw_editor(g, a); /* las 5 máquinas de notas: sus páginas */ } -static void draw_inst(bm_gfx *g, const bm_app *a) { draw_editor(g, a); } - -static void draw_ch_mix(bm_gfx *g, const bm_app *a) +/* una envolvente de 4 tramos (tiempos 0..1 de ancho relativo, niveles 0..1) en un recuadro */ +static void env_shape(bm_gfx *g, int x0, int y0, int w, int h, const float tm[4], const float lv[4], float start, uint16_t c) { - int t = a->track; - const bm_track *tr = &a->pat.trk[t]; - static const char *const NM[4] = {"LEVEL", "PAN", "DELAY", "REVERB"}; - const int val[4] = {tr->level, tr->pan, tr->send, tr->rsend}; - if (a->mix_page) { /* la sub-página DUCK: solo K1 */ - char d[30]; - if (gfx_strip_hit(g, PY + 2, 76)) { - gfx_text(g, 6, PY + 2, "DUCK (SIDECHAIN FROM T1)", bm_knob_color(0), 1); - gfx_fill(g, 6, PY + 20, 228, 12, C_DDGREY); - if (t) gfx_fill(g, 6, PY + 20, tr->duck * 228 / 127, 12, bm_knob_color(0)); - if (t) snprintf(d, sizeof d, "%d%%", tr->duck * 100 / 127); else snprintf(d, sizeof d, "T1 IS THE SOURCE"); - gfx_text(g, 6, PY + 40, d, C_WHITE, 2); - } - hint_s(g, PY + 86, "K1 = DUCK - SELECT LEFT = LEVEL, PAN, SENDS"); - return; - } + if (!gfx_strip_hit(g, y0, h + 1)) return; + gfx_rect(g, x0, y0, w, h, C_DDGREY); + float sum = tm[0] + tm[1] + tm[2] + tm[3]; + if (sum <= 0.0f) sum = 1.0f; + int x = x0 + 2, y = y0 + h - 2 - (int)(start * (float)(h - 4)); for (int i = 0; i < 4; i++) { - int x = 6 + i * 58; - if (!gfx_strip_hit(g, PY + 2, 76)) break; - gfx_text(g, x, PY + 2, NM[i], bm_knob_color(i), 1); - gfx_fill(g, x + 10, PY + 13, 20, 60, C_DDGREY); - if (i == 1) { int c = x + 20, p = (val[1] - 64) * 10 / 64; gfx_fill(g, p < 0 ? c + p : c, PY + 13, p < 0 ? -p : (p ? p : 1), 60, bm_knob_color(1)); continue; } - int h = val[i] * 60 / 127; - gfx_fill(g, x + 10, PY + 73 - h, 20, h, bm_knob_color(i)); - } - int pk = a->ctx.st.peak[t] * 228 / 255; - if (gfx_strip_hit(g, PY + 78, 6)) { gfx_fill(g, 6, PY + 78, 228, 4, C_DDGREY); gfx_fill(g, 6, PY + 78, pk, 4, C_GREEN); } - char b[30]; - if (t) snprintf(b, sizeof b, TF("DUCK %d%% (FX AGAIN: K1)"), tr->duck * 100 / 127); else snprintf(b, sizeof b, "T1 IS THE SIDECHAIN SOURCE"); - hint_s(g, PY + 86, a->mix_page && t ? "K1 = DUCK (T1 SIDECHAIN)" : b); - hint_s(g, PY + 94, "HOME + FX = DELAY, REVERB AND SIDECHAIN"); -} - -/* TAKES: las tomas guardadas, con la onda de la marcada. */ -static void draw_takes(bm_gfx *g, const bm_app *a) -{ - uint8_t list[BM_TAKES + 8]; - int n = bm_app_sources(a, list); - int first = a->takes_row > 2 ? a->takes_row - 2 : 0; - char b[30]; - if (!n && gfx_strip_hit(g, PY + 14, 30)) { - gfx_text_c(g, 120, PY + 18, "NO TAKES YET", C_WHITE, 1); - gfx_text_c(g, 120, PY + 30, "REC = RECORD ONE", C_GREY, 1); - } - for (int i = 0; i < 3 && first + i < n; i++) { - int y = PY + i * 12, e = first + i; - if (!gfx_strip_hit(g, y, 12)) continue; - uint8_t s = list[e]; - bool sel = e == a->takes_row; - if (sel) { gfx_fill(g, 0, y, 240, 11, C_DDGREY); gfx_fill(g, 0, y, 2, 11, C_CYAN); } - bm_app_src_name(a, s, b, sizeof b); - gfx_text(g, 4, y + 2, b, sel ? C_WHITE : C_GREY, 1); - if (s & BM_SRC_ROM) continue; - unsigned ds = (unsigned)(a->take[s].len * 10u / BM_SMP_RATE); - snprintf(b, sizeof b, TF("%d BPM %d BAR %u.%uS"), (a->take[s].bpm_x10 + 5) / 10, a->take[s].bars, ds / 10, ds % 10); - gfx_small(g, 230 - gfx_small_w(b), y + 3, b, C_GREY); - int pads = 0; - for (int k = 0; k < BM_LANES; k++) pads += bm_pad_ok(&a->pat.pad[k]) && a->pat.pad[k].src == s; - if (pads) gfx_disc(g, 235, y + 5, 2, bm_track_color(1)); - if ((a->take_dirty >> s) & 1) gfx_disc(g, 235, y + 5, 2, C_ORANGE); - } - uint8_t src = bm_app_takes_sel(a); - if (src < BM_TAKES && a->take[src].valid && gfx_strip_hit(g, PY + 38, 28)) { - int y = PY + 38, h = 26; - gfx_fill(g, 4, y, 232, h, C_DDGREY); - for (int x = 0; x < 232; x++) { - int pk = a->wave_ov[x] * (h / 2 - 1) / 255; - gfx_vline(g, 4 + x, y + h / 2 - pk, 2 * pk + 1, bm_track_color(1)); - } - for (int k = 1; k < 16; k++) gfx_vline(g, 4 + k * 232 / 16, y + h - 3, 3, C_GREY); - const bm_status *st = &a->ctx.st; - if (st->smp_pos_src == 0 && st->smp_pos < a->take[src].len) - gfx_vline(g, 4 + (int)((uint64_t)st->smp_pos * 231u / a->take[src].len), y, h, C_ORANGE); - } - /* las tomas: hasta 6 s en total, en la zona que comparten con los sonidos */ - uint32_t total = BM_TAKES_MAX_LEN, freeb = bm_takes_free(a->take); - if (gfx_strip_hit(g, PY + 67, 12)) { - unsigned fs = (unsigned)(freeb * 10u / BM_SMP_RATE); - snprintf(b, sizeof b, TF("FREE %u.%u S - %d SOUNDS ON TOP"), fs / 10, fs % 10, bm_snaps_user_n()); - gfx_small(g, 4, PY + 67, b, C_GREY); - uint32_t used = total > freeb ? total - freeb : 0; - gfx_fill(g, 4, PY + 75, 232, 3, C_DDGREY); - gfx_fill(g, 4, PY + 75, (int)(used * 232u / total), 3, C_GREY); - } - snprintf(b, sizeof b, TF("BLACK 4 = THE TAKE ON PAD %d"), (a->sel_lane[1] & 15) + 1); - hint_s(g, PY + 81, "KIT FROM THIS TAKE: BLACK 1 HITS, 2 = 16, 3 = 8"); - hint_s(g, PY + 89, b); + int nx = x + (int)(tm[i] / sum * (float)(w - 4)), ny = y0 + h - 2 - (int)(lv[i] * (float)(h - 4)); + gfx_line(g, x, y, nx, ny, c); + x = nx; y = ny; + } } -static void draw_rec(bm_gfx *g, const bm_app *a) +/* Las cuatro perillas como una lista (GLO, ARP, LFO...): una fila por perilla, en su orden, con su + * dial en su color, el nombre y el valor grande. Es la única vez que se dibujan (sin la franja). */ +static void mach_list(bm_gfx *g, const bm_app *a, int y0, int rh) { - const bm_status *st = &a->ctx.st; - char b[30]; - uint32_t room = st->smp_rec || st->smp_armed ? (st->smp_cap ? st->smp_cap : BM_SMP_REC_MAX) : bm_app_rec_room(a); - uint32_t used = st->smp_rec ? st->smp_len : (st->smp_unsaved ? st->smp_len : 0); - const char *lbl; uint16_t lc, big; - if (st->smp_rec) { lbl = "REC"; lc = C_RED; big = C_RED; } - else if (st->smp_armed) { lbl = "ARMED"; lc = C_YELLOW; big = C_WHITE; } - else if (st->smp_unsaved) { lbl = "UNSAVED"; lc = C_GREEN; big = C_GREEN; } - else { lbl = "READY"; lc = C_GREY; big = C_WHITE; } - if (gfx_strip_hit(g, PY, 12)) { - int w = gfx_text_w(lbl, 1) + 8; - gfx_fill(g, 4, PY, w, 11, lc); - gfx_text(g, 8, PY + 2, lbl, C_BLACK, 1); - gfx_text_r(g, 236, PY + 2, "SOURCE: MIX", C_GREY, 1); - } - uint32_t show = st->smp_unsaved && !st->smp_rec ? used : (room > used ? room - used : 0); - unsigned ds = (unsigned)(show * 10u / BM_SMP_RATE); - if (gfx_strip_hit(g, PY + 14, 30)) { - snprintf(b, sizeof b, "%u.%u", ds / 10, ds % 10); - int w = gfx_text(g, 8, PY + 14, b, big, 4); - gfx_text(g, 16 + w, PY + 16, "S", C_GREY, 2); - gfx_text(g, 16 + w, PY + 32, st->smp_unsaved && !st->smp_rec ? "RECORDED" : st->smp_rec ? "LEFT" : "AVAILABLE", C_GREY, 1); - } - if (gfx_strip_hit(g, PY + 46, 6)) { - unsigned fs = (unsigned)(bm_takes_free(a->take) * 10u / BM_SMP_RATE); - snprintf(b, sizeof b, TF("TAKES: FREE %u.%u OF 6 S"), fs / 10, fs % 10); - gfx_small(g, 4, PY + 46, b, C_GREY); - gfx_small(g, 236 - gfx_small_w("MAX 3.0 S PER TAKE"), PY + 46, "MAX 3.0 S PER TAKE", C_GREY); - } - int y = PY + 54; - if (gfx_strip_hit(g, y, 20)) { - gfx_fill(g, 4, y, 232, 11, C_DDGREY); - uint32_t cap = BM_SMP_REC_MAX; - int uw = (int)((uint64_t)used * 232u / cap); - gfx_fill(g, 4, y, uw, 11, st->smp_rec ? C_RED : st->smp_unsaved ? C_GREEN : C_DGREY); - uint32_t bar = (uint32_t)BM_SMP_RATE * 2400u / a->pat.meta.bpm_x10; - for (uint32_t k = 1; k * bar < cap; k++) gfx_vline(g, 4 + (int)(k * bar * 232u / cap), y, 11, C_WHITE); - int cx = 4 + (int)((uint64_t)room * 232u / cap); - gfx_fill(g, cx - 1, y - 2, 2, 15, C_YELLOW); - unsigned bs = (unsigned)(bar * 10u / BM_SMP_RATE); - snprintf(b, sizeof b, TF("1 BAR = %u.%u S"), bs / 10, bs % 10); - gfx_small(g, 4, y + 13, b, C_GREY); - gfx_small(g, 236 - gfx_small_w(room < cap ? "LIMIT: MEMORY" : "LIMIT: RECORDING RAM"), y + 13, room < cap ? "LIMIT: MEMORY" : "LIMIT: RECORDING RAM", C_YELLOW); - } - /* la grabadora cambia de estado sola: lo que hace REC (y HOME) se ve siempre */ - if (st->smp_rec) { note_s(g, PY + 78, "REC = STOP - STOPS BY ITSELF AT THE LIMIT"); hint_s(g, PY + 86, "DELAY AND PUNCH-IN PAUSED WHILE RECORDING"); } - else if (st->smp_armed) { note_s(g, PY + 78, "STARTS ON THE BAR - REC AGAIN = CANCEL"); hint_s(g, PY + 86, "KEYS ARE SILENT IN THE RECORDER"); } - else if (st->smp_unsaved) { hint_s(g, PY + 78, "IT SAVES WHEN YOU STOP - WHITES = LISTEN"); note_s(g, PY + 86, "HOME = DISCARD? - REC = ANOTHER TAKE"); } - else { note_s(g, PY + 78, "REC = ARM (K1: BAR OR NOW)"); hint_s(g, PY + 86, "HOLD REC = RECORD WHILE HELD"); } -} - -/* ------------------------------------------------------------ ENV, LFO, FX */ -static void draw_fx(bm_gfx *g, const bm_app *a) + static bm_legend L[4]; /* una vez por cuadro, no por franja */ + static uint32_t lf; + if (lf != g->frame) { lf = g->frame; bm_app_legend(a, L); } + for (int k = 0; k < 4; k++) { + int y = y0 + k * rh, h = rh - 3, cy = y + h / 2; + if (!L[k].name[0] || !gfx_strip_hit(g, y, h)) continue; + uint16_t kc = bm_knob_color(k); + bool hi = a->ov.on && a->ov.enc == k; + gfx_fill(g, 2, y, 236, h, C_DDGREY); + if (hi) gfx_rect(g, 2, y, 236, h, kc); + draw_dial(g, 19, cy, L[k].pct, -1, kc, hi); + gfx_text(g, 40, cy - 3, T(L[k].name), kc, 1); + int s = gfx_text_w(L[k].val, 2) > 236 - 110 ? 1 : 2; + gfx_text_r(g, 233, cy - (s == 2 ? 7 : 3), L[k].val, C_WHITE, s); + } +} + +/* ------------------------------------------------------------ BB-303: el panel de la TB-303 */ +/* una perilla del panel: de 7:00 a 5:00, como las de la 303; el aro con el color de la perilla del + * FM-1 que la mueve (o gris si ninguna la mueve en esta página) */ +static void dial(bm_gfx *g, int cx, int cy, int r, int v, int max, uint16_t ring, const char *name) +{ + if (!gfx_strip_hit(g, cy - r, 2 * r + 22)) return; + gfx_disc(g, cx, cy, r, ring); + gfx_disc(g, cx, cy, r - 2, C_DGREY); + float ang = (-135.0f + 270.0f * (float)v / (float)(max > 0 ? max : 1)) * 0.0174533f; + gfx_line(g, cx, cy, cx + (int)(sinf(ang) * (float)(r - 2)), cy - (int)(cosf(ang) * (float)(r - 2)), ring == C_DDGREY ? C_GREY : C_WHITE); + uint16_t nc = ring == C_DDGREY ? C_DGREY : C_WHITE; /* el nombre, grande (se lee); dos palabras, dos renglones */ + const char *sp = strchr(name, ' '); + if (!sp) { gfx_text(g, cx - gfx_text_w(name, 1) / 2, cy + r + 4, name, nc, 1); return; } + char w1[12]; + snprintf(w1, sizeof w1, "%.*s", (int)(sp - name), name); + gfx_text(g, cx - gfx_text_w(w1, 1) / 2, cy + r + 4, w1, nc, 1); + gfx_text(g, cx - gfx_text_w(sp + 1, 1) / 2, cy + r + 13, sp + 1, nc, 1); +} + +/* ------------------------------------------------------------ el dibujo de lo que se mueve + * (2026-10-22) Debajo del panel, en el lugar que dejó la franja de perillas: la curva del filtro, la + * forma de la onda o el contorno de la sección que se edita. */ +#define PIC_X 6 +#define PIC_W 228 +enum { FC_LP4, FC_LP2, FC_BP, FC_HP, FC_FLAT }; + +/* La respuesta del filtro de 20 Hz a 20 kHz (eje logarítmico): el corte en Hz y RESO de 0 a 127. La curva se + * calcula solo cuando cambia (powf por columna). */ +static void filter_curve(bm_gfx *g, int y0, int h, float fc, int res, int type, uint16_t col) { - const bm_meta *m = &a->pat.meta; - static const char *const DT[4] = {"1/16", "1/8", "3/16", "1/4"}; - char b[24]; - int pg = a->fx_page % FXP_COUNT; - if (a->sloop) { draw_sloop(g, a); return; } - home_pages(g, a, NULL, C_WHITE); - if (pg == FXP_CHANNEL) { /* el canal del cursor: DRIVE PAN DUCK BEAT FX */ - int t = a->track; - const bm_track *tr = &a->pat.trk[t]; - uint16_t col = bm_track_color(t); - if (gfx_strip_hit(g, 37, 10)) { - snprintf(b, sizeof b, "T%d %s", t + 1, bm_track_name(a, t)); - gfx_text(g, 6, 38, b, col, 1); - gfx_small(g, 236 - gfx_small_w("W11-16 = TRACK"), 39, "W11-16 = TRACK", C_DGREY); - } - static const char *const NM[4] = {"DRIVE", "PAN", "DUCK", "BEAT FX"}; - for (int i = 0; i < 4; i++) { - int x = 6 + i * 58, y = 49; - if (!gfx_strip_hit(g, y, 58)) break; - uint16_t kc = bm_knob_color(i); - gfx_text(g, x, y, NM[i], kc, 1); - gfx_fill(g, x + 10, y + 11, 20, 40, C_DDGREY); - if (i == 1) { int c = x + 20, p = (tr->pan - 64) * 10 / 64; gfx_fill(g, p < 0 ? c + p : c, y + 11, p < 0 ? -p : (p ? p : 1), 40, kc); continue; } - int v = i == 0 ? tr->drive : i == 2 ? (t ? tr->duck : 0) : (tr->bfx_off ? 0 : 127); - int h = v * 40 / 127; - gfx_fill(g, x + 10, y + 51 - h, 20, h, kc); - if (i == 3) gfx_text_c(g, x + 20, y + 26, tr->bfx_off ? "OFF" : "ON", tr->bfx_off ? C_GREY : C_BLACK, 1); - if (i == 0 && !tr->drive) gfx_text_c(g, x + 20, y + 26, "OFF", C_GREY, 1); - if (i == 2 && !t) gfx_small(g, x + 2, y + 26, "SOURCE", C_GREY); - } - if (gfx_strip_hit(g, 110, 9)) { /* qué canales toca el BEAT FX (ahora suena el de MASTER) */ - gfx_small(g, 6, 112, "BEAT FX", C_GREY); - for (int i = 0; i < BM_TRACKS; i++) { - bool on = !a->pat.trk[i].bfx_off; - snprintf(b, sizeof b, "%d", i + 1); - gfx_fill(g, 40 + i * 14, 110, 12, 9, on ? bm_track_color(i) : C_DDGREY); - gfx_small(g, 44 + i * 14, 112, b, on ? C_BLACK : C_GREY); - } - snprintf(b, sizeof b, "%s", m->beatfx ? "" : T("MASTER > K2 PICKS IT")); - if (b[0]) gfx_small(g, 128, 112, b, C_DGREY); + if (!gfx_strip_hit(g, y0, h + 1)) return; + static int16_t ys[PIC_W]; + static int key[5] = {-1, -1, -1, -1, -1}; + int k[5] = {(int)fc, res, type, y0, h}; + if (memcmp(k, key, sizeof k)) { + memcpy(key, k, sizeof k); + float q = 0.6f + (float)res / 127.0f * 7.0f; + for (int x = 0; x < PIC_W; x++) { + float r = 20.0f * powf(1000.0f, (float)x / (float)(PIC_W - 1)) / fc; + float d = sqrtf((1.0f - r * r) * (1.0f - r * r) + (r / q) * (r / q)); + float m = type == FC_HP ? r * r / d : type == FC_BP ? (r / q) / d : type == FC_FLAT ? 1.0f : 1.0f / d; + if (type == FC_LP4) m /= sqrtf((1.0f - r * r) * (1.0f - r * r) + 2.0f * r * r); /* y dos polos más */ + float db = 20.0f * log10f(m > 1e-6f ? m : 1e-6f); + if (db > 18.0f) db = 18.0f; + if (db < -42.0f) db = -42.0f; + ys[x] = (int16_t)(y0 + 2 + (int)((18.0f - db) / 60.0f * (float)(h - 4))); } - hint_s(g, 124, "FX AGAIN = NEXT PAGE"); - return; } - if (pg == FXP_MASTER) { /* MASTER: filtro, BEAT FX y drive */ - static const char *const BF[17] = {"OFF", "STUT4", "STUT8", "STUT16", "STUT32", "REV8", "REV4", "TAPE", "GATE", - "LPF", "HPF", "BIT", "SR", "THROW", "FREEZE", "KILL LO", "KILL HI"}; - char f[16]; - if (m->mfilt >= 60 && m->mfilt <= 68) snprintf(f, sizeof f, "OPEN"); - else if (m->mfilt < 60) snprintf(f, sizeof f, "LP %d", m->mfilt); - else snprintf(f, sizeof f, "HP %d", m->mfilt - 64); - gfx_rect(g, 4, 48, 112, 56, C_CYAN); - gfx_text(g, 8, 52, "FILTER", C_CYAN, 1); - gfx_text(g, 8, 66, f, C_WHITE, 2); - gfx_rect(g, 122, 48, 114, 56, C_ORANGE); - gfx_text(g, 126, 52, "BEAT FX", C_ORANGE, 1); - gfx_text(g, 126, 66, BF[m->beatfx % 17], m->beatfx ? C_PINK : C_GREY, 2); - snprintf(b, sizeof b, "DRIVE %d%%", a->set.drive * 100 / 127); - gfx_small(g, 6, 110, b, C_GREEN); - hint_s(g, 120, "FX AGAIN = NEXT PAGE"); - return; + int base = y0 + h - 2; + gfx_rect(g, PIC_X - 2, y0, PIC_W + 4, h, C_DDGREY); + for (int f = 100; f <= 10000; f *= 10) gfx_vline(g, PIC_X + (int)(log10f((float)f / 20.0f) / 3.0f * (float)(PIC_W - 1)), y0 + 1, h - 2, C_DDGREY); + gfx_hline(g, PIC_X, y0 + 2 + (h - 4) * 18 / 60, PIC_W, C_DDGREY); /* 0 dB */ + uint16_t fill = dim(dim(col)); + for (int x = 0; x < PIC_W; x++) { + int y = ys[x]; + if (y < base) gfx_vline(g, PIC_X + x, y, base - y, fill); + if (x) hit_seg(g, PIC_X + x - 1, ys[x - 1], PIC_X + x, y, col); } - gfx_rect(g, 4, 48, 74, 56, pg == FXP_REVERB ? C_DGREY : C_CYAN); - gfx_text(g, 8, 52, "DELAY", C_CYAN, 1); - gfx_text(g, 8, 64, DT[m->dly_time & 3], C_WHITE, 2); - snprintf(b, sizeof b, "FB %d%%", m->dly_fb * 100 / 127); gfx_small(g, 8, 84, b, C_ORANGE); - snprintf(b, sizeof b, "MIX %d%%", m->dly_mix * 100 / 127); gfx_small(g, 8, 92, b, C_GREEN); - gfx_rect(g, 82, 48, 74, 56, pg == FXP_REVERB ? C_PINK : C_DGREY); - gfx_text(g, 86, 52, "REVERB", C_PINK, 1); - snprintf(b, sizeof b, "%d%%", m->rv_size * 100 / 127); gfx_text(g, 86, 64, b, C_WHITE, 2); - snprintf(b, sizeof b, "DAMP %d%%", m->rv_damp * 100 / 127); gfx_small(g, 86, 84, b, C_ORANGE); - snprintf(b, sizeof b, "MIX %d%%", m->rv_mix * 100 / 127); gfx_small(g, 86, 92, b, C_GREEN); - gfx_rect(g, 160, 48, 76, 56, C_DGREY); - gfx_text(g, 164, 52, "DUCK", C_ORANGE, 1); - for (int t = 1; t < BM_TRACKS; t++) { - int x = 164 + (t - 1) * 14; - gfx_fill(g, x, 66, 10, 30, C_DDGREY); - int h = a->pat.trk[t].duck * 30 / 127; - gfx_fill(g, x, 96 - h, 10, h, bm_track_color(t)); - } - if (a->ctx.arena_busy) { gfx_fill(g, 4, 48, 74, 56, C_DDGREY); gfx_small(g, 8, 70, "PAUSED: TAKE", C_ORANGE); gfx_small(g, 8, 78, "NOT SAVED YET", C_ORANGE); } - hint_s(g, 112, "FX AGAIN = NEXT PAGE"); - hint_s(g, 120, "HOLD FX = PUNCH-IN"); } -/* ------------------------------------------------------------ escala y acordes */ -static void draw_keyboard(bm_gfx *g, const bm_app *a, int ky, int kh) -{ - int t = a->track, root, sc = app_scale(a, t, &root); - int base_oct = (app_engine(a, t) == ENG_ACID || app_engine(a, t) == ENG_MINI ? 2 : 3) + a->oct; /* las de bajo, una octava abajo */ - char b[12]; - if (!gfx_strip_hit(g, ky, kh + 2)) return; - int n = bm_scale_len(sc); - for (int i = 0; i < BM_WHITES; i++) { - int x = i * 15, k = bm_white_key(i); - uint16_t c = (i % n == 0) ? C_ORANGE : C_WHITE; - if (a->keys_down[k]) c = bm_track_color(t); - gfx_fill(g, x, ky, 14, kh, c); - int note = bm_scale_note(root, sc, i, base_oct); - snprintf(b, sizeof b, "%s", bm_note_names[note % 12]); - gfx_small(g, x + 7 - gfx_small_w(b) / 2, ky + kh - 14, b, C_BLACK); - snprintf(b, sizeof b, "%d", note / 12 - 1); - gfx_small(g, x + 6, ky + kh - 7, b, C_DGREY); - } - for (int i = 0; i < BM_BLACKS; i++) { - int k = bm_black_key(i), wi = bm_key_white_index(k - 1), x = wi * 15 + 9; - uint16_t c = a->keys_down[k] ? bm_track_color(t) : C_DDGREY; - gfx_fill(g, x, ky, 11, kh * 6 / 10, c); - gfx_rect(g, x, ky, 11, kh * 6 / 10, C_BLACK); - if (i < 7) { - char nm[10]; - bm_chord_name(root, sc, i, 0, nm, sizeof nm); - nm[3] = 0; - gfx_small(g, x + 1, ky + kh * 6 / 10 - 8, nm, a->keys_down[k] ? C_BLACK : C_WHITE); - } else { - static const char *const MODS[4] = {"+7", "+9", "S2", "S4"}; - gfx_small(g, x + 2, ky + kh * 6 / 10 - 8, MODS[i - 7], a->keys_down[k] ? C_BLACK : C_YELLOW); - } +/* Dos ciclos de una forma de onda (fn devuelve -1..1 para una fase 0..2: dos ciclos, para que el + * sub de una octava abajo haga uno) */ +typedef float (*wave_fn)(const bm_app *a, float ph2); +static void osc_shape(bm_gfx *g, const bm_app *a, int y0, int h, wave_fn fn, uint16_t col) +{ + if (!gfx_strip_hit(g, y0, h + 1)) return; + int mid = y0 + h / 2, amp = h / 2 - 4, py = mid; + gfx_rect(g, PIC_X - 2, y0, PIC_W + 4, h, C_DDGREY); + gfx_hline(g, PIC_X, mid, PIC_W, C_DDGREY); + for (int x = 0; x < PIC_W; x++) { + float v = fn(a, (float)x * 2.0f / (float)PIC_W); + int y = mid - (int)((v > 1.0f ? 1.0f : v < -1.0f ? -1.0f : v) * (float)amp); + if (x) hit_seg(g, PIC_X + x - 1, py, PIC_X + x, y, col); + py = y; } } -static void draw_scl(bm_gfx *g, const bm_app *a, int project) +static float frac1(float x) { return x - (float)(int)x; } + +/* SCL del BB-303 y del B-MINI: el roll de la página de 16 pasos y debajo el ACCENT y el SLIDE (o GLIDE) + * de cada paso; la fila que se edita, encendida */ +static void draw_scl(bm_gfx *g, const bm_app *a, const char *row2) { - const bm_meta *m = &a->pat.meta; - const bm_track *tr = &a->pat.trk[a->track]; - char b[30]; - int root = m->root, sc = m->scale; - if (!project && tr->scl != 0xFF) { root = tr->scl_root; sc = tr->scl; } - int y = project ? 28 : PY; - if (gfx_strip_hit(g, y, 26)) { - gfx_text(g, 6, y, project ? "PROJECT SCALE" : (tr->scl == 0xFF ? "SCALE (FROM THE PROJECT)" : "OWN TRACK SCALE"), C_GREY, 1); - snprintf(b, sizeof b, "%s %s", bm_note_names[root % 12], T(bm_scale_names[sc % BM_SCALES])); - gfx_text(g, 6, y + 10, b, C_WHITE, 2); - if (a->chord_name[0]) gfx_text_r(g, 234, y + 10, a->chord_name, C_ORANGE, 2); - } - if (app_kind(a, a->track) == KIND_NOTE || project) draw_keyboard(g, a, y + 28, VB - y - 36); - else gfx_text_c(g, 120, 90, "PICK A NOTE TRACK", C_GREY, 1); - hint_s(g, VB - 6, project ? "FOR TRACKS WITHOUT THEIR OWN SCALE" : "SCL AGAIN: CHORDS - HOME + SCL: PROJECT"); + int t = a->track; + const bm_bx7ui *u = &a->bx; + bool sl = u->sub[BXP_SCL] % 2 != 0; + int L = mach_len(a); + draw_seq_roll(g, a, t, 39, 82, false, u->blk); + for (int row = 0; row < 2; row++) { + int y = 90 + row * 15; + if (!gfx_strip_hit(g, y, 13)) continue; + bool act = row == (sl ? 1 : 0); + uint16_t rc = row ? C_GREEN : C_ORANGE; + gfx_small(g, 2, y + 3, row ? row2 : "ACC", act ? rc : C_DGREY); + for (int w = 0; w < 16; w++) { + int s = u->blk * 16 + w, x = 20 + w * 14; + if (s >= L) continue; + bool has = false, on = false; + for (int e = 0; e < BM_EVENTS; e++) { + const bm_event *ev = bm_evc(&a->pat, t, s, e); + if (bm_event_empty(ev)) continue; + has = true; + on |= row ? (ev->len & BM_LEN_TIE) != 0 : ev->vel >= BM_VEL_ACC; + } + if (on) gfx_fill(g, x, y, 12, 12, act ? rc : dim(rc)); + else gfx_rect(g, x, y, 12, 12, has ? (act ? C_GREY : C_DGREY) : C_DDGREY); + } + } } -static void draw_chords(bm_gfx *g, const bm_app *a, int y0) +static float wv_303(const bm_app *a, float ph2) /* SAW o SQR, como el interruptor */ { - const bm_meta *m = &a->pat.meta; - char b[24]; - int t = bm_app_chord_track(a), root, sc = app_scale(a, t, &root); - if (gfx_strip_hit(g, y0, 9)) { - snprintf(b, sizeof b, "%s %.5s T%d", bm_note_names[root % 12], T(bm_scale_names[sc % BM_SCALES]), t + 1); - gfx_text(g, 4, y0, b, C_WHITE, 1); - if (a->last_pad >= 0) gfx_text_r(g, 236, y0, a->chord_name, C_WHITE, 1); - } - static const uint16_t FN[3] = {C_CYAN, C_GREEN, C_ORANGE}; - int rh = (VB - y0 - 10) / 4; - for (int p = 0; p < 16; p++) { - int x = (p % 4) * 60, y = y0 + 10 + (p / 4) * rh; - if (!gfx_strip_hit(g, y, rh)) continue; - bm_pad_chord pc = bm_chord_pad(m->chord_set, p); - uint16_t fc = FN[bm_chord_function(pc.degree)]; - int k = bm_white_key(p); - bool on = a->keys_down[k], last = p == a->last_pad; - gfx_fill(g, x + 1, y, 58, rh - 1, on ? fc : (last ? dim(fc) : C_DDGREY)); - gfx_fill(g, x + 1, y, 3, rh - 1, fc); - char rn[10], nm[10]; - bm_roman(root, sc, pc.degree, pc.ext, rn, sizeof rn); - bm_chord_name(root, sc, pc.degree, pc.ext, nm, sizeof nm); - gfx_text(g, x + 8, y + 2, rn, on ? C_BLACK : C_WHITE, 1); - gfx_small(g, x + 8, y + rh - 8, nm, on ? C_BLACK : fc); - } + float p = frac1(ph2); + return (a->pat.prm[a->track][AC_WAVE] & 1) ? (p < 0.5f ? 1.0f : -1.0f) : 1.0f - 2.0f * p; } -/* ------------------------------------------------------------ ARP y LOOP */ -static void draw_arp(bm_gfx *g, const bm_app *a) +static void draw_b303(bm_gfx *g, const bm_app *a) { - static const char *const M[5] = {"OFF", "UP", "DOWN", "UP-DOWN", "RANDOM"}; - static const char *const R[3] = {"1/8", "1/16", "1/32"}; int t = a->track; + const bm_bx7ui *u = &a->bx; const bm_track *tr = &a->pat.trk[t]; - char b[24]; - if (bm_is_grid(&a->pat, t)) return; /* las rejillas: ARP es la capa ROLL (draw_layer) */ - gfx_text(g, 6, PY + 4, M[tr->arp_mode % 5], C_WHITE, 3); - snprintf(b, sizeof b, "%s %d OCT GATE %d%%", R[tr->arp_rate % 3], tr->arp_oct, tr->arp_gate); - note_s(g, PY + 30, b); - const bm_arp *ar = &a->ctx.arp[t]; - for (int i = 0; i < 8; i++) { - int x = 10 + i * 28, h = 8 + i * 5; - if (gfx_strip_hit(g, 122 - h, h)) gfx_fill(g, x, 122 - h, 22, h, i < ar->n ? (ar->playing && ar->cur % 12 == ar->held[i] % 12 ? C_WHITE : bm_track_color(t)) : C_DDGREY); + const uint8_t *p = a->pat.prm[t]; + uint16_t col = bm_track_color(t); + char b[16]; + switch (u->page) { + case BXP_SEQ: /* el piano roll: ACCENT en blanco, SLIDE en verde */ + draw_seq_roll(g, a, t, 39, VB - 10, false, mach_roll_page(a, t)); + return; + case BXP_SCL: /* ACCENT o SLIDE de cada paso: las 16 blancas */ + draw_scl(g, a, "SLD"); + return; + case BXP_LFO: { /* las cuatro perillas y la forma de un ciclo */ + mach_list(g, a, 37, 30); + if (gfx_strip_hit(g, 158, 35)) { + int w = p[AC_LFO_WAVE] % ACW_N, px = -1, py = 0; + uint16_t c = p[AC_LFO_DEPTH] ? col : C_DGREY; + gfx_rect(g, 8, 158, 224, 34, C_DDGREY); + for (int x = 0; x < 222; x++) { + int y = 189 - (int)(bm_acid_lfo_shape(w, (float)x / 222.0f, 0) * 28.0f); + if (px >= 0) gfx_line(g, 8 + px, py, 9 + x, y, c); + px = x + 1; py = y; + } + } + return; + } + case BXP_FX: { /* las tres casillas del TB-03, en su orden */ + int pg = u->sub[BXP_FX] % 2; + for (int i = 0; i < ACF_N; i++) { + int x = 4 + i * 80, y = 44; + if (!gfx_strip_hit(g, y, 46)) continue; + bool on = bm_acid_fx_on(p, i), sel = pg ? i != ACF_OD : i == ACF_OD; + if (on) gfx_fill(g, x, y, 72, 44, dim(col)); + gfx_rect(g, x, y, 72, 44, sel ? C_WHITE : C_DGREY); + if (sel) gfx_rect(g, x + 1, y + 1, 70, 42, C_WHITE); + gfx_small(g, x + 36 - gfx_small_w(T(b303_fx_names[i])) / 2, y + 14, T(b303_fx_names[i]), on ? C_WHITE : C_GREY); + gfx_small(g, x + 36 - gfx_small_w(on ? "ON" : "OFF") / 2, y + 28, on ? "ON" : "OFF", on ? C_ORANGE : C_DGREY); + if (i < ACF_N - 1) { gfx_hline(g, x + 73, y + 22, 6, C_GREY); gfx_line(g, x + 76, y + 19, x + 78, y + 22, C_GREY); gfx_line(g, x + 76, y + 25, x + 78, y + 22, C_GREY); } + } + return; + } + case BXP_GLO: case BXP_ARP: + mach_list(g, a, 40, 38); + return; + default: break; + } + /* el panel: la fila de perillas de la 303 y debajo la forma de onda, el slide y el volumen */ + int pg = u->sub[BXP_MAIN] % 2; + uint16_t k1 = bm_knob_color(0), k2 = bm_knob_color(1), k3 = bm_knob_color(2), k4 = bm_knob_color(3), off = C_DDGREY; + static const char *const NM[6] = {"TUNING", "CUT OFF", "RESO", "ENV MOD", "DECAY", "ACCENT"}; + int val[6] = {tr->transpose, tr->macro[0], tr->macro[1], tr->macro[2], tr->macro[3], tr->accent}; + int mx[6] = {48, 127, 127, 127, 127, 127}; + uint16_t ring[6] = {pg ? k1 : off, pg ? off : k1, pg ? off : k2, pg ? off : k3, pg ? off : k4, C_ORANGE}; + for (int i = 0; i < 6; i++) dial(g, 20 + i * 40, 54, 14, bm_clampi(val[i], 0, mx[i]), mx[i], ring[i], NM[i]); + if (gfx_strip_hit(g, 92, 30)) { + uint16_t wc = pg ? k2 : C_DGREY; + int w = p[AC_WAVE] & 1; + gfx_text(g, 6, 94, "WAVEFORM", pg ? C_WHITE : C_DGREY, 1); + for (int i = 0; i < 2; i++) { /* el interruptor: SAW / SQR */ + int x = 6 + i * 34; + if (i == w) gfx_fill(g, x, 104, 32, 15, wc); else gfx_rect(g, x, 104, 32, 15, C_DGREY); + gfx_text(g, x + 16 - gfx_text_w(i ? "SQR" : "SAW", 1) / 2, 108, i ? "SQR" : "SAW", i == w ? C_BLACK : C_DGREY, 1); + } + static const bxp GL = {"SLIDE", K_TRK, 0, 0, 127, F_GLIDE, NULL}; + mach_fmt(&GL, tr->glide, b, sizeof b); + gfx_text(g, 92, 94, "SLIDE", pg ? C_WHITE : C_DGREY, 1); + gfx_text(g, 92, 105, b, pg ? k3 : C_DGREY, 2); + } + dial(g, 210, 105, 12, tr->level, 127, pg ? k4 : off, "VOLUME"); + /* abajo, lo que mueve la página: el filtro (CUT OFF y RESO) o la onda (SAW / SQR) */ + if (pg) osc_shape(g, a, 134, 58, wv_303, col); + else filter_curve(g, 134, 58, bm_acid_cut_hz(tr->macro[0]), tr->macro[1], FC_LP4, col); +} + +/* ------------------------------------------------------------ las de panel: B-MINI, BUNO-6, BITTAL */ +/* un contorno (ATTACK, DECAY, SUSTAIN, RELEASE) desde sus cuatro bytes de prm */ +static void env_contour(bm_gfx *g, const uint8_t *q, int y0, int h, uint16_t c) +{ + float sus = (float)q[2] / 127.0f; + float tm[4] = {0.05f + (float)q[0] / 127.0f, 0.1f + (float)q[1] / 127.0f, 0.5f, 0.1f + (float)q[3] / 127.0f}; + float lv[4] = {1.0f, sus, sus, 0.0f}; + env_shape(g, 4, y0, 232, h, tm, lv, 0.0f, c); +} + +/* lo que sale del LFO (y de la modulación) en el recuadro de abajo, x 0..1 */ +static float panel_lfo_at(int eng, const uint8_t *p, float x) +{ + float ph = x * 2.0f, f = ph - (float)(int)ph; + float tri = 4.0f * fabsf(f - 0.5f) - 1.0f, sqr = f < 0.5f ? 1.0f : -1.0f; + if (eng == ENG_BUNO) { /* el Juno: triángulo, entra con su DELAY */ + float d = (float)p[BN_LDELAY] / 127.0f, r = d > 0.0f ? x / d : 1.0f; + return tri * (r < 1.0f ? r : 1.0f); + } + if (eng == ENG_BITTAL) { + switch (p[BT_LSHAPE] % BT_LSHAPES) { + case BT_L_SIN: return sinf(ph * 6.2831853f); + case BT_L_SAW: return 2.0f * f - 1.0f; + case BT_L_SQR: return sqr; + case BT_L_SH: { uint32_t r = (uint32_t)(ph * 4.0f) * 2654435761u; return (float)((r >> 24) & 255) / 127.5f - 1.0f; } + default: return tri; + } } - hint_s(g, VB - 6, tr->arp_mode ? "ALWAYS ON IN THIS TRACK" : "HOLD ARP = LIVE ARPEGGIO"); + float s3 = (float)p[MN_MIX] / 127.0f, o3p = ph * 4.0f - (float)(int)(ph * 4.0f), o3; /* B-MINI: MOD MIX, OSC 3 y LFO */ + switch (p[MN_W3] % MN_WAVES) { + case MN_WAVE_TRI: o3 = 4.0f * fabsf(o3p - 0.5f) - 1.0f; break; + case MN_WAVE_SQR: o3 = o3p < 0.5f ? 1.0f : -1.0f; break; + case MN_WAVE_WIDE: o3 = o3p < 0.3f ? 1.0f : -1.0f; break; + case MN_WAVE_NARROW: o3 = o3p < 0.12f ? 1.0f : -1.0f; break; + default: o3 = 2.0f * o3p - 1.0f; break; + } + return (1.0f - s3) * (p[MN_LWAVE] ? sqr : tri) + s3 * o3; } -static void draw_loop(bm_gfx *g, const bm_app *a) +/* BITTAL: la onda de cada tabla en su posición, la que está sonando (con el LFO, las macros y ENV 2) + * o, callado, la del FRAME */ +static void bt_waves(bm_gfx *g, const bm_app *a, int y0, int h, uint16_t col) { - int t = a->track; - const bm_loop *lp = &a->pat.loop[t - 2]; - int mode = a->ctx.st.loop_mode[t - 2]; - static const char *const MN[5] = {"OFF", "ARMED", "RECORDING", "PLAY", "OVERDUB"}; - static const uint16_t MC[5] = {C_GREY, C_YELLOW, C_RED, C_GREEN, C_ORANGE}; - char b[30]; - gfx_text(g, 6, PY + 2, MN[mode % 5], MC[mode % 5], 2); - snprintf(b, sizeof b, TF("%d BARS %d/%d NOTES %s"), lp->bars, lp->n, BM_LOOP_EVENTS, lp->on ? "ON" : "OFF"); - note_s(g, PY + 22, b); - int bx = 6, bw = 228, by = PY + 32, bh = 34; - if (gfx_strip_hit(g, by, bh)) { - gfx_rect(g, bx, by, bw, bh, C_DGREY); - uint32_t L = (uint32_t)(lp->bars ? lp->bars : 2) * BM_BAR_TICKS; - for (int i = 1; i < lp->bars * 4; i++) gfx_vline(g, bx + (int)(bw * (uint32_t)i / (uint32_t)(lp->bars * 4)), by + 1, i % 4 ? 4 : bh - 2, C_DDGREY); - for (int i = 0; i < lp->n; i++) { - if (!lp->ev[i].vel) continue; - int x = bx + (int)((uint32_t)bw * lp->ev[i].tick / L); - int y = by + bh - 4 - (lp->ev[i].note % 24); - gfx_fill(g, x, y, 3, 3, bm_track_color(t)); + if (!gfx_strip_hit(g, y0, h + 1)) return; + static uint32_t seen, still; + uint32_t sq = bm_wv_btseq; + if (sq != seen) { seen = sq; still = 0; } else if (still < 100) still++; + const uint8_t *p = a->pat.prm[a->track]; + for (int o = 0; o < 2; o++) { + int x0 = 4 + o * 118, w = 114, mid = y0 + h / 2; + bool on = p[o ? BT_L2 : BT_L1] > 0; + gfx_rect(g, x0, y0, w, h, C_DDGREY); + gfx_small(g, x0 + 3, y0 + 2, o ? "OSC 2" : "OSC 1", on ? C_GREY : C_DGREY); + if (!bm_wt_ready(o)) continue; + float pos = still < 8 ? bm_wv_btpos[o] : (float)p[o ? BT_P2 : BT_P1] / 127.0f; + int nf = bm_wt_frames(o), n = 0, nb = 0; + float fp = pos * (float)(nf - 1); + int fa = (int)fp, fb = fa + 1 < nf ? fa + 1 : fa; + float ff = fp - (float)fa; + const int16_t *ta = bm_wt_data(o, fa, 0, &n), *tb = bm_wt_data(o, fb, 0, &nb); + if (!ta || !tb || n <= 0 || nb != n) continue; + int py = mid; + for (int x = 0; x < w - 4; x++) { + int i = x * n / (w - 4); + float v = ((float)ta[i] + ff * (float)(tb[i] - ta[i])) * (1.0f / 32768.0f); + int y = mid - (int)(v * (float)(h / 2 - 3)); + if (x) gfx_line(g, x0 + 1 + x, py, x0 + 2 + x, y, on ? col : C_DGREY); + py = y; } - if (mode >= LOOP_REC) gfx_vline(g, bx + (int)((uint32_t)bw * a->ctx.st.loop_pos[t - 2] / L), by, bh, C_WHITE); } - hint_s(g, PY + 72, "REC: RECORD > PLAY > OVERDUB - STARTS ON THE NEXT BAR"); - hint_s(g, PY + 80, "REC 2 S: ERASE THE LOOP"); } -/* ------------------------------------------------------------ globales */ -enum { SYS_ROWS = 11 }; -static void sys_val(const bm_app *a, int i, char *v, int cap) +/* FX de las de panel y del Slicer: DISTORTION > CHORUS > REVERB, la página encendida (s 0: DISTORTION) */ +static void px_fx_boxes(bm_gfx *g, const bm_app *a, int s) { - const bm_settings *s = &a->set; - size_t n = (size_t)cap; - switch (i) { - case 0: snprintf(v, n, "%s", s->clock ? "EXTERNAL" : "INTERNAL"); break; - case 1: snprintf(v, n, "%s", s->sync_mode ? "SPLIT L/R" : "STEREO"); break; - case 2: snprintf(v, n, "%d PPQN", s->sync_ppqn); break; - case 3: snprintf(v, n, "%d MS", s->sync_lat); break; - case 4: snprintf(v, n, "%s", s->autosave ? "ON" : "OFF"); break; - case 5: snprintf(v, n, "%s", s->led_dim == 0 ? "OFF" : (s->led_dim == 1 ? "DIM" : "MEDIUM")); break; - case 6: snprintf(v, n, "%s", s->fast_lcd ? "ON (TEST)" : "OFF"); break; - case 7: snprintf(v, n, "%s", s->dual_core ? "ON (TEST)" : "OFF"); break; - case 8: { - int nt = 0; for (int k = 0; k < BM_TAKES; k++) nt += a->take[k].valid; - unsigned fs = (unsigned)(bm_takes_free(a->take) * 10u / BM_SMP_RATE); - snprintf(v, n, TF("%d+%d, FREE %u.%uS"), nt, bm_snaps_user_n(), fs / 10, fs % 10); - break; - } - case 9: snprintf(v, n, "%s", bm_lang_name()); break; - default: snprintf(v, n, "%s", BM_VERSION_STR); break; + int t = a->track, eng = a->pat.trk[t].engine; + const uint8_t *p = a->pat.prm[t]; + uint16_t col = bm_track_color(t); + for (int i = 0; i < PXF_N; i++) { + int x = 4 + i * 80, y = 44; + if (!gfx_strip_hit(g, y, 46)) continue; + bool on = bm_px_fx_on(p, eng, i), sel = s ? i != PXF_DIST : i == PXF_DIST; + int ch = bm_px_chorus(p, eng); + const char *st = i == PXF_CHORUS ? (eng == ENG_BUNO ? bm_bn_chorus_names[ch] : bm_px_chorus_names[ch]) : on ? "ON" : "OFF"; + if (on) gfx_fill(g, x, y, 72, 44, dim(col)); + gfx_rect(g, x, y, 72, 44, sel ? C_WHITE : C_DGREY); + if (sel) gfx_rect(g, x + 1, y + 1, 70, 42, C_WHITE); + gfx_small(g, x + 36 - gfx_small_w(T(panel_fx_names[i])) / 2, y + 14, T(panel_fx_names[i]), on ? C_WHITE : C_GREY); + gfx_small(g, x + 36 - gfx_small_w(st) / 2, y + 28, st, on ? C_ORANGE : C_DGREY); + if (i < PXF_N - 1) { gfx_hline(g, x + 73, y + 22, 6, C_GREY); gfx_line(g, x + 76, y + 19, x + 78, y + 22, C_GREY); gfx_line(g, x + 76, y + 25, x + 78, y + 22, C_GREY); } + } +} + +/* las formas del B-MINI (la del oscilador de la sección) */ +static float wv_mini(const bm_app *a, float ph2) +{ + const uint8_t *q = a->pat.prm[a->track]; + int s = panel_sub(a), w = q[s == 1 ? MN_W1 : s == 2 ? MN_W2 : MN_W3] % MN_WAVES; + float p = frac1(ph2), saw = 1.0f - 2.0f * p, tri = p < 0.5f ? 4.0f * p - 1.0f : 3.0f - 4.0f * p; + switch (w) { + case MN_WAVE_TRI: return tri; + case MN_WAVE_SHARK: return 0.5f * (tri + saw); + case MN_WAVE_SQR: return p < 0.5f ? 1.0f : -1.0f; + case MN_WAVE_WIDE: return p < 0.3f ? 1.0f : -1.0f; + case MN_WAVE_NARROW: return p < 0.12f ? 1.0f : -1.0f; + default: return saw; } } -static void draw_system(bm_gfx *g, const bm_app *a) +/* el DCO del Juno: el pulso (con su ancho), el diente de sierra y el sub de una octava abajo, sumados */ +static float wv_buno(const bm_app *a, float ph2) { - enum { NR = SYS_ROWS }; - char v[20]; - static const char *const L[NR] = {"CLOCK", "SYNC OUT", "SYNC PPQN", "SYNC LATENCY", "AUTOSAVE", "IDLE LEDS", "FAST SCREEN", "TWO CORES", - "TAKES+SOUNDS", N_("LANGUAGE"), "VERSION"}; - int first = a->menu_row > 7 ? a->menu_row - 7 : 0; - for (int i = 0; i < 8 && first + i < NR; i++) { - if (!gfx_strip_hit(g, 26 + i * 12, 12)) continue; /* el valor, solo de la fila que se dibuja */ - sys_val(a, first + i, v, sizeof v); - row(g, 26 + i * 12, first + i == a->menu_row, T(L[first + i]), v); - } - if (a->menu_row == 6 || a->menu_row == 7) note_s(g, 124, "TESTING: SAFE MODE TURNS IT OFF AFTER A CRASH"); + const uint8_t *q = a->pat.prm[a->track]; + float p = frac1(ph2), v = 0.0f, n = 0.0f; + if (q[BN_PULSE]) { v += p < 0.5f - (float)q[BN_PWM] / 127.0f * 0.45f ? 1.0f : -1.0f; n += 1.0f; } + if (q[BN_SAW]) { v += 1.0f - 2.0f * p; n += 1.0f; } + if (q[BN_SUB]) { float s = (float)q[BN_SUB] / 127.0f; v += (ph2 < 1.0f ? s : -s); n += s; } + return n > 0.0f ? v / n : 0.0f; } -static void draw_glo_mach(bm_gfx *g, const bm_app *a); -static void draw_song(bm_gfx *g, const bm_app *a); +static float wv_blfo(const bm_app *a, float ph2) { return panel_lfo_at(ENG_BUNO, a->pat.prm[a->track], ph2 * 0.5f); } -/* GLO de la consola (GLO en HOME, o HOME + GLO en cualquier lado; GLO otra vez = la página siguiente): - * TEMPO, MACHINES, SCALE y SONG. SELECT la fila, ALGORITHM el valor. */ -static void draw_glo(bm_gfx *g, const bm_app *a) +/* debajo del panel, lo que mueve la sección: el filtro, la onda del oscilador o el contorno */ +static void panel_picture(bm_gfx *g, const bm_app *a, int y0, int h) { - home_pages(g, a, NULL, C_WHITE); - switch (a->glo_page) { - case GP_MACH: draw_glo_mach(g, a); return; - case GP_SONG: draw_song(g, a); return; - default: break; + int t = a->track, eng = a->pat.trk[t].engine, s = panel_sub(a); + const uint8_t *p = a->pat.prm[t]; + const bm_track *tr = &a->pat.trk[t]; + uint16_t col = bm_track_color(t); + switch (eng) { + case ENG_MINI: + if (s == 0) filter_curve(g, y0, h, bm_cut_hz(tr->macro[0]), tr->macro[1], FC_LP4, col); + else if (s <= 3) osc_shape(g, a, y0, h, wv_mini, p[s == 1 ? MN_L1 : s == 2 ? MN_L2 : MN_L3] ? col : C_DGREY); + else env_contour(g, p + MN_AA, y0, h, col); + return; + case ENG_BUNO: + if (s == 0 || s == 3) filter_curve(g, y0, h, bm_cut_hz(tr->macro[0]), tr->macro[1], FC_LP4, col); + else if (s == 1) osc_shape(g, a, y0, h, wv_buno, col); + else if (s == 2) osc_shape(g, a, y0, h, wv_blfo, p[BN_LFODCO] ? col : C_DGREY); + else env_contour(g, p + BN_A, y0, h, col); + return; + default: { /* BITTAL */ + static const uint8_t FT[BT_FILTERS] = {FC_LP4, FC_LP2, FC_BP, FC_HP, FC_LP4, FC_FLAT}; + if (s <= 3) bt_waves(g, a, y0, h, col); + else if (s <= 5) filter_curve(g, y0, h, bm_cut_hz(p[BT_CUT]), p[BT_RES], FT[p[BT_FT] % BT_FILTERS], col); + else env_contour(g, p + BT_AA, y0, h, col); + return; } - int n = bm_app_glo_count(a); - char v[20]; - for (int i = 0; i < n; i++) { - const char *nm; - int y = PY + 4 + i * 12; - if (!gfx_strip_hit(g, y, 12)) continue; - bm_app_glo_row(a, i, &nm, v, sizeof v); - row(g, y, i == a->glo_row, nm, v); - } - if (a->glo_page == GP_SCALE && gfx_strip_hit(g, PY + 56, 30)) { /* la escala del proyecto, con sus notas */ - const bm_meta *m = &a->pat.meta; - int sl = bm_scale_len(m->scale % BM_SCALES); - for (int d = 0; d < sl && d < 8; d++) { - int note = bm_scale_note(m->root % 12, m->scale % BM_SCALES, d, 4); - int x = 6 + d * 29; - gfx_fill(g, x, PY + 58, 26, 16, d == 0 ? C_ORANGE : C_DDGREY); - gfx_text_c(g, x + 13, PY + 62, bm_note_names[note % 12], d == 0 ? C_BLACK : C_WHITE, 1); - } - note_s(g, PY + 80, "FOR TRACKS WITHOUT THEIR OWN SCALE"); } - if (a->glo_page == GP_TEMPO) hint_s(g, VB - 6, "HOLD GLO = TRANSPOSE, PLAY = TAP"); } -static void draw_save(bm_gfx *g, const bm_app *a) +static void draw_panel(bm_gfx *g, const bm_app *a) { - char r0[24], r1[24], r4[24]; - snprintf(r0, sizeof r0, "A%02d", a->ctx.st.pattern + 1); - snprintf(r1, sizeof r1, "A%02d", a->save_target + 1); - snprintf(r4, sizeof r4, "%d", bm_pattern_count_events(&a->pat)); - header(g, "SAVE", a->dirty ? "UNSAVED" : "SAVED", C_WHITE); - row(g, 48, a->save_row == 0, "SAVE", r0); - row(g, 60, a->save_row == 1, "SAVE AS", r1); - row(g, 72, a->save_row == 2, "SAVE SONG AND SCENES", NULL); - row(g, 84, a->save_row == 3, a->clear_armed ? "CLEAR? SAVE AGAIN" : "CLEAR PATTERN", NULL); - row(g, 96, a->save_row == 4, "EVENTS", r4); - note_s(g, 112, "SELECT PICKS, SAVE RUNS - HOLD SAVE = COPY PATTERN"); - gfx_small(g, 4, 122, a->ctx.st.playing ? "ONLY WHEN STOPPED (CUTS AUDIO)" : "ONLY WHEN STOPPED - SAVE 2 S: QUICK SAVE", a->ctx.st.playing ? C_ORANGE : C_GREY); + int t = a->track, eng = a->pat.trk[t].engine; + const bm_bx7ui *u = &a->bx; + const uint8_t *p = a->pat.prm[t]; + uint16_t col = bm_track_color(t); + int s = panel_sub(a); + const bxp *P = panel_knobs(a); + char b[16]; + switch (u->page) { + case BXP_SEQ: /* el piano roll: ACCENT en blanco, GLIDE en verde */ + draw_seq_roll(g, a, t, 39, VB - 10, false, mach_roll_page(a, t)); + return; + case BXP_SCL: + draw_scl(g, a, "GLD"); + return; + case BXP_ENV: /* el contorno de la página, grande */ + env_contour(g, p + P[0].idx, 40, 92, col); + return; + case BXP_LFO: /* las perillas y lo que sale */ + mach_list(g, a, 37, 30); + if ((eng != ENG_BITTAL || s == 0) && gfx_strip_hit(g, 158, 35)) { + int amt = eng == ENG_BUNO ? 127 : p[eng == ENG_BITTAL ? BT_LAMT : MN_LAMT], py = 0; + uint16_t c = amt ? col : C_DGREY; + gfx_rect(g, 8, 158, 224, 34, C_DDGREY); + for (int x = 0; x < 222; x++) { + int y = 175 - (int)(panel_lfo_at(eng, p, (float)x / 222.0f) * 14.0f); + if (x) gfx_line(g, 8 + x, py, 9 + x, y, c); + py = y; + } + } + return; + case BXP_FX: /* las tres casillas, en el orden de la cadena */ + px_fx_boxes(g, a, s); + return; + case BXP_GLO: case BXP_ARP: + mach_list(g, a, 40, 38); + return; + default: break; + } + /* el panel: sus secciones (la de la página, encendida), sus cuatro perillas (las únicas: sin la + * franja de abajo) y debajo el dibujo de la sección: el filtro, la onda o el contorno */ + int ns = panel_edit_n(a), tw = 236 / ns; + int cy = 70, r = 18, vy = 114; + if (gfx_strip_hit(g, 38, 11)) + for (int i = 0; i < ns; i++) { + int x = 2 + i * tw; + const char *nm = T(panel_edit_name(a, i)); + char sq[12]; + if (gfx_small_w(nm) > tw - 4) { /* pestaña angosta: sin espacios ("OSC1+") */ + int j = 0; + for (const char *c = nm; *c && j < (int)sizeof sq - 1; c++) if (*c != ' ') sq[j++] = *c; + sq[j] = 0; + nm = sq; + } + if (i == s) gfx_fill(g, x, 38, tw - 2, 10, col); else gfx_rect(g, x, 38, tw - 2, 10, C_DDGREY); + gfx_small(g, x + (tw - 2) / 2 - gfx_small_w(nm) / 2, 40, nm, i == s ? C_BLACK : C_GREY); + } + for (int k = 0; k < 4; k++) { + if (P[k].kind == K_NONE) continue; + int v = mach_get(a, &P[k]), cx = 30 + k * 60; + dial(g, cx, cy, r, v - P[k].lo, P[k].max - P[k].lo, bm_knob_color(k), T(P[k].name)); + if (gfx_strip_hit(g, vy - 1, 9)) { + mach_fmt(&P[k], v, b, sizeof b); + gfx_text_c(g, cx, vy, b, C_ORANGE, 1); + } + } + panel_picture(g, a, 128, 64); } -/* GLO > SONG: cada entrada = un patrón y, si tiene, la escena que lanza. W1-10 agregan, B7-10 ponen la - * escena en la elegida, B11 la borra; HOME + REC graba los cambios de patrón y de escena. */ -static void draw_song(bm_gfx *g, const bm_app *a) +static void draw_bx7(bm_gfx *g, const bm_app *a) { - char b[24]; - if (gfx_strip_hit(g, PY + 1, 9)) { - gfx_small(g, 4, PY + 2, a->song_rec ? "SONG REC" : "K4 = SONG ON/OFF", a->song_rec ? C_RED : C_DGREY); - gfx_small(g, 236 - gfx_small_w(a->ctx.st.song_on ? "SONG ON" : "SONG OFF"), PY + 2, a->ctx.st.song_on ? "SONG ON" : "SONG OFF", - a->ctx.st.song_on ? C_ORANGE : C_GREY); - } - if (!a->song.n) { - if (gfx_strip_hit(g, 60, 50)) { - gfx_text_c(g, 120, 62, "EMPTY", C_GREY, 2); - gfx_text_c(g, 120, 86, "W1-10 = ADD A PATTERN", C_GREY, 1); - gfx_text_c(g, 120, 98, "OR HOME + REC: SONG REC", C_GREY, 1); + int t = a->track; + const bm_bx7ui *u = &a->bx; + uint16_t col = bm_track_color(t); + char b[30]; + switch (u->page) { + case BXP_SEQ: /* el piano: el canal entero, como SLOOP */ + draw_seq_roll(g, a, t, 39, VB, false, mach_roll_page(a, t)); + return; + case BXP_ENV: { + const bm_track *tr = &a->pat.trk[t]; + float tm[4] = {0.05f + (float)tr->attack / 127.0f, 0.25f + (float)(tr->macro[2]) / 127.0f * 0.6f, 0.6f, + 0.15f + (float)(tr->macro[3]) / 127.0f * 0.6f}; + float sus = 0.25f + 0.6f * (float)tr->sustain / 127.0f; + float lv[4] = {1.0f, sus, sus, 0.0f}; + env_shape(g, 4, 40, 232, 88, tm, lv, 0.0f, col); + return; + } + case BXP_LFO: { + if (!gfx_strip_hit(g, 40, 89)) return; + int wave = a->pat.fmv[142] % 6, sp = a->pat.fmv[137]; + gfx_rect(g, 4, 40, 232, 88, C_DDGREY); + gfx_hline(g, 6, 84, 228, C_DDGREY); + int cyc = 1 + sp / 25, py = 84; + uint32_t r = 12345u; + for (int x = 0; x < 228; x++) { + float ph = (float)(x * cyc % 228) / 228.0f, v; + switch (wave) { + case 0: v = ph < 0.5f ? 4.0f * ph - 1.0f : 3.0f - 4.0f * ph; break; + case 1: v = 1.0f - 2.0f * ph; break; + case 2: v = 2.0f * ph - 1.0f; break; + case 3: v = ph < 0.5f ? 1.0f : -1.0f; break; + case 4: v = sinf(ph * 6.2831853f); break; + default: if (x * cyc % 228 < cyc) r = r * 1103515245u + 12345u; v = (float)((r >> 16) & 255) / 127.5f - 1.0f; break; + } + int y = 84 - (int)(v * 38.0f); + if (x) gfx_line(g, 5 + x, py, 6 + x, y, col); + py = y; + } + return; + } + case BXP_FX: { /* las seis casillas en el orden de la cadena */ + for (int i = 0; i < BXF_N; i++) { + int x = 4 + (i % 3) * 78, y = 40 + (i / 3) * 44; + if (!gfx_strip_hit(g, y, 40)) continue; + int f = a->pat.prm[t][BX_ORD0 + i] % BXF_N; + bool on = (a->pat.prm[t][BX_FXON] >> f) & 1, sel = i == u->fxpos; + if (on) gfx_fill(g, x, y, 74, 38, dim(col)); + gfx_rect(g, x, y, 74, 38, sel ? (u->grab ? C_YELLOW : C_WHITE) : C_DGREY); + if (sel) gfx_rect(g, x + 1, y + 1, 72, 36, u->grab ? C_YELLOW : C_WHITE); + snprintf(b, sizeof b, "%d", i + 1); + gfx_small(g, x + 4, y + 4, b, C_GREY); + gfx_text_c(g, x + 37, y + 14, T(bx7_fx_names[f]), on ? C_WHITE : C_GREY, 1); + gfx_small(g, x + 37 - gfx_small_w(on ? "ON" : "OFF") / 2, y + 28, on ? "ON" : "OFF", on ? C_ORANGE : C_DGREY); } return; } - int first = a->song_cur > 6 ? a->song_cur - 6 : 0; - for (int i = 0; i < 7 && first + i < a->song.n; i++) { - int e = first + i, y = PY + 10 + i * 12; - if (!gfx_strip_hit(g, y, 12)) continue; - uint8_t p = a->song.pat[e]; - int sc = bm_song_scene(p); - if (sc >= 0) snprintf(b, sizeof b, TF("%2d A%02d +%c x%d"), e + 1, bm_song_pat(p) + 1, 'A' + sc, a->song.rep[e]); - else snprintf(b, sizeof b, "%2d A%02d x%d", e + 1, bm_song_pat(p) + 1, a->song.rep[e]); - row(g, y, e == a->song_cur, b, (a->ctx.st.song_on && a->ctx.st.playing && e == a->ctx.st.song_pos) ? ">" : NULL); + case BXP_EDIT: + if (u->edit == BXE_PIT) { /* el pitch EG: 4 tiempos y 4 niveles */ + const uint8_t *v = a->pat.fmv + 126; + float tm[4], lv[4]; + for (int i = 0; i < 4; i++) { tm[i] = 0.1f + (float)(99 - v[i]) / 99.0f; lv[i] = (float)v[4 + i] / 99.0f; } + env_shape(g, 4, 40, 232, 80, tm, lv, (float)v[7] / 99.0f, C_ORANGE); + } else draw_fm(g, a, t, 2, 38, 236, 84, u->edit <= BXE_OP6 ? u->edit : -1); + return; + case BXP_GLO: case BXP_ARP: + mach_list(g, a, 40, 38); + return; + default: /* MAIN: el algoritmo */ + draw_fm(g, a, t, 2, 38, 236, 94, -1); + return; } } -static void draw_time(bm_gfx *g, const bm_app *a) -{ - const bm_status *st = &a->ctx.st; - header(g, "TIME", "POLYMETER", C_WHITE); - for (int t = 0; t < BM_TRACKS; t++) { - int y = 47 + t * 14; - if (!gfx_strip_hit(g, y, 14)) continue; - const bm_track *tr = &a->pat.trk[t]; - bool sel = t == a->time_row; - if (sel) gfx_fill(g, 0, y - 1, 240, 14, C_DDGREY); - char b[16]; - snprintf(b, sizeof b, "T%d", t + 1); - gfx_text(g, 4, y + 3, b, bm_track_color(t), 1); - int tps = bm_speed_tps[tr->speed % SPD_COUNT]; - int len = bm_trk_len(&a->pat, t, bm_is_grid(&a->pat, t) ? (sel ? a->time_lane : 0) : -1); - int w = len * tps * 48 / BM_BAR_TICKS; - if (w > 160) w = 160; - if (w < len) w = len; - int cur = st->playing ? (int)(st->tn[t] % (uint32_t)len) : -1; - for (int s = 0; s < len; s++) { - int x0 = 22 + s * w / len, x1 = 22 + (s + 1) * w / len; - gfx_fill(g, x0, y + 2, x1 - x0 - (x1 - x0 > 2 ? 1 : 0), 9, s == cur ? C_WHITE : (s % 4 == 0 ? bm_track_color(t) : dim(bm_track_color(t)))); +/* ------------------------------------------------------------ el Slicer (V_MACH): TRIM, SOUND, ENV, FX, GLO */ +/* La onda de una toma en columnas (pico y RMS, 0..255) de la muestra v0 a la v1, como en un sampler: + * se calcula solo cuando cambia lo que se ve (la toma se lee directo de la flash) */ +#define WV_W 232 +typedef struct { const int8_t *d; uint32_t v0, v1; uint8_t rev, pk[WV_W], rms[WV_W]; } wave_cols; + +static void wave_fill(wave_cols *w, const bm_smp_src *m, uint32_t v0, uint32_t v1, bool rev) +{ + if (v1 > m->len) v1 = m->len; + if (w->d == m->data && w->v0 == v0 && w->v1 == v1 && w->rev == rev) return; + w->d = m->data; w->v0 = v0; w->v1 = v1; w->rev = rev; + uint32_t span = v1 > v0 ? v1 - v0 : 1, top = 16; + static uint8_t pk[WV_W]; static uint32_t sq[WV_W]; + for (int c = 0; c < WV_W; c++) { + uint32_t a0 = v0 + (uint32_t)((uint64_t)span * (uint32_t)c / WV_W), a1 = v0 + (uint32_t)((uint64_t)span * (uint32_t)(c + 1) / WV_W); + if (a1 <= a0) a1 = a0 + 1; + uint32_t p = 0, s = 0, n = 0; + for (uint32_t i = a0; i < a1 && i < v1; i += (a1 - a0) > 64 ? (a1 - a0) / 64 : 1, n++) { /* hasta 64 muestras por columna */ + int x = m->data[i], ax = x < 0 ? -x : x; + if ((uint32_t)ax > p) p = (uint32_t)ax; + s += (uint32_t)(x * x); } - for (int bar = 1; bar * 48 < 160; bar++) gfx_vline(g, 22 + bar * 48, y, 12, C_GREY); - snprintf(b, sizeof b, "%d %s", len, bm_speed_names[tr->speed % SPD_COUNT]); - gfx_text_r(g, 236, y + 3, b, sel ? C_WHITE : C_GREY, 1); + pk[c] = (uint8_t)(p > 127 ? 127 : p); + sq[c] = n ? s / n : 0; + if (p > top) top = p; + } + for (int c = 0; c < WV_W; c++) { + int o = rev ? WV_W - 1 - c : c, r = 0; + while ((uint32_t)((r + 1) * (r + 1)) <= sq[c]) r++; /* raíz entera */ + w->pk[o] = (uint8_t)(pk[c] * 255u / top); + w->rms[o] = (uint8_t)bm_clampi(r * 255 / (int)top, 0, 255); } - if (bm_is_grid(&a->pat, a->time_row)) { - char b[24]; - snprintf(b, sizeof b, "K3 INSTR: %s", T(bm_lane_name(a, a->time_row, a->time_lane))); - hint_s(g, 130, b); - } else hint_s(g, 130, "LINES = 1 BAR"); } -static void draw_copych(bm_gfx *g, const bm_app *a) +/* la onda espejada: el pico en el tono oscuro y el RMS encima; las columnas [hl0, hl1) en hcol */ +static void wave_draw(bm_gfx *g, const wave_cols *w, int y, int h, int hl0, int hl1, uint16_t col, uint16_t hcol) { - char b[30]; - header(g, "COPY TRACK", "HOME + EDIT", C_WHITE); - int s = a->copy_src, d = a->copy_dst % BM_TRACKS; - if (gfx_strip_hit(g, 52, 52)) { - gfx_fill(g, 10, 54, 90, 46, bm_track_color(s)); - snprintf(b, sizeof b, "T%d", s + 1); - gfx_text_c(g, 55, 60, b, C_BLACK, 3); - gfx_text_c(g, 55, 88, bm_track_name(a, s), C_BLACK, 1); - gfx_text_c(g, 120, 70, ">", C_WHITE, 3); - gfx_fill(g, 140, 54, 90, 46, bm_track_color(d)); - snprintf(b, sizeof b, "T%d", d + 1); - gfx_text_c(g, 185, 60, b, C_BLACK, 3); - gfx_text_c(g, 185, 88, bm_track_name(a, d), C_BLACK, 1); - } - note_s(g, 110, "ALGORITHM PICKS THE TARGET - HOLD EDIT 2 S = PASTE"); - hint_s(g, 120, "NOTES TO NOTES, HITS TO HITS: THE MACHINES DO NOT CHANGE"); + if (!gfx_strip_hit(g, y, h)) return; + int mid = y + h / 2, half = h / 2 - 1; + for (int c = 0; c < WV_W; c++) { + bool hi = c >= hl0 && c < hl1; + uint16_t k = hi ? hcol : col; + int p = w->pk[c] * half / 255, r = w->rms[c] * half / 255; + if (p > 0) gfx_vline(g, 4 + c, mid - p, 2 * p + 1, dim(k)); + if (r > 0) gfx_vline(g, 4 + c, mid - r, 2 * r + 1, k); + else gfx_vline(g, 4 + c, mid, 1, dim(k)); + } } -/* ------------------------------------------------------------ capas: lo que hace cada tecla */ -/* La franja del teclado ya muestra cada tecla con su luz; el visor dice qué capa es y cómo se usa. */ -static void draw_layer(bm_gfx *g, const bm_app *a) +static wave_cols w_ov, w_main; + +/* una fila de perillas dibujadas (las únicas de la pantalla): dial, nombre y valor en su color */ +static void slicer_knob_row(bm_gfx *g, const bm_app *a, const bxp *P, int cy, int r) { - static char title[24]; /* el mapa de la capa: una vez por cuadro */ - static uint16_t col; - static const char *h1, *h2; - static uint32_t mf; - if (mf != g->frame) { - bm_keyfn K[BM_KEYS]; /* aquí solo hace falta el título y las ayudas */ - mf = g->frame; - bm_app_keymap(a, K, title, sizeof title, &col, &h1, &h2); - } - if (gfx_strip_hit(g, 26, 20)) { - gfx_fill(g, 0, 26, BM_LCD_W, 18, col); - gfx_text(g, 6, 28, title, C_BLACK, 2); - char b[24]; - if (a->layer == L_ROLL) { /* la velocidad y la rampa, siempre a la vista */ - const char *rp = a->roll_ramp == 1 ? T("CRESC") : a->roll_ramp == 2 ? T("DECRESC") : ""; - snprintf(b, sizeof b, "%s %s", bm_roll_names[a->roll_rate % BM_ROLL_RATES], rp); - gfx_text(g, 8 + gfx_text_w(title, 2), 32, b, C_BLACK, 1); - } - if (a->layer == L_HOME || a->view == V_HOME) snprintf(b, sizeof b, "A%02d", a->ctx.st.pattern + 1); - else snprintf(b, sizeof b, "T%d", a->track + 1); - if (a->layer_latch) { /* abierta con un toque: queda hasta cerrarla */ - gfx_small(g, 236 - gfx_small_w("LATCHED"), 28, "LATCHED", C_BLACK); - gfx_small(g, 236 - gfx_small_w(b), 36, b, C_BLACK); - } else gfx_text_r(g, 234, 32, b, C_BLACK, 1); - } - /* Lo que la capa toca, no una copia de la franja de teclas: los instrumentos de la batería - * (mute en rojo, destello al sonar) o los seis canales. Si no, solo cómo se usa. */ - int t = a->track, hy = 52; - bool lanes = app_kind(a, t) == KIND_TR && (a->layer == L_LANEMUTE || a->layer == L_FILL || a->layer == L_ERASE || a->layer == L_ROLL); - if (lanes) { lane_pads(g, a, t, 47, 14); hy = 106; } - else if (a->layer == L_HOME || a->layer == L_PUNCH || a->layer == L_COPY) { - for (int i = 0; i < BM_TRACKS; i++) { - int x = 2 + (i % 3) * 79, y = 48 + (i / 3) * 18; - if (!gfx_strip_hit(g, y, 16)) continue; - bool mu = a->pat.trk[i].mute, fl = !mu && a->now < a->trig_until[i], dn = a->keys_down[bm_black_key(i)]; - uint16_t tc = bm_track_color(i); - gfx_fill(g, x, y, 76, 16, fl || dn ? tc : C_DDGREY); - if (a->solo_on && a->solo_track == i) gfx_rect(g, x, y, 76, 16, C_WHITE); - char b[8]; snprintf(b, sizeof b, "%d", i + 1); - uint16_t fg = fl || dn ? C_BLACK : (mu ? C_GREY : tc); - gfx_small(g, x + 3, y + 6, b, fl || dn ? C_BLACK : C_GREY); - gfx_text(g, x + 11, y + 5, bm_track_name(a, i), fg, 1); - if (mu) gfx_text(g, x + 66, y + 5, "M", C_RED, 1); + char b[12]; + for (int k = 0; k < 4; k++) { + if (!slicer_live(a, &P[k])) continue; /* sin función ahora: nada */ + int v = slicer_get(a, &P[k]), cx = 30 + k * 60; + dial(g, cx, cy, r, slicer_pct(a, &P[k], v), 255, bm_knob_color(k), T(P[k].name)); + int vy = cy + r + (strchr(P[k].name, ' ') ? 23 : 14); + if (gfx_strip_hit(g, vy - 1, 9)) { + slicer_fmt(a, &P[k], v, b, sizeof b); + gfx_text_c(g, cx, vy, b, C_ORANGE, 1); } - hy = 88; } - /* cómo se usa (se va a los 4 s) y cómo se sale (queda) */ - hint_s(g, hy, h1); - note_s(g, hy + 10, h2); - if (a->layer == L_HOME) hint_s(g, hy + 20, "W11-16 = GO THERE ON RELEASE - ALG = BPM .1"); } -/* ------------------------------------------------------------ recuadro, pregunta, overlay, toast */ -/* ALGORITHM en INSTR (batería): el instrumento al que vas */ -static void draw_box(bm_gfx *g, const bm_app *a) +/* TRIM: arriba la toma entera (los pads, la ventana); en el medio la ventana grande con el pad entre + * corchetes; abajo las cuatro perillas */ +static void slicer_trim(bm_gfx *g, const bm_app *a) { - int t = a->track; - if (!gfx_strip_hit(g, 50, 70)) return; - gfx_fill(g, 40, 50, 160, 68, C_BLACK); - gfx_rect(g, 40, 50, 160, 68, bm_track_color(t)); - gfx_rect(g, 41, 51, 158, 66, bm_track_color(t)); - char b[24]; - snprintf(b, sizeof b, "%d", a->box_lane + 1); - gfx_text_c(g, 120, 58, b, bm_track_color(t), 4); - const bm_lane *ln = &bm_trk_trc(&a->pat, t)->lane[a->box_lane & 15]; - snprintf(b, sizeof b, "%s - %s", T(bm_lane_name(a, t, a->box_lane)), T(bm_drm_short[ln->model % DRM_COUNT])); - gfx_text_c(g, 120, 92, b, C_WHITE, 1); - int left = (int)(a->box_until - a->now); - int w = bm_clampi(left * 140 / 400, 0, 140); - gfx_fill(g, 50, 108, 140, 3, C_DGREY); - gfx_fill(g, 50, 108, 140 - w, 3, bm_track_color(t)); + int sel = a->sel_lane[1] & 15; + const bm_pad *p = &a->pat.pad[sel]; + const bm_status *st = &a->ctx.st; + uint16_t col = bm_track_color(1); + bm_smp_src m; + char b[8]; + if (!slicer_take(a, sel, &m)) { + if (gfx_strip_hit(g, 80, 30)) { + snprintf(b, sizeof b, "P%d", sel + 1); + gfx_text_c(g, 120, 80, b, col, 2); + gfx_text_c(g, 120, 100, T("EMPTY"), C_GREY, 1); + } + slicer_knob_row(g, a, slicer_knobs(a), 152, 10); + return; + } + uint32_t v0, v1; + slicer_view(a, &v0, &v1); + uint32_t span = v1 > v0 ? v1 - v0 : 1, a0 = p->start, a1 = (uint32_t)p->start + p->len; + if (gfx_strip_hit(g, 38, 10)) { /* la toma entera */ + wave_fill(&w_ov, &m, 0, m.len, false); + int s0 = (int)((uint64_t)a0 * WV_W / m.len), s1 = (int)((uint64_t)a1 * WV_W / m.len); + wave_draw(g, &w_ov, 38, 10, s0, s1 > s0 ? s1 : s0 + 1, C_DGREY, col); + int x0 = 4 + (int)((uint64_t)v0 * WV_W / m.len), x1 = 4 + (int)((uint64_t)v1 * WV_W / m.len); + if (v1 - v0 < m.len) gfx_rect(g, x0, 38, x1 - x0 > 2 ? x1 - x0 : 2, 10, C_WHITE); /* la ventana de abajo */ + } + int wy = 52, wh = 84; +#define VX(q) (4 + (int)(((int64_t)(q) - (int64_t)v0) * WV_W / (int64_t)span)) + if (gfx_strip_hit(g, wy, wh + 1)) { + wave_fill(&w_main, &m, v0, v1, false); + int bx0 = bm_clampi(VX(a0), 4, 236), bx1 = bm_clampi(VX(a1), 4, 236); + if (bx1 > bx0) gfx_fill(g, bx0, wy, bx1 - bx0, wh, C_DDGREY); + gfx_hline(g, 4, wy + wh / 2, WV_W, C_DDGREY); + wave_draw(g, &w_main, wy, wh, bx0 - 4, bx1 - 4, C_DGREY, col); + for (int i = 0; i < BM_LANES; i++) { /* los otros pads de esta toma: dónde empiezan */ + const bm_pad *o = &a->pat.pad[i]; + if (i == sel || !bm_pad_ok(o) || o->src != p->src || o->start < v0 || o->start >= v1) continue; + int x = VX(o->start); + gfx_vline(g, x, wy, wh, C_GREY); + snprintf(b, sizeof b, "%d", i + 1); + gfx_small(g, x + 2, wy + wh - 7, b, C_GREY); + } + if (p->mode == PAD_LOOP && bm_pad_has_loop(p)) { /* el loop de sustain */ + int lx0 = bm_clampi(VX(a0 + bm_pad_loop_start(p)), 4, 236), lx1 = bm_clampi(VX(a0 + bm_pad_loop_end(p)), 4, 236); + gfx_fill(g, lx0, wy + wh - 3, lx1 - lx0 > 1 ? lx1 - lx0 : 1, 3, C_GREEN); + } + if (a0 >= v0 && a0 < v1) { /* el pad: corchetes y su número */ + int x = VX(a0); + gfx_vline(g, x, wy, wh, C_CYAN); gfx_hline(g, x, wy, 5, C_CYAN); gfx_hline(g, x, wy + wh - 1, 5, C_CYAN); + gfx_fill(g, x, wy + 2, 13, 9, C_CYAN); + snprintf(b, sizeof b, "%d", sel + 1); + gfx_text(g, x + 1, wy + 3, b, C_BLACK, 1); + } + if (a1 > v0 && a1 <= v1) { + int x = VX(a1) - 1; + gfx_vline(g, x, wy, wh, C_CYAN); gfx_hline(g, x - 4, wy, 5, C_CYAN); gfx_hline(g, x - 4, wy + wh - 1, 5, C_CYAN); + } + if (st->smp_pos_src == p->src && st->smp_pos >= v0 && st->smp_pos < v1) gfx_vline(g, VX(st->smp_pos), wy, wh, C_ORANGE); /* lo que suena */ + } +#undef VX + slicer_knob_row(g, a, slicer_knobs(a), 152, 10); } -/* La pregunta (0.9): se acepta con el tiempo. Sostener 2 s el control que preguntó llena la barra; - * soltarlo antes, u otro control, es no. */ -static void draw_ask(bm_gfx *g, const bm_app *a) +/* el pad entero (su tramo de la toma), al derecho o al revés como suena */ +static void slicer_pad_wave(bm_gfx *g, const bm_app *a, int y, int h, uint16_t c) { - if (!gfx_strip_hit(g, 46, 80)) return; - gfx_fill(g, 10, 46, 220, 78, C_DDGREY); - gfx_rect(g, 10, 46, 220, 78, C_YELLOW); - gfx_rect(g, 11, 47, 218, 76, C_YELLOW); - gfx_text_c(g, 120, 54, a->ask_text[0], C_WHITE, 1); - gfx_text_c(g, 120, 66, a->ask_text[1], C_GREY, 1); - char b[40]; - bm_app_ask_hint(a, b, sizeof b); - gfx_text_c(g, 120, 82, b, C_YELLOW, 1); - int p = bm_app_ask_progress(a); - gfx_fill(g, 24, 95, 192, 8, C_BLACK); - gfx_fill(g, 24, 95, p * 192 / 255, 8, C_YELLOW); - gfx_rect(g, 23, 94, 194, 10, C_GREY); - if (a->ask_ctl != ASK_ENC) - gfx_small(g, 120 - gfx_small_w(a->ask_live ? "RELEASE = NO" : "ANY OTHER CONTROL = NO") / 2, 110, - a->ask_live ? "RELEASE = NO" : "ANY OTHER CONTROL = NO", C_GREY); + int sel = a->sel_lane[1] & 15; + const bm_pad *p = &a->pat.pad[sel]; + bm_smp_src m; + if (!gfx_strip_hit(g, y, h + 1) || !slicer_take(a, sel, &m)) return; + gfx_rect(g, 2, y, 236, h, C_DDGREY); + wave_fill(&w_main, &m, p->start, (uint32_t)p->start + p->len, (p->flags & PAD_REV) != 0); + wave_draw(g, &w_main, y + 1, h - 2, 0, WV_W, C_DGREY, c); } -/* K1-K4: una línea con el nombre y el valor en la fila de arriba (pestañas o título), sin tapar la - * rejilla ni el paso sostenido; el dial de abajo ya marca cuál giró. */ -static void draw_overlay_line(bm_gfx *g, const bm_app *a) +static void draw_slicer(bm_gfx *g, const bm_app *a) { - const bm_overlay *o = &a->ov; - bool tall = (a->layer && a->layer != L_CHORDS) || a->view == V_SAVE || a->view == V_TIME || a->view == V_COPYCH; - int h = tall ? 21 : 11; /* también tapa el título grande de esas pantallas */ - if (!gfx_strip_hit(g, 24, h)) return; - gfx_fill(g, 0, 24, BM_LCD_W, h, C_BLACK); - int y = 24 + (h - 7) / 2; - gfx_text(g, 4, y, o->title, o->color, 1); - int x = 236; - if (o->unit[0]) x -= gfx_text_r(g, x, y, o->unit, C_GREY, 1) + 4; - gfx_text_r(g, x, y, o->val, C_WHITE, 1); - gfx_fill(g, 0, 24 + h - 1, BM_LCD_W, 1, C_DDGREY); - gfx_fill(g, 0, 24 + h - 1, o->pct * BM_LCD_W / 255, 1, o->color); + uint16_t col = bm_track_color(1); + switch (a->bx.page) { + case BXP_ENV: { /* la envolvente sobre el pad, y su loop */ + int sel = a->sel_lane[1] & 15, y = 40, h = 88; + const bm_pad *p = &a->pat.pad[sel]; + slicer_pad_wave(g, a, y, h, dim(col)); + if (!bm_pad_ok(p) || !gfx_strip_hit(g, y, h + 1)) return; + uint32_t len = p->len ? p->len : 1; + int ax = 4 + (int)bm_clampi((int)((uint64_t)bm_attack_ms(p->attack) * BM_SMP_RATE / 1000u * WV_W / len), 0, WV_W); + int top = y + 6, bot = y + h - 3, end = 4 + WV_W - 1; + int rx = end - bm_clampi(p->release * 40 / 127, 2, 40); /* el final se apaga con RELEASE */ + gfx_line(g, 4, bot, ax, top, col); + gfx_line(g, ax, top, rx, top, col); + gfx_line(g, rx, top, end, bot, col); + if (p->mode == PAD_LOOP) { + uint32_t ls = bm_pad_loop_start(p), le = bm_pad_loop_end(p); + int lx0 = 4 + (int)((uint64_t)ls * WV_W / len), lx1 = 4 + (int)((uint64_t)le * WV_W / len); + gfx_fill(g, lx0, bot - 2, lx1 - lx0 > 1 ? lx1 - lx0 : 1, 3, C_GREEN); + gfx_vline(g, lx0, y + 1, h - 2, C_GREEN); gfx_vline(g, lx1 - 1, y + 1, h - 2, C_GREEN); + } + return; + } + case BXP_FX: px_fx_boxes(g, a, slicer_sub(a)); return; + case BXP_GLO: mach_list(g, a, 40, 38); return; + default: break; + } + if (slicer_sub(a) == 0) { slicer_trim(g, a); return; } + slicer_knob_row(g, a, slicer_knobs(a), 66, 18); /* SOUND: las cuatro perillas y el pad como suena */ + slicer_pad_wave(g, a, 128, 64, col); } -static void draw_overlay(bm_gfx *g, const bm_app *a) +/* V_MACH: la máquina del canal; arriba su página y lo que pasa (REC, armado, ACCENT o el sonido) */ +static void draw_mach(bm_gfx *g, const bm_app *a) { - const bm_overlay *o = &a->ov; - if (o->knob >= ENC_K1 + 1 && o->knob <= ENC_K4 + 1 && !o->beat) { draw_overlay_line(g, a); return; } - if (!gfx_strip_hit(g, 46, 84)) return; - gfx_fill(g, 12, 46, 216, 84, C_BLACK); - gfx_rect(g, 12, 46, 216, 84, o->color); - gfx_rect(g, 13, 47, 214, 82, o->color); - grid(g, 16, 50, 208, 76, 6); - gfx_text(g, 20, 52, o->title, C_GREY, 1); - if (o->knob) { /* la perilla grande que se giró, en la esquina */ - static const char *const KN[ENC_COUNT] = {"SELECT", "ALGORITHM", "K1", "K2", "K3", "K4", "PRESETS"}; - gfx_small(g, 222 - gfx_small_w(KN[(o->knob - 1) % ENC_COUNT]), 53, KN[(o->knob - 1) % ENC_COUNT], o->color); - } - int w = gfx_text(g, 20, 68, o->val, C_WHITE, gfx_text_w(o->val, 3) > 196 ? 2 : 3); - if (o->unit[0]) gfx_text(g, 26 + w, 78, o->unit, C_GREY, 2); - if (o->beat) { /* el beat, en el color del tempo */ - const bm_status *st = &a->ctx.st; - int cur = st->playing ? (int)((st->btick / BM_PPQN) % 4) : -1; - for (int i = 0; i < 4; i++) gfx_fill(g, 20 + i * 51, 108, 47, 12, i == cur ? o->color : dim(dim(o->color))); - return; + int t = a->track, eng = a->pat.trk[t].engine; + uint16_t col = bm_track_color(t); + char b[30], ti[24]; + if (gfx_strip_hit(g, 25, 11)) { + mach_title(a, ti, sizeof ti); + int w = gfx_small_w(ti) + 6; + gfx_fill(g, 2, 25, w, 9, col); + gfx_small(g, 5, 27, ti, C_BLACK); + int L = mach_len(a); + uint16_t bc = a->rec || a->bx.armed ? C_RED : C_WHITE; + if (eng == ENG_BREAK) { /* el Slicer: SAMPLE, REC o el pad y su toma */ + slicer_status(a, b, sizeof b, &bc); + if (a->rec && bc == C_WHITE) { snprintf(b, sizeof b, "%s", T("REC")); bc = C_RED; } + } + else if (mach_step_mode(a)) snprintf(b, sizeof b, TF("STEP REC %d/%d"), a->bx.step % L + 1, L); + else if (a->rec) snprintf(b, sizeof b, "%s", T("REC")); + else if (a->bx.armed) snprintf(b, sizeof b, "%s", T("ARMED")); + else if (a->bx.page == BXP_SEQ && L > 16) snprintf(b, sizeof b, TF("PAGE %d/%d"), mach_roll_page(a, t) + 1, (L + 15) / 16); + else snprintf(b, sizeof b, "%s", bm_sound_name(a, t)); + gfx_small(g, 236 - gfx_small_w(b), 27, b, bc); } - gfx_fill(g, 20, 110, 200, 8, C_DGREY); - gfx_fill(g, 20, 110, o->pct * 200 / 255, 8, o->color); - if (o->ghost != 255) gfx_fill(g, 19 + o->ghost * 200 / 255, 106, 2, 16, C_WHITE); + if (eng == ENG_FM) draw_bx7(g, a); + else if (eng == ENG_ACID) draw_b303(g, a); + else if (eng == ENG_BREAK) draw_slicer(g, a); + else draw_panel(g, a); /* B-MINI, BUNO-6, BITTAL */ } -static void draw_toast(bm_gfx *g, const bm_app *a) +/* ------------------------------------------------------------ entrada */ +/* ¿la pantalla ya muestra K1-K4 (un panel con sus perillas o la lista de las cuatro)? Entonces no va + * la franja de abajo (cada perilla, una sola vez) y el visor llega hasta el teclado. */ +static bool knobs_in_view(const bm_app *a) { - if (!gfx_strip_hit(g, 118, 16)) return; - gfx_fill(g, 0, 118, BM_LCD_W, 16, C_DGREY); - gfx_hline(g, 0, 118, BM_LCD_W, C_CYAN); - gfx_text_c(g, 120, 122, a->toast, C_WHITE, 1); + if (a->layer || a->box_on) return false; + switch (a->view) { + case V_GLO: return a->glo_page != 0; + case V_MACH: return mach_knobs_shown(a); + default: return false; + } } -/* ------------------------------------------------------------ entrada */ static void draw_channel(bm_gfx *g, const bm_app *a) { PASO(8); - draw_tabs(g, a); - int t = a->track, kind = app_kind(a, t); - PASO(9); - switch (a->page) { - case PG_SEQ: - if (kind == KIND_TR) draw_seq_tr(g, a); - else if (bm_app_roll_view(a, t)) draw_seq_pianoroll(g, a); /* GLO > VIEW: PIANO ROLL */ - else draw_seq_syn(g, a); - break; - case PG_SOUND: PASO(11); draw_sound(g, a); break; - case PG_INST: draw_inst(g, a); break; - case PG_MIX: PASO(18); draw_ch_mix(g, a); break; - case PG_MORE: PASO(19); draw_more(g, a); break; - case PG_BREAK: PASO(16); draw_break(g, a); break; - case PG_TAKES: PASO(17); draw_takes(g, a); break; - case PG_ARP: draw_arp(g, a); break; - case PG_LOOP: draw_loop(g, a); break; - case PG_SCL: draw_scl(g, a, 0); break; - case PG_CHORDS: draw_chords(g, a, PY); break; - case PG_REC: draw_rec(g, a); break; - case PG_PADS: draw_pads(g, a); break; - default: break; - } + draw_seq_tr(g, a); } void bm_app_draw(bm_gfx *g, void *user) @@ -2380,37 +1821,31 @@ void bm_app_draw(bm_gfx *g, void *user) return; } PASO(1); - hints_update(a); draw_status(g, a); - gfx_clip(g, 0, BM_CTX_Y, BM_LCD_W, BM_CTX_H); + bool tall = knobs_in_view(a); + gfx_clip(g, 0, BM_CTX_Y, BM_LCD_W, tall ? BM_CTX_H_TALL : BM_CTX_H); PASO(2); - if (a->layer && a->layer != L_CHORDS) draw_layer(g, a); - else if (a->layer == L_CHORDS) { gfx_text(g, 4, 26, "LIVE CHORDS", C_GREEN, 1); draw_chords(g, a, 36); } + if (a->layer) draw_layer(g, a); else switch (a->view) { case V_HOME: PASO(3); draw_home(g, a); break; case V_CH: draw_channel(g, a); break; case V_GLO: draw_glo(g, a); break; case V_SYSTEM: draw_system(g, a); break; - case V_TIME: draw_time(g, a); break; case V_SAVE: draw_save(g, a); break; - case V_FXG: draw_fx(g, a); break; - case V_COPYCH: draw_copych(g, a); break; + case V_MACH: draw_mach(g, a); break; default: break; } PASO(24); - if (a->card && !a->layer && console_view(a)) draw_card(g, a); /* la tarjeta del canal, encima de la consola */ if (a->box_on) draw_box(g, a); PASO(25); if (a->ov.on) draw_overlay(g, a); - PASO(26); - if (a->ask) draw_ask(g, a); PASO(27); - if (a->toast_until && !a->ask) draw_toast(g, a); + if (a->toast_until) draw_toast(g, a); gfx_noclip(g); PASO(28); draw_keys(g, a); PASO(29); - draw_legend(g, a); + if (!tall) draw_legend(g, a); draw_bigknobs(g, a); PASO(0); if (a->now < a->clip_until) { diff --git a/core/bm_wave.cpp b/core/bm_wave.cpp index d3b713c..1a74258 100644 --- a/core/bm_wave.cpp +++ b/core/bm_wave.cpp @@ -109,7 +109,7 @@ struct Voice { float lph, lsh, ldel; /* LFO: fase, valor del azar, rampa del retardo (BUNO-6) */ float cut_prev, gate_g; uint32_t rng; - uint8_t first, gate; + uint8_t first, gate, tieg; /* tieg: B-MINI, la nota llegó ligada por un GLIDE de paso (SCL) */ uint8_t key[8]; float k[8]; }; @@ -121,8 +121,11 @@ inline bool mine(int v) { return bm_vpool_is(v, VP_WAVE) != 0; } /* BUNO-6, per channel: what acts on the sum of its voices (bm_wv_bus) — the HPF, and the VCF when * the paraphonic fast path is on */ -struct Bus { Ladder lad; float hp, cut_prev; uint8_t para; }; +struct Bus { Ladder lad; float hp, cut_prev, lph, ldel; uint8_t para; }; Bus bus_[BM_TRACKS]; +/* el LFO del canal en este bloque, por carril (el audio puede ir en los dos núcleos: un canal por carril) */ +float lfo_now_[2]; +int lane_now_; inline float rnd(uint32_t &s) { s = s * 1664525u + 1013904223u; return (float)(int32_t)s * (1.0f / 2147483648.0f); } inline float ka_of(float t) { return 1.0f - expf(-1.466f / (t * fs_ + 1.0f)); } @@ -169,6 +172,7 @@ inline float ladder_g(float semis) /* búfer de trabajo, uno por núcleo: con el audio en dos núcleos, T3 (B-MINI) calcula en uno y T5-T6 * (BITTAL, BUNO-6) en el otro al mismo tiempo */ float SB[2][BM_BLOCK]; +extern "C" { volatile float bm_wv_btpos[2]; volatile uint32_t bm_wv_btseq; } /* ------------------------------------------------------------ B-MINI */ float mini_osc(Osc &o, int w, float dt) @@ -186,21 +190,42 @@ float mini_osc(Osc &o, int w, float dt) return y; } -static const float RANGE[5] = {0.25f, 0.5f, 1.0f, 2.0f, 4.0f}; /* 32' 16' 8' 4' 2' */ +static const float RANGE[6] = {0.25f, 0.5f, 1.0f, 2.0f, 4.0f, 1.0f / 256.0f}; /* 32' 16' 8' 4' 2' y LO (8 octavas abajo) */ + +/* lo que vale el oscilador en su fase, sin antialias: el OSC 3 como modulador (una vez por bloque) */ +static float mini_mod_osc(const Osc &o, int w) +{ + switch (w) { + case MN_WAVE_TRI: return o.tri(); + case MN_WAVE_SHARK: return 0.5f * (o.tri() + 2.0f * o.ph - 1.0f); + case MN_WAVE_SQR: return o.ph < 0.5f ? 1.0f : -1.0f; + case MN_WAVE_WIDE: return o.ph < 0.3f ? 1.0f : -1.0f; + case MN_WAVE_NARROW: return o.ph < 0.12f ? 1.0f : -1.0f; + default: return 2.0f * o.ph - 1.0f; + } +} int render_mini(Voice &z, const uint8_t *prm, const uint8_t mac[4], float *out, int n, float *b1) { - glide(z, prm[MN_GLIDE], n); - float lamt = pc(prm[MN_LAMT]), lfo = 0.0f; - if (lamt > 0.0f) { z.lph += bm_lfo_hz(prm[MN_LRATE]) * (float)n / fs_; if (z.lph >= 1.0f) z.lph -= (float)(int)z.lph; lfo = 4.0f * fabsf(z.lph - 0.5f) - 1.0f; } + int gl = prm[MN_GLIDE]; + if (z.tieg && gl < 30) gl = 30; /* GLIDE de paso: se oye aunque la perilla esté en 0 */ + glide(z, gl, n); + /* la modulación, como en el POLY D: MOD MIX entre el OSC 3 y el LFO (el del canal, bm_wv_lfo), a los + * osciladores, al filtro o a los dos, con su cantidad */ + float lamt = pc(prm[MN_LAMT]), mod = 0.0f; + if (lamt > 0.0f) { + float s3 = pc(prm[MN_MIX]); + mod = (1.0f - s3) * lfo_now_[lane_now_] + (s3 > 0.0f ? s3 * mini_mod_osc(z.o[2], prm[MN_W3] % MN_WAVES) : 0.0f); + } int ld = prm[MN_LDEST] % MN_LDESTS; - float pitch = z.note + (ld == MN_D_PITCH ? lfo * lamt * lamt * 2.0f : 0.0f); - float f0 = hz_of(pitch) / fs_; - float tune = bip(prm[MN_TUNE]) * 1.0f; /* TUNE: ±1 semitono a 2 y 3 */ + bool to_osc = ld != MN_D_CUT, to_cut = ld != MN_D_PITCH; + /* TUNE: el A-440 del Minimoog, afina los tres osciladores juntos (±1 semitono) */ + float pitch = z.note + bip(prm[MN_TUNE]); + float f0 = hz_of(pitch) / fs_, vib = to_osc ? SemitonesToRatioSafe(mod * lamt * lamt * 2.0f) : 1.0f; float fr[3]; - fr[0] = f0 * RANGE[prm[MN_R1] % 5]; - fr[1] = f0 * RANGE[prm[MN_R2] % 5] * SemitonesToRatioSafe(bip(prm[MN_T2]) * 7.0f + tune); - fr[2] = f0 * RANGE[prm[MN_R3] % 5] * SemitonesToRatioSafe(bip(prm[MN_T3]) * 7.0f - tune * 0.5f); + fr[0] = f0 * vib * RANGE[prm[MN_R1] % 5]; + fr[1] = f0 * vib * RANGE[prm[MN_R2] % 5] * SemitonesToRatioSafe(bip(prm[MN_T2]) * 7.0f); + fr[2] = f0 * RANGE[prm[MN_R3] % 6] * SemitonesToRatioSafe(bip(prm[MN_T3]) * 7.0f); /* el que modula no se modula */ for (int i = 0; i < 3; i++) CONSTRAIN(fr[i], 0.00001f, 0.25f); /* las dos envolventes; la macro F DECAY (64 = nada) corre la caída de la de filtro */ @@ -225,7 +250,8 @@ int render_mini(Voice &z, const uint8_t *prm, const uint8_t mac[4], float *out, /* filtro: CUTOFF, EMPHASIS y CONTOUR (la cantidad de la envolvente de filtro) */ float cut = (float)mac[0] * (120.0f / 127.0f) + pc(mac[2]) * 72.0f * z.ef.v + pc(prm[MN_KEYT]) * (z.note - 60.0f) + pc(prm[MN_VELF]) * z.vel * 24.0f - + (ld == MN_D_CUT ? lfo * lamt * 36.0f : 0.0f); + + (to_cut ? mod * lamt * 36.0f : 0.0f) + + (z.vel > 0.99f ? 14.0f : 0.0f); /* ACCENT (SCL): más filtro */ if (z.first) { z.cut_prev = cut; z.first = 0; } float kres = pc(mac[1]) * 3.95f; float c0 = z.cut_prev, dc = (cut - c0) / (float)n; @@ -236,7 +262,7 @@ int render_mini(Voice &z, const uint8_t *prm, const uint8_t mac[4], float *out, for (int i = i0; i < i1; i++) b1[i] = z.lad.Process(b1[i], G, kres); } float fsus = pc(prm[MN_FS]), as = pc(prm[MN_AS]); - float velg = 1.0f - pc(prm[MN_VELA]) * (1.0f - z.vel); + float velg = (1.0f - pc(prm[MN_VELA]) * (1.0f - z.vel)) * (z.vel > 0.99f ? 1.3f : 1.0f); /* y más fuerte */ float ka = z.k[4], kd = z.k[5], kr = z.k[7]; for (int i = 0; i < n; i++) out[i] = b1[i] * z.ea.Next(ka, kd, as, kr) * velg * 1.2f; ka = z.k[0]; kd = z.k[1]; kr = z.k[3]; @@ -254,13 +280,8 @@ int render_mini(Voice &z, const uint8_t *prm, const uint8_t mac[4], float *out, int render_buno(Voice &z, const uint8_t *prm, const uint8_t mac[4], float *out, int n, float *b1, bool para) { - /* LFO triangular con retardo: la rampa sube después de la nota */ - z.lph += bm_lfo_hz(prm[BN_LRATE]) * (float)n / fs_; - if (z.lph >= 1.0f) z.lph -= (float)(int)z.lph; - float dl = bm_env_s(prm[BN_LDELAY]); - z.ldel += (float)n / (fs_ * (dl > 0.002f ? dl : 0.002f)); - if (z.ldel > 1.0f) z.ldel = 1.0f; - float lfo = (4.0f * fabsf(z.lph - 0.5f) - 1.0f) * (prm[BN_LDELAY] ? z.ldel : 1.0f); + /* el LFO del Juno: uno para todas las voces, con su retardo (bm_wv_lfo) */ + float lfo = lfo_now_[lane_now_]; static const uint8_t KI[8] = {BN_A, BN_D, 0xFF, BN_R, 0xFF, 0xFF, 0xFF, 0xFF}; static const float SC[8] = {1, 1, 1, 1, 1, 1, 1, 1}; @@ -302,7 +323,7 @@ int render_buno(Voice &z, const uint8_t *prm, const uint8_t mac[4], float *out, float G = ladder_g(c0 + dc * (float)((i0 + i1) / 2)); for (int i = i0; i < i1; i++) b1[i] = z.lad.Process(b1[i], G, kres); } - } else { z.first = 0; z.cut_prev = (float)mac[0] * (120.0f / 127.0f); } /* (where the VCF resumes) */ + } else { z.first = 0; z.cut_prev = (float)mac[0] * (120.0f / 127.0f); z.lad.Init(); } /* (where the VCF resumes, clean) */ /* VCA: con la envolvente o en GATE (con 2 ms de suavizado) */ float s = pc(prm[BN_S]); float velg = (1.0f - pc(prm[BN_VELA]) * (1.0f - z.vel)) * 1.3f; @@ -403,6 +424,7 @@ inline void cap_readers(int &u1, int &u2, int budget) int render_bittal(Voice &z, const uint8_t *prm, const uint8_t mac[4], float *out, int n, float *b1, int readers) { + bm_wv_btseq++; glide(z, prm[BT_GLIDE], n); float lamt = pc(prm[BT_LAMT]) + 0.5f * bm_bt_macro(prm, mac, BTM_LFO), lfo = 0.0f; CONSTRAIN(lamt, 0.0f, 1.0f); @@ -437,6 +459,7 @@ int render_bittal(Voice &z, const uint8_t *prm, const uint8_t mac[4], float *out float det = (pc(prm[b + 5]) + 0.5f * dets) * 0.02f; if (det < 0.0f) det = 0.0f; wt_osc(z, o, o, f0 * SemitonesToRatioSafe(semi), pos, uni, det, lvl, b1, n); + bm_wv_btpos[o] = pos < 0.0f ? 0.0f : pos > 1.0f ? 1.0f : pos; /* (para la pantalla) */ } float drive = pc(prm[BT_DRIVE]) + bm_bt_macro(prm, mac, BTM_DRIVE); CONSTRAIN(drive, 0.0f, 1.0f); @@ -532,12 +555,16 @@ void bm_wv_start(int v, int eng, const uint8_t *prm, const uint8_t mac[4], float } Voice &z = V(v); (void)mac; - int gl = eng == ENG_MINI ? prm[MN_GLIDE] : eng == ENG_BITTAL ? prm[BT_GLIDE] : 0; + int tied = legato == 3; /* 3: ligada por el GLIDE del paso (B-MINI) */ + if (tied) legato = 1; + z.tieg = (uint8_t)(tied && eng == ENG_MINI); + int gl = eng == ENG_MINI ? (z.tieg ? 30 : prm[MN_GLIDE]) : eng == ENG_BITTAL ? prm[BT_GLIDE] : 0; bool alive = z.ea.st != ST_OFF && z.ea.st != ST_R; if (legato == 1 && alive) { z.target = note; if (!gl) z.note = note; z.vel = vel; z.gate = 1; return; } bool sounding = legato == 2 && z.ea.st != ST_OFF; + bool from = sounding || (legato == 2 && eng == ENG_MINI); z.target = note; - if (!sounding || !gl) z.note = note; + if (!from || !gl) z.note = note; z.vel = vel; if (!sounding) { z.f1.Init(); z.f2.Init(); z.lad.Init(); @@ -548,7 +575,7 @@ void bm_wv_start(int v, int eng, const uint8_t *prm, const uint8_t mac[4], float z.first = 1; } z.gate = 1; - z.lph = eng == ENG_BUNO ? z.lph : 0.0f; z.lsh = rnd(z.rng); z.ldel = 0.0f; + z.lph = 0.0f; z.lsh = rnd(z.rng); z.ldel = 0.0f; /* BITTAL: su LFO por voz, desde la nota */ z.ea.Gate(true); z.ef.Gate(true); } @@ -560,11 +587,35 @@ void bm_wv_release(int v) float bm_wv_level(int v) { return mine(v) ? V(v).ea.v : 0.0f; } +/* El LFO del canal (B-MINI y BUNO-6), una vez por bloque antes de las voces: corre libre, como el + * oscilador 3 del Minimoog y el LFO del Juno (uno para todas las voces). El retardo del Juno vuelve a + * empezar cuando se toca después de soltar todo (restart = 1). */ +void bm_wv_lfo(int t, int eng, const uint8_t *prm, int n, int lane, int restart) +{ + if (t < 0 || t >= BM_TRACKS) return; + Bus &b = bus_[t]; + int rate = eng == ENG_BUNO ? prm[BN_LRATE] : prm[MN_LRATE]; + b.lph += bm_lfo_hz(rate) * (float)n / fs_; + if (!(b.lph >= 0.0f && b.lph < 1e6f)) b.lph = 0.0f; + if (b.lph >= 1.0f) b.lph -= (float)(int)b.lph; + float v = 4.0f * fabsf(b.lph - 0.5f) - 1.0f; + if (eng == ENG_MINI && prm[MN_LWAVE]) v = b.lph < 0.5f ? 1.0f : -1.0f; /* B-MINI: TRI o SQUARE, como el POLY D */ + if (eng == ENG_BUNO && prm[BN_LDELAY]) { + if (restart) b.ldel = 0.0f; + float dl = bm_env_s(prm[BN_LDELAY]); + b.ldel += (float)n / (fs_ * (dl > 0.002f ? dl : 0.002f)); + if (b.ldel > 1.0f) b.ldel = 1.0f; + v *= b.ldel; + } + lfo_now_[lane & 1] = v; +} + int bm_wv_render(int v, int eng, const uint8_t *prm, const uint8_t mac[4], float *out, int n, int lane, int flags) { if (n <= 0) return 0; if (!mine(v)) { memset(out, 0, sizeof(float) * (size_t)n); return 0; } Voice &z = V(v); + lane_now_ = lane & 1; int alive = render(z, eng, prm, mac, out, n, lane, flags); /* Un NaN en un filtro o una envolvente se queda: la última muestra y los estados, una vez por * bloque. Si algo se rompió, la voz vuelve a cero, el bloque sale en silencio y se avisa (-1). */ diff --git a/core/bm_wave.h b/core/bm_wave.h index af402af..69a4287 100644 --- a/core/bm_wave.h +++ b/core/bm_wave.h @@ -18,9 +18,15 @@ extern "C" { void bm_wv_init(float fs); /* eng = ENG_MINI, ENG_BITTAL o ENG_BUNO. legato 0: voz nueva · 1: sigue y solo cambia de nota (glide) - * · 2: mono, redispara las envolventes desde la nota anterior. */ + * · 2: mono, redispara las envolventes desde la nota anterior · 3: como 1, ligada por el GLIDE de un + * paso (el B-MINI se desliza aunque su GLIDE esté en 0). */ void bm_wv_start(int v, int eng, const uint8_t *prm, const uint8_t mac[4], float note, float vel, int legato); void bm_wv_release(int v); +void bm_wv_lfo(int t, int eng, const uint8_t *prm, int n, int lane, int restart); /* el LFO del canal, antes de las voces */ +/* BITTAL: la posición en la tabla (0..1) de cada oscilador en el último bloque que sonó, para dibujarla; + * bm_wv_btseq cuenta los bloques (si no cambia, no está sonando) */ +extern volatile float bm_wv_btpos[2]; +extern volatile uint32_t bm_wv_btseq; /* lane: 0 o 1, el búfer de trabajo del núcleo que calcula (con el audio en dos núcleos). * flags: WV_PARA (BUNO-6: the voice skips its VCF, bm_wv_bus filters the sum) and, for BITTAL, the * table readers (unison voices of both oscillators) this voice may use, 0 = all. diff --git a/core/gen/bm_fm_rom.c b/core/gen/bm_fm_rom.c index 8dfcb5a..2d4461a 100644 --- a/core/gen/bm_fm_rom.c +++ b/core/gen/bm_fm_rom.c @@ -24,6 +24,17 @@ const uint8_t bm_fm_rom[BM_FM_PATCHES][156] = { {99,60,99,60,99,90,90,0,39,0,0,0,3,2,0,2,80,0,1,0,7,99,60,99,60,99,85,85,0,39,0,0,0,3,2,0,2,74,0,1,0,7,99,60,99,60,99,88,88,0,39,0,0,0,3,2,0,3,78,0,1,0,7,99,60,99,60,99,95,95,0,39,0,0,0,3,2,0,1,99,0,1,0,8,90,60,99,60,99,80,80,0,39,0,0,0,3,2,0,3,70,0,2,0,7,99,60,99,60,99,92,92,0,39,0,0,0,3,2,0,1,95,0,1,0,7,99,99,99,99,50,50,50,50,0,7,1,38,45,8,0,0,4,4,24,76,69,65,68,32,32,32,32,32,32,63}, /* LEAD */ {80,40,99,50,99,88,88,0,39,0,0,0,3,2,0,2,80,0,1,0,7,80,40,99,50,99,90,90,0,39,0,0,0,3,2,0,1,84,0,2,0,6,80,40,99,50,99,90,90,0,39,0,0,0,3,2,0,1,92,0,1,0,11,80,40,99,50,99,90,90,0,39,0,0,0,3,2,0,1,92,0,1,0,3,80,40,99,50,99,85,85,0,39,0,0,0,3,2,0,2,74,0,1,0,7,80,40,99,50,99,90,90,0,39,0,0,0,3,2,0,1,94,0,1,0,7,99,99,99,99,50,50,50,50,21,7,1,28,20,4,0,0,4,2,24,83,85,80,69,82,32,70,77,32,32,63}, /* SUPER FM */ {99,65,70,70,99,60,40,0,39,0,0,0,3,2,0,4,74,0,1,0,7,99,65,70,70,99,60,40,0,39,0,0,0,3,2,0,4,74,0,1,0,7,99,65,70,70,99,60,40,0,39,0,0,0,3,2,0,4,70,0,2,0,7,99,55,70,70,99,80,60,0,39,0,0,0,3,2,0,2,90,0,1,0,9,99,60,70,70,99,70,50,0,39,0,0,0,3,2,0,5,84,0,1,0,7,99,50,70,70,99,85,70,0,39,0,0,0,3,2,0,2,99,0,1,0,7,99,99,99,99,50,50,50,50,1,7,1,35,0,0,0,1,0,0,24,66,85,90,90,32,32,32,32,32,32,63}, /* BUZZ */ + {99,50,35,50,99,80,0,0,39,0,0,0,3,2,0,2,0,0,1,0,7,99,50,35,50,99,80,0,0,39,0,0,0,3,2,0,2,0,0,1,0,7,99,80,45,75,99,0,0,0,39,0,0,0,3,2,0,5,60,0,1,0,7,99,52,35,75,99,70,0,0,39,0,0,0,3,2,0,2,88,0,0,0,9,99,72,45,75,99,30,0,0,39,0,0,0,3,2,0,5,82,0,0,0,7,99,50,35,75,99,70,0,0,39,0,0,0,3,2,0,2,99,0,0,0,7,99,99,99,99,50,50,50,50,4,2,1,35,0,0,0,1,0,0,24,81,85,69,82,89,32,66,83,32,32,63}, /* QUERY BS */ + {75,45,30,70,99,80,82,0,39,0,0,0,3,2,0,4,86,0,1,0,7,75,45,30,70,99,78,80,0,39,0,0,0,3,2,0,4,74,0,1,0,9,75,45,30,70,99,80,82,0,39,0,0,0,3,2,0,4,88,0,1,0,12,80,70,99,70,99,92,96,0,39,0,0,0,3,2,0,2,97,0,1,0,10,75,45,30,70,99,80,82,0,39,0,0,0,3,2,0,4,88,0,1,0,4,80,70,99,70,99,92,96,0,39,0,0,0,3,2,0,2,99,0,1,0,6,99,99,99,99,50,50,50,50,12,4,1,35,0,0,0,1,0,0,24,81,85,69,82,89,66,82,83,32,32,63}, /* QUERYBRS */ + {99,50,35,50,99,80,0,0,39,0,0,0,3,2,0,2,0,0,1,0,7,99,50,35,50,99,80,0,0,39,0,0,0,3,2,0,2,0,0,1,0,7,99,90,50,72,99,0,0,0,39,0,0,0,3,2,0,7,74,0,3,0,7,99,48,30,72,99,75,0,0,39,0,0,0,3,2,0,3,92,0,0,0,10,99,78,45,72,99,30,0,0,39,0,0,0,3,2,0,7,90,0,0,0,7,99,45,30,72,99,75,0,0,39,0,0,0,3,2,0,3,99,0,0,0,7,99,99,99,99,50,50,50,50,4,3,1,35,0,0,0,1,0,0,24,83,75,69,84,67,72,66,83,32,32,63}, /* SKETCHBS */ + {99,50,35,50,99,80,0,0,39,0,0,0,3,2,0,2,0,0,1,0,7,99,50,35,50,99,80,0,0,39,0,0,0,3,2,0,2,0,0,1,0,7,99,92,55,78,99,0,0,0,39,0,0,0,3,2,0,6,70,0,3,0,7,99,60,40,78,99,55,0,0,39,0,0,0,3,3,0,3,86,0,1,0,9,99,82,50,78,99,25,0,0,39,0,0,0,3,3,0,7,92,0,0,0,7,99,58,40,78,99,60,0,0,39,0,0,0,3,3,0,3,99,0,0,0,7,99,99,99,99,50,50,50,50,4,4,1,35,0,0,0,1,0,0,24,84,79,77,67,65,84,66,83,32,32,63}, /* TOMCATBS */ + {99,50,35,50,99,80,0,0,39,0,0,0,3,2,0,2,0,0,1,0,7,99,50,35,50,99,80,0,0,39,0,0,0,3,2,0,2,0,0,1,0,7,50,35,25,55,80,60,45,0,39,0,0,0,3,2,0,3,52,0,1,0,7,80,42,25,55,99,90,85,0,39,0,0,0,3,2,0,2,88,0,0,0,9,55,35,25,55,85,70,55,0,39,0,0,0,3,2,0,4,72,0,0,0,7,80,40,25,55,99,92,88,0,39,0,0,0,3,2,0,2,99,0,0,0,7,99,99,99,99,50,50,50,50,4,1,1,30,60,3,0,0,4,2,24,66,82,84,72,76,69,83,83,32,32,63}, /* BRTHLESS */ + {99,50,35,50,99,80,0,0,39,0,0,0,3,2,0,2,0,0,1,0,7,99,50,35,50,99,80,0,0,39,0,0,0,3,2,0,2,0,0,1,0,7,99,95,60,80,99,0,0,0,39,0,0,0,3,2,0,6,66,0,7,0,7,99,64,45,80,99,50,0,0,39,0,0,0,3,3,0,3,84,0,1,0,8,99,85,55,80,99,20,0,0,39,0,0,0,3,3,0,7,86,0,0,0,7,99,62,45,80,99,55,0,0,39,0,0,0,3,3,0,3,99,0,0,0,7,99,99,99,99,50,50,50,50,4,3,1,35,0,0,0,1,0,0,24,67,82,73,83,80,32,66,83,32,32,63}, /* CRISP BS */ + {70,60,99,62,99,35,35,0,39,0,0,0,3,2,0,2,52,0,7,0,7,70,60,99,62,99,30,30,0,39,0,0,0,3,2,0,2,40,0,4,0,7,55,45,99,62,90,75,75,0,39,0,0,0,3,2,0,3,48,0,1,0,7,62,45,99,62,99,95,95,0,39,0,0,0,3,2,0,2,82,0,1,0,9,55,45,99,62,95,80,80,0,39,0,0,0,3,2,0,3,62,0,2,0,7,62,45,99,62,99,95,95,0,39,0,0,0,3,2,0,2,99,0,1,0,7,99,99,99,99,50,50,50,50,4,6,1,32,45,7,0,0,4,3,24,69,77,79,84,78,72,82,80,32,32,63}, /* EMOTNHRP */ + {99,50,35,50,99,80,0,0,39,0,0,0,3,2,0,2,0,0,1,0,7,99,50,35,50,99,80,0,0,39,0,0,0,3,2,0,2,0,0,1,0,7,99,96,50,62,99,0,0,0,39,0,0,0,3,4,0,6,60,0,10,0,7,99,64,40,62,99,0,0,0,39,0,0,0,3,4,0,4,88,0,1,0,9,99,90,45,62,99,0,0,0,39,0,0,0,3,4,0,6,80,0,3,17,7,99,62,40,62,99,0,0,0,39,0,0,0,3,4,0,4,99,0,1,0,7,99,99,99,99,50,50,50,50,4,0,1,35,0,0,0,1,0,0,24,66,65,78,65,78,65,77,82,32,32,63}, /* BANANAMR */ + {95,45,25,50,99,78,0,0,39,0,0,0,3,3,0,7,84,0,1,0,7,95,18,18,48,99,95,0,0,39,0,0,0,3,3,0,2,99,0,1,0,14,95,45,25,50,99,78,0,0,39,0,0,0,3,3,0,7,74,0,1,0,7,95,18,18,48,99,95,0,0,39,0,0,0,3,3,0,2,99,0,1,0,0,96,52,35,75,99,70,0,0,41,0,55,0,0,3,0,7,56,0,14,0,7,96,22,22,60,99,75,0,0,39,0,0,0,3,3,0,2,99,0,1,0,7,99,99,99,99,50,50,50,50,4,5,1,35,0,0,0,1,0,0,24,79,87,76,83,32,69,80,32,32,32,63}, /* OWLS EP */ + {95,45,25,50,99,80,0,0,39,0,0,0,3,3,0,6,86,0,1,0,7,95,20,20,50,99,95,0,0,39,0,0,0,3,3,0,2,99,0,1,0,12,95,45,25,50,99,80,0,0,39,0,0,0,3,3,0,6,78,0,1,0,7,95,20,20,50,99,95,0,0,39,0,0,0,3,3,0,2,99,0,1,0,2,95,50,35,78,99,72,0,0,41,0,50,0,0,3,0,6,50,0,14,0,7,96,25,25,62,99,78,0,0,39,0,0,0,3,3,0,2,99,0,1,0,7,99,99,99,99,50,50,50,50,4,6,1,28,0,2,0,0,4,2,24,68,73,86,65,32,69,80,32,32,32,63}, /* DIVA EP */ + {95,38,22,45,99,85,0,0,39,0,0,0,3,2,0,5,94,0,1,0,7,95,16,16,45,99,95,0,0,39,0,0,0,3,2,0,2,99,0,1,0,13,95,38,22,45,99,85,0,0,39,0,0,0,3,2,0,5,88,0,1,0,7,95,16,16,45,99,95,0,0,39,0,0,0,3,2,0,2,99,0,1,0,1,95,45,30,70,99,78,0,0,41,0,40,0,0,2,0,5,66,0,14,0,7,96,20,18,55,99,82,0,0,39,0,0,0,3,2,0,2,99,0,1,0,7,99,99,99,99,50,50,50,50,4,6,1,34,30,4,0,0,4,2,24,76,65,71,79,79,78,69,80,32,32,63}, /* LAGOONEP */ }; -const char bm_fm_names[BM_FM_PATCHES][9] = {"TINEKEYS", "FULLTINE", "POP BASS", "HOUSE BS", "SUB BASS", "TUBECHIM", "CHIMES", "BRASS 80", "STRINGS", "MARIMBA", "FLUTE", "PIPE ORG", "ORGAN", "REED HRP", "CLAVI", "PLUCKED", "GLASS", "LEAD", "SUPER FM", "BUZZ"}; +const char bm_fm_names[BM_FM_PATCHES][9] = {"TINEKEYS", "FULLTINE", "POP BASS", "HOUSE BS", "SUB BASS", "TUBECHIM", "CHIMES", "BRASS 80", "STRINGS", "MARIMBA", "FLUTE", "PIPE ORG", "ORGAN", "REED HRP", "CLAVI", "PLUCKED", "GLASS", "LEAD", "SUPER FM", "BUZZ", "QUERY BS", "QUERYBRS", "SKETCHBS", "TOMCATBS", "BRTHLESS", "CRISP BS", "EMOTNHRP", "BANANAMR", "OWLS EP", "DIVA EP", "LAGOONEP"}; diff --git a/docs/en/CHANGELOG.md b/docs/en/CHANGELOG.md index 4ce2fab..173211e 100644 --- a/docs/en/CHANGELOG.md +++ b/docs/en/CHANGELOG.md @@ -2,6 +2,52 @@ Every version of Bubba Machine. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and versions follow [semantic versioning](https://semver.org/): while the version starts with 0, any minor version may change how it plays or the pattern format. +## [0.10.0-beta] - 2026-10-24 + +**Every machine is its own instrument.** HOME was rebuilt from scratch as a six-channel mixer, and entering a channel hands the whole FM-1 to its machine, laid out like the real one: TB-303, Minimoog, Juno-6, Vital and the FM-1's own DX7-style synth. The drums have a new step sequencer and the pad sampler became the **BP-1 Slicer**. Installed and running on the author's FM-1. + +> On first boot 0.10 erases the saved patterns and scenes **once** and loads three factory patterns. Takes and settings are kept. Until v1 there is still no backward compatibility. + +### Added +- **Factory patterns:** 1 = a recreation of *Da Funk* (Daft Punk, 111 BPM), 2 = *Confusion* in its Pump Panel Reconstruction from *Blade* (New Order, 136 BPM, the 303 line from a published sheet), 3 = *Enjoy the Silence* (Depeche Mode, 113 BPM, drums from a published grid). They are played by the stock machines; nothing is sampled. +- **Scene B of every pattern is all muted** (the six channels, drums too) until you store another scene over it. +- **BX-7 is back:** the FM-1's own FM synth inside Bubba. Six operators, the 32 algorithms drawn on screen, 8 voices, its own effects chain, EDIT per operator (OP1-OP6), ENV, LFO and an arpeggiator with 7 modes and LATCH that records. 31 factory sounds, 11 of them from famous records. +- **BB-303 laid out as a TB-303:** CUTOFF, RESONANCE, ENV MOD and DECAY on K1-K4, ALGORITHM = ACCENT, a second page with TUNING, WAVE, SLIDE and VOLUME. SCL edits ACCENT per step (SCL again = SLIDE). FX is OVERDRIVE → DELAY → REVERB like a TB-03. A synced LFO page with classic waves and rhythmic shapes (PUMP, GATE, STEPS, 3-3-2, BUILD) on cutoff, pitch, resonance or volume. +- **B-MINI, BUNO-6 and BITTAL have their own menus**, following the panel of each machine (Minimoog, Juno-6, Vital) in tabs with four big knobs, and the filter curve, oscillator shape or wavetable drawn under them. Each has DISTORTION, CHORUS and REVERB per channel; SCL edits ACCENT and GLIDE per step. +- **BP-1 Slicer (the last channel):** EDIT trims a take and slices it into the pads (AUTO, 8 or 16 slices), always writing a sequence that plays like the loop; it can also record the mix from the next bar into a pad. Each pad has PITCH, LEVEL, MODE, REVERSE, ATTACK, RELEASE and loop points, and SEQ is a step grid like the drums with a LENGTH/SPEED layer. +- **Drum sequencer (BR-8):** white keys = steps, black keys = quick access to the instruments, page arrows, REPEAT, and layers for ACCENTS, sound, instrument and MUTE SOUNDS. +- **Machine GLO** on every machine: LENGTH (1-64 steps), MACHINE, MIDI CH and MIDI OUT; on page 2 QUANT (25-100 % for live recording) and RESET. +- **MIDI OUT per channel:** a channel can send its notes over USB on its own MIDI channel (factory: T1 = 1 … T6 = 6). +- **Step recording:** REC while stopped inside SEQ writes the key or chord on the cursor step and moves on; PLAY + REC rewrites only the steps you play. +- `tools/fm1/instalar.py` installs from the computer with a log; `consola.py estado` shows the key-scan latency. + +### Changed +- **HOME is a mixer:** K1-K4 = VOLUME, FILTER, DELAY and REVERB of the cursor channel, ALGORITHM = tempo, PRESETS = the channel's sound. White 1-9 = patterns (they change at the end of the bar), white 11-16 = channels, black 1-6 = mutes (hold = solo), black 8-11 = scenes A-D (hold a pattern + scene = store, tap = launch on the next bar, hold 3 s = delete). White 10 and black 7 do nothing. +- **9 patterns** (was 10). +- **Choosing a machine:** HOME's GLO › SELECT MACHINE or K2 on the machine's GLO. The drums stay on T1 and the Slicer stays last; the other channels pick BB-303, B-MINI, BX-7, BITTAL or BUNO-6. At most two heavy machines (BX-7, BUNO-6, BITTAL), each only once. +- **Menu buttons are cyclic:** pressing a menu button again goes to its next page; HOME or another menu leaves. SELECT no longer turns pages. No help text on screen. +- **Recording works like SLOOP:** a fixed length that wraps around and never grows. **REC held 2 s clears the cursor channel's sequence**, playing or stopped. +- SAVE while playing waits and writes when you stop (the SAVE light blinks). SAVE has SAVE, SAVE AS and DELETE; SYSTEM keeps the basics. +- Every knob is drawn once on screen; the SEL / ALG / PRE legends are bigger. +- Pattern format 10. + +### Fixed +- **False safe mode** after two quick power-offs: a boot only counts as failed if the next one starts from a chip reset. +- **Dim LEDs flickered:** the key scan now times each LED on its own and makes up for interrupt latency. +- **Keys went dead after about 71 s** (a timer could wrap around while being reprogrammed); the scan also re-arms itself if it stops. +- A knob paused half-way through a click could count twice; key release takes 4 frames. +- USB MIDI could lose note-offs. +- The power-on key combo for safe mode did not read the keys. +- Machine audit against the original manuals: BB-303 accent only on accented steps and slide only with a tie or legato playing; key stacks on mono machines; BX-7 transpose, osc sync and break point; B-MINI TUNE tunes everything; one BUNO-6 LFO per channel with its delay; several arpeggiator and recording fixes (wrong note lengths after a previous take, hung notes when turning the arp on). + +### Removed +- From the 0.9 console: the channel card, CUE, FX › CHANNEL, the song, MORE, and the old SOUND / INSTR / MIX / PADS / TAKES / LOOP / SCALE / CHORDS menus. +- FREE REC (a free-length first take). +- User sound banks on the BX-7 for now: factory sounds only. + +### Known issues +- In a long, very dense simulated session the voice brake can leave B-MINI almost silent in the last minute. + ## [0.9.0-beta] - 2026-10-18 **HOME is the console.** Ten patterns, six channels, mutes, scenes and CUE on the keys, like an MX-1; REC plays and records any channel without leaving the console; each machine keeps its own GLO. Beta: not fully tried on the device yet. diff --git a/docs/en/CREDITS.md b/docs/en/CREDITS.md index 866d1d5..34cafe9 100644 --- a/docs/en/CREDITS.md +++ b/docs/en/CREDITS.md @@ -56,6 +56,14 @@ The repositories: .bsnap files converted from a GPL-3.0 preset stay GPL-3.0, like the firmware. **Vital** is a synthesizer by Matt Tytel; Bubba Machine reads its preset format but has no relation to Vital or its author, and does not use its code. +## Factory patterns + +Patterns 1-3 are recreations, played by the stock machines (no audio sampled): *Da Funk* (Daft Punk), *Confusion* in its Pump Panel Reconstruction from *Blade* (New Order) and *Enjoy the Silence* (Depeche Mode). The songs belong to their authors; the patterns only take tempo, key, chords and published sequencer sheets: + +- *Confusion*: the 303 line from the sheet on [djjondent.blogspot.com](https://djjondent.blogspot.com/), with the accents proposed on the Adafruit forums. +- *Enjoy the Silence*: the drum grid from [drum-patterns.com](https://drum-patterns.com/) and the chorus chords from [Hooktheory](https://www.hooktheory.com/). +- *Da Funk*: there is no published sheet; the notes follow Attack Magazine and Reverb Machine, and the order is by ear. + ## What ships with the firmware or the emulator | Component | Where | License | diff --git a/docs/en/INSTALL.md b/docs/en/INSTALL.md index ac4a672..bcf1c08 100644 --- a/docs/en/INSTALL.md +++ b/docs/en/INSTALL.md @@ -1,8 +1,8 @@ # Installing Bubba Machine -## Current status: beta (0.9.0-beta) +## Current status: beta (0.10.0-beta) -Bubba Machine for the FM-1 has a **full firmware, with sound**, a **diagnostic firmware** and a **web installer**. It runs on the author's FM-1, but it is a **beta**: tested on a single device and still changing a lot. **0.9.0-beta has not been fully tried on the device yet** (it passes the automated tests and the emulator; do not install 0.6.0-beta: it was short of RAM); if something goes wrong, go back to the stock firmware from the installer, or to 0.8.0-beta: the installer only offers the latest version, so download `bubba-machine-0.8.0-beta.fwsc` from the [GitHub releases](https://github.com/Erbubar23/bubba-machine/releases) and pick it under **More options**. Technical progress is in [`hal/fm1/README_PORT.md`](../../hal/fm1/README_PORT.md) (Spanish). +Bubba Machine for the FM-1 has a **full firmware, with sound**, a **diagnostic firmware** and a **web installer**. It runs on the author's FM-1, but it is a **beta**: tested on a single device and still changing a lot. **0.10.0-beta runs on the author's FM-1** (do not install 0.6.0-beta: it was short of RAM); if something goes wrong, go back to the stock firmware from the installer, or to 0.9.0-beta: the installer only offers the latest version, so download `bubba-machine-0.9.0-beta.fwsc` from the [GitHub releases](https://github.com/Erbubar23/bubba-machine/releases) and pick it under **More options**. Technical progress is in [`hal/fm1/README_PORT.md`](../../hal/fm1/README_PORT.md) (Spanish). > **What you save may be lost when you update.** There is no backward compatibility until v1: if a new version changes how patterns, the song, settings or takes are stored, the old data is erased on first boot and the demo comes back. If something matters to you, record it from the audio output before updating. diff --git a/docs/en/MANUAL.md b/docs/en/MANUAL.md index 54d326b..86d820b 100644 --- a/docs/en/MANUAL.md +++ b/docs/en/MANUAL.md @@ -1,510 +1,400 @@ -# Bubba Machine 0.9 — Manual +# Bubba Machine 0.10 — Manual -Bubba Machine turns the FM-1 into a live groovebox with **six channels**, each one a machine named after the one that inspired it. The drums (**BR-8**) and the pad sampler (**BP-1**) are fixed; **T3-T6 choose their instrument** among **BB-303** (acid bass), **B-MINI** (three-oscillator mono), **BX-7** (6-operator FM), **BITTAL** (wavetable that loads Vital presets) and **BUNO-6** (polysynth with chorus). HOME is the **BX-1** console: patterns, channels, mutes and scenes on the keys. Every channel has its own length and its own speed. +Bubba Machine turns the FM-1 into a live groovebox with **six channels**, each one a machine named after the one that inspired it. The drums (**BR-8**, always T1) and the pad sampler (**BP-1**, the Slicer, always T6) are fixed; **T2-T5 choose their instrument** among **BB-303** (the TB-303), **B-MINI** (Minimoog), **BUNO-6** (Juno-6), **BITTAL** (wavetable, Vital) and **BX-7** (6-operator FM, the FM-1's own engine). HOME is the **BX-1** mixer: patterns, channels, mutes and scenes on the keys. -**The goal is a hi-fi machine:** every machine and the mix are computed live at 44.1 kHz / 24-bit in floating point, each machine has its own engine modeled on the real one, and both cores of the FM-1 can share the work (TWO CORES). See [Audio quality](AUDIO.md). +**The goal is a hi-fi machine:** every machine and the mix are computed live at 44.1 kHz / 24-bit in floating point, and each machine has its own engine modeled on the real one. See [Audio quality](AUDIO.md). -> The names recall famous machines (TR-8, OP-1, TB-303, Minimoog, DX7, Vital, Juno-6, MX-1), but Bubba Machine has no relation to their brands or makers. +> The names recall famous machines (TR-8, TB-303, Minimoog, Juno-6, Vital, DX7, MX-1), but Bubba Machine has no relation to their brands or makers. -The interface fits in two sentences: **four gestures per button, and they mean the same thing on every button. HOME everywhere.** - -**Every machine is its own instrument.** On HOME you are at the BX-1 console, like a mixer for live sets: you launch patterns, mute, solo, launch scenes and mix. Enter a channel and **the whole FM-1 belongs to that machine**: its keys, buttons, knobs and lights work like the real machine it is named after, and you only edit a machine from inside it. **HOME is the way out**: a tap always takes you back to the console. +**Every machine is its own instrument.** On HOME you are at the mixer: you launch patterns, mute, solo, launch scenes and mix. Enter a channel and **the whole FM-1 belongs to that machine**: its buttons are that machine's menus and its knobs are its panel. **HOME is the way out**: a tap always takes you back to the mixer. > **The screen is in English.** Names that appear on screen are written here in CAPITALS exactly as you will see them. Other languages are packs you load from the [control platform](../../web/control.html) (see [Screen language](#screen-language)). -> 0.9 has **10 patterns**. Coming from 0.8, patterns 01-10 are kept; 11-16 are dropped, and the song and the scenes start empty (their format changed). Until v1 an update may erase what you saved. - -## Four gestures per button - -| Gesture | When | What it does | -|---|---|---| -| **Tap** | under 300 ms | Opens its page on the channel you are on. Again: the next page of the same button | -| **Hold** | 300 ms or more | Its **live layer**: while you hold it, the keys do that job and the screen draws the keyboard with what each key does. Let go and you are back | -| **Hold 2 s** | 2 s without touching anything else | Its settings or its dangerous action. A ring fills at the top with the name of what it opens; touching anything cancels it. Only on HOME, SEQ, EDIT, SAVE and REC | -| **HOME + button** | with HOME held | The **global version** of the button: for the whole project, not just the channel | - -There are never two layers at once: with a layer open, holding another button does not open its own. +> **First boot of 0.10:** the pattern format changed, so the saved patterns are erased **once** and the three factory patterns are loaded (see [Factory patterns](#factory-patterns)). Takes, your sounds and the settings are kept. Until v1 an update may erase what you saved. -**Questions.** Anything that erases something asks first, and **the control that asked answers**: keep it held 2 s and a bar fills (**KEEP HOLDING EDIT = YES**); letting it go before, or touching any other control, is no. While a question is open only that control blinks. If a knob asked (for example INIT SOUND in the machine GLO), leaving it 2 s without touching anything else is yes. +## How the buttons work -![A question: keep holding the key that asked](../../assets/screens/46-ask.png) +- **Menu buttons open their page with one press.** Pressed again, a menu with several pages goes to its **next page, in a circle** (it does not exit); a menu with one page goes back to the machine's main page. Another menu, or HOME, leaves it. Holding a menu button does the same as a press. +- **Hold 2 s** only on three buttons: **HOME** (SYSTEM), **SAVE** (quick save) and **REC** (clear the channel). A ring fills at the top with the name of what it does. +- **SELECT never turns pages.** It moves a cursor where there is one (the channel, a step, a row, a block of 16 steps, an FX slot). +- **No help text on screen.** The screen names what each key and knob does; how to use it is in this manual. +- **A control with nothing to do here does nothing**, and its light is off. ## The lights -The FM-1's lights are white only: they never say *what* a key or button does (the screen does), only its state. The same six levels mean the same thing on every screen: +The FM-1's lights are white only: they never say *what* a key or button does (the screen does), only its state. The same levels mean the same thing on every screen: | Light | Keys | Buttons | |---|---|---| -| **Off** | Does nothing here: no function, an empty instrument, outside the length | Does nothing on this screen | +| **Off** | Does nothing here: no function, an empty pattern or instrument, outside the length | Does nothing on this screen | | **Dim** | Available but empty, or has something but is silenced (a muted instrument or channel) | Available | -| **Medium** | Has something and will play: an instrument with steps, a saved pattern or scene, the root note | Has a special job right now (with HOME held, the ones that have a HOME + function) | -| **On** | Selected, held, active now, or **a flash on every hit** | Where you are, or a state that stays (octave shifted, note REC) | -| **Blink** | The playhead, or something queued (a pattern, a scene, a mute on CUE) | Needs you now: the control that asked a question, REC capturing, HOME with a pattern or scene in the queue | -| **Breath** | A step with P-Lock, the EXIT key of a layer opened with a tap, CUE armed, the channel card you hold | Armed or pending: REC armed, the layer you hold, SAVE with unsaved changes (on the console), PLAY waiting for external clock | +| **Medium** | Has something and will play: an instrument with steps, a saved pattern or scene, the root note | — | +| **On** | Selected, held, active now, or **a flash on every hit** | Where you are, or a state that stays (octave shifted, REC on) | +| **Blink** | The playhead, or something queued (a pattern, a scene) | HOME when a pattern or scene is queued and you are not on the mixer; SAVE while a save waits for STOP | +| **Breath** | A step with a P-Lock | The layer that is open, REC armed, SAVE with unsaved changes, PLAY waiting for external clock | **PLAY** flashes on with the first beat of each bar and medium on the other beats. On the screen's key strip, an off key has a dark name, dim has a grey name with a border, medium a white name and on is filled. ## The knobs -| Knob | On HOME (the console) | Inside a machine | +| Knob | On HOME (the mixer) | Inside a machine | |---|---|---| -| **SELECT** | The **cursor**: picks the channel (on FX and GLO: the page or the row) | The page (its name and dots at the top) or the row of a list. With a step held, its accent | -| **ALGORITHM** | The **tempo** (HOME + ALGORITHM: in tenths). On GLO, the value of the row | The machine's **mode** (table below). On a list, it changes the highlighted value | -| **PRESETS** | On MIX: the cursor channel's **sound** (kit, patch or sound). On FX and GLO: **MOVE** (below) | The sound: kit, patch or a sound from the bank | -| **K1-K4** | On MIX, the cursor channel as a mixer strip: **LEVEL** · **FILTER** (DJ: left low-pass, right high-pass) · **DELAY** · **REVERB**. On FX and GLO, what the page shows | Whatever the four dials at the bottom say | +| **SELECT** | The **cursor**: picks the channel, top to bottom and around | A cursor where the page has one (the step on SEQ, a block of 16 steps on SCL, the FX slot on the BX-7) | +| **ALGORITHM** | The **tempo** (BPM) | The machine's main control (table below) | +| **PRESETS** | The cursor channel's **sound**: the kit, the preset, or the take of the selected pad | The sound: kit, preset, or the selected pad's take | +| **K1-K4** | The cursor channel as a mixer strip: **VOLUME** · **FILTER** (DJ: left low-pass, right high-pass) · **DELAY** · **REVERB** (the sends) | What the screen shows | -With **HOME held** from any screen: SELECT moves the cursor, ALGORITHM sets the BPM in tenths, PRESETS picks a pattern that loads when you let go, and K1-K4 are the cursor's mixer strip. +**ALGORITHM inside a machine:** -**Entering a machine:** on HOME, put the cursor on the channel (SELECT, or tap its white key 11-16) and tap **SEQ**, **EDIT**, **ENV**, **LFO** or **ARP**: you enter on that page. Or hold the channel's white key and let go (the [channel card](#the-channel-card)). From any screen, **HOME + white 11-16** takes you to that machine when you let go of HOME. - -**ALGORITHM inside a machine (the mode):** - -| Machine | ALGORITHM | -|---|---| -| BR-8 | Picks the instrument (with the box: big number, its name and model) | -| BP-1 | Picks the pad | -| BB-303 | The waveform: SAW or SQUARE | -| B-MINI | MONO or LEGATO | -| BX-7 | The algorithm, 1 to 32 | -| BITTAL | Oscillator 1's table: its own or another bank sound's | -| BUNO-6 | The chorus: OFF, I, II or I+II | +| Machine | ALGORITHM | OCT held + ALGORITHM | +|---|---|---| +| BR-8 | The instrument (a box shows its number and name; it is picked a moment later) | — | +| BP-1 | The pad | — | +| BB-303 | ACCENT | TUNING | +| B-MINI | CUTOFF | — | +| BUNO-6 | FREQ (the filter) | — | +| BITTAL | CUTOFF | — | +| BX-7 | The algorithm, 1 to 32 | TRANSPOSE ±12 | -**Priority:** a question > the channel card > a layer > REC on a note channel > held step > list > channel > HOME. +**Each knob is drawn once.** Where the screen shows a machine's panel (or a list of four settings), the four dials at the bottom are not drawn again: the active knobs are in color, the rest grey. Elsewhere, the bottom strip shows K1-K4 as four dials with their value and name. -**The big knobs say what they do:** the bottom line of the screen reads **SEL · ALG · PRE** with their job on that screen (for example SEL TRACK · ALG BPM · PRE KIT on MIX), and "-" when the knob does nothing there. +**The big knobs say what they do:** the bottom line reads **SEL · ALG · PRE** with their job on that screen (for example SEL TRACK · ALG BPM · PRE KIT on HOME), and "-" when the knob does nothing there. **How they feel:** - **Turning fast speeds up** continuous values (BPM, cutoff, start); **lists move one item per click**, never skipping. - **On/off settings:** right = on (or next), left = off. They don't wrap around. -- **MOVE, the DJ filter and PAN stop at the center** for two clicks, so 0 is easy to find. -- **SELECT goes through a page's sub-pages first** (SOUND, INSTR, PADS, ENV, MIX › DUCK), then to the next tab. -- Turning K1-K4 shows the name and value on the top line, without covering the screen; the big box is only for SELECT, ALGORITHM, PRESETS and the tempo, and it names the knob you turned. +- **The DJ filter stops at the center** (OPEN) for two clicks, so it is easy to find. +- Turning K1-K4 shows the name and value on the top line, without covering the screen; on a panel you see the knob itself move. The big box is for SELECT, ALGORITHM, PRESETS and the tempo. ## The screen Four strips, always in the same place: -1. **Header:** the machine you are on (BX-1 on the console; inside a channel, "<" and its name: HOME goes back), PLAY/REC, pattern and bar and the tempo in its own yellow. - - A queued pattern reads **A01>A05**, with 4 blocks counting the beats down to the change. +1. **Header:** where you are (**BX-1** on the mixer; inside a channel its machine, with "<": HOME goes back), PLAY/REC, the pattern (**A01**), bar.beat, the active scene and the tempo in yellow. + - A queued pattern reads **A01>A03**, with 4 blocks counting the beats to the change. A queued scene reads **>B**. - **Six tiny cells** show the channels: their color = playing, red = muted, white = a hit, outline = solo. - - **SONG** when the song is on; a **green dot** = autosaved; "CPU!" only if the audio does not keep up; while recording notes, the gate they are recorded with (TIE or G75%). - - The 2 s ring, with the name of what it opens, and the battery. -2. **Viewport:** what each screen shows. On the console, its pages **MIX · FX · GLO** at the top (on FX and GLO, their sub-pages on the right). Inside a machine, the page name and one dot per page, **O+1 / O-1** when the octave is shifted and **AGAIN: ...** with what tapping the page's button again does. The usage hints show for the first 4 seconds; **the line that says how to exit stays**. A layer opened with a tap says **LATCHED**. -3. **Keyboard:** the 11 black and 16 white keys with what each one does and the same state as its light. On the console: 01-10, T1-T6, M1-M6, A-D and CUE. On SEQ **the white keys are the 16 steps**; on a note channel, a mint bar marks long notes. Short fixed names: drums BD, SD, CH, OH, CP, LT...; HI / LO = the other section; < / > = step page; FIL = fill; X = exit. -4. **Knobs:** K1-K4 as four dials with their value and name, in physical order; under them, what SELECT, ALGORITHM and PRESETS do. - -The palette: blue-black background, **cyan** for what is active, **amber** for values and the playing step, **laser red** for REC and mutes, **mint green** for long notes. A **red border** = the mix clipped. + - With external clock, **EXT** (or a red **EXT?** with no clock coming in) instead of BPM. A **green dot** = autosaved; **CPU!** only if the audio does not keep up. + - The 2 s ring with what it does (SYSTEM, QUICK SAVE, CLEAR T3, DELETE SCENE A), and the battery. +2. **Viewport:** what each screen shows. Inside a machine, the page name at the top left (for example **PANEL 1/2**, **FX 2/2 DELAY REVERB**, **TRIM 1/2**) and its sound on the right. A layer opened on the drums says **LATCHED** and the sound page (**OCT 1-8** or **OCT 9-16**). +3. **Keyboard:** the 11 black and 16 white keys with what each one does and the same state as its light. On the mixer: 01-09, T1-T6, M1-M6 and A-D. On the step sequencers the white keys are the 16 steps. Short fixed names: drums BD, SD, CH, OH, CP...; pads P1-P16; < / > = bar; RPT = repeat. +4. **SEL · ALG · PRE:** what the three big knobs do here. -## The 14 buttons +The palette: blue-black background, **cyan** for what is active, **amber** for values and the playing step, **red** for REC and mutes, **green** for long notes and slides. -| Button | Tap | Again | Hold (layer) | 2 s | HOME + | -|---|---|---|---|---|---| -| **HOME** | Back to the console, always on **MIX** | — | **The console** from any screen (see below) | SYSTEM | (it is the modifier) | -| **SEQ** | The channel's steps (on the console: enters the cursor's machine) | Notes: LOOP · sampler: BREAK | **Length and speed** | TIME of the 6 channels | Console GLO › SONG | -| **EDIT** | SOUND (BP-1: PADS) | The editor's next page | **Erase** (on the console, black 7-10 clear a scene) | Sampler: TAKES · others: INIT SOUND (asks) | Copy the channel to another | -| **ENV** | The machine's envelope · INSTR (drums) | The other envelope | **Accent** | — | — | -| **LFO** | The machine's LFO (B-MINI, BITTAL, BUNO-6). On machines without an LFO it **latches its layer**: repeat (BR-8, BP-1) or tie (BB-303, BX-7); LFO again or HOME closes it | — | **Repeat** (grids) · **tie** (notes) | — | — | -| **FX** | Inside: the channel's MIX. On the console: the **FX** page | Inside: DUCK. Console: CHANNEL › DELAY › REVERB › MASTER | **Punch-in** | — | The console's FX page | -| **SCL** | Inside: the channel's SCALE. On the console: GLO › SCALE | CHORDS | Live **chords** | — | Console GLO › SCALE | -| **ARP** | Notes: the channel's ARP. BR-8 and BP-1: the **ROLL** screen, kept open (ARP again or HOME closes it) | — | **Arpeggio** (notes) · **ROLL** while held (grids) | — | — | -| **SAVE** | Save menu | Run it | **Copy pattern** | Quick save | Save as | -| **GLO** | Inside: the **machine GLO**. On the console: the **console GLO** | Machine: back to the page you were on. Console: TEMPO › MACHINES › SCALE › SONG | **Transpose** and TAP tempo | — | Console GLO | -| **REC** | Record. On the console: **SLOOP-REC**. On the sampler: the recorder | Looper: overdub › play | Record only while held (on the console: SLOOP while held) | **Erase the channel at once, no question** (for live use; HOME + OCT− undoes it). Not while anything is recording, nor on RECORD or TAKES. LOOP page: erase the loop | SONG REC | -| **PLAY** | Play / stop | — | — | — | Back to step 1 without stopping | -| **OCT − / +** | **Octave** of the keys on note machines (on the console too, for SLOOP). Nothing on drums and pads | — | — | — | Undo / redo | - -## HOME: the console +## The buttons -![HOME: the BX-1 console](../../assets/screens/00-home.png) +| Button | On HOME | Inside a machine | 2 s | +|---|---|---|---| +| **HOME** | Stays on the mixer (and leaves PLAY/REC) | Back to the mixer | SYSTEM | +| **PLAY** | Play / stop | Play / stop (with REC armed it also starts recording) | — | +| **REC** | Opens **PLAY/REC** already recording; in PLAY/REC, REC on / off | Note machines: record (see [Recording](#recording-like-sloop)); BP-1: record the pads you play | **Clear the cursor channel at once**, playing or stopped | +| **SAVE** | The SAVE screen | The SAVE screen | Quick save | +| **GLO** | The mixer GLO (machines, tempo and scale, master FX) | The machine's GLO | — | +| **SEQ, EDIT, ENV, LFO, FX, SCL, ARP** | Enter the cursor channel's machine on that page (only the ones that machine has) | That machine's menus (see each machine) | — | +| **OCT − / +** | Nothing (in PLAY/REC: octave, or soft / hard hits on the drums) | The octave (note machines) or the sound page (step sequencers) | — | -The FM-1 has no SHIFT, so HOME does three jobs: +## HOME: the mixer -1. **The BX-1 console:** HOME is a machine of its own, with three pages: **MIX**, **FX** and **GLO**. A HOME tap always goes to MIX; FX opens FX and GLO opens the console GLO. MIX has one row per channel with its machine, its sequence (pulses for hits, mint blocks for long notes), LP or HP when its filter is on, and its volume with the peak. -2. **The console that follows you:** holding HOME brings the console keys to any screen. You edit the bass and, without leaving, mute, launch a scene or queue the next pattern. -3. **Modifier:** HOME + button = its global version (table above). +![HOME: the BX-1 mixer](../../assets/screens/00-home.png) -If you used HOME as a modifier, letting go does **not** take you to the console: HOME only navigates on a clean tap. While you hold HOME, only the buttons with a HOME + function are lit (OCT−/+ only when there is something to undo or redo). +HOME is a machine of its own, **BX-1**. One row per channel with its machine, its sequence (pulses for hits, green blocks for long notes), LP or HP when its filter is on, its volume and its peak. Channels appear in this order: -To clear a channel: REC held 2 s (instant; on the console, the cursor channel) or EDIT held + black 3 (CLR); HOME + OCT− undoes either. +| Screen | Machine (factory) | Can be | +|---|---|---| +| **T1** | BR-8 | fixed | +| **T2** | BB-303 | BB-303, B-MINI, BUNO-6, BITTAL or BX-7 | +| **T3** | B-MINI | the same | +| **T4** | BUNO-6 | the same | +| **T5** | BITTAL | the same | +| **T6** | BP-1 (the Slicer) | fixed | -**Keys on the console (on HOME, or while holding HOME anywhere):** +**Keys on the mixer:** | Key | What it does | |---|---| -| **White 1-10** | Patterns **01-10**. Tap = queue it for the next cycle (when stopped: switches right away). Hold one and tap another: **chain** from the first to the second. On = playing, blink = queued, medium = saved, dim = empty | -| **White 11-16** | Channels **T1-T6**. Tap = the cursor. Hold = the **channel card** (below). With HOME held: go to that machine when you let go of HOME | -| **Black 1-6** | Mute T1-T6. Hold = **solo** while you hold it | -| **Black 7-10** | **Scenes A-D** (see [Scenes and song](#scenes-and-song)) | -| **Black 11** | **CUE**: hold it (or tap it to keep it on) and the mutes you tap change together on the next bar | - -Mutes are live: they stay when the pattern changes. - -### The channel card - -![The channel card: release = enter](../../assets/screens/67-card.png) - -**Hold a channel's white key (11-16)** on the console and its card opens: its machine, its sound and, on T3-T6, the five machines it can be. **Let go = enter** that machine, on the page you last used. While you hold it: - -- **ALGORITHM changes the machine** (T3-T6). Turn to one and leave it **2 seconds**: a bar fills ("LOAD IN 1.4 S") and the channel becomes that machine. Moving away, or letting go of the key, cancels it. The notes, length, loop, ARP, scale and mix stay; the sound goes to the machine's first preset and per-note P-Locks are cleared. The machine is saved with the pattern. -- **PRESETS changes its sound** (kit, patch or sound). -- Turning any knob means **letting go stays on the console** (RELEASE = STAY ON MIX). - -**Heavy machines, one at a time:** **BUNO-6** (it uses about a third of the processor) and **BITTAL** (its wavetables fill the memory) can only be on one channel. On another channel they show dimmed with "ON T6" and the screen says "BUNO-6 ALREADY ON T6". BB-303, B-MINI and BX-7 can repeat (a BX-7 on T3 is polyphonic too). The same rule applies when copying a channel or loading a pattern. +| **White 1-9** | Patterns **01-09**. Chosen when you let go: playing, it **changes at the end of the bar** (blink = queued); stopped, it loads at once (and the one you leave is saved if it changed). On = playing, medium = saved, off = empty | +| **White 10** | Nothing: a gap so you don't change pattern by mistake | +| **White 11-16** | Channels **T1-T6**. Tap = move the cursor there. Tap the cursor's channel again = **PLAY/REC** (below). On = the cursor, medium = has steps (it flashes with each hit), dim = empty | +| **Black 1-6** | Mute T1-T6 (at once). **Hold = solo** while you hold it; tap other mute keys meanwhile to add them to the solo. Let go of the first one and the mutes are back as before | +| **Black 7** | Nothing | +| **Black 8-11** | **Scenes A-D** of this pattern (see [Scenes](#scenes)) | -The same change is in **GLO › MACHINES** (below). +**Knobs:** SELECT = cursor, ALGORITHM = BPM, PRESETS = the cursor's sound, K1-K4 = **VOLUME** (the same as each machine's VOLUME), **FILTER**, **DELAY** and **REVERB**. -### MIX +**Entering a machine:** put the cursor on the channel and press one of its menu buttons: you enter on that page. Each machine lists its buttons below. -SELECT moves the cursor, ALGORITHM is the tempo (the tempo box is yellow and its four blocks flash with the beat), PRESETS changes the cursor channel's sound (a kit change can be undone with HOME + OCT−) and K1-K4 are its **LEVEL**, **FILTER**, **DELAY** and **REVERB**. +### PLAY/REC: play any channel from the mixer -### FX +![PLAY/REC on the BB-303](../../assets/screens/01-home-play.png) -FX on the console opens the FX page; FX again (or SELECT) goes **CHANNEL › DELAY › REVERB › MASTER**. ALGORITHM is still the tempo and **PRESETS is MOVE**. +Tap the cursor's channel key again (or press **REC**, which enters already recording) and **the keys stop being the mixer: they play that machine** without entering it. The viewport shows the channel as a piano roll, with **PLAY T2 BB-303** (or **REC ...** in red) at the top. **HOME** gives the keys back to the mixer. -![FX › CHANNEL: drive, pan, duck and BEAT FX per channel](../../assets/screens/39a-home-fx-channel.png) +- **Note machines:** the 27 keys are chromatic from **F**; BB-303 and B-MINI play an octave lower. **OCT −/+** shift the octave (−2 to +2, shown at the top right). The keys of the scale are dim, the root medium (GLO › TEMPO AND SCALE). +- **Drums and pads:** the white keys are the 16 instruments or pads. On the drums, **hold OCT+** for hard hits (accent) and **OCT−** for soft ones. +- **SELECT** changes channel and the keyboard (and the recording) follows it. The knobs are still the mixer's. +- **REC** on / off. Recording works as inside the machines ([Recording](#recording-like-sloop)); drum and pad hits are added to their steps. -| Page | K1 | K2 | K3 | K4 | -|---|---|---|---|---| -| **CHANNEL** (the cursor; white 11-16 change it) | **DRIVE** (the channel's soft-clip; 0 = off) | **PAN** | **DUCK** (sidechain from the T1 kick; T1 is the source) | **BEAT FX** ON/OFF: whether the BEAT FX and the punch-ins touch this channel | -| **DELAY** | TIME (1/16, 1/8, 3/16, 1/4) | FEEDBACK | MIX | SIDECHAIN RELEASE | -| **REVERB** | SIZE | DAMP | MIX | SIDECHAIN RELEASE | -| **MASTER** | **FILTER** (open in the middle; left low-pass, right high-pass) | **BEAT FX** (one of the 16 punch-in effects stays on until you turn it back to OFF) | **DRIVE** (saturation of the mix) | — | +![PLAY/REC on the BR-8](../../assets/screens/01-home-play-drums.png) -**MOVE** (PRESETS on FX and GLO): at 0 the mix is untouched. To the left the master low-pass closes and the whole mix goes into the echo (darker, more repeats); to the right the master high-pass opens and the mix washes into the reverb. It is a live control: it is not saved. +### GLO (the mixer's) -### GLO (the console's) +GLO on HOME opens three pages; **GLO again = the next page**, in a circle. HOME leaves. The mixer keys still work (patterns, mutes, scenes; white 11-16 move the cursor). -GLO on the console opens its global list; GLO again goes **TEMPO › MACHINES › SCALE › SONG**. SELECT picks the row, ALGORITHM changes it and PRESETS is MOVE. - -| Page | Rows | K1-K4 | -|---|---|---| -| **TEMPO** | BPM · SWING · MASTER LENGTH · TRANSPOSE · **AUTO FILL** (OFF, every 2, 4 or 8 bars) | BPM · SWING · MASTER · TRANSPOSE | -| **MACHINES** | T1-T6 and their machine. SELECT picks T3-T6 and ALGORITHM changes its machine, with the same 2 s wait and heavy-machine rule as the card | — | -| **SCALE** | ROOT · SCALE · **KEYS IN SCALE** · BASE CHORD (the project's) | the same four | -| **SONG** | The song's entries (see [Scenes and song](#scenes-and-song)) | PATTERN · TIMES · — · SONG ON/OFF | - -SCL on the console (or HOME + SCL) opens GLO › SCALE; HOME + SEQ opens GLO › SONG. - -## SLOOP-REC: play any channel from the console - -![SLOOP-REC on the BB-303](../../assets/screens/71-sloop-note.png) - -**REC on the console** (MIX or FX) arms the cursor channel and **the keys stop being the console: they play that machine**, without entering it. The viewport shows the channel as a piano roll, with **SLOOP T3 BB-303** in red at the top. REC again (or entering a machine) gives the keys back to the console. **Holding REC** = SLOOP only while you hold it. - -- **Note machines:** the 27 keys are chromatic from **F**; bass machines (BB-303, B-MINI) play an octave lower. OCT−/+ shift the octave (shown at the top right). With **KEYS IN SCALE** on (GLO › SCALE), the white keys play the scale and the black keys its chords. -- **Drums and pads:** the white keys are the 16 instruments or pads; hold **black 1 (ACC)** and the hits you play go with accent. -- **Recording:** while playing, what you play is written with the [expressive REC](#expressive-rec); the notes of this pass show in **red**. On an **empty** note channel it is a **FREE REC** (the length closes when you leave SLOOP or change channel). Stopped, the keys only play. -- **SELECT** changes channel and the keyboard follows it. **Holding HOME** gives you the console keys (mutes, scenes, patterns) while you hold it. - -![SLOOP-REC on the BR-8: B1 = accent](../../assets/screens/72-sloop-drums.png) - -## The six machines - -| Channel | Machine | What it is | Tabs | -|---|---|---|---| -| **T1** | **BR-8** | Drums: TR grid of 16 **modeled** instruments (computed live); kits 808, 909 and SYNTH | SEQ · SOUND · INSTR · MIX | -| **T2** | **BP-1** | 16 pads made from your takes, on a grid | SEQ · PADS · BREAK · TAKES · MIX | -| **T3-T6** | **your choice** | BB-303, B-MINI, BX-7, BITTAL or BUNO-6 (factory: BB-303, BX-7, BITTAL, BUNO-6) | SEQ · SOUND · MIX · ARP · LOOP | - -The machine is changed from the console: the [channel card](#the-channel-card) or GLO › MACHINES. Inside, **GLO** opens the [machine GLO](#the-machine-glo). - -**Black keys follow a single grammar in SEQ:** 1-8 are the channel's elements (instruments, pads or scale degrees), **9 and 10 turn the step page** (< and >, lit when there is a page that way) and **11** is the other section on drums and pads (HI/LO) or FILL on note machines. - -## The sound of each machine - -Everything is computed live; the sampler uses your takes. +| Page | SELECT · ALGORITHM | K1 | K2 | K3 | K4 | +|---|---|---|---|---|---| +| **SELECT MACHINE 1/3** | the channel · its machine | — | — | — | — | +| **TEMPO AND SCALE 2/3** | — · BPM | SWING (50-75 %) | SCALE | ROOT | TRANSP (−12 to +12) | +| **MASTER FX 3/3** | — | DLY TIME (1/16, 1/8, 3/16, 1/4) | DLY FDBK | REV SIZE | REV MIX | -| Machine | What it is | K1-K4 on SEQ | PRESETS | -|---|---|---|---| -| **BR-8** | 16 modeled instruments, each with its own **model**: BD 808, BD 909, SD 808, SD 909, HAT 808, METAL, clap, TOM (and congas), cowbell, RESON (rim, clave, block), noise or FM | TONE · TUNE · DECAY · COLOR | Kits 808, 909 and SYNTH | -| **BB-303** | TB-303 bass after **Open303**: the 303's filter, the accent circuit (accented notes open the filter more and more), slide with TIE and the knob ranges of the TB-303 | CUTOFF · RESO · ENV MOD · DECAY | 12 sounds: the owner's manual sounds (E.BASS A and B, UPRIGHT, SYNTH BASS, INIT 1982) and acid classics | -| **B-MINI** | Three oscillators (TRI, SHARK, SAW, SQUARE, WIDE, NARROW) in 32' to 2' ranges, noise, ladder filter with drive, two envelopes (CONTOUR and LOUDNESS), LFO and glide | CUTOFF · EMPHASIS · CONTOUR · F DECAY | 18 sounds: Minimoog sound charts (basses, brass, leads) and recreations of famous Minimoog parts | -| **BX-7** | 6 operators (msfa, the core of Dexed); the DX7's 32 algorithms | MOD LVL · FEEDBACK · DECAY · RELEASE | 20 patches from published DX7 recipes (e-piano, basses, bells, brass, organs…) and the voices of your .syx banks | -| **BITTAL** | Two wavetable oscillators (up to 8 frames, alias-free on every note) with up to 4-voice unison, filter (LP 24/12, BP, HP or ladder) with drive, two ADSRs (ENV 2 can sweep the table, as on a PPG), LFO and 4 macros | The sound's 4 macros (their name says where they go: CUTOFF, POSITION, LFO, SPACE…) | 26 sounds: PPG-style wavetables and community Vital presets, plus yours | -| **BUNO-6** | One oscillator per voice (saw, pulse with PWM, sub one octave down and noise), 4-position high-pass, 24 dB resonant filter, one ADSR, delayed LFO and stereo chorus | FREQ · RES · ENV · LFO | 16 sounds: Juno factory patches as starting points (strings, brass, pads, basses) and a few originals | +![GLO › SELECT MACHINE](../../assets/screens/24-glo-machines.png) -BR-8's kicks, snares and hats are the **Plaits** models (Mutable Instruments), which imitate the 808 circuits and 909-style synthetic versions. With **accent** they hit differently, not just louder. The factory kicks are voiced to cut through the mix. +**Changing a machine (T2-T5):** on SELECT MACHINE, SELECT picks the channel and ALGORITHM turns to a machine. **Leave it 2 seconds** on one: a bar fills ("LOAD IN 1.4 S") and the channel becomes that machine. Moving away, or leaving GLO, cancels it. The notes, length and mix stay; the sound goes to the machine's first preset. The machine is saved with the pattern. T1 and T6 say FIXED. The same change is in each machine's GLO (K2 MACHINE). -**Historic sounds.** Many factory sounds recreate the machine they are named after: published panel settings, sound charts and recipes translated to our parameters, plus sounds inspired by famous records. No audio was sampled and no factory data was copied. Their names only allude (CHICAGO 86, COLD FRIEND, POP RIFF…): no artist names or trademarks. Where each one comes from is in [`assets/presets/SOURCES.md`](../../assets/presets/SOURCES.md). +**Heavy machines:** **BUNO-6**, **BITTAL** and **BX-7** each fit on **one channel only**, and **at most two heavy machines** play at once. A heavy machine already on another channel shows "ON T4"; a third one says "2 HEAVY ON T4 T5" (where they are, so you can change one). BB-303 and B-MINI can repeat. -**The sound bank.** B-MINI, BITTAL and BUNO-6 load **sounds** (.bsnap): their settings, their macros and, on BITTAL, their tables. Some factory ones come from freely licensed Vital presets (CC0, Unlicense and GPL-3.0; credits in [CREDITS.md](CREDITS.md)). Yours are added from the web editor ([sounds](../../web/control.html#sounds)): PRESETS goes through the factory ones first and then yours. The sound's fingerprint (#A4F9) shows at the top right of SOUND. +![TEMPO AND SCALE](../../assets/screens/24e-glo-tempo.png) ![MASTER FX](../../assets/screens/24f-glo-fx.png) -### Editing the sound +## Scenes -**SOUND** is the machine's editor. Its pages follow **the real machine's panel**, in the same order and with the same names, 4 settings per page: +**A scene is a snapshot of the mutes**: the six channels' mutes and the instrument mutes of BR-8 and BP-1. Each pattern has its own four scenes, on **black 8-11** (A-D). -| Machine | Pages (K1-K4) | +| Gesture | What it does | |---|---| -| **BB-303** | **VCO VCF** (TUNING, CUTOFF, RESO, ENV MOD) · **ENV** (DECAY, ACCENT, SLIDE, WAVE) | -| **B-MINI** | **CONTROL** (TUNE, GLIDE, MOD RATE, MOD AMT: left = oscillators, right = filter) · **OSC 1-3** (RANGE, FREQ, WAVE) · **MIXER** (OSC 1, OSC 2, OSC 3, NOISE) · **FILTER** (CUTOFF, EMPHASIS, CONTOUR, KBD CTRL) · **F CONTOUR** and **L CONTOUR** (ATTACK, DECAY, SUSTAIN, RELEASE) · **OUTPUT** (DRIVE, MODE, VEL FILT, VEL LVL) | -| **BX-7** | **ALGORITHM** (ALG, FEEDBACK, MOD LVL, KEY VEL) · **EG** (R1 ATK, R2-3 DEC, R4 REL) · **VOICE** (PORTA, TRANSP) · **LFO** (SPEED, DELAY, PMD, AMD; on top of the patch's own LFO) | -| **BITTAL** | **OSC 1 / OSC 1 +** · **OSC 2 / OSC 2 +** (LEVEL, TRANSP, FRAME, UNISON · DETUNE, FINE, TABLE) · **FILTER** (MODEL, CUTOFF, RESO, DRIVE) · **FILTER +** (ENV2 AMT, KEYTRK, VELO, **ENV2 POS**: envelope 2 sweeps the table position) · **ENV 1 / ENV 2** (A, D, S, R) · **LFO 1** (SHAPE, RATE, DEST, AMOUNT) · **MACRO 1-2 / 3-4** · **VOICE**. The oscillator pages draw the table in 2.5D, with the playing frame in cyan | -| **BUNO-6** | **LFO** (RATE, DELAY) · **DCO** (LFO, PWM, PWM MODE, RANGE) · **DCO WAVE** (PULSE, SAW, SUB, NOISE) · **HPF VCF** (HPF, FREQ, RES, ENV) · **VCF MOD** (ENV +/-, LFO, KYBD, VELO) · **VCA** (ENV/GATE, VELO) · **ENV** (A, D, S, R) · **CHORUS** | +| **Hold a pattern's white key + tap a scene** | Stores the mutes as they are now in that scene of that pattern | +| **Tap a stored scene** (medium) | Launches it on the next bar (stopped: at once). On = the active one, blink = queued. An empty scene does nothing | +| **Hold a scene 3 s** | Deletes it (a ring fills: DELETE SCENE A) | -**K1-K4** change the page's 4 settings; above them, a drawing of what they do (the wave, the table, the filter curve, the envelope or the LFO). **SELECT** changes page (at the first or last one it moves to the next tab). **EDIT** again = next page. **ENV** opens the machine's first envelope (again: the second one). **LFO** opens the LFO page; the BB-303 has none, so LFO keeps its tie layer. The macros (K1-K4 on SEQ) take P-Locks per note. +**Scene B of every pattern comes with all six channels muted**, drums included: a quick way to drop everything and bring it back with A. It stays until you store another scene over it (deleting it leaves it empty). -### BX-7: the algorithm +## Factory patterns -SOUND draws the **algorithm as on a DX7**: carriers at the bottom, modulators above, feedback in amber and each operator's level; below, each one's frequency ratio. ALGORITHM steps through all 32 (with MOD LVL, FEEDBACK, DECAY and RELEASE on top of the patch). DX7 **.syx** banks (32 voices) load from the web editor or with `py -3 tools/fm1/sonido.py bank.syx`. +On the first boot of 0.10 patterns 1-3 hold three recreations of famous tracks, played by the factory machines (no audio was sampled; the Slicer is empty): -### Editing a drum instrument +| Pattern | Track | Tempo | Scenes | +|---|---|---|---| +| **01** | Da Funk | 111 BPM, swing 54 % | A everything · B all muted · C without the BB-303 · D the BB-303 with drums and bass | +| **02** | Blade (Confusion, Pump Panel reconstruction) | 136 BPM | A everything · B all muted · C drums and BB-303 · D without drums | +| **03** | Enjoy the Silence | 113 BPM | A everything · B all muted · C drums and bass · D without drums | -**INSTR** (EDIT again, or ENV) has two pages: **HIT** (TUNE, DECAY, TONE and COLOR, named after what it does in that model) and **INSTRUMENT** (MODEL, LEVEL, CHOKE group and line LENGTH). EDIT again changes page. Black 1-8 pick the instrument and black 11 the other section. +Patterns 04-09 start empty. ## Drums (BR-8) -The SEQ screen is a matrix: 16 instruments × the 16 steps of the page. Each line shows its own playhead, because each instrument can have its own length. +T1 is a drum machine of 16 **modeled** instruments (computed live), with the kits **808**, **909** and **SYNTH** on PRESETS. From HOME with the cursor on T1: **SEQ** opens the sequencer, and **LFO**, **ENV**, **EDIT** and **SCL** open the sequencer with their layer. SEQ again (or HOME) goes back to the mixer. -| Control | Does | -|---|---| -| **White keys** | Steps of the selected instrument: tap = set or clear | -| **Black 1-8** | Select (and play) an instrument of the section | -| **Black 9 · 10** | Step page < and > (when the line is longer than 16) | -| **Black 11** | Tap: the other section (instruments 1-8 / 9-16, HI / LO). **Hold: MUTES** while you hold it: the white keys mute or unmute each instrument. **Only instruments with steps are lit:** medium and flashing on every hit = plays, dim = muted, off = empty. On screen a muted instrument turns red | -| **OCT − / +** | Nothing (off) | - -**Hold a step + turn:** K1-K4 = P-Lock of TONE, TUNE, DECAY or COLOR on that step only · SELECT = accent · ALGORITHM = repeat ×1 to ×4 or FLAM · PRESETS = condition (ALWAYS, FILL ONLY, NO FILL). - -**Fills:** a step with FILL ONLY plays only in the fill, NO FILL only outside it. The fill plays with **AUTO FILL** (console GLO › TEMPO: every 2, 4 or 8 bars) or while you hold black 11 inside ROLL (FILL + ROLL). - -**INSTR** (EDIT again, or ENV): level, tuning, decay and **line length** of each instrument. For example, a 12-step hi-hat against a 16-step kick. - -**SOUND:** the kit's 16 pads; K1-K3 = tone, tuning and decay, K4 = COLOR (shifts each instrument's color). Changing the kit with PRESETS can be undone (HOME + OCT−). +![The BR-8 sequencer](../../assets/screens/02-seq-tr.png) -### ROLL (ARP) - -Like a drum machine's roll button. A tap on **ARP** keeps the screen open (ARP again or HOME closes it); holding ARP shows it only while held. +The sequencer shows 8 instruments (a **sound page**: 1-8 or 9-16) × the 16 steps of the bar you see. Each line has its own playhead. | Control | Does | |---|---| -| **White keys** | The 16 instruments: hold one and it rolls, locked to the bar. Lit medium if it has steps, dim if empty; every hit flashes | -| **Black 1-6** | Rate: 1/8, 1/16, 1/32 and their triplets (8T, 16T, 32T) | -| **Black 7 · 8** | **CRESC** (the roll gets louder) · **DECRESC** (it fades) | -| **Black 11** | The fill plays while held: FILL + ROLL for the build-up | -| **K1-K4** | **RATE** · ramp length of the crescendo (1/4 to 2 bars) · **SWING** (50-75 %) · **TAIL** (the roll keeps going after you let go: OFF, 1/16, 1/8, 1/4) | +| **White keys** | The steps of the selected instrument: tap = set or clear. **Hold a step** and turn **K1** = its accent, **K2** = its repeat (X1-X4 or FLAM) | +| **Black 1-8** | Pick (and hear) an instrument of the sound page | +| **Black 9 · 10** | The previous / next bar, in a circle (dim with one bar only) | +| **Black 11 (RPT)** | **REPEAT**: tap = keep it open (black 11 again closes it), hold = only while held. The white keys cycle X1 › X2 › X3 › X4 › FLAM on each step | +| **OCT − / +** | The sound page: instruments 1-8 or 9-16 | +| **K1-K4** | **LEVEL** of the instrument · **LENGTH** of the whole kit (1-64 steps) · **DECAY** · **TONE** | +| **ALGORITHM** · **PRESETS** | The instrument · the kit | -With **REC** on, the roll is written into the steps as repeats; with a crescendo, the loud hits become accents. The settings are live: they are not saved. +**The layers** (one press opens it, the same button closes it; another button closes it and does its own job). On all of them **black 1-8** pick an instrument without sounding and **black 10 · 11** change the bar. -## Pad sampler (BP-1) +| Button | Layer | White keys | Knobs | +|---|---|---|---| +| **LFO** | **ACCENTS** | Accent on / off on each step (an empty step becomes a hit with accent). The 16 steps are drawn above their keys | K1 = how much accent (the channel's) | +| **ENV** | **SOUND** | Pick and hear an instrument; its hit is drawn | **TUNE · DECAY · TONE · COLOR** (COLOR is named after what it does in that model) | +| **EDIT** | **INSTRUMENT** | Pick an instrument | ALGORITHM = its **model** (any model on any instrument) · K1 MODEL · K2 LEVEL · K3 CHOKE | +| **SCL** | **MUTE SOUNDS** | Mute or unmute each instrument (black 1-8 too) | — | -T2 is a **16-pad sampler**, like a KO II or the drum sampler of an OP-1 field: each pad is a piece of one of your takes, and a grid just like the drums plays them. +![ACCENTS](../../assets/screens/03-seq-accents.png) -**How you work:** +In MUTE SOUNDS the lights are fixed: on = plays, dim = muted, off = no hits. -1. **Record** a take (REC on T2, see [Recorder](#recorder-rec-on-the-sampler)) or upload it from the computer. -2. **The take builds the kit:** if the kit is empty, when the take is saved it is cut on the hits and each cut goes to a pad. The grid is written so it plays like the take; you change it from there. -3. In **TAKES** you choose which take goes to which pad: **N1** builds a new kit on the hits, **N2** in 16 equal parts, **N3** in 8, and **N4** puts the whole take on the selected pad. A kit can mix several takes. -4. In **PADS** you tune each pad: where it starts and ends, its pitch, its level, how it answers the key and its envelope. -5. In **SEQ** you program the pads like the drums, and **BREAK** varies them bar by bar. +BR-8's kicks, snares and hats are the **Plaits** models (Mutable Instruments), which imitate the 808 circuits and 909-style synthetic versions. With **accent** they hit differently, not just louder. -The tabs: **SEQ · PADS · BREAK · TAKES · MIX**. The kit lives in the pattern, like the drum kit; the takes, in the library. - -### SEQ: the pad grid +To record drums live, use [PLAY/REC](#playrec-play-any-channel-from-the-mixer) from HOME. -Just like the drums: one line per pad, 8 on screen. Each pad has its own length. +## The note machines -| Control | Does | -|---|---| -| **White keys** | Steps of the selected pad: tap = set or clear | -| **Black 1-8** | Select and play a pad of the section | -| **Black 9 · 10 · 11** | Step page < and > · other section (pads 1-8 / 9-16); hold 11 = MUTES | -| **K1-K4** | **FILTER** (low-pass) · **PITCH** (±12 semitones) · **DECAY** · **START** (shifts the start of every pad) | -| **Held step + K1-K4** | P-Lock on that step: a pad higher, shorter or from further in, only there | +BB-303, B-MINI, BUNO-6, BITTAL and BX-7 share the same base: -The layers work as on the drums: accent, repeat, erase, **ROLL** (ARP; the white keys are the pads) and per-line lengths in TIME. Inside ROLL, REC records what you play into the pattern, not a sample. +- **Keys:** chromatic from F, played live. **OCT − / +** change the octave when you let go (±3); **both together** set octave and transpose back to 0. +- **PRESETS:** the machine's factory sounds; B-MINI, BITTAL and BUNO-6 also show the sounds you added from the control platform. +- **SEQ:** the channel as a **piano roll**, one page of 16 steps (the page of the playhead when playing, of the cursor when stopped). **SELECT** moves the step cursor. **K2 SPEED** (×2 to ×1/4), **K3 PAGE** (the 16 steps you see), **K4 SCROLL** (the pitches you see). SEQ again = the main page. +- **ARP** (2 pages): **MODE** (OFF, UP, DOWN, INCL, EXCL, RANDOM, ORDER, REPEAT) · **OCTAVE** (1-4) · **RATE** (1/8, 1/16, 1/32) · **GATE** (20-100 %); page 2: **LATCH**. With REC on, the arpeggio is recorded. +- **GLO** (2 pages): **LENGTH** (1-64 steps) · **MACHINE** (only the machines this channel can have now; leave it 2 s on one to load it) · **MIDI CH** · **MIDI OUT** (the channel also sends its notes over USB MIDI on its MIDI CH); page 2: **QUANT** (K3) · **RESET** (K4: turn it and the sound goes back to its preset). The BX-7 has **TRANSP** on K1 of page 2. -### PADS (EDIT): each pad's editor +![The B-MINI's SEQ](../../assets/screens/82-mini-seq.png) -At the top, the **map** of the pad's take, with every pad of that take marked and the zoom box. In the middle, the big **waveform**, with the pad in **cyan brackets** and the other pads of the take with their number. At the bottom, **one cell per white key**, in the same place as the key: filled = it has sound, outlined = the selected pad. The orange line is what is playing. +### Recording (like SLOOP) -**EDIT again** changes page: **TRIM › SOUND › ENV › LOOP** (the current one is amber, top right). ENV also opens the ENV page. +Recording follows SLOOP: **the channel keeps its length**; at the end it goes around and what you play rewrites the steps you touch. Recording never makes a channel longer. -| Page | K1 | K2 | K3 | K4 | -|---|---|---|---|---| -| **TRIM** | START (the end stays) | END (the length) | ZOOM X1-X8 | SNAP: OFF, 1/16, 1/8 | -| **SOUND** | PITCH (±24 st) | LEVEL | PLAY: ONESHOT, KEY, THRU, LOOP | DIR: FWD or REV | -| **ENV** | ATTACK | RELEASE | CHOKE group | TEMPO: follows the BPM or not | -| **LOOP** | LOOP IN | LOOP OUT (WHOLE = the whole pad) | PLAY | — | +- **Playing:** REC records at once. The first time you touch a step in a pass, what was there is replaced; notes added in the same pass make a chord. Steps you don't touch stay. Each note keeps **how long you held it** (never longer than the bar it starts in, nor than the channel). +- **Stopped, outside SEQ:** REC arms (**REC ARMED: PLAY A NOTE**, REC breathes): the first note starts playback and records. PLAY also starts it. +- **Stopped, on SEQ: STEP REC.** The key (or chord) rewrites the step under the cursor and the cursor moves on when you let go; SELECT moves the cursor (skipping steps = rests). Each note is one step long. +- **QUANT** (GLO page 2): how much of your timing is corrected, **25 / 50 / 75 / 100 %** (100 % = exactly on the step). Only the start; the length stays as you held it. +- **REC held 2 s** clears the channel, playing or stopped. -**How the key answers (PLAY):** +### BB-303 -- **ONESHOT:** plays whole even if you let go. -- **KEY:** plays while you hold. -- **THRU:** plays the pad and, held, **keeps going through the rest of the take**. -- **LOOP:** repeats the pad while you hold. With the **LOOP** page it repeats only a section (the OP-1's **sustain loop**): held, that section repeats; when you let go, it plays on to the end of the pad. The section shows in mint over the waveform. +The TB-303, after **Open303**: the 303's filter, the accent circuit, slide and the TB-303's knob ranges, with the TB-03's effects. 12 sounds. -From the grid, KEY and LOOP play for one step. +![BB-303: the panel](../../assets/screens/81-b303-panel.png) -| Key | Does | +| Button | Page | |---|---| -| **White key** | Plays its pad and selects it. With REC + PLAY, the hit goes on its line | -| **N1 · N2 · N3** | CPY copies the pad · PST pastes it on the selected one · CLR empties it | -| **N4 HIT** | Moves the start to the nearest hit | -| **N9 · N10 · N11** | Reverse · half speed · STUTTER, while held | -| **PRESETS** | Another whole take on the selected pad | +| **EDIT** | The **panel**: page 1 **CUTOFF · RESO · ENV MOD · DECAY**; page 2 **TUNING · WAVE** (SAW / SQUARE) **· SLIDE** (its time) **· VOLUME**. ALGORITHM = **ACCENT** | +| **SEQ** | The piano roll (accents in white, slides in green) | +| **SCL** | **ACCENT** of each step: the 16 white keys are the 16 steps of the block (on = accent, dim = has a note); SELECT changes block. SCL again: **SLIDE** of each step | +| **FX** | Page 1 **OVERDRIVE** (DRIVE, TONE, LEVEL, ON); page 2 **DELAY** · DLY ON · **REVERB** · REV ON. DELAY and REVERB are the channel's sends (the same as on HOME). Fixed order: OVERDRIVE › DELAY › REVERB | +| **LFO** | An addition (the 303 has none): **RATE** (1/16 to 8 BARS, locked to the tempo) · **DEPTH** · **WAVE** (SINE, TRIANGLE, SAW UP, SAW DOWN, SQUARE, S&H and the patterns PUMP, GATE, STEPS, 3-3-2, BUILD) · **DEST** (CUTOFF, PITCH, RESO, VOLUME) | +| **ARP** · **GLO** | As on every note machine | -**TEMPO:** a pad that follows the tempo plays at the project BPM / the take's BPM (like a chopped loop). Kits built from a take have it on, and their pads choke each other (group 1), like the original loop. +**Slide live:** press the next key before letting go of the last one (legato) and the note slides; with REC on it is recorded as a slide to the next note. ENV does nothing on the BB-303. -### BREAK (SEQ again) +### B-MINI, BUNO-6 and BITTAL -The idea of X0X's BREAK, on your grid: every bar varies what plays with a seed. **With the four knobs at 0, the grid plays as is** (the default). +The three panel machines share one layout, after the Behringer POLY D: each section of the real panel on its button, the sections as tabs at the top and four big knobs. Under the panel, a drawing of what you edit (the filter curve, the oscillator's wave, the envelope). -- **YOU** row: the pad you programmed on each step. -- **PLAYS** row: what is going to play this bar. In yellow, the steps that changed. Orange line = repeat, **<** = reverse, **H** = half speed, **-** = silence. +| Button | B-MINI (Minimoog) | BUNO-6 (Juno-6) | BITTAL (Vital) | +|---|---|---|---| +| **EDIT** | **FILTER** (CUTOFF, EMPHASIS, CONTOUR, KBD CTRL) · **OSC 1** (RANGE, WAVE, LEVEL, TUNE) · **OSC 2** and **OSC 3** (RANGE, FREQ, WAVE, LEVEL; OSC 3 has the LO range) · **OUTPUT** (NOISE, GLIDE, MODE, VOLUME) | **VCF** (FREQ, RES, ENV, LFO) · **DCO** (RANGE, PULSE, SAW, SUB) · **DCO MOD** (LFO, PWM, PWM MODE, NOISE) · **VCF MOD** (HPF, ENV +/-, KYBD, VELO) · **VCA** (ENV/GATE, VELO, VOLUME) | **OSC 1 / OSC 2** (LEVEL, TRANSP, FRAME, UNISON) · **OSC 1 + / OSC 2 +** (DETUNE, FINE, TABLE) · **FILTER** (MODEL, CUTOFF, RESO, DRIVE) · **FILTER +** (ENV2 AMT, KEYTRK, VELO, ENV2 POS) · **VOICE** (MODE, GLIDE, VELO, VOLUME) | +| **ENV** | **FILTER** and **LOUDNESS** contours (ATTACK, DECAY, SUSTAIN, RELEASE) | One ADSR | **ENV 1** and **ENV 2** (ADSR) | +| **LFO** | RATE · WAVE (TRI, SQUARE) · **MOD MIX** (OSC 3 ↔ LFO) · AMOUNT; page 2 **DEST** (OSC, FILTER, BOTH) | RATE · DELAY | SHAPE · RATE · DEST · AMOUNT; **MACRO 1-2** and **MACRO 3-4**: where each macro goes and how much | +| **ALGORITHM** | CUTOFF | FREQ | CUTOFF | -| Knob | Does | -|---|---| -| **VARY** | How many steps play another pad of the kit | -| **ANCHOR** | The strong beats (1, 5, 9, 13) stay as they are | -| **REPEAT** | Retrigs from 2X to 8X | -| **BREAK** | Reverse, half speed, silences and repeating the previous step | +The same on the three: -**EDIT held + black 4 (CAPT)** writes into the grid what BREAK is doing in this bar. HOME + OCT− undoes it. +- **FX:** page 1 **DISTORTION** (DRIVE, TONE, LEVEL, ON); page 2 **CHORUS** (OFF, I, II; the BUNO-6 also I+II) · **REVERB** (the channel's send) · REV ON. Their **delay is set from HOME** (K3). +- **SCL:** **ACCENT** of each step on the 16 white keys (SELECT = block of 16); SCL again: **GLIDE** of each step. +- **SEQ, ARP, GLO** as on every note machine. -**The drawing** is the mirrored waveform, as on a sampler: the peak in the dark shade and the energy (RMS) on top, in full color. +BITTAL draws under its panel **the waves of its two tables** at their position (the one that plays; silent, the FRAME setting). -## Recorder (REC on the sampler) +![B-MINI › FILTER](../../assets/screens/83-bmini-filter.png) ![BUNO-6 › VCF](../../assets/screens/84-buno-vcf.png) ![BITTAL › OSC 1](../../assets/screens/85-bittal-osc1.png) -Recording, keeping and building the kit are separate steps. +### BX-7 -1. **RECORD:** REC on T2 opens the recorder **armed** (on PADS, REC records what you play into the grid). It starts at the next bar (K1 = START: BAR or NOW). A big number says the seconds **left**: the smaller of the recording RAM (3 s) and the free take memory. White lines mark how many bars fit and the amber one is the limit. REC again = stop; it also stops by itself at the limit. Holding REC on the recorder records only while held. - - Below the number: the free take memory in seconds and KB, and the maximum per take (3 s). - - While recording **the keys are silent** and the delay and buffer-based punch-ins pause (they share the memory). - - The take stays **UNSAVED**: the white keys play it in 16 parts. **It is saved when you stop** the transport, because writing flash stops the audio, and if the kit was empty, it builds it. HOME asks before discarding it: **hold HOME 2 s = discard**; a HOME tap keeps it and goes to the console. -2. **TAKES** (EDIT 2 s on T2, or the tab): the library, with the waveform of the marked take. ALGORITHM picks; K1-K3 = the take's BPM, bars and gain; white keys play it in 16 parts (held: it keeps going). **Black 1 (HIT)** = kit on the hits, **black 2 (16)** = 16 equal parts, **black 3 (8)** = 8, **black 4 (PAD)** = the whole take on the selected pad, **black 11 (DEL)** = delete (asks: keep it held 2 s; its pads become empty). If the kit already has pads, building a new one asks. A yellow dot = the kit uses that take. +The FM-1's own FM engine inside Bubba: 6 operators (msfa, the core of Dexed) and the DX7's 32 algorithms. 31 factory patches; your .syx banks are not offered on the FM-1 for now. -**How much fits:** up to **6 s of takes in total** (8 bits at 16 kHz = 16 KB per second, up to 3 s per take). They live in the 100 KiB flash zone shared with your bank sounds: takes from the bottom and sounds from the top. TAKES shows what is free of the 6 s and how many of your sounds are on top; the [control platform](../../web/control.html) shows all the memory and warns before it fills up. +![BX-7: MAIN](../../assets/screens/80-bx7-main.png) -## Note machines (T3-T6) +| Button | Page | +|---|---| +| **MAIN** (a one-page menu's button again) | The algorithm drawn as on a DX7 (carriers at the bottom, modulators above, feedback as a loop, each operator's level), and **FEEDBACK · BRIGHT · PORTA · KEY VEL** | +| **EDIT** | **Black 1-6 = OP1-OP6**, each in 6 pages (RATES, LEVELS, FREQ, OUTPUT, SCALING, CURVES; EDIT again = next page) · **black 7 PIT** (PITCH RATES, PITCH LEVELS) · **black 8 GLO** (VOICE: ALGORITHM, FEEDBACK, OSC SYNC, TRANSP) · **black 9 MONO · black 10 POLY**. The white keys keep playing | +| **ENV** | ATTACK · DECAY · SUSTAIN · RELEASE, on top of the patch's envelopes | +| **LFO** | Page 1 WAVE · SPEED · PMD · AMD; page 2 DELAY · P SENS · LFO SYNC · OSC SYNC | +| **FX** | Its own chain of six slots, one at a time: **FILTER** (TYPE LP/BP/HP, CUTOFF, RESO), **REVERB** and **DELAY** (SEND: the channel's sends), **DIST** (GAIN, TONE, LEVEL), **CHORUS** and **PHASER** (RATE, DEPTH, MIX); K4 = ON on all. SELECT moves between slots. **SCL** picks up the slot and SELECT moves it along the chain (SCL again places it); REVERB and DELAY always go after the effects. Only the slots that are on process | +| **SEQ · ARP · GLO** | As on every note machine (GLO page 2 has TRANSP) | -- **SEQ:** the page is only about this channel. On top, the page's 16 steps as a **piano roll**: each note at its pitch and with its length (long ones in mint, early or late ones shifted from their step). White keys are those steps (up to 4 notes per step). Below, the channel's bars and the playhead. **Hold a step** and play **black 1-8** to write those notes of the channel's scale (the same one again removes it). Black 9 and 10 turn the step page; 11 = FILL. -- **OCT − / +** shift the octave of everything the keys play, also the scale degrees on black 1-8 in SEQ (O+1 / O-1 at the top). -- **Long note with two white keys:** hold the step where it starts and tap the white key where it ends: the note lasts from one to the other. The lights of the keys it covers stay dimmed, like a trail. -- **Free recording, like a looper:** on an **empty** note channel, REC records with no fixed length (the screen says FREE REC and counts the bars). REC again closes it: the channel keeps the whole bars you played (1 to 4) and every note keeps how long you held it (up to 4 bars). If the channel already has notes, REC records over it with its length. -- **Length in bars:** SEQ held + black 7-10 = 1, 2, 3 or 4 bars. -- **Held step + knobs:** K1-K4 = P-Lock · SELECT = hit (NORMAL › ACCENT › GHOST) · ALGORITHM = probability or fill · PRESETS = length or TIE (glide). -- **FILL (black 11):** a tap keeps the screen open (black 11 again or HOME closes it), holding shows it only while held. While open the fill plays, and the white keys make notes fill-only (again: back to normal); black 9 / 10 turn the page. -- **LOOP (SEQ again):** unquantized looper. K1 ON/OFF · K2 bars (1, 2 or 4). **REC** arms (starts at the bar) › when the loop closes it goes to PLAY › REC again: OVERDUB › REC: PLAY. **REC 2 s** erases the loop. -- **Outside SEQ** the keys play the machine chromatically; with **KEYS IN SCALE** (console GLO › SCALE) the white keys play the scale and the black keys its chords. -- **MIDI OUT** (in the machine GLO): the channel plays and also sends its notes over MIDI on its channel. +ALGORITHM changes the algorithm (with the drawing in view you see it change). OCT held + ALGORITHM = transpose. -### PIANO ROLL view +![BX-7 › EDIT](../../assets/screens/80-bx7-edit.png) ![BX-7 › FX](../../assets/screens/80-bx7-fx.png) -![PIANO ROLL: the whole loop](../../assets/screens/73-pianoroll.png) +## The Slicer (BP-1) -**Machine GLO › VIEW = PIANO ROLL** (ALGORITHM to the right; to the left, NOTES) shows SEQ as the **whole loop** (1 to 4 bars) instead of one page: the pitch rows fit the notes the channel has, a vertical keyboard on the left flashes with what plays, and a white bracket marks the 16 steps the white keys edit (black 9 / 10 move it). With REC on, the notes recorded in this pass are **red**. The keys work exactly as in the normal view. VIEW is a setting of each channel: it stays after power-off. +T6 is a **16-pad sampler**, like a KO II: each pad is a piece of a take (its own start and length; pads may overlap), played by a step grid like the drums'. From HOME with the cursor on T6: **SEQ** opens the grid, **LFO** and **SCL** the grid with their layer, and **EDIT**, **ENV** and **FX** the machine's pages. -### Expressive REC +**How you work:** -With **REC** on a note channel (inside it, or with [SLOOP-REC](#sloop-rec-play-any-channel-from-the-console) from the console), what you play stays as you played it: +1. **Get a take:** upload it from the [control platform](../../web/control.html), or record what is playing with **SMP** (below). +2. **Put it on a pad** (PRESETS = the whole take on the selected pad) and **cut it** in TRIM: **AUTO** (on the hits), **8** or **16** equal parts go to pads 1 to n, and **the sequence is written** so the grid plays like the take. +3. **Tune each pad** (TRIM, SOUND, ENV) and **program the grid** (SEQ). -- **The note keeps its real timing:** the start with its **micro-timing** (how early or late you were, in ticks) and the end with its **gate** (how much of the last step sounded). If the note is still held when the bar ends, it is **cut at the bar**. -- **The knobs stay on the note:** while you hold a note while recording, whatever you turn on K1-K4 stays on that note (P-Lock). -- **Editing the step with REC:** **SELECT** picks a step (red box), **ALGORITHM** its gate (from 10 % staccato to 95 % = the whole step, and 100 % = **TIE**, tied to the next one) and **PRESETS** its micro-timing (−11 to +11 ticks). The header shows the gate you are recording with. +### SEQ: the pad grid -## The machine GLO +![The pad grid](../../assets/screens/93-slicer-seq.png) -![The machine GLO](../../assets/screens/45-machine-glo.png) +Just like the drums: 8 pads per page (OCT −/+ = pads 1-8 or 9-16), the 16 steps of the bar, **black 1-8** pick (and play) a pad, **black 9 · 10** change the bar, **black 11 (RPT)** = REPEAT, and a held step + K1 / K2 = its accent / repeat. -**GLO inside a machine** opens its list; GLO again goes back to the page you were on. SELECT picks the row and ALGORITHM changes it. +| Control | Does | +|---|---| +| **K1-K4** | **LEVEL** of the pad · **LENGTH** of all pads (1-64 steps) · **PITCH** (±24 semitones) · **RELEASE** | +| **ALGORITHM** · **PRESETS** | The pad · its take | +| **LFO** · **SCL** | **ACCENTS** · **MUTE SOUNDS** (as on the drums) | +| **SEQ again** | **LENGTH/SPEED** (below) | +| **EDIT · ENV · FX · GLO** | The machine's pages | -| Machine | Rows | K1-K4 | -|---|---|---| -| **Note machines** | VIEW (NOTES or PIANO ROLL) · LENGTH · SPEED · TRANSPOSE · ACCENT · MIDI OUT (and its MIDI CHANNEL) · INIT SOUND | LENGTH · SPEED · ACCENT · TRANSPOSE | -| **BR-8** | LENGTH · SPEED · ACCENT · INIT KIT | LENGTH · SPEED · ACCENT | -| **BP-1** | LENGTH · SPEED · ACCENT · INTERPOLATION (LINEAR or HERMITE) · INIT | LENGTH · SPEED · ACCENT | +**LENGTH/SPEED** (SEQ again): each pad can have its own length. -On INIT, ALGORITHM to the right asks; leave it 2 s and the sound goes back to its initial settings. To change the machine itself, go to the console (the screen says so: CHANGE: HOLD T4 ON HOME + ALG). +![LENGTH/SPEED](../../assets/screens/94-slicer-length.png) -## The layers (hold) +| Key | Does | +|---|---| +| **White keys** | The **length of the selected pad** (1-16; on = the length, medium = inside it, dim = outside) | +| **Black 1-6** | The channel's **speed**: ×2, ×3/2, ×1, ×3/4, ×1/2, ×1/4 | +| **Black 7-10** | 1, 2, 3 or 4 bars (1BR-4BR) | +| **Black 11 (+16)** | The lengths 17-32, 33-48, 49-64 and back | +| **K1 · K2 · ALGORITHM** | Length of the pad · speed · the pad | -While you hold, the screen draws the keyboard with what each key does and its LEDs; on the drums it shows the 16 instruments. Only the buttons that do something in the layer stay lit. The sequence keeps playing. +### The Slicer's pages -| Hold | Layer | The keys | -|---|---|---| -| **HOME** | The console | White 1-10 = patterns · white 11-16 = go to that machine when you let go · black 1-6 = mute / solo · 7-10 = scenes · 11 = CUE. SELECT = cursor · ALGORITHM = BPM in tenths · PRESETS = pattern (loads when you let go) · K1-K4 = the cursor's mix | -| **SEQ** | Length and speed | White = length (1-16): the length is on, inside it medium, outside dim · **black 11 = +16** (17-32, 33-48, 49-64) · black 1-6 = speed ×2 to ×1/4 · black 7-10 = 1-4 bars (1BR-4BR). K1 = length, K2 = speed | -| **EDIT** | Erase | Playing: holding a white key erases what passes under the playhead; stopped: erases the line or the step · black 1-3 = copy, paste, clear the channel · sampler: black 4 = CAPT (what BREAK does goes into the grid) · **black 6 / 7 = undo / redo** · notes: black 9 / 10 = page · on the console: **black 7-10 clear a scene** | -| **ENV** | Accent | White = accent on / off (empty step = new one with accent; on notes: NORMAL › ACCENT › GHOST) · black 9 / 10 = page. K1 = how much accent | -| **LFO** | Repeat · tie | Grids: white = ×1 › ×2 › ×3 › ×4 › FLAM. Notes: white = tie the note to the next one (K1 = glide). Black 9 / 10 = page. On machines without an LFO page a tap on LFO keeps this layer open | -| **FX** | Punch-in | White = 16 effects quantized to 1/16 · black 1-6 still mute | -| **SCL** | Chords | White = 16 chords · black 1-4 = +7, +9, SUS2, SUS4 | -| **ARP** | Arpeggio · ROLL | Notes: what you play is arpeggiated · grids: the ROLL screen (see Drums): white = roll, black 1-6 = rate, 7-8 = CRESC / DECRESC, 11 = FILL; with REC it is recorded as repeats | -| **SAVE** | Copy pattern | White 1-10 = paste the pattern there · black (1-6) + white = only that channel. If the target has notes, it asks: keep the white key held 2 s | -| **GLO** | Transpose | The whole keyboard transposes the project (C4 = 0) · **PLAY = TAP tempo** without stopping · K1 = BPM, K2 = SWING, K3 = transpose, K4 = octave | +![TRIM](../../assets/screens/90-slicer-trim.png) -## Time (SEQ 2 s) +The white keys are always the 16 pads (play and select; on = selected, medium = has sound). ALGORITHM = the pad, PRESETS = its take. -Shows the 6 channels as bars of their real duration, each with its playhead: polymeter at a glance. SELECT or ALGORITHM pick the channel; K1 = length (1-64); K2 = speed (×2, ×3/2, ×1, ×3/4, ×1/2, ×1/4); K3 and K4 (grids): an instrument and its length. +| Button | Page | K1 | K2 | K3 | K4 | +|---|---|---|---|---|---| +| **EDIT** | **TRIM 1/2**: the waveform of the pad's take with the pad marked | START (the end stays) | LENGTH | ZOOM (X1-X8) | SAMPLE: how many bars **SMP** records (1, 2 or 4, as many as fit) | +| **EDIT again** | **SOUND 2/2** | PITCH (±24 st) | LEVEL | MODE: ONESHOT, KEY, THRU, LOOP | REVERSE (FWD / REV) | +| **ENV** | **ENV** | ATTACK | RELEASE | LOOP IN | LOOP OUT (only in LOOP mode) | +| **FX** | DISTORTION; again CHORUS and REVERB | as on the panel machines | | | | +| **GLO** | **GLO 1/2** | LENGTH (all pads) | — | MIDI CH | MIDI OUT | +| **GLO again** | **GLO 2/2** | — | — | — | RESET (the pads' sound and the FX back to factory; the cuts stay) | -The **master length** (console GLO › TEMPO, K3: 16, 32, 48, 64, 128 or INF) restarts all channels together. Queued patterns change there. +**In TRIM, the black keys:** **AUTO**, **8** and **16** cut the selected pad's take (lit when it has one) and **always rewrite the sequence**; **SMP** (black 11) records **the mix** from the next bar (stopped: it starts with PLAY), for the bars on K4. SMP again stops. The new take is saved when you stop the transport and goes on the selected pad. The header shows **SAMPLING 1.2 S** while it records. -## Scales and chords +**MODE (how a pad answers the key):** **ONESHOT** plays whole even if you let go · **KEY** plays while you hold · **THRU** plays the pad and, held, keeps going through the rest of the take · **LOOP** repeats while you hold, between LOOP IN and LOOP OUT. -- **SCALE** (SCL inside a note machine): each note channel can have its **own scale**. K1 = ROOT, K2 = scale (PROJECT, or one of 9 scales), K3 = BASE CHORD, K4 = KEYS IN SCALE. -- **Project scale:** console GLO › SCALE (SCL on the console, or HOME + SCL): ROOT, SCALE, KEYS IN SCALE and BASE CHORD, used by channels without their own. -- **CHORDS** (SCL again): 16 chords on a 4×4 grid with their degree and name. The color tells their function: **blue** rest (I, iii, vi), **green** preparation (ii, IV), **orange** tension (V, vii). K1 = set (DIATONIC, PROGRESSIONS, NEO SOUL), K2 = voicing (CLOSED, OPEN or LED, voice-led), K3 = octave, K4 = strum. +**REC** inside the Slicer records the pads you play into the grid (while playing); **REC 2 s** clears the sequence. OCT and ARP do nothing here. -## Scenes and song +**How much fits:** up to **6 s of takes in total** (8 bits at 16 kHz), up to about 3 s per take, in up to 8 takes. They share a 100 KiB flash zone with your sounds; the control platform shows all the memory. -**A scene is a set of mutes**: the six channels' mutes and the instrument mutes of BR-8 and BP-1. Scenes belong to the project, not to a pattern, so a scene works on any pattern. They live on **black 7-10** (A-D) of the console, and with HOME held from any screen. +## Saving -![A scene: hold 2 s to store over it](../../assets/screens/69-scene-store-ring.png) +- There are **9 patterns** (01-09), on HOME's white keys. Each keeps its machines, sounds, sequences and its four scenes. +- The flash is **only written when stopped** (writing pauses the audio for a moment). +- **Autosave:** when stopped, 10 s after the last change (patterns, scenes and settings). +- **SAVE** opens its screen; SELECT picks the row, ALGORITHM (or K1, or PRESETS) the target pattern, and **SAVE runs it**: -| Gesture | What it does | +| Row | Does | |---|---| -| **Tap an empty scene** (dim) | Stores the mutes as they are now | -| **Tap a stored scene** (medium) | Launches it on the next bar (stopped: right away). On = the active one, blink = queued | -| **Hold 2 s** | Stores over it (a ring fills: STORE SCENE A) | -| **EDIT held + scene** (on the console) | Clears it | -| **Hold one + tap others** | A **chain**: the first launches on the next bar, the next one at each master cycle | - -**CUE** (black 11): hold it, or tap it to keep it on (it breathes). With CUE, the mutes you tap don't change at once: they blink and **drop together on the next bar**. Stopped, they change right away. Tap CUE again to turn it off. - -![CUE: mutes waiting for the next bar](../../assets/screens/70-cue.png) +| **SAVE** | Saves this pattern (and its scenes if they changed) | +| **SAVE AS** | Saves it in another pattern (the target) | +| **CLEAR PATTERN** | SAVE again within 3 s clears all six channels | -**SONG** (console GLO › SONG, or HOME + SEQ): a list of entries, each one **a pattern and an optional scene**. White 1-10 add a pattern; black 7-10 put that scene on the selected entry (again: remove it); black 11 deletes the selected entry. SELECT picks the entry, ALGORITHM or K1 its pattern, K2 how many times it plays, K4 = song ON/OFF. - -**SONG REC** (REC on GLO › SONG, or HOME + REC): play live and the song writes itself: every pattern change and every scene you launch becomes an entry. Stopped, it is armed and starts with PLAY. - -## Effects - -- **Each channel's MIX** (FX inside a machine): level, pan, **delay** send and **reverb** send. FX again: **duck** (sidechain from the T1 kick). -- **On the console:** each channel's **filter** (K2 on MIX), and on **FX › CHANNEL** its **DRIVE**, **PAN**, **DUCK** and whether **BEAT FX** touches it. -- **FX › DELAY:** time, feedback and mix (up to 0.80 s, so 1/4 gets shorter below 75 BPM) and the sidechain release. **FX › REVERB:** size, damping and mix. -- **FX › MASTER:** the **master filter**, **BEAT FX** and **DRIVE** (saturation of the mix). **MOVE** is PRESETS on FX and GLO. -- **BUNO-6** has its own stereo **chorus** (I, II or I+II, with ALGORITHM). BITTAL's **SPACE** macro adds reverb send. -- **FX held:** 16 punch-ins (stutter, reverse, tape stop, gate, sweeps, bitcrush, SR down, delay throw, echo freeze, kill low/high). A channel with BEAT FX OFF is left out of them. - -## Saving - -- There are **10 patterns** (01-10), on the console's white keys. -- The flash is **only written when stopped** (writing pauses the audio for a moment). -- **Autosave:** when stopped, after 10 s without touching anything (patterns, song and scenes, and settings). -- **SAVE:** save · save as · save song and scenes · erase pattern (SAVE twice) · count events. **SAVE 2 s:** quick save. **HOME + SAVE:** save as. -- **Copying:** SAVE held + white key copies the pattern; HOME + EDIT copies a channel onto another one in the same pattern (notes to notes, hits to hits): ALGORITHM picks the target and **EDIT held 2 s pastes**. Machines don't change. +- **Playing, a save waits:** "SAVES WHEN STOPPED", SAVE blinks, and it is written when you stop. **SAVE 2 s** anywhere = quick save. ## System (HOME 2 s) -Internal or external clock · Split Sync (L = pulse, R = mono mix) · pulse PPQN and latency · autosave · idle **button** brightness (OFF, DIM or MEDIUM; the keys are not affected) · **FAST SCREEN** (test, off by default) and **TWO CORES** (test, off by default) · takes, sounds and free memory · **LANGUAGE** · version. +![SYSTEM](../../assets/screens/25-system-en.png) -**The two tests:** **FAST SCREEN** raises the screen's SPI to 30 MHz (measured: a full frame goes from 85 to 39 ms). **TWO CORES** shares the machines between the FM-1's two cores (on the computer it gives exactly the same samples). The first time you turn it on it is checked to answer; if it hangs, its channels go silent and it retires until you power off, and if a boot with TWO CORES does not reach 5 seconds, it is off on the next boot. They are being tested: if the FM-1 hangs or boots into safe mode, both switch themselves off. The control platform shows TWO CORES under DEVICE when it is on or switched itself off. +SELECT picks the row; ALGORITHM (or K1) changes it. + +| Row | Values | +|---|---| +| **CLOCK** | INTERNAL or EXTERNAL (MIDI) | +| **SYNC OUT** | STEREO, or SPLIT L/R (left = clock pulses, right = mono mix) | +| **IDLE LEDS** | The brightness of idle buttons: OFF, DIM or MEDIUM (the keys are not affected) | +| **LANGUAGE** | English or the loaded pack | +| **VERSION** | The firmware version | ## MIDI -- **Input** (USB and TRS): channels 1-6 = Bubba Machine's channels. On grids, the note picks the instrument (0-15); on the sampler, the pad. -- **External clock:** follows MIDI Clock and Start/Stop. -- **Output:** MIDI Clock when the clock is internal, and the notes of channels with **MIDI OUT**. +- **Input:** MIDI channels 1-6 play the channels in this order: 1 = BR-8 (T1), 2 = BP-1 (T6), 3 = T2, 4 = T3, 5 = T5, 6 = T4. These are also each channel's factory **MIDI CH**. On the drums the note picks the instrument. +- **External clock** (SYSTEM › CLOCK): follows MIDI Clock and Start / Stop. PLAY waits for the clock ("EXT CLOCK: WAITING FOR MIDI"). +- **Output:** MIDI Clock when the clock is internal, and the notes of every channel with **MIDI OUT** on (GLO of the machine), on its **MIDI CH**. ## Control platform -The [control platform](../../web/control.html) manages the FM-1 from Chrome or Edge, over USB (Bubba Machine 0.6.1-beta or newer). It is one page that mirrors the FM-1, and **every change waits until you send it**: you can prepare everything without the FM-1 and send it later. +The [control platform](../../web/control.html) manages the FM-1 from Chrome or Edge, over USB. It is one page that mirrors the FM-1, and **every change waits until you send it**: you can prepare everything without the FM-1 and send it later. - **The bar on top** (it stays in view): whether the FM-1 is connected and which version it runs (with a link to the installer when a newer one is out), the **memory** that takes and sounds share (100 KB: what is used, what your pending changes add or free, and what will be left, in KB and in seconds of take), and the **pending changes** with **Send to FM-1** and **Discard**. Anything that would not fit is marked in red and Send stays off until you fix it. -- **TAKES:** the 8 take places as the FM-1 numbers them, with length, bars and BPM. Drop an audio file (WAV, AIFF, MP3, FLAC or OGG) on a free place, or on a take to replace it. Trim the start and end on the waveform, check the BPM (read from the file name, or guessed) and press **▶ Hear it as the FM-1 plays it**: 16 kHz, 8 bits with dither, exactly what is sent. Up to 3 s per take and 6 s in total. -- **SOUNDS:** one column per machine. Vital presets (.vital) go to B-MINI, BITTAL or BUNO-6 (you pick; changing the machine or the name converts it again), DX7 banks (.syx) to BX-7, and .bsnap files to their own machine. You see what was kept, approximated or left out, can rename it and download the .bsnap. Up to 12 of your sounds; BB-303 only has factory sounds. On the FM-1: on HOME hold the channel's white key (T3-T6), turn ALGORITHM to the machine, then PRESETS. +- **TAKES:** the 8 take places as the FM-1 numbers them, with length, bars and BPM. Drop an audio file (WAV, AIFF, MP3, FLAC or OGG) on a free place, or on a take to replace it. Trim the start and end on the waveform, check the BPM (read from the file name, or guessed) and press **▶ Hear it as the FM-1 plays it**: 16 kHz, 8 bits with dither, exactly what is sent. Up to 3 s per take and 6 s in total. On the FM-1 a take goes on a pad with PRESETS (in the Slicer, or on HOME with the cursor on T6). +- **SOUNDS:** one column per machine. Vital presets (.vital) go to B-MINI, BITTAL or BUNO-6 (you pick; changing the machine or the name converts it again), and .bsnap files to their own machine. You see what was kept, approximated or left out, can rename it and download the .bsnap. Up to 12 of your sounds; on the FM-1 they come after the factory ones on PRESETS. BB-303 and BX-7 only have factory sounds for now. - **SCREEN LANGUAGE:** English (built in), Español (pack included) or your own .bmlang. -- **DEVICE** (folded): firmware, audio load, system memory, how long it has been on, how it last started, the lowest voltages, TWO CORES when it matters, and the device log. +- **DEVICE** (folded): firmware, audio load, system memory, how long it has been on, how it last started, the lowest voltages and the device log. **Send** waits for the transport to stop (writing flash cuts the audio: the page says "Press STOP on the FM-1"). Deletions go first, so they make room; then the rest in order, with a progress bar. Afterwards the page reads the FM-1 again and marks each change **Verified on the FM-1**; anything that failed stays pending with the reason. Without a device, `control.html?mock=1` talks to a simulated FM-1 for development. @@ -512,6 +402,5 @@ The [control platform](../../web/control.html) manages the FM-1 from Chrome or E The screen is in **English**. Other languages are **packs** that are not loaded by default: one pack lives in its own 16 KiB of flash (it does not touch patterns or takes, and a firmware update does not erase it). -- **Load Spanish on the FM-1:** the language pack is a separate add-on with its own 16 KiB zone: load or remove it on the [control platform](../../web/control.html), with the FM-1 connected and the transport stopped. Or from the computer, with the transport stopped, `py -3 tools/fm1/idioma.py lang/es.bmlang`. **SYSTEM › LANGUAGE** then switches between English and the pack. `--quitar` removes it. -- **In the emulator:** the button under *Sampler and memory* loads or removes the Spanish pack. +- **Load Spanish on the FM-1:** on the [control platform](../../web/control.html), with the FM-1 connected and the transport stopped. Or from the computer, with the transport stopped, `py -3 tools/fm1/idioma.py lang/es.bmlang` (`--quitar` removes it). **SYSTEM › LANGUAGE** then switches between English and the pack. - **Making a translation:** copy `lang/plantilla.txt` (every phrase on screen) to `lang/.txt`, write the translation under each phrase and build it with `py -3 tools/gen_lang.py`. The FM-1 font is ASCII: no accents. What you don't translate shows in English. diff --git a/docs/en/ROADMAP.md b/docs/en/ROADMAP.md index b6535fe..91e3017 100644 --- a/docs/en/ROADMAP.md +++ b/docs/en/ROADMAP.md @@ -2,7 +2,7 @@ Everything planned for Bubba Machine. **All of it will be done, step by step**, with no dates: each step ships when it has been tested on the FM-1. The order inside each list is the order that matters today and may change. -Items marked ✓ are already in the current version (0.9.0-beta); items marked **in testing** are there but off by default until measured on the FM-1. Until v1, any version may erase what you saved (see [install](INSTALL.md)). +Items marked ✓ are already in the current version (0.10.0-beta); items marked **in testing** are there but off by default until measured on the FM-1. Until v1, any version may erase what you saved (see [install](INSTALL.md)). ## Audio @@ -35,23 +35,24 @@ The interface organizes the FM-1 into two places: **playing live** (HOME and its **Done** - ✓ **Key strip on screen:** the 11 black and 16 white keys with a short name and the same intensity as their light. - ✓ **English screen, with language packs:** Spanish is loaded separately (`tools/fm1/idioma.py`) and switched in SYSTEM › LANGUAGE. -- ✓ **Pad sampler:** 16 pads made from your takes, like a KO II or an OP-1 field, on a grid like the drums, with BREAK to vary it. -- ✓ **MUTES** and **FILL** screens, and drums in sections of 8. +- ✓ **Slicer:** 16 pads cut from your takes, like a KO II or an OP-1 field, on a step grid like the drums (0.10). +- ✓ **MUTE SOUNDS** on the drums, and drums in pages of 8 instruments. - ✓ **The 0.6 face:** header, viewport, keyboard and dials always in the same place; the **BX-1** mixer on HOME; ALGORITHM as each machine's mode. - ✓ **Expressive REC:** micro-timing, gate and P-Locks of what you turn while holding the note; long notes with two white keys. +- ✓ **Each machine like the real one (0.10):** HOME as a six-channel mixer; entering a channel gives the FM-1 to its machine, with the panel and menus of the TB-303, Minimoog, Juno-6, Vital or DX7; cyclic menu buttons; the BR-8 step sequencer; factory patterns. **Planned: playing live (HOME again = the next page)** 1. **MORPH A·B:** move from one sound state to another with a knob (HOME's fourth macro). -2. ✓ **SCENES AND SONG:** scenes as mutes on the console, CUE, and song entries with a pattern and a scene (0.9). +2. ✓ **SCENES:** four scenes of mutes per pattern on HOME (0.10). The song and CUE of 0.9 were removed in the 0.10 redesign. **Planned: working on a track (the button again = the next page)** 1. **SEQ › LOOP › DICE:** controlled random variations, and the ACID generator for bass lines. 2. **EDIT › SOUND › INSTR:** the A/B drum instrument. 3. **LFO › MOTION:** a modulation sequencer and knob-movement recording. -4. ✓ **Per-channel mix and effects:** the console's FX › CHANNEL (drive, pan, duck, BEAT FX) (0.9). +4. ✓ **Per-channel effects:** each machine has its own effects (DISTORTION, CHORUS, REVERB; OVERDRIVE on the BB-303; the BX-7 chain) (0.10). **Other** -- **Pattern banks:** more than 10 patterns, by growing the flash map or shrinking the patterns. +- **Pattern banks:** more than 9 patterns, by growing the flash map or shrinking the patterns. - **Ghost notes on drums:** a level P-Lock or a bigger format. ## Tools and ecosystem diff --git a/hal/fm1/fm1_boot.c b/hal/fm1/fm1_boot.c index f836026..cbf3e9f 100644 --- a/hal/fm1/fm1_boot.c +++ b/hal/fm1/fm1_boot.c @@ -13,11 +13,14 @@ * [13] FM1_BF_* that happened in this boot, inverted (a bit goes to 0 when it happens) * [16..23] the RAM breadcrumb the previous run left (fm1_rastro), 0xFF if there was none * Programar bits de 1 a 0 no necesita borrar: el sector se borra una vez cada 127 arranques. - * Los arranques seguidos sin "anduvo bien" son arranques fallidos: - * 2 seguidos -> modo seguro (sin sonido, USB activo: se puede reinstalar desde el instalador) - * 4 seguidos -> modo de actualización del chip (USB 4C4A:8057, se rescata desde la computadora) - * Prender y apagar el FM-1 cuatro veces seguidas (menos de 10 s cada vez) lleva también al modo - * del chip, sin depender de ningún botón. */ + * Un arranque sin "anduvo bien" es un arranque fallido solo si el siguiente empezó por un reinicio + * del chip (perro, falla, voltaje bajo...). Si empezó al prenderlo, alguien lo apagó antes de los + * 10 s: no es una falla (2026-10-20, registro del FM-1: las cinco entradas al modo seguro venían + * de dos encendidos cortos seguidos, todos terminados al apagar). + * 2 fallidos seguidos -> modo seguro (sin sonido, USB activo: se puede reinstalar) + * 4 arranques seguidos sin "anduvo bien", por la causa que sea -> modo de actualización del chip + * (USB 4C4A:8057, se rescata desde la computadora). Prender y apagar el FM-1 cuatro veces + * seguidas (menos de 10 s cada vez) lleva ahí sin depender de ningún botón. */ #include "app_config.h" #include "system/includes.h" #include "asm/includes.h" @@ -176,11 +179,17 @@ int fm1_boot_begin(int keys_safe) break; } } - /* arranques seguidos sin la marca de "anduvo bien" (slot == SLOTS: sector lleno) */ + /* arranques seguidos sin la marca de "anduvo bien" (slot == SLOTS: sector lleno); los que + * terminaron con un reinicio del chip, no al apagarlo, son los fallidos */ + uint8_t mot = motivo(), sig = mot; + uint32_t seguidos = 0; fails = 0; - for (i = slot; i > 0 && fails < 8u && rd((i - 1u) * REC + 1u) == 0xFFu; i--) - fails++; - uint8_t mot = motivo(); + for (i = slot; i > 0 && seguidos < 8u && rd((i - 1u) * REC + 1u) == 0xFFu; i--) { + if (fails == seguidos && sig != FM1_RST_POWER && sig != FM1_RST_LONG) + fails++; + seguidos++; + sig = rd((i - 1u) * REC + 3u); /* cómo empezó ese: cómo terminó el anterior */ + } /* core 1 stays retired across resets until the FM-1 is powered on from off */ c1_retirado = slot > 0 && slot <= SLOTS && !(rd((slot - 1u) * REC + 13u) & FM1_BF_C1_RETIRED) && mot != FM1_RST_POWER; if (slot >= SLOTS) /* lleno: empezar de nuevo */ @@ -194,7 +203,7 @@ int fm1_boot_begin(int keys_safe) } if (c1_retirado) fm1_boot_flag(FM1_BF_C1_RETIRED); - if (fails >= FAILS_UBOOT) + if (seguidos >= FAILS_UBOOT) fm1_enter_uboot(); return (keys_safe || fails >= FAILS_SAFE) ? FM1_BOOT_SAFE : FM1_BOOT_NORMAL; } diff --git a/hal/fm1/fm1_consola.c b/hal/fm1/fm1_consola.c index e517662..7797aa8 100644 --- a/hal/fm1/fm1_consola.c +++ b/hal/fm1/fm1_consola.c @@ -191,6 +191,7 @@ void fm1_consola(const uint8_t *m, uint32_t n) fm1_stat[FM1_STAT_UI_MAX] = 0; fm1_stat[FM1_STAT_LOOP_US_MAX] = 0; fm1_stat[FM1_STAT_SCANISR_MAX] = 0; + fm1_stat[FM1_STAT_SCAN_LAT] = 0; responder(0x04, NULL, 0, NULL, 0); break; } diff --git a/hal/fm1/fm1_flash.c b/hal/fm1/fm1_flash.c index 39455ed..93842ad 100644 --- a/hal/fm1/fm1_flash.c +++ b/hal/fm1/fm1_flash.c @@ -60,7 +60,7 @@ static void inval(uint32_t a, uint32_t n) static int dentro(uint32_t a, uint32_t n) { - return a >= FM1_W_LO && n <= FM1_W_HI - FM1_W_LO && a + n <= FM1_W_HI; + return a >= FM1_W_LO && a <= FM1_W_HI && n <= FM1_W_HI - a; /* (a + n podría dar la vuelta) */ } int fm1_flash_read(uint32_t a, void *d, uint32_t n) diff --git a/hal/fm1/fm1_hw.h b/hal/fm1/fm1_hw.h index 5658b0a..2c51cc0 100644 --- a/hal/fm1/fm1_hw.h +++ b/hal/fm1/fm1_hw.h @@ -124,6 +124,7 @@ void fm1_audio_start_mute(int32_t *dma, uint32_t frames_per_half, fm1_audio_rend void fm1_audio_stop(void); void fm1_audio_pause(int on); /* DMA e interrupción en pausa, sin rearmar el codec */ void fm1_scan_pause(int on); +int fm1_scan_vigilar(uint32_t ms); /* bucle principal: rearma un barrido detenido */ uint32_t fm1_audio_halves(void); /* medios buffers calculados */ uint32_t fm1_audio_late(void); /* medios buffers que llegaron tarde (silencio) */ uint32_t fm1_scan_ticks(void); /* interrupciones del barrido (250 us cada una) */ @@ -166,6 +167,8 @@ enum { * bits 16-31 wait turns per microsecond */ FM1_STAT_FRENO_UI, /* brake steps because the UI loop was slower than 60 ms */ FM1_STAT_NAN_FIX, /* NaN resets in the mix (bm_status.nan_fix) */ + FM1_STAT_SCAN_LAT, /* the longest delay of a scan interrupt, us (an LED that stayed on longer) */ + FM1_STAT_SCAN_KICK, /* 0.9.2: times the main loop re-armed a stalled scan timer */ FM1_STAT_N }; diff --git a/hal/fm1/fm1_keys.c b/hal/fm1/fm1_keys.c index 8797868..d4a0f20 100644 --- a/hal/fm1/fm1_keys.c +++ b/hal/fm1/fm1_keys.c @@ -47,8 +47,11 @@ void fm1_keys_init(void) gpio_set_pull_up(ROW_IO[i], 1); gpio_direction_input(ROW_IO[i]); } - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { gpio_direction_output(LED_IO[i], 0); + gpio_set_hd(LED_IO[i], 1); /* salida fuerte en las filas de LEDs, como el de fábrica */ + gpio_set_hd1(LED_IO[i], 1); + } gpio_direction_output(FM1_SR_DATA, 0); gpio_direction_output(FM1_SR_CLK, 0); gpio_direction_output(FM1_SR_LATCH, 0); diff --git a/hal/fm1/fm1_main.c b/hal/fm1/fm1_main.c index 8fda93a..d27e239 100644 --- a/hal/fm1/fm1_main.c +++ b/hal/fm1/fm1_main.c @@ -861,6 +861,8 @@ static void bubba_task(void *p) fm1_flash_init(); fm1_keys_init(); + gpio_direction_output(FM1_LCD_BL, 0); /* PA2 en bajo: sin eso la matriz no lee (SLOOP #167, Felucca 1.1.5.1) */ + os_time_dly(1); for (int i = 0; i < 3; i++) /* OCT- y OCT+ al prender = modo seguro */ fm1_keys_frame(raw, NULL); modo = fm1_boot_begin(((raw[0] >> 4) & 1u) && ((raw[1] >> 4) & 1u)); @@ -977,7 +979,7 @@ static void bubba_task(void *p) if (d) bm_app_encoder(&app, ENC_ROLE[e], d, t); } - if (fm1_scan_is_down(BTN_OCT_DN) && fm1_scan_is_down(BTN_OCT_UP)) { + if (fm1_scan_is_down(BTN_OCT_DN) && fm1_scan_is_down(BTN_OCT_UP) && !app.ctx.st.playing) { /* no sonando (SLOOP) */ if (!combo_t0) combo_t0 = t | 1u; else if (t - combo_t0 > UBOOT_MS) { @@ -988,6 +990,8 @@ static void bubba_task(void *p) } else { combo_t0 = 0; } + if (fm1_scan_vigilar(t)) + fm1_log("barrido detenido: rearmado"); fm1_miga("L3"); midi_bombear(); fm1_miga("L4"); @@ -1048,9 +1052,10 @@ static void bubba_task(void *p) fm1_log("etapa SONANDO anotada"); seen |= 1; } - if (t - t0 > 1000u) + int quieto_audio = !app.ctx.st.playing; /* escribir la flash pausa el audio: sonando, espera (Felucca 1.5.1) */ + if (quieto_audio && t - t0 > 1000u) fm1_boot_stage(E_1S); - if (t - t0 > 5000u) + if (quieto_audio && t - t0 > 5000u) fm1_boot_stage(E_5S); if (t - heap_t > 5000u) { /* memoria libre, para la consola */ heap_t = t; @@ -1058,7 +1063,7 @@ static void bubba_task(void *p) } fm1_miga("L8"); fm1_latido(); - if (!ok && t - t0 > OK_MS) { /* 10 s andando: este arranque fue bueno */ + if (!ok && quieto_audio && t - t0 > OK_MS) { /* 10 s andando: este arranque fue bueno */ fm1_boot_ok(); ok = 1; } diff --git a/hal/fm1/fm1_scan.c b/hal/fm1/fm1_scan.c index bf8f0ac..0975d8f 100644 --- a/hal/fm1/fm1_scan.c +++ b/hal/fm1/fm1_scan.c @@ -23,12 +23,6 @@ static int get_bit(const volatile uint32_t *b, int id) { return (b[id >> 5] >> ( static int raw_at(const fm1_scan *s, int col, int row) { return (s->raw[col] >> row) & 1; } -static void enc_step(fm1_scan *s, int e, int dir) -{ - s->enc_acc[e] = (int16_t)(s->enc_acc[e] + dir); - s->qsub[e] = 0; -} - uint8_t fm1_scan_column(fm1_scan *s, uint8_t rows) { uint8_t c = s->col; @@ -49,37 +43,42 @@ uint8_t fm1_scan_column(fm1_scan *s, uint8_t rows) s->cnt[id] = 0; } } - if (c == FM1_COLS - 1) { /* fin de frame: cuadratura de los 7 encoders */ + /* Fin de frame: cuadratura de los 7 encoders. Como lo dejaron Felucca (su #23, "perillas que saltan") + * y SLOOP después de medir el FM-1: un detent es un ciclo entero (4 transiciones) y la perilla + * descansa en UN estado, el de al prender (se reaprende solo si queda ~1 s quieta en otro). El paso + * se cuenta al volver a ese estado, redondeando a ciclos enteros (2 o más transiciones = uno: se + * perdona una perdida); un salto de dos estados sigue en la dirección que iba. Nunca un segundo + * estado de descanso: con la 0.9, una pausa a medio clic lo aprendía y desde ahí cada clic contaba + * dos veces. */ + if (c == FM1_COLS - 1) { for (int e = 0; e < FM1_ENCS; e++) { int a = raw_at(s, s->map->enc_a[e][0], s->map->enc_a[e][1]); int b = raw_at(s, s->map->enc_b[e][0], s->map->enc_b[e][1]); uint8_t ns = (uint8_t)((a << 1) | b); - if (!s->seeded) { /* al prender, cada perilla está en un detent */ + if (!s->seeded) { /* al prender, cada perilla está en su detent */ s->q[e] = ns; - s->rest[e] = (uint8_t)(1u << ns); + s->rest[e] = ns; continue; } if (ns == s->q[e]) { - if (s->still[e] < 255u && ++s->still[e] == FM1_REST_FRAMES) { - s->rest[e] |= (uint8_t)(1u << ns); /* se quedó aquí: también es un detent */ - if (s->qsub[e] >= 2 || s->qsub[e] <= -2) - enc_step(s, e, s->qsub[e] > 0 ? 1 : -1); + if (s->still[e] < 0xFFFFu && ++s->still[e] == FM1_REST_FRAMES && ns != s->rest[e]) { + s->rest[e] = ns; /* ~1 s quieta aquí: este es el detent */ + s->qsub[e] = 0; } continue; } int8_t d = QDEC[(s->q[e] << 2) | ns]; + if (d) s->qsub[e] = (int8_t)(s->qsub[e] + d); + else if (s->qsub[e] > 0) s->qsub[e] = (int8_t)(s->qsub[e] + 2); /* dos estados de una: un giro rápido */ + else if (s->qsub[e] < 0) s->qsub[e] = (int8_t)(s->qsub[e] - 2); s->q[e] = ns; s->still[e] = 0; - if (!d) - continue; /* salto de dos estados: dirección desconocida */ - s->qsub[e] = (int8_t)(s->qsub[e] + d); - if ((s->rest[e] >> ns) & 1u) { - if (s->qsub[e] >= 2 || s->qsub[e] <= -2) - enc_step(s, e, s->qsub[e] > 0 ? 1 : -1); - else - s->qsub[e] = 0; /* volvió al mismo detent */ - } else if (s->qsub[e] >= 4 || s->qsub[e] <= -4) { - enc_step(s, e, s->qsub[e] > 0 ? 1 : -1); /* un ciclo entero sin pasar por un detent conocido */ + if (s->qsub[e] > 100 || s->qsub[e] < -100) s->qsub[e] = 0; + if (ns == s->rest[e]) { /* de vuelta en el detent: ciclos enteros */ + int n = s->qsub[e] < 0 ? -s->qsub[e] : s->qsub[e]; + n = n >= 2 ? (n + 2) / 4 : 0; + if (n) s->enc_acc[e] = (int16_t)(s->enc_acc[e] + (s->qsub[e] < 0 ? -n : n)); + s->qsub[e] = 0; } } s->seeded = 1; diff --git a/hal/fm1/fm1_scan.h b/hal/fm1/fm1_scan.h index 8cb75ba..c1d8908 100644 --- a/hal/fm1/fm1_scan.h +++ b/hal/fm1/fm1_scan.h @@ -22,8 +22,8 @@ #define FM1_IDS 41 #define FM1_ENCS 7 #define FM1_DEB_PRESS 2 -#define FM1_DEB_RELEASE 8 -#define FM1_REST_FRAMES 24 /* frames quieta en un estado = es un detent (~65 ms a 364 Hz) */ +#define FM1_DEB_RELEASE 4 /* ~11 ms abierta a 364 frames/s (SLOOP ~9 ms): un toque rápido no se pierde */ +#define FM1_REST_FRAMES 364 /* ~1 s quieta fuera del detent: ese es el detent (como SLOOP / Felucca) */ typedef struct { int8_t id[FM1_ROWS][FM1_COLS]; /* ID de tecla/botón o -1 */ @@ -39,8 +39,8 @@ typedef struct { volatile uint32_t edge_bits[2]; /* flancos pendientes; la UI los consume */ uint8_t q[FM1_ENCS]; /* último estado AB */ int8_t qsub[FM1_ENCS]; /* transiciones acumuladas hacia un detent */ - uint8_t rest[FM1_ENCS]; /* estados AB donde descansa (bit por estado) */ - uint8_t still[FM1_ENCS]; /* frames sin cambiar */ + uint8_t rest[FM1_ENCS]; /* el estado AB donde descansa (uno solo) */ + uint16_t still[FM1_ENCS]; /* frames sin cambiar */ uint8_t seeded; volatile int16_t enc_acc[FM1_ENCS]; /* la UI lee y pone a cero */ } fm1_scan; diff --git a/hal/fm1/fm1_scanhw.c b/hal/fm1/fm1_scanhw.c index 0a01ae8..3dfdc36 100644 --- a/hal/fm1/fm1_scanhw.c +++ b/hal/fm1/fm1_scanhw.c @@ -3,14 +3,17 @@ /* Barrido de la matriz por interrupción (TIMER5, una columna cada 250 us ≈ 364 barridos * completos por segundo) y LEDs de botones y teclas con brillo por tiempo encendido. * - * Brillo: cada columna dura 250 us en tres tramos. Al empezar se cambia de columna y se prenden - * los LEDs encendidos (100 %); en los últimos ~37 us se suman los medios (15 %) y en los últimos - * ~10 us los tenues (~4 %). Sin parpadeo: cada LED se prende en cada barrido. (El ojo ve el brillo - * en escala logarítmica: un medio al 50 % casi no se distinguía del 100 % en el aparato.) El tiempo de cada tramo se programa apenas - * entra la interrupción (cambiar de columna tarda ~30 us: programarlo después hacía que el - * temporizador se pasara de largo y el barrido bajó a ~70 columnas por segundo). (Antes el tenue se hacía saltando - * barridos: a 1/16 parpadeaba y a 1/2 no se distinguía del encendido; en el aparato las teclas - * de la batería se veían todas iguales.) + * Brillo (2026-10-20): al empezar la columna se prenden todos sus LEDs y cada uno se apaga cuando + * cumplió su tiempo: tenue ~4 %, medio 15 %, respirando de tenue a pleno, encendido hasta el final. + * Cada apagado es otra interrupción y puede llegar tarde (USB, flash, otra interrupción): la + * cuenta del temporizador al entrar dice cuánto, y ese exceso se descuenta en el próximo barrido + * del mismo LED (si no alcanza, ese barrido no se prende). Antes los tenues eran los últimos + * ~10 us antes de cambiar de columna y cualquier atraso de esa interrupción los estiraba al doble o + * al triple: las luces tenues de los botones de menú temblaban. La respiración ya no salta entre + * pleno y tenue de un barrido a otro (a brillo bajo eran destellos sueltos de 10-15 por segundo). + * (El ojo ve el brillo en escala logarítmica: un medio al 50 % casi no se distinguía del 100 %.) + * El tiempo de cada tramo se programa apenas entra la interrupción (cambiar de columna tarda + * ~30 us: programarlo después hacía que el temporizador se pasara de largo). * * Cada interrupción: lee las filas de la columna que se eligió en la anterior (ya asentadas), * se las pasa a fm1_scan (antirrebote y perillas, código portable probado en PC), apaga los @@ -44,11 +47,16 @@ static const fm1_scan_map MAPA = { static fm1_scan scan; static uint8_t nivel[FM1_IDS]; /* LED_OFF, LED_DIM, LED_ON, LED_BLINK, LED_BREATH */ -static uint32_t vueltas, prd = 1, prd_tenue = 1, cnt_us = 1; +static uint32_t vueltas, prd = 1, prd_tenue = 1, prd_medio = 1, cnt_us = 1, minimo = 1; static volatile uint32_t ticks, isr_n; -static volatile uint8_t tramo, leds_llenos, leds_medios, leds_tenues; -static uint32_t prd_medio = 1; -static int en_marcha; +static int en_marcha, pausado; + +/* la columna en curso: los apagados que faltan (tiempo desde que entró la interrupción de la + * columna, en ticks del temporizador, y qué filas), lo prendido y desde cuándo */ +static uint8_t col, prendidas, ev_n, ev_i, ev_filas[5]; +static uint16_t ev_t[5], fila_t[5], t_luz; +static volatile uint32_t col_t, prog; /* ticks de la columna hasta la última entrada; el período programado */ +static int16_t deuda[FM1_NCOL][5]; /* lo que cada LED estuvo prendido de más (ticks) */ #define PA_BIT(n) (1u << (n)) @@ -85,32 +93,59 @@ static inline void columna(uint32_t p) /* 16 bits a los 74HC595, el bit 15 JL_PORTA->OUT &= ~PA_BIT(1); } -/* filas de la columna c para la vuelta v: *todas = las que se prenden al empezar la columna, - * devuelve las que siguen prendidas después del tramo tenue */ -static uint8_t filas_led(uint32_t c, uint32_t v, uint8_t *todas, uint8_t *medio) +/* el tiempo de la fila r de la columna c en la vuelta v, en ticks: 0 apagada, prd encendida todo */ +static uint32_t tiempo_led(uint32_t c, int r, uint32_t v) { - uint8_t lleno = 0, tenue = 0, med = 0; + int id = MAPA.id[r][c]; + if (id < 0) + return 0; + switch (nivel[id]) { + case LED_ON: return prd; + case LED_DIM: return prd_tenue; + case LED_MID: return prd_medio; + case LED_BLINK: return (v / 91u) & 1u ? prd : 0; /* ~2 Hz: parpadeo a propósito */ + case LED_BREATH: { /* de tenue a encendido, ~2.8 s */ + uint32_t t = (v / 4u) & 255u, b = t < 128u ? t : 255u - t; /* 0..127 */ + return prd_tenue + (prd - prd_tenue) * b * b / (127u * 127u); /* curva: el ojo es logarítmico */ + } + default: return 0; + } +} + +/* Columna nueva: cuánto le toca a cada fila (menos lo que se pasó en el barrido anterior) y los + * apagados ordenados. Devuelve las filas que se prenden. */ +static uint8_t columna_plan(uint32_t c, uint32_t v) +{ + uint8_t luz = 0; + ev_n = ev_i = 0; for (int r = 1; r <= 4; r++) { - int id = MAPA.id[r][c]; - if (id < 0) + uint32_t t = tiempo_led(c, r, v); + fila_t[r] = 0; + if (!t) continue; uint8_t m = (uint8_t)(1u << r); - switch (nivel[id]) { - case LED_ON: lleno |= m; break; - case LED_DIM: tenue |= m; break; - case LED_MID: med |= m; break; - case LED_BLINK: if ((v / 91u) & 1u) lleno |= m; break; /* ~2 Hz: parpadeo a propósito */ - case LED_BREATH: { /* de tenue a encendido, ~2.8 s */ - uint32_t t = (v / 4u) & 255u, b = t < 128u ? t : 255u - t; /* 0..127 */ - if (((v * 37u) & 127u) < b) lleno |= m; else tenue |= m; /* fracción de vueltas a pleno */ - break; - } - default: break; + if (t >= prd) { luz |= m; continue; } /* hasta el final de la columna */ + int32_t q = (int32_t)t - deuda[c][r]; + if (q < (int32_t)minimo / 2) { /* debe más de lo que le toca: esta vez no */ + deuda[c][r] = (int16_t)(deuda[c][r] - (int32_t)t); + continue; } + if (q < (int32_t)minimo) q = (int32_t)minimo; + if (q > (int32_t)(prd - 4u * minimo)) q = (int32_t)(prd - 4u * minimo); + fila_t[r] = (uint16_t)t; + luz |= m; + int i = ev_n; /* insertar ordenado */ + while (i > 0 && ev_t[i - 1] > q) { ev_t[i] = ev_t[i - 1]; ev_filas[i] = ev_filas[i - 1]; i--; } + ev_t[i] = (uint16_t)q; ev_filas[i] = m; ev_n++; + } + for (int i = 1; i < ev_n;) { /* casi al mismo tiempo: un solo apagado */ + if ((uint32_t)(ev_t[i] - ev_t[i - 1]) < minimo) { + ev_filas[i - 1] |= ev_filas[i]; + for (int k = i; k + 1 < ev_n; k++) { ev_t[k] = ev_t[k + 1]; ev_filas[k] = ev_filas[k + 1]; } + ev_n--; + } else i++; } - *todas = (uint8_t)(lleno | tenue | med); - *medio = med; - return lleno; + return luz; } /* Perro guardián del bucle principal. Si el bucle no late en 3 s, se anotan la miga y el @@ -169,30 +204,58 @@ int fm1_cuelgue_previo(char out[5]) return hay; } +/* Lo que se programa: el próximo apagado o, si no queda ninguno, el final de la columna. Los + * tiempos van desde la entrada de la interrupción de la columna; ahora = cuándo entró esta (la + * cuenta del temporizador empezó en 0 ahí) y ya va CNT desde entonces. + * La cuenta es de 32 bits: si ya pasó el límite cuando se escribe (otra interrupción o un fallo de + * caché entre leer CNT y escribir PRD), el temporizador sigue hasta dar la vuelta, ~71 s sin teclas + * ni luces (pasó en el aparato cambiando presets de la BX-7, 2026-10-21). Por eso se revisa. */ +static void programar(uint32_t ahora) +{ + uint32_t fin = ev_i < ev_n ? t_luz + ev_t[ev_i] : prd, p = minimo; + for (int k = 0; k < 4; k++) { + uint32_t ya = JL_TIMER5->CNT; + p = fin > ahora + ya + minimo ? fin - ahora : ya + minimo; + JL_TIMER5->PRD = p; + if (JL_TIMER5->CNT < p) + break; + } + if (JL_TIMER5->CNT >= p) { /* no hubo caso: la columna se corre un poco, nada más */ + JL_TIMER5->CNT = 0; + p = minimo; + JL_TIMER5->PRD = p; + } + prog = p; +} + static ___interrupt void scan_isr(void) { if (!(JL_TIMER5->CON & BIT(15))) return; + /* cuánto llegó tarde (la cuenta siguió desde el límite), y el tramo siguiente se mide desde + * ahora: si no, con un atraso largo la cuenta ya habría pasado el límite nuevo y el + * temporizador seguiría hasta dar la vuelta (en el aparato el barrido bajó a ~180 columnas/s) */ + uint32_t tarde = JL_TIMER5->CNT; + JL_TIMER5->CNT = 0; JL_TIMER5->CON |= BIT(14); isr_n++; - /* el tramo siguiente se mide desde ahora: si la interrupción llegó tarde (USB o flash con las - * interrupciones apagadas), la cuenta ya habría pasado el límite y el temporizador seguiría - * hasta dar la vuelta (en el aparato el barrido bajó a ~180 columnas/s después de PLAY) */ - JL_TIMER5->CNT = 0; - if (tramo == 1) { /* últimos ~37 us: se suman los medios */ - JL_TIMER5->PRD = prd_medio - prd_tenue; - leds(leds_llenos | leds_medios); - tramo = 2; - return; - } - if (tramo == 2) { /* últimos ~31 us: se suman los tenues */ - JL_TIMER5->PRD = prd_tenue; - leds(leds_llenos | leds_medios | leds_tenues); - tramo = 0; + uint32_t ahora = col_t + prog + tarde; /* desde que entró la interrupción de esta columna */ + if (tarde / cnt_us > fm1_stat[FM1_STAT_SCAN_LAT]) + fm1_stat[FM1_STAT_SCAN_LAT] = tarde / cnt_us; + if (ev_i < ev_n) { /* un apagado: lo que estuvo de más queda debiendo */ + uint8_t m = ev_filas[ev_i++]; + prendidas &= (uint8_t)~m; + leds(prendidas); + for (int r = 1; r <= 4; r++) + if ((m >> r) & 1u) { + int32_t d = deuda[col][r] + (int32_t)(ahora - t_luz) - (int32_t)fila_t[r]; + deuda[col][r] = (int16_t)(d > (int32_t)prd ? (int32_t)prd : d < -(int32_t)prd ? -(int32_t)prd : d); + } + col_t = ahora; + programar(ahora); return; } - JL_TIMER5->PRD = prd - prd_medio; /* columna nueva: casi todo el tiempo, solo los encendidos */ - uint8_t todas, sig = fm1_scan_column(&scan, filas()); + uint8_t sig = fm1_scan_column(&scan, filas()); /* columna nueva */ leds(0); columna(sig); ticks++; @@ -200,12 +263,12 @@ static ___interrupt void scan_isr(void) vueltas++; if ((ticks & 4095u) == 0) /* ~1 vez por segundo */ perro(); - uint8_t med; - leds_llenos = filas_led(sig, vueltas, &todas, &med); - leds_medios = med; - leds_tenues = (uint8_t)(todas & ~leds_llenos & ~med); - leds(leds_llenos); - tramo = 1; + col = sig; + prendidas = columna_plan(sig, vueltas); + t_luz = (uint16_t)JL_TIMER5->CNT; /* los tiempos de cada LED cuentan desde que se prende */ + leds(prendidas); + col_t = 0; + programar(0); uint32_t us = JL_TIMER5->CNT / cnt_us; /* lo que tardó esta interrupción */ if (us > fm1_stat[FM1_STAT_SCANISR_MAX]) fm1_stat[FM1_STAT_SCANISR_MAX] = us; @@ -226,8 +289,12 @@ void fm1_scan_start(void) prd_tenue = prd / 25u ? prd / 25u : 1u; /* ~4 %: lo disponible */ prd_medio = prd * 15u / 100u; /* 15 %: lo que tiene contenido (al 50 % casi no se distinguía del 100 %) */ cnt_us = prd / 250u ? prd / 250u : 1u; - tramo = 0; - request_irq(IRQ_TIMER5_IDX, 3, scan_isr, 0); + minimo = 2u * cnt_us; /* dos apagados a menos de 2 us van juntos */ + ev_n = ev_i = 0; + col_t = 0; + prog = prd; + /* por encima del audio y del USB (como el firmware de fábrica): un atraso aquí es luz de más */ + request_irq(IRQ_TIMER5_IDX, 5, scan_isr, 0); JL_TIMER5->CON = BIT(14); JL_TIMER5->CNT = 0; JL_TIMER5->PRD = prd; @@ -244,18 +311,48 @@ void fm1_scan_pause(int on) if (on) { con = JL_TIMER5->CON; JL_TIMER5->CON = BIT(14); /* parado y sin aviso pendiente */ + leds(0); /* sin barrido, una columna quedaría prendida a pleno */ + pausado = 1; } else { + if (JL_TIMER5->CNT >= JL_TIMER5->PRD) /* (ver programar: con la cuenta pasada daría la vuelta) */ + JL_TIMER5->CNT = 0; JL_TIMER5->CON = (con & ~BIT(15)) | BIT(14); + pausado = 0; } } +/* La red de abajo, desde el bucle principal: si el barrido no cambió de columna en 20 ms sin estar + * en pausa, se rearma (la cuenta a 0 y el temporizador prendido) y se cuenta. Devuelve 1 si rearmó. */ +int fm1_scan_vigilar(uint32_t ms) +{ + static uint32_t visto_t, visto_ms; + if (!en_marcha || pausado || ticks != visto_t) { + visto_t = ticks; + visto_ms = ms; + return 0; + } + if (ms - visto_ms < 20u) + return 0; + int hubo = 0; + CPU_CRITICAL_ENTER(); + if (ticks == visto_t && !pausado) { + JL_TIMER5->CNT = 0; + JL_TIMER5->CON |= BIT(0); + fm1_stat[FM1_STAT_SCAN_KICK]++; + hubo = 1; + } + CPU_CRITICAL_EXIT(); + visto_ms = ms; + return hubo; +} + void fm1_scan_stop(void) { if (!en_marcha) return; JL_TIMER5->CON = BIT(14); leds(0); - en_marcha = 0; + en_marcha = pausado = 0; } int fm1_scan_edge(int *down) @@ -283,24 +380,27 @@ uint32_t fm1_scan_ticks(void) { return ticks; } /* ticks del timer (clk_get("timer"), 60 MHz) desde que arrancó el barrido: para medir tramos * cortos con resolución de ~17 ns (fm1_bench.c, core/bm_prof.h). Da la vuelta cada ~71 s. */ -uint32_t fm1_scan_now_ticks(void) +/* lo que va de la columna en curso, en ticks (hasta prd) */ +static uint32_t en_columna(uint32_t *n) { - uint32_t a, c, b, pend, f, t; + uint32_t a, c, b, pend, base, p; do { a = isr_n; c = JL_TIMER5->CNT; pend = JL_TIMER5->CON & BIT(15); - f = tramo; - t = ticks * prd; + base = col_t; + p = prog; + *n = ticks; b = isr_n; } while (a != b); - if (f == 1) - t += pend ? prd - prd_medio : c; - else if (f == 2) - t += pend ? prd - prd_tenue : prd - prd_medio + c; - else - t += pend ? prd : prd - prd_tenue + c; - return t; + base += pend ? p + c : c; + return base < prd ? base : prd; +} + +uint32_t fm1_scan_now_ticks(void) +{ + uint32_t n, c = en_columna(&n); + return n * prd + c; } uint32_t fm1_scan_ticks_hz(void) { return prd * 4000u; } @@ -308,22 +408,8 @@ uint32_t fm1_scan_ticks_hz(void) { return prd * 4000u; } /* microsegundos desde que arrancó el barrido: columnas * 250 + lo que va de la actual */ uint32_t fm1_scan_now_us(void) { - uint32_t a, c, b, pend, f, us; - do { - a = isr_n; - c = JL_TIMER5->CNT; - pend = JL_TIMER5->CON & BIT(15); - f = tramo; - us = ticks * 250u; - b = isr_n; - } while (a != b); - if (f == 1) /* primera mitad de la columna */ - us += pend ? (prd - prd_medio) / cnt_us : c / cnt_us; - else if (f == 2) /* segunda mitad, antes de los tenues */ - us += pend ? (prd - prd_tenue) / cnt_us : (prd - prd_medio + c) / cnt_us; - else /* los últimos ~31 us */ - us += pend ? 250u : (prd - prd_tenue + c) / cnt_us; - return us; + uint32_t n, c = en_columna(&n); + return n * 250u + c / cnt_us; } void fm1_scan_led(int id, uint8_t level) diff --git a/hal/fm1/fm1_update.c b/hal/fm1/fm1_update.c index 8c95a3e..0912b30 100644 --- a/hal/fm1/fm1_update.c +++ b/hal/fm1/fm1_update.c @@ -285,6 +285,7 @@ static void sesion(fm1_update_show show) return; } show(5, 0); + fm1_boot_ok(); /* reinicio pedido: no es un arranque fallido */ os_time_dly(30); local_irq_disable(); memcpy((void *)UPDATA_FLAG_ADDR, parm, sizeof parm); diff --git a/hal/fm1/fm1_usb_midi.c b/hal/fm1/fm1_usb_midi.c index aee2239..4e5614d 100644 --- a/hal/fm1/fm1_usb_midi.c +++ b/hal/fm1/fm1_usb_midi.c @@ -332,7 +332,7 @@ uint32_t fm1_midi_lost(void) { return tx_perdidos; } #define SYX_MAX 1024 static u8 syx[SYX_MAX], listo[SYX_MAX]; static u32 syx_n, listo_n; -#define CORTOS 32 +#define CORTOS 128 /* mensajes cortos esperando al bucle principal */ static u8 cortos[CORTOS][3]; static u8 c_w, c_r; @@ -349,6 +349,8 @@ static void corto(u8 a, u8 b, u8 c) static void bombear(void) { while (rx_r != rx_w && !listo_n) { + if ((u8)((c_w + 1u) % CORTOS) == c_r) + break; /* llena: el resto espera en rxq (un note-off no se pierde; SLOOP) */ u8 *p = rxq[rx_r]; u8 cin = p[0] & 0x0F, k = 0; rx_r = (u16)((rx_r + 1u) % RXQ); @@ -358,7 +360,7 @@ static void bombear(void) case 0x6: k = 2; break; case 0x7: k = 3; break; default: - if (cin >= 0x8 || cin == 0x2 || cin == 0x3) + if ((cin >= 0x8 || cin == 0x2 || cin == 0x3) && (p[1] & 0x80u)) /* sin byte de estado: mal formado */ corto(p[1], p[2], p[3]); continue; } diff --git a/lang/es.bmlang b/lang/es.bmlang index 6571883..b2f14df 100644 Binary files a/lang/es.bmlang and b/lang/es.bmlang differ diff --git a/lang/plantilla.txt b/lang/plantilla.txt index 58c7b26..9c8d63c 100644 --- a/lang/plantilla.txt +++ b/lang/plantilla.txt @@ -2,120 +2,90 @@ # Para traducir: copia este archivo a lang/.txt, pon "# NOMBRE: ..." arriba y # escribe "= traduccion" debajo de cada frase. Lo que no traduzcas se ve en ingles. -# core/bm_ui_draw.c - REV - -# core/bm_ui_draw.c - SYNC +# core/bm_panel.c + AMT # core/bm_app.c EMPTY -# core/bm_ui_draw.c -%d BARS %d/%d NOTES %s +# core/bm_panel.c + TO -# core/bm_ui_draw.c -%d BARS %s +# core/bm_slicer.c +%d PADS + SEQUENCE # core/bm_ui_draw.c -%d BPM %d BAR %u.%uS +%d+%d, FREE %u.%uS # core/bm_input.c -%d EVENTS - -# core/bm_ui_draw.c -%d PADS - -# core/bm_input.c core/bm_ui_draw.c -%d STEPS +%s ALREADY ON T%d -# core/bm_ui_draw.c -%d+%d, FREE %u.%uS +# core/bm_bx7.c ++EXP -# core/bm_app.c core/bm_input.c -%s ALREADY ON T%d +# core/bm_bx7.c ++LIN -# core/bm_input.c -%s ERASED +# core/bm_bx7.c +-EXP -# core/bm_input.c -%s LENGTH +# core/bm_bx7.c +-LIN # core/bm_printf.c 0123456789ABCDEF -# core/bm_app.c +# core/bm_params.c 1 BAR -# core/bm_ui_draw.c -1 BAR = %u.%u S - -# core/bm_app.c +# core/bm_params.c 2 BARS # core/bm_input.c -2 S = YES ANY CONTROL = NO +2 HEAVY ON -# core/bm_input.c -4 NOTES PER STEP +# core/bm_params.c +4 BARS -# core/bm_input.c -A%02d ALREADY HAS DATA +# core/bm_params.c +8 BARS # core/bm_app.c A%02d QUEUED -# core/bm_input.c +# core/bm_ui_draw.c ACC -# core/bm_input.c core/bm_params.c core/bm_ui_draw.c +# core/bm_b303.c core/bm_input.c core/bm_panel.c core/bm_params.c core/bm_ui_draw.c ACCENT -# core/bm_ui_draw.c -ACCENT OPENS THE FILTER - TIE = SLIDE - # core/bm_input.c -ADD A PATTERN FIRST - -# core/bm_ui_draw.c -AGAIN: +ACCENTS -# core/bm_input.c core/bm_params.c core/bm_ui_draw.c +# core/bm_bx7.c core/bm_ui_draw.c ALG -# core/bm_ui_draw.c -ALG = MACHINE PRE = SOUND - # core/bm_input.c ALGO -# core/bm_params.c core/bm_ui_draw.c +# core/bm_bx7.c core/bm_ui_draw.c ALGORITHM -# core/bm_ui_draw.c -ALGORITHM = CHORUS - -# core/bm_ui_draw.c -ALGORITHM PICKS THE TARGET - HOLD EDIT 2 S = PASTE +# core/bm_input.c +ALGORITHM = THIS DRUM'S SOUND K1-K3 # core/bm_ui_draw.c -ALL AT 0: THE GRID AS IS - -# core/bm_input.c core/bm_ui_draw.c ALWAYS -# core/bm_ui_draw.c -ALWAYS ON IN THIS TRACK - -# core/bm_input.c -ALWAYS PLAYS - -# core/bm_params.c +# core/bm_bx7.c AMD -# core/bm_params.c +# core/bm_panel.c core/bm_params.c AMOUNT +# core/bm_bx7.c +AMP MOD + # core/bm_drums.cpp ANALOG HAT @@ -125,81 +95,36 @@ ANALOG KICK # core/bm_drums.cpp ANALOG SNARE -# core/bm_input.c -ANCHOR - -# core/bm_ui_draw.c -ANY OTHER CONTROL = NO - # core/bm_ui_draw.c ARMED -# core/bm_input.c -ARMED: PLAY TO RECORD - -# core/bm_app.c core/bm_input.c +# core/bm_b303.c core/bm_bx7.c ARP -# core/bm_input.c -ARP GATE - -# core/bm_input.c -ARP MODE - -# core/bm_input.c -ARP OCTAVES - -# core/bm_input.c -ARP RATE - -# core/bm_input.c -ARPEGGIO - -# core/bm_drums.cpp core/bm_input.c core/bm_params.c +# core/bm_bx7.c core/bm_drums.cpp core/bm_panel.c core/bm_params.c core/bm_slicer.c ATTACK -# core/bm_ui_draw.c -ATTACK, RELEASE, CHOKE GROUP, TEMPO SYNC - -# core/bm_input.c -AUTO FILL - -# core/bm_input.c -AUTOMATIC FILL +# core/bm_slicer.c +AUTO # core/bm_ui_draw.c AUTOSAVE -# core/bm_ui_draw.c -AVAILABLE - -# core/bm_pattern.c +# core/bm_panel.c core/bm_pattern.c B-MINI -# core/bm_input.c -B-MINI MODE +# core/gen/bm_fm_rom.c +BANANAMR -# core/bm_ui_draw.c -B1 = ACCENT +# core/bm_input.c core/bm_ui_draw.c +BAR %d/%d # core/bm_ui_draw.c -BACK - -# core/bm_input.c -BAR - -# core/bm_input.c -BARS - -# core/bm_input.c -BASE CHORD +BAR %d/%d %d STEPS -# core/bm_pattern.c +# core/bm_b303.c core/bm_pattern.c BB-303 -# core/bm_input.c -BB-303 WAVEFORM - # core/bm_acid.cpp BB-303 voice does not fit the shared pool (bm_vpool.h) @@ -224,27 +149,12 @@ BD808 # core/bm_drums.cpp BD909 -# core/bm_input.c core/bm_ui_draw.c -BEAT FX - # core/bm_params.c BIG BEAT -# core/bm_input.c core/bm_ui_draw.c -BIT - -# core/bm_pattern.c +# core/bm_panel.c core/bm_pattern.c BITTAL -# core/bm_input.c -BLACK %d - -# core/bm_ui_draw.c -BLACK 4 = THE TAKE ON PAD %d - -# core/bm_ui_draw.c -BLACK 4 = THE TAKE ON THIS PAD - # core/bm_params.c BLIP @@ -260,7 +170,10 @@ BLP # core/bm_params.c BOMBAY 82 -# core/bm_params.c +# core/bm_panel.c +BOTH + +# core/bm_bx7.c core/bm_panel.c core/bm_params.c BP # core/bm_pattern.c @@ -269,26 +182,29 @@ BP-1 # core/bm_input.c core/bm_ui_draw.c BPM -# core/bm_input.c -BPM .1 - # core/bm_pattern.c BR-8 # core/gen/bm_fm_rom.c BRASS 80 -# core/bm_app.c core/bm_input.c core/bm_ui_draw.c +# core/bm_bx7.c BREAK +# core/bm_bx7.c core/bm_params.c +BRIGHT + +# core/gen/bm_fm_rom.c +BRTHLESS + # core/bm_snap.c BUBBA -# core/bm_pattern.c -BUNO-6 +# core/bm_params.c +BUILD -# core/bm_input.c -BUNO-6 CHORUS +# core/bm_panel.c core/bm_pattern.c +BUNO-6 # core/gen/bm_fm_rom.c BUZZ @@ -299,78 +215,39 @@ BX-1 # core/bm_pattern.c BX-7 -# core/bm_input.c -BX-7 ALGORITHM - # core/bm_app.c BX-7 BANK: %d VOICES # core/bm_fm.cpp BX-7 voice does not fit the shared pool (bm_vpool.h) -# core/bm_input.c -CANCELED - -# core/bm_input.c -CANNOT BE UNDONE - -# core/bm_input.c -CAPT - -# core/bm_input.c -CAPTURED: %d STEPS - # core/bm_input.c CB # core/bm_snap.c CC0 -# core/bm_input.c -CC1 MOD - -# core/bm_input.c -CC74 - # core/bm_input.c CG # core/bm_input.c CH -# core/bm_input.c -CHAIN OF %d PATTERNS - -# core/bm_input.c -CHAIN OF %d SCENES - -# core/bm_ui_draw.c -CHANGE: HOLD T%d ON HOME + ALG - -# core/bm_input.c core/bm_ui_draw.c -CHANNEL - # core/bm_params.c CHICAGO 86 # core/gen/bm_fm_rom.c CHIMES -# core/bm_input.c core/bm_params.c +# core/bm_params.c CHOKE -# core/bm_input.c -CHORD - -# core/bm_input.c -CHORD SET - -# core/bm_app.c core/bm_input.c core/bm_ui_draw.c -CHORDS - -# core/bm_input.c core/bm_params.c +# core/bm_bx7.c core/bm_panel.c core/bm_params.c core/bm_slicer.c CHORUS +# core/bm_panel.c core/bm_slicer.c +CHORUS REVERB + # core/bm_input.c CL @@ -392,6 +269,9 @@ CLAVI # core/bm_ui_draw.c CLEAR PATTERN +# core/bm_ui_draw.c +CLEAR T%d + # core/bm_ui_draw.c CLEAR? SAVE AGAIN @@ -404,39 +284,21 @@ CLOCK: EXTERNAL (MIDI) # core/bm_input.c CLOCK: INTERNAL -# core/bm_input.c -CLOSED - -# core/bm_input.c -CLR +# core/bm_bx7.c +COARSE -# core/bm_input.c core/bm_params.c +# core/bm_params.c COLOR -# core/bm_input.c -COND - # core/bm_params.c CONGA -# core/bm_params.c +# core/bm_panel.c core/bm_params.c CONTOUR # core/bm_params.c CONTROL -# core/bm_input.c -COPY A%02d TO A%02d? - -# core/bm_input.c -COPY PATTERN - -# core/bm_input.c -COPY T%d TO A%02d? - -# core/bm_ui_draw.c -COPY TRACK - # core/bm_params.c COWB @@ -452,31 +314,22 @@ CP # core/bm_ui_draw.c CPU! -# core/bm_input.c -CPY - # core/bm_input.c CR # core/bm_params.c CRASH -# core/bm_input.c -CRE - -# core/bm_input.c core/bm_ui_draw.c -CRESC - -# core/bm_input.c core/bm_ui_draw.c -CUE +# core/gen/bm_fm_rom.c +CRISP BS -# core/bm_input.c -CUE OFF +# core/bm_bx7.c +CURVES -# core/bm_input.c -CUE: MUTES AND SCENES ON THE NEXT BAR +# core/bm_ui_draw.c +CUT OFF -# core/bm_params.c +# core/bm_b303.c core/bm_bx7.c core/bm_panel.c core/bm_params.c CUTOFF # core/bm_input.c @@ -485,55 +338,34 @@ CY # core/bm_params.c CYMBL -# core/bm_input.c -DAMP - -# core/bm_input.c -DB - -# core/bm_params.c +# core/bm_panel.c core/bm_params.c DCO +# core/bm_panel.c +DCO MOD + # core/bm_params.c DCO WAVE -# core/bm_input.c -DEC - -# core/bm_input.c core/bm_params.c +# core/bm_b303.c core/bm_bx7.c core/bm_panel.c core/bm_params.c core/bm_ui_draw.c DECAY -# core/bm_input.c core/bm_ui_draw.c -DECRESC - -# core/bm_input.c -DEL - -# core/bm_input.c core/bm_params.c core/bm_ui_draw.c +# core/bm_b303.c core/bm_bx7.c core/bm_input.c core/bm_panel.c core/bm_params.c DELAY -# core/bm_ui_draw.c -DELAY AND PUNCH-IN PAUSED WHILE RECORDING - -# core/bm_input.c -DELAY FEEDBACK - -# core/bm_input.c -DELAY MIX - -# core/bm_input.c -DELAY SEND +# core/bm_b303.c +DELAY REVERB # core/bm_input.c -DELAY TIME +DELETE SCENE %c -# core/bm_input.c -DELETE TAKE %02d? +# core/bm_b303.c core/bm_bx7.c +DEPTH -# core/bm_params.c +# core/bm_b303.c core/bm_panel.c core/bm_params.c DEST -# core/bm_params.c +# core/bm_bx7.c core/bm_params.c DETUNE # core/bm_pattern.c @@ -542,17 +374,20 @@ DIATONIC # core/bm_ui_draw.c DIM -# core/bm_input.c -DIR +# core/bm_bx7.c +DIST -# core/bm_input.c -DISCARD THE NEW TAKE? +# core/bm_panel.c core/bm_slicer.c +DISTORTION -# core/bm_input.c -DLY +# core/gen/bm_fm_rom.c +DIVA EP # core/bm_input.c -DLY MIX +DLY FDBK + +# core/bm_b303.c +DLY ON # core/bm_input.c DLY TIME @@ -560,182 +395,86 @@ DLY TIME # core/bm_pattern.c DORIAN -# core/bm_input.c core/bm_ui_draw.c +# core/bm_mach.c DOWN -# core/bm_input.c core/bm_params.c core/bm_ui_draw.c +# core/bm_b303.c core/bm_panel.c core/bm_params.c core/bm_slicer.c DRIVE -# core/bm_input.c -DRIVE (SOFT-CLIP) - -# core/bm_input.c core/bm_ui_draw.c -DUCK - -# core/bm_ui_draw.c -DUCK %d%% (FX AGAIN: K1) - -# core/bm_ui_draw.c -DUCK (SIDECHAIN FROM T1) - -# core/bm_input.c -DUCK (SIDECHAIN) - # core/bm_params.c E.BASS A # core/bm_params.c E.BASS B -# core/bm_input.c -ECHO - -# core/bm_input.c +# core/bm_bx7.c EDIT -# core/bm_params.c -EG +# core/gen/bm_fm_rom.c +EMOTNHRP -# core/bm_params.c +# core/bm_panel.c core/bm_params.c EMPHASIS -# core/bm_ui_draw.c +# core/bm_slicer.c core/bm_ui_draw.c EMPTY -# core/bm_ui_draw.c -EMPTY PAD - -# core/bm_input.c -EMPTY PAD: TAKES > PAD - -# core/bm_input.c -EMPTY STEP - -# core/bm_ui_draw.c -EMPTY STEP - HOLD + ANOTHER WHITE = LONG NOTE - -# core/bm_input.c -EMPTY STEP: PLAY A NOTE THERE FIRST - -# core/bm_input.c -ENTRY - -# core/bm_input.c -ENTRY %d: NO SCENE - -# core/bm_input.c -ENTRY %d: SCENE %c +# core/bm_slicer.c +END -# core/bm_input.c core/bm_params.c core/bm_ui_draw.c +# core/bm_bx7.c core/bm_panel.c core/bm_params.c core/bm_slicer.c ENV -# core/bm_params.c +# core/bm_panel.c core/bm_params.c ENV +/- -# core/bm_params.c +# core/bm_panel.c core/bm_params.c ENV 1 -# core/bm_params.c +# core/bm_panel.c core/bm_params.c ENV 2 -# core/bm_params.c +# core/bm_b303.c core/bm_params.c core/bm_ui_draw.c ENV MOD -# core/bm_params.c +# core/bm_panel.c core/bm_params.c ENV/GATE -# core/bm_params.c +# core/bm_panel.c core/bm_params.c ENV2 AMT -# core/bm_params.c +# core/bm_panel.c core/bm_params.c ENV2 POS -# core/bm_input.c -ERASE - -# core/bm_ui_draw.c -ERASE LOOP - -# core/bm_ui_draw.c -ERASE T%d - -# core/bm_ui_draw.c -EVENTS +# core/bm_mach.c +EXCL # core/bm_input.c -EVERY %d +EXIT: BLACK 11 OR HOME # core/bm_input.c -EVERY 2 +EXIT: EDIT OR HOME WHITE = PICK # core/bm_input.c -EVERY 4 +EXIT: ENV OR HOME BLACK = SOUND, BAR # core/bm_input.c -EVERY 8 +EXIT: LFO OR HOME BLACK = SOUND, BAR # core/bm_input.c -EXIT: ARP OR HOME BLACK 11 = FILL +EXIT: RELEASE BLACK 11 # core/bm_input.c -EXIT: ARP OR HOME REC IS RECORDING +EXIT: SCL OR HOME BLACK = SOUND, BAR -# core/bm_input.c -EXIT: BLACK 11 OR HOME +# core/bm_ui_draw.c +EXT # core/bm_input.c -EXIT: LFO OR HOME BLACK 9/10 = PAGE +EXT CLOCK: WAITING FOR MIDI -# core/bm_input.c -EXIT: RELEASE ARP - -# core/bm_input.c -EXIT: RELEASE ARP BLACK 11 = FILL - -# core/bm_input.c -EXIT: RELEASE ARP REC IS RECORDING - -# core/bm_input.c -EXIT: RELEASE BLACK 11 - -# core/bm_input.c -EXIT: RELEASE EDIT B7-10 = CLR SCENE - -# core/bm_input.c -EXIT: RELEASE EDIT BLACK 7 = REDO - -# core/bm_input.c -EXIT: RELEASE ENV BLACK 9/10 = PAGE - -# core/bm_input.c -EXIT: RELEASE FX - -# core/bm_input.c -EXIT: RELEASE GLO PLAY = TAP TEMPO - -# core/bm_input.c -EXIT: RELEASE HOME B1-6 MUTE - -# core/bm_input.c -EXIT: RELEASE LFO BLACK 9/10 = PAGE - -# core/bm_input.c -EXIT: RELEASE SAVE - -# core/bm_input.c -EXIT: RELEASE SCL - -# core/bm_input.c -EXIT: RELEASE SEQ BLACK 1-6 = SPEED - -# core/bm_ui_draw.c -EXT - -# core/bm_input.c -EXT CLOCK: WAITING FOR MIDI - -# core/bm_ui_draw.c -EXT? +# core/bm_ui_draw.c +EXT? # core/bm_ui_draw.c EXTERNAL @@ -749,12 +488,6 @@ F DECAY # core/bm_app.c FAC ? -# core/bm_input.c -FACTORY - -# core/bm_input.c -FACTORY IS READ ONLY - # core/bm_ui_draw.c FAST SCREEN @@ -764,35 +497,26 @@ FAST SCREEN OFF # core/bm_input.c FAST SCREEN ON (TEST) -# core/bm_input.c core/bm_params.c +# core/bm_bx7.c FEEDBACK -# core/bm_input.c -FIL - -# core/bm_input.c core/bm_ui_draw.c +# core/bm_ui_draw.c FILL -# core/bm_input.c -FILL ONLY - -# core/bm_input.c core/bm_params.c core/bm_ui_draw.c +# core/bm_bx7.c core/bm_input.c core/bm_panel.c core/bm_params.c FILTER -# core/bm_params.c +# core/bm_panel.c core/bm_params.c FILTER + -# core/bm_ui_draw.c -FILTER OFF - -# core/bm_params.c +# core/bm_bx7.c core/bm_params.c FINE -# core/bm_input.c core/bm_ui_draw.c +# core/bm_bx7.c core/bm_ui_draw.c FIXED # core/bm_ui_draw.c -FIXED MACHINE +FL # core/bm_input.c core/bm_ui_draw.c FLAM @@ -806,72 +530,45 @@ FLUTE # core/bm_drums.cpp core/bm_input.c core/bm_params.c FM -# core/bm_ui_draw.c -FOR TRACKS WITHOUT THEIR OWN SCALE - -# core/bm_params.c +# core/bm_panel.c core/bm_params.c FRAME -# core/bm_ui_draw.c -FREE %u.%u S - %d SOUNDS ON TOP - -# core/bm_ui_draw.c -FREE REC - -# core/bm_ui_draw.c -FREE REC %u.%u - -# core/bm_input.c -FREE REC: REC AGAIN CLOSES - -# core/bm_input.c core/bm_ui_draw.c -FREEZE - -# core/bm_params.c +# core/bm_bx7.c core/bm_panel.c core/bm_params.c FREQ -# core/bm_input.c -FROM - -# core/bm_input.c -FROM STEP 1 - # core/gen/bm_fm_rom.c FULLTINE -# core/bm_input.c +# core/bm_slicer.c FWD -# core/bm_input.c core/bm_ui_draw.c +# core/bm_b303.c core/bm_bx7.c core/bm_panel.c core/bm_ui_draw.c FX -# core/bm_ui_draw.c -FX AGAIN = NEXT PAGE - -# core/bm_input.c +# core/bm_bx7.c GAIN -# core/bm_input.c core/bm_params.c core/bm_ui_draw.c +# core/bm_mach.c core/bm_panel.c core/bm_params.c GATE -# core/bm_input.c -GATE LENGTH - -# core/bm_input.c -GHOST - # core/gen/bm_fm_rom.c GLASS -# core/bm_input.c core/bm_params.c +# core/bm_ui_draw.c +GLD + +# core/bm_panel.c core/bm_params.c GLIDE -# core/bm_app.c core/bm_input.c core/bm_ui_draw.c +# core/bm_b303.c core/bm_bx7.c core/bm_ui_draw.c GLO # core/bm_snap.c GPL-3.0 +# core/bm_ui_draw.c +HARD + # core/bm_pattern.c HARM MIN @@ -881,79 +578,22 @@ HAT # core/bm_params.c HAT 808 -# core/bm_ui_draw.c -HELD: KEY, THRU AND LOOP KEEP PLAYING - -# core/bm_ui_draw.c -HELD: THE LOOP REPEATS - RELEASED: TO THE END - -# core/bm_input.c -HERMITE - # core/bm_input.c HH # core/bm_drums.cpp HH808 -# core/bm_input.c -HI - -# core/bm_input.c core/bm_params.c +# core/bm_params.c HIT -# core/bm_input.c -HLF - -# core/bm_input.c -HOLD %s 2 S = YES - -# core/bm_ui_draw.c -HOLD ARP = LIVE ARPEGGIO - -# core/bm_ui_draw.c -HOLD EDIT + BLACK 4 = CAPTURE INTO THE GRID - -# core/bm_ui_draw.c -HOLD FX = PUNCH-IN - -# core/bm_ui_draw.c -HOLD GLO = TRANSPOSE, PLAY = TAP - -# core/bm_input.c -HOLD KEYS = ARPEGGIATE IN TEMPO - -# core/bm_ui_draw.c -HOLD REC = RECORD WHILE HELD - -# core/bm_input.c -HOLD WHITE = ERASE LIVE B6 = UNDO - -# core/bm_input.c -HOLD WHITE = ROLL BLACK 1-6 = RATE - -# core/bm_input.c -HOME - -# core/bm_ui_draw.c -HOME + EDIT - -# core/bm_ui_draw.c -HOME + FX = DELAY, REVERB AND SIDECHAIN - -# core/bm_input.c -HOME + THIS BUTTON: NOTHING - -# core/bm_ui_draw.c -HOME = DISCARD? - REC = ANOTHER TAKE - # core/gen/bm_fm_rom.c HOUSE BS -# core/bm_input.c core/bm_params.c core/bm_ui_draw.c +# core/bm_bx7.c core/bm_input.c core/bm_panel.c core/bm_params.c core/bm_ui_draw.c HP -# core/bm_input.c core/bm_params.c core/bm_ui_draw.c +# core/bm_panel.c core/bm_params.c HPF # core/bm_params.c @@ -968,33 +608,24 @@ I+II # core/bm_ui_draw.c IDLE LEDS -# core/bm_input.c core/bm_params.c core/bm_pattern.c +# core/bm_params.c core/bm_pattern.c II -# core/bm_input.c core/bm_pattern.c +# core/bm_pattern.c III -# core/bm_input.c -INF +# core/bm_mach.c +INCL -# core/bm_input.c core/bm_snap.c +# core/bm_snap.c INIT # core/bm_params.c INIT 1982 -# core/bm_input.c -INIT KIT - -# core/bm_input.c -INIT KIT ON T%d? - -# core/bm_app.c core/bm_input.c core/bm_ui_draw.c +# core/bm_app.c INIT SOUND -# core/bm_input.c -INIT SOUND ON T%d? - # core/bm_params.c INSPIRED BY THE DX7 @@ -1010,85 +641,28 @@ INSPIRED BY THE TB-303 # core/bm_params.c INSPIRED BY VITAL -# core/bm_app.c core/bm_input.c -INSTR - # core/bm_input.c -INSTRUM +INSTR -# core/bm_params.c +# core/bm_input.c core/bm_params.c INSTRUMENT -# core/bm_input.c -INSTRUMENTS 1-8 - -# core/bm_input.c -INSTRUMENTS 9-16 - # core/bm_ui_draw.c INTERNAL -# core/bm_input.c -INTERPOLATION - -# core/bm_input.c -IT IS NOT SAVED YET - -# core/bm_input.c -IT IS THE CURRENT PATTERN - -# core/bm_ui_draw.c -IT SAVES WHEN YOU STOP - WHITES = LISTEN - -# core/bm_input.c core/bm_pattern.c +# core/bm_pattern.c IV -# core/bm_input.c -K-HI - -# core/bm_input.c -K-LO - -# core/bm_ui_draw.c -K1 = DUCK (T1 SIDECHAIN) - -# core/bm_ui_draw.c -K1 = DUCK - SELECT LEFT = LEVEL, PAN, SENDS - -# core/bm_ui_draw.c -K1 START - K2 END - EDIT = SOUND, ENV, LOOP - -# core/bm_ui_draw.c -K3 PLAY: ONESHOT, KEY, THRU OR LOOP - -# core/bm_ui_draw.c -K4 = SONG ON/OFF - -# core/bm_params.c +# core/bm_panel.c core/bm_params.c KBD CTRL -# core/bm_input.c -KEEP HOLDING %s = YES - -# core/bm_input.c +# core/bm_slicer.c KEY -# core/bm_params.c +# core/bm_bx7.c core/bm_params.c KEY VEL -# core/bm_input.c -KEYS = TRANSPOSE PROJECT K2 = OCTAVE - -# core/bm_ui_draw.c -KEYS ARE SILENT IN THE RECORDER - -# core/bm_input.c -KEYS IN - -# core/bm_input.c -KEYS IN SCALE - -# core/bm_params.c +# core/bm_panel.c core/bm_params.c KEYTRK # core/bm_params.c @@ -1100,32 +674,26 @@ KICK2 # core/bm_params.c KICK3 -# core/bm_input.c core/bm_ui_draw.c -KILL HI - -# core/bm_input.c core/bm_ui_draw.c -KILL LO - -# core/bm_input.c core/bm_ui_draw.c -KIT - -# core/bm_ui_draw.c -KIT FROM THIS TAKE: BLACK 1 HITS, 2 = 16, 3 = 8 - # core/bm_input.c -KIT: %d PADS +KIT -# core/bm_params.c +# core/bm_panel.c core/bm_params.c KYBD # core/bm_params.c L CONTOUR -# core/bm_params.c +# core/bm_bx7.c +L CURVE + +# core/bm_bx7.c +L DEPTH + +# core/bm_panel.c core/bm_params.c LADDER -# core/bm_input.c -LANE LEN +# core/gen/bm_fm_rom.c +LAGOONEP # core/bm_ui_draw.c LANGUAGE @@ -1133,102 +701,81 @@ LANGUAGE # core/bm_app.c LANGUAGE PACK IS DAMAGED +# core/bm_mach.c +LATCH + # core/bm_ui_draw.c LATCHED # core/gen/bm_fm_rom.c LEAD -# core/bm_input.c -LED - -# core/bm_ui_draw.c -LEFT - -# core/bm_input.c core/bm_params.c +# core/bm_panel.c core/bm_params.c LEGATO -# core/bm_ui_draw.c -LEGATO: ONE VOICE, TIED - -# core/bm_ui_draw.c -LEGATO: TIED NOTES GLIDE - -# core/bm_input.c core/bm_params.c +# core/bm_input.c core/bm_mach.c core/bm_params.c core/bm_slicer.c LENGTH # core/bm_input.c -LENGTH AND SPEED +LENGTH/SPEED # core/bm_input.c LENGTHS %d-%d -# core/bm_input.c core/bm_params.c core/bm_ui_draw.c +# core/bm_b303.c core/bm_bx7.c core/bm_panel.c core/bm_params.c core/bm_slicer.c LEVEL -# core/bm_params.c -LEVEL 2 +# core/bm_bx7.c +LEVEL 1 -# core/bm_input.c core/bm_params.c -LFO +# core/bm_bx7.c core/bm_params.c +LEVEL 2 -# core/bm_params.c -LFO 1 +# core/bm_bx7.c +LEVEL 3 -# core/bm_ui_draw.c -LIMIT: MEMORY +# core/bm_bx7.c +LEVEL 4 -# core/bm_ui_draw.c -LIMIT: RECORDING RAM +# core/bm_bx7.c +LEVELS -# core/bm_input.c -LINEAR +# core/bm_b303.c core/bm_bx7.c core/bm_mach.c core/bm_panel.c core/bm_params.c +LFO -# core/bm_ui_draw.c -LINES = 1 BAR +# core/bm_params.c +LFO 1 -# core/bm_ui_draw.c -LIVE CHORDS +# core/bm_bx7.c +LFO SYNC -# core/bm_input.c +# core/bm_panel.c LO # core/bm_ui_draw.c LOAD IN %u.%u S -# core/bm_input.c -LOCK - -# core/bm_input.c -LONG NOTE: %d STEPS - -# core/bm_app.c core/bm_input.c core/bm_ui_draw.c +# core/bm_slicer.c LOOP -# core/bm_input.c -LOOP BARS - -# core/bm_input.c -LOOP ERASED - -# core/bm_input.c +# core/bm_slicer.c LOOP IN -# core/bm_input.c +# core/bm_slicer.c LOOP OUT -# core/bm_input.c core/bm_ui_draw.c +# core/bm_panel.c +LOUDNESS + +# core/bm_bx7.c core/bm_input.c core/bm_ui_draw.c LP -# core/bm_params.c +# core/bm_panel.c core/bm_params.c LP 12 -# core/bm_params.c +# core/bm_panel.c core/bm_params.c LP 24 -# core/bm_input.c core/bm_ui_draw.c -LPF - # core/bm_input.c LT @@ -1259,19 +806,13 @@ M4 AMT # core/bm_params.c M4 TO -# core/bm_input.c +# core/bm_input.c core/bm_mach.c MACHINE -# core/bm_ui_draw.c -MACHINES - -# core/bm_input.c -MACRO - # core/bm_params.c MACRO 1 -# core/bm_params.c +# core/bm_panel.c core/bm_params.c MACRO 1-2 # core/bm_params.c @@ -1280,35 +821,26 @@ MACRO 2 # core/bm_params.c MACRO 3 -# core/bm_params.c +# core/bm_panel.c core/bm_params.c MACRO 3-4 # core/bm_params.c MACRO 4 +# core/bm_bx7.c core/bm_params.c +MAIN + # core/bm_pattern.c MAJOR -# core/bm_params.c +# core/bm_panel.c core/bm_params.c MANUAL # core/gen/bm_fm_rom.c MARIMBA -# core/bm_input.c core/bm_ui_draw.c -MASTER - -# core/bm_ui_draw.c -MASTER > K2 PICKS IT - -# core/bm_input.c -MASTER FILTER - -# core/bm_input.c -MASTER LENGTH - # core/bm_ui_draw.c -MAX 3.0 S PER TAKE +MASTER FX # core/bm_ui_draw.c MEDIUM @@ -1319,37 +851,19 @@ METAL # core/bm_drums.cpp METAL HAT -# core/bm_input.c -MICRO +# core/bm_mach.c core/bm_slicer.c +MIDI CH -# core/bm_input.c -MICRO TIMING - -# core/bm_app.c -MIDI - -# core/bm_input.c -MIDI CHANNEL - -# core/bm_input.c +# core/bm_mach.c core/bm_slicer.c MIDI OUT -# core/bm_input.c -MIDI OUT OFF - -# core/bm_input.c -MIDI OUT ON: NOTES ALSO GO OUT - -# core/bm_input.c -MIDI PROGRAM - # core/bm_pattern.c MINOR -# core/bm_app.c core/bm_drums.cpp core/bm_input.c core/bm_ui_draw.c +# core/bm_bx7.c core/bm_drums.cpp MIX -# core/bm_params.c +# core/bm_params.c core/bm_ui_draw.c MIXER # core/bm_pattern.c @@ -1358,51 +872,21 @@ MIXO # core/bm_params.c MOD AMT -# core/bm_params.c -MOD LVL +# core/bm_panel.c +MOD MIX # core/bm_params.c MOD RATE -# core/bm_input.c core/bm_params.c +# core/bm_bx7.c core/bm_mach.c core/bm_panel.c core/bm_params.c core/bm_slicer.c MODE -# core/bm_params.c +# core/bm_input.c core/bm_panel.c core/bm_params.c MODEL -# core/bm_ui_draw.c -MODELED - -# core/bm_input.c core/bm_params.c +# core/bm_bx7.c core/bm_panel.c core/bm_params.c MONO -# core/bm_ui_draw.c -MONO: EVERY NOTE RETRIGGERS - -# core/bm_ui_draw.c -MONO: ONE VOICE, RETRIGGERS - -# core/bm_input.c -MOVE - -# core/bm_input.c -MOVE BRIGHT + WASH - -# core/bm_input.c -MOVE DARK + ECHO - -# core/bm_input.c -MOVE OFF - -# core/bm_ui_draw.c -MOVE BRIGHT - -# core/bm_ui_draw.c -MOVE DARK - -# core/bm_input.c -MST FILT - # core/bm_input.c MT @@ -1413,31 +897,25 @@ MTL MUTE # core/bm_input.c -MUTE INSTRUMENTS +MUTE SOUNDS # core/bm_input.c MUTED -# core/bm_params.c +# core/bm_panel.c core/bm_params.c NARROW # core/bm_pattern.c NEO SOUL -# core/bm_input.c -NEW KIT FROM TAKE %02d? - # core/bm_params.c NO # core/bm_app.c NO CHANGE: STOP AND SAVE -# core/bm_input.c core/bm_ui_draw.c -NO FILL - # core/bm_ui_draw.c -NO KIT +NO FILL # core/bm_input.c NO LANGUAGE PACK: LOAD ONE BY USB @@ -1445,70 +923,55 @@ NO LANGUAGE PACK: LOAD ONE BY USB # core/bm_app.c NO ROOM IN TAKES: DISCARDED +# core/bm_slicer.c +NO ROOM: DELETE A TAKE + # core/bm_app.c NO ROOM: DELETE A TAKE OR A SOUND -# core/bm_ui_draw.c -NO TABLE - # core/bm_input.c NO TAKE -# core/bm_ui_draw.c -NO TAKES YET - -# core/bm_drums.cpp core/bm_params.c +# core/bm_drums.cpp core/bm_panel.c core/bm_params.c NOISE # core/bm_app.c NONE -# core/bm_input.c core/bm_ui_draw.c +# core/bm_ui_draw.c NORMAL # core/bm_app.c NOT A USER SOUND -# core/bm_ui_draw.c -NOT SAVED YET - # core/bm_input.c -NOTES +NZ # core/bm_ui_draw.c -NOTES TO NOTES, HITS TO HITS: THE MACHINES DO NOT CHANGE - -# core/bm_app.c core/bm_input.c -NOTHING TO PASTE HERE - -# core/bm_app.c -NOTHING TO REDO - -# core/bm_app.c -NOTHING TO UNDO - -# core/bm_input.c -NOW +OCT 1-8 -# core/bm_input.c -NZ - -# core/bm_input.c -OCT+ +# core/bm_ui_draw.c +OCT 9-16 -# core/bm_input.c -OCT- +# core/bm_ui_draw.c +OCT- SOFT OCT+ HARD -# core/bm_input.c +# core/bm_mach.c OCTAVE # core/bm_input.c OCTAVE %+d -# core/bm_input.c -OCTAVES +# core/bm_mach.c +OCTAVE %d + +# core/bm_mach.c +OCTAVE +%d -# core/bm_app.c core/bm_input.c core/bm_params.c core/bm_ui_draw.c +# core/bm_mach.c +OCTAVE 0 TRANSPOSE 0 + +# core/bm_input.c core/bm_mach.c core/bm_panel.c core/bm_params.c core/bm_ui_draw.c OFF # core/bm_input.c @@ -1517,7 +980,7 @@ OH # core/bm_params.c OHAT -# core/bm_input.c core/bm_ui_draw.c +# core/bm_b303.c core/bm_bx7.c core/bm_input.c core/bm_mach.c core/bm_panel.c core/bm_slicer.c core/bm_ui_draw.c ON # core/bm_ui_draw.c @@ -1526,14 +989,11 @@ ON (TEST) # core/bm_ui_draw.c ON T%d -# core/bm_ui_draw.c -ONE AT A TIME - # core/bm_input.c -ONESHOT +ONE BAR ONLY -# core/bm_input.c -ONLY IN THE FILL +# core/bm_slicer.c +ONESHOT # core/bm_ui_draw.c ONLY WHEN STOPPED (CUTS AUDIO) @@ -1544,108 +1004,102 @@ ONLY WHEN STOPPED - SAVE 2 S: QUICK SAVE # core/bm_params.c OP HH -# core/bm_input.c core/bm_ui_draw.c +# core/bm_bx7.c +OP1 + +# core/bm_bx7.c +OP2 + +# core/bm_bx7.c +OP3 + +# core/bm_bx7.c +OP4 + +# core/bm_bx7.c +OP5 + +# core/bm_bx7.c +OP6 + +# core/bm_input.c OPEN -# core/bm_ui_draw.c -OR HOME + REC: SONG REC +# core/bm_mach.c +ORDER # core/gen/bm_fm_rom.c ORGAN -# core/bm_params.c +# core/bm_panel.c +OSC + +# core/bm_panel.c core/bm_params.c core/bm_ui_draw.c OSC 1 -# core/bm_params.c +# core/bm_panel.c core/bm_params.c OSC 1 + -# core/bm_input.c -OSC 1 TABLE - -# core/bm_params.c +# core/bm_panel.c core/bm_params.c core/bm_ui_draw.c OSC 2 -# core/bm_params.c +# core/bm_panel.c core/bm_params.c OSC 2 + -# core/bm_params.c +# core/bm_mach.c core/bm_panel.c core/bm_params.c OSC 3 -# core/bm_params.c +# core/bm_bx7.c +OSC SYNC + +# core/bm_bx7.c +OUT LVL + +# core/bm_bx7.c core/bm_panel.c core/bm_params.c OUTPUT # core/bm_input.c OUTSIDE THE LENGTH -# core/bm_ui_draw.c -OVERDUB +# core/bm_b303.c +OVERDRIVE -# core/bm_input.c -OWN +# core/gen/bm_fm_rom.c +OWLS EP -# core/bm_ui_draw.c -OWN TRACK SCALE +# core/bm_bx7.c +P SENS # core/bm_input.c +P%d LENGTH %d + +# core/bm_input.c core/bm_slicer.c PAD -# core/bm_input.c core/bm_ui_draw.c +# core/bm_input.c core/bm_slicer.c PAD %d -# core/bm_input.c -PAD %d COPIED - -# core/bm_input.c -PAD %d EMPTY - -# core/bm_app.c -PADS - -# core/bm_input.c -PADS 1-8 - -# core/bm_input.c -PADS 9-16 - -# core/bm_input.c +# core/bm_mach.c PAGE -# core/bm_input.c -PAGE %d/%d - -# core/bm_input.c core/bm_ui_draw.c -PAN - # core/bm_ui_draw.c -PASTE +PAGE %d/%d -# core/bm_input.c -PASTED ON PAD %d +# core/bm_b303.c +PANEL -# core/bm_input.c core/bm_params.c +# core/bm_params.c PATCH -# core/bm_input.c -PATTERN - -# core/bm_input.c -PATTERN (QUEUED) - # core/bm_app.c PATTERN A%02d # core/bm_input.c PATTERN CLEARED -# core/bm_input.c -PATTERN COPIED - # core/bm_app.c PATTERN FULL: NO ROOM -# core/bm_ui_draw.c -PAUSED: TAKE - # core/bm_pattern.c PENTA MA @@ -1655,64 +1109,61 @@ PENTA MI # core/bm_params.c PERC +# core/bm_bx7.c +PHASER + # core/bm_params.c PHILLY 95 # core/bm_pattern.c PHRYG -# core/bm_input.c -PIANO ROLL - -# core/bm_ui_draw.c -PICK A NOTE TRACK - # core/gen/bm_fm_rom.c PIPE ORG -# core/bm_input.c core/bm_params.c +# core/bm_bx7.c +PIT + +# core/bm_panel.c core/bm_params.c core/bm_slicer.c PITCH -# core/bm_input.c core/bm_ui_draw.c +# core/bm_bx7.c +PITCH LEVELS + +# core/bm_bx7.c +PITCH RATES + +# core/bm_bx7.c +PLACED + +# core/bm_ui_draw.c PLAY # core/bm_input.c -PLAY = LOOP: HELD REPEATS THE LOOP - -# core/bm_input.c core/bm_ui_draw.c PLAYS # core/gen/bm_fm_rom.c PLUCKED -# core/bm_params.c +# core/bm_bx7.c PMD -# core/bm_params.c +# core/bm_bx7.c core/bm_panel.c core/bm_params.c POLY -# core/bm_ui_draw.c -POLY: UP TO 4 VOICES - -# core/bm_ui_draw.c -POLYMETER - # core/gen/bm_fm_rom.c POP BASS -# core/bm_params.c +# core/bm_bx7.c core/bm_params.c PORTA -# core/bm_ui_draw.c -PORTA WITH TIE %+d ST - # core/bm_params.c POS 1 # core/bm_params.c POS 2 -# core/bm_params.c +# core/bm_panel.c core/bm_params.c POSITION # core/bm_input.c @@ -1721,160 +1172,106 @@ PRC # core/bm_ui_draw.c PRE -# core/bm_ui_draw.c -PRE = SOUND +# core/bm_b303.c core/bm_bx7.c core/bm_panel.c +PRESET # core/bm_ui_draw.c PRESETS -# core/bm_ui_draw.c -PRESETS = ANOTHER KIT - -# core/bm_input.c -PROB - -# core/bm_input.c -PROB/FILL - -# core/bm_input.c -PROG - # core/bm_pattern.c PROGRESSIONS -# core/bm_input.c -PROJECT - -# core/bm_input.c -PROJECT ROOT - -# core/bm_input.c core/bm_ui_draw.c -PROJECT SCALE - -# core/bm_input.c -PROJECT TRANSPOSE - -# core/bm_input.c -PST +# core/bm_panel.c core/bm_params.c +PULSE # core/bm_params.c -PULSE +PUMP # core/bm_drums.cpp PUNCH -# core/bm_input.c -PUNCH-IN - -# core/bm_params.c +# core/bm_panel.c core/bm_params.c PWM -# core/bm_params.c +# core/bm_panel.c core/bm_params.c PWM MODE -# core/bm_input.c core/bm_ui_draw.c -QUICK SAVE - -# core/bm_params.c -R1 ATK +# core/gen/bm_fm_rom.c +QUERY BS -# core/bm_params.c -R2-3 DEC +# core/gen/bm_fm_rom.c +QUERYBRS -# core/bm_params.c -R4 REL +# core/bm_input.c core/bm_ui_draw.c +QUICK SAVE -# core/bm_input.c -RAMP +# core/bm_bx7.c +R CURVE -# core/bm_input.c -RAND +# core/bm_bx7.c +R DEPTH -# core/bm_params.c core/bm_ui_draw.c +# core/bm_mach.c core/bm_panel.c core/bm_params.c RANDOM -# core/bm_params.c +# core/bm_panel.c core/bm_params.c RANGE -# core/bm_input.c core/bm_params.c +# core/bm_b303.c core/bm_bx7.c core/bm_mach.c core/bm_panel.c core/bm_params.c RATE -# core/bm_drums.cpp -RATIO - -# core/bm_input.c -RD - -# core/bm_ui_draw.c -READY - -# core/bm_input.c core/bm_ui_draw.c -REC +# core/bm_bx7.c +RATE 1 -# core/bm_ui_draw.c -REC 2 S: ERASE THE LOOP +# core/bm_bx7.c +RATE 2 -# core/bm_ui_draw.c -REC = ARM (K1: BAR OR NOW) +# core/bm_bx7.c +RATE 3 -# core/bm_ui_draw.c -REC = RECORD ONE +# core/bm_bx7.c +RATE 4 -# core/bm_ui_draw.c -REC = STOP - STOPS BY ITSELF AT THE LIMIT +# core/bm_bx7.c +RATE SCL -# core/bm_input.c -REC OFF +# core/bm_bx7.c +RATES -# core/bm_input.c -REC ON +# core/bm_bx7.c core/bm_drums.cpp +RATIO # core/bm_input.c -REC STEP +RD # core/bm_ui_draw.c -REC: RECORD > PLAY > OVERDUB - STARTS ON THE NEXT BAR - -# core/bm_app.c -RECORD +REC -# core/bm_ui_draw.c -RECORDED +# core/bm_mach.c +REC ARMED: PLAY A NOTE -# core/bm_input.c core/bm_ui_draw.c -RECORDING +# core/bm_input.c core/bm_mach.c +REC OFF # core/bm_input.c -RED - -# core/bm_app.c -REDONE ON T%d +REC ON # core/gen/bm_fm_rom.c REED HRP -# core/bm_input.c core/bm_params.c +# core/bm_bx7.c core/bm_panel.c core/bm_params.c core/bm_slicer.c RELEASE -# core/bm_ui_draw.c -RELEASE = ENTER %s - -# core/bm_ui_draw.c -RELEASE = NO - -# core/bm_ui_draw.c -RELEASE = STAY ON MIX - -# core/bm_input.c +# core/bm_input.c core/bm_mach.c REPEAT -# core/bm_ui_draw.c -REPEAT: RETRIGS - BREAK: REVERSE, HALF, SILENCE - -# core/bm_input.c core/bm_params.c +# core/bm_input.c core/bm_panel.c core/bm_params.c RES -# core/bm_params.c +# core/bm_bx7.c core/bm_mach.c core/bm_slicer.c +RESET + +# core/bm_b303.c core/bm_bx7.c core/bm_panel.c core/bm_params.c core/bm_ui_draw.c RESO # core/bm_drums.cpp core/bm_params.c @@ -1883,38 +1280,23 @@ RESON # core/bm_drums.cpp RESONATOR -# core/bm_input.c +# core/bm_slicer.c REV -# core/bm_input.c -REV 4 - -# core/bm_input.c -REV 8 - # core/bm_input.c REV MIX -# core/bm_ui_draw.c -REV4 - -# core/bm_ui_draw.c -REV8 - -# core/bm_input.c core/bm_ui_draw.c -REVERB - -# core/bm_input.c -REVERB DAMP +# core/bm_b303.c core/bm_slicer.c +REV ON # core/bm_input.c -REVERB MIX +REV SIZE -# core/bm_input.c -REVERB SEND +# core/bm_b303.c core/bm_bx7.c core/bm_input.c core/bm_panel.c core/bm_slicer.c +REVERB -# core/bm_input.c -REVERB SIZE +# core/bm_slicer.c +REVERSE # core/bm_params.c RIDE @@ -1926,27 +1308,36 @@ RIM ROBOT FUNK # core/bm_input.c -ROLL +ROOT # core/bm_input.c -ROLL RATE +ROW # core/bm_input.c -ROLL SWING +RPT # core/bm_input.c -ROLL TAIL +RS -# core/bm_input.c -ROOT +# core/bm_slicer.c +SAMPLE -# core/bm_input.c -ROW +# core/bm_slicer.c +SAMPLE ARMED -# core/bm_input.c -RS +# core/bm_slicer.c +SAMPLE ARMED: PRESS PLAY -# core/bm_input.c core/bm_ui_draw.c +# core/bm_slicer.c +SAMPLE STOPPED + +# core/bm_slicer.c +SAMPLE: NEXT BAR + +# core/bm_slicer.c +SAMPLING %u.%u S + +# core/bm_ui_draw.c SAVE # core/bm_input.c @@ -1955,9 +1346,6 @@ SAVE AGAIN = CLEAR # core/bm_ui_draw.c SAVE AS -# core/bm_ui_draw.c -SAVE SONG AND SCENES - # core/bm_ui_draw.c SAVED @@ -1967,38 +1355,44 @@ SAVED A%02d # core/bm_input.c SAVED AS A%02d +# core/bm_input.c +SAVES WHEN STOPPED + # core/bm_app.c SAVING THE TAKE -# core/bm_engines.c core/bm_input.c core/bm_params.c +# core/bm_b303.c core/bm_engines.c core/bm_panel.c core/bm_params.c core/bm_ui_draw.c SAW -# core/bm_input.c -SC REL +# core/bm_bx7.c +SAW DN -# core/bm_app.c core/bm_input.c core/bm_ui_draw.c +# core/bm_params.c +SAW DOWN + +# core/bm_bx7.c core/bm_params.c +SAW UP + +# core/bm_input.c SCALE -# core/bm_ui_draw.c -SCALE (FROM THE PROJECT) +# core/bm_bx7.c +SCALING # core/bm_input.c SCENE %c # core/bm_input.c -SCENE %c CLEARED +SCENE %c A%02d STORED # core/bm_input.c -SCENE %c STORED +SCENE %c DELETED # core/bm_input.c SCENE %c: NEXT BAR -# core/bm_input.c -SCL - -# core/bm_ui_draw.c -SCL AGAIN: CHORDS - HOME + SCL: PROJECT +# core/bm_mach.c +SCROLL # core/bm_input.c SD @@ -2022,19 +1416,19 @@ SEL SELECT # core/bm_ui_draw.c -SELECT = TRACK ALGORITHM = MACHINE (2 S) +SELECT MACHINE -# core/bm_ui_draw.c -SELECT HIT - ALGORITHM PROB - PRESETS LENGTH +# core/bm_bx7.c +SELECT MOVES IT -# core/bm_ui_draw.c -SELECT PICKS, SAVE RUNS - HOLD SAVE = COPY PATTERN +# core/bm_bx7.c +SEND -# core/bm_app.c core/bm_input.c core/bm_ui_draw.c -SEQ +# core/bm_bx7.c +SEND: ALWAYS AFTER THE FX -# core/bm_input.c -SET +# core/bm_b303.c core/bm_bx7.c core/bm_panel.c core/bm_params.c +SEQ # core/bm_input.c SH @@ -2045,32 +1439,29 @@ SHAK # core/bm_params.c SHAKE -# core/bm_params.c +# core/bm_panel.c core/bm_params.c SHAPE -# core/bm_params.c +# core/bm_panel.c core/bm_params.c SHARK -# core/bm_input.c -SIDECHAIN RELEASE - -# core/bm_params.c +# core/bm_bx7.c core/bm_panel.c core/bm_params.c SINE -# core/bm_input.c -SIZE - -# core/bm_params.c -SLIDE +# core/gen/bm_fm_rom.c +SKETCHBS # core/bm_ui_draw.c -SLOOP T%d %s +SLD -# core/bm_input.c -SLOOP: T%d %s +# core/bm_b303.c core/bm_params.c core/bm_ui_draw.c +SLIDE -# core/bm_input.c -SNAP +# core/bm_bx7.c +SLOT + +# core/bm_slicer.c +SMP # core/bm_drums.cpp SNAPPY @@ -2078,154 +1469,76 @@ SNAPPY # core/bm_params.c SNARE -# core/bm_input.c core/bm_ui_draw.c -SONG - -# core/bm_input.c -SONG AND SCENES SAVED - -# core/bm_input.c -SONG FULL - -# core/bm_input.c core/bm_ui_draw.c -SONG OFF - -# core/bm_input.c core/bm_ui_draw.c -SONG ON - # core/bm_ui_draw.c -SONG REC +SOFT # core/bm_input.c -SONG REC OFF +SOLO OFF -# core/bm_input.c -SONG REC ON - -# core/bm_app.c core/bm_input.c core/bm_ui_draw.c +# core/bm_input.c core/bm_slicer.c SOUND # core/bm_app.c SOUND DELETED +# core/bm_mach.c core/bm_slicer.c +SOUND RESET + # core/bm_app.c SOUND SAVED: %s -# core/bm_input.c core/bm_ui_draw.c -SOURCE +# core/bm_input.c +SOUNDS 1-8 -# core/bm_ui_draw.c -SOURCE: MIX +# core/bm_input.c +SOUNDS 9-16 # core/bm_drums.cpp core/bm_params.c SPACE -# core/bm_input.c core/bm_params.c +# core/bm_bx7.c core/bm_input.c core/bm_mach.c SPEED # core/bm_ui_draw.c SPLIT L/R -# core/bm_engines.c core/bm_input.c core/bm_params.c -SQUARE - -# core/bm_input.c core/bm_ui_draw.c -SR +# core/bm_ui_draw.c +SQR -# core/bm_input.c -ST +# core/bm_b303.c core/bm_bx7.c core/bm_engines.c core/bm_panel.c core/bm_params.c +SQUARE -# core/bm_input.c +# core/bm_slicer.c START -# core/bm_input.c -START ON THE HIT - -# core/bm_input.c -STARTS ON THE BAR - -# core/bm_ui_draw.c -STARTS ON THE BAR - REC AGAIN = CANCEL - -# core/bm_input.c -STARTS WHEN YOU PRESS REC - -# core/bm_input.c +# core/bm_b303.c core/bm_bx7.c core/bm_panel.c STEP -# core/bm_ui_draw.c -STEP %02d +# core/bm_b303.c +STEP %d: NO NOTE # core/bm_input.c -STEP %02d %s +STEP REC -# core/bm_input.c -STEP %02d CONDITION - -# core/bm_input.c -STEP %02d HIT - -# core/bm_input.c -STEP %02d REPEAT - -# core/bm_input.c -STEP HAS NO NOTES: WRITE THEM IN SEQ +# core/bm_ui_draw.c +STEP REC %d/%d -# core/bm_input.c +# core/bm_b303.c core/bm_panel.c core/bm_params.c STEPS -# core/bm_ui_draw.c -STEPS %d-%d - # core/bm_ui_draw.c STEREO -# core/bm_input.c -STOP TO COPY - -# core/bm_app.c core/bm_input.c +# core/bm_app.c STOP TO SAVE -# core/bm_input.c -STORE SCENE %c +# core/bm_slicer.c +STOP: THE LAST SAMPLE IS SAVED FIRST # core/gen/bm_fm_rom.c STRINGS -# core/bm_input.c -STRUM - -# core/bm_input.c -STRUM (MS) - -# core/bm_input.c -STU - -# core/bm_input.c -STUT 16 - -# core/bm_input.c -STUT 32 - -# core/bm_input.c -STUT 4 - -# core/bm_input.c -STUT 8 - -# core/bm_ui_draw.c -STUT16 - -# core/bm_ui_draw.c -STUT32 - -# core/bm_ui_draw.c -STUT4 - -# core/bm_ui_draw.c -STUT8 - -# core/bm_input.c core/bm_params.c +# core/bm_input.c core/bm_panel.c core/bm_params.c SUB # core/gen/bm_fm_rom.c @@ -2234,24 +1547,12 @@ SUB BASS # core/gen/bm_fm_rom.c SUPER FM -# core/bm_input.c -SUS2 - -# core/bm_input.c -SUS4 - -# core/bm_params.c +# core/bm_bx7.c core/bm_panel.c core/bm_params.c SUSTAIN # core/bm_input.c SWING -# core/bm_input.c -SWING 50=STRAIGHT - -# core/bm_input.c -SYNC - # core/bm_ui_draw.c SYNC LATENCY @@ -2276,80 +1577,23 @@ SYNTH SNARE # core/bm_ui_draw.c SYSTEM -# core/bm_input.c -T%d BEAT FX - -# core/bm_input.c -T%d COPIED TO T%d - -# core/bm_input.c -T%d DELAY - -# core/bm_input.c -T%d DRIVE - -# core/bm_app.c -T%d ERASED (HOME+OCT- UNDOES) +# core/bm_input.c core/bm_mach.c +T%d CLEARED # core/bm_input.c T%d FILTER -# core/bm_input.c -T%d LENGTH %d - -# core/bm_input.c -T%d LEVEL - -# core/bm_input.c -T%d PAN - -# core/bm_input.c -T%d REVERB - -# core/bm_input.c -T%d SPEED - # core/bm_input.c T%d SPEED %s -# core/bm_input.c -T%d TRANSPOSE - -# core/bm_input.c -T%d: %d BAR - -# core/bm_input.c -T%d: %d BARS - -# core/bm_input.c -T%d: NEXT BAR - -# core/bm_input.c -T1 AND T2 ARE FIXED MACHINES - -# core/bm_ui_draw.c -T1 IS THE SIDECHAIN SOURCE - -# core/bm_input.c core/bm_ui_draw.c -T1 IS THE SOURCE - -# core/bm_input.c core/bm_params.c +# core/bm_panel.c core/bm_params.c TABLE -# core/bm_input.c -TAIL - -# core/bm_input.c core/bm_ui_draw.c +# core/bm_input.c core/bm_slicer.c TAKE -# core/bm_input.c -TAKE %02d > PAD %d - -# core/bm_input.c -TAKE %02d DELETED - # core/bm_app.c -TAKE %02d SAVED: TAKES > KIT +TAKE %02d ON PAD %d # core/bm_app.c TAKE %02d%s @@ -2357,87 +1601,27 @@ TAKE %02d%s # core/bm_app.c TAKE %02d: KIT READY -# core/bm_input.c -TAKE BPM - -# core/bm_input.c -TAKE DISCARDED - -# core/bm_input.c -TAKE KEPT (NOT SAVED) - -# core/bm_app.c core/bm_ui_draw.c -TAKES - -# core/bm_ui_draw.c -TAKES (HOLD EDIT): BLACK 1 = KIT FROM A TAKE - -# core/bm_input.c -TAKES FULL: DELETE ONE - # core/bm_ui_draw.c TAKES+SOUNDS -# core/bm_ui_draw.c -TAKES: FREE %u.%u OF 6 S - -# core/bm_input.c -TAP - -# core/bm_input.c -TAP TEMPO - -# core/bm_input.c core/bm_ui_draw.c -TAPE - # core/bm_input.c TARGET -# core/bm_input.c core/bm_ui_draw.c -TEMPO - # core/bm_input.c -TEMPO (FINE) +TEMPO # core/bm_ui_draw.c -TESTING: SAFE MODE TURNS IT OFF AFTER A CRASH +TEMPO AND SCALE # core/bm_app.c THAT IS NOT A BUBBA SOUND -# core/bm_ui_draw.c -THE GRID, VARIED EVERY BAR - # core/bm_input.c -THE PADS ARE REPLACED +THIS MACHINE IS FIXED -# core/bm_input.c -THE SAMPLER IS NOT COPIED - -# core/bm_input.c -THE SAMPLER STAYS HERE - -# core/bm_input.c -THE SOUND SETTINGS ARE LOST - -# core/bm_input.c core/bm_ui_draw.c -THROW - -# core/bm_input.c +# core/bm_slicer.c THRU -# core/bm_input.c -TICKS - -# core/bm_input.c core/bm_ui_draw.c -TIE - -# core/bm_ui_draw.c -TIME - -# core/bm_input.c -TIMES - # core/gen/bm_fm_rom.c TINEKEYS @@ -2453,49 +1637,40 @@ TOM L # core/bm_params.c TOM M -# core/bm_input.c core/bm_params.c +# core/gen/bm_fm_rom.c +TOMCATBS + +# core/bm_b303.c core/bm_bx7.c core/bm_panel.c core/bm_params.c core/bm_slicer.c TONE # core/bm_input.c TRACK -# core/bm_app.c core/bm_input.c -TRACK COPIED - -# core/bm_app.c -TRACK PASTED - -# core/bm_input.c -TRACK SCALE - -# core/bm_input.c core/bm_params.c +# core/bm_bx7.c core/bm_input.c core/bm_params.c TRANSP -# core/bm_input.c +# core/bm_bx7.c TRANSPOSE -# core/bm_input.c -TRANSPOSE %+d - -# core/bm_params.c +# core/bm_bx7.c core/bm_panel.c core/bm_params.c TRI -# core/bm_input.c -TRIAD +# core/bm_params.c +TRIANGLE -# core/bm_ui_draw.c +# core/bm_slicer.c TRIM # core/gen/bm_fm_rom.c TUBECHIM -# core/bm_input.c core/bm_params.c +# core/bm_panel.c core/bm_params.c TUNE -# core/bm_params.c +# core/bm_b303.c core/bm_params.c core/bm_ui_draw.c TUNING -# core/bm_input.c +# core/bm_mach.c core/bm_slicer.c TURN # core/bm_ui_draw.c @@ -2507,13 +1682,10 @@ TWO CORES OFF # core/bm_input.c TWO CORES ON (TEST) -# core/bm_input.c -UND +# core/bm_bx7.c +TYPE -# core/bm_app.c -UNDONE ON T%d - -# core/bm_params.c +# core/bm_panel.c core/bm_params.c UNISON # core/bm_snap.c @@ -2522,37 +1694,22 @@ UNLICENSE # core/bm_ui_draw.c UNSAVED -# core/bm_input.c core/bm_ui_draw.c +# core/bm_mach.c UP -# core/bm_input.c -UP-DN - -# core/bm_ui_draw.c -UP-DOWN - # core/bm_params.c UPRIGHT # core/bm_input.c VALUE -# core/bm_input.c -VARY - -# core/bm_ui_draw.c -VARY: OTHER PADS - ANCHOR: THE BEATS STAY - -# core/bm_params.c +# core/bm_panel.c core/bm_params.c VCA -# core/bm_ui_draw.c -VCA: ENV +# core/bm_panel.c +VCF -# core/bm_ui_draw.c -VCA: GATE - -# core/bm_params.c +# core/bm_panel.c core/bm_params.c VCF MOD # core/bm_params.c @@ -2564,111 +1721,63 @@ VEL FILT # core/bm_params.c VEL LVL -# core/bm_params.c +# core/bm_bx7.c +VEL SENS + +# core/bm_panel.c core/bm_params.c VELO # core/bm_ui_draw.c VERSION -# core/bm_input.c core/bm_pattern.c +# core/bm_pattern.c VI -# core/bm_input.c -VIEW - -# core/bm_input.c -VIEW: NOTES - -# core/bm_input.c -VIEW: PIANO ROLL (THE WHOLE LOOP) - -# core/bm_input.c core/bm_pattern.c +# core/bm_pattern.c VII -# core/bm_params.c +# core/bm_bx7.c core/bm_panel.c core/bm_params.c VOICE -# core/bm_input.c -VOICING - -# core/bm_ui_draw.c -W1-10 = ADD A PATTERN - -# core/bm_input.c -W1-10 PATTERN W11-16 GO TO MACHINE +# core/bm_mach.c +VOICE RESET -# core/bm_ui_draw.c -W11-16 = GO THERE ON RELEASE - ALG = BPM .1 - -# core/bm_ui_draw.c -W11-16 = TRACK +# core/bm_b303.c core/bm_input.c core/bm_params.c core/bm_ui_draw.c +VOLUME -# core/bm_input.c core/bm_params.c +# core/bm_b303.c core/bm_bx7.c core/bm_panel.c core/bm_params.c WAVE # core/bm_wave.cpp WAVE voice does not fit the shared pool (bm_vpool.h) -# core/bm_input.c -WHITE %d - -# core/bm_input.c -WHITE = CYCLE ACCENT AND GHOST - -# core/bm_input.c -WHITE = CYCLE X1-X4 AND FLAM - -# core/bm_input.c -WHITE = ERASE INSTRUMENT B6 = UNDO - -# core/bm_input.c -WHITE = ERASE STEP BLACK 6 = UNDO - -# core/bm_input.c -WHITE = MAKE NOTE FILL-ONLY - -# core/bm_input.c -WHITE = PASTE BLACK+WHITE = ONE TRACK - # core/bm_ui_draw.c -WHITE = PLAY AND PICK A PAD - PRESETS = ITS TAKE - -# core/bm_input.c -WHITE = PLAY CHORD BLACK 1-4 = EXTEND - -# core/bm_input.c -WHITE = PLAY EFFECT BLACK 1-6 = MUTE +WAVEFORM # core/bm_input.c -WHITE = SET LENGTH BLACK 11 = +16 - -# core/bm_input.c -WHITE = TIE TO NEXT NOTE K1 = GLIDE +WHITE = CYCLE X1-X4 AND FLAM # core/bm_input.c -WHITE = TOGGLE ACCENT +WHITE = MUTE OR PLAY THAT SOUND # core/bm_input.c -WHITE = TOGGLE MUTE BLACK 1-8 = PLAY +WHITE = PICK AND HEAR K1-K4 = THE HIT # core/bm_input.c -WHOLE +WHITE = TOGGLE ACCENT K1 = AMOUNT -# core/bm_params.c +# core/bm_panel.c core/bm_params.c WIDE # core/bm_params.c WINDSOR 93 -# core/bm_input.c core/bm_params.c +# core/bm_params.c YES -# core/bm_ui_draw.c -YOU - # core/bm_input.c core/bm_params.c ZAP -# core/bm_input.c +# core/bm_slicer.c ZOOM diff --git a/tests/test_control.py b/tests/test_control.py index 104ec79..9baf7cb 100644 --- a/tests/test_control.py +++ b/tests/test_control.py @@ -223,8 +223,8 @@ def check(c, what): p.esperar('location.pathname.endsWith("control.html")', 5000) check(p.js('location.pathname.endsWith("control.html") && location.hash === "#sounds" && location.search.includes("mock=1")'), 'sonidos.html lleva a control.html#sounds con la consulta') - p.esperar('document.getElementById("estado").innerText.includes("0.9.0-beta")', 8000, 'conectado') - check('FM-1 · Bubba Machine 0.9.0-beta' in txt('#estado'), 'conecta y lee la versión') + p.esperar('document.getElementById("estado").innerText.includes("0.10.0-beta")', 8000, 'conectado') + check('FM-1 · Bubba Machine 0.10.0-beta' in txt('#estado'), 'conecta y lee la versión') p.esperar('document.getElementById("slots").innerText.includes("1.49")', 5000) check('1.49 s' in txt('#slots') and 'TAKE 03' in txt('#slots') and txt('#slots').count('Libre') == 5, 'TAKES: 3 tomas y 5 lugares libres') m = txt('#machines') @@ -238,7 +238,7 @@ def check(c, what): check('Se prendió normalmente' in d and 'TWO CORES' not in d and 'batería 3.95 V' in d, 'DEVICE: arranque, tensión y sin TWO CORES') p.js('document.getElementById("dlog").click()') p.esperar('!document.getElementById("logtxt").hidden', 3000) - check('Bubba Machine 0.9.0-beta' in txt('#logtxt'), 'DEVICE: el registro') + check('Bubba Machine 0.10.0-beta' in txt('#logtxt'), 'DEVICE: el registro') p.js('document.getElementById("device").open = false') shot('es-1280-conectado.png', 1280) @@ -292,13 +292,13 @@ def check(c, what): p.js('document.getElementById("plist").open = true') shot('es-1280-pendientes.png', 1280) p.ir(base + 'control.html?lang=es&mock=1', 390, movil=True) - p.esperar('document.getElementById("estado").innerText.includes("0.9.0")', 8000) + p.esperar('document.getElementById("estado").innerText.includes("0.10.0")', 8000) check(p.js('document.documentElement.scrollWidth <= 390'), 'ES 390 px: sin barra horizontal') shot('es-390-conectado.png', 390, True) # de vuelta en escritorio: armar todo y mandar, primero sonando p.ir(base + 'control.html?lang=en&mock=1', 1280) - p.esperar('document.getElementById("estado").innerText.includes("0.9.0")', 8000) + p.esperar('document.getElementById("estado").innerText.includes("0.10.0")', 8000) p.archivo('#ftake', wav) p.esperar('!document.getElementById("tok").disabled', 10000) p.js('document.getElementById("tok").click()') @@ -345,7 +345,7 @@ def check(c, what): p.js('document.getElementById("discard").click()') check('No pending' in txt('#pcount'), 'descartar vacía la lista') p.ir(base + 'control.html?lang=en&mock=1', 390, movil=True) - p.esperar('document.getElementById("estado").innerText.includes("0.9.0")', 8000) + p.esperar('document.getElementById("estado").innerText.includes("0.10.0")', 8000) shot('en-390-conectado.png', 390, True) errores = [e for e in p.errores if e and 'beforeunload' not in e] # Chrome avisa que no mostró el aviso de cambios sin mandar check(not errores, 'sin errores en la consola: %s' % (errores or 'ninguno')) diff --git a/tests/test_core.c b/tests/test_core.c index f78ab19..c5f6b03 100644 --- a/tests/test_core.c +++ b/tests/test_core.c @@ -9,10 +9,11 @@ #include #include #include "../hal/bm_hal_sim.h" -#include "../core/bm_app_int.h" +#include "../core/bm_mach.h" #include "../core/bm_util.h" #include "../core/bm_rom.h" #include "../core/bm_drums.h" +#include "../core/bm_wave.h" #include "../core/bm_snap.h" #include "../core/bm_printf.h" #include "../core/bm_wt.h" @@ -115,17 +116,96 @@ static void shot(const char *name) fclose(f); } -static void boot(int erase) +/* El patrón de pruebas (la demo de primer arranque hasta 2026-10-24): acid techno a 160 BPM en La + * menor. BR-8 con el kit 909 (y un shaker de 12 contra 16), una línea de BB-303 con acentos y slides, + * el Slicer cortando la primera toma (si hay), acordes de B-MINI, un pluck de BITTAL y un pad de BUNO-6 + * de cuatro compases. Las pruebas lo cargan en cada arranque desde cero; los patrones de fábrica de + * verdad se prueban en test_factory_and_persist. */ +static void fx_ev(bm_pattern *p, int t, int s, int k, int note, int vel, int len, int prob) +{ + bm_event *e = bm_ev(p, t, s, k); + bm_event_clear(e); + e->note = (uint8_t)note; e->vel = (uint8_t)vel; e->len = (uint8_t)len; e->prob = (uint8_t)prob; +} + +static void fx_tr(bm_tr *d, int lane, const char *pat) +{ + for (int s = 0; pat[s] && s < BM_STEPS; s++) + if (pat[s] == 'x' || pat[s] == 'X') d->st[lane][s] = (uint8_t)(ST_ON | (pat[s] == 'X' ? ST_ACC : 0)); +} + +static void test_pattern(void) +{ + bm_pattern *p = &app.pat; + bm_song *song = &app.song; + bm_pattern_init(p); + p->meta.bpm_x10 = 1600; p->meta.swing = 50; p->meta.root = 9; p->meta.scale = 1; + p->meta.master = 4; p->meta.fill_every = 4; p->meta.chord_set = 0; p->meta.strum = 0; + p->meta.dly_time = 2; p->meta.dly_fb = 45; p->meta.dly_mix = 40; + bm_tr *d = &p->tr[0]; + bm_kit_apply(d, 1); + p->trk[0].source = 1; + fx_tr(d, 0, "x...x...x...x..."); + d->st[0][14] = ST_ON | (1 << ST_COND_SH); + fx_tr(d, 2, ".x.x.x.x.x.x.x.x"); + fx_tr(d, 3, "..x...x...x....."); + d->st[2][14] = ST_ON | ST_ACC | (1 << ST_RAT_SH); + fx_tr(d, 5, "....x.......x..."); + fx_tr(d, 6, "...x.......x..x."); + d->lane[6].level = 70; + fx_tr(d, 12, "xxxxxxxxxxxx"); + d->lane[12].len = 12; d->lane[12].level = 45; + d->st[15][15] = ST_ON | (1 << ST_COND_SH); + d->lane[1].level = 0; + p->trk[1].level = 70; + for (int i = 0; i < BM_TAKES; i++) if (app.take[i].valid) { app_kit_from_take(&app, i, 0); break; } + bm_track_set_engine(p, 2, ENG_ACID); + bm_track *t3 = &p->trk[2]; + t3->macro[0] = 28; t3->macro[1] = 108; t3->macro[2] = 105; t3->macro[3] = 58; t3->glide = 45; t3->accent = 115; + t3->length = 16; t3->send = 25; + static const struct { int8_t s, n; uint8_t acc, slide; } L[] = { + {0, 45, 1, 0}, {1, 45, 0, 0}, {2, 57, 1, 1}, {3, 45, 0, 0}, {4, 48, 0, 0}, {5, 45, 0, 1}, {6, 52, 1, 0}, + {8, 45, 0, 0}, {9, 57, 1, 0}, {10, 55, 0, 1}, {11, 52, 0, 0}, {12, 45, 1, 0}, {13, 48, 0, 1}, {14, 50, 0, 0}, {15, 45, 0, 0}}; + for (unsigned i = 0; i < sizeof L / sizeof L[0]; i++) + fx_ev(p, 2, L[i].s, 0, L[i].n, L[i].acc ? BM_VEL_ACC : BM_VEL_NORMAL, 1 | (L[i].slide ? BM_LEN_TIE : 0), 100); + bm_track_set_engine(p, 3, ENG_MINI); + p->trk[3].source = 0; p->trk[3].length = 32; p->trk[3].send = 45; p->trk[3].rsend = 30; + for (int k = 0; k < 3; k++) { static const int C[3] = {57, 60, 64}; fx_ev(p, 3, 10, k, C[k], 90, 1, 100); fx_ev(p, 3, 26, k, C[k] - 2 + (k == 1), 80, 1, 100); } + p->trk[4].source = 13; bm_preset_apply(p, 4, 13); + p->trk[4].length = 32; p->trk[4].send = 35; p->trk[4].rsend = 60; + { static const int8_t S[6] = {2, 6, 14, 18, 22, 30}, N[6] = {69, 72, 76, 74, 72, 76}; + for (int i = 0; i < 6; i++) fx_ev(p, 4, S[i], 0, N[i], 85, 1, i % 3 == 2 ? 60 : 100); } + p->trk[5].source = 2; bm_preset_apply(p, 5, 2); + p->trk[5].length = 64; p->trk[5].send = 0; p->trk[5].rsend = 70; + for (int k = 0; k < 3; k++) { static const int C[3] = {57, 60, 64}; fx_ev(p, 5, 0, k, C[k], 75, 64, 100); } + p->trk[0].level = 84; p->trk[2].level = 66; p->trk[3].level = 32; p->trk[4].level = 36; p->trk[5].level = 26; + p->meta.rv_mix = 70; + memset(song->scene, 0, sizeof song->scene); + for (int s = 0; s < BM_SCENES; s++) song->scene[0][s].flags = SCN_STORED; + song->scene[0][0].trk_mute = 0x00; + song->scene[0][1].trk_mute = 0x38; + song->scene[0][2].trk_mute = 0x01; + song->scene[0][3].trk_mute = 0x3A; + bm_engines_sync(&app.ctx); + bm_seq_set_bpm(&app.ctx, p->meta.bpm_x10); +} + +/* erase: la flash desde cero; acid: el patrón de pruebas en vez de los de fábrica */ +static void boot_with(int erase, int acid) { if (erase) { bm_sim_flash_erase_all(&sim); sim.flash_writes = 0; } bm_platform pf; bm_sim_platform(&sim, &pf); now_ms = 1000; next_tick = now_ms; acc = 0; bm_app_init(&app, &pf, now_ms); + if (acid) test_pattern(); + sim.flash_writes = 0; /* lo que escribió el arranque (los de fábrica) no cuenta */ for (int i = 0; i < 4; i++) bm_app_master(&app, 900); run_ms(UI_BOOT_MS + 100); } +static void boot(int erase) { boot_with(erase, erase); } + /* Arranque con una toma de prueba: un compás a 161 BPM hecho aquí (bombo en 1 y 3, caja en 2 y 4, * hats en corcheas), como si se hubiera grabado. Mide como la toma de prueba: un compás a 161 BPM. */ static void boot_loop(void) @@ -148,35 +228,40 @@ static void boot_loop(void) bm_take tk[BM_TAKES]; memset(tk, 0, sizeof tk); bm_takes_write(pf.flash, pf.flash_map, pf.user, tk, d, sizeof d, 1610, 1); - boot(0); + boot_with(0, 1); } -/* HOME, SELECT hasta el canal (el cursor del mezclador) y SEQ para entrar (docs/DISENO_0.6.md §5.3). */ -static void ch(int t) +static void put_fm_on_t4(void); + +/* HOME (la consola, sin PLAY/REC) */ +static void to_home(void) { - for (int i = 0; i < 6 && app.view != V_HOME; i++) btn(BTN_HOME, 30); - for (int i = 0; i < 8 && app.track != t; i++) enc(ENC_SELECT, t > app.track ? 1 : -1); - btn(BTN_SEQ, 30); + for (int i = 0; i < 6 && !(app.view == V_HOME && !app.sloop); i++) btn(BTN_HOME, 30); } -static void page(int btn_id, int pg) +/* HOME y SELECT hasta que el cursor del mezclador esté en el canal t */ +static void ch(int t) { - for (int i = 0; i < 4 && !(app.view == V_CH && app.page == pg); i++) btn(btn_id, 30); + to_home(); + for (int i = 0; i < BM_TRACKS && app.track != t; i++) enc(ENC_SELECT, 1); } -/* HOME sostenido + un botón */ -static void home_with(int id) +/* el secuenciador de la batería (SEQ en HOME con el cursor en T1) */ +static void seq0(void) { - down(BTN_HOME); run_ms(40); btn(id, 30); up(BTN_HOME); run_ms(60); + ch(0); + btn(BTN_SEQ, 30); } -/* una tecla sostenida ms milisegundos (las preguntas: 2 s = sí) */ -static void hold_key(int k, uint32_t ms) { kdown(k); run_ms(ms); kup(k); run_ms(40); } +/* PLAY/REC del canal t: la blanca de su canal con el cursor ya en él */ +static void play_rec(int t) +{ + ch(t); + white(BM_CH_W0 + app_pos(t), 40); +} /* las luces y los nombres de las teclas ahora */ static bm_keyfn keys_now[BM_KEYS]; -static const bm_keyfn *keys(void) { bm_app_keys(&app, keys_now); return keys_now; } - /* ------------------------------------------------------------ formato, flash y tomas */ static void test_pack(void) { @@ -192,7 +277,7 @@ static void test_pack(void) CHECK(bm_tr_lock_set(&p.tr[0], 9, 9, 2, 33)); CHECK(bm_tr_lock_get(&p.tr[0], 9, 9, 2) == 33); CHECK(p.tr[0].st[9][9] & ST_LOCK); - CHECK(p.trk[0].engine == ENG_DRUM && p.trk[1].engine == ENG_BREAK && p.trk[2].engine == ENG_ACID && p.trk[3].engine == ENG_FM + CHECK(p.trk[0].engine == ENG_DRUM && p.trk[1].engine == ENG_BREAK && p.trk[2].engine == ENG_ACID && p.trk[3].engine == ENG_MINI && p.trk[4].engine == ENG_BITTAL && p.trk[5].engine == ENG_BUNO); bm_track_set_engine(&p, 0, ENG_FM); /* T1 y T2 son fijos */ bm_track_set_engine(&p, 1, ENG_MINI); @@ -346,37 +431,38 @@ static void gcb(void *u, int id, bm_gkind k) { glog *g = (glog *)u; if (g->n < 6 static void test_gesture(void) { - printf("gestos: toque, mantener, 2 s y combo\n"); + printf("gestos: toque, mantener (capas de SEQ, EDIT, ENV, LFO), 2 s (HOME, SAVE) y combo\n"); bm_gesture g; glog L = {{0}, 0}; bm_gesture_init(&g, gcb, &L); bm_gesture_down(&g, BTN_SCL, 0); bm_gesture_poll(&g, 100); bm_gesture_up(&g, BTN_SCL, 150); CHECK(L.n == 1 && L.log[0] == BTN_SCL * 10 + G_TAP); L.n = 0; - bm_gesture_down(&g, BTN_SEQ, 1000); bm_gesture_poll(&g, 1200); CHECK(L.n == 0); - bm_gesture_poll(&g, 1300); CHECK(L.n == 1 && L.log[0] == BTN_SEQ * 10 + G_HOLD); /* HOLD al cumplirse */ - bm_gesture_poll(&g, 2600); CHECK(L.n == 1); - int id = -1; - CHECK(bm_gesture_progress(&g, 2650, &id) > 100 && id == BTN_SEQ); /* anillo hacia los 2 s */ - bm_gesture_poll(&g, 3001); CHECK(L.n == 2 && L.log[1] == BTN_SEQ * 10 + G_LONG); /* 2 s: pantalla especial */ - bm_gesture_up(&g, BTN_SEQ, 3100); CHECK(L.n == 2); + bm_gesture_down(&g, BTN_GLO, 500); bm_gesture_poll(&g, 1500); bm_gesture_up(&g, BTN_GLO, 1600); + CHECK(L.n == 1 && L.log[0] == BTN_GLO * 10 + G_TAP); /* sin capa: toque aunque dure */ + L.n = 0; + bm_gesture_down(&g, BTN_ENV, 1000); bm_gesture_poll(&g, 1200); CHECK(L.n == 0); + bm_gesture_poll(&g, 1300); CHECK(L.n == 1 && L.log[0] == BTN_ENV * 10 + G_HOLD); /* HOLD al cumplirse */ + bm_gesture_poll(&g, 3100); CHECK(L.n == 1); /* SEQ ya no tiene los 2 s */ + bm_gesture_up(&g, BTN_ENV, 3200); CHECK(L.n == 2 && L.log[1] == BTN_ENV * 10 + G_RELEASE); L.n = 0; - bm_gesture_down(&g, BTN_HOME, 4000); bm_gesture_poll(&g, 4400); - bm_gesture_other(&g, 4500); - bm_gesture_poll(&g, 7000); - CHECK(L.n == 1 && L.log[0] == BTN_HOME * 10 + G_HOLD); /* el combo cancela los 2 s */ - bm_gesture_up(&g, BTN_HOME, 7100); CHECK(L.n == 2 && L.log[1] == BTN_HOME * 10 + G_RELEASE); + bm_gesture_down(&g, BTN_HOME, 4000); bm_gesture_poll(&g, 4400); CHECK(L.n == 0); /* HOME ya no tiene capa */ + int id = -1; + CHECK(bm_gesture_progress(&g, 5000, &id) > 100 && id == BTN_HOME); /* anillo hacia los 2 s */ + bm_gesture_poll(&g, 6001); CHECK(L.n == 1 && L.log[0] == BTN_HOME * 10 + G_LONG); + bm_gesture_up(&g, BTN_HOME, 6100); CHECK(L.n == 1); L.n = 0; - bm_gesture_down(&g, BTN_GLO, 8000); bm_gesture_other(&g, 8050); - CHECK(L.n == 1 && L.log[0] == BTN_GLO * 10 + G_HOLD); /* GLO ahora tiene capa */ - bm_gesture_up(&g, BTN_GLO, 8100); + bm_gesture_down(&g, BTN_HOME, 7000); bm_gesture_other(&g, 7100); + bm_gesture_poll(&g, 9500); + CHECK(L.n == 0); /* el combo cancela los 2 s */ + bm_gesture_up(&g, BTN_HOME, 9600); CHECK(L.n == 0); L.n = 0; bm_gesture_down(&g, BTN_PLAY, 9000); CHECK(L.n == 1 && L.log[0] == BTN_PLAY * 10 + G_PRESS); bm_gesture_up(&g, BTN_PLAY, 9010); L.n = 0; - bm_gesture_down(&g, BTN_SAVE, 10000); bm_gesture_poll(&g, 10400); CHECK(L.n == 1 && L.log[0] == BTN_SAVE * 10 + G_HOLD); - bm_gesture_poll(&g, 12001); CHECK(L.n == 2 && L.log[1] == BTN_SAVE * 10 + G_LONG); - bm_gesture_up(&g, BTN_SAVE, 12100); CHECK(L.n == 2); + bm_gesture_down(&g, BTN_SAVE, 10000); bm_gesture_poll(&g, 10400); CHECK(L.n == 0); + bm_gesture_poll(&g, 12001); CHECK(L.n == 1 && L.log[0] == BTN_SAVE * 10 + G_LONG); + bm_gesture_up(&g, BTN_SAVE, 12100); CHECK(L.n == 1); L.n = 0; bm_gesture_down(&g, BTN_REC, 13000); bm_gesture_up(&g, BTN_REC, 13100); CHECK(L.n == 1 && L.log[0] == BTN_REC * 10 + G_TAP); /* REC: toque (al soltar) */ @@ -412,7 +498,7 @@ static void test_timing(void) static void test_tr_features(void) { - printf("batería TR: repetición, fill y roll\n"); + printf("batería TR: repetición y fill\n"); boot(1); btn(BTN_PLAY, 20); int hits = 0, prev = 0; @@ -425,16 +511,6 @@ static void test_tr_features(void) CHECK(hits >= 2); CHECK(app.pat.meta.fill_every == 4); btn(BTN_PLAY, 20); - ch(0); - down(BTN_ARP); run_ms(400); - CHECK(app.layer == L_ROLL); - kdown(bm_white_key(4)); - int n = 0; - for (int i = 0; i < 40; i++) { run_ms(20); if (app.lane_flash[0][4] > now_ms) n++; } - kup(bm_white_key(4)); - up(BTN_ARP); run_ms(100); - CHECK(n > 5); - CHECK(app.ctx.roll[0].mask == 0 && app.layer == L_NONE); } /* Golpes del instrumento lane de T(t+1) mientras corre el audio ms milisegundos (sin la UI, que @@ -454,185 +530,6 @@ static int roll_hits(int t, int lane, uint32_t ms, uint32_t *at, uint8_t *vel, i return n; } -static void test_roll(void) -{ - printf("ROLL: ARP en T1/T2 (un toque la deja abierta), velocidades, swing, CRESC, cola y REC\n"); - boot(1); - ch(0); - btn(BTN_ARP, 30); /* un toque: abierta */ - CHECK(app.layer == L_ROLL && app.layer_latch && app.view == V_CH && app.track == 0); - CHECK(sim.leds[BTN_ARP] == LED_BREATH && sim.leds[BTN_HOME] == LED_MID); - bm_keyfn K[BM_KEYS]; - bm_app_keys(&app, K); - for (int w = 0; w < 16; w++) { /* con pasos MID, vacío DIM (igual hace roll) */ - const bm_tr *tr = &app.pat.tr[0]; - int len = tr->lane[w].len ? tr->lane[w].len : 16, has = 0; - for (int s = 0; s < len; s++) if (tr->st[w][s] & ST_ON) has = 1; - CHECK(K[bm_white_key(w)].led == (has ? LED_MID : LED_DIM)); - } - CHECK(K[bm_black_key(1)].led == LED_ON && K[bm_black_key(0)].led == LED_DIM && K[bm_black_key(5)].led == LED_DIM); - CHECK(K[bm_black_key(6)].led == LED_DIM && K[bm_black_key(7)].led == LED_DIM && K[bm_black_key(10)].led == LED_DIM); - const char *s1, *s2, *s3; - bm_app_bigknobs(&app, &s1, &s2, &s3); - CHECK(!strcmp(s1, "-") && !strcmp(s2, "-") && !strcmp(s3, "-")); - bm_legend L[4]; - bm_app_legend(&app, L); - CHECK(!strcmp(L[0].name, "RATE") && !strcmp(L[0].val, "1/16") && !strcmp(L[2].name, "SWING") && !strcmp(L[3].name, "TAIL")); - { - char title[24]; uint16_t col; const char *h1, *h2; - bm_app_keymap(&app, K, title, sizeof title, &col, &h1, &h2); - CHECK(!strcmp(title, "ROLL") && !strncmp(h2, "EXIT:", 5) && strlen(h1) <= 38 && strlen(h2) <= 38); - } - btn(BTN_ARP, 30); /* ARP otra vez: cerrada */ - CHECK(app.layer == L_NONE && !app.layer_latch); - btn(BTN_ARP, 30); - CHECK(app.layer == L_ROLL); - btn(BTN_HOME, 30); /* HOME: cerrada, sigues en el canal */ - CHECK(app.layer == L_NONE && !app.layer_latch && app.view == V_CH); - btn(BTN_LFO, 30); /* REPEAT (LFO en BR-8) abierta: ARP la cambia por ROLL */ - CHECK(app.layer == L_REP && app.layer_latch); - btn(BTN_ARP, 30); - CHECK(app.layer == L_ROLL && app.layer_latch); - btn(BTN_HOME, 30); - CHECK(app.layer == L_NONE); - down(BTN_ARP); run_ms(400); /* sostener: solo mientras lo sostienes */ - CHECK(app.layer == L_ROLL && !app.layer_latch); - up(BTN_ARP); run_ms(60); - CHECK(app.layer == L_NONE); - btn(BTN_ARP, 30); /* abierta y luego sostener ARP: se cierra al soltar */ - down(BTN_ARP); run_ms(400); - CHECK(app.layer == L_ROLL && !app.layer_latch); - up(BTN_ARP); run_ms(60); - CHECK(app.layer == L_NONE); - - double fpt = BM_FS * 60.0 / (app.pat.meta.bpm_x10 / 10.0 * BM_PPQN); /* muestras por tick */ - uint32_t at[64]; uint8_t vel[64]; - btn(BTN_ARP, 30); - black(4, 40); /* 1/16T: cada 16 ticks */ - CHECK(app.roll_rate == 4); - kdown(bm_white_key(5)); - int n = roll_hits(0, 5, 700, at, vel, 64); - CHECK(n >= 8); - int ok = 1; - for (int i = 1; i < n && i < 64; i++) if (fabs((double)(at[i] - at[i - 1]) - 16 * fpt) > 40) ok = 0; - CHECK(ok); - black(5, 40); /* 1/32T, con la tecla sostenida */ - CHECK(app.roll_rate == 5); - n = roll_hits(0, 5, 300, at, vel, 64); - ok = n >= 8; - for (int i = 1; i < n && i < 64; i++) if (fabs((double)(at[i] - at[i - 1]) - 8 * fpt) > 40) ok = 0; - CHECK(ok); - kup(bm_white_key(5)); - CHECK(roll_hits(0, 5, 300, at, vel, 64) == 0); /* sin cola: soltar lo corta */ - - black(1, 40); /* 1/16 con swing 75 %: 36 + 12 ticks */ - enc(ENC_K3, 25); - CHECK(app.roll_swing == 75 && app.ctx.roll_cfg.swing == 75); - kdown(bm_white_key(5)); - n = roll_hits(0, 5, 800, at, vel, 64); - kup(bm_white_key(5)); - ok = n >= 5; - for (int i = 2; i < n && i < 64; i++) { - double a1 = (double)(at[i - 1] - at[i - 2]), a2 = (double)(at[i] - at[i - 1]); - if (fabs(a1 + a2 - 48 * fpt) > 60 || fabs(fabs(a1 - a2) - 24 * fpt) > 60) ok = 0; - } - CHECK(ok); - enc(ENC_K3, -25); - CHECK(app.roll_swing == 50); - roll_hits(0, 5, 100, at, vel, 64); - - black(6, 40); /* CRESC en 1/4: la velocidad sube hasta 127 */ - enc(ENC_K2, -2); - CHECK(app.roll_ramp == 1 && app.roll_len == 0 && app.ctx.roll_cfg.ramp == 1 && app.ctx.roll_cfg.ramp_len == BM_PPQN); - bm_app_keys(&app, K); - CHECK(K[bm_black_key(6)].led == LED_ON && K[bm_black_key(7)].led == LED_DIM); - bm_app_legend(&app, L); - CHECK(!strcmp(L[1].name, "CRESC") && !strcmp(L[1].val, "1/4")); - kdown(bm_white_key(5)); - n = roll_hits(0, 5, 900, at, vel, 64); - ok = n >= 6 && vel[0] < 70 && vel[n - 1] == 127; - for (int i = 1; i < n && i < 64; i++) if (vel[i] < vel[i - 1]) ok = 0; - CHECK(ok); - run_ms(UI_OVERLAY_MS + 100); /* sin el aviso de la perilla */ - shot("22b-roll-latched"); - kup(bm_white_key(5)); - black(7, 40); /* DECRESC: baja */ - CHECK(app.roll_ramp == 2); - kdown(bm_white_key(5)); - n = roll_hits(0, 5, 900, at, vel, 64); - kup(bm_white_key(5)); - CHECK(n >= 6 && vel[0] > vel[n - 1] && vel[n - 1] == 24); - black(7, 40); - CHECK(app.roll_ramp == 0 && app.ctx.roll_cfg.ramp == 0); - - enc(ENC_K4, 3); /* cola de 1/4: 4 golpes de 1/16 más */ - CHECK(app.roll_tail == 3 && app.ctx.roll_cfg.tail == BM_PPQN); - kdown(bm_white_key(5)); - roll_hits(0, 5, 500, at, vel, 64); - kup(bm_white_key(5)); - n = roll_hits(0, 5, 400, at, vel, 64); - CHECK(n >= 3 && n <= 5); - CHECK(roll_hits(0, 5, 300, at, vel, 64) == 0 && app.ctx.roll[0].tail_m == 0); - enc(ENC_K4, -3); - - kdown(bm_black_key(10)); /* negra 11: el fill mientras la sostienes */ - run_ms(60); - CHECK(app.fill && app.ctx.fill); - bm_app_keys(&app, K); - CHECK(K[bm_black_key(10)].led == LED_ON); - kup(bm_black_key(10)); - run_ms(60); - CHECK(!app.fill && !app.ctx.fill && app.layer == L_ROLL); - - /* REC: el roll se graba como pasos con repetición, y CRESC como acentos */ - int lane = -1; - for (int w = 0; w < 16 && lane < 0; w++) { - int any = 0; - for (int s = 0; s < BM_STEPS; s++) if (app.pat.tr[0].st[w][s]) any = 1; - if (!any) lane = w; - } - CHECK(lane >= 0); - if (lane < 0) lane = 15; - btn(BTN_PLAY, 20); - btn(BTN_REC, 30); /* REC no cierra ROLL */ - CHECK(app.rec && app.layer == L_ROLL && app.layer_latch); - black(2, 40); /* 1/32 = x2 por paso */ - black(6, 40); /* CRESC */ - kdown(bm_white_key(lane)); - run_ms(1100); - kup(bm_white_key(lane)); - run_ms(60); - btn(BTN_REC, 30); - btn(BTN_PLAY, 20); - int on = 0, rat = 0, acc = 0, flat = 0; - for (int s = 0; s < 16; s++) { - uint8_t b = app.pat.tr[0].st[lane][s]; - if (!(b & ST_ON)) continue; - on++; - if (((b & ST_RAT_MASK) >> ST_RAT_SH) == 1) rat++; - if (b & ST_ACC) acc++; else flat++; - } - CHECK(on >= 6 && rat >= 6 && acc >= 1 && flat >= 1); - black(6, 40); - btn(BTN_ARP, 30); - CHECK(app.layer == L_NONE && app.roll_mask == 0); - - /* T2 (pads): lo mismo; REC en ROLL graba lo que tocas, no abre la grabadora */ - ch(1); - btn(BTN_ARP, 30); - CHECK(app.track == 1 && app.layer == L_ROLL && app.layer_latch); - btn(BTN_REC, 30); - CHECK(app.rec && app.page != PG_REC && app.layer == L_ROLL && !app.ctx.st.smp_armed); - btn(BTN_REC, 30); - CHECK(!app.rec); - kdown(bm_white_key(3)); - run_ms(100); - CHECK(app.ctx.roll[1].mask == (1u << 3)); - kup(bm_white_key(3)); - btn(BTN_HOME, 30); - CHECK(app.layer == L_NONE && app.ctx.roll[1].mask == 0); -} - static void test_voices(void) { printf("voces: pool de 7 con robo y fade\n"); @@ -648,986 +545,149 @@ static void test_voices(void) run_ms(500); } -/* ------------------------------------------------------------ navegación 3.0 */ -static void test_navigation(void) +static void test_free_rec(void) { - printf("navegación 0.9: HOME = la consola (MIX y FX), SELECT cursor, ALGORITHM BPM, PRESETS el sonido, GLO de la máquina\n"); + printf("PLAY/REC en un canal vacío: graba sobre su largo (no lo alarga, como SLOOP); al final da la vuelta\n"); boot(1); - CHECK(app.view == V_HOME && app.track == 0); - shot("00-home"); - int bpm = app.pat.meta.bpm_x10; - enc(ENC_ALGO, 1); enc(ENC_ALGO, 1); /* HOME: ALGORITHM = BPM */ - CHECK(app.pat.meta.bpm_x10 == bpm + 20 && app.view == V_HOME && app.ov.beat && app.ov.color == C_TEMPO); - shot("05b-home-tempo"); - enc(ENC_ALGO, -2); - enc(ENC_SELECT, 1); enc(ENC_SELECT, 1); /* SELECT: el cursor del mezclador */ - CHECK(app.track == 2 && app.view == V_HOME && !app.card); - int lv = app.pat.trk[2].level; - enc(ENC_K1, -2); /* K1 = el volumen del canal del cursor */ - CHECK(app.pat.trk[2].level == lv - 2); - enc(ENC_K2, -2); /* K2 = el filtro DJ del canal: el centro retiene 2 detents */ - CHECK(app.pat.trk[2].djf == 0); - run_ms(1000); - enc(ENC_K2, -4); /* a la izquierda pasa-bajos */ - CHECK(app.pat.trk[2].djf == 2); - enc(ENC_K2, 2); /* volviendo, se para en el centro */ - CHECK(app.pat.trk[2].djf == 0); - enc(ENC_K2, 3); /* a la derecha pasa-altos */ - CHECK(app.pat.trk[2].djf == 64 + 1); - enc(ENC_K2, -1); /* al centro: abierto */ - CHECK(app.pat.trk[2].djf == 0); - int sd = app.pat.trk[2].send, rv2 = app.pat.trk[2].rsend; - enc(ENC_K3, 2); enc(ENC_K4, 2); /* K3 = delay, K4 = reverb */ - CHECK(app.pat.trk[2].send == sd + 2 && app.pat.trk[2].rsend == rv2 + 2); - int src = app.pat.trk[2].source; /* PRESETS = el sonido del canal del cursor (0.9) */ - enc(ENC_PRESETS, 1); run_ms(30); - CHECK(app.pat.trk[2].source == (src + 1) % BM_AC_PRESETS && app.view == V_HOME && app.move == 0); - { - const char *s, *al, *pr; - bm_app_bigknobs(&app, &s, &al, &pr); - CHECK(!strcmp(s, "TRACK") && !strcmp(al, "BPM") && !strcmp(pr, "SOUND")); - } - enc(ENC_PRESETS, -1); run_ms(30); - CHECK(app.pat.trk[2].source == src); - run_ms(UI_OVERLAY_MS + 100); - shot("01-home-mixer"); - enc(ENC_K3, -2); enc(ENC_K4, -2); - btn(BTN_SEQ, 30); /* SEQ entra al canal del cursor */ - CHECK(app.view == V_CH && app.track == 2 && app.page == PG_SEQ); - shot("06-seq-bass"); - btn(BTN_EDIT, 30); - CHECK(app.page == PG_SOUND); - /* HOME + blanca 14 (T4): a esa máquina al soltar HOME (0.9: en lugar de HOME + SELECT) */ - down(BTN_HOME); run_ms(60); - white(13, 40); - CHECK(app.layer == L_HOME && app.home_go == 4 && app.view == V_CH); - CHECK(keys()[bm_white_key(13)].led == LED_BLINK); - shot("62-home-go"); - up(BTN_HOME); run_ms(60); - CHECK(!app.home_go && app.track == 3 && app.view == V_CH && app.layer == L_NONE); - btn(BTN_EDIT, 30); - CHECK(app.page == PG_SOUND); - app.ed_page[3] = 0; /* BX-7: ALGORITHM, con el dibujo */ - shot("12-fm"); - enc(ENC_SELECT, 1); /* SELECT: las páginas de la máquina y luego las pestañas */ - CHECK(app.page == PG_SOUND && app.ed_page[3] == 1); - enc(ENC_SELECT, -1); enc(ENC_SELECT, -1); /* antes de la primera: SEQ (ya no hay MACHINE) */ - CHECK(app.page == PG_SEQ); - /* GLO dentro de la máquina: su GLO (MORE adentro, sin pestaña); GLO otra vez = de vuelta */ - btn(BTN_GLO, 30); - CHECK(app.view == V_CH && app.page == PG_MORE && sim.leds[BTN_GLO] == LED_ON); - shot("45-machine-glo"); - btn(BTN_GLO, 30); - CHECK(app.view == V_CH && app.page == PG_SEQ); - { - uint8_t tabs[8]; - int n = bm_app_tabs(&app, 3, tabs), more = 0; - for (int i = 0; i < n; i++) more |= tabs[i] == PG_MORE; - CHECK(!more && n == 5); - } - btn(BTN_FX, 30); - CHECK(app.page == PG_MIX && !app.mix_page); - lv = app.pat.trk[3].level; - enc(ENC_K1, -2); run_ms(300); enc(ENC_K1, -2); /* despacio: sin aceleración */ - CHECK(app.pat.trk[3].level == lv - 4); - int rv = app.pat.trk[3].rsend; - enc(ENC_K4, 1); enc(ENC_K4, 1); enc(ENC_K4, 1); /* K4 = el envío a la reverb */ - CHECK(app.pat.trk[3].rsend == rv + 3); - shot("14-mix"); - btn(BTN_FX, 30); /* FX otra vez: DUCK */ - CHECK(app.page == PG_MIX && app.mix_page); - int dk = app.pat.trk[3].duck; - enc(ENC_K1, 2); - CHECK(app.pat.trk[3].duck == dk + 2); - run_ms(UI_OVERLAY_MS + 100); - shot("14b-mix-duck"); - btn(BTN_HOME, 30); - CHECK(app.view == V_HOME); - btn(BTN_HOME, 30); /* HOME otra vez: sigue en MIX (0.9) */ - CHECK(app.view == V_HOME); - /* FX en HOME: el FX de la consola; otra vez, la página siguiente: CHANNEL > DELAY > REVERB > MASTER */ - btn(BTN_FX, 30); CHECK(app.view == V_FXG && app.fx_page == FXP_CHANNEL); - btn(BTN_FX, 30); btn(BTN_FX, 30); btn(BTN_FX, 30); CHECK(app.view == V_FXG && app.fx_page == FXP_MASTER); - enc(ENC_K1, -20); /* MASTER: K1 = el filtro del master */ - CHECK(app.pat.meta.mfilt < 60); - enc(ENC_K2, 1); /* K2 = BEAT FX */ - CHECK(app.pat.meta.beatfx == 1); - shot("39-home-fx-master"); - enc(ENC_K1, 20); enc(ENC_K2, -1); - enc(ENC_PRESETS, -4); /* en el FX, PRESETS = MOVE; el centro retiene 2 */ - run_ms(30); - CHECK(app.move == -2 && app.ctx.move == -2 && app.view == V_FXG); - enc(ENC_PRESETS, 2); - run_ms(30); - CHECK(app.move == 0 && app.ctx.move == 0); - btn(BTN_HOME, 30); CHECK(app.view == V_HOME); - /* HOME + FX: el FX de la consola; otra vez, la página siguiente */ - home_with(BTN_FX); - CHECK(app.view == V_FXG && app.fx_page == FXP_CHANNEL); - home_with(BTN_FX); home_with(BTN_FX); - CHECK(app.view == V_FXG && app.fx_page == FXP_REVERB); - int rs = app.pat.meta.rv_size; - enc(ENC_K1, 2); - CHECK(app.pat.meta.rv_size == rs + 2); - shot("50-fx-reverb"); - /* GLO de la consola (HOME + GLO desde una máquina): TEMPO > MACHINES > SCALE > SONG */ - ch(3); - home_with(BTN_GLO); - CHECK(app.view == V_GLO && app.glo_page == GP_TEMPO); - int sw = app.pat.meta.swing; - enc(ENC_SELECT, 1); enc(ENC_ALGO, 1); /* SWING +1 */ - CHECK(app.pat.meta.swing == sw + 1); - run_ms(UI_OVERLAY_MS + 100); - shot("24-glo-tempo"); - btn(BTN_GLO, 30); CHECK(app.glo_page == GP_MACH); - btn(BTN_GLO, 30); CHECK(app.glo_page == GP_SCALE); - btn(BTN_GLO, 30); CHECK(app.glo_page == GP_SONG); - btn(BTN_GLO, 30); CHECK(app.glo_page == GP_TEMPO); + app_push(&app, CMD_TRACK_CLEAR, 5, 0, 0); /* vaciar T6 */ + app_set_track(&app, 5, TRK_OFF(length), 32); + run_ms(60); + play_rec(5); + CHECK(app.sloop && app.track == 5 && !app.rec && app.view == V_HOME); + btn(BTN_PLAY, 20); run_ms(200); + btn(BTN_REC, 30); + CHECK(app.rec && app.pat.trk[5].length == 32); + uint32_t bar = 60000u * 4u / 160u; /* ms por compás a 160 BPM */ + key(bm_white_key(4), 600); /* nota larga */ + run_ms(bar / 2); + key(bm_white_key(7), 150); + run_ms(bar + bar / 4); + shot("51-seq-free-rec"); + btn(BTN_REC, 30); + run_ms(100); + CHECK(!app.rec && app.pat.trk[5].length == 32 && app.sloop); + for (int s = 32; s < BM_STEPS; s++) for (int k = 0; k < BM_EVENTS; k++) CHECK(bm_event_empty(bm_evc(&app.pat, 5, s, k))); + int n = 0, longest = 0; + for (int s = 0; s < BM_STEPS; s++) + for (int k = 0; k < BM_EVENTS; k++) { + const bm_event *e = bm_evc(&app.pat, 5, s, k); + if (bm_event_empty(e)) continue; + n++; + if ((int)(e->len & BM_LEN_MASK) > longest) longest = (int)(e->len & BM_LEN_MASK); + } + CHECK(n >= 2 && longest >= 4); /* la nota larga dura lo que se sostuvo */ + btn(BTN_PLAY, 20); btn(BTN_HOME, 30); - CHECK(app.view == V_HOME); + CHECK(app.view == V_HOME && !app.sloop && !app.rec); } -static void test_home(void) +/* Hace sonar un canal solo y devuelve el pico (0..1). */ +static double solo_peak(int t, const uint8_t *notes, int n, int vel, uint32_t ms) { - printf("HOME sostenido en todas partes: la consola (patrones, canales, mutes, solo, cadenas) y HOME + botón\n"); - boot(1); - ch(2); - btn(BTN_PLAY, 20); + for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = (uint8_t)(i != t); + bm_cmd c; memset(&c, 0, sizeof c); run_ms(300); - down(BTN_HOME); run_ms(400); - CHECK(app.layer == L_HOME && app.view == V_CH); - shot("20-layer-home"); - white(4, 40); /* patrón 5 en cola */ - CHECK(app.ctx.st.queued == 4); - black(0, 40); /* toque = mute T1 */ - CHECK(app.pat.trk[0].mute == 1); - kdown(bm_black_key(3)); run_ms(500); /* mantener negra 4 = solo T4 */ - CHECK(app.pat.trk[3].mute == 0 && app.pat.trk[2].mute == 1 && app.pat.trk[5].mute == 1); - CHECK(keys()[bm_black_key(3)].led == LED_ON); - kup(bm_black_key(3)); run_ms(80); - CHECK(app.pat.trk[0].mute == 1 && app.pat.trk[2].mute == 0 && app.pat.trk[3].mute == 0); /* vuelve */ - black(0, 40); - CHECK(app.pat.trk[0].mute == 0); - kdown(bm_white_key(1)); run_ms(40); white(2, 40); kup(bm_white_key(1)); run_ms(40); /* dos blancas: cadena */ - CHECK(app.ctx.st.pchain_n == 2); - white(12, 40); /* blanca 13 = T3, no un patrón */ - CHECK(app.ctx.st.pchain_n == 2 && app.home_go == 3); - up(BTN_HOME); run_ms(60); - CHECK(app.layer == L_NONE && app.view == V_CH && app.track == 2); /* HOME + T3: la misma máquina */ - btn(BTN_PLAY, 20); - /* HOME + botón */ - home_with(BTN_SEQ); - CHECK(app.view == V_GLO && app.glo_page == GP_SONG); - ch(0); - page(BTN_SEQ, PG_SEQ); - white(0, 40); /* quita el bombo del paso 1 */ - CHECK(!(app.pat.tr[0].st[0][0] & ST_ON)); - home_with(BTN_OCT_DN); - CHECK(app.pat.tr[0].st[0][0] & ST_ON); /* HOME + OCT- deshace */ - home_with(BTN_FX); - CHECK(app.view == V_FXG); - shot("50-fx-global"); - home_with(BTN_SCL); - CHECK(app.view == V_GLO && app.glo_page == GP_SCALE); - home_with(BTN_GLO); /* ya en GLO: la página siguiente */ - CHECK(app.view == V_GLO && app.glo_page == GP_SONG); - home_with(BTN_PLAY); - CHECK(app.ctx.st.playing); /* HOME + PLAY: desde el paso 1 */ - btn(BTN_PLAY, 20); - /* HOME + EDIT: copiar un canal (T4 BX-7 a T5: las notas y la máquina con su sonido); EDIT 2 s pega */ - ch(3); - home_with(BTN_EDIT); - CHECK(app.view == V_COPYCH && app.copy_src == 3); - for (int i = 0; i < 12 && app.copy_dst != 4; i++) enc(ENC_ALGO, 1); - CHECK(sim.leds[BTN_EDIT] == LED_BLINK && sim.leds[BTN_HOME] == LED_ON && sim.leds[BTN_OCT_UP] == LED_OFF); - shot("49-copy-channel"); - btn(BTN_EDIT, 2200); run_ms(100); - CHECK(app.pat.trk[4].engine == ENG_FM && app.view == V_CH && app.track == 4); - CHECK(memcmp(app.pat.prm[4], app.pat.prm[3], BM_PRM) == 0 && app.pat.trk[4].source == app.pat.trk[3].source); - CHECK(!bm_event_empty(bm_evc(&app.pat, 4, 10, 0)) && bm_evc(&app.pat, 4, 10, 0)->note == 57); + peak_abs = 0; + for (int i = 0; i < n; i++) { + c.type = CMD_NOTE_ON; c.a = (uint8_t)t; c.b = notes[i]; c.c = (uint8_t)vel; bm_cmd_push(&app.cmdq, &c); + run_ms(ms); + c.type = CMD_NOTE_OFF; bm_cmd_push(&app.cmdq, &c); + run_ms(60); + } + return peak_abs; } -/* Negras 10 y 11 en la batería: un toque deja abierta la pantalla de MUTE o de FILL; mantener = solo - * mientras la sostienes. En INSTR, ALGORITHM elige instrumento con el recuadro. */ -static int t2_steps(void) +/* BX-7 a mano en T4 (con BITTAL y BUNO-6 de fábrica serían tres pesadas: el selector no lo deja) */ +static void put_fm_on_t4(void) { - int n = 0; - for (int l = 0; l < BM_LANES; l++) for (int s = 0; s < BM_STEPS; s++) if (app.pat.tr[1].st[l][s] & ST_ON) n++; - return n; + app.pat.trk[3].engine = ENG_FM; + app.pat.trk[3].source = 0; + bm_preset_apply(&app.pat, 3, 0); + bm_engines_sync(&app.ctx); + run_ms(40); } -static void test_button_lights(void) +static void test_fm(void) { - printf("luces de los botones: SAVE pendiente, capas, página, REC sostenido en la grabadora\n"); - boot(1); - run_ms(UI_AUTOSAVE_MS + 1500); /* el demo ya está guardado */ - ch(0); - page(BTN_SEQ, PG_SEQ); - CHECK(sim.leds[BTN_SEQ] == LED_ON && sim.leds[BTN_SAVE] == LED_DIM && sim.leds[BTN_ENV] == LED_DIM); - white(15, 40); /* una edición */ - CHECK(sim.leds[BTN_SAVE] == LED_DIM); /* dentro de la máquina: sin avisos globales */ - btn(BTN_HOME, 30); - CHECK(app.view == V_HOME && sim.leds[BTN_SAVE] == LED_BREATH); /* en la consola: algo sin guardar */ - CHECK(sim.leds[BTN_HOME] == LED_ON && sim.leds[BTN_SEQ] == LED_MID && sim.leds[BTN_EDIT] == LED_MID); - btn(BTN_FX, 30); /* FX en HOME: el FX de la consola */ - CHECK(app.view == V_FXG && sim.leds[BTN_HOME] == LED_ON && sim.leds[BTN_FX] == LED_MID); - CHECK(sim.leds[BTN_OCT_DN] == LED_OFF && sim.leds[BTN_OCT_UP] == LED_OFF); /* el cursor en T1 (batería): sin octava */ - ch(0); - CHECK(sim.leds[BTN_OCT_DN] == LED_OFF && sim.leds[BTN_OCT_UP] == LED_OFF); /* batería: OCT apagados */ - /* SISTEMA > LED: solo los botones en reposo */ - app.set.led_dim = 2; run_ms(60); - CHECK(sim.leds[BTN_ENV] == LED_MID && sim.leds[BTN_SEQ] == LED_ON); - app.set.led_dim = 0; run_ms(60); - CHECK(sim.leds[BTN_ENV] == LED_OFF && sim.leds[BTN_SEQ] == LED_ON); - app.set.led_dim = 1; run_ms(60); - /* MUTE de instrumentos (negra 11 sostenida) no tiene botón: no respira OCT- ni SEQ */ - kdown(bm_black_key(10)); run_ms(400); - CHECK(app.layer == L_LANEMUTE && !app.layer_latch); - CHECK(sim.leds[BTN_OCT_DN] == LED_OFF && sim.leds[BTN_SEQ] == LED_OFF && sim.leds[BTN_HOME] == LED_OFF); - kup(bm_black_key(10)); run_ms(60); - CHECK(app.layer == L_NONE); - /* FILL en un canal de notas (negra 11): HOME la cierra; OCT cambia la octava */ - ch(2); - page(BTN_SEQ, PG_SEQ); - CHECK(sim.leds[BTN_OCT_DN] == LED_DIM && sim.leds[BTN_OCT_UP] == LED_DIM); - black(10, 40); - CHECK(app.layer == L_FILL && sim.leds[BTN_SEQ] == LED_OFF && sim.leds[BTN_HOME] == LED_MID); - btn(BTN_HOME, 30); - CHECK(app.layer == L_NONE && app.view == V_CH); - ch(0); - /* ENV en la batería abre INSTR: se enciende ENV, no EDIT */ - btn(BTN_ENV, 30); - CHECK(app.page == PG_INST && sim.leds[BTN_ENV] == LED_ON && sim.leds[BTN_EDIT] == LED_DIM); - /* la grabadora: REC sostenido 2.5 s graba la mezcla y no borra la pista */ - ch(1); - if (!t2_steps()) white(0, 40); - int before = t2_steps(); - CHECK(before > 0); - btn(BTN_REC, 30); /* a la GRABADORA, armada */ - CHECK(app.page == PG_REC && app.ctx.st.smp_armed && sim.leds[BTN_REC] == LED_BREATH); - btn(BTN_REC, 30); /* desarmar */ - CHECK(!app.ctx.st.smp_armed); - down(BTN_REC); run_ms(1000); - CHECK(app.ctx.st.smp_rec && sim.leds[BTN_REC] == LED_BLINK); - run_ms(1500); - CHECK(app.ctx.st.smp_rec); /* a los 2 s sigue grabando */ - up(BTN_REC); run_ms(60); - CHECK(!app.ctx.st.smp_rec && (app.ctx.st.smp_unsaved || app.take[0].valid) && app.page == PG_REC && app.ask == ASK_NONE); - CHECK(t2_steps() == before); -} - -static void test_key_screens(void) -{ - printf("negra 11: HI/LO y MUTE de instrumentos (batería), FILL (notas); B9/B10 = páginas; ALGORITHM en INSTR\n"); + printf("BX-7 (solo el motor): los 16 patches suenan sin saturar, las voces se liberan\n"); boot(1); - ch(0); - page(BTN_SEQ, PG_SEQ); - app.sel_lane[0] = 2; /* CL HH */ - black(10, 40); /* un toque: el otro banco */ - CHECK(app.layer == L_NONE && app.sel_lane[0] == 10); - black(10, 40); - CHECK(app.sel_lane[0] == 2); - kdown(bm_black_key(10)); run_ms(400); /* sostenida: MUTE mientras la sostienes */ - CHECK(app.layer == L_LANEMUTE && !app.layer_latch); - shot("63-mutes"); - { /* luces de MUTE: con pasos y sonando MID (y destella con cada golpe), muteado DIM, vacío OFF */ - bm_keyfn K[BM_KEYS]; - int full = -1; - memset(app.pat.tr[0].st[15], 0, sizeof app.pat.tr[0].st[15]); /* el 16 queda vacío */ - for (int l = 0; l < 15 && full < 0; l++) { - if ((app.pat.tr[0].mute >> l) & 1) continue; - int len = app.pat.tr[0].lane[l].len ? app.pat.tr[0].lane[l].len : 16; - for (int s = 0; s < len; s++) if (app.pat.tr[0].st[l][s] & ST_ON) { full = l; break; } - } - CHECK(full >= 0); - bm_app_keys(&app, K); - CHECK(K[bm_white_key(full)].led == LED_MID && K[bm_white_key(15)].led == LED_OFF); - CHECK(K[bm_black_key(10)].led == LED_BREATH && strcmp(K[bm_black_key(10)].label, "X") == 0); - app.lane_flash[0][full] = app.now + 90; /* acaba de sonar */ - bm_app_keys(&app, K); - CHECK(K[bm_white_key(full)].live); - white(full, 40); /* muteado: tenue y sin destello */ - app.lane_flash[0][full] = app.now + 90; - bm_app_keys(&app, K); - CHECK(K[bm_white_key(full)].led == LED_DIM && !K[bm_white_key(full)].live); - white(full, 40); - app.lane_flash[0][full] = 0; + CHECK(bm_engine_ok(3, ENG_FM) && app.pat.trk[3].engine == ENG_MINI); + put_fm_on_t4(); + static const uint8_t notes[3] = {48, 60, 67}; + wav_open("fm.wav"); + int ok = 0; + for (int p = 0; p < BM_FM_PATCHES; p++) { + app.pat.trk[3].source = (uint8_t)p; + memcpy(app.pat.fmv, bm_fm_patch(p), BM_FM_PATCH); app.ctx.fmv_gen++; + double pk = solo_peak(3, notes, 3, 110, 450); + printf(" %-8s pico %.2f\n", bm_fm_names[p], pk); + if (pk > 0.03 && pk < 0.99) ok++; } - white(2, 40); /* mutea el hat cerrado */ - CHECK((app.pat.tr[0].mute >> 2) & 1); - white(2, 40); - CHECK(!((app.pat.tr[0].mute >> 2) & 1)); - kup(bm_black_key(10)); run_ms(40); /* soltar: sale, sin cambiar de banco */ - CHECK(app.layer == L_NONE && app.sel_lane[0] == 2); - /* B9 / B10: las páginas de pasos (MID si hay página para ese lado, OFF si no) */ - down(BTN_SEQ); run_ms(400); - black(10, 40); /* capa LENGTH: negra 11 = +16 */ - CHECK(app.len_page == 1); - white(15, 40); /* largo 32 */ - up(BTN_SEQ); run_ms(60); - CHECK(app.pat.tr[0].lane[2].len == 32 && app.view == V_CH && app.page == PG_SEQ); - CHECK(keys()[bm_black_key(8)].led == LED_OFF && keys()[bm_black_key(9)].led == LED_MID); - CHECK(!strcmp(keys()[bm_black_key(8)].label, "<") && !strcmp(keys()[bm_black_key(9)].label, ">")); - black(9, 40); - CHECK(app.step_page == 1 && keys()[bm_black_key(8)].led == LED_MID && keys()[bm_black_key(9)].led == LED_OFF); - black(9, 40); - CHECK(app.step_page == 1); - white(0, 40); /* la blanca 1 es el paso 17 */ - CHECK(app.pat.tr[0].st[2][16] & ST_ON); - black(8, 40); - CHECK(app.step_page == 0); - /* FILL de notas: la negra 11 en un canal de notas (la batería ya no tiene pantalla de FILL) */ - ch(2); - page(BTN_SEQ, PG_SEQ); - black(10, 40); - CHECK(app.layer == L_FILL && app.layer_latch && app.fill && app.ctx.fill); - app.step_page = 0; - white(0, 40); /* paso 1 (con nota): solo en el fill */ - CHECK(bm_evc(&app.pat, 2, 0, 0)->prob == BM_PROB_FILL); - shot("64-fill"); - white(0, 40); /* otra vez: siempre */ - CHECK(bm_evc(&app.pat, 2, 0, 0)->prob == 100); - black(10, 40); - CHECK(app.layer == L_NONE && !app.fill && !app.ctx.fill); - /* INSTR: ALGORITHM recorre los instrumentos con el recuadro */ - ch(0); - page(BTN_EDIT, PG_SOUND); btn(BTN_EDIT, 30); - CHECK(app.page == PG_INST); - int l0 = app.sel_lane[0]; - enc(ENC_ALGO, 1); enc(ENC_ALGO, 1); - CHECK(app.box_on && app.box_mode == BOX_LANE && app.box_lane == l0 + 2 && app.sel_lane[0] == l0); - shot("65-box-instrumento"); - run_ms(500); - CHECK(!app.box_on && app.sel_lane[0] == l0 + 2 && app.track == 0 && app.page == PG_INST); - shot("66-home-guia"); - /* LOCK de escala: soltar un acorde (negras 1-4) no suelta el +7 que sigue sostenido */ - ch(3); - page(BTN_EDIT, PG_SOUND); - app.pat.meta.scale_lock = 1; - kdown(bm_black_key(7)); run_ms(40); - CHECK(app.chord_mod & 1); - black(0, 40); - CHECK(app.chord_mod & 1); - kup(bm_black_key(7)); run_ms(40); - CHECK(!(app.chord_mod & 1)); - app.pat.meta.scale_lock = 0; + run_ms(4000); + wav_close(); + CHECK(ok == BM_FM_PATCHES); + int vivas = 0; + for (int v = 0; v < BM_VOICES; v++) if (app.ctx.voice[v].active && app.ctx.voice[v].track == 3) vivas++; + CHECK(vivas == 0); + /* la voz del patrón es la base: el algoritmo y el LFO se editan en ella (CMD_FMV) */ + int a0 = bm_fm_alg_of(&app.pat); + CHECK(a0 >= 1 && a0 <= 32); + uint8_t fp[BM_FM_PATCH]; + bm_cmd q; memset(&q, 0, sizeof q); + q.type = CMD_FMV; q.a = BM_FM_ALG; q.b = 0; bm_cmd_push(&app.cmdq, &q); /* el algoritmo 1 */ + q.a = 137; q.b = 50; bm_cmd_push(&app.cmdq, &q); + q.a = BM_FM_FB; q.b = 200; bm_cmd_push(&app.cmdq, &q); /* fuera de rango: queda en 7 */ + run_ms(20); + bm_fm_patch_of(&app.pat, 3, NULL, fp); + CHECK(fp[137] == 50 && fp[BM_FM_ALG] == 0 && app.pat.fmv[BM_FM_FB] == 7 && bm_fm_alg_of(&app.pat) == 1); + uint8_t mods[6]; int8_t fb[2]; + bm_fm_alg_graph(0, mods, fb); /* algoritmo 1: 2>1 y 6>5>4>3, realimenta el 6 */ + CHECK(mods[5] == (1u << 4) && mods[3] == (1u << 2) && mods[2] == (1u << 1) && mods[1] == (1u << 0) && fb[0] == 0 && fb[1] == 0); + bm_fm_alg_graph(31, mods, fb); /* algoritmo 32: seis portadoras */ + CHECK(bm_fm_carriers(31) == 0x3F && !mods[0] && !mods[5]); + /* polifónico: las voces van por máquina, no por canal */ + for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = (uint8_t)(i != 3); + bm_cmd c; memset(&c, 0, sizeof c); + static const uint8_t ch3[3] = {48, 55, 64}; + for (int i = 0; i < 3; i++) { c.type = CMD_NOTE_ON; c.a = 3; c.b = ch3[i]; c.c = 100; bm_cmd_push(&app.cmdq, &c); } + run_ms(60); + int v3 = 0; + for (int i = 0; i < BM_VOICES; i++) v3 += app.ctx.voice[i].active && app.ctx.voice[i].track == 3; + CHECK(v3 == 3); + c.type = CMD_ALL_OFF; bm_cmd_push(&app.cmdq, &c); + run_ms(300); } -static void test_layers(void) +/* PRESETS en HOME hasta el sonido i del canal t */ +static void preset_to(int t, int i) { - printf("capas: largo, acento, repetir, borrar, copiar patrón, tono y tap\n"); - boot(1); - ch(0); - page(BTN_SEQ, PG_SEQ); - shot("02-seq-tr"); - down(BTN_SEQ); run_ms(400); - CHECK(app.layer == L_LEN); - shot("40-layer-len"); - white(11, 40); /* blanca 12 = largo 12 */ - black(3, 40); /* negra 4 = X3/4 */ - up(BTN_SEQ); run_ms(60); - CHECK(app.pat.tr[0].lane[0].len == 12 && app.pat.tr[0].lane[7].len == 12 && app.pat.trk[0].speed == SPD_X3_4); - CHECK(app.view == V_CH && app.page == PG_SEQ); - down(BTN_ENV); run_ms(400); - CHECK(app.layer == L_ACC); - white(0, 40); - shot("41-layer-acc"); - up(BTN_ENV); run_ms(60); - CHECK(app.pat.tr[0].st[0][0] & ST_ACC); - down(BTN_LFO); run_ms(400); - white(0, 40); white(0, 40); - shot("42-layer-rep"); - up(BTN_LFO); run_ms(60); - CHECK(((app.pat.tr[0].st[0][0] & ST_RAT_MASK) >> ST_RAT_SH) == 2); - /* BR-8 no tiene LFO: un toque deja abierta la capa REPETIR (respira), LFO otra vez o HOME la cierran */ - { - bm_keyfn K[BM_KEYS]; char title[24]; uint16_t col; const char *h1, *h2; - btn(BTN_LFO, 30); - CHECK(app.layer == L_REP && app.layer_latch && app.view == V_CH && sim.leds[BTN_LFO] == LED_BREATH); - CHECK(sim.leds[BTN_HOME] == LED_MID); - bm_app_keymap(&app, K, title, sizeof title, &col, &h1, &h2); - CHECK(strcmp(title, "REPEAT") == 0 && strncmp(h2, "EXIT: LFO OR HOME", 17) == 0 && strlen(h2) <= 38 && strlen(h1) <= 38); - white(0, 40); /* abierta sin sostener: sigue pintando */ - CHECK(((app.pat.tr[0].st[0][0] & ST_RAT_MASK) >> ST_RAT_SH) == 3); - black(9, 40); /* B10 pasa páginas sin cerrarla (aquí hay una sola) */ - CHECK(app.layer == L_REP && app.layer_latch && app.step_page == 0); - CHECK(K[bm_black_key(9)].led == LED_OFF); - btn(BTN_OCT_UP, 20); /* OCT en la batería: nada, y no la cierra */ - CHECK(app.layer == L_REP && app.layer_latch && app.oct == 0); - btn(BTN_LFO, 30); /* LFO otra vez: sale */ - CHECK(app.layer == L_NONE && !app.layer_latch && app.view == V_CH && app.page == PG_SEQ); - btn(BTN_LFO, 30); - CHECK(app.layer == L_REP && app.layer_latch); - btn(BTN_HOME, 30); /* HOME: sale, en el canal */ - CHECK(app.layer == L_NONE && !app.layer_latch && app.view == V_CH); - CHECK(sim.leds[BTN_LFO] == LED_DIM); - } - down(BTN_EDIT); run_ms(400); - shot("21-erase"); - white(0, 40); /* parado: borra la línea del bombo */ - up(BTN_EDIT); run_ms(60); - int any = 0; - for (int s = 0; s < 64; s++) if (app.pat.tr[0].st[0][s]) any = 1; - CHECK(!any); - down(BTN_HOME); run_ms(40); btn(BTN_OCT_DN, 20); up(BTN_HOME); run_ms(60); - CHECK(app.pat.tr[0].st[0][0] & ST_ON); - down(BTN_FX); run_ms(400); - kdown(bm_white_key(2)); run_ms(400); - shot("18-punch"); - CHECK(app.ctx.st.punch == 2); - kup(bm_white_key(2)); up(BTN_FX); run_ms(200); - CHECK(app.ctx.st.punch == 0xFF); - /* GLO: TONO y TAP tempo */ - down(BTN_GLO); run_ms(400); - CHECK(app.layer == L_TONE); - key(9, 40); /* tecla 9 = +2 */ - btn(BTN_PLAY, 10); run_ms(450); btn(BTN_PLAY, 10); run_ms(450); btn(BTN_PLAY, 10); - shot("44-layer-tone"); - up(BTN_GLO); run_ms(60); - CHECK(app.pat.meta.transpose == 26 && !app.ctx.st.playing); - CHECK(app.pat.meta.bpm_x10 > 1150 && app.pat.meta.bpm_x10 < 1300); - /* SAVE sostenido: copiar el patrón a otro lugar (parado) */ - run_ms(UI_AUTOSAVE_MS + 1500); - down(BTN_SAVE); run_ms(400); - CHECK(app.layer == L_COPY); - white(5, 40); - shot("43-layer-copy"); - up(BTN_SAVE); run_ms(600); - CHECK(bm_store_has(&app.store, 5) && app.ctx.st.pattern == 0); - /* A06 ya tiene datos: pregunta. 0.9: se acepta sosteniendo 2 s la tecla que preguntó; soltarla antes = no */ - down(BTN_SAVE); run_ms(400); kdown(bm_black_key(2)); white(5, 40); - CHECK(app.ask == ASK_NONE && strcmp(app.toast, "CANCELED") == 0); /* soltada enseguida: no */ - kdown(bm_white_key(5)); run_ms(600); - CHECK(app.ask == ASK_COPY_TRK && app.ask_live && bm_app_ask_progress(&app) > 50); - up(BTN_SAVE); run_ms(40); /* soltar SAVE (cierra la capa) no contesta */ - CHECK(app.ask == ASK_COPY_TRK && app.layer == L_NONE); - shot("46-ask"); - CHECK(sim.leds[BM_LED_KEY0 + bm_white_key(5)] == LED_BLINK && sim.leds[BTN_OCT_UP] == LED_OFF && sim.leds[BTN_HOME] == LED_OFF); - CHECK(sim.leds[BTN_SEQ] == LED_OFF && sim.leds[BTN_SAVE] == LED_OFF); /* en la pregunta, solo la tecla que preguntó */ - { - char h[40]; bm_app_ask_hint(&app, h, sizeof h); - CHECK(strcmp(h, "KEEP HOLDING WHITE 6 = YES") == 0); - } - run_ms(1500); /* 2 s sostenida: sí */ - CHECK(app.ask == ASK_NONE && strcmp(app.toast, "TRACK COPIED") == 0); - kup(bm_white_key(5)); kup(bm_black_key(2)); run_ms(600); - CHECK(app.ask == ASK_NONE); - /* REC 2 s sin grabar nada: borra la pista al instante, sin preguntar (en vivo); HOME + OCT- la devuelve */ - ch(0); - run_ms(100); - int hits0 = 0; - for (int l = 0; l < 16; l++) for (int s = 0; s < 64; s++) if (app.pat.tr[0].st[l][s] & ST_ON) hits0++; - CHECK(hits0 > 0); - down(BTN_REC); run_ms(1500); - { - int hid = -1; - CHECK(bm_gesture_progress(&app.ges, app.now, &hid) >= 0 && hid == BTN_REC); /* el anillo: ERASE T1 */ - CHECK(sim.leds[BTN_REC] == LED_BLINK); - } - run_ms(1000); up(BTN_REC); run_ms(60); - CHECK(app.ask == ASK_NONE && app.view == V_CH && !app.rec); - any = 0; - for (int l = 0; l < 16; l++) for (int s = 0; s < 64; s++) if (app.pat.tr[0].st[l][s]) any = 1; - CHECK(!any); - CHECK(strncmp(app.toast, "T1 ERASED", 9) == 0); - down(BTN_HOME); run_ms(40); btn(BTN_OCT_DN, 20); up(BTN_HOME); run_ms(60); - int hits1 = 0; - for (int l = 0; l < 16; l++) for (int s = 0; s < 64; s++) if (app.pat.tr[0].st[l][s] & ST_ON) hits1++; - CHECK(hits1 == hits0); - /* EDIT sostenido + CLR también borra la pista */ - down(BTN_EDIT); run_ms(400); - CHECK(app.layer == L_ERASE && sim.leds[BTN_EDIT] == LED_BREATH && sim.leds[BTN_SEQ] == LED_OFF); - black(2, 40); /* CLR */ - CHECK(keys()[bm_black_key(5)].led == LED_MID && keys()[bm_black_key(6)].led == LED_OFF); /* B6 deshacer sí, B7 rehacer no */ - CHECK(!strcmp(keys()[bm_black_key(5)].label, "UND") && !strcmp(keys()[bm_black_key(6)].label, "RED")); - CHECK(sim.leds[BTN_OCT_DN] == LED_OFF && sim.leds[BTN_OCT_UP] == LED_OFF); /* OCT: la octava (en la batería, nada) */ - black(5, 40); /* B6 = UNDO */ - any = 0; - for (int l = 0; l < 16; l++) for (int s = 0; s < 64; s++) if (app.pat.tr[0].st[l][s]) any = 1; - CHECK(any && keys()[bm_black_key(6)].led == LED_MID); - black(6, 40); /* B7 = REDO */ - up(BTN_EDIT); run_ms(60); - any = 0; - for (int l = 0; l < 16; l++) for (int s = 0; s < 64; s++) if (app.pat.tr[0].st[l][s]) any = 1; - CHECK(!any); - /* HOME sostenido: solo los botones con HOME + */ - down(BTN_HOME); run_ms(400); - CHECK(app.layer == L_HOME && sim.leds[BTN_HOME] == LED_ON); - CHECK(sim.leds[BTN_SEQ] == LED_MID && sim.leds[BTN_FX] == LED_MID && sim.leds[BTN_GLO] == LED_MID && sim.leds[BTN_OCT_DN] == LED_MID); - CHECK(sim.leds[BTN_ENV] == LED_OFF && sim.leds[BTN_LFO] == LED_OFF && sim.leds[BTN_ARP] == LED_OFF && sim.leds[BTN_OCT_UP] == LED_OFF); - up(BTN_HOME); run_ms(60); + ch(t); + for (int guard = 0; app.pat.trk[t].source != i && guard < 64; guard++) { enc(ENC_PRESETS, 1); run_ms(20); } } -static void test_free_engines(void) +static void test_engines(void) { - printf("máquinas: BR-8 BP-1 y las de notas, ALGORITHM = el modo de cada una, MORE > MACHINE, MIDI OUT\n"); + printf("máquinas: BB-303, B-MINI, BITTAL y BUNO-6 con el banco de fábrica (PRESETS en HOME), y la batería modelada\n"); boot(1); - static const char *const NM[BM_TRACKS] = {"BR-8", "BP-1", "BB-303", "BX-7", "BITTAL", "BUNO-6"}; - for (int t = 0; t < BM_TRACKS; t++) CHECK(strcmp(bm_track_name(&app, t), NM[t]) == 0); - /* T3 BB-303: ALGORITHM = la forma de onda (ya no cambia de máquina) */ + static const uint8_t bass[4] = {36, 43, 48, 39}; + CHECK(app.pat.trk[2].engine == ENG_ACID); /* la demo: acid techno */ ch(2); - enc(ENC_ALGO, 1); - CHECK(app.pat.trk[2].engine == ENG_ACID && app.pat.prm[2][AC_WAVE] == 1); - enc(ENC_ALGO, -1); - CHECK(app.pat.prm[2][AC_WAVE] == 0); - /* el GLO de la máquina (MORE adentro, 0.9): notas = VIEW LENGTH SPEED TRANSPOSE ACCENT MIDI OUT INIT SOUND */ - btn(BTN_GLO, 30); - const char *nm; char v[24]; - static const char *const NOTE_ROWS[7] = {"VIEW", "LENGTH", "SPEED", "TRANSPOSE", "ACCENT", "MIDI OUT", "INIT SOUND"}; - CHECK(app.page == PG_MORE && bm_app_more_count(&app) == 7); - for (int i = 0; i < 7; i++) { bm_app_more_row(&app, i, &nm, v, sizeof v); CHECK(strcmp(nm, NOTE_ROWS[i]) == 0); } - bm_app_more_row(&app, 0, &nm, v, sizeof v); - CHECK(strcmp(v, "NOTES") == 0); - shot("45b-machine-glo-note"); - btn(BTN_GLO, 30); /* GLO otra vez: de vuelta */ - CHECK(app.page == PG_SEQ); - ch(0); /* BR-8: LENGTH SPEED ACCENT INIT KIT */ - btn(BTN_GLO, 30); - CHECK(bm_app_more_count(&app) == 4); - bm_app_more_row(&app, 3, &nm, v, sizeof v); - CHECK(strcmp(nm, "INIT KIT") == 0); - ch(1); /* BP-1: LENGTH SPEED ACCENT INTERPOLATION INIT */ - btn(BTN_GLO, 30); - CHECK(bm_app_more_count(&app) == 5); - bm_app_more_row(&app, 3, &nm, v, sizeof v); - CHECK(strcmp(nm, "INTERPOLATION") == 0); - bm_app_more_row(&app, 4, &nm, v, sizeof v); - CHECK(strcmp(nm, "INIT") == 0); - /* T6 con MIDI OUT: suena y además manda sus notas por MIDI (y aparece la fila MIDI CHANNEL) */ - ch(5); - btn(BTN_GLO, 30); - CHECK(app.page == PG_MORE); - int row = -1; - for (int i = 0; i < bm_app_more_count(&app); i++) { bm_app_more_row(&app, i, &nm, v, sizeof v); if (strcmp(nm, "MIDI OUT") == 0) row = i; } - CHECK(row >= 0); - while (app.more_row < row) enc(ENC_SELECT, 1); - enc(ENC_ALGO, 1); run_ms(40); - CHECK(app.pat.trk[5].midi_out == 1 && bm_app_more_count(&app) == 8); - sim.midi_n = 0; - btn(BTN_PLAY, 20); run_ms(1500); - int on = 0, voice = 0; - for (int i = 0; i + 2 < sim.midi_n; i++) if (sim.midi_out[i] == (0x90 | 5)) on = 1; - for (int i = 0; i < BM_VOICES; i++) if (app.ctx.voice[i].active && app.ctx.voice[i].track == 5) voice = 1; - CHECK(on && voice); - btn(BTN_PLAY, 20); - shot("48-midi-out"); -} - -/* ------------------------------------------------------------ sampler de pads */ -static int t2_voices(int *gated, uint32_t *pos) -{ - int n = 0; - if (gated) *gated = 0; - for (int i = 0; i < BM_VOICES; i++) { - const bm_voice *v = &app.ctx.voice[i]; - if (!v->active || v->track != 1) continue; - n++; - if (gated && v->gate) (*gated)++; - } - if (pos) *pos = app.ctx.st.smp_pos; - return n; -} - -static void pad_mode(int pad, int mode) /* PADS > SOUND > K3 hasta el modo */ -{ - app.pat.pad[pad].mode = (uint8_t)mode; -} - -static void test_pads(void) -{ - printf("sampler de pads: kit desde una toma, rejilla, modos de tecla, TRIM, BREAK y captura\n"); - boot_loop(); - const bm_take *tk = &app.take[0]; - CHECK(tk->valid && tk->len == 23851); - /* la demo arma el kit desde la toma (en los golpes) y la rejilla la toca en orden */ - int n = 0; - for (int i = 0; i < BM_LANES; i++) n += bm_pad_ok(&app.pat.pad[i]); - CHECK(n >= 6 && n <= 8 && app.pat.pad[0].src == 0 && app.pat.pad[0].start == 0); - CHECK(app.pat.pad[1].start > 2500 && app.pat.pad[1].start < 3500); /* el 2.o golpe del loop, a los 2981 */ - CHECK((app.pat.tr[1].st[0][0] & ST_ON) && (app.pat.tr[1].st[1][2] & ST_ON) && app.pat.tr[1].lane[0].len == 16); - CHECK(app.pat.tr[1].lane[0].choke == 1 && (app.pat.pad[0].flags & PAD_TEMPO)); - ch(1); - CHECK(app.page == PG_SEQ && app.sel_lane[1] == 0); - /* suena: la rejilla dispara los pads */ - btn(BTN_PLAY, 20); - uint32_t seen = 0; - for (int j = 0; j < 60; j++) { run_ms(25); for (int l = 0; l < BM_LANES; l++) if (app.lane_flash[1][l] > now_ms) seen |= 1u << l; } - int distinct = 0; - for (int l = 0; l < BM_LANES; l++) distinct += (seen >> l) & 1; - CHECK(distinct >= 4); - for (int k = 0; k < 16; k++) { /* BREAK apagado: suena la rejilla tal cual */ - int main = -1; - for (int l = 0; l < BM_LANES && main < 0; l++) if (app.pat.tr[1].st[l][k] & ST_ON) main = l; - CHECK(app.ctx.st.gen_sl[k] == (main < 0 ? 0xFF : main) && app.ctx.st.gen_fx[k] == 0); - } - run_ms(300); - shot("31-sampler-seq"); - /* SEQ como la batería: negra elige y toca el pad, blanca pone el paso en su línea */ - black(2, 40); - CHECK(app.sel_lane[1] == 2); - white(5, 40); - CHECK(app.pat.tr[1].st[2][5] & ST_ON); - white(5, 40); - CHECK(!(app.pat.tr[1].st[2][5] & ST_ON)); - /* paso sostenido + PITCH: P-Lock en ese paso, como en la batería */ - kdown(bm_white_key(2)); run_ms(400); - enc(ENC_K2, 2); - kup(bm_white_key(2)); run_ms(60); - CHECK(bm_tr_lock_get(&app.pat.tr[1], 2, 2, 1) == 66); - /* BREAK (SEQ otra vez): VARY cambia los pads; CAPT lo deja escrito en la rejilla */ - btn(BTN_SEQ, 30); - CHECK(app.page == PG_BREAK); - enc(ENC_K1, 127); enc(ENC_K3, 60); - run_ms(600); - int diff = 0; - for (int k = 0; k < 16; k++) diff += app.ctx.gen_sl[k] != 0xFF || app.ctx.gen_fx[k] != 0; - CHECK(diff > 0); - run_ms(UI_OVERLAY_MS + 100); - shot("31a-break"); - static uint8_t before[BM_LANES][BM_STEPS]; - memcpy(before, app.pat.tr[1].st, sizeof before); - down(BTN_EDIT); run_ms(400); black(3, 40); up(BTN_EDIT); run_ms(100); - CHECK(memcmp(before, app.pat.tr[1].st, sizeof before) != 0); - for (int i = 0; i < 4; i++) { enc(ENC_K1, -127); enc(ENC_K2, -127); enc(ENC_K3, -127); enc(ENC_K4, -127); } - CHECK(!app.pat.trk[1].gen[0] && !app.pat.trk[1].gen[2]); - btn(BTN_PLAY, 20); - /* PADS (EDIT): las blancas tocan y eligen el pad */ - btn(BTN_EDIT, 30); - CHECK(app.page == PG_PADS && app.ed_page[1] == 0); - white(4, 40); - CHECK(app.sel_lane[1] == 4); - run_ms(200); - /* ONESHOT: suena entero aunque se suelte enseguida, y termina en su final */ - pad_mode(1, PAD_ONESHOT); - uint32_t e1 = (uint32_t)app.pat.pad[1].start + app.pat.pad[1].len, far = 0; - kdown(bm_white_key(1)); run_ms(10); kup(bm_white_key(1)); - run_ms(20); - CHECK(t2_voices(NULL, NULL) == 1); - for (int j = 0; j < 80; j++) { run_ms(5); if (app.ctx.st.smp_pos_src == 0 && app.ctx.st.smp_pos > far) far = app.ctx.st.smp_pos; } - CHECK(far < e1 && far > e1 - 1500 && t2_voices(NULL, NULL) == 0); - /* KEY: suena mientras se sostiene */ - pad_mode(1, PAD_KEY); - int gated; - kdown(bm_white_key(1)); run_ms(60); - CHECK(t2_voices(&gated, NULL) == 1 && gated == 1); - kup(bm_white_key(1)); run_ms(300); - CHECK(t2_voices(NULL, NULL) == 0); - /* THRU: sostenido sigue por la toma más allá del pad */ - pad_mode(1, PAD_THRU); - kdown(bm_white_key(1)); run_ms(600); - CHECK(t2_voices(NULL, NULL) == 1 && app.ctx.st.smp_pos > e1 + 2000); - shot("38-pads-thru"); - kup(bm_white_key(1)); run_ms(400); /* ya pasó el pad: se apaga con su release */ - CHECK(t2_voices(NULL, NULL) == 0); - /* LOOP: sostenido repite el pad */ - pad_mode(1, PAD_LOOP); - kdown(bm_white_key(1)); run_ms(900); - CHECK(t2_voices(NULL, NULL) == 1 && app.ctx.st.smp_pos >= app.pat.pad[1].start && app.ctx.st.smp_pos < e1); - kup(bm_white_key(1)); run_ms(400); - CHECK(t2_voices(NULL, NULL) == 0); - /* SOUND (EDIT otra vez): K3 = PLAY cambia el modo; ENV: K4 = TEMPO */ - white(1, 40); - btn(BTN_EDIT, 30); - CHECK(app.ed_page[1] == 1); - enc(ENC_K3, 1); - CHECK(app.pat.pad[1].mode == PAD_ONESHOT); - enc(ENC_K1, 1); enc(ENC_K1, 1); enc(ENC_K1, 1); - CHECK(app.pat.pad[1].pitch == 27); - btn(BTN_EDIT, 30); - CHECK(app.ed_page[1] == 2); - enc(ENC_K4, -1); /* a la izquierda OFF, sin dar la vuelta */ - CHECK(!(app.pat.pad[1].flags & PAD_TEMPO)); - enc(ENC_K4, -1); - CHECK(!(app.pat.pad[1].flags & PAD_TEMPO)); - run_ms(UI_TOAST_MS); - shot("37c-pads-env"); - btn(BTN_EDIT, 30); /* LOOP: el sustain dentro del pad */ - CHECK(app.ed_page[1] == 3); - enc(ENC_K1, 40); enc(ENC_K2, 120); - CHECK(app.pat.pad[1].mode == PAD_LOOP && bm_pad_has_loop(&app.pat.pad[1])); - shot("37e-pads-loop"); - kdown(bm_white_key(1)); run_ms(700); /* sostenido: repite el tramo del loop */ - CHECK(t2_voices(NULL, NULL) == 1 && app.ctx.st.smp_pos < app.pat.pad[1].start + bm_pad_loop_end(&app.pat.pad[1]) + 64); - kup(bm_white_key(1)); run_ms(500); - CHECK(t2_voices(NULL, NULL) == 0); - app.pat.pad[1].loop_s = 0; app.pat.pad[1].loop_e = 0; app.pat.pad[1].mode = PAD_ONESHOT; - btn(BTN_EDIT, 30); - CHECK(app.ed_page[1] == 0); - /* TRIM: K1 mueve el inicio (el final queda), K2 el final, K3 zoom */ - uint32_t s1 = app.pat.pad[1].start, end1 = s1 + app.pat.pad[1].len; - enc(ENC_K1, 2); - CHECK(app.pat.pad[1].start > s1 && (uint32_t)app.pat.pad[1].start + app.pat.pad[1].len == end1); - enc(ENC_K2, -2); - CHECK((uint32_t)app.pat.pad[1].start + app.pat.pad[1].len < end1); - enc(ENC_K3, 1); - run_ms(60); - CHECK(app.cut_v1 - app.cut_v0 == tk->len / 2); - /* HIT (N4): el inicio vuelve al golpe */ - black(3, 40); - CHECK(app.pat.pad[1].start > 2600 && app.pat.pad[1].start < 3300); /* el golpe, a los 2981 (con su ventana antes) */ - run_ms(UI_TOAST_MS + 100); - shot("37-pads"); - enc(ENC_K3, -3); - /* N1 copia, N2 pega en otro pad, N3 lo vacía */ - black(0, 40); - white(12, 40); - CHECK(app.sel_lane[1] == 12 && !bm_pad_ok(&app.pat.pad[12])); - shot("37d-pads-empty"); - black(1, 40); - CHECK(memcmp(&app.pat.pad[12], &app.pat.pad[1], sizeof app.pat.pad[1]) == 0); - black(2, 40); - CHECK(!bm_pad_ok(&app.pat.pad[12])); - /* PRESETS: la toma entera en el pad elegido */ - enc(ENC_PRESETS, 1); - CHECK(app.pat.pad[12].src == 0 && app.pat.pad[12].start == 0 && app.pat.pad[12].len == tk->len); - /* negras 9-11 en vivo */ - kdown(bm_black_key(8)); run_ms(40); - CHECK(app.ctx.brk_live & 1); - kup(bm_black_key(8)); run_ms(40); - CHECK(!(app.ctx.brk_live & 1)); - /* REC en PADS + PLAY: lo que tocas queda en la línea del pad */ - btn(BTN_REC, 30); - CHECK(app.rec && app.page == PG_PADS); - btn(BTN_PLAY, 20); run_ms(300); - white(6, 40); - btn(BTN_PLAY, 20); btn(BTN_REC, 30); - int rec6 = 0; - for (int s2 = 0; s2 < 16; s2++) rec6 += (app.pat.tr[1].st[6][s2] & ST_ON) != 0; - CHECK(rec6 >= 1); - /* MAS, BREAK y TAKES con SELECT: primero las sub-páginas de PADS, después la pestaña */ - int pg_steps = 0; - while (app.page == PG_PADS && pg_steps < 6) { enc(ENC_SELECT, 1); pg_steps++; } - CHECK(pg_steps >= 2); /* PADS tenía sub-páginas por recorrer */ - CHECK(app.page == PG_BREAK); - enc(ENC_SELECT, 1); - CHECK(app.page == PG_TAKES); -} - -static void test_recorder(void) -{ - printf("grabadora: armada, al compás, toma sin guardar, kit, TAKES\n"); - boot(1); - CHECK(app_kit_empty(&app)); - ch(1); - btn(BTN_REC, 30); - CHECK(app.page == PG_REC && app.ctx.st.smp_armed && !app.ctx.st.smp_rec); - shot("33-rec-armed"); - btn(BTN_PLAY, 20); - run_ms(100); - CHECK(app.ctx.st.smp_rec); /* empieza en el compás (el primero) */ - run_ms(1200); - shot("34-rec"); - white(3, 40); - CHECK(app.key_nn[bm_white_key(3)] == 0); /* las teclas no suenan */ - btn(BTN_REC, 30); - CHECK(!app.ctx.st.smp_rec && app.ctx.st.smp_unsaved && app.ctx.arena_busy); - CHECK(app.ctx.smp[0].data == (const int8_t *)app.amem.arena && app.ctx.smp[0].bars >= 1); - uint32_t len = app.ctx.st.smp_len; - CHECK(len > 16000); - kdown(bm_white_key(0)); run_ms(60); /* las blancas escuchan la toma nueva */ - int heard = 0; - for (int i = 0; i < BM_VOICES; i++) heard |= app.ctx.voice[i].active && app.ctx.voice[i].track == 1 && app.ctx.voice[i].src == BM_TAKE_NEW; - kup(bm_white_key(0)); run_ms(60); - CHECK(heard); - shot("35-rec-unsaved"); - btn(BTN_PLAY, 20); /* parar: se guarda y, con el kit vacío, lo arma */ - run_ms(800); - CHECK(!app.ctx.st.smp_unsaved && !app.ctx.arena_busy); - CHECK(app.take[0].valid && app.take[0].len == len); - CHECK(bm_pad_ok(&app.pat.pad[0]) && app.pat.pad[0].src == 0); - /* TAKES (EDIT 2 s en el sampler) */ - down(BTN_EDIT); run_ms(2200); up(BTN_EDIT); run_ms(60); - CHECK(app.page == PG_TAKES); - uint8_t list[16]; - int n = bm_app_sources(&app, list); - CHECK(n == bm_rom_nloops + 1); - for (int i = 0; i < 12 && bm_app_takes_sel(&app) != 0; i++) enc(ENC_ALGO, 1); - enc(ENC_K3, 2); /* ganancia */ - CHECK(app.take[0].gain == 66); - run_ms(1700); - shot("36-takes"); - /* N2: un kit de 16 partes iguales; el kit ya tenía pads, así que pregunta (2 s sostenida = sí) */ - kdown(bm_black_key(1)); run_ms(100); - CHECK(app.ask == ASK_KIT); - run_ms(2000); kup(bm_black_key(1)); run_ms(60); - CHECK(app.ask == ASK_NONE); - int pads = 0; - for (int i = 0; i < BM_LANES; i++) pads += bm_pad_ok(&app.pat.pad[i]); - CHECK(pads == 16 && app.pat.pad[1].start == len / 16); - /* N4: la toma entera en el pad elegido */ - app.sel_lane[1] = 5; - black(3, 40); - CHECK(app.pat.pad[5].start == 0 && app.pat.pad[5].len == len); - btn(BTN_EDIT, 30); /* EDIT: a PADS */ - CHECK(app.page == PG_PADS); - btn(BTN_HOME, 30); - run_ms(2200); /* en reposo se guarda la toma (la ganancia) */ - CHECK(!app.take_dirty); - run_ms(UI_AUTOSAVE_MS); /* y el patrón con su kit */ - boot(0); - CHECK(app.take[0].valid && app.take[0].gain == 66); - CHECK(app.pat.pad[5].len == len && app.pat.pad[1].start == len / 16); /* el kit sobrevive al reinicio */ - /* borrar la toma: pregunta, y sus pads quedan vacíos */ - ch(1); - down(BTN_EDIT); run_ms(2200); up(BTN_EDIT); run_ms(60); - for (int i = 0; i < 12 && bm_app_takes_sel(&app) != 0; i++) enc(ENC_ALGO, 1); - hold_key(bm_black_key(10), 2200); /* DEL: 2 s sostenida = sí */ - CHECK(app.ask == ASK_NONE); - run_ms(600); - CHECK(!app.take[0].valid && app_kit_empty(&app)); - /* HOME en una toma sin guardar: pregunta (HOME otra vez = no: la toma queda; HOME sostenido 2 s = sí) */ - btn(BTN_REC, 30); btn(BTN_PLAY, 20); run_ms(800); btn(BTN_REC, 30); - CHECK(app.ctx.st.smp_unsaved); - btn(BTN_HOME, 30); run_ms(60); - CHECK(app.ask == ASK_DISCARD && app.ctx.st.smp_unsaved && !app.ask_live); - shot("46b-ask-discard"); - btn(BTN_HOME, 30); run_ms(60); - CHECK(app.ask == ASK_NONE && app.ctx.st.smp_unsaved && app.view == V_HOME); /* NO: la toma queda y HOME sale */ - app_enter(&app, 1, PG_REC); - btn(BTN_HOME, 30); run_ms(60); - CHECK(app.ask == ASK_DISCARD && sim.leds[BTN_HOME] == LED_BLINK); - down(BTN_HOME); run_ms(1000); - CHECK(app.ask == ASK_DISCARD && app.layer == L_NONE); /* sostenerla no abre la capa de HOME */ - run_ms(1200); up(BTN_HOME); run_ms(60); - CHECK(app.ask == ASK_NONE && app.view == V_CH && app.layer == L_NONE); /* ni SYSTEM a los 2 s */ - CHECK(!app.ctx.st.smp_unsaved && app.ctx.smp[0].len == 0); - btn(BTN_PLAY, 20); -} - -static void test_free_rec(void) -{ - printf("grabación libre: el largo se cierra en compases y cada nota guarda lo que se sostuvo\n"); - boot(1); - ch(5); - down(BTN_EDIT); run_ms(400); black(2, 40); up(BTN_EDIT); run_ms(60); /* vaciar T6 (BORRAR + CLR) */ - page(BTN_EDIT, PG_SOUND); - btn(BTN_PLAY, 20); run_ms(200); - btn(BTN_REC, 30); - CHECK(app.rec && app.rec_free == 6 && app.pat.trk[5].length == 64); - uint32_t bar = 60000u * 4u / 160u; /* ms por compás a 160 BPM */ - key(bm_white_key(4), 600); /* nota larga */ - run_ms(bar / 2); - key(bm_white_key(7), 150); - run_ms(bar + bar / 4); - shot("51-seq-free-rec"); - btn(BTN_REC, 30); /* cierra: unos 2 compases */ - run_ms(100); - CHECK(!app.rec && !app.rec_free && app.pat.trk[5].length == 32); - int n = 0, longest = 0; - for (int s = 0; s < BM_STEPS; s++) - for (int k = 0; k < BM_EVENTS; k++) { - const bm_event *e = bm_evc(&app.pat, 5, s, k); - if (bm_event_empty(e)) continue; - n++; - if ((int)(e->len & BM_LEN_MASK) > longest) longest = (int)(e->len & BM_LEN_MASK); - } - CHECK(n >= 2 && longest >= 4); /* la nota larga dura lo que se sostuvo */ - page(BTN_SEQ, PG_SEQ); - shot("52-seq-notes-roll"); - btn(BTN_PLAY, 20); -} - -/* Hace sonar un canal solo y devuelve el pico (0..1). */ -static double solo_peak(int t, const uint8_t *notes, int n, int vel, uint32_t ms) -{ - for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = (uint8_t)(i != t); - bm_cmd c; memset(&c, 0, sizeof c); - run_ms(300); - peak_abs = 0; - for (int i = 0; i < n; i++) { - c.type = CMD_NOTE_ON; c.a = (uint8_t)t; c.b = notes[i]; c.c = (uint8_t)vel; bm_cmd_push(&app.cmdq, &c); - run_ms(ms); - c.type = CMD_NOTE_OFF; bm_cmd_push(&app.cmdq, &c); - run_ms(60); - } - return peak_abs; -} - -static void test_fm(void) -{ - printf("BX-7: los 16 patches suenan sin saturar, las voces se liberan y ALGORITHM elige el algoritmo\n"); - boot(1); - ch(3); - CHECK(app.pat.trk[3].engine == ENG_FM); - page(BTN_EDIT, PG_SOUND); - shot("56-fm"); - static const uint8_t notes[3] = {48, 60, 67}; - wav_open("fm.wav"); - int ok = 0; - for (int p = 0; p < BM_FM_PATCHES; p++) { - app.pat.trk[3].source = (uint8_t)p; - double pk = solo_peak(3, notes, 3, 110, 450); - printf(" %-8s pico %.2f\n", bm_fm_names[p], pk); - if (pk > 0.03 && pk < 0.99) ok++; - } - run_ms(4000); - wav_close(); - CHECK(ok == BM_FM_PATCHES); - int vivas = 0; - for (int v = 0; v < BM_VOICES; v++) if (app.ctx.voice[v].active && app.ctx.voice[v].track == 3) vivas++; - CHECK(vivas == 0); - /* ALGORITHM: uno por uno de los 32, y el dibujo de la topología */ - app.pat.prm[3][FX_ALG] = 0; /* 0 = el del patch */ - int a0 = bm_fm_alg_of(&app.pat.trk[3], app.pat.prm[3]); - enc(ENC_ALGO, 1); - CHECK(bm_fm_alg_of(&app.pat.trk[3], app.pat.prm[3]) == (a0 < 32 ? a0 + 1 : 32) && app.pat.prm[3][FX_ALG] == bm_fm_alg_of(&app.pat.trk[3], app.pat.prm[3])); - for (int i = 0; i < 40; i++) enc(ENC_ALGO, -1); - CHECK(bm_fm_alg_of(&app.pat.trk[3], app.pat.prm[3]) == 1); - /* el LFO encima del patch: 0 = el del patch, si no el valor - 1 */ - uint8_t fp[BM_FM_PATCH]; - app.pat.prm[3][FX_LSPD] = 51; - bm_fm_patch_of(&app.pat.trk[3], app.pat.prm[3], NULL, fp); - CHECK(fp[137] == 50 && fp[BM_FM_ALG] == 0); - app.pat.prm[3][FX_LSPD] = 0; - bm_fm_patch_of(&app.pat.trk[3], app.pat.prm[3], NULL, fp); - CHECK(fp[137] == bm_fm_patch(app.pat.trk[3].source)[137]); - uint8_t mods[6]; int8_t fb[2]; - bm_fm_alg_graph(0, mods, fb); /* algoritmo 1: 2>1 y 6>5>4>3, realimenta el 6 */ - CHECK(mods[5] == (1u << 4) && mods[3] == (1u << 2) && mods[2] == (1u << 1) && mods[1] == (1u << 0) && fb[0] == 0 && fb[1] == 0); - bm_fm_alg_graph(31, mods, fb); /* algoritmo 32: seis portadoras */ - CHECK(bm_fm_carriers(31) == 0x3F && !mods[0] && !mods[5]); - for (int i = 0; i < 4; i++) enc(ENC_ALGO, 1); - shot("56b-fm-alg5"); -} - -static void test_engines(void) -{ - printf("máquinas 0.6: BB-303, B-MINI, BITTAL y BUNO-6 con el banco de fábrica, y la batería modelada\n"); - boot(1); - static const uint8_t bass[4] = {36, 43, 48, 39}; - CHECK(app.pat.trk[2].engine == ENG_ACID); /* la demo: acid techno */ - ch(2); - page(BTN_EDIT, PG_SOUND); - shot("53-acid"); - double p_acid = solo_peak(2, bass, 4, 100, 250); - double p_acc = solo_peak(2, bass, 4, 127, 250); - int acid_ok = 0; /* los sonidos de fábrica del BB-303 */ - for (int i = 0; i < BM_AC_PRESETS; i++) { - while (app.pat.trk[2].source != (i + 1) % BM_AC_PRESETS) { enc(ENC_PRESETS, 1); run_ms(20); } - double pk = solo_peak(2, bass, 2, 100, 250); - if (pk > 0.05 && pk < 1.0) acid_ok++; else printf(" BB-303 %s: pico %.2f\n", bm_sound_name(&app, 2), pk); + double p_acid = solo_peak(2, bass, 4, 100, 250); + double p_acc = solo_peak(2, bass, 4, 127, 250); + int acid_ok = 0; /* los sonidos de fábrica del BB-303 */ + for (int i = 0; i < BM_AC_PRESETS; i++) { + preset_to(2, (i + 1) % BM_AC_PRESETS); + double pk = solo_peak(2, bass, 2, 100, 250); + if (pk > 0.05 && pk < 1.0) acid_ok++; else printf(" BB-303 %s: pico %.2f\n", bm_sound_name(&app, 2), pk); } CHECK(acid_ok == BM_AC_PRESETS && app.pat.trk[2].source == 0 && strcmp(bm_sound_name(&app, 2), "CLASSIC") == 0); - app.ed_page[2] = 1; - run_ms(1600); /* sin el aviso de PRESETS encima */ - shot("53b-acid-env"); CHECK(app_set_machine(&app, 2, ENG_MINI) == 0); /* T3: B-MINI */ run_ms(40); - app.ed_page[2] = 5; /* FILTER */ - CHECK(app.pat.trk[2].engine == ENG_MINI && bm_app_ed_on(&app)); + CHECK(app.pat.trk[2].engine == ENG_MINI); double p_mini = solo_peak(2, bass, 4, 100, 250); printf(" pico BB-303 %.2f (acento %.2f) · B-MINI %.2f\n", p_acid, p_acc, p_mini); CHECK(p_acid > 0.05 && p_acid < 1.0 && p_acc >= p_acid); CHECK(p_mini > 0.05 && p_mini < 1.0); - shot("54-bmini"); - app.ed_page[2] = 0; /* CONTROL: MOD AMT lleva el destino */ - app.pat.prm[2][MN_LAMT] = 0; - enc(ENC_K4, -10); run_ms(20); - CHECK(app.pat.prm[2][MN_LAMT] > 0 && app.pat.prm[2][MN_LDEST] == MN_D_PITCH); - enc(ENC_K4, 30); run_ms(20); - CHECK(app.pat.prm[2][MN_LAMT] > 0 && app.pat.prm[2][MN_LDEST] == MN_D_CUT); - shot("54b-bmini-control"); - app.ed_page[2] = 5; /* el banco de fábrica: cada sonido de cada máquina suena sin saturar */ static const uint8_t chord[3] = {57, 60, 64}; @@ -1636,12 +696,10 @@ static void test_engines(void) int t = M[m].t, n = bm_snap_count(M[m].eng); CHECK(n >= 6); for (int i = 0; i < n; i++) CHECK(bm_snap_ok(bm_snap_get(M[m].eng, i), BM_SNAP_MAX)); - ch(t); - page(BTN_EDIT, PG_SOUND); wav_open(M[m].wav); int ok = 0; for (int i = 0; i < n; i++) { - while (app.pat.trk[t].source != i) { enc(ENC_PRESETS, 1); run_ms(20); } + preset_to(t, i); run_ms(80); /* BITTAL arma sus tablas */ double pk = t == 2 ? solo_peak(t, bass, 2, 100, 400) : solo_peak(t, chord, 3, 100, 600); printf(" %-7s %-12s pico %.2f\n", bm_engine_names[M[m].eng], bm_snap_name(M[m].eng, i), pk); @@ -1651,61 +709,23 @@ static void test_engines(void) wav_close(); CHECK(ok == n); } - /* BITTAL: las tablas en RAM, SELECT recorre las páginas, ENV y LFO saltan a la suya, ALGORITHM elige tabla */ - ch(4); - page(BTN_EDIT, PG_SOUND); + /* BITTAL: las tablas en RAM, y otra tabla para el oscilador 1 las vuelve a armar */ run_ms(80); CHECK(bm_wt_ready(0) && bm_wt_frames(0) >= 1); - app.ed_page[4] = 0; - shot("57-bittal-table"); - enc(ENC_SELECT, 1); enc(ENC_SELECT, 1); enc(ENC_SELECT, 1); enc(ENC_SELECT, 1); - CHECK(app.page == PG_SOUND && app.ed_page[4] == 4); /* FILTER */ - int ft = app.pat.prm[4][BT_FT]; - enc(ENC_K1, 1); run_ms(20); - CHECK(app.pat.prm[4][BT_FT] == ft + 1); - btn(BTN_ENV, 20); run_ms(20); - CHECK(app.ed_page[4] == bm_engine_page_of(ENG_BITTAL, EPG_ENV1) && app.ed_page[4] == 6); /* ENV 1 */ - btn(BTN_ENV, 20); run_ms(20); - CHECK(app.ed_page[4] == bm_engine_page_of(ENG_BITTAL, EPG_ENV2) && app.ed_page[4] == 7); /* otra vez: ENV 2 */ - shot("58-bittal-env"); - btn(BTN_LFO, 20); run_ms(20); - CHECK(app.ed_page[4] == bm_engine_page_of(ENG_BITTAL, EPG_LFO)); - app.ed_page[4] = 9; - shot("59-bittal-macros"); uint32_t sig = app.wt_sig[0]; - enc(ENC_ALGO, 1); enc(ENC_ALGO, 1); enc(ENC_ALGO, 1); run_ms(80); /* otra tabla para el oscilador 1 */ + app_push(&app, CMD_SET_PRM, 4, BT_TAB1, 3); + run_ms(80); CHECK(app.pat.prm[4][BT_TAB1] == 3 && app.wt_sig[0] != sig && bm_wt_ready(0)); - app.ed_page[4] = BM_BT_PAGES - 1; - enc(ENC_SELECT, 1); - CHECK(app.page != PG_SOUND); - /* BUNO-6: ALGORITHM = el chorus */ - ch(5); - page(BTN_EDIT, PG_SOUND); - int chm = app.pat.prm[5][BN_CHORUS]; - enc(ENC_ALGO, 1); - CHECK(app.pat.prm[5][BN_CHORUS] == (chm + 1) % BN_CHORUSES); - app.ed_page[5] = 2; - run_ms(1600); /* sin el aviso del chorus encima */ - shot("60-buno-dco"); - app.ed_page[5] = 7; - shot("60b-buno-chorus"); - btn(BTN_LFO, 20); run_ms(20); /* LFO: la página LFO (la primera, como en el panel) */ - CHECK(app.page == PG_SOUND && app.ed_page[5] == 0); - btn(BTN_ENV, 20); run_ms(20); - CHECK(app.ed_page[5] == 6); - app.ed_page[5] = 4; /* VCF MOD: K2 = la macro LFO (la de SEQ) */ - int lfo = app.pat.trk[5].macro[3]; - enc(ENC_K2, 2); run_ms(20); - CHECK(app.pat.trk[5].macro[3] == lfo + 2); - shot("60c-buno-vcf-mod"); + /* BUNO-6: el chorus */ + app_push(&app, CMD_SET_PRM, 5, BN_CHORUS, 1); + run_ms(40); + CHECK(app.pat.prm[5][BN_CHORUS] == 1); /* batería modelada: los 3 kits, los 16 instrumentos de cada uno suenan */ ch(0); - page(BTN_EDIT, PG_SOUND); - shot("55-bateria"); wav_open("bateria.wav"); for (int k = 0; k < BM_KITS_N; k++) { - while (app.pat.trk[0].source != k) { enc(ENC_PRESETS, 1); run_ms(20); } + preset_to(0, k); int ok = 0; for (int l = 0; l < BM_LANES; l++) { uint8_t n = (uint8_t)l; @@ -1717,19 +737,6 @@ static void test_engines(void) CHECK(ok == BM_LANES); } wav_close(); - /* INSTR: el instrumento elegido con su modelo */ - page(BTN_EDIT, PG_INST); - CHECK(app.ed_page[0] == 0 && bm_app_ed_on(&app)); - shot("61-instrumento"); - int tune = app.pat.tr[0].lane[app.sel_lane[0]].tune; - enc(ENC_K1, 2); run_ms(20); - CHECK(app.pat.tr[0].lane[app.sel_lane[0]].tune == tune + 2); - btn(BTN_EDIT, 20); run_ms(20); /* página INSTRUMENTO: el modelo */ - CHECK(app.page == PG_INST && app.ed_page[0] == 1); - int model = app.pat.tr[0].lane[app.sel_lane[0]].model; - enc(ENC_K1, 1); run_ms(20); - CHECK(app.pat.tr[0].lane[app.sel_lane[0]].model == (model + 1) % DRM_COUNT || model == DRM_COUNT - 1); - shot("61b-instrumento-modelo"); for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = 0; peak_abs = 0; @@ -1739,163 +746,65 @@ static void test_engines(void) CHECK(peak_abs > 0.05 && peak_abs <= 1.0); } -/* ------------------------------------------------------------ MACHINE: la máquina de T3-T6 */ -static int notes_of(int t) -{ - int n = 0; - for (int s = 0; s < BM_STEPS; s++) - for (int k = 0; k < BM_EVENTS; k++) n += !bm_event_empty(bm_evc(&app.pat, t, s, k)); - return n; -} - static void test_machines(void) { - printf("máquinas en T3-T6: MACHINE (2 s en una la carga), las pesadas una vez, presets por máquina\n"); + printf("máquinas: las 6 de la etapa 1, las pesadas una vez, presets por máquina\n"); /* el núcleo: qué máquina va en cada canal, las pesadas y el cambio */ - for (int t = 2; t < BM_TRACKS; t++) - for (int e = ENG_ACID; e < ENG_COUNT; e++) CHECK(bm_engine_ok(t, e)); + /* 2026-10-21: solo la batería y el Slicer son fijos; T3-T6 eligen entre las 5 (BITTAL y BX-7 también) */ + CHECK(BM_MACHINES == 5 && bm_machines[3] == ENG_BITTAL && bm_machines[4] == ENG_FM); + for (int t = 2; t < BM_TRACKS; t++) for (int i = 0; i < BM_MACHINES; i++) CHECK(bm_engine_ok(t, bm_machines[i])); + for (int t = 0; t < BM_TRACKS; t++) CHECK(app_fixed(t) == (t == 0 || t == 1) && BM_ORDER[app_pos(t)] == t); CHECK(bm_engine_ok(0, ENG_DRUM) && bm_engine_ok(1, ENG_BREAK) && !bm_engine_ok(0, ENG_FM) && !bm_engine_ok(1, ENG_ACID)); CHECK(!bm_engine_ok(2, ENG_DRUM) && !bm_engine_ok(5, ENG_BREAK)); - CHECK(bm_engine_heavy(ENG_BUNO) && bm_engine_heavy(ENG_BITTAL) && !bm_engine_heavy(ENG_FM) && !bm_engine_heavy(ENG_ACID) && !bm_engine_heavy(ENG_MINI)); + CHECK(bm_engine_heavy(ENG_BUNO) && bm_engine_heavy(ENG_BITTAL) && bm_engine_heavy(ENG_FM) && !bm_engine_heavy(ENG_ACID) && !bm_engine_heavy(ENG_MINI)); static bm_pattern p, q; static uint8_t b[BM_PENDING_LEN]; bm_pattern_init(&p); + static const char *const FACTORY[BM_TRACKS] = {"BR-8", "BP-1", "BB-303", "B-MINI", "BITTAL", "BUNO-6"}; + for (int t = 0; t < BM_TRACKS; t++) CHECK(strcmp(bm_engine_names[p.trk[t].engine], FACTORY[t]) == 0); CHECK(bm_machine_conflict(&p, 2, ENG_BUNO) == 5 && bm_machine_conflict(&p, 2, ENG_BITTAL) == 4); - CHECK(bm_machine_conflict(&p, 2, ENG_FM) < 0 && bm_machine_conflict(&p, 5, ENG_BUNO) < 0); + CHECK(bm_machine_conflict(&p, 2, ENG_MINI) < 0 && bm_machine_conflict(&p, 5, ENG_BUNO) < 0); bm_track_set_engine(&p, 2, ENG_BUNO); /* BUNO-6 ya está en T6: no */ CHECK(p.trk[2].engine == ENG_ACID); + CHECK(bm_heavy_count(&p, -1) == 2); + bm_track_set_engine(&p, 2, ENG_FM); /* una tercera pesada: no */ + CHECK(p.trk[2].engine == ENG_ACID); + bm_track_set_engine(&p, 5, ENG_MINI); /* con una menos, BX-7 entra */ + bm_track_set_engine(&p, 2, ENG_FM); + CHECK(p.trk[2].engine == ENG_FM && bm_heavy_count(&p, -1) == 2); + bm_track_set_engine(&p, 2, ENG_ACID); + bm_track_set_engine(&p, 5, ENG_BUNO); + CHECK(p.trk[2].engine == ENG_ACID && p.trk[5].engine == ENG_BUNO); bm_event *e = bm_ev(&p, 3, 4, 0); e->note = 60; e->vel = 99; e->len = 3; e->lk[1] = 99; p.trk[3].length = 24; p.trk[3].level = 77; - bm_track_set_engine(&p, 3, ENG_MINI); /* las notas quedan, sin P-Locks */ - CHECK(p.trk[3].engine == ENG_MINI && e->note == 60 && e->vel == 99 && e->len == 3 && e->lk[1] == BM_LOCK_NONE); + bm_track_set_engine(&p, 3, ENG_ACID); /* las notas quedan, sin P-Locks */ + CHECK(p.trk[3].engine == ENG_ACID && e->note == 60 && e->vel == 99 && e->len == 3 && e->lk[1] == BM_LOCK_NONE); CHECK(p.trk[3].length == 24 && p.trk[3].level == 77 && p.trk[3].source == 0); - CHECK(memcmp(p.trk[3].macro, bm_snap_get(ENG_MINI, 0) + 36, 4) == 0); /* al leer un patrón, una pesada repetida vuelve a la máquina de fábrica de su canal */ p.trk[3].engine = ENG_BUNO; int n = bm_pattern_pack(&p, b, sizeof b); CHECK(n > 0 && bm_pattern_unpack(&q, b, n) == n); - CHECK(q.trk[5].engine == ENG_BUNO && q.trk[3].engine == ENG_FM && bm_evc(&q, 3, 4, 0)->note == 60); - p.trk[4].engine = ENG_FM; p.trk[2].engine = ENG_BITTAL; p.trk[3].engine = ENG_BITTAL; /* ninguna en la suya: queda la primera */ + CHECK(q.trk[5].engine == ENG_BUNO && q.trk[3].engine == ENG_MINI && bm_evc(&q, 3, 4, 0)->note == 60); + p.trk[5].engine = ENG_ACID; p.trk[2].engine = ENG_BUNO; p.trk[3].engine = ENG_BUNO; /* ninguna en la suya: queda la primera */ + n = bm_pattern_pack(&p, b, sizeof b); + CHECK(bm_pattern_unpack(&q, b, n) == n && q.trk[2].engine == ENG_BUNO && q.trk[3].engine == ENG_MINI && q.trk[5].engine == ENG_ACID && q.trk[4].engine == ENG_BITTAL); + p.trk[3].engine = ENG_FM; /* tres pesadas: la que no es de su canal vuelve a la de fábrica */ n = bm_pattern_pack(&p, b, sizeof b); - CHECK(bm_pattern_unpack(&q, b, n) == n && q.trk[2].engine == ENG_BITTAL && q.trk[3].engine == ENG_FM && q.trk[4].engine == ENG_FM); + CHECK(bm_pattern_unpack(&q, b, n) == n && q.trk[3].engine == ENG_MINI && q.trk[2].engine == ENG_BUNO && q.trk[4].engine == ENG_BITTAL); + p.trk[2].engine = ENG_ACID; /* con dos, la BX-7 se queda */ + n = bm_pattern_pack(&p, b, sizeof b); + CHECK(bm_pattern_unpack(&q, b, n) == n && q.trk[3].engine == ENG_FM); /* PRESETS: solo los sonidos de la máquina del canal */ boot(1); - CHECK(bm_sound_count(&app, 2) == BM_AC_PRESETS && bm_sound_count(&app, 3) == bm_fm_count()); + CHECK(bm_sound_count(&app, 2) == BM_AC_PRESETS && bm_sound_count(&app, 3) == bm_snap_count(ENG_MINI)); CHECK(bm_sound_count(&app, 4) == bm_snap_count(ENG_BITTAL) && bm_sound_count(&app, 5) == bm_snap_count(ENG_BUNO)); ch(2); enc(ENC_PRESETS, -1); run_ms(20); /* da la vuelta dentro del BB-303 */ CHECK(app.pat.trk[2].source == BM_AC_PRESETS - 1 && app.pat.trk[2].engine == ENG_ACID); CHECK(app.pat.trk[2].macro[0] == bm_ac_presets[BM_AC_PRESETS - 1].cut && strcmp(bm_sound_name(&app, 2), bm_ac_presets[BM_AC_PRESETS - 1].name) == 0); - /* la tarjeta del canal (0.9): en HOME, la blanca de T4 sostenida + ALGORITHM; 2 s en una la carga */ - for (int i = 0; i < 4 && app.view != V_HOME; i++) btn(BTN_HOME, 30); - int n4 = notes_of(3); - CHECK(n4 > 0); - int k4 = bm_white_key(BM_PATTERNS + 3); - kdown(k4); run_ms(150); - CHECK(app.track == 3 && !app.card); /* al bajar: el cursor */ - run_ms(300); - CHECK(app.card == 4 && app.mach_trk == 3 && app.mach_sel == ENG_FM && !app.mach_arm); - CHECK(keys()[k4].led == LED_BREATH); - const char *s, *al, *pr; - bm_app_bigknobs(&app, &s, &al, &pr); - CHECK(strcmp(al, "MACHINE") == 0 && strcmp(pr, "PATCH") == 0); - shot("67-card"); - enc(ENC_ALGO, -1); /* a B-MINI: corre la cuenta */ - CHECK(app.mach_sel == ENG_MINI && app.mach_arm == 1 && app.card_turn); - run_ms(1000); - shot("67b-card-countdown"); - CHECK(app.pat.trk[3].engine == ENG_FM); - enc(ENC_ALGO, 1); /* irse antes de los 2 s: nada */ - CHECK(app.mach_sel == ENG_FM && !app.mach_arm); - run_ms(2500); - CHECK(app.pat.trk[3].engine == ENG_FM); - enc(ENC_ALGO, -1); run_ms(1200); enc(ENC_ALGO, -1); run_ms(1200); /* B-MINI 1.2 s y luego BB-303 1.2 s */ - CHECK(app.pat.trk[3].engine == ENG_FM && app.mach_sel == ENG_ACID); - enc(ENC_ALGO, 1); run_ms(2200); /* quedarse 2 s: T4 es B-MINI */ - CHECK(app.pat.trk[3].engine == ENG_MINI && notes_of(3) == n4 && app.card == 4 && !app.mach_arm); - CHECK(strcmp(app.toast, "T4 = B-MINI") == 0 && app.pat.trk[3].source == 0); - enc(ENC_ALGO, 2); /* BITTAL ya está en T5: apagada, sin cuenta */ - CHECK(app.mach_sel == ENG_BITTAL && !app.mach_arm && strcmp(app.toast, "BITTAL ALREADY ON T5") == 0); - shot("67c-card-heavy"); - run_ms(2500); - CHECK(app.pat.trk[3].engine == ENG_MINI); - enc(ENC_ALGO, -1); run_ms(500); /* soltar la tarjeta corta la cuenta */ - CHECK(app.mach_arm == 1); - kup(k4); run_ms(60); - CHECK(app.view == V_HOME && !app.card && !app.mach_arm); /* se giró una perilla: soltar no entra */ - run_ms(2000); - CHECK(app.pat.trk[3].engine == ENG_MINI); - kdown(k4); run_ms(400); /* sin girar nada: soltar = entrar */ - CHECK(app.card == 4); - kup(k4); run_ms(60); - CHECK(app.view == V_CH && app.track == 3 && !app.card); - btn(BTN_HOME, 30); - /* T1 y T2: máquinas fijas; PRESETS en la tarjeta = su sonido */ - int k1 = bm_white_key(BM_PATTERNS); - kdown(k1); run_ms(400); - enc(ENC_ALGO, 1); - CHECK(app.card == 1 && app.pat.trk[0].engine == ENG_DRUM && strcmp(app.toast, "T1 AND T2 ARE FIXED MACHINES") == 0); - kup(k1); run_ms(60); - CHECK(app.view == V_HOME); - int k3 = bm_white_key(BM_PATTERNS + 2), src3 = app.pat.trk[2].source; - kdown(k3); run_ms(400); - enc(ENC_PRESETS, 1); run_ms(40); - CHECK(app.card == 3 && app.pat.trk[2].source == (src3 + 1) % BM_AC_PRESETS); - kup(k3); run_ms(60); - CHECK(app.view == V_HOME && app.track == 2); - /* GLO > MACHINES: SELECT el canal (T3-T6), ALGORITHM la máquina con la misma espera */ - btn(BTN_GLO, 30); btn(BTN_GLO, 30); - CHECK(app.view == V_GLO && app.glo_page == GP_MACH); - enc(ENC_SELECT, -3); - CHECK(app.track == 2); /* no baja a T1 / T2: fijos */ - enc(ENC_ALGO, 1); - CHECK(app.mach_trk == 2 && app.mach_sel == ENG_MINI && app.mach_arm == 1); - run_ms(900); - shot("68-glo-machines"); - run_ms(1300); - CHECK(app.pat.trk[2].engine == ENG_MINI && app.pat.trk[3].engine == ENG_MINI); - btn(BTN_HOME, 30); - - /* BX-7 en T3: polifónico (las voces van por máquina, no por canal) */ - CHECK(app_set_machine(&app, 2, ENG_FM) == 0); - run_ms(40); - CHECK(app.pat.trk[2].engine == ENG_FM); - for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = (uint8_t)(i != 2); - bm_cmd c; memset(&c, 0, sizeof c); - static const uint8_t ch3[3] = {48, 55, 64}; - for (int i = 0; i < 3; i++) { c.type = CMD_NOTE_ON; c.a = 2; c.b = ch3[i]; c.c = 100; bm_cmd_push(&app.cmdq, &c); } - run_ms(60); - int v3 = 0; - for (int i = 0; i < BM_VOICES; i++) v3 += app.ctx.voice[i].active && app.ctx.voice[i].track == 2; - CHECK(v3 == 3); - c.type = CMD_ALL_OFF; bm_cmd_push(&app.cmdq, &c); - run_ms(300); - - /* HOME + EDIT: copiar T6 (BUNO-6) a otro canal no duplica la pesada */ - for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = 0; - ch(5); - down(BTN_HOME); run_ms(40); btn(BTN_EDIT, 30); up(BTN_HOME); run_ms(60); - CHECK(app.view == V_COPYCH && app.copy_src == 5); - int dst = app.copy_dst, de = app.pat.trk[dst].engine; - btn(BTN_EDIT, 2200); run_ms(100); /* EDIT 2 s = pegar */ - CHECK(app.pat.trk[dst].engine == de && strcmp(app.toast, "BUNO-6 ALREADY ON T6") == 0); - CHECK(app_machine_track(&app, ENG_BUNO) == 5); - - /* copiar T6 a otro patrón que ya tiene BUNO-6 en otro canal: no se copia */ - btn(BTN_HOME, 30); - CHECK(app_set_machine(&app, 5, ENG_ACID) == 0); run_ms(40); - CHECK(app_set_machine(&app, 2, ENG_BUNO) == 0); run_ms(40); - app_job(&app, JOB_COPY_PAT, 1); run_ms(400); /* A02: BUNO-6 en T3 */ - CHECK(app_set_machine(&app, 2, ENG_ACID) == 0); run_ms(40); - CHECK(app_set_machine(&app, 5, ENG_BUNO) == 0); run_ms(40); - app_job(&app, JOB_COPY_TRK, 1 | (5 << 4)); run_ms(400); - CHECK(strcmp(app.toast, "BUNO-6 ALREADY ON T3") == 0); - int len = bm_store_read(&app.store, 1, b, sizeof b); - CHECK(len > 0 && bm_pattern_unpack(&q, b, len) == len && q.trk[2].engine == ENG_BUNO && q.trk[5].engine == ENG_ACID); - CHECK(app.pat.trk[5].engine == ENG_BUNO && app.pat.trk[2].engine == ENG_ACID); } /* Hasta la v1 no hay compatibilidad hacia atrás: un patrón de 0.3 (formato 3) no se lee. */ @@ -1909,8 +818,18 @@ static void test_migrate(void) CHECK(n > 0 && bm_pattern_unpack(&q, b, n) == n); b[offsetof(bm_meta, fmt)] = 3; CHECK(bm_pattern_unpack(&q, b, n) < 0); - b[offsetof(bm_meta, fmt)] = 7; /* 0.7.0: otras páginas y máquinas fijas */ - CHECK(BM_PAT_FMT == 8 && bm_pattern_unpack(&q, b, n) < 0); + b[offsetof(bm_meta, fmt)] = 8; /* 0.9: sin la voz de la BX-7 */ + CHECK(BM_PAT_FMT == 10 && bm_pattern_unpack(&q, b, n) < 0); + { /* el 9 (prm de 48) sí se lee: los efectos de panel, de fábrica */ + static uint8_t b9[BM_PENDING_LEN]; + int h = 64 + (int)sizeof p.trk; + memcpy(b9, b, (size_t)h); + b9[offsetof(bm_meta, fmt)] = 9; + for (int t = 0; t < BM_TRACKS; t++) memcpy(b9 + h + t * 48, p.prm[t], 48); + memcpy(b9 + h + BM_TRACKS * 48, b + h + (int)sizeof p.prm, (size_t)(n - h - (int)sizeof p.prm)); + int n9 = n - BM_TRACKS * (BM_PRM - 48); + CHECK(bm_pattern_unpack(&q, b9, n9) == n9 && !memcmp(q.prm[3], p.prm[3], 48) && q.prm[3][PX_DS_G] == p.prm[3][PX_DS_G]); + } /* al arrancar, un patrón de formato 7 en la flash se borra (sin conversión) */ bm_sim_flash_erase_all(&sim); bm_platform pf; @@ -1925,88 +844,6 @@ static void test_migrate(void) CHECK(!bm_store_has(&app.store, 3) && app.pat.trk[2].engine == ENG_ACID); } -static void test_loop(void) -{ - printf("loopera: graba, cierra y vuelve a sonar\n"); - boot(1); - ch(3); - page(BTN_SEQ, PG_SEQ); - btn(BTN_SEQ, 30); - CHECK(app.page == PG_LOOP); - enc(ENC_K2, -1); /* 1 compás */ - btn(BTN_REC, 30); - CHECK(app.ctx.st.loop_mode[1] == LOOP_ARMED); - btn(BTN_PLAY, 20); - run_ms(100); - CHECK(app.ctx.st.loop_mode[1] == LOOP_REC); - key(bm_white_key(2), 120); run_ms(300); key(bm_white_key(5), 120); - run_ms(2600); - CHECK(app.ctx.st.loop_mode[1] == LOOP_PLAY); - CHECK(app.pat.loop[1].n >= 4); - shot("16-loop"); - down(BTN_REC); run_ms(2200); up(BTN_REC); run_ms(60); - CHECK(app.pat.loop[1].n == 0); /* REC 2 s en LOOP: borra el loop */ - btn(BTN_PLAY, 20); -} - -static void test_notes(void) -{ - printf("notas: negras = escala en el paso, acento de 3 niveles, REC sostenido\n"); - boot(1); - ch(2); - page(BTN_SEQ, PG_SEQ); - kdown(bm_white_key(7)); run_ms(400); - black(0, 40); black(2, 40); /* paso 8 (vacío): dos notas de la escala */ - enc(ENC_SELECT, 1); /* acento */ - shot("03-seq-hold"); - kup(bm_white_key(7)); run_ms(60); - int n = 0, acc = 0; - for (int k = 0; k < BM_EVENTS; k++) { - const bm_event *e = bm_evc(&app.pat, 2, 7, k); - if (!bm_event_empty(e)) { n++; if (e->vel == BM_VEL_ACC) acc++; } - } - CHECK(n == 2 && acc == 2); - /* capa LARGO: negras 7-10 = compases completos */ - down(BTN_SEQ); run_ms(400); black(7, 40); up(BTN_SEQ); run_ms(60); - CHECK(app.pat.trk[2].length == 32); - shot("06b-seq-notes"); - /* REC sostenido: graba solo mientras lo sostienes */ - btn(BTN_PLAY, 20); run_ms(200); - down(BTN_REC); run_ms(400); - CHECK(app.rec); - up(BTN_REC); run_ms(60); - CHECK(!app.rec); - /* REC sostenido 2.5 s mientras graba notas: solo graba, nunca borra la pista */ - int ev0 = 0, ev1 = 0; - for (int s = 0; s < BM_STEPS; s++) for (int k = 0; k < BM_EVENTS; k++) ev0 += !bm_event_empty(bm_evc(&app.pat, 2, s, k)); - CHECK(ev0 > 0); - run_ms(100); - down(BTN_REC); run_ms(400); - CHECK(app.rec && app.rec_hold); - key(bm_white_key(4), 150); /* una nota grabada */ - run_ms(2000); - { - int hid = -1; - CHECK(bm_gesture_progress(&app.ges, app.now, &hid) < 0); /* sin anillo: tocar canceló los 2 s */ - } - up(BTN_REC); run_ms(60); - for (int s = 0; s < BM_STEPS; s++) for (int k = 0; k < BM_EVENTS; k++) ev1 += !bm_event_empty(bm_evc(&app.pat, 2, s, k)); - CHECK(!app.rec); - CHECK(strncmp(app.toast, "T3 ERASED", 9) != 0); - CHECK(ev1 >= ev0 - 2); /* la nota nueva puede reemplazar un paso, no borra la pista */ - btn(BTN_PLAY, 20); - /* BB-303 no tiene LFO: un toque deja abierta la capa LIGAR */ - CHECK(strcmp(bm_track_name(&app, 2), "BB-303") == 0); - btn(BTN_LFO, 30); - { - bm_keyfn K[BM_KEYS]; char title[24]; uint16_t col; const char *h1, *h2; - bm_app_keymap(&app, K, title, sizeof title, &col, &h1, &h2); - CHECK(app.layer == L_REP && app.layer_latch && strcmp(title, "TIE") == 0 && sim.leds[BTN_LFO] == LED_BREATH); - } - btn(BTN_LFO, 30); - CHECK(app.layer == L_NONE && !app.layer_latch); -} - /* ------------------------------------------------------------ guardado y versiones */ /* el audio en dos núcleos: repartido (aquí en la misma tarea) suena exactamente igual */ static void par_go_sim(void *u, uint32_t done, uint32_t n) { bm_audio_par_process((bm_ctx *)u, done, n); } @@ -2258,6 +1095,7 @@ static void test_brake(void) printf("voice brake: a cap that new notes respect, and that goes back up\n"); static int32_t b[256 * 2]; boot(1); + put_fm_on_t4(); /* T4 polifónico, como en las pruebas de antes */ bm_audio_overload(&app.ctx); /* load from elsewhere, no pool voices: not below the floor */ CHECK(app.ctx.pool_cap == BM_POOL_MIN); for (int i = 0; i < BM_V_POOL_N; i++) bm_audio_relief(&app.ctx); @@ -2341,15 +1179,13 @@ static void test_sounds(void) btn(BTN_PLAY, 20); /* PRESETS en T5 llega al sonido del usuario; en T4, a la voz del banco */ ch(4); - page(BTN_EDIT, PG_SOUND); while (app.pat.trk[4].source != nb) { enc(ENC_PRESETS, 1); run_ms(20); } run_ms(80); static const uint8_t chord[3] = {57, 60, 64}; CHECK(solo_peak(4, chord, 3, 100, 500) > 0.015); - ch(3); - page(BTN_EDIT, PG_SOUND); - app.pat.trk[3].source = (uint8_t)(BM_FM_PATCHES + 20); - CHECK(strcmp(bm_sound_name(&app, 3), "MY BELL") == 0); + put_fm_on_t4(); + CHECK(bm_sound_count(&app, 3) == BM_FM_PATCHES); /* BX-7: los bancos de usuario, apagados por ahora (2026-10-21) */ + memcpy(app.pat.fmv, bm_fm_patch(BM_FM_PATCHES + 20), BM_FM_PATCH); app.ctx.fmv_gen++; /* la voz igual se puede cargar */ CHECK(solo_peak(3, chord, 3, 100, 400) > 0.02); /* se quedan al reiniciar */ boot(0); @@ -2361,61 +1197,16 @@ static void test_sounds(void) static void test_rec_expressive(void) { - printf("REC expresivo: nota larga con dos blancas, gate y micro en REC, grabación en vivo y corte al compás\n"); + printf("REC expresivo (PLAY/REC): la nota guarda su largo real, el compás la corta, el REC sigue lo que se toca\n"); boot(1); - ch(3); /* BX-7: notas en los pasos 11 y 27 */ - CHECK(app.page == PG_SEQ); - for (int k = 0; k < BM_EVENTS; k++) { bm_event e; bm_event_clear(&e); app_push_ev(&app, 3, 0, k, &e); } - run_ms(40); - /* blanca 1 sostenida + blanca 5: una nota de 5 pasos, y la estela en las luces */ - kdown(bm_white_key(0)); run_ms(60); - kdown(bm_white_key(4)); run_ms(60); kup(bm_white_key(4)); run_ms(40); - kup(bm_white_key(0)); run_ms(60); - const bm_event *e0 = bm_evc(&app.pat, 3, 0, 0); - CHECK(!bm_event_empty(e0) && (e0->len & BM_LEN_MASK) == 5); - bm_keyfn K[BM_KEYS]; - bm_app_keys(&app, K); - CHECK(K[bm_white_key(0)].led == LED_ON && K[bm_white_key(2)].led == LED_MID && K[bm_white_key(6)].led == LED_OFF); - shot("52-seq-long-note"); - /* REC: SELECT el paso, ALGORITHM el gate, PRESETS el micro */ - btn(BTN_REC, 30); - CHECK(app.rec); - enc(ENC_SELECT, -1); - CHECK(app.rec_step == 0); - enc(ENC_ALGO, -1); enc(ENC_ALGO, -1); enc(ENC_ALGO, -1); enc(ENC_ALGO, -1); /* el paso entero (95) -> 75 */ - CHECK(e0->gate == 75 && !(e0->len & BM_LEN_TIE) && app.rec_gate == 75); - for (int i = 0; i < 6; i++) enc(ENC_ALGO, 1); /* hasta 100 = TIE */ - CHECK((e0->len & BM_LEN_TIE) && e0->gate == 0); - enc(ENC_ALGO, -1); enc(ENC_ALGO, -1); enc(ENC_ALGO, -1); /* 100 -> 85 */ - enc(ENC_PRESETS, 1); enc(ENC_PRESETS, 1); enc(ENC_PRESETS, 1); - CHECK(e0->micro == 3); - shot("51-rec-gate-micro"); - static uint8_t b1[BM_PENDING_LEN]; - static bm_pattern q; - int n = bm_pattern_pack(&app.pat, b1, sizeof b1); - CHECK(n > 0 && bm_pattern_unpack(&q, b1, n) == n); - CHECK(bm_evc(&q, 3, 0, 0)->gate == 85 && bm_evc(&q, 3, 0, 0)->micro == 3 && (bm_evc(&q, 3, 0, 0)->len & BM_LEN_MASK) == 5); - btn(BTN_REC, 30); - CHECK(!app.rec); - /* el micro-timing suena corrido: la nota del paso 1 entra 3 ticks tarde */ - for (int k = 0; k < BM_EVENTS; k++) /* (solo los que hay: la cola tiene 128 comandos) */ - for (int s = 1; s < 64; s++) if (!bm_event_empty(bm_evc(&app.pat, 3, s, k))) { bm_event e; bm_event_clear(&e); app_push_ev(&app, 3, s, k, &e); run_ms(1); } - { bm_event e = *e0; e.micro = 10; app_push_ev(&app, 3, 0, 0, &e); } - run_ms(400); - down(BTN_PLAY); run_ms(1); up(BTN_PLAY); /* PLAY: el paso 1 empieza ya */ - int early = 0, later = 0; - for (int i = 0; i < 4; i++) { run_ms(5); for (int v = 0; v < BM_VOICES; v++) if (app.ctx.voice[v].active && app.ctx.voice[v].track == 3) early = 1; } - run_ms(50); - for (int v = 0; v < BM_VOICES; v++) if (app.ctx.voice[v].active && app.ctx.voice[v].track == 3) later = 1; - CHECK(!early && later); - btn(BTN_PLAY, 20); - /* REC en vivo: la nota guarda su largo real y el compás la corta */ - for (int k = 0; k < BM_EVENTS; k++) + for (int k = 0; k < BM_EVENTS; k++) /* un canal de notas casi vacío: REC con largo fijo */ for (int s = 0; s < 64; s++) if (!bm_event_empty(bm_evc(&app.pat, 3, s, k))) { bm_event e; bm_event_clear(&e); app_push_ev(&app, 3, s, k, &e); run_ms(1); } - { bm_event e; bm_event_clear(&e); e.note = 60; app_push_ev(&app, 3, 40, 0, &e); } /* canal no vacío: REC con largo fijo */ + { bm_event e; bm_event_clear(&e); e.note = 60; app_push_ev(&app, 3, 40, 0, &e); } run_ms(40); - page(BTN_EDIT, PG_SOUND); /* aquí las blancas tocan notas */ + play_rec(3); + CHECK(app.sloop && app.track == 3 && !app.rec); btn(BTN_REC, 30); + CHECK(app.rec); down(BTN_PLAY); run_ms(1); up(BTN_PLAY); run_ms(1125 - 60); /* hasta el paso 13 (93.75 ms por paso a 160) */ int k5 = bm_white_key(5); @@ -2428,16 +1219,59 @@ static void test_rec_expressive(void) const bm_event *e = bm_evc(&app.pat, 3, s, k); if (bm_event_empty(e) || s == 40) continue; found = 1; - printf(" grabada en el paso %d: %d pasos, gate %d, micro %+d\n", s + 1, e->len & BM_LEN_MASK, e->gate, e->micro); + printf(" grabada en el paso %d: %d pasos, gate %d, micro %d\n", s + 1, e->len & BM_LEN_MASK, e->gate, e->micro); CHECK(s + (e->len & BM_LEN_MASK) <= 16); /* no pasa del compás */ } CHECK(found); + CHECK(!app.rec && app.sloop); + /* QUANT (GLO pág 2): de fábrica 100 % = justo en el paso; 50 % deja la mitad de lo corrido */ + { + static const uint8_t n1[1] = {62}; + int tps = bm_speed_tps[app.pat.trk[3].speed % SPD_COUNT], q0 = -99, q2 = -99; + CHECK(app.pat.trk[3].qfree == 0); + app_rec_at(&app, 0, 3, n1, 1, (uint32_t)(4 * tps + 8)); run_ms(5); + app_set_track(&app, 3, (uint8_t)offsetof(bm_track, qfree), 2); run_ms(5); + app_rec_at(&app, 0, 3, n1, 1, (uint32_t)(6 * tps - 8)); run_ms(5); + for (int k = 0; k < BM_EVENTS; k++) { + const bm_event *e4 = bm_evc(&app.pat, 3, 4, k), *e6 = bm_evc(&app.pat, 3, 6, k); + if (!bm_event_empty(e4) && e4->note == 62) q0 = e4->micro; + if (!bm_event_empty(e6) && e6->note == 62) q2 = e6->micro; + } + printf(" QUANT 100 %%: micro %d · 50 %%: micro %d\n", q0, q2); + CHECK(q0 == 0 && q2 == -4); + app_set_track(&app, 3, (uint8_t)offsetof(bm_track, qfree), 0); run_ms(5); + } + /* el micro-timing suena corrido: una nota con micro 10 en el paso 1 entra tarde */ + btn(BTN_HOME, 30); + for (int k = 0; k < BM_EVENTS; k++) + for (int s = 0; s < 64; s++) if (!bm_event_empty(bm_evc(&app.pat, 3, s, k))) { bm_event e; bm_event_clear(&e); app_push_ev(&app, 3, s, k, &e); run_ms(1); } + { bm_event e; bm_event_clear(&e); e.note = 60; e.len = 1; e.micro = 10; app_push_ev(&app, 3, 0, 0, &e); } + run_ms(400); + down(BTN_PLAY); run_ms(1); up(BTN_PLAY); /* PLAY: el paso 1 empieza ya */ + int early = 0, later = 0; + for (int i = 0; i < 4; i++) { run_ms(5); for (int v = 0; v < BM_VOICES; v++) if (app.ctx.voice[v].active && app.ctx.voice[v].track == 3) early = 1; } + run_ms(50); + for (int v = 0; v < BM_VOICES; v++) if (app.ctx.voice[v].active && app.ctx.voice[v].track == 3) later = 1; + CHECK(!early && later); + btn(BTN_PLAY, 20); } -static void test_demo_and_persist(void) +static void test_factory_and_persist(void) { - printf("demo: audio, autoguardado y recarga\n"); - boot(1); + printf("patrones de fábrica: DA FUNK, BLADE, ENJOY THE SILENCE; escena B muteada; audio, autoguardado y recarga\n"); + boot_with(1, 0); + CHECK(app.pat.meta.bpm_x10 == 1110 && app.ctx.st.pattern == 0 && app.set.factory == BM_FACTORY_VER); + CHECK(app.pat.trk[2].engine == ENG_ACID && bm_acid_fx_on(app.pat.prm[2], ACF_OD) && app.pat.trk[5].engine == ENG_BUNO); + for (int p = 0; p < BM_PATTERNS; p++) CHECK((app.song.scene[p][1].flags & SCN_STORED) && app.song.scene[p][1].trk_mute == 0x3F); + CHECK((app.song.scene[0][0].flags & SCN_STORED) && !(app.song.scene[3][0].flags & SCN_STORED)); + static const uint16_t BPM[3] = {1110, 1360, 1130}; + static uint8_t b[BM_PENDING_LEN]; + static bm_pattern q; + for (int i = 1; i < 3; i++) { /* el 2 y el 3 ya están en la flash */ + int n = bm_store_read(&app.store, (uint8_t)i, b, sizeof b); + CHECK(n > 0 && bm_pattern_unpack(&q, b, n) >= 0 && q.meta.bpm_x10 == BPM[i]); + } + CHECK(!bm_store_has(&app.store, 3)); peak_abs = 0; wav_open("demo.wav"); btn(BTN_PLAY, 20); @@ -2456,13 +1290,27 @@ static void test_demo_and_persist(void) boot(0); int n2 = bm_pattern_pack(&app.pat, b2, sizeof b2); CHECK(n1 > 0 && n1 == n2 && memcmp(b1, b2, (size_t)n1) == 0); - CHECK((app.song.scene[1].flags & SCN_STORED) && app.song.scene[1].trk_mute == 0x38); - CHECK(app.pat.trk[4].engine == ENG_BITTAL && app.pat.trk[2].engine == ENG_ACID && app.pat.trk[5].engine == ENG_BUNO && app.pat.meta.bpm_x10 == 1600); + CHECK((app.song.scene[0][1].flags & SCN_STORED) && app.song.scene[0][1].trk_mute == 0x3F && app.song.scene[0][2].trk_mute == 0x04); + CHECK(app.pat.meta.bpm_x10 == 1110 && bm_store_has(&app.store, 1) && bm_store_has(&app.store, 2)); + + /* otros patrones de fábrica (ajustes con otro BM_FACTORY_VER): los guardados se borran una vez; + * los ajustes se quedan */ + bm_store_write(&app.store, 6, b1, (uint16_t)n1); + bm_settings st = app.set; + st.factory = 0; st.led_dim = 3; + bm_store_write_glob(&app.store, (const uint8_t *)&st, sizeof st); + boot(0); + CHECK(!bm_store_has(&app.store, 6) && bm_store_has(&app.store, 1) && app.pat.meta.bpm_x10 == 1110); + CHECK(app.set.factory == BM_FACTORY_VER && app.set.led_dim == 3); + run_ms(UI_AUTOSAVE_MS + 1500); + bm_store_write(&app.store, 6, b1, (uint16_t)n1); + boot(0); + CHECK(bm_store_has(&app.store, 6)); /* la segunda vez ya no borra */ } static void test_old_version(void) { - printf("datos de 0.2: borra y arranca con la demo\n"); + printf("datos de 0.2: borra y arranca con los de fábrica\n"); bm_sim_flash_erase_all(&sim); bm_platform pf; bm_sim_platform(&sim, &pf); @@ -2475,7 +1323,7 @@ static void test_old_version(void) bm_store_write(&st, 7, pat, sizeof pat); boot(0); CHECK(!bm_store_has(&app.store, 7)); - CHECK(app.pat.trk[1].source == BM_SRC_NONE && app.pat.tr[0].st[0][0] & ST_ON); /* la demo (sin tomas) */ + CHECK(app.pat.trk[1].source == BM_SRC_NONE && app.pat.tr[0].st[0][0] & ST_ON); /* DA FUNK (sin tomas) */ } /* Lo que cuesta dibujar cada pantalla (el cuadro entero, las 30 franjas), en la PC. El FM-1 es @@ -2523,22 +1371,7 @@ static void draw_one(const char *name) printf(" %-7s %5.0f us %5ld exp/log/sin\n", name, us, m); } -static void draw_pages(int t, int pg, const char *name) -{ - int n = 0; - ch(t); - page(BTN_EDIT, pg); - run_ms(80); - bm_app_ed_pages(&app, t, &n); - long m[16]; - printf(" %-7s", name); - for (int p = 0; p < n && p < 16; p++) { app.ed_page[t] = (uint8_t)p; printf(" %5.0f", draw_us(&m[p])); } - printf(" us/cuadro por pagina de SOUND\n %-7s", ""); - for (int p = 0; p < n && p < 16; p++) printf(" %5ld", m[p]); - printf(" exp/log/sin por cuadro\n"); -} - -static void test_draw_cost(void) +static void test_draw_cost(void) { printf("pantalla: costo de dibujar un cuadro entero (PC)\n"); boot(1); @@ -2547,52 +1380,29 @@ static void test_draw_cost(void) btn(BTN_PLAY, 20); run_ms(300); draw_one("HOME"); - ch(0); page(BTN_SEQ, PG_SEQ); + seq0(); draw_one("SEQ TR"); - ch(2); page(BTN_SEQ, PG_SEQ); - draw_one("SEQ T3"); - ch(1); page(BTN_EDIT, PG_PADS); - draw_one("PADS"); - draw_pages(0, PG_INST, "BR-8"); - draw_pages(2, PG_SOUND, "BB-303"); - draw_pages(3, PG_SOUND, "BX-7"); - draw_pages(4, PG_SOUND, "BITTAL"); - draw_pages(5, PG_SOUND, "BUNO-6"); - ch(3); /* 0.9: PIANO ROLL, SLOOP, la tarjeta y el GLO de la consola */ - app.set.note_view |= 1u << 3; - page(BTN_SEQ, PG_SEQ); - draw_one("ROLL"); - app.set.note_view &= (uint8_t)~(1u << 3); - btn(BTN_HOME, 30); + ch(3); /* PLAY/REC: PIANO ROLL de un canal de notas */ + white(BM_CH_W0 + app_pos(3), 40); + draw_one("PLAY"); btn(BTN_REC, 30); - draw_one("SLOOP"); - btn(BTN_REC, 30); - kdown(bm_white_key(BM_PATTERNS + 3)); run_ms(400); - draw_one("CARD"); - enc(ENC_K1, 1); kup(bm_white_key(BM_PATTERNS + 3)); run_ms(40); /* girar: soltar no entra */ - btn(BTN_GLO, 30); btn(BTN_GLO, 30); + draw_one("REC"); + to_home(); + btn(BTN_GLO, 30); draw_one("GLO"); btn(BTN_HOME, 30); - CHECK(app_set_machine(&app, 2, ENG_MINI) == 0); - run_ms(40); - draw_pages(2, PG_SOUND, "B-MINI"); - /* el caché sigue a los parámetros: otro corte cambia la curva, volver deja el mismo dibujo */ - app.ed_page[2] = 5; /* B-MINI: FILTER */ - app.ov.on = 0; app.toast_until = 0; - app.scr.force = 1; bm_screen_render(&app.scr, bm_app_draw, &app, app.pf.blit, app.pf.user); - static uint16_t ref[240 * 240]; - memcpy(ref, sim.fb, sizeof ref); - uint8_t cut = app.pat.trk[2].macro[0]; - app.pat.trk[2].macro[0] = (uint8_t)(cut > 60 ? cut - 40 : cut + 40); - app.scr.force = 1; bm_screen_render(&app.scr, bm_app_draw, &app, app.pf.blit, app.pf.user); - CHECK(memcmp(ref + 57 * 240, sim.fb + 57 * 240, 78 * 240 * 2) != 0); /* la curva, no solo la perilla */ - app.pat.trk[2].macro[0] = cut; - app.scr.force = 1; bm_screen_render(&app.scr, bm_app_draw, &app, app.pf.blit, app.pf.user); - CHECK(memcmp(ref, sim.fb, sizeof ref) == 0); + btn(BTN_SAVE, 30); + draw_one("SAVE"); + btn(BTN_HOME, 30); + ch(1); + white(BM_CH_W0 + app_pos(1), 40); + draw_one("PLAY T2"); + btn(BTN_HOME, 30); app.scr.budget = budget; btn(BTN_PLAY, 20); run_ms(2000); - /* entrar a una página: el redibujo entero se reparte en varios ticks y termina igual que de una vez */ + /* cambiar de pantalla: el redibujo entero se reparte en varios ticks y termina igual que de una vez */ + static uint16_t ref[240 * 240]; app.ov.on = 0; app.toast_until = 0; memset(sim.fb, 0, sizeof sim.fb); app.scr.force = 1; sim.spi_bytes = 0; @@ -2601,7 +1411,7 @@ static void test_draw_cost(void) int n = 1; while (app.scr.pending && n < 10) { bm_app_tick(&app, now_ms); n++; } printf(" redibujo entero: %d ticks de hasta %u B\n", n, (unsigned)BM_SCR_BUDGET); - CHECK(!app.scr.pending && n == 3); + CHECK(!app.scr.pending && n >= 2 && n <= 4); memcpy(ref, sim.fb, sizeof ref); app.scr.budget = 0; app.scr.force = 1; bm_app_tick(&app, now_ms); @@ -2613,918 +1423,1847 @@ static void test_draw_cost(void) CHECK(app.scr.frames - f0 == 25); } -static void test_spi_budget(void) +static void spi_avg(const char *name) { - printf("pantalla: bytes por frame en SEQ sonando\n"); - boot(1); - ch(0); - page(BTN_SEQ, PG_SEQ); - btn(BTN_PLAY, 20); - run_ms(500); uint32_t maxb = 0, sum = 0; - for (int i = 0; i < 60; i++) { - sim.spi_bytes = 0; - run_ms(33); - if (sim.spi_bytes > maxb) maxb = sim.spi_bytes; - sum += sim.spi_bytes; - } - printf(" promedio %u B/frame, máximo %u B (presupuesto ~37 KB a 12 MHz)\n", sum / 60, maxb); - CHECK(sum / 60 < 37000); - ch(1); - sum = 0; - for (int i = 0; i < 60; i++) { sim.spi_bytes = 0; run_ms(33); sum += sim.spi_bytes; } - printf(" sampler SEQ: promedio %u B/frame\n", sum / 60); - CHECK(sum / 60 < 37000); - /* 0.9: el PIANO ROLL (el loop entero) y SLOOP (la consola tocando una máquina), sonando */ - ch(3); - app.set.note_view |= 1u << 3; - page(BTN_SEQ, PG_SEQ); - run_ms(300); - sum = 0; maxb = 0; - for (int i = 0; i < 60; i++) { sim.spi_bytes = 0; run_ms(33); sum += sim.spi_bytes; if (sim.spi_bytes > maxb) maxb = sim.spi_bytes; } - printf(" PIANO ROLL: promedio %u B/frame, máximo %u B\n", sum / 60, maxb); - CHECK(sum / 60 < 37000); - app.set.note_view &= (uint8_t)~(1u << 3); - btn(BTN_HOME, 30); - btn(BTN_REC, 30); run_ms(300); - sum = 0; maxb = 0; for (int i = 0; i < 60; i++) { sim.spi_bytes = 0; run_ms(33); sum += sim.spi_bytes; if (sim.spi_bytes > maxb) maxb = sim.spi_bytes; } - printf(" SLOOP: promedio %u B/frame, máximo %u B\n", sum / 60, maxb); + printf(" %-10s promedio %u B/frame, máximo %u B (presupuesto ~37 KB a 12 MHz)\n", name, sum / 60, maxb); CHECK(sum / 60 < 37000); - btn(BTN_REC, 30); - btn(BTN_PLAY, 20); } -static void test_ui_flow(void) +static void test_spi_budget(void) { - printf("interfaz: recorrido de pantallas (capturas)\n"); + printf("pantalla: bytes por frame sonando\n"); boot(1); btn(BTN_PLAY, 20); - run_ms(900); - shot("01-home-play"); - ch(0); - page(BTN_SEQ, PG_SEQ); - black(4, 30); /* negra 5: SNARE */ - CHECK(app.sel_lane[0] == 4); - int k = bm_white_key(4); - kdown(k); run_ms(400); - bm_app_encoder(&app, ENC_K2, 5, now_ms); run_ms(60); - bm_app_encoder(&app, ENC_ALGO, 1, now_ms); run_ms(60); - shot("03-seq-plock"); - kup(k); run_ms(60); - CHECK(bm_tr_lock_get(&app.pat.tr[0], 4, 4, 1) >= 0); - CHECK(((app.pat.tr[0].st[4][4] & ST_RAT_MASK) >> ST_RAT_SH) == 1); - down(BTN_SEQ); run_ms(1200); - shot("04-hold-ring"); - run_ms(1000); up(BTN_SEQ); run_ms(60); - CHECK(app.view == V_TIME); - enc(ENC_SELECT, 1); enc(ENC_SELECT, 1); enc(ENC_K2, 1); - CHECK(app.pat.trk[2].speed == SPD_X3_2); - shot("05-time"); - ch(2); - enc(ENC_K1, -6); - shot("07-overlay"); - run_ms(1700); - ch(0); - page(BTN_EDIT, PG_SOUND); - shot("08-kit"); - btn(BTN_EDIT, 30); - CHECK(app.page == PG_INST); - shot("09-inst"); + spi_avg("HOME"); + seq0(); + spi_avg("SEQ"); ch(3); - btn(BTN_ENV, 30); - shot("13-env"); - page(BTN_SCL, PG_SCL); - key(bm_black_key(3), 100); - enc(ENC_K2, 1); /* escala propia del canal */ - CHECK(app.pat.trk[3].scl == 0); - shot("15-scl"); - btn(BTN_SCL, 30); - CHECK(app.page == PG_CHORDS); - kdown(bm_white_key(5)); run_ms(150); - CHECK(app.chord_name[0] != 0); - shot("17-chords"); - kup(bm_white_key(5)); run_ms(60); - down(BTN_ARP); run_ms(400); - CHECK(app.layer == L_ARP); - up(BTN_ARP); run_ms(60); - btn(BTN_ARP, 30); - shot("26-arp"); - ch(0); - down(BTN_ARP); run_ms(400); - kdown(bm_white_key(2)); run_ms(300); - shot("22-roll"); - kup(bm_white_key(2)); up(BTN_ARP); run_ms(100); + white(BM_CH_W0 + app_pos(3), 40); + spi_avg("PLAY T4"); + btn(BTN_REC, 30); + spi_avg("REC T4"); + btn(BTN_HOME, 30); + ch(1); + white(BM_CH_W0 + app_pos(1), 40); + spi_avg("PLAY T2"); btn(BTN_HOME, 30); - CHECK(app.view == V_HOME); - black(7, 40); /* negra 8 = escena B: entra en el próximo compás */ - CHECK(app.ctx.st.scene_q == 1); - shot("23-scenes"); - run_ms(3000); - CHECK(app.ctx.st.scene == 1 && app.pat.trk[3].mute && app.pat.trk[5].mute && !app.pat.trk[0].mute); - black(6, 40); /* A: todo suena otra vez */ - run_ms(3000); - CHECK(app.ctx.st.scene == 0 && !app.pat.trk[3].mute); - down(BTN_HOME); run_ms(2200); up(BTN_HOME); run_ms(60); - CHECK(app.view == V_SYSTEM); - shot("25-system"); - btn(BTN_SAVE, 30); - shot("27-save"); - home_with(BTN_SEQ); - CHECK(app.view == V_GLO && app.glo_page == GP_SONG); - white(0, 30); white(1, 30); - black(7, 30); /* la entrada 2 lanza la escena B */ - CHECK(app.song.n == 2 && bm_song_pat(app.song.pat[1]) == 1 && bm_song_scene(app.song.pat[1]) == 1); - shot("28-song"); btn(BTN_PLAY, 20); - bm_platform pf; bm_sim_platform(&sim, &pf); - now_ms += 10; next_tick = now_ms; bm_app_init(&app, &pf, now_ms); run_ms(300); - shot("29-boot"); } -/* ------------------------------------------------------------ idioma */ -static int lang_upload(const uint8_t *p, uint32_t n) +/* ------------------------------------------------------------ etapa 1: HOME, PLAY/REC, batería, GLO */ +/* nada cambió: ni pantalla, ni aviso, ni capa, ni aviso de perilla (un control sin función no hace nada) */ +typedef struct { uint8_t view, layer, sloop, rec; uint32_t toast; int ov; uint8_t track; } ui_snap; +static ui_snap ui_take(void) { - if (bm_app_lang_load(&app, 0, 0, NULL, 0)) return -1; - for (uint32_t off = 0; off < n; off += 200) /* de a pedazos, como por USB */ - if (bm_app_lang_load(&app, 1, off, p + off, n - off < 200 ? n - off : 200)) return -1; - return bm_app_lang_load(&app, 2, 0, NULL, 0); + ui_snap s = {app.view, app.layer, app.sloop, app.rec, app.toast_until, app.ov.on, app.track}; + return s; +} +static int ui_same(ui_snap a) +{ + ui_snap b = ui_take(); + return a.view == b.view && a.layer == b.layer && a.sloop == b.sloop && a.rec == b.rec && a.toast == b.toast && a.ov == b.ov && a.track == b.track; } -static void test_lang(void) +/* espera a que el patrón p esté cargado (parado: lo carga un trabajo) */ +static int wait_pattern(int p) { - printf("idioma: ingles de fabrica, paquete de espanol por USB, SISTEMA > LANGUAGE\n"); - static uint8_t es[BM_LANG_HI - BM_LANG_LO]; - FILE *f = fopen("lang/es.bmlang", "rb"); - CHECK(f != NULL); - if (!f) return; - uint32_t n = (uint32_t)fread(es, 1, sizeof es, f); - fclose(f); - CHECK(bm_lang_check(es, n, NULL) == n); - boot(1); - CHECK(strcmp(bm_lang_name(), "ENGLISH") == 0 && !bm_app_lang_pack(&app)); - CHECK(strcmp(T("TAKES"), "TAKES") == 0); - shot("25-system-en"); - btn(BTN_PLAY, 20); - CHECK(lang_upload(es, n) < 0); /* sonando no se escribe la flash */ - btn(BTN_PLAY, 20); run_ms(100); - CHECK(lang_upload(es, n) == 0 && app.set.lang == 1); - CHECK(strcmp(bm_lang_name(), "ESPANOL") == 0); - CHECK(strcmp(T("TAKES"), "TOMAS") == 0 && strcmp(T("NOT A PHRASE"), "NOT A PHRASE") == 0); - char b[32]; - snprintf(b, sizeof b, TF("PAD %d EMPTY"), 7); - CHECK(strcmp(b, "PAD 7 VACIO") == 0); - ch(1); - btn(BTN_EDIT, 30); - shot("37b-pads-es"); - /* SISTEMA > LANGUAGE: inglés y vuelta */ - btn(BTN_HOME, 30); btn(BTN_HOME, 30); - down(BTN_HOME); run_ms(2200); up(BTN_HOME); run_ms(60); - CHECK(app.view == V_SYSTEM); - for (int i = 0; i < 9; i++) enc(ENC_SELECT, 1); - CHECK(app.menu_row == 9); - shot("25-system-es"); - enc(ENC_ALGO, -1); /* a la izquierda: inglés */ - CHECK(app.set.lang == 0 && strcmp(T("TAKES"), "TAKES") == 0); - enc(ENC_ALGO, 1); /* a la derecha: el paquete */ - CHECK(app.set.lang == 1 && strcmp(T("TAKES"), "TOMAS") == 0); - enc(ENC_ALGO, 1); /* otra vez a la derecha: sigue igual */ - CHECK(app.set.lang == 1); - /* queda guardado */ - run_ms(UI_AUTOSAVE_MS + 500); - boot(0); - CHECK(app.set.lang == 1 && strcmp(T("TAKES"), "TOMAS") == 0); - /* un paquete dañado no se usa */ - sim.flash[BM_LANG_LO + 200] ^= 0x55; - boot(0); - CHECK(!bm_app_lang_pack(&app) && strcmp(T("TAKES"), "TAKES") == 0); - /* quitarlo */ - sim.flash[BM_LANG_LO + 200] ^= 0x55; - boot(0); - CHECK(strcmp(T("TAKES"), "TOMAS") == 0); - CHECK(bm_app_lang_load(&app, 3, 0, NULL, 0) == 0 && app.set.lang == 0 && !bm_app_lang_pack(&app)); - CHECK(strcmp(T("TAKES"), "TAKES") == 0); + for (int i = 0; i < 40 && app.ctx.st.pattern != p; i++) run_ms(50); + return app.ctx.st.pattern == p; } -/* Perillas y navegación: paso sostenido + PRESETS, aceleración, interruptores, HOME que vuelve */ -static void test_knobs_nav(void) +static void test_home(void) { - printf("perillas: paso + PRESETS, aceleración, interruptores, HOME siempre a MIX\n"); + printf("HOME (etapa 1): SELECT recorre los 6 canales, ALGORITHM el BPM global, PRESETS el sonido, K1-K4 la tira del canal\n"); boot(1); - const char *s, *al, *pr; - bm_app_bigknobs(&app, &s, &al, &pr); - CHECK(strcmp(s, "TRACK") == 0 && strcmp(al, "BPM") == 0 && strcmp(pr, "KIT") == 0); /* el cursor en T1 */ - /* aceleración: dos detents rápidos en una lista = dos pasos cada vez (ni uno, ni ocho) */ - CHECK(app.track == 0); - bm_app_encoder(&app, ENC_SELECT, 2, now_ms); run_ms(8); - bm_app_encoder(&app, ENC_SELECT, 2, now_ms); run_ms(40); - CHECK(app.track == 4); - for (int i = 0; i < 6 && app.track; i++) enc(ENC_SELECT, -1); - run_ms(1000); - int lv = app.pat.trk[0].level; /* en un valor continuo, rápido = más */ - bm_app_encoder(&app, ENC_K1, -2, now_ms); run_ms(8); - bm_app_encoder(&app, ENC_K1, -2, now_ms); run_ms(40); - CHECK(app.pat.trk[0].level < lv - 4); - /* paso sostenido + PRESETS en la batería: la condición, nunca el kit */ - ch(0); - page(BTN_SEQ, PG_SEQ); - bm_app_bigknobs(&app, &s, &al, &pr); - CHECK(strcmp(s, "PAGE") == 0 && strcmp(al, "INSTR") == 0 && strcmp(pr, "KIT") == 0); - app.sel_lane[0] = 0; app.step_page = 0; - CHECK(app.pat.tr[0].st[0][0] & ST_ON); - static bm_lane lanes[BM_LANES]; - memcpy(lanes, app.pat.tr[0].lane, sizeof lanes); - uint8_t src = app.pat.trk[0].source; - kdown(bm_white_key(0)); run_ms(400); - bm_app_bigknobs(&app, &s, &al, &pr); - CHECK(strcmp(pr, "COND") == 0); + CHECK(app.view == V_HOME && app.track == 0 && !app.sloop); + shot("00-home"); + for (int i = 1; i <= 5; i++) { enc(ENC_SELECT, 1); CHECK(app.track == BM_ORDER[i]); } /* batería, 3 que eligen, Vital, Slicer */ + enc(ENC_SELECT, 1); + CHECK(app.track == 0); /* de arriba a abajo, y vuelve al 1 */ + enc(ENC_SELECT, -1); + CHECK(app.track == BM_ORDER[5]); /* y al revés */ + enc(ENC_SELECT, 1); + /* ALGORITHM: el BPM del proyecto, el mismo en cualquier canal */ + int bpm = app.pat.meta.bpm_x10; + enc(ENC_ALGO, 1); enc(ENC_ALGO, 1); + CHECK(app.pat.meta.bpm_x10 == bpm + 20 && app.view == V_HOME && app.ov.beat && app.ov.color == C_TEMPO); + enc(ENC_SELECT, 1); + enc(ENC_ALGO, -1); + CHECK(app.pat.meta.bpm_x10 == bpm + 10 && app.track == BM_ORDER[1]); + enc(ENC_SELECT, -1); + /* PRESETS: el kit de la batería, el preset de cada máquina; la máquina sigue siendo la misma */ + int kit = app.pat.trk[0].source; enc(ENC_PRESETS, 1); - CHECK(memcmp(lanes, app.pat.tr[0].lane, sizeof lanes) == 0 && app.pat.trk[0].source == src); - CHECK(((app.pat.tr[0].st[0][0] & ST_COND_MASK) >> ST_COND_SH) == 1); - kup(bm_white_key(0)); run_ms(60); - CHECK(app.pat.tr[0].st[0][0] & ST_ON); - enc(ENC_PRESETS, -1); /* sin paso: el kit, y HOME + OCT- lo deshace */ - run_ms(1000); - memcpy(lanes, app.pat.tr[0].lane, sizeof lanes); - enc(ENC_PRESETS, 1); enc(ENC_PRESETS, 1); - CHECK(memcmp(lanes, app.pat.tr[0].lane, sizeof lanes) != 0); - home_with(BTN_OCT_DN); - CHECK(memcmp(lanes, app.pat.tr[0].lane, sizeof lanes) == 0); - /* el kit también desde HOME (PRESETS = el sonido del cursor), y también se deshace */ - btn(BTN_HOME, 30); - run_ms(1000); - enc(ENC_PRESETS, -1); /* (el deshacer devolvió los instrumentos, no el número de kit) */ - CHECK(memcmp(lanes, app.pat.tr[0].lane, sizeof lanes) != 0 && app.view == V_HOME); - home_with(BTN_OCT_DN); - CHECK(memcmp(lanes, app.pat.tr[0].lane, sizeof lanes) == 0); - /* MUTE de instrumentos (negra 11 sostenida): las perillas siguen con lo de SEQ */ - ch(0); - page(BTN_SEQ, PG_SEQ); - kdown(bm_black_key(10)); run_ms(400); - CHECK(app.layer == L_LANEMUTE); - int m0 = app.pat.trk[0].macro[0]; - enc(ENC_K1, 1); - CHECK(app.pat.trk[0].macro[0] == m0 + 1); - kup(bm_black_key(10)); run_ms(60); - /* FILL (notas): HOME sostenido la cierra y la apaga */ + CHECK(app.pat.trk[0].source == (kit + 1) % BM_KITS_N && app.pat.trk[0].engine == ENG_DRUM && app.view == V_HOME); ch(2); - page(BTN_SEQ, PG_SEQ); - black(10, 40); - CHECK(app.layer == L_FILL && app.fill); - down(BTN_HOME); run_ms(400); - CHECK(app.layer == L_HOME && !app.fill); - up(BTN_HOME); run_ms(60); - CHECK(!app.fill && !app.ctx.fill && app.view == V_CH); - /* HOME siempre vuelve a MIX (0.9): desde la máquina, su GLO, TIME y el FX de la consola */ - btn(BTN_EDIT, 30); - CHECK(app.view == V_CH && app.page == PG_SOUND); - btn(BTN_GLO, 30); - CHECK(app.view == V_CH && app.page == PG_MORE); - bm_app_bigknobs(&app, &s, &al, &pr); - CHECK(strcmp(s, "ROW") == 0 && strcmp(al, "VALUE") == 0); - btn(BTN_GLO, 30); - CHECK(app.view == V_CH && app.track == 2 && app.page == PG_SOUND); - home_with(BTN_FX); - CHECK(app.view == V_FXG); - btn(BTN_HOME, 30); - CHECK(app.view == V_HOME); + int sound = app.pat.trk[2].source; + enc(ENC_PRESETS, 1); + CHECK(app.pat.trk[2].source == (sound + 1) % BM_AC_PRESETS && app.pat.trk[2].engine == ENG_ACID); + ch(3); + sound = app.pat.trk[3].source; + enc(ENC_PRESETS, 1); + CHECK(app.pat.trk[3].source == (sound + 1) % bm_snap_count(ENG_MINI) && app.pat.trk[3].engine == ENG_MINI); + /* K1-K4: GAIN, FILTER, DELAY, REVERB del canal del cursor (y solo de ese) */ ch(2); - down(BTN_SEQ); run_ms(2200); up(BTN_SEQ); run_ms(60); - CHECK(app.view == V_TIME); - btn(BTN_HOME, 30); - CHECK(app.view == V_HOME); - btn(BTN_HOME, 30); /* en la consola, HOME se queda en MIX */ - CHECK(app.view == V_HOME); - btn(BTN_FX, 30); - CHECK(app.view == V_FXG && app.fx_page == FXP_CHANNEL); - enc(ENC_SELECT, 1); /* SELECT: CHANNEL > DELAY */ - CHECK(app.fx_page == FXP_DELAY); - bm_app_bigknobs(&app, &s, &al, &pr); - CHECK(strcmp(s, "PAGE") == 0 && strcmp(pr, "MOVE") == 0); - btn(BTN_GLO, 30); /* GLO en la consola: su GLO */ - CHECK(app.view == V_GLO && app.glo_page == GP_TEMPO); - btn(BTN_HOME, 30); - CHECK(app.view == V_HOME); - /* interruptores: a la derecha dos veces sigue encendido */ - down(BTN_HOME); run_ms(2200); up(BTN_HOME); run_ms(60); - CHECK(app.view == V_SYSTEM && app.menu_row == 0); - enc(ENC_ALGO, 1); enc(ENC_ALGO, 1); - CHECK(app.set.clock == 1); - enc(ENC_ALGO, -1); enc(ENC_ALGO, -1); - CHECK(app.set.clock == 0); - btn(BTN_HOME, 30); - CHECK(app.view == V_HOME); - /* PRESETS con HOME sostenido: el patrón se elige al soltar, no uno por uno */ - int p0 = app.ctx.st.pattern; - down(BTN_HOME); run_ms(400); - bm_app_bigknobs(&app, &s, &al, &pr); - CHECK(strcmp(pr, "PATTERN") == 0 && strcmp(al, "BPM .1") == 0); - enc(ENC_PRESETS, 1); run_ms(600); enc(ENC_PRESETS, 1); run_ms(600); - CHECK(app.ctx.st.pattern == p0 && app.pat_sel == p0 + 2 && app.njob == 0); - up(BTN_HOME); run_ms(60); - CHECK(app.pat_sel == -1); -} - -/* ------------------------------------------------------------ 0.9: la consola */ -/* cuántos píxeles de un color hay en un rectángulo de la última captura */ -static int count_px(int x0, int y0, int x1, int y1, uint16_t c) -{ - int n = 0; - for (int y = y0; y < y1; y++) for (int x = x0; x < x1; x++) n += sim.fb[y * 240 + x] == c; - return n; + uint8_t l0 = app.pat.trk[2].level, s0 = app.pat.trk[2].send, r0 = app.pat.trk[2].rsend, o3 = app.pat.trk[3].level; + enc(ENC_K1, -4); enc(ENC_K3, 4); enc(ENC_K4, 4); + CHECK(app.pat.trk[2].level < l0 && app.pat.trk[2].send > s0 && app.pat.trk[2].rsend > r0 && app.pat.trk[3].level == o3); + for (int i = 0; i < 10; i++) enc(ENC_K2, -3); /* el filtro: pasa-bajos */ + CHECK(app.pat.trk[2].djf >= 1 && app.pat.trk[2].djf < 64); + for (int i = 0; i < 30; i++) enc(ENC_K2, 3); + CHECK(app.pat.trk[2].djf > 64); /* y cruza al pasa-altos */ + bm_legend L[4]; + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "VOLUME") && !strcmp(L[1].name, "FILTER") && !strcmp(L[2].name, "DELAY") && !strcmp(L[3].name, "REVERB")); + const char *s1, *s2, *s3; + bm_app_bigknobs(&app, &s1, &s2, &s3); + CHECK(!strcmp(s1, "TRACK") && !strcmp(s2, "BPM") && !strcmp(s3, "SOUND")); + ch(0); + bm_app_bigknobs(&app, &s1, &s2, &s3); + CHECK(!strcmp(s3, "KIT")); + shot("01-home-mixer"); } -static int notes_in(int t) +static void test_no_function(void) { - int n = 0; - for (int s = 0; s < BM_STEPS; s++) for (int k = 0; k < BM_EVENTS; k++) n += !bm_event_empty(bm_evc(&app.pat, t, s, k)); - return n; + printf("los controles sin función no hacen nada: sin pantalla, sin aviso y sin marcador de posición\n"); + boot(1); + ch(2); /* T3 (BB-303): no tiene ENV */ + run_ms(UI_TOAST_MS + UI_OVERLAY_MS + 200); + ui_snap s0 = ui_take(); + CHECK(s0.toast == 0 && !s0.ov); + static const int BTNS[] = {BTN_ENV}; + for (unsigned i = 0; i < sizeof BTNS / sizeof BTNS[0]; i++) { + btn(BTNS[i], 30); /* un toque */ + CHECK(ui_same(s0)); + btn(BTNS[i], 600); /* mantenido */ + CHECK(ui_same(s0)); + btn(BTNS[i], 2300); /* y 2 s */ + CHECK(ui_same(s0)); + } + ch(2); /* T3 (BB-303): la 303 no tiene ENV */ + run_ms(UI_TOAST_MS + UI_OVERLAY_MS + 200); + s0 = ui_take(); + static const int B303[] = {BTN_ENV}; + for (unsigned i = 0; i < sizeof B303 / sizeof B303[0]; i++) { + btn(B303[i], 30); + CHECK(ui_same(s0)); + } + btn(BTN_OCT_DN, 30); btn(BTN_OCT_UP, 30); /* OCT en el mezclador */ + CHECK(ui_same(s0) && app.oct == 0); + btn(BTN_GLO, 600); /* GLO largo: lo mismo que un toque (abre y nada más) */ + CHECK(app.view == V_GLO && app.glo_page == 0); + btn(BTN_GLO, 30); /* GLO otra vez: la página siguiente (no sale) */ + CHECK(app.view == V_GLO && app.glo_page == 1); + btn(BTN_HOME, 30); /* sale HOME */ + CHECK(app.view == V_HOME); + down(BTN_HOME); run_ms(40); btn(BTN_EDIT, 30); btn(BTN_SEQ, 30); btn(BTN_SAVE, 30); up(BTN_HOME); run_ms(60); /* HOME + botón: ya no hay combos */ + CHECK(app.view == V_SAVE && app.layer == L_NONE); /* SAVE abre lo suyo, sin versión global */ + to_home(); + /* la negra 7 y las teclas del mezclador sin función */ + run_ms(UI_TOAST_MS + 200); + ui_snap s1 = ui_take(); + black(6, 40); black(6, 700); + CHECK(ui_same(s1) && app.ctx.st.queued == 0xFF); + bm_app_keys(&app, keys_now); + CHECK(!keys_now[bm_black_key(6)].label[0] && keys_now[bm_black_key(6)].led == LED_OFF); + /* en el secuenciador de la batería: lo que no existe tampoco hace nada */ + seq0(); + CHECK(app.view == V_CH && app.track == 0); + run_ms(UI_TOAST_MS + 200); + s0 = ui_take(); + static const int BTNS2[] = {BTN_FX, BTN_ARP, BTN_GLO}; + for (unsigned i = 0; i < sizeof BTNS2 / sizeof BTNS2[0]; i++) { btn(BTNS2[i], 30); btn(BTNS2[i], 600); CHECK(ui_same(s0)); } + for (int b = 8; b <= 9; b++) { black(b, 40); CHECK(app.step_page == 0 && !strcmp(app.toast, "ONE BAR ONLY")); } /* los compases, con un solo compás: lo dicen */ + run_ms(UI_TOAST_MS + 200); + s0 = ui_take(); + btn(BTN_REC, 30); + CHECK(ui_same(s0)); /* REC dentro del secuenciador: nada */ + btn(BTN_HOME, 30); } -static int hits_in(int t) +static void test_patterns(void) { - int n = 0; - for (int l = 0; l < BM_LANES; l++) for (int s = 0; s < BM_STEPS; s++) n += (bm_trk_trc(&app.pat, t)->st[l][s] & ST_ON) != 0; - return n; + printf("patrones: blancas 1-10 (un toque), el cambio entra al terminar el compás en curso\n"); + boot(1); + CHECK(app.ctx.st.pattern == 0); + white(3, 40); /* parado: ya */ + CHECK(wait_pattern(3)); + white(0, 40); + CHECK(wait_pattern(0)); + /* sonando: en cola hasta el final del compás (no del ciclo maestro) */ + btn(BTN_PLAY, 20); + run_ms(1500); /* 160 BPM: un compás son 1500 ms */ + uint32_t bar = BM_BAR_TICKS; + CHECK(app.ctx.st.pattern == 0); + while (app.ctx.st.btick % bar > bar / 3 || app.ctx.st.btick % bar < bar / 4) run_ms(20); /* a mitad del compás */ + uint32_t bt0 = app.ctx.st.btick; + white(1, 40); + CHECK(app.ctx.st.queued == 1 && app.ctx.st.pattern == 0); + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_white_key(1)].led == LED_BLINK); /* el que espera parpadea */ + uint32_t change = 0; + for (int i = 0; i < 400 && app.ctx.st.pattern != 1; i++) { bm_app_audio(&app, abuf, 32); if (!(i % 8)) bm_app_tick(&app, now_ms); } + for (int i = 0; i < 200 && app.ctx.st.pattern != 1; i++) run_ms(10); + change = app.ctx.st.btick; + CHECK(app.ctx.st.pattern == 1 && app.ctx.st.queued == 0xFF); + /* entró en el compás siguiente al que se pidió, desde su primer paso */ + CHECK(change / bar == bt0 / bar + 1 && change % bar < BM_PPQN && app.ctx.st.rtick < BM_PPQN * 2); + printf(" pedido en el tick %u, entró en el tick %u\n", (unsigned)bt0, (unsigned)change); + /* el mismo patrón otra vez cancela la cola */ + run_ms(100); + white(2, 40); + CHECK(app.ctx.st.queued == 2); + white(1, 40); /* el que suena: cancela */ + CHECK(app.ctx.st.queued == 0xFF); + btn(BTN_PLAY, 20); + /* el patrón es de la consola: mutes y volumen siguen al cambiar de patrón (0.9) */ + black(app_pos(0), 40); + CHECK(app.pat.trk[0].mute == 1); + white(2, 40); + CHECK(wait_pattern(2) && app.pat.trk[0].mute == 1); + black(app_pos(0), 40); } -static void test_console_patterns(void) +static void test_solo(void) { - printf("consola 0.9: W1-W10 patrones (cola, cadena), W11-W16 canales; los objetos 11-16 de la flash se ignoran\n"); - /* la flash: un patrón viejo en el objeto 12 ya no cuenta y su lugar se reusa */ - bm_sim_flash_erase_all(&sim); - bm_platform pf; - bm_sim_platform(&sim, &pf); - static bm_store st, st2; - bm_store_mount(&st, pf.flash); - uint8_t body[64]; - memset(body, 7, sizeof body); - CHECK(bm_store_write(&st, 12, body, sizeof body) == 0 && bm_store_has(&st, 12)); - bm_store_mount(&st2, pf.flash); - CHECK(!bm_store_has(&st2, 12) && bm_store_used_slots(&st2) == 0); + printf("mutes: un toque silencia, mantener = SOLO; las teclas pulsadas mientras tanto se suman; al soltar la primera vuelve todo\n"); boot(1); - CHECK(BM_PATTERNS == 10 && app.view == V_HOME); - const bm_keyfn *K = keys(); - CHECK(!strcmp(K[bm_white_key(9)].label, "10") && !strcmp(K[bm_white_key(10)].label, "T1") && !strcmp(K[bm_white_key(15)].label, "T6")); - CHECK(!strcmp(K[bm_black_key(0)].label, "M1") && !strcmp(K[bm_black_key(6)].label, "A") && !strcmp(K[bm_black_key(10)].label, "CUE")); - CHECK(K[bm_white_key(0)].led == LED_ON && K[bm_white_key(1)].led == LED_DIM); /* el actual ON, vacío DIM */ - CHECK(K[bm_white_key(10)].led == LED_ON && K[bm_white_key(12)].led == LED_MID); /* el cursor ON, con pasos MID */ - CHECK(K[bm_white_key(11)].led == LED_DIM); /* BP-1 sin tomas: vacío */ - CHECK(K[bm_black_key(0)].led == LED_MID && K[bm_black_key(10)].led == LED_DIM); - /* parado: cambia ya */ - white(2, 40); run_ms(300); - CHECK(app.ctx.st.pattern == 2 && keys()[bm_white_key(2)].led == LED_ON && keys()[bm_white_key(0)].led == LED_MID); - white(0, 40); run_ms(300); - CHECK(app.ctx.st.pattern == 0); - /* sonando: en cola para el ciclo maestro (4 compases en la demo) */ - btn(BTN_PLAY, 20); run_ms(200); - white(4, 40); - CHECK(app.ctx.st.queued == 4 && app.ctx.st.pattern == 0 && keys()[bm_white_key(4)].led == LED_BLINK); - run_ms(6200); - CHECK(app.ctx.st.pattern == 4); - /* una sostenida + otra = cadena: el siguiente de la cadena parpadea */ - kdown(bm_white_key(0)); run_ms(40); white(1, 40); kup(bm_white_key(0)); run_ms(40); - CHECK(app.ctx.st.pchain_n == 2); - run_ms(6200); - CHECK(app.ctx.st.pattern == 0 && keys()[bm_white_key(1)].led == LED_BLINK); - run_ms(6000); - CHECK(app.ctx.st.pattern == 1); - btn(BTN_PLAY, 20); - /* las blancas 11-16 no son patrones: mueven el cursor al bajar */ - int p = app.ctx.st.pattern; - kdown(bm_white_key(12)); run_ms(20); - CHECK(app.track == 2 && app.ctx.st.pattern == p); - kup(bm_white_key(12)); run_ms(40); - CHECK(app.view == V_HOME && !app.card); /* un toque: solo el cursor */ + black(app_pos(2), 40); + CHECK(app.pat.trk[2].mute == 1); + black(app_pos(2), 40); + CHECK(app.pat.trk[2].mute == 0); + app.pat.trk[5].mute = 1; /* T6 ya estaba en mute */ + uint8_t before[BM_TRACKS]; + for (int t = 0; t < BM_TRACKS; t++) before[t] = app.pat.trk[t].mute; + kdown(bm_black_key(app_pos(2))); run_ms(500); /* sostenida: SOLO T3 */ + CHECK(app.solo_on && app.solo_track == 2); + for (int t = 0; t < BM_TRACKS; t++) CHECK(app.pat.trk[t].mute == (t != 2)); + black(app_pos(4), 40); /* otra tecla mientras tanto: T5 queda activa */ + CHECK(app.pat.trk[4].mute == 0 && app.pat.trk[2].mute == 0 && app.pat.trk[0].mute == 1 && app.solo_on); + kdown(bm_black_key(app_pos(0))); run_ms(500); /* sostener otra no empieza otro solo */ + CHECK(app.solo_track == 2); + kup(bm_black_key(app_pos(0))); run_ms(40); + CHECK(app.pat.trk[0].mute == 0 && app.solo_on); /* ...pero la suma */ + kup(bm_black_key(app_pos(2))); run_ms(60); /* al soltar la primera: todo como estaba */ + CHECK(!app.solo_on); + for (int t = 0; t < BM_TRACKS; t++) CHECK(app.pat.trk[t].mute == before[t]); + app.pat.trk[5].mute = 0; + /* la luz: ON el solo, DIM el muteado */ + kdown(bm_black_key(app_pos(1))); run_ms(500); + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_black_key(app_pos(1))].led == LED_ON && keys_now[bm_black_key(app_pos(3))].led == LED_DIM); + kup(bm_black_key(app_pos(1))); run_ms(60); } static void test_scenes(void) { - printf("escenas 0.9: solo mutes; toque guarda (vacía) o lanza en el compás; 2 s guarda encima; EDIT + escena; cadena; CUE; mutes y cambio de patrón\n"); + printf("escenas: guardar = un patrón sostenido + la negra; un toque la lanza; 2 s la borra\n"); boot(1); - memset(app.song.scene, 0, sizeof app.song.scene); /* sin las de la demo */ - CHECK(keys()[bm_black_key(6)].led == LED_DIM); /* vacía: DIM */ - black(0, 40); /* parado: mute T1 */ - CHECK(app.pat.trk[0].mute); - black(6, 40); /* A vacía: guarda los mutes */ - CHECK((app.song.scene[0].flags & SCN_STORED) && app.song.scene[0].trk_mute == 0x01 && !strcmp(app.toast, "SCENE A STORED")); - CHECK(keys()[bm_black_key(6)].led == LED_MID && app.song_dirty); - black(0, 40); - CHECK(!app.pat.trk[0].mute); - black(6, 40); /* A guardada: la lanza (parado: ya) */ - CHECK(app.pat.trk[0].mute && app.ctx.st.scene == 0 && keys()[bm_black_key(6)].led == LED_ON); - black(0, 40); black(3, 40); /* B: T4 muteado */ - black(7, 40); - CHECK(app.song.scene[1].trk_mute == 0x08); - /* 2 s sostenida: guarda encima, con el anillo */ - black(3, 40); black(4, 40); /* ahora T5 */ - kdown(bm_black_key(7)); run_ms(1200); - { - char lb[24]; - CHECK(bm_app_key_ring(&app, lb, sizeof lb) > 100 && !strcmp(lb, "STORE SCENE B")); - } - shot("69-scene-store-ring"); - run_ms(1000); - CHECK(app.song.scene[1].trk_mute == 0x10); - kup(bm_black_key(7)); run_ms(60); - CHECK(app.pat.trk[4].mute && app.ctx.st.scene == 0); /* soltarla no la lanza */ - black(4, 40); + for (int s = 0; s < BM_SCENES; s++) CHECK(app.song.scene[0][s].flags & SCN_STORED); /* la demo trae las 4 del patrón 1 */ + CHECK(!(app.song.scene[1][0].flags & SCN_STORED)); + /* guardar: T1 y T2 en mute, patrón 1 sostenido, escena C */ + black(app_pos(0), 40); black(app_pos(1), 40); + CHECK(app.pat.trk[0].mute && app.pat.trk[1].mute); + kdown(bm_white_key(0)); run_ms(100); + bm_app_keys(&app, keys_now); + CHECK(!strcmp(keys_now[bm_black_key(9)].label, "SC")); /* mientras el patrón está sostenido, las escenas dicen SAVE */ + black(9, 40); /* escena C */ + kup(bm_white_key(0)); run_ms(60); + CHECK(app.song.scene[0][2].trk_mute == 0x03 && (app.song.scene[0][2].flags & SCN_STORED)); + CHECK(app.ctx.st.queued == 0xFF && app.ctx.st.pattern == 0); /* el patrón sostenido no se eligió */ + CHECK(!strncmp(app.toast, "SCENE C A01 STORED", 18)); + /* otro patrón: sus escenas son suyas */ + black(app_pos(3), 40); + kdown(bm_white_key(4)); run_ms(100); + black(8, 40); /* escena B del patrón 5 */ + kup(bm_white_key(4)); run_ms(60); + CHECK((app.song.scene[4][1].flags & SCN_STORED) && app.song.scene[4][1].trk_mute == 0x0B && app.song.scene[0][1].trk_mute == 0x38); + CHECK(app.ctx.st.queued == 0xFF && app.ctx.st.pattern == 0); + black(app_pos(3), 40); + /* un toque sin patrón: la lanza (parado: ya) */ + black(app_pos(0), 40); black(app_pos(1), 40); + CHECK(!app.pat.trk[0].mute && !app.pat.trk[1].mute); + black(9, 40); run_ms(60); + CHECK(app.pat.trk[0].mute && app.pat.trk[1].mute && !app.pat.trk[2].mute && app.ctx.st.scene == 2); + /* sonando: en el próximo compás */ + btn(BTN_PLAY, 20); run_ms(300); + CHECK(app.pat.trk[0].mute && app.pat.trk[1].mute && !app.pat.trk[2].mute); + black(7, 40); /* la A (todo suena) */ + CHECK(app.ctx.st.scene_q == 0 && app.pat.trk[0].mute && app.pat.trk[1].mute); /* todavía no */ + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_black_key(7)].led == LED_BLINK && keys_now[bm_black_key(9)].led == LED_ON); + black(app_pos(2), 40); /* mientras espera, los mutes siguen en vivo */ + CHECK(app.pat.trk[2].mute); + run_ms(1700); + CHECK(app.ctx.st.scene == 0 && app.ctx.st.scene_q == 0xFF); for (int t = 0; t < BM_TRACKS; t++) CHECK(!app.pat.trk[t].mute); - /* los mutes de la consola sobreviven al cambio de patrón: A02 guardado con T1 muteado y T5 no */ - static bm_pattern q; - static uint8_t pk[BM_PENDING_LEN]; - q = app.pat; q.trk[0].mute = 1; q.trk[4].mute = 0; q.tr[0].mute = 0; - int n = bm_pattern_pack(&q, pk, sizeof pk); - CHECK(n > 0 && bm_store_write(&app.store, 1, pk, (uint16_t)n) == 0); - /* sonando: la escena entra en el próximo compás */ - btn(BTN_PLAY, 20); run_ms(200); - black(7, 40); /* B (T5) */ - CHECK(app.ctx.st.scene_q == 1 && keys()[bm_black_key(7)].led == LED_BLINK && !app.pat.trk[4].mute); - run_ms(1600); - CHECK(app.ctx.st.scene == 1 && app.ctx.st.scene_q == 0xFF && app.pat.trk[4].mute); - app_push_i(&app, CMD_LANE_MUTE, 0, 0, 0, 0x0004); run_ms(40); /* y el hat de BR-8 (en vivo) */ - white(1, 40); /* A02 en cola */ - run_ms(6200); - CHECK(app.ctx.st.pattern == 1 && app.pat.trk[4].mute && !app.pat.trk[0].mute && app.pat.tr[0].mute == 0x0004); - /* EDIT sostenido + escena = vaciarla */ - down(BTN_EDIT); run_ms(400); - CHECK(app.layer == L_ERASE && !strcmp(keys()[bm_black_key(7)].label, "XB")); - black(7, 40); - up(BTN_EDIT); run_ms(60); - CHECK(!(app.song.scene[1].flags & SCN_STORED)); - /* una cadena: A sostenida + C, D (C y D guardadas antes) */ - black(2, 40); black(8, 40); black(2, 40); /* C: T3 */ - black(5, 40); black(9, 40); black(5, 40); /* D: T6 */ - CHECK(app.song.scene[2].trk_mute == 0x14 && app.song.scene[3].trk_mute == 0x30); - kdown(bm_black_key(6)); run_ms(40); black(8, 40); black(9, 40); kup(bm_black_key(6)); run_ms(40); - CHECK(app.ctx.st.chain_n == 3 && app.chain_n == 3 && app.chain[0] == 0 && app.chain[1] == 2 && app.chain[2] == 3); - run_ms(1600); - CHECK(app.ctx.st.scene == 0); /* la primera, en el próximo compás */ - run_ms(6200); - CHECK(app.ctx.st.scene == 2 && app.pat.trk[2].mute); /* la siguiente, con el ciclo maestro */ - /* CUE: con la negra 11 sostenida, los mutes caen juntos en el próximo compás */ - black(6, 40); run_ms(1600); /* A sola: sin cadena */ - CHECK(app.ctx.st.chain_n == 0 && app.ctx.st.scene == 0); - uint8_t m0 = app.pat.trk[1].mute, m1 = app.pat.trk[3].mute; - while (app.ctx.st.btick % BM_BAR_TICKS > 24) run_ms(5); /* justo después de un compás: el próximo está a 1.5 s */ - kdown(bm_black_key(10)); run_ms(350); /* sostenida (más que un toque) */ - CHECK(app.cue && keys()[bm_black_key(10)].led == LED_BREATH); - black(1, 40); black(3, 40); - CHECK(app.pat.trk[1].mute == m0 && app.pat.trk[3].mute == m1 && app.ctx.st.cue_x == 0x0A); - CHECK(keys()[bm_black_key(1)].led == LED_BLINK); - kup(bm_black_key(10)); run_ms(40); - CHECK(!app.cue); /* sostenida: no queda fija */ - run_ms(1600); - CHECK(app.pat.trk[1].mute != m0 && app.pat.trk[3].mute != m1 && app.ctx.st.cue_x == 0); - while (app.ctx.st.btick % BM_BAR_TICKS > 24) run_ms(5); - black(10, 40); /* un toque: CUE fija */ - CHECK(app.cue == 2); - black(1, 40); - CHECK(app.ctx.st.cue_x == 0x02); - shot("70-cue"); - black(10, 40); /* otro toque: suelta (lo que está en cola igual cae) */ - CHECK(app.cue == 0); - run_ms(1600); - CHECK(app.pat.trk[1].mute == m0 && app.ctx.st.cue_x == 0); btn(BTN_PLAY, 20); - /* parado, CUE no espera */ - black(10, 40); black(1, 40); - CHECK(app.pat.trk[1].mute != m0); + /* sostener 2 s: la borra, con su anillo, y no la lanza */ + kdown(bm_black_key(10)); run_ms(800); + char lb[24]; + int ring = bm_app_key_ring(&app, lb, sizeof lb); + CHECK(ring >= 0 && !strcmp(lb, "DELETE SCENE D")); + CHECK(app.song.scene[0][3].flags & SCN_STORED); + run_ms(1500); /* a los 2.3 s todavía no */ + CHECK(app.song.scene[0][3].flags & SCN_STORED); + run_ms(2400); /* 3 s en total */ + CHECK(!(app.song.scene[0][3].flags & SCN_STORED) && !strncmp(app.toast, "SCENE D DELETED", 15)); + kup(bm_black_key(10)); run_ms(60); + CHECK(app.ctx.st.scene_q == 0xFF && app.ctx.st.scene == 0); + CHECK(bm_app_key_ring(&app, lb, sizeof lb) < 0); + /* una vacía: un toque no hace nada */ + run_ms(UI_TOAST_MS + 200); + ui_snap s0 = ui_take(); + uint8_t m0[BM_TRACKS]; + for (int t = 0; t < BM_TRACKS; t++) m0[t] = app.pat.trk[t].mute; black(10, 40); - /* el objeto canción + escenas: versión nueva; uno viejo se ignora */ - app_job(&app, JOB_SAVE_SONG, 0); app_job(&app, JOB_SAVE_GLOB, 0); run_ms(300); - boot(0); - CHECK((app.song.scene[2].flags & SCN_STORED) && app.song.scene[2].trk_mute == 0x14); - { - uint8_t old[1 + 2 * BM_SONG_MAX + 32]; - memset(old, 0, sizeof old); old[0] = 3; /* 0.8: escenas con patrón, sin versión */ - bm_store_write(&app.store, BM_OBJ_SONG, old, sizeof old); - } + CHECK(ui_same(s0) && app.ctx.st.scene_q == 0xFF); + for (int t = 0; t < BM_TRACKS; t++) CHECK(app.pat.trk[t].mute == m0[t]); + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_black_key(10)].led == LED_DIM); + shot("23-scenes"); + /* se guardan con el proyecto */ + run_ms(UI_AUTOSAVE_MS + 1500); boot(0); - CHECK(!(app.song.scene[2].flags & SCN_STORED) && app.song.n == 0); + CHECK((app.song.scene[0][2].flags & SCN_STORED) && app.song.scene[0][2].trk_mute == 0x03 && !(app.song.scene[0][3].flags & SCN_STORED)); } -/* SLOOP-REC (REC en MIX): las teclas tocan el canal del cursor */ -static void test_sloop(void) +static void test_play_rec(void) { - printf("SLOOP-REC: REC en MIX arma el canal del cursor; notas cromáticas desde F, batería con ACC, REC expresivo\n"); + printf("PLAY/REC: la blanca del canal del cursor, el teclado toca, REC sobregraba, HOME sale\n"); boot(1); - enc(ENC_SELECT, 1); enc(ENC_SELECT, 1); /* T3 BB-303 */ - btn(BTN_REC, 30); - CHECK(app.sloop && app.rec && app.view == V_HOME && sim.leds[BTN_REC] == LED_ON); - const bm_keyfn *K = keys(); - CHECK(!strcmp(K[0].label, "F") && !strcmp(K[bm_white_key(15)].label, "G")); /* 27 teclas desde F */ - kdown(0); run_ms(40); - CHECK(app.key_nn[0] == 1 && app.key_notes[0][0] == BM_KEY_BASE_NOTE - 12); /* máquina de bajo: una octava abajo */ - kup(0); run_ms(40); + /* la blanca de un canal que no es el del cursor solo lo mueve */ + white(BM_CH_W0 + app_pos(2), 40); + CHECK(app.track == 2 && !app.sloop && app.view == V_HOME); + /* con el cursor en él: entra, en la misma pantalla */ + white(BM_CH_W0 + app_pos(2), 40); + CHECK(app.sloop && app.view == V_HOME && !app.rec && app.track == 2); + shot("01-home-play"); + bm_app_keys(&app, keys_now); + CHECK(!strcmp(keys_now[bm_white_key(0)].label, bm_note_names[((BM_KEY_BASE_NOTE + 0 - 12) % 12 + 12) % 12])); /* notas, no el mezclador */ + /* las teclas tocan la máquina del cursor */ + int k = bm_white_key(4); + kdown(k); run_ms(80); + int v = 0; + for (int i = 0; i < BM_VOICES; i++) v += app.ctx.voice[i].active && app.ctx.voice[i].track == 2; + CHECK(v >= 1 && app.ctx.st.queued == 0xFF); /* suena T3, y no cambió ningún patrón */ + kup(k); run_ms(300); + /* OCT corre la octava de las notas */ + int note0 = BM_KEY_BASE_NOTE + k - 12; btn(BTN_OCT_UP, 20); - CHECK(app.oct == 1 && sim.leds[BTN_OCT_UP] == LED_ON); - kdown(0); run_ms(40); - CHECK(app.key_notes[0][0] == BM_KEY_BASE_NOTE); - kup(0); run_ms(40); - btn(BTN_OCT_DN, 20); - CHECK(app.oct == 0); - /* KEYS IN SCALE: las blancas la escala, las negras acordes */ - app.pat.meta.scale_lock = 1; - CHECK(!strcmp(keys()[bm_black_key(0)].label, "I")); - kdown(bm_black_key(0)); run_ms(40); - CHECK(app.key_nn[bm_black_key(0)] >= 3); - kup(bm_black_key(0)); run_ms(40); - app.pat.meta.scale_lock = 0; - /* grabar: REC expresivo (lo grabado se ve en rojo) */ - int n0 = notes_in(2); - btn(BTN_PLAY, 20); run_ms(300); - hold_key(bm_white_key(4), 300); run_ms(200); - hold_key(bm_white_key(6), 150); run_ms(300); - CHECK(app.rec_steps != 0); - shot("71-sloop-note"); - CHECK(count_px(15, 40, 240, 135, C_RED) > 0); /* las notas de esta pasada, en rojo */ - btn(BTN_PLAY, 20); run_ms(60); - CHECK(notes_in(2) >= n0); - /* SELECT: otro canal, el teclado lo sigue (T1 batería: las blancas son los instrumentos, B1 = ACC) */ - enc(ENC_SELECT, -2); - CHECK(app.track == 0 && app.sloop && app.rec_steps == 0); - K = keys(); - CHECK(!strcmp(K[bm_white_key(0)].label, "BD") && !strcmp(K[bm_black_key(0)].label, "ACC") && K[bm_black_key(1)].label[0] == 0); - int lane = -1; /* un instrumento sin golpes */ - for (int l = 0; l < BM_LANES && lane < 0; l++) { - int any = 0; - for (int s = 0; s < BM_STEPS; s++) any |= app.pat.tr[0].st[l][s] & ST_ON; - if (!any) lane = l; + CHECK(app.oct == 1); + kdown(k); run_ms(80); + int hi = 0; + for (int i = 0; i < BM_VOICES; i++) if (app.ctx.voice[i].active && app.ctx.voice[i].track == 2 && app.ctx.voice[i].note == note0 + 12) hi = 1; + CHECK(hi); + kup(k); run_ms(100); + btn(BTN_OCT_DN, 20); CHECK(app.oct == 0); + /* SELECT: el teclado sigue al canal, sin salir de PLAY/REC */ + enc(ENC_SELECT, 1); + CHECK(app.track == 3 && app.sloop); + enc(ENC_SELECT, -1); + /* REC: grabar mientras suena el patrón: el paso que tocas se reescribe, lo demás queda */ + int before = 0, before_n[BM_STEPS] = {0}; + for (int s = 0; s < BM_STEPS; s++) for (int e = 0; e < BM_EVENTS; e++) before_n[s] += !bm_event_empty(bm_evc(&app.pat, 2, s, e)); + for (int s = 0; s < BM_STEPS; s++) before += before_n[s]; + CHECK(before > 0); + btn(BTN_PLAY, 20); run_ms(200); + btn(BTN_REC, 30); + CHECK(app.rec && app.sloop && app.view == V_HOME); + key(bm_white_key(9), 120); + run_ms(600); + key(bm_white_key(11), 120); + btn(BTN_REC, 30); /* REC otra vez: deja de grabar, sigue PLAY/REC */ + CHECK(!app.rec && app.sloop); + int has9 = 0, kept = 1, clean = 1; + int n9 = BM_KEY_BASE_NOTE + bm_white_key(9) - 12, n11 = BM_KEY_BASE_NOTE + bm_white_key(11) - 12; + for (int s = 0; s < BM_STEPS; s++) { + int nn = 0, mine = 0, other = 0; + for (int e = 0; e < BM_EVENTS; e++) { + const bm_event *ev = bm_evc(&app.pat, 2, s, e); + if (bm_event_empty(ev)) continue; + nn++; + if (ev->note == n9 || ev->note == n11) mine = 1; else other = 1; + if (ev->note == n9) has9 = 1; + } + if (!mine) kept &= nn == before_n[s]; + else clean &= !other; } - CHECK(lane >= 0); - btn(BTN_PLAY, 20); run_ms(250); - kdown(bm_black_key(0)); run_ms(20); /* ACC sostenida */ - hold_key(bm_white_key(lane), 60); - kup(bm_black_key(0)); run_ms(20); - run_ms(300); - hold_key(bm_white_key(lane), 60); /* sin ACC */ - run_ms(200); - shot("72-sloop-drums"); + CHECK(has9 && kept && clean); /* el paso tocado quedó solo con lo nuevo; lo demás, igual */ btn(BTN_PLAY, 20); - int acc = 0, flat = 0; - for (int s = 0; s < BM_STEPS; s++) { - uint8_t v = app.pat.tr[0].st[lane][s]; - if (!(v & ST_ON)) continue; - if (v & ST_ACC) acc++; else flat++; + /* HOME: sale al mezclador */ + btn(BTN_HOME, 30); + CHECK(!app.sloop && !app.rec && app.view == V_HOME); + /* REC 2 s: borra el canal del cursor (sonando o parado), con su anillo */ + { + int t0 = app.track, any = 0; + down(BTN_REC); run_ms(1200); + int hid = -1; + CHECK(bm_gesture_progress(&app.ges, now_ms, &hid) >= 0 && hid == BTN_REC); + run_ms(1000); up(BTN_REC); run_ms(60); + for (int s = 0; s < BM_STEPS; s++) for (int e = 0; e < BM_EVENTS; e++) any |= !bm_event_empty(bm_evc(&app.pat, t0, s, e)); + CHECK(!any && !app.rec && strstr(app.toast, "CLEARED") != NULL); } - CHECK(acc >= 1 && flat >= 1); - /* HOME sostenido: las teclas vuelven a ser del mezclador */ - int hb = hits_in(0); - down(BTN_HOME); run_ms(400); - black(2, 40); /* negra 3 = el mute de T3 */ - CHECK(app.layer == L_HOME && app.pat.trk[2].mute && !strcmp(keys()[bm_black_key(2)].label, "M3")); - black(2, 40); - up(BTN_HOME); run_ms(60); - CHECK(!app.pat.trk[2].mute && !strcmp(keys()[bm_black_key(0)].label, "ACC")); /* otra vez las del canal */ - white(0, 40); /* parado: suena, no graba */ - CHECK(app.sloop && hits_in(0) == hb); - /* REC 2 s: borra el canal del cursor (se deshace) */ - int h0 = hits_in(0); - CHECK(h0 > 0); - btn(BTN_REC, 2200); run_ms(60); - CHECK(hits_in(0) == 0 && app.sloop); - home_with(BTN_OCT_DN); - CHECK(hits_in(0) == h0); - /* REC otra vez: el mezclador */ + /* REC en el mezclador: entra a PLAY/REC ya grabando */ btn(BTN_REC, 30); - CHECK(!app.sloop && !app.rec && !strcmp(keys()[bm_white_key(0)].label, "01")); - /* REC sostenido en MIX: SLOOP solo mientras lo sostienes */ - down(BTN_REC); run_ms(400); CHECK(app.sloop && app.rec); - up(BTN_REC); run_ms(60); + btn(BTN_HOME, 30); CHECK(!app.sloop && !app.rec); - /* un canal de notas vacío: FREE REC (el largo se cierra al salir de SLOOP) */ - app_clear_track(&app, 5); run_ms(40); - enc(ENC_SELECT, 5); - CHECK(app.track == 5); + /* batería: las blancas son los instrumentos; OCT no cambia nada (16 sonidos en una sola página) */ + ch(0); + white(BM_CH_W0 + app_pos(0), 40); + CHECK(app.sloop && app.track == 0); + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_white_key(2)].label[0] && !keys_now[bm_black_key(0)].label[0]); /* las negras de la batería: sin función */ + int lane = 9; /* un instrumento sin pasos en el kit de la demo */ + while (lane < 16) { int any = 0; for (int s = 0; s < BM_STEPS; s++) any |= app.pat.tr[0].st[lane][s]; if (!any) break; lane++; } + CHECK(lane < 16); + btn(BTN_PLAY, 20); run_ms(200); btn(BTN_REC, 30); - CHECK(app.sloop && app.rec_free == 6 && app.pat.trk[5].length == 64); + app.ctx.st.lane_trig[0] = 0; + kdown(bm_white_key(lane)); run_ms(60); + CHECK(app.ctx.st.lane_trig[0] & (1u << lane) || app.lane_flash[0][lane] > now_ms); + kup(bm_white_key(lane)); run_ms(40); + btn(BTN_REC, 30); btn(BTN_PLAY, 20); + int any = 0; + for (int s = 0; s < BM_STEPS; s++) any |= app.pat.tr[0].st[lane][s] & ST_ON; + CHECK(any); /* el golpe quedó grabado, sin borrar los demás */ + CHECK(app.pat.tr[0].st[0][0] & ST_ON && app.pat.tr[0].st[0][4] & ST_ON); + int sel = app.sel_lane[0]; + btn(BTN_OCT_UP, 20); btn(BTN_OCT_DN, 20); + CHECK(app.sel_lane[0] == sel && app.oct == 0); + /* OCT+ sostenido: golpes fuertes, que se graban con acento (como en SLOOP) */ + for (int s = 0; s < BM_STEPS; s++) app.pat.tr[0].st[lane][s] = 0; btn(BTN_PLAY, 20); run_ms(200); - hold_key(bm_white_key(3), 500); run_ms(1400); - btn(BTN_REC, 30); run_ms(60); - CHECK(!app.sloop && !app.rec_free && app.pat.trk[5].length == 16 && notes_in(5) >= 1); - btn(BTN_PLAY, 20); - /* entrar a una máquina apaga SLOOP */ btn(BTN_REC, 30); - btn(BTN_SEQ, 30); - CHECK(app.view == V_CH && !app.sloop && !app.rec); + down(BTN_OCT_UP); run_ms(40); + shot("01-home-play-drums"); + kdown(bm_white_key(lane)); run_ms(60); kup(bm_white_key(lane)); run_ms(40); + up(BTN_OCT_UP); run_ms(40); + btn(BTN_REC, 30); btn(BTN_PLAY, 20); + int acc = 0; + for (int s = 0; s < BM_STEPS; s++) acc |= (app.pat.tr[0].st[lane][s] & (ST_ON | ST_ACC)) == (ST_ON | ST_ACC); + CHECK(acc && app.oct == 0); + btn(BTN_HOME, 30); + /* el sampler: pad por tecla */ + ch(1); + white(BM_CH_W0 + app_pos(1), 40); + CHECK(app.sloop && app.track == 1); + btn(BTN_HOME, 30); + CHECK(app.view == V_HOME && !app.sloop); } -static void test_oct_paging(void) +static void test_free_rec_drums(void) { - printf("OCT -/+ = la octava en todas partes (batería y pads: nada); B9/B10 = páginas; LENGTH +16; ERASE UND/RED\n"); + printf("batería vacía + REC: graba sobre el largo que tiene (no lo alarga)\n"); + boot(1); + app_push(&app, CMD_TRACK_CLEAR, 0, 0, 0); + run_ms(60); + int len0 = bm_trk_len(&app.pat, 0, 0); + play_rec(0); + btn(BTN_PLAY, 20); run_ms(200); + btn(BTN_REC, 30); + CHECK(app.rec && bm_trk_len(&app.pat, 0, 0) == len0); + uint32_t bar = 60000u * 4u / 160u; + run_ms(bar / 3); + key(bm_white_key(2), 100); + run_ms(bar); + key(bm_white_key(5), 100); + run_ms(bar / 2); + btn(BTN_REC, 30); + run_ms(100); + CHECK(!app.rec && bm_trk_len(&app.pat, 0, 0) == len0 && bm_trk_len(&app.pat, 0, 15) == len0); + int n2 = 0, n5 = 0; + for (int s = 0; s < BM_STEPS; s++) { n2 += app.pat.tr[0].st[2][s] & ST_ON; n5 += app.pat.tr[0].st[5][s] & ST_ON; } + CHECK(n2 >= 1 && n5 >= 1); + for (int l = 0; l < BM_LANES; l++) for (int s = len0; s < BM_STEPS; s++) CHECK(!(app.pat.tr[0].st[l][s] & ST_ON)); + btn(BTN_PLAY, 20); + btn(BTN_HOME, 30); +} + +static void test_drum_seq(void) +{ + printf("secuenciador de la batería: SEQ entra, blancas = pasos, OCT = página de sonidos, negras = compases, capas\n"); boot(1); - enc(ENC_SELECT, 2); /* consola, cursor en T3 (notas): la octava de SLOOP */ - btn(BTN_OCT_UP, 20); - CHECK(app.oct == 1 && sim.leds[BTN_OCT_UP] == LED_ON && sim.leds[BTN_OCT_DN] == LED_DIM); - enc(ENC_SELECT, -2); /* cursor en T1 (batería): nada */ - btn(BTN_OCT_UP, 20); - CHECK(app.oct == 1 && sim.leds[BTN_OCT_UP] == LED_OFF && sim.leds[BTN_OCT_DN] == LED_OFF); - /* dentro de una máquina de notas, también en SEQ: los grados de las negras siguen la octava */ ch(2); - page(BTN_SEQ, PG_SEQ); - int root, sc = app_scale(&app, 2, &root); - kdown(bm_black_key(0)); run_ms(40); - CHECK(app.key_notes[bm_black_key(0)][0] == bm_scale_note(root, sc, 0, 2 + 1)); - kup(bm_black_key(0)); run_ms(40); - btn(BTN_OCT_DN, 20); btn(BTN_OCT_DN, 20); - CHECK(app.oct == -1 && app.step_page == 0); /* ya no pasa páginas */ - kdown(bm_black_key(0)); run_ms(40); - CHECK(app.key_notes[bm_black_key(0)][0] == bm_scale_note(root, sc, 0, 2 - 1)); - kup(bm_black_key(0)); run_ms(40); - btn(BTN_OCT_UP, 20); - /* dos compases: B9 / B10 en ACCENT, TIE, ERASE y FILL */ - down(BTN_SEQ); run_ms(400); black(7, 40); up(BTN_SEQ); run_ms(60); /* 2BR */ - CHECK(app.pat.trk[2].length == 32); - down(BTN_ENV); run_ms(400); - CHECK(app.layer == L_ACC && keys()[bm_black_key(9)].led == LED_MID && keys()[bm_black_key(8)].led == LED_OFF); - black(9, 40); - CHECK(app.step_page == 1); - white(0, 40); /* paso 17: un acento */ - up(BTN_ENV); run_ms(60); - CHECK(!bm_event_empty(bm_evc(&app.pat, 2, 16, 0)) && bm_evc(&app.pat, 2, 16, 0)->vel == BM_VEL_ACC); - down(BTN_LFO); run_ms(400); - CHECK(app.layer == L_REP); - black(8, 40); - CHECK(app.step_page == 0); - up(BTN_LFO); run_ms(60); - down(BTN_EDIT); run_ms(400); + btn(BTN_SEQ, 30); + CHECK(app.view == V_MACH && app.bx.page == BXP_SEQ); /* T3 (BB-303): su piano roll */ + btn(BTN_HOME, 30); + ch(0); + btn(BTN_SEQ, 30); + CHECK(app.view == V_CH && app.track == 0 && app.layer == L_NONE); + shot("02-seq-tr"); + /* desde HOME, con el cursor en la batería, cada botón del menú lleva directo a lo suyo */ + static const struct { int id, layer; } DIRECTO[] = {{BTN_LFO, L_ACC}, {BTN_ENV, L_HIT}, {BTN_EDIT, L_INST}, {BTN_SCL, L_MUTE}}; + for (unsigned i = 0; i < sizeof DIRECTO / sizeof DIRECTO[0]; i++) { + btn(BTN_HOME, 30); + CHECK(app.view == V_HOME); + btn(DIRECTO[i].id, 30); + CHECK(app.view == V_CH && app.track == 0 && app.layer == DIRECTO[i].layer && app.layer_latch); + btn(DIRECTO[i].id, 30); /* otro clic cierra la capa y queda en el secuenciador */ + CHECK(app.view == V_CH && app.layer == L_NONE); + } + btn(BTN_HOME, 30); + white(BM_CH_W0, 40); /* en PLAY/REC de la batería también */ + CHECK(app.sloop); + btn(BTN_LFO, 30); + CHECK(!app.sloop && app.view == V_CH && app.layer == L_ACC); + btn(BTN_HOME, 30); btn(BTN_HOME, 30); + CHECK(app.view == V_HOME); + btn(BTN_SEQ, 30); + app.sel_lane[0] = 7; + CHECK(!(app.pat.tr[0].st[7][3] & ST_ON)); + white(3, 40); + CHECK(app.pat.tr[0].st[7][3] & ST_ON); /* un toque: pone el golpe */ + white(3, 40); + CHECK(!(app.pat.tr[0].st[7][3] & ST_ON)); /* otro: lo quita */ + /* OCT: la página de sonidos (los instrumentos 1-8 o 9-16) */ + CHECK(app.sel_lane[0] == 7); + btn(BTN_OCT_UP, 20); + CHECK(app.sel_lane[0] == 15 && app.oct == 0); + btn(BTN_OCT_UP, 20); + CHECK(app.sel_lane[0] == 15); /* no hay más páginas */ + btn(BTN_OCT_DN, 20); + CHECK(app.sel_lane[0] == 7); + btn(BTN_OCT_DN, 20); + CHECK(app.sel_lane[0] == 7); + /* ALGORITHM elige el instrumento (sin teclas negras) */ + enc(ENC_ALGO, -2); run_ms(700); + CHECK(app.sel_lane[0] == 5); + /* con un patrón de un compás, las negras 9 y 10 se ven (tenues) y al tocarlas lo dicen */ + int len = bm_trk_len(&app.pat, 0, 5); + CHECK(len == 16); + for (int b = 8; b < 10; b++) { black(b, 40); CHECK(app.sel_lane[0] == 5 && app.step_page == 0 && !strcmp(app.toast, "ONE BAR ONLY")); } + bm_app_keys(&app, keys_now); + for (int b = 0; b < 8; b++) CHECK(keys_now[bm_black_key(b)].label[0]); + CHECK(keys_now[bm_black_key(5)].led == LED_ON && !strcmp(keys_now[bm_black_key(8)].label, "<") && keys_now[bm_black_key(8)].led == LED_DIM + && !strcmp(keys_now[bm_black_key(10)].label, "RPT")); + black(2, 40); /* negras 1-8: eligen el instrumento de la página */ + CHECK(app.sel_lane[0] == 2); + black(5, 40); + /* las blancas vacías de los tiempos 1-4 (pasos 1, 5, 9, 13) quedan tenues; las otras vacías, apagadas */ + bm_app_keys(&app, keys_now); + for (int w = 0; w < 16; w++) + if (!(app.pat.tr[0].st[5][w] & ST_ON) && w != bm_app_track_step(&app, 0, 5)) + CHECK(keys_now[bm_white_key(w)].led == (w % 4 == 0 ? LED_DIM : LED_OFF)); + /* SEQ: un clic (o sostenido) sale al mezclador y otro vuelve a entrar */ + down(BTN_SEQ); run_ms(400); up(BTN_SEQ); run_ms(60); + CHECK(app.layer == L_NONE && app.view == V_HOME); + btn(BTN_SEQ, 30); + CHECK(app.layer == L_NONE && app.view == V_CH && app.sel_lane[0] == 5); + for (int l = 0; l < BM_LANES; l++) app_push_i(&app, CMD_SET_LANE, 0, (uint8_t)l, LN_LEN, 32); /* dos compases */ + run_ms(60); + /* con más de un compás, las negras 9 y 10 recorren los compases en círculo */ + bm_app_keys(&app, keys_now); + CHECK(!strcmp(keys_now[bm_black_key(8)].label, "<") && !strcmp(keys_now[bm_black_key(9)].label, ">")); black(9, 40); - white(0, 40); /* parado: borra el paso 17 */ - CHECK(bm_event_empty(bm_evc(&app.pat, 2, 16, 0)) && keys()[bm_black_key(5)].led == LED_MID); - black(5, 40); /* B6 = UNDO */ - CHECK(!bm_event_empty(bm_evc(&app.pat, 2, 16, 0)) && keys()[bm_black_key(6)].led == LED_MID); - up(BTN_EDIT); run_ms(60); - black(10, 40); /* FILL abierta: también pasa páginas */ - CHECK(app.layer == L_FILL); + CHECK(app.step_page == 1); + white(2, 40); /* el paso 19 */ + CHECK(app.pat.tr[0].st[5][18] & ST_ON && !(app.pat.tr[0].st[5][2] & ST_ON)); + black(9, 40); + CHECK(app.step_page == 0); /* del último vuelve al primero */ + black(8, 40); + CHECK(app.step_page == 1); /* y hacia atrás, también en círculo */ black(8, 40); - CHECK(app.step_page == 0 && app.layer == L_FILL); + CHECK(app.step_page == 0); + shot("03-seq-bars"); + /* un paso sostenido: K1 le pone acento (sin P-Locks: se fueron con lo viejo) */ + kdown(bm_white_key(4)); run_ms(500); + enc(ENC_K1, 5); + CHECK(bm_tr_lock_get(&app.pat.tr[0], 4, 5, 0) < 0 && (app.pat.tr[0].st[5][4] & ST_ACC)); + enc(ENC_K1, -1); + CHECK(!(app.pat.tr[0].st[5][4] & ST_ACC) && (app.pat.tr[0].st[5][4] & ST_ON)); + kup(bm_white_key(4)); run_ms(60); + /* LFO: acentos (con navegación: las negras eligen instrumento y compás) */ + btn(BTN_LFO, 30); + CHECK(app.layer == L_ACC && app.layer_latch); + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_black_key(5)].label[0] && !strcmp(keys_now[bm_black_key(9)].label, "<") && !strcmp(keys_now[bm_black_key(10)].label, ">")); + CHECK(!keys_now[bm_black_key(8)].label[0]); /* la 9: nada */ + white(4, 40); + CHECK(app.pat.tr[0].st[5][4] & ST_ACC); + shot("03-seq-accents"); + bm_app_keys(&app, keys_now); /* con acento ON, con golpe MID, vacíos apagados */ + for (int w = 0; w < 16; w++) { + uint8_t v = app.pat.tr[0].st[5][w]; + CHECK(keys_now[bm_white_key(w)].led == ((v & ST_ACC) ? LED_ON : (v & ST_ON) ? LED_MID : LED_OFF)); + } + black(1, 40); + CHECK(app.sel_lane[0] == 1 && app.layer == L_ACC); + black(5, 40); + btn(BTN_LFO, 30); + CHECK(app.layer == L_NONE); + /* negra 11: repeticiones (un toque la deja abierta), también con navegación */ black(10, 40); - /* LENGTH: B11 = +16 recorre 1-16 > 17-32 > 33-48 > 49-64; K1 cualquiera */ - down(BTN_SEQ); run_ms(400); - CHECK(app.len_page == 1 && !strcmp(keys()[bm_black_key(10)].label, "+16")); + CHECK(app.layer == L_REP && app.layer_latch); + bm_app_keys(&app, keys_now); + CHECK(!strcmp(keys_now[bm_black_key(10)].label, "RPT") && keys_now[bm_black_key(10)].led == LED_BREATH); + white(4, 40); + shot("03-seq-repeat"); + bm_app_keys(&app, keys_now); /* con repetición ON, con golpe MID, vacíos apagados */ + for (int w = 0; w < 16; w++) { + uint8_t v = app.pat.tr[0].st[5][w]; + CHECK(keys_now[bm_white_key(w)].led == ((v & (ST_RAT_MASK | ST_FLAM)) ? LED_ON : (v & ST_ON) ? LED_MID : LED_OFF)); + } + black(9, 40); + CHECK(app.step_page == 1); + black(9, 40); black(10, 40); - CHECK(app.len_page == 2); - white(15, 40); - CHECK(app.pat.trk[2].length == 48); - black(10, 40); black(10, 40); - CHECK(app.len_page == 0); + CHECK(app.layer == L_NONE && ((app.pat.tr[0].st[5][4] & ST_RAT_MASK) >> ST_RAT_SH) == 1); + /* ENV: el sonido del instrumento elegido (el golpe); sostenido es lo mismo que un clic */ + down(BTN_ENV); run_ms(400); + CHECK(app.layer == L_HIT && app.layer_latch); + bm_legend L[4]; + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "TUNE") && !strcmp(L[1].name, "DECAY") && !strcmp(L[2].name, "TONE")); + int dec = app.pat.tr[0].lane[5].decay; + enc(ENC_K2, 4); + CHECK(app.pat.tr[0].lane[5].decay == dec + 4); + white(3, 40); /* otra blanca: ese instrumento */ + CHECK(app.sel_lane[0] == 3); + black(5, 40); + up(BTN_ENV); run_ms(60); + CHECK(app.layer == L_HIT); /* soltarlo no la cierra: otro clic */ + shot("03-seq-hit"); + btn(BTN_ENV, 30); + CHECK(app.layer == L_NONE); + /* EDIT: ALGORITHM cambia el sonido (el modelo) de esta batería, se puede combinar cualquiera */ + btn(BTN_EDIT, 30); + CHECK(app.layer == L_INST && app.layer_latch); + const char *s1, *s2, *s3; + bm_app_bigknobs(&app, &s1, &s2, &s3); + CHECK(!strcmp(s2, "MODEL")); + int model = app.pat.tr[0].lane[5].model, other = app.pat.tr[0].lane[4].model; + enc(ENC_ALGO, 1); + CHECK(app.pat.tr[0].lane[5].model == (model + 1) % DRM_COUNT && app.pat.tr[0].lane[4].model == other); + enc(ENC_K1, -3); + CHECK(app.pat.tr[0].lane[5].level < 127); + btn(BTN_EDIT, 30); + CHECK(app.layer == L_NONE); + /* negra 11 sostenida: REPEAT solo mientras la sostienes */ + kdown(bm_black_key(10)); run_ms(500); + CHECK(app.layer == L_REP); + white(6, 40); + kup(bm_black_key(10)); run_ms(60); + CHECK(app.layer == L_NONE && ((app.pat.tr[0].st[5][6] & ST_RAT_MASK) >> ST_RAT_SH) == 1); + /* SCL: silenciar sonidos de la batería */ + btn(BTN_SCL, 30); + CHECK(app.layer == L_MUTE && app.layer_latch); + white(5, 40); + CHECK((app.pat.tr[0].mute >> 5) & 1); + white(5, 40); + CHECK(!((app.pat.tr[0].mute >> 5) & 1)); + { /* luces fijas: suena = fuerte, muteado = tenue */ + int lb = (app.sel_lane[0] / 8) * 8; + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_white_key(5)].led == LED_ON && !keys_now[bm_white_key(5)].live); + int act = 0; + for (int v = 0; v < BM_VOICES; v++) act += app.ctx.voice[v].active; + black(5 - lb >= 0 && 5 - lb < 8 ? 5 - lb : 0, 40); /* la negra: acceso rápido, mutea sin sonar */ + int act2 = 0; + for (int v = 0; v < BM_VOICES; v++) act2 += app.ctx.voice[v].active; + CHECK(lb == 0 && ((app.pat.tr[0].mute >> 5) & 1) && act2 <= act); + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_white_key(5)].led == LED_DIM && keys_now[bm_black_key(5)].led == LED_DIM); + black(5, 40); + CHECK(!((app.pat.tr[0].mute >> 5) & 1)); + int ew = -1; /* uno sin golpes: muteado también queda tenue */ + for (int w = 15; w >= 0 && ew < 0; w--) { + int any = 0; + for (int s2 = 0; s2 < BM_STEPS; s2++) any |= app.pat.tr[0].st[w][s2] & ST_ON; + if (!any) ew = w; + } + CHECK(ew >= 0); + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_white_key(ew)].led == LED_OFF); + white(ew, 40); + bm_app_keys(&app, keys_now); + CHECK(((app.pat.tr[0].mute >> ew) & 1) && keys_now[bm_white_key(ew)].led == LED_DIM); + white(ew, 40); + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_white_key(ew)].led == LED_OFF); + } + btn(BTN_SCL, 30); + CHECK(app.layer == L_NONE); + black(10, 40); /* otro botón cierra y hace lo suyo */ + btn(BTN_LFO, 30); + CHECK(app.layer == L_ACC); + btn(BTN_HOME, 30); /* HOME: primero cierra la capa, luego sale */ + CHECK(app.layer == L_NONE && app.view == V_CH); + btn(BTN_HOME, 30); + CHECK(app.view == V_HOME && app.layer == L_NONE); + seq0(); + + /* la perilla de la batería: SELECT no hace nada aquí; PRESETS el kit; K1-K4 las macros */ + int kit = app.pat.trk[0].source, mac = app.pat.trk[0].macro[0], pg = app.step_page; + enc(ENC_SELECT, 1); + CHECK(app.view == V_CH && app.track == 0 && app.step_page == pg); + enc(ENC_PRESETS, 1); + CHECK(app.pat.trk[0].source == (kit + 1) % BM_KITS_N); + /* sin capa, K1-K4 = LEVEL del elegido, LENGTH del kit entero, DECAY y TONE del elegido (no las macros) */ + int ln = app.sel_lane[0] & 15, lv = app.pat.tr[0].lane[ln].level, len0 = bm_trk_len(&app.pat, 0, 0); + enc(ENC_K1, -3); + enc(ENC_K2, 1); + CHECK(app.pat.trk[0].macro[0] == mac && app.pat.tr[0].lane[ln].level == lv - 3); + CHECK(bm_trk_len(&app.pat, 0, 0) == len0 + 1 && bm_trk_len(&app.pat, 0, 15) == len0 + 1); + enc(ENC_K2, -1); + CHECK(bm_trk_len(&app.pat, 0, 0) == len0 && bm_trk_len(&app.pat, 0, 7) == len0); + bm_legend LG[4]; + bm_app_legend(&app, LG); + CHECK(!strcmp(LG[0].name, "LEVEL") && !strcmp(LG[1].name, "LENGTH") && !strcmp(LG[2].name, "DECAY") && !strcmp(LG[3].name, "TONE")); + /* paso sostenido: K1 su acento, K2 su repetición; soltarlo no lo borra */ + white(7, 40); + CHECK(app.pat.tr[0].st[ln][app.step_page * 16 + 7] & ST_ON); + kdown(bm_white_key(7)); run_ms(500); + bm_app_legend(&app, LG); + CHECK(!strcmp(LG[0].name, "ACCENT") && !strcmp(LG[1].name, "REPEAT")); enc(ENC_K1, 1); - CHECK(app.pat.trk[2].length == 49); - up(BTN_SEQ); run_ms(60); - /* la batería: OCT apagado y sin efecto */ - ch(0); - int o = app.oct; - btn(BTN_OCT_UP, 20); - CHECK(app.oct == o && sim.leds[BTN_OCT_UP] == LED_OFF); + enc(ENC_K2, 1); run_ms(900); + enc(ENC_K2, 1); + kup(bm_white_key(7)); run_ms(60); + uint8_t sv = app.pat.tr[0].st[ln][app.step_page * 16 + 7]; + CHECK((sv & ST_ON) && (sv & ST_ACC) && ((sv & ST_RAT_MASK) >> ST_RAT_SH) == 2); + bm_app_bigknobs(&app, &s1, &s2, &s3); + CHECK(!strcmp(s1, "-") && !strcmp(s2, "INSTR") && !strcmp(s3, "KIT")); + shot("02-seq-knobs"); + /* HOME vuelve al mezclador; la capa abierta se cierra */ + btn(BTN_HOME, 30); + CHECK(app.view == V_HOME && app.layer == L_NONE); } -static void test_asks(void) +static void test_glo(void) { - printf("preguntas 0.9: el control que preguntó, sostenido 2 s = sí; soltarlo antes u otro control = no\n"); + printf("GLO del mezclador: SELECT MACHINE asigna la máquina al canal elegido (2 s en una la carga)\n"); boot(1); ch(3); - page(BTN_EDIT, PG_SOUND); - down(BTN_EDIT); run_ms(2100); /* EDIT 2 s: INIT SOUND? */ - CHECK(app.ask == ASK_INIT && app.ask_live && app.ask_ctl == BTN_EDIT && sim.leds[BTN_EDIT] == LED_BLINK); - up(BTN_EDIT); run_ms(60); /* soltarlo antes = no */ - CHECK(app.ask == ASK_NONE && !strcmp(app.toast, "CANCELED") && app.layer == L_NONE); - down(BTN_EDIT); run_ms(2100); - CHECK(app.ask == ASK_INIT); - run_ms(1000); - shot("46a-ask-hold"); - run_ms(1100); /* 2 s más sostenido = sí */ - CHECK(app.ask == ASK_NONE && !strcmp(app.toast, "INIT SOUND")); - up(BTN_EDIT); run_ms(60); - CHECK(app.layer == L_NONE && app.view == V_CH && app.page == PG_SOUND); - down(BTN_EDIT); run_ms(2100); - CHECK(app.ask == ASK_INIT); - btn(BTN_PLAY, 20); /* otro control = no (y no hace lo suyo) */ - CHECK(app.ask == ASK_NONE && !app.ctx.st.playing); - up(BTN_EDIT); run_ms(60); - /* una perilla preguntó (GLO de la máquina > INIT SOUND): 2 s sin tocar nada = sí; otra perilla = no */ btn(BTN_GLO, 30); - enc(ENC_SELECT, 10); - const char *nm; char v[24]; - bm_app_more_row(&app, app.more_row, &nm, v, sizeof v); - CHECK(!strcmp(nm, "INIT SOUND")); + CHECK(app.view == V_GLO && app.track == 3); + shot("24-glo-machines"); + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_white_key(BM_CH_W0 + app_pos(3))].led == LED_ON && keys_now[bm_black_key(6)].led == LED_OFF); /* el teclado sigue siendo el del mezclador */ + const char *s1, *s2, *s3; + bm_app_bigknobs(&app, &s1, &s2, &s3); + CHECK(!strcmp(s1, "TRACK") && !strcmp(s2, "MACHINE")); + int bpm = app.pat.meta.bpm_x10; + CHECK(!strcmp(s3, "-") && app.glo_page == 0); + btn(BTN_GLO, 30); /* GLO otra vez: la página TEMPO */ + CHECK(app.pat.meta.bpm_x10 == bpm && app.glo_page == 1); + enc(ENC_ALGO, 2); + CHECK(app.pat.meta.bpm_x10 == bpm + 20); + int sw = app.pat.meta.swing; + enc(ENC_K1, 3); + CHECK(app.pat.meta.swing == sw + 3); + shot("24e-glo-tempo"); + btn(BTN_GLO, 30); /* MASTER FX */ + CHECK(app.glo_page == 2); + int rm = app.pat.meta.rv_mix; + enc(ENC_K4, -4); + CHECK(app.pat.meta.rv_mix == rm - 4); + shot("24f-glo-fx"); + btn(BTN_GLO, 30); /* y vuelve a MACHINES */ + CHECK(app.glo_page == 0); + /* SELECT: el canal (todos, con vuelta) */ + enc(ENC_SELECT, 1); CHECK(app.track == 5); + enc(ENC_SELECT, 2); CHECK(app.track == 1); /* el Slicer, al final de la cadena */ + enc(ENC_ALGO, 1); /* fija */ + CHECK(!app.mach_arm && app.pat.trk[1].engine == ENG_BREAK && !strcmp(app.toast, "THIS MACHINE IS FIXED")); + enc(ENC_SELECT, -1); CHECK(app.track == 4); /* BITTAL ya no es fija: después viene la BX-7 */ enc(ENC_ALGO, 1); - CHECK(app.ask == ASK_INIT && app.ask_ctl == ASK_ENC); - enc(ENC_K1, 1); - CHECK(app.ask == ASK_NONE); - enc(ENC_ALGO, 1); run_ms(800); - enc(ENC_ALGO, 1); /* seguir a la derecha: sigue la cuenta */ - CHECK(app.ask == ASK_INIT); - shot("46c-ask-knob"); - run_ms(1400); - CHECK(app.ask == ASK_NONE && !strcmp(app.toast, "INIT SOUND")); + CHECK(app.mach_sel == ENG_FM && app.mach_arm == 1 && app.pat.trk[4].engine == ENG_BITTAL); + enc(ENC_SELECT, -2); + CHECK(app.track == 3 && app.mach_trk == 3 && app.mach_sel == ENG_MINI); + /* una máquina: la cuenta de 2 s y se carga */ + enc(ENC_ALGO, -1); + CHECK(app.mach_sel == ENG_ACID && app.mach_arm == 1); + run_ms(1000); + shot("24c-glo-machines"); + CHECK(app.pat.trk[3].engine == ENG_MINI); + run_ms(1300); + CHECK(app.pat.trk[3].engine == ENG_ACID && !app.mach_arm && !strcmp(app.toast, "T3 = BB-303") && app.view == V_GLO); + /* irse antes de los 2 s: nada */ + enc(ENC_ALGO, 1); + CHECK(app.mach_sel == ENG_MINI && app.mach_arm == 1); + run_ms(900); + enc(ENC_SELECT, 1); /* otro canal: cancela */ + CHECK(!app.mach_arm); + run_ms(2500); + CHECK(app.pat.trk[3].engine == ENG_ACID); + enc(ENC_SELECT, -1); + enc(ENC_ALGO, 1); + run_ms(900); + btn(BTN_HOME, 30); /* HOME: de vuelta, y cancela la cuenta */ + CHECK(app.view == V_HOME && !app.mach_arm); + run_ms(2500); + CHECK(app.pat.trk[3].engine == ENG_ACID); + /* la pesada, una vez: BUNO-6 ya está en el canal 4 (Vital queda fijo en el 5) */ + btn(BTN_GLO, 30); + enc(ENC_ALGO, 2); /* BB-303 > B-MINI > BUNO-6 */ + CHECK(app.mach_sel == ENG_BUNO && !app.mach_arm && !strcmp(app.toast, "BUNO-6 ALREADY ON T4")); + shot("24d-glo-heavy"); + enc(ENC_ALGO, 2); /* BUNO-6 > BITTAL > BX-7: ya hay dos pesadas */ + CHECK(app.mach_sel == ENG_FM && !app.mach_arm && !strcmp(app.toast, "2 HEAVY ON T4 T5")); + run_ms(2500); + CHECK(app.pat.trk[3].engine == ENG_ACID); + /* la máquina queda por patrón y las notas del canal quedan */ + int n3 = 0; + for (int s = 0; s < BM_STEPS; s++) for (int e = 0; e < BM_EVENTS; e++) n3 += !bm_event_empty(bm_evc(&app.pat, 3, s, e)); + CHECK(n3 > 0); + /* lo que ya no está: nada de TEMPO, SCALE ni SONG en GLO */ + btn(BTN_HOME, 30); + CHECK(app.view == V_HOME); } -static void test_console_glo(void) +static void test_leds(void) { - printf("GLO de la consola: TEMPO (con AUTO FILL), MACHINES, SCALE y SONG (entradas con escena, SONG REC)\n"); + printf("luces: los botones sin función apagados, los de la pantalla en DIM, la pantalla actual en ON\n"); boot(1); + CHECK(sim.leds[BTN_HOME] == LED_ON && sim.leds[BTN_GLO] == LED_DIM && sim.leds[BTN_SAVE] != LED_OFF && sim.leds[BTN_REC] == LED_DIM); + CHECK(sim.leds[BTN_SEQ] == LED_DIM); /* el cursor está en la batería */ + CHECK(sim.leds[BTN_FX] == LED_OFF && sim.leds[BTN_ARP] == LED_OFF); + CHECK(sim.leds[BTN_SCL] == LED_DIM && sim.leds[BTN_ENV] == LED_DIM && sim.leds[BTN_LFO] == LED_DIM && sim.leds[BTN_EDIT] == LED_DIM); /* llevan directo a su capa */ + CHECK(sim.leds[BTN_OCT_DN] == LED_OFF && sim.leds[BTN_OCT_UP] == LED_OFF); + enc(ENC_SELECT, 2); + run_ms(60); + CHECK(sim.leds[BTN_SEQ] == LED_DIM && sim.leds[BTN_EDIT] == LED_DIM && sim.leds[BTN_FX] == LED_DIM && sim.leds[BTN_ARP] == LED_DIM); /* T4 (B-MINI): sus menús */ + CHECK(sim.leds[BTN_LFO] == LED_DIM && sim.leds[BTN_ENV] == LED_DIM && sim.leds[BTN_SCL] == LED_DIM); + enc(ENC_SELECT, -1); + run_ms(60); + CHECK(sim.leds[BTN_SEQ] == LED_DIM && sim.leds[BTN_EDIT] == LED_DIM && sim.leds[BTN_FX] == LED_DIM && sim.leds[BTN_ARP] == LED_DIM); /* T3 (BB-303): sus páginas */ + CHECK(sim.leds[BTN_LFO] == LED_DIM && sim.leds[BTN_SCL] == LED_DIM && sim.leds[BTN_ENV] == LED_OFF); + enc(ENC_SELECT, 1); + run_ms(60); btn(BTN_GLO, 30); - CHECK(app.view == V_GLO && app.glo_page == GP_TEMPO && sim.leds[BTN_HOME] == LED_ON && sim.leds[BTN_GLO] == LED_MID); - static const char *const TR[5] = {"BPM", "SWING", "MASTER LENGTH", "TRANSPOSE", "AUTO FILL"}; - const char *nm; char v[20]; - CHECK(bm_app_glo_count(&app) == 5); - for (int i = 0; i < 5; i++) { bm_app_glo_row(&app, i, &nm, v, sizeof v); CHECK(!strcmp(nm, TR[i])); } - enc(ENC_SELECT, 4); - enc(ENC_ALGO, -1); /* AUTO FILL: de cada 4 (demo) a cada 2 */ - CHECK(app.pat.meta.fill_every == 2); - enc(ENC_SELECT, -1); enc(ENC_ALGO, 1); enc(ENC_ALGO, 1); - CHECK(app.pat.meta.transpose == 26); - int bpm = app.pat.meta.bpm_x10; + CHECK(sim.leds[BTN_GLO] == LED_ON && sim.leds[BTN_HOME] == LED_DIM && sim.leds[BTN_REC] == LED_OFF); + btn(BTN_HOME, 30); + /* PLAY/REC: OCT = la octava de las notas */ + white(BM_CH_W0 + 2, 40); + CHECK(app.sloop && sim.leds[BTN_OCT_DN] == LED_DIM && sim.leds[BTN_OCT_UP] == LED_DIM && sim.leds[BTN_HOME] == LED_MID); + btn(BTN_REC, 30); + CHECK(sim.leds[BTN_REC] == LED_ON); + btn(BTN_REC, 30); + btn(BTN_HOME, 30); + /* el secuenciador de la batería */ + seq0(); + CHECK(sim.leds[BTN_SEQ] == LED_ON && sim.leds[BTN_EDIT] == LED_DIM && sim.leds[BTN_ENV] == LED_DIM && sim.leds[BTN_LFO] == LED_DIM && sim.leds[BTN_SCL] == LED_DIM); + CHECK(sim.leds[BTN_OCT_DN] == LED_ON && sim.leds[BTN_OCT_UP] == LED_DIM && sim.leds[BTN_REC] == LED_OFF && sim.leds[BTN_GLO] == LED_OFF); + btn(BTN_OCT_UP, 20); + CHECK(sim.leds[BTN_OCT_UP] == LED_ON && sim.leds[BTN_OCT_DN] == LED_DIM); + btn(BTN_OCT_DN, 20); + /* las teclas: los pasos con golpe ON, el cabezal parpadea */ + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_white_key(0)].led == LED_ON && keys_now[bm_white_key(1)].led == LED_OFF && keys_now[bm_white_key(4)].led == LED_ON); + down(BTN_EDIT); run_ms(400); + CHECK(sim.leds[BTN_EDIT] == LED_BREATH && sim.leds[BTN_SEQ] == LED_OFF); + up(BTN_EDIT); run_ms(60); + btn(BTN_HOME, 30); + /* SAVE */ + btn(BTN_SAVE, 30); + CHECK(app.view == V_SAVE && sim.leds[BTN_SAVE] == LED_ON && sim.leds[BTN_HOME] == LED_DIM); + btn(BTN_HOME, 30); +} + +static void test_roll_audio(void) +{ + printf("ROLL (el motor, sin pantalla): velocidades y cola, ordenados por el audio\n"); + boot(1); + double fpt = BM_FS * 60.0 / (app.pat.meta.bpm_x10 / 10.0 * BM_PPQN); /* muestras por tick */ + uint32_t at[64]; uint8_t vel[64]; + app_push_i(&app, CMD_ROLL_CFG, 0, 50, 0, BM_BAR_TICKS); + app_push_i(&app, CMD_ROLL, 0, 5, 1, 16); /* 1/16T: cada 16 ticks */ + int n = roll_hits(0, 5, 700, at, vel, 64); + CHECK(n >= 8); + int ok = 1; + for (int i = 1; i < n && i < 64; i++) if (fabs((double)(at[i] - at[i - 1]) - 16 * fpt) > 40) ok = 0; + CHECK(ok); + app_push_i(&app, CMD_ROLL, 0, 5, 1, 8); /* 1/32T */ + n = roll_hits(0, 5, 300, at, vel, 64); + ok = n >= 8; + for (int i = 1; i < n && i < 64; i++) if (fabs((double)(at[i] - at[i - 1]) - 8 * fpt) > 40) ok = 0; + CHECK(ok); + app_push_i(&app, CMD_ROLL, 0, 5, 0, 0); + CHECK(roll_hits(0, 5, 300, at, vel, 64) == 0 && app.ctx.roll[0].mask == 0); +} + +/* ------------------------------------------------------------ idioma */ +static int lang_upload(const uint8_t *p, uint32_t n) +{ + if (bm_app_lang_load(&app, 0, 0, NULL, 0)) return -1; + for (uint32_t off = 0; off < n; off += 200) /* de a pedazos, como por USB */ + if (bm_app_lang_load(&app, 1, off, p + off, n - off < 200 ? n - off : 200)) return -1; + return bm_app_lang_load(&app, 2, 0, NULL, 0); +} + +/* El Slicer (2026-10-22): la rejilla por pasos, LENGTH AND SPEED, EDIT (TRIM: cortar la toma en los pads + * y escribir la secuencia; SOUND), ENV, FX, GLO y SAMPLE */ +static void test_slicer(void) +{ + printf("Slicer: rejilla, LENGTH AND SPEED, TRIM, SOUND, ENV, FX, GLO y SAMPLE\n"); + boot_loop(); + ch(1); /* el Slicer (pista interna T2, el último en pantalla) */ + CHECK(app.track == 1); + btn(BTN_EDIT, 30); /* desde HOME, EDIT: TRIM */ + CHECK(app.view == V_MACH && app.bx.page == BXP_MAIN && slicer_sub(&app) == 0 && mach_knobs_shown(&app)); + for (int i = 0; i < BM_LANES; i++) bm_pad_clear(&app.pat.pad[i]); + app.sel_lane[1] = 0; + enc(ENC_PRESETS, 1); /* PRESETS: la toma entera en el pad 1 */ + CHECK(bm_pad_ok(&app.pat.pad[0]) && app.pat.pad[0].src == 0 && app.pat.pad[0].start == 0); + uint32_t tlen = app.pat.pad[0].len; + CHECK(tlen == app.take[0].len); + shot("90-slicer-trim"); + black(0, 40); /* AUTO: en los golpes, y la secuencia */ + int n = 0, on = 0; + for (int i = 0; i < BM_LANES; i++) n += bm_pad_ok(&app.pat.pad[i]); + for (int l = 0; l < BM_LANES; l++) for (int s = 0; s < BM_STEPS; s++) on += (app.pat.tr[1].st[l][s] & ST_ON) != 0; + CHECK(n >= 4 && on >= n && strstr(app.toast, "PADS + SEQUENCE")); + black(2, 40); /* 16 partes iguales: los 16 pads y su secuencia */ + n = 0; on = 0; + for (int i = 0; i < BM_LANES; i++) n += bm_pad_ok(&app.pat.pad[i]); + for (int l = 0; l < BM_LANES; l++) for (int s = 0; s < BM_STEPS; s++) on += (app.pat.tr[1].st[l][s] & ST_ON) != 0; + CHECK(n == 16 && on == 16 && app.pat.pad[1].start == tlen / 16 && (app.pat.tr[1].st[1][1] & ST_ON)); + /* TRIM: ZOOM, LENGTH mueve el final, START el inicio (el final queda) */ + uint16_t s0 = app.pat.pad[0].start, l0 = app.pat.pad[0].len; + enc(ENC_K3, 1); + CHECK(app.bx.szoom == 1); + enc(ENC_K2, -1); + CHECK(app.pat.pad[0].start == s0 && app.pat.pad[0].len < l0); + uint32_t end = (uint32_t)app.pat.pad[0].start + app.pat.pad[0].len; enc(ENC_K1, 1); - CHECK(app.pat.meta.bpm_x10 == bpm + 10); - run_ms(UI_OVERLAY_MS + 100); - shot("24b-glo-tempo-fill"); - btn(BTN_GLO, 30); - CHECK(app.glo_page == GP_MACH); - shot("24c-glo-machines"); - btn(BTN_GLO, 30); - CHECK(app.glo_page == GP_SCALE && sim.leds[BTN_SCL] == LED_MID); - enc(ENC_SELECT, 2); enc(ENC_ALGO, 1); /* KEYS IN SCALE */ - CHECK(app.pat.meta.scale_lock == 1); - enc(ENC_ALGO, -1); - CHECK(app.pat.meta.scale_lock == 0); - int sc = app.pat.meta.scale; + CHECK(app.pat.pad[0].start > s0 && (uint32_t)app.pat.pad[0].start + app.pat.pad[0].len == end); + shot("90-slicer-trim-zoom"); + enc(ENC_ALGO, 2); /* ALGORITHM: el pad */ + CHECK(app.sel_lane[1] == 2); + key(bm_white_key(5), 60); /* una blanca: toca y elige su pad */ + CHECK(app.sel_lane[1] == 5); + btn(BTN_EDIT, 30); /* EDIT otra vez: SOUND */ + CHECK(app.bx.page == BXP_MAIN && slicer_sub(&app) == 1 && mach_knobs_shown(&app)); + enc(ENC_K1, 3); enc(ENC_K4, 1); enc(ENC_K3, 3); + const bm_pad *p5 = &app.pat.pad[5]; + CHECK(p5->pitch == 27 && (p5->flags & PAD_REV) && p5->mode == PAD_LOOP); + shot("91-slicer-sound"); + btn(BTN_EDIT, 30); /* y otra vez: TRIM, en círculo */ + CHECK(slicer_sub(&app) == 0); + btn(BTN_ENV, 30); /* ENV: ataque, release y el loop (modo LOOP) */ + CHECK(app.bx.page == BXP_ENV && !mach_knobs_shown(&app)); + enc(ENC_K1, 10); enc(ENC_K3, 40); + CHECK(p5->attack > 0 && p5->loop_s > 0); + shot("92-slicer-env"); + app.pat.pad[5].mode = PAD_ONESHOT; /* sin LOOP, el loop no tiene función */ + uint8_t ls = p5->loop_s; + enc(ENC_K3, 10); + CHECK(p5->loop_s == ls); + btn(BTN_ENV, 30); /* ENV otra vez: la rejilla */ + CHECK(app.view == V_CH && app.track == 1 && app.layer == L_NONE); + shot("93-slicer-seq"); + white(3, 40); /* un paso */ + CHECK(app.pat.tr[1].st[5][3] & ST_ON); + enc(ENC_K3, 2); /* K3 en la rejilla: PITCH del pad */ + CHECK(p5->pitch == 29); + btn(BTN_SEQ, 30); /* SEQ otra vez: LENGTH AND SPEED */ + CHECK(app.view == V_CH && app.layer == L_LEN); + white(11, 40); + CHECK(app.pat.tr[1].lane[5].len == 12 && app.pat.tr[1].lane[0].len == 16); + black(4, 40); + CHECK(app.pat.trk[1].speed == SPD_X1_2); + black(10, 40); white(0, 40); /* +16: 17 */ + CHECK(app.pat.tr[1].lane[5].len == 17); + shot("94-slicer-length"); + btn(BTN_SEQ, 30); /* otra vez: la rejilla */ + CHECK(app.view == V_CH && app.layer == L_NONE); + btn(BTN_LFO, 30); + CHECK(app.layer == L_ACC); + btn(BTN_SCL, 30); /* otro botón: cierra y hace lo suyo */ + CHECK(app.layer == L_MUTE); + btn(BTN_FX, 30); /* FX: la máquina */ + CHECK(app.view == V_MACH && app.bx.page == BXP_FX && app.layer == L_NONE); + enc(ENC_K4, 1); + CHECK(app.pat.prm[1][PX_FX] & 1); + btn(BTN_PLAY, 30); run_ms(800); + CHECK(app.ctx.st.playing); + shot("95-slicer-fx"); + btn(BTN_PLAY, 30); + btn(BTN_GLO, 30); /* GLO: LENGTH de todos los pads */ + CHECK(app.bx.page == BXP_GLO && mach_knobs_shown(&app)); + enc(ENC_K1, 1); + CHECK(app.pat.tr[1].lane[0].len == app.pat.tr[1].lane[5].len); + shot("96-slicer-glo"); + /* SAMPLE: graba lo que suena y queda en el pad elegido */ + btn(BTN_EDIT, 30); + int before = 0; + for (int i = 0; i < BM_TAKES; i++) before += app.take[i].valid; + app.sel_lane[1] = 9; + black(10, 40); run_ms(40); + CHECK(app.ctx.st.smp_armed); + btn(BTN_PLAY, 30); + run_ms(2 * 60000u * 4u * 10u / app.pat.meta.bpm_x10 + 300); + CHECK(!app.ctx.st.smp_rec && app.ctx.st.smp_unsaved); + btn(BTN_PLAY, 30); run_ms(1500); + int after = 0; + for (int i = 0; i < BM_TAKES; i++) after += app.take[i].valid; + CHECK(after == before + 1 && bm_pad_ok(&app.pat.pad[9]) && app.pat.pad[9].src != 0); + /* REC sostenido 2 s: borra la secuencia (los pads quedan) */ + btn(BTN_REC, 2300); + on = 0; + for (int l = 0; l < BM_LANES; l++) for (int s = 0; s < BM_STEPS; s++) on += (app.pat.tr[1].st[l][s] & ST_ON) != 0; + CHECK(on == 0 && bm_pad_ok(&app.pat.pad[0])); + btn(BTN_HOME, 30); + CHECK(app.view == V_HOME); + btn(BTN_SCL, 30); /* HOME, SCL: la rejilla con MUTE */ + CHECK(app.view == V_CH && app.layer == L_MUTE); + to_home(); + btn(BTN_OCT_UP, 30); + CHECK(app.view == V_HOME); +} + +static void test_lang(void) +{ + printf("idioma: ingles de fabrica, paquete de espanol por USB, SISTEMA > LANGUAGE\n"); + static uint8_t es[BM_LANG_HI - BM_LANG_LO]; + FILE *f = fopen("lang/es.bmlang", "rb"); + CHECK(f != NULL); + if (!f) return; + uint32_t n = (uint32_t)fread(es, 1, sizeof es, f); + fclose(f); + CHECK(bm_lang_check(es, n, NULL) == n); + boot(1); + CHECK(strcmp(bm_lang_name(), "ENGLISH") == 0 && !bm_app_lang_pack(&app)); + CHECK(strcmp(T("CLOCK"), "CLOCK") == 0); + shot("25-system-en"); + btn(BTN_PLAY, 20); + CHECK(lang_upload(es, n) < 0); /* sonando no se escribe la flash */ + btn(BTN_PLAY, 20); run_ms(100); + CHECK(lang_upload(es, n) == 0 && app.set.lang == 1); + CHECK(strcmp(bm_lang_name(), "ESPANOL") == 0); + CHECK(strcmp(T("CLOCK"), "RELOJ") == 0 && strcmp(T("NOT A PHRASE"), "NOT A PHRASE") == 0); + char b[32]; + snprintf(b, sizeof b, TF("SAVED A%02d"), 7); + CHECK(strcmp(b, "GUARDADO A07") == 0); + /* SISTEMA > LANGUAGE: inglés y vuelta */ + to_home(); + down(BTN_HOME); run_ms(2200); up(BTN_HOME); run_ms(60); + CHECK(app.view == V_SYSTEM); + for (int i = 0; i < 3; i++) enc(ENC_SELECT, 1); /* SYSTEM: reloj, sync, luces, idioma, versión */ + CHECK(app.menu_row == 3 && BM_SYS_ROWS[3] == 9); + shot("25-system-es"); + enc(ENC_ALGO, -1); /* a la izquierda: inglés */ + CHECK(app.set.lang == 0 && strcmp(T("CLOCK"), "CLOCK") == 0); + enc(ENC_ALGO, 1); /* a la derecha: el paquete */ + CHECK(app.set.lang == 1 && strcmp(T("CLOCK"), "RELOJ") == 0); + enc(ENC_ALGO, 1); /* otra vez a la derecha: sigue igual */ + CHECK(app.set.lang == 1); + /* queda guardado */ + run_ms(UI_AUTOSAVE_MS + 500); + boot(0); + CHECK(app.set.lang == 1 && strcmp(T("CLOCK"), "RELOJ") == 0); + /* un paquete dañado no se usa */ + sim.flash[BM_LANG_LO + 200] ^= 0x55; + boot(0); + CHECK(!bm_app_lang_pack(&app) && strcmp(T("CLOCK"), "CLOCK") == 0); + /* quitarlo */ + sim.flash[BM_LANG_LO + 200] ^= 0x55; + boot(0); + CHECK(strcmp(T("CLOCK"), "RELOJ") == 0); + CHECK(bm_app_lang_load(&app, 3, 0, NULL, 0) == 0 && app.set.lang == 0 && !bm_app_lang_pack(&app)); + CHECK(strcmp(T("CLOCK"), "CLOCK") == 0); +} + +/* PIANO ROLL (GLO de la máquina > VIEW) */ +static double draw_us(long *math); + +static int fx_name_is(int f) { return app.pat.prm[3][BX_ORD0 + app.bx.fxpos] == f; } + +static void test_b303(void) +{ + printf("BB-303: la TB-303 en el FM-1 (panel, ACCENT con LFO, SLIDE ligado, FX del TB-03, piano roll)\n"); + boot(1); + ch(2); + CHECK(app.pat.trk[2].engine == ENG_ACID); + btn(BTN_EDIT, 30); /* desde HOME, EDIT: el panel */ + CHECK(app.view == V_MACH && app.bx.page == BXP_MAIN && app.track == 2); + const char *s1, *s2, *s3; + bm_app_bigknobs(&app, &s1, &s2, &s3); + CHECK(!strcmp(s1, "-") && !strcmp(s2, "ACCENT") && !strcmp(s3, "PRESET")); + bm_legend L[4]; + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "CUTOFF") && !strcmp(L[1].name, "RESO") && !strcmp(L[2].name, "ENV MOD") && !strcmp(L[3].name, "DECAY")); + int cut = app.pat.trk[2].macro[0]; + enc(ENC_K1, 5); + CHECK(app.pat.trk[2].macro[0] == cut + 5 && !app.ov.on); /* el panel a la vista: sin el recuadro grande */ + int acc = app.pat.trk[2].accent; + enc(ENC_ALGO, -3); /* ALGORITHM = ACCENT */ + CHECK(app.pat.trk[2].accent == acc - 3 && !app.ov.on); + run_ms(100); + shot("81-b303-panel"); + btn(BTN_EDIT, 30); /* EDIT otra vez: la página 2 (no sale) */ + CHECK(app.bx.page == BXP_MAIN && app.bx.sub[BXP_MAIN] == 1); + btn(BTN_EDIT, 30); /* y otra vez: la 1, en círculo */ + CHECK(app.bx.page == BXP_MAIN && app.bx.sub[BXP_MAIN] == 0); + enc(ENC_SELECT, 1); /* SELECT ya no pasa de página */ + CHECK(app.bx.sub[BXP_MAIN] == 0); + btn(BTN_EDIT, 30); /* la página 2 */ + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "TUNING") && !strcmp(L[1].name, "WAVE") && !strcmp(L[2].name, "SLIDE") && !strcmp(L[3].name, "VOLUME")); enc(ENC_K2, 1); - CHECK(app.pat.meta.scale == (sc + 1) % BM_SCALES); + CHECK(app.pat.prm[2][AC_WAVE] == 1); + shot("81-b303-panel2"); + enc(ENC_K2, -1); + down(BTN_OCT_UP); run_ms(30); /* OCT sostenido + ALGORITHM: TUNING */ + enc(ENC_ALGO, 2); + up(BTN_OCT_UP); run_ms(30); + CHECK(app.pat.trk[2].transpose == 26); + down(BTN_OCT_DN); run_ms(30); down(BTN_OCT_UP); run_ms(30); up(BTN_OCT_UP); up(BTN_OCT_DN); run_ms(40); + CHECK(app.pat.trk[2].transpose == 24 && app.oct == 0); + /* FX: OVERDRIVE, DELAY, REVERB, como el TB-03; DELAY y REVERB son los envíos del canal */ + btn(BTN_FX, 30); + CHECK(app.bx.page == BXP_FX && app.bx.sub[BXP_FX] == 0); + CHECK(!bm_acid_fx_on(app.pat.prm[2], ACF_OD) && bm_send_on(&app.pat, 2, 0) && bm_send_on(&app.pat, 2, 1)); + CHECK(app.pat.prm[2][AC_OD_G] && app.pat.prm[2][AC_OD_L]); /* el demo de antes de los FX trae los de fábrica */ + enc(ENC_K4, 1); + CHECK(bm_acid_fx_on(app.pat.prm[2], ACF_OD)); + enc(ENC_K1, 20); + shot("81-b303-fx"); + static const uint8_t nt[2] = {45, 57}; + CHECK(solo_peak(2, nt, 1, 100, 300) > 0.02); /* con OVERDRIVE suena */ + btn(BTN_FX, 30); /* FX otra vez: la página 2, DELAY y REVERB */ + CHECK(app.bx.page == BXP_FX && app.bx.sub[BXP_FX] == 1); + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "DELAY") && !strcmp(L[1].name, "DLY ON") && !strcmp(L[2].name, "REVERB") && !strcmp(L[3].name, "REV ON")); + shot("81-b303-fx2"); + enc(ENC_K2, -1); /* DELAY apagado: sin envío */ + CHECK(!bm_send_on(&app.pat, 2, 0) && bm_send_on(&app.pat, 2, 1)); + enc(ENC_PRESETS, 1); /* otro sonido: los efectos quedan */ + CHECK(bm_acid_fx_on(app.pat.prm[2], ACF_OD) && !bm_send_on(&app.pat, 2, 0)); + btn(BTN_FX, 30); /* y otra vez: la página 1, sin salir */ + CHECK(app.bx.page == BXP_FX && app.bx.sub[BXP_FX] == 0); + btn(BTN_EDIT, 30); /* otro menú: sale */ + CHECK(app.bx.page == BXP_MAIN && app.bx.sub[BXP_MAIN] == 0); + btn(BTN_ENV, 30); /* la 303 no lo tiene */ + CHECK(app.view == V_MACH && app.bx.page == BXP_MAIN); + /* LFO (un añadido): RATE, DEPTH, WAVE (formas y patrones), DEST */ + btn(BTN_LFO, 30); + CHECK(app.bx.page == BXP_LFO); + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "RATE") && !strcmp(L[1].name, "DEPTH") && !strcmp(L[2].name, "WAVE") && !strcmp(L[3].name, "DEST")); + CHECK(!strcmp(L[0].val, "1 BAR") && app.pat.prm[2][AC_LFO_DEPTH] == 0); + for (int i = 0; i < ACW_GATE; i++) enc(ENC_K3, 1); + for (int i = 0; i < ACL_VOLUME; i++) enc(ENC_K4, 1); + CHECK(app.pat.prm[2][AC_LFO_WAVE] == ACW_GATE && app.pat.prm[2][AC_LFO_DEST] == ACL_VOLUME); + enc(ENC_K2, 127); + CHECK(app.pat.prm[2][AC_LFO_DEPTH] == 127); run_ms(UI_OVERLAY_MS + 100); - shot("24d-glo-scale"); - btn(BTN_HOME, 30); - btn(BTN_SCL, 30); /* SCL en HOME: la misma página */ - CHECK(app.view == V_GLO && app.glo_page == GP_SCALE); + shot("81-b303-lfo"); + btn(BTN_PLAY, 20); /* GATE en VOLUME a fondo: hay pasos callados */ + for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = (uint8_t)(i != 2); + kdown(bm_white_key(0)); run_ms(100); + { + double mn = 1e9, mx = 0; + for (int i = 0; i < 40; i++) { + peak_abs = 0; run_ms(25); + if (peak_abs < mn) mn = peak_abs; + if (peak_abs > mx) mx = peak_abs; + } + CHECK(mx > 0.02 && mn < mx * 0.2); + } + kup(bm_white_key(0)); + for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = 0; + btn(BTN_PLAY, 20); + enc(ENC_K2, -127); + btn(BTN_LFO, 30); + CHECK(app.bx.page == BXP_MAIN); + for (int w = 0; w < ACW_N; w++) + for (int i = 0; i <= 64; i++) { + float u = bm_acid_lfo_shape(w, (float)i / 64.0f, 3); + CHECK(u >= 0.0f && u <= 1.0f); + if (u < 0.0f || u > 1.0f) break; + } + /* ARP y GLO */ + btn(BTN_ARP, 30); + btn(BTN_ARP, 30); /* su página 2 */ + enc(ENC_K1, 1); + CHECK(app.pat.prm[2][AC_LATCH] == 1); + enc(ENC_K1, -1); btn(BTN_GLO, 30); - CHECK(app.glo_page == GP_SONG && sim.leds[BTN_SEQ] == LED_MID); - white(0, 40); white(2, 40); /* dos entradas */ - CHECK(app.song.n == 2 && app.song_cur == 1); - black(7, 40); /* B8: la escena B en la entrada 2 */ - CHECK(bm_song_scene(app.song.pat[1]) == 1 && bm_song_pat(app.song.pat[1]) == 2); - CHECK(keys()[bm_black_key(7)].led == LED_ON); - black(7, 40); /* otra vez: sin escena */ - CHECK(bm_song_scene(app.song.pat[1]) < 0); - black(8, 40); - CHECK(bm_song_scene(app.song.pat[1]) == 2); - enc(ENC_K2, 1); /* K2 = vueltas */ - CHECK(app.song.rep[1] == 2); - enc(ENC_ALGO, 1); /* ALGORITHM = el patrón de la entrada */ - CHECK(bm_song_pat(app.song.pat[1]) == 3 && bm_song_scene(app.song.pat[1]) == 2); - shot("24e-glo-song"); - black(10, 40); /* B11 borra la elegida */ - CHECK(app.song.n == 1); - black(10, 40); - CHECK(app.song.n == 0); - /* SONG REC (HOME + REC): los cambios de patrón y los lanzamientos de escena */ - home_with(BTN_REC); - CHECK(app.song_rec == 2); /* parado: armado, empieza con PLAY */ + CHECK(app.bx.page == BXP_GLO); + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "LENGTH") && !strcmp(L[1].name, "MACHINE") && !strcmp(L[2].name, "MIDI CH") && !strcmp(L[3].name, "MIDI OUT")); + btn(BTN_GLO, 30); /* su página 2: QUANT y RESET */ + bm_app_legend(&app, L); + CHECK(app.bx.sub[BXP_GLO] == 1 && !strcmp(L[2].name, "QUANT") && !strcmp(L[3].name, "RESET")); + CHECK(app.pat.trk[2].qfree == 0); /* de fábrica: 100 % */ + enc(ENC_K3, -1); + CHECK(app.pat.trk[2].qfree == 1 && !strcmp(app.ov.val, "75%")); + enc(ENC_K3, 1); + CHECK(app.pat.trk[2].qfree == 0); + /* REC armado en el panel: la primera nota arranca y graba; tocar ligado = SLIDE */ + btn(BTN_EDIT, 30); + CHECK(app.bx.page == BXP_MAIN); + for (int s = 0; s < BM_STEPS; s++) for (int e = 0; e < BM_EVENTS; e++) { bm_event z; bm_event_clear(&z); app_push_ev(&app, 2, s, e, &z); } + run_ms(40); + btn(BTN_REC, 30); + CHECK(app.bx.armed); + int ka = bm_white_key(0), kb = bm_white_key(4); + kdown(ka); run_ms(60); + CHECK(app.ctx.st.playing && app.rec); + run_ms(300); + kdown(kb); run_ms(80); /* la anterior sigue sostenida: SLIDE */ + int v = 0; + for (int i = 0; i < BM_VOICES; i++) v += app.ctx.voice[i].active && app.ctx.voice[i].track == 2 && app.ctx.voice[i].gate; + CHECK(v == 1); + kup(ka); run_ms(200); + kup(kb); run_ms(60); + shot("81-b303-seq"); + btn(BTN_REC, 30); + btn(BTN_PLAY, 20); + const bm_event *ea = NULL, *eb = NULL; + int sa = -1, sb = -1; + for (int s = 0; s < BM_STEPS; s++) for (int e = 0; e < BM_EVENTS; e++) { + const bm_event *ev = bm_evc(&app.pat, 2, s, e); + if (bm_event_empty(ev)) continue; + if (ev->note == BM_KEY_BASE_NOTE + ka) { ea = ev; sa = s; } + if (ev->note == BM_KEY_BASE_NOTE + kb) { eb = ev; sb = s; } + } + CHECK(ea && eb && sa == 0 && sb > 0 && sb < 16); + CHECK(ea && ea->vel != BM_VEL_ACC && (ea->len & BM_LEN_TIE) && (int)(ea->len & BM_LEN_MASK) == sb); + CHECK(eb && eb->vel != BM_VEL_ACC && !(eb->len & BM_LEN_TIE)); + /* SCL: el ACCENT de cada paso con las blancas; SCL otra vez, el SLIDE */ + btn(BTN_SCL, 30); + CHECK(app.bx.page == BXP_SCL && app.bx.sub[BXP_SCL] == 0 && app.bx.blk == 0); + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_white_key(0)].led == LED_DIM && keys_now[bm_white_key(sb)].led == LED_DIM); + white(0, 40); + CHECK(ea->vel == BM_VEL_ACC && eb->vel != BM_VEL_ACC); + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_white_key(0)].led == LED_ON); + int empty = sb + 1 < 16 ? sb + 1 : 15; + white(empty, 40); + CHECK(strstr(app.toast, "NO NOTE") != NULL); + shot("81-b303-accent"); + btn(BTN_SCL, 30); + CHECK(app.bx.page == BXP_SCL && app.bx.sub[BXP_SCL] == 1); + white(sb, 40); + CHECK(eb->len & BM_LEN_TIE); + white(sb, 40); + CHECK(!(eb->len & BM_LEN_TIE)); + shot("81-b303-slide"); + btn(BTN_SCL, 30); /* SCL otra vez: ACCENT, en círculo */ + CHECK(app.bx.page == BXP_SCL && app.bx.sub[BXP_SCL] == 0); + btn(BTN_ARP, 30); + CHECK(app.bx.page == BXP_ARP && app.bx.sub[BXP_ARP] == 0); + btn(BTN_ARP, 30); + CHECK(app.bx.page == BXP_ARP && app.bx.sub[BXP_ARP] == 1); + btn(BTN_LFO, 30); btn(BTN_LFO, 30); /* una sola página: otra vez, el panel */ + CHECK(app.bx.page == BXP_MAIN); btn(BTN_HOME, 30); - btn(BTN_PLAY, 20); run_ms(200); - CHECK(app.song_rec == 1 && app.song.n == 1 && bm_song_pat(app.song.pat[0]) == 0 && bm_song_scene(app.song.pat[0]) < 0); - black(7, 40); /* escena B */ - white(1, 40); /* y A02 en cola */ - run_ms(6200); - CHECK(app.song.n == 2 && bm_song_pat(app.song.pat[1]) == 1 && bm_song_scene(app.song.pat[1]) == 1); - run_ms(6000); - CHECK(app.song.n == 2 && app.song.rep[1] == 2); /* el mismo patrón sin escena nueva: una vuelta más */ + CHECK(app.view == V_HOME); +} + +static int gated(int t) +{ + int v = 0; + for (int i = 0; i < BM_VOICES; i++) v += app.ctx.voice[i].active && app.ctx.voice[i].track == t && app.ctx.voice[i].gate; + return v; +} + +static void test_fixes_1022(void) +{ + printf("arreglos 2026-10-22 (manuales de las máquinas, SLOOP, Felucca): acento de la 303, LATCH, notas colgadas, grabar ligado\n"); + boot(1); + /* BB-303: con ACCENT bajo, un paso normal no suena acentuado (la 303 acentúa solo el paso con acento) */ + ch(2); + app_set_track(&app, 2, TRK_OFF(accent), 10); + run_ms(40); btn(BTN_PLAY, 20); - home_with(BTN_REC); - CHECK(!app.song_rec); + int hi = 0, any = 0; + for (int i = 0; i < 40; i++) { + run_ms(10); + for (int v = 0; v < BM_VOICES; v++) + if (app.ctx.voice[v].active && app.ctx.voice[v].track == 2 && app.ctx.voice[v].gate) { any = 1; hi |= app.ctx.voice[v].vel >= 120 && app.ctx.voice[v].vel != 127; } + } + btn(BTN_PLAY, 20); + CHECK(any && !hi); + /* ARP con LATCH: apagar LATCH con las teclas sueltas lo para (manual del FM-1) */ + btn(BTN_ARP, 30); + CHECK(app.view == V_MACH && app.bx.page == BXP_ARP); + enc(ENC_K1, 1); /* MODE UP */ + btn(BTN_ARP, 30); + enc(ENC_K1, 1); /* LATCH ON */ + CHECK(app.pat.prm[2][AC_LATCH] == 1); + kdown(bm_white_key(0)); kdown(bm_white_key(2)); run_ms(60); + kup(bm_white_key(0)); kup(bm_white_key(2)); run_ms(400); + CHECK(app.ctx.arp[2].n == 2); /* sigue arpegiando */ + enc(ENC_K1, -1); /* LATCH OFF */ + run_ms(300); + CHECK(app.ctx.arp[2].n == 0 && gated(2) == 0); + /* una tecla apretada antes de prender el arpegiador se suelta normal (no queda colgada) */ + btn(BTN_ARP, 30); + enc(ENC_K1, -1); /* MODE OFF */ + run_ms(40); + kdown(bm_white_key(4)); run_ms(60); + CHECK(gated(2) == 1); + enc(ENC_K1, 1); /* MODE UP con la tecla apretada */ + run_ms(40); + kup(bm_white_key(4)); run_ms(200); + CHECK(gated(2) == 0); + enc(ENC_K1, -1); + btn(BTN_HOME, 30); + /* grabar ligado en B-MINI: la segunda nota no comparte casilla con la que sigue apretada */ + ch(3); + btn(BTN_SEQ, 30); + for (int s = 0; s < BM_STEPS; s++) for (int e = 0; e < BM_EVENTS; e++) { bm_event z; bm_event_clear(&z); app_push_ev(&app, 3, s, e, &z); } + run_ms(40); + btn(BTN_REC, 30); + int ka = bm_white_key(0), kb = bm_white_key(2); + kdown(ka); run_ms(300); + kdown(kb); run_ms(300); + kup(ka); run_ms(100); + kup(kb); run_ms(60); + btn(BTN_REC, 30); btn(BTN_PLAY, 20); + int sa = -1, sb = -1; + for (int s = 0; s < BM_STEPS; s++) for (int e = 0; e < BM_EVENTS; e++) { + const bm_event *ev = bm_evc(&app.pat, 3, s, e); + if (bm_event_empty(ev)) continue; + if (ev->note == BM_KEY_BASE_NOTE + ka) sa = e; + if (ev->note == BM_KEY_BASE_NOTE + kb) sb = e; + } + CHECK(sa >= 0 && sb >= 0 && sa != sb); + btn(BTN_HOME, 30); } -/* render de bloques sin la interfaz: para comparar dos mezclas muestra a muestra */ -static void render(int32_t *dst, int frames) +static int step_n(int t, int s) { - for (int o = 0; o < frames; o += 128) bm_app_audio(&app, dst + o * 2, frames - o < 128 ? (uint32_t)(frames - o) : 128u); + int n = 0; + for (int e = 0; e < BM_EVENTS; e++) n += !bm_event_empty(bm_evc(&app.pat, t, s, e)); + return n; } -static void fx_solo(int t, int beatfx, int off, int drive) +static int step_has(int t, int s, int note) { + for (int e = 0; e < BM_EVENTS; e++) { + const bm_event *ev = bm_evc(&app.pat, t, s, e); + if (!bm_event_empty(ev) && ev->note == note) return 1; + } + return 0; +} + +static void test_roll_machines(void) +{ + printf("B-MINI, BUNO-6 y BITTAL: SEQ abre su piano roll (REC tipo SLOOP); SEQ otra vez, su panel\n"); boot(1); - for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = (uint8_t)(i != t); - app.pat.trk[t].send = 0; app.pat.trk[t].rsend = 0; app.pat.meta.rv_mix = 0; app.pat.meta.dly_mix = 0; - app.pat.meta.beatfx = (uint8_t)beatfx; app.pat.trk[t].bfx_off = (uint8_t)off; app.pat.trk[t].drive = (uint8_t)drive; - note(t, 57, 1); note(t, 60, 1); note(t, 64, 1); + static const int TT[3] = {3, 5, 4}; + for (int i = 0; i < 3; i++) { + ch(TT[i]); + btn(BTN_SEQ, 30); + CHECK(app.view == V_MACH && app.bx.page == BXP_SEQ && app.track == TT[i]); + run_ms(60); + CHECK(sim.leds[BTN_SEQ] == LED_ON && sim.leds[BTN_FX] == LED_DIM && sim.leds[BTN_EDIT] == LED_DIM && sim.leds[BTN_REC] == LED_DIM); /* sus menús */ + if (i == 0) { + bm_legend L[4]; + bm_app_legend(&app, L); + CHECK(!L[0].name[0] && !strcmp(L[1].name, "SPEED") && !strcmp(L[2].name, "PAGE") && !strcmp(L[3].name, "SCROLL")); + enc(ENC_K4, 3); /* K4: las alturas que se ven */ + CHECK(app.bx.vy == 3); + enc(ENC_K4, -3); + /* GLO: LENGTH (en pasos), MACHINE (solo las que se pueden), MIDI CH, MIDI OUT; pág 2 RESET */ + btn(BTN_GLO, 30); + CHECK(app.bx.page == BXP_GLO && sim.leds[BTN_GLO] != LED_OFF); + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "LENGTH") && !strcmp(L[1].name, "MACHINE") && !strcmp(L[2].name, "MIDI CH") && !strcmp(L[3].name, "MIDI OUT")); + int len = app.pat.trk[3].length; + enc(ENC_K1, 1); + CHECK(app.pat.trk[3].length == len + 1); /* en pasos: 16, 17, 30... */ + shot("82-mini-glo"); + enc(ENC_K1, -1); + for (int n = 0; n < 4; n++) enc(ENC_K2, 1); /* las pesadas que no se pueden no aparecen */ + int shown = app_mach_shown(&app); + CHECK(shown == ENG_MINI || shown == ENG_BUNO || shown == ENG_BITTAL || shown == ENG_FM); + CHECK(shown == ENG_MINI || !(bm_machine_conflict(&app.pat, 3, shown) >= 0)); + for (int n = 0; n < 6; n++) enc(ENC_K2, -1); + CHECK(app_mach_shown(&app) == ENG_ACID && app.mach_arm); + run_ms(2300); /* 2 s en una: la carga */ + CHECK(app.pat.trk[3].engine == ENG_ACID && app.view == V_MACH && app.bx.page == BXP_GLO); + enc(ENC_K2, 1); + run_ms(2300); + CHECK(app.pat.trk[3].engine == ENG_MINI && app.view == V_MACH); + btn(BTN_GLO, 30); + bm_app_legend(&app, L); + CHECK(app.bx.sub[BXP_GLO] == 1 && !strcmp(L[2].name, "QUANT") && !strcmp(L[3].name, "RESET")); + btn(BTN_SEQ, 30); /* de vuelta al piano roll */ + CHECK(app.view == V_MACH && app.bx.page == BXP_SEQ); + run_ms(UI_OVERLAY_MS + 100); + shot("82-mini-seq"); + /* parado en el SEQ: REC = paso a paso */ + for (int s = 0; s < BM_STEPS; s++) for (int e = 0; e < BM_EVENTS; e++) { bm_event z; bm_event_clear(&z); app_push_ev(&app, 3, s, e, &z); } + run_ms(40); + btn(BTN_REC, 30); + CHECK(app.rec && !app.ctx.st.playing && mach_step_mode(&app) && app.bx.step == 0); + int ka = bm_white_key(7), kb = bm_white_key(9), na = BM_KEY_BASE_NOTE + ka, nb = BM_KEY_BASE_NOTE + kb; + key(ka, 60); + CHECK(app.bx.step == 1); + kdown(ka); kdown(kb); run_ms(60); kup(ka); run_ms(30); + CHECK(app.bx.step == 1); /* el acorde sigue apretado */ + kup(kb); run_ms(40); + CHECK(app.bx.step == 2); + enc(ENC_SELECT, 2); /* SELECT mueve el cursor: un silencio */ + CHECK(app.bx.step == 4); + key(kb, 60); + CHECK(step_has(3, 0, na) && step_has(3, 1, na) && step_has(3, 1, nb) && step_has(3, 4, nb)); + CHECK(step_n(3, 2) == 0 && step_n(3, 3) == 0 && step_n(3, 0) == 1); + shot("82-mini-step"); + enc(ENC_SELECT, -5); /* el paso 1 otra vez: se reescribe */ + CHECK(app.bx.step == 0); + key(kb, 60); + CHECK(step_has(3, 0, nb) && !step_has(3, 0, na) && step_n(3, 0) == 1); + /* PLAY: sigue grabando en vivo, con el largo de lo que sostienes */ + btn(BTN_PLAY, 20); + CHECK(app.ctx.st.playing && app.rec && !mach_step_mode(&app)); + key(bm_white_key(11), 300); + btn(BTN_REC, 30); btn(BTN_PLAY, 20); + int found = 0; + for (int s2 = 0; s2 < BM_STEPS; s2++) found |= step_has(3, s2, BM_KEY_BASE_NOTE + bm_white_key(11)); + CHECK(found && !app.rec); + } + btn(BTN_SEQ, 30); /* SEQ otra vez: su panel */ + CHECK(app.view == V_MACH && app.bx.page == BXP_MAIN); + btn(BTN_HOME, 30); + CHECK(app.view == V_HOME); + } } -static void test_fx_channel(void) +static void test_panels(void) { - printf("HOME FX > CHANNEL: DRIVE (soft-clip del canal), PAN, DUCK y BEAT FX por canal (como un MX-1)\n"); + printf("BUNO-6 y BITTAL: los menús del B-MINI (EDIT por secciones, ENV, LFO, FX, SCL); BITTAL dibuja sus tablas\n"); boot(1); - enc(ENC_SELECT, 3); /* T4 BX-7 */ - btn(BTN_FX, 30); - CHECK(app.view == V_FXG && app.fx_page == FXP_CHANNEL); bm_legend L[4]; + char ti[24]; + const char *s1, *s2, *s3; + static const uint8_t nt[1] = {48}; + /* BUNO-6: el Juno-6 */ + ch(5); + CHECK(app.pat.trk[5].engine == ENG_BUNO); + btn(BTN_EDIT, 30); + CHECK(app.view == V_MACH && app.bx.page == BXP_MAIN && !strcmp(mach_title(&app, ti, sizeof ti), "VCF 1/5")); bm_app_legend(&app, L); - CHECK(!strcmp(L[0].name, "DRIVE") && !strcmp(L[0].val, "OFF") && !strcmp(L[1].name, "PAN") && !strcmp(L[2].name, "DUCK") - && !strcmp(L[3].name, "BEAT FX") && !strcmp(L[3].val, "ON")); - run_ms(1000); - enc(ENC_K1, 10); - CHECK(app.pat.trk[3].drive == 10); - enc(ENC_K2, 3); /* PAN: el centro retiene 2 */ - CHECK(app.pat.trk[3].pan == 65); - int dk = app.pat.trk[3].duck; - enc(ENC_K3, 2); - CHECK(app.pat.trk[3].duck == dk + 2); - enc(ENC_K4, -1); /* a la izquierda: BEAT FX OFF en este canal */ - CHECK(app.pat.trk[3].bfx_off == 1); - enc(ENC_K4, -1); - CHECK(app.pat.trk[3].bfx_off == 1); + CHECK(!strcmp(L[0].name, "FREQ") && !strcmp(L[1].name, "RES") && !strcmp(L[2].name, "ENV") && !strcmp(L[3].name, "LFO")); + bm_app_bigknobs(&app, &s1, &s2, &s3); + CHECK(!strcmp(s2, "FREQ")); + int f0 = app.pat.trk[5].macro[0]; + enc(ENC_ALGO, -3); + CHECK(app.pat.trk[5].macro[0] == f0 - 3 && !app.ov.on); + run_ms(100); + shot("84-buno-vcf"); + static const char *const BE[5][4] = {{"FREQ", "RES", "ENV", "LFO"}, {"RANGE", "PULSE", "SAW", "SUB"}, {"LFO", "PWM", "PWM MODE", "NOISE"}, + {"HPF", "ENV +/-", "KYBD", "VELO"}, {"ENV/GATE", "VELO", "", "VOLUME"}}; + for (int pg = 1; pg <= 5; pg++) { + btn(BTN_EDIT, 30); + bm_app_legend(&app, L); + for (int k = 0; k < 4; k++) CHECK(!strcmp(L[k].name, BE[pg % 5][k])); + if (pg == 1) shot("84-buno-dco"); + } + btn(BTN_ENV, 30); /* una sola envolvente: ENV otra vez, el panel */ + CHECK(app.bx.page == BXP_ENV && !strcmp(mach_title(&app, ti, sizeof ti), "ENV")); + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "ATTACK") && !strcmp(L[3].name, "RELEASE")); + shot("84-buno-env"); + btn(BTN_ENV, 30); + CHECK(app.bx.page == BXP_MAIN); + btn(BTN_LFO, 30); + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "RATE") && !strcmp(L[1].name, "DELAY")); + enc(ENC_K2, 30); run_ms(UI_OVERLAY_MS + 100); - shot("39a-home-fx-channel"); + shot("84-buno-lfo"); + btn(BTN_FX, 30); + CHECK(!bm_px_fx_on(app.pat.prm[5], ENG_BUNO, PXF_DIST) && bm_send_on(&app.pat, 5, 1)); enc(ENC_K4, 1); - CHECK(app.pat.trk[3].bfx_off == 0); - /* los formatos: DRIVE y BEAT FX viajan con el patrón */ - static uint8_t b[BM_PENDING_LEN]; - static bm_pattern q; - app.pat.trk[3].bfx_off = 1; - int n = bm_pattern_pack(&app.pat, b, sizeof b); - CHECK(n > 0 && bm_pattern_unpack(&q, b, n) == n && q.trk[3].drive == 10 && q.trk[3].bfx_off == 1); - /* el audio: BEAT FX OFF = el STUTTER no toca el canal (igual que sin efecto); ON sí lo toca */ - enum { N = 30000 }; - static int32_t ref[N * 2], off[N * 2], on[N * 2], drv[N * 2]; - fx_solo(3, 0, 0, 0); render(ref, N); - fx_solo(3, 1, 1, 0); render(off, N); - fx_solo(3, 1, 0, 0); render(on, N); - fx_solo(3, 0, 0, 127); render(drv, N); - int d_off = 0, d_on = 0, d_drv = 0; - double pr = 0, pd = 0, er = 0, ed = 0; - for (int i = 0; i < N * 2; i++) { - d_off += ref[i] != off[i]; d_on += ref[i] != on[i]; d_drv += ref[i] != drv[i]; - if (fabs((double)ref[i]) > pr) pr = fabs((double)ref[i]); - if (fabs((double)drv[i]) > pd) pd = fabs((double)drv[i]); - er += (double)ref[i] * ref[i]; ed += (double)drv[i] * drv[i]; + CHECK(bm_px_fx_on(app.pat.prm[5], ENG_BUNO, PXF_DIST)); + CHECK(solo_peak(5, nt, 1, 100, 300) > 0.01); + btn(BTN_FX, 30); + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "CHORUS") && !strcmp(L[2].name, "REVERB")); + for (int i = 0; i < 4; i++) enc(ENC_K1, 1); + CHECK(app.pat.prm[5][BN_CHORUS] == BN_CH_BOTH && !strcmp(app.ov.val, "I+II")); + run_ms(UI_OVERLAY_MS + 100); + shot("84-buno-fx2"); + enc(ENC_K1, -2); + btn(BTN_FX, 30); enc(ENC_K4, -1); + btn(BTN_SCL, 30); + CHECK(app.bx.page == BXP_SCL && !strcmp(mach_title(&app, ti, sizeof ti), "ACCENT 1-16")); + btn(BTN_HOME, 30); + /* BITTAL: Vital */ + ch(4); + CHECK(app.pat.trk[4].engine == ENG_BITTAL); + btn(BTN_EDIT, 30); + CHECK(!strcmp(mach_title(&app, ti, sizeof ti), "OSC 1 1/7")); + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "LEVEL") && !strcmp(L[1].name, "TRANSP") && !strcmp(L[2].name, "FRAME") && !strcmp(L[3].name, "UNISON")); + bm_app_bigknobs(&app, &s1, &s2, &s3); + CHECK(!strcmp(s2, "CUTOFF")); + int c0 = app.pat.prm[4][BT_CUT]; + enc(ENC_ALGO, -4); + CHECK(app.pat.prm[4][BT_CUT] == c0 - 4 && app.ov.on); /* el corte no está en OSC 1: el recuadro */ + run_ms(UI_OVERLAY_MS + 100); + for (int i = 0; i < 10; i++) enc(ENC_K3, 10); /* FRAME: la onda de abajo cambia */ + run_ms(UI_OVERLAY_MS + 100); + shot("85-bittal-osc1"); + static const char *const TE[7][2] = {{"LEVEL", "UNISON"}, {"DETUNE", ""}, {"LEVEL", "UNISON"}, {"DETUNE", ""}, + {"MODEL", "DRIVE"}, {"ENV2 AMT", "ENV2 POS"}, {"MODE", "VOLUME"}}; + for (int pg = 1; pg <= 7; pg++) { + btn(BTN_EDIT, 30); + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, TE[pg % 7][0]) && !strcmp(L[3].name, TE[pg % 7][1])); + if (pg == 4) { + enc(ENC_ALGO, 4); /* en FILTER el corte se ve en su perilla */ + CHECK(app.pat.prm[4][BT_CUT] == c0 && !app.ov.on); + shot("85-bittal-filter"); + } } - double cr = er > 0 ? pr / sqrt(er / (N * 2)) : 0, cd = ed > 0 ? pd / sqrt(ed / (N * 2)) : 0; /* pico / RMS */ - printf(" STUTTER 4: muestras distintas con BEAT FX OFF %d, ON %d · DRIVE 127: pico/RMS %.2f -> %.2f\n", d_off, d_on, cr, cd); - CHECK(d_off == 0 && d_on > N / 4 && d_drv > N / 4 && cd < cr && cd > 0); + btn(BTN_LFO, 30); /* LFO y los destinos de las 4 macros */ + CHECK(!strcmp(mach_title(&app, ti, sizeof ti), "LFO 1/3")); + shot("85-bittal-lfo"); + btn(BTN_LFO, 30); + bm_app_legend(&app, L); + CHECK(!strcmp(mach_title(&app, ti, sizeof ti), "LFO 2/3 MACRO 1-2") && !strcmp(L[0].name, "M1 TO") && !strcmp(L[3].name, "M2 AMT")); + btn(BTN_LFO, 30); + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "M3 TO") && !strcmp(L[3].name, "M4 AMT")); + btn(BTN_ENV, 30); + CHECK(!strcmp(mach_title(&app, ti, sizeof ti), "ENV 1/2 ENV 1")); + btn(BTN_ENV, 30); + CHECK(!strcmp(mach_title(&app, ti, sizeof ti), "ENV 2/2 ENV 2")); + shot("85-bittal-env2"); + btn(BTN_FX, 30); + enc(ENC_K4, 1); + btn(BTN_FX, 30); + enc(ENC_K1, 1); + CHECK(bm_px_fx_on(app.pat.prm[4], ENG_BITTAL, PXF_DIST) && app.pat.prm[4][PX_CHORUS] == 1); + CHECK(solo_peak(4, nt, 1, 100, 300) > 0.01); + shot("85-bittal-fx2"); + enc(ENC_K1, -1); + btn(BTN_FX, 30); enc(ENC_K4, -1); + btn(BTN_EDIT, 30); /* sonando: la onda que suena, con lo que la mueve */ + for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = (uint8_t)(i != 4); + uint32_t sq = bm_wv_btseq; + kdown(bm_white_key(4)); run_ms(300); + CHECK(bm_wv_btseq != sq && bm_wv_btpos[0] >= 0.0f && bm_wv_btpos[0] <= 1.0f); + shot("85-bittal-playing"); + kup(bm_white_key(4)); run_ms(100); + for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = 0; + btn(BTN_HOME, 30); + CHECK(app.view == V_HOME); } -/* PIANO ROLL (GLO de la máquina > VIEW) */ -static double draw_us(long *math); +static void test_bmini(void) +{ + printf("B-MINI: el Minimoog con los menús del POLY D (EDIT, ENV, LFO, FX, SCL, SEQ, ARP, GLO)\n"); + boot(1); + ch(3); + CHECK(app.pat.trk[3].engine == ENG_MINI); + btn(BTN_EDIT, 30); /* EDIT: el panel, FILTER */ + CHECK(app.view == V_MACH && app.bx.page == BXP_MAIN && app.track == 3); + const char *s1, *s2, *s3; + bm_app_bigknobs(&app, &s1, &s2, &s3); + CHECK(!strcmp(s2, "CUTOFF") && !strcmp(s3, "PRESET")); + bm_legend L[4]; + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "CUTOFF") && !strcmp(L[1].name, "EMPHASIS") && !strcmp(L[2].name, "CONTOUR") && !strcmp(L[3].name, "KBD CTRL")); + int cut = app.pat.trk[3].macro[0]; + enc(ENC_K1, 4); + CHECK(app.pat.trk[3].macro[0] == cut + 4 && !app.ov.on); + char ti[24]; + CHECK(!strcmp(mach_title(&app, ti, sizeof ti), "FILTER 1/5")); + run_ms(100); + shot("83-bmini-filter"); + static const char *const EN[5][4] = {{"CUTOFF", "EMPHASIS", "CONTOUR", "KBD CTRL"}, {"RANGE", "WAVE", "LEVEL", "TUNE"}, + {"RANGE", "FREQ", "WAVE", "LEVEL"}, {"RANGE", "FREQ", "WAVE", "LEVEL"}, + {"NOISE", "GLIDE", "MODE", "VOLUME"}}; + for (int pg = 1; pg <= 5; pg++) { /* EDIT otra vez: la siguiente, en círculo */ + btn(BTN_EDIT, 30); + bm_app_legend(&app, L); + int q = pg % 5; + CHECK(app.bx.page == BXP_MAIN && app.bx.sub[BXP_MAIN] == q); + for (int k = 0; k < 4; k++) CHECK(!strcmp(L[k].name, EN[q][k])); + if (q == 3) { /* OSC 3: el rango LO primero */ + int r = app.pat.prm[3][MN_R3]; + for (int i = 0; i < 6; i++) enc(ENC_K1, -1); + bm_app_legend(&app, L); + CHECK(app.pat.prm[3][MN_R3] == MN_R_LO && !strcmp(L[0].val, "LO")); + enc(ENC_K1, 1); + CHECK(app.pat.prm[3][MN_R3] == 0); + app_push(&app, CMD_SET_PRM, 3, MN_R3, (uint8_t)r); run_ms(5); + shot("83-bmini-osc3"); + } + } + enc(ENC_ALGO, -2); /* ALGORITHM: CUTOFF, en cualquier página */ + CHECK(app.pat.trk[3].macro[0] == cut + 2); + /* ENV: FILTER CONTOUR y LOUDNESS CONTOUR */ + btn(BTN_ENV, 30); + CHECK(app.bx.page == BXP_ENV && app.bx.sub[BXP_ENV] == 0); + int fa = app.pat.prm[3][MN_FA]; + enc(ENC_K1, 3); + CHECK(app.pat.prm[3][MN_FA] == fa + 3 && app.ov.on); + run_ms(UI_OVERLAY_MS + 100); + shot("83-bmini-env"); + btn(BTN_ENV, 30); + int ar = app.pat.prm[3][MN_AR]; + enc(ENC_K4, -2); + CHECK(app.bx.sub[BXP_ENV] == 1 && app.pat.prm[3][MN_AR] == ar - 2); + /* LFO: RATE, WAVE, MOD MIX (OSC 3 <-> LFO), AMOUNT; pág 2 DEST */ + btn(BTN_LFO, 30); + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "RATE") && !strcmp(L[1].name, "WAVE") && !strcmp(L[2].name, "MOD MIX") && !strcmp(L[3].name, "AMOUNT")); + CHECK(!strcmp(L[2].val, "LFO") && app.pat.prm[3][MN_MIX] == 0); /* de fábrica: solo el LFO, como antes */ + enc(ENC_K2, 1); + CHECK(app.pat.prm[3][MN_LWAVE] == 1); + for (int i = 0; i < 6; i++) enc(ENC_K3, -30); + bm_app_legend(&app, L); + CHECK(app.pat.prm[3][MN_MIX] == 127 && !strcmp(L[2].val, "OSC 3")); + for (int i = 0; i < 6; i++) enc(ENC_K4, 30); + run_ms(UI_OVERLAY_MS + 100); + shot("83-bmini-lfo"); + static const uint8_t nt[1] = {48}; + CHECK(solo_peak(3, nt, 1, 100, 300) > 0.01); /* el OSC 3 modulando: suena */ + btn(BTN_LFO, 30); + bm_app_legend(&app, L); + CHECK(app.bx.sub[BXP_LFO] == 1 && !strcmp(L[0].name, "DEST")); + enc(ENC_K1, 2); + CHECK(app.pat.prm[3][MN_LDEST] == MN_D_BOTH); + CHECK(solo_peak(3, nt, 1, 100, 300) > 0.01); + enc(ENC_K1, -2); + btn(BTN_LFO, 30); + for (int i = 0; i < 6; i++) { enc(ENC_K4, -30); enc(ENC_K3, 30); } + enc(ENC_K2, -1); + /* FX: DISTORTION; pág 2 CHORUS I / II y REVERB (el DELAY, desde HOME) */ + btn(BTN_FX, 30); + CHECK(app.bx.page == BXP_FX && !bm_px_fx_on(app.pat.prm[3], ENG_MINI, PXF_DIST) && bm_send_on(&app.pat, 3, 1) && bm_send_on(&app.pat, 3, 0)); + CHECK(app.pat.prm[3][PX_DS_G] && app.pat.prm[3][PX_DS_L]); + enc(ENC_K4, 1); + CHECK(bm_px_fx_on(app.pat.prm[3], ENG_MINI, PXF_DIST) && app.pat.prm[3][PX_FX] == 1); + enc(ENC_K1, 30); + CHECK(solo_peak(3, nt, 1, 100, 300) > 0.01); + shot("83-bmini-fx"); + btn(BTN_FX, 30); + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "CHORUS") && !L[1].name[0] && !strcmp(L[2].name, "REVERB") && !strcmp(L[3].name, "REV ON")); + enc(ENC_K1, 2); + CHECK(app.pat.prm[3][PX_CHORUS] == 2 && bm_px_fx_on(app.pat.prm[3], ENG_MINI, PXF_CHORUS)); + CHECK(solo_peak(3, nt, 1, 100, 300) > 0.01); /* con CHORUS II */ + enc(ENC_K4, -1); + CHECK(!bm_send_on(&app.pat, 3, 1) && bm_send_on(&app.pat, 3, 0) && (app.pat.prm[3][PX_FX] & 2)); + shot("83-bmini-fx2"); + enc(ENC_PRESETS, 1); /* otro sonido: los efectos quedan */ + CHECK(bm_px_fx_on(app.pat.prm[3], ENG_MINI, PXF_DIST) && app.pat.prm[3][PX_CHORUS] == 2 && !bm_send_on(&app.pat, 3, 1)); + enc(ENC_K4, 1); enc(ENC_K1, -2); + btn(BTN_FX, 30); enc(ENC_K4, -1); + CHECK(app.pat.prm[3][PX_FX] == 0 && app.pat.prm[3][PX_CHORUS] == 0); + /* SCL: ACCENT de cada paso; SCL otra vez: GLIDE */ + for (int st = 0; st < BM_STEPS; st++) for (int e = 0; e < BM_EVENTS; e++) + if (!bm_event_empty(bm_evc(&app.pat, 3, st, e))) { bm_event z; bm_event_clear(&z); app_push_ev(&app, 3, st, e, &z); run_ms(1); } + { bm_event e; bm_event_clear(&e); e.note = 48; e.len = 1; e.vel = 100; app_push_ev(&app, 3, 0, 0, &e); e.note = 55; app_push_ev(&app, 3, 1, 0, &e); } + run_ms(20); + btn(BTN_SCL, 30); + CHECK(app.bx.page == BXP_SCL && app.bx.sub[BXP_SCL] == 0); + CHECK(!strcmp(mach_title(&app, ti, sizeof ti), "ACCENT 1-16")); + white(0, 40); + CHECK(bm_evc(&app.pat, 3, 0, 0)->vel == BM_VEL_ACC); + bm_app_keys(&app, keys_now); + CHECK(keys_now[bm_white_key(0)].led == LED_ON && keys_now[bm_white_key(1)].led == LED_DIM && keys_now[bm_white_key(2)].led == LED_OFF); + btn(BTN_SCL, 30); + CHECK(!strcmp(mach_title(&app, ti, sizeof ti), "GLIDE 1-16")); + white(0, 40); + CHECK(bm_evc(&app.pat, 3, 0, 0)->len & BM_LEN_TIE); + run_ms(60); + shot("83-bmini-scl"); + btn(BTN_PLAY, 20); /* acento y glide suenan */ + for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = (uint8_t)(i != 3); + peak_abs = 0; run_ms(600); + CHECK(peak_abs > 0.01); + btn(BTN_PLAY, 20); + for (int i = 0; i < BM_TRACKS; i++) app.pat.trk[i].mute = 0; + /* ARP: su LATCH */ + btn(BTN_ARP, 30); btn(BTN_ARP, 30); + enc(ENC_K1, 1); + CHECK(app.pat.prm[3][PX_LATCH] == 1); + enc(ENC_K1, -1); + /* SEQ y SEQ otra vez: el panel */ + btn(BTN_SEQ, 30); + CHECK(app.bx.page == BXP_SEQ); + btn(BTN_SEQ, 30); + CHECK(app.bx.page == BXP_MAIN && app.view == V_MACH); + btn(BTN_HOME, 30); + CHECK(app.view == V_HOME); +} -static void test_pianoroll(void) +static void test_bx7(void) { - printf("PIANO ROLL: GLO > VIEW; el loop entero, alturas ajustadas, teclado que destella, REC en rojo; barato\n"); + printf("BX-7: el FM-1 de fábrica dentro de Bubba (páginas, ALGORITHM, FX, EDIT, ARP, REC tipo SLOOP)\n"); boot(1); - ch(3); /* BX-7: dos compases, acordes en 11 y 27 */ - btn(BTN_GLO, 30); - CHECK(app.page == PG_MORE && app.more_row == 0); - enc(ENC_ALGO, 1); /* VIEW: PIANO ROLL */ - CHECK(bm_app_roll_view(&app, 3) && app.set_dirty); - shot("45c-machine-glo-view"); - enc(ENC_ALGO, 1); /* a la derecha otra vez: sigue */ - CHECK(bm_app_roll_view(&app, 3)); + put_fm_on_t4(); + ch(3); + CHECK(app.track == 3 && app.pat.trk[3].engine == ENG_FM); + /* desde HOME, cada botón de menú lleva a su página; GLO sigue siendo el de la consola */ + btn(BTN_LFO, 30); + CHECK(app.view == V_MACH && app.bx.page == BXP_LFO && app.track == 3); + btn(BTN_HOME, 30); + CHECK(app.view == V_HOME); btn(BTN_GLO, 30); - CHECK(app.page == PG_SEQ); - run_ms(UI_TOAST_MS + 100); - shot("73-pianoroll"); - uint16_t col = bm_track_color(3); - CHECK(count_px(15, 48, 240, 135, col) > 20); /* las notas */ - CHECK(count_px(15, 46, 240, 49, C_WHITE) > 20); /* el corchete de las 16 blancas */ - CHECK(count_px(15, 60, 128, 120, C_DDGREY) > 1000); /* y su fondo */ - CHECK(count_px(0, 48, 15, 135, C_GREY) > 50); /* el teclado vertical */ - black(9, 40); /* B10: el corchete pasa a 17-32 */ - CHECK(app.step_page == 1); - white(10, 40); /* la blanca 11 = el paso 27 (tiene acorde: se quita) */ - CHECK(bm_event_empty(bm_evc(&app.pat, 3, 26, 0))); - white(10, 40); - CHECK(!bm_event_empty(bm_evc(&app.pat, 3, 26, 0))); + CHECK(app.view == V_GLO); + btn(BTN_HOME, 30); + btn(BTN_SEQ, 30); + CHECK(app.view == V_MACH && app.bx.page == BXP_SEQ); + shot("80-bx7-seq"); + btn(BTN_SEQ, 30); /* el mismo botón: MAIN */ + CHECK(app.bx.page == BXP_MAIN); + int alg = app.pat.fmv[BM_FM_ALG]; + enc(ENC_ALGO, 1); + CHECK(app.pat.fmv[BM_FM_ALG] == (alg + 1) % 32 && bm_fm_alg_of(&app.pat) == (alg + 1) % 32 + 1); + CHECK(!app.ov.on); /* con el dibujo a la vista, sin el número grande */ + run_ms(100); + shot("80-bx7-main"); + const char *s1, *s2, *s3; + bm_app_bigknobs(&app, &s1, &s2, &s3); + CHECK(!strcmp(s2, "ALG") && !strcmp(s3, "PRESET")); + /* OCT sostenido + ALGORITHM: transposición; los dos OCT juntos: todo a 0 */ + down(BTN_OCT_UP); run_ms(30); + enc(ENC_ALGO, 2); + up(BTN_OCT_UP); run_ms(30); + CHECK(app.pat.trk[3].transpose == 26 && app.oct == 0); /* sostenido con ALGORITHM: no cambia la octava */ + btn(BTN_OCT_UP, 30); /* un toque solo: la octava */ + CHECK(app.oct == 1); + down(BTN_OCT_DN); run_ms(30); down(BTN_OCT_UP); run_ms(30); up(BTN_OCT_UP); up(BTN_OCT_DN); run_ms(40); + CHECK(app.pat.trk[3].transpose == 24 && app.oct == 0); + /* PRESETS: solo los de fábrica; la voz se carga en el patrón */ + enc(ENC_PRESETS, 1); + CHECK(app.pat.trk[3].source == 1 && !memcmp(app.pat.fmv, bm_fm_patch(1), BM_FM_PATCH)); + /* FX: la casilla 1 es el filtro; K4 lo prende; SCL + SELECT lo mueve en la cadena */ + btn(BTN_FX, 30); + CHECK(app.bx.page == BXP_FX && app.bx.fxpos == 0); + enc(ENC_K4, 1); + CHECK(app.pat.prm[3][BX_FXON] & (1u << BXF_FILTER)); + enc(ENC_K2, -5); + CHECK(app.pat.prm[3][BX_FLT_C] < 90); + btn(BTN_SCL, 30); + CHECK(app.bx.grab); + enc(ENC_SELECT, 1); + CHECK(app.pat.prm[3][BX_ORD0] == BXF_REVERB && app.pat.prm[3][BX_ORD1] == BXF_FILTER && app.bx.fxpos == 1); + btn(BTN_SCL, 30); + CHECK(!app.bx.grab); + enc(ENC_SELECT, 2); /* la casilla 4: la distorsión */ + enc(ENC_K4, 1); + CHECK(app.pat.prm[3][BX_FXON] & (1u << BXF_DIST)); + shot("80-bx7-fx"); + static const uint8_t chord[3] = {57, 60, 64}; + CHECK(solo_peak(3, chord, 3, 100, 300) > 0.02); /* con filtro y distorsión, suena */ + /* la reverb apagada en su FX: el envío del canal no suena (no se procesa dos veces) */ + enc(ENC_SELECT, -3); + CHECK(fx_name_is(BXF_REVERB)); + enc(ENC_K4, -1); + CHECK(!(app.pat.prm[3][BX_FXON] & (1u << BXF_REVERB))); + /* cambiar de preset no borra los efectos */ + enc(ENC_PRESETS, 1); + CHECK(app.pat.prm[3][BX_FXON] & (1u << BXF_DIST)); + /* ENV y LFO */ + btn(BTN_ENV, 30); + CHECK(app.bx.page == BXP_ENV); + enc(ENC_K3, -20); + CHECK(app.pat.trk[3].sustain < 64); + shot("80-bx7-env"); + btn(BTN_LFO, 30); + enc(ENC_K1, 3); + CHECK(app.pat.fmv[142] == 3); + btn(BTN_LFO, 30); /* LFO otra vez: su página 2 */ + CHECK(app.bx.page == BXP_LFO && app.bx.sub[BXP_LFO] == 1); + bm_legend L[4]; + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "DELAY") && !strcmp(L[3].name, "OSC SYNC")); + btn(BTN_LFO, 30); + CHECK(app.bx.page == BXP_LFO && app.bx.sub[BXP_LFO] == 0); + shot("80-bx7-lfo"); + /* EDIT: las negras eligen OP1-6, PIT, GLO, MONO, POLY; las blancas tocan */ + btn(BTN_EDIT, 30); + CHECK(app.bx.page == BXP_EDIT); + bm_app_keys(&app, keys_now); + CHECK(!strcmp(keys_now[bm_black_key(2)].label, "OP3") && !strcmp(keys_now[bm_black_key(9)].label, "POLY")); + black(2, 40); + CHECK(app.bx.edit == 2); + int r1 = app.pat.fmv[3 * BM_FM_OP + FMO_R1]; /* OP3 = el dato 3 */ + enc(ENC_K1, -5); + CHECK(app.pat.fmv[3 * BM_FM_OP + FMO_R1] == r1 - 5); + btn(BTN_EDIT, 30); btn(BTN_EDIT, 30); /* la página FREQ (EDIT pasa de página) */ + bm_app_legend(&app, L); + CHECK(!strcmp(L[0].name, "DETUNE") && !strcmp(L[1].name, "COARSE")); /* el orden del manual del FM-1 */ + shot("80-bx7-edit"); + black(6, 40); + CHECK(app.bx.edit == BXE_PIT); + shot("80-bx7-pitch"); black(8, 40); - /* sonando: el teclado destella con lo que suena */ + CHECK(app.pat.prm[3][BX_MONO] == 1); + kdown(bm_white_key(3)); run_ms(40); + kdown(bm_white_key(5)); run_ms(40); + int v = 0; + for (int i = 0; i < BM_VOICES; i++) v += app.ctx.voice[i].active && app.ctx.voice[i].track == 3 && app.ctx.voice[i].gate; + CHECK(v == 1); /* MONO: una voz */ + kup(bm_white_key(3)); kup(bm_white_key(5)); run_ms(200); + black(9, 40); + CHECK(app.pat.prm[3][BX_MONO] == 0); + /* GLO de la máquina y ARP */ + btn(BTN_GLO, 30); + CHECK(app.view == V_MACH && app.bx.page == BXP_GLO); + shot("80-bx7-glo"); + btn(BTN_ARP, 30); + enc(ENC_K1, 1); + CHECK(app.pat.trk[3].arp_mode == ARP_UP); + shot("80-bx7-arp"); + /* REC parado: se arma; la primera nota arranca y graba con su largo */ + enc(ENC_K1, -1); /* ARP apagado */ + CHECK(app.pat.trk[3].arp_mode == ARP_OFF); + for (int s = 0; s < BM_STEPS; s++) for (int e = 0; e < BM_EVENTS; e++) { bm_event z; bm_event_clear(&z); app_push_ev(&app, 3, s, e, &z); } + run_ms(40); + CHECK(!app.ctx.st.playing); + btn(BTN_REC, 30); + CHECK(app.bx.armed && !app.rec); + key(bm_white_key(7), 400); + CHECK(app.ctx.st.playing && app.rec); + run_ms(500); + btn(BTN_REC, 30); /* toma libre: REC cierra el largo */ + CHECK(!app.rec); + int got = 0, longn = 0; + for (int s = 0; s < BM_STEPS; s++) for (int e = 0; e < BM_EVENTS; e++) { + const bm_event *ev = bm_evc(&app.pat, 3, s, e); + if (!bm_event_empty(ev)) { got++; if ((ev->len & BM_LEN_MASK) >= 2) longn = 1; } + } + CHECK(got >= 1 && longn); + btn(BTN_SEQ, 30); + shot("80-bx7-seq-rec"); btn(BTN_PLAY, 20); - int lit = 0; - for (int i = 0; i < 40 && !lit; i++) { run_ms(25); shot("73a-pianoroll-play"); lit = count_px(0, 48, 15, 135, col) > 0; } - CHECK(lit); - /* REC: lo de esta pasada, en rojo */ + /* REC sostenido 2 s: borra las notas del canal */ + down(BTN_REC); run_ms(2300); up(BTN_REC); run_ms(40); + got = 0; + for (int s = 0; s < BM_STEPS; s++) for (int e = 0; e < BM_EVENTS; e++) got += !bm_event_empty(bm_evc(&app.pat, 3, s, e)); + CHECK(got == 0); + /* el arpegiador graba lo que toca */ + btn(BTN_ARP, 30); + enc(ENC_K1, 1); + btn(BTN_PLAY, 20); run_ms(100); btn(BTN_REC, 30); - hold_key(bm_black_key(0), 200); run_ms(300); - CHECK(app.rec_steps != 0); - shot("73b-pianoroll-rec"); - CHECK(count_px(15, 48, 240, 135, C_RED) > 0); + kdown(bm_white_key(2)); kdown(bm_white_key(6)); run_ms(1500); + kup(bm_white_key(2)); kup(bm_white_key(6)); run_ms(40); btn(BTN_REC, 30); btn(BTN_PLAY, 20); - /* barato: ninguna función cara de libm y el reparto guardado */ - long m = -1; - double us = draw_us(&m); - printf(" PIANO ROLL: %.0f us por cuadro en la PC, %ld exp/log/sin\n", us, m); - CHECK(m == 0); - /* la batería y los pads en SLOOP: una fila por instrumento con golpes */ + got = 0; + int n2 = BM_KEY_BASE_NOTE + bm_white_key(2), n6 = BM_KEY_BASE_NOTE + bm_white_key(6), both = 0; + for (int s = 0; s < BM_STEPS; s++) for (int e = 0; e < BM_EVENTS; e++) { + const bm_event *ev = bm_evc(&app.pat, 3, s, e); + if (bm_event_empty(ev)) continue; + got++; + if (ev->note == n2) both |= 1; + if (ev->note == n6) both |= 2; + } + CHECK(got >= 4 && both == 3); + /* HOME: a la consola */ btn(BTN_HOME, 30); - enc(ENC_SELECT, -3); - btn(BTN_REC, 30); - shot("72b-sloop-drum-roll"); - CHECK(count_px(15, 39, 240, 135, bm_track_color(0)) > 20); - us = draw_us(&m); - CHECK(m == 0); - btn(BTN_REC, 30); - /* VIEW es un ajuste: queda al reiniciar */ - run_ms(UI_AUTOSAVE_MS + 1500); - boot(0); - CHECK(bm_app_roll_view(&app, 3) && !bm_app_roll_view(&app, 2)); + CHECK(app.view == V_HOME && !app.rec); } int main(int argc, char **argv) @@ -3539,16 +3278,25 @@ int main(int argc, char **argv) test_gesture(); test_timing(); test_tr_features(); - test_roll(); + test_roll_audio(); test_voices(); - test_navigation(); test_home(); - test_layers(); - test_free_engines(); - test_pads(); - test_recorder(); - test_loop(); - test_notes(); + test_no_function(); + test_patterns(); + test_solo(); + test_scenes(); + test_play_rec(); + test_free_rec_drums(); + test_drum_seq(); + test_glo(); + test_bx7(); + test_b303(); + test_roll_machines(); + test_bmini(); + test_panels(); + test_slicer(); + test_fixes_1022(); + test_leds(); test_free_rec(); test_rec_expressive(); test_sounds(); @@ -3562,24 +3310,12 @@ int main(int argc, char **argv) test_steal_at_end(); test_engines(); test_machines(); - test_key_screens(); - test_button_lights(); - test_knobs_nav(); - test_console_patterns(); - test_scenes(); - test_sloop(); - test_oct_paging(); - test_asks(); - test_console_glo(); - test_fx_channel(); - test_pianoroll(); test_migrate(); test_fm(); - test_demo_and_persist(); + test_factory_and_persist(); test_old_version(); test_draw_cost(); test_spi_budget(); - test_ui_flow(); test_lang(); printf("\n%d comprobaciones, %d fallos\n", checks, fails); printf("RAM del firmware (estructura bm_app): %u bytes\n", (unsigned)sizeof(bm_app)); diff --git a/tests/test_longrun.c b/tests/test_longrun.c index c2d8715..57dcf90 100644 --- a/tests/test_longrun.c +++ b/tests/test_longrun.c @@ -438,7 +438,7 @@ static void tweak_live(uint32_t sec) case 2: bm_app_button(&app, BTN_SEQ, 1, now_ms); bm_app_button(&app, BTN_SEQ, 0, now_ms + 30); break; case 3: if (sec % 64 == 3 || sec % 64 == 35) { bm_app_button(&app, BTN_REC, 1, now_ms); bm_app_button(&app, BTN_REC, 0, now_ms + 30); } break; default: - live_key = rnd(4) ? bm_white_key((int)rnd(16)) : bm_black_key((int)rnd(11)); + live_key = rnd(4) ? bm_white_key(BM_CH_W0 + (int)rnd(6)) : bm_black_key((int)rnd(11)); /* canales y mutes: los patrones vacíos callarían el final */ bm_app_key(&app, live_key, 1, now_ms); if (rnd(3) == 0) bm_app_encoder(&app, ENC_K1 + (int)rnd(4), (int)rnd(5) - 2, now_ms); break; diff --git a/tests/test_scan.c b/tests/test_scan.c index 1ec493b..5c59200 100644 --- a/tests/test_scan.c +++ b/tests/test_scan.c @@ -36,11 +36,11 @@ int main(void) id = fm1_scan_next_edge(&s, &down); CHECK(id == 20 && down == 1); /* 2 frames: presionada */ matrix[3] = 0; frame(); matrix[3] = 1 << 1; frame(); matrix[3] = 0; /* rebote al soltar */ - for (int i = 0; i < 7; i++) frame(); + for (int i = 0; i < FM1_DEB_RELEASE - 1; i++) frame(); CHECK(fm1_scan_next_edge(&s, &down) == -1); frame(); id = fm1_scan_next_edge(&s, &down); - CHECK(id == 20 && down == 0); /* 8 frames abiertos: suelta */ + CHECK(id == 20 && down == 0); /* FM1_DEB_RELEASE frames abiertos: suelta */ printf("cuadratura: 1 detent = 4 transiciones\n"); static const uint8_t CW[4] = {0, 2, 3, 1}; /* AB: 00 -> 10 -> 11 -> 01 -> 00 */ @@ -63,26 +63,36 @@ int main(void) CHECK(v == -2 * dir); CHECK(fm1_scan_take_encoder(&s, 1) == 0); - printf("cuadratura: perilla con dos detents por ciclo\n"); - for (int i = 1; i <= 2; i++) { /* 00 -> 10 -> 11 y se queda */ + printf("cuadratura: una pausa a medio clic no hace que cuente doble (Felucca #23)\n"); + for (int i = 1; i <= 2; i++) { /* 00 -> 10 -> 11 y una pausa corta ahí */ uint8_t ab = CW[i]; matrix[0] = (ab >> 1) & 1; matrix[1] = ab & 1; frame(); } - for (int i = 0; i < FM1_REST_FRAMES + 2; i++) frame(); - CHECK(fm1_scan_take_encoder(&s, 0) == dir); /* aprendió el detent nuevo y contó el paso */ - for (int i = 3; i <= 4; i++) { /* 11 -> 01 -> 00: otro detent, ya conocido */ + for (int i = 0; i < 60; i++) frame(); + CHECK(fm1_scan_take_encoder(&s, 0) == 0); /* a medio clic: todavía nada */ + for (int i = 3; i <= 4; i++) { /* 11 -> 01 -> 00: termina el clic */ uint8_t ab = CW[i % 4]; matrix[0] = (ab >> 1) & 1; matrix[1] = ab & 1; frame(); } CHECK(fm1_scan_take_encoder(&s, 0) == dir); - for (int i = 3; i >= 2; i--) { /* y de vuelta: 00 -> 01 -> 11 */ - uint8_t ab = CW[i]; - matrix[0] = (ab >> 1) & 1; matrix[1] = ab & 1; - frame(); + for (int det = 0; det < 2; det++) /* y los clics de después cuentan uno cada uno */ + for (int i = 1; i <= 4; i++) { + uint8_t ab = CW[i % 4]; + matrix[0] = (ab >> 1) & 1; matrix[1] = ab & 1; + frame(); + } + CHECK(fm1_scan_take_encoder(&s, 0) == 2 * dir); + + printf("cuadratura: giro rápido (saltos de dos estados) no pierde clics\n"); + for (int det = 0; det < 3; det++) { /* 00 -> 11 -> 00: cada medio ciclo de un salto */ + matrix[0] = 1; matrix[1] = 0; frame(); /* uno normal para saber la dirección */ + matrix[0] = 0; matrix[1] = 1; frame(); /* salto */ + matrix[0] = 0; matrix[1] = 0; frame(); } - CHECK(fm1_scan_take_encoder(&s, 0) == -dir); + v = fm1_scan_take_encoder(&s, 0); + CHECK(v == 3 * dir); printf("\n%d comprobaciones, %d fallos\n", checks, fails); return fails ? 1 : 0; diff --git a/tools/fm1/consola.py b/tools/fm1/consola.py index b60fafd..1b5504e 100644 --- a/tools/fm1/consola.py +++ b/tools/fm1/consola.py @@ -27,7 +27,11 @@ 'voces', # 0.8.1 'rst_raw', 'rst_pmu', 'rail_min', 'rail_now', 'vbat', 'batt_adc', 'pwr0', 'pwr1', 'rastro0', 'rastro1', - 'loop_us', 'loop_max_us', 'c1', 'freno_ui', 'nan_fix'] + 'loop_us', 'loop_max_us', 'c1', 'freno_ui', 'nan_fix', + # 0.9.1 + 'scan_lat_us', + # 0.9.2 + 'scan_kick'] NUCLEO1 = ['sin probar', 'probando', 'listo', 'no contestó al arrancar', 'retired: did not answer in time', 'retired: misread a job', 'retired by an earlier boot (until power-off)'] ETAPA = ['antes de la pantalla', 'pantalla y USB', 'núcleo listo', 'teclas', 'audio iniciado', 'audio sonando', @@ -92,8 +96,10 @@ def mostrar(v): print('audio: %d bloques, %d tarde | cálculo %d us (prom %d, máx %d) de %d us = %.0f %% (máx %.0f %%) | núcleo %d' % ( v['halves'], v['late'], v['render_us'], v['render_avg_us'], v['render_max_us'], v['budget_us'], pct, pmx, v['audio_cpu'])) - print('pantalla/UI: %d us (máx %d) | barrido: %d interrupciones, la más larga %d us' % ( - v['ui_us'], v['ui_max_us'], v['scan_ticks'], v['scanisr_max_us'])) + print('pantalla/UI: %d us (máx %d) | barrido: %d interrupciones, la más larga %d us%s' % ( + v['ui_us'], v['ui_max_us'], v['scan_ticks'], v['scanisr_max_us'], + (', atraso máx %d us' % v['scan_lat_us'] if 'scan_lat_us' in v else '') + + (', rearmado %d veces' % v['scan_kick'] if v.get('scan_kick') else ''))) print('USB: %s | MIDI recibidos %d, enviados %d | arranques fallidos seguidos: %d' % ( 'configurado' if v['usb'] & 1 else ('encendido' if v['usb'] & 2 else 'apagado'), v['midi_in'], v['midi_out'], v['fails'])) diff --git a/tools/fm1/instalar.py b/tools/fm1/instalar.py new file mode 100644 index 0000000..cccf531 --- /dev/null +++ b/tools/fm1/instalar.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-3.0-or-later +# Copyright (C) 2026 Erbubar23 +"""Instala un paquete .fwsc en el FM-1 desde la consola, anotando cada pedido. + + py -3 tools/fm1/instalar.py PAQUETE.fwsc (Bubba Machine -> cargador -> escritura) + py -3 tools/fm1/instalar.py PAQUETE.fwsc --continuar (el FM-1 ya está en modo actualización) + py -3 tools/fm1/instalar.py PAQUETE.fwsc --mirar (cargador: da la orden y no contesta) + +Hace lo mismo que web/fm1_update.js. Paso 1: el firmware que corre (hal/fm1/fm1_update.c) +revisa el paquete y copia el cargador oficial; paso 2: el cargador de M-VAVE pide el paquete +entero y lo escribe. Solo se contestan pedidos dentro del paquete. El registro completo queda +en build/fm1/instalar.log. +""" +import argparse, os, struct, sys, time +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from fm1_midi import Puerto, puertos # noqa: E402 +import fwsc # noqa: E402 + +HANDSHAKE = bytes([0xF0, 0x00, 0x32, 0x45, 0x00, 0x00, 0x00, 0x40, 0x7F, 0xF7]) +UPGRADE = bytes([0xF0, 0x22, 0x24, 0x35, 0x7F, 0xF7]) +ADDR_VERIFIED, ADDR_WRITTEN = 0xE0000000, 0xF0000000 +LOG = os.path.join(os.path.dirname(__file__), '..', '..', 'build', 'fm1', 'instalar.log') + + +def pack7(data): + out, acc, nb = [], 0, 0 + for b in data: + acc |= b << nb; nb += 8 + while nb >= 7: + out.append(acc & 0x7F); acc >>= 7; nb -= 7 + if nb: + out.append(acc & 0x7F) + return out + + +def unpack7(s): + out, acc, nb = [], 0, 0 + for b in s: + acc |= (b & 0x7F) << nb; nb += 7 + while nb >= 8: + out.append(acc & 0xFF); acc >>= 8; nb -= 8 + return out + + +def pedido(m): + """(flags, dirección, largo) de un pedido del FM-1, o None""" + if len(m) < 4 or m[0] != 0xF0 or m[-1] != 0xF7: + return None + u = unpack7(m[1:-1]) + if len(u) != 15 or u[0] != 0 or u[1] != 0x59 or u[2] != 0x30: + return None + if (u[3] | u[4] << 8 | u[5] << 16) != 8 or (~sum(u[6:14]) & 0xFF) != u[14]: + return None + return u[6], struct.unpack_from(' 3 and m[0] == 0xF0 else [] + if len(u) != 34 or u[1] != 0x59 or u[2] != 0x11: + return None + return bytes(u[6:33]).rstrip(b'\0').decode('latin-1') + + +def respuesta(addr, data, fl=0): + n = len(data) + body = [0x00, 0x59, 0x30, (n + 8) & 0xFF, ((n + 8) >> 8) & 0xFF, ((n + 8) >> 16) & 0xFF, fl, + addr & 0xFF, (addr >> 8) & 0xFF, (addr >> 16) & 0xFF, (addr >> 24) & 0xFF, + n & 0xFF, (n >> 8) & 0xFF, (n >> 16) & 0xFF] + list(data) + body.append(~sum(body[6:]) & 0xFF) + return bytes([0xF0] + pack7(body) + [0xF7]) + + +class Registro: + def __init__(self): + os.makedirs(os.path.dirname(LOG), exist_ok=True) + self.f = open(LOG, 'w', encoding='utf-8') + self.t0 = time.time() + + def __call__(self, txt, pantalla=True): + self.f.write('%7.2f %s\n' % (time.time() - self.t0, txt)); self.f.flush() + if pantalla: + print(txt, flush=True) + + +def saludar(p, veces=1): + for _ in range(veces): # el cargador recién aparecido tarda en contestar + p.enviar(HANDSHAKE) + ids = [i for i in (identidad(m) for m in p.recibir(1.5)) if i] + if ids: + return ids + return [] + + +def esperar_puerto(nombre, seg): + t = time.time() + seg + while time.time() < t: + if any(nombre.lower() in n.lower() for n in puertos()[0]): + return True + time.sleep(0.5) + return False + + +def servir(p, img, fin, log, quieto=60, cargador=True): + """contesta pedidos hasta la confirmación `fin`; True si llegó""" + n, last, prev, reinicios = 0, time.time(), -1, 0 + while True: + ms = p.recibir(0.05) + if not ms and time.time() - last > quieto: + log('el FM-1 dejó de pedir hace %d s (%d pedidos, último 0x%X)' % (quieto, n, prev)) + return False + for m in ms: + if identidad(m) is not None: + continue + r = pedido(m) + if not r: + continue + fl, addr, ln = r + last = time.time() + if addr in (ADDR_VERIFIED, ADDR_WRITTEN): + p.enviar(respuesta(addr, b'success\0')) + log('confirmación 0x%08X (%d pedidos)' % (addr, n)) + if addr == fin: + return True + continue + if ln > 512 or addr + ln > len(img): + log('pidió fuera del paquete: 0x%X + %d. Me detengo sin contestar.' % (addr, ln)) + return False + if cargador and prev > 0x8000 and addr < 0x1000: + reinicios += 1 + log('!! el cargador volvió a empezar (después de 0x%X). Vez %d' % (prev, reinicios)) + if reinicios >= 3: + log('se reinicia una y otra vez: el cargador está retomando una escritura cortada que ' + 'empezó con OTRO paquete. Termínala con ese paquete (si no sabes cuál, la versión ' + 'anterior que tenías) usando --continuar, y después instala este de nuevo.') + return False + p.enviar(respuesta(addr, img[addr:addr + ln], fl)) + n += 1 + log('%5d 0x%06X +%d fl %d' % (n, addr, ln, fl), n <= 12 or n % 200 == 0 or addr < 0x1000) + prev = addr + + +def main(): + ap = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + ap.add_argument('paquete') + ap.add_argument('--continuar', action='store_true', help='el FM-1 ya está en modo actualización') + ap.add_argument('--mirar', action='store_true', help='con el cargador: da la orden y no contesta') + ap.add_argument('--puerto', default='Bubba') + ap.add_argument('--cargador', default='USB-Midi') + a = ap.parse_args() + raw = open(a.paquete, 'rb').read() + img = bytes(fwsc.logica(raw)) + fwsc.Flash(fwsc.Paquete(raw).flash()) # que se entienda antes de mandarlo + log = Registro() + log('paquete %s: %s, imagen %d bytes' % (os.path.basename(a.paquete), fwsc.identidad(raw), len(img))) + + if not (a.continuar or a.mirar): + with Puerto(a.puerto) as p: + log('paso 1 con %s: %s' % (p.nombre, saludar(p) or 'no contesta')) + p.enviar(UPGRADE) + time.sleep(2) + if not servir(p, img, ADDR_VERIFIED, log, quieto=15, cargador=False): + sys.exit('paso 1 sin terminar: no se escribió nada (mira la pantalla del FM-1)') + log('esperando al cargador...') + time.sleep(3) + if not esperar_puerto(a.cargador, 30): + sys.exit('el cargador no apareció: desconecta y conecta el USB y usa --continuar') + + with Puerto(a.cargador) as p: + ids = saludar(p, 5) + log('paso 2 con %s: %s' % (p.nombre, ids or 'no contesta')) + if not any(i.startswith('ota-') for i in ids): + sys.exit('el FM-1 no está en modo actualización') + p.enviar(UPGRADE) + if a.mirar: + t0 = time.time() + while time.time() - t0 < 10: + for m in p.recibir(0.2): + r = pedido(m) + if r: + log('%6.2f pide 0x%06X +%d' % (time.time() - t0, r[1], r[2])) + return + time.sleep(2) + if not servir(p, img, ADDR_WRITTEN, log): + sys.exit('paso 2 sin terminar (registro en build/fm1/instalar.log)') + log('LISTO: el FM-1 se reinicia con el firmware nuevo.') + if esperar_puerto(a.puerto, 40): + with Puerto(a.puerto) as p: + log('volvió: %s' % (saludar(p) or 'no contesta')) + else: + log('no volvió a aparecer "%s" en 40 s' % a.puerto) + + +if __name__ == '__main__': + main() diff --git a/tools/gen_fm.py b/tools/gen_fm.py index 8c3f4b0..6f44245 100644 --- a/tools/gen_fm.py +++ b/tools/gen_fm.py @@ -220,11 +220,101 @@ def voice(name, alg, ops, fb=0, lfo=(35, 0, 0, 0, 1, 0, 0), pr=(99, 99, 99, 99), op(2, 70, (99, 65, 70, 70), (99, 60, 40, 0), kvs=4), op(1, 74, (99, 65, 70, 70), (99, 60, 40, 0), kvs=4), op(1, 74, (99, 65, 70, 70), (99, 60, 40, 0), kvs=4)], fb=7), + # ---- inspirados en canciones hechas con la DX7 (2026-10-21; investigación con fuentes en + # docs/INVESTIGACION_SONIDO.md al publicar). Voces propias con nuestras recetas: no son los presets + # de Yamaha. Los nombres aluden sin nombrar artista ni título. + # bajo redondo y percusivo, sin cola (el bajo de un éxito de 1983 hecho con un preset de fábrica; SOS) + voice('QUERY BS', 5, [ + op(0.5, 99, (99, 50, 35, 75), (99, 70, 0, 0), kvs=2, rs=2), + op(0.5, 82, (99, 72, 45, 75), (99, 30, 0, 0), kvs=5, rs=2), + op(0.5, 88, (99, 52, 35, 75), (99, 70, 0, 0), kvs=2, rs=2, dt=9), + op(1, 60, (99, 80, 45, 75), (99, 0, 0, 0), kvs=5), + OFF, OFF], fb=2), + # metales brillantes con un golpe de brillo al atacar y sustain pleno (el mismo tema) + voice('QUERYBRS', 13, [ + op(1, 99, (80, 70, 99, 70), (99, 92, 96, 0), kvs=2, rs=2, dt=6), + op(1, 88, (75, 45, 30, 70), (99, 80, 82, 0), kvs=4, dt=4), + op(1, 97, (80, 70, 99, 70), (99, 92, 96, 0), kvs=2, dt=10), + op(1, 88, (75, 45, 30, 70), (99, 80, 82, 0), kvs=4, dt=12), + op(1, 74, (75, 45, 30, 70), (99, 78, 80, 0), kvs=4, dt=9), + op(1, 86, (75, 45, 30, 70), (99, 80, 82, 0), kvs=4)], fb=4), + # bajo slap: chasquido brillante que cae rápido a un cuerpo redondo, muy sensible a la fuerza + # (el bajo que dobla un riff famoso de 1985; Wikipedia / Reverb Machine) + voice('SKETCHBS', 5, [ + op(0.5, 99, (99, 45, 30, 72), (99, 75, 0, 0), kvs=3, rs=2), + op(0.5, 90, (99, 78, 45, 72), (99, 30, 0, 0), kvs=7, rs=2), + op(0.5, 92, (99, 48, 30, 72), (99, 75, 0, 0), kvs=3, rs=2, dt=10), + op(3, 74, (99, 90, 50, 72), (99, 0, 0, 0), kvs=7), + OFF, OFF], fb=3), + # bajo slap en corcheas: ataque duro, caída media-corta, poco sustain (película de aviones, 1986) + voice('TOMCATBS', 5, [ + op(0.5, 99, (99, 58, 40, 78), (99, 60, 0, 0), kvs=3, rs=3), + op(0.5, 92, (99, 82, 50, 78), (99, 25, 0, 0), kvs=7, rs=3), + op(1, 86, (99, 60, 40, 78), (99, 55, 0, 0), kvs=3, rs=3, dt=9), + op(3, 70, (99, 92, 55, 78), (99, 0, 0, 0), kvs=6), + OFF, OFF], fb=4), + # bajo grave tipo fretless con un "mwah" suave, ataque blando, sustain largo y oscuro (balada de 1986) + voice('BRTHLESS', 5, [ + op(0.5, 99, (80, 40, 25, 55), (99, 92, 88, 0), kvs=2, rs=2), + op(0.5, 72, (55, 35, 25, 55), (85, 70, 55, 0), kvs=4, rs=2), + op(0.5, 88, (80, 42, 25, 55), (99, 90, 85, 0), kvs=2, rs=2, dt=9), + op(1, 52, (50, 35, 25, 55), (80, 60, 45, 0), kvs=3), + OFF, OFF], fb=1, + lfo=(30, 60, 3, 0, 0, 4, 2)), + # bajo funky de pulsación seca, con clic de ataque, muy dinámico (1984) + voice('CRISP BS', 5, [ + op(0.5, 99, (99, 62, 45, 80), (99, 55, 0, 0), kvs=3, rs=3), + op(0.5, 86, (99, 85, 55, 80), (99, 20, 0, 0), kvs=7, rs=3), + op(1, 84, (99, 64, 45, 80), (99, 50, 0, 0), kvs=3, rs=3, dt=8), + op(7, 66, (99, 95, 60, 80), (99, 0, 0, 0), kvs=6), + OFF, OFF], fb=3), + # lengüeta suave con aire, ataque blando y vibrato: la "armónica" retocada a flauta (1984; SOS) + voice('EMOTNHRP', 5, [ + op(1, 99, (62, 45, 99, 62), (99, 95, 95, 0), kvs=2), + op(2, 62, (55, 45, 99, 62), (95, 80, 80, 0), kvs=3), + op(1, 82, (62, 45, 99, 62), (99, 95, 95, 0), kvs=2, dt=9), + op(1, 48, (55, 45, 99, 62), (90, 75, 75, 0), kvs=3), + op(4, 40, (70, 60, 99, 62), (99, 30, 30, 0), kvs=2), + op(7, 52, (70, 60, 99, 62), (99, 35, 35, 0), kvs=2)], fb=6, + lfo=(32, 45, 7, 0, 0, 4, 3)), + # marimba con clic de baqueta, caída leñosa de menos de un segundo (el tema de una película de 1984) + voice('BANANAMR', 5, [ + op(1, 99, (99, 62, 40, 62), (99, 0, 0, 0), kvs=4, rs=4), + op(3.5, 80, (99, 90, 45, 62), (99, 0, 0, 0), kvs=6, rs=4), + op(1, 88, (99, 64, 40, 62), (99, 0, 0, 0), kvs=4, rs=4, dt=9), + op(10, 60, (99, 96, 50, 62), (99, 0, 0, 0), kvs=6, rs=4), + OFF, OFF], fb=0), + # piano eléctrico: suave = mate y cálido, fuerte = campana; caída de varios segundos (una serie de 1990) + voice('OWLS EP', 5, [ + op(1, 99, (96, 22, 22, 60), (99, 75, 0, 0), kvs=2, rs=3), + op(14, 56, (96, 52, 35, 75), (99, 70, 0, 0), kvs=7, rs=3, bp=41, rd=55, rc=0), + op(1, 99, (95, 18, 18, 48), (99, 95, 0, 0), kvs=2, rs=3, dt=0), + op(1, 74, (95, 45, 25, 50), (99, 78, 0, 0), kvs=7, rs=3), + op(1, 99, (95, 18, 18, 48), (99, 95, 0, 0), kvs=2, rs=3, dt=14), + op(1, 84, (95, 45, 25, 50), (99, 78, 0, 0), kvs=7, rs=3)], fb=5), + # piano eléctrico de balada, velocidad media, coros amplios (baladas de 1985) + voice('DIVA EP', 5, [ + op(1, 99, (96, 25, 25, 62), (99, 78, 0, 0), kvs=2, rs=3), + op(14, 50, (95, 50, 35, 78), (99, 72, 0, 0), kvs=6, rs=3, bp=41, rd=50, rc=0), + op(1, 99, (95, 20, 20, 50), (99, 95, 0, 0), kvs=2, rs=3, dt=2), + op(1, 78, (95, 45, 25, 50), (99, 80, 0, 0), kvs=6, rs=3), + op(1, 99, (95, 20, 20, 50), (99, 95, 0, 0), kvs=2, rs=3, dt=12), + op(1, 86, (95, 45, 25, 50), (99, 80, 0, 0), kvs=6, rs=3)], fb=6, + lfo=(28, 0, 2, 0, 0, 4, 2)), + # piano eléctrico brillante y acuoso, caída larga (la música de un nivel bajo el agua, 1996) + voice('LAGOONEP', 5, [ + op(1, 99, (96, 20, 18, 55), (99, 82, 0, 0), kvs=2, rs=2), + op(14, 66, (95, 45, 30, 70), (99, 78, 0, 0), kvs=5, rs=2, bp=41, rd=40, rc=0), + op(1, 99, (95, 16, 16, 45), (99, 95, 0, 0), kvs=2, rs=2, dt=1), + op(1, 88, (95, 38, 22, 45), (99, 85, 0, 0), kvs=5, rs=2), + op(1, 99, (95, 16, 16, 45), (99, 95, 0, 0), kvs=2, rs=2, dt=13), + op(1, 94, (95, 38, 22, 45), (99, 85, 0, 0), kvs=5, rs=2)], fb=6, + lfo=(34, 30, 4, 0, 0, 4, 2)), ] def main(): - assert len(V) == 20, len(V) + assert len(V) == 31, len(V) rows, names = [], [] for name, d in V: rows.append(' {%s}, /* %s */' % (','.join(str(x) for x in d), name)) diff --git a/tools/gen_site.py b/tools/gen_site.py index a8639b7..6119d1f 100644 --- a/tools/gen_site.py +++ b/tools/gen_site.py @@ -65,7 +65,7 @@ 'foot': 'Bubba Machine %s · GPL-3.0-or-later · M-VAVE and FM-1 are trademarks of their respective owners; this project is not affiliated with M-VAVE.', }, } -IMAGES = ['00-home', '02-seq-tr', '37-pads', '52-seq-long-note', '56b-fm-alg5', '57-bittal-table', '60-buno-dco', '51-rec-gate-micro'] +IMAGES = ['00-home', '02-seq-tr', '81-b303-panel', '83-bmini-filter', '80-bx7-main', '85-bittal-osc1', '84-buno-dco', '90-slicer-trim'] BY_SRC = {os.path.normpath(p[2]): (lang, p[0]) for _, _, d in PAGES for lang, p in d.items()} diff --git a/web/bm.js b/web/bm.js index 8fffd61..3a257a3 100644 --- a/web/bm.js +++ b/web/bm.js @@ -6,7 +6,7 @@ var BubbaMachine = (() => { function(moduleArg = {}) { var moduleRtn; -var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var scriptDirectory="";var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var wasmBinary=Module["wasmBinary"];function intArrayFromBase64(s){var decoded=atob(s);var bytes=new Uint8Array(decoded.length);for(var i=0;ifilename.startsWith(dataURIPrefix);function findWasmBinary(){var f="data:application/octet-stream;base64,AGFzbQEAAAAB+QEnYAJ/fwBgA39/fwBgAX8Bf2ADf39/AX9gAX8AYAJ/fwF/YAZ/f39/f38AYAABf2AEf39/fwBgBX9/f39/AGAAAGABfQF9YAR/f39/AX9gBX9/f39/AX9gBn9/f39/fwF/YAF/AX1gAXwBfGAIf39/f39/f38AYAJ8fAF8YAN8fH8BfGABfAF9YAF/AXxgAn19AX1gAX4Bf2ACfH8BfGAHf39/f39/fwF/YAh/f319fX19fwBgA39/fwF9YAJ8fwF/YAJ9fwF/YAJ/fAF8YAF8AX9gAAF8YAF8AGACf30BfWABfQF/YAABfWACfn8Bf2AGf3x/f39/AX8CHQEDZW52FV9lbXNjcmlwdGVuX21lbWNweV9qcwABA/MC8QIKBQIFAgkGCAgECAAAEQYDAwMCCAUBCQUGAAAHAwMCAQAADAUAAQQEAAAEBQQACgYADA4EAQYAAQMIBgEDBAEAAQMGAQYAAwQBBgADBQgBBgADAgAFCgMGCQkGBgkFDg4GAgkGAgAAAAABAQkGAAkBCAgAAAQEBAQBAAQGBAoAAQAACAABAAIAAAAAAAQGAAABAQIBAQIEBwICDw8CAAUFBQMAAQgEAgMABAAFAwEEBAICDAUDAgwOCQEBAgkFAAQEBQQKCgQKCggKDQgFBQEFAgUHAgUFAw0FAAgNAAIZDQAJAQAACAkIEQkBCQgIAwICAgICAgAAAAECAgwEBQABBgMCAwcHCgcEAQEBBAQCAgcHBwcHBwcFBQcCBwcCAgcHBgIEABoBBAECBgkDGwACBAICEg0cExQUHQsDAQMeEBUVEB8gIRAiCw8PCyMLFgskCwsLBRIXFxYCAhgQCwsIAhMCGA0BAgElCSYAAwUEAgcEBQFwATIyBQYBAYAEgAQGCQF/AUGwuu4ACwejBSMGbWVtb3J5AgARX193YXNtX2NhbGxfY3RvcnMAARlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQAMYm1fd2ViX2ZsYXNoAIUCEWJtX3dlYl9mbGFzaF9zaXplAIYCEmJtX3dlYl9mbGFzaF9ibGFuawCHAhNibV93ZWJfZmxhc2hfd3JpdGVzAIgCC2JtX3dlYl9pbml0AIkCDWJtX3dlYl9idXR0b24AigIKYm1fd2ViX2tleQCLAg5ibV93ZWJfZW5jb2RlcgCMAg1ibV93ZWJfbWFzdGVyAI0CC2JtX3dlYl9taWRpAI4CC2JtX3dlYl90aWNrAI8CDWJtX3dlYl9yZW5kZXIAkAIJYm1fd2ViX2ZiAJECC2JtX3dlYl9sZWRzAJICDmJtX3dlYl9zYW1wbGVyAJMCEmJtX3dlYl9zYW1wbGVyX2NhcACUAgpibV93ZWJfYnBtAJUCEWJtX3dlYl90YWtlc19mcmVlAJYCEmJtX3dlYl90YWtlc190b3RhbACXAhJibV93ZWJfc2FtcGxlcl9zZXQAmAIPYm1fd2ViX21pZGlfb3V0AJkCD2JtX3dlYl9sYW5nX2J1ZgCaAhBibV93ZWJfbGFuZ19sb2FkAJsCDmJtX3dlYl9sYW5nX29uAJwCEGJtX3dlYl9zb3VuZF9idWYAnQIRYm1fd2ViX3NvdW5kX2xvYWQAngISYm1fd2ViX3NvdW5kX2NvdW50AJ8CC2JtX3dlYl92aWV3AKACDmJtX3dlYl9wbGF5aW5nAKECGV9lbXNjcmlwdGVuX3N0YWNrX3Jlc3RvcmUA7wIXX2Vtc2NyaXB0ZW5fc3RhY2tfYWxsb2MA8AIcZW1zY3JpcHRlbl9zdGFja19nZXRfY3VycmVudADxAglGAQBBAQsxIiOFAeEBNDU3ODk2NDw3PTs+P0BBQkM0REZHRUhJS0xKNE9RUlD+Af8BgAKBAoICgwKEAqMCpAKiAusC7ALtAgrQoBTxAhkAQbC26gBBuLXqADYCAEHoteoAQSo2AgALHgAgACABQQZvQTBsai0Ab0EHcEECdEGwgAFqKAIACxIAIABBBm9BAXRBgNoAai8BAAv1CQEJfyAAIAFBMGxqIgAtAGAhAgJAAkAgAUEASgRAIABB2ABqIQNBDCEBAkAgAC0AbyIAQQJrDgMDAAIAC0EBIAAQ0QEiASABQQFNGyEBDAILIAJBA3BB1AFsQfD5AGooAgAPCxDTASEBCyACIAFvIQECQAJAAkAgAy0AFyIAQQJrDgMAAgECCyABQQxsQaDmAGooAgAPCwJ/QQAhAEEAIQMCQEHg5QYoAgAiAkEATA0AIAJBA3EhBiACQQRPBEAgAkH8////B3EhBwNAIAMgAEEDdEGA4gZqIgIoAgAtAARBBEZqIAIoAggtAARBBEZqIAIoAhAtAARBBEZqIAIoAhgtAARBBEZqIQMgAEEEaiEAIAVBBGoiBSAHRw0ACwsgBkUNAANAIAMgAEEDdEGA4gZqKAIALQAEQQRGaiEDIABBAWohACAEQQFqIgQgBkcNAAsLAkBBsNQLKAIAIgBBAEwNACAAQQNxIQZBACEEAkAgAEEESQRAQQAhAAwBCyAAQfz///8HcSEHQQAhAEEAIQUDQCADIABBA3QiAkHA1AtqKAIALQAEQQRGaiACQcjUC2ooAgAtAARBBEZqIAJB0NQLaigCAC0ABEEERmogAkHY1AtqKAIALQAEQQRGaiEDIABBBGohACAFQQRqIgUgB0cNAAsLIAZFDQADQCADIABBA3RBwNQLaigCAC0ABEEERmohAyAAQQFqIQAgBEEBaiIEIAZHDQALCyADQQV0QRRyIgMgASADb2ogA28iA0ETTARAIANBCWxB0KABagwBC0Gg1QsgAxDUASIDLQCRASIAQSBrIgJBICAAIAJB/wFxQd8ATxsgAEHhAGtB/wFxQRpJGyIIOgAAQaHVCyADLQCSASIAQSBrIgJBICAAIAJB/wFxQd8ATxsgAEHhAGtB/wFxQRpJGyIJOgAAQaLVCyADLQCTASIAQSBrIgJBICAAIAJB/wFxQd8ATxsgAEHhAGtB/wFxQRpJGyIKOgAAQaPVCyADLQCUASIAQSBrIgJBICAAIAJB/wFxQd8ATxsgAEHhAGtB/wFxQRpJGyIBOgAAQaTVCyADLQCVASIAQSBrIgJBICAAIAJB/wFxQd8ATxsgAEHhAGtB/wFxQRpJGyIHOgAAQaXVCyADLQCWASIAQSBrIgJBICAAIAJB/wFxQd8ATxsgAEHhAGtB/wFxQRpJGyIGOgAAQabVCyADLQCXASIAQSBrIgJBICAAIAJB/wFxQd8ATxsgAEHhAGtB/wFxQRpJGyIFOgAAQafVCyADLQCYASIAQSBrIgJBICAAIAJB/wFxQd8ATxsgAEHhAGtB/wFxQRpJGyIEOgAAQajVCyADLQCZASIAQSBrIgJBICAAIAJB/wFxQd8ATxsgAEHhAGtB/wFxQRpJGyICOgAAQanVCyADLQCaASIDQSBrIgBBICADIABB/wFxQd8ATxsgA0HhAGtB/wFxQRpJGyIDOgAAAn9BCiADQf8BcUEgRw0AGkEJIAJB/wFxQSBHDQAaQQggBEH/AXFBIEcNABpBByAFQf8BcUEgRw0AGkEGIAZB/wFxQSBHDQAaQQUgB0H/AXFBIEcNABpBBCABQf8BcUEgRw0AGkEDIApB/wFxQSBHDQAaQQIgCUH/AXFBIEcNABogCEH/AXFBIEcLQaDVC2pBADoAAEGg1QsLDwsgACABENUBCxIAIABBA3FBAXRBjNoAai8BAAtJAQF/IwBBEGsiBSQAIAVBADYCDCAFQgA3AgQgBSAEOgADIAUgAzoAAiAFIAI6AAEgBSABOgAAIABBjPoAaiAFEC4gBUEQaiQAC0kBAX8jAEEQayIGJAAgBiAFNgIEIAYgBDoAAyAGIAM6AAIgBiACOgABIAYgAToAACAGQgA3AgggAEGM+gBqIAYQLiAGQRBqJAALQgEBfyMAQRBrIgQkACAEQgA3AwggBEIANwMAIAQgAzYCBCAEIAI6AAEgBCABOgAAIABBjPoAaiAEEC4gBEEQaiQAC1kBAn8jAEEQayIEJAAgBEEMaiIFQQA2AgAgBCACOgADIAQgAToAAiAEIAA6AAEgBEEDOgAAIAUgAy8ACDsBACAEIAMpAAA3AgRBzOfXACAEEC4gBEEQaiQACxkAIABBAToAiJ0IIAAgACgCyPcINgKMnQgLYAEBfyMAQRBrIgQkACAEQQA2AgwgBEIANwIEIAQgAzoAAyAEIAI6AAIgBCABOgABIARBCDoAACAAQYz6AGogBBAuIABBAToAiJ0IIAAgACgCyPcINgKMnQggBEEQaiQAC1oBAX8jAEEQayICJAAgAkEANgIMIAJCADcCBCACIAE6AAMgAiAAOgACIAJBCTsBAEHM59cAIAIQLkHIit8AQQE6AABBzIrfAEGI5d8AKAIANgIAIAJBEGokAAs+AQF/IwBBEGsiAiQAIAIgATYCACAAQZj3CGpBHkHVCiACEOACIAAgACgCyPcIQdwLajYCuPcIIAJBEGokAAvcAQEBfyMAQTBrIggkACAAIAc7Aer2CCAAIAE6AOX2CCAAQQE6AOT2CCAAQQA6AOj2CCAAIAAtAK37CDoA6fYIIABBf0H+ASAGIAZB/gFPGyAGQQBIGzoA5/YIIABB/wEgBSAFQf8BTxtBACAFQQBOGzoA5vYIIAggAjYCICAAQez2CGpBFkHVCiAIQSBqEOACIAggAzYCECAAQYL3CGpBDEHVCiAIQRBqEOACIAggBDYCACAAQY73CGpBBkHVCiAIEOACIAAgACgCyPcIQdwLajYClPcIIAhBMGokAAvRAQEBfyMAQSBrIgYkACAAIAM6AJj2CCAAIAI6AJf2CCAAIAE6AJb2CCAAIAAsAJv2CCIDOgCZ9gggACAAKALI9wg2AqD2CCAAAn9BASADQf8BcSIBQf4BRg0AGiADQQBIBEAgACADQf8AcUEbcGotALDxCAwBCyAAQdzqCGogARBVCzoAmvYIIAYgBDYCECAAQaT2CGpBHkHVCiAGQRBqEOACIAYgBUGo2QAgBRs2AgAgAEHC9ghqQR5B1QogBhDgAiAAQQA6AOT2CCAGQSBqJAALQQAgAgJ/IAAgAUEGb0EwbGoiAi0AcyIBQQhNBEAgAkHyAGoMAQsgAC0AIUEJcCEBIABBIGoLLQAAQQxwNgIAIAEL6wEBA38jAEEQayIEJAACfyABQQBMBEAgACABQTBsai0AYEEDcCIDQQNqIAMgA0EASBtB1AFsIAJBD3EiAkENbGoiBUH0+QBqIQMCQCAAIAFBhAtsakH4AmogAkEDdGotAAQiAkELSw0AIAIgBUH6+QBqLQAARg0AIAJBAnRBgIAHaigCACEDCyADDAELQYCJCEGAiQgoAgBBAXMiADYCACAEIAJBD3EgAiABQQFGIgEbQQFqNgIAIABBA3RB8IgIakEIQdsMQdEOIAEbIAQQ4AJBgIkIKAIAQQN0QfCICGoLIQEgBEEQaiQAIAELLQAgAC0AnIoBRQRAQX8PCyAAIAFBAXRqQaiKAWovAQAgAEEYaiABIAIQqAFwCxMAQQMgAC0A2/AIIgAgAEECSRsLoQEBA38jAEEgayIEJAACQCABQf8BRgRAIAIgA0GgPEEAEOACDAELIAHAQQBIBEAgBEGvzgA2AhAgAiADQdUKIARBEGoQ4AIMAQsgAUEBakH/AXEhBUHzCBCaASEGIAQCfyABQQdNBEBBqNkAIAAgAUHUAGxqLQConQgNARoLQcgPEJkBCzYCBCAEIAU2AgAgAiADIAYgBBDgAgsgBEEgaiQAC9oBAQF/IAAtAKidCAR/IAFBADoAAEEBBUEACyECIAAtAPydCARAIAEgAmpBAToAACACQQFqIQILIAAtANCeCARAIAEgAmpBAjoAACACQQFqIQILIAAtAKSfCARAIAEgAmpBAzoAACACQQFqIQILIAAtAPifCARAIAEgAmpBBDoAACACQQFqIQILIAAtAMygCARAIAEgAmpBBToAACACQQFqIQILIAAtAKChCARAIAEgAmpBBjoAACACQQFqIQILIAAtAPShCAR/IAEgAmpBBzoAACACQQFqBSACCwvUBAEJfyMAQdADayIIJAACQAJAAkACfyAAQQhGBEBBjK7YACgCACEDQYiu2AAoAgAhBUGh+NcALQAARQ0CQZ/41wAtAAANAiADQQBHDAELIABBB0sNASAAQdQAbEHA7dYAaiIALQConQhFDQEgAEGonQhqIgAoAgwhAyAAKAJQIQVBAQtFDQAgAw0BC0GYm98AKAIABEBB2JXfAEEAQbgFEL4CGgtBmJvfAEIANwMAQaCb3wBCADcDAAwBCwJAQZib3wAoAgAgBUYEQCADQZyb3wAoAgBGDQELQQEhCkEBIQACQCAFRQ0AIANBAUcEQCADQX5xIQsDQCAAIAQgBWoiBiwAACIHIAdBH3UiB3MgB2siByAAIAdLGyIAIAYsAAEiBiAGQR91IgZzIAZrIgYgACAGSxshACAEQQJqIQQgCUECaiIJIAtHDQALCyADQQFxRQ0AIAAgBCAFaiwAACIEIARBH3UiBHMgBGsiBCAAIARLGyEAC0Gom98AIAA2AgAgCCAFQQAgAyAAEBdBqJnfACAIQegBELwCGkGcm98AIAM2AgBBmJvfACAFNgIACyADQegBIAMgA0HoAU8bIAMgAkEDcXYiACAAQegBSRsiBGsgASADIAEgA0kbIgAgBEEDbmsiCUEAIAAgCU8bIgAgACAEaiADSxshAAJAIAoNACAAQaCb3wAoAgBHDQBBpJvfACgCACAAIARqRg0BC0Ggm98AIAA2AgBBpJvfACAAIARqIgQ2AgBB2JXfACAFIAAgBEGom98AKAIAEBcLIAhB0ANqJAAL9QICCH8DfiAAQQBB0AMQvgIhCgJAIAFFDQAgAiADTw0AIARFDQAgCkHoAWohCyADIAJrrSEOA0AgAiANIA5+QugBgKdqIgggA08NASACIA1CAXwiDyAOfkLoAYCnaiIAIAhBAWogACAISxsiACADIAAgA0kbIQlBACEHIAghBUEAIQYDQCAGIAEgBWosAAAiACAAQR91IgBzIABrIgAgACAGSRshBiAAIABsIAdqIQcgBUEBaiIFIAlJDQALIAZB/wFsIQwgByAJIAhrbiEGQYCAgIAEIQUDQCAFIgBBAnYhBSAAIAZLDQALQQAhBSAABEADQCAFQQF2QQAgACAGIAAgBWoiB0kiCRtqIQUgBkEAIAcgCRtrIQYgAEEDSyEHIABBAnYhACAHDQALIAVB/wFsIQULIAogDaciAGpB/wEgDCAEbiIGIAZB/wFPGzoAACAAIAtqQf8BIAUgBG4iACAAQf8BTxs6AAAgDyINQugBUg0ACwsL8AMBCH8jAEFAaiIFJAACQCAAQQdLDQAgAEHUAGxBwO3WAGoiAi0AqJ0IRQ0AIAJBqJ0IaiEGAkAgAUUEQCAGKAJQIAYoAgxBgL6SASAGLwEEIgIEfyACBUHY7dYALwEAC0H//wNxbkGsm98ALQAAIAUQ4AEhAwwBC0EQIAEgAUEQThshAyABQQBMDQAgA0EBcSEIIAYoAgwhBEEAIQIgAUEBRwRAIANBHnEhCUEAIQEDQCAFIAJBAnRqIAIgBGwgA242AgAgBSACQQFyIgdBAnRqIAQgB2wgA242AgAgAkECaiECIAFBAmoiASAJRw0ACwsgCEUNACAFIAJBAnRqIAIgBGwgA242AgALQZiw3wBBvPvWAEGECxC8AhpBmNjfAEGB/gM7AQBBACEHA0AgB0EGdEHA/NYAaiEBQQAhBAJAAkADQCABIARqIgItAABBAXFFBEAgAi0AAUEBcQRAQQAhAgwECyACLQACQQFxBEBBACECDAQLIAItAANBAXEEQEEAIQIMBAsgBEEEaiIEQcAARw0BDAILC0EAIQIMAQtBASECIAdBAWoiB0EQRw0BCwtB2O3WACAGIAAgBSADIAIQGUHIit8AQQE6AABBrd7fAEEAOgAAQcyK3wBBiOXfACgCADYCAAsgBUFAayQAIAMLrwMCCH8BfiABQQxqIQogAEHoGGohCSAAQeQNaiELA0AgCSAHQQxsaiIGELABIAdBAWohCCAEIAdKBEAgAyAIQQJ0aiAKIAQgCEsbKAIAIQwgBiACOgAAIAYgAyAHQQJ0aigCACINOwEGIAZBAjoAAyAGIAwgDWs7AQggCyAHQQN0aiIHQeQAOgABIAdBAToABwsgCCIHQRBHDQALAkAgBUUNACAAQQRBASABLQAGIgcgB0EBTRsiByAHQQRPG0EEdCIGOgDcDiAAIAY6ANQOIAAgBjoAzA4gACAGOgDEDiAAIAY6ALwOIAAgBjoAtA4gACAGOgCsDiAAIAY6AKQOIAAgBjoAnA4gACAGOgCUDiAAIAY6AIwOIAAgBjoAhA4gACAGOgD8DSAAIAY6APQNIAAgBjoA7A0gACAGOgDkDSAEQQBMDQAgAEHoDmohCSAGrUL/AYMhDkEAIQcDQAJAIAYgCigCACIIQQF2rSADIAdBAnRqNQIAIA5+fCAIrYCnIghMDQAgCSAHQQZ0aiAIaiIILQAAQQFxDQAgCEEBOgAACyAHQQFqIgcgBEcNAAsLC00BAX8gAEHYwghqIAAgAUGEC2xqQfgCaiABQYAUbCAAakHADWsgAUECSCICG0GEC0GAFCACGxC8AhogAEH/AToA2eoIIAAgAToA2OoIC20BAX8CQCABQQdLDQAgAUHUAGxBwO3WAGoiAi0AqJ0IRQ0AIABBD3FBDGxBwO3WAGoiAEGAGWoQsAEgACABOgCAGSAAIAJBqJ0IaigCDDsBiBlByIrfAEEBOgAAQcyK3wBBiOXfACgCADYCAAsLMAEBf0HM7dYAKAIAIgBFBEBBAA8LQdTt1gAoAgBBgKA2IAARBQAiAEEAIAAQlgEbC+0DAQV/IwBBEGsiByQAQX8hAwJAQdDt1gAoAgAiBEUNAEHc99cALQAADQBB5IrfAC0AAA0AAn8CQAJAAkAgAA4EAAECAAQLQQAQlwFBgKA2IAQoAgQRAgANA0GAwDYgBCgCBBECAA0DQYDgNiAEKAIEEQIADQNBf0EAQYCANyAEKAIEEQIAIgIbIQMgAg0DIABBA0cNA0HJit8AQQE6AABBrsreAEEAOgAAQdjk3wBCxZyd4pTplCQ3AABBzIrfAEGI5d8AKAIAIgI2AgBBAAwCCyABRQ0CIAJBgIABSw0CA0AgAkUEQEEAIQMMBAsgAkGAAiAGQf8BcWsiBSACIAIgBUsbIgVrIQIgBkGAoDZqIAEgBSAEKAIIEQMAIQAgASAFaiEBIAUgBmohBiAARQ0ACwwCCxAcIgNFBEBB8OTfAEG6yQAtAAA6AABB6OTfAEGyyQApAAA3AABB4OTfAEGqyQApAAA3AABB2OTfAEGiyQApAAA3AABBiOXfACgCACECQX8MAQtByYrfAEEBOgAAQa7K3gBBAToAAEHMit8AQYjl3wAoAgA2AgAgAxCXASAHEJgBNgIAQdjk3wBBHkHVCiAHEOACQYjl3wAoAgAhAkEACyEDQfjk3wAgAkHcC2o2AgALIAdBEGokACADC7wSARB/IwBBoAFrIgUkAEF/IQkCQEHQ7dYAKAIAIgtFDQBB3PfXAC0AAA0AQeSK3wAtAAANAAJAAkACQAJAAkAgAA4FAAEEAgMFC0EAIQlB0q3gAEEAOwEADAQLIAFFDQMgAkHgxABLDQNB8ejfACABIAIQvAIaQQAhCUHSreAALwEAIAJPDQNB0q3gACACOwEADAMLQcbEACEAAkBBAEEAENIBIgFFDQACf0Gw1AsoAgAiAkEASgRAA0AgDCABIAxBA3RBwNQLaigCAEYNAhogDEEBaiIMIAJHDQALC0F/CyIBQQBIDQBBxsQAQcvHACALIAEQ0AEiCRshAAsgBSAANgIAQdjk3wBBHkHVCiAFEOACQfjk3wBBiOXfACgCAEHcC2o2AgAMAgsgBUHGxABBy8cAIAtBABDQASIJGzYCEEHY5N8AQR5B1QogBUEQahDgAkH45N8AQYjl3wAoAgBB3AtqNgIADAELQfHo3wBB0q3gAC8BABDNAUUEQEHw5N8AQe/EAC8AADsAAEHo5N8AQefEACkAADcAAEHg5N8AQd/EACkAADcAAEHY5N8AQdfEACkAADcAAEH45N8AQYjl3wAoAgBB3AtqNgIADAELQQAhASAFQYABaiIAQgA3AAAgAEEAOgAYIABCADcAECAAQgA3AAgCQEHoit8ALQAARQ0AQfCK3wAtAABFDQADQEHvit8ALQAAIAAgAWpqQQE6AAAgAUEBaiIBQfCK3wAtAABJDQALCwJAQbyL3wAtAABFDQBBxIvfAC0AAEUNAEEAIQEDQEHDi98ALQAAIAAgAWpqQQE6AAAgAUEBaiIBQcSL3wAtAABJDQALCwJAQZCM3wAtAABFDQBBmIzfAC0AAEUNAEEAIQEDQEGXjN8ALQAAIAAgAWpqQQE6AAAgAUEBaiIBQZiM3wAtAABJDQALCwJAQeSM3wAtAABFDQBB7IzfAC0AAEUNAEEAIQEDQEHrjN8ALQAAIAAgAWpqQQE6AAAgAUEBaiIBQeyM3wAtAABJDQALCwJAQbiN3wAtAABFDQBBwI3fAC0AAEUNAEEAIQEDQEG/jd8ALQAAIAAgAWpqQQE6AAAgAUEBaiIBQcCN3wAtAABJDQALCwJAQYyO3wAtAABFDQBBlI7fAC0AAEUNAEEAIQEDQEGTjt8ALQAAIAAgAWpqQQE6AAAgAUEBaiIBQZSO3wAtAABJDQALCwJAQeCO3wAtAABFDQBB6I7fAC0AAEUNAEEAIQEDQEHnjt8ALQAAIAAgAWpqQQE6AAAgAUEBaiIBQeiO3wAtAABJDQALCwJAQbSP3wAtAABFDQBBvI/fAC0AAEUNAEEAIQEDQEG7j98ALQAAIAAgAWpqQQE6AAAgAUEBaiIBQbyP3wAtAABJDQALC0HM7dYAKAIAIQxB1O3WACgCACECQdKt4AAvAQAhASAFQYABaiEDQfHo3wAhDyMAQTBrIgYkAEF/IQACQEHx6N8AIAEQzQFFDQBBsNQLKAIAIhFBC0oNAEH76N8ALQAAIQFB/OjfAC0AACEEIAZBKGoiAEEAOgAAIAZBIGoiB0IANwMAIAZCADcDGCAGQgA3AxAgASAEQQh0ciINQYMgaiEBIAMEQCAAIAMtABg6AAAgByADKQAQNwMAIAYgAykAADcDECAGIAMpAAg3AxgLIAFBDHYhEiARQQBKBEADQAJAIA5BA3QiA0HF1AtqLQAAIgFFDQAgAUEDcSEKIANBwNQLai0ABCEAQQAhBEEAIQMgAUEETwRAIAFB/AFxIRBBACEHA0AgACADaiIBQRhNBEAgBkEQaiABakEBOgAACyABQQFqIghBGE0EQCAGQRBqIAhqQQE6AAALIAFBAmoiCEEYTQRAIAZBEGogCGpBAToAAAsgAUEDaiIBQRhNBEAgBkEQaiABakEBOgAACyADQQRqIQMgB0EEaiIHIBBHDQALCyAKRQ0AA0AgACADaiIBQRhNBEAgBkEQaiABakEBOgAACyADQQFqIQMgBEEBaiIEIApHDQALCyAOQQFqIg4gEUcNAAsLQRkgEmshASANQYMgakEMdiEEA0BBACEDAn8DQEF/IAZBEGogASADamotAAANARogA0EBaiIDIARHDQALIAELIgNBAEgEQCABQQBKIQAgAUEBayEBIAANAQsLQQAhAUF/IQAgA0EASA0AIA1BgyBqQQx2IQQDQCABIANqQQx0QYCAMGogCygCBBECAA0BIAFBAWoiASAERw0ACyAGQQBB8ejfACANEO8BNgAMIA1BBGshAUH16N8AIQcgA0EMdCIAQYSAMGohBCAAQYCAMGohCgJAA0AgAUUNASABIAFBgAIgBEH/AXFrIgAgACABSxsiAGshASAEIAcgACALKAIIEQMAIQggACAHaiEHIAAgBGohBCAIRQ0AC0F/IQAMAQsgCiANaiEEQQQhCCAGQQxqIQdBBCEBAkADQCABRQRAA0AgCEUNAyAIIAhBgAIgCkH/AXFrIgEgASAISxsiAWshCCAKIA8gASALKAIIEQMAIQQgASAPaiEPIAEgCmohCiAERQ0AC0F/IQAMAwsgASABQYACIARB/wFxayIAIAAgAUsbIgBrIQEgBCAHIAAgCygCCBEDACEQIAAgB2ohByAAIARqIQQgEEUNAAtBfyEADAELIAsgDCACEM8BQQAhAUF/IQBBsNQLKAIAIgRBAEwNAANAIAFBA3RBxNQLai0AACADRgRAIAEhAAwCCyABQQFqIgEgBEcNAAsLIAZBMGokACAAQQBIBEBB9eTfAEEAOgAAQe3k3wBBhsUAKQAANwAAQejk3wBBgcUAKQAANwAAQeDk3wBB+cQAKQAANwAAQdjk3wBB8cQAKQAANwAAQfjk3wBBiOXfACgCAEHcC2o2AgAMAQsCQEH16N8ALQAAQQRGBEBBgR0QmgEhCSAFQSA2AjAgBUHgAGpBHiAJIAVBMGoQ4AIMAQsgBUGF6d8AKAAANgJYIAVB/ejfACkAADcDUCAFQQA6AFxBoAoQmgEhCSAFIAVB0ABqNgJAIAVB4ABqQR4gCSAFQUBrEOACCyAFIAVB4ABqNgIgQdjk3wBBHkHVCiAFQSBqEOACQfjk3wBBiOXfACgCAEHcC2o2AgBBACEJCyAFQaABaiQAIAkLpQMBB38jAEEgayIFJAAgAEGonQhqIgAtAMwEIAAtAPgDIAAtAKQDIAAtANACIAAtAPwBIAAtAKgBIAAtAAAgAC0AVGpqampqampBB00EQCAAIAUQ3QEDQEEAIANBAWogASAFaiIGLQAAIgcbIQQgAyACIAIgA0gbIAIgBxshAgJ/AkAgAUEYRg0AIAYtAAENACAEQQFqDAELIAQgAiACIARIGyECQQALIQMgAUECaiIBQRpHDQALIAAtAAAEfyAAKAIMBUEACyEBIAAtAFQEQCAAKAJgIAFqIQELIAAtAKgBBEAgACgCtAEgAWohAQsgAC0A/AEEQCAAKAKIAiABaiEBCyAALQDQAgRAIAAoAtwCIAFqIQELIAAtAKQDBEAgACgCsAMgAWohAQsgAkEMdCEDIAAtAPgDBEAgACgChAQgAWohAQsgAC0AzAQEQCAAKALYBCABaiEBC0GAgAMgA0GAAWsiA0GA7gUgAWsiBCADIARJGyIDIANBgIADTxtBACABQf/tBU0bQQAgAhshAgsgBUEgaiQAQYCAAyACIAJBgIADTxsLhAEBBH8CQCAALQCknQgiBARAIABBmp0IaiEFIABBkJ0IaiEGA0AgAyAGai0AACABRgRAIAIgAyAFai0AAEYNAwsgA0EBaiIDIARHDQALIARBCUsNAQsgACAEaiABOgCQnQggACAALQCknQhqIAI6AJqdCCAAIAAtAKSdCEEBajoApJ0ICwuVAgEEfwJAIAAuAYSdCEEASA0AIAAtAKSdCCIDBEAgAEGanQhqIQQgAEGQnQhqIQUDQCACIAVqLQAAQQFGBEAgAiAEai0AAEUNAwsgAkEBaiICIANHDQALIANBCUsNAQsgACADakEBOgCQnQggACAALQCknQhqQQA6AJqdCCAAIAAtAKSdCEEBajoApJ0ICwJAIAFFDQAgAC0ApJ0IIgMEQCAAQZqdCGohBCAAQZCdCGohBUEAIQIDQCACIAVqLQAAQQJGBEAgAiAEai0AAEUNAwsgAkEBaiICIANHDQALIANBCUsNAQsgACADakECOgCQnQggACAALQCknQhqQQA6AJqdCCAAIAAtAKSdCEEBajoApJ0ICwsaAQF/IAAoAggiAgRAIAAoAhQgASACEQAACwv1AgECfyAALQCInQgEQAJAIAAuAYSdCEEASA0AIAEgAC4BhJ0IRg0AQX8PCyADIABBhN0HahC0ASIEQQBIBEBBfw8LIAAgATsBhJ0IIAAgBDsBhp0ICwJ/IAAuAYSdCCACRgRAIAMgAEGE3QdqIAAvAYadCBC1ARogAEH//wM7AYSdCEEBDAELAkAgAkEQSw0AIAAoAgwiAUUNACAAIAJBAXRqIgQuAcjbByIFQQBIDQAgBC8BsNwHIQQgACgCFCAFQQ10QZDgJWogAREFACIFRQ0AIARFDQBBACADIAUgBBC1AUEASg0BGgsgA0EAEKsBIANBARCrASADQQIQqwEgA0EDEKsBIANBBBCrASADQQUQqwEgA0EAOgCubSADQQA6AKhqIANBADoAqmogA0EAOgCycCADQQA6AKxtIANBADoAtnMgA0EAOgCwcCADQQA6ALRzQQALIQEgAEEBOgCJnQggACACOgDs3AcgACABOgCInQhBAAs0ACABQb7aAEHD2gBBx9oAIABBAkgiARsgAEEBRiIAG0EFQQRBBSABGyAAGyIAELwCGiAACzoAAkAgAUEDa0F9Sw0AIAAtAP3wCEUNACAAQQAQcwsgAEEAOgDk9gggACABOgDY8AggAEEAOgCR9ggL7AMBB38jAEEQayIDJAAgACABQQZvIgE6ANvwCCABQf8BcSEEAkACQAJAAkAgAkEEaw4JAwEBAQEBAwMAAQsgBEEBRw0BDAILIANBCGpBvtoAQcPaAEHH2gAgBEECSSIBGyAEQQFGIgUbQQVBBEEFIAEbIAUbELwCGiACIAMtAAhGDQEgAiADLQAJRg0BIAIgAy0ACkYNAQJAIAIgAy0AC0YiAQ0AIARFDQAgAiADLQAMRiEBCyABDQELQQAhAgsCQCAALQDY8AhBBEcNACACQQ1GDQAgAC0A2fAIQQ1HDQAgAC0A0K0IIglFDQAgAEGanQhqIQcgAEGQnQhqIQgDQAJAIAkgBnZBAXFFDQBBACEBIAAtAKSdCCIFBEADQCABIAhqLQAAQQhGBEAgBiABIAdqLQAARg0DCyABQQFqIgEgBUcNAAsgBUEJSw0BCyAFIAhqQQg6AAAgByAALQCknQhqIAY6AAAgACAALQCknQhBAWo6AKSdCAsgBkEBaiIGQQhHDQALCyAAIAI6ANnwCCACQXdxQQRHBEAgACAEaiACOgDk8AgLIABBADoA3vAIIABB//8DOwGk8QggAC0A/fAIBEAgAEEAEHMLIABBADoA5PYIIABBBDoA2PAIIABBADoAkfYIIANBEGokAAuxAgEEfyMAQUBqIgEkAAJAIAAsANjqCCICQQBIBEAgAEGg9whqQeYmKQAANwAAIABB3iYpAAA3AJj3CAwBCyAAQdjWCGogACACQf8BcSIDQYQLbGpB+AJqIANBgBRsIABqQcANayACQQJJIgQbQYQLQYAUIAQbELwCGiAAIAI6ANnqCCABQgA3AyggAUIANwMgIAEgAEHYwghqNgIkIAEgAjoAISABQQs6ACAgAEGM+gBqIAFBIGoQLiAAQQE6AIidCCAAQf8BOgDY6gggACAAKALI9wg2AoydCEGxDBCaASECIAEgA0EBajYCECABQSBqQR4gAiABQRBqEOACIAEgAUEgajYCACAAQZj3CGpBHkHVCiABEOACCyAAIAAoAsj3CEHcC2o2Arj3CCABQUBrJAALsQIBBH8jAEFAaiIBJAACQCAALADZ6ggiAkEASARAIABBoPcIakHgJykAADcAACAAQdgnKQAANwCY9wgMAQsgAEHYwghqIAAgAkH/AXEiA0GEC2xqQfgCaiADQYAUbCAAakHADWsgAkECSSIEG0GEC0GAFCAEGxC8AhogACACOgDY6gggAUIANwMoIAFCADcDICABIABB2NYIajYCJCABIAI6ACEgAUELOgAgIABBjPoAaiABQSBqEC4gAEEBOgCInQggAEH/AToA2eoIIAAgACgCyPcINgKMnQhBvwwQmgEhAiABIANBAWo2AhAgAUEgakEeIAIgAUEQahDgAiABIAFBIGo2AgAgAEGY9whqQR5B1QogARDgAgsgACAAKALI9whB3AtqNgK49wggAUFAayQAC/YBAQJ/IwBBQGoiAiQAIABB2MIIaiAAIAFBhAtsakH4AmogAUGAFGwgAGpBwA1rIAFBAkgiAxtBhAtBgBQgAxsQvAIaIABB/wE6ANnqCCAAIAE6ANjqCCACQQw6ACAgAkEANgIsIAJCADcCJCACQQA7ASIgAiABOgAhIABBjPoAaiACQSBqEC4gAEEBOgCInQggACAAKALI9wg2AoydCEHu1QAQmgEhAyACIAFBAWo2AhAgAkEgakEeIAMgAkEQahDgAiACIAJBIGo2AgAgAEGY9whqQR5B1QogAhDgAiAAIAAoAsj3CEHcC2o2Arj3CCACQUBrJAAL6wMBBX8jAEFAaiICJABBCSABIAFBCU8bQQAgAUEAThshAyAALQDVigEhBAJAAn8gAC0AnIoBBEAgAyAERgRAIAJBADYCLCACQgA3AiQgAkGQ/gM2AiAgAEGM+gBqIAJBIGoQLgwDCwJAIAAtAIidCEUNACAALgGEnQhBAEgNACAALgGEnQggAC0A1YoBRg0AIABBnfcIakGEOCkAADcAACAAQf83KQAANwCY9wggACAAKALI9whB3AtqNgK49wgMAwsgAkEANgIsIAJCADcCJCACQQA7ASIgAiADOgAhIAJBEDoAICAAQYz6AGogAkEgahAuQZnHABCaAQwBCyADIARGDQEgACAALQCInQgQIQJAIAAtAKSdCCIEBEAgAEGanQhqIQUgAEGQnQhqIQZBACEBA0AgASAG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B00EQEHghtcALwEADQELQeSG1wAtAABBB00EQEHshtcALwEADQELQfCG1wAtAABBB00EQEH4htcALwEADQELQfyG1wAtAABBB00EQEGEh9cALwEADQELQYiH1wAtAABBB00EQEGQh9cALwEADQELQZSH1wAtAABBB00EQEGch9cALwEADQELQaCH1wAtAABBB00EQEGoh9cALwEADQELQayH1wAtAABBB00EQEG0h9cALwEADQELQbiH1wAtAABBB00EQEHAh9cALwEADQELQcSH1wAtAABBB00EQEHMh9cALwEADQELQdCH1wAtAABBB00EQEHYh9cALwEADQELQdyH1wAtAABBB00EQEHkh9cALwEADQELQeiH1wAtAABBB00EQEHwh9cALwEADQELQfSH1wAtAABBB00EQEH8h9cALwEADQELIAAgARAYIQBB+h0QmgEhASACIAA2AgAgAkEgakEeIAEgAhDgAkHA7dYAIAJBIGoQDQwBC0HGzQAQmgEhAyACIABBAWo2AhAgAkEgakEeIAMgAkEQahDgAkHA7dYAQQUgACABIAJBIGpBr8oAEA8LIAJBQGskAAuxJAEEfyMAQfAAayIEJAACQCAALQDY8AhFDQAgACABOgCb9ghBASABdCIDIAAvAZz2CHENAAJAIAAtAJb2CEUNACABIAAtAJn2CEYNASACQQNLDQAgAkEBRg0AIABBADoAlvYIIABBtcgAEA0gACAALwGc9gggA3I7AZz2CAwBCwJAIAFBCEYNACADIAAvAZLxCHEEQCACQQNLDQIgAkEBRg0CIAMgAC8BmPUIIgJxDQIgACACIANyOwGY9QggAEEBOgCU8QgCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAQ4OAAEFBgoKCQcKCAoEAgMKCyAAECcMCgsgABAoDAkLIABBDUECQQEgAC0AnIoBG0EAQQAQBiAAQaTUABANDAgLAkACQCAAIAAtAPL1CAR/QQAFIAAtAJyKAQ0BQQILIgE6APL1CCAAQf8BOgCD8QggACAAKAK4igE2AvT1CAwBCyAAQQE6APL1CCAAQf8BOgCD8QggACAAKAK4igE2AvT1CCAAECsgAC0A8vUIIQELIABB5ylB/jYgAUH/AXEbEA0MBwsgAEEAOgCM9gggAEEDOgDr8AggAEEAOgD+8AggAEEAOgDe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AEEAOgCa8QggAEEAOwHg9QgMAQsgAEEAOgDe9QggAEEAOwHc9QgLIABBADoA2vAICwu1AwECfwJAIAAtANrwCA0AIAAtAJb2CA0AAkACQCAALQDY8AhBAWsOBAEBAgACCyAALQDZ8AgiAUEMSw0AQQEgAXRBwCJxDQELIAAtAN+KAQ0AIAAtAOCKAQ0AIAAtAKCLASIBQQRNQQBBASABdEEWcRsNACAALQChiwEiAUEETUEAQQEgAXRBFnEbDQAgAC0AoosBIgFBBE1BAEEBIAF0QRZxGw0AIAAtAKOLASIBQQRNQQBBASABdEEWcRsNACAALQCw8QgNACAALQCx8QgNACAALQCy8QgNACAALQCz8QgNACAALQC08QgNACAALQC18QgNACAALQC28QgNACAALQC38QgNACAALQC48QgNACAALQC58QgNACAALQC68QgNACAALQC78QgNACAALQC88QgNACAALQC98QgNACAALQC+8QgNACAALQC/8QgNACAALQDA8QgNACAALQDB8QgNACAALQDC8QgNACAALQDD8QgNACAALQDE8QgNACAALQDF8QgNACAALQDG8QgNACAALQDH8QgNACAALQDI8QgNACAALQDJ8QgNACAALQDK8QhFIQILIAILswgBBX8jAEEQayIGJABBfyEEIAAtANvwCCEDAkACQCAALQDY8AgiAkEBa0H/AXFBAk0EQAJAAkACQCABQQJrDgYAAQQEBAIECyACQf8BcUECRgRAIAAgAC0A/voIQQFqQQNxOgD++ggMBQsgAEEAOgD+8AggAEEAOgD++gggAEECECUMBAsgAEEAOgCM9gggAEECOgDr8AggAEEAOgD+8AggAEEAOgDe8AggAEEDECUMAwsgAkH/AXFBA0YEQCAAQQA6AIz2CCAAQQA6AN7wCCAAIAAtAOvwCEEBakEDcToA6/AIDAMLIABBADoAjPYIIABBADoA6/AIIABBADoA/vAIIABBADoA3vAIIABBAxAlDAILIAJB/wFxQQRHDQAgAC0A2fAIIQQLQQchAgJAAkACQAJAAkACQAJAAkAgAUECaw4KBAUCAwEGCAgHAAgLIAQEQEEAIQIMBwtBBSADQQFLQQN0IANBAUYbIQIMBgsgA0EBRgRAQQ0hAiAEQQ1HDQYgACADaiIEIAQtAPLwCEEBakEDcToA8vAIDAYLIANBAU0EQEEBIQICQAJAIARBAWsOAgABCAsgACADakEAOgDy8AhBAiECDAcLIAAgA2oiBC0A8vAIDQYgBEHy8AhqQQE6AABBAiECDAYLIAAgA0EwbGotAG8gBkEMahCfARpBASECIARBAUcNBSAGKAIMIgRFDQUgACADaiIFIAUtAPLwCEEBaiAEbzoA8vAIDAULIANBAUYEQCAAIANqQQI6APLwCEENIQIMBQsgA0EBTQRAQQIhAiAEQQJGDQUgACADakEAOgDy8AgMBQsgACADQTBsakHvAGoiAi0AAEEAEKABIQUgAi0AAEEBEKABIQICQCAEQQFGBEAgBSAAIANqLQDy8AhGDQELIAUhAgsgACADaiACOgDy8AhBASECDAQLAkAgA0ECTwRAIAAgA0EwbGpB7wBqIgItAABBAhCgAUEATg0BCyAALQDa8AgNBSAALQDY8AhBBEcEQCAAIAAtANvwCCIBIAAgAWotAOTwCBAmCyAAQQA6AOT2CCAAQQE6AJrxCCAAQQU6ANrwCAwFCyAAIANqIAItAABBAhCgAToA8vAIQQEhAgwDC0EDIQIgBEEDRgRAIAAgAC0A/foIQQFzOgD9+ggMAwsgAEEAOgD9+ggMAgtBC0EKIARBCkYbIQIMAQsgBEEERgRAIAAtAOrwCCECDAELIARBAEgEQCAAIANqLQDk8AghBAsgAEEAOgCN9gggACAEOgDq8AhBBCECCyAAIAMgAhAmIABBADoAm/EIIAAtANjwCEEERw0AIAFBB0YNACACIAAtANnwCCIDRw0AIAAgAzoAnfEIIAAgAC0A2/AIIgM6AJzxCCAAIAFBAWo6AJvxCCAAIAAgA2otAPLwCDoAnvEICyAGQRBqJAAL0wMBBH8jAEEwayIEJAACQCAAQQFMBEBBwO3WAEGwHBANDAELAkBBn97fAC0AACAARgRAQZ3e3wAtAAAhAgwBC0Gf3t8AIAA6AAAgAEEwbEHA7dYAai0AbyECQZ7e3wBBADoAAEGd3t8AIAI6AAALAn9BACACQf8BcSIDQbD4AC0AAEYNABpBASADQbH4AC0AAEYNABpBAiACQf8BcSIDQbL4AC0AAEYNABpBAyADQbP4AC0AAEYNABpBtPgALQAAIAJB/wFxRkECdAshBQJAQezo3wAsAAAiAwRAIAFBAEwgA0EASnMNAQtBf0EBIAFBAEwbIQMLQQQgAyAFaiIBIAFBBE4bIgFBACABQQBKG0Gw+ABqLQAAIgEgAkH/AXFGBEBBnt7fAC0AAA0BC0Gd3t8AIAE6AABBnt7fAEEAOgAAQaDe3wBBiOXfACgCADYCACABIABBMGxBwO3WAGotAG9GDQBB2O3WACAAIAEQrQEiAEEATgRAQZ8MEJoBIQJBnd7fAC0AACEBIAQgAEEBajYCBCAEIAFBAnRBsIABaigCADYCACAEQRBqQR4gAiAEEOACQcDt1gAgBEEQahANDAELQZ7e3wBBAToAAAsgBEEwaiQAC58GAQZ/IwBB8ABrIgMkAAJAIABBAUYEQAJ/AkBBwO3WACADQeAAahAVIgQEQEGt3t8ALQAAQQ9xIQUgBEEASg0BQQAMAgtBwO3WAEH1PxANDAMLQQAhACAFQQxsQcDt1gBqLQCAGSECAkADQCADQeAAaiAAai0AACACRg0BIABBAWoiACAERw0AC0EADAELAkBB7OjfACwAACICBEAgAUEATCACQQBKcw0BC0F/QQEgAUEATBshAgsgACACaiAEbyAEaiAEbwshACAFIANB4ABqIABqIgItAAAQG0HBDhCaASEBIAMgBUEBajYCACADQdAAakEQIAEgAxDgAkHA7dYAIAItAAAgA0EwakEQEBRBwO3WAEF/IANB0ABqIANBMGpBqNkAIABB/wFsQQIgBCAEQQJMG0EBa21Bf0EBEAMQDgwBCwJ/QQMgAEEATA0AGkEMIQQCQAJAAkAgAEEwbEHA7dYAai0AbyICQQJrDgMCAQABCxDTAQwCC0EBIAIQ0QEiAiACQQFNGyEECyAECyEEIABBMGxBwO3WAGoiBS0AYCAEbyEGIAVB7wBqIQcCQEHs6N8ALAAAIgIEQCABQQBMIAJBAEpzDQELQX9BASABQQBMGyECCyAHLQAAIQEgBEEATAR/QQAFIAIgBmogBG8gBGogBG8LIQIgBUHYAGohBQJAAkACQCAAQQFMBEBB7ujfAC0AAEUNAUHA7dYAIAAQGgwBCyABQQJrQf8BcUEFSQ0AQcDt1gAgAEEIIAIQCyAFIAI6AAgMAQtBwO3WAEEsIABB/wFxIAJB/wFxQQAQBkHA7dYAEAogBSACOgAIIABBAUoNACADIABBAWo2AhAgA0EwakEWQfUVIANBEGoQ4AIMAQsgA0HhM0GoxQAgAUH/AXEiAUEERhsQmQE2AiggAyAAQQFqNgIgIAMgAUEHcEECdEGwgAFqKAIANgIkIANBMGpBFkGNCSADQSBqEOACC0HA7dYAQX8gA0EwakHA7dYAIAAQBEGo2QAgAkH/AWxBAiAEIARBAkwbQQFrbUF/IAAQAxAOCyADQfAAaiQAC9QJAQR/IwBBgAJrIgIkAEGb3t8ALQAAIgVBMGxBmO7WAGohAwJAAkACQAJAAkACQAJAIAAOBAABAgMGC0G8LhCaASEAIAIgBUEBaiIENgIgIAJBsAFqQRYgACACQSBqEOACQcDt1gAgBUEEQf8AIAEgAy0ABGoiAyADQf8ATxtBACADQQBOGyIDEAsgAiADQeQAbEH/AG42AhAgAkH0AWpBDEGO2QAgAkEQahDgAiACIAJBsAFqEJkBNgIEIAIgBDYCACACQdABakEWQccJIAIQ4AJBwO3WAEEAIAJB0AFqIAJB9AFqQajZACADQQF0QX9BABAFEA4MBQtBACADLQApIgBrIABBQGogAEHAAEkbQQAgAEG/AXEbIQQCQEHt6N8ALQAAIgBB8OjfAC0AAEYEQEHu6N8ALQAARQ0BC0Hw6N8AIAA6AABB7+jfAEEAOgAACwJ/An8gBARAIAEgBGohAUEAIQBB7+jfAEEAOgAAAkAgBEEATg0AIAFBAEwNAEGAAQwDC0FBQQAgBEEATBsiAEE/IAEgAUE/ThsiASAAIAFKGwwBCwJAQezo3wAsAAAiBARAIAFBAEwgBEEASnMNAQtBf0EBIAFBAEwbIQQLQQAhAEHv6N8AQWxBFCAEQe/o3wAsAAAiAUEAIARBAEwgAUEASnMbQQAgAUH/AXEbaiIBIAFBFE4bIgQgBEFsTBsiBDoAAEGAASABQQJqQQVJDQEaQe/o3wBBADoAAEF+QQIgAUEAShsgBGoLIgFFBEBBACEAQYABDAELQQAgAWsgAUFAayABQQBIGyEAIAFBAXRBgAFqCyEEQcDt1gAgBUEpIABB/wFxIgEQCyADIAA6ACkgAEG/AXEEQCABQcAASQRAQQAgAWshAwwECyABQUBqIgMNAwsgAkGGKy0AADoA1AEgAkGCKygAADYC0AEMAwtBvhEQmgEhACACIAVBAWoiBDYCcCACQbABakEWIAAgAkHwAGoQ4AJBwO3WACAFQQZB/wAgASADLQAGaiIDIANB/wBPG0EAIANBAE4bIgMQCyACIANB5ABsQf8AbjYCYCACQfQBakEMQY7ZACACQeAAahDgAiACIAJBsAFqEJkBNgJUIAIgBDYCUCACQdABakEWQccJIAJB0ABqEOACQcDt1gBBAiACQdABaiACQfQBakGo2QAgA0EBdEF/QQIQBRAODAMLQcvMABCaASEAIAIgBUEBaiIENgKgASACQbABakEWIAAgAkGgAWoQ4AJBwO3WACAFQSdB/wAgASADLQAnaiIDIANB/wBPG0EAIANBAE4bIgMQCyACIANB5ABsQf8AbjYCkAEgAkH0AWpBDEGO2QAgAkGQAWoQ4AIgAiACQbABahCZATYChAEgAiAENgKAASACQdABakEWQccJIAJBgAFqEOACQcDt1gBBAyACQdABaiACQfQBakGo2QAgA0EBdEF/QQMQBRAODAILIAJB8CNB8yMgA0EASBs2AkAgAiADIANBH3UiAHMgAGs2AkQgAkHQAWpBEEG0DSACQUBrEOACC0GsHxCaASEDIAIgBUEBajYCMCACQbABakEWIAMgAkEwahDgAkHA7dYAQQEgAkGwAWogAkHQAWpBqNkAIARBgAFBARAFEA4LIAJBgAJqJAALlgYBAn8jAEHQAGsiAiQAAkACQAJAAkACQCAADgQAAQIDBAtBwO3WAEEKQQBBAEEAQZADQeASQdjt1gAvAQAgAUEKbGoiACAAQeASThsiACAAQZADTBsiABAHQcDt1gAQCiACIABBCm4iATYCACACIAAgAUEKbGtB//8DcTYCBCACQUBrQRBBjA0gAhDgAkHA7dYAQX9BvCUgAkFAa0HiKyAAQf8BbEHwnAZrQdAPbkF/QYf9AxAOQajk3wBBAToAAAwDC0Ha7dYALQAAIQMCQEHs6N8ALAAAIgAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEAC0ECQTJBywAgACADaiIAIABBywBOGyIAIABBMkwbIgAQDCACIAA2AhAgAkFAa0EQQdEOIAJBEGoQ4AJBwO3WAEEBQZEXIAJBQGtBkdkAIABB/wFsQc7jAGtB//8DcUEZbkF/QQEQBRAODAILAn9BAEHb7dYALQAAIgBBgAgtAABGDQAaQQEgAEGBCC0AAEYNABpBAiAAQYIILQAARg0AGkEDIABBgwgtAABGDQAaQQQgAEGECC0AAEYNABpBBUEDQYUILQAAIABGGwshAwJAQezo3wAsAAAiAARAIAFBAEwgAEEASnMNAQtBf0EBIAFBAEwbIQALQQNBBSAAIANqIgAgAEEFThsiAEEAIABBAEobIgFBgAhqLQAAIgAQDEHA7dYAQQJB5DIgAkFAawJ/IABFBEAgAkHJnJkCNgJAQajZAAwBCyACIABBBHQ2AiAgAkFAa0EQQdEOIAJBIGoQ4AJB3BoLIAFBM2xBf0ECEAUQDgwBC0Gpyt4AQf8AIAFBqcreAC0AAGoiACAAQf8AThsiAEEAIABBAEobIgA6AABBwO3WAEEfIABBAEEAEAZByYrfAEEBOgAAQcyK3wBBiOXfACgCADYCACACQanK3gAtAABB5ABsQf8AbjYCMCACQUBrQRBBjtkAIAJBMGoQ4AJBwO3WAEEDQdjWACACQUBrQajZAEGpyt4ALQAAQQF0QX9BAxAFEA4LIAJB0ABqJAALcQEBfyMAQRBrIgEkAEESQTAgAEHq7dYALQAAaiIAIABBME4bIgBBACAAQQBKGyIAEAwgASAAQRhrNgIAIAFBBGpBDEG8CyABEOACQcDt1gBBf0GCOyABQQRqQbAUIABBBWxB+ABBnw8QDiABQRBqJAALsgEBAX8jAEHQAGsiBiQAQcDt1gAgACACQf8AIAMgBGoiAyADQf8ATxtBACADQQBOGyIDEAsgBiADQeQAbEH/AG42AhAgBkHEAGpBDEGO2QAgBkEQahDgAiAGIAUQmQE2AgQgBiAAQQFqNgIAIAZBIGpBFkHHCSAGEOACQcDt1gAgASAGQSBqIAZBxABqQajZACADQQF0QX8gAUEASAR/Qb/fAwUgARAFCxAOIAZB0ABqJAALyFQBCX8jAEHQA2siBCQAQZve3wAtAAAiAkEwbEGY7tYAaiEDAkACQAJAAkACQAJAIAAOBwECAwMDAwADCyACIAEQigEMBAsCQEHs6N8ALAAAIgAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEAC0GZ3t8ALQAAQQRGDQJBAUF/IABBAEoiBhshB0EBIAAgAEEfdSICcyACayIAIABBAU0bIQVBACEDA0ACQAJAIARBxANqEJMBIgBFDQAgBCgCxAMiAkEATA0AIAAtAAAgAnAgB2oiAUEASA0AIAEgAk4NACAAIAE6AAAMAQsCfwJAQZve3wAtAAAgBEGgA2oQJCICQQBKBEBBACEAQZne3wAtAAAhAQNAIARBoANqIABqLQAAIAFGDQIgAEEBaiIAIAJHDQALC0EAIAJBAWsgBhsMAQsgAEEBIAJBAWsgBhtqIAJvCyEAQcDt1gBBm97fAC0AACAEQaADaiAAai0AABAmIARBkANqEJMBIgBFDQAgBCgCkAMiAkEATA0AIABBACACQQFrIAYbOgAACyADQQFqIgMgBUcNAAsMAwsCQAJAAkACQEGZ3t8ALQAAQQRrDgkAAwEDAwMDAwIDCwJAAn8gAkECTwRAIARBgQo7AMgDIARBgISMIDYAxANBBiEFIAJBMGxBwO3WAGotAIABBEAgBEHKA2ohB0EHDAILQQYhAAwCC0EDIQAgBEGCBjsAxAMgBEEBOgDGAyACQQFHDQEgBEHHA2ohB0EHIQVBBAshACAHIAU6AAALIARBxANqIABqQQg6AAACQAJAAkACQAJAAkACQAJAAkBBzePfAC0AACIFIABLBH9BzePfACAAOgAAIAAFIAULIARBxANqai0AAA4IAAIDBAUBBgcICyABQQBKIgBBASACdCICQbHK3gAtAAAiAXFBAEdGDQ1ByYrfAEEBOgAAQcyK3wBBiOXfACgCADYCAEGxyt4AIAEgAnIgASACQX9zcSAAGzoAAEHA7dYAQbbWAEH/GyAAGxANDA0LIAFBAEoiACADLQAoRXMNDEHA7dYAIAJBKCAAEAtBwO3WAEHzEkG3NiAAGxANDAwLQcDt1gAgAkEYQf8AIAEgAy0AGGoiACAAQf8ATxtBACAAQQBOGyIAEAsgBCAAQeQAbEH/AG42AsACIARBkANqQQxBjtkAIARBwAJqEOACIARBgBUQmQE2ArQCIAQgAkEBajYCsAIgBEGgA2pBFkHHCSAEQbACahDgAkHA7dYAQX8gBEGgA2ogBEGQA2pBqNkAIABBAXRBf0G/3wMQDgwLC0HY7dYAIAJBf0EAIAJBAUsbEKgBIQMCQEHs6N8ALAAAIgAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEACyACIAAgA2oQegwKCyADLQAVIQMCQEHs6N8ALAAAIgAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEAC0HA7dYAIAJBFUEFIAMgAGsiACAAQQVOGyIAQQAgAEEAShsiABALQbvJABCaASEBIAQgAkEBajYC0AIgBEGgA2pBHiABIARB0AJqEOACQcDt1gBBfyAEQaADaiAAQQJ0QZCAAWooAgBBqNkAQQUgAGtBM2xBf0G/3wMQDgwJCyADLQAQIQMCQEHs6N8ALAAAIgAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEAC0HA7dYAIAJBEEEwIAAgA2oiACAAQTBOGyIAQQAgAEEAShsiABALIAQgAEEYazYC8AIgBEGQA2pBDEGsFCAEQfACahDgAkH0OhCaASEBIAQgAkEBajYC4AIgBEGgA2pBHiABIARB4AJqEOACQcDt1gBBfyAEQaADaiAEQZADakGo2QAgAEEFbEH4AEG/3wMQDgwICyADLQAZIQMCQEHs6N8ALAAAIgAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEAC0HA7dYAIAJBGUEPIAAgA2oiACAAQQ9OGyIAQQAgAEEAShsiABALIAQgAEEBajYCgAMgBEGgA2pBCEHRDiAEQYADahDgAkHA7dYAQX9B4C4gBEGgA2pBqNkAIABBEWxBf0G/3wMQDgwHCyABQQBKIgAgAy0ADkVzDQZBwO3WACACQQ4gABALDAYLIAFBAEgNBUHW498ALQAADQVBgc4AQfDNACACGxCaASEAIAQgAkEBajYCoAIgBEGgA2pBHiAAIARBoAJqEOACQcDt1gBBBCACQQAgBEGgA2pB3BMQDwwFC0HA7dYAIARBoANqEBUiAkUNBEGRm98ALQAAIQMCQEHs6N8ALAAAIgAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEAC0GRm98AIAAgA2oiACACQQFrIgIgACACSBtBACAAQQBOGzoAAAwEC0HA7dYAQbw7EA0MAwsCQAJAAkACQAJAAkACQCADLQAXDgcAAQIDBAUGCQsCfwJAQdXe3wAtAABFDQBB2N7fAC0AAEECRw0AQdne3wAtAAAMAQtB1t7fACACOgAAIAJBwO3WAGotAOzwCCEAQdje3wBBAjoAACAAQQ9xC0H/AXEhAgJAQezo3wAsAAAiAARAIAFBAEwgAEEASnMNAQtBf0EBIAFBAEwbIQALQdne3wBBDyAAIAJqIgAgAEEPThsiAEEAIABBAEobOgAAQa3K3gAtAABBBXBBAXRBlNoAai4BACEAQdfe3wBBADoAAEHV3t8AQQE6AAAgAEEATARAQdXe3wBBADoAAEGb3t8ALQAAIgBBwO3WAGpB2d7fAC0AACICOgDs8AhBwO3WAEEBIAAgAkHkABAGIARBwO3WACAAQdne3wAtAAAiAhAREJkBNgL0ASAEIAJBAWo2AvABIARBoANqQRhBzwkgBEHwAWoQ4AJBwO3WACAEQaADahANDAkLQeDe3wBBiOXfACgCACAAajYCAAwIC0Gt3t8ALQAAQQ9xIQICQEHs6N8ALAAAIgAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEAC0Gt3t8AQQ8gACACaiIAIABBD04bIgBBACAAQQBKGyIAOgAAIABBDGxBwO3WAGoiAi0AgBkgAi8BhhlBk5vfAC0AABAWQcEOEJoBIQIgBCAAQQFqNgKAAiAEQaADakEUIAIgBEGAAmoQ4AJBwO3WACAEQaADahANDAcLIAFBAEoiACACQTBsQcDt1gBqIgEtANB2QQFxRg0GQcDt1gBBKyACQQAgABAGIAFB0PYAaiAAOgAAQcDt1gAQCkHA7dYAQX9BzStB6TtBwBIgABtBqNkAQf8BQQAgABtBfyACEAMQDgwGCyABQQBKIgAgAkEwbEGr5NcAaiIBLQAARXMNBUHA7dYAQSsgAkEbIAAQBiABIAA6AABBwO3WABAKQcDt1gBBf0GpwgBBziRBwiUgABtBqNkAQf8BQQAgABtBfyACEAMQDgwFCyADIAJBMGxBkOTXAGoiBhBNIQMCQEHs6N8ALAAAIgAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEAC0HA7dYAQSsgAkEAQQFBICAAIANqIgAgAEEgThsiACAAQQFMGyIAEAYgBiAAOgAAQcDt1gAQCiAEIAA2ApACIARBoANqQRRB0Q4gBEGQAmoQ4AJBwO3WAEF/QZosIARBoANqQfzSACAAQQN0QQhrQX8gAhADEA4MBAtBBRDRASEAIAJBMGxBluTXAGoiBi0AACEFAkBB7OjfACwAACIDBEAgAUEATCADQQBKcw0BC0F/QQEgAUEATBshAwtBwO3WAEErIAJBBiADIAVqIgEgACAAIAFKG0EAIAFBAE4bIgFB/wFxEAYgBiABOgAAQcDt1gAQCkHA7dYAQX9BoT4gAQR/QQUgAUEBaxDVAQVBkygLQajZACABQf8BbEEBIAAgAEEBTRttQX8gAhADEA4MAwsgAkEwbEGj5NcAaiIDLQAAIQYCQEHs6N8ALAAAIgAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEAC0HA7dYAQSsgAkETIAAgBmrBQQRvIgBBBGpB//8DcSIBIAFBBGsgAEEASBsiAEH/AXEQBiADIAA6AABBwO3WABAKQcDt1gBBf0GpGSAAQQJ0QdDtAGooAgBBqNkAIABB1QBsQX8gAhADEA4MAgsgAEEFSw0BIABBAmshBQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQZne3wAtAAAODgABAgoDBAUMBgsHDQgJEQsgAiAFIAEQlAEMEAsgAkEBSw0AIAIgBSABEJQBDA8LIwBB0ABrIgckAAJ/IAJFBEAgB0ECNgJMQYD5ACEDQQIMAQsgAkEwbEHA7dYAai0AbyAHQcwAahCfASEDIAcoAkwLIQYCQCADRQ0AIAZFDQAgBSADIAJBwO3WAGotAPLwCCAGb0E4bGoiCS0ABE8NACAJIAVBDGxqQQhqIQYCfyACRQRAQZve3wAtAABBwO3WAGotAOzwCEEPcUEDdEHA7dYAaiAGLQAEQQdxai0A+AIMAQtB2O3WACACIAYQogELIQMCQCAGLQAGIghBEEsEQCABIQAMAQtB7OjfACwAACIABEAgAUEATCAAQQBKcw0BC0F/QQEgAUEATBshAAsgBwJ/AkAgAkUEQCAGLQAERSIBIAAgA2oiAiAIIAIgCEgbIAEgAkobIgEgA0YNA0HA7dYAQQZBAEGb3t8ALQAAQaze3wBqLQAAQQ9xIAYtAARBB3EgARAHQcDt1gAQCiAGIAEgB0FAa0EMEKUBQcDt1gBBAEGb3t8ALQAAQaze3wBqLQAAQQ9xEBEQmQEhAiAGLQAEQQZHDQFBm97fAC0AAEGs3t8Aai0AAEEDdEH4AHFBwO3WAGotAPwCQQxwQQJ0QbCAB2oMAgsgACADaiIBIAggASAISBtBACABQQBOGyIBIANGDQICQAJAIAYsAAQiA0EASARAQQMhCAwBC0E/IQggA0E/Sw0AQQAhAwJ/IAdBIGohCCAHQUBrIQogBi0AB0EQRwRAIAggBi0ABDoAACAKIAE6AABBAQwBCyAIQRg6AAAgCkH/ACABQQF0IgBBgAFrQYABIABrIAFBwABKGyIAIABB/wBOGzoAACAIQRk6AAEgCiABQT9KOgABQQILIghBAEoEQANAQcDt1gBBKyACIAdBIGogA2otAAAgB0FAayADai0AABAGIANBAWoiAyAIRw0ACwtBwO3WABAKDAELQcDt1gAgAiADIAhxIAEQCwsCQCAGLAAEIgNBAEgEQEHA7dYAIAIgA0EDcSABIAdBQGtBDBBkDAELAkAgAQ0AIAYtAAdBEUcNACAHIAJBMGxBwO3WAGoiAkHYAGogAkHQ9gBqEE02AhAgB0FAa0EMQfnUACAHQRBqEOACDAELIAYgASAHQUBrQQwQpQELIAkoAgAQmQEhAgsgBgsoAgAQmQE2AgQgByACNgIAIAdBIGpBFkGRCSAHEOACIAFB/wFsQQEgBi0ABiICIAJBAU0bbSEDQX8hAgJAIAYtAAciBkEQSw0AQQEgBnRBnqAEcUUNAEGAASECC0HA7dYAIAUgB0EgaiAHQUBrQajZACADIAIgBRAFEA4LIAdB0ABqJAAMDgsCQAJAAkACQCAAQQJrDgMAAQIDC0HY7dYAIAIgAkEBTQR/IAJBwO3WAGotAOzwCEEPcQVBfwsQqAEhAwJAQezo3wAsAAAiAARAIAFBAEwgAEEASnMNAQtBf0EBIAFBAEwbIQALIAIgACADahB6DBALIAMtABUhAwJAQezo3wAsAAAiAARAIAFBAEwgAEEASnMNAQtBf0EBIAFBAEwbIQALQcDt1gAgAkEVQQUgAyAAayIAIABBBU4bIgBBACAAQQBKGyIAEAtBwO3WAEEBQfXJACAAQQJ0QZCAAWooAgBBqNkAQQUgAGtBM2xBf0EBEAUQDgwPCyACQQJBGCADLQAYIAFBgBUQjgEMDgsgAkECSQ0NIAMtABAhAwJAQezo3wAsAAAiAARAIAFBAEwgAEEASnMNAQtBf0EBIAFBAEwbIQALQcDt1gAgAkEQQTAgACADaiIAIABBME4bIgBBACAAQQBKGyIAEAsgBCAAQRhrNgIwIARBkANqQRBBrBQgBEEwahDgAkHA7dYAQQNBijsgBEGQA2pBqNkAIABBBWxB+ABBAxAFEA4MDQtBASAFIABBGmpB/wFxIAMgBWotABwgASAFQQJ0QZDhAGooAgAQjgEMDAsCQEHA7dYAIARBoANqEBUiAgRAIARBoANqQZGb3wAtAAAgAm9qLAAAIgJBAE4NAQtBwO3WAEGvEBANDAwLIAJB/wFxIgNB1ABsQeiK3wBqIQICQAJAAkACQCAAQQJrDgMAAQIPCyACQZADQeASIAIvAQQgAUEKbGoiACAAQeASThsiACAAQZADTBsiADsBBCAEIABBCm42AkAgBEGQA2pBEEHRDiAEQUBrEOACQcDt1gBBAEHdKyAEQZADakHiKyACLwEEQf8BbEHwnAZrQdAPbUF/QQAQBRAODAILIAItAAYhBgJAQezo3wAsAAAiAARAIAFBAEwgAEEASnMNAQtBf0EBIAFBAEwbIQALIAJBAUEIIAAgBmoiACAAQQhOGyIAIABBAUwbIgA6AAYgBCAANgJQIARBkANqQRBB0Q4gBEHQAGoQ4AJBwO3WAEEBQbYaIARBkANqQajZACACLQAGQR9sQX9BARAFEA4MAQsgAkEIQf8AIAEgAi0AA2oiACAAQf8AThsiACAAQQhMGyIAOgADIAQgAEEGbEGAA2tBwABtwTYCYCAEQZADakEQQbwLIARB4ABqEOACQcDt1gBBAkG5KiAEQZADakHfzAAgAi0AA0EBdEGAAUECEAUQDgtBzIrfAEGI5d8AKAIANgIAQZCb3wBBkJvfAC0AAEEBIAN0cjoAAEEAIQIjAEEQayIFJAADQCACQdAAbEHYkN8AakEAQdAAEL4CIgBB//8DOwAJIAJB1ABsQeiK3wBqIgEtAAAEQCAAIAEoAlA2AgAgACABKAIMNgIEIAAgAS8BBDsBDCAAIAEtAAY6AA4gACABLQADOgALIAAgAS0AAjoACCAAIAEpAhA3AhAgACABKQIYNwIYIAAgASkCIDcCICAAIAEpAig3AiggACABKQIwNwIwIAAgASkCODcCOCAAQUBrIAFBQGspAgA3AgAgACABKQJINwJICyACQQFqIgJBCEcNAAsgBUIANwMIIAVCADcDACAFQdiQ3wA2AgQgBUEWOgAAQczn1wAgBRAuIAVBEGokAAwLCwJAAkAgAEECaw4CAAEMCyACQYQDbEH40dcAai0AAEUgAUEASnMNC0HA7dYAQScgAkEDQQAQBkHA7dYAEAoMCwtBwO3WAEEnIAJBBAJ/AkACQAJAIAJBhANsQfnR1wBqLQAAQQFrDgIAAQILQQFBAiABQQBMGwwCC0EBQQQgAUEATBsMAQtBBEECIAFBAEobCyIAEAZBwO3WABAKIAQgADYCkAEgBEGQA2pBEEHRDiAEQZABahDgAkHA7dYAQQFBqhogBEGQA2pBqNkAIABBP2xBf0EBEAUQDgwKCwJAAkACQAJAIABBAmsOAwABAgMLQezo3wAsAAAhACADLQAbQf8BRgRAQeDt1gAtAAAhAgJAIAAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEAC0EIIAAgAmrBQQxvIgBBDGpB//8DcSICIAJBDGsgAEEASBsiABAMIABBAnRB4IABaigCAAwLCyADLQAaIQMCQCAABEAgAUEATCAAQQBKcw0BC0F/QQEgAUEATBshAAtBwO3WACACQRogACADasFBDG8iAEEMakH//wNxIgEgAUEMayAAQQBIGyIAEAsgAEECdEHggAFqKAIADAoLQX8gAy0AGyIDIANB/wFGGyEGAkBB7OjfACwAACIABEAgAUEATCAAQQBKcw0BC0F/QQEgAUEATBshAAtBf0EIIAAgBmoiACAAQQhOGyIBIAFBAEgbIQECQCADQf8BRw0AIAANAEHA7dYAIAJBGkHg7dYALQAAEAtBwO3WACACQRsgARALDAkLQcDt1gAgAkEbQf8BIAEgAEEASCIAGxALIABFDQhBghgMCQtB4u3WAC0AACECAkBB7OjfACwAACIABEAgAUEATCAAQQBKcw0BC0F/QQEgAUEATBshAAtBCiAAIAJqwUEFbyIAQQVqQf//A3EiAiACQQVrIABBAEgbIgAQDCAAQQJ0QdDeAGooAgAMCAsgAUEASiIAQePt1gAtAABHBEBBCyAAEAwLQfApQZE3IAAbDAcLIAUNCCABQQBKIgBB2+LfAC0AAEVzDQhB2+LfACAAOgAAQcDt1gBB2csAQbkhIAAbEA0MCAtBs97fAC0AAEUEQCAAQQNNBEACQEGt3t8ALQAAQQ9xQQxsQcDt1gBqIgItAIAZIgZBB00EQCAGQdQAbEHA7dYAaiIGLQConQgNAQtBwO3WAEHzygAQDQwKCyAGQaidCGoiCi8BBCIHIQAgAkGAGWohBkGA/KQCIAcEfyAABUHY7dYALwEAC0H//wNxbiIAQQBBkpvfAC0AACICQQJGGyEDIABBAXYgAyACQQFGGyEIQQgCf0Gkm98AKAIAIglBoJvfACgCACIASwRAIAkgAGsMAQsgCigCDAtB9ABuIgAgAEEITRshCSAGLwEGIgAgBi8BCGohAyAGAn8gBUUEQCAGAn8gCARAQYD8pAIgBwR/IAcFQdjt1gAvAQALbiIFQQF2IAVBACACQQJGGyACQQFGGyIFBEAgBUEBdiAAaiICIAIgBXBrIQALAkBB7OjfACwAACIFBEAgAUEATCAFQQBKcw0BC0F/QQEgAUEATBshBQsgBSAIbCAAagwBCyABIAlsIABqCyIBIANBQGoiBSABIAVIG0EAIAFBAE4bIgE7AQYgAyABawwBCwJ/IAgEQEGA/KQCIAcEfyAHBUHY7dYALwEAC24iBUEBdiAFQQAgAkECRhsgAkEBRhsiBQRAIAVBAXYgA2oiAiACIAVwayEDCwJAQezo3wAsAAAiBQRAIAFBAEwgBUEASnMNAQtBf0EBIAFBAEwbIQULIAUgCGwgA2oMAQsgAyABIAlsagshASAAQUBrIgUgASAKKAIMIgIgASACSBsgASAFSBsgAGsLOwEIQcDt1gAQCgwJC0Hs6N8ALAAAIQAgBUECRgRAQZOb3wAtAAAhAgJAIAAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEAC0GTm98AQQMgACACaiIAIABBA04bIgBBACAAQQBKGzoAAAwJC0GSm98ALQAAIQICQCAABEAgAUEATCAAQQBKcw0BC0F/QQEgAUEATBshAAtBkpvfAEECIAAgAmoiACAAQQJOGyIAQQAgAEEAShs6AAAMCAsjAEHQAGsiAyQAAkACQEGt3t8ALQAAQQ9xIgBBDGxBwO3WAGoiAi0AgBlBB00EQCACQYAZaiICLwEIDQELQcDt1gBB88oAEA0MAQsgAEEDdEG8+9YAaiEGAkACQAJAAkBBs97fAC0AAEEBaw4DAAIBAgsCQAJAAkACQCAFQQFrDgMBAgMACyACLQACIQUCQEHs6N8ALAAAIgAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEACyACQTAgACAFaiIAIABBME4bIgBBACAAQQBKGyIAOgACIAMgAEEYazYCACADQUBrQRBBvAsgAxDgAkHA7dYAQQBB2zMgA0FAa0GwFCACLQACQf8BbEEwbkGAAUEAEAUQDgwFC0HA7dYAQQZBASAAQQFB/wAgASAGLQABaiICIAJB/wBOGyICQQAgAkEAShsiAhAHIAMgAjYCECADQUBrQRBB0Q4gA0EQahDgAkHA7dYAQQFBwC4gA0FAa0Go2QAgAkEBdEF/QQEQBRAODAQLIAItAAEhBQJAQezo3wAsAAAiAARAIAFBAEwgAEEASnMNAQtBf0EBIAFBAEwbIQALIAIgACAFasFBBG8iAEEEakH//wNxIgEgAUEEayAAQQBIGyIAOgABQcDt1gBBAkG5ESAAQf8BcSICQQJ0QbDfAGooAgBBqNkAIAJB1QBsQX9BAhAFEA4MAwsgAiABQQBKIgAgAi0AA0H+AXFyOgADQcDt1gBBA0GbH0HSEkGGxAAgABtBqNkAQf8BQQAgABtBf0EDEAUQDgwCCwJAAkACQAJAIAVBAWsOAwEDBQALIAJB/gEgASACLQAKaiIAIABB/gFOGyIAQQAgAEEAShsiADoACgJAIAItAAsiAUUNACAAIAFJDQAgAiAAQQFqOgALCyADIABB5ABsQfz/A3FB/wFuNgIgIANBQGtBEEHRDiADQSBqEOACQcDt1gBBAEHRKiADQUBrQZHZACACLQAKQX9BABAFEA4MAQtBACEAQcDt1gBBAUHqEiADQUBrAn8gASACLQALaiIBQQBMBEAgAkEAOgALIANBlj4vAAA7AUQgA0GSPigAADYCQEGo2QAMAQsgAkH/ASABIAFB/wFPGyIAIAItAAoiAUEBaiAAIAFLGyIAOgALIAMgAEHkAGxB/wFuNgIwIANBQGtBEEHRDiADQTBqEOACQZHZAAsgAEF/QQEQBRAOCyACLQABQQNGDQIgAkEDOgABQcDt1gBB+CIQDQwCCyACLQABIQUCQEHs6N8ALAAAIgAEQCABQQBMIABBAEpzDQELQX9BASABQQBMGyEACyACIAAgBWrBQQRvIgBBBGpB//8DcSIBIAFBBGsgAEEASBsiADoAAUHA7dYAQQJBuREgAEH/AXEiAkECdEGw3wBqKAIAQajZACACQdUAbEF/QQIQBRAODAELAkACQAJAAkAgBUEBaw4DAQIDAAsgAkH/ACABIAItAARqIgAgAEH/AE4bIgBBACAAQQBKGzoABAwDCyACQf8AIAEgAi0ABWoiACAAQf8AThsiAEEAIABBAEobOgAFDAILIAYtAAchBQJAQezo3wAsAAAiAgRAIAFBAEwgAkEASnMNAQtBf0EBIAFBAEwbIQILQcDt1gBBBkEBIABBB0EDIAIgBWoiAiACQQNOGyICQQAgAkEAShsQBwwBCyACIAItAANB/QFxIAFBAEpBAXRyOgADC0HA7dYAEAoLIANB0ABqJAAMBwsCQEG96N8ALQAARQ0AQZje3wAtAABBBEcNACAFDQcgAkUEQEHA7dYAQQBBqjBBucMAQajZAEEAQX9BABAFEA4MCAsgAkEAQQcgAy0AByABQYnXABCOAQwHCyAEIAMtAAQ6AMQDIAQgAy0ABSIAOgDFAyAEIAMtAAY6AMYDIAQgAy0AJzoAxwMCfyAFQQFGBEBBwO3WACACQQUCf0HAACEDAkBB7ejfAC0AACIGQfDo3wAtAABGBEBB7ujfAC0AAEUNAQtB8OjfACAGOgAAQe/o3wBBADoAAAsCQCAAQcAARwRAQe/o3wBBADoAACAAQcAASEH/ACAAIAFqIgEgAUH/AE4bQQAgAUEAThsiAUHAAEpxDQFBwAAgASABQcAATBsgASAAQcAAShsMAgsCQEHs6N8ALAAAIgMEQCABQQBMIANBAEpzDQELQX9BASABQQBMGyEDC0Hv6N8AQWxBFCADQe/o3wAsAAAiAUEAIANBAEwgAUEASnMbQQAgAUH/AXEbaiIDIANBFE4bIgEgAUFsTBsiAToAACAAIANBAmpBBUkNARpB7+jfAEEAOgAAQf8AQX5BAiADQQBKGyAAaiABaiIBIAFB/wBOG0EAIAFBAE4bIQMLIAMLIgAQCyAEQZADaiEDIwBBIGsiASQAAkAgAEHAAEYEQCADQRBBm8wAQQAQ4AIMAQsgAEE/TARAIAFBwAAgAGtBMmxBBnY2AgAgA0EQQe4MIAEQ4AIMAQsgASAAQTJsQYAZa0E/bjYCECADQRBB1wwgAUEQahDgAgsgAUEgaiQAQYABDAELQcDt1gAgAiAFQfDjAGotAABB/wAgASAEQcQDaiAFai0AAGoiACAAQf8AThsiAEEAIABBAEobIgAQCwJAIAVFBEAgBCAANgIQIARBkANqQRBB0Q4gBEEQahDgAgwBCyAEIABB5ABsQfz/A3FB/wBuNgIgIARBkANqQRBBjtkAIARBIGoQ4AILQX8LIQEgBCAFQQJ0QYDkAGooAgAQmQE2AgQgBCACQQFqNgIAIARBoANqQRZBxwkgBBDgAkHA7dYAIAUgBEGgA2ogBEGQA2pBqNkAIABBAXQgASAFEAUQDgwGCwJAAkACQCAAQQJrDgIAAQILIAMtABkhAwJAQezo3wAsAAAiAARAIAFBAEwgAEEASnMNAQtBf0EBIAFBAEwbIQALQcDt1gAgAkEZQQ8gACADaiIAIABBD04bIgBBACAAQQBKGyIAEAsgBCAAQQFqNgLAASAEQZADakEQQdEOIARBwAFqEOACQcDt1gBBAEHgLiAEQZADakGo2QAgAEERbEF/QQAQBRAODAcLIAIgARCKAQwGC0HA7dYAIAIgBUH/ACABIAMgBWotAABqIgAgAEH/AE4bIgBBACAAQQBKGyIAEAtBwO3WAEEdIAMtABlBD3FBsAFyIAVBkOQAai0AACICIAAQBiAEIAA2ArABIARBkANqQRBB0Q4gBEGwAWoQ4AIgBCACNgKgASAEQaADakEWQcgOIARBoAFqEOACQcDt1gAgBSAEQaADaiAEQZADakGo2QAgAEEBdEF/IAUQBRAODAULIAJBAkkNBAJAAkACQAJAIABBA2sOAwECAwALIAMtABEhAwJAQezo3wAsAAAiAARAIAFBAEwgAEEASnMNAQtBf0EBIAFBAEwbIQALQcDt1gAgAkERIAAgA2rBQQVvIgBBBWpB//8DcSIBIAFBBWsgAEEASBsiABALQcDt1gBBAEGXwgAgAEECdEHw4ABqKAIAQajZACAAQT9sQX9BABAFEA4MBwsgAy0AEiEDAkBB7OjfACwAACIABEAgAUEATCAAQQBKcw0BC0F/QQEgAUEATBshAAtBwO3WACACQRJBAiAAIANqIgAgAEECThsiAEEAIABBAEobIgAQC0HA7dYAQQFBmDogAEECdEGE4QBqKAIAQajZACAAQf8AbEF/QQEQBRAODAYLIAMtABMhAwJAQezo3wAsAAAiAARAIAFBAEwgAEEASnMNAQtBf0EBIAFBAEwbIQALQcDt1gAgAkETQQFBAyAAIANqIgAgAEEDThsiACAAQQFMGyIAEAsgBCAANgJwIARBkANqQRBB0Q4gBEHwAGoQ4AJBwO3WAEECQfMbIARBkANqQajZACAAQdUAbEF/QQIQBRAODAULQcDt1gAgAkEUQQpB5AAgASADLQAUaiIAIABB5ABOGyIAIABBCkwbIgAQCyAEIAA2AoABIARBkANqQRBB0Q4gBEGAAWoQ4AJBwO3WAEEDQeE6IARBkANqQZHZACAAQf8BbEHkAG5Bf0EDEAUQDgwEC0Hs6N8ALAAAIQICfwJAAkACQAJAIABBA2sOAwECAwALQeXt1gAtAAAhAAJAIAIEQCABQQBMIAJBAEpzDQELQX9BASABQQBMGyECC0ENIAAgAmrBQQNvIgBBA2pB//8DcSICIAJBA2sgAEEASBsiABAMIABBAnRBiIIBaigCAAwDC0Hm7dYALQAAIQACQCACBEAgAUEATCACQQBKcw0BC0F/QQEgAUEATBshAgtBDiAAIAJqwUEDbyIAQQNqQf//A3EiAiACQQNrIABBAEgbIgAQDEHq4t8AQQA6AAAgAEECdEHg4ABqKAIADAILQeft1gAtAAAhAAJAIAIEQCABQQBMIAJBAEpzDQELQX9BASABQQBMGyECC0EPQQFBBSAAIAJqIgAgAEEFThsiACAAQQFMGyIAEAwgBCAANgLQASAEQZADakEQQdEOIARB0AFqEOACIARBkANqDAELQejt1gAtAAAhAAJAIAIEQCABQQBMIAJBAEpzDQELQX9BASABQQBMGyECC0EQQTwgAkEBdCAAaiIAIABBPE4bIgBBACAAQQBKGyIAEAwgBCAANgLgASAEQZADakEQQdEOIARB4AFqEOACIARBkANqCyEAQcDt1gAgBSAFQQJ0QaDkAGooAgAgAEGo2QBBgAFBfyAFEAUQDgwDCyABQQJ0QZCBAWooAgALIQBBwO3WACAFIAVBAnRB4OMAaigCACAAQajZAEGAAUF/IAUQBRAODAELIABBzePfAC0AAGohAAJAAn8gAkECTwRAQQYhAyACQTBsQcDt1gBqLQCAAQRAIARBoANqIQJBBwwCC0EGIQEMAgtBAyEBIAJBAUcNAUEHIQMgBEGgA2ohAkEECyEBIAIgAzoAAAtBzePfACAAIAEgACABSBtBACAAQQBOGzoAAAsgBEHQA2okAAu3HQESfyMAQeACayIEJAACQAJAIAAtANrwCEUEQCAALQDb8AghCCAALQDY8AhBBEcNASAALQDZ8AhBC0cNAQsgACABIARBwAJqIARBtgJqIARBuAJqIARBsAJqEG0MAQsgAUEAQY4CEL4CIQUgAC0A2PAIIgJBAWtB/wFxQQJNBEACQAJAIAAtAP3wCARAIAJB/wFxQQNGDQEgAC0A2/AIIgJBAk8EQCAAIAUgAhCRAQwFCyAAIAUgAhCSASAFQQAQ9QFBCmxqIgJBv98DOwEIIAJBAToABiACQcGGjQI2AAAMBAsgAkH/AXFBA0cNAQsgAC0A6/AIQQNHDQAgACAFEG5BfyEKIAAtAPB4IgIEQCAAIAAtAJD2CCACcGotAPF4IQoLIApBD3EhCCAAQcDbB2ohC0EAIQIgCkEATiEPA0BBBSEDIAsgAhDZAUUEQEEFQQEgAiAALQDVigFGGyEDCyAEIAJBAWoiBzYCkAEgBEHAAmpBBkGiCyAEQZABahDgAiACEPQBIQYgBCAEQcACajYCgAEgBSAGQQpsaiIGQQZB1QogBEGAAWoQ4AIgBkG/3wM7AQggBkECIAMgAiAIRhsgAyAPGzoABiAHIgJBCkcNAAsgBEHBADYCcCAEQcACakEGQdwOIARB8ABqEOACIApBAE4hByAKQQR2QQ9xQQFrIQIgAC0A8HgiA0EAR0EBdCEGAkAgA0UNACAHIAJFcQ0AQQVBASAALQDyeUEBcRshBgtBBhD1ASEDIAQgBEHAAmo2AmAgBSADQQpsaiIDQQZB1QogBEHgAGoQ4AIgA0GfDzsBCCADIAY6AAYgBEHCADYCUCAEQcACakEGQdwOIARB0ABqEOACIAAtAPB4IgNBAEdBAXQhBgJAIANFDQAgByACQQFGcQ0AQQVBASAALQD4eUEBcRshBgtBBxD1ASEDIAQgBEHAAmo2AkAgBSADQQpsaiIDQQZB1QogBEFAaxDgAiADQZ8POwEIIAMgBjoABiAEQcMANgIwIARBwAJqQQZB3A4gBEEwahDgAiAKQQBOIQcgAC0A8HgiA0EAR0EBdCEGAkAgA0UNACAHIAJBAkZxDQBBBUEBIAAtAP55QQFxGyEGC0EIEPUBIQMgBCAEQcACajYCICAFIANBCmxqIgNBBkHVCiAEQSBqEOACIANBnw87AQggAyAGOgAGIARBxAA2AhAgBEHAAmpBBkHcDiAEQRBqEOACIAAtAPB4IgZBAEdBAXQhAwJAIAZFDQAgByACQQNGcQ0AQQVBASAALQCEekEBcRshAwtBCRD1ASECIAQgBEHAAmo2AgAgBSACQQpsaiICQQZB1QogBBDgAiACQZ8POwEIIAIgAzoABiAALQDweCEDIAVBChD1AUEKbGoiAkGK8AM7AQggAiADQQBHOgAGIAJBxIqxAjYAAAwCCyAAIAUQbgwBCyACQf8BcUEERwRAIAhBAk8EQCAAIAUgCBCRAQwCCyAAIAUgCBCSAQwBCwJAAkACQAJAAkAgAC0A2fAIDg4AAQEBAQEDAQEBAQECBAELIABB7PAIaiERIAAgCEGEC2xqIgJB/ANqIQwgAkH4AmohEiAIQYAUbCAAakHADWshDyAAIAhBMGxqIhNB7gBqIQkgCEECSSEOA0AgBCAALQDc8AhBBHQgB2oiA0EBajYCwAEgBEG4AmpBCEHRDiAEQcABahDgAgJ/AkAgDkUEQEEAIAktAAAgA00NAhpBAiENQX8hCyAPIANBKGxqIgIQpwEhECACQQpqEKcBIQogAkEUahCnASEGIAJBHmoQpwEhAiAGRQ0BIAJFDQEgCkUNASAQRQ0BQQAhDSADRQ0BQQEhAkE+IANBAWsiBiAGQT5PG0EBaiEQA0ACQCAPIAMgAmtBKGxqIgYQpwENACAGLQACQf8AcSACQf8BcU0NAEEFIQ0MAwsCQCAGQQpqIgoQpwENACAKLQACQf8AcSACQf8BcU0NAEEFIQ0MAwsCQCAGQRRqIgoQpwENACAKLQACQf8AcSACQf8BcU0NAEEFIQ0MAwsCQCAGQR5qIgYQpwENACAGLQACQf8AcSACQf8BcU0NAEEFIQ0MAwsgAiAQRiEGIAJBAWohAiAGRQ0ACwwBC0EAIBIgESAALQDb8AhqLQAAQQ9xIgtBA3RqLQAAIANNDQEaQQAgDCALQQZ0aiADaiwAACICQQFxa0ECQQQgAkEAThtxIQ0LQQMgDSAAIAggCxASIANGGwshAyAHEPQBIQIgBCAEQbgCajYCsAEgBSACQQpsaiICQQZB1QogBEGwAWoQ4AIgAkEAOwEIIAIgAzoABiAHQQFqIgdBEEcNAAsgCEECSQRAIAAgBSAIQQEQcQwFCyAAIAggBEGwAmoQECENQQAhAkEAIQYgACwApPEIIgNBAE4EQCAEQcACaiEOQQAhCSAIQYAUbCAAakHADWsiByADIgxBKGxqIgMQpwFFBEAgDkEANgIAQQEhCQsgA0EKahCnAUUEQCAOIAlBAnRqQQE2AgAgCUEBaiEJCyAHIAxBKGxqIgxBFGoQpwFFBEAgDiAJQQJ0akECNgIAIAlBAWohCQsgDEEeahCnAQR/IAkFIA4gCUECdGpBAzYCACAJQQFqCyEGCyATQe8AaiEOIAQoAsACQQpsIRAgBCgCxAJBCmwhESAEKALIAkEKbCESIAQoAswCQQpsIQkDQCAEKAKwAiANIAIgACwA+PAIQQJBAyAOLQAAQf4BcUECRhtqELcBIQcCf0EBIAZFDQAaQQJBASAHIA8gACwApPEIQShsaiILIBBqLQAARhsiAyAGQQFGDQAaQQIgAyAHIAsgEWotAABGGyIDIAZBAkYNABpBAiADIAcgCyASai0AAEYbIgMgBkEDRg0AGkECIAMgByAJIAtqLQAARhsLIQMgB0EMb0ECdEHggAFqKAIAIQcgCBADIQsgAhD1ASEKIAQgBzYCoAEgBSAKQQpsaiIHQQZB1QogBEGgAWoQ4AIgByALOwEIIAcgAzoABiACQQFqIgJBCEcNAAsgBSEDQX8hDCAAIgItANvwCCIIQQFNBEAgAiAIai0A7PAIQQ9xIQwLIAJBGGogCCAMEKgBIQwgAi0A3PAIIQcgA0EIEPUBQQpsaiIIQb/fAzsBCCAIQQVBACAHGzoABiAIQTw7AAAgAi0A3PAIIQggA0EJEPUBQQpsaiICQb/fAzsBCCACQT47AAAgAkEFQQAgDEEPakEQbUEBayAIQf8BcUobQQAgDEEAShs6AAYgBUGuLkECQQEgAC0A/PAIG0HA+AMQcgwECyAIQQJPBEAgACAFIAgQkQEMBAsgACAFIAgQkgEgACAFIAhBABBxDAMLIAAtAOGKAUUNAiAALQDfigENAkEAIQIDQCAEIAJBAWoiAzYCoAIgBEG4AmpBCEHRDiAEQaACahDgAiACEPQBIQIgBCAEQbgCajYCkAIgBSACQQpsaiICQQZB1QogBEGQAmoQ4AIgAkGK8AM7AQggAkEBOgAGIAMiAkEQRw0ACwwCCwJ/QQAgACAEQcACahAVIgJFDQAaQQAgBEHAAmogAC0A0a0IIAJvai0AACICQQdLDQAaIAAgAkHUAGxqLQConQhBAEcLIQdBACECA0AgBCACQQFqIgM2AoACIARBuAJqQQhB0Q4gBEGAAmoQ4AIgAhD0ASECIAQgBEG4Amo2AvABIAUgAkEKbGoiAkEGQdUKIARB8AFqEOACIAJBv98DOwEIIAIgBzoABiADIgJBEEcNAAsgBUEAEPUBQQpsaiICQb/fAzsBCCACIAc6AAYgAkHIktECNgAAIAVBARD1AUEKbGoiAkGI0QAvAAA7AAAgAkG/3wM7AQggAiAHOgAGIAJBitEALQAAOgACIAVBAhD1AUEKbGoiAkG/3wM7AQggAiAHOgAGIAJBODsAACAFQQMQ9QFBCmxqIgJBv98DOwEIIAIgBzoABiACQdCCkQI2AAAgBUHvLiAHQYrwAxByDAELIABBgBlqIQ8gAEGw+AhqIQsDQCAEIAMiAkEBaiIDNgLgASAEQbgCakEIQdEOIARB4AFqEOACIAAoAsj3CCALIAJBAnRqKAIASSEGAn9BAiACIAAtAO3wCEEPcUYNABpBACAPIAJBDGxqIggtAABBB0sNABpBBUEAIAgvAQgbCyEHQQEQAyEIIAIQ9AEhAiAEIARBuAJqNgLQASAFIAJBCmxqIgJBBkHVCiAEQdABahDgAiACIAg7AQggAiAHOgAGIAIgBjoAByADQRBHDQALIAVBABD1AUEKbGoiAkG/3wM7AQggAkEBOgAGIAJBw6DlAjYAACAFQQEQ9QFBCmxqIgJBv98DOwEIIAJBAToABiACQdCm0QI2AAAgBUECEPUBQQpsaiICQb/fAzsBCCACQQE6AAYgAkHDmMkCNgAAIAVBAxD1AUEKbGoiAkG/3wM7AQggAkEBOgAGIAJByJLRAjYAACAALQDm9QghAyAFQQgQ9QFBCmxqIgJBh/0DOwEIIAIgA0EBcUEBajoABiACQdKK2QI2AAAgAC0A5vUIIQMgBUEJEPUBQQpsaiICQYf9AzsBCCACQQJBASADQQJxGzoABiACQciYmQI2AAAgAC0A5vUIIQMgBUEKEPUBQQpsaiICQYf9AzsBCCACQQJBASADQQRxGzoABiACQdOo1QI2AAALAkAgAC0AlvYIRQ0AIAAsAJn2CCICQQBODQAgAkF+Rg0AIAEgAkH/AHFBG3BBCmxqIgJBAzsBBiACLQAADQAgAkHZis0CNgAACwJAIAAtAJXxCEUNACAALQCY8QhBAkcNACAALQDa8AgNACAALQDY8AhBBEcNACAALQDb8AgiAkEBSw0AIAAtAJnxCCIDQQ9xIQUCfwJAAkAgAC0A2fAIDg4AAQEBAQEDAQEBAQEDAwELIAAgAmotAOzwCCADc0EIcQ0CIAVBB3EQ9QEMAQsgBRD0AQsiAEEASA0AIAEgAEEKbGoiAC0AAEUNACAAQQM7AQYLIARB4AJqJAALuA0BDn8jAEEwayIEJAAgACACIARBHGoQECIPELYBIQoCQCAAKALI9wggACACQQJ0aigC2PcITw0AIAAgAkF/EBIiC0EASA0AAn8gAkGAFGwgAGpBwA1rIgwgC0EobGoiAxCnAQRAIARBIGoMAQsgBEEANgIgQQEhBiAEQSBqQQRyCyEFIANBCmoQpwFFBEAgBUEBNgIAIAZBAWohBgsgDCALQShsaiIDQRRqEKcBRQRAIARBIGogBkECdHJBAjYCACAGQQFqIQYLAkAgA0EeahCnAUUEQCAEQSBqIAZBAnRqQQM2AgAgBkEBaiEGDAELIAYNAEEAIQYMAQsgBkEDcSENQQAhAyAGQQRPBEAgBkEMcSEOIAwgC0EobGohBQNAIARBGGogA2ogBSAEQSBqIANBAnRqKAIAQQpsai0AADoAACADQQFyIgggBEEYamogBSAEQSBqIAhBAnRqKAIAQQpsai0AADoAACADQQJyIgggBEEYamogBSAEQSBqIAhBAnRqKAIAQQpsai0AADoAACADQQNyIgggBEEYamogBSAEQSBqIAhBAnRqKAIAQQpsai0AADoAACADQQRqIQMgCUEEaiIJIA5HDQALCyANRQ0AIAwgC0EobGohBQNAIARBGGogA2ogBSAEQSBqIANBAnRqKAIAQQpsai0AADoAACADQQFqIQMgB0EBaiIHIA1HDQALCyACEAMhCAJAAkAgAC0AI0UEQCAALQDY8AhBBEcNASAALQDZ8AhBCkcNAQsgACACQTBsakHvAGohAkEAIQMgBC0AGyEMIAQtABohECAELQAZIQsgBC0AGCEOIAZBAEwhDQNAIAQoAhwgDyADIAAsAPjwCEECQQMgAi0AAEH+AXFBAkYbahC3ASEFQQAhBwJAIA0NACAFIA5GIgcNACAGQQFGDQAgBSALRiIHDQAgBkECRg0AIAUgEEYiByAHIAUgDEYgBkEDRhtyIQcLIAVBDG9BAnRB4IABaigCACEFIAMQ9AEhCSAEIAU2AgAgASAJQQpsaiIFQQZB1QogBBDgAiAFIAg7AQggBUEBQQUgAyAKbxs6AAYgBSAHQQFxOgAHIANBAWoiA0EQRw0ACyABQQAQ9QFBCmxqIgMgCDsBCCADQQE6AAYgA0HJADsAACABQQEQ9QFBCmxqIgNB+zEvAAA7AAAgAyAIOwEIIANBAToABiADQf0xLQAAOgACIAFBAhD1AUEKbGoiAyAIOwEIIANBAToABiADQcmSpQI2AAAgAUEDEPUBQQpsaiIDQc0SLwAAOwAAIAMgCDsBCCADQQE6AAYgA0HPEi0AADoAAiABQQQQ9QFBCmxqIgMgCDsBCCADQQE6AAYgA0HWADsAACABQQUQ9QFBCmxqIgNB2jEvAAA7AAAgAyAIOwEIIANBAToABiADQdwxLQAAOgACIAFBBhD1AUEKbGoiAyAIOwEIIANBAToABiADQdaSpQI2AAAgAC0ApPUIIQUgAUEHEPUBQQpsaiIDQaLQAC8AADsAACADQYf9AzsBCCADIAVBAXFBAWo6AAYgA0Gk0AAtAAA6AAIgAC0ApPUIIQUgAUEIEPUBQQpsaiIDQd/OAC8AADsAACADQYf9AzsBCCADQQJBASAFQQJxGzoABiADQeHOAC0AADoAAiAALQCk9QghBSABQQkQ9QFBCmxqIgNBytIALwAAOwAAIANBh/0DOwEIIANBAkEBIAVBBHEbOgAGIANBzNIALQAAOgACIAAtAKT1CCEFIAFBChD1AUEKbGoiA0HD0QAvAAA7AAAgA0GH/QM7AQggA0ECQQEgBUEIcRs6AAYgA0HF0QAtAAA6AAIMAQtBACEJIApBAEoEQEEAIQMDQCADQQEgBCgCHCAPIAlBABC3AUEMb3RyIQMgCUEBaiIJIApHDQALIANB//8DcSEJCyAAIAJBMGxqQe8AaiECIAQtABshCyAELQAaIQwgBC0AGSEOIAQtABghDSAGQQNGIRBBACEDA0AgBCADIAAsAPjwCEEMbGpBdEEAIAItAABB/gFxQQJGG2oiD0GtAWrBQQxvIgdBAnRB4IABaigCADYCECABIANBCmxqIgVBBkHVCiAEQRBqEOACIAQoAhwhCiAFIAg7AQggBUEFIAkgB3ZBAXEgByAKRhs6AAZBACEHAkAgBkEATA0AIA9BNWoiCiANRiIHDQAgBkEBRg0AIAogDkYiBw0AIAZBAkYNACAKIAxGIgcgByAKIAtGIBAbciEHCyAFIAdBAXE6AAcgA0EBaiIDQRtHDQALCyAEQTBqJAALnAQBD38jAEEQayIJJAAgACACQYQLbGpB+AJqIAJBgBRsIABqQcANayACQQJJGyIKQYQBaiEMIABB7PAIaiENIABB/AJqIQ4gAEHw9whqIQ8gAEHgAGohEANAQQFBwAAgCiAEQQN0IghqIhEtAAAiAyADQcAATxsiBiAGQQFNG0EQIAMbIQcgDCAEQQZ0aiEGQQAhAwNAIAMgBmotAABBAXEiBUUEQCADQQFqIgMgB0cNAQsLQQAhCwJAIAVFDQAgACgCyPcIIA8gAkEGdGogBEECdGooAgBPDQAgCi8BgAEgBHZBAXFFIQsLAkAgAkUEQCAQLQAAQQNwIgVBBnQgBEECdGpBsOEAaiIHIAcgCCAOai0AACIDQQJ0QfDiAGogAyAFQdQBbEHw+QBqIARBDWxqLQAKRhsgA0ELSxsiCC0AAA0BCyAAIAIgBBARIQgLAn9BAiANIAAtANvwCGotAABBD3EgBEYNABpBAUHAACARLQAAIgMgA0HAAE8bIgUgBUEBTRtBECADGyEHQQAhAwNAIAMgBmotAABBAXEiBUUEQCADQQFqIgMgB0cNAQsLQQAgBUUNABpBAUEFIAovAYABIAR2QQFxGwshBiACEAMhBSAEEPQBIQMgCSAINgIAIAEgA0EKbGoiA0EGQdUKIAkQ4AIgAyAFOwEIIAMgBjoABiADIAs6AAcgBEEBaiIEQRBHDQALIAlBEGokAAvjAQEEfyMAQRBrIgMkAEGb3t8ALQAAIQIgAEEANgIAAkBBmN7fAC0AAEEERw0AAkACQAJAAkBBmd7fAC0AACIEQQFrDg0AAAIEBAQEBAQEBAQBBAsCQCACBEAgAkEwbEGv7tYAaiIBLQAAIANBDGoQnwFFDQRBmd7fAC0AAEEBRw0EIAEtAAAgABCfAQ0BDAQLIARBAkcNAyAAQQI2AgALIAJBst7fAGohAQwDCyAAQQQ2AgBBs97fACEBDAILIABBAjYCAEG96N8AIQEMAQtBACEBIABBADYCAAsgA0EQaiQAIAELsQUBB38jAEFAaiIDJABBwO3WACAAIAFB/wAgAiAAQTBsQcDt1gBqIAFqLQBYaiICIAJB/wBOGyICQQAgAkEAShsiBhALAkBBud7fAC0AAEUNAEHc99cALQAARQ0AIABBAkkNACABIANqQRRqIQcgAEGAFGxBgODWAGohCEEAIQIDQAJAIAJBreDfAGoiBCwAACIFQQBIDQAgACACQZLg3wBqLQAARw0AIANBGGoiCSAIIAVBKGxqIgUvAAg7AQAgAyAFKQAANwMQIANBEGoQpwFFBEAgByAGOgAAIAAgBCwAAEEAIANBEGoQCQsgCSAIIAQsAABBKGxqIgUvABI7AQAgAyAFKQAKNwMQIANBEGoQpwFFBEAgByAGOgAAIAAgBCwAAEEBIANBEGoQCQsgCSAIIAQsAABBKGxqIgUvABw7AQAgAyAFKQAUNwMQIANBEGoQpwFFBEAgByAGOgAAIAAgBCwAAEECIANBEGoQCQsgCSAIIAQsAABBKGxqIgUvACY7AQAgAyAFKQAeNwMQIANBEGoQpwFFBEAgByAGOgAAIAAgBCwAAEEDIANBEGoQCQtBzOjfAEEBOgAACyACQQFqIgJBG0cNAAsLQcDt1gAgACABIAYgA0E0akEMEGQgAwJ/AkACQAJAIAAOAgEAAgsgAUECdEHA3QBqKAIADAILIAFBAnRB0N0AaigCAAwBCyAAQTBsQcDt1gBqIgItAG8iBEEFRgRAQfgkIAIgAUEBdGpB8fYAai0AACICRQ0BGiACQQ1wQQJ0QeDxAGooAgAMAQtB+CQgBCABEKEBIgJFDQAaIAIoAgALEJkBNgIEIAMgAEEBajYCACADQRBqQRZBxwkgAxDgAkHA7dYAIAEgA0EQaiADQTRqQajZACAGQQF0QX8gARAFEA4gA0FAayQAC7EDAQJ/An8CQAJAAkACQCAAQQNxIgBBAWsOAwECAwALQeDt1gAtAAAhBAJAQezo3wAsAAAiAwRAIAFBAEwgA0EASnMNAQtBf0EBIAFBAEwbIQMLQQggAyAEasFBDG8iAUEMakH//wNxIgMgA0EMayABQQBIGyIBEAwgAUECdEHggAFqKAIADAMLQeHt1gAtAAAhBAJAQezo3wAsAAAiAwRAIAFBAEwgA0EASnMNAQtBf0EBIAFBAEwbIQMLQQkgAyAEasFBCW8iAUEJakH//wNxIgMgA0EJayABQQBIGyIBEAwgAUECdEGQgQFqKAIADAILIAFBAEoiAUHj7dYALQAARwRAQQsgARAMC0HwKUGRNyABGwwBC0Hi7dYALQAAIQQCQEHs6N8ALAAAIgMEQCABQQBMIANBAEpzDQELQX9BASABQQBMGyEDC0EKIAMgBGrBQQVvIgFBBWpB//8DcSIDIANBBWsgAUEASBsiARAMIAFBAnRB0N4AaigCAAshAUHA7dYAIAIgAEECdEHA5ABqKAIAIAFBqNkAQYABQX8gAkEASAR/Qb/fAwUgAhAFCxAOC74DAQl/IABFBEBBAA8LIAAoAABBwpqxugRHBEBBAA8LIAAtAARBAUcEQEEADwsgACgAFCIDQYCAAUsEQEEADwsgAC0ABiAALQAHQQh0ciIEQQZsIgJBHWogA0sEQEEADwsgAC0AEwRAQQAPCyAAQRxqIQYgA0EcayIFBH9BfyEBA0AgASAGIAdqLQAAcyIBQR50QR91QaCG4u1+cUEAIAFBAXFrQaCG4u1+cSABQQF2cyIIQQF2cyIJQRp0QR91QaCG4u1+cSAIQRp0QR91QZCD8bYHcSABQRp0QR91QcjBuNsDcSABQRt0QR91QeSg3O0BcSABQRx0QR91QbKQ7vYAcSABQR10QR91QZmItztxIAlBBnZzc3Nzc3MhASAHQQFqIgcgBUcNAAsgAUF/cwVBAAsgACgAGEcEQEEADwsgACADakEBay0AAARAQQAPCwJAIARFDQAgBSACayIAIAYgBEECdGoiAS8AAE0EQEEADwtBASECIARBAUYNAANAIAEgAkEBdGovAAAgAE8EQEEADwsgBiACQQJ0aiIFKAAAIAVBBGsoAABNBEBBAA8LIAJBAWoiAiAERw0ACwsgAws6AQF/QZzUCyAANgIAIAAEQCAALwAGIQFBotQLIAApAAg3AABBqtQLIAAoABA2AAALQaDUCyABOwEACxEAQaLUC0GRM0Gc1AsoAgAbC80BAQd/AkAgAEUNAEGc1AsoAgAiA0UNACAALQAAIgFFDQBBxbvyiHghBCAAIQIDQCAEIAFB/wFxc0GTg4AIbCEEIAItAAEhASACQQFqIQIgAQ0AC0EAIQFBoNQLLwEAIgVFDQAgA0EcaiEGIAVBAWshAgNAIAQgBiABIAJqQQJtIgNBAnRqKAAAIgdGBEAgBiAFQQJ0aiADQQF0ai8AACAGIAVBBmxqag8LIANBAWogASAEIAdLIgcbIgEgAiADQQFrIAcbIgJMDQALCyAAC4YEAQd/AkAgAEUNAEGc1AsoAgAiA0UNACAALQAAIgJFDQBBxbvyiHghBCAAIQEDQCAEIAJB/wFxc0GTg4AIbCEEIAEtAAEhAiABQQFqIQEgAg0AC0EAIQJBoNQLLwEAIgdFDQAgA0EcaiEFIAdBAWshAQNAIAQgBSABIAJqQQJtIgNBAnRqKAAAIgZHBEAgA0EBaiACIAQgBksiBhsiAiABIANBAWsgBhsiAUwNAQwCCwsgACAFIAdBAnRqIANBAXRqLwAAIAUgB0EGbGpqIgVGBEAgBQ8LIAAhASAFIQIDQAJAAkAgAS0AACIDQSVGIgRFBEAgAw0BDAILIAEtAAFBJUcNAQsgAUECQQEgBBtqIQEMAQsDQAJAAkAgAi0AACIGQSVGIgRFBEAgBg0BIAAgBSADGyEADAULIAItAAFBJUcNAQsgAkECQQEgBBtqIQIMAQsLIANFDQEDQAJAIAFBAWohAyACQQFqIQIgAS0AASIERQ0AIARB3wFxQdsAa0H/AXFB5QFLDQAgAyEBIAItAAAgBEYNAQwDCwsDQAJAIARB/wFxIgFB6ABrIgRBEksNAEEBIAR0QZGAEHFFDQAgASACLQAARw0DIAJBAWohAiADLQABIQQgA0EBaiEDDAELCyABIAItAABHDQEgAiABQQBHIgFqIQIgASADaiEBDAALAAsgAAsZAEMAACBBIACyQwQCAT2UENkCQ28SgzqUCxQAIACyQ0UikT2UEMwCQ83MTD2UCycBAX9BqNkAIQEgAEECayIAQQRNBH8gAEECdEHA/wBqKAIABSABCwukAQEDfyABQQNvIgFBA2ogASABQQBIG0HUAWwhBANAIAAgA0EDdGoiASAEIANBDWxqIgJB/vkAai0AADoABiABIAJB/fkAai0AADoABSABIAJB/PkAai0AADoAAyABIAJB+/kAai0AADoAAiABIAJB+vkAai0AADoABCABIAJBgPoAai0AADoAByABIAJB//kAai0AADoAASADQQFqIgNBEEcNAAsLNgECfyABIABBAmsiAEEETQR/IABBAnQiAkHo/wBqKAIAIQMgAkHU/wBqKAIABSACCzYCACADCzABAX9BfyECAkAgAEEHa0F7SQ0AIAFBAksNACAAQQNsIAFqQeb+AGosAAAhAgsgAgvBAQEIfwJAAkAgAEECayICQQVPBEAgAUEDcSEDDAELIAFBA3EiA0GAAXIhBSACQQJ0IgFB6P8AaigCACEGIAFB1P8AaigCACEHA0AgBiAEQThsaiIBLQAEIggEQCABQQhqIQlBACEBA0AgBSAJIAFBDGxqIgItAARGDQQgAUEBaiIBIAhHDQALCyAEQQFqIgQgB0cNAAsgAEEDRw0AQfz+ACECIANBA0YNAQsgA0EMbEGQ/wBqQQAgAEEFRhshAgsgAgurAQECfyACLAAEIgNB/wFxIQQgA0EASARAIAAgAUEwbGogBEEDcWpBQGstAAAPCyADQcAATwRAIAAgAUEwbGogA0E/cWpBQGstAAAPCyAAQbj2AGohAyACLQAHQRBGBEAgAyABQTBsaiICLQAYIgNFBEBBwAAPC0E/IANBAWpBAXYiAyADQT9PG0HAAHJBwAAgA2sgAi0AGUEBRhsPCyADIAFBMGxqIARqLQAAC/sFARF/IABBuPYAaiIQIAFBMGwiAmoiBUIANwEAIAVCADcBKCAFQgA3ASAgBUIANwEYIAVCADcBECAFQgA3AQggACACaiIAQUBrIQkgAC0AVyIPQQJrQf8BcSIKQQJ0IgBB6P8AaiELIABB1P8AaiEMIAVBGWohEQNAAkAgCkEESw0AIAZBgAFyIQ0gCygCACEOIAwoAgAhB0EAIQgCQANAIA4gCEE4bGoiAC0ABCIDBEAgAEEIaiEEQQAhAANAIA0gBCAAQQxsaiICLQAERg0DIABBAWoiACADRw0ACwsgCEEBaiIIIAdHDQALIA8iAEEDRgRAQfz+ACECIAZBA0YNAQsgAEEFRw0BIAZBDGxBkP8AaiECCyACLQAFIQMgAiwABCIAQQBIBEAgCSAAQQNxaiADOgAADAELIABBwABPBEAgCSAAQT9xaiADOgAADAELAkAgAi0AB0EQRyICBEAgAyEEDAELQf8AIANBAXQiAEGAAWtBgAEgAGsgA0HAAEsbIgAgAEH/AE4bIQQgA0E/SyESQRghAAsgAEEvTQRAIAAgBWogBDoAAAsgAg0AIBEgEjoAAAsgBkEBaiIGQQRHDQALIA9BAmsiAEH/AXFBBE0EQCAAQQJ0QfwHcSIAQej/AGooAgAhDCAAQdT/AGooAgAhBUEAIQcgECABQTBsaiIKQRlqIQsDQCAMIAdBOGxqIgAtAAQEQCAAQQhqIQ0gAC0ABCEIQQAhAANAAkAgDSAAQQxsaiIDLQAEIgJB0ABGDQAgAy0ABSEEIALAQQBIBEAgCSACQQNxaiAEOgAADAELIAJBwABPBEAgCSACQT9xaiAEOgAADAELAkAgAy0AB0EQRyIDBEAgBCEGDAELQf8AIARBAXQiAkGAAWtBgAEgAmsgBEHAAEsbIgIgAkH/AE4bIQYgBEE/SyEOQRghAgsgAkEvTQRAIAIgCmogBjoAAAsgAw0AIAsgDjoAAAsgAEEBaiIAIAhJDQALCyAHQQFqIgcgBUcNAAsLC7oCAQN/AkAgACABQTBsaiIELQBXIgVBAmsiA0H/AXFBBEsNACAEQUBrIQQgACABEKMBAkACQCADDgMAAQIBCyAEQQc6AA0gBCACQQxvIgNBDGogAyADQQBIG0EMbCIDQajmAGotAAA6ABggBCADQaTmAGooAgA2AAAgACABQTBsakG49gBqIANBquYAai0AADoAAA8LIAUQ0QEiA0UNACAFIAIgA28gA2ogA28Q0gEiA0UNACAAIAFBMGxqIgFB4PYAaiADKQBQNwAAIAFB2PYAaiADKQBINwAAIAFB0PYAaiADQUBrKQAANwAAIAFByPYAaiADKQA4NwAAIAFBwPYAaiADKQAwNwAAIAFBuPYAaiIBIAMpACg3AAAgBCADKAAkNgEAIAVBBUcNACABQQA6AA0gAUEAOgAGCwv4CQIDfwF9IwBB4AJrIgQkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAtAAcOEwABAgMEBQYHCAkREQoLDA0ODxARCyAEIAFB5ABsQT9qQf8AbTYCECACIANBjtkAIARBEGoQ4AIMEQsgBCABQUBqNgIgIAIgA0G8CyAEQSBqEOACDBALIAQgAUEYbEGADGtBP202AjAgAiADQawUIARBMGoQ4AIMDwsgBCABQQNsQcABa0EIbTYCQCACIANBrBQgBEFAaxDgAgwOCyAEIAFBMmxBgBlrQT9tNgJQIAIgA0GKGCAEQdAAahDgAgwNCyABskOFQqE9lBDMAkMAAKBBlCIHQwAAekRdBEAgBAJ/IAeLQwAAAE9dBEAgB6gMAQtBgICAgHgLNgJgIAIgA0G8DyAEQeAAahDgAgwNCyAEIAdDAAB6RJW7OQNwIAIgA0GdDyAEQfAAahDgAgwMC0MAACBBIAGyQwQCAT2UENkCQ28SgzqUIgdDAACAP10EQCAEAn8gB0MAAHpElEMAAAA/kiIHi0MAAABPXQRAIAeoDAELQYCAgIB4CzYCgAEgAiADQZ0bIARBgAFqEOACDAwLIAQgB7s5A5ABIAIgA0GvHiAEQZABahDgAgwLCyAEIAGyQ0UikT2UEMwCQ83MTD2UIge7OQOgASACIANBrA9BtA8gB0MAACBBXRsgBEGgAWoQ4AIMCgtBs84AIQUCQCAAKAIIIgZFDQAgASAALQAGSg0AIAYgAUECdGooAgAhBQsgBCAFNgKwASACIANB1QogBEGwAWoQ4AIMCQsgBEHvG0GEJiABGzYCwAEgAiADQdUKIARBwAFqEOACDAgLIAQgAUEYazYC0AEgAiADQawUIARB0AFqEOACDAcLAn9D/ij0QEH/ACABIAFB/wBOGyIBQQAgAUEAShuzQwQCATyUENkCQ1vonEOUQwAAAD+SIgdDAACAT10gB0MAAAAAYHEEQCAHqQwBC0EACyIBQecHTQRAIAQgATYC4AEgAiADQaYPIARB4AFqEOACDAcLIAQgAUHoB24iADYC8AEgBCABIABB6Adsa0H//wNxQeQAbjYC9AEgAiADQZMPIARB8AFqEOACDAYLAn9DAAAgQUH/ACABIAFB/wBOGyIBQQAgAUEAShuzQwQCATyUENkCQwAASEOUQwAAAD+SIgdDAACAT10gB0MAAAAAYHEEQCAHqQwBC0EACyIBQecHTQRAIAQgATYCgAIgAiADQZcbIARBgAJqEOACDAYLIAQgAUHoB24iADYCkAIgBCABIABB6Adsa0H//wNxQeQAbjYClAIgAiADQaceIARBkAJqEOACDAULIAQgAUHoB2xBwD5qQf4BbTYCoAIgAiADQZ0bIARBoAJqEOACDAQLIAFBwABGBEAgAiADQZE3QQAQ4AIMBAsgBEHAACABayABQUBqIAFBwABIIgEbQcgBbEE/akH/AG02ArACIAIgA0GC2QBBzdgAIAEbIARBsAJqEOACDAMLIAEEQCAEIAE2AsACIAIgA0HRDiAEQcACahDgAgwDCyACIANB4TNBABDgAgwCCyABBEAgBCABQQFrNgLQAiACIANB0Q4gBEHQAmoQ4AIMAgsgAiADQeEzQQAQ4AIMAQsgBCABNgIAIAIgA0HRDiAEEOACCyAEQeACaiQACxQAIABBADsACCAAQv/JhaB2NwAACwsAIAAtAABB/wFGC04AQRAgAUEBTAR/IAAgAUGEC2xqIAJBACACQQBKG0EPcUEDdGpB4AJqBSAAIAFBMGxqQdYAagstAAAiASABQQFrQf8BcUHAAE8bQf8BcQvOAgECfyAAQgA3AAggAEEYaiICQgA3AAAgAEEQaiIDQgA3AAAgAEIANwAgIABBADoABiAAQeSAATsABCAAQeC88AE2AAAgAEIANwAoIAAgAUEBRjoADiAAQdDQoPEBNgAKIAAgAToAGSACQeQAOgAAIABBEDoAFiAAQYGC8BE2ABIgA0EYOgAAIABBPEEAIAFBAEobOgAHIABBif4DOwAaIABBGDoAJiAAQf8BOgAkIAAgAUEGcEHMgAFqLQAAOgAXIAFFBEAgAEHAgIGCBDYAAA8LIAFBAUYEQCAAQoCAgIDAjIWUCjcAHCAAQf8BOgAIIABB/4D9AzYAAA8LIAFBAk4EQCAAQQA6AAgLAkACQAJAAkAgAUEDaw4DAAECAwsgAEEeOgAnIABBHjoABg8LIABBKDoAJyAAQRQ6AAYPCyAAQTI6ACcgAEEKOgAGCwuSAwECfyAAQQRqQQBBgAsQvgIaIABBwIABOwB9IABBkMiBggQ2AHggAEHAgAE7AHUgAEGQyIGCBDYAcCAAQcCAATsAbSAAQZDIgYIENgBoIABBwIABOwBlIABBkMiBggQ2AGAgAEHAgAE7AF0gAEGQyIGCBDYAWCAAQcCAATsAVSAAQZDIgYIENgBQIABBwIABOwBNIABBkMiBggQ2AEggAEHAgAE7AEUgAEGQyIGCBDYAQCAAQcCAATsAPSAAQZDIgYIENgA4IABBwIABOwA1IABBkMiBggQ2ADAgAEHAgAE7AC0gAEGQyIGCBDYAKCAAQcCAATsAJSAAQZDIgYIENgAgIABBwIABOwAdIABBkMiBggQ2ABggAEHAgAE7ABUgAEGQyIGCBDYAECAAQcCAATsADSAAQZDIgYIENgAIIABBwIABOwAFIABBkMiBggQ2AAAgAEGFCWohAgNAIAIgAUECdGoiAEH/AToAACAAQf8BOgAEIABB/wE6AAggAEH/AToADCABQQRqIgFBwABHDQALC+8BAQF/AkAgAUECTgRAIAFBgBRsIABqQdgNayEAA0AgACACQShsaiIBQQA7ACYgAUF/NgAiIAFBgcgBOwAgIAFC/////4+AwP/kADcAGCABQYHIATsAFiABQv////+PgMD/5AA3AA4gAUGByAE7AAwgAUGAgPynBjYACCABQv/JhaB2NwAAIAJBAWoiAkHAAEcNAAsMAQsgACABQYQLbGoiAUHkA2pBAEGACBC+AhogAUHlC2ohAANAIAAgAkECdGoiAUH/AToAACABQf8BOgAEIAFB/wE6AAggAUH/AToADCACQQRqIgJBwABHDQALCwsmACAAQQJrQQNNBEAgAUECa0EFSQ8LIAEgAEEGcEHMgAFqLQAARguMAQEBf0F/IQMCQCACQQVrQQFLDQBBAiEDAkACQAJAIAFBAkcEQCACIAAtALcBRg0EQQMhAyABQQNGDQEgAiAALQDnAUYNBCABQQRGDQIMAQsgAiAALQDnAUcNAEEDDwsgAC0AlwIgAkYEQEEEDwsgAUEFRg0BCyACIAAtAMcCRw0AQQUPC0F/IQMLIAML6gIBA38CQCABQQJIDQACQCABQQJrIgNBA00EQCACQQJrQQVJDQEMAgsgAiABQQZwQcyAAWotAABHDQELIAIgACABQTBsai0AV0YNAAJAIAJBBWtBAUsNAAJAAkAgAUECRwRAIAIgAC0AtwFGDQQgAUEDRg0BIAIgAC0A5wFGDQQgAUEERg0CDAELIAIgAC0A5wFGDQMLIAIgAC0AlwJGDQIgAUEFRg0BCyACIAAtAMcCRg0BCyAAIAFBMGxqIgVBADoASCAFIAI6AFcgACABQQAQpAEgACADQYAUbGoiAUHKGmohAiABQcAaaiEAIAFBthpqIQMgAUGsGmohBQNAIAUgBEEobCIBakF/NgAAIAEgA2pBfzYAACAAIAFqQX82AAAgASACakF/NgAAIAUgBEEBckEobCIBakF/NgAAIAEgA2pBfzYAACAAIAFqQX82AAAgASACakF/NgAAIARBAmoiBEHAAEcNAAsLC+kIAQZ/IABBCmpBAEHO+AAQvgIaIABBiDA7ABEgAEEDOgAPIABCsoiIkMPHzIQBNwECIABBsAk7AQAgAEFAa0EAEKkBIABB8ABqQQEQqQFBAiECIABBoAFqQQIQqQEgAEHQAWpBAxCpASAAQYACakEEEKkBIABBsAJqQQUQqQEgAEHgAmoiBBCqASAAQeQNahCqASAAQgA3AegYIABCADcB9BggAEIANwGAGSAAQgA3AYwZIABB8BhqQQA2AQAgAEH8GGpBADYBACAAQYgZakEANgEAIABBlBlqQQA2AQAgAEEUOgDtGCAAQRg6AOoYIABB/wE6AOgYIABB/wE6APQYIABBGDoA9hggAEEUOgD5GCAAQf8BOgCAGSAAQRg6AIIZIABBFDoAhRkgAEEUOgCRGSAAQRg6AI4ZIABB/wE6AIwZIABBoBlqQQA2AQAgAEIANwGYGSAAQRQ6AJ0ZIABBGDoAmhkgAEH/AToAmBkgAEGsGWpBADYBACAAQgA3AaQZIABBFDoAqRkgAEEYOgCmGSAAQf8BOgCkGSAAQbgZakEANgEAIABCADcBsBkgAEEUOgC1GSAAQRg6ALIZIABB/wE6ALAZIABBxBlqQQA2AQAgAEIANwG8GSAAQRQ6AMEZIABBGDoAvhkgAEH/AToAvBkgAEHQGWpBADYBACAAQgA3AcgZIABBFDoAzRkgAEEYOgDKGSAAQf8BOgDIGSAAQdwZakEANgEAIABCADcB1BkgAEEUOgDZGSAAQRg6ANYZIABB/wE6ANQZIABB6BlqQQA2AQAgAEIANwHgGSAAQRQ6AOUZIABBGDoA4hkgAEH/AToA4BkgAEH0GWpBADYBACAAQgA3AewZIABBFDoA8RkgAEEYOgDuGSAAQf8BOgDsGSAAQYAaakEANgEAIABCADcB+BkgAEEUOgD9GSAAQRg6APoZIABB/wE6APgZIABBjBpqQQA2AQAgAEIANwGEGiAAQRQ6AIkaIABBGDoAhhogAEH/AToAhBogAEGYGmpBADYBACAAQgA3AZAaIABBFDoAlRogAEEYOgCSGiAAQf8BOgCQGiAAQaQaakEANgEAIABCADcBnBogAEEUOgChGiAAQRg6AJ4aIABB/wE6AJwaIABBqBpqIQUDQCACQYAUbCAFakGAKGshBkEAIQMDQCAGIANBKGxqIgFBADsAJiABQX82ACIgAUGByAE7ACAgAUL/////j4DA/+QANwAYIAFBgcgBOwAWIAFC/////4+AwP/kADcADiABQYHIATsADCABQYCA/KcGNgAIIAFC/8mFoHY3AAAgA0EBaiIDQcAARw0ACyACQQFqIgJBBkcNAAsgAEG18wBqQQI6AAAgAEGx8ABqQQI6AAAgAEGt7QBqQQI6AAAgAEGp6gBqQQI6AAAgBEEAEJ4BIABB0PjoggQ2ABMgAEECIAAtAKgBEKQBIABBAyAALQDYARCkASAAQQQgAC0AiAIQpAEgAEEFIAAtALgCEKQBCyYAIABCADcBACAAQQA2AQggAEEUOgAFIABBGDoAAiAAQf8BOgAACwoAIAAtAANBBHQL8gEBCH8gAEHkA2ohBiAAQagaaiEHA0ACQCADQQJPBEAgA0GAFGwgB2pBgChrIQRBACEBA0AgAiAEIAFBKGxqIgAtAABB/wFHaiAALQAKQf8BR2ogAC0AFEH/AUdqIAAtAB5B/wFHaiECIAFBAWoiAUHAAEcNAAsMAQsgBiADQYQLbGohCEEAIQUDQCAIIAVBBnRqIQRBACEBA0AgAiABIARqIgAtAABBAXFqIAAtAAFBAXFqIAAtAAJBAXFqIAAtAANBAXFqIQIgAUEEaiIBQcAARw0ACyAFQQFqIgVBEEcNAAsLIANBAWoiA0EGRw0ACyACC44BAQN/IABBhAlqIQVBACEAAkADQAJAIAIgBSAAQQJ0aiIELQABRw0AIAEgBC0AAEcNACADIAQtAAJHDQAgACEGDAILAkAgAiAFIABBAXIiBkECdGoiBC0AAUcNACABIAQtAABHDQAgAyAELQACRg0CCyAAQQJqIgBBwABHDQALQX8PCyAFIAZBAnRqLQADC9sPAhJ/AX5BfyENIAEgACkAADcAACABIAApADg3ADggASAAKQAwNwAwIAEgACkAKDcAKCABIAApACA3ACAgASAAKQAYNwAYIAEgACkAEDcAECABIAApAAg3AAggASAALQAAOgAAIAAtAAEhAiABQQg6ABEgASACOgABIAFBQGsgAEFAa0GgAhC8AhpBgAUhByABQeACaiAAQbj2AGpBoAIQvAIaIAFBCmohDyABQQlqIRAgAUEEaiERIABB4AJqIRIgAEGoGmohEwJAA0ACQCAMQQFNBEAgB0GEAWoiA0GAwABKDQMgASAHaiASIAxBhAtsaiIHQYABELwCIg4gBy0AgAE6AIABIA4gBy0AgQE6AIEBIAdBhAFqIQlBACEEQQAhCgNAIApBAnYhCyAKQQZ0IQZBACECA0AgBiAJaiACai0AACIFBEAgA0EDaiIIQYDAAEoNBiABIANqIgMgAiAGajoAACADIAU6AAIgAyALOgABIARBAWohBCAIIQMLIAJBAWoiAkHAAEcNAAsgCkEBaiIKQRBHDQALIA4gBDsAggEgA0GAwABODQMgB0GECWohCCADQQFqIQdBACEGQQAhBANAAkAgCCAGQQJ0aiICLQABQf8BRgRAIAchBQwBCyAHQQRqIgVBgMAASg0FIAEgB2ogAigBADYAACAEQQFqIQQLAkAgAi0ABUH/AUYEQCAFIQcMAQsgBUEEaiIHQYDAAEoNBSABIAVqIAIoAQQ2AAAgBEEBaiEECyAGQQJqIgZBwABHDQALIAEgA2ogBDoAACAHQQBIDQMMAQsgB0ECaiICQYDAAEoNAiAMQYAUbCATakGAKGshCkEAIQZBACEFA0AgCiAGQShsaiIDLQAAQf8BRwRAAn8CQCADLQAIRQRAQQtBCSADLQAJIgQbIAJqQYDAAEoNByABIAJqIgggBjoAACAIIAMpAAAiFDcAASAEDQFBCQwCCyACQQtqQYDAAEoNBiABIAJqIgQgBjoAACAEIAMpAAAiFDcAAQsgAiARaiAUp0EYdkGAAXI6AAAgAiAQaiADLQAIOgAAIAIgD2ogAy0ACToAAEELCyACaiECIAVBAWohBQsgAy0ACkH/AUcEQAJ/IANBCmoiCC0ACARAQQshBEEBDAELQQtBCSAILQAJIgkbIQQgCUEARwshCyACIARqQYDAAEoNBCABIAJqIgQgBkFAazoAACAEIAgpAAAiFDcAASAFQQFqIQUgCwR/IAQgFKdBGHZBgAFyOgAEIAQgCC0ACDoACSAEIAgtAAk6AApBCwVBCQsgAmohAgsgAy0AFEH/AUcEQAJ/IANBFGoiCC0ACARAQQshBEEBDAELQQtBCSAILQAJIgkbIQQgCUEARwshCyACIARqQYDAAEoNBCABIAJqIgQgBkGAAXM6AAAgBCAIKQAAIhQ3AAEgBUEBaiEFIAsEfyAEIBSnQRh2QYABcjoABCAEIAgtAAg6AAkgBCAILQAJOgAKQQsFQQkLIAJqIQILIAMtAB5B/wFHBEACfyADQR5qIgQtAAgEQEELIQNBAQwBC0ELQQkgBC0ACSIIGyEDIAhBAEcLIQkgAiADakGAwABKDQQgASACaiIDIAZBQGo6AAAgAyAEKQAAIhQ3AAEgBUEBaiEFIAkEfyADIBSnQRh2QYABcjoABCADIAQtAAg6AAkgAyAELQAJOgAKQQsFQQkLIAJqIQILIAZBAWoiBkHAAEcNAAsgASAHaiAFOwAAIAIhBwsgDEEBaiIMQQZHDQALIAdBA2oiBiAALQCqakECdGpBgMAASg0AIAEgB2oiAiAALQCoajoAACACIAAtAKlqOgABIAIgAC0AqmoiAjoAAiACBEAgAEGs6gBqIQRBACEFA0AgASAGaiICIAQgBUECdGoiAy0AADoAACACIAMtAAE6AAEgAiADLQACOgACIAIgAy0AAzoAAyAGQQRqIQYgBUEBaiIFIAAtAKpqSQ0ACwsgBkEDaiIFIAAtAK5tQQJ0akGAwABKDQAgASAGaiICIAAtAKxtOgAAIAIgAC0ArW06AAEgAiAALQCubSICOgACIAIEQCAAQbDtAGohBEEAIQYDQCABIAVqIgIgBCAGQQJ0aiIDLQAAOgAAIAIgAy0AAToAASACIAMtAAI6AAIgAiADLQADOgADIAVBBGohBSAGQQFqIgYgAC0Arm1JDQALCyAFQQNqIgYgAC0AsnBBAnRqQYDAAEoNACABIAVqIgIgAC0AsHA6AAAgAiAALQCxcDoAASACIAAtALJwIgI6AAIgAgRAIABBtPAAaiEEQQAhBQNAIAEgBmoiAiAEIAVBAnRqIgMtAAA6AAAgAiADLQABOgABIAIgAy0AAjoAAiACIAMtAAM6AAMgBkEEaiEGIAVBAWoiBSAALQCycEkNAAsLIAZBA2oiBSAALQC2c0ECdGpBgMAASg0AIAEgBmoiAiAALQC0czoAACACIAAtALVzOgABIAIgAC0AtnMiAjoAAiACBEAgAEG48wBqIQRBACEGA0AgASAFaiICIAQgBkECdGoiAy0AADoAACACIAMtAAE6AAEgAiADLQACOgACIAIgAy0AAzoAAyAFQQRqIQUgBkEBaiIGIAAtALZzSQ0ACwsgBUHAAWoiAkGAwABKDQAgASAFaiAAQegYakHAARC8AhogAiENCyANC/8SAhB/AX5BfyELAkAgAkHgAkgNACABLQARQQhHDQAgABCvASAAIAEpADg3ADggACABKQAwNwAwIAAgASkAKDcAKCAAIAEpACA3ACAgACABKQAYNwAYIAAgASkAEDcAECAAIAEpAAg3AAggACABKQAANwAAIAEvAAAhAyAAQQg6ABEgACADOwEAIABBQGsgAUFAa0GgAhC8AiEPIAJBgAVJDQAgAEG49gBqIAFB4AJqQaACELwCGiAALQBXBEAgAEEAOgBIIABBADoAVyAAQQBBABCkAQsgAC0AhwFBAUcEQCAAQQA6AHggAEEBOgCHASAAQQFBABCkAQsgAC0AtwFBAmtB/wFxQQVPBEAgAEEAOgCoASAAQQI6ALcBIABBAkEAEKQBCyAALQDnAUECa0H/AXFBBU8EQCAAQQA6ANgBIABBBDoA5wEgAEEDQQAQpAELIAAtAJcCQQJrQf8BcUEFTwRAIABBADoAiAIgAEEFOgCXAiAAQQRBABCkAQsgAC0AxwJBAmtB/wFxQQVPBEAgAEEAOgC4AiAAQQY6AMcCIABBBUEAEKQBCyAAQeACaiENIABBqBpqIRBBgAUhBwNAAkACQCAKQQFNBEAgDSAKQYQLbGoiBRCqASAHQYQBaiIDIAJKDQQgBSABIAdqIgRBgAEQvAIiCCAELwCAATsBgAECQCAELwCCASIJRQRAIAMhBAwBCyAIQYQBaiEHQQAhBQNAIANBA2oiBCACSg0GIAcgASADaiIDLQABQQh0IAMtAAAiBnJBwAdxaiAGQT9xaiADLQACOgAAIAQhAyAFQQFqIgUgCUcNAAsLIAIgBEwNBCAEQQFqIQUgASAEai0AACIERQRAIAUhBwwCCyAIQYQJaiEGQQAhAwNAIAVBBGoiByACSg0FIANBP00EQCAGIANBAnRqIAEgBWooAAA2AQALIAchBSAEIANBAWoiA0cNAAsMAQsgCkGAFGwgEGpBgChrIQVBACEEA0AgBSAEQShsaiIDQQA7ACYgA0F/NgAiIANBgcgBOwAgIANC/////4+AwP/kADcAGCADQYHIATsAFiADQv////+PgMD/5AA3AA4gA0GByAE7AAwgA0GAgPynBjYACCADQv/JhaB2NwAAIARBAWoiBEHAAEcNAAsgB0ECaiIEIAJKDQMgASAHai8AACIMRSEDAkAgDEUEQCAEIQcMAQsgB0ELaiEGQQAhCCAEIQcgAiAGSA0AA0AgASAHaiIEKQABIRMgBSAELQAAIgNBP3FBKGxqIANBBnZBCmxqIgNBADsACCADIBM3AAACQCATp0EYdSIJQQBOBEAgBiEHDAELIAdBC2oiByACSg0GIAMgCUH/AHE6AAMgAyABIAZqLQAAOgAIIANBdUELIAQsAAoiBCAEQQtOGyIEIARBdUwbOgAJCyAIQQFqIgggDE8iAw0BIAdBCWoiBiACTA0ACwsgA0UNAwwBC0EAIQQDQCAIIARBA3RqIgMtAABBwQBrQf8BcUG/AU0EQCADQRA6AAALIAMtAARBEE8EQCADQQA6AAQLIAMgAy0AB0EDcToAByAEQQFqIgRBEEcNAAsgB0EASA0CCyAKQQFqIgpBBkcNAAsgAEHXAGohDCAAQecBaiERIABBlwJqIQ0gAEHHAmohCiAAQbcBaiESA0BBASEGQQIhBQJAAkADQAJAAkAgDCAFQTBsai0AACIDQQVrQf8BcUEBSw0AAn8CQAJAAkAgBUECRwRAQQIgA0H/AXEiBCASLQAARg0EGiAFQQNGDQIgBCARLQAARw0BQQMMBAsgES0AACADQf8BcUcNAUEDDAMLIAVBBEYNAQtBBCANLQAAIANB/wFxRg0BGiAFQQVGDQMLIAotAAAgA0H/AXFHDQFBBQshBCAFIQYgA0H/AXEiAyAFQcyAAWotAABHBEAgBCAFIAQgBCAFSxsgBEHMgAFqLQAAIANGGyEGC0EAIQMgDyAEIAUgBSAGRhsiBEEwbGoiBkEAOgAIIAYgBEHMgAFqLQAAOgAXIAAgBEEAEKQBIARBgBRsIBBqIgRB3idrIQYgBEHoJ2shCCAEQfInayEJIARB/CdrIQsDQCALIANBKGwiBGpBfzYAACAEIAlqQX82AAAgBCAIakF/NgAAIAQgBmpBfzYAACALIANBAXJBKGwiBGpBfzYAACAEIAlqQX82AAAgBCAIakF/NgAAIAQgBmpBfzYAACADQQJqIgNBwABHDQALQQAhBiAFQQFqIgVBBkYNAwwCCyAFQQFqIgVBBkcNAQsLIAYgDkEBaiIOQQRGckEBcUUNAgwBCyAOQQFqIg5BBEcNAQsLQX8hCyAHQQNqIgMgAkoNACAAQajqAGohDUEAIQQDQCANIAQiDEGEA2xqIgkgASAHaiIELQAAOgAAIAkgBC0AASIKOgABIAkgBC0AAiIGOgACIAZB4ABLDQECQCAGRQRAIAMhBwwBCyAJQQRqIQhBACEEA0AgA0EEaiIHIAJKDQMgCCAEQQJ0aiIFIAEgA2oiAy8AADsBACAFIAMtAAI6AAIgBSADLQADOgADIAchAyAEQQFqIgQgBkcNAAsLIApBBE1BAEEBIAp0QRZxG0UEQCAJQQI6AAELIAxBAk0EQCAMQQFqIQQgB0EDaiIDIAJMDQELCyAMQQNJDQAgB0HAAWoiCSACSg0AIABB6BhqIAEgB2pBwAEQvAIhCEEAIQQDQAJAAn8gCCAEQQxsaiIDLQAAQQhPBEAgA0IANwEAIANBADYBCCADQRg6AAIgA0H/AToAAEEFIQZBFAwBCyADLQABQQRJDQFBASEGQQALIQUgAyAGaiAFOgAACyADLQACQTFPBEAgA0EYOgACCyAEQQFqIgRBEEcNAAsgAC8BAEHhEmtB//8DcUGv8ANJBEAgAEGwCTsBAAsgAC0AAkHMAGtB/wFxQeUBTQRAIABBMjoAAgsgAC0AA0EJTwRAIABBBDoAAwsgAC0ACUEJTwRAIABBADoACQsgAC0AEkExTwRAIABBGDoAEgsgACAALQAIQQxwOgAIQQAhBANAIA8gBEEwbGoiAy0AFUEGTwRAIANBAjoAFQsgAy0AFkHBAGtB/wFxQb8BTQRAIANBEDoAFgsgAy0AG0EJa0H/AXFB9QFNBEAgA0H/AToAGwsgAyADLQAaQQxwOgAaIAMgAy0AGUEPcToAGSADLQAmQTFPBEAgA0EYOgAmCyAEQQFqIgRBBkcNAAsgCSELCyALCw8AQQdBBSAAQQlrQX5JGwthAQJ/Qf8AIAAgAUEDdCACIAJBB0EFIAFBCWtBfkkbIgFtIgQgAWxrIgJBH3UiBSABcSACampBwIEBaiwAAGogAyAEaiAFakEMbGpBDGoiASABQf8AThsiAUEAIAFBAEobC5QDAQZ/QQMhCyAFQf8AIABBDGoiCiABQQN0QcCBAWoiByACQQRqIgYgBkEHQQUgAUEJa0F+SRsiAG0iBiAAbGsiCEEfdSIJIABxIAhqaiwAAGogBCAGaiAJakEMbGoiBiAGQf8AThsiBkEAIAZBAEobOgACIAVB/wAgCiAHIAIgAiAAbSIGIABsayIIQR91IgkgAHEgCGpqLAAAaiAEIAZqIAlqQQxsaiIGIAZB/wBOGyIGQQAgBkEAShs6AAAgBUH/ACAKIAcgAkEBQQNBAiADQQRGGyADQQNGG2oiBiAGIABtIgYgAGxrIghBH3UiCSAAcSAIamosAABqIAQgBmogCWpBDGxqIgcgB0H/AE4bIgdBACAHQQBKGzoAAUEGIQcCQAJAAkAgA0EBaw4CAQACC0EIIQcLIAVB/wAgCiABQQN0IAIgB2oiAiACIABtIgIgAGxrIgNBH3UiASAAcSADampBwIEBaiwAAGogAiAEaiABakEMbGoiACAAQf8AThsiAEEAIABBAEobOgADQQQhCwsgCwvnBAEIfyMAQRBrIgkkAEGMCCEKAkACQAJAQQJBAUH/ACACQQRqIgZBB0EFIAFBCWtBfkkbIgdtIgUgBiAFIAdsayIGQR91IghqQQxsIABBDGoiACABQQN0QcCBAWoiBSAHIAhxIAZqaiwAAGpqQSRqIgYgBkH/AE4bIgZBACAGQQBKG0H/ACACIAdtIgYgAiAGIAdsayIGQR91IghqQQxsIAAgBSAHIAhxIAZqaiwAAGpqQSRqIgYgBkH/AE4bIgZBACAGQQBKGyIGa0EYakEMb0H//wNxIghBBkYbQQFB/wAgAkECaiILIAdtIgwgCyAHIAxsayILQR91IgxqQQxsIAAgBSAHIAxxIAtqaiwAAGpqQSRqIgUgBUH/AE4bIgVBACAFQQBKGyAGa0EYakEMbyIFQQNGIgsbQQBBAyAFQQRHIAhBCEdyIggbIAsbQQFrDgIBAgALQajZAEGo2QBB99QAIAhBAXEbIAVB//8DcUEDRhshCgwBC0HcCiEKC0HgzgAhBQJAAkACQAJAAkAgA0EBaw4EAAQBAgMLQZrQAEGj0ABB/wAgAkEGaiICIAdtIgUgAiAFIAdsayICQR91IgVqQQxsIAAgBSAHcSACaiABQQN0akHAgQFqLAAAampBJGoiByAHQf8AThsiB0EAIAdBAEobIAZrQRhqwUEMb0ELRhshBQwDC0Go2QAhCkHK0gAhBQwCC0Go2QAhCkHD0QAhBQwBC0Go2QAhBQsgCSAFNgIIIAkgCjYCBCAJIAZB/wFxQQxwQQJ0QeCAAWooAgA2AgAgBEEKQdYIIAkQ4AIgCUEQaiQAC0cBAn8jAEEQayIDJAAgAyAAQQxtIgRBAWs2AgQgAyAAIARBDGxrQQJ0QeCAAWooAgA2AgAgASACQekLIAMQ4AIgA0EQaiQACy0AIAAgAUEDbyIBQQNqIAEgAUEASBtBBXQgAkEPcUEBdHJBoIIBai8BADsAAAssAAJ/IABBB28iAEEFTQRAQQBBASAAdEElcQ0BGgtBAUECIABBfXFBAUYbCwufAwEKfyMAQRBrIgckACABQQN0QcCBAWoiBSACQQRqIgggCEEHQQUgAUEJa0F+SRsiAW0iCiABbGsiCEEfdSABcSAIamosAAAhCyAFIAJBAmoiBiAGIAFtIgwgAWxrIgZBH3UgAXEgBmpqLAAAIQ0gBSACIAIgAW0iDiABbGsiCUEfdSABcSAJamosAAAhBSAHIANBAWsiAUEDTwR/QcPRAEGo2QAgA0EERhsFIAFBAnRBvIMBaigCAAs2AgggByACQQdvQQJ0QaCDAUGAgwFB/wAgAEEMaiIBIA1qIAZBH3UgDGpBDGxqQSRqIgYgBkH/AE4bIgZBACAGQQBKG0H/ACABIAVqIAlBH3UgDmpBDGxqQSRqIgUgBUH/AE4bIgVBACAFQQBKGyIFa0EYakEMb0EDRiIGG2ooAgA2AgAgB0GMCEGo2QBB/wAgASALaiAIQR91IApqQQxsakEkaiIBIAFB/wBOGyIBQQAgAUEAShsgBWtBGGpBDG9B//8DcUEGRhtBqNkAIAYbNgIEIARBCkHWCCAHEOACIAdBEGokAAsQACAANQKsFSABrX5CEIinCy0AIABCgIDAzL4yQeASQZADIAEgAUGQA00bIgEgAUHgEk8brULgAH6APgKsFQv0AgEKfyAAQfAaaiEIIABB7BVqIQkgAEGEAmohBiAAQaQBaiEKA0ACQCAAKAIAIgEgAkEwbCIDaiIELQBoBEBByNwAIQUgAkEBSw0BCyAEQUBrLQAXEFMhBSAAKAIAIQELAkAgBSAKIAJBBHQiB2oiBCgCAEYEQCAELQAOIAEgAkEwbCIDai0AV0YNAQsgBCABIANqLQBXOgAOQQAhAQNAIAYgAUHwAGxqIgMtAAEgAkYEQCADQQA6AAggA0EAOgAACyAGIAFBAXJB8ABsaiIDLQABIAJGBEAgA0EAOgAIIANBADoAAAsgAUECaiIBQRZHDQALIAJBAk8EQCAHIAlqQSBrIgFBADoAASABQQA7AQIgAUEAOwEGIAFBADoABSABQQA6AAkgAUEAOwEKIAFBADoADSABQQA7AQ4LIAcgCGoiAUEAOgAMIAFBADoACSABQQA6AAAgBCAFNgIAIAQgBSgCABEEAAsgAkEBaiICQQZHDQALC7kIARF/IwBBEGshCkG5893xeUGojdgALQAAQe89bCAAQbHz3fF5bHMiA0HR3RdzIANB0d0XRhsiA0ENdCADcyIDQRF2IANzIgtBBXQhDEHQ99cAKAIAIgZB6BhqIQFBACEDA0ACQCABIANBDGxqIgQtAABBB0sNACAELwEIRQ0AIAcgCmogAzoAACAHQQFqIQcLAkAgASADQQFyIgJBDGxqIgQtAABBB0sNACAELwEIRQ0AIAcgCmogAjoAACAHQQFqIQcLIANBAmoiA0EQRw0ACyAGLQCSASAGLQCRASAGLQCQAWpqIQMgBi0AkwEhAQJ/QQEgBi0AjAENABpBASAGLQCOAQ0AGiAGLQCPAUEARwshDiALIAxzIQUgASADaiENIAZB6A5qIQsgBkHkDWohDCAAQQR0IQ8gB0ECSCEQQX8hCQNAIAggD2ohAiAGLwHkDiEBQQAhAwJAA0AgASADdkEBcUUEQCALIANBBnRqIAIgDCADQQN0ai0AACIEQRAgBBtwai0AAEEBcQ0CCyADQQFqIgNBEEcNAAtBfyEDC0EAIQEgCEEDcQR/QQAFIAYtAI0BIAVBufPd8XkgBRsiBEENdCAEcyIEQRF2IARzIgRBBXQgBHMiBUH/AHFLCyECQf8BIQQCQCAOIANBAE5xRQ0AIAINAAJAIBANACAGLQCMASAFQbnz3fF5IAUbIgFBDXQgAXMiAUERdiABcyIBQQV0IgIgAXMiBUH/AHFNDQAgCkG5893xeSAFIAEgAkYbIgFBDXQgAXMiAUERdiABcyIBQQV0IAFzIgUgB3BqLQAAIQQLAn9BACAGLQCOASAFQbnz3fF5IAUbIgFBDXQgAXMiAUERdiABcyIBQQV0IgUgAXMiAkH/AHFNDQAaQQEgDQR/Qbnz3fF5IAIgASAFRhsiAUENdCABcyIBQRF2IAFzIgFBBXQgAXMiAiANcAVBAAsiASAGLQCQASIFSQ0AGkECIAEgBWsiASAGLQCRASIFSQ0AGkEDQQQgBi0AkgEgASAFa0sbCyEBAkAgBi0AjwEgAkG5893xeSACGyICQQ10IAJzIgJBEXYgAnMiAkEFdCIRIAJzIgVB/wBxTQ0AQbnz3fF5IAUgAiARRhsiAkENdCACcyICQRF2IAJzIgJBBXQgAnMhBQJAAkACQAJAIAJBA3FBAWsOAwECAwALIAFBCHIhAQwDCyABQRByIQEMAgsgAUGAf3IhAQwBCyAEIAkgCUEASBshBAsgAyAEQf8BcSICIAJB/wFGGyEDCyAIQYq02ABqIAQ6AAAgCEGatNgAaiABOgAAIAhBrPjXAGpBf0F/IAMgA0EASCIEGyABQQBIIgIbOgAAIAhBvPjXAGogAToAACAJIAkgAyACGyAEGyEJIAhBAWoiCEEQRw0AC0HM+NcAIAA6AABBrLTYACAAQQFqNgIAC30BBn8gAC0AvwIhAiAALQCPAiEDIAAtAN8BIQQgAC0ArwEhBSAALQB/IQYgAC0ATyEHIAEgAC8B4AM7AQAgASAAQeQOai8BADsBAiAGQQBHQQF0IAdBAEdyIAVBAEdBAnRyIARBAEdBA3RyIANBAEdBBHRyIAJBAEdBBXRyC+AGAQp/AkAgAEGojdgALQAARg0AQZC12AAoAgBFDQAQxAFB0PfXACgCACIBQeQOai8BACEDIAEvAeADIQQgAS0AvwIhBSABLQCPAiEGIAEtAN8BIQcgAS0ArwEhCCABLQB/IQkgAS0ATyEKQZS12AAoAgBBqI3YAC0AACAAIAFBkLXYACgCABEMAEUEQEHQ99cAKAIAIgJB5A5qIAM7AQAgAiAEOwHgA0EAIQEgAiAFQQBHOgC/AiACIAZBAEc6AI8CIAIgB0EARzoA3wEgAiAIQQBHOgCvASACIAlBAEc6AH8gAiAKQQBHOgBPQaiN2AAgADoAACACLwEAIQJBlfjXACAAOgAAQfyM2ABCgIDAzL4yQeASQZADIAIgAkGQA00bIgAgAEHgEk8brULgAH6APgIAQdD31wAQwAFBrLTYAEEANgIAQYCS2AAtAAAEQANAQZT51wAgAUH4kdgAai0AAEGU+dcAKAIAKAIIEQAAIAFBAWoiAUGAktgALQAASQ0ACwtBgJLYAEEAOgAAQfCR2ABB0PfXACgCACIBLQCoagR/QQNBACABLQCqahsFQQALOgAAQfSR2ABBlI3YACgCADYCAEGUktgALQAABEBBACEBA0BBpPnXACABQYyS2ABqLQAAQaT51wAoAgAoAggRAAAgAUEBaiIBQZSS2AAtAABJDQALQdD31wAoAgAhAQtBlJLYAEEAOgAAQYSS2AAgAS0ArG0Ef0EDQQAgAS0Arm0bBUEACzoAAEGIktgAQZSN2AAoAgA2AgBBqJLYAC0AAARAQQAhAQNAQbT51wAgAUGgktgAai0AAEG0+dcAKAIAKAIIEQAAIAFBAWoiAUGoktgALQAASQ0AC0HQ99cAKAIAIQELQaiS2ABBADoAAEGYktgAIAEtALBwBH9BA0EAIAEtALJwGwVBAAs6AABBnJLYAEGUjdgAKAIANgIAQbyS2AAtAAAEQEEAIQEDQEHE+dcAIAFBtJLYAGotAABBxPnXACgCACgCCBEAACABQQFqIgFBvJLYAC0AAEkNAAtB0PfXACgCACEBC0G8ktgAQQA6AABBrJLYACABLQC0cwR/QQNBACABLQC2cxsFQQALOgAAQbCS2ABBlI3YACgCADYCAA8LQdn41wBBAToAAAsL2QEBBH8DQCADQQR0IgBBlPnXAGohASAAQbyN2ABqIgAvAQIEQCABIAAtAAAgASgCACgCCBEAACAAQQA6AAEgAEEAOwECCyAALwEGBEAgASAAQQRqIgItAAAgASgCACgCCBEAACACQQA6AAEgAkEAOwECCyAALwEKBEAgASAAQQhqIgItAAAgASgCACgCCBEAACACQQA6AAEgAkEAOwECCyAALwEOBEAgASAAQQxqIgAtAAAgASgCACgCCBEAACAAQQA6AAEgAEEAOwECCyADQQFqIgNBBEcNAAsLvQIBBH8CQEGZjdgALQAAIgFBA0sNAEHU99cAKAIAIgBFDQAgACABQQZsaiICLQCCAUEBcUUNAEHQ99cAKAIAIgAgAkGCAWoiAy0AASICQQFxOgBPIAAgAkEFdkEBcToAvwIgACACQQR2QQFxOgCPAiAAIAJBA3ZBAXE6AN8BIAAgAkECdkEBcToArwEgACACQQF2QQFxOgB/IAAgAy8BAjsB4AMgAEHkDmogAy8BBDsBAEGX+NcAIAE6AABB7PjXAEHs+NcALwEAQQFqOwEAC0GajdgAQQA6AABB/wEhAEGkjdgALQAAIgFBAk8EQEGljdgAQaWN2AAtAABBAWogAXAiAToAACABQdD31wBqLQDMFSEAQZr41wAgAToAAAtBmY3YACAAOgAAQZj41wBBfyAAwCIAIABBAEgbOgAAC8gHAQN/AkAgAEUEQEGIjdgALQAADQELEMQBQfyN2ABBAEGAAxC+AhpBkI3YAEIANwIAQayN2ABBqI3YAC0AAEHvPWxBupcsczYCAAJAQYuN2AAtAABFDQBB1PfXACgCACIARQ0AIAAtAABFDQBBnfjXAEEAOgAAQaaN2ABBADsBACAALQABIgBBD3EQwwEgAEEQSQ0AIABBBHZBAWsiAUEDSw0AQdT31wAoAgAiAEUNACAAIAFBBmxqIgItAIIBQQFxRQ0AQdD31wAoAgAiACACQYIBaiIDLQABIgJBAXE6AE8gACACQQV2QQFxOgC/AiAAIAJBBHZBAXE6AI8CIAAgAkEDdkEBcToA3wEgACACQQJ2QQFxOgCvASAAIAJBAXZBAXE6AH8gACADLwECOwHgAyAAQeQOaiADLwEEOwEAQZf41wAgAToAAEHs+NcAQez41wAvAQBBAWo7AQALEMcBQYCS2AAtAAAEQEEAIQADQEGU+dcAIABB+JHYAGotAABBlPnXACgCACgCCBEAACAAQQFqIgBBgJLYAC0AAEkNAAsLQQAhAEGAktgAQQA6AABB0PfXACgCACEBQfCR2AAtAABBAUcEQEHwkdgAIAEtAKhqBH9BA0EAIAEtAKpqGwVBAAs6AAALQfSR2ABBADYCAEGUktgALQAABEADQEGk+dcAIABBjJLYAGotAABBpPnXACgCACgCCBEAACAAQQFqIgBBlJLYAC0AAEkNAAtB0PfXACgCACEBC0EAIQBBlJLYAEEAOgAAQYSS2AAtAABBAUcEQEGEktgAIAEtAKxtBH9BA0EAIAEtAK5tGwVBAAs6AAALQYiS2ABBADYCAEGoktgALQAABEADQEG0+dcAIABBoJLYAGotAABBtPnXACgCACgCCBEAACAAQQFqIgBBqJLYAC0AAEkNAAtB0PfXACgCACEBC0EAIQBBqJLYAEEAOgAAQZiS2AAtAABBAUcEQEGYktgAIAEtALBwBH9BA0EAIAEtALJwGwVBAAs6AAALQZyS2ABBADYCAEG8ktgALQAABEADQEHE+dcAIABBtJLYAGotAABBxPnXACgCACgCCBEAACAAQQFqIgBBvJLYAC0AAEkNAAtB0PfXACgCACEBC0G8ktgAQQA6AABBrJLYAC0AAEEBRwRAQayS2AAgAS0AtHMEf0EDQQAgAS0AtnMbBUEACzoAAAtBrLTYAEEANgIAQbCS2ABBADYCAEEAEMEBQYiN2ABBAToAAEHc99cAQQE6AABBgI3YAEH8jNgAKAIANgIACwucAgECfwJAQZmN2AAsAABBAEgNAEGajdgALQAARQ0AEMUBC0GbjdgALQAAIgEEQCABQQFxBEBB0PfXACgCAEHPAGoiACAALQAAQQFzOgAACyABQQJxBEBB0PfXACgCAEH/AGoiACAALQAAQQFzOgAACyABQQRxBEBB0PfXACgCAEGvAWoiACAALQAAQQFzOgAACyABQQhxBEBB0PfXACgCAEHfAWoiACAALQAAQQFzOgAACyABQRBxBEBB0PfXACgCAEGPAmoiACAALQAAQQFzOgAACyABQSBxBEBB0PfXACgCAEG/AmoiASABLQAAQQFzOgAAC0Gb+NcAQQA6AABBm43YAEEAOgAAQez41wBB7PjXAC8BAEEBajsBAAsLwwQBAX9BoJTYAEEAOgAAQYiN2ABBADoAABDEAUH8jdgAQQBBgAMQvgIaQYCS2AAtAAAEQANAQZT51wAgAEH4kdgAai0AAEGU+dcAKAIAKAIIEQAAIABBAWoiAEGAktgALQAASQ0ACwtBgJLYAEEAOgAAQeD41wBB8JHYAC0AACIAQQJrQf8BcUECTQR/QfCR2ABBADoAAEEABSAACzoAAEGUktgALQAABEBBACEAA0BBpPnXACAAQYyS2ABqLQAAQaT51wAoAgAoAggRAAAgAEEBaiIAQZSS2AAtAABJDQALC0GUktgAQQA6AABB4fjXAEGEktgALQAAIgBBAmtB/wFxQQJNBH9BhJLYAEEAOgAAQQAFIAALOgAAQaiS2AAtAAAEQEEAIQADQEG0+dcAIABBoJLYAGotAABBtPnXACgCACgCCBEAACAAQQFqIgBBqJLYAC0AAEkNAAsLQaiS2ABBADoAAEHi+NcAQZiS2AAtAAAiAEECa0H/AXFBAk0Ef0GYktgAQQA6AABBAAUgAAs6AABBvJLYAC0AAARAQQAhAANAQcT51wAgAEG0ktgAai0AAEHE+dcAKAIAKAIIEQAAIABBAWoiAEG8ktgALQAASQ0ACwtBvJLYAEEAOgAAQeP41wBBrJLYAC0AACIAQQJrQf8BcUECTQR/QayS2ABBADoAAEEABSAACzoAAEHos9gALQAABEAQLwtBoPjXAEEAOgAAQdz31wBBADoAAEHps9gAQQA6AABB9PfXAEH/AToAAAu6CAEHfwJAIABBBUsNACAAQQR0QdD31wBqIQYCQCADDQACQEGik9gALQAARQ0AIABBoJPYAC0AAEcNAEGhk9gALQAAIAFHDQBBopPYAEEAOgAACwJAQaiT2AAtAABFDQAgAEGmk9gALQAARw0AQaeT2AAtAAAgAUcNAEGok9gAQQA6AAALAkBBrpPYAC0AAEUNACAAQayT2AAtAABHDQBBrZPYAC0AACABRw0AQa6T2ABBADoAAAsCQEG0k9gALQAARQ0AIABBspPYAC0AAEcNAEGzk9gALQAAIAFHDQBBtJPYAEEAOgAACwJAQbqT2AAtAABFDQAgAEG4k9gALQAARw0AQbmT2AAtAAAgAUcNAEG6k9gAQQA6AAALAkBBwJPYAC0AAEUNACAAQb6T2AAtAABHDQBBv5PYAC0AACABRw0AQcCT2ABBADoAAAsCQEHGk9gALQAARQ0AIABBxJPYAC0AAEcNAEHFk9gALQAAIAFHDQBBxpPYAEEAOgAAC0HMk9gALQAARQ0AIABBypPYAC0AAEcNAEHLk9gALQAAIAFHDQBBzJPYAEEAOgAACyAGQaQBaiEGAkAgAEECSQ0AAkAgAEEEdEHQ99cAaiIHLQDwGkUEQEHQ99cAKAIAIgQgAEEwbGotAFFFDQELIAdB8BpqIgQtAAkhAAJAAkACQAJAAkAgAwRAIABFBEAgBEEBOgAJDAMLIARBAWohAwwBCyAARQ0EIARBAWohAgNAIAVBAWohAyACIAVqIgctAAAgAUYNBCADIgUgAEcNAAsMBwsDQCADIAVqLQAAIAFGDQcgBUEBaiIFIABHDQALIABBB0sNBiAEIABBAWo6AAkgBEEBaiEFA0AgBSAAQQFrIgNqLQAAIgIgAU0NAiAAIAVqIAI6AAAgAEEBSiECIAMhACACDQALC0EAIQALIAAgBGogAToAASAELQAJQQFHDQQgBEEAOgAKDwsgByACIANqIAAgBUF/c2oQvQIgBCAELQAJQQFrIgU6AAkgBUH/AXENAwsgBC0ADEUNAiAGIAQtAAsgBigCACgCCBEAACAEQQA6AAwPCwJAIABBFGxByJHYAGoiBy0AAEECaw4DAAEAAQtBiI3YAC0AAEUNACAAQYQDbCAEakGg5ABqIgUtAAIiCEHfAEsNACAEIABBhANsakGh5ABqLQAAIQQgBygCBCEJQZSN2AAoAgAhCiAFIAhBAnRqIgcgAToABiAHIAJBACADGzoAByAHIAogCWsgBEECIAQbQYADbHA7AQQgBSAIQQFqOgACQez41wBB7PjXAC8BAEEBajsBAAsgAwRAIABBAUYEQEGItNgALQAAQQZ0IAFyIQELIAYgAUH/AXEgAiAGKAIAKAIEEQEAIAANAUGI+NcAQYj41wAvAQBBASABQQ9xdHI7AQAPCyAGIAEgBigCACgCCBEAAAsLgzABGn9B3PjXAEHc+NcAKAIAQQFqNgIAQQIhAANAIABBBHQiAUH0+NcAaiEGQdD31wAoAgAhBUEBIQICQCABQcCS2ABqIgEtAAxFDQBBACECIAEvAQ4iA0UNACABIANBAWsiAzsBDiADQf//A3ENACAGIAEtAAsgBigCACgCCBEAACABQQA6AAxBASECCyAAQTBsIQMCQCABLQAARQRAQdD31wAoAgAgA2otAFFFDQELIAEtAAkiB0UNAEHc+NcAKAIAIAMgBWpBQGsiBS0AEkEDcEHIgwFqLQAAIgNwDQAgAkUEQCAGIAEtAAsgBigCACgCCBEAACABQQA6AAwgAS0ACSEHC0EDIAUtABMiAiACQQNPG0EBIAIbIAdB/wFxIgJsIQcgAUH/AAJ/AkACQAJAQQEgBS0AESIEIARBAU0bQQJrDgMBAgACC0GsjdgAQayN2AAoAgAiBEG5893xeSAEGyIEQQ10IARzIgRBEXYgBHMiBEEFdCAEcyIENgIAIAQgB3AMAgsgASABLQAKIgRBAWo6AAogByAEIAdwQX9zQf//A3FqDAELAkAgBEEDRw0AIAdBAkkNACABIAEtAAoiBEEBajoACiAEIAdBAXRBAmsiCEH+/wNxcCIEIAggBGsgBCAHSRsMAQsgASABLQAKIgRBAWo6AAogBCAHcAsiB8EgAm0iBMFBDGwgASAHIAIgBGxrwWotAAFqIgIgAkH/AE4bIgI6AAsgBiACQf8BcUHkACAGKAIAKAIEEQEAAkACQCAAQQJrIgZBFGxB8JHYAGoiBy0AAEECayICDgMAAQABCwJAIAIOAwABAAELQYiN2AAtAABFDQBB0PfXACgCACAGQYQDbGoiBEGo6gBqIgItAAIiBkHfAEsNACAEQanqAGotAAAhBCAHKAIEIQhBlI3YACgCACEKIAIgBkECdGoiByABLQALOgAGIAdB5AA6AAcgByAKIAhrIARBAiAEG0GAA2xwOwEEIAIgBkEBajoAAkHs+NcAQez41wAvAQBBAWo7AQALIAFBAToADCABQQEgBS0AFCICQTIgAhsgA2wiAkHkAG4gAkHkAEkbOwEOCyAAQQFqIgBBBkcNAAtBACEAQQEhEwNAAkAgAEE2bEH8kNgAaiIDLwECIAMvAQByIgZFDQAgAy0ABCIMRQ0AQQAhASAAQe741wBqIQ0gA0EFaiELIANBFmohByAAQQR0QfT41wBqIQkgAEEwbCIOQdD31wAoAgBqLQBVQQZwQfz/AGotAAAiEEEBdiERAn9BiI3YAC0AAARAQZSN2AAoAgAMAQtB3PjXACgCAAsiAiACIAxuIgUgDGxrQQAgBUEBcWsgDEEyQcsAQemR2AAtAAAiAiACQcsATxsiAiACQTJNG2xBAXRB5ABuIAxrcUchBCAAQQFxIQ8gAEGEC2whEgNAAkBBASABdCIAIAZxRQ0AIAcgAUEBdGoiBS8BACICQf//A0cEQCAFIAJBAWo7AQALAkAgACADLwECIgVxRQ0AIAEgC2oiCC0AACIKBEAgCCAKQQFrIgo6AAAgCkH/AXENAQsgAyAFIABBf3NxOwECCyAEDQAgCSABAn8CQEHokdgALQAAIggEQEHskdgALwEAIgoNAQtB/wBB0PfXACgCACAOai0AWEEobEH/AG5rDAELQYACIQUgAiAKSQRAIAJBCHQgCm4hBQtBgAIgBWsgBSAIQQJGG0HnAGxBgAJtQRhqCyICQf8BcSAJKAIAKAIEEQEAIA9FBEBBiPjXAEGI+NcALwEAIAByOwEACyANIAI6AABBjI3YAC0AAEUNAEGIjdgALQAARQ0AQdD31wAoAgAgEmpB4AJqIgAgAUEGdGpBkI3YACgCACARaiAQbiAAIAFBA3RqLQAAIgBBECAAG3BqIgBBhAFqIQUgAC0AhAFBAXIhACAMIBBJBEBBBCAQIAxuIgggCEEETxsiCEECdEH8AWogAEHzAXFyIAAgCCAAQQJ2QQNxQQFqSxshAAsgBSAAQf0BcSACQe8ASkEBdHIgAEHokdgALQAAGzoAAEHs+NcAQez41wAvAQBBAWo7AQALIAFBAWoiAUEQRw0ACwtBASEAIBNBAXEhAUEAIRMgAQ0ACwJAQYi02AAtAABBBHFFDQBB3PjXACgCAEEMcA0AQYT51wBBibTYAC0AAEHuAEGE+dcAKAIAKAIEEQEAC0HkrNgALQAAIgBB/wFGBEBB0PfXACgCAC0AF0EBayEACwJAQeWs2AAtAAAgAEH/AXFGDQBBiI3YAC0AAARAQZSN2AAoAgBBGHANAQtB6KzYAEEANgIAQeWs2AAgADoAAEHsrNgAQeCs2AAoAgAiAzYCAEHwrNgAIANBCHRBgP7/A3E2AgACQCAAQf8BcUEGSw0AQcys2AAtAABFDQBB/wEhAEHlrNgAQf8BOgAAC0H0rNgAQgA3AgBB1vjXACAAOgAAQfys2ABCADcCAAsCQEHardgALQAAQQFHDQBBiI3YAC0AAEUNAEGUjdgAKAIAQeAAQdut2AAtAAAiAEECIAAbbnANAEHkrdgAQdwBNgIAQeCt2ABB3K3YAC0AAEHW2AJsQegHbjYCAAsCQEGKjdgALQAADQBBmLXYACgCACIARQ0AQdz41wAoAgBBA3ENAEGctdgAKAIAQfgBIAARAAALAkBBiI3YAC0AAEUEQEHc+NcAKAIAQRhwDQFBABDBAQ8LAkBB6bPYAC0AAEUNAEGUjdgAKAIAQYADcA0AQQAhAwNAAkAgA0HwAGxB1PnXAGoiAC0AAEUNACAALQABQQFHDQAgAEEAOgAIIABBADoAAAsCQCADQQFyQfAAbEHU+dcAaiIALQAARQ0AIAAtAAFBAUcNACAAQQA6AAggAEEAOgAACyADQQJqIgNBFkcNAAtBoPjXAEEAOgAAQeiz2ABBATsBAEH4s9gAQgA3AgBB7LPYAEIANwIAQeSs2ABB//8DOwEAQYC02ABCADcCAEHIrNgAKAIAQQBB4JMGEL4CGkGf+NcAQQE6AABBzKzYAEEBOgAAQaT41wBBADYCAAtBACEAA0AgAEEEdCIBQZT51wBqIQICQCABQbyN2ABqIgEvAQIiA0UNACABIANBAWsiAzsBAiADQf//A3ENACACIAEtAAAgAigCACgCCBEAACABQQA6AAELAkAgAS8BBiIDRQ0AIAFBBGoiBiADQQFrIgM7AQIgA0H//wNxDQAgAiAGLQAAIAIoAgAoAggRAAAgBkEAOgABCwJAIAEvAQoiA0UNACABQQhqIgYgA0EBayIDOwECIANB//8DcQ0AIAIgBi0AACACKAIAKAIIEQAAIAZBADoAAQsCQCABLwEOIgNFDQAgAUEMaiIGIANBAWsiATsBAiABQf//A3ENACACIAYtAAAgAigCACgCCBEAACAGQQA6AAELIABBAWoiAEEERw0AC0EAIQcDQCAHQQF0QYj41wBqIQYgB0EEdEH0+NcAaiEFIAdBBnRB/I3YAGohA0EAIQEDQAJAIAMgAUECdGoiAC8BAiICRQ0AIAAgAkEBayICOwECIAJB//8DcQ0AIAUgAC0AACAALQABIAUoAgAoAgQRAQAgBiAGLwEAQQEgAC0AAEEPcXRyOwEACyABQQFqIgFBEEcNAAsgB0EBaiIHQQZHDQALQaCU2AAtAAAiAwRAQQAhAANAIABBBWxB0JPYAGoiASABLQAEQQFrIgI6AAQCQCACQf8BcUUEQCABLQAAIgIgAS0AASABLQACQdD31wAoAgAgAkEwbGotAFVBBnBB/P8Aai0AACABLQADQQBHEMsBBEAgAkH899cAaiICIAItAABBAWo6AAALQaCU2ABBoJTYAC0AAEEBayICOgAAIAEgAkH/AXFBBWxB0JPYAGoiAigAADYAACABIAItAAQ6AARBoJTYAC0AACEDDAELIABBAWohAAsgACADQf8BcUgNAAsLAn8CQEGe+NcAAn9BiY3YAC0AACIBBEBBAiETQQEMAQtB0PfXACgCAC0ADCIADQFBASETQQALIg46AAAgAUEARwwBC0Ge+NcAIABBAWtBlI3YACgCAEGAA24gAHBGIg46AABBAkEBIA4bIRMgDgshEUEAIQIDQEHQ99cAKAIAIgEtAAIhACACQQF0IglB6PfXAGpBkI3YACgCACIDIAEgAkEwbCIKaiIFLQBVQQZwQfz/AGotAAAiBm4iBzsBAAJAIAMgBiAHbGtBACAHQQFxayAAIAZsQQF0QeQAbiAGa3FHDQACQAJAIAJBAU0EQEH/ASEQQQAhAwJAIAJBAUciFgRAIAEhAAwBCyAHQQR2EMEBAkBB0PfXACgCACIALQCMAQ0AIAAtAI4BDQAgAC0AjwFFDQELIAdBD3EiBUGatNgAai0AACEDIAVBirTYAGotAAAhEAsgACAKai0ATw0CIANB/wBLDQIgASACQYQLbCIXakHgAmoiBUGEAWohCyAJQYj41wBqIRQgAkEEdEH0+NcAaiEMIANBA3RBwA9xIRhBACEAIANBB3FBy4MBaiEZQQAhAQNAIAAhAwJAIAUvAYABIAF2QQFxDQAgByAFIAFBA3RqLQAAIgBBECAAG3AiCSALIAFBBnRqai0AACIIQQFxRQRAIAMhAAwBCyATIAhBBXZBA3FGBEAgAyEADAELAkAgEEH/AUYEQCABIQ0MAQtBASEAIBAhDSADDQELIBktAAAhFSAIwEEASARAQdD31wAoAgAgF2pB5AtqIQRBACEAA0ACQCABIAQgAEECdGoiAy0AAUcNACAJIAMtAABHDQAgAy0AAiIPQQNLDQAgDCAPQYABciADLQADIAwoAgAoAgwRAQALIABBAWoiAEHAAEcNAAsLQf8AIRIgCEECcUUEQEH/AEHQ99cAKAIAIApqLQBYQShsQf8AbmshEgsgDSAYciEPIBZFBEBBiLTYAC0AAEEGdCAPciEPCyAMIA9B/wFxIgkgEiAMKAIAKAIEEQEAIBUgCEECdkEDcUEBaiIAIAAgFUkbIgNBAk8EQCASQdUAbEHkAG4hBEEBIQADQCACIAkgBCAAIAZsIANuEMwBIABBAWoiACADRw0ACwsgCEEQcQRAIAIgCSASQQZsQQpuQQIQzAELQQEhACAUIBQvAQBBASAPQQ9xdHI7AQALIAFBAWoiAUEQRw0ACyAADQEMAgtBACEIAkAgAkGAFGwgAWogByAFLQBWIgFBECABGyIAcCIJQShsIgFqQdgNayIDEKcBDQAgAywACSIDQQBIDQAgAwRAQaCU2AAtAAAiBEEPSw0BIARBBWxB0JPYAGoiBSADOgAEIAUgDjoAAyAFQQA6AAIgBSAJOgABIAUgAjoAAEGglNgAIARBAWo6AAAMAQsgAiAJQQAgBiAREMsBIQgLAkAgAkECa0GAFGwiBUHQ99cAKAIAaiABakGyGmoiAxCnAQ0AIAMsAAkiA0EASA0AIAMEQEGglNgALQAAIgtBD0sNASALQQVsQdCT2ABqIgQgAzoABCAEIA46AAMgBEEBOgACIAQgCToAASAEIAI6AABBoJTYACALQQFqOgAADAELIAIgCUEBIAYgERDLASAIciEICwJAQdD31wAoAgAgBWogAWpBvBpqIgMQpwENACADLAAJIgNBAEgNACADBEBBoJTYAC0AACILQQ9LDQEgC0EFbEHQk9gAaiIEIAM6AAQgBCAOOgADIARBAjoAAiAEIAk6AAEgBCACOgAAQaCU2AAgC0EBajoAAAwBCyACIAlBAiAGIBEQywEgCHIhCAsgB0EBaiEDAkBB0PfXACgCACAFaiABakHGGmoiARCnAQ0AIAEsAAkiAUEASA0AIAEEQEGglNgALQAAIgtBD0sNASALQQVsQdCT2ABqIgQgAToABCAEIA46AAMgBEEDOgACIAQgCToAASAEIAI6AABBoJTYACALQQFqOgAADAELIAIgCUEDIAYgERDLASAIciEICyADIABwIQNBACEBA0ACQEHQ99cAKAIAIAVqIANBKGxqIAFBCmxqQagaaiIAEKcBDQAgACwACSIAQQBODQACQCAAIAZqIglBAEoEQEGglNgALQAAIgRBEEkNAQsgCUEASg0BIAIgAyABQdD31wAoAgAgCmotAFVBBnBB/P8Aai0AACAREMsBGgwBCyAEQQVsQdCT2ABqIgAgCToABCAAIA46AAMgACABOgACIAAgAzoAASAAIAI6AABBoJTYACAEQQFqOgAACyABQQFqIgFBBEcNAAsgCEUNAQsgAkH899cAaiIBIAEtAABBAWo6AAALIAINAEH099cAIAdBP3E6AAALIAJBAWoiAkEGRw0AC0EAIQMDQEHQ99cAKAIAIANBhANsaiIGQajqAGohBwJAIANBFGxB8JHYAGoiAi0AACIBQQFHDQBBASEBQZSN2AAoAgAiAEGAA3ANACACIAA2AgRBAiEBIAJBAjoAACAHQQE6AAAgB0EAOgACQez41wBB7PjXAC8BAEEBajsBAAsgA0Hg+NcAaiABOgAAAkAgAi0AACIBQQJJDQAgA0ECaiIEQQR0QfT41wBqIQAgA0EBdEHk+NcAakGUjdgAKAIAIgUgAigCBCIJayAGQanqAGotAAAiBkECIAYbQYADbHAiCjsBAAJAAkAgCg0AIAUgCUYNACACLQAQBEAgAkEIaiEGQQAhAQNAIAAgASAGai0AACAAKAIAKAIIEQAAIAFBAWoiASACLQAQSQ0ACyACLQAAIQELIAJBADoAECABQf8BcUECRw0AIAJBAzoAAAwBCyABQQNrQf8BcUEBSw0BCyAHLQAARQ0AQdD31wAoAgAgBEEwbGotAE8NACAHLQACRQ0AIAJBCGohCSAHQQRqIQtBACEGA0ACQCAKIAsgBkECdGoiBS8BAEcNACAFLQACIQEgACgCACEEIAUtAAMiCARAIAAgAUH/AXEgCCAEKAIEEQEAIAItABAiAUEHSw0BIAUtAAIhBSACIAFBAWo6ABAgASAJaiAFOgAADAELIAAgAUH/AXEgBCgCCBEAACACLQAQIgRFDQBBACEBIAUtAAIhBQNAIAUgASAJaiIILQAARwRAIAQgAUEBaiIBRw0BDAILCyACIARBAWsiAToAECAIIAkgAUH/AXFqLQAAOgAACyAGQQFqIgYgBy0AAkkNAAsLIANBAWoiA0EERw0AC0GQjdgAQZCN2AAoAgBBAWo2AgBBlI3YAEGUjdgAKAIAQQFqIgE2AgBB5PfXACABNgIAAkACQEHQ99cAKAIAELEBIgEEQEGQjdgAKAIAIAFBGGxJDQJBkI3YAEEANgIADAELQZSN2AAoAgBBgANwDQELQfj31wBB+PfXACgCAEEBajYCAAJAQaSN2AAtAABBAkkNAEGZjdgALAAAQQBIDQBBmo3YAC0AAA0AEMUBCwJAAkBBi43YAC0AAEUNAEHU99cAKAIAIgBFDQAgAC0AACIDRQ0AQaeN2ABBp43YAC0AAEEBaiIBOgAAIAFB/wFxQQEgAEGmjdgALQAAIg1qLQBBIgEgAUEBTRtPBEBBp43YAEEAOgAAQaaN2AAgDUEBaiADcCINOgAACyAAIA1qLQABIgBBD3EQwwECQCAAQRBJDQAgAEEEdkEBayINQQNLDQBB1PfXACgCACIARQ0AIAAgDUEGbGoiAy0AggFBAXFFDQBB0PfXACgCACIAIANBggFqIgEtAAEiA0EBcToATyAAIANBBXZBAXE6AL8CIAAgA0EEdkEBcToAjwIgACADQQN2QQFxOgDfASAAIANBAnZBAXE6AK8BIAAgA0EBdkEBcToAfyAAIAEvAQI7AeADIABB5A5qIAEvAQQ7AQBBl/jXACANOgAAQez41wBB7PjXAC8BAEEBajsBAAtBnfjXAEGmjdgALQAAOgAADAELAkBBuLTYAC0AACIAQQJPBEBBubTYAEG5tNgALQAAQQFqIABwIgA6AAAgAEGwtNgAai0AABDDAUHU+NcAQbi02AAtAAAiADoAAEHV+NcAQbm02AAtAAAiAzoAACAAQQJJDQFBlvjXACADQf8BcUEBaiAAcEGwtNgAai0AADoAAAwCC0GYjdgALAAAIgBBAEgNAEGW+NcAQf8BOgAAQZiN2ABB/wE6AAAgABDDAQsLC0GUjdgAKAIAQYADcEUEQBDHAQtB4PfXAEGQjdgAKAIANgIACwvlBQEDfwJAQdD31wAoAgAiBiAAQYAUbGogAUEobGogAkEKbGpB2A1rIgEQpwENACAGIABBMGwiB2otAE8NAAJAAkACQAJAIAEtAAMiBkH4AGsOAgABAgsgBA0CDAMLIARFDQEMAgsgBkHjAEsNAEGJjdgALQAADQBBrI3YAEGsjdgAKAIAIgRBufPd8XkgBBsiBEENdCAEcyIEQRF2IARzIgRBBXQgBHMiBDYCACAEQeQAcCAGTw0BCyAAQQR0QfT41wBqIQUgAS0ABCIGQf8BRwRAIAVBgAEgBiAFKAIAKAIMEQEACyABLQAFIgZB/wFHBEAgBUGBASAGIAUoAgAoAgwRAQALIAEtAAYiBkH/AUcEQCAFQYIBIAYgBSgCACgCDBEBAAsgAEECayEAIAEtAAciBkH/AUcEQCAFQYMBIAYgBSgCACgCDBEBAAsgAEEEdEHQ99cAaiACQQJ0aiICQewVaiEAAkAgAkHuFWovAQAEQCAALQAAIQYgAC0AAUUNASAFQcAAQQEgBSgCACgCDBEBAAwBCyAALQAAIQYLIAUgAS0AACABLQABIgRB/gBNBH9BAUH/AEH/AEHQ99cAKAIAIAdqLQBYQShsQf8AbmsgBGxB//8DcSIEQeQAbiICIAJB/wBPGyAEQeQASRsFQf8AC0H/AXEgBSgCACgCBBEBAAJ/IAEtAAAiAiAALwECRQ0AGiAGIAZB/wFxIAJB/wFxRg0AGiAFIAZB/wFxIAUoAgAoAggRAAAgAS0AAAshAiABLQACIQQgACACOgAAIAAgBEEHdjoAAQJ/IANBASAEQf8AcSICIAJBAU0bIgVsIgIgA0ECdmogBMBBAEgNABogAkEEayABLQAIIgRBCmtB/wFxQdkASw0AGiAFQQFrIANsQQIgAyAEbCIEQf//A3FB5ABuIgEgA0ECayICIAEgAkgbIARByAFJG2oLIQRBASEFIABBASAEIARBAUwbOwECCyAFC5sDAQJ/AkACQCAAQQZ0IgVB/I3YAGoiBC8BAkUNACAFQfyN2ABqIgQvAQZFBEAgBEEEaiEEDAELIABBBnRB/I3YAGoiBC8BCkUEQCAEQQhqIQQMAQsgBC8BDkUEQCAEQQxqIQQMAQsgAEEGdEH8jdgAaiIELwESRQRAIARBEGohBAwBCyAELwEWRQRAIARBFGohBAwBCyAAQQZ0QfyN2ABqIgQvARpFBEAgBEEYaiEEDAELIAQvAR5FBEAgBEEcaiEEDAELIABBBnRB/I3YAGoiBC8BIkUEQCAEQSBqIQQMAQsgBC8BJkUEQCAEQSRqIQQMAQsgAEEGdEH8jdgAaiIELwEqRQRAIARBKGohBAwBCyAELwEuRQRAIARBLGohBAwBCyAAQQZ0QfyN2ABqIgQvATJFBEAgBEEwaiEEDAELIAQvATZFBEAgBEE0aiEEDAELIABBBnRB/I3YAGoiBC8BOkUEQCAEQThqIQQMAQsgBC8BPg0BIARBPGohBAsgBEEBIAMgA0EBTBs7AQIgBCACOgABIAQgAToAAAsLhwIBBn8CQCAARQ0AIAFB2ABJDQAgACgAAEHCnM2KA0cNACAALwAKIgNB2ABJDQAgA0HgxABLDQAgASADSQ0AIAAtAAUhASAALQAEIgJBBEYEQCABRSADQdgnRnEPCyACQQZLDQBBASACdEHoAHFFDQAgAUECSyABIAJBBUYiAhsNACACRQRAIAAtAAdBAkkNAQsgAUUhBCABRQ0AIANB2gBJDQBB2AAhAgNAQQAhBCAAIAJqIgUtAAAiB0EJa0H/AXFB+AFJDQEgAiAHQQF0Qf4BcSAFLQABIgVBgAIgBRtsakECaiICIANLDQEgBkEBaiIGIAFPIgQNASACQQJqIANNDQALCyAEC7QBAQN/IAAtAAUiAkUEQEEADwsgAEHYAGohAAJAIAEgAk4NACABQQBMDQAgAUEBcSEDIAFBAUcEQCABQf7///8HcSEEQQAhAQNAIAAgAC0AACAALQABIgJBgAIgAhtsQQF0aiIAIAAtAAIgAC0AAyIAQYACIAAbbEEBdGpBBGohACABQQJqIgEgBEcNAAsLIANFDQAgACAALQAAIAAtAAEiAUGAAiABG2xBAXRqQQJqIQALIAALjgIBB38jAEEQayIGJABBsNQLQQA2AgADQAJAIAVBDHRBgIAwaiIDIAZBBGpBDCAAKAIAEQMADQAgBigCBEHCnM2KA0cNACAGLwEOIgRB4cQAa0H//wNxQfe7A0kNACABRQ0AIARBgyBqQQx2IgcgBWoiCEEZSg0AIAIgAyABEQUAIgNFDQAgAyAEEM0BRQ0AQQAgAyAEEO8BIAMgBGooAABHDQBBsNQLKAIAIglBA3QiBEHF1AtqIAc6AAAgBEHE1AtqIAU6AAAgBEHA1AtqIAM2AgBBsNQLIAlBAWo2AgAgCEEBayEFC0Gw1AsoAgAhAyAFQRdMBEAgBUEBaiEFIANBDEgNAQsLIAZBEGokAAvDAgEEf0F/IQQCQCABQQBIDQAgAUGw1AsoAgAiAk4NACABQQN0IgNBxdQLai0AAARAIANBwNQLaiEDQQAhAgNAIAIgAy0ABGpBDHRBgIAwaiAAKAIEEQIADQIgAkEBaiICIAMtAAVJDQALQbDUCygCACECCwJAIAEgAkEBayIFTg0AIAIgAWtBAmshACACIAFBf3NqQQNxIgMEQEEAIQIDQCABQQN0QcDUC2ogAUEBaiIBQQN0QcDUC2opAwA3AwAgAkEBaiICIANHDQALCyAAQQNJDQADQCABQQN0IgJBwNQLaiACQcjUC2oiAykDADcDACADIAJB0NQLaiIAKQMANwMAIAAgAkHY1AtqIgIpAwA3AwAgAiABQQRqIgFBA3RBwNQLaikDADcDACABIAVHDQALC0EAIQRBsNQLIAU2AgALIAQLjgMBB38CQEHg5QYoAgAiA0EATA0AIANBA3EhBCADQQRPBEAgA0H8////B3EhBwNAIAIgACABQQN0QYDiBmoiAygCAC0ABEZqIAAgAygCCC0ABEZqIAAgAygCEC0ABEZqIAAgAygCGC0ABEZqIQIgAUEEaiEBIAZBBGoiBiAHRw0ACwsgBEUNAANAIAIgACABQQN0QYDiBmooAgAtAARGaiECIAFBAWohASAFQQFqIgUgBEcNAAsLAkBBsNQLKAIAIgFBAEwNACABQQNxIQRBACEFAkAgAUEESQRAQQAhAQwBCyABQfz///8HcSEHQQAhAUEAIQYDQCACIAAgAUEDdCIDQcDUC2ooAgAtAARGaiAAIANByNQLaigCAC0ABEZqIAAgA0HQ1AtqKAIALQAERmogACADQdjUC2ooAgAtAARGaiECIAFBBGohASAGQQRqIgYgB0cNAAsLIARFDQADQCACIAAgAUEDdEHA1AtqKAIALQAERmohAiABQQFqIQEgBUEBaiIFIARHDQALCyACC58BAQN/AkAgAUEASA0AQeDlBigCACIEQQBKBEADQCACQQN0QYDiBmooAgAiAy0ABCAARgRAIAFFDQMgAUEBayEBCyACQQFqIgIgBEcNAAsLQQAhA0Gw1AsoAgAiBEEATA0AQQAhAgNAIAJBA3RBwNQLaigCACIDLQAEIABGBEAgAUUNAiABQQFrIQELIAJBAWoiAiAERw0AC0EAIQMLIAMLlAMBB38CQEHg5QYoAgAiAkEATA0AIAJBA3EhAyACQQRPBEAgAkH8////B3EhBgNAIAEgAEEDdEGA4gZqIgIoAgAtAARBBEZqIAIoAggtAARBBEZqIAIoAhAtAARBBEZqIAIoAhgtAARBBEZqIQEgAEEEaiEAIAVBBGoiBSAGRw0ACwsgA0UNAANAIAEgAEEDdEGA4gZqKAIALQAEQQRGaiEBIABBAWohACAEQQFqIgQgA0cNAAsLAkBBsNQLKAIAIgBBAEwNACAAQQNxIQNBACEEAkAgAEEESQRAQQAhAAwBCyAAQfz///8HcSEGQQAhAEEAIQUDQCABIABBA3QiAkHA1AtqKAIALQAEQQRGaiACQcjUC2ooAgAtAARBBEZqIAJB0NQLaigCAC0ABEEERmogAkHY1AtqKAIALQAEQQRGaiEBIABBBGohACAFQQRqIgUgBkcNAAsLIANFDQADQCABIABBA3RBwNQLaigCAC0ABEEERmohASAAQQFqIQAgBEEBaiIEIANHDQALCyABQQV0QRRyC9sEAQl/AkBB4OUGKAIAIgVBAEwNACAFQQNxIQYgBUEETwRAIAVB/P///wdxIQkDQCABIAJBA3RBgOIGaiIDKAIALQAEQQRGaiADKAIILQAEQQRGaiADKAIQLQAEQQRGaiADKAIYLQAEQQRGaiEBIAJBBGohAiAHQQRqIgcgCUcNAAsLIAZFDQADQCABIAJBA3RBgOIGaigCAC0ABEEERmohASACQQFqIQIgBEEBaiIEIAZHDQALCwJAQbDUCygCACIIQQBMDQAgCEEDcSEGQQAhBAJAIAhBBEkEQEEAIQIMAQsgCEH8////B3EhCUEAIQJBACEHA0AgASACQQN0IgNBwNQLaigCAC0ABEEERmogA0HI1AtqKAIALQAEQQRGaiADQdDUC2ooAgAtAARBBEZqIANB2NQLaigCAC0ABEEERmohASACQQRqIQIgB0EEaiIHIAlHDQALCyAGRQ0AA0AgASACQQN0QcDUC2ooAgAtAARBBEZqIQEgAkEBaiECIARBAWoiBCAGRw0ACwsgAUEFdEEUciIBIAAgAW9qIAFvIgFBE0wEQCABQZwBbEGgiAFqDwsgAUEUayIEQQV2IQJBACEBAkAgBUEASgRAA0AgAUEDdEGA4gZqKAIAIgMtAARBBEYEQCACRQ0DIAJBAWshAgsgAUEBaiIBIAVHDQALCyAIQQBKBEBBACEBA0AgAUEDdEHA1AtqKAIAIgMtAARBBEYEQCACRQ0DIAJBAWshAgsgAUEBaiIBIAhHDQALC0EAIQMLIAMgBEEfcUGcAWxqQdgAakGgiAEgAxsLyAEBBH9BxhUhBQJAIAFBAEgNAAJAQeDlBigCACIDQQBKBEADQCACQQN0QYDiBmooAgAiBC0ABCAARgRAIAFFDQMgAUEBayEBCyACQQFqIgIgA0cNAAsLQQAhAkGw1AsoAgAiA0EATA0BA0AgAkEDdEHA1AtqKAIAIgQtAAQgAEYEQCABRQ0CIAFBAWshAQsgAkEBaiICIANHDQALDAELQavVCyAEKQAMNwAAQbPVCyAEKAAUNgAAQbfVC0EAOgAAQavVCyEFCyAFC/sFAQ9/IwBBgAFrIgIkACAAQQRqQQBBoAEQvgIaIABCfzcBCCAAIAE2AgAgAEJ/NwEQIABCfzcBGCAAQn83ASBBfyEMIABB//8DOwEoIABB//8DOwGUASAAQfAAaiEOIABBLGohDSAAQQhqIQ8CfwJAA0AgBkENdCIEQYDgJWogAkEQIAEoAgARAwANAQJAIAItAAQiC0EQSw0AIAIoAgBBy57BmgNHDQAgAi8BBiIIIgNB8D9LDQAgAigCDCEQIAIoAgghBwJAIAhB//8DcUUEQEEAIQUMAQsgBEGQ4CVqIQlBACEFA0AgCSACQYABIAMgA0GAAU8bIgQgASgCABEDAARAQX8hBQwCCyAEIAlqIQkgBSACIAQQ7wEhBSADIARrIgMNAAsLIAUgEEcNAAJAIAtBCmtB/wFxQQZJDQAgDyALQQF0IgNqIgQuAQBBAE4EQCAHIA0gC0ECdGooAgBNDQELIAQgBjsBACANIAtBAnRqIAc2AgAgAyAOaiAIOwEACyAHIAogByAKSxshAyAMIAYgByAKSRshDCAAKAIEIAdJBEAgACAHNgIECyADIQoLIAZBAWoiBkEURw0ACyAAIAxBAWpBFG87AZIBQQAhBgNAIAZBDHQiBEGAoDdqIAJBECABKAIAEQMAIgtFBEACQCACLQAEQe4BRw0AIAIoAgBBy57BmgNHDQAgAi8BBiIHIgNB8B9LDQAgAigCDCEKIAIoAgghCAJAIAdB//8DcUUEQEEAIQUMAQsgBEGQoDdqIQlBACEFA0AgCSACQYABIAMgA0GAAU8bIgQgASgCABEDAARAQX8hBQwCCyAEIAlqIQkgBSACIAQQ7wEhBSADIARrIgMNAAsLIAUgCkcNAAJAIAAuAZQBQQBOBEAgCCAAKAKYAU0NAQsgACAHOwGcASAAIAg2ApgBIAAgBjsBlAELIAggACgCBE0NACAAIAg2AgQLIAZBAWoiBkEDRw0BCwtBf0EAIAsbDAELQX8LIQMgAkGAAWokACADC+4CAQJ/AkAgAEEQSw0AIAJB8D9LDQADQEGSyt4AQZLK3gAvAQAiA0EBakEUcDsBAAJAIANBiMneAC4BAEYNACADQYrJ3gAuAQBGDQAgA0GMyd4ALgEARg0AIANBjsneAC4BAEYNACADQZDJ3gAuAQBGDQAgA0GSyd4ALgEARg0AIANBlMneAC4BAEYNACADQZbJ3gAuAQBGDQAgA0GYyd4ALgEARg0AIANBmsneAC4BAEYNACADQZzJ3gAuAQBGDQAgA0Geyd4ALgEARg0AIANBoMneAC4BAEYNACADQaLJ3gAuAQBGDQAgA0Gkyd4ALgEARg0AIANBpsneAC4BAEYNACADQajJ3gAuAQBGDQAgA0ENdEGA4CVqQQIgACABIAIQ2AENACAAQQF0IgRBiMneAGogAzsBACAAQQJ0QYDJ3gBqQYTJ3gAoAgA2AiwgBEGAyd4AaiACOwFwQQAPCyAEQQFqIgRBFEcNAAsLQX8LwAQBCH8jAEGQAWsiBiQAQX8hDAJAIABBgMneACgCACIKKAIEEQIADQBBoMreAEGgyt4AKAIAQQFqNgIAIAFBAUcEQCAAQYAgaiAKKAIEEQIADQFBoMreAEGgyt4AKAIAQQFqNgIACwJAIARFDQAgAEEQaiEFIAMhCSAEIQcDQCAHRQ0BIAcgB0GAAiAFQf8BcWsiCCAHIAhJGyIIayEHIAUgCSAIIAooAggRAwAhCyAIIAlqIQkgBSAIaiEFIAtFDQALDAELIAZBADoABSAGIAI6AAQgBkHLnsGaAzYCACAGIAQ6AAYgBiAEQQh2OgAHQYTJ3gBBhMneACgCAEEBaiIFNgIAIAYgBUEYdjoAC0EQIQcgBiAFQRB2OgAKIAYgBUEIdjoACSAGIAU6AAggBkEAIAMgBBDvATYCDCAGIQkgACEFAkADQCAHRQ0BIAcgB0GAAiAFQf8BcWsiCCAHIAhJGyIIayEHIAUgCSAIIAooAggRAwAhCyAIIAlqIQkgBSAIaiEFIAtFDQALDAELIAAgBkEQakEQIAooAgARAwANACAGKAIQQcuewZoDRw0AIAYvARYiBSIHIAFBDHRBEGtLDQAgBigCHCELQQAhCQJAIAVB//8DcUUNACAAQRBqIQgDQCAIIAZBEGpBgAEgByAHQYABTxsiBSAKKAIAEQMABEBBfyEJDAILIAUgCGohCCAJIAZBEGogBRDvASEJIAcgBWsiBw0ACwtBf0EAIAkgC0cbIQwLIAZBkAFqJAAgDAssAAJ/QQAgAUEQSw0AGkEAIAAgAUEBdGoiAS4BCEEASA0AGiABLwFwQQBHCwuVAQECf0GA4CUhAgJAA0AgAiABKAIEEQIADQEgAkGAIGogASgCBBECAA0BIAJBgEBrIAEoAgQRAgANASACQYDgAGogASgCBBECAA0BIAJBgOAuSSEDIAJBgIABaiECIAMNAAtBgKA3IAEoAgQRAgANAEGAwDcgASgCBBECAA0AQYDgNyABKAIEEQIADQAgACABENYBGgsLdwEEfyMAQeAAayIEJAAgA0EAQaAFEL4CIQYDQAJ/QQEgACABIAIgBSAEQQxqENwBDQAaQQEgBiAELQANQdQAbGoiAy0AAA0AGiADIARBDGpB1AAQvAIaIAdBAWohByAELQAUCyAFaiIFQRlJDQALIARB4ABqJAALrgMBBX8jAEHgAGsiBSQAIARBAEHUABC+AiEGQX8hBAJAIANBDHQiB0GAgDBqIAVB1AAgACgCABEDAA0AIAUoAgBBwprRogNHDQAgBS0ABEEHSw0AIAUoAgwiAEGBgANrQYCAfUkNACAFLQAFQRBLDQAgAUUNACAAQf8gakEMdiIIIANqQRlKDQAgAiAHQYCBMGogAREFACIBRQ0AQQAgASAAEO8BIAUoAlBHDQAgBkEBOgAAIAYgBS0ABDoAASAGIAUtAAUiAjoAAiAGIAUtAAYiBEHAACAEGzoAAyAGIAUtAAc6AAYgBS8BCCEEIAYgADYCDCAGIAE2AlAgBiAIOgAIIAYgAzoAByAGIARBACAEQeESa0H//wNxQa/wA08bOwEEQQAhBCACRQ0AIAYgBSgCECIBNgIQQQAhAwJAIAAgAU0NAEEBIQMgAkEBRg0BIAZBEGohCCAFQRBqIQkDQCAIIANBAnQiAWoiByABIAlqKAIAIgE2AgAgACABTQ0BIAEgB0EEaygCAE0NASADQQFqIgMgAkcNAAsMAQsgBiADOgACCyAFQeAAaiQAIAQLhAYBC38gAUIANwAAIAFBADoAGCABQgA3ABAgAUIANwAIQbDUCygCACILQQBKBEADQAJAIAVBA3QiBEHF1AtqLQAAIgNFDQAgA0EDcSEHIARBwNQLai0ABCEIQQAhCUEAIQQgA0EETwRAIANB/AFxIQxBACEKA0AgBCAIaiIDQRlIBEAgASADakEBOgAACyADQQFqIgZBGUgEQCABIAZqQQE6AAALIANBAmoiBkEZSARAIAEgBmpBAToAAAsgA0EDaiIDQRlIBEAgASADakEBOgAACyAEQQRqIQQgCkEEaiIKIAxHDQALCyAHRQ0AA0AgBCAIaiIDQRlIBEAgASADakEBOgAACyAEQQFqIQQgCUEBaiIJIAdHDQALCyAFQQFqIgUgC0cNAAsLAkAgAC0AAEUNACAALQAIRQ0AA0AgAC0AByABIAJqakEBOgAAIAJBAWoiAiAALQAISQ0ACwsCQCAALQBURQ0AIAAtAFxFDQBBACECA0AgAC0AWyABIAJqakEBOgAAIAJBAWoiAiAALQBcSQ0ACwsCQCAALQCoAUUNACAALQCwAUUNAEEAIQIDQCAALQCvASABIAJqakEBOgAAIAJBAWoiAiAALQCwAUkNAAsLAkAgAC0A/AFFDQAgAC0AhAJFDQBBACECA0AgAC0AgwIgASACampBAToAACACQQFqIgIgAC0AhAJJDQALCwJAIAAtANACRQ0AIAAtANgCRQ0AQQAhAgNAIAAtANcCIAEgAmpqQQE6AAAgAkEBaiICIAAtANgCSQ0ACwsCQCAALQCkA0UNACAALQCsA0UNAEEAIQIDQCAALQCrAyABIAJqakEBOgAAIAJBAWoiAiAALQCsA0kNAAsLAkAgAC0A+ANFDQAgAC0AgARFDQBBACECA0AgAC0A/wMgASACampBAToAACACQQFqIgIgAC0AgARJDQALCwJAIAAtAMwERQ0AIAAtANQERQ0AQQAhAgNAIAAtANMEIAEgAmpqQQE6AAAgAkEBaiICIAAtANQESQ0ACwsLngIBBH8jAEEgayIDJAAgACADEN0BA38gAiABIANqIgQtAABFaiECIAFBGEYEfyAALQAABH8gACgCDAVBAAshASAALQBUBEAgACgCYCABaiEBCyAALQCoAQRAIAAoArQBIAFqIQELIAAtAPwBBEAgACgCiAIgAWohAQsgAC0A0AIEQCAAKALcAiABaiEBCyAALQCkAwRAIAAoArADIAFqIQELIAAtAPgDBEAgACgChAQgAWohAQsgAC0AzAQEQCAAKALYBCABaiEBCyADQSBqJAAgAkEMdEGAAWsiBEGA7gUgAWsiAyADIARLG0EAIAFB/+0FTRtBACACGwUgBC0AA0UgBC0AAkUgAiAELQABRWpqaiECIAFBBGohAQwBCwsL8wcBCn8jAEGgAWsiCCQAQX8hDQJAIARBgYADa0GAgH1JDQBB6IrfAC0AAAR/QfSK3wAoAgAFQQALIQdBvIvfAC0AAARAQciL3wAoAgAgB2ohBwtBkIzfAC0AAARAQZyM3wAoAgAgB2ohBwtB5IzfAC0AAARAQfCM3wAoAgAgB2ohBwtBuI3fAC0AAARAQcSN3wAoAgAgB2ohBwtBjI7fAC0AAARAQZiO3wAoAgAgB2ohBwtB4I7fAC0AAARAQeyO3wAoAgAgB2ohBwtBtI/fAC0AAARAQcCP3wAoAgAgB2ohBwsgBEGA7gUgB2tBACAHQf/tBU0bSw0AQX9BAEHoit8ALQAAIgcbIQkCQCAHRQ0AIAlBAUG8i98ALQAAIgobIQkgCkUNACAHRQ0AIAlBAkGQjN8ALQAAGyIJQQBODQAgCUEDQeSM3wAtAAAbIglBAE4NACAJQQRBuI3fAC0AABsiCUEATg0AIAlBBUGMjt8ALQAAGyIJQQBODQAgCUEGQeCO3wAtAAAbIglBAE4NACAJQQdBtI/fAC0AABsiCUEfdiELCyALDQBB6IrfACAIQYABahDdASAEQYCfBksNACAEQf8gakEMdiIKQQFqIQxBACELA0BBACEHAkADQCAIQYABaiAHIAtqai0AAEUEQCAKIAdBAWoiB0cNAQwCCwsgCyAMaiEHIAtBAWohCyAHQRpJDQEMAgsLQQAhBwNAIAcgC2pBDHRBgIAwaiAAKAIEEQIADQEgB0EBaiIHIApHDQALIAtBDHQiB0GAgTBqIQogB0GAgDBqIQ4gAyEPIAQhBwNAIAcEQCAHIAdBgAIgCkH/AXFrIgwgByAMSRsiDGshByAKIA8gDCAAKAIIEQMAIRAgDCAPaiEPIAogDGohCiAQRQ0BDAILC0EAIAMgBBDvASEHIAhBEGpB/wFB8AAQvgIaIAggB0EYdjoAUyAIIAdBEHY6AFIgCCAHQQh2OgBRIAggBzoAUCAIQgA3A0ggCEIANwNAIAhCADcDOCAIQgA3AzAgCEIANwMoIAhCADcDICAIQgA3AxggCEIANwMQIAhBADsBDiAIIARBCHY6AA0gCCAEOgAMIAhBADsBCiAIIAY6AAcgCEGAgAE7AAUgCCAJOgAEIAhBwprRogM2AgAgCCAFOgAIIAggBUEIdjoACUGAASEHIAghBAJAA0AgB0UNASAHIAdBgAIgDkH/AXFrIgogByAKSRsiCmshByAOIAQgCiAAKAIIEQMAIQ0gBCAKaiEEIAogDmohDiANRQ0AC0F/IQ0MAQtBfyAJIAAgASACIAsgCUHUAGxB6IrfAGoQ3AEbIQ0LIAhBoAFqJAAgDQvbCAMMfwZ9A3wjAEEQayIMJAAgDEIANwMIIAxCADcDAAJAIAFBgAJrIgdBACABIAdPGyINQT9NBEAgBEEANgIAQQEhCgwBC0EBQYAIIA1BBnYiASABQYAITxsiCSAJQQFNGyEIA0AgACAFQQZ0aiIGLAAAsiIRIBGUQwAAAACSIRFDAAAAACESQQEhAQNAIAEgBmoiCywAACIHIAtBAWssAABrsiITIBOUIBKSIRIgB7IiEyATlCARkiERIAFBAWoiC0GAAkYEQCAMKgIEIRMgDCoCACEUIAwqAgghFSAMKgIMIRYgBUECdEHA1QtqIBJDAAAAP5QgEUMAAIA/kpIQ1AIiESAWIBUgFCATkpKSQwAAgL6UkiISQwAAAAAgBUEDSxtDAAAAACASQwAAAABeGyISOAIAIAwgBUEDcUECdHIgETgCACAYIBK7IhegIRggFyAXoiAZoCEZIAVBAWoiBSAIRw0CIARBADYCAEEBIQogDUGABEkNA0HA9QtBAEGACBC+AiEHIBkgCbgiF6O2IBggF6O2IhEgEZSTkUH/ACADIANB/wBPG0EBdEEAIANBAE4bs0MAAP7ClUOamRlAkpQgEZIhEkECIAJBBnYiASABQQJNGyIOQQFqIRAgDkEBdEECcSEDQQUgCSAJQQVNGyELIABBAWshDyACQQJtIQICQANAQQQhAUF/IQgDQAJAIAEgB2otAAANACABQQJ0QcDVC2oqAgAiESASXkUNACAIQQBOBEAgESAIQQJ0QcDVC2oqAgBeRQ0BCyABIQgLIAFBAWoiASALRw0ACyAIQQBOBEAgCCAOayIBIAggDmpMBEAgCCAQaiENQQAhBgNAIAEgCUkEQCABIAdqQQE6AAALIAFBAWohASADIAZGIQUgBkEBaiEGIAVFDQALA0AgASAJSQRAIAEgB2pBAToAAAsgCSABQQFqIgZLBEAgBiAHakEBOgAACyAJIAFBAmoiBksEQCAGIAdqQQE6AAALIAkgAUEDaiIGSwRAIAYgB2pBAToAAAsgAUEEaiIBIA1HDQALC0EAIQEgAiAIQQZ0QSByIgZMBEADQAJAIAAgBiABayIFaiIIQQFrLQAAIg0gCC0AAHPAQQBIDQAgDyAGIAFBf3NqIgVqLQAAIgggDXPAQQBIDQAgAUECaiIFQSBGBEAgBiEFDAELIAFBA2ohASAPIAYgBWsiBWotAAAgCHPAQQBODQELCyAEIApBAnRqIAU2AgAgCkEBaiEKCyAKQRBIDQEMAgsLIApBAkgNBAtBASEFA0ACQCAFIgFBAkkNAANAIAQgAUECdGoiBygCACIGIAdBBGsiCygCACIJTw0BIAcgCTYCACALIAY2AgAgAUECSiEHIAFBAWshASAHDQALCyAFQQFqIgUgCkcNAAsFIAFBAmohASAGIAtqLAAAIguyIhMgE5QgEZIhESALIAdrsiITIBOUIBKSIRIMAQsLCwsgDEEQaiQAIAoLkIoDAyV/A30EfiMAQbAIayILJAACQCABLQDY8AgiAkUEQCAAKAIMIgYgACgCFCIbSARAIAAoAhAhDSAAKAIIIQ4gBiECA0AgAiAGIAIgBkobIQUgAkEBdEGArAFqLwEAQeCvAWohDEEAIQEDQCABIAwtAABqIQQgAiAGTgRAIAwtAAFBAXRBoKsBai8BACEIIAQgDSAEIA1IGyIPIAEgDiABIA5KGyIKa0EHcSEQIAAoAgQhESAAKAIAIRIgCiAPa0F4SyETIAUhAQNAIAEhBwJAIAogD04NACASIAEgEWtB4ANsaiEJQQAhASAKIQMgEARAA0AgCSADQQF0aiAIOwEAIANBAWohAyABQQFqIgEgEEcNAAsLIBMNACAJQQ5qIRQgCUEMaiEVIAlBCmohFiAJQQhqIRcgCUEGaiEYIAlBBGohGSAJQQJqIRoDQCAJIANBAXQiAWogCDsBACABIBpqIAg7AQAgASAZaiAIOwEAIAEgGGogCDsBACABIBdqIAg7AQAgASAWaiAIOwEAIAEgFWogCDsBACABIBRqIAg7AQAgA0EIaiIDIA9HDQALCyAHQQFqIQEgAiAHRw0ACwsgDEECaiEMIAQiAUHwAUkNAAsgAkEBaiICIBtHDQALCyAAQQRB5wFBgg9BiNMAQQEQXxoMAQtBwP0LQQE6AABByP0LAn8gAS0A2fAIQQh0IAJyIAEtANrwCEEQdHIgAS0A2/AIIgJBGHRyIAEgAmotAPLwCEEcdHIgAS0A/voIQR50ciICQdCICCgCAEYEQEHE/QsoAgAhAiABKALI9wgMAQtB0IgIIAI2AgBBxP0LIAEoAsj3CCICNgIAIAILIAJrQaAfSToAACAAQQBBGBBXBEAgAEEAQQBB8AFBF0HCEBBYAkAgAS0AnIoBBEAgAEEEQQdBCkHz7wEQWiAAQQVBB0EKQfPvARBaIABBBkEIQQhB8+8BEFogAEEHQQhBCEHz7wEQWiAAQQhBCUEGQfPvARBaIABBCUEJQQZB8+8BEFogAEEKQQpBBEHz7wEQWiAAQQtBCkEEQfPvARBaIABBDEELQQJB8+8BEFoMAQsgAEEEQQhBCEEIQbT4ARBYCwJAAkAgAS0A+fAIDQAgAS0A34oBDQAgAS0A8vUIDQAgAS0A4IoBRQ0BCwJAAkAgAS0A34oBDQAgAS0A8vUIDQAgAS0A4IoBRQ0BCyABKALI9whB+gFuQQFxRQ0BCyAAQRJBDEEDQYf9A0GK8AMgAS0A4IoBGxBdCwJAAkACQAJAAkACQCABLQDY8AgiA0EERg0AIAEtANrwCCICQQFLDQAgAg0BIANBAWtB/wFxQQJLDQEgAS0A/fAIRQ0BCyABLQDb8AgQAyEEIAEgAS0A2/AIEAIhBiABLQDY8AghAwwBCyADQQVrQf8BcSICQQNJDQFBjtQAIQZBnw8hBAtBGSECIANB/wFxQQFHDQEMAgsgAkECdEH0hwFqKAIAIQZBnw8hBAsgAEEZQQlBvM4AQbT4AUEBEF8aQSAhAgsgACACQQUgBiAEQQIQXxogBkECEF4hAyALIAEtANWKAUEBajYC0AUgC0GQCGpBEEGXCyALQdAFahDgAiAAQeAAIAIgA2oiAiACQeAATBsiA0EGaiIFQQMgC0GQCGpBv98DQQEQXyEEQQAhAgJ/QQAgAS0A1ooBQf8BRg0AGkEAIAEtANaKASABLQDVigFGDQAaIAEtAJSLASEIIAsgAS0A1ooBQQFqNgLABSALQZAIakEQQe0KIAtBwAVqEOACIAAgBCAFakEBakEDIAtBkAhqQZ8PQYf9AyAIQQFLIgQbQQEQXxpBASABLQCcigFFDQAaIAAgA0EaakEOQQRBBUGfD0GHfSAEGyIEQQF2Qc/3AXEiCkHEISAEAn8gAUEYahCxAUEYbCIGBEBBACAGIAEoAqCKAU0NARogBiABKAKgigFrDAELQYADIAEoAqSKAUGAA3BrC0HfAGoiCEHgAEkbIAhB3wNLIgcbQf//A3EQWCAAIANBH2pBDkEEQQUgCkHEISAEIAhBvwFNGyAHG0H//wNxEFggACADQSRqQQ5BBEEFIApBxCEgBCAIQZ8CTRsgBxtB//8DcRBYIAAgA0EpakEOQQRBBSAKQcQhIAQgCEH/Ak0bIAcbQf//A3EQWEEBCyEGIAEtAJyKAQRAIAEoAqSKASECCyALIAJB4ABuQQNxQQFqNgK0BSALIAJBgANuQeMAcEEBajYCsAUgC0GQCGpBEEG3CCALQbAFahDgAiAAIAVBDiALQZAIakG0+AEQYwJAIAYNAAJAIAEtANiKAUH/AUcEQCALIAEtANiKAUHBAGo2AqAFIAtBkAhqQRBB2A4gC0GgBWoQ4AIMAQsgAS0A14oBQf8BRg0BIAEtANeKASECIAtBADoAkQggCyACQcEAajoAkAgLIAAgA0EaakEOIAtBkAhqQZ8PEGMLIAFB2PcIaiEKIANBBWohByABQecAaiEIQQAhAgNAIAAgAkEHbCIEIAVqQRRBBUECAn9BivADIAggAkEwbGotAAANABpBv98DIAEoAsj3CCAKIAJBAnRqKAIASQ0AGiACEAMLEFgCQCABLQDZ9QhFDQAgAiABLADY9QhHDQAgACAEIAdqQRNBB0EEQb/fAxBbCyACQQFqIgJBBkcNAAsgCyABLwEYIgJBCm4iAzYCkAUgC0GQCGpBEEHRDiALQZAFahDgAiAAQboBQQUgC0GQCGpBh/0DQQIQYBogAiADQQpsa0H//wNxIgIEQCALIAI2AoAFIAtBkAhqQRBBjg0gC0GABWoQ4AIgAEG7AUEEIAtBkAhqQYf9AxBjCwJ/IAEtAOXcB0UEQEHiKyEDQbT4AQwBC0HfEkGUzgAgAS0Al4sBGyEDQbT4AUGKcCABLQCXiwEbCyECIABBuwFBDiADIAJB//8DcRBjIAtBfzYC8AcCQAJAIAEtAJb2CA0AAn8gAUHc6ghqIQogASgCyPcIIQYgC0HwB2ohB0EAIQMDQAJAIAogA0EEdGoiAi0AAEUNACACLwEKIgRFDQAgAi0AAg0AIAItAAMNACAGIAIoAgxrIgJBrAJJDQAgByADNgIAQf8BIAJB/wFsQdTVBGsgBEGsAmtuIgMgA0H/AU8bDAILIANBAWoiA0EORw0AC0F/CyIEIQIgBEEASARAIAEtAJb2CA0BIAtB4AVqIQdBACECIwBBEGsiAyQAIAFBkPQIaiEFIAFB/PQIaiEIIAFBsPEIaiEKAn8DQAJAIAIgCmotAABFDQAgAiAIai0AAEEERw0AIAEoAsj3CCAFIAJBAnRqKAIAayIGQawCSQ0AQeAOEJoBIQogAyACEPMBQTtqNgIAIAdBFiAKIAMQ4AJB/wEgBkH/AWxB1NUEa0GkDW4iAiACQf8BTxsMAgsgAkEBaiICQRtHDQALQX8LIQIgA0EQaiQAIAJBAEgNAQsgAkEYbEH/AW4hBkEAIQIDQCAAIAJBAXQiA0HQgwFqLAAAQdIBaiADQdGDAWosAABBDGpBAkECQYf9A0GI0wAgAiAGSRsQWCACQQFqIgJBGEcNAAsCQCAEQQBIBEAgC0HgBWohAwwBC0GsLCEDQQEhAgJAAkACQAJAIAsoAvAHQQZrDggBBgQCBgAGAwYLQYc+IQMMAwsgAS0A2PAIQQhGBEBB3DkhAwwDC0H7HEG7xAAgAS0A2/AIQQFGGyEDDAILQao4IQMMAQsCQCABLQDY8AhBBEcNACABLQDZ8AhBCEcNAEHtIiEDDAELQc0MEJoBIQIgCyABLQDb8AhBAWo2AuAEIAtBkAhqQRAgAiALQeAEahDgAiALQZAIaiEDC0EBIQIgAEHDASADQQEQXiIGayIEQboBQfPOAEECEF5rIgUgBCAFSBsiBEECQckBIARrQRRBwhAQWCAAQcUBIAZrQQkgA0GH/QNBARBfGgwBCwJAIAEtAPnwCEUNACABLQDb8AhBAkkNAAJAIAEtAPv6CCICQeQATwRAIAtB1JKVAjYCkAgMAQsgCyACNgLwBCALQZAIakEQQb7YACALQfAEahDgAgsgAEHKAUEEIAtBkAhqQfPvARBjIABBygFBDkGQzABBivADEGNBASECDAELQQAhAiABLQD6+ghB4ABJDQAgAEHKAUEOQaLZAEGK8AMQYwsCQAJAIAEtAN6KAUUNACABLQCcigFFDQAgAEHKAUEEQaEuQcD4AxBjDAELIAINACABLQDcigFFDQAgAEHKAUEEQZE0QZ8PEGMLIAEoAsj3CCABKAK89whJBEAgAEHfAUETQQJB8+8BEF0LIAEtAMD3CCECIABB5QFBBUEIQQ9BiNMAEFsgAEHnAUEDQQRBAkGI0wAQWCAAQecBQRIgAkELbEHkAG4iA2tBBCADQfPvAUGHfUGKcCACQQ9LGyACQR5LG0H//wNxEFggAEEAQRdB8AFBxCEQWQsgAEHwATYCECAAQQA2AgggACAAKAIEIgI2AgwgACACQQhqIgM2AhQgAkEYSARAIABBGDYCDAsgA0GIAUoEQCAAQYgBNgIUC0HA/QtBAjoAAAJAAkACQAJAIAEtANrwCA4IAgAAAAAAAAEACyAAKAIYIgJB9P0LKAIARwRAQfT9CyACNgIAIAEgC0HgBWpB0P0LQej9C0Hs/QtB8P0LEG0LAkAgAEEaQRQQV0UNACAAQQBBGkHwAUESQej9Cy8BABBYIABBBkEcQdD9C0HCEEECEF8aIAsCfwJAIAEtANrwCCICQQlGBH9BkssAIQNBqNkAIQICQAJAAkAgAS0A4vUIQQFrDgIBAAILQZDLACEDCyADEJkBIQILIAEtAN/1CCEDIAsgAjYCtAEgCyADQQZwQQJ0QbDZAGooAgA2ArABIAtB4AVqQRhBuAogC0GwAWoQ4AIgAEHQ/QtBAhBeQQhqQSAgC0HgBWpBwhBBARBfGiABLQDa8AgFIAILQf8BcUEBRwRAIAEtANjwCEEBRw0BC0GXCyEDIAEtANWKAQwBC0HTDCEDIAEtANvwCAtB/wFxQQFqNgKgASALQeAFakEYIAMgC0GgAWoQ4AIgAS0AmvEIBEAgAEHsAUGayQAQYmtBHEGayQBBwhAQYyAAQewBIAtB4AVqEGJrQSQgC0HgBWpBwhAQYwwBCyAAQeoBQSAgC0HgBWpBwhBBARBgGgsgAS0A2vAIIQMCQAJAIAEtANvwCCIGQQFNBEBBNCECIANBDUsNAkEBIAN0IgNBiOQAcUUEQCADQcIIcQ0CDAMLIAAgASAGQS9BDhDiAUHqACECDAILQTQhAiADQQpLDQFBASADdEHCCHFFDQELIAFBsPEIaiENIAFB2PcIaiEOIAFB5wBqIQxBACECA0AgAEESQQAgAkECSxsiA0EwaiIEQRAQVwR/IAIgAkEDayACQQNJG0HPAGwiBkECaiEKQQAhCCAMIAJBMGxqLQAAIgVFBEAgASgCyPcIIA4gAkECdGooAgBJIQgLIAIQ9QEgDWotAAAhByAAIAogBEHMAEEQIAIQAyIJQcQhIAggB0H/AXFBAEdyIggbEFgCQCABLQDZ9QhFDQAgAiABLADY9QhHDQAgACAKIARBzABBEEG/3wMQWwsgCyACQQFqIgQ2ApABIAtB4AVqQQhB0Q4gC0GQAWoQ4AIgACAGQQVqIANBNmogC0HgBWpBwhBBtPgBIAgbEGMgACAGQQ1qIANBNWoiAyABIAIQAkHCEEG0+AEgCSAFGyAIG0EBEF8aIAUEQCAAIAZBxABqIANB4yxBivADQQEQXxoLIAQFIAJBAWoLIgJBBkcNAAtB2AAhAgtByP0LLQAAQQFGBEAgACACQez9CygCABDjAQsgACACQQpqQfD9CygCABDjASABLQDa8AhBAUcNAkHI/QstAABBAUcNAiAAIAJBFGpB4tMAEOMBDAILIABBBEEaQasdQfPvAUEBEF8aIAAgARDkAQwBCwJAAkACQAJAAkACQAJAAkAgAS0A2PAIQQFrDggAAgYHBQQDAQgLQcD9C0EDOgAAIAEtAP3wCARAIAAgARDlAQwICyAAIAECfyABLQCA8QgEQEHA+AMhA0HnOAwBC0Ha8gMhA0EAIAEsAP/6CCICRQ0AGkGVMEGFFyACQQBIGwsgAxDmASABQdj3CGohGSABQcKKAWohGiABQfgCaiEbIAFBwBpqIRwgAUHuAGohHSABQaiKAWohHiABQdgAaiEfA0AgACAPQQR0IhRBIWoiAkEQEFcEf0GI0wAhESAfIA9BMGwiBmoiFS0AD0UEQCAPEAMhEQtBtPgBIQMgAS0A2/AIIA9GBEAgAEEAIAJB8AFBD0HEIRBYIABBACACQQJBD0GfDxBYQZ8PIQMLIAsgD0EBaiIgNgLAASALQeAFakEQQdEOIAtBwAFqEOACIABBBSAUQSVqIhIgC0HgBWogA0EBEF8aIABBDyASIAEgDxACQbT4ASARIBUtAA8bQQEQXxogHiAPQQF0ai8BACECIAEtAJyKASEDIAEtAJyKASEEIABB2gAgFEEjakHUAEELQcQhEFtBA0EFIA9BAkkiDBshFkEAIQkgAkHw/wNxQQAgBBshDiAUQSxqISEgFEEoaiEXIBRBJmohGCAGIB1qISIgGyAPQYQLbGoiCEGEAWohCiAPQYAUbCAcakGAKGshDSACQQ9xIRAgA0H/AXEhEwNAIAkgDnIhBUEAIQICQAJAAkACQCAMRQRAICItAAAiAkEQIAIbIQRBACECDAELA0AgCiACQQZ0aiAFIAggAkEDdGotAAAiA0EQIAMbcGotAABBAXENAyACQQFqIgJBEEcNAAsMAQsCQANAAkACQCANIAUgAmsgBG8gBGogBG9BKGxqIgMQpwFFBEAgAkUNBiACIAMtAAIiBkH/AHEgBkEHdmpJQQF0IQYgA0EKahCnAUUNAQwCC0EAIQYgA0EKahCnAQ0BIAJFDQULQQIgBiACIAMtAAwiB0H/AHEgB0EHdmpJGyEGCwJAAkAgA0EUaiIHEKcBRQRAIAJFDQZBAiAGIAIgBy0AAiIHQf8AcSAHQQd2akkbIQYgA0EeahCnAUUNAQwCCyADQR5qEKcBDQEgAkUNBQsgAiADLQAgIgNB/wBxIANBB3ZqTw0AIAlBBWxB3ABqIQIMAgsgBkUEQCACQT5LDQMgAkEBaiICIARPDQMMAQsLIAlBBWxB3ABqIQIgBkEBRw0AIAAgAiASIBZBByAREFgMAwsgACACIBhBBUEFQYjTAEHz7wEgFS0ADxsQWAwCCyAAIAlBBWwiAkHdAGogF0EBQQFBiNMAEFggAkHcAGohAgwBCyAAIAlBBWxB3ABqIgIgEiAWQQcgERBYCwJAIBNFDQAgCSAQRw0AIAAgAiAhQQRBAUG/3wMQWAsgCUEBaiIJQRBHDQALIBUtACkiAkHAAHJBwABHBEAgAEG0ASAYQfAjQfMjIAJBwABJG0GI0wBBwPgDIBUtAA8bEGMLIBUtAAQhAiAPIBpqLQAAIQMgAEHIASASQRpBA0HEIRBYIABByAEgEiACQRpsQf8AbkEDIBEQWCAAQcgBIBRBKmoiAkEaQQJBxCEQWCAAQcgBIAIgA0EabEH/AW5BAkHz7wEQWAJAIBUtAA8EQCAAQeYBIBJB4yxBivADQQEQXxoMAQsgASgCyPcIIBkgD0ECdGooAgBPDQAgAEHpASAXQQMgERBdCyABLQDbigEgD3ZBAXEEQCAAQeMBIBRBImpBDEENQcD4AxBbCyAgBSAPQQFqCyIPQQZHDQALDAcLIABBBkEcQdMwQb/fA0ECEF8aIABB6gFBIEHYFkG0+AFBARBgGiAAQQRBLEHoAUHEIRBZIAEtAJP2CCEDIAEtAJL2CCECIABBNEE0EFcEQCAAQQpBNkHaAEEuIAIQAxBYIAsgAkEBajYC0AQgC0HgBWpBHkHTDCALQdAEahDgAiAAQTdBPCALQeAFakHCEEEDEGEgAEE3QdgAIAEgAhACQcIQQQEQYSAAQfgAQcYAQbrOAEG/3wNBAxBhIABBjAFBNkHaAEEuIANB/wFxQQZwIgIQAxBYIAsgAkEBajYCwAQgC0HgBWpBHkHTDCALQcAEahDgAiAAQbkBQTwgC0HgBWpBwhBBAxBhIABBuQFB2AAgASACEAJBwhBBARBhCyAAQe4AQa85EOMBQcj9Cy0AAEEBRw0GIABB+ABB0cAAEOMBDAYLIAEtAP3wCARAIAAgARDlAQwGCyABLQD++gghAiAAIAFBAEG/3wMQ5gECQAJAAkAgAkEDcSICDgQAAgIBAgsgASABLQDb8AgiB0EwbGohAiAHEAMhAyAAQSVBChBXBEAgCyABIAcQAjYChAQgCyAHQQFqNgKABCALQeAFakEYQccJIAtBgARqEOACIABBBkEmIAtB4AVqIANBARBfGiAAQewBQa8xEGJrQSdBrzFBiNMAEGMLIAJB2ABqIQVBACECA0ACQCAAQTFBOhBXRQ0AIAAgAkE6bCIDQQZqQTEgAkECdEGwhgFqKAIAIAIQBSIGQQEQXxogACADQRBqIgRBPEEUQShBxCEQWAJAIAJBAUYEQCAAIAMgBS0ABSIIQQpsIgpBgAVrQcAAbcEiBEEAIAhBOkkiCBtqQRpqQTxBACAEa0EBIAQgCkHBBGtB/wBJGyAIG0EoIAYQWAwBCyAAIARB5AACfyACRQRAIAUtACoMAQsgAkECRgRAQQAgB0UNARogBS0ABwwBC0EAQf8AIAUtACsbC0EobEH/AG4iCGtBFCAIIAYQWCACQQNGBEAgACADQRpqQcsAQZE3QfApIAUtACsiAhtBtPgBQcIQIAIbQQEQYQwCCyACRQRAIAUtACoNASAAQRpBywBBkTdBtPgBQQEQYQwBCyAHDQAgAkECRw0AIABB/ABBywBBw8MAQbT4ARBjCyACQQFqIgJBBEcNAQsLAkAgAEHuAEEJEFdFDQAgAEEGQfAAQYsSQbT4ARBjIAFBgwFqIQdBACECA0AgByACQTBsai0AACEFIAsgAkEBaiIDNgLwAyALQeAFakEYQdEOIAtB8ANqEOACIAJBDmwiCEEoaiEKQcQhIQZBtPgBIQQgBUUEQCACEAMhBkHCECEECyAAIApB7gBBDEEJIAYQWCAAIAhBLGpB8AAgC0HgBWogBBBjIAMiAkEGRw0ACyALIAEtAC8Ef0Go2QAFQegWEJkBCzYC4AMgC0HgBWpBGEHVCiALQeADahDgAiALLQDgBUUNACAAQYABQfAAIAtB4AVqQYjTABBjC0HI/QstAABBAUcNByAAQfwAQZPBABDjAQwHCwJAIAEtAC4iAkE8a0H/AXFBCE0EQCALQYYrLQAAOgCUCCALQYIrKAAANgKQCAwBCyACQTtNBEAgCyACNgKgBCALQZAIakEQQcoNIAtBoARqEOACDAELIAsgAkFAajYCsAQgC0GQCGpBEEHQDSALQbAEahDgAgsgAEEEQTBB8ABBOEGfDxBbIABBCEE0Qb4fQZ8PQQEQXxogAEEIQcIAIAtBkAhqQb/fA0ECEF8aIABB+gBBMEHyAEE4QcD4AxBbIABB/gBBNEGLEkHA+ANBARBfGiAAQf4AQcIAIAEtAC8iAkERcEECdEHAhgFqKAIAQdryA0G0+AEgAhtBAhBfGiALIAEtAOncB0HkAGxB/wBuNgKQBCALQeAFakEYQeHYACALQZAEahDgAiAAQQZB7gAgC0HgBWpB8+8BEGNByP0LLQAAQQFHDQYgAEH4AEGTwQAQ4wEMBgsgAEEEQTBBygBBOEGI0wBBnw8gAkECRiICGxBbIABBCEE0QcIRQZ8PQQEQXxogAEEIQcAAIAEtABxBA3FBAnRBoIYBaigCAEG/3wNBAhBfGiALIAEtAB1B5ABsQf8AbjYC0AMgC0HgBWpBGEGL2QAgC0HQA2oQ4AIgAEEIQdQAIAtB4AVqQcD4AxBjIAsgAS0AHkHkAGxB/wBuNgLAAyALQeAFakEYQcTYACALQcADahDgAiAAQQhB3AAgC0HgBWpB8+8BEGMgAEHSAEEwQcoAQThB2vIDQYjTACACGxBbIABB1gBBNEHPzABB2vIDQQEQXxogCyABLQArQeQAbEH/AG42ArADIAtB4AVqQRhBjtkAIAtBsANqEOACIABB1gBBwAAgC0HgBWpBv98DQQIQXxogCyABLQAsQeQAbEH/AG42AqADIAtB4AVqQRhB19gAIAtBoANqEOACIABB1gBB1AAgC0HgBWpBwPgDEGMgCyABLQAtQeQAbEH/AG42ApADIAtB4AVqQRhBxNgAIAtBkANqEOACIABB1gBB3AAgC0HgBWpB8+8BEGMgAEGgAUEwQcwAQThBiNMAEFsgAEGkAUE0QaowQcD4A0EBEF8aIABBpAFBwgBBCkEeQcQhEFggAEGkAUHgACABLQCPAUEebEH/AG4iAmtBCiACQQEQAxBYIABBsgFBwgBBCkEeQcQhEFggAEGyAUHgACABLQC/AUEebEH/AG4iAmtBCiACQQIQAxBYIABBwAFBwgBBCkEeQcQhEFggAEHAAUHgACABLQDvAUEebEH/AG4iAmtBCiACQQMQAxBYIABBzgFBwgBBCkEeQcQhEFggAEHOAUHgACABLQCfAkEebEH/AG4iAmtBCiACQQQQAxBYIABB3AFBwgBBCkEeQcQhEFggAEHcAUHgACABLQDPAkEebEH/AG4iAmtBCiACQQUQAxBYIAEtAIy/AQRAIABBBEEwQcoAQThBxCEQWCAAQQhBxgBBusAAQcD4AxBjIABBCEHOAEG8F0HA+AMQYwtByP0LLQAAQQFHDQUgAEHwAEGTwQAQ4wFByP0LLQAAQQFxRQ0FIABB+ABBvioQ4wEMBQsgCyABLQDVigFBAWo2AoADIAtB4AVqQRhBlwsgC0GAA2oQ4AIgCyABLQCP9ghBAWo2AvACIAtBkAhqQRhBlwsgC0HwAmoQ4AIgCyABQRhqELIBNgLgAiALQfAHakEYQdEOIAtB4AJqEOACIAEtAIidCCECIABBBkEcQdw4Qb/fA0ECEF8aIABB6gFBIEH7xgBBk8cAIAIbQbT4AUEBEGAaIABBBEEsQegBQcQhEFkgAEEwIAEtAI72CEVB3DggC0HgBWoQ5wEgAEE8IAEtAI72CEEBRkGHHiALQZAIahDnASABLQCO9gghAiAAQcgAQQwQVwRAIABBBkHKAEHgHCACQf8BcUECRgR/IABBAEHIAEHwAUELQcQhEFggAEEAQcgAQQJBC0GfDxBYQb/fAwVBtPgBC0EBEF8aCyABLQCR9gghAiABLQCO9gghAyAAQdQAQQwQVwRAIABBBkHWAEGsKkHpKCACGyADQf8BcUEDRgR/IABBAEHUAEHwAUELQcQhEFggAEEAQdQAQQJBC0GfDxBYQb/fAwVBtPgBC0EBEF8aCyAAQeAAIAEtAI72CEEERkG6GSALQfAHahDnASAAQfAAQZwoEOMBIABBBEH6AEHq1gBBjDggAS0AnIoBG0HA+ANBtPgBIAEtAJyKARsQYwwECyAAQQZBHEGHPkG/3wNBAhBfGiAAQeoBQSBBxR9BtPgBQQEQYBogAEEEQSxB6AFBxCEQWSABQaiKAWohFiABQe0AaiERIAFBGGohD0EAIQcDQCAAIAdBDmwiAkEvaiIMQQ4QVwR/IAcgAS0AifYIRyIORQRAIABBACACQS5qQfABQQ5BxCEQWAsgCyAHQQFqIhM2AtACIAtB4AVqQRBB0wwgC0HQAmoQ4AIgAEEEIAJBMmoiECALQeAFaiAHEANBARBfGkF/QQAgB0EBSyIGGyEDIBEgB0EwbGoiEi0AAEEGcEH8/wBqLQAAIQQCQCAGDQAgDg0AIAEtAIr2CCEDCyAPIAcgAxCoASIDIARsQQhtIQYgAS0AnIoBBH8gFiAHQQF0ai8BACADcAVBfwshCSADQQBKBEBBoAEgBiAGQaABThsiBiADIAMgBkgbIQUgAkExaiENQQAhBANAIAQiAkEBaiIEIAVsIANuIAIgBWwgA24iBmsiCCAIQQJKayEIIAAgBkEWaiANIAhBCQJ/Qb/fAyACIAlGDQAaIAcQAyIGIAJBA3FFDQAaIAZBAXZB7/cBcQsQWCADIARHDQALCyAAQcYAIAxBDEG0+AEQWiAAQfYAIAxBDEG0+AEQWiAAQaYBIAxBDEG0+AEQWiASLQAAIQIgCyADNgLAAiALIAJBBnBBAnRBkIABaigCADYCxAIgC0HgBWpBEEHPCSALQcACahDgAiAAQewBIBAgC0HgBWpBtPgBQb/fAyAOG0EBEGAaIBMFIAdBAWoLIgdBBkcNAAsgAS0AifYIIgJBAkkEQCALIAEgAiABLQCK9ggQERCZATYCsAIgC0HgBWpBGEGTCiALQbACahDgAkHI/QstAABBAUcNBCAAQYIBIAtB4AVqEOMBDAQLQcj9Cy0AAEEBRw0DIABBggFByyEQ4wEMAwtBACECIAEtAIv2CCIDQQdrQQAgA0EHSxsiBUEKTAR/IAVBAWohBANAIAAgAkEMbEEaaiIDQQwQVwRAIAEgAiAFaiIGIAtB4AVqQRQQ6AEgACADIAYgAS0Ai/YIRiAGQQJ0QfCFAWooAgAQmQEgC0HgBWoQ5wELIAJBBk0EQCACIARqIQMgAkEBaiECIANBC0kNAQsLIAEtAIv2CAUgAwtB/gFxQQZHDQIgAEH8AEGtMxDjAQwCCyAAIAFBAEG/3wMQ5gECQAJAAkAgAS0A6/AIQQFrDgMAAQIBCyABQRhqIRMgAUHd8AhqIRAgAUHvAGohDkEAIQIDQCAAIAJBDWwiA0EmaiIGQQ0QVwR/IAEtANvwCCEIIAIQAyEFIAIgCEciBEUEQCAAQQAgBkHwAUEMQcQhEFggAEEAIAZBAkEMQZ8PEFgLIAsgAkEBaiIJNgKAAiALQeAFakEeQdMMIAtBgAJqEOACIABBBiADQShqIg0gC0HgBWpBtPgBIAUgAkECSSIGG0EBEF8aAn8gBEUEQCAQIAIgAS0A3/AIRg0BGgsgDiACQTBsagstAAAhBUF/IQogBkUEQCATIAIgBRCtASEKC0HVCiEHQQAhDAJAIAQNACACIAEtAN/wCEcNAEG1zgBB1QogDiACQTBsai0AACAFQf8BcUciDBshBwsgCyAFQQdwQQJ0QbCAAWooAgA2AvABIAtB4AVqQR4gByALQfABahDgAgJAIAZFBEAgAEEcIA0gC0HgBWpBiNMAQb9fQbT4ASACIAhGGyAKQQBOIgIbQb//A3FBARBfGiACBEBBxgwQmgEhAiALIApBAWo2AtABIAtB4AVqQR4gAiALQdABahDgAiAAQewBIAtB4AVqEGJrIANBKWogC0HgBWpBtPgBEGMMAgsgDARAIAEtAN7wCEEBRw0CQQAhAiABKALI9wggASgC4PAIayIGQc8PSyIERQRAQbMQIAZrQf//A3FB5ABuIQILQY8eEJoBIQUgCyACQf8BcUEKbiIINgLgASALIAIgCEEKbGtB/wFxNgLkASALQeAFakEeIAUgC0HgAWoQ4AIgAEHsASALQeAFahBiayADQSlqIAtB4AVqQYf9AxBjIABBAiADQTFqIAQEf0HsAQUgBkHsAWxB0A9uC0EBQb/fAxBYDAILIABB7AEgBRCdARBiayADQSlqIAUQnQFBiNMAEGMMAQsgAEEcIA0gC0HgBWpBtPgBQQEQXxogAEHsAUH1xgAQYmsgA0EpakH1xgBBiNMAEGMLIAkFIAJBAWoLIgJBBkcNAAsgAEGBAUGM1gAQ4wEMAwsCfyABLQDr8AgiAkEDTwRAIAEtAPB4DAELIAJBAnRB1OQAaigCAAsiBkEASgRAQQAhAgNAIAAgAkEMbEEoaiIDQQwQVwRAIAIhBCMAQaABayIHJAAgC0HgBWoiBUEAOgAAIAtBkAhqIghBqNkANgIAAkACQAJAAkAgASIKLQDr8AgOAwABAgMLIARBBEsNAiAIIARBAnRBkN4AaigCADYCAAJAAkACQAJAAkAgBA4EAAECAwQLIAcgCi8BGCIEQQpuIgo2AhAgByAEIApBCmxrQf//A3E2AhQgBUEUQYwNIAdBEGoQ4AIMBgsgByAKLQAaNgIgIAVBFEGO2QAgB0EgahDgAgwFCyAKLQAbBEBB2RoQmgEhBCAHIAotABtBBHQ2AjAgBUEUIAQgB0EwahDgAgwFCyAFQRRBmzZBABDgAgwECyAHIAotACpBGGs2AkAgBUEUQawUIAdBQGsQ4AIMAwtBASEEAkACQAJAIAotACQiCkECaw4DAgABAAtBA0EAIApBCEYbIQQMAQtBAiEECyAHIARBAnRBsN4AaigCADYCACAFQRRB1QogBxDgAgwCCyAEQQVLDQEgCCAKIARBMGxqLQBvQQdwQQJ0QbCAAWooAgA2AgAgB0H1xgBBqNkAIARBAkkbNgJQIAVBFEHVCiAHQdAAahDgAgwBCyAEQQNLDQAgCCAEQQJ0QcDeAGooAgA2AgACQAJAAkACQCAEDgMAAQIDCyAHIAotACBBDHBBAnRB4IABaigCADYCcCAFQRRB1QogB0HwAGoQ4AIMAwsgByAKLQAhQQlwQQJ0QZCBAWooAgA2AoABIAVBFEHVCiAHQYABahDgAgwCCyAHQfApQZE3IAotACMbNgKQASAFQRRB1QogB0GQAWoQ4AIMAQsgByAKLQAiQQVwQQJ0QdDeAGooAgA2AmAgBUEUQdUKIAdB4ABqEOACCyAHQaABaiQAIAAgAyACIAEtAIz2CEYgCygCkAggC0HgBWoQ5wELIAJBAWoiAiAGRw0ACwsgAS0A6/AIIgJBAkYEfyAAQdwAQR4QVwRAQQEhAgJAIAEtACFBCXAQtgEiA0EATA0AIAEtACBBDHAgAS0AIUEJcEEAQQQQtwEhBiAAQQZB3gBBGkEQQcD4AxBYIABBE0HiACAGQQxvQQJ0QeCAAWooAgBBwhBBARBhIANBAWsiA0UNAEEHIAMgA0EHTxshBANAIAEtACBBDHAgAS0AIUEJcCACQQQQtwEhAyAAIAJBHWwiBkEGakHeAEEaQRBBxCEQWCAAIAZBE2pB4gAgA0EMb0ECdEHggAFqKAIAQb/fA0EBEGEgAiAERiEDIAJBAWohAiADRQ0ACwsgAEH0AEHFPhDjAQsgAS0A6/AIBSACC0H/AXENAkHI/QstAABBAUcNAiAAQYEBQZ4kEOMBDAILIABBJUEJEFcEQCAAQQRBJkGCzABBpjYgAS0A8vUIIgIbQYrwA0GI0wAgAhsQYyAAQewBQd8pQe02IAEtANyKARsQYmtBJkHfKUHtNiABLQDcigEbQcD4A0G0+AEgAS0A3IoBGxBjCyABLQDweEUEQCAAQTxBMhBXRQ0CIABB+ABBPkHJD0G0+AFBAhBhIABB+ABB1gBB9yhBtPgBQQEQYSAAQfgAQeIAQfPLAEG0+AFBARBhDAILIAEtAJD2CCICQQZrQQAgAkEGSxshBSABQbH5AGohCiABQfH4AGohB0EAIQIDQCACIAVqIgMgAS0A8HhPDQIgACACQQxsQS5qIgZBDBBXBEACQCADIAdqLQAAIgRBEE8EQEHACxCaASEIIAsgAyAKai0AADYCrAIgCyAEQQR2QcAAcjYCqAIgCyAEQQ9xQQFqNgKkAiALIANBAWo2AqACIAtB4AVqQRggCCALQaACahDgAgwBCyALIAMgCmotAAA2ApgCIAsgBEEBakH/AXE2ApQCIAsgA0EBajYCkAIgC0HgBWpBGEHVCyALQZACahDgAgsgAS0AkPYIIQhBACEEAkAgAS0A3IoBRQ0AIAEtAJyKAUUNAEG6zgBBACADIAEtAN2KAUYbIQQLIAAgBiADIAhGIAtB4AVqIAQQ5wELIAJBAWoiAkEHRw0ACwwBCyABIQNBACEHQQAhCiMAQcAGayIFJABBwP0LQQg6AAAgAEEYQQwQVwRAQQEhAiADLQDb8AgiESAFQdAFahAkIgxBAEoEQCAMQQNxIQ4gAy0A2fAIIQ9BACECIAxBBE8EQCAMQfz///8HcSESA0BBAUEBQQFBASAHIA9B/wFxIgggBUHQBWogAmoiBC0AAEYbIAQtAAEgCEYbIAQtAAIgCEYbIAQtAAMgCEYbIQcgAkEEaiECIApBBGoiCiASRw0ACwsgDgRAA0BBASAHIAVB0AVqIAJqLQAAIA9B/wFxRhshByACQQFqIQIgCUEBaiIJIA5HDQALCyAHRSECCyAREAMhCCAAQQRBGSADLQDZ8AgiBEENTQR/IARBAnRB0NoAaigCAAVBqNkAC0G/XyAIIAIbQf//A3FBARBfIQcgAywA+PAIIgIEQCAFQS1BKyACQQBIGzYCwAUgBSACIAJBH3UiBHMgBGs2AsQFIAVBkAZqQRhB7gsgBUHABWoQ4AIgACAHQQpqQRsgBUGQBmpBh/0DEGMLIAxBemwhByADLQDb8AghBEGEIiECAkACQAJ/AkACQAJAAkACQAJAAkACQCADLQDZ8AgODgABAgMGCQoKCQoEBQoHCgtB2iNBACAEQQJPGyAEQQFHDQcaQc0xIQIMCAsgBEEBTQRAQYD5ACgCAAwHCyADIARBMGxqLQBvIgJBAmtB/wFxQQRLDQggAiAFQYQGahCfASEJQQAgBSgChAYiD0ECSA0GGiAJIAMgBGotAPLwCEEBaiAPcEE4bGooAgAMBgsgAyAEai0A8vAIRQRAQbj5ACgCAAwGC0GoxQAhAgwGC0GqMEEAIAQbIAMtAP36CEUNBBpBgxIhAgwFC0GwHSECDAQLQYA/IQIMAwtByDEhAgwCCyADLQDz8AhBAWpBA3FBAnRBkIQBaigCAAsiAkUNAQtBvs4AEJkBIQQgBSACEJkBNgK0BSAFIAQ2ArAFIAVBkAZqQRhBkQkgBUGwBWoQ4AIgACAHIAVBkAZqEGJrQeABakEbIAVBkAZqQbT4ARBjC0EAIQIgDEEASgRAIAdB5gFqIQcDQCAAIAdBHEEKQQMgBUHQBWogAmotAAAgAy0A2fAIRiIEG0EDIAhBiNMAIAQbEFhBDkEGIAQbIAdqIQcgAkEBaiICIAxHDQALCyAAQQBBIkHwAUHEIRBZCyADLQDb8AghDUHA/QtBCToAAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMtANnwCA4OAAsMCgkIBwYFDwQDAgEPCyANQQFNBEAgAyANQYQLbGpB+AJqIR0gAyANai0A7PAIIhxB+AFxISAgDRADIR4CQCAAQSRBCRBXRQ0AAkAgAywApPEIIgJBAEgNACADLQCo8QhFDQAgHSAcQQZ0aiACai0AhAEiB0EDdkEMcUG0hAFqKAIAIQRBgBVB8S8gB0ECcRsQmQEhCCAFIAQQmQE2AjwgBSAINgI0IAUgAkEBajYCMCAFQQQgB0ECdkEDcSAHQRBxG0ECdEGghAFqKAIANgI4IAVB0AVqQR5B/wggBUEwahDgAiAAQQBBI0HwAUEJQYjTABBYIABBBEEkIAVB0AVqQYf9A0EBEF8aDAELAkAgDUEBRgRAQcEOEJoBIQIgBSAcQQFqNgIgIAVB0AVqQR4gAiAFQSBqEOACIABBBEEkIAVB0AVqQb/fA0EBEF9BCGohB0HJDyECAkAgAyAcQQxsaiIELQCAGSIIQQdLDQAgBEGAGWovAQhFDQAgAyAIIAVBkAZqQSgQFCAFQZAGaiECCyAAIAdBJSACQbT4ARBjDAELIABBBEEkIAMgDSAcEBFBv98DQQEQXxoLIAMtANzwCCECIAUgHSAcQQN0ai0AACIHNgIcIAUgAkEBajYCFCAFQdvQAEG9zwAgIBs2AhAgBSAHQQ9qQQR2NgIYIAVB0AVqQR5B4wwgBUEQahDgAiAAQewBQSQgBUHQBWpBtPgBQQEQYBoLIB1BhAFqIRogHkEBdkHv9wFxISEgA0Hw9whqIA1BBnRqISIDQCAAIBlBC2wiAkEuaiIXQQsQVwRAIB0vAYABQQEgGSAgciIRdHEhEyAdIBFBA3RqLQAAIQcgAyANIBEQEiEVAn8gESAcRyIWBEBBtPgBIQRBwhAhECAhDAELIABBACAXQfABQQpBxCEQWEG/3wMhBEGI0wAhECAeCyEIIAdBECAHGyEOIAUgAyANIBEQERCZATYCACAFQZAGakEFQdUKIAUQ4AIgAEEBIAJBMWoiIyAFQZAGaiAeQYpwIAQgExsgAygCyPcIICIgEUECdGooAgBJG0H//wNxEGNBiNMAIAggExshHyACQTdqIRQgAkEwaiEYIAJBNWohCSACQTNqISQgAkEvaiEGIAJBMmohG0EAIQcDQCAHQQ1sIAdBAnZqQRhqIQwCQCAOIAMtANzwCEEEdCAHaiIPTQRAIAAgDEEFaiAbQQJBAkHEIRBYDAELAkAgGiARQQZ0aiAPai0AACIKQQFxIhIEQAJAIApBBXZBA3EiAkUEQCAAIAwgBkEMQQlBv18gHyAKQQJxG0H//wNxEFgMAQsgACAMIAZBDEEJQcD4A0G0+AEgAkEBRhsQWyAKQQJxRQ0AIAAgDEECaiAjQQhBBUG/3wMQWAsgCkECdkEDcSIEBEAgDEECaiEIQQAhAgNAIAAgCCACQQNsaiAJQQJBAkHCEBBYIAJBAWoiAiAERw0ACwsgCsAhAiAKQRBxBEAgACAMQQlqIBhBAkECQcIQEFgLIAJBAE4NASAAIAxBAWogGEECQQJBwhAQWAwBCyAAIAwgBkEMQQkgEBBYIAdBA3ENACAAIAxBBWogJEECQQJBiNMAEFgLIA8gFUYEQCAAIAwgFEEMQQJBtPgBQcD4AyATG0G0+AEgEhsQWAsgFg0AIA8gAywApPEIRw0AIAMtAKjxCEUNACAAIAxBAWsgF0EOQQtBh/0DEFsLIAdBAWoiB0EQRw0ACwsgGUEBaiIZQQhHDQALDA8LIAMtAPHcByANdkEBcQRAIABBJEEJEFcEQCADIA1BMGxqIgctAG4iAkEQIAIbIQJBgAMgBy0AbUEGcEH8/wBqLQAAbiEEAkACQCADLACk8QhBAEgNACADLQCo8QhFDQBBnQsQmgEhCCAFIAMsAKTxCEEBajYCwAIgBUHQBWpBDCAIIAVBwAJqEOACDAELIAMgDWotAL/1CCAFQdAFakEMELoBCyAHQdgAaiEHIABBBEEkIAVB0AVqQb/fA0EBEF8aQZINEJoBIQggBSADLQDc8AhBBHQiCUEBcjYCsAIgBSAJQRBqIgkgAiACIAlLGzYCtAIgBUGQBmpBHiAIIAVBsAJqEOACIABBOEElIAVBkAZqQZ8PEGMCQCACQf8BcSIIIAggBEH//wNxbiIIIARsa0H//wNxRQRAQd8JEJoBIQIgBy0AFSEHIAUgCDYCkAIgBSAHQQZwQQJ0QZCAAWooAgA2ApQCIAVBkAZqQR4gAiAFQZACahDgAgwBCyAHLQAVIQcgBSACNgKgAiAFIAdBBnBBAnRBkIABaigCADYCpAIgBUGQBmpBHkHOCSAFQaACahDgAgsgAEHsAUEkIAVBkAZqQbT4AUEBEGAaCyAAIAMgDUEwQQEQ6gEMDwsgDRADIQYgAyANQTBsaiICLQBuIgdBECAHGyETIAMgDUF/EBIhGEGAAyACLQBtQQZwQfz/AGotAABuIRcgAEEkQQkQVwRAAkACQCADLACk8QhBAEgNACADLQCo8QhFDQBBnQsQmgEhByAFIAMsAKTxCEEBajYCgAIgBUGEBmpBDCAHIAVBgAJqEOACDAELIAMgDWotAL/1CCAFQYQGakEMELoBCyAAQQRBJCAFQYQGakG/3wNBARBfGgJAIAMtAJ71CCANQQFqRgRAIAMoAqD1CCIHQX9GBH9BAAUgAygCpIoBIAdrCyEHQa4IEJoBIQQgBSAHQYADbkEBajYC4AEgBSAHQeAAbkEDcUEBajYC5AEgBUGQBmpBHiAEIAVB4AFqEOACIABBNEEjIAVBkAZqQQEQXkEEakEJQYrwAxBYIABBNkEkIAVBkAZqQcIQQQEQXxoMAQsgAywA+PAIIgdFDQAgBSAHNgLwASAFQZAGakEeQawNQcMNIAdBAEobIAVB8AFqEOACIABBOEElIAVBkAZqQbT4ARBjCyACQdgAaiECAkAgE0H/AXEiByAHIBdB//8DcW4iByAXbGtB//8DcUUEQEHfCRCaASEEIAItABUhAiAFIAc2AsABIAUgAkEGcEECdEGQgAFqKAIANgLEASAFQZAGakEeIAQgBUHAAWoQ4AIMAQsgAi0AFSECIAUgEzYC0AEgBSACQQZwQQJ0QZCAAWooAgA2AtQBIAVBkAZqQR5BzgkgBUHQAWoQ4AILIABB7AFBJCAFQZAGakG0+AFBARBgGgtBACEEIBMgAy0A3PAIQQR0IhtrIgJBACACIBNNGyEMIA1BgBRsIANqQcANayEUQf8AIQJBACEIA0AgCCAMRwRAIBQgCCAbckEobGoiBxCnAUUEQCAEIActAAAiCSAEIAlKGyEEIAIgCSACIAlIGyECCyAHQQpqIgkQpwFFBEAgBCAJLQAAIgkgBCAJShshBCACIAkgAiAJSBshAgsgB0EUaiIJEKcBRQRAIAQgCS0AACIJIAQgCUobIQQgAiAJIAIgCUgbIQILIAdBHmoiBxCnAUUEQCAEIActAAAiByAEIAdKGyEEIAIgByACIAdIGyECCyAIQQFqIghBEEcNAQsLIAIgBEoEQCADIA1qLQC/9QgiAkEGaiEEIAJBBmshAgsgBCACayIHQQtMBEADQCAEQQFqIgQgAiAEIAJrQQxIayICayIHQQxIDQALCyAAQS4gBCAEQRhrIAIgB0EYSxsiCmtBAWoiAkECQcoAIAJtIhIgEkECTBsiFmwiEEECahBXRQ0NIBBBKmohCSAQQQJtQS5qIQ5BACEMA0AgACAMQQ9sIghBLkEPIBBBxCFBwhAgDCAbciIPIBhGGxBYAkAgDyATTwRAIAAgCEEGaiAOQQJBAkHEIRBYDAELAkAgDEEDcQRAQS4hAiAQQQBMDQEDQCAAIAggAkEBQQFBxCEQWCACIAlIIQcgAkEEaiECIAcNAAsMAQsgACAIQS4gEEGI0wBBtPgBIAwbEFoLIA8gGEcNACAAIAhBLkEOQQJBwPgDEFgLIAxBAWoiDEEQRw0ACwwMC0EAIQJBwP0LQQw6AAAgAy0A7fAIIQcgAy0A8/AIIQRBARADIRECQCADQYAZaiIMIAdBD3EiCkEMbGoiBi0AAEEHSw0AIAYvAQhFDQAgAygC3K0IQQBHIQILIARBA3EhGiADKALcrQghDiAAQSRBCRBXBEBBwQ4QmgEhByAFIApBAWo2AqAFIAVBkAZqQSggByAFQaAFahDgAiAAQQRBJCAFQZAGakG/3wNBARBfIQcgAgRAIAMgBi0AACAFQZAGakEoEBQgACAHQQpqQSUgBUGQBmpBtPgBEGMLIABB7AFB2iMQYiIHa0ElQdojQcD4A0G0+AEgGkEDRhsQYyAAQeYBQckSEGIgB2oiB2tBJUHJEkHA+ANBtPgBIBpBAkYbEGMgAEHgAUGoxQAQYiAHaiIHa0ElQajFAEHA+ANBtPgBIBpBAUYbEGMgAEHaAUGRLBBiIAdqa0ElQZEsQbT4AUHA+AMgGhsQYwsCQCACRQRAIABBPEEoEFcEQCAAQfgAQcAAQcrKAEG/3wNBARBhIABBjcAAEGJBfm1B+ABqQdAAQY3AAEG0+AEQYyAAQdTKABBiQX5tQfgAakHYAEHUygBBtPgBEGMLQYw/IQJByP0LLQAARQ0PDAELIAYtAAAhEiAAQS5BChBXIQICQCAORQ0AIAJFDQBBARADIQQgBi8BCCEHIAYvAQYhAiAAQQRBLkHoAUEJQcQhEFggA0HoqwhqIQggAkHoAWwgDm4hCSACIAdqQegBbCAObiEPQQAhAgNAIAAgAkEEakEyIAIgCGotAABB1QBuIgdrIAdBAXRBAXJBtPgBQbT4ASAEIAIgD08bIAIgCUkbEFogAkEBaiICQegBRw0ACyAEQQF2Qe/3AXEhD0EAIQIDQAJAIAwgAkEMbGoiBy0AACIEQQdLDQAgBy8BCCIIRQ0AIAQgEkcNACAAIAcvAQYiB0HnAWwgDm4iBEEEaiIJQS5BASAHIAhqQecBbCAObiAEayIHIAdBAUwbQb9fIA8gAiAKRiIHG0H//wNxEFkgACAJQS5BA0G/3wNBtPgBIAcbEFoLIAJBAWoiAkEQRw0ACwJAIAMoAuStCCICIAMoAuCtCCIHTQ0AIAIgB2sgDk8NACAAIAetQugBfiAOrSIqgKciB0EEakEuQQIgAq1C6AF+ICqApyAHayICIAJBAkwbQQlBv98DEFsLIBIgAywAjosBRw0AIAMoApCLASAOTw0AIAAgAzUCkIsBQucBfiAOrYCnQQRqQS5BCUHA+AMQWgsgAygC4K0IIRMgAygC5K0IIQICQCAAQTlBOxBXRQ0AQX9B5wEgBi8BBiIYIAYvAQhqIg2tIBOtIit9IixC5gF+IAIgDiACIBNLGyIQIBNrIhetIip/pyIZIBlB5wFOGyICIAJBAEgbQQVqIgdBBEHsASAYrSArfSItQuYBfiAqf6ciH0EFaiIUIBRB7AFOGyICIAJBBEwbIgJLBEAgACACQTkgByACa0E6QcQhEFgLIABBBEHWAEHoAUHEIRBZIANBgKoIaiEOIANBmKgIaiESIBFBAnZB5/MAcSEbIBFBAXZB7/cBcSERICxC6AF+ICp/pyEVIC1C6AF+ICp/pyEWQQAhAgNAIBYgAkHoAWxB+P8DcUHmAW4iB0wgByAVSHEhBCAHIA5qLQAAIghBHGxB/wFuIQkCQCAHIBJqLQAAIg9BCU0EQCACQQVqIQcMAQsgACACQQVqIgdB1gAgD0EcbEH/AW4iD2sgD0EBdEEBckG0+AEgGyAEGxBaC0GfDyARIAQbIQQCQCAIQQpPBEAgACAHQdYAIAlrIAlBAXRBAXIgBBBaDAELIAAgB0HWAEEBIARBAXZB7/cAcRBaCyACQQFqIgJB5gFHDQALAkAgBi0AAUEDRw0AIBpBA0cgBi0ACyIHIAYtAAoiAk1xDQAgBi8BBiIIIAYvAQgiBCACbEH/AW5qIQkgAiAHSQRAIAQgB2xB/wFuIQQLIABBf0HnASAJrSArfULmAX4gKn+nIgIgAkHnAU4bIgIgAkEASBsiAkEFakHwAEEBQX9B5wEgBCAIaq0gK31C5gF+ICp/pyIHIAdB5wFOGyIHIAdBAEgbIAJrIgcgB0EBTBtBA0Hz7wEQWCAAIAJBB2pB6QBB2iNB8+8BEGMLAkAgAy0A0q0IIgJFDQAgF0GAvpIBQYD8pAIgAkEBRhsgAyAGLQAAQdQAbGpBrJ0Iai8BACIHBH8gBwUgAy8BGAtB//8DcW4iB25B8wBLDQAgByATakEBayICIAIgB3BrIgIgEE8NAANAIAAgAq0gK31C5gF+ICp/p0EFakHvAEEEQbT4ARBaIAIgB2oiAiAQSQ0ACwtBACECA0ACQCACIApGDQAgDCACQQxsaiIHLQAAIgRBB0sNACAHLwEIRQ0AIAQgBi0AAEcNACATIAcvAQYiB0sNACAHIBBPDQAgACAHrSArfULmAX4gKn+nIgdBBWpBOUE6QYjTABBaIAUgAkEBajYCkAUgBUGQBmpBKEHRDiAFQZAFahDgAiAAIAdBB2pBOyAFQZAGakG0+AEQYwsgAkEBaiICQRBHDQALAkAgEyAYSw0AIBAgGE0NACAAIBRBOUE6QZ8PEFogACAUQTlBBUGfDxBZIAAgFEHyAEEFQZ8PEFkgACAUQTtBCUEHQZ8PEFggBSAKQQFqNgKABSAFQZAGakEoQdEOIAVBgAVqEOACIAAgH0EHakE8IAVBkAZqQcIQEGMLAkAgDSATTQ0AIA0gEEsNACAAIBlBBGpBOUE6QZ8PEFogACAZQTlBBUGfDxBZIAAgGUHyAEEFQZ8PEFkLIAMsAI6LASAGLQAARw0AIAMoApCLASATSQ0AIAMoApCLASAQTw0AIAAgAzUCkIsBICt9QuYBfiAqf6dBBWpBOUE6QcD4AxBaC0HA/QtBDjoAACAAQfUAQQYQVwRAIAYvAQghAiAGLQABQQNxQQJ0QbDfAGooAgAQmQEhByAGLQACIQQgBUHBywBBqNkAIAYtAAMiCEECcRs2AvAEIAUgAkEEdjYC6AQgBSAHNgLgBCAFIARBGGs2AuQEIAVB0BJBqNkAIAhBAXEbNgLsBCAFQZAGakEoQd0IIAVB4ARqEOACIABBBEH1ACAFQZAGakG/3wMQYyAFQQEgAy0A060IQQNxdDYC0AQgBUGQBmpBKEH0CyAFQdAEahDgAiAAQewBIAVBkAZqEGJrQfUAIAVBkAZqQbT4ARBjC0HA/QtBDzoAAAJ/IAMsANWtCCIHQQBOBEBBljQgAyAHai0AsPEIDQEaCyAaQQJ0QeCFAWooAgALIQJByP0LLQAAQQFHDQ4LIABBgQEgAhDjAQwNCwJ/AkAgAy0A34oBRQRAIAMtAOCKAUUNAQtBgIADIAMoAuiKAUUNARogAygC6IoBDAELIAMQHwshCAJ/AkAgAy0A34oBDQAgAy0A4YoBDQBBAAwBCyADKALkigELIQICfyADLQDfigEEQEGQzAAhB0GK8AMhCUGK8AMMAQsgAy0A4IoBBEBBp8gAIQdBh/0DIQlBv98DDAELQfvGAEHbECADLQDhigEiBBshB0Hz7wFBtPgBIAQbIQlB8+8BQb9fIAQbCyEEIABBJEEMEFcEQCAAQQRBJCAHQQEQXkEIakELIAkQWCAAQQhBJiAHQcIQQQEQXxogAEHsAUEmQfsRQbT4AUEBEGAaCwJ/IAMtAOGKAQRAIAIgAy0A34oBRQ0BGgsgCCACayIHQQAgByAITRsLIQcgAEEyQR4QVwRAIAUgB0EKbCIHQYDiCW42AsAEIAUgB0GA/QBuQQpwNgLEBCAFQZAGakEeQbcIIAVBwARqEOACIAAgAEEIQTIgBUGQBmogBEH//wNxQQQQX0EQaiIHQTRBzR5BtPgBQQIQXxogACAHQcQAAn8CQCADLQDhigFFDQAgAy0A34oBDQBB+8kADAELQaQXQa0+IAMtAN+KARsLQbT4AUEBEF8aCyAAQdIAQQYQVwRAIANBqJ0IahDeASEHQbYeEJoBIQQgBSAHQQpsIgdBgOIJbjYCsAQgBSAHQYD9AG5BCnA2ArQEIAVBkAZqQR4gBCAFQbAEahDgAiAAQQRB0gAgBUGQBmpBtPgBEGMgAEHsAUG9PxBia0HSAEG9P0G0+AEQYwsgAEHaAEEUEFcEQCAAQQRB2gBB6AFBC0HEIRBYIABBBEHaACACrULoAX5CgIADgKdBCyADLQDfigEEf0GK8AMFQfPvAUGI0wAgAy0A4YoBGwsQWEGA4KcSIAMvARgiAm4hByACQY0GSwRAIAdB6AFsIQRBASECA0AgACACIARsQYCAA25BBGpB2gBBC0G/3wMQWiACQQFqIgIgB2xBgIADSQ0ACwsgACAIrULoAX5CgIADgKdBA2pB2ABBAkEPQYf9AxBYQZ8eEJoBIQIgBSAHQcAMbkEKcDYCpAQgBSAHQYD9AG42AqAEIAVBkAZqQR4gAiAFQaAEahDgAiAAQQRB5wAgBUGQBmpBtPgBEGMgAEHsAUHdD0GzLCAIQYCAA0kbIgIQYmtB5wAgAkGH/QMQYwsCQCADLQDfigEEQCAAQfIAQcsVEOMBQcj9Cy0AAEUNDkG/NSECDAELIAMtAOCKAQRAIABB8gBB8y4Q4wFByP0LLQAARQ0OQc8fIQIMAQsgAy0A4YoBBEBB0D8hAkHI/QstAABBAUcNASAAQfIAQdkqEOMBDAELIABB8gBBhdUAEOMBQcj9Cy0AAEEBRw0NQazGACECCyAAQfoAIAIQ4wEMDAsgACADEOQBDAsLIANBIGogAyANQTBsaiICQfIAaiACLQBzIgdB/wFGIgQbLQAAIQggAy0AISEJAkAgAEEkQRoQV0UNACAAQQZBJEHK1QBB9j4gAi0Ac0H/AUYbQbT4AUEBEF8aIAUgCSAHIAQbQf8BcUEJcEECdEGQgQFqKAIAEJkBNgKUBCAFIAhB/wFxQQxwQQJ0QeCAAWooAgA2ApAEIAVBkAZqQR5BkQkgBUGQBGoQ4AIgAEEGQS4gBUGQBmpBv98DQQIQXxogAy0Aq/UIRQ0AIABB6gFBLiADQav1CGpBwPgDQQIQYBoLAkAgAy0A2/AIIgpBAk8EQCADIAogBUH8BWoQECEPIAMgCkEwbGotAG8hAiADLAD48AghByAAQcAAQcEAEFdFDQFBAkEDIAJB/gFxQQJGGyAHaiEJIANBsPEIaiEEQQAhAiAPELYBIQwDQCACIAxvIQcgAhD0ASAEai0AAAR/IAoQAwVBv19BwHggBxsLIQggACACQQ9sIgdBwABBDkE/IAhB//8DcRBYIAUgBSgC/AUgDyACIAkQtwEiCCAIQQxtIghBDGxrQQJ0QeCAAWooAgA2AoAEIAVB0AVqQQxB1QogBUGABGoQ4AIgACAHIAVB0AVqEGJBfm1qQQdqQfEAIAVB0AVqQcIQEGMgBSAIQQFrNgLwAyAFQdAFakEMQdEOIAVB8ANqEOACIAAgB0EGakH4ACAFQdAFakGI0wAQYyACQQFqIgJBEEcNAAtBACECA0AgACACEPUBIghBAWsQ8gFBD2wiCUEJaiIHQcAAQQtBJSAEIAhqIggtAAAEfyAKEAMFQcQhCxBYIAAgB0HAAEELQSVBwhAQWwJAIAJBBk0EQCAFKAL8BSAPIAJBACAFQYQGahC5ASAFQQA6AIcGIAAgCUEKakHdACAFQYQGakHCEEG/3wMgCC0AABsQYwwBCyAAIAlBC2pB3QAgAkECdEG0hQFqKAIAQcIQQYf9AyAILQAAGxBjCyACQQFqIgJBC0cNAAsMAQsgAEH4AEHaAEH2MEG0+AFBARBhC0HI/QstAABBAUcNCiAAQYEBQeIXEOMBDAoLIABBBkEmIAMgDUECayIKakGgiwFqLQAAIg9BBXAiAkECdEGwhQFqKAIAIAJBAXRBxIUBai8BAEECEF8aQb8KEJoBIQcgDUGEA2wgA2oiAkG45ABqIgQtAAAhCCACQbnkAGotAAAhCSACQbrkAGotAAAhAiAFQeAANgLoAyAFIAI2AuQDIAUgCTYC4AMgBUHwKUGRNyAIGzYC7AMgBUGQBmpBHiAHIAVB4ANqEOACIABBOiAFQZAGahDjAQJAIABBxABBIhBXRQ0AIABBBkHEAEHkAUEiQYjTABBbIAQtAAEiCEGAA2whCSAIBEAgCEECdCEHQQEhAgNAIAAgAkHkAWwgB25BBmpBxQBBBEEgIAJBA3EbQcQhEFogAkEBaiICIAQtAAFBAnQiB0kNAAsLIAlBgAYgCBshDCAELQACIggEQCAEQQRqIQlBACECA0AgCSACQQJ0aiIHLQADBEAgACAHLwEAQeQBbCAMbkEGakHiACAHLQACQRhwa0EDQQMgDRADEFggBC0AAiEICyACQQFqIgIgCEH/AXFJDQALCyAPQQFNDQAgACADIApBAXRqQaSLAWovAQBB5AFsIAxuQQZqQcQAQSJBv98DEFoLQcj9Cy0AAEEBRw0JIABB7ABBvCAQ4wFByP0LLQAAQQFxRQ0JIABB9ABBmyMQ4wEMCQsgDUECSQ0IIABBBkEoIAMgDUEwbGoiAi0AaUEFcEECdEGQhQFqKAIAQb/fA0EDEF8aIAItAGohByACLQBrIQQgBSACLQBsNgLYAyAFIAQ2AtQDIAUgB0EDcEECdEGkhQFqKAIANgLQAyAFQZAGakEYQezYACAFQdADahDgAiAAQcIAIAVBkAZqEOMBIAMgDUEEdGoiB0GBpQFqIQMgB0GApQFqIQwgAkHYAGohD0EAIQIDQCAAQfIAIAJBBWwiB2siBCAHQQhqIgcQVwRAIAAgAkEcbEEKaiAEQRYgBwJ/QcQhIAwtAAkgAk0NABoCQCAMLQAMRQ0AIAwtAAtBDHAgAiADai0AAEEMcEcNAEG/3wMMAQsgDRADCxBYCyACQQFqIgJBCEcNAAtByP0LLQAAQQFHDQggAEGBAUHeMEGjJiAPLQARGxDjAQwIC0HA/QtBEToAACADIAVB0AVqEBUhEiADLQDRrQgiAkECSyEHIAJBAmshAgJAIBINACAAQTJBHhBXRQ0AIABB+ABBNkGpF0G/3wNBARBhIABB+ABBwgBBzTxBtPgBQQEQYQsgAkEAIAcbIREgA0GAGWohCCADQaidCGohFUEAIQoDQCASIAogEWoiAkoEQAJAIAAgCkEMbCIOQSRqIgdBDBBXRQ0AIAVB0AVqIAJqLQAAIQ9BtPgBIQQgAy0A0a0IIAJGBEAgAEEAIAdB8AFBC0HEIRBYIABBACAHQQJBC0GfDxBYQb/fAyEECyADIA8gBUGQBmpBHhAUIABBBCAOQSZqIAVBkAZqIARBARBfGiAPwEEASA0AIBUgD0HUAGxqIgIoAgwhB0HaGBCaASEEIAIvAQQhCSACLQAGIQIgBSAHQQpsIgdBgOIJbjYCyAMgBSACNgLEAyAFIAdBgP0AbkEKcDYCzAMgBSAJQQVqQQpuNgLAAyAFQZAGakEeIAQgBUHAA2oQ4AIgAEHmASAFQZAGahBiayAOQSdqIAVBkAZqQbT4ARBjQQAhBEEAIQIDQAJ/QQAgCCACQQxsaiIJLQAAIgxBB0sNABpBACAJLwEIRQ0AGiAMIA9GCyAEaiEEQQAhBwJAIAggAkEBckEMbGoiCS0AACIMQQdLDQAgCS8BCEUNACAMIA9GIQcLIAQgB2ohBCACQQJqIgJBEEcNAAsgBARAIABB6wEgDkEpakECQQEQAxBdCyADLQDQrQggD3ZBAXFFDQAgAEHrASAOQSlqQQJBwPgDEF0LIApBAWoiCkEDRw0BCwsCQCADEGUiAkEITw0AIBUgAkHUAGxqIgktAABFDQAgAEHKAEEcEFdFDQAgAEEEQcoAQegBQRpBxCEQWCADQeirCGohCEEAIQIDQEEBIQcgACACQQRqQdcAIAIgCGotAABBDGxB/wFuIgRrIARBAXRBAXJBARADEFogAkEBaiICQegBRw0ACwNAIAAgB0HoAWxBBHZBBGpB4QBBA0G0+AEQWiAHQQFqIgdBEEcNAAsgAy0AjosBDQAgCSgCDCICIAMoApCLAU0NACAAIAM1ApCLAULnAX4gAq2Ap0EEakHKAEEaQcD4AxBaCyAVEN4BIQIgAEHnAEEMEFcEQEGpIhCaASEHIAVBsNQLKAIANgK4AyAFIAJBCmwiBEGA4gluNgKwAyAFIARBgP0AbkEKcDYCtAMgBUGQBmpBHiAHIAVBsANqEOACIABBBEHnACAFQZAGakG0+AEQYyAAQQRB7wBB6AFBA0HEIRBYIABBBEHvAEGA7gUgAmsiAkEAIAJBgO4FTRtB6AFsQYDuBW5BA0G0+AEQWAtBhw4QmgEhAiAFIAMtAO3wCEEPcUEBajYCoAMgBUGQBmpBHiACIAVBoANqEOACQcj9Cy0AAEEBRw0HIABB9QBB1s8AEOMBQcj9Cy0AAEEBcUUNByAAQf0AIAVBkAZqEOMBDAcLQcD9C0EQOgAAQQEhAkEBEAMhGwJAIAMtAKQBDQAgAy0ApgENACADLQCnAUEARyECCyAAQSRBCRBXBEAgAEEEQSRBoSBBshsgAhtBv98DQbT4ASACG0EBEF8aCyADLQCMiwEhAiADLQCcigEEfyADLwGqigFBD3EFQX8LIQ4gAEEuQToQVwRAIANB/A1qIQwgAEECQS9B2xJBtPgBEGMgAEECQcsAQZAZQbT4ARBjIANB/IoBaiESIANB7IoBaiERIAJBBHQhFSADQYAPaiEPQQAhCgNAIAogFWohCSADLwH8DiEEQX8hB0EAIQIDQCAEIAJ2QQFxRQRAIAIgByAPIAJBBnRqIAkgDCACQQN0ai0AACIIQRAgCBtwai0AAEEBcRshBwsgAkEOTQRAIAJBAWohAiAHQQBIDQELCyAAIApBD2wiAkEBaiIJQTZBDUESQb9fQcQhQcIQIAdBAE4iBBsgCiAORiIIG0H//wNxEFgCQCAEBEAgBSAHQQFqNgKQAyAFQZAGakEeQdEOIAVBkANqEOACIAAgAiAFQZAGahBiQX5takEIakE9IAVBkAZqQcIQQbT4ASAIGxBjDAELIAAgAkEGakE+QQJBAkGI0wAQWAsgCiARai0AACEIIAogEmotAAAhBAJ/AkAgCiAORgRAIAAgCUHSAEENQRJBv98DEFgMAQsgACAJQdIAQQ1BEiAbQcQhIAhB/wFxQf8BRyIWIAcgCEdxIgYbQcIQIBYbEFhBv98DIAZBAUcNARoLQcIQCyEHAkAgCEH/AUcEQCAFIAhBAWo2AoADIAVBkAZqQR5B0Q4gBUGAA2oQ4AIgACACIAVBkAZqEGJBfm1qQQhqQdkAIAVBkAZqIAcQYwwBCyAEwEEATg0AIAAgAkEFakHXAEHZ1ABBivADQQEQXxoLIARBB3EEQCAAIAJBAmpB4QBBC0ECQcD4AxBYCyAEQQhxBEAgACACQQJqQdMAQbzOACAHEGMLIARBEHEEQCAAIAJBCmpB0wBB6zMgBxBjCyAKQQFqIgpBEEcNAAsLQcj9Cy0AAEEBRw0GIABB6gBB7hAQ4wFByP0LLQAAQQFxRQ0GIABB8gBBysMAEOMBQcj9Cy0AAEEBcUUNBiAAQfwAQcnGABDjAQwGC0EAIQJBwP0LQRM6AAACfyMAQRBrIQQgAy0A2/AIIgpBAk8EQCADIApBMGxqLQCAAQRAIARBBjoADkEIDAILQQcMAQtBBCAKQQFHDQAaIARBBzoAD0EFCyEIIAMtANvwCCEHAkAgAEEkQQkQV0UNACAHQQJPBEBB8TUQmgEhBCAFIAdBAWo2AvACIAVBkAZqQSggBCAFQfACahDgAiAAQQRBJSAFQZAGakG0+AEQYwwBCyAAQQRBJUGHPUGI0wAQYwsgAy0AjfYIIgdBB2tBACAHQQdLGyEJA0AgAiAJaiIHIAhODQYgACACQQtsQS1qIgRBCxBXBEAgByEKIAVB0AVqIQ4gBUGQBmohDyMAQYABayIGJAACQAJ/IAMtANvwCCINQQJPBEAgBkGBCjsAeiAGQYCEjCA2AHZBBiEQIAMgDUEwbGotAIABBEAgBkH8AGohEUEHDAILQQYhDAwCC0EDIQwgBkGCBjsAdiAGQQE6AHggDUEBRw0BIAZB+QBqIRFBByEQQQQLIQwgESAQOgAACyAGQfYAaiAMakEIOgAAIA9BADoAAAJAIAogDE0gCkEATnFFBEAgDkGo2QA2AgAMAQsgAyANQTBsakHYAGohDCAOIAZB9gBqIApqLQAAIgpBAnRB4N0AaigCADYCAAJAAkACQAJAAkACQAJAAkACQCAKDgkAAgMEBQcGCAEJCyAGQZktQYUcIAMtAPHcByANdkEBcRs2AgAgD0EoQdUKIAYQ4AIMCAsgDkHGFUG7xAAgDUEBRhtB/RUgDRs2AgAgD0EoQZcoQQAQ4AIMBwsgBiAMLQAYQeQAbEH/AG42AhAgD0EoQY7ZACAGQRBqEOACDAYLQdkaEJoBIQogBiADQRhqIA1Bf0EAIA1BAUsbEKgBNgIgIA9BKCAKIAZBIGoQ4AIMBQsgBiAMLQAVQQZwQQJ0QZCAAWooAgA2AjAgD0EoQdUKIAZBMGoQ4AIMBAsgBiAMLQAQQRhrNgJAIA9BKEGsFCAGQUBrEOACDAMLIAYgDC0AGUEBajYCUCAPQShB0Q4gBkHQAGoQ4AIMAgsgBkHwKUGRNyAMLQAoGzYCYCAPQShB1QogBkHgAGoQ4AIMAQsgBkGQOkH7HyAMLQAOGzYCcCAPQShB1QogBkHwAGoQ4AILIAZBgAFqJAAgACAEIAcgAy0AjfYIRiAFKALQBSAFQZAGahDnAQsgAkEBaiICQQhHDQALDAULQQAhAkHA/QtBEjoAACAFIAMgDUEwbGoiBy0AXDYC0AUgBSAHLQBdIgQ2AtQFIAUgBy0AXjYC2AUgBSAHLQB/NgLcBSAHQdgAaiEPIAMtAP36CEUEQEEAIARBCmwiCEGABWtBwABtwSIHa0EBIAcgCEHBBGtB/wBJGyAEQTpJIgQbIQkgB0EaakEaIAQbIQwDQCAAQSZBzAAQVwRAIAAgAkE6bCIHQQZqQSYgAkECdCIEQYCFAWooAgAgAhAFQQEQXxogACAHQRBqIghBMUEUQTxBxCEQWAJAIAJBAUYEQCAAIAcgDGpBMSAJQTxBARAFEFgMAQsgACAIQe0AIAVB0AVqIARqKAIAQTxsQf8AbSIHa0EUIAcgAhAFEFgLIAJBAWoiAkEERw0BCwsgAyANai0AwooBIQIgAEHyAEEGEFcEQCAAQQZB8gBB5AFBBEHEIRBYIABBBkHyACACQeQBbEH/AW5BBEHz7wEQWAsCQCANBEBBl9gAEJoBIQIgBSAPLQAHQeQAbEH/AG42AtACIAVBkAZqQR4gAiAFQdACahDgAgwBCyAFQbXDACgAADYApwYgBUGuwwApAAA3A6AGIAVBpsMAKQAANwOYBiAFQZ7DACkAADcDkAYLQcj9Cy0AAEEBRw0FIABB+gBBmtcAIAVBkAZqIAMtAP36CBsgBUGQBmogDRsQ4wFByP0LLQAAQQFxRQ0FIABBggFBhCoQ4wEMBQsgAEEmQcwAEFcEQCAAQQZBJkH+1wBBABAFQQEQXxogAEEGQThB5AFBDEHEIRBYAkAgDQRAIABBBkE4IA8tAAdB5AFsQf8AbkEMQQAQBRBYIAUgDy0AB0HkAGxB/wBuNgLgAiAFQZAGakEeQY7ZACAFQeACahDgAgwBCyAFQcnDAC0AADoAoAYgBUHBwwApAAA3A5gGIAVBucMAKQAANwOQBgsgAEEGQcwAIAVBkAZqQb/fA0ECEF8aC0HI/QstAABBAUcNBCAAQfoAQcQdEOMBDAQLQcD9C0ELOgAAIA0NAAJAIABBJEEJEFdFDQAgAEEEQSRBtRZBtPgBQQEQXxogAEEcQSQgAyANEARBv98DQQEQXxogAEHQAEElQa3IAEHA+AMQY0HI/QstAABBAUcNACAAQZYBQSVBhhZBtPgBEGMLIAAgAyANQS5BFhDiAQwDCyAAIQIjAEGQAWsiECQAAkACfyAQQYwBaiEHIAMtANvwCCIERQRAIAdBAjYCAEGA+QAMAQsgAyAEQTBsai0AbyAHEJ8BCyIORQ0AIBAoAowBIglFDQAgAyAEQTBsaiIMQdgAaiEIIAMgBGoiCi0A8vAIIAlvIQYgDC0AbyEMIAQQAyEPAkAgAkEkQQkQV0UNACAERQRAIAMgBCAKLQDs8AhBD3EiCRAREJkBIQcgECADIARBhAtsaiAJQQN0ai0A/AJBDHBBAnRB0P8GaigCABCZATYCNCAQIAc2AjAgEEHgAGpBIEGwCiAQQTBqEOACIAJBBEEkIBBB4ABqQb/fA0EBEF8aDAELIBAgAyAEEAQ2AlAgEEHgAGpBIEHVCiAQQdAAahDgAiACQQRBJCAQQeAAakG/3wNBARBfGiAMQQZLDQBBASAMdEHoAHFFDQAgDCAILQAIENIBIglFDQAgECAJLwAINgJAIBBB4ABqQSBBpBIgEEFAaxDgAiACQewBIBBB4ABqEGJrQSUgEEHgAGpBiNMAEGMLAkAgAkEuQQkQV0UNACACQQRBLiAOIAZBOGxqKAIAIA9BARBfGiAQKAKMASIJQQBMDQBBACEOA0AgCSAOa0F5bEHsAWohCQJAIAYgDkYEQCACIAlBL0EFQQUgDxBYDAELIAIgCUEvQQVBBUGI0wAQWwsgDkEBaiIOIBAoAowBIglIDQALCyACQTdB0QAQV0UNACACQQRBN0HoAUHRAEHEIRBbAkACQCAERQRAIAMgBEGEC2xqIAotAOzwCEEPcUEDdGoiCS0A+wIhDiACQQZB3wBB5AFBxCEQWSAQQQU6AFogECAJLQD8AkEMcDoAWyAJLQD6AiEDIBBB5JsBOwBeIBAgDkHYAWxB/wBuQQZqIgY6AF0gECADOgBcQeQBIAYgBkHkAU8bIQNBACEOQZmJDC0AAEEGRgRAIBBB2gBqQQYQ1QJFDQMLQaCJDCAQKABaNgIAQZmJDEEGOgAAQaSJDCAQLwBeOwEAIAlB+AJqIgktAARBDHBBAXRB4IAHai8BACEEIAktAAJBQGqyQwAAwD6UQwAAQEGVEMwCIASzlCEpIAazISgDQCAOQQF0IgZBnP4LakEmAn8gDrMiJ0MAAIDAlCAolRDOAiApICdDj8L1PZSUQwAAlkOVEN4ClEMAAAhClCIni0MAAABPXQRAICeoDAELQYCAgIB4CyIJazsBACAGQeSBDGogCUEmajsBACADIA5BAWoiDkcNAAsMAQsgAyAEQTBsakHQ9gBqIQ4CQAJAAkACQAJAIAxBAmsOBAIBAwAECyAGQQNNBEAgAiEHIAQhCiMAQdAAayISJAACQCAGQQFLIhsQ+gFFBEAgAkH4AEHcAEGYPkG0+AFBARBhDAELIBsQ+wEhGCADIApBMGxqIgpB0PYAaiIOQQpBAyAbG2otAAAhFyAOIApB2ABqIgpBBEEDIBsbEK4CISgCf0MAAAAAQwAAgD8gDiAKQQUQrgIgKCAXs0MAAP5ClZKSIiggKEMAAIA/XhsgKEMAAAAAXRsgGEEBayICspRDAAAAP5IiKItDAAAAT10EQCAoqAwBC0GAgICAeAshBiAYQQBMDQAgGEF5bEHjAWoiCkEATA0AIAogGGxB2ApLDQAgGEF7bEHMAGoiF0H/AUoNACASIAMgG0ECdGooAoT7CCIDQRh2OgBPIBIgA0EQdjoATiASIANBCHY6AE0gEiADOgBMIBJBECAXIBdBEEwbIgw6AEsgEiAKOgBKIBIgGDoASSASIBs6AEggEkECOgBHAkACQEGZiQwtAABBCUYEQCACIQMgEkHHAGpBCRDVAkUNAQtBoIkMIBIpAEc3AwBBmYkMQQk6AABBqIkMIBItAE86AAAgDEEBdiIJQQFrIQQDQCAKIBxsIRdBACEDIBsgHEEDIBJBIGoQ/AEhGSASKAIgIRUDQCADIBdqQZz+C2ogBCAZIAMgFWwgCm1BAXRqLgEAbEGAgH5tIAlqOgAAIANBAWoiAyAKRw0ACyAcQQFqIhwgGEcNAAsgAiEDIBhBAEwNAQsDQAJAIAcoAgwgAiADIgRrQQVsQTxqIhUgDGpODQAgFSAHKAIUTg0AIApBAkgNACADQQdsIgNBCmohHEGfD0GI0wBB75MBIAQgBkgbIAQgBkYbIQggA0EJaiEPIAQgCmxBnP4LaiEJQQEhAwNAAkAgBygCDCAVIAMgCWoiGUEBay0AAGoiFyAVIBktAABqIhkgFyAZShtKDQAgBygCFCAXIBkgFyAZSBtMDQAgByADIA9qIBcgAyAcaiAZIAgQXAsgA0EBaiIDIApHDQALCyAEQQFrIQMgBEEASg0ACwsgEiAYNgIUIBIgBkEBajYCECASQSBqQRhB8gwgEkEQahDgAiAHQQpBgAEgEkEgakG/3wMQYyASIA5BC0EEIBsbai0AAEEDcUEBajYCACASQSBqQRhB1g0gEhDgAiAHQeYBIBJBIGoQYmtBgAEgEkEgakG0+AEQYwsgEkHQAGokAAwHCyAGQf4BcUEERgRAIAIgAyAEEOsBDAcLAkACQAJAAkAgBkEGaw4DAAECAwsgAiAOLQAVIA4tABYgDi0AFyAOLQAYEOwBDAkLIAIgDi0AGSAOLQAaIA4tABsgDi0AHBDsAQwICyACIA4tAB1BBXAgDi0AICAPEO0BDAcLIAZBCWtBAU0EQCMAQUBqIhUkACADIARBMGxqIgRB2ABqIQ8gBEHy9gBqIQogBEHQ9gBqIQdBACEEA0AgAiAEQQ9sIgNBPWpBDhBXBH8gBCAPai0AACEGIAogBEEBdCIOai0AACEJIAcgDmotACEhDiAVIARBAWoiDDYCECAVQSBqQRhB3wwgFUEQahDgAiACQQogA0HAAHIiCCAVQSBqIAQQBUEBEF8aIAJBHiAIIA5BDXAiDkECdEHg8QBqKAIAQb/fA0G0+AEgDhtBARBfGiAVIAlB5ABsQYAya8FBP23BNgIAIBVBIGpBGEG8CyAVEOACIAJB6gAgA0HBAGoiAyAVQSBqQbT4ARBjIAJBiAEgA0HaAEEFQcQhEFggAkGIASADIAZB2gBsQf8AbkEFIAQQBRBYIAwFIARBAWoLIgRBBEcNAAsgFUFAayQADAcLIAJB+ABB2wAgDi0AKUEDcEECdEHAhAFqKAIAQb/fA0EBEGEMBgsgBkUEQCACQQEgDi0AGCAPEO0BDAYLIAZBBE0EQCACIAMgBEF/IAZBAWsgBkEERhsQ7gEMBgsCQAJAAkACQCAGQQVrDgMAAQIDCyACIAMgBBDrAQwICyACIA4tAA8gDi0AECAOLQARIA4tABIQ7AEMBwsgAiAOLQATIA4tABQgDi0AFSAOLQAWEOwBDAYLIAJB+ABB2wBB4MIAQeUZIA4tABsbQb/fA0EBEGEMBQsCQCAGRQRAIAJBBkE5QeQBQc0AQcQhEFsgA0HYAGohD0E7IQoDQEEIIQggAiAKQQEQVwRAA0AgAiAIIApBAUEBQcQhEFggCEHgAUkhByAIQQhqIQggBw0ACwsgCkH8AEkhCCAKQQhqIQogCA0ACyACQQdB3wBB4gFBxCEQWSADIARBMGxqLQDQdkEBcSEDQX8hB0EAIQgDQCAIIAhB8ABrIAhB8ABJGyEKIAMEf0HkAEGcfyAKQThJGwUgCkEIdEGA/gNxQfAAbkH/AHMLwEF8bUHfAGpB/wFxIQogB0EATgRAIAIgCEEHaiAHIAhBCGogCkGfDxBcCyAKIQcgCEEBaiIIQeABRw0ACyAPIARBMGxqIggtAAFBDmxB/wBuIQ8gCC0AAEHGAWxB/wBuIgRBAmshCkEKIQggBEEKaiEDA0ACQCACIAggCCAKTgR/IAMgCEsEfyAIIARrQQJqIA9sQXRtQcEAagUgCCADa0EBdEH+/wNxQQNuQcEAagsiB0GDAUoNAUE6IAcgB0E6TBsFQcEAC0EBQQJBwPgDEFgLIAhBAWoiCEHmAUcNAAsMAQsgAkEAIAgtAANBAEEKEOwBC0HI/QstAABBAUcNBCACQQpB/gBBusIAQbT4ARBjDAQLAkACQAJAAkAgBkEBaw4DAgEAAwsgAkEBIA4tAAMEf0HkAAVB5ABBACAOLQAEGwsgDxDtAQwGC0GcFBCaASEOIBAgCC0AEEEYazYCICAQQeAAakEgIA4gEEEgahDgAiACQfgAQdsAIBBB4ABqQb/fA0EBEGEMBQsgAiAILQAJIAgtAAJB2gAgCC0AAxDsAQwECyAEIQwjAEGwAWsiDSQAIAIiBkE5Qc4AEFcEQAJAIAIoAhgiAkG4iQwoAgBGBEBBvIkMKAIAIARGDQELIA1BhAFqIRcgDUGAAWohGCANQfAAakEMciEZIA1B8ABqQQhyIRsgDUHwAGpBBHIhHCANQeQAaiEIIA1B4ABqIQ8gDUHQAGpBDHIhCiANQdAAakEIciEHIA1B0ABqQQRyIQRBvIkMIAw2AgBBuIkMIAI2AgAgAyAMQTBsaiIDQdgAaiADQdD2AGpBAEH0iQwQTkHAiQxB+ooMLQAAQR9xIgM2AgBBkIsMIAMQqgIiFToAACMAQRBrIg5BADoADiAOQQA7AQxBl4sMQf//AzsAAEGRiwwgA0EfcUEYbEHQhwdqIgMoAgAiCUEEdkEDcSICBH8gDkEMaiACai0AAAVBAAs6AAAgCUGAAXEEQEGXiwxBADoAAAsgCUEDcSECIAlBwABxBEBBmIsMQQA6AAALIAIEQCAOQQxqIAJqIgIgCUEEcQR/IAItAABBAXIFQQELOgAAC0GSiwwgAygCBCIJQQR2QQNxIgIEfyAOQQxqIAJqLQAABUEACzoAACAJQYABcQRAQZeLDEEBOgAACyAJQQNxIQIgCUHAAHEEQEGYiwxBAToAAAsgAgRAIA5BDGogAmoiAiAJQQRxBH8gAi0AAEECcgVBAgs6AAALQZOLDCADKAIIIglBBHZBA3EiAgR/IA5BDGogAmotAAAFQQALOgAAIAlBgAFxBEBBl4sMQQI6AAALIAlBA3EhAiAJQcAAcQRAQZiLDEECOgAACyACBEAgDkEMaiACaiICIAlBBHEEfyACLQAAQQRyBUEECzoAAAtBlIsMIAMoAgwiCUEEdkEDcSICBH8gDkEMaiACai0AAAVBAAs6AAAgCUGAAXEEQEGXiwxBAzoAAAsgCUEDcSECIAlBwABxBEBBmIsMQQM6AAALIAIEQCAOQQxqIAJqIgIgCUEEcQR/IAItAABBCHIFQQgLOgAAC0GViwwgAygCECIJQQR2QQNxIgIEfyAOQQxqIAJqLQAABUEACzoAACAJQYABcQRAQZeLDEEEOgAACyAJQQNxIQIgCUHAAHEEQEGYiwxBBDoAAAsgAgRAIA5BDGogAmoiAiAJQQRxBH8gAi0AAEEQcgVBEAs6AAALQZaLDCADKAIUIgNBBHZBA3EiCQR/IA5BDGogCWotAAAFQQALOgAAIANBgAFxBEBBl4sMQQU6AAALIANBwABxBEBBmIsMQQU6AAALIA1CADcDoAEgDUIANwOYASANQgA3A5ABQZaLDC0AACESQZWLDC0AACEeQZSLDC0AACEfQZOLDC0AACEgQZKLDC0AACEaQZGLDC0AACEUA0BBACERA0AgDUGQAWogEUECdGohAwJAQQEgEXQiAiAUcUUNACANKAKQASITIAMoAgBIDQAgAyATQQFqNgIACwJAIAIgGnFFDQAgDSgClAEiEyADKAIASA0AIAMgE0EBajYCAAsCQCACICBxRQ0AIA0oApgBIhMgAygCAEgNACADIBNBAWo2AgALAkAgAiAfcUUNACANKAKcASITIAMoAgBIDQAgAyATQQFqNgIACwJAIAIgHnFFDQAgDSgCoAEiEyADKAIASA0AIAMgE0EBajYCAAsCQCACIBJxRQ0AIA0oAqQBIgIgAygCAEgNACADIAJBAWo2AgALIBFBAWoiEUEGRw0ACyAWQQFqIhZBBkcNAAsgDSgCpAEhISANKAKgASEiIA0oApwBISMgDSgCmAEhJCANKAKUASElIA0oApABISYgDUIANwNgIA1CADcDWCANQgA3A1BBASEJA0BBASEDA0ACQEEGIANrIgJBAnQiESANQdAAamoiEygCAA0AIAlBASACdCICIBVxRXENAAJAAkACQAJ/IAIgFHEEQEEAIRYgDUHQAGohAiANQfAAagwBCyACIBpxBEBBASEWIAQhAiAcDAELIAIgIHEEQEECIRYgByECIBsMAQsgAiAfcQRAQQMhFiAKIQIgGQwBCyACIB5xBEBBBCEWIA8hAiAYDAELIAIgEnFFDQFBBSEWIAghAiAXCyEOIAIoAgBFDQBBACECAkACQAJAAkACQCADQQZHBEAgDSgCUAR/IBZBkYsMai0AAEEBcQVBAAshAiADQQVGDQELIA0oAlQEQCACIBZBkYsMai0AAEEBdkEBcWohAgsgA0EERg0BCyANKAJYBEAgAiAWQZGLDGotAABBAnZBAXFqIQILIANBA0YNAQsgDSgCXARAIAIgFkGRiwxqLQAAQQN2QQFxaiECCyADQQJGDQELIA0oAmAEQCACIBZBkYsMai0AAEEEdkEBcWohAgsgA0EBRg0BCyANKAJkRQ0AIAIgFkGRiwxqLQAAQQV2QQFxaiECCyANQfAAaiARaiIRIA4qAgAgArOSOAIAIAJFDQIgESAdsjgCAAwBCyANQfAAaiARaiAdsjgCAAsgHUEBaiEdCyATQQE2AgALIANBAWoiA0EHRw0ACyAJIQNBACEJIAMNAAtBxIkMAn8gDSoCcEMAAFxDQQEgHSAdQQFMG7OVIimUIClDAAAAP5QiKJIiJ4tDAAAAT10EQCAnqAwBC0GAgICAeAtBAWo2AgBByIkMAn8gDSoCdCAplCAokiIni0MAAABPXQRAICeoDAELQYCAgIB4C0EBajYCAEHMiQwCfyANKgJ4ICmUICiSIieLQwAAAE9dBEAgJ6gMAQtBgICAgHgLQQFqNgIAQdCJDAJ/IA0qAnwgKZQgKJIiJ4tDAAAAT10EQCAnqAwBC0GAgICAeAtBAWo2AgBB1IkMAn8gDSoCgAEgKZQgKJIiJ4tDAAAAT10EQCAnqAwBC0GAgICAeAtBAWo2AgBB2IkMAn8gDSoChAEgKZQgKJIiKYtDAAAAT10EQCApqAwBC0GAgICAeAtBAWo2AgBB3IkMQegAICZBFkE7ICYgJSAlICZIGyIDICQgAyAkShsiAyAjIAMgI0obIgMgIiADICJKGyIDICEgAyAhShsiA0EAIANBAEobQQFqbiIDIANBFk8bIgNsazYCAEHgiQxB6AAgAyAlbGs2AgBB5IkMQegAIAMgJGxrNgIAQeiJDEHoACADICNsazYCAEHsiQxB6AAgAyAibGs2AgBB8IkMQegAIAMgIWxrNgIAC0HAiQwoAgAhH0GQiwwtAAAhGiAGQQZBOUHkAUHNAEHEIRBbQTshEQNAQQghAyAGIBFBARBXBEADQCAGIAMgEUEBQQFBxCEQWCADQeABSSECIANBCGohAyACDQALCyARQfwASSEDIBFBCGohESADDQALIAwQAyEgQQAhAgNAIAJBAnQiA0HciQxqIREgA0HEiQxqIRQgAkGRiwxqIhMtAAAiA0EBcQRAIAZBxIkMKAIAQQlqQdyJDCgCAEEMaiAUKAIAQQlqIBEoAgBBtPgBEFwgEy0AACEDCyADQQJxBEAgBkHIiQwoAgBBCWpB4IkMKAIAQQxqIBQoAgBBCWogESgCAEG0+AEQXCATLQAAIQMLIANBBHEEQCAGQcyJDCgCAEEJakHkiQwoAgBBDGogFCgCAEEJaiARKAIAQbT4ARBcIBMtAAAhAwsgA0EIcQRAIAZB0IkMKAIAQQlqQeiJDCgCAEEMaiAUKAIAQQlqIBEoAgBBtPgBEFwgEy0AACEDCyADQRBxBH8gBkHUiQwoAgBBCWpB7IkMKAIAQQxqIBQoAgBBCWogESgCAEG0+AEQXCATLQAABSADC0EgcQRAIAZB2IkMKAIAQQlqQfCJDCgCAEEMaiAUKAIAQQlqIBEoAgBBtPgBEFwLIAJBAWoiAkEGRw0ACyAaQQFxBEAgBkHEiQwoAgBBCWpB3IkMKAIAIgNBDGpB7AAgA2tBtPgBEFoLIBpBAnEEQCAGQciJDCgCAEEJakHgiQwoAgAiA0EMakHsACADa0G0+AEQWgsgGkEEcQRAIAZBzIkMKAIAQQlqQeSJDCgCACIDQQxqQewAIANrQbT4ARBaCyAaQQhxBEAgBkHQiQwoAgBBCWpB6IkMKAIAIgNBDGpB7AAgA2tBtPgBEFoLIBpBEHEEQCAGQdSJDCgCAEEJakHsiQwoAgAiA0EMakHsACADa0G0+AEQWgsgGkEgcQRAIAZB2IkMKAIAQQlqQfCJDCgCACIDQQxqQewAIANrQbT4ARBaCyAGQQpB+ABB3AFBiNMAEFlBACEDAkBBl4sMLAAAIgJBAEgNAEGYiwwsAAAiEUEASA0AIAYgAkECdCIUQcSJDGooAgAiAkESaiAUQdyJDGoiFCgCAEEGakEEQcD4AxBZIAYgAkEUaiARQQJ0IhNB3IkMaiIRKAIAIh5BA2sgFCgCACAea0EKakHA+AMQWiAGIBNBxIkMaiIUKAIAIhNBCWogESgCAEEDayACIBNrQQtqQcD4AxBZIAYgFCgCAEEJaiARKAIAQQNrQQNBwPgDEFoLA0AgA0EVbEGEigxqLQAAIRQgBiADQQJ0IhFBxIkMaiICKAIAIBFB3IkMaiIRKAIAQRJBDCAgQYjTACAaIAN2QQFxIhMbEFggBiACKAIAIBEoAgAgFEEEdEHjAG5BDGxBBHYiFGtBDGpBAiAUQb/fAxBYIA1BBiADazYCQCANQZABakEMQdEOIA1BQGsQ4AIgBiACKAIAQQdqIBEoAgBBA2ogDUGQAWpBwhBBv98DIBMbQQEQXxogA0EBaiIDQQZHDQALIA0gH0EBajYCMCANQZABakEMQfcNIA1BMGoQ4AIgBkEKQfwAIA1BkAFqQcD4A0EBEF8aIA1B+4oMLQAANgIgIA1BkAFqQQxBzg4gDUEgahDgAiAGQT5B/QAgDUGQAWpBwPgDEGMgDUGSAWohFEEAIQMDQAJAQQUgA2tBFWwiAkGFigxqLQAABEAgFEGjEi0AADoAACANQaESLwAAOwGQAQwBCyACQYeKDGotAABB5ABqIAJBhooMai0AACIRQeQAbEEyIBEbbCICQZDOAG4hESACQeQAbkHkAHAiAgRAIA0gETYCECANIAJBCm42AhQgDUGQAWpBDEGMDSANQRBqEOACDAELIA0gETYCACANQZABakEMQdEOIA0Q4AILIAYgA0EYbEHcAGpB/QAgDUGQAWpBtPgBEGMgA0EBaiIDQQZHDQALCyANQbABaiQADAMLIAZFBEAgAkEBQdoAIA8Q7QEMAwsgBkECTQRAIAIgAyAEIAYQ7gEMAwsgBkEETQRAIAIgAyAEEOsBDAMLAkACQAJAIAZBBWsOAgABAgsgAkH4AEHbAEHqOkHEEiAOLQAQG0G/3wNBARBhDAQLIAIgDi0ADCAOLQANIA4tAA4gDi0ADxDsAQwDCyAQIA4tABNBA3EiDkECdEHQ7QBqKAIANgIQIBBB4ABqQSBB1QkgEEEQahDgAiACQQxB1wAgEEHgAGpB2vIDQbT4ASAOG0ECEF8aQcj9Cy0AAEEBRw0CIAJBDEH+AEGWGUG0+AEQYwwCC0GAiQwCfyApQwAAAD+SIieLQwAAAE9dBEAgJ6gMAQtBgICAgHgLNgIACyAPQQF2Qe/3AXEhB0EBIQ4DQCAOQQVqIQogDkEGaiEIIA5BAXQhCQJAIA5BAWtBAXQiBkGc/gtqLgEAIgRBR0gNACACKAIMIARBOWoiBCAJQZz+C2ouAQBBOWoiDCAEIAxKG0oNACACKAIUIAQgDCAEIAxIG0wNACACIAogBCAIIAwgDxBcCwJAIAZB5IEMai4BACIGQUdIDQAgAigCDCAGQTlqIgYgCUHkgQxqLgEAQTlqIgkgBiAJShtKDQAgAigCFCAGIAkgBiAJSBtMDQAgAiAKIAYgCCAJIAcQXAsgDkEBaiIOIANHDQALIBBBgIkMKAIANgIAIBBB4ABqQSBBvA8gEBDgAiACQegBIBBB4ABqEGJrQTsgEEHgAGpBtPgBEGMLIBBBkAFqJAAMAgsgBCAKTgRAIBZBAXZBLmohCCAKIQIDQCACQQxvRQRAIABBACAIIAQgAmsgFmxqQfABQYjTABBZCyACIARGIQcgAkEBaiECIAdFDQALCyAWIBJBA0prIRlBcCEPA0ACQCAPIBtqIgdBAEgNACAHIBNODQAgD0EPbCEaQQAhAiAUIAdBKGxqIQgDQAJAIAggAkEKbGoiBxCnAQ0AIAogBy0AACIJSg0AIAQgCUgNACAHLAAJQQ9sQRhtIRECfyAPIActAAIiDEH/AHEiDkEBIA5BAUsiEhtqQQ9sIg5BAWogDMAiFUEASA0AGiAOQQJrIActAAgiDEUNABogDiAMQQ9sQeQAbmpBEGsLIgxBAEwNAEHz7wEgBiAVQQBIIBJyGyEOQe8BIAwgDEHvAU8bIRIgGiARwWoiDEEAIAxBAEobIQwgBCAJayAWbEEuaiEJAkAgBy0AASIRQTJNBEAgACAMIAkgEiAMayAWIA4QWwwBCyAAIAwgCSASIAxrIBlBv18gDiARQf4ASxtB//8DcRBYCyAPQQBIDQAgACAMIAlBAiAWQb/fAxBYIActAAMiB0HkAE8gB0H+AXFB+ABHcQ0AIAAgDEEDaiAJQQIgFkHCEBBYCyACQQFqIgJBBEcNAAsLIA9BAWoiD0EQRw0ACwJAIAMsAKTxCCICQQBIDQAgAy0AqPEIRQ0AIAMtANzwCCACQQR2Rw0AIAAgAkEPcUEPbEEBa0EuQRAgEEGH/QMQWwsCQCADLQD58AhFDQAgAywAgfsIIgJBAEgNACADLQDc8AggAkEEdkcNACAAIAJBD3FBD2xBLkEPIBBBivADEFsLIAUgBEEMb0ECdEHggAFqKAIANgKwASAFQZAGakEeQdUKIAVBsAFqEOACIABB7AEgBUGQBmoQYmtBLyAFQZAGakG0+AEQYyAKIAVBhAZqQQwQugEgAEHsASAFQYQGahBiayAQQShqIAVBhAZqQbT4ARBjCyAQQTFqIQ8CQAJAIAMsAKTxCEEASA0AIAMtAKjxCEUNACAAIA9B1wAgEGsiBxBXRQ0CQQAhAgJ/QQAgFCADLACk8QhBKGxqEKcBRQ0AGkEBIBQgAywApPEIQShsakEKahCnAUUNABpBAiAUIAMsAKTxCEEobGpBFGoQpwFFDQAaIBQgAywApPEIQShsakEeahCnAQ0CQQMLIQQgAywApPEIIQggAEEAIA9B8AEgB0HEIRBYIAVCADcD4AUgBUIANwPYBSAFQgA3A9AFIBQgAywApPEIQShsaiIHEKcBIglFBEAgBy0AACAFQfwFakEGELoBIAVB0AVqEOECIQIgBUGo2QA2AqABIAUgBUH8BWo2AqQBIAIgBUHQBWpqQRggAmtB7gggBUGgAWoQ4AJBASECCyAUIAMsAKTxCEEobGpBCmoiBxCnAUUEQCAHLQAAIAVB/AVqQQYQugEgBUHQBWoQ4QIhByAFQajZAEGn2QAgCRs2ApABIAUgBUH8BWo2ApQBIAcgBUHQBWpqQRggB2tB7gggBUGQAWoQ4AIgAkEBaiECCyAUIAMsAKTxCEEobGpBFGoiBxCnAUUEQCAHLQAAIAVB/AVqQQYQugEgBUHQBWoQ4QIhByAFQafZAEGo2QAgAhs2AoABIAUgBUH8BWo2AoQBIAcgBUHQBWpqQRggB2tB7gggBUGAAWoQ4AJBASECCyAUIAMsAKTxCEEobGpBHmoiBxCnAUUEQCAHLQAAIAVB/AVqQQYQugEgBUHQBWoQ4QIhByAFQafZAEGo2QAgAhs2AnAgBSAFQfwFajYCdCAHIAVB0AVqakEYIAdrQe4IIAVB8ABqEOACCyAAQQQgEEE0aiICIAVB0AVqQb/fAxBjAkAgFCAIQShsaiAEQQpsaiIHLAACQQBIBEAgBUHUkpUCNgKQBgwBC0HZGhCaASEEIAUgBy0AAkH/AHE2AmAgBUGQBmpBHiAEIAVB4ABqEOACCyAAQfgAIAIgBUGQBmpB8+8BEGMCQAJAAkACQCAHLQADIgdB+ABrDgIAAQILIAVBpS4tAAA6AJQGIAVBoS4oAAA2ApAGDAILIAVCzp6BsZSJkyY3A5AGDAELIAUgBzYCUCAFQZAGakEeQY7ZACAFQdAAahDgAgsgAEG0ASACIAVBkAZqQYf9AxBjIABBBCAQQTxqQbcyQbT4ARBjDAILIAAgD0HXACAQaxBXRQ0BQegBQQEgEyAXakEBayAXbiIKIApBAUwbIhVuIg5BAmshEiAQQTRqIRFBACECA0BBv98DIQcgBiEEIAAgAiAObCIIQQRqIA8gEkEKIAIgAy0A3PAIQQR0IgwgF25HBH9Bv19BtPgBIAxBD3IgF24gAkYiBBshByAGQYjTACAEGwUgBAsQWyAFIAJBAWoiAjYCQCAFQZAGakEeQdEOIAVBQGsQ4AIgACAIQQZqIBEgBUGQBmogB0H//wNxEGMgAiAKSQ0ACyAYQQBIDQEgACAVIBhsIA5sIBNuQQRqIBBBPGpBAkEEQcD4AxBYDAELIABBACAPQfABIAdBxCEQWCAAQQQgEEE0akHiOUG0+AEQYwsgBUHABmokAAtBwP0LQRg6AAACQCABLQD+8AgiCEUNACABLQDa8AgNACABLQDY8AhBAWtB/wFxQQJLDQAgAEEaQe4AEFdFDQAgCEEBayIHEAMhECAAQQJBGkHsAUHtAEHCEBBYIABBAkEaQewBQe0AIBAQWyALIAg2AoABIAtB4AVqQShB0wwgC0GAAWoQ4AIgACAAQQhBHiALQeAFaiAQQQIQX0EQakEeIAEgBxACQb/fA0ECEF8aQcLAAEG1FkGoxQAgCEEDSSICGyAHQQFGGxCZASEDIAsgASAHEAQ2AnQgCyADNgJwIAtB4AVqQShBkQkgC0HwAGoQ4AIgAEEIQS8gC0HgBWpBtPgBEGMCQCACRQRAIAFBGGohDiABIAdBMGxqQe8AaiETQQAhAgNAIAJBsPgAai0AACEDAkAgACACQQtsIgZBN2oiCkELEFdFDQAgDiAHIAMQrQEhBQJ/AkACQCABLQDd8AggA0cEQCAFQQBOIQQgEy0AACEJDAELIAVBAE4hBCATLQAAIQkgByABLQDf8AhGDQELQQAhDEG/3wMMAQsgAEEGIApB5AFBCkHEISAQIAVBAE4bEFhBASEMQcIQCyEKIABBCiAGQTlqIg1Bus4AQafZACADIAlB/wFxRhtBiNMAIAogBBsiCkEBEF8aIABBEiANIANBAnRBsIABaigCACAKQQEQXxogBARAQcYMEJoBIQMgCyAFQQFqNgJQIAtB4AVqQSggAyALQdAAahDgAiAAQeYBIAtB4AVqEGJrIAZBOmogC0HgBWpBtPgBEGMMAQsCQCAMRQ0AIAEtAN7wCEEBRw0AQQAhAyABKALI9wggASgC4PAIayIEQc8PSyIFRQRAQbMQIARrQf//A3FB5ABuIQMLQY8eEJoBIQogCyADQf8BcUEKbiIJNgJgIAsgAyAJQQpsa0H/AXE2AmQgC0HgBWpBKCAKIAtB4ABqEOACIABB5gEgC0HgBWoQYmsgBkE6aiALQeAFakHCEBBjIABBBiAGQUBrIAUEf0HkAQUgBEHkAWxB0A9uC0EBQb/fAxBYDAELIANBBWtB/wFxQQFLDQAgAEHmAUH+PRBiayAGQTpqQf49QcIQQYjTACAMGxBjCyACQQFqIgJBBUcNAAsMAQsgAEH4AEHKAEGHPUG0+AFBARBhCyAAQfAAQRYQV0UNAAJAIAEtAP/wCARAIAtB2hEQmQE2AkAgC0HgBWpBKEHVCiALQUBrEOACDAELQeoJEJoBIQIgCyABIAcQAjYCMCALQeAFakEoIAIgC0EwahDgAgsgAEH4AEHxACALQeAFakG/3wNBARBhIABBosUAQZPFACAIQQNJGyICEGJBfm1B+ABqQfwAIAJBtPgBEGMLAkAgAS0AlfEIRQ0AIAEtANvwCCECIABBMkHGABBXRQ0AIABBKEEyQaABQcQAQcIQEFggAEEoQTJBoAFBxAAgAhADEFsgAEEpQTNBngFBwgAgAhADEFsgCyABLQCZ8QhBAWo2AiAgC0HgBWpBGEHRDiALQSBqEOACIABB+ABBOiALQeAFaiACEANBBBBhIAEgAiABLQCZ8QgiAxAREJkBIQYgCyADQQ9xQQN0IAEgAkGEC2xqQfgCaiACQYAUbCABakHADWsgAkECSRtqLQAEQQxwQQJ0QYCAB2ooAgAQmQE2AhQgCyAGNgIQIAtB4AVqQRhBsAogC0EQahDgAiAAQfgAQdwAIAtB4AVqQb/fA0EBEGEgASgCyPcIIQMgASgCoPEIIQYgAEEyQewAQYwBQQNBiNMAEFggAEEyQewAQYwBQYwBIAYgA2tBjAFsQZADbSIDIANBjAFOGyIDQQAgA0EAShtrQQMgAhADEFgLQcD9C0EZOgAAAkAgAS0A5PYIRQ0AAkAgAS0A6fYIQQNrQf8BcUEDSw0AIAEtAOj2CA0AQRUhAgJAAkAgAS0A2vAIDggAAQEBAQEBAAELIAEtANjwCCIDQf4BcUEGRg0AQRVBCyADQQhGGyECCyAAQRggAhBXRQ0BIABBAEEYQfABIAJBwhAQWCAAQQQgAkEHa0EBdkEYaiIDIAFB7PYIaiABLwHq9ghBARBfGiAAIAEtAI73CAR/QegBIABB7AEgAyABQY73CGpBtPgBQQEQYGsFQewBCyADIAFBgvcIakG/3wNBARBgGiAAQQAgAkEXaiICQfABQQFBxCEQWCAAQQAgAiABLQDm9ghB8AFsQf8BbkEBIAEvAer2CBBYDAELIABBLkHUABBXRQ0AIABBDEEuQdgBQdQAQcIQEFggAEEMQS5B2AFB1AAgAS8B6vYIEFsgAEENQS9B1gFB0gAgAS8B6vYIEFtBMiEGA0BBECECIAAgBkEBEFcEQANAIAAgAiAGQQFBAUHEIRBYIAJB2gFJIQMgAkEGaiECIAMNAAsLIAZB+ABJIQIgBkEGaiEGIAINAAsgAEEUQTQgAUHs9ghqQbT4AUEBEF8aIAEtAOn2CCICBEAgAEHeASACQQFrQf8BcUEHcEECdEGQhwFqKAIAEGJrQTUgAS0A6fYIQQFrQQdvQQJ0QZCHAWooAgAgAS8B6vYIEGMLIABBFEHEACABQYL3CGoiAkG/3wNBAkEDIAJBAxBeQcQBShsQXyECIAEtAI73CARAIAAgAkEaakHOACABQY73CGpBtPgBQQIQXxoLIABBrQFB7ABBL0EMAn8CQAJAAkACQCABLQDo9ggEQCABLQCcigFFBEBBfyECDAILIAEoAqSKAUHgAG5BA3EiAg0BIABBFEHsAEEvQQwgAS8B6vYIEFhBACECDAILIABBFEHuAEHIAUEIQYjTABBYIABBFEHuACABLQDm9ghByAFsQf8BbkEIIAEvAer2CBBYIAEtAOf2CCICQf8BRg0FIAAgAkHIAWxB/wFuQRNqQeoAQQJBEEG/3wMQWAwFCyAAQRRB7ABBL0EMIAEvAer2CEECdkHn8wBxEFggAkEBRw0AIABBxwBB7ABBL0EMIAEvAer2CBBYQQEhAgwBCyAAQccAQewAQS9BDCABLwHq9ghBAnZB5/MAcRBYIAJBAkcNACAAQfoAQewAQS9BDCABLwHq9ggQWAwBCyAAQfoAQewAQS9BDCABLwHq9ghBAnZB5/MAcRBYIAJBA0cNACABLwHq9ggMAQsgAS8B6vYIQQJ2QefzAHELQf//A3EQWAtBwP0LQRo6AAACQCABLQCW9ghFDQAgAEEuQdAAEFdFDQAgAEEKQS5B3AFBzgBBxCEQWCAAQQpBLkHcAUHOAEGH/QMQWyAAQQtBL0HaAUHMAEGH/QMQWyAAQfgAQTYgAUGk9ghqQb/fA0EBEGEgAEH4AEHCACABQcL2CGpBtPgBQQEQYSALQeAFaiEGIwBB0ABrIgMkAAJAIAEiAi0AmfYIIgRB/gFGBEAgA0HHJRCZATYCACAGQShB1QogAxDgAgwBCwJAIATAQQBIBEAgBEH/AHEiChDyASIEQQBOBEBB/g0QmgEhCiADIARBAWo2AjAgA0HEAGpBDCAKIANBMGoQ4AIMAgtB4A0QmgEhBCADIAoQ8wFBAWo2AkAgA0HEAGpBDCAEIANBQGsQ4AIMAQsgAyAEQQ1NBH8gBEECdEHA3wBqKAIABUGzzgALNgIgIANBxABqQQxB1QogA0EgahDgAgtByxtB4RsgAi0AmvYIGxCaASECIAMgA0HEAGo2AhAgBkEoIAIgA0EQahDgAgsgA0HQAGokACAAQfgAQdIAIAtB4AVqQYf9A0EBEGFBACECAkAgAS0AlvYIRQ0AIAEtAJr2CEUNAEH/ASABKALI9wggASgCoPYIa0H/AWxB0A9uIgIgAkH/AU8bIQILIABBGEHfAEHAAUEIQcIQEFggAEEYQd8AIAJBwAFsQf8BbUEIQYf9AxBYIABBF0HeAEHCAUEKQbT4ARBbIAEtAJn2CEH+AUYNACAAQfolQeMlIAEtAJr2CBsQYkF+bUH4AGpB7gBB+iVB4yUgAS0AmvYIG0G0+AEQYwtBwP0LQRs6AAACQCABKAK49whFDQAgAS0AlvYIDQAgAEH2AEEQEFdFDQAgAEEAQfYAQfABQRBBiNMAEFggAEEAQfYAQfABQZ8PEFkgAEH4AEH6ACABQZj3CGpBv98DQQEQYQsgAEHwATYCECAAQQA2AgggACAAKAIEIgI2AgwgACACQQhqNgIUQcD9C0EcOgAAAkAgAEGIAUEgEFdFDQBBACECIAAoAhgiA0GwjQwoAgBHBEBBwP0LQR86AABBsI0MIAM2AgAgAUGgiwwQkAFBwP0LQRw6AAALIABBAEGIAUHwAUEgQcIQEFggAEEAQYgBQfABQcQhEFkgAUGw8QhqIQYDQCAAIAEgAkEPbEGXAUEOQQ8gAhD0ASIDQQpsQaCLDGogAyAGai0AABDpASACQQFqIgJBEEcNAAtBACECA0AgACABIAIQ9QEiA0EBaxDyAUEPbEEHakGKAUEQQQwgA0EKbEGgiwxqIAMgBmotAAAQ6QEgAkEBaiICQQtHDQALIAEtANjwCEEERw0AIAEtANnwCA0AIAEtANvwCCICQQJJDQAgAS0A2vAIDQAgAS0A8dwHIAJ2QQFxDQAgAS0A3PAIQQR0IgdBD3IhBCACQYAUbCABakHADWshCSAHQRBrIQMgASACQTBsai0AbiICQRAgAhshCANAAkAgAyICQQBIDQAgAiAITg0AIAIgB2siBUEPbCIDQQAgA0EAShshBgJAIAkgAkEobGoiAxCnAQ0AIAMtAAIiCkH/AHEgCkEHdmoiCkECSQ0AQQJB8QEgBSAKakEPbCIKIApB8QFOGyIKIApBAkwbQQJrIgogBk0NACAAIAZBpgEgCiAGa0ECQfPvARBYCwJAIANBCmoiChCnAQ0AIAotAAIiCkH/AHEgCkEHdmoiCkECSQ0AQQJB8QEgBSAKakEPbCIKIApB8QFOGyIKIApBAkwbQQJrIgogBk0NACAAIAZBpgEgCiAGa0ECQfPvARBYCwJAIANBFGoiChCnAQ0AIAotAAIiCkH/AHEgCkEHdmoiCkECSQ0AQQJB8QEgBSAKakEPbCIKIApB8QFOGyIKIApBAkwbQQJrIgogBk0NACAAIAZBpgEgCiAGa0ECQfPvARBYCyADQR5qIgMQpwENACADLQACIgNB/wBxIANBB3ZqIgNBAkkNAEECQfEBIAMgBWpBD2wiAyADQfEBThsiAyADQQJMG0ECayIDIAZNDQAgACAGQaYBIAMgBmtBAkHz7wEQWAsgAkEBaiEDIAIgBEcNAAsLQcD9C0EdOgAAIABBqAFByAAQVwRAAkAgACgCGCICQZiODCgCAEYNAEHA/QtBHjoAAEGYjgwgAjYCAEEAIQMjAEHACWsiBSQAQcCNDEEAQdgAEL4CIQYgASIEQdgAaiIMIAQtANvwCCIIQTBsaiEJAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAQtANrwCEEBaw4LAAILAwQFBgcICQEKCyAEIAYQZgwKCyAFIAQvARhBBWpBCm42AvAGIAVB0AhqQQxB0Q4gBUHwBmoQ4AIgBC8BGCEJIAZBwqC1AjYAACAFIAVB0AhqNgLgBiAGQQpqQQpB1QogBUHgBmoQ4AIgBkH/ASAJQf8BbEHwnAZrQdAPbSIIIAhB/wFPG0EAIAlBiQNPGzoAFCAFIAQtABo2AtAGIAVB0AhqQQxBjtkAIAVB0AZqEOACIAQtABohCSAGQcU0LwAAOwAaIAZBwTQoAAA2ABYgBSAFQdAIajYCwAYgBkEgakEKQdUKIAVBwAZqEOACIAZB/wEgCUH/AWxBzuMAa0EZbSIIIAhB/wFPG0EAIAlBMk8bOgAqIAUgBC0AKkEYazYCsAYgBUHQCGpBDEGsFCAFQbAGahDgAiAELQAqIQkgBkGTIigAADYALyAGQZAiKAAANgAsIAUgBUHQCGo2AqAGIAZBNmpBCkHVCiAFQaAGahDgAiAGQf8BIAlBBWwiCSAJQf8BTxs6AEAgBSAELQAqQRhrQQxtwTYCkAYgBUHQCGpBDEG8CyAFQZAGahDgAiAELQAqIQQgBkHyNygAADYARSAGQe83KAAANgBCIAUgBUHQCGo2AoAGIAZBzABqQQpB1QogBUGABmoQ4AIgBkH/ASAEQQVsIgQgBEH/AU8bOgBWDAkLIAQgBhBnDAgLIAUgCS0AGEHkAGxB/wBuNgKQByAFQdAIakEMQY7ZACAFQZAHahDgAiAJLQAYIQQgBkGDFSgAADYAAyAGQYAVKAAANgAAIAUgBUHQCGo2AoAHIAZBCmpBCkHVCiAFQYAHahDgAiAGQf8BIARBAXQiBCAEQf8BTxs6ABQMBwsgCEECSQ0GAkAgCS0ADSIEQf4BTwRAIAVCATcDsAcgBUHQCGpBDEH7GCAFQbAHahDgAgwBCyAFIARB9ANsQf8AbjYCwAcgBUHQCGpBDEGNGyAFQcAHahDgAgsgCS0ADSEEIAZBnMMALwAAOwAEIAZBmMMAKAAANgAAIAUgBUHQCGo2AqAHIAZBCmpBCkHVCiAFQaAHahDgAiAGQf8BIARBAXQiBCAEQf8BTxs6ABQMBgsgBCAGEGgMBQsgBCAGEGkMBAsgBCAIIAYQagwDCyAELQDf9QghCSAGQdc6LQAAOgAEIAZB0zooAAA2AAAgBSAJQQZwQQJ0QbDZAGooAgA2AqAIIAZBCmpBCkHVCiAFQaAIahDgAiAGQf8BIAlBM2wiCSAJQf8BTxs6ABQgBC0A4/UIIQkgBUGSywBBkMsAQd8jIAQtAOL1CCIIQQJGGyAIQQFGGzYCkAggBkEWakEKQdUKIAVBkAhqEOACIAUgCUEDcUECdEHQ2QBqKAIANgKACCAGQSBqQQpB1QogBUGACGoQ4AIgBkH/ASAJQdUAbCIJIAlB/wFPGzoAKiAFIAQtAOT1CDYC8AcgBUHQCGpBDEGO2QAgBUHwB2oQ4AIgBC0A5PUIIQkgBkHFNC8AADsAMCAGQcE0KAAANgAsIAUgBUHQCGo2AuAHIAZBNmpBCkHVCiAFQeAHahDgAiAGQf8BIAlB/wFsQc7jAGtBGW0iCCAIQf8BTxtBACAJQTJPGzoAQCAELQDl9QghBCAGQbsuLQAAOgBGIAZBty4oAAA2AEIgBSAEQQNxQQJ0QfDZAGooAgA2AtAHIAZBzABqQQpB1QogBUHQB2oQ4AIgBkH/ASAEQdUAbCIEIARB/wFPGzoAVgwCCyAFIAQtANWKAUEBajYCwAggBUHQCGpBDEGXCyAFQcAIahDgAiAGQe4rLQAAOgAEIAZB6isoAAA2AAAgBSAFQdAIajYCsAggBkEKakEKQdUKIAVBsAhqEOACIAZBADoAFAwBCwJAAkACQAJAAkACQAJAIAQtANjwCEEBaw4HAAIBBgUDBAcLIAQgBhBmDAYLAkACQAJAIAQtAOvwCA4EAAgBAggLIAUgBC8BGCIJQQpuIgg2AnAgBSAJIAhBCmxrQf//A3E2AnQgBUHQCGpBDEGMDSAFQfAAahDgAiAELwEYIQkgBkHCoLUCNgAAIAUgBUHQCGo2AmAgBkEKakEKQdUKIAVB4ABqEOACQQAhCCAGQf8BIAlB/wFsQfCcBmtB0A9tIgwgDEH/AU8bQQAgCUGJA08bOgAUIAUgBC0AGjYCUCAFQdAIakEMQY7ZACAFQdAAahDgAiAELQAaIQkgBkHFNC8AADsAGiAGQcE0KAAANgAWIAUgBUHQCGo2AkAgBkEgakEKQdUKIAVBQGsQ4AIgBkH/ASAJQf8BbEHO4wBrQRltIgwgDEH/AU8bQQAgCUEyTxs6ACoCQCAELQAbIglFBEAgBUHJnJkCNgLQCAwBCyAFIAlBBHQ2AjAgBUHQCGpBDEHRDiAFQTBqEOACIAQtABshCAsgBkGoHygAADYALyAGQaUfKAAANgAsIAUgBUHQCGo2AiAgBkE2akEKQdUKIAVBIGoQ4AIgBkH/ASAIQf8BcSIJQR9sIgggCEH/AU8bQX8gCRs6AEAgBSAELQAqQRhrNgIQIAVB0AhqQQxBrBQgBUEQahDgAiAELQAqIQQgBkGTIigAADYARSAGQZAiKAAANgBCIAUgBUHQCGo2AgAgBkHMAGpBCkHVCiAFEOACIAZB/wEgBEEFbCIEIARB/wFPGzoAVgwHCyAELQAgIQkgBkHKFC0AADoABCAGQcYUKAAANgAAIAUgCUEMcEECdEHggAFqKAIANgLAASAGQQpqQQpB1QogBUHAAWoQ4AIgBkH/ASAJQRdsIgkgCUH/AU8bOgAUIAUgBC0AIUEJcEECdEGQgQFqKAIANgKwASAFQdAIakEMQcIIIAVBsAFqEOACIAQtACEhCSAGQYQ/LwAAOwAaIAZBgD8oAAA2ABYgBSAFQdAIajYCoAEgBkEgakEKQdUKIAVBoAFqEOACIAZB/wEgCUEfbCIJIAlB/wFPGzoAKiAELQAjIQkgBkLLiuWahaSSJzcALCAFQfApQZE3IAkbNgKQASAGQTZqQQpB1QogBUGQAWoQ4AIgBkF/QQAgCRs6AEAgBC0AIiEEIAZBk8QALwAAOwBGIAZBj8QAKAAANgBCIAUgBEEFcEECdEHQ3gBqKAIANgKAASAGQcwAakEKQdUKIAVBgAFqEOACIAZB/wEgBEE/bCIEIARB/wFPGzoAVgwGCyAELQDweCIJBEAgBSAEIAQtAJD2CCAJcGotAPF4QQ9xIglBAWo2ApACIAVB0AhqQQxBlwsgBUGQAmoQ4AIgBkLQgtGi1ciUJzcAACAFIAVB0AhqNgKAAiAGQQpqQQpB1QogBUGAAmoQ4AIgBkH/ASAJQRxsIgkgCUH/AU8bOgAUIAUgBEGx+QBqIgkgBC0AkPYIIAQtAPB4cGotAAA2AvABIAVB0AhqQQxB5QsgBUHwAWoQ4AIgCSAELQCQ9gggBC0A8Hhwai0AACEJIAZB+RwvAAA7ABogBkH1HCgAADYAFiAFIAVB0AhqNgLgASAGQSBqQQpB1QogBUHgAWoQ4AIgBkH/ASAJQQR0IgkgCUH/AU8bOgAqCyAELQDcigEhCSAELQDcigEhBCAGQZU0LQAAOgBGIAZBkTQoAAA2AEIgBUHwKUGRNyAJGzYC0AEgBkHMAGpBCkHVCiAFQdABahDgAiAGQX9BACAEGzoAVgwFCyAEIAYQaAwECyAMIAQtAIn2CCIJQTBsaiEIIAlBAU0EQCAFIAQgCUGEC2xqIgwtAPgCNgLwAiAFQbAJakEMQdEOIAVB8AJqEOACIAwtAPgCIQMgBkGNMygAADYAAyAGQYozKAAANgAAIAUgBUGwCWo2AuACIAZBCmpBCkHVCiAFQeACahDgAiAGQf8BIANBAnQiAyADQf8BTxs6ABQgCC0AFSEIIAZB+ckALwAAOwAaIAZB9ckAKAAANgAWIAUgCEEGcEECdEGQgAFqKAIANgLQAiAGQSBqQQpB1QogBUHQAmoQ4AIgBkH/AUEFIAhrQTNsIgMgA0H/AU8bQQAgCEEFTRs6ACogCUEBRg0EIAQgCSAELQCK9ggQESEJIAQtAIr2CCEIIAZCyZzNoqWq1SY3ACwgBSAJNgLAAiAGQTZqQQpB1QogBUHAAmoQ4AIgBkH/ASAIQRFsIgkgCUH/AU8bOgBAIAUgDEH4AmoiCSAELQCK9ghBA3RqLQAANgKwAiAFQbAJakEMQdEOIAVBsAJqEOACIAkgBC0AivYIQQN0ai0AACEEIAZBjystAAA6AEogBkGHKykAADcAQiAFIAVBsAlqNgKgAiAGQcwAakEKQdUKIAVBoAJqEOACIAZB/wEgBEECdCIEIARB/wFPGzoAVgwECyAFIAgtABY2AqADIAVBsAlqQQxB0Q4gBUGgA2oQ4AIgCC0AFiEEIAZBjTMoAAA2AAMgBkGKMygAADYAACAFIAVBsAlqNgKQAyAGQQpqQQpB1QogBUGQA2oQ4AIgBkH/ASAEQQJ0IgQgBEH/AU8bOgAUIAgtABUhBCAGQfnJAC8AADsAGiAGQfXJACgAADYAFiAFIARBBnBBAnRBkIABaigCADYCgAMgBkEgakEKQdUKIAVBgANqEOACIAZB/wFBBSAEa0EzbCIJIAlB/wFPG0EAIARBBU0bOgAqDAMLIAUgBC0Aj/YIQQFqNgLAAyAFQbAJakEMQZcLIAVBwANqEOACIAQtAI/2CCEEIAZB1xcoAAA2AAMgBkHUFygAADYAACAFIAVBsAlqNgKwAyAGQQpqQQpB1QogBUGwA2oQ4AIgBkH/ASAEQRFsIgQgBEH/AU8bOgAUDAILIAZBADoAFCAGQeU4LwAAOwAEIAZB4TgoAAA2AAAgBkHOJigAADYACiAGQdImLQAAOgAODAELAkAgBCwApPEIQQBIDQAgBC0AqPEIRQ0AIAQtANnwCA0AIAVB0AhqQQRyIQcgBEHs8AhqIQ4gBEHQ9gBqIRAgBCAIQYQLbGpB+AJqIREgBCAIQTBsIhJqQe8AaiETIAhBgBRsIARqQcANayENIAhBAUshFEEAIQwDQCAJIAxqLQAAIQMgBQJ/AkAgFEUEQCARIAQsAKTxCCAOIAQtANvwCGotAABBD3EgDBCzASICQQBOBEAgBiAMQRZsakEBOgAVIAIhAwsgBCAIIAwgAyAFQbAJakEMEGQgCEEBRw0BIAxBAnRBwN0AaigCAAwCCwJ/IA0gBCwApPEIQShsaiIPEKcBBEAgBUHQCGohCkEADAELIAVBADYC0AggByEKQQELIQIgD0EKahCnAUUEQCAKQQE2AgAgAkEBaiECCyAPQRRqEKcBRQRAIAVB0AhqIAJBAnRyQQI2AgAgAkEBaiECCwJAAkAgD0EeahCnAUUEQCAFQdAIaiACQQJ0akEDNgIADAELIAJFDQELIA0gBCwApPEIQShsaiAFKALQCEEKbGogDGotAAQiAkH/AUYNACAGIAxBFmxqQQE6ABUgAiEDCyAEIAggDCADIAVBsAlqQQwQZCATLQAAIgJBBUYEQEH4JCAQIBJqIAxBAXRqLQAhIgJFDQIaIAJBDXBBAnRB4PEAaigCAAwCC0H4JCACIAwQoQEiAkUNARogAigCAAwBCyAMQQJ0QdDdAGooAgALNgLwBSAGIAxBFmxqIgJBCkHVCiAFQfAFahDgAiAFIAVBsAlqNgLgBSACQQpqQQpB1QogBUHgBWoQ4AIgAkH/ASADQQF0IgMgA0H/AU8bOgAUIAxBAWoiDEEERw0ACwwBCyAGQQFBgD8gBUGwCWoCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAELQDZ8AgODgECAwQFAAYHCAkKCwwNEAsgBSAJLQAcQeQAbEH/AG42AuAEIAVBsAlqQQxBjtkAIAVB4ARqEOACIAktABwhBCAGQe8PLQAAOgAEIAZB6w8oAAA2AAAgBSAFQbAJajYC0AQgBkEKakEKQdUKIAVB0ARqEOACIAZB/wEgBEEBdCIEIARB/wFPGzoAFCAFIAktAB1B5ABsQf8AbjYCwAQgBUGwCWpBDEGO2QAgBUHABGoQ4AIgCS0AHSEEIAZBlx8oAAA2ABkgBkGUHygAADYAFiAFIAVBsAlqNgKwBCAGQSBqQQpB1QogBUGwBGoQ4AIgBkH/ASAEQQF0IgQgBEH/AU8bOgAqIAUgCS0AHkHkAGxB/wBuNgKgBCAFQbAJakEMQY7ZACAFQaAEahDgAiAJLQAeIQQgBkGzGCgAADYALyAGQbAYKAAANgAsIAUgBUGwCWo2ApAEIAZBNmpBCkHVCiAFQZAEahDgAiAGQf8BIARBAXQiBCAEQf8BTxs6AEAgBSAJLQAfQeQAbEH/AG42AoAEIAVBsAlqQQxBjtkAIAVBgARqEOACIAktAB8hBCAGQdExLwAAOwBGIAZBzTEoAAA2AEIgBSAFQbAJajYC8AMgBkHMAGpBCkHVCiAFQfADahDgAiAGQf8BIARBAXQiBCAEQf8BTxs6AFYMDwsgBCAIIAYQawwOCyAIQQFLDQAgBCAIIAYQawwNCyMAQUBqIgMkAAJ/IAhFBEAgA0ECNgI8QYD5ACECQQIMAQsgBCAIQTBsai0AbyADQTxqEJ8BIQIgAygCPAshCgJAIAJFDQAgCkUNACACIAQgCGotAPLwCCAKb0E4bGoiDC0ABEUNACAEQezwCGohDyAEQRhqIQ4gDEEIaiEQIAQgCEGEC2xqQfgCaiENIAQgCEEwbGoiAkHQ9gBqIREgAkHYAGohEkEAIQoDQCAQIApBDGxqIQICfyAIBEAgDiAIIAIQogEhByACLAAEIglBAEgEQCAEIAggCUEDcSAHIANBMGpBDBBkIAIMAgsCQCAHDQAgAi0AB0ERRw0AIAMgEiAREE02AiAgA0EwakEMQfnUACADQSBqEOACQQAhByACDAILIAIgByADQTBqQQwQpQEgAgwBCyACIA0gDyAELQDb8AhqLQAAQQ9xQQN0aiACLQAEQQdxai0AACIHIANBMGpBDBClASACIAItAARBBkcNABogDSAPIAQtANvwCGotAABBD3FBA3RqLQAEQQxwQQJ0QbCAB2oLIQkgAi0ABiECIAMgCSgCADYCECAGIApBFmxqIglBCkHVCiADQRBqEOACIAMgA0EwajYCACAJQQpqQQpB1QogAxDgAiAJQf8BIAdB/wFsQQEgAiACQQFNG20iAiACQf8BTxtBACACQQBOGzoAFCAKQQFqIgogDC0ABEkNAAsLIANBQGskAAwMCyMAQbABayICJAAgBCAIQTBsakHYAGohAwJ/AkAgBC0A/foIRQ0AIAQtANjwCEEERw0AIAgEQCACIAMtAAdB5ABsQf8AbjYCoAEgAkGkAWpBDEGO2QAgAkGgAWoQ4AIgAy0AByEDIAZBrjAtAAA6AAQgBkGqMCgAADYAACACIAJBpAFqNgKQASAGQQpqQQpB1QogAkGQAWoQ4AJB/wEgA0EBdCIDIANB/wFPGyEDQRQMAgtBACEDIAZBrjAtAAA6AAQgBkGqMCgAADYAACAGQcPDACgAADYACiAGQcbDACgAADYADUEUDAELIAIgAy0ABDYCgAEgAkGkAWpBDEHRDiACQYABahDgAiADLQAEIQQgBkHELi8AADsABCAGQcAuKAAANgAAIAIgAkGkAWo2AnAgBkEKakEKQdUKIAJB8ABqEOACIAZB/wEgBEEBdCIEIARB/wFPGzoAFAJAIAMtAAUiBEHAAEYEQCACQcMAOwGkAQwBCyAEQT9NBEAgAkHAACAEa0H/AXFBMmxBBnY2AlAgAkGkAWpBDEHuDCACQdAAahDgAgwBCyACIARBMmxBgBlrQf7/A3FBP242AmAgAkGkAWpBDEHXDCACQeAAahDgAgsgAy0ABSEEIAZB0IK5AjYAFiACIAJBpAFqNgJAIAZBIGpBCkHVCiACQUBrEOACIAZB/wEgBEEBdCIEIARB/wFPGzoAKiACIAMtAAZB5ABsQf8AbjYCMCACQaQBakEMQY7ZACACQTBqEOACIAMtAAYhBCAGQcYRLwAAOwAwIAZBwhEoAAA2ACwgAiACQaQBajYCICAGQTZqQQpB1QogAkEgahDgAiAGQf8BIARBAXQiBCAEQf8BTxs6AEAgAiADLQAnQeQAbEH/AG42AhAgAkGkAWpBDEGO2QAgAkEQahDgAiADLQAnIQMgBkHSzAAoAAA2AEUgBkHPzAAoAAA2AEIgAiACQaQBajYCACAGQcwAakEKQdUKIAIQ4AJB/wEgA0EBdCIDIANB/wFPGyEDQdYACyAGaiADOgAAIAJBsAFqJAAMCwsgBUHQCGpBAEHYABC+AhogBCAFQdAIahBnIAYgBSkB3gg3AA4gBiAFKQPYCDcACCAGIAUpA9AINwAAIAYgBSkB5gg3ABYgBiAFQe4IaikBADcAHiAGIAVB9AhqKQEANwAkIAUgCS0AGEHkAGxB/wBuNgLgAyAFQbAJakEMQY7ZACAFQeADahDgAiAGQQJBgBUgBUGwCWogCS0AGEEBdBBsIAhBAkkNCiAFIAktABBBGGs2AtADIAVBsAlqQQxBrBQgBUHQA2oQ4AIgBkEDQZAiIAVBsAlqIAktABBBBWwQbAwKCyAEIAVB0AhqEBUiCUUNCSAFQdAIaiAELQDRrQggCW9qLQAAIgnAIghBAE4EQCAFIAQgCUHUAGxqIgQvAaydCEEFakEKbjYCkAUgBUGwCWpBDEHRDiAFQZAFahDgAiAGQQBB4isgBUGwCWogBC8BrJ0IQf8BbEHwnAZrQdAPbRBsIAUgBC0Arp0INgKABSAFQbAJakEMQdEOIAVBgAVqEOACIAZBAUG2GiAFQbAJaiAELQCunQhBH2wQbCAFIAQtAKudCEEGbEGAA2tBwABtwTYC8AQgBUGwCWpBDEHbzAAgBUHwBGoQ4AIgBkECQbkqIAVBsAlqIAQtAKudCEEBdBBsDAoLIAhBf0YNCSAFIAlB/wBxQRhsQaDaAGoiBC8BCEEKbjYCsAUgBUGwCWpBDEHRDiAFQbAFahDgAiAGQQBB4isgBUGwCWpBABBsIAUgBC0ACjYCoAUgBUGwCWpBDEHRDiAFQaAFahDgAiAGQQFBthogBUGwCWpBABBsIAZBAkHVD0H1xgBBABBsDAkLIAhBAkkNCCAEIAggBhBqDAgLIAZBAEHaI0HwKUGRNyAEIAhBAmtBACAIQQFLG0GEA2xqIgRBwOoAai0AACIJG0H/AUEAIAkbEGwgBSAEQcHqAGoiBC0AADYCwAUgBUGwCWpBDEHRDiAFQcAFahDgAiAGQQFBthogBUGwCWogBC0AAEE/bBBsDAcLIwBBgAFrIgIkACACIAQgCEEwbGoiCC0AcUEBajYCcCACQfQAakEMQdEOIAJB8ABqEOACIAgtAHEhBCAGQsOQhfLkqZEmNwAAIAIgAkH0AGo2AmAgBkEKakEKQdUKIAJB4ABqEOACIAZB/wEgBEERbCIEIARB/wFPGzoAFCACIAgtAFlBAWo2AlAgAkH0AGpBDEHRDiACQdAAahDgAiAILQBZIQQgBkH3My0AADoAGiAGQfMzKAAANgAWIAIgAkH0AGo2AkAgBkEgakEKQdUKIAJBQGsQ4AIgBkH/ASAEQQF0IgQgBEH/AU8bOgAqIAIgCC0AWjYCMCACQfQAakEMQdEOIAJBMGoQ4AIgCC0AWiEEIAZCw4bFgdLpkyI3ACwgAiACQfQAajYCICAGQTZqQQpB1QogAkEgahDgAiAGQf8BIARBAXQiBCAEQf8BTxs6AEAgAiAILQBbNgIQIAJB9ABqQQxB0Q4gAkEQahDgAiAILQBbIQggBkHQ0QAtAAA6AEYgBkHM0QAoAAA2AEIgAiACQfQAajYCACAGQcwAakEKQdUKIAIQ4AIgBkH/ASAIQQF0IgggCEH/AU8bOgBWIAJBgAFqJAAMBgsgBCAIIAVB0AhqEBAhCCAGQQBBxhQgBSgC0AgiDEECdEHggAFqKAIAIAxBF2wQbCAJLQAbQf8BRgRAIAVC0KS90tTokCo3A7AJDAQLIAUgCEECdEGQgQFqKAIANgLQBSAFQbAJakEMQcIIIAVB0AVqEOACIAktABtB/wFGDQMgCEEZbEEZagwECyAEIAYQaQwECyAGQQBBsxRBtxJB1SEgBC0Am/UIIgQbQf8BQQAgBBsQbCAGQQFBw8MAQYMSQQAQbAwDC0EAIQkjAEHAA2siCCQAIAQgBC0A7fAIQQ9xIgJBA3RqIQogBCACQQxsaiIHQYAZaiECIActAIAZQQdNBEAgAi8BCEEARyEDCyAKQfwNaiEKAn8CfwJAAkACQAJAIAQtAPPwCEEDcUEBaw4DAQMCAAsgAi8BCCEKIAggAi8BBiIHQYD9AG42AnAgCCAHQQR2QegHcDYCdCAIQbQDakEMQdEYIAhB8ABqEOACIAhBtANqQdnUACADGyEHIApBBHYhCgJAIAMEQEEAIQMgBCgC3K0IIgwEQCACLwEGQf8BbCAMbiEJCyAGQbcULwAAOwAEIAZBsxQoAAA2AAAgCCAIQbQDajYCUCAGQQpqQQpB1QogCEHQAGoQ4AIgBkH/ASAJIAlB/wFPGzoAFCAIIAo2AkAgCEG0A2pBDEGXGyAIQUBrEOACIAQoAtytCCIKRQ0BIAIvAQhB/wFsIApuIQMMAQtBACEDIAZBADoAFCAGQS07AAogBkG3FC8AADsABCAGQbMUKAAANgAAIAggCjYCYCAIQbQDakEMQZcbIAhB4ABqEOACCyAGQY0zKAAANgAZIAZBijMoAAA2ABYgCCAHNgIwIAZBIGpBCkHVCiAIQTBqEOACIAZB/wEgAyADQf8BTxs6ACogCEEBIAQtANOtCEEDcXQ2AiAgCEG0A2pBDEH0CyAIQSBqEOACIAQtANOtCCECIAZB8ystAAA6ADAgBkHvKygAADYALCAIIAhBtANqNgIQIAZBNmpBCkHVCiAIQRBqEOACIAZB/wEgAkHVAGwiAiACQf8BTxs6AEAgBC0A0q0IIQQgBkHDJC0AADoARiAGQb8kKAAANgBCIAggBEEDcEECdEGg4QBqKAIANgIAIAZBzABqQQpB1QogCBDgAkH/ASAEQf8AbCIEIARB/wFPGwwDCyAIIAItAAJBGGs2AtABIAhBtANqQQxBrBQgCEHQAWoQ4AIgAi0AAiEEIAZB3zMvAAA7AAQgBkHbMygAADYAACAIIAhBtANqNgLAASAGQQpqQQpB1QogCEHAAWoQ4AIgBkH/ASAEQf8BbEEwbiIEIARB/wFPGzoAFCAIIAotAAE2ArABIAhBtANqQQxB0Q4gCEGwAWoQ4AIgCi0AASEEIAZBxC4vAAA7ABogBkHALigAADYAFiAIIAhBtANqNgKgASAGQSBqQQpB1QogCEGgAWoQ4AIgBkH/ASAEQQF0IgQgBEH/AU8bOgAqIAItAAEhBCAGQb0RLQAAOgAwIAZBuREoAAA2ACwgCCAEQQNxQQJ0QbDfAGooAgA2ApABIAZBNmpBCkHVCiAIQZABahDgAiAGQf8BIARB1QBsIgQgBEH/AU8bOgBAIAItAAMhBCAGQcSSyQI2AEIgCEHSEkGGxAAgBEEBcSIEGzYCgAEgBkHMAGpBCkHVCiAIQYABahDgAkF/QQAgBBsMAgsgCCACLQAKQeQAbEH/AW42AqACIAhBtANqQQxBjtkAIAhBoAJqEOACIAItAAohBCAGQsyevYKFpJInNwAAIAggCEG0A2pB2dQAIAMbIgM2ApACIAZBCmpBCkHVCiAIQZACahDgAiAGIAQ6ABQCfyACLQALIgQEQCAIIARB5ABsQf8BbjYCgAIgCEG0A2pBDEGO2QAgCEGAAmoQ4AIgAi0ACwwBCyAIQZY+LwAAOwG4AyAIQZI+KAAANgK0A0EACyEEIAZB8hItAAA6AB4gBkHqEikAADcAFiAIIAM2AvABIAZBIGpBCkHVCiAIQfABahDgAiAGIAQ6ACogAi0AASEEIAZBvREtAAA6ADAgBkG5ESgAADYALCAIIARBA3FBAnRBsN8AaigCADYC4AEgBkE2akEKQdUKIAhB4AFqEOACQf8BIARB1QBsIgQgBEH/AU8bIQRBwAAMAgsCQCACLQAEEPEBIgRB6AdPBEAgCCAEQegHbiIDNgKgAyAIIAQgA0HoB2xrQf//A3FB5ABuNgKkAyAIQbQDakEMQfsYIAhBoANqEOACDAELIAggBDYCsAMgCEG0A2pBDEGNGyAIQbADahDgAgsgAi0ABCEEIAZBzzAoAAA2AAMgBkHMMCgAADYAACAIIAhBtANqNgKQAyAGQQpqQQpB1QogCEGQA2oQ4AIgBkH/ASAEQQF0IgQgBEH/AU8bOgAUAkAgAi0ABRDwASIEQegHTwRAIAggBEHoB24iAzYC8AIgCCAEIANB6Adsa0H//wNxQeQAbjYC9AIgCEG0A2pBDEH7GCAIQfACahDgAgwBCyAIIAQ2AoADIAhBtANqQQxBjRsgCEGAA2oQ4AILIAItAAUhBCAGQtKKsaqU6NQiNwAWIAggCEG0A2o2AuACIAZBIGpBCkHVCiAIQeACahDgAiAGQf8BIARBAXQiBCAEQf8BTxs6ACoCfyAKLQAHIgQEQCAIIAQ2AtACIAhBtANqQQxB0Q4gCEHQAmoQ4AIgCi0AB0HVAGwMAQsgCEHPjJkCNgK0A0EACyEEIAZBij8vAAA7ADAgBkGGPygAADYALCAIIAhBtANqNgLAAiAGQTZqQQpB1QogCEHAAmoQ4AIgBkH/ASAEIARB/wFPGzoAQCACLQADIQQgBkHAJS8AADsARiAGQbwlKAAANgBCIAhBw8sAQZE3IARBAnFBAXYiBBs2ArACIAZBzABqQQpB1QogCEGwAmoQ4AJBf0EAIAQbCyEEQdYACyAGaiAEOgAAIAhBwANqJAAMAgtBAAsQbCAGQQJBj8QAIAQtACIiCUEFcEECdEHQ3gBqKAIAIAlBP2wQbCAGQQNBsDBB8ClBkTcgBC0AIyIEG0H/AUEAIAQbEGwLIAVBwAlqJABBwP0LQR06AAAgAS0A2PAIQQVHDQAgAS0A2vAIDQBBwI0MLQAARQ0AIAEgAS0Ai/YIQcqNDEEKEOgBCyAAQQBBqAFB8AFByABBwhAQWCAAQQBBqAFB8AFBxCEQWUEAIQgDQCAIEAUhBkEAIQ0gAS0A5PYIBEAgCCABLQDl9ghGIQ0LIAhBPGwhCiAIBEAgACAKQawBQTZBxCEQWgsgCkEeaiEJAkAgCEEWbEHAjQxqIgctAABFBEAgCkEdaiEGQQAhAgNAIAAgBiACQQF0IgNBsIcBaiwAAGogA0GxhwFqLAAAQboBakEDQQNBxCEQWCACQQFqIgJBIUcNAAsgACAJQbsBIApBGGpBwQFBxCEQXCAAIAZBugFBA0EDQbT4ARBYDAELIA0EQCAAIApBAnJBqgFBOEE6IAYQWwsgCkEdaiEFIActABQiDEEhbEH/AW4hBEEAIQIDQCAAIAUgAkEBdCIDQbCHAWosAABqIANBsYcBaiwAAEG6AWpBA0EDQcQhIAYgAiAETxsQWCACQQFqIgJBIUcNAAsgACAJQbsBIAlBAUEhIAQgBEEhThsiAiACQQFMG0EBa0EAIAxBCE8bQQF0IgJBsIcBaiwAAEEBdEEDbcFqIAJBsYcBaiwAAEEBdEEDbUG7AWpB//8DcUG/XyAGIA0bQf//A3EQXCAAIAVBugFBA0EDQb/fA0G0+AEgDRsQWCAAIAlBzQEgB0EKaiAGQb9fIActABUbQf//A3FBARBhIActABUEQCAAIApBNWpBzgFBBEEEIAYQWAsgCyAHEJkBNgIAIAtB4AVqQQtBvQggCxDgAiAAIAlB2QEgC0HgBWogBkEBEGELIAhBAWoiCEEERw0ACwsgAEHoAUEGEFcEQCALQeAFaiEJIAtB5AVqIQwgC0HoBWohD0HZ1AAhA0HZ1AAhBEHZ1AAhCgJAAkACQCABIgItANrwCA4OAQACAgICAgICAgICAQECC0G4MSEKQYfUACEEQYUpIQMMAQsgAkHvAGoiBSACLQDb8AgiBkEwbGotAAAhAwJAAkACQAJAIAItANjwCCIEQQRGBEACQCACLQDZ8AgNAAJAIAZBAkkNACACLQD58AhFDQAgAiwApPEIQQBODQBBliQhCkHvOiEEQfIkIQMMBwsgAiwApPEIQQBIDQBBsBhB1swAIAZBAkkiAhshBEGuxQBBijMgAhshA0GAFSEKDAYLQeEzQajFACADQQRGGyEFQcLAACEEQcLAAEG1FiAGQQFGGyEHIAItANnwCCIKQQRGIgJFDQFB4TghBAwCCwJAIARBAWsiCEH/AXFBAksNACACLQD+8AgiB0UNAEGNPUHZ1AAgB0ECSxshBEG4MSEKQcLAACEDAkAgB0EBaw4CBQYAC0HhM0GoxQAgBSAHQTBsakEway0AAEEERhshAwwFC0HhM0GoxQAgA0EERhtBwsAAQbUWIAZBAUYbIAZBAUsbIQNB4ishBEG4MSEKAkACQAJAAkACQAJAIAgOCAoAAQgCBAMFCAtBksIAIQpBuDchAwwJC0GzEiEKQeE4IQRBuDchAwJAAkAgAi0A6/AIQQFrDgMACgEKC0GNPUHZ1AAgBkEBSxshBEG4MSEKDAkLQc8PQdnUACACLQDweCICGyEKQYUpQdnUACACGyEEDAgLQbMSIQpB4TghBEHZ1AAhAwwHC0GzEiEKQdQXIQNB1BchBAwGC0G4MSEEQdnUACEDDAULQdQXIQRB2dQAIQNB1BchCgwECwJAAkACQCAKQQZrDgcDAAAAAAABAAsgA0EHSQ0BC0HZ1AAhBAwBCyADQQJ0QeDkAGooAgAhBAtBsxJBksIAIAIbIQogBSAHIAZBAUsbIQMMAgtB2dQAIQNB2dQAIQRB2dQAIQoMAQtBtRYhAwsgCSAKNgIAIAwgBDYCACAPIAM2AgACf0EBIAsoAuAFIgMtAAAiAkUNABogAkEtRgRAIAMtAAFFDAELQQALIQIgAS0A5PYIBH8gAS0A6fYIQQFGBUEACyEDIABBBEHoAUHOLkGI0wBBtPgBIAIbEGMgAEHOLhBiQQhqQegBQdnUACALKALgBSACGwJ/IAMEQCABLwHq9ggMAQtBiNMAQb9fIAIbC0H//wNxEGMCf0EBIAsoAuQFIgMtAAAiAkUNABogAkEtRgRAIAMtAAFFDAELQQALIQIgAS0A5PYIBH8gAS0A6fYIQQJGBUEACyEDIABB1ABB6AFBjDZBiNMAQbT4ASACGxBjIABBjDYQYkHYAGpB6AFB2dQAIAsoAuQFIAIbIAMEfyABLwHq9ggFQYjTAEG/XyACGwtB//8DcRBjAn9BASALKALoBSIDLQAAIgJFDQAaIAJBLUYEQCADLQABRQwBC0EACyECIAEtAOT2CAR/IAEtAOn2CEEHRgVBAAshAyAAQaQBQegBQbg7QYjTAEG0+AEgAhsQYyAAQbg7EGJBqAFqQegBQdnUACALKALoBSACGyADBH8gAS8B6vYIBUGI0wBBv18gAhsLQf//A3EQYwtBwP0LQQA6AAAgASgCyPcIIAEoAvT6CE8NACAAQQBBAEHwAUECQYrwAxBYIABBAEHuAUHwAUECQYrwAxBYIABBAEEAQQJB8AFBivADEFggAEHuAUEAQQJB8AFBivADEFgLIAtBsAhqJAALswQBEH8jAEFAaiIFJAAgASACQYQLbGpB+AJqIAJBgBRsIAFqQcANayACQQJJGyELQQMgBEEJayIOQQF2Ig8gBEEUTxshECAEQQJrIQwgASACakHs8AhqIREgBEEHa0EBdkEBaiESIAFB8PcIaiACQQZ0aiETIARBE0shFANAAkAgACAGQQJ2IARsIANqIgcgDBBXRQ0AIAsvAYABQQEgBnRxIQ0gACAGQQNxQTtsIgpBAmogB0E4IAwCfyABKALI9wgiCCATIAZBAnRqKAIAIglJBEAgAhADDAELQcQhIAYgES0AAEcNABogAhADQQF2Qe/3AXELEFhBwhBBtPgBQb9fIA0bIAggCUkiCRshCAJAIBRFBEAgBSAGQQFqNgIQIAVBNGpBDEHRDiAFQRBqEOACIAAgCkEFaiAHIBJqIAVBNGpBwhBBtPgBIAkbEGMgBSABIAIgBhAREJkBNgIAIAVBNGpBDEHHCCAFEOACIAAgCkEOaiAHIA9qIAVBNGogCEH//wNxQQEQXxoMAQsgACAKQQVqIgkgB0EDaiABIAIgBhARIAhB//8DcSIIQQEQXxogBSALIAZBA3RqLQAEQQxwQQJ0QYCAB2ooAgAQmQE2AiQgBSAGQQFqNgIgIAVBNGpBDEHPCSAFQSBqEOACIAAgCSAHIA5qIAVBNGogCBBjCyANRQ0AIAAgCkEyaiAHIBBqQeMsQYrwA0EBEF8aCyAGQQFqIgZBEEcNAAsgBUFAayQAC2EAAkAgAkUNACACLQAARQ0AIAJBARBeQeQBTARAIABBgQEgASABQYEBTxsiAUEIEFdFDQEgAEEGIAEgAkG0+AFBARBfGg8LIAAgAUEGEFdFDQAgAEEEIAEgAkG0+AEQYwsL6AMBC38jAEHQAGsiAiQAIAEgARATIgMgAkEsahAQIQcCQCAAQSRBCRBXRQ0AIAIoAiwhBSAHQQlvQQJ0QZCBAWooAgAQmQEhBCACIANBAWo2AgggAiAENgIEIAIgBUEMb0ECdEHggAFqKAIANgIAIAJBMGpBGEH4CyACEOACIABBBEEkIAJBMGpBv98DQQEQXxogASwApfUIQQBIDQAgAEHsAUEkIAFBq/UIakG/3wNBARBgGgsgAUGw8QhqIQpBACEDA0AgACADQQJ2QRZsIgVBLmoiBEEWEFcEQCACQSpqIAEtACUgAxC7ASACLQAqELwBQQF0QYCEAWovAQAhBiAAIANBA3FBPGwiC0EBciIMIARBOkEVAn8gAxD0ASAKai0AAARAQcIQIQhBwhAhCSAGDAELQb/fAyEJIAYhCCABLACl9QggA0cEf0HEIQUgBkEBdkHv9wFxCwtB//8DcRBYIAAgDCAEQQNBFSAGEFggAigCLCAHIAItACogAi0AKyACQSBqEL0BIAIoAiwgByACLQAqIAItACsgAkEWahC5ASAAIAtBCGoiBCAFQTBqIAJBIGogCUEBEF8aIAAgBCAFQTxqIAJBFmogCEH//wNxEGMLIANBAWoiA0EQRw0ACyACQdAAaiQAC6gCAQR/IwBB4ABrIgIkACABLQDb8AghAyAAQRlBChBXBEAgAEEAQRlB8AFBCkGK8ANBiNMAIAEtAPnwCBsQWEGzCRCaASEEIAIgASADEAI2AjQgAiADQQFqIgU2AjAgAkFAa0EgIAQgAkEwahDgAiAAQQRBGiACQUBrQcIQQQEQXxoCQCABLQCe9QggBUYEQCACQYvMABCZATYCACACQUBrQSBB1QogAhDgAgwBCyADQQJPBEAgAiABLAD48AgiBDYCICACQUBrQSBBrA1Bww0gBEEAShsgAkEgahDgAgwBCyACQfsUEJkBNgIQIAJBQGtBIEHVCiACQRBqEOACCyAAQewBQRogAkFAa0HCEEEBEGAaCyAAIAEgA0EnQQAQ6gEgAkHgAGokAAvHAwEDfwJAIABBGUEKEFdFDQBBgxIQYiEEQbT4ASEFQbT4ASEGIABBBEEbQYMSIAEtANjwCEEBRgR/IABBAkEZIARBBGpBCUGfDxBYQcIQBSAGCxBjQaESEGIhBiAAIARBDGpBG0GhEiABLQDY8AhBAkYEfyAAIARBCmpBGSAGQQRqQQlBnw8QWEHCEAUgBQsQYyAEIAZqQRRqIQRBhyYQYiEGIAAgBEEbQYcmIAEtANjwCEEDRgR/IAAgBEECa0EZIAZBBGpBCUGfDxBYQcIQBSAFCxBjIAEtANjwCCIEQf4BcUECRgRAIAFB/voIQevwCCAEQQJGIgQbai0AACEBIABB7AFBpR9BkTQgBBsiAhBiIgVrQRsgAkG/3wNBiNMAIAFBA3EiAUEDRhsQYyAAQecBQc/MAEGAPyAEGyICEGIgBWoiBWtBGyACQb/fA0GI0wAgAUECRhsQYyAAQeIBQcIRQcQcIAQbIgIQYiAFaiIFa0EbIAJBv98DQYjTACABQQFGGxBjIABB3QFB5S5BvCUgBBsiBBBiIAVqa0EbIARBiNMAQb/fAyABGxBjDwsgAkUNACAAQewBIAIQYmtBGyACIAMQYwsLcwEBfwJAIAAgAUEMEFdFDQBBtPgBIQUgAgRAIABBACABQfABQQtBxCEQWCAAQQAgAUECQQtBnw8QWEG/3wMhBQsgAEEGIAFBAmoiASADIAVBARBfGiAERQ0AIABB6gEgASAEQZ8PQb/fAyACG0EBEGAaCwvZBAEKfyMAQbABayIEJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAQ4KAQIDBAUGBwgACQoLIAAtAPShCCEBIAAtAKChCCEFIAAtAMygCCEGIAAtAPifCCEHIAAtAKSfCCEIIAAtANCeCCEJIAAtAPydCCEKIAAtAKidCCELIABBqJ0IahDeASEAQe8YEJoBIQxBsNQLKAIAIQ0gBCAAQQpsIgBBgOIJbjYCmAEgBCANNgKUASAEIABBgP0AbkEKcDYCnAEgBCABIAUgBiAHIAggCSAKIAtqampqampqNgKQASACIAMgDCAEQZABahDgAgwKCyAEQdgvQegvIAAtAOXcBxs2AhAgAiADQdUKIARBEGoQ4AIMCQsgBEHZIUHXJiAALQDm3AcbNgIgIAIgA0HVCiAEQSBqEOACDAgLIAQgAC0A59wHNgIwIAIgA0GNKSAEQTBqEOACDAcLIAQgAC0A6NwHNgJAIAIgA0GdGyAEQUBrEOACDAYLIARB8ClBkTcgAC0A69wHGzYCUCACIANB1QogBEHQAGoQ4AIMBQsgBEGWLEHGKyAALQDq3AciAEEBRhtBkTcgABs2AmAgAiADQdUKIARB4ABqEOACDAQLIARBwNUAQZE3IAAtAO/cBxs2AnAgAiADQdUKIARB8ABqEOACDAMLIARBwNUAQZE3IAAtAPDcBxs2AoABIAIgA0HVCiAEQYABahDgAgwCCyAEEJgBNgKgASACIANB1QogBEGgAWoQ4AIMAQsgBEGDDzYCACACIANB1QogBBDgAgsgBEGwAWokAAuxAgEEfyMAQRBrIgkkAEG/3wMhCAJAAkAgBw0AQbT4ASELQYjTACEHAkACQAJAAkAgBi0ABiIKQQFrDgUABAIBAwULQYjTACELQbT4ASEIDAILQbT4ASEIDAILIAEoAsj3CEH6AW5BAXENAQsgACACIAMgBCAFIAsQW0EBIQogCCEHDAELIAAgAiADIAQgBSAIEFhBASEKQcIQIQcLIAYtAAAEQAJAIAYvAQgiCEUNACAIQb/fA0YNACAAIAJBAmogAyAFakEDayAEQQRrQQIgCCAIQQF2Qe/3AXEgChsQWAsgCSAGEJkBNgIEIAlBAzYCACAJQQpqQQZB0QggCRDgAiAAIAIgBCAJQQpqEGJrQQJtakEBaiAFQQVrQQF2IANqIAlBCmogBxBjCyAJQRBqJAAL5BYCI38DfiMAQRBrIhEkAAJAIAAgA0ECa0GJASADaxBXRQ0AAkAgACgCGCIGQfj9CygCAEYNAEH4/QsgBjYCACACQQJPBEAgAUEYaiACQX8QqAEhBQsgASACaiINLQDs8AhBD3EhDAJAQYD+Cy0AAEUEQCABKAKMnQghBgwBC0H8/QsoAgAiByABKAKMnQgiBkcNACACQYH+Cy0AAEcNAEGC/gstAAAgAS0A1YoBRwRAIAchBgwBC0GD/gstAAAgASACQTBsai0Ab0cEQCAHIQYMAQsgDEGF/gstAABHBEAgByEGDAELAkAgAkECSQ0AQYT+Cy0AACAFQf8BcUYNACAHIQYMAQsgASgCyPcIIAciBmtBlgFLDQELQYH+CyACOgAAQfz9CyAGNgIAQYD+C0EBOgAAQYL+CyABLQDVigE6AAAgASACQTBsai0AbyEGQYX+CyAMOgAAQYP+CyAGOgAAQYj+C0EAOgAAIAJBAU0EQCABIAJBhAtsaiIFQfwDaiEIIAVB+AJqIQ1BASEKQQAhBwNAIA0gB0EDdGotAAAiBUEQIAUbIQlBACEFAkAgByAMRwRAA0ACQCAIIAdBBnRqIAVqLQAAQQFxIQYgBUEBaiIFIAlPDQAgBkUNAQsLIAZFDQELQYj+CyALQQFqIgU6AAAgC0H/AXFBif4LaiAHOgAAIAogCSAJIApIGyEKIAUhCwsgB0EBaiIHQRBHDQALQYT+CyAKOgAADAELQYT+CyAFOgAAAkAgBUH/AXEiCgRAIAJBgBRsIAFqQcANayELQf8AIQZBACEFA0AgCyAJQShsaiIHEKcBRQRAIAUgBy0AACIIIAUgCEobIQUgBiAIIAYgCEgbIQYLIAdBCmoiCBCnAUUEQCAFIAgtAAAiCCAFIAhKGyEFIAYgCCAGIAhIGyEGCyAHQRRqIggQpwFFBEAgBSAILQAAIgggBSAIShshBSAGIAggBiAISBshBgsgB0EeaiIHEKcBRQRAIAUgBy0AACIHIAUgB0obIQUgBiAHIAYgB0gbIQYLIAlBAWoiCSAKRw0ACyAFIAZODQELIA0tAL/1CCIGQQZqIQUgBkEGayEGCyAFIAZrIgdBCkwEQANAIAVBAWoiBSAGIAUgBmtBC0hrIgZrIgdBC0gNAAsLQYf+C0H/ACAFIAVB/wBOGyIJQQAgCUEAShs6AABBhv4LQf8AIAVBI2sgBiAHQSNLGyIFIAVB/wBOGyIFQQAgBUEAShs6AAALIAIQAyESQYcBIANrIgVBAkEMIAVBAQJ/IAJBAU0EQEGI/gstAAAiBwwBC0GI/gstAAAhB0GH/gstAABBhv4LLQAAa0EBagsiBiAGQQFMGyIYbiIGIAZBDE4bIAZBAkkbIgsgGGwiE2tBAm0hBkGE/gstAAAhBUGAAyABIAJBMGxqLQBtQQZwQfz/AGotAABuIQggASACQX9Bif4LLQAAQQAgB0H/AXEbQf8BcSACQQJPGxASIQogAS0A+fAIBEAgASkDiPEIQgBSIRQLIAVBECAFGyEJIAMgBmohDiAEBEAgACABLQDc8AgiBkGAHGwgCW4iB0EPaiIFIA4gBkEEdEEQaiIGIAkgBiAJSRtB4AFsIAluIgwgB2siByATQcQhEFggACAFIA5BAmsiBiAHQQFqIgdBv98DEFkgACAFIA4gE2pBAWogB0G/3wMQWSAAIAUgBkECQb/fAxBaIAAgDEEPaiAGQQJBv98DEFoLQQAhBkEAIQUDQEEAQcQhIAVBA3EbQYjTACAGGyIHBEAgACAFQeABbCAJbkEPaiAOIBMgBxBaCyAGQQFqIgZBACAGIAhHGyEGIAUgCUYhByAFQQFqIQUgB0UNAAsCQCAKQQBIDQAgCSAKTA0AIAAgCkHgAWwgCW5BD2ogDiATQcD4AxBaC0EBIAkgCUEBTRshDCALQQFrIRkgAUHL8QhqIR8gAUG38ghqISAgAUHS8ghqISEgAUGw8QhqISIgEkEBdkHv9wFxISMgC0EFa0EBdiEkIAsgC0ECS2shJUF+QX8gC0EDSxsgC2ohFiABIAJBhAtsaiIFQfwDaiENIAVB+AJqIRogASACQQJrIiZBBHRqIgVBiKABaiEbIAVBhKABaiEcIAVBgKABaiEdIAVB/J8BaiEeIAFB8PcIaiACQQZ0aiEnA0ACQCAAIAsgD2wgDmoiCCALEFdFDQAgAkEBTQRAQQEgD0GJ/gtqLQAAIgp0IRUgGi8BgAEhBSABKALI9wgiBiAnIApBAnRqKAIAIgdJBEAgAEEAIAhBDiAZIBIQWAsgBSAVcSEQIAtBBk8EQCARIAEgAiAKEBEQmQE2AgAgEUELakEFQcwIIBEQ4AIgAEEBIAggJGogEUELakHCEEGKcEG/X0G0+AEgCkGF/gstAABGGyAQGyAGIAdJG0H//wNxEGMLIAhBAWohFyAaIApBA3RqLQAAIgVBECAFGyEIQQAhBUEAIQYDQCANIApBBnRqIAVqLQAAIgdBAXEEQAJ/AkACQCAURQ0AIAEpA4jxCCAGQT9xrYhCAYNQDQAgFSABLwGQ8QhxIgMgEHJFDQFBinBBiNMAIAMbDAILIBBFDQBBiNMADAELQb/fAyAHQQJxDQAaIBIgIyAGIAhJGwshAyAAIAZB4AFsIgQgCW5BEGoiByAXQQEgBEHgAWogCW5BDmoiBCAHayAEIAdNGyAWIANB//8DcRBYCyAFQQFqIgVBACAFIAhHGyEFIAZBAWoiBiAMRw0ACwwBC0GH/gstAAAgD2siB0EMbyIDQQtJQcoKIAN2cSEEIABBACAIAn8CQCAeLwECBEAgByAeLQAARg0BCyAdLwECBEAgByAdLQAARg0BCyAcLwECBEAgByAcLQAARg0BCyAbLwECBEAgByAbLQAARg0BC0EAIQYDQAJAIAYgImotAABFDQAgAiAGICFqLQAARw0AQQAhBSAGICBqLQAAIgpFDQADQCAHIB8gBkECdGogBWotAABGDQMgBUEBaiIFIApHDQALCyAGQQFqIgZBG0cNAAtBiNMAQbT4ASAEGyEFQQlBDiAEGwwBCyASIQVBCUEOIAQbCyAlIAUQWCADDQAgC0EFSQ0AIABBDyAIIBlqQeABQcQhEFkLIA9BAWoiDyAYRw0ACyACQQJJDQAgCyALQQNLayEPIAEgJkGAFGxqQcAaaiEVIAytISkDQEIBICiGISogKKciBEHgAWwhFiAVIARBKGxqIQhBACEFA0ACQCAIIAVBCmxqIgYQpwENAEGH/gstAAAiCiAGLQAAIgdJDQAgB0GG/gstAABJDQAgACALIAogB2tB/wFxbCAOaiIKIAsQV0UNACAEQQEgBi0AAiIMQf8AcSINIA1BAU0bakHgAWwiECAJbiEDQQ8gBiwACUHgASAJbmzBQRhtwSAWIAluakEPaiIHIAdBD0wbIQdB7wECfyADQRBqIAzAIhdBAEgNABogA0EOaiAGLQAIIgxFDQAaIBBB4AFrIAltIhAgAyAQayAMbEHkAG1qQQ5qCyIMIAxB7wFOGyEMAkACfwJAIBRFDQAgASkDiPEIICqDUA0AIAYtAAEhBkGK8AMMAQtBv98DIQMgBi0AASIGQf4ASw0BQfPvAUHz7wEgEiANQf8BcUEBSxsgF0EASBsLIQMgBkH/AXFBMksNACAAIAcgCkEBIAwgB2sgByAMThsgCyADEFsMAQsgACAHIApBASAMIAdrIAcgDE4bIA8gAxBYCyAFQQFqIgVBBEcNAAsgKEIBfCIoIClSDQALIAEsAKTxCCIFQQBIDQAgAS0AqPEIRQ0AIAUgCU4NACAAIAVB4AFsIgUgCW4iBkEOaiAOIAVB4AFqIAluIAZrQQJqIBNBh/0DEFsLIBFBEGokAAu2DQIJfQZ/IwBBEGsiDSQAIAEgAkEwbGoiAUHQ9gBqIQwCQAJ/IAEtAG8iAkEFRgRAIAwtAA4iAUEGcCEOIAFBBUcEQCAOQQAgDkEERxshASAMLQASIQ4gDC0AECERIAwtAA8hD0EADAILIABB+ABB3wBB0jZBtPgBQQEQYQwCCyABQdgAaiIBLQACIQ4gAS0AASERIAEtAAAhD0EAIQFBACACQQZHDQAaIAwtAAcLIRAgDUHkmwE7AA4gDSAQOgANIA0gAToACSANQQM6AAcgDSACQQVGOgAIIA0gDzoACiANIBE6AAsgDSAOOgAMAkACQEGZiQwtAABBCUcNACANQQdqQQkQ1QINAEGIiQwoAgAhDgwBCyAPIQxBoIkMIA0pAAc3AwBBmYkMQQk6AABBqIkMIA0tAA86AAAgAkEFRgR9IA5B/wFxQUBqskMAAHxClQUgDkH/AXGzQwAA/kKVCyEDQQAhAiAMskOFQqE9lBDMAkMAAKBBlCEGIBGyQwAA/kKVIgQgBEMAAMRBlJQgBJRDAAAAP5IhB0GIiQwgA0MAAJBClCIDQwAAAABcIg42AgAgA0MAAAAAXARAQYCJDAJ/QwAAAABDAECcRiAGIAZDAECcRl4bQwAAoEGVENMCQwAAIEGVQwAAZEOUIAZDAACgQV0bIgWLQwAAAE9dBEAgBagMAQtBgICAgHgLNgIAQYSJDAJ/QwAAAABDAECcRiAGIANDAABAQZUQzAKUIgMgA0MAQJxGXhtDAACgQZUQ0wJDAAAgQZVDAABkQ5QgA0MAAKBBXRsiA4tDAAAAT10EQCADqAwBC0GAgICAeAs2AgALIAdDCtejPJRDAAAAP5IiAyADlCEJIAcgB5QhCiABQQFrIQwDQEMAAIA/IAKzQwAAIEGUQwAAZEOVEMwCQwAAoEGUIAaVIgUgBZQiA5MiBCAElCIIIAMgCpWSkSEEIAJBAXRBnP4LagJ/QwAAjkJDAACQQUMAAJBBAn0CQAJAAn0CQAJAAkACQCAMDgMAAQIDC0MAAIA/IASVDAMLIAUgB5UgBJVDAADAP5QMAgsgAyAElQwBC0MAAIA/IAQgCCADIAmVkpGUlQsiA0O9N4Y1IANDvTeGNV4bIgO8IgFB////A0wEQEMAAIC/IAMgA5SVIANDAAAAAFsNAxogAyADk0MAAAAAlSABQQBIDQMaIANDAAAATJS8IQFB6H4hDwwBCyABQf////sHSw0BQYF/IQ9DAAAAACEDIAFBgICA/ANGDQELIA8gAUGN9qsCaiIBQRd2arIiC0OAIJo+lCABQf///wNxQfOJ1PkDar5DAACAv5IiAyADIANDAAAAP5SUIgWTvEGAYHG+IghDAGDePpQgAyADQwAAAECSlSIEIAUgBCAElCIEIAQgBJQiBEPu6ZE+lEOqqio/kpQgBCAEQyaeeD6UQxPOzD6SlJKSlCADIAiTIAWTkiIDQwBg3j6UIAtD2ydUNZQgAyAIkkPZ6gS4lJKSkpIhAwsgAwtDAACgQZQiAyADQwAAkEFeG5NDAABYQpVDAACOQpQgA0MAABDCXRsiA4tDAAAAT10EQCADqAwBC0GAgICAeAs7AQAgAkEBaiICQeQBRw0AC0GUiQxBAToAAEGQiQxBAToAAEGYiQxBAToAACAQRQ0AQYyJDAJ/IBBBA3FBAnRB0IQBaioCAEMAAKBBlRDTAkMAACBBlUMAAGRDlCIDi0MAAABPXQRAIAOoDAELQYCAgIB4CzYCAAsgDgRAIABBgIkMKAIAIgJBhIkMKAIAIgEgASACShtBBmpBggEgAiABayABIAJrIAEgAkgbQQFqQQNB8+8BEFgLIABBBkHSAEHkAUHEIRBZQQEhAgNAAkAgAkEBdCIMQZr+C2ouAQAiAUFHSA0AIAAoAgwgAUE5aiIBIAxBnP4Lai4BAEE5aiIMIAEgDEobSg0AIAAoAhQgASAMIAEgDEgbTA0AIAAgAkEFaiABIAJBBmogDEHA+AMQXAsgAkEBaiICQeQBRw0ACyAAQTRBAEGQiQwtAAAbIgJBBmpB/gBBA0GI0wAQWiAAIAJBAnJB+gBBxNQAQbT4ARBjIABBgAFBAEGUiQwtAAAbIgJBBnJB/gBBA0GI0wAQWiAAIAJBAnJB+gBB0zFBtPgBEGMgAEHMAUEAQZiJDC0AABsiAkEGakH+AEEDQYjTABBaIAAgAkECckH6AEHWMUG0+AEQYyAQRQ0AIABBBkE7QYyJDCgCAEEDQdryAxBYIABBCEE/QZc2QdryAxBjCyANQRBqJAAL+wEBBH8gAEEGQYQBIAFBOWxB//8DcUH/AG4iBkEIaiIBQTtBABAFEFwgACABQTsgASACQTlsQf//A3FB/wBuQQJqIgdqIgJBhAEgA0HJAGxB//8DcUH/AG4iCGsiBUEBEAUQXCAAIAIgBSACQQhB3gEgBEE5bEH//wNxQf8AbkECaiIEIAYgB2pqayIDIANBCEwbaiIDIAVBAhAFEFwgACADIAUgAyAEaiIEQYQBQQMQBRBcIABBBkGFASABQTxBABAFEFwgACABQTwgAkGFASAIayIFQQEQBRBcIAAgAiAFIAMgBUECEAUQXCAAIAMgBSAEQYUBQQMQBRBcC84FAgR9BH8jAEEQayIJJAAgAEEGQd8AQeQBQcQhEFkgCUHkmwE7AA4gCSACOgANIAkgAToADCAJQQQ6AAsCQEGZiQwtAABBBUYEQCAJQQtqQQUQ1QJFDQELQaCJDCAJKAALNgIAQZmJDEEFOgAAQaSJDCAJLQAPOgAAIAKzQwAAQD+UQwAA/kKVQwAAgD6SIQYCfSABQQNLBEBD3c62PyEEQcS45CkhC0OIIyc9DAELIAFBAnRBgIgBaioCACEEQbngACELQwAAAAALIQdBnP4LQSYCfyAGIASUIgSLQwAAAE9dBEAgBKgMAQtBgICAgHgLazsBAEEBIQgDQAJ/IAizQwAAQECUQwAAZEOVIgSLQwAAAE9dBEAgBKgMAQtBgICAgHgLIQogBCAKspMhBQJ9AkACQAJAAkACQCABDgQAAQIDBAsgBUPbD8lAlBDeAgwECyAFQwAAAL+Si0MAAIBAlEMAAIC/kgwDC0MAAIA/IAUgBZKTDAILQwAAgD9DAACAvyAFQwAAAD9dGwwBCwJ/IAhBAWuzQwAAQECUQwAAZEOVIgUgBZIiBYtDAAAAT10EQCAFqAwBC0GAgICAeAsCfyAEIASSIgSLQwAAAE9dBEAgBKgMAQtBgICAgHgLRwRAIAtBjczlAGxB3+a74wNqIguyQwAAADCUIQcLIAcLIQQgCEEBdEGc/gtqQSYCfyAGIARDAAAMQpSUIgSLQwAAAE9dBEAgBKgMAQtBgICAgHgLazsBACAIQQFqIghB5AFHDQALCyADQYjTACACGyEBQQEhCANAAkAgCEEBdCICQZr+C2ouAQAiCkFHSA0AIAAoAgwgCkE5aiIKIAJBnP4Lai4BAEE5aiICIAIgCkgbSg0AIAAoAhQgCiACIAIgCkobTA0AIAAgCEEFaiAKIAhBBmogAiABEFwLIAhBAWoiCEHkAUcNAAsgCUEQaiQAC/gNAgZ/Bn0jAEEgayIFJAAgASACQTBsaiICLQBvIQQgAEEGQd8AQeQBQcQhEFkgBUHkmwE7AAMgBSAEOgABIAVBAToAACAFIANBAWo6AAIgBSACLQDZdjoABSAFIAItANB2IgE6AAYgBSACLQDRdiIGOgAHIAUgAi0A03YiBzoACiAFIAE6AAkgBSAHOgAIIAItANd2IQEgBSAGOgAMIAUgAToACyAFIAItANR2OgANIAUgAi0A2HY6AA4gBSACLQDSdjoADyAFIAItANZ2OgAQIAUgAi0A2nY6ABEgA0EDSSEIIARBA0YhBkEAIQECQEGZiQwtAABBEkYEQCAFQRIQ1QJFDQELIAJB0PYAaiECQaiJDCAFKQMINwMAQaCJDCAFKQMANwMAQZmJDEESOgAAQbCJDCAFLwEQOwEAIARBBkchCQNAIAGzIgsgC5JDAABkQ5UhCwJAIAlFBEBDAACAPyALAn8gC4tDAAAAT10EQCALqAwBC0GAgICAeAuykyIKIAqSkyEMIAItAAAhBEMAAAAAIQ4gAi0AAQRAQwAAgD9DAACAvyAKIAItAAmzQx+F6z6UQwAA/sKVQwAAAD+UQwAAAD+SXRshDgsgDEMAAAAAIAQbIQoCfyALQwAAAD+UIguLQwAAAE9dBEAgC6gMAQtBgICAgHgLIQQgAi0AA7NDAAD+QpVDAACAP0MAAIC/IAsgBLKTQwAAAD9dG5QgCiAOkpJDmpkZP5QhC0EmIQQMAQsCfyALIAItAAFBBXBBAnRB4IQBaioCACIOlCAOlSIKi0MAAABPXQRAIAqoDAELQYCAgIB4CyEEIAogBLKTIgpDAACAQJRDAACAv5IgCkMAAIDAlEMAAEBAkiAKQwAAAD9dIgQbIQxDAACAPyAKIAqSkyENAkACQAJAAkACQAJAIAItAABBBnAOBgUABAECAwQLIA0gDJJDAAAAP5QhDAwEC0MAAIA/QwAAgL8gBBshDAwDC0MAAIA/QwAAgL8gCkOamZk+XRshDAwCC0MAAIA/QwAAgL8gCkOPwvU9XRshDAwBCyANIQwLAn8gCyACLQAEQQVwQQJ0QeCEAWoqAgCUIA6VIgqLQwAAAE9dBEAgCqgMAQtBgICAgHgLIQQgCiAEspMiCkMAAIBAlEMAAIC/kiAKQwAAgMCUQwAAQECSIApDAAAAP10iBBshDUMAAIA/IAogCpKTIQ8gDCACLQACs5RDAAD+QpUhDAJAAkACQAJAAkACQCACLQADQQZwDgYFAwQCAQAEC0MAAIA/QwAAgL8gCkOPwvU9XRshDQwEC0MAAIA/QwAAgL8gCkOamZk+XRshDQwDC0MAAIA/QwAAgL8gBBshDQwCCyAPIA2SQwAAAD+UIQ0MAQsgDyENCyAMQ2Zm5j6UIQpDAAAAACAMIAMbIQwCfyALIAItAAhBBXBBAnRB4IQBaioCAJQgDpUiC4tDAAAAT10EQCALqAwBC0GAgICAeAshBCAKQwAAAACSIQ4gCyAEspMiC0MAAIBAlEMAAIC/kiALQwAAgMCUQwAAQECSIAtDAAAAP10iBBshCiANIAItAAazlEMAAP5ClSINIAwgA0EBRhshDEMAAIA/IAsgC5KTIQ8gDUNmZuY+lCENAkACQAJAAkACQAJAIAItAAdBBnAOBgUDBAIBAAQLQwAAgD9DAACAvyALQ4/C9T1dGyEKDAQLQwAAgD9DAACAvyALQ5qZmT5dGyEKDAMLQwAAgD9DAACAvyAEGyEKDAILIA8gCpJDAAAAP5QhCgwBCyAPIQoLIA0gDpIhC0EmAn8gCiACLQAKs5RDAAD+QpUiCiAMIANBAkYbQwAADEKUIg6LQwAAAE9dBEAgDqgMAQtBgICAgHgLa0EmIAgbIQQgCkNmZuY+lCALkiELCyABQQF0IgdBnP4LakEmAn9DAAAowkOamZk/IAsgC0OamZk/XhtDAAAMQpQgC0OamZm/XRsiC4tDAAAAT10EQCALqAwBC0GAgICAeAtrOwEAIAdB5IEMaiAEOwEAIAFBAWoiAUHkAUcNAAsLIAYgCHEhCEEBIQIDQCACQQVqIQMgAkEGaiEJIAJBAXQhAQJAIAJBAWtBAXQiB0Gc/gtqLgEAIgRBR0gNACAAKAIMIARBOWoiBCABQZz+C2ouAQBBOWoiBiAEIAZKG0oNACAAKAIUIAQgBiAEIAZIG0wNACAAIAMgBCAJIAZBnw8QXAsCQCAIRQ0AIAdB5IEMai4BACIEQUdIDQAgACgCDCAEQTlqIgQgAUHkgQxqLgEAQTlqIgEgASAESBtKDQAgACgCFCAEIAEgASAEShtMDQAgACADIAQgCSABQcD4AxBcCyACQQFqIgJB5AFHDQALIAVBIGokAAvDAQECfyACBH8gAEF/cyEAA0AgACABLQAAcyIAQR50QR91QaCG4u1+cUEAIABBAXFrQaCG4u1+cSAAQQF2cyIDQQF2cyIEQRp0QR91QaCG4u1+cSADQRp0QR91QZCD8bYHcSAAQRp0QR91QcjBuNsDcSAAQRt0QR91QeSg3O0BcSAAQRx0QR91QbKQ7vYAcSAAQR10QR91QZmItztxIARBBnZzc3Nzc3MhACABQQFqIQEgAkEBayICDQALIABBf3MFIAALC28BAXxEAAAAAAAAiUBB/wAgACAAQf8ATxtBACAAQQBOG7hEAAAAAADAX0CjENYCRHsUrkfhenQ/okQAAAAAAECPQKJEAAAAAAAA4D+gIgFEAAAAAAAA8EFjIAFEAAAAAAAAAABmcQRAIAGrDwtBAAtvAQF8RAAAAAAAQI9AQf8AIAAgAEH/AE8bQQAgAEEAThu4RAAAAAAAwF9AoxDWAkT8qfHSTWJQP6JEAAAAAABAj0CiRAAAAAAAAOA/oCIBRAAAAAAAAPBBYyABRAAAAAAAAAAAZnEEQCABqw8LQQAL5AEBBX8gAEEaSwRAQX8PC0F/IQECQCAAQf8BcUEMcEEBayICQQpJQZUFIAJ2QQFxcQ0AIABFBEBBAA8LIABBAXEhAwJ/IABBAUYEQEEAIQFBAAwBCyAAQR5xIQRBACEAQQAhAUEAIQIDQAJAAkAgAEEMcEEIaw4DAQABAAsgAUEBaiEBCyABIAFBAWogAEEBckEMcCIFQQVNQQBBASAFdEEqcRsbIQEgAEECaiEAIAJBAmoiAiAERw0ACyAAQQxwCyEAIANFDQAgAEEKTUEAQQEgAHRBqgpxGw0AIAFBAWohAQsgAQvhAQEFf0F/IQECQCAAQRpLDQAgAEH/AXFBDHAiAkEKSw0AQQEgAnRBqgpxRQ0AIABFBEBBAA8LIABBAXEhAwJ/IABBAUYEQEEAIQFBAAwBCyAAQR5xIQRBACEAQQAhAUEAIQIDQAJAAkAgAEEMcEEIaw4DAAEAAQsgAUEBaiEBCwJAIABBAXJBDHAiBUEFSw0AQQEgBXRBKnFFDQAgAUEBaiEBCyAAQQJqIQAgAkECaiICIARHDQALIABBDHALIQAgA0UNACAAQQpLDQBBASAAdEGqCnFFDQAgAUEBaiEBCyABC64BAQR/AkADQCACQf8BcUEMcCIDQQpNQQBBASADdEGqCnEbRQRAIAAgAUYEQCACDwsgAUEBaiEBCyACQQFqIgNB/wFxQQxwIgRBCk1BAEEBIAR0QaoKcRtFBEAgACABRg0CIAFBAWohAQsgAkECaiIDQf8BcUEMcCIEQQpNQQBBASAEdEGqCnEbRQRAIAAgAUYNAiABQQFqIQELIAJBA2oiAkEbRw0AC0F/IQMLIAMLsQEBBH8CQANAAkAgAkH/AXFBDHAiA0EKSw0AQQEgA3RBqgpxRQ0AIAAgAUYEQCACDwsgAUEBaiEBCwJAIAJBAWoiA0H/AXFBDHAiBEEKSw0AQQEgBHRBqgpxRQ0AIAAgAUYNAiABQQFqIQELAkAgAkECaiIDQf8BcUEMcCIEQQpLDQBBASAEdEGqCnFFDQAgACABRg0CIAFBAWohAQsgAkEDaiICQRtHDQALQX8hAwsgAwu+AgEEfyMAQRBrIgQkAAJAIABBAUsNACAAQQN0IgNB9akMakEAOgAAIANB9qkMakEAOgAAIANB8KkMaiEDAkAgAQRAIAEtAAAiAg0BCyADQQA6AAQgA0EANgIADAELIAMgATYCACADQQggAiACQQhPGzoABAJAQfypDC0AACIBQfSpDC0AACICakEMTQRAIAQgATYCDCAEIAI2AggMAQsgBEEIaiABIAJJQQJ0akEGIAIgASABIAJLGyIFIAVBBk8bIgU2AgAgBEEIaiABIAJPQQJ0akEMIAVrNgIACyAEQQhqIABBAXMiAUECdGooAgAiAiABQQN0QfWpDGoiBS0AAEgEQCABIAIQ9wELIAAgBEEIaiAAQQJ0aigCABD4ASADQQE6AAYgAiAFLQAATA0AIAEgAhD3AQsgBEEQaiQAC6gFAQt/AkACQCABIABBA3QiA0H1qQxqLQAAIgJGDQAgA0HwqQxqIgktAAQiA0UNACAJQQA6AAYCQAJAIAEgAk4NACACIANHDQBBDCABa0EAIAAbIQNBDCACa0EAIAAbIQQCQCAABEAgAUEATA0BIAFBAUYgAkECSXIhCiABQQFrIgVBAXQhBiACQQF0QQJrIQcgASIAQQFxBEBBACEAIAMgBWpB4B9sQYCqDGogCgR/IAAFIAUgB2wgBWogBm0LIARqQeAfbEGAqgxqQeAfEL0CIAUhAAsgAUEBRg0BA0AgAEEBayICIANqQeAfbEGAqgxqIAoEfyAIBSACIAdsIAVqIAZtCyAEakHgH2xBgKoMakHgHxC9AiAAQQJrIgAgA2pB4B9sQYCqDGogCgR/IAsFIAAgB2wgBWogBm0LIARqQeAfbEGAqgxqQeAfEL0CIAJBAUsNAAsMAQsgAUEATA0AIAFBAUYiCCACQQJJciELIAFBAWsiBUEBdCEGIAJBAXRBAmshB0EAIQAgCEUEQCABQf7///8HcSEMQQAhCANAQQAhAiAAIANqQeAfbEGAqgxqIAsEfyACBSAAIAdsIAVqIAZtCyAEakHgH2xBgKoMakHgHxC9AiAAQQFyIgogA2pB4B9sQYCqDGogCwR/IAIFIAcgCmwgBWogBm0LIARqQeAfbEGAqgxqQeAfEL0CIABBAmohACAIQQJqIgggDEcNAAsLIAFBAXFFDQAgACADakHgH2xBgKoMaiECQQAhAyACIAsEfyADBSAAIAdsIAVqIAZtCyAEakHgH2xBgKoMakHgHxC9AgsgCSABOgAFDAELIAkoAgAiBEUNAkEIIAQtAAAiBCAEQQhPGyADRw0CIAAgARD4AQsgCUEBOgAGCw8LIAlBADsBBAu7BQIFfQ9/IABBA3QiB0H1qQxqIAE6AAACQCABRQ0AIAdB8KkMaigCACENIAdB9KkMai0AACILBEADQEEAIQggDSAJQQAQ+QEDQCAIQQJ0IgdBjKcPaioCAIsiAyAHQYinD2oqAgCLIgQgB0GEpw9qKgIAiyIFIAdBgKcPaioCAIsiBiACIAIgBl0bIgIgAiAFXRsiAiACIARdGyICIAIgA10bIQIgCEEEaiIIQYAIRw0ACyAJQQFqIgkgC0cNAAsLIAFBAEwNAEMAYOpGIAKVQwAAAAAgAkMAAAAAXhshAyABQQFGIAtB/wFxQQJJciEOIAFBAWsiD0EBdCEQIAtBAXRBAmshEQNAIAwgEWwgD2ohEkEAIQoDQEEAIQdBACEIIA0gDgR/IAgFIBIgEG0LIAoQ+QFBDEH9qQwtAABrQQAgABsgDGpB4B9sIApBAXRBkIgBai8BAEEBdGpBgKoMaiEIQYAIIAp2IglBAXEhEyAKQQpHBEAgCUH+D3EhFEEAIQkDQCAIIAdBAXRqAn9DAP7/RkMAAADHIAMgB0ECdEGApw9qKgIAlCICIAJDAAAAx10bIAJDAP7/Rl4bIgKLQwAAAE9dBEAgAqgMAQtBgICAgHgLOwEAAn9DAP7/RkMAAADHIAMgB0EBciILQQJ0QYCnD2oqAgCUIgIgAkMAAADHXRsgAkMA/v9GXhsiAotDAAAAT10EQCACqAwBC0GAgICAeAshFSAIIAtBAXRqIBU7AQAgB0ECaiEHIAlBAmoiCSAURw0ACwsgEwRAIAggB0EBdGoCf0MA/v9GQwAAAMcgAyAHQQJ0QYCnD2oqAgCUIgIgAkMAAADHXRsgAkMA/v9GXhsiAotDAAAAT10EQCACqAwBC0GAgICAeAs7AQALIApBAWoiCkEHRw0ACyAMQQFqIgwgAUcNAAsLC7wFAgd/Cn0gAkEKTQRAIAAtAAEhBEEBIQNBgKcPQQBBAUGACCACdiIHIAdBAU0bQQJ0IgUQvgIhCEGAxw9BACAFEL4CIQUCQCAEQYACIAQbIglBgAIgAnYiBCAEIAlLGyIERQ0AIAAgASAJbEEBdGpBAmohAUGABCACdiEJA0AgASADQQF0aiICQQJrLQAAIgAEfUMAACBBIABB/wFrskMAAMA+lEMAAKBBlRDZAgVDAAAAAAshCiADQQJ0IgAgCGogCiACQQFrLQAAs0PbD8k8lCILELsClCIMOAIAIAAgBWogCiALEN4ClCIKOAIAIAcgA2tBAnQiAiAIaiAMOAIAIAIgBWogCow4AgAgAyAETw0BIANBAWoiAyAJSQ0ACwtBASEEA0AgByEDIAYhAgNAIAIgA0EBdiIDcSEAIAIgA3MiBiECIAANAAsgBCAGSARAIARBAnQiAyAIaiICKgIAIQogAiAGQQJ0IgAgCGoiASoCADgCACABIAo4AgAgAyAFaiIDKgIAIQogAyAAIAVqIgIqAgA4AgAgAiAKOAIACyAEQQFqIgQgB0cNAAtBAiEBA0AgAUEBdSECQ9sPyUAgAbKVIgoQ3gIiD4whECAKELsCIQxBACEFA0AgAkEASgRAQwAAgD8hCkMAAAAAIQtBACEDA0AgAyAFaiIAIAJqQQJ0IgZBgKcPaiIEIABBAnQiAEGApw9qIggqAgAiDSAEKgIAIg4gCpQgBkGAxw9qIgYqAgAiESALlJMiEpM4AgAgBiAAQYDHD2oiACoCACITIA4gC5QgCiARlJIiDpM4AgAgCCANIBKSOAIAIAAgDiATkjgCACAKIA+UIQ0gCiAMlCALIBCUkiEKIA0gDCALlJIhCyADQQFqIgMgAkcNAAsLIAEgBWoiBSAHSA0ACyABQQF0IgEgB0wNAAsLCzEBAX8CQCAAQQFLDQAgAEEDdCIAQfapDGotAABFDQAgAEHwqQxqLQAFQQBHIQELIAELHAEBfyAAQQFNBH8gAEEDdEH1qQxqLQAABSABCwuCAQEBfyAAQQN0QfWpDGotAAAhBCADQYAIQQYgAkEAIAJBAEobIgIgAkEGThsiA3Y2AgAgAUEBIAQgBEEBTRsiAkEBayABIAJIGyIBQQAgAUEAShsgAmtBDGogASAAGyICQQAgAkEAShtB4B9sIANBAXRBkIgBai8BAEEBdGpBgKoMags7AEGA5w9BhOcPNgIAIABBhOcPNgIUIABBqP8GNgIQIABBJTYCDCAAQSY2AgggAEEnNgIEIABBKDYCAAsSACAAIAFqQQAgAUGAgMAASRsLLAEBfyAALwG0hkciAkH/AU0EQCAAIAJBAWo7AbSGRyAAIAJqIAE6ALSERwsLFgAgAUEoTQRAIAAgAWogAjoAgIRHCwvbAQEGfwJAIARBAEwEQCADQQF0IQcMAQsgA0EBdCEHIABBgIBAayEIIARBAUcEQCAEQf7///8HcSEKA0AgCCACIAZqQfABbCABakEBdGogBSADIAZsQQF0aiAHELwCGiAIIAZBAXIiCyACakHwAWwgAWpBAXRqIAUgAyALbEEBdGogBxC8AhogBkECaiEGIAlBAmoiCSAKRw0ACwsgBEEBcUUNACAIIAIgBmpB8AFsIAFqQQF0aiAFIAMgBmxBAXRqIAcQvAIaCyAAIAAoArCERyAEIAdsajYCsIRHCy0BAX9BfyEDIAAgAmpBgIDAAE0EfyABQYDnDygCACAAaiACELwCGkEABSADCwtOAQF/QX8hAQJAIABB/x9xDQAgAEGA4CVrQf+fEksNAEEAIQEgAEGA5w8oAgAiAGpB/wFBgCAQvgIaIAAgACgCrIRHQQFqNgKshEcLIAELzgEBB39BfyEGAkAgAkGBAmtBgH5JDQAgAiAAQf8BcWpBgAJLDQAgACACakGAgMAASw0AIAJBAXEhB0EAIQZBgOcPKAIAIQQgAkEBRwRAIAJB/gNxIQhBACECA0AgBCAAIANqaiIFIAUtAAAgASADai0AAHE6AAAgBCADQQFyIgUgAGpqIgkgCS0AACABIAVqLQAAcToAACADQQJqIQMgAkECaiICIAhHDQALCyAHRQ0AIAQgACADamoiACAALQAAIAEgA2otAABxOgAACyAGCwYAQYTnDwsHAEGAgMAACxIAQYTnD0H/AUGAgMAAEL4CGgsKAEGw69YAKAIAC5pHBBN/A3wBfQN+IwBBIGsiECQAIBBBCGoQ/QEjAEHAAWsiBSQAQcDt1gBBAEGYwAkQvgIiASAQQQhqIgpBEGoiBCkCADcCECABIAopAgg3AgggASAKKQIANwIAIAEgADYCyPcIA0AgAkECdEGgjgxqAn8gAkHFAGu3RAAAAAAAAChAoxDHAkQAAAAAAIB7QKJEAAAAAMCK5UCjRAAAAAAAAPBBoiIURAAAAAAAAPBBYyAURAAAAAAAAAAAZnEEQCAUqwwBC0EACzYCACACQQFqIgJBgAFHDQALQQAhAgNAIAJBAnQiA0GgkgxqAn9EAAAAAAAA8L9EAAAAAAAAiUAgArhEAAAAAADAX0CjIhQQ1gJEexSuR+F6dD+iRAAAAADAiuVAoqMQwwJEAAAAAAAA0EGiIhZEAAAAAAAA8EFjIBZEAAAAAAAAAABmcQRAIBarDAELQQALNgIAIANBoJYMagJ/RAAAAAAAANBBRAAAAAAAANBBRAAAAAAAQI9AIBQQ1gJE/Knx0k1iUD+iRAAAAADAiuVAoqMiFiAWRAAAAAAAANBBZBsiFkQAAAAAAADwQWMgFkQAAAAAAAAAAGZxBEAgFqsMAQtBAAs2AgAgA0GgmgxqAn9EZ2ZmZkZj00AgFEQAAAAAAAAkQKIQxwJEAAAAAAAANECiIhYgFkRnZmZmRmPTQGQbIhZEGC1EVPshCUCiRAAAAADAiuVAoyEVIwBBEGsiBiQAAkAgFb1CIIinQf////8HcSIDQfvDpP8DTQRAIANBgICA8gNJDQEgFUQAAAAAAAAAAEEAEOICIRUMAQsgA0GAgMD/B08EQCAVIBWhIRUMAQsgFSAGELYCIQMgBisDACAGKwMIIANBAXEQ4gIhFQsgBkEQaiQAIBVEAAAAAAAA8ECiIhWZRAAAAAAAAOBBYwRAIBWqDAELQYCAgIB4CzYCACACQQF0IgNBoJ4MagJ/RAAAAAAAAPA/IBZEGC1EVPshGcCiRAAAAADAiuVAoxDDAqFEAAAAAMD/30CiIhZEAAAAAAAA8EFjIBZEAAAAAAAAAABmcQRAIBarDAELQQALOwEAIANBoKAMagJ/IwBBEGsiBiQAAnwgFEQYLURU+yH5P6IiFiIUvUIgiKdB/////wdxIgdB+8Ok/wNNBEBEAAAAAAAA8D8gB0GewZryA0kNARogFEQAAAAAAAAAABC0AgwBCyAUIBShIAdBgIDA/wdPDQAaIBQgBhC2AiEHIAYrAwghFCAGKwMAIRUCQAJAAkACQCAHQQNxQQFrDgMBAgMACyAVIBQQtAIMAwsgFSAUQQEQtwKaDAILIBUgFBC0ApoMAQsgFSAUQQEQtwILIRUgBkEQaiQARAAAAADA/99AIBVEAAAAAMD/30CiRBsN4C2QoPY/oiIUIBREAAAAAMD/30BmGyIURAAAAAAAAPBBYyAURAAAAAAAAAAAZnEEQCAUqwwBC0EACzsBACADQaCiDGoCf0QAAAAAwP/fQCAWEN0CRAAAAADA/99AokQbDeAtkKD2P6IiFCAURAAAAADA/99AZhsiFEQAAAAAAADwQWMgFEQAAAAAAAAAAGZxBEAgFKsMAQtBAAs7AQAgAkEBaiICQYABRw0AC0EAIQIDQCACQQJ0IgNBoKQMagJ/IAJBGGu3RAAAAAAAAChAoxDHAkQAAAAAAADwQKIiFEQAAAAAAADwQWMgFEQAAAAAAAAAAGZxBEAgFKsMAQtBAAs2AgAgAkEwRgRAQQAhAgNAIAJBAXRB8KUMagJ/IAK4RBgtRFT7IRlAokQAAAAAAABwP6IQ3QJEAAAAAMD/30CiIhSZRAAAAAAAAOBBYwRAIBSqDAELQYCAgIB4CzsBACACQQFyIgNBAXRB8KUMagJ/IAO4RBgtRFT7IRlAokQAAAAAAABwP6IQ3QJEAAAAAMD/30CiIhSZRAAAAAAAAOBBYwRAIBSqDAELQYCAgIB4CzsBACACQQJqIgJBgAJHDQALBSADQaSkDGoCfyACQRdrt0QAAAAAAAAoQKMQxwJEAAAAAAAA8ECiIhREAAAAAAAA8EFjIBREAAAAAAAAAABmcQRAIBSrDAELQQALNgIAIAJBAmohAgwBCwsgAUEYaiIJEK8BIAFBkIoBaiISIgJBDGpBAEHEPRC+AhogAiABQeDHAWoiAzYC+DQgAiABQYz6AGoiDTYCCCACIAFB8PgAajYCBCACIAk2AgAgAiACQdQwajYC6DQgAiACQdQsajYC5DQgAiACQdQoajYC4DQgAiACQdQkajYC3DQgAiACQdQgajYC2DQgAiACQdQcajYC1DQgA0EAQeCTBhC+AhogAkHXuQE2ApQ8QQAhBkHwg+kALQAARQRAQeDQ6QAtAABFBEBB4NDpAEEBOgAAQwAAgE4hFwNAIAZBA3QiA0HkkOkAagJ/IBe7RAAAAAAAAOA/oJwiFJlEAAAAAAAA4EFjBEAgFKoMAQtBgICAgHgLNgIAIANB7JDpAGoCfyAXQzAWgD+UIhe7RAAAAAAAAOA/oJwiFJlEAAAAAAAA4EFjBEAgFKoMAQtBgICAgHgLNgIAIBdDMBaAP5QhFyAGQQJqIgZBgAhHDQALQQAhAwNAIANBA3QiBkHgkOkAaiAGQeyQ6QBqKAIAIgcgBkHkkOkAaigCAGs2AgAgA0H+B0cEQCAGQeiQ6QBqIAZB9JDpAGooAgAgB2s2AgAgA0ECaiEDDAELC0HY0OkAQYCAgIB4QdzQ6QAoAgBrNgIAC0EAIQZBACEDQQAhB0GQteoALQAARQRAQZC16gBBAToAAEKAgICABCEYA0AgBkEDdCIIQZT16QBqIANBIGpBBnUiDDYCACAIQZSV6gBqQQAgDGs2AgAgA6wiGUK88O18fiAYxCIaQoDi/v8DfnxCgICAgAJ8Qh6HIRggGUKA4v7/A34gGkLEj5IDfnxCgICAgAJ8Qh6IpyEDIAZBAWoiBkGABEcNAAsDQCAHQQN0IgZBkPXpAGogBkGc9ekAaigCACIDIAZBlPXpAGooAgBrNgIAIAdB/gdHBEAgBkGY9ekAaiAGQaT16QBqKAIAIANrNgIAIAdBAmohBwwBCwtBiLXqAEEAQYy16gAoAgBrNgIAC0EAIQYCQEH08OkALQAADQBB9PDpAEEBOgAAQ+gjvk0hFwNAIAZBAnQiA0Hw0OkAagJ/IBe7RAAAAAAAAOA/oJwiFJlEAAAAAAAA4EFjBEAgFKoMAQtBgICAgHgLNgIAIAZBgAhGDQEgA0H00OkAagJ/IBdDMBaAP5QiF7tEAAAAAAAA4D+gnCIUmUQAAAAAAADgQWMEQCAUqgwBC0GAgICAeAs2AgAgBkECaiEGIBdDMBaAP5QhFwwACwALQfjw6QBBv50CNgIAQfzw6QBB9wg2AgBB4IgIQcLK/wc2AgBBACEGQYDx6QAtAABFBEBBgPHpAEEBOgAAA0AgBkECdEGQ8ekAagJ/IAZB/wFxuERYObTIdr6vv6IQxwJEAAAAAADgdUCiRAAAAADAiuVAo0QAAAAAAABQQKJEAAAAAFVVNUGiRAAAAAAAAOA/oCIUmUQAAAAAAADgQWMEQCAUqgwBC0GAgICAeAs2AgAgBkEBaiIGQYABRw0ACwsLQZCkCy0AAEECRgRAQZCkC0EAOgAAC0GRpAstAABBAkYEQEGRpAtBADoAAAtBkqQLLQAAQQJGBEBBkqQLQQA6AAALQZOkCy0AAEECRgRAQZOkC0EAOgAAC0GUpAstAABBAkYEQEGUpAtBADoAAAtBlaQLLQAAQQJGBEBBlaQLQQA6AAALQZakCy0AAEECRgRAQZakC0EAOgAAC0GXpAstAABBAkYEQEGXpAtBADoAAAtBmKQLLQAAQQJGBEBBmKQLQQA6AAALQZmkCy0AAEECRgRAQZmkC0EAOgAAC0GapAstAABBAkYEQEGapAtBADoAAAtBm6QLLQAAQQJGBEBBm6QLQQA6AAALQZykCy0AAEECRgRAQZykC0EAOgAAC0GdpAstAABBAkYEQEGdpAtBADoAAAtBnqQLLQAAQQJGBEBBnqQLQQA6AAALQZ+kCy0AAEECRgRAQZ+kC0EAOgAAC0HFiOkAQgA3AABBzYjpAEIANwAAQcSI6QBBPzoAAEGoiOkAQgA3AwBBoIjpAEKAwAA3AwBBs4jpAEIANwAAQdyI6QBB+IPpADYCAEH4g+kAQcD/BjYCAEGyiOkAQQA6AABBsIjpAEEAOwEAQdWI6QBBADYAAEHAiOkAQQA2AgBBu4jpAEEAOwAAQaCI6QAQqAJBhYnpAEIANwAAQY2J6QBCADcAAEGEiekAQT86AABB6IjpAEIANwMAQeCI6QBCgMAANwMAQfOI6QBCADcAAEGciekAQfiD6QA2AgBB8ojpAEEAOgAAQfCI6QBBADsBAEGViekAQQA2AABBgInpAEEANgIAQfuI6QBBADsAAEHgiOkAEKgCQcWJ6QBCADcAAEHNiekAQgA3AABBxInpAEE/OgAAQaiJ6QBCADcDAEGgiekAQoDAADcDAEGziekAQgA3AABB3InpAEH4g+kANgIAQbKJ6QBBADoAAEGwiekAQQA7AQBB1YnpAEEANgAAQcCJ6QBBADYCAEG7iekAQQA7AABBoInpABCoAkGFiukAQgA3AABBjYrpAEIANwAAQYSK6QBBPzoAAEHoiekAQgA3AwBB4InpAEKAwAA3AwBB84npAEIANwAAQZyK6QBB+IPpADYCAEHyiekAQQA6AABB8InpAEEAOwEAQZWK6QBBADYAAEGAiukAQQA2AgBB+4npAEEAOwAAQeCJ6QAQqAJBxYrpAEIANwAAQc2K6QBCADcAAEHEiukAQT86AABBqIrpAEIANwMAQaCK6QBCgMAANwMAQbOK6QBCADcAAEHciukAQfiD6QA2AgBBsorpAEEAOgAAQbCK6QBBADsBAEHViukAQQA2AABBwIrpAEEANgIAQbuK6QBBADsAAEGgiukAEKgCQYWL6QBCADcAAEGNi+kAQgA3AABBhIvpAEE/OgAAQeiK6QBCADcDAEHgiukAQoDAADcDAEHziukAQgA3AABBnIvpAEH4g+kANgIAQfKK6QBBADoAAEHwiukAQQA7AQBBlYvpAEEANgAAQYCL6QBBADYCAEH7iukAQQA7AABB4IrpABCoAkHwg+kAQQE6AABB2IgIQwBWLEc4AgBBkPPoAEEAQeAMEL4CGkHkiAhBITYCAEHciAhDAFYsRzgCAEGgi+kAQQBBgAQQvgIaQaCP6QBBAEHAARC+AhpBkKQLLQAAQQFGBEBBkKQLQQA6AAALQZGkCy0AAEEBRgRAQZGkC0EAOgAAC0GSpAstAABBAUYEQEGSpAtBADoAAAtBk6QLLQAAQQFGBEBBk6QLQQA6AAALQZSkCy0AAEEBRgRAQZSkC0EAOgAAC0GVpAstAABBAUYEQEGVpAtBADoAAAtBlqQLLQAAQQFGBEBBlqQLQQA6AAALQZekCy0AAEEBRgRAQZekC0EAOgAAC0GYpAstAABBAUYEQEGYpAtBADoAAAtBmaQLLQAAQQFGBEBBmaQLQQA6AAALQZqkCy0AAEEBRgRAQZqkC0EAOgAAC0GbpAstAABBAUYEQEGbpAtBADoAAAtBnKQLLQAAQQFGBEBBnKQLQQA6AAALQZ2kCy0AAEEBRgRAQZ2kC0EAOgAAC0GepAstAABBAUYEQEGepAtBADoAAAtBn6QLLQAAQQFGBEBBn6QLQQA6AAALQfyoCkGoEjYCAEH4qApByoMKNgIAQfSoCkGwDzYCAEHwqApB6uQJNgIAQeyoCkG1GDYCAEHoqApBgLQJNgIAQeSoCkGhBTYCAEHgqApBvqkJNgIAQdyoCkHFFTYCAEHYqApBtP4INgIAQdSoCkG2CjYCAEHQqApByOkINgIAQcyoCkHkGTYCAEHIqApBgLYINgIAQcSoCkHyAzYCAEHAqApBnK4INgIAQbyoCkHNATYCAEG4qApBgqsINgIAQbSoCkGZAjYCAEGwqApB0KYINgIAQayoCkHPADYCAEGoqApBsqUINgIAQaSoCkHpADYCAEGgqApB4KMINgIAQeCjCEEAQbqEAhC+AhpBoKMIQQE6AABBqKMIQQA2AgBBsKMIQQA2AgBBpKMIQQA2AgBBgKkKQQA2AgBByKMIQQA2AgBBxKMIQQA2AgBBvKMIQQA2AgBBrKMIQQA2AgBBwKMIQQA2AgBBuKMIQQA2AgBBtKMIQQA6AABBkIkIQQBBgBAQvgIaQZSZCEEANgIAQZCZCEEANgIAQZiZCEEANgIAQZyZCEEANgIAIAJBADoArAEgAkH/AToAyRUgAiACNgKoASACIAktAFcQUyIDNgKkASACQaQBaiADKAIAEQQAIAJBAToAvAEgAiACNgK4ASACIAktAIcBEFMiAzYCtAEgAkG0AWogAygCABEEACACQQI6AMwBIAIgAjYCyAEgAiAJLQC3ARBTIgM2AsQBIAJBxAFqIAMoAgARBAAgAkEDOgDcASACIAI2AtgBIAIgCS0A5wEQUyIDNgLUASACQdQBaiADKAIAEQQAIAJBBDoA7AEgAiACNgLoASACIAktAJcCEFMiAzYC5AEgAkHkAWogAygCABEEACACQQU6APwBIAIgAjYC+AEgAiAJLQDHAhBTIgM2AvQBIAJB9AFqIAMoAgARBAAgAiAJLwEAEL8BIAJB/wE6AEYgAkH/AToAhgEgAkH/AToAJCACQf8BOgBHIAJB/wE6AEggAkH/AToAfSACQf8BOgB+IAJB/wE6AFwgAkH/AToAXSACQf8BOgBeIAJB/wE6AF8gAkH/AToAYCACQf8BOgBhIAJB/wE6AGIgAkH/AToAYyACQf8BOgBkIAJB/wE6AGUgAkH/AToAZiACQf8BOgBnIAJB/wE6AGggAkH/AToAaSACQf8BOgBqIAJB//8DOwH0NCACQf8BOgDIFSACQYCAgPwDNgKcNiACQbQGNgKENiACQf//AzsBlDUgAkECOgCLNiACQRk6AIg2IAJBgAM7AZwaIAJBMjoAmRogAkH/AToAayABQQE2AtjHASABQQI2AtDHASABIAE2AtzHASABIAE2AtTHASABQdzqCGpBAEHgARC+AiICIAE2AuQBIAJBAzYC4AEgAkGsAjsB2AEgAkEBOgDXASACQYECOwHUASACQawCOwGoASACQQE6AKcBIAJBgQI7AaQBIAJBrAI7AXggAkEBOgB3IAJBgQI7AXQgAkGsAjsBWCACQQE6AFcgAkGBAjsBVCACQawCOwFIIAJBAToARyACQYECOwFEIAJBrAI7ATggAkEBOgA3IAJBgQI7ATQgAkGsAjsBKCACQQE6ACcgAkGBAjsBJCACQoCAhIDAJTcCBCACQoCAhIDAJTcCxAEgAkKAgISAwCU3AhQgAkKBgoCIwKWA6Ac3AoQBIAJCgYKAiMClgOgHNwK0ASACQoGCgIjApYDoBzcCZCACQoGCgIjApYDoBzcClAEgAUH//wM7AaTxCCABQf//AzsB2OoIIAFB//8DOwGEnQggAUHAADoA7K0IIAFB//8DOwGA+wggAUHkADoA+/oIIAFB/wE6ANWtCCABQf8BOgDw+gggAUH/AToAxfUIIAFB//8DOwDX9QggAUH/AToApfUIIAFB/wE6AIPxCCABQf8BOgCb9gggAUH/AToAmfYIIAFBAjoA3/AIIAFBAToA3/UIIAFBguQAOwDj9QggAUIANwDl3AcgAUHt3AdqIgJCADcAACABQn83AO3yCCABQfXyCGpCfzcAACABQf3yCGpCfzcAACABQYTzCGpBfzYAACABQfXcB2pCADcAACABQfzcB2pCADcAACABQeQAOgDA9wggAUEDOgDk3AcgAUHD9QhqQbzaAC8AADsAACABQbjaACgAADYAv/UIIAFBAToA69wHIAFBAjoA59wHIAFBmQI7AOncByACQQI6AAACf0EAIAQoAgAiBEUNABpBACABQcDbB2oiByAEENYBDQAaIAFB5NwHaiEOIAFBsNwHaiEPIAFByNsHaiEMIAVBoAFqIQNBfyEEAkAgBy4BlAEiCEEASA0AIAcvAZwBIgJBIEsNACAIQf//A3FBDHRBkKA3aiADIAIgBygCACgCABEDAA0AIAcvAZwBIQQLIAQhBiAFLQCgASETQQAhAgNAAkAgASgCDCIERQ0AIAwgAkEBdCIDai4BACIIQQBIDQAgAyAPai8BACEDIAEoAhQgCEENdEGQ4CVqIAQRBQAiBEUNACADQf//A3FBEkkNAEEBIAsgBC0AEUEIRxshCwsgAkEBaiICQQpHDQALIBNBA0YhAgJAAkACQCAGQSBHDQAgAg0AIAcgCigCEBDaASAKKAIQIQNBACEEAkADQCAEQQx0IghBgIAwciADKAIEEQIADQEgBEEYRwRAIAhBgKAwciADKAIEEQIADQIgBEECaiEEDAELC0Gw1AtBADYCAAsMAQsgC0UNACAHIAooAhAQ2gEMAQsgBkEgRiACcUUNACAOIAUpAKABNwAAIA4gBSkAuAE3ABggDiAFKQCwATcAECAOIAUpAKgBNwAIQX8hBAJAIAdBIGoiAi4BCCIDQQBIDQAgAi8BcCICQZoBSw0AQX8gAiADQf//A3FBDXRBkOAlaiAFIAIgBygCACgCABEDABshBAsgBEGaAUcNACAFLQAAQQJHDQAgAUHAACAFLQABIgQgBEHAAE8bIgM6APB4IAFBqfkAaiAFKQE6NwAAIAFBofkAaiAFKQEyNwAAIAFBmfkAaiAFKQEqNwAAIAFBkfkAaiAFKQEiNwAAIAFBifkAaiAFKQEaNwAAIAFBgfkAaiAFKQESNwAAIAFB+fgAaiAFKQEKNwAAIAEgBSkBAjcA8XggASAFKQFCNwCxeSABQbn5AGogBSkBSjcAACABQcH5AGogBSkBUjcAACABQcn5AGogBSkBWjcAACABQdH5AGogBSkBYjcAACABQdn5AGogBSkBajcAACABQeH5AGogBSkBcjcAACABQen5AGogBSkBejcAACABIAUpAYIBNwHyeSABQfr5AGogBSkBigE3AQAgAUGC+gBqIAUpAZIBNwEAIARFDQAgAUHx+ABqIQggA0EBcSEGQQAhAiAEQQFHBEAgA0H+AHEhC0EAIQMDQCACIAhqIgQtAABBDnFBCk8EQCAEQQA6AAALIARBAWoiBC0AAEEOcUEKTwRAIARBADoAAAsgAkECaiECIANBAmoiAyALRw0ACwsgBkUNACACIAhqIgItAABBDnFBCkkNACACQQA6AAALQQAhAiAHQQAQ2QEhAyAHQQEQ2QEhCCAHQQIQ2QEgB0EDENkBIAdBBBDZASAHQQUQ2QEgB0EGENkBIAdBBxDZASAHQQgQ2QEgB0EJENkBcnJycnJyciEHIAEtAOzcB0EKcCEEAn9BACABKAIMIgtFDQAaQQAgDCAEQQF0ai4BACIMQQBIDQAaIA8gBEEBdGovAQAhAiABKAIUIAxBDXRBkOAlaiALEQUACyEEIAcgCHIhCCAKKAIQIAooAgwgCigCFBDPAQJAIARFDQAgAkUNACAJIAQgAhC1AUEATg0AIAkQrwELIAooAhAgCigCDCAKKAIUIAFBqJ0IahDbASADIAhyCyECAkAgAS0A7twHRQ0AIAEoAgwiBEUNACABKAIUQYCgNiAEEQUAIgRBACAEEJYBGyERCyAREJcBIAFBqJ0IaiEKIAJBAXFFBEAgAS0A9KEIIQIgAS0AoKEIIQQgAS0AzKAIIQMgAS0A+J8IIQggAS0ApJ8IIQwgAS0A0J4IIQcgAS0A/J0IIQsgAS0AqJ0IIQ8gCRCvASABQYkCOwEgIAFBADoAKCABQQQ7ASQgAUHAjMghNgEYIAFBKDoAHiABQYLaADsBHCABQfgCakEBEJ4BIAFBAToAxgUgAUEBOgDCBSABQQE6AL4FIAFBAToAiwUgAUEBOgCHBSABQQE6AIUFIAFBAToAgwUgAUEBOgCBBSABQQE6AP8EIAFBAToA/QQgAUEhOgCKBCABQQE6AIgEIAFBAToAhAQgAUEBOgCABCABQQE6APwDIAFBAToAYCABQQE6AIoHIAFBAToAhwcgAUEBOgD/BiABQQE6AMgGIAFBAToAwAYgAUGBDjsAiQUgAUKBgoSIkKDAgAE3APwJIAFBxgA6AKkDIAFBhApqQYGChAg2AAAgAUGM2gA7AdgDIAFBIToAywsgAUEAOgCBAyABQcYAOgCMAUEAQQFBAkEDQQRBBUEGQQdBfyACGyAEGyADGyAIGyAMGyAHGyALGyAPG0H/AXEiBEEHTQRAIAkgCiAEQdQAbGoiAiAEIAUgAigCUCACKAIMQYC+kgEgAi8BBCIDQcAMIAMbbkHAACAFEOABQQEQGQsgCUECQQIQrgEgAUHzADoA0AEgAUEtOgDFASABQZzYpdMDNgC4ASABQRA6AM4BIAFBGToAvgEgAUHAGmohCEEAIQMDQCAIIANBAnQiBEGQ2wBqLAAAQShsaiICEKYBIAJB5AA6AAMgAkGBf0EBIARBk9sAai0AABs6AAIgAkH/AEHkACAEQZLbAGotAAAbOgABIAIgBEGR2wBqLQAAOgAAIANBAWoiA0EPRw0ACyABQSA6AP4BIAFBADoA8AEgAUEeOgCPAiABQS06AO4BIAFB0DFqEKYBIAFBubSFoAY2ANAxIAFB0DZqEKYBIAFBt6CFoAY2ANA2IAFB2jFqEKYBIAFBvLSFoAY2ANoxIAFB2jZqEKYBIAFBu6CFoAY2ANo2IAFB5DFqEKYBIAFBwLSFoAY2AOQxIAFB5DZqEKYBIAFBDToAoAIgAUG+oIWgBjYA5DYgCUEEQQ0QpAEgAUE8OgC/AiABQSM6AJ4CIAFBIDoArgIgAUGQwwBqEKYBIAFBxaqFoAY2AJBDIAFBsMQAahCmASABQciqhaAGNgCwRCABQfDGAGoQpgEgAUHMqoXgAzYA8EYgAUGQyABqEKYBIAFByqqFoAY2AJBIIAFBsMkAahCmASABQciqhaAGNgCwSSABQfDLAGoQpgEgAUECOgDQAiABQcyqheADNgDwSyAJQQVBAhCkASABQcYAOgDvAiABQQA6AM4CIAFBwAA6AN4CIAFBwNYAahCmASABQbmWgaIGNgDAViABQcrWAGoQpgEgAUG8loGiBjYAylYgAUHU1gBqEKYBIAFCADcB9HkgAUH8+QBqQgA3AQAgAUGC+gBqQgA3AQAgAUEaOgDMAiABQSQ6AJwCIAFBIDoA7AEgAUHCADoAvAEgAUHUADoAXCABQcCWgaIGNgDUViABQcYAOgAtIAFBAToAiJ0IIAFBATsB8nkgAUGBAjsAiZ0IIAEgADYCjJ0IIAFBgfAAOwH4eSABQYECOwH+eSABQYH0ADsBhHoLIAEgAS0A7NwHQQpwIgI6AOifASABIAI6AOzcByABIAI6ANWKASASEMABIBIgAS8BGBC/ASABLQDl3AchBCAFQQxqIgJBADYCACAFQgA3AgQgBUEAOwECIAUgBDoAASAFQSI6AAAgDSAFEC4gAS8B5twHIQQgAS0A6NwHIQMgAkEANgIAIAVCADcCBCAFIAM6AAMgBSAEOwABIAVBIToAACANIAUQLiABLQDp3AchBCACQQA2AgAgBUIANwIEIAVBADsBAiAFIAQ6AAEgBUEfOgAAIA0gBRAuIAFBmKMIaiEIQQAhAwNAIAggA0HQAGxqQQBB0AAQvgIiAkH//wM7AAkgCiADQdQAbGoiBC0AAARAIAIgBCgCUDYCACACIAQoAgw2AgQgAiAELwEEOwEMIAIgBC0ABjoADiACIAQtAAM6AAsgAiAELQACOgAIIAIgBCkCEDcCECACIAQpAhg3AhggAiAEKQIgNwIgIAIgBCkCKDcCKCACIAQpAjA3AjAgAiAEKQI4NwI4IAJBQGsgBEFAaykCADcCACACIAQpAkg3AkgLIANBAWoiA0EIRw0ACyAFQgA3AwggBUIANwMAIAUgCDYCBCAFQRY6AAAgDSAFEC4gASAANgLM9wggAUEAOwHY8AggAUGArAI2AsjwCCABQQE6AMLwCCAFQcABaiQAQdit4ABBAToAACAQQSBqJAALmgcBAn9B2K3gAC0AAARAAkBBiOXfACACNgIAAkAgAEENTQRAQQEgAHQhAwJAIABBCEYNACABRQ0AQZzY3wBBCBBVRQ0AQdTe3wBBAToAAEHS3t8AQdLe3wAvAQAgA3I7AQBB2OLfAEHY4t8ALwEAIANBf3NxOwEACwJAAkAgAEENRw0AIAFFDQBBDUHQD0EAAn9BAEGY3t8ALQAAQQRHDQAaQQBBmd7fAC0AAEEIRw0AGkGa3t8ALQAARQtBnNjfAEEIEFUEf0EABUHA7dYAEIcBC3JBAXEbEFQMAQsgAEEGRw0AIAFFDQBBBkHQD0HQD0EAQZje3wAtAAAiBEEIRhsgBEEERhsQVAsCQAJAQdbj3wAtAAAiBEUNACAAQdnj3wAtAABHDQAgAQRAQeDj3wAgAjYCAEHa498AQQE6AAAMAgtB1uPfAEEAOgAAQdzj3wBB3OPfAC8BACADcjsBAEHA7dYAIARBBkYEf0HA7dYAQQEQJUHX1wAFQbXIAAsQDQwDCyABRQ0CC0EAIQMCQCAAQQ1LDQAgAEEEdEGc2N8AaiIELQAADQADQAJAIAAgA0YNACADQQR0QZzY3wBqIgEtAABFDQAgAUEBOgACIAEtAAENACABLQAGDQAgAS0ABEUNACABLQAFRQ0AIAFBAToAAUGA2t8AKAIAIANBA0H82d8AKAIAEQEACyADQQFqIgNBDkcNAAsgBCACNgIMIARBATYCACAELQAGRQ0AQYDa3wAoAgAgAEEAQfzZ3wAoAgARAQALCwwBCwJAIABBDUsNACAAQQR0QZzY3wBqIgEtAABFDQAgAUEAOgAAIAEtAAYEQEGA2t8AKAIAIABBAUH82d8AKAIAEQEAIAEtAAdFDQEgAS0AAg0BIAEtAAMNASACIAEoAgxrQasCSw0BQYDa3wAoAgAgAEECQfzZ3wAoAgARAQAMAQsgAS0AAw0AIAEtAAEEQEGA2t8AKAIAIABBBEH82d8AKAIAEQEADAELIAEtAAINAAJAIAEtAARFDQAgAS8BCCACIAEoAgxrSw0AQYDa3wAoAgAgAEEDQfzZ3wAoAgARAQBBgNrfACgCACAAQQRB/NnfACgCABEBAAwBC0GA2t8AKAIAIABBAkH82d8AKAIAEQEAC0HS3t8AIANBf3MiAEHS3t8ALwEAcTsBAEHY4t8AQdji3wAvAQAgAHE7AQBB3OPfAEHc498ALwEAIABxOwEACwsLhmEBDX9B2K3gAC0AAARAIAEhAyMAQaABayIFJABBiOXfACACNgIAAkAgAEEaSw0AIABBwO3WAGoiCEGw8QhqIQYgCC0AsPEIIQcCQCADBEAgB0H/AXENAiAGQQE6AAAQVkGc2N8AQQgQVUUNAUHU3t8AQQE6AAAMAQsgB0H/AXFFDQEgBkEAOgAAC0GY3t8ALQAARQ0AQdvj3wAgAEGAAXIiBzoAAAJAQdbj3wAtAABFDQACQEHZ498ALQAAIAdGBEAgA0UNAUHg498AIAI2AgBB2uPfAEEBOgAADAMLIANFDQFB1uPfAEEAOgAAQcDt1gBBtcgAEA0MAgtB1uPfAC0AACECQdbj3wBBADoAAEHA7dYAIAJBBkYEf0HA7dYAQQEQJUHX1wAFQbXIAAsQDQsgABDyASEEIAAQ8wEhASADRQRAIAgtALfyCARAIAhBt/IIaiEDQQAhAiAILQDS8ggiB0ECTwRAA0BBwO3WAEECIAcgAEECdEGL398AaiACai0AAEEAEAYgAkEBaiICIAMtAAAiCUkNAAsgCUUhAgsgCEHt8ghqIQ4CQCAILADt8ggiCUEASA0AIAdBAkkNACAILACI8whBAEgNAEHg99cAKAIAIABBAnRBwO3WAGooAqTzCGsiBiAGIAdBMGxBwO3WAGotAG1BBnBB/P8Aai0AACIKbiIGIApsayIMQQN0IApLBEAgDEHkAGxB/P8DcSAKbiILQQAgC0HZAE0bIQsgBkEBaiEGCyAGQQBMBEBBCkHjACAMQeQAbEH8/wNxIApuIgYgBkHjAE8bIgsgC0EKTRtBACAGQdkATRshC0EBIQYLQd7i3wAtAABFBEAgCUH//wNxQYADIApuIgpuQQFqQf//A3EgCmwiCiAJayAGIAYgCWogCksiChshBkEAIAsgChshCwsgBSAHQYAUbEGA4NYAaiINIAlBKGxqIgovAAg7AYgBIAUgCikAADcDgAEgAg0AQQFBwAAgBiAGQcAAThsiAiACQQFMGyEKQQAhAiAAQQJ0QYvf3wBqIQwDQAJAIAVBgAFqEKcBDQAgBS0AgAEgAiAMai0AAEcNACAFIAs6AIgBIAUgCjoAggEgByAJQQAgBUGAAWoQCQsgAkEBaiICIAMtAAAiBkkNAAsgBSANIAlBKGxqIgIvABI7AYgBIAUgAikACjcDgAEgBkUNAEEAIQIgAEECdEGL398AaiEMA0ACQCAFQYABahCnAQ0AIAUtAIABIAIgDGotAABHDQAgBSALOgCIASAFIAo6AIIBIAcgCUEBIAVBgAFqEAkLIAJBAWoiAiADLQAAIgZJDQALIAUgDSAJQShsaiICLwAcOwGIASAFIAIpABQ3A4ABIAZFDQBBACECIABBAnRBi9/fAGohDANAAkAgBUGAAWoQpwENACAFLQCAASACIAxqLQAARw0AIAUgCzoAiAEgBSAKOgCCASAHIAlBAiAFQYABahAJCyACQQFqIgIgAy0AACIGSQ0ACyAFIA0gCUEobGoiAi8AJjsBiAEgBSACKQAeNwOAASAGRQ0AQQAhAiAAQQJ0QYvf3wBqIQYDQAJAIAVBgAFqEKcBDQAgBS0AgAEgAiAGai0AAEcNACAFIAs6AIgBIAUgCjoAggEgByAJQQMgBUGAAWoQCQsgAkEBaiICIAMtAABJDQALCyADQQA6AAAgDkH/AToAAAtBsOjfACwAACAARgRAQcDt1gBBDkH/AUEAQQAQBkGw6N8AQf8BOgAACyAIQfz0CGohAiAAQQJ0QcDt1gBqIgNBkPQIaiEHQYjl3wAoAgAgAygCkPQIayEDAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAgtAPz0CEEBaw4OAA4PAQULDwsGBwgCAwQPCwJAAkAgAEGX498ALAAAIgNHDQBBmePfAC0AAEUNAEHA7dYAQQBBD0Ga498ALQAAQQFxEAtBwO3WAEEBQQ9BmuPfAC0AAEEBdkEBcRALQcDt1gBBAkEPQZrj3wAtAABBAnZBAXEQC0HA7dYAQQNBD0Ga498ALQAAQQN2QQFxEAtBwO3WAEEEQQ9BmuPfAC0AAEEEdkEBcRALQcDt1gBBBUEPQZrj3wAtAABBBXZBAXEQC0H/ASEDQZfj3wBB/wE6AABBmePfAEEAOgAADAELIAFBBUsNACABEHdBl+PfAC0AACEDCyAAIAPARw0OQZfj3wBB/wE6AAAMDgsgAUEGayIAQQNLDQcgAEEGbEHA7dYAai0A8nlBAXFFDQojAEEwayIDJABBqePfACAAOgAAQbHj3wBBAToAAEHA7dYAQRMgAEEAQQAQBkGmIUH5DkHc99cALQAAGxCaASEBIAMgAEHBAGo2AgAgA0EQakEYIAEgAxDgAkHA7dYAIANBEGoQDSADQTBqJAAMCwsgBEEKSA0MQb7e3wAtAAAgBEEJa0cNDEGe3t8AQQA6AABBvt7fAEEAOgAAQb/e3wAtAAANDEHA7dYAIARBCmsiACAAQcDt1gBqLQDk8AgQJgwMC0HA3t8AQcDe3wAtAABBfnEiAEECcyAAIANBrAJJGyIAOgAAQcDt1gBB8iBB9jYgAEH+AXEbEA0MCwsCQEGa3t8ALQAAQQxHDQBB2t7fAC0AAA0AQZre3wBBADoAAAwLCyADQasCSw0KQZve3wAtAAAiAEHA7dYAaiIDIAMtAOzwCEEPcUEIcyIDOgDs8AhBwO3WAEG4zwBB1tAAIANBCEkiAxtBqM8AQcXQACADGyAAQQFGGxANDAoLIAFBCEgNCUGm498AQabj3wAtAABBfiABQQhrd3EiADoAAEHA7dYAQRkgAEH/AXFBAEEAEAYMCQsgAEGVm98ALAAARw0IQcDt1gBBLkEAQa3e3wAtAABBD3FBABAGQZWb3wBB/wE6AAAMCAsgAEGVm98ALAAARw0HQcDt1gBBGkEAQQBBABAGQZWb3wBB/wE6AAAMBwsgAUEDSw0BQeTi3wBB5OLfAC0AAEF+IAF3cToAAAsgAkEAOgAAIAdBADYCAAwHCyABQQdrIgBBA0sNBEHk4t8AQeTi3wAtAABBfiAAd3E6AAAMBAtB2t7fAC0AAEUNAyADQawCSQ0DQcDt1gAQeAwDCyMAQTBrIgMkACAAQQZsQcDt1gBqIgFB8/kAakHY7dYAIANBLGoQwgE6AAAgAygCLCEGIAFB8vkAakEBOgAAIAFB9PkAaiAGNgEAQcqK3wBBAToAAEHMit8AQYjl3wAoAgA2AgBB9scAEJoBIQEgAyAAQcEAajYCACADQRBqQRggASADEOACQcDt1gAgA0EQahANIANBMGokAAsgAkEAOgAAIAdBADYCAAwCC0HA7dYAQQ9BAEEAQQAQBkG83t8AQQA6AAALIAJBADoAACAHQQA2AgAgAUEGayIAQQNLDQELQajj3wBBqOPfAC0AAEF+IAB3cSIAOgAAIABB/wFxDQBBwt7fAEEAOgAACyAEQQBIDQFBfiAEdyEAQaDj3wAvAQAiAiAEdkEBcQRAQaDj3wAgACACcTsBAEHA7dYAQSVBm97fAC0AACAEQf8BcUEAQQAQBwtBnOPfAEGc498ALwEAIABxIgI7AQAgAkH//wNxRQRAQZ7j3wBBADoAAAtBjOPfAEGM498ALwEAIABxOwEAIARB5d7fACwAAEcNAQJAQeTe3wAsAAAiAEEASA0AQefe3wAtAABFDQBB6N7fAC0AAA0AQebe3wAtAAANAAJAQZve3wAtAAAiAkEBTQRAQcDt1gBBBCACIAJBwO3WAGotAOzwCEEPcSAAQf8BcUEAEAcMAQsgBUGAAWoQpgEgAiAAQQAgBUGAAWoQCSACIABBASAFQYABahAJIAIgAEECIAVBgAFqEAkgAiAAQQMgBUGAAWoQCQtBwO3WABAKC0Ho3t8AQQA6AABB5N7fAEH/AToAAEHl3t8AQf8BOwAADAELAkACQEGa3t8ALQAAIgMEQEGb3t8ALQAAIQICQAJAAkACQAJAAkACQAJAAkACQAJAAkAgA0EBaw4NAAEGAgMFCAkHCgsEBA8LIAAgBCABEHkMDgsgBEEATgRAIAIgBEGn498ALQAAQQR0akEBahB6DA4LIAFBCkYEQEGn498AQafj3wAtAABBAWpBA3E6AABBng0QmgEhACAFQafj3wAtAABBBHQiAkEQajYCBCAFIAJBAXI2AgAgBUGAAWpBGCAAIAUQ4AJBwO3WACAFQYABahANDA4LIAFBBmtBA00EQCACIAFBBWtBgAMgAkEwbEHA7dYAai0AbUEGcEH8/wBqLQAAbmwQegwOCyABQQVKDQ1BwO3WACACQRUgARALIAFBAnRBkIABaigCACEAQf0JEJoBIQMgBSAANgIUIAUgAkEBajYCECAFQYABakEYIAMgBUEQahDgAkHA7dYAIAVBgAFqEA0MDQsgBEEATgRAQZze3wAtAAAhAEHA7dYAIAIQGiAAQQR0IARqIQcgAkECTwRAIAcgAkEwbEHA7dYAai0Abk8NDgJ/IAJBgBRsQYDg1gBqIgMgB0EobGoiABCnAQRAIAVBgAFqIQhBAAwBCyAFQYABakEEciEIIAVBADYCgAFBAQshBiAAQQpqEKcBRQRAIAhBATYCACAGQQFqIQYLIAMgB0EobGoiAEEUahCnAUUEQCAFQYABaiAGQQJ0ckECNgIAIAZBAWohBgsCQAJAAkAgAEEeahCnAUUEQCAFQYABaiAGQQJ0akEDNgIAIAZBAWohBgwBCyAGRQ0BC0EAIQAgAyAHQShsaiEJA0AgBSAJIAVBgAFqIABBAnRqKAIAIgNBCmxqIggvAAg7AWggBSAIKQAANwNgIAVBMkHkAEH/ACAFLQBhIghBM0kbIAhB/gBLGzoAYSACIAcgAyAFQeAAahAJIABBAWoiACAGRw0ACwwBCyAFQeAAahCmASACQcDt1gBqLQC/9QghACAFQf8AOgBhIAUgADoAYCACIAdBACAFQeAAahAJC0HA7dYAEAoMDgsgByACQYQLbEG48NYAaiIDQZve3wAtAABBwO3WAGotAOzwCEEPcSIAQQN0ai0AAE8NDUHA7dYAQQQgAiAAIAcgAyAAQQZ0aiAHai0AhAEiA0ECc0EDIANBAXEbEAdBwO3WABAKDA0LIAFBfnFBCEcNDEEBQX8gAUEJRhsQewwMCyAEQQBOBEBBnN7fAC0AACEAQcDt1gAgAhAaIABBBHQgBGohByACQQJPBEAgByACQTBsQcDt1gBqLQBuTw0NAn8gAkGAFGxBgODWAGoiAyAHQShsaiIAEKcBBEAgBUGAAWohCEEADAELIAVBgAFqQQRyIQggBUEANgKAAUEBCyEGIABBCmoQpwFFBEAgCEEBNgIAIAZBAWohBgsgAyAHQShsaiIAQRRqEKcBRQRAIAVBgAFqIAZBAnRyQQI2AgAgBkEBaiEGCwJAIABBHmoQpwFFBEAgBUGAAWogBkECdGpBAzYCACAGQQFqIQYMAQsgBkUNDgtBACEAIAMgB0EobGohCQNAIAUgCSAFQYABaiAAQQJ0aigCACIDQQpsaiIILwAIOwFoIAUgCCkAADcDYCAFIAUtAGJBgAFzOgBiIAIgByADIAVB4ABqEAkgAEEBaiIAIAZHDQALQcDt1gAQCgwNCyAHIAJBhAtsQbjw1gBqIgNBm97fAC0AAEHA7dYAai0A7PAIQQ9xIgBBA3RqLQAATw0MQcDt1gBBBCACIAAgB0EAIAMgAEEGdGogB2otAIQBIgNBASADQQFxGyIDQQxxQQRqIANBEHEbIANB4wFxchAHQcDt1gAQCgwMCyABQX5xQQhHDQtBAUF/IAFBCUYbEHsMCwsgAUEKRgRAQdre3wAtAABFDQtBwO3WABB4DAsLIARBAE4EQCADQQ1GBEBBnN7fAC0AACEAQcDt1gAgAhAaIABBBHQgBGohByACQQJPBEAgByACQTBsQcDt1gBqLQBuTw0NAn8gAkGAFGxBgODWAGoiACAHQShsaiIDEKcBBEAgBUGAAWohCEEADAELIAVBgAFqQQRyIQggBUEANgKAAUEBCyEGIANBCmoQpwFFBEAgCEEBNgIAIAZBAWohBgsgACAHQShsaiIDQRRqEKcBRQRAIAVBgAFqIAZBAnRyQQI2AgAgBkEBaiEGCyADQR5qEKcBRQRAIAVBgAFqIAZBAnRqQQM2AgAgBkEBaiEGDA0LIAYNDEHA7dYAQeMhEA0MDQsgByACQYQLbEG48NYAaiIDQZve3wAtAABBwO3WAGotAOzwCEEPcSIAQQN0ai0AAE8NDEHA7dYAQQQgAiAAIAcCf0EhIAMgAEEGdGogB2otAIQBIgNBAXFFDQAaQQAgA0HgAHFBIEYNABogA0GfAXFBIHILEAdBwO3WABAKDAwLIAJBAUsNCyMAQTBrIgAkAEHA7dYAQQcgAkEAQQBBASAEdCIDIAJBhAtsQbjw1gBqIAJBgBRsQYDg1gBqIAJBAkkbLwGAAXNB//8DcSIBEAdBwO3WABAKQcDt1gAgAiAEEBEQmQEhAiAAQao5QZAZIAEgA3EbEJkBNgIEIAAgAjYCACAAQRBqQRhBkQkgABDgAkHA7dYAIABBEGoQDSAAQTBqJAAMCwsgA0ENRgRAIAFBfnFBCEcNC0EBQX8gAUEJRhsQewwLCyABQQdLDQogAkEBSw0KIAJBwO3WAGoiAyABIAMtAOzwCEEIcXIiAzoA7PAIIAJBAUYEQCAAQcDt1gBqQQk6APz0CEGt3t8AIAM6AABBlZvfACAAOgAAQcDt1gBBLkEBIANB/wFxQb3e3wAtAAAEf0H/AEHuAEEAEPUBQfDe3wBqLQAAGwVB7gALEAYCQEG53t8ALQAARQ0AQdz31wAtAABFDQBBASADEIEBCwwLCyAFIAM6AIABIAAgAiAFQYABakEBQeQAQQAQfAwKCyAEQQBOBEBBwO3WAEEOIARB/wFxQQBBABAGQbDo3wAgADoAAAwKCyABQQVKDQkgARB3DAkLIAFBAE4EQAJAAkACQAJAIAEOAwABAgMLQb6b3wAgAkGEC2xBuPDWAGogAkGAFGxBgODWAGogAkECSCIAG0GEC0GAFCAAGxC8AhpB5q/fACACQTBsQcDt1gBqIgApAYABNwEAQd6v3wAgACkBeDcBAEHWr98AIAApAXA3AQBBzq/fACAAKQFoNwEAQcav3wAgACkBYDcBAEG+r98AIAApAVg3AQBBl7DfACACOgAAQZaw3wBBAjoAAEHY5N8AQY3JACkAADcAAEHd5N8AQZLJACkAADcAAEH45N8AQYjl3wAoAgBB3AtqNgIADAwLIwBBEGsiACQAAkACQAJAQZaw3wAtAABBAkcNACACQQFKIgNBl7DfAC0AAEECSUYNACADQdWv3wAtAABBAEdGDQELQebk3wBB4TspAAA3AABB4OTfAEHbOykAADcAAEHY5N8AQdM7KQAANwAAQYjl3wAoAgAhAgwBC0GYsN8AIAJBhAtsQbjw1gBqIAJBgBRsQYDg1gBqIAJBAkgiAxtBhAtBgBQgAxsQvAIaQZnY3wBB/wE6AABBmNjfACACOgAAIABCADcDCCAAQgA3AwAgAEG+m98ANgIEIAAgAjoAASAAQQs6AABBzOfXACAAEC5ByIrfAEEBOgAAQdjk3wBBrMcAKQAANwAAQd3k3wBBsccAKQAANwAAQcyK3wBBiOXfACgCACICNgIAC0H45N8AIAJB3AtqNgIAIABBEGokAAwLC0HA7dYAIAIQKQwKC0GY3t8ALQAAIQACQCABQQNHDQAgAkEBRw0AQQAhAUEAIQgjAEEwayIEJABBwO3WAEEBEBpBzPjXAC0AAEEEdCEOA0AgAUGatNgAaiwAACIGQYd/cUUgAUGKtNgAai0AACIJQf8BRnFFBEBBfyECIAlB/wFGIgsgBkEATnEhDCABIA5qIQpBACEHQQAhAwNAAkAgCiADQQN0Qbz71gBqLQAAIgBBECAAG3AiDSADQQZ0QcD81gBqai0AACIAQQFxRQ0AIAAgByACQQBIIgAbIQcgAyACIAAbIQIgDA0AQcDt1gBBBEEBIAMgDUEAEAcLIANBAWoiA0EQRw0ACyACIAZyQQBIBH8gAkF/c0EfdgVBwO3WAEEEQQEgAiAJIAsbIgBB/wFxIAogAEEDdEG8+9YAai0AACIAQRAgABtwIAdB4gBxQQEgBkEHcSIAQQJ0QQFyIABBAWtBA08bchAHQQELIAhqIQgLIAFBAWoiAUEQRw0AC0HA7dYAEApBzxoQmgEhAyAEIAg2AgAgBEEQakEeIAMgBBDgAkHA7dYAIARBEGoQDSAEQTBqJAAMCgsgAUEFRgRAQcDt1gAQJwwKCyAAQQFrIQACQCABQQZrIgNBA0sNACAAQf8BcUECSw0AIwBBMGsiACQAIANBBmxBwO3WAGoiAkEANgHyeSACQfb5AGpBADsBAEHKit8AQQE6AABBzIrfAEGI5d8AKAIANgIAQYbIABCaASECIAAgA0HBAGo2AgAgAEEQakEYIAIgABDgAkHA7dYAIABBEGoQDSAAQTBqJAAMCgsgAUEGRgRAQcDt1gAQKAwKCyABQf7///8HcUEIRw0JIAJBAkkNCSAAQf8BcUEDSQ0JQQFBfyABQQlGGxB7DAkLQdz31wAtAAAhACACQQFNBEAgAEH/AXEEQEGc498AQZzj3wAvAQAiAAR/IAAFQcDt1gAgAhAaQZzj3wAvAQALQQEgBHRyOwEADAoLQcDt1gAgAhAaIAJBhAtsQbzx1gBqIARBBnRqIQMgBEH/AXEhCEEAIQADQCAAIANqLQAABEBBwO3WAEEEIAIgCCAAQQAQBwsgAEEBaiIAQcAARw0AC0HA7dYAEApB4McAEJoBIQAgBUHA7dYAIAIgBBAREJkBNgIgIAVBgAFqQRggACAFQSBqEOACQcDt1gAgBUGAAWoQDQwJCyAAQf8BcQRAQZ7j3wAtAABFBEBBwO3WACACEBoLQZ7j3wBBAToAAEGc498AQZzj3wAvAQBBASAEdHI7AQAMCQtBnN7fAC0AACEAQcDt1gAgAhAaIAVBgAFqEKYBIAIgAEEEdCAEaiIAQQAgBUGAAWoQCSACIABBASAFQYABahAJIAIgAEECIAVBgAFqEAkgAiAAQQMgBUGAAWoQCUHA7dYAEAoMCAsgBEEATgRAQaDj3wBBoOPfAC8BAEEBIAR0cjsBACACQcDt1gBqIAQ6AOzwCEHA7dYAQSUgAiAEQf8BcUEBQZ/j3wAtAABBBnBBhghqLQAAEAcMCAsgAUEFTQRAIAEQfQwICyABQX5xQQZGBEBBouPfAEEBQQIgAUEGRhsiAEEAIABBouPfAC0AAEcbOgAAEH4MCAsgAUEKRw0HQcDt1gBBD0EBQQBBABAGQbze3wBBAToAACAIQQI6APz0CAwHCyAEQQBOBEAgACAEEH8MBwsgAUEDSg0GQeTi3wBB5OLfAC0AAEEBIAF0cjoAACAIQQs6APz0CAwGCyAFQf8AIABBuN7fACwAAEEMbGpBdEEAIAJBMGxBwO3WAGotAG9B/gFxQQJGG2pBNWoiAyADQf8AThsiA0EAIANBAEobOgCAASAAIAIgBUGAAWpBAUHpAEEAEHwMBQsgBEEJSw0EQdz31wAtAAAEQEHA7dYAQfcPEA0MBQsgBEGV+NcALQAARg0CAn9BBUEEQQNBAkEBQQBBf0EAEPUBQfDe3wBqLQAAG0EBEPUBQfDe3wBqLQAAG0ECEPUBQfDe3wBqLQAAG0EDEPUBQfDe3wBqLQAAG0EEEPUBQfDe3wBqLQAAG0EFEPUBQfDe3wBqLQAAGyIAQQBOBEBBs80AEJoBIQIgAAwBC0GezQAQmgEhAkGV+NcALQAACyEDIAUgBEEBaiIINgJEIAUgA0EBajYCQCAFQYABakEeIAIgBUFAaxDgAkHxzAAQmgEhAiAFIAg2AjAgBUHgAGpBHiACIAVBMGoQ4AJBgMneACAEENkBBEBBwO3WAEECQQEgAEEAThsgBCAAIAVBgAFqIAVB4ABqEA8MBQsgAEEATgRAQcDt1gBBCyAAQQR0IARyECBBwO3WAEGNyQAQDQwFC0HA7dYAQQogBBAgQcDt1gBB/sgAEA0MBAtBEiAAQRFqEAxBsgsQmgEhAiAFIABBB2s2AlAgBUGAAWpBGCACIAVB0ABqEOACQcDt1gAgBUGAAWoQDQwDCwJAAkACQAJAQZje3wAtAABBAWsOBAAAAQIDC0G93t8ALQAABEAjAEEQayIDJAACQEGb3t8ALQAAIgJBAk8EQCAAIAQgARCAAQwBCyAEQQBOBEAgAkHA7dYAaiAEOgDs8AggAkEBRgRAIABBwO3WAGpBCToA/PQIQa3e3wAgBDoAAEGVm98AIAA6AABBwO3WAEEuQQEgBEH/AXFBvd7fAC0AAAR/Qf8AQe4AQQAQ9QFB8N7fAGotAAAbBUHuAAsQBkG53t8ALQAARQ0CQdz31wAtAABFDQJBASAEEIEBDAILIAMgBDoADyAAIAIgA0EPakEBQf8AQe4AQQAQ9QFB8N7fAGotAAAbQQAQfAwBCyABDQAgAEHA7dYAakEPOgD89AgLIANBEGokAAwGCyAAIAQgARB5DAULQave3wAtAABBA0YEQCMAQUBqIgIkAAJAIARBCU0EQEGw5tcALQAAIgFBwABPBEBBwO3WAEGPLRANDAILIAFBwO3WAGoiAEEBOgCxeSAAIAQ6APF4QdDj3wAgAToAAEGw5tcAIAFBAWo6AABByorfAEEBOgAAQcyK3wBBiOXfACgCADYCAAwBCyABQQZrIgNBA00EQEGw5tcALQAAIgRFBEBBwO3WAEGkExANDAILQdDj3wAtAAAgBHBBwO3WAGoiBCADQQR0QRBqQQAgAUEFayIAIAQtAPF4IgRBBHYiA0cbIARBD3FyOgDxeEHKit8AQQE6AABBzIrfAEGI5d8AKAIANgIAAkAgACADRgRAQcA9EJoBIQQgAkHQ498ALQAAQQFqNgIAIAJBIGpBGCAEIAIQ4AIMAQtB7w4QmgEhBEHQ498ALQAAIQAgAiABQTtqNgIUIAIgAEEBajYCECACQSBqQRggBCACQRBqEOACC0HA7dYAIAJBIGoQDQwBCyABQQpGBEBBsObXAC0AACIDRQ0BIANB0OPfAC0AACIAQQFqIgFLBEAgA0ECayEGAkAgACADa0EBcQRAIAEhBCAAIQEMAQsgAEGx5tcAaiABQbHm1wBqLQAAOgAAIABB8ebXAGogAUHx5tcAai0AADoAACAAQQJqIQQLIAAgBkcEQANAIAFBsebXAGogBEGx5tcAaiIALQAAOgAAIAFB8ebXAGogBEHx5tcAaiIGLQAAOgAAIAAgBEEBaiIBQbHm1wBqLQAAOgAAIAYgAUHx5tcAai0AADoAACAEQQJqIgQgA0cNAAsLQdDj3wAtAAAhAAtBsObXACADQQFrIgQ6AAACQCAAQf8BcSIBIARB/wFxSQ0AIAFFDQBB0OPfACAAQQFrOgAAC0HKit8AQQE6AABBzIrfAEGI5d8AKAIANgIADAELIAAgBCABEHkLIAJBQGskAAwFCyAAIAQgARB5DAQLIwBB8ABrIgMkAEGb3t8ALQAAIQICQAJAAkACQAJAAkACQAJAAkACQAJAAkACQEGZ3t8ALQAADg4ABQUFBQUCBQUFBQEDBAULIARBAE4EQEGc3t8ALQAAQQR0IARqIQFB5d7fACwAAEEATgRAIAJBAkkNDUHk3t8ALAAAIgRBAEgNDSABIARMDQ0gA0E4aiIGIAJBgBRsQYDg1gBqIgcgBEEobGoiAC8ACDsBACADIAApAAA3AzAgASAEa0EBaiEBIANBMGoQpwFFBEAgA0EAOgA4IAMgAToAMiACIARBACADQTBqEAkLIAYgAC8AEjsBACADIAApAAo3AzAgA0EwahCnAUUEQCADQQA6ADggAyABOgAyIAIgBEEBIANBMGoQCQsgA0E4aiIGIAcgBEEobGoiAC8AHDsBACADIAApABQ3AzAgA0EwahCnAUUEQCADQQA6ADggAyABOgAyIAIgBEECIANBMGoQCQsgBiAALwAmOwEAIAMgACkAHjcDMCADQTBqEKcBRQRAIANBADoAOCADIAE6ADIgAiAEQQMgA0EwahAJC0Hm3t8AQQE6AABBwO3WABAKQbsaEJoBIQQgAyABNgIAIANBMGpBGCAEIAMQ4AJBwO3WACADQTBqEA0MDQtB2O3WACACIAJBAU0EfyACQcDt1gBqLQDs8AhBD3EFQX8LEKgBIAFMBEBBwO3WAEH+MhANDA0LQcDt1gAgAhAaQeTe3wAgAToAAEHl3t8AIAQ6AABB6N7fAEEAOwEAQebe3wBBADoAAEHs3t8AQYjl3wAoAgA2AgAgAkEBTQRAQefe3wAgAkGEC2xBwO3WAGpBm97fAC0AAEHA7dYAai0A7PAIQQ9xIgBBBnRqIAFqLQD8A0EBcSIEOgAAIAQNDUHA7dYAQQQgAiAAIAFB/wFxQQEQB0HA7dYAEAoMDQsgAkGAFGxBwO3WAGogAUEobGoiBEHADWsQpwEhACAEQbYNaxCnASEGIARBrA1rEKcBIQcgBEGiDWsQpwFFBEBB597fAEEBOgAADA0LQefe3wAgB0EBcyAAQQFzQQFBAiAAGyAGG2oiBEEARzoAACAEDQwgA0EwahCmASADIAJBwO3WAGotAL/1CDoAMCACIAFBACADQTBqEAlBwO3WABAKDAwLIAFBfnFBCEYEQEEBQX8gAUEJRhsQewwMCyACQQFNBEAgACABEIIBDAwLIAFBB0wEQEHA7dYAIAIgA0HcAGoQECEEIAMoAlwgBCABQbje3wAsAABBAkEDIAJBMGxBwO3WAGotAG9B/gFxQQJGG2oQtwEhBkEAIQFB5N7fACwAACIHQQBOBEAgA0EwaiEEQZve3wAtAAAiCUGAFGxBgODWAGoiCCAHQShsaiIAEKcBRQRAIANBADYCMCADQTBqQQRyIQRBASEBCyAAQQpqEKcBRQRAIARBATYCACABQQFqIQELIAggB0EobGoiBEEUahCnAUUEQCADQTBqIAFBAnRyQQI2AgAgAUEBaiEBCwJ/AkAgBEEeahCnAUUEQCADQTBqIAFBAnRqQQM2AgBB5t7fAEEBOgAAIAFBAWohAQwBC0Hm3t8AQQE6AABBASABRQ0BGgtBACEEIAggB0EobGohAANAAkAgBiAAIANBMGogBEECdGooAgAiAkEKbGotAABHDQBB597fAC0AAEUEQEHp3t8ALQAARQ0BCyADQeAAahCmASAJIAcgAiADQeAAahAJQcDt1gAQCgwQCyAEQQFqIgQgAUcNAAtBAAshAkHn3t8ALQAADQdB6d7fAC0AAA0HIAIEQEEAIQEMDAsgAygCMCIEQQBIDQggBCEBDAoLIAMgBjoAMCAAIAIgA0EwakEBQekAQQAQfEG53t8ALQAARQ0MQdz31wAtAABFDQwgAkHe+NcAai0AAA0MIAAgAiADQTBqQQEQgwEMDAtBpOTfAEEAOgAAQdre3wBBAToAAEGa3t8AQQ06AAAgAEHA7dYAakEIOgD89AggAEECdEHA7dYAakGI5d8AKAIANgKQ9AhBwO3WAEEPQQFBAEEAEAZBvN7fAEEBOgAADAsLIARBAE4EQCAAIAQQfwwLCyABQQNKDQpB5OLfAEHk4t8ALQAAQQEgAXRyOgAAIABBwO3WAGpBCzoA/PQIDAoLAkACQEHA7dYAIANBMGoQFSICRQ0AIANBMGpBkZvfAC0AACACb2otAAAiAkEHSw0AIAJB1ABsQcDt1gBqIgYtAKidCA0BCyAEQQBIIAFBA0pxDQpBwO3WAEH1PxANDAoLIARBAE4EQCAGQaidCGooAgwhASAAQcDt1gBqQQo6APz0CEGVm98AIAA6AABBwO3WAEEaQQEgAkEAIAFBDHRBgIB8cSABIARsQQR2chAHDAoLIAFFBEAgAkEAEIQBDAoLIAFBAk0EQCACQRBBCCABQQFGGxCEAQwKCwJAAkAgAUEDaw4IAAsLCwsLCwELC0Gt3t8ALQAAQQ9xIAIQG0G1DhCaASEEQa3e3wAtAAAhASADIAJBAWo2AhAgAyABQQ9xQQFqNgIUIANBMGpBHiAEIANBEGoQ4AJBwO3WACADQTBqEA0MCgtB3s0AEJoBIQQgAyACQQFqNgIgIANBMGpBHiAEIANBIGoQ4AJBwO3WAEEDIAJBACADQTBqQaU8EA8MCQsgBEEASA0IQZ/41wAtAAANCEGh+NcALQAARQ0IQYyu2AAoAgAhASAAQcDt1gBqQQo6APz0CEGVm98AIAA6AABBwO3WAEEaQQFBCEEAIAFBDHRBgIB8cSABIARsQQR2chAHDAgLIARBAE4EQCAAQcDt1gBqQQk6APz0CEGt3t8AIAQ6AABBlZvfACAAOgAAQcDt1gBBLkEBIARB/wFxQb3e3wAtAAAEf0H/AEHuAEEAEPUBQfDe3wBqLQAAGwVB7gALEAZBud7fAC0AAEUNCEHc99cALQAARQ0IQQEgBBCBAQwICwJAAkACQAJAAkAgAQ4EAAECAwQLIwBBMGsiACQAQa6b3wBBrd7fAC0AAEEPcSICQQxsQcDt1gBqIgEpAYAZNwEAQbab3wAgAUGIGWooAQA2AQBBu5vfACACQQN0QcDt1gBqIgItAP0NOgAAQbyb3wAgAi0Agw46AABBupvfAEEBOgAAQdbIABCaASECIABBrd7fAC0AAEEPcUEBajYCACAAQRBqQR4gAiAAEOACQcDt1gAgAEEQahANIABBMGokAAwLCyMAQTBrIgIkAAJAQbqb3wAtAABFBEBBwO3WAEHTOxANDAELQa3e3wAtAABBD3EiAEEMbEHA7dYAaiIBQa6b3wApAQA3AYAZIAFBiBlqQbab3wAoAQA2AQBBwO3WAEEGQQEgAEEBQbub3wAtAAAQB0HA7dYAQQZBASAAQQdBvJvfAC0AABAHQcDt1gAQCkGkDhCaASEAIAJBrd7fAC0AAEEPcUEBajYCACACQRBqQR4gACACEOACQcDt1gAgAkEQahANCyACQTBqJAAMCgsjAEEwayIAJABBrd7fAC0AAEEPcUEMbEHAhtcAahCwAUHA7dYAEApBwg8QmgEhAiAAQa3e3wAtAABBD3FBAWo2AgAgAEEQakEeIAIgABDgAkHA7dYAIABBEGoQDSAAQTBqJAAMCQsjAEFAaiIMJAACQAJAQa3e3wAtAABBD3FBDGxBwO3WAGoiAS0AgBkiAEEHTQRAIABB1ABsQcDt1gBqIgAtAKidCA0BC0HA7dYAQfPKABANDAELIAFBgBlqIQcgAEGonQhqIgAvAQQiAUUEQEHY7dYALwEAIQELIAAoAlAgACgCDEGAn8kAIAFB//8DcW5B/wAgDBDgASEBIAcvAQYiACAHLwEIaiEIAkAgAUEATARAIAAhAgwBCyABQQFxIQ0CQCABQQFGBEBBfyEEIAAhAgwBCyABQf7///8HcSEOQX8hBCAAIQIDQCAMIAlBAnRqIgYoAgQiASAAayAAIAFrIAAgAUkbIgogBigCACIGIABrIAAgBmsgACAGSRsiCyAEIAZBQGsgCEkgBCALS3EiCxsiBCABQUBrIAhJIAQgCktxIgobIQQgASAGIAIgCxsgChshAiAJQQJqIQkgD0ECaiIPIA5HDQALCyANRQ0AIAwgCUECdGooAgAiASACIAFBQGsgCEkbIAIgASAAayAAIAFrIAAgAUkbIARJGyECCyAHIAI7AQYgByAIIAJrOwEIQcDt1gAQCkHA7dYAQccWEA0LIAxBQGskAAwICyABQQhIDQcgAEHA7dYAakEFOgD89AhBpuPfAEGm498ALQAAQQEgAUEIa3RyIgQ6AABBwO3WAEEZIARB/wFxQQBBABAGDAcLAkAgAUEASA0AIAJBAUsNACAAIAEQggEMBwsgACAEIAEQgAEMBgtBfyEBIAggB0EobGohAEEAIQQDQAJAIAQgASAAIARBCmxqEKcBGyEBIARBAksNACAEQQFqIQQgAUEASA0BCwsgAUEATg0BC0HA7dYAQYEkEA0MBAsgAg0BIAMoAjAhBAsgAyAIIAdBKGxqIARBCmxqIgQvAAg7AWggAyAEKQAANwNgDAELIANB4ABqEKYBCyADIAY6AGAgCSAHIAEgA0HgAGoQCUHp3t8AQene3wAtAABBAWo6AAAgCUHA7dYAaiAGOgC/9QhBwO3WABAKCyADQfAAaiQADAMLIAAgBCABEIABDAILQcDt1gBBzygQDQwBC0HkAEH4ACAAIAdBKGxqIgkgBSgCgAFBCmxqLQADIgFB+ABGGyEEQQAhAANAIAUgCSAFQYABaiAAQQJ0aigCACIDQQpsaiIILwAIOwFoIAUgCCkAADcDYCAFIAQ6AGMgAiAHIAMgBUHgAGoQCSAAQQFqIgAgBkcNAAtBwO3WAEGJGUHALSABQfgARhsQDUHA7dYAEAoLIAVBoAFqJAALC89bAQ1/Qdit4AAtAAAEQCMAQbABayIIJABBiOXfACACNgIAAkAgAUUNACAAQQZLDQBBmN7fAC0AAEUNABBWQZzY3wBBCBBVBEBB1N7fAEEBOgAACyAAQQJ0QcDt1gBqIgQoApD7CCEFIAQgAjYCkPsIQe3o3wAgAEEBajoAAEHs6N8AQZx/QeQAIAEgAUHkAE4bIgQgBEGcf0wbIgQ6AABB2+PfAEH+AToAAEHu6N8AIAIgBWsiAkGgBks6AAAgAiAEIARBH3UiBXMgBWtuIQICQEHW498ALQAABEACQCABQQBMDQAgAEEBRw0AQdnj3wAtAABB/gFGDQILQdbj3wBBADoAAEHA7dYAQbXIABANDAELIARBAiACQSNJIAJBEkkbdCEDAkBBvt7fAC0AACICRQ0AQZje3wAtAABBAWtB/wFxQQJLDQBBmt7fAC0AAA0AQb/e3wBBAToAACACQQFrIQICQAJAIABBAWsOBgACAgICAQILIAIgAxCJAQwCCyACIAMQigEMAQsgAEECayECAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkBBmt7fAC0AACIFQQFrDg0AAggDBAgICAUIAQYGBwsCQAJAAkACQCAADgcAAQMDAwMCAwtBm97fAEEFIARBm97fAC0AAGoiAiACQQVOGyICQQAgAkEAShs6AAAMEgsjAEEgayIBJABB2O3WAC8BACEAAkBB7OjfACwAACICBEAgA0EATCACQQBKcw0BC0F/QQEgA0EATBshAgtBwO3WAEEKQQBBAEEAQZADQeASIAAgAmoiAiACQeASThsiAiACQZADTBsiAhAHQcDt1gAQCiABIAJBCm4iAzYCACABIAIgA0EKbGtB//8DcTYCBCABQRRqQQxBjA0gARDgAkHA7dYAQX9BytcAIAFBFGpB4isgAkH/AWxB8JwGa0HQD25Bf0GH/QMQDkGo5N8AQQE6AAAgAUEgaiQADBELIwBBEGsiASQAQYXj3wAsAAAiAEEASARAQZX41wAtAAAhAAsCQEHs6N8ALAAAIgIEQCADQQBMIAJBAEpzDQELQX9BASADQQBMGyECC0GI498AQYjl3wAoAgA2AgBBhePfAEEJIAIgAEH/AXFqIgIgAkEJThsiAkEAIAJBAEobIgI6AAAgASACQQFqNgIAIAFBCGpBCEGXCyABEOACQcDt1gBBf0Ht1wBBhSlB3PfXAC0AABsgAUEIakGo2QBBhePfACwAAEERbEF/Qb/fAxAOIAFBEGokAAwQCyAAQQVLDQ8gAiADEIsBDA8LIAJBAU0EQCACIAMQjAEMDwsCQAJAIABBBGsOAgABEAsgBBCNAQwPCyAEQQxsEI0BDA4LAkACQCAAQQJrDgIAAQ8LQdjt1gBBm97fAC0AACIAQX9BACAAQQFLGxCoASEEAkBB7OjfACwAACICBEAgAUEATCACQQBKcw0BC0F/QQEgAUEATBshAgsgACACIARqEHoMDgtBwO3WAEGb3t8ALQAAIgJBFUEFIAJBMGxBwO3WAGotAG0gBGsiAiACQQVOGyICQQAgAkEAShsiAhALQcDt1gBBAUH1yQAgAkECdEGQgAFqKAIAQajZAEEFIAJrQTNsQX9BARAFEA4MDQsgAg0MQZve3wAtAAAiAkEAQRggAkEwbEHA7dYAai0AcCADQYAVEI4BDAwLIAINC0Gb3t8ALQAAIgJBAkkNCyACQQBBDSACQTBsQcDt1gBqLQBlIANBmMMAEI4BDAsLAkACQAJAAkAgAEECaw4EAAECAw4LIARBn+PfAC0AAGoQfQwNC0Gj498AQQMgBEGj498ALQAAaiICIAJBA04bIgJBACACQQBKGyICOgAAQcDt1gBBAUGSywBBkMsAQd8jQaLj3wAtAAAiAUECRhsgAUEBRhsgAkECdEHQ2QBqKAIAQajZACACQdUAbEF/QQEQBRAOEH4MDAtBpOPfAEEyQcsAIANBpOPfAC0AAGoiAiACQcsAThsiAiACQTJMGyICOgAAIAggAjYCcCAIQaABakEQQY7ZACAIQfAAahDgAkHA7dYAQQJBvDQgCEGgAWpBqNkAQaTj3wAtAABB/wFsQc7jAGtBGW1Bf0ECEAUQDhB+DAsLQaXj3wBBAyAEQaXj3wAtAABqIgIgAkEDThsiAkEAIAJBAEobIgI6AABBwO3WAEEDQbIuIAJBAnRB8NkAaigCAEGo2QAgAkHVAGxBf0EDEAUQDhB+DAoLIAANAEHA7dYAEHhBmt7fAC0AACEFCyAFQf8BcUEGaw4DBQMBBAsgBUEGRiACQQRJcQ0FIAVBB0YNASAFQQhHDQcgAEEGa0F8SQ0HC0GZ3t8ALQAAIQJBmd7fAEEHOgAAIAAgAxCPAUGZ3t8AIAI6AAAMBgsgAEEGa0F8SQ0FC0GZ3t8ALQAAIQJBmd7fAEELOgAAIAAgAxCPAUGZ3t8AIAI6AAAMBAtBmN7fAC0AACEEAkACQAJAAkBBud7fAC0AAARAIARBBEcNAkGZ3t8ALQAADQNBm97fAC0AAEECSQ0BQeTe3wAsAABBAE4NASAAQQZLDQFBASAAdEHDAHFFDQEjAEFAaiIKJABB2O3WAEGb3t8ALQAAIgFBfxCoASELQcHo3wAsAAAiBkEATiAGIAtIcUUEQEHB6N8AQZze3wAtAABBBHQiBiALQQFrIgwgBiAMSBsiBjoAAAsgBsAhBAJAIABFBEACQEHs6N8ALAAAIgYEQCADQQBMIAZBAEpzDQELQX9BASADQQBMGyEGC0HB6N8AIAQgBmoiBiALQQFrIgMgAyAGShtBACAGQQBOGyIGOgAAQZze3wAgBsAiBkEQbToAACAKIAZBAWo2AgAgCkEwakEQQdEOIAoQ4AJBwO3WAEF/QZIkIApBMGpBqNkAQcHo3wAsAABB/wFsQQEgAyALQQFMG21Bf0GK8AMQDgwBC0F/QQEgA0EATCIFGyEMIAFBgBRsQYDg1gBqIARBKGxqIQJBACEGQQAhAwNAIAogAiAGQQpsaiILLwAIOwE4IAogCykAADcDMCAKQTBqEKcBRQRAAkAgAEEBRgRAIApB7OjfACwAACILIAwgBSALQQBKcxsgDCALG0EFbEHkACAKLQA4IgtB3wAgCxsgCi0AMiIJwEEASBtqIgtB4wBKQQd0IAlB/wBxcjoAMiAKQQpB5AAgCyALQeQAThsiCSAJQQpMGyIJQQAgC0HeAEwbOgA4DAELIApBdUELIAosADlB7OjfACwAACILIAwgBSALQQBKcxsgDCALG2oiCyALQQtOGyILIAtBdUwbIgk6ADkLIAEgBCAGIApBMGoQCSADQQFqIQMLIAZBAWoiBkEERw0ACyADRQRAQcDt1gBBuBMQDQwBC0HA7dYAEAogAEEBRgRAQbvo3wAgCToAAEHA7dYAQX9B8jIgCkEwagJ/IAlB5ABOBEAgCkHUkpUCNgIwQajZAAwBCyAKIAk2AhAgCkEwakEQQdEOIApBEGoQ4AJBkdkACyAJQf8BbEHkAG1Bf0Hz7wEQDgwBC0G86N8AIAk6AAAgCiAJNgIgIApBMGpBEEG8CyAKQSBqEOACQcDt1gBBf0HONCAKQTBqQaMbIAlB/wFsQfUVakEWbUGAAUHA+AMQDgsgCkFAayQADAgLIARBBEcNAUGZ3t8ALQAADQILQeTe3wAsAABBAEgNAUGb3t8ALQAAQQFNBEAjAEHgAGsiCSQAAkBB5N7fACwAACIFQZve3wAtAAAiDEGEC2xBuPDWAGogDEGAFGxBgODWAGogDEECSRsiASAMQcDt1gBqLQDs8AhBD3EiBEEGdGpqLQCEASICQQFxRQRAQcDt1gBB9iMQDQwBC0Hm3t8AQQE6AABB6N7fAEEBOgAAIABBAmsiBkEDTQRAQcDt1gBBBSAMIAQgBUH/AXFB/wAgASAFIAQgBhCzASIAQQBIBH8gDEEwbEHA7dYAaiAGai0AWAUgAAsgA2oiACAAQf8AThsiAEEAIABBAEobIgAgBkEIdHIQB0HA7dYAEApBwO3WACAMIAYgACAJQdAAakEQEGQgBUEBaiEFIAkCfwJAAkACQCAMDgIBAAILIAZBAnRBwN0AaigCAAwCCyAGQQJ0QdDdAGooAgAMAQsgDEEwbEHA7dYAaiIELQBvIgNBBUYEQEH4JCAEIAZBAXRqQfH2AGotAAAiBEUNARogBEENcEECdEHg8QBqKAIADAELQfgkIAMgBhChASIERQ0AGiAEKAIACxCZATYCBCAJIAU2AgAgCUEwakEWQaQJIAkQ4AJBwO3WACAGIAlBMGogCUHQAGpBqNkAIABBAXQgDEEwbEHA7dYAaiAGai0AWEEBdCAGEAUQDgwBCwJ/AkACQAJAIAAOAgABAgsgAkH9AXEgA0EASkEBdHIhBkHxL0GAFSADQQBMGyEAQbkWDAILQQQgAkECdkEDcSACQRBxGyEAAkBB7OjfACwAACIGBEAgA0EATCAGQQBKcw0BC0F/QQEgA0EATBshBgsgAkHjAXFBEEEEIAAgBmoiBiAGQQROGyIAQQAgAEEAShtBAnQiACAGQQNKG3IhBiAAQaDjAGooAgAhAEGmGAwBCyACQQV2QQNxIQACQEHs6N8ALAAAIgYEQCADQQBMIAZBAEpzDQELQX9BASADQQBMGyEGCyACQZ8BcUECIAAgBmoiBiAGQQJOGyIGQQAgBkEAShsiAEEFdHIhBiAAQQJ0QbDkAGooAgAhAEG1KQshAyAJIAA2AiAgCUHQAGpBEEHVCiAJQSBqEOACIAMQmgEhACAJIAVBAWo2AhAgCUEwakEWIAAgCUEQahDgAkHA7dYAQQQgDCAEIAVB/wFxIAZB/wFxEAdBwO3WABAKQcDt1gBBfyAJQTBqIAlB0ABqQajZAEGAAUF/Qb/fAxAOCyAJQeAAaiQADAcLIwBBkAFrIgckAEGb3t8ALQAAIglBgBRsQYDg1gBqIg5B5N7fACwAACIGQShsaiIPEKcBBH8gB0GAAWoFIAdBADYCgAFBASENIAdBgAFqQQRyCyECIA9BCmoQpwFFBEAgAkEBNgIAIA1BAWohDQsgDiAGQShsaiIPQRRqEKcBRQRAIAdBgAFqIA1BAnRyQQI2AgAgDUEBaiENCwJAAkAgD0EeahCnAUUEQCAHQYABaiANQQJ0akEDNgIAIA1BAWohDQwBCyANDQBBwO3WAEH2IxANDAELQebe3wBBAToAAEHo3t8AQQE6AAAgB0IANwN4IAdCADcDcAJAIABBAmsiAUEETwRAQX9BASADQQBMIgQbIQsgA0EFbCEFIA4gBkEobGohDEEAIQ4DQCAHIAwgB0GAAWogDkECdGooAgAiD0EKbGoiAi8ACDsBWCAHIAIpAAA3A1ACQAJAAkACQCAADgIAAQILIAdB/wBBMkHkAEHs6N8ALAAAIgIgCyAEIAJBAEpzGyALIAIbQQIgBy0AUSICQTJLIAJB/gBLG2oiAkEATCIBGyACQQFKIgobOgBRQdQWIQIgDg0CIAdBgBVBkRRB8S8gARsgChs2AjAgB0HwAGpBEEHVCiAHQTBqEOACDAILAkACQAJAAkACf0HlAEHmACAHLQBTIgIgAkH5AEYbIAJB+ABGGyIBQeQATQRAQQAhAiABIAVqIgFBAEgNAkHmACABIAFB5gBPGwwBC0HfACECQezo3wAsAAAiCiALIAQgCkEASnMbIAsgChsgAWoiAUHfAEgNAUHmACABIAFB5gBPGwshAkEBIQpB+QAhASACQeUAaw4CAgEAC0EAIQogAiEBCyAHIAE6AFNBpC0hAiAODQMgCkUNASAHQs6egbGUiZMmNwNwDAMLIAdB+AA6AFNBpC0hAiAODQIgB0GtEC8AADsBeCAHQaUQKQAANwNwDAILIAcgAUH/AXE2AkAgB0HwAGpBEEGO2QAgB0FAaxDgAgwBCyAHQYF/QQEgA0ERIActAFIiAkH/AHEgAsBBAEgbaiICQREgAkERSCIKGyIBIAFBAUwbIgEgAkEQShs6AFJBijMhAiAODQAgCkUEQCAHQdSSlQI2AnAMAQtB2RoQmgEhCiAHIAE2AiAgB0HwAGpBECAKIAdBIGoQ4AILIAkgBiAPIAdB0ABqEAkgDkEBaiIOIA1HDQALQZcJEJoBIQ4gByACEJkBNgIUIAcgBkEBajYCECAHQdAAakEWIA4gB0EQahDgAkHA7dYAQX8gB0HQAGogB0HwAGpBqNkAQYABQX9Bv98DEA4MAQsgDiAGQShsaiIAIAcoAoABQQpsaiABai0ABCIPQf8BRgRAIAlBMGxBwO3WAGogAWotAFghDwtBACEOQf8AIAMgD0H/AXFqIg8gD0H/AE4bIg9BACAPQQBKGyELIAEgB2pB1ABqIQwDQCAHIAAgB0GAAWogDkECdGooAgAiD0EKbGoiAi8ACDsBWCAHIAIpAAA3A1AgDCALOgAAIAkgBiAPIAdB0ABqEAkgDkEBaiIOIA1HDQALQcDt1gAgCSABIAsgB0HwAGpBEBBkIAZBAWohDiAHAn8CQAJAAkAgCQ4CAQACCyABQQJ0QcDdAGooAgAMAgsgAUECdEHQ3QBqKAIADAELIAlBMGxBwO3WAGoiDS0AbyIGQQVGBEBB+CQgDSABQQF0akHx9gBqLQAAIg1FDQEaIA1BDXBBAnRB4PEAaigCAAwBC0H4JCAGIAEQoQEiDUUNABogDSgCAAsQmQE2AgQgByAONgIAIAdB0ABqQRZBpAkgBxDgAkHA7dYAIAEgB0HQAGogB0HwAGpBqNkAIAtBAXQgCUEwbEHA7dYAaiABai0AWEEBdCABEAUQDgtBwO3WABAKCyAHQZABaiQADAYLAkAgAEEGRw0AIARB/gFxQQJHDQAjAEEQayIAJABBv+jfACwAACECAkBB7ejfAC0AACIBQfDo3wAtAABGBEBB7ujfAC0AAEUNAQtB8OjfACABOgAAQe/o3wBBADoAAAtBv+jfAAJ/IAIEQEHv6N8AQQA6AABBACACQQBIIAIgA2oiAUEASnENARpBQUEAIAJBAEwbIgJBPyABIAFBP04bIgMgAiADShsMAQsCQEHs6N8ALAAAIgIEQCADQQBMIAJBAEpzDQELQX9BASADQQBMGyECC0Hv6N8AQWxBFCACQe/o3wAsAAAiAUEAIAJBAEwgAUEASnMbQQAgAUH/AXEbaiICIAJBFE4bIgEgAUFsTBsiAToAAEEAIAJBAmpBBUkNABpB7+jfAEEAOgAAQX5BAiACQQBKGyABagsiAzoAAEHA7dYAQSAgA0H/AXFBAEEAEAYgAEG/6N8ALAAANgIAIABBCGpBCEG8CyAAEOACQcDt1gBBf0G8JkGZM0GLN0G/6N8ALAAAIgIbIAJBAEgbIABBCGpBxtQAIAIbQajZACACQQF0QYABakGAAUHa8gMQDiAAQRBqJAAMBgsCQAJAAkACQAJAAkACQCAEQQFrDggABQEMAgQDBgwLAkACQAJAIAAOAgEAAgtBACADEIwBDA0LQZve3wAtAAAhAAJAQezo3wAsAAAiAgRAIAFBAEwgAkEASnMNAQtBf0EBIAFBAEwbIQILQZve3wBBBSAAIAJqIgIgAkEFThsiAkEAIAJBAEobIgI6AABBvd7fAC0AAEUNDCAAIAJB/wFxRg0MIwBBMGsiAiQAQd7i3wAtAAAEQEHA7dYAEHYLQbne3wAtAAAEQEHA7dYAQZve3wAtAAAQGkHQ3t8AQQA7AQBByN7fAEIANwMAQcDt1gAQdUHACRCaASEBIAJBwO3WAEGb3t8ALQAAIgAQAjYCBCACIABBAWo2AgAgAkEQakEeIAEgAhDgAkHA7dYAIAJBEGoQDQsgAkEwaiQADAwLIABBBkYEQEGb3t8ALQAAIAMQigEMDAsgAiADEIsBDAsLAkACQAJAIAAOAgABAgsCQAJAAkBBq97fAC0AACICQQFrDgMAAgECC0Gb3t8ALQAAIQACQEHs6N8ALAAAIgIEQCABQQBMIAJBAEpzDQELQX9BASABQQBMGyECC0Gf3t8AQQJBBSAAIAJqIgIgAkEFThsiAiACQQJMGyICOgAAQZve3wAgAjoAACACQTBsQcDt1gBqLQBvIQJBnt7fAEEAOgAAQZ3e3wAgAjoAAAwOC0Gw5tcALQAAIgBFDQ1B0OPfAC0AACEEAkBB7OjfACwAACICBEAgAUEATCACQQBKcw0BC0F/QQEgAUEATBshAgtB0OPfACACIARqIgIgAEEBayIBIAEgAkobQQAgAkEAThs6AAAMDQtBzOPfAC0AACEEAkBB7OjfACwAACIABEAgAUEATCAAQQBKcw0BC0F/QQEgAUEATBshAAtBzOPfACAAIARqIgECfyACQQNPBEBBsObXAC0AAEEBawwBCyACQQJ0QfzkAGooAgALIgIgASACSBtBACABQQBOGzoAAAwMC0EAIQIjAEEwayIFJAACQAJAAkACQAJAQave3wAtAAAOAwABAgMLQczj3wAtAAAiBEECTQRAIAQgAxCMAQwECyAEQQNGBEACQEHs6N8ALAAAIgQEQCADQQBMIARBAEpzDQELQX9BASADQQBMGyEEC0ESQTAgBEHq7dYALQAAaiIDIANBME4bIgNBACADQQBKGyIDEAwgBSADQRhrNgIAIAVBIGpBDEG8CyAFEOACQcDt1gBBf0GCOyAFQSBqQbAUIANBBWxB+ABBnw8QDgwEC0Hk7dYALQAAQQJrQf8BcSIEQQZNBEAgBEECdEGI5QBqKAIAIQILAkBB7OjfACwAACIEBEAgA0EATCAEQQBKcw0BC0F/QQEgA0EATBshBAtBDEEDIAIgBGoiAyADQQNOGyIEQQAgBEEAShsiBEG85ABqLQAAIgIQDEHA7dYAQX9B0S0gBUEgagJ/IANBAEoEQEG6DRCaASEDIAUgAjYCECAFQSBqQRAgAyAFQRBqEOACQbYaDAELIAVBz4yZAjYCIEGo2QALIARB1QBsQX9Bv98DEA4MAwtBm97fAC0AACADEIkBDAILQczj3wAtAAAgA0F/EJUBDAELQbDm1wAtAAAiBEUNAEHQ498ALQAAIARwQcDt1gBqIgRB8fgAaiECIAQtAPF4IgFBD3EhAAJAQezo3wAsAAAiBARAIANBAEwgBEEASnMNAQtBf0EBIANBAEwbIQQLIAIgAUHwAXFBCSAAIARqIgMgA0EJThsiA0EAIANBAEobcjoAAEHKit8AQQE6AABBzIrfAEGI5d8AKAIANgIACyAFQTBqJAAMCwsgAEEFSw0KIwBBEGsiBCQAAkACQAJAAkBBq97fAC0AAA4EAAMBAgMLIAJBA0cEQCACIAMQjAEMAwsCQEHs6N8ALAAAIgIEQCADQQBMIAJBAEpzDQELQX9BASADQQBMGyECC0ESQTAgAkHq7dYALQAAaiICIAJBME4bIgJBACACQQBKGyICEAwgBCACQRhrNgIAIARBBGpBDEG8CyAEEOACQcDt1gBBf0GCOyAEQQRqQbAUIAJBBWxB+ABBnw8QDgwCCyACIAMgAhCVAQwBCwJAAkACQCACQQFrDgMBAwIAC0Gw5tcALQAAIgJFDQJB0OPfAC0AACACcEHA7dYAaiICQfH4AGohBSACLQDxeCIBQQ9xIQACQEHs6N8ALAAAIgIEQCADQQBMIAJBAEpzDQELQX9BASADQQBMGyECCyAFIAFB8AFxQQkgACACaiICIAJBCU4bIgJBACACQQBKG3I6AABByorfAEEBOgAAQcyK3wBBiOXfACgCADYCAAwCC0Gw5tcALQAAIgJFDQFB0OPfAC0AACACcEHA7dYAaiICQbH5AGohBSACLQCxeSEBAkBB7OjfACwAACICBEAgA0EATCACQQBKcw0BC0F/QQEgA0EATBshAgsgBUEBQRAgASACaiICIAJBEE4bIgIgAkEBTBs6AABByorfAEEBOgAAQcyK3wBBiOXfACgCADYCAAwBCyADQQBKIgJBnPjXAC0AAEVzDQBBwO3WAEESIAJBAEEAEAZBwO3WAEHfKUHtNiACGxANCyAEQRBqJAAMCgsgAEUEQEHL498ALQAAIQACQEHs6N8ALAAAIgIEQCABQQBMIAJBAEpzDQELQX9BASABQQBMGyECC0HL498AQQogACACaiICIAJBCk4bIgJBACACQQBKGzoAAAwKCyAAQQJLDQkCQAJAAkACQAJAAkACQAJAAkACQAJAQcvj3wAtAAAOCgABAgMEBQYHCggKCyADQQBKIgNBpcreAC0AAEYNCUGlyt4AIAM6AABBwO3WAEEiIANBAEEAEAZBwO3WAEGz1wBB4S9BpcreAC0AABsQDQwICyADQQBKIgNBpsreAC0AAEYNCEGmyt4AIAM6AAAMBwtBAkGnyt4ALQAAIgFBAkYgAUEERhshAAJAQezo3wAsAAAiAQRAIANBAEwgAUEASnMNAQtBf0EBIANBAEwbIQELQafK3gBBAiAAIAFqIgMgA0ECThsiA0EAIANBAEobQdDkAGotAAA6AAAMBgtBqMreAC0AACEAAkBB7OjfACwAACIBBEAgA0EATCABQQBKcw0BC0F/QQEgA0EATBshAQtBqMreAEEUIAAgAWoiAyADQRROGyIDQQAgA0EAShs6AAAMBQsgA0EASiIDQavK3gAtAABGDQVBq8reACADOgAADAQLQarK3gAtAAAhAAJAQezo3wAsAAAiAQRAIANBAEwgAUEASnMNAQtBf0EBIANBAEwbIQELQarK3gBBAiAAIAFqIgMgA0ECThsiA0EAIANBAEobOgAADAMLIANBAEoiA0Gvyt4ALQAARg0DQa/K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QYi12ABBADYCAEHstNgAIAJB7LTYACgCACIDIANBBHZrIgMgAiADSxs2AgBBjLXYACgCACECQfC02AAoAgAhA0GMtdgAQQA2AgBB8LTYACACIAMgA0EEdmsiAyACIANLGzYCAAsgCUEQaiQAIABBAk4EQANAIBFBAnRB4K3gAGogEUEDdCIAQeCt4gBqKAIAskMAAAA0lDgCACARIBNqQQJ0QeCt4ABqIABB5K3iAGooAgCyQwAAADSUOAIAIBFBAWoiESATRw0ACwtB4K3gAAsHAEGE588ACwcAQYTr1gALBwBB4K3kAAsJAEHA7dYAEB8LCgBB2O3WAC8BAAsKAEHoit8AEN4BCwYAQYCgBgvZBgEEfyMAQSBrIgQkAEF/IQICQCAAQQBMDQBBwO3WABAfIABJDQBB2O3WAC8BACECIARBCGoQ/QEgBCgCGCAEKAIUIAQoAhxB4K3kACAAIAIgASABQeESa0GvcEkbIgJBAUEIQYDgpxIgAm4iAkEBdiAAaiIBIAJuIgAgAEEITxsgASACSRsQ3wEiAkEASARAQX8hAgwBCyMAQRBrIgMkAEHQ7dYAKAIAIgAEQCAAQczt1gAoAgBB1O3WACgCAEHoit8AENsBCwNAIAVB0ABsQdiQ3wBqQQBB0AAQvgIiAEH//wM7AAkgBUHUAGxB6IrfAGoiAS0AAARAIAAgASgCUDYCACAAIAEoAgw2AgQgACABLwEEOwEMIAAgAS0ABjoADiAAIAEtAAM6AAsgACABLQACOgAIIAAgASkCEDcCECAAIAEpAhg3AhggACABKQIgNwIgIAAgASkCKDcCKCAAIAEpAjA3AjAgACABKQI4NwI4IABBQGsgAUFAaykCADcCACAAIAEpAkg3AkgLIAVBAWoiBUEIRw0ACyADQgA3AwggA0IANwMAIANB2JDfADYCBCADQRY6AABBzOfXACADEC4gA0EQaiQAQcCG1wAtAABBB00EQEHIhtcALwEADQELQcyG1wAtAABBB00EQEHUhtcALwEADQELQdiG1wAtAABBB00EQEHghtcALwEADQELQeSG1wAtAABBB00EQEHshtcALwEADQELQfCG1wAtAABBB00EQEH4htcALwEADQELQfyG1wAtAABBB00EQEGEh9cALwEADQELQYiH1wAtAABBB00EQEGQh9cALwEADQELQZSH1wAtAABBB00EQEGch9cALwEADQELQaCH1wAtAABBB00EQEGoh9cALwEADQELQayH1wAtAABBB00EQEG0h9cALwEADQELQbiH1wAtAABBB00EQEHAh9cALwEADQELQcSH1wAtAABBB00EQEHMh9cALwEADQELQdCH1wAtAABBB00EQEHYh9cALwEADQELQdyH1wAtAABBB00EQEHkh9cALwEADQELQeiH1wAtAABBB00EQEHwh9cALwEADQELQfSH1wAtAABBB00EQEH8h9cALwEADQELIAJBABAYGgsgBEEgaiQAIAILLQAgAEG469YAIAFBuO3WAC8BACIAIAAgAUobIgEQvAIaQbjt1gBBADsBACABCwcAQeCt5wALTQEBf0F/IQECQEHYreAALQAARQ0AIABBAEwEf0EDBSAAQYCAAUsNAUEAQQBBABAdDQFBAUHgrecAIAAQHQ0BQQILQQBBABAdIQELIAELJgEBfwJAQdit4AAtAABFDQBBrsreAC0AAEUNABAcQQBHIQALIAALBwBB4K3oAAtIAQF/QX8hAQJAIABBAWtB38QASw0AQdit4AAtAABBAXFFDQBBAEEAQQAQHg0AQQFB4K3oACAAEB4NAEECQQBBABAeIQELIAELEwAgAEEERgRAENMBDwsgABDRAQsKAEGY3t8ALQAACwoAQdz31wAtAAAL0woCDH8DfSMAQSBrIg0kACANIANBGGxB0IcHaiIDKQIQNwMYIA0gAykCCDcDECANIAMpAgA3AwggDUG2/wYtAAA6AAYgDUG0/wYvAAA7AQQgAEEEaiEPIAVBD0ohEUEAIQADQCACIABBBHRqIgMoAgQhBiANQQhqIABBAnRqKAIAIQ4gAyADKAIAIgxBC3ZB+D9xQeCQ6QBqIgcoAgQgBzQCACAMQf//AHGtfkIOiKdqQQYgDEGAgIDwAGtBGHVrdSIHNgIEIA5BA3EhDCAOQQRxIQgCQCAHQeAISCAGQd8ITHFFBEAgDEGQAmwgD2pBgQJrQXBxIAEgDBshCyANQQRqIAxqIgwtAAAgCEEAR3EhCAJAIA5BBHZBA3EiCgRAIA1BBGogCmotAAANAQsgAygCCCEKIAMoAgwhCQJAIBENACAOQcABcUHAAUcNACALIQ4gBUEBaiEQIAayQwAAgDOUIRIgByAGa0EgakEGdbJDAACAM5Qh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IAdKGyEKCyAMQbAEaiQAIAoLrQUCBn4EfyABIAEoAgBBB2pBeHEiAUEQajYCACAAIAEpAwAhAiABKQMIIQYjAEEgayIBJAAgBkL///////8/gyEDAn4gBkIwiEL//wGDIgSnIgBBgfgAa0H9D00EQCADQgSGIAJCPIiEIQMgAEGA+ABrrSEEAkAgAkL//////////w+DIgJCgYCAgICAgIAIWgRAIANCAXwhAwwBCyACQoCAgICAgICACFINACADQgGDIAN8IQMLQgAgAyADQv////////8HViIAGyECIACtIAR8DAELAkAgAiADhFANACAEQv//AVINACADQgSGIAJCPIiEQoCAgICAgIAEhCECQv8PDAELIABB/ocBSwRAQgAhAkL/DwwBC0GA+ABBgfgAIARQIggbIgsgAGsiCUHwAEoEQEIAIQJCAAwBCyABQRBqIQogAiEEIAMgA0KAgICAgIDAAIQgCBsiAyEFAkBBgAEgCWsiCEHAAHEEQCACIAhBQGqthiEFQgAhBAwBCyAIRQ0AIAUgCK0iB4YgBEHAACAIa62IhCEFIAQgB4YhBAsgCiAENwMAIAogBTcDCAJAIAlBwABxBEAgAyAJQUBqrYghAkIAIQMMAQsgCUUNACADQcAAIAlrrYYgAiAJrSIEiIQhAiADIASIIQMLIAEgAjcDACABIAM3AwggASkDCEIEhiABKQMAIgNCPIiEIQICQCAAIAtHIAEpAxAgASkDGIRCAFJxrSADQv//////////D4OEIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACFINACACQgGDIAJ8IQILIAJCgICAgICAgAiFIAIgAkL/////////B1YiABshAiAArQshAyABQSBqJAAgBkKAgICAgICAgIB/gyADQjSGhCAChL85AwALqgEBBX8gACgCVCIDKAIAIQUgAygCBCIEIAAoAhQgACgCHCIHayIGIAQgBkkbIgYEQCAFIAcgBhC8AhogAyADKAIAIAZqIgU2AgAgAyADKAIEIAZrIgQ2AgQLIAQgAiACIARLGyIEBEAgBSABIAQQvAIaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIDNgIcIAAgAzYCFCACC6UCACAARQRAQQAPCwJ/AkAgAAR/IAFB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RSBUSEVSRSBGSVJTVABUSEUgU09VTkQgU0VUVElOR1MgQVJFIExPU1QAV0hJVEUgPSBDWUNMRSBBQ0NFTlQgQU5EIEdIT1NUAERFU1QAUE9SVEEgV0lUSCBUSUUgICUrZCBTVABTVEFSVABDQVBUAFBST0pFQ1QgUk9PVABPTkVTSE9UAEFNT1VOVABJTlNUUlVNRU5UAFdISVRFID0gVE9HR0xFIEFDQ0VOVABCMSA9IEFDQ0VOVABNT0QgQU1UAE00IEFNVABNMyBBTVQARU5WMiBBTVQATTIgQU1UAE0xIEFNVABNU1QgRklMVABWRUwgRklMVABJTklUAFJFQyA9IFNUT1AgLSBTVE9QUyBCWSBJVFNFTEYgQVQgVEhFIExJTUlUAFQlZCBLSVQASU5JVCBLSVQAUFJFU0VUUyA9IEFOT1RIRVIgS0lUAFRBS0UgJTAyZCBTQVZFRDogVEFLRVMgPiBLSVQAU1RFUCAlMDJkIEhJVABTVEFSVCBPTiBUSEUgSElUAEhPTUUgKyBFRElUAEJJVABNQVNURVIgPiBLMiBQSUNLUyBJVABVUFJJR0hUAE1PVkUgQlJJR0hUAFNXSU5HICA1MD1TVFJBSUdIVABMRUZUAE5PIFRBS0VTIFlFVABJVCBJUyBOT1QgU0FWRUQgWUVUAENIT1JEIFNFVABUQVJHRVQAU0VMRUNUAFNDTCBBR0FJTjogQ0hPUkRTIC0gSE9NRSArIFNDTDogUFJPSkVDVAAlK2QgQ1QATUVUQUwgSEFUAEFOQUxPRyBIQVQAU1RFUCAlMDJkIFJFUEVBVABCSUcgQkVBVAAxLzhUADEvMTZUADEvMzJUACV1LiUwM3VTACVkIEJQTSAlZCBCQVIgJXUuJXVTACVkKyVkLCBGUkVFICV1LiV1UwBBTFdBWVMAQUxXQVlTIFBMQVlTAEFMR09SSVRITSA9IENIT1JVUwBCVU5PLTYgQ0hPUlVTACVkIEVWRU5UUwBNVVRFIElOU1RSVU1FTlRTAFBSRVNFVFMAU1lOVEggQkFTUwBNT05POiBFVkVSWSBOT1RFIFJFVFJJR0dFUlMATU9OTzogT05FIFZPSUNFLCBSRVRSSUdHRVJTAFQlZDogJWQgQkFSUwBMT09QIEJBUlMAMiBCQVJTAExPTkcgTk9URTogJWQgU1RFUFMAQ0FQVFVSRUQ6ICVkIFNURVBTAEVOVjIgUE9TAENIQUlOIE9GICVkIFBBVFRFUk5TAFBST0dSRVNTSU9OUwAldU1TACVkTVMAJXUgTVMAJWQgTVMAVElDS1MARU1QSEFTSVMAQUxMIEFUIDA6IFRIRSBHUklEIEFTIElTAEtFRVAgSE9MRElORyAlcyA9IFlFUwBIT0xEICVzIDIgUyA9IFlFUwBBUlAgT0NUQVZFUwBWSUVXOiBOT1RFUwBGUkVFIFJFQzogUkVDIEFHQUlOIENMT1NFUwBUV08gQ09SRVMAVDEgQU5EIFQyIEFSRSBGSVhFRCBNQUNISU5FUwBDSEFJTiBPRiAlZCBTQ0VORVMAU0FWRSBTT05HIEFORCBTQ0VORVMAVElNRVMAVEFLRVMAQlgtNyBCQU5LOiAlZCBWT0lDRVMAUE9MWTogVVAgVE8gNCBWT0lDRVMATElWRSBDSE9SRFMAVEFLRVMrU09VTkRTAEsxID0gRFVDSyAtIFNFTEVDVCBMRUZUID0gTEVWRUwsIFBBTiwgU0VORFMASURMRSBMRURTAEtJVDogJWQgUEFEUwBTQVZFIEFTAExPQUQgSU4gJXUuJXUgUwAxIEJBUiA9ICV1LiV1IFMAJS4xZiBTAFRBS0VTOiBGUkVFICV1LiV1IE9GIDYgUwBMIENPTlRPVVIARiBDT05UT1VSAElOU1RSAFNSAFJFU09OQVRPUgBGTEFTSCBFUlJPUgBNSU5PUgBDT0xPUgBNQUpPUgBBTkNIT1IARElSAE1JWEVSAE1BU1RFUgBUJWQgRklMVEVSAE1BU1RFUiBGSUxURVIAUE9MWU1FVEVSAEtFWVMgQVJFIFNJTEVOVCBJTiBUSEUgUkVDT1JERVIATEFEREVSACVkQlIATElORUFSAFNBVkUgQUdBSU4gPSBDTEVBUgBUJWQ6ICVkIEJBUgBUSEUgR1JJRCwgVkFSSUVEIEVWRVJZIEJBUgBSRUM6IFJFQ09SRCA+IFBMQVkgPiBPVkVSRFVCIC0gU1RBUlRTIE9OIFRIRSBORVhUIEJBUgBDVUU6IE1VVEVTIEFORCBTQ0VORVMgT04gVEhFIE5FWFQgQkFSAFQlZDogTkVYVCBCQVIAU0NFTkUgJWM6IE5FWFQgQkFSAFNUQVJUUyBPTiBUSEUgQkFSAExJTkVTID0gMSBCQVIAU1BMSVQgTC9SAFNURVAgSEFTIE5PIE5PVEVTOiBXUklURSBUSEVNIElOIFNFUQBGUkVRAFVQAFRSQU5TUABFWElUOiBSRUxFQVNFIEFSUABGUkVFICV1LiV1IFMgLSAlZCBTT1VORFMgT04gVE9QAEszIFBMQVk6IE9ORVNIT1QsIEtFWSwgVEhSVSBPUiBMT09QAEVSQVNFIExPT1AAUExBWSA9IExPT1A6IEhFTEQgUkVQRUFUUyBUSEUgTE9PUABSRUMgMiBTOiBFUkFTRSBUSEUgTE9PUABLMSBTVEFSVCAtIEsyIEVORCAtIEVESVQgPSBTT1VORCwgRU5WLCBMT09QAFJBTVAAUkVWRVJCIERBTVAATFAASFAARU1QVFkgU1RFUAA0IE5PVEVTIFBFUiBTVEVQAFJFQyBTVEVQAEJQAEhPTEQgR0xPID0gVFJBTlNQT1NFLCBQTEFZID0gVEFQAFNOQVAAQ0xBUABNSVhPAExFR0FUTwBNNCBUTwBNMyBUTwBNMiBUTwBNMSBUTwBSRVNPAE1JQ1JPAE1BQ1JPAEVYSVQ6IFJFTEVBU0UgR0xPICBQTEFZID0gVEFQIFRFTVBPAEhPTEQgS0VZUyA9IEFSUEVHR0lBVEUgSU4gVEVNUE8ATU9OTwAyIFMgPSBZRVMgIEFOWSBDT05UUk9MID0gTk8AQU5ZIE9USEVSIENPTlRST0wgPSBOTwBSRUxFQVNFID0gTk8AR0xPAFZFTE8ASy1MTwBLSUxMIExPAFJBVElPAEhPTEQgQVJQID0gTElWRSBBUlBFR0dJTwBNT1ZFICBEQVJLICsgRUNITwBBTEdPAExGTwBTVEVSRU8ATk9USElORyBUTyBVTkRPAFdISVRFID0gRVJBU0UgSU5TVFJVTUVOVCAgQjYgPSBVTkRPAEhPTEQgV0hJVEUgPSBFUkFTRSBMSVZFICBCNiA9IFVORE8AV0hJVEUgPSBFUkFTRSBTVEVQICBCTEFDSyA2ID0gVU5ETwBOT1RISU5HIFRPIFJFRE8ARVhJVDogUkVMRUFTRSBFRElUICBCTEFDSyA3ID0gUkVETwBEQ08AVVAtRE9XTgBUVVJOAFNFTEVDVCBQSUNLUywgU0FWRSBSVU5TIC0gSE9MRCBTQVZFID0gQ09QWSBQQVRURVJOAElUIElTIFRIRSBDVVJSRU5UIFBBVFRFUk4AQ0xFQVIgUEFUVEVSTgBXMS0xMCA9IEFERCBBIFBBVFRFUk4AJWQgUFBRTgBTWU5DIFBQUU4AVU5JU09OAFJFU09OAFBPU0lUSU9OAFNURVAgJTAyZCBDT05ESVRJT04ASU5URVJQT0xBVElPTgBWRVJTSU9OAFNPTkcgT04AU09ORyBSRUMgT04ASEFSTSBNSU4AU1VTVEFJTgBIT01FICsgRlggPSBERUxBWSwgUkVWRVJCIEFORCBTSURFQ0hBSU4AQ0xFQVI/IFNBVkUgQUdBSU4ASE9MRCBGWCA9IFBVTkNILUlOAExPT1AgSU4ASVQgU0FWRVMgV0hFTiBZT1UgU1RPUCAtIFdISVRFUyA9IExJU1RFTgBPUEVOAExBTkUgTEVOAEZBU1QgU0NSRUVOAFVQLUROAFQlZCBQQU4ATkFOAERPUklBTgBMWURJQU4AUFdNAFNUUlVNAE1FRElVTQBCQi0zMDMgV0FWRUZPUk0AVEFLRSBCUE0AVE9NAEZST00AWk9PTQBQQVRURVJOIEZVTEw6IE5PIFJPT00AUkFORE9NAFRSSU0ARElNAEJYLTcgQUxHT1JJVEhNAEZNAFNZU1RFTQBMSU1JVDogUkVDT1JESU5HIFJBTQBXSElURSA9IENZQ0xFIFgxLVg0IEFORCBGTEFNAFZFTCBMVkwATU9EIExWTABORU8gU09VTABLQkQgQ1RSTABDT05UUk9MAFNPTkcgRlVMTABQSUFOTyBST0xMAFBST0IvRklMTABBVVRPIEZJTEwATk8gRklMTABPTkxZIElOIFRIRSBGSUxMAEFVVE9NQVRJQyBGSUxMAEVYSVQ6IFJFTEVBU0UgQVJQICBCTEFDSyAxMSA9IEZJTEwARVhJVDogQVJQIE9SIEhPTUUgIEJMQUNLIDExID0gRklMTABDT1dCRUxMAEZJTABST0xMIFRBSUwAVCVkIExFVkVMAEtFWSBWRUwAU0VMAFNDIFJFTABSNCBSRUwATUlESSBDSEFOTkVMAE1PREVMAFNUQVJUUyBPTiBUSEUgQkFSIC0gUkVDIEFHQUlOID0gQ0FOQ0VMAEVYSVQ6IFJFTEVBU0UgU0NMAENPV0JMAE1BTlVBTABCSVRUQUwASU5TUElSRUQgQlkgVklUQUwATUVUQUwARVhURVJOQUwAQ0xPQ0s6IElOVEVSTkFMAE5PUk1BTAAldS4lMDJ1SwBSMSBBVEsAS0VZVFJLAFNIQVJLAE1PVkUgREFSSwBST0JPVCBGVU5LAERVQ0sAQ0xPQ0sAU1lOVEggS0lDSwBBTkFMT0cgS0lDSwBBVFRBQ0sAQ09QWSBUUkFDSwBBTFdBWVMgT04gSU4gVEhJUyBUUkFDSwBQSUNLIEEgTk9URSBUUkFDSwBXSElURSA9IFBBU1RFICBCTEFDSytXSElURSA9IE9ORSBUUkFDSwBXMTEtMTYgPSBUUkFDSwBERUxBWSBGRUVEQkFDSwBCUkVBSwAxSwAxMEsAVkkAVFJJAEItTUlOSQBQRU5UQSBNSQBWSUkASUlJAEkrSUkASy1ISQBLSUxMIEhJAEVYVCBDTE9DSzogV0FJVElORyBGT1IgTUlESQBTWU5USAAlcyBMRU5HVEgAU0VMRUNUIEhJVCAtIEFMR09SSVRITSBQUk9CIC0gUFJFU0VUUyBMRU5HVEgATUFTVEVSIExFTkdUSABHQVRFIExFTkdUSABPVVRTSURFIFRIRSBMRU5HVEgARU5HTElTSABNT1ZFICBCUklHSFQgKyBXQVNIAFRFU1RJTkc6IFNBRkUgTU9ERSBUVVJOUyBJVCBPRkYgQUZURVIgQSBDUkFTSABQSVRDSABQQVRDSABQVU5DSABQSFJZRwBQUk9HAElOU1BJUkVEIEJZIFRIRSBNSU5JTU9PRwBTT05HAEhFTEQ6IEtFWSwgVEhSVSBBTkQgTE9PUCBLRUVQIFBMQVlJTkcAUk9MTCBTV0lORwBUVU5JTkcATUlDUk8gVElNSU5HAEhPTUUgKyBUSElTIEJVVFRPTjogTk9USElORwBFWElUOiBSRUxFQVNFIEFSUCAgUkVDIElTIFJFQ09SRElORwBFWElUOiBBUlAgT1IgSE9NRSAgUkVDIElTIFJFQ09SRElORwBERUxBWSBBTkQgUFVOQ0gtSU4gUEFVU0VEIFdISUxFIFJFQ09SRElORwBWT0lDSU5HAENIQU5HRTogSE9MRCBUJWQgT04gSE9NRSArIEFMRwBFRwBMUEYASFBGAElORgBDVVRPRkYASzQgPSBTT05HIE9OL09GRgBNSURJIE9VVCBPRkYAVFdPIENPUkVTIE9GRgBGSUxURVIgT0ZGAEZBU1QgU0NSRUVOIE9GRgBTT05HIE9GRgBDVUUgT0ZGAFNPTkcgUkVDIE9GRgBNT1ZFICBPRkYAVkNPIFZDRgBIUEYgVkNGAFJFVkVSQiBTSVpFAEZSRUVaRQBNT1ZFAFQlZCBEUklWRQBEQ08gV0FWRQBLRVlTID0gVFJBTlNQT1NFIFBST0pFQ1QgIEsyID0gT0NUQVZFAEFVVE9TQVZFAFNUT1AgVE8gU0FWRQBPTkxZIFdIRU4gU1RPUFBFRCAtIFNBVkUgMiBTOiBRVUlDSyBTQVZFAEVYSVQ6IFJFTEVBU0UgU0FWRQBOTyBDSEFOR0U6IFNUT1AgQU5EIFNBVkUAVkFMVUUAQ1VFAFdISVRFID0gUExBWSBFRkZFQ1QgIEJMQUNLIDEtNiA9IE1VVEUARVhJVDogUkVMRUFTRSBIT01FICBCMS02IE1VVEUAQUxHT1JJVEhNIFBJQ0tTIFRIRSBUQVJHRVQgLSBIT0xEIEVESVQgMiBTID0gUEFTVEUARU1QVFkgU1RFUCAtIEhPTEQgKyBBTk9USEVSIFdISVRFID0gTE9ORyBOT1RFAEhFUk1JVEUAQVJQIFJBVEUAUk9MTCBSQVRFAE1PRCBSQVRFAEhPTEQgV0hJVEUgPSBST0xMICBCTEFDSyAxLTYgPSBSQVRFAEVOVi9HQVRFAEFSUCBHQVRFAFZDQTogR0FURQBUJWQgVFJBTlNQT1NFAFBST0pFQ1QgVFJBTlNQT1NFAFBVTFNFAE5PSVNFAEVSQVNFAFNJREVDSEFJTiBSRUxFQVNFAFBSRQBUSEUgU0FNUExFUiBTVEFZUyBIRVJFAE5PVEhJTkcgVE8gUEFTVEUgSEVSRQBTUVVBUkUAU1lOVEggU05BUkUAQU5BTE9HIFNOQVJFAFRBUEUAU0hBUEUAREVUVU5FAFRPTkUATk9ORQBDQU5OT1QgQkUgVU5ET05FAFRBS0VTIEZVTEw6IERFTEVURSBPTkUAUkVDID0gUkVDT1JEIE9ORQBTSU5FAFcxLTEwIFBBVFRFUk4gIFcxMS0xNiBHTyBUTyBNQUNISU5FAEZJWEVEIE1BQ0hJTkUARklORQBFWElUOiBSRUxFQVNFIEVESVQgIEI3LTEwID0gQ0xSIFNDRU5FAEVOVFJZICVkOiBOTyBTQ0VORQBFWElUOiBCTEFDSyAxMSBPUiBIT01FAERMWSBUSU1FAERFTEFZIFRJTUUAT05FIEFUIEEgVElNRQBGUkFNRQBXSE9MRQBOTyBUQUJMRQBPU0MgMSBUQUJMRQBBVkFJTEFCTEUAUFJPSkVDVCBTQ0FMRQBGT1IgVFJBQ0tTIFdJVEhPVVQgVEhFSVIgT1dOIFNDQUxFAEtFWVMgSU4gU0NBTEUAT1dOIFRSQUNLIFNDQUxFAENIT0tFAFdISVRFID0gUExBWSBBTkQgUElDSyBBIFBBRCAtIFBSRVNFVFMgPSBJVFMgVEFLRQBNQVggMy4wIFMgUEVSIFRBS0UASE9NRSA9IERJU0NBUkQ/IC0gUkVDID0gQU5PVEhFUiBUQUtFAE5PIFRBS0UAU0FWSU5HIFRIRSBUQUtFAFRBS0VTIChIT0xEIEVESVQpOiBCTEFDSyAxID0gS0lUIEZST00gQSBUQUtFAFBBVVNFRDogVEFLRQBUSUUAUkFOR0UATk9URVMgVE8gTk9URVMsIEhJVFMgVE8gSElUUzogVEhFIE1BQ0hJTkVTIERPIE5PVCBDSEFOR0UATEFOR1VBR0UARlggQUdBSU4gPSBORVhUIFBBR0UARVhJVDogUkVMRUFTRSBFTlYgIEJMQUNLIDkvMTAgPSBQQUdFAEVYSVQ6IFJFTEVBU0UgTEZPICBCTEFDSyA5LzEwID0gUEFHRQBFWElUOiBMRk8gT1IgSE9NRSAgQkxBQ0sgOS8xMCA9IFBBR0UAQVJQIE1PREUAUFdNIE1PREUAQi1NSU5JIE1PREUAV0lERQBBQ0NFTlQgT1BFTlMgVEhFIEZJTFRFUiAtIFRJRSA9IFNMSURFAExFR0FUTzogVElFRCBOT1RFUyBHTElERQBXSElURSA9IFRJRSBUTyBORVhUIE5PVEUgIEsxID0gR0xJREUAVDEgSVMgVEhFIFNJREVDSEFJTiBTT1VSQ0UAVDEgSVMgVEhFIFNPVVJDRQBSRVBFQVQ6IFJFVFJJR1MgLSBCUkVBSzogUkVWRVJTRSwgSEFMRiwgU0lMRU5DRQBWT0lDRQBTUEFDRQBGV0QAQkFTRSBDSE9SRABBUk1FRDogUExBWSBUTyBSRUNPUkQARU5WIE1PRABWQ0YgTU9EAElOSVQgU09VTkQATk9UIEEgVVNFUiBTT1VORABUSEFUIElTIE5PVCBBIEJVQkJBIFNPVU5EAE5PIFJPT006IERFTEVURSBBIFRBS0UgT1IgQSBTT1VORABBTEcgPSBNQUNISU5FICBQUkUgPSBTT1VORABDT05EAFdISVRFID0gUExBWSBDSE9SRCAgQkxBQ0sgMS00ID0gRVhURU5EAERFTEFZIFNFTkQAUkVWRVJCIFNFTkQASEVMRDogVEhFIExPT1AgUkVQRUFUUyAtIFJFTEVBU0VEOiBUTyBUSEUgRU5EAFJBTkQAUE1EAEFNRABIT0xEIFJFQyA9IFJFQ09SRCBXSElMRSBIRUxEAEhPTEQgRURJVCArIEJMQUNLIDQgPSBDQVBUVVJFIElOVE8gVEhFIEdSSUQARklYRUQAVU5TQVZFRABTT05HIEFORCBTQ0VORVMgU0FWRUQAQSUwMmQgUVVFVUVEAE1VVEVEAFRSQUNLIFBBU1RFRABUQUtFICUwMmQgREVMRVRFRABTT1VORCBERUxFVEVEAENMT1NFRAAlcyBFUkFTRUQATE9PUCBFUkFTRUQAU0NFTkUgJWMgU1RPUkVEAFNDRU5FICVjIENMRUFSRUQAUEFUVEVSTiBDTEVBUkVEAEFSTUVEAE1PREVMRUQAQ0FOQ0VMRUQATEVHQVRPOiBPTkUgVk9JQ0UsIFRJRUQAUEFEICVkIENPUElFRABUSEUgU0FNUExFUiBJUyBOT1QgQ09QSUVEAFBBVFRFUk4gQ09QSUVEAFRSQUNLIENPUElFRABMQVRDSEVEAExBTkdVQUdFIFBBQ0sgSVMgREFNQUdFRABUJWQgU1BFRUQATEVOR1RIIEFORCBTUEVFRABFWElUOiBSRUxFQVNFIFNFUSAgQkxBQ0sgMS02ID0gU1BFRUQAUkVDT1JERUQAVEFLRSBESVNDQVJERUQATk8gUk9PTSBJTiBUQUtFUzogRElTQ0FSREVEAFRIRSBQQURTIEFSRSBSRVBMQUNFRABLWUJEAEVNUFRZIFBBRABCTEFDSyA0ID0gVEhFIFRBS0UgT04gVEhJUyBQQUQARU1QVFkgUEFEOiBUQUtFUyA+IFBBRABUUklBRABERUNSRVNDAEFUVEFDSywgUkVMRUFTRSwgQ0hPS0UgR1JPVVAsIFRFTVBPIFNZTkMAICBTWU5DAENMQVNTSUMARElBVE9OSUMAU1RBUlRTIFdIRU4gWU9VIFBSRVNT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AA4RExUZEQ4EDAQEBAQODhEBAgQIHx8CBAIBEQ4CBgoSHwICHxAeAQERDgYIEB4REQ4fAQIECAgIDhERDhERDg4REQ8BAgwADAwADAwAAAAAAAAAAAIECBAIBAIAAB8AHwAACAQCAQIECA4RAQIEAAQAAAAAAAAADhERHxERER4RER4RER4OERAQEBEOHhERERERHh8QEB4QEB8fEBAeEBAQDhEQFxERDxERER8REREOBAQEBAQOBwICAgISDBESFBgUEhEQEBAQEBAfERsVFRERERERGRUTEREOEREREREOHhERHhAQEA4REREVEg0eEREeFBIRDxAQDgEBHh8EBAQEBAQREREREREOEREREREKBBERERUVFQoREQoEChEREREKBAQEBB8BAgQIEB8OCAgICAgOAAAAAAAAAA4CAgICAg4AQc+lAQvXAR8AAAAAAAAADhERHxERER4RER4RER4OERAQEBEOHhERERERHh8QEB4QEB8fEBAeEBAQDhEQFxERDxERER8REREOBAQEBAQOBwICAgISDBESFBgUEhEQEBAQEBAfAAAaFRURERERGRUTEREOEREREREOHhERHhAQEA4REREVEg0eEREeFBIRDxAQDgEBHh8EBAQEBAQREREREREOEREREREKBBERERUVFQoREQoEChEREREKBAQEBB8BAgQIEB8AAAAAAAAABAQEBAQEBAAAAAAAAAAMEhIMAEG1pwELogICAgIAAgAAAAAABQcFBwUAAAAAAAUBAgQFAAAAAAACAgAAAAIEBAQCAgEBAQIABQIFAAACBwIAAAAAAgQAAAcAAAAAAAACAQECBAQHBQUFBwIGAgIHBgECBAcGAQIBBgUFBwEBBwQGAQYDBAcFBwcBAgICBwUHBQcHBQcBBgACAAIAAAAAAAABAgQCAQAHAAcABAIBAgQGAQIAAgAAAAAAAgUHBQUGBQYFBgMEBAQDBgUFBQYHBAYEBwcEBgQEAwQFBQMFBQcFBQcCAgIHAQEBBQIFBQYFBQQEBAQHBQcHBQUGBQUFBQIFBQUCBgUGBAQCBQUGAwYFBgUFAwQCAQYHAgICAgUFBQUHBQUFBQIFBQcHBQUFAgUFBQUCAgIHAQIEBwBB9akBC4IBAgUHBQUGBQYFBgMEBAQDBgUFBQYHBAYEBwcEBgQEAwQFBQMFBQcFBQcCAgIHAQEBBQIFBQYFBQQEBAQHAAYHBQUGBQUFBQIFBQUCBgUGBAQCBQUGAwYFBgUFAwQCAQYHAgICAgUFBQUHBQUFBQIFBQcHBQUFAgUFBQUCAgIHAQIEBwBBhqsBCw8CBQIAAAAAAAAABQ8FDwoAQaCrAQtN//+j/oP+Q/4j/iP+//++9573q/4j/iP+fe8857BGbh4tHgP+5+WKzaK8NGz/K5IcI/tkq6LKL0tlUsNBhiHBIGEQggggAAAAIAAAACAAQYKsAQvrgwUCAAQABgAIAAoADAAOABAAEgAUABYAGAAaABwAHgAgACIAJAAmACgAKgAsADoAPABGAFgAagB8AJoAvADqACQBXgGUAc4BBAI+AnYCsALmAiADVgN8A6oD6AMkBG4EyAQmBZIF3gU+BpoG+AZiB7wHEghwCMYIFAlmCbAJ9glICpIK5AoyC3ALqgvcCwYMNgx0DLIM+gwwDYIN6A1SDsIOSg/cD2wQ9BB0EeQRVBK8EiITmBP8E3AUwhQaFUwVZhWAFaQVyhUAFkwWnhb6FlIXohcAGEoYlhjQGAoZOBlyGawZ6hkwGmoarBr6GjwbkBvwGzwcqBwGHWAdqh3mHSQeWh6AHrYe+B42H3gfvB8CIEQgiiDIIAohTCGCIawh0iHsIQYiJCIuIjAiNiI4IjoiPCI+IkAiQiJEIlIicCKQIsAi+iI8I34jwCMCJEQkhiTIJEolwiV6Jj4nDijsKMQpvCqcK5gseC1QLiAv8i/IMKAxdjJIMxY08DTYNeI2zDfOOKg5jDpqOzg8+DxKPbI9tD22Pbg9uj28PcQ9yj3YPfI9Fj5oPsQ+ND/EP0hA6EB0QRRCskJIQ9pDfEQSRbJFJEZkRrJGtEa2RrhGuka8Rr5GwEbCRsRGxkbIRspG8C/wL/Av8C/wL/Av8C/wL/Av8C/wL/Av8C/wL/Av8C/wL/Av8C/wL/Av8C9zLwEsASgGLAEoASxzL/Avci8BKAoeAShyL3AvASwBLwEhChYBIQEvASxwL3AvASwBLwEhChYBIQEvASxwL3AvASwBLwEeChYBHgEvASxwL1wvAS0BJRIvASwBLwEeChYBHgEvASwSLwEoAStcL1svASUCLwEtES8BKAEvARsKFgEbAS8BKBEvASwCLwEoWy9ZLwIpAS8BIwEdAS8BLRAvASgBLwEbChYBGwEvASgQLwEsAS8BHgEmAS8CKFkvVy8BLQElAi8BHwEaARgBHQEvASUPLwEoAS8BGwoWARsBLwEoDy8BKAEvAR4BDwEQAR4CLwEoASxXL1UvAS0BJQIvAR8BGgQYAR8BLwEpDi8BLAEvARcKFgEXAS8BLA4vASgBLwEhARADDwEQASECLwEoVi9XLwEgARkGGAEaASMBJQEtDS8BLAEvARcKFgEXAS8BLA0vASsBKAEmARABDwEQBA8BHgEhVy9TLwEtASsBIwEcCRgBHAEvASMNLwEsASgMFgEoASwNLwEoAS8BHgEPARADDwEQAg8BEAEeASYBLFQvUy8BKwEjARoLGAEfAS8BKQsvASwBLwEhDBYBIQEvASwLLwEoAS8BIQgPARACDwEQASYBLFMvUy8BJQEvARwLGAEaASMBKQEtCi8BLAEvASYMFgEmAS8BLAovASsBKAEmARAJDwEQAQ8BHgEvAShTL1MvAS0BLwEgDBgBGQEvASMKLwEsAS8BIQwWASEBLwEsCi8BKAEvAR4BDwEQCQ8BEAEmAS8BK1MvVC8BJQEvARwMGAEdAS8BJQkvASwBLwEeDBYBHgEvASwJLwEoAS8BHgEPARAIDwEQAQ8BHgEvAShUL1QvAS0BKwEgDRgBHwErASkILwEsAS8BHgwWAR4BLwEsCC8BKAEsASEBEAsPARABJgEsAStUL1UvASMBLwEZDBgBGgEvASUILwEoAS8BGwwWARsBLwEoCC8BKAEvARABDwEQCA8BEAEPAR4BLwEoVS9VLwEpAS0BHw0YAR0BLwElBy8BKAEvAR4MFwEeAS8BKAcvASgBLwEeAQ8BEAsPASEBKwEoVS9WLwElAS8BGg0YAR8BLwEpHi8BKAEvASELDwEQAQ8BGwEvAShWL1YvASkBLQEfDRgBGgEgASsBLQcvDiwHLwErASwBIQEQAQ8BEAsPASEBKwEoVi9XLwElAS8BGQwYARoBHwEtASkGLwErASUDIwYnAyMBJQErBi8BKAErASEBEAIPARAHDwEQAQ8BHgEvAShXL1cvASUBLQEfCxgBHAEiAS8BLQMvASkCIwEtEC8BLQIjASkDLwErAS8BJgEeARACDwEQBw8BIQEvAShXL1gvAikBGggYARkBHwIvASsBLwErASMBJwQvASABHQEcAhkGFAIZARwBHQEgBC8BJwEjASsBLwEsAi8BIQEQAg8BEAUPARACKFgvWC8BJQEvAR8GGAEaAR8CLwEjAS0BJwEjAy8BHwEdARkBFAERAQMBAgIBBgICAQECAQMBEQEUARkBHQEfAy8BIwEnASsBKAIvAR4BEAIPARADDwEeAS8BKFgvWS8BKQEvARoDGAEaAR0CLwElASkBJwElAi8BIAEcARQBEQECAQEBAgEDAQoDEQYLAxEBCgEDAQIBAQECAREBFAEcASACLwElASkBLAEoAi8BHgEQAw8BEAEvAShZL0UvASsBIwErES8BJQEvAR8CGAEcASABLwEpASUBKwEjAi8BHwEZAREBAQECAQQCEQELAQoOBAEKAQsCEQEEAQIBAQERARkBHwIvASMBKwEoASwBLwEmAR4BEAEPASEBLwEoES8BKwEjAStFL0gvASMBKxEvAS0BHQEfAi8BJQEtASMCLwEfARkBCwEBAQMCEQEKFgQBCgIRAQMBAQELARkBHwIvASMBLwEoAi8BIQEeEi8BKwEjSC9CLwIrASABFAEcASICLwEjASsPLwEtAi8BJQEtASsBKQEvASABGQELAQIBBAERAQocBAEKAREBBAECAQsBGQEgAS8BKQIrASgCLwErDy8BKwEjAi8BIgEcARQBIAIrQi9CLwEjAS8BGQEBAQIBFAEZASACLwEjASkOLwElASkBLwEjAi8BHAERAQEBBAERIgQBEQEEAQEBEQEcAi8BIwEvAigOLwEpASMCLwEgARkBFAECAQEBGQEvASNCL0EvASkBJwEfAREBCwERAQMBAQERARkBIAIvASUBJw4vASMBLwEgARQBAQEDAREmBAERAQMBAQEUASABLwEjDi8BJwElAi8BIAEZAREBAQEDAREBCwERAR8BJwEpQS9BLwEjAS8BGQEBAREBBAEKAREBAwEBAREBGQEfAi8BIwEnCi8BLQEnAS8BHQERAQIBEQEKKAQBCgERAQIBEQEdAS8BJwEtCi8BJwEjAi8BHwEZAREBAQEDAREBCgEEAREBAQEZAS8BI0EvQC8BJwErAR8CCwQEAQoBEQEDAQEBEQEZAR8CLwIlBy8BKwEnAS8BHAIDAREsBAERAgMBHAEvAScBKwcvAiUCLwEfARkBEQEBAQMBEQEKBAQCCwEfASsBJ0AvQC8BJQEvARQBAgERBgQBCgERAQQBAgELARkBHwgvASsBJQEvARkBAQILLgQCCwEBARkBLwElASsILwEfARkBCwECAQQBEQEKBgQBEQECARQBLwElQC8/LwElAS8BHQECAQsKBAERAQQBAQERARQBHQEjASsDLwErASUBLwEZAQEBEQEKMAQBCgERAQEBGQEvASUBKwMvASsBIwEdARQBEQEBAQQBEQoEAQsBAgEdAS8BJT8vPi8CKwEiARQBAwEKDAQBEQEEAQIBAQEcAS8BJQEvASsBJwEvARkBAQERNAQBEQEBARkBLwEnASsBLwElAS8BHAEBAQIBBAERDAQBCgEDARQBIgIrPi8+LwElAS8BHQEBAQQBEQ0EAQoCEQEfAS8BJwEvASMBLwEZAQEBETYEAREBAQEZAS8BIwEvAScBLwEfAhEBCg0EAREBBAEBAR0BLwElPi8/LwEpASIBHQERAQIBEQEKCwQBEQEBARkBLwElAS8BIwEvARwBAQEROAQBEQEBARwBLwEjAS8BJQEvARkBAQERCwQBCgERAQIBEQEdASIBKT8vQi8BHwEUAQIBBAELCQQBCgEDAREBIAEpASsBJQEvAR0BAgELOgQBCwECAR0BLwElASsBKQEgAREBAwEKCQQBCwEEAQIBFAEfQi9BLwEjAi8BHAIDAREIBAERAQEBHAEvASMCKwEgAREBAwELOgQBCwEDAREBIAIrASMBLwEcAQEBEQgEARECAwEcAi8BI0EvQi8CJwEvAR8BFAEBAQsBCgUEAQsBAgEUASIBJwErASMBLwEUAQIBETwEAREBAgEUAS8BIwErAScBIgEUAQIBCwUEAQoBCwEBARQBHwEvAidCL0QvASMBLwEgARkBAgEDAREEBAELAQIBHQEvAiUBLwEcAQEBET4EAREBAQEcAS8CJQEvAR0BAgELBAQBEQEDAQIBGQEgAS8BI0QvRS8BJQIvAR0BEQECAREBCgEEAREBAgEUAS8BJQEpASsBIAERAQMBCj4EAQoBAwERASABKwEpASUBLwEUAQIBEQEEAQoBEQECAREBHQIvASVFL0YvASsBIwEvASABFAEBAQQBEQEKAQsBHwEvAScBJQEvARkBAQERQAQBEQEBARkBLwElAScBLwEfAQsBCgERAQQBAQEUASABLwEjAStGL0gvASMCLwEcAREBAwECARkBLwElAScBKwEfAREBCkIEAQoBEQEfASsBJwElAS8BGQECAQMBEQEcAi8BI0gvSS8BKwEnAS8BHwEUAREBIAIrASUBLwEZAQEBEUIEAREBAQEZAS8BJQIrASABEQEUAR8BLwEnAStJL0svASMBLwEiAR0BLwErASkBKwEfAREBCkQEAQoBEQEfASsBKQErAS8BHQEiAS8BI0svTC8BJwIvASsBLwEjAS8BGQEBARFEBAERAQEBGQEvASMBLwErAi8BJ0wvTS8BKwElAS8BKwEvAR8BEQELBgQTChQEEwoFBAEKAQQBEQEfAS8BKwEvASUBK00vUC8BKQErAR8BEQECARECBAEKAREBBBMDAQQBEQELDgQBCgERAQQTAwEEAREBCwIEAREBAwERAR8BKwEpUC9RLwEnAS8BHwERAQEBCwERAQMBAQELExEBCwECAQMBEQwEAREBAwEBAQsTEQELAQIBAwIRAgMBHAEvASVRL1EvAScBIwEvASABFAECAQEBFAEcAR8TIAEfARwBFAECAQQBCgkEAREBAQEUARwBHxMgAR8BHAEUAQIBAQEUAR0BLwEjASVRL1MvASMCLwEcARkBIAIvAiwTLwEjARkBAwEKAREICwECARQBIAIvAiwTLwEjAhkBIAEvASNTL08vAScBLwEcAR0BLwElAScDLwEjAS0CLwEkECsBJwEjASsBLwEZAQEBAwYCAQMBAgEUAi8BIwEtAi8BJBArAScBIwQvASMBLwEgAR0BLwErTy9GLwIrASwDKAMvAScBIwEUAQIBHAIvASUBIwErAS8BJwEbARwBLwEkES8BKwEjAS8BHwgdAR8BJQErAScBLwEnARsBHAEvASQRLwErAiMBLQEvAR0BEQEUASMBJwMvAyUBKQItRi87LwEsASsEKAEmBCgILwErAS8BIAERAQQBAQEZASIBJwEvASIBLwEbAQABBgEbAS8BIh8vASIBLwEbAQABBgEbAS8BIhEvAS0BKQEiARwBCwECAREBIAEvASsILwIpASUDIwIlASkCLTsvRi8CJgEhAh4BIQEsASsBJQEvAR0BAwELAREBAQEdAS8BJQEkAS8BHAEHAQwBBgEbAS8BIhIvASkJLwEtAS8BJAEvARwBBwEMAQYBGwEvASIQLwErAS8BIAEEAQMBEQEDAR0BLwElAS0BKQMfAyBGLzovASgCJgEhBR4GEAIPARABLwEoASMBLwEcAQIBEQELAQMBHQEvASUBLwEnAS8BGwEGAQgBBgEbAS8BIhEvASMIHQEgAS8BKwEvAScBLwEbAQYBCAEGARsBLwEiDy8BKwEvASABEQEDAREBAgEcAS8BIwEpAS8BGgUYAxoCHAEdAx8CIAEjOi84LwEoAS8BIQIQDA8BEAEPARABLwEoASMBLwEZAQEBEQELAQIBHQEvASUCLwEkAS8BGwEGAQgBBgEbAS8BJw4vASsBLwEgAREBAgEDAwIBAwEBAR0BLwElAi8BJAEvARsBBgEIAQYBGwEvAScOLwErAS8BIAERAQMBEQEBARkBLwEjASkBLwEaEBgBHwEvASU4LzgvASgBLwEeBQ8EEAcPARABLwEoASMBLwEZAQEBEQELAQIBHQEvASUDLwEiAS8BGwEGAQgBBgEbASoBJw0vASsBLwEgAREBBAERAwsBEQEDAR0BLwElAy8BIgEvARsBBgEIAQYBGwEqAScNLwErAS8BIAERAQMBEQEBARkBLwEjASkBLwEaEBgBHwEvASU4LzgvASgBLwEeAQ8BEA4PARABLwEoAScBLwEUAQICCwECAR0BLwElBC8BIgEvARsCBgEIASABLwEqDC8BKwEvASABEQEDAQoDBAELAQIBHQEvASUELwEiAS8BGwIGAQgBIAEvASoMLwErAS8BIAERAQMBEQECARQBLwIlAS8BGhAYAR8BLwElOC84LwEoAS8BHhAPARABLwEoAScBLwEUAQICCwECAR0BLwElBS8BIgEvARsBDAEVASIBJw0vASsBLwEgAREBAwEKAwQBCwECAR0BLwElBS8BIgEvARsBDAEVASIBJw0vASsBLwEgAREBAwERAQIBFAEvAiUBLwEaEBgBHwEvASU4LzgvASgBLwEeEA8BEAEvASgBJwEvARQBAgILAQIBHQEvASUGLwEnAS8BIBAvASsBLwEgAREBAwEKAwQBCwECAR0BLwElBi8BJwEvASAQLwErAS8BIAERAQMBEQECARQBLwIlAS8BGhAYAR8BLwElOC84LwEoAS8BHhAPARABLwEoAScBLwEUAQICCwECAR0BKwElBy8BJwEvASoPLwErAS8BIAERAQQBCgMEAQsBAgEdASsBJQcvAScBLwEqDy8BKwEvASABEQEEAREBAgEUAS8CJQEvARoQGAEfAS8BJTgvOC8BKAEvAR4QDwEQAS8BKAEnAS8BFAECAQsBEQEBARkBLwEjCC8BKhAvASMBKQEdAQIBEQQEAREBAQEZAS8BIwgvASoQLwEjASkBHQECAREBCwECARQBLwIlAS8BGhAYAR8BLwElOC84LwEoAS8BHgEPARAODwEQAS8BKAEnAS8BFAECAQsBCgEDAREBIAEjASkYLwEjAS8BFAECAQsEBAEKAQMBEQEgASMBKRgvASMBLwEUAQICCwECARQBLwIlAS8BGhAYAR8BLwElOC84LwEoAS8BHgUPBBAHDwEQAS8BKAEjAS8BGQEBAREBBAERAQIBGQEvASMBJRQvAS0BJwEjAS8BHAECAQsGBAERAQIBGQEvASMBJRQvAS0BJwEjAS8BHAECAQsBBAERAQEBGQEvASMBKQEvARoQGAEfAS8BJTgvOC8BKAEvASECEAwPARABDwEQAS8BKAEjAS8BGQEBARECBAEKAQMBHAMvEycDLwEcAQICCgcEAQoBAwEcAy8TJwMvARwBAgIKAQQBEQEBARkBLwEjASkBLwEaEBgBHwEvASU4LzovASgCJgEhBR4GEAIPARABLwEoASMBLwEcAQIBEQMEAQoBAgEUAR0BIxMvASMBHwEZAQMBBAEKCQQBCgECARQBHQEjEy8BIwEfARkBAwEEAQoCBAERAQIBHAEvASMBKQEvARoFGAMaAhwBHQMfAiABIzovRi8CJgEhAh4BIQEsASsBJQEvAR0BAwELBAQBEQECAQMVFAEEAQIBCgEFCwQBEQECAQMVFAEEAQIBCgEFAwQBCwEDAR0BLwElAS0BKQMfAyBGLzsvASwBKwQoASYEKAgvASsBLwEgAREBBAEKBAQBCwEKAQMTAgEDAQQBEQ4EAQsBCgEDEwIBAwEEAREEBAEKAQQBEQEgAS8BKwgvAikBJQMjAiUBKQItOy9GLwIrASwDKAMvASsBIwEUAQIBCwYEFQsSBBULBgQBCwECARQBIwErAy8DJQEpAi1GL08vASMBLwEZAQEBEUgEAREBAQEZAS8BI08vTy8BJQEvAR0BAgERSAQBEQECAR0BLwElTy9PLwErAS8BIAERAQQBCjAEAwsBChIEAQoBBAERASABLwErTy9QLwEnAS8BFAECAQsvBAEKAQMCAgEEAQURBAELAQIBFAEvASdQL1AvASMBLwEcAQEBESAEAQoBCwEKCgQBCgERAQIBFAEdARwBEQEEAQoQBAERAQEBHAEvASNQL00vAS4BLAEvASsBLwEgAREBAwEKHgQBCgEEAQIBBAIRBQsCEQELAQMBAQERASICLwEcAQIBCw8EAQoBAwERASABLwErAS8BLAEuTS9MLwEsAi8BLgEvASMBLwEZAQEBER0EAQoBAwERARQBEQIBAQMFAgEBAQIBEQEUAR8BLwEiAS8BHwECAQsPBAERAQEBGQEvASMBLwEuAi8BLEwvSy8BKAEvASYBHgEvASwBKQErAR8BEQEKHAQBCgEDAREBHwEvAR8BHAEZBRQBGQEcAR0BIAIvASMBLwEgARQBAgELDwQBCgERAR8BKwEpASwBLwEeASYBLwEoSy9JLwIsAS8BIQIWASECLAElAS8BGQEBAREbBAERAQEBHAEvASIDLwEgAy8BIwEiAi8BKwElAi8BHwEUAQIBCw8EAREBAQEZAS8BJQIsASECFgEhAS8CLEkvSC8BKAIvAR4DFgEbAS8BLAEnASsBHwERAQobBAELAQIBFAYvAyMBKQUvAR8BGQELAQIBCxAEAQoBEQEfASsBJwEsAS8BGwMWAR4CLwEoSC9GLwEuASgBLwEhARcFFgEhAS8BLAElAS8BGQEBAREbBAEKAQIBGQIdAR8BIAUvAiABHQEZARQBCwEBAQQBCxAEAREBAQEZAS8BJQEsAS8BIQUWARcBIQEvASgBLkYvRS8BLAIvAR4HFgEXAS8BLAIrASABEQEDAQocBAMCAhEFFAIRAQMBAQECAQQBEREEAQoBAwERASACKwEsAS8BFwcWAR4CLwEsRS9ELwEoAS8BJgEbCRYBHgEvASwBJQEvARwBAQERHAQDCwEEAQMFAgIDAQoBEQELEwQBEQEBARwBLwElASwBLwEeCRYBGwEmAS8BKEQvQi8CLAEvASEMFgEmAiwBIwEvARQBAgERHgQCCgULAgoVBAERAQIBFAEvASMCLAEmDBYBIQEvAixCL0EvASgCLwEeDRYBHgEvASgBKQErASABEQEDAQs6BAELAQMBEQEgASsBKQEoAS8BHg0WAR4CLwEoQS9CLwEhARcPFgEhAiwBJQEvAR0BAgELOgQBCwECAR0BLwElAiwBIQ8WARcBIUIvPy8BLAEmAR4RFgEbAS8BKAEvASMBLwEcAQEBETgEAREBAQEcAS8BIwEvASgBLwEbERYBHgEmASw/Lz4vASwBLwEeExYBIQEvASwBLwEjAS8BGQEBARE2BAERAQEBGQEvASMBLwEsAS8BIRMWAR4BLwEsPi8+LwEuASwBJhMWARsBLwEsAS8BKwEnAS8BGQEBARE0BAERAQEBGQEvAScBKwEvASwBLwEbExYBJgEsAS4+Lz8vASgBLwEeEBYBFwEeASgBLgMvASsBJQEvARkBAQERAQowBAEKAREBAQEZAS8BJQErAy8BLgEoAR4BFxAWAR4BLwEoPy9ALwEsAS8BFw0WARsBIQgvASsBJQEvARkBAQILLgQCCwEBARkBLwElASsILwEhARsNFgEXAS8BLEAvQC8BLAEuASELFgEbASECLwIsBy8BKwEnAS8BHAIDAREsBAERAgMBHAEvAScBKwcvAiwCLwEhARsLFgEhAS4BLEAvQS8BKAEvARsIFgEbASECLwEoASwKLwEtAScBLwEdAREBAgERAQooBAEKAREBAgERAR0BLwEnAS0KLwEsASgCLwEhARsIFgEbAS8BKEEvQS8CLAEhBhYBGwEhAi8CLA4vASMBLwEgARQBAQEDAREmBAERAQMBAQEUASABLwEjDi8CLAIvASEBGwYWASECLEEvQi8BKAEvARsDFgEbASECLwEoASwOLwElASkBLwEjAi8BHAERAQEBBAERIgQBEQEEAQEBEQEcAi8BIwEvAigOLwEsASgCLwEhARsDFgEbAS8BKEIvQi8CLAEhARcBHgEmAi8BKAEsDy8BLQIvASUBLQErASkBLwEgARkBCwECAQQBEQEKHAQBCgERAQQBAgELARkBIAEvASkCKwEoAi8BKw8vASwBKAIvASYBHgEXASECLEIvSC8BKAEsES8BLQEdAR8CLwElAS0BIwIvAR8BGQELAQEBAwIRAQoWBAEKAhEBAwEBAQsBGQEfAi8BIwEvASgCLwEhAR4SLwEsAShIL0UvASwBKAEuES8BJQEvAR8CGAEcASABLwEpASUBKwEjAi8BHwEZAREBAQECAQQCEQELAQoOBAEKAQsCEQEEAQIBAQERARkBHwIvASMBKwEoASwBLwEmAR4BEAEPASEBLwEoES8BLgEoASxFL1kvASkBLwEaAxgBGgEdAi8BJQEpAScBJQIvASABHAEUAREBAgEBAQIBAwEKAxEGCwMRAQoBAwECAQEBAgERARQBHAEgAi8BJQEpASwBKAIvAR4BEAMPARABLwEoWS9YLwElAS8BHwYYARoBHwIvASMBLQEnASMDLwEfAR0BGQEUAREBAwECAgEGAgIBAQIBAwERARQBGQEdAR8DLwEjAScBKwEoAi8BHgEQAg8BEAMPAR4BLwEoWC9YLwIpARoIGAEZAR8CLwErAS8BKwEjAScELwEgAR0BHAIZBhQCGQEcAR0BIAQvAScBIwErAS8BLAIvASEBEAIPARAFDwEQAihYL1cvASUBLQEfCxgBHAEiAS8BLQMvASkCIwEtEC8BLQIjASkDLwErAS8BJgEeARACDwEQBw8BIQEvAShXL1cvASUBLwEZDBgBGgEfAS0BKQYvASsBJQMjBiUDIwElASsGLwEoASsBIQEQAg8BEAcPARABDwEeAS8BKFcvVi8BKQEtAR8NGAEaASABKwEtBy8BKwMnBiUDJwErBy8BKwEsASEBEAEPARALDwEhASsBKFYvVi8BJQEvARoNGAEfAS8BKR4vASgBLwEhCw8BEAEPARsBLwEoVi9VLwEpAS0BHw0YAR0BLwElBy8BJQEvARwMFAEcAS8BJQcvASgBLwEeAQ8BEAsPASEBKwEoVS9VLwEjAS8BGQwYARoBLwElCC8BIwEvARwBAQEDCAIBAwEBARwBLwEjCC8BKAEvARABDwEQCA8BEAEPAR4BLwEoVS9ULwEtASsBIA0YAR8BKwEpCC8BJQEvAR0BAwERCAsBEQEDAR0BLwElCC8BKAEsASEBEAsPARABJgEsAStUL1QvASUBLwEcDBgBHQEvASUJLwElAS8BHQECAQsIBAELAQIBHQEvASUJLwEoAS8BHgEPARAIDwEQAQ8BHgEvAShUL1MvAS0BLwEgDBgBGQEvASMKLwEnAS8BHwERAQQBCgYEAQoBBAERAR8BLwEnCi8BKAEvAR4BDwEQCQ8BEAEmAS8BK1MvUy8BJQEvARwLGAEaASMBKQEtCi8BKwEvASABEQEDAQoGBAEKAQMBEQEgAS8BKwovASsBKAEmARAJDwEQAQ8BHgEvAShTL1MvASsBIwEaCxgBHwEvASkLLwErAS8BIAERAQMBCgYEAQoBAwERASABLwErCy8BKAEvASEIDwEQAg8BEAEmASxTL1MvAS0BKwEjARwJGAEcAS8BIw0vASsBIwEUAQIBCwYEAQsBAgEUASMBKw0vASgBLwEeAQ8BEAMPARACDwEQAR4BJgEsVC9XLwEgARkGGAEaASMBJQEtDS8BJwEvARQBAgELBgQBCwECARQBLwEnDS8BKwEoASYBEAEPARAEDwEeASFXL1UvAS0BJQIvAR8BGgQYAR8BLwEpDi8BJwEvARQBAgELBgQBCwECARQBLwEnDi8BKAEvASEBEAMPARABIQIvAShWL1cvAS0BJQIvAR8BGgEYAR0BLwElDy8BIwEvARkBAQERBgQBEQEBARkBLwEjDy8BKAEvAR4BDwEQAR4CLwEoASxXL1kvAikBLwEjAR0BLwEtEC8BIwEvARkBAQERBgQBEQEBARkBLwEjEC8BLAEvAR4BJgEvAihZL1svASUCLwEtES8BIwEvARkBAQERBgQBEQEBARkBLwEjES8BLAIvAShbL1wvAS0BJRIvASUBLwEdAQIBCwYEAQsBAgEdAS8BJRIvASgBK1wvcC8BJQEvAR0BAgELBgQBCwECAR0BLwElcC9wLwEnAS8BHwELAREGCwERAQsBHwEvASdwL3AvASsBLwEgAREBAgEDBAIBAwECAREBIAEvAStwL3IvASMKHQEjci/wL3MvCiVzL/Av8C/wL/Av8C/wL/AvKy8CKj8vAiofLwEqYi8qLwEnAi8BJD0vASQCLwEkHC8BJwEqAS8BJwEqYC8pLwEqAS8BKgEgPS8BKgEvAiABLwEqGi8BKgIvASBiLygvAScBLwEeAg0BFQInOS8BJwEvARsCDQEbAS8BJxgvAScBLwEeAg0BFQEhAipeLycvAioBIgENAQABCAEAARsBLwEkNy8BJwEvAR4EBwEeAS8BJxYvAioBIgENAQABDAEAARUBLwEkXi8nLwEqAS8BIAENAQgBDAEGARUBLwEiNy8BJAEvARwBBgIMAQYBHAEvASQWLwEqAS8BIAENAQgBDAEGAQ0BLwEnXi8nLwEqAS8BIAENAQcBDAEGARwBLwEkNy8BJAEvAR4BBgEMAQcBDQEhAS8BKhcvAScBKgENAQABDAEAARUBLwEiXi8nLwEqAS8BIAENAQcBDAEGAR4BLwEkNy8BJAEvAR4BBgEMAQcBDQEgAS8BKhcvAScBLwENAQABDAEAARUBLwEiXi8nLwEqAS8BIAENAQcBDAEGAR4BLwEkNy8BJAEvAR4BBgEMAQcBDQEgAS8BKhcvAScBLwENAQABDAEAARUBLwEiXi8nLwEqAS8BIAENAQcBDAEGAR4BLwEkNy8BJAEvAR4BBgEMAQcBDQEgAS8BKhcvAScBLwENAQABDAEAARUBLwEiXi8nLwEqAS8BIAENAQcBDAEGAR4BLwEkNy8BJAEvAR4BBgEMAQcBDQEgAS8BKhcvAScBLwENAQABDAEAARUBLwEiXi8nLwEqAS8BIAENAQcBDAEGAR4BLwEkNy8BJAEvAR4BBgEMAQcBDQEgAS8BKhcvAScBLwENAQABDAEAARUBLwEiXi8nLwEqAS8BIAENAQcBDAEGAR4BLwEkAi8BKgEkBCIBJAEqEC8BJAEiASQTLwEkASIBJwQvASQBLwEeAQYBDAEHAQ0BIAEvASoCLwEnASQEIgEnASoNLwEnAS8BDQEAAQwBAAEVAS8BIgIvASoBJAQiASQBKhkvAScBJAQiAScBKjMvJy8BKgEvASABDQEHAQwBBgEeAS8CJAEnCC8BJwEkDS8BKgMvASoVLwEqAy8BJAEvAR4BBgEMAQcBDQEgAS8BJwEkASoILwEkAScLLwEnAS8BDQEAAQwBAAEVAS8BIgIkCC8BJwEkASoTLwEqASIBKggvASIBJzEvJy8BKgEvASABDQEHAQwBBgEeAScBIgIvASEBHgEbAhUBGwEeASECLwEqAScKLwEqAS8BHgEVAR4BLwEqDi8CKgEvARsBFQEeAS8BKgIvASQBLwEeAQYBDAEHAQ0BIAEkAy8BHwEcARsCFQEbAR4BIAIvASQBKgkvAScBLwENAQABDAEAARUBJwEiAi8BIAEeARsCFQEbARwBHwMvAScRLwEkAy8BHgEcAxUBGwEeASICLwEkASovLycvASoBLwEgAQ0BBwEMAQYBHAIvARwBFQENAQYEAAEGAQ0BFQEcAi8BJAgvASQBLwEcAQYBAAEGARwBLwEkDS8BJAEqARUCAAENAR4BKgEnAS8BJAEvAR4BBgEMAQcBDQEhAS8BIgEbAQ0BDAEGBAABBwENARUBHgIvAScILwEnAS8BDQEAAQwBAAEVAi8BHAEVAQ0BBgUAAQ0BFQEbASIBLwEkDi8BKgEnAS8BIQEbAQ0BCAUAAQcBDQEVAR4CLwEnLi8nLwEqAS8BIAENAQcBDAEAAR4BHwENAQYBAAEHBgwBBwEAAQYBFQEeAS8BJAcvAScBLwENAQABDQEAAQ0BLwEnDC8BKgEvASABDQEIAQ0BAAEVAS8BIgEvASQBLwEeAQYBDAEHAQ0BLwEcAQ0BAAEGAQgFDAEIAQcBAAEIARUBIAEvASQHLwEnAS8BDQEAAQwBAAEbAR8BDQEGAQABBwYMAQcCAAENARwBLwEnDC8BKgIvARsBDQEAAQYBCAUMAQgBBwEAAQgBFQEgAS8BJC0vJy8BKgEvASABDQEHAQgBBwEVAQ0BAAMMAQgBBgIAAQYBCAMMAQABDQEcAS8BJAYvASQBLwEVAQYBDAEGAQ0BLwEnDC8BKgEvASABDQEHAQwBBgEbAS8BJAEvASQBLwEeAQYBDAEHAQ0BFQEHAQYDDAEIAQYCAAEHAQgCDAEIAQABDQEeAS8BJAYvAScBLwENAQABDAEHARUBDQEAAwwBCAEHAgABBgEIAwwCBgEbAS8BJAEqCS8CKgEgARUBAAEHAwwBBwEGAQABBgEHAQgCDAEIAQABDQEeAS8BJywvJy8BKgEvASABDQEHAggBBgEHAgwBBwEAAQgEDQEIAQABBwIMAQcBAAEbAS8BJAUvASIBLwEbAQABDAEAAQ0BLwEnDC8BKgEvASABDQEHAQwBBgEeAS8BJAEvASQBLwEeAQYBDAIIAQABCAIMAQYBAAEMBA0BBwEAAQgCDAEGAQ0BHgEvAScFLwEnAS8BDQEAAQwBCAIHAgwBBwEAAQgEDQEMAQABBgMMAQABFQEvASQILwEqAScBIAENAQADDAEAAQYFDQEHAQABCAIMAQYBDQEeAS8BJysvJy8BKgEvASABDQEHAggBDAEIAQwBAAENARUBHgEiAi8BIgEeARUBDQEAAgwBCAEHAR4BLwEnBC8BIgEvARUBAAEMAQABDQEvAScMLwEqAS8BIAENAQcBDAEGARwBLwEkAS8BJAEvAR4BBgEMAggCDAEIAQABDQEbAR8DLwEgAR4BFQEIAQYCDAEGAQ0BIAEnASoELwEnAS8BDQEAAQwBCAEMAQgBDAEAAQ0BFQEeASACLwEiAR8BGwENAQABCAIMAQABGwEvASQHLwEkAS8BFQEAAgwBBwEGAQ0BHAEhAy8BIAEeARUBCAEGAgwBBgENASABJwEqKi8nLwEqAS8BIAENAQcDCAEMAQABFQEhAy8CJwMvASEBFQEAAgwBBwENASABJwEqAy8BIgEvARUBAAEMAQABDQEvAScMLwEqAS8BIAENAQcBDAEGAR4BLwEkAS8BJAEvAR4BBgEMBAgBBgEVASICLwEqAicDLwEeAQ0BAAIMAQABFQEvASQELwEnAS8BDQEAAQwCCAEMAQABFQEhAy8CJwMvASIBFQEGAQgBDAEIAQcBHgEvAScFLwEkAS8BGwEAAgwBBwENARwDLwEqAicDLwEeAQ0BAAIMAQABFQEvASQqLycvASoBLwEgAQ0BBwIIAQwBAAEVAi8BIgEnASoCLwEqAScBIgIvARUBAAIMAQABFQEvASQDLwEiAS8BFQEAAQwBAAENAS8BJwwvASoBLwEgAQ0BBwEMAQYBHgEvASQBLwEkAS8BHgEGAQwDCAEGARsBLwEqASIBKgMvASoBJwEiAS8BIAENAQYCDAEGAR4BLwEkAy8BJwEvAQ0BAAEMAQgBDAEAARUCLwEiAScBKgIvAioBIgEqAS8BGwEGAQgBDAEGAQ0BLwEnBC8CKgEhAQ0BBwEMAQcBDQEeAS8CJAEqAy8BKgEnASIBLwEgAQ0BBgIMAQYBHgEvASQpLycvASoBLwEgAQ0BBwEIAQwBBgENASoBJAEnCC8BJwEkASoBDQEGAQwBBwENASEBLwEqAi8BIgEvARUBAAEMAQABDQEvAScMLwEqAS8BIAENAQcBDAEGAR4BLwEkAS8BJAEvAR4BBgEMAQgBDAEAARUBLwEiASoILwEiAS8BHwEMAQcBDAEGAQ0CJwMvAScBLwENAQACDAEGAQ0BKgEkAScILwEqASIBLwEVAQACDAEHAR4BLwEkAy8BIgEvARUBAAIMAQYBHAEvASIJLwEiAS8BHwEMAQcBDAEGAQ0CJykvJy8BKgEvASABDQEHAQgBDAEHAR4BLwEkCi8BJAEvAR4BBwEIAQwBAAEbAS8BIgIvASIBLwEVAQABDAEAAQ0BLwEnDC8BKgEvASABDQEHAQwBBgEeAS8BJAEvASQBLwEeAQYBDAEIAQcBDQEgASQBKgovASIBLwEVAQABDAIIAR4BLwEnAi8BJwEvAQ0BAAIMAQcBHgEvASQKLwEqASQBIAENAQcBDAEAARUBLwEkAy8BKgEiAQ0BBwEMAQYBFQEvASILLwEiAS8BFQEAAQwCCAEeAS8BJygvJy8BKgEvASABDQEHAQwBBgENAS8BJwwvAScBLwENAQYBDAEAARUBLwEkAi8BIgEvARUBAAEMAQABDQEvAScMLwEqAS8BIAENAQcBDAEGARwBLwEkAS8BJAEvAR4BBgIMAQABFQEvASILLwIqASEBDQEHAQwBAAEbAS8BIgIvAScBLwEVAQABDAEGAQ0BLwEnDC8BIgEvARUBAAEMAQcBDQEiASoCLwEnAS8BHgIIAQwBBgEcASoBJAsvAScBKgEhAQ0BBwEMAQABGwEvASIoLycvASoBLwEgAQ0BBwEMAQABFQEvASIMLwEiAS8BFQEAAQwBBgENASIBKgIvASIBLwEVAQABDAEAAQ0BLwEnDC8BKgEvASABDQEHAQwBBgEeAS8BJAEvASQBLwEeAQYCDAEGAR4BKgEkDC8BJwEvARUBAAEMAQABFQEvASICLwEqASIBDQEGAQwBAAEVAS8BIgwvASQBKgEeAQYBDAEIAQwBHwEvAScBLwEkAS8BHAEAAQwBBwENASABLwEqDC8BJwEvARUBAAEMAQABFQEvASIoLycvASoBLwEgAQ0BBwEMAQYBHAEvASQMLwEkAS8BHAEGAQwBBwENASABLwEqAS8BIgEvARUBAAEMAQABDQEvAScMLwEqAS8BIAENAQcBDAEGARwBLwEkAS8BJAEvAR4BBgEMAQcBDQEhAS8BKgwvASIBLwEVAQABDAEAAQ0BLwEnAS8BKgEvASABDQEHAQwBAAEVAS8BIgwvASoBLwEhAQ0BBwEMAQYBHAEvASQBLwEiAS8BFQEAAQwBBgENASoBJw0vAScBIgENAQYBDAEAAQ0BLwEnKC8nLwEqAS8BIAENAQcBDAEGAR4BLwEkDC8BJAEvAR4BBgEMAQcBDQEgAS8BKgEvAScBLwENAQABDAEAAQ0BKgEnDC8BKgEvASABDQEHAQwBAAEVAS8BIgEvASQBLwEeAQYBDAEHAQ0BIAEvASoMLwEiAS8BFQEAAQwBAAENAS8BJwEvASoBLwEgAQ0BBwEMAQABFQEvASIMLwEqAS8BIAENAQcBDAEGAR4BLwEkAS8BIgEvARUBAAEMAQABDQEvAScMLwEqAS8BIQENAQcBDAEAAQ0BLwEnKC8nLwEqAS8BIAENAQcBDAEGARwBLwEkDC8BJAEvARwBBgEMAQcBDQEgAS8BKgEvASQBLwEVAQABDAEAARUBLwEnDC8BKgEvASABDQEHAQwBBgEcAS8BJAEvASQBLwEeAQYBDAEHAQ0BIQEvASoMLwEiAS8BFQEAAQwBAAENAS8BJwEvASoBLwEgAQ0BBwEMAQABFQEvASIMLwEqAS8BIQENAQcBDAEGARwBLwEkAS8BIgEvARUBAAEMAQYBDQEqAScNLwEnASIBDQEGAQwBAAENAS8BJygvJy8BKgEvASABDQEHAQwBAAEVAS8BIgwvASIBLwEVAQABDAEGAQ0BIgEqAi8BIgEvARsBBgEMAQcBDQEhAioLLwEkASoBHgEHAQgBDAEGAR4BLwEkAS8BJAEvAR4BBgIMAQYBHgEqASQMLwEnAS8BFQEAAQwBAAEVAS8BIgIvASoBIgENAQYBDAEAARUBLwEiDC8BJAEqAR4BBgEMAQgBDAEfAS8BJwEvASQBLwEcAQABDAEHAQ0BIAEvASoMLwEnAS8BDQEAAQwBAAEVAS8BJCgvJy8BKgEvASABDQEHAQwBBgENAS8BJwwvAScBLwENAQYBDAEAARUBLwEkAi8BJAEvARwBBgIMAQABGwEnASILLwEiAS8BFQEAAgwBBgEcAS8BJAEvASQBLwEeAQYCDAEAARUBLwEiCy8CKgEhAQ0BBwEMAQABGwEvASICLwEnAS8BFQEAAQwBBgENAS8BJwwvASIBLwEVAQABDAEHAQ0BIgEqAi8BJwEvAR4CCAEMAQYBHAEqASQLLwEnASoBIQENAQcBDAEAARUBLwEiKC8nLwEqAS8BIAENAQcBCAEMAQcBHgEvASQKLwEkAS8BHgEHAQgBDAEAARsBLwEiAi8BKgEvASEBDQEHAQwBBgEVAS8BIgovAScBKgEhAQ0CCAEMAQYBHgEvASQBLwEkAS8BHgEGAQwBCAEHAQ0BIAEkASoKLwEiAS8BFQEAAQwCCAEeAS8BJwIvAScBLwENAQACDAEHAR4BLwEkCi8BKgEkASABDQEHAQwBAAEVAS8BJAMvASoBIgENAQcBDAEGARUBLwEiCy8BIgEvARUBAAIMAQABFQEvASIoLycvASoBLwEgAQ0BBwEIAQwBBgENASoBJAEnCC8BJwEkASoBDQEGAQwBBwENASEBLwEqAy8BJwEvARUBBgEMAQgBBwEcAS8BIggvAicBLwEVAQcBDAEIAQwBBgEeAS8BJAEvASQBLwEeAQYBDAEIAQwBAAEVAS8BIgEqCC8BIgEvAR8BDAEHAQwBBgENAicDLwEnAS8BDQEAAgwBBgENASoBJAEnCC8BKgEiAS8BFQEAAgwBBwEeAS8BJAMvASIBLwEVAQACDAEGARwBLwEiCS8BIgEvAR8BDAEHAQgBDAEAARUBLwEiKC8nLwEqAS8BIAENAQcCCAEMAQABFQIvASIBJwEqAi8BKgEnASICLwEVAQACDAEAARUBLwEkBC8BJwEvAR4BDAIIAg0BHgEvAScBJAIqAS8BKgEnASQBLwEqARUBAAMIAQwBBgEeAS8BJAEvASQBLwEeAQYBDAMIAQYBGwEvASoBIgEqAy8BKgEnASIBLwEgAQ0BBgIMAQYBHgEvASQDLwEnAS8BDQEAAQwBCAEMAQABFQIvASIBJwEqAi8CKgEiASoBLwEbAQYBCAEMAQYBDQEvAScELwIqASEBDQEHAQwBBwENAR4BLwIkASoDLwEqAScBIgEvASABDQEGAQwBCAEMAQABFQEvASIoLycvASoBLwEgAQ0BBwMIAQwBAAEVASEDLwInAy8BIQEVAQACDAEHAQ0BIAEnASoFLwEkAS8BFQEGAQwBDQEHAQ0BHAEnAy8BKgMvASEBFQEGAQwDCAEMAQYBHgEvASQBLwEkAS8BHgEGAQwECAEGARUBIgIvASoCJwMvAR4BDQEAAgwBAAEVAS8BJAQvAScBLwENAQABDAIIAQwBAAEVASEDLwInAy8BIgEVAQYBCAEMAQgBBwEeAS8BJwUvASQBLwEbAQACDAEHAQ0BHAMvASoCJwMvAR4BDQEAAQwCCAEMAQABFQEvASIoLycvASoBLwEgAQ0BBwIIAQwBCAEMAQABDQEVAR4BIgIvASIBHgEVAQ0BAAIMAQgBBwEeAS8BJwYvASoBJAEqAQ0BAAEMAQgBDQEIAQ0BHAEfASABLwEgAR4BGwENAQgBDQQIAQwBBgEcAS8BJAEvASQBLwEeAQYBDAIIAgwBCAEAAQ0BGwEfAy8BIAEeARUBCAEGAgwBBgENASABJwEqBC8BJwEvAQ0BAAEMAwgBDAEAAQ0BFQEeASACLwEiAR8BGwENAQABCAIMAQABGwEvASQHLwEkAS8BFQEAAgwBBwEGAQ0BHAEhAy8BIAEeARUBCAEGAQwDCAEMAQABFQEvASIoLycvASoBLwEgAQ0BBwIIAgcCDAEHAQABCAQNAQgBAAEHAgwBBwEAARsBLwEkCC8BKgEkASABFQEAAQwCCAEABg0BDAIIAQwBCAEHAggBDAEGAR4BLwEkAS8BJAEvAR4BBgEMAggBBgEIAgwBBgEAAQwEDQEHAQABCAIMAQYBDQEeAS8BJwUvAScBLwEVAQABDAEIAgcCDAEHAQABCAQNAQwBAAEGAwwBAAEVAS8BJAgvASoBJwEgAQ0BAAMMAQABBgUNAQcBAAEIAgwBBwIIAQwBAAEbAS8BIigvJy8BKgEvASABDQEHAQwBBwEVAQ0BAAMMAQgBBgIAAQYBCAMMAQABDQEcAS8BJAovASoBLwEgARUBAAEIBAwBBwEGAQcEDAEGAQgBGwENAQcBDAEGARsBLwEkAS8BJAEvARwBBgEMAQgBDAEVAQgBBgMMAQgBBgIAAQcBCAIMAQgBAAENAR4BLwEkBS8CKgEiAQ0BBwEMAQcCDQEAAwwBCAEHAgABBgEIAwwCBgEbAS8BJAEqCS8CKgEgARUBAAEHAwwBBwEGAQABBgEHAQgCDAEIAQACDQEHAQwBBgEVAS8BJCgvJy8BKgEvASABDQEIAQ0BAAEbASEBDQEGAQABBwYMAQcBAAEGARUBHgEvASQMLwEnAi8BHAENAQABBgEHAQgDDAEIAQcBAAEGAQ0BHgEnAQ0BBwENAQABFQEvASIBLwEkAS8BHgEAAgwBAAIeAQ0BAAEGAQgFDAEIAQcBAAEIARUBIAEvASQGLwEqAS8BIAEMAQgBDQEAARUBHwEVAQYBAAEHBgwBBwIAAQ0BHAEvAScMLwEqAi8BGwENAQABBgEIBQwBCAEHAQABCAEVASEBDQEHAQ0BAAENAS8BJygvKC8BJAEqARUCAAENAR4CLwEcARUBDQEGBAABBgENARUBHAIvASQOLwEqAScBLwEfARsCDQEHAQYBBwEGAQcBDQEVARwCLwEiARUCAAENAR4BKgEnAS8BKgEnASABDQIAAQ0BIAEvASIBGwENAQwBBgQAAQcBDQEVAR4CLwEnCC8BJAEqARUCAAEGARwCLwEcARUBDQEGBQABDQEVARsBIgEvASQOLwEqAScBLwEhARsBDQEIBQABBwENARUBHgIvARUCAAEGARwBLwEkKC8oLwIqAS8BGwEVAR4BLwEkASoCLwEhAR4BGwIVARsBHgEhAi8BKgEnES8BJAMvASEBHgEcAR4BHAEeASADLwEkASoBLwEbARUBHgEvASoDLwEqAS8BIAIbASABLwEiAy8BHwEcARsCFQEbAR4BIAIvASQBKgkvASoCLwEcARUBHgEvAScBKgIvASABHgEbAhUBGwEcAR8DLwEnES8BJAMvAR4BHAMVARsBHgEiAi8BJAEnAS8BHAEVAR4BLwEqKS8uLwEqAi8BJAEnCC8BJwEkFC8BJwEiAScHLwIkBy8BKgwvASoBJAEqCC8BJAEnES8BKgIvAiQILwEnASQBKhMvASoBIgEqCC8BIgEnBi8BKiovKy8BJAEiAScFLwEqASQEIgEkASoZLwEqAiQBJwEkAScBKgYvASQBIgEnBy8BKgIiASoFLwEnASQEIgEnASoQLwEkASIBJwUvASoBJAQiASQBKhkvAScBJAQiAScBKgUvASQBIgEnKy/wL/Av8C/wL/Avni8BJwEjUC+rLwIjQy+cLwEpAS8BHwEcASNPL5svAisBIAERAQEBHAEvASMGLwIrAhwCK0Evmy8BKwEvASABEQECAR0BLwElBS8BIwEvARwCAQEcAS8BI0AveS8CKwMvAisBLQcvASsCJQEpAi8BJwEtBS8BLQIrAS0CLwErAS8BIAERAQIBHQEvASMCKwMvASMBLwEcAgEBHAEvASMBKwEvBCsJLwEtAystL3cvASsBJQIvASsBIwElAy8BJQQvASsBJQQvAiUFLwEpASMELwEjAisBLwEgAREBAgEdASUDLwErASUCLwErAScCHQInAi8BIwQvASMBKwUvASsBIwQvASMBKysveS8CIAMvASIBIAEtAS8BJwIvASsCLwEgAh0BIAIvAR8BJQIvASkCLwElAiABJQIvASsBLwEgAREBAgEfAS8DIAIvASsBLwErAS8CIAIvAR8BIAEvASMCIAEiAi8BJwMvASsCLwElAiABIgIvASsqL3UvAisBIAEZAhEBFAEcARkCEQEUAR0BLwEpASsBLwEgARkBEQICAREBGQEcAQEBGQEvASMBLwEfARkBFAIRARQBGQEgAS0BLwEgAREBAwEcARQDEQEUAR0BLwEjASsBHwIRASABHQEBARQBGQEUAxEBGQEgAS8BJwEvASsBLwEgARkBFAMRARkBIAEvASkpL3UvAScBKwEUAQECAgEBAgIBAQECAQEBAwEdAS8BJQEgARQCAQIRAQIBAQEDAQIBFAIvAR8BEQIBAgICAQEUASIBLwEgARECBAIBAgICAQEZAi8BHQECAQsBIAEZAQEBAwECAQECAgIBAREBHwEvASMBKQEgARQCAQICAgEBFAEgAisoL3QvASUBLwEdAQMBEQEcAR0BFAEDAREBHAEdARQBAQEUASsBLwEZAQEBEQEcAR8BIAEdARQBBAECARQBLwEgARQBAQERARwCHQEZAQEBFAEiAS8BIAERAQQBAwEUAx0BFAECAQsBHAEtAR0BAgERAS8BHAEBAhEBGQIdARwBEQEBARQBIAEnASsBFAEBAQMBGQIdARkBAwEBARQBIwEpKC90LwEjAS8BGQEBAREBIgEvARwBAQERASIBLwEcAQEBEQEjAR8BEQECAR0ELwEfAREBAgEUAS8BHAEBAREBHQQvAR0BIAIvASABEQEDAREBHwQvARQBAQERAS8BHQECAREBKwEcAQIBAwEZBC8BHQERAQEBHAEvAR0CAwEcBC8BHQERAQIBHQEvASUnL3QvASMBLwEZAQEBFAEjASUBHQECAREBIAElAR0BAgERAS8BHAEBARQBKwEjAScBKwEjAS8BGQEBARQBLwEUAQEBGQEvASMCJQEpAi8BKwEvASABEQEBARkBLwEjASUBIwEvAR8BEQECAh8BAQERAS8BHAEBAREBIAErASMBJQEjAS8BGQEBARQBLwEZAQEBEQUZARwBEQEBARwBLwEjJy90LwEjAS8BGQEBARQCLwEdAQIBEQEgAS8BHQECAREBLwEZAQEBFAErAScCLwEjASUBHAEBARQBLwEUAQEBHAElASMCLwEtASMBJwErAS8BIAERAQEBHAErASMBLwErAS8BIAERAQEBHAEfAQEBEQEvARwBAQERASABLQErAS8BIwEpARwBAQERASMBFAECAQoGAQECAQEBFAEvASUnL3QvASMBLwEZAQEBFAIvAR0BAgERASABLwEdAQIBEQEvARwBAQEUASsBIwEnASsBIwEvARkBAQEUAS8BFAEBARkBLwEjAiUBKQIvASsBLwEgAREBAgEdAS8BJQEvASsBLwEgAREBAQIfAQEBEQEvARwBAQEUASkBJwIvASMBLwEZAQEBFAEvARkBAQERCBQBHQEvASknL3QvASMBLwEZAQEBFAIvAR0BAgERASABLwEdAQIBEQEiAR8BEQECAR0ELwEfAREBAgEUAS8BHAEBAREBHQQvAR0BIAIvASABEQECAR0BLwElAS8BKwEvASABEQEBAh8BAQERASsBHAEBARQBLwEnAi8BIwEvARkBAQEUAS8BHQEBAQsBHQQvAR0BGQEiAS8BKygvdC8BIwEvARwBAQEUAi8BHQECAREBIAEvAR0BAgERASABLwEZAQEBEQEcAR8BIAEdARQBBAECARQBLwEgARQBAQERARwCHQEZAQEBFAEiAS8BIAERAQIBHQEvASUBLwErAS8BIAERAQECHwEBAREBLwEcAQEBFAEvAScCLwEjAS8BHAEBARQBLwEiARQBAgEDARkCHQEZAQQBAQEZASkBIygvdC8BIwEvARkBAQEUASIBLwEcAQEBEQEgAS8BHAEBAREBIAEvASABFAIBAhEBAgEBAQMBAgEUAi8BHwERAgECAgIBARQBIgEvASABEQEBARwBLwEjAS8BKwEvASABEQEBAR0BHwEBAQsBIAEcAQEBFAEiAisBLwEjAS8BGQEBARQBIgEvASABFAIBAgICAQEUAR8CKygvdC8BJQEvAR0BAQEUASIBLQEdAQEBFAEiAS0BHQEBARQBIgEpAS8BIAEZARECAgERARkBHAEBARkBLwEjAS8BHwEZARQCEQEUARkBIAEvASkBIgEUAQEBHQEvASUBLwErASkBIgEUAQEBHQEgAhEBIAEdAQEBFAEiAisBLwElAS8BHQEBARQBIgEnAS8BIAEZARQCEQEUARkBIAEvASspL3cvAR8BIAEvASsBLwEfASABLwErAS8BHwEgAS8CKwIvASACHQEgAi8BHwElAi8BKQIvASUCIAElAy8BKwEvASABHwUvASsBLwEgAR8CLwIfAi8BHwEgAS8BKwUvAR8BIAEvAisCLwEnAiABJQIvASsqL3YvASsELwErBC8BKwUvASsBJQQvAiUFLwEpASMELwEjASsFLwErCC8CKwIvAisILwErBS8BKwEjBC8BIwErKy93LwElASsDLwElASsDLwElASsFLwErAiUBKQIvAScBLQUvAS0CKwEtBS8BKwElBy8BKwElAi8CJwIvASUBKwcvASUBKwUvAS0CKwEtLS/wL/Av8C/wL/Av8C/wL/Av8C/wL/Av8C/wLwAAAABCTlMxBQEDAgl8WgJTQVcgTU9USU9OAABOQUhVU0gAAAAAAABAAAAAWEBAAAAtAABAQAAAFAABPUAAQAAUAF9/PgBffz4BPQNPAW4FeAh4DHgAAAAAAAAAAQD/QO/A5kDf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UgBFANIAiQBTAEoA0wCKAFQASgDUAIoAVQBHANUAiwBVAFAA1gCKAFYAQQDXAIsAVwBGANcAjQBYAEIA2ACMAFkAUwDZAIsAWgBLANoAjgBaAEAA2wCPAFsAWgDcAJMAXABaANwAjQBdAFQA3QCPAF4ATwDeAI4AXwBSAN8AkgBfAEUA4ACPAGAAVADhAJEAYQBcAOIAkABiAFMA4gCaAGMAVgDjAJUAZABeAOQAjABkAFgA5QCRAGUASgDmAJIAZgBKAOcAkABnAF0A5wCdAGgAKgDoAJgAaQBWAOkAlwBpAEsA6gCTAGoAQwDrAI8AawBKAOwAlQBsAFMA7ACYAG0AUQDtAJEAbgBqAO4AlwBvAEYA7wCVAG8ATwDwAIwAcABWAPEAlQBxAG0A8QCeAHIASQDyAKAAcwBTAPMAjAB0AF0A9ACVAHQAcgD1AK8AdQB888DCQHhIskC4wahAl8CiQabBnUGSwJhBnMGVQY7AkkGUwY9BicGNQY/CikGGwYhBisKGQoPBhUKGwoNCgMGCQoPCgEJ9wn9CgMN+QnvCfEJ+w3tDecJ6Q3vDeUN3wnhDecN3Q3XDdkN3xHZDdMN1Q3bEdERyw3NEdMRyRHHDckRyxHFEb8RwRHHFcERuxG9FcMVuRW3EbkVuxW1FbMRsRW3FbEVrxWtFbMZrRWrFakZrxmpGacVpRmrGaUZoxWhGacZoRmfGZ0Zox2dGZsZmR2fHZkdlxmZHZsdlR2TGZUdlx2RHZMdkR2TIZEdjx2NIZMhjSGLHYkhjyGJIYcdiSGLIYUhhyGFIYclhSGDIYElhyWBJX8hgSWDJX0lfyF9JX8lfSV7JXklfyl5JXsleSl7KXUpdyV1KXcpdSlzJXUpdylxKXMpcSlzLXEpbylxLXMtbS1vKW0tby1tLWstaS1vLWktay1pLWsxaS1nLWUxazFlMWctZTFnMWUxYzFhMWcxYTFjMWExYzVhMV8xYTVjNV01XzFdNV81XTVfNV01XzVZNVs1WTVbOVk1WzVZOVs5WTlXNVU5WzlVOVc5VTlXOVU5VzlVOVc9UTlTOVE9Uz1RPVM5UT1TPVE9Tz1RPVM9TT1PPU09T0FNPU89TUFPQU1BSz1JQU9BSUFLQUlD3wNJA3sDCQNLAuEDKwLJBxMGtQcDBqEG8waVBuMGiQbbBn0GzwZ1BscGaQa/BmEKtwpdCq8KVQqnCk0KowpJCpsKQQqXCj0Kkwo5CosKNQqHDi0Ogw4pDn8OJQ57DiEOdw4dDnMOGQ5vDhkOaw4VDmsSERJnEg0SYxIJEl8SCRJfEgUSWxIBElcSARJXEf0SUxX5Fk8V+RZPFfUWSxX1FkcV8RZHFe0WQxXtFkMV6Ro/GekaPxnlGjsZ5Ro7GeEaNxnhGjcZ3RozGd0aMxndHjMd2R4vHdkeLx3VHisd1R4rHdEeJx3RHicd0R4nHc0eIyHNIiMhySIjIckiHyHJIh8hxSIbIcUiGyHFIhshwSIXJcEmFyXBJhclvSYTJb0mEyW9JhMluSYTJbkmDyW5Jg8puSoPKbUqCym1KgsptSoLKbEqBymxKgcpsSoHKbEuBy2tLgMtrS4DLa0uAy2tLgMtqS3/Lakt/y2pLf8tqTH/MaUx+zGlMfsxpTH7MaUx+zGhMfcxoTH3MaEx9zGhMfc1nTX3NZ018zWdNfM1nTXzNZ018zWZNe81mTXvNZk17zmZOe85lTnvOZU56zmVOes5lTnrOZU56zmVOes5kTnnPZE95z2RPec9kT3nPZE95z2NPec9jT3jPY094z2NQeNBjUHjQYlB40GJQd9BiUP/AAKnmwABH2sAAu9LAAEDMwQBLx8EAwMTBAMDAwQCtvcEAwLvBAPq4wQBAtsEAE7TCALOzwgBAscIAQK/CAECuwgAorcIAvavCAFOqwgDDqcMAaKjDAECnwwBApsMAAKXDAMCkwwDAo8MAyqLDAEChxAAAocQAQKDEAECfxAAAnsQAQJ7EAACdxABAnMQAQJzFAMWbxQAAmsUAAJrFAACZxQDAmcUAAJjFACCYxQAAl8YAQJfGAACWxgAAlsYAAJXGAACVxgAAlMYAAJTGAACTxwBAk8cAAJLHAMCSxwAAkscAAJHHAACRxwAAkMcAAJDIAECQyAAAj8gAwI/IAACPyADTjsgAAI7IAACOyAAAjckAAI3JAACNyQDTjMkAAIzJAACMyQAAi8kAAIvJAACLygAAisoAAIrKAACKygAAisoAIInKAACJygAAicoAAIjLAACIywAAiMsAAIjLAACHywAAh8sAAIfLAACHywAAhswAAIbMAACGzAAAhswAAIXMAACFzAAAhcwAAIXMAACFzQAAhM0AAITNAACEzQAAhM0AAIPNAACDzQAAg80AAIPOAACDzgAAgs4AAILOAACCzgAAgs4AAILOAACBzgAAgc8AAIHPAACBzwAAgc8AAIDPAACAzwAAgM8AAIDPAACA0AAAgNAAAH/QAAB/0AAA+NXnwN6rAELT1c7Ay6sAtsXWwsHArADAvNa6wbmsAMC21rXBtKwAYbHWsMGvrADArdeswqutAECq16nCqK0AbafXpsKlrQBApNejwqOtAPKi2KHDoa4AAKDYn8OfrgBAntidw52uAC2c2JvDm64AU5rZmcSZrwBAmdmYxJivAACX2ZbElq8AQJbZlcSVrwBAldqUxZSwAECT2pPFk7AAQJLakcWSsAAAkdqQxZCwAGCQ24/Gj7EA9Y/bjsaOsQAAjtuNxo2xAACN24zGjbEAwIzcjMeMsgAAi9yLx4uyAACK3IrHirIAQIrciceJsgAAid2IyImzAECI3YjIiLMAAIfdh8iHswAAh92GyIazAACG3obJhrQAAIXehcmFtAAAhd6EyYS0AMCE3oTJhLQAAITfg8qDtQDAg9+CyoO1AACC34LKgrUAAILfgcqCtQAAgeCBy4G2AACB4IDLgLYAAIDggMuAtgAAgOB/y3+2AAB/4X/Mf7cAAH/hfsx/twAAfuF+zH63AAB+4X3MfrcAAH3ifc19uAAAfeJ8zX24AAB84nzNfLgAAHzifM18uAAAfON7znu5AAB743vOe7kAAHvjes57uQAAeuN6znq5AAB65HrPeroAAHrkec96ugAAeeR5z3m6AAB55HnPeboAAHnleNB4uwAAeOV40Hi7AADr7Ofa4czbwNa1zqa+lGWBuO3C28PNwsHAtrunrZVlgqjutNy2zrbDtbewqKSWZYOf76vdrs+uw624qamel2WEmO+k3qjQqMWouaSqmZhlhZLwn9+j0aTFo7qgq5WZZYaN8Zvgn9Ggx6C7naySmWWHifKX4JvSncidvJqtj5pliIXylOGY05rImr2XrY2bZYmC85HildSXype+la6LnGWKf/SO45PVlcqVv5OviZ1li3z0jOSR1pPMk8CRsIeeZYx59YnkjteRzJHBj7GGn2WNdvaH5YzYj82Qwo6yhKBljnT2heaL2Y3PjsKMs4OgZY9x94PnidqLz43Di7SCoWWQb/eB6IfbitCMxIq1gaJlkW34f+iG3InRisWJtYCjZZJq+H7phN2H04nGh7Z/pGWTaPh86oPehtSIx4a3fqVllGb4e+uB34XVh8iFuH6mZZVk+XnrgOCE1obJhbl9p2WWYfl37H/gg9aFyoS6fKhll1/5du194YHXhMuDu3upZZhd+XXufOKA2IPMgrx7qWWZW/hz7nvjf9qCzYG9eqplmlj4cu965H/agc6BvnqrZZtW93DweeV+24HPgL95rGWcU/Zv8Hjmfd2A0H+/ea1lnVH1bvF353zdf9F/wHiuZZ5P9Gzxduh7337SfsF4r2WfTPJr8nXpet9+037Cd7BloOnw5+Dk0N/A2LHOobyRaYG18cHhxdHFwcKyuqKrkmmCpvKz4rnSusO3s7CjopNpg5zzq+Ow07LDsLSppJyUaYSV9KTkqtSsxaq1pKWXlWmFj/Wf5aXVp8WmtqCmk5Zphor2muah1qPHorecp5CXaYeG95fnntegyJ+4maiOmGmIgviT6JvYncicuZepi5lpiX75kOmY2ZvKmrqVqomaaYp7+o7qldqYype7k6uIm2mLd/uL65PblsyVvJGshpxpjHT8ieyR3JTMlL2PrYWdaY1x/Yftj92SzZK+jq6DnmmObv6F7o3ekc+Qv4yvgp9pj2v/g++M34/Pj8CLsIGgaZBpAIHwiuCO0I3BirGAoWmRZgF/8YjhjNGMwoiyf6JpkmMCffKH4ovTi8OHs3+jaZNgA3vzheOK1IrEhrR+pGmUXQR69ITkiNWJxYW1faVplVoFePWD5YfWiMaFtnymaZZWBnf2guaG1ofHhLd8p2mXUwd194DnhdeGyIO4e6hpmE8IdPh/6ITYhcmCuXupaZlLCXL5fumD2oTKgbp6qmmaRwpx+n3qgtqDy4G7eatpm0ILb/t864HbgsyAvHmsaZw7DG78e+yA3YLNf714rWmdNA1t/Xrtf92Bzn++eK5pnikOa/557n/fgM9+v3ivaZ8XD2r/eO9+33/QfcB3sGmgAAAAAEJOUzEFAQEC1SdaEFNJUkVOAAAAAAAAAEFCU1RSLiBNQUdFAEAAACsrQEAAAC0AAEBAAAAUAAVkDwBAQBRBX39UAF9/PgE8AgABbgV4CHgMeAAAAAAAAAAIAPnAycAAWgCLAA8AdQD3AGMAhgDuAIYAsQBSAAoAlQC/ABcANQBlAGgADQCgAKwAGwBjAFsAdgDTAAkAcAC0ANUAOAAdANUAMAC+APAAOQCjAG0ABQCKANQAOwA6AO8AkgCTAKMAXgBPAPcACgDtAIsAjwAmALsA6ABcAJAAVACYAPoAGQC4ACkA/ADFANYANwBqAI8AKQDYAEUANwDLAKYAjQAtAOoAdgAvALUAEQBZAKoA+ABDABEAAQCsANgARgDEANEAgABwADUASQDgALgAaAAJAFwASgC9AIoAIwD/APIAugAFADUAtgC+AIYAWgDsAJwAWQAfAOMACgAIANAA6QAYAGUAYgDKADQA4ABhAEQA4QDTAJkAbgA8ANAAyQBIADYAiwDxADsA5wAUACwAuwBeAFkAlgDwAIYANQD8ANYAqQCSAEcAPwBEAEsAnACpALMAdQAhAOcAGgCaAP0ACgB6AF4AjgCxABsAuwCuAHcAFQAEAFsAgABUAA0AFwAvAMsAkwBPADUAsQA/ABgAAwCaAK4A1QBTAFwAAQCiAJcAMAAjAFYAZgDDAI4AWQChABoAwgC/AEMAQwCDAKoA/AAeALgAowCPAJgAFQDrAFAAVwBMAPYANACcAMcA2QBEAIAAvAC7ADMAVwDOACsARQDVAKEA4wCeAGUAugB8/cANgdbAABO2wACAbUEAWGLCAIFYQgA3UcMAgUpDADxExACCP0QAOzrEAIM2RQBDMsUAgy9GAEMrxgCDKEYAOyXHAIMjRwBBIMgAhB5IAEMbyACEGUkATBfJAIUVSgA+E8oAhRFLAEAQywCGDksASAzMAIYLTABLCc0AhwhNAEkGzQCHBU4APwDOAIgATwBLAM8AiABQAEgA0ACJAFAASwDRAIgAUQBLANIAigBSAEUA0gCJAFMASgDTAIoAVABKANQAigBVAEcA1QCLAFUAUADWAIoAVgBBANcAiwBXAEYA1wCNAFgAQgDYAIwAWQBTANkAiwBaAEsA2gCOAFoAQADbAI8AWwBaANwAkwBcAFoA3ACNAF0AVADdAI8AXgBPAN4AjgBfAFIA3wCSAF8ARQDgAI8AYABUAOEAkQBhAFwA4gCQAGIAUwDiAJoAYwBWAOMAlQBkAF4A5ACMAGQAWADlAJEAZQBKAOYAkgBmAEoA5wCQAGcAXQDnAJ0AaAAqAOgAmABpAFYA6QCXAGkASwDqAJMAagBDAOsAjwBrAEoA7ACVAGwAUwDsAJgAbQBRAO0AkQBuAGoA7gCXAG8ARgDvAJUAbwBPAPAAjABwAFYA8QCVAHEAbQDxAJ4AcgBJAPIAoABzAFMA8wCMAHQAXQD0AJUAdAByAPUArwB1AHzzwMJAeEiyQLjBqECXwKJBpsGdQZLAmEGcwZVBjsCSQZTBj0GJwY1Bj8KKQYbBiEGKwoZCg8GFQobCg0KAwYJCg8KAQn3Cf0KAw35Ce8J8Qn7De0N5wnpDe8N5Q3fCeEN5w3dDdcN2Q3fEdkN0w3VDdsR0RHLDc0R0xHJEccNyRHLEcURvxHBEccVwRG7Eb0VwxW5FbcRuRW7FbUVsxGxFbcVsRWvFa0VsxmtFasVqRmvGakZpxWlGasZpRmjFaEZpxmhGZ8ZnRmjHZ0ZmxmZHZ8dmR2XGZkdmx2VHZMZlR2XHZEdkx2RHZMhkR2PHY0hkyGNIYsdiSGPIYkhhx2JIYshhSGHIYUhhyWFIYMhgSWHJYElfyGBJYMlfSV/IX0lfyV9JXsleSV/KXkleyV5KXspdSl3JXUpdyl1KXMldSl3KXEpcylxKXMtcSlvKXEtcy1tLW8pbS1vLW0tay1pLW8taS1rLWktazFpLWctZTFrMWUxZy1lMWcxZTFjMWExZzFhMWMxYTFjNWExXzFhNWM1XTVfMV01XzVdNV81XTVfNVk1WzVZNVs5WTVbNVk5WzlZOVc1VTlbOVU5VzlVOVc5VTlXOVU5Vz1ROVM5UT1TPVE9UzlRPVM9UT1PPVE9Uz1NPU89TT1PQU09Tz1NQU9BTUFLPUlBT0FJQUtBSUPfA0kDewMJA0sC4QMrAskHEwa1BwMGoQbzBpUG4waJBtsGfQbPBnUGxwZpBr8GYQq3Cl0KrwpVCqcKTQqjCkkKmwpBCpcKPQqTCjkKiwo1CocOLQ6DDikOfw4lDnsOIQ53Dh0Ocw4ZDm8OGQ5rDhUOaxIREmcSDRJjEgkSXxIJEl8SBRJbEgESVxIBElcR/RJTFfkWTxX5Fk8V9RZLFfUWRxXxFkcV7RZDFe0WQxXpGj8Z6Ro/GeUaOxnlGjsZ4Ro3GeEaNxndGjMZ3RozGd0eMx3ZHi8d2R4vHdUeKx3VHisd0R4nHdEeJx3RHicdzR4jIc0iIyHJIiMhySIfIckiHyHFIhshxSIbIcUiGyHBIhclwSYXJcEmFyW9JhMlvSYTJb0mEyW5JhMluSYPJbkmDym5Kg8ptSoLKbUqCym1KgspsSoHKbEqBymxKgcpsS4HLa0uAy2tLgMtrS4DLa0uAy2pLf8tqS3/Lakt/y2pMf8xpTH7MaUx+zGlMfsxpTH7MaEx9zGhMfcxoTH3MaEx9zWdNfc1nTXzNZ018zWdNfM1nTXzNZk17zWZNe81mTXvOZk57zmVOe85lTnrOZU56zmVOes5lTnrOZU56zmROec9kT3nPZE95z2RPec9kT3nPY095z2NPeM9jT3jPY1B40GNQeNBiUHjQYlB30GJQ/8AAqebAAEfawAC70sAAQMzBAEvHwQDAxMEAwMDBAK29wQDAu8EA+rjBAEC2wQATtMIAs7PCAECxwgBAr8IAQK7CACitwgC9q8IAU6rCAMOpwwBoqMMAQKfDAECmwwAApcMAwKTDAMCjwwDKosMAQKHEAAChxABAoMQAQJ/EAACexABAnsQAAJ3EAECcxABAnMUAxZvFAACaxQAAmsUAAJnFAMCZxQAAmMUAIJjFAACXxgBAl8YAAJbGAACWxgAAlcYAAJXGAACUxgAAlMYAAJPHAECTxwAAkscAwJLHAACSxwAAkccAAJHHAACQxwAAkMgAQJDIAACPyADAj8gAAI/IANOOyAAAjsgAAI7IAACNyQAAjckAAI3JANOMyQAAjMkAAIzJAACLyQAAi8kAAIvKAACKygAAisoAAIrKAACKygAgicoAAInKAACJygAAiMsAAIjLAACIywAAiMsAAIfLAACHywAAh8sAAIfLAACGzAAAhswAAIbMAACGzAAAhcwAAIXMAACFzAAAhcwAAIXNAACEzQAAhM0AAITNAACEzQAAg80AAIPNAACDzQAAg84AAIPOAACCzgAAgs4AAILOAACCzgAAgs4AAIHOAACBzwAAgc8AAIHPAACBzwAAgM8AAIDPAACAzwAAgM8AAIDQAACA0AAAf9AAAH/QAAD41efA3qsAQtPVzsDLqwC2xdbCwcCsAMC81rrBuawAwLbWtcG0rABhsdawwa+sAMCt16zCq60AQKrXqcKorQBtp9emwqWtAECk16PCo60A8qLYocOhrgAAoNifw5+uAECe2J3Dna4ALZzYm8ObrgBTmtmZxJmvAECZ2ZjEmK8AAJfZlsSWrwBAltmVxJWvAECV2pTFlLAAQJPak8WTsABAktqRxZKwAACR2pDFkLAAYJDbj8aPsQD1j9uOxo6xAACO243GjbEAAI3bjMaNsQDAjNyMx4yyAACL3IvHi7IAAIrciseKsgBAityJx4myAACJ3YjIibMAQIjdiMiIswAAh92HyIezAACH3YbIhrMAAIbehsmGtAAAhd6FyYW0AACF3oTJhLQAwITehMmEtAAAhN+DyoO1AMCD34LKg7UAAILfgsqCtQAAgt+ByoK1AACB4IHLgbYAAIHggMuAtgAAgOCAy4C2AACA4H/Lf7YAAH/hf8x/twAAf+F+zH+3AAB+4X7MfrcAAH7hfcx+twAAfeJ9zX24AAB94nzNfbgAAHzifM18uAAAfOJ8zXy4AAB843vOe7kAAHvje857uQAAe+N6znu5AAB643rOerkAAHrkes96ugAAeuR5z3q6AAB55HnPeboAAHnkec95ugAAeeV40Hi7AAB45XjQeLsAAOvs59rhzNvA1rXOpr6UZYG47cLbw83CwcC2u6etlWWCqO603LbOtsO1t7CopJZlg5/vq92uz67DrbipqZ6XZYSY76TeqNCoxai5pKqZmGWFkvCf36PRpMWjuqCrlZllho3xm+Cf0aDHoLudrJKZZYeJ8pfgm9KdyJ28mq2PmmWIhfKU4ZjTmsiavZetjZtliYLzkeKV1JfKl76VroucZYp/9I7jk9WVypW/k6+JnWWLfPSM5JHWk8yTwJGwh55ljHn1ieSO15HMkcGPsYafZY129ofljNiPzZDCjrKEoGWOdPaF5ovZjc+Owoyzg6Blj3H3g+eJ2ovPjcOLtIKhZZBv94Hoh9uK0IzEirWBomWRbfh/6IbcidGKxYm1gKNlkmr4fumE3YfTicaHtn+kZZNo+Hzqg96G1IjHhrd+pWWUZvh764HfhdWHyIW4fqZllWT5eeuA4ITWhsmFuX2nZZZh+Xfsf+CD1oXKhLp8qGWXX/l27X3hgdeEy4O7e6llmF35de584oDYg8yCvHupZZlb+HPue+N/2oLNgb16qmWaWPhy73rkf9qBzoG+eqtlm1b3cPB55X7bgc+Av3msZZxT9m/weOZ93YDQf795rWWdUfVu8XfnfN1/0X/AeK5lnk/0bPF26HvfftJ+wXivZZ9M8mvydel6337TfsJ3sGWg6fDn4OTQ38DYsc6hvJFpgbXxweHF0cXBwrK6oquSaYKm8rPiudK6w7ezsKOik2mDnPOr47DTssOwtKmknJRphJX0pOSq1KzFqrWkpZeVaYWP9Z/lpdWnxaa2oKaTlmmGivaa5qHWo8eit5ynkJdp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XQBUAN0AjwBeAE8A3gCOAF8AUgDfAJIAXwBFAOAAjwBgAFQA4QCRAGEAXADiAJAAYgBTAOIAmgBjAFYA4wCVAGQAXgDkAIwAZABYAOUAkQBlAEoA5gCSAGYASgDnAJAAZwBdAOcAnQBoACoA6ACYAGkAVgDpAJcAaQBLAOoAkwBqAEMA6wCPAGsASgDsAJUAbABTAOwAmABtAFEA7QCRAG4AagDuAJcAbwBGAO8AlQBvAE8A8ACMAHAAVgDxAJUAcQBtAPEAngByAEkA8gCgAHMAUwDzAIwAdABdAPQAlQB0AHIA9QCvAHUAfPPAwkB4SLJAuMGoQJfAokGmwZ1BksCYQZzBlUGOwJJBlMGPQYnBjUGPwopBhsGIQYrChkKDwYVChsKDQoDBgkKDwoBCfcJ/QoDDfkJ7wnxCfsN7Q3nCekN7w3lDd8J4Q3nDd0N1w3ZDd8R2Q3TDdUN2xHREcsNzRHTEckRxw3JEcsRxRG/EcERxxXBEbsRvRXDFbkVtxG5FbsVtRWzEbEVtxWxFa8VrRWzGa0VqxWpGa8ZqRmnFaUZqxmlGaMVoRmnGaEZnxmdGaMdnRmbGZkdnx2ZHZcZmR2bHZUdkxmVHZcdkR2THZEdkyGRHY8djSGTIY0hix2JIY8hiSGHHYkhiyGFIYchhSGHJYUhgyGBJYclgSV/IYElgyV9JX8hfSV/JX0leyV5JX8peSV7JXkpeyl1KXcldSl3KXUpcyV1KXcpcSlzKXEpcy1xKW8pcS1zLW0tbyltLW8tbS1rLWktby1pLWstaS1rMWktZy1lMWsxZTFnLWUxZzFlMWMxYTFnMWExYzFhMWM1YTFfMWE1YzVdNV8xXTVfNV01XzVdNV81WTVbNVk1WzlZNVs1WTlbOVk5VzVVOVs5VTlXOVU5VzlVOVc5VTlXPVE5UzlRPVM9UT1TOVE9Uz1RPU89UT1TPU09Tz1NPU9BTT1PPU1BT0FNQUs9SUFPQUlBS0FJQ98DSQN7AwkDSwLhAysCyQcTBrUHAwahBvMGlQbjBokG2wZ9Bs8GdQbHBmkGvwZhCrcKXQqvClUKpwpNCqMKSQqbCkEKlwo9CpMKOQqLCjUKhw4tDoMOKQ5/DiUOew4hDncOHQ5zDhkObw4ZDmsOFQ5rEhESZxINEmMSCRJfEgkSXxIFElsSARJXEgESVxH9ElMV+RZPFfkWTxX1FksV9RZHFfEWRxXtFkMV7RZDFekaPxnpGj8Z5Ro7GeUaOxnhGjcZ4Ro3Gd0aMxndGjMZ3R4zHdkeLx3ZHi8d1R4rHdUeKx3RHicd0R4nHdEeJx3NHiMhzSIjIckiIyHJIh8hySIfIcUiGyHFIhshxSIbIcEiFyXBJhclwSYXJb0mEyW9JhMlvSYTJbkmEyW5Jg8luSYPKbkqDym1KgsptSoLKbUqCymxKgcpsSoHKbEqBymxLgctrS4DLa0uAy2tLgMtrS4DLakt/y2pLf8tqS3/Lakx/zGlMfsxpTH7MaUx+zGlMfsxoTH3MaEx9zGhMfcxoTH3NZ019zWdNfM1nTXzNZ018zWdNfM1mTXvNZk17zWZNe85mTnvOZU57zmVOes5lTnrOZU56zmVOes5lTnrOZE55z2RPec9kT3nPZE95z2RPec9jT3nPY094z2NPeM9jUHjQY1B40GJQeNBiUHfQYlD/wACp5sAAR9rAALvSwABAzMEAS8fBAMDEwQDAwMEArb3BAMC7wQD6uMEAQLbBABO0wgCzs8IAQLHCAECvwgBArsIAKK3CAL2rwgBTqsIAw6nDAGiowwBAp8MAQKbDAAClwwDApMMAwKPDAMqiwwBAocQAAKHEAECgxABAn8QAAJ7EAECexAAAncQAQJzEAECcxQDFm8UAAJrFAACaxQAAmcUAwJnFAACYxQAgmMUAAJfGAECXxgAAlsYAAJbGAACVxgAAlcYAAJTGAACUxgAAk8cAQJPHAACSxwDAkscAAJLHAACRxwAAkccAAJDHAACQyABAkMgAAI/IAMCPyAAAj8gA047IAACOyAAAjsgAAI3JAACNyQAAjckA04zJAACMyQAAjMkAAIvJAACLyQAAi8oAAIrKAACKygAAisoAAIrKACCJygAAicoAAInKAACIywAAiMsAAIjLAACIywAAh8sAAIfLAACHywAAh8sAAIbMAACGzAAAhswAAIbMAACFzAAAhcwAAIXMAACFzAAAhc0AAITNAACEzQAAhM0AAITNAACDzQAAg80AAIPNAACDzgAAg84AAILOAACCzgAAgs4AAILOAACCzgAAgc4AAIHPAACBzwAAgc8AAIHPAACAzwAAgM8AAIDPAACAzwAAgNAAAIDQAAB/0AAAf9AAAPjV58DeqwBC09XOwMurALbF1sLBwKwAwLzWusG5rADAtta1wbSsAGGx1rDBr6wAwK3XrMKrrQBAqtepwqitAG2n16bCpa0AQKTXo8KjrQDyotihw6GuAACg2J/Dn64AQJ7YncOdrgAtnNibw5uuAFOa2ZnEma8AQJnZmMSYrwAAl9mWxJavAECW2ZXEla8AQJXalMWUsABAk9qTxZOwAECS2pHFkrAAAJHakMWQsABgkNuPxo+xAPWP247GjrEAAI7bjcaNsQAAjduMxo2xAMCM3IzHjLIAAIvci8eLsgAAityKx4qyAECK3InHibIAAIndiMiJswBAiN2IyIizAACH3YfIh7MAAIfdhsiGswAAht6GyYa0AACF3oXJhbQAAIXehMmEtADAhN6EyYS0AACE34PKg7UAwIPfgsqDtQAAgt+CyoK1AACC34HKgrUAAIHggcuBtgAAgeCAy4C2AACA4IDLgLYAAIDgf8t/tgAAf+F/zH+3AAB/4X7Mf7cAAH7hfsx+twAAfuF9zH63AAB94n3NfbgAAH3ifM19uAAAfOJ8zXy4AAB84nzNfLgAAHzje857uQAAe+N7znu5AAB743rOe7kAAHrjes56uQAAeuR6z3q6AAB65HnPeroAAHnkec95ugAAeeR5z3m6AAB55XjQeLsAAHjleNB4uwAA6+zn2uHM28DWtc6mvpRlgbjtwtvDzcLBwLa7p62VZYKo7rTcts62w7W3sKiklmWDn++r3a7PrsOtuKmpnpdlhJjvpN6o0KjFqLmkqpmYZYWS8J/fo9GkxaO6oKuVmWWGjfGb4J/RoMegu52skpllh4nyl+Cb0p3InbyarY+aZYiF8pThmNOayJq9l62Nm2WJgvOR4pXUl8qXvpWui5xlin/0juOT1ZXKlb+Tr4mdZYt89IzkkdaTzJPAkbCHnmWMefWJ5I7XkcyRwY+xhp9ljXb2h+WM2I/NkMKOsoSgZY509oXmi9mNz47CjLODoGWPcfeD54nai8+Nw4u0gqFlkG/3geiH24rQjMSKtYGiZZFt+H/ohtyJ0YrFibWAo2WSavh+6YTdh9OJxoe2f6Rlk2j4fOqD3obUiMeGt36lZZRm+Hvrgd+F1YfIhbh+pmWVZPl564DghNaGyYW5fadllmH5d+x/4IPWhcqEunyoZZdf+XbtfeGB14TLg7t7qWWYXfl17nzigNiDzIK8e6llmVv4c+5743/ags2BvXqqZZpY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ATwCAAFuBXgIeAx4AAAAAAAAAAgA+cAA/QCXAIMADgAFAKAAnACtAL4AGACDAKgA3wBzAI8ADwANAM8AqwC5AJEAjQAAAD4ADgB7AC8AFwCFAL8APQBJAC8A0wCyAI8A7QAfAMIAogD0AD8AkQDXAK0AYAD+AJkA0gBVACQATABaALUA9gA6AKoAxABhAE4AkwD7AGYAwwA7AKsAJgBFAMcA1QDeAHoAigAsAH0AfQDaAN0AbQBWAOUAzQC2AD4AJgCUALYA0wB9AFYA+AARAPYAxwAJAL4A2gBJAAQAOACEAL8ANAAdAFsAXwAaALcAUwAxAEIAUgDMAGAAUwDiACsAZgAAAMsAXAA1ANoAzQDeADoA/AC+ALYAPQCbALwAoQCzAMQAOgDIAOoA3wC4AJ4AkgCIAD4A3QCsAAMAPQCmAMoArQCzAJYADwBTAKwAygChAN4ANAAHAKUA9AC+ADwAXgATAD4ADQCnABoAAwCpAFUAOQDPAGAANQBuAJsArgDLAA8ATwB8AAkAKgByAKYAFACtAIwAgABKALEARwDAABEACgB6AH8ApwB7AFAAlQAQABIAGwDMAGIAIACNAIcAGQCKAKUAZQDJAIcAOwBiAKQAgAAxAAIAFQB3AK0AngAoAD0AqQAkAGIAoQAwAI4AxABtADsAtQDDAE8AOgAbAKcA7QAxAD8ApADaANoAgADIAGH9wA2B1sAAE7bAAIBtQQBYYsIAgVhCADdRwwCBSkMAPETEAII/RAA7OsQAgzZFAEMyxQCDL0YAQyvGAIMoRgA7JccAgyNHAEEgyACEHkgAQxvIAIQZSQBMF8kAhRVKAD4TygCFEUsAQBDLAIYOSwBIDMwAhgtMAEsJzQCHCE0ASQbNAIcFTgA/AM4AiABPAEsAzwCIAFAASADQAIkAUABLANEAiABRAEsA0gCKAFIARQDSAIkAUwBKANMAigBUAEoA1ACKAFUARwDVAIsAVQBQANYAigBWAEEA1wCLAFcARgDXAI0AWABCANgAjABZAFMA2QCLAFoASwDaAI4AWgBAANsAjwBbAFoA3ACTAFwAWgDcAI0AXQBUAN0AjwBeAE8A3gCOAF8AUgDfAJIAXwBFAOAAjwBgAFQA4QCRAGEAXADiAJAAYgBTAOIAmgBjAFYA4wCVAGQAXgDkAIwAZABYAOUAkQBlAEoA5gCSAGYASgDnAJAAZwBdAOcAnQBoACoA6ACYAGkAVgDpAJcAaQBLAOoAkwBqAEMA6wCPAGsASgDsAJUAbABTAOwAmABtAFEA7QCRAG4AagDuAJcAbwBGAO8AlQBvAE8A8ACMAHAAVgDxAJUAcQBtAPEAngByAEkA8gCgAHMAUwDzAIwAdABdAPQAlQB0AHIA9QCvAHUAfPPAwkB4SLJAuMGoQJfAokGmwZ1BksCYQZzBlUGOwJJBlMGPQYnBjUGPwopBhsGIQYrChkKDwYVChsKDQoDBgkKDwoBCfcJ/QoDDfkJ7wnxCfsN7Q3nCekN7w3lDd8J4Q3nDd0N1w3ZDd8R2Q3TDdUN2xHREcsNzRHTEckRxw3JEcsRxRG/EcERxxXBEbsRvRXDFbkVtxG5FbsVtRWzEbEVtxWxFa8VrRWzGa0VqxWpGa8ZqRmnFaUZqxmlGaMVoRmnGaEZnxmdGaMdnRmbGZkdnx2ZHZcZmR2bHZUdkxmVHZcdkR2THZEdkyGRHY8djSGTIY0hix2JIY8hiSGHHYkhiyGFIYchhSGHJYUhgyGBJYclgSV/IYElgyV9JX8hfSV/JX0leyV5JX8peSV7JXkpeyl1KXcldSl3KXUpcyV1KXcpcSlzKXEpcy1xKW8pcS1zLW0tbyltLW8tbS1rLWktby1pLWstaS1rMWktZy1lMWsxZTFnLWUxZzFlMWMxYTFnMWExYzFhMWM1YTFfMWE1YzVdNV8xXTVfNV01XzVdNV81WTVbNVk1WzlZNVs1WTlbOVk5VzVVOVs5VTlXOVU5VzlVOVc5VTlXPVE5UzlRPVM9UT1TOVE9Uz1RPU89UT1TPU09Tz1NPU9BTT1PPU1BT0FNQUs9SUFPQUlBS0FJQ98DSQN7AwkDSwLhAysCyQcTBrUHAwahBvMGlQbjBokG2wZ9Bs8GdQbHBmkGvwZhCrcKXQqvClUKpwpNCqMKSQqbCkEKlwo9CpMKOQqLCjUKhw4tDoMOKQ5/DiUOew4hDncOHQ5zDhkObw4ZDmsOFQ5rEhESZxINEmMSCRJfEgkSXxIFElsSARJXEgESVxH9ElMV+RZPFfkWTxX1FksV9RZHFfEWRxXtFkMV7RZDFekaPxnpGj8Z5Ro7GeUaOxnhGjcZ4Ro3Gd0aMxndGjMZ3R4zHdkeLx3ZHi8d1R4rHdUeKx3RHicd0R4nHdEeJx3NHiMhzSIjIckiIyHJIh8hySIfIcUiGyHFIhshxSIbIcEiFyXBJhclwSYXJb0mEyW9JhMlvSYTJbkmEyW5Jg8luSYPKbkqDym1KgsptSoLKbUqCymxKgcpsSoHKbEqBymxLgctrS4DLa0uAy2tLgMtrS4DLakt/y2pLf8tqS3/Lakx/zGlMfsxpTH7MaUx+zGlMfsxoTH3MaEx9zGhMfcxoTH3NZ019zWdNfM1nTXzNZ018zWdNfM1mTXvNZk17zWZNe85mTnvOZU57zmVOes5lTnrOZU56zmVOes5lTnrOZE55z2RPec9kT3nPZE95z2RPec9jT3nPY094z2NPeM9jUHjQY1B40GJQeNBiUHfQYlD/wACp5sAAR9rAALvSwABAzMEAS8fBAMDEwQDAwMEArb3BAMC7wQD6uMEAQLbBABO0wgCzs8IAQLHCAECvwgBArsIAKK3CAL2rwgBTqsIAw6nDAGiowwBAp8MAQKbDAAClwwDApMMAwKPDAMqiwwBAocQAAKHEAECgxABAn8QAAJ7EAECexAAAncQAQJzEAECcxQDFm8UAAJrFAACaxQAAmcUAwJnFAACYxQAgmMUAAJfGAECXxgAAlsYAAJbGAACVxgAAlcYAAJTGAACUxgAAk8cAQJPHAACSxwDAkscAAJLHAACRxwAAkccAAJDHAACQyABAkMgAAI/IAMCPyAAAj8gA047IAACOyAAAjsgAAI3JAACNyQAAjckA04zJAACMyQAAjMkAAIvJAACLyQAAi8oAAIrKAACKygAAisoAAIrKACCJygAAicoAAInKAACIywAAiMsAAIjLAACIywAAh8sAAIfLAACHywAAh8sAAIbMAACGzAAAhswAAIbMAACFzAAAhcwAAIXMAACFzAAAhc0AAITNAACEzQAAhM0AAITNAACDzQAAg80AAIPNAACDzgAAg84AAILOAACCzgAAgs4AAILOAACCzgAAgc4AAIHPAACBzwAAgc8AAIHPAACAzwAAgM8AAIDPAACAzwAAgNAAAIDQAAB/0AAAf9AAAPjV58DeqwBC09XOwMurALbF1sLBwKwAwLzWusG5rADAtta1wbSsAGGx1rDBr6wAwK3XrMKrrQBAqtepwqitAG2n16bCpa0AQKTXo8KjrQDyotihw6GuAACg2J/Dn64AQJ7YncOdrgAtnNibw5uuAFOa2ZnEma8AQJnZmMSYrwAAl9mWxJavAECW2ZXEla8AQJXalMWUsABAk9qTxZOwAECS2pHFkrAAAJHakMWQsABgkNuPxo+xAPWP247GjrEAAI7bjcaNsQAAjduMxo2xAMCM3IzHjLIAAIvci8eLsgAAityKx4qyAECK3InHibIAAIndiMiJswBAiN2IyIizAACH3YfIh7MAAIfdhsiGswAAht6GyYa0AACF3oXJhbQAAIXehMmEtADAhN6EyYS0AACE34PKg7UAwIPfgsqDtQAAgt+CyoK1AACC34HKgrUAAIHggcuBtgAAgeCAy4C2AACA4IDLgLYAAIDgf8t/tgAAf+F/zH+3AAB/4X7Mf7cAAH7hfsx+twAAfuF9zH63AAB94n3NfbgAAH3ifM19uAAAfOJ8zXy4AAB84nzNfLgAAHzje857uQAAe+N7znu5AAB743rOe7kAAHrjes56uQAAeuR6z3q6AAB65HnPeroAAHnkec95ugAAeeR5z3m6AAB55XjQeLsAAHjleNB4uwAA6+zn2uHM28DWtc6mvpRlgbjtwtvDzcLBwLa7p62VZYKo7rTcts62w7W3sKiklmWDn++r3a7PrsOtuKmpnpdlhJjvpN6o0KjFqLmkqpmYZYWS8J/fo9GkxaO6oKuVmWWGjfGb4J/RoMegu52skpllh4nyl+Cb0p3InbyarY+aZYiF8pThmNOayJq9l62Nm2WJgvOR4pXUl8qXvpWui5xlin/0juOT1ZXKlb+Tr4mdZYt89IzkkdaTzJPAkbCHnmWMefWJ5I7XkcyRwY+xhp9ljXb2h+WM2I/NkMKOsoSgZY509oXmi9mNz47CjLODoGWPcfeD54nai8+Nw4u0gqFlkG/3geiH24rQjMSKtYGiZZFt+H/ohtyJ0YrFibWAo2WSavh+6YTdh9OJxoe2f6Rlk2j4fOqD3obUiMeGt36lZZRm+Hvrgd+F1YfIhbh+pmWVZPl564DghNaGyYW5fadllmH5d+x/4IPWhcqEunyoZZdf+XbtfeGB14TLg7t7qWWYXfl17nzigNiDzIK8e6llmVv4c+5743/ags2BvXqqZZpY+HLveuR/2oHOgb56q2WbVvdw8HnlftuBz4C/eaxlnFP2b/B45n3dgNB/v3mtZZ1R9W7xd+d83X/Rf8B4rmWeT/Rs8Xboe99+0n7BeK9ln0zya/J16XrfftN+wnewZaDp8Ofg5NDfwNixzqG8kWmBtfHB4cXRxcHCsrqiq5Jpgqbys+K50rrDt7Owo6KTaYOc86vjsNOyw7C0qaSclGmElfSk5KrUrMWqtaSll5VphY/1n+Wl1afFpragppOWaYaK9prmodajx6K3nKeQl2mHhveX557XoMifuJmojphpiIL4k+ib2J3InLmXqYuZaYl++ZDpmNmbypq6laqJmmmKe/qO6pXamMqXu5OriJtpi3f7i+uT25bMlbyRrIacaYx0/InskdyUzJS9j62FnWmNcf2H7Y/dks2Svo6ug55pjm7+he6N3pHPkL+Mr4KfaY9r/4PvjN+Pz4/Ai7CBoGmQaQCB8IrgjtCNwYqxgKFpkWYBf/GI4YzRjMKIsn+iaZJjAn3yh+KL04vDh7N/o2mTYAN784XjitSKxIa0fqRplF0EevSE5IjVicWFtX2laZVaBXj1g+WH1ojGhbZ8pmmWVgZ39oLmhtaHx4S3fKdpl1MHdfeA54XXhsiDuHuoaZhPCHT4f+iE2IXJgrl7qWmZSwly+X7pg9qEyoG6eqppmkcKcfp96oLag8uBu3mraZtCC2/7fOuB24LMgLx5rGmcOwxu/HvsgN2CzX+9eK1pnTQNbf167X/dgc5/vniuaZ4pDmv+ee5/34DPfr94r2mfFw9q/3jvft9/0H3Ad7BpoAgA+cAA/QCXAIMADgAFAKAAnACtAL4AGACDAKgA3wBzAI8ADwANAM8AqwC5AJEAjQAAAD4ADgB7AC8AFwCFAL8APQBJAC8A0wCyAI8A7QAfAMIAogD0AD8AkQDXAK0AYAD+AJkA0gBVACQATABaALUA9gA6AKoAxABhAE4AkwD7AGYAwwA7AKsAJgBFAMcA1QDeAHoAigAsAH0AfQDaAN0AbQBWAOUAzQC2AD4AJgCUALYA0wB9AFYA+AARAPYAxwAJAL4A2gBJAAQAOACEAL8ANAAdAFsAXwAaALcAUwAxAEIAUgDMAGAAUwDiACsAZgAAAMsAXAA1ANoAzQDeADoA/AC+ALYAPQCbALwAoQCzAMQAOgDIAOoA3wC4AJ4AkgCIAD4A3QCsAAMAPQCmAMoArQCzAJYADwBTAKwAygChAN4ANAAHAKUA9AC+ADwAXgATAD4ADQCnABoAAwCpAFUAOQDPAGAANQBuAJsArgDLAA8ATwB8AAkAKgByAKYAFACtAIwAgABKALEARwDAABEACgB6AH8ApwB7AFAAlQAQABIAGwDMAGIAIACNAIcAGQCKAKUAZQDJAIcAOwBiAKQAgAAxAAIAFQB3AK0AngAoAD0AqQAkAGIAoQAwAI4AxABtADsAtQDDAE8AOgAbAKcA7QAxAD8ApADaANoAgADIAGH9wA2B1sAAE7bAAIBtQQBYYsIAgVhCADdRwwCBSkMAPETEAII/RAA7OsQAgzZFAEMyxQCDL0YAQyvGAIMoRgA7JccAgyNHAEEgyACEHkgAQxvIAIQZSQBMF8kAhRVKAD4TygCFEUsAQBDLAIYOSwBIDMwAhgtMAEsJzQCHCE0ASQbNAIcFTgA/AM4AiABPAEsAzwCIAFAASADQAIkAUABLANEAiABRAEsA0gCKAFIARQDSAIkAUwBKANMAigBUAEoA1ACKAFUARwDVAIsAVQBQANYAigBWAEEA1wCLAFcARgDXAI0AWABCANgAjABZAFMA2QCLAFoASwDaAI4AWgBAANsAjwBbAFoA3ACTAFwAWgDcAI0AXQBUAN0AjwBeAE8A3gCOAF8AUgDfAJIAXwBFAOAAjwBgAFQA4QCRAGEAXADiAJAAYgBTAOIAmgBjAFYA4wCVAGQAXgDkAIwAZABYAOUAkQBlAEoA5gCSAGYASgDnAJAAZwBdAOcAnQBoACoA6ACYAGkAVgDpAJcAaQBLAOoAkwBqAEMA6wCPAGsASgDsAJUAbABTAOwAmABtAFEA7QCRAG4AagDuAJcAbwBGAO8AlQBvAE8A8ACMAHAAVgDxAJUAcQBtAPEAngByAEkA8gCgAHMAUwDzAIwAdABdAPQAlQB0AHIA9QCvAHUAfPPAwkB4SLJAuMGoQJfAokGmwZ1BksCYQZzBlUGOwJJBlMGPQYnBjUGPwopBhsGIQYrChkKDwYVChsKDQoDBgkKDwoBCfcJ/QoDDfkJ7wnxCfsN7Q3nCekN7w3lDd8J4Q3nDd0N1w3ZDd8R2Q3TDdUN2xHREcsNzRHTEckRxw3JEcsRxRG/EcERxxXBEbsRvRXDFbkVtxG5FbsVtRWzEbEVtxWxFa8VrRWzGa0VqxWpGa8ZqRmnFaUZqxmlGaMVoRmnGaEZnxmdGaMdnRmbGZkdnx2ZHZcZmR2bHZUdkxmVHZcdkR2THZEdkyGRHY8djSGTIY0hix2JIY8hiSGHHYkhiyGFIYchhSGHJYUhgyGBJYclgSV/IYElgyV9JX8hfSV/JX0leyV5JX8peSV7JXkpeyl1KXcldSl3KXUpcyV1KXcpcSlzKXEpcy1xKW8pcS1zLW0tbyltLW8tbS1rLWktby1pLWstaS1rMWktZy1lMWsxZTFnLWUxZzFlMWMxYTFnMWExYzFhMWM1YTFfMWE1YzVdNV8xXTVfNV01XzVdNV81WTVbNVk1WzlZNVs1WTlbOVk5VzVVOVs5VTlXOVU5VzlVOVc5VTlXPVE5UzlRPVM9UT1TOVE9Uz1RPU89UT1TPU09Tz1NPU9BTT1PPU1BT0FNQUs9SUFPQUlBS0FJQ98DSQN7AwkDSwLhAysCyQcTBrUHAwahBvMGlQbjBokG2wZ9Bs8GdQbHBmkGvwZhCrcKXQqvClUKpwpNCqMKSQqbCkEKlwo9CpMKOQqLCjUKhw4tDoMOKQ5/DiUOew4hDncOHQ5zDhkObw4ZDmsOFQ5rEhESZxINEmMSCRJfEgkSXxIFElsSARJXEgESVxH9ElMV+RZPFfkWTxX1FksV9RZHFfEWRxXtFkMV7RZDFekaPxnpGj8Z5Ro7GeUaOxnhGjcZ4Ro3Gd0aMxndGjMZ3R4zHdkeLx3ZHi8d1R4rHdUeKx3RHicd0R4nHdEeJx3NHiMhzSIjIckiIyHJIh8hySIfIcUiGyHFIhshxSIbIcEiFyXBJhclwSYXJb0mEyW9JhMlvSYTJbkmEyW5Jg8luSYPKbkqDym1KgsptSoLKbUqCymxKgcpsSoHKbEqBymxLgctrS4DLa0uAy2tLgMtrS4DLakt/y2pLf8tqS3/Lakx/zGlMfsxpTH7MaUx+zGlMfsxoTH3MaEx9zGhMfcxoTH3NZ019zWdNfM1nTXzNZ018zWdNfM1mTXvNZk17zWZNe85mTnvOZU57zmVOes5lTnrOZU56zmVOes5lTnrOZE55z2RPec9kT3nPZE95z2RPec9jT3nPY094z2NPeM9jUHjQY1B40GJQeNBiUHfQYlD/wACp5sAAR9rAALvSwABAzMEAS8fBAMDEwQDAwMEArb3BAMC7wQD6uMEAQLbBABO0wgCzs8IAQLHCAECvwgBArsIAKK3CAL2rwgBTqsIAw6nDAGiowwBAp8MAQKbDAAClwwDApMMAwKPDAMqiwwBAocQAAKHEAECgxABAn8QAAJ7EAECexAAAncQAQJzEAECcxQDFm8UAAJrFAACaxQAAmcUAwJnFAACYxQAgmMUAAJfGAECXxgAAlsYAAJbGAACVxgAAlcYAAJTGAACUxgAAk8cAQJPHAACSxwDAkscAAJLHAACRxwAAkccAAJDHAACQyABAkMgAAI/IAMCPyAAAj8gA047IAACOyAAAjsgAAI3JAACNyQAAjckA04zJAACMyQAAjMkAAIvJAACLyQAAi8oAAIrKAACKygAAisoAAIrKACCJygAAicoAAInKAACIywAAiMsAAIjLAACIywAAh8sAAIfLAACHywAAh8sAAIbMAACGzAAAhswAAIbMAACFzAAAhcwAAIXMAACFzAAAhc0AAITNAACEzQAAhM0AAITNAACDzQAAg80AAIPNAACDzgAAg84AAILOAACCzgAAgs4AAILOAACCzgAAgc4AAIHPAACBzwAAgc8AAIHPAACAzwAAgM8AAIDPAACAzwAAgNAAAIDQAAB/0AAAf9AAAPjV58DeqwBC09XOwMurALbF1sLBwKwAwLzWusG5rADAtta1wbSsAGGx1rDBr6wAwK3XrMKrrQBAqtepwqitAG2n16bCpa0AQKTXo8KjrQDyotihw6GuAACg2J/Dn64AQJ7YncOdrgAtnNibw5uuAFOa2ZnEma8AQJnZmMSYrwAAl9mWxJavAECW2ZXEla8AQJXalMWUsABAk9qTxZOwAECS2pHFkrAAAJHakMWQsABgkNuPxo+xAPWP247GjrEAAI7bjcaNsQAAjduMxo2xAMCM3IzHjLIAAIvci8eLsgAAityKx4qyAECK3InHibIAAIndiMiJswBAiN2IyIizAACH3YfIh7MAAIfdhsiGswAAht6GyYa0AACF3oXJhbQAAIXehMmEtADAhN6EyYS0AACE34PKg7UAwIPfgsqDtQAAgt+CyoK1AACC34HKgrUAAIHggcuBtgAAgeCAy4C2AACA4IDLgLYAAIDgf8t/tgAAf+F/zH+3AAB/4X7Mf7cAAH7hfsx+twAAfuF9zH63AAB94n3NfbgAAH3ifM19uAAAfOJ8zXy4AAB84nzNfLgAAHzje857uQAAe+N7znu5AAB743rOe7kAAHrjes56uQAAeuR6z3q6AAB65HnPeroAAHnkec95ugAAeeR5z3m6AAB55XjQeLsAAHjleNB4uwAA6+zn2uHM28DWtc6mvpRlgbjtwtvDzcLBwLa7p62VZYKo7rTcts62w7W3sKiklmWDn++r3a7PrsOtuKmpnpdlhJjvpN6o0KjFqLmkqpmYZYWS8J/fo9GkxaO6oKuVmWWGjfGb4J/RoMegu52skpllh4nyl+Cb0p3InbyarY+aZYiF8pThmNOayJq9l62Nm2WJgvOR4pXUl8qXvpWui5xlin/0juOT1ZXKlb+Tr4mdZYt89IzkkdaTzJPAkbCHnmWMefWJ5I7XkcyRwY+xhp9ljXb2h+WM2I/NkMKOsoSgZY509oXmi9mNz47CjLODoGWPcfeD54nai8+Nw4u0gqFlkG/3geiH24rQjMSKtYGiZZFt+H/ohtyJ0YrFibWAo2WSavh+6YTdh9OJxoe2f6Rlk2j4fOqD3obUiMeGt36lZZRm+Hvrgd+F1YfIhbh+pmWVZPl564DghNaGyYW5fadllmH5d+x/4IPWhcqEunyoZZdf+XbtfeGB14TLg7t7qWWYXfl17nzigNiDzIK8e6llmVv4c+5743/ags2BvXqqZZpY+HLveuR/2oHOgb56q2WbVvdw8HnlftuBz4C/eaxlnFP2b/B45n3dgNB/v3mtZZ1R9W7xd+d83X/Rf8B4rmWeT/Rs8Xboe99+0n7BeK9ln0zya/J16XrfftN+wnewZaDp8Ofg5NDfwNixzqG8kWmBtfHB4cXRxcHCsrqiq5Jpgqbys+K50rrDt7Owo6KTaYOc86vjsNOyw7C0qaSclGmElfSk5KrUrMWqtaSll5VphY/1n+Wl1afFpragppOWaYaK9prmodajx6K3nKeQl2mHhveX557XoMifuJmojphpiIL4k+ib2J3InLmXqYuZaYl++ZDpmNmbypq6laqJmmmKe/qO6pXamMqXu5OriJtpi3f7i+uT25bMlbyRrIacaYx0/InskdyUzJS9j62FnWmNcf2H7Y/dks2Svo6ug55pjm7+he6N3pHPkL+Mr4KfaY9r/4PvjN+Pz4/Ai7CBoGmQaQCB8IrgjtCNwYqxgKFpkWYBf/GI4YzRjMKIsn+iaZJjAn3yh+KL04vDh7N/o2mTYAN784XjitSKxIa0fqRplF0EevSE5IjVicWFtX2laZVaBXj1g+WH1ojGhbZ8pmmWVgZ39oLmhtaHx4S3fKdpl1MHdfeA54XXhsiDuHuoaZhPCHT4f+iE2IXJgrl7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xZpFmsWZRZnFmUWYxZhFmMWYRZfFl0aXxpdGlsaWRpbGlkaVxpVGlcaVRpTGlEaUxpRGlMaTR5PHk0eTx5JHkseSR5LHkkeRx5FHkceRR5HHkEeQyJBIkMiQSI/Ij0iPyI9Ij8iPSI7IjkiOyI5IjsiOSI3IjUmNyY1JjcmNSYzJjEmMyYxJjMmMSYvJi0mLyYtJi8mLSovKikqKyopKisqKSorKikqJyolKicqJSonKiUqJyohLiMuIS4jLiEuIy4hLiMuHS4fLh0uHy4dLh8uHS4fLhkyGzIZMhsyGTIbMhkyGzIVMhcyFTIXMhUyFzIVMhcyFTYTNhE2EzYRNhM2ETYTNhE2EzYNNg82DTYPNg02DzYNOg86DToPOgk6CzoJOgs6CToLOgk6CzoJOgs6BToHOgU+Bz4FPgc+BT4HPgU+Bz4BPgM+AT4DPgE+Az4BPgM+AUIDQgFCA0H9Qf9B/UH/QCAD5wAD9AJcAgwAOAAUAoACcAK0AvgAYAIMAqADfAHMAjwAPAA0AzwCrALkAkQCNAAAAPgAOAHsALwAXAIUAvwA9AEkALwDTALIAjwDtAB8AwgCiAPQAPwCRANcArQBgAP4AmQDSAFUAJABMAFoAtQD2ADoAqgDEAGEATgCTAPsAZgDDADsAqwAmAEUAxwDVAN4AegCKACwAfQB9ANoA3QBtAFYA5QDNALYAPgAmAJQAtgDTAH0AVgD4ABEA9gDHAAkAvgDaAEkABAA4AIQAvwA0AB0AWwBfABoAtwBTADEAQgBSAMwAYABTAOIAKwBmAAAAywBcADUA2gDNAN4AOgD8AL4AtgA9AJsAvAChALMAxAA6AMgA6gDfALgAngCSAIgAPgDdAKwAAwA9AKYAygCtALMAlgAPAFMArADKAKEA3gA0AAcApQD0AL4APABeABMAPgANAKcAGgADAKkAVQA5AM8AYAA1AG4AmwCuAMsADwBPAHwACQAqAHIApgAUAK0AjACAAEoAsQBHAMAAEQAKAHoAfwCnAHsAUACVABAAEgAbAMwAYgAgAI0AhwAZAIoApQBlAMkAhwA7AGIApACAADEAAgAVAHcArQCeACgAPQCpACQAYgChADAAjgDEAG0AOwC1AMMATwA6ABsApwDtADEAPwCkANoA2gCAAMgAYf3ADYHWwAATtsAAgG1BAFhiwgCBWEIAN1HDAIFKQwA8RMQAgj9EADs6xACDNkUAQzLFAIMvRgBDK8YAgyhGADslxwCDI0cAQSDIAIQeSABDG8gAhBlJAEwXyQCFFUoAPhPKAIURSwBAEMsAhg5LAEgMzACGC0wASwnNAIcITQBJBs0AhwVOAD8AzgCIAE8ASwDPAIgAUABIANAAiQBQAEsA0QCIAFEASwDSAIoAUgBFANIAiQBTAEoA0wCKAFQASgDUAIoAVQBHANUAiwBVAFAA1gCKAFYAQQDXAIsAVwBGANcAjQBYAEIA2ACMAFkAUwDZAIsAWgBLANoAjgBaAEAA2wCPAFsAWgDcAJMAXABaANwAjQBdAFQA3QCPAF4ATwDeAI4AXwBSAN8AkgBfAEUA4ACPAGAAVADhAJEAYQBcAOIAkABiAFMA4gCaAGMAVgDjAJUAZABeAOQAjABkAFgA5QCRAGUASgDmAJIAZgBKAOcAkABnAF0A5wCdAGgAKgDoAJgAaQBWAOkAlwBpAEsA6gCTAGoAQwDrAI8AawBKAOwAlQBsAFMA7ACYAG0AUQDtAJEAbgBqAO4AlwBvAEYA7wCVAG8ATwDwAIwAcABWAPEAlQBxAG0A8QCeAHIASQDyAKAAcwBTAPMAjAB0AF0A9ACVAHQAcgD1AK8AdQB888DCQHhIskC4wahAl8CiQabBnUGSwJhBnMGVQY7AkkGUwY9BicGNQY/CikGGwYhBisKGQoPBhUKGwoNCgMGCQoPCgEJ9wn9CgMN+QnvCfEJ+w3tDecJ6Q3vDeUN3wnhDecN3Q3XDdkN3xHZDdMN1Q3bEdERyw3NEdMRyRHHDckRyxHFEb8RwRHHFcERuxG9FcMVuRW3EbkVuxW1FbMRsRW3FbEVrxWtFbMZrRWrFakZrxmpGacVpRmrGaUZoxWhGacZoRmfGZ0Zox2dGZsZmR2fHZkdlxmZHZsdlR2TGZUdlx2RHZMdkR2TIZEdjx2NIZMhjSGLHYkhjyGJIYcdiSGLIYUhhyGFIYclhSGDIYElhyWBJX8hgSWDJX0lfyF9JX8lfSV7JXklfyl5JXsleSl7KXUpdyV1KXcpdSlzJXUpdylxKXMpcSlzLXEpbylxLXMtbS1vKW0tby1tLWstaS1vLWktay1pLWsxaS1nLWUxazFlMWctZTFnMWUxYzFhMWcxYTFjMWExYzVhMV8xYTVjNV01XzFdNV81XTVfNV01XzVZNVs1WTVbOVk1WzVZOVs5WTlXNVU5WzlVOVc5VTlXOVU5VzlVOVc9UTlTOVE9Uz1RPVM5UT1TPVE9Tz1RPVM9TT1PPU09T0FNPU89TUFPQU1BSz1JQU9BSUFLQUlD3wNJA3sDCQNLAuEDKwLJBxMGtQcDBqEG8waVBuMGiQbbBn0GzwZ1BscGaQa/BmEKtwpdCq8KVQqnCk0KowpJCpsKQQqXCj0Kkwo5CosKNQqHDi0Ogw4pDn8OJQ57DiEOdw4dDnMOGQ5vDhkOaw4VDmsSERJnEg0SYxIJEl8SCRJfEgUSWxIBElcSARJXEf0SUxX5Fk8V+RZPFfUWSxX1FkcV8RZHFe0WQxXtFkMV6Ro/GekaPxnlGjsZ5Ro7GeEaNxnhGjcZ3RozGd0aMxndHjMd2R4vHdkeLx3VHisd1R4rHdEeJx3RHicd0R4nHc0eIyHNIiMhySIjIckiHyHJIh8hxSIbIcUiGyHFIhshwSIXJcEmFyXBJhclvSYTJb0mEyW9JhMluSYTJbkmDyW5Jg8puSoPKbUqCym1KgsptSoLKbEqBymxKgcpsSoHKbEuBy2tLgMtrS4DLa0uAy2tLgMtqS3/Lakt/y2pLf8tqTH/MaUx+zGlMfsxpTH7MaUx+zGhMfcxoTH3MaEx9zGhMfc1nTX3NZ018zWdNfM1nTXzNZ018zWZNe81mTXvNZk17zmZOe85lTnvOZU56zmVOes5lTnrOZU56zmVOes5kTnnPZE95z2RPec9kT3nPZE95z2NPec9jT3jPY094z2NQeNBjUHjQYlB40GJQd9BiUP/AAKnmwABH2sAAu9LAAEDMwQBLx8EAwMTBAMDAwQCtvcEAwLvBAPq4wQBAtsEAE7TCALOzwgBAscIAQK/CAECuwgAorcIAvavCAFOqwgDDqcMAaKjDAECnwwBApsMAAKXDAMCkwwDAo8MAyqLDAEChxAAAocQAQKDEAECfxAAAnsQAQJ7EAACdxABAnMQAQJzFAMWbxQAAmsUAAJrFAACZxQDAmcUAAJjFACCYxQAAl8YAQJfGAACWxgAAlsYAAJXGAACVxgAAlMYAAJTGAACTxwBAk8cAAJLHAMCSxwAAkscAAJHHAACRxwAAkMcAAJDIAECQyAAAj8gAwI/IAACPyADTjsgAAI7IAACOyAAAjckAAI3JAACNyQDTjMkAAIzJAACMyQAAi8kAAIvJAACLygAAisoAAIrKAACKygAAisoAIInKAACJygAAicoAAIjLAACIywAAiMsAAIjLAACHywAAh8sAAIfLAACHywAAhswAAIbMAACGzAAAhswAAIXMAACFzAAAhcwAAIXMAACFzQAAhM0AAITNAACEzQAAhM0AAIPNAACDzQAAg80AAIPOAACDzgAAgs4AAILOAACCzgAAgs4AAILOAACBzgAAgc8AAIHPAACBzwAAgc8AAIDPAACAzwAAgM8AAIDPAACA0AAAgNAAAH/QAAB/0AAA+NXnwN6rAELT1c7Ay6sAtsXWwsHArADAvNa6wbmsAMC21rXBtKwAYbHWsMGvrADArdeswqutAECq16nCqK0AbafXpsKlrQBApNejwqOtAPKi2KHDoa4AAKDYn8OfrgBAntidw52uAC2c2JvDm64AU5rZmcSZrwBAmdmYxJivAACX2ZbElq8AQJbZlcSVrwBAldqUxZSwAECT2pPFk7AAQJLakcWSsAAAkdqQxZCwAGCQ24/Gj7EA9Y/bjsaOsQAAjtuNxo2xAACN24zGjbEAwIzcjMeMsgAAi9yLx4uyAACK3IrHirIAQIrciceJsgAAid2IyImzAECI3YjIiLMAAIfdh8iHswAAh92GyIazAACG3obJhrQAAIXehcmFtAAAhd6EyYS0AMCE3oTJhLQAAITfg8qDtQDAg9+CyoO1AACC34LKgrUAAILfgcqCtQAAgeCBy4G2AACB4IDLgLYAAIDggMuAtgAAgOB/y3+2AAB/4X/Mf7cAAH/hfsx/twAAfuF+zH63AAB+4X3MfrcAAH3ifc19uAAAfeJ8zX24AAB84nzNfLgAAHzifM18uAAAfON7znu5AAB743vOe7kAAHvjes57uQAAeuN6znq5AAB65HrPeroAAHrkec96ugAAeeR5z3m6AAB55HnPeboAAHnleNB4uwAAeOV40Hi7AADr7Ofa4czbwNa1zqa+lGWBuO3C28PNwsHAtrunrZVlgqjutNy2zrbDtbewqKSWZYOf76vdrs+uw624qamel2WEmO+k3qjQqMWouaSqmZhlhZLwn9+j0aTFo7qgq5WZZYaN8Zvgn9Ggx6C7naySmWWHifKX4JvSncidvJqtj5pliIXylOGY05rImr2XrY2bZYmC85HildSXype+la6LnGWKf/SO45PVlcqVv5OviZ1li3z0jOSR1pPMk8CRsIeeZYx59YnkjteRzJHBj7GGn2WNdvaH5YzYj82Qwo6yhKBljnT2heaL2Y3PjsKMs4OgZY9x94PnidqLz43Di7SCoWWQb/eB6IfbitCMxIq1gaJlkW34f+iG3InRisWJtYCjZZJq+H7phN2H04nGh7Z/pGWTaPh86oPehtSIx4a3fqVllGb4e+uB34XVh8iFuH6mZZVk+XnrgOCE1obJhbl9p2WWYfl37H/gg9aFyoS6fKhll1/5du194YHXhMuDu3upZZhd+XXufOKA2IPMgrx7qWWZW/hz7nvjf9qCzYG9eqplmlj4cu965H/agc6BvnqrZZtW93DweeV+24HPgL95rGWcU/Zv8Hjmfd2A0H+/ea1lnVH1bvF353zdf9F/wHiuZZ5P9Gzxduh7337SfsF4r2WfTPJr8nXpet9+037Cd7BloOnw5+Dk0N/A2LHOobyRaYG18cHhxdHFwcKyuqKrkmmCpvKz4rnSusO3s7CjopNpg5zzq+Ow07LDsLSppJyUaYSV9KTkqtSsxaq1pKWXlWmFj/Wf5aXVp8WmtqCmk5Zphor2muah1qPHorecp5CXaYeG95fnntegyJ+4maiOmGmIgviT6JvYncicuZepi5lpiX75kOmY2ZvKmrqVqomaaYp7+o7qldqYype7k6uIm2mLd/uL65PblsyVvJGshpxpjHT8ieyR3JTMlL2PrYWdaY1x/Yftj92SzZK+jq6DnmmObv6F7o3ekc+Qv4yvgp9pj2v/g++M34/Pj8CLsIGgaZBpAIHwiuCO0I3BirGAoWmRZgF/8YjhjNGMwoiyf6JpkmMCffKH4ovTi8OHs3+jaZNgA3vzheOK1IrEhrR+pGmUXQR69ITkiNWJxYW1faVplVoFePWD5YfWiMaFtnymaZZWBnf2guaG1ofHhLd8p2mXUwd194DnhdeGyIO4e6hpmE8IdPh/6ITYhcmCuXupaZlLCXL5fumD2oTKgbp6qmmaRwpx+n3qgtqDy4G7eatpm0ILb/t864HbgsyAvHmsaZw7DG78e+yA3YLNf714rWmdNA1t/Xrtf92Bzn++eK5pnikOa/557n/fgM9+v3ivaZ8XD2r/eO9+33/QfcB3sGmgAAAAAEJOUzEFAgICf3BcEkdMQVNTIEtFWVMAAE1YTUZSUFIAAAAAAEAAAERkQEAAAC0AU0BAKAESAAMhAABAORQAX38+AFMAPgE8AgABbgV4CHgMeAAAAAAAAAABAP9A78DmQN/A2kDVwNJAz8DMQcrBx0HFwcRBwsHAQb/BvUG8wbtBusG4QbfBtkG1wbRCtMKzQrLCsUKwwq9Cr8KuQq3CrUKswqtCq8KqQqrDqUOow6hDp8OnQ6bDpkOlw6VDpMOkQ6TDo0Ojw6JDosOhRKHEoUSgxKBEn8SfRJ/EnkSexJ5EncSdRJ3EnEScxZxFm8WbRZvFmkWaxZpFmsWZRZnFmUWYxZhFmMWYRZfFl0aXxpdGlsaWRpbGlkaVxpVGlcaVRpTGlEaUxpRGlMaTR5PHk0eTx5JHkseSR5LHkkeRx5FHkceRR5HHkEeQyJBIkMiQSI/Ij0iPyI9Ij8iPSI7IjkiOyI5IjsiOSI3IjUmNyY1JjcmNSYzJjEmMyYxJjMmMSYvJi0mLyYtJi8mLSovKikqKyopKisqKSorKikqJyolKicqJSonKiUqJyohLiMuIS4jLiEuIy4hLiMuHS4fLh0uHy4dLh8uHS4fLhkyGzIZMhsyGTIbMhkyGzIVMhcyFTIXMhUyFzIVMhcyFTYTNhE2EzYRNhM2ETYTNhE2EzYNNg82DTYPNg02DzYNOg86DToPOgk6CzoJOgs6CToLOgk6CzoJOgs6BToHOgU+Bz4FPgc+BT4HPgU+Bz4BPgM+AT4DPgE+Az4BPgM+AUIDQgFCA0H9Qf9B/UH/QCAD5wAD9AJcAgwAOAAUAoACcAK0AvgAYAIMAqADfAHMAjwAPAA0AzwCrALkAkQCNAAAAPgAOAHsALwAXAIUAvwA9AEkALwDTALIAjwDtAB8AwgCiAPQAPwCRANcArQBgAP4AmQDSAFUAJABMAFoAtQD2ADoAqgDEAGEATgCTAPsAZgDDADsAqwAmAEUAxwDVAN4AegCKACwAfQB9ANoA3QBtAFYA5QDNALYAPgAmAJQAtgDTAH0AVgD4ABEA9gDHAAkAvgDaAEkABAA4AIQAvwA0AB0AWwBfABoAtwBTADEAQgBSAMwAYABTAOIAKwBmAAAAywBcADUA2gDNAN4AOgD8AL4AtgA9AJsAvAChALMAxAA6AMgA6gDfALgAngCSAIgAPgDdAKwAAwA9AKYAygCtALMAlgAPAFMArADKAKEA3gA0AAcApQD0AL4APABeABMAPgANAKcAGgADAKkAVQA5AM8AYAA1AG4AmwCuAMsADwBPAHwACQAqAHIApgAUAK0AjACAAEoAsQBHAMAAEQAKAHoAfwCnAHsAUACVABAAEgAbAMwAYgAgAI0AhwAZAIoApQBlAMkAhwA7AGIApACAADEAAgAVAHcArQCeACgAPQCpACQAYgChADAAjgDEAG0AOwC1AMMATwA6ABsApwDtADEAPwCkANoA2gCAAMgAYf3ADYHWwAATtsAAgG1BAFhiwgCBWEIAN1HDAIFKQwA8RMQAgj9EADs6xACDNkUAQzLFAIMvRgBDK8YAgyhGADslxwCDI0cAQSDIAIQeSABDG8gAhBlJAEwXyQCFFUoAPhPKAIURSwBAEMsAhg5LAEgMzACGC0wASwnNAIcITQBJBs0AhwVOAD8AzgCIAE8ASwDPAIgAUABIANAAiQBQAEsA0QCIAFEASwDSAIoAUgBFANIAiQBTAEoA0wCKAFQASgDUAIoAVQBHANUAiwBVAFAA1gCKAFYAQQDXAIsAVwBGANcAjQBYAEIA2ACMAFkAUwDZAIsAWgBLANoAjgBaAEAA2wCPAFsAWgDcAJMAXABaANwAjQBdAFQA3QCPAF4ATwDeAI4AXwBSAN8AkgBfAEUA4ACPAGAAVADhAJEAYQBcAOIAkABiAFMA4gCaAGMAVgDjAJUAZABeAOQAjABkAFgA5QCRAGUASgDmAJIAZgBKAOcAkABnAF0A5wCdAGgAKgDoAJgAaQBWAOkAlwBpAEsA6gCTAGoAQwDrAI8AawBKAOwAlQBsAFMA7ACYAG0AUQDtAJEAbgBqAO4AlwBvAEYA7wCVAG8ATwDwAIwAcABWAPEAlQBxAG0A8QCeAHIASQDyAKAAcwBTAPMAjAB0AF0A9ACVAHQAcgD1AK8AdQB888DCQHhIskC4wahAl8CiQabBnUGSwJhBnMGVQY7AkkGUwY9BicGNQY/CikGGwYhBisKGQoPBhUKGwoNCgMGCQoPCgEJ9wn9CgMN+QnvCfEJ+w3tDecJ6Q3vDeUN3wnhDecN3Q3XDdkN3xHZDdMN1Q3bEdERyw3NEdMRyRHHDckRyxHFEb8RwRHHFcERuxG9FcMVuRW3EbkVuxW1FbMRsRW3FbEVrxWtFbMZrRWrFakZrxmpGacVpRmrGaUZoxWhGacZoRmfGZ0Zox2dGZsZmR2fHZkdlxmZHZsdlR2TGZUdlx2RHZMdkR2TIZEdjx2NIZMhjSGLHYkhjyGJIYcdiSGLIYUhhyGFIYclhSGDIYElhyWBJX8hgSWDJX0lfyF9JX8lfSV7JXklfyl5JXsleSl7KXUpdyV1KXcpdSlzJXUpdylxKXMpcSlzLXEpbylxLXMtbS1vKW0tby1tLWstaS1vLWktay1pLWsxaS1nLWUxazFlMWctZTFnMWUxYzFhMWcxYTFjMWExYzVhMV8xYTVjNV01XzFdNV81XTVfNV01XzVZNVs1WTVbOVk1WzVZOVs5WTlXNVU5WzlVOVc5VTlXOVU5VzlVOVc9UTlTOVE9Uz1RPVM5UT1TPVE9Tz1RPVM9TT1PPU09T0FNPU89TUFPQU1BSz1JQU9BSUFLQUlD3wNJA3sDCQNLAuEDKwLJBxMGtQcDBqEG8waVBuMGiQbbBn0GzwZ1BscGaQa/BmEKtwpdCq8KVQqnCk0KowpJCpsKQQqXCj0Kkwo5CosKNQqHDi0Ogw4pDn8OJQ57DiEOdw4dDnMOGQ5vDhkOaw4VDmsSERJnEg0SYxIJEl8SCRJfEgUSWxIBElcSARJXEf0SUxX5Fk8V+RZPFfUWSxX1FkcV8RZHFe0WQxXtFkMV6Ro/GekaPxnlGjsZ5Ro7GeEaNxnhGjcZ3RozGd0aMxndHjMd2R4vHdkeLx3VHisd1R4rHdEeJx3RHicd0R4nHc0eIyHNIiMhySIjIckiHyHJIh8hxSIbIcUiGyHFIhshwSIXJcEmFyXBJhclvSYTJb0mEyW9JhMluSYTJbkmDyW5Jg8puSoPKbUqCym1KgsptSoLKbEqBymxKgcpsSoHKbEuBy2tLgMtrS4DLa0uAy2tLgMtqS3/Lakt/y2pLf8tqTH/MaUx+zGlMfsxpTH7MaUx+zGhMfcxoTH3MaEx9zGhMfc1nTX3NZ018zWdNfM1nTXzNZ018zWZNe81mTXvNZk17zmZOe85lTnvOZU56zmVOes5lTnrOZU56zmVOes5kTnnPZE95z2RPec9kT3nPZE95z2NPec9jT3jPY094z2NQeNBjUHjQYlB40GJQd9BiUP/AAKnmwABH2sAAu9LAAEDMwQBLx8EAwMTBAMDAwQCtvcEAwLvBAPq4wQBAtsEAE7TCALOzwgBAscIAQK/CAECuwgAorcIAvavCAFOqwgDDqcMAaKjDAECnwwBApsMAAKXDAMCkwwDAo8MAyqLDAEChxAAAocQAQKDEAECfxAAAnsQAQJ7EAACdxABAnMQAQJzFAMWbxQAAmsUAAJrFAACZxQDAmcUAAJjFACCYxQAAl8YAQJfGAACWxgAAlsYAAJXGAACVxgAAlMYAAJTGAACTxwBAk8cAAJLHAMCSxwAAkscAAJHHAACRxwAAkMcAAJDIAECQyAAAj8gAwI/IAACPyADTjsgAAI7IAACOyAAAjckAAI3JAACNyQDTjMkAAIzJAACMyQAAi8kAAIvJAACLygAAisoAAIrKAACKygAAisoAIInKAACJygAAicoAAIjLAACIywAAiMsAAIjLAACHywAAh8sAAIfLAACHywAAhswAAIbMAACGzAAAhswAAIXMAACFzAAAhcwAAIXMAACFzQAAhM0AAITNAACEzQAAhM0AAIPNAACDzQAAg80AAIPOAACDzgAAgs4AAILOAACCzgAAgs4AAILOAACBzgAAgc8AAIHPAACBzwAAgc8AAIDPAACAzwAAgM8AAIDPAACA0AAAgNAAAH/QAAB/0AAA+NXnwN6rAELT1c7Ay6sAtsXWwsHArADAvNa6wbmsAMC21rXBtKwAYbHWsMGvrADArdeswqutAECq16nCqK0AbafXpsKlrQBApNejwqOtAPKi2KHDoa4AAKDYn8OfrgBAntidw52uAC2c2JvDm64AU5rZmcSZrwBAmdmYxJivAACX2ZbElq8AQJbZlcSVrwBAldqUxZSwAECT2pPFk7AAQJLakcWSsAAAkdqQxZCwAGCQ24/Gj7EA9Y/bjsaOsQAAjtuNxo2xAACN24zGjbEAwIzcjMeMsgAAi9yLx4uyAACK3IrHirIAQIrciceJsgAAid2IyImzAECI3YjIiLMAAIfdh8iHswAAh92GyIazAACG3obJhrQAAIXehcmFtAAAhd6EyYS0AMCE3oTJhLQAAITfg8qDtQDAg9+CyoO1AACC34LKgrUAAILfgcqCtQAAgeCBy4G2AACB4IDLgLYAAIDggMuAtgAAgOB/y3+2AAB/4X/Mf7cAAH/hfsx/twAAfuF+zH63AAB+4X3MfrcAAH3ifc19uAAAfeJ8zX24AAB84nzNfLgAAHzifM18uAAAfON7znu5AAB743vOe7kAAHvjes57uQAAeuN6znq5AAB65HrPeroAAHrkec96ugAAeeR5z3m6AAB55HnPeboAAHnleNB4uwAAeOV40Hi7AADr7Ofa4czbwNa1zqa+lGWBuO3C28PNwsHAtrunrZVlgqjutNy2zrbDtbewqKSWZYOf76vdrs+uw624qamel2WEmO+k3qjQqMWouaSqmZhlhZLwn9+j0aTFo7qgq5WZZYaN8Zvgn9Ggx6C7naySmWWHifKX4JvSncidvJqtj5pliIXylOGY05rImr2XrY2bZYmC85HildSXype+la6LnGWKf/SO45PVlcqVv5OviZ1li3z0jOSR1pPMk8CRsIeeZYx59YnkjteRzJHBj7GGn2WNdvaH5YzYj82Qwo6yhKBljnT2heaL2Y3PjsKMs4OgZY9x94PnidqLz43Di7SCoWWQb/eB6IfbitCMxIq1gaJlkW34f+iG3InRisWJtYCjZZJq+H7phN2H04nGh7Z/pGWTaPh86oPehtSIx4a3fqVllGb4e+uB34XVh8iFuH6mZZVk+XnrgOCE1obJhbl9p2WWYfl37H/gg9aFyoS6fKhll1/5du194YHXhMuDu3upZZhd+XXufOKA2IPMgrx7qWWZW/hz7nvjf9qCzYG9eqplmlj4cu965H/agc6BvnqrZZtW93DweeV+24HPgL95rGWcU/Zv8Hjmfd2A0H+/ea1lnVH1bvF353zdf9F/wHiuZZ5P9Gzxduh7337SfsF4r2WfTPJr8nXpet9+037Cd7BloOnw5+Dk0N/A2LHOobyRaYG18cHhxdHFwcKyuqKrkmmCpvKz4rnSusO3s7CjopNpg5zzq+Ow07LDsLSppJyUaYSV9KTkqtSsxaq1pKWXlWmFj/Wf5aXVp8WmtqCmk5Zphor2muah1qPHorecp5CXaYeG95fnntegyJ+4maiOmGmIgviT6JvYncicuZepi5lpiX75kOmY2ZvKmrqVqomaaYp7+o7qldqYype7k6uIm2mLd/uL65PblsyVvJGshpxpjHT8ieyR3JTMlL2PrYWdaY1x/Yftj92SzZK+jq6DnmmObv6F7o3ekc+Qv4yvgp9pj2v/g++M34/Pj8CLsIGgaZBpAIHwiuCO0I3BirGAoWmRZgF/8YjhjNGMwoiyf6JpkmMCffKH4ovTi8OHs3+jaZNgA3vzheOK1IrEhrR+pGmUXQR69ITkiNWJxYW1faVplVoFePWD5YfWiMaFtnymaZZW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0IBQgNB/UH/Qf1B/0AgA+cAA/QCXAIMADgAFAKAAnACtAL4AGACDAKgA3wBzAI8ADwANAM8AqwC5AJEAjQAAAD4ADgB7AC8AFwCFAL8APQBJAC8A0wCyAI8A7QAfAMIAogD0AD8AkQDXAK0AYAD+AJkA0gBVACQATABaALUA9gA6AKoAxABhAE4AkwD7AGYAwwA7AKsAJgBFAMcA1QDeAHoAigAsAH0AfQDaAN0AbQBWAOUAzQC2AD4AJgCUALYA0wB9AFYA+AARAPYAxwAJAL4A2gBJAAQAOACEAL8ANAAdAFsAXwAaALcAUwAxAEIAUgDMAGAAUwDiACsAZgAAAMsAXAA1ANoAzQDeADoA/AC+ALYAPQCbALwAoQCzAMQAOgDIAOoA3wC4AJ4AkgCIAD4A3QCsAAMAPQCmAMoArQCzAJYADwBTAKwAygChAN4ANAAHAKUA9AC+ADwAXgATAD4ADQCnABoAAwCpAFUAOQDPAGAANQBuAJsArgDLAA8ATwB8AAkAKgByAKYAFACtAIwAgABKALEARwDAABEACgB6AH8ApwB7AFAAlQAQABIAGwDMAGIAIACNAIcAGQCKAKUAZQDJAIcAOwBiAKQAgAAxAAIAFQB3AK0AngAoAD0AqQAkAGIAoQAwAI4AxABtADsAtQDDAE8AOgAbAKcA7QAxAD8ApADaANoAgADIAGH9wA2B1sAAE7bAAIBtQQBYYsIAgVhCADdRwwCBSkMAPETEAII/RAA7OsQAgzZFAEMyxQCDL0YAQyvGAIMoRgA7JccAgyNHAEEgyACEHkgAQxvIAIQZSQBMF8kAhRVKAD4TygCFEUsAQBDLAIYOSwBIDMwAhgtMAEsJzQCHCE0ASQbNAIcFTgA/AM4AiABPAEsAzwCIAFAASADQAIkAUABLANEAiABRAEsA0gCKAFIARQDSAIkAUwBKANMAigBUAEoA1ACKAFUARwDVAIsAVQBQANYAigBWAEEA1wCLAFcARgDXAI0AWABCANgAjABZAFMA2QCLAFoASwDaAI4AWgBAANsAjwBbAFoA3ACTAFwAWgDcAI0AXQBUAN0AjwBeAE8A3gCOAF8AUgDfAJIAXwBFAOAAjwBgAFQA4QCRAGEAXADiAJAAYgBTAOIAmgBjAFYA4wCVAGQAXgDkAIwAZABYAOUAkQBlAEoA5gCSAGYASgDnAJAAZwBdAOcAnQBoACoA6ACYAGkAVgDpAJcAaQBLAOoAkwBqAEMA6wCPAGsASgDsAJUAbABTAOwAmABtAFEA7QCRAG4AagDuAJcAbwBGAO8AlQBvAE8A8ACMAHAAVgDxAJUAcQBtAPEAngByAEkA8gCgAHMAUwDzAIwAdABdAPQAlQB0AHIA9QCvAHUAfPPAwkB4SLJAuMGoQJfAokGmwZ1BksCYQZzBlUGOwJJBlMGPQYnBjUGPwopBhsGIQYrChkKDwYVChsKDQoDBgkKDwoBCfcJ/QoDDfkJ7wnxCfsN7Q3nCekN7w3lDd8J4Q3nDd0N1w3ZDd8R2Q3TDdUN2xHREcsNzRHTEckRxw3JEcsRxRG/EcERxxXBEbsRvRXDFbkVtxG5FbsVtRWzEbEVtxWxFa8VrRWzGa0VqxWpGa8ZqRmnFaUZqxmlGaMVoRmnGaEZnxmdGaMdnRmbGZkdnx2ZHZcZmR2bHZUdkxmVHZcdkR2THZEdkyGRHY8djSGTIY0hix2JIY8hiSGHHYkhiyGFIYchhSGHJYUhgyGBJYclgSV/IYElgyV9JX8hfSV/JX0leyV5JX8peSV7JXkpeyl1KXcldSl3KXUpcyV1KXcpcSlzKXEpcy1xKW8pcS1zLW0tbyltLW8tbS1rLWktby1pLWstaS1rMWktZy1lMWsxZTFnLWUxZzFlMWMxYTFnMWExYzFhMWM1YTFfMWE1YzVdNV8xXTVfNV01XzVdNV81WTVbNVk1WzlZNVs1WTlbOVk5VzVVOVs5VTlXOVU5VzlVOVc5VTlXPVE5UzlRPVM9UT1TOVE9Uz1RPU89UT1TPU09Tz1NPU9BTT1PPU1BT0FNQUs9SUFPQUlBS0FJQ98DSQN7AwkDSwLhAysCyQcTBrUHAwahBvMGlQbjBokG2wZ9Bs8GdQbHBmkGvwZhCrcKXQqvClUKpwpNCqMKSQqbCkEKlwo9CpMKOQqLCjUKhw4tDoMOKQ5/DiUOew4hDncOHQ5zDhkObw4ZDmsOFQ5rEhESZxINEmMSCRJfEgkSXxIFElsSARJXEgESVxH9ElMV+RZPFfkWTxX1FksV9RZHFfEWRxXtFkMV7RZDFekaPxnpGj8Z5Ro7GeUaOxnhGjcZ4Ro3Gd0aMxndGjMZ3R4zHdkeLx3ZHi8d1R4rHdUeKx3RHicd0R4nHdEeJx3NHiMhzSIjIckiIyHJIh8hySIfIcUiGyHFIhshxSIbIcEiFyXBJhclwSYXJb0mEyW9JhMlvSYTJbkmEyW5Jg8luSYPKbkqDym1KgsptSoLKbUqCymxKgcpsSoHKbEqBymxLgctrS4DLa0uAy2tLgMtrS4DLakt/y2pLf8tqS3/Lakx/zGlMfsxpTH7MaUx+zGlMfsxoTH3MaEx9zGhMfcxoTH3NZ019zWdNfM1nTXzNZ018zWdNfM1mTXvNZk17zWZNe85mTnvOZU57zmVOes5lTnrOZU56zmVOes5lTnrOZE55z2RPec9kT3nPZE95z2RPec9jT3nPY094z2NPeM9jUHjQY1B40GJQeNBiUHfQYlD/wACp5sAAR9rAALvSwABAzMEAS8fBAMDEwQDAwMEArb3BAMC7wQD6uMEAQLbBABO0wgCzs8IAQLHCAECvwgBArsIAKK3CAL2rwgBTqsIAw6nDAGiowwBAp8MAQKbDAAClwwDApMMAwKPDAMqiwwBAocQAAKHEAECgxABAn8QAAJ7EAECexAAAncQAQJzEAECcxQDFm8UAAJrFAACaxQAAmcUAwJnFAACYxQAgmMUAAJfGAECXxgAAlsYAAJbGAACVxgAAlcYAAJTGAACUxgAAk8cAQJPHAACSxwDAkscAAJLHAACRxwAAkccAAJDHAACQyABAkMgAAI/IAMCPyAAAj8gA047IAACOyAAAjsgAAI3JAACNyQAAjckA04zJAACMyQAAjMkAAIvJAACLyQAAi8oAAIrKAACKygAAisoAAIrKACCJygAAicoAAInKAACIywAAiMsAAIjLAACIywAAh8sAAIfLAACHywAAh8sAAIbMAACGzAAAhswAAIbMAACFzAAAhcwAAIXMAACFzAAAhc0AAITNAACEzQAAhM0AAITNAACDzQAAg80AAIPNAACDzgAAg84AAILOAACCzgAAgs4AAILOAACCzgAAgc4AAIHPAACBzwAAgc8AAIHPAACAzwAAgM8AAIDPAACAzwAAgNAAAIDQAAB/0AAAf9AAAPjV58DeqwBC09XOwMurALbF1sLBwKwAwLzWusG5rADAtta1wbSsAGGx1rDBr6wAwK3XrMKrrQBAqtepwqitAG2n16bCpa0AQKTXo8KjrQDyotihw6GuAACg2J/Dn64AQJ7YncOdrgAtnNibw5uuAFOa2ZnEma8AQJnZmMSYrwAAl9mWxJavAECW2ZXEla8AQJXalMWUsABAk9qTxZOwAECS2pHFkrAAAJHakMWQsABgkNuPxo+xAPWP247GjrEAAI7bjcaNsQAAjduMxo2xAMCM3IzHjLIAAIvci8eLsgAAityKx4qyAECK3InHibIAAIndiMiJswBAiN2IyIizAACH3YfIh7MAAIfdhsiGswAAht6GyYa0AACF3oXJhbQAAIXehMmEtADAhN6EyYS0AACE34PKg7UAwIPfgsqDtQAAgt+CyoK1AACC34HKgrUAAIHggcuBtgAAgeCAy4C2AACA4IDLgLYAAIDgf8t/tgAAf+F/zH+3AAB/4X7Mf7cAAH7hfsx+twAAfuF9zH63AAB94n3NfbgAAH3ifM19uAAAfOJ8zXy4AAB84nzNfLgAAHzje857uQAAe+N7znu5AAB743rOe7kAAHrjes56uQAAeuR6z3q6AAB65HnPeroAAHnkec95ugAAeeR5z3m6AAB55XjQeLsAAHjleNB4uwAA6+zn2uHM28DWtc6mvpRlgbjtwtvDzcLBwLa7p62VZYKo7rTcts62w7W3sKiklmWDn++r3a7PrsOtuKmpnpdlhJjvpN6o0KjFqLmkqpmYZYWS8J/fo9GkxaO6oKuVmWWGjfGb4J/RoMegu52skpllh4nyl+Cb0p3InbyarY+aZYiF8pThmNOayJq9l62Nm2WJgvOR4pXUl8qXvpWui5xlin/0juOT1ZXKlb+Tr4mdZYt89IzkkdaTzJPAkbCHnmWMefWJ5I7XkcyRwY+xhp9ljXb2h+WM2I/NkMKOsoSgZY509oXmi9mNz47CjLODoGWPcfeD54nai8+Nw4u0gqFlkG/3geiH24rQjMSKtYGiZZFt+H/ohtyJ0YrFibWAo2WSavh+6YTdh9OJxoe2f6Rlk2j4fOqD3obUiMeGt36lZZRm+Hvrgd+F1YfIhbh+pmWVZPl564DghNaGyYW5fadllmH5d+x/4IPWhcqEunyoZZdf+XbtfeGB14TLg7t7qWWYXfl17nzigNiDzIK8e6llmVv4c+5743/ags2BvXqqZZpY+HLveuR/2oHOgb56q2WbVvdw8HnlftuBz4C/eaxlnFP2b/B45n3dgNB/v3mtZZ1R9W7xd+d83X/Rf8B4rmWeT/Rs8Xboe99+0n7BeK9ln0zya/J16XrfftN+wnewZaDp8Ofg5NDfwNixzqG8kWmBtfHB4cXRxcHCsrqiq5Jpgqbys+K50rrDt7Owo6KTaYOc86vjsNOyw7C0qaSclGmElfSk5KrUrMWqtaSll5VphY/1n+Wl1afFpragppOWaYaK9prmodajx6K3nKeQl2mHhveX557XoMifuJmojphpiIL4k+ib2J3InLmXqYuZaYl++ZDpmNmbypq6laqJmmmKe/qO6pXamMqXu5OriJtpi3f7i+uT25bMlbyRrIacaYx0/InskdyUzJS9j62FnWmNcf2H7Y/dks2Svo6ug55pjm7+he6N3pHPkL+Mr4KfaY9r/4PvjN+Pz4/Ai7CBoGmQaQCB8IrgjtCNwYqxgKFpkWYBf/GI4YzRjMKIsn+iaZJjAn3yh+KL04vDh7N/o2mTYAN784XjitSKxIa0fqRplF0EevSE5IjVicWFtX2laZVaBXj1g+WH1ojGhbZ8pmmWVgZ39oLmhtaHx4S3fKdpl1MHdfeA54XXhsiDuHuoaZhPCHT4f+iE2IXJgrl7qWmZSwly+X7pg9qEyoG6eqppmkcKcfp96oLag8uBu3mraZtCC2/7fOuB24LMgLx5rGmcOwxu/HvsgN2CzX+9eK1pnTQNbf167X/dgc5/vniuaZ4pDmv+ee5/34DPfr94r2mfFw9q/3jvft9/0H3Ad7BpoAAAAABCTlMxBQICArD4XCBCRUxMAAAAAAAAAABNWE1GUlBSAAAAAABAAAAAZGBAAAAtAEJAQAAALQABNgAAQAAUAGIwZwBJAF0BPAIAAW4MUAh4DHgAAAAAAAAACAD5wAD9AJcAgwAOAAUAoACcAK0AvgAYAIMAqADfAHMAjwAPAA0AzwCrALkAkQCNAAAAPgAOAHsALwAXAIUAvwA9AEkALwDTALIAjwDtAB8AwgCiAPQAPwCRANcArQBgAP4AmQDSAFUAJABMAFoAtQD2ADoAqgDEAGEATgCTAPsAZgDDADsAqwAmAEUAxwDVAN4AegCKACwAfQB9ANoA3QBtAFYA5QDNALYAPgAmAJQAtgDTAH0AVgD4ABEA9gDHAAkAvgDaAEkABAA4AIQAvwA0AB0AWwBfABoAtwBTADEAQgBSAMwAYABTAOIAKwBmAAAAywBcADUA2gDNAN4AOgD8AL4AtgA9AJsAvAChALMAxAA6AMgA6gDfALgAngCSAIgAPgDdAKwAAwA9AKYAygCtALMAlgAPAFMArADKAKEA3gA0AAcApQD0AL4APABeABMAPgANAKcAGgADAKkAVQA5AM8AYAA1AG4AmwCuAMsADwBPAHwACQAqAHIApgAUAK0AjACAAEoAsQBHAMAAEQAKAHoAfwCnAHsAUACVABAAEgAbAMwAYgAgAI0AhwAZAIoApQBlAMkAhwA7AGIApACAADEAAgAVAHcArQCeACgAPQCpACQAYgChADAAjgDEAG0AOwC1AMMATwA6ABsApwDtADEAPwCkANoA2gCAAMgAYf3ADYHWwAATtsAAgG1BAFhiwgCBWEIAN1HDAIFKQwA8RMQAgj9EADs6xACDNkUAQzLFAIMvRgBDK8YAgyhGADslxwCDI0cAQSDIAIQeSABDG8gAhBlJAEwXyQCFFUoAPhPKAIURSwBAEMsAhg5LAEgMzACGC0wASwnNAIcITQBJBs0AhwVOAD8AzgCIAE8ASwDPAIgAUABIANAAiQBQAEsA0QCIAFEASwDSAIoAUgBFANIAiQBTAEoA0wCKAFQASgDUAIoAVQBHANUAiwBVAFAA1gCKAFYAQQDXAIsAVwBGANcAjQBYAEIA2ACMAFkAUwDZAIsAWgBLANoAjgBaAEAA2wCPAFsAWgDcAJMAXABaANwAjQBdAFQA3QCPAF4ATwDeAI4AXwBSAN8AkgBfAEUA4ACPAGAAVADhAJEAYQBcAOIAkABiAFMA4gCaAGMAVgDjAJUAZABeAOQAjABkAFgA5QCRAGUASgDmAJIAZgBKAOcAkABnAF0A5wCdAGgAKgDoAJgAaQBWAOkAlwBpAEsA6gCTAGoAQwDrAI8AawBKAOwAlQBsAFMA7ACYAG0AUQDtAJEAbgBqAO4AlwBvAEYA7wCVAG8ATwDwAIwAcABWAPEAlQBxAG0A8QCeAHIASQDyAKAAcwBTAPMAjAB0AF0A9ACVAHQAcgD1AK8AdQB888DCQHhIskC4wahAl8CiQabBnUGSwJhBnMGVQY7AkkGUwY9BicGNQY/CikGGwYhBisKGQoPBhUKGwoNCgMGCQoPCgEJ9wn9CgMN+QnvCfEJ+w3tDecJ6Q3vDeUN3wnhDecN3Q3XDdkN3xHZDdMN1Q3bEdERyw3NEdMRyRHHDckRyxHFEb8RwRHHFcERuxG9FcMVuRW3EbkVuxW1FbMRsRW3FbEVrxWtFbMZrRWrFakZrxmpGacVpRmrGaUZoxWhGacZoRmfGZ0Zox2dGZsZmR2fHZkdlxmZHZsdlR2TGZUdlx2RHZMdkR2TIZEdjx2NIZMhjSGLHYkhjyGJIYcdiSGLIYUhhyGFIYclhSGDIYElhyWBJX8hgSWDJX0lfyF9JX8lfSV7JXklfyl5JXsleSl7KXUpdyV1KXcpdSlzJXUpdylxKXMpcSlzLXEpbylxLXMtbS1vKW0tby1tLWstaS1vLWktay1pLWsxaS1nLWUxazFlMWctZTFnMWUxYzFhMWcxYTFjMWExYzVhMV8xYTVjNV01XzFdNV81XTVfNV01XzVZNVs1WTVbOVk1WzVZOVs5WTlXNVU5WzlVOVc5VTlXOVU5VzlVOVc9UTlTOVE9Uz1RPVM5UT1TPVE9Tz1RPVM9TT1PPU09T0FNPU89TUFPQU1BSz1JQU9BSUFLQUlD3wNJA3sDCQNLAuEDKwLJBxMGtQcDBqEG8waVBuMGiQbbBn0GzwZ1BscGaQa/BmEKtwpdCq8KVQqnCk0KowpJCpsKQQqXCj0Kkwo5CosKNQqHDi0Ogw4pDn8OJQ57DiEOdw4dDnMOGQ5vDhkOaw4VDmsSERJnEg0SYxIJEl8SCRJfEgUSWxIBElcSARJXEf0SUxX5Fk8V+RZPFfUWSxX1FkcV8RZHFe0WQxXtFkMV6Ro/GekaPxnlGjsZ5Ro7GeEaNxnhGjcZ3RozGd0aMxndHjMd2R4vHdkeLx3VHisd1R4rHdEeJx3RHicd0R4nHc0eIyHNIiMhySIjIckiHyHJIh8hxSIbIcUiGyHFIhshwSIXJcEmFyXBJhclvSYTJb0mEyW9JhMluSYTJbkmDyW5Jg8puSoPKbUqCym1KgsptSoLKbEqBymxKgcpsSoHKbEuBy2tLgMtrS4DLa0uAy2tLgMtqS3/Lakt/y2pLf8tqTH/MaUx+zGlMfsxpTH7MaUx+zGhMfcxoTH3MaEx9zGhMfc1nTX3NZ018zWdNfM1nTXzNZ018zWZNe81mTXvNZk17zmZOe85lTnvOZU56zmVOes5lTnrOZU56zmVOes5kTnnPZE95z2RPec9kT3nPZE95z2NPec9jT3jPY094z2NQeNBjUHjQYlB40GJQd9BiUP/AAKnmwABH2sAAu9LAAEDMwQBLx8EAwMTBAMDAwQCtvcEAwLvBAPq4wQBAtsEAE7TCALOzwgBAscIAQK/CAECuwgAorcIAvavCAFOqwgDDqcMAaKjDAECnwwBApsMAAKXDAMCkwwDAo8MAyqLDAEChxAAAocQAQKDEAECfxAAAnsQAQJ7EAACdxABAnMQAQJzFAMWbxQAAmsUAAJrFAACZxQDAmcUAAJjFACCYxQAAl8YAQJfGAACWxgAAlsYAAJXGAACVxgAAlMYAAJTGAACTxwBAk8cAAJLHAMCSxwAAkscAAJHHAACRxwAAkMcAAJDIAECQyAAAj8gAwI/IAACPyADTjsgAAI7IAACOyAAAjckAAI3JAACNyQDTjMkAAIzJAACMyQAAi8kAAIvJAACLygAAisoAAIrKAACKygAAisoAIInKAACJygAAicoAAIjLAACIywAAiMsAAIjLAACHywAAh8sAAIfLAACHywAAhswAAIbMAACGzAAAhswAAIXMAACFzAAAhcwAAIXMAACFzQAAhM0AAITNAACEzQAAhM0AAIPNAACDzQAAg80AAIPOAACDzgAAgs4AAILOAACCzgAAgs4AAILOAACBzgAAgc8AAIHPAACBzwAAgc8AAIDPAACAzwAAgM8AAIDPAACA0AAAgNAAAH/QAAB/0AAA+NXnwN6rAELT1c7Ay6sAtsXWwsHArADAvNa6wbmsAMC21rXBtKwAYbHWsMGvrADArdeswqutAECq16nCqK0AbafXpsKlrQBApNejwqOtAPKi2KHDoa4AAKDYn8OfrgBAntidw52uAC2c2JvDm64AU5rZmcSZrwBAmdmYxJivAACX2ZbElq8AQJbZlcSVrwBAldqUxZSwAECT2pPFk7AAQJLakcWSsAAAkdqQxZCwAGCQ24/Gj7EA9Y/bjsaOsQAAjtuNxo2xAACN24zGjbEAwIzcjMeMsgAAi9yLx4uyAACK3IrHirIAQIrciceJsgAAid2IyImzAECI3YjIiLMAAIfdh8iHswAAh92GyIazAACG3obJhrQAAIXehcmFtAAAhd6EyYS0AMCE3oTJhLQAAITfg8qDtQDAg9+CyoO1AACC34LKgrUAAILfgcqCtQAAgeCBy4G2AACB4IDLgLYAAIDggMuAtgAAgOB/y3+2AAB/4X/Mf7cAAH/hfsx/twAAfuF+zH63AAB+4X3MfrcAAH3ifc19uAAAfeJ8zX24AAB84nzNfLgAAHzifM18uAAAfON7znu5AAB743vOe7kAAHvjes57uQAAeuN6znq5AAB65HrPeroAAHrkec96ugAAeeR5z3m6AAB55HnPeboAAHnleNB4uwAAeOV40Hi7AADr7Ofa4czbwNa1zqa+lGWBuO3C28PNwsHAtrunrZVlgqjutNy2zrbDtbewqKSWZYOf76vdrs+uw624qamel2WEmO+k3qjQqMWouaSqmZhlhZLwn9+j0aTFo7qgq5WZZYaN8Zvgn9Ggx6C7naySmWWHifKX4JvSncidvJqtj5pliIXylOGY05rImr2XrY2bZYmC85HildSXype+la6LnGWKf/SO45PVlcqVv5OviZ1li3z0jOSR1pPMk8CRsIeeZYx59YnkjteRzJHBj7GGn2WNdvaH5YzYj82Qwo6yhKBljnT2heaL2Y3PjsKMs4OgZY9x94PnidqLz43Di7SCoWWQb/eB6IfbitCMxIq1gaJlkW34f+iG3InRisWJtYCjZZJq+H7phN2H04nGh7Z/pGWTaPh86oPehtSIx4a3fqVllGb4e+uB34XVh8iFuH6mZZVk+XnrgOCE1obJhbl9p2WWYfl37H/gg9aFyoS6fKhll1/5du194YHXhMuDu3upZZhd+XXufOKA2IPMgrx7qWWZW/hz7nvjf9qCzYG9eqplmlj4cu965H/agc6BvnqrZZtW93DweeV+24HPgL95rGWcU/Zv8Hjmfd2A0H+/ea1lnVH1bvF353zdf9F/wHiuZZ5P9Gzxduh7337SfsF4r2WfTPJr8nXpet9+037Cd7BloOnw5+Dk0N/A2LHOobyRaYG18cHhxdHFwcKyuqKrkmmCpvKz4rnSusO3s7CjopNpg5zzq+Ow07LDsLSppJyUaYSV9KTkqtSsxaq1pKWXlWmFj/Wf5aXVp8WmtqCmk5Zphor2muah1qPHorecp5CXaYeG95fnntegyJ+4maiOmGmIgviT6JvYncicuZepi5lpiX75kOmY2ZvKmrqVqomaaYp7+o7qldqYype7k6uIm2mLd/uL65PblsyVvJGshpxpjHT8ieyR3JTMlL2PrYWdaY1x/Yftj92SzZK+jq6DnmmObv6F7o3ekc+Qv4yvgp9pj2v/g++M34/Pj8CLsIGgaZBpAIHwiuCO0I3BirGAoWmRZgF/8YjhjNGMwoiyf6JpkmMCffKH4ovTi8OHs3+jaZNgA3vzheOK1IrEhrR+pGmUXQR69ITkiNWJxYW1faVplVoFePWD5YfWiMaFtnymaZZWBnf2guaG1ofHhLd8p2mXUwd194DnhdeGyIO4e6hpmE8IdPh/6ITYhcmCuXupaZlLCXL5fumD2oTKgbp6qmmaRwpx+n3qgtqDy4G7eatpm0ILb/t864HbgsyAvHmsaZw7DG78e+yA3YLNf714rWmdNA1t/Xrtf92Bzn++eK5pnikOa/557n/fgM9+v3ivaZ8XD2r/eO9+33/QfcB3sGmgCAD4wACsAFwAPAD+p8AAMgDYAHSfwADrrMCwr5vAAD4AT5a3AM4AnQACAPcAhQA/AOUArgA5ADgAyQDaADIAiACIABUA4wCnAAAALwA8ADEAzgCpAOAAIAB7AKUAQADQAF4APwDnAAEAiwBzAC8AtACvACgAXwCfAF0AJQD8AKsAuAAiAEwA4ADRAEYAOQCoAJoAhgA9ABMAwACGAAYAnAB7ACoACwDRALMAUQBVALUA3wAkADsAXgACAPUAMAA8AL8ArwDBADYAOwCEAB4AGAAkADAATABxAJ4AwQAQABAAhQBMAMoAgwBFANkApABXAM8AsgBSADoAFgDQAK4AJAAuAKEAuQBGABUAzgBgACUA7wB7AJEA7QBWAJQAsQAsAEQAkgCBADIA6gBXAE8A5AC7AJoATQBKAIEA0wDNAM8AOAAzAC8AnwA+AL0AdgB/AL8AJgAZAK4ATAAFALkAPAAJAMoAJQAXAHoAjACJAK8AHQAQAL4A+wBiAIEA5gB9AFgAAgDOAOwAugBeAEQABQARAEwA7wCMAKgAHABTAG8A5gAAAP4AsACLABMAVgD4ALUA4gBFANcALABSAEEAWwDVAAcAgADEANoAeQA2ADMARACrACkAkwCnADcAJwDeALUATQDeAMgA3AAsAF8AUgB5AK4A3wDEAJUA0AA0AFoAn/3ADYHWwAATtsAAgG1BAFhiwgCBWEIAN1HDAIFKQwA8RMQAgj9EADs6xACDNkUAQzLFAIMvRgBDK8YAgyhGADslxwCDI0cAQSDIAIQeSABDG8gAhBlJAEwXyQCFFUoAPhPKAIURSwBAEMsAhg5LAEgMzACGC0wASwnNAIcITQBJBs0AhwVOAD8AzgCIAE8ASwDPAIgAUABIANAAiQBQAEsA0QCIAFEASwDSAIoAUgBFANIAiQBTAEoA0wCKAFQASgDUAIoAVQBHANUAiwBVAFAA1gCKAFYAQQDXAIsAVwBGANcAjQBYAEIA2ACMAFkAUwDZAIsAWgBLANoAjgBaAEAA2wCPAFsAWgDcAJMAXABaANwAjQBdAFQA3QCPAF4ATwDeAI4AXwBSAN8AkgBfAEUA4ACPAGAAVADhAJEAYQBcAOIAkABiAFMA4gCaAGMAVgDjAJUAZABeAOQAjABkAFgA5QCRAGUASgDmAJIAZgBKAOcAkABnAF0A5wCdAGgAKgDoAJgAaQBWAOkAlwBpAEsA6gCTAGoAQwDrAI8AawBKAOwAlQBsAFMA7ACYAG0AUQDtAJEAbgBqAO4AlwBvAEYA7wCVAG8ATwDwAIwAcABWAPEAlQBxAG0A8QCeAHIASQDyAKAAcwBTAPMAjAB0AF0A9ACVAHQAcgD1AK8AdQB888DCQHhIskC4wahAl8CiQabBnUGSwJhBnMGVQY7AkkGUwY9BicGNQY/CikGGwYhBisKGQoPBhUKGwoNCgMGCQoPCgEJ9wn9CgMN+QnvCfEJ+w3tDecJ6Q3vDeUN3wnhDecN3Q3XDdkN3xHZDdMN1Q3bEdERyw3NEdMRyRHHDckRyxHFEb8RwRHHFcERuxG9FcMVuRW3EbkVuxW1FbMRsRW3FbEVrxWtFbMZrRWrFakZrxmpGacVpRmrGaUZoxWhGacZoRmfGZ0Zox2dGZsZmR2fHZkdlxmZHZsdlR2TGZUdlx2RHZMdkR2TIZEdjx2NIZMhjSGLHYkhjyGJIYcdiSGLIYUhhyGFIYclhSGDIYElhyWBJX8hgSWDJX0lfyF9JX8lfSV7JXklfyl5JXsleSl7KXUpdyV1KXcpdSlzJXUpdylxKXMpcSlzLXEpbylxLXMtbS1vKW0tby1tLWstaS1vLWktay1pLWsxaS1nLWUxazFlMWctZTFnMWUxYzFhMWcxYTFjMWExYzVhMV8xYTVjNV01XzFdNV81XTVfNV01XzVZNVs1WTVbOVk1WzVZOVs5WTlXNVU5WzlVOVc5VTlXOVU5VzlVOVc9UTlTOVE9Uz1RPVM5UT1TPVE9Tz1RPVM9TT1PPU09T0FNPU89TUFPQU1BSz1JQU9BSUFLQUlD3wNJA3sDCQNLAuEDKwLJBxMGtQcDBqEG8waVBuMGiQbbBn0GzwZ1BscGaQa/BmEKtwpdCq8KVQqnCk0KowpJCpsKQQqXCj0Kkwo5CosKNQqHDi0Ogw4pDn8OJQ57DiEOdw4dDnMOGQ5vDhkOaw4VDmsSERJnEg0SYxIJEl8SCRJfEgUSWxIBElcSARJXEf0SUxX5Fk8V+RZPFfUWSxX1FkcV8RZHFe0WQxXtFkMV6Ro/GekaPxnlGjsZ5Ro7GeEaNxnhGjcZ3RozGd0aMxndHjMd2R4vHdkeLx3VHisd1R4rHdEeJx3RHicd0R4nHc0eIyHNIiMhySIjIckiHyHJIh8hxSIbIcUiGyHFIhshwSIXJcEmFyXBJhclvSYTJb0mEyW9JhMluSYTJbkmDyW5Jg8puSoPKbUqCym1KgsptSoLKbEqBymxKgcpsSoHKbEuBy2tLgMtrS4DLa0uAy2tLgMtqS3/Lakt/y2pLf8tqTH/MaUx+zGlMfsxpTH7MaUx+zGhMfcxoTH3MaEx9zGhMfc1nTX3NZ018zWdNfM1nTXzNZ018zWZNe81mTXvNZk17zmZOe85lTnvOZU56zmVOes5lTnrOZU56zmVOes5kTnnPZE95z2RPec9kT3nPZE95z2NPec9jT3jPY094z2NQeNBjUHjQYlB40GJQd9BiUP/AAKnmwABH2sAAu9LAAEDMwQBLx8EAwMTBAMDAwQCtvcEAwLvBAPq4wQBAtsEAE7TCALOzwgBAscIAQK/CAECuwgAorcIAvavCAFOqwgDDqcMAaKjDAECnwwBApsMAAKXDAMCkwwDAo8MAyqLDAEChxAAAocQAQKDEAECfxAAAnsQAQJ7EAACdxABAnMQAQJzFAMWbxQAAmsUAAJrFAACZxQDAmcUAAJjFACCYxQAAl8YAQJfGAACWxgAAlsYAAJXGAACVxgAAlMYAAJTGAACTxwBAk8cAAJLHAMCSxwAAkscAAJHHAACRxwAAkMcAAJDIAECQyAAAj8gAwI/IAACPyADTjsgAAI7IAACOyAAAjckAAI3JAACNyQDTjMkAAIzJAACMyQAAi8kAAIvJAACLygAAisoAAIrKAACKygAAisoAIInKAACJygAAicoAAIjLAACIywAAiMsAAIjLAACHywAAh8sAAIfLAACHywAAhswAAIbMAACGzAAAhswAAIXMAACFzAAAhcwAAIXMAACFzQAAhM0AAITNAACEzQAAhM0AAIPNAACDzQAAg80AAIPOAACDzgAAgs4AAILOAACCzgAAgs4AAILOAACBzgAAgc8AAIHPAACBzwAAgc8AAIDPAACAzwAAgM8AAIDPAACA0AAAgNAAAH/QAAB/0AAA+NXnwN6rAELT1c7Ay6sAtsXWwsHArADAvNa6wbmsAMC21rXBtKwAYbHWsMGvrADArdeswqutAECq16nCqK0AbafXpsKlrQBApNejwqOtAPKi2KHDoa4AAKDYn8OfrgBAntidw52uAC2c2JvDm64AU5rZmcSZrwBAmdmYxJivAACX2ZbElq8AQJbZlcSVrwBAldqUxZSwAECT2pPFk7AAQJLakcWSsAAAkdqQxZCwAGCQ24/Gj7EA9Y/bjsaOsQAAjtuNxo2xAACN24zGjbEAwIzcjMeMsgAAi9yLx4uyAACK3IrHirIAQIrciceJsgAAid2IyImzAECI3YjIiLMAAIfdh8iHswAAh92GyIazAACG3obJhrQAAIXehcmFtAAAhd6EyYS0AMCE3oTJhLQAAITfg8qDtQDAg9+CyoO1AACC34LKgrUAAILfgcqCtQAAgeCBy4G2AACB4IDLgLYAAIDggMuAtgAAgOB/y3+2AAB/4X/Mf7cAAH/hfsx/twAAfuF+zH63AAB+4X3MfrcAAH3ifc19uAAAfeJ8zX24AAB84nzNfLgAAHzifM18uAAAfON7znu5AAB743vOe7kAAHvjes57uQAAeuN6znq5AAB65HrPeroAAHrkec96ugAAeeR5z3m6AAB55HnPeboAAHnleNB4uwAAeOV40Hi7AADr7Ofa4czbwNa1zqa+lGWBuO3C28PNwsHAtrunrZVlgqjutNy2zrbDtbewqKSWZYOf76vdrs+uw624qamel2WEmO+k3qjQqMWouaSqmZhlhZLwn9+j0aTFo7qgq5WZZYaN8Zvgn9Ggx6C7naySmWWHifKX4JvSncidvJqtj5pliIXylOGY05rImr2XrY2bZYmC85HildSXype+la6LnGWKf/SO45PVlcqVv5OviZ1li3z0jOSR1pPMk8CRsIeeZYx59YnkjteRzJHBj7GGn2WNdvaH5YzYj82Qwo6yhKBljnT2heaL2Y3PjsKMs4OgZY9x94PnidqLz43Di7SCoWWQb/eB6IfbitCMxIq1gaJlkW34f+iG3InRisWJtYCjZZJq+H7phN2H04nGh7Z/pGWTaPh86oPehtSIx4a3fqVllGb4e+uB34XVh8iFuH6mZZVk+XnrgOCE1obJhbl9p2WWYfl37H/gg9aFyoS6fKhll1/5du194YHXhMuDu3upZZhd+XXufOKA2IPMgrx7qWWZW/hz7nvjf9qCzYG9eqplmlj4cu965H/agc6BvnqrZZtW93DweeV+24HPgL95rGWcU/Zv8Hjmfd2A0H+/ea1lnVH1bvF353zdf9F/wHiuZZ5P9Gzxduh7337SfsF4r2WfTPJr8nXpet9+037Cd7BloOnw5+Dk0N/A2LHOobyRaYG18cHhxdHFwcKyuqKrkmmCpvKz4rnSusO3s7CjopNpg5zzq+Ow07LDsLSppJyUaYSV9KTkqtSsxaq1pKWXlWmFj/Wf5aXVp8WmtqCmk5Zphor2muah1qPHorecp5CXaYeG95fnntegyJ+4maiOmGmIgviT6JvYncicuZepi5lpiX75kOmY2ZvKmrqVqomaaYp7+o7qldqYype7k6uIm2mLd/uL65PblsyVvJGshpxpjHT8ieyR3JTMlL2PrYWdaY1x/Yftj92SzZK+jq6DnmmObv6F7o3ekc+Qv4yvgp9pj2v/g++M34/Pj8CLsIGgaZBpAIHwiuCO0I3BirGAoWmRZgF/8YjhjNGMwoiyf6JpkmMCffKH4ovTi8OHs3+jaZNgA3vzheOK1IrEhrR+pGmUXQR69ITkiNWJxYW1faVplVoFePWD5YfWiMaFtnymaZZWBnf2guaG1ofHhLd8p2mXUwd194DnhdeGyIO4e6hpmE8IdPh/6ITYhcmCuXupaZlLCXL5fumD2oTKgbp6qmmaRwpx+n3qgtqDy4G7eatpm0ILb/t864HbgsyAvHmsaZw7DG78e+yA3YLNf714rWmdNA1t/Xrtf92Bzn++eK5pnikOa/557n/fgM9+v3ivaZ8XD2r/eO9+33/QfcB3sGmgAAAAAEJOUzEFAQICKsZaEFdPT0QgUExVQ0sAAE1YTUZSUFIAAAAAAEAAAAAwQEAAAxMAAEBAAAAUAAFdAABAABQAX39ZAGQAPgE8AgABbgV4CHgMeAAAAAAAAAAIAPnAAP0AlwCDAA4ABQCgAJwArQC+ABgAgwCoAN8AcwCPAA8ADQDPAKsAuQCRAI0AAAA+AA4AewAvABcAhQC/AD0ASQAvANMAsgCPAO0AHwDCAKIA9AA/AJEA1wCtAGAA/gCZANIAVQAkAEwAWgC1APYAOgCqAMQAYQBOAJMA+wBmAMMAOwCrACYARQDHANUA3gB6AIoALAB9AH0A2gDdAG0AVgDlAM0AtgA+ACYAlAC2ANMAfQBWAPgAEQD2AMcACQC+ANoASQAEADgAhAC/ADQAHQBbAF8AGgC3AFMAMQBCAFIAzABgAFMA4gArAGYAAADLAFwANQDaAM0A3gA6APwAvgC2AD0AmwC8AKEAswDEADoAyADqAN8AuACeAJIAiAA+AN0ArAADAD0ApgDKAK0AswCWAA8AUwCsAMoAoQDeADQABwClAPQAvgA8AF4AEwA+AA0ApwAaAAMAqQBVADkAzwBgADUAbgCbAK4AywAPAE8AfAAJACoAcgCmABQArQCMAIAASgCxAEcAwAARAAoAegB/AKcAewBQAJUAEAASABsAzABiACAAjQCHABkAigClAGUAyQCHADsAYgCkAIAAMQACABUAdwCtAJ4AKAA9AKkAJABiAKEAMACOAMQAbQA7ALUAwwBPADoAGwCnAO0AMQA/AKQA2gDaAIAAyABh/cANgdbAABO2wACAbUEAWGLCAIFYQgA3UcMAgUpDADxExACCP0QAOzrEAIM2RQBDMsUAgy9GAEMrxgCDKEYAOyXHAIMjRwBBIMgAhB5IAEMbyACEGUkATBfJAIUVSgA+E8oAhRFLAEAQywCGDksASAzMAIYLTABLCc0AhwhNAEkGzQCHBU4APwDOAIgATwBLAM8AiABQAEgA0ACJAFAASwDRAIgAUQBLANIAigBSAEUA0gCJAFMASgDTAIoAVABKANQAigBVAEcA1QCLAFUAUADWAIoAVgBBANcAiwBXAEYA1wCNAFgAQgDYAIwAWQBTANkAiwBaAEsA2gCOAFoAQADbAI8AWwBaANwAkwBcAFoA3ACNAF0AVADdAI8AXgBPAN4AjgBfAFIA3wCSAF8ARQDgAI8AYABUAOEAkQBhAFwA4gCQAGIAUwDiAJoAYwBWAOMAlQBkAF4A5ACMAGQAWADlAJEAZQBKAOYAkgBmAEoA5wCQAGcAXQDnAJ0AaAAqAOgAmABpAFYA6QCXAGkASwDqAJMAagBDAOsAjwBrAEoA7ACVAGwAUwDsAJgAbQBRAO0AkQBuAGoA7gCXAG8ARgDvAJUAbwBPAPAAjABwAFYA8QCVAHEAbQDxAJ4AcgBJAPIAoABzAFMA8wCMAHQAXQD0AJUAdAByAPUArwB1AHzzwMJAeEiyQLjBqECXwKJBpsGdQZLAmEGcwZVBjsCSQZTBj0GJwY1Bj8KKQYbBiEGKwoZCg8GFQobCg0KAwYJCg8KAQn3Cf0KAw35Ce8J8Qn7De0N5wnpDe8N5Q3fCeEN5w3dDdcN2Q3fEdkN0w3VDdsR0RHLDc0R0xHJEccNyRHLEcURvxHBEccVwRG7Eb0VwxW5FbcRuRW7FbUVsxGxFbcVsRWvFa0VsxmtFasVqRmvGakZpxWlGasZpRmjFaEZpxmhGZ8ZnRmjHZ0ZmxmZHZ8dmR2XGZkdmx2VHZMZlR2XHZEdkx2RHZMhkR2PHY0hkyGNIYsdiSGPIYkhhx2JIYshhSGHIYUhhyWFIYMhgSWHJYElfyGBJYMlfSV/IX0lfyV9JXsleSV/KXkleyV5KXspdSl3JXUpdyl1KXMldSl3KXEpcylxKXMtcSlvKXEtcy1tLW8pbS1vLW0tay1pLW8taS1rLWktazFpLWctZTFrMWUxZy1lMWcxZTFjMWExZzFhMWMxYTFjNWExXzFhNWM1XTVfMV01XzVdNV81XTVfNVk1WzVZNVs5WTVbNVk5WzlZOVc1VTlbOVU5VzlVOVc5VTlXOVU5Vz1ROVM5UT1TPVE9UzlRPVM9UT1PPVE9Uz1NPU89TT1PQU09Tz1NQU9BTUFLPUlBT0FJQUtBSUPfA0kDewMJA0sC4QMrAskHEwa1BwMGoQbzBpUG4waJBtsGfQbPBnUGxwZpBr8GYQq3Cl0KrwpVCqcKTQqjCkkKmwpBCpcKPQqTCjkKiwo1CocOLQ6DDikOfw4lDnsOIQ53Dh0Ocw4ZDm8OGQ5rDhUOaxIREmcSDRJjEgkSXxIJEl8SBRJbEgESVxIBElcR/RJTFfkWTxX5Fk8V9RZLFfUWRxXxFkcV7RZDFe0WQxXpGj8Z6Ro/GeUaOxnlGjsZ4Ro3GeEaNxndGjMZ3RozGd0eMx3ZHi8d2R4vHdUeKx3VHisd0R4nHdEeJx3RHicdzR4jIc0iIyHJIiMhySIfIckiHyHFIhshxSIbIcUiGyHBIhclwSYXJcEmFyW9JhMlvSYTJb0mEyW5JhMluSYPJbkmDym5Kg8ptSoLKbUqCym1KgspsSoHKbEqBymxKgcpsS4HLa0uAy2tLgMtrS4DLa0uAy2pLf8tqS3/Lakt/y2pMf8xpTH7MaUx+zGlMfsxpTH7MaEx9zGhMfcxoTH3MaEx9zWdNfc1nTXzNZ018zWdNfM1nTXzNZk17zWZNe81mTXvOZk57zmVOe85lTnrOZU56zmVOes5lTnrOZU56zmROec9kT3nPZE95z2RPec9kT3nPY095z2NPeM9jT3jPY1B40GNQeNBiUHjQYlB30GJQ/8AAqebAAEfawAC70sAAQMzBAEvHwQDAxMEAwMDBAK29wQDAu8EA+rjBAEC2wQATtMIAs7PCAECxwgBAr8IAQK7CACitwgC9q8IAU6rCAMOpwwBoqMMAQKfDAECmwwAApcMAwKTDAMCjwwDKosMAQKHEAAChxABAoMQAQJ/EAACexABAnsQAAJ3EAECcxABAnMUAxZvFAACaxQAAmsUAAJnFAMCZxQAAmMUAIJjFAACXxgBAl8YAAJbGAACWxgAAlcYAAJXGAACUxgAAlMYAAJPHAECTxwAAkscAwJLHAACSxwAAkccAAJHHAACQxwAAkMgAQJDIAACPyADAj8gAAI/IANOOyAAAjsgAAI7IAACNyQAAjckAAI3JANOMyQAAjMkAAIzJAACLyQAAi8kAAIvKAACKygAAisoAAIrKAACKygAgicoAAInKAACJygAAiMsAAIjLAACIywAAiMsAAIfLAACHywAAh8sAAIfLAACGzAAAhswAAIbMAACGzAAAhcwAAIXMAACFzAAAhcwAAIXNAACEzQAAhM0AAITNAACEzQAAg80AAIPNAACDzQAAg84AAIPOAACCzgAAgs4AAILOAACCzgAAgs4AAIHOAACBzwAAgc8AAIHPAACBzwAAgM8AAIDPAACAzwAAgM8AAIDQAACA0AAAf9AAAH/QAAD41efA3qsAQtPVzsDLqwC2xdbCwcCsAMC81rrBuawAwLbWtcG0rABhsdawwa+sAMCt16zCq60AQKrXqcKorQBtp9emwqWtAECk16PCo60A8qLYocOhrgAAoNifw5+uAECe2J3Dna4ALZzYm8ObrgBTmtmZxJmvAECZ2ZjEmK8AAJfZlsSWrwBAltmVxJWvAECV2pTFlLAAQJPak8WTsABAktqRxZKwAACR2pDFkLAAYJDbj8aPsQD1j9uOxo6xAACO243GjbEAAI3bjMaNsQDAjNyMx4yyAACL3IvHi7IAAIrciseKsgBAityJx4myAACJ3YjIibMAQIjdiMiIswAAh92HyIezAACH3YbIhrMAAIbehsmGtAAAhd6FyYW0AACF3oTJhLQAwITehMmEtAAAhN+DyoO1AMCD34LKg7UAAILfgsqCtQAAgt+ByoK1AACB4IHLgbYAAIHggMuAtgAAgOCAy4C2AACA4H/Lf7YAAH/hf8x/twAAf+F+zH+3AAB+4X7MfrcAAH7hfcx+twAAfeJ9zX24AAB94nzNfbgAAHzifM18uAAAfOJ8zXy4AAB843vOe7kAAHvje857uQAAe+N6znu5AAB643rOerkAAHrkes96ugAAeuR5z3q6AAB55HnPeboAAHnkec95ugAAeeV40Hi7AAB45XjQeLsAAOvs59rhzNvA1rXOpr6UZYG47cLbw83CwcC2u6etlWWCqO603LbOtsO1t7CopJZlg5/vq92uz67DrbipqZ6XZYSY76TeqNCoxai5pKqZmGWFkvCf36PRpMWjuqCrlZllho3xm+Cf0aDHoLudrJKZZYeJ8pfgm9KdyJ28mq2PmmWIhfKU4ZjTmsiavZetjZtliYLzkeKV1JfKl76VroucZYp/9I7jk9WVypW/k6+JnWWLfPSM5JHWk8yTwJGwh55ljHn1ieSO15HMkcGPsYafZY129ofljNiPzZDCjrKEoGWOdPaF5ovZjc+Owoyzg6Blj3H3g+eJ2ovPjcOLtIKhZZBv94Hoh9uK0IzEirWBomWRbfh/6IbcidGKxYm1gKNlkmr4fumE3YfTicaHtn+kZZNo+Hzqg96G1IjHhrd+pWWUZvh764HfhdWHyIW4fqZllWT5eeuA4ITWhsmFuX2nZZZh+Xfsf+CD1oXKhLp8qGWXX/l27X3hgdeEy4O7e6llmF35de584oDYg8yCvHupZZlb+HPue+N/2oLNgb16qmWaWPhy73rkf9qBzoG+eqtlm1b3cPB55X7bgc+Av3msZZxT9m/weOZ93YDQf795rWWdUfVu8XfnfN1/0X/AeK5lnk/0bPF26HvfftJ+wXivZZ9M8mvydel6337TfsJ3sGWg6fDn4OTQ38DYsc6hvJFpgbXxweHF0cXBwrK6oquSaYKm8rPiudK6w7ezsKOik2mDnPOr47DTssOwtKmknJRphJX0pOSq1KzFqrWkpZeVaYWP9Z/lpdWnxaa2oKaTlmmGivaa5qHWo8eit5ynkJdph4b3l+ee16DIn7iZqI6YaYiC+JPom9idyJy5l6mLmWmJfvmQ6ZjZm8qaupWqiZppinv6juqV2pjKl7uTq4ibaYt3+4vrk9uWzJW8kayGnGmMdPyJ7JHclMyUvY+thZ1pjXH9h+2P3ZLNkr6OroOeaY5u/oXujd6Rz5C/jK+Cn2mPa/+D74zfj8+PwIuwgaBpkGkAgfCK4I7QjcGKsYChaZFmAX/xiOGM0YzCiLJ/ommSYwJ98ofii9OLw4ezf6Npk2ADe/OF44rUisSGtH6kaZRdBHr0hOSI1YnFhbV9pWmVWgV49YPlh9aIxoW2fKZpllYGd/aC5obWh8eEt3ynaZdTB3X3gOeF14bIg7h7qGmYTwh0+H/ohNiFyYK5e6lpmUsJcvl+6YPahMqBunqqaZpHCnH6feqC2oPLgbt5q2mbQgtv+3zrgduCzIC8eaxpnDsMbvx77IDdgs1/vXitaZ00DW39eu1/3YHOf754rmmeKQ5r/nnuf9+Az36/eK9pnxcPav94737ff9B9wHewaaAAAAAAAABCTlMxBQECAtFtWhBTUEFDWSBQTFVDSwBNWE1GUlBSAAAAAABAAAAgMEBAAAMTAABAQAAAFAABXQAAQAAUAF9/WQBkAD4BPAIAAW4FeAh4DHgAAAAAAAAACAD5wAD9AJcAgwAOAAUAoACcAK0AvgAYAIMAqADfAHMAjwAPAA0AzwCrALkAkQCNAAAAPgAOAHsALwAXAIUAvwA9AEkALwDTALIAjwDtAB8AwgCiAPQAPwCRANcArQBgAP4AmQDSAFUAJABMAFoAtQD2ADoAqgDEAGEATgCTAPsAZgDDADsAqwAmAEUAxwDVAN4AegCKACwAfQB9ANoA3QBtAFYA5QDNALYAPgAmAJQAtgDTAH0AVgD4ABEA9gDHAAkAvgDaAEkABAA4AIQAvwA0AB0AWwBfABoAtwBTADEAQgBSAMwAYABTAOIAKwBmAAAAywBcADUA2gDNAN4AOgD8AL4AtgA9AJsAvAChALMAxAA6AMgA6gDfALgAngCSAIgAPgDdAKwAAwA9AKYAygCtALMAlgAPAFMArADKAKEA3gA0AAcApQD0AL4APABeABMAPgANAKcAGgADAKkAVQA5AM8AYAA1AG4AmwCuAMsADwBPAHwACQAqAHIApgAUAK0AjACAAEoAsQBHAMAAEQAKAHoAfwCnAHsAUACVABAAEgAbAMwAYgAgAI0AhwAZAIoApQBlAMkAhwA7AGIApACAADEAAgAVAHcArQCeACgAPQCpACQAYgChADAAjgDEAG0AOwC1AMMATwA6ABsApwDtADEAPwCkANoA2gCAAMgAYf3ADYHWwAATtsAAgG1BAFhiwgCBWEIAN1HDAIFKQwA8RMQAgj9EADs6xACDNkUAQzLFAIMvRgBDK8YAgyhGADslxwCDI0cAQSDIAIQeSABDG8gAhBlJAEwXyQCFFUoAPhPKAIURSwBAEMsAhg5LAEgMzACGC0wASwnNAIcITQBJBs0AhwVOAD8AzgCIAE8ASwDPAIgAUABIANAAiQBQAEsA0QCIAFEASwDSAIoAUgBFANIAiQBTAEoA0wCKAFQASgDUAIoAVQBHANUAiwBVAFAA1gCKAFYAQQDXAIsAVwBGANcAjQBYAEIA2ACMAFkAUwDZAIsAWgBLANoAjgBaAEAA2wCPAFsAWgDcAJMAXABaANwAjQBdAFQA3QCPAF4ATwDeAI4AXwBSAN8AkgBfAEUA4ACPAGAAVADhAJEAYQBcAOIAkABiAFMA4gCaAGMAVgDjAJUAZABeAOQAjABkAFgA5QCRAGUASgDmAJIAZgBKAOcAkABnAF0A5wCdAGgAKgDoAJgAaQBWAOkAlwBpAEsA6gCTAGoAQwDrAI8AawBKAOwAlQBsAFMA7ACYAG0AUQDtAJEAbgBqAO4AlwBvAEYA7wCVAG8ATwDwAIwAcABWAPEAlQBxAG0A8QCeAHIASQDyAKAAcwBTAPMAjAB0AF0A9ACVAHQAcgD1AK8AdQB888DCQHhIskC4wahAl8CiQabBnUGSwJhBnMGVQY7AkkGUwY9BicGNQY/CikGGwYhBisKGQoPBhUKGwoNCgMGCQoPCgEJ9wn9CgMN+QnvCfEJ+w3tDecJ6Q3vDeUN3wnhDecN3Q3XDdkN3xHZDdMN1Q3bEdERyw3NEdMRyRHHDckRyxHFEb8RwRHHFcERuxG9FcMVuRW3EbkVuxW1FbMRsRW3FbEVrxWtFbMZrRWrFakZrxmpGacVpRmrGaUZoxWhGacZoRmfGZ0Zox2dGZsZmR2fHZkdlxmZHZsdlR2TGZUdlx2RHZMdkR2TIZEdjx2NIZMhjSGLHYkhjyGJIYcdiSGLIYUhhyGFIYclhSGDIYElhyWBJX8hgSWDJX0lfyF9JX8lfSV7JXklfyl5JXsleSl7KXUpdyV1KXcpdSlzJXUpdylxKXMpcSlzLXEpbylxLXMtbS1vKW0tby1tLWstaS1vLWktay1pLWsxaS1nLWUxazFlMWctZTFnMWUxYzFhMWcxYTFjMWExYzVhMV8xYTVjNV01XzFdNV81XTVfNV01XzVZNVs1WTVbOVk1WzVZOVs5WTlXNVU5WzlVOVc5VTlXOVU5VzlVOVc9UTlTOVE9Uz1RPVM5UT1TPVE9Tz1RPVM9TT1PPU09T0FNPU89TUFPQU1BSz1JQU9BSUFLQUlD3wNJA3sDCQNLAuEDKwLJBxMGtQcDBqEG8waVBuMGiQbbBn0GzwZ1BscGaQa/BmEKtwpdCq8KVQqnCk0KowpJCpsKQQqXCj0Kkwo5CosKNQqHDi0Ogw4pDn8OJQ57DiEOdw4dDnMOGQ5vDhkOaw4VDmsSERJnEg0SYxIJEl8SCRJfEgUSWxIBElcSARJXEf0SUxX5Fk8V+RZPFfUWSxX1FkcV8RZHFe0WQxXtFkMV6Ro/GekaPxnlGjsZ5Ro7GeEaNxnhGjcZ3RozGd0aMxndHjMd2R4vHdkeLx3VHisd1R4rHdEeJx3RHicd0R4nHc0eIyHNIiMhySIjIckiHyHJIh8hxSIbIcUiGyHFIhshwSIXJcEmFyXBJhclvSYTJb0mEyW9JhMluSYTJbkmDyW5Jg8puSoPKbUqCym1KgsptSoLKbEqBymxKgcpsSoHKbEuBy2tLgMtrS4DLa0uAy2tLgMtqS3/Lakt/y2pLf8tqTH/MaUx+zGlMfsxpTH7MaUx+zGhMfcxoTH3MaEx9zGhMfc1nTX3NZ018zWdNfM1nTXzNZ018zWZNe81mTXvNZk17zmZOe85lTnvOZU56zmVOes5lTnrOZU56zmVOes5kTnnPZE95z2RPec9kT3nPZE95z2NPec9jT3jPY094z2NQeNBjUHjQYlB40GJQd9BiUP/AAKnmwABH2sAAu9LAAEDMwQBLx8EAwMTBAMDAwQCtvcEAwLvBAPq4wQBAtsEAE7TCALOzwgBAscIAQK/CAECuwgAorcIAvavCAFOqwgDDqcMAaKjDAECnwwBApsMAAKXDAMCkwwDAo8MAyqLDAEChxAAAocQAQKDEAECfxAAAnsQAQJ7EAACdxABAnMQAQJzFAMWbxQAAmsUAAJrFAACZxQDAmcUAAJjFACCYxQAAl8YAQJfGAACWxgAAlsYAAJXGAACVxgAAlMYAAJTGAACTxwBAk8cAAJLHAMCSxwAAkscAAJHHAACRxwAAkMcAAJDIAECQyAAAj8gAwI/IAACPyADTjsgAAI7IAACOyAAAjckAAI3JAACNyQDTjMkAAIzJAACMyQAAi8kAAIvJAACLygAAisoAAIrKAACKygAAisoAIInKAACJygAAicoAAIjLAACIywAAiMsAAIjLAACHywAAh8sAAIfLAACHywAAhswAAIbMAACGzAAAhswAAIXMAACFzAAAhcwAAIXMAACFzQAAhM0AAITNAACEzQAAhM0AAIPNAACDzQAAg80AAIPOAACDzgAAgs4AAILOAACCzgAAgs4AAILOAACBzgAAgc8AAIHPAACBzwAAgc8AAIDPAACAzwAAgM8AAIDPAACA0AAAgNAAAH/QAAB/0AAA+NXnwN6rAELT1c7Ay6sAtsXWwsHArADAvNa6wbmsAMC21rXBtKwAYbHWsMGvrADArdeswqutAECq16nCqK0AbafXpsKlrQBApNejwqOtAPKi2KHDoa4AAKDYn8OfrgBAntidw52uAC2c2JvDm64AU5rZmcSZrwBAmdmYxJivAACX2ZbElq8AQJbZlcSVrwBAldqUxZSwAECT2pPFk7AAQJLakcWSsAAAkdqQxZCwAGCQ24/Gj7EA9Y/bjsaOsQAAjtuNxo2xAACN24zGjbEAwIzcjMeMsgAAi9yLx4uyAACK3IrHirIAQIrciceJsgAAid2IyImzAECI3YjIiLMAAIfdh8iHswAAh92GyIazAACG3obJhrQAAIXehcmFtAAAhd6EyYS0AMCE3oTJhLQAAITfg8qDtQDAg9+CyoO1AACC34LKgrUAAILfgcqCtQAAgeCBy4G2AACB4IDLgLYAAIDggMuAtgAAgOB/y3+2AAB/4X/Mf7cAAH/hfsx/twAAfuF+zH63AAB+4X3MfrcAAH3ifc19uAAAfeJ8zX24AAB84nzNfLgAAHzifM18uAAAfON7znu5AAB743vOe7kAAHvjes57uQAAeuN6znq5AAB65HrPeroAAHrkec96ugAAeeR5z3m6AAB55HnPeboAAHnleNB4uwAAeOV40Hi7AADr7Ofa4czbwNa1zqa+lGWBuO3C28PNwsHAtrunrZVlgqjutNy2zrbDtbewqKSWZYOf76vdrs+uw624qamel2WEmO+k3qjQqMWouaSqmZhlhZLwn9+j0aTFo7qgq5WZZYaN8Zvgn9Ggx6C7naySmWWHifKX4JvSncidvJqtj5pliIXylOGY05rImr2XrY2bZYmC85HildSXype+la6LnGWKf/SO45PVlcqVv5OviZ1li3z0jOSR1pPMk8CRsIeeZYx59YnkjteRzJHBj7GGn2WNdvaH5YzYj82Qwo6yhKBljnT2heaL2Y3PjsKMs4OgZY9x94PnidqLz43Di7SCoWWQb/eB6IfbitCMxIq1gaJlkW34f+iG3InRisWJtYCjZZJq+H7phN2H04nGh7Z/pGWTaPh86oPehtSIx4a3fqVllGb4e+uB34XVh8iFuH6mZZVk+XnrgOCE1obJhbl9p2WWYfl37H/gg9aFyoS6fKhll1/5du194YHXhMuDu3upZZhd+XXufOKA2IPMgrx7qWWZW/hz7nvjf9qCzYG9eqplmlj4cu965H/agc6BvnqrZZtW93DweeV+24HPgL95rGWcU/Zv8Hjmfd2A0H+/ea1lnVH1bvF353zdf9F/wHiuZZ5P9Gzxduh7337SfsF4r2WfTPJr8nXpet9+037Cd7BloOnw5+Dk0N/A2LHOobyRaYG18cHhxdHFwcKyuqKrkmmCpvKz4rnSusO3s7CjopNpg5zzq+Ow07LDsLSppJyUaYSV9KTkqtSsxaq1pKWXlWmFj/Wf5aXVp8WmtqCmk5Zphor2muah1qPHorecp5CXaYeG95fnntegyJ+4maiOmGmIgviT6JvYncicuZepi5lpiX75kOmY2ZvKmrqVqomaaYp7+o7qldqYype7k6uIm2mLd/uL65PblsyVvJGshpxpjHT8ieyR3JTMlL2PrYWdaY1x/Yftj92SzZK+jq6DnmmObv6F7o3ekc+Qv4yvgp9pj2v/g++M34/Pj8CLsIGgaZBpAIHwiuCO0I3BirGAoWmRZgF/8YjhjNGMwoiyf6JpkmMCffKH4ovTi8OHs3+jaZNgA3vzheOK1IrEhrR+pGmUXQR69ITkiNWJxYW1faVplVoFePWD5YfWiMaFtnymaZZWBnf2guaG1ofHhLd8p2mXUwd194DnhdeGyIO4e6hpmE8IdPh/6ITYhcmCuXupaZlLCXL5fumD2oTKgbp6qmmaRwpx+n3qgtqDy4G7eatpm0ILb/t864HbgsyAvHmsaZw7DG78e+yA3YLNf714rWmdNA1t/Xrtf92Bzn++eK5pnikOa/557n/fgM9+v3ivaZ8XD2r/eO9+33/QfcB3sGmgAAAAAAAAQk5TMQUBAQK6Q1oQTE9XIFBBRAAAAAAAQUJTVFIuIE1BR0UAAAAAAFBAQB8AHAAAQEAAABQAAX8AAEAAFABffz4AX38+AWUDSAEwBXgIeAx4AAAAAAAAAAgA+cAA/QCXAIMADgAFAKAAnACtAL4AGACDAKgA3wBzAI8ADwANAM8AqwC5AJEAjQAAAD4ADgB7AC8AFwCFAL8APQBJAC8A0wCyAI8A7QAfAMIAogD0AD8AkQDXAK0AYAD+AJkA0gBVACQATABaALUA9gA6AKoAxABhAE4AkwD7AGYAwwA7AKsAJgBFAMcA1QDeAHoAigAsAH0AfQDaAN0AbQBWAOUAzQC2AD4AJgCUALYA0wB9AFYA+AARAPYAxwAJAL4A2gBJAAQAOACEAL8ANAAdAFsAXwAaALcAUwAxAEIAUgDMAGAAUwDiACsAZgAAAMsAXAA1ANoAzQDeADoA/AC+ALYAPQCbALwAoQCzAMQAOgDIAOoA3wC4AJ4AkgCIAD4A3QCsAAMAPQCmAMoArQCzAJYADwBTAKwAygChAN4ANAAHAKUA9AC+ADwAXgATAD4ADQCnABoAAwCpAFUAOQDPAGAANQBuAJsArgDLAA8ATwB8AAkAKgByAKYAFACtAIwAgABKALEARwDAABEACgB6AH8ApwB7AFAAlQAQABIAGwDMAGIAIACNAIcAGQCKAKUAZQDJAIcAOwBiAKQAgAAxAAIAFQB3AK0AngAoAD0AqQAkAGIAoQAwAI4AxABtADsAtQDDAE8AOgAbAKcA7QAxAD8ApADaANoAgADIAGH4wM/A08AAE7TAAICa3JfAYsIAgVhCADdRwwCBSkMAOETEAII/RAA8OsQAgzZFAEAyxQCDL0YARSvGAIMoRgA4JccAgyNHAEQgyACFHkgAORvIAIQZSQBPF8kAhhVKAEkTygCEEUsAOhDLAIYOSwBBDMwAhgtMAFYJzQCGCE0ATQbNAIcFTgBHAM4AiABPAE8AzwCJAFAAPwDQAIYAUABJANEAigBRAEgA0gCKAFIARADSAI0AUwA8ANMAhwBUAFIA1ACIAFUAUQDVAIgAVQAzANYAjQBWAE4A1wCKAFcAVADXAIgAWABPANgAjgBZAF0A2QCOAFoALADaAI0AWgBRANsAkgBbAF0A3ACOAFwASwDcAJIAXQBYAN0AkABeADYA3gCNAF8AagDfAJIAXwBIAOAAkABgAGIA4QCCAGEAJwDiAI4AYgBeAOIAjwBjAFQA4wCPAGQASwDkAJEAZABGAOUAmABlACsA5gCPAGYARQDnAJAAZwBWAOcAlQBoAF0A6ACjAGkAfADpAJMAagAVAOoAqgBqAFgA6wCPAGsAUgDsAJAAbABGAOwAlgBtAEkA7QClAG4AggDuAKUAbwBQAO8AiQBvAHAA8ACkAHAAVQDxAJQAcQApAPIAjwByADUA8gCqAHMAbgDzAKEAdABWAPQAmwB0AFkA9QCVAHUAffPAwkB4SLJAuMGoQJfAokGmwZ1BksCYQZzBlUGOwJJBlMGPQYnBjUGPwopBhsGIQYrChkKDwYVChsKDQoDBgkKDwoBCfcJ/QoDDfkJ7wnxCfsN7Q3nCekN7w3lDd8J4Q3nDd0N1w3ZDd8R2Q3TDdUN2xHREcsNzRHTEckRxw3JEcsRxRG/EcERxxXBEbsRvRXDFbkVtxG5FbsVtRWzEbEVtxWxFa8VrRWzGa0VqxWpGa8ZqRmnFaUZqxmlGaMVoRmnGaEZnxmdGaMdnRmbGZkdnx2ZHZcZmR2bHZUdkxmVHZcdkR2THZEdkyGRHY8djSGTIY0hix2JIY8hiSGHHYkhiyGFIYchhSGHJYUhgyGBJYclgSV/IYElgyV9JX8hfSV/JX0leyV5JX8peSV7JXkpeyl1KXcldSl3KXUpcyV1KXcpcSlzKXEpcy1xKW8pcS1zLW0tbyltLW8tbS1rLWktby1pLWstaS1rMWktZy1lMWsxZTFnLWUxZzFlMWMxYTFnMWExYzFhMWM1YTFfMWE1YzVdNV8xXTVfNV01XzVdNV81WTVbNVk1WzlZNVs1WTlbOVk5VzVVOVs5VTlXOVU5VzlVOVc5VTlXPVE5UzlRPVM9UT1TOVE9Uz1RPU89UT1TPU09Tz1NPU9BTT1PPU1BT0FNQUs9SUFPQUlBS0FJQ98DSQN7AwkDSwLhAysCyQcTBrUHAwahBvMGlQbjBokG2wZ9Bs8GdQbHBmkGvwZhCrcKXQqvClUKpwpNCqMKSQqbCkEKlwo9CpMKOQqLCjUKhw4tDoMOKQ5/DiUOew4hDncOHQ5zDhkObw4ZDmsOFQ5rEhESZxINEmMSCRJfEgkSXxIFElsSARJXEgESVxH9ElMV+RZPFfkWTxX1FksV9RZHFfEWRxXtFkMV7RZDFekaPxnpGj8Z5Ro7GeUaOxnhGjcZ4Ro3Gd0aMxndGjMZ3R4zHdkeLx3ZHi8d1R4rHdUeKx3RHicd0R4nHdEeJx3NHiMhzSIjIckiIyHJIh8hySIfIcUiGyHFIhshxSIbIcEiFyXBJhclwSYXJb0mEyW9JhMlvSYTJbkmEyW5Jg8luSYPKbkqDym1KgsptSoLKbUqCymxKgcpsSoHKbEqBymxLgctrS4DLa0uAy2tLgMtrS4DLakt/y2pLf8tqS3/Lakx/zGlMfsxpTH7MaUx+zGlMfsxoTH3MaEx9zGhMfcxoTH3NZ019zWdNfM1nTXzNZ018zWdNfM1mTXvNZk17zWZNe85mTnvOZU57zmVOes5lTnrOZU56zmVOes5lTnrOZE55z2RPec9kT3nPZE95z2RPec9jT3nPY094z2NPeM9jUHjQY1B40GJQeNBiUHfQYlD/wACp5sAAR9rAALvSwABAzMEAS8fBAMDEwQDAwMEArb3BAMC7wQD6uMEAQLbBABO0wgCzs8IAQLHCAECvwgBArsIAKK3CAL2rwgBTqsIAw6nDAGiowwBAp8MAQKbDAAClwwDApMMAwKPDAMqiwwBAocQAAKHEAECgxABAn8QAAJ7EAECexAAAncQAQJzEAECcxQDFm8UAAJrFAACaxQAAmcUAwJnFAACYxQAgmMUAAJfGAECXxgAAlsYAAJbGAACVxgAAlcYAAJTGAACUxgAAk8cAQJPHAACSxwDAkscAAJLHAACRxwAAkccAAJDHAACQyABAkMgAAI/IAMCPyAAAj8gA047IAACOyAAAjsgAAI3JAACNyQAAjckA04zJAACMyQAAjMkAAIvJAACLyQAAi8oAAIrKAACKygAAisoAAIrKACCJygAAicoAAInKAACIywAAiMsAAIjLAACIywAAh8sAAIfLAACHywAAh8sAAIbMAACGzAAAhswAAIbMAACFzAAAhcwAAIXMAACFzAAAhc0AAITNAACEzQAAhM0AAITNAACDzQAAg80AAIPNAACDzgAAg84AAILOAACCzgAAgs4AAILOAACCzgAAgc4AAIHPAACBzwAAgc8AAIHPAACAzwAAgM8AAIDPAACAzwAAgNAAAIDQAAB/0AAAf9AAAPjV58DeqwBC09XOwMurALbF1sLBwKwAwLzWusG5rADAtta1wbSsAGGx1rDBr6wAwK3XrMKrrQBAqtepwqitAG2n16bCpa0AQKTXo8KjrQDyotihw6GuAACg2J/Dn64AQJ7YncOdrgAtnNibw5uuAFOa2ZnEma8AQJnZmMSYrwAAl9mWxJavAECW2ZXEla8AQJXalMWUsABAk9qTxZOwAECS2pHFkrAAAJHakMWQsABgkNuPxo+xAPWP247GjrEAAI7bjcaNsQAAjduMxo2xAMCM3IzHjLIAAIvci8eLsgAAityKx4qyAECK3InHibIAAIndiMiJswBAiN2IyIizAACH3YfIh7MAAIfdhsiGswAAht6GyYa0AACF3oXJhbQAAIXehMmEtADAhN6EyYS0AACE34PKg7UAwIPfgsqDtQAAgt+CyoK1AACC34HKgrUAAIHggcuBtgAAgeCAy4C2AACA4IDLgLYAAIDgf8t/tgAAf+F/zH+3AAB/4X7Mf7cAAH7hfsx+twAAfuF9zH63AAB94n3NfbgAAH3ifM19uAAAfOJ8zXy4AAB84nzNfLgAAHzje857uQAAe+N7znu5AAB743rOe7kAAHrjes56uQAAeuR6z3q6AAB65HnPeroAAHnkec95ugAAeeR5z3m6AAB55XjQeLsAAHjleNB4uwAA6+zn2uHM28DWtc6mvpRlgbjtwtvDzcLBwLa7p62VZYKo7rTcts62w7W3sKiklmWDn++r3a7PrsOtuKmpnpdlhJjvpN6o0KjFqLmkqpmYZYWS8J/fo9GkxaO6oKuVmWWGjfGb4J/RoMegu52skpllh4nyl+Cb0p3InbyarY+aZYiF8pThmNOayJq9l62Nm2WJgvOR4pXUl8qXvpWui5xlin/0juOT1ZXKlb+Tr4mdZYt89IzkkdaTzJPAkbCHnmWMefWJ5I7XkcyRwY+xhp9ljXb2h+WM2I/NkMKOsoSgZY509oXmi9mNz47CjLODoGWPcfeD54nai8+Nw4u0gqFlkG/3geiH24rQjMSKtYGiZZFt+H/ohtyJ0YrFibWAo2WSavh+6YTdh9OJxoe2f6Rlk2j4fOqD3obUiMeGt36lZZRm+Hvrgd+F1YfIhbh+pmWVZPl564DghNaGyYW5fadllmH5d+x/4IPWhcqEunyoZZdf+XbtfeGB14TLg7t7qWWYXfl17nzigNiDzIK8e6llmVv4c+5743/ags2BvXqqZZpY+HLveuR/2oHOgb56q2WbVvdw8HnlftuBz4C/eaxlnFP2b/B45n3dgNB/v3mtZZ1R9W7xd+d83X/Rf8B4rmWeT/Rs8Xboe99+0n7BeK9ln0zya/J16XrfftN+wnewZaDp8Ofg5NDfwNixzqG8kWmBtfHB4cXRxcHCsrqiq5Jpgqbys+K50rrDt7Owo6KTaYOc86vjsNOyw7C0qaSclGmElfSk5KrUrMWqtaSll5VphY/1n+Wl1afFpragppOWaYaK9prmodajx6K3nKeQl2mHhveX557XoMifuJmojphpiIL4k+ib2J3InLmXqYuZaYl++ZDpmNmbypq6laqJmmmKe/qO6pXamMqXu5OriJtpi3f7i+uT25bMlbyRrIacaYx0/InskdyUzJS9j62FnWmNcf2H7Y/dks2Svo6ug55pjm7+he6N3pHPkL+Mr4KfaY9r/4PvjN+Pz4/Ai7CBoGmQaQCB8IrgjtCNwYqxgKFpkWYBf/GI4YzRjMKIsn+iaZJjAn3yh+KL04vDh7N/o2mTYAN784XjitSKxIa0fqRplF0EevSE5IjVicWFtX2laZVaBXj1g+WH1ojGhbZ8pmmWVgZ39oLmhtaHx4S3fKdpl1MHdfeA54XXhsiDuHuoaZhPCHT4f+iE2IXJgrl7qWmZSwly+X7pg9qEyoG6eqppmkcKcfp96oLag8uBu3mraZtCC2/7fOuB24LMgLx5rGmcOwxu/HvsgN2CzX+9eK1pnTQNbf167X/dgc5/vniuaZ4pDmv+ee5/34DPfr94r2mfFw9q/3jvft9/0H3Ad7BpoAAAAAAAAEJOUzEFAQACeelaBFdBVkUgU1dFRVAAAEJVQkJBAEH4rwYL1QhuQEAAABQAAEBAAAAUAABzCgBAQBQARm5PRU8ATwE8AgABbgV4CHgMeAAAKH8AAAAIQP/A2sC9wLXAsMCswKjApcCjwKDAnsCcwJrAmMCXwJXAlMCTwJHAkMCPwI7AjcCMwIvAisCJwIjAiMCHwIbAhcCFwITAg8CCwILAgcCBwIDAf8B/wH7AfsB9wH3AfMB8wHvAe8B6wHrAesB5wHnAeMB4wHfAd8B3wHbAdsB2wHXA78DzwNXAu8C1wLDArcCqwKfApcCiwKDAnsCdwJvAmsCYwJfAlsCUwJPAksCRwJDAj8COwI7AjcCMwIvAisCKwInAiMCIwIfAhsCGwIXAhMCEwIPAg8CCwILAgcCBwIDAgMB/wH/AfsB+wH3AfcB9wHzAfMB7wHvAe8B6wHrAesDgwOTA8MDUwLvAtsCzwLDArcCqwKjApsCkwKPAocCfwJ7AncCbwJrAmcCYwJfAlsCVwJTAk8CSwJLAkcCQwI/Aj8COwI3AjcCMwIvAi8CKwIrAicCJwIjAiMCHwIfAhsCGwIXAhcCEwITAg8CDwILAgsCCwIHAgcCAwIDAgMB/wOPA1MDfwO3A0sC7wLbAs8CwwK7ArMCqwKjApsClwKPAosCgwJ/AnsCdwJzAm8CawJnAmMCXwJbAlcCUwJTAk8CSwJLAkcCQwJDAj8COwI7AjcCNwIzAjMCLwIvAisCKwInAicCIwIjAh8CHwIbAhsCGwIXAhcCEwITAhMCDwIPA5sDWwM3A2sDqwNHAusC2wLPAscCuwKzAq8CpwKfApsCkwKPAosChwJ/AnsCdwJzAm8CawJrAmcCYwJfAlsCWwJXAlMCUwJPAksCSwJHAkMCQwI/Aj8COwI7AjcCNwIzAjMCLwIvAisCKwIrAicCJwIjAiMCHwIfAh8CGwIbAhsDnwNfAzsDIwNfA58DPwLjAtcCywLDArsCswKrAqcCnwKbApMCjwKLAocCgwJ/AnsCdwJzAm8CawJnAmcCYwJfAlsCWwJXAlMCUwJPAk8CSwJHAkcCQwJDAj8CPwI7AjsCNwI3AjMCMwIvAi8CLwIrAisCJwInAicCIwIjAh8CHwOnA2cDQwMnAxcDUwOXAzsC3wLTAscCvwK7ArMCqwKnAp8CmwKXApMCjwKHAoMCfwJ7AnsCdwJzAm8CawJnAmcCYwJfAl8CWwJXAlcCUwJTAk8CSwJLAkcCRwJDAkMCPwI/AjsCOwI7AjcCNwIzAjMCLwIvAi8CKwIrAicCJwInA6sDawNHAysDFwMHA0sDjwMzAtsCzwLHAr8CtwKvAqsCowKfApsClwKTAosChwKDAoMCfwJ7AncCcwJvAm8CawJnAmMCYwJfAlsCWwJXAlcCUwJTAk8CSwJLAkcCRwJDAkMCPwI/Aj8COwI7AjcCNwIzAjMCMwIvAi8CKwIrAisAAAAAAAABCTlMxBQEAAlWLSgJHTEFTUyBCRUxMUwBCVUJCQQBB2LgGC8UEbkBAFAEGAABAQAAAFAAAeAUAQEAUAGwAZQBiAGIBPAIAAW4FeAh4DHgAADxQAAAACB/9wAAQ4cAAfQBAAODtwAA5AMAAgNHAAPgAQACBAEAAAd3AAAkAwAD6AMAA/QBAAKIAwABzAEAAbADAAIEAwP3AAAvlwAD/AEAAgezAAP8AwACK2cAAgwBAAP0AQAAB2sAACwDAAIEAQADpuMAACQDAAJQAQAABAMAAD7PA/sAAO+nAAAYAwAD26sAAAADAAIXgwAADAEAAAADAAH/XwABAAEAAfQDAAJHJwAAAAMAA1QDAAOoAwACcxMD/wABS7MAAkQBAAPvowAB+AEAAheXAAIQAwACFAEAAedTAAAYAwACHAMAAiNPAAHgAQADqAEAAjADAAO/NwP/AAGzvwACIAEAAeObAAAsAwAAA6cAAgADAAAcAQAAKz8AAgADAAGUAQADg2sAAHgDAAPwAwADAAMAAANXA/8AAePHAAHgAQAAA48AAgwDAAHjswACCAEAABwDAAOPIwADtAEAABwDAAATfwAD6AEAAbQDAAN0AwAD62sD7wAAD8MAAAwDAAPPcwAB2AEAAkOzAAAQAwAALAMAA+bvAAG0AQABtAMAAguDAAPoAwAAPAEAAAgBAAIHawPjAAPPuwAAAAEAAf9XAAPoAQACC68AAAADAAH0AwADxqMAAfwDAAKAAwAAE4MAABADAAH4AwABgAEAABNvAAAAAAAAAQk5TMQUBAAIhZ/oATUFMTEVUIFZJQkVTQlVCQkEAQai9Bgv1AW5AQAAAFAAAQEAAABQAAHYAAEBAFABmAFwAWABYAF4DLQFuBXgIeAx4AABGZAAAAAgK88C+wADA58AAQABAAMAAQADA18D1wL/AAMDmwABAAEAAwADAAMDWwPbAwcAAQOTAAEAAwADAAMAAwNPA+MDCwADA4sAAQABAAMAAwADA0cD5wMTAAMDgwABAAEAAwADAAEDNwPvAxsAAwN3AAEAAQADAAMAAwMnA/cDIwADA2MAAQADAAMAAwADAwcD/wMrAAMDQwABAAEAAwADAAMCzwAAAAAAAAEJOUzEFAQACCkNaBE1JWEVEIENIT0lSAEJVQkJBAEGovwYL1QhpQEAoARIAAEBAAAAUAABkCgBAQBRPWnhcAAB/AAEhAigBbgV4CHgMeAAAHgAAAAAIQPjA/8D2wNjAwsDDwM3A18DYwNHAw8CzwKrApsCkwKPAosCgwJ/AnsCdwJzAm8CawJnAmMCXwJbAlcCUwJTAk8CSwJLAkcCQwJDAj8COwI7AjcCNwIzAjMCLwIvAisCKwInAicCIwIjAh8CHwIbAhsCGwIXAhcCEwITAhMCDwIPA8cD7wPrA48DKwM3A18DcwNjAzMC8wK/AqsCowKbApcCjwKLAocCfwJ7AncCcwJvAmsCZwJjAmMCXwJbAlcCUwJTAk8CSwJLAkcCQwJDAj8CPwI7AjsCNwI3AjMCMwIvAi8CKwIrAicCJwIjAiMCIwIfAh8CGwIbAhsCFwIXAhMDpwPHA+cDrwNPA1cDcwNzA08DDwLTArMCpwKfApcCkwKLAocCgwJ/AnsCcwJvAmsCawJnAmMCXwJbAlcCVwJTAk8CSwJLAkcCQwJDAj8CPwI7AjcCNwIzAjMCLwIvAisCKwInAicCJwIjAiMCHwIfAhsCGwIbAhcCFwITAhMCEwOXA58D1wPHA3sDcwN7A2MDLwLrAr8CqwKjApsClwKPAosCgwJ/AnsCdwJzAm8CawJnAmMCXwJbAlcCVwJTAk8CSwJLAkcCQwJDAj8CPwI7AjcCNwIzAjMCLwIvAisCKwInAicCIwIjAh8CHwIfAhsCGwIXAhcCFwITAhMCDwIPA48DewO/A9MDpwOHA3cDSwMHAs8CswKnAp8CmwKTAo8ChwKDAn8CdwJzAm8CawJnAmMCXwJbAlsCVwJTAk8CTwJLAkcCQwJDAj8CPwI7AjcCNwIzAjMCLwIvAisCKwInAicCIwIjAh8CHwIbAhsCGwIXAhcCEwITAhMCDwIPAgsDiwNjA6MD1wPDA5MDZwMnAuMCvwKvAqcCnwKXAo8CiwKDAn8CewJ3AnMCawJnAmMCYwJfAlsCVwJTAk8CTwJLAkcCQwJDAj8COwI7AjcCNwIzAjMCLwIrAisCJwInAiMCIwIfAh8CHwIbAhsCFwIXAhMCEwITAg8CDwILAgsCCwOLA2MDkwPTA9cDlwNLAwMCywK3AqsCowKbApMCjwKHAoMCewJ3AnMCbwJrAmcCYwJfAlsCVwJTAk8CTwJLAkcCQwJDAj8COwI7AjcCNwIzAi8CLwIrAisCJwInAiMCIwIfAh8CGwIbAhcCFwIXAhMCEwIPAg8CDwILAgsCBwIHA5MDdwOXA88D2wObAzMC4wK/ArMCpwKfApcCkwKLAocCfwJ7AncCbwJrAmcCYwJfAlsCVwJTAlMCTwJLAkcCRwJDAj8COwI7AjcCNwIzAi8CLwIrAisCJwInAiMCIwIfAh8CGwIbAhcCFwITAhMCEwIPAg8CCwILAgsCBwIHAgMAAAAAAAABCTlMxBQEAApi7WgRXQVZFIEJSQVNTAABCVUJCQQBBiMgGC9UIbkBACgEKAABAQAAAFAAAZA8AUEAUL1B4TDxTKEwBPAIAAW4FeAh4DHgAADJaAAAACED/wPvA9sDrwNrAycCewJrAl8CVwJLAkMCPwI3Ai8CKwIjAh8CGwIXAg8CCwIHAgMB/wH7AfsB9wHzAe8B6wHrAecB4wHjAd8B2wHbAdcB0wHTAc8BzwHLAcsBxwHHAcMBwwG/Ab8BuwG7AbsBtwG3AbMBswGvAa8BrwGrAasBqwPbA8cDywPHA7MDhwNPAxsC8wLfAtcCzwJHAj8COwIzAi8CJwIjAh8CGwIXAhMCDwILAgcCAwH/AfsB+wH3AfMB7wHvAesB5wHnAeMB3wHfAdsB2wHXAdcB0wHTAc8BzwHLAcsBxwHHAcMBwwG/Ab8BvwG7AbsBtwG3AbcBswGzA8sDowOjA68DswOrA5MDbwM/Aw8C7wLbAs8CxwLDArsCtwKzAisCJwIjAh8CGwIXAhMCDwILAgcCAwIDAf8B+wH3AfcB8wHvAe8B6wHrAecB4wHjAd8B3wHbAdsB1wHXAdMB0wHPAc8BywHLAcsBxwHHAcMBwwHDAb8BvwG7AbsDywOTA4cDiwObA6MDowOXA3sDVwMvAwMC5wLTAssCwwK/ArcCswKvAqsCpwKfApsCGwIXAhMCDwILAgcCBwIDAf8B+wH7AfcB8wHzAe8B7wHrAesB5wHjAeMB3wHfAdsB2wHbAdcB1wHTAdMBzwHPAcsBywHLAccBxwHHAcMBwwPLA48DcwNvA3cDgwOTA5cDkwODA2cDRwMfAvsC3wLPAsMCvwK3ArMCrwKrAqcCowKfApsClwKTAo8CjwILAgsCBwIDAgMB/wH7AfcB8wHzAe8B7wHrAesB5wHnAeMB4wHfAd8B2wHbAdcB1wHXAdMB0wHPAc8BywHLAcsBxwHHA88DjwNvA18DWwNnA3MDgwOLA4sDgwNvA1cDMwMPAu8C1wLHAr8CtwKzAq8CqwKnAqMCnwKbApcClwKTAo8CiwKLAocCgwKDAf8B+wH7AfcB8wHzAe8B7wHrAesB5wHnAeMB4wHfAd8B3wHbAdsB1wHXAdMB0wHTAc8BzwHPAcsD0wOTA28DVwNLA0sDVwNjA3MDfwODA38DdwNfA0cDJwMDAucC0wLDArsCswKvAqsCpwKjAp8CnwKbApcCkwKTAo8CiwKHAocCgwKDAn8CewJ7AncB9wH3AfMB8wHvAe8B6wHnAecB4wHjAd8B3wHbAdsB2wHXAdcB0wHTAdMBzwPXA5cDbwNXA0cDPwM/A0cDVwNnA3MDewN7A3cDZwNTAzcDFwL3At8CywK/ArcCrwKrAqcCowKfAp8CmwKXApMCkwKPAosCiwKHAoMCgwJ/An8CewJ7AncCcwJzAm8CbwHrAesB5wHnAecB4wHjAd8B3wHbAdsB2wHXAdcB1wHTAAAAAAAAAQk5TMQUBAAKYYFoEV0FWRSBTVFJJTkdTQlVCQkEAQejQBgvVCGlAQAABFAAAQEAAABQAAGgFAEBAFFNaeF4AAH8AAS8CPAFuBXgIeAx4AAAeAAAAAAhA/8AAfubAAJDawAAb0sAACMzAABbHwAABxMAAgsDAANG9wAAEu8AA67jAACG2wAAFtMAA9rPAABqxwABAr8AAea7AAP+twACLq8AA/6rAAO6pwAB0qMAAAKfAAPmmwABApcAA9qTAANijwAAKosAAHKHAAAehwADAoMAAiJ/AAAD5wNPA3MDRwMbAzsCkwMnApsDBwLbAtsC7wKLAu8B9wLfApMCwwK7AosCxwHzAr8CUwKrApMCgwKnAisCqwH3Ap8CZwKDAocCRwKTAUcCjwI7AnsCbwJPAoMB4wKDAfcCdwJLAlcCawIXAncBhwJvAisCWwJXAicCZwGTAmcB9wPfA4sDIwNnAwMDGwMvAjsDEwL7ApcDAwK7AscC6wI3AtMCywJHAtMClwKTAsMCNwKrAqsCAwKvAoMCawKrAjcCiwKXAaMClwJ3AkcCkwI3AnMChwEHAoMCawIjAoMCNwJXAnsBnwJvAmMB/wJzAjMCQwJvAccCXwJbAdcCZwIzA9cDowL/A0MDUwL7Au8DJwL3ApMDAwLvAX8C4wLnAl8CvwLbAo8CjwLPAqMCSwK7AqsBewKnAqsCIwKLAqsCWwJjAqMCdwInApcCgwF3AoMChwH7AmsChwI7AkcCgwJXAgsCewJnAW8CawJvAd8CUwJvAh8CMwJvAj8B+wJjAlMDxwOnA2cCfwMrA0MDHwJ7AusDEwL7AncCvwLvAuMCdwKXAtcCzwJ3AncCwwK/AncCUwKvArMCcwIrAp8CpwJzAfsCjwKfAnMBvwJ/ApMCbwEjAm8CiwJvAYsCXwKDAmsBywJLAnsCawHrAjsCcwJnAf8CKwJrAmMCCwITAmMCYwOvA58DgwNPAucCwwMXAycDFwLjAg8CvwLvAvMC2wKLAkcCuwLTAs8CowILAncCswK/AqsCZwHzAocCpwKnAoMCCwJHAosCmwKPAlMBmwJjAosCiwJvAgsCGwJvAoMCdwJHAEsCQwJzAncCXwILAfMCUwJvAmcCOwFvAicCWwJnA4cDgwN3A2cDTwMvAv8CowJrAs8C8wL7AvsC6wLPApsCAwJjAqcCwwLLAscCtwKXAlMBtwJjApMCpwKvAqcCkwJnAgMCBwJfAoMCkwKTAocCbwI3AW8CIwJfAnsCgwJ/Am8CTwIDAasCLwJbAm8CcwJrAlcCJwGvAecCNwJXAmMDPwM/Az8DOwM3AzMDKwMjAxsDEwMHAvsC6wLbAsMCpwKDAkcBpwITAlsCfwKTAqMCqwKvArMCswKvAqsCowKbAo8CewJnAkcCEwGnAbMCEwI7AlcCZwJzAnsCfwKDAoMCfwJ7AnMCZwJXAkMCJwH7AacBWwHfAg8CLwJDAk8CWwAAAAAAAAEJOUzEFAQACoqFaBENMSUNLIEJBU1MAAEJVQkJBAEHI2QYLmQxzQEAAABQAAEBAAAAUAABIGQBaQBQAWDJAAEUAQAE8AgABbgV4CHgMeAEAMkYAAAAIQP/A2sC9wLXAsMCswKjApcCjwKDAnsCcwJrAmMCXwJXAlMCTwJHAkMCPwI7AjcCMwIvAisCJwIjAiMCHwIbAhcCFwITAg8CCwILAgcCBwIDAf8B/wH7AfsB9wH3AfMB8wHvAe8B6wHrAesB5wHnAeMB4wHfAd8B3wHbAdsB2wHXA78DzwNXAu8C1wLDArcCqwKfApcCiwKDAnsCdwJvAmsCYwJfAlsCUwJPAksCRwJDAj8COwI7AjcCMwIvAisCKwInAiMCIwIfAhsCGwIXAhMCEwIPAg8CCwILAgcCBwIDAgMB/wH/AfsB+wH3AfcB9wHzAfMB7wHvAe8B6wHrAesDgwOTA8MDUwLvAtsCzwLDArcCqwKjApsCkwKPAocCfwJ7AncCbwJrAmcCYwJfAlsCVwJTAk8CSwJLAkcCQwI/Aj8COwI3AjcCMwIvAi8CKwIrAicCJwIjAiMCHwIfAhsCGwIXAhcCEwITAg8CDwILAgsCCwIHAgcCAwIDAgMB/wOPA1MDfwO3A0sC7wLbAs8CwwK7ArMCqwKjApsClwKPAosCgwJ/AnsCdwJzAm8CawJnAmMCXwJbAlcCUwJTAk8CSwJLAkcCQwJDAj8COwI7AjcCNwIzAjMCLwIvAisCKwInAicCIwIjAh8CHwIbAhsCGwIXAhcCEwITAhMCDwIPA5sDWwM3A2sDqwNHAusC2wLPAscCuwKzAq8CpwKfApsCkwKPAosChwJ/AnsCdwJzAm8CawJrAmcCYwJfAlsCWwJXAlMCUwJPAksCSwJHAkMCQwI/Aj8COwI7AjcCNwIzAjMCLwIvAisCKwIrAicCJwIjAiMCHwIfAh8CGwIbAhsDnwNfAzsDIwNfA58DPwLjAtcCywLDArsCswKrAqcCnwKbApMCjwKLAocCgwJ/AnsCdwJzAm8CawJnAmcCYwJfAlsCWwJXAlMCUwJPAk8CSwJHAkcCQwJDAj8CPwI7AjsCNwI3AjMCMwIvAi8CLwIrAisCJwInAicCIwIjAh8CHwOnA2cDQwMnAxcDUwOXAzsC3wLTAscCvwK7ArMCqwKnAp8CmwKXApMCjwKHAoMCfwJ7AnsCdwJzAm8CawJnAmcCYwJfAl8CWwJXAlcCUwJTAk8CSwJLAkcCRwJDAkMCPwI/AjsCOwI7AjcCNwIzAjMCLwIvAi8CKwIrAicCJwInA6sDawNHAysDFwMHA0sDjwMzAtsCzwLHAr8CtwKvAqsCowKfApsClwKTAosChwKDAoMCfwJ7AncCcwJvAm8CawJnAmMCYwJfAlsCWwJXAlcCUwJTAk8CSwJLAkcCRwJDAkMCPwI/Aj8COwI7AjcCNwIzAjMCMwIvAi8CKwIrAisAAAAAAAADwsgEAWAAAAFCzAQBYAAAAsLMBAFgAAAAQtAEAWAAAAHC0AQBYAAAA0LQBAFgAAAAwtQEAWAAAAJC1AQBYAAAA8LUBAFgAAABQtgEAWAAAALC2AQBYAAAAELcBAFgAAABwtwEAWAAAANC3AQBYAAAAMLgBAFgAAACQuAEAWAAAAPC4AQBYAAAAULkBAFgAAACwngAAWgIAABChAABcEgAAcLMAAFoQAADQwwAAXBIAADDWAABcBAAAkNoAAFwgAADw+gAAWgIAAFD9AABaAgAAsP8AAFwEAAAQBAEAXBIAAHAWAQBcEgAA0CgBAFwEAAAwLQEAWgIAAJAvAQBcBAAA8DMBAFwSAABQRgEAXCAAALBmAQBaEAAAEHcBAFoQAABwhwEAWhAAANCXAQBaBAAAMJwBAEoCAACAngEA+gAAAICfAQBaBAAA4KMBAFoEAABAqAEAWgQAAKCsAQBaBAAAsLkBAFgAAAAQugEAWAAAAHC6AQBYAAAA0LoBAFgAAAAwuwEAWAAAAJC7AQBYAAAA8LsBAFgAAABQvAEAWAAAALC8AQBYAAAAEL0BAFgAAABwvQEAWAAAANC9AQBYAAAAML4BAFgAAACQvgEAWAAAAPC+AQBYAAAAUL8BAFgAAAA8AEHw5QYLRkJOUzEDAAACgv1YAFdJWkFSRCBCQVNTAEJVQkJBAAAAAAAAAEkAZkACAFwCAUFcAgJAAAAeVQ8AQgAgAE8zIEYAATkAFEAAQdDmBgtGQk5TMQMAAALNU1gARkFUIFVOSVNPTgAAQlVCQkEAAAAAAAAAM0AsQAIAcwIBQXMCAT9zAB5VDwBPACAAWEAgRgABAAAUQABBsOcGC0ZCTlMxAwAAAr8NWABUVVRUSSBCUkFTUwBCVUJCQQAAAAAAAAAoADNAAgI6AgJBUQICP2gAHlUPU1N/U0lTf1NGAAEAABRAAEGQ6AYLRkJOUzEDAAACbl5YAFJBU1AgQlJBU1MAAEJVQkJBAAAAAAAAABIZU0ACAzoCAkAAAgJAAAAefw9YXEAgQFN/IF4ZAQAAFEAAQfDoBgtGQk5TMQMAAAKXWFgAU0xJREUgQk9ORQAAQlVCQkEAAAAAAAAALRk5QAICOgICQAACAkAAAB5VD1ZTZiBTT2YgXB4AMwAUQABB0OkGC0ZCTlMxAwAAAu52WABOT0lTRSBUVUJBAABCVUJCQQAAAAAAAAAoADNAAgA6AgJAAAICQAANHlUPU1NmU0lRWVFGAAEAABRAAEGw6gYLRkJOUzEDAAACChNYAE9DVEFWRSBHTElERUJVQkJBAAAAAAAAAD5MJkAEARcEBEBcBAFAFwAeVQ8AXAAgAFN/IEYAAUAAFEAAQZDrBgtGQk5TMQMAAAIaFlgARklGVEhTAAAAAAAAQlVCQkEAAAAAAAAAMwAAQAICXAICf1wCAkAAAB5VDwBYfyAAWAAgRgABQAAUQABB8OsGC0ZCTlMxAwAAAmbLWABUTFIgU09VTkQAAABCVUJCQQAAAAAAAAAoAABABAFcBARAXAICQABmHlUPAFx/IABcQCBGAAFAABRAAEHQ7AYLRkJOUzEDAAACkMNYAENPTEQgRlJJRU5EAEJVQkJBAAAAAAAAAEkmQEACAVwCAUFcAgE/XAAeVQ8AWH9YAFh/WEYAAQAAFEAAQbDtBgtGQk5TMQMAAAIv8lgATVVUQU5UIEFSUAAAQlVCQkEAAAAAAAAAUwBAQAMBXAMBf1wCAkAAAB5VDwBYfyAAWH8gRgABUwAUQABBkO4GC0ZCTlMxAwAAAodMWABTT0ZUIEhPUk4AAABCVUJCQQAAAAAAAAASAExAAgJcAgJAAAICQAAAHlUPWFNyIExfWSBZFAFGABRAAEHw7gYLRkJOUzEDAAAC2LdYAFdISU5FIExFQUQAAEJVQkJBAAAAAAAAAFMmAEACBHMDBEFzAgJAUQAeKg8ASX8gAEl/IEYAAUAAFEAAQdDvBgtGQk5TMQMAAAIrJ1gATU9UT1IgUklGRgAAQlVCQkEAAAAAAAAASRkzQAIBXAMCQUUCAkAAAB5VDwBTMyAAT2YgRgABAAAUQABBsPAGC0ZCTlMxAwAAAlQbWABISUdIV0FZIEJBU1NCVUJCQQAAAAAAAAAzJiZAAgFcAABARQICQAAAHlUPAEwZIABRTCBGAAEAABRAAEGQ8QYLRkJOUzEDAAACBrpYAEJFTkRFUiBMRUFEAEJVQkJBAAAAAAAAAFkZGUACAnMDAkFcAgJAAABfVQ8AT2YgFk9/IEYAASwAFEAAQfDxBgtGQk5TMQMAAwJDv1gAU1VCIE9ORQAAAAAATkFIVVNIAAAAAAAAHAAoQAAAVQIBQAACAUAAAEsoKFtaJ2IAYH9HRgABRQEoQABB0PIGC0ZCTlMxAwACAkFLWABSRUVTRQAAAAAAAABNWE1GUlBSAAAAAABoAChAAANKAANAWQACQGQAFCgoAFoAPiJffz5GAAFHAChAAEGw8wYLPEJOUzEGAAACwWFYAFBPTFkgQlJBU1MAAEJVQkJBAAAAAAAAACQNOgABAAEAAAEAAABmVgAINiwlADJYAQBBkPQGCzxCTlMxBgAAAmZZWABTQVcgU1RSSU5HUwBCVUJCQQAAAAAAAABYAAAAAQABAAABAAAAAH8AQwZ/VgBKAAEAQfD0Bgs8Qk5TMQYAAALEp1gAU09GVCBQQUQAAAAAQlVCQkEAAAAAAAAAQA0NGQEBASYAAAAAAEBAAEREZlAAWFgBAEHQ9QYLPEJOUzEGAAAC325YAFBXTSBTVFJJTkdTAEJVQkJBAAAAAAAAAEIAAAABAQF/AAAAAABhfwA3Bn9kADZlAgBBsPYGCzxCTlMxBgAAAkNmWABNT1ZJTkcgU1RSUwBCVUJCQQAAAAAAAABNFAQAAQEBDgAAAAAAJ24AEFtYKABPAAIAQZD3Bgs8Qk5TMQYAAAIKIFgAVk9YIENIT0lSAAAAQlVCQkEAAAAAAAAAOl4DAAABAQAAAQ0CABk+AD4RfzUATEYBAEHw9wYLPEJOUzEGAAACpLpYAERFRVAgQ0hPUkRTAEJVQkJBAAAAAAAAADkZGQAAAQEmAAEAAAAmQAAbUExEAD4AAgBB0PgGCzxCTlMxBgAAAjKSWABQSEFTRSBCUkFTUwBCVUJCQQAAAAAAAAAhBEYAAQEBfwACAAAAf38ALlY1SQFLAAEAQbD5Bgs7Qk5TMQYAAAJVolgAUFVMU0UgT1JHQU4AQlVCQkEAAAAAAAAAK0wOAQABABcAAAAAADV/AAYQUwYBSUgAQZD6Bgs8Qk5TMQYAAAKfpVgARlVOS1kgUExVQ0sAQlVCQkEAAAAAAAAAHhczAAEBAEAAAQAAAEgpAAYjJAgBJwABAEHw+gYLPEJOUzEGAAAC5udYAFBPUCBSSUZGAAAAAEJVQkJBAAAAAAAAAFMTJgABAQEAAAEAAAAZQAAGMSYlAE8AAQBB0PsGCztCTlMxBgAAAjfhWABERUxBWSBMRUFEAABCVUJCQQAAAAAAAAAnYSQAAAEBAAABEgAAADQABjFIBgFVYABBsPwGCztCTlMxBgAAAi0EWABQVUxTRSBCQVNTAABCVUJCQQAAAAAAAAAgAEIAAAEAZjIBAQAAOSQABicAKABMSQBBkP0GCzxCTlMxBgAAAiDCWABST1VORCBCQVNTAABCVUJCQQAAAAAAAAAmGycAAQEAJQABAAAAQAAACFEDPQE7YgEAQfD9Bgs8Qk5TMQYAAAKt7lgAREFSSyBSQVZFAAAAQlVCQkEAAAAAAAAATBkmAAEBAUwAAA0AAHJAABVEZj0AYAACAEHQ/gYLPEJOUzEGAAACbZNYAE5PSVNFIFNXRUVQAEJVQkJBAAAAAAAAAChQWjwAAAEAbgAAAQAAPBRaZChfAB4AAQBBqP8GCw0pAAAAKgAAACsAAAABAEHA/wYLtwEsAAAALQAAAC4AAAAAAAAAQBgAADUYAAD8HQAA8B0AABsMAAARDAAARBIAAOYVAAAmFwAAbA8AAJodAAApFgAAgycAAEsnAAB9JwAARScAAHcnAADSFwAARBIAAOYVAACsFwAAphQAAJodAAApFgAA5xkAAOcZAADwBwAA8AcAAJodAACaHQAAACIAAJodAAADCQAAHRMAAEwYAAAdEwAAMgA3ALQAyACgANwATAR4ABwCpAagD24AQYOBBwtaQAAAgD8AAIA/AACAP83MzD/NzIw/ZmbmPwAAwD8AAIA/AACAPwAAgD8AAIA/AAAAPwAAgD/herQ/AAAAQNejMEAAAGBAexSmQAAA4EAAAQABwACaAIAAcwBmAEHmgQcLQhpDAICpQwAANEQAAIA+AAAAPwAAgD8AAABAAACAQAAB/wMEBf8HDA3/D/////8AAAA/AACAPwAAAEAZGv8cFRb/GABBs4IHC94B/wAAAAAAAAABGsCVAQAAAALhaVICGsCVAtCuzgIAAAADNIArA+FpUgNQnXUDGsCVAwRQswPQrs4D+ynoAwAAAAT3YxYENIArBC14PwThaVIE6m5kBFCddQQoCIYEGsCVBMLTpAQEULMET0DBBNCuzgSkpNsE+ynoBDZG9AQARlZhanJ5foSKjpSYnKCjpqqtrrK1uLq9vsLExsjKzc7R09bY2tze4OHj5ebo6evt7vDx8vP09vb4+fr7/P3+AAECAwQFBgcICQsOEBMXGyEnLzhCUF5ufo6err7O3u76AEGkhAcLFEJCQgBtbW0AAAAAAQAKFCE3XJn/AEHEhAcL/gIFAAAACQAAAA0AAAARAAAAFAAAABcAAAAZAAAAGwAAAB0AAAAfAAAAIQAAACMAAAAlAAAAJwAAACkAAAAqAAAAKwAAAC0AAAAuAAAAoOoaAKDqGgCAiBUAgIgVACwrEgAceg8A+iMPAFB1DQBAxAoAQMQKAIXqCAAOvQcA1KsHAKi6BgCGZAYAIGIFANy1BAC6XwQAh94DAFRdAwBUXQMAELECAHo4AgB6OAIA9eoBAKquAQCqrgEAiFgBAIhYAQDaJAEALPEAACzxAABV1wAAfr0AAESsAABtkgAAT3oAAJZ4AACqawAAqmsAACJWAABaSAAA6EQAAEs8AAAgNwAArjMAABErAAAtJAAALSQAACUeAADXGQAA1xkAAIgVAACIFQAAOhEAAIEPAACBDwAAbw0AADILAACCCgAAyQgAAMAHAABoBwAAEAcAAIMFAABXBQAA0gQAAHoEAACeAwAARQMAAEUDAADBAgAAPQIAAD0CAAARAgAAuQEAALkBAEHQhwcL5AbBAAAAEQAAABEAAAAUAAAAAQAAABQAAAABAAAAEQAAABEAAAAUAAAAwQAAABQAAADBAAAAEQAAABQAAAABAAAAEQAAABQAAADBAAAAEQAAAJQAAAABAAAAEQAAABQAAADBAAAAFAAAAAEAAAAUAAAAAQAAABQAAADBAAAAlAAAAAEAAAAUAAAAAQAAABQAAADBAAAAEQAAAAUAAAAUAAAAAQAAABQAAAABAAAAEQAAAMUAAAAUAAAAAQAAABQAAAABAAAAEQAAAAUAAAAUAAAAwQAAABQAAAABAAAABQAAABQAAADBAAAAEQAAABQAAADBAAAABQAAABQAAAABAAAAEQAAABQAAAABAAAABQAAAAUAAAAUAAAAwQAAABQAAADBAAAABQAAAAUAAAAUAAAAAQAAABQAAADBAAAABQAAABEAAAAUAAAAAQAAABQAAAABAAAABQAAABEAAAAUAAAAwQAAABQAAADBAAAAEQAAAAIAAAAlAAAABQAAABQAAAABAAAAEQAAAAIAAAAlAAAAxQAAABQAAAABAAAAEQAAABEAAADFAAAABQAAABQAAADBAAAAFAAAABQAAAABAAAAEQAAABQAAAABAAAABQAAABQAAADBAAAAFAAAABQAAAABAAAAFAAAABQAAADBAAAAFAAAABQAAADBAAAAFAAAABQAAAAUAAAAAQAAABQAAADBAAAAFAAAABQAAAABAAAAFAAAAAQAAADBAAAAFAAAABQAAAAUAAAABAAAAAQAAADBAAAAFAAAABQAAAAEAAAABAAAAAQAAADBAAAABQAAABQAAAABAAAAFAAAAAQA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";return f}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{env:wasmImports,wasi_snapshot_preview1:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["memory"];updateMemoryViews();addOnInit(wasmExports["__wasm_call_ctors"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}wasmBinaryFile??=findWasmBinary();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);receiveInstantiationResult(result);return result}catch(e){readyPromiseReject(e);return}}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module["noExitRuntime"]||true;var __emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var wasmImports={_emscripten_memcpy_js:__emscripten_memcpy_js};var wasmExports;createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["__wasm_call_ctors"])();var _bm_web_flash=Module["_bm_web_flash"]=()=>(_bm_web_flash=Module["_bm_web_flash"]=wasmExports["bm_web_flash"])();var _bm_web_flash_size=Module["_bm_web_flash_size"]=()=>(_bm_web_flash_size=Module["_bm_web_flash_size"]=wasmExports["bm_web_flash_size"])();var _bm_web_flash_blank=Module["_bm_web_flash_blank"]=()=>(_bm_web_flash_blank=Module["_bm_web_flash_blank"]=wasmExports["bm_web_flash_blank"])();var _bm_web_flash_writes=Module["_bm_web_flash_writes"]=()=>(_bm_web_flash_writes=Module["_bm_web_flash_writes"]=wasmExports["bm_web_flash_writes"])();var _bm_web_init=Module["_bm_web_init"]=a0=>(_bm_web_init=Module["_bm_web_init"]=wasmExports["bm_web_init"])(a0);var _bm_web_button=Module["_bm_web_button"]=(a0,a1,a2)=>(_bm_web_button=Module["_bm_web_button"]=wasmExports["bm_web_button"])(a0,a1,a2);var _bm_web_key=Module["_bm_web_key"]=(a0,a1,a2)=>(_bm_web_key=Module["_bm_web_key"]=wasmExports["bm_web_key"])(a0,a1,a2);var _bm_web_encoder=Module["_bm_web_encoder"]=(a0,a1,a2)=>(_bm_web_encoder=Module["_bm_web_encoder"]=wasmExports["bm_web_encoder"])(a0,a1,a2);var _bm_web_master=Module["_bm_web_master"]=a0=>(_bm_web_master=Module["_bm_web_master"]=wasmExports["bm_web_master"])(a0);var _bm_web_midi=Module["_bm_web_midi"]=a0=>(_bm_web_midi=Module["_bm_web_midi"]=wasmExports["bm_web_midi"])(a0);var _bm_web_tick=Module["_bm_web_tick"]=a0=>(_bm_web_tick=Module["_bm_web_tick"]=wasmExports["bm_web_tick"])(a0);var _bm_web_render=Module["_bm_web_render"]=a0=>(_bm_web_render=Module["_bm_web_render"]=wasmExports["bm_web_render"])(a0);var _bm_web_fb=Module["_bm_web_fb"]=()=>(_bm_web_fb=Module["_bm_web_fb"]=wasmExports["bm_web_fb"])();var _bm_web_leds=Module["_bm_web_leds"]=()=>(_bm_web_leds=Module["_bm_web_leds"]=wasmExports["bm_web_leds"])();var _bm_web_sampler=Module["_bm_web_sampler"]=()=>(_bm_web_sampler=Module["_bm_web_sampler"]=wasmExports["bm_web_sampler"])();var _bm_web_sampler_cap=Module["_bm_web_sampler_cap"]=()=>(_bm_web_sampler_cap=Module["_bm_web_sampler_cap"]=wasmExports["bm_web_sampler_cap"])();var _bm_web_bpm=Module["_bm_web_bpm"]=()=>(_bm_web_bpm=Module["_bm_web_bpm"]=wasmExports["bm_web_bpm"])();var _bm_web_takes_free=Module["_bm_web_takes_free"]=()=>(_bm_web_takes_free=Module["_bm_web_takes_free"]=wasmExports["bm_web_takes_free"])();var _bm_web_takes_total=Module["_bm_web_takes_total"]=()=>(_bm_web_takes_total=Module["_bm_web_takes_total"]=wasmExports["bm_web_takes_total"])();var _bm_web_sampler_set=Module["_bm_web_sampler_set"]=(a0,a1)=>(_bm_web_sampler_set=Module["_bm_web_sampler_set"]=wasmExports["bm_web_sampler_set"])(a0,a1);var _bm_web_midi_out=Module["_bm_web_midi_out"]=(a0,a1)=>(_bm_web_midi_out=Module["_bm_web_midi_out"]=wasmExports["bm_web_midi_out"])(a0,a1);var _bm_web_lang_buf=Module["_bm_web_lang_buf"]=()=>(_bm_web_lang_buf=Module["_bm_web_lang_buf"]=wasmExports["bm_web_lang_buf"])();var _bm_web_lang_load=Module["_bm_web_lang_load"]=a0=>(_bm_web_lang_load=Module["_bm_web_lang_load"]=wasmExports["bm_web_lang_load"])(a0);var _bm_web_lang_on=Module["_bm_web_lang_on"]=()=>(_bm_web_lang_on=Module["_bm_web_lang_on"]=wasmExports["bm_web_lang_on"])();var _bm_web_sound_buf=Module["_bm_web_sound_buf"]=()=>(_bm_web_sound_buf=Module["_bm_web_sound_buf"]=wasmExports["bm_web_sound_buf"])();var _bm_web_sound_load=Module["_bm_web_sound_load"]=a0=>(_bm_web_sound_load=Module["_bm_web_sound_load"]=wasmExports["bm_web_sound_load"])(a0);var _bm_web_sound_count=Module["_bm_web_sound_count"]=a0=>(_bm_web_sound_count=Module["_bm_web_sound_count"]=wasmExports["bm_web_sound_count"])(a0);var _bm_web_view=Module["_bm_web_view"]=()=>(_bm_web_view=Module["_bm_web_view"]=wasmExports["bm_web_view"])();var _bm_web_playing=Module["_bm_web_playing"]=()=>(_bm_web_playing=Module["_bm_web_playing"]=wasmExports["bm_web_playing"])();var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["_emscripten_stack_restore"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["_emscripten_stack_alloc"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["emscripten_stack_get_current"])();var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise; +var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var scriptDirectory="";var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var wasmBinary=Module["wasmBinary"];function intArrayFromBase64(s){var decoded=atob(s);var bytes=new Uint8Array(decoded.length);for(var i=0;ifilename.startsWith(dataURIPrefix);function findWasmBinary(){var f="data:application/octet-stream;base64,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MGoQzQIaDAELIAVBvdjgACgAADYCWCAFQbXY4AApAAA3A1AgBUEAOgBcQccJEHUhCSAFIAVB0ABqNgJAIAVB4ABqQR4gCSAFQUBrEM0CGgsgBSAFQeAAajYCIEGg1OAAQR5B8gkgBUEgahDNAhpBwNTgAEHQ1OAAKAIAQdwLajYCAEEAIQkLIAVBoAFqJAAgCQvXAwEHfyMAQSBrIgQkAEGArOAALQAAQayr4AAtAABB2KrgAC0AAEGEquAALQAAQbCp4AAtAABB3KjgAC0AAEG0p+AALQAAQYio4AAtAABqampqampqQQdNBEBBtKfgACAEEMkBA0BBACACQQFqIAAgBGoiBS0AACIGGyEDIAIgASABIAJIGyABIAYbIQECfwJAIABBGEYNACAFLQABDQAgA0EBagwBCyADIAEgASADSBshAUEACyECIABBAmoiAEEaRw0AC0G0p+AALQAABH9BwKfgACgCAAVBAAshAEGIqOAALQAABEBBlKjgACgCACAAaiEAC0HcqOAALQAABEBB6KjgACgCACAAaiEAC0GwqeAALQAABEBBvKngACgCACAAaiEAC0GEquAALQAABEBBkKrgACgCACAAaiEAC0HYquAALQAABEBB5KrgACgCACAAaiEACyABQQx0IQJBrKvgAC0AAARAQbir4AAoAgAgAGohAAtBgKzgAC0AAARAQYys4AAoAgAgAGohAAtBgIADIAJBgAFrIgJBgO4FIABrIgMgAiADSRsiAiACQYCAA08bQQAgAEH/7QVNG0EAIAEbIQELIARBIGokAEGAgAMgASABQYCAA08bC4QBAQR/AkAgAC0A0KIIIgQEQCAAQcaiCGohBSAAQbyiCGohBgNAIAMgBmotAAAgAUYEQCACIAMgBWotAABGDQMLIANBAWoiAyAERw0ACyAEQQlLDQELIAAgBGogAToAvKIIIAAgAC0A0KIIaiACOgDGogggACAALQDQoghBAWo6ANCiCAsLlQIBBH8CQCAALgGwoghBAEgNACAALQDQoggiAwRAIABBxqIIaiEEIABBvKIIaiEFA0AgAiAFai0AAEEBRgRAIAIgBGotAABFDQMLIAJBAWoiAiADRw0ACyADQQlLDQELIAAgA2pBAToAvKIIIAAgAC0A0KIIakEAOgDGogggACAALQDQoghBAWo6ANCiCAsCQCAB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DQIgACABQThsakG99gBqLQAAQQJBBCACG3FBAEcPCyAAIAFBOGxqQbn2AGotAABBBEECIAIbcUUPCyACRQ0AIAAgAUE4bGpB6PYAai0AAEECcUUhAwsgAwu2BwEKfyMAQRBrIggkAAJAIAAgAUEwbGoiAy0AVyIFQQJrIgRB/wFxQQRLDQAgA0FAayEJAkACQAJAIAQOAwECAAILIAAgAUE4bGoiA0HD9gBqLQAAIQogA0HC9gBqLQAAIQYgA0HB9gBqLQAAIQcgA0HA9gBqLQAAIQkgA0G/9gBqLQAAIQUgA0G99gBqLQAAIQwgA0G+9gBqLQAAIQQgCCADQcr2AGopAQA3AQYgCCADQcT2AGoiCykBADcDACAAIAEQigECQCAEQQVLDQAgBUEFSw0AIAlBBUsNACAHQQVLDQAgBkEFSw0AIApBBUsNAEEBIAV0QQEgBHRyQQEgCXRyQQEgB3RyQQEgBnRyQQEgCnRyQT9HDQAgA0G49gBqIgEgCjoACyABIAY6AAogASAHOgAJIAEgCToACCABIAU6AAcgASAEOgAGIAEgDDoABSALIAgpAQY3AAYgCyAIKQMANwAACyAAQYj5AGogAhDBAUGcARCsAhoMAgsgACABQThsaiIDQbz2AGotAAAhBiADQbv2AGotAAAhByADQbr2AGotAAAhBSADQbj2AGoiBC8BACEKIAhBBGoiCyADQcH2AGotAAA6AAAgCCADQb32AGoiAygAADYCACAAIAEQigECQAJAIAUNACAHDQAgBkUNAQsgBCAGOgAEIAQgBzoAAyAEIAU6AAIgBCAKQQh2OgABIAMgCy0AADoABCADIAgoAgA2AAALIAlBBzoADSAJIAJBDG8iAEEMaiAAIABBAEgbQQxsIgBBuOAAai0AADoAGCAJIABBtOAAaigCADYAACAEIABBuuAAai0AADoAAAwBCyAAIAFBOGxqIgNB7PYAaigBACELIANB6/YAai0AACEGIANB6vYAai0AACEHIANB6fYAai0AACEEIANB6PYAai0AACEKIAAgARCKASAFEL8BIgBFDQAgBSACIABvIABqIABvEMABIgFFDQAgA0G49gBqIgAgASkAKDcAACAAIAEpAFA3ACggACABKQBINwAgIAAgAUFAaykAADcAGCAAIAEpADg3ABAgACABKQAwNwAIIAkgASgA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GiAAQRQ6AIkaIABBGDoAhhogAEH/AToAhBogAEGYGmpBADYBACAAQgA3AZAaIABBFDoAlRogAEEYOgCSGiAAQf8BOgCQGiAAQaQaakEANgEAIABCADcBnBogAEEUOgChGiAAQRg6AJ4aIABB/wE6AJwaIABBqBpqIQUDQCACQYAUbCAFakGAKGshBkEAIQMDQCAGIANBKGxqIgFBADsAJiABQX82ACIgAUGByAE7ACAgAUL/////j4DA/+QANwAYIAFBgcgBOwAWIAFC/////4+AwP/kADcADiABQYHIATsADCABQYCA/KcGNgAIIAFC/8mFoHY3AAAgA0EBaiIDQcAARw0ACyACQQFqIgJBBkcNAAsgAEG18wBqQQI6AAAgAEGx8ABqQQI6AAAgAEGt7QBqQQI6AAAgAEGp6gBqQQI6AAAgBEEAEIkBIABB0PjoggQ2ABMgAEECIAAtAKgBEI8BIABBAyAALQDYARCPASAAQQQgAC0AiAIQjwEgAEEFIAAtALgCEI8BIABB8PYAahCMAQsmACAAQgA3AQAgAEEANgEIIABBFDoABSAAQRg6AAIgAEH/AToAAAsKACAALQADQQR0C/0PAhJ/AX5BfyENIAEgACkAADcAACABIAApADg3ADggASAAKQAwNwAwIAEgACkAKDcAKCABIAApACA3ACAgASAAKQAYNwAYIAEgACkAEDcAECABIAApAAg3AAggASAALQAAOgAAIAAtAAEhAiABQQo6ABEgASACOgABIAFBQGsgAEFAa0GgAhCsAhpBsAUhByABQeACaiAAQbj2AGpB0AIQrAIaIAFBCmohDyABQQlqIRAgAUEEaiERIABB4AJqIRIgAEGoGmohEwJAA0ACQCAMQQFNBEAgB0GEAWoiA0GAwABKDQMgASAHaiASIAxBhAtsaiIHQYABEKwCIg4gBy0AgAE6AIABIA4gBy0AgQE6AIEBIAdBhAFqIQlBACEEQQAhCgNAIApBAnYhCyAKQQZ0IQZBACECA0AgBiAJaiACai0AACIFBEAgA0EDaiIIQYDAAEoNBiABIANqIgMgAiAGajoAACADIAU6AAIgAyALOgABIARBAWohBCAIIQMLIAJBAWoiAkHAAEcNAAsgCkEBaiIKQRBHDQALIA4gBDsAggEgA0GAwABODQMgB0GECWohCCADQQFqIQdBACEG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BHMQ2AIgACAMQRBqIAYQ1AIgAEEwIAMgBmtBAEEAENgCIAAgDyAJENQCIABBICACIAcgBEGAwABzENgCIAIgByACIAdKGyEKCyAMQbAEaiQAIAoLrQUCBn4EfyABIAEoAgBBB2pBeHEiAUEQajYCACAAIAEpAwAhAiABKQMIIQYjAEEgayIBJAAgBkL///////8/gyEDAn4gBkIwiEL//wGDIgSnIgBBgfgAa0H9D00EQCADQgSGIAJCPIiEIQMgAEGA+ABrrSEEAkAgAkL//////////w+DIgJCgYCAgICAgIAIWgRAIANCAXwhAwwBCyACQoCAgICAgICACFINACADQgGDIAN8IQMLQgAgAyADQv////////8HViIAGyECIACtIAR8DAELAkAgAiADhFANACAEQv//AVINACADQgSGIAJCPIiEQoCAgICAgIAEhCECQv8PDAELIABB/ocBSwRAQgAhAkL/DwwBC0GA+ABBgfgAIARQIggbIgsgAGsiCUHwAEoEQEIAIQJCAAwBCyABQRBqIQogAiEEIAMgA0KAgICAgIDAAIQgCBsiAyEFAkBBgAEgCWsiCEHAAHEEQCACIAhBQGqthiEFQgAhBAwBCyAIRQ0AIAUgCK0iB4YgBEHAACAIa62IhCEFIAQgB4YhBAsgCiAENwMAIAogBTcDCAJAIAlBwABxBEAgAyAJQUBqrYghAkIAIQMMAQsgCUUNACADQcAAIAlrrYYgAiAJrSIEiIQhAiADIASIIQMLIAEgAjcDACABIAM3AwggASkDCEIEhiABKQMAIgNCPIiEIQICQCAAIAtHIAEpAxAgASkDGIRCAFJxrSADQv//////////D4OEIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACFINACACQgGDIAJ8IQILIAJCgICAgICAgAiFIAIgAkL/////////B1YiABshAiAArQshAyABQSBqJAAgBkKAgICAgICAgIB/gyADQjSGhCAChL85AwALqgEBBX8gACgCVCIDKAIAIQUgAygCBCIEIAAoAhQgACgCHCIHayIGIAQgBkkbIgYEQCAFIAcgBhCsAhogAyADKAIAIAZqIgU2AgAgAyADKAIEIAZrIgQ2AgQLIAQgAiACIARLGyIEBEAgBSABIAQQrAIaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIDNgIcIAAgAzYCFCACC6UCACAARQRAQQAPCwJ/AkAgAAR/IAFB/wBNDQECQEHgpusAKAIAKAIARQRAIAFBgH9xQYC/A0YNA0HEpesAQRk2AgAMAQsgAUH/D00EQCAAIAFBP3FBgAFyOgABIAAgAUEGdkHAAXI6AABBAgwECyABQYBAcUGAwANHIAFBgLADT3FFBEAgACABQT9xQYABcjoAAiAAIAFBDHZB4AFyOgAAIAAgAUEGdkE/cUGAAXI6AAFBAwwECyABQYCABGtB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBAwEC0HEpesAQRk2AgALQX8FQQELDAELIAAgAToAAEEBCwsGACAAJAALEAAjACAAa0FwcSIAJAAgAAsEACMACwuo+QehAgBBgAgL5iZA/Fr54LefB9+b83efB0D883da+QAA+gCQASAD//8tKyAgIDBYMHgALTBYKzBYIDBYLTB4KzB4IDB4ACV1LiV1ACUuOXMAJS41cwAlLjNzACUuMTBzACUuKnMAVEFLRSAlMDJkJXMAJTAyZCAlcyAlcyAlcwBUJWQgJXMgJXMAJXMgVCVkICVzAE9QJWQgJXMARU5WICVkLyVkICVzAExGTyAlZC8lZCAlcwBGWCAlcwBUJWQgU1BFRUQgJXMAVCVkID0gJXMAU09VTkQgU0FWRUQ6ICVzAEJYLTcgJXMARlggJWQvMiAlcwAlZCAlcyAtICVzAG5hbgBpbmYAPkElMDJkAFNBVkVEIEFTIEElMDJkAFBBVFRFUk4gQSUwMmQAU0FWRUQgQSUwMmQAT0NUQVZFICUrZAAlcyVkAENMRUFSIFQlZABTT0xPIFQlZAAlcyBBTFJFQURZIE9OIFQlZABQJWQATSVkACVzICVkLyVkAEJBUiAlZC8lZABMRk8gJWQvJWQAUEFHRSAlZC8lZABTVEVQIFJFQyAlZC8lZAAlZC4lZAAlcy0lZAAlcyAlZC0lZABMRU5HVEhTICVkLSVkAE9DVCArJWQAT0NUQVZFICslZAAlcyAlZABPQ1QgJWQAUCVkIExFTkdUSCAlZABBTEcgJWQAT0NUQVZFICVkAFRBS0UgJTAyZCBPTiBQQUQgJWQARkIgJWQAUyVjAD4lYwBERUxFVEUgU0NFTkUgJWMAVjAuMTAuMC1iZXRhACV1LiV1IEtIWgAlLjFmIEtIWgAldSBIWgAlLjJmIEhaACUuMWYgSFoAJWQgSFoAIEVNUFRZAFNOQVBQWQBQT0xZAE9ORSBCQVIgT05MWQBLRVkAVEFLRSAlMDJkOiBLSVQgUkVBRFkAU0FNUExFIEFSTUVEOiBQUkVTUyBQTEFZAERFTEFZAEYgREVDQVkAUkVWIE1JWABNT0QgTUlYAE1BU1RFUiBGWABTRU5EOiBBTFdBWVMgQUZURVIgVEhFIEZYAE5BUlJPVwBTQVcARU5WAFJFVgBUSFJVAEVYVABPVVRQVVQATE9PUCBPVVQATUlESSBPVVQAU1lOQyBPVVQAU1RPUDogVEhFIExBU1QgU0FNUExFIElTIFNBVkVEIEZJUlNUAERJU1QAREVTVAAlK2QgU1QAKyVkIFNUAFNUQVJUAFJPT1QAU0xPVABPTkVTSE9UAFdISVRFID0gVE9HR0xFIEFDQ0VOVCAgSzEgPSBBTU9VTlQASU5TVFJVTUVOVABBQ0NFTlQAUVVBTlQATU9EIEFNVABNNCBBTVQATTMgQU1UAEVOVjIgQU1UAE0yIEFNVABNMSBBTVQAVkVMIEZJTFQAUElUAElOSVQAVCVkIEtJVABXSElURSA9IFBJQ0sgQU5EIEhFQVIgIEsxLUs0ID0gVEhFIEhJVABFRElUAFNFTEVDVCBNT1ZFUyBJVABVUFJJR0hUAEJSSUdIVABTT0ZUAFBSRVNFVABWT0lDRSBSRVNFVABTT1VORCBSRVNFVABUQVJHRVQAU0VMRUNUACUrZCBDVABNRVRBTCBIQVQAQU5BTE9HIEhBVABSRVBFQVQAQklHIEJFQVQAJWQrJWQsIEZSRUUgJXUuJXVTAEFMV0FZUwBQTEFZUwBDSE9SVVMAQUNDRU5UUwBQUkVTRVRTAExPVURORVNTAFNZTlRIIEJBU1MAJWQgQkFSUwA4IEJBUlMANCBCQVJTADIgQkFSUwBCQVIgJWQvJWQgICVkIFNURVBTAEVOVjIgUE9TAFAgU0VOUwBWRUwgU0VOUwAldSBNUwAlZCBNUwBQSVRDSCBMRVZFTFMARU1QSEFTSVMAWUVTAENVUlZFUwBQSVRDSCBSQVRFUwBSRVMAQlgtNyBCQU5LOiAlZCBWT0lDRVMATVVURSBTT1VORFMASURMRSBMRURTAFNBVkUgQVMAJXUuJTAzdSBTAExPQUQgSU4gJXUuJXUgUwBTQU1QTElORyAldS4ldSBTACUuMWYgUwBMIENPTlRPVVIARiBDT05UT1VSAElOU1RSAFNRUgBSRVNPTkFUT1IARkxBU0ggRVJST1IATUlOT1IAQ09MT1IATUFKT1IATUlYRVIAVCVkIEZJTFRFUgBQSEFTRVIAT1JERVIATEFEREVSACVkQlIAU0FWRSBBR0FJTiA9IENMRUFSACVkIEJBUgBTQ0VORSAlYzogTkVYVCBCQVIAU0FNUExFOiBORVhUIEJBUgAxIEJBUgBFWElUOiBFTlYgT1IgSE9NRSAgQkxBQ0sgPSBTT1VORCwgQkFSAEVYSVQ6IExGTyBPUiBIT01FICBCTEFDSyA9IFNPVU5ELCBCQVIARVhJVDogU0NMIE9SIEhPTUUgIEJMQUNLID0gU09VTkQsIEJBUgBTUExJVCBML1IAU0VRAEZSRVEALUVYUAArRVhQAFNBVyBVUABUUkFOU1AAQVJQAExPT1AAUFVNUABMUABIUAAlZCBTVEVQAEJQAENMQVAATUlYTwBBVVRPAExFR0FUTwBNNCBUTwBNMyBUTwBNMiBUTwBNMSBUTwBSRVNPAFRFTVBPAE1PTk8AR0xPAFZFTE8AUkFUSU8AQUxHTwBMRk8AU1RFUkVPAERDTwBTQVcgRE9XTgBUVVJOAENMRUFSIFBBVFRFUk4AJWQgUFBRTgBVTklTT04AUkVTT04ARElTVE9SVElPTgBQT1NJVElPTgBWRVJTSU9OADIgSEVBVlkgT04ARExZIE9OAFJFViBPTgBSRUMgT04ASEFSTSBNSU4ALUxJTgArTElOAFNVU1RBSU4ATUFJTgBDTEVBUj8gU0FWRSBBR0FJTgBMT09QIElOAE9QRU4AU0FXIEROAE5BTgBET1JJQU4ATFlESUFOAFBXTQBNRURJVU0AV0FWRUZPUk0AQlBNAFRPTQBaT09NAFBBVFRFUk4gRlVMTDogTk8gUk9PTQBSQU5ET00AVFJJTQBESU0AQUxHT1JJVEhNAEZNAFNZU1RFTQBXSElURSA9IENZQ0xFIFgxLVg0IEFORCBGTEFNAE9VVCBMVkwAVkVMIExWTABLQkQgQ1RSTABDT05UUk9MAFNDUk9MTABOTyBGSUxMAENPV0JFTEwARkwATEVWRUwAS0VZIFZFTABTRUwAUEFORUwATU9ERUwARVhDTABSQVRFIFNDTABJTkNMAENPV0JMAE1BTlVBTABCSVRUQUwASU5TUElSRUQgQlkgVklUQUwATUVUQUwARVhURVJOQUwAQ0xPQ0s6IElOVEVSTkFMAE5PUk1BTAAldS4ldUsAS0VZVFJLAFNIQVJLAFJPQk9UIEZVTksAQ0xPQ0sARVhJVDogRURJVCBPUiBIT01FICBXSElURSA9IFBJQ0sAU1lOVEggS0lDSwBBTkFMT0cgS0lDSwBBVFRBQ0sAVFJBQ0sARkVFREJBQ0sARExZIEZEQksAQlJFQUsAVFJJAEItTUlOSQBQRU5UQSBNSQBJK0lJAEVYVCBDTE9DSzogV0FJVElORyBGT1IgTUlESQBSIERFUFRIAEwgREVQVEgAQk9USABTWU5USABPVVRTSURFIFRIRSBMRU5HVEgARU5HTElTSABQSVRDSABQQVRDSABMQVRDSABQVU5DSABNSURJIENIAFMmSABQSFJZRwBJTlNQSVJFRCBCWSBUSEUgTUlOSU1PT0cAU1dJTkcAVFVOSU5HAFNDQUxJTkcAQUxHAEhQRgBJTkYAQ1VUT0ZGAENVVCBPRkYAVFdPIENPUkVTIE9GRgBTT0xPIE9GRgBGQVNUIFNDUkVFTiBPRkYAUkVDIE9GRgBWQ08gVkNGAEhQRiBWQ0YAUkVWIFNJWkUAUiBDVVJWRQBMIENVUlZFAE9WRVJEUklWRQBEQ08gV0FWRQBPQ1RBVkUAU1RPUCBUTyBTQVZFAE9OTFkgV0hFTiBTVE9QUEVEIC0gU0FWRSAyIFM6IFFVSUNLIFNBVkUATk8gQ0hBTkdFOiBTVE9QIEFORCBTQVZFAFZBTFVFAE1VVEUAU1RFUCAlZDogTk8gTk9URQBSRUMgQVJNRUQ6IFBMQVkgQSBOT1RFAE1PRCBSQVRFAEVOVi9HQVRFAFJFVkVSU0UAQ09BUlNFAFRSQU5TUE9TRQBQVUxTRQBOT0lTRQBSRUxFQVNFAFBSRQBTUVVBUkUAU1lOVEggU05BUkUAQU5BTE9HIFNOQVJFAFRZUEUAU0hBUEUAREVUVU5FAFRPTkUATk9ORQBTSU5FAFNFTEVDVCBNQUNISU5FAEZJTkUAVk9MVU1FAEVYSVQ6IEJMQUNLIDExIE9SIEhPTUUARExZIFRJTUUARlJBTUUAU0FNUExFAFRSSUFOR0xFAFRBQkxFAFRFTVBPIEFORCBTQ0FMRQBDSE9LRQBOTyBUQUtFAFNBVklORyBUSEUgVEFLRQBOTyBST09NOiBERUxFVEUgQSBUQUtFAFJBTkdFAExBTkdVQUdFAFBBR0UAUFdNIE1PREUAV0lERQBTTElERQBHTElERQAlZCBQQURTICsgU0VRVUVOQ0UAVk9JQ0UAU1BBQ0UARldEAE9DVC0gU09GVCAgT0NUKyBIQVJEAEVOViBNT0QAQU1QIE1PRABEQ08gTU9EAFZDRiBNT0QAV0hJVEUgPSBNVVRFIE9SIFBMQVkgVEhBVCBTT1VORABOT1QgQSBVU0VSIFNPVU5EAFRIQVQgSVMgTk9UIEEgQlVCQkEgU09VTkQATk8gUk9PTTogREVMRVRFIEEgVEFLRSBPUiBBIFNPVU5EAFNFTkQAUE1EAEFNRABTTEQAQlVJTEQAR0xEAFRISVMgTUFDSElORSBJUyBGSVhFRABVTlNBVkVEAEElMDJkIFFVRVVFRABNVVRFRABTQ0VORSAlYyBERUxFVEVEAFNPVU5EIERFTEVURUQAU0NFTkUgJWMgQSUwMmQgU1RPUkVEAFQlZCBDTEVBUkVEAFBBVFRFUk4gQ0xFQVJFRABTQVZFUyBXSEVOIFNUT1BQRUQAU0FNUExFIFNUT1BQRUQAU0FNUExFIEFSTUVEAExBVENIRUQATEFOR1VBR0UgUEFDSyBJUyBEQU1BR0VEAExFTkdUSC9TUEVFRABOTyBST09NIElOIFRBS0VTOiBESVNDQVJERUQAUExBQ0VEAEtZQkQAUEFEAE9TQwBMRk8gU1lOQwBPU0MgU1lOQwBDTEFTU0lDAFNURVAgUkVDAEFDQwBTVUIATk8gTEFOR1VBR0UgUEFDSzogTE9BRCBPTkUgQlkgVVNCAERFTEFZIFJFVkVSQgBDSE9SVVMgUkVWRVJCAEUuQkFTUyBCAFBPUlRBAFBFTlRBIE1BAFZDQQBFLkJBU1MgQQBFWFQ/AEZBQyA/ADwgJXMgPgA8AFNEOTA5AEJEOTA5AFNEIDkwOQBCRCA5MDkAWDgAODg4AEhIODA4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AABMRUFEAAAAAABTVVBFUiBGTQBCVVpaAAAAAABRVUVSWSBCUwBRVUVSWUJSUwBTS0VUQ0hCUwBUT01DQVRCUwBCUlRITEVTUwBDUklTUCBCUwBFTU9UTkhSUABCQU5BTkFNUgBPV0xTIEVQAABESVZBIEVQAABMQUdPT05FUABB16wBC6sDBAQEBAQABAoKAAAAAAAKCh8KHwoKAAAAAAAAABgZAgQIEwMMEhQIFRINBAQAAAAAAAIECAgIBAIIBAICAgQIAAQVDhUEAAAEBB8EBAAAAAAADAQIAAAAHwAAAAAAAAAADAwAAQIECBAADhETFRkRDgQMBAQEBA4OEQECBAgfHwIEAgERDgIGChIfAgIfEB4BAREOBggQHhERDh8BAgQICAgOEREOEREODhERDwECDAAMDAAMDAAAAAAAAAAAAgQIEAgEAgAAHwAfAAAIBAIBAgQIDhEBAgQABAAAAAAAAAAOEREfERERHhERHhERHg4REBAQEQ4eEREREREeHxAQHhAQHx8QEB4QEBAOERAXEREPERERHxEREQ4EBAQEBA4HAgICAhIMERIUGBQSERAQEBAQEB8RGxUVEREREREZFRMREQ4REREREQ4eEREeEBAQDhERERUSDR4RER4UEhEPEBAOAQEeHwQEBAQEBBEREREREQ4REREREQoEERERFRUVChERCgQKEREREQoEBAQEHwECBAgQHw4ICAgICA4AAAAAAAAADgICAgICDgBBj7ABC9cBHwAAAAAAAAAOEREfERERHhERHhERHg4REBAQEQ4eEREREREeHxAQHhAQHx8QEB4QEBAOERAXEREPERERHxEREQ4EBAQEBA4HAgICAhIMERIUGBQSERAQEBAQEB8AABoVFREREREZFRMREQ4REREREQ4eEREeEBAQDhERERUSDR4RER4UEhEPEBAOAQEeHwQEBAQEBBEREREREQ4REREREQoEERERFRUVChERCgQKEREREQoEBAQEHwECBAgQHwAAAAAAAAAEBAQEBAQEAAAAAAAAAAwSEgwAQfWxAQuiAgICAgACAAAAAAAFBwUHBQAAAAAABQECBAUAAAAAAAICAAAAAgQEBAICAQEBAgAFAgUAAAIHAgAAAAACBAAABwAAAAAAAAIBAQIEBAcFBQUHAgYCAgcGAQIEBwYBAgEGBQUHAQEHBAYBBgMEBwUHBwECAgIHBQcFBwcFBwEGAAIAAgAAAAAAAAECBAIBAAcABwAEAgECBAYBAgACAAAAAAACBQcFBQYFBgUGAwQEBAMGBQUFBgcEBgQHBwQGBAQDBAUFAwUFBwUFBwICAgcBAQEFAgUFBgUFBAQEBAcFBwcFBQYFBQUFAgUFBQIGBQYEBAIFBQYDBgUGBQUDBAIBBgcCAgICBQUFBQcFBQUFAgUFBwcFBQUCBQUFBQICAgcBAgQHAEG1tAELggECBQcFBQYFBgUGAwQEBAMGBQUFBgcEBgQHBwQGBAQDBAUFAwUFBwUFBwICAgcBAQEFAgUFBgUFBAQEBAcABgcFBQYFBQUFAgUFBQIGBQYEBAIFBQYDBgUGBQUDBAIBBgcCAgICBQUFBQcFBQUFAgUFBwcFBQUCBQUFBQICAgcBAgQHAEHGtQELDwIFAgAAAAAAAAAFDwUPCgBB4LUBC03//6P+g/5D/iP+I/7//773nver/iP+I/597zznsEZuHi0eA/7n5YrNorw0bP8rkhwj+2SrosovS2VSw0GGIcEgYRCCCCAAAAAgAAAAIABBwrYBC+uDBQIABAAGAAgACgAMAA4AEAASABQAFgAYABoAHAAeACAAIgAkACYAKAAqACwAOgA8AEYAWABqAHwAmgC8AOoAJAFeAZQBzgEEAj4CdgKwAuYCIANWA3wDqgPoAyQEbgTIBCYFkgXeBT4Gmgb4BmIHvAcSCHAIxggUCWYJsAn2CUgKkgrkCjILcAuqC9wLBgw2DHQMsgz6DDANgg3oDVIOwg5KD9wPbBD0EHQR5BFUErwSIhOYE/wTcBTCFBoVTBVmFYAVpBXKFQAWTBaeFvoWUheiFwAYShiWGNAYChk4GXIZrBnqGTAaahqsGvoaPBuQG/AbPByoHAYdYB2qHeYdJB5aHoAeth74HjYfeB+8HwIgRCCKIMggCiFMIYIhrCHSIewhBiIkIi4iMCI2IjgiOiI8Ij4iQCJCIkQiUiJwIpAiwCL6IjwjfiPAIwIkRCSGJMgkSiXCJXomPicOKOwoxCm8KpwrmCx4LVAuIC/yL8gwoDF2MkgzFjTwNNg14jbMN844qDmMOmo7ODz4PEo9sj20PbY9uD26Pbw9xD3KPdg98j0WPmg+xD40P8Q/SEDoQHRBFEKyQkhD2kN8RBJFskUkRmRGska0RrZGuEa6RrxGvkbARsJGxEbGRshGykbwL/Av8C/wL/Av8C/wL/Av8C/wL/Av8C/wL/Av8C/wL/Av8C/wL/Av8C/wL3MvASwBKAYsASgBLHMv8C9yLwEoCh4BKHIvcC8BLAEvASEKFgEhAS8BLHAvcC8BLAEvASEKFgEhAS8BLHAvcC8BLAEvAR4KFgEeAS8BLHAvXC8BLQElEi8BLAEvAR4KFgEeAS8BLBIvASgBK1wvWy8BJQIvAS0RLwEoAS8BGwoWARsBLwEoES8BLAIvAShbL1kvAikBLwEjAR0BLwEtEC8BKAEvARsKFgEbAS8BKBAvASwBLwEeASYBLwIoWS9XLwEtASUCLwEfARoBGAEdAS8BJQ8vASgBLwEbChYBGwEvASgPLwEoAS8BHgEPARABHgIvASgBLFcvVS8BLQElAi8BHwEaBBgBHwEvASkOLwEsAS8BFwoWARcBLwEsDi8BKAEvASEBEAMPARABIQIvAShWL1cvASABGQYYARoBIwElAS0NLwEsAS8BFwoWARcBLwEsDS8BKwEoASYBEAEPARAEDwEeASFXL1MvAS0BKwEjARwJGAEcAS8BIw0vASwBKAwWASgBLA0vASgBLwEeAQ8BEAMPARACDwEQAR4BJgEsVC9TLwErASMBGgsYAR8BLwEpCy8BLAEvASEMFgEhAS8BLAsvASgBLwEhCA8BEAIPARABJgEsUy9TLwElAS8BHAsYARoBIwEpAS0KLwEsAS8BJgwWASYBLwEsCi8BKwEoASYBEAkPARABDwEeAS8BKFMvUy8BLQEvASAMGAEZAS8BIwovASwBLwEhDBYBIQEvASwKLwEoAS8BHgEPARAJDwEQASYBLwErUy9ULwElAS8BHAwYAR0BLwElCS8BLAEvAR4MFgEeAS8BLAkvASgBLwEeAQ8BEAgPARABDwEeAS8BKFQvVC8BLQErASANGAEfASsBKQgvASwBLwEeDBYBHgEvASwILwEoASwBIQEQCw8BEAEmASwBK1QvVS8BIwEvARkMGAEaAS8BJQgvASgBLwEbDBYBGwEvASgILwEoAS8BEAEPARAIDwEQAQ8BHgEvAShVL1UvASkBLQEfDRgBHQEvASUHLwEoAS8BHgwXAR4BLwEoBy8BKAEvAR4BDwEQCw8BIQErAShVL1YvASUBLwEaDRgBHwEvASkeLwEoAS8BIQsPARABDwEbAS8BKFYvVi8BKQEtAR8NGAEaASABKwEtBy8OLAcvASsBLAEhARABDwEQCw8BIQErAShWL1cvASUBLwEZDBgBGgEfAS0BKQYvASsBJQMjBicDIwElASsGLwEoASsBIQEQAg8BEAcPARABDwEeAS8BKFcvVy8BJQEtAR8LGAEcASIBLwEtAy8BKQIjAS0QLwEtAiMBKQMvASsBLwEmAR4BEAIPARAHDwEhAS8BKFcvWC8CKQEaCBgBGQEfAi8BKwEvASsBIwEnBC8BIAEdARwCGQYUAhkBHAEdASAELwEnASMBKwEvASwCLwEhARACDwEQBQ8BEAIoWC9YLwElAS8BHwYYARoBHwIvASMBLQEnASMDLwEfAR0BGQEUAREBAwECAgEGAgIBAQIBAwERARQBGQEdAR8DLwEjAScBKwEoAi8BHgEQAg8BEAMPAR4BLwEoWC9ZLwEpAS8BGgMYARoBHQIvASUBKQEnASUCLwEgARwBFAERAQIBAQECAQMBCgMRBgsDEQEKAQMBAgEBAQIBEQEUARwBIAIvASUBKQEsASgCLwEeARADDwEQAS8BKFkvRS8BKwEjASsRLwElAS8BHwIYARwBIAEvASkBJQErASMCLwEfARkBEQEBAQIBBAIRAQsBCg4EAQoBCwIRAQQBAgEBAREBGQEfAi8BIwErASgBLAEvASYBHgEQAQ8BIQEvASgRLwErASMBK0UvSC8BIwErES8BLQEdAR8CLwElAS0BIwIvAR8BGQELAQEBAwIRAQoWBAEKAhEBAwEBAQsBGQEfAi8BIwEvASgCLwEhAR4SLwErASNIL0IvAisBIAEUARwBIgIvASMBKw8vAS0CLwElAS0BKwEpAS8BIAEZAQsBAgEEAREBChwEAQoBEQEEAQIBCwEZASABLwEpAisBKAIvASsPLwErASMCLwEiARwBFAEgAitCL0IvASMBLwEZAQEBAgEUARkBIAIvASMBKQ4vASUBKQEvASMCLwEcAREBAQEEAREiBAERAQQBAQERARwCLwEjAS8CKA4vASkBIwIvASABGQEUAQIBAQEZAS8BI0IvQS8BKQEnAR8BEQELAREBAwEBAREBGQEgAi8BJQEnDi8BIwEvASABFAEBAQMBESYEAREBAwEBARQBIAEvASMOLwEnASUCLwEgARkBEQEBAQMBEQELAREBHwEnASlBL0EvASMBLwEZAQEBEQEEAQoBEQEDAQEBEQEZAR8CLwEjAScKLwEtAScBLwEdAREBAgERAQooBAEKAREBAgERAR0BLwEnAS0KLwEnASMCLwEfARkBEQEBAQMBEQEKAQQBEQEBARkBLwEjQS9ALwEnASsBHwILBAQBCgERAQMBAQERARkBHwIvAiUHLwErAScBLwEcAgMBESwEARECAwEcAS8BJwErBy8CJQIvAR8BGQERAQEBAwERAQoEBAILAR8BKwEnQC9ALwElAS8BFAECAREGBAEKAREBBAECAQsBGQEfCC8BKwElAS8BGQEBAgsuBAILAQEBGQEvASUBKwgvAR8BGQELAQIBBAERAQoGBAERAQIBFAEvASVALz8vASUBLwEdAQIBCwoEAREBBAEBAREBFAEdASMBKwMvASsBJQEvARkBAQERAQowBAEKAREBAQEZAS8BJQErAy8BKwEjAR0BFAERAQEBBAERCgQBCwECAR0BLwElPy8+LwIrASIBFAEDAQoMBAERAQQBAgEBARwBLwElAS8BKwEnAS8BGQEBARE0BAERAQEBGQEvAScBKwEvASUBLwEcAQEBAgEEAREMBAEKAQMBFAEiAis+Lz4vASUBLwEdAQEBBAERDQQBCgIRAR8BLwEnAS8BIwEvARkBAQERNgQBEQEBARkBLwEjAS8BJwEvAR8CEQEKDQQBEQEEAQEBHQEvASU+Lz8vASkBIgEdAREBAgERAQoLBAERAQEBGQEvASUBLwEjAS8BHAEBARE4BAERAQEBHAEvASMBLwElAS8BGQEBARELBAEKAREBAgERAR0BIgEpPy9CLwEfARQBAgEEAQsJBAEKAQMBEQEgASkBKwElAS8BHQECAQs6BAELAQIBHQEvASUBKwEpASABEQEDAQoJBAELAQQBAgEUAR9CL0EvASMCLwEcAgMBEQgEAREBAQEcAS8BIwIrASABEQEDAQs6BAELAQMBEQEgAisBIwEvARwBAQERCAQBEQIDARwCLwEjQS9CLwInAS8BHwEUAQEBCwEKBQQBCwECARQBIgEnASsBIwEvARQBAgERPAQBEQECARQBLwEjASsBJwEiARQBAgELBQQBCgELAQEBFAEfAS8CJ0IvRC8BIwEvASABGQECAQMBEQQEAQsBAgEdAS8CJQEvARwBAQERPgQBEQEBARwBLwIlAS8BHQECAQsEBAERAQMBAgEZASABLwEjRC9FLwElAi8BHQERAQIBEQEKAQQBEQECARQBLwElASkBKwEgAREBAwEKPgQBCgEDAREBIAErASkBJQEvARQBAgERAQQBCgERAQIBEQEdAi8BJUUvRi8BKwEjAS8BIAEUAQEBBAERAQoBCwEfAS8BJwElAS8BGQEBARFABAERAQEBGQEvASUBJwEvAR8BCwEKAREBBAEBARQBIAEvASMBK0YvSC8BIwIvARwBEQEDAQIBGQEvASUBJwErAR8BEQEKQgQBCgERAR8BKwEnASUBLwEZAQIBAwERARwCLwEjSC9JLwErAScBLwEfARQBEQEgAisBJQEvARkBAQERQgQBEQEBARkBLwElAisBIAERARQBHwEvAScBK0kvSy8BIwEvASIBHQEvASsBKQErAR8BEQEKRAQBCgERAR8BKwEpASsBLwEdASIBLwEjSy9MLwEnAi8BKwEvASMBLwEZAQEBEUQEAREBAQEZAS8BIwEvASsCLwEnTC9NLwErASUBLwErAS8BHwERAQsGBBMKFAQTCgUEAQoBBAERAR8BLwErAS8BJQErTS9QLwEpASsBHwERAQIBEQIEAQoBEQEEEwMBBAERAQsOBAEKAREBBBMDAQQBEQELAgQBEQEDAREBHwErASlQL1EvAScBLwEfAREBAQELAREBAwEBAQsTEQELAQIBAwERDAQBEQEDAQEBCxMRAQsBAgEDAhECAwEcAS8BJVEvUS8BJwEjAS8BIAEUAQIBAQEUARwBHxMgAR8BHAEUAQIBBAEKCQQBEQEBARQBHAEfEyABHwEcARQBAgEBARQBHQEvASMBJVEvUy8BIwIvARwBGQEgAi8CLBMvASMBGQEDAQoBEQgLAQIBFAEgAi8CLBMvASMCGQEgAS8BI1MvTy8BJwEvARwBHQEvASUBJwMvASMBLQIvASQQKwEnASMBKwEvARkBAQEDBgIBAwECARQCLwEjAS0CLwEkECsBJwEjBC8BIwEvASABHQEvAStPL0YvAisBLAMoAy8BJwEjARQBAgEcAi8BJQEjASsBLwEnARsBHAEvASQRLwErASMBLwEfCB0BHwElASsBJwEvAScBGwEcAS8BJBEvASsCIwEtAS8BHQERARQBIwEnAy8DJQEpAi1GLzsvASwBKwQoASYEKAgvASsBLwEgAREBBAEBARkBIgEnAS8BIgEvARsBAAEGARsBLwEiHy8BIgEvARsBAAEGARsBLwEiES8BLQEpASIBHAELAQIBEQEgAS8BKwgvAikBJQMjAiUBKQItOy9GLwImASECHgEhASwBKwElAS8BHQEDAQsBEQEBAR0BLwElASQBLwEcAQcBDAEGARsBLwEiEi8BKQkvAS0BLwEkAS8BHAEHAQwBBgEbAS8BIhAvASsBLwEgAQQBAwERAQMBHQEvASUBLQEpAx8DIEYvOi8BKAImASEFHgYQAg8BEAEvASgBIwEvARwBAgERAQsBAwEdAS8BJQEvAScBLwEbAQYBCAEGARsBLwEiES8BIwgdASABLwErAS8BJwEvARsBBgEIAQYBGwEvASIPLwErAS8BIAERAQMBEQECARwBLwEjASkBLwEaBRgDGgIcAR0DHwIgASM6LzgvASgBLwEhAhAMDwEQAQ8BEAEvASgBIwEvARkBAQERAQsBAgEdAS8BJQIvASQBLwEbAQYBCAEGARsBLwEnDi8BKwEvASABEQECAQMDAgEDAQEBHQEvASUCLwEkAS8BGwEGAQgBBgEbAS8BJw4vASsBLwEgAREBAwERAQEBGQEvASMBKQEvARoQGAEfAS8BJTgvOC8BKAEvAR4FDwQQBw8BEAEvASgBIwEvARkBAQERAQsBAgEdAS8BJQMvASIBLwEbAQYBCAEGARsBKgEnDS8BKwEvASABEQEEAREDCwERAQMBHQEvASUDLwEiAS8BGwEGAQgBBgEbASoBJw0vASsBLwEgAREBAwERAQEBGQEvASMBKQEvARoQGAEfAS8BJTgvOC8BKAEvAR4BDwEQDg8BEAEvASgBJwEvARQBAgILAQIBHQEvASUELwEiAS8BGwIGAQgBIAEvASoMLwErAS8BIAERAQMBCgMEAQsBAgEdAS8BJQQvASIBLwEbAgYBCAEgAS8BKgwvASsBLwEgAREBAwERAQIBFAEvAiUBLwEaEBgBHwEvASU4LzgvASgBLwEeEA8BEAEvASgBJwEvARQBAgILAQIBHQEvASUFLwEiAS8BGwEMARUBIgEnDS8BKwEvASABEQEDAQoDBAELAQIBHQEvASUFLwEiAS8BGwEMARUBIgEnDS8BKwEvASABEQEDAREBAgEUAS8CJQEvARoQGAEfAS8BJTgvOC8BKAEvAR4QDwEQAS8BKAEnAS8BFAECAgsBAgEdAS8BJQYvAScBLwEgEC8BKwEvASABEQEDAQoDBAELAQIBHQEvASUGLwEnAS8BIBAvASsBLwEgAREBAwERAQIBFAEvAiUBLwEaEBgBHwEvASU4LzgvASgBLwEeEA8BEAEvASgBJwEvARQBAgILAQIBHQErASUHLwEnAS8BKg8vASsBLwEgAREBBAEKAwQBCwECAR0BKwElBy8BJwEvASoPLwErAS8BIAERAQQBEQECARQBLwIlAS8BGhAYAR8BLwElOC84LwEoAS8BHhAPARABLwEoAScBLwEUAQIBCwERAQEBGQEvASMILwEqEC8BIwEpAR0BAgERBAQBEQEBARkBLwEjCC8BKhAvASMBKQEdAQIBEQELAQIBFAEvAiUBLwEaEBgBHwEvASU4LzgvASgBLwEeAQ8BEA4PARABLwEoAScBLwEUAQIBCwEKAQMBEQEgASMBKRgvASMBLwEUAQIBCwQEAQoBAwERASABIwEpGC8BIwEvARQBAgILAQIBFAEvAiUBLwEaEBgBHwEvASU4LzgvASgBLwEeBQ8EEAcPARABLwEoASMBLwEZAQEBEQEEAREBAgEZAS8BIwElFC8BLQEnASMBLwEcAQIBCwYEAREBAgEZAS8BIwElFC8BLQEnASMBLwEcAQIBCwEEAREBAQEZAS8BIwEpAS8BGhAYAR8BLwElOC84LwEoAS8BIQIQDA8BEAEPARABLwEoASMBLwEZAQEBEQIEAQoBAwEcAy8TJwMvARwBAgIKBwQBCgEDARwDLxMnAy8BHAECAgoBBAERAQEBGQEvASMBKQEvARoQGAEfAS8BJTgvOi8BKAImASEFHgYQAg8BEAEvASgBIwEvARwBAgERAwQBCgECARQBHQEjEy8BIwEfARkBAwEEAQoJBAEKAQIBFAEdASMTLwEjAR8BGQEDAQQBCgIEAREBAgEcAS8BIwEpAS8BGgUYAxoCHAEdAx8CIAEjOi9GLwImASECHgEhASwBKwElAS8BHQEDAQsEBAERAQIBAxUUAQQBAgEKAQULBAERAQIBAxUUAQQBAgEKAQUDBAELAQMBHQEvASUBLQEpAx8DIEYvOy8BLAErBCgBJgQoCC8BKwEvASABEQEEAQoEBAELAQoBAxMCAQMBBAERDgQBCwEKAQMTAgEDAQQBEQQEAQoBBAERASABLwErCC8CKQElAyMCJQEpAi07L0YvAisBLAMoAy8BKwEjARQBAgELBgQVCxIEFQsGBAELAQIBFAEjASsDLwMlASkCLUYvTy8BIwEvARkBAQERSAQBEQEBARkBLwEjTy9PLwElAS8BHQECARFIBAERAQIBHQEvASVPL08vASsBLwEgAREBBAEKMAQDCwEKEgQBCgEEAREBIAEvAStPL1AvAScBLwEUAQIBCy8EAQoBAwICAQQBBREEAQsBAgEUAS8BJ1AvUC8BIwEvARwBAQERIAQBCgELAQoKBAEKAREBAgEUAR0BHAERAQQBChAEAREBAQEcAS8BI1AvTS8BLgEsAS8BKwEvASABEQEDAQoeBAEKAQQBAgEEAhEFCwIRAQsBAwEBAREBIgIvARwBAgELDwQBCgEDAREBIAEvASsBLwEsAS5NL0wvASwCLwEuAS8BIwEvARkBAQERHQQBCgEDAREBFAERAgEBAwUCAQEBAgERARQBHwEvASIBLwEfAQIBCw8EAREBAQEZAS8BIwEvAS4CLwEsTC9LLwEoAS8BJgEeAS8BLAEpASsBHwERAQocBAEKAQMBEQEfAS8BHwEcARkFFAEZARwBHQEgAi8BIwEvASABFAECAQsPBAEKAREBHwErASkBLAEvAR4BJgEvAShLL0kvAiwBLwEhAhYBIQIsASUBLwEZAQEBERsEAREBAQEcAS8BIgMvASADLwEjASICLwErASUCLwEfARQBAgELDwQBEQEBARkBLwElAiwBIQIWASEBLwIsSS9ILwEoAi8BHgMWARsBLwEsAScBKwEfAREBChsEAQsBAgEUBi8DIwEpBS8BHwEZAQsBAgELEAQBCgERAR8BKwEnASwBLwEbAxYBHgIvAShIL0YvAS4BKAEvASEBFwUWASEBLwEsASUBLwEZAQEBERsEAQoBAgEZAh0BHwEgBS8CIAEdARkBFAELAQEBBAELEAQBEQEBARkBLwElASwBLwEhBRYBFwEhAS8BKAEuRi9FLwEsAi8BHgcWARcBLwEsAisBIAERAQMBChwEAwICEQUUAhEBAwEBAQIBBAEREQQBCgEDAREBIAIrASwBLwEXBxYBHgIvASxFL0QvASgBLwEmARsJFgEeAS8BLAElAS8BHAEBAREcBAMLAQQBAwUCAgMBCgERAQsTBAERAQEBHAEvASUBLAEvAR4JFgEbASYBLwEoRC9CLwIsAS8BIQwWASYCLAEjAS8BFAECAREeBAIKBQsCChUEAREBAgEUAS8BIwIsASYMFgEhAS8CLEIvQS8BKAIvAR4NFgEeAS8BKAEpASsBIAERAQMBCzoEAQsBAwERASABKwEpASgBLwEeDRYBHgIvAShBL0IvASEBFw8WASECLAElAS8BHQECAQs6BAELAQIBHQEvASUCLAEhDxYBFwEhQi8/LwEsASYBHhEWARsBLwEoAS8BIwEvARwBAQEROAQBEQEBARwBLwEjAS8BKAEvARsRFgEeASYBLD8vPi8BLAEvAR4TFgEhAS8BLAEvASMBLwEZAQEBETYEAREBAQEZAS8BIwEvASwBLwEhExYBHgEvASw+Lz4vAS4BLAEmExYBGwEvASwBLwErAScBLwEZAQEBETQEAREBAQEZAS8BJwErAS8BLAEvARsTFgEmASwBLj4vPy8BKAEvAR4QFgEXAR4BKAEuAy8BKwElAS8BGQEBAREBCjAEAQoBEQEBARkBLwElASsDLwEuASgBHgEXEBYBHgEvASg/L0AvASwBLwEXDRYBGwEhCC8BKwElAS8BGQEBAgsuBAILAQEBGQEvASUBKwgvASEBGw0WARcBLwEsQC9ALwEsAS4BIQsWARsBIQIvAiwHLwErAScBLwEcAgMBESwEARECAwEcAS8BJwErBy8CLAIvASEBGwsWASEBLgEsQC9BLwEoAS8BGwgWARsBIQIvASgBLAovAS0BJwEvAR0BEQECAREBCigEAQoBEQECAREBHQEvAScBLQovASwBKAIvASEBGwgWARsBLwEoQS9BLwIsASEGFgEbASECLwIsDi8BIwEvASABFAEBAQMBESYEAREBAwEBARQBIAEvASMOLwIsAi8BIQEbBhYBIQIsQS9CLwEoAS8BGwMWARsBIQIvASgBLA4vASUBKQEvASMCLwEcAREBAQEEAREiBAERAQQBAQERARwCLwEjAS8CKA4vASwBKAIvASEBGwMWARsBLwEoQi9CLwIsASEBFwEeASYCLwEoASwPLwEtAi8BJQEtASsBKQEvASABGQELAQIBBAERAQocBAEKAREBBAECAQsBGQEgAS8BKQIrASgCLwErDy8BLAEoAi8BJgEeARcBIQIsQi9ILwEoASwRLwEtAR0BHwIvASUBLQEjAi8BHwEZAQsBAQEDAhEBChYEAQoCEQEDAQEBCwEZAR8CLwEjAS8BKAIvASEBHhIvASwBKEgvRS8BLAEoAS4RLwElAS8BHwIYARwBIAEvASkBJQErASMCLwEfARkBEQEBAQIBBAIRAQsBCg4EAQoBCwIRAQQBAgEBAREBGQEfAi8BIwErASgBLAEvASYBHgEQAQ8BIQEvASgRLwEuASgBLEUvWS8BKQEvARoDGAEaAR0CLwElASkBJwElAi8BIAEcARQBEQECAQEBAgEDAQoDEQYLAxEBCgEDAQIBAQECAREBFAEcASACLwElASkBLAEoAi8BHgEQAw8BEAEvAShZL1gvASUBLwEfBhgBGgEfAi8BIwEtAScBIwMvAR8BHQEZARQBEQEDAQICAQYCAgEBAgEDAREBFAEZAR0BHwMvASMBJwErASgCLwEeARACDwEQAw8BHgEvAShYL1gvAikBGggYARkBHwIvASsBLwErASMBJwQvASABHQEcAhkGFAIZARwBHQEgBC8BJwEjASsBLwEsAi8BIQEQAg8BEAUPARACKFgvVy8BJQEtAR8LGAEcASIBLwEtAy8BKQIjAS0QLwEtAiMBKQMvASsBLwEmAR4BEAIPARAHDwEhAS8BKFcvVy8BJQEvARkMGAEaAR8BLQEpBi8BKwElAyMGJQMjASUBKwYvASgBKwEhARACDwEQBw8BEAEPAR4BLwEoVy9WLwEpAS0BHw0YARoBIAErAS0HLwErAycGJQMnASsHLwErASwBIQEQAQ8BEAsPASEBKwEoVi9WLwElAS8BGg0YAR8BLwEpHi8BKAEvASELDwEQAQ8BGwEvAShWL1UvASkBLQEfDRgBHQEvASUHLwElAS8BHAwUARwBLwElBy8BKAEvAR4BDwEQCw8BIQErAShVL1UvASMBLwEZDBgBGgEvASUILwEjAS8BHAEBAQMIAgEDAQEBHAEvASMILwEoAS8BEAEPARAIDwEQAQ8BHgEvAShVL1QvAS0BKwEgDRgBHwErASkILwElAS8BHQEDAREICwERAQMBHQEvASUILwEoASwBIQEQCw8BEAEmASwBK1QvVC8BJQEvARwMGAEdAS8BJQkvASUBLwEdAQIBCwgEAQsBAgEdAS8BJQkvASgBLwEeAQ8BEAgPARABDwEeAS8BKFQvUy8BLQEvASAMGAEZAS8BIwovAScBLwEfAREBBAEKBgQBCgEEAREBHwEvAScKLwEoAS8BHgEPARAJDwEQASYBLwErUy9TLwElAS8BHAsYARoBIwEpAS0KLwErAS8BIAERAQMBCgYEAQoBAwERASABLwErCi8BKwEoASYBEAkPARABDwEeAS8BKFMvUy8BKwEjARoLGAEfAS8BKQsvASsBLwEgAREBAwEKBgQBCgEDAREBIAEvASsLLwEoAS8BIQgPARACDwEQASYBLFMvUy8BLQErASMBHAkYARwBLwEjDS8BKwEjARQBAgELBgQBCwECARQBIwErDS8BKAEvAR4BDwEQAw8BEAIPARABHgEmASxUL1cvASABGQYYARoBIwElAS0NLwEnAS8BFAECAQsGBAELAQIBFAEvAScNLwErASgBJgEQAQ8BEAQPAR4BIVcvVS8BLQElAi8BHwEaBBgBHwEvASkOLwEnAS8BFAECAQsGBAELAQIBFAEvAScOLwEoAS8BIQEQAw8BEAEhAi8BKFYvVy8BLQElAi8BHwEaARgBHQEvASUPLwEjAS8BGQEBAREGBAERAQEBGQEvASMPLwEoAS8BHgEPARABHgIvASgBLFcvWS8CKQEvASMBHQEvAS0QLwEjAS8BGQEBAREGBAERAQEBGQEvASMQLwEsAS8BHgEmAS8CKFkvWy8BJQIvAS0RLwEjAS8BGQEBAREGBAERAQEBGQEvASMRLwEsAi8BKFsvXC8BLQElEi8BJQEvAR0BAgELBgQBCwECAR0BLwElEi8BKAErXC9wLwElAS8BHQECAQsGBAELAQIBHQEvASVwL3AvAScBLwEfAQsBEQYLAREBCwEfAS8BJ3AvcC8BKwEvASABEQECAQMEAgEDAQIBEQEgAS8BK3Avci8BIwodASNyL/Avcy8KJXMv8C/wL/Av8C/wL/Av8C8rLwIqPy8CKh8vASpiLyovAScCLwEkPS8BJAIvASQcLwEnASoBLwEnASpgLykvASoBLwEqASA9LwEqAS8CIAEvASoaLwEqAi8BIGIvKC8BJwEvAR4CDQEVAic5LwEnAS8BGwINARsBLwEnGC8BJwEvAR4CDQEVASECKl4vJy8CKgEiAQ0BAAEIAQABGwEvASQ3LwEnAS8BHgQHAR4BLwEnFi8CKgEiAQ0BAAEMAQABFQEvASReLycvASoBLwEgAQ0BCAEMAQYBFQEvASI3LwEkAS8BHAEGAgwBBgEcAS8BJBYvASoBLwEgAQ0BCAEMAQYBDQEvASdeLycvASoBLwEgAQ0BBwEMAQYBHAEvASQ3LwEkAS8BHgEGAQwBBwENASEBLwEqFy8BJwEqAQ0BAAEMAQABFQEvASJeLycvASoBLwEgAQ0BBwEMAQYBHgEvASQ3LwEkAS8BHgEGAQwBBwENASABLwEqFy8BJwEvAQ0BAAEMAQABFQEvASJeLycvASoBLwEgAQ0BBwEMAQYBHgEvASQ3LwEkAS8BHgEGAQwBBwENASABLwEqFy8BJwEvAQ0BAAEMAQABFQEvASJeLycvASoBLwEgAQ0BBwEMAQYBHgEvASQ3LwEkAS8BHgEGAQwBBwENASABLwEqFy8BJwEvAQ0BAAEMAQABFQEvASJeLycvASoBLwEgAQ0BBwEMAQYBHgEvASQ3LwEkAS8BHgEGAQwBBwENASABLwEqFy8BJwEvAQ0BAAEMAQABFQEvASJeLycvASoBLwEgAQ0BBwEMAQYBHgEvASQ3LwEkAS8BHgEGAQwBBwENASABLwEqFy8BJwEvAQ0BAAEMAQABFQEvASJeLycvASoBLwEgAQ0BBwEMAQYBHgEvASQCLwEqASQEIgEkASoQLwEkASIBJBMvASQBIgEnBC8BJAEvAR4BBgEMAQcBDQEgAS8BKgIvAScBJAQiAScBKg0vAScBLwENAQABDAEAARUBLwEiAi8BKgEkBCIBJAEqGS8BJwEkBCIBJwEqMy8nLwEqAS8BIAENAQcBDAEGAR4BLwIkAScILwEnASQNLwEqAy8BKhUvASoDLwEkAS8BHgEGAQwBBwENASABLwEnASQBKggvASQBJwsvAScBLwENAQABDAEAARUBLwEiAiQILwEnASQBKhMvASoBIgEqCC8BIgEnMS8nLwEqAS8BIAENAQcBDAEGAR4BJwEiAi8BIQEeARsCFQEbAR4BIQIvASoBJwovASoBLwEeARUBHgEvASoOLwIqAS8BGwEVAR4BLwEqAi8BJAEvAR4BBgEMAQcBDQEgASQDLwEfARwBGwIVARsBHgEgAi8BJAEqCS8BJwEvAQ0BAAEMAQABFQEnASICLwEgAR4BGwIVARsBHAEfAy8BJxEvASQDLwEeARwDFQEbAR4BIgIvASQBKi8vJy8BKgEvASABDQEHAQwBBgEcAi8BHAEVAQ0BBgQAAQYBDQEVARwCLwEkCC8BJAEvARwBBgEAAQYBHAEvASQNLwEkASoBFQIAAQ0BHgEqAScBLwEkAS8BHgEGAQwBBwENASEBLwEiARsBDQEMAQYEAAEHAQ0BFQEeAi8BJwgvAScBLwENAQABDAEAARUCLwEcARUBDQEGBQABDQEVARsBIgEvASQOLwEqAScBLwEhARsBDQEIBQABBwENARUBHgIvAScuLycvASoBLwEgAQ0BBwEMAQABHgEfAQ0BBgEAAQcGDAEHAQABBgEVAR4BLwEkBy8BJwEvAQ0BAAENAQABDQEvAScMLwEqAS8BIAENAQgBDQEAARUBLwEiAS8BJAEvAR4BBgEMAQcBDQEvARwBDQEAAQYBCAUMAQgBBwEAAQgBFQEgAS8BJAcvAScBLwENAQABDAEAARsBHwENAQYBAAEHBgwBBwIAAQ0BHAEvAScMLwEqAi8BGwENAQABBgEIBQwBCAEHAQABCAEVASABLwEkLS8nLwEqAS8BIAENAQcBCAEHARUBDQEAAwwBCAEGAgABBgEIAwwBAAENARwBLwEkBi8BJAEvARUBBgEMAQYBDQEvAScMLwEqAS8BIAENAQcBDAEGARsBLwEkAS8BJAEvAR4BBgEMAQcBDQEVAQcBBgMMAQgBBgIAAQcBCAIMAQgBAAENAR4BLwEkBi8BJwEvAQ0BAAEMAQcBFQENAQADDAEIAQcCAAEGAQgDDAIGARsBLwEkASoJLwIqASABFQEAAQcDDAEHAQYBAAEGAQcBCAIMAQgBAAENAR4BLwEnLC8nLwEqAS8BIAENAQcCCAEGAQcCDAEHAQABCAQNAQgBAAEHAgwBBwEAARsBLwEkBS8BIgEvARsBAAEMAQABDQEvAScMLwEqAS8BIAENAQcBDAEGAR4BLwEkAS8BJAEvAR4BBgEMAggBAAEIAgwBBgEAAQwEDQEHAQABCAIMAQYBDQEeAS8BJwUvAScBLwENAQABDAEIAgcCDAEHAQABCAQNAQwBAAEGAwwBAAEVAS8BJAgvASoBJwEgAQ0BAAMMAQABBgUNAQcBAAEIAgwBBgENAR4BLwEnKy8nLwEqAS8BIAENAQcCCAEMAQgBDAEAAQ0BFQEeASICLwEiAR4BFQENAQACDAEIAQcBHgEvAScELwEiAS8BFQEAAQwBAAENAS8BJwwvASoBLwEgAQ0BBwEMAQYBHAEvASQBLwEkAS8BHgEGAQwCCAIMAQgBAAENARsBHwMvASABHgEVAQgBBgIMAQYBDQEgAScBKgQvAScBLwENAQABDAEIAQwBCAEMAQABDQEVAR4BIAIvASIBHwEbAQ0BAAEIAgwBAAEbAS8BJAcvASQBLwEVAQACDAEHAQYBDQEcASEDLwEgAR4BFQEIAQYCDAEGAQ0BIAEnASoqLycvASoBLwEgAQ0BBwMIAQwBAAEVASEDLwInAy8BIQEVAQACDAEHAQ0BIAEnASoDLwEiAS8BFQEAAQwBAAENAS8BJwwvASoBLwEgAQ0BBwEMAQYBHgEvASQBLwEkAS8BHgEGAQwECAEGARUBIgIvASoCJwMvAR4BDQEAAgwBAAEVAS8BJAQvAScBLwENAQABDAIIAQwBAAEVASEDLwInAy8BIgEVAQYBCAEMAQgBBwEeAS8BJwUvASQBLwEbAQACDAEHAQ0BHAMvASoCJwMvAR4BDQEAAgwBAAEVAS8BJCovJy8BKgEvASABDQEHAggBDAEAARUCLwEiAScBKgIvASoBJwEiAi8BFQEAAgwBAAEVAS8BJAMvASIBLwEVAQABDAEAAQ0BLwEnDC8BKgEvASABDQEHAQwBBgEeAS8BJAEvASQBLwEeAQYBDAMIAQYBGwEvASoBIgEqAy8BKgEnASIBLwEgAQ0BBgIMAQYBHgEvASQDLwEnAS8BDQEAAQwBCAEMAQABFQIvASIBJwEqAi8CKgEiASoBLwEbAQYBCAEMAQYBDQEvAScELwIqASEBDQEHAQwBBwENAR4BLwIkASoDLwEqAScBIgEvASABDQEGAgwBBgEeAS8BJCkvJy8BKgEvASABDQEHAQgBDAEGAQ0BKgEkAScILwEnASQBKgENAQYBDAEHAQ0BIQEvASoCLwEiAS8BFQEAAQwBAAENAS8BJwwvASoBLwEgAQ0BBwEMAQYBHgEvASQBLwEkAS8BHgEGAQwBCAEMAQABFQEvASIBKggvASIBLwEfAQwBBwEMAQYBDQInAy8BJwEvAQ0BAAIMAQYBDQEqASQBJwgvASoBIgEvARUBAAIMAQcBHgEvASQDLwEiAS8BFQEAAgwBBgEcAS8BIgkvASIBLwEfAQwBBwEMAQYBDQInKS8nLwEqAS8BIAENAQcBCAEMAQcBHgEvASQKLwEkAS8BHgEHAQgBDAEAARsBLwEiAi8BIgEvARUBAAEMAQABDQEvAScMLwEqAS8BIAENAQcBDAEGAR4BLwEkAS8BJAEvAR4BBgEMAQgBBwENASABJAEqCi8BIgEvARUBAAEMAggBHgEvAScCLwEnAS8BDQEAAgwBBwEeAS8BJAovASoBJAEgAQ0BBwEMAQABFQEvASQDLwEqASIBDQEHAQwBBgEVAS8BIgsvASIBLwEVAQABDAIIAR4BLwEnKC8nLwEqAS8BIAENAQcBDAEGAQ0BLwEnDC8BJwEvAQ0BBgEMAQABFQEvASQCLwEiAS8BFQEAAQwBAAENAS8BJwwvASoBLwEgAQ0BBwEMAQYBHAEvASQBLwEkAS8BHgEGAgwBAAEVAS8BIgsvAioBIQENAQcBDAEAARsBLwEiAi8BJwEvARUBAAEMAQYBDQEvAScMLwEiAS8BFQEAAQwBBwENASIBKgIvAScBLwEeAggBDAEGARwBKgEkCy8BJwEqASEBDQEHAQwBAAEbAS8BIigvJy8BKgEvASABDQEHAQwBAAEVAS8BIgwvASIBLwEVAQABDAEGAQ0BIgEqAi8BIgEvARUBAAEMAQABDQEvAScMLwEqAS8BIAENAQcBDAEGAR4BLwEkAS8BJAEvAR4BBgIMAQYBHgEqASQMLwEnAS8BFQEAAQwBAAEVAS8BIgIvASoBIgENAQYBDAEAARUBLwEiDC8BJAEqAR4BBgEMAQgBDAEfAS8BJwEvASQBLwEcAQABDAEHAQ0BIAEvASoMLwEnAS8BFQEAAQwBAAEVAS8BIigvJy8BKgEvASABDQEHAQwBBgEcAS8BJAwvASQBLwEcAQYBDAEHAQ0BIAEvASoBLwEiAS8BFQEAAQwBAAENAS8BJwwvASoBLwEgAQ0BBwEMAQYBHAEvASQBLwEkAS8BHgEGAQwBBwENASEBLwEqDC8BIgEvARUBAAEMAQABDQEvAScBLwEqAS8BIAENAQcBDAEAARUBLwEiDC8BKgEvASEBDQEHAQwBBgEcAS8BJAEvASIBLwEVAQABDAEGAQ0BKgEnDS8BJwEiAQ0BBgEMAQABDQEvAScoLycvASoBLwEgAQ0BBwEMAQYBHgEvASQMLwEkAS8BHgEGAQwBBwENASABLwEqAS8BJwEvAQ0BAAEMAQABDQEqAScMLwEqAS8BIAENAQcBDAEAARUBLwEiAS8BJAEvAR4BBgEMAQcBDQEgAS8BKgwvASIBLwEVAQABDAEAAQ0BLwEnAS8BKgEvASABDQEHAQwBAAEVAS8BIgwvASoBLwEgAQ0BBwEMAQYBHgEvASQBLwEiAS8BFQEAAQwBAAENAS8BJwwvASoBLwEhAQ0BBwEMAQABDQEvAScoLycvASoBLwEgAQ0BBwEMAQYBHAEvASQMLwEkAS8BHAEGAQwBBwENASABLwEqAS8BJAEvARUBAAEMAQABFQEvAScMLwEqAS8BIAENAQcBDAEGARwBLwEkAS8BJAEvAR4BBgEMAQcBDQEhAS8BKgwvASIBLwEVAQABDAEAAQ0BLwEnAS8BKgEvASABDQEHAQwBAAEVAS8BIgwvASoBLwEhAQ0BBwEMAQYBHAEvASQBLwEiAS8BFQEAAQwBBgENASoBJw0vAScBIgENAQYBDAEAAQ0BLwEnKC8nLwEqAS8BIAENAQcBDAEAARUBLwEiDC8BIgEvARUBAAEMAQYBDQEiASoCLwEiAS8BGwEGAQwBBwENASECKgsvASQBKgEeAQcBCAEMAQYBHgEvASQBLwEkAS8BHgEGAgwBBgEeASoBJAwvAScBLwEVAQABDAEAARUBLwEiAi8BKgEiAQ0BBgEMAQABFQEvASIMLwEkASoBHgEGAQwBCAEMAR8BLwEnAS8BJAEvARwBAAEMAQcBDQEgAS8BKgwvAScBLwENAQABDAEAARUBLwEkKC8nLwEqAS8BIAENAQcBDAEGAQ0BLwEnDC8BJwEvAQ0BBgEMAQABFQEvASQCLwEkAS8BHAEGAgwBAAEbAScBIgsvASIBLwEVAQACDAEGARwBLwEkAS8BJAEvAR4BBgIMAQABFQEvASILLwIqASEBDQEHAQwBAAEbAS8BIgIvAScBLwEVAQABDAEGAQ0BLwEnDC8BIgEvARUBAAEMAQcBDQEiASoCLwEnAS8BHgIIAQwBBgEcASoBJAsvAScBKgEhAQ0BBwEMAQABFQEvASIoLycvASoBLwEgAQ0BBwEIAQwBBwEeAS8BJAovASQBLwEeAQcBCAEMAQABGwEvASICLwEqAS8BIQENAQcBDAEGARUBLwEiCi8BJwEqASEBDQIIAQwBBgEeAS8BJAEvASQBLwEeAQYBDAEIAQcBDQEgASQBKgovASIBLwEVAQABDAIIAR4BLwEnAi8BJwEvAQ0BAAIMAQcBHgEvASQKLwEqASQBIAENAQcBDAEAARUBLwEkAy8BKgEiAQ0BBwEMAQYBFQEvASILLwEiAS8BFQEAAgwBAAEVAS8BIigvJy8BKgEvASABDQEHAQgBDAEGAQ0BKgEkAScILwEnASQBKgENAQYBDAEHAQ0BIQEvASoDLwEnAS8BFQEGAQwBCAEHARwBLwEiCC8CJwEvARUBBwEMAQgBDAEGAR4BLwEkAS8BJAEvAR4BBgEMAQgBDAEAARUBLwEiASoILwEiAS8BHwEMAQcBDAEGAQ0CJwMvAScBLwENAQACDAEGAQ0BKgEkAScILwEqASIBLwEVAQACDAEHAR4BLwEkAy8BIgEvARUBAAIMAQYBHAEvASIJLwEiAS8BHwEMAQcBCAEMAQABFQEvASIoLycvASoBLwEgAQ0BBwIIAQwBAAEVAi8BIgEnASoCLwEqAScBIgIvARUBAAIMAQABFQEvASQELwEnAS8BHgEMAggCDQEeAS8BJwEkAioBLwEqAScBJAEvASoBFQEAAwgBDAEGAR4BLwEkAS8BJAEvAR4BBgEMAwgBBgEbAS8BKgEiASoDLwEqAScBIgEvASABDQEGAgwBBgEeAS8BJAMvAScBLwENAQABDAEIAQwBAAEVAi8BIgEnASoCLwIqASIBKgEvARsBBgEIAQwBBgENAS8BJwQvAioBIQENAQcBDAEHAQ0BHgEvAiQBKgMvASoBJwEiAS8BIAENAQYBDAEIAQwBAAEVAS8BIigvJy8BKgEvASABDQEHAwgBDAEAARUBIQMvAicDLwEhARUBAAIMAQcBDQEgAScBKgUvASQBLwEVAQYBDAENAQcBDQEcAScDLwEqAy8BIQEVAQYBDAMIAQwBBgEeAS8BJAEvASQBLwEeAQYBDAQIAQYBFQEiAi8BKgInAy8BHgENAQACDAEAARUBLwEkBC8BJwEvAQ0BAAEMAggBDAEAARUBIQMvAicDLwEiARUBBgEIAQwBCAEHAR4BLwEnBS8BJAEvARsBAAIMAQcBDQEcAy8BKgInAy8BHgENAQABDAIIAQwBAAEVAS8BIigvJy8BKgEvASABDQEHAggBDAEIAQwBAAENARUBHgEiAi8BIgEeARUBDQEAAgwBCAEHAR4BLwEnBi8BKgEkASoBDQEAAQwBCAENAQgBDQEcAR8BIAEvASABHgEbAQ0BCAENBAgBDAEGARwBLwEkAS8BJAEvAR4BBgEMAggCDAEIAQABDQEbAR8DLwEgAR4BFQEIAQYCDAEGAQ0BIAEnASoELwEnAS8BDQEAAQwDCAEMAQABDQEVAR4BIAIvASIBHwEbAQ0BAAEIAgwBAAEbAS8BJAcvASQBLwEVAQACDAEHAQYBDQEcASEDLwEgAR4BFQEIAQYBDAMIAQwBAAEVAS8BIigvJy8BKgEvASABDQEHAggCBwIMAQcBAAEIBA0BCAEAAQcCDAEHAQABGwEvASQILwEqASQBIAEVAQABDAIIAQAGDQEMAggBDAEIAQcCCAEMAQYBHgEvASQBLwEkAS8BHgEGAQwCCAEGAQgCDAEGAQABDAQNAQcBAAEIAgwBBgENAR4BLwEnBS8BJwEvARUBAAEMAQgCBwIMAQcBAAEIBA0BDAEAAQYDDAEAARUBLwEkCC8BKgEnASABDQEAAwwBAAEGBQ0BBwEAAQgCDAEHAggBDAEAARsBLwEiKC8nLwEqAS8BIAENAQcBDAEHARUBDQEAAwwBCAEGAgABBgEIAwwBAAENARwBLwEkCi8BKgEvASABFQEAAQgEDAEHAQYBBwQMAQYBCAEbAQ0BBwEMAQYBGwEvASQBLwEkAS8BHAEGAQwBCAEMARUBCAEGAwwBCAEGAgABBwEIAgwBCAEAAQ0BHgEvASQFLwIqASIBDQEHAQwBBwINAQADDAEIAQcCAAEGAQgDDAIGARsBLwEkASoJLwIqASABFQEAAQcDDAEHAQYBAAEGAQcBCAIMAQgBAAINAQcBDAEGARUBLwEkKC8nLwEqAS8BIAENAQgBDQEAARsBIQENAQYBAAEHBgwBBwEAAQYBFQEeAS8BJAwvAScCLwEcAQ0BAAEGAQcBCAMMAQgBBwEAAQYBDQEeAScBDQEHAQ0BAAEVAS8BIgEvASQBLwEeAQACDAEAAh4BDQEAAQYBCAUMAQgBBwEAAQgBFQEgAS8BJAYvASoBLwEgAQwBCAENAQABFQEfARUBBgEAAQcGDAEHAgABDQEcAS8BJwwvASoCLwEbAQ0BAAEGAQgFDAEIAQcBAAEIARUBIQENAQcBDQEAAQ0BLwEnKC8oLwEkASoBFQIAAQ0BHgIvARwBFQENAQYEAAEGAQ0BFQEcAi8BJA4vASoBJwEvAR8BGwINAQcBBgEHAQYBBwENARUBHAIvASIBFQIAAQ0BHgEqAScBLwEqAScBIAENAgABDQEgAS8BIgEbAQ0BDAEGBAABBwENARUBHgIvAScILwEkASoBFQIAAQYBHAIvARwBFQENAQYFAAENARUBGwEiAS8BJA4vASoBJwEvASEBGwENAQgFAAEHAQ0BFQEeAi8BFQIAAQYBHAEvASQoLygvAioBLwEbARUBHgEvASQBKgIvASEBHgEbAhUBGwEeASECLwEqAScRLwEkAy8BIQEeARwBHgEcAR4BIAMvASQBKgEvARsBFQEeAS8BKgMvASoBLwEgAhsBIAEvASIDLwEfARwBGwIVARsBHgEgAi8BJAEqCS8BKgIvARwBFQEeAS8BJwEqAi8BIAEeARsCFQEbARwBHwMvAScRLwEkAy8BHgEcAxUBGwEeASICLwEkAScBLwEcARUBHgEvASopLy4vASoCLwEkAScILwEnASQULwEnASIBJwcvAiQHLwEqDC8BKgEkASoILwEkAScRLwEqAi8CJAgvAScBJAEqEy8BKgEiASoILwEiAScGLwEqKi8rLwEkASIBJwUvASoBJAQiASQBKhkvASoCJAEnASQBJwEqBi8BJAEiAScHLwEqAiIBKgUvAScBJAQiAScBKhAvASQBIgEnBS8BKgEkBCIBJAEqGS8BJwEkBCIBJwEqBS8BJAEiAScrL/Av8C/wL/Av8C+eLwEnASNQL6svAiNDL5wvASkBLwEfARwBI08vmy8CKwEgAREBAQEcAS8BIwYvAisCHAIrQS+bLwErAS8BIAERAQIBHQEvASUFLwEjAS8BHAIBARwBLwEjQC95LwIrAy8CKwEtBy8BKwIlASkCLwEnAS0FLwEtAisBLQIvASsBLwEgAREBAgEdAS8BIwIrAy8BIwEvARwCAQEcAS8BIwErAS8EKwkvAS0DKy0vdy8BKwElAi8BKwEjASUDLwElBC8BKwElBC8CJQUvASkBIwQvASMCKwEvASABEQECAR0BJQMvASsBJQIvASsBJwIdAicCLwEjBC8BIwErBS8BKwEjBC8BIwErKy95LwIgAy8BIgEgAS0BLwEnAi8BKwIvASACHQEgAi8BHwElAi8BKQIvASUCIAElAi8BKwEvASABEQECAR8BLwMgAi8BKwEvASsBLwIgAi8BHwEgAS8BIwIgASICLwEnAy8BKwIvASUCIAEiAi8BKyovdS8CKwEgARkCEQEUARwBGQIRARQBHQEvASkBKwEvASABGQERAgIBEQEZARwBAQEZAS8BIwEvAR8BGQEUAhEBFAEZASABLQEvASABEQEDARwBFAMRARQBHQEvASMBKwEfAhEBIAEdAQEBFAEZARQDEQEZASABLwEnAS8BKwEvASABGQEUAxEBGQEgAS8BKSkvdS8BJwErARQBAQICAQECAgEBAQIBAQEDAR0BLwElASABFAIBAhEBAgEBAQMBAgEUAi8BHwERAgECAgIBARQBIgEvASABEQIEAgECAgIBARkCLwEdAQIBCwEgARkBAQEDAQIBAQICAgEBEQEfAS8BIwEpASABFAIBAgICAQEUASACKygvdC8BJQEvAR0BAwERARwBHQEUAQMBEQEcAR0BFAEBARQBKwEvARkBAQERARwBHwEgAR0BFAEEAQIBFAEvASABFAEBAREBHAIdARkBAQEUASIBLwEgAREBBAEDARQDHQEUAQIBCwEcAS0BHQECAREBLwEcAQECEQEZAh0BHAERAQEBFAEgAScBKwEUAQEBAwEZAh0BGQEDAQEBFAEjASkoL3QvASMBLwEZAQEBEQEiAS8BHAEBAREBIgEvARwBAQERASMBHwERAQIBHQQvAR8BEQECARQBLwEcAQEBEQEdBC8BHQEgAi8BIAERAQMBEQEfBC8BFAEBAREBLwEdAQIBEQErARwBAgEDARkELwEdAREBAQEcAS8BHQIDARwELwEdAREBAgEdAS8BJScvdC8BIwEvARkBAQEUASMBJQEdAQIBEQEgASUBHQECAREBLwEcAQEBFAErASMBJwErASMBLwEZAQEBFAEvARQBAQEZAS8BIwIlASkCLwErAS8BIAERAQEBGQEvASMBJQEjAS8BHwERAQICHwEBAREBLwEcAQEBEQEgASsBIwElASMBLwEZAQEBFAEvARkBAQERBRkBHAERAQEBHAEvASMnL3QvASMBLwEZAQEBFAIvAR0BAgERASABLwEdAQIBEQEvARkBAQEUASsBJwIvASMBJQEcAQEBFAEvARQBAQEcASUBIwIvAS0BIwEnASsBLwEgAREBAQEcASsBIwEvASsBLwEgAREBAQEcAR8BAQERAS8BHAEBAREBIAEtASsBLwEjASkBHAEBAREBIwEUAQIBCgYBAQIBAQEUAS8BJScvdC8BIwEvARkBAQEUAi8BHQECAREBIAEvAR0BAgERAS8BHAEBARQBKwEjAScBKwEjAS8BGQEBARQBLwEUAQEBGQEvASMCJQEpAi8BKwEvASABEQECAR0BLwElAS8BKwEvASABEQEBAh8BAQERAS8BHAEBARQBKQEnAi8BIwEvARkBAQEUAS8BGQEBAREIFAEdAS8BKScvdC8BIwEvARkBAQEUAi8BHQECAREBIAEvAR0BAgERASIBHwERAQIBHQQvAR8BEQECARQBLwEcAQEBEQEdBC8BHQEgAi8BIAERAQIBHQEvASUBLwErAS8BIAERAQECHwEBAREBKwEcAQEBFAEvAScCLwEjAS8BGQEBARQBLwEdAQEBCwEdBC8BHQEZASIBLwErKC90LwEjAS8BHAEBARQCLwEdAQIBEQEgAS8BHQECAREBIAEvARkBAQERARwBHwEgAR0BFAEEAQIBFAEvASABFAEBAREBHAIdARkBAQEUASIBLwEgAREBAgEdAS8BJQEvASsBLwEgAREBAQIfAQEBEQEvARwBAQEUAS8BJwIvASMBLwEcAQEBFAEvASIBFAECAQMBGQIdARkBBAEBARkBKQEjKC90LwEjAS8BGQEBARQBIgEvARwBAQERASABLwEcAQEBEQEgAS8BIAEUAgECEQECAQEBAwECARQCLwEfARECAQICAgEBFAEiAS8BIAERAQEBHAEvASMBLwErAS8BIAERAQEBHQEfAQEBCwEgARwBAQEUASICKwEvASMBLwEZAQEBFAEiAS8BIAEUAgECAgIBARQBHwIrKC90LwElAS8BHQEBARQBIgEtAR0BAQEUASIBLQEdAQEBFAEiASkBLwEgARkBEQICAREBGQEcAQEBGQEvASMBLwEfARkBFAIRARQBGQEgAS8BKQEiARQBAQEdAS8BJQEvASsBKQEiARQBAQEdASACEQEgAR0BAQEUASICKwEvASUBLwEdAQEBFAEiAScBLwEgARkBFAIRARQBGQEgAS8BKykvdy8BHwEgAS8BKwEvAR8BIAEvASsBLwEfASABLwIrAi8BIAIdASACLwEfASUCLwEpAi8BJQIgASUDLwErAS8BIAEfBS8BKwEvASABHwIvAh8CLwEfASABLwErBS8BHwEgAS8CKwIvAScCIAElAi8BKyovdi8BKwQvASsELwErBS8BKwElBC8CJQUvASkBIwQvASMBKwUvASsILwIrAi8CKwgvASsFLwErASMELwEjASsrL3cvASUBKwMvASUBKwMvASUBKwUvASsCJQEpAi8BJwEtBS8BLQIrAS0FLwErASUHLwErASUCLwInAi8BJQErBy8BJQErBS8BLQIrAS0tL/Av8C/wL/Av8C/wL/Av8C/wL/Av8C/wL/AvAAAAAEJOUzEFAQMCCXxaAlNBVyBNT1RJT04AAE5BSFVTSAAAAAAAAEAAAABYQEAAAC0AAEBAAAAUAAE9QABAABQAX38+AF9/PgE9A08BbgV4CHgMeAAAAAAAAAABAP9A78DmQN/A2kDVwNJAz8DMQcrBx0HFwcRBwsHAQb/BvUG8wbtBusG4QbfBtkG1wbRCtMKzQrLCsUKwwq9Cr8KuQq3CrUKswqtCq8KqQqrDqUOow6hDp8OnQ6bDpkOlw6VDpMOkQ6TDo0Ojw6JDosOhRKHEoUSgxKBEn8SfRJ/EnkSexJ5EncSdRJ3EnEScxZxFm8WbRZvFmkWaxZpFmsWZRZnFmUWYxZhFmMWYRZfFl0aXxpdGlsaWRpbGlkaVxpVGlcaVRpTGlEaUxpRGlMeTR5PHk0eTx5JHkseSR5LHkkeRx5FHkceRR5HHkEeQyJBIkMiQSI/Ij0iPyI9Ij8iPSI7IjkiOyI5IjsiOSI3IjUmNyY1JjcmNSYzJjEmMyYxJjMmMSYvJi0mLyYtJi8mLSovKikqKyopKisqKSorKikqJyolKicqJSonKiUqJy4hLiMuIS4jLiEuIy4hLiMuHS4fLh0uHy4dLh8uHS4fMhkyGzIZMhsyGTIbMhkyGzIVMhcyFTIXMhUyFzIVMhcyFTYTNhE2EzYRNhM2ETYTNhE2EzYNNg82DTYPNg02DzYNOg86DToPOgk6CzoJOgs6CToLOgk6CzoJOgs6BToHPgU+Bz4FPgc+BT4HPgU+Bz4BPgM+AT4DPgE+Az4BPgM+AUIDQgFCA0H9Qf9B/UH/QAAAAAAAAQk5TMQUCAgKxdFwSV0lERSBTWU5USAAATVhNRlJQUgAAAAAAQAAAAGQhQAADFwBkQEBFAx4AAzs+AEA1FABffz43ZAA+ATwCAAFuBXgIeAx4AAAAAAAAAAEA/0DvwOZA38DaQNXA0kDPwMxBysHHQcXBxEHCwcBBv8G9QbzBu0G6wbhBt8G2QbXBtEK0wrNCssKxQrDCr0Kvwq5CrcKtQqzCq0KrwqpCqsOpQ6jDqEOnw6dDpsOmQ6XDpUOkw6RDpMOjQ6PDokOiw6FEocShRKDEoESfxJ9En8SeRJ7EnkSdxJ1EncScRJzFnEWbxZtFm8WaRZrFmkWaxZlFmcWZRZjFmEWYxZhFl8WXRpfGl0aWxpZGlsaWRpXGlUaVxpVGlMaURpTGlEaUx5NHk8eTR5PHkkeSx5JHkseSR5HHkUeRx5FHkceQR5DIkEiQyJBIj8iPSI/Ij0iPyI9IjsiOSI7IjkiOyI5IjciNSY3JjUmNyY1JjMmMSYzJjEmMyYxJi8mLSYvJi0mLyYtKi8qKSorKikqKyopKisqKSonKiUqJyolKicqJSonLiEuIy4hLiMuIS4jLiEuIy4dLh8uHS4fLh0uHy4dLh8yGTIbMhkyGzIZMhsyGTIbMhUyFzIVMhcyFTIXMhUyFzIVNhM2ETYTNhE2EzYRNhM2ETYTNg02DzYNNg82DTYPNg06DzoNOg86CToLOgk6CzoJOgs6CToLOgk6CzoFOgc+BT4HPgU+Bz4FPgc+BT4HPgE+Az4BPgM+AT4DPgE+Az4BQgNCAUIDQf1B/0H9Qf9AIAPnAAP0AlwCDAA4ABQCgAJwArQC+ABgAgwCoAN8AcwCPAA8ADQDPAKsAuQCRAI0AAAA+AA4AewAvABcAhQC/AD0ASQAvANMAsgCPAO0AHwDCAKIA9AA/AJEA1wCtAGAA/gCZANIAVQAkAEwAWgC1APYAOgCqAMQAYQBOAJMA+wBmAMMAOwCrACYARQDHANUA3gB6AIoALAB9AH0A2gDdAG0AVgDlAM0AtgA+ACYAlAC2ANMAfQBWAPgAEQD2AMcACQC+ANoASQAEADgAhAC/ADQAHQBbAF8AGgC3AFMAMQBCAFIAzABgAFMA4gArAGYAAADLAFwANQDaAM0A3gA6APwAvgC2AD0AmwC8AKEAswDEADoAyADqAN8AuACeAJIAiAA+AN0ArAADAD0ApgDKAK0AswCWAA8AUwCsAMoAoQDeADQABwClAPQAvgA8AF4AEwA+AA0ApwAaAAMAqQBVADkAzwBgADUAbgCbAK4AywAPAE8AfAAJACoAcgCmABQArQCMAIAASgCxAEcAwAARAAoAegB/AKcAewBQAJUAEAASABsAzABiACAAjQCHABkAigClAGUAyQCHADsAYgCkAIAAMQACABUAdwCtAJ4AKAA9AKkAJABiAKEAMACOAMQAbQA7ALUAwwBPADoAGwCnAO0AMQA/AKQA2gDaAIAAyABh/cANgdbAABO2wACAbUEAWGLCAIFYQgA3UcMAgUpDADxExACCP0QAOzrEAIM2RQBDMsUAgy9GAEMrxgCDKEYAOyXHAIMjRwBBIMgAhB5IAEMbyACEGUkATBfJAIUVSgA+E8oAhRFLAEAQywCGDksASAzMAIYLTABLCc0AhwhNAEkGzQCHBU4APwDOAIgATwBLAM8AiABQAEgA0ACJAFAASwDRAIgAUQBLANIAigBSAEUA0gCJAFMASgDTAIoAVABKANQAigBVAEcA1QCLAFUAUADWAIoAVgBBANcAiwBXAEYA1wCNAFgAQgDYAIwAWQBTANkAiwBaAEsA2gCOAFoAQADbAI8AWwBaANwAkwBcAFoA3ACNAF0AVADdAI8AXgBPAN4AjgBfAFIA3wCSAF8ARQDgAI8AYABUAOEAkQBhAFwA4gCQAGIAUwDiAJoAYwBWAOMAlQBkAF4A5ACMAGQAWADlAJEAZQBKAOYAkgBmAEoA5wCQAGcAXQDnAJ0AaAAqAOgAmABpAFYA6QCXAGkASwDqAJMAagBDAOsAjwBrAEoA7ACVAGwAUwDsAJgAbQBRAO0AkQBuAGoA7gCXAG8ARgDvAJUAbwBPAPAAjABwAFYA8QCVAHEAbQDxAJ4AcgBJAPIAoABzAFMA8wCMAHQAXQD0AJUAdAByAPUArwB1AHzzwMJAeEiyQLjBqECXwKJBpsGdQZLAmEGcwZVBjsCSQZTBj0GJwY1Bj8KKQYbBiEGKwoZCg8GFQobCg0KAwYJCg8KAQn3Cf0KAw35Ce8J8Qn7De0N5wnpDe8N5Q3fCeEN5w3dDdcN2Q3fEdkN0w3VDdsR0RHLDc0R0xHJEccNyRHLEcURvxHBEccVwRG7Eb0VwxW5FbcRuRW7FbUVsxGxFbcVsRWvFa0VsxmtFasVqRmvGakZpxWlGasZpRmjFaEZpxmhGZ8ZnRmjHZ0ZmxmZHZ8dmR2XGZkdmx2VHZMZlR2XHZEdkx2RHZMhkR2PHY0hkyGNIYsdiSGPIYkhhx2JIYshhSGHIYUhhyWFIYMhgSWHJYElfyGBJYMlfSV/IX0lfyV9JXsleSV/KXkleyV5KXspdSl3JXUpdyl1KXMldSl3KXEpcylxKXMtcSlvKXEtcy1tLW8pbS1vLW0tay1pLW8taS1rLWktazFpLWctZTFrMWUxZy1lMWcxZTFjMWExZzFhMWMxYTFjNWExXzFhNWM1XTVfMV01XzVdNV81XTVfNVk1WzVZNVs5WTVbNVk5WzlZOVc1VTlbOVU5VzlVOVc5VTlXOVU5Vz1ROVM5UT1TPVE9UzlRPVM9UT1PPVE9Uz1NPU89TT1PQU09Tz1NQU9BTUFLPUlBT0FJQUtBSUPfA0kDewMJA0sC4QMrAskHEwa1BwMGoQbzBpUG4waJBtsGfQbPBnUGxwZpBr8GYQq3Cl0KrwpVCqcKTQqjCkkKmwpBCpcKPQqTCjkKiwo1CocOLQ6DDikOfw4lDnsOIQ53Dh0Ocw4ZDm8OGQ5rDhUOaxIREmcSDRJjEgkSXxIJEl8SBRJbEgESVxIBElcR/RJTFfkWTxX5Fk8V9RZLFfUWRxXxFkcV7RZDFe0WQxXpGj8Z6Ro/GeUaOxnlGjsZ4Ro3GeEaNxndGjMZ3RozGd0eMx3ZHi8d2R4vHdUeKx3VHisd0R4nHdEeJx3RHicdzR4jIc0iIyHJIiMhySIfIckiHyHFIhshxSIbIcUiGyHBIhclwSYXJcEmFyW9JhMlvSYTJb0mEyW5JhMluSYPJbkmDym5Kg8ptSoLKbUqCym1KgspsSoHKbEqBymxKgcpsS4HLa0uAy2tLgMtrS4DLa0uAy2pLf8tqS3/Lakt/y2pMf8xpTH7MaUx+zGlMfsxpTH7MaEx9zGhMfcxoTH3MaEx9zWdNfc1nTXzNZ018zWdNfM1nTXzNZk17zWZNe81mTXvOZk57zmVOe85lTnrOZU56zmVOes5lTnrOZU56zmROec9kT3nPZE95z2RPec9kT3nPY095z2NPeM9jT3jPY1B40GNQeNBiUHjQYlB30GJQ/8AAqebAAEfawAC70sAAQMzBAEvHwQDAxMEAwMDBAK29wQDAu8EA+rjBAEC2wQATtMIAs7PCAECxwgBAr8IAQK7CACitwgC9q8IAU6rCAMOpwwBoqMMAQKfDAECmwwAApcMAwKTDAMCjwwDKosMAQKHEAAChxABAoMQAQJ/EAACexABAnsQAAJ3EAECcxABAnMUAxZvFAACaxQAAmsUAAJnFAMCZxQAAmMUAIJjFAACXxgBAl8YAAJbGAACWxgAAlcYAAJXGAACUxgAAlMYAAJPHAECTxwAAkscAwJLHAACSxwAAkccAAJHHAACQxwAAkMgAQJDIAACPyADAj8gAAI/IANOOyAAAjsgAAI7IAACNyQAAjckAAI3JANOMyQAAjMkAAIzJAACLyQAAi8kAAIvKAACKygAAisoAAIrKAACKygAgicoAAInKAACJygAAiMsAAIjLAACIywAAiMsAAIfLAACHywAAh8sAAIfLAACGzAAAhswAAIbMAACGzAAAhcwAAIXMAACFzAAAhcwAAIXNAACEzQAAhM0AAITNAACEzQAAg80AAIPNAACDzQAAg84AAIPOAACCzgAAgs4AAILOAACCzgAAgs4AAIHOAACBzwAAgc8AAIHPAACBzwAAgM8AAIDPAACAzwAAgM8AAIDQAACA0AAAf9AAAH/QAAD41efA3qsAQtPVzsDLqwC2xdbCwcCsAMC81rrBuawAwLbWtcG0rABhsdawwa+sAMCt16zCq60AQKrXqcKorQBtp9emwqWtAECk16PCo60A8qLYocOhrgAAoNifw5+uAECe2J3Dna4ALZzYm8ObrgBTmtmZxJmvAECZ2ZjEmK8AAJfZlsSWrwBAltmVxJWvAECV2pTFlLAAQJPak8WTsABAktqRxZKwAACR2pDFkLAAYJDbj8aPsQD1j9uOxo6xAACO243GjbEAAI3bjMaNsQDAjNyMx4yyAACL3IvHi7IAAIrciseKsgBAityJx4myAACJ3YjIibMAQIjdiMiIswAAh92HyIezAACH3YbIhrMAAIbehsmGtAAAhd6FyYW0AACF3oTJhLQAwITehMmEtAAAhN+DyoO1AMCD34LKg7UAAILfgsqCtQAAgt+ByoK1AACB4IHLgbYAAIHggMuAtgAAgOCAy4C2AACA4H/Lf7YAAH/hf8x/twAAf+F+zH+3AAB+4X7MfrcAAH7hfcx+twAAfeJ9zX24AAB94nzNfbgAAHzifM18uAAAfOJ8zXy4AAB843vOe7kAAHvje857uQAAe+N6znu5AAB643rOerkAAHrkes96ugAAeuR5z3q6AAB55HnPeboAAHnkec95ugAAeeV40Hi7AAB45XjQeLsAAOvs59rhzNvA1rXOpr6UZYG47cLbw83CwcC2u6etlWWCqO603LbOtsO1t7CopJZlg5/vq92uz67DrbipqZ6XZYSY76TeqNCoxai5pKqZmGWFkvCf36PRpMWjuqCrlZllho3xm+Cf0aDHoLudrJKZZYeJ8pfgm9KdyJ28mq2PmmWIhfKU4ZjTmsiavZetjZtliYLzkeKV1JfKl76VroucZYp/9I7jk9WVypW/k6+JnWWLfPSM5JHWk8yTwJGwh55ljHn1ieSO15HMkcGPsYafZY129ofljNiPzZDCjrKEoGWOdPaF5ovZjc+Owoyzg6Blj3H3g+eJ2ovPjcOLtIKhZZBv94Hoh9uK0IzEirWBomWRbfh/6IbcidGKxYm1gKNlkmr4fumE3YfTicaHtn+kZZNo+Hzqg96G1IjHhrd+pWWUZvh764HfhdWHyIW4fqZllWT5eeuA4ITWhsmFuX2nZZZh+Xfsf+CD1oXKhLp8qGWXX/l27X3hgdeEy4O7e6llmF35de584oDYg8yCvHupZZlb+HPue+N/2oLNgb16qmWaWPhy73rkf9qBzoG+eqtlm1b3cPB55X7bgc+Av3msZZxT9m/weOZ93YDQf795rWWdUfVu8XfnfN1/0X/AeK5lnk/0bPF26HvfftJ+wXivZZ9M8mvydel6337TfsJ3sGWg6fDn4OTQ38DYsc6hvJFpgbXxweHF0cXBwrK6oquSaYKm8rPiudK6w7ezsKOik2mDnPOr47DTssOwtKmknJRphJX0pOSq1KzFqrWkpZeVaYWP9Z/lpdWnxaa2oKaTlmmGivaa5qHWo8eit5ynkJdph4b3l+ee16DIn7iZqI6YaYiC+JPom9idyJy5l6mLmWmJfvmQ6ZjZm8qaupWqiZppinv6juqV2pjKl7uTq4ibaYt3+4vrk9uWzJW8kayGnGmMdPyJ7JHclMyUvY+thZ1pjXH9h+2P3ZLNkr6OroOeaY5u/oXujd6Rz5C/jK+Cn2mPa/+D74zfj8+PwIuwgaBpkGkAgfCK4I7QjcGKsYChaZFmAX/xiOGM0YzCiLJ/ommSYwJ98ofii9OLw4ezf6Npk2ADe/OF44rUisSGtH6kaZRdBHr0hOSI1YnFhbV9pWmVWgV49YPlh9aIxoW2fKZpllYGd/aC5obWh8eEt3ynaZdTB3X3gOeF14bIg7h7qGmYTwh0+H/ohNiFyYK5e6lpmUsJcvl+6YPahMqBunqqaZpHCnH6feqC2oPLgbt5q2mbQgtv+3zrgduCzIC8eaxpnDsMbvx77IDdgs1/vXitaZ00DW39eu1/3YHOf754rmmeKQ5r/nnuf9+Az36/eK9pnxcPav94737ff9B9wHewaaAAAAAAQk5TMQUBAQLVJ1oQU0lSRU4AAAAAAAAAQUJTVFIuIE1BR0UAQAAAKytAQAAALQAAQEAAABQABWQPAEBAFEFff1QAX38+ATwCAAFuBXgIeAx4AAAAAAAAAAgA+cDJwABaAIsADwB1APcAYwCGAO4AhgCxAFIACgCVAL8AFwA1AGUAaAANAKAArAAbAGMAWwB2ANMACQBwALQA1QA4AB0A1QAwAL4A8AA5AKMAbQAFAIoA1AA7ADoA7wCSAJMAowBeAE8A9wAKAO0AiwCPACYAuwDoAFwAkABUAJgA+gAZALgAKQD8AMUA1gA3AGoAjwApANgARQA3AMsApgCNAC0A6gB2AC8AtQARAFkAqgD4AEMAEQABAKwA2ABGAMQA0QCAAHAANQBJAOAAuABoAAkAXABKAL0AigAjAP8A8gC6AAUANQC2AL4AhgBaAOwAnABZAB8A4wAKAAgA0ADpABgAZQBiAMoANADgAGEARADhANMAmQBuADwA0ADJAEgANgCLAPEAOwDnABQALAC7AF4AWQCWAPAAhgA1APwA1gCpAJIARwA/AEQASwCcAKkAswB1ACEA5wAaAJoA/QAKAHoAXgCOALEAGwC7AK4AdwAVAAQAWwCAAFQADQAXAC8AywCTAE8ANQCxAD8AGAADAJoArgDVAFMAXAABAKIAlwAwACMAVgBmAMMAjgBZAKEAGgDCAL8AQwBDAIMAqgD8AB4AuACjAI8AmAAVAOsAUABXAEwA9gA0AJwAxwDZAEQAgAC8ALsAMwBXAM4AKwBFANUAoQDjAJ4AZQC6AHz9wA2B1sAAE7bAAIBtQQBYYsIAgVhCADdRwwCBSkMAPETEAII/RAA7OsQAgzZFAEMyxQCDL0YAQyvGAIMoRgA7JccAgyNHAEEgyACEHkgAQxvIAIQZSQBMF8kAhRVKAD4TygCFEUsAQBDLAIYOSwBIDMwAhgtMAEsJzQCHCE0ASQbNAIcFTgA/AM4AiABPAEsAzwCIAFAASADQAIkAUABLANEAiABRAEsA0gCKAFIARQDSAIkAUwBKANMAigBUAEoA1ACKAFUARwDVAIsAVQBQANYAigBWAEEA1wCLAFcARgDXAI0AWABCANgAjABZAFMA2QCLAFoASwDaAI4AWgBAANsAjwBbAFoA3ACTAFwAWgDcAI0AXQBUAN0AjwBeAE8A3gCOAF8AUgDfAJIAXwBFAOAAjwBgAFQA4QCRAGEAXADiAJAAYgBTAOIAmgBjAFYA4wCVAGQAXgDkAIwAZABYAOUAkQBlAEoA5gCSAGYASgDnAJAAZwBdAOcAnQBoACoA6ACYAGkAVgDpAJcAaQBLAOoAkwBqAEMA6wCPAGsASgDsAJUAbABTAOwAmABtAFEA7QCRAG4AagDuAJcAbwBGAO8AlQBvAE8A8ACMAHAAVgDxAJUAcQBtAPEAngByAEkA8gCgAHMAUwDzAIwAdABdAPQAlQB0AHIA9QCvAHUAfPPAwkB4SLJAuMGoQJfAokGmwZ1BksCYQZzBlUGOwJJBlMGPQYnBjUGPwopBhsGIQYrChkKDwYVChsKDQoDBgkKDwoBCfcJ/QoDDfkJ7wnxCfsN7Q3nCekN7w3lDd8J4Q3nDd0N1w3ZDd8R2Q3TDdUN2xHREcsNzRHTEckRxw3JEcsRxRG/EcERxxXBEbsRvRXDFbkVtxG5FbsVtRWzEbEVtxWxFa8VrRWzGa0VqxWpGa8ZqRmnFaUZqxmlGaMVoRmnGaEZnxmdGaMdnRmbGZkdnx2ZHZcZmR2bHZUdkxmVHZcdkR2THZEdkyGRHY8djSGTIY0hix2JIY8hiSGHHYkhiyGFIYchhSGHJYUhgyGBJYclgSV/IYElgyV9JX8hfSV/JX0leyV5JX8peSV7JXkpeyl1KXcldSl3KXUpcyV1KXcpcSlzKXEpcy1xKW8pcS1zLW0tbyltLW8tbS1rLWktby1pLWstaS1rMWktZy1lMWsxZTFnLWUxZzFlMWMxYTFnMWExYzFhMWM1YTFfMWE1YzVdNV8xXTVfNV01XzVdNV81WTVbNVk1WzlZNVs1WTlbOVk5VzVVOVs5VTlXOVU5VzlVOVc5VTlXPVE5UzlRPVM9UT1TOVE9Uz1RPU89UT1TPU09Tz1NPU9BTT1PPU1BT0FNQUs9SUFPQUlBS0FJQ98DSQN7AwkDSwLhAysCyQcTBrUHAwahBvMGlQbjBokG2wZ9Bs8GdQbHBmkGvwZhCrcKXQqvClUKpwpNCqMKSQqbCkEKlwo9CpMKOQqLCjUKhw4tDoMOKQ5/DiUOew4hDncOHQ5zDhkObw4ZDmsOFQ5rEhESZxINE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mUWYxZhFmMWYRZfFl0aXxpdGlsaWRpbGlkaVxpVGlcaVRpTGlEaUxpRGlMaTR5PHk0eTx5JHkseSR5LHkkeRx5FHkceRR5HHkEeQyJBIkMiQSI/Ij0iPyI9Ij8iPSI7IjkiOyI5IjsiOSI3IjUmNyY1JjcmNSYzJjEmMyYxJjMmMSYvJi0mLyYtJi8mLSovKikqKyopKisqKSorKikqJyolKicqJSonKiUqJyohLiMuIS4jLiEuIy4hLiMuHS4fLh0uHy4dLh8uHS4fLhkyGzIZMhsyGTIbMhkyGzIVMhcyFTIXMhUyFzIVMhcyFTYTNhE2EzYRNhM2ETYTNhE2EzYNNg82DTYPNg02DzYNOg86DToPOgk6CzoJOgs6CToLOgk6CzoJOgs6BToHOgU+Bz4FPgc+BT4HPgU+Bz4BPgM+AT4DPgE+Az4BPgM+AUIDQgFCA0H9Qf9B/UH/QCAD5wAD9AJcAgwAOAAUAoACcAK0AvgAYAIMAqADfAHMAjwAPAA0AzwCrALkAkQCNAAAAPgAOAHsALwAXAIUAvwA9AEkALwDTALIAjwDtAB8AwgCiAPQAPwCRANcArQBgAP4AmQDSAFUAJABMAFoAtQD2ADoAqgDEAGEATgCTAPsAZgDDADsAqwAmAEUAxwDVAN4AegCKACwAfQB9ANoA3QBtAFYA5QDNALYAPgAmAJQAtgDTAH0AVgD4ABEA9gDHAAkAvgDaAEkABAA4AIQAvwA0AB0AWwBfABoAtwBTADEAQgBSAMwAYABTAOIAKwBmAAAAywBcADUA2gDNAN4AOgD8AL4AtgA9AJsAvAChALMAxAA6AMgA6gDfALgAngCSAIgAPgDdAKwAAwA9AKYAygCtALMAlgAPAFMArADKAKEA3gA0AAcApQD0AL4APABeABMAPgANAKcAGgADAKkAVQA5AM8AYAA1AG4AmwCuAMsADwBPAHwACQAqAHIApgAUAK0AjACAAEoAsQBHAMAAEQAKAHoAfwCnAHsAUACVABAAEgAbAMwAYgAgAI0AhwAZAIoApQBlAMkAhwA7AGIApACAADEAAgAVAHcArQCeACgAPQCpACQAYgChADAAjgDEAG0AOwC1AMMATwA6ABsApwDtADEAPwCkANoA2gCAAMgAYf3ADYHWwAATtsAAgG1BAFhiwgCBWEIAN1HDAIFKQwA8RMQAgj9EADs6xACDNkUAQzLFAIMvRgBDK8YAgyhGADslxwCDI0cAQSDIAIQeSABDG8gAhBlJAEwXyQCFFUoAPhPKAIURSwBAEMsAhg5LAEgMzACGC0wASwnNAIcITQBJBs0AhwVOAD8AzgCIAE8ASwDPAIgAUABIANAAiQBQAEsA0QCIAFEASwDSAIoAUgBFANIAiQBTAEoA0wCKAFQASgDUAIoAVQBHANUAiwBVAFAA1gCKAFYAQQDXAIsAVwBGANcAjQBYAEIA2ACMAFkAUwDZAIsAWgBLANoAjgBaAEAA2wCPAFsAWgDcAJMAXABaANwAjQBdAFQA3QCPAF4ATwDeAI4AXwBSAN8AkgBfAEUA4ACPAGAAVADhAJEAYQBcAOIAkABiAFMA4gCaAGMAVgDjAJUAZABeAOQAjABkAFgA5QCRAGUASgDmAJIAZgBKAOcAkABnAF0A5wCdAGgAKgDoAJgAaQBWAOkAlwBpAEsA6gCTAGoAQwDrAI8AawBKAOwAlQBsAFMA7ACYAG0AUQDtAJEAbgBqAO4AlwBvAEYA7wCVAG8ATwDwAIwAcABWAPEAlQBxAG0A8QCeAHIASQDyAKAAcwBTAPMAjAB0AF0A9ACVAHQAcgD1AK8AdQB888DCQHhIskC4wahAl8CiQabBnUGSwJhBnMGVQY7AkkGUwY9BicGNQY/CikGGwYhBisKGQoPBhUKGwoNCgMGCQoPCgEJ9wn9CgMN+QnvCfEJ+w3tDecJ6Q3vDeUN3wnhDecN3Q3XDdkN3xHZDdMN1Q3bEdERyw3NEdMRyRHHDckRyxHFEb8RwRHHFcERuxG9FcMVuRW3EbkVuxW1FbMRsRW3FbEVrxWtFbMZrRWrFakZrxmpGacVpRmrGaUZoxWhGacZoRmfGZ0Zox2dGZsZmR2fHZkdlxmZHZsdlR2TGZUdlx2RHZMdkR2TIZEdjx2NIZMhjSGLHYkhjyGJIYcdiSGLIYUhhyGFIYclhSGDIYElhyWBJX8hgSWDJX0lfyF9JX8lfSV7JXklfyl5JXsleSl7KXUpdyV1KXcpdSlzJXUpdylxKXMpcSlzLXEpbylxLXMtbS1vKW0tby1tLWstaS1vLWktay1pLWsxaS1nLWUxazFlMWctZTFnMWUxYzFhMWcxYTFjMWExYzVhMV8xYTVjNV01XzFdNV81XTVfNV01XzVZNVs1WTVbOVk1WzVZOVs5WTlXNVU5WzlVOVc5VTlXOVU5VzlVOVc9UTlTOVE9Uz1RPVM5UT1TPVE9Tz1RPVM9TT1PPU09T0FNPU89TUFPQU1BSz1JQU9BSUFLQUlD3wNJA3sDCQNLAuEDKwLJBxMGtQcDBqEG8waVBuMGiQbbBn0GzwZ1BscGaQa/BmEKtwpdCq8KVQqnCk0KowpJCpsKQQqXCj0Kkwo5CosKNQqHDi0Ogw4pDn8OJQ57DiEOdw4dDnMOGQ5vDhkOaw4VDmsSERJnEg0SYxIJEl8SCRJfEgUSWxIBElcSARJXEf0SUxX5Fk8V+RZPFfUWSxX1FkcV8RZHFe0WQxXtFkMV6Ro/GekaPxnlGjsZ5Ro7GeEaNxnhGjcZ3RozGd0aMxndHjMd2R4vHdkeLx3VHisd1R4rHdEeJx3RHicd0R4nHc0eIyHNIiMhySIjIckiHyHJIh8hxSIbIcUiGyHFIhshwSIXJcEmFyXBJhclvSYTJb0mEyW9JhMluSYTJbkmDyW5Jg8puSoPKbUqCym1KgsptSoLKbEqBymxKgcpsSoHKbEuBy2tLgMtrS4DLa0uAy2tLgMtqS3/Lakt/y2pLf8tqTH/MaUx+zGlMfsxpTH7MaUx+zGhMfcxoTH3MaEx9zGhMfc1nTX3NZ018zWdNfM1nTXzNZ018zWZNe81mTXvNZk17zmZOe85lTnvOZU56zmVOes5lTnrOZU56zmVOes5kTnnPZE95z2RPec9kT3nPZE95z2NPec9jT3jPY094z2NQeNBjUHjQYlB40GJQd9BiUP/AAKnmwABH2sAAu9LAAEDMwQBLx8EAwMTBAMDAwQCtvcEAwLvBAPq4wQBAtsEAE7TCALOzwgBAscIAQK/CAECuwgAorcIAvavCAFOqwgDDqcMAaKjDAECnwwBApsMAAKXDAMCkwwDAo8MAyqLDAEChxAAAocQAQKDEAECfxAAAnsQAQJ7EAACdxABAnMQAQJzFAMWbxQAAmsUAAJrFAACZxQDAmcUAAJjFACCYxQAAl8YAQJfGAACWxgAAlsYAAJXGAACVxgAAlMYAAJTGAACTxwBAk8cAAJLHAMCSxwAAkscAAJHHAACRxwAAkMcAAJDIAECQyAAAj8gAwI/IAACPyADTjsgAAI7IAACOyAAAjckAAI3JAACNyQDTjMkAAIzJAACMyQAAi8kAAIvJAACLygAAisoAAIrKAACKygAAisoAIInKAACJygAAicoAAIjLAACIywAAiMsAAIjLAACHywAAh8sAAIfLAACHywAAhswAAIbMAACGzAAAhswAAIXMAACFzAAAhcwAAIXMAACFzQAAhM0AAITNAACEzQAAhM0AAIPNAACDzQAAg80AAIPOAACDzgAAgs4AAILOAACCzgAAgs4AAILOAACBzgAAgc8AAIHPAACBzwAAgc8AAIDPAACAzwAAgM8AAIDPAACA0AAAgNAAAH/QAAB/0AAA+NXnwN6rAELT1c7Ay6sAtsXWwsHArADAvNa6wbmsAMC21rXBtKwAYbHWsMGvrADArdeswqutAECq16nCqK0AbafXpsKlrQBApNejwqOtAPKi2KHDoa4AAKDYn8OfrgBAntidw52uAC2c2JvDm64AU5rZmcSZrwBAmdmYxJivAACX2ZbElq8AQJbZlcSVrwBAldqUxZSwAECT2pPFk7AAQJLakcWSsAAAkdqQxZCwAGCQ24/Gj7EA9Y/bjsaOsQAAjtuNxo2xAACN24zGjbEAwIzcjMeMsgAAi9yLx4uyAACK3IrHirIAQIrciceJsgAAid2IyImzAECI3YjIiLMAAIfdh8iHswAAh92GyIazAACG3obJhrQAAIXehcmFtAAAhd6EyYS0AMCE3oTJhLQAAITfg8qDtQDAg9+CyoO1AACC34LKgrUAAILfgcqCtQAAgeCBy4G2AACB4IDLgLYAAIDggMuAtgAAgOB/y3+2AAB/4X/Mf7cAAH/hfsx/twAAfuF+zH63AAB+4X3MfrcAAH3ifc19uAAAfeJ8zX24AAB84nzNfLgAAHzifM18uAAAfON7znu5AAB743vOe7kAAHvjes57uQAAeuN6znq5AAB65HrPeroAAHrkec96ugAAeeR5z3m6AAB55HnPeboAAHnleNB4uwAAeOV40Hi7AADr7Ofa4czbwNa1zqa+lGWBuO3C28PNwsHAtrunrZVlgqjutNy2zrbDtbewqKSWZYOf76vdrs+uw624qamel2WEmO+k3qjQqMWouaSqmZhlhZLwn9+j0aTFo7qgq5WZZYaN8Zvgn9Ggx6C7naySmWWHifKX4JvSncidvJqtj5pliIXylOGY05rImr2XrY2bZYmC85HildSXype+la6LnGWKf/SO45PVlcqVv5OviZ1li3z0jOSR1pPMk8CRsIeeZYx59YnkjteRzJHBj7GGn2WNdvaH5YzYj82Qwo6yhKBljnT2heaL2Y3PjsKMs4OgZY9x94PnidqLz43Di7SCoWWQb/eB6IfbitCMxIq1gaJlkW34f+iG3InRisWJtYCjZZJq+H7phN2H04nGh7Z/pGWTaPh86oPehtSIx4a3fqVllGb4e+uB34XVh8iFuH6mZZVk+XnrgOCE1obJhbl9p2WWYfl37H/gg9aFyoS6fKhll1/5du194YHXhMuDu3upZZhd+XXufOKA2IPMgrx7qWWZW/hz7nvjf9qCzYG9eqplmlj4cu965H/agc6BvnqrZZtW93DweeV+24HPgL95rGWcU/Zv8Hjmfd2A0H+/ea1lnVH1bvF353zdf9F/wHiuZZ5P9Gzxduh7337SfsF4r2WfTPJr8nXpet9+037Cd7BloOnw5+Dk0N/A2LHOobyRaYG18cHhxdHFwcKyuqKrkmmCpvKz4rnSusO3s7CjopNpg5zzq+Ow07LDsLSppJyUaYSV9KTkqtSsxaq1pKWXlWmFj/Wf5aXVp8WmtqCmk5Zphor2muah1qPHorecp5CXaYeG95fnntegyJ+4maiOmGmIgviT6JvYncicuZepi5lpiX75kOmY2ZvKmrqVqomaaYp7+o7qldqYype7k6uIm2mLd/uL65PblsyVvJGshpxpjHT8ieyR3JTMlL2PrYWdaY1x/Yftj92SzZK+jq6DnmmObv6F7o3ekc+Qv4yvgp9pj2v/g++M34/Pj8CLsIGgaZBpAIHwiuCO0I3BirGAoWmRZgF/8YjhjNGMwoiyf6JpkmMCffKH4ovTi8OHs3+jaZNgA3vzheOK1IrEhrR+pGmUXQR69ITkiNWJxYW1faVplVoFePWD5YfWiMaFtnymaZZWBnf2guaG1ofHhLd8p2mXUwd194DnhdeGyIO4e6hpmE8IdPh/6ITYhcmCuXupaZlLCXL5fumD2oTKgbp6qmmaRwpx+n3qgtqDy4G7eatpm0ILb/t864HbgsyAvHmsaZw7DG78e+yA3YLNf714rWmdNA1t/Xrtf92Bzn++eK5pnikOa/557n/fgM9+v3ivaZ8XD2r/eO9+33/QfcB3sGmgAAAAAEJOUzEFAgICeTpcBEhBUkQgTEVBRAAAAE1YTUZSUFIAAAAAAEAAAABkYEAAACAAYUBAAAEUAANOAABAABQAX39IAGUAPgE8AgABbgV4CHgMeAA3AAAAAAABAP9A78DmQN/A2kDVwNJAz8DMQcrBx0HFwcRBwsHAQb/BvUG8wbtBusG4QbfBtkG1wbRCtMKzQrLCsUKwwq9Cr8KuQq3CrUKswqtCq8KqQqrDqUOow6hDp8OnQ6bDpkOlw6VDpMOkQ6TDo0Ojw6JDosOhRKHEoUSgxKBEn8SfRJ/EnkSexJ5EncSdRJ3EnEScxZxFm8WbRZvFmkWaxZpFmsWZRZnFmUWYxZhFmMWYRZfFl0aXxpdGlsaWRpbGlkaVxpVGlcaVRpTGlEaUxpRGlMeTR5PHk0eTx5JHkseSR5LHkkeRx5FHkceRR5HHkEeQyJBIkMiQSI/Ij0iPyI9Ij8iPSI7IjkiOyI5IjsiOSI3IjUmNyY1JjcmNSYzJjEmMyYxJjMmMSYvJi0mLyYtJi8mLSovKikqKyopKisqKSorKikqJyolKicqJSonKiUqJy4hLiMuIS4jLiEuIy4hLiMuHS4fLh0uHy4dLh8uHS4fMhkyGzIZMhsyGTIbMhkyGzIVMhcyFTIXMhUyFzIVMhcyFTYTNhE2EzYRNhM2ETYTNhE2EzYNNg82DTYPNg02DzYNOg86DToPOgk6CzoJOgs6CToLOgk6CzoJOgs6BToHPgU+Bz4FPgc+BT4HPgU+Bz4BPgM+AT4DPgE+Az4BPgM+AUIDQgFCA0H9Qf9B/UH/QAQD/QO/A5kDfwNpA1cDSQM/AzEHKwcdBxcHEQcLBwEG/wb1BvMG7QbrBuEG3wbZBtcG0QrTCs0KywrFCsMKvQq/CrkKtwq1CrMKrQqvCqkKqw6lDqMOoQ6fDp0Omw6ZDpcOlQ6TDpEOkw6NDo8OiQ6LDoUShxKFEoMSgRJ/En0SfxJ5EnsSeRJ3EnUSdxJxEnMWcRZvFm0WbxZpFmsWaRZrFmUWZxZlFmMWYRZjFmEWXxZdGl8aXRpbGlkaWxpZGlcaVRpXGlUaUxpRGlMaURpTHk0eTx5NHk8eSR5LHkkeSx5JHkceRR5HHkUeRx5BHkMiQSJDIkEiPyI9Ij8iPSI/Ij0iOyI5IjsiOSI7IjkiNyI1JjcmNSY3JjUmMyYxJjMmMSYzJjEmLyYtJi8mLSYvJi0qLyopKisqKSorKikqKyopKicqJSonKiUqJyolKicuIS4jLiEuIy4hLiMuIS4jLh0uHy4dLh8uHS4fLh0uHzIZMhsyGTIbMhkyGzIZMhsyFTIXMhUyFzIVMhcyFTIXMhU2EzYRNhM2ETYTNhE2EzYRNhM2DTYPNg02DzYNNg82DToPOg06DzoJOgs6CToLOgk6CzoJOgs6CToLOgU6Bz4FPgc+BT4HPgU+Bz4FPgc+AT4DPgE+Az4BPgM+AT4DPgFCA0IBQgNB/UH/Qf1B/0AAAAABCTlMxBQICAhWmXCBOSUNFIExFQUQAAABNWE1GUlBSAAAAAABAAAAUSmBAHAMZAFlgQFEBHAABaAAAQAAUAF9/PgBeAD4BPAIAAW4FeAh4DHgAAAAAAAAACAD5wAD9AJcAgwAOAAUAoACcAK0AvgAYAIMAqADfAHMAjwAPAA0AzwCrALkAkQCNAAAAPgAOAHsALwAXAIUAvwA9AEkALwDTALIAjwDtAB8AwgCiAPQAPwCRANcArQBgAP4AmQDSAFUAJABMAFoAtQD2ADoAqgDEAGEATgCTAPsAZgDDADsAqwAmAEUAxwDVAN4AegCKACwAfQB9ANoA3QBtAFYA5QDNALYAPgAmAJQAtgDTAH0AVgD4ABEA9gDHAAkAvgDaAEkABAA4AIQAvwA0AB0AWwBfABoAtwBTADEAQgBSAMwAYABTAOIAKwBmAAAAywBcADUA2gDNAN4AOgD8AL4AtgA9AJsAvAChALMAxAA6AMgA6gDfALgAngCSAIgAPgDdAKwAAwA9AKYAygCtALMAlgAPAFMArADKAKEA3gA0AAcApQD0AL4APABeABMAPgANAKcAGgADAKkAVQA5AM8AYAA1AG4AmwCuAMsADwBPAHwACQAqAHIApgAUAK0AjACAAEoAsQBHAMAAEQAKAHoAfwCnAHsAUACVABAAEgAbAMwAYgAgAI0AhwAZAIoApQBlAMkAhwA7AGIApACAADEAAgAVAHcArQCeACgAPQCpACQAYgChADAAjgDEAG0AOwC1AMMATwA6ABsApwDtADEAPwCkANoA2gCAAMgAYf3ADYHWwAATtsAAgG1BAFhiwgCBWEIAN1HDAIFKQwA8RMQAgj9EADs6xACDNkUAQzLFAIMvRgBDK8YAgyhGADslxwCDI0cAQSDIAIQeSABDG8gAhBlJAEwXyQCFFUoAPhPKAIURSwBAEMsAhg5LAEgMzACGC0wASwnNAIcITQBJBs0AhwVOAD8AzgCIAE8ASwDPAIgAUABIANAAiQBQAEsA0QCIAFEASwDSAIoAUgBFANIAiQBTAEoA0wCKAFQASgDUAIoAVQBHANUAiwBVAFAA1gCKAFYAQQDXAIsAVwBGANcAjQBYAEIA2ACMAFkAUwDZAIsAWgBLANoAjgBaAEAA2wCPAFsAWgDcAJMAXABaANwAjQBdAFQA3QCPAF4ATwDeAI4AXwBSAN8AkgBfAEUA4ACPAGAAVADhAJEAYQBcAOIAkABiAFMA4gCaAGMAVgDjAJUAZABeAOQAjABkAFgA5QCRAGUASgDmAJIAZgBKAOcAkABnAF0A5wCdAGgAKgDoAJgAaQBWAOkAlwBpAEsA6gCTAGoAQwDrAI8AawBKAOwAlQBsAFMA7ACYAG0AUQDtAJEAbgBqAO4AlwBvAEYA7wCVAG8ATwDwAIwAcABWAPEAlQBxAG0A8QCeAHIASQDyAKAAcwBTAPMAjAB0AF0A9ACVAHQAcgD1AK8AdQB888DCQHhIskC4wahAl8CiQabBnUGSwJhBnMGVQY7AkkGUwY9BicGNQY/CikGGwYhBisKGQoPBhUKGwoNCgMGCQoPCgEJ9wn9CgMN+QnvCfEJ+w3tDecJ6Q3vDeUN3wnhDecN3Q3XDdkN3xHZDdMN1Q3bEdERyw3NEdMRyRHHDckRyxHFEb8RwRHHFcERuxG9FcMVuRW3EbkVuxW1FbMRsRW3FbEVrxWtFbMZrRWrFakZrxmpGacVpRmrGaUZoxWhGacZoRmfGZ0Zox2dGZsZmR2fHZkdlxmZHZsdlR2TGZUdlx2RHZMdkR2TIZEdjx2NIZMhjSGLHYkhjyGJIYcdiSGLIYUhhyGFIYclhSGDIYElhyWBJX8hgSWDJX0lfyF9JX8lfSV7JXklfyl5JXsleSl7KXUpdyV1KXcpdSlzJXUpdylxKXMpcSlzLXEpbylxLXMtbS1vKW0tby1tLWstaS1vLWktay1pLWsxaS1nLWUxazFlMWctZTFnMWUxYzFhMWcxYTFjMWExYzVhMV8xYTVjNV01XzFdNV81XTVfNV01XzVZNVs1WTVbOVk1WzVZOVs5WTlXNVU5WzlVOVc5VTlXOVU5VzlVOVc9UTlTOVE9Uz1RPVM5UT1TPVE9Tz1RPVM9TT1PPU09T0FNPU89TUFPQU1BSz1JQU9BSUFLQUlD3wNJA3sDCQNLAuEDKwLJBxMGtQcDBqEG8waVBuMGiQbbBn0GzwZ1BscGaQa/BmEKtwpdCq8KVQqnCk0KowpJCpsKQQqXCj0Kkwo5CosKNQqHDi0Ogw4pDn8OJQ57DiEOdw4dDnMOGQ5vDhkOaw4VDmsSERJnEg0SYxIJEl8SCRJfEgUSWxIBElcSARJXEf0SUxX5Fk8V+RZPFfUWSxX1FkcV8RZHFe0WQxXtFkMV6Ro/GekaPxnlGjsZ5Ro7GeEaNxnhGjcZ3RozGd0aMxndHjMd2R4vHdkeLx3VHisd1R4rHdEeJx3RHicd0R4nHc0eIyHNIiMhySIjIckiHyHJIh8hxSIbIcUiGyHFIhshwSIXJcEmFyXBJhclvSYTJb0mEyW9JhMluSYTJbkmDyW5Jg8puSoPKbUqCym1KgsptSoLKbEqBymxKgcpsSoHKbEuBy2tLgMtrS4DLa0uAy2tLgMtqS3/Lakt/y2pLf8tqTH/MaUx+zGlMfsxpTH7MaUx+zGhMfcxoTH3MaEx9zGhMfc1nTX3NZ018zWdNfM1nTXzNZ018zWZNe81mTXvNZk17zmZOe85lTnvOZU56zmVOes5lTnrOZU56zmVOes5kTnnPZE95z2RPec9kT3nPZE95z2NPec9jT3jPY094z2NQeNBjUHjQYlB40GJQd9BiUP/AAKnmwABH2sAAu9LAAEDMwQBLx8EAwMTBAMDAwQCtvcEAwLvBAPq4wQBAtsEAE7TCALOzwgBAscIAQK/CAECuwgAorcIAvavCAFOqwgDDqcMAaKjDAECnwwBApsMAAKXDAMCkwwDAo8MAyqLDAEChxAAAocQAQKDEAECfxAAAnsQAQJ7EAACdxABAnMQAQJzFAMWbxQAAmsUAAJrFAACZxQDAmcUAAJjFACCYxQAAl8YAQJfGAACWxgAAlsYAAJXGAACVxgAAlMYAAJTGAACTxwBAk8cAAJLHAMCSxwAAkscAAJHHAACRxwAAkMcAAJDIAECQyAAAj8gAwI/IAACPyADTjsgAAI7IAACOyAAAjckAAI3JAACNyQDTjMkAAIzJAACMyQAAi8kAAIvJAACLygAAisoAAIrKAACKygAAisoAIInKAACJygAAicoAAIjLAACIywAAiMsAAIjLAACHywAAh8sAAIfLAACHywAAhswAAIbMAACGzAAAhswAAIXMAACFzAAAhcwAAIXMAACFzQAAhM0AAITNAACEzQAAhM0AAIPNAACDzQAAg80AAIPOAACDzgAAgs4AAILOAACCzgAAgs4AAILOAACBzgAAgc8AAIHPAACBzwAAgc8AAIDPAACAzwAAgM8AAIDPAACA0AAAgNAAAH/QAAB/0AAA+NXnwN6rAELT1c7Ay6sAtsXWwsHArADAvNa6wbmsAMC21rXBtKwAYbHWsMGvrADArdeswqutAECq16nCqK0AbafXpsKlrQBApNejwqOtAPKi2KHDoa4AAKDYn8OfrgBAntidw52uAC2c2JvDm64AU5rZmcSZrwBAmdmYxJivAACX2ZbElq8AQJbZlcSVrwBAldqUxZSwAECT2pPFk7AAQJLakcWSsAAAkdqQxZCwAGCQ24/Gj7EA9Y/bjsaOsQAAjtuNxo2xAACN24zGjbEAwIzcjMeMsgAAi9yLx4uyAACK3IrHirIAQIrciceJsgAAid2IyImzAECI3YjIiLMAAIfdh8iHswAAh92GyIazAACG3obJhrQAAIXehcmFtAAAhd6EyYS0AMCE3oTJhLQAAITfg8qDtQDAg9+CyoO1AACC34LKgrUAAILfgcqCtQAAgeCBy4G2AACB4IDLgLYAAIDggMuAtgAAgOB/y3+2AAB/4X/Mf7cAAH/hfsx/twAAfuF+zH63AAB+4X3MfrcAAH3ifc19uAAAfeJ8zX24AAB84nzNfLgAAHzifM18uAAAfON7znu5AAB743vOe7kAAHvjes57uQAAeuN6znq5AAB65HrPeroAAHrkec96ugAAeeR5z3m6AAB55HnPeboAAHnleNB4uwAAeOV40Hi7AADr7Ofa4czbwNa1zqa+lGWBuO3C28PNwsHAtrunrZVlgqjutNy2zrbDtbewqKSWZYOf76vdrs+uw624qamel2WEmO+k3qjQqMWouaSqmZhlhZLwn9+j0aTFo7qgq5WZZYaN8Zvgn9Ggx6C7naySmWWHifKX4JvSncidvJqtj5pliIXylOGY05rImr2XrY2bZYmC85HildSXype+la6LnGWKf/SO45PVlcqVv5OviZ1li3z0jOSR1pPMk8CRsIeeZYx59YnkjteRzJHBj7GGn2WNdvaH5YzYj82Qwo6yhKBljnT2heaL2Y3PjsKMs4OgZY9x94PnidqLz43Di7SCoWWQb/eB6IfbitCMxIq1gaJlkW34f+iG3InRisWJtYCjZZJq+H7phN2H04nGh7Z/pGWTaPh86oPehtSIx4a3fqVllGb4e+uB34XVh8iFuH6mZZVk+XnrgOCE1obJhbl9p2WWYfl37H/gg9aFyoS6fKhll1/5du194YHXhMuDu3upZZhd+XXufOKA2IPMgrx7qWWZW/hz7nvjf9qCzYG9eqplmlj4cu965H/agc6BvnqrZZtW93DweeV+24HPgL95rGWcU/Zv8Hjmfd2A0H+/ea1lnVH1bvF353zdf9F/wHiuZZ5P9Gzxduh7337SfsF4r2WfTPJr8nXpet9+037Cd7BloOnw5+Dk0N/A2LHOobyRaYG18cHhxdHFwcKyuqKrkmmCpvKz4rnSusO3s7CjopNpg5zzq+Ow07LDsLSppJyUaYSV9KTkqtSsxaq1pKWXlWmFj/Wf5aXVp8WmtqCmk5Zphor2muah1qPHorecp5CXaYeG95fnntegyJ+4maiOmGmIgviT6JvYncicuZepi5lpiX75kOmY2ZvKmrqVqomaaYp7+o7qldqYype7k6uIm2mLd/uL65PblsyVvJGshpxpjHT8ieyR3JTMlL2PrYWdaY1x/Yftj92SzZK+jq6DnmmObv6F7o3ekc+Qv4yvgp9pj2v/g++M34/Pj8CLsIGgaZBpAIHwiuCO0I3BirGAoWmRZgF/8YjhjNGMwoiyf6JpkmMCffKH4ovTi8OHs3+jaZNgA3vzheOK1IrEhrR+pGmUXQR69ITkiNWJxYW1faVplVoFePWD5YfWiMaFtnymaZZWBnf2guaG1ofHhLd8p2mXUwd194DnhdeGyIO4e6hpmE8IdPh/6ITYhcmCuXupaZlLCXL5fumD2oTKgbp6qmmaRwpx+n3qgtqDy4G7eatpm0ILb/t864HbgsyAvHmsaZw7DG78e+yA3YLNf714rWmdNA1t/Xrtf92Bzn++eK5pnikOa/557n/fgM9+v3ivaZ8XD2r/eO9+33/QfcB3sGmgCAD5wAD9AJcAgwAOAAUAoACcAK0AvgAYAIMAqADfAHMAjwAPAA0AzwCrALkAkQCNAAAAPgAOAHsALwAXAIUAvwA9AEkALwDTALIAjwDtAB8AwgCiAPQAPwCRANcArQBgAP4AmQDSAFUAJABMAFoAtQD2ADoAqgDEAGEATgCTAPsAZgDDADsAqwAmAEUAxwDVAN4AegCKACwAfQB9ANoA3QBtAFYA5QDNALYAPgAmAJQAtgDTAH0AVgD4ABEA9gDHAAkAvgDaAEkABAA4AIQAvwA0AB0AWwBfABoAtwBTADEAQgBSAMwAYABTAOIAKwBmAAAAywBcADUA2gDNAN4AOgD8AL4AtgA9AJsAvAChALMAxAA6AMgA6gDfALgAngCSAIgAPgDdAKwAAwA9AKYAygCtALMAlgAPAFMArADKAKEA3gA0AAcApQD0AL4APABeABMAPgANAKcAGgADAKkAVQA5AM8AYAA1AG4AmwCuAMsADwBPAHwACQAqAHIApgAUAK0AjACAAEoAsQBHAMAAEQAKAHoAfwCnAHsAUACVABAAEgAbAMwAYgAgAI0AhwAZAIoApQBlAMkAhwA7AGIApACAADEAAgAVAHcArQCeACgAPQCpACQAYgChADAAjgDEAG0AOwC1AMMATwA6ABsApwDtADEAPwCkANoA2gCAAMgAYf3ADYHWwAATtsAAgG1BAFhiwgCBWEIAN1HDAIFKQwA8RMQAgj9EADs6xACDNkUAQzLFAIMvRgBDK8YAgyhGADslxwCDI0cAQSDIAIQeSABDG8gAhBlJAEwXyQCFFUoAPhPKAIURSwBAEMsAhg5LAEgMzACGC0wASwnNAIcITQBJBs0AhwVOAD8AzgCIAE8ASwDPAIgAUABIANAAiQBQAEsA0QCIAFEASwDSAIoAUgBFANIAiQBTAEoA0wCKAFQASgDUAIoAVQBHANUAiwBVAFAA1gCKAFYAQQDXAIsAVwBGANcAjQBYAEIA2ACMAFkAUwDZAIsAWgBLANoAjgBaAEAA2wCPAFsAWgDcAJMAXABaANwAjQBdAFQA3QCPAF4ATwDeAI4AXwBSAN8AkgBfAEUA4ACPAGAAVADhAJEAYQBcAOIAkABiAFMA4gCaAGMAVgDjAJUAZABeAOQAjABkAFgA5QCRAGUASgDmAJIAZgBKAOcAkABnAF0A5wCdAGgAKgDoAJgAaQBWAOkAlwBpAEsA6gCTAGoAQwDrAI8AawBKAOwAlQBsAFMA7ACYAG0AUQDtAJEAbgBqAO4AlwBvAEYA7wCVAG8ATwDwAIwAcABWAPEAlQBxAG0A8QCeAHIASQDyAKAAcwBTAPMAjAB0AF0A9ACVAHQAcgD1AK8AdQB888DCQHhIskC4wahAl8CiQabBnUGSwJhBnMGVQY7AkkGUwY9BicGNQY/CikGGwYhBisKGQoPBhUKGwoNCgMGCQoPCgEJ9wn9CgMN+QnvCfEJ+w3tDecJ6Q3vDeUN3wnhDecN3Q3XDdkN3xHZDdMN1Q3bEdERyw3NEdMRyRHHDckRyxHFEb8RwRHHFcERuxG9FcMVuRW3EbkVuxW1FbMRsRW3FbEVrxWtFbMZrRWrFakZrxmpGacVpRmrGaUZoxWhGacZoRmfGZ0Zox2dGZsZmR2fHZkdlxmZHZsdlR2TGZUdlx2RHZMdkR2TIZEdjx2NIZMhjSGLHYkhjyGJIYcdiSGLIYUhhyGFIYclhSGDIYElhyWBJX8hgSWDJX0lfyF9JX8lfSV7JXklfyl5JXsleSl7KXUpdyV1KXcpdSlzJXUpdylxKXMpcSlzLXEpbylxLXMtbS1vKW0tby1tLWstaS1vLWktay1pLWsxaS1nLWUxazFlMWctZTFnMWUxYzFhMWcxYTFjMWExYzVhMV8xYTVjNV01XzFdNV81XTVfNV01XzVZNVs1WTVbOVk1WzVZOVs5WTlXNVU5WzlVOVc5VTlXOVU5VzlVOVc9UTlTOVE9Uz1RPVM5UT1TPVE9Tz1RPVM9TT1PPU09T0FNPU89TUFPQU1BSz1JQU9BSUFLQUlD3wNJA3sDCQNLAuEDKwLJBxMGtQcDBqEG8waVBuMGiQbbBn0GzwZ1BscGaQa/BmEKtwpdCq8KVQqnCk0KowpJCpsKQQqXCj0Kkwo5CosKNQqHDi0Ogw4pDn8OJQ57DiEOdw4dDnMOGQ5vDhkOaw4VDmsSERJnEg0SYxIJEl8SCRJfEgUSWxIBElcSARJXEf0SUxX5Fk8V+RZPFfUWSxX1FkcV8RZHFe0WQxXtFkMV6Ro/GekaPxnlGjsZ5Ro7GeEaNxnhGjcZ3RozGd0aMxndHjMd2R4vHdkeLx3VHisd1R4rHdEeJx3RHicd0R4nHc0eIyHNIiMhySIjIckiHyHJIh8hxSIbIcUiGyHFIhshwSIXJcEmFyXBJhclvSYTJb0mEyW9JhMluSYTJbkmDyW5Jg8puSoPKbUqCym1KgsptSoLKbEqBymxKgcpsSoHKbEuBy2tLgMtrS4DLa0uAy2tLgMtqS3/Lakt/y2pLf8tqTH/MaUx+zGlMfsxpTH7MaUx+zGhMfcxoTH3MaEx9zGhMfc1nTX3NZ018zWdNfM1nTXzNZ018zWZNe81mTXvNZk17zmZOe85lTnvOZU56zmVOes5lTnrOZU56zmVOes5kTnnPZE95z2RPec9kT3nPZE95z2NPec9jT3jPY094z2NQeNBjUHjQYlB40GJQd9BiUP/AAKnmwABH2sAAu9LAAEDMwQBLx8EAwMTBAMDAwQCtvcEAwLvBAPq4wQBAtsEAE7TCALOzwgBAscIAQK/CAECuwgAorcIAvavCAFOqwgDDqcMAaKjDAECnwwBApsMAAKXDAMCkwwDAo8MAyqLDAEChxAAAocQAQKDEAECfxAAAnsQAQJ7EAACdxABAnMQAQJzFAMWbxQAAmsUAAJrFAACZxQDAmcUAAJjFACCYxQAAl8YAQJfGAACWxgAAlsYAAJXGAACVxgAAlMYAAJTGAACTxwBAk8cAAJLHAMCSxwAAkscAAJHHAACRxwAAkMcAAJDIAECQyAAAj8gAwI/IAACPyADTjsgAAI7IAACOyAAAjckAAI3JAACNyQDTjMkAAIzJAACMyQAAi8kAAIvJAACLygAAisoAAIrKAACKygAAisoAIInKAACJygAAicoAAIjLAACIywAAiMsAAIjLAACHywAAh8sAAIfLAACHywAAhswAAIbMAACGzAAAhswAAIXMAACFzAAAhcwAAIXMAACFzQAAhM0AAITNAACEzQAAhM0AAIPNAACDzQAAg80AAIPOAACDzgAAgs4AAILOAACCzgAAgs4AAILOAACBzgAAgc8AAIHPAACBzwAAgc8AAIDPAACAzwAAgM8AAIDPAACA0AAAgNAAAH/QAAB/0AAA+NXnwN6rAELT1c7Ay6sAtsXWwsHArADAvNa6wbmsAMC21rXBtKwAYbHWsMGvrADArdeswqutAECq16nCqK0AbafXpsKlrQBApNejwqOtAPKi2KHDoa4AAKDYn8OfrgBAntidw52uAC2c2JvDm64AU5rZmcSZrwBAmdmYxJivAACX2ZbElq8AQJbZlcSVrwBAldqUxZSwAECT2pPFk7AAQJLakcWSsAAAkdqQxZCwAGCQ24/Gj7EA9Y/bjsaOsQAAjtuNxo2xAACN24zGjbEAwIzcjMeMsgAAi9yLx4uyAACK3IrHirIAQIrciceJsgAAid2IyImzAECI3YjIiLMAAIfdh8iHswAAh92GyIazAACG3obJhrQAAIXehcmFtAAAhd6EyYS0AMCE3oTJhLQAAITfg8qDtQDAg9+CyoO1AACC34LKgrUAAILfgcqCtQAAgeCBy4G2AACB4IDLgLYAAIDggMuAtgAAgOB/y3+2AAB/4X/Mf7cAAH/hfsx/twAAfuF+zH63AAB+4X3MfrcAAH3ifc19uAAAfeJ8zX24AAB84nzNfLgAAHzifM18uAAAfON7znu5AAB743vOe7kAAHvjes57uQAAeuN6znq5AAB65HrPeroAAHrkec96ugAAeeR5z3m6AAB55HnPeboAAHnleNB4uwAAeOV40Hi7AADr7Ofa4czbwNa1zqa+lGWBuO3C28PNwsHAtrunrZVlgqjutNy2zrbDtbewqKSWZYOf76vdrs+uw624qamel2WEmO+k3qjQqMWouaSqmZhlhZLwn9+j0aTFo7qgq5WZZYaN8Zvgn9Ggx6C7naySmWWHifKX4JvSncidvJqtj5pliIXylOGY05rImr2XrY2bZYmC85HildSXype+la6LnGWKf/SO45PVlcqVv5OviZ1li3z0jOSR1pPMk8CRsIeeZYx59YnkjteRzJHBj7GGn2WNdvaH5YzYj82Qwo6yhKBljnT2heaL2Y3PjsKMs4OgZY9x94PnidqLz43Di7SCoWWQb/eB6IfbitCMxIq1gaJlkW34f+iG3InRisWJtYCjZZJq+H7phN2H04nGh7Z/pGWTaPh86oPehtSIx4a3fqVllGb4e+uB34XVh8iFuH6mZZVk+XnrgOCE1obJhbl9p2WWYfl37H/gg9aFyoS6fKhll1/5du194YHXhMuDu3upZZhd+XXufOKA2IPMgrx7qWWZW/hz7nvjf9qCzYG9eqplmlj4cu965H/agc6BvnqrZZtW93DweeV+24HPgL95rGWcU/Zv8Hjmfd2A0H+/ea1lnVH1bvF353zdf9F/wHiuZZ5P9Gzxduh7337SfsF4r2WfTPJr8nXpet9+037Cd7BloOnw5+Dk0N/A2LHOobyRaYG18cHhxdHFwcKyuqKrkmmCpvKz4rnSusO3s7CjopNpg5zzq+Ow07LDsLSppJyUaYSV9KTkqtSsxaq1pKWXlWmFj/Wf5aXVp8WmtqCmk5Zphor2muah1qPHorecp5CXaYeG95fnntegyJ+4maiOmGmIgviT6JvYncicuZepi5lpiX75kOmY2ZvKmrqVqomaaYp7+o7qldqYype7k6uIm2mLd/uL65PblsyVvJGshpxpjHT8ieyR3JTMlL2PrYWdaY1x/Yftj92SzZK+jq6DnmmObv6F7o3ekc+Qv4yvgp9pj2v/g++M34/Pj8CLsIGgaZBpAIHwiuCO0I3BirGAoWmRZgF/8YjhjNGMwoiyf6JpkmMCffKH4ovTi8OHs3+jaZNgA3vzheOK1IrEhrR+pGmUXQR69ITkiNWJxYW1faVplVoFePWD5YfWiMaFtnymaZZWBnf2guaG1ofHhLd8p2mXUwd194DnhdeGyIO4e6hpmE8IdPh/6ITYhcmCuXupaZlLCXL5fumD2oTKgbp6qmmaRwpx+n3qgtqDy4G7eatpm0ILb/t864HbgsyAvHmsaZw7DG78e+yA3YLNf714rWmdNA1t/Xrtf92Bzn++eK5pnikOa/557n/fgM9+v3ivaZ8XD2r/eO9+33/QfcB3sGmgAAAAAEJOUzEFAQMCRm9aAkRJR0kgUElBTk8AAE5BSFVTSAAAAAAAAEAAAAAwIUAAAC0AAEBAAAAUAABDEwBAABQAX39cAF9/PgE8AgABbgV4CHgMeAAAAAAAAAABAP9A78DmQN/A2kDVwNJAz8DMQcrBx0HFwcRBwsHAQb/BvUG8wbtBusG4QbfBtkG1wbRCtMKzQrLCsUKwwq9Cr8KuQq3CrUKswqtCq8KqQqrDqUOow6hDp8OnQ6bDpkOlw6VDpMOkQ6TDo0Ojw6JDosOhRKHEoUSgxKBEn8SfRJ/EnkSexJ5EncSdRJ3EnEScxZxFm8WbRZvFmkWaxZpFmsWZRZnFmUWYxZhFmMWYRZfFl0aXxpdGlsaWRpbGlkaVxpVGlcaVRpTGlEaUxpRGlMeTR5PHk0eTx5JHkseSR5LHkkeRx5FHkceRR5HHkEeQyJBIkMiQSI/Ij0iPyI9Ij8iPSI7IjkiOyI5IjsiOSI3IjUmNyY1JjcmNSYzJjEmMyYxJjMmMSYvJi0mLyYtJi8mLSovKikqKyopKisqKSorKikqJyolKicqJSonKiUqJy4hLiMuIS4jLiEuIy4hLiMuHS4fLh0uHy4dLh8uHS4fMhkyGzIZMhsyGTIbMhkyGzIVMhcyFTIXMhUyFzIVMhcyFTYTNhE2EzYRNhM2ETYTNhE2EzYNNg82DTYPNg02DzYNOg86DToPOgk6CzoJOgs6CToLOgk6CzoJOgs6BToHPgU+Bz4FPgc+BT4HPgU+Bz4BPgM+AT4DPgE+Az4BPgM+AUIDQgFCA0H9Qf9B/UH/QAAAAAAAAQk5TMQUBAwKAfVoCU09GVCBLRVlTAAAATkFIVVNIAAAAAAAAQAAAAGRAQAABGwAAQEAAABQAAEBAFkAAFENff2kAX38+ATwCAAFuBXgIeAx4AAAAAAAAAAEA/0DvwOZA38DaQNXA0kDPwMxBysHHQcXBxEHCwcBBv8G9QbzBu0G6wbhBt8G2QbXBtEK0wrNCssKxQrDCr0Kvwq5CrcKtQqzCq0KrwqpCqsOpQ6jDqEOnw6dDpsOmQ6XDpUOkw6RDpMOjQ6PDokOiw6FEocShRKDEoESfxJ9En8SeRJ7EnkSdxJ1EncScRJzFnEWbxZtFm8WaRZrFmkWaxZlFmcWZRZjFmEWYxZhFl8WXRpfGl0aWxpZGlsaWRpXGlUaVxpVGlMaURpTGlEaUx5NHk8eTR5PHkkeSx5JHkseSR5HHkUeRx5FHkceQR5DIkEiQyJBIj8iPSI/Ij0iPyI9IjsiOSI7IjkiOyI5IjciNSY3JjUmNyY1JjMmMSYzJjEmMyYxJi8mLSYvJi0mLyYtKi8qKSorKikqKyopKisqKSonKiUqJyolKicqJSonLiEuIy4hLiMuIS4jLiEuIy4dLh8uHS4fLh0uHy4dLh8yGTIbMhkyGzIZMhsyGTIbMhUyFzIVMhcyFTIXMhUyFzIVNhM2ETYTNhE2EzYRNhM2ETYTNg02DzYNNg82DTYPNg06DzoNOg86CToLOgk6CzoJOgs6CToLOgk6CzoFOgc+BT4HPgU+Bz4FPgc+BT4HPgE+Az4BPgM+AT4DPgE+Az4BQgNCAUIDQf1B/0H9Qf9AAAAAAAABCTlMxBQIDAszYXARDSE9SRCBTVEFCAABOQUhVU0gAAAAAAABAAAAAZGBAAAMtAGQhQAADLQACMAAAQAAUFGoNXwBffz4BPAIAAW4FeAh4DHgAAAAAAAAAAQD/QO/A5kDfwNpA1cDSQM/AzEHKwcdBxcHEQcLBwEG/wb1BvMG7QbrBuEG3wbZBtcG0QrTCs0KywrFCsMKvQq/CrkKtwq1CrMKrQqvCqkKqw6lDqMOoQ6fDp0Omw6ZDpcOlQ6TDpEOkw6NDo8OiQ6LDoUShxKFEoMSgRJ/En0SfxJ5EnsSeRJ3EnUSdxJxEnMWcRZvFm0WbxZpFmsWaRZrFmUWZxZlFmMWYRZjFmEWXxZdGl8aXRpbGlkaWxpZGlcaVRpXGlUaUxpRGlMaURpTHk0eTx5NHk8eSR5LHkkeSx5JHkceRR5HHkUeRx5BHkMiQSJDIkEiPyI9Ij8iPSI/Ij0iOyI5IjsiOSI7IjkiNyI1JjcmNSY3JjUmMyYxJjMmMSYzJjEmLyYtJi8mLSYvJi0qLyopKisqKSorKikqKyopKicqJSonKiUqJyolKicuIS4jLiEuIy4hLiMuIS4jLh0uHy4dLh8uHS4fLh0uHzIZMhsyGTIbMhkyGzIZMhsyFTIXMhUyFzIVMhcyFTIXMhU2EzYRNhM2ETYTNhE2EzYRNhM2DTYPNg02DzYNNg82DToPOg06DzoJOgs6CToLOgk6CzoJOgs6CToLOgU6Bz4FPgc+BT4HPgU+Bz4FPgc+AT4DPgE+Az4BPgM+AT4DPgFCA0IBQgNB/UH/Qf1B/0AEA/0DvwOZA38DaQNXA0kDPwMxBysHHQcXBxEHCwcBBv8G9QbzBu0G6wbhBt8G2QbXBtEK0wrNCssKxQrDCr0Kvwq5CrcKtQqzCq0KrwqpCqsOpQ6jDqEOnw6dDpsOmQ6XDpUOkw6RDpMOjQ6PDokOiw6FEocShRKDEoESfxJ9En8SeRJ7EnkSdxJ1EncScRJzFnEWbxZtFm8WaRZrFmkWaxZlFmcWZRZjFmEWYxZhFl8WXRpfGl0aWxpZGlsaWRpXGlUaVxpVGlMaURpTGlEaUx5NHk8eTR5PHkkeSx5JHkseSR5HHkUeRx5FHkceQR5DIkEiQyJBIj8iPSI/Ij0iPyI9IjsiOSI7IjkiOyI5IjciNSY3JjUmNyY1JjMmMSYzJjEmMyYxJi8mLSYvJi0mLyYtKi8qKSorKikqKyopKisqKSonKiUqJyolKicqJSonLiEuIy4hLiMuIS4jLiEuIy4dLh8uHS4fLh0uHy4dLh8yGTIbMhkyGzIZMhsyGTIbMhUyFzIVMhcyFTIXMhUyFzIVNhM2ETYTNhE2EzYRNhM2ETYTNg02DzYNNg82DTYPNg06DzoNOg86CToLOgk6CzoJOgs6CToLOgk6CzoFOgc+BT4HPgU+Bz4FPgc+BT4HPgE+Az4BPgM+AT4DPgE+Az4BQgNCAUIDQf1B/0H9Qf9AAAAAAQk5TMQUCAgKdSFwSQkFDSyBLRVlTAAAATVhNRlJQUgAAAAAAQAAARGRAQAAALQBTQEAoARIAAyEAAEA5FABffz4AUwA+ATwCAAFuBXgIeAx4AAAAAAAAAAEA/0DvwOZA38DaQNXA0kDPwMxBysHHQcXBxEHCwcBBv8G9QbzBu0G6wbhBt8G2QbXBtEK0wrNCssKxQrDCr0Kvwq5CrcKtQqzCq0KrwqpCqsOpQ6jDqEOnw6dDpsOmQ6XDpUOkw6RDpMOjQ6PDokOiw6FEocShRKDEoESfxJ9En8SeRJ7EnkSdxJ1EncScRJzFnEWbxZtFm8WaRZrFmkWaxZlFmcWZRZjFmEWYxZhFl8WXRpfGl0aWxpZGlsaWRpXGlUaVxpVGlMaURpTGlEaUxpNHk8eTR5PHkkeSx5JHkseSR5HHkUeRx5FHkceQR5DIkEiQyJBIj8iPSI/Ij0iPyI9IjsiOSI7IjkiOyI5IjciNSY3JjUmNyY1JjMmMSYzJjEmMyYxJi8mLSYvJi0mLyYtKi8qKSorKikqKyopKisqKSonKiUqJyolKicqJSonKiEuIy4hLiMuIS4jLiEuIy4dLh8uHS4fLh0uHy4dLh8uGTIbMhkyGzIZMhsyGTIbMhUyFzIVMhcyFTIXMhUyFzIVNhM2ETYTNhE2EzYRNhM2ETYTNg02DzYNNg82DTYPNg06DzoNOg86CToLOgk6CzoJOgs6CToLOgk6CzoFOgc6BT4HPgU+Bz4FPgc+BT4HPgE+Az4BPgM+AT4DPgE+Az4BQgNCAUIDQf1B/0H9Qf9AIAPnAAP0AlwCDAA4ABQCgAJwArQC+ABgAgwCoAN8AcwCPAA8ADQDPAKsAuQCRAI0AAAA+AA4AewAvABcAhQC/AD0ASQAvANMAsgCPAO0AHwDCAKIA9AA/AJEA1wCtAGAA/gCZANIAVQAkAEwAWgC1APYAOgCqAMQAYQBOAJMA+wBmAMMAOwCrACYARQDHANUA3gB6AIoALAB9AH0A2gDdAG0AVgDlAM0AtgA+ACYAlAC2ANMAfQBWAPgAEQD2AMcACQC+ANoASQAEADgAhAC/ADQAHQBbAF8AGgC3AFMAMQBCAFIAzABgAFMA4gArAGYAAADLAFwANQDaAM0A3gA6APwAvgC2AD0AmwC8AKEAswDEADoAyADqAN8AuACeAJIAiAA+AN0ArAADAD0ApgDKAK0AswCWAA8AUwCsAMoAoQDeADQABwClAPQAvgA8AF4AEwA+AA0ApwAaAAMAqQBVADkAzwBgADUAbgCbAK4AywAPAE8AfAAJACoAcgCmABQArQCMAIAASgCxAEcAwAARAAoAegB/AKcAewBQAJUAEAASABsAzABiACAAjQCHABkAigClAGUAyQCHADsAYgCkAIAAMQACABUAdwCtAJ4AKAA9AKkAJABiAKEAMACOAMQAbQA7ALUAwwBPADoAGwCnAO0AMQA/AKQA2gDaAIAAyABh/cANgdbAABO2wACAbUEAWGLCAIFYQgA3UcMAgUpDADxExACCP0QAOzrEAIM2RQBDMsUAgy9GAEMrxgCDKEYAOyXHAIMjRwBBIMgAhB5IAEMbyACEGUkATBfJAIUVSgA+E8oAhRFLAEAQywCGDksASAzMAIYLTABLCc0AhwhNAEkGzQCHBU4APwDOAIgATwBLAM8AiABQAEgA0ACJAFAASwDRAIgAUQBLANIAigBSAEUA0gCJAFMASgDTAIoAVABKANQAigBVAEcA1QCLAFUAUADWAIoAVgBBANcAiwBXAEYA1wCNAFgAQgDYAIwAWQBTANkAiwBaAEsA2gCOAFoAQADbAI8AWwBaANwAkwBcAFoA3ACNAF0AVADdAI8AXgBPAN4AjgBfAFIA3wCSAF8ARQDgAI8AYABUAOEAkQBhAFwA4gCQAGIAUwDiAJoAYwBWAOMAlQBkAF4A5ACMAGQAWADlAJEAZQBKAOYAkgBmAEoA5wCQAGcAXQDnAJ0AaAAqAOgAmABpAFYA6QCXAGkASwDqAJMAagBDAOsAjwBrAEoA7ACVAGwAUwDsAJgAbQBRAO0AkQBuAGoA7gCXAG8ARgDvAJUAbwBPAPAAjABwAFYA8QCVAHEAbQDxAJ4AcgBJAPIAoABzAFMA8wCMAHQAXQD0AJUAdAByAPUArwB1AHzzwMJAeEiyQLjBqECXwKJBpsGdQZLAmEGcwZVBjsCSQZTBj0GJwY1Bj8KKQYbBiEGKwoZCg8GFQobCg0KAwYJCg8KAQn3Cf0KAw35Ce8J8Qn7De0N5wnpDe8N5Q3fCeEN5w3dDdcN2Q3fEdkN0w3VDdsR0RHLDc0R0xHJEccNyRHLEcURvxHBEccVwRG7Eb0VwxW5FbcRuRW7FbUVsxGxFbcVsRWvFa0VsxmtFasVqRmvGakZpxWlGasZpRmjFaEZpxmhGZ8ZnRmjHZ0ZmxmZHZ8dmR2XGZkdmx2VHZMZlR2XHZEdkx2RHZMhkR2PHY0hkyGNIYsdiSGPIYkhhx2JIYshhSGHIYUhhyWFIYMhgSWHJYElfyGBJYMlfSV/IX0lfyV9JXsleSV/KXkleyV5KXspdSl3JXUpdyl1KXMldSl3KXEpcylxKXMtcSlvKXEtcy1tLW8pbS1vLW0tay1pLW8taS1rLWktazFpLWctZTFrMWUxZy1lMWcxZTFjMWExZzFhMWMxYTFjNWExXzFhNWM1XTVfMV01XzVdNV81XTVfNVk1WzVZNVs5WTVbNVk5WzlZOVc1VTlbOVU5VzlVOVc5VTlXOVU5Vz1ROVM5UT1TPVE9UzlRPVM9UT1PPVE9Uz1NPU89TT1PQU09Tz1NQU9BTUFLPUlBT0FJQUtBSUPfA0kDewMJA0sC4QMrAskHEwa1BwMGoQbzBpUG4waJBtsGfQbPBnUGxwZpBr8GYQq3Cl0KrwpVCqcKTQqjCkkKmwpBCpcKPQqTCjkKiwo1CocOLQ6DDikOfw4lDnsOIQ53Dh0Ocw4ZDm8OGQ5rDhUOaxIREmcSDRJjEgkSXxIJEl8SBRJbEgESVxIBElcR/RJTFfkWTxX5Fk8V9RZLFfUWRxXxFkcV7RZDFe0WQxXpGj8Z6Ro/GeUaOxnlGjsZ4Ro3GeEaNxndGjMZ3RozGd0eMx3ZHi8d2R4vHdUeKx3VHisd0R4nHdEeJx3RHicdzR4jIc0iIyHJIiMhySIfIckiHyHFIhshxSIbIcUiGyHBIhclwSYXJcEmFyW9JhMlvSYTJb0mEyW5JhMluSYPJbkmDym5Kg8ptSoLKbUqCym1KgspsSoHKbEqBymxKgcpsS4HLa0uAy2tLgMtrS4DLa0uAy2pLf8tqS3/Lakt/y2pMf8xpTH7MaUx+zGlMfsxpTH7MaEx9zGhMfcxoTH3MaEx9zWdNfc1nTXzNZ018zWdNfM1nTXzNZk17zWZNe81mTXvOZk57zmVOe85lTnrOZU56zmVOes5lTnrOZU56zmROec9kT3nPZE95z2RPec9kT3nPY095z2NPeM9jT3jPY1B40GNQeNBiUHjQYlB30GJQ/8AAqebAAEfawAC70sAAQMzBAEvHwQDAxMEAwMDBAK29wQDAu8EA+rjBAEC2wQATtMIAs7PC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ANIAVQAkAEwAWgC1APYAOgCqAMQAYQBOAJMA+wBmAMMAOwCrACYARQDHANUA3gB6AIoALAB9AH0A2gDdAG0AVgDlAM0AtgA+ACYAlAC2ANMAfQBWAPgAEQD2AMcACQC+ANoASQAEADgAhAC/ADQAHQBbAF8AGgC3AFMAMQBCAFIAzABgAFMA4gArAGYAAADLAFwANQDaAM0A3gA6APwAvgC2AD0AmwC8AKEAswDEADoAyADqAN8AuACeAJIAiAA+AN0ArAADAD0ApgDKAK0AswCWAA8AUwCsAMoAoQDeADQABwClAPQAvgA8AF4AEwA+AA0ApwAaAAMAqQBVADkAzwBgADUAbgCbAK4AywAPAE8AfAAJACoAcgCmABQArQCMAIAASgCxAEcAwAARAAoAegB/AKcAewBQAJUAEAASABsAzABiACAAjQCHABkAigClAGUAyQCHADsAYgCkAIAAMQACABUAdwCtAJ4AKAA9AKkAJABiAKEAMACOAMQAbQA7ALUAwwBPADoAGwCnAO0AMQA/AKQA2gDaAIAAyABh/cANgdbAABO2wACAbUEAWGLCAIFYQgA3UcMAgUpDADxExACCP0QAOzrEAIM2RQBDMsUAgy9GAEMrxgCDKEYAOyXHAIMjRwBBIMgAhB5IAEMbyACEGUkATBfJAIUVSgA+E8oAhRFLAEAQywCGDksASAzMAIYLTABLCc0AhwhNAEkGzQCHBU4APwDOAIgATwBLAM8AiABQAEgA0ACJAFAASwDRAIgAUQBLANIAigBSAEUA0gCJAFMASgDTAIoAVABKANQAigBVAEcA1QCLAFUAUADWAIoAVgBBANcAiwBXAEYA1wCNAFgAQgDYAIwAWQBTANkAiwBaAEsA2gCOAFoAQADbAI8AWwBaANwAkwBcAFoA3ACNAF0AVADdAI8AXgBPAN4AjgBfAFIA3wCSAF8ARQDgAI8AYABUAOEAkQBhAFwA4gCQAGIAUwDiAJoAYwBWAOMAlQBkAF4A5ACMAGQAWADlAJEAZQBKAOYAkgBmAEoA5wCQAGcAXQDnAJ0AaAAqAOgAmABpAFYA6QCXAGkASwDqAJMAagBDAOsAjwBrAEoA7ACVAGwAUwDsAJgAbQBRAO0AkQBuAGoA7gCXAG8ARgDvAJUAbwBPAPAAjABwAFYA8QCVAHEAbQDxAJ4AcgBJAPIAoABzAFMA8wCMAHQAXQD0AJUAdAByAPUArwB1AHzzwMJAeEiyQLjBqECXwKJBpsGdQZLAmEGcwZVBjsCSQZTBj0GJwY1Bj8KKQYbBiEGKwoZCg8GFQobCg0KAwYJCg8KAQn3Cf0KAw35Ce8J8Qn7De0N5wnpDe8N5Q3fCeEN5w3dDdcN2Q3fEdkN0w3VDdsR0RHLDc0R0xHJEccNyRHLEcURvxHBEccVwRG7Eb0VwxW5FbcRuRW7FbUVsxGxFbcVsRWvFa0VsxmtFasVqRmvGakZpxWlGasZpRmjFaEZpxmhGZ8ZnRmjHZ0ZmxmZHZ8dmR2XGZkdmx2VHZMZlR2XHZEdkx2RHZMhkR2PHY0hkyGNIYsdiSGPIYkhhx2JIYshhSGHIYUhhyWFIYMhgSWHJYElfyGBJYMlfSV/IX0lfyV9JXsleSV/KXkleyV5KXspdSl3JXUpdyl1KXMldSl3KXEpcylxKXMtcSlvKXEtcy1tLW8pbS1vLW0tay1pLW8taS1rLWktazFpLWctZTFrMWUxZy1lMWcxZTFjMWExZzFhMWMxYTFjNWExXzFhNWM1XTVfMV01XzVdNV81XTVfNVk1WzVZNVs5WTVbNVk5WzlZOVc1VTlbOVU5VzlVOVc5VTlXOVU5Vz1ROVM5UT1TPVE9UzlRPVM9UT1PPVE9Uz1NPU89TT1PQU09Tz1NQU9BTUFLPUlBT0FJQUtBSUPfA0kDewMJA0sC4QMrAskHEwa1BwMGoQbzBpUG4waJBtsGfQbPBnUGxwZpBr8GYQq3Cl0KrwpVCqcKTQqjCkkKmwpBCpcKPQqTCjkKiwo1CocOLQ6DDikOfw4lDnsOIQ53Dh0Ocw4ZDm8OGQ5rDhUOaxIREmcSDRJjEgkSXxIJEl8SBRJbEgESVxIBElcR/RJTFfkWTxX5Fk8V9RZLFfUWRxXxFkcV7RZDFe0WQxXpGj8Z6Ro/GeUaOxnlGjsZ4Ro3GeEaNxndGjMZ3RozGd0eMx3ZHi8d2R4vHdUeKx3VHisd0R4nHdEeJx3RHicdzR4jIc0iIyHJIiMhySIfIckiHyHFIhshxSIbIcUiGyHBIhclwSYXJcEmFyW9JhMlvSYTJb0mEyW5JhMluSYPJbkmDym5Kg8ptSoLKbUqCym1KgspsSoHKbEqBymxKgcpsS4HLa0uAy2tLgMtrS4DLa0uAy2pLf8tqS3/L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AD8AzgCIAE8ASwDPAIgAUABIANAAiQBQAEsA0QCIAFEASwDSAIoAUgBFANIAiQBTAEoA0wCKAFQASgDUAIoAVQBHANUAiwBVAFAA1gCKAFYAQQDXAIsAVwBGANcAjQBYAEIA2ACMAFkAUwDZAIsAWgBLANoAjgBaAEAA2wCPAFsAWgDcAJMAXABaANwAjQBdAFQA3QCPAF4ATwDeAI4AXwBSAN8AkgBfAEUA4ACPAGAAVADhAJEAYQBcAOIAkABiAFMA4gCaAGMAVgDjAJUAZABeAOQAjABkAFgA5QCRAGUASgDmAJIAZgBKAOcAkABnAF0A5wCdAGgAKgDoAJgAaQBWAOkAlwBpAEsA6gCTAGoAQwDrAI8AawBKAOwAlQBsAFMA7ACYAG0AUQDtAJEAbgBqAO4AlwBvAEYA7wCVAG8ATwDwAIwAcABWAPEAlQBxAG0A8QCeAHIASQDyAKAAcwBTAPMAjAB0AF0A9ACVAHQAcgD1AK8AdQB888DCQHhIskC4wahAl8CiQabBnUGSwJhBnMGVQY7AkkGUwY9BicGNQY/CikGGwYhBisKGQoPBhUKGwoNCgMGCQoPCgEJ9wn9CgMN+QnvCfEJ+w3tDecJ6Q3vDeUN3wnhDecN3Q3XDdkN3xHZDdMN1Q3bEdERyw3NEdMRyRHHDckRyxHFEb8RwRHHFcERuxG9FcMVuRW3EbkVuxW1FbMRsRW3FbEVrxWtFbMZrRWrFakZrxmpGacVpRmrGaUZoxWhGacZoRmfGZ0Zox2dGZsZmR2fHZkdlxmZHZsdlR2TGZUdlx2RHZMdkR2TIZEdjx2NIZMhjSGLHYkhjyGJIYcdiSGLIYUhhyGFIYclhSGDIYElhyWBJX8hgSWDJX0lfyF9JX8lfSV7JXklfyl5JXsleSl7KXUpdyV1KXcpdSlzJXUpdylxKXMpcSlzLXEpbylxLXMtbS1vKW0tby1tLWstaS1vLWktay1pLWsxaS1nLWUxazFlMWctZTFnMWUxYzFhMWcxYTFjMWExYzVhMV8xYTVjNV01XzFdNV81XTVfNV01XzVZNVs1WTVbOVk1WzVZOVs5WTlXNVU5WzlVOVc5VTlXOVU5VzlVOVc9UTlTOVE9Uz1RPVM5UT1TPVE9Tz1RPVM9TT1PPU09T0FNPU89TUFPQU1BSz1JQU9BSUFLQUlD3wNJA3sDCQNLA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ABcAhQC/AD0ASQAvANMAsgCPAO0AHwDCAKIA9AA/AJEA1wCtAGAA/gCZANIAVQAkAEwAWgC1APYAOgCqAMQAYQBOAJMA+wBmAMMAOwCrACYARQDHANUA3gB6AIoALAB9AH0A2gDdAG0AVgDlAM0AtgA+ACYAlAC2ANMAfQBWAPgAEQD2AMcACQC+ANoASQAEADgAhAC/ADQAHQBbAF8AGgC3AFMAMQBCAFIAzABgAFMA4gArAGYAAADLAFwANQDaAM0A3gA6APwAvgC2AD0AmwC8AKEAswDEADoAyADqAN8AuACeAJIAiAA+AN0ArAADAD0ApgDKAK0AswCWAA8AUwCsAMoAoQDeADQABwClAPQAvgA8AF4AEwA+AA0ApwAaAAMAqQBVADkAzwBgADUAbgCbAK4AywAPAE8AfAAJACoAcgCmABQArQCMAIAASgCxAEcAwAARAAoAegB/AKcAewBQAJUAEAASABsAzABiACAAjQCHABkAigClAGUAyQCHADsAYgCkAIAAMQACABUAdwCtAJ4AKAA9AKkAJABiAKEAMACOAMQAbQA7ALUAwwBPADoAGwCnAO0AMQA/AKQA2gDaAIAAyABh/cANgdbAABO2wACAbUEAWGLCAIFYQgA3UcMAgUpDADxExACCP0QAOzrEAIM2RQBDMsUAgy9GAEMrxgCDKEYAOyXHAIMjRwBBIMgAhB5IAEMbyACEGUkATBfJAIUVSgA+E8oAhRFLAEAQywCGDksASAzMAIYLTABLCc0AhwhNAEkGzQCHBU4APwDOAIgATwBLAM8AiABQAEgA0ACJAFAASwDRAIgAUQBLANIAigBSAEUA0gCJAFMASgDTAIoAVABKANQAigBVAEcA1QCLAFUAUADWAIoAVgBBANcAiwBXAEYA1wCNAFgAQgDYAIwAWQBTANkAiwBaAEsA2gCOAFoAQADbAI8AWwBaANwAkwBcAFoA3ACNAF0AVADdAI8AXgBPAN4AjgBfAFIA3wCSAF8ARQDgAI8AYABUAOEAkQBhAFwA4gCQAGIAUwDiAJoAYwBWAOMAlQBkAF4A5ACMAGQAWADlAJEAZQBKAOYAkgBmAEoA5wCQAGcAXQDnAJ0AaAAqAOgAmABpAFYA6QCXAGkASwDqAJMAagBDAOsAjwBrAEoA7ACVAGwAUwDsAJgAbQBRAO0AkQBuAGoA7gCXAG8ARgDvAJUAbwBPAPAAjABwAFYA8QCVAHEAbQDxAJ4AcgBJAPIAoABzAFMA8wCMAHQAXQD0AJUAdAByAPUArwB1AHzzwMJAeEiyQLjBqECXwKJBpsGdQZLAmEGcwZVBjsCSQZTBj0GJwY1Bj8KKQYbBiEGKwoZCg8GFQobCg0KAwYJCg8KAQn3Cf0KAw35Ce8J8Qn7De0N5wnpDe8N5Q3fCeEN5w3dDdcN2Q3fEdkN0w3VDdsR0RHLDc0R0xHJEccNyRHLEcURvxHBEccVwRG7Eb0VwxW5FbcRuRW7FbUVsxGxFbcVsRWvFa0VsxmtFasVqRmvGakZpxWlGasZpRmjFaEZpxmhGZ8ZnRmjHZ0ZmxmZHZ8dmR2XGZkdmx2VHZMZlR2XHZEdkx2RHZMhkR2PHY0hkyGNIYsdiSGPIYkhhx2JIYshhSGHIYUhhyWFIYMhgSWHJYElfyGBJYMlfSV/IX0lfyV9JXsleSV/KXkleyV5KXspdSl3JXUpdyl1KXMldSl3KXEpcylxKXMtcSlvKXEtcy1tLW8pbS1vLW0tay1pLW8taS1rLWktazFpLWctZTFrMWUxZy1lMWcxZTFjMWExZzFhMWMxYTFjNWExXzFhNWM1XTVfMV01XzVdNV81XTVfNVk1WzVZNVs5WTVbNVk5WzlZOVc1VTlbOVU5VzlVOVc5VTlXOVU5Vz1ROVM5UT1TPVE9UzlRPVM9UT1PPVE9Uz1NPU89TT1PQU09Tz1NQU9BTUFLPUlBT0FJQUtBSUPfA0kDewMJA0sC4QMrAskHEwa1BwMGoQbzBpUG4waJBtsGfQbPBnUGxwZpBr8GYQq3Cl0KrwpVCqcKTQqjCkkKmwpBCpcKPQqTCjkKiwo1CocOLQ6DDikOfw4lDnsOIQ53Dh0Ocw4ZDm8OGQ5rDhUOaxIREmcSDRJjEgkSXxIJEl8SBRJbEgESVxIBElcR/RJTFfkWTxX5Fk8V9RZLFfUWRxXxFkcV7RZDFe0WQxXpGj8Z6Ro/GeUaOxnlGjsZ4Ro3GeEaNxndGjMZ3RozGd0eMx3ZHi8d2R4vHdUeKx3VHisd0R4nHdEeJx3RHicdzR4jIc0iIyHJIiMhySIfIckiHyHFIhshxSIbIcUiGyHBIhclwSYXJcEmFyW9JhMlvSYTJb0mEyW5JhMluSYPJbkmDym5Kg8ptSoLKbUqCym1KgspsSoHKbEqBymxKgcpsS4HLa0uAy2tLgMtrS4DLa0uAy2pLf8tqS3/Lakt/y2pMf8xpTH7MaUx+zGlMfsxpTH7MaEx9zGhMfcxoTH3MaEx9zWdNfc1nTXzNZ018zWdNfM1nTXzNZk17zWZNe81mTXvOZk57zmVOe85lTnrOZU56zmVOes5lTnrOZU56zmROec9kT3nPZE95z2RPec9kT3nPY095z2NPeM9jT3jPY1B40GNQeNBiUHjQYlB30GJQ/8AAqebAAEfawAC70sAAQMzBAEvHwQDAxMEAwMDBAK29wQDAu8EA+rjBAEC2wQATtMIAs7PCAECxwgBAr8IAQK7CACitwgC9q8IAU6rCAMOpwwBoqMMAQKfDAECmwwAApcMAwKTDAMCjwwDKosMAQKHEAAChxABAoMQAQJ/EAACexABAnsQAAJ3EAECcxABAnMUAxZvFAACaxQAAmsUAAJnFAMCZxQAAmMUAIJjFAACXxgBAl8YAAJbGAACWxgAAlcYAAJXGAACUxgAAlMYAAJPHAECTxwAAkscAwJLHAACSxwAAkccAAJHHAACQxwAAkMgAQJDIAACPyADAj8gAAI/IANOOyAAAjsgAAI7IAACNyQAAjckAAI3JANOMyQAAjMkAAIzJAACLyQAAi8kAAIvKAACKygAAisoAAIrKAACKygAgicoAAInKAACJygAAiMsAAIjLAACIywAAiMsAAIfLAACHywAAh8sAAIfLAACGzAAAhswAAIbMAACGzAAAhcwAAIXMAACFzAAAhcwAAIXNAACEzQAAhM0AAITNAACEzQAAg80AAIPNAACDzQAAg84AAIPOAACCzgAAgs4AAILOAACCzgAAgs4AAIHOAACBzwAAgc8AAIHPAACBzwAAgM8AAIDPAACAzwAAgM8AAIDQAACA0AAAf9AAAH/QAAD41efA3qsAQtPVzsDLqwC2xdbCwcCsAMC81rrBuawAwLbWtcG0rABhsdawwa+sAMCt16zCq60AQKrXqcKorQBtp9emwqWtAECk16PCo60A8qLYocOhrgAAoNifw5+uAECe2J3Dna4ALZzYm8ObrgBTmtmZxJmvAECZ2ZjEmK8AAJfZlsSWrwBAltmVxJWvAECV2pTFlLAAQJPak8WTsABAktqRxZKwAACR2pDFkLAAYJDbj8aPsQD1j9uOxo6xAACO243GjbEAAI3bjMaNsQDAjNyMx4yyAACL3IvHi7IAAIrciseKsgBAityJx4myAACJ3YjIibMAQIjdiMiIswAAh92HyIezAACH3YbIhrMAAIbehsmGtAAAhd6FyYW0AACF3oTJhLQAwITehMmEtAAAhN+DyoO1AMCD34LKg7UAAILfgsqCtQAAgt+ByoK1AACB4IHLgbYAAIHggMuAtgAAgOCAy4C2AACA4H/Lf7YAAH/hf8x/twAAf+F+zH+3AAB+4X7MfrcAAH7hfcx+twAAfeJ9zX24AAB94nzNfbgAAHzifM18uAAAfOJ8zXy4AAB843vOe7kAAHvje857uQAAe+N6znu5AAB643rOerkAAHrkes96ugAAeuR5z3q6AAB55HnPeboAAHnkec95ugAAeeV40Hi7AAB45XjQeLsAAOvs59rhzNvA1rXOpr6UZYG47cLbw83CwcC2u6etlWWCqO603LbOtsO1t7CopJZlg5/vq92uz67DrbipqZ6XZYSY76TeqNCoxai5pKqZmGWFkvCf36PRpMWjuqCrlZllho3xm+Cf0aDHoLudrJKZZYeJ8pfgm9KdyJ28mq2PmmWIhfKU4ZjTmsiavZetjZtliYLzkeKV1JfKl76VroucZYp/9I7jk9WVypW/k6+JnWWLfPSM5JHWk8yTwJGwh55ljHn1ieSO15HMkcGPsYafZY129ofljNiPzZDCjrKEoGWOdPaF5ovZjc+Owoyzg6Blj3H3g+eJ2ovPjcOLtIKhZZBv94Hoh9uK0IzEirWBomWRbfh/6IbcidGKxYm1gKNlkmr4fumE3YfTicaHtn+kZZNo+Hzqg96G1IjHhrd+pWWUZvh764HfhdWHyIW4fqZllWT5eeuA4ITWhsmFuX2nZZZh+Xfsf+CD1oXKhLp8qGWXX/l27X3hgdeEy4O7e6llmF35de584oDYg8yCvHupZZlb+HPue+N/2oLNgb16qmWaWPhy73rkf9qBzoG+eqtlm1b3cPB55X7bgc+Av3msZZxT9m/weOZ93YDQf795rWWdUfVu8XfnfN1/0X/AeK5lnk/0bPF26HvfftJ+wXivZZ9M8mvydel6337TfsJ3sGWg6fDn4OTQ38DYsc6hvJFpgbXxweHF0cXBwrK6oquSaYKm8rPiudK6w7ezsKOik2mDnPOr47DTssOwtKmknJRphJX0pOSq1KzFqrWkpZeVaYWP9Z/lpdWnxaa2oKaTlmmGivaa5qHWo8eit5ynkJdph4b3l+ee16DIn7iZqI6YaYiC+JPom9idyJy5l6mLmWmJfvmQ6ZjZm8qaupWqiZppinv6juqV2pjKl7uTq4ibaYt3+4vrk9uWzJW8kayGnGmMdPyJ7JHclMyUvY+thZ1pjXH9h+2P3ZLNkr6OroOeaY5u/oXujd6Rz5C/jK+Cn2mPa/+D74zfj8+PwIuwgaBpkGkAgfCK4I7QjcGKsYChaZFmAX/xiOGM0YzCiLJ/ommSYwJ98ofii9OLw4ezf6Npk2ADe/OF44rUisSGtH6kaZRdBHr0hOSI1YnFhbV9pWmVWgV49YPlh9aIxoW2fKZpllYGd/aC5obWh8eEt3ynaZdTB3X3gOeF14bIg7h7qGmYTwh0+H/ohNiFyYK5e6lpmUsJcvl+6YPahMqBunqqaZpHCnH6feqC2oPLgbt5q2mbQgtv+3zrgduCzIC8eaxpnDsMbvx77IDdgs1/vXitaZ00DW39eu1/3YHOf754rmmeKQ5r/nnuf9+Az36/eK9pnxcPav94737ff9B9wHewaaAIAPjAAKwAXAA8AP6nwAAyANgAdJ/AAOuswLCvm8AAPgBPlrcAzgCdAAIA9wCFAD8A5QCuADkAOADJANoAMgCIAIgAFQDjAKcAAAAvADwAMQDOAKkA4AAgAHsApQBAANAAXgA/AOcAAQCLAHMALwC0AK8AKABfAJ8AXQAlAPwAqwC4ACIATADgANEARgA5AKgAmgCGAD0AEwDAAIYABgCcAHsAKgALANEAswBRAFUAtQDfACQAOwBeAAIA9QAwADwAvwCvAMEANgA7AIQAHgAYACQAMABMAHEAngDBABAAEACFAEwAygCDAEUA2QCkAFcAzwCyAFIAOgAWANAArgAkAC4AoQC5AEYAFQDOAGAAJQDvAHsAkQDtAFYAlACxACwARACSAIEAMgDqAFcATwDkALsAmgBNAEoAgQDTAM0AzwA4ADMALwCfAD4AvQB2AH8AvwAmABkArgBMAAUAuQA8AAkAygAlABcAegCMAIkArwAdABAAvgD7AGIAgQDmAH0AWAACAM4A7AC6AF4ARAAFABEATADvAIwAqAAcAFMAbwDmAAAA/gCwAIsAEwBWAPgAtQDiAEUA1wAsAFIAQQBbANUABwCAAMQA2gB5ADYAMwBEAKsAKQCTAKcANwAnAN4AtQBNAN4AyADcACwAXwBSAHkArgDfAMQAlQDQADQAWgCf/cANgdbAABO2wACAbUEAWGLCAIFYQgA3UcMAgUpDADxExACCP0QAOzrEAIM2RQBDMsUAgy9GAEMrxgCDKEYAOyXHAIMjRwBBIMgAhB5IAEMbyACEGUkATBfJAIUVSgA+E8oAhRFLAEAQywCGDksASAzMAIYLTABLCc0AhwhNAEkGzQCHBU4APwDOAIgATwBLAM8AiABQAEgA0ACJAFAASwDRAIgAUQBLANIAigBSAEUA0gCJAFMASgDTAIoAVABKANQAigBVAEcA1QCLAFUAUADWAIoAVgBBANcAiwBXAEYA1wCNAFgAQgDYAIwAWQBTANkAiwBaAEsA2gCOAFoAQADbAI8AWwBaANwAkwBcAFoA3ACNAF0AVADdAI8AXgBPAN4AjgBfAFIA3wCSAF8ARQDgAI8AYABUAOEAkQBhAFwA4gCQAGIAUwDiAJoAYwBWAOMAlQBkAF4A5ACMAGQAWADlAJEAZQBKAOYAkgBmAEoA5wCQAGcAXQDnAJ0AaAAqAOgAmABpAFYA6QCXAGkASwDqAJMAagBDAOsAjwBrAEoA7ACVAGwAUwDsAJgAbQBRAO0AkQBuAGoA7gCXAG8ARgDvAJUAbwBPAPAAjABwAFYA8QCVAHEAbQDxAJ4AcgBJAPIAoABzAFMA8wCMAHQAXQD0AJUAdAByAPUArwB1AHzzwMJAeEiyQLjBqECXwKJBpsGdQZLAmEGcwZVBjsCSQZTBj0GJwY1Bj8KKQYbBiEGKwoZCg8GFQobCg0KAwYJCg8KAQn3Cf0KAw35Ce8J8Qn7De0N5wnpDe8N5Q3fCeEN5w3dDdcN2Q3fEdkN0w3VDdsR0RHLDc0R0xHJEccNyRHLEcURvxHBEccVwRG7Eb0VwxW5FbcRuRW7FbUVsxGxFbcVsRWvFa0VsxmtFasVqRmvGakZpxWlGasZpRmjFaEZpxmhGZ8ZnRmjHZ0ZmxmZHZ8dmR2XGZkdmx2VHZMZlR2XHZEdkx2RHZMhkR2PHY0hkyGNIYsdiSGPIYkhhx2JIYshhSGHIYUhhyWFIYMhgSWHJYElfyGBJYMlfSV/IX0lfyV9JXsleSV/KXkleyV5KXspdSl3JXUpdyl1KXMldSl3KXEpcylxKXMtcSlvKXEtcy1tLW8pbS1vLW0tay1pLW8taS1rLWktazFpLWctZTFrMWUxZy1lMWcxZTFjMWExZzFhMWMxYTFjNWExXzFhNWM1XTVfMV01XzVdNV81XTVfNVk1WzVZNVs5WTVbNVk5WzlZOVc1VTlbOVU5VzlVOVc5VTlXOVU5Vz1ROVM5UT1TPVE9UzlRPVM9UT1PPVE9Uz1NPU89TT1PQU09Tz1NQU9BTUFLPUlBT0FJQUtBSUPfA0kDewMJA0sC4QMrAskHEwa1BwMGoQbzBpUG4waJBtsGfQbPBnUGxwZpBr8GYQq3Cl0KrwpVCqcKTQqjCkkKmwpBCpcKPQqTCjkKiwo1CocOLQ6DDikOfw4lDnsOIQ53Dh0Ocw4ZDm8OGQ5rDhUOaxIREmcSDRJjEgkSXxIJEl8SBRJbEgESVxIBElcR/RJTFfkWTxX5Fk8V9RZLFfUWRxXxFkcV7RZDFe0WQxXpGj8Z6Ro/GeUaOxnlGjsZ4Ro3GeEaNxndGjMZ3RozGd0eMx3ZHi8d2R4vHdUeKx3VHisd0R4nHdEeJx3RHicdzR4jIc0iIyHJIiMhySIfIckiHyHFIhshxSIbIcUiGyHBIhclwSYXJcEmFyW9JhMlvSYTJb0mEyW5JhMluSYPJbkmDym5Kg8ptSoLKbUqCym1KgspsSoHKbEqBymxKgcpsS4HLa0uAy2tLgMtrS4DLa0uAy2pLf8tqS3/Lakt/y2pMf8xpTH7MaUx+zGlMfsxpTH7MaEx9zGhMfcxoTH3MaEx9zWdNfc1nTXzNZ018zWdNfM1nTXzNZk17zWZNe81mTXvOZk57zmVOe85lTnrOZU56zmVOes5lTnrOZU56zmROec9kT3nPZE95z2RPec9kT3nPY095z2NPeM9jT3jPY1B40GNQeNBiUHjQYlB30GJQ/8AAqebAAEfawAC70sAAQMzBAEvHwQDAxMEAwMDBAK29wQDAu8EA+rjBAEC2wQATtMIAs7PCAECxwgBAr8IAQK7CACitwgC9q8IAU6rCAMOpwwBoqMMAQKfDAECmwwAApcMAwKTDAMCjwwDKosMAQKHEAAChxABAoMQAQJ/EAACexABAnsQAAJ3EAECcxABAnMUAxZvFAACaxQAAmsUAAJnFAMCZxQAAmMUAIJjFAACXxgBAl8YAAJbGAACWxgAAlcYAAJXGAACUxgAAlMYAAJPHAECTxwAAkscAwJLHAACSxwAAkccAAJHHAACQxwAAkMgAQJDIAACPyADAj8gAAI/IANOOyAAAjsgAAI7IAACNyQAAjckAAI3JANOMyQAAjMkAAIzJAACLyQAAi8kAAIvKAACKygAAisoAAIrKAACKygAgicoAAInKAACJygAAiMsAAIjLAACIywAAiMsAAIfLAACHywAAh8sAAIfLAACGzAAAhswAAIbMAACGzAAAhcwAAIXMAACFzAAAhcwAAIXNAACEzQAAhM0AAITNAACEzQAAg80AAIPNAACDzQAAg84AAIPOAACCzgAAgs4AAILOAACCzgAAgs4AAIHOAACBzwAAgc8AAIHPAACBzwAAgM8AAIDPAACAzwAAgM8AAIDQAACA0AAAf9AAAH/QAAD41efA3qsAQtPVzsDLqwC2xdbCwcCsAMC81rrBuawAwLbWtcG0rABhsdawwa+sAMCt16zCq60AQKrXqcKorQBtp9emwqWtAECk16PCo60A8qLYocOhrgAAoNifw5+uAECe2J3Dna4ALZzYm8ObrgBTmtmZxJmvAECZ2ZjEmK8AAJfZlsSWrwBAltmVxJWvAECV2pTFlLAAQJPak8WTsABAktqRxZKwAACR2pDFkLAAYJDbj8aPsQD1j9uOxo6xAACO243GjbEAAI3bjMaNsQDAjNyMx4yyAACL3IvHi7IAAIrciseKsgBAityJx4myAACJ3YjIibMAQIjdiMiIswAAh92HyIezAACH3YbIhrMAAIbehsmGtAAAhd6FyYW0AACF3oTJhLQAwITehMmEtAAAhN+DyoO1AMCD34LKg7UAAILfgsqCtQAAgt+ByoK1AACB4IHLgbYAAIHggMuAtgAAgOCAy4C2AACA4H/Lf7YAAH/hf8x/twAAf+F+zH+3AAB+4X7MfrcAAH7hfcx+twAAfeJ9zX24AAB94nzNfbgAAHzifM18uAAAfOJ8zXy4AAB843vOe7kAAHvje857uQAAe+N6znu5AAB643rOerkAAHrkes96ugAAeuR5z3q6AAB55HnPeboAAHnkec95ugAAeeV40Hi7AAB45XjQeLsAAOvs59rhzNvA1rXOpr6UZYG47cLbw83CwcC2u6etlWWCqO603LbOtsO1t7CopJZlg5/vq92uz67DrbipqZ6XZYSY76TeqNCoxai5pKqZmGWFkvCf36PRpMWjuqCrlZllho3xm+Cf0aDHoLudrJKZZYeJ8pfgm9KdyJ28mq2PmmWIhfKU4ZjTmsiavZetjZtliYLzkeKV1JfKl76VroucZYp/9I7jk9WVypW/k6+JnWWLfPSM5JHWk8yTwJGwh55ljHn1ieSO15HMkcGPsYafZY129ofljNiPzZDCjrKEoGWOdPaF5ovZjc+Owoyzg6Blj3H3g+eJ2ovPjcOLtIKhZZBv94Hoh9uK0IzEirWBomWRbfh/6IbcidGKxYm1gKNlkmr4fumE3YfTicaHtn+kZZNo+Hzqg96G1IjHhrd+pWWUZvh764HfhdWHyIW4fqZllWT5eeuA4ITWhsmFuX2nZZZh+Xfsf+CD1oXKhLp8qGWXX/l27X3hgdeEy4O7e6llmF35de584oDYg8yCvHupZZlb+HPue+N/2oLNgb16qmWaWPhy73rkf9qBzoG+eqtlm1b3cPB55X7bgc+Av3msZZxT9m/weOZ93YDQf795rWWdUfVu8XfnfN1/0X/AeK5lnk/0bPF26HvfftJ+wXivZZ9M8mvydel6337TfsJ3sGWg6fDn4OTQ38DYsc6hvJFpgbXxweHF0cXBwrK6oquSaYKm8rPiudK6w7ezsKOik2mDnPOr47DTssOwtKmknJRphJX0pOSq1KzFqrWkpZeVaYWP9Z/lpdWnxaa2oKaTlmmGivaa5qHWo8eit5ynkJdph4b3l+ee16DIn7iZqI6YaYiC+JPom9idyJy5l6mLmWmJfvmQ6ZjZm8qaupWqiZppinv6juqV2pjKl7uTq4ibaYt3+4vrk9uWzJW8kayGnGmMdPyJ7JHclMyUvY+thZ1pjXH9h+2P3ZLNkr6OroOeaY5u/oXujd6Rz5C/jK+Cn2mPa/+D74zfj8+PwIuwgaBpkGkAgfCK4I7QjcGKsYChaZFmAX/xiOGM0YzCiLJ/ommSYwJ98ofii9OLw4ezf6Npk2ADe/OF44rUisSGtH6kaZRdBHr0hOSI1YnFhbV9pWmVWgV49YPlh9aIxoW2fKZpllYGd/aC5obWh8eEt3ynaZdTB3X3gOeF14bIg7h7qGmYTwh0+H/ohNiFyYK5e6lpmUsJcvl+6YPahMqBunqqaZpHCnH6feqC2oPLgbt5q2mbQgtv+3zrgduCzIC8eaxpnDsMbvx77IDdgs1/vXitaZ00DW39eu1/3YHOf754rmmeKQ5r/nnuf9+Az36/eK9pnxcPav94737ff9B9wHewaaAAAAAAQk5TMQUBAgIqxloQV09PRCBQTFVDSwAATVhNRlJQUgAAAAAAQAAAADBAQAADEwAAQEAAABQAAV0AAEAAFABff1kAZAA+ATwCAAFuBXgIeAx4AAAAAAAAAAgA+cAA/QCXAIMADgAFAKAAnACtAL4AGACDAKgA3wBzAI8ADwANAM8AqwC5AJEAjQAAAD4ADgB7AC8AFwCFAL8APQBJAC8A0wCyAI8A7QAfAMIAogD0AD8AkQDXAK0AYAD+AJkA0gBVACQATABaALUA9gA6AKoAxABhAE4AkwD7AGYAwwA7AKsAJgBFAMcA1QDeAHoAigAsAH0AfQDaAN0AbQBWAOUAzQC2AD4AJgCUALYA0wB9AFYA+AARAPYAxwAJAL4A2gBJAAQAOACEAL8ANAAdAFsAXwAaALcAUwAxAEIAUgDMAGAAUwDiACsAZgAAAMsAXAA1ANoAzQDeADoA/AC+ALYAPQCbALwAoQCzAMQAOgDIAOoA3wC4AJ4AkgCIAD4A3QCsAAMAPQCmAMoArQCzAJYADwBTAKwAygChAN4ANAAHAKUA9AC+ADwAXgATAD4ADQCnABoAAwCpAFUAOQDPAGAANQBuAJsArgDLAA8ATwB8AAkAKgByAKYAFACtAIwAgABKALEARwDAABEACgB6AH8ApwB7AFAAlQAQABIAGwDMAGIAIACNAIcAGQCKAKUAZQDJAIcAOwBiAKQAgAAxAAIAFQB3AK0AngAoAD0AqQAkAGIAoQAwAI4AxABtADsAtQDDAE8AOgAbAKcA7QAxAD8ApADaANoAgADIAGH9wA2B1sAAE7bAAIBtQQBYYsIAgVhCADdRwwCBSkMAPETEAII/RAA7OsQAgzZFAEMyxQCDL0YAQyvGAIMoRgA7JccAgyNHAEEgyACEHkgAQxvIAIQZSQBMF8kAhRVKAD4TygCFEUsAQBDLAIYOSwBIDMwAhgtMAEsJzQCHCE0ASQbNAIcFTgA/AM4AiABPAEsAzwCIAFAASADQAIkAUABLANEAiABRAEsA0gCKAFIARQDSAIkAUwBKANMAigBUAEoA1ACKAFUARwDVAIsAVQBQANYAigBWAEEA1wCLAFcARgDXAI0AWABCANgAjABZAFMA2QCLAFoASwDaAI4AWgBAANsAjwBbAFoA3ACTAFwAWgDcAI0AXQBUAN0AjwBeAE8A3gCOAF8AUgDfAJIAXwBFAOAAjwBgAFQA4QCRAGEAXADiAJAAYgBTAOIAmgBjAFYA4wCVAGQAXgDkAIwAZABYAOUAkQBlAEoA5gCSAGYASgDnAJAAZwBdAOcAnQBoACoA6ACYAGkAVgDpAJcAaQBLAOoAkwBqAEMA6wCPAGsASgDsAJUAbABTAOwAmABtAFEA7QCRAG4AagDuAJcAbwBGAO8AlQBvAE8A8ACMAHAAVgDxAJUAcQBtAPEAngByAEkA8gCgAHMAUwDzAIwAdABdAPQAlQB0AHIA9QCvAHUAfPPAwkB4SLJAuMGoQJfAokGmwZ1BksCYQZzBlUGOwJJBlMGPQYnBjUGPwopBhsGIQYrChkKDwYVChsKDQoDBgkKDwoBCfcJ/QoDDfkJ7wnxCfsN7Q3nCekN7w3lDd8J4Q3nDd0N1w3ZDd8R2Q3TDdUN2xHREcsNzRHTEckRxw3JEcsRxRG/EcERxxXBEbsRvRXDFbkVtxG5FbsVtRWzEbEVtxWxFa8VrRWzGa0VqxWpGa8ZqRmnFaUZqxmlGaMVoRmnGaEZnxmdGaMdnRmbGZkdnx2ZHZcZmR2bHZUdkxmVHZcdkR2THZEdkyGRHY8djSGTIY0hix2JIY8hiSGHHYkhiyGFIYchhSGHJYUhgyGBJYclgSV/IYElgyV9JX8hfSV/JX0leyV5JX8peSV7JXkpeyl1KXcldSl3KXUpcyV1KXcpcSlzKXEpcy1xKW8pcS1zLW0tbyltLW8tbS1rLWktby1pLWstaS1rMWktZy1lMWsxZTFnLWUxZzFlMWMxYTFnMWExYzFhMWM1YTFfMWE1YzVdNV8xXTVfNV01XzVdNV81WTVbNVk1WzlZNVs1WTlbOVk5VzVVOVs5VTlXOVU5VzlVOVc5VTlXPVE5UzlRPVM9UT1TOVE9Uz1RPU89UT1TPU09Tz1NPU9BTT1PPU1BT0FNQUs9SUFPQUlBS0FJQ98DSQN7AwkDSwLhAysCyQcTBrUHAwahBvMGlQbjBokG2wZ9Bs8GdQbHBmkGvwZhCrcKXQqvClUKpwpNCqMKSQqbCkEKlwo9CpMKOQqLCjUKhw4tDoMOKQ5/DiUOew4hDncOHQ5zDhkObw4ZDmsOFQ5rEhESZxINEmMSCRJfEgkSXxIFE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ANMAfQBWAPgAEQD2AMcACQC+ANoASQAEADgAhAC/ADQAHQBbAF8AGgC3AFMAMQBCAFIAzABgAFMA4gArAGYAAADLAFwANQDaAM0A3gA6APwAvgC2AD0AmwC8AKEAswDEADoAyADqAN8AuACeAJIAiAA+AN0ArAADAD0ApgDKAK0AswCWAA8AUwCsAMoAoQDeADQABwClAPQAvgA8AF4AEwA+AA0ApwAaAAMAqQBVADkAzwBgADUAbgCbAK4AywAPAE8AfAAJACoAcgCmABQArQCMAIAASgCxAEcAwAARAAoAegB/AKcAewBQAJUAEAASABsAzABiACAAjQCHABkAigClAGUAyQCHADsAYgCkAIAAMQACABUAdwCtAJ4AKAA9AKkAJABiAKEAMACOAMQAbQA7ALUAwwBPADoAGwCnAO0AMQA/AKQA2gDaAIAAyABh/cANgdbAABO2wACAbUEAWGLCAIFYQgA3UcMAgUpDADxExACCP0QAOzrEAIM2RQBDMsUAgy9GAEMrxgCDKEYAOyXHAIMjRwBBIMgAhB5IAEMbyACEGUkATBfJAIUVSgA+E8oAhRFLAEAQywCGDksASAzMAIYLTABLCc0AhwhNAEkGzQCHBU4APwDOAIgATwBLAM8AiABQAEgA0ACJAFAASwDRAIgAUQBLANIAigBSAEUA0gCJAFMASgDTAIoAVABKANQAigBVAEcA1QCLAFUAUADWAIoAVgBBANcAiwBXAEYA1wCNAFgAQgDYAIwAWQBTANkAiwBaAEsA2gCOAFoAQADbAI8AWwBaANwAkwBcAFoA3ACNAF0AVADdAI8AXgBPAN4AjgBfAFIA3wCSAF8ARQDgAI8AYABUAOEAkQBhAFwA4gCQAGIAUwDiAJoAYwBWAOMAlQBkAF4A5ACMAGQAWADlAJEAZQBKAOYAkgBmAEoA5wCQAGcAXQDnAJ0AaAAqAOgAmABpAFYA6QCXAGkASwDqAJMAagBDAOsAjwBrAEoA7ACVAGwAUwDsAJgAbQBRAO0AkQBuAGoA7gCXAG8ARgDvAJUAbwBPAPAAjABwAFYA8QCVAHEAbQDxAJ4AcgBJAPIAoABzAFMA8wCMAHQAXQD0AJUAdAByAPUArwB1AHzzwMJAeEiyQLjBqECXwKJBpsGdQZLAmEGcwZVBjsCSQZTBj0GJwY1Bj8KKQYbBiEGKwoZCg8GFQobCg0KAwYJCg8KAQn3Cf0KAw35Ce8J8Qn7De0N5wnpDe8N5Q3fCeEN5w3dDdcN2Q3fEdkN0w3VDdsR0RHLDc0R0xHJEccNyRHLEcURvxHBEccVwRG7Eb0VwxW5FbcRuRW7FbUVsxGxFbcVsRWvFa0VsxmtFasVqRmvGakZpxWlGasZpRmjFaEZpxmhGZ8ZnRmjHZ0ZmxmZHZ8dmR2XGZkdmx2VHZMZlR2XHZEdkx2RHZMhkR2PHY0hkyGNIYsdiSGPIYkhhx2JIYshhSGHIYUhhyWFIYMhgSWHJYElfyGBJYMlfSV/IX0lfyV9JXsleSV/KXkleyV5KXspdSl3JXUpdyl1KXMldSl3KXEpcylxKXMtcSlvKXEtcy1tLW8pbS1vLW0tay1pLW8taS1rLWktazFpLWctZTFrMWUxZy1lMWcxZTFjMWExZzFhMWMxYTFjNWExXzFhNWM1XTVfMV01XzVdNV81XTVfNVk1WzVZNVs5WTVbNVk5WzlZOVc1VTlbOVU5VzlVOVc5VTlXOVU5Vz1ROVM5UT1TPVE9UzlRPVM9UT1PPVE9Uz1NPU89TT1PQU09Tz1NQU9BTUFLPUlBT0FJQUtBSUPfA0kDewMJA0sC4QMrAskHEwa1BwMGoQbzBpUG4waJBtsGfQbPBnUGxwZpBr8GYQq3Cl0KrwpVCqcKTQqjCkkKmwpBCpcKPQqTCjkKiwo1CocOLQ6DDikOfw4lDnsOIQ53Dh0Ocw4ZDm8OGQ5rDhUOaxIREmcSDRJjEgkSXxIJEl8SBRJbEgESVxIBElcR/RJTFfkWTxX5Fk8V9RZLFfUWRxXxFkcV7RZDFe0WQxXpGj8Z6Ro/GeUaOxnlGjsZ4Ro3GeEaNxndGjMZ3RozGd0eMx3ZHi8d2R4vHdUeKx3VHisd0R4nHdEeJx3RHicdzR4jIc0iIyHJIiMhySIfIckiHyHFIhshxSIbIcUiGyHBIhclwSYXJcEmFyW9JhMlvSYTJb0mEyW5JhMluSYPJbkmDym5Kg8ptSoLKbUqCym1KgspsSoHKbEqBymxKgcpsS4HLa0uAy2tLgMtrS4DLa0uAy2pLf8tqS3/Lakt/y2pMf8xpTH7MaUx+zGlMfsxpTH7MaEx9zGhMfcxoTH3MaEx9zWdNfc1nTXzNZ018zWdNfM1nTXzNZk17zWZNe81mTXvOZk57zmVOe85lTnrOZU56zmVOes5lTnrOZU56zmROec9kT3nPZE95z2RPec9kT3nPY095z2NPeM9jT3jPY1B40GNQeNBiUHjQYlB30GJQ/8AAqebAAEfawAC70sAAQMzBAEvHwQDAxMEAwMDBAK29wQDAu8EA+rjBAEC2wQATtMIAs7PCAECxwgBAr8IAQK7CACitwgC9q8IAU6rCAMOpwwBoqMMAQKfDAECmwwAApcMAwKTDAMCjwwDKosMAQKHEAAChxABAoMQAQJ/EAACexABAnsQAAJ3EAECcxABAnMUAxZvFAACaxQAAmsUAAJnFAMCZxQAAmMUAIJjFAACXxgBAl8YAAJbGAACWxgAAlcYAAJXGAACUxgAAlMYAAJPHAECTxwAAkscAwJLHAACSxwAAkccAAJHHAACQxwAAkMgAQJDIAACPyADAj8gAAI/IANOOyAAAjsgAAI7IAACNyQAAjckAAI3JANOMyQAAjMkAAIzJAACLyQAAi8kAAIvKAACKygAAisoAAIrKAACKygAgicoAAInKAACJygAAiMsAAIjLAACIywAAiMsAAIfLAACHywAAh8sAAIfLAACGzAAAhswAAIbMAACGzAAAhcwAAIXMAACFzAAAhcwAAIXNAACEzQAAhM0AAITNAACEzQAAg80AAIPNAACDzQAAg84AAIPOAACCzgAAgs4AAILOAACCzgAAgs4AAIHOAACBzwAAgc8AAIHPAACBzwAAgM8AAIDPAACAzwAAgM8AAIDQAACA0AAAf9AAAH/QAAD41efA3qsAQtPVzsDLqwC2xdbCwcCsAMC81rrBuawAwLbWtcG0rABhsdawwa+sAMCt16zCq60AQKrXqcKorQBtp9emwqWtAECk16PCo60A8qLYocOhrgAAoNifw5+uAECe2J3Dna4ALZzYm8ObrgBTmtmZxJmvAECZ2ZjEmK8AAJfZlsSWrwBAltmVxJWvAECV2pTFlLAAQJPak8WTsABAktqRxZKwAACR2pDFkLAAYJDbj8aPsQD1j9uOxo6xAACO243GjbEAAI3bjMaNsQDAjNyMx4yyAACL3IvHi7IAAIrciseKsgBAityJx4myAACJ3YjIibMAQIjdiMiIswAAh92HyIezAACH3YbIhrMAAIbehsmGtAAAhd6FyYW0AACF3oTJhLQAwITehMmEtAAAhN+DyoO1AMCD34LK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AMMATwA6ABsApwDtADEAPwCkANoA2gCAAMgAYfjAz8DTwAATtMAAgJrcl8BiwgCBWEIAN1HDAIFKQwA4RMQAgj9EADw6xACDNkUAQDLFAIMvRgBFK8YAgyhGADglxwCDI0cARCDIAIUeSAA5G8gAhBlJAE8XyQCGFUoASRPKAIQRSwA6EMsAhg5LAEEMzACGC0wAVgnNAIYITQBNBs0AhwVOAEcAzgCIAE8ATwDPAIkAUAA/ANAAhgBQAEkA0QCKAFEASADSAIoAUgBEANIAjQBTADwA0wCHAFQAUgDUAIgAVQBRANUAiABVADMA1gCNAFYATgDXAIoAVwBUANcAiABYAE8A2ACOAFkAXQDZAI4AWgAsANoAjQBaAFEA2wCSAFsAXQDcAI4AXABLANwAkgBdAFgA3QCQAF4ANgDeAI0AXwBqAN8AkgBfAEgA4ACQAGAAYgDhAIIAYQAnAOIAjgBiAF4A4gCPAGMAVADjAI8AZABLAOQAkQBkAEYA5QCYAGUAKwDmAI8AZgBFAOcAkABnAFYA5wCVAGgAXQDoAKMAaQB8AOkAkwBqABUA6gCqAGoAWADrAI8AawBSAOwAkABsAEYA7ACWAG0ASQDtAKUAbgCCAO4ApQBvAFAA7wCJAG8AcADwAKQAcABVAPEAlABxACkA8gCPAHIANQDyAKoAcwBuAPMAoQB0AFYA9ACbAHQAWQD1AJUAdQB988DCQHhIskC4wahAl8CiQabBnUGSwJhBnMGVQY7AkkGUwY9BicGNQY/CikGGwYhBisKGQoPBhUKGwoNCgMGCQoPCgEJ9wn9CgMN+QnvCfEJ+w3tDecJ6Q3vDeUN3wnhDecN3Q3XDdkN3xHZDdMN1Q3bEdERyw3NEdMRyRHHDckRyxHFEb8RwRHHFcERuxG9FcMVuRW3EbkVuxW1FbMRsRW3FbEVrxWtFbMZrRWrFakZrxmpGacVpRmrGaUZoxWhGacZoRmfGZ0Zox2dGZsZmR2fHZkdlxmZHZsdlR2TGZUdlx2RHZMdkR2TIZEdjx2NIZMhjSGLHYkhjyGJIYcdiSGLIYUhhyGFIYclhSGDIYElhyWBJX8hgSWDJX0lfyF9JX8lfSV7JXklfyl5JXsleSl7KXUpdyV1KXcpdSlzJXUpdylxKXMpcSlzLXEpbylxLXMtbS1vKW0tby1tLWstaS1vLWktay1pLWsxaS1nLWUxazFlMWctZTFnMWUxYzFhMWcxYTFjMWExYzVhMV8xYTVjNV01XzFdNV81XTVfNV01XzVZNVs1WTVbOVk1WzVZOVs5WTlXNVU5WzlVOVc5VTlXOVU5VzlVOVc9UTlTOVE9Uz1RPVM5UT1TPVE9Tz1RPVM9TT1PPU09T0FNPU89TUFPQU1BSz1JQU9BSUFLQUlD3wNJA3sDCQNLAuEDKwLJBxMGtQcDBqEG8waVBuMGiQbbBn0GzwZ1BscGaQa/BmEKtwpdCq8KVQqnCk0KowpJCpsKQQqXCj0Kkwo5CosKNQqHDi0Ogw4pDn8OJQ57DiEOdw4dDnMOGQ5vDhkOaw4VDmsSERJnEg0SYxIJEl8SCRJfEgUSWxIBElcSARJXEf0SUxX5Fk8V+RZPFfUWSxX1FkcV8RZHFe0WQxXtFkMV6Ro/GekaPxnlGjsZ5Ro7GeEaNxnhGjcZ3RozGd0aMxndHjMd2R4vHdkeLx3VHisd1R4rHdEeJx3RHicd0R4nHc0eIyHNIiMhySIjIckiHyHJIh8hxSIbIcUiGyHFIhshwSIXJcEmFyXBJhclvSYTJb0mEyW9JhMluSYTJbkmDyW5Jg8puSoPKbUqCym1KgsptSoLKbEqBymxKgcpsSoHKbEuBy2tLgMtrS4DLa0uAy2tLgMtqS3/Lakt/y2pLf8tqTH/MaUx+zGlMfsxpTH7MaUx+zGhMfcxoTH3MaEx9zGhMfc1nTX3NZ018zWdNfM1nTXzNZ018zWZNe81mTXvNZk17zmZOe85lTnvOZU56zmVOes5lTnrOZU56zmVOes5kTnnPZE95z2RPec9kT3nPZE95z2NPec9jT3jPY094z2NQeNBjUHjQYlB40GJQd9BiUP/AAKnmwABH2sAAu9LAAEDMwQBLx8EAwMTBAMDAwQCtvcEAwLvBAPq4wQBAtsEAE7TCALOzwgBAscIAQK/CAECuwgAorcIAvavCAFOqwgDDqcMAaKjDAECnwwBApsMAAKXDAMCkwwDAo8MAyqLDAEChxAAAocQAQKDEAECfxAAAnsQAQJ7EAACdxABAnMQAQJzFAMWbxQAAmsUAAJrFAACZxQDAmcUAAJjFACCYxQAAl8YAQJfGAACWxgAAlsYAAJXGAACVxgAAlMYAAJTGAACTxwBAk8cAAJLHAMCSxwAAkscAAJHHAACRxwAAkMcAAJDIAECQyAAAj8gAwI/IAACPyADTjsgAAI7IAACOyAAAjckAAI3JAACNyQDTjMkAAIzJAACMyQAAi8kAAIvJAACLygAAisoAAIrKAACKygAAisoAIInKAACJygAAicoAAIjLAACIywAAiMsAAIjLAACHywAAh8sAAIfLAACHywAAhswAAIbMAACGzAAAhswAAIXMAACFzAAAhcwAAIXMAACFzQAAhM0AAITNAACEzQAAhM0AAIPNAACDzQAAg80AAIPOAACDzgAAgs4AAILOAACCzgAAgs4AAILOAACBzgAAgc8AAIHPAACBzwAAgc8AAIDPAACAzwAAgM8AAIDPAACA0AAAgNAAAH/QAAB/0AAA+NXnwN6rAELT1c7Ay6sAtsXWwsHArADAvNa6wbmsAMC21rXBtKwAYbHWsMGvrADArdeswqutAECq16nCqK0AbafXpsKlrQBApNejwqOtAPKi2KHDoa4AAKDYn8OfrgBAntidw52uAC2c2JvDm64AU5rZmcSZrwBAmdmYxJivAACX2ZbElq8AQJbZlcSVrwBAldqUxZSwAECT2pPFk7AAQJLakcWSsAAAkdqQxZCwAGCQ24/Gj7EA9Y/bjsaOsQAAjtuNxo2xAACN24zGjbEAwIzcjMeMsgAAi9yLx4uyAACK3IrHirIAQIrciceJsgAAid2IyImzAECI3YjIiLMAAIfdh8iHswAAh92GyIazAACG3obJhrQAAIXehcmFtAAAhd6EyYS0AMCE3oTJhLQAAITfg8qDtQDAg9+CyoO1AACC34LKgrUAAILfgcqCtQAAgeCBy4G2AACB4IDLgLYAAIDggMuAtgAAgOB/y3+2AAB/4X/Mf7cAAH/hfsx/twAAfuF+zH63AAB+4X3MfrcAAH3ifc19uAAAfeJ8zX24AAB84nzNfLgAAHzifM18uAAAfON7znu5AAB743vOe7kAAHvjes57uQAAeuN6znq5AAB65HrPeroAAHrkec96ugAAeeR5z3m6AAB55HnPeboAAHnleNB4uwAAeOV40Hi7AADr7Ofa4czbwNa1zqa+lGWBuO3C28PNwsHAtrunrZVlgqjutNy2zrbDtbewqKSWZYOf76vdrs+uw624qamel2WEmO+k3qjQqMWouaSqmZhlhZLwn9+j0aTFo7qgq5WZZYaN8Zvgn9Ggx6C7naySmWWHifKX4JvSncidvJqtj5pliIXylOGY05rImr2XrY2bZYmC85HildSXype+la6LnGWKf/SO45PVlcqVv5OviZ1li3z0jOSR1pPMk8CRsIeeZYx59YnkjteRzJHBj7GGn2WNdvaH5YzYj82Qwo6yhKBljnT2heaL2Y3PjsKMs4OgZY9x94PnidqLz43Di7SCoWWQb/eB6IfbitCMxIq1gaJlkW34f+iG3InRisWJtYCjZZJq+H7phN2H04nGh7Z/pGWTaPh86oPehtSIx4a3fqVllGb4e+uB34XVh8iFuH6mZZVk+XnrgOCE1obJhbl9p2WWYfl37H/gg9aFyoS6fKhll1/5du194YHXhMuDu3upZZhd+XXufOKA2IPMgrx7qWWZW/hz7nvjf9qCzYG9eqplmlj4cu965H/agc6BvnqrZZtW93DweeV+24HPgL95rGWcU/Zv8Hjmfd2A0H+/ea1lnVH1bvF353zdf9F/wHiuZZ5P9Gzxduh7337SfsF4r2WfTPJr8nXpet9+037Cd7BloOnw5+Dk0N/A2LHOobyRaYG18cHhxdHFwcKyuqKrkmmCpvKz4rnSusO3s7CjopNpg5zzq+Ow07LDsLSppJyUaYSV9KTkqtSsxaq1pKWXlWmFj/Wf5aXVp8WmtqCmk5Zphor2muah1qPHorecp5CXaYeG95fnntegyJ+4maiOmGmIgviT6JvYncicuZepi5lpiX75kOmY2ZvKmrqVqomaaYp7+o7qldqYype7k6uIm2mLd/uL65PblsyVvJGshpxpjHT8ieyR3JTMlL2PrYWdaY1x/Yftj92SzZK+jq6DnmmObv6F7o3ekc+Qv4yvgp9pj2v/g++M34/Pj8CLsIGgaZBpAIHwiuCO0I3BirGAoWmRZgF/8YjhjNGMwoiyf6JpkmMCffKH4ovTi8OHs3+jaZNgA3vzheOK1IrEhrR+pGmUXQR69ITkiNWJxYW1faVplVoFePWD5YfWiMaFtnymaZZWBnf2guaG1ofHhLd8p2mXUwd194DnhdeGyIO4e6hpmE8IdPh/6ITYhcmCuXupaZlLCXL5fumD2oTKgbp6qmmaRwpx+n3qgtqDy4G7eatpm0ILb/t864HbgsyAvHmsaZw7DG78e+yA3YLNf714rWmdNA1t/Xrtf92Bzn++eK5pnikOa/557n/fgM9+v3ivaZ8XD2r/eO9+33/QfcB3sGmgAAAAAAAAQk5TMQUBAAJ56VoEV0FWRSBTV0VFUAAAQlVCQkEAQbi6BgvVCG5AQAAAFAAAQEAAABQAAHMKAEBAFABGbk9FTwBPATwCAAFuBXgIeAx4AAAofwAAAAhA/8DawL3AtcCwwKzAqMClwKPAoMCewJzAmsCYwJfAlcCUwJPAkcCQwI/AjsCNwIzAi8CKwInAiMCIwIfAhsCFwIXAhMCDwILAgsCBwIHAgMB/wH/AfsB+wH3AfcB8wHzAe8B7wHrAesB6wHnAecB4wHjAd8B3wHfAdsB2wHbAdcDvwPPA1cC7wLXAsMCtwKrAp8ClwKLAoMCewJ3Am8CawJjAl8CWwJTAk8CSwJHAkMCPwI7AjsCNwIzAi8CKwIrAicCIwIjAh8CGwIbAhcCEwITAg8CDwILAgsCBwIHAgMCAwH/Af8B+wH7AfcB9wH3AfMB8wHvAe8B7wHrAesB6wODA5MDwwNTAu8C2wLPAsMCtwKrAqMCmwKTAo8ChwJ/AnsCdwJvAmsCZwJjAl8CWwJXAlMCTwJLAksCRwJDAj8CPwI7AjcCNwIzAi8CLwIrAisCJwInAiMCIwIfAh8CGwIbAhcCFwITAhMCDwIPAgsCCwILAgcCBwIDAgMCAwH/A48DUwN/A7cDSwLvAtsCzwLDArsCswKrAqMCmwKXAo8CiwKDAn8CewJ3AnMCbwJrAmcCYwJfAlsCVwJTAlMCTwJLAksCRwJDAkMCPwI7AjsCNwI3AjMCMwIvAi8CKwIrAicCJwIjAiMCHwIfAhsCGwIbAhcCFwITAhMCEwIPAg8DmwNbAzcDawOrA0cC6wLbAs8CxwK7ArMCrwKnAp8CmwKTAo8CiwKHAn8CewJ3AnMCbwJrAmsCZwJjAl8CWwJbAlcCUwJTAk8CSwJLAkcCQwJDAj8CPwI7AjsCNwI3AjMCMwIvAi8CKwIrAisCJwInAiMCIwIfAh8CHwIbAhsCGwOfA18DOwMjA18DnwM/AuMC1wLLAsMCuwKzAqsCpwKfApsCkwKPAosChwKDAn8CewJ3AnMCbwJrAmcCZwJjAl8CWwJbAlcCUwJTAk8CTwJLAkcCRwJDAkMCPwI/AjsCOwI3AjcCMwIzAi8CLwIvAisCKwInAicCJwIjAiMCHwIfA6cDZwNDAycDFwNTA5cDOwLfAtMCxwK/ArsCswKrAqcCnwKbApcCkwKPAocCgwJ/AnsCewJ3AnMCbwJrAmcCZwJjAl8CXwJbAlcCVwJTAlMCTwJLAksCRwJHAkMCQwI/Aj8COwI7AjsCNwI3AjMCMwIvAi8CLwIrAisCJwInAicDqwNrA0cDKwMXAwcDSwOPAzMC2wLPAscCvwK3Aq8CqwKjAp8CmwKXApMCiwKHAoMCgwJ/AnsCdwJzAm8CbwJrAmcCYwJjAl8CWwJbAlcCVwJTAlMCTwJLAksCRwJHAkMCQwI/Aj8CPwI7AjsCNwI3AjMCMwIzAi8CLwIrAisCKwAAAAAAAAEJOUzEFAQACVYtKAkdMQVNTIEJFTExTAEJVQkJBAEGYwwYLxQRuQEAUAQYAAEBAAAAUAAB4BQBAQBQAbABlAGIAYgE8AgABbgV4CHgMeAAAPFAAAAAIH/3AABDhwAB9AEAA4O3AADkAwACA0cAA+ABAAIEAQAAB3cAACQDAAPoAwAD9AEAAogDAAHMAQABsAMAAgQDA/cAAC+XAAP8AQACB7MAA/wDAAIrZwACDAEAA/QBAAAHawAALAMAAgQBAAOm4wAAJAMAAlABAAAEAwAAPs8D+wAA76cAABgDAAPbqwAAAAMAAheDAAAMAQAAAAMAAf9fAAEAAQAB9AMAAkcnAAAAAwADVAMAA6gDAAJzEwP/AAFLswACRAEAA++jAAH4AQACF5cAAhADAAIUAQAB51MAABgDAAIcAwACI08AAeABAAOoAQACMAMAA783A/8AAbO/AAIgAQAB45sAACwDAAADpwACAAMAABwBAAArPwACAAMAAZQBAAODawAAeAMAA/ADAAMAAwAAA1cD/wAB48cAAeABAAADjwACDAMAAeOzAAIIAQAAHAMAA48jAAO0AQAAHAMAABN/AAPoAQABtAMAA3QDAAPrawPvAAAPwwAADAMAA89zAAHYAQACQ7MAABADAAAsAwAD5u8AAbQBAAG0AwACC4MAA+gDAAA8AQAACAEAAgdrA+MAA8+7AAAAAQAB/1cAA+gBAAILrwAAAAMAAfQDAAPGowAB/AMAAoADAAATgwAAEAMAAfgDAAGAAQAAE28AAAAAAAABCTlMxBQEAAiFn+gBNQUxMRVQgVklCRVNCVUJCQQBB6McGC/UBbkBAAAAUAABAQAAAFAAAdgAAQEAUAGYAXABYAFgAXgMtAW4FeAh4DHgAAEZkAAAACArzwL7AAMDnwABAAEAAwABAAMDXwPXAv8AAwObAAEAAQADAAMAAwNbA9sDBwABA5MAAQADAAMAAwADA08D4wMLAAMDiwABAAEAAwADAAMDRwPnAxMAAwODAAEAAQADAAMAAQM3A+8DGwADA3cAAQABAAMAAwADAycD9wMjAAMDYwABAAMAAwADAAMDBwP/AysAAwNDAAEAAQADAAMAAwLPAAAAAAAAAQk5TMQUBAAIKQ1oETUlYRUQgQ0hPSVIAQlVCQkEAQejJBgvVCGlAQCgBEgAAQEAAABQAAGQKAEBAFE9aeFwAAH8AASECKAFuBXgIeAx4AAAeAAAAAAhA+MD/wPbA2MDCwMPAzcDXwNjA0cDDwLPAqsCmwKTAo8CiwKDAn8CewJ3AnMCbwJrAmcCYwJfAlsCVwJTAlMCTwJLAksCRwJDAkMCPwI7AjsCNwI3AjMCMwIvAi8CKwIrAicCJwIjAiMCHwIfAhsCGwIbAhcCFwITAhMCEwIPAg8DxwPvA+sDjwMrAzcDXwNzA2MDMwLzAr8CqwKjApsClwKPAosChwJ/AnsCdwJzAm8CawJnAmMCYwJfAlsCVwJTAlMCTwJLAksCRwJDAkMCPwI/AjsCOwI3AjcCMwIzAi8CLwIrAisCJwInAiMCIwIjAh8CHwIbAhsCGwIXAhcCEwOnA8cD5wOvA08DVwNzA3MDTwMPAtMCswKnAp8ClwKTAosChwKDAn8CewJzAm8CawJrAmcCYwJfAlsCVwJXAlMCTwJLAksCRwJDAkMCPwI/AjsCNwI3AjMCMwIvAi8CKwIrAicCJwInAiMCIwIfAh8CGwIbAhsCFwIXAhMCEwITA5cDnwPXA8cDewNzA3sDYwMvAusCvwKrAqMCmwKXAo8CiwKDAn8CewJ3AnMCbwJrAmcCYwJfAlsCVwJXAlMCTwJLAksCRwJDAkMCPwI/AjsCNwI3AjMCMwIvAi8CKwIrAicCJwIjAiMCHwIfAh8CGwIbAhcCFwIXAhMCEwIPAg8DjwN7A78D0wOnA4cDdwNLAwcCzwKzAqcCnwKbApMCjwKHAoMCfwJ3AnMCbwJrAmcCYwJfAlsCWwJXAlMCTwJPAksCRwJDAkMCPwI/AjsCNwI3AjMCMwIvAi8CKwIrAicCJwIjAiMCHwIfAhsCGwIbAhcCFwITAhMCEwIPA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pMBRwKPAjsCewJvAk8CgwHjAoMB9wJ3AksCVwJrAhcCdwGHAm8CKwJbAlcCJwJnAZMCZwH3A98DiwMjA2cDAwMbAy8COwMTAvsClwMDArsCxwLrAjcC0wLLAkcC0wKXApMCwwI3AqsCqwIDAq8CgwJrAqsCNwKLApcBowKXAncCRwKTAjcCcwKHAQcCgwJrAiMCgwI3AlcCewGfAm8CYwH/AnMCMwJDAm8BxwJfAlsB1wJnAjMD1wOjAv8DQwNTAvsC7wMnAvcCkwMDAu8BfwLjAucCXwK/AtsCjwKPAs8CowJLArsCqwF7AqcCqwIjAosCqwJbAmMCowJ3AicClwKDAXcCgwKHAfsCawKHAjsCRwKDAlcCCwJ7AmcBbwJrAm8B3wJTAm8CHwIzAm8CPwH7AmMCUwPHA6cDZwJ/AysDQwMfAnsC6wMTAvsCdwK/Au8C4wJ3ApcC1wLPAncCdwLDAr8CdwJTAq8CswJzAisCnwKnAnMB+wKPAp8CcwG/An8CkwJvASMCbwKLAm8BiwJfAoMCawHLAksCewJrAesCOwJzAmcB/wIrAmsCYwILAhMCYwJjA68DnwODA08C5wLDAxcDJwMXAuMCDwK/Au8C8wLbAosCRwK7AtMCzwKjAgsCdwKzAr8CqwJnAfMChwKnAqcCgwILAkcCiwKbAo8CUwGbAmMCiwKLAm8CCwIbAm8CgwJ3AkcASwJDAnMCdwJfAgsB8wJTAm8CZwI7AW8CJwJbAmcDhwODA3cDZwNPAy8C/wKjAmsCzwLzAvsC+wLrAs8CmwIDAmMCpwLDAssCxwK3ApcCUwG3AmMCkwKnAq8CpwKTAmcCAwIHAl8CgwKTApMChwJvAjcBbwIjAl8CewKDAn8CbwJPAgMBqwIvAlsCbwJzAmsCVwInAa8B5wI3AlcCYwM/Az8DPwM7AzcDMwMrAyMDGwMTAwcC+wLrAtsCwwKnAoMCRwGnAhMCWwJ/ApMCowKrAq8CswKzAq8CqwKjApsCjwJ7AmcCRwITAacBswITAjsCVwJnAnMCewJ/AoMCgwJ/AnsCcwJnAlcCQwInAfsBpwFbAd8CDwIvAkMCTwJbAAAAAAAAAQk5TMQUBAAKioVoEQ0xJQ0sgQkFTUwAAQlVCQkEAQYjkBguZDHNAQAAAFAAAQEAAABQAAEgZAFpAFABYMkAARQBAATwCAAFuBXgIeAx4AQAyRgAAAAhA/8DawL3AtcCwwKzAqMClwKPAoMCewJzAmsCYwJfAlcCUwJPAkcCQwI/AjsCNwIzAi8CKwInAiMCIwIfAhsCFwIXAhMCDwILAgsCBwIHAgMB/wH/AfsB+wH3AfcB8wHzAe8B7wHrAesB6wHnAecB4wHjAd8B3wHfAdsB2wHbAdcDvwPPA1cC7wLXAsMCtwKrAp8ClwKLAoMCewJ3Am8CawJjAl8CWwJTAk8CSwJHAkMCPwI7AjsCNwIzAi8CKwIrAicCIwIjAh8CGwIbAhcCEwITAg8CDwILAgsCBwIHAgMCAwH/Af8B+wH7AfcB9wH3AfMB8wHvAe8B7wHrAesB6wODA5MDwwNTAu8C2wLPAsMCtwKrAqMCmwKTAo8ChwJ/AnsCdwJvAmsCZwJjAl8CWwJXAlMCTwJLAksCRwJDAj8CPwI7AjcCNwIzAi8CLwIrAisCJwInAiMCIwIfAh8CGwIbAhcCFwITAhMCDwIPAgsCCwILAgcCBwIDAgMCAwH/A48DUwN/A7cDSwLvAtsCzwLDArsCswKrAqMCmwKXAo8CiwKDAn8CewJ3AnMCbwJrAmcCYwJfAlsCVwJTAlMCTwJLAksCRwJDAkMCPwI7AjsCNwI3AjMCMwIvAi8CKwIrAicCJwIjAiMCHwIfAhsCGwIbAhcCFwITAhMCEwIPAg8DmwNbAzcDawOrA0cC6wLbAs8CxwK7ArMCrwKnAp8CmwKTAo8CiwKHAn8CewJ3AnMCbwJrAmsCZwJjAl8CWwJbAlcCUwJTAk8CSwJLAkcCQwJDAj8CPwI7AjsCNwI3AjMCMwIvAi8CKwIrAisCJwInAiMCIwIfAh8CHwIbAhsCGwOfA18DOwMjA18DnwM/AuMC1wLLAsMCuwKzAqsCpwKfApsCkwKPAosChwKDAn8CewJ3AnMCbwJrAmcCZwJjAl8CWwJbAlcCUwJTAk8CTwJLAkcCRwJDAkMCPwI/AjsCOwI3AjcCMwIzAi8CLwIvAisCKwInAicCJwIjAiMCHwIfA6cDZwNDAycDFwNTA5cDOwLfAtMCxwK/ArsCswKrAqcCnwKbApcCkwKPAocCgwJ/AnsCewJ3AnMCbwJrAmcCZwJjAl8CXwJbAlcCVwJTAlMCTwJLAksCRwJHAkMCQwI/Aj8COwI7AjsCNwI3AjMCMwIvAi8CL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";return f}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{env:wasmImports,wasi_snapshot_preview1:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["memory"];updateMemoryViews();addOnInit(wasmExports["__wasm_call_ctors"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}wasmBinaryFile??=findWasmBinary();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);receiveInstantiationResult(result);return result}catch(e){readyPromiseReject(e);return}}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module["noExitRuntime"]||true;var __emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var wasmImports={_emscripten_memcpy_js:__emscripten_memcpy_js};var wasmExports;createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["__wasm_call_ctors"])();var _bm_web_flash=Module["_bm_web_flash"]=()=>(_bm_web_flash=Module["_bm_web_flash"]=wasmExports["bm_web_flash"])();var _bm_web_flash_size=Module["_bm_web_flash_size"]=()=>(_bm_web_flash_size=Module["_bm_web_flash_size"]=wasmExports["bm_web_flash_size"])();var _bm_web_flash_blank=Module["_bm_web_flash_blank"]=()=>(_bm_web_flash_blank=Module["_bm_web_flash_blank"]=wasmExports["bm_web_flash_blank"])();var _bm_web_flash_writes=Module["_bm_web_flash_writes"]=()=>(_bm_web_flash_writes=Module["_bm_web_flash_writes"]=wasmExports["bm_web_flash_writes"])();var _bm_web_init=Module["_bm_web_init"]=a0=>(_bm_web_init=Module["_bm_web_init"]=wasmExports["bm_web_init"])(a0);var _bm_web_button=Module["_bm_web_button"]=(a0,a1,a2)=>(_bm_web_button=Module["_bm_web_button"]=wasmExports["bm_web_button"])(a0,a1,a2);var _bm_web_key=Module["_bm_web_key"]=(a0,a1,a2)=>(_bm_web_key=Module["_bm_web_key"]=wasmExports["bm_web_key"])(a0,a1,a2);var _bm_web_encoder=Module["_bm_web_encoder"]=(a0,a1,a2)=>(_bm_web_encoder=Module["_bm_web_encoder"]=wasmExports["bm_web_encoder"])(a0,a1,a2);var _bm_web_master=Module["_bm_web_master"]=a0=>(_bm_web_master=Module["_bm_web_master"]=wasmExports["bm_web_master"])(a0);var _bm_web_midi=Module["_bm_web_midi"]=a0=>(_bm_web_midi=Module["_bm_web_midi"]=wasmExports["bm_web_midi"])(a0);var _bm_web_tick=Module["_bm_web_tick"]=a0=>(_bm_web_tick=Module["_bm_web_tick"]=wasmExports["bm_web_tick"])(a0);var _bm_web_render=Module["_bm_web_render"]=a0=>(_bm_web_render=Module["_bm_web_render"]=wasmExports["bm_web_render"])(a0);var _bm_web_fb=Module["_bm_web_fb"]=()=>(_bm_web_fb=Module["_bm_web_fb"]=wasmExports["bm_web_fb"])();var _bm_web_leds=Module["_bm_web_leds"]=()=>(_bm_web_leds=Module["_bm_web_leds"]=wasmExports["bm_web_leds"])();var _bm_web_sampler=Module["_bm_web_sampler"]=()=>(_bm_web_sampler=Module["_bm_web_sampler"]=wasmExports["bm_web_sampler"])();var _bm_web_sampler_cap=Module["_bm_web_sampler_cap"]=()=>(_bm_web_sampler_cap=Module["_bm_web_sampler_cap"]=wasmExports["bm_web_sampler_cap"])();var _bm_web_bpm=Module["_bm_web_bpm"]=()=>(_bm_web_bpm=Module["_bm_web_bpm"]=wasmExports["bm_web_bpm"])();var _bm_web_takes_free=Module["_bm_web_takes_free"]=()=>(_bm_web_takes_free=Module["_bm_web_takes_free"]=wasmExports["bm_web_takes_free"])();var _bm_web_takes_total=Module["_bm_web_takes_total"]=()=>(_bm_web_takes_total=Module["_bm_web_takes_total"]=wasmExports["bm_web_takes_total"])();var _bm_web_sampler_set=Module["_bm_web_sampler_set"]=(a0,a1)=>(_bm_web_sampler_set=Module["_bm_web_sampler_set"]=wasmExports["bm_web_sampler_set"])(a0,a1);var _bm_web_midi_out=Module["_bm_web_midi_out"]=(a0,a1)=>(_bm_web_midi_out=Module["_bm_web_midi_out"]=wasmExports["bm_web_midi_out"])(a0,a1);var _bm_web_lang_buf=Module["_bm_web_lang_buf"]=()=>(_bm_web_lang_buf=Module["_bm_web_lang_buf"]=wasmExports["bm_web_lang_buf"])();var _bm_web_lang_load=Module["_bm_web_lang_load"]=a0=>(_bm_web_lang_load=Module["_bm_web_lang_load"]=wasmExports["bm_web_lang_load"])(a0);var _bm_web_lang_on=Module["_bm_web_lang_on"]=()=>(_bm_web_lang_on=Module["_bm_web_lang_on"]=wasmExports["bm_web_lang_on"])();var _bm_web_sound_buf=Module["_bm_web_sound_buf"]=()=>(_bm_web_sound_buf=Module["_bm_web_sound_buf"]=wasmExports["bm_web_sound_buf"])();var _bm_web_sound_load=Module["_bm_web_sound_load"]=a0=>(_bm_web_sound_load=Module["_bm_web_sound_load"]=wasmExports["bm_web_sound_load"])(a0);var _bm_web_sound_count=Module["_bm_web_sound_count"]=a0=>(_bm_web_sound_count=Module["_bm_web_sound_count"]=wasmExports["bm_web_sound_count"])(a0);var _bm_web_view=Module["_bm_web_view"]=()=>(_bm_web_view=Module["_bm_web_view"]=wasmExports["bm_web_view"])();var _bm_web_playing=Module["_bm_web_playing"]=()=>(_bm_web_playing=Module["_bm_web_playing"]=wasmExports["bm_web_playing"])();var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["_emscripten_stack_restore"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["_emscripten_stack_alloc"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["emscripten_stack_get_current"])();var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise; return moduleRtn; diff --git a/web/control_mock.js b/web/control_mock.js index 3770023..3739cd2 100644 --- a/web/control_mock.js +++ b/web/control_mock.js @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2026 Erbubar23 // Un FM-1 de mentira para desarrollar la plataforma de control sin el aparato (control.html?mock=1). -// Contesta los mismos SysEx que hal/fm1/fm1_consola.c con respuestas como las de la 0.9.0-beta: +// Contesta los mismos SysEx que hal/fm1/fm1_consola.c con respuestas como las de la 0.10.0-beta: // 3 tomas, unos sonidos del usuario, el transporte parado. Las tomas y los borrados se guardan un // rato después, como en el aparato (un trabajo de flash al parar). window.bmMock deja tocar el estado // desde la consola del navegador o desde una prueba (bmMock.playing = 1, bmMock.busy = 1, …). @@ -15,7 +15,7 @@ const takeSect = (len) => Math.ceil((TAKE_HDR + len) / SECTOR); const sndSect = (size) => Math.ceil((size + 4) / SECTOR); const st = { - version: "0.9.0-beta", playing: 0, cpu: 38, dual: 0, heap: 96 * 1024, heapMin: 81 * 1024, busy: 0, late: 0, + version: "0.10.0-beta", playing: 0, cpu: 38, dual: 0, heap: 96 * 1024, heapMin: 81 * 1024, busy: 0, late: 0, takes: [{ len: 23851, bpm: 1610, bars: 1, pads: 8 }, { len: 16000, bpm: 1200, bars: 1, pads: 0 }, { len: 12000, bpm: 1280, bars: 1, pads: 0 }, null, null, null, null, null], snds: [ @@ -23,7 +23,7 @@ const st = { { eng: 3, size: 88, fp: 0x31C2, name: "FAT LEAD", author: "" }, { eng: 4, size: 88 + 32 * 156, fp: 0x7E10, name: "MY DX BANK", author: "" }, ], - lang: null, boot: Date.now() - 754000, log: "Bubba Machine 0.9.0-beta\nflash: zona de tomas leida, 3 tomas\nnucleo 1: listo\naudio: sonando\n", + lang: null, boot: Date.now() - 754000, log: "Bubba Machine 0.10.0-beta\nflash: zona de tomas leida, 3 tomas\nnucleo 1: listo\naudio: sonando\n", buf: [], arena: [], refused: [], }; diff --git a/web/emulador.html b/web/emulador.html index 2cb7efd..554de05 100644 --- a/web/emulador.html +++ b/web/emulador.html @@ -77,7 +77,7 @@
Bubba MachineEl audio arranca al pulsar (regla del navegador).
Bubba Machine -
Emulador del firmware 0.9.0-beta
El mismo código C99 que irá en el FM-1, compilado a WebAssembly.
+
Emulador del firmware 0.10.0-beta
El mismo código C99 que irá en el FM-1, compilado a WebAssembly.
@@ -181,7 +181,7 @@

Sampler y memoria

'e.lang': 'Para el transporte (PLAY) y prueba otra vez: escribir la flash corta el audio.' }; var EN = { - title: 'Firmware emulator 0.9.0-beta', + title: 'Firmware emulator 0.10.0-beta', sub: 'The same C99 code that will run on the FM-1, compiled to WebAssembly.', nav: 'HomeManualInstallCodeEspañol', on: 'Power on', diff --git a/web/en/docs/changelog.html b/web/en/docs/changelog.html index 0a7ce6f..a0b6230 100644 --- a/web/en/docs/changelog.html +++ b/web/en/docs/changelog.html @@ -47,6 +47,79 @@

Changelog

Every version of Bubba Machine. The format follows Keep a Changelog and versions follow semantic versioning: while the version starts with 0, any minor version may change how it plays or the pattern format.

+

[0.10.0-beta] - 2026-10-24

+

Every machine is its own instrument. HOME was rebuilt from scratch as a six-channel mixer, and entering a channel hands the whole FM-1 to its machine, laid out like the real one: TB-303, Minimoog, Juno-6, Vital and the FM-1's own DX7-style synth. The drums have a new step sequencer and the pad sampler became the BP-1 Slicer. Installed and running on the author's FM-1.

+

On first boot 0.10 erases the saved patterns and scenes once and loads three factory patterns. Takes and settings are kept. Until v1 there is still no backward compatibility.

+

Added

+
  • +Factory patterns: 1 = a recreation of Da Funk (Daft Punk, 111 BPM), 2 = Confusion in its Pump Panel Reconstruction from Blade (New Order, 136 BPM, the 303 line from a published sheet), 3 = Enjoy the Silence (Depeche Mode, 113 BPM, drums from a published grid). They are played by the stock machines; nothing is sampled. +
  • +Scene B of every pattern is all muted (the six channels, drums too) until you store another scene over it. +
  • +BX-7 is back: the FM-1's own FM synth inside Bubba. Six operators, the 32 algorithms drawn on screen, 8 voices, its own effects chain, EDIT per operator (OP1-OP6), ENV, LFO and an arpeggiator with 7 modes and LATCH that records. 31 factory sounds, 11 of them from famous records. +
  • +BB-303 laid out as a TB-303: CUTOFF, RESONANCE, ENV MOD and DECAY on K1-K4, ALGORITHM = ACCENT, a second page with TUNING, WAVE, SLIDE and VOLUME. SCL edits ACCENT per step (SCL again = SLIDE). FX is OVERDRIVE → DELAY → REVERB like a TB-03. A synced LFO page with classic waves and rhythmic shapes (PUMP, GATE, STEPS, 3-3-2, BUILD) on cutoff, pitch, resonance or volume. +
  • +B-MINI, BUNO-6 and BITTAL have their own menus, following the panel of each machine (Minimoog, Juno-6, Vital) in tabs with four big knobs, and the filter curve, oscillator shape or wavetable drawn under them. Each has DISTORTION, CHORUS and REVERB per channel; SCL edits ACCENT and GLIDE per step. +
  • +BP-1 Slicer (the last channel): EDIT trims a take and slices it into the pads (AUTO, 8 or 16 slices), always writing a sequence that plays like the loop; it can also record the mix from the next bar into a pad. Each pad has PITCH, LEVEL, MODE, REVERSE, ATTACK, RELEASE and loop points, and SEQ is a step grid like the drums with a LENGTH/SPEED layer. +
  • +Drum sequencer (BR-8): white keys = steps, black keys = quick access to the instruments, page arrows, REPEAT, and layers for ACCENTS, sound, instrument and MUTE SOUNDS. +
  • +Machine GLO on every machine: LENGTH (1-64 steps), MACHINE, MIDI CH and MIDI OUT; on page 2 QUANT (25-100 % for live recording) and RESET. +
  • +MIDI OUT per channel: a channel can send its notes over USB on its own MIDI channel (factory: T1 = 1 … T6 = 6). +
  • +Step recording: REC while stopped inside SEQ writes the key or chord on the cursor step and moves on; PLAY + REC rewrites only the steps you play. +
  • +tools/fm1/instalar.py installs from the computer with a log; consola.py estado shows the key-scan latency. +
+

Changed

+
  • +HOME is a mixer: K1-K4 = VOLUME, FILTER, DELAY and REVERB of the cursor channel, ALGORITHM = tempo, PRESETS = the channel's sound. White 1-9 = patterns (they change at the end of the bar), white 11-16 = channels, black 1-6 = mutes (hold = solo), black 8-11 = scenes A-D (hold a pattern + scene = store, tap = launch on the next bar, hold 3 s = delete). White 10 and black 7 do nothing. +
  • +9 patterns (was 10). +
  • +Choosing a machine: HOME's GLO › SELECT MACHINE or K2 on the machine's GLO. The drums stay on T1 and the Slicer stays last; the other channels pick BB-303, B-MINI, BX-7, BITTAL or BUNO-6. At most two heavy machines (BX-7, BUNO-6, BITTAL), each only once. +
  • +Menu buttons are cyclic: pressing a menu button again goes to its next page; HOME or another menu leaves. SELECT no longer turns pages. No help text on screen. +
  • +Recording works like SLOOP: a fixed length that wraps around and never grows. REC held 2 s clears the cursor channel's sequence, playing or stopped. +
  • +SAVE while playing waits and writes when you stop (the SAVE light blinks). SAVE has SAVE, SAVE AS and DELETE; SYSTEM keeps the basics. +
  • +Every knob is drawn once on screen; the SEL / ALG / PRE legends are bigger. +
  • +Pattern format 10. +
+

Fixed

+
  • +False safe mode after two quick power-offs: a boot only counts as failed if the next one starts from a chip reset. +
  • +Dim LEDs flickered: the key scan now times each LED on its own and makes up for interrupt latency. +
  • +Keys went dead after about 71 s (a timer could wrap around while being reprogrammed); the scan also re-arms itself if it stops. +
  • +A knob paused half-way through a click could count twice; key release takes 4 frames. +
  • +USB MIDI could lose note-offs. +
  • +The power-on key combo for safe mode did not read the keys. +
  • +Machine audit against the original manuals: BB-303 accent only on accented steps and slide only with a tie or legato playing; key stacks on mono machines; BX-7 transpose, osc sync and break point; B-MINI TUNE tunes everything; one BUNO-6 LFO per channel with its delay; several arpeggiator and recording fixes (wrong note lengths after a previous take, hung notes when turning the arp on). +
+

Removed

+
  • +From the 0.9 console: the channel card, CUE, FX › CHANNEL, the song, MORE, and the old SOUND / INSTR / MIX / PADS / TAKES / LOOP / SCALE / CHORDS menus. +
  • +FREE REC (a free-length first take). +
  • +User sound banks on the BX-7 for now: factory sounds only. +
+

Known issues

+
  • +In a long, very dense simulated session the voice brake can leave B-MINI almost silent in the last minute. +

[0.9.0-beta] - 2026-10-18

HOME is the console. Ten patterns, six channels, mutes, scenes and CUE on the keys, like an MX-1; REC plays and records any channel without leaving the console; each machine keeps its own GLO. Beta: not fully tried on the device yet.

0.9 has only 10 patterns: on first boot patterns 11-16 are dropped, and the song and the scenes start empty (their format changed). Patterns 01-10, settings, takes and your sounds are kept.

diff --git a/web/en/docs/credits.html b/web/en/docs/credits.html index 18e1b7d..b213e12 100644 --- a/web/en/docs/credits.html +++ b/web/en/docs/credits.html @@ -69,6 +69,15 @@

Factory sounds

Abstraction Mage, commit 023763ab9b39 — CC0-1.0

.bsnap files converted from a GPL-3.0 preset stay GPL-3.0, like the firmware. Vital is a synthesizer by Matt Tytel; Bubba Machine reads its preset format but has no relation to Vital or its author, and does not use its code.

+

Factory patterns

+

Patterns 1-3 are recreations, played by the stock machines (no audio sampled): Da Funk (Daft Punk), Confusion in its Pump Panel Reconstruction from Blade (New Order) and Enjoy the Silence (Depeche Mode). The songs belong to their authors; the patterns only take tempo, key, chords and published sequencer sheets:

+
  • +Confusion: the 303 line from the sheet on djjondent.blogspot.com, with the accents proposed on the Adafruit forums. +
  • +Enjoy the Silence: the drum grid from drum-patterns.com and the chorus chords from Hooktheory. +
  • +Da Funk: there is no published sheet; the notes follow Attack Magazine and Reverb Machine, and the order is by ear. +

What ships with the firmware or the emulator

ComponentWhereLicense
Emscripten runtimeinside web/bm.jsMIT / University of Illinois
AKWF waves (optional, only if you build with --akwf)core/gen/bm_rom.cCC0

Tools

diff --git a/web/en/docs/install.html b/web/en/docs/install.html index 4d47bc9..5956a5b 100644 --- a/web/en/docs/install.html +++ b/web/en/docs/install.html @@ -46,8 +46,8 @@ Design 0.2 (ES)

Installing Bubba Machine

-

Current status: beta (0.9.0-beta)

-

Bubba Machine for the FM-1 has a full firmware, with sound, a diagnostic firmware and a web installer. It runs on the author's FM-1, but it is a beta: tested on a single device and still changing a lot. 0.9.0-beta has not been fully tried on the device yet (it passes the automated tests and the emulator; do not install 0.6.0-beta: it was short of RAM); if something goes wrong, go back to the stock firmware from the installer, or to 0.8.0-beta: the installer only offers the latest version, so download bubba-machine-0.8.0-beta.fwsc from the GitHub releases and pick it under More options. Technical progress is in hal/fm1/README_PORT.md (Spanish).

+

Current status: beta (0.10.0-beta)

+

Bubba Machine for the FM-1 has a full firmware, with sound, a diagnostic firmware and a web installer. It runs on the author's FM-1, but it is a beta: tested on a single device and still changing a lot. 0.10.0-beta runs on the author's FM-1 (do not install 0.6.0-beta: it was short of RAM); if something goes wrong, go back to the stock firmware from the installer, or to 0.9.0-beta: the installer only offers the latest version, so download bubba-machine-0.9.0-beta.fwsc from the GitHub releases and pick it under More options. Technical progress is in hal/fm1/README_PORT.md (Spanish).

What you save may be lost when you update. There is no backward compatibility until v1: if a new version changes how patterns, the song, settings or takes are stored, the old data is erased on first boot and the demo comes back. If something matters to you, record it from the audio output before updating.

Every version is also published as bubba-machine-<version>.fwsc in the GitHub releases, for installers that use that package (such as the FM-1 Firmware Hub).

If you don't want to risk your FM-1, use the emulator (below): it runs the same code.

diff --git a/web/en/docs/manual.html b/web/en/docs/manual.html index 3922fbe..32caece 100644 --- a/web/en/docs/manual.html +++ b/web/en/docs/manual.html @@ -4,7 +4,7 @@ -Bubba Machine 0.9 — Manual · Bubba Machine +Bubba Machine 0.10 — Manual · Bubba Machine @@ -45,325 +45,235 @@ Memory budget (ES) Design 0.2 (ES)
-

Bubba Machine 0.9 — Manual

-

Bubba Machine turns the FM-1 into a live groovebox with six channels, each one a machine named after the one that inspired it. The drums (BR-8) and the pad sampler (BP-1) are fixed; T3-T6 choose their instrument among BB-303 (acid bass), B-MINI (three-oscillator mono), BX-7 (6-operator FM), BITTAL (wavetable that loads Vital presets) and BUNO-6 (polysynth with chorus). HOME is the BX-1 console: patterns, channels, mutes and scenes on the keys. Every channel has its own length and its own speed.

-

The goal is a hi-fi machine: every machine and the mix are computed live at 44.1 kHz / 24-bit in floating point, each machine has its own engine modeled on the real one, and both cores of the FM-1 can share the work (TWO CORES). See Audio quality.

-

The names recall famous machines (TR-8, OP-1, TB-303, Minimoog, DX7, Vital, Juno-6, MX-1), but Bubba Machine has no relation to their brands or makers.

-

The interface fits in two sentences: four gestures per button, and they mean the same thing on every button. HOME everywhere.

-

Every machine is its own instrument. On HOME you are at the BX-1 console, like a mixer for live sets: you launch patterns, mute, solo, launch scenes and mix. Enter a channel and the whole FM-1 belongs to that machine: its keys, buttons, knobs and lights work like the real machine it is named after, and you only edit a machine from inside it. HOME is the way out: a tap always takes you back to the console.

+

Bubba Machine 0.10 — Manual

+

Bubba Machine turns the FM-1 into a live groovebox with six channels, each one a machine named after the one that inspired it. The drums (BR-8, always T1) and the pad sampler (BP-1, the Slicer, always T6) are fixed; T2-T5 choose their instrument among BB-303 (the TB-303), B-MINI (Minimoog), BUNO-6 (Juno-6), BITTAL (wavetable, Vital) and BX-7 (6-operator FM, the FM-1's own engine). HOME is the BX-1 mixer: patterns, channels, mutes and scenes on the keys.

+

The goal is a hi-fi machine: every machine and the mix are computed live at 44.1 kHz / 24-bit in floating point, and each machine has its own engine modeled on the real one. See Audio quality.

+

The names recall famous machines (TR-8, TB-303, Minimoog, Juno-6, Vital, DX7, MX-1), but Bubba Machine has no relation to their brands or makers.

+

Every machine is its own instrument. On HOME you are at the mixer: you launch patterns, mute, solo, launch scenes and mix. Enter a channel and the whole FM-1 belongs to that machine: its buttons are that machine's menus and its knobs are its panel. HOME is the way out: a tap always takes you back to the mixer.

The screen is in English. Names that appear on screen are written here in CAPITALS exactly as you will see them. Other languages are packs you load from the control platform (see Screen language).

-

0.9 has 10 patterns. Coming from 0.8, patterns 01-10 are kept; 11-16 are dropped, and the song and the scenes start empty (their format changed). Until v1 an update may erase what you saved.

-

Four gestures per button

-
GestureWhenWhat it does
Tapunder 300 msOpens its page on the channel you are on. Again: the next page of the same button
Hold300 ms or moreIts live layer: while you hold it, the keys do that job and the screen draws the keyboard with what each key does. Let go and you are back
Hold 2 s2 s without touching anything elseIts settings or its dangerous action. A ring fills at the top with the name of what it opens; touching anything cancels it. Only on HOME, SEQ, EDIT, SAVE and REC
HOME + buttonwith HOME heldThe global version of the button: for the whole project, not just the channel
-

There are never two layers at once: with a layer open, holding another button does not open its own.

-

Questions. Anything that erases something asks first, and the control that asked answers: keep it held 2 s and a bar fills (KEEP HOLDING EDIT = YES); letting it go before, or touching any other control, is no. While a question is open only that control blinks. If a knob asked (for example INIT SOUND in the machine GLO), leaving it 2 s without touching anything else is yes.

-

+

First boot of 0.10: the pattern format changed, so the saved patterns are erased once and the three factory patterns are loaded (see Factory patterns). Takes, your sounds and the settings are kept. Until v1 an update may erase what you saved.

+

How the buttons work

+
  • +Menu buttons open their page with one press. Pressed again, a menu with several pages goes to its next page, in a circle (it does not exit); a menu with one page goes back to the machine's main page. Another menu, or HOME, leaves it. Holding a menu button does the same as a press. +
  • +Hold 2 s only on three buttons: HOME (SYSTEM), SAVE (quick save) and REC (clear the channel). A ring fills at the top with the name of what it does. +
  • +SELECT never turns pages. It moves a cursor where there is one (the channel, a step, a row, a block of 16 steps, an FX slot). +
  • +No help text on screen. The screen names what each key and knob does; how to use it is in this manual. +
  • +A control with nothing to do here does nothing, and its light is off. +

The lights

-

The FM-1's lights are white only: they never say what a key or button does (the screen does), only its state. The same six levels mean the same thing on every screen:

-
LightKeysButtons
OffDoes nothing here: no function, an empty instrument, outside the lengthDoes nothing on this screen
DimAvailable but empty, or has something but is silenced (a muted instrument or channel)Available
MediumHas something and will play: an instrument with steps, a saved pattern or scene, the root noteHas a special job right now (with HOME held, the ones that have a HOME + function)
OnSelected, held, active now, or a flash on every hitWhere you are, or a state that stays (octave shifted, note REC)
BlinkThe playhead, or something queued (a pattern, a scene, a mute on CUE)Needs you now: the control that asked a question, REC capturing, HOME with a pattern or scene in the queue
BreathA step with P-Lock, the EXIT key of a layer opened with a tap, CUE armed, the channel card you holdArmed or pending: REC armed, the layer you hold, SAVE with unsaved changes (on the console), PLAY waiting for external clock
+

The FM-1's lights are white only: they never say what a key or button does (the screen does), only its state. The same levels mean the same thing on every screen:

+
LightKeysButtons
OffDoes nothing here: no function, an empty pattern or instrument, outside the lengthDoes nothing on this screen
DimAvailable but empty, or has something but is silenced (a muted instrument or channel)Available
MediumHas something and will play: an instrument with steps, a saved pattern or scene, the root note—
OnSelected, held, active now, or a flash on every hitWhere you are, or a state that stays (octave shifted, REC on)
BlinkThe playhead, or something queued (a pattern, a scene)HOME when a pattern or scene is queued and you are not on the mixer; SAVE while a save waits for STOP
BreathA step with a P-LockThe layer that is open, REC armed, SAVE with unsaved changes, PLAY waiting for external clock

PLAY flashes on with the first beat of each bar and medium on the other beats. On the screen's key strip, an off key has a dark name, dim has a grey name with a border, medium a white name and on is filled.

The knobs

-
KnobOn HOME (the console)Inside a machine
SELECTThe cursor: picks the channel (on FX and GLO: the page or the row)The page (its name and dots at the top) or the row of a list. With a step held, its accent
ALGORITHMThe tempo (HOME + ALGORITHM: in tenths). On GLO, the value of the rowThe machine's mode (table below). On a list, it changes the highlighted value
PRESETSOn MIX: the cursor channel's sound (kit, patch or sound). On FX and GLO: MOVE (below)The sound: kit, patch or a sound from the bank
K1-K4On MIX, the cursor channel as a mixer strip: LEVEL · FILTER (DJ: left low-pass, right high-pass) · DELAY · REVERB. On FX and GLO, what the page showsWhatever the four dials at the bottom say
-

With HOME held from any screen: SELECT moves the cursor, ALGORITHM sets the BPM in tenths, PRESETS picks a pattern that loads when you let go, and K1-K4 are the cursor's mixer strip.

-

Entering a machine: on HOME, put the cursor on the channel (SELECT, or tap its white key 11-16) and tap SEQ, EDIT, ENV, LFO or ARP: you enter on that page. Or hold the channel's white key and let go (the channel card). From any screen, HOME + white 11-16 takes you to that machine when you let go of HOME.

-

ALGORITHM inside a machine (the mode):

-
MachineALGORITHM
BR-8Picks the instrument (with the box: big number, its name and model)
BP-1Picks the pad
BB-303The waveform: SAW or SQUARE
B-MINIMONO or LEGATO
BX-7The algorithm, 1 to 32
BITTALOscillator 1's table: its own or another bank sound's
BUNO-6The chorus: OFF, I, II or I+II
-

Priority: a question > the channel card > a layer > REC on a note channel > held step > list > channel > HOME.

-

The big knobs say what they do: the bottom line of the screen reads SEL · ALG · PRE with their job on that screen (for example SEL TRACK · ALG BPM · PRE KIT on MIX), and "-" when the knob does nothing there.

+
KnobOn HOME (the mixer)Inside a machine
SELECTThe cursor: picks the channel, top to bottom and aroundA cursor where the page has one (the step on SEQ, a block of 16 steps on SCL, the FX slot on the BX-7)
ALGORITHMThe tempo (BPM)The machine's main control (table below)
PRESETSThe cursor channel's sound: the kit, the preset, or the take of the selected padThe sound: kit, preset, or the selected pad's take
K1-K4The cursor channel as a mixer strip: VOLUME · FILTER (DJ: left low-pass, right high-pass) · DELAY · REVERB (the sends)What the screen shows
+

ALGORITHM inside a machine:

+
MachineALGORITHMOCT held + ALGORITHM
BR-8The instrument (a box shows its number and name; it is picked a moment later)—
BP-1The pad—
BB-303ACCENTTUNING
B-MINICUTOFF—
BUNO-6FREQ (the filter)—
BITTALCUTOFF—
BX-7The algorithm, 1 to 32TRANSPOSE ±12
+

Each knob is drawn once. Where the screen shows a machine's panel (or a list of four settings), the four dials at the bottom are not drawn again: the active knobs are in color, the rest grey. Elsewhere, the bottom strip shows K1-K4 as four dials with their value and name.

+

The big knobs say what they do: the bottom line reads SEL · ALG · PRE with their job on that screen (for example SEL TRACK · ALG BPM · PRE KIT on HOME), and "-" when the knob does nothing there.

How they feel:

  • Turning fast speeds up continuous values (BPM, cutoff, start); lists move one item per click, never skipping.
  • On/off settings: right = on (or next), left = off. They don't wrap around.
  • -MOVE, the DJ filter and PAN stop at the center for two clicks, so 0 is easy to find. -
  • -SELECT goes through a page's sub-pages first (SOUND, INSTR, PADS, ENV, MIX › DUCK), then to the next tab. +The DJ filter stops at the center (OPEN) for two clicks, so it is easy to find.
  • -Turning K1-K4 shows the name and value on the top line, without covering the screen; the big box is only for SELECT, ALGORITHM, PRESETS and the tempo, and it names the knob you turned. +Turning K1-K4 shows the name and value on the top line, without covering the screen; on a panel you see the knob itself move. The big box is for SELECT, ALGORITHM, PRESETS and the tempo.

The screen

Four strips, always in the same place:

  1. -Header: the machine you are on (BX-1 on the console; inside a channel, "<" and its name: HOME goes back), PLAY/REC, pattern and bar and the tempo in its own yellow. +Header: where you are (BX-1 on the mixer; inside a channel its machine, with "<": HOME goes back), PLAY/REC, the pattern (A01), bar.beat, the active scene and the tempo in yellow.
    • -A queued pattern reads A01>A05, with 4 blocks counting the beats down to the change. +A queued pattern reads A01>A03, with 4 blocks counting the beats to the change. A queued scene reads >B.
    • Six tiny cells show the channels: their color = playing, red = muted, white = a hit, outline = solo.
    • -SONG when the song is on; a green dot = autosaved; "CPU!" only if the audio does not keep up; while recording notes, the gate they are recorded with (TIE or G75%). +With external clock, EXT (or a red EXT? with no clock coming in) instead of BPM. A green dot = autosaved; CPU! only if the audio does not keep up.
    • -The 2 s ring, with the name of what it opens, and the battery. +The 2 s ring with what it does (SYSTEM, QUICK SAVE, CLEAR T3, DELETE SCENE A), and the battery.
  2. -Viewport: what each screen shows. On the console, its pages MIX · FX · GLO at the top (on FX and GLO, their sub-pages on the right). Inside a machine, the page name and one dot per page, O+1 / O-1 when the octave is shifted and AGAIN: ... with what tapping the page's button again does. The usage hints show for the first 4 seconds; the line that says how to exit stays. A layer opened with a tap says LATCHED. +Viewport: what each screen shows. Inside a machine, the page name at the top left (for example PANEL 1/2, FX 2/2 DELAY REVERB, TRIM 1/2) and its sound on the right. A layer opened on the drums says LATCHED and the sound page (OCT 1-8 or OCT 9-16).
  3. -Keyboard: the 11 black and 16 white keys with what each one does and the same state as its light. On the console: 01-10, T1-T6, M1-M6, A-D and CUE. On SEQ the white keys are the 16 steps; on a note channel, a mint bar marks long notes. Short fixed names: drums BD, SD, CH, OH, CP, LT...; HI / LO = the other section; < / > = step page; FIL = fill; X = exit. +Keyboard: the 11 black and 16 white keys with what each one does and the same state as its light. On the mixer: 01-09, T1-T6, M1-M6 and A-D. On the step sequencers the white keys are the 16 steps. Short fixed names: drums BD, SD, CH, OH, CP...; pads P1-P16; < / > = bar; RPT = repeat.
  4. -Knobs: K1-K4 as four dials with their value and name, in physical order; under them, what SELECT, ALGORITHM and PRESETS do. +SEL · ALG · PRE: what the three big knobs do here.
-

The palette: blue-black background, cyan for what is active, amber for values and the playing step, laser red for REC and mutes, mint green for long notes. A red border = the mix clipped.

-

The 14 buttons

-
ButtonTapAgainHold (layer)2 sHOME +
HOMEBack to the console, always on MIX—The console from any screen (see below)SYSTEM(it is the modifier)
SEQThe channel's steps (on the console: enters the cursor's machine)Notes: LOOP · sampler: BREAKLength and speedTIME of the 6 channelsConsole GLO › SONG
EDITSOUND (BP-1: PADS)The editor's next pageErase (on the console, black 7-10 clear a scene)Sampler: TAKES · others: INIT SOUND (asks)Copy the channel to another
ENVThe machine's envelope · INSTR (drums)The other envelopeAccent——
LFOThe machine's LFO (B-MINI, BITTAL, BUNO-6). On machines without an LFO it latches its layer: repeat (BR-8, BP-1) or tie (BB-303, BX-7); LFO again or HOME closes it—Repeat (grids) · tie (notes)——
FXInside: the channel's MIX. On the console: the FX pageInside: DUCK. Console: CHANNEL › DELAY › REVERB › MASTERPunch-in—The console's FX page
SCLInside: the channel's SCALE. On the console: GLO › SCALECHORDSLive chords—Console GLO › SCALE
ARPNotes: the channel's ARP. BR-8 and BP-1: the ROLL screen, kept open (ARP again or HOME closes it)—Arpeggio (notes) · ROLL while held (grids)——
SAVESave menuRun itCopy patternQuick saveSave as
GLOInside: the machine GLO. On the console: the console GLOMachine: back to the page you were on. Console: TEMPO › MACHINES › SCALE › SONGTranspose and TAP tempo—Console GLO
RECRecord. On the console: SLOOP-REC. On the sampler: the recorderLooper: overdub › playRecord only while held (on the console: SLOOP while held)Erase the channel at once, no question (for live use; HOME + OCT− undoes it). Not while anything is recording, nor on RECORD or TAKES. LOOP page: erase the loopSONG REC
PLAYPlay / stop———Back to step 1 without stopping
OCT − / +Octave of the keys on note machines (on the console too, for SLOOP). Nothing on drums and pads———Undo / redo
-

HOME: the console

-

-

The FM-1 has no SHIFT, so HOME does three jobs:

-
  1. -The BX-1 console: HOME is a machine of its own, with three pages: MIX, FX and GLO. A HOME tap always goes to MIX; FX opens FX and GLO opens the console GLO. MIX has one row per channel with its machine, its sequence (pulses for hits, mint blocks for long notes), LP or HP when its filter is on, and its volume with the peak. -
  2. -The console that follows you: holding HOME brings the console keys to any screen. You edit the bass and, without leaving, mute, launch a scene or queue the next pattern. -
  3. -Modifier: HOME + button = its global version (table above). -
-

If you used HOME as a modifier, letting go does not take you to the console: HOME only navigates on a clean tap. While you hold HOME, only the buttons with a HOME + function are lit (OCT−/+ only when there is something to undo or redo).

-

To clear a channel: REC held 2 s (instant; on the console, the cursor channel) or EDIT held + black 3 (CLR); HOME + OCT− undoes either.

-

Keys on the console (on HOME, or while holding HOME anywhere):

-
KeyWhat it does
White 1-10Patterns 01-10. Tap = queue it for the next cycle (when stopped: switches right away). Hold one and tap another: chain from the first to the second. On = playing, blink = queued, medium = saved, dim = empty
White 11-16Channels T1-T6. Tap = the cursor. Hold = the channel card (below). With HOME held: go to that machine when you let go of HOME
Black 1-6Mute T1-T6. Hold = solo while you hold it
Black 7-10Scenes A-D (see Scenes and song)
Black 11CUE: hold it (or tap it to keep it on) and the mutes you tap change together on the next bar
-

Mutes are live: they stay when the pattern changes.

-

The channel card

-

-

Hold a channel's white key (11-16) on the console and its card opens: its machine, its sound and, on T3-T6, the five machines it can be. Let go = enter that machine, on the page you last used. While you hold it:

-
  • -ALGORITHM changes the machine (T3-T6). Turn to one and leave it 2 seconds: a bar fills ("LOAD IN 1.4 S") and the channel becomes that machine. Moving away, or letting go of the key, cancels it. The notes, length, loop, ARP, scale and mix stay; the sound goes to the machine's first preset and per-note P-Locks are cleared. The machine is saved with the pattern. -
  • -PRESETS changes its sound (kit, patch or sound). -
  • -Turning any knob means letting go stays on the console (RELEASE = STAY ON MIX). -
-

Heavy machines, one at a time: BUNO-6 (it uses about a third of the processor) and BITTAL (its wavetables fill the memory) can only be on one channel. On another channel they show dimmed with "ON T6" and the screen says "BUNO-6 ALREADY ON T6". BB-303, B-MINI and BX-7 can repeat (a BX-7 on T3 is polyphonic too). The same rule applies when copying a channel or loading a pattern.

-

The same change is in GLO › MACHINES (below).

-

MIX

-

SELECT moves the cursor, ALGORITHM is the tempo (the tempo box is yellow and its four blocks flash with the beat), PRESETS changes the cursor channel's sound (a kit change can be undone with HOME + OCT−) and K1-K4 are its LEVEL, FILTER, DELAY and REVERB.

-

FX

-

FX on the console opens the FX page; FX again (or SELECT) goes CHANNEL › DELAY › REVERB › MASTER. ALGORITHM is still the tempo and PRESETS is MOVE.

+

The palette: blue-black background, cyan for what is active, amber for values and the playing step, red for REC and mutes, green for long notes and slides.

+

The buttons

+
ButtonOn HOMEInside a machine2 s
HOMEStays on the mixer (and leaves PLAY/REC)Back to the mixerSYSTEM
PLAYPlay / stopPlay / stop (with REC armed it also starts recording)—
RECOpens PLAY/REC already recording; in PLAY/REC, REC on / offNote machines: record (see Recording); BP-1: record the pads you playClear the cursor channel at once, playing or stopped
SAVEThe SAVE screenThe SAVE screenQuick save
GLOThe mixer GLO (machines, tempo and scale, master FX)The machine's GLO—
SEQ, EDIT, ENV, LFO, FX, SCL, ARPEnter the cursor channel's machine on that page (only the ones that machine has)That machine's menus (see each machine)—
OCT − / +Nothing (in PLAY/REC: octave, or soft / hard hits on the drums)The octave (note machines) or the sound page (step sequencers)—
+

HOME: the mixer

-
PageK1K2K3K4
CHANNEL (the cursor; white 11-16 change it)DRIVE (the channel's soft-clip; 0 = off)PANDUCK (sidechain from the T1 kick; T1 is the source)BEAT FX ON/OFF: whether the BEAT FX and the punch-ins touch this channel
DELAYTIME (1/16, 1/8, 3/16, 1/4)FEEDBACKMIXSIDECHAIN RELEASE
REVERBSIZEDAMPMIXSIDECHAIN RELEASE
MASTERFILTER (open in the middle; left low-pass, right high-pass)BEAT FX (one of the 16 punch-in effects stays on until you turn it back to OFF)DRIVE (saturation of the mix)—
-

MOVE (PRESETS on FX and GLO): at 0 the mix is untouched. To the left the master low-pass closes and the whole mix goes into the echo (darker, more repeats); to the right the master high-pass opens and the mix washes into the reverb. It is a live control: it is not saved.

-

GLO (the console's)

-

GLO on the console opens its global list; GLO again goes TEMPO › MACHINES › SCALE › SONG. SELECT picks the row, ALGORITHM changes it and PRESETS is MOVE.

-
PageRowsK1-K4
TEMPOBPM · SWING · MASTER LENGTH · TRANSPOSE · AUTO FILL (OFF, every 2, 4 or 8 bars)BPM · SWING · MASTER · TRANSPOSE
MACHINEST1-T6 and their machine. SELECT picks T3-T6 and ALGORITHM changes its machine, with the same 2 s wait and heavy-machine rule as the card—
SCALEROOT · SCALE · KEYS IN SCALE · BASE CHORD (the project's)the same four
SONGThe song's entries (see Scenes and song)PATTERN · TIMES · — · SONG ON/OFF
-

SCL on the console (or HOME + SCL) opens GLO › SCALE; HOME + SEQ opens GLO › SONG.

-

SLOOP-REC: play any channel from the console

+

HOME is a machine of its own, BX-1. One row per channel with its machine, its sequence (pulses for hits, green blocks for long notes), LP or HP when its filter is on, its volume and its peak. Channels appear in this order:

+
ScreenMachine (factory)Can be
T1BR-8fixed
T2BB-303BB-303, B-MINI, BUNO-6, BITTAL or BX-7
T3B-MINIthe same
T4BUNO-6the same
T5BITTALthe same
T6BP-1 (the Slicer)fixed
+

Keys on the mixer:

+
KeyWhat it does
White 1-9Patterns 01-09. Chosen when you let go: playing, it changes at the end of the bar (blink = queued); stopped, it loads at once (and the one you leave is saved if it changed). On = playing, medium = saved, off = empty
White 10Nothing: a gap so you don't change pattern by mistake
White 11-16Channels T1-T6. Tap = move the cursor there. Tap the cursor's channel again = PLAY/REC (below). On = the cursor, medium = has steps (it flashes with each hit), dim = empty
Black 1-6Mute T1-T6 (at once). Hold = solo while you hold it; tap other mute keys meanwhile to add them to the solo. Let go of the first one and the mutes are back as before
Black 7Nothing
Black 8-11Scenes A-D of this pattern (see Scenes)
+

Knobs: SELECT = cursor, ALGORITHM = BPM, PRESETS = the cursor's sound, K1-K4 = VOLUME (the same as each machine's VOLUME), FILTER, DELAY and REVERB.

+

Entering a machine: put the cursor on the channel and press one of its menu buttons: you enter on that page. Each machine lists its buttons below.

+

PLAY/REC: play any channel from the mixer

-

REC on the console (MIX or FX) arms the cursor channel and the keys stop being the console: they play that machine, without entering it. The viewport shows the channel as a piano roll, with SLOOP T3 BB-303 in red at the top. REC again (or entering a machine) gives the keys back to the console. Holding REC = SLOOP only while you hold it.

+

Tap the cursor's channel key again (or press REC, which enters already recording) and the keys stop being the mixer: they play that machine without entering it. The viewport shows the channel as a piano roll, with PLAY T2 BB-303 (or REC ... in red) at the top. HOME gives the keys back to the mixer.

  • -Note machines: the 27 keys are chromatic from F; bass machines (BB-303, B-MINI) play an octave lower. OCT−/+ shift the octave (shown at the top right). With KEYS IN SCALE on (GLO › SCALE), the white keys play the scale and the black keys its chords. +Note machines: the 27 keys are chromatic from F; BB-303 and B-MINI play an octave lower. OCT −/+ shift the octave (−2 to +2, shown at the top right). The keys of the scale are dim, the root medium (GLO › TEMPO AND SCALE).
  • -Drums and pads: the white keys are the 16 instruments or pads; hold black 1 (ACC) and the hits you play go with accent. +Drums and pads: the white keys are the 16 instruments or pads. On the drums, hold OCT+ for hard hits (accent) and OCT− for soft ones.
  • -Recording: while playing, what you play is written with the expressive REC; the notes of this pass show in red. On an empty note channel it is a FREE REC (the length closes when you leave SLOOP or change channel). Stopped, the keys only play. +SELECT changes channel and the keyboard (and the recording) follows it. The knobs are still the mixer's.
  • -SELECT changes channel and the keyboard follows it. Holding HOME gives you the console keys (mutes, scenes, patterns) while you hold it. +REC on / off. Recording works as inside the machines (Recording); drum and pad hits are added to their steps.

-

The six machines

-
ChannelMachineWhat it isTabs
T1BR-8Drums: TR grid of 16 modeled instruments (computed live); kits 808, 909 and SYNTHSEQ · SOUND · INSTR · MIX
T2BP-116 pads made from your takes, on a gridSEQ · PADS · BREAK · TAKES · MIX
T3-T6your choiceBB-303, B-MINI, BX-7, BITTAL or BUNO-6 (factory: BB-303, BX-7, BITTAL, BUNO-6)SEQ · SOUND · MIX · ARP · LOOP
-

The machine is changed from the console: the channel card or GLO › MACHINES. Inside, GLO opens the machine GLO.

-

Black keys follow a single grammar in SEQ: 1-8 are the channel's elements (instruments, pads or scale degrees), 9 and 10 turn the step page (< and >, lit when there is a page that way) and 11 is the other section on drums and pads (HI/LO) or FILL on note machines.

-

The sound of each machine

-

Everything is computed live; the sampler uses your takes.

-
MachineWhat it isK1-K4 on SEQPRESETS
BR-816 modeled instruments, each with its own model: BD 808, BD 909, SD 808, SD 909, HAT 808, METAL, clap, TOM (and congas), cowbell, RESON (rim, clave, block), noise or FMTONE · TUNE · DECAY · COLORKits 808, 909 and SYNTH
BB-303TB-303 bass after Open303: the 303's filter, the accent circuit (accented notes open the filter more and more), slide with TIE and the knob ranges of the TB-303CUTOFF · RESO · ENV MOD · DECAY12 sounds: the owner's manual sounds (E.BASS A and B, UPRIGHT, SYNTH BASS, INIT 1982) and acid classics
B-MINIThree oscillators (TRI, SHARK, SAW, SQUARE, WIDE, NARROW) in 32' to 2' ranges, noise, ladder filter with drive, two envelopes (CONTOUR and LOUDNESS), LFO and glideCUTOFF · EMPHASIS · CONTOUR · F DECAY18 sounds: Minimoog sound charts (basses, brass, leads) and recreations of famous Minimoog parts
BX-76 operators (msfa, the core of Dexed); the DX7's 32 algorithmsMOD LVL · FEEDBACK · DECAY · RELEASE20 patches from published DX7 recipes (e-piano, basses, bells, brass, organs…) and the voices of your .syx banks
BITTALTwo wavetable oscillators (up to 8 frames, alias-free on every note) with up to 4-voice unison, filter (LP 24/12, BP, HP or ladder) with drive, two ADSRs (ENV 2 can sweep the table, as on a PPG), LFO and 4 macrosThe sound's 4 macros (their name says where they go: CUTOFF, POSITION, LFO, SPACE…)26 sounds: PPG-style wavetables and community Vital presets, plus yours
BUNO-6One oscillator per voice (saw, pulse with PWM, sub one octave down and noise), 4-position high-pass, 24 dB resonant filter, one ADSR, delayed LFO and stereo chorusFREQ · RES · ENV · LFO16 sounds: Juno factory patches as starting points (strings, brass, pads, basses) and a few originals
-

BR-8's kicks, snares and hats are the Plaits models (Mutable Instruments), which imitate the 808 circuits and 909-style synthetic versions. With accent they hit differently, not just louder. The factory kicks are voiced to cut through the mix.

-

Historic sounds. Many factory sounds recreate the machine they are named after: published panel settings, sound charts and recipes translated to our parameters, plus sounds inspired by famous records. No audio was sampled and no factory data was copied. Their names only allude (CHICAGO 86, COLD FRIEND, POP RIFF…): no artist names or trademarks. Where each one comes from is in assets/presets/SOURCES.md.

-

The sound bank. B-MINI, BITTAL and BUNO-6 load sounds (.bsnap): their settings, their macros and, on BITTAL, their tables. Some factory ones come from freely licensed Vital presets (CC0, Unlicense and GPL-3.0; credits in CREDITS.md). Yours are added from the web editor (sounds): PRESETS goes through the factory ones first and then yours. The sound's fingerprint (#A4F9) shows at the top right of SOUND.

-

Editing the sound

-

SOUND is the machine's editor. Its pages follow the real machine's panel, in the same order and with the same names, 4 settings per page:

-
MachinePages (K1-K4)
BB-303VCO VCF (TUNING, CUTOFF, RESO, ENV MOD) · ENV (DECAY, ACCENT, SLIDE, WAVE)
B-MINICONTROL (TUNE, GLIDE, MOD RATE, MOD AMT: left = oscillators, right = filter) · OSC 1-3 (RANGE, FREQ, WAVE) · MIXER (OSC 1, OSC 2, OSC 3, NOISE) · FILTER (CUTOFF, EMPHASIS, CONTOUR, KBD CTRL) · F CONTOUR and L CONTOUR (ATTACK, DECAY, SUSTAIN, RELEASE) · OUTPUT (DRIVE, MODE, VEL FILT, VEL LVL)
BX-7ALGORITHM (ALG, FEEDBACK, MOD LVL, KEY VEL) · EG (R1 ATK, R2-3 DEC, R4 REL) · VOICE (PORTA, TRANSP) · LFO (SPEED, DELAY, PMD, AMD; on top of the patch's own LFO)
BITTALOSC 1 / OSC 1 + · OSC 2 / OSC 2 + (LEVEL, TRANSP, FRAME, UNISON · DETUNE, FINE, TABLE) · FILTER (MODEL, CUTOFF, RESO, DRIVE) · FILTER + (ENV2 AMT, KEYTRK, VELO, ENV2 POS: envelope 2 sweeps the table position) · ENV 1 / ENV 2 (A, D, S, R) · LFO 1 (SHAPE, RATE, DEST, AMOUNT) · MACRO 1-2 / 3-4 · VOICE. The oscillator pages draw the table in 2.5D, with the playing frame in cyan
BUNO-6LFO (RATE, DELAY) · DCO (LFO, PWM, PWM MODE, RANGE) · DCO WAVE (PULSE, SAW, SUB, NOISE) · HPF VCF (HPF, FREQ, RES, ENV) · VCF MOD (ENV +/-, LFO, KYBD, VELO) · VCA (ENV/GATE, VELO) · ENV (A, D, S, R) · CHORUS
-

K1-K4 change the page's 4 settings; above them, a drawing of what they do (the wave, the table, the filter curve, the envelope or the LFO). SELECT changes page (at the first or last one it moves to the next tab). EDIT again = next page. ENV opens the machine's first envelope (again: the second one). LFO opens the LFO page; the BB-303 has none, so LFO keeps its tie layer. The macros (K1-K4 on SEQ) take P-Locks per note.

-

BX-7: the algorithm

-

SOUND draws the algorithm as on a DX7: carriers at the bottom, modulators above, feedback in amber and each operator's level; below, each one's frequency ratio. ALGORITHM steps through all 32 (with MOD LVL, FEEDBACK, DECAY and RELEASE on top of the patch). DX7 .syx banks (32 voices) load from the web editor or with py -3 tools/fm1/sonido.py bank.syx.

-

Editing a drum instrument

-

INSTR (EDIT again, or ENV) has two pages: HIT (TUNE, DECAY, TONE and COLOR, named after what it does in that model) and INSTRUMENT (MODEL, LEVEL, CHOKE group and line LENGTH). EDIT again changes page. Black 1-8 pick the instrument and black 11 the other section.

+

GLO (the mixer's)

+

GLO on HOME opens three pages; GLO again = the next page, in a circle. HOME leaves. The mixer keys still work (patterns, mutes, scenes; white 11-16 move the cursor).

+
PageSELECT · ALGORITHMK1K2K3K4
SELECT MACHINE 1/3the channel · its machine————
TEMPO AND SCALE 2/3— · BPMSWING (50-75 %)SCALEROOTTRANSP (−12 to +12)
MASTER FX 3/3—DLY TIME (1/16, 1/8, 3/16, 1/4)DLY FDBKREV SIZEREV MIX
+

+

Changing a machine (T2-T5): on SELECT MACHINE, SELECT picks the channel and ALGORITHM turns to a machine. Leave it 2 seconds on one: a bar fills ("LOAD IN 1.4 S") and the channel becomes that machine. Moving away, or leaving GLO, cancels it. The notes, length and mix stay; the sound goes to the machine's first preset. The machine is saved with the pattern. T1 and T6 say FIXED. The same change is in each machine's GLO (K2 MACHINE).

+

Heavy machines: BUNO-6, BITTAL and BX-7 each fit on one channel only, and at most two heavy machines play at once. A heavy machine already on another channel shows "ON T4"; a third one says "2 HEAVY ON T4 T5" (where they are, so you can change one). BB-303 and B-MINI can repeat.

+

+

Scenes

+

A scene is a snapshot of the mutes: the six channels' mutes and the instrument mutes of BR-8 and BP-1. Each pattern has its own four scenes, on black 8-11 (A-D).

+
GestureWhat it does
Hold a pattern's white key + tap a sceneStores the mutes as they are now in that scene of that pattern
Tap a stored scene (medium)Launches it on the next bar (stopped: at once). On = the active one, blink = queued. An empty scene does nothing
Hold a scene 3 sDeletes it (a ring fills: DELETE SCENE A)
+

Scene B of every pattern comes with all six channels muted, drums included: a quick way to drop everything and bring it back with A. It stays until you store another scene over it (deleting it leaves it empty).

+

Factory patterns

+

On the first boot of 0.10 patterns 1-3 hold three recreations of famous tracks, played by the factory machines (no audio was sampled; the Slicer is empty):

+
PatternTrackTempoScenes
01Da Funk111 BPM, swing 54 %A everything · B all muted · C without the BB-303 · D the BB-303 with drums and bass
02Blade (Confusion, Pump Panel reconstruction)136 BPMA everything · B all muted · C drums and BB-303 · D without drums
03Enjoy the Silence113 BPMA everything · B all muted · C drums and bass · D without drums
+

Patterns 04-09 start empty.

Drums (BR-8)

-

The SEQ screen is a matrix: 16 instruments × the 16 steps of the page. Each line shows its own playhead, because each instrument can have its own length.

-
ControlDoes
White keysSteps of the selected instrument: tap = set or clear
Black 1-8Select (and play) an instrument of the section
Black 9 · 10Step page < and > (when the line is longer than 16)
Black 11Tap: the other section (instruments 1-8 / 9-16, HI / LO). Hold: MUTES while you hold it: the white keys mute or unmute each instrument. Only instruments with steps are lit: medium and flashing on every hit = plays, dim = muted, off = empty. On screen a muted instrument turns red
OCT − / +Nothing (off)
-

Hold a step + turn: K1-K4 = P-Lock of TONE, TUNE, DECAY or COLOR on that step only · SELECT = accent · ALGORITHM = repeat ×1 to ×4 or FLAM · PRESETS = condition (ALWAYS, FILL ONLY, NO FILL).

-

Fills: a step with FILL ONLY plays only in the fill, NO FILL only outside it. The fill plays with AUTO FILL (console GLO › TEMPO: every 2, 4 or 8 bars) or while you hold black 11 inside ROLL (FILL + ROLL).

-

INSTR (EDIT again, or ENV): level, tuning, decay and line length of each instrument. For example, a 12-step hi-hat against a 16-step kick.

-

SOUND: the kit's 16 pads; K1-K3 = tone, tuning and decay, K4 = COLOR (shifts each instrument's color). Changing the kit with PRESETS can be undone (HOME + OCT−).

-

ROLL (ARP)

-

Like a drum machine's roll button. A tap on ARP keeps the screen open (ARP again or HOME closes it); holding ARP shows it only while held.

-
ControlDoes
White keysThe 16 instruments: hold one and it rolls, locked to the bar. Lit medium if it has steps, dim if empty; every hit flashes
Black 1-6Rate: 1/8, 1/16, 1/32 and their triplets (8T, 16T, 32T)
Black 7 · 8CRESC (the roll gets louder) · DECRESC (it fades)
Black 11The fill plays while held: FILL + ROLL for the build-up
K1-K4RATE · ramp length of the crescendo (1/4 to 2 bars) · SWING (50-75 %) · TAIL (the roll keeps going after you let go: OFF, 1/16, 1/8, 1/4)
-

With REC on, the roll is written into the steps as repeats; with a crescendo, the loud hits become accents. The settings are live: they are not saved.

-

Pad sampler (BP-1)

-

T2 is a 16-pad sampler, like a KO II or the drum sampler of an OP-1 field: each pad is a piece of one of your takes, and a grid just like the drums plays them.

-

How you work:

-
  1. -Record a take (REC on T2, see Recorder) or upload it from the computer. -
  2. -The take builds the kit: if the kit is empty, when the take is saved it is cut on the hits and each cut goes to a pad. The grid is written so it plays like the take; you change it from there. -
  3. -In TAKES you choose which take goes to which pad: N1 builds a new kit on the hits, N2 in 16 equal parts, N3 in 8, and N4 puts the whole take on the selected pad. A kit can mix several takes. -
  4. -In PADS you tune each pad: where it starts and ends, its pitch, its level, how it answers the key and its envelope. -
  5. -In SEQ you program the pads like the drums, and BREAK varies them bar by bar. -
-

The tabs: SEQ · PADS · BREAK · TAKES · MIX. The kit lives in the pattern, like the drum kit; the takes, in the library.

-

SEQ: the pad grid

-

Just like the drums: one line per pad, 8 on screen. Each pad has its own length.

-
ControlDoes
White keysSteps of the selected pad: tap = set or clear
Black 1-8Select and play a pad of the section
Black 9 · 10 · 11Step page < and > · other section (pads 1-8 / 9-16); hold 11 = MUTES
K1-K4FILTER (low-pass) · PITCH (±12 semitones) · DECAY · START (shifts the start of every pad)
Held step + K1-K4P-Lock on that step: a pad higher, shorter or from further in, only there
-

The layers work as on the drums: accent, repeat, erase, ROLL (ARP; the white keys are the pads) and per-line lengths in TIME. Inside ROLL, REC records what you play into the pattern, not a sample.

-

PADS (EDIT): each pad's editor

-

At the top, the map of the pad's take, with every pad of that take marked and the zoom box. In the middle, the big waveform, with the pad in cyan brackets and the other pads of the take with their number. At the bottom, one cell per white key, in the same place as the key: filled = it has sound, outlined = the selected pad. The orange line is what is playing.

-

EDIT again changes page: TRIM › SOUND › ENV › LOOP (the current one is amber, top right). ENV also opens the ENV page.

-
PageK1K2K3K4
TRIMSTART (the end stays)END (the length)ZOOM X1-X8SNAP: OFF, 1/16, 1/8
SOUNDPITCH (±24 st)LEVELPLAY: ONESHOT, KEY, THRU, LOOPDIR: FWD or REV
ENVATTACKRELEASECHOKE groupTEMPO: follows the BPM or not
LOOPLOOP INLOOP OUT (WHOLE = the whole pad)PLAY—
-

How the key answers (PLAY):

+

T1 is a drum machine of 16 modeled instruments (computed live), with the kits 808, 909 and SYNTH on PRESETS. From HOME with the cursor on T1: SEQ opens the sequencer, and LFO, ENV, EDIT and SCL open the sequencer with their layer. SEQ again (or HOME) goes back to the mixer.

+

+

The sequencer shows 8 instruments (a sound page: 1-8 or 9-16) × the 16 steps of the bar you see. Each line has its own playhead.

+
ControlDoes
White keysThe steps of the selected instrument: tap = set or clear. Hold a step and turn K1 = its accent, K2 = its repeat (X1-X4 or FLAM)
Black 1-8Pick (and hear) an instrument of the sound page
Black 9 · 10The previous / next bar, in a circle (dim with one bar only)
Black 11 (RPT)REPEAT: tap = keep it open (black 11 again closes it), hold = only while held. The white keys cycle X1 › X2 › X3 › X4 › FLAM on each step
OCT − / +The sound page: instruments 1-8 or 9-16
K1-K4LEVEL of the instrument · LENGTH of the whole kit (1-64 steps) · DECAY · TONE
ALGORITHM · PRESETSThe instrument · the kit
+

The layers (one press opens it, the same button closes it; another button closes it and does its own job). On all of them black 1-8 pick an instrument without sounding and black 10 · 11 change the bar.

+
ButtonLayerWhite keysKnobs
LFOACCENTSAccent on / off on each step (an empty step becomes a hit with accent). The 16 steps are drawn above their keysK1 = how much accent (the channel's)
ENVSOUNDPick and hear an instrument; its hit is drawnTUNE · DECAY · TONE · COLOR (COLOR is named after what it does in that model)
EDITINSTRUMENTPick an instrumentALGORITHM = its model (any model on any instrument) · K1 MODEL · K2 LEVEL · K3 CHOKE
SCLMUTE SOUNDSMute or unmute each instrument (black 1-8 too)—
+

+

In MUTE SOUNDS the lights are fixed: on = plays, dim = muted, off = no hits.

+

BR-8's kicks, snares and hats are the Plaits models (Mutable Instruments), which imitate the 808 circuits and 909-style synthetic versions. With accent they hit differently, not just louder.

+

To record drums live, use PLAY/REC from HOME.

+

The note machines

+

BB-303, B-MINI, BUNO-6, BITTAL and BX-7 share the same base:

  • -ONESHOT: plays whole even if you let go. +Keys: chromatic from F, played live. OCT − / + change the octave when you let go (±3); both together set octave and transpose back to 0.
  • -KEY: plays while you hold. +PRESETS: the machine's factory sounds; B-MINI, BITTAL and BUNO-6 also show the sounds you added from the control platform.
  • -THRU: plays the pad and, held, keeps going through the rest of the take. +SEQ: the channel as a piano roll, one page of 16 steps (the page of the playhead when playing, of the cursor when stopped). SELECT moves the step cursor. K2 SPEED (×2 to ×1/4), K3 PAGE (the 16 steps you see), K4 SCROLL (the pitches you see). SEQ again = the main page.
  • -LOOP: repeats the pad while you hold. With the LOOP page it repeats only a section (the OP-1's sustain loop): held, that section repeats; when you let go, it plays on to the end of the pad. The section shows in mint over the waveform. -
-

From the grid, KEY and LOOP play for one step.

-
KeyDoes
White keyPlays its pad and selects it. With REC + PLAY, the hit goes on its line
N1 · N2 · N3CPY copies the pad · PST pastes it on the selected one · CLR empties it
N4 HITMoves the start to the nearest hit
N9 · N10 · N11Reverse · half speed · STUTTER, while held
PRESETSAnother whole take on the selected pad
-

TEMPO: a pad that follows the tempo plays at the project BPM / the take's BPM (like a chopped loop). Kits built from a take have it on, and their pads choke each other (group 1), like the original loop.

-

BREAK (SEQ again)

-

The idea of X0X's BREAK, on your grid: every bar varies what plays with a seed. With the four knobs at 0, the grid plays as is (the default).

-
  • -YOU row: the pad you programmed on each step. +ARP (2 pages): MODE (OFF, UP, DOWN, INCL, EXCL, RANDOM, ORDER, REPEAT) · OCTAVE (1-4) · RATE (1/8, 1/16, 1/32) · GATE (20-100 %); page 2: LATCH. With REC on, the arpeggio is recorded.
  • -PLAYS row: what is going to play this bar. In yellow, the steps that changed. Orange line = repeat, < = reverse, H = half speed, - = silence. +GLO (2 pages): LENGTH (1-64 steps) · MACHINE (only the machines this channel can have now; leave it 2 s on one to load it) · MIDI CH · MIDI OUT (the channel also sends its notes over USB MIDI on its MIDI CH); page 2: QUANT (K3) · RESET (K4: turn it and the sound goes back to its preset). The BX-7 has TRANSP on K1 of page 2.
-
KnobDoes
VARYHow many steps play another pad of the kit
ANCHORThe strong beats (1, 5, 9, 13) stay as they are
REPEATRetrigs from 2X to 8X
BREAKReverse, half speed, silences and repeating the previous step
-

EDIT held + black 4 (CAPT) writes into the grid what BREAK is doing in this bar. HOME + OCT− undoes it.

-

The drawing is the mirrored waveform, as on a sampler: the peak in the dark shade and the energy (RMS) on top, in full color.

-

Recorder (REC on the sampler)

-

Recording, keeping and building the kit are separate steps.

-
  1. -RECORD: REC on T2 opens the recorder armed (on PADS, REC records what you play into the grid). It starts at the next bar (K1 = START: BAR or NOW). A big number says the seconds left: the smaller of the recording RAM (3 s) and the free take memory. White lines mark how many bars fit and the amber one is the limit. REC again = stop; it also stops by itself at the limit. Holding REC on the recorder records only while held. -
    • -Below the number: the free take memory in seconds and KB, and the maximum per take (3 s). -
    • -While recording the keys are silent and the delay and buffer-based punch-ins pause (they share the memory). -
    • -The take stays UNSAVED: the white keys play it in 16 parts. It is saved when you stop the transport, because writing flash stops the audio, and if the kit was empty, it builds it. HOME asks before discarding it: hold HOME 2 s = discard; a HOME tap keeps it and goes to the console. -
    -
  2. -TAKES (EDIT 2 s on T2, or the tab): the library, with the waveform of the marked take. ALGORITHM picks; K1-K3 = the take's BPM, bars and gain; white keys play it in 16 parts (held: it keeps going). Black 1 (HIT) = kit on the hits, black 2 (16) = 16 equal parts, black 3 (8) = 8, black 4 (PAD) = the whole take on the selected pad, black 11 (DEL) = delete (asks: keep it held 2 s; its pads become empty). If the kit already has pads, building a new one asks. A yellow dot = the kit uses that take. -
-

How much fits: up to 6 s of takes in total (8 bits at 16 kHz = 16 KB per second, up to 3 s per take). They live in the 100 KiB flash zone shared with your bank sounds: takes from the bottom and sounds from the top. TAKES shows what is free of the 6 s and how many of your sounds are on top; the control platform shows all the memory and warns before it fills up.

-

Note machines (T3-T6)

+

+

Recording (like SLOOP)

+

Recording follows SLOOP: the channel keeps its length; at the end it goes around and what you play rewrites the steps you touch. Recording never makes a channel longer.

  • -SEQ: the page is only about this channel. On top, the page's 16 steps as a piano roll: each note at its pitch and with its length (long ones in mint, early or late ones shifted from their step). White keys are those steps (up to 4 notes per step). Below, the channel's bars and the playhead. Hold a step and play black 1-8 to write those notes of the channel's scale (the same one again removes it). Black 9 and 10 turn the step page; 11 = FILL. -
  • -OCT − / + shift the octave of everything the keys play, also the scale degrees on black 1-8 in SEQ (O+1 / O-1 at the top). +Playing: REC records at once. The first time you touch a step in a pass, what was there is replaced; notes added in the same pass make a chord. Steps you don't touch stay. Each note keeps how long you held it (never longer than the bar it starts in, nor than the channel).
  • -Long note with two white keys: hold the step where it starts and tap the white key where it ends: the note lasts from one to the other. The lights of the keys it covers stay dimmed, like a trail. +Stopped, outside SEQ: REC arms (REC ARMED: PLAY A NOTE, REC breathes): the first note starts playback and records. PLAY also starts it.
  • -Free recording, like a looper: on an empty note channel, REC records with no fixed length (the screen says FREE REC and counts the bars). REC again closes it: the channel keeps the whole bars you played (1 to 4) and every note keeps how long you held it (up to 4 bars). If the channel already has notes, REC records over it with its length. +Stopped, on SEQ: STEP REC. The key (or chord) rewrites the step under the cursor and the cursor moves on when you let go; SELECT moves the cursor (skipping steps = rests). Each note is one step long.
  • -Length in bars: SEQ held + black 7-10 = 1, 2, 3 or 4 bars. +QUANT (GLO page 2): how much of your timing is corrected, 25 / 50 / 75 / 100 % (100 % = exactly on the step). Only the start; the length stays as you held it.
  • -Held step + knobs: K1-K4 = P-Lock · SELECT = hit (NORMAL › ACCENT › GHOST) · ALGORITHM = probability or fill · PRESETS = length or TIE (glide). -
  • -FILL (black 11): a tap keeps the screen open (black 11 again or HOME closes it), holding shows it only while held. While open the fill plays, and the white keys make notes fill-only (again: back to normal); black 9 / 10 turn the page. -
  • -LOOP (SEQ again): unquantized looper. K1 ON/OFF · K2 bars (1, 2 or 4). REC arms (starts at the bar) › when the loop closes it goes to PLAY › REC again: OVERDUB › REC: PLAY. REC 2 s erases the loop. -
  • -Outside SEQ the keys play the machine chromatically; with KEYS IN SCALE (console GLO › SCALE) the white keys play the scale and the black keys its chords. -
  • -MIDI OUT (in the machine GLO): the channel plays and also sends its notes over MIDI on its channel. +REC held 2 s clears the channel, playing or stopped.
-

PIANO ROLL view

+

BB-303

+

The TB-303, after Open303: the 303's filter, the accent circuit, slide and the TB-303's knob ranges, with the TB-03's effects. 12 sounds.

-

Machine GLO › VIEW = PIANO ROLL (ALGORITHM to the right; to the left, NOTES) shows SEQ as the whole loop (1 to 4 bars) instead of one page: the pitch rows fit the notes the channel has, a vertical keyboard on the left flashes with what plays, and a white bracket marks the 16 steps the white keys edit (black 9 / 10 move it). With REC on, the notes recorded in this pass are red. The keys work exactly as in the normal view. VIEW is a setting of each channel: it stays after power-off.

-

Expressive REC

-

With REC on a note channel (inside it, or with SLOOP-REC from the console), what you play stays as you played it:

+
ButtonPage
EDITThe panel: page 1 CUTOFF · RESO · ENV MOD · DECAY; page 2 TUNING · WAVE (SAW / SQUARE) · SLIDE (its time) · VOLUME. ALGORITHM = ACCENT
SEQThe piano roll (accents in white, slides in green)
SCLACCENT of each step: the 16 white keys are the 16 steps of the block (on = accent, dim = has a note); SELECT changes block. SCL again: SLIDE of each step
FXPage 1 OVERDRIVE (DRIVE, TONE, LEVEL, ON); page 2 DELAY · DLY ON · REVERB · REV ON. DELAY and REVERB are the channel's sends (the same as on HOME). Fixed order: OVERDRIVE › DELAY › REVERB
LFOAn addition (the 303 has none): RATE (1/16 to 8 BARS, locked to the tempo) · DEPTH · WAVE (SINE, TRIANGLE, SAW UP, SAW DOWN, SQUARE, S&H and the patterns PUMP, GATE, STEPS, 3-3-2, BUILD) · DEST (CUTOFF, PITCH, RESO, VOLUME)
ARP · GLOAs on every note machine
+

Slide live: press the next key before letting go of the last one (legato) and the note slides; with REC on it is recorded as a slide to the next note. ENV does nothing on the BB-303.

+

B-MINI, BUNO-6 and BITTAL

+

The three panel machines share one layout, after the Behringer POLY D: each section of the real panel on its button, the sections as tabs at the top and four big knobs. Under the panel, a drawing of what you edit (the filter curve, the oscillator's wave, the envelope).

+
ButtonB-MINI (Minimoog)BUNO-6 (Juno-6)BITTAL (Vital)
EDITFILTER (CUTOFF, EMPHASIS, CONTOUR, KBD CTRL) · OSC 1 (RANGE, WAVE, LEVEL, TUNE) · OSC 2 and OSC 3 (RANGE, FREQ, WAVE, LEVEL; OSC 3 has the LO range) · OUTPUT (NOISE, GLIDE, MODE, VOLUME)VCF (FREQ, RES, ENV, LFO) · DCO (RANGE, PULSE, SAW, SUB) · DCO MOD (LFO, PWM, PWM MODE, NOISE) · VCF MOD (HPF, ENV +/-, KYBD, VELO) · VCA (ENV/GATE, VELO, VOLUME)OSC 1 / OSC 2 (LEVEL, TRANSP, FRAME, UNISON) · OSC 1 + / OSC 2 + (DETUNE, FINE, TABLE) · FILTER (MODEL, CUTOFF, RESO, DRIVE) · FILTER + (ENV2 AMT, KEYTRK, VELO, ENV2 POS) · VOICE (MODE, GLIDE, VELO, VOLUME)
ENVFILTER and LOUDNESS contours (ATTACK, DECAY, SUSTAIN, RELEASE)One ADSRENV 1 and ENV 2 (ADSR)
LFORATE · WAVE (TRI, SQUARE) · MOD MIX (OSC 3 ↔ LFO) · AMOUNT; page 2 DEST (OSC, FILTER, BOTH)RATE · DELAYSHAPE · RATE · DEST · AMOUNT; MACRO 1-2 and MACRO 3-4: where each macro goes and how much
ALGORITHMCUTOFFFREQCUTOFF
+

The same on the three:

  • -The note keeps its real timing: the start with its micro-timing (how early or late you were, in ticks) and the end with its gate (how much of the last step sounded). If the note is still held when the bar ends, it is cut at the bar. +FX: page 1 DISTORTION (DRIVE, TONE, LEVEL, ON); page 2 CHORUS (OFF, I, II; the BUNO-6 also I+II) · REVERB (the channel's send) · REV ON. Their delay is set from HOME (K3).
  • -The knobs stay on the note: while you hold a note while recording, whatever you turn on K1-K4 stays on that note (P-Lock). +SCL: ACCENT of each step on the 16 white keys (SELECT = block of 16); SCL again: GLIDE of each step.
  • -Editing the step with REC: SELECT picks a step (red box), ALGORITHM its gate (from 10 % staccato to 95 % = the whole step, and 100 % = TIE, tied to the next one) and PRESETS its micro-timing (−11 to +11 ticks). The header shows the gate you are recording with. +SEQ, ARP, GLO as on every note machine.
-

The machine GLO

+

BITTAL draws under its panel the waves of its two tables at their position (the one that plays; silent, the FRAME setting).

+

+

BX-7

+

The FM-1's own FM engine inside Bubba: 6 operators (msfa, the core of Dexed) and the DX7's 32 algorithms. 31 factory patches; your .syx banks are not offered on the FM-1 for now.

-

GLO inside a machine opens its list; GLO again goes back to the page you were on. SELECT picks the row and ALGORITHM changes it.

-
MachineRowsK1-K4
Note machinesVIEW (NOTES or PIANO ROLL) · LENGTH · SPEED · TRANSPOSE · ACCENT · MIDI OUT (and its MIDI CHANNEL) · INIT SOUNDLENGTH · SPEED · ACCENT · TRANSPOSE
BR-8LENGTH · SPEED · ACCENT · INIT KITLENGTH · SPEED · ACCENT
BP-1LENGTH · SPEED · ACCENT · INTERPOLATION (LINEAR or HERMITE) · INITLENGTH · SPEED · ACCENT
-

On INIT, ALGORITHM to the right asks; leave it 2 s and the sound goes back to its initial settings. To change the machine itself, go to the console (the screen says so: CHANGE: HOLD T4 ON HOME + ALG).

-

The layers (hold)

-

While you hold, the screen draws the keyboard with what each key does and its LEDs; on the drums it shows the 16 instruments. Only the buttons that do something in the layer stay lit. The sequence keeps playing.

-
HoldLayerThe keys
HOMEThe consoleWhite 1-10 = patterns · white 11-16 = go to that machine when you let go · black 1-6 = mute / solo · 7-10 = scenes · 11 = CUE. SELECT = cursor · ALGORITHM = BPM in tenths · PRESETS = pattern (loads when you let go) · K1-K4 = the cursor's mix
SEQLength and speedWhite = length (1-16): the length is on, inside it medium, outside dim · black 11 = +16 (17-32, 33-48, 49-64) · black 1-6 = speed ×2 to ×1/4 · black 7-10 = 1-4 bars (1BR-4BR). K1 = length, K2 = speed
EDITErasePlaying: holding a white key erases what passes under the playhead; stopped: erases the line or the step · black 1-3 = copy, paste, clear the channel · sampler: black 4 = CAPT (what BREAK does goes into the grid) · black 6 / 7 = undo / redo · notes: black 9 / 10 = page · on the console: black 7-10 clear a scene
ENVAccentWhite = accent on / off (empty step = new one with accent; on notes: NORMAL › ACCENT › GHOST) · black 9 / 10 = page. K1 = how much accent
LFORepeat · tieGrids: white = ×1 › ×2 › ×3 › ×4 › FLAM. Notes: white = tie the note to the next one (K1 = glide). Black 9 / 10 = page. On machines without an LFO page a tap on LFO keeps this layer open
FXPunch-inWhite = 16 effects quantized to 1/16 · black 1-6 still mute
SCLChordsWhite = 16 chords · black 1-4 = +7, +9, SUS2, SUS4
ARPArpeggio · ROLLNotes: what you play is arpeggiated · grids: the ROLL screen (see Drums): white = roll, black 1-6 = rate, 7-8 = CRESC / DECRESC, 11 = FILL; with REC it is recorded as repeats
SAVECopy patternWhite 1-10 = paste the pattern there · black (1-6) + white = only that channel. If the target has notes, it asks: keep the white key held 2 s
GLOTransposeThe whole keyboard transposes the project (C4 = 0) · PLAY = TAP tempo without stopping · K1 = BPM, K2 = SWING, K3 = transpose, K4 = octave
-

Time (SEQ 2 s)

-

Shows the 6 channels as bars of their real duration, each with its playhead: polymeter at a glance. SELECT or ALGORITHM pick the channel; K1 = length (1-64); K2 = speed (×2, ×3/2, ×1, ×3/4, ×1/2, ×1/4); K3 and K4 (grids): an instrument and its length.

-

The master length (console GLO › TEMPO, K3: 16, 32, 48, 64, 128 or INF) restarts all channels together. Queued patterns change there.

-

Scales and chords

-
  • -SCALE (SCL inside a note machine): each note channel can have its own scale. K1 = ROOT, K2 = scale (PROJECT, or one of 9 scales), K3 = BASE CHORD, K4 = KEYS IN SCALE. +
    ButtonPage
    MAIN (a one-page menu's button again)The algorithm drawn as on a DX7 (carriers at the bottom, modulators above, feedback as a loop, each operator's level), and FEEDBACK · BRIGHT · PORTA · KEY VEL
    EDITBlack 1-6 = OP1-OP6, each in 6 pages (RATES, LEVELS, FREQ, OUTPUT, SCALING, CURVES; EDIT again = next page) · black 7 PIT (PITCH RATES, PITCH LEVELS) · black 8 GLO (VOICE: ALGORITHM, FEEDBACK, OSC SYNC, TRANSP) · black 9 MONO · black 10 POLY. The white keys keep playing
    ENVATTACK · DECAY · SUSTAIN · RELEASE, on top of the patch's envelopes
    LFOPage 1 WAVE · SPEED · PMD · AMD; page 2 DELAY · P SENS · LFO SYNC · OSC SYNC
    FXIts own chain of six slots, one at a time: FILTER (TYPE LP/BP/HP, CUTOFF, RESO), REVERB and DELAY (SEND: the channel's sends), DIST (GAIN, TONE, LEVEL), CHORUS and PHASER (RATE, DEPTH, MIX); K4 = ON on all. SELECT moves between slots. SCL picks up the slot and SELECT moves it along the chain (SCL again places it); REVERB and DELAY always go after the effects. Only the slots that are on process
    SEQ · ARP · GLOAs on every note machine (GLO page 2 has TRANSP)
    +

    ALGORITHM changes the algorithm (with the drawing in view you see it change). OCT held + ALGORITHM = transpose.

    +

    +

    The Slicer (BP-1)

    +

    T6 is a 16-pad sampler, like a KO II: each pad is a piece of a take (its own start and length; pads may overlap), played by a step grid like the drums'. From HOME with the cursor on T6: SEQ opens the grid, LFO and SCL the grid with their layer, and EDIT, ENV and FX the machine's pages.

    +

    How you work:

    +
    1. +Get a take: upload it from the control platform, or record what is playing with SMP (below).
    2. -Project scale: console GLO › SCALE (SCL on the console, or HOME + SCL): ROOT, SCALE, KEYS IN SCALE and BASE CHORD, used by channels without their own. +Put it on a pad (PRESETS = the whole take on the selected pad) and cut it in TRIM: AUTO (on the hits), 8 or 16 equal parts go to pads 1 to n, and the sequence is written so the grid plays like the take.
    3. -CHORDS (SCL again): 16 chords on a 4×4 grid with their degree and name. The color tells their function: blue rest (I, iii, vi), green preparation (ii, IV), orange tension (V, vii). K1 = set (DIATONIC, PROGRESSIONS, NEO SOUL), K2 = voicing (CLOSED, OPEN or LED, voice-led), K3 = octave, K4 = strum. -
-

Scenes and song

-

A scene is a set of mutes: the six channels' mutes and the instrument mutes of BR-8 and BP-1. Scenes belong to the project, not to a pattern, so a scene works on any pattern. They live on black 7-10 (A-D) of the console, and with HOME held from any screen.

+Tune each pad (TRIM, SOUND, ENV) and program the grid (SEQ). + +

SEQ: the pad grid

-
GestureWhat it does
Tap an empty scene (dim)Stores the mutes as they are now
Tap a stored scene (medium)Launches it on the next bar (stopped: right away). On = the active one, blink = queued
Hold 2 sStores over it (a ring fills: STORE SCENE A)
EDIT held + scene (on the console)Clears it
Hold one + tap othersA chain: the first launches on the next bar, the next one at each master cycle
-

CUE (black 11): hold it, or tap it to keep it on (it breathes). With CUE, the mutes you tap don't change at once: they blink and drop together on the next bar. Stopped, they change right away. Tap CUE again to turn it off.

+

Just like the drums: 8 pads per page (OCT −/+ = pads 1-8 or 9-16), the 16 steps of the bar, black 1-8 pick (and play) a pad, black 9 · 10 change the bar, black 11 (RPT) = REPEAT, and a held step + K1 / K2 = its accent / repeat.

+
ControlDoes
K1-K4LEVEL of the pad · LENGTH of all pads (1-64 steps) · PITCH (±24 semitones) · RELEASE
ALGORITHM · PRESETSThe pad · its take
LFO · SCLACCENTS · MUTE SOUNDS (as on the drums)
SEQ againLENGTH/SPEED (below)
EDIT · ENV · FX · GLOThe machine's pages
+

LENGTH/SPEED (SEQ again): each pad can have its own length.

-

SONG (console GLO › SONG, or HOME + SEQ): a list of entries, each one a pattern and an optional scene. White 1-10 add a pattern; black 7-10 put that scene on the selected entry (again: remove it); black 11 deletes the selected entry. SELECT picks the entry, ALGORITHM or K1 its pattern, K2 how many times it plays, K4 = song ON/OFF.

-

SONG REC (REC on GLO › SONG, or HOME + REC): play live and the song writes itself: every pattern change and every scene you launch becomes an entry. Stopped, it is armed and starts with PLAY.

-

Effects

-
  • -Each channel's MIX (FX inside a machine): level, pan, delay send and reverb send. FX again: duck (sidechain from the T1 kick). -
  • -On the console: each channel's filter (K2 on MIX), and on FX › CHANNEL its DRIVE, PAN, DUCK and whether BEAT FX touches it. -
  • -FX › DELAY: time, feedback and mix (up to 0.80 s, so 1/4 gets shorter below 75 BPM) and the sidechain release. FX › REVERB: size, damping and mix. -
  • -FX › MASTER: the master filter, BEAT FX and DRIVE (saturation of the mix). MOVE is PRESETS on FX and GLO. -
  • -BUNO-6 has its own stereo chorus (I, II or I+II, with ALGORITHM). BITTAL's SPACE macro adds reverb send. -
  • -FX held: 16 punch-ins (stutter, reverse, tape stop, gate, sweeps, bitcrush, SR down, delay throw, echo freeze, kill low/high). A channel with BEAT FX OFF is left out of them. -
+
KeyDoes
White keysThe length of the selected pad (1-16; on = the length, medium = inside it, dim = outside)
Black 1-6The channel's speed: ×2, ×3/2, ×1, ×3/4, ×1/2, ×1/4
Black 7-101, 2, 3 or 4 bars (1BR-4BR)
Black 11 (+16)The lengths 17-32, 33-48, 49-64 and back
K1 · K2 · ALGORITHMLength of the pad · speed · the pad
+

The Slicer's pages

+

+

The white keys are always the 16 pads (play and select; on = selected, medium = has sound). ALGORITHM = the pad, PRESETS = its take.

+
ButtonPageK1K2K3K4
EDITTRIM 1/2: the waveform of the pad's take with the pad markedSTART (the end stays)LENGTHZOOM (X1-X8)SAMPLE: how many bars SMP records (1, 2 or 4, as many as fit)
EDIT againSOUND 2/2PITCH (±24 st)LEVELMODE: ONESHOT, KEY, THRU, LOOPREVERSE (FWD / REV)
ENVENVATTACKRELEASELOOP INLOOP OUT (only in LOOP mode)
FXDISTORTION; again CHORUS and REVERBas on the panel machines
GLOGLO 1/2LENGTH (all pads)—MIDI CHMIDI OUT
GLO againGLO 2/2———RESET (the pads' sound and the FX back to factory; the cuts stay)
+

In TRIM, the black keys: AUTO, 8 and 16 cut the selected pad's take (lit when it has one) and always rewrite the sequence; SMP (black 11) records the mix from the next bar (stopped: it starts with PLAY), for the bars on K4. SMP again stops. The new take is saved when you stop the transport and goes on the selected pad. The header shows SAMPLING 1.2 S while it records.

+

MODE (how a pad answers the key): ONESHOT plays whole even if you let go · KEY plays while you hold · THRU plays the pad and, held, keeps going through the rest of the take · LOOP repeats while you hold, between LOOP IN and LOOP OUT.

+

REC inside the Slicer records the pads you play into the grid (while playing); REC 2 s clears the sequence. OCT and ARP do nothing here.

+

How much fits: up to 6 s of takes in total (8 bits at 16 kHz), up to about 3 s per take, in up to 8 takes. They share a 100 KiB flash zone with your sounds; the control platform shows all the memory.

Saving

  • -There are 10 patterns (01-10), on the console's white keys. +There are 9 patterns (01-09), on HOME's white keys. Each keeps its machines, sounds, sequences and its four scenes.
  • The flash is only written when stopped (writing pauses the audio for a moment).
  • -Autosave: when stopped, after 10 s without touching anything (patterns, song and scenes, and settings). +Autosave: when stopped, 10 s after the last change (patterns, scenes and settings).
  • -SAVE: save · save as · save song and scenes · erase pattern (SAVE twice) · count events. SAVE 2 s: quick save. HOME + SAVE: save as. -
  • -Copying: SAVE held + white key copies the pattern; HOME + EDIT copies a channel onto another one in the same pattern (notes to notes, hits to hits): ALGORITHM picks the target and EDIT held 2 s pastes. Machines don't change. +SAVE opens its screen; SELECT picks the row, ALGORITHM (or K1, or PRESETS) the target pattern, and SAVE runs it: +
+
RowDoes
SAVESaves this pattern (and its scenes if they changed)
SAVE ASSaves it in another pattern (the target)
CLEAR PATTERNSAVE again within 3 s clears all six channels
+
  • +Playing, a save waits: "SAVES WHEN STOPPED", SAVE blinks, and it is written when you stop. SAVE 2 s anywhere = quick save.

System (HOME 2 s)

-

Internal or external clock · Split Sync (L = pulse, R = mono mix) · pulse PPQN and latency · autosave · idle button brightness (OFF, DIM or MEDIUM; the keys are not affected) · FAST SCREEN (test, off by default) and TWO CORES (test, off by default) · takes, sounds and free memory · LANGUAGE · version.

-

The two tests: FAST SCREEN raises the screen's SPI to 30 MHz (measured: a full frame goes from 85 to 39 ms). TWO CORES shares the machines between the FM-1's two cores (on the computer it gives exactly the same samples). The first time you turn it on it is checked to answer; if it hangs, its channels go silent and it retires until you power off, and if a boot with TWO CORES does not reach 5 seconds, it is off on the next boot. They are being tested: if the FM-1 hangs or boots into safe mode, both switch themselves off. The control platform shows TWO CORES under DEVICE when it is on or switched itself off.

+

+

SELECT picks the row; ALGORITHM (or K1) changes it.

+
RowValues
CLOCKINTERNAL or EXTERNAL (MIDI)
SYNC OUTSTEREO, or SPLIT L/R (left = clock pulses, right = mono mix)
IDLE LEDSThe brightness of idle buttons: OFF, DIM or MEDIUM (the keys are not affected)
LANGUAGEEnglish or the loaded pack
VERSIONThe firmware version

MIDI

  • -Input (USB and TRS): channels 1-6 = Bubba Machine's channels. On grids, the note picks the instrument (0-15); on the sampler, the pad. +Input: MIDI channels 1-6 play the channels in this order: 1 = BR-8 (T1), 2 = BP-1 (T6), 3 = T2, 4 = T3, 5 = T5, 6 = T4. These are also each channel's factory MIDI CH. On the drums the note picks the instrument.
  • -External clock: follows MIDI Clock and Start/Stop. +External clock (SYSTEM › CLOCK): follows MIDI Clock and Start / Stop. PLAY waits for the clock ("EXT CLOCK: WAITING FOR MIDI").
  • -Output: MIDI Clock when the clock is internal, and the notes of channels with MIDI OUT. +Output: MIDI Clock when the clock is internal, and the notes of every channel with MIDI OUT on (GLO of the machine), on its MIDI CH.

Control platform

-

The control platform manages the FM-1 from Chrome or Edge, over USB (Bubba Machine 0.6.1-beta or newer). It is one page that mirrors the FM-1, and every change waits until you send it: you can prepare everything without the FM-1 and send it later.

+

The control platform manages the FM-1 from Chrome or Edge, over USB. It is one page that mirrors the FM-1, and every change waits until you send it: you can prepare everything without the FM-1 and send it later.

  • The bar on top (it stays in view): whether the FM-1 is connected and which version it runs (with a link to the installer when a newer one is out), the memory that takes and sounds share (100 KB: what is used, what your pending changes add or free, and what will be left, in KB and in seconds of take), and the pending changes with Send to FM-1 and Discard. Anything that would not fit is marked in red and Send stays off until you fix it.
  • -TAKES: the 8 take places as the FM-1 numbers them, with length, bars and BPM. Drop an audio file (WAV, AIFF, MP3, FLAC or OGG) on a free place, or on a take to replace it. Trim the start and end on the waveform, check the BPM (read from the file name, or guessed) and press ▶ Hear it as the FM-1 plays it: 16 kHz, 8 bits with dither, exactly what is sent. Up to 3 s per take and 6 s in total. +TAKES: the 8 take places as the FM-1 numbers them, with length, bars and BPM. Drop an audio file (WAV, AIFF, MP3, FLAC or OGG) on a free place, or on a take to replace it. Trim the start and end on the waveform, check the BPM (read from the file name, or guessed) and press ▶ Hear it as the FM-1 plays it: 16 kHz, 8 bits with dither, exactly what is sent. Up to 3 s per take and 6 s in total. On the FM-1 a take goes on a pad with PRESETS (in the Slicer, or on HOME with the cursor on T6).
  • -SOUNDS: one column per machine. Vital presets (.vital) go to B-MINI, BITTAL or BUNO-6 (you pick; changing the machine or the name converts it again), DX7 banks (.syx) to BX-7, and .bsnap files to their own machine. You see what was kept, approximated or left out, can rename it and download the .bsnap. Up to 12 of your sounds; BB-303 only has factory sounds. On the FM-1: on HOME hold the channel's white key (T3-T6), turn ALGORITHM to the machine, then PRESETS. +SOUNDS: one column per machine. Vital presets (.vital) go to B-MINI, BITTAL or BUNO-6 (you pick; changing the machine or the name converts it again), and .bsnap files to their own machine. You see what was kept, approximated or left out, can rename it and download the .bsnap. Up to 12 of your sounds; on the FM-1 they come after the factory ones on PRESETS. BB-303 and BX-7 only have factory sounds for now.
  • SCREEN LANGUAGE: English (built in), Español (pack included) or your own .bmlang.
  • -DEVICE (folded): firmware, audio load, system memory, how long it has been on, how it last started, the lowest voltages, TWO CORES when it matters, and the device log. +DEVICE (folded): firmware, audio load, system memory, how long it has been on, how it last started, the lowest voltages and the device log.

Send waits for the transport to stop (writing flash cuts the audio: the page says "Press STOP on the FM-1"). Deletions go first, so they make room; then the rest in order, with a progress bar. Afterwards the page reads the FM-1 again and marks each change Verified on the FM-1; anything that failed stays pending with the reason. Without a device, control.html?mock=1 talks to a simulated FM-1 for development.

Screen language

The screen is in English. Other languages are packs that are not loaded by default: one pack lives in its own 16 KiB of flash (it does not touch patterns or takes, and a firmware update does not erase it).

  • -Load Spanish on the FM-1: the language pack is a separate add-on with its own 16 KiB zone: load or remove it on the control platform, with the FM-1 connected and the transport stopped. Or from the computer, with the transport stopped, py -3 tools/fm1/idioma.py lang/es.bmlang. SYSTEM › LANGUAGE then switches between English and the pack. --quitar removes it. -
  • -In the emulator: the button under Sampler and memory loads or removes the Spanish pack. +Load Spanish on the FM-1: on the control platform, with the FM-1 connected and the transport stopped. Or from the computer, with the transport stopped, py -3 tools/fm1/idioma.py lang/es.bmlang (--quitar removes it). SYSTEM › LANGUAGE then switches between English and the pack.
  • Making a translation: copy lang/plantilla.txt (every phrase on screen) to lang/<code>.txt, write the translation under each phrase and build it with py -3 tools/gen_lang.py. The FM-1 font is ASCII: no accents. What you don't translate shows in English.
diff --git a/web/en/docs/roadmap.html b/web/en/docs/roadmap.html index b59f9cd..6c42b91 100644 --- a/web/en/docs/roadmap.html +++ b/web/en/docs/roadmap.html @@ -47,7 +47,7 @@

Roadmap

Everything planned for Bubba Machine. All of it will be done, step by step, with no dates: each step ships when it has been tested on the FM-1. The order inside each list is the order that matters today and may change.

-

Items marked ✓ are already in the current version (0.9.0-beta); items marked in testing are there but off by default until measured on the FM-1. Until v1, any version may erase what you saved (see install).

+

Items marked ✓ are already in the current version (0.10.0-beta); items marked in testing are there but off by default until measured on the FM-1. Until v1, any version may erase what you saved (see install).

Audio

The goal is the best quality the FM-1 allows. What improved, what it costs and what limits it today: audio.

Done

@@ -94,19 +94,21 @@

Interface

  • ✓ English screen, with language packs: Spanish is loaded separately (tools/fm1/idioma.py) and switched in SYSTEM › LANGUAGE.
  • -✓ Pad sampler: 16 pads made from your takes, like a KO II or an OP-1 field, on a grid like the drums, with BREAK to vary it. +✓ Slicer: 16 pads cut from your takes, like a KO II or an OP-1 field, on a step grid like the drums (0.10).
  • -✓ MUTES and FILL screens, and drums in sections of 8. +✓ MUTE SOUNDS on the drums, and drums in pages of 8 instruments.
  • ✓ The 0.6 face: header, viewport, keyboard and dials always in the same place; the BX-1 mixer on HOME; ALGORITHM as each machine's mode.
  • ✓ Expressive REC: micro-timing, gate and P-Locks of what you turn while holding the note; long notes with two white keys. +
  • +✓ Each machine like the real one (0.10): HOME as a six-channel mixer; entering a channel gives the FM-1 to its machine, with the panel and menus of the TB-303, Minimoog, Juno-6, Vital or DX7; cyclic menu buttons; the BR-8 step sequencer; factory patterns.
  • Planned: playing live (HOME again = the next page)

    1. MORPH A·B: move from one sound state to another with a knob (HOME's fourth macro).
    2. -✓ SCENES AND SONG: scenes as mutes on the console, CUE, and song entries with a pattern and a scene (0.9). +✓ SCENES: four scenes of mutes per pattern on HOME (0.10). The song and CUE of 0.9 were removed in the 0.10 redesign.

    Planned: working on a track (the button again = the next page)

    1. @@ -116,11 +118,11 @@

      Interface

    2. LFO › MOTION: a modulation sequencer and knob-movement recording.
    3. -✓ Per-channel mix and effects: the console's FX › CHANNEL (drive, pan, duck, BEAT FX) (0.9). +✓ Per-channel effects: each machine has its own effects (DISTORTION, CHORUS, REVERB; OVERDRIVE on the BB-303; the BX-7 chain) (0.10).

    Other

    • -Pattern banks: more than 10 patterns, by growing the flash map or shrinking the patterns. +Pattern banks: more than 9 patterns, by growing the flash map or shrinking the patterns.
    • Ghost notes on drums: a level P-Lock or a bigger format.
    diff --git a/web/en/index.html b/web/en/index.html index 3997a17..f0e7699 100644 --- a/web/en/index.html +++ b/web/en/index.html @@ -46,12 +46,12 @@

    Free firmware for your M-VAVE FM-1

    See the code -
    HOME: the BX-1 console with the six machines
    +
    HOME: the six-channel mixer
    - 0.9.0-beta · HOME IS THE CONSOLE - It runs on the FM-1 and installs from the browser, plug and play. It is a beta (0.9 not fully tried on the device yet): tested on a single device, and an update may erase what you saved (patterns, song, settings and takes). More details. + 0.10.0-beta · EVERY MACHINE IS ITS OWN INSTRUMENT + It runs on the FM-1 and installs from the browser, plug and play. It is a beta (0.10 runs on the author's FM-1): tested on a single device, and an update may erase what you saved (patterns, scenes, settings and takes). More details.
    @@ -72,14 +72,14 @@

    A hi-fi machine that fits in your hand

    The 240×240 screen, as it is

    These are real firmware screenshots, generated by the automated tests. The screen is in English; other languages are optional packs.

    @@ -88,12 +88,12 @@

    The 240×240 screen, as it is

    Six machines to play live

    Everything is designed around the FM-1 controls: three big knobs, four small ones, fourteen buttons and 27 keys with LEDs.

    -
    T1

    BR-8

    Modeled drums (808, 909 and SYNTH), computed live. Accent, repeats, flam, per-step P-Locks and steps that only play in the fill.

    -
    T2

    BP-1

    16 pads made from your takes, as on a KO II or an OP-1 field, with sustain loop and BREAK to vary the grid bar by bar.

    -
    T3

    BB-303 · B-MINI

    Acid bass with slide and accent, or three oscillators into a ladder filter. One knob switches them and the notes stay.

    -
    T4-T6

    BX-7 · BITTAL · BUNO-6

    6-operator FM with .syx banks, a wavetable that loads Vital presets and a polysynth with chorus. 92 factory sounds in all, plus yours.

    -
    HOME

    BX-1 console

    Ten patterns, mutes, solo, scenes and CUE on the keys, and each channel's mix. Holding HOME brings the console to any screen.

    -
    LIVE

    Scenes and effects

    Expressive REC, four scenes with chains and song recording, automatic fills, reverb, delay and 16 punch-in effects.

    +
    T1

    BR-8

    Modeled drums (808, 909 and SYNTH), computed live. A step sequencer with accents, repeats, mutes and a length per instrument.

    +
    LAST

    BP-1 Slicer

    16 pads cut from your takes, as on a KO II or an OP-1 field. Slicing writes a sequence that plays like the loop; it can also record the mix.

    +
    PICK

    BB-303 · B-MINI

    The TB-303 with its panel, ACCENT and SLIDE per step and TB-03-style overdrive, or a Minimoog with its menus. Each channel picks its machine.

    +
    PICK

    BX-7 · BITTAL · BUNO-6

    The FM-1's 6-operator FM, a Vital-style wavetable and a Juno-6 with chorus, each with its own menus and effects. Up to two heavy ones at a time.

    +
    HOME

    Mixer

    Nine patterns, the six channels with volume, filter, delay and reverb, mutes, solo and four scenes per pattern.

    +
    LIVE

    Factory patterns

    It starts with recreations of Da Funk, Confusion (from Blade) and Enjoy the Silence, and records like SLOOP: a fixed length that wraps around.

    @@ -140,7 +140,7 @@

    Yours to study, change and share

    Code of conduct GPL-3.0 license -

    Bubba Machine 0.9.0-beta · © 2026 Erbubar23 · GPL-3.0-or-later.

    +

    Bubba Machine 0.10.0-beta · © 2026 Erbubar23 · GPL-3.0-or-later.

    M-VAVE and FM-1 are trademarks of their respective owners. This project is not affiliated with or endorsed by M-VAVE. Installing unofficial firmware is at your own risk.

    diff --git a/web/fm1/bubba-diag-0.10.0-beta.bin b/web/fm1/bubba-diag-0.10.0-beta.bin new file mode 100644 index 0000000..df2805e Binary files /dev/null and b/web/fm1/bubba-diag-0.10.0-beta.bin differ diff --git a/web/fm1/bubba-diag-0.10.0-beta.fwsc b/web/fm1/bubba-diag-0.10.0-beta.fwsc new file mode 100644 index 0000000..4a93e3e Binary files /dev/null and b/web/fm1/bubba-diag-0.10.0-beta.fwsc differ diff --git a/web/fm1/bubba-machine-0.10.0-beta.bin b/web/fm1/bubba-machine-0.10.0-beta.bin new file mode 100644 index 0000000..d8a210f Binary files /dev/null and b/web/fm1/bubba-machine-0.10.0-beta.bin differ diff --git a/web/fm1/bubba-machine-0.10.0-beta.fwsc b/web/fm1/bubba-machine-0.10.0-beta.fwsc new file mode 100644 index 0000000..4a5548c Binary files /dev/null and b/web/fm1/bubba-machine-0.10.0-beta.fwsc differ diff --git a/web/fm1/versiones.json b/web/fm1/versiones.json index db09729..1ce9db0 100644 --- a/web/fm1/versiones.json +++ b/web/fm1/versiones.json @@ -1,23 +1,23 @@ [ { - "archivo": "bubba-machine-0.9.0-beta.bin", - "sha256": "9b473440788fd50939896d2765d8df1328f96f82eb5d0f0312c9abb7437a5855", - "bytes": 477904, - "fwsc": "bubba-machine-0.9.0-beta.fwsc", - "fwsc_sha256": "ca86cd34117238a77605381488ffe6c0027f1da65f0bff3b64601897f712f7b9", - "nombre": "Bubba Machine 0.9.0-beta", - "nombre_en": "Bubba Machine 0.9.0-beta", + "archivo": "bubba-machine-0.10.0-beta.bin", + "sha256": "d8a720ac60796641e7efdf161cdc9edd86c2e06052376b2713465d674be8f377", + "bytes": 451460, + "fwsc": "bubba-machine-0.10.0-beta.fwsc", + "fwsc_sha256": "e1f444059553b7a8e9ea6b916fed0ea3c7d5404a6e913a130f11b9d3d9624e7d", + "nombre": "Bubba Machine 0.10.0-beta", + "nombre_en": "Bubba Machine 0.10.0-beta", "detalle": "El groovebox completo: seis máquinas, secuenciador, sampler y sonido. Beta: una actualización puede borrar lo guardado.", "detalle_en": "The full groovebox: six machines, sequencer, sampler and sound. Beta: an update may erase what you saved." }, { - "archivo": "bubba-diag-0.9.0-beta.bin", - "sha256": "e4dabfd1fd7a815993003f87acfee0c57eb6b37c4e4bc39abe6ab1b3a75d9b36", - "bytes": 125416, - "fwsc": "bubba-diag-0.9.0-beta.fwsc", - "fwsc_sha256": "bea073136bde783e4c728b04ccc9f5ad5dd937ddae6879e44d5bfc687e92b27a", - "nombre": "Diagnóstico 0.9.0-beta", - "nombre_en": "Diagnostic 0.9.0-beta", + "archivo": "bubba-diag-0.10.0-beta.bin", + "sha256": "0a299bf3153ffbf954c8548fc85b5a0be48e027e9290d372c00c57ee0ac1a045", + "bytes": 125544, + "fwsc": "bubba-diag-0.10.0-beta.fwsc", + "fwsc_sha256": "fc3af41b02f0f1cd2a0fbc1acc41715ae0f97976737ac0782ee0ca864d21d157", + "nombre": "Diagnóstico 0.10.0-beta", + "nombre_en": "Diagnostic 0.10.0-beta", "detalle": "Sin sonido: muestra cada botón, tecla y perilla para comprobar el aparato.", "detalle_en": "No sound: shows every button, key and knob to check the device." } diff --git a/web/img/00-home.png b/web/img/00-home.png index d6572be..0205bf8 100644 Binary files a/web/img/00-home.png and b/web/img/00-home.png differ diff --git a/web/img/02-seq-tr.png b/web/img/02-seq-tr.png index c341f51..f18127d 100644 Binary files a/web/img/02-seq-tr.png and b/web/img/02-seq-tr.png differ diff --git a/web/img/80-bx7-main.png b/web/img/80-bx7-main.png new file mode 100644 index 0000000..3b8e5f1 Binary files /dev/null and b/web/img/80-bx7-main.png differ diff --git a/web/img/81-b303-panel.png b/web/img/81-b303-panel.png new file mode 100644 index 0000000..cf27517 Binary files /dev/null and b/web/img/81-b303-panel.png differ diff --git a/web/img/83-bmini-filter.png b/web/img/83-bmini-filter.png new file mode 100644 index 0000000..73b6e42 Binary files /dev/null and b/web/img/83-bmini-filter.png differ diff --git a/web/img/84-buno-dco.png b/web/img/84-buno-dco.png new file mode 100644 index 0000000..77708f8 Binary files /dev/null and b/web/img/84-buno-dco.png differ diff --git a/web/img/85-bittal-osc1.png b/web/img/85-bittal-osc1.png new file mode 100644 index 0000000..5a04414 Binary files /dev/null and b/web/img/85-bittal-osc1.png differ diff --git a/web/img/90-slicer-trim.png b/web/img/90-slicer-trim.png new file mode 100644 index 0000000..3179d8f Binary files /dev/null and b/web/img/90-slicer-trim.png differ diff --git a/web/index.html b/web/index.html index b016017..8ab384a 100644 --- a/web/index.html +++ b/web/index.html @@ -52,12 +52,12 @@

    Firmware libre para tu M-VAVE FM-1

    Ver el código -
    HOME: la consola BX-1 con las seis máquinas
    +
    HOME: el mezclador de los seis canales
    - 0.9.0-beta · HOME ES LA CONSOLA - Corre en el FM-1 y se instala desde el navegador, plug and play. Es una beta (la 0.9, todavía sin probar del todo en el aparato): se probó en un solo aparato y una actualización puede borrar lo que guardaste (patrones, canción, ajustes y tomas). Más detalles. + 0.10.0-beta · CADA MÁQUINA ES SU INSTRUMENTO + Corre en el FM-1 y se instala desde el navegador, plug and play. Es una beta (la 0.10 corre en el FM-1 del autor): se probó en un solo aparato y una actualización puede borrar lo que guardaste (patrones, escenas, ajustes y tomas). Más detalles.
    @@ -78,14 +78,14 @@

    Una máquina hi-fi que cabe en la mano

    La pantalla de 240×240, tal cual

    Estas son capturas reales del firmware, generadas por las pruebas automáticas. La pantalla viene en inglés; el español es un paquete de idioma que se carga aparte.

    @@ -94,12 +94,12 @@

    La pantalla de 240×240, tal cual

    Seis máquinas para tocar en vivo

    Todo pensado para los controles del FM-1: tres perillas grandes, cuatro pequeñas, catorce botones y 27 teclas con LED.

    -
    T1

    BR-8

    Batería modelada (808, 909 y SINTE), calculada en vivo. Acento, repetición, flam, P-Locks por paso y pasos que solo suenan en el fill.

    -
    T2

    BP-1

    16 pads hechos con tus tomas, como en un KO II o un OP-1 field, con loop de sustain y BREAK para variar la rejilla compás a compás.

    -
    T3

    BB-303 · B-MINI

    Bajo ácido con slide y acento, o tres osciladores con filtro escalera. Se cambia con una perilla y las notas se quedan.

    -
    T4-T6

    BX-7 · BITTAL · BUNO-6

    FM de 6 operadores con bancos .syx, wavetable que carga presets de Vital y un polifónico con chorus. 92 sonidos de fábrica en total y los tuyos.

    -
    HOME

    Consola BX-1

    Diez patrones, mutes, solo, escenas y CUE en las teclas, y la mezcla de cada canal. HOME sostenido trae la consola a cualquier pantalla.

    -
    DIRECTO

    Escenas y efectos

    REC expresivo, cuatro escenas con cadenas y grabación de la canción, fills automáticos, reverb, delay y 16 efectos punch-in.

    +
    T1

    BR-8

    Batería modelada (808, 909 y SINTE), calculada en vivo. Secuenciador por pasos con acentos, repeticiones, mutes y un largo por instrumento.

    +
    ÚLTIMO

    BP-1 Slicer

    16 pads cortados de tus tomas, como en un KO II o un OP-1 field. Al cortar escribe la secuencia que suena como el loop; también graba la mezcla.

    +
    ELIGEN

    BB-303 · B-MINI

    La TB-303 con su panel, ACCENT y SLIDE por paso y overdrive estilo TB-03, o un Minimoog con sus menús. Cada canal elige su máquina.

    +
    ELIGEN

    BX-7 · BITTAL · BUNO-6

    El FM de 6 operadores del FM-1, una wavetable estilo Vital y un Juno-6 con chorus, cada uno con sus menús y sus efectos. Hasta dos pesadas a la vez.

    +
    HOME

    Mezclador

    Nueve patrones, los seis canales con volumen, filtro, delay y reverb, mutes, solo y cuatro escenas por patrón.

    +
    DIRECTO

    Patrones de fábrica

    Arranca con recreaciones de Da Funk, Confusion (de Blade) y Enjoy the Silence, y graba como SLOOP: largo fijo que da la vuelta.

    @@ -146,7 +146,7 @@

    Tuyo para estudiarlo, cambiarlo y compartirlo

    Código de conducta Licencia GPL-3.0 -

    Bubba Machine 0.9.0-beta · © 2026 Erbubar23 · GPL-3.0-or-later.

    +

    Bubba Machine 0.10.0-beta · © 2026 Erbubar23 · GPL-3.0-or-later.

    M-VAVE y FM-1 son marcas de sus respectivos dueños. Este proyecto no está afiliado a M-VAVE ni respaldado por ellos. Instalar firmware no oficial es bajo tu propio riesgo.

    diff --git a/web/lang/es.bmlang b/web/lang/es.bmlang index 6571883..b2f14df 100644 Binary files a/web/lang/es.bmlang and b/web/lang/es.bmlang differ