Fuzzpilz Cheese of the Week
Cheese of the Week is a somewhat oversized 4-oscillator wavetable/PM synth. It's not that good, to be honest.
Features
- 4 wavetable oscillators able to use any of 29 built-in and 8 custom waveforms, with the ability to phase modulate and sync to one another in a variety of ways. 1 noise source.
- 3 filters with 10 different modes.
- 2 mod envelopes. Custom envelope shapes or AHDDSR parameters.
- 2 LFOs, plus one LFO dedicated to vibrato. 11 built in LFO shapes, 4 custom.
- Crappy unison.
- MIDI input.
Tips and Warnings
- Do not attempt to copy the parameters and paste them into a pattern. Buzz will crash. I haven't been able to ascertain the cause of this, but I'm 99% sure it isn't my fault. I assume Buzz simply can't deal with so many global parameters; a hardcoded buffer size or something of the sort must be involved.
- Oversampling can be expensive, especially if you're not going to have only one voice playing at a time. Don't turn it up higher than you need.
- Similarly, don't turn down the mod detail parameter unless you're hearing zipper noise of some sort.
- Unison is also expensive, mostly because it works at the voice level – meaning that not only the oscillators are cloned, but also all the envelopes, filters and LFOs.
- MIDI input handling is mostly separate from sequenced notes; input is not recorded.
- Envelope modulation is relative to the envelope's sustain level – when an envelope reaches sustain, whatever it's set to modulate isn't changed by it.
Phase Modulation?
Many people seem to get confused about this, so here's a bit of explanation on the differences between FM (frequency modulation) and PM. The sounds that can be made by both are the same (and in fact, many "FM" synths actually perform PM) – this is because the only difference is in whether the modulator is added before or after the phase integration. Here's some pseudocode to clarify this:
out = osc(phase + mod);
phase += frequency;
// amounts to: out = osc(time*frequency + mod[time]);
// FM
out = osc(phase);
phase += frequency + mod;
// amounts to: out = osc(time*frequency + mod[0] + mod[1] + .. + mod[time]);
Some Parameters
Parameter | Explanation |
---|---|
Velo | Global velocity sensitivity – this affects only the amplitude. In all other places where the velocity is needed, the original value is used. |
Note Mode |
Behaviour of envelopes on a new note if one is already playing on a track; also, virtual channels per track.
|
Glide Mode |
The way the glide time is interpreted depending on the two notes involved.
|
Pitch Bend | Global pitch bend. The range and inertia also affect the behaviour of the pitch wheel with MIDI input. |
Unison | Number of voices to play at once. |
Pitch Spread | Total pitch spread of unison voices – e.g. if you have 5 voices and pitch spread is set to 10 cents, the voices' frequencies are detuned by -10, -5, 0, 5 and 10 cents respectively. |
Pan Spread | Total pan spread of unison voices. |
Transpose | Global transposition. |
Note Sync |
Phase initialization of each oscillator when a note is played.
|
Sync Mode |
Not related to Note Sync; this controls what happens to a synced oscillator when the other oscillator wraps.
|
Mode | Oscillator routing. n(x) means that oscillator n is phase modulated by x. |
Oversample | Oscillator oversampling. |
On Velo | Oscillator n velocity sensitivity. |
On Feedback | Oscillator n feedback. The output of the entire oscillator section is used here, not just the appropriate oscillator's. |
On Phase | Oscillator n phase offset. |
On Env | Each oscillator's amplitude can be additionally modulated by one of the three envelopes. |
N Mode |
What to do with the noise generator's output.
|
Fn Num | Number of filter instances in series. |
S Oversample | Saturation oversampling – the saturation is a simple waveshaper that can introduce aliasing. Combat it with this if necessary. |
Detail | Modulation detail. Any modulation that needs to be done is done every n samples, which means that lower values are better and use more CPU time. |
Vib/Ln Shape |
If the shape is set to one of the random modes, the speed parameter sets the time between two random values.
|
Old Voices |
If the number of MIDI notes held exceeds the number of voices set by the MIDI Voices parameter, older notes have to be interrupted to make room for newer ones. This parameter determines what to do when a voice is freed and keys that have been interrupted are still held.
|
Track Commands
- 00 — note delay. First byte is tick subdivision, second is delay.
- 01 — adjusts the glide time for one note. The data word is interpreted as a multiplier – 0x0000 is 0, 0x4000 is 0.5, 0x8000 is 1, 0xC000 is 1.5 and that sort of thing.
- 02 — adjusts the glide time for one note as 01 does, and also doesn't retrigger the envelopes for this note.
- 03 — adjusts envelope speed for one note. 0x8000 is *1, 0x8800 is *2, 0x7800 is /2, and so on.
- 1x — resets vibrato and LFOs; the data word is interpreted as the phase to which to set them. To get the correct command for the combination you want, add 1 for vibrato, 2 for LFO 1, and 4 for LFO 2 – thus, for example, 16 resets LFO 1 and LFO 2, but not vibrato.
- 2x — resets envelopes. 1 is the main envelope, 2 is mod envelope 1, 4 is mod envelope 2. If the data word is 0x0001, the envelopes are reset hard, as in Mono Restart mode. If it's 0x0002, they're reset softly. Otherwise they're treated the way they normally would on a new note.
Waveform Editor
Draw with the left mouse button. Shift-click to draw a straight line. Ctrl-shift-click to draw a straight line to the mouse's x position and the wave's y position. Right click to load the built-in waveforms as presets.
Some possibly non-obvious buttons and things:
- Fix — remove DC offset and normalize.
- Kill Odd — remove all odd harmonics.
- Kill Even — remove all even harmonics.
- Distort — just a saturator. Uses the slider to its right to control amount.
- Add Harm — add a pitched-up version of the waveform to itself. Uses the slider and the input box.
- Revert — reverts to the state the waveform was in when the editor was opened.
- Apply — applies changes.
- Close — applies changes and closes the editor. Changes are not applied if you close the window using the X button.
Cheese can import raw data as waveforms. It likes to find 256 samples. If you give it more, the rest is thrown away. If you give it less, it makes do with rubbishy linear interpolation between the last sample and the first, unless you check "Stretch", in which case it stretches what it finds to make it fit.
LFO Shape Editor
Draw the same way as in the waveform editor. There's a grid to help you if you want to do rhythmic stuff.
Envelope Editor
Middle click or Ctrl-shift-click to add a new point. Press the left mouse button between two points and drag up and down to adjust the slope. Shift-drag sideways to scroll. Ctrl-drag to zoom. Right click on a point for options regarding that point, right click on the background for envelope options.
The space between the bright blue grid lines represents the duration of one tick (only if the envelope speed parameter is 1, of course). The point with the left grey semicircle around it is the loop start point; the point with the right grey semicircle is the loop end point. The point holding the green circle and line is the sustain point, or sets the reference level if the loop mode isn't sustain. Speaking of which:
Custom envelopes can be set to loop between the loop points, to remain at the sustain point when they reach it, or to just go through the entire shape without halting. Even when the loop mode is not "Sustain", however, the level of the sustain point is used as a reference for modulation if the shape is used for one of the mod envelopes.
And finally, release modes:
- Release param — when the note is released, the rest of the shape is ignored and the envelope simply dies according to the release parameter.
- Param with loop — the envelope keeps looping and more or less slowly fades out, depending on the release parameter.
- Continue — the envelope ignores the loop and continues all the way to the bitter end, where it dies, alone and unloved.
- Jump — tired of its meaningless existence, the envelope first jumps to the loop end point to accelerate its demise.
Closing Remarks
I hope this wasn't too unclear. I thank various people who tested it, especially everyone who posted in the Buzzchurch thread.
Cheese is freeware – do whatever you like with it, but don't try to sell it. It's not donationware either, though if you want to give me money I'm not stopping you. The code is all mine, except the FFT code I use to generate the wavetables, which was written by Laurent de Soras.