Plaquette
 
Loading...
Searching...
No Matches
AbstractOscillator.h
1/*
2 * AbstractOscillator.h
3 *
4 * (c) 2025 Sofian Audry :: info(@)sofianaudry(.)com
5 * (c) 2025 Thomas O Fredericks :: tof(@)t-o-f(.)info
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21#ifndef ABSTRACT_OSCILLATOR_H_
22#define ABSTRACT_OSCILLATOR_H_
23
24#include "PqCore.h"
25#include "Timeable.h"
26#include "pq_phase_utils.h"
27
28namespace pq {
29
34public:
36
42
43 virtual ~AbstractOscillator() {}
44
46 virtual void start();
47
52 virtual void period(float period);
53
55 virtual float period() const { return _period; }
56
59
64 virtual void frequency(float frequency);
65
67 virtual float frequency() const {
68#if PQ_OPTIMIZE_FOR_CPU
69 return _frequency;
70#else
71 return periodToFrequency(_period);
72#endif
73 }
74
77
82 virtual void bpm(float bpm);
83
85 virtual float bpm() const { return frequency() * HZ_TO_BPM; }
86
89
94 virtual void phase(float phase);
95
97 virtual float phase() const { return pq::fixed32ToFloat(_phase32); }
98
101
108 virtual void phaseShift(float phaseShift);
109
114 virtual float phaseShift() const;
115
118
120 virtual void jitter(float jitter);
121
123 virtual float jitter() const;
124
126 virtual void noJitter() { jitter(0); }
127
130
137 virtual float jitteredPeriod() const;
138
145 virtual float jitteredFrequency() const;
146
152 virtual float timeToPhase(float time) const;
153
158 virtual void setTime(float time);
159
164 virtual void addTime(float time);
165
167 virtual bool isRunning() const { return _isRunning; }
168
170 virtual bool isForward() const { return _isForward; }
171
176 virtual void setForward(bool isForward) { _isForward = isForward; }
177
179 virtual void forward() { _isForward = true; }
180
182 virtual void reverse() { _isForward = false; }
183
185 virtual void toggleReverse() { _isForward = !_isForward; }
186
187protected:
188 // Returns true iff jittering is enabled.
189 bool _hasJitter() const { return bool(_jitter); }
190
191 // Perform step with under
192 void _stepPhase(float deltaTimeSecondsTimesFixed32Max);
193
194 // Sets phase time.
195 virtual void _setPhase32(q0_32u_t phase32);
196
197 // Sets running state.
198 virtual void _setRunning(bool isRunning);
199
200 // Picks next random frequency multiplier (for randomized oscillation).
201 void _randomPickNext();
202
203 // Period (seconds).
204 float _period;
205
206#if PQ_OPTIMIZE_FOR_CPU
207 // Frequency (Hz).
208 float _frequency;
209#endif
210
211 // Non-random mode: Phase shift (in % of period).
212 // Random mode: random frequency ratio (in % of frequency).
213 float _phaseShiftOrRandomFrequencyRatio;
214
215 // Internal use: holds current phase time.
216 q0_32u_t _phase32;
217
218 // Internal use : overflow indicator
219 bool _overflowed : 1;
220
221 // Is the wave currently running?
222 bool _isRunning : 1;
223
224 // The direction of oscillation.
225 bool _isForward : 1;
226
227 // Flag that makes sure the value is updated only on a need basis.
228 bool _valueNeedsUpdate : 1;
229
230 // AbstractWave subclass usage. Used to keep track of state.
231 bool _preSkew : 1;
232 bool _passedSkew : 1;
233
234 // Extra data.
235 uint8_t _data : 2;
236
237 // Jittering level.
238 float _jitter;
239};
240
241}
242
243#endif
Triangle/sawtooth oscillator.
Definition AbstractOscillator.h:33
virtual float jitter() const
Returns the randomness level in [0, 1].
Definition AbstractOscillator.cpp:71
Parameter Jitter()
Returns the jitter as a parameter.
Definition AbstractOscillator.h:129
virtual float period() const
Returns the period (in seconds).
Definition AbstractOscillator.h:55
virtual void toggleReverse()
Toggles the direction of oscillation.
Definition AbstractOscillator.h:185
virtual float phaseShift() const
Returns the phase shift (ie.
Definition AbstractOscillator.cpp:158
virtual void setForward(bool isForward)
Sets the direction of oscillation.
Definition AbstractOscillator.h:176
Parameter Phase()
Returns the phase as a parameter.
Definition AbstractOscillator.h:100
Parameter PhaseShift()
Returns the phase shift as a parameter.
Definition AbstractOscillator.h:117
virtual float timeToPhase(float time) const
Utility function to convert time to phase.
Definition AbstractOscillator.cpp:162
virtual float jitteredFrequency() const
Returns the frequency actually used for the current cycle.
Definition AbstractOscillator.cpp:89
Parameter Bpm()
Returns the BPM as a parameter.
Definition AbstractOscillator.h:88
virtual float phase() const
Returns the phase (in % of period).
Definition AbstractOscillator.h:97
virtual bool isForward() const
Returns true iff the wave is moving forward in time.
Definition AbstractOscillator.h:170
Parameter Frequency()
Returns the frequency as a parameter.
Definition AbstractOscillator.h:76
virtual float jitteredPeriod() const
Returns the period actually used for the current cycle.
Definition AbstractOscillator.cpp:93
virtual void forward()
Sets the direction of oscillation to move forward in time.
Definition AbstractOscillator.h:179
virtual void start()
Starts/restarts the oscillator.
Definition AbstractOscillator.cpp:45
virtual float frequency() const
Returns the frequency (in Hz).
Definition AbstractOscillator.h:67
virtual float bpm() const
Returns the frequency (in BPM).
Definition AbstractOscillator.h:85
Parameter Period()
Returns the period as a parameter.
Definition AbstractOscillator.h:58
virtual void reverse()
Sets the direction of oscillation to move backward in time.
Definition AbstractOscillator.h:182
virtual void addTime(float time)
Adds time to current time (in seconds).
Definition AbstractOscillator.cpp:171
virtual bool isRunning() const
Returns true iff the wave is currently running.
Definition AbstractOscillator.h:167
virtual void setTime(float time)
Forces current time (in seconds).
Definition AbstractOscillator.cpp:164
virtual void noJitter()
Disables jittering.
Definition AbstractOscillator.h:126
Definition PqCore.h:343
Abstract class for time-based objects.
Definition Timeable.h:27