midi_in.bmx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. SuperStrict
  2. Framework Audio.Midi
  3. Import BRL.StandardIO
  4. Import BRL.GLMax2d
  5. Import BRL.LinkedList
  6. Const MAX_MESSAGES:Int = 30
  7. Global messages:TList = New TList
  8. Local midiIn:TMidiIn = New TMidiIn.Create()
  9. ' Check available ports.
  10. If midiIn.getPortCount() = 0 Then
  11. Print "No Input Ports"
  12. End
  13. End If
  14. For Local i:Int = 0 Until midiIn.getPortCount()
  15. Print " Input port #" + i + " : " + midiIn.getPortName(i)
  16. Next
  17. Print "Opening " + midiIn.getPortName()
  18. midiIn.openPort(0)
  19. ' Don't ignore sysex, timing, or active sensing messages.
  20. midiIn.ignoreTypes(False, False, False)
  21. ' Periodically check input queue.
  22. Print "Reading MIDI from port ... quit with ESCAPE."
  23. Graphics 800, 600, 0
  24. Local stamp:Double
  25. While Not KeyDown(KEY_ESCAPE)
  26. Cls
  27. DrawText "Reading MIDI from port ... quit with ESCAPE.", 60, 10
  28. Local message:Byte[] = midiIn.getMessage(stamp)
  29. Local nBytes:Int = message.length
  30. Local s:String
  31. For Local i:Int = 0 Until nBytes
  32. s :+ "Byte " + i + " = " + message[i] + ", "
  33. Next
  34. If nBytes > 0 Then
  35. s :+ "stamp = " + stamp
  36. End If
  37. If s Then
  38. Print s
  39. AddMessage(s)
  40. End If
  41. ShowMessages(10, 30)
  42. Delay (10)
  43. Flip
  44. Wend
  45. midiIn.Free()
  46. End
  47. Function ShowMessages(x:Int, y:Int)
  48. For Local message:String = EachIn messages
  49. DrawText message, x, y
  50. y:+ 15
  51. Next
  52. End Function
  53. Function AddMessage(message:String)
  54. Local count:Int = messages.Count()
  55. If count >= MAX_MESSAGES Then
  56. messages.RemoveFirst()
  57. End If
  58. messages.AddLast(message)
  59. End Function