diff options
| author | Jake Zerrer <him@jakezerrer.com> | 2025-10-14 14:49:31 -0400 |
|---|---|---|
| committer | Jake Zerrer <him@jakezerrer.com> | 2025-10-14 16:19:03 -0400 |
| commit | 756b4e6ceb360e8d5e93a2bde712aa46cda61d85 (patch) | |
| tree | d4d532f8efd196b25feacdba44d659120904bd5f /src | |
| parent | a6e52696756056ccaf3a517a96b01f6756837d2f (diff) | |
Capture flow to portal
Diffstat (limited to 'src')
| -rw-r--r-- | src/.main.clj.swp | bin | 16384 -> 0 bytes | |||
| -rw-r--r-- | src/main.clj | 74 |
2 files changed, 23 insertions, 51 deletions
diff --git a/src/.main.clj.swp b/src/.main.clj.swp Binary files differdeleted file mode 100644 index b91b1b6..0000000 --- a/src/.main.clj.swp +++ /dev/null diff --git a/src/main.clj b/src/main.clj index 7674cc1..d3f7ce0 100644 --- a/src/main.clj +++ b/src/main.clj @@ -1,22 +1,7 @@ (ns main (:require [missionary.core :as m] - [clojure.set :refer [difference union]])) - -(def >portal - (m/signal - (m/ap - (try - (m/?< - (m/observe - (fn [cb] - ((m/via m/blk ((requiring-resolve 'portal.api/open))) {} {}) - (cb :open) - (fn [] - ((m/via m/blk - ((requiring-resolve 'portal.api/close)) - ((requiring-resolve 'portal.api/clear))) {} {}))))) - (catch missionary.Cancelled _ - (m/amb)))))) + [clojure.set :refer [difference union]] + [portal :refer [>portal-main rec show-portal hide-portal +cap -cap cap]])) ;; How many times per second are output continuous values sampled and turned ;; into events? @@ -28,9 +13,11 @@ (reset! sample-rate v)) (def notes-on (atom #{})) -(def >notes-on (m/signal (m/watch notes-on))) +(def >notes-on (rec :notes-set (m/signal (m/watch notes-on)))) (def midi-enabled? (atom true)) +(def >midi-enabled? (rec :midi-enabled? + (m/signal (m/watch midi-enabled?)))) (defn enable-midi "Enable midi out." @@ -62,8 +49,9 @@ ;; TODO: Currently, there will be latency when changing the sample rate ;; due to having to wait for the most recent sleep to complete ;; Update clock to be reactive on sample-rate, too - (m/? - (m/sleep (/ 1000 @sample-rate))) + (do (m/? + (m/sleep (/ 1000 @sample-rate))) + (m/amb)) :tick (recur))))) @@ -96,7 +84,7 @@ (let [local-midi-enabled? (atom nil) local-active (atom #{}) [tag value] (m/amb= - [:midi-enabled? (m/?< (m/watch midi-enabled?))] + [:midi-enabled? (m/?< >midi-enabled?)] [:note-event (m/?< output)])] (case tag :midi-enabled? @@ -137,33 +125,9 @@ (recur (rest notes))) (m/amb))))))) -(def enable-portal-submission? (atom false)) -(def >enable-portal-submission? (m/watch enable-portal-submission?)) - -(defn enable-portal-submission [] - (reset! enable-portal-submission? true)) - -(defn disable-portal-submission [] - (reset! enable-portal-submission? false)) - -(def tap-flow - (m/ap - (let [local-enable-portal-submission? (atom nil) - [tag value] - (m/amb= [:enable-portal-submission? (m/?< >enable-portal-submission?)] - [:event (m/?< set->midi-events)])] - (case tag - :enable-portal-submission? - (do - (reset! local-enable-portal-submission? value) - (when value - (m/?< >portal)) - (m/amb)) - :event - (do - (when @local-enable-portal-submission? - (m/? (m/via m/blk ((requiring-resolve 'portal.api/submit) value)))) - value))))) +(def main + (m/ap (m/amb= (m/?< (rec :root set->midi-events)) + (m/?< >portal-main)))) (defn start-engine "Start playback engine." @@ -171,7 +135,7 @@ (when (not @engine) (reset! engine (do (enable-midi) - ((m/reduce prn tap-flow) {} {}))))) + ((m/reduce {} {} main) {} {}))))) (defn stop-engine "Stop playback engine." @@ -184,14 +148,22 @@ (comment (start-engine) + (cap) + + (+cap :root :notes-set) + + (show-portal) + (play-notes 1 2 3 4 5) (stop-notes 4 5) - (enable-portal-submission) + (play-notes 1 2 3 4) + (-cap :root) + (disable-midi) (play-notes 1 2 3 4) - (disable-portal-submission) + (hide-portal) (enable-midi) (play-notes 1 2 3 4) |
