(bind-func midi_read_msg
(let ((buffer_length 1024)
(input_buffer:PmEvent* (zalloc buffer_length))
(msg:PmMessage 0)
(timestamp:i32 0)
(read_count 0)
(i:i32 0))
(lambda ()
(set! read_count 0)
;; if you have more than one midi input device, you should call
;; Pm_Read on all your devices here
(set! read_count (Pm_Read midi_in input_buffer buffer_length))
(if (> read_count 0)
(begin
(dotimes (i read_count)
(set! msg (tref (pref-ptr input_buffer i) 0))
(set! timestamp (tref (pref-ptr input_buffer i) 1))
(cond ((= (Pm_Message_Type msg) MIDI_NOTE_ON)
(enqueue_midi_event msg timestamp)
(if (= (Pm_Message_Data2 msg) 0)
(midi_note_off timestamp
(Pm_Message_Data1 msg)
(Pm_Message_Data2 msg)
(Pm_Message_Channel msg))
(midi_note_on timestamp
(Pm_Message_Data1 msg)
(Pm_Message_Data2 msg)
(Pm_Message_Channel msg))))
((= (Pm_Message_Type msg) MIDI_NOTE_OFF)
(enqueue_midi_event msg timestamp)
(midi_note_off timestamp
(Pm_Message_Data1 msg)
(Pm_Message_Data2 msg)
(Pm_Message_Channel msg)))
((= (Pm_Message_Type msg) MIDI_CONTROL_CHANGE)
(if XTM_MIDI_CC_QUEUEING (enqueue_midi_event msg timestamp))
(midi_cc timestamp
(Pm_Message_Data1 msg)
(Pm_Message_Data2 msg)
(Pm_Message_Channel msg)))
(else
(midi_msg timestamp
(Pm_Message_Type msg)
(Pm_Message_Data1 msg)
(Pm_Message_Data2 msg)
(Pm_Message_Channel msg)
msg)))
void)
void)
void))))