Hola Urian soy un asiduo lector de tu blog desde las epocas anteriores a disruptive sketchbook, alguna vez me respondiste acerca de si existía alguna diferencia de poder entre Wii y Gamecube, pero el dia de hoy te escribo porque necesito que me ayudes si puedes con una entrada explicativa acerca del SPC700 y DSP del SNES ya que tengo un trabajo para la Universidad y la info relativa a estos es muy escasa o dificil de interpretar del japones,

Muchas Gracias de Antemano y suerte en todos tus proyectos.

No hay problema, en primer lugar tengamos en cuenta que el sistema de sonido de SNES se compone de cuatro elementos que son:

  1. S-SMP (SCP700)
  2. 64KB ROM
  3. 64KB para RAM de Audio
  4. S-DSP (Generador de sonido).

Como has pedido que hable el SPC700 y del DSP me voy a centrar en ellos principalmente, la RAM y la ROM vienen implicitas de serie y de paso aprovechare para realizar una comparación con el sonido de su rival (Genesis/Mega Drive) aunque aviso que no voy a perder el tiempo colocando muestras de sonido de ambas consolas en el post.

#1 S-SMP (SPC700)

Se trata de una variación del MOS 6502, en realidad esta altamente modificada respecto a la clásica CPU de 8 bits que se vio en tantas consolas y ordenadores.  Mientras que el 6502 original incluye un solo registro aquí tenemos unos seis y además el diseño de Kutaragi añadió una serie de instrucciones nuevas sobre las ya disponibles en el 6502. Su velocidad de reloj es de 2 Mhz y si tenemos en cuenta que la gran ventaja del 6502 sobre el Z80 es el tiempo de los accesos a memoria entonces este tiene una ventaja sobre el Z80 en Genesis/Mega Drive utilizado como controlador de sonido en lo que a potencia se refiere.

Pero el SPC700 tiene un punto debil muy importante, de memoria solo puede acceder a los 64KB de memoria RAM que tiene al lado y a los 64KB de memoria ROM y no puede acceder directamente al cartucho a través del DMA por el hecho que no esta cableado con este sino que se le han de pasar los datos a través de la CPU por lo que resulta una sobrecomplicación enorme para los desarrolladores ya que no pueden tomar directamente los datos del cartucho y tienen que esperar a que los datos se carguen en memoria. ¿Nunca os habéis preguntado como es que en los juegos de SNES de repente la música se para para empezar de nuevo y/o no hay transiciones suaves? Lo ideal sería que el SPC700 pudiese acceder al sonido del cartucho a través del DMA pero resulta que no puede hacerlo y esto hace que el sistema de sonido de SNES no pueda hacer cosas como cambiar

Pero el problema añadido es que los desarrolladores no pueden escoger como se reproduce el sonido (lo cual no es lo mismo que decir que sonido se reproduce) ya que la forma en la que el SPC700 procesa el sonido para que el S-DSP lo pueda generar se encuentra en la ROM. Es decir, el SPC700 en todos y cada uno de los juegos de la consola no puede ser programado y por tanto el sonido ha de estar previamente generado en el cartucho y de ahí es transmitido a través de un largo viaje (haciendo que se tenga que parar el programa principal de la CPU) para colocar lo datos en los 64KB de memoria que son la única memoria a la que tanto el SPC700 como el DSP tienen acceso de todo el sistema.

¿Pero como comparten datos el SPC700 y el DSP? Los 64KB de Audio tienen un bus de 3Mhz y los accesos son 2/3 del tiempo para el SPC700 y 1/3 para el DSP, en dicha memoria es necesario almacenarlo todos los datos de audio que se van a reproducir en la escena. El motivo por el cual son solo 64KB aparte de que físicamente no existe más memoria es porque el SPC700 al ser una variación del 6502 no puede direccionar más de 64KB de memoria, no obstante tiene más memoria disponible el SPC700 que el Z80 de Genesis/Mega Drive y aquí ya entro en una de las polémicas más grandes de la época. Mucha gente dice que el sistema de sonido de SNES es inferior en parte por el hecho d eque no es programable. Esto viene porque en Genesis/MegaDrive tampoco el DSP de sonido es programable por lo que para irles enviando datos necesitamos utilizar ciclos de la CPU de manera constante lo que es un estrés para el 68K de la 16 bits de Sega y es por ello que el vestigio que es el Z80 se utiliza como una segunda CPU que sirve para manejar el sonido pero la consola no lleva ninguna ROM que tenga un programa que diga como reproducir el sonido, esto significa que en el caso de la consola de Sega tenemos que escribir nuestro controlador de sonido en ensamblador, generar el binario y cargarlo cuando encendemos la consola. ¿Y donde se carga dicho binario? En realidad se encuentra en los cartuchos de la consola, es decir, el Z80 necesita acceder al cartucho (tiene acceso como el 68K) para leer el programa de como tiene que generar el sonido, lo bueno de esto es que los desarrolladores pueden elegir como se genera el sonido, lo malo es que depende de la habillidad del desarrollador y es por ello que hay bandas sonoras en la 16 bits de Sega que son alucinantes y otras que son para tirarse un tiro mientras que la calidad del sonido de los juegos de SNES independientemente de la calidad de las composiciones es más que nada estable.

En realidad el problema de Genesis/Mega Drive es que hay juegos que cargan el controlador de sonido en los 8KB de memoria que tiene el Z80 asignados mientras que otros hacen al revés y cargan los datos de sonido en los 8KB y esos 8KB son mucho menos que los 64KB que tiene el SPC700 de SNES. Lo ideal es el primer caso para poder cargar los 64KB de datos desde el cartucho pero esto supone que no se puede generar sonido procedural mientras que en el otro caso si pero se tiene un limite de memoria. En SNES en cambio por las carácteristicas de la arquitectura el sonido no puede ser jamás procedural por el hecho que el SPC700 no es programable directamente y ni Nintendo ni Sony dieron jamás las herramientas para programarlo.

#2 S-DSP

El S-DSP es el encargado de generar el sonido, capaz de realizar 8 canales con calidad ADPCM (16 bits) a una frecuencia de 32Khz, es el único chip encargado de generar el sonido (previamente procesado por el SPC700) que hay en la consola y barre el suelo en lo que a calidad de sonido se refiere con el YM2612 que hay en Genesis/MegaDrive y sus 6 canales de calidad FM y 8 bits. El hecho que el S-DSP procese los datos de sonido en 16 bits le da más precisión y por tanto más calidad, en especial a la hora de reproducir voces que en Genesis/MegaDrive por lo general suenan mucho peor aunque hay casos en la consola de Sega donde el uso del sintetizador FM para la generacíón de las voces se merece un aplauso. Pero el tema en el número de canales de sonido es algo que mucha gente no entiende y es que a la hora de emular ciertos instrumentos son necesarios varios canales de sonido y no es que 8 canales fuesen una maravilla pero eran más que 6 y para colmo sonaban mucho mejor.

Como he explicado antes el sonido en SNES no es programable, esto significa que la música ya se encuentra almaceda en el cartucho y es enviada en un bloque entero hacía los 64KB de RAM de Audio como he explicado antes… ¿El motivo? En el diseño de SNES el CD-ROM era algo que existía en los planes desde el primer día por lo que la idea principal es que las muestras de sonido se cargasen directamente desde el CD-ROM hasta la RAM de Audio como si fuesen archivos de sonido de unos 64KB de tamaño máximo. La ventaja de este método es que la consola puede reproducir cualquier sonido mientras este en el rango de frecuencia mientras que en el caso de Genesis/Mega Drive no es así, la consola en el caso de Sega no esta pensada para reproducir el sonido de manera directa sino que el YM 2612 es el rival directo del S-DSP es un sintetizador FM. Se ha de tener en cuenta que la generación de sonido a través de un sintetizador FM se hace variando el tono de una onda de sonido a través de modular su frecuencia en un rango que se encuentre en su rango de audio. Es decir, un sintetizador FM no deja de ser en el fondo una especie de instrumento que a través de la modulación de la onda de sonido genera un sonido u otro. Es por ello que se dice en Genesis/Mega Drive el sonido es programable, no solo porque tenemos acceso completo al Z80 y al 68K (algunos juegos lo usan) sino porque podemos utilizar el YM 2612 generando el sonido como si se tratase de un instrumento aunque por sus limitaciones técnicas no puede llegar a la calidad del del S-DSP de SNES aunque si pudiese reproducir el sonido con la calidad del DSP de SNES sería mucho mejor por su versatilidad.

Pero esto no significa que el S-DSP no tenga limitaciones y tiene una muy pero que muy sonada y no es otra que el tamaño de los loops de sonido están limitados, un loop no es más que la repetición de una sección de una música y dado que esta se encuentra almacenada en forma de datos significa que tiene que haber un salto en el direccionamiento de memoria, pues bien… esto la consola lo lleva como el culo… En Genesis/MegaDrive donde el archivo de sonido son las intrucciones de como el sintetizador FM ha de ir modulando los canales de sonido el hecho de incluir una canción con Loops no es problema, pone la directa y ya esta ya que no esta reproduciendo realmente un archivo de sonido pero en SNES si, en SNES no estas generando el sonido porque no puedes controlar como se genera el sonido sino que tienes un archivo de sonido de unos 64KB y dado el limitado tamaño tienes dos opciones:

  1. Hacer que la canción entera te quepa en los 64KB y no tirar de saltos.
  2. Reducir los datos tirando de saltos en el direccionamiento de memoria.

Cada salto requiere unos 16ms de tiempo lo que resulta un fotograma entero y no es que el sonido se pare durante un fotograma pero el SPC-700 durante ese periodo deja de enviar datos al S-DSP para realizar el salto, procesar esa parte del sonido y enviarla al S-DSP. El problema es que en los juegos hay una gran cantidad de sonidos que son aleatorios por lo que los saltos se hacen de manera continuada, eso si… el limite en cuanto al número de saltos es de unos 224ms en total. ¿Pero como afecta a la calidad del sonido? Bueno, el SPC700 necesita unos 2KB de datos por salto, es decir… Si tenemos en cuenta que podemos tener hasta 224ms de retardo en saltos de memoria esto deja el sonido en solo unos 30KB disponibles si el sonido de SNES se utiliza en su máxima capacidad pero Nintendo tampoco podía aumentar la cantidad de RAM para el audio disponible por las limitaciones en el direccionamiento del SPC700, el cual recordemos que es un MOS 6502 altamente modificado.

Esto es todo, no se mucho más del sistema de sonido de SNES, espero que esta explicación simple te sea útil.