module Main where import Common import qualified Sound.MIDI.Message.Channel.Mode as Mode import qualified Sound.MIDI.Message.Channel as ChannelMsg import qualified Sound.MIDI.ALSA as MidiAlsa import qualified Sound.ALSA.Sequencer.Event as Event import qualified Sound.ALSA.Sequencer as SndSeq import Graphics.UI.WX (Prop((:=)), set, get, text, selection, command, on, close, container, widget, layout, margin, label, row, column, ) import qualified Graphics.UI.WX as WX makeGUI :: Sequencer SndSeq.OutputMode -> IO () makeGUI sequ = do f <- WX.frame [text := "MIDI Mode"] p <- WX.panel f [] allNotesOff <- WX.button p [text := "All Notes Off"] allSoundOff <- WX.button p [text := "All Sound Off"] chan <- WX.spinCtrl p 0 15 [] let getChan = fmap ChannelMsg.toChannel $ get chan selection set allNotesOff [ on command := getChan >>= \c -> sendMode sequ c Mode.AllNotesOff ] set allSoundOff [ on command := getChan >>= \c -> sendMode sequ c Mode.AllSoundOff ] quit <- WX.button p [text := "Quit", on command := close f] set f [layout := container p $ margin 10 $ column 5 $ WX.hfill (widget allNotesOff) : WX.hfill (widget allSoundOff) : (row 5 $ WX.valignCentre (label "Channel") : widget chan : []) : WX.hfill (widget quit) : []] sendMode :: Sequencer SndSeq.OutputMode -> ChannelMsg.Channel -> Mode.T -> IO () sendMode h chan mode = do sendEvent h $ Event.CtrlEv Event.Controller $ MidiAlsa.modeEvent chan mode main :: IO () main = withSequencer "Mode" $ WX.start . makeGUI