History

remove branching from tri, square, and saw ticks

Matthew Wang committed 6 years ago

Commit bec88f11 parent 293326e3 files · +74 −216Browse files

Unified · Split

3 files
  1. LEAF/Inc/leaf-oscillators.h +11 −8
  2. LEAF/Src/leaf-oscillators.c +51 −203
  3. LEAF_JUCEPlugin/Source/MyTest.cpp +12 −5
LEAF/Inc/leaf-oscillators.h+11−8
@@ -15,6 +15,7 @@ extern "C" { · 14 unmodified lines
1515
1616 #include "leaf-math.h"
1717 #include "leaf-mempool.h"
18+#include "leaf-tables.h"
1819 #include "leaf-filters.h"
1920
2021 /*!
@@ -31,7 +32,6 @@ extern "C" { · 10 unmodified lines
3132 // Underlying phasor
3233 float phase;
3334 float inc,freq;
34−
3535 } _tCycle;
3636
3737 typedef _tCycle* tCycle;
@@ -99,7 +99,8 @@ extern "C" { · 61 unmodified lines
9999 // Underlying phasor
100100 float phase;
101101 float inc,freq;
102−
102+ TableName oct;
103+ float w;
103104 } _tTriangle;
104105
105106 typedef _tTriangle* tTriangle;
@@ -154,7 +155,7 @@ extern "C" { · 48 unmodified lines
154155 @param osc A pointer to the relevant tTriangle.
155156 @param freq The frequency to set the oscillator to.
156157 */
157− int tTriangle_setFreq (tTriangle* const osc, float freq);
158+ void tTriangle_setFreq (tTriangle* const osc, float freq);
158159
159160 /*! @} */
160161
@@ -166,7 +167,8 @@ extern "C" { · 5 unmodified lines
166167 // Underlying phasor
167168 float phase;
168169 float inc,freq;
169−
170+ TableName oct;
171+ float w;
170172 } _tSquare;
171173
172174 typedef _tSquare* tSquare;
@@ -221,7 +223,7 @@ extern "C" { · 48 unmodified lines
221223 @param osc A pointer to the relevant tSquare.
222224 @param freq The frequency to set the oscillator to.
223225 */
224− int tSquare_setFreq (tSquare* const osc, float freq);
226+ void tSquare_setFreq (tSquare* const osc, float freq);
225227
226228 /*! @} */
227229
@@ -233,7 +235,8 @@ extern "C" { · 5 unmodified lines
233235 // Underlying phasor
234236 float phase;
235237 float inc,freq;
236−
238+ TableName oct;
239+ float w;
237240 } _tSawtooth;
238241
239242 typedef _tSawtooth* tSawtooth;
@@ -288,7 +291,7 @@ extern "C" { · 48 unmodified lines
288291 @param osc A pointer to the relevant tSawtooth.
289292 @param freq The frequency to set the oscillator to.
290293 */
291− int tSawtooth_setFreq (tSawtooth* const osc, float freq);
294+ void tSawtooth_setFreq (tSawtooth* const osc, float freq);
292295
293296 /*! @} */
294297
@@ -354,7 +357,7 @@ extern "C" { · 59 unmodified lines
354357 @param osc A pointer to the relevant tPhasor.
355358 @param freq The frequency to set the oscillator to.
356359 */
357− int tPhasor_setFreq (tPhasor* const osc, float freq);
360+ void tPhasor_setFreq (tPhasor* const osc, float freq);
358361
359362 /*! @} */
360363
LEAF/Src/leaf-oscillators.c+51−203
@@ -6,13 +6,11 @@ · 5 unmodified lines
66
77 #if _WIN32 || _WIN64
88
9−#include "..\Inc\leaf-tables.h"
109 #include "..\Inc\leaf-oscillators.h"
1110 #include "..\leaf.h"
1211
1312 #else
1413
15−#include "../Inc/leaf-tables.h"
1614 #include "../Inc/leaf-oscillators.h"
1715 #include "../leaf.h"
1816
@@ -51,7 +49,10 @@ void tCycle_setFreq(tCycle* const cy, float freq) · 32 unmodified lines
5149 {
5250 _tCycle* c = *cy;
5351
54− c->freq = freq;
52+ if (freq < 0.0f) c->freq = 0.0f;
53+ else if (freq > 20480.0f) c->freq = 20480.0f;
54+ else c->freq = freq;
55+
5556 c->inc = freq * leaf.invSampleRate;
5657 }
5758
@@ -109,6 +110,7 @@ void tTriangle_initToPool (tTriangle* const cy, tMempool* const mp) · 51 unmodified lines
109110
110111 c->inc = 0.0f;
111112 c->phase = 0.0f;
113+ tTriangle_setFreq(cy, 220);
112114 }
113115
114116 void tTriangle_freeFromPool (tTriangle* const cy, tMempool* const mp)
@@ -119,16 +121,22 @@ void tTriangle_freeFromPool (tTriangle* const cy, tMempool* const mp) · 4 unmodified lines
119121 mpool_free(c, m);
120122 }
121123
122−int tTriangle_setFreq(tTriangle* const cy, float freq)
124+void tTriangle_setFreq(tTriangle* const cy, float freq)
123125 {
124126 _tTriangle* c = *cy;
125127
126− if (freq < 0.0f) freq = 0.0f;
128+ if (freq < 0.0f) c->freq = 0.0f;
129+ else if (freq > 20480.0f) c->freq = 20480.0f;
130+ else c->freq = freq;
127131
128− c->freq = freq;
129− c->inc = freq * leaf.invSampleRate;
132+ c->inc = c->freq * leaf.invSampleRate;
130133
131− return 0;
134+ c->w = c->freq * INV_20;
135+ for (c->oct = 0; c->w > 2.0f; c->oct++)
136+ {
137+ c->w = 0.5f * c->w;
138+ }
139+ c->w = 2.0f - c->w;
132140 }
133141
134142
@@ -141,70 +149,12 @@ float tTriangle_tick(tTriangle* const cy) · 6 unmodified lines
141149 while (c->phase >= 1.0f) c->phase -= 1.0f;
142150
143151 float out = 0.0f;
144− float w;
145152
146153 int idx = (int)(c->phase * TRI_TABLE_SIZE);
147154
148155 // Wavetable synthesis
149−
150− if (c->freq <= 20.0f)
151− {
152− out = __leaf_table_triangle[T20][idx];
153− }
154− else if (c->freq <= 40.0f)
155− {
156− w = ((40.0f - c->freq) * INV_20);
157− out = (__leaf_table_triangle[T20][idx] * w) + (__leaf_table_triangle[T40][idx] * (1.0f - w));
158− }
159− else if (c->freq <= 80.0f)
160− {
161− w = ((80.0f - c->freq) * INV_40);
162− out = (__leaf_table_triangle[T40][idx] * w) + (__leaf_table_triangle[T80][idx] * (1.0f - w));
163− }
164− else if (c->freq <= 160.0f)
165− {
166− w = ((160.0f - c->freq) * INV_80);
167− out = (__leaf_table_triangle[T80][idx] * w) + (__leaf_table_triangle[T160][idx] * (1.0f - w));
168− }
169− else if (c->freq <= 320.0f)
170− {
171− w = ((320.0f - c->freq) * INV_160);
172− out = (__leaf_table_triangle[T160][idx] * w) + (__leaf_table_triangle[T320][idx] * (1.0f - w));
173− }
174− else if (c->freq <= 640.0f)
175− {
176− w = ((640.0f - c->freq) * INV_320);
177− out = (__leaf_table_triangle[T320][idx] * w) + (__leaf_table_triangle[T640][idx] * (1.0f - w));
178− }
179− else if (c->freq <= 1280.0f)
180− {
181− w = ((1280.0f - c->freq) * INV_640);
182− out = (__leaf_table_triangle[T640][idx] * w) + (__leaf_table_triangle[T1280][idx] * (1.0f - w));
183− }
184− else if (c->freq <= 2560.0f)
185− {
186− w = ((2560.0f - c->freq) * INV_1280);
187− out = (__leaf_table_triangle[T1280][idx] * w) + (__leaf_table_triangle[T2560][idx] * (1.0f - w));
188− }
189− else if (c->freq <= 5120.0f)
190− {
191− w = ((5120.0f - c->freq) * INV_2560);
192− out = (__leaf_table_triangle[T2560][idx] * w) + (__leaf_table_triangle[T5120][idx] * (1.0f - w));
193− }
194− else if (c->freq <= 10240.0f)
195− {
196− w = ((10240.0f - c->freq) * INV_5120);
197− out = (__leaf_table_triangle[T5120][idx] * w) + (__leaf_table_triangle[T10240][idx] * (1.0f - w));
198− }
199− else if (c->freq <= 20480.0f)
200− {
201− w = ((20480.0f - c->freq) * INV_10240);
202− out = (__leaf_table_triangle[T10240][idx] * w) + (__leaf_table_triangle[T20480][idx] * (1.0f - w));
203− }
204− else
205− {
206− out = __leaf_table_triangle[T20480][idx];
207− }
156+ out = __leaf_table_triangle[c->oct+1][idx] +
157+ (__leaf_table_triangle[c->oct][idx] - __leaf_table_triangle[c->oct+1][idx]) * c->w;
208158
209159 return out;
210160 }
@@ -235,6 +185,7 @@ void tSquare_initToPool (tSquare* const cy, tMempool* const mp) · 24 unmodified lines
235185
236186 c->inc = 0.0f;
237187 c->phase = 0.0f;
188+ tSquare_setFreq(cy, 220);
238189 }
239190
240191 void tSquare_freeFromPool(tSquare* const cy, tMempool* const mp)
@@ -245,16 +196,22 @@ void tSquare_freeFromPool(tSquare* const cy, tMempool* const mp) · 4 unmodified lines
245196 mpool_free(c, m);
246197 }
247198
248−int tSquare_setFreq(tSquare* const cy, float freq)
199+void tSquare_setFreq(tSquare* const cy, float freq)
249200 {
250201 _tSquare* c = *cy;
251202
252− if (freq < 0.0f) freq = 0.0f;
203+ if (freq < 0.0f) c->freq = 0.0f;
204+ else if (freq > 20480.0f) c->freq = 20480.0f;
205+ else c->freq = freq;
253206
254− c->freq = freq;
255− c->inc = freq * leaf.invSampleRate;
207+ c->inc = c->freq * leaf.invSampleRate;
256208
257− return 0;
209+ c->w = c->freq * INV_20;
210+ for (c->oct = 0; c->w > 2.0f; c->oct++)
211+ {
212+ c->w = 0.5f * c->w;
213+ }
214+ c->w = 2.0f - c->w;
258215 }
259216
260217 float tSquare_tick(tSquare* const cy)
@@ -266,69 +223,12 @@ float tSquare_tick(tSquare* const cy) · 5 unmodified lines
266223 while (c->phase >= 1.0f) c->phase -= 1.0f;
267224
268225 float out = 0.0f;
269− float w = 0.0f;
226+
270227 int idx = (int)(c->phase * TRI_TABLE_SIZE);
271228
272229 // Wavetable synthesis
273−
274− if (c->freq <= 20.0f)
275− {
276− out = __leaf_table_squarewave[T20][idx];
277− }
278− else if (c->freq <= 40.0f)
279− {
280− w = ((40.0f - c->freq) * INV_20);
281− out = (__leaf_table_squarewave[T20][idx] * w) + (__leaf_table_squarewave[T40][idx] * (1.0f - w));
282− }
283− else if (c->freq <= 80.0f)
284− {
285− w = ((80.0f - c->freq) * INV_40);
286− out = (__leaf_table_squarewave[T40][idx] * w) + (__leaf_table_squarewave[T80][idx] * (1.0f - w));
287− }
288− else if (c->freq <= 160.0f)
289− {
290− w = ((160.0f - c->freq) * INV_80);
291− out = (__leaf_table_squarewave[T80][idx] * w) + (__leaf_table_squarewave[T160][idx] * (1.0f - w));
292− }
293− else if (c->freq <= 320.0f)
294− {
295− w = ((320.0f - c->freq) * INV_160);
296− out = (__leaf_table_squarewave[T160][idx] * w) + (__leaf_table_squarewave[T320][idx] * (1.0f - w));
297− }
298− else if (c->freq <= 640.0f)
299− {
300− w = ((640.0f - c->freq) * INV_320);
301− out = (__leaf_table_squarewave[T320][idx] * w) + (__leaf_table_squarewave[T640][idx] * (1.0f - w));
302− }
303− else if (c->freq <= 1280.0f)
304− {
305− w = ((1280.0f - c->freq) * INV_640);
306− out = (__leaf_table_squarewave[T640][idx] * w) + (__leaf_table_squarewave[T1280][idx] * (1.0f - w));
307− }
308− else if (c->freq <= 2560.0f)
309− {
310− w = ((2560.0f - c->freq) * INV_1280);
311− out = (__leaf_table_squarewave[T1280][idx] * w) + (__leaf_table_squarewave[T2560][idx] * (1.0f - w));
312− }
313− else if (c->freq <= 5120.0f)
314− {
315− w = ((5120.0f - c->freq) * INV_2560);
316− out = (__leaf_table_squarewave[T2560][idx] * w) + (__leaf_table_squarewave[T5120][idx] * (1.0f - w));
317− }
318− else if (c->freq <= 10240.0f)
319− {
320− w = ((10240.0f - c->freq) * INV_5120);
321− out = (__leaf_table_squarewave[T5120][idx] * w) + (__leaf_table_squarewave[T10240][idx] * (1.0f - w));
322− }
323− else if (c->freq <= 20480.0f)
324− {
325− w = ((20480.0f - c->freq) * INV_10240);
326− out = (__leaf_table_squarewave[T10240][idx] * w) + (__leaf_table_squarewave[T20480][idx] * (1.0f - w));
327− }
328− else
329− {
330− out = __leaf_table_squarewave[T20480][idx];
331− }
230+ out = __leaf_table_squarewave[c->oct+1][idx] +
231+ (__leaf_table_squarewave[c->oct][idx] - __leaf_table_squarewave[c->oct+1][idx]) * c->w;
332232
333233 return out;
334234 }
@@ -359,6 +259,7 @@ void tSawtooth_initToPool (tSawtooth* const cy, tMempool* const mp) · 24 unmodified lines
359259
360260 c->inc = 0.0f;
361261 c->phase = 0.0f;
262+ tSawtooth_setFreq(cy, 220);
362263 }
363264
364265 void tSawtooth_freeFromPool (tSawtooth* const cy, tMempool* const mp)
@@ -369,16 +270,22 @@ void tSawtooth_freeFromPool (tSawtooth* const cy, tMempool* const mp) · 4 unmodified lines
369270 mpool_free(c, m);
370271 }
371272
372−int tSawtooth_setFreq(tSawtooth* const cy, float freq)
273+void tSawtooth_setFreq(tSawtooth* const cy, float freq)
373274 {
374275 _tSawtooth* c = *cy;
375276
376− if (freq < 0.0f) freq = 0.0f;
277+ if (freq < 0.0f) c->freq = 0.0f;
278+ else if (freq > 20480.0f) c->freq = 20480.0f;
279+ else c->freq = freq;
377280
378− c->freq = freq;
379− c->inc = freq * leaf.invSampleRate;
281+ c->inc = c->freq * leaf.invSampleRate;
380282
381− return 0;
283+ c->w = c->freq * INV_20;
284+ for (c->oct = 0; c->w > 2.0f; c->oct++)
285+ {
286+ c->w = 0.5f * c->w;
287+ }
288+ c->w = 2.0f - c->w;
382289 }
383290
384291 float tSawtooth_tick(tSawtooth* const cy)
@@ -390,70 +297,12 @@ float tSawtooth_tick(tSawtooth* const cy) · 5 unmodified lines
390297 while (c->phase >= 1.0f) c->phase -= 1.0f;
391298
392299 float out = 0.0f;
393− float w;
394300
395301 int idx = (int)(c->phase * TRI_TABLE_SIZE);
396302
397303 // Wavetable synthesis
398−
399− if (c->freq <= 20.0f)
400− {
401− out = __leaf_table_sawtooth[T20][idx];
402− }
403− else if (c->freq <= 40.0f)
404− {
405− w = ((40.0f - c->freq) * INV_20);
406− out = (__leaf_table_sawtooth[T20][idx] * w) + (__leaf_table_sawtooth[T40][idx] * (1.0f - w));
407− }
408− else if (c->freq <= 80.0f)
409− {
410− w = ((80.0f - c->freq) * INV_40);
411− out = (__leaf_table_sawtooth[T40][idx] * w) + (__leaf_table_sawtooth[T80][idx] * (1.0f - w));
412− }
413− else if (c->freq <= 160.0f)
414− {
415− w = ((160.0f - c->freq) * INV_80);
416− out = (__leaf_table_sawtooth[T80][idx] * w) + (__leaf_table_sawtooth[T160][idx] * (1.0f - w));
417− }
418− else if (c->freq <= 320.0f)
419− {
420− w = ((320.0f - c->freq) * INV_160);
421− out = (__leaf_table_sawtooth[T160][idx] * w) + (__leaf_table_sawtooth[T320][idx] * (1.0f - w));
422− }
423− else if (c->freq <= 640.0f)
424− {
425− w = ((640.0f - c->freq) * INV_320);
426− out = (__leaf_table_sawtooth[T320][idx] * w) + (__leaf_table_sawtooth[T640][idx] * (1.0f - w));
427− }
428− else if (c->freq <= 1280.0f)
429− {
430− w = ((1280.0f - c->freq) * INV_640);
431− out = (__leaf_table_sawtooth[T640][idx] * w) + (__leaf_table_sawtooth[T1280][idx] * (1.0f - w));
432− }
433− else if (c->freq <= 2560.0f)
434− {
435− w = ((2560.0f - c->freq) * INV_1280);
436− out = (__leaf_table_sawtooth[T1280][idx] * w) + (__leaf_table_sawtooth[T2560][idx] * (1.0f - w));
437− }
438− else if (c->freq <= 5120.0f)
439− {
440− w = ((5120.0f - c->freq) * INV_2560);
441− out = (__leaf_table_sawtooth[T2560][idx] * w) + (__leaf_table_sawtooth[T5120][idx] * (1.0f - w));
442− }
443− else if (c->freq <= 10240.0f)
444− {
445− w = ((10240.0f - c->freq) * INV_5120);
446− out = (__leaf_table_sawtooth[T5120][idx] * w) + (__leaf_table_sawtooth[T10240][idx] * (1.0f - w));
447− }
448− else if (c->freq <= 20480.0f)
449− {
450− w = ((20480.0f - c->freq) * INV_10240);
451− out = (__leaf_table_sawtooth[T10240][idx] * w) + (__leaf_table_sawtooth[T20480][idx] * (1.0f - w));
452− }
453− else
454− {
455− out = __leaf_table_sawtooth[T20480][idx];
456− }
304+ out = __leaf_table_sawtooth[c->oct+1][idx] +
305+ (__leaf_table_sawtooth[c->oct][idx] - __leaf_table_sawtooth[c->oct+1][idx]) * c->w;
457306
458307 return out;
459308 }
@@ -501,16 +350,15 @@ void tPhasor_freeFromPool(tPhasor* const ph, tMempool* const mp) · 41 unmodified lines
501350 mpool_free(p, m);
502351 }
503352
504−int tPhasor_setFreq(tPhasor* const ph, float freq)
353+void tPhasor_setFreq(tPhasor* const ph, float freq)
505354 {
506355 _tPhasor* p = *ph;
507356
508− if (freq < 0.0f) freq = 0.0f;
357+ if (freq < 0.0f) p->freq = 0.0f;
358+ else if (freq > 20480.0f) p->freq = 20480.0f;
359+ else p->freq = freq;
509360
510− p->freq = freq;
511361 p->inc = freq * leaf.invSampleRate;
512−
513− return 0;
514362 }
515363
516364 float tPhasor_tick(tPhasor* const ph)
LEAF_JUCEPlugin/Source/MyTest.cpp+12−5
@@ -27,6 +27,8 @@ tEnvelope env; · 26 unmodified lines
2727
2828 tAutotune at;
2929
30+tTriangle tri;
31+
3032 float gain;
3133 float freq;
3234 float dtime;
@@ -43,9 +45,11 @@ void LEAFTest_init (float sampleRate, int blockSize) · 10 unmodified lines
4345 {
4446 LEAF_init(sampleRate, blockSize, memory, MSIZE, &getRandomFloat);
4547
46− tNoise_init(&noise, WhiteNoise);
48+ tTriangle_init(&tri);
4749
48− tAutotune_init(&at, 1, 1024, 512);
50+// tNoise_init(&noise, WhiteNoise);
51+//
52+// tAutotune_init(&at, 1, 1024, 512);
4953
5054 // tSVF_init(&bp1, SVFTypeBandpass, 100, 4.0f);
5155 // tSVF_init(&bp2, SVFTypeBandpass, 1000, 4.0f);
@@ -75,9 +79,12 @@ float LEAFTest_tick (float input) · 23 unmodified lines
7579
7680 // return tSampler_tick(&samp);
7781
78− tAutotune_setFreq(&at, 440.0f, 0);
82+// tAutotune_setFreq(&at, 440.0f, 0);
83+
84+// return tAutotune_tick(&at, input)[0];
7985
80− return tAutotune_tick(&at, input)[0];
86+ tTriangle_setFreq(&tri, x);
87+ return tTriangle_tick(&tri);
8188 }
8289
8390 int firstFrame = 1;
@@ -93,7 +100,7 @@ void LEAFTest_block (void) · 9 unmodified lines
93100
94101 float val = getSliderValue("mod freq");
95102
96− x = val * 3.5f + 0.5f;
103+ x = val * -40000.0f + 20000;
97104
98105 // a = val * tBuffer_getBufferLength(&buff);
99106

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t