-- -- A very simple example application using System.MIDI. -- It's a basic MIDI monitor: prints all the incoming messages. -- module Main where import Control.Monad import Control.Concurrent import System.MIDI -- the essence mythread conn = do events <- getEvents conn mapM_ print events (threadDelay 5000) mythread conn -- source / destination selection maybeRead :: Read a => String -> Maybe a maybeRead s = case reads s of [(x,"")] -> Just x _ -> Nothing select 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 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 } putStrLn $ "device #" ++ show k ++ " selected." return $ srclist!!(k-1) return src -- main main = do srclist <- enumerateSources putStrLn "midi sources:" src <- select srclist conn <- openSource src Nothing putStrLn "connected" threadid <- forkIO (mythread conn) start conn ; putStrLn "started. Press 'ENTER' to exit." getLine stop conn ; putStrLn "stopped." killThread threadid close conn ; putStrLn "closed."