module Csound.Typed.GlobalState.Options (
Options(..),
defGain, defSampleRate, defBlockSize, defTabFi, defScaleUI,
TabFi(..), fineFi, coarseFi,
idWavs, idMp3s, idDoubles, idSines, idSines3, idSines2,
idPartials, idSines4, idBuzzes, idConsts, idLins, idCubes,
idExps, idSplines, idStartEnds, idPolys, idChebs1, idChebs2, idBessels, idWins,
idTabHarmonics, idMixOnTab, idMixTabs,
idNormTab, idPolynomFuns, idLinTab, idRandDists, idReadNumFile, idReadNumTab,
idExpsBreakPoints, idLinsBreakPoints, idReadTrajectoryFile, idMixSines1, idMixSines2,
idRandHist, idRandPairs, idRandRanges, idPvocex, idTuning, idMultichannel,
idPadsynth, idTanh, idExp, idSone, idFarey, idWave,
Jacko(..), JackoConnect, renderJacko
) where
import Data.Monoid
import Control.Applicative
import Data.Default
import qualified Data.IntMap as IM
import qualified Data.Map as M
import Csound.Dynamic hiding (csdFlags)
data Options = Options
{ csdFlags :: Flags
, csdSampleRate :: Maybe Int
, csdBlockSize :: Maybe Int
, csdGain :: Maybe Double
, csdTabFi :: Maybe TabFi
, csdScaleUI :: Maybe (Double, Double)
, csdJacko :: Maybe Jacko
}
instance Default Options where
def = Options def def def def def def def
instance Monoid Options where
mempty = def
mappend a b = Options
{ csdFlags = mappend (csdFlags a) (csdFlags b)
, csdSampleRate = csdSampleRate a <|> csdSampleRate b
, csdBlockSize = csdBlockSize a <|> csdBlockSize b
, csdGain = csdGain a <|> csdGain b
, csdTabFi = csdTabFi a <|> csdTabFi b
, csdScaleUI = csdScaleUI a <|> csdScaleUI b
, csdJacko = csdJacko a <|> csdJacko b }
defScaleUI :: Options -> (Double, Double)
defScaleUI = maybe (1, 1) id . csdScaleUI
defGain :: Options -> Double
defGain = maybe 0.8 id . csdGain
defSampleRate :: Options -> Int
defSampleRate = maybe 44100 id . csdSampleRate
defBlockSize :: Options -> Int
defBlockSize = maybe 64 id . csdBlockSize
defTabFi :: Options -> TabFi
defTabFi = maybe def id . csdTabFi
data TabFi = TabFi
{ tabFiBase :: Int
, tabFiGens :: IM.IntMap Int
, tabNamedFiGens :: M.Map String Int }
instance Default TabFi where
def = fineFi 13
[(idLins, 11), (idExps, 11), (idConsts, 9), (idSplines, 11), (idStartEnds, 12), (idExpsBreakPoints, 11), (idLinsBreakPoints, 11), (idRandDists, 6)]
[(idPadsynth, 18), (idSone, 14), (idTanh, 13), (idExp, 13)]
fineFi :: Int -> [(Int, Int)] -> [(String, Int)] -> TabFi
fineFi n xs ys = TabFi n (IM.fromList xs) (M.fromList ys)
coarseFi :: Int -> TabFi
coarseFi n = TabFi n IM.empty M.empty
idWavs, idMp3s, idDoubles, idSines, idSines3, idSines2,
idPartials, idSines4, idBuzzes, idConsts, idLins, idCubes,
idExps, idSplines, idStartEnds, idPolys, idChebs1, idChebs2, idBessels, idWins,
idTabHarmonics, idMixOnTab, idMixTabs,
idNormTab, idPolynomFuns, idLinTab, idRandDists, idReadNumFile, idReadNumTab,
idExpsBreakPoints, idLinsBreakPoints, idReadTrajectoryFile, idMixSines1, idMixSines2,
idRandHist, idRandPairs, idRandRanges, idPvocex, idTuning, idMultichannel :: Int
idWavs = 1
idDoubles = 2
idSines = 10
idSines3 = 9
idSines2 = 9
idPartials = 9
idSines4 = 19
idBuzzes = 11
idConsts = 17
idLins = 7
idCubes = 6
idExps = 5
idStartEnds = 16
idSplines = 8
idPolys = 3
idChebs1 = 13
idChebs2 = 14
idBessels = 12
idWins = 20
idMp3s = 49
idTabHarmonics = 30
idMixOnTab = 31
idMixTabs = 32
idNormTab = 4
idLinTab = 18
idRandDists = 21
idReadNumFile = 23
idReadNumTab = 24
idExpsBreakPoints = 25
idLinsBreakPoints = 27
idReadTrajectoryFile = 28
idMixSines1 = 33
idMixSines2 = 34
idRandHist = 40
idRandPairs = 41
idRandRanges = 42
idPvocex = 43
idTuning = 51
idMultichannel = 52
idTanh = "tanh"
idExp = "exp"
idSone = "sone"
idFarey = "farey"
idWave = "wave"
idPadsynth, idTanh, idExp, idSone, idFarey, idWave :: String
idPadsynth = "padsynth"
idPolynomFuns = 15
type JackoConnect = (String, String)
data Jacko = Jacko
{ jackoClient :: String
, jackoServer :: String
, jackoAudioIns :: [JackoConnect]
, jackoAudioOuts :: [JackoConnect]
, jackoMidiIns :: [JackoConnect]
, jackoMidiOuts :: [JackoConnect]
, jackoFreewheel :: Bool
, jackoInfo :: Bool }
instance Default Jacko where
def = Jacko
{ jackoClient = "csound-exp"
, jackoServer = "default"
, jackoAudioIns = []
, jackoAudioOuts = []
, jackoMidiIns = []
, jackoMidiOuts = []
, jackoFreewheel = False
, jackoInfo = False }
renderJacko :: Jacko -> String
renderJacko spec = unlines $ filter ( /= "")
[ "JackoInit " ++ (str $ jackoServer spec) ++ ", " ++ (str $ jackoClient spec)
, if (jackoFreewheel spec) then "JackoFreewheel 1" else ""
, if (jackoInfo spec) then "JackoInfo" else ""
, renderConnections "JackoAudioInConnect" $ jackoAudioIns spec
, renderConnections "JackoAudioOutConnect" $ jackoAudioOuts spec
, renderConnections "JackoMidiInConnect" $ jackoMidiIns spec
, renderConnections "JackoMidiOutConnect" $ jackoMidiOuts spec
, "JackoOn" ]
where
renderConnections name links = unlines $ fmap (renderLink name) links
renderLink name (a, b) = name ++ " " ++ (str a) ++ ", " ++ (str b)
str x = "\"" ++ x ++ "\""