module Fibonacci where
import Midi ;
import List ;
import Pitch ;
import Function ;
import Prelude ( Integer, (*), (+), mod ) ;
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 -> Integer -> Integer -> [Integer]
modFibonacci3 Integer
4 Integer
1 Integer
1 Integer
0 ;
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 ;
modFibonacci :: Integer -> Integer -> Integer -> [Integer] ;
modFibonacci :: Integer -> Integer -> Integer -> [Integer]
modFibonacci Integer
n Integer
c0 Integer
c1 = Integer -> Integer -> Integer -> Integer -> Integer -> [Integer]
modFibonacciRec Integer
n Integer
c0 Integer
c1 Integer
0 Integer
1 ;
modFibonacciRec ::
Integer -> Integer -> Integer ->
Integer -> Integer -> [Integer] ;
modFibonacciRec :: Integer -> Integer -> Integer -> Integer -> Integer -> [Integer]
modFibonacciRec Integer
n Integer
c0 Integer
c1 Integer
x0 Integer
x1 =
Integer
x0 Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: (Integer -> [Integer]) -> Integer -> [Integer]
forall a. (Integer -> a) -> Integer -> a
applyStrict (Integer -> Integer -> Integer -> Integer -> Integer -> [Integer]
modFibonacciRec Integer
n Integer
c0 Integer
c1 Integer
x1) (Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
mod (Integer
x0Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
c0Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
x1Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
c1) Integer
n) ;
modFibonacci3 :: Integer -> Integer -> Integer -> Integer -> [Integer] ;
modFibonacci3 :: Integer -> Integer -> Integer -> Integer -> [Integer]
modFibonacci3 Integer
n Integer
c0 Integer
c1 Integer
c2 = Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> [Integer]
modFibonacci3Rec Integer
n Integer
c0 Integer
c1 Integer
c2 Integer
0 Integer
0 Integer
1 ;
modFibonacci3Rec ::
Integer -> Integer -> Integer -> Integer ->
Integer -> Integer -> Integer -> [Integer] ;
modFibonacci3Rec :: Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> [Integer]
modFibonacci3Rec Integer
n Integer
c0 Integer
c1 Integer
c2 Integer
x0 Integer
x1 Integer
x2 =
Integer
x0 Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: (Integer -> [Integer]) -> Integer -> [Integer]
forall a. (Integer -> a) -> Integer -> a
applyStrict (Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> [Integer]
modFibonacci3Rec Integer
n Integer
c0 Integer
c1 Integer
c2 Integer
x1 Integer
x2) (Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
mod (Integer
x0Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
c0Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
x1Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
c1Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
x2Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
c2) Integer
n) ;
timeUnit :: Time ;
timeUnit :: Integer
timeUnit = Integer
150 ;
qn :: Integer ;
qn :: Integer
qn = Integer
1 ;