πͺ CRUMBLIVE - Complete Live Performance System
FunkFox π¦ feat. Schnippsi π feat. Dumbo π (Hardware)
"Beardyman macht's mit seiner Stimme - wir machen's mit dem Wald!" π²
π― Die Vision
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β πͺ CRUMBLIVE STACK πͺ β
β β
β βββββββββββ βββββββββββ βββββββββββ βββββββββββ β
β β π€ IN β β πΉ MIDI β β π‘ DMX β β ποΈ CTRL β β
β β Audio β β IN/OUT β β WLED β β Tracker β β
β ββββββ¬βββββ ββββββ¬βββββ ββββββ¬βββββ ββββββ¬βββββ β
β β β β β β
β ββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββ β
β β β
β βββββββββββΌββββββββββ β
β β π² CRUMBLIVE β β
β β SERVER β β
β β β β
β β β’ Node.js β β
β β β’ WebSocket β β
β β β’ MQTT Bridge β β
β β β’ FFT Analysis β β
β βββββββββββ¬ββββββββββ β
β β β
β βββββββββββββββββββββββΌββββββββββββββββββββββ β
β β β β β
β ββββββΌβββββ βββββββΌββββββ ββββββΌβββββ β
β β π΅ DJ β β ποΈ VJ β β π‘ LJ β β
β β Strudel β β Hydra β β WLED β β
β β β β CrumbVJ β β DMX β β
β βββββββββββ βββββββββββββ βββββββββββ β
β β
β π β ποΈ β π‘ β πͺ β
β Sound Visual Light AUDIENCE β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Was schon funktioniert (v0.9)
[x] Strudel Patterns (9 Missions)
[x] CrumbVJ Controller + Display
[x] WebSocket Sync
[x] Hydra Visuals (Genre Presets)
[x] Audio-Reactive (FFT)
[x] HUE Slider fΓΌr EFX
[x] WAV Export
[x] Multiplayer (2+ Browser)
π€ FEATURE 1: Audio Input
Was Strudel bereits kann:
// Microphone Input!
$: sound("in").gain(0.8)
// Mit Effekten:
$: sound("in")
.delay(0.5)
.room(0.3)
.lpf(sine.range(500, 2000).slow(4))
// Live Sampling (Beatbox style!)
$: sound("in")
.slice(8, "<0 3 2 7 1 4 6 5>") // Slicen wie ein Sampler!
Was wir bauen:
// Audio File Player
samples({
'track': 'https://url.to/mixcloud-rip.mp3'
})
$: s("track").begin(0).end(1).slow(60) // Ganzer Track
// Live Input zu Hydra FFT
// β CrumbLive Server nimmt Audio Input
// β Analysiert FFT
// β Sendet an alle Clients via WebSocket
// β Hydra reagiert auf LIVE Musik!
Setup:
βββββββββββββββ βββββββββββββββ βββββββββββββββ
β π€ Mic β β π§ DJ Mixer β β π Files β
β Beatbox β β Line In β β WAV/MP3 β
ββββββββ¬βββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ
β β β
βββββββββββββββββββββ΄ββββββββββββββββββββ
β
ββββββββββΌβββββββββ
β Web Audio API β
β FFT Analysis β
ββββββββββ¬βββββββββ
β
ββββββββββββββ΄βββββββββββββ
β β
ββββββΌβββββ βββββββΌββββββ
β Strudel β β CrumbVJ β
β sound() β β a.fft[] β
βββββββββββ βββββββββββββ
πΉ FEATURE 2: MIDI IN/OUT
Was Strudel bereits kann:
// MIDI Output - zu Reason, Ableton, Hardware!
$: note("<c4 e4 g4 e4>")
.midi() // Sendet MIDI!
.midichan(1) // Kanal 1
// MIDI Input - von Controller!
$: ccv(74) // CC #74 Value
.range(200, 2000) // Map zu Frequenz
// β Als Filter nutzen!
// Komplettes MIDI Setup:
$: note("<c3 e3 g3 b3>")
.midi()
.midichan(1)
.velocity(0.8)
.ccv(1, 64) // Modwheel
CrumbLive MIDI Bridge:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β πΉ MIDI IN πΉ MIDI OUT β
β ββββββββββ βββββββββββ β
β β
β Akai APC ββ βββΊ Reason β
β Launchpad ββΌβββΊ CrumbLive βββββββΌββΊ Ableton β
β Beatstep ββ€ Server βββΊ Hardware Synth β
β Any Controllerββ βββΊ MIDI Thru β
β β
β Features: β
β β’ Button β Scene Wechsel β
β β’ Fader β slider() Werte β
β β’ Pads β Sample Trigger β
β β’ Encoder β Parameter Kontrolle β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Node.js MIDI Bridge:
// npm install midi
const midi = require('midi')
const input = new midi.Input()
const output = new midi.Output()
input.on('message', (deltaTime, message) => {
const [status, note, velocity] = message
// CC β WebSocket β Strudel slider
if ((status & 0xF0) === 0xB0) {
wss.broadcast({ type: 'cc', cc: note, value: velocity })
}
// Note β WebSocket β Sample Trigger
if ((status & 0xF0) === 0x90) {
wss.broadcast({ type: 'note', note, velocity })
}
})
π‘ FEATURE 3: DMX & WLED Integration
Architektur:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β π΅ AUDIO FFT β
β β β
β βΌ β
β βββββββββββββββ MQTT βββββββββββββββ β
β β CrumbLive β ββββββββββββββββΊβ ESP32 β β
β β Server β β WLED β β
β βββββββββββββββ ββββββββ¬βββββββ β
β β β β
β β WebSocket β LED Data β
β βΌ βΌ β
β βββββββββββββββ βββββββββββββββ β
β β Hydra β β π‘π‘π‘π‘π‘ β β
β β Visuals β β LED Strip β β
β βββββββββββββββ βββββββββββββββ β
β β
β GENRE β COLOR MAPPING: β
β π’ Reggae β Green/Gold/Red β
β π£ House β Neon Pink/Cyan β
β π΄ DnB β Red/Orange strobe β
β π΅ Ambient β Slow blue fade β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
MQTT β WLED:
// npm install mqtt
const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://localhost:1883')
// FFT β WLED
function sendToWLED(fft, scene) {
const colors = genreColors[scene]
// WLED JSON API
const payload = {
on: true,
bri: Math.floor(fft[0] * 255), // Bass β Brightness
seg: [{
col: [
colors.primary,
colors.secondary
],
fx: scene === 'dnb' ? 12 : 0, // Strobe fΓΌr DnB
sx: Math.floor(fft[1] * 255) // Low-mid β Speed
}]
}
client.publish('wled/all', JSON.stringify(payload))
}
ESP32 + WLED Setup:
Hardware:
βββ ESP32 DevKit
βββ WS2812B LED Strip (5V)
βββ 5V Power Supply
βββ WLAN Verbindung
Software:
βββ WLED Firmware (https://install.wled.me)
βββ MQTT Sync aktivieren
βββ CrumbLive als MQTT Source
β QDRANT β Crumbforest:
// Scene-Erkennung mit Embeddings!
// Audio Features β QDRANT β Γhnlichste Genre β WLED Preset
async function detectScene(fftFeatures) {
const embedding = await model.embed(fftFeatures)
const results = await qdrant.search('scenes', {
vector: embedding,
limit: 1
})
return results[0].payload.scene // 'reggae', 'house', etc.
}
ποΈ FEATURE 4: Tracker/Controller UI
Vision: Ableton-Style Grid fΓΌr Strudel
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ποΈ CRUMB TRACKER [βΆ] [β ] [βREC] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β SCENES β 1 β 2 β 3 β 4 β 5 β 6 β 7 β 8 β β
β βββββββββββββββββββββββββββββββββββββββββββββββββ β
β π₯ Drums β[β ]β[ ]β[β ]β[ ]β[β ]β[ ]β[β ]β[ ]β β Mute/Unmute β
β πΈ Bass β[β ]β[β ]β[β ]β[β ]β[ ]β[ ]β[ ]β[ ]β β
β πΉ Keys β[ ]β[ ]β[β ]β[β ]β[β ]β[β ]β[ ]β[ ]β β
β π€ Vox β[ ]β[ ]β[ ]β[ ]β[β ]β[β ]β[β ]β[β ]β β
β βββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β PARAMETERS β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Filter ββββββββββββββββββββββββββββββββββββ 1200Hz β β
β β Room ββββββββββββββββββββββββββββββββββββ 0.3 β β
β β Delay ββββββββββββββββββββββββββββββββββββ 0.5 β β
β β Gain ββββββββββββββββββββββββββββββββββββ 0.8 β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β PATTERN EDITOR β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β bd . . . bd . . . bd . . . bd . . . β β
β β . . . . sn . . . . . . . sn . . . β β
β β hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Implementation:
// React Component fΓΌr Track
function Track({ name, pattern, muted, onMute, onEdit }) {
return (
<div className="track">
<span className="name">{name}</span>
<button onClick={onMute}>{muted ? '[ ]' : '[β ]'}</button>
<div className="pattern">{pattern}</div>
</div>
)
}
// Strudel Integration
const tracks = {
drums: { pattern: 'bd ~ bd ~', muted: false },
bass: { pattern: 'c2 ~ g2 ~', muted: false },
keys: { pattern: '<Am G F E>', muted: true }
}
// Generate Strudel code from tracks
function generateCode(tracks) {
return Object.entries(tracks)
.filter(([_, t]) => !t.muted)
.map(([name, t]) => `$: ${t.pattern} // ${name}`)
.join('\n')
}
πΊοΈ ROADMAP
Phase 1: Audio Bridge (v1.0)
[ ] Audio Input Node Server
[ ] FFT β WebSocket
[ ] Live Mic to Hydra
[ ] File Playback (WAV/MP3)
Phase 2: MIDI Bridge (v1.1)
[ ] WebMIDI in Browser
[ ] Node.js MIDI Bridge
[ ] Controller Mapping UI
[ ] MIDI Out to DAW
Phase 3: Light Bridge (v1.2)
[ ] MQTT Integration
[ ] WLED Presets per Genre
[ ] DMX Bridge (Art-Net)
[ ] ESP32 Templates
Phase 4: Tracker UI (v1.3)
[ ] Scene Grid
[ ] Track Mute/Solo
[ ] Pattern Editor
[ ] Parameter Automation
Phase 5: Crumbforest Integration (v2.0)
[ ] QDRANT Scene Detection
[ ] Auto-Genre via Embeddings
[ ] AI Pattern Suggestions
[ ] Collaborative Jam Sessions
π Hardware Corner (Dumbo's Domain)
Minimal Setup:
βββ Laptop + Browser
βββ Audio Interface (optional)
βββ Internet fΓΌr strudel.cc
Pro Setup:
βββ Laptop + Local Strudel
βββ Audio Interface (4+ channels)
βββ MIDI Controller (Launchpad, APC)
βββ ESP32 + WLED Strip
βββ Beamer/LED Wall
βββ PA System
βββ Crumbforest Server (optional)
DIY ESP32 WLED Box:
βββββββββββββββββββββββββββββ
β π² ESP32 WLED Controller β
β β
β [PWR] [USB] [LED OUT] β
β β
β β’ WLAN: CrumbLive β
β β’ MQTT: Enabled β
β β’ Sync: UDP Multicast β
β β
βββββββββββββββββββββββββββββ
π Inspiration
- Beardyman - One-Man-Band Live Looping
- Strudel/TidalCycles - Live Coding
- Hydra - Live Visual Coding
- WLED - Open Source LED Control
- Crumbforest - Open Knowledge Sharing
π² Crumbforest Spirit
Nullfeld = Jede Frage willkommen
Wer fragt, wΓ€chst = Neugier ist die WΓ€hrung
Codex = Wissen gehΓΆrt allen
Atmen β Wachsen β Teilen β Atmen...
Kindgerecht. Immer. π±
π€ IN β π΅ PROCESS β ποΈ VISUAL β π‘ LIGHT β πͺ STAGE
Beardyman Style - aber Open Source!
π² CRUMBLIVE - Where Sound Becomes Light π²
Wuuuhuuuuu! π¦β¨