diff options
| author | Jake Zerrer <him@jakezerrer.com> | 2025-11-05 14:53:57 -0500 |
|---|---|---|
| committer | Jake Zerrer <him@jakezerrer.com> | 2025-11-05 14:54:14 -0500 |
| commit | 17ec1243e674e5a211eeb86d7491c63b951e4fd7 (patch) | |
| tree | efeb73b6d6ba7336c21af19f942b59c855b976b1 /src | |
| parent | 4ae6bfb0746fc22fd48ad3a9f37ee50fa6ad0bb9 (diff) | |
Implement basic CC messages
Diffstat (limited to 'src')
| -rw-r--r-- | src/midi.clj | 25 | ||||
| -rw-r--r-- | src/scratch.clj | 51 |
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)) |
