{-# LANGUAGE DataKinds #-}
{-# LANGUAGE NoIncoherentInstances #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE NoUndecidableInstances #-}
module Vivid.UGens.Analysis (
-- * Analysis > Amplitude
ampComp
--- , ampCompA
, amplitude
--- , detectSilence
--- , loudness
--- , peak
--- , peakFollower
--- , sendPeakRMS
-- * Analysis > Pitch
--- , keyTrack
, pitch
--- , zeroCrossing
-- * Analysis
--- , beatTrack
--- , beatTrack2
--- , mfcc
--- , onsets
-- In UGens.Maths
-- , runningSum
-- In UGens.Filters.Linear:
-- , slope
) where
import Vivid.SC.SynthDef.Types (CalculationRate(..))
import Vivid.SynthDef
import Vivid.SynthDef.FromUA
import Vivid.UGens.Args
-- | "Implements the (optimized) formula:
--
-- compensationFactor = (root / freq) ** exp
--
-- Higher frequencies are normally perceived as louder, which AmpComp compensates."
--
-- "Note that for frequencies very much smaller than root the amplitudes can become very high. In this case limit the freq with freq.max(minval), or use AmpCompA."
--
-- Computed at "AR", "KR", or "IR"
ampComp :: (Args '["freq", "root"] '["exponent"] a) => a -> SDBody a Signal
ampComp = makeUGen
"AmpComp" AR
(Vs::Vs '["freq", "root", "exponent"])
(exponent_ (0.3333::Float))
-- | "Higher frequencies are normally perceived as louder, which AmpCompA compensates. Following the measurings by Fletcher and Munson, the ANSI standard describes a function for loudness vs. frequency.
-- Note that this curve is only valid for standardized amplitude."
--
-- _NOTE_ "Apart from freq, the values are not modulatable"
--- ampCompA ::
--- ampCompA =
amplitude :: Args '["in"] '["attackSecs", "releaseSecs"] a => a -> SDBody a Signal
amplitude = makeUGen
"Amplitude" AR
(Vs::Vs '["in", "attackSecs", "releaseSecs"])
(attackSecs_ (0.01::Float), releaseSecs_ (0.01::Float))
--- detectSilence ::
--- detectSilence =
--- loudness ::
--- loudness =
--- peak ::
--- peak =
--- peakFollower ::
--- peakFollower =
--- sendPeakRMS ::
--- sendPeakRMS =
--- keyTrack ::
--- keyTrack =
-- | "This is a better pitch follower than ZeroCrossing, but more costly of CPU. For most purposes the default settings can be used and only in needs to be supplied."
--
-- "[This function] returns two values [...], a freq which is the pitch estimate and hasFreq, which tells whether a pitch was found."
--
-- Note -- as this returns a 2-tuple of 'Signal's -- that you may need to be careful not
-- to accidentally use functions from the Foldable instance for (,) with the return
-- value of 'pitch'.
--
-- "Some vowels are still problematic, for instance a wide open mouth sound somewhere between a low pitched short 'a' sound as in 'sat', and long 'i' sound as in 'fire', contains enough overtone energy to confuse the algorithm."
--
-- "None of these settings are time variable."
--
-- Can only run at "KR"
pitch :: (Args '["in"] '["initFreq", "minFreq", "maxFreq", "execFreq", "maxBinsPerOctave", "median", "ampThreshold", "peakThreshold", "downSample", "clar"] a) => a -> SDBody a (Signal, Signal)
pitch = ((\[a,b]->(a,b)) <$>) . makePolyUGen 2
"Pitch" KR
(Vs::Vs '["in", "initFreq", "minFreq", "maxFreq", "execFreq", "maxBinsPerOctave", "median", "ampThreshold", "peakThreshold", "downSample", "clar"])
(initFreq_ (440::Float), minFreq_ (60 ::Float), maxFreq_ (4000 ::Float), execFreq_ (100::Float), maxBinsPerOctave_ (16::Float), median_ (1::Float), ampThreshold_ (0.01::Float), peakThreshold_ (0.5::Float), downSample_ (1::Float), clar_ (0::Float))
--- zeroCrossing ::
--- zeroCrossing =
--- beatTrack ::
--- beatTrack =
--- beatTrack2 ::
--- beatTrack2 =
--- mfcc ::
--- mfcc =
--- onsets ::
--- onsets =