{-# LANGUAGE FlexibleContexts, NoMonomorphismRestriction #-} module Main where import Control.Applicative import Graphics.EasyPlot import Music.Prelude.Basic import Music.Time.Reactive import Music.Time.Behavior --- import Prelude hiding (null) import Data.AffineSpace import Data.VectorSpace import Data.Sequence hiding (reverse) --- durToPitch :: Duration -> Pitch durToPitch = fromInteger . round durToInterval :: Duration -> Interval durToInterval = fromInteger . round sc :: Score (Behavior Pitch) sc = times 240 $ note (varying $ const 0) changePitch :: Behavior Pitch -> Behavior Pitch changePitch = liftA2 (^+.) $ switchB 24 (pure _P1) (switchB 48 sine sine2) where sine = varying (durToInterval.(*12).sinR.(* (tauR/12))) sine2 = delay 48 $ varying (durToInterval.(*13).sinR.(* (tauR/13))) -- main = do -- openLilypond $ sc2^/12 -- playMidiIO "" $ sc2^/12 -- sc2 = fmap (? 0) $ __mapPitch changePitch sc tau = 2*pi tauR = realToFrac tau sinR :: (Real a, Fractional b) => a -> b sinR = realToFrac . sin . realToFrac (^+.) = flip (.+^) plotR :: (Num a, Show a) => Reactive a -> IO () plotR r = do plot X11 $ (\t -> r ? realToFrac t) return () plotRs :: (Num a, Show a) => [Reactive a] -> IO () plotRs rs = do plot X11 $ map (\r -> (\t -> r ? realToFrac t)) rs return () plotB :: (Num a, Show a) => Behavior a -> IO () plotB r = do plot X11 $ (\t -> r ? realToFrac t) return () plotBs :: (Num a, Show a) => [Behavior a] -> IO () plotBs rs = do plot X11 $ map (\r -> (\t -> r ? realToFrac t)) rs return () -- main = -- plotRs $ [delay (-0.5) r1, stretch 1.1 $ delay (-0.5) r1] -- r1 = switch (-3) (pure (-3)) (switch 3 (activate ((0 <-> 1) =: (pure 1)) (pure 0)) (pure 3)) -- From http://alexis.vallet.free.fr/?p=412 bezier, bezier' :: (AffineSpace p, VectorSpace (Diff p)) => [p] -> Scalar (Diff p) -> p bezier' [p] _ = p bezier' polygon t = let poly0 = reverse . tail $ reverse polygon poly1 = tail polygon in alerp (bezier' poly0 t) (bezier' poly1 t) t bezier polygon t = bezierSeq (fromList polygon) t bezierSeq :: (AffineSpace p, VectorSpace (Diff p)) => Seq p -> Scalar (Diff p) -> p bezierSeq polygon t = let poly0 :> _ = viewr polygon p :< poly1 = viewl polygon in if null poly1 then p else alerp (bezierSeq poly0 t) (bezierSeq poly1 t) t examplePolygon :: [(Double, Double)] examplePolygon = [(0, 0), (1, 1), (2, 0)]