Files
ascreamfromthedark-gb/doc/audio.md
T

2.2 KiB

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).

L'architettura separa completamente la logica audio da engine.c nel file isolato sound.c.

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.

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.

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).

Il Rumore come Percussione

Durante la triste sequenza in tonalità minore del "Game Over", il Canale 4 del Rumore viene attivato sincopatamente:

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.