Historique: SoundFont specification SF2
Aperçu de cette version: 6
note
Cette page présentera soundfont specification SF2.
attention
Page en cours d'écriture
Table des matières
Préambule :
Ce tutoriel a été crée à partir de tests et de la traduction de la spécification soundfont SF2.(ici trouver le nouveau lien pour afficher la norme SF2 connect.creativelabs n'est plus disponible)
La norme SoundFont2 est destinée à fournir un format d'échange universel, portable et extensible pour synthétiseur à échantillon et leurs données d'articulations; Elle est portable et universelle grace à l'utilisation d'une définition précise des paramètres indépendants du matériel, ainsi que par des pratiques spécifiques conçues pour être supportées par un large éventail de technologies.
Dans ce mémo, c'est le langage de programmation C++ ( QT4 ) qui est utilisé pour illustrer les exemples.
Le fichier soundfont SF2 que j'utilise a été créé avec Swami sur un seul échantillon stéréo (un signal LA de 1 seconde), un seul intrument, et un seul preset.
Le format du fichier SF2 :
Un fichier SF2 est stocké en format RIFF (Resource Interchange File Format) qui est une structure de fichier balisé, développée pour les fichiers de ressources multimédia, il est décrit en détail dans les Référence Microsoft Windows SDK multimédia programmer.
La structure fichier balisé est intéressante car elle permet d'éviter les problèmes de compatibilité qui peuvent se produire dans les changements de définition de fichier au fil du temps, du fait que chaque élément de données dans ce fichier est identifié par une tête standard, une application qui ne reconnaît pas un de ces éléments de données peut éluder cette information inconnue.
Un fichier RIFF est construit à partir de blocs et sous-blocs stratifiés en niveaux, la lecture doit se faire séquentiellement, bloc par bloc, afin de récupérer la taille de ces blocs et de pouvoir lire les données "en paquet" d'octets ou par une structure de donnée (struct).
Principe des blocs :
Les blocs sont "balisés" par des chaines de 4 octets ( ex: snbk, INAM, ifil, LIST ... ), la spécification n'impose pas si ces caractères doivent être majuscules, minuscules ou le deux.
La valeur "taille" du bloc est écrite sur 4 octets le premier est celui de poids faible, le quatrième de poids fort, ce qui implique que le calcul de cette valeur s'effectuera après la lecture des octets de la façon suivante :
octet1 + octet2*256 + octet3*(256²) + octet4*(256³) etc...
ex : 44 F1 02 00 => 192836
Les informations concernant d'autres données techniques sont en annexe A.
Le premier bloc :
Dans ce bloc, nous récupérons le type de structure et la taille du bloc de données. Il a une taille invariable de 8 octets
Copy to clipboard
struct entete{ DWORD typestructure;// RIFF = #52494646 DWORD taillefichier; DWORD typefichier;//sfbk = #7366626b };
Ce premier bloc est commun à tous les fichier RIFF, il fournit les informations sur le fichier traiter, dans notre cas, nous avons à faire avec un fichier RIFF de type banque son. Quant à la donnée taillefichier, elle renseigne sur la taille du bloc de donnée, c'est à dire que sa valeur = (taille réelle du fichier) - 8 octets (RIFF et taillefichier).
les blocs suivants :
Ces blocs peuvent être organisés dans le RIFF dans n'importe quel ordre, puisqu'il commence toujours par des balises pour les décrire. De plus, ces blocs ne sont pas obligatoirement prèsents, ainsi que certaines de leurs données peuvent être absentes. Il est aussi possible que des blocs écrits dans le fichier ou des données ne soient pas utilisable dans le logiciel. C'est ce qui fait la souplesse et fiabilité dans le temps des fichier RIFF (sous réserve que le logiciel qui les utilise soit dotés des contrôles nécessaires).
Mais, il est plus judicieux de se conformer à une organisation "standard" lors de la création d'un fichier RIFF. Pour description qui suit, j'utilise un fichier SF2 créé avec Swami avec un seul échantillon stéréo (un signal LA de 1 seconde), un seul intrument, et un seul preset.
Le bloc de description commence toujours par la balise LIST suivie de la taille du bloc et son type ce qui permet (si le type n'est pas utilisé par le logiciel) d'aller immédiatement au bloc suivant par l'utilisation de la valeur taille_du_bloc_qui_suit.
Copy to clipboard
struct baliseLIST{ DWORD balise;// LIST DWORD taille_du_bloc_qui_suit; DWORD balise_bloc;//INFO };
Chaque donnée contenue dans une balise_bloc à une structure simple elle est composée d'un nom, d'une taille et de la valeur de la donnée.
Copy to clipboard
struct balise_donnee{ DWORD nom_de_balise;// ex: ifil -> N° de version de la norme SF2 utilisée DWORD taille_de_la_donnee;// ex: 04 00 00 00 };
ensuite la valeur de la donnée suit ces valeurs. Pour récupérer la valeur de la donnée il suffit d'utiliser "taille_de_la_donnee".
On procéde de cette façon jusqu'à la limite finale du bloc donnée par "taille_du_bloc_qui_suit". Après quoi, un nouveau bloc, commençant par une balise LIST commence.
Description des blocs et de leurs données
Les données de type chaines de caractères ASCII finissent par un ou deux octets à 0, de manière à obtenir éventuellement, la longueur de la chaine ; Donc la taille concernant ces chaines (taille_de_la_donnee) comprend les valeurs 0 finales. Les carcatères ASCII doivent être considérés comme sensible à la casse, en d'autres termes "abc" n'est pas la même chose que "ABC". Les chaines acceptées sont de 256 octets ou moins, sauf indication contraires.
Le bloc LIST : INFO
Il contient les données générales de la soundfont 11 balises de données sont actuellement définies :
| balise | type | présence | description |
|---|---|---|---|
| ifil | numérique | obligatoire | identificateur de la version de la spécification de la SoundFont. Sa taille est toujours de 4 octets et contient des données en fonction de la structure: Copy to clipboard
69 66 69 6c balise : ifil 04 00 00 00 taille du bloc ifil ( 4 ) 02 00 01 00 donnée de la version SF2 (ici 2.1) Ces valeurs doivent être utilisées par les applications qui lisent des fichiers compatibles SoundFont pour déterminer si le format du fichier est utilisable l'application. En général, elle doit accepter le fichier soit, comme utilisable (éventuellement avec une transposition appropriée), soit elle le rejetera ou avertira l'utilisateur qu'il peut y avoir des données non-traitables dans le fichier. Si cette valeur est manquante : le fichier doit être rejeté. |
| isng | chaine | obligatoire | C'est une valeur identifiant le moteur sonore pour lequel le fichier a été optimisé. Par défaut la valeur est de huit octets représentant "EMU8000" suivi par un octet nul. Cette valeur peut être utilisée par les pilotes de puce pour modifier leurs algorithmes de synthèse afin d'émuler le moteur sonore. Si cette valeur est manquante ou déficiente : le champ doit être ignoré et EMU8000 supposé. |
| INAM | chaine | obligatoire | Indique le nom de la banque de son, elle est généralement utilisé pour l'identification de la banque pour la dissocier du nom de fichier qui lui peut être modifié. Si cette valeur est manquante : le champ doit être ignoré et remplacé avec un nom par défaut valide. (l'absence du nom de banque n'empêche pas la soundfont de fonctionner). |
| IROM | chaine | option | Elle identifie une ROM de table de son particulière à laquelle les échantillons se référent.. Une donnée typique de IROM serait "1MGM" de deux octets nuls. Cette valeur est utilisée par les pilotes pour vérifier que les données en ROM et référencées par le fichier SF2 sont disponibles pour le moteur de son. Si cette valeur est manquante ou déficient : le champ doit être ignoré. Si IROM est prèsent, IVER doit être prèsent et valide. |
| VER | numérique | option | C'est une valeur de même type que ifil. Elle est utilisée par les pilotes pour vérifier que les données de la ROM référencés par le fichier sont dans la bonne version. Si cette valeur est manquante ou déficient : le champ doit être ignoré. Si IVER est prèsent, IROM doit être prèsent et valide. |
| ICRD | chaine | option | C'est une chaine optionnelle. Elle indique la date de création de la banque et sa taille possible de 256 octets, ne devrait jamais dépasser 32. Cette chaine est fournie à des fins de gestion de bibliothèque. Si cette valeur est manquante ou déficient : le champ doit être ignoré. Si le fichier est réécrit et cette valeur manquante, la date courante devrait être indiquée. |
| IENG | chaine | option | Conteient le ou les noms des sound designers ou ingénieurs responsables de la banque.Elle est fournie à des fins de gestion de bibliothèque. Si cette valeur est manquante ou déficient : le champ doit être ignoré. |
| IPRD | chaine | option | Identificateur d'un produit spécifique auquel la banque serait destinée. Ex : un champ de 8 octets représentant "SBAWE32" + un octet nul. Cette valeur est fournie à des fins de gestion de bibliothèque. Si cette valeur est manquante ou déficient : le champ doit être ignoré. |
| ICOP | chaine | option | Indique le type de licence qui règit la banque. Si cette valeur est manquante ou déficient : le champ doit être ignoré, mais la banque ne peut être considèrée comme libre de droit. |
| ICMT | chaine | option | Contient les commentaires associés à la banque. Sa taille peut être de 65.536 octets ou moins. Si cette valeur est manquante ou déficient : le champ doit être ignoré. |
| ISFT | chaine | option | Elle indique l'outil compatible SoundFont le plus récemment utilisé pour créer et modifier la banque. ex "libInstPatch v1.0.0:libInstPatch 1.0.0" : par convention, le nom de l'outil et le numéro de révision sont inclus, la première partie est l'outil de création et la deuxième celui de la modification la plus récente. Les deux chaînes sont séparées par un : . Cette chaine doit être construite par le programme de création (par exemple "libInstPatch v1.0.0:), et chaque fois qu'un outil modifie la banque, il devrait remplacer la deuxième partie par son propre nom et son numéro de révision. Cette chaine est principalement fournie à des fins de traçage d'erreur. Si cette valeur est manquante ou déficient : le champ doit être ignoré. Si le fichier est réécrit et cette valeur absente, le champs doit être créée par l'utilitaire utilisé. |
Le bloc des presets et instruments
pdta| balise | description |
|---|---|
| phdr | |
| pbag | |
| pmod | |
| pgen | |
| inst | |
| ibag | |
| imod | |
| igen | |
| shdr |
Le bloc des articulations
Le bloc LIST des échantillons : sdta
Les échantillons stockés dans la SF2 peuvent être du format 16 bits OU 24 bits, c'est le créateur de la banque qui définit le format de stockage des échantillons suivant le format des fichiers échantillonés à stocker.
Le bloc sdta contient un seul sous-bloc optionnel : SMPL. Celui-ci contient toutes les données de sons 16 bits qui seront placées dans la RAM et reliées à la banque. Sa taille est variable, et contient obligatoirement un nombre paire d'octets. Quant au sous-bloc SM24, si les données stockées sont au format 24 bits, il fait exactement la moitié de la taille du SMPL, plus 1 octet, si nécessaire pour satisfaire l'alignement sur 16 bits (bombre pair d'octets).
Si le bloc sdta est absent, soit il n'y aura pas de sons qui joués, soit la banque fera référence aux échantillons d'une ROM.
Copy to clipboard
struct bloc_sdta{ SMPL;// bloc d échantillon 16 bits SM24;// bloc d échantillons 24 bits };
Le bloc smpl :
S'il est présent, il contient un ou plusieurs «échantillons» de l'information audio numérique sous la forme d'un code linéaire seize bits, signés, little endian (octet le moins significatif en premier). Chaque échantillon est suivie d'un minimum de 46 data_points échantillons égal à 0 qui sont nécessaires pour garantir que vous pourrez faire une boucle sur des données 0 à la fin du son avec toute élévation raisonnable de tonalité en utilisant n'importe quelle interpolation raisonnable.
Le bloc sm24
S'il est présent, il contient les octets les moins significatifs homologues à chacun des data_points contenu dans le bloc SMPL. Notez que cela signifie pour chaque paire d'octets dans le SMPL il y a un complèment de 1 octet dans le SM24.
Ces points de forme d'onde de l'échantillon doivent être combinées avec les points de forme d'onde des échantillons correspondants SMPL, pour créer ensemble un seul pool de données de l'échantillon avec une résolution de 24 bits.
- Si SMPL est absent, et SM24 prèsent il doit être ignoré.
- Si la version ifil du format est inférieur à la version 2.04 la SM24 doit être ignorée.
- Si la taille du SM24 n'est pas exactement égale à la moitié de la taille du chunk SMPL (+ 1 octet dans le cas où 1/2 la taille de chunk SMPL est une valeur impaire), les deux bloc SM24 et SMPL devraient être ignorés.
- Dans tous les cas où le SM24 est ignoré, mais le SMPL accepté, le synthétiseur devrait utiliser uniquement les échantillons contenus dans le SMPL.
L'utilisation des boucles dans les échantillons
Annexe A :
Dans les exemples de codes qui suivent, tous les contrôles de validité ont été éludés pour faciliter la lecture.
Types de données utilisés dans ces exemples :
Copy to clipboard
typedef unsigned char BYTE; // 1 oct 0 à 255 typedef char CHAR; // 1 oct -128 à +127 typedef unsigned int DWORD; // 4 oct 0 à 4.294.967.295 typedef short SHORT; // 2 oct -32.768 à +32.767. typedef unsigned short WORD;// 2 oct 0 à 65.535
exemple 1 : lecture d'un bloc de fichier RIFF.
Copy to clipboard
struct enrg_de_bloc{ DWORD A,B,C;};// taille enrg : 12 octets enteteRIFF donnee; QFile fichierRIFF( "banqueson.sf2" ); fichierRIFF.open( QIODevice::ReadOnly )) int nb_octet_retourne = fichierRIFF.read( (char *) &donnee, 12 ); fichierRIFF.close();
Annexe B :
Décriptage d'un fichier SF2
| contenu (hex) | valeur | description |
|---|---|---|
| 52 49 46 46 | RIFF | valide un fichier de bloc |
| 44 f1 02 00 | taille du bloc fichier (ici 192836 ) = ( taille réelle du fichier (192844) ) - ces 8 premiers octets | |
| 73 66 62 6b | sfbk | balise : type de fichier RIFF : soundfontbank |
| 4c 49 53 54 | LIST | balise : démarre un bloc de donnée |
| da 00 00 00 | taille du bloc INFO ( ici 218 ) | |
| 49 4e 46 4f | INFO | balise : designe le bloc information de la banque |
| 69 66 69 6c | ifil | balise : N° de version de la soundfont SF2 |
| 04 00 00 00 | taille du bloc ifil ( 4 ) | |
| 02 00 01 00 | valeur | donnée de la version SF2 (ici 2.1) |
| 69 73 6e 67 | isng | balise : puce synthétiseur ciblée |
| 08 00 00 00 | taille de la chaine de caractère | |
| 45 4d 55 38 30 30 30 00 | valeur | EMU8000 ( 7 + le 0 terminal = 8) |
| 49 4e 41 4d | INAM | balise : nom de la banque son |
| 12 00 00 00 | taille de la chaine (inclu le 0 terminal s'il existe) | |
| 62 ... 32 00 00 | valeur | banque-essai-sf2 |
| 49 43 52 44 | ICRD | balise : date de création de la banque |
| 0c 00 00 00 | taille de la chaine | |
| 32 ...39 00 00 | valeur | 2013-11-09 |
| 49 45 4e 47 | IENG | |
| 0e 00 00 00 | taille de la chaine | |
| 44 ... 6e 00 | valeur | |
| 49 50 52 44 | IPRD | |
| 0e 00 00 00 | taille de la chaine | |
| 7a ... 74 00 00 | valeur | |
| 49 43 4f 50 | ICOP | |
| 0c 00 00 00 | taille de la chaine | |
| 43 ... 65 00 00 | valeur | |
| 49 43 4d 54 | ICMT | |
| 14 00 00 00 | taille de la chaine | |
| 7a ... 65 00 | valeur | |
| 49 53 46 54 | ISFT | |
| 28 00 00 00 | taille de la chaine | |
| 6c .. 30 00 00 | valeur | |
| 4c 49 53 54 | LIST | |
| c4 ee 02 00 | taille du bloc de l'échantillon | |
| 73 64 74 61 | stda | balise pour les données des échantillons |
| 73 6d 70 6c | smpl | balise pour les échantillons basés sur 16 bits |
| b8 ee 02 00 | taille de l'échantillon | |
| 4c 49 53 54 | LIST | |
| 8a 01 00 00 | taille des instruments | |
| 70 64 74 61 | pdta | |
| 70 68 64 72 | phdr | |
| 4c 00 00 00 | ||
| 50 ... 41 00 | valeur | Preset-inst-note-LA |
| 01 00 | ||
| 16 octets NUL | ||
| 45 4f 50 | EOP | end of preset |
| 20 octets NUL | ||
| 00 01 | ||
| 13 octets NUL | ||
| 70 62 61 67 | pbag | balise : |
| 08 00 00 00 | taille | |
| 00 00 00 00 01 00 00 00 | valeur | |
| 70 6d 6f 64 | pmod | balise : |
| 0a 00 00 00 | taille | |
| 00 00 00 00 00 00 00 00 00 00 |
valeur | |
| 70 67 65 6e | pgen | balise : |
| 08 00 00 00 | taille | |
| 29 00 00 00 00 00 00 00 | valeur | |
| 69 6e 73 74 | inst | balise : |
| 2c 00 00 00 | taille | |
| 49 6e 73 74 2d 6e 6f 74 |
||
| 65 2d 4c 41 00 00 00 00 |
||
| 00 00 00 00 00 00 |
valeur | |
| 45 4f 49 | end of instrument | |
| 17 octets à NUL | ||
| 02 00 | ||
| 69 62 61 67 | ibag | balise : |
| 0c 00 00 00 | taille | |
| 00 00 00 00 01 00 00 00 02 00 00 00 |
valeur | |
| 69 6d 6f 64 | imod | balise : |
| 0a 00 00 00 | taille | |
| 00 00 00 00 00 00 00 00 00 00 |
valeur | |
| 69 67 65 6e | igen | balise : |
| 0c 00 00 00 | taille | |
| 35 00 00 00 35 00 01 00 00 00 00 00 |
valeur | |
| 73 68 64 72 | shdr | balise : |
| 8a 00 00 00 | taille | |
| 4c 41 34 34 30 5f 4c | valeur | LA440_L |
| 4c 41 34 34 30 5f 52 | valeur | LA440_R |
| 45 4f 53 | end of sample |