Solved

Sending MIDI notes - polyphonic (Chords)

Posted on 2014-11-19
4
277 Views
Last Modified: 2014-11-19
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?
0
Comment
Question by:hindersaliva
  • 2
  • 2
4 Comments
 
LVL 68

Accepted Solution

by:
Qlemo earned 500 total points
Comment Utility
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
 

Author Comment

by:hindersaliva
Comment Utility
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
 
LVL 68

Expert Comment

by:Qlemo
Comment Utility
As I said :D
0
 

Author Comment

by:hindersaliva
Comment Utility
Yes. Thanks Qlemo.
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Most everyone who has done any programming in VB6 knows that you can do something in code like Debug.Print MyVar and that when the program runs from the IDE, the value of MyVar will be displayed in the Immediate Window. Less well known is Debug.Asse…
Article by: Martin
Here are a few simple, working, games that you can use as-is or as the basis for your own games. Tic-Tac-Toe This is one of the simplest of all games.   The game allows for a choice of who goes first and keeps track of the number of wins for…
This Micro Tutorial demonstrates how to create Excel charts: column, area, line, bar, and scatter charts. Formatting tips are provided as well.
This Micro Tutorial demonstrates in Microsoft Excel how to consolidate your marketing data by creating an interactive charts using form controls. This creates cool drop-downs for viewers of your chart to choose from.

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now