{-# Language TypeFamilies, FlexibleInstances, FlexibleContexts #-}
module Csound.Control.Overload.MidiInstr(
    MidiInstr(..), MidiInstrTemp(..)
) where

import Csound.Typed
import Csound.Typed.Opcode

import Csound.Tuning

ampCps :: Msg -> (D, D)
ampCps :: Msg -> (D, D)
ampCps Msg
msg = (Msg -> D -> D
ampmidi Msg
msg D
1, Msg -> D
cpsmidi Msg
msg)

-- | Midi message convertion to Hz with custom temperament.
cpsmidi' :: Temp -> Msg -> D
cpsmidi' :: Temp -> Msg -> D
cpsmidi' (Temp Tab
t) Msg
msg = Msg -> Tab -> D
cpstmid Msg
msg Tab
t

ampCps' :: Temp -> Msg -> (D, D)
ampCps' :: Temp -> Msg -> (D, D)
ampCps' Temp
temp Msg
msg = (Msg -> D -> D
ampmidi Msg
msg D
1, Temp -> Msg -> D
cpsmidi' Temp
temp Msg
msg)

-------------------------------------------------------------------------------

-- | Converts a value to the midi-instrument. It's used with the functions 'Csound.Base.midi', 'Csound.Base.midin'.
class MidiInstr a where
    type MidiInstrOut a :: *

    onMsg :: a -> Msg -> SE (MidiInstrOut a)

-- just sig

instance MidiInstr (Msg -> Sig) where
    type MidiInstrOut (Msg -> Sig) = Sig

    onMsg :: (Msg -> Sig) -> Msg -> SE (MidiInstrOut (Msg -> Sig))
onMsg Msg -> Sig
f = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> (Msg -> Sig) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> Sig
f

instance MidiInstr (Msg -> (Sig, Sig)) where
    type MidiInstrOut (Msg -> (Sig, Sig)) = (Sig, Sig)

    onMsg :: (Msg -> (Sig, Sig)) -> Msg -> SE (MidiInstrOut (Msg -> (Sig, Sig)))
onMsg Msg -> (Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, Sig)
f

instance MidiInstr (Msg -> (Sig, Sig, Sig)) where
    type MidiInstrOut (Msg -> (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: (Msg -> (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut (Msg -> (Sig, Sig, Sig)))
onMsg Msg -> (Sig, Sig, Sig)
f = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, Sig, Sig)
f

instance MidiInstr (Msg -> (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut (Msg -> (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: (Msg -> (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut (Msg -> (Sig, Sig, Sig, Sig)))
onMsg Msg -> (Sig, Sig, Sig, Sig)
f = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, Sig, Sig, Sig)
f

-- se sig

instance MidiInstr (Msg -> SE Sig) where
    type MidiInstrOut (Msg -> SE Sig) = Sig

    onMsg :: (Msg -> SE Sig) -> Msg -> SE (MidiInstrOut (Msg -> SE Sig))
onMsg Msg -> SE Sig
f = Msg -> SE Sig
Msg -> SE (MidiInstrOut (Msg -> SE Sig))
f

instance MidiInstr (Msg -> SE (Sig, Sig)) where
    type MidiInstrOut (Msg -> SE (Sig, Sig)) = (Sig, Sig)

    onMsg :: (Msg -> SE (Sig, Sig))
-> Msg -> SE (MidiInstrOut (Msg -> SE (Sig, Sig)))
onMsg Msg -> SE (Sig, Sig)
f = Msg -> SE (Sig, Sig)
Msg -> SE (MidiInstrOut (Msg -> SE (Sig, Sig)))
f

instance MidiInstr (Msg -> SE (Sig, Sig, Sig)) where
    type MidiInstrOut (Msg -> SE (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: (Msg -> SE (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut (Msg -> SE (Sig, Sig, Sig)))
onMsg Msg -> SE (Sig, Sig, Sig)
f = Msg -> SE (Sig, Sig, Sig)
Msg -> SE (MidiInstrOut (Msg -> SE (Sig, Sig, Sig)))
f

instance MidiInstr (Msg -> SE (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut (Msg -> SE (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: (Msg -> SE (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut (Msg -> SE (Sig, Sig, Sig, Sig)))
onMsg Msg -> SE (Sig, Sig, Sig, Sig)
f = Msg -> SE (Sig, Sig, Sig, Sig)
Msg -> SE (MidiInstrOut (Msg -> SE (Sig, Sig, Sig, Sig)))
f

-- by (Sig, Sig)

sig2 :: Msg -> (Sig, Sig)
sig2 :: Msg -> (Sig, Sig)
sig2 Msg
msg = (D -> Sig
sig D
amp, D -> Sig
sig D
cps)
    where (D
amp, D
cps) = Msg -> (D, D)
ampCps Msg
msg

instance MidiInstr ((Sig, Sig) -> Sig) where
    type MidiInstrOut ((Sig, Sig) -> Sig) = Sig

    onMsg :: ((Sig, Sig) -> Sig) -> Msg -> SE (MidiInstrOut ((Sig, Sig) -> Sig))
onMsg (Sig, Sig) -> Sig
f = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> (Msg -> Sig) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, Sig) -> Sig
f ((Sig, Sig) -> Sig) -> (Msg -> (Sig, Sig)) -> Msg -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, Sig)
sig2

instance MidiInstr ((Sig, Sig) -> (Sig, Sig)) where
    type MidiInstrOut ((Sig, Sig) -> (Sig, Sig)) = (Sig, Sig)

    onMsg :: ((Sig, Sig) -> (Sig, Sig))
-> Msg -> SE (MidiInstrOut ((Sig, Sig) -> (Sig, Sig)))
onMsg (Sig, Sig) -> (Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, Sig) -> (Sig, Sig)
f ((Sig, Sig) -> (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, Sig)
sig2

instance MidiInstr ((Sig, Sig) -> (Sig, Sig, Sig)) where
    type MidiInstrOut ((Sig, Sig) -> (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: ((Sig, Sig) -> (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((Sig, Sig) -> (Sig, Sig, Sig)))
onMsg (Sig, Sig) -> (Sig, Sig, Sig)
f = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, Sig) -> (Sig, Sig, Sig)
f ((Sig, Sig) -> (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, Sig)
sig2

instance MidiInstr ((Sig, Sig) -> (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut ((Sig, Sig) -> (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: ((Sig, Sig) -> (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((Sig, Sig) -> (Sig, Sig, Sig, Sig)))
onMsg (Sig, Sig) -> (Sig, Sig, Sig, Sig)
f = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, Sig) -> (Sig, Sig, Sig, Sig)
f ((Sig, Sig) -> (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, Sig)
sig2

-- se sig

instance MidiInstr ((Sig, Sig) -> SE Sig) where
    type MidiInstrOut ((Sig, Sig) -> SE Sig) = Sig

    onMsg :: ((Sig, Sig) -> SE Sig)
-> Msg -> SE (MidiInstrOut ((Sig, Sig) -> SE Sig))
onMsg (Sig, Sig) -> SE Sig
f = (Sig, Sig) -> SE Sig
f ((Sig, Sig) -> SE Sig) -> (Msg -> (Sig, Sig)) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, Sig)
sig2

instance MidiInstr ((Sig, Sig) -> SE (Sig, Sig)) where
    type MidiInstrOut ((Sig, Sig) -> SE (Sig, Sig)) = (Sig, Sig)

    onMsg :: ((Sig, Sig) -> SE (Sig, Sig))
-> Msg -> SE (MidiInstrOut ((Sig, Sig) -> SE (Sig, Sig)))
onMsg (Sig, Sig) -> SE (Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig)
f ((Sig, Sig) -> SE (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, Sig)
sig2

instance MidiInstr ((Sig, Sig) -> SE (Sig, Sig, Sig)) where
    type MidiInstrOut ((Sig, Sig) -> SE (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: ((Sig, Sig) -> SE (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((Sig, Sig) -> SE (Sig, Sig, Sig)))
onMsg (Sig, Sig) -> SE (Sig, Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig, Sig)
f ((Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, Sig)
sig2

instance MidiInstr ((Sig, Sig) -> SE (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut ((Sig, Sig) -> SE (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: ((Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((Sig, Sig) -> SE (Sig, Sig, Sig, Sig)))
onMsg (Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
f ((Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, Sig)
sig2

-- by Sig / D

dsig :: Msg -> (D, Sig)
dsig :: Msg -> (D, Sig)
dsig Msg
msg = (D
amp, D -> Sig
sig D
cps)
    where (D
amp, D
cps) = Msg -> (D, D)
ampCps Msg
msg

instance MidiInstr ((D, Sig) -> Sig) where
    type MidiInstrOut ((D, Sig) -> Sig) = Sig

    onMsg :: ((D, Sig) -> Sig) -> Msg -> SE (MidiInstrOut ((D, Sig) -> Sig))
onMsg (D, Sig) -> Sig
f = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> (Msg -> Sig) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, Sig) -> Sig
f ((D, Sig) -> Sig) -> (Msg -> (D, Sig)) -> Msg -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, Sig)
dsig

instance MidiInstr ((D, Sig) -> (Sig, Sig)) where
    type MidiInstrOut ((D, Sig) -> (Sig, Sig)) = (Sig, Sig)

    onMsg :: ((D, Sig) -> (Sig, Sig))
-> Msg -> SE (MidiInstrOut ((D, Sig) -> (Sig, Sig)))
onMsg (D, Sig) -> (Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, Sig) -> (Sig, Sig)
f ((D, Sig) -> (Sig, Sig)) -> (Msg -> (D, Sig)) -> Msg -> (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, Sig)
dsig

instance MidiInstr ((D, Sig) -> (Sig, Sig, Sig)) where
    type MidiInstrOut ((D, Sig) -> (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: ((D, Sig) -> (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((D, Sig) -> (Sig, Sig, Sig)))
onMsg (D, Sig) -> (Sig, Sig, Sig)
f = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, Sig) -> (Sig, Sig, Sig)
f ((D, Sig) -> (Sig, Sig, Sig))
-> (Msg -> (D, Sig)) -> Msg -> (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, Sig)
dsig

instance MidiInstr ((D, Sig) -> (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut ((D, Sig) -> (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: ((D, Sig) -> (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((D, Sig) -> (Sig, Sig, Sig, Sig)))
onMsg (D, Sig) -> (Sig, Sig, Sig, Sig)
f = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, Sig) -> (Sig, Sig, Sig, Sig)
f ((D, Sig) -> (Sig, Sig, Sig, Sig))
-> (Msg -> (D, Sig)) -> Msg -> (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, Sig)
dsig

-- se sig

instance MidiInstr ((D, Sig) -> SE Sig) where
    type MidiInstrOut ((D, Sig) -> SE Sig) = Sig

    onMsg :: ((D, Sig) -> SE Sig)
-> Msg -> SE (MidiInstrOut ((D, Sig) -> SE Sig))
onMsg (D, Sig) -> SE Sig
f = (D, Sig) -> SE Sig
f ((D, Sig) -> SE Sig) -> (Msg -> (D, Sig)) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, Sig)
dsig

instance MidiInstr ((D, Sig) -> SE (Sig, Sig)) where
    type MidiInstrOut ((D, Sig) -> SE (Sig, Sig)) = (Sig, Sig)

    onMsg :: ((D, Sig) -> SE (Sig, Sig))
-> Msg -> SE (MidiInstrOut ((D, Sig) -> SE (Sig, Sig)))
onMsg (D, Sig) -> SE (Sig, Sig)
f = (D, Sig) -> SE (Sig, Sig)
f ((D, Sig) -> SE (Sig, Sig))
-> (Msg -> (D, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, Sig)
dsig

instance MidiInstr ((D, Sig) -> SE (Sig, Sig, Sig)) where
    type MidiInstrOut ((D, Sig) -> SE (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: ((D, Sig) -> SE (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((D, Sig) -> SE (Sig, Sig, Sig)))
onMsg (D, Sig) -> SE (Sig, Sig, Sig)
f = (D, Sig) -> SE (Sig, Sig, Sig)
f ((D, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (D, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, Sig)
dsig

instance MidiInstr ((D, Sig) -> SE (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut ((D, Sig) -> SE (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: ((D, Sig) -> SE (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((D, Sig) -> SE (Sig, Sig, Sig, Sig)))
onMsg (D, Sig) -> SE (Sig, Sig, Sig, Sig)
f = (D, Sig) -> SE (Sig, Sig, Sig, Sig)
f ((D, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (D, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, Sig)
dsig

-- by Sig / D

sigd :: Msg -> (Sig, D)
sigd :: Msg -> (Sig, D)
sigd Msg
msg = (D -> Sig
sig D
amp, D
cps)
    where (D
amp, D
cps) = Msg -> (D, D)
ampCps Msg
msg

instance MidiInstr ((Sig, D) -> Sig) where
    type MidiInstrOut ((Sig, D) -> Sig) = Sig

    onMsg :: ((Sig, D) -> Sig) -> Msg -> SE (MidiInstrOut ((Sig, D) -> Sig))
onMsg (Sig, D) -> Sig
f = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> (Msg -> Sig) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, D) -> Sig
f ((Sig, D) -> Sig) -> (Msg -> (Sig, D)) -> Msg -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, D)
sigd

instance MidiInstr ((Sig, D) -> (Sig, Sig)) where
    type MidiInstrOut ((Sig, D) -> (Sig, Sig)) = (Sig, Sig)

    onMsg :: ((Sig, D) -> (Sig, Sig))
-> Msg -> SE (MidiInstrOut ((Sig, D) -> (Sig, Sig)))
onMsg (Sig, D) -> (Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, D) -> (Sig, Sig)
f ((Sig, D) -> (Sig, Sig)) -> (Msg -> (Sig, D)) -> Msg -> (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, D)
sigd

instance MidiInstr ((Sig, D) -> (Sig, Sig, Sig)) where
    type MidiInstrOut ((Sig, D) -> (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: ((Sig, D) -> (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((Sig, D) -> (Sig, Sig, Sig)))
onMsg (Sig, D) -> (Sig, Sig, Sig)
f = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, D) -> (Sig, Sig, Sig)
f ((Sig, D) -> (Sig, Sig, Sig))
-> (Msg -> (Sig, D)) -> Msg -> (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, D)
sigd

instance MidiInstr ((Sig, D) -> (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut ((Sig, D) -> (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: ((Sig, D) -> (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((Sig, D) -> (Sig, Sig, Sig, Sig)))
onMsg (Sig, D) -> (Sig, Sig, Sig, Sig)
f = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, D) -> (Sig, Sig, Sig, Sig)
f ((Sig, D) -> (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, D)) -> Msg -> (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, D)
sigd

-- se sig

instance MidiInstr ((Sig, D) -> SE Sig) where
    type MidiInstrOut ((Sig, D) -> SE Sig) = Sig

    onMsg :: ((Sig, D) -> SE Sig)
-> Msg -> SE (MidiInstrOut ((Sig, D) -> SE Sig))
onMsg (Sig, D) -> SE Sig
f = (Sig, D) -> SE Sig
f ((Sig, D) -> SE Sig) -> (Msg -> (Sig, D)) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, D)
sigd

instance MidiInstr ((Sig, D) -> SE (Sig, Sig)) where
    type MidiInstrOut ((Sig, D) -> SE (Sig, Sig)) = (Sig, Sig)

    onMsg :: ((Sig, D) -> SE (Sig, Sig))
-> Msg -> SE (MidiInstrOut ((Sig, D) -> SE (Sig, Sig)))
onMsg (Sig, D) -> SE (Sig, Sig)
f = (Sig, D) -> SE (Sig, Sig)
f ((Sig, D) -> SE (Sig, Sig))
-> (Msg -> (Sig, D)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, D)
sigd

instance MidiInstr ((Sig, D) -> SE (Sig, Sig, Sig)) where
    type MidiInstrOut ((Sig, D) -> SE (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: ((Sig, D) -> SE (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((Sig, D) -> SE (Sig, Sig, Sig)))
onMsg (Sig, D) -> SE (Sig, Sig, Sig)
f = (Sig, D) -> SE (Sig, Sig, Sig)
f ((Sig, D) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, D)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, D)
sigd

instance MidiInstr ((Sig, D) -> SE (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut ((Sig, D) -> SE (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: ((Sig, D) -> SE (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((Sig, D) -> SE (Sig, Sig, Sig, Sig)))
onMsg (Sig, D) -> SE (Sig, Sig, Sig, Sig)
f = (Sig, D) -> SE (Sig, Sig, Sig, Sig)
f ((Sig, D) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, D)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (Sig, D)
sigd

-- d2

d2 :: Msg -> (D, D)
d2 :: Msg -> (D, D)
d2 = Msg -> (D, D)
ampCps

instance MidiInstr ((D, D) -> Sig) where
    type MidiInstrOut ((D, D) -> Sig) = Sig

    onMsg :: ((D, D) -> Sig) -> Msg -> SE (MidiInstrOut ((D, D) -> Sig))
onMsg (D, D) -> Sig
f = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> (Msg -> Sig) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, D) -> Sig
f ((D, D) -> Sig) -> (Msg -> (D, D)) -> Msg -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, D)
d2 

instance MidiInstr ((D, D) -> (Sig, Sig)) where
    type MidiInstrOut ((D, D) -> (Sig, Sig)) = (Sig, Sig)

    onMsg :: ((D, D) -> (Sig, Sig))
-> Msg -> SE (MidiInstrOut ((D, D) -> (Sig, Sig)))
onMsg (D, D) -> (Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, D) -> (Sig, Sig)
f ((D, D) -> (Sig, Sig)) -> (Msg -> (D, D)) -> Msg -> (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, D)
d2

instance MidiInstr ((D, D) -> (Sig, Sig, Sig)) where
    type MidiInstrOut ((D, D) -> (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: ((D, D) -> (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((D, D) -> (Sig, Sig, Sig)))
onMsg (D, D) -> (Sig, Sig, Sig)
f = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, D) -> (Sig, Sig, Sig)
f ((D, D) -> (Sig, Sig, Sig))
-> (Msg -> (D, D)) -> Msg -> (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, D)
d2

instance MidiInstr ((D, D) -> (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut ((D, D) -> (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: ((D, D) -> (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((D, D) -> (Sig, Sig, Sig, Sig)))
onMsg (D, D) -> (Sig, Sig, Sig, Sig)
f = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, D) -> (Sig, Sig, Sig, Sig)
f ((D, D) -> (Sig, Sig, Sig, Sig))
-> (Msg -> (D, D)) -> Msg -> (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, D)
d2

-- se sig

instance MidiInstr ((D, D) -> SE Sig) where
    type MidiInstrOut ((D, D) -> SE Sig) = Sig

    onMsg :: ((D, D) -> SE Sig) -> Msg -> SE (MidiInstrOut ((D, D) -> SE Sig))
onMsg (D, D) -> SE Sig
f = (D, D) -> SE Sig
f ((D, D) -> SE Sig) -> (Msg -> (D, D)) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, D)
d2

instance MidiInstr ((D, D) -> SE (Sig, Sig)) where
    type MidiInstrOut ((D, D) -> SE (Sig, Sig)) = (Sig, Sig)

    onMsg :: ((D, D) -> SE (Sig, Sig))
-> Msg -> SE (MidiInstrOut ((D, D) -> SE (Sig, Sig)))
onMsg (D, D) -> SE (Sig, Sig)
f = (D, D) -> SE (Sig, Sig)
f ((D, D) -> SE (Sig, Sig))
-> (Msg -> (D, D)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, D)
d2

instance MidiInstr ((D, D) -> SE (Sig, Sig, Sig)) where
    type MidiInstrOut ((D, D) -> SE (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: ((D, D) -> SE (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((D, D) -> SE (Sig, Sig, Sig)))
onMsg (D, D) -> SE (Sig, Sig, Sig)
f = (D, D) -> SE (Sig, Sig, Sig)
f ((D, D) -> SE (Sig, Sig, Sig))
-> (Msg -> (D, D)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, D)
d2

instance MidiInstr ((D, D) -> SE (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut ((D, D) -> SE (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: ((D, D) -> SE (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut ((D, D) -> SE (Sig, Sig, Sig, Sig)))
onMsg (D, D) -> SE (Sig, Sig, Sig, Sig)
f = (D, D) -> SE (Sig, Sig, Sig, Sig)
f ((D, D) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (D, D)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msg -> (D, D)
d2

-- sig

instance MidiInstr (Sig -> Sig) where
    type MidiInstrOut (Sig -> Sig) = Sig

    onMsg :: (Sig -> Sig) -> Msg -> SE (MidiInstrOut (Sig -> Sig))
onMsg Sig -> Sig
f Msg
msg = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
f (D -> Sig
sig (Msg -> D
cpsmidi Msg
msg))
    
instance MidiInstr (Sig -> (Sig, Sig)) where
    type MidiInstrOut (Sig -> (Sig, Sig)) = (Sig, Sig)

    onMsg :: (Sig -> (Sig, Sig)) -> Msg -> SE (MidiInstrOut (Sig -> (Sig, Sig)))
onMsg Sig -> (Sig, Sig)
f Msg
msg = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig)) -> (Sig, Sig) -> SE (Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2)
        where (Sig
a1, Sig
a2) = Sig -> (Sig, Sig)
f (D -> Sig
sig (Msg -> D
cpsmidi Msg
msg))

instance MidiInstr (Sig -> (Sig, Sig, Sig)) where
    type MidiInstrOut (Sig -> (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: (Sig -> (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut (Sig -> (Sig, Sig, Sig)))
onMsg Sig -> (Sig, Sig, Sig)
f Msg
msg = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3)
        where (Sig
a1, Sig
a2, Sig
a3) = Sig -> (Sig, Sig, Sig)
f (D -> Sig
sig (Msg -> D
cpsmidi Msg
msg))

instance MidiInstr (Sig -> (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut (Sig -> (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: (Sig -> (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut (Sig -> (Sig, Sig, Sig, Sig)))
onMsg Sig -> (Sig, Sig, Sig, Sig)
f Msg
msg = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a4)
        where (Sig
a1, Sig
a2, Sig
a3, Sig
a4) = Sig -> (Sig, Sig, Sig, Sig)
f (D -> Sig
sig (Msg -> D
cpsmidi Msg
msg))

    
instance MidiInstr (Sig -> SE Sig) where
    type MidiInstrOut (Sig -> SE Sig) = Sig

    onMsg :: (Sig -> SE Sig) -> Msg -> SE (MidiInstrOut (Sig -> SE Sig))
onMsg Sig -> SE Sig
f Msg
msg = do
        Sig
a1 <- Sig -> SE Sig
f (D -> Sig
sig (Msg -> D
cpsmidi Msg
msg))
        Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1
    
instance MidiInstr (Sig -> SE (Sig, Sig)) where
    type MidiInstrOut (Sig -> SE (Sig, Sig)) = (Sig, Sig)

    onMsg :: (Sig -> SE (Sig, Sig))
-> Msg -> SE (MidiInstrOut (Sig -> SE (Sig, Sig)))
onMsg Sig -> SE (Sig, Sig)
f Msg
msg = do
        (Sig
a1, Sig
a2) <- Sig -> SE (Sig, Sig)
f (D -> Sig
sig (Msg -> D
cpsmidi Msg
msg))
        (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig)) -> (Sig, Sig) -> SE (Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2)

instance MidiInstr (Sig -> SE (Sig, Sig, Sig)) where
    type MidiInstrOut (Sig -> SE (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: (Sig -> SE (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut (Sig -> SE (Sig, Sig, Sig)))
onMsg Sig -> SE (Sig, Sig, Sig)
f Msg
msg = do
        (Sig
a1, Sig
a2, Sig
a3) <- Sig -> SE (Sig, Sig, Sig)
f (D -> Sig
sig (Msg -> D
cpsmidi Msg
msg))
        (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3)

instance MidiInstr (Sig -> SE (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut (Sig -> SE (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: (Sig -> SE (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut (Sig -> SE (Sig, Sig, Sig, Sig)))
onMsg Sig -> SE (Sig, Sig, Sig, Sig)
f Msg
msg = do
        (Sig
a1, Sig
a2, Sig
a3, Sig
a4) <- Sig -> SE (Sig, Sig, Sig, Sig)
f (D -> Sig
sig (Msg -> D
cpsmidi Msg
msg))
        (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a4)

-- d

instance MidiInstr (D -> Sig) where
    type MidiInstrOut (D -> Sig) = Sig

    onMsg :: (D -> Sig) -> Msg -> SE (MidiInstrOut (D -> Sig))
onMsg D -> Sig
f Msg
msg = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* D -> Sig
f (Msg -> D
cpsmidi Msg
msg)
    
instance MidiInstr (D -> (Sig, Sig)) where
    type MidiInstrOut (D -> (Sig, Sig)) = (Sig, Sig)

    onMsg :: (D -> (Sig, Sig)) -> Msg -> SE (MidiInstrOut (D -> (Sig, Sig)))
onMsg D -> (Sig, Sig)
f Msg
msg = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig)) -> (Sig, Sig) -> SE (Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2)
        where (Sig
a1, Sig
a2) = D -> (Sig, Sig)
f (Msg -> D
cpsmidi Msg
msg)

instance MidiInstr (D -> (Sig, Sig, Sig)) where
    type MidiInstrOut (D -> (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: (D -> (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut (D -> (Sig, Sig, Sig)))
onMsg D -> (Sig, Sig, Sig)
f Msg
msg = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3)
        where (Sig
a1, Sig
a2, Sig
a3) = D -> (Sig, Sig, Sig)
f (Msg -> D
cpsmidi Msg
msg)

instance MidiInstr (D -> (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut (D -> (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: (D -> (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut (D -> (Sig, Sig, Sig, Sig)))
onMsg D -> (Sig, Sig, Sig, Sig)
f Msg
msg = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a4)
        where (Sig
a1, Sig
a2, Sig
a3, Sig
a4) = D -> (Sig, Sig, Sig, Sig)
f (Msg -> D
cpsmidi Msg
msg)

instance MidiInstr (D -> SE Sig) where
    type MidiInstrOut (D -> SE Sig) = Sig

    onMsg :: (D -> SE Sig) -> Msg -> SE (MidiInstrOut (D -> SE Sig))
onMsg D -> SE Sig
f Msg
msg = do
        Sig
a1 <- D -> SE Sig
f ((Msg -> D
cpsmidi Msg
msg))
        Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1
    
instance MidiInstr (D -> SE (Sig, Sig)) where
    type MidiInstrOut (D -> SE (Sig, Sig)) = (Sig, Sig)

    onMsg :: (D -> SE (Sig, Sig))
-> Msg -> SE (MidiInstrOut (D -> SE (Sig, Sig)))
onMsg D -> SE (Sig, Sig)
f Msg
msg = do
        (Sig
a1, Sig
a2) <- D -> SE (Sig, Sig)
f ((Msg -> D
cpsmidi Msg
msg))
        (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig)) -> (Sig, Sig) -> SE (Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2)

instance MidiInstr (D -> SE (Sig, Sig, Sig)) where
    type MidiInstrOut (D -> SE (Sig, Sig, Sig)) = (Sig, Sig, Sig)

    onMsg :: (D -> SE (Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut (D -> SE (Sig, Sig, Sig)))
onMsg D -> SE (Sig, Sig, Sig)
f Msg
msg = do
        (Sig
a1, Sig
a2, Sig
a3) <- D -> SE (Sig, Sig, Sig)
f ((Msg -> D
cpsmidi Msg
msg))
        (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3)

instance MidiInstr (D -> SE (Sig, Sig, Sig, Sig)) where
    type MidiInstrOut (D -> SE (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)

    onMsg :: (D -> SE (Sig, Sig, Sig, Sig))
-> Msg -> SE (MidiInstrOut (D -> SE (Sig, Sig, Sig, Sig)))
onMsg D -> SE (Sig, Sig, Sig, Sig)
f Msg
msg = do
        (Sig
a1, Sig
a2, Sig
a3, Sig
a4) <- D -> SE (Sig, Sig, Sig, Sig)
f ((Msg -> D
cpsmidi Msg
msg))
        (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a4)

-------------------------------------------------------------------------------
-- Custom temperament

-- | Converts a value to the midi-instrument with custom temperament. 
-- It's used with the functions 'Csound.Base.midi', 'Csound.Base.midin'.
class MidiInstr a => MidiInstrTemp a where
    onMsg' :: Temp -> a -> Msg -> SE (MidiInstrOut a)

-- by (Sig, Sig)

sig2' :: Temp -> Msg -> (Sig, Sig)
sig2' :: Temp -> Msg -> (Sig, Sig)
sig2' Temp
tm Msg
msg = (D -> Sig
sig D
amp, D -> Sig
sig D
cps)
    where (D
amp, D
cps) = Temp -> Msg -> (D, D)
ampCps' Temp
tm Msg
msg

instance MidiInstrTemp ((Sig, Sig) -> Sig) where
    onMsg' :: Temp
-> ((Sig, Sig) -> Sig)
-> Msg
-> SE (MidiInstrOut ((Sig, Sig) -> Sig))
onMsg' Temp
tm (Sig, Sig) -> Sig
f = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> (Msg -> Sig) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, Sig) -> Sig
f ((Sig, Sig) -> Sig) -> (Msg -> (Sig, Sig)) -> Msg -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, Sig)
sig2' Temp
tm

instance MidiInstrTemp ((Sig, Sig) -> (Sig, Sig)) where
    onMsg' :: Temp
-> ((Sig, Sig) -> (Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((Sig, Sig) -> (Sig, Sig)))
onMsg' Temp
tm (Sig, Sig) -> (Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, Sig) -> (Sig, Sig)
f ((Sig, Sig) -> (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, Sig)
sig2' Temp
tm

instance MidiInstrTemp ((Sig, Sig) -> (Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((Sig, Sig) -> (Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((Sig, Sig) -> (Sig, Sig, Sig)))
onMsg' Temp
tm (Sig, Sig) -> (Sig, Sig, Sig)
f = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, Sig) -> (Sig, Sig, Sig)
f ((Sig, Sig) -> (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, Sig)
sig2' Temp
tm

instance MidiInstrTemp ((Sig, Sig) -> (Sig, Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((Sig, Sig) -> (Sig, Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((Sig, Sig) -> (Sig, Sig, Sig, Sig)))
onMsg' Temp
tm (Sig, Sig) -> (Sig, Sig, Sig, Sig)
f = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, Sig) -> (Sig, Sig, Sig, Sig)
f ((Sig, Sig) -> (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, Sig)
sig2' Temp
tm

-- se sig

instance MidiInstrTemp ((Sig, Sig) -> SE Sig) where
    onMsg' :: Temp
-> ((Sig, Sig) -> SE Sig)
-> Msg
-> SE (MidiInstrOut ((Sig, Sig) -> SE Sig))
onMsg' Temp
tm (Sig, Sig) -> SE Sig
f = (Sig, Sig) -> SE Sig
f ((Sig, Sig) -> SE Sig) -> (Msg -> (Sig, Sig)) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, Sig)
sig2' Temp
tm

instance MidiInstrTemp ((Sig, Sig) -> SE (Sig, Sig)) where
    onMsg' :: Temp
-> ((Sig, Sig) -> SE (Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((Sig, Sig) -> SE (Sig, Sig)))
onMsg' Temp
tm (Sig, Sig) -> SE (Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig)
f ((Sig, Sig) -> SE (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, Sig)
sig2' Temp
tm

instance MidiInstrTemp ((Sig, Sig) -> SE (Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((Sig, Sig) -> SE (Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((Sig, Sig) -> SE (Sig, Sig, Sig)))
onMsg' Temp
tm (Sig, Sig) -> SE (Sig, Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig, Sig)
f ((Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, Sig)
sig2' Temp
tm

instance MidiInstrTemp ((Sig, Sig) -> SE (Sig, Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((Sig, Sig) -> SE (Sig, Sig, Sig, Sig)))
onMsg' Temp
tm (Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
f ((Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, Sig)
sig2' Temp
tm

-- by Sig / D

dsig' :: Temp -> Msg -> (D, Sig)
dsig' :: Temp -> Msg -> (D, Sig)
dsig' Temp
tm Msg
msg = (D
amp, D -> Sig
sig D
cps)
    where (D
amp, D
cps) = Temp -> Msg -> (D, D)
ampCps' Temp
tm Msg
msg

instance MidiInstrTemp ((D, Sig) -> Sig) where
    onMsg' :: Temp
-> ((D, Sig) -> Sig) -> Msg -> SE (MidiInstrOut ((D, Sig) -> Sig))
onMsg' Temp
tm (D, Sig) -> Sig
f = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> (Msg -> Sig) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, Sig) -> Sig
f ((D, Sig) -> Sig) -> (Msg -> (D, Sig)) -> Msg -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, Sig)
dsig' Temp
tm

instance MidiInstrTemp ((D, Sig) -> (Sig, Sig)) where
    onMsg' :: Temp
-> ((D, Sig) -> (Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((D, Sig) -> (Sig, Sig)))
onMsg' Temp
tm (D, Sig) -> (Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, Sig) -> (Sig, Sig)
f ((D, Sig) -> (Sig, Sig)) -> (Msg -> (D, Sig)) -> Msg -> (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, Sig)
dsig' Temp
tm

instance MidiInstrTemp ((D, Sig) -> (Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((D, Sig) -> (Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((D, Sig) -> (Sig, Sig, Sig)))
onMsg' Temp
tm (D, Sig) -> (Sig, Sig, Sig)
f = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, Sig) -> (Sig, Sig, Sig)
f ((D, Sig) -> (Sig, Sig, Sig))
-> (Msg -> (D, Sig)) -> Msg -> (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, Sig)
dsig' Temp
tm

instance MidiInstrTemp ((D, Sig) -> (Sig, Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((D, Sig) -> (Sig, Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((D, Sig) -> (Sig, Sig, Sig, Sig)))
onMsg' Temp
tm (D, Sig) -> (Sig, Sig, Sig, Sig)
f = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, Sig) -> (Sig, Sig, Sig, Sig)
f ((D, Sig) -> (Sig, Sig, Sig, Sig))
-> (Msg -> (D, Sig)) -> Msg -> (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, Sig)
dsig' Temp
tm

-- se sig

instance MidiInstrTemp ((D, Sig) -> SE Sig) where
    onMsg' :: Temp
-> ((D, Sig) -> SE Sig)
-> Msg
-> SE (MidiInstrOut ((D, Sig) -> SE Sig))
onMsg' Temp
tm (D, Sig) -> SE Sig
f = (D, Sig) -> SE Sig
f ((D, Sig) -> SE Sig) -> (Msg -> (D, Sig)) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, Sig)
dsig' Temp
tm

instance MidiInstrTemp ((D, Sig) -> SE (Sig, Sig)) where
    onMsg' :: Temp
-> ((D, Sig) -> SE (Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((D, Sig) -> SE (Sig, Sig)))
onMsg' Temp
tm (D, Sig) -> SE (Sig, Sig)
f = (D, Sig) -> SE (Sig, Sig)
f ((D, Sig) -> SE (Sig, Sig))
-> (Msg -> (D, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, Sig)
dsig' Temp
tm

instance MidiInstrTemp ((D, Sig) -> SE (Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((D, Sig) -> SE (Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((D, Sig) -> SE (Sig, Sig, Sig)))
onMsg' Temp
tm (D, Sig) -> SE (Sig, Sig, Sig)
f = (D, Sig) -> SE (Sig, Sig, Sig)
f ((D, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (D, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, Sig)
dsig' Temp
tm

instance MidiInstrTemp ((D, Sig) -> SE (Sig, Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((D, Sig) -> SE (Sig, Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((D, Sig) -> SE (Sig, Sig, Sig, Sig)))
onMsg' Temp
tm (D, Sig) -> SE (Sig, Sig, Sig, Sig)
f = (D, Sig) -> SE (Sig, Sig, Sig, Sig)
f ((D, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (D, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, Sig)
dsig' Temp
tm

-- by Sig / D

sigd' :: Temp -> Msg -> (Sig, D)
sigd' :: Temp -> Msg -> (Sig, D)
sigd' Temp
tm Msg
msg = (D -> Sig
sig D
amp, D
cps)
    where (D
amp, D
cps) = Temp -> Msg -> (D, D)
ampCps' Temp
tm Msg
msg

instance MidiInstrTemp ((Sig, D) -> Sig) where
    onMsg' :: Temp
-> ((Sig, D) -> Sig) -> Msg -> SE (MidiInstrOut ((Sig, D) -> Sig))
onMsg' Temp
tm (Sig, D) -> Sig
f = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> (Msg -> Sig) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, D) -> Sig
f ((Sig, D) -> Sig) -> (Msg -> (Sig, D)) -> Msg -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, D)
sigd' Temp
tm

instance MidiInstrTemp ((Sig, D) -> (Sig, Sig)) where
    onMsg' :: Temp
-> ((Sig, D) -> (Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((Sig, D) -> (Sig, Sig)))
onMsg' Temp
tm (Sig, D) -> (Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, D) -> (Sig, Sig)
f ((Sig, D) -> (Sig, Sig)) -> (Msg -> (Sig, D)) -> Msg -> (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, D)
sigd' Temp
tm

instance MidiInstrTemp ((Sig, D) -> (Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((Sig, D) -> (Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((Sig, D) -> (Sig, Sig, Sig)))
onMsg' Temp
tm (Sig, D) -> (Sig, Sig, Sig)
f = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, D) -> (Sig, Sig, Sig)
f ((Sig, D) -> (Sig, Sig, Sig))
-> (Msg -> (Sig, D)) -> Msg -> (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, D)
sigd' Temp
tm

instance MidiInstrTemp ((Sig, D) -> (Sig, Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((Sig, D) -> (Sig, Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((Sig, D) -> (Sig, Sig, Sig, Sig)))
onMsg' Temp
tm (Sig, D) -> (Sig, Sig, Sig, Sig)
f = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig, D) -> (Sig, Sig, Sig, Sig)
f ((Sig, D) -> (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, D)) -> Msg -> (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, D)
sigd' Temp
tm

-- se sig

instance MidiInstrTemp ((Sig, D) -> SE Sig) where
    onMsg' :: Temp
-> ((Sig, D) -> SE Sig)
-> Msg
-> SE (MidiInstrOut ((Sig, D) -> SE Sig))
onMsg' Temp
tm (Sig, D) -> SE Sig
f = (Sig, D) -> SE Sig
f ((Sig, D) -> SE Sig) -> (Msg -> (Sig, D)) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, D)
sigd' Temp
tm

instance MidiInstrTemp ((Sig, D) -> SE (Sig, Sig)) where
    onMsg' :: Temp
-> ((Sig, D) -> SE (Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((Sig, D) -> SE (Sig, Sig)))
onMsg' Temp
tm (Sig, D) -> SE (Sig, Sig)
f = (Sig, D) -> SE (Sig, Sig)
f ((Sig, D) -> SE (Sig, Sig))
-> (Msg -> (Sig, D)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, D)
sigd' Temp
tm

instance MidiInstrTemp ((Sig, D) -> SE (Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((Sig, D) -> SE (Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((Sig, D) -> SE (Sig, Sig, Sig)))
onMsg' Temp
tm (Sig, D) -> SE (Sig, Sig, Sig)
f = (Sig, D) -> SE (Sig, Sig, Sig)
f ((Sig, D) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, D)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, D)
sigd' Temp
tm

instance MidiInstrTemp ((Sig, D) -> SE (Sig, Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((Sig, D) -> SE (Sig, Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((Sig, D) -> SE (Sig, Sig, Sig, Sig)))
onMsg' Temp
tm (Sig, D) -> SE (Sig, Sig, Sig, Sig)
f = (Sig, D) -> SE (Sig, Sig, Sig, Sig)
f ((Sig, D) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, D)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (Sig, D)
sigd' Temp
tm

-- d2

d2' :: Temp -> Msg -> (D, D)
d2' :: Temp -> Msg -> (D, D)
d2' Temp
tm = Temp -> Msg -> (D, D)
ampCps' Temp
tm

instance MidiInstrTemp ((D, D) -> Sig) where
    onMsg' :: Temp -> ((D, D) -> Sig) -> Msg -> SE (MidiInstrOut ((D, D) -> Sig))
onMsg' Temp
tm (D, D) -> Sig
f = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> (Msg -> Sig) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, D) -> Sig
f ((D, D) -> Sig) -> (Msg -> (D, D)) -> Msg -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, D)
d2' Temp
tm

instance MidiInstrTemp ((D, D) -> (Sig, Sig)) where
    onMsg' :: Temp
-> ((D, D) -> (Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((D, D) -> (Sig, Sig)))
onMsg' Temp
tm (D, D) -> (Sig, Sig)
f = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig))
-> (Msg -> (Sig, Sig)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, D) -> (Sig, Sig)
f ((D, D) -> (Sig, Sig)) -> (Msg -> (D, D)) -> Msg -> (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, D)
d2' Temp
tm

instance MidiInstrTemp ((D, D) -> (Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((D, D) -> (Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((D, D) -> (Sig, Sig, Sig)))
onMsg' Temp
tm (D, D) -> (Sig, Sig, Sig)
f = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, D) -> (Sig, Sig, Sig)
f ((D, D) -> (Sig, Sig, Sig))
-> (Msg -> (D, D)) -> Msg -> (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, D)
d2' Temp
tm

instance MidiInstrTemp ((D, D) -> (Sig, Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((D, D) -> (Sig, Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((D, D) -> (Sig, Sig, Sig, Sig)))
onMsg' Temp
tm (D, D) -> (Sig, Sig, Sig, Sig)
f = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (Sig, Sig, Sig, Sig)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D, D) -> (Sig, Sig, Sig, Sig)
f ((D, D) -> (Sig, Sig, Sig, Sig))
-> (Msg -> (D, D)) -> Msg -> (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, D)
d2' Temp
tm

-- se sig

instance MidiInstrTemp ((D, D) -> SE Sig) where
    onMsg' :: Temp
-> ((D, D) -> SE Sig)
-> Msg
-> SE (MidiInstrOut ((D, D) -> SE Sig))
onMsg' Temp
tm (D, D) -> SE Sig
f = (D, D) -> SE Sig
f ((D, D) -> SE Sig) -> (Msg -> (D, D)) -> Msg -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, D)
d2' Temp
tm

instance MidiInstrTemp ((D, D) -> SE (Sig, Sig)) where
    onMsg' :: Temp
-> ((D, D) -> SE (Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((D, D) -> SE (Sig, Sig)))
onMsg' Temp
tm (D, D) -> SE (Sig, Sig)
f = (D, D) -> SE (Sig, Sig)
f ((D, D) -> SE (Sig, Sig))
-> (Msg -> (D, D)) -> Msg -> SE (Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, D)
d2' Temp
tm

instance MidiInstrTemp ((D, D) -> SE (Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((D, D) -> SE (Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((D, D) -> SE (Sig, Sig, Sig)))
onMsg' Temp
tm (D, D) -> SE (Sig, Sig, Sig)
f = (D, D) -> SE (Sig, Sig, Sig)
f ((D, D) -> SE (Sig, Sig, Sig))
-> (Msg -> (D, D)) -> Msg -> SE (Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, D)
d2' Temp
tm

instance MidiInstrTemp ((D, D) -> SE (Sig, Sig, Sig, Sig)) where
    onMsg' :: Temp
-> ((D, D) -> SE (Sig, Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut ((D, D) -> SE (Sig, Sig, Sig, Sig)))
onMsg' Temp
tm (D, D) -> SE (Sig, Sig, Sig, Sig)
f = (D, D) -> SE (Sig, Sig, Sig, Sig)
f ((D, D) -> SE (Sig, Sig, Sig, Sig))
-> (Msg -> (D, D)) -> Msg -> SE (Sig, Sig, Sig, Sig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Temp -> Msg -> (D, D)
d2' Temp
tm

-- sig

instance MidiInstrTemp (Sig -> Sig) where
    onMsg' :: Temp -> (Sig -> Sig) -> Msg -> SE (MidiInstrOut (Sig -> Sig))
onMsg' Temp
tm Sig -> Sig
f Msg
msg = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
f (D -> Sig
sig (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg))
    
instance MidiInstrTemp (Sig -> (Sig, Sig)) where
    onMsg' :: Temp
-> (Sig -> (Sig, Sig))
-> Msg
-> SE (MidiInstrOut (Sig -> (Sig, Sig)))
onMsg' Temp
tm Sig -> (Sig, Sig)
f Msg
msg = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig)) -> (Sig, Sig) -> SE (Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2)
        where (Sig
a1, Sig
a2) = Sig -> (Sig, Sig)
f (D -> Sig
sig (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg))

instance MidiInstrTemp (Sig -> (Sig, Sig, Sig)) where
    onMsg' :: Temp
-> (Sig -> (Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut (Sig -> (Sig, Sig, Sig)))
onMsg' Temp
tm Sig -> (Sig, Sig, Sig)
f Msg
msg = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3)
        where (Sig
a1, Sig
a2, Sig
a3) = Sig -> (Sig, Sig, Sig)
f (D -> Sig
sig (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg))

instance MidiInstrTemp (Sig -> (Sig, Sig, Sig, Sig)) where
    onMsg' :: Temp
-> (Sig -> (Sig, Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut (Sig -> (Sig, Sig, Sig, Sig)))
onMsg' Temp
tm Sig -> (Sig, Sig, Sig, Sig)
f Msg
msg = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a4)
        where (Sig
a1, Sig
a2, Sig
a3, Sig
a4) = Sig -> (Sig, Sig, Sig, Sig)
f (D -> Sig
sig (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg))

    
instance MidiInstrTemp (Sig -> SE Sig) where
    onMsg' :: Temp -> (Sig -> SE Sig) -> Msg -> SE (MidiInstrOut (Sig -> SE Sig))
onMsg' Temp
tm Sig -> SE Sig
f Msg
msg = do
        Sig
a1 <- Sig -> SE Sig
f (D -> Sig
sig (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg))
        Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1
    
instance MidiInstrTemp (Sig -> SE (Sig, Sig)) where
    onMsg' :: Temp
-> (Sig -> SE (Sig, Sig))
-> Msg
-> SE (MidiInstrOut (Sig -> SE (Sig, Sig)))
onMsg' Temp
tm Sig -> SE (Sig, Sig)
f Msg
msg = do
        (Sig
a1, Sig
a2) <- Sig -> SE (Sig, Sig)
f (D -> Sig
sig (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg))
        (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig)) -> (Sig, Sig) -> SE (Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2)

instance MidiInstrTemp (Sig -> SE (Sig, Sig, Sig)) where
    onMsg' :: Temp
-> (Sig -> SE (Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut (Sig -> SE (Sig, Sig, Sig)))
onMsg' Temp
tm Sig -> SE (Sig, Sig, Sig)
f Msg
msg = do
        (Sig
a1, Sig
a2, Sig
a3) <- Sig -> SE (Sig, Sig, Sig)
f (D -> Sig
sig (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg))
        (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3)

instance MidiInstrTemp (Sig -> SE (Sig, Sig, Sig, Sig)) where
    onMsg' :: Temp
-> (Sig -> SE (Sig, Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut (Sig -> SE (Sig, Sig, Sig, Sig)))
onMsg' Temp
tm Sig -> SE (Sig, Sig, Sig, Sig)
f Msg
msg = do
        (Sig
a1, Sig
a2, Sig
a3, Sig
a4) <- Sig -> SE (Sig, Sig, Sig, Sig)
f (D -> Sig
sig (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg))
        (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a4)

-- d

instance MidiInstrTemp (D -> Sig) where
    onMsg' :: Temp -> (D -> Sig) -> Msg -> SE (MidiInstrOut (D -> Sig))
onMsg' Temp
tm D -> Sig
f Msg
msg = Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* D -> Sig
f (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg)
    
instance MidiInstrTemp (D -> (Sig, Sig)) where
    onMsg' :: Temp
-> (D -> (Sig, Sig)) -> Msg -> SE (MidiInstrOut (D -> (Sig, Sig)))
onMsg' Temp
tm D -> (Sig, Sig)
f Msg
msg = (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig)) -> (Sig, Sig) -> SE (Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2)
        where (Sig
a1, Sig
a2) = D -> (Sig, Sig)
f (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg)

instance MidiInstrTemp (D -> (Sig, Sig, Sig)) where
    onMsg' :: Temp
-> (D -> (Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut (D -> (Sig, Sig, Sig)))
onMsg' Temp
tm D -> (Sig, Sig, Sig)
f Msg
msg = (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3)
        where (Sig
a1, Sig
a2, Sig
a3) = D -> (Sig, Sig, Sig)
f (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg)

instance MidiInstrTemp (D -> (Sig, Sig, Sig, Sig)) where
    onMsg' :: Temp
-> (D -> (Sig, Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut (D -> (Sig, Sig, Sig, Sig)))
onMsg' Temp
tm D -> (Sig, Sig, Sig, Sig)
f Msg
msg = (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a4)
        where (Sig
a1, Sig
a2, Sig
a3, Sig
a4) = D -> (Sig, Sig, Sig, Sig)
f (Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg)

instance MidiInstrTemp (D -> SE Sig) where
    onMsg' :: Temp -> (D -> SE Sig) -> Msg -> SE (MidiInstrOut (D -> SE Sig))
onMsg' Temp
tm D -> SE Sig
f Msg
msg = do
        Sig
a1 <- D -> SE Sig
f ((Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg))
        Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1
    
instance MidiInstrTemp (D -> SE (Sig, Sig)) where
    onMsg' :: Temp
-> (D -> SE (Sig, Sig))
-> Msg
-> SE (MidiInstrOut (D -> SE (Sig, Sig)))
onMsg' Temp
tm D -> SE (Sig, Sig)
f Msg
msg = do
        (Sig
a1, Sig
a2) <- D -> SE (Sig, Sig)
f ((Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg))
        (Sig, Sig) -> SE (Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig) -> SE (Sig, Sig)) -> (Sig, Sig) -> SE (Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2)

instance MidiInstrTemp (D -> SE (Sig, Sig, Sig)) where
    onMsg' :: Temp
-> (D -> SE (Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut (D -> SE (Sig, Sig, Sig)))
onMsg' Temp
tm D -> SE (Sig, Sig, Sig)
f Msg
msg = do
        (Sig
a1, Sig
a2, Sig
a3) <- D -> SE (Sig, Sig, Sig)
f ((Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg))
        (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig) -> SE (Sig, Sig, Sig))
-> (Sig, Sig, Sig) -> SE (Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3)

instance MidiInstrTemp (D -> SE (Sig, Sig, Sig, Sig)) where
    onMsg' :: Temp
-> (D -> SE (Sig, Sig, Sig, Sig))
-> Msg
-> SE (MidiInstrOut (D -> SE (Sig, Sig, Sig, Sig)))
onMsg' Temp
tm D -> SE (Sig, Sig, Sig, Sig)
f Msg
msg = do
        (Sig
a1, Sig
a2, Sig
a3, Sig
a4) <- D -> SE (Sig, Sig, Sig, Sig)
f ((Temp -> Msg -> D
cpsmidi' Temp
tm Msg
msg))
        (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig))
-> (Sig, Sig, Sig, Sig) -> SE (Sig, Sig, Sig, Sig)
forall a b. (a -> b) -> a -> b
$ (D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a1, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a2, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a3, D -> Sig
sig (Msg -> D -> D
ampmidi Msg
msg D
1) Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
a4)