summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/midi.clj25
-rw-r--r--src/scratch.clj51
2 files changed, 42 insertions, 34 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)))))
diff --git a/src/scratch.clj b/src/scratch.clj
index 43a3df0..63d54a3 100644
--- a/src/scratch.clj
+++ b/src/scratch.clj
@@ -2,7 +2,7 @@
(:require [midi :refer [print-all-midi-devices >bus <bus] :as midi]
[missionary.core :as m])
- (:import [javax.sound.midi MidiSystem Receiver ShortMessage MidiDevice$Info MidiDevice Transmitter MidiMessage]))
+ (:import [javax.sound.midi ShortMessage]))
#_(print-all-midi-devices)
@@ -11,36 +11,29 @@
(def run
(<bus
midi-keyboard
- #_(fn [f] (m/ap
- (let [[i]]
- (m/group-by #(.getCh %)))
- (println (m/?< f))))
(fn [f]
(m/ap
- (let [[ch ch-messages]
- (m/?> 128 (midi/|channels (midi/|short-messages f)))
- [note note-messages] (m/?> 128 (midi/|notes ch-messages))]
- (println
- [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 [[ch >ch-messages]
- (m/?> 128 (midi/|channels (midi/|short-messages f)))
- #_#_[note >note-messages]
- (m/?> 128 (midi/|notes >ch-messages))]
- (println "CH" ch)
- #_#_(println "HELLO")
- [ch note (m/?< >note-messages)])))))
+ (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))