Il sonoro, forse e' uno dei pochi aspetti, che meno si conoscono in ambiente .NET, non conosco nessuna classe, che gestisca file MIDI, ed e' per questo che senza utilizzare librerie piu' complesse come DirecSound, ho deciso di illustrare la tecnica a cui di solito ricorro quando devo far suonare un file MIDI in un'applicazione C#.

Il tutto e' abbastanza semplice per chi come me proviene dalla programmazione sotto windows in C/C++, ed aveva a che fare con le vecchie apri 32 bit, winsock etc, meno forse per chi si e' affacciato al mondo della programmzione partendo da .NET, in ogni modo il concetto e' piuttosto semplice ed immediato.

C'era un funzione, dentro ad una dll delle api windows a 32 bit che si chiamava:

mciSendString();

Con questa funzione, in pratica si potevano dare comandi direttamente alle periferiche sotto forma di stringa, esempio:

mciSendString("Set Cdaudio Open",etc....)

Apre il cd del lettore predefinito.

Ora che sappiamo cio, ci basta sapere come chiamare questa funzione dentro al nostro codice, e come utilizzarla.

Ecco il codice che di fatto richiama la funzione da dentro alla dll originale:


[System.Runtime.InteropServices.DllImport("winmm.DLL", EntryPoint = "mciSendString", SetLastError = true)]

private static extern bool mciSendString(string szSound, System.IntPtr hMod, System.IntPtr hMod2, System.IntPtr hMod3);



Qua' nn si legge benissimo, ad ogni modo sono due righe di codice che richiamano dalla dll winmm.dll la suddetta funzione, vanno inserite tra le dichiarazioni di variabili globali in cima alla classe in modo che siano visibili in tutto il codice.

Poi ci sono alcuni flag fissi che vanno specificati, senza i quali il tutto non funzionerebbe ecco come:

[System.Flags]
        public enum PlaySoundFlags : int
        {
            SND_SYNC = 0x0000,
            SND_ASYNC = 0x0001,
            SND_NODEFAULT = 0x0002,
            SND_LOOP = 0x0008,
            SND_NOSTOP = 0x0010,
            SND_NOWAIT = 0x00002000,
            SND_FILENAME = 0x00020000,
            SND_RESOURCE = 0x00040004
        }

Bene Adesso in ogni punto del codice, sara' disponibile la funzione caricata ecco alcuni esempi:

       mciSendString("open musica.midi alias pr", new System.IntPtr(), new System.IntPtr(), new System.IntPtr());

Abbiamo dato un alias chiamato pr ad un  midi chiamato musica ed ora lo suoniamo:

mciSendString("play pr", new System.IntPtr(), new System.IntPtr(), new System.IntPtr());

Ecco fatto il midi suonera' ovviamente cambianto i flag possiamo ottenere vari risultati, dal loop a bloccare l'applicazione sino al termine della melodia.

Spulciate un po' in giro per vedere cosa si puo fare con questa funzione ciao.

pulsar4@alice.it