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

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
        

Herramientas para Sonido SNES

Editores y Conversores

Librerías Populares