Comment utiliser les bibliothèques omidifon.cpp et omididyn.cpp de studyvox

Je décris dans cette page, comment on peut se servir des fonctions de mmsystem.h, pour programmer un synthétiseur musical pour WINDOWS

On peut utiliser des sources sonores .wav ou .mid Une première idée consiste à utiliser l'interface mci (multimedia component interface) qui permet de charger une source .wav ou .mid, puis de la jouer en se positionnant à un octet quelconque de cette source. On peut alors construire un synthétiseur musical, exactement comme on le fait pour un synthétiseur vocal, en remplaçant la banque de phonèmes, par la banque sonore, qui contient les notes d'un instrument.

C'est ce que vous trouverez dans le projet musidyna, qui est une application musicale construite comme gramdyna, à partir du projet général dynakit. Mais cette idée est moins fructueuse pour musidyna, que pour la synthèse vocale de gramdyna. En effet, la banque .wav devient vite très volumineuse, et il n'est pas raisonnable d'utiliser trop de ressources en mémoire vive (ou morte) Il est préférable, d'utiliser les fonctions de mmsystem.h, qui permettent de manipuler les événements midi.

C'est ce que je vous propose dans le projet mididyna. L'utilisation de ces fonctions, est un peu plus délicate que celle de l'interface mci Voici quelques conseils pour la lecture de l'aide mmedia.hlp de WINDOWS

La norme MIDI

Je suppose que vous connaissez dans les grandes lignes, ce que l'on peut attendre de la norme midi

Si vous désirez vous familiariser avec cette norme, vous trouverez sur le WEB de nombreux sites consacrés à ce domaine. Par contre, il est assez difficile d'arriver à programmer un midi-mapper, uniquement en lisant l'aide mmedia.hlp Pour vous aider dans cette démarche, je vous commenterai comment j'ai utilisé quelques fonctions importantes comme midiOutShortMsg, dans la bibliothèque omidifon.cpp

Les prototypes et les fonctions de la bibliothèque omidifon.cpp

Pour être concret, je vous propose de consulter, quand vous en aurez besoin, les 2 liens suivants, dans lesquels vous trouverez les prototypes et le code des fonctions de omidifon.cpp

Prototypes des fonctions de omidifon.cpp

sources des fonctions de omidifon.cpp

Quand vous serez à l'aise avec quelques fonctions de base, vous pourrez consulter le lien avec l'aide mmedia.hlp de WINDOWS

Aide mmedia.hlp de WINDOWS

L'utilitaire miditest.exe, pour trouver les midimapper présents sur votre PC

La première chose à programmer est une fonction, qui permet de trouver tous les midi_mappers présents sur la plateforme d'un utilisateur.

J'ai appelé cet utilitaire miditest.exe, et vous pouvez consulter sa source qui est dans le fichier miditest.cpp

source de l'utilitaire miditest.exe

Pour effectuer ce test, on utilise essentiellement la fonction midiOutGetDeviceCaps, dont le prototype est dans mmsystem.h Cette fonction, comme toutes celles qui correspondent à des sorties midi, commence par le préfixe midiOut.

On trouve aussi les préfixes midiIn et midiStream, pour les fonctions qui concernent les entrées et les flux midi.

Les fonctions midiOut

Nous n'utiliserons dans omidifon.cpp, que les fonctions midiOut...

La fonction midiOutDevCaps renvoie un handel du type HMIDIOUT en cas de succès et 0 sinon. Comme ce handle sert pour beaucoup de fonctions midiOut..., j'ai déclaré la variable globale hmo dans varmidi.h, à cet effet.

Vous trouverez dans varmidi.h de nombreuses autres variables globales, qui sont déclarées en extern, au début du fichier extmidi.h, juste avant le prototype des fonctions de la bibliothèque. Leurs noms sont suffisamment évoquateurs, pour que je n'ai pas besoin de les commenter. Ces variables seront initialisées par défaut, par la fonction midiinit, si hmo est non nul.

Les messages MIDI

J'explique maintenant comment utiliser les messages midi, qui sont contenus dans un DWORD.

Les 4 BYTE de ce DWORD contiennent des données qui servent aux différentes fonctions midi. Pour faciliter la recherche de ces BYTE, le plus simple est d'utiliser une UNION, car contrairement à une STRUCTURE, l'espace mémoire est partagé entre tous les champs de cette UNION

Le premier BYTE correspond au status, et les 2 BYTE suivants correspondent à des données. Enfin le BYTE 4 ne sert pas, et contiendra 0.

Consultez la fonction que j'ai appelée midimessage, qui renvoie le DWORD construit à partir des 3 BYTE significatifs, qui sont les arguments de la fonction.

Les fonctions jouer, jouerindi... de la bibliothèque omidifon de studyvox

Voila, le plus difficile est fait, et toutes les fonctions qui suivent, seront faciles à interpréter.

Ainsi, la fonction midiOutShortMsg de mmsystem.h, qui possède les 2 arguments HMIDIOUT et DWORD décrits précédement, permettra de réaliser toutes les actions nécessaires à la lecture sonore des tablatures.

Pour faciliter ces actions, j'ai construit les fonctions jouer, jouerindi, jouernuance... Pour que l'écriture d'une tablature soit plus proche du musicien, l'indications des notes, du rythme... est faite grâce aux conventions (très souvents rencontrées) c d e f g a b pour les notes, + - pour les dièses et bémols 1 2 ... pour les rondes, blanches... Par contre, pour faciliter la programmation, les notes sont représentées par des nombres codés sur un CHAR, et les durées par un nombre codé sur un DWORD.

Il serait fastidieux de commenter une à une toutes les fonctions de omidifon.cpp

Je termine en donnant simplement les idées sur leur utilisation. Pour pouvoir utiliser des tablatures dans un but didactitiel, on donne la possibilité d'y inclure des indications. Certaines fonctions permettent de rechercher les indications souhaitées, mesure par mesure, et de les traiter dynamiquement, si nécessaire. Par exemple, l'indication d'armature, permet de placer à la clef, l'ensemble des dièses ou des bémols qui correspondent à une tonalité. On peut alors écrire une tablature qui tient compte de cette armature, comme on le ferait avec une partition usuelle.

Une autre idée est de donner la possibilité aux utilisateurs, de créer leur dictionnaire musical, qui permettra de traduire les notions fondamentales pour les cours qu'ils désirent créer. Par exemple, il sera important de pouvoir reconnaître tous les accords et leurs renversement, dans un cours d'harmonie, et de pouvoir les jouer, les arpèger... Pour que cette possibilité soit donnée sans avoir besoin de recompiler le projet, le plus simple est d'écrire dans un fichier texte, les mots du dictionnaire, avec leur traduction. Ceci a l'avantage de permettre de créer autant de dictionnaires que l'on veut, qui peuvent être crées sans aucune connaissance en informatique, en utilisant, comme pour la création des tablatures, un éditeur de texte ordinaire.

Comment introduire la synthèse musicale du projet mididyna, dans vos applications personnelles

Il ne vous reste plus qu'à introduire la bibliothèque omidifon.cpp dans un projet pour WINDOWS.

Les exemples donnés par gamme.cpp, midi.cpp, accord.cpp ne servent qu'à tester l'utilisation des fonctions de la bibliothèque, et ne possèdent pas de fenêtre, avec un menu... Il est très rapide d'introduire la synthèse de mididyna dans un projet sdi ou mdi, pour créer un véritable environnement de travail musical.

Vous trouverez dans la rubrique winweb, un projet qui place mididyna dans le projet apxsdi de borland (tiré d'un exemple d'application de la classe owl d'objets WINDOWS)

retour dans le sommaire de la rubrique mididyna du site studyvox webups

retour dans l'index du site studyvox webups