module Synthesizer.Modifiers.Ceiling
  where

import Synthesizer.Structure

-- | Apply some ceiling to the SoundEvent. This means that the samples generated by the SoundEvent cannot go higher than
-- the max.
ceiling :: Double -> SoundEvent -> SoundEvent
ceiling :: Double -> SoundEvent -> SoundEvent
ceiling Double
max SoundEvent
event = SoundEvent
event {samples :: SamplingRate -> [Double]
samples = SamplingRate -> [Double]
newSamples}
  where
    oldSamples :: SamplingRate -> [Double]
oldSamples = SoundEvent -> SamplingRate -> [Double]
samples SoundEvent
event
    newSamples :: SamplingRate -> [Double]
newSamples SamplingRate
samplingRate = (Double -> Double) -> [Double] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (Double -> Double -> Double
forall a. Ord a => a -> a -> a
`min` Double
max) (SamplingRate -> [Double]
oldSamples SamplingRate
samplingRate)

-- | Apply some floor to the SoundEvent. This means that the samples generated by the SoundEvent cannot go lower than
-- the min.
floor :: Double -> SoundEvent -> SoundEvent
floor :: Double -> SoundEvent -> SoundEvent
floor Double
min SoundEvent
event = SoundEvent
event {samples :: SamplingRate -> [Double]
samples = SamplingRate -> [Double]
newSamples}
  where
    oldSamples :: SamplingRate -> [Double]
oldSamples = SoundEvent -> SamplingRate -> [Double]
samples SoundEvent
event
    newSamples :: SamplingRate -> [Double]
newSamples SamplingRate
samplingRate = (Double -> Double) -> [Double] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (Double -> Double -> Double
forall a. Ord a => a -> a -> a
`max` Double
min) (SamplingRate -> [Double]
oldSamples SamplingRate
samplingRate)