Chargement...
 
Skip to main content

Historique: SoundFont specification SF2

Aperçu de cette version: 29

 attention
Page en cours d'écriture
ardoisebleue - 25 11 2013



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.
 info

le terme énumérateur peut-être compris dans le sens désignation.
les termes générateur et modulateur peuvent être compris comme terme de paramètrage.

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.
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

[+]

Le bloc des presets et instruments : pdta

[+]

Le bloc LIST des échantillons : sdta

[+]

Les énumérateurs

Les générateurs et modulateur destinataire.

Un générateur et un modulator destinataire sont deux termes signifiant la même chose, un synthétiseur paramètrable. le générateur est utilisé dans avec les listes igen et pgen, et le modulateur destinataire est utilisé dans les listes imod et pmod.
Cinq types d'énumérateurs de générateurs existent :
  • Index Generators : c'est un index de générateur dans une structure de données. il n'y a que deux index générator
    • Instrument
    • sampleID
  • Range Generators : définit une plage où les note-on extérieures à cette zone ne sont pas jouées. Il y a deux range générateur actuellement définis :
    • keyRange :
    • velRange.

  • Substitution Generators
  • Sample Generators
  • Value Generators. (Les modulateur Destinataires font partie de la liste Value Generators).

Range Generator définit une plage de paramètre note-on extérieur à cette zone n'est pas définie. Deux Generators de gamme sont actuellement définis, keyRange et velRange.
Substitution Generators sont des Generators qui remplacent une valeur pour un paramètre de note-on. Deux Generators de substitution sont actuellement définis, overridingKeyNumber et overridingVelocity.
Sample Generators sont des Generators qui affectent directement les propriétés d'un échantillon. Ces Generators ne sont pas définis au level Preset. Les Sample Generators actuellement définis sont les 8 adresses offset des Generators, le Generator sampleMode, le Generator Overriding Root Key et le Generator Exclusive Class .
Value Generators sont des Generators dont la valeur affecte directement un paramètre de traitement du signal. La plupart des Generators sont des value generators .





Paramètres et modèle de synthèse

[+]

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





Liens et commentaires

Historique

Avancé
Information Version
Thu 28 Nov 2013 15:21 ardoisebleue correction texte définition énumérateurs 45
Afficher
Thu 28 Nov 2013 15:15 ardoisebleue 44
Afficher
Thu 28 Nov 2013 15:13 ardoisebleue correction traduction énumérateur 43
Afficher
Thu 28 Nov 2013 14:47 ardoisebleue 42
Afficher
Wed 27 Nov 2013 17:56 ardoisebleue 41
Afficher
Wed 27 Nov 2013 17:03 ardoisebleue 40
Afficher
Wed 27 Nov 2013 14:12 ardoisebleue 39
Afficher
Tue 26 Nov 2013 18:02 ardoisebleue 38
Afficher
Tue 26 Nov 2013 17:41 ardoisebleue 37
Afficher
Tue 26 Nov 2013 17:17 ardoisebleue 36
Afficher
Tue 26 Nov 2013 16:31 ardoisebleue 35
Afficher
Tue 26 Nov 2013 16:00 ardoisebleue correction texte définition énumérateurs 34
Afficher
Tue 26 Nov 2013 15:22 ardoisebleue 33
Afficher
Tue 26 Nov 2013 15:16 ardoisebleue 32
Afficher
Mon 25 Nov 2013 18:28 ardoisebleue définition des énumérateurs 31
Afficher
Mon 25 Nov 2013 17:42 ardoisebleue les énumérateurs 30
Afficher
Mon 25 Nov 2013 17:13 ardoisebleue 29
Afficher
Thu 14 Nov 2013 17:06 ardoisebleue 28
Afficher
Thu 14 Nov 2013 16:25 ardoisebleue 27
Afficher
Thu 14 Nov 2013 15:54 ardoisebleue 26
Afficher
Thu 14 Nov 2013 15:37 ardoisebleue 25
Afficher
Thu 14 Nov 2013 11:33 ardoisebleue 24
Afficher
Thu 14 Nov 2013 11:25 ardoisebleue 23
Afficher
Thu 14 Nov 2013 10:36 ardoisebleue 22
Afficher
Wed 13 Nov 2013 19:07 ardoisebleue 21
Afficher
Wed 13 Nov 2013 18:27 ardoisebleue 20
Afficher
Wed 13 Nov 2013 16:22 utilisateur_anonyme2 Intégration: lire echantillons et cie + titre 19
Afficher
Wed 13 Nov 2013 14:55 ardoisebleue 18
Afficher
Tue 12 Nov 2013 17:44 ardoisebleue fin du paragraphe du bloc pdta 17
Afficher
Tue 12 Nov 2013 17:33 ardoisebleue 16
Afficher
Tue 12 Nov 2013 14:56 ardoisebleue 15
Afficher
Tue 12 Nov 2013 14:43 ardoisebleue 14
Afficher
Tue 12 Nov 2013 11:51 ardoisebleue 13
Afficher
Tue 12 Nov 2013 11:17 ardoisebleue 12
Afficher
Tue 12 Nov 2013 10:28 ardoisebleue 11
Afficher
Tue 12 Nov 2013 10:04 ardoisebleue 10
Afficher
Tue 12 Nov 2013 09:29 ardoisebleue 9
Afficher
Mon 11 Nov 2013 10:59 ardoisebleue parag:bloc sdta _ début parg : pdta 8
Afficher
Mon 11 Nov 2013 10:43 ardoisebleue 7
Afficher
Mon 11 Nov 2013 10:29 ardoisebleue 6
Afficher
Sun 10 Nov 2013 11:39 ardoisebleue 5
Afficher
Sat 09 Nov 2013 17:41 ardoisebleue 4
Afficher
Sat 09 Nov 2013 16:41 ardoisebleue création 3
Afficher
Sat 09 Nov 2013 16:24 ardoisebleue 2
Afficher
Sat 09 Nov 2013 15:07 ardoisebleue 1
Afficher
  • 1
  • 2 (en cours)
  • »