module Synthesizer.LLVM.Server.Scalar.Instrument (
   ping,
   pingDur,
   pingDurTake,
   pingRelease,
   pingStereoRelease,
   tine,
   tineStereo,
   softString,

   -- * for testing
   dummy,
   ) where

import Synthesizer.LLVM.Server.Common
import qualified Synthesizer.LLVM.Frame.Stereo as Stereo
import qualified Synthesizer.LLVM.Causal.Render as CausalRender
import qualified Synthesizer.LLVM.Causal.Process as Causal
import qualified Synthesizer.LLVM.Generator.Render as Render
import qualified Synthesizer.LLVM.Generator.Signal as Sig
import qualified Synthesizer.LLVM.Storable.Signal as SigStL
import qualified Synthesizer.LLVM.Wave as WaveL
import Synthesizer.Causal.Class (($<), ($>), ($*))

import qualified LLVM.DSL.Expression as Expr
import qualified LLVM.Extra.Multi.Value as MultiValue
import LLVM.DSL.Expression (Exp)

import qualified Synthesizer.MIDI.EventList as Ev
import Synthesizer.MIDI.Storable (chunkSizesFromLazyTime)

import qualified Synthesizer.Storable.Signal      as SigSt
import qualified Data.StorableVector.Lazy.Pattern as SigStV

import Control.Applicative (liftA, liftA2)
import Data.Semigroup ((<>))

import NumericPrelude.Numeric (zero, round, (+))
import Prelude hiding (Real, round, break, (+))


pingSig ::
   SampleRate (Exp Real) -> Exp Real -> Exp Real -> Sig.T (MultiValue.T Real)
pingSig :: SampleRate (Exp Real) -> Exp Real -> Exp Real -> T (T Real)
pingSig =
   (Arg Number (Exp Real)
 -> Arg Frequency (Exp Real) -> SampleRate (Exp Real) -> T (T Real))
-> SampleRate (Exp Real)
-> Unwrapped
     (Arg Number (Exp Real)
      -> Arg Frequency (Exp Real) -> SampleRate (Exp Real) -> T (T Real))
forall a f. Wrapped a f => f -> SampleRate a -> Unwrapped f
wrapped ((Arg Number (Exp Real)
  -> Arg Frequency (Exp Real) -> SampleRate (Exp Real) -> T (T Real))
 -> SampleRate (Exp Real)
 -> Unwrapped
      (Arg Number (Exp Real)
       -> Arg Frequency (Exp Real)
       -> SampleRate (Exp Real)
       -> T (T Real)))
-> (Arg Number (Exp Real)
    -> Arg Frequency (Exp Real) -> SampleRate (Exp Real) -> T (T Real))
-> SampleRate (Exp Real)
-> Unwrapped
     (Arg Number (Exp Real)
      -> Arg Frequency (Exp Real) -> SampleRate (Exp Real) -> T (T Real))
forall a b. (a -> b) -> a -> b
$ \(Number Exp Real
vel) (Frequency Exp Real
freq) ->
   (SampleRate (Exp Real) -> Exp Real -> Exp Real)
-> Exp Real
-> (Exp Real -> SampleRate (Exp Real) -> T (T Real))
-> SampleRate (Exp Real)
-> T (T Real)
forall a b c d.
(SampleRate a -> b -> c)
-> b -> (c -> SampleRate a -> d) -> SampleRate a -> d
constant SampleRate (Exp Real) -> Exp Real -> Exp Real
forall a. C a => SampleRate a -> a -> a
time Exp Real
0.2 ((Exp Real -> SampleRate (Exp Real) -> T (T Real))
 -> SampleRate (Exp Real) -> T (T Real))
-> (Exp Real -> SampleRate (Exp Real) -> T (T Real))
-> SampleRate (Exp Real)
-> T (T Real)
forall a b. (a -> b) -> a -> b
$ \Exp Real
halfLife SampleRate (Exp Real)
_sr ->
      T (T Real, T Real) (T Real)
forall a. PseudoRing a => T (a, a) a
Causal.envelope
         T (T Real, T Real) (T Real)
-> SignalOf T (T Real) -> T (T Real) (T Real)
forall (process :: * -> * -> *) a b c.
C process =>
process (a, b) c -> SignalOf process a -> process b c
$< Exp Real -> Exp Real -> T (T Real)
forall a.
(C a, Real a, RationalConstant a, Transcendental a) =>
Exp a -> Exp a -> MV a
Sig.exponential2 Exp Real
halfLife (Exp Real -> Exp Real
forall a. C a => a -> a
amplitudeFromVelocity Exp Real
vel)
         T (T Real) (T Real) -> SignalOf T (T Real) -> SignalOf T (T Real)
forall (process :: * -> * -> *) a b.
C process =>
process a b -> SignalOf process a -> SignalOf process b
$* (forall r. T Real -> CodeGenFunction r (T Real))
-> Exp Real -> Exp Real -> T (T Real)
forall t y.
(Fraction t, C t) =>
(forall r. T t -> CodeGenFunction r y) -> Exp t -> Exp t -> T y
Sig.osci T Real -> CodeGenFunction r (T Real)
forall r. T Real -> CodeGenFunction r (T Real)
forall a r.
(PseudoRing a, IntegerConstant a) =>
a -> CodeGenFunction r a
WaveL.saw Exp Real
forall a. C a => a
zero Exp Real
freq

ping :: IO (SigSt.ChunkSize -> SampleRate Real -> Real -> Real -> SigSt.T Real)
ping :: IO (ChunkSize -> SampleRate Real -> Real -> Real -> T Real)
ping = DSL (SampleRate Real -> Real -> Real -> T Real)
-> IO
     (Shape (SampleRate Real -> Real -> Real -> T Real)
      -> SampleRate Real -> Real -> Real -> T Real)
forall f. Run f => DSL f -> IO (Shape f -> f)
Render.run DSL (SampleRate Real -> Real -> Real -> T Real)
SampleRate (Exp Real) -> Exp Real -> Exp Real -> T (T Real)
pingSig

pingDur :: IO (Instrument Real Real)
pingDur :: IO (Instrument Real Real)
pingDur =
   ((SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
 -> Instrument Real Real)
-> IO (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
-> IO (Instrument Real Real)
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\SampleRate Real -> Real -> Real -> T LazySize (Vector Real)
sound SampleRate Real
sr Real
vel Real
freq -> T LazySize (Vector Real) -> LazyTime -> T Real
forall b.
Storable b =>
T LazySize (Vector b) -> LazyTime -> Vector b
pioApplyToLazyTime (T LazySize (Vector Real) -> LazyTime -> T Real)
-> T LazySize (Vector Real) -> LazyTime -> T Real
forall a b. (a -> b) -> a -> b
$ SampleRate Real -> Real -> Real -> T LazySize (Vector Real)
sound SampleRate Real
sr Real
vel Real
freq) (IO (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
 -> IO (Instrument Real Real))
-> IO (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
-> IO (Instrument Real Real)
forall a b. (a -> b) -> a -> b
$
   DSL
  (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
  (Element
     (In (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))))
  (Element
     (Out
        (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))))
-> IO (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
forall f a al b bl.
(Run f, In f ~ a, Default a, Element a ~ al, Out f ~ b, Default b,
 Element b ~ bl) =>
DSL f al bl -> IO f
CausalRender.run (\SampleRate (Exp Real)
sr Exp Real
vel Exp Real
freq -> SignalOf T (T Real) -> T () (T Real)
forall b a. SignalOf T b -> T a b
forall (process :: * -> * -> *) b a.
C process =>
SignalOf process b -> process a b
Causal.fromSignal (SignalOf T (T Real) -> T () (T Real))
-> SignalOf T (T Real) -> T () (T Real)
forall a b. (a -> b) -> a -> b
$ SampleRate (Exp Real) -> Exp Real -> Exp Real -> T (T Real)
pingSig SampleRate (Exp Real)
sr Exp Real
vel Exp Real
freq)

pingDurTake :: IO (SigSt.ChunkSize -> Instrument Real Real)
pingDurTake :: IO (ChunkSize -> Instrument Real Real)
pingDurTake =
   ((ChunkSize -> SampleRate Real -> Real -> Real -> T Real)
 -> ChunkSize -> Instrument Real Real)
-> IO (ChunkSize -> SampleRate Real -> Real -> Real -> T Real)
-> IO (ChunkSize -> Instrument Real Real)
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\ChunkSize -> SampleRate Real -> Real -> Real -> T Real
sound ChunkSize
chunkSize SampleRate Real
sr Real
vel Real
freq LazyTime
dur ->
      LazySize -> T Real -> T Real
forall a. Storable a => LazySize -> Vector a -> Vector a
SigStV.take (LazyTime -> LazySize
chunkSizesFromLazyTime LazyTime
dur) (T Real -> T Real) -> T Real -> T Real
forall a b. (a -> b) -> a -> b
$
      ChunkSize -> SampleRate Real -> Real -> Real -> T Real
sound ChunkSize
chunkSize SampleRate Real
sr Real
vel Real
freq) IO (ChunkSize -> SampleRate Real -> Real -> Real -> T Real)
ping

dummy :: SigSt.ChunkSize -> Instrument Real Real
dummy :: ChunkSize -> Instrument Real Real
dummy ChunkSize
chunkSize =
   \ SampleRate Real
_sr Real
vel Real
freq LazyTime
dur ->
      LazySize -> T Real -> T Real
forall a. Storable a => LazySize -> Vector a -> Vector a
SigStV.take (LazyTime -> LazySize
chunkSizesFromLazyTime LazyTime
dur) (T Real -> T Real) -> T Real -> T Real
forall a b. (a -> b) -> a -> b
$
      ChunkSize -> Real -> T Real
forall a. Storable a => ChunkSize -> a -> Vector a
SigSt.repeat ChunkSize
chunkSize (Real
vel Real -> Real -> Real
forall a. C a => a -> a -> a
+ Real
1e-3Real -> Real -> Real
forall a. Num a => a -> a -> a
*Real
freq)



pingReleaseEnvelope ::
   IO (Real -> Real -> SigSt.ChunkSize ->
       SampleRate Real -> Real -> Ev.LazyTime -> SigSt.T Real)
pingReleaseEnvelope :: IO
  (Real
   -> Real
   -> ChunkSize
   -> SampleRate Real
   -> Real
   -> LazyTime
   -> T Real)
pingReleaseEnvelope =
   ((SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
 -> (ChunkSize -> SampleRate Real -> Real -> Real -> T Real)
 -> Real
 -> Real
 -> ChunkSize
 -> SampleRate Real
 -> Real
 -> LazyTime
 -> T Real)
-> IO (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
-> IO (ChunkSize -> SampleRate Real -> Real -> Real -> T Real)
-> IO
     (Real
      -> Real
      -> ChunkSize
      -> SampleRate Real
      -> Real
      -> LazyTime
      -> T Real)
forall a b c. (a -> b -> c) -> IO a -> IO b -> IO c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
      (\SampleRate Real -> Real -> Real -> T LazySize (Vector Real)
pressed ChunkSize -> SampleRate Real -> Real -> Real -> T Real
release Real
decay Real
rel ChunkSize
chunkSize SampleRate Real
sr Real
vel LazyTime
dur ->
         T Real -> (Real -> T Real) -> T Real
forall a. Storable a => Vector a -> (a -> Vector a) -> Vector a
SigStL.continue
            (T LazySize (Vector Real) -> LazyTime -> T Real
forall b.
Storable b =>
T LazySize (Vector b) -> LazyTime -> Vector b
pioApplyToLazyTime (SampleRate Real -> Real -> Real -> T LazySize (Vector Real)
pressed SampleRate Real
sr Real
decay Real
vel) LazyTime
dur)
            (\Real
x -> ChunkSize -> SampleRate Real -> Real -> Real -> T Real
release ChunkSize
chunkSize SampleRate Real
sr Real
rel Real
x))
      (DSL
  (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
  (Element
     (In (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))))
  (Element
     (Out
        (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))))
-> IO (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
forall f a al b bl.
(Run f, In f ~ a, Default a, Element a ~ al, Out f ~ b, Default b,
 Element b ~ bl) =>
DSL f al bl -> IO f
CausalRender.run (DSL
   (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
   (Element
      (In (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))))
   (Element
      (Out
         (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))))
 -> IO
      (SampleRate Real -> Real -> Real -> T LazySize (Vector Real)))
-> DSL
     (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
     (Element
        (In (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))))
     (Element
        (Out
           (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))))
-> IO (SampleRate Real -> Real -> Real -> T LazySize (Vector Real))
forall a b. (a -> b) -> a -> b
$
       (Arg Time (Exp Real)
 -> Arg Number (Exp Real) -> SampleRate (Exp Real) -> T () (T Real))
-> SampleRate (Exp Real)
-> Unwrapped
     (Arg Time (Exp Real)
      -> Arg Number (Exp Real) -> SampleRate (Exp Real) -> T () (T Real))
forall a f. Wrapped a f => f -> SampleRate a -> Unwrapped f
wrapped ((Arg Time (Exp Real)
  -> Arg Number (Exp Real) -> SampleRate (Exp Real) -> T () (T Real))
 -> SampleRate (Exp Real)
 -> Unwrapped
      (Arg Time (Exp Real)
       -> Arg Number (Exp Real)
       -> SampleRate (Exp Real)
       -> T () (T Real)))
-> (Arg Time (Exp Real)
    -> Arg Number (Exp Real) -> SampleRate (Exp Real) -> T () (T Real))
-> SampleRate (Exp Real)
-> Unwrapped
     (Arg Time (Exp Real)
      -> Arg Number (Exp Real) -> SampleRate (Exp Real) -> T () (T Real))
forall a b. (a -> b) -> a -> b
$ \(Time Exp Real
halfLife) (Number Exp Real
velocity) (SampleRate Exp Real
_sr) ->
       SignalOf T (T Real) -> T () (T Real)
forall b a. SignalOf T b -> T a b
forall (process :: * -> * -> *) b a.
C process =>
SignalOf process b -> process a b
Causal.fromSignal
         (Exp Real -> Exp Real -> T (T Real)
forall a.
(C a, Real a, RationalConstant a, Transcendental a) =>
Exp a -> Exp a -> MV a
Sig.exponential2 Exp Real
halfLife (Exp Real -> Exp Real
forall a. C a => a -> a
amplitudeFromVelocity Exp Real
velocity)))
      (DSL (SampleRate Real -> Real -> Real -> T Real)
-> IO
     (Shape (SampleRate Real -> Real -> Real -> T Real)
      -> SampleRate Real -> Real -> Real -> T Real)
forall f. Run f => DSL f -> IO (Shape f -> f)
Render.run (DSL (SampleRate Real -> Real -> Real -> T Real)
 -> IO
      (Shape (SampleRate Real -> Real -> Real -> T Real)
       -> SampleRate Real -> Real -> Real -> T Real))
-> DSL (SampleRate Real -> Real -> Real -> T Real)
-> IO
     (Shape (SampleRate Real -> Real -> Real -> T Real)
      -> SampleRate Real -> Real -> Real -> T Real)
forall a b. (a -> b) -> a -> b
$
       (Arg Time (Exp Real)
 -> Arg Number (Exp Real) -> SampleRate (Exp Real) -> T (T Real))
-> SampleRate (Exp Real)
-> Unwrapped
     (Arg Time (Exp Real)
      -> Arg Number (Exp Real) -> SampleRate (Exp Real) -> T (T Real))
forall a f. Wrapped a f => f -> SampleRate a -> Unwrapped f
wrapped ((Arg Time (Exp Real)
  -> Arg Number (Exp Real) -> SampleRate (Exp Real) -> T (T Real))
 -> SampleRate (Exp Real)
 -> Unwrapped
      (Arg Time (Exp Real)
       -> Arg Number (Exp Real) -> SampleRate (Exp Real) -> T (T Real)))
-> (Arg Time (Exp Real)
    -> Arg Number (Exp Real) -> SampleRate (Exp Real) -> T (T Real))
-> SampleRate (Exp Real)
-> Unwrapped
     (Arg Time (Exp Real)
      -> Arg Number (Exp Real) -> SampleRate (Exp Real) -> T (T Real))
forall a b. (a -> b) -> a -> b
$ \(Time Exp Real
release) (Number Exp Real
amplitude) (SampleRate Exp Real
_sr) ->
         Exp Word -> T (T Real) (T Real)
forall a. Exp Word -> T a a
Causal.take (Exp Real -> Exp Word
forall i ir a ar.
(NativeInteger i ir, NativeFloating a ar) =>
Exp a -> Exp i
Expr.roundToIntFast (Exp Real
releaseExp Real -> Exp Real -> Exp Real
forall a. Num a => a -> a -> a
*Exp Real
3)) T (T Real) (T Real) -> SignalOf T (T Real) -> SignalOf T (T Real)
forall (process :: * -> * -> *) a b.
C process =>
process a b -> SignalOf process a -> SignalOf process b
$*
         Exp Real -> Exp Real -> T (T Real)
forall a.
(C a, Real a, RationalConstant a, Transcendental a) =>
Exp a -> Exp a -> MV a
Sig.exponential2 Exp Real
release Exp Real
amplitude)

pingRelease :: IO (Real -> Real -> SigSt.ChunkSize -> Instrument Real Real)
pingRelease :: IO (Real -> Real -> ChunkSize -> Instrument Real Real)
pingRelease =
   ((SampleRate Real -> Real -> T (Vector Real) (Vector Real))
 -> (Real
     -> Real
     -> ChunkSize
     -> SampleRate Real
     -> Real
     -> LazyTime
     -> T Real)
 -> Real
 -> Real
 -> ChunkSize
 -> Instrument Real Real)
-> IO (SampleRate Real -> Real -> T (Vector Real) (Vector Real))
-> IO
     (Real
      -> Real
      -> ChunkSize
      -> SampleRate Real
      -> Real
      -> LazyTime
      -> T Real)
-> IO (Real -> Real -> ChunkSize -> Instrument Real Real)
forall a b c. (a -> b -> c) -> IO a -> IO b -> IO c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
      (\SampleRate Real -> Real -> T (Vector Real) (Vector Real)
osc Real
-> Real
-> ChunkSize
-> SampleRate Real
-> Real
-> LazyTime
-> T Real
env Real
dec Real
rel ChunkSize
chunkSize SampleRate Real
sr Real
vel Real
freq LazyTime
dur ->
         T (Vector Real) (Vector Real) -> T Real -> T Real
forall a b.
(Storable a, Storable b) =>
T (Vector a) (Vector b) -> Vector a -> Vector b
pioApply (SampleRate Real -> Real -> T (Vector Real) (Vector Real)
osc SampleRate Real
sr Real
freq) (Real
-> Real
-> ChunkSize
-> SampleRate Real
-> Real
-> LazyTime
-> T Real
env Real
dec Real
rel ChunkSize
chunkSize SampleRate Real
sr Real
vel LazyTime
dur))
      (DSL
  (SampleRate Real -> Real -> T (Vector Real) (Vector Real))
  (Element
     (In (SampleRate Real -> Real -> T (Vector Real) (Vector Real))))
  (Element
     (Out (SampleRate Real -> Real -> T (Vector Real) (Vector Real))))
-> IO (SampleRate Real -> Real -> T (Vector Real) (Vector Real))
forall f a al b bl.
(Run f, In f ~ a, Default a, Element a ~ al, Out f ~ b, Default b,
 Element b ~ bl) =>
DSL f al bl -> IO f
CausalRender.run (DSL
   (SampleRate Real -> Real -> T (Vector Real) (Vector Real))
   (Element
      (In (SampleRate Real -> Real -> T (Vector Real) (Vector Real))))
   (Element
      (Out (SampleRate Real -> Real -> T (Vector Real) (Vector Real))))
 -> IO (SampleRate Real -> Real -> T (Vector Real) (Vector Real)))
-> DSL
     (SampleRate Real -> Real -> T (Vector Real) (Vector Real))
     (Element
        (In (SampleRate Real -> Real -> T (Vector Real) (Vector Real))))
     (Element
        (Out (SampleRate Real -> Real -> T (Vector Real) (Vector Real))))
-> IO (SampleRate Real -> Real -> T (Vector Real) (Vector Real))
forall a b. (a -> b) -> a -> b
$ SampleRate (Exp Real) -> Exp Real -> Exp Real
forall a. C a => SampleRate a -> a -> a
frequency (SampleRate (Exp Real) -> Exp Real -> Exp Real)
-> (Exp Real -> SampleRate (Exp Real) -> T (T Real) (T Real))
-> SampleRate (Exp Real)
-> Exp Real
-> T (T Real) (T Real)
forall a b c d.
(SampleRate a -> b -> c)
-> (c -> SampleRate a -> d) -> SampleRate a -> b -> d
$+ \Exp Real
freq SampleRate (Exp Real)
_sr ->
         T (T Real, T Real) (T Real)
forall a. PseudoRing a => T (a, a) a
Causal.envelope T (T Real, T Real) (T Real)
-> SignalOf T (T Real) -> T (T Real) (T Real)
forall (process :: * -> * -> *) a b c.
C process =>
process (a, b) c -> SignalOf process b -> process a c
$> (forall r. T Real -> CodeGenFunction r (T Real))
-> Exp Real -> Exp Real -> T (T Real)
forall t y.
(Fraction t, C t) =>
(forall r. T t -> CodeGenFunction r y) -> Exp t -> Exp t -> T y
Sig.osci T Real -> CodeGenFunction r (T Real)
forall r. T Real -> CodeGenFunction r (T Real)
forall a r.
(PseudoRing a, IntegerConstant a) =>
a -> CodeGenFunction r a
WaveL.saw Exp Real
forall a. C a => a
zero Exp Real
freq)
      IO
  (Real
   -> Real
   -> ChunkSize
   -> SampleRate Real
   -> Real
   -> LazyTime
   -> T Real)
pingReleaseEnvelope

pingStereoRelease ::
   IO (Real -> Real -> SigSt.ChunkSize -> Instrument Real (Stereo.T Real))
pingStereoRelease :: IO (Real -> Real -> ChunkSize -> Instrument Real (T Real))
pingStereoRelease =
   ((SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
 -> (Real
     -> Real
     -> ChunkSize
     -> SampleRate Real
     -> Real
     -> LazyTime
     -> T Real)
 -> Real
 -> Real
 -> ChunkSize
 -> Instrument Real (T Real))
-> IO
     (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
-> IO
     (Real
      -> Real
      -> ChunkSize
      -> SampleRate Real
      -> Real
      -> LazyTime
      -> T Real)
-> IO (Real -> Real -> ChunkSize -> Instrument Real (T Real))
forall a b c. (a -> b -> c) -> IO a -> IO b -> IO c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
      (\SampleRate Real -> Real -> T (Vector Real) (Vector (T Real))
osc Real
-> Real
-> ChunkSize
-> SampleRate Real
-> Real
-> LazyTime
-> T Real
env Real
dec Real
rel ChunkSize
chunkSize SampleRate Real
sr Real
vel Real
freq LazyTime
dur ->
         T (Vector Real) (Vector (T Real)) -> T Real -> Vector (T Real)
forall a b.
(Storable a, Storable b) =>
T (Vector a) (Vector b) -> Vector a -> Vector b
pioApply (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real))
osc SampleRate Real
sr Real
freq) (Real
-> Real
-> ChunkSize
-> SampleRate Real
-> Real
-> LazyTime
-> T Real
env Real
dec Real
rel ChunkSize
chunkSize SampleRate Real
sr Real
vel LazyTime
dur))
      (DSL
  (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
  (Element
     (In
        (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))))
  (Element
     (Out
        (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))))
-> IO
     (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
forall f a al b bl.
(Run f, In f ~ a, Default a, Element a ~ al, Out f ~ b, Default b,
 Element b ~ bl) =>
DSL f al bl -> IO f
CausalRender.run (DSL
   (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
   (Element
      (In
         (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))))
   (Element
      (Out
         (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))))
 -> IO
      (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real))))
-> DSL
     (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
     (Element
        (In
           (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))))
     (Element
        (Out
           (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))))
-> IO
     (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
forall a b. (a -> b) -> a -> b
$ SampleRate (Exp Real) -> Exp Real -> Exp Real
forall a. C a => SampleRate a -> a -> a
frequency (SampleRate (Exp Real) -> Exp Real -> Exp Real)
-> (Exp Real -> SampleRate (Exp Real) -> T (T Real) (T (T Real)))
-> SampleRate (Exp Real)
-> Exp Real
-> T (T Real) (T (T Real))
forall a b c d.
(SampleRate a -> b -> c)
-> (c -> SampleRate a -> d) -> SampleRate a -> b -> d
$+ \Exp Real
freq SampleRate (Exp Real)
_sr ->
         T (T Real) -> T (T Real)
forall a. T (T a) -> T (T a)
Stereo.multiValue (T (T Real) -> T (T Real))
-> T (T Real, T (T Real)) (T (T Real))
-> T (T Real, T (T Real)) (T (T Real))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
         T (T Real, T (T Real)) (T (T Real))
forall a. PseudoRing a => T (a, T a) (T a)
Causal.envelopeStereo T (T Real, T (T Real)) (T (T Real))
-> SignalOf T (T (T Real)) -> T (T Real) (T (T Real))
forall (process :: * -> * -> *) a b c.
C process =>
process (a, b) c -> SignalOf process b -> process a c
$>
            (T Real -> T Real -> T (T Real))
-> T (T Real) -> T (T Real) -> T (T (T Real))
forall a b c. (a -> b -> c) -> T a -> T b -> T c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 T Real -> T Real -> T (T Real)
forall a. a -> a -> T a
Stereo.cons
               ((forall r. T Real -> CodeGenFunction r (T Real))
-> Exp Real -> Exp Real -> T (T Real)
forall t y.
(Fraction t, C t) =>
(forall r. T t -> CodeGenFunction r y) -> Exp t -> Exp t -> T y
Sig.osci T Real -> CodeGenFunction r (T Real)
forall r. T Real -> CodeGenFunction r (T Real)
forall a r.
(PseudoRing a, IntegerConstant a) =>
a -> CodeGenFunction r a
WaveL.saw Exp Real
forall a. C a => a
zero (Exp Real
0.999Exp Real -> Exp Real -> Exp Real
forall a. Num a => a -> a -> a
*Exp Real
freq))
               ((forall r. T Real -> CodeGenFunction r (T Real))
-> Exp Real -> Exp Real -> T (T Real)
forall t y.
(Fraction t, C t) =>
(forall r. T t -> CodeGenFunction r y) -> Exp t -> Exp t -> T y
Sig.osci T Real -> CodeGenFunction r (T Real)
forall r. T Real -> CodeGenFunction r (T Real)
forall a r.
(PseudoRing a, IntegerConstant a) =>
a -> CodeGenFunction r a
WaveL.saw Exp Real
forall a. C a => a
zero (Exp Real
1.001Exp Real -> Exp Real -> Exp Real
forall a. Num a => a -> a -> a
*Exp Real
freq)))
      IO
  (Real
   -> Real
   -> ChunkSize
   -> SampleRate Real
   -> Real
   -> LazyTime
   -> T Real)
pingReleaseEnvelope



tine :: IO (Real -> Real -> SigSt.ChunkSize -> Instrument Real Real)
tine :: IO (Real -> Real -> ChunkSize -> Instrument Real Real)
tine =
   ((SampleRate Real -> Real -> Real -> T (Vector Real) (Vector Real))
 -> (Real
     -> Real
     -> ChunkSize
     -> SampleRate Real
     -> Real
     -> LazyTime
     -> T Real)
 -> Real
 -> Real
 -> ChunkSize
 -> Instrument Real Real)
-> IO
     (SampleRate Real -> Real -> Real -> T (Vector Real) (Vector Real))
-> IO
     (Real
      -> Real
      -> ChunkSize
      -> SampleRate Real
      -> Real
      -> LazyTime
      -> T Real)
-> IO (Real -> Real -> ChunkSize -> Instrument Real Real)
forall a b c. (a -> b -> c) -> IO a -> IO b -> IO c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
      (\SampleRate Real -> Real -> Real -> T (Vector Real) (Vector Real)
osc Real
-> Real
-> ChunkSize
-> SampleRate Real
-> Real
-> LazyTime
-> T Real
env Real
dec Real
rel ChunkSize
chunkSize SampleRate Real
sr Real
vel Real
freq LazyTime
dur ->
         T (Vector Real) (Vector Real) -> T Real -> T Real
forall a b.
(Storable a, Storable b) =>
T (Vector a) (Vector b) -> Vector a -> Vector b
pioApply (SampleRate Real -> Real -> Real -> T (Vector Real) (Vector Real)
osc SampleRate Real
sr Real
vel Real
freq) (Real
-> Real
-> ChunkSize
-> SampleRate Real
-> Real
-> LazyTime
-> T Real
env Real
dec Real
rel ChunkSize
chunkSize SampleRate Real
sr Real
0 LazyTime
dur))
      (DSL
  (SampleRate Real -> Real -> Real -> T (Vector Real) (Vector Real))
  (Element
     (In
        (SampleRate Real
         -> Real -> Real -> T (Vector Real) (Vector Real))))
  (Element
     (Out
        (SampleRate Real
         -> Real -> Real -> T (Vector Real) (Vector Real))))
-> IO
     (SampleRate Real -> Real -> Real -> T (Vector Real) (Vector Real))
forall f a al b bl.
(Run f, In f ~ a, Default a, Element a ~ al, Out f ~ b, Default b,
 Element b ~ bl) =>
DSL f al bl -> IO f
CausalRender.run (DSL
   (SampleRate Real -> Real -> Real -> T (Vector Real) (Vector Real))
   (Element
      (In
         (SampleRate Real
          -> Real -> Real -> T (Vector Real) (Vector Real))))
   (Element
      (Out
         (SampleRate Real
          -> Real -> Real -> T (Vector Real) (Vector Real))))
 -> IO
      (SampleRate Real -> Real -> Real -> T (Vector Real) (Vector Real)))
-> DSL
     (SampleRate Real -> Real -> Real -> T (Vector Real) (Vector Real))
     (Element
        (In
           (SampleRate Real
            -> Real -> Real -> T (Vector Real) (Vector Real))))
     (Element
        (Out
           (SampleRate Real
            -> Real -> Real -> T (Vector Real) (Vector Real))))
-> IO
     (SampleRate Real -> Real -> Real -> T (Vector Real) (Vector Real))
forall a b. (a -> b) -> a -> b
$
       (Arg Number (Exp Real)
 -> Arg Frequency (Exp Real)
 -> SampleRate (Exp Real)
 -> T (T Real) (T Real))
-> SampleRate (Exp Real)
-> Unwrapped
     (Arg Number (Exp Real)
      -> Arg Frequency (Exp Real)
      -> SampleRate (Exp Real)
      -> T (T Real) (T Real))
forall a f. Wrapped a f => f -> SampleRate a -> Unwrapped f
wrapped ((Arg Number (Exp Real)
  -> Arg Frequency (Exp Real)
  -> SampleRate (Exp Real)
  -> T (T Real) (T Real))
 -> SampleRate (Exp Real)
 -> Unwrapped
      (Arg Number (Exp Real)
       -> Arg Frequency (Exp Real)
       -> SampleRate (Exp Real)
       -> T (T Real) (T Real)))
-> (Arg Number (Exp Real)
    -> Arg Frequency (Exp Real)
    -> SampleRate (Exp Real)
    -> T (T Real) (T Real))
-> SampleRate (Exp Real)
-> Unwrapped
     (Arg Number (Exp Real)
      -> Arg Frequency (Exp Real)
      -> SampleRate (Exp Real)
      -> T (T Real) (T Real))
forall a b. (a -> b) -> a -> b
$ \(Number Exp Real
vel) (Frequency Exp Real
freq) ->
       (SampleRate (Exp Real) -> Exp Real -> Exp Real)
-> Exp Real
-> (Exp Real -> SampleRate (Exp Real) -> T (T Real) (T Real))
-> SampleRate (Exp Real)
-> T (T Real) (T Real)
forall a b c d.
(SampleRate a -> b -> c)
-> b -> (c -> SampleRate a -> d) -> SampleRate a -> d
constant SampleRate (Exp Real) -> Exp Real -> Exp Real
forall a. C a => SampleRate a -> a -> a
time Exp Real
1 ((Exp Real -> SampleRate (Exp Real) -> T (T Real) (T Real))
 -> SampleRate (Exp Real) -> T (T Real) (T Real))
-> (Exp Real -> SampleRate (Exp Real) -> T (T Real) (T Real))
-> SampleRate (Exp Real)
-> T (T Real) (T Real)
forall a b. (a -> b) -> a -> b
$ \Exp Real
halfLife SampleRate (Exp Real)
_sr ->
         T (T Real, T Real) (T Real)
forall a. PseudoRing a => T (a, a) a
Causal.envelope T (T Real, T Real) (T Real)
-> SignalOf T (T Real) -> T (T Real) (T Real)
forall (process :: * -> * -> *) a b c.
C process =>
process (a, b) c -> SignalOf process b -> process a c
$>
         ((forall r. T Real -> CodeGenFunction r (T Real))
-> T (T Real, T Real) (T Real)
forall t y.
(C t, Fraction t) =>
(forall r. t -> CodeGenFunction r y) -> T (t, t) y
Causal.osci T Real -> CodeGenFunction r (T Real)
forall r. T Real -> CodeGenFunction r (T Real)
forall a r.
(PseudoRing a, IntegerConstant a, Fraction a) =>
a -> CodeGenFunction r a
WaveL.approxSine2
            T (T Real, T Real) (T Real)
-> SignalOf T (T Real) -> T (T Real) (T Real)
forall (process :: * -> * -> *) a b c.
C process =>
process (a, b) c -> SignalOf process b -> process a c
$> Exp Real -> T (T Real)
forall ae al. (Aggregate ae al, C al) => ae -> T al
Sig.constant Exp Real
freq
            T (T Real) (T Real) -> SignalOf T (T Real) -> SignalOf T (T Real)
forall (process :: * -> * -> *) a b.
C process =>
process a b -> SignalOf process a -> SignalOf process b
$* (T (T Real, T Real) (T Real)
forall a. PseudoRing a => T (a, a) a
Causal.envelope
                  T (T Real, T Real) (T Real)
-> SignalOf T (T Real) -> T (T Real) (T Real)
forall (process :: * -> * -> *) a b c.
C process =>
process (a, b) c -> SignalOf process a -> process b c
$< Exp Real -> Exp Real -> T (T Real)
forall a.
(C a, Real a, RationalConstant a, Transcendental a) =>
Exp a -> Exp a -> MV a
Sig.exponential2 Exp Real
halfLife (Exp Real
velExp Real -> Exp Real -> Exp Real
forall a. C a => a -> a -> a
+Exp Real
1)
                  T (T Real) (T Real) -> SignalOf T (T Real) -> SignalOf T (T Real)
forall (process :: * -> * -> *) a b.
C process =>
process a b -> SignalOf process a -> SignalOf process b
$* (forall r. T Real -> CodeGenFunction r (T Real))
-> Exp Real -> Exp Real -> T (T Real)
forall t y.
(Fraction t, C t) =>
(forall r. T t -> CodeGenFunction r y) -> Exp t -> Exp t -> T y
Sig.osci T Real -> CodeGenFunction r (T Real)
forall r. T Real -> CodeGenFunction r (T Real)
forall a r.
(PseudoRing a, IntegerConstant a, Fraction a) =>
a -> CodeGenFunction r a
WaveL.approxSine2 Exp Real
forall a. C a => a
zero (Exp Real
2Exp Real -> Exp Real -> Exp Real
forall a. Num a => a -> a -> a
*Exp Real
freq))))
      IO
  (Real
   -> Real
   -> ChunkSize
   -> SampleRate Real
   -> Real
   -> LazyTime
   -> T Real)
pingReleaseEnvelope

tineStereo ::
   IO (Real -> Real -> SigSt.ChunkSize -> Instrument Real (Stereo.T Real))
tineStereo :: IO (Real -> Real -> ChunkSize -> Instrument Real (T Real))
tineStereo =
   ((SampleRate Real
  -> Real -> Real -> T (Vector Real) (Vector (T Real)))
 -> (Real
     -> Real
     -> ChunkSize
     -> SampleRate Real
     -> Real
     -> LazyTime
     -> T Real)
 -> Real
 -> Real
 -> ChunkSize
 -> Instrument Real (T Real))
-> IO
     (SampleRate Real
      -> Real -> Real -> T (Vector Real) (Vector (T Real)))
-> IO
     (Real
      -> Real
      -> ChunkSize
      -> SampleRate Real
      -> Real
      -> LazyTime
      -> T Real)
-> IO (Real -> Real -> ChunkSize -> Instrument Real (T Real))
forall a b c. (a -> b -> c) -> IO a -> IO b -> IO c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
      (\SampleRate Real
-> Real -> Real -> T (Vector Real) (Vector (T Real))
osc Real
-> Real
-> ChunkSize
-> SampleRate Real
-> Real
-> LazyTime
-> T Real
env Real
dec Real
rel ChunkSize
chunkSize SampleRate Real
sr Real
vel Real
freq LazyTime
dur ->
         T (Vector Real) (Vector (T Real)) -> T Real -> Vector (T Real)
forall a b.
(Storable a, Storable b) =>
T (Vector a) (Vector b) -> Vector a -> Vector b
pioApply (SampleRate Real
-> Real -> Real -> T (Vector Real) (Vector (T Real))
osc SampleRate Real
sr Real
vel Real
freq) (Real
-> Real
-> ChunkSize
-> SampleRate Real
-> Real
-> LazyTime
-> T Real
env Real
dec Real
rel ChunkSize
chunkSize SampleRate Real
sr Real
0 LazyTime
dur))
      (DSL
  (SampleRate Real
   -> Real -> Real -> T (Vector Real) (Vector (T Real)))
  (Element
     (In
        (SampleRate Real
         -> Real -> Real -> T (Vector Real) (Vector (T Real)))))
  (Element
     (Out
        (SampleRate Real
         -> Real -> Real -> T (Vector Real) (Vector (T Real)))))
-> IO
     (SampleRate Real
      -> Real -> Real -> T (Vector Real) (Vector (T Real)))
forall f a al b bl.
(Run f, In f ~ a, Default a, Element a ~ al, Out f ~ b, Default b,
 Element b ~ bl) =>
DSL f al bl -> IO f
CausalRender.run (DSL
   (SampleRate Real
    -> Real -> Real -> T (Vector Real) (Vector (T Real)))
   (Element
      (In
         (SampleRate Real
          -> Real -> Real -> T (Vector Real) (Vector (T Real)))))
   (Element
      (Out
         (SampleRate Real
          -> Real -> Real -> T (Vector Real) (Vector (T Real)))))
 -> IO
      (SampleRate Real
       -> Real -> Real -> T (Vector Real) (Vector (T Real))))
-> DSL
     (SampleRate Real
      -> Real -> Real -> T (Vector Real) (Vector (T Real)))
     (Element
        (In
           (SampleRate Real
            -> Real -> Real -> T (Vector Real) (Vector (T Real)))))
     (Element
        (Out
           (SampleRate Real
            -> Real -> Real -> T (Vector Real) (Vector (T Real)))))
-> IO
     (SampleRate Real
      -> Real -> Real -> T (Vector Real) (Vector (T Real)))
forall a b. (a -> b) -> a -> b
$
       (Arg Number (Exp Real)
 -> Arg Frequency (Exp Real)
 -> SampleRate (Exp Real)
 -> T (T Real) (T (T Real)))
-> SampleRate (Exp Real)
-> Unwrapped
     (Arg Number (Exp Real)
      -> Arg Frequency (Exp Real)
      -> SampleRate (Exp Real)
      -> T (T Real) (T (T Real)))
forall a f. Wrapped a f => f -> SampleRate a -> Unwrapped f
wrapped ((Arg Number (Exp Real)
  -> Arg Frequency (Exp Real)
  -> SampleRate (Exp Real)
  -> T (T Real) (T (T Real)))
 -> SampleRate (Exp Real)
 -> Unwrapped
      (Arg Number (Exp Real)
       -> Arg Frequency (Exp Real)
       -> SampleRate (Exp Real)
       -> T (T Real) (T (T Real))))
-> (Arg Number (Exp Real)
    -> Arg Frequency (Exp Real)
    -> SampleRate (Exp Real)
    -> T (T Real) (T (T Real)))
-> SampleRate (Exp Real)
-> Unwrapped
     (Arg Number (Exp Real)
      -> Arg Frequency (Exp Real)
      -> SampleRate (Exp Real)
      -> T (T Real) (T (T Real)))
forall a b. (a -> b) -> a -> b
$ \(Number Exp Real
vel) (Frequency Exp Real
freq) ->
       (SampleRate (Exp Real) -> Exp Real -> Exp Real)
-> Exp Real
-> (Exp Real -> SampleRate (Exp Real) -> T (T Real) (T (T Real)))
-> SampleRate (Exp Real)
-> T (T Real) (T (T Real))
forall a b c d.
(SampleRate a -> b -> c)
-> b -> (c -> SampleRate a -> d) -> SampleRate a -> d
constant SampleRate (Exp Real) -> Exp Real -> Exp Real
forall a. C a => SampleRate a -> a -> a
time Exp Real
1 ((Exp Real -> SampleRate (Exp Real) -> T (T Real) (T (T Real)))
 -> SampleRate (Exp Real) -> T (T Real) (T (T Real)))
-> (Exp Real -> SampleRate (Exp Real) -> T (T Real) (T (T Real)))
-> SampleRate (Exp Real)
-> T (T Real) (T (T Real))
forall a b. (a -> b) -> a -> b
$ \Exp Real
halfLife SampleRate (Exp Real)
_sr ->
         let chanOsci :: Exp Real -> T (MultiValuesOf (Exp Real)) (MultiValuesOf (Exp Real))
chanOsci Exp Real
d =
               (forall r.
 MultiValuesOf (Exp Real)
 -> CodeGenFunction r (MultiValuesOf (Exp Real)))
-> T (MultiValuesOf (Exp Real), MultiValuesOf (Exp Real))
     (MultiValuesOf (Exp Real))
forall t y.
(C t, Fraction t) =>
(forall r. t -> CodeGenFunction r y) -> T (t, t) y
Causal.osci MultiValuesOf (Exp Real)
-> CodeGenFunction r (MultiValuesOf (Exp Real))
forall r.
MultiValuesOf (Exp Real)
-> CodeGenFunction r (MultiValuesOf (Exp Real))
forall a r.
(PseudoRing a, IntegerConstant a, Fraction a) =>
a -> CodeGenFunction r a
WaveL.approxSine2 T (MultiValuesOf (Exp Real), MultiValuesOf (Exp Real))
  (MultiValuesOf (Exp Real))
-> SignalOf T (MultiValuesOf (Exp Real))
-> T (MultiValuesOf (Exp Real)) (MultiValuesOf (Exp Real))
forall (process :: * -> * -> *) a b c.
C process =>
process (a, b) c -> SignalOf process b -> process a c
$> Exp Real -> T (MultiValuesOf (Exp Real))
forall ae al. (Aggregate ae al, C al) => ae -> T al
Sig.constant (Exp Real
freqExp Real -> Exp Real -> Exp Real
forall a. Num a => a -> a -> a
*Exp Real
d)
         in T (T Real) -> T (T Real)
forall a. T (T a) -> T (T a)
Stereo.multiValue (T (T Real) -> T (T Real))
-> T (T Real, T (T Real)) (T (T Real))
-> T (T Real, T (T Real)) (T (T Real))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
            T (T Real, T (T Real)) (T (T Real))
forall a. PseudoRing a => T (a, T a) (T a)
Causal.envelopeStereo T (T Real, T (T Real)) (T (T Real))
-> SignalOf T (T (T Real)) -> T (T Real) (T (T Real))
forall (process :: * -> * -> *) a b c.
C process =>
process (a, b) c -> SignalOf process b -> process a c
$>
               ((T Real -> T Real -> T (T Real))
-> T (T Real) (T Real)
-> T (T Real) (T Real)
-> T (T Real) (T (T Real))
forall a b c.
(a -> b -> c) -> T (T Real) a -> T (T Real) b -> T (T Real) c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 T Real -> T Real -> T (T Real)
forall a. a -> a -> T a
Stereo.cons (Exp Real -> T (MultiValuesOf (Exp Real)) (MultiValuesOf (Exp Real))
chanOsci Exp Real
0.995) (Exp Real -> T (MultiValuesOf (Exp Real)) (MultiValuesOf (Exp Real))
chanOsci Exp Real
1.005) T (T Real) (T (T Real))
-> SignalOf T (T Real) -> SignalOf T (T (T Real))
forall (process :: * -> * -> *) a b.
C process =>
process a b -> SignalOf process a -> SignalOf process b
$*
                  (T (T Real, T Real) (T Real)
forall a. PseudoRing a => T (a, a) a
Causal.envelope
                     T (T Real, T Real) (T Real)
-> SignalOf T (T Real) -> T (T Real) (T Real)
forall (process :: * -> * -> *) a b c.
C process =>
process (a, b) c -> SignalOf process a -> process b c
$< Exp Real -> Exp Real -> T (T Real)
forall a.
(C a, Real a, RationalConstant a, Transcendental a) =>
Exp a -> Exp a -> MV a
Sig.exponential2 Exp Real
halfLife (Exp Real
velExp Real -> Exp Real -> Exp Real
forall a. C a => a -> a -> a
+Exp Real
1)
                     T (T Real) (T Real) -> SignalOf T (T Real) -> SignalOf T (T Real)
forall (process :: * -> * -> *) a b.
C process =>
process a b -> SignalOf process a -> SignalOf process b
$* (forall r. T Real -> CodeGenFunction r (T Real))
-> Exp Real -> Exp Real -> T (T Real)
forall t y.
(Fraction t, C t) =>
(forall r. T t -> CodeGenFunction r y) -> Exp t -> Exp t -> T y
Sig.osci T Real -> CodeGenFunction r (T Real)
forall r. T Real -> CodeGenFunction r (T Real)
forall a r.
(PseudoRing a, IntegerConstant a, Fraction a) =>
a -> CodeGenFunction r a
WaveL.approxSine2 Exp Real
forall a. C a => a
zero (Exp Real
2Exp Real -> Exp Real -> Exp Real
forall a. Num a => a -> a -> a
*Exp Real
freq))))
      IO
  (Real
   -> Real
   -> ChunkSize
   -> SampleRate Real
   -> Real
   -> LazyTime
   -> T Real)
pingReleaseEnvelope



softStringReleaseEnvelope ::
   IO (Real -> SampleRate Real -> Real -> Ev.LazyTime -> SigSt.T Real)
softStringReleaseEnvelope :: IO (Real -> SampleRate Real -> Real -> LazyTime -> T Real)
softStringReleaseEnvelope =
   ((Word -> Real -> T LazySize (Vector Real))
 -> Real -> SampleRate Real -> Real -> LazyTime -> T Real)
-> IO (Word -> Real -> T LazySize (Vector Real))
-> IO (Real -> SampleRate Real -> Real -> LazyTime -> T Real)
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA
      (\Word -> Real -> T LazySize (Vector Real)
env Real
attackTime (SampleRate Real
sampleRate) Real
vel LazyTime
dur ->
         let attackTimeInt :: Int
attackTimeInt = Real -> Int
forall b. C b => Real -> b
forall a b. (C a, C b) => a -> b
round (Real
attackTime Real -> Real -> Real
forall a. Num a => a -> a -> a
* Real
sampleRate)
             {-
             release <- take attackTime beginning
             would yield a space leak, thus we first split 'beginning'
             and then concatenate it again
             -}
             {-
             We can not easily generate attack and sustain separately,
             because we want to use the chunk structure implied by 'dur'.
             -}
             (T Real
attack, T Real
sustain) =
                Int -> T Real -> (T Real, T Real)
forall a. Storable a => Int -> Vector a -> (Vector a, Vector a)
SigSt.splitAt Int
attackTimeInt (T Real -> (T Real, T Real)) -> T Real -> (T Real, T Real)
forall a b. (a -> b) -> a -> b
$
                T LazySize (Vector Real) -> LazyTime -> T Real
forall b.
Storable b =>
T LazySize (Vector b) -> LazyTime -> Vector b
pioApplyToLazyTime
                   (Word -> Real -> T LazySize (Vector Real)
env
                      (Int -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
attackTimeInt :: Word)
                      (Real -> Real
forall a. C a => a -> a
amplitudeFromVelocity Real
vel))
                   LazyTime
dur
             release :: T Real
release = T Real -> T Real
forall a. Storable a => Vector a -> Vector a
SigSt.reverse T Real
attack
         in T Real
attack T Real -> T Real -> T Real
forall a. Semigroup a => a -> a -> a
<> T Real
sustain T Real -> T Real -> T Real
forall a. Semigroup a => a -> a -> a
<> T Real
release)
      (DSL
  (Word -> Real -> T LazySize (Vector Real))
  (Element (In (Word -> Real -> T LazySize (Vector Real))))
  (Element (Out (Word -> Real -> T LazySize (Vector Real))))
-> IO (Word -> Real -> T LazySize (Vector Real))
forall f a al b bl.
(Run f, In f ~ a, Default a, Element a ~ al, Out f ~ b, Default b,
 Element b ~ bl) =>
DSL f al bl -> IO f
CausalRender.run (DSL
   (Word -> Real -> T LazySize (Vector Real))
   (Element (In (Word -> Real -> T LazySize (Vector Real))))
   (Element (Out (Word -> Real -> T LazySize (Vector Real))))
 -> IO (Word -> Real -> T LazySize (Vector Real)))
-> DSL
     (Word -> Real -> T LazySize (Vector Real))
     (Element (In (Word -> Real -> T LazySize (Vector Real))))
     (Element (Out (Word -> Real -> T LazySize (Vector Real))))
-> IO (Word -> Real -> T LazySize (Vector Real))
forall a b. (a -> b) -> a -> b
$ \Exp Word
attackTime Exp Real
amp -> SignalOf T (T Real) -> T () (T Real)
forall b a. SignalOf T b -> T a b
forall (process :: * -> * -> *) b a.
C process =>
SignalOf process b -> process a b
Causal.fromSignal (SignalOf T (T Real) -> T () (T Real))
-> SignalOf T (T Real) -> T () (T Real)
forall a b. (a -> b) -> a -> b
$
       Exp Real -> T (T Real) -> T (T Real)
forall ea a.
(Aggregate ea a, C a, PseudoRing a) =>
ea -> T a -> T a
Sig.amplify Exp Real
amp (Exp Word -> T (T Real)
forall a ar.
(C a, Field a, IntegerConstant a, NativeFloating a ar) =>
Exp Word -> MV a
Sig.parabolaFadeIn Exp Word
attackTime) T (T Real) -> T (T Real) -> T (T Real)
forall a. Semigroup a => a -> a -> a
<> Exp Real -> T (T Real)
forall ae al. (Aggregate ae al, C al) => ae -> T al
Sig.constant Exp Real
amp)

softString :: IO (Instrument Real (Stereo.T Real))
softString :: IO (Instrument Real (T Real))
softString =
   ((SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
 -> (Real -> SampleRate Real -> Real -> LazyTime -> T Real)
 -> Instrument Real (T Real))
-> IO
     (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
-> IO (Real -> SampleRate Real -> Real -> LazyTime -> T Real)
-> IO (Instrument Real (T Real))
forall a b c. (a -> b -> c) -> IO a -> IO b -> IO c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
      (\SampleRate Real -> Real -> T (Vector Real) (Vector (T Real))
osc Real -> SampleRate Real -> Real -> LazyTime -> T Real
env SampleRate Real
sr Real
vel Real
freq LazyTime
dur -> T (Vector Real) (Vector (T Real)) -> T Real -> Vector (T Real)
forall a b.
(Storable a, Storable b) =>
T (Vector a) (Vector b) -> Vector a -> Vector b
pioApply (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real))
osc SampleRate Real
sr Real
freq) (Real -> SampleRate Real -> Real -> LazyTime -> T Real
env Real
1 SampleRate Real
sr Real
vel LazyTime
dur))
      (DSL
  (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
  (Element
     (In
        (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))))
  (Element
     (Out
        (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))))
-> IO
     (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
forall f a al b bl.
(Run f, In f ~ a, Default a, Element a ~ al, Out f ~ b, Default b,
 Element b ~ bl) =>
DSL f al bl -> IO f
CausalRender.run (DSL
   (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
   (Element
      (In
         (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))))
   (Element
      (Out
         (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))))
 -> IO
      (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real))))
-> DSL
     (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
     (Element
        (In
           (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))))
     (Element
        (Out
           (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))))
-> IO
     (SampleRate Real -> Real -> T (Vector Real) (Vector (T Real)))
forall a b. (a -> b) -> a -> b
$ SampleRate (Exp Real) -> Exp Real -> Exp Real
forall a. C a => SampleRate a -> a -> a
frequency (SampleRate (Exp Real) -> Exp Real -> Exp Real)
-> (Exp Real -> SampleRate (Exp Real) -> T (T Real) (T (T Real)))
-> SampleRate (Exp Real)
-> Exp Real
-> T (T Real) (T (T Real))
forall a b c d.
(SampleRate a -> b -> c)
-> (c -> SampleRate a -> d) -> SampleRate a -> b -> d
$+ \Exp Real
freq SampleRate (Exp Real)
_sr ->
       let osci :: Exp Real -> T (T Real)
osci Exp Real
d = (forall r. T Real -> CodeGenFunction r (T Real))
-> Exp Real -> Exp Real -> T (T Real)
forall t y.
(Fraction t, C t) =>
(forall r. T t -> CodeGenFunction r y) -> Exp t -> Exp t -> T y
Sig.osci T Real -> CodeGenFunction r (T Real)
forall r. T Real -> CodeGenFunction r (T Real)
forall a r.
(PseudoRing a, IntegerConstant a) =>
a -> CodeGenFunction r a
WaveL.saw Exp Real
forall a. C a => a
zero (Exp Real
d Exp Real -> Exp Real -> Exp Real
forall a. Num a => a -> a -> a
* Exp Real
freq)
       in T (T Real) -> T (T Real)
forall a. T (T a) -> T (T a)
Stereo.multiValue (T (T Real) -> T (T Real))
-> T (T Real, T (T Real)) (T (T Real))
-> T (T Real, T (T Real)) (T (T Real))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
          T (T Real, T (T Real)) (T (T Real))
forall a. PseudoRing a => T (a, T a) (T a)
Causal.envelopeStereo T (T Real, T (T Real)) (T (T Real))
-> SignalOf T (T (T Real)) -> T (T Real) (T (T Real))
forall (process :: * -> * -> *) a b c.
C process =>
process (a, b) c -> SignalOf process b -> process a c
$>
            (T Real -> T Real -> T (T Real))
-> T (T Real) -> T (T Real) -> T (T (T Real))
forall a b c. (a -> b -> c) -> T a -> T b -> T c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 T Real -> T Real -> T (T Real)
forall a. a -> a -> T a
Stereo.cons
               (Exp Real -> T (T Real)
osci Exp Real
1.005 T (T Real) -> T (T Real) -> T (T Real)
forall a. C a => a -> a -> a
+ Exp Real -> T (T Real)
osci Exp Real
0.998)
               (Exp Real -> T (T Real)
osci Exp Real
1.002 T (T Real) -> T (T Real) -> T (T Real)
forall a. C a => a -> a -> a
+ Exp Real -> T (T Real)
osci Exp Real
0.995))
      IO (Real -> SampleRate Real -> Real -> LazyTime -> T Real)
softStringReleaseEnvelope