LMMS
Loading...
Searching...
No Matches
juce_BallisticsFilter.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28namespace dsp
29{
30
31//==============================================================================
32template <typename SampleType>
38
39template <typename SampleType>
40void BallisticsFilter<SampleType>::setAttackTime (SampleType attackTimeMs)
41{
42 attackTime = attackTimeMs;
43 cteAT = calculateLimitedCte (static_cast<SampleType> (attackTime));
44}
45
46template <typename SampleType>
47void BallisticsFilter<SampleType>::setReleaseTime (SampleType releaseTimeMs)
48{
49 releaseTime = releaseTimeMs;
50 cteRL = calculateLimitedCte (static_cast<SampleType> (releaseTime));
51}
52
53template <typename SampleType>
59
60template <typename SampleType>
62{
63 jassert (spec.sampleRate > 0);
64 jassert (spec.numChannels > 0);
65
68
71
72 yold.resize (spec.numChannels);
73
74 reset();
75}
76
77template <typename SampleType>
82
83template <typename SampleType>
84void BallisticsFilter<SampleType>::reset (SampleType initialValue)
85{
86 for (auto& old : yold)
87 old = initialValue;
88}
89
90template <typename SampleType>
91SampleType BallisticsFilter<SampleType>::processSample (int channel, SampleType inputValue)
92{
93 jassert (isPositiveAndBelow (channel, yold.size()));
94
95 if (levelType == LevelCalculationType::RMS)
96 inputValue *= inputValue;
97 else
98 inputValue = std::abs (inputValue);
99
100 SampleType cte = (inputValue > yold[(size_t) channel] ? cteAT : cteRL);
101
102 SampleType result = inputValue + cte * (yold[(size_t) channel] - inputValue);
103 yold[(size_t) channel] = result;
104
105 if (levelType == LevelCalculationType::RMS)
106 return std::sqrt (result);
107
108 return result;
109}
110
111template <typename SampleType>
113{
114 for (auto& old : yold)
115 util::snapToZero (old);
116}
117
118template <typename SampleType>
119SampleType BallisticsFilter<SampleType>::calculateLimitedCte (SampleType timeMs) const noexcept
120{
121 return timeMs < static_cast<SampleType> (1.0e-3) ? 0
122 : static_cast<SampleType> (std::exp (expFactor / timeMs));
123}
124
125//==============================================================================
126template class BallisticsFilter<float>;
127template class BallisticsFilter<double>;
128
129} // namespace dsp
130} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_BallisticsFilter.h:46
std::vector< SampleType > yold
Definition juce_BallisticsFilter.h:143
SampleType processSample(int channel, SampleType inputValue)
Definition juce_BallisticsFilter.cpp:91
void reset()
Definition juce_BallisticsFilter.cpp:78
SampleType cteRL
Definition juce_BallisticsFilter.h:145
double expFactor
Definition juce_BallisticsFilter.h:144
BallisticsFilter()
Definition juce_BallisticsFilter.cpp:33
void setAttackTime(SampleType attackTimeMs)
Definition juce_BallisticsFilter.cpp:40
SampleType calculateLimitedCte(SampleType) const noexcept
Definition juce_BallisticsFilter.cpp:119
void prepare(const ProcessSpec &spec)
Definition juce_BallisticsFilter.cpp:61
SampleType cteAT
Definition juce_BallisticsFilter.h:145
BallisticsFilterLevelCalculationType LevelCalculationType
Definition juce_BallisticsFilter.h:49
SampleType releaseTime
Definition juce_BallisticsFilter.h:145
double sampleRate
Definition juce_BallisticsFilter.h:144
void setReleaseTime(SampleType releaseTimeMs)
Definition juce_BallisticsFilter.cpp:47
SampleType attackTime
Definition juce_BallisticsFilter.h:145
void snapToZero() noexcept
Definition juce_BallisticsFilter.cpp:112
LevelCalculationType levelType
Definition juce_BallisticsFilter.h:146
void setLevelCalculationType(LevelCalculationType newCalculationType)
Definition juce_BallisticsFilter.cpp:54
#define jassert(expression)
void snapToZero(SIMDRegister< Type > &) noexcept
Definition juce_SIMDRegister_Impl.h:167
Definition juce_AudioBlock.h:29
Definition carla_juce.cpp:31
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
static constexpr FloatType pi
Definition juce_MathsFunctions.h:382
Definition juce_ProcessContext.h:38
uint32 numChannels
Definition juce_ProcessContext.h:46
double sampleRate
Definition juce_ProcessContext.h:40
int result
Definition process.c:1455