diff options
| author | Jake Zerrer <him@jakezerrer.com> | 2025-10-14 10:56:15 -0400 |
|---|---|---|
| committer | Jake Zerrer <him@jakezerrer.com> | 2025-10-14 14:49:17 -0400 |
| commit | a6e52696756056ccaf3a517a96b01f6756837d2f (patch) | |
| tree | 578b8743abdd6e8211d442ddd4da2367e248b4ef | |
| parent | 408d6a9f49f4ecac6abccfd993e72a44b1bc8103 (diff) | |
Toggle midi on and off
| -rw-r--r-- | .cpcache/61020924.basis | 2 | ||||
| -rw-r--r-- | .cpcache/61020924.cp | 2 | ||||
| -rw-r--r-- | .nrepl-port | 2 | ||||
| -rw-r--r-- | deps.edn | 4 | ||||
| -rw-r--r-- | src/.main.clj.swp | bin | 0 -> 16384 bytes | |||
| -rw-r--r-- | src/main.clj | 164 |
6 files changed, 131 insertions, 43 deletions
diff --git a/.cpcache/61020924.basis b/.cpcache/61020924.basis index c6372b8..1a311ef 100644 --- a/.cpcache/61020924.basis +++ b/.cpcache/61020924.basis @@ -1 +1 @@ -{:classpath {"" {:path-key :paths}, "/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar" {:lib-name org.clojure/core.cache}, "/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar" {:lib-name refactor-nrepl/refactor-nrepl}, "/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar" {:lib-name missionary/missionary}, "/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar" {:lib-name org.clojure/data.priority-map}, "/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar" {:lib-name cider/orchard}, "/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar" {:lib-name cider/cider-nrepl}, "src" {:path-key :paths}, "/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar" {:lib-name org.ow2.asm/asm}, "/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar" {:lib-name org.clojure/tools.reader}, "/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar" {:lib-name cloroutine/cloroutine}, "/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar" {:lib-name org.clojure/tools.analyzer}, "/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar" {:lib-name org.clojure/core.specs.alpha}, "/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar" {:lib-name nrepl/nrepl}, "/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar" {:lib-name mx.cider/logjam}, "/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar" {:lib-name org.clojure/clojure}, "/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar" {:lib-name org.reactivestreams/reactive-streams}, "/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar" {:lib-name org.clojure/core.memoize}, "resources" {:path-key :paths}, "/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar" {:lib-name org.clojure/tools.analyzer.jvm}, "/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar" {:lib-name org.clojure/spec.alpha}}, :basis-config {:project "deps.edn", :user "/Users/jake/.config/clojure/deps.edn", :extra {:deps {nrepl/nrepl {:mvn/version "1.3.1"}, cider/cider-nrepl {:mvn/version "0.53.2"}, refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0"}}, :aliases {:cider/nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[refactor-nrepl.middleware/wrap-refactor,cider.nrepl/cider-middleware]"]}}}, :args nil, :aliases [:cider/nrepl]}, :mvn/repos {"central" {:url "https://repo1.maven.org/maven2/"}, "clojars" {:url "https://repo.clojars.org/"}}, :argmap {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[refactor-nrepl.middleware/wrap-refactor,cider.nrepl/cider-middleware]"]}, :paths ["" "src" "resources"], :classpath-roots ["" "src" "resources" "/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar" "/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar" "/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar" "/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar" "/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar" "/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar" "/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar" "/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar" "/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar" "/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar" "/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar" "/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar" "/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar" "/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar" "/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar" "/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar" "/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar" "/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar"], :libs {org.clojure/clojure {:mvn/version "1.12.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar"]}, org.clojure/tools.analyzer {:mvn/version "1.1.1", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar"]}, org.clojure/core.specs.alpha {:mvn/version "0.4.74", :deps/manifest :mvn, :dependents [org.clojure/clojure], :parents #{[org.clojure/clojure]}, :paths ["/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar"]}, org.clojure/spec.alpha {:mvn/version "0.5.238", :deps/manifest :mvn, :dependents [org.clojure/clojure], :parents #{[org.clojure/clojure]}, :paths ["/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar"]}, mx.cider/logjam {:mvn/version "0.3.0", :exclusions #{org.clojure/clojure}, :deps/manifest :mvn, :dependents [cider/cider-nrepl], :parents #{[cider/cider-nrepl]}, :paths ["/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar"]}, cider/orchard {:mvn/version "0.31.1", :exclusions #{org.clojure/clojure}, :deps/manifest :mvn, :dependents [cider/cider-nrepl], :parents #{[cider/cider-nrepl]}, :paths ["/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar"]}, org.clojure/tools.analyzer.jvm {:mvn/version "1.2.3", :deps/manifest :mvn, :dependents [cloroutine/cloroutine], :parents #{[missionary/missionary cloroutine/cloroutine]}, :paths ["/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar"]}, cloroutine/cloroutine {:mvn/version "13", :deps/manifest :mvn, :dependents [missionary/missionary], :parents #{[missionary/missionary]}, :paths ["/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar"]}, refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar"]}, org.ow2.asm/asm {:mvn/version "9.2", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar"]}, cider/cider-nrepl {:mvn/version "0.53.2", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar"]}, missionary/missionary {:mvn/version "b.46", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar"]}, org.clojure/tools.reader {:mvn/version "1.3.6", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar"]}, org.reactivestreams/reactive-streams {:mvn/version "1.0.4", :deps/manifest :mvn, :dependents [missionary/missionary], :parents #{[missionary/missionary]}, :paths ["/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar"]}, nrepl/nrepl {:mvn/version "1.3.1", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar"]}, org.clojure/core.memoize {:mvn/version "1.0.253", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar"]}, org.clojure/data.priority-map {:mvn/version "1.1.0", :deps/manifest :mvn, :dependents [org.clojure/core.cache], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm org.clojure/core.memoize org.clojure/core.cache]}, :paths ["/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar"]}, org.clojure/core.cache {:mvn/version "1.0.225", :deps/manifest :mvn, :dependents [org.clojure/core.memoize], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm org.clojure/core.memoize]}, :paths ["/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar"]}}, :aliases {:deps {:replace-paths [], :replace-deps {org.clojure/tools.deps.cli {:mvn/version "0.11.86"}}, :ns-default clojure.tools.deps.cli.api, :ns-aliases {help clojure.tools.deps.cli.help}}, :test {:extra-paths ["test"]}, :dev {:extra-paths ["dev"]}, :cider/nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[refactor-nrepl.middleware/wrap-refactor,cider.nrepl/cider-middleware]"]}}, :deps {org.clojure/clojure {:mvn/version "1.12.0"}, missionary/missionary {:mvn/version "b.46"}, nrepl/nrepl {:mvn/version "1.3.1"}, cider/cider-nrepl {:mvn/version "0.53.2"}, refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0"}}}
\ No newline at end of file +{:classpath {"" {:path-key :paths}, "/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar" {:lib-name org.clojure/core.cache}, "/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar" {:lib-name refactor-nrepl/refactor-nrepl}, "/Users/jake/.m2/repository/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar" {:lib-name com.google.code.gson/gson}, "/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar" {:lib-name missionary/missionary}, "/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar" {:lib-name org.clojure/data.priority-map}, "/Users/jake/.m2/repository/http-kit/http-kit/2.7.0/http-kit-2.7.0.jar" {:lib-name http-kit/http-kit}, "/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar" {:lib-name cider/orchard}, "/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar" {:lib-name cider/cider-nrepl}, "/Users/jake/.m2/repository/org/clojure/data.json/2.4.0/data.json-2.4.0.jar" {:lib-name org.clojure/data.json}, "src" {:path-key :paths}, "/Users/jake/.m2/repository/org/msgpack/msgpack/0.6.12/msgpack-0.6.12.jar" {:lib-name org.msgpack/msgpack}, "/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar" {:lib-name org.ow2.asm/asm}, "/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar" {:lib-name org.clojure/tools.reader}, "/Users/jake/.m2/repository/com/cognitect/transit-clj/1.0.333/transit-clj-1.0.333.jar" {:lib-name com.cognitect/transit-clj}, "/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar" {:lib-name cloroutine/cloroutine}, "/Users/jake/.m2/repository/com/cognitect/transit-java/1.0.371/transit-java-1.0.371.jar" {:lib-name com.cognitect/transit-java}, "/Users/jake/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar" {:lib-name org.javassist/javassist}, "/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar" {:lib-name org.clojure/tools.analyzer}, "/Users/jake/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar" {:lib-name javax.activation/javax.activation-api}, "/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar" {:lib-name org.clojure/core.specs.alpha}, "/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar" {:lib-name nrepl/nrepl}, "/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar" {:lib-name mx.cider/logjam}, "/Users/jake/.m2/repository/djblue/portal/0.61.0/portal-0.61.0.jar" {:lib-name djblue/portal}, "/Users/jake/.m2/repository/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar" {:lib-name javax.xml.bind/jaxb-api}, "/Users/jake/.m2/repository/com/cognitect/transit-js/0.8.874/transit-js-0.8.874.jar" {:lib-name com.cognitect/transit-js}, "/Users/jake/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.14.2/jackson-core-2.14.2.jar" {:lib-name com.fasterxml.jackson.core/jackson-core}, "/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar" {:lib-name org.clojure/clojure}, "/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar" {:lib-name org.reactivestreams/reactive-streams}, "/Users/jake/.m2/repository/com/cognitect/transit-cljs/0.8.280/transit-cljs-0.8.280.jar" {:lib-name com.cognitect/transit-cljs}, "/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar" {:lib-name org.clojure/core.memoize}, "/Users/jake/.m2/repository/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar" {:lib-name com.googlecode.json-simple/json-simple}, "resources" {:path-key :paths}, "/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar" {:lib-name org.clojure/tools.analyzer.jvm}, "/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar" {:lib-name org.clojure/spec.alpha}}, :basis-config {:project "deps.edn", :user "/Users/jake/.config/clojure/deps.edn", :extra {:deps {nrepl/nrepl {:mvn/version "1.3.1"}, cider/cider-nrepl {:mvn/version "0.53.2"}, refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0"}}, :aliases {:cider/nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[refactor-nrepl.middleware/wrap-refactor,cider.nrepl/cider-middleware]"]}}}, :args nil, :aliases [:cider/nrepl]}, :mvn/repos {"central" {:url "https://repo1.maven.org/maven2/"}, "clojars" {:url "https://repo.clojars.org/"}}, :argmap {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[refactor-nrepl.middleware/wrap-refactor,cider.nrepl/cider-middleware]"]}, :paths ["" "src" "resources"], :classpath-roots ["" "src" "resources" "/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar" "/Users/jake/.m2/repository/djblue/portal/0.61.0/portal-0.61.0.jar" "/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar" "/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar" "/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar" "/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar" "/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar" "/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar" "/Users/jake/.m2/repository/com/cognitect/transit-clj/1.0.333/transit-clj-1.0.333.jar" "/Users/jake/.m2/repository/com/cognitect/transit-cljs/0.8.280/transit-cljs-0.8.280.jar" "/Users/jake/.m2/repository/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar" "/Users/jake/.m2/repository/http-kit/http-kit/2.7.0/http-kit-2.7.0.jar" "/Users/jake/.m2/repository/org/clojure/data.json/2.4.0/data.json-2.4.0.jar" "/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar" "/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar" "/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar" "/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar" "/Users/jake/.m2/repository/com/cognitect/transit-java/1.0.371/transit-java-1.0.371.jar" "/Users/jake/.m2/repository/com/cognitect/transit-js/0.8.874/transit-js-0.8.874.jar" "/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar" "/Users/jake/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.14.2/jackson-core-2.14.2.jar" "/Users/jake/.m2/repository/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar" "/Users/jake/.m2/repository/org/msgpack/msgpack/0.6.12/msgpack-0.6.12.jar" "/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar" "/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar" "/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar" "/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar" "/Users/jake/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar" "/Users/jake/.m2/repository/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar" "/Users/jake/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar" "/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar" "/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar"], :libs {com.cognitect/transit-java {:mvn/version "1.0.371", :deps/manifest :mvn, :dependents [com.cognitect/transit-clj], :parents #{[djblue/portal com.cognitect/transit-clj]}, :paths ["/Users/jake/.m2/repository/com/cognitect/transit-java/1.0.371/transit-java-1.0.371.jar"]}, org.clojure/data.json {:mvn/version "2.4.0", :deps/manifest :mvn, :dependents [djblue/portal], :parents #{[djblue/portal]}, :paths ["/Users/jake/.m2/repository/org/clojure/data.json/2.4.0/data.json-2.4.0.jar"]}, org.clojure/clojure {:mvn/version "1.12.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar"]}, javax.activation/javax.activation-api {:mvn/version "1.2.0", :deps/manifest :mvn, :dependents [javax.xml.bind/jaxb-api], :parents #{[djblue/portal com.cognitect/transit-clj com.cognitect/transit-java javax.xml.bind/jaxb-api]}, :paths ["/Users/jake/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar"]}, org.clojure/tools.analyzer {:mvn/version "1.1.1", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar"]}, org.clojure/core.specs.alpha {:mvn/version "0.4.74", :deps/manifest :mvn, :dependents [org.clojure/clojure], :parents #{[org.clojure/clojure]}, :paths ["/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar"]}, org.clojure/spec.alpha {:mvn/version "0.5.238", :deps/manifest :mvn, :dependents [org.clojure/clojure], :parents #{[org.clojure/clojure]}, :paths ["/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar"]}, mx.cider/logjam {:mvn/version "0.3.0", :exclusions #{org.clojure/clojure}, :deps/manifest :mvn, :dependents [cider/cider-nrepl], :parents #{[cider/cider-nrepl]}, :paths ["/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar"]}, cider/orchard {:mvn/version "0.31.1", :exclusions #{org.clojure/clojure}, :deps/manifest :mvn, :dependents [cider/cider-nrepl], :parents #{[cider/cider-nrepl]}, :paths ["/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar"]}, org.clojure/tools.analyzer.jvm {:mvn/version "1.2.3", :deps/manifest :mvn, :dependents [cloroutine/cloroutine], :parents #{[missionary/missionary cloroutine/cloroutine]}, :paths ["/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar"]}, com.googlecode.json-simple/json-simple {:mvn/version "1.1.1", :exclusions #{junit/junit}, :deps/manifest :mvn, :dependents [org.msgpack/msgpack], :parents #{[djblue/portal com.cognitect/transit-clj com.cognitect/transit-java org.msgpack/msgpack]}, :paths ["/Users/jake/.m2/repository/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar"]}, com.cognitect/transit-cljs {:mvn/version "0.8.280", :deps/manifest :mvn, :dependents [djblue/portal], :parents #{[djblue/portal]}, :paths ["/Users/jake/.m2/repository/com/cognitect/transit-cljs/0.8.280/transit-cljs-0.8.280.jar"]}, cloroutine/cloroutine {:mvn/version "13", :deps/manifest :mvn, :dependents [missionary/missionary], :parents #{[missionary/missionary]}, :paths ["/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar"]}, refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar"]}, com.fasterxml.jackson.core/jackson-core {:mvn/version "2.14.2", :deps/manifest :mvn, :dependents [com.cognitect/transit-java], :parents #{[djblue/portal com.cognitect/transit-clj com.cognitect/transit-java]}, :paths ["/Users/jake/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.14.2/jackson-core-2.14.2.jar"]}, djblue/portal {:mvn/version "0.61.0", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/djblue/portal/0.61.0/portal-0.61.0.jar"]}, org.ow2.asm/asm {:mvn/version "9.2", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar"]}, com.cognitect/transit-js {:mvn/version "0.8.874", :deps/manifest :mvn, :dependents [com.cognitect/transit-cljs], :parents #{[djblue/portal com.cognitect/transit-cljs]}, :paths ["/Users/jake/.m2/repository/com/cognitect/transit-js/0.8.874/transit-js-0.8.874.jar"]}, org.javassist/javassist {:mvn/version "3.18.1-GA", :deps/manifest :mvn, :dependents [org.msgpack/msgpack], :parents #{[djblue/portal com.cognitect/transit-clj com.cognitect/transit-java org.msgpack/msgpack]}, :paths ["/Users/jake/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar"]}, org.msgpack/msgpack {:mvn/version "0.6.12", :deps/manifest :mvn, :dependents [com.cognitect/transit-java], :parents #{[djblue/portal com.cognitect/transit-clj com.cognitect/transit-java]}, :paths ["/Users/jake/.m2/repository/org/msgpack/msgpack/0.6.12/msgpack-0.6.12.jar"]}, com.cognitect/transit-clj {:mvn/version "1.0.333", :deps/manifest :mvn, :dependents [djblue/portal], :parents #{[djblue/portal]}, :paths ["/Users/jake/.m2/repository/com/cognitect/transit-clj/1.0.333/transit-clj-1.0.333.jar"]}, cider/cider-nrepl {:mvn/version "0.53.2", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar"]}, missionary/missionary {:mvn/version "b.46", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar"]}, org.clojure/tools.reader {:mvn/version "1.3.6", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar"]}, org.reactivestreams/reactive-streams {:mvn/version "1.0.4", :deps/manifest :mvn, :dependents [missionary/missionary], :parents #{[missionary/missionary]}, :paths ["/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar"]}, nrepl/nrepl {:mvn/version "1.3.1", :deps/manifest :mvn, :parents #{[]}, :paths ["/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar"]}, org.clojure/core.memoize {:mvn/version "1.0.253", :deps/manifest :mvn, :dependents [org.clojure/tools.analyzer.jvm], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm]}, :paths ["/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar"]}, org.clojure/data.priority-map {:mvn/version "1.1.0", :deps/manifest :mvn, :dependents [org.clojure/core.cache], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm org.clojure/core.memoize org.clojure/core.cache]}, :paths ["/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar"]}, org.clojure/core.cache {:mvn/version "1.0.225", :deps/manifest :mvn, :dependents [org.clojure/core.memoize], :parents #{[missionary/missionary cloroutine/cloroutine org.clojure/tools.analyzer.jvm org.clojure/core.memoize]}, :paths ["/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar"]}, javax.xml.bind/jaxb-api {:mvn/version "2.4.0-b180830.0359", :deps/manifest :mvn, :dependents [com.cognitect/transit-java], :parents #{[djblue/portal com.cognitect/transit-clj com.cognitect/transit-java]}, :paths ["/Users/jake/.m2/repository/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar"]}, com.google.code.gson/gson {:mvn/version "2.10.1", :deps/manifest :mvn, :dependents [djblue/portal], :parents #{[djblue/portal]}, :paths ["/Users/jake/.m2/repository/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar"]}, http-kit/http-kit {:mvn/version "2.7.0", :deps/manifest :mvn, :dependents [djblue/portal], :parents #{[djblue/portal]}, :paths ["/Users/jake/.m2/repository/http-kit/http-kit/2.7.0/http-kit-2.7.0.jar"]}}, :aliases {:deps {:replace-paths [], :replace-deps {org.clojure/tools.deps.cli {:mvn/version "0.11.86"}}, :ns-default clojure.tools.deps.cli.api, :ns-aliases {help clojure.tools.deps.cli.help}}, :test {:extra-paths ["test"]}, :dev {:extra-paths ["dev"]}, :cider/nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[refactor-nrepl.middleware/wrap-refactor,cider.nrepl/cider-middleware]"]}}, :deps {org.clojure/clojure {:mvn/version "1.12.0"}, missionary/missionary {:mvn/version "b.46"}, djblue/portal {:mvn/version "0.61.0"}, nrepl/nrepl {:mvn/version "1.3.1"}, cider/cider-nrepl {:mvn/version "0.53.2"}, refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0"}}}
\ No newline at end of file diff --git a/.cpcache/61020924.cp b/.cpcache/61020924.cp index 8818d57..7081348 100644 --- a/.cpcache/61020924.cp +++ b/.cpcache/61020924.cp @@ -1 +1 @@ -:src:resources:/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar:/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar:/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar:/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar:/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar:/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar:/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar:/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar:/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar:/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar:/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar:/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar:/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar:/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar:/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar:/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar:/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar:/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar
\ No newline at end of file +:src:resources:/Users/jake/.m2/repository/cider/cider-nrepl/0.53.2/cider-nrepl-0.53.2.jar:/Users/jake/.m2/repository/djblue/portal/0.61.0/portal-0.61.0.jar:/Users/jake/.m2/repository/missionary/missionary/b.46/missionary-b.46.jar:/Users/jake/.m2/repository/nrepl/nrepl/1.3.1/nrepl-1.3.1.jar:/Users/jake/.m2/repository/org/clojure/clojure/1.12.0/clojure-1.12.0.jar:/Users/jake/.m2/repository/refactor-nrepl/refactor-nrepl/3.10.0/refactor-nrepl-3.10.0.jar:/Users/jake/.m2/repository/cider/orchard/0.31.1/orchard-0.31.1.jar:/Users/jake/.m2/repository/mx/cider/logjam/0.3.0/logjam-0.3.0.jar:/Users/jake/.m2/repository/com/cognitect/transit-clj/1.0.333/transit-clj-1.0.333.jar:/Users/jake/.m2/repository/com/cognitect/transit-cljs/0.8.280/transit-cljs-0.8.280.jar:/Users/jake/.m2/repository/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar:/Users/jake/.m2/repository/http-kit/http-kit/2.7.0/http-kit-2.7.0.jar:/Users/jake/.m2/repository/org/clojure/data.json/2.4.0/data.json-2.4.0.jar:/Users/jake/.m2/repository/cloroutine/cloroutine/13/cloroutine-13.jar:/Users/jake/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar:/Users/jake/.m2/repository/org/clojure/core.specs.alpha/0.4.74/core.specs.alpha-0.4.74.jar:/Users/jake/.m2/repository/org/clojure/spec.alpha/0.5.238/spec.alpha-0.5.238.jar:/Users/jake/.m2/repository/com/cognitect/transit-java/1.0.371/transit-java-1.0.371.jar:/Users/jake/.m2/repository/com/cognitect/transit-js/0.8.874/transit-js-0.8.874.jar:/Users/jake/.m2/repository/org/clojure/tools.analyzer.jvm/1.2.3/tools.analyzer.jvm-1.2.3.jar:/Users/jake/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.14.2/jackson-core-2.14.2.jar:/Users/jake/.m2/repository/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar:/Users/jake/.m2/repository/org/msgpack/msgpack/0.6.12/msgpack-0.6.12.jar:/Users/jake/.m2/repository/org/clojure/core.memoize/1.0.253/core.memoize-1.0.253.jar:/Users/jake/.m2/repository/org/clojure/tools.analyzer/1.1.1/tools.analyzer-1.1.1.jar:/Users/jake/.m2/repository/org/clojure/tools.reader/1.3.6/tools.reader-1.3.6.jar:/Users/jake/.m2/repository/org/ow2/asm/asm/9.2/asm-9.2.jar:/Users/jake/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar:/Users/jake/.m2/repository/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar:/Users/jake/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar:/Users/jake/.m2/repository/org/clojure/core.cache/1.0.225/core.cache-1.0.225.jar:/Users/jake/.m2/repository/org/clojure/data.priority-map/1.1.0/data.priority-map-1.1.0.jar
\ No newline at end of file diff --git a/.nrepl-port b/.nrepl-port index ca6b7b8..41bb84d 100644 --- a/.nrepl-port +++ b/.nrepl-port @@ -1 +1 @@ -49885
\ No newline at end of file +51213
\ No newline at end of file @@ -1,3 +1,5 @@ {:paths ["" "src" "resources"] - :deps {missionary/missionary {:mvn/version "b.46"}} + :deps {org.clojure/clojure {:mvn/version "1.12.0"} + missionary/missionary {:mvn/version "b.46"} + djblue/portal {:mvn/version "0.61.0"}} :aliases {:dev {:extra-paths ["dev"]}}} diff --git a/src/.main.clj.swp b/src/.main.clj.swp Binary files differnew file mode 100644 index 0000000..b91b1b6 --- /dev/null +++ b/src/.main.clj.swp diff --git a/src/main.clj b/src/main.clj index eb0e2d2..7674cc1 100644 --- a/src/main.clj +++ b/src/main.clj @@ -2,30 +2,56 @@ (: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)))))) + ;; How many times per second are output continuous values sampled and turned ;; into events? (def sample-rate (atom 30)) -(defn set-sample-rate [v] (reset! sample-rate v)) +(defn set-sample-rate + "Change the output sample rate." + [v] + (reset! sample-rate v)) -;; Temporary atom to explore the concept of note state as a continuous value (def notes-on (atom #{})) (def >notes-on (m/signal (m/watch notes-on))) -(def playback-enabled? (atom true)) +(def midi-enabled? (atom true)) -(defn enable-playback [] - (reset! playback-enabled? true)) +(defn enable-midi + "Enable midi out." + [] + (reset! midi-enabled? true)) -(defn disable-playback [] - (reset! playback-enabled? false)) +(defn disable-midi + "Stop all active notes and disable midi out." + [] + (reset! midi-enabled? false)) -(defn play-notes [& v] - (when @playback-enabled? +(defn play-notes + "Play notes." + [& v] + (when @midi-enabled? (swap! notes-on union (into #{} v)))) -(defn stop-notes [& v] - (when @playback-enabled? +(defn stop-notes + "Stop notes." + [& v] + (when @midi-enabled? (swap! notes-on difference (into #{} v)))) (def clock @@ -41,8 +67,9 @@ :tick (recur))))) -;; convert the continuous time >notes-on flow to a series of discrete midi note on and off events (def output + "Convert the continuous time >notes-on flow to a series of discrete midi note + on and off events." (m/eduction (comp (remove #(= (select-keys % [:note-on :note-off]) {:note-on #{} :note-off #{}})) (dedupe)) @@ -61,19 +88,22 @@ >notes-on clock)))) -(def toggle-playback +(def process-midi-toggle-events + "Listen for changes on midi-enabled? + When playback is disabled, send a note-off event for each active note + and then zero out notes-on." (m/ap - (let [local-playback-enabled? (atom nil) + (let [local-midi-enabled? (atom nil) local-active (atom #{}) [tag value] (m/amb= - [:playback-enabled? (m/?< (m/watch playback-enabled?))] + [:midi-enabled? (m/?< (m/watch midi-enabled?))] [:note-event (m/?< output)])] (case tag - :playback-enabled? - (let [playback-enabled? value + :midi-enabled? + (let [midi-enabled? value active @local-active] - (reset! local-playback-enabled? playback-enabled?) - (if (not playback-enabled?) + (reset! local-midi-enabled? midi-enabled?) + (if (not midi-enabled?) (do (reset! notes-on #{}) (reset! local-active #{}) @@ -85,31 +115,87 @@ (let [{:keys [active] :as note-event} value] (reset! local-active active) - (if @local-playback-enabled? + (if @local-midi-enabled? note-event (m/amb))))))) -(defonce process (atom nil)) - -(defn start-process [] - (when (not @process) - (reset! process - (do (enable-playback) - ((m/reduce prn toggle-playback) {} {}))))) +(defonce engine (atom nil)) -(defn stop-process [] - (disable-playback) - (@process) - (reset! process nil)) +(def set->midi-events + "Convert set representation of notes to midi events" + (m/ap + (let [{:keys [note-on note-off]} (m/?< process-midi-toggle-events)] + (m/amb= + (loop [notes note-on] + (if (first notes) + (m/amb [:note-on (first notes)] + (recur (rest notes))) + (m/amb))) + (loop [notes note-off] + (if (first notes) + (m/amb [:note-off (first notes)] + (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))))) + +(defn start-engine + "Start playback engine." + [] + (when (not @engine) + (reset! engine + (do (enable-midi) + ((m/reduce prn tap-flow) {} {}))))) + +(defn stop-engine + "Stop playback engine." + [] + (disable-midi) + (when @engine + (@engine) + (reset! engine nil))) (comment - (start-process) - (stop-process) - (set-sample-rate 1) - (play-notes 1 2 3 4 5) - (stop-notes 3) + (start-engine) + (play-notes 1 2 3 4 5) - (stop-notes 1 2 3 4 5) + (stop-notes 4 5) + (enable-portal-submission) + (play-notes 1 2 3 4) + + (disable-midi) + (play-notes 1 2 3 4) + (disable-portal-submission) + + (enable-midi) + (play-notes 1 2 3 4) + (play-notes 6 7 8) + (play-notes 100) - (enable-playback) - (disable-playback)) + (stop-engine)) |
