Oscil plays a wavetable, cycling through the table to generate an audio or control signal. More...
#include <Oscil.h>
Oscil plays a wavetable, cycling through the table to generate an audio or control signal.
The frequency of the signal can be set or changed with setFreq(), and the output of an Oscil can be produced with next() for a simple cycling oscillator, or atIndex() for a particular sample in the table.
NUM_TABLE_CELLS | This is defined in the table ".h" file the Oscil will be using. It's important that it's a power of 2, and either a literal number (eg. "8192") or a defined macro, rather than a const or int, for the Oscil to run fast enough. |
UPDATE_RATE | This will be MOZZI_AUDIO_RATE if the Oscil is updated in updateAudio(), or MOZZI_CONTROL_RATE if it's updated each time updateControl() is called. It could also be a fraction of MOZZI_CONTROL_RATE if you are doing some kind of cyclic updating in updateControl(), for example, to spread out the processor load. |
Converting soundfiles for Mozzi There is a python script called char2mozzi.py in the Mozzi/python folder. The usage is: char2mozzi.py infilename outfilename tablename samplerate
Public Member Functions | |
Oscil (const int8_t *TABLE_NAME) | |
Constructor. More... | |
Oscil () | |
Constructor. More... | |
int8_t | next () |
Updates the phase according to the current frequency and returns the sample at the new phase position. More... | |
void | setTable (const int8_t *TABLE_NAME) |
Change the sound table which will be played by the Oscil. More... | |
void | setPhase (unsigned int phase) |
Set the phase of the Oscil. More... | |
void | setPhaseFractional (uint32_t phase) |
Set the phase of the Oscil. More... | |
uint32_t | getPhaseFractional () |
Get the phase of the Oscil in fractional format. More... | |
int8_t | phMod (Q15n16 phmod_proportion) |
Returns the next sample given a phase modulation value. More... | |
template<int8_t NI, int8_t NF, uint8_t RANGE> | |
int8_t | phMod (SFix< NI, NF, RANGE > phmod_proportion) |
Returns the next sample given a phase modulation value. More... | |
int8_t | phMod (SFix< 15, 16 > phmod_proportion) |
Returns the next sample given a phase modulation value. More... | |
void | setFreq (int frequency) |
Set the oscillator frequency with an unsigned int. More... | |
void | setFreq (float frequency) |
Set the oscillator frequency with a float. More... | |
template<int8_t NI, int8_t NF, uint64_t RANGE> | |
void | setFreq (UFix< NI, NF, RANGE > frequency) |
Set the frequency using UFix<NI,NF> fixed-point number format. More... | |
void | setFreq_Q24n8 (Q24n8 frequency) |
Set the frequency using Q24n8 fixed-point number format. More... | |
template<uint64_t RANGE> | |
void | setFreq (UFix< 24, 8, RANGE > frequency) |
Set the frequency using UFix<24,8> fixed-point number format. More... | |
void | setFreq_Q16n16 (Q16n16 frequency) |
Set the frequency using Q16n16 fixed-point number format. More... | |
template<uint64_t RANGE> | |
void | setFreq (UFix< 16, 16, RANGE > frequency) |
Set the frequency using UFix<16,16> fixed-point number format. More... | |
template<int8_t NI, int8_t NF, uint64_t RANGE> | |
void | setFreq (SFix< NI, NF, RANGE > frequency) |
Set the frequency using SFix<NI,NF> fixed-point number format. More... | |
int8_t | atIndex (unsigned int index) |
Returns the sample at the given table index. More... | |
uint32_t | phaseIncFromFreq (int frequency) |
phaseIncFromFreq() and setPhaseInc() are for saving processor time when sliding between frequencies. More... | |
void | setPhaseInc (uint32_t phaseinc_fractional) |
Set a specific phase increment. More... | |
|
inline |
Constructor.
Declare an Oscil with template TABLE_NUM_CELLS and UPDATE_RATE parameters, without specifying a particular wave table for it to play. The table can be set or changed on the fly with setTable(). Any tables used by the Oscil must be the same size.
|
inline |
|
inline |
|
inline |
|
inline |
phaseIncFromFreq() and setPhaseInc() are for saving processor time when sliding between frequencies.
Instead of recalculating the phase increment for each frequency in between, you can just calculate the phase increment for each end frequency with phaseIncFromFreq(), then use a Line to interpolate on the fly and use setPhaseInc() to set the phase increment at each step. (Note: I should really profile this with the oscilloscope to see if it's worth the extra confusion!)
frequency | for which you want to calculate a phase increment value. |
|
inline |
Returns the next sample given a phase modulation value.
phmod_proportion | a phase modulation value given as a proportion of the wave. The phmod_proportion parameter is a Q15n16 fixed-point number where the fractional n16 part represents almost -1 to almost 1, modulating the phase by one whole table length in each direction. |
|
inline |
Returns the next sample given a phase modulation value.
phmod_proportion | a phase modulation value given as a proportion of the wave. The phmod_proportion parameter is a SFix<15,16> fixed-point number where the fractional part represents almost -1 to almost 1, modulating the phase by one whole table length in each direction. |
|
inline |
Returns the next sample given a phase modulation value.
phmod_proportion | a phase modulation value given as a proportion of the wave. The phmod_proportion parameter is a SFix<NI,NF> fixed-point number where the fractional part represents almost -1 to almost 1, modulating the phase by one whole table length in each direction. This fixed point math number is interpreted as a SFix<15,16> internally. |
|
inline |
Set the oscillator frequency with a float.
Using a float is the most reliable way to set frequencies, -Might- be slower than using an int but you need either this, setFreq_Q24n8() or setFreq_Q16n16() for fractional frequencies.
frequency | to play the wave table. |
|
inline |
Set the oscillator frequency with an unsigned int.
This is faster than using a float, so it's useful when processor time is tight, but it can be tricky with low and high frequencies, depending on the size of the wavetable being used. If you're not getting the results you expect, try explicitly using a float, or try setFreq_Q24n8() or or setFreq_Q16n16().
frequency | to play the wave table. |
|
inline |
Set the frequency using SFix<NI,NF> fixed-point number format.
This falls back to using UFix<16,16> internally and is provided as a fallout for other UFix types. If possible try to use directly UFix<16,16> or UFix<24,8> for well defined (and well tested) behaviors.
frequency | in SFix<16,16> fixed-point number format. |
|
inline |
Set the frequency using UFix<16,16> fixed-point number format.
This is useful in combination with Q16n16_mtof(), a fast alternative to mtof(), using UFix<16,16> fixed-point format instead of fractional numbers.
frequency | in UFix<16,16> fixed-point number format. |
|
inline |
Set the frequency using UFix<24,8> fixed-point number format.
This might be faster than the float version for setting low frequencies such as 1.5 Hz, or other values which may not work well with your table size. A UFix<24,8> representation of 1.5 is 384 (ie. 1.5 * 256). Can't be used with UPDATE_RATE less than 64 Hz.
frequency | in UFix<24,8> fixed-point number format. |
|
inline |
Set the frequency using UFix<NI,NF> fixed-point number format.
This falls back to using UFix<16,16> internally and is provided as a fallout for other UFix types. If possible try to use directly UFix<16,16> or UFix<24,8> for well defined (and well tested) behaviors.
frequency | in UFix<NI,NF> fixed-point number format. |
|
inline |
Set the frequency using Q16n16 fixed-point number format.
This is useful in combination with Q16n16_mtof(), a fast alternative to mtof(), using Q16n16 fixed-point format instead of floats.
frequency | in Q16n16 fixed-point number format. |
|
inline |
Set the frequency using Q24n8 fixed-point number format.
This might be faster than the float version for setting low frequencies such as 1.5 Hz, or other values which may not work well with your table size. A Q24n8 representation of 1.5 is 384 (ie. 1.5 * 256). Can't be used with UPDATE_RATE less than 64 Hz.
frequency | in Q24n8 fixed-point number format. |
|
inline |
|
inline |
Set the phase of the Oscil.
Might be useful with getPhaseFractional().
phase | a position in the wavetable. |
|
inline |
Set a specific phase increment.
See phaseIncFromFreq().
phaseinc_fractional | a phase increment value as calculated by phaseIncFromFreq(). |
|
inline |