Manual Completo de Sonido para SNES
Introducción al SPC700
El SPC700 es un procesador de sonido de 8 bits que maneja música y efectos de sonido en la SNES. Trabaja junto al DSP (Digital Sound Processor) para generar audio.
Características
- Procesador 8-bit a 1.024 MHz (derivado del 6502)
- 64 KB de RAM dedicada
- 8 canales de sonido
- Formatos de muestra: ADPCM comprimido
Componentes Clave
- DSP: Procesa muestras de audio (filtros, eco, pitch)
- APU RAM: Almacena código y datos del SPC700
- Registros de Comunicación: ($2140-$2143) para enviar comandos
Registros de Sonido
Comunicación entre CPU y SPC700
$2140: Puerto 1 (comandos)
$2141: Puerto 2 (datos)
$2142: Puerto 3 (datos extendidos)
$2143: Puerto 4 (control)
Registros del DSP
Rango |
Propósito |
$00-$0F |
Volumen (izq/der) por canal |
$10-$1F |
Pitch (tono) por canal |
$20-$2F |
Dirección de muestra por canal |
$30-$3F |
ADSR (envelope) por canal |
$40-$4F |
GAIN (volumen dinámico) |
$60-$7F |
Filtros y efectos globales |
Inicialización del Sistema de Sonido
Protocolo de Arranque
; Esperar a que el SPC700 esté listo
WaitSPCReady:
lda $2140
cmp #$AA ; Byte mágico
bne WaitSPCReady
lda $2141
cmp #$BB
bne WaitSPCReady
; Transferir programa SPC vía DMA
UploadSPCProgram:
lda #$01 ; Banco de datos
sta $4304
lda #$22 ; Puerto $2142 (SPC RAM)
sta $4301
ldx #spc_code ; Dirección del programa SPC
stx $4302
ldx #spc_size ; Tamaño del programa
stx $4305
lda #$01 ; DMA canal 1
sta $420B
; Iniciar ejecución
lda #$CC ; Comando de inicio
sta $2140
lda #$01 ; Parámetro adicional
sta $2141
Ejemplo de Programa SPC700
; Código SPC700 (ensamblador)
.org $0200
main:
mov $F4, #$00 ; Limpiar puerto 1
; Configurar DSP
mov $F2, #$5C ; Volumen global izquierdo
mov $F3, #$7F ; Máximo volumen
; Bucle principal
loop:
mov $F4, $F4 ; Leer comando de la CPU
cmp $F4, #$01
bne loop
; Reproducir sonido
call PlaySound
bra loop
PlaySound:
; Configurar canal 0
mov $F2, #$00 ; Volumen izquierdo canal 0
mov $F3, #$7F
mov $F2, #$01 ; Volumen derecho canal 0
mov $F3, #$7F
mov $F2, #$02 ; Pitch bajo canal 0
mov $F3, #$00
mov $F2, #$03 ; Pitch alto canal 0
mov $F3, #$10
mov $F2, #$04 ; Dirección de muestra
mov $F3, #$02 ; Banco $02
mov $F2, #$05 ; Dirección de muestra (alto)
mov $F3, #$00
mov $F2, #$06 ; Dirección de muestra (bajo)
mov $F3, #$80
mov $F2, #$07 ; ADSR
mov $F3, #$FF ; Ataque rápido, decay sostenido
mov $F2, #$0C ; Encender canal 0
mov $F3, #%00000001
ret
Reproducción de Sonidos
Estructura de una Muestra de Sonido
Cabecera BRR (16 bytes):
- Bits 0-3: Tasa de filtro (0-4)
- Bit 4: Loop flag
- Bit 5: End flag
- Bits 6-7: Sin usar
- 8 bytes de datos ADPCM por bloque
Cargar una Muestra en RAM
; Desde la CPU principal:
LoadSample:
lda #$01 ; Comando "cargar muestra"
sta $2140
lda #sample_id ; ID de la muestra
sta $2141
ldx #sample_size ; Tamaño en bytes
stx $2142 ; (low/high byte)
; Esperar confirmación
- lda $2140
beq -
Reproducir un Sonido
; Desde la CPU principal:
PlaySound:
lda #$02 ; Comando "play sound"
sta $2140
lda #channel ; Canal (0-7)
sta $2141
lda #sample_id ; ID de muestra
sta $2142
lda #volume ; Volumen (0-127)
sta $2143
Reproducción de Música
Sistema de Secuenciador
; Estructura de un track:
TrackHeader:
.db tempo ; Velocidad (BPM)
.db num_channels ; Número de canales (1-8)
.dw patterns ; Puntero a patrones
Pattern:
.db length ; Duración en ticks
.db note, instrument, effect ; Eventos
Reproducir una Canción
; Desde el SPC700:
PlayMusic:
mov $F2, #$5C ; Volumen global izquierdo
mov $F3, #$7F
mov $F2, #$4D ; Volumen global derecho
mov $F3, #$7F
; Inicializar canales
mov $F2, #$0C ; Apagar todos los canales
mov $F3, #$00
; Cargar instrumentos
mov $F2, #$04 ; Canal 0: dirección muestra
mov $F3, #$02 ; Banco $02
mov $F2, #$05
mov $F3, #$00
mov $F2, #$06
mov $F3, #$80
; Iniciar secuencia
mov pattern_ptr, #pattern_data
mov tick_counter, #$00
Efectos de Sonido Avanzados
Efectos del DSP
Registro |
Efecto |
$2C-$2F |
Eco (delay) |
$30-$3F |
Filtros (low-pass, high-pass) |
$6D |
Modulación de pitch |
Ejemplo: Aplicar Eco
; Configurar eco en el DSP
SetupEcho:
mov $F2, #$2C ; Volumen de eco izquierdo
mov $F3, #$20
mov $F2, #$3D ; Volumen de eco derecho
mov $F3, #$20
mov $F2, #$4D ; Feedback de eco
mov $F3, #$30
mov $F2, #$5D ; Tamaño del buffer de eco
mov $F3, #$0F ; 15 ms de delay
mov $F2, #$0D ; Habilitar eco en canales
mov $F3, #%00001111 ; Canales 0-3
Optimización de Audio
Técnicas de Ahorro de Memoria
- Compresión BRR: Reducir tamaño de muestras
- Looping: Repetir segmentos de sonido
- Instrumentos: Reutilizar muestras con diferentes pitch/ADSR
Ejemplo: Muestra Loopada
; Cabecera BRR con loop flag activado
.brr_sample
.db %00010000 ; Filtro 0, loop activado
; ... datos ADPCM
.db %00100000 ; Filtro 0, end flag