Table des matières du kit Midi     Index du kit Midi

BSynth

Hérité de: (aucun)

Déclaré dans: be/midi/Synth.h

Bibliothèque: libmidi.so

Résumé

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


BSynth et le serveur audio

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.


Puissance de synthèse

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.


Enregistrement du synthétiseur

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


Constructeur et Destructeur


BSynth()

                                                         
  

BSynth(void)

BSynth(synth_mode mode)

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


~BSynth()

                                                         
  

virtual ~BSynth()

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.


Fonctions membres


CountClients()

                                                         
  

int32 CountClients(void) const

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() , IsReverbEnabled() , SetReverb() , Reverb() , reverb_mode

                                                         
  

status_t EnableReverb(bool reverb_enabled)

bool IsReverbEnabled(void) const

void SetReverb(reverb_mode reverb)

reverb_mode Reverb(void) const

typedef enum { B_REVERB_NONE, B_REVERB_CLOSET, B_REVERB_GARAGE, B_REVERB_BALLROOM, B_REVERB_CAVERN, B_REVERB_DUNGEON } reverb_mode (aucun écho, chambre, hangar, salle de bal, grotte, oubliettes...)

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


GetAudio()

                                                         
  

int32 GetAudio(int16 *left, int16 *right, int32 sampleCount) const

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


Interpolation() voir SetSamplingRate()


interpolation_mode voir SetSamplingRate()


IsLoaded() voir LoadSynthData()


IsReverbEnabled() voir EnableReverb()


LimiterThreshhold() voir SetVoiceLimits()


LoadSynthData() , Unload() , SynthMode() , IsLoaded()

                                                         
  

status_t LoadSynthData(synth_mode mode)

status_t LoadSynthData(entry_ref *instrument_file)

void Unload(void)

synth_mode SynthMode(void) const

bool IsLoaded(void) const

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.

 
Actuellement, le mode B_SAMPLES_ONLY ne fonctionne pas. Vous devrez donc choisir l'une des deux autres constantes (B_BIG_SYNTH ou B_LITTLE_SYNTH).


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


MaxSampleVoices() voir SetVoiceLimits()


MaxSynthVoices() voir SetVoiceLimits()


Pause() , Resume()

                                                         
  

void Pause(void)

void Resume(void)

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


Reverb() voir EnableReverb()


reverb_mode voir EnableReverb()


SampleVolume() voir SetSynthVolume()


SamplingRate() voir SetSamplingRate()


SetControllerHook() , synth_controller_hook

                                                         
  

void SetControllerHook(int16 controller, synth_controller_hook controlHook)

typedef void (*synth_controller_hook)(int16 channel, int16 controller, int16 value)

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


SetInterpolation() voir SetSamplingRate()


SetSampleVolume() voir SetSynthVolume()


SetSamplingRate() , SamplingRate() , SetInterpolation() , Interpolation() , interpolation_mode

                                                         
  

status_t SetSamplingRate(int32 rate)

int32 SamplingRate(void) const

status_t SetInterpolation(interpolation_mode interp)

interpolation_mode Interpolation(void) const

typedef enum { B_DROP_SAMPLE,
      B_2_POINT_INTERPOLATION,
      B_LINEAR_INTERPOLATION } interpolation_mode

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


SetSynthVolume() , SetSampleVolume() , SynthVolume() , SampleVolume()

                                                         
  

void SetSynthVolume(double scale)

void SetSampleVolume(double scale)

double SynthVolume(void) const

double SampleVolume(void) const

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


SetVoiceLimits() , MaxSynthVoices() , MaxSampleVoices() , LimiterThreshhold()

                                                         
  

status_t SetVoiceLimits(int16 maxSynthVoices, int16 maxSampleVoices, int16 limiter Threshhold)

int16 MaxSynthVoices(void) const

int16 MaxSampleVoices(void) const

int16 LimiterThreshhold(void) const

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


synth_controller_hook voir SetControllerHook()


SynthMode() voir LoadSynthData()


SynthVolume() voir SetSynthVolume()


Unload() voir LoadSynthData()


Table des matières du kit Midi     Index du kit Midi


The Be Book,
...in lovely HTML...
for BeOS Release 5.

Copyright © 2000 Be, Inc. All rights reserved..