§ I · The Workshop
Eleven instruments
for music theory.
Small operative models of musicological ideas — and a personal bookshelf for what you find in the Library. Self-contained, no external dependencies.
Pitch-Class Set Calculator
A 12-pc clock face. Click pitches; watch normal form, prime form, interval vector, and Forte number compute live. All 223 set classes; complement, transposition, inversion.
Open → No. IITonnetz Explorer
An interactive triadic lattice. Apply P, L, R, N, S transformations and watch the highlighted triangle pivot. Hexatonic, octatonic, 24-triad cycle presets.
Open → No. IIITuning Lab
Visualise the harmonic series in real time; A/B-compare melodies in 12-TET, just intonation, Pythagorean, ¼-comma meantone, 24-TET, slendro, pelog.
Open → No. IVThe Discipline, 1850–2026
132 markers across institutions, publications, paradigms, controversies. Filter by subfield, search, zoom. Includes the 2019–2025 Ewell–JSS overlay.
Open → No. VGuitar Fretboard
A 6-string fretboard with logarithmic fret spacing. Eight tunings, 15 scales, 19 chord shapes with strum direction and inter-string spread.
Open → No. VIMetronome & Polyrhythm
Sub-millisecond Web Audio scheduling; nine time signatures; tap tempo. Polyrhythm mode runs 2:3, 3:4, 4:5, 5:7, 7:11 cross-rhythms aligned at the LCM cycle.
Open → No. VIIFlashcards (SRS)
127 cards across eleven decks. Each rating recomputes ease, interval, and the next due date; reviews persist in localStorage.
Bookshelf
A personal shelf for OpenAlex works. Save from the Library, tag and annotate, sort by added/year/citations, export as a Markdown reading list. Lives in localStorage.
Schenkerian Reduction
A grand staff with the Urlinie above and Bassbrechung below. Slide reduction depth from foreground to Ursatz; click any notehead to inspect its function (passing, neighbour, structural). Six examples — Mozart, Bach, Schubert, Beethoven, Twinkle.
Open → No. XTwelve-Tone Matrix
An ordered clock for the row, the 12×12 Babbitt matrix, all 48 P / I / R / RI forms playable. Discrete trichords, tetrachords, hexachords with Forte numbers; hexachordal combinatoriality and the all-combinatorial families A–F; derived-row detection. Eight canonical presets — Schoenberg op. 25 / op. 33a, Webern op. 21 / op. 24, Berg.
Open → No. XIMusicBrainz Lens
A live browser for the CC0 music encyclopedia. Search artists, works, recordings, and release-groups; pivot through composer/performer/recording relations; surface life-spans, ISWCs, ISRCs, and outbound links to Wikidata, IMSLP, and Discogs. The data side of the field guide.
Open →II The CLI Workshop seven instruments at the prompt
Where the eleven above are clicked and listened to, the seven below are piped and scripted — single-file Node scripts for pitch-class profiling, microtonal retuning, meter discovery, Euclidean and Xenakis-sieve generation, and melodic search. No dependencies; stdin in, structured stdout out. Read the index →
Interval-Class Histogram
Reads pitch tokens — MIDI numbers or note names with multi-accidentals (F##4, Cbb3) — and computes the Forte interval-class vector with cardinality and an optional ASCII histogram. --from-midi extracts the pitch-class set from a Standard MIDI File.
$echo "C4 E4 G4" | node 01-interval-histogram.js
Read →
No. XIII
Microtonality Scaler
Retunes a stream of MIDI integers into a non-12-TET system: edo:N, ji:p/q,…, cents:…, meantone:p/q. Just-intonation arithmetic is exact (BigInt) until the final Hz conversion. Output is one frequency per line, ready to feed an oscillator.
$echo "60 64 67" | node 02-scaler.js --tuning=ji:1/1,5/4,3/2
Read →
No. XIV
Onset / Meter Profiler
Reads inter-onset intervals (milliseconds or proportional units), estimates tactus from the IOI mode, runs autocorrelation on a sixteenth-note grid, and ranks candidate time signatures by Lerdahl–Jackendoff metric-weight correlation. Built for rubato, polyrhythm, and field-recorded transcription.
$echo "500 500 500 250 250 500" | node 03-meter.js
Read →
No. XV
Euclidean Rhythm Generator
Distributes k pulses evenly across n steps via Bjorklund's algorithm and labels canonical traditional patterns — tresillo, cinquillo, bossa-nova. Output formats: text, binary, pulse offsets, LilyPond, or a Standard MIDI File on stdout.
$node 04-euclid.js 3 8
Read →
No. XVI
Sieve Generator
Evaluates a Xenakis sieve expression — boolean operations |, &, ~ over residue classes (M,I) — via a tiny recursive-descent parser. Outputs integers, mod-12 pitch-class sets, binary strings, or SMF: algebra over the integers, set in motion.
$node 05-sieve.js "(7,0) | (12,1)" --range=0:60
Read →
No. XVII
Cantus-Firmus Search
Searches a haystack pitch sequence for occurrences of a needle melody, matching on consecutive intervals so transposition is free by construction. --inversions and --retrograde add the negated and reversed-negated forms; --threshold=N permits up to four edit-distance mismatches.
$node 06-cantus.js --needle="60 62 64 67" < corpus.txt
Read →
No. XVIII
MusicBrainz Query
The CLI counterpart of the Lens. Queries the MusicBrainz public ws/2 API for artists, works, recordings, release-groups; emits TSV by default, JSON or a compact tree on demand. Sets a User-Agent, retries once on 503, paginates with --limit/--offset, and pipes cleanly into cut, jq, or the other six tools.
$node 07-musicbrainz.js --type=artist "Bartók"
Read →