{-# LANGUAGE NoImplicitPrelude #-}
module Synthesizer.Plain.Cut (
takeUntilPause,
takeUntilInterval,
selectBool,
select,
arrange,
) where
import qualified Synthesizer.Plain.Signal as Sig
import qualified Data.EventList.Relative.TimeBody as EventList
import Data.Array (Array, Ix, (!))
import qualified MathObj.LaurentPolynomial as Laurent
import qualified Algebra.RealRing as RealRing
import qualified Algebra.Additive as Additive
import qualified Number.NonNegative as NonNeg
import NumericPrelude.Numeric
import NumericPrelude.Base
takeUntilPause :: (RealRing.C a) => a -> Int -> Sig.T a -> Sig.T a
takeUntilPause :: forall a. C a => a -> Int -> T a -> T a
takeUntilPause a
y =
(a -> Bool) -> Int -> T a -> T a
forall a. (a -> Bool) -> Int -> T a -> T a
takeUntilInterval ((a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<=a
y) (a -> Bool) -> (a -> a) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
forall a. C a => a -> a
abs)
takeUntilInterval :: (a -> Bool) -> Int -> Sig.T a -> Sig.T a
takeUntilInterval :: forall a. (a -> Bool) -> Int -> T a -> T a
takeUntilInterval a -> Bool
p Int
n T a
xs =
((a, Int) -> a) -> [(a, Int)] -> T a
forall a b. (a -> b) -> [a] -> [b]
map (a, Int) -> a
forall a b. (a, b) -> a
fst ([(a, Int)] -> T a) -> [(a, Int)] -> T a
forall a b. (a -> b) -> a -> b
$
((a, Int) -> Bool) -> [(a, Int)] -> [(a, Int)]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile ((Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<Int
n) (Int -> Bool) -> ((a, Int) -> Int) -> (a, Int) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, Int) -> Int
forall a b. (a, b) -> b
snd) ([(a, Int)] -> [(a, Int)]) -> [(a, Int)] -> [(a, Int)]
forall a b. (a -> b) -> a -> b
$
T a -> [Int] -> [(a, Int)]
forall a b. [a] -> [b] -> [(a, b)]
zip T a
xs ([Int] -> [(a, Int)]) -> [Int] -> [(a, Int)]
forall a b. (a -> b) -> a -> b
$
Int -> [Int] -> [Int]
forall a. Int -> [a] -> [a]
drop Int
n ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$
(Int -> a -> Int) -> Int -> T a -> [Int]
forall b a. (b -> a -> b) -> b -> [a] -> [b]
scanl (\Int
acc a
x -> if a -> Bool
p a
x then Int -> Int
forall a. Enum a => a -> a
succ Int
acc else Int
0) Int
0 T a
xs
[Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ Int -> [Int]
forall a. a -> [a]
repeat Int
0
selectBool :: (Sig.T a, Sig.T a) -> Sig.T Bool -> Sig.T a
selectBool :: forall a. (T a, T a) -> T Bool -> T a
selectBool =
(T a -> T a -> T Bool -> T a) -> (T a, T a) -> T Bool -> T a
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((a -> a -> Bool -> a) -> T a -> T a -> T Bool -> T a
forall a b c d. (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
zipWith3 (\a
xf a
xt Bool
c -> if Bool
c then a
xt else a
xf))
select :: Ix i => Array i (Sig.T a) -> Sig.T i -> Sig.T a
select :: forall i a. Ix i => Array i (T a) -> T i -> T a
select Array i (T a)
arr =
(Array i a -> i -> a) -> [Array i a] -> [i] -> T a
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Array i a -> i -> a
forall i e. Ix i => Array i e -> i -> e
(!)
((Array i (T a) -> Array i a) -> [Array i (T a)] -> [Array i a]
forall a b. (a -> b) -> [a] -> [b]
map ((T a -> a) -> Array i (T a) -> Array i a
forall a b. (a -> b) -> Array i a -> Array i b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap T a -> a
forall a. HasCallStack => [a] -> a
head) ([Array i (T a)] -> [Array i a]) -> [Array i (T a)] -> [Array i a]
forall a b. (a -> b) -> a -> b
$ (Array i (T a) -> Array i (T a))
-> Array i (T a) -> [Array i (T a)]
forall a. (a -> a) -> a -> [a]
iterate ((T a -> T a) -> Array i (T a) -> Array i (T a)
forall a b. (a -> b) -> Array i a -> Array i b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap T a -> T a
forall a. HasCallStack => [a] -> [a]
tail) Array i (T a)
arr)
arrange :: (Additive.C v) =>
EventList.T NonNeg.Int (Sig.T v)
-> Sig.T v
arrange :: forall v. C v => T Int (T v) -> T v
arrange T Int (T v)
evs =
let xs :: [T v]
xs = T Int (T v) -> [T v]
forall time body. T time body -> [body]
EventList.getBodies T Int (T v)
evs
in case (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Int
forall a. T a -> a
NonNeg.toNumber (T Int (T v) -> [Int]
forall time body. T time body -> [time]
EventList.getTimes T Int (T v)
evs) of
Int
t:[Int]
ts -> Int -> v -> T v
forall a. Int -> a -> [a]
replicate Int
t v
forall a. C a => a
zero T v -> T v -> T v
forall a. [a] -> [a] -> [a]
++ [Int] -> [T v] -> T v
forall a. C a => [Int] -> [[a]] -> [a]
Laurent.addShiftedMany [Int]
ts [T v]
xs
[] -> []