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

Tips and Warnings

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:

// PM
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

ParameterExplanation
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.
  • Mono — one voice; the envelopes restart, but their attack starts at the level they had reached during the old note.
  • Mono Restart — the envelopes are quickly brought down to zero before starting properly.
  • Mono Legato — if the playing note is releasing, the envelopes are restarted as in Mono mode; otherwise, the envelopes are not restarted.
  • Virtual 2/4/8 — virtual channels. If all channels are occupied, the oldest is stolen and its envelopes restarted as in Mono mode.
Glide Mode The way the glide time is interpreted depending on the two notes involved.
  • constant — the glide time is not affected by the notes.
  • *octaves — the glide time is multiplied by the number of octaves between the notes.
  • /semitones — the glide time is divided by the number of semitones between the notes.
...and sums of the above.
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.
  • Zero New — set each oscillator's phase to zero only if no other note was already using this voice.
  • Zero Always — set each oscillator's phase to zero whenever a new note starts.
  • Random New/Always — randomize each oscillator's phase.
Sync Mode Not related to Note Sync; this controls what happens to a synced oscillator when the other oscillator wraps.
  • Reset — reset phase to zero. Classic hardsync.
  • Weak Reset — reset phase to zero only if it already is near zero.
  • Jump x — immediately increment the phase by x.
  • Reverse — reverse the direction in which the oscillator goes through the wavetable.
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.
  • Add — add it to the oscillators.
  • Multiply — multiply it and the oscillators' output in various ways.
  • FM 1 — use it to frequency modulate oscillator 1.
  • FM 4 — use it to frequency modulate oscillator 4.
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.
  • Random D — jump directly from value to value.
  • Random L — linear interpolation between values.
  • Random Q — also linear interpolation, but the fractional index moves as x4 instead of as x.
  • Random SL/SQ — same as L and Q, but it only takes one fourth of the allotted time to reach the next value.
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.
  • Forget — disregard them entirely.
  • Revive Old — play the note corresponding to the inactive key that has been held the longest.
  • Rejuvenate — same, but pretend the key has only just been pressed. (which can mean that next time a different key may get its turn even if this key is also interrupted before then)
  • Revive New — play the note corresponding to the inactive key pressed most recently.
  • Age — same, but consider the key as the oldest from then on.

Track Commands

Waveform Editor

(screenshot of the 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:

(screenshot of the waveform editor's raw data import thing)

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

(screenshot of the 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

(screenshot of the 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:

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.

— f