alsa rawmidi example added by evhan on Tue Aug 7 14:23:39 2012

(module alsa-rawmidi (play-midi)
  (import scheme chicken foreign)
  (use srfi-4 srfi-18 lazy-ffi)

  #~"libasound.so"

  (define note-on  #x90)
  (define note-off #x80)

  (define 0<=n<=127
    (lambda (n) (min 127 (max 0 n))))

  (define play-midi
    (let ((connection #f))
      (let-location ((connection-ptr c-pointer))
        (#~snd_rawmidi_open pointer: #f (location connection-ptr) "virtual" 0)
        (set! connection connection-ptr))
      (on-exit
        (lambda ()
          (#~snd_rawmidi_close connection)))
      (lambda (channel pitch volume duration)
        (#~snd_rawmidi_write
          connection
          (u8vector
            (bitwise-ior channel note-on)
            (0<=n<=127 pitch)
            (0<=n<=127 volume))
          3)
        (thread-start!
          (lambda ()
            (thread-sleep! duration)
            (#~snd_rawmidi_write
              connection
              (u8vector
                (bitwise-ior channel note-off)
                (0<=n<=127 pitch)
                (0<=n<=127 volume))
              3)))))))