A l'intérieur d'un Snes, il y a un module dédié à
la production du son. Le module de son est composé
d'un processeur (le SPC700), de mémoire (64Kb), d'un dsp
et d'un convertisseur digital/analogue. Le cpu principal du Snes
communique avec le module de son via 4 ports.
Les fichiers de musique de Snes en format .spc sont en fait
des sauvegarde d'état des composantes du module de son,
comme on peut le faire avec le Snes au complet dans zsnes avec F2,
mais dans ce cas ci, seulement la memoire du module, les registre du spc700
et du dsp sont sauvegardés. Cela fonctionne car en general, les
jeux chargent un programme dans le module de son qui une fois
démarré, s'occupe de faire jouer la musique, et de
changer de pièce lorsqu'il en recoit l'ordre.
On peux faire jouer des .spc avec un spc player(programme ou plugin). Un spc
player n'est qu'un émulateur de Snes simplifié (son seulement).
Depuis longtemps j'espérais un jour trouver un moyen de pouvoir
faire jouer la musique en utilisant un module de son directement, pour que
les pièces soient reproduites de manière parfaitement fidèle
à aux originaux. (Bien sur les émulateurs peuvent faire mieux en
utilisant de plus hautes fréquences et meilleurs algorithmes de
rééchantillonnage et de mixage, mais ici il est question
d'authenticité, et il ne faut pas oublier le "Cool factor")
J'ai trouvé la solution sur le
site de caitsith2. Il a
trouvé le moyen brancher un module de son sur un port parallel,
et a fait un petit programme pour uploader des .spc vers le module et
les faire jouer.
Schéma
Voici le plan:
Et voici un fichier contenant le "pinout" du module
de son:
APU_pinout.txt
Tout ces fichiers proviennent du fichier
APU Interface.zip que vous pouvez télécharger du
site de caitsith2.
Pour l'alimentation, vous pouvez utiliser un régulateur lm7805 pour obtenir
du 5 volts à partir d'une tension plus élevée. L'alimentation
'Digital VCC' du module de son consomme 62mA en temps normal, et 36mA lorsque le signal
reset est bas. L'alimentaion 'Audio VCC' consomme 1.3mA en tout temps.
Un utilisateur m'a rapporté qu'il avait de la misère à faire fonctionner le montage jusqu'a
ce qu'il branche le chassis de l'APU au ground. C'est une excellente idée.
Photos
J'ai assemblé ce projet dans une boite de plastique. Dans la partie
de gauche, on peux voire le petit circuit sur lequel est installé le 74ls32 et
le db25. Pour la partie de droite, voir l'image suivante.
On peux voir ici le connecteur du module de son (dessoudé d'un Snes), les
sorties audio RCA et écouteur 1/4, le led indiquant que le circuit est
sous tension, et 2 leds et transistors reflétant l'état des signal
read et write du module de son.
Sur les connecteurs rca, j'ai mis de condensateurs de 1uf pour éliminer l'offset
DC (environ 1.2 volts si je me rappel correctement) du module de son.
La prise d'écouteurs utilise les resistances de 50 ohms du plan d'origine,
mais cela ne fonctionne pas bien avec tout les écouteurs. C'est à cause
de l'offset DC, mais les petit condensateurs empirentla situation :(
Il faudrait rajouter un mini amplificateur...
Une fois le couvercle refermé voici à quoi cette jolie boite
à musique ressemble.
Logiciel
J'ai tout d'abord tenté d'utiliser le logiciel de Caitsith2, mais cela
n'a pas fonctionné. Après avoir regardé à quoi ressemblait
les signaux avec un oscilloscope, j'ai déduit que l'ordinateur ne laissait
pas asser de temps passer pour permettre aux transistions logique de se faire(cela
doit dépendre de la conception du port parallel). Heureusement, le code
source était disponible, et en rajoutant des delais au bons endroits, tout
a bien fonctionné.
L'interface graphique est écrite en VB, le bas niveau en C/C++ dans une dll.
J'ai du modifier et recompiler la dll. Si vous avec des erreurs tel que "Error Loading SPC", essayez ma version modifiée
après vous être assuré que tout est bien assemblé.
Voici la dll:
APU_DLL.dll et voici le fichier source
que j'ai modifié: apuplay.c.
Je ne voulais pas être contraint d'utiliser windows pour me servir
du module de son, alors après m'être assuré que tout fonctionnait
bien, j'ai adapté le code de la dll pour linux (simplement un appel a iopl pour
pouvoir faire des in/out sur des ports, et ajout d'un macro pour les in/out), et
j'ai réécrit le code VB en C.(ouch..)
Le code source de mon programme est disponible ici:
Version v1.03 30 mars 2005 (Mercredi)
Ajout du support ppdev (accède au port parallèle depuis le user-space de manière portable. Plus besoin d'être root!)
Plugin xmms (avec ppdev seulement)
Version en ligne de commande maintenant avec couleur
Option -d pour afficher de l'information de deboggage
Le status line est maintenant actif par défaut. Peut être déactivé avec l'option -s
Cette nouvelle version peut être compilée pour DOS/Win9x avec DJGPP (ne fonctionne pas sous 2000/NT/XP à cause des accès directs au port d'E/S du port parallèle, mais peut-être qu'en utilisant PortTalk cela serait possible).
Cette version n'a pas de différences fonctionnelles avec la précédente. Je n'ai fait que clarifier le code traitant le fichier .SPC (la partie à l'origine écrite en VB) en utilisant des #define au lieu de valeurs magiques dans le code. J'ai aussi ajouté quelques commentaires explicatifs.
Un simple outil en ligne de commande qui prends un .spc donné en paramètre et le télécharge vers le module de son en utilisant l'adaptateur présenté plus haut. Il supporte les tag ID666 partiellement, arrête la musique après le bon temps (le temps du tag ou tel que spécifié en ligne de commande), affiche le titre et le temps restant...
Ce projet est aussi disponible sur GitHub! Pour suggérer de nouvelles fonctionnalités, signaler un problème ou contribuer au projet,
vous pouvez m'écrire ou utiliser le dépôt GitHub: https://github.com/raphnet/apu_linux
Ensuite
Je n'ai pas encore fini de travailler sur ce projet. Voici quelques idées futures:
Plugin xmms pour faire jouer des .spc avec le module de son
Rendre le module plus indépendant du PC. Présentement, si on l'alimente
avec une pile, un coup la musique démarrée on peux le débrancher du PC et l'apporter ailleurs. J'aimerais
faire quelque chose de mieux, dans le genre de ce
SID player, mais
plus portable.
Étudier la possibilité de modifier snes9x ou Zsnes pour qu'ils se servent du module plutot
que d'émuler le son.
Gallerie
Je destine cette section à contenir des photos de ce projet réalisé par
d'autres personnes.
Mai 2005:
Christopher Cox m'a fait parvenir 2 images. Il a réalisé ce projet à
l'intérieur d'une joyeuse boîte à lunch!
Mars 2006:
Jon Batt m'a fait parvenir 4 images:
Janvier 2008:
Matthew m'a fait parvenir ces 5 photos:
Il a aussi mis un
vidéo sur youtube! Septembre 2014:
Marcin Mrozowski m'a fait parvenir des photos de son lecteur de musique SPC qu'il
a réalisé avec Piotr Mrozowski (Le père de Marcin). Le fichier SPC n'est pas chargé dans le module de son
via un port parallèle, mais avec un arduino combiné avec un module bluetooth hc-05!
Les meilleurs endroits ou l'on peux télécharger des trames sonores de jeux au complet en format .spc sont: snesmusic.org L'archive de spc chez zophar.
Avertissement
Je ne saurais être tenu responsable pour les dommages
que l'utilisation des informations ou la mise en œuvre des instructions présentées
sur cette page pourrait causer à votre équipement,
à vous-même ou à autrui. Aussi, je ne donne aucune garantie quant
à l'exactitude des informations et à leur fonctionnement.