From 5e6d7d4cfb06d9982f8b97a063cf21861edc8fc5 Mon Sep 17 00:00:00 2001 From: Andrea Manzi Date: Fri, 23 Oct 2026 15:30:42 +0200 Subject: [PATCH] =?UTF-8?q?Musichetta=20a=208=20bit=20per=20il=20cartello?= =?UTF-8?q?=20=C2=ABManzolo=20(Poca)=20Art=20Presents=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tools/jingle.py la sintetizza da zero, a tempo con le scritte: arpeggio su MANZOLO, accordo su Art, trombone triste sul (Poca), accordo finale su PRESENTS. Suona una volta sola; la musica del titolo entra quando compare il titolo; saltando il cartello si salta anche lei. Senza un gesto del giocatore il browser può tenerla muta. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01UdeKd62opy9PKgpQXtVctF --- assets/audio/cartello.mp3 | Bin 0 -> 56155 bytes src/engine/music.js | 4 +- src/main.js | 10 ++++- src/story/story.js | 3 +- tests/browser.mjs | 2 + tests/music.test.mjs | 1 + tools/jingle.py | 83 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 assets/audio/cartello.mp3 create mode 100644 tools/jingle.py diff --git a/assets/audio/cartello.mp3 b/assets/audio/cartello.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..073eff137ce49d65018d6edc168c8c06834f72cf GIT binary patch literal 56155 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 literal 0 HcmV?d00001 diff --git a/src/engine/music.js b/src/engine/music.js index 9d02d58..875e414 100644 --- a/src/engine/music.js +++ b/src/engine/music.js @@ -2,9 +2,11 @@ // Quale brano suona lo decidono i dati (story.music e scene.music). Si prova a partire subito; se il browser non lo // permette prima di un gesto del giocatore, il brano riparte al primo clic o tasto (unlock). -// Il brano del momento: titolo, fine, oppure quello della scena (o quello comune del gioco). +// Il brano del momento: titolo, fine, oppure quello della scena (o quello comune del gioco). Sotto il cartello +// d'apertura nessuno: lì suona la sua musichetta, una volta sola (main.js). export function trackFor(story, { screen, scene }) { const m = story.music ?? {}; + if (screen === 'splash') return null; if (screen === 'title' || screen === 'intro') return m.title ?? null; if (screen === 'ending') return m.ending ?? m.game ?? null; return story.scenes[scene]?.music ?? m.game ?? null; diff --git a/src/main.js b/src/main.js index ed27520..3da9a7e 100644 --- a/src/main.js +++ b/src/main.js @@ -205,7 +205,7 @@ function frame(now) { // sotto zero, il browser lancerebbe un errore e il ciclo dei fotogrammi si fermerebbe (gioco congelato). const dt = Math.max(0, Math.min(0.1, (now - last) / 1000)); last = now; - const screen = !$('title').hidden || !$('splash').hidden ? 'title' : !$('intro').hidden ? 'intro' : !$('ending').hidden ? 'ending' : 'game'; + const screen = !$('title').hidden ? 'title' : !$('splash').hidden ? 'splash' : !$('intro').hidden ? 'intro' : !$('ending').hidden ? 'ending' : 'game'; music.duck = voices.playing ? 0.45 : 1; music.update(trackFor(story, { screen, scene: game?.state.scene }), dt); if (game) { @@ -232,8 +232,16 @@ function showSplash() { if (done) return; done = true; $('splash').hidden = true; + jingle?.pause(); // saltato il cartello, si salta anche la musichetta reveal(); }; + // La musichetta: senza un gesto del giocatore il browser può non lasciarla partire, e allora il cartello resta muto. + const jingle = story.music?.splash ? new Audio(story.music.splash) : null; + if (jingle) { + jingle.volume = music.muted ? 0 : music.volume; + jingle.play().catch(() => {}); + window.jingle = jingle; // per i test nel browser + } setTimeout(reveal, SPLASH_FADE); setTimeout(end, SPLASH_END); $('splash').addEventListener('click', end); diff --git a/src/story/story.js b/src/story/story.js index b5a8360..3a6bde9 100644 --- a/src/story/story.js +++ b/src/story/story.js @@ -13,7 +13,8 @@ export const story = { 'E stamattina, in piazza, è successo qualcosa...', ], // Colonna sonora di Andrea (fatta con Suno): titolo, paese, ricordi (fine e Trebbio). - music: { title: 'assets/audio/titolo.mp3', game: 'assets/audio/paese.mp3', ending: 'assets/audio/ricordi.mp3' }, + // splash: la musichetta del cartello d'apertura (tools/jingle.py), suonata una volta sola. + music: { splash: 'assets/audio/cartello.mp3', title: 'assets/audio/titolo.mp3', game: 'assets/audio/paese.mp3', ending: 'assets/audio/ricordi.mp3' }, characters: { andrea: { name: 'Andrea', color: '#ffffff', sprite: 'assets/characters/andrea.json' }, vecchietta: { name: 'Vecchietta', color: '#ffd27a', sprite: 'assets/characters/vecchietta.json' }, diff --git a/tests/browser.mjs b/tests/browser.mjs index 2d21853..424c95f 100644 --- a/tests/browser.mjs +++ b/tests/browser.mjs @@ -47,6 +47,8 @@ try { // Il cartello d'apertura, poi da solo il titolo. assert.match(await page.textContent('#splash'), /Manzolo\s*\(Poca\)\s*Art\s*Presents/); assert.ok(await page.isHidden('#title'), 'il titolo aspetta la fine del cartello'); + assert.match(await page.evaluate(() => jingle.src), /assets\/audio\/cartello\.mp3$/, 'la musichetta del cartello'); + assert.equal(await page.evaluate(() => music.want), null, 'la musica del titolo aspetta il titolo'); await page.waitForTimeout(2800); await page.screenshot({ path: `${OUT}/00-cartello.png` }); // Il titolo arriva sotto il cartello mentre sfuma: in nessun momento si vede la scena nuda. diff --git a/tests/music.test.mjs b/tests/music.test.mjs index 7dd12f5..938afa6 100644 --- a/tests/music.test.mjs +++ b/tests/music.test.mjs @@ -6,6 +6,7 @@ import { story } from '../src/story/story.js'; test('il brano giusto per titolo, fine e scena', () => { const s = { music: { title: 't.mp3', game: 'g.mp3', ending: 'e.mp3' }, scenes: { a: {}, b: { music: 'b.mp3' } } }; + assert.equal(trackFor(s, { screen: 'splash', scene: 'a' }), null, 'sotto il cartello suona solo la sua musichetta'); assert.equal(trackFor(s, { screen: 'title', scene: 'a' }), 't.mp3'); assert.equal(trackFor(s, { screen: 'intro', scene: 'a' }), 't.mp3'); assert.equal(trackFor(s, { screen: 'ending', scene: 'a' }), 'e.mp3'); diff --git a/tools/jingle.py b/tools/jingle.py new file mode 100644 index 0000000..6a59c87 --- /dev/null +++ b/tools/jingle.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +"""La musichetta del cartello «Manzolo (Poca) Art Presents» (assets/audio/cartello.mp3), sintetizzata da zero: +onde quadre e triangolari da 8 bit, a tempo con le scritte di style.css (#splash). + python3 tools/jingle.py # scrive assets/audio/cartello.mp3 (serve ffmpeg) + 0,2 s MANZOLO arpeggio che sale + 1,0 s Art accordo + 1,9 s (Poca) «uah-uaah» da trombone triste: l'arte è poca + 2,6 s PRESENTS accordo finale che si spegne prima della dissolvenza (4,3 s) +""" +import math +import subprocess +import tempfile +import wave +from array import array +from pathlib import Path + +SR = 44100 +DUR = 4.6 +OUT = Path(__file__).resolve().parent.parent / "assets" / "audio" / "cartello.mp3" +buf = [0.0] * int(SR * DUR) + + +def hz(note: str) -> float: + names = {"C": 0, "D": 2, "E": 4, "F": 5, "G": 7, "A": 9, "B": 11} + semis = names[note[0]] + (1 if "#" in note else -1 if note[1] == "b" else 0) + return 440 * 2 ** ((semis + 12 * (int(note[-1]) + 1) - 69) / 12) + + +def square(phase: float, duty: float = 0.25) -> float: + return 1.0 if phase % 1 < duty else -1.0 + + +def triangle(phase: float) -> float: + return 4 * abs(phase % 1 - 0.5) - 1 + + +def saw(phase: float) -> float: + return 2 * (phase % 1) - 1 + + +def tone(start, length, freq, wave_fn=square, vol=0.18, attack=0.008, release=0.08, slide_to=None, vibrato=0.0): + """Una nota: inviluppo attacco/rilascio, glissando facoltativo verso slide_to, vibrato in semitoni.""" + phase = 0.0 + n0, n = int(start * SR), int(length * SR) + for i in range(n): + t = i / SR + f = freq if slide_to is None else freq * (slide_to / freq) ** (t / length) + if vibrato: + f *= 2 ** (vibrato * math.sin(2 * math.pi * 5.5 * t) / 12) + phase += f / SR + env = min(1.0, t / attack) * min(1.0, (length - t) / release) + if n0 + i < len(buf): + buf[n0 + i] += vol * env * wave_fn(phase) + + +# MANZOLO: arpeggio di do maggiore che sale, col basso. +for k, note in enumerate(["C4", "E4", "G4", "C5", "E5"]): + tone(0.2 + k * 0.13, 0.16, hz(note)) +tone(0.2, 0.75, hz("C3"), triangle, vol=0.3) +# Art: accordo pieno. +for note in ["G4", "C5", "E5"]: + tone(1.0, 0.55, hz(note), vol=0.11, release=0.25) +tone(1.0, 0.6, hz("C3"), triangle, vol=0.3, release=0.25) +# (Poca): il trombone triste, due note che scendono e l'ultima che si lamenta. +tone(1.9, 0.26, hz("Eb4"), saw, vol=0.3, attack=0.03, slide_to=hz("D4")) +tone(2.18, 0.42, hz("D4"), saw, vol=0.3, attack=0.03, slide_to=hz("Db4"), vibrato=0.35, release=0.15) +# PRESENTS: accordo finale arpeggiato veloce, poi lungo, che si spegne. +for k, note in enumerate(["C4", "E4", "G4", "C5"]): + tone(2.65 + k * 0.05, 1.6 - k * 0.05, hz(note), vol=0.1, release=1.1) +tone(2.65, 1.7, hz("C3"), triangle, vol=0.32, release=1.2) +tone(2.65, 0.12, hz("C6"), square, vol=0.08, release=0.06) + +peak = max(abs(x) for x in buf) +pcm = array("h", (int(x / peak * 0.85 * 32767) for x in buf)) +with tempfile.TemporaryDirectory() as tmp: + w = Path(tmp) / "cartello.wav" + with wave.open(str(w), "wb") as f: + f.setnchannels(1) + f.setsampwidth(2) + f.setframerate(SR) + f.writeframes(pcm.tobytes()) + subprocess.run(["ffmpeg", "-loglevel", "error", "-y", "-i", str(w), "-af", "lowpass=f=9000", "-c:a", "libmp3lame", "-b:a", "96k", str(OUT)], check=True) +print(f"-> {OUT.relative_to(OUT.parent.parent.parent)} ({DUR} s)")