Les formats de fichier YM
A PARTIR du son produit par les processeur sonores AY-3-8910 (Général Instruments) ou YM-2149 (Yamaha), Arnaud Carré a développé un format de fichier pour conserver les productions musicales, qui peuvent également être jouées sur les systèmes d’exploitation récents.
2022.03.05 - page en cours d’écriture, formats YM4-5-6 à préciser
Voir cette page pour une description du fonctionnement de la puce sonore YM-2149.
2. Formats de fichier YM
2.1 Les fichiers YM2 et YM3
2.2 Les fichiers YM3b
2.3 Les fichiers YM4 et YM5
0. Remerciements
Grand merci à Arnaud Carré pour son œuvre et la mise à disposition des spécifications des formats de YM3! à YM6!.
1. Applications
1.1 Lire les fichiers YM
- le paquet STYMulator (GNU/Linux) traite YM3, YM5 et YM6 et fournit les commandes :
- ymplayer fichier.ym lit un fichier YM, options sur l’écran (play, pause, <<, >>, quit)
- ym2wav fichier.ym fichier.wav (pas d’option) transforme un fichier YM en fichier WAV mono 16bits / 44100 échantillons par seconde
- Ay_emul (Windows, Mac, GNU/Linux) lit les fichiers YM3, YM5 et YM6 avec interface graphique
1.2 Éditer les fichiers YM
- Arkos Tracker 2 (peut-être un jour libre), peut importer des fichiers MIDI comportant jusqu’à trois portées monophoniques ; sauvegarde dans son propre format et exporte en YM et WAV mono ou stéréo.
2. Formats de fichier YM
Arnaud Carré a créé le format de fichier .YM qui comprend les valeurs des 14 registres utiles 50 fois par seconde, cadence du rafraîchissement de l’écran (VBL) pour l’AtariST basse résolution. Il en résulte 700 octets par seconde.
Les fichiers sont compressés avec l’algorithme LHARC (header de type 0). Fonctionne en GNU/Linux :
jlha a0 mamusique.lzh mamusique.dat
Sous Windows, l’auteur préconise (non testé) :
LHA a -h0 TEST.LHA TEST.BIN
Il faut dans les deux cas renommer le fichier compressé .lzh ou .LHA en .ym ou .YM. Les applications semblent jouer aussi bien les fichiers compressés ou non.
Note : Les mots (deux octets) et les doubles mots (quatre octets) des formats YM4! et suivants sont donnés dans le sens Motorola, appelé «big endian» ou «gros-boutiste». Il s’agit de l’ordre naturel : d’abord le poids fort puis le poids faible, comme le chiffre des dizaines est noté avant celui des unités. Le mot court 2606 est donc écrit 0A 2E, soit 10 * 256 + 46.
2.1 Le format YM3
Il s’agit d’un format de fichier très simple, qui commence par une entête, suivie des données à envoyer à chaque registre (50 octets par seconde aux 14 registres) :
59 4D 33 62 -- «YM3!» entête du fichier données en mode entrelacé, toutes celles du premier registre, puis du second…
Visualisation du mode entrelacé :
R0: r01 r02 r03 … R1: r11 r12 … R2: r21 … … …
Le mode «entrelacé» a été choisi parce que la répétition des données permet des taux de compression LZH/LHA dépassant très facilement 10 et même 20.
Ces données et entête pèsent 4 + nbr_sec * 50 * 14, sauvegardées compressées sous forme d’un fichier .YM.
Note : l’adressage du registre 13 réinitialise l’enveloppe. Pour éviter cela, l’auteur préconise de coder le registre 13 avec l’octet 0xFF (255) pour indiquer au lecteur de YM qu’il ne doit rien adresser au registre.
Le format YM3! est recommandé pour l’encodage des musiques simples adressant les registres 50 fois par seconde, sans les techniques spéciales comme le digi-drum ou le digi-sound.
L’ancien format YM2! (données non entrelacées? autre type de compression?) est déconseillé.
2.2 Le format YM3b
Ce format désigne simplement en fin de fichier l’endroit où le morceau boucle, permettant ainsi que le début ne soit joué qu’une fois, comme toute intro qui se respecte.
59 4D 36 21 -- «YM3b», l’entête données en mode entrelacé, toutes celle du premier registre, puis du second… hh hh hh hh -- nombre désignant l’endroit précis (en 50èmes de seconde) où revient la tête de lecture
La longueur avant compression d’un fichier YM3b est de 4 + nbr_sec * 700 + 4 octets.
2.3 Le format YM4
Ce format contient de nombreux ajouts, changements ou précisions :
- ajout d’une chaîne de 8 octets «LeOnArD!» (non terminée par un octet nul)
- nombre d’octets par registre (nbr_sec * 50)
- données pour digi-drum et timer-synthé, échantillons traités par le Multi-Fonction Processor de l’AtariST
- ajout de trois chaînes terminées par un octet nul : titre, auteur et commentaire
- les données peuvent être entrelacées ou non
- utilisation de bits non utilisés par les registres du YM-2149 pour la programmation des données qui suivent
- ajout de deux «registres» supplémentaires pour les données digi-drum ou timer-synth
- quatre octets de fin de fichier «End!»
Adr hex 00: 59 4D 34 21 -- «YM4!» 04: 4C 65 4F 6E 41 72 44 21 -- «LeOnArD!» 12: hh hh hh hh -- nombre d’octets par registre pour tout le morceau 16: 00 00 00 0h -- 3 bits utiles, h= 0dsi, voir attributs 20: hh hh hh hh -- nombre de digi-drums 24: hh hh hh hh -- numéro du frame de reprise pour la boucle
Autant de fois qu’il y a d’échantillons digi-drum :
hh hh hh hh -- taille de l’échantillon octets (échantillon de 8 bits, signés ou non, voir attributs)
Viennent ensuite trois chaînes de caractères de longueurs arbitraires, chacune terminée par un octet nul :
ccc….cc 00 -- titre du morceau ccc…..cc 00 -- nom de l’auteur ccc………cc 00 -- commentaire
Suivent les données des registres habituels plus deux nouveaux, qui concernent chacun un digi-drum ou digi-sound.
nbr_sec * 800 octets 45 6E 64 21 -- «End!»
Attributs du morceau
les trois bits faibles du long 0000000x :
- bit 0 si données entrelacées (tout le registre 0, puis le 1…)
- bit 1 format des octets de données du digi-drum : signées (-128 à 127) sinon de 0 à 256
- bit 2 si le digi-drum est déjà au format ST 4 bits (à éclaircir)
- bits 3-31 doivent être à 0
Mode non-entrelacé : les 16 premières valeurs sont données successivement aux 16 registres, puis les 16 suivantes…
R0 R1 R2 R3 R4 R5 … 16 registres f00 f01 f02 f03 … f10 f11 f12 … f20 f21 f22 … f30 f31 … …
bits supplémentaires
À préciser…
bit: 7 6 5 4 3 2 1 0 R0: X X X X X X X X Voie 1: poids faible de la période R1: - z t s X X X X poids fort R2: X X X X X X X X Voie 2: poids faible de la période R3: - - d d X X X X poids fort R4: X X X X X X X X Voie 3: poids faible de la période R5: v v v v X X X X poids fort R6: - - - X X X X X période du bruit R7: - - X X X X X X Mixage bruit 3 2 1 et tonalité 3 2 1 R8: - - - X X X X X Voie 1: volume R9: - - - X X X X X Voie 2: volume R10: - - - X X X X X Voie 3: volume R11: X X X X X X X X période de l'enveloppe: poids faible R12: X X X X X X X X : poids fort R13: - - - - X X X X forme de l'enveloppe R14: X X X X X X X X premier digi-drum ou Timer-Synth R15: X X X X X X X X second digi-drum ou Timer-Synth
R1 : les bits 5 et 4 codent :
- 0 0 pas de Timer-Synthé
- 0 1 sur la voie 1
- 1 0 sur la voie 2
- 1 1 sur la voie 3
S’il y a Timer-Synthé, le bit 6 détermine la remise à zéro du Timer.
R5 : les bits 7, 6, 5, 4 déterminent le volume du Timer-Synthé
R3 : les bits 5 et 4 codent la voie où un digi-drum démarre, le numéro du digidrum (de 0 à 31) étant alors codé sur le registre «volume» correspondant :
- 0 0 : pas de digi-drum
- 0 1 : digi-drum la voie 1, numéro de l’échantillon codé sur R8
- 1 0 : digi-drum la voie 2, numéro de l’échantillon codé sur R9
- 1 1 : digi-drum la voie 3, numéro de l’échantillon codé sur R10
Si le Digi-Drum commence sur la voie 1, R8 doit contenir à la place du volume le numéro de l’échantillon du Digi-Drum à sélectionner, qui sera traité par le MFP (Multi-Fonction Processor). La cadence dont celui-ci joue l’échantillon est codé par deux nombres : trois bits (valeurs de 0 à 7) et un octet (valeurs de 0 à 255). Le premier sert de prédiviseur de l’horloge du MFP, 2 457 600Hz.
Préd | Fréq. MFP | |
---|---|---|
000 | - | - |
001 | 4 | 614400 |
010 | 10 | 245760 |
011 | 16 | 153600 |
100 | 50 | 49152 |
101 | 64 | 38400 |
110 | 100 | 24276 |
111 | 200 | 12288 |
On divise ensuite la fréquence obtenue par un octet pour obtenir la fréquence finale à laquelle le MFP traite l’échantillon. En pratique (sous réserve) :
R8: d i v X X X X X -- d i v pour les trois bits du prédiviseur de l’horloge du MFP, les cinq autres pour le numéro de l’échantillon du digi-drum
R15: -- octets de division de la fréquence de l’horloge MFP
L’ensemble du fichier est également compressé au format LHA/LZH, avec un header de type 0, voir YM3.
2.4 Le format YM5
Suite à des demandes de la communauté, le YM4 est légèrement modifié sous le nom de format YM5. Sont ajoutés :
- la fréquence de l’horloge pour le YM2149 (2 000 000 pour l’Atari, 1 000 000 pour l’Amstrad)
- la fréquence du morceau (le plus souvent 50Hz, mais la haute résolution de l’Atari ST est à 71Hz).
- une taille de données supplémentaires, pour le moment à 0.
Adr Octets 00: 59 4D 35 21 -- «YM5!», ou 59 4D 36 21 «YM6!» 04: 4C 65 4F 6E 41 72 44 21 -- «LeOnArD!» 12: hh hh hh hh -- nombre d’octets par registre pour tout le morceau 16: 00 00 00 0h -- 3 bits utiles, h= 0dsi, voir attributs 20: 00 hh -- nombre de digi-drum (il peut être nul) 22: 00 1E 84 80 -- fréquence. AtariST: 2 000 000; Amstrad CPC: 1 000 000 (nv) 26: 00 32 -- fréquence du morceau, à 50Hz (nv) 28: hh hh hh hh -- numéro de la VBL de reprise du morceau 32: 00 00 -- taille de données futures, actuellement nulle (nv)
Autant de fois qu’il y a d’échantillons digi-drum (non décrit sur cette page) :
hh hh hh hh -- taille en octets …données en octets de l’échantillon
Trois chaînes terminée par l’octet null, les données et le mot de fin :
cccc……..ccc 00 -- Titre ccccc……ccc 00 -- Auteur ccc…ccc 00 -- Commentaire données entrelacées ou non des 14 registres + deux registres virtuels pour digi-drum ou digi-sound 45 6E 64 21 -- «End!»
2.5 Le format YM6
À préciser.
Au registre R1, les bits 7 et 6 désignent le type d’effet et les bits 5 et 4 la voie concernée :
7 | 6 | 5 | 4 | |||
---|---|---|---|---|---|---|
0 | 0 | SID sound | 0 | 0 | pas d’effet | |
0 | 1 | Digi-drum | 0 | 1 | sur la voie 1 | |
1 | 0 | Sinus SID (TAO) | 1 | 0 | sur la voie 2 | |
1 | 1 | Sync Buzzer (TAO) | 1 | 1 | sur la voie 3 |
Le prédiviseur est défini par les bits 7 à 5 de R6 et l’octet diviseur en R14.
Un autre effet spécial peut être défini de la même manière sur R3, R8 et R15.
Les effets
SID Sound : une seule valeur, le volume maximal, soit les bits 3 à 0 du registre de volume pour la voie concernée (R8 pour la voie 1)
Digi-drum : le numéro de l’échantillon est désigné par les bits 4 à 0 du registre de volume de la voie concernée (R9 pour la voie 2)
Sinus-SID : boucle d’un échantillon sinusoïdal de 8 octets, calculé par le lecteur.
Sync Buzzer : se base sur la réinitialisation du registre pour moduler la fréquence de l’enveloppe, dont le type est inscrit sur le registre du volume de la voie concernée (R10 pour la voie 3).