Sending MIDI notes - polyphonic (Chords)

This is a follow up to my earlier question (closed) here
http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_28562826.html

I got it to play single notes, thanks to Qlemo.
The notes play one-after-the-other. ie. monophonically. I'd like to play several notes at the same time (polyphonic). So I did this to test (lines 10 and 11)

Sub PlayMIDI(voiceNum, noteNum, Duration)
    Dim Note As Long
    Dim i As Integer
    
    On Error Resume Next
    midiOutShortMsg hMidiOut, RGB(192, voiceNum - 1, 127)
    lanote = 0 + CLng(noteNum)

    midiOutShortMsg hMidiOut, RGB(144, lanote, 127)
    midiOutShortMsg hMidiOut, RGB(144, lanote + 3, 127)
    midiOutShortMsg hMidiOut, RGB(144, lanote + 5, 127)
    
    Sleep (Duration)
    midiOutShortMsg hMidiOut, RGB(128, lanote, 127)
    
 End Sub

Open in new window


And yes, it plays a chord. But if I fire off individual notes by calling that sub on each note the next note doesn't start until the previous one has ended.

It's the same if I comment out the Note Off event
    midiOutShortMsg hMidiOut, RGB(128, lanote, 127)

So what I'm after is, to be able to fire off a Note via a Sub as above but for the Notes playing to continue until the Note Off event.

Does anyone know how please?
hindersalivaAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

QlemoBatchelor, Developer and EE Topic AdvisorCommented:
I'm sorry to tell you that, but you can't do that with Excel, at least with reasonable effort.
Sequencers and Synths are doing that by putting each note with duration into a queue when played, and decrement the duration by one quantum on each run thru the player loop. If duration hits zero, a Note Off is sent.

This sub however plays something, and waits until the duration has passed (sleep). Then sends a Note Off. Then returns to the caller, allowing to play another note.

Also remember that the duration in the Excel example is the note length, not the duration of the sound. The sound of a snare drum hit is very short, no matter how long you "play" that note, to use an extreme example.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
hindersalivaAuthor Commented:
Hey, I got it to work.

I have a counter that counts each tick. That's measure > beat > tick. See?

Sub PlayMIDIList()

    Dim iMeasure As Integer
    Dim iBeat As Integer
    Dim iTick As Integer
    Dim strSongPosition As String
    Dim iRow As Integer
    Dim intMsg As Integer
    Dim intNote As Integer
    Dim intVelocity As Integer
    
    On Error Resume Next
    
    midiOutOpen hMidiOut, 0, 0, 0, 0

    For iMeasure = 1 To 16
        For iBeat = 1 To 4
            For iTick = 1 To 384
                strSongPosition = Trim(Str(iMeasure)) + "." + Trim(Str(iBeat)) + "." + Trim(Str(iTick))

                For iRow = 6 To 50
                    If Cells(iRow, 2).Value = strSongPosition Then
                        intMsg = Cells(iRow, 3).Value       'Note on/Note off
                        intNote = Cells(iRow, 5).Value      'Note no
                        intVelocity = 127                   'Key velocity (=volume)
                        midiOutShortMsg hMidiOut, RGB(intMsg, intNote, intVelocity)

                    End If
                Next iRow

            Next iTick
        Next iBeat
    Next iMeasure
    
    midiOutClose hMidiOut
   
 End Sub

Open in new window


My MIDI data looks like this

SongPosition      Msg      Voice      Note
1.1.1              144      1              60
3.2.1              144      1              64
8.4.38              128      1              64
8.1.384              128      1              60
10.1.1              144      1              70
10.1.1              144      1              74
10.1.1              144      1              77
14.1.380              128      1              70
14.1.380              128      1              74
14.1.380              128      1              77
0
QlemoBatchelor, Developer and EE Topic AdvisorCommented:
As I said :D
0
hindersalivaAuthor Commented:
Yes. Thanks Qlemo.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic Classic

From novice to tech pro — start learning today.