History

Add Gain and BW fixes for electrobass

Davis Polito committed 4 years ago

Commit a45c0281 parent 19e38693 files · +454 −0Browse files

Unified · Split

3 files
  1. leaf/Inc/leaf-filters.h +1 −0
  2. leaf/Inc/leaf-midi copy.h +443 −0
  3. leaf/Src/leaf-filters.c +10 −0
leaf/Inc/leaf-filters.h+1−0
@@ -1070,6 +1070,7 @@ extern "C" { · 1069 unmodified lines
10701070 void tVZFilter_setResonance (tVZFilter* const vf, float res);
10711071 void tVZFilter_setFrequencyAndResonance (tVZFilter* const vf, float freq, float res);
10721072 void tVZFilter_setFrequencyAndResonanceAndGain (tVZFilter* const vf, float freq, float res, float gains);
1073+ void tVZFilter_setFrequencyAndBandwidthAndGain (tVZFilter* const vf, float freq, float BW, float gain);
10731074 void tVZFilter_setFrequencyAndResonanceAndMorph (tVZFilter* const vf, float freq, float res, float morph);
10741075 void tVZFilter_setMorphOnly (tVZFilter* const vf, float morph);
10751076 void tVZFilter_setMorph (tVZFilter* const vf, float morph);
leaf/Inc/leaf-midi copy.h+443−0
@@ -0,0 +1,443 @@
1+/*==============================================================================
2+
3+ leaf-midi.h
4+ Created: 30 Nov 2018 11:29:26am
5+ Author: airship
6+
7+ ==============================================================================*/
8+
9+#ifndef LEAF_MIDI_H_INCLUDED
10+#define LEAF_MIDI_H_INCLUDED
11+
12+#ifdef __cplusplus
13+extern "C" {
14+#endif
15+
16+ //==============================================================================
17+
18+#include "leaf-global.h"
19+#include "leaf-mempool.h"
20+#include "leaf-math.h"
21+#include "leaf-envelopes.h"
22+
23+ /*!
24+ * @internal
25+ * Header.
26+ * @include basic-oscillators.h
27+ * @example basic-oscillators.c
28+ * An example.
29+ */
30+
31+ //==============================================================================
32+
33+ // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
34+
35+ /*!
36+ @defgroup tstack tStack
37+ @ingroup midi
38+ @brief A basic stack of integers with a fixed capacity of 128, used by tPoly to keep track of MIDI notes.
39+ @{
40+
41+ @fn void tStack_init (tStack* const stack, LEAF* const leaf)
42+ @brief Initialize a tStack to the default mempool of a LEAF instance.
43+ @param stack A pointer to the tStack to initialize.
44+ @param leaf A pointer to the leaf instance.
45+
46+ @fn void tStack_initToPool (tStack* const stack, tMempool* const mempool)
47+ @brief Initialize a tStack to a specified mempool.
48+ @param stack A pointer to the tStack to initialize.
49+ @param mempool A pointer to the tMempool to use.
50+
51+ @fn void tStack_free (tStack* const stack)
52+ @brief Free a tStack from its mempool.
53+ @param stack A pointer to the tStack to free.
54+
55+ @fn void tStack_setCapacity (tStack* const stack, uint16_t cap)
56+ @brief Set the capacity of the stack.
57+ @param stack A pointer to the relevant tStack.
58+ @param cap The new capacity.
59+
60+ @fn int tStack_addIfNotAlreadyThere (tStack* const stack, uint16_t item)
61+ @brief Add a value to the stack only if that value is not already in the stack.
62+ @param stack A pointer to the relevant tStack.
63+ @param item The value to be added.
64+
65+ @fn void tStack_add (tStack* const stack, uint16_t item)
66+ @brief Add a value to the stack.
67+ @param stack A pointer to the relevant tStack.
68+ @param item The value to be added.
69+
70+ @fn int tStack_remove (tStack* const stack, uint16_t item)
71+ @brief Remove a single instance of a value from the stack.
72+ @param stack A pointer to the relevant tStack.
73+ @param item The value to be removed.
74+
75+ @fn void tStack_clear (tStack* const stack)
76+ @brief Clear the stack.
77+ @param stack A pointer to the relevant tStack.
78+
79+ @fn int tStack_first (tStack* const stack)
80+ @brief Get the first value in the stack.
81+ @param stack A pointer to the relevant tStack.
82+ @return The first value in the stack.
83+
84+ @fn int tStack_getSize (tStack* const stack)
85+ @brief Get the current size of the stack.
86+ @param stack A pointer to the relevant tStack.
87+ @return The current size of the stack.
88+
89+ @fn int tStack_contains (tStack* const stack, uint16_t item)
90+ @brief Check if the stack contains a value, and if it does, get the index of that value.
91+ @param stack A pointer to the relevant tStack.
92+ @param item The value to check against the stack.
93+ @return The index of the value or -1 if the stack does not contain the value.
94+
95+ @fn int tStack_next (tStack* const stack)
96+ @brief Get the next value in the stack, starting from the earliest added values.
97+ @param stack A pointer to the relevant tStack.
98+ @return The next value in the stack or -1 if there are no values in the stack.
99+
100+ @fn int tStack_get (tStack* const stack, int index)
101+ @brief Get the value at a given index of the stack.
102+ @param stack A pointer to the relevant tStack.
103+ @param index The index of the stack from which to get a value.
104+ @return The value at the given index.
105+
106+ @} */
107+
108+#define STACK_SIZE 128
109+ typedef struct _tStack
110+ {
111+
112+ tMempool mempool;
113+ int data[STACK_SIZE];
114+ uint16_t pos;
115+ uint16_t size;
116+ uint16_t capacity;
117+ int ordered;
118+ } _tStack;
119+
120+ typedef _tStack* tStack;
121+
122+ void tStack_init (tStack* const stack, LEAF* const leaf);
123+ void tStack_initToPool (tStack* const stack, tMempool* const pool);
124+ void tStack_free (tStack* const stack);
125+
126+ void tStack_setCapacity (tStack* const stack, uint16_t cap);
127+ int tStack_addIfNotAlreadyThere (tStack* const stack, uint16_t item);
128+ void tStack_add (tStack* const stack, uint16_t item);
129+ int tStack_remove (tStack* const stack, uint16_t item);
130+ void tStack_clear (tStack* const stack);
131+ int tStack_first (tStack* const stack);
132+ int tStack_getSize (tStack* const stack);
133+ int tStack_contains (tStack* const stack, uint16_t item);
134+ int tStack_next (tStack* const stack);
135+ int tStack_get (tStack* const stack, int index);
136+
137+ /*! @}
138+ @defgroup tpoly tPoly
139+ @ingroup midi
140+ @brief Polyphony handler with glide and pitch bend options.
141+ @{
142+
143+ @fn void tPoly_init (tPoly* const poly, int maxNumVoices, LEAF* const leaf)
144+ @brief Initialize a tPoly to the default mempool of a LEAF instance.
145+ @param poly A pointer to the tPoly to initialize.
146+ @param maxNumVoices The maximum number of voices this tPoly can handle at once.
147+ @param leaf A pointer to the leaf instance.
148+
149+ @fn void tPoly_initToPool (tPoly* const poly, int maxNumVoices, tMempool* const pool)
150+ @brief Initialize a tPoly to a specified mempool.
151+ @param poly A pointer to the tPoly to initialize.
152+ @param mempool A pointer to the tMempool to use.
153+
154+ @fn void tPoly_free (tPoly* const poly)
155+ @brief Free a tPoly from its mempool.
156+ @param poly A pointer to the tPoly to free.
157+
158+ @fn int tPoly_noteOn (tPoly* const poly, int note, uint8_t vel)
159+ @brief Add a note with a given velocity to the poly handler.
160+ @param poly A pointer to the relevant tPoly.
161+ @param note The MIDI note number to add.
162+ @param vel The MIDI velocity of the note to add.
163+ @return The voice that will play the note.
164+
165+ @fn int tPoly_noteOff (tPoly* const poly, uint8_t note)
166+ @brief Remove a note from the poly handler.
167+ @param poly A pointer to the relevant tPoly.
168+ @param note The MIDI note number to remove.
169+ @return The voice that was playing the removed note.
170+
171+ @fn void tPoly_orderedAddToStack (tPoly* const poly, uint8_t note)
172+ @brief
173+ @param
174+
175+ @fn void tPoly_setNumVoices (tPoly* const poly, uint8_t numVoices)
176+ @brief Set the number of voices available to play notes.
177+ @param poly A pointer to the relevant tPoly.
178+ @param numVoices The new number of available voices. Cannot be greater than the max number voices given in tPoly_init().
179+
180+ @fn void tPoly_setPitchGlideActive (tPoly* const poly, int isActive)
181+ @brief Set whether pitch glide over note changes in voices is active.
182+ @param poly A pointer to the relevant tPoly.
183+ @param isActive Whether pitch glide should be active or not.
184+
185+ @fn void tPoly_setPitchGlideTime (tPoly* const poly, float t)
186+ @brief Set how long pitch glide over note changes in voices takes.
187+ @param poly A pointer to the relevant tPoly.
188+ @param t The time to glide in milliseconds.
189+
190+ @fn void tPoly_setPitchBend (tPoly* const poly, float pitchBend)
191+ @brief Set the amount of pitch bend
192+ @param poly A pointer to the relevant tPoly.
193+ @param pitchBend The new amount of pitch bend.
194+
195+ @fn void tPoly_setBendGlideTime (tPoly* const poly, float t)
196+ @brief
197+ @param
198+
199+ @fn void tPoly_setBendSamplesPerTick (tPoly* const poly, float t)
200+ @brief
201+ @param
202+
203+ @fn void tPoly_tickPitch (tPoly* const poly)
204+ @brief Execute all tick-rate changes in the poly handler's pitch, including glide and bend.
205+ @param poly A pointer to the relevant tPoly.
206+
207+ @fn void tPoly_tickPitchGlide (tPoly* const poly)
208+ @brief Execute the tick-rate change of the poly handler's pitch glide.
209+ @param poly A pointer to the relevant tPoly.
210+
211+ @fn void tPoly_tickPitchBend (tPoly* const poly)
212+ @brief Execute the tick-rate change of the poly handler's pitch bend.
213+ @param poly A pointer to the relevant tPoly.
214+
215+ @fn int tPoly_getNumVoices (tPoly* const poly)
216+ @brief Get the current number of voices available to play notes.
217+ @param poly A pointer to the relevant tPoly.
218+ @return The current number of voices available to play notes.
219+
220+ @fn int tPoly_getNumActiveVoices (tPoly* const poly)
221+ @brief Get the number of voices currently playing notes.
222+ @param poly A pointer to the relevant tPoly.
223+ @return The number of voices currently playing notes.
224+
225+ @fn float tPoly_getPitch (tPoly* const poly, uint8_t voice)
226+ @brief Get the current pitch of a given voice.
227+ @param poly A pointer to the relevant tPoly.
228+ @param voice The voice to get the pitch of.
229+ @return The current pitch of the given voice as a fractional MIDI note number.
230+
231+ @fn int tPoly_getKey (tPoly* const poly, uint8_t voice)
232+ @brief Get the current MIDI note number of a given voice.
233+ @param poly A pointer to the relevant tPoly.
234+ @param voice The voice to get the MIDI note number of.
235+ @return The MIDI note number of the given voice.
236+
237+ @fn int tPoly_getVelocity (tPoly* const poly, uint8_t voice)
238+ @brief Get the current MIDI velocity of a given voice.
239+ @param poly A pointer to the relevant tPoly.
240+ @param voice The voice to get the MIDI velocity of.
241+ @return The current MIDI velocity of the given voice.
242+
243+ @fn int tPoly_isOn (tPoly* const poly, uint8_t voice)
244+ @brief Get the current play state of a given voice.
245+ @param poly A pointer to the relevant tPoly.
246+ @param voice The voice to get the state of.
247+ @return The current play state of the given voice.
248+
249+ @} */
250+
251+ typedef struct _tPoly
252+ {
253+
254+ tMempool mempool;
255+
256+ tStack stack;
257+ tStack orderStack;
258+
259+ tRamp* ramps;
260+ float* rampVals;
261+ int* firstReceived;
262+ float glideTime;
263+ int pitchGlideIsActive;
264+
265+ int numVoices;
266+ int maxNumVoices;
267+
268+ //int voices[POLY_NUM_MAX_VOICES][2];
269+ int** voices;
270+
271+ int notes[128][2];
272+
273+ int CCs[128];
274+
275+ uint8_t CCsRaw[128];
276+
277+ int lastVoiceToChange;
278+
279+ float pitchBend;
280+ tRamp pitchBendRamp;
281+
282+ int currentNote;
283+ int currentVoice;
284+ int currentVelocity;
285+ int maxLength;
286+ } _tPoly;
287+
288+ typedef _tPoly* tPoly;
289+
290+ void tPoly_init (tPoly* const poly, int maxNumVoices, LEAF* const leaf);
291+ void tPoly_initToPool (tPoly* const poly, int maxNumVoices, tMempool* const pool);
292+ void tPoly_free (tPoly* const poly);
293+
294+ int tPoly_noteOn (tPoly* const poly, int note, uint8_t vel);
295+ int tPoly_noteOff (tPoly* const poly, uint8_t note);
296+ void tPoly_orderedAddToStack (tPoly* const poly, uint8_t note);
297+ void tPoly_setNumVoices (tPoly* const poly, uint8_t numVoices);
298+ void tPoly_setPitchGlideActive (tPoly* const poly, int isActive);
299+ void tPoly_setPitchGlideTime (tPoly* const poly, float t);
300+ void tPoly_setPitchBend (tPoly* const poly, float pitchBend);
301+ void tPoly_setBendGlideTime (tPoly* const poly, float t);
302+ void tPoly_setBendSamplesPerTick (tPoly* const poly, float t);
303+ void tPoly_tickPitch (tPoly* const poly);
304+ void tPoly_tickPitchGlide (tPoly* const poly);
305+ void tPoly_tickPitchBend (tPoly* const poly);
306+ int tPoly_getNumVoices (tPoly* const poly);
307+ int tPoly_getNumActiveVoices (tPoly* const poly);
308+ float tPoly_getPitch (tPoly* const poly, uint8_t voice);
309+ int tPoly_getKey (tPoly* const poly, uint8_t voice);
310+ int tPoly_getVelocity (tPoly* const poly, uint8_t voice);
311+ int tPoly_isOn (tPoly* const poly, uint8_t voice);
312+ void tPoly_setSampleRate (tPoly* const poly, float sr);
313+
314+ //==============================================================================
315+
316+ /*! @}
317+ @defgroup tsimplepoly tSimplePoly
318+ @ingroup midi
319+ @brief Polyphony handler.
320+ @{
321+
322+ @fn void tSimplePoly_init (tSimplePoly* const poly, int maxNumVoices, LEAF* const leaf)
323+ @brief Initialize a tSimplePoly to the default mempool of a LEAF instance.
324+ @param poly A pointer to the tSimplePoly to initialize.
325+ @param maxNumVoices The maximum number of voices this tSimplePoly can handle at once.
326+ @param leaf A pointer to the leaf instance.
327+
328+ @fn void tSimplePoly_initToPool (tSimplePoly* const poly, int maxNumVoices, tMempool* const pool)
329+ @brief Initialize a tSimplePoly to a specified mempool.
330+ @param poly A pointer to the tSimplePoly to initialize.
331+ @param mempool A pointer to the tMempool to use.
332+
333+ @fn void tSimplePoly_free (tSimplePoly* const poly)
334+ @brief Free a tSimplePoly from its mempool.
335+ @param poly A pointer to the tSimplePoly to free.
336+
337+ @fn int tSimplePoly_noteOn (tSimplePoly* const poly, int note, uint8_t vel)
338+ @brief Add a note with a given velocity to the poly handler.
339+ @param poly A pointer to the relevant tSimplePoly.
340+ @param note The MIDI note number to add.
341+ @param vel The MIDI velocity of the note to add.
342+ @return The voice that will play the note.
343+
344+ @fn int tSimplePoly_noteOff (tSimplePoly* const poly, uint8_t note)
345+ @brief Remove a note from the poly handler.
346+ @param poly A pointer to the relevant tSimplePoly.
347+ @param note The MIDI note number to remove.
348+ @return The voice that was playing the removed note.
349+
350+ @fn void tSimplePoly_deactivateVoice(tSimplePoly* const polyh, uint8_t voice)
351+ @brief
352+ @param
353+
354+ @fn int tSimplePoly_markPendingNoteOff(tSimplePoly* const polyh, uint8_t note)
355+ @brief
356+ @param
357+
358+ @fn int tSimplePoly_findVoiceAssignedToNote(tSimplePoly* const polyh, uint8_t note)
359+ @brief Find if there is a voice with that note -- useful for note offs where you want to wait to remove it from the poly until the release phase of the envelope is finished
360+ @param
361+
362+ @fn void tSimplePoly_setNumVoices (tSimplePoly* const poly, uint8_t numVoices)
363+ @brief Set the number of voices available to play notes.
364+ @param poly A pointer to the relevant tSimplePoly.
365+ @param numVoices The new number of available voices. Cannot be greater than the max number voices given on initialization.
366+
367+ @fn int tSimplePoly_getNumVoices (tSimplePoly* const poly)
368+ @brief Get the current number of voices available to play notes.
369+ @param poly A pointer to the relevant tSimplePoly.
370+ @return The current number of voices available to play notes.
371+
372+ @fn int tSimplePoly_getNumActiveVoices (tSimplePoly* const poly)
373+ @brief Get the number of voices currently playing notes.
374+ @param poly A pointer to the relevant tSimplePoly.
375+ @return The number of voices currently playing notes.
376+
377+ @fn int tSimplePoly_getPitch (tSimplePoly* const poly, uint8_t voice)
378+ @brief Get the current MIDI note number of a given voice.
379+ @param poly A pointer to the relevant tSimplePoly.
380+ @param voice The voice to get the MIDI note number of.
381+ @return The MIDI note number of the given voice.
382+
383+ @fn int tSimplePoly_getPitchAndCheckActive(tSimplePoly* const polyh, uint8_t voice)
384+ @brief Returns negative one if the voice is inactive
385+
386+ @fn int tSimplePoly_getVelocity (tSimplePoly* const poly, uint8_t voice)
387+ @brief Get the current MIDI velocity of a given voice.
388+ @param poly A pointer to the relevant tSimplePoly.
389+ @param voice The voice to get the MIDI velocity of.
390+ @return The current MIDI velocity of the given voice.
391+
392+ @fn int tSimplePoly_isOn (tSimplePoly* const poly, uint8_t voice)
393+ @brief Get the current play state of a given voice.
394+ @param poly A pointer to the relevant tSimplePoly.
395+ @param voice The voice to get the state of.
396+ @return The current play state of the given voice.
397+
398+ @} */
399+ typedef struct _tSimplePoly
400+ {
401+ tMempool mempool;
402+
403+ tStack stack;
404+
405+ int numVoices;
406+ int maxNumVoices;
407+ int** voices;
408+ int stealing_on;
409+ int recover_stolen;
410+
411+ int notes[128][2];
412+ } _tSimplePoly;
413+
414+ typedef _tSimplePoly* tSimplePoly;
415+
416+ void tSimplePoly_init (tSimplePoly* const poly, int maxNumVoices, LEAF* const leaf);
417+ void tSimplePoly_initToPool (tSimplePoly* const poly, int maxNumVoices, tMempool* const pool);
418+ void tSimplePoly_free (tSimplePoly* const poly);
419+
420+ int tSimplePoly_noteOn (tSimplePoly* const poly, int note, uint8_t vel);
421+ int tSimplePoly_noteOff (tSimplePoly* const poly, uint8_t note);
422+ void tSimplePoly_deactivateVoice (tSimplePoly* const polyh, uint8_t voice);
423+ int tSimplePoly_markPendingNoteOff (tSimplePoly* const polyh, uint8_t note);
424+ int tSimplePoly_findVoiceAssignedToNote (tSimplePoly* const polyh, uint8_t note);
425+ void tSimplePoly_setNumVoices (tSimplePoly* const poly, uint8_t numVoices);
426+ int tSimplePoly_getNumVoices (tSimplePoly* const poly);
427+ int tSimplePoly_getNumActiveVoices (tSimplePoly* const poly);
428+ int tSimplePoly_getPitch (tSimplePoly* const poly, uint8_t voice);
429+ int tSimplePoly_getPitchAndCheckActive(tSimplePoly* const polyh, uint8_t voice);
430+ int tSimplePoly_getVelocity (tSimplePoly* const poly, uint8_t voice);
431+ int tSimplePoly_isOn (tSimplePoly* const poly, uint8_t voice);
432+
433+ //==============================================================================
434+
435+#ifdef __cplusplus
436+}
437+#endif
438+
439+#endif // LEAF_MIDI_H_INCLUDED
440+
441+//==============================================================================
442+
443+
leaf/Src/leaf-filters.c+10−0
@@ -1560,6 +1560,16 @@ void tVZFilter_setFrequencyAndResonanceAndGain (tVZFilter* const vf, float freq, · 1559 unmodified lines
15601560 f->invG = 1.0f/f->G;
15611561 tVZFilter_calcCoeffs(vf);
15621562 }
1563+void tVZFilter_setFrequencyAndBandwidthAndGain (tVZFilter* const vf, float freq, float BW, float gain)
1564+{
1565+ _tVZFilter* f = *vf;
1566+ f->fc = LEAF_clip(0.1f, freq, 0.4f * f->sampleRate);
1567+ //f->Q = LEAF_clip(0.01f, res, 100.0f);
1568+ f->B = LEAF_clip(0.01, BW, 100.f);
1569+ f->G = LEAF_clip(0.000001f, gain, 4000.0f);
1570+ f->invG = 1.0f/f->G;
1571+ tVZFilter_calcCoeffs(vf);
1572+}
15631573
15641574 void tVZFilter_setFrequencyAndResonanceAndMorph (tVZFilter* const vf, float freq, float res, float morph)
15651575 {

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