๐ŸŽต๐Ÿ‘๏ธ CrumbVisuals - Audio-Visual Live Coding

Strudel + Hydra + Crew = Die ultimative Show!


๐ŸŽฏ Die Vision

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                                                                             โ”‚
โ”‚         ๐ŸŽต SOUND              โ†’              ๐Ÿ‘๏ธ VISUALS                    โ”‚
โ”‚                                                                             โ”‚
โ”‚    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”‚
โ”‚    โ”‚   STRUDEL       โ”‚           โ”‚         HYDRA                    โ”‚       โ”‚
โ”‚    โ”‚   Audio Patternsโ”‚    โ”€โ”€โ”€โ–บ   โ”‚    WebGL Live Visuals           โ”‚       โ”‚
โ”‚    โ”‚                 โ”‚           โ”‚    โ€ข Shapes                      โ”‚       โ”‚
โ”‚    โ”‚   sound("bd")   โ”‚    H()    โ”‚    โ€ข Colors                      โ”‚       โ”‚
โ”‚    โ”‚   note("c4")    โ”‚   โ”€โ”€โ”€โ–บ    โ”‚    โ€ข Feedback                    โ”‚       โ”‚
โ”‚    โ”‚   .gain()       โ”‚           โ”‚    โ€ข Audio-Reactive              โ”‚       โ”‚
โ”‚    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ”‚
โ”‚                                              โ”‚                              โ”‚
โ”‚                                              โ–ผ                              โ”‚
โ”‚                               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”‚
โ”‚                               โ”‚    CRUMBVISUALS             โ”‚              โ”‚
โ”‚                               โ”‚    โ€ข Crew Characters        โ”‚              โ”‚
โ”‚                               โ”‚    โ€ข Tailwind Overlays      โ”‚              โ”‚
โ”‚                               โ”‚    โ€ข Schnippsi Integration  โ”‚              โ”‚
โ”‚                               โ”‚    โ€ข Full VJ Setup          โ”‚              โ”‚
โ”‚                               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ”‚
โ”‚                                                                             โ”‚
โ”‚              Sound โ†’ Resonanz โ†’ Tanz โ†’ Atmen โ†’ Crumbforest                 โ”‚
โ”‚                                                                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ”ง Was Strudel + Hydra BEREITS kรถnnen

1. Hydra initialisieren

await initHydra()

// Mit Audio-Detection
await initHydra({ detectAudio: true })

// Mit Strudel Visuals (pianoroll, spiral, scope)
await initHydra({ feedStrudel: true })

2. Patterns als Visual Input: H()

await initHydra()

// Pattern definieren
let pattern = "3 4 5 [6 7]*2"

// Pattern โ†’ Hydra Shape
shape(H(pattern)).out(o0)

// Pattern โ†’ Audio
n(pattern).scale("A:minor").piano().room(1)

3. Audio-reaktive Visuals

await initHydra({ detectAudio: true })

// a.fft[0-3] = Frequenzbรคnder
osc(10, 0.1, () => a.fft[0] * 4)
  .color(1, 0.5, () => a.fft[1])
  .modulate(noise(() => a.fft[2] * 3))
  .out()

// Audio
sound("bd sd [hh hh] sd").room(0.5)

4. Strudel Visualizations in Hydra

await initHydra({ feedStrudel: true })

// s0 = Strudel Canvas (pianoroll, spiral, scope)
src(s0)
  .saturate(2)
  .kaleid(4)
  .modulate(noise(2), 0.1)
  .out()

// Audio mit Visual Feedback
note("c3 e3 g3 b3").piano()._scope()  // oder ._pianoroll() oder ._spiral()

๐ŸŒŸ HYDRA Basics

Hydra ist ein visueller Synthesizer im Browser:

// SOURCES (Quellen)
osc(freq, sync, offset)     // Oszillator
noise(scale)                 // Rauschen
shape(sides, radius, smooth) // Formen
solid(r, g, b, a)           // Farbe
gradient(speed)              // Gradient
voronoi(scale, speed)        // Voronoi-Muster

// GEOMETRY (Transformationen)
.rotate(angle, speed)
.scale(amount, xMult, yMult)
.pixelate(x, y)
.kaleid(sides)
.scroll(x, y, speedX, speedY)

// COLOR
.color(r, g, b, a)
.saturate(amount)
.contrast(amount)
.brightness(amount)
.invert(amount)

// BLEND (Kombinieren)
.add(source, amount)
.mult(source, amount)
.blend(source, amount)
.diff(source)
.modulate(source, amount)

// OUTPUT
.out()      // โ†’ o0 (default)
.out(o1)    // โ†’ o1
.out(o2)    // โ†’ o2
.out(o3)    // โ†’ o3

render()    // Zeige alle 4 Outputs
render(o1)  // Zeige nur o1

๐ŸŽต๐Ÿ‘๏ธ CRUMBVISUALS PATTERNS

Pattern 1: Bass = Puls

await initHydra({ detectAudio: true })

// Visuals: Kreis pulsiert mit Bass
shape(4, () => 0.2 + a.fft[0] * 0.5)
  .color(1, 0.3, 0.5)
  .rotate(() => time * 0.1)
  .out()

// Audio: Four on the floor
sound("bd bd bd bd")
  .lpf(200)
  .gain(1)

Pattern 2: Melodie = Farbe

await initHydra()

let melody = "0 2 4 7 4 2"

// Visuals: Farbe folgt Melodie
osc(10, 0.1, H(melody).div(12))
  .color(
    H(melody).div(7),
    0.5,
    H(melody).div(5).add(0.5)
  )
  .out()

// Audio
n(melody).scale("C:major").sound("sine").room(0.5)

Pattern 3: Full Audiovisual Reggae

await initHydra({ detectAudio: true })

// VISUALS
osc(3, 0.5, 1)
  .rotate(() => time * 0.05)
  .color(0.2, 1, 0.3)  // Grรผn = Roots
  .modulate(noise(() => a.fft[1] * 2), 0.2)
  .mult(shape(4, () => 0.3 + a.fft[0] * 0.4))  // Bass = Puls
  .saturate(1.5)
  .out()

// AUDIO: One Drop
setcps(75/60/2)
$: sound("~ ~ bd ~").lpf(150)
$: sound("~ ~ rim ~").hpf(800).delay(0.5).dfb(0.6)
$: sound("hh*4").gain(0.3)
$: note("a1 ~ ~ a1, ~ a2 ~ ~").s("triangle").lpf(300)

Pattern 4: Ambient mit Feedback

await initHydra({ detectAudio: true })

// VISUALS: Feedback + Audio
src(o0)
  .scale(1.01)
  .rotate(() => 0.002)
  .blend(
    osc(6, 0, () => a.fft[2] * 2)
      .color(0.5, 0.2, 1)
      .modulate(noise(() => a.fft[1]), 0.1)
    , () => a.fft[0] * 0.3
  )
  .out()

// AUDIO: Ambient
setcps(0.5)
$: note("<c3 e3 g3 b3>").sound("pad").room(0.9)
$: n(irand(7)).s("sine").gain(0.2).delay(0.5)

Pattern 5: House + Kaleidoskop

await initHydra({ detectAudio: true })

// VISUALS
voronoi(5, 0.3, 0.3)
  .color(1, 0.5, () => a.fft[3])
  .kaleid(() => 4 + a.fft[0] * 4)
  .modulate(osc(10), () => a.fft[1] * 0.2)
  .saturate(() => 1 + a.fft[2])
  .out()

// AUDIO: House
setcps(128/60/2)
$: sound("bd bd bd bd").gain(1)
$: sound("~ hh ~ hh").hpf(6000).gain(0.5)
$: sound("~ ~ cp ~").room(0.3)
$: note("c2 ~ c2 ~, ~ ~ e2 g2").s("sawtooth").lpf(500)

๐ŸฆŠ CREW ON STAGE - Character Visuals

Die Idee: Waldwรคchter als Visuals!

await initHydra({ feedStrudel: true })

// Basis: Strudel Visualisierung
src(s0)
  .saturate(1.5)
  .out(o0)

// Character Layer (via HTML/Canvas)
// โ†’ Schnippsi Integration!

Konzept: Crew Canvas Overlay

<!-- Schnippsi UI Integration -->
<div id="crumb-stage" class="fixed inset-0 pointer-events-none">
  <!-- Hydra Canvas (Background) -->
  <canvas id="hydra-canvas" class="absolute inset-0 z-0"></canvas>

  <!-- Crew Characters (Overlay) -->
  <div id="crew-layer" class="absolute inset-0 z-10">
    <!-- FunkFox ๐ŸฆŠ - Music Master -->
    <div id="funkfox" class="absolute transition-all duration-200"
         style="animation: bounce 0.5s infinite;">
      ๐ŸฆŠ
    </div>

    <!-- Eule ๐Ÿฆ‰ - Wisdom -->
    <div id="eule" class="absolute">
      ๐Ÿฆ‰
    </div>

    <!-- BashPanda ๐Ÿผ - Beats -->
    <div id="bashpanda" class="absolute">
      ๐Ÿผ
    </div>
  </div>

  <!-- Info Overlay -->
  <div id="info-layer" class="absolute bottom-4 left-4 z-20 
                              bg-black/50 text-white p-4 rounded-lg">
    <div class="text-2xl font-bold">๐ŸŽต CrumbVisuals Live</div>
    <div class="text-sm opacity-75">Pattern: Reggae One Drop</div>
  </div>
</div>

Tailwind Animation Classes

/* Pulsing with beat */
@keyframes pulse-beat {
  0%, 100% { transform: scale(1); }
  50% { transform: scale(1.1); }
}

/* Bounce on kick */
@keyframes bounce-kick {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-20px); }
}

/* Glow on snare */
@keyframes glow-snare {
  0%, 100% { filter: brightness(1); }
  50% { filter: brightness(1.5) drop-shadow(0 0 10px white); }
}

/* Usage */
.pulse-beat { animation: pulse-beat 0.5s infinite; }
.bounce-kick { animation: bounce-kick 0.25s; }
.glow-snare { animation: glow-snare 0.1s; }

๐Ÿ”— INTEGRATION ARCHITEKTUR

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                                                                             โ”‚
โ”‚  STRUDEL REPL                                                               โ”‚
โ”‚  โ”œโ”€โ”€ Audio Engine (WebAudio)                                               โ”‚
โ”‚  โ”œโ”€โ”€ Pattern Engine (mini-notation)                                        โ”‚
โ”‚  โ””โ”€โ”€ Hydra Bridge (await initHydra())                                      โ”‚
โ”‚         โ”‚                                                                   โ”‚
โ”‚         โ”œโ”€โ”€ H(pattern) โ†’ Hydra input                                       โ”‚
โ”‚         โ”œโ”€โ”€ a.fft[0-3] โ†’ Audio analysis                                    โ”‚
โ”‚         โ””โ”€โ”€ feedStrudel โ†’ Canvas capture                                   โ”‚
โ”‚                                                                             โ”‚
โ”‚  HYDRA                                                                      โ”‚
โ”‚  โ”œโ”€โ”€ WebGL Canvas                                                          โ”‚
โ”‚  โ”œโ”€โ”€ Sources (osc, noise, shape, src)                                     โ”‚
โ”‚  โ”œโ”€โ”€ Transforms (rotate, scale, kaleid)                                   โ”‚
โ”‚  โ””โ”€โ”€ Outputs (o0, o1, o2, o3)                                             โ”‚
โ”‚                                                                             โ”‚
โ”‚  CRUMBVISUALS (Neu!)                                                        โ”‚
โ”‚  โ”œโ”€โ”€ Crew Character Layer (HTML/Canvas)                                    โ”‚
โ”‚  โ”œโ”€โ”€ Schnippsi UI Integration                                              โ”‚
โ”‚  โ”œโ”€โ”€ Tailwind Animations                                                   โ”‚
โ”‚  โ”œโ”€โ”€ MIDI/OSC Trigger โ†’ DOM Events                                        โ”‚
โ”‚  โ””โ”€โ”€ Preset System (Genre โ†’ Visual Style)                                 โ”‚
โ”‚                                                                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐ŸŽจ GENRE โ†’ VISUAL PRESETS

G-Funk (98 BPM)

// Sunset colors, slow motion, smooth
osc(4, 0.2, 0.5)
  .color(1, 0.6, 0.2)  // Orange sunset
  .rotate(() => time * 0.02)
  .modulate(noise(1), 0.1)

DnB (196 BPM)

// Fast, glitchy, high contrast
voronoi(20, 2, 0)
  .thresh(0.5)
  .kaleid(8)
  .scroll(1, 0)

House (128 BPM)

// Disco, colorful, kaleidoscope
osc(10, 0.5, 2)
  .color(1, 0.5, 1)
  .kaleid(6)
  .rotate(() => time * 0.1)

Baobab (110 BPM)

// Earth tones, organic, flowing
noise(3)
  .color(0.8, 0.5, 0.2)  // Earth brown
  .modulate(voronoi(10, 0.3), 0.2)

Reggae (75 BPM)

// Green/Gold/Red, slow pulse, roots
osc(3, 0.1, 1)
  .color(0.2, 0.8, 0.1)  // Green
  .blend(solid(1, 0.8, 0), 0.3)  // Gold

Ambient (30 BPM)

// Slow feedback, ethereal, space
src(o0).scale(1.005).rotate(0.002)
  .blend(noise(2).color(0.2, 0.1, 0.5), 0.05)

๐Ÿš€ QUICK START

// 1. Kopiere das in Strudel REPL:

await initHydra({ detectAudio: true })

// VISUALS
osc(10, 0.1, () => a.fft[0] * 2)
  .color(1, 0.5, () => a.fft[1])
  .rotate(() => time * 0.1)
  .kaleid(() => 4 + a.fft[2] * 4)
  .modulate(noise(() => a.fft[3]), 0.1)
  .out()

// AUDIO
setcps(128/60/2)
$: sound("bd bd bd bd").gain(1)
$: sound("~ hh ~ hh ~ hh oh hh").gain(0.5).hpf(6000)
$: sound("~ ~ cp ~").room(0.3)
$: note("c2 ~ c3 ~").s("sawtooth").lpf(sine.range(200, 800).slow(4))

// 2. Drรผcke Play!
// 3. Visuals reagieren auf Audio! ๐ŸŽต๐Ÿ‘๏ธ

๐ŸฆŠ FunkFox VJ Rules

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                                                                             โ”‚
โ”‚  ๐Ÿ‘๏ธ "a.fft[0] = Bass, a.fft[1] = Low-Mid, a.fft[2] = High-Mid,           โ”‚
โ”‚      a.fft[3] = Highs"                                                     โ”‚
โ”‚                                                                             โ”‚
โ”‚  ๐Ÿ‘๏ธ "H(pattern) = Pattern wird Visual-Parameter"                          โ”‚
โ”‚                                                                             โ”‚
โ”‚  ๐Ÿ‘๏ธ "Feedback: src(o0).scale(1.01).out() = unendliche Tiefe"              โ”‚
โ”‚                                                                             โ”‚
โ”‚  ๐Ÿ‘๏ธ "kaleid() macht alles psychedelisch"                                  โ”‚
โ”‚                                                                             โ”‚
โ”‚  ๐Ÿ‘๏ธ "modulate() = Verzerrung, der VJ Superpower"                          โ”‚
โ”‚                                                                             โ”‚
โ”‚  ๐Ÿ‘๏ธ "Slow = time * 0.01, Fast = time * 0.5"                               โ”‚
โ”‚                                                                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ”ฎ ROADMAP: CrumbVisuals

  • [x] Hydra + Strudel Integration (existiert!)
  • [x] Audio-reactive Visuals (a.fft)
  • [x] Pattern โ†’ Visual (H())
  • [ ] Crew Character Overlay
  • [ ] Schnippsi UI Integration
  • [ ] Tailwind Animation Presets
  • [ ] Genre โ†’ Visual Mapping
  • [ ] MIDI Trigger โ†’ DOM Events
  • [ ] Multi-Screen Setup (Projector)
  • [ ] Recording/Streaming

๐ŸŒฒ Die Show

     ๐ŸŽต SOUND                    ๐Ÿ‘๏ธ VISUALS

     Strudel Pattern      โ†’      Hydra WebGL
           โ”‚                          โ”‚
           โ”‚      H(pattern)          โ”‚
           โ”‚      a.fft[]             โ”‚
           โ”‚                          โ”‚
           โ–ผ                          โ–ผ
     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ”‚                                      โ”‚
     โ”‚         ๐ŸฆŠ CREW ON STAGE ๐Ÿฆ‰          โ”‚
     โ”‚                                      โ”‚
     โ”‚     Resonanz โ†’ Tanz โ†’ Atmen          โ”‚
     โ”‚                                      โ”‚
     โ”‚         ๐ŸŒฒ CRUMBFOREST ๐ŸŒฒ            โ”‚
     โ”‚                                      โ”‚
     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

#crumbvisuals #hydra #strudel #vj #livecoding #audiovisual

๐ŸŽต๐Ÿ‘๏ธโœจ