diff options
Diffstat (limited to 'src/unheard/theory.clj')
| -rw-r--r-- | src/unheard/theory.clj | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/unheard/theory.clj b/src/unheard/theory.clj new file mode 100644 index 0000000..5d5805b --- /dev/null +++ b/src/unheard/theory.clj @@ -0,0 +1,34 @@ +(ns unheard.theory + (:require [missionary.core :as m] + [clojure.set :refer [union]])) + +(defn note [clock start duration value] + (m/cp + (if (m/?< (m/latest #(<= start % (dec (+ start duration))) clock)) + #{value} + #{}))) + +(defn poly [& notes] + (m/ap + (apply union (m/?< (apply m/latest vector notes))))) + +;; TODO: Group could actually wrap note, rather than using explicitly +;; WIll introduce a lot of GC churn, though +(defn group + [clock start end content] + (m/cp + (let [content (m/signal content)] + (if (m/?< (m/latest #(<= start % end) clock)) + (m/?< content) + (m/amb #{}))))) + +;; TODO: +;; - Note literals turn into numbers +;; - Represent keyboard as byte array of shorts +;; - play a note increments, stop a note decrements +;; - Multiple instruments +;; - Mapping inputs to vars +;; - Inputs get declared at the top of a track +;; - Devices get mapped to declared inputs +;; - Notion of scenes that change mapping of inputs to vars +;; - Loops |
