{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies, NoMonoLocalBinds #-}
{-# LANGUAGE NoIncoherentInstances #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE NoUndecidableInstances #-}
module Vivid.SynthDef.Types (
Signal(..)
, SynthDef(..)
, SDName(..)
, SDBody'
, zoomSDBody
, zoomSynthDef
, UGen(..)
, UGenName(..)
, module Vivid.SynthDef.TypesafeArgs
) where
import Vivid.SC.SynthDef.Types (CalculationRate(..), UnaryOp(..), BinaryOp(..))
import Vivid.SynthDef.TypesafeArgs
import Control.Monad.State (State, get, runState, put)
import Data.ByteString (ByteString)
import Data.Int (Int32)
import Data.Map (Map)
import GHC.TypeLits
import Prelude
data Signal
= Constant Float
| Param ByteString
| UGOut Int Int32
deriving (Show, Eq)
data SynthDef (args :: [Symbol]) = SynthDef {
_sdName :: SDName
,_sdParams :: [(ByteString, Float)]
,_sdUGens :: Map Int UGen
}
deriving (Show)
data SDName
= SDName_Named ByteString
| SDName_Hash
deriving (Show, Eq, Read, Ord)
data UGen
= UGen {
_ugenName :: UGenName
,_ugenCalculationRate :: CalculationRate
,_ugenIns :: [Signal]
,_ugenNumOuts :: Int
}
deriving (Show, Eq)
data UGenName
= UGName_S ByteString
| UGName_U UnaryOp
| UGName_B BinaryOp
deriving (Show, Eq)
type SDBody' (args :: [Symbol])
= State ([Int], SynthDef args, VarSet args)
zoomSynthDef :: (Subset a b) => SynthDef a -> SynthDef b
zoomSynthDef (SynthDef a b c) = SynthDef a b c
zoomSDBody :: (Subset inner outer) => SDBody' inner a -> SDBody' outer a
zoomSDBody x = do
(initA,initB,_) <- get
let cheatSD :: SynthDef a -> SynthDef b
cheatSD (SynthDef a b c) = SynthDef a b c
let (val,(a,b,_)) = runState x (initA, cheatSD initB,VarSet)
put (a, zoomSynthDef b, VarSet)
return val