summaryrefslogtreecommitdiff
path: root/src/unheard/theory.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/unheard/theory.clj')
-rw-r--r--src/unheard/theory.clj46
1 files changed, 31 insertions, 15 deletions
diff --git a/src/unheard/theory.clj b/src/unheard/theory.clj
index d63532f..e9e4ad5 100644
--- a/src/unheard/theory.clj
+++ b/src/unheard/theory.clj
@@ -1,28 +1,44 @@
(ns unheard.theory
(:require [missionary.core :as m]
+ [unheard.time-object :refer [time-object]]
[clojure.set :refer [union]]))
-(defn note [>clock start duration >value]
- (m/cp
- (let [[c v] (m/?< (m/latest vector >clock >value))]
- (if (<= start c (dec (+ start duration)))
- #{v}
- #{}))))
+(defn note
+ [>clock start duration >value]
+ (time-object start
+ duration
+ (m/cp (let [[c v] (m/?< (m/latest vector >clock >value))]
+ (if (<= start c (dec (+ start duration))) #{v} #{})))))
-(defn poly [& notes]
- (m/signal
- (m/cp
- (apply union (m/?< (apply m/latest vector notes))))))
+(comment
+ (require '[unheard.time-object :refer [lift phrase timeline point-query]])
+ (def c (atom 0))
+ (def >c (m/signal (m/watch c)))
+ (def v (atom 0))
+ (def >v (m/watch v))
+ (def n (note >c 4 8 >v))
+ (def song (phrase (lift n)))
+ (def t (timeline (song 0)))
+ (def r (point-query t >c))
+ (def cancel ((m/reduce prn nil r) prn prn))
+ (cancel)
+ (swap! c dec)
+ (swap! c inc)
+ (swap! v inc)
+ (swap! v dec))
+
+(defn poly
+ [& notes]
+ (m/signal (m/cp (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 #{})))))
+ (m/cp (let [content (m/signal content)]
+ (if (m/?< (m/latest #(<= start % end) clock))
+ (m/?< content)
+ (m/amb #{})))))
;; TODO:
;; - Note literals turn into numbers