summaryrefslogtreecommitdiff
path: root/src/scratch.clj
blob: 63d54a3360697b92095730b1a4df005393aa6359 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
(ns scratch
  (:require [midi :refer [print-all-midi-devices >bus <bus] :as midi]
            [missionary.core :as m])

  (:import [javax.sound.midi ShortMessage]))

#_(print-all-midi-devices)

(def midi-keyboard  "CoreMIDI4J - Minilab3 MIDI")

(def run
  (<bus
   midi-keyboard
   (fn [f]
     (m/ap
       (let [[ch ch-messages]
             (m/?> 128 (midi/|channels (midi/|short-messages (m/stream f))))
             ch-messages (m/stream ch-messages)]
         (println
          (m/amb=
           (let [[note note-messages] (m/?> 128 (midi/|notes ch-messages))]
             [:key ch note
              (m/?<
               (m/relieve
                (m/reductions
                 (fn [_prev curr]
                   (when (some? curr)
                     (cond
                       (= (.getCommand ^ShortMessage curr) ShortMessage/NOTE_ON)
                       (.getData2 ^ShortMessage curr)
                       (= (.getCommand ^ShortMessage curr) ShortMessage/POLY_PRESSURE)
                       (.getData2 ^ShortMessage curr)
                       (= (.getCommand ^ShortMessage curr) ShortMessage/NOTE_OFF)
                       nil))) nil note-messages)))])
           (let [[control-number control-messages] (m/?> 128 (midi/|control-changes ch-messages))]
             [:control ch control-number (.getData2 ^ShortMessage (m/?< control-messages))]))))))))

(def cancel
  (run prn prn))
(cancel)