Aggiorna e approfondisci tutta la documentazione
Riscritti tutti i file doc/ e README.md per riflettere lo stato attuale del gioco (8 livelli, multi-nemico, corsa, finale tragico, musica dedicata, fog scalabile, flush dinamico, claimed.png death screen, ecc.): - index.md: nuovo indice con riferimenti ai 7 capitoli aggiornati. - architecture.md: tabella moduli con righe, variabili chiave globals, pipeline asset, vincoli hardware (ROM/WRAM/VRAM/OAM). - graphics.md: proiezione iso, fog scalabile (fog_radius), auto-tiling multi-pass, flush dinamico 16-righe con wrap, HUD stamina + livello. - generation.md: DFS con stack WRAM, dimensioni crescenti 7->21, botola a distanza scalabile, spawn multi-nemico. - gameplay.md: DAS, camminata, corsa, salto, stamina scalabile, progressione 8 livelli, schermate (death/going deeper/finale). - ai.md: multi-entity (8 fantasmi), greedy, cooldown scalabile, hitbox, culling. - audio.md: 4 canali APU, 5 tracce (title 112/3canali, gameplay 96, gameover 128, finale 192 loop, going deeper 96), SFX. - AScreamFromTheDark_report.md: riscritto completamente (~200 righe), tutte le sezioni aggiornate, workaround storici, debiti tecnici. - README.md: intro, caratteristiche, soundtrack, architettura, test.
This commit is contained in:
+45
-27
@@ -1,34 +1,52 @@
|
||||
# Sintesi Audio e Musica
|
||||
|
||||
Tutto l'audio del gioco è prodotto internamente manipolando a basso livello i 4 canali audio (APU) registrati direttamente in memoria hardware del Game Boy (da `NR10_REG` a `NR52_REG`).
|
||||
## Hardware APU (4 canali)
|
||||
|
||||
L'architettura separa completamente la logica audio da `engine.c` nel file isolato `sound.c`.
|
||||
Il Game Boy ha 4 canali audio, manipolati direttamente via registri hardware (`NR10_REG` .. `NR52_REG`):
|
||||
|
||||
## Hardware Audio Channels (APU)
|
||||
Il Game Boy dispone di 4 canali dedicati:
|
||||
1. **Canale 1 (Pulse 1)**: Onda quadra con sweep (glissando automatico del pitch).
|
||||
2. **Canale 2 (Pulse 2)**: Onda quadra senza sweep. Ideale per la base musicale.
|
||||
3. **Canale 3 (Wave)**: Onda personalizzabile definita in RAM (qui non utilizzata).
|
||||
4. **Canale 4 (Noise)**: Generatore di rumore pseudo-casuale bianco, usato per batterie ed effetti.
|
||||
| Canale | Tipo | Uso nel gioco |
|
||||
|--------|------|---------------|
|
||||
| CH1 | Pulse + sweep | Melodie (title, gameover, finale), salto, cattura |
|
||||
| CH2 | Pulse | Bassi, melodie sostenute, gameplay eerie |
|
||||
| CH3 | Wave | Non utilizzato |
|
||||
| CH4 | Noise | Percussioni (toll, crash, thud), effetti |
|
||||
|
||||
## Il Sequencer via Interrupt VBL
|
||||
L'intera colonna sonora viene eseguita senza bloccare mai l'esecuzione del codice di rendering o della CPU.
|
||||
La funzione `play_music_tick` viene agganciata al **Vertical Blanking (VBL) Interrupt** (`add_VBL()`), che scatta magicamente tra il disegno di un frame video e il successivo sul display a circa 60 Hz.
|
||||
Ogni chiamata incrementa un timer logico; quando il timer supera la durata della nota impostata, il sequencer aggiorna l'indice dell'array passandolo ai registri e suonando fisicamente il suono.
|
||||
## Sequencer via VBL Interrupt
|
||||
|
||||
## Illusioni Audio (Arpeggi e Polifonia Fittizia)
|
||||
Il chip GBDK può suonare solo un singolo tono per canale alla volta.
|
||||
Per la "Fanfara di Vittoria" e i momenti di forte tensione, per imitare accordi (che richiederebbero 3 canali), usiamo gli **Arpeggi Veloci**.
|
||||
Una melodia arpeggiata è un elenco di tre note (Es: Do-Mi-Sol) suonate in un loop talmente veloce che l'orecchio umano le fonde percependo un accordo polifonico. Nel codice, le note `N_C4`, `N_E4`, `N_G4` si susseguono ogni pochi frame (timer = 8 frame/tick).
|
||||
`play_music_tick` è agganciato al **Vertical Blanking Interrupt** (`add_VBL()`), ~60 Hz. Non blocca mai il rendering. Ad ogni VBL incrementa un timer; quando supera il periodo della nota, suona la nota corrente dall'array e avanza l'indice.
|
||||
|
||||
## Il Rumore come Percussione
|
||||
Durante la triste sequenza in tonalità minore del "Game Over", il Canale 4 del Rumore viene attivato sincopatamente:
|
||||
```c
|
||||
if (step % 8 == 0) {
|
||||
NR41_REG = 0x01;
|
||||
NR42_REG = 0xB2; // Decadimento rapidissimo per dare un colpo percussivo
|
||||
NR43_REG = (step < 64) ? 0x68 : 0x42; // Varia la frequenza: Thud basso vs Piatto (Crash) acuto
|
||||
NR44_REG = 0x80;
|
||||
}
|
||||
```
|
||||
Questo simula il battito di un tamburo e i piatti, donando drammaticità alla scena.
|
||||
### Note frequencies
|
||||
Le costanti `N_*` sono precalcolate come `(2048 - 131072/freq)` e scritte in `NR13/NR23` (low byte) e `NR14/NR24` (high byte | 0x80 trigger). Range: N_C2 (44, ~131 Hz) a N_A5 (1899, ~880 Hz).
|
||||
|
||||
## Tracce
|
||||
|
||||
### Title Theme (112 note, 3 canali, ~56 sec, loop)
|
||||
Brano complesso e ricco di pathos. 112 note su 3 canali:
|
||||
- **CH1 melodia**: envelope sostenuto (NR12=0x87, fade up lungo = suono haunting). Progressione Dm → Bb → F → C → A7(con C#, tensione armonica) → Dm(climb al C5) → Gm → A7 → discesa cromatica nell'abisso.
|
||||
- **CH2 basso**: linea indipendente (`title_bass[112]`) che segue gli accordi con movimento. Envelope deep plucked (NR22=0xA3).
|
||||
- **CH4 noise**: rintocchi sparsi ad ogni cambio d'accordo (ogni 8 step, NR43=0x70 = toll profondo) per atmosfera desolata.
|
||||
|
||||
Struttura: intro sparso → lamento → tensione/climax → crollo cromatico e discesa. Ispirazione: Castlevania (arpeggi gotici), Metroid II (desolazione), Link's Awakening (melancolia onirica).
|
||||
|
||||
### Gameplay Theme (96 note, CH2, ~32 sec, loop)
|
||||
Battito ritmico ansioso ("eerie pulse") in La minore → Re minore → Mi7. 20 frame/nota. Pattern ripetuto che accelera la tensione dell'inseguimento.
|
||||
|
||||
### Game Over (128 note, CH1+CH2+CH4, ~21 sec)
|
||||
Concerto tragico polifonico. 16 accordi con intensificazione (arpeggi più alti nella seconda metà). Noise percussion: thud basso (NR43=0x68) per la prima metà, crash acuto (NR43=0x42) per la seconda. 10 frame/nota.
|
||||
|
||||
### Finale (192 note, CH1+CH2+CH4, ~45 sec, loop)
|
||||
Brano dedicato per il finale tragico (livello 8). Lamento discendente in Re minore:
|
||||
- **CH1**: melodia sommessa (NR12=0xA2, fade lungo).
|
||||
- **CH2**: basso profondo (NR22=0xD1, fade lentissimo).
|
||||
- **CH4**: rintocco medio (0x68) di default, crash (0x42) al climax (step 80/88/112), tonfo profondo (0x70) nell'abisso (step ≥160).
|
||||
|
||||
Struttura: lamento Dm-C-Bb-A7 → intensificazione con arpeggi alti (lo "scream") → crollo con basso che scende fino al Do più grave (N_C2) → silenzio. 14 frame/nota (sommesso). Loop infinito.
|
||||
|
||||
### Going Deeper (96 note, CH1+CH2, ~36 sec)
|
||||
Melodia misteriosa discendente (Am → Fmaj7 → Dm → E7 → C aug → abisso). 15 frame/nota. Usata per la schermata di transizione tra livelli.
|
||||
|
||||
## Sound Effects
|
||||
|
||||
- **Salto**: pitch sweep up sul CH1 (NR10=0x15, sweep up).
|
||||
- **Cattura (game over)**: slide down profondo sul CH1 (NR10=0x1E, sweep down, envelope rapido).
|
||||
- **Beat drammatico iniziale (gameover/finale)**: NR21-NR24 triggerato al momento del game over.
|
||||
Reference in New Issue
Block a user