packages feed

alsa-midi-0.3: examples/PlayNote.hs

module Main where

import qualified Sound.ALSA.Sequencer as SndSeq
import qualified Sound.ALSA.SequencerFFI as SndSeqFFI
import Control.Exception (bracket)


main :: IO ()
main =
   bracket
      (SndSeq.createClient SndSeqFFI.openOutput "note player")
      SndSeq.deleteClient $
      \ client ->
         do port <- SndSeq.createOutputPort client "play note"

            let ev =
                  SndSeqFFI.Event {
                     SndSeqFFI.typ = SndSeqFFI.EventNoteOn,
                     SndSeqFFI.tag = 0,
                     SndSeqFFI.queue = SndSeqFFI.queueDirect,
                     SndSeqFFI.time  = SndSeqFFI.TimeStampTick (SndSeqFFI.TickTime 0),
                     SndSeqFFI.timeMode = SndSeqFFI.TimeModeRelative,
                     SndSeqFFI.eventLength = SndSeqFFI.EventLengthFixed,
                     SndSeqFFI.priority = SndSeqFFI.PriorityNormal,
                     SndSeqFFI.source = SndSeq.portAddress client port,
                     SndSeqFFI.dest   = SndSeq.numAddress 128 0,
                     SndSeqFFI.eventData = SndSeqFFI.Note {
                        SndSeqFFI.noteChannel = 0,
                        SndSeqFFI.notePitch = 49,
                        SndSeqFFI.noteVelocity = 64,
                        SndSeqFFI.noteOffVelocity = 64,
                        SndSeqFFI.noteDuration = 0}
                   }
            SndSeq.sendPlainEvent client ev
            SndSeq.drainOutput client