waves
waves is a bank of wavetable oscillators with modulation. Each oscillator is passed through a state variable filter.
Architecture
Oscillators
Each oscillator has phase modulation and waveshape-modulation. Modulation feedback is supported through an arbitrary delay time.
NB: PM is almost FM but not quite- it has the effect of high-pass-filtering the modulator, which has the advantage of sounding “in tune,” however slow changes are imperceptible. (use the hz or tune parameters along with hzSlew for LFO-type behavior.)
Wavetables are stored sequentially in memory, and the “wave” parameter interpolates between adjacent tables. Currently the contents of the wavetables are fixed, but in the future we should support loading arbitrary table data from SD card.
The current contents are, in this order: sine, triangle-ish, saw-ish, “more saw.”
All are bandlimited to 11 harmonics or less, and higher harmonics are added consistently as the waveshape parameter is increased.
NB: FM and shape modulation can still produce aliasing; the frequency components generated by these processes are much harder to control.
Smoothing
All oscillator parameters are subjected to smoothing by simple lowpass filters, with the smoothing parameter given in seconds. This means that new parameter values will be approached with an exponential curve, and converge with the target value in the given amount of time.
Smoothing on audio-modulated parameters always occurs before modulation is applied. “hzSlew” parameters are applied to frequency after frequency is calculated from “ratio” and “hz.”
Filters
Each state variable filter simultaneously produces lowpass, highpass, bandpass, and notch outputs. one output at a time can be selected with the “mode” parameters. (We dropped arbitrary mode mixing for more CPU cycles; it is easy to add this back, or arbitrary hard-patching of individual mode outputs.)
Routing
The routing parameters (adc0_dac0, osc0_dac0, etc) represent boolean patch points. On (1), or off (0).
Each oscillator output N is patched to filer input N. Filter output is arbitrarily mixed with oscillator output. the sum is multiplied by the “ampN” parameter, and patched to the hardware output channels according to oscN_dac0, oscN_dac1, etc.
oscN --> svfN * wetN --+--> * oscOutN
| ^
V |
--------> * dryN ----
oscOutX ---> oscX_dacY ---> outY
etc.
adcX ---> * adcX_dacY ---> dacY
Parameters
hzN
Oscillator N, base frequency
- Parameter type: Note
- Range: [~8 Hz, ~16000 Hz]
tuneN
Oscillator N, tuning ratio Actual base frequency is hz * tune
- Parameter type: Fixed
- Range: [0.25, 4.0]
ampN
Oscillator N, amplitude (post-filter)
- Parameter type: Amp
- Range: [0, 1.0] (bees will display dB)
pmXY
Phase-modulation amount from oscX → oscY
- Parameter type: Fixed
- Range: [0, 1]
wmXY
Waveshape-modulation amount from oscX → oscY
- Parameter type: Fixed
- Range: [0, 1]
waveN
Base waveshape for oscillator N
- Parameter type: Fixed
- Range: [0, 1]
cutN
Filter cutoff frequency for filter N
- Parameter type: SvfFreq
- Range: [ ~8hz, ~16000hz ]
rqN
Reciprocal of Q for filter N Zero equals full resonance
- Parameter type: Fixed
- Range: [0, 2]
modeN
Filter mode selection. 0=low, 1=band, 2=high, 3=notch
- Parameter type: Fixed
- Range: [0, 3.0]
fwetN
Volume of filtered signal from filter N
- Parameter type: Amp
- Range: [0, 1.0] (bees will display dB)
fdryN
Volume of dry signal from filter 1
- Parameter type: Amp
- Range: [0, 1.0] (bees will display dB)
oscN_dacN
Delay, in seconds, applied to modulation input signals.
- Parameter type: Fixed
- Range: [0, 1.0) (an arbitrary scale, 1.0 == 0x10000 samples)
Slew
- hzNSlew
- pmXYSlew
- wmXYSlew
- waveNSlew
- ampNSlew
- cutNSlew
- rqNSlew
- wetNSlew
- dryNSlew
- dacSlew0
- dacSlew1
- dacSlew2
- dacSlew3
Slew times for corresponding parameters
- Parameter type: Integrator
- Range: [0, 32] in seconds, convergence to -120dB
Output Routing
- adcX_dacY
- oscX_dacY
Hardware output routing for given output busses
- Parameter type: Boolean
- Range: 0 or 1
CV Output
- dac0
- dac1
- dac2
- dac3
CV output value for each channel
- Parameter type: Fixed
- Range: [0, 1]
In Use
Hz controls are scaled for perceived pitch linearity. Multiplying MIDI note * 256 and attaching to hz input gives semitones. the default hz scaling table in BEES has tuning data for A=440, 12tet; this can be customized and updated with a clean boot if desired.