annotate src/scheme/midi.scm @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents 5df24c91468d
children
rev   line source
samer@0 1 (import "samer.midi.*")
samer@1 2 (import "javax.sound.midi.*")
samer@0 3
samer@0 4 (define (tomidi in)
samer@0 5 (letrec (
samer@0 6 (nout 49) ; room for 4 octaves
samer@0 7 (patch (Matrix. "Synth" nout (.size in)))
samer@0 8 (out (VVector. "sout" nout))
samer@0 9 (trigger (Trigger. out 1.0)) ; could use Latch instead
samer@0 10 (events (.output trigger))
samer@0 11 (synth (MidiSynth. events)))
samer@0 12
samer@0 13 (addtasks
samer@0 14 (MatrixTimesVector. out patch in)
samer@0 15 trigger synth)
samer@0 16
samer@0 17 (matexec patch "load")
samer@0 18 (exec synth "open")
samer@0 19 (expose synth)
samer@0 20 synth
samer@0 21 )
samer@0 22 )
samer@0 23
samer@0 24 ; (import "javax.sound.midi.*")
samer@0 25
samer@0 26 ; (define _synth null)
samer@0 27 ; (define (synth) (set! _synth (javax.sound.midi.MidiSystem.getSynthesizer)))
samer@0 28 ; (define (c0) (vector-ref (.getChannels _synth) 0))
samer@0 29 ; (define (open) (.open _synth))
samer@0 30 ; (define (close) (.close _synth))
samer@0 31 ; (define (on pitch) (.noteOn (c0) pitch 80))
samer@0 32 ; (define (off pitch) (.noteOff (c0) pitch 0))
samer@0 33
samer@0 34
samer@0 35 ;; trigger midi events from a signal using an 2 sample window and
samer@0 36 ;; an onset map.
samer@0 37
samer@0 38 (define (midirec L)
samer@0 39 (define sigwin (SignalWindow. L 2))
samer@0 40 (define onset-map (OnsetMap. (.output sigwin)))
samer@0 41 (define rec (MidiRecorderBase.))
samer@0 42 (define imap (LinearMap. 128))
samer@0 43 (define vel-map
samer@0 44 (samer.core.util.VMap. imap (Node. "velmap")))
samer@0 45
samer@0 46 (matexec (.getBinMatrix onset-map) "load")
samer@0 47 (Shell.exposeCommands rec)
samer@0 48 (compound-task
samer@0 49 sigwin
samer@0 50 (.flushTask sigwin)
samer@0 51 onset-map
samer@0 52 (task
samer@0 53 (if (.isOnset onset-map)
samer@0 54 (.noteOn rec 0 (.clipInt imap (.get L)) 80)
samer@0 55 ; (.noteOff rec 0 64)
samer@0 56 )
samer@0 57 (.tick rec)
samer@0 58 )
samer@0 59 )
samer@0 60 )