(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)))))))