docs: add music credits and descope notes

Only the scroller text credited ride.mod; add CREDITS.md and a
semantic-fallback line so no-JS visitors also see the "11th-hour"
by TDK CC BY 4.0 attribution (The Mod Archive, unmodified).

Also record the two spec items descoped during implementation:
chunky-pixel retro look instead of ordered dithering, and a
single MOD track instead of per-stop ambience shifts.
This commit is contained in:
L'électron rare
2026-07-09 12:40:26 +02:00
parent 41a12724f6
commit d0fe0ec9dd
5 changed files with 52 additions and 2 deletions
+9
View File
@@ -0,0 +1,9 @@
# Credits
## Music
**"11th-hour"** by TDK
- Source: [The Mod Archive, module id 67104](https://modarchive.org/index.php?request=view_by_moduleid&query=67104)
- License: [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)
- Used unmodified.
@@ -141,3 +141,10 @@ board and alight at stops like passengers.
- Final bio text + pixel-art avatar. - Final bio text + pixel-art avatar.
- Greetings list content. - Greetings list content.
- MOD module choice (original Électron Fou chiptune vs licensed module). - MOD module choice (original Électron Fou chiptune vs licensed module).
## Descoped (2026-07-09)
- Ordered-dithering post-process was replaced by low-dpr chunky pixels —
an equivalent retro effect with zero added dependencies.
- Per-stop audio ambience shift at the Électron Fou stop was deferred;
a single MOD track ships for the whole ride instead.
+7
View File
@@ -4,3 +4,10 @@ export const MUSIC = {
listenLabel: 'Écouter sur Bandcamp', listenLabel: 'Écouter sur Bandcamp',
listenUrl: 'https://lelectron-fou.bandcamp.com', listenUrl: 'https://lelectron-fou.bandcamp.com',
} }
// Attribution for the background MOD track (public/music/ride.mod),
// "11th-hour" by TDK, CC BY 4.0, from The Mod Archive. Kept HTML-free
// here so it stays a pure string; src/fallback/inject.ts wraps it with
// the license/source links for the semantic fallback markup.
export const MUSIC_CREDIT =
'Musique : « 11th-hour » par TDK — CC BY 4.0, The Mod Archive.'
+8
View File
@@ -20,4 +20,12 @@ describe('renderFallbackHtml', () => {
const out = renderFallbackHtml(template) const out = renderFallbackHtml(template)
expect(out).not.toMatch(/<!--(nav|bio|music|greetings|name|tagline)-->/) expect(out).not.toMatch(/<!--(nav|bio|music|greetings|name|tagline)-->/)
}) })
it('credits the ride.mod track with a CC BY 4.0 link', () => {
const out = renderFallbackHtml(template)
expect(out).toContain(
'<p class="muted">Musique : « 11th-hour » par TDK — ' +
'<a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>, ' +
'<a href="https://modarchive.org/index.php?request=view_by_moduleid&amp;query=67104">The Mod Archive</a>.</p>',
)
})
}) })
+21 -2
View File
@@ -1,7 +1,25 @@
import { BIO_LINES, NAME, TAGLINE } from '../content/bio' import { BIO_LINES, NAME, TAGLINE } from '../content/bio'
import { GREETINGS } from '../content/greetings' import { GREETINGS } from '../content/greetings'
import { LINKS } from '../content/links' import { LINKS } from '../content/links'
import { MUSIC } from '../content/music' import { MUSIC, MUSIC_CREDIT } from '../content/music'
// MUSIC_CREDIT is a plain, HTML-free sentence (see content/music.ts); wrap
// its two attribution terms with the license and source links here so the
// content module stays free of markup.
const MUSIC_CREDIT_LICENSE_URL = 'https://creativecommons.org/licenses/by/4.0/'
const MUSIC_CREDIT_SOURCE_URL =
'https://modarchive.org/index.php?request=view_by_moduleid&amp;query=67104'
function renderMusicCredit(): string {
const html = MUSIC_CREDIT.replace(
'CC BY 4.0',
`<a href="${MUSIC_CREDIT_LICENSE_URL}">CC BY 4.0</a>`,
).replace(
'The Mod Archive',
`<a href="${MUSIC_CREDIT_SOURCE_URL}">The Mod Archive</a>`,
)
return `<p class="muted">${html}</p>`
}
export function renderFallbackHtml(html: string): string { export function renderFallbackHtml(html: string): string {
const nav = LINKS.map( const nav = LINKS.map(
@@ -11,7 +29,8 @@ export function renderFallbackHtml(html: string): string {
const bio = BIO_LINES.map((line) => `<p>${line}</p>`).join('\n ') const bio = BIO_LINES.map((line) => `<p>${line}</p>`).join('\n ')
const music = const music =
`<h2>${MUSIC.title}</h2><p>${MUSIC.blurb}</p>` + `<h2>${MUSIC.title}</h2><p>${MUSIC.blurb}</p>` +
`<p><a href="${MUSIC.listenUrl}">${MUSIC.listenLabel}</a></p>` `<p><a href="${MUSIC.listenUrl}">${MUSIC.listenLabel}</a></p>` +
renderMusicCredit()
const greetings = `<p>Greetings to ${GREETINGS.join(', ')}.</p>` const greetings = `<p>Greetings to ${GREETINGS.join(', ')}.</p>`
return html return html
.replace('<!--name-->', NAME) .replace('<!--name-->', NAME)