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 :: [Event (Channel Message)]
main =
   Integer -> [Event Message] -> [Event (Channel Message)]
forall a. Integer -> [Event a] -> [Event (Channel a)]
channel Integer
0 ([Event Message] -> [Event (Channel Message)])
-> [Event Message] -> [Event (Channel Message)]
forall a b. (a -> b) -> a -> b
$ Integer -> [Event Message] -> [Event Message]
forall a. Integer -> [Event a] -> [Event a]
changeTempo Integer
timeUnit ([Event Message] -> [Event Message])
-> [Event Message] -> [Event Message]
forall a b. (a -> b) -> a -> b
$
   (Integer -> [Event Message]) -> [Integer] -> [Event Message]
forall a b. (a -> [b]) -> [a] -> [b]
concatMap (Integer -> Integer -> [Event Message]
note Integer
qn (Integer -> [Event Message])
-> (Integer -> Integer) -> Integer -> [Event Message]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Integer
makePitch) ([Integer] -> [Event Message]) -> [Integer] -> [Event Message]
forall a b. (a -> b) -> a -> b
$
   Integer -> [Integer]
modCrossSums Integer
4 ;

makePitch :: Integer -> Pitch ;
makePitch :: Integer -> Integer
makePitch Integer
0 = Integer -> Integer
c Integer
4 ;
makePitch Integer
1 = Integer -> Integer
e Integer
4 ;
makePitch Integer
2 = Integer -> Integer
g Integer
4 ;
makePitch Integer
_ = Integer -> Integer
c Integer
5 ;


-- * explicit base conversion

modCrossSums :: Integer -> [Integer] ;
modCrossSums :: Integer -> [Integer]
modCrossSums Integer
n =
   (Integer -> Integer) -> [Integer] -> [Integer]
forall a b. (a -> b) -> [a] -> [b]
map ((Integer -> Integer -> Integer) -> Integer -> [Integer] -> Integer
forall b a. (b -> a -> b) -> b -> [a] -> b
foldl (Integer -> Integer -> Integer -> Integer
modAdd Integer
n) Integer
0 ([Integer] -> Integer)
-> (Integer -> [Integer]) -> Integer -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Integer -> [Integer]
toBase Integer
n) ([Integer] -> [Integer]) -> [Integer] -> [Integer]
forall a b. (a -> b) -> a -> b
$
   (Integer -> Integer) -> Integer -> [Integer]
iterateInteger Integer -> Integer
forall a. Enum a => a -> a
succ Integer
0 ;

toBase :: Integer -> Integer -> [Integer] ;
toBase :: Integer -> Integer -> [Integer]
toBase Integer
_n Integer
0 = [] ;
toBase Integer
n Integer
x = Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
mod Integer
x Integer
n Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: Integer -> Integer -> [Integer]
toBase Integer
n (Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
div Integer
x Integer
n) ;


-- * recursion on lists

modCrossSumsList :: Integer -> [Integer] ;
modCrossSumsList :: Integer -> [Integer]
modCrossSumsList Integer
n =
   Integer
0 Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: Integer -> [Integer] -> [Integer]
extList Integer
n [Integer
0] ;

extList :: Integer -> [Integer] -> [Integer] ;
extList :: Integer -> [Integer] -> [Integer]
extList Integer
n [Integer]
y =
   ([[Integer]] -> [Integer]) -> [[Integer]] -> [Integer]
forall a. ([[Integer]] -> a) -> [[Integer]] -> a
applyStrictListList (Integer -> [[Integer]] -> [Integer]
extList2 Integer
n) ([[Integer]] -> [Integer]) -> [[Integer]] -> [Integer]
forall a b. (a -> b) -> a -> b
$ (Integer -> [Integer]) -> [Integer] -> [[Integer]]
forall a b. (a -> b) -> [a] -> [b]
map (Integer -> [Integer] -> Integer -> [Integer]
incList Integer
n [Integer]
y) ([Integer] -> [[Integer]]) -> [Integer] -> [[Integer]]
forall a b. (a -> b) -> a -> b
$
   Int -> [Integer] -> [Integer]
forall a. Int -> [a] -> [a]
take (Integer -> Int
forall a. Num a => Integer -> a
fromInteger Integer
n) ([Integer] -> [Integer]) -> [Integer] -> [Integer]
forall a b. (a -> b) -> a -> b
$ (Integer -> Integer) -> Integer -> [Integer]
iterateInteger Integer -> Integer
forall a. Enum a => a -> a
succ Integer
0 ;

extList2 :: Integer -> [[Integer]] -> [Integer] ;
extList2 :: Integer -> [[Integer]] -> [Integer]
extList2 Integer
n [[Integer]]
z =
   [[Integer]] -> [Integer]
forall a. [[a]] -> [a]
concat ([[Integer]] -> [[Integer]]
forall a. [a] -> [a]
tail [[Integer]]
z) [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
++ Integer -> [Integer] -> [Integer]
extList Integer
n ([[Integer]] -> [Integer]
forall a. [[a]] -> [a]
concat [[Integer]]
z) ;

incList :: Integer -> [Integer] -> Integer -> [Integer] ;
incList :: Integer -> [Integer] -> Integer -> [Integer]
incList Integer
m [Integer]
ys Integer
x = (Integer -> Integer) -> [Integer] -> [Integer]
forall a b. (a -> b) -> [a] -> [b]
map (Integer -> Integer -> Integer -> Integer
modAdd Integer
m Integer
x) [Integer]
ys ;


-- * auxiliary

modAdd :: Integer -> Integer -> Integer -> Integer ;
modAdd :: Integer -> Integer -> Integer -> Integer
modAdd Integer
m Integer
x Integer
y = Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
mod (Integer
xInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
y) Integer
m ;


timeUnit :: Time ;
timeUnit :: Integer
timeUnit = Integer
150 ;

qn :: Integer ;
qn :: Integer
qn = Integer
1 ;