hmidi-0.2.0.0: System/MIDI/Utility.hs
-- | Helper functions to make it easy to start messing around
module System.MIDI.Utility
( selectMidiDevice
, selectInputDevice
, selectOutputDevice
)
where
--------------------------------------------------------------------------------
import Data.List
import Control.Monad
import Control.Concurrent
import System.MIDI
import System.MIDI.Base
--------------------------------------------------------------------------------
maybeRead :: Read a => String -> Maybe a
maybeRead s = case reads s of
[(x,"")] -> Just x
_ -> Nothing
-- | Utility function to help choosing a midi device.
-- If there is only a single device, we select that.
-- You can also set a default device (by its name), which
-- will be automatically selected if present.
selectMidiDevice :: MIDIHasName a => Maybe String -> [a] -> IO a
selectMidiDevice mbdefault srclist = do
names <- mapM getName srclist
forM_ (zip [1..] names) $ \(i,name) -> putStrLn $ show i ++ ": " ++ name
let nsrc = length srclist
src <- case srclist of
[] -> fail "no midi devices found"
[x] -> return x
_ -> do
k <- case findIndex (==mbdefault) (map Just names) of
Just i -> return (i+1)
Nothing -> do
putStrLn "please select a midi device"
l <- getLine
let k = case maybeRead l of
Nothing -> nsrc
Just m -> if m<1 || m>nsrc then nsrc else m
return k
putStrLn $ "device #" ++ show k ++ " (" ++ names!!(k-1) ++ ") selected."
return $ srclist!!(k-1)
return src
-- | Select a MIDI input device (source)
selectInputDevice :: Maybe String -> IO Source
selectInputDevice mbdefault = do
srclist <- enumerateSources
putStrLn "midi sources:"
src <- selectMidiDevice mbdefault srclist
return src
-- | Select a MIDI output device (destination)
selectOutputDevice :: Maybe String -> IO Destination
selectOutputDevice mbdefault = do
dstlist <- enumerateDestinations
putStrLn "\nmidi destinations:"
dst <- selectMidiDevice mbdefault dstlist
return dst
--------------------------------------------------------------------------------