module Csound.IO (
RenderCsd(..),
renderCsd,
writeCsd, writeCsdBy,
playCsd, playCsdBy,
mplayer, mplayerBy, totem, totemBy,
dac, dacBy, vdac, vdacBy,
csd, csdBy
) where
import System.Cmd(system)
import Data.Default
import Csound.Typed
render :: Sigs a => Options -> SE a -> IO String
render = renderOutBy
render_ :: Options -> SE () -> IO String
render_ = renderOutBy_
class RenderCsd a where
renderCsdBy :: Options -> a -> IO String
instance RenderCsd (SE ()) where
renderCsdBy = render_
instance RenderCsd Sig where
renderCsdBy opt a = render opt (return a)
instance RenderCsd (Sig, Sig) where
renderCsdBy opt a = render opt (return a)
instance RenderCsd (Sig, Sig, Sig, Sig) where
renderCsdBy opt a = render opt (return a)
instance RenderCsd (Sig, Sig, Sig, Sig, Sig, Sig) where
renderCsdBy opt a = render opt (return a)
instance RenderCsd (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig) where
renderCsdBy opt a = render opt (return a)
instance RenderCsd
( (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig)
, (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig) ) where
renderCsdBy opt a = render opt (return a)
instance RenderCsd
( (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig)
, (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig)
, (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig)
, (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig) ) where
renderCsdBy opt a = render opt (return a)
instance RenderCsd (SE Sig) where
renderCsdBy opt a = render opt a
instance RenderCsd (SE (Sig, Sig)) where
renderCsdBy opt a = render opt a
instance RenderCsd (SE (Sig, Sig, Sig, Sig)) where
renderCsdBy opt a = render opt a
instance RenderCsd (SE (Sig, Sig, Sig, Sig, Sig, Sig)) where
renderCsdBy opt a = render opt a
instance RenderCsd (SE (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig)) where
renderCsdBy opt a = render opt a
instance RenderCsd (SE
( (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig)
, (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig) )) where
renderCsdBy opt a = render opt a
instance RenderCsd (SE
( (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig)
, (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig)
, (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig)
, (Sig, Sig, Sig, Sig, Sig, Sig, Sig, Sig) )) where
renderCsdBy opt a = render opt a
instance (Sigs a, Sigs b) => RenderCsd (a -> b) where
renderCsdBy opt f = renderEffBy opt (return . f)
instance (Sigs a, Sigs b) => RenderCsd (a -> SE b) where
renderCsdBy opt f = renderEffBy opt f
renderCsd :: RenderCsd a => a -> IO String
renderCsd = renderCsdBy def
writeCsd :: RenderCsd a => String -> a -> IO ()
writeCsd file a = writeFile file =<< renderCsd a
writeCsdBy :: RenderCsd a => Options -> String -> a -> IO ()
writeCsdBy opt file a = writeFile file =<< renderCsdBy opt a
playCsd :: (RenderCsd a) => (String -> IO ()) -> String -> a -> IO ()
playCsd = playCsdBy def
playCsdBy :: (RenderCsd a) => Options -> (String -> IO ()) -> String -> a -> IO ()
playCsdBy opt player file a = do
writeCsdBy opt fileCsd a
_ <- system $ "csound -o " ++ fileWav ++ " " ++ fileCsd
player fileWav
return ()
where fileCsd = file ++ ".csd"
fileWav = file ++ ".wav"
simplePlayCsdBy :: (RenderCsd a) => Options -> String -> String -> a -> IO ()
simplePlayCsdBy opt player = playCsdBy opt phi
where phi file = do
_ <- system $ player ++ " " ++ file
return ()
dac :: (RenderCsd a) => a -> IO ()
dac = dacBy def
dacBy :: (RenderCsd a) => Options -> a -> IO ()
dacBy opt a = do
writeCsdBy opt "tmp.csd" a
_ <- system $ "csound -odac " ++ "tmp.csd"
return ()
vdac :: (RenderCsd a) => a -> IO ()
vdac = dacBy (setVirtual def)
vdacBy :: (RenderCsd a) => Options -> a -> IO ()
vdacBy opt = dacBy (setVirtual opt)
setVirtual :: Options -> Options
setVirtual a = a { csdFlags = (csdFlags a) { rtmidi = Just VirtualMidi, midiRT = m { midiDevice = Just "0" } } }
where m = midiRT $ csdFlags a
csd :: (RenderCsd a) => a -> IO ()
csd = csdBy def
csdBy :: (RenderCsd a) => Options -> a -> IO ()
csdBy options a = do
writeCsdBy options "tmp.csd" a
_ <- system $ "csound tmp.csd"
return ()
mplayer :: (RenderCsd a) => a -> IO ()
mplayer = mplayerBy def
mplayerBy :: (RenderCsd a) => Options -> a -> IO ()
mplayerBy opt = simplePlayCsdBy opt "mplayer" "tmp"
totem :: (RenderCsd a) => a -> IO ()
totem = totemBy def
totemBy :: (RenderCsd a) => Options -> a -> IO ()
totemBy opt = simplePlayCsdBy opt "totem" "tmp"