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.

0. Remerciements

1. Applications

1.1 Lire les fichiers YM
1.2 Éditer les fichiers YM

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

1.2 Éditer les fichiers YM

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 r03R1: r11 r12R2: 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 :

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 :

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 :

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 :

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édFréq. MFP
000--
0014614400
01010245760
01116153600
1005049152
1016438400
11010024276
11120012288

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 :

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 :

7654
00SID sound00pas d’effet
01Digi-drum01sur la voie 1
10Sinus SID (TAO)10sur la voie 2
11Sync Buzzer (TAO)11sur 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).