module CrossSum where
import Midi ;
import ListLive ;
import List ;
import Pitch ;
import Function ;
import Prelude ( Integer, fromInteger, (+), mod, div, succ ) ;
main :: [ Event (Channel Message) ] ;
main =
channel 0 $ changeTempo timeUnit $
concatMap (note qn . makePitch) $
modCrossSums 4 ;
makePitch :: Integer -> Pitch ;
makePitch 0 = c 4 ;
makePitch 1 = e 4 ;
makePitch 2 = g 4 ;
makePitch _ = c 5 ;
modCrossSums :: Integer -> [Integer] ;
modCrossSums n =
map (foldl (modAdd n) 0 . toBase n) $
iterateInteger succ 0 ;
toBase :: Integer -> Integer -> [Integer] ;
toBase _n 0 = [] ;
toBase n x = mod x n : toBase n (div x n) ;
modCrossSumsList :: Integer -> [Integer] ;
modCrossSumsList n =
0 : extList n [0] ;
extList :: Integer -> [Integer] -> [Integer] ;
extList n y =
applyStrictListList (extList2 n) $ map (incList n y) $
take (fromInteger n) $ iterateInteger succ 0 ;
extList2 :: Integer -> [[Integer]] -> [Integer] ;
extList2 n z =
concat (tail z) ++ extList n (concat z) ;
incList :: Integer -> [Integer] -> Integer -> [Integer] ;
incList m ys x = map (modAdd m x) ys ;
modAdd :: Integer -> Integer -> Integer -> Integer ;
modAdd m x y = mod (x+y) m ;
timeUnit :: Time ;
timeUnit = 150 ;
qn :: Integer ;
qn = 1 ;