-- Computer Riddim!#
-- Following instructions in http://studio.dubroom.org/tutorials-computerdub15.htm
-- Skipped: Chap 18 (Why?)
-- Skipped: Chap 21 (Too complex, rather live synth)
-- TODO: Chap 22 - From reggae to dub

do
-- region Nova Utils
let gG a = (gain ("^77" * a * 1.5)) -- gain Global
let gM' l h a = (gG (range l h a)) -- gain Modéré
let gM a = (gM' 0.2 0.8 a) -- gain Modéré doux
let gLPF = (# lpf (min 10000 ((range 200 20000 ("^49")))))
let gHPF = (# hpf (max 0 (min 7500 ((range "-7500" 7500 ("^49"))))))
let gDJF = (gLPF . gHPF)
let novaOn  ch pat = (sometimesBy ch pat)
let novaOff ch pat = sometimesBy (1 - ch) (pat)
-- endregion Nova Utils
let gDelayD = (# delay (range 0 5 "^13"))
let gDelayFB = (# delayfb (range 0 0.9 "^14"))
let gRoom = ((|+ room (range 0 0.5 "^29")) . (# dry 0.99))
let gSize = (|+ size (min 0 (range "-0.5" 0.5 "^29")))
let gDelay = (gDelayD . gDelayFB . (# delayt 0.25) . (# orbit 2))
let g = (gDJF . gRoom)
let chords = "<[a5,c5,e5] [e4,g4,b4]>"
setcps (140/60/4) -- keep it between 110-190 BPM. You won't be sorry you did.
-- resetCycles
d1
  $ g -- Kick
  $ superimpose ((# "kick:5")
  . (# crush (range 6 2.5 "^50"))
  . (|* gain (range 0 1 "^50")))
  $ novaOn  "^73" (<| "~ ~ k ~") -- 1D
  $ novaOn  "^74" (<| "k*2") -- 2D
  $ novaOn  "^75" (<| "k ~ ~ <~!3 k>. k ~ <~ k> <k ~>")-- RubADub+adjustements
  $ novaOn  "^41" (<| "k*4") -- 4F
  $ novaOff "^41" (<| "k . k <~ [<~ k> <k ~>]>")-- RubADub
  $ "[jazz,tech:5]"
  # room 0.05
  # gM' 0 1.05 "^78"
d2
  $ g -- Snare
  $ (|- lpf 1000)
  $ (|/ lpf 2)
  $ novaOn "^42" (|<| "s*4")
  $ "~ <~!7 s> ~ ~ . s"
  # "[snare:50,snare:4]"
  # orbit 1
  # gM' 0.2 0.9 "^79"
d3 $ g -- Hats
  $ every' 4 3 (
    sometimesBy "0 . 1 0!3" ((# "ho:2") . (|* gain 0.9))
    . sometimesBy "0 . 0 1 0 0" (|* gain 0)
  )
  $ novaOn ("^43")  (slice 8 (run 8) . (loopAt 1) . (>| "breaks165"))
  -- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^44 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^44 for its new owner also moves this. NOT commented out: this is a `$`-step and something above it is a partial application waiting for it, so removing it would stop the whole block compiling. Fold it onto d3's own control with gSel.
  -- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^44 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^44 for its new owner also moves this. NOT commented out: this is a `$`-step and something above it is a partial application waiting for it, so removing it would stop the whole block compiling. Fold it onto d3's own control with gSel.
  $ novaOn ("^44")  (<|"h*8") -- TODO Eclaircir
  $ novaOff ("^44") (<| "h*[8 . 8 <8 16 32 4>]")
  $ (|* gain "[1 0.9]*4") -- make sure that you reduce the velocity of the second Hi Hat hit
  $ s "gretsch:4"
  # cut 3
  # orbit 1
  # gM' 0.2 1.5 "^80"
d4 $ g -- Bassline
  $ novaOn  "^44"  (>| note "[~ a4] <a4 e e a4> [~ <a4 c>] <a4 e>") -- Naif
  $ novaOff "^44" (>| note "<[~ a4@1.5 . a4 a4 e c] [e e . b4*<1 <2 4>>]>") -- simple+adjustements
  $ note "0" # "bass1:3"
  # cut 4
  # pan 0.2
  # attack (range 0 1 "^32")
  # crush (range 16 4 "^32")
  # release 0.95
  # orbit 1
  # gM' 0.25 1.2 "^81"
d5 $ g $ gDelay -- Skank Piano
  $ whenmod 4 3 (sometimesBy "0 1 . 0" (
    (# note "[d5,g4,b4]") . (|* gain 0.8)
  ))
  $ "<[~ p*<1 1 1 <1 2>> ~ p*<1 1 2 1>]>"
  -- TODO FIX ALIGNMENT CONTRETEMPS DE LA REPETITION
  -- $ "<[~ p  p] [~ [p <~ p*<1 2>>] . ~ p]>"
  # "superpiano"
  # note chords
  # velocity 0.6
  # sustain 0.34
  # release 0.8
  # room 0.13 # sz 0.4
  # pan 0.4
  -- FIXME(#54) d5 drives more controls than the grid gives it (B5 + C5). ^33 now belongs to another orbit, so the line(s) below are COMMENTED OUT rather than left firing across columns. Nothing is lost — restore by removing the dashes once gSel folds this onto d5's own control.
  -- # gM' 0 1 ("^82" * (range 0.25 1.5 "^33"))
d6 $ g $ gDelay-- Skank Hammond
  $ ("0.125" ~>)
  $ fast 2
  $ note (("[0 12 0 <~!6 12!2>]" |+ (slow 2 chords)))
  # "superhammond"
  # gM' 0 0.8 ("[0 0.25 0 0]" |+ "^82" * (range 0 0.9 "^34"))
  # voice 6
  # octave 6
  # sustain 0.25
d7
  $ g $ gDelay -- Skank Guitar
  $ note "[~ <a'min!2 e'min!2>]*2"
  # "pluck:5"
  # octave 5
  # gM' 0 1 ("^82" * ((range 0.25 1.5 "^35")))
d8 -- Trompette lancinante
  $ g $ gDelay
  $ novaOn "^60" (mask "<f!3 t>")
  $ note ("<g [<a d> bf d ~]> <g [~ g a]>" + "0 <12 0>")
  # "brass" # n "2"
  -- FIXME(#54) d8 drives more controls than the grid gives it (B8 + C8). ^36 now belongs to another orbit, so the line(s) below are COMMENTED OUT rather than left firing across columns. Nothing is lost — restore by removing the dashes once gSel folds this onto d8's own control.
  -- # gM' 0.2 0.85 ("^36")
  # attack 0.5 # cut 8
d9 -- CP
  $ sometimesBy "^59" (fast 2)
  $ (# lpf 2000)
  $ g
  $ whenmod 4 2 (superimpose ((# "clap") . (# lpf 4500) . (|* gain 0.8)))
  $ fast 2
  $ "~ cp"
  # gM' 0 1.1 "^83"
  # room 0.2
  # dry 0.9
  # lpf 2000

once $ "brass:4" # gain 0.6 # cut 1

-- TODO: BELOW COPIED FROM MINNEAPOLIS
d6 $ g --
  $ every' 4 3 ( -- acceleration + cymbale
    fast "2 1" . (# n "0!3 1")
  . (|* gain "1!3 <0.65 0.8>")
  )
  $ s "hh(<3!4 5!4>,8)"
  # gM' 0 0 "^80"
  # pan 0.7
d4 $ g
  -- $ degradeBy "0 0.9!7" -- OUTRO
  $ mask "t(<1 2!2 4>,4)"
  $ superimpose (
    often (off 0.125 (|+ note "<0!3 12>"))
    . arp (slow 8 $ "<up down updown downup>")
    . (|+ note 36)
    . (# sustain 0.5)
    . (|* velocity 1.1)
    . (# sz 0.8)
    . (|+ pan 0.15)
  )
  $ note (melody)
  # s "superpiano"
  # gM' 0 1 "^82"
  # velocity 0.55
  # sustain 1
  # room 0.4 # size 0.2
  # pan 0.5
d5 $ g -- Basse + Sirene
  $ sometimesBy ("^57") ( -- TECHNOPHILE
    chop 4
    . often (ply 4)
    -- . (# crush (range 16 3.5 "^33"))
  )
  $ superimpose (
    slow 4
    . (# s "supersiren")
    . (-| note 12) -- 24 when crushed
    . (# gM' 0 0.8 ((
      "^81"  -- gain bass
      * (range 0.6 0.9 "^33") -- Modulated 5C
      )
      - (0.125 * "^57") -- When TECHNOPHILE
      ))
    . (# room 0.5)
    . (# size 0.8)
  )
  $ note (
    "0*2 0 . 0 <7 5 5 7> ~ 0"
    + melodyFirst
  )
  # s "supersaw"
  -- # voice 0.02
  # crush (range 16 3.5 "^53")
  # gM' 0 0.8 "^81"
  # pan (slow 10 $ range 0.6 0.8 sine)
d7 $ g -- Claps fantomes
  $ s "~ . cp*<1 1 2 1 1!3 2> ~"
  # room (range 0.2 0.95 "^55")
  # sz (range 0.5 0.9 perlin)
  # dry 1.05
  # gM' 0 1 "^83"
  # pan (slow 8 $ range 0.45 0.65 saw)
d8 $ g -- Gunfire
  -- FIXME(#54) d8 drives more controls than the grid gives it (B8 + C8). ^56 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^56 for its new owner also moves this. NOT commented out: this is a `$`-step and something above it is a partial application waiting for it, so removing it would stop the whole block compiling. Fold it onto d8's own control with gSel.
  $ sometimesBy "^36" (
    superimpose (const -- pistolets
      $ sometimes ( -- réplique
        off 0.5 (|+ gain 0.1)
      . (# room 0.25)
      )
      $ often (stut 2 0.85 (1/16)) -- écho
      -- $ s "~ ~ ~ snare:57"
      # speed (range 0.4 1 ("^56" + perlin/4))
      # gM' 0 1 ("^36")
      # cut 80
      # dry 1.02
      # pan (range 0.2 0.8 perlin)
    )
  )
  $ s "fire"
  # begin (slow 4 "<0 0.2 0.5>")
  # cut 8
  # room 0.6 # size 0.4
  -- FIXME(#54) d8 drives more controls than the grid gives it (B8 + C8). ^35 now belongs to another orbit, so the line(s) below are COMMENTED OUT rather than left firing across columns. Nothing is lost — restore by removing the dashes once gSel folds this onto d8's own control.
  -- # speed (range 0.5 1 ("^35" + perlin/4))
  # gM "^84"
  # delay 0.3 # delaytime (1/3) # delayfb 0.8
