-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Process MIDI events via reactive-banana and JACK
--
-- MIDI is the Musical Instrument Digital Interface, JACK is the JACK
-- Audio Connection Kit. This package allows to manipulate a sequence of
-- MIDI events via JACK. It is intended to be plugged as a playing
-- assistant between a MIDI input device (e.g. a keyboard or a controller
-- bank) and a MIDI controlled synthesizer (e.g. a software synthesizer
-- or an external synthesizer). For software synthesizers see the Haskell
-- packages synthesizer-alsa, synthesizer-llvm,
-- supercollider-midi, hsc3, YampaSynth or the
-- C packages fluidsynth and Timidity.
--
-- Applications include: Remapping of channels, controller, instruments,
-- keys, Keyboard splitting, Conversion from notes to controllers, Latch
-- mode, Convert parallel chords to serial patterns, Automated change of
-- MIDI controllers, Delay and echo.
--
-- It is intended that you write programs for MIDI stream manipulation.
-- It is not intended to provide an executable program with all the
-- functionality available in a custom programming interface. It is most
-- fun to play with the stream editors in GHCi. However we provide an
-- example module that demonstrates various effects.
@package reactive-jack
@version 0.3
module Reactive.Banana.JACK.Common
data Handle
Handle :: Client -> Port Input -> Port Output -> Handle
[client] :: Handle -> Client
[portIn] :: Handle -> Port Input
[portOut] :: Handle -> Port Output
with :: ReaderT Handle (ExceptionalT All IO) () -> IO ()
module Reactive.Banana.JACK.Process
data Context
Context :: IORef AbsoluteTicks -> IORef InQueue -> Client -> Context
[contextCycleStartRef] :: Context -> IORef AbsoluteTicks
[contextInQueueRef] :: Context -> IORef InQueue
[contextClient] :: Context -> Client
newtype Schedule
Schedule :: Int -> Schedule
newtype Reactor a
Reactor :: ReaderT Context (StateT Schedule MomentIO) a -> Reactor a
[runReactor] :: Reactor a -> ReaderT Context (StateT Schedule MomentIO) a
data InEvent
InEvent :: (Map Schedule [Handler AbsoluteTicks]) -> [T] -> InEvent
inEventBeat :: T InEvent (Map Schedule [Handler AbsoluteTicks])
type InQueue = Map NFrames InEvent
type OutQueue = Map NFrames [T]
run :: (ThrowsErrno e) => (Event T -> Event [T]) -> ReaderT Handle (ExceptionalT e IO) ()
runM :: (ThrowsErrno e) => (Behavior AbsoluteTicks -> Event T -> Reactor (Event [T])) -> ReaderT Handle (ExceptionalT e IO) ()
viewQueueL :: InQueue -> Maybe ((NFrames, Either [Handler AbsoluteTicks] T), InQueue)
normalizeInQueue :: InQueue -> InQueue
reduceQueueTime :: NFrames -> Map NFrames a -> Map NFrames a
process :: Handle -> IORef AbsoluteTicks -> IORef InQueue -> IORef OutQueue -> Handler (NFrames, NFrames) -> Handler T -> NFrames -> ExceptionalT Errno IO ()
type RelativeTicks = T Reactor Relative Ticks
type AbsoluteTicks = T Reactor Absolute Ticks
type RelativeSeconds = T Reactor Relative Seconds
nframesFromTicks :: RelativeTicks -> NFrames
ticksFromNFrames :: NFrames -> RelativeTicks
absTicksFromNFrames :: NFrames -> AbsoluteTicks
sendBeat :: Context -> Schedule -> Handler AbsoluteTicks -> AbsoluteTicks -> IO ()
cancelBeats :: Context -> Schedule -> IO ()
instance Control.Monad.Fix.MonadFix Reactive.Banana.JACK.Process.Reactor
instance Control.Monad.IO.Class.MonadIO Reactive.Banana.JACK.Process.Reactor
instance GHC.Base.Monad Reactive.Banana.JACK.Process.Reactor
instance GHC.Base.Applicative Reactive.Banana.JACK.Process.Reactor
instance GHC.Base.Functor Reactive.Banana.JACK.Process.Reactor
instance GHC.Show.Show Reactive.Banana.JACK.Process.Schedule
instance GHC.Enum.Enum Reactive.Banana.JACK.Process.Schedule
instance GHC.Classes.Ord Reactive.Banana.JACK.Process.Schedule
instance GHC.Classes.Eq Reactive.Banana.JACK.Process.Schedule
instance Reactive.Banana.Types.MonadMoment Reactive.Banana.JACK.Process.Reactor
instance Reactive.Banana.MIDI.Process.MomentIO Reactive.Banana.JACK.Process.Reactor
instance Reactive.Banana.MIDI.Time.Timed Reactive.Banana.JACK.Process.Reactor
instance GHC.Base.Monoid Reactive.Banana.JACK.Process.InEvent
instance Reactive.Banana.MIDI.Process.Reactor Reactive.Banana.JACK.Process.Reactor
module Reactive.Banana.JACK.Example
melody :: Event (pitch, Velocity) -> Reactor (Event [Boundary pitch Velocity])
time :: Rational -> RelativeSeconds
ticks :: Rational -> Reactor RelativeTicks
getTempo :: (C ev) => Event ev -> Reactor (Behavior RelativeTicks, Event ev)
loop :: Behavior AbsoluteTicks -> Event T -> Reactor (Event [T])