Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: MIDI-tiedostojen tekeminen

ansi [21.10.2007 19:57:11]

#

Miten voi tehdä MIDI -tiedostoja iha itte VB:llä? Tai niinku antaa esim. käskyn että soita e -sävel vaikka pianolla.

Antti Laaksonen [21.10.2007 21:23:58]

#

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

ansi [24.10.2007 20:41:56]

#

Joo. Kiitos! Pitää koittaa...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta