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