summaryrefslogtreecommitdiff
path: root/src/midi.clj
diff options
context:
space:
mode:
authorJake Zerrer <him@jakezerrer.com>2025-11-05 14:53:57 -0500
committerJake Zerrer <him@jakezerrer.com>2025-11-05 14:54:14 -0500
commit17ec1243e674e5a211eeb86d7491c63b951e4fd7 (patch)
treeefeb73b6d6ba7336c21af19f942b59c855b976b1 /src/midi.clj
parent4ae6bfb0746fc22fd48ad3a9f37ee50fa6ad0bb9 (diff)
Implement basic CC messages
Diffstat (limited to 'src/midi.clj')
-rw-r--r--src/midi.clj25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/midi.clj b/src/midi.clj
index 6aace8f..e63f811 100644
--- a/src/midi.clj
+++ b/src/midi.clj
@@ -233,17 +233,32 @@
[>messages]
(m/group-by #(.getChannel ^ShortMessage %) >messages))
+(def note-commands
+ #{ShortMessage/NOTE_OFF
+ ShortMessage/NOTE_ON
+ ShortMessage/POLY_PRESSURE})
+
(defn |notes
[>messages]
- (m/group-by #(.getData1 ^ShortMessage %) >messages
- #_
+ (m/group-by #(.getData1 ^ShortMessage %)
(m/ap
- (let [^ShortMessage v (m/?< >messages)]
- (println "V" v)
- (if (#{ShortMessage/NOTE_ON ShortMessage/NOTE_OFF} (.getCommand v))
+ (let [^ShortMessage v (m/?> >messages)]
+ (if (contains? note-commands (.getCommand v))
v
(m/amb))))))
+(def control-commands
+ #{ShortMessage/CONTROL_CHANGE})
+
+;; TODO: |control-changes and |notes combine grouping and filtering, which isn't great
+(defn |control-changes
+ [>messages]
+ (m/group-by #(.getData1 ^ShortMessage %)
+ (m/ap
+ (let [^ShortMessage v (m/?> >messages)]
+ (if (contains? control-commands (.getCommand v))
+ v
+ (m/amb))))))
#_(defn >ch-stream [>device ch]
(m/cp (m/?< (second (get >device ch)))))