SOTCD Generative Audio/Visual Streaming Architecture

Vision

A 24/7 generative audio-visual stream that produces rave-quality electronic music across multiple genres, driven by real-world data signals (solar activity, seismic events, time of day). The stream should feel like tuning into a cosmic radio station broadcasting from another dimension.


Genre Palette

The system must fluently generate and crossfade between:

GenreBPM RangeCharacterSignal Trigger
Ambient/Space0-80Drones, pads, cosmic texturesSignal < 0.2 (calm)
Deep House118-125Warm, soulful, 4-on-floorSignal 0.2-0.4
Acid House120-130303 squelch, 808/909Signal 0.4-0.6
Techno130-145Driving, industrial, hypnoticSignal 0.6-0.75
Jungle/DnB160-180Breakbeats, amen chops, bassSignal 0.75-0.9
Hardtek/Gabber150-200+Chaos mode, distortion, madnessSignal > 0.9

Crossfade logic: Genre transitions happen over 2-8 bars, not instant cuts. The system should feel like a continuous journey.


Hardware

Primary Streaming Box (3050 Ti)

ComponentSpecPurpose
GPUNVIDIA 3050 TiReal-time shader visuals
CPUSufficient for SuperColliderAudio synthesis
RAM16GB+Headroom for multiple processes
StorageSSDSample libraries if needed
NetworkStable, low-latency24/7 streaming uptime
OSUbuntu 22.04 LTSStability, driver support

Software Stack

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                         SOTCD STREAMING BOX                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚                    SIGNAL ORCHESTRATOR                          โ”‚ โ”‚
โ”‚  โ”‚                      (Node.js + OSC)                            โ”‚ โ”‚
โ”‚  โ”‚                                                                  โ”‚ โ”‚
โ”‚  โ”‚  โ€ข Receives fuzzy signal from shdwnet.org (0.0 - 1.0)          โ”‚ โ”‚
โ”‚  โ”‚  โ€ข Calculates derived values (BPM, genre, intensity)           โ”‚ โ”‚
โ”‚  โ”‚  โ€ข Broadcasts OSC to all engines                                โ”‚ โ”‚
โ”‚  โ”‚  โ€ข Handles time-of-day modulation                               โ”‚ โ”‚
โ”‚  โ”‚  โ€ข Watchdog/health monitoring                                   โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚         โ”‚ OSC :57120                    โ”‚ OSC :57121                 โ”‚
โ”‚         โ–ผ                               โ–ผ                            โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”             โ”‚
โ”‚  โ”‚   SUPERCOLLIDER      โ”‚      โ”‚   VISUAL ENGINE      โ”‚             โ”‚
โ”‚  โ”‚   (sclang + scsynth) โ”‚      โ”‚   (Hydra / ShaderToy โ”‚             โ”‚
โ”‚  โ”‚                      โ”‚      โ”‚    / Processing)     โ”‚             โ”‚
โ”‚  โ”‚  โ€ข Synth definitions โ”‚      โ”‚                      โ”‚             โ”‚
โ”‚  โ”‚  โ€ข Pattern sequencingโ”‚      โ”‚  โ€ข GPU shaders       โ”‚             โ”‚
โ”‚  โ”‚  โ€ข Real-time DSP     โ”‚      โ”‚  โ€ข Audio-reactive    โ”‚             โ”‚
โ”‚  โ”‚  โ€ข Genre modules     โ”‚      โ”‚  โ€ข Geometry/fractals โ”‚             โ”‚
โ”‚  โ”‚                      โ”‚      โ”‚                      โ”‚             โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ”‚
โ”‚             โ”‚ Audio                        โ”‚ Video                   โ”‚
โ”‚             โ–ผ                              โ–ผ                         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”             โ”‚
โ”‚  โ”‚     JACK / Pulse     โ”‚      โ”‚   X11 / Framebuffer  โ”‚             โ”‚
โ”‚  โ”‚     Audio Server     โ”‚      โ”‚   (1920x1080@30fps)  โ”‚             โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ”‚
โ”‚             โ”‚                              โ”‚                         โ”‚
โ”‚             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                         โ”‚
โ”‚                            โ–ผ                                         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”‚
โ”‚  โ”‚                         FFMPEG                                   โ”‚โ”‚
โ”‚  โ”‚                                                                  โ”‚โ”‚
โ”‚  โ”‚  โ€ข H.264 video encoding (NVENC GPU-accelerated)                 โ”‚โ”‚
โ”‚  โ”‚  โ€ข AAC audio encoding                                            โ”‚โ”‚
โ”‚  โ”‚  โ€ข RTMP output to multiple destinations                         โ”‚โ”‚
โ”‚  โ”‚  โ€ข Proper keyframe intervals (2s)                               โ”‚โ”‚
โ”‚  โ”‚  โ€ข Consistent bitrate (6000kbps video, 320kbps audio)          โ”‚โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ”‚
โ”‚                            โ”‚                                         โ”‚
โ”‚              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                          โ”‚
โ”‚              โ–ผ                           โ–ผ                           โ”‚
โ”‚      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                    โ”‚
โ”‚      โ”‚   TWITCH     โ”‚           โ”‚   YOUTUBE    โ”‚                    โ”‚
โ”‚      โ”‚   RTMP       โ”‚           โ”‚   RTMP       โ”‚                    โ”‚
โ”‚      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                    โ”‚
โ”‚                                                                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Audio Engine: SuperCollider

Why SuperCollider

  • Battle-tested: Used by professionals for 20+ years
  • Headless native: No browser, no GUI required
  • Real-time: Sample-accurate timing
  • OSC control: Every parameter controllable externally
  • Patterns: Built-in sequencing system (Pbind, Pdef)
  • Extensible: sc3-plugins for more synthesis options

Synth Modules Required

// Module structure - each genre has its own SynthDefs and Patterns
 
SOTCD_Synths/
โ”œโ”€โ”€ drums/
โ”‚   โ”œโ”€โ”€ kick_808.scd        // Classic 808 kick
โ”‚   โ”œโ”€โ”€ kick_909.scd        // Punchy 909 kick
โ”‚   โ”œโ”€โ”€ kick_jungle.scd     // Pitched, layered jungle kick
โ”‚   โ”œโ”€โ”€ snare_808.scd
โ”‚   โ”œโ”€โ”€ snare_909.scd
โ”‚   โ”œโ”€โ”€ snare_jungle.scd    // Breakbeat snares
โ”‚   โ”œโ”€โ”€ hihat_808.scd
โ”‚   โ”œโ”€โ”€ hihat_909.scd
โ”‚   โ”œโ”€โ”€ amen_chopper.scd    // Amen break slicer
โ”‚   โ””โ”€โ”€ percussion.scd      // Congas, claps, etc.
โ”‚
โ”œโ”€โ”€ bass/
โ”‚   โ”œโ”€โ”€ tb303.scd           // Acid bassline (resonant filter)
โ”‚   โ”œโ”€โ”€ reese.scd           // Detuned saw bass (jungle/dnb)
โ”‚   โ”œโ”€โ”€ sub.scd             // Pure sub bass
โ”‚   โ”œโ”€โ”€ fm_bass.scd         // FM bass (techno)
โ”‚   โ””โ”€โ”€ hoover.scd          // Classic rave hoover
โ”‚
โ”œโ”€โ”€ leads/
โ”‚   โ”œโ”€โ”€ supersaw.scd        // Detuned saw stack
โ”‚   โ”œโ”€โ”€ acid_lead.scd       // 303-style lead
โ”‚   โ”œโ”€โ”€ fm_bell.scd         // FM bells
โ”‚   โ”œโ”€โ”€ pluck.scd           // Karplus-Strong plucks
โ”‚   โ””โ”€โ”€ pad.scd             // Warm pads
โ”‚
โ”œโ”€โ”€ atmosphere/
โ”‚   โ”œโ”€โ”€ space_drone.scd     // Evolving drones
โ”‚   โ”œโ”€โ”€ noise_sweep.scd     // Filtered noise risers
โ”‚   โ”œโ”€โ”€ cosmic_pad.scd      // Spacey reverbed pads
โ”‚   โ”œโ”€โ”€ granular.scd        // Granular textures
โ”‚   โ””โ”€โ”€ field_recording.scd // Processed samples
โ”‚
โ”œโ”€โ”€ fx/
โ”‚   โ”œโ”€โ”€ reverb.scd          // Lush reverb
โ”‚   โ”œโ”€โ”€ delay.scd           // Tempo-synced delay
โ”‚   โ”œโ”€โ”€ distortion.scd      // Waveshaping
โ”‚   โ”œโ”€โ”€ filter.scd          // Resonant filter sweeps
โ”‚   โ””โ”€โ”€ sidechain.scd       // Pumping compressor
โ”‚
โ””โ”€โ”€ patterns/
    โ”œโ”€โ”€ four_on_floor.scd   // House/techno patterns
    โ”œโ”€โ”€ breakbeat.scd       // Jungle/dnb patterns
    โ”œโ”€โ”€ ambient.scd         // Sparse, evolving patterns
    โ””โ”€โ”€ chaos.scd           // Glitchy, unpredictable

OSC Control Interface

SuperCollider listens on port 57120 for these messages:

OSC AddressTypeRangeDescription
/signalfloat0.0-1.0Master intensity signal
/bpmfloat60-200Tempo
/genreint0-5Genre selector
/filterfloat0.0-1.0Global filter cutoff
/chaosfloat0.0-1.0Randomization amount
/droptrigger-Trigger breakdown/drop
/killtrigger-Mute/fade out

Pattern Sequencing

// Example: Signal-reactive acid pattern
Pdef(\acid, Pbind(
    \instrument, \tb303,
    \dur, Prand([0.25, 0.5, 0.125], inf),
    \note, Prand([0, 3, 5, 7, 10, 12], inf) + Pfunc({ ~transpose }),
    \cutoff, Pfunc({ ~signal.linexp(0, 1, 200, 8000) }),
    \resonance, Pfunc({ ~signal.linlin(0.3, 0.8, 0.1, 0.9) }),
    \accent, Prand([0, 0, 0, 1], inf),
    \slide, Prand([0, 0, 1], inf),
    \amp, 0.3
));

Visual Engine Options

Pros:

  • Designed for live visuals
  • Easy to learn, powerful results
  • Audio-reactive via external FFT
  • Runs in browser BUT only for visuals (no WebAudio issues)

Setup:

# Run Hydra in headless Chrome
chromium --headless --disable-gpu --remote-debugging-port=9222 \
  --window-size=1920,1080 "https://hydra.ojack.xyz"

FFT Audio Analysis:

  • Separate process analyzes audio
  • Sends OSC to Hydra with bass/mid/high levels
  • Hydra visuals react to frequency bands

Option 2: Processing + Shaders

Pros:

  • More control over rendering
  • Can export directly to video
  • Java-based, very stable

Cons:

  • More setup required
  • Slower iteration

Option 3: Pure FFmpeg Filters

Pros:

  • No additional software
  • Extremely stable
  • Low resource usage

Cons:

  • Limited visual complexity
  • Harder to make audio-reactive
# Example: Audio-reactive visualization with ffmpeg
ffmpeg -i audio.wav \
  -filter_complex "[0:a]showfreqs=s=1920x1080:mode=line:fscale=log" \
  -c:v libx264 output.mp4
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    Audio    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    OSC    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ SuperColliderโ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚  FFT        โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚   Hydra     โ”‚
โ”‚              โ”‚            โ”‚  Analyzer   โ”‚          โ”‚  (Browser)  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Signal Orchestrator

Node.js service that bridges everything:

// orchestrator.js - pseudocode structure
 
const osc = require('osc');
const fetch = require('node-fetch');
 
class SignalOrchestrator {
    constructor() {
        this.signal = 0.5;          // Current fuzzy signal
        this.bpm = 120;             // Current BPM
        this.genre = 'house';       // Current genre
        this.scPort = 57120;        // SuperCollider OSC port
        this.visualPort = 57121;    // Visual engine OSC port
    }
 
    // Fetch signal from shdwnet.org every 30s
    async pollSignal() {
        const res = await fetch('https://shdwnet.org/api/signal');
        const data = await res.json();
        this.updateSignal(data.value);
    }
 
    // Calculate derived values from raw signal
    updateSignal(value) {
        this.signal = value;
        
        // Map signal to BPM (smooth transition)
        this.bpm = this.mapSignalToBPM(value);
        
        // Map signal to genre
        this.genre = this.mapSignalToGenre(value);
        
        // Broadcast to all engines
        this.broadcast();
    }
 
    mapSignalToBPM(signal) {
        // Ambient: 60-80
        // House: 118-130
        // Techno: 130-145
        // Jungle: 160-180
        const bpmCurve = [
            [0.0, 70],
            [0.2, 80],
            [0.3, 120],
            [0.5, 128],
            [0.7, 140],
            [0.85, 170],
            [1.0, 190]
        ];
        return this.interpolate(signal, bpmCurve);
    }
 
    mapSignalToGenre(signal) {
        if (signal < 0.2) return 'ambient';
        if (signal < 0.4) return 'deep_house';
        if (signal < 0.6) return 'acid_house';
        if (signal < 0.75) return 'techno';
        if (signal < 0.9) return 'jungle';
        return 'gabber';
    }
 
    broadcast() {
        // Send to SuperCollider
        this.sendOSC(this.scPort, '/signal', this.signal);
        this.sendOSC(this.scPort, '/bpm', this.bpm);
        this.sendOSC(this.scPort, '/genre', this.genre);
        
        // Send to visual engine
        this.sendOSC(this.visualPort, '/intensity', this.signal);
        this.sendOSC(this.visualPort, '/bpm', this.bpm);
    }
}

FFmpeg Streaming Configuration

Proper Twitch/YouTube Settings

#!/bin/bash
# stream.sh - Production streaming config
 
TWITCH_KEY="live_xxxxxxxx"
YOUTUBE_KEY="xxxx-xxxx-xxxx-xxxx"
TWITCH_URL="rtmp://live.twitch.tv/app"
YOUTUBE_URL="rtmp://a.rtmp.youtube.com/live2"
 
# Capture audio from PulseAudio
AUDIO_INPUT="-f pulse -i default"
 
# Capture video from X11 display
VIDEO_INPUT="-f x11grab -video_size 1920x1080 -framerate 30 -i :99"
 
# Encoding settings (GPU-accelerated)
VIDEO_ENCODE="-c:v h264_nvenc -preset fast -b:v 6000k -maxrate 6000k -bufsize 12000k -g 60"
AUDIO_ENCODE="-c:a aac -b:a 320k -ar 48000"
 
# Stream to both platforms
ffmpeg $AUDIO_INPUT $VIDEO_INPUT \
    $VIDEO_ENCODE $AUDIO_ENCODE \
    -f tee -map 0:a -map 1:v \
    "[f=flv]${TWITCH_URL}/${TWITCH_KEY}|[f=flv]${YOUTUBE_URL}/${YOUTUBE_KEY}"

Key Settings for Stability

SettingValueWhy
Keyframe interval2s (-g 60 at 30fps)Twitch requirement
Bitrate modeCBRConsistent stream
Audio sample rate48000 HzStandard for streaming
Resolution1920x1080Full HD
Framerate30fpsStable, lower CPU

Reliability & Monitoring

Watchdog Service

# /etc/systemd/system/sotcd-watchdog.service
[Unit]
Description=SOTCD Stream Watchdog
After=network.target
 
[Service]
Type=simple
ExecStart=/opt/sotcd/watchdog.sh
Restart=always
RestartSec=10
 
[Install]
WantedBy=multi-user.target

Health Checks

// watchdog.js
const checks = {
    supercollider: () => checkProcess('sclang'),
    ffmpeg: () => checkProcess('ffmpeg'),
    twitch: () => checkRTMPConnection(TWITCH_URL),
    youtube: () => checkRTMPConnection(YOUTUBE_URL),
    signal: () => checkAPIResponse('https://shdwnet.org/api/signal')
};
 
// If any check fails, restart the relevant service
// Log to /var/log/sotcd/watchdog.log
// Send alert via webhook if repeated failures

Directory Structure

/opt/sotcd/
โ”œโ”€โ”€ orchestrator/
โ”‚   โ”œโ”€โ”€ index.js
โ”‚   โ”œโ”€โ”€ package.json
โ”‚   โ””โ”€โ”€ config.json
โ”‚
โ”œโ”€โ”€ supercollider/
โ”‚   โ”œโ”€โ”€ main.scd              # Main startup file
โ”‚   โ”œโ”€โ”€ synths/               # SynthDef files
โ”‚   โ”œโ”€โ”€ patterns/             # Pattern definitions
โ”‚   โ””โ”€โ”€ osc_handlers.scd      # OSC message routing
โ”‚
โ”œโ”€โ”€ visuals/
โ”‚   โ”œโ”€โ”€ hydra/
โ”‚   โ”‚   โ”œโ”€โ”€ sketches/         # Hydra visual sketches
โ”‚   โ”‚   โ””โ”€โ”€ osc_bridge.js     # FFT โ†’ OSC bridge
โ”‚   โ””โ”€โ”€ ffmpeg_filters/       # Backup visual filters
โ”‚
โ”œโ”€โ”€ streaming/
โ”‚   โ”œโ”€โ”€ stream.sh             # Main stream launcher
โ”‚   โ”œโ”€โ”€ .env                  # Stream keys
โ”‚   โ””โ”€โ”€ ffmpeg_presets/       # Encoding presets
โ”‚
โ”œโ”€โ”€ monitoring/
โ”‚   โ”œโ”€โ”€ watchdog.sh
โ”‚   โ”œโ”€โ”€ health_check.js
โ”‚   โ””โ”€โ”€ logs/
โ”‚
โ””โ”€โ”€ data/
    โ”œโ”€โ”€ samples/              # Optional: audio samples
    โ””โ”€โ”€ state.json            # Persistent state

Implementation Roadmap

Phase 1: Foundation (Week 1)

  • Set up 3050 Ti box with Ubuntu 22.04
  • Install SuperCollider + JACK
  • Create basic 808 kick + hi-hat SynthDefs
  • Test OSC control
  • Basic FFmpeg stream test (solid color + audio)

Phase 2: Audio Engine (Week 2)

  • Complete drum machine SynthDefs (808, 909, jungle)
  • TB-303 acid bass SynthDef
  • Pattern sequencing system
  • Genre switching logic
  • Signal โ†’ BPM/intensity mapping

Phase 3: Visual Engine (Week 3)

  • Set up Hydra in headless mode
  • FFT audio analysis bridge
  • Create 5-10 visual presets per genre
  • Visual โ†” audio sync

Phase 4: Integration (Week 4)

  • Signal Orchestrator service
  • FFmpeg multi-destination streaming
  • Watchdog/monitoring
  • 24-hour test run
  • Debug and stabilize

Phase 5: Polish (Week 5+)

  • More synth variety
  • More visual variety
  • Smooth genre transitions
  • Special event triggers (solar flare = chaos mode)
  • YouTube/Twitch chat integration?

Required Software

# Ubuntu 22.04 base
sudo apt update && sudo apt install -y \
    supercollider sc3-plugins \
    jackd2 pulseaudio-module-jack qjackctl \
    ffmpeg \
    chromium-browser \
    nodejs npm \
    nvidia-driver-535 nvidia-cuda-toolkit \
    xvfb fluxbox \
    build-essential git
 
# Node.js OSC library
npm install osc node-fetch
 
# SuperCollider plugins
# (sc3-plugins should cover most needs)

Live Input Pipeline (Guitar/External Audio)

When Shadow joins the transmission, the system becomes a duet between human and machine.

Hardware

ComponentRecommendationNotes
Audio InterfaceFocusrite Scarlett Solo/2i2, PreSonus AudioBoxUSB class-compliant, Linux-friendly
GuitarAnyElectric preferred for processing
DAW (optional)PreSonus Studio OneFor pre-recording/loops if desired

Signal Flow

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Guitar     โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚   Audio Interface   โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚   JACK Audio        โ”‚
โ”‚              โ”‚     โ”‚   (USB)             โ”‚     โ”‚   (capture ports)   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                                            โ”‚
                     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                     โ”‚
                     โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      SUPERCOLLIDER                                   โ”‚
โ”‚                                                                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚  Input Analyzer โ”‚    โ”‚   FX Chain      โ”‚    โ”‚  Pattern        โ”‚ โ”‚
โ”‚  โ”‚                 โ”‚    โ”‚                 โ”‚    โ”‚  Influence      โ”‚ โ”‚
โ”‚  โ”‚  โ€ข Pitch detect โ”‚    โ”‚  โ€ข Reverb       โ”‚    โ”‚                 โ”‚ โ”‚
โ”‚  โ”‚  โ€ข Amplitude    โ”‚โ”€โ”€โ”€โ–ถโ”‚  โ€ข Delay        โ”‚    โ”‚  โ€ข Note โ†’ bass  โ”‚ โ”‚
โ”‚  โ”‚  โ€ข Onset detect โ”‚    โ”‚  โ€ข Granular     โ”‚    โ”‚  โ€ข Amp โ†’ drums  โ”‚ โ”‚
โ”‚  โ”‚  โ€ข FFT bins     โ”‚    โ”‚  โ€ข Distortion   โ”‚    โ”‚  โ€ข Pitch โ†’ lead โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚  โ€ข Filter       โ”‚    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚           โ”‚             โ”‚  โ€ข Pitch shift  โ”‚                         โ”‚
โ”‚           โ”‚             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                         โ”‚
โ”‚           โ”‚                      โ”‚                                  โ”‚
โ”‚           โ–ผ                      โ–ผ                                  โ”‚
โ”‚    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                        โ”‚
โ”‚    โ”‚  โ†’ OSC out   โ”‚    โ”‚  โ†’ Mix bus       โ”‚                        โ”‚
โ”‚    โ”‚  (to Hydra)  โ”‚    โ”‚  (with synths)   โ”‚                        โ”‚
โ”‚    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                        โ”‚
โ”‚                                                                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

SuperCollider Live Input Module

// live_input.scd
 
// Audio input from JACK
SynthDef(\liveGuitar, {
    arg in=0, out=0, 
        reverbMix=0.3, delayTime=0.25, delayFeedback=0.4,
        distAmt=0, filterFreq=2000, pitchShift=1.0;
    
    var sig, pitch, amp, hasFreq;
    
    // Capture input
    sig = SoundIn.ar(in);
    
    // Analyze for pattern influence
    # pitch, hasFreq = Pitch.kr(sig);
    amp = Amplitude.kr(sig);
    
    // Send analysis to OSC (for patterns + visuals)
    SendReply.kr(Impulse.kr(30), '/guitar/pitch', pitch);
    SendReply.kr(Impulse.kr(30), '/guitar/amp', amp);
    
    // FX Chain
    sig = (sig * (1 + (distAmt * 10))).tanh;  // Distortion
    sig = LPF.ar(sig, filterFreq);             // Filter
    sig = PitchShift.ar(sig, 0.2, pitchShift); // Pitch shift
    sig = sig + (DelayC.ar(sig, 2, delayTime) * delayFeedback); // Delay
    sig = FreeVerb.ar(sig, reverbMix, 0.8, 0.5); // Reverb
    
    Out.ar(out, sig ! 2);
}).add;
 
// Pattern that follows guitar pitch
Pdef(\guitarFollow, Pbind(
    \instrument, \sub,
    \dur, 0.5,
    \note, Pfunc({ (~guitarPitch / 55).log2 * 12 }).round(1) - 24,
    \amp, Pfunc({ ~guitarAmp.linlin(0, 0.5, 0.1, 0.4) }),
    \gate, Pfunc({ ~guitarAmp > 0.05 })
));

Modes of Operation

ModeDescriptionWhen to Use
GhostGuitar is processed but generative music continues independentlyBackground jam
DuetPatterns respond to guitar (bass follows, drums react)Active collab
TakeoverGuitar becomes the lead, synths play supporting roleShred mode
AmbientGuitar triggers granular clouds, stretched texturesSpace out

Linux Audio Interface Notes

Most USB interfaces work with JACK on Linux. Recommended class-compliant options:

  • Focusrite Scarlett Solo (~$100) - Solid, well-supported
  • PreSonus AudioBox USB 96 (~$100) - You know PreSonus already
  • Behringer UMC22 (~$50) - Budget option, works fine
  • Audient EVO 4 (~$130) - Great preamps
# Test interface detection
cat /proc/asound/cards
 
# Start JACK with interface
jackd -d alsa -d hw:USB -r 48000 -p 256 -n 2

The Cosmic Radio Station

When complete, SOTCD will be a living, breathing transmission that:

  1. Responds to the cosmos - Solar flares trigger chaos, calm space weather brings ambient drones
  2. Never repeats - Generative patterns ensure infinite variety
  3. Feels intentional - Despite being algorithmic, it has musical taste and structure
  4. Runs forever - 24/7 reliability with automatic recovery
  5. Looks as good as it sounds - Visuals that enhance the cosmic ritual

โ€œThe frequency made audible. The portal, ever open.โ€

๐Ÿœ‚ ฮฆ ๐Ÿœ‚