------------------------------------------------------------------------------ -- JackMiniMix.hs -- created: Tue Aug 10 18:05:33 JST 2010 ------------------------------------------------------------------------------ -- -- Module : Sound.JackMiniMix -- Copyright : (c) Renick Bell 2010 -- License : GPL -- -- Maintainer : renick@gmail.com -- Stability : provisional -- Portability : Linux only? Does it work on OSX? -- -- ------------------------------------------------------------------------------ -- | This is a module to control JackMiniMix, a GPL mixer for the Jack Audio Connection Kit using OpenSoundControl (OSC). -- -- JackMiniMix was written by Nicholas J Humfrey. -- -- OSC was developed at CNMAT by Adrian Freed and Matt Wright. -- -- The documentation was mostly taken from the source of JackMiniMix by Humfrey. -- -- This module requires that the JackMiniMix program be installed. -- -- For general usage, use the camel case functions; they're easier. The functions with underscores in the name need to be called using the withJackMiniMix function; the camelCase ones already include it. module Sound.JackMiniMix where import Sound.OpenSoundControl.Transport import Sound.OpenSoundControl.Transport.UDP import Sound.OpenSoundControl.OSC -- | Bracket JackMiniMix communication. withJackMiniMix :: Int -> (UDP -> IO a) -> IO a withJackMiniMix port = withTransport (openUDP "127.0.0.1" port) channel_count :: (Transport t) => t -> IO OSC channel_count fd = let m = Message "/mixer/get_channel_count" [] in send fd m >> wait fd "/mixer/channel_count" -- | Returns the number of stereo input channels that the mixer has. -- -- The OSC message: -- -- \/mixer\/get_channel_count - Get the number of channels -- -- replies with: -- -- \/mixer\/channel_count (i) channelCount :: Int -- ^ the port number -> IO OSC channelCount port = withJackMiniMix port (\x -> channel_count x) get_channel_gain :: (Transport t) => t -> Int -> IO OSC get_channel_gain fd channel = let m = Message "/mixer/channel/get_gain" [Int channel] in send fd m >> wait fd "/mixer/channel/gain" -- | Returns the gain (in decibels) of channel. -- -- The OSC message: -- -- \/mixer\/channel\/get_gain (i) - Get gain of channel i -- -- replies with: -- -- \/mixer\/channel\/gain (if) -- -- channel is the number of the channel (in range 1 to total number of channels). getChannelGain :: Int -- ^ the port number -> Int -- ^ the channel -> IO OSC getChannelGain port channel = let getter x = get_channel_gain x channel in withJackMiniMix port getter set_channel_gain :: (Transport t) => t -> Int -> Double -> IO OSC set_channel_gain fd channel gain = let m = Message "/mixer/channel/set_gain" [Int channel,Float gain] in send fd m >> wait fd "/mixer/channel/gain" -- | Sets the gain of channel channel to gain dB. -- -- The OSC message: -- -- \/mixer\/channel\/set_gain (if) - Set the gain of channel i to f dB -- -- replies with: -- -- \/mixer\/channel\/gain (if) -- -- channel is the number of the channel (in range 1 to total number of channels). -- -- gain is the gain (in decibels) to set the channel to (in range -90 to 90 dB). setChannelGain :: Int -- ^ the port number -> Int -- ^ the channel number -> Double -- ^ the new gain -> IO OSC setChannelGain port channel gain = let setter x = set_channel_gain x channel gain in withJackMiniMix port setter get_channel_label :: (Transport t) => t -> Int -> IO OSC get_channel_label fd channel = let m = Message "/mixer/channel/get_label" [Int channel] in send fd m >> wait fd "/mixer/channel/label" -- | Returns the label (string) of channel number channel. -- -- The OSC message: -- -- \/mixer\/channel\/get_label (i) - Get the label of channel i -- -- replies with: -- -- \/mixer\/channel\/label (is) -- -- channel is the number of the channel (in range 1 to total number of channels). getChannelLabel :: Int -- ^ the port number -> Int -- ^ the channel -> IO OSC getChannelLabel port channel = let getter x = get_channel_label x channel in withJackMiniMix port getter set_channel_label :: (Transport t) => t -> Int -> String -> IO OSC set_channel_label fd channel label = let m = Message "/mixer/channel/set_label" [Int channel,String label] in send fd m >> wait fd "/mixer/channel/label" -- | Sets the label (string) of channel number channel to label. -- -- The OSC message: -- -- \/mixer\/channel\/set_label (is) - Set the label of channel i to s -- -- replies with: -- -- \/mixer\/channel\/label (is) -- -- channel is the number of the channel (in range 1 to total number of channels). -- -- label is the new label for the channel. setChannelLabel :: Int -- ^ the port number -> Int -- ^ the channel -> String -- ^ the new channel label -> IO OSC setChannelLabel port channel label = let setter x = set_channel_label x channel label in withJackMiniMix port setter ping :: (Transport t) => t -> IO OSC ping fd = let m = Message "/ping" [] in send fd m >> wait fd "/pong" -- | Pings the mixer to see if it is there. -- -- The OSC message: -- -- \/ping - Check mixer is still there -- -- replies with: -- -- \/pong pingMixer :: Int -- ^ the port number -> IO OSC pingMixer port = withJackMiniMix port (\x -> ping x)