Chargement...
 
Skip to main content

Historique: SoundFont specification SF2

Aperçu de cette version: 52

 attention
Page en cours d'écriture
ardoisebleue - 02 12 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.

Voir terminologie en annexe A.

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, des paramètres de synthétiseurs. 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 pour une structure de données. il y a deux index générator
    • Instrument : définition d'un instrument dans la zone instrument
    • sampleID : definition d'un échantillon dans la zone sample.
  • Range Generators : définit un intervalle où les note-on extérieures à cette zone sont ignorées. Il y a deux générateur actuellement définis :
    • keyRange : la plage de touche qui produiront un son quand elle seront appuyées.
    • velRange : la plage de vélocité (force d'appui sur une touche) dans laquelle la touche produira le son si la force d'appui est dans l'intervalle.
  • Substitution Generators : ce sont des générateurs qui remplacent une valeur pour un note-on. 2 Generateurs sont actuellement définis :
    • overridingKeyNumber
    • overridingVelocity.
  • Sample Generators : ces générateurs affectent directement les propriètés d'un échantillon. Ils ne sont pas définis au niveau du preset.
    • générateur : sampleMode
    • générateur : Overriding Root Key
    • générateur : Exclusive Class .
  • Value Generators : ce sont des générateurs qui affectent directement un paramètres de traitement du signal. La plupart des générateurs font partie de ce type. Les modulateur Destinataires font aussi partie de la liste Value Generators.

Définition des énumatereurs de générateur.

[+]

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.

type de données

[+]

Terminologie utilisée


Structures de données

[+]

Synthétiseur

[+]

Paramètres

[+]

Annexe B


exemples


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();


Décriptage d'un fichier SF2

[+]

Exemple de lecture d'un fichier SF2

[+]

Liens et commentaires

Historique

Avancé
Information Version
Tue 31 Jan 2023 18:12 ardoisebleue ajouter un ancrage blocbalisedhdr 95
Afficher
Tue 24 Jan 2023 09:49 ardoisebleue ajout ancre 94
Afficher
Mon 26 Mar 2018 11:27 ardoisebleue 93
Afficher
Tue 26 mai 2015 16:51 ardoisebleue 92
Afficher
Sat 23 mai 2015 15:19 ardoisebleue 91
Afficher
Sun 10 mai 2015 14:22 ardoisebleue ajout du lien pour la doc en anglais 90
Afficher
Sat 28 Dec 2013 10:25 ardoisebleue 89
Afficher
Sat 28 Dec 2013 10:20 ardoisebleue mise en page 88
Afficher
Sat 28 Dec 2013 10:00 ardoisebleue correction et mise en page 87
Afficher
Sat 28 Dec 2013 09:53 ardoisebleue 86
Afficher
Sat 28 Dec 2013 09:50 ardoisebleue 85
Afficher
Sat 28 Dec 2013 09:46 ardoisebleue 84
Afficher
Wed 18 Dec 2013 19:01 ardoisebleue correction 83
Afficher
Wed 18 Dec 2013 18:58 ardoisebleue 82
Afficher
Wed 18 Dec 2013 18:49 ardoisebleue 81
Afficher
Tue 17 Dec 2013 19:07 ardoisebleue mise en page 80
Afficher
Mon 16 Dec 2013 16:33 ardoisebleue 79
Afficher
Fri 13 Dec 2013 18:11 ardoisebleue correction et mise en page 78
Afficher
Fri 13 Dec 2013 18:09 ardoisebleue 77
Afficher
Fri 13 Dec 2013 18:03 ardoisebleue correction et mise en page 76
Afficher
Fri 13 Dec 2013 17:50 ardoisebleue 75
Afficher
Fri 13 Dec 2013 15:40 ardoisebleue 74
Afficher
Wed 11 Dec 2013 18:26 ardoisebleue correction mise en page 73
Afficher
Mon 09 Dec 2013 18:32 ardoisebleue correction et mise en page 72
Afficher
Fri 06 Dec 2013 18:31 ardoisebleue correction et mise en page 71
Afficher
Fri 06 Dec 2013 17:40 ardoisebleue 70
Afficher
Fri 06 Dec 2013 16:59 ardoisebleue 69
Afficher
Fri 06 Dec 2013 16:37 ardoisebleue 68
Afficher
Fri 06 Dec 2013 16:32 ardoisebleue correction et mises en page 67
Afficher
Fri 06 Dec 2013 16:24 ardoisebleue 66
Afficher
Tue 03 Dec 2013 14:52 ardoisebleue 65
Afficher
Tue 03 Dec 2013 14:37 ardoisebleue 64
Afficher
Tue 03 Dec 2013 14:35 ardoisebleue 63
Afficher
Tue 03 Dec 2013 14:31 ardoisebleue 62
Afficher
Tue 03 Dec 2013 14:30 ardoisebleue 61
Afficher
Tue 03 Dec 2013 14:27 ardoisebleue 60
Afficher
Tue 03 Dec 2013 14:24 ardoisebleue 59
Afficher
Tue 03 Dec 2013 14:18 ardoisebleue 58
Afficher
Tue 03 Dec 2013 14:17 ardoisebleue mise en page décryptage SF2 57
Afficher
Tue 03 Dec 2013 12:02 ardoisebleue 56
Afficher
Tue 03 Dec 2013 11:19 ardoisebleue mise en page du décryptage soundfont 55
Afficher
Tue 03 Dec 2013 10:11 ardoisebleue annotation décryptage fichier SF2 54
Afficher
Tue 03 Dec 2013 09:44 ardoisebleue 53
Afficher
Mon 02 Dec 2013 19:59 ardoisebleue 52
Afficher
Mon 02 Dec 2013 19:55 ardoisebleue mise en forme de l'exemple lecture fichier sf2 51
Afficher
Mon 02 Dec 2013 19:53 ardoisebleue 50
Afficher
Mon 02 Dec 2013 19:40 ardoisebleue 49
Afficher
Thu 28 Nov 2013 15:28 ardoisebleue 48
Afficher
Thu 28 Nov 2013 15:26 ardoisebleue 47
Afficher
Thu 28 Nov 2013 15:22 ardoisebleue 46
Afficher
  • «
  • 1 (en cours)
  • 2