module Main where import qualified Sound.ALSA.Sequencer as SndSeq import qualified Sound.ALSA.Sequencer.FFI 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