module Synthesizer.Plain.Builder ( T, Put, put, run, signalToBinary, signalToBinaryMono, signalToBinaryStereo, ) where import qualified Synthesizer.Basic.Binary as BinSmp import Data.Monoid (Monoid, mempty, mappend, mconcat, Endo(Endo), appEndo, ) import Data.Semigroup (Semigroup, (<>), ) import qualified Algebra.FloatingPoint as Float import qualified Algebra.ToInteger as ToInteger import NumericPrelude.Numeric import NumericPrelude.Base import Prelude () newtype T a = Cons {forall a. T a -> Endo [a] decons :: Endo [a]} type Put a = a -> T a instance Semigroup (T a) where T a x <> :: T a -> T a -> T a <> T a y = forall a. Endo [a] -> T a Cons forall a b. (a -> b) -> a -> b $ forall a. T a -> Endo [a] decons T a x forall a. Semigroup a => a -> a -> a <> forall a. T a -> Endo [a] decons T a y instance Monoid (T a) where mempty :: T a mempty = forall a. Endo [a] -> T a Cons forall a. Monoid a => a mempty mappend :: T a -> T a -> T a mappend = forall a. Semigroup a => a -> a -> a (<>) put :: Put a put :: forall a. Put a put = forall a. Endo [a] -> T a Cons forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a. (a -> a) -> Endo a Endo forall b c a. (b -> c) -> (a -> b) -> a -> c . (:) run :: T a -> [a] run :: forall a. T a -> [a] run = forall a b c. (a -> b -> c) -> b -> a -> c flip forall a. Endo a -> a -> a appEndo [] forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a. T a -> Endo [a] decons {-# INLINE signalToBinary #-} signalToBinary :: (BinSmp.C v, ToInteger.C int, Bounded int) => [v] -> [int] signalToBinary :: forall v int. (C v, C int, Bounded int) => [v] -> [int] signalToBinary = forall a. T a -> [a] run forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a. Monoid a => [a] -> a mconcat forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a b. (a -> b) -> [a] -> [b] map (forall a int out. (C a, Bounded int, C int, Monoid out) => (int -> out) -> a -> out BinSmp.outputFromCanonical forall a. Put a put) {-# INLINE signalToBinaryMono #-} signalToBinaryMono :: (Float.C a, ToInteger.C int, Bounded int) => [a] -> [int] signalToBinaryMono :: forall a int. (C a, C int, Bounded int) => [a] -> [int] signalToBinaryMono = forall a b. (a -> b) -> [a] -> [b] map (forall real int. (C real, Bounded int, C int) => (real -> int) -> real -> int BinSmp.fromCanonicalWith forall a b. (C a, C b) => a -> b round) {-# INLINE signalToBinaryStereo #-} signalToBinaryStereo :: (Float.C a, ToInteger.C int, Bounded int) => [(a,a)] -> [int] signalToBinaryStereo :: forall a int. (C a, C int, Bounded int) => [(a, a)] -> [int] signalToBinaryStereo = forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b] concatMap (\(a l,a r) -> [forall real int. (C real, Bounded int, C int) => (real -> int) -> real -> int BinSmp.fromCanonicalWith forall a b. (C a, C b) => a -> b round a l, forall real int. (C real, Bounded int, C int) => (real -> int) -> real -> int BinSmp.fromCanonicalWith forall a b. (C a, C b) => a -> b round a r])