maxer73
08-03-2013, 02:02
Ciao a tutti, sono Max, un nuovo utente ThinBasic da circa 2 settimane,
Mi ha detto Eros di scrivere in italiano (la mia lingua) inquanto il mio inglese è abbastanza scarso.
Scusatemi per questo, io ho studiato inglese a scuola (25 anni fa) quindi sono arrugginito...
Ho scritto del codice per inviare e ricevere messaggi MIDI e dopo giorni e giorni di prove questo funziona,
grazie anche a Eros che mi ha aiutato.
Per chi non lo conosce, il MIDI (Musical Instruments Digital Interface) è un protocollo che viene usato
per inviare e ricevere messaggi di controllo tra vari strumenti musicali digitali oppure tra il computer e questi,
questi messaggi servono ad esempio per fare suonare una determinata nota, per cambiare strumento (pianoforte,
violino, tromba, basso, batteria ecc), per settare il volume, per settare l'intonazionee e tantissime altre funzioni in
tempo reale, tutti gli strumenti musicali digitali (compreso il computer) hanno centinaia di queste funzioni e tramite
l'interfaccia MIDI e questo protocollo (che è uno standard da molti anni) si può controllare in remoto qualsiasi
parametro. http://en.wikipedia.org/wiki/MIDI
Ci sono molti programmi musicali che fanno uso del protocollo MIDI, guardate ad esempio Cubase, Logic, ProTools,
Digital Performer, Ableton Live e con il MIDI è possibile controllare sia altri programmi che ne fanno uso sullo stesso
computer, sia apparecchiature esterne.
Per controllare apparecchiature esterne, il nostro computer deve avere un'interfaccia MIDI che può essere, una
scheda audio professionale, oppure una semplice soundblaster oppure ancora una qualsiasi scheda audio da 10$.
Nel caso di schede audio professionali, esistono già i connettori, dove bisogna semplicemente collegare una
estremità del cavo MIDI e l'altra estremità nello strumento che dobbiamo comandare.
Nel caso invece di schede a basso costo bisogna procurarsi un cavo convertitore che va inserito nella presa
Joystick e dall'altra parte ha connettori MIDI per connettersi ai vari strumenti.
Esistono anche schede MIDI via cavo USB, sono in commercio tantissimi modelli e costano poche decine di $.
Con il MIDI si possono fare anche vari esperimenti particolari, io ad esempio ho scritto vari programmi che girano
sotto piattaforma Android (smartphones e tablets), che inviano mediante protocollo UDP dei messaggi di controllo,
poi ho scritto con TB un'applicazione che riceve i dati UDP, li converte in MIDI e mediante driver virtuali MIDI
(MIDI Yoke NT, LoopBe1 e altri) li invia a programmi musicali come Cubase, dove posso controllare qualsiasi
parametro, tutto questo sulla rete WiFi e col latenza di 5-10 millisecondi.
Questi dati possono anche essere inviati in tempo reale alle apparecchiature musicali esterne.
Io in questo momento uso come porta virtuale MIDI Yoke NT e mi trovo bene http://www.midiox.com/
Venendo al nostro lavoro, usando le API di Windows e precisamente la libreria dinamica "winmm.dll" si può accedere
a tutte le funzionalità MIDI del sistema in uso... per chi non conosce questa libreria, consiglio vivamente di fare una
ricerca su Google, perchè permette di fare molte cose, anche gestire i formati MidiFile, streaming l'audio, streaming
video e cattura da webcam. Nei miei moduli ho messo solo le chiamate per il sistema Midi.
Per conoscere il numero di porte midi Outputs e Inputs del sistema si fa così:
numDevicesOut = midiOutGetNumDevs() 'get number of midi output devices
numDevicesIn = midiInGetNumDevs() 'get number of midi input devices
Tutte le porte midi hanno un indice, per sapere il nome di una porta ad un determinato indice si fa così:
MidiOutGetDevCaps INDEX, OutCaps, Len(OutCaps) 'get the name of midi out at INDEX of port
MidiInGetDevCaps INDEX, InCaps, Len(InCaps) 'get the name of midi in at INDEX of port
Quindi ad esempio per conoscere tutti i Midi Outs si fa così:
For i As Integer = 0 To (numDevicesOut - 1) 'for all Midi outs NOTE: index is base 0
MidiOutGetDevCaps i, OutCaps, Len(OutCaps) 'get the name of index (i) port
PrintL "Device Out " & i & ":" & $TAB & OutCaps.szPname
Next
Per aprire una determinata porta MidiOut o MidiIn si fa così:
init_MIDI_OUT(index) 'index is base 0
init_MIDI_IN(index) 'index is base 0
Ricorda che la porta precedentemente aperta MidiOut o MidiIn che sia va sempre chiusa prima di aprirne
un'altra o alla fine del programma (se si utilizza sempre quella porta) questo si può fare così:
end_MIDI_OUT '<<<=== always CLOSE the Midi Out port that you had previously opened
end_MIDI_IN '<<<=== always CLOSE the Midi In port that you had previously opened
Se si utilizza UI e si ha intenzione ad esempio di aprire una porta all'inizio del programma e chiuderla alla
fine del programma si può fare rispettivamente in %WM_INITDIALOG e in %WM_DESTROY, se invece si
desidera cambiare porta nel corso dell'esecuzione del programma allora ricordatevi di chiudere quella
precedente.
Volendo, si possono aprire più porte contemporaneamente ma bisogna essere sicuri che alla fine del
programma, tutte siano chiuse, altrimenti gli altri programmi non riescono ad accedere a una
determinata porta in quanto non è stata precedentemente chiusa. (questo è simile alla gestione porte UDP)
Allego uno zip con 3 file, ci sono i due moduli Per MidiOut e MidiIn e un semplice esempio che apre la porta 0
per suonare alcune note con le voci GeneralMidi di Windows:
-Main MidiTest.tbasic
-module MidiOut.tbasic
-module MidiIn.tbasic
Se non vi funziona dovete cambiare il numero di porta nell'istruzione
init_MIDI_OUT(0) 'if don't work change to -1 (MidiMapper) 1,2,3,4 etc......
Non sono pratico di TB ma sarebbe bello se si potesse creare una DLL e fare in modo da usare il midi in questo
modo:
Uses "MidiOut"
Uses "MidiIn"
in modo da poterle mettere nella cartella Lib insieme a tutte le altre librerie dinamiche.
Ciao a tutti, spero che questo serva a qualcuno... se avete commenti o modifichè sarò felice di ascoltarvi.
Max
Mi ha detto Eros di scrivere in italiano (la mia lingua) inquanto il mio inglese è abbastanza scarso.
Scusatemi per questo, io ho studiato inglese a scuola (25 anni fa) quindi sono arrugginito...
Ho scritto del codice per inviare e ricevere messaggi MIDI e dopo giorni e giorni di prove questo funziona,
grazie anche a Eros che mi ha aiutato.
Per chi non lo conosce, il MIDI (Musical Instruments Digital Interface) è un protocollo che viene usato
per inviare e ricevere messaggi di controllo tra vari strumenti musicali digitali oppure tra il computer e questi,
questi messaggi servono ad esempio per fare suonare una determinata nota, per cambiare strumento (pianoforte,
violino, tromba, basso, batteria ecc), per settare il volume, per settare l'intonazionee e tantissime altre funzioni in
tempo reale, tutti gli strumenti musicali digitali (compreso il computer) hanno centinaia di queste funzioni e tramite
l'interfaccia MIDI e questo protocollo (che è uno standard da molti anni) si può controllare in remoto qualsiasi
parametro. http://en.wikipedia.org/wiki/MIDI
Ci sono molti programmi musicali che fanno uso del protocollo MIDI, guardate ad esempio Cubase, Logic, ProTools,
Digital Performer, Ableton Live e con il MIDI è possibile controllare sia altri programmi che ne fanno uso sullo stesso
computer, sia apparecchiature esterne.
Per controllare apparecchiature esterne, il nostro computer deve avere un'interfaccia MIDI che può essere, una
scheda audio professionale, oppure una semplice soundblaster oppure ancora una qualsiasi scheda audio da 10$.
Nel caso di schede audio professionali, esistono già i connettori, dove bisogna semplicemente collegare una
estremità del cavo MIDI e l'altra estremità nello strumento che dobbiamo comandare.
Nel caso invece di schede a basso costo bisogna procurarsi un cavo convertitore che va inserito nella presa
Joystick e dall'altra parte ha connettori MIDI per connettersi ai vari strumenti.
Esistono anche schede MIDI via cavo USB, sono in commercio tantissimi modelli e costano poche decine di $.
Con il MIDI si possono fare anche vari esperimenti particolari, io ad esempio ho scritto vari programmi che girano
sotto piattaforma Android (smartphones e tablets), che inviano mediante protocollo UDP dei messaggi di controllo,
poi ho scritto con TB un'applicazione che riceve i dati UDP, li converte in MIDI e mediante driver virtuali MIDI
(MIDI Yoke NT, LoopBe1 e altri) li invia a programmi musicali come Cubase, dove posso controllare qualsiasi
parametro, tutto questo sulla rete WiFi e col latenza di 5-10 millisecondi.
Questi dati possono anche essere inviati in tempo reale alle apparecchiature musicali esterne.
Io in questo momento uso come porta virtuale MIDI Yoke NT e mi trovo bene http://www.midiox.com/
Venendo al nostro lavoro, usando le API di Windows e precisamente la libreria dinamica "winmm.dll" si può accedere
a tutte le funzionalità MIDI del sistema in uso... per chi non conosce questa libreria, consiglio vivamente di fare una
ricerca su Google, perchè permette di fare molte cose, anche gestire i formati MidiFile, streaming l'audio, streaming
video e cattura da webcam. Nei miei moduli ho messo solo le chiamate per il sistema Midi.
Per conoscere il numero di porte midi Outputs e Inputs del sistema si fa così:
numDevicesOut = midiOutGetNumDevs() 'get number of midi output devices
numDevicesIn = midiInGetNumDevs() 'get number of midi input devices
Tutte le porte midi hanno un indice, per sapere il nome di una porta ad un determinato indice si fa così:
MidiOutGetDevCaps INDEX, OutCaps, Len(OutCaps) 'get the name of midi out at INDEX of port
MidiInGetDevCaps INDEX, InCaps, Len(InCaps) 'get the name of midi in at INDEX of port
Quindi ad esempio per conoscere tutti i Midi Outs si fa così:
For i As Integer = 0 To (numDevicesOut - 1) 'for all Midi outs NOTE: index is base 0
MidiOutGetDevCaps i, OutCaps, Len(OutCaps) 'get the name of index (i) port
PrintL "Device Out " & i & ":" & $TAB & OutCaps.szPname
Next
Per aprire una determinata porta MidiOut o MidiIn si fa così:
init_MIDI_OUT(index) 'index is base 0
init_MIDI_IN(index) 'index is base 0
Ricorda che la porta precedentemente aperta MidiOut o MidiIn che sia va sempre chiusa prima di aprirne
un'altra o alla fine del programma (se si utilizza sempre quella porta) questo si può fare così:
end_MIDI_OUT '<<<=== always CLOSE the Midi Out port that you had previously opened
end_MIDI_IN '<<<=== always CLOSE the Midi In port that you had previously opened
Se si utilizza UI e si ha intenzione ad esempio di aprire una porta all'inizio del programma e chiuderla alla
fine del programma si può fare rispettivamente in %WM_INITDIALOG e in %WM_DESTROY, se invece si
desidera cambiare porta nel corso dell'esecuzione del programma allora ricordatevi di chiudere quella
precedente.
Volendo, si possono aprire più porte contemporaneamente ma bisogna essere sicuri che alla fine del
programma, tutte siano chiuse, altrimenti gli altri programmi non riescono ad accedere a una
determinata porta in quanto non è stata precedentemente chiusa. (questo è simile alla gestione porte UDP)
Allego uno zip con 3 file, ci sono i due moduli Per MidiOut e MidiIn e un semplice esempio che apre la porta 0
per suonare alcune note con le voci GeneralMidi di Windows:
-Main MidiTest.tbasic
-module MidiOut.tbasic
-module MidiIn.tbasic
Se non vi funziona dovete cambiare il numero di porta nell'istruzione
init_MIDI_OUT(0) 'if don't work change to -1 (MidiMapper) 1,2,3,4 etc......
Non sono pratico di TB ma sarebbe bello se si potesse creare una DLL e fare in modo da usare il midi in questo
modo:
Uses "MidiOut"
Uses "MidiIn"
in modo da poterle mettere nella cartella Lib insieme a tutte le altre librerie dinamiche.
Ciao a tutti, spero che questo serva a qualcuno... se avete commenti o modifichè sarò felice di ascoltarvi.
Max