Table des matières du kit Midi | Index du kit Midi |
Hérité de: (aucun)
Déclaré dans: be/midi/Synth.h
Bibliothèque: libmidi.so
BeOS est fourni avec un synthétiseur logiciel 16 canaux à la norme General MIDI (conçu par HeadSpace Inc.), dont la classe BSynth est l'interface. Toute application qui aurait besoin d'utiliser ce synthétiseur doit comporter un objet BSynth. Toutefois, la plupart des programmes ne nécessiteront pas une création directe de cet objet: les classes BMidiSynth, BMidiSynthFile, et BSamples s'en chargeront. Par ailleurs, étant donné que BSynth n'hérite pas de BMidi, il n'existe pas d'API pour réellement jouer des données MIDI; pour cela, vous aurez besoin des classes BMidiSynth ou BMidiSynthFile.
Un programme ne peut contenir qu'une seule instance de BSynth à un moment donné. Cet objet est représenté globalement (à l'intérieur du programme) par la variable be_synth. Les classes qui créent automatiquement un objet BSynth (BMidiSynth, BMidiSynthFile et BSamples) ne supprimeront pas une variable be_synth existante, contrairement au constructeur de BSynth qui, lui, le fera.
A sa création, l'objet be_synth recherche un fichier de définitions d'instruments (ou de "synthèse"). Ce fichier renferme des données (sous forme d'échantillons et d'instructions) qui permettront de simuler les instruments. BeOS fournit deux fichiers de ce type, tous deux conçus également par HeadSpace, dans la B_SYNTH_DIRECTORY:
Les données relatives à un instrument sont lues quand celui-ci est demandé, mais il est possible de précharger la totalité du fichier de synthèse en utilisant la fonction BMidiSynth::EnableInput().
Le synthétiseur produit du son en prenant les commandes de l'entrée numérique du serveur audio: il redéfinit la taille et le nombre des buffers ainsi que le taux d'échantillonnage, et ajoute un objet BSubscriber à l'entrée du flux audio. Pour mixer des fichiers son à la synthèse MIDI, préférez une instance de BSamples à l'ajout de vos propres clients au flux numérique. Toutefois, si vous avez réellement besoin de vos propres générateurs d'échantillons, ne les placez pas en entrée du convertisseur après la création de be_synth (vos échantillons seraient perdus).
Les interactions entre le synthétiseur et le kit Media seront améliorées dans une prochaine mise à jour.
Les réglages antérieurs du flux numérique sont restaurés à la destruction de be_synth.
Le synthétiseur peut générer jusqu'à 32 voix simultanées, une voix étant soit un son synthétisé distinct, soit une suite d'échantillons d'un objet BSamples. La répartition par défaut est de 28 voix de synthèse pour 4 voix échantillonnées; la fonction SetVoiceLimits() permet de modifier cette distribution.
Si vous tentez d'utiliser plus de voix que le nombre prévu (vous demandez une 29ème note alors que 28 parlent déjà, par exemple), le synthétiseur essaiera de supprimer une note précédente pour faire place à la nouvelle.
Rien n'assure que le synthétiseur et l'entrée numérique du convertisseur disposeront d'assez de temps pour générer et traiter tout ce que vous leur demandez, même si vous restez sous la limite des 32 voix. Sur un système peu chargé et raisonnablement rapide, vous ne devriez pas entendre de problèmes, mais un afflux de nombreuses commandes MIDI (par exemple) peut dégrader cette situation.
Il n'existe pas d'API qui retranscrirait automatiquement dans un fichier les informations en sortie du synthétiseur. Pour l'enregistrer, vous devrez créer votre propre BSubscriber, l'ajouter au flux audio (en amont du synthétiseur), et recopier les données numériques reçues (reportez-vous au kit Media pour obtenir plus de précisions).
Parfois, le fait d'enregistrer peut solliciter l'unité centrale au point de ralentir le synthétiseur (en réalité, c'est le BSubscriber du synthétiseur qui est retardé). Le son sera médiocre durant l'enregistrement, mais les informations reproduites dans le fichier ne seront probablement pas altérées (les défauts à l'écoute n'y seront pas retranscrits).
|
Crée et initialise un nouvel objet BSynth et fait pointer be_synth dessus, détruisant s'il y a lieu une instance précédente: il ne peut y avoir qu'un seul objet BSynth par application. Tout programme ayant usage du synthétiseur doit disposer de sa propre instance de BSynth: il n'est pas possible de partager l'objet be_synth d'une autre application. Les constructeurs des autres classes "synthétiseur" (BMidiSynth, BMidiSynthFile, et BSamples) créent automatiquement cet objet, s'il n'existe pas déjà.
Le constructeur par défaut sélectionne pour la synthèse les paramètres suivants, listés ici en regard des fonctions que vous pourrez utiliser pour en modifier les valeurs, et auxquelles vous devrez vous référer pour des explications plus complètes:
Paramètre | Valeur | Fonction |
---|---|---|
Taux d'échantillonnage en sortie | 22 kHz | SetSamplingRate() |
Méthode d'interpolation | B_LINEAR_INTERPOLATION | SetInterpolation() |
Nombre maximal de voix synthétisées | 28 | SetVoiceLimits() |
Nombre maximal de voix échantillonnées | 4 | SetVoiceLimits() |
Limiteur | 7 | SetVoiceLimits() |
Réverbération active | true | EnableReverb() |
Profondeur de réverbération | B_REVERB_BALLROOM | SetReverb() |
Mode de synthèse | B_SYNTH_NONE | LoadSynthData() |
Pour choisir le mode de synthèse, appelez LoadSynthData() après le constructeur par défaut.
Le constructeur utilisant les constantes synth_mode sélectionne les paramètres comme ci-dessus ainsi que le mode de synthèse selon l'argument demandé: B_BIG_SYNTH, B_LITTLE_SYNTH, ou B_SAMPLES_ONLY (référez-vous à LoadSynthData() pour obtenir la description de ces différentes constantes).
|
Le destructeur interrompt le synthétiseur (au cas où celui-ci serait en cours de restitution), libère la mémoire de tout ce qui aurait été alloué par l'objet BSynth pour sa synthèse, et fait pointer be_synth sur NULL.
|
Renvoie le nombre d'objets des classes BMidiSynth et BMidiSynthFile qui seraient en train d'envoyer des données au synthétiseur. Remarquez bien qu'il n'est pas tenu compte des objets BSamples.
|
EnableReverb() active et neutralise la réverbération de be_synth.
IsReverbEnabled() indique si la réverbération est active (elle l'est par défaut).
SetReverb() sélectionne la réverbération, selon les constantes ci-dessus (listées par ordre de profondeurs croissantes).
Reverb() indique la sélection en cours d'utilisation.
Le choix d'une sélection n'active pas la réverbération. Pour la désactiver, faites ceci...
EnableReverb(false); /* Bien. */
...plutôt que cela:
SetReverb(B_REVERB_NONE); /* Mauvais! */
CODES DE RETOUR
EnableReverb() renvoie...
|
Renvoie, dans left et right, les sampleCount derniers échantillons (canaux gauche et droit) produits par le synthétiseur (la mémoire doit avoir été préalablement allouée pour recevoir les données). La fonction retourne le nombre (pouvant être moindre que sampleCount) d'échantillons retranscrits dans left et right.
Cette fonction est prévue pour visualiser des formes d'ondes (ou ce qui y ressemble), et non pour servir de "robinet" à remplir les fichiers (entre autres).
|
LoadSynthData() indique à be_synth le fichier de synthèse à utiliser (et décharge celui en cours d'utilisation, si besoin). La première version permet d'utiliser une constante synth_mode:
Si le synthétiseur est initialisé avec un fichier de synthèse, il sera de ce fait en mesure de jouer des données BSamples.
|
La seconde version permet de nommer un fichier de synthèse dans entry_ref, vous donnant ainsi l'opportunité de choisir un fichier personnalisé. Malheureusement, le format des fichiers de synthèse n'est pas actuellement public, et vous ne pourrez pas créer le vôtre (encore que...).
LoadSynthData() ne lit pas les définitions d'instruments du fichier de synthèse; autrement dit, il n'en "charge" aucun: les instruments le sont suivant les besoins des restitutions, c'est-à-dire selon les demandes des objets BMidiSynth et BMidiSynthFile. Pour forcer la lecture des instruments, utilisez les fonctions EnableInput() ou LoadInstrument() de la classe BMidiSynth.
Unload() interrompt le synthétiseur (au cas où il serait en cours de fonctionnement), démémorise le fichier de synthèse utilisé lors de son initialisation, et ôte le synthétiseur du dispositif de restitution sonore. Après Unload(), l'objet be_synth n'est plus bon à rien jusqu'à ce que LoadSynthData() ne soit appelé (directement ou via un constructeur).
SynthMode() renvoie le mode de synthèse utilisé par be_synth: soit l'une des trois constantes ci-dessus, soit B_NO_SYNTH si le mode n'est pas défini.
IsLoaded() renvoie true si be_synth est initialisé et prêt à fonctionner (false sinon).
CODES DE RETOUR
LoadSynthData() renvoie...
|
Pause() suspend la production sonore du synthétiseur, mais sans interrompre les objets BMidi n'utilisant pas la synthèse: Pause() ne s'applique pas aux objets BMidiPort et BMidiStore.
Resume() reprend la production sonore du synthétiseur. Les objets BMidiSynthFile poursuivent leur lecture à partir de l'endroit où elle a été interrompue et les objets BSamples au début de leurs données (et non à partir de l'endroit de la pause).
|
Enregistre un hook (controlHook) appelé lorsqu'un message de contrôle MIDI s'adresse à controller. A cette fonction, appelée juste après le traitement du message de contrôle par le synthétiseur, sont transmis le canal, les numéro et valeur du contrôleur (repris du message de contrôle).
|
SetSamplingRate() fixe la fréquence à laquelle be_synth restitue ses donnés, en échantillons par secondes. Les valeurs 44100, 22050 (par défaut), et 11025 sont correctes; rate est arrondi à la plus proche de ces taux.
SamplingRate() renvoie la fréquence de travail précédemment définie par SetSamplingRate().
La fréquence de restitution de be_synth n'est pas liée à celle du convertisseur numérique: ainsi, leurs fréquences par défaut respectives sont de 22500 et de 44100 (pour le convertisseur). Si celles-ci ne concordent pas, l'objet BSubscriber de be_synth convertit les données du synthétiseur avant de les communiquer au convertisseur. Il y a trois méthodes d'interpolation, que la fonction SetInterpolation() permet de sélectionner:
Constante | Description |
---|---|
B_DROP_SAMPLE | Echantillons répétés ou sautés. Le rendu est médiocre, à la mesure de la pauvreté du traitement. |
B_2_POINT_INTERPOLATION | Interpolation linéaire entre échantillons voisins. Rendu meilleur (mais traitement plus lourd) que B_DROP_SAMPLE. |
B_LINEAR_INTERPOLATION | Interpolation linéraire étendue (valeur par défaut). La meilleure qualité, mais aussi la plus coûteuse. |
Interpolation() renvoie le mode d'interpolation utilisé (B_LINEAR_INTERPOLATION par défaut).
CODES DE RETOUR
SetSamplingRate() et SetInterpolation() renvoient...
|
Ces fonctions retournent et déterminent le volume général pour la synthèse MIDI et la lecture de BSamples. L'échelle est linéaire: attribuer 1.0 (valeur par défaut) à scale est sans effet, 2.0 double le volume; scale doit valoir au minimum 0.0 (pas de gain).
|
Le synthétiseur peut piloter simultanément jusqu'à 32 "voix", une voix étant un son MIDI ou une série d'échantillons de BSamples. Les deux premiers arguments donnent les nombres de voix que le synthétiseur doit allouer respectivement à la synthèse MIDI et aux échantillons (le total des deux ne devant pas dépasser 32). Si une restitution demande plus de voix, le synthétiseur va (tenter de) supprimer d'anciennes voix en premier. La répartition par défaut est de 28 voix pour le MIDI et de 4 pour les échantillons.
Utilisez limiterThreshhold (limiteur) pour indiquer la densité caractéristique des voix (ou nombre de voix simultanées) d'un morceau. Cette limitation, de valeur 1 au moins (et de 7 par défaut) est utilisée par le synthétiseur en tant qu'échelle d'amplitude:
Si vous donnez une valeur trop haute (il y a moins de voix simultanées que vous ne le supposiez), le rapport signal/bruit sera dégradé par la division de l'amplitude dynamique en trop de (petites) unités. Si vous donnez une valeur trop basse et que le nombre de voix évolue rapidement, l'équilibrage des sons va devenir difficile à prévoir et à contrôler. Une modification de limiterTreshhold ne modifie pas les sons et échantillons en cours de production.
Les trois autres fonctions renvoient les valeurs transmises à SetVoiceLimits(). Notez qu'elles n'interrogent pas réellement le synthétiseur: si vous avez indiqué des valeurs incorrectes à SetVoiceLimits(), ces fonctions d'information vous les rapporteront sans sourciller.
CODES DE RETOUR
SetVoiceLimits() renvoie...
Table des matières du kit Midi | Index du kit Midi |
Copyright © 2000 Be, Inc. All rights reserved..