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)))
|