module Sound.Tidal.Vis where
import qualified Graphics.Rendering.Cairo as C
import Data.Colour
import Data.Colour.Names
import Data.Colour.SRGB
import Control.Applicative
import Sound.Tidal.Parse
import Sound.Tidal.Pattern
import Sound.Tidal.Utils
import Data.Ratio
vPDF = v C.withPDFSurface
vSVG = v C.withSVGSurface
v sf fn (x,y) pat =
sf fn x y $ \surf -> do
C.renderWith surf $ do
C.save
C.scale x y
C.setOperator C.OperatorOver
C.setSourceRGB 0 0 0
C.rectangle 0 0 1 1
C.fill
mapM_ renderEvent (events pat)
C.restore
vLines sf fn (x,y) pat cyclesPerLine nLines =
sf fn x y $ \surf -> do
C.renderWith surf $ do
C.save
C.scale x (y / (fromIntegral nLines))
C.setOperator C.OperatorOver
C.setSourceRGB 0 0 0
C.rectangle 0 0 1 1
C.fill
mapM_ (\x -> do C.save
C.translate 0 (fromIntegral x)
drawLine ((cyclesPerLine * (fromIntegral x)) `rotR` pat)
C.restore
) [0 .. (nLines 1)]
C.restore
where drawLine p = mapM_ renderEvent (events (_density cyclesPerLine p))
renderEvent (_, (s,e), (cs)) = do C.save
drawBlocks cs 0
C.restore
where height = 1/(fromIntegral $ length cs)
drawBlocks [] _ = return ()
drawBlocks (c:cs) n = do let (RGB r g b) = toSRGB c
C.setSourceRGBA r g b 1
C.rectangle x y w h
C.fill
C.stroke
drawBlocks cs (n+1)
where x = (fromRational s)
y = (fromIntegral n) * height
w = (fromRational (es))
h = height
events pat = (map (mapSnd' (\(s,e) -> ((s (ticks/2))/speed,(e (ticks/2))/speed))) $ arc (segment pat) ((ticks/2), (ticks/2)+speed))
where speed = 1
ticks = 0