Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Rickroll Audio (2026-08)

A more literal rickroll audio cue — legal research + compositional brief (2026-08-08)

Status: research + plan only. No audio written, no code touched. Companion to NEXT.md’s “The rickroll gag” section and assets/gen/music/season3_exploratory/README.md (the bytebeat_*.wav sketches, currently the safe fallback wired into the actual build happening in parallel to this doc). This doc asks a narrower question: could the payoff sound more like “Never Gonna Give You Up” — evoke it more directly than a deliberately alien bytebeat — while staying legally sound? Short answer up front: yes, via a production-style pastiche with an original melody, and it’s a real net upgrade over the bytebeat for basically zero added legal exposure — see the recommendation at the end.


1.1 The core distinction: melody/lyrics vs. everything else

US copyright law protects a musical work’s expression — melody, lyrics, and (per some courts) a sufficiently original selection and arrangement of otherwise-common elements. It does not protect tempo, key, genre, instrumentation choices, or common chord progressions on their own:

“Copyright generally does not extend to abstract musical concepts such as musical styles, genres, grooves, common rhythms or chord progressions… common musical elements — such as chord progressions, tempos, hook phrases, and syncopation — are not individually protectable under copyright, either because they are not original or because they are ‘indispensable and naturally associated with the treatment of a given [musical] idea.’” — Never Going Out of Style: How AI-Generated Music’s Reliance on Style-Based Prompts Calls for a Reminder that No One Can Copyright a Musical Genre, ABA Entertainment & Sports Lawyer (2025)

This is the scènes à faire doctrine (elements standard/necessary to a genre aren’t copyrightable) combined with the idea/expression dichotomy (you can’t copyright an idea, only a particular expression of it) — see the case summaries collected in Un-Blurring Substantial Similarity, NYU JIPEL and the general treatment at BitLaw: Works Unprotected by Copyright Law. The one caveat worth flagging: courts (e.g. the Gray v. Perry “Dark Horse” litigation, see the Lexology write-up) have sometimes let plaintiffs argue that a particular combination of otherwise-generic elements is itself protectable if it’s sufficiently distinctive — so “just tempo and instrumentation, nothing else in common” is the safe target, not “everything except the exact notes.”

1.2 Two separate copyrights, and what “sound-alike” means in US law

A commercial recording carries two copyrights: the composition (melody, lyrics, chords as written) and the sound recording (that specific performance/production). US law explicitly carves out sound-alikes at the sound-recording layer:

“The concept of ‘sound alike’ recording is explicitly allowed in Section 114(b) of the U.S. Copyright statute, which states that the exclusive rights in a sound recording do not extend to making another sound recording that consists entirely of independent sounds, even if those sounds imitate or simulate the copyrighted recording.” — Sound-alikes — all you need to know, ClickNClear (see also the Wikipedia summary and 17 U.S.C. §114(b) itself)

But that §114(b) carve-out is about the recording, not the composition. A sound-alike that also reproduces the actual melody and lyrics still needs a license for the composition (this is why “soundalike” jingles in ads still pay mechanical/sync fees when they reuse the real tune — see the ClickNClear and Wood Law Offices overviews). This project’s plan sidesteps that entirely by not reproducing the melody or lyrics at all — see §2 below. Composition-copying is the one thing that actually requires a license or an exception; production-style-copying does not.

1.3 Backstop exceptions (useful, but secondary to just not copying the melody)

Even though the plan in §2/§3 is designed to not need an exception, it’s worth knowing the backstops exist, because Torsten works from Germany and the artist/song is UK in origin:

  • US fair use / parodyCampbell v. Acuff-Rose Music (1994) held a parody’s commercial nature doesn’t defeat fair use by itself; 2 Live Crew’s “Pretty Woman” parody, which did copy the original’s music and opening line, was protected because it was transformative commentary on the original. (Oyez case summary, Justia opinion text). Relevant here mainly as evidence that even a much more aggressive reference than what’s proposed below has real legal cover in the US — this project’s plan needs less protection than Campbell’s facts, not more.
  • German UrhG §51a (pastiche) — added 2021 implementing the EU DSM Directive, explicitly covers caricature, parody, and pastiche, and the legislative materials name memes, GIFs, mashups, and internet-culture remixing as intended use cases — a closer fit for “a game referencing a famous internet meme” than classic parody doctrine is. (Kluwer Copyright Blog: The dawn of pastiche, statute text via copyrightexceptions.eu). Relevant because Torsten is based in Germany.
  • UK CDPA s.30A (parody/pastiche fair dealing) — in force since October 2014, “fair dealing with a work for the purposes of caricature, parody or pastiche does not infringe copyright.” (legislation.gov.uk text, Fieldfisher overview). Relevant because Astley and the song are UK in origin, even though UK law isn’t the most likely forum for a dispute over a hobby project.

The point of listing these: they’re a real, checkable safety net if anyone ever argued the pastiche brief below “evokes too much.” They are not the primary compliance strategy — the primary strategy is simpler and stronger: don’t copy the one thing that’s protected (melody + lyrics), and the exception question mostly never has to come up.

1.4 A separate risk that’s easy to miss: voice, not melody

If the payoff ever adds a sung vocal, there’s a distinct legal track that has nothing to do with copyright: right of publicity / voice misappropriation, for imitating a real person’s distinctive voice closely enough that listeners think it’s them.

Ford Motor Co. hired a former Bette Midler backup singer and told her to “sound as much as possible like the Bette Midler record”; the Ninth Circuit held this was actionable — a person’s distinctive voice is protectable property under California’s right of publicity, separate from any copyright question. — Midler v. Ford Motor Co., 849 F.2d 460 (9th Cir. 1988)

Frito-Lay hired a Tom Waits soundalike for a Doritos radio ad after Waits had publicly refused to do commercials; the jury awarded $2.375M for voice misappropriation and false endorsement. — Waits v. Frito-Lay, Inc., 978 F.2d 1093 (9th Cir. 1992)

Both cases were commercial advertising implying the celebrity’s endorsement of a product — a meaningfully different context from a non-commercial joke inside an indie game that isn’t claiming Astley endorses anything. But the underlying principle (imitating someone’s actual vocal timbre/delivery is a separate legal exposure from imitating a song’s production style) is worth holding as a hard line regardless of context. Practical takeaway for §3: no attempt to mimic Rick Astley’s specific voice/vocal delivery. If a vocal is used at all, keep it non-mimicking (different register, processed/robotic, wordless, or omitted entirely) — this is a “why bother” risk, not a “would definitely lose” risk, but there’s no upside to taking it on.


2. The line this project should hold

Evoke (all in the “not independently protectable” bucket per §1.1):

  • The era and genre: late-80s Hi-NRG/dance-pop, Stock Aitken Waterman-style production.
  • The tempo: ~113 BPM (the real song’s tempo — SongBPM, GetSongBPM; tempo numbers are metadata, not protected expression, so citing/matching them carries zero risk).
  • The mood/key-color: a minor key in the same neighborhood as the original (commonly cited as B♭ minor — Tunebat — algorithmically-detected metadata, same reasoning as tempo above).
  • The instrumentation/production texture: bright gated synth-pulse bassline (the real track’s “piano-bass” DX7 line), a punchy drum-machine 4-on-the-floor-adjacent groove, a Juno-106-style pad/chord stab, bright/sharpened reverb-heavy mix character. All documented, unprotected production choices — see Sound on Sound’s “Classic Tracks” writeup for the actual gear list (Yamaha DX7 for the bassline, Linn 9000 drums, Roland Juno-106, Lexicon/AMS reverb and delay on vocals).

Must stay original — not evoked, not approximated:

  • The actual melody (verse and especially the hook line — the “never gonna give you up…” tune is the single most recognizable, and most protected, piece of the song).
  • The actual lyrics, in whole or in any distinctive fragment.
  • The actual chord progression as used in the song, note-for-note/degree-for-degree. Same key-neighborhood and mood is fine (see above); the exact progression is not — replicate the feeling of a minor-key SAW ballad-turned-dance-track, not its harmonic fingerprint.
  • Rick Astley’s own vocal timbre/delivery (see §1.4) — if a vocal exists at all, it must not be a soundalike performance.

This is the same “evoke the vibe, not the fingerprint” principle the project’s own assets/gen/music/season3_exploratory/README.md and AUDIO.txt already apply to every other track (synthwave groove for neon_backalley.wav, tango for tango.wav, etc.) — none of those claim to be a specific existing song, they evoke a genre. This is the same move, just aimed at one very specific, very recognizable target because that’s the joke.


3. Compositional brief for tools/make_music.py

Everything below is achievable with the tooling already in the file (read in full for this doc — render_voice(), pulse()/triangle(), kick()/hihat()/clap(), the bar_len()/beats_to_samples() helpers, and the existing per-track make_*() pattern). Nothing here needs a new synthesis primitive; it needs a new make_rickroll()-style function following the existing recipe, plus one new melody/chord progression that does not exist yet — the actual composing work, not just parameter tuning.

Tempo & meter: 113 BPM, 4/4 — matches the real song’s tempo exactly (safe, per §2).

Key: B♭ minor (or any adjacent minor key — A minor and B minor are both fine substitutes if B♭ is awkward for note_freq()’s octave math) — matches the real song’s mood/color, not its literal pitch center.

Structure: 8–16 bars, matching the project’s existing loop-length convention (make_lidl_lunch/make_soccer are 8 bars at similar tempos). A short intro (2 bars, bass + pad only, no lead) into a “chorus-shaped” main loop (lead melody enters) reads as more song-like than a flat one-section loop — worth the extra bars for this one gag since recognizability of structure (verse-into-hook shape) is part of what sells the reference, and structure/form is exactly the kind of shape not covered by melody copyright ownership.

Bassline (the DX7 “piano-bass” reference): pulse() with a bright, fairly narrow duty cycle (duty≈0.25–0.35 reads brighter/more synthetic than the 0.5 square used for e.g. make_soccer’s bass) on a syncopated eighth-note pattern with rests — not a straight walking bass. render_voice() already supports this via the same (notes, beats) event list format every other track uses; short release (0.04–0.06) keeps it snappy/gated rather than smooth, matching the “gated synth bass” character of the reference era.

Drums: reuse kick()/hihat()/clap() as-is (they’re already generic enough). Pattern: kick on 1 and 3 (or a 4-on-the-floor-adjacent pattern per the “evoke the era” brief — Hi-NRG/dance-pop of this period leans 4-on-the-floor more than a straight rock backbeat), clap or hat on the offbeats. make_lidl_lunch’s existing kick/hihat step-loop (step = beats_to_samples(0.5, bpm), kick every 4 steps, hat on odd steps) is close to the right shape already and can be adapted directly.

Chords/pad: a Juno-106-style sustained pad — pulse() with a lower duty cycle (≈0.2–0.25, same approach make_minigolf’s chord voice already uses) or triangle() for a softer analog-pad feel, on whole/half-note chord changes under the bass and melody. This progression must be composed fresh — pick a minor i–VI–III–VII or i–iv–v-type progression (common, unprotectable minor-key pop shapes per §1.1) that is demonstrably not the real song’s chord sequence. This is the one piece of actual composing work in this brief, not a parameter to tune — whoever implements this needs to sit down and write 4–8 real chords, not port the real song’s changes with a different root note.

Melody/lead (the “hook” slot): also composed fresh — an original tune, same register/contour ambition as a big synth-pop hook (mostly stepwise motion with a couple of larger leaps, landing on strong beats), same rhythmic energy as the era (mostly eighth notes with the occasional syncopated pickup), but a different actual sequence of pitches and rhythm from “never gonna give you up, never gonna let you down.” render_voice() with pulse() at a bright duty cycle (~0.4, matching make_lidl_lunch’s melody voice) is the right timbre; the melody itself needs composing, not generating from a template.

Vocal: recommend no sung vocal at all — an instrumental synth-pop pastiche reads as “unmistakably that meme” to a player primed by the visual gag (per the research questions’ own framing) without needing a voice in the mix at all, which sidesteps §1.4 entirely. If a vocal element is wanted for extra punch, keep it non-mimicking: a wordless “ooh/aah” pad-style vocal-synth patch (not a performance of Astley’s actual delivery/register/rasp), or lean on the existing bytebeat-adjacent 8-bit idiom for a “sung” line instead of a real voice.

What doesn’t need new tooling: waveform types, envelope shaping, percussion one-shots, the mix/finalize pipeline, the WAV export — all already exist and already produce exactly this instrumentation family (make_lidl_lunch and make_soccer are both already “bright pulse bass + drum-machine percussion + pulse-wave lead” in a similar BPM range). This is squarely inside what the tool already does; it just hasn’t been pointed at this specific era/mood/melody combination yet.


4. Risk assessment and recommendation

Residual risk, even done exactly as specified above: low, but not literally zero. Two real (if narrow) exposure paths remain even with a fully original melody/chords:

  1. “Selection and arrangement” arguments (§1.1, Gray v. Perry-style) — a claim that copying enough generic elements in combination (tempo + key-color + instrumentation
    • structure + genre, all at once, all deliberately aimed at one specific song) adds up to something a court could call substantially similar even without melody overlap. This is a real doctrine, but it’s also the losing side more often than not in reported cases, and courts have been especially skeptical of it for “genre pastiche” facts specifically (see the ABA piece in §1.1, written about exactly this AI-generated-pastiche fact pattern).
  2. Someone unfamiliar with music-copyright nuance (a platform’s automated content-ID system, a casual viewer, a future collaborator) assuming “sounds like Rick Astley” == “is infringing” — a perception/moderation risk, not really a legal one, but worth naming since it could cause friction (e.g. an automated takedown on a video-sharing platform if this ever gets streamed/clipped) even where the legal analysis is sound.

Comparison to the current bytebeat fallback: the bytebeat approach (already built, already shipped per NEXT.md) carries essentially zero residual risk of either kind — it doesn’t share tempo, key, instrumentation, or structure with the real song, so there’s no “selection and arrangement” argument available even in principle, and nothing an automated system would ever flag. That’s not an accident; it was the explicit design goal (assets/gen/music/season3_exploratory/README.md: “deliberately weird/broken-sounding is the joke”).

Recommendation: build the pastiche described in §3 as an addition alongside the bytebeat, not a replacement — reachable as an “upgraded” or alternate rickroll sting rather than a like-for-like swap. This is a genuine two-tier joke (the wrong-but-familiar bytebeat vs. the parody-that-almost-lands-if-you-squint synth-pop track) and it lets the project keep the zero-risk fallback as the default while adding a strictly-more-legally- exposed-but-still-well-inside-the-safe-zone option for the moment the trove actually pays off. Given the residual risk above is genuinely low and well-precedented (§1.1–1.3), and the upside (a payoff that actually reads as “the rickroll” rather than “spooky bit-crushed noise”) is real, this is worth the small amount of extra exposure — do build it, but compose the melody/chords fresh per §3 rather than taking any shortcut that ports the real song’s actual notes with the serial numbers filed off, and skip the sung vocal per §1.4. If Torsten wants a belt-and-suspenders version, the German UrhG §51a pastiche exception (§1.3) is a strong, on-point, and rarely-litigated-against fallback specifically because its legislative history calls out meme/internet-culture pastiche by name — but the composition brief in §3 is designed so that fallback should never actually need invoking.


5. Post-build verification against the real chorus (2026-08-08)

make_rickroll() (tools/make_music.py) was built from this doc’s §3 brief before this section existed — the melody/chords were composed fresh from the brief’s constraints, without seeing the real song’s actual transcription. Once Torsten sourced Hooktheory’s chorus data directly (theorytab page itself 403’d to automated fetching; pasted in manually), it became possible to check the finished composition against the real thing note-for-note rather than just trusting the brief avoided it by construction.

Real chorus, as transcribed: Db major, 114 BPM, melody range Ab3–Ab4, most-used chord ii — matching the tempo/key claims already gathered from other sources in §1, and resolving what looked like a source disagreement: a chord-recognition source’s “Ab major, chords Ab-Fm7-Bbm7-Ebm7” turns out to be the same four absolute chords as Hooktheory’s Db-major reading (ii=Ebm9, V=Ab(add9), iii=Fm7, vi=Bbm7) — just labeled from a different tonal center, not a real disagreement. The chorus hook’s actual melody is a syncopated, irregular rhythm (dotted-eighths, sixteenth-note pickup runs, mid-phrase rests) over a stepwise-descent-plus-ascending-pickup contour: F4-F4-Eb4 / Ab3-Bb3-C4-Bb3 / Eb4-Eb4-Db4 / C4-Bb3 / Ab3-Bb3-Db4-Bb3, repeating with variation across 8 bars.

Comparison to make_rickroll()’s hook (Bb minor: Bb4-Db5-F5-Eb5-Db5 | Gb4-Bb4-Db5-Bb4-Ab4 | F4-Ab4-Db5-Ab4-F4 | Eb4-C5-Eb5-C5-Bb4, an identical “4 eighths + quarter + rest” shape in every bar):

  • Rhythm: no overlap — the real hook’s irregular, syncopated shape shares nothing with the composed hook’s flat, uniform bar-shape.
  • Melody/contour: no overlap — different scale-degree sequences, different interval shapes; the real hook is a stepwise descent punctuated by ascending pickups, the composed one leans on repeated-note-then-leap figures.
  • Chords: two of the composed progression’s four triads (Bbm, Ab) also appear among the real song’s four chords, but as plain triads (not the real 7th/9th voicings), in a different order with no shared consecutive motion (composed: i→VI→III→VII = Bbm→Gb→Db→Ab; real: ii→V→iii→vi = Ebm→Ab→Fm→Bbm). Per §1.1, individual chords aren’t protectable — only the sequence as used is, and that sequence differs here.

Conclusion: verified clean. The one thing this doc’s brief had to take on faith (that composing from constraints, without copying, wouldn’t accidentally converge on the real melody) held up against an actual side-by-side check, not just a design argument.


6. Decision reversal: literal reproduction instead of original composition (2026-08-08)

Torsten’s explicit decision, after being shown the risk tradeoff directly (asked whether to (a) stay original and just tune closer to the real tempo/key/voicing, or (b) rewrite make_rickroll() to literally use the transcribed melody+chords below — the exact thing §2/§5 above concluded should be avoided): (b), use the real notes. Stated rationale: relying on meme-culture/parody norms for the legal footing here, not on avoidance-by-composition. This supersedes §2’s “must stay original” line and §5’s “verified clean” conclusion for this specific track — both remain accurate accounts of what was true before this decision, not retracted, just superseded going forward. The zero-risk bytebeat rickroll track (§4’s fallback) is unaffected and still plays as one of the two random picks at trigger time.

Source data (Hooktheory theorytab for “Never Gonna Give You Up”, chorus section, pasted in manually since the page itself 403’s automated fetching — notes/chords/keys only; the clipboard payload’s redundant tick-level duplicate of the same data is omitted here for length):

{"notes":[{"beat":1,"duration":0.75,"sd":"3","octave":0},{"beat":1.75,"duration":0.75,"sd":"3","octave":0},{"beat":2.5,"duration":1,"sd":"2","octave":0},{"beat":4,"duration":0.25,"sd":"5","octave":-1},{"beat":4.25,"duration":0.25,"sd":"6","octave":-1},{"beat":4.5,"duration":0.25,"sd":"7","octave":-1},{"beat":4.75,"duration":0.25,"sd":"6","octave":-1},{"beat":5,"duration":0.75,"sd":"2","octave":0},{"beat":5.75,"duration":0.75,"sd":"2","octave":0},{"beat":6.5,"duration":0.5,"sd":"1","octave":0},{"beat":7,"duration":0.25,"sd":"7","octave":-1},{"beat":7.25,"duration":0.75,"sd":"6","octave":-1},{"beat":8,"duration":0.25,"sd":"5","octave":-1},{"beat":8.25,"duration":0.25,"sd":"6","octave":-1},{"beat":8.5,"duration":0.25,"sd":"1","octave":0},{"beat":8.75,"duration":0.25,"sd":"6","octave":-1},{"beat":9,"duration":0.75,"sd":"1","octave":0},{"beat":9.75,"duration":0.75,"sd":"2","octave":0},{"beat":10.5,"duration":0.25,"sd":"7","octave":-1},{"beat":10.75,"duration":0.75,"sd":"6","octave":-1},{"beat":11.5,"duration":0.5,"sd":"5","octave":-1},{"beat":12.5,"duration":0.5,"sd":"5","octave":-1},{"beat":13,"duration":1,"sd":"2","octave":0},{"beat":14,"duration":1,"sd":"1","octave":0},{"beat":16,"duration":0.25,"sd":"5","octave":-1},{"beat":16.25,"duration":0.25,"sd":"6","octave":-1},{"beat":16.5,"duration":0.25,"sd":"1","octave":0},{"beat":16.75,"duration":0.25,"sd":"6","octave":-1},{"beat":17,"duration":0.75,"sd":"3","octave":0},{"beat":17.75,"duration":0.75,"sd":"3","octave":0},{"beat":18.5,"duration":1.25,"sd":"2","octave":0},{"beat":20,"duration":0.25,"sd":"5","octave":-1},{"beat":20.25,"duration":0.25,"sd":"6","octave":-1},{"beat":20.5,"duration":0.25,"sd":"7","octave":-1},{"beat":20.75,"duration":0.25,"sd":"6","octave":-1},{"beat":21,"duration":0.75,"sd":"5","octave":0},{"beat":21.75,"duration":0.5,"sd":"7","octave":-1},{"beat":22.25,"duration":0.5,"sd":"1","octave":0},{"beat":22.75,"duration":0.25,"sd":"7","octave":-1},{"beat":23,"duration":1,"sd":"6","octave":-1},{"beat":24,"duration":0.25,"sd":"5","octave":-1},{"beat":24.25,"duration":0.25,"sd":"6","octave":-1},{"beat":24.5,"duration":0.25,"sd":"7","octave":-1},{"beat":24.75,"duration":0.25,"sd":"6","octave":-1},{"beat":25,"duration":0.75,"sd":"1","octave":0},{"beat":25.75,"duration":0.75,"sd":"2","octave":0},{"beat":26.5,"duration":0.75,"sd":"7","octave":-1},{"beat":27.25,"duration":0.25,"sd":"6","octave":-1},{"beat":27.5,"duration":0.5,"sd":"5","octave":-1},{"beat":28.5,"duration":0.5,"sd":"5","octave":-1},{"beat":29,"duration":0.5,"sd":"2","octave":0},{"beat":29.5,"duration":0.5,"sd":"1","octave":0},{"beat":30,"duration":1,"sd":"1","octave":0}],
 "chords":[{"beat":1,"duration":1.5,"root":2,"type":9},{"beat":2.5,"duration":2.5,"root":5,"type":5,"adds":[9]},{"beat":5,"duration":1.5,"root":3,"type":7},{"beat":6.5,"duration":2.5,"root":6,"type":7},{"beat":9,"duration":1.5,"root":2,"type":9},{"beat":10.5,"duration":2.5,"root":5,"type":5,"adds":[9]},{"beat":13,"duration":1.5,"root":3,"type":7},{"beat":14.5,"duration":2.5,"root":6,"type":7},{"beat":17,"duration":1.5,"root":2,"type":9},{"beat":18.5,"duration":2.5,"root":5,"type":5,"adds":[9]},{"beat":21,"duration":1.5,"root":3,"type":7},{"beat":22.5,"duration":2.5,"root":6,"type":7},{"beat":25,"duration":1.5,"root":2,"type":9},{"beat":26.5,"duration":2.5,"root":5,"type":5,"adds":[9]},{"beat":29,"duration":2,"root":3,"type":7},{"beat":31,"duration":1,"root":4,"type":5,"inversion":1,"adds":[9]},{"beat":32,"duration":0.75,"root":5,"type":11},{"beat":32.75,"duration":0.25,"root":4,"type":5,"inversion":2,"adds":[9]}],
 "keys":[{"beat":1,"scale":"major","tonic":"Db"}],
 "songStats":{"key":"Db Major","tempo":114,"meter":"4/4","genre":["Blues","Pop","House"],"melodyRange":"Ab3-Ab4","mood":["Smooth","Complex","Unexpected","Bright"],"mostUsedChord":"ii"}}

Decoded to actual note names/octaves (Db major; scale degree → semitones-from-tonic via the standard major-scale pattern 0,2,4,5,7,9,11; octave tag −1/0 is a full octave, converted to this project’s scientific-pitch-notation octave numbers the same way note_freq() already reads them):

degree,octave → note: 1,0→Db4 · 2,0→Eb4 · 3,0→F4 · 5,0→Ab4 · 5,-1→Ab3 · 6,-1→Bb3 · 7,-1→C4 — these are the only seven combinations that actually occur in the data above.

Melody, gaps filled in as explicit rests (8 bars, 4/4, 114 BPM):

Bar1: F4·.75 F4·.75 Eb4·1 R·.5 | Ab3·.25 Bb3·.25 C4·.25 Bb3·.25
Bar2: Eb4·.75 Eb4·.75 Db4·.5 C4·.25 Bb3·.75
Bar3: Ab3·.25 Bb3·.25 Db4·.25 Bb3·.25 Db4·.75 Eb4·.75 C4·.25 Bb3·.75
Bar4: Ab3·.5 R·.5 Ab3·.5 Eb4·1 Db4·1 R·1
Bar5: Ab3·.25 Bb3·.25 Db4·.25 Bb3·.25 F4·.75 F4·.75 Eb4·1.25 R·.25
Bar6: Ab3·.25 Bb3·.25 C4·.25 Bb3·.25 Ab4·.75 C4·.5 Db4·.5 C4·.25 Bb3·1
Bar7: Ab3·.25 Bb3·.25 C4·.25 Bb3·.25 Db4·.75 Eb4·.75 C4·.75 Bb3·.25 Ab3·.5
Bar8: R·.5 Ab3·.5 Eb4·.5 Db4·.5 Db4·1 R·2

Chords — the ii9–V(add9)–iii7–vi7 loop, 3 full statements plus a 4th ii9–V(add9) before the turnaround bar:

[ii9=Ebm(add9)·1.5, V(add9)=Ab(add9)·2.5, iii7=Fm7·1.5, vi7=Bbm7·2.5] × 3
+ [ii9·1.5, V(add9)·2.5]                                  (bar 7, 4th ii-V)
+ [iii7=Fm7·2, IV(add9)inv1=Gb(add9)·1, V11≈Ab(add9/11)·0.75, IV(add9)inv2·0.25]  (bar 8, turnaround)

make_rickroll() in tools/make_music.py is built directly from this decoded table — voicings are simplified triad/7th/9th chords rather than exact inversions (the engine’s render_voice() doesn’t model bass-note inversions), and bass notes are the chord roots sustained per-segment rather than a note-for-note reproduction of the real bassline (not transcribed here). Rendered to assets/gen/music/rickroll_hooktheory.wav, wired as the 'rickroll_hooktheory' MusicName.


Sources