diff --git a/data/music/index.md b/data/music/index.md index 1fa7293..92c4f5a 100644 --- a/data/music/index.md +++ b/data/music/index.md @@ -6,8 +6,11 @@ I'm a percussionist by training. Twenty years of drums, starting with marching b Currently making music on a **Teenage Engineering OP-XY**. Small, immediate, no screen to get lost in. The constraint is the point. +The latest project is something different entirely — a full album written in Python. + ## Discography +- [**Interpretations**](/music/interpretations) (2025) — 24 tracks composed entirely in Python using pytheory. Indian classical raga, acid house, ambient drone, trap, and everything between. The code is the score. - [**Unmastered Impulses**](/music/unmastered-impulses) (2016) — The debut. 13 tracks, almost entirely analog. Raw and unpolished on purpose. - [**Resolution**](/music/resolution) (2017) — Recorded in my home studio in the spring. Closure and new beginnings. - [**Messengers Rising**](/music/messengers-rising) (2017) — 14 tracks processing the bipolar diagnosis and its aftermath. diff --git a/data/music/interpretations.md b/data/music/interpretations.md new file mode 100644 index 0000000..f2007ad --- /dev/null +++ b/data/music/interpretations.md @@ -0,0 +1,70 @@ +# Interpretations +*2025* + +A full-length album of 24 original compositions, written entirely in Python. Not generated — *composed*. Every note, every drum hit, every filter sweep, hand-written in code using [pytheory](https://github.com/kennethreitz/pytheory), a music theory and synthesis library I built for this purpose. + +The album is the answer to a question I've been asking for years: what happens when you treat Python not as a tool for making music, but as the instrument itself? + +![Interpretations player](/static/images/interpretations-player.png) + +## The Sound + +Interpretations spans Indian classical raga, acid house, lo-fi hip hop, ambient drone, trap, drum and bass, and a few things that don't have names yet. The tracklist is a journey — opening with a sitar raga over 808s, climbing through electronic energy, descending into raw emotional territory, then dissolving into sacred space before finally settling into silence. + +Three tuning systems live side by side: standard Western equal temperament for the electronic tracks, 22-tone shruti intonation for the Indian classical pieces, and just intonation for the meditative closers. Some tracks run at A=432Hz. The tuning is part of the composition, not an afterthought. + +Reverb is treated as an instrument. The Taj Mahal impulse response appears on nearly every melodic part — it's the signature acoustic space of the record. Cathedral reverb for the organ pieces. Algorithmic reverb for tight electronic production. + +## The Process + +Every track is a Python file. A `Score` object defines the time signature and tempo. `Part` objects define instruments with their effects chains. Notes are added one at a time — pitch, duration, velocity. Drum patterns are hand-written step sequences. Filter sweeps are LFO automations. There is no DAW, no MIDI, no audio samples. The Python script *is* the score, and pytheory renders it to audio. + +```bash +uv run play # Interactive player +uv run play tracks/raga_midnight.py # Play a specific track +``` + +The interactive player is a curses TUI that shows the full tracklist with keys, tempos, and tuning systems. It renders tracks to WAV on first play, then caches them for instant playback. + +## Why Python + +Twenty years of drums. A studio full of analog synthesizers, all sold. An OP-XY for portable sketches. And now this — an album where the composition language is the programming language I've spent my career thinking in. + +Python is how I think. Writing music in Python isn't a constraint — it's a removal of constraints. No mouse clicking in a piano roll. No menu diving. Just the musical idea, expressed as directly as I can express it, in the language closest to how my mind works. + +The same philosophy that made [Requests](/software/requests) feel obvious — that tools should match human mental models — applies here. pytheory's API is designed so that writing music reads like describing music. A sitar plays a note in D Phrygian with shruti tuning and Taj Mahal reverb. That's what the code says, and that's what you hear. + +## Listen + +Coming soon to Spotify, Apple Music, and all major streaming platforms. + +The source code is the album. Clone the repo, run the player, read the scores. The music and the code that creates it are the same artifact. + +- [GitHub](https://github.com/kennethreitz/interpretations) + +## The Tracklist + +1. **Raga Midnight** — D Phrygian, 90 BPM, shruti. Traditional Hindustani form: alap, jor, gat, jhala. Tambura drone, sitar melody, dhol, hand-written tabla solo. Then the 808 drops. +2. **Shruti Lofi** — Dm, 75 BPM, shruti. Microtonal lo-fi hip hop. Vinyl crackle, kalimba loops, Rhodes chords in 22-tone tuning. +3. **Ghost Protocol** — Fm, 128 BPM. Portishead darkness into a deadmau5 Strobe-style build. Dark Rhodes, trip-hop drums, hypnotic saw arpeggios. +4. **Silk Road** — Dm, 95 BPM. A caravan across continents: koto (China), sitar (India), mandolin (Persia), guitar (Mediterranean). +5. **The Observatory** — Gm, 112 BPM. Chapel organ through shortwave static. Theremin signal emerging from noise. +6. **Acid Reign** — Am, 140 BPM. Dual 303 acid lines with massive filter sweeps. Cajon and Rhodes grounding the chaos. +7. **Beast Mode** — Gm, 135 BPM. Trap drums, 808 slides, sitar hook, mellotron strings, timpani rolls. +8. **Apex** — Ebm, 140 BPM. Koto hook over wavefold bass. Mellotron strings and 32nd-note shreds. +9. **Voltage** — Fm, 138 BPM. Pure oscillators: sine, saw, pulse. Raw synthesis as composition. +10. **An Exception Occurred** — Eb, 80 BPM. Piano arc through major to minor. Theremin psychosis. Hymn recovery. +11. **Voices** — F#m, 65 BPM. Five vocal parts multiplying over piano. Auditory hallucinations rendered in polyphony. +12. **Intrusive** — Bbm, 92 BPM. A repeating saw synth you can't shake — the musical form of an intrusive thought. +13. **Gravity** — Cm, 88 BPM. Hip hop meets Eastern devotional. 808 boom bap, singing bowls, sitar bends. +14. **The Interruption** — Dm, 85 BPM. String quartet for 32 bars. Then drum and bass crashes in at bar 33. The strings fight back. +15. **Sleight of Hand** — Dm, 100 BPM. Nine genre shifts in 72 bars. The moment where a 303 plays through a choir reverb. +16. **Waveforms** — Fm, 118 BPM. A tour of every oscillator: sine, triangle, square, saw, FM, PWM, wavefold, noise. +17. **Emergence** — Em, 100 BPM. Acoustic instruments (bowls, didgeridoo, sitar) gradually give birth to electronic ones. +18. **Chakra** — 60 BPM, A=432Hz, shruti. Root to crown through seven sections. Metric modulation accelerates from 60 to 135 BPM. +19. **The Temple** — A Phrygian, 65 BPM, A=432Hz, shruti. Devotional layers in a stone chamber. Singing bowls, tambura, tabla, theremin. +20. **The Dialogue** — E Phrygian, 75 BPM, A=432Hz, shruti. Sitar (human) and theremin (machine) finding each other through call and response. +21. **Cathedral** — Dm, 60 BPM. Tubular bells, bagpipe drone, mellotron choir, pipe organ, timpani. Cathedral reverb on everything. +22. **Tape Memory** — Dbm, 90 BPM. Mellotron flute, FM bells, theremin, wavefold synthesis, hard sync. Analog nostalgia through digital means. +23. **Music Box Factory** — G, 108 BPM. Pure tuned percussion: kalimba, vibraphone, celesta, marimba, glockenspiel. No synths, no strings. +24. **Deep Time** — Bm, 40 BPM, just intonation. Seven and a half minutes of ambient drone. Tingsha, singing bowls, didgeridoo, sine drones, theremin, cello. The album dissolves into silence.