Safe Haskell | None |
---|---|
Language | Haskell98 |
Trivial midi functions.
- b_join :: Bits a => a -> a -> a
- b_sep :: (Num t, Bits t) => t -> (t, t)
- data Midi_Message a
- = Chanel_Aftertouch a a
- | Control_Change a a a
- | Note_On a a a
- | Note_Off a a a
- | Polyphic_Key_Pressure a a a
- | Program_Change a a
- | Pitch_Bend a a
- | Unknown [a]
- data Control_Message a
- = All_Notes_Off a
- | All_Sound_Off a
- | Balance a a
- | Bank_Select a a
- | Breath_Controller a a
- | Expression_Controller a a
- | Foot_Controller a a
- | Local_Control a a
- | Modulation_Wheel a a
- | Mono_Mode_On a a
- | Omni_Mode_Off a
- | Omni_Mode_On a
- | Pan a a
- | Poly_Mode_On a
- | Portamento_On_Off a a
- | Portamento_Time a a
- | Reset_All_Controllers a a
- | Soft_Pedal_On_Off a a
- | Sostenuto_On_Off a a
- | Sustain_On_Off a a
- | Undefined
- control_message :: (Eq a, Num a) => (a, a, a) -> Control_Message a
- parse_b :: Integral n => Message -> [n]
- parse_c :: Integral n => Message -> [n]
- parse_m :: (Bits n, Integral n) => Message -> Midi_Message n
- type Node_Id = Int
- data KY a = KY (Map a Node_Id) Node_Id
- ky_init :: Node_Id -> KY a
- ky_alloc :: Ord a => KY a -> a -> (KY a, Node_Id)
- ky_free :: Ord a => KY a -> a -> (KY a, Node_Id)
- ky_get :: Ord a => KY a -> a -> Node_Id
- ky_all :: KY a -> [Node_Id]
- type Midi_Init_f st = UDP -> IO st
- type Midi_Recv_f st = UDP -> st -> Midi_Message Int -> IO st
- midi_act :: Midi_Recv_f st -> UDP -> st -> Message -> IO st
- run_midi :: Midi_Init_f st -> Midi_Recv_f st -> IO ()
- iterateM_ :: Monad m => st -> (st -> m st) -> m ()
Bits
b_join :: Bits a => a -> a -> a Source
Join two 7-bit values into a 14-bit value.
map (uncurry b_join) [(0,0),(0,64),(127,127)] == [0,8192,16383]
b_sep :: (Num t, Bits t) => t -> (t, t) Source
Inverse of b_join
.
map b_sep [0,8192,16383] == [(0,0),(0,64),(127,127)]
Types
data Midi_Message a Source
Chanel_Aftertouch a a | |
Control_Change a a a | |
Note_On a a a | |
Note_Off a a a | |
Polyphic_Key_Pressure a a a | |
Program_Change a a | |
Pitch_Bend a a | |
Unknown [a] |
Eq a => Eq (Midi_Message a) | |
Show a => Show (Midi_Message a) |
data Control_Message a Source
Control_Change
midi messages have, in some cases, commonly
defined meanings.
All_Notes_Off a | |
All_Sound_Off a | |
Balance a a | |
Bank_Select a a | |
Breath_Controller a a | |
Expression_Controller a a | |
Foot_Controller a a | |
Local_Control a a | |
Modulation_Wheel a a | |
Mono_Mode_On a a | |
Omni_Mode_Off a | |
Omni_Mode_On a | |
Pan a a | |
Poly_Mode_On a | |
Portamento_On_Off a a | |
Portamento_Time a a | |
Reset_All_Controllers a a | |
Soft_Pedal_On_Off a a | |
Sostenuto_On_Off a a | |
Sustain_On_Off a a | |
Undefined |
Eq a => Eq (Control_Message a) | |
Show a => Show (Control_Message a) |
control_message :: (Eq a, Num a) => (a, a, a) -> Control_Message a Source
Control_Change
midi messages may, in some cases, have commonly
defined meanings.
control_message (0,123,0) == All_Notes_Off 0
OSC
parse_c :: Integral n => Message -> [n] Source
Variant of parse_b
that give status byte as low and high.
parse_m :: (Bits n, Integral n) => Message -> Midi_Message n Source
Variant of parse_c
that constructs a Midi_Message
.
SC3
Map of allocated Node_Id
s. For a single input controller, key
events always arrive in sequence (ie. on->off), ie. for any key on
message we can allocate an ID and associate it with the key, an off
message can retrieve the ID given the key.
IO (midi-osc)
type Midi_Init_f st = UDP -> IO st Source
type Midi_Recv_f st = UDP -> st -> Midi_Message Int -> IO st Source
Midi_Recv_f
is passed the SC3
connection, the user state, a
Midi_Message
and, for Note_On
and Note_Off
messages, a
Node_Id
.
midi_act :: Midi_Recv_f st -> UDP -> st -> Message -> IO st Source
Parse incoming midi messages and run Midi_Receiver
.
run_midi :: Midi_Init_f st -> Midi_Recv_f st -> IO () Source
Connect to midi-osc
and sc3
, run initialiser, and then
receiver for each incoming message.