summaryrefslogtreecommitdiff
path: root/src/unheard/dsl.clj
blob: d2bb2862836d7f8872c49275d6c3402b8836d571 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
(ns unheard.dsl
  (:require [missionary.core :as m]
            [clojure.set :refer [union]]))

(comment
  ;; Parallel groups. Notes 1, 2, and 3 simultaneously = should remind you
  ;; of amb= implicit duration of 1
  [= 1 2 3]
  ;; Compiles to? Same as above, but with duration 3
  ([= 1 2 3] 3)
  ;; Notes 1, 2, and 3 all with different durations
  [= (1 2) (2 3) (3 4)]
  ;; Inner values override outer values. In this chord, 1 would have a
  ;; duration of 3 while 2 and 3 would have a duration of 2
  ([= (1 3) 2 3] 2)
  ;; Notes 1, 2, and 3 all with different durations and velocities
  [= (1 2 100) (2 3 110) (3 4 123)]
  ;; Sequential groups. Note 1, then note 2, then note 3
  [1 2 3]
  ;; Note 1 duration 1, then note 2 duration 2, then note 3 duration 1
  [(1 1) (2 2) (3 1)]
  ;; Three chords played sequentially
  [[= 1 2 3] [= 1 2 3] [= 1 2 3]]
  ;; Note 1, followed by a rest, followed by note 3
  [1 (r) 3]
  ;; Unlike notes, rests are at most 2-tuples
  ;; (Think about it: Rests never have a note value)
  ;; Assign the note sequence 1 2 3 to the name loop1. The first argument
  ;; is always the name; the last argument is always either
  ;; a sequential or parallel group
  (=loop1 [1 2 3])
  ;; Use loop1
  [1 (loop1) 2 3]
  ;; Middle arguments are variable names
  (=loop2 dur ([1 2 3] dur)))