Platforms to show: All Mac Windows Linux Cross-Platform

/Audio/PortMidi


Required plugins for this example: MBS Audio Plugin

You find this example project in your Plugins Download as a Xojo project file within the examples folder: /Audio/PortMidi

This example is the version from Tue, 23th May 2016.

Project "PortMidi.xojo_binary_project"
Class MainWindow Inherits Window
Control ListBox1 Inherits ListBox
ControlInstance ListBox1 Inherits ListBox
EventHandler Sub Change() if me.ListIndex<0 then ReadButton.Enabled=False WriteButton.Enabled=false else if me.Cell(me.ListIndex,2)="yes" then ReadButton.Enabled=true else ReadButton.Enabled=False end if if me.Cell(me.ListIndex,3)="yes" then WriteButton.Enabled=true else WriteButton.Enabled=False end if end if End EventHandler
End Control
Control ReadButton Inherits PushButton
ControlInstance ReadButton Inherits PushButton
EventHandler Sub Action() dim i as integer i=val(ListBox1.Cell(ListBox1.ListIndex,4)) OpenReadDevice i,ListBox1.Cell(ListBox1.ListIndex,0) End EventHandler
End Control
Control WriteButton Inherits PushButton
ControlInstance WriteButton Inherits PushButton
EventHandler Sub Action() dim i as integer i=val(ListBox1.Cell(ListBox1.ListIndex,4)) OpenWriteDevice i,ListBox1.Cell(ListBox1.ListIndex,0) End EventHandler
End Control
Control WriteButton1 Inherits PushButton
ControlInstance WriteButton1 Inherits PushButton
EventHandler Sub Action() dim i as integer dim c as integer = WindowCount-1 dim w as window // close other windows so portmidi is not used. for i=c DownTo 0 w = window(c) if w isa MainWindow then // ignore else w.Close end if next dim e as integer = p.ReInitialize if e=0 then // ok else MsgBox "Error: "+str(e) end if run End EventHandler
End Control
EventHandler Sub Open() p=new PortMidiMBS me.show me.run End EventHandler
Protected Sub OpenReadDevice(DeviceID as integer, Name as string) // Open the device for reading dim p as PortMidiMBS dim s as PortMidiStreamMBS dim e as integer // filter active sensing messages (&hFE): */ const PM_FILT_ACTIVE= &h1 // filter system exclusive messages (&hF0): */ const PM_FILT_SYSEX= &h2 // filter clock messages (&hF8 only, does not filter clock start, etc.): */ const PM_FILT_CLOCK= &h4 // filter play messages (start= &hFA, stop= &hFC, continue= &hFB) */ const PM_FILT_PLAY= &h8 // filter undefined F9 messages (some equipment uses this as a 10ms 'tick') */ const PM_FILT_F9= &h10 const PM_FILT_TICK = PM_FILT_F9 // filter undefined FD messages */ const PM_FILT_FD= &h20 // filter undefined real-time messages */ const PM_FILT_UNDEFINED = &h30 // (PM_FILT_F9 | PM_FILT_FD) // filter reset messages (&hFF) */ const PM_FILT_RESET= &h40 // filter all real-time messages */ const PM_FILT_REALTIME = &h7F // (PM_FILT_ACTIVE | PM_FILT_SYSEX | PM_FILT_CLOCK | PM_FILT_PLAY | PM_FILT_UNDEFINED | PM_FILT_RESET) // filter note-on and note-off (&h90-&h9F and= &h80-&h8F */ const PM_FILT_NOTE= &h80 // filter channel aftertouch (most midi controllers use this) (&hD0-&hDF)*/ const PM_FILT_CHANNEL_AFTERTOUCH= &h100 // per-note aftertouch (&hA0-&hAF) */ const PM_FILT_POLY_AFTERTOUCH= &h200 // filter both channel and poly aftertouch */ const PM_FILT_AFTERTOUCH = &h300 // (PM_FILT_CHANNEL_AFTERTOUCH | PM_FILT_POLY_AFTERTOUCH) // Program changes (&hC0-&hCF) */ const PM_FILT_PROGRAM= &h400 // Control Changes (CC's) (&hB0-&hBF)*/ const PM_FILT_CONTROL= &h800 // Pitch Bender (&hE0-&hEF*/ const PM_FILT_PITCHBEND= &h1000 // MIDI Time Code (&hF1)*/ const PM_FILT_MTC= &h2000 // Song Position (&hF2) */ const PM_FILT_SONG_POSITION= &h4000 // Song Select (&hF3)*/ const PM_FILT_SONG_SELECT= &h8000 // Tuning request (&hF6)*/ const PM_FILT_TUNE= &h10000 // All System Common messages (mtc, song position, song select, tune request) */ const PM_FILT_SYSTEMCOMMON = &h1E000 // (PM_FILT_MTC | PM_FILT_SONG_POSITION | PM_FILT_SONG_SELECT | PM_FILT_TUNE) s=new PortMidiStreamMBS e=s.OpenInput(DeviceID,100) if e=0 then 'e=s.SetFilter(&hFFFFF) ReadWindow.Show ReadWindow.Title="Read from "+name ReadWindow.p=p ReadWindow.s=S else MsgBox "OpenInput returns "+str(e) end if End Sub
Protected Sub OpenWriteDevice(DeviceID as integer, Name as string) // Open the device for reading dim p as PortMidiMBS dim s as PortMidiStreamMBS dim e as integer s=new PortMidiStreamMBS e=s.OpenOutput(DeviceID,10000,100) if e=0 then 'e=s.SetFilter(&hFFFFF) WriteWindow.Show WriteWindow.Title="Write to "+name WriteWindow.p=p WriteWindow.s=S else MsgBox "OpenOutput returns "+str(e) end if End Sub
Sub run() dim i,c as integer dim info as PortMidiDeviceInfoMBS dim s as string ListBox1.DeleteAllRows // Show the device list c=p.CountDevices-1 for i=0 to c info=p.DeviceInfo(i) if info<>Nil then ListBox1.AddRow info.Name ListBox1.Cell(ListBox1.LastIndex,1)=info.InterfaceName if info.HasInput then s="yes" else s="no" end if ListBox1.Cell(ListBox1.LastIndex,2)=s if info.HasOutput then s="yes" else s="no" end if ListBox1.Cell(ListBox1.LastIndex,3)=s ListBox1.Cell(ListBox1.LastIndex,4)=str(i) end if next End Sub
Property Protected p As PortMidiMBS
End Class
MenuBar Menu
MenuItem UntitledMenu3 = ""
MenuItem UntitledMenu2 = "File"
MenuItem FileQuit = "Quit"
MenuItem FileClose = "Close"
MenuItem UntitledMenu0 = "Edit"
MenuItem EditUndo = "Undo"
MenuItem UntitledMenu1 = "-"
MenuItem EditCut = "Cut"
MenuItem EditCopy = "Copy"
MenuItem EditPaste = "Paste"
MenuItem EditClear = "Clear"
End MenuBar
Class App Inherits Application
EventHandler Sub Open() MainWindow.Show End EventHandler
End Class
Class ReadWindow Inherits Window
Control ListBox1 Inherits ListBox
ControlInstance ListBox1 Inherits ListBox
End Control
Control Timer1 Inherits Timer
ControlInstance Timer1 Inherits Timer
EventHandler Sub Action() Run End EventHandler
End Control
Function FileClose() As Boolean close Return true End Function
Protected Sub Run() dim d as PortMidiEventMBS dim e as integer while s.Poll<>0 e=s.Read(d) System.DebugLog "Read "+str(e) if e=1 then ListBox1.AddRow Format(d.When,"0") ListBox1.Cell(ListBox1.LastIndex,1)=str(d.Status) ListBox1.Cell(ListBox1.LastIndex,2)=str(d.Data1) ListBox1.Cell(ListBox1.LastIndex,3)=str(d.Data2) end if wend End Sub
Property p As PortMidiMBS
Property s As PortMidiStreamMBS
End Class
Class WriteWindow Inherits Window
Control Bevel Inherits BevelButton
ControlInstance Bevel(0) Inherits BevelButton
ControlInstance Bevel(1) Inherits BevelButton
ControlInstance Bevel(2) Inherits BevelButton
ControlInstance Bevel(3) Inherits BevelButton
ControlInstance Bevel(4) Inherits BevelButton
ControlInstance Bevel(5) Inherits BevelButton
ControlInstance Bevel(6) Inherits BevelButton
ControlInstance Bevel(7) Inherits BevelButton
ControlInstance Bevel(8) Inherits BevelButton
ControlInstance Bevel(9) Inherits BevelButton
ControlInstance Bevel(10) Inherits BevelButton
ControlInstance Bevel(11) Inherits BevelButton
EventHandler Function MouseDown(X As Integer, Y As Integer) As Boolean me.Value=true SendNoteOn index Return true End EventHandler
EventHandler Function MouseUp(X As Integer, Y As Integer) As Boolean me.Value=false SendNoteOff index Return true End EventHandler
End Control
Control StaticText1 Inherits Label
ControlInstance StaticText1 Inherits Label
End Control
Control StaticText2 Inherits Label
ControlInstance StaticText2 Inherits Label
End Control
Control PopupMenu1 Inherits PopupMenu
ControlInstance PopupMenu1 Inherits PopupMenu
End Control
Control StaticText3 Inherits Label
ControlInstance StaticText3 Inherits Label
End Control
Control Slider1 Inherits Slider
ControlInstance Slider1 Inherits Slider
EventHandler Sub ValueChanged() StaticText4.text=str(me.Value) End EventHandler
End Control
Control StaticText4 Inherits Label
ControlInstance StaticText4 Inherits Label
End Control
Control StaticText5 Inherits Label
ControlInstance StaticText5 Inherits Label
End Control
Control StaticText6 Inherits Label
ControlInstance StaticText6 Inherits Label
End Control
Function FileClose() As Boolean close Return true End Function
Function GetOffset() As integer Return PopupMenu1.ListIndex*12 End Function
Function GetVelocity() As integer Return Slider1.Value End Function
Sub SendNoteOff(noteValue as integer) dim d as PortMidiEventMBS dim e as integer d=new PortMidiEventMBS d.Set &h80, noteValue + GetOffset,GetVelocity e=s.Write(d) StaticText6.text=Str(e) End Sub
Sub SendNoteOn(noteValue as integer) dim d as PortMidiEventMBS dim e as integer d=new PortMidiEventMBS d.Set &h90, noteValue + GetOffset,GetVelocity e=s.Write(d) StaticText6.text=Str(e) End Sub
Property p As PortMidiMBS
Property s As PortMidiStreamMBS
End Class
End Project

The items on this page are in the following plugins: MBS Audio Plugin.


The biggest plugin in space...