Treat a stream of MIDI events as parallel streams of MIDI controller events.
- data T key a
- data Controller
- fromChannel :: Channel -> Filter (T Controller Int)
- controllerLinear :: C y => Controller -> (y, y) -> y -> Filter (T y)
- controllerExponential :: C y => Controller -> (y, y) -> y -> Filter (T y)
- pitchBend :: C y => y -> y -> Filter (T y)
- channelPressure :: C y => y -> y -> Filter (T y)
- data BendModulation a = BendModulation a a
- shiftBendModulation :: C a => a -> BendModulation a -> BendModulation a
- bendWheelPressure :: (C y, C y) => Int -> y -> y -> Filter (T (BendModulation y))
|(Show key, Show a) => Show (T key a)|
|Monoid (T key y)|
|Read (T key a)|
|(NFData key, NFData a) => NormalForm (T key a)|
|Ord key => Transform (T key y)|
For reverse you must make sure, that all controller events have an corresponding initial value. Controllers that miss an initial value their last constant piece will be undefined.
pitchBend channel range center:
emits frequencies on an exponential scale from
|BendModulation a a|
Multiply the pitch bend by a given factor. This way you can e.g. shift the pitch bend from around 1 to the actual frequency.