module Sound.MIDI.Message.Class.Check (
C(..),
noteExplicitOff,
noteImplicitOff,
controller,
liftMidi,
liftFile,
) where
import qualified Sound.MIDI.Message.Class.Utility as CU
import Sound.MIDI.Message.Channel (Channel, )
import Sound.MIDI.Message.Channel.Voice (Pitch, Velocity, Program, Controller, )
import qualified Sound.MIDI.File.Event as FileEvent
import qualified Sound.MIDI.Message as MidiMsg
import qualified Sound.MIDI.Message.Channel as ChannelMsg
import qualified Sound.MIDI.Message.Channel.Mode as Mode
import Control.Monad (guard, )
class C event where
note :: Channel -> event -> Maybe (Velocity, Pitch, Bool)
program :: Channel -> event -> Maybe Program
anyController :: Channel -> event -> Maybe (Controller, Int)
pitchBend :: Channel -> event -> Maybe Int
channelPressure :: Channel -> event -> Maybe Int
mode :: Channel -> event -> Maybe Mode.T
note Channel
_chan event
_ev = Maybe (Velocity, Pitch, Bool)
forall a. Maybe a
Nothing
program Channel
_chan event
_ev = Maybe Program
forall a. Maybe a
Nothing
anyController Channel
_chan event
_ev = Maybe (Controller, Int)
forall a. Maybe a
Nothing
pitchBend Channel
_chan event
_ev = Maybe Int
forall a. Maybe a
Nothing
channelPressure Channel
_chan event
_ev = Maybe Int
forall a. Maybe a
Nothing
mode Channel
_chan event
_ev = Maybe T
forall a. Maybe a
Nothing
noteExplicitOff ::
(C event) =>
Channel -> event -> Maybe (Velocity, Pitch, Bool)
noteExplicitOff :: Channel -> event -> Maybe (Velocity, Pitch, Bool)
noteExplicitOff Channel
chan event
e =
((Velocity, Pitch, Bool) -> (Velocity, Pitch, Bool))
-> Maybe (Velocity, Pitch, Bool) -> Maybe (Velocity, Pitch, Bool)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Velocity, Pitch, Bool) -> (Velocity, Pitch, Bool)
CU.explicitNoteOff (Maybe (Velocity, Pitch, Bool) -> Maybe (Velocity, Pitch, Bool))
-> Maybe (Velocity, Pitch, Bool) -> Maybe (Velocity, Pitch, Bool)
forall a b. (a -> b) -> a -> b
$ Channel -> event -> Maybe (Velocity, Pitch, Bool)
forall event.
C event =>
Channel -> event -> Maybe (Velocity, Pitch, Bool)
note Channel
chan event
e
noteImplicitOff ::
(C event) =>
Channel -> event -> Maybe (Velocity, Pitch, Bool)
noteImplicitOff :: Channel -> event -> Maybe (Velocity, Pitch, Bool)
noteImplicitOff Channel
chan event
e =
((Velocity, Pitch, Bool) -> (Velocity, Pitch, Bool))
-> Maybe (Velocity, Pitch, Bool) -> Maybe (Velocity, Pitch, Bool)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Velocity, Pitch, Bool) -> (Velocity, Pitch, Bool)
CU.implicitNoteOff (Maybe (Velocity, Pitch, Bool) -> Maybe (Velocity, Pitch, Bool))
-> Maybe (Velocity, Pitch, Bool) -> Maybe (Velocity, Pitch, Bool)
forall a b. (a -> b) -> a -> b
$ Channel -> event -> Maybe (Velocity, Pitch, Bool)
forall event.
C event =>
Channel -> event -> Maybe (Velocity, Pitch, Bool)
note Channel
chan event
e
controller ::
(C event) =>
Channel -> Controller -> event -> Maybe Int
controller :: Channel -> Controller -> event -> Maybe Int
controller Channel
chan Controller
ctrl event
e = do
(Controller
c,Int
n) <- Channel -> event -> Maybe (Controller, Int)
forall event.
C event =>
Channel -> event -> Maybe (Controller, Int)
anyController Channel
chan event
e
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Controller
ctrlController -> Controller -> Bool
forall a. Eq a => a -> a -> Bool
==Controller
c)
Int -> Maybe Int
forall (m :: * -> *) a. Monad m => a -> m a
return Int
n
lift ::
(Maybe ChannelMsg.Body -> Maybe a) ->
Channel -> ChannelMsg.T -> Maybe a
lift :: (Maybe Body -> Maybe a) -> Channel -> T -> Maybe a
lift Maybe Body -> Maybe a
act Channel
chan T
msg = do
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (T -> Channel
ChannelMsg.messageChannel T
msg Channel -> Channel -> Bool
forall a. Eq a => a -> a -> Bool
== Channel
chan)
Maybe Body -> Maybe a
act (Maybe Body -> Maybe a) -> Maybe Body -> Maybe a
forall a b. (a -> b) -> a -> b
$ Body -> Maybe Body
forall a. a -> Maybe a
Just (Body -> Maybe Body) -> Body -> Maybe Body
forall a b. (a -> b) -> a -> b
$ T -> Body
ChannelMsg.messageBody T
msg
instance C ChannelMsg.T where
note :: Channel -> T -> Maybe (Velocity, Pitch, Bool)
note = (Maybe Body -> Maybe (Velocity, Pitch, Bool))
-> Channel -> T -> Maybe (Velocity, Pitch, Bool)
forall a. (Maybe Body -> Maybe a) -> Channel -> T -> Maybe a
lift Maybe Body -> Maybe (Velocity, Pitch, Bool)
CU.note
program :: Channel -> T -> Maybe Program
program = (Maybe Body -> Maybe Program) -> Channel -> T -> Maybe Program
forall a. (Maybe Body -> Maybe a) -> Channel -> T -> Maybe a
lift Maybe Body -> Maybe Program
CU.program
anyController :: Channel -> T -> Maybe (Controller, Int)
anyController = (Maybe Body -> Maybe (Controller, Int))
-> Channel -> T -> Maybe (Controller, Int)
forall a. (Maybe Body -> Maybe a) -> Channel -> T -> Maybe a
lift Maybe Body -> Maybe (Controller, Int)
CU.anyController
pitchBend :: Channel -> T -> Maybe Int
pitchBend = (Maybe Body -> Maybe Int) -> Channel -> T -> Maybe Int
forall a. (Maybe Body -> Maybe a) -> Channel -> T -> Maybe a
lift Maybe Body -> Maybe Int
CU.pitchBend
channelPressure :: Channel -> T -> Maybe Int
channelPressure = (Maybe Body -> Maybe Int) -> Channel -> T -> Maybe Int
forall a. (Maybe Body -> Maybe a) -> Channel -> T -> Maybe a
lift Maybe Body -> Maybe Int
CU.channelPressure
mode :: Channel -> T -> Maybe T
mode = (Maybe Body -> Maybe T) -> Channel -> T -> Maybe T
forall a. (Maybe Body -> Maybe a) -> Channel -> T -> Maybe a
lift Maybe Body -> Maybe T
CU.mode
liftMidi ::
(Channel -> ChannelMsg.T -> Maybe a) ->
(Channel -> MidiMsg.T -> Maybe a)
liftMidi :: (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftMidi Channel -> T -> Maybe a
checkMsg Channel
chan T
msg =
case T
msg of
MidiMsg.Channel T
chanMsg -> Channel -> T -> Maybe a
checkMsg Channel
chan T
chanMsg
T
_ -> Maybe a
forall a. Maybe a
Nothing
instance C MidiMsg.T where
note :: Channel -> T -> Maybe (Velocity, Pitch, Bool)
note = (Channel -> T -> Maybe (Velocity, Pitch, Bool))
-> Channel -> T -> Maybe (Velocity, Pitch, Bool)
forall a. (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftMidi Channel -> T -> Maybe (Velocity, Pitch, Bool)
forall event.
C event =>
Channel -> event -> Maybe (Velocity, Pitch, Bool)
note
program :: Channel -> T -> Maybe Program
program = (Channel -> T -> Maybe Program) -> Channel -> T -> Maybe Program
forall a. (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftMidi Channel -> T -> Maybe Program
forall event. C event => Channel -> event -> Maybe Program
program
anyController :: Channel -> T -> Maybe (Controller, Int)
anyController = (Channel -> T -> Maybe (Controller, Int))
-> Channel -> T -> Maybe (Controller, Int)
forall a. (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftMidi Channel -> T -> Maybe (Controller, Int)
forall event.
C event =>
Channel -> event -> Maybe (Controller, Int)
anyController
pitchBend :: Channel -> T -> Maybe Int
pitchBend = (Channel -> T -> Maybe Int) -> Channel -> T -> Maybe Int
forall a. (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftMidi Channel -> T -> Maybe Int
forall event. C event => Channel -> event -> Maybe Int
pitchBend
channelPressure :: Channel -> T -> Maybe Int
channelPressure = (Channel -> T -> Maybe Int) -> Channel -> T -> Maybe Int
forall a. (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftMidi Channel -> T -> Maybe Int
forall event. C event => Channel -> event -> Maybe Int
channelPressure
mode :: Channel -> T -> Maybe T
mode = (Channel -> T -> Maybe T) -> Channel -> T -> Maybe T
forall a. (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftMidi Channel -> T -> Maybe T
forall event. C event => Channel -> event -> Maybe T
mode
liftFile ::
(Channel -> ChannelMsg.T -> Maybe a) ->
(Channel -> FileEvent.T -> Maybe a)
liftFile :: (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftFile Channel -> T -> Maybe a
checkMsg Channel
chan T
msg =
case T
msg of
FileEvent.MIDIEvent T
midiMsg -> Channel -> T -> Maybe a
checkMsg Channel
chan T
midiMsg
T
_ -> Maybe a
forall a. Maybe a
Nothing
instance C FileEvent.T where
note :: Channel -> T -> Maybe (Velocity, Pitch, Bool)
note = (Channel -> T -> Maybe (Velocity, Pitch, Bool))
-> Channel -> T -> Maybe (Velocity, Pitch, Bool)
forall a. (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftFile Channel -> T -> Maybe (Velocity, Pitch, Bool)
forall event.
C event =>
Channel -> event -> Maybe (Velocity, Pitch, Bool)
note
program :: Channel -> T -> Maybe Program
program = (Channel -> T -> Maybe Program) -> Channel -> T -> Maybe Program
forall a. (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftFile Channel -> T -> Maybe Program
forall event. C event => Channel -> event -> Maybe Program
program
anyController :: Channel -> T -> Maybe (Controller, Int)
anyController = (Channel -> T -> Maybe (Controller, Int))
-> Channel -> T -> Maybe (Controller, Int)
forall a. (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftFile Channel -> T -> Maybe (Controller, Int)
forall event.
C event =>
Channel -> event -> Maybe (Controller, Int)
anyController
pitchBend :: Channel -> T -> Maybe Int
pitchBend = (Channel -> T -> Maybe Int) -> Channel -> T -> Maybe Int
forall a. (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftFile Channel -> T -> Maybe Int
forall event. C event => Channel -> event -> Maybe Int
pitchBend
channelPressure :: Channel -> T -> Maybe Int
channelPressure = (Channel -> T -> Maybe Int) -> Channel -> T -> Maybe Int
forall a. (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftFile Channel -> T -> Maybe Int
forall event. C event => Channel -> event -> Maybe Int
channelPressure
mode :: Channel -> T -> Maybe T
mode = (Channel -> T -> Maybe T) -> Channel -> T -> Maybe T
forall a. (Channel -> T -> Maybe a) -> Channel -> T -> Maybe a
liftFile Channel -> T -> Maybe T
forall event. C event => Channel -> event -> Maybe T
mode