module SignalProcessingMethods where import qualified SpectralDistribution as SD import qualified Signal import qualified Rate import SignalProcessing (lowpassTwoPass, ) import Parameters (Freq(Freq), ) import qualified Sound.SoxLib as SoxLib import qualified Data.StorableVector.Lazy as SVL type Triple a = (a,a,a) data T = Cons { dehum :: Signal.Sox -> Signal.Sampled Float, rumble :: Signal.Sox -> Signal.Sampled Float, downSampleAbs :: SoxLib.Rate -> Signal.Sampled Float -> SVL.Vector Float, bandpassDownSample :: Rate.Feature -> Freq -> Signal.Sox -> SVL.Vector Float, bandParameters :: Triple Freq -> Signal.Sampled Float -> [Int] -> [((Float, Float), SD.T Float)] } envelopeLowRate :: (Rate.C rate) => T -> rate -> Signal.Sampled Float -> (SVL.Vector Float, SVL.Vector Float) envelopeLowRate methods featRate sig = let env = downSampleAbs methods (Rate.unpack featRate) sig volume = lowpassTwoPass featRate (Freq 20) env in (volume, SVL.zipWith (/) env volume) dehummedEnvelopeLowRate :: (Rate.C rate) => T -> rate -> Signal.Sox -> (SVL.Vector Float, SVL.Vector Float) dehummedEnvelopeLowRate methods featRate sig = let env = downSampleAbs methods (Rate.unpack featRate) $ dehum methods sig volume = lowpassTwoPass featRate (Freq 20) env in (volume, SVL.zipWith (/) env volume)