vivid-0.1.0.0: Vivid/SynthDef/CrazyTypes.hs
-- | Our IncoherentInstances + UndecidableInstances sin bin, for everything that needs
-- crazy type hacks
--
-- Most of this is just to get numbers defaulting to Floats in a useful way in
-- SynthDefs
--
-- We keep these separated so everything that doesn't need IncoherentInstances
-- can live in Sanity Land
{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE IncoherentInstances #-}
module Vivid.SynthDef.CrazyTypes where
-- import Vivid.SynthDef ()
import Vivid.SynthDef.Types
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BS8
class ToSig s where
toSig :: s -> Signal
instance ToSig Signal where
toSig = id
-- | For 'Constant' (Float) values
instance (Num a, Real a) => ToSig a where
toSig = Constant . fromRational . toRational
instance ToSig String where
toSig = Param . BS8.pack
---
class ToSigM s where
toSigM :: s -> SDState Signal
instance (ToSig i) => ToSigM i where
toSigM = return . toSig
instance ToSigM (SDState Signal) where
toSigM = id
---
class HasSynthRef a where
getSynthRef :: a -> Either ByteString SynthDef
-- for some reason this needs -XFlexibleInstances:
instance HasSynthRef String where
getSynthRef = Left . BS8.pack
instance HasSynthRef SynthDef where
getSynthRef = Right
-- can also do:
{-
instance HasSynthRef (SDState Input) where
getSynthRef = Right . sd []
-}