module Csound.IO (
renderCsd, renderCsdBy,
writeCsd, writeCsdBy, playCsd, playCsdBy,
mplayer, mplayerBy, totem, totemBy,
) where
import System.Cmd(system)
import Data.Default
import Csound.Exp.EventList(CsdSco)
import Csound.Exp.Mix(Mix)
import Csound.Exp.Options(CsdOptions)
import Csound.Render(render)
import Csound.Exp.Tuple(Out)
renderCsd :: (Out a, CsdSco sco) => sco (Mix a) -> IO String
renderCsd = renderCsdBy def
renderCsdBy :: (Out a, CsdSco sco) => CsdOptions -> sco (Mix a) -> IO String
renderCsdBy opt as = render opt as
writeCsd :: (Out a, CsdSco sco) => String -> sco (Mix a) -> IO ()
writeCsd file sco = writeFile file =<< renderCsd sco
writeCsdBy :: (Out a, CsdSco sco) => CsdOptions -> String -> sco (Mix a) -> IO ()
writeCsdBy opt file sco = writeFile file =<< renderCsdBy opt sco
playCsd :: (Out a, CsdSco sco) => String -> String -> sco (Mix a) -> IO ()
playCsd = playCsdBy def
playCsdBy :: (Out a, CsdSco sco) => CsdOptions -> String -> String -> sco (Mix a) -> IO ()
playCsdBy opt player file sco = do
writeCsdBy opt fileCsd sco
_ <- system $ "csound -o " ++ fileWav ++ " " ++ fileCsd
_ <- system $ player ++ " " ++ fileWav
return ()
where fileCsd = file ++ ".csd"
fileWav = file ++ ".wav"
mplayer :: (Out a, CsdSco sco) => sco (Mix a) -> IO ()
mplayer = mplayerBy def
mplayerBy :: (Out a, CsdSco sco) => CsdOptions -> sco (Mix a) -> IO ()
mplayerBy opt = playCsdBy opt "mplayer" "tmp"
totem :: (Out a, CsdSco sco) => sco (Mix a) -> IO ()
totem = totemBy def
totemBy :: (Out a, CsdSco sco) => CsdOptions -> sco (Mix a) -> IO ()
totemBy opt = playCsdBy opt "totem" "tmp"