Miten voi tehdä MIDI -tiedostoja iha itte VB:llä? Tai niinku antaa esim. käskyn että soita e -sävel vaikka pianolla.
MIDI-komentoja voi lähettää WinAPIn midiOut-alkuisilla funktiolla, mutta toinen juttu on, mitä komentoihin pitäisi kirjoittaa.
Tällä sivulla voi tutkia MIDI-komentoja:
http://www.midi.org/about-midi/table2.shtml
Sävelen E voi soittaa näin:
Private Declare Function midiOutOpen Lib "winmm.dll" (lphMidiOut As Long, ByVal uDeviceID As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long Private Declare Function midiOutShortMsg Lib "winmm.dll" (ByVal hMidiOut As Long, ByVal dwMsg As Long) As Long Private Declare Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As Long) As Long Private Declare Function timeGetTime Lib "winmm.dll" () As Long Dim s As Long Sub Odota(aika As Long) Dim alku As Long alku = timeGetTime While alku + aika > timeGetTime DoEvents Wend End Sub Private Sub Form_Load() midiOutOpen s, 0, 0, 0, 0 ' 30 = nuotin voimakkuus ' 40 = sävel E ' 90 = nuotin aloitus kanavalla 1 midiOutShortMsg s, &H304090 Odota 1000 ' 30 = nuotin voimakkuus ' 40 = sävel E ' 80 = nuotin lopetus kanavalla 1 midiOutShortMsg s, &H304080 midiOutClose s End Sub
Sävelissä yksi kokonaisluku tarkoittaa yhtä puolisävelaskelta. Esim. kun sävel 40 on E, sävel 41 on F ja 43 on G.
Tässä on pitempi ohjelma, joka soittaa kokonaisen kappaleen, nimittäin Ukko Noan:
Private Declare Function midiOutOpen Lib "winmm.dll" (lphMidiOut As Long, ByVal uDeviceID As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long Private Declare Function midiOutShortMsg Lib "winmm.dll" (ByVal hMidiOut As Long, ByVal dwMsg As Long) As Long Private Declare Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As Long) As Long Private Declare Function timeGetTime Lib "winmm.dll" () As Long Dim s As Long Sub Odota(aika As Long) Dim alku As Long alku = timeGetTime While alku + aika > timeGetTime DoEvents Wend End Sub Sub SoitaNuotti(nuotti As Integer, pituus As Long) midiOutShortMsg s, &H300090 + (&H3C + nuotti) * &H100 Odota pituus midiOutShortMsg s, &H300080 + (&H3C + nuotti) * &H100 End Sub Private Sub Form_Load() midiOutOpen s, 0, 0, 0, 0 SoitaNuotti 0, 200 SoitaNuotti 0, 200 SoitaNuotti 0, 200 SoitaNuotti 4, 200 SoitaNuotti 2, 200 SoitaNuotti 2, 200 SoitaNuotti 2, 200 SoitaNuotti 5, 200 SoitaNuotti 4, 200 SoitaNuotti 4, 200 SoitaNuotti 2, 200 SoitaNuotti 2, 200 SoitaNuotti 0, 400 midiOutClose s End Sub
Joo. Kiitos! Pitää koittaa...
Aihe on jo aika vanha, joten et voi enää vastata siihen.