packages feed

alsa-seq-0.6.0.4: examples/send-note.hs

import Common (handleExceptionCont, parseDestArgs, )

import qualified Sound.ALSA.Sequencer.Address as Addr
import qualified Sound.ALSA.Sequencer.Client as Client
import qualified Sound.ALSA.Sequencer.Port as Port
import qualified Sound.ALSA.Sequencer.Event as Event
import qualified Sound.ALSA.Sequencer as SndSeq

import Control.Monad.Trans.Cont (ContT(ContT), )
import Control.Monad.IO.Class (liftIO, )

import System.Environment (getArgs, )


main :: IO ()
main = handleExceptionCont $ do
  liftIO $ putStrLn "Starting."
  h <- ContT $ SndSeq.withDefault SndSeq.Block
  liftIO $ Client.setName h "Haskell-Send-Note"
  p <-
     ContT $
     Port.withSimple h "out"
        (Port.caps [Port.capRead, Port.capSubsRead]) Port.typeMidiGeneric
  liftIO $ mainIO h p

mainIO :: SndSeq.T SndSeq.OutputMode -> Port.T -> IO ()
mainIO h p = do
  c <- Client.getId h
  putStrLn ("Created sequencer with id: " ++ show c)
  conn <- parseDestArgs h (Addr.Cons c p) =<< getArgs
  let ev n =
         Event.forConnection conn $ Event.NoteEv n $
            Event.simpleNote (Event.Channel 0) (Event.Pitch 60) Event.normalVelocity
  _ <- Event.outputDirect h $ ev Event.NoteOn
  putStrLn "press Enter for stopping the note"
  _ <- getChar
  _ <- Event.outputDirect h $ ev Event.NoteOff
  return ()