JUCE-7.0.12-0-g4f43011b96 JUCE-7.0.12-0-g4f43011b96
JUCE — C++ application framework with suport for VST, VST3, LV2 audio plug-ins

« « « Anklang Documentation
Loading...
Searching...
No Matches
juce_Panner.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::dsp
27{
28
29//==============================================================================
30template <typename SampleType>
32{
33 update();
34 reset();
35}
36
37//==============================================================================
38template <typename SampleType>
39void Panner<SampleType>::setRule (Rule newRule)
40{
41 currentRule = newRule;
42 update();
43}
44
45template <typename SampleType>
46void Panner<SampleType>::setPan (SampleType newPan)
47{
48 jassert (newPan >= -1.0 && newPan <= 1.0);
49
50 pan = jlimit (static_cast<SampleType> (-1.0), static_cast<SampleType> (1.0), newPan);
51 update();
52}
53
54//==============================================================================
55template <typename SampleType>
57{
58 jassert (spec.sampleRate > 0);
59 jassert (spec.numChannels > 0);
60
61 sampleRate = spec.sampleRate;
62
63 reset();
64}
65
66template <typename SampleType>
68{
69 leftVolume .reset (sampleRate, 0.05);
70 rightVolume.reset (sampleRate, 0.05);
71}
72
73//==============================================================================
74template <typename SampleType>
76{
77 SampleType leftValue, rightValue, boostValue;
78
79 auto normalisedPan = static_cast<SampleType> (0.5) * (pan + static_cast<SampleType> (1.0));
80
81 switch (currentRule)
82 {
83 case Rule::balanced:
84 leftValue = jmin (static_cast<SampleType> (0.5), static_cast<SampleType> (1.0) - normalisedPan);
85 rightValue = jmin (static_cast<SampleType> (0.5), normalisedPan);
86 boostValue = static_cast<SampleType> (2.0);
87 break;
88
89 case Rule::linear:
90 leftValue = static_cast<SampleType> (1.0) - normalisedPan;
91 rightValue = normalisedPan;
92 boostValue = static_cast<SampleType> (2.0);
93 break;
94
95 case Rule::sin3dB:
96 leftValue = static_cast<SampleType> (std::sin (0.5 * MathConstants<double>::pi * (1.0 - normalisedPan)));
97 rightValue = static_cast<SampleType> (std::sin (0.5 * MathConstants<double>::pi * normalisedPan));
98 boostValue = std::sqrt (static_cast<SampleType> (2.0));
99 break;
100
101 case Rule::sin4p5dB:
102 leftValue = static_cast<SampleType> (std::pow (std::sin (0.5 * MathConstants<double>::pi * (1.0 - normalisedPan)), 1.5));
103 rightValue = static_cast<SampleType> (std::pow (std::sin (0.5 * MathConstants<double>::pi * normalisedPan), 1.5));
104 boostValue = static_cast<SampleType> (std::pow (2.0, 3.0 / 4.0));
105 break;
106
107 case Rule::sin6dB:
108 leftValue = static_cast<SampleType> (std::pow (std::sin (0.5 * MathConstants<double>::pi * (1.0 - normalisedPan)), 2.0));
109 rightValue = static_cast<SampleType> (std::pow (std::sin (0.5 * MathConstants<double>::pi * normalisedPan), 2.0));
110 boostValue = static_cast<SampleType> (2.0);
111 break;
112
113 case Rule::squareRoot3dB:
114 leftValue = std::sqrt (static_cast<SampleType> (1.0) - normalisedPan);
115 rightValue = std::sqrt (normalisedPan);
116 boostValue = std::sqrt (static_cast<SampleType> (2.0));
117 break;
118
119 case Rule::squareRoot4p5dB:
120 leftValue = static_cast<SampleType> (std::pow (std::sqrt (1.0 - normalisedPan), 1.5));
121 rightValue = static_cast<SampleType> (std::pow (std::sqrt (normalisedPan), 1.5));
122 boostValue = static_cast<SampleType> (std::pow (2.0, 3.0 / 4.0));
123 break;
124
125 default:
126 leftValue = jmin (static_cast<SampleType> (0.5), static_cast<SampleType> (1.0) - normalisedPan);
127 rightValue = jmin (static_cast<SampleType> (0.5), normalisedPan);
128 boostValue = static_cast<SampleType> (2.0);
129 break;
130 }
131
132 leftVolume .setTargetValue (leftValue * boostValue);
133 rightVolume.setTargetValue (rightValue * boostValue);
134}
135
136//==============================================================================
137template class Panner<float>;
138template class Panner<double>;
139
140} // namespace juce::dsp
A processor to perform panning operations on stereo buffers.
Definition juce_Panner.h:50
void prepare(const ProcessSpec &spec)
Initialises the processor.
void setPan(SampleType newPan)
Sets the current panning value, between -1 (full left) and 1 (full right).
void reset()
Resets the internal state variables of the processor.
void setRule(Rule newRule)
Sets the panning rule.
Panner()
Constructor.
#define jassert(expression)
Platform-independent assertion macro.
constexpr Type jmin(Type a, Type b)
Returns the smaller of two values.
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Constrains a value to keep it within a given range.
T pow(T... args)
T sin(T... args)
T sqrt(T... args)
Commonly used mathematical constants.
This structure is passed into a DSP algorithm's prepare() method, and contains information about vari...
uint32 numChannels
The number of channels that the process() method will be expected to handle.
double sampleRate
The sample rate that will be used for the data that is sent to the processor.