Marcus Anderson

Research notes, papers, software, and archived music work.

New invite code j7Uh4vGg4UrF Try my probabilistic music-generation studio at thesoundinator.com

Research

Software

Soundinator — a probabilistic, physically-modelled music studio and research instrument

A full browser-based music studio, designed and built end-to-end. It generates music from weighted probability distributions across several musical timescales, renders it through a physical-modelling synthesis engine, and arranges it on a multitrack producer timeline — while doubling as a reproducible instrument for researching why music sounds good.

Soundinator is now live at thesoundinator.com — in early testing, so access is invite-only. The first 30 people can create an account with the invite code j7Uh4vGg4UrF. Found a problem? There's a “Report a problem” button in the account menu — every report helps.

Soundinator's generative view: recent history to the left of the playhead, and a probability field of possible futures to the right, across melody, rhythm, surprise and motif-memory lanes.
The Macro Probability panel for melody: walk and arpeggio generation modes, interval and accuracy sliders, and a per-scale-degree probability histogram mixing generation, accuracy and surprise.
The distributions behind the field — every choice the generator makes is an editable probability: here the melody walker's interval shape, accuracy and per-scale-degree histogram, with generation, accuracy and surprise stacked in one view.
Soundinator's sub-note designer: the excitor, resonator, body, effects and space stages above a binaural stage view, with an Ears panel showing what reaches each ear.
The sub-note designer — every note is built from an excitor → resonator → body → effects → space chain and placed in one shared binaural room; the Ears panel shows what actually arrives at each ear, when, and how it's coloured.
Soundinator's resonator partial field: individual partials plotted by frequency and level, with decay time, wobble and cross-partial coupling on a pinned partial's inspector.
Inside the resonator — a field of individual partials, each with its own level, decay time, wobble and coupling to other partials; focus filters isolate the odd, even, coupled or long-ringing ones.
The Sculpt EQ, a skeuomorphic program equaliser, open in Soundinator's per-layer effects rack ahead of a tube drive and wavefolder.
The effects rack — plugin-style effects with their own DSP and presets; here a program equaliser sits ahead of a tube drive and a wavefolder in one layer's chain.
Soundinator's producer with the piano-roll note editor open beneath a multitrack timeline of seed-reproducible regions.
The producer — arrange seed-reproducible takes on a multitrack timeline (with a global scale and a global space that evolve over time), and bake any region open into a piano-roll note editor.
Soundinator's Global Space lane in the producer: per-track distance curves evolving across the arrangement above the multitrack timeline.
Global Space in the producer — the whole arrangement shares one room, and each track's position through it is drawn over time, so voices drift nearer and farther as the piece plays.
Soundinator's Scale Lab: a microtonal tuning wheel with just-ratio and EDO grids, tuning presets and Scala import and export.
The Scale Lab — design microtonal scales on a tuning wheel: N-EDO grids, just-ratio intervals, per-degree roles and cents, with Scala import / export.
Soundinator's community library: shared instrument cards with ratings, and the auditioner bar layering two shared patches into a live jam.
The community library — share instruments, sequences and behaviours, rate what others post, and stack shared patches in the auditioner to hear them jam together live.

Vanilla JavaScript + Web Audio in the browser, backed by a Python (NumPy / SciPy) engine for reproducible offline rendering. · Source and full write-up on GitHub →

Biologically Inspired Graph Networks — a self-teaching notebook course on network topology, from graph theory to developmental pruning

A seven-notebook course that starts from graph-theory basics and builds towards the pruning-based network construction behind my sparse-network papers. It's written as a way into thinking about neural networks the way biology does: not wired from scratch, but grown dense and then pruned back. Every notebook motivates its maths with the brain — neurons as nodes, synapses as weighted edges — and ends in runnable code you can re-generate, change, and measure.

Four network-generation methods drawn side by side — Erdős-Rényi, Watts-Strogatz, Barabási-Albert, and a spatial inverse-square model — each labelled with its clustering coefficient.

The through-line is one question: what makes a network look like a brain? The course answers it by measuring candidate networks against biological criteria, then showing that pruning a dense weighted graph reproduces those criteria more faithfully than the standard random models.

Three small labelled graphs — undirected, directed, and weighted — side by side.
The vocabulary the course starts from — undirected, directed and weighted graphs — introduced through their neural counterparts: synapses that point one way, and connections that vary in strength.
The same four-node graph shown four times, each highlighting one node and its clustering coefficient, from 1.00 down to 0.00.
Clustering coefficient, one node at a time — the fraction of a node's neighbours that are also connected to each other. It's the first quantitative handle on whether a network has brain-like local structure.
Left: a dense hairball of 1,770 edges. Right: the same nodes reduced to a sparse, clearly structured 177-edge network after keeping only the strongest connections.
The pruning philosophy in one picture — a dense 1,770-edge graph reduced to 177 edges by keeping only the strongest connections. The brain builds sparse networks the same way: start dense, then prune. This is the process the papers build on.

Python notebooks (NetworkX / NumPy / Matplotlib / scikit-learn), runnable in Jupyter or Colab. · Notebooks and full course on GitHub →

Archive