Historique: SoundFont specification SF2
Aperçu de cette version: 65
attention
Page en cours d'écriture
ardoisebleue - 03 12 2013
ardoisebleue - 03 12 2013
Table des matières
- Préambule
- Le format du fichier SF2
- Les énumérateurs
- Paramètres et modèle de synthèse
- Modèle de synthèse
- Oscillateur échantilloneur
- Boucle d'échantillon
- Filtre passe-bas
- Amplificateur de gain final
- Acheminement des Effets
- Oscillateurs basse fréquence LFO
- Générateurs d'enveloppe.
- Résumé de l'interconnexion des modulateurs
- Fonctions MIDI
- Unités des paramètres
- Le modèle de générateur SoundFont
- Le modèle de contrôle de modulateur Soundfont .
- Modèle de synthèse
- Annexe A :
- Annexe B
- Liens et commentaires
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 6 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 soundfont. 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
[+]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
[+]Les données de l'articulation au sein d'un fichier compatible SF2 sont décrites dans neuf sous-blocs obligatoires. La structure a été conçue à des fins d'échange et n'est pas optimisé que ce soit pour une synthèse d'exécution ou une édition on-the-fly. Il est recommandé pour les programmes clients SF2 d'interprèter et écrire cette structure telle qu'elle est décrite dans la spécification.
Bien faire la différence entre le terme preset et instrument : le preset est l'élément utilisé et dont le nom est visible dans les patches par les séquenceurs et synthétiseurs, l'instrument est un élément paramètré, intermédiaire entre le preset et le sample. Un preset est généralement constitué de plusieurs instruments superposés et/ou adjacents, avec des réglages différents, pour générer les notes tout le long du clavier. Un sample, peut-être utilisé par plusieurs instruments réglés différemment pour obtenir des variations dans le jeu du sample.
- balisephdr
- un enregistrement pour chaque Preset.
- un enregistrement final pour être conforme à la structure.
Copy to clipboard
struct sfPresetHeader { CHAR achPresetName[20]; // contient le nom du preset en ASCII WORD wPreset; // numéro de présélection MIDI WORD wBank; // numéro de banque MIDI qui s appliquent à cette présélection WORD wPresetBagNdx; // indice de la liste de zone du préréglage dans le sous-bloc pbag /*Les trois valeurs suivantes sont reservées pour la mise en œuvre future d une fonction de gestion de la bibliothèque de presets ellse doivent exister et être = 0 */ DWORD dwLibrary; DWORD dwGenre; DWORD dwMorphology; };
| nom | description |
|---|---|
| achPresetName | Les caractères du champ ASCII inutilisés doivent être mis à 0. Les noms prédéfinis sont sensibles à la casse. Un nom unique doit toujours être attribué à chaque préréglage dans la banque compatible SoundFont pour permettre l'identification. Toutefois, si une banque en lecture contient des presets avec noms identiques, les presets ne doivent pas être rejetés. Ils doivent être soit conservés comme lisible ou de préférence renommés avec un nom unique. Notez que les préréglages ne sont pas ordonnées au sein de la banque compatible SoundFont. Les Presets doivent disposer d'un ensemble unique de chiffres wPreset et wBank. Toutefois, si deux presets ont des valeurs identiques de wPreset et wBank, la première présélection se produisant dans le bloc PHDR est le preset actif, mais tous les autres avec des valeurs identiques wPreset et wBank seront maintenus afin qu'ils puissent être renumérotés et utilisés ultérieurement. Le cas particulier de banque General MIDI de percussion est traitée de manière classique par une valeur wBank=128. Si la valeur dans un des champs n'est pas une valeur valide de 0 à 127, ou 128 pour wBank, le préréglage ne doit pas être joué mais il doit être maintenu. |
| WpresetBagNdx | Comme la liste de la zone preset est dans le même ordre que la liste d'entête-presets, les Preset bag seront réguliers et croissants suivant l'incrémentation des entête-presets. La taille du bloc pbag en octets sera égal à 4 fois wPresetBagNdx du Preset final + 4. Si les indices de Preset bag sont irréguliers ou si le wPresetBagNdx du Preset final ne correspond pas à la taille du bloc pbag, le fichier est structurellement défectueux et doit être rejeté au moment du chargement. Tous les presets, excepté le Preset final doivent avoir au moins une zone; tout Preset sans zones doit être ignoré. |
Le dernier enregistrement sfPresetHeader ne doit jamais être accessible (ou être lu), et n'existe que pour fournir un wPresetBagNdx final permettant de terminer le nombre de zones du dernier Preset. Toutes les autres valeurs de cet enregistrement final sont mises à 0, à l'exception de achPresetName, qui peut éventuellement être "EOP" indiquant la fin des Presets.
Si le sous-bloc phdr est manquant ou contient moins de deux enregistrements, ou sa taille n'est pas un multiple de 38 octets, le fichier sera rejeté comme structurellement défectueux.
- balisepbag
Copy to clipboard
struct sfPresetBag { WORD wGenNdx; // indice dans la liste de zone presets des générateurs dans le sous-bloc pgen WORD wModNdx; // indice dans la liste des modulateurs dans le sous-bloc pmod. };
La première zone de donnée pour un Preset est située à l'indice wPresetBagNdx du Preset dans la zone de données pbag. Le nombre de zones de ce Preset est déterminé par la différence entre le wPresetBagNdx du Preset en cours et le wPresetBagNdx du Preset suivant.
Comme les listes de génerateurs et modulateurs sont dans le même ordre que les entête-Presets et des listes de zone, les indices wGenNdx et wModNdx seront incrémenter de façon régulière avec l'augmentation des Preset zones. La taille en octets du sous-bloc pmod = 10 fois le wModNdx du Preset final + 10, et la taille du sous-bloc pgen = 4 fois le wGenNdx du Preset final + 4.
Si les indices de Generateur ou modulateur sont irréguliers ou ne correspondent pas à la taille des sous-blocs pgne ou pmod, le fichier est structurellement défectueux et sera rejeté au moment du chargement.
Si un Preset possède plus d'une zone, la première zone peut être une zone globale. Une zone globale est déterminée par le fait que le dernier Generateur dans la liste n'est pas un instrument Generateur.
Toutes les listes de Generateurs doivent contenir au moins un Generateur à une exception près - si une zone globale existe pour lesquelles il n'y a pas de Generateurs, mais seulement des modulateurs.
Les listes modulateur peuvent contenir zéro ou plusieurs modulateurs.
Si une zone autre que la première zone ne possède pas d'instrument Generateur comme dernier Generateur, cette zone doit être ignorée.
Une zone globale sans modulateurs et aucun Generators doit être ignorée.
Si le sous-bloc pbag est manquant ou sa taille n'est pas un multiple de 4 octets, le fichier doit être rejeté comme structurellement défectueux.
- balisepmod
Copy to clipboard
struct sfModList { SFModulator SfModSrcOper; // valeur de l une des énumérations SFModulator SFGenerator sfModDestOper; // indique la destination du modulateur. SHORT modAmount; // valeur signée indiquant le degré auquel la source module la destination. SFModulator sfModAmtSrcOper; // valeur de l une des énumérations SFModulator SFTransform sfModTransOper; // valeur de l une des énumérations SFTransform } ;
Le Preset zone WModNdx pointe vers le premier modulateur pour cette Preset zone, et le nombre de modulateurs présents pour une Preset zone est déterminé par la différence entre la wModNdx de la Preset zone suivante et le wModNdx de la Preset zone en cours. Une différence égale à 0 indique qu'il n'y a pas de modulateurs dans cette Preset zone. Toutes les valeurs des éléments de cette structure sont de 2 octets.
- SfModSrcOper : Cette valeur indique la source de données pour le modulateur. Les valeurs inconnues ou indéfinies seront ignorées. Les Modulateurs avec sfModAmtSrcOper fixés par un «lien» qui n'aboutit pas sont ignorés.
- sfModDestOper : la destination est soit une valeur du type d'énumération SFGenerator , soit un lien vers le sfModSrcOper d'un autre bloc modulateur. Celle-ci est indiquée par le bit haut du champ sfModDestOper, les 15 autres bits désigne la valeur de l'indice du modulateur dont la source doit être la sortie du modulateur en cours par rapport au premier modulateur dans la zone instrument. Les valeurs inconnues ou indéfinies sont ignorées. Des modulateurs avec des liens qui pointent vers un indice modulateur qui dépasse le nombre total de modulateurs pour une zone donnée sont ignorées. Des modulateurs liés qui font partie de liens circulaires sont ignorés.
- modAmount : Une valeur de zéro indique qu'il n'y a pas de modulation fixée.
- sfModAmtSrcOper : Cette valeur qui indique le degré auquel la source module la destination doit être commandé par la source de modulation spécifié. les valeurs inconnues ou indéfinies sont ignorées. Des modulateurs avec sfModAmtSrcOper fixé à un «lien» sont ignorés.
- sfModTransOper : Cette valeur indique qu'une transformée du type spécifié est appliqué à la source de modulation avant l'application sur le modulateur. Les valeurs inconnues ou indéfinies sont ignorées.
Un modulateur est défini par son sfModSrcOper, son sfModDestOper, et son sfModSrcAmtOper. Tous les modulateurs dans une zone doivent disposer d'un ensemble unique de ces trois énumérateurs. Si un second modulateur est rencontré avec les trois mêmes énumérateurs comme un modulateur précédent avec la même zone, le premier modulateur sera ignoré.
Des modulateurs du sous-bloc pmod peuvent être utilisés comme modulateurs additionnels en respectant ceux du sous-bloc imod. En d'autres termes, un modulateur pmod peut augmenter ou diminuer l'action d'un modulateur de imod.
En SoundFont 2.00, aucun modulateurs n'a encore été défini, et le sous-bloc pmod sera toujours composé de 10 octets de valeur 0.
Si le sous-bloc pmod est manquant ou sa taille n'est pas multiple de 10, le fichier doit être rejeté comme structurellement défectueux.
- balisepgen
Copy to clipboard
typedef struct { BYTE byLo, byHi; } rangesType; typedef union { rangesType ranges; SHORT shAmount; WORD wAmount; } genAmountType; struct sfGenList { SFGenerator sfGenOper; // une des valeurs de type énumération SFGenerator genAmountType genAmount; // valeur à attribuer au Generator spécifié };
- sfGenOper
- genAmount
- Certains Générateurs spécifient une plage de numéros de clé MIDI de vélocité MIDI, avec une valeur minimum et maximum.
- D'autres Générateurs spécifient une valeur de mot non signé.
- Mais la plupart des Générateurs, spécifient une valeur WORD 16 bits signé.
Sauf si la zone est une zone globale : le dernier Générateurs de la liste est un « Instrument » Générateurs, dont la valeur est un pointeur vers l'appareil associé à cette zone.
- Si un Générateur de key range existe pour la Preset zone, il est toujours le premier générateur dans la liste pour cette Preset zone.
- Si un Générateur velocity range existe pour la Preset zone, il devra n'être précédé que par un Générateur de « key range ».
- Si des Générateurs suivent un Générateur « instrument », ils seront ignorés.
Les générateurs dans le sous-bloc pgen sont appliqués par rapport aux générateurs dans le sous-bloc igen d'une manière additionnelle. En d'autres termes : les générateurs pgen augmentent ou diminuent la valeur d'un générateur igen.
Si pgen est manquant ou sa taille n'est pas multiple de 4, le fichier doit être rejeté comme structurellement défectueux.
Si un générateur key range est présent mais pas en première position des générateurs, il doit être ignoré.
Si un générateur velocity range est présent, et, est précédé par un générateur autre que key range, il doit être ignoré.
Si une liste non globale ne s'arrête pas par un générateur « instrument », la zone doit être ignorée.
Si la valeur du générateur « instrument » est plus grande ou égale à l'instrument de cloture, le fichier doit être rejeté comme structurellement défectueux.
- baliseinst
Copy to clipboard
struct sfInst { CHAR achInstName[20]; // contient le nom de l instrument exprimé en ASCII WORD wInstBagNdx; // indice de la liste de la zone de l instrument dans ibag };
| nom | description |
|---|---|
| achInstName | Les caractères inutilisés sont mis à 0. Les noms d'instruments sont sensibles à la casse. Un nom unique doit toujours être attribué à chaque instrument dans la banque compatible SoundFont pour permettre l'identification. Toutefois, si à la lecture d'une banque plusieurs noms identiques sont trouvés, les instruments ne doivent pas être rejetés, mais ils doivent être soit conservés comme accessible ou de préférence renommés avec un nom unique. |
| wInstBagNdx | Comme la liste des zones instrument est dans le même ordre que la liste des instruments, les indices wInstBagNdx de instrument bag sera incrémentée régulièrement avec l'accroissement de la liste des instruments. La taille du sous-bloc ibag sera de 4 octets supérieure à 4 fois la valeur du wInstBagNdx de l'enregistrement de cloture (EOI). Si les indices d'instrument sont irréguliers ou si le wInstBagNdx de l'intrument de cloture ne correspond pas à la taille du sous-bloc ibag, le fichier est structurellement défectueux et doit être rejeté au moment du chargement. Tous les instruments, excepté celui de cloture, doivent avoir au moins une zone; Chaque Preset sans zone doit être ignoré. |
L'enregistrement sfInst de cloture ne doit jamais être accessible, et n'existe que pour fournir un wInstBagNdx de fin permettant de déterminer le nombre de zones dans le dernier instrument. Toutes les autres valeurs sont par convention à 0, à l'exception de achInstName, qui devrait être "EOI" indiquant la fin des instruments.
Si le sous-bloc inst est manquant, contient moins de deux enregistrements, ou sa taille n'est pas un multiple de 22 octets, le fichier doit être rejeté comme structurellement défectueux.
Tous les appareils présents dans le sous-bloc inst sont généralement référencés par un Preset zone. Toutefois, un fichier ne contenant que des instruments «orphelins» ne doit pas être rejetée. Des applications compatibles SoundFont pouvant éventuellement ignorer ou de filtrer ces instruments orphelins en fonction des préférences de l'utilisateur.
- baliseibag
Copy to clipboard
struct sfInstBag { WORD wInstGenNdx; // indice de la liste de la zone instrument des générateurs de igen WORD wInstModNdx; // indice de la liste des modulateurs de imod };
La première zone, dans un instrument donné est placée à l'indice wInstBagNdx de cet instrument. Le nombre de zones de l'instrument est déterminée par la différence entre la wInstBagNdx de l'instrument suivant et le wInstBagNdx courant.
Comme les listes de générateurs et les listes de modulateurs sont dans le même ordre que les listes d'instrument et de zone, ces indices wInstBagNdx et wInstModNdx seront de incrémentiel et régulier avec l'accroissement des zones.
La taille du sous-bloc imod = 10 fois le "wModNdx" de l'instrument de cloture + 10 ; Et la taille du sous-bloc igen = 4 fois la valeur du "wGenNdx" de l'instrument de cloture + 4.
Si les indices de générateur ou modulateur sont irréguliers ou ne correspondent pas à la taille de leur igen ou imod respectifs, le fichier est structurellement défectueux et doit être rejeté au moment du chargement.
Si un instrument a plus d'une zone, la première zone peut être une zone globale. Une zone globale est déterminée par le fait que le dernier générateur de la liste n'est pas un générateur sampleID. Toutes les listes de générateurs doivent contenir au moins un générateur à une exception près - si une zone globale existe pour lesquelles il n'y a pas de générateur, mais seulement des modulateurs. Les listes modulateur peut contenir zéro ou plusieurs modulateurs.
Si dans une zone autre que la première zone manque un générateur sampleID comme dernier générateur, cette zone doit être ignorée. Une zone globale sans modulateurs et aucun générateur devrait aussi être ignorée.
Si ibag est manquant ou sa taille n'est pas multiple de 4, le fichier doit être rejeté comme structurellement défectueux.
- baliseimod
Copy to clipboard
struct sfModList { SFModulator sfModSrcOper; // valeur du type d énumérateur SFModulator SFGenerator sfModDestOper; // indique la destination du modulateur. SHORT modAmount; // valeur signée indiquant le degré avec lequel la source module la destination SFModulator sfModAmtSrcOper; // valeur du type d énumérateur SFModulator SFTransform sfModTransOper; // valeur du type d énumérateur SFTransform };
Le WInstModNdx pointe sur le premier modulateur pour cette zone, et le nombre de modulateurs présents pour une zone est déterminée par la différence entre la wInstModNdx de la zone suivante et la wModNdx de la zone courante. Une différence de zéro indique qu'il n'y a pas de modulateurs dans cette zone. Notez que ces énumérations sont de 2 octets
| nom | description |
|---|---|
| sfModSrcOper | Cette valeur indique la source de données pour le modulateur. . Les valeurs inconnues ou indéfinies sont ignorées. Des Modulateurs avec sfModAmtSrcOper fixé à un «lien» qui n'aboutit pas sont ignorés. |
| sfModDestOper | Cette valeur est soit une valeur du type énumérateur SFGenerator, soit un «lien» vers la sfModSrcOper d'un autre bloc modulateur. Cette destination est indiquée par le bit haut du champ de sfModDestOper, les 15 autres bits désignent la valeur de l'indice du modulateur dont la source doit être la sortie du modulateur courant par rapport au premier modulateur dans la zone instrument. Les valeurs inconnues ou indéfinies sont ignorés. Des Modulateurs avec des liens qui pointent vers un indice modulateur qui dépasse le nombre total de modulateurs pour une zone donnée sont ignorées. Des Modulateurs liés par des liens circulaires sont ignorés. |
| modAmount | Une valeur de zéro indique qu'il n'y a pas de valeur fixée. |
| sfModAmtSrcOper | Cette valeur indique avec quel degré de modulation la destination doit être commandée par la source de modulation spécifiée. Les valeurs inconnues ou indéfinies sont ignorées. Des Modulateurs avec sfModAmtSrcOper fixés à un «lien» sont ignorés. |
| sfModTransOper | Cette valeur indique qu'une transformée du type spécifié est appliquée à la source de modulation avant l'application sur le modulateur. Les valeurs inconnues ou indéfinies sont ignorés. |
L'enregistrement de cloture contient par convention 0 dans tous les champs, et est toujours ignoré.
Un modulateur est défini par ses sfModSrcOper, sfModDestOper, et sfModSrcAmtOper. Tous les modulateurs dans une zone doivent disposer d'un ensemble unique de ces trois énumérateurs. Si un second modulateur est rencontré avec les trois mêmes énumérateurs comme modulateur précédent dans cette même zone, le premier modulateur sera ignoré.
Des modulateurs du sous-bloc imod sont absolus, cela signifie qu'un modulateur de imod remplace, plutôt que s'y ajouter, un modulateur par défaut. Toutefois, l'effet d'un modulateur sur un générateur est additif, à savoir la sortie d'un modulateur s'ajoute à une valeur de générateur.
En SoundFont 2.00, aucun modulateurs n'a encore été défini, et le sous-bloc imod sera toujours composé de 10 octets de valeur 0.
Si le sous-bloc imod est manquant ou sa taille n'est pas multiple de 10, le fichier doit être rejeté comme structurellement défectueux.
- baliseigen
Copy to clipboard
structure où les types sont définis comme dans la zone pgen ci-dessus. struct sfInstGenList { SFGenerator sfGenOper; // genAmountType genAmount; // valeur à attribuer au Generator spécifiée };
genAmount peut être de trois formats
- générateurs qui spécifie une plage de numéros de key MIDI, de vélocité MIDI, avec une valeur minimum et maximum.
- générateurs qui spécifie une valeur WORD non signé.
- cependant la plupart des générateurs spécifie une valeur 16 bits signé.
A part le cas où la zone est une zone globale, le dernier générateur de la liste est un générateur sampleID, dont la valeur est un pointeur vers le sample associé à cette zone. Si un générateur "key range" existe pour la zone, il est toujours le premier générateur dans la liste de cette zone. Si un générateur "velocity range" existe pour la zone, il ne sera précédé par un générateur de « key range ». Si des générateurs suivent un générateur sampleID, ils seront ignorés.
Un générateur est défini par sa sfGenOper. Tous les générateurs dans une zone doivent avoir un énumérateur de sfGenOper unique. Si un second générateur est rencontré avec le même agent énumérateur de sfGenOper comme un des générateurs précédent dans la même zone, le premier générateur sera ignoré.
Des générateurs du sous-bloc igen sont de nature absolue. Cela signifie qu'un générateur igen remplace, plutôt que s'ajoute à la valeur par défaut pour le générateur.
Si le sous-bloc igen est manquant ou sa taille n'est pas multiple de 4, le fichier doit être rejeté comme structurellement défectueux. Si un générateur de « key range » est présent et n'est pas le premier générateur, il doit être ignoré. Si un générateur de « velocity key » est présent, et est précédé par un générateur autre qu'un Generator « key range », il doit être ignoré. Si une liste de zone non globale ne s'arrête pas par un générateur sampleID, elle doit être ignorée. Si la valeur du générateur sampleID est supérieure ou égal à l'enregistrement de cloture sampleID, le fichier doit être rejeté comme structurellement défectueux.
- baliseshdr
Copy to clipboard
struct sfSample { CHAR achSampleName[20]; // contient le nom de l échantillon DWORD dwStart; DWORD dwEnd; DWORD dwStartloop; DWORD dwEndloop; DWORD dwSampleRate; BYTE byOriginalPitch; CHAR chPitchCorrection; WORD wSampleLink; SFSampleLink sfSampleType; };
| nom | description |
|---|---|
| achSampleName | Les caractères inutilisés du champ sont mis à la valeur 0. les noms des échantillons sont sensibles à la casse. Un nom unique doit toujours être attribué à chaque échantillon dans la banque compatible SoundFont pour permettre l'identification. Toutefois, si une banque est lue et contient des échantillons avec des noms identiques, les échantillons ne doivent pas être rejetés. Ils doivent être soit conservés comme lisible ou, de préférence, renommés avec un nom unique. |
| dwStart | index, du sample data points, à partir du début du champ de données de l'échantillon vers le premier point de cet échantillon de données. |
| dwEnd | index, du data points , à partir du début du champ de données de l'échantillon à la première de la série de 46 data points zéro qui suivent cet échantillon. |
| dwStartloop | index, du data points , depuis le début du champ de données de l'échantillon vers le premier data points dans la boucle de cet échantillon. |
| dwEndloop | index, du sample data points , depuis le début du champ de données de l'échantillon vers le premier data points de fin de la boucle de cet échantillon. Notez que dwEndloop est le data point "équivalent" au premier data point de boucle, et que pour produire des boucles libres d'articulation portables, les huits data points de proximité entourant à la fois la Startloop et Endloop doivent être identique. |
| dwSampleRate | fréquence d'échantillonnage, en hertz, avec laquelle cet échantillon a été acquis ou dont il a été le plus récemment converti. Des valeurs supérieures à 50000 ou inférieur à 400 peuvent ne pas être reproductible par certaines plates-formes matérielles et doivent être évités. La valeur 0 est illégal. Si une valeur illégale ou douteuse est rencontrée, la valeur pratique la plus proche doit être utilisée. |
| byOriginalPitch | Valeur KEY MIDI du pitch nominal de l'échantillon. Exemple : l'enregistrement d'un instrument qui joue au centre C (261.62 Hz) doit recevoir une valeur de 60. Cette valeur est utilisée comme la touche root par défaut de l'échantillon, de sorte qu'une commande clavier MIDI pour le numéro de note 60 devrait reproduire le son à sa hauteur d'origine. Pour les sons sons indéterminés, une valeur conventionnelle de 255 doit être utilisé. Les valeurs comprises entre 128 et 254 sont illégales. Chaque fois qu'une valeur illégale ou une valeur de 255 est rencontrée, la valeur 60 doit être utilisée. |
| chPitchCorrection | Correction de hauteur en cents qui doit être appliquée pour la lecture de l'échantillon.Le but de ce champ est de compenser les erreurs de pitch intervenues pendant l'enregistrement de l'échantillon. Ex : si le son est trop haut de 4 cents, une correction diminuant de 4 cents est nécessaire; la valeur doit être -4. |
| wSampleLink | Le type d'échantillon lié n'est pas encore pleinement défini dans la spécification SF2, mais devrait définir une liste circulaire d'échantillons liés en utilisant wSampleLink. Notez que cette énumération est de 2 octets. |
| sfSampleType | Une valeur d'énumérateur entre les huit valeurs suivantes : monoSample=1 rightSample =2 leftSample=4 linkedSample=8 RomMonoSample=32769 RomRightSample=32770 RomLeftSample =32772 RomLinkedSample=32776 On peut voir que les valeurs énumérées de sfSampleType sont codées de telle sorte que le bit 15 de la valeur de 16 bits est activé si l'échantillon est dans la ROM, et remis à 0 si elle est incluse dans la banque compatible SoundFont. Les quatre bits LS du WORD sont alors exclusivement mis en indiquant mono, gauche, droite, ou liés. |
dwStart,dwEnd,dwStartloop et dwEndloop doivent avoir une valeur dans l'intervalle du champs de données de l'échantillon inclu dans la banque compatible SoundFont ou référencés dans la ROM. Aussi, pour permettre à une variété de plates-formes matérielles de reproduire ces données, les échantillons auront une longueur minimale de 48 data points, une taille minimale de boucle de 32 data points et un minimum de 8 points valides avant dwStartloop et après dwEndloop. Ainsi dwStart doit être inférieure à dwStartloop-7, dwStartloop doit être inférieure à dwEndloop-31, et dwEndloop doit être inférieure à dwEnd-7. Si ces contraintes ne sont pas remplies, le son peut éventuellement ne pas être lisible si le matériel ne prend pas en charge la lecture sans articulation concernant les paramètres indiqués.
Si le son est donné comme un échantillon de ROM non-valide et le sous-bloc irom est donné, le fichier est structurellement défectueux et doit être rejeté au moment du chargement.
Si sfSampleType indique un échantillon mono, et wSampleLink n'est pas défini, sa valeur doit être zéro, mais sera toutefois ignoré.
Si sfSampleType indique un échantillon gauche ou droite, et wSampleLink est l'indice de ces échantillons inversés. Les deux échantillons doivent être joués entièrement synchrone, avec leur pitch contrôlé par les générateurs de l'échantillon droit.
Tous les générateurs non-pitché devraient s'appliquer comme d'habitude, en particulier le panoramique des échantillons individuelles à gauche et à droite devrait se faire via le générateur pan. Des paires gauche-droite doivent toujours existées dans le même instrument.
Notez également qu'aucun instrument dans lequel il est possible d'activer plus d'une instance d'une paire stéréo particulière ne devrait être conçu.
L'enregistrement de cloture n'est jamais référencé, et est entièrement mis à 0, à l'exception de achSampleName, qui devrait être "EOS" indiquant la fin des échantillons.
Tous les échantillons présents dans le sous-bloc smpl sont généralement référencés par un instrument, mais un fichier contenant des échantillons «orphelins» ne doit pas être rejeté. Des applications compatibles SoundFont pouvant éventuellement ignorer ou filtrer ces orphelins selon les choix de l'utilisateur.
Si le sous-bloc shdr est manquant ou sa taille n'est pas multiple de 46 octets, le fichier doit être rejeté comme structurellement défectueux.
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
Au sein de chaque échantillon, une ou plusieurs paires de points de boucles peuvent exister. Les emplacements de ces points sont définis dans le bloc pdta, mais dans les échantillons, les data_points doivent se conformer à certaines pratiques pour que la boucle soit compatible sur de multiples plateformes.
Les boucles sont définies par des «points équivalents» dans l'échantillon. Cela signifie qu'il y a deux data_points qui sont logiquement équivalents, et une boucle se produit lorsque ces points sont raccordées au sommet d'un autre. En théorie, le point de fin de boucle n'est jamais joué au cours du bouclage ; A la place, le point de départ de la boucle suit le point juste avant le point de fin de boucle. En raison de la nature de bande limitée de l'échantillonnage audio numérique, une boucle sans articulations montrera des données pratiquement identiques autour des points équivalents.
En réalité, à cause des divers algorithmes d'interpolation utilisés par des synthétiseurs d'échantillons, les données entourant à la fois le début de la boucle et les points d'extrémité peuvent affecter le son de la boucle. Ainsi les points à la fois le début et la fin de la boucle doivent être entourés par des données audio en continu. Par exemple : même si le son est programmé pour continuer à boucler pendant le decay, les sample data_points doivent être fournis au-delà du point de fin de boucle. Ces données seront généralement identiques aux données au début de la boucle. Un minimum de 8 points de données valides doivent être présents avant le début de la boucle et après la fin de la boucle.
Ces huit points de données (quatre de chaque côté) entourant les deux points de la boucle équivalentes doivent également être obligatoirement identiques.
En forçant les données à être identiques, tous les algorithmes d'interpolation garantissent la reproduction correcte d'une boucle sans articulations. Voir notions de boucle dans Banque SF2 avec swami pour plus de détails.
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.
[+]Ce qui suit est une liste exhaustive des générateurs de la SoundFont 2.00 et leurs définitions strictes.
Voir Annexe A pour la terminologie des unités utilisées.
| 0 | startAddrsOffset |
| Décalage de datapoint au-delà du datapoint début de l'échantillon pour pointer le premier datapoint à jouer de cet instrument. Ex : si le datapoint début = 7 et startAddrOffset = 2, le premier datapoint d'échantillon joué sera 9. |
|
| 1 | endAddrsOffset |
| Décalage de datapoint en deçà du datapoint de fin de l'échantillon pour pointer le dernier datapoint à jouer de cet instrument. Ex : si le datapoint fin = 17 et endAddrOffset = -2, le dernier datapoint joué sera 15. |
|
| 2 | startloopAddrsOffset |
| Décalage de datapoint dans l'échantillon au-delà de la valeur de STARTLOOP pour pointer le premier datapoint qui sera répété pour reprendre le bouclage de l'instrument. Ex : si Startloop = 10 et startloopAddrsOffset = -1, le départ de la boucle sera au datapoint 9. |
|
| 3 | endloopAddrsOffset |
| Décalage de datapoint au delà de ENDLOOP pour fixer le datapoint considéré comme fin de bouclage et reprendre au début de cette boucle. Ex : si ENDLOOP = 15 et endloopAddrsOffset = 2, le datapoint 17 sera considéré comme équivalent au datapoint STARTLOOP, et donc le datapoint 16 précédera efficacement STARTLOOP pendant le bouclage de l'échantillon. |
|
| 4 | startAddrsCoarseOffset |
| Décalage, par pas de 32768 datapoints au-delà du début de l'échantillon et du décalage startAddrsOffset, pour pointer le premier datapoint à jouer de l'instrument. Ce paramètre est ajoutée au paramètre de startAddrsOffset. Ex : si le début=5, startAddrsOffset=3 et startAddrsCoarseOffset=2, le premier datapoint joué sera le datapoint 65544 (32768*2 + 5 + 3). |
|
| 5 | modLfoToPitch |
| Cest la valeur en cents, pour laquelle la modulation LFO va influencer le pitch. Une valeur positive indique une augmentation LFO du pas, une valeur négative indique une diminution du pas.L'écart est en cents de demi-tons et octaves. Ex : une valeur de 100 indique que le pitch va d'abord augmenter de 1 demi-ton, puis diminuer de 1 demi-ton. |
|
| 6 | vibLfoToPitch |
| Cest la valeur en cents, pour laquelle le Vibrato LFO va influencer le pitch. Une valeur positive augmente, une valeur négative diminue pas. L'écart est en cents de demi-tons et octaves. Ex : une valeur de 100 indique que le pitch va d'abord augmenter de 1 demi-ton, puis diminuer de 1 demi-ton. |
|
| 7 | modEnvToPitch |
| Valeur en cents, pour laquelle l'enveloppe de modulation va influencer le pitch. Une valeur positive indique une augmentation de la hauteur, une valeur négative indique une diminution de la hauteur. L'écart est en cents de demi-tons et octaves. Ex : une valeur de 100 indique que la hauteur augmente de 1 demi-ton au sommet de l'enveloppe. |
|
| 8 | initialFilterFc |
| C'est la coupure et de la fréquence de résonance du filtre passe-bas en unités de cents positifs. Le filtre passe-bas est défini comme secondaire de la paire de pôles de résonance dont la fréquence en Hz est définie par le paramètre Initial Filter Cutoff. Lorsque la fréquence de coupure > 20 kHz et le Q (résonance) du filtre = 0, le filtre n'affecte pas le signal. | |
| 9 | initialFilterQ |
| Valeur en centibels de la hauteur, au-dessus du gain, qui expose la résonance du filtre, à la fréquence de coupure. Une valeur zéro ou négative indique que le filtre n'est pas résonant; le gain à la fréquence de coupure peut être inférieur à zéro quand zéro est spécifié. Le gain du filtre DC est également affectée par ce paramètre de telle sorte que le gain DC est réduit de la moitié du gain spécifié. Ex : pour une valeur de 100, le gain du filtre DC serait 5 dB en dessous du gain unitaire, et la hauteur du pic de résonance serait de 10 dB au-dessus du gain DC, ou au-dessus de 5 dB gain unitaire. On notera également que si initialFilterQ =< 0, t la fréquence de coupure > 20 kHz, alors la réponse du filtre est plat et de gain unitaire. |
|
| 10 | modLfoToFilterFc |
| Valeur en cents pour laquelle la modulation LFO va influencer la fréquence de coupure du filtre. Un nombre positif augmente la fréquence de coupure LFO, un nombre négatif diminue la fréquence de coupure. L'écart est en cents de demi-tons et octaves. Ex : une valeur de 1200 indique que la fréquence de coupure va d'abord augmenter de 1 octave, puis baisser d'une octave. |
|
| 11 | modEnvToFilterFc |
| Valeur en cents, pour laquelle l'enveloppe de modulation va influencer la fréquence de coupure du filtre. Un nombre positif augmente la fréquence de coupure, un nombre négatif la diminue. L'écart est en cents de demi-tons et octaves. Ex : une valeur de 1200 indique que la fréquence de coupure augmente d'une octave à la pointe d'attaque de l'enveloppe. |
|
| 12 | endAddrsCoarseOffset |
| Décalage, par pas de 32768 datapoints au-delà du début de l'échantillon et du décalage endAddrsOffset, pour pointer le dernier datapoint à jouer de l'instrument. Ce paramètre est ajoutée au paramètre de endAddrsOffset. Ex : si la fin=65536, endAddrsOffset=-3 et endAddrsCoarseOffset=-1, le dernier datapoint joué sera le datapoint 32765 (65536 - 32768 - 3). |
|
| 13 | modLfoToVolume |
| Valeur en centibels, pour laquelle la modulation LFO va influencer le volume. Un nombre positif augmente le volume LFO, un nombre négatif diminue ce volume. Ex : une valeur de 100 indique que le volume va d'abord augmenter de 10 dB, puis diminuer de 10 dB. |
|
| 14 | unused1 |
| Utilisé, réservé. Doit être ignoré si rencontré. | |
| 15 | chorusEffectsSend |
| Valeur en unités de 0,1% pour laquelle la sortie audio de la note est envoyée au processeur d'effets de chorus. Une valeur de 0% ou négative indique qu'aucun signal n'est envoyé à partir de cette note ; une valeur égale ou supérieure à 100% indique que la note est envoyée au niveau maximal. Notez que ce paramètre n'a aucun effet sur le niveau de ce signal envoyé à la partie «sèche» ou non transformés de la sortie. Ex : une valeur de 250 indique que le signal est envoyé à 25% du niveau maximal (atténuation de 12 dB du niveau total) pour le processeur d'effets de chorus. |
|
| 16 | reverbEffectsSend |
| Valeur en unités de 0,1% pour laquelle la sortie audio de la note est envoyée au processeur d'effets de réverbération. Une valeur de 0% ou négative indique qu'aucun signal n'est envoyé à partir de cette note ; une valeur égale ou supérieure à 100% indique que la note est envoyée au niveau maximal. Notez que ce paramètre n'a aucun effet sur le niveau de ce signal envoyé à la partie «sèche» ou non transformés de la sortie. Ex : une valeur de 250 indique que le signal est envoyé à 25% du niveau maximal (atténuation de 12 dB du niveau total) pour le processeur d'effets de réverbération. |
|
| 17 | pan |
| Valeur en unités de 0,1% pour positionné la sortie audio de la note entre la sortie gauche et droite. Une valeur <= -50% indique que le signal est envoyé vers la sortie gauche; une valeur >= à +50% indique que la note est envoyée vers la droite. Une valeur de zéro indique un centrage de la note. Ex : une valeur de -250 indique que le signal est envoyé à 75% du niveau maximal vers la gauche et à 25% vers la droite. |
|
| 18 | unused2 |
| Utilisé, réservé. Doit être ignoré si rencontré | |
| 19 | unused3 |
| Utilisé, réservé. Doit être ignoré si rencontré. | |
| 20 | unused4 |
| Utilisé, réservé. Doit être ignoré si rencontré. | |
| 21 | delayModLFO |
| Valeur du delay en unités timecents absolu, à partir du note-on jusqu'au commencement de la montée de la modulation LFO en démarrant à 0. Une valeur de 0 indique un retard de 1 seconde. Une valeur négative indique un retard inférieur à 1 seconde et une valeur positive d'un retard de plus d'une seconde. Le nombre le plus négatif (-32768) indique conventionnellement aucun retard. Ex : un retard de 10 ms serait 1200log2 (.01) = -7973. |
|
| 22 | freqModLFO |
| C'est la fréquence, en cents absolu, de la période triangulaire de la modulation LFO. Une valeur de zéro indique une fréquence de 8.176 Hz. Une valeur négative indique une fréquence inférieure à 8.176 Hz, une valeur positive supérieure à une fréquence de 8.176 Hz. Ex : une fréquence de 10 MHz serait 1200log2 (.01/8.176) = -11610. |
|
| 23 | delayVibLFO |
| Valeur du retard en unités timecents absolu, à partir du note-on jusqu'à ce que le Vibrato LFO soit activé. La valeur 0 indique 1 seconde de retard. Une valeur négative indique un retard inférieur à une seconde, une valeur positive un retard de plus d'une seconde. Le nombre le plus négatif (-32768) indique conventionnellement aucun retard. Ex : un retard de 10 ms serait 1200log2 (.01) = -7973. |
|
| 24 | freqVibLFO |
| C'est la fréquence, en cents absolu, de la période triangulaire du Vibrato LFO. Une valeur de zéro indique une fréquence de 8.176 Hz. Une valeur négative indique une fréquence inférieure à 8.176 Hz, une valeur positive supérieure à une fréquence de 8,176 Hz. Ex : une fréquence de 10 MHz serait 1200log2 (.01/8.176) = -11610. |
|
| 25 | delayModEnv |
| Durée de temporisation, en timecents absolu, entre le note-on et le début de la phase d'attaque de l'enveloppe de modulation. Une valeur 0 indique 1 seconde de retard. Une valeur négative indique un retard inférieur à une seconde, une valeur positive un retard de plus d'une seconde. Le nombre le plus négatif (-32768) indique conventionnellement pas de retard. Ex : un retard de 10 ms serait 1200log2 (.01) = -7973. |
|
| 26 | attackModEnv |
| En timecents absolu, C'est le temps, depuis la fin du delayModEnv jusqu'au point où la valeur de l'enveloppe de modulation atteint son apogée. Notez que l'attaque est «convexe», la courbe est nominalement de telle sorte que lorsqu'il est appliqué à un paramètre de décibels ou demi-ton, le résultat est linéaire en amplitude ou Hz respectivement. Une valeur de 0 indique une 1 seconde de durée d'attaque. Une valeur négative indique un temps inférieur à une seconde, une valeur positive un temps supérieur à une seconde. Le nombre le plus négatif (-32768) indique conventionnellement attaque instantanée. Ex : un temps d'attaque de 10 ms serait 1200log2 (.01) = -7973. |
|
| 27 | holdModEnv |
| C'est le temps, en timecents absolu, à partir de la fin de la phase d'attaque jusqu'à l'entrée en phase de décroissance, au cours de laquelle la valeur de l'enveloppe est maintenue à son apogée. Une valeur de 0 indique une 1 seconde de temps d'attente. Une valeur négative indique un temps inférieur à une seconde, une valeur positive un temps supérieur à une seconde. Le nombre le plus négatif (-32768) indique pas de phase de maintien. Ex : un temps de maintien de 10 ms serait 1200log2 (.01) = -7973. |
|
| 28 | decayModEnv |
| C'est le temps, en timecents absolu, pour une variation de 100% de la valeur de l'enveloppe de modulation pendant la phase de décroissance. La phase de décroissance de l'enveloppe de modulation est linéaire jusqu'au niveau de maintien. Si le niveau de sustain = 0, le temps de decayModEnv devient le temps de décroissance. Une valeur de 0 indique une 1 seconde de temps de décroissance pour un sustain = 0. Une valeur négative indique un temps inférieur à une seconde, une valeur positive un temps supérieur à une seconde. Ex : un temps de décroissance de 10 msec serait 1200log2 (.01) = -7973. |
|
| 29 | sustainModEnv |
| C'est la diminution du niveau, exprimée en unités de 0,1%, pour laquelle l'enveloppe de modulation diminue au cours de la phase de décroissance. Pour l'enveloppe de modulation, le niveau de sustain est exprimé en pourcentage sur la totalité. Parce que le volume du niveau de sustain de l'enveloppe est exprimé comme une atténuation de la totalité, le niveau de sustain est de même exprimée par une diminution sur la totalité. Une valeur de 0 indique que le niveau de sustain est à niveau complet, ce qui implique une durée 0 de la phase de décroissance, indépendamment du temps de décroissance. Une valeur positive indique une décroissance au niveau correspondant. Les valeurs < 0 doivent être interprétés comme 0, les valeurs > 1000 doivent être interprétés comme 1000. Ex : un niveau de soutien qui correspond à une valeur absolue de 40% du pic serait de 600. |
|
| 30 | releaseModEnv |
| C'est la durée, en timecents absolu, pour une variation de 100% de la valeur de l'enveloppe de modulation durant la phase de libération (release). Pour l'enveloppe de modulation, la phase de libération décroît linéairement vers zéro par rapport au niveau actuel. Si le niveau actuel est maximum, la durée de libération sera le temps de la phase de libération jusqu'à ce que la valeur zéro soit atteinte. Une valeur de 0 correspond à une durée de 1 seconde de décroissance pour terminer depuis un niveau complet. Une valeur négative indique un temps inférieur à une seconde, une valeur positive un temps supérieur à une seconde. Ex : un temps de sortie de 10 msec serait 1200log2 (.01) = -7973. |
|
| 31 | keynumToModEnvHold |
| C'est la mesure, en timecents pour une unités de keynumber, où la durée de maintien (hold) de l'enveloppe de modulation est diminuée par l'accroissement du MIDI keynumber. Le temps de maintien à la touche 60 reste invariable. L'unité d'échelle est telle que la valeur 100 donne une durée d'attente d'une octave vers l'aigu provoque une durée de maintien réduite de moitié. Ex : si releaseModEnv = -7973 (10 ms) et le keynumToModEnvHold = 50 quand le keynumber 36 est joué, la durée d'attente sera de 20 msec. |
|
| 32 | keynumToModEnvDecay |
| C'est la mesure, en timecents pour une unités de keynumber, où la durée de décroissance (decay) de l'enveloppe de modulation est diminuée par l'accroissement du MIDI keynumber. Le temps de décroissance à la touche 60 reste invariable. Ex : si releaseModEnv = -7973 (10 ms) et le keynumToModEnvDecay = 50 quand le keynumber 36 est joué, la durée de décroissance sera de 20 msec. |
|
| 33 | delayVolEnv |
| C'est le retard, en timecents absolu, entre note-on et le début de la phase d'attaque de l'enveloppe de volume. Une valeur de 0 indique 1 seconde retard. Une valeur négative indique un retard inférieur à une seconde, une valeur positive un retard de plus d'une seconde. Le nombre le plus négatif (-32768) indique conventionnellement aucun retard. Ex : un retard de 10 ms serait 1200log2 (.01) = -7973. |
|
| 34 | attackVolEnv |
| En timecents absolu, c'est la durée, depuis la fin du délai de l'enveloppe de volume jusqu'au point où la valeur de l'enveloppe de volume atteint son apogée. Une valeur de 0 indique 1 seconde. Une valeur négative indique un temps inférieur à une seconde, une valeur positive un temps supérieur à une seconde. Le nombre le plus négatif (-32768) indique conventionnellement une attaque instantanée. Ex : un temps d'attaque de 10 ms serait 1200log2 (.01) = -7973. |
|
| 35 | holdVolEnv |
| En timecents absolu, c'est le temps entre la fin de l'attaque et l'entrée en décroissance, au cours de laquelle la valeur de l'enveloppe de volume est maintenu à son apogée. Une valeur de 0 indique une 1 seconde. Une valeur négative indique un temps inférieur à une seconde, une valeur positive un temps supérieur à une seconde. Le nombre le plus négatif (-32768) indique aucune phase de maintien. Ex : un temps de maintien de 10 ms serait 1200log2 (.01) = -7973. |
|
| 36 | decayVolEnv |
| C'est le temps, en timecents absolus, pour une variation de 100% de la valeur de l'enveloppe du volume pendant la phase de décroissance. Pour l'enveloppe de volume, la décroissance tend linéairement vers le niveau de maintien, ce qui provoque un changement de dB constant pour chaque unité de temps. Si le niveau de maintien = -100dB, le temps de décroissance de l'enveloppe de volume = temps de la phase de décroissance. Une valeur de 0 indique 1 seconde de temps de décroissance pour un niveau zéro. Une valeur négative indique un temps inférieur à une seconde, une valeur positive un temps supérieur à une seconde. Ex : un temps de décroissance de 10 msec serait 1200log2 (.01) = -7973. |
|
| 37 | sustainVolEnv |
| C'est le taux de la diminution, exprimé en centibels, pour laquelle l'enveloppe de volume décroît au cours de la phase de décroissance. Pour l'enveloppe de volume, le niveau d'atténuation du sustain est mieux exprimé en centibels. Une valeur de 0 indique que le niveau est maximum. Une valeur positive indique une décroissance au niveau correspondant. Les valeurs inférieures à zéro doivent être interprétés comme zéro; conventionnellement 1000 indique une atténuation complète. Ex : un niveau de soutien qui correspond à une valeur absolue de 12 dB en dessous du pic serait 120. |
|
| 38 | releaseVolEnv |
| C'est la durée, en timecents absolu, pour une variation de 100% de la valeur de l'enveloppe du volume pendant la phase de libération (release). Pour l'enveloppe de volume, la phase de libération tend linéairement vers zéro depuis la niveau en cours, ce qui provoque un changement en dB constant pour chaque unité de temps. Si le niveau actuel est maximum, la durée du release de l'enveloppe de volume sera le temps de libération jusqu'à ce que 100 dB d'atténuation soit atteint. Une valeur de 0 indique 1 seconde de temps de décroissance pour finir complètement. Une valeur négative indique un temps inférieur à une seconde, une valeur positive un temps de plus d'une seconde. Ex : un temps de libération de 10 msec serait 1200log2 (.01) = -7973. |
|
| 39 | keynumToVolEnvHold |
| C'est la mesure, en timecents par unités de KeyNumber, pour laquelle la durée de maintien de l'enveloppe de volume est diminué par le nombre croissant de la touche MIDI. La mise en échelle de l'unité est telle que la valeur 100 donne une durée de maintien qui permet de couvrir le clavier ; Une octave vers les aigus provoque une durée de maintien diminuée de moitié. Le temps de maintien de la touche 60 est invariable. Ex : si le holdVolEnv = -7973 (10 ms) et le keynumToVolEnvHold = 50, si le KeyNumber 36 est joué, la durée de maintien sera de 20 msec. |
|
| 40 | keynumToVolEnvDecay |
| C'est la mesure, en timecents par unités de KeyNumber, pour laquelle la durée de décroissance de l'enveloppe de volume est diminué par le nombre croissant de la touche MIDI. La mise en échelle de l'unité est telle que la valeur 100 donne une durée de décroissance qui permet de couvrir le clavier ; Une octave vers les aigus provoque une durée de décroissance diminuée de moitié. Le temps de décroissance de la touche 60 est invariable. Ex : si le holdVolEnv = -7973 (10 ms) et le keynumToVolEnvDecay = 50, si le KeyNumber 36 est joué, la durée de maintien sera de 20 msec. |
|
| 41 | instrument |
| C'est l'index dans le sous-bloc INST fournissant l'instrument qui doit être utilisé pour la 'preset zone en cours. Une valeur de zéro indique le premier instrument de la liste. La valeur ne doit jamais dépasser le nombre de la liste d'instrument - 2. L'énumérateur instrument est le dernier générateur des zones PGEN. En tant que tel, il ne doit apparaître que dans le sous-bloc PGEN, et il doit apparaître comme le dernier énumérateur générateur de tous, sauf dans la zone prédéfinie globale. | |
| 42 | reserved1 |
| Utilisé, réservé. Doit être ignoré si rencontré. | |
| 43 | keyRange |
| Ce sont des valeurs numériques minimale et maximale de touches MIDI pour lesquelles la preset zone ou la instrument zone, sont actives. L'octet LS indique latouche la plus haute et l'octet MS la plus basse. L'énumératuer keyRange est facultatif, mais quand il existe, il doit être le premier générateur de la liste de générateur de la zone. | |
| 44 | velRange |
| Ce sont les valeurs de la vitesse minimale et maximale MIDI pour lesquelles la preset zone ou la instrument zone sont actives. L'octet LS indique la vitesse la plus grande et l'octet MS la plus basse. L'énumérateur velRange est facultatif, mais quand il existe, il ne doit être précédé que par keyRange dans la liste de générateur de la zone. | |
| 45 | startloopAddrsCoarseOffset |
| Décalage par pas de 32768 datapoints au-delà du paramètre Startloop pour redéfinir le début de la boucle pour cet instrument. Ce paramètre est ajouté au paramètre de startloopAddrsOffset. Ex : si Startloop = 5, startloopAddrsOffset = 3 et startAddrsCoarseOffset = 2 : le premier datapoint de la boucle sera 65544 (5+3+2*32768). |
|
| 46 | KeyNum |
| Cet énumérateur force la valeur du numéro de touche MIDI. Ce générateur apparaît uniquement au niveau de instrument. Sa valeurs doit être comprise entre 0 et 127. | |
| 47 | velocity |
| Ce paramètre force la vélocité MIDI. Ce générateur n'apparaît seulement qu'au niveau de instrument. Les valeurs valides sont comprises entre 0 et 127. | |
| 48 | initialAttenuation |
| C'est l'atténuation, en centibels, pour laquelle une note est atténuée en dessous de la valeur maximum prévue. Si = 0, il n'y a aucune atténuation, la note sera jouée au maximum prévu. Ex : 60 indique que la note sera jouée à 6 dB en-dessous du maximum prévu pour la note. |
|
| 49 | reserved2 |
| Utilisé, réservé. Doit être ignoré si rencontré. | |
| 50 | endloopAddrsCoarseOffset |
| Décalage par pas de 32768 datapoints au-delà du paramètre Endloop pour redéfinir la fin de la boucle qui doit être considéré comme un datapoint de valeur équivalente au datapoint Startloop pour cet instrument. Ce paramètre est ajouté au paramètre de endloopAddrsOffset. Ex : si Startloop = 5, endloopAddrsOffset = 3 et endAddrsCoarseOffset = 2 : le datapoint en 65544 (5+3+2*32768) sera considéré comme équivalent au datapoint Startloop et donc, le datapoint 65543 précédera le datapoint Startloop pour le reprise de la boucle. |
|
| 51 | coarseTune |
| Décalage de la hauteur en demi-tons, qui sera appliqué à la note. Une valeur positive indique que le son est reproduit à une hauteur plus élevée, une valeur négative indique une hauteur inférieure. Ex : une valeur Coarse = -4 provoquera un son joué quatre demi-tons plus bas. |
|
| 52 | Finetune |
| Décalage de la hauteur, en cents, qui sera appliqué à la note. Il est additionnel à coarseTune. Une valeur positive indique que le son est reproduit à une hauteur plus élevée, une valeur négative indique une hauteur inférieure. Ex : une valeur finetune = -5 provoquera un son joué cinq cents plus bas. |
|
| 53 | sampleID |
| C'est l'index dans le sous-bloc SHDR pour accèder à l'échantillon utilisé dans la zone en cours. La valeur 0 pointe sur le premier échantillon de la liste. La valeur ne doit jamais dépasser le nombre d'échantillons-2. L'énumérateur sampleID est le dernier générateur de la zone IGEN. En tant que tel, il ne doit apparaître que dans le sous-bloc IGEN, et doit être le dernier générateur énuméré, sauf dans la zone globale. | |
| 54 | sampleModes |
| Cet énumérateur indique une valeur constituée de drapeaux booléens décrivant l'échantillon de la zone en cours. Le sampleMode n'existe que dans le sous-bloc IGEN, et ne devraient pas apparaître dans la zone globale. Les deux bits LS indiquent le type de boucle dans l'échantillon : - 0 : indique un son reproduit sans boucle - 1 : indique un son qui tourne en boucle - 2 : est inutilisé : il indique l'absence de boucle - 3 : indique un son dont la boucle au moment de la durée du note-off lit le reste de l'échantillon. |
|
| 55 | Reserved3 |
| Utilisé, réservé. Doit être ignoré si rencontré. | |
| 56 | scaleTuning |
| Ce paramètre représente la mesure par laquelle le keyNumber MIDI influe sur le pitch. Une valeur à 0 ne provoque aucun effet sur la hauteur; Une valeur 100 représente la gamme de demi-ton temporisé habituelle. | |
| 57 | exclusiveClass |
| Ce paramètre donne la possibilité à une note-on pour un instrument donné de finir le jeu des autres instruments. C'est particulièrement utile aux instruments de percussion comme la cymbale hit-hat. La valeur 0 ne provoque aucun effet. Toute autre valeur indique que, lorsque cette note est lancée, toute les autres note en cours d'exécution avec la même valeur de classe seront instantanément stoppées. Le générateur exclusiveClass ne doit figuré qu'au niveau instrument. La portée de exclusiveClass est le preset. En d'autres termes, une autre zone instrument dans le même preset contenant un exclusiveClass correspondant sera stoppé. | |
| 58 | overridingRootKey |
| Ce paramètre représente le keyNumber MIDI pour lequel l'échantillon doit être lu à sa fréquence d'échantillonnage d'origine. S'il est absent ou = -1, alors l'échantillon overridingRootKey est utilisé à sa place. S'il est présent dans l'intervalle 0 à 127, le keyNumber indiqué démarrera la partie début de l'échantillon qui doit être lue. Ex : si l'échantillon est un enregistrement de note C de piano (en touche centrale = 60) avec une fréquence d'échantillonnage de 22,050 kHz, et Root Key = 69 ; L'appui de la touche MIDI 69 (le C au dessus du mileu) provoquera le son d'une note de piano de pitch de milieu C (touche centrale). |
|
| 59 | unused5 |
| Utilisé, réservé. Doit être ignoré si rencontré. | |
| 60 | endOper |
| Utilisé, réservé. Doit être ignoré si rencontré. Nom unique indique la fin d'une liste définie. |
Paramètres et modèle de synthèse
[+]La norme SoundFont2 a été créé avec l'intention de fournir un soutien à une base croissante de modèles de synthètiseur basé sur l'échantillonage. Le modèle utilisé par la spécification SoundFont2 est produit par la puce EMU8000. La description qui suit du modèle de synthèse sous-jacent et des paramètres associés sont prévus pour permettre de greffer ce modèle de synthèse sur d'autres plates-formes matérielles.
Modèle de synthèse
La spécification du modèle de synthèse comprend un oscillateur-échantilloneur, un filtre passe-bas dynamique, un amplificateur d'enveloppe, une sortie paramètrable stéréophonique, et des unités d'effets de chorus et réverbération. Un moteur à modulation sous-jacent comprend deux oscillateurs basse fréquence (LFO) et les deux générateurs d'enveloppe avec leurs amplificateurs d'acheminement appropriés.Oscillateur échantilloneur
Le modèle de l'oscillateur échantilloneur SF2 est capable de jouer un sample à un taux d'échantillonnage quelconque avec un pitch-shift quelconque.Dans la pratique, l'élévation du pitch sera limité à une valeur maximale d'au moins deux octaves.
Le pitch est décrit en termes d'un pitch initial qui est basé sur :
- le taux d'échantillonage
- la root key' (touche de base) sur laquelle l'échantillon est calé sur le clavier
- les coarse, fine, et correction tuning.
- la touche key number MIDI effective,
- le facteur d'échelle du clavier.
Boucle d'échantillon
L'oscillateur joue un échantillon numérique qui est décrit par un point de départ, point final, et deux points décrivant une loop. Le son peut être marquée comme non-bouclé (unlooped), dans ce cas, les points de boucle sont ignorés.Si le son est bouclé, il peut être lu de deux façons.
- boucle "during release " : le son est joué à partir du point de départ de la boucle, et bouclé jusqu'à ce que la note devienne inaudible.
- le son est joué à partir du point de départ de la boucle, et bouclé jusqu'à ce que la touche soit relâchée ; Dans ce cas, si le point de fin de boucle n'est pas atteint au relachement, le son se poursuit jusqu'au le point de fin de boucle et joue jusqu'à ce que le point final soit atteint pour terminer le son.
Filtre passe-bas
Toutes les modulations de fréquence de coupure sont en octaves, demi-tons, et en cents.
Amplificateur de gain final
L'amplificateur final de gain agit sur la sortie du filtre, il est ajouté à l'enveloppe de volume. Une modulation supplémentaire peut également être ajouté. Le gain est toujours spécifié en dB.
Acheminement des Effets
La sortie del'amplificateur de gain final peut être acheminé vers l'unité d'effets. Cette unité implique que le son soit dans un contexte stéréo, et qu'un effet de réverbération et de chorus puissent être ajoutés. Le panoramique est spécifiée en termes de pourcentage de gauche et de droite, qui pourrait également être considéré comme un angle d'azimut. Les valeurs de réverbération et chorus sont exprimées en pourcentage appliqués sur l'amplitude du signal reçu par ces unités de 0% à 100%.
Oscillateurs basse fréquence LFO
Le modèle de synthèse prévoit deux oscillateurs basse fréquence (LFO) pour moduler le pitch, filtre cutoff, et l'amplitude.
- Le vibrato LFO qui module le pitch.
- La modulation LFO qui module l'un de ces trois paramètres.
Chaque paramètre peut être modulé de diverses valeurs, quelles soient positives ou négatives, par le LFO associé. Les modulations de pitch et cutoff sont en octaves, demi-tons, et en cents, tandis que les modulations d'amplitude sont en dB. La valeur de modulation LFO est exprimé en cents ou dB positif pour la totalité de la montée.
Générateurs d'enveloppe.
Le modèle de synthèse prévoit deux générateurs d'enveloppe :
- Le générateur d'enveloppe de volume qui contrôle l'amplificateur final de gain et par conséquent détermine le contour de volume du son.
- La modulation d'enveloppe qui peut contrôler le pitch et/ou le filtre cutoff.
- une période de retard commence au cours de laquelle la valeur d'enveloppe est égale à zéro.
- L'enveloppe s'élève alors en une courbe convexe par rapport à une valeur 1 au cours de la phase d'attaque.
- Lorsque la valeur 1 est atteinte, l'enveloppe entre dans une phase de maintien au cours de laquelle elle reste à 1.
- Lorsque la phase d'attente se termine, l'enveloppe entre dans une phase de décroissance au cours de laquelle sa valeur diminue de manière linéaire à un niveau de maintien.
- Lorsque le niveau de maintien est atteint, l'enveloppe entre en soutien de la phase au cours de laquelle l'enveloppe reste au niveau de maintien.
Les modulation de pitch et de filtre cutoff sont en octaves, demi-tons, et en cents. Ces paramètres peuvent être modulés à des degrés divers en positif ou négatif, par l'enveloppe de modulation. Le degré de modulation est exprimé en cents pour la totalité de l'échelle du pic d'attaque.
L'enveloppe de volume fonctionne en dB, avec un pic d'attaque fournissant une sortie à pleine échelle, adapté de manière appropriée par le volume initial. La valeur zéro, cependant, est en fait un gain nul. La mise en œuvre du EMU8000 prévoit 96 dB de commande d'amplitude. Lorsque 96 dB d'atténuation est atteint dans le dernier amplificateur de gain, un saut brusque à zéro le gain (dB d'atténuation infinie) se produit. Dans un système 16-bit, ce saut est inaudible.
Résumé de l'interconnexion des modulateurs
Fonctions MIDI
[+]La réponse à certaines commandes MIDI est définie dans la norme MIDI, et n'est donc pas considérée comme faisant partie de la spécification SF2. Ces commandes MIDI ne peuvent pas être utilisés comme sources pour la mise en œuvre de modulateur.
Par souci d'exhaustivité, des réponses sont donnés ici pour la spécification version 2.00b :
- Pitch key number MIDI : dans la version 2.00a de cette spécification, c'est le paramètre "Scale Tune" dans la liste de générateur, est également considéré comme un véritable modulateur et est donc retiré de cette liste.
- MIDI Pitch Bend : dans la version 2.00a de cette spécification, il est considéré comme un véritable modulateur et est donc éliminé de cette liste.
| code MIDI | libellé description | |
|---|---|---|
| 0 | Bank Select | Le changement de programme suivant devrait sélectionner le programme MIDI de cette valeur de la banque à la place de la banque par défaut de 0. |
| 6 | Data Entry MSB | La valeur récetionnée doit être envoyée soit au RPN ou NRPN selon le mode de saisie de données. |
| 32 | Bank Select LSB | Peut se comporter en conjonction avec le code 0 Bank select pour fournir un total de 16384 programme de banques MIDI possibles. |
| 38 | données Entry LSB | Après réception, la valeur doit être envoyée soit au RPN ou NRPN en fonction du mode de saisie de données. |
| 64 | Sustain | Actif lorsque supérieur ou égal à 64. Lorsque la fonction de sustain est activée, toutes les notes persistent même si un key-off est envoyé. Les commandes key-off sont stockées, et lorsque le sustain devient inactif, toutes les commandes key-off stockées sont exécutées. |
| 66 | soft | Actif lorsque supérieur ou égal à 64. Lorsqu'il est activé, toutes les key-on sont modulées de manière à rendre le son de la note plus doux. Touchant l'atténuation initiale et le filtre de coupure. |
| 67 | Sostenuto | Actif lorsque supérieur ou égal à 64. Quand il devient actif, toutes les key-on persistent dans leur état jusqu'à ce que le sostenuto deviennent inactif. Toutes les autres notes se comportent normalement. Notez que le maintien par sostenuto de key-on persiste même si un sustain est activé puis éteint, pendant sa durée. |
| 98 | NRPN LSB | A sa réception, le synthétiseur devrait se mettre en mode de saisie de données et les valeurs, traitées par le NRPN. |
| 99 | NRPN MSB | A sa réception, le synthétiseur devrait se mettre en mode de saisie de données et les valeurs, traitées par le NRPN. |
| 100 | RPN LSB | A sa réception, le synthétiseur devrait se mettre en mode de saisie de données et les valeurs, traitées par le RPN. |
| 101 | RPN MSB | A sa réception, le synthétiseur devrait se mettre en mode de saisie de données et les valeurs, traitées par le RPN. |
| 120 | All Sound Off | A la réception de cette valeur : toutes les notes en cours doivent s'arrêter, quelles que soient les positions sustain ou sostenuto. |
| 121 | Reset All Controllers | Agit tel que défini par la norme MIDI. Ce code réinitialise les valeurs des contrôleurs MIDI à l'état par défaut ou à leur valeur initiale. |
| 123 | All Notes Off | A la réception de cette valeur : toutes les notes key-on en cours entre immédiatement dans la phase de release, en tenant compte de leur statut de sustain ou sostenuto. |
Unités des paramètres
[+]Les unités avec lesquelles les générateurs SoundFont sont décrits sont tous bien définis. Les définitions strictes apparaissent ci-dessous:
| ABSOLUTE SAMPLE DATA POINTS | un index numérique de 16 bits type du data points de l'échantillon tel qu'il est stocké dans la mémoire ROM ou fournie dans le smpl. |
| RELATIVE SAMPLE DATA POINTS | un déplacement de 16 bits basé sur une référence en data point absolu. Une valeur négative indique déplacement vers le début des données. |
| ABSOLUTE SEMITONES | Demi-tons absolu : une mesure logarithmique absolue de fréquence basée sur une référence de MIDI key number. Un demi-ton est 1/12 d'une octave, et la valeur 69 est de 440 Hz (A-440). Les valeurs négatives et des valeurs supérieures à 127 sont autorisées. |
| RELATIVE SEMITONES | Une mesure logarithmique relative du taux de fréquence basée sur les unités de 1/12 d'octave, qui est la racine douzième de deux, environ 1,059463094. |
| ABSOLUTE CENTS | une mesure logarithmique absolue de fréquence basée sur une référence de MIDI key number échelonnée jusque 100. Un cent est de 1/1200 sur une octave, et la valeur 6900 est de 440 Hz (A-440). Les valeurs négatives et des valeurs supérieures à 12700 sont autorisés. |
| RELATIVE CENTS | Une mesure logarithmique relative du taux de fréquence basé sur des unités de 1/1200 sur une octave, qui est la racine douze centièmes de deux, environ 1,000577790. |
| ABSOLUTE CENTIBELS | une mesure absolue de l'atténuation d'un signal, basé sur une référence à zéro sans atténuation. Un centibel est un dixième de décibel, ou un rapport de l'amplitude du signal de la racine deux centième de 10, approximativement 1,011579454. |
| RELATIVE CENTIBELS | une mesure relative de l'atténuation d'un signal. Un centibel est un dixième de décibel, ou un rapport de l'amplitude du signal de la racine deux centième de 10, approximativement 1,011579454. |
| ABSOLUTE TIMECENTS | Une mesure absolue de temps, basé sur une référence de zéro et représentant une seconde. Un timecent représente un ratio dans le temps de la racine douze centième de deux, environ 1,011579454. |
| RELATIVE TIMECENTS | Une mesure relative du ratio de temps, basée sur la taille de l'unité de ma racine douze centième de deux, environ 1,011579454. |
| ABSOLUTE PERCENT | Une mesure absolue du gain, basé sur une référence de l'unité. En SF2, elle est donnée en unités de 0,1%, donc une valeur de zéro est 0% et une valeur de 1000 donne 100%. |
| RELATIVE PERCENT | Pourcentage relatif, une mesure relative de la différence de gain. En SF2, elle est donnée en unités de 0,1%. Lorsque le gain devient négatif, il est supposé = 0; lorsque le gain est supérieur à 100%, la valeur 100% est utilisée. |
Le modèle de générateur SoundFont
Cinq types d'énumérateur de générateurs existent:
- Index Generators
- Range Generators
- Substitution Generators
- Sample Generators
- Value Generators.
- Un ensemble de générateurs ou de compensateurs de la valeur d'une destination ou d'un paramètre de synthèse. Dans des cas exceptionnels : il définit les plages (Range Generators), ou fixe des valeurs et jamais de valeurs de décalages (Index Generators, Sample Generators, et Substitution Generators).
- Un générateur est défini comme étant identique à un autre générateur si son opérateur générateur est le même dans les deux générateurs.
- Un générateur dans une global instrument zone qui est identique au générateur par défaut remplace le générateur par défaut.
- Un générateur dans une locale instrument zone qui est un générateur par défaut ou identique à un générateur dans une global instrument zone remplace ce générateur.
- Un générateur du niveau Preset s'ajoute à un générateur du niveau Instrument si les deux générateurs sont identiques.
- Un générateur dans une global Preset Zone" qui est un générateur par défaut ou identique à un générateur dans instrument'' s'ajoute à ce générateur.
- Un générateur dans une global Preset Zone qui n'est pas identique à un Value Generators par défaut et n'est pas identique à un générateur dans instrument ajoute son effet au paramètre de synthèse proposé.
- Un générateur dans une locale Preset Zone qui est identique à un générateur dans une global Preset Zone remplace le générateur de la global Preset Zone. Ce générateur ajoute ses effets au nœud de sommation-destination de toutes les zones de l'instrument donné.
- Un générateur dans une locale Preset Zone qui n'est pas identique à un générateur par défaut ou à un générateur global Preset Zone, ajoute ses effets au noeud de sommation-destination de toutes les zones de l'instrument donné.
- Si le générateur en opération est un Range Generator , les valeurs du générateur ne sont pas ajoutés à ceux du niveau instrument ; Ils servent plutôt comme un filtre intersection aux key number ou velocity ranges dans l'instrument qui est utilisé dans la Preset Zone.
- Si le générateur en opération est un Substitution Generator ou un Sample Generator , ils sont illégaux au niveau Preset. Le seul Index Generator légal à ce niveau est instrumentID, alors que le seul Index Generator légal au niveau Instrument est sampleID.
Le modèle de contrôle de modulateur Soundfont .
Les Modulateurs SoundFont sont utilisés pour permettre le contrôle en temps réel sur le son suivant le concepteur du son programmé. Chaque instance d'une structure de modulateur SoundFont définit un effet en temps réel additionnable à appliquer à une destination donnée ou un paramètre de synthétiseur.
Théorie sur les opérations du modèle de Contrôle.
Le modèle de commande de modulateur SoundFont est un mécanisme polyvalent destiné à permettre un contrôle souple et complexe en temps réel sur les paramètres de synthèse fournis. Alors que SoundFont 2.00 fournit un mécanisme pour fixer les conditions initiales pour une grande variété de paramètres de synthèse ou des générateurs à plusieurs niveaux de la hiérarchie (niveau de l'instrument, les zones global/local, Preset etc...), l'ajout du contrôleur de modulateur SoundFont fournit un mécanisme pour permettre en temps réel de contrôler ces mêmes paramètres sur les mêmes niveaux de la hiérarchie.
Le modèle de commande de modulateur SoundFont est nécessaire pour transformer le modèle de synthèse à base de générateur plutôt simpliste dans un modèle de synthèse plus complexe et beaucoup plus intéressant. Le schéma montre la fonction générale du modèle de contrôleur SoundFont :
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
[+]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
Terminologie utilisée
Structures de données
[+]| nom | description |
|---|---|
| bag | Un élément de structure de données SoundFont contenant une liste de zones presets ou des zones d'instruments |
| global zone globale | une zone dont les générateurs et modulateurs affectent toutes les autres zones à l'intérieur de l'objet. |
| instrument | Dans la norme SoundFont, une collection de zones qui représente le son d'un instrument de musique unique ou réglage d'effet sonore. |
| instrument zone | Le sous-ensemble d'un instrument contenant une référence au sample et les données de articulation associées, définies pour jouer sur certaines touches et leur vitesse. |
| orphan | Il s'agit d'un instrument qui n'est pas référencé par une preset zone, ou un échantillon qui n'est pas référencée par un "instrument zone". |
| preset | La collecte des échantillons et des données d'articulation, associée à un Numéro de présélection MIDI particulier . |
| preset zone | Le sous-ensemble d'un preset contenant une référence à un instrument et les données d'articulation associées, définis pour jouer certaines touches avec leur vélocité. |
| zone | Un objet et des données d'articulation associées, définis pour jouer certaines touches avec leur vélocité. |
Synthétiseur
[+]| nom | description |
|---|---|
| articulation | Le processus de modulation d'amplitude, hauteur et timbre pour produire une note musicale expressive. |
| artefact | Un (généralement indésirable) événement sonore qui est reconnaissable comme n'étant pas présent dans le son original. |
| attack | Phase, d'une enveloppe ou d'un son, au cours de laquelle l'amplitude augmente de zéro à une valeur de crête. |
| attenuation | Une diminution du volume ou de l'amplitude d'un signal. |
| balance | Une forme de commande de volume stéréo dans les canaux gauche et droit sont au maximum lorsque le contrôle est centré, et qui atténue uniquement le canal opposé lorsqu'il est pris à deux extrêmes. |
| chorus | Un algorithme de traitement d'effets qui implique le déplacement cyclique de la hauteur d'un signal et le remixage avec elle-même pour produire un temps variant de filtre en peigne, donnant une impression de mouvement et la plénitude du son qui en résulte. |
| cutoff | La fréquence d'une fonction de filtrage à l'atténuation qui atteint une valeur spécifiée. |
| datapoints | points de données : les valeurs individuelles formant un échantillon. Parfois aussi appelés points d'échantillonnage. |
| decay | La partie d'une enveloppe ou son pendant laquelle l'amplitude diminue d'une valeur crête à l'état d'équilibre. |
| delay | retard : La partie d'une enveloppe ou d'une fonction LFO qui s'écoule d'un key-on (appui d'une touche) jusqu'à ce que l'amplitude différe de zéro. |
| DC gain | Degré d'amplification ou d'atténuation d'un système présente une fréquence, un signal statique ou zéro. |
| audio numérique | signal audio représenté comme une séquence de valeurs quantifiées régulièrement espacées dans le temps. Les valeurs sont appelées «sample data points». |
| enveloppe | Un signal variable dans le temps qui commande généralement la hauteur, le volume et/ou la fréquence de coupure du filtre d'une note, et comprend plusieurs phases incluant Attack, Decay, Sustain, puis release. |
| interpolateur | Un circuit ou un algorithme qui calcule les points intermédiaires entre les points de données échantillons existants. Il s'agit de utilisation particulière dans l'opération de pitch shifting d'un synthétiseur à table d'onde, dans lequel ces points intermédiaires représentent les échantillons de sortie de la forme d'onde à la transposition de la hauteur souhaitée. |
| LFO | Acronyme pour Low Frequency Oscillator. Une source de modulation périodique lente. |
| Loop | boucle : une partie d'un échantillon qui est répété plusieurs fois pour augmenter la durée du son résultant. |
| loop points | points de boucle : les datapoints de l'échantillons au cours de laquelle une boucle commence et finit. |
| note-on | (key-on) MIDI : début de la séquence d'appui sur une touche. |
| note-off | (key-off) MIDI : fin de la séquence d'appui de la touche. |
| pôle | Un terme mathématique utilisé dans le filtre d'analyse de transformation. Traditionnellement, en synthèse, un pôle est assimilée à une atténuation de 6dB par octave, et l'atténuation d'un filtre est spécifié en "pôle". |
| preset | Collecte des échantillons et des données d'articulation associé à un numéro particulier de présélection MIDI. |
| release | La partie d'une enveloppe ou son, pendant laquelle l'amplitude diminue à partir d'un état d'équilibre vers la valeur zéro. |
| résonance | décrit l'aspect d'un filtre dans lequel les fréquences particulières sont données avec beaucoup plus de gain que les autres. La résonance peut être mesurée en dB au-dessus du gain DC. |
| fréquence de résonance | La fréquence à laquelle la résonance atteint son maximum. |
| réverb | raccourci pour réverbération. En synthèse, un processus de signal synthétique qui ajoute l'espace artificiel et l'ambiance pour un son. |
| sample | échantillon : Ce terme est souvent utilisé à la fois pour indiquer un "sample data points" et pour indiquer une collection de tels points comprenant une forme d'onde audio numérique. Ce dernier sens est exclusivement utilisé dans cette spécification. |
| unpitched | Se dit d'un son qui n'est pas caractérisé par une fréquence perçue. |
| velocity | vitesse : En synthèse, la rapidité avec laquelle une touche du clavier est enfoncée, généralement proportionnelle à l'impact donné par le musicien. |
| wavetable | table d'onde : Une technique de synthèse de la musique où les sons musicaux sont enregistrés ou calculée mathématiquement et stockée dans un mémoire, puis lues à un taux variable afin de produire la hauteur désirée. Ajustements de timbre supplémentaires sont souvent faites pour le son ainsi produit en utilisant des amplificateurs, les filtres et le traitement des effets tels que la réverbération et de chorus. |
Paramètres
[+]| nom | description |
|---|---|
| absolu | Décrit un paramètre qui donne une valeur définitive. Contrairement au relatif. |
| Additif | décrit un paramètre qui doit être numériquement ajouté à un autre paramètre. |
| atténuation | Une diminution du volume ou de l'amplitude d'un signal. |
| bipolaire | se dit d'un dispositif de commande qui a une valeur minimum de -1 et une valeur maximale de +1. |
| cent | Unité de rapport de pas correspondant à la racine douze centièmes de deux, ou un centième de demi-ton, environ 1,000577790. |
| centibel | Unité de rapport d'amplitude correspondant à la racine deux centième de dix, soit un dixième de décibel, environ 1,011579454. |
| cutoff | fréquence de coupure : la fréquence d'une fonction de filtrage à l'atténuation qui atteint une valeur spécifiée. |
| décibel | Unité de rapport d'amplitude correspondant à la racine vingtième de dix, environ 1,122018454. |
| octave | un facteur de deux dans un rapport, généralement appliquée à la hauteur ou la fréquence. |
| pitch | Valeur audible de la fréquence. Peut être utilisé de façon interchangeable avec la fréquence. |
| Pitch Shift | Un changement de pitch. La Synthèse à échantillon repose sur des interpolations de pitch dans un échantillon pour produire les notes de la gamme. |
| relatif | Décrit un paramètre qui indique simplement une valeur de décalage d'une valeur déjà établie. Contraire de absolu. |
| fréquence d'échantillonnage | La fréquence, en Hertz, où les datapoints d'échantillons sont prélevés lors de l'enregistrement d'un échantillon. |
| demi-ton | Unité de rapport de pas correspondant à la racine douzième de deux, ou un douzième d'une octave, environ 1,059463094. |
| Sharp | Se dit d'un ton qui est plus aigu en tonalité qu'un autre de même référence. |
| timecent | Unité de ratio de durée correspondant à la période de douze racine centième de deux, ou de douze centième d'une octave, environ 1,000577790. |
| unipolaire | Se dit d'un contrôleur qui a une valeur minimale de 0 et une valeur maximale de +1. Contraire de «bipolaire» |
Annexe B
exemples
lecture d'un bloc de fichier RIFF.
[+]Copy to clipboard
struct enrg_de_bloc{ DWORD A,B,C;};// taille enrg : 12 octets enrg_de_bloc donnee; QFile fichierRIFF( "banqueson.sf2" ); fichierRIFF.open( QIODevice::ReadOnly ); int nb_octet_retourne = fichierRIFF.read( (char *) &donnee, 12 ); fichierRIFF.close();
Décryptage d'un fichier SF2
[+]| rep | contenu (hex) | bloc | valeur | description | saut |
|---|---|---|---|---|---|
| 52 49 46 46 | RIFF | valide un fichier de bloc | |||
| 44 f1 02 00 | taille du bloc RIFF de ce fichier (ici 192836 ) = ( taille réelle du fichier (192844) ) - ces 8 premiers octets de l'entête | ||||
| 73 66 62 6b | sfbk | balise : type de fichier RIFF : soundfontbank | |||
| 4c 49 53 54 | LIST | balise : démarre un bloc de données | |||
| da 00 00 00 | taille du bloc de ces données ( ici 218 ) | ->(2) | |||
| 49 4e 46 4f | INFO | balise : définit le nom du bloc de données à traiter 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 ) | ->(1a) | |||
| 02 00 01 00 | donnée de la version SF2 (ici 2.1) | ||||
| (1a) | 69 73 6e 67 | isng | balise : puce synthétiseur ciblée | ||
| 08 00 00 00 | taille de la chaine de caractère | ->(1b) | |||
| 45 ... 00 | EMU8000 ( 7 + le 0 terminal = 8) | ||||
| (1b) | 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) | ->(1c) | |||
| 62 ... 00 | banque-essai-sf2 | ||||
| (1c) | 49 43 52 44 | ICRD | balise : date de création de la banque sous forme de chaine | ||
| 0c 00 00 00 | taille de la chaine | ->(1d) | |||
| 32 ... 00 | 2013-11-09 | ||||
| (1d) | 49 45 4e 47 | IENG | balise : nom du créateur de la banque | ||
| 0e 00 00 00 | taille de la chaine | ->(1e) | |||
| 44 ... 00 | |||||
| (1e) | 49 50 52 44 | IPRD | balise : produit spécifique destinataire de la banque s il y a lieu | ||
| 0e 00 00 00 | taille de la chaine | ->(1f) | |||
| 7a ... 00 | |||||
| (1f) | 49 43 4f 50 | ICOP | balise : message du copyright | ||
| 0c 00 00 00 | taille de la chaine | ->(1g) | |||
| 43 ... 00 | |||||
| (1g) | 49 43 4d 54 | ICMT | balise : commentaires | ||
| 14 00 00 00 | taille de la chaine | ->(1h) | |||
| 7a ... 00 | |||||
| (1h) | 49 53 46 54 | ISFT | balise : nom de "l'outil" qui a créé ou récemment modifié la banque | ||
| 28 00 00 00 | taille de la chaine | ->(2) | |||
| 6c ... 00 | |||||
| (2) | 4c 49 53 54 | LIST | balise : marque le début d'un autre bloc de données | ||
| c4 ee 02 00 | taille du bloc de ces données | ->(3) | |||
| 73 64 74 61 | stda | balise pour le nom du bloc de données à traiter : données des échantillons |
|||
| 73 6d 70 6c | smpl | balise pour le sous-bloc : échantillons basés sur 16 bits |
|||
| b8 ee 02 00 | à vérifier taille du sous bloc échantillon (ici : un seul échantillon donc l'adresse (2a) et (3) sont identiques) | ->(2a) =(3) |
|||
| ..... | série de datapoints constituant les données numériques de l'échantillon | ||||
| (3) | 4c 49 53 54 | LIST | balise : marque le début d'un autre bloc de données | ||
| 8a 01 00 00 | taille du bloc de ces données | ->(4) | |||
| 70 64 74 61 | pdta | balise pour le nom du bloc de données à traiter : données pour les paramètres instruments |
|||
| 70 68 64 72 | phdr | balise pour le sous-bloc : presets de la banque | |||
| 4c 00 00 00 | taille du sous-bloc | ->(3a) | |||
| 50 ... 00 | nom du preset : "Preset-inst-note-LA" . obligatoirement 20 octets (les octets non-utilisés = 0) | ||||
| 01 00 | numéro de preset dans la banque | ||||
| 00 00 | numéro de bank dans le fichier soundfont | ||||
| nA | 00 00 | index dans le sous-bloc pbag de la zone instrument de ce preset | |||
| 00 ... 00 | 12 octets = 0, ils correspondent à la zone de données réservées pour des données futures | ||||
| 45 ... 00 | une série de 38 octets commençant par EOP (End Of Preset). C'est le dernier enregistrement du sous-bloc phdr contenant EOP en tête pour signifier la fin de ce sous-bloc preset | ||||
| 70 62 61 67 | pbag | balise pour le sous-bloc contenant les index des zones de paramètres pour le réglages des presets. L'index qui fait référence aux zones de ce sous-bloc est stocké dans pdta (voir nA) | |||
| 08 00 00 00 | taille du sous-bloc | ->(3b) | |||
| 00 00 | indice de la zone des générateurs du preset dans le sous-bloc pgen (voir nB) | ||||
| 00 00 | indice de la zone des modulateurs du preset dans le sous-bloc pmod (voir nC) | ||||
| 01 00 00 00 | enregistrement final pour indiquer la fin du sous-bloc pbag | ||||
| (3b) | 70 6d 6f 64 | pmod | balise pour le sous-bloc contenant les valeurs de règlages des modulateurs. | ||
| 0a 00 00 00 | taille du sous-bloc | ->(3c) | |||
| nC | 00 ... 00 | 10 octets contenant les valeurs de règlages d'un modulateur | |||
| 00 ... 00 | Par convention, l'enregistrement final de la liste contient 10 octets à 0 pour marquer la fin du sous-bloc pmod | ||||
| (3c) | 70 67 65 6e | pgen | balise pour le sous-bloc contenant les valeurs de règlages des générateurs. | ||
| 08 00 00 00 | taille du sous-bloc | ->(3d) | |||
| nB | 29 00 00 00 | 4 octets contenant les réglages d'un générateur | |||
| 00 00 00 00 | Par convention, l'enregistrement final de la liste contient 4 octets à 0 pour marquer la fin du sous-bloc pgen | ||||
| (3d) | 69 6e 73 74 | inst | balise pour le sous-bloc contenant les instruments de la banque, (ne pas confondre les presets : liste des noms visibles par l'utilisateur de la soundfont, et les "instruments" qui sont des "mise en forme" des échantillons ; Un preset peut contenir un ou plusieurs instruments. | ||
| 2c 00 00 00 | taille du sous-bloc | ->(3e) | |||
| 49 ... 00 | 20 octets pour la désignation de l'intrument | ||||
| nD | 00 00 | indice de la zone de données dans le sous-bloc ibag | |||
| 45 ... 00 | Par convention, l'enregistrement final du sous-bloc contient EOI (End Of Instrument) suivi de 19 octets à 0 pour marquer la fin du sous-bloc inst | ||||
| (3e) | 69 62 61 67 | ibag | balise pour le sous-bloc contenant les indices des zones de données d'instruments de la banque | ||
| 0c 00 00 00 | taille du sous-bloc | ->(3f) | |||
| 00 00 | indice de la zone des générateurs instrument du sous-bloc igen (voir nE) | ||||
| 00 00 | indice de la zone des générateurs instrument du sous-bloc imod (voir nF) | ||||
| 01 00 | indice de la zone des générateurs instrument du sous-bloc igen (voir nG) | ||||
| 00 00 | indice de la zone des générateurs instrument du sous-bloc imod (voir nF) | ||||
| 02 00 00 00 | L'enregistrement final qui ne doit pas être utilisé n'est pas obligatoirement une série de 0 | ||||
| (3f) | 69 6d 6f 64 | imod | balise pour le sous-bloc contenant les valeurs de règlages des modulateurs d'instrument | ||
| 0a 00 00 00 | taille du sous-bloc | ->(3g) | |||
| nF | 00 ... 00 | 10 octets contenant les valeurs de règlages d'un modulateur | |||
| 00 ... 00 | Par convention, l'enregistrement final de la liste contient 10 octets à 0 pour marquer la fin du sous-bloc | ||||
| (3g) | 69 67 65 6e | igen | balise pour le sous-bloc contenant les valeurs de règlages des générateurs d'instrument | ||
| 0c 00 00 00 | taille du sous-bloc | ->(3h) | |||
| nE | 35 00 00 00 | valeurs de réglages d'un générateur | |||
| nG | 35 00 01 00 | valeurs de réglages d'un autre générateur | |||
| 00 00 00 00 | Par convention, l'enregistrement final de la liste contient 4 octets à 0 pour marquer la fin du sous-bloc | ||||
| (3h) | 73 68 64 72 | shdr | balise pour le sous-bloc contenant les références des échantillons présent dans le bloc sdta | ||
| 8a 00 00 00 | taille du sous-bloc | ||||
| 4c ... 00 | 20 octets pour le nom de l'échantillon LA440_L + 26 octets pour définir les paramètres du sample |
||||
| 4c ... 00 | 20 octets pour le nom de l'échantillon LA440_R + 26 octets pour définir les paramètres du sample |
||||
| 45 ... 00 | 3 octet "EOS" (End Of Sample) pour marquer la fin du sous-bloc suivis d'une série de 23 octet à 0 pour complèter la zone à 46 octets |
Exemple de lecture d'un fichier SF2
[+]
Le but est de récupèrer les noms des presets (dans le code qui suit, tous les contrôles ont été éludés).
Dans certains langages, il doit exister des librairies pour traiter les fichiers RIFF soundfont ; Et l'objectif de ce tuto est de comprendre le principe des sf2, sans plus. En conséquence, pour lire ces fichiers, il est préférable d'utiliser ces librairies
déclaration des types
déclaration des variables
ouverture du fichier sf2 et lecture de l'entête où enrgentete.typestructure==RIFF et typefichier==sfbk ; Le contenu de taillefichier est la taille du fichier SF2.
lecture du premier bloc LIST après l'entête : enrbloclist.borneLIST doit être LIST (nom de la borne pour contrôle)
lecture du nom du bloc (en général on trouve le bloc INFO après l'entête). Dans ce bloc, il suffirait de continuer pas à pas pour lire les sous-bloc du bloc INFO ( ifil, isnf INAM,irom, iver, ICRD, IENG, IPRD, ICOP, ICMT, ISFT )
(1) enrbloclist.taillebloclist = nombre d'octet jusqu'au prochain bloc LIST
avec le enrbloclist.taillebloclist récupéré en (1) on passe au bloc suivant directement
- calcul de la position du pointeur pour lire les données
- pointer et lire le bloc LIST suivant
A ce moment nous devons retrouver une borne LIST dans enrbloclist.borneLIST et nous cherchons le bloc pdta ; En général, après INFO, on trouve le bloc sdta qui contient tous les samples de la banque.
(2) enrbloclist.taillebloclist == nombre d'octet jusqu'au prochain bloc LIST
comme on ne trouve pas pdta à ce niveau, on continue la lecture du fichier en recalculant le pointeur (je noterai ici que je procède à un mélange d'accès séquentiel et direct).
Dans les deux dernières lignes du dessus, un nouveau bloc LIST est trouvé, on contrôle alors le nom du bloc. Par convention, le bloc qui suit sdta est le bloc pdta.
Ensuite, ci-dessous : on peut lire le sous-bloc, pour vérifier qu'il s'agit bien de phdr ( le sousbloc phdr est toujours prèsent et le premier sous-bloc de pdta ; Il contient au minimum un preset : le preset final qui est "EOP" et termine la liste des sous-blocs, c'est à dire que si aucun preset n'est défini, il y a obligatoirement le "EOP" ).
(4) enrsousbloc.taillesousbloc == nombre d'octet jusqu'au prochain sous-bloc (pbag).
A prèsent nous devons lire les presets un par un, jusqu'au preset final (le EOP) qui termine la liste, par convention le enrinstrument.nompreset devrait être "EOP", mais par prudence, on peut aussi calculer le nombre de presets de la banque :
Et nous bouclons pour récupérer les noms de preset.
La liste des preset de la banque SF2 est réalisée.
info
Dans certains langages, il doit exister des librairies pour traiter les fichiers RIFF soundfont ; Et l'objectif de ce tuto est de comprendre le principe des sf2, sans plus. En conséquence, pour lire ces fichiers, il est préférable d'utiliser ces librairies
déclaration des types
Copy to clipboard
struct blocLIST{ DWORD borneLIST; DWORD taillebloclist;}; struct sousbloc{ DWORD nomsousbloc; DWORD taillesousbloc;}; struct enteteRIFF{ DWORD typestructure; DWORD taillefichier; DWORD typefichier;}; struct preset_instrument { CHAR nompreset[20]; // contient le nom du preset en ASCII WORD nopreset; // numéro du preset MIDI WORD nobanque; // numéro de banque MIDI pour ce preset WORD indexzonepbag; // indice de la liste de zone du préréglage dans le sous-bloc pbag DWORD reserve, genre, morphologie; // 3 zone reservées = 0 };
déclaration des variables
Copy to clipboard
enteteRIFF enrgentete; blocLIST enrbloclist; sousbloc enrsousbloc; DWORD nombloc; preset_instrument enrinstrument;
ouverture du fichier sf2 et lecture de l'entête où enrgentete.typestructure==RIFF et typefichier==sfbk ; Le contenu de taillefichier est la taille du fichier SF2.
Copy to clipboard
QFile fichierRIFF( "mabanque.SF2" ); fichierRIFF.open( QIODevice::ReadOnly ); fichierRIFF.read( (char *) &enrgentete, sizeof(enrgentete) );
lecture du premier bloc LIST après l'entête : enrbloclist.borneLIST doit être LIST (nom de la borne pour contrôle)
lecture du nom du bloc (en général on trouve le bloc INFO après l'entête). Dans ce bloc, il suffirait de continuer pas à pas pour lire les sous-bloc du bloc INFO ( ifil, isnf INAM,irom, iver, ICRD, IENG, IPRD, ICOP, ICMT, ISFT )
(1) enrbloclist.taillebloclist = nombre d'octet jusqu'au prochain bloc LIST
Copy to clipboard
fichierRIFF.read( (char *) &enrbloclist, sizeof(enrbloclist) ); fichierRIFF.read( (char *) &nombloc, 4 ); //nombloc devrait être INFO
avec le enrbloclist.taillebloclist récupéré en (1) on passe au bloc suivant directement
- calcul de la position du pointeur pour lire les données
- pointer et lire le bloc LIST suivant
Copy to clipboard
qint64 positiondebutlecture = sizeof(enrgentete) // taille enrg entete "RIFF" +sizeof(enrbloclist) // taille enrg "LIST" +enrbloclist.taillebloclist; // taille bloc "INFO" fichierRIFF.seek(positiondebutlecture); fichierRIFF.read( (char *) &enrbloclist, sizeof(enrbloclist) );
A ce moment nous devons retrouver une borne LIST dans enrbloclist.borneLIST et nous cherchons le bloc pdta ; En général, après INFO, on trouve le bloc sdta qui contient tous les samples de la banque.
(2) enrbloclist.taillebloclist == nombre d'octet jusqu'au prochain bloc LIST
Copy to clipboard
fichierRIFF.read( (char *) &nombloc, 4 );
comme on ne trouve pas pdta à ce niveau, on continue la lecture du fichier en recalculant le pointeur (je noterai ici que je procède à un mélange d'accès séquentiel et direct).
Copy to clipboard
positiondebutlecture += sizeof(enrbloclist); // ajoute les 8 octets de enrbloclist positiondebutlecture += enrbloclist.taillebloclist;// et la taille du bloc sdta(2) fichierRIFF.seek(positiondebutlecture); fichierRIFF.read( (char *) &enrbloclist, sizeof(enrbloclist) ); fichierRIFF.read( (char *) &nombloc, 4 );
Dans les deux dernières lignes du dessus, un nouveau bloc LIST est trouvé, on contrôle alors le nom du bloc. Par convention, le bloc qui suit sdta est le bloc pdta.
Ensuite, ci-dessous : on peut lire le sous-bloc, pour vérifier qu'il s'agit bien de phdr ( le sousbloc phdr est toujours prèsent et le premier sous-bloc de pdta ; Il contient au minimum un preset : le preset final qui est "EOP" et termine la liste des sous-blocs, c'est à dire que si aucun preset n'est défini, il y a obligatoirement le "EOP" ).
Copy to clipboard
fichierRIFF.read( (char *) &enrsousbloc, sizeof(enrsousbloc) );
(4) enrsousbloc.taillesousbloc == nombre d'octet jusqu'au prochain sous-bloc (pbag).
A prèsent nous devons lire les presets un par un, jusqu'au preset final (le EOP) qui termine la liste, par convention le enrinstrument.nompreset devrait être "EOP", mais par prudence, on peut aussi calculer le nombre de presets de la banque :
Copy to clipboard
int tailleenrg = sizeof(enrinstrument); tailleenrg -= 2; /* l'instruction ci-dessus n'a pas lieu d'être, mais avec sizeof dans QT4 la taille de enrinstrument est 40 au lieu de 38. Avec un autre langage le retour est bien 38. */ int nbtour = enrsousbloc.taillesousbloc / tailleenrg; nbtour--; // on décrémente nbinstrument pour retirer le "EOP"
Et nous bouclons pour récupérer les noms de preset.
Copy to clipboard
for(int i=0;i<nbtour;i++) { bof = fichierRIFF.read( (char *) &enrinstrument, sizeof(enrinstrument) ); // ici on récupère le nom du preset : enrinstrument.nompreset ; } fichierRIFF.close();
La liste des preset de la banque SF2 est réalisée.