๐ต๐๏ธ 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
๐ต๐๏ธโจ