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 SubSä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 SubJoo. Kiitos! Pitää koittaa...
Aihe on jo aika vanha, joten et voi enää vastata siihen.