Utiliser le synthétiseur intégré.

Utiliser le synthétiseur intégré.

midiOutShortMsg

Voir version :

Pas de dépendances

Télécharger :

#include <stdio.h>
#include <windows.h>

#pragma comment(lib,"Winmm.lib")

unsigned long changer_instrument(int channel,int numinstrument)
{
    return channel|0xC0|(numinstrument<<8);
}

unsigned long appuyer_touche(int channel,int note,int force)
{
    return channel|0x90|(note<<8)|(force<<16);
}

unsigned long relacher_touche(int channel,int note,int force)
{
    return channel|0x80|(note<<8)|(force<<16);
}

int main()
{
    int i;
    HMIDIOUT hMidiOut;
    midiOutOpen(&hMidiOut, 0, 0, 0, CALLBACK_NULL);

    midiOutShortMsg(hMidiOut, changer_instrument(0,0));
    midiOutShortMsg(hMidiOut, changer_instrument(1,50));
    midiOutShortMsg(hMidiOut, appuyer_touche(0,50,50));
    midiOutShortMsg(hMidiOut, appuyer_touche(1,80,30));
    
    Sleep(2000);

     midiOutShortMsg(hMidiOut, relacher_touche(1,80,50));
    
    Sleep(1000);

    for(i=0;i<127;i++)
    {
        printf("%d\r",i);
        midiOutShortMsg(hMidiOut, changer_instrument(0,i));
        midiOutShortMsg(hMidiOut, appuyer_touche(0,70,30));
        Sleep(500);
    }

    midiOutClose(hMidiOut);

    return 0;
}



Commentaires

	Amis de la musique, voici quelque chose de plus intéressant que les Bip du speaker du PC.
	Cette fois ci, vous pouvez allumer vos enceintes, ou mettre votre casque.

Avant de commencer, un petit peu d'Histoire pour comprendre "pourquoi le synthétiseur" :
----------------------------------------------------------------------------------------

	Un son, c'est une vibration de l'air. Une musique, c'est une suite de sons au fur et à mesure du temps.
	Bien, donc on peut représenter une musique par une fonction mathématique (une courbe) 
	qui défini la fréquence de vibration de l'air en fonction du temps.

	En gros, la musique, c'est une courbe.

	Le son analogique, codé sur les disques viniles, c'est directement la courbe enregistrée par un microphone.
	ça se dégrade et se modifie avec le temps.

	Le son numérique, c'est un échantillonnage de la courbe : autrement dit, vous tracez des points sur la courbe,
	et vous sauvez leurs coordonnées sur un CD. Ces points permettront de reconstruire l'approximation de la courbe.

	J'insiste sur le mot approximation, car même si vous prenez plein de points, la courbe que vous reconstruirez à
	partir de la ne sera pas exacte, mais très proche. C'est d'ailleurs pour ça que certains "puristes" du son préfèrent 
	le vinyle. 

	Et pourtant, sur CD, on échantillonne à 44khz, c'est à dire qu'on place 44 000 points par secondes en x, et 16 bits,
	donc 65536 valeurs possibles en y. 

	ça fait énormément de points à stocker. D'ailleurs, un CD, avec 2 pistes (stéréo) peut contenir 80 minutes de son
	sur ses 700 Mo de disque.

	Ou est ce que je veux en venir ? 
	-> Le son, c'est lourd. Si à notre époque, ça ne fait plus trop peur, et ça se compresse (MP3), 
	avant la démocratisation des CDROM, les ordis n'étaient pas assez puissants pour décompresser des sons en 
	temps réel (pas de MP3), et on avait peu de mémoire. Il fallait faire tenir un jeu, avec les musiques de 
	tous les stages sur une seule disquette de 1,44 Mo

	Les cartes sons embarquaient alors des échantillons de divers instruments, et les fichiers de son, appelés "MIDI"
	se contentaiet de dire "a tel moment, joue cette note avec cet instrument". Et la carte son faisait le boulot.
	Cela était beaucoup plus compact en mémoire. Une musique de plusieurs minutes peut faire une trentaine de Ko...

	Avant la carte son "Sound Blaster 16", c'était le bordel (sisi, il faut le dire, chaque jeu lancé vous interrogeait
	sur quelle carte son vous aviez, dans une liste interminable, pour piloter correctement les synthétiseurs différents).
	
	Depuis, toutes les cartes son sont compatibles "Sound Blaster 16", elles ont toutes le même synthétiseur,
	y compris les chipsets son intégrés aux cartes mères.
	(surement que certaines ont davantage d'échantillons, mais la, je parle du dénominateur commun qui est déjà
	pas mal pour le commun des mortels)

	Donc actuellement, soit on lit un MP3 ou un CD audio, et la carte son se contente de faire passer la courbe
	toute faite vers les enceintes,
	soit on lui donne des codes MIDI (des notes de musiques, des numéros d'instruments, des canaux) et la carte
	son utilise son synthétiseur intégré pour nos refaire un beau son.

	Nous allons voir ici le deuxième cas.

Fin de l'Histoire
-----------------

	Voyons maintenant le programme.

	On ouvre l'accès au synthétiseur grâce à midiOutOpen, qui nous donne un handle de type HMIDIOUT, 
	qui sera ici hMidiOut.
	Une fois qu'on aura terminé, on appellera, à la fin du programme : midiOutClose, avec comme paramètre hMidiOut.

	Entre les deux, on va envoyer des données au synthétiseur grâce à midiOutShortMsg.

	Ces données, ce sont des variables de 4 octets, dans lesquelles on va code plusieurs informations.

	Pour éviter d'envoyer des "nombres magiques", j'ai fait quelques petites fonctions au dessus du main qui 
	reconstruisent le nombre en fonction des paramètres donnés.

	Tout d'abord, la notion de canal (channel). Le synthétiseur peut faire 16 choses à la fois. (16 pistes)
	Passez donc un nombre de 0 a 15 inclus.

	Les fonctions appuyer_touche et relacher_touche que j'ai fait jouent une note, ou la relache.
	en premier paramètre, le channel choisi, en 2e la note (entre 0 et 127 : de grave à aigüe)
	Je ne sais pas exactement à quoi correspond chaque valeur (do#,sol, quel octave, tout ça....
	si vous avez une meilleur oreille musicale que moi, vous trouverez. 
	Une chose est sure, ces valeurs correspondent à des notes, et ne sont pas anarchiques.

	La vélocité, c'est la force avec laquelle vous appuyez sur une touche ou la relachez.
	Imaginez vous devant un piano, soit vous êtes doux avec les touches, soit vous tapez comme un bourrin :
	le son s'en trouve affecté. Pareil quand vous avez joué une note, si vous la relâchez plus ou moins vivement.
	Mettez une valeur entre 0 et 127.

	la fonction changer_instrument est intéressante, elle vous permettra de voir un peu tous les instruments présents
	dans votre carte son. Un vrai petit synthétiseur quoi !
	Essayez de 0 a 127.

	D'ailleurs, le programme le fait à partir du for, j'essaie tous les instruments :)

	Il existe plein d'autres paramètres pour faire des effets.
	La documentation sur le fichier MIDI vous aidera (car les codes envoyés sont des codes MIDI) :
	http://www.sonicspot.com/guide/midifiles.html

	Si vous êtes curieux, vous aurez vu que ce qui change principalement dans les fonctions que j'ai faites, c'est
	0xC0, 0x80 et 0x90.
	Vous trouverez dans cette doc, au paragraphe "MIDI Events", tous les types possibles.
	On a vu Note On, Note Off, et Program Change.
	Je pense que l'event "Controler" (0xB0) soit ouvrir beaucoup de possibilités (que mes maigres connaissance en
	musique m'empêchent de tout comprendre)

	Merci à Lucien63 du siteduzero pour m'avoir fait découvrir ces fonctions amusantes !