klaas klee

NODESTROM

klangbild-KLS00199-2Large

Repository | Releases | Manual | Examples

NODESTROM is a node-based interface tool for live performances. It acts as a modular bridge between creative real-time systems, receiving, interpreting, processing, and forwarding signals between music and visuals. Originally developed for my own audiovisual live-coding practice, its open architecture makes it useful for many signal routing scenarios.

The Problem

In audiovisual performances, instruments and sequencers produce musical data (e.g. MIDI) that needs to be translated into visual parameters. Traditionally, this interpretation logic lives inside each individual receiver, meaning every time you swap a visualizer or change your setup, you have to rewrite everything from scratch.

┌─────────────────────────────────────────────────────────┐
│  SENDER (sequencer, synthesizer, controller, ...)       │
└─────────────────────────────────────────────────────────┘
                          ↓
                    (MIDI signals)
                          ↓
┌─────────────────────────────────────────────────────────┐
│  RECEIVER (visualizer, synth, DAW, ...)                 │
│                                                         │
│  ┌────────────────────────────────────────────────────┐ │
│  │  interpretation logic baked into each receiver     │ │
│  └────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘

Logic inside the RECEIVER

The Solution

NODESTROM sits between sender and receiver as an independent intermediary layer. The interpretation logic moves out of your receivers and into one central, visual environment, making the entire setup modular and reusable.

┌─────────────────────────────────────────────────────────┐
│  SENDER (sequencer, synthesizer, controller, ...)       │
└─────────────────────────────────────────────────────────┘
                          ↓
                    (MIDI signals)
                          ↓
┌─────────────────────────────────────────────────────────┐
│  NODESTROM                                              │
│                                                         │
│  ┌────────────────────────────────────────────────────┐ │
│  │  interpretation logic lives here now               │ │
│  └────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
                          ↓
                 (interpreted signals)
                          ↓
┌─────────────────────────────────────────────────────────┐
│  RECEIVER (visualizer, synth, DAW, ...)                 │
└─────────────────────────────────────────────────────────┘

Logic inside NODESTROM

Swap receivers without rewriting logic. Change your sender setup mid-performance. Use presets to switch entire configurations in real time. Both sides stay independent, connected only through NODESTROM.

How It Works

NODESTROM provides a visual canvas where you place nodes, small functional building blocks, and connect them freely with edges (the cables between them). Each node does one specific thing: receive a MIDI signal, filter a value, generate a pattern, convert data types, send an output. The power comes from combining them.

interface-nicepatch-brightLarge1

NODESTROM-patch

Nodes communicate through typed sockets:
Bang: a trigger signal („something happened“)
Value: a single number or string (velocity, note, position…)
Dict: a complete protocol message (e.g. full MIDI data with note, velocity, channel…)

The feature set grows with every new node. The current version focuses on MIDI, with OSC and DMX planned for the future.

Use Cases

NODESTROM adapts to different signal routing setups:

Bridge:
Translate signals between two systems.

Sequencer → NODESTROM → Visualizer

Splitter:
Route one input to multiple destinations.

                        → Synth 1
Controller → NODESTROM  → Synth 2
                        → Visualizer

Merger:
Combine multiple inputs into one output.

Keyboard   →
Controller → NODESTROM → Visualizer
Sequencer  →

Generator:
Use NODESTROM itself as a sequencer.

NODESTROM (internal clock + patterns) → Synth
                                      → Visualizer

Feedback Loop:
Multi-stage processing where visuals trigger sounds.

                ┌─────────────────────────────────┐
                ↓                                 │
Controller → NODESTROM → Visualizer (sends back)──┘
                ↓
              Synth

Node Overview

NODESTROM ships with a growing library of nodes across several categories:

CategoryNodesPurpose
UtilityNote, DebugComments, value inspection
Trigger & TimingBang, Clock, To BangManual/automated triggers, tempo control
Data ProcessingInput, Convert, Count, Random, Map To, ScriptValue generation, type conversion, mapping, custom logic
Pattern & SequencingPattern, Graph DrawStep sequences, hand-drawn curves
MIDIMIDI Input, MIDI Output, MIDI Select, MIDI Filter, MIDI Edit, MIDI Build, MIDI NoteFull MIDI I/O, filtering, message construction
InterfaceInterface NodeCustom JSON-configured nodes for complex setups

A complete and interactive overview of all nodes is included in the built-in tutorial: Help → Examples → Tutorial

Installation

– Download the latest release
– Unzip and move NodeStrom.app to your Applications folder
– macOS will likely block the unsigned app on first launch. Remove the quarantine flag via Terminal:

xattr -dr com.apple.quarantine NodeStrom.app

Platform: macOS (Apple Silicon / ARM64)
License: MIT, open source, full source code on Codeberg

Context

NODESTROM was developed as my bachelor project at HfK Bremen. It grew out of a real need in my own audiovisual live-coding practice: the friction of rewriting signal interpretation logic for every new piece or setup. NODESTROM doesn’t generate sound or visuals itself. It connects the things that do.

CODEDesignPerformanceTool