packages feed

live-sequencer-0.0.1: data/example/Klingklong.hs

module Klingklong where

import Chords
import Pitch
import Midi
import List
import Prelude ( Integer, (*), (+), (-) )


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


-- * patterns

loop0, loop0_1, loop1, loop2a, loop2b
   :: [Midi.Event (Midi.Channel Midi.Message)] ;
loop0 = patternChannel ( note qn (c 4) ) ++ loop0 ;

loop0_1 =
    patternChannel (
        ping ++ note qn (c 4)
    ) ++ loop0_1 ;


pattern1, pattern2a, pattern2b, pattern3a, pattern3b
   :: [Midi.Event (Midi.Channel Midi.Message)] ;
pattern1 = patternChannel ( concat [
  note qn (e 4), note qn (c 4),
  note qn (e 4), note qn (c 4),
  note qn (g 4), note en (f 4), note en (e 4),
  note en (d 4), note en (e 4), note en (f 4),
    note en (d 4) ] ) ;

pattern2 :: [Midi.Event Midi.Message] ;
pattern2 = concat [
  note qn (e 4), note qn (a 4),
  note qn (e 4), note qn (a 4),
  note qn (a 4), note en (b 4), note en (c 5),
  note en (d 5), note en (c 5), note en (b 4) ] ;

pattern2a =
  patternChannel ( pattern2 ++ note en (a 4) ) ;

pattern2b =
  patternChannel ( pattern2 ++ note en (g 4) ) ;


pattern3a = patternChannel ( concat [
  note qn (e 4), note qn (c 4),
  note qn (e 4), note qn (c 4),
  note qn (g 4), note en (f 4), note en (e 4),
  note en (d 4), note en (e 4), note en (f 4),
    note en (d 4) ] ) ;

pattern3b = patternChannel ( concat [
  note qn (e 4), note qn (c 4),
  note qn (e 4), note qn (c 4),
  note qn (e 4), note en (d 4), note en (c 4),
  note en (d 4), note en (e 4), note en (d 4),
    note en (c 4) ] ) ;


loop1 = pattern1 ++ loop1 ;

loop2a = pattern2a ++ loop2a ;

loop2b = pattern2b ++ loop1 ;


-- * pad

padSimple, pad1, pad2, pad3,
  bass3, bassLoop,
  sweep, loop1p,
  pad3loop, loop3sweep, bassPad,
  pattern1Bass, pattern1BassPadShort,
  pattern1BassPad, pattern2BassPad, pattern3BassPad
    :: [Midi.Event (Midi.Channel Midi.Message)] ;


padSimple = padChannel ( concat [
  pad,
  controller volumeCC 90, controller brightnessCC 60,
  chord4 wn2 (c 4) (e 4) (g 4) (c 5) ] ) ;

pad1 = padChannel ( concat [
  pad,
  controller volumeCC 90,
  chord4 wn2 (c 4) (e 4) (g 4) (c 5),
  chord4 wn2 (c 4) (d 4) (g 4) (c 5),
  chord4 wn2 (c 4) (f 4) (a 4) (c 5),
  chord4 wn2 (c 4) (e 4) (g 4) (c 5) ] ) ;

pad2 = padChannel ( concat [
  pad,
  controller volumeCC 90,
  chord4 wn2 (c 4) (e 4) (a 4) (c 5),
  chord4 wn2 (b 3) (e 4) (g 4) (b 4),
  chord4 wn2 (c 4) (e 4) (a 4) (c 5),
  chord4 wn2 (a 3) (c 4) (f 4) (a 4),

  chord4 wn2 (c 4) (e 4) (a 4) (c 5),
  chord4 wn2 (b 3) (e 4) (g 4) (b 4),
  chord4 wn2 (c 4) (e 4) (a 4) (c 5),
  chord4 dwn (a 3) (c 4) (f 4) (a 4),
  chord4 hn  (b 3) (d 4) (g 4) (b 4) ] ) ;

pad3 = padChannel ( concat [
  pad,
  controller volumeCC 90, controller brightnessCC 70,
  chord4 wn2 (c 4) (f 4) (a 4) (c 5),
  chord4 wn2 (e 4) (a 4) (c 5) (e 5),
  chord4 wn2 (d 4) (g 4) (b 4) (d 5),
  chord4 wn2 (d 4) (fs 4) (a 4) (d 5) ] ) ;


-- * bass

bassControl :: [Midi.Event Midi.Message] ;
bassControl =
  controlCurve en brightnessCC
    (take 64 (cycle [0,31,62,93,124] ) ) ;

bassNote :: Pitch -> [Midi.Event (Midi.Channel Midi.Message)] ;
bassNote p = bassChannel ( concat [
  bass,
  controller volumeCC 100,
  merge ( note (4*2*wn) p ) bassControl ] ) ;

bass3 = bassChannel ( concat [
  bass,
  controller volumeCC 100,
  merge ( concat [ note wn2 (f 2), note wn2 (f 2),
                   note wn2 (g 2), note wn2 (a 2) ] )
        bassControl ] ) ;

bassLoop =
  bassNote (c 2) ++ bassLoop ;


-- * sweep

sweep =
   padChannel ( controlCurve en brightnessCC triangle) ;

triangle :: [Integer] ;
triangle = rampUp 0 ++ rampDown 124 ;

rampUp, rampDown :: Integer -> [Integer] ;
rampUp 124 = [] ;
rampUp n = n : rampUp (n+4) ;

rampDown 0 = [] ;
rampDown n = n : rampDown (n-4) ;


-- * complex

loop1p = merge pattern1 pad1 ++ loop1p ;

pad3loop =
    merge ( quadAlt pattern3a pattern3b ) pad3
    ++
    loop1 ;

loop3sweep =
  merge pad3 sweep ++ loop3sweep ;

bassPad =
    merge pad1 (bassNote (c 2) )
    ++
    bassPad ;

pattern1Bass =
    merge ( quad pattern1 ) (bassNote (c 2) )
    ++
    pattern1Bass ;

pattern1BassPadShort =
    mergeMany [
        quad pattern1,
        bassNote (c 2),
        pad1, sweep
    ]
    ++
    pattern1BassPadShort ;

pattern1BassPad =
    double ( mergeMany [
        quad pattern1,
        bassNote (c 2),
        pad1, sweep ] )
    ++
    pattern2BassPad ;

pattern2BassPad =
    mergeMany [
      quad pattern2a ++ quadAlt pattern2a pattern2b,
      double (bassNote (a 1)),
      pad2, double sweep
    ]
    ++
    pattern1BassPad ;

pattern3BassPad =
    mergeMany [
       quadAlt pattern3a pattern3b,
       bass3, pad3, sweep
    ]
    ++
    pattern1BassPad ;


-- * concatenation

double :: [a] -> [a] ;
double x = concat [ x, x ] ;

quad :: [a] -> [a] ;
quad x = concat [ x, x, x, x ] ;

quadAlt :: [a] -> [a] -> [a] ;
quadAlt x y = concat [ x, x, x, y] ;


-- * durations

en, qn, hn, wn, dwn, wn2 :: Midi.Time ;

en  = 170 ;
qn  = 2 * en ;
hn  = 2 * qn ;
wn  = 2 * hn ; dwn = wn + hn ;
wn2 = 2 * wn ;


-- * MIDI program

ping, slap, pad, bass :: [Midi.Event Midi.Message] ;
ping = program 0 ;
slap = program 2 ;
pad  = program 4 ;
bass = program 9 ;


-- * MIDI channels

soloChannel, patternChannel, padChannel, bassChannel
   :: [Midi.Event a] -> [Midi.Event (Midi.Channel a)] ;
soloChannel    xs = channel 0 xs ;
patternChannel xs = channel 1 xs ;
padChannel     xs = channel 2 xs ;
bassChannel    xs = channel 3 xs ;


-- * MIDI controllers

volumeCC, brightnessCC :: Midi.Controller ;
volumeCC = 7 ;
brightnessCC = 70 ;