You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Blog:
- Publish "How I accidentally built a procedural music generator" as first post of 2026
- Expand "What's next" section with concrete directions
- Fix hotdog theme footnote (click to swap, not random)
- Add GASP pun to pixel fonts TIL
Music generator IDEAS.md:
- Add Generation Modes: scene presets, emotion targeting, loop exports,
stingers, emotional arcs, parameter locking, extended duration, drift mode
- Add Session Workflow: favorites, another take, quick export
- Add CLI/API section: programmatic API, HTTP endpoint, game editor plugins, WASM
- Add Beyond Music: SFX generation, adaptive music sets, visual sync
- Update priority tiers for actual use cases
Copy file name to clipboardExpand all lines: posts/how-insane-can-i-make-this/index.md
+15-7Lines changed: 15 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,10 +1,10 @@
1
1
---
2
2
title: "How I accidentally built a procedural music generator"
3
-
date: 2025-12-31
3
+
date: 2026-01-01
4
4
tags: [dev, web, building-in-public]
5
5
slug: how-insane-can-i-make-this
6
6
description: "I asked 'how insane can I make this?' at midnight. Three sleepless nights later: nine genres, twenty radio stations, and Dumpster Diving Certification ads."
7
-
draft: true
7
+
draft: false
8
8
---
9
9
10
10
```
@@ -23,7 +23,7 @@ This is the story of feature creep at 3am.
23
23
24
24
## December 3rd, midnight
25
25
26
-
I was tired. I should have gone to sleep. Instead, I started "messing with adding some themes" to this blog.
26
+
I was tired. I should have gone to sleep. Instead, I started messing with adding some themes to this blog.
27
27
28
28
First came the silly ones. A hotdog stand theme with two modes: ketchup (red background, yellow text) and mustard (yellow background, red text). A terminal theme. A few others.[^themes]
29
29
@@ -127,11 +127,19 @@ But where's the fun in that?
127
127
128
128
## What's next
129
129
130
-
I might use this for game sounds in [some small games I'm making](/posts/making-small-games/). The procedural approach means I don't need to compose anything - just define parameters and let it generate.
130
+
This thing is becoming a playground. Some directions I'm excited about:
131
131
132
-
More genres are planned. The IDEAS.md file has rock/metal, drum & bass, trip-hop, eurodance, industrial, gabber, acid. No timeline. It'll happen when I feel like it.
132
+
**More ways to generate:** Right now it reacts to page content or plays radio stations. I want modes for generating specific things - "give me 30 seconds of tense ambient" or "loop-ready chiptune for a game scene." Shareable song seeds so you can save and recall your favorites. Stem exports for mixing.
133
133
134
-
The whole thing is [open source](https://github.com/AviDuda/nocturnal-scribbles) (MIT license). The code is a beautiful mess, like all good Geocities tributes.
134
+
**More genres:** Rock/metal, drum & bass, trip-hop, eurodance, industrial, gabber, acid. The [IDEAS.md](https://github.com/AviDuda/nocturnal-scribbles/blob/main/src/geocities/music/IDEAS.md) has the full list.
135
+
136
+
**More radio chaos:** Dial-up modem handshake sounds between songs. ICQ "uh oh" notifications. Weather reports for the information superhighway. Time-locked stations that only broadcast at certain hours. Winamp skins for the player.
137
+
138
+
**Game audio:** I'm [making small games](/posts/making-small-games/) and the procedural approach means I don't need to compose anything - just define parameters and generate. Background music, menu themes, sound effects.
139
+
140
+
**More silly things:** Easter eggs. A cursor theremin. Typing percussion. Whatever sounds fun at 3 AM.
141
+
142
+
No timeline. It'll happen when it happens. The whole thing is [open source](https://github.com/AviDuda/nocturnal-scribbles) (MIT license). The code is a beautiful mess, like all good Geocities tributes.
135
143
136
144
---
137
145
@@ -166,7 +174,7 @@ Welcome to the information superhighway.
Copy file name to clipboardExpand all lines: posts/til-pixel-fonts-blurry/index.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -17,7 +17,7 @@ ArialPixel is designed on a 16×16 pixel grid (em=1024, 64-unit grid). It's outl
17
17
18
18
When the font size doesn't match the design grid (multiples of 16px), the pixel grid doesn't align with display pixels. Modern browsers apply antialiasing to smooth the edges. Result: blur.
19
19
20
-
I dug into the font with FontForge.[^fontforge] The GASP table had empty hinting flags - no gridfitting instructions telling renderers how to snap to pixels.
20
+
I dug into the font with FontForge.[^fontforge] The GASP table had empty hinting flags - no gridfitting instructions telling renderers how to snap to pixels. (I did gasp when I saw it. Sorry.)
-**Seamless evolution:** No abrupt changes, everything crossfades organically
118
+
-**Drift speed control:** How fast parameters change (glacial → noticeable)
119
+
120
+
Different from automix (discrete songs with crossfades). This is one continuous piece that becomes something else over time. Like generative ambient for long sessions.
121
+
122
+
Could have presets:
123
+
-**Study drift:** Stays in chill zone, very slow changes
124
+
-**Journey drift:** Explores full mood space over hours
125
+
-**Night drift:** Follows time of day (energetic evening → ambient late night → gentle morning)
126
+
127
+
---
128
+
129
+
## Session Workflow
130
+
131
+
Features for working with generated music (session-only, no persistence across visits).
132
+
133
+
### Favorites
134
+
135
+
-**Star current track:** Save to session favorites list
136
+
-**Favorites panel:** Review starred tracks
137
+
-**Re-generate from favorite:** Recreate using saved seed
138
+
-**Export all favorites:** Batch download
139
+
140
+
### Another Take
141
+
142
+
-**Regenerate similar:** New song, same parameters
143
+
-**Variation slider:** How different should the new take be (0% = nearly identical, 100% = just the locked params)
144
+
-**A/B comparison:** Toggle between current and previous
145
+
146
+
### Quick Export
147
+
148
+
WAV and MIDI export already exist. See [Export Improvements](#export-improvements) for format ideas.
149
+
150
+
Workflow improvements:
151
+
152
+
-**One-click export:** Download what's playing without opening menus
153
+
-**Export from favorites:** Batch download all starred tracks
154
+
-**Auto-filename:** Use generated track name as filename
155
+
156
+
---
157
+
25
158
## New Genres
26
159
27
160
Genres that fit the 90s web aesthetic and are achievable with oscillator synthesis:
@@ -433,6 +566,98 @@ Option 1 is cleanest - adds drums/bass/melody/pad/arp/fx gain nodes, mute contro
433
566
-**Loop Export** - Just the main loop, perfect for tiling
434
567
-**Ringtone Length** - 30-second export option
435
568
569
+
### CLI / API Design
570
+
571
+
For using the generator outside the browser (batch generation, game asset pipelines, scripting):
572
+
573
+
**Architecture goal:** Keep generation logic cleanly separated from browser-specific code (Web Audio API, DOM). Core generation should be pure functions that output note/timing data, with rendering as a separate layer.
**Why this matters:** Games using non-JS tech (Godot, Unity, Love2D) can't embed the generator at runtime. But a CLI/API lets you generate assets during development and drop the files into any project.
596
+
597
+
**HTTP endpoint:**
598
+
```
599
+
GET /generate?emotion=dread&duration=30&loop=true&format=wav
600
+
→ Returns audio file
601
+
```
602
+
603
+
Could run as a local dev server or hosted service. Useful for non-JS projects that want on-demand generation during development.
604
+
605
+
**Game editor plugins:**
606
+
607
+
Integrate directly into game engines as editor extensions:
608
+
-**Godot plugin** - Generate and import audio from editor panel
609
+
-**Unity package** - Custom window for music generation
610
+
-**Love2D helper** - Lua script that calls local endpoint
611
+
612
+
Side benefit: Learning each editor's plugin system while building something useful.
613
+
614
+
**WASM build:**
615
+
616
+
Compile generator to WebAssembly for embedding in non-JS environments:
617
+
- Rust, Go, C++, etc. can load WASM modules
618
+
- Runtime generation in Godot, Unity, Love2D becomes possible
619
+
- Same generation logic, different host language
620
+
621
+
**Not a priority** - web tool with good export workflow covers most use cases. But keeping the code modular makes this possible later.
0 commit comments