CV Canvas

Create your own custom control signals! JK's CV Canvas lets you draw up to four different control signals, read them in many different ways, and output them to use in whatever way you like. Initially begun as a "draw your own LFO" module, the CV Canvas has enough playback options and flexibility to support many more uses, including as an envelope, a gridless sequencer, or an automation curve.

Basics: left-click and drag to draw on any of the four canvas areas with your mouse, hit play in that color's control area, hook up the Out jack to whatever you want to control. It's that easy...but there's plenty more and you can read below for full details/instructions.

Version 1.0 Demo Video


Each corner of the module contains a shape reader which is linked to the similarly colored canvas shape in the central window. Each has the same controls.

General Controls

Rate Section Controls

The Rate section provides three ways to control the playback rate of the shape reader, selectable via the three toggles. There is also a colored Main Knob, a white Auxiliary Knob, an input jack, and a black attenuator knob for the input jack. The specific range and function of each knob changes depending on the selected rate mode.

Free Mode

The first, with the Play symbol on it, selects Free Mode. This is the original free-running mode, though with a couple new adjustments.

The Main Knob controls the base rate. At start, this ranges from -1 Hz (backwards) to 1 Hz, or one full loop read per second.

The Auxiliary Knob selects the rate multiplier. Available values are 0.1, 0.5, 1 (no change), 2, or 10.

The CV input allows modulation of the playback rate. It expects input of -5 V to 5 V which corresponds to a range of +/- twice the current set rate.

Both the tooltip and manual value edit for the Main Knob take into account the loop length (start/end) and the multiplier setting when calculating the Hz value.

Sync Mode

The second toggle, with the quarter note on it, toggles Sync Mode.

Sync Mode expects a 96 PPQN sync signal in the input jack. This typically comes from VM's Sync Generator module or from the Sync Out jack in the Transport section at the top of VM.

The Main Knob sets the note value. Available lengths range from sixteenth notes to 4 bars.

The Auxiliary Knob further adjusts the note value. This makes it possible to have dotted (+50%) note lengths, as well as triplets, quintuplets, or even septuplets.

The input attenuator has no function in Sync Mode. :(

Also note that, for maximum flexibility, Sync Mode only adopts the timing provided by the sync signal. To be perfectly in phase with other modules or external music, the user will typically need to trigger a playback position reset on the first downbeat. For example, when reading a host's sync signal from Sync Out in the Transport section, hooking the Play output to the appropriate reset jack(s) in the Canvas module will ensure playback is in phase with the rest of your audio.

Phase Mode

The third toggle, with the phi symbol on it, toggles Phase Mode.

Phase Mode allows direct CV control of the shape reader's playback position (similar to the Sample Scrubber, for those familiar with that module). In this mode, the input jack expects a CV input in the usual range of -5 to 5, and maps that range to the playable range of the current shape (-5 is start, 5 is end).

The Main Knob acts as a phase offset.

The Auxiliary Knob sets the lag time for the input signal, thus slowing its rate of change.

The input attenuator simply attenuates the signal as expected, so reducing the input amplitude effectively shrinks the reading range.


Menu Functions

Note that many of the functions below can alternately be run by using Alt + letter key. The menu contains hints showing which letters trigger which functions. Just be sure the module has focus and you are hovering over one of the canvases first.

The menu also has hints showing which functions use the # or % knobs.

Top Level

Common useful operations.

Transforms Sub-Menu

Operations that change the existing line in various ways.

Shapes Sub-Menu

Load from a small selection of preset lines.

In each case, # sets the number of cycles of the generated shape.

Also, polarity matters! Where appropriate, each shape will start on zero.

Generators Sub-Menu:

Generate various types of random shapes.

File Sub-Menu:

Import: Truncate vs. Resize? Huh?

The Import function is primarily intended for those users who want to load single-cycle waveforms from their collection and use them in the CV Canvas. Due to the inherently intertwined nature of the pixel drawing and the actual data point storage, at this time only 576 points of data exist. (This may increase in the future.) If an imported file is 576 samples long or less, it loads without issue, with any extra points staying as zero. For files bigger than 576 samples (i.e. most of them probably), you have the choice of either loading the first 576 points and dropping the rest (Truncate) or loading all points and then mathematically scaling them to fit into 576 points (Resize). Of course neither option is perfect, but one or the other might be better depending on your specific needs.

Note that you can also import full audio files with the Resize option and, while losing a ton of information (tens of thousands of data points versus 576) still end up with an interesting curve to work with. It's worth experimenting with to get unique shapes. As one example, I've found kick drum samples to be interesting.

Bottom controls

Finally, we get to the controls in the bottom central area of the module. By this point this stuff should be pretty obvious.

The play, stop, and reset buttons/jacks are global and will override the current state of each reader.

The Clear All button does just as it says: it sets each canvas to polarity-dependent zero.

The % and # knobs, as endlessly mentioned above, are used for the settings of various generation functions.

LONG AWAITED UPDATE! Lots of pretty significant stuff so let's just call it Version 2.0!

(This is just a quick overview. For full details see the full description/documentation below.)