module NDR where

import Pitch ;
import Instrument ;
import Drum ;
import Chords ;
import Midi ;
import List ( (++), concat, cycle )
import Prelude ( Int, negate, (+), (*), ($) ) ;


main, struct ::
  [Midi.Event (Midi.Channel Midi.Message)] ;
main = struct ;

struct =
  channel 0 (rest (wn+qn) ++ program brassSection ++ (cycle $
    melodyA0 +:+ melodyA1 qn +:+
    melodyA0 +:+ melodyA1 0 +:+
    melodyB +:+ melodyB +:+ rest qn +:+
    melodyC +:+ melodyC +:+
    melodyC +:+ melodyC
  ))
  =:=
  drumLoop ;

melodyA0, melodyB, melodyC ::
  [Midi.Event Midi.Message] ;
melodyA0 =
  concat $
  chord3  en (g 4) (c  5) (e 5) : rest en :
  chord3 dqn (g 4) (b  4) (d 5) :
  chord3  en (f 4) (as 4) (d 5) : rest en :
  chord3 dqn (f 4) (a  4) (c 5) :
  note en (a 4) : note en (g 4) : note en (f 4) : note dqn (g 4) :
  [] ;

melodyA1 :: Time -> [Midi.Event Midi.Message] ;
melodyA1 dur =
  concat $
  chord3  en (g 4) (c 5) (e 5) : rest en :
  chord3 dqn (g 4) (b 4) (d 5) :
  chord3 (en+wn+dur) (a 4) (c 5) (f 5) :
  [] ;

melodyB =
  concat $
  note en (e 3) : rest en : note en (f 3) : rest en : note dqn (g 3) :
  note en (a 3) : rest en : note en (a 3) : note qn (g 3) : note en (f 3) : note dqn (g 3) :
  note en (e 3) : rest en : note en (f 3) : rest en : note dqn (g 3) :
  rest qn :
  note en (f 3) : note en (a 3) : note qn (c 4) : note en (b 3) :
  rest qn :
  [] ;

melodyC =
  concat $
  chord3  en (a 4) (c 5) (e 5) : rest en :
  chord3 dqn (g 4) (b 4) (d 5) :
  chord3 qn (f 4) (a 4) (c 5) :
  chord3 en (f 4) (a 4) (c 5) :
  chord3 qn (f 4) (a 4) (c 5) :
  chord3 qn (f 4) (a 4) (c 5) :
  chord3 qn (g 4) (b 4) (d 5) :
  rest qn :
  [] ;


-- * rhythm

drumTrack, drumLoop :: [ Event (Channel Message) ] ;
drumTrack = drumLoop ;

drumLoop =
   drumChannel (
      drum bassDrum1 en ++
      drum bassDrum1 en ++
      emphasize (negate 20) (drum electricSnare en) ++
      emphasize (negate 20) (drum electricSnare en)
   ) ++ drumLoop ;


-- * durations

sn, en, den, qn, dqn, hn, dhn, wn :: Midi.Time ;

sn = 80 ;
en = 2*sn ; den = 3*sn ;
qn = 2*en ; dqn = 3*en ;
hn = 2*qn ; dhn = 3*qn ;
wn = 2*hn ;
