Solved

Sending MIDI notes - polyphonic (Chords)

Posted on 2014-11-19
4
300 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 69

Accepted Solution

by:
Qlemo earned 500 total points
ID: 40453697
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
ID: 40453978
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 69

Expert Comment

by:Qlemo
ID: 40453984
As I said :D
0
 

Author Comment

by:hindersaliva
ID: 40453987
Yes. Thanks Qlemo.
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This tutorial explains how to create a series of drop-down lists that are dependent upon prior selections to guide (“force”) the user to make the correct selection and reduce data errors within Microsoft Excel. Excel 2010 was used for this tutorial;…
Workbook link problems after copying tabs to a new workbook? David Miller (dlmille) Intro Have you either copied sheets to a new workbook, and after having saved and opened that workbook, you find that there are links back to the original sou…
The viewer will learn how to create two correlated normally distributed random variables in Excel, use a normal distribution to simulate the return on different levels of investment in each of the two funds over a period of ten years, and, create a …
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.

808 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