Login
Utilisateur :
Mot de passe :
Nouveau ?
Accueil
 
Sasfépu
sasfepu
Matériels
Logiciels
Littérature
Articles de presse
Publicités
Téléchargements
 
Interviews
Pierre Lafitte
Jean Fontayne
 
Emulateurs
MESS
dchector
VB Hector
 
Projets
wav2hec
hec2wav
hecdump
émulateur
cable péritel
Hectorduino
Hectorduino & vidéos
 
Webmestre
 Laisser une Bafouille

Liens
 


wav2hec  
0. Qu'est-ce ?

Pour pouvoir utiliser ou jouer aux jeux et utilitaires conçus pour la gamme des ordinateurs Hector ou tout simplement pour préserver ces programmes de la dégradation du support magnétique sur lequel ils ont été enregistrés à l'origine, plusieurs outils ont été développés, wav2hec est l'un d'eux, il permet de transformer le contenu d'une cassette Hector en format binaire.


"Comment, ça marche ? Eh bien, c'est très simple!" Michel Chevalet

1. Enregistrement d'une cassette Hector

Après avoir branché un magnétophone sur la carte son d'un PC (Mic-in) et utilisé le "magnétophone" Windows (XP):

Dans le menu "Fichier", sélectionner "Propriétés" et cliquer sur "choisir à partir de" l'option "Formats d'enregistrement" puis cliquer sur "Convertir Maintenant":

La boite de dialogue apparait:

Sélectionner la "Qualité CD" et valider, vous êtes prêts à enregistrer toutes vos cassettes Hector! Après avoir mis le lecteur de cassettes en branle, une pression sur le bouton "Enregistrer" (bouton rouge) et lorsque l'enregistrement est fini, cliquer sur "stop" et sauver le fichier sous (Menu fichier, option "Enregistrer Sous...") un nom à l'extension .wav

2. Où sont passés les 1 et les 0 ?

Lorsqu'on ouvre le fichier .wav produit avec un éditeur, on obtient une courbe de ce type:

On voit que les différentes périodes (distances entre deux passages en ordonnée 0) ne sont pas toujours identiques! Mais comment savoir si on a des 1, des 0 ou autre chose dans ce fichier ?

Nous allons tout simplement compter le nombre de périodes de mêmes longueurs. Le résultat est le suivant (sur un fichier wav enregistré en 22Khz):

Mis à part le pic en position 36-39 qui semble être du bruit, on voit que l'on a trois types d'informations différents stockés sur une bande magnétique pour Hector. Des 1, des 0 et des ???. Apres lecture des articles qui ont pu paraitre sur la machine: Surement des cycles de synchronisation nécessaires à l'acquisition correcte des données qui les suivent.

Un article (Hectorien 1,2) fait mention d'environ 7 secondes de synchronisation en début de bande, le pic situé en 21-24 correspondrait à peu-près à cette durée. Les deux premiers pics seraient donc les 0 et 1, comment décider lequel des deux est 1 ?

Pas de miracle, il va falloir tester les deux cas.

On prend tous les cycles, à l'exception des cycles de synchronisation pour les grouper par paquets de 8.

Dans l'un des deux cas on obtient des octets qui correspondent à quelque chose:

2356 | DATA | 83 4a 4f 55 45 55 52 20 44 45 20 47 41 55 43 48 .JOUEUR DE GAUCH
245e | DATA | 45 2c 00 4a 4f 55 45 55 52 20 44 45 20 44 52 4f E,.JOUEUR DE DRO
255e | DATA | 49 54 45 2c 00 56 4f 54 52 45 20 50 52 45 4e 4f ITE,.VOTRE PRENO
265e | DATA | 4d 20 20 3f 20 00 20 47 41 47 4e 45 20 20 20 20 M ? . GAGNE

Les zéros ont donc une longueur d'environ 27 échantillons, les uns de 47 échantillons et les cycles de synchronisation de 75 echantillons (en 44.1Khz).

3. Le format WAVE (.wav)

On dit: "On lit le fichier .wav et on convertit...", facile ! Mais sans connaître l'organisation interne d'un fichier .wav, dur dur.

Ce format, inventé par Micro$oft est très simple de manipulation, sa structure, dans son format de base est composé de blocs:

"RIFF"
Longueur du fichier - 8
"WAVE"

"fmt"
Longueur de bloc format
Encodage
Nombre de canaux
Taux d'échantillonnage
ByteRate
Alignement du bloc
Nombre de bits par échantillon

"data"
longueur des données

<Données proprement dites>

En C, on utilise trois stuctures pour reproduire le format ci-dessus:

/* Microsoft WAVE file header */
typedef struct _WAVEHDR
{
CHAR achRIFF[4]; /* Always contains "RIFF" */
UINT32 nLength; /*Length of file in bytes, minus eight*/
CHAR achWAVE[4]; /* Always contains "WAVE" */
} WAVEHDR, *PWAVEHDR;

/* Microsoft WAVE file chunk header */
typedef struct _WAVECHKHDR
{
CHAR achType[4]; /* Type ID of this chunk */
UINT32 nLength; /* Length of the chunk data */
} WAVECHKHDR, *PWAVECHKHDR;

/* Microsoft WAVE file format chunk data structure */
typedef struct _WAVEFMTCHKHDR
{
UINT16 nFormat; /* Format encoding tag */
UINT16 nChannels; /* Number of channels */
UINT32 nSampleRate; /*Sample rate: samples per second*/
UINT32 nByteRate; /* Sample rate: bytes per second */
UINT16 nBlockAlign; /* Block alignment, in bytes */
UINT16 nBitsPerSample; /* Bits per sample */
} WAVEFMTCHKHDR, *PWAVEFMTCHKHDR;

Le paragraphe <Données proprement dites> est une succession de valeurs représentant une courbe qui est l'image de ce qui avait été enregistré sur cassette.

4. Le format HEC (.hec)

Un format inventé par moi-même ;-) pour pouvoir stocker le contenu converti des fichiers sons. On cherche a conserver les octets et les périodes de synchronisation.

On compte trois types de blocs différents, un premier qui est une entête de fichier qui contient diverses informations relatives au jeu et au dump lui-même. Puis viennent des blocs de données et des blocs de synchronisation.

Version de format
nom du jeu
Nom du convertisseur
Date de la conversion
Annee de parution du logiciel
Nom de l'éditeur
Prix (Euros) du logiciel lors de sa parution

"DATA"
Longueur
<données proprement dites>

ou

"SYNC"
Nombre de cycles

....

Les deux structures C utilisées sont:

typedef struct
{
unsigned char version_fichier; /* version de format de fichier */
char prg_nom[60]; /* nom original du jeu */
char nom_dumpeur[50]; /* nom de la personne ayant effectue le dump*/
short dump_annee; /* annee a laquelle le dump a ete fait*/
short dump_mois; /* mois */
short dump_jour;
short prg_annee_parution; /* annee de parution du soft */
char prg_editeur[50]; /* editeur du logiciel */
short prg_prix; /* prix du soft a sa sortie */
} hector_header;

typedef struct
{
char typed[5]; /* contient 'SYNC\0' ou 'DATA\0' */

UCHAR dummy;
INT16 len; /* nb cycles de sync ou nb d'octets de data */
} digital_sync,digital_data,hector_blk;

 


Framework PHP ©2002-2003 Stéphane Vanlierde