-
Notifications
You must be signed in to change notification settings - Fork 14
/
lfo.h
147 lines (117 loc) · 3.85 KB
/
lfo.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// Copyright 2015 Matthias Puech
//
// Author: Matthias Puech ([email protected])
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
// See http://creativecommons.org/licenses/MIT/ for more information.
//
// -----------------------------------------------------------------------------
//
// LFO.
#ifndef BATUMI_MODULATIONS_LFO_H_
#define BATUMI_MODULATIONS_LFO_H_
#include "stmlib/stmlib.h"
#include "resources.h"
namespace batumi {
const int16_t kOctave = 12 * 128;
/* phase increment values for given frequencies */
const uint32_t kPI1Hz = UINT16_MAX / SAMPLE_RATE * 1;
const uint32_t kPI10Hz = UINT16_MAX / SAMPLE_RATE * 10;
const uint32_t kPI100Hz = UINT16_MAX / SAMPLE_RATE * 100;
enum LfoShape {
SHAPE_SINE,
SHAPE_TRAPEZOID,
SHAPE_RAMP,
SHAPE_SAW,
SHAPE_TRIANGLE,
};
const uint8_t kNumLfoShapes = 5;
class Lfo {
public:
Lfo() { }
~Lfo() { }
void Init();
void Step();
inline void set_pitch(int16_t pitch) {
if (pitch == INT16_MIN)
phase_increment_ = 0;
else
phase_increment_ = ComputePhaseIncrement(pitch);
};
inline void set_period(uint32_t period) {
phase_increment_ = UINT32_MAX / period;
}
inline void set_initial_phase(uint16_t phase) {
initial_phase_ = phase << 16;
}
inline void align() {
alignment_phase_ = -phase_;
}
inline void set_divider(uint16_t divider) {
divider_ = divider;
}
inline void set_level(uint16_t level) {
level_ = level;
}
inline uint16_t level() {
return level_;
}
inline void set_direction(bool direction) {
direction_ = direction;
}
inline void set_hold(bool hold) {
hold_ = hold;
}
void Reset(uint8_t subsample);
inline void link_to(Lfo *lfo) {
phase_ = lfo->phase_;
direction_ = lfo->direction_;
alignment_phase_ = lfo->alignment_phase_;
phase_increment_ = lfo->phase_increment_;
}
int16_t ComputeSampleShape(LfoShape s);
int16_t ComputeSampleSine(uint32_t phase);
int16_t ComputeSampleTriangle(uint32_t phase);
int16_t ComputeSampleTrapezoid(uint32_t phase);
int16_t ComputeSampleRamp(uint32_t phase);
int16_t ComputeSampleSaw(uint32_t phase);
private:
inline uint32_t phase() {
return divided_phase_ + initial_phase_ + alignment_phase_ / divider_
+ UINT32_MAX / 1000 * 3;
}
int16_t ComputeSampleShape(LfoShape s, uint32_t phase);
uint32_t ComputePhaseIncrement(int16_t pitch);
uint32_t phase_, divided_phase_;
uint16_t divider_, cycle_counter_;
uint16_t level_;
uint32_t initial_phase_, alignment_phase_;
uint32_t phase_increment_;
uint16_t bl_step_counter_;
uint8_t reset_subsample_;
bool direction_, hold_;
/* values of the oscillators for each shape before and
* after reset */
int16_t step_begin_[kNumLfoShapes];
int16_t step_end_[kNumLfoShapes];
DISALLOW_COPY_AND_ASSIGN(Lfo);
};
} // namespace batumi
#endif // BATUMI_MODULATIONS_LFO_H_