This program is an homage to ALM's Pamela's "NEW" Workout and Pamela's "PRO" Workout modules, designed for the EuroPi. It is intended to be used as a main clock generator, euclidean rhythm generator, clocked LFO, clocked random voltage source, etc... with optional quantization.
The module itself will generate the master clock signal with a configurable BPM (1-240 BPM supported). Each output has an independently controlled clock multiplier or divider, chosen from the following:
[x16, x12, x8, x6, x4, x3, x2, x1, /2, /3, /4, /6, /8, /12, /16]
I/O | Usage |
---|---|
din |
External control input (see below) |
ain |
Routable CV input to control other parameters |
b1 |
Start/Stop input |
b2 |
Press to enter/exit edit mode. Long-press to enter/leave sub-menu |
k1 |
Routable CV input to control other parameters |
k2 |
Menu navigation |
cv1 - cv6 |
Output signals. Configuration is explained below |
If you accidentally press b2
and enter edit mode, you can long-press b2
to change
menu levels and cancel the current operation, without modifying the setting you had
selected.
din
can be configured to operate in multiple modes:
- start/stop trigger
- run gate
- reset trigger
Rotate k2
to scroll through the current menu. Pressing and holding b2
for 0.5s will
enter a sub-menu. Pressing and holding b2
again will return to the parent menu.
On any given setting, pressing b2
(without holding) will enter edit mode for that
item. Rotate k2
to choose the desired value for the item, and press b2
again
to apply it.
The menu layout is as follows:
Clock
+-- BPM*
| +-- DIN Mode
| +-- Reset
|
CV1
+-- Mod.*
| +-- Wave Shape**
| +-- Wave Width (PWM/Symmetry)*
| +-- Phase*
| +-- Wave Amplitude*
| +-- Attack*
| +-- Decay*
| +-- Sustain*
| +-- Release*
| +-- Skip Probability*
| +-- Euclidean Steps*
| +-- Euclidean Triggers*
| +-- Euclidean Rotation*
| +-- Swing Percentage*
| +-- Quantization Scale*
| +-- Quantizer Root*
| +-- Mute
| +-- Save
| +-- Load
| +-- Reset
|
CV2 to 6
+-- Same as CV1
|
AIN
+-- Gain
| +-- Precision
*
These settings can be automatically selected using voltage coming into ain
.
**
This setting can be set up to work as a sample & hold for the signal coming into ain
.
Some settings (e.g. ADSR envelope parameters, quantization root) are hidden from the menu if they would be ignored by the current configuration for that channel.
The main clock menu has the following options:
BPM
-- the main BPM for the clock. Must be in the range[1, 240]
.
The submenu for the main clock has the following options:
DIN Mode
-- Control the action taken when a gate or trigger is sent toDIN
:Gate
: the clock will start on a rising edge and stop on a falling edgeTrigger
: the clock will toggle between the running & stopped states on a rising edgeReset
: the clock will not change, but all waveforms & euclidean patterns will reset to the beginning
Stop-Rst
-- Stop & Reset: if true, all waves & euclidean patterns will reset when the clock starts. Otherwise they will continue from where they stopped
Each of the 6 CV output channels has the following options:
Mod
-- the clock modifier:/16
tox16
.x1
will output one waveform every beat (dictated by the BPM). Multipliers (xN
) will outputN
waveforms every beat. Divisions (/N
) will output a waveform everyN
beats.
3 additional special-purpose clock mods are available:
- Reset: a trigger that fires when the clock stops (can be used to trigger other modules to reset, e.g. sequencers sequential switches, other euclidean generators). The fired trigger is 10ms in duration at 10V times the channel's amplitude. e.g. at 50% the trigger will be 5V.
- Start: a trigger that fires when the clock starts (can be used to trigger other modules, or reset on-start). The trigger is at least 10ms long, but is based on the clock speed and may be longer. Trigger voltage is 10V times the channel's amplitude. e.g. at 50% the trigger will be 5V
- Run: a gate that is high when the clock is running and low when the clock is stopped. As long as the clock is running the gate will remain high. Gate voltage is 10V times channel's amplitude. e.g. at 50% the gate is 5V.
See below for details on setting the channels' amplitude parameters
The submenu for each CV output has the following options:
Wave
-- the wave shape to output. Square/Triangle/Sine/Random/AIN- Square: square/pulse wave with adjustable width
- Triangle: triangle wave with adjustable symmetry (saw to symmetrical triangle to ramp)
- Sine: bog-standard sine wave
- ADSR: an Attack/Decay/Sustain/Release envelope
- Random: outputs a random voltage at the start of every euclidean pulse,
holding that voltage until the next pulse (if
EStep
is zero then every clock tick is assumed to be a euclidean pulse) - AIN: acts as a sample & hold of
ain
, with a sample taken at the start of every euclidean pulse (ifEStep
is zero then every clock tick is assumed to be a euclidean pulse) - KNOB: acts as a sample & hold of
k1
, with a sample taken at the start of every euclidean pulse (ifEStep
is zero then every clock tick is assumed to be a euclidean pulse)
Width
-- width of the resulting wave. See below for the effects of width adjustment on different wave shapesPhase
-- the phase offset of the wave. Starting a triangle at 50% would start it midway throughAmpl.
-- the maximum amplitude of the output as a percentage of the 10V hardware maximumAttack
-- the percentage of the cycle time dedicated to the attack phase of an ADSR envelopeDecay
-- the percentage of the cycle time minus attack time dedicated to the decay phase of an ADSR envelopeSustain
-- the percentage level of the sustain phase of an ADSR envelopeRelease
-- the percentage of of the cyle time minus the attack & decay phases dedicated to the release phase of an ADSR envelopeSkip%
-- the probability that a square pulse or euclidean trigger will be skippedEStep
-- the number of steps in the euclidean rhythm. If zero, the euclidean generator is disabledETrig
-- the number of pulses in the euclidean rhythmERot
-- rotation of the euclidean rhythmSwing%
-- percentage division between pairs of consecutive notes. 50% results in no swing. Less than 50% results in a short-long-short-long-... pattern of notes. Greater than 50% results in a long-short-long-short-... pattern of notesQuant
-- quantization scaleQ Root
-- quantizer root: transposes the quantized output up by the number of semitones above C.Mute
-- if a channel is muted its output will always be zero. A muted channel can still be edited.Save
-- save the channel's current settings to one of 6 banks. Banks are shared across all channelsLoad
-- load a channel's settings from one of 6 banks. Banks are shared across all channelsReset
-- if set toOK
all channel settings are reset to their defaults. Setting toCancel
takes no action
The values of the Attack
, Decay
, Sustain
, and Release
settings are ignored if the wave whape is not set to
ADSR
Changing some settings while the clock is running may have undesirable side-effects, including clicks, out-of-time triggers, and the like. Generally-speaking it is best to make changes while the clock is stopped.
Applies immediately, can be safely changed at any time:
- Mute
- Skip
Applies immediately, but may result in rapid output level changes, clicks, and similar effects:
- Wave shape
- Attack, Decay, Sustain, Release
- Width
- Phase
- Swing
- Quantizer mode
- Quantizer root
- Clock Mod
Can be changed safely at any time, but the effect is delayed until the current wave shape completes its cycle:
- Euclidean length, triggers, rotation
The ADSR envelope is affected by the Width
, Amplitude
and Phase
parameters:
Phase
will shift the timing of the envelopeWidth
adjusts the total duration of the envelope. The envelope always starts at the beginning of the phase, but may end early, outputting 0.0V after the end of the release- the
Amplitude
setting adjusts the overall height of the wave. The attack phase always reaches peak amplitude, and the sutain phase is calculated relative to theAmplitude
setting.
The following diagram shows the breakdown of the ADSR envelope:
Total cycle time T
(based on clock modifer)
|----------------------|
| | ___
| /\ | Peak amplitude = Amplitude%
| / \ |
| / \_______ | ___
| / \ | | S = Amplitude% * Sustain%
|/ \_____| _|_
|--A-|D|---S---|R|--0--|
|A| + |D| + |S| + |R| = T * Width%
T' = T * Width%
|A| = T' * Attack%
|D| = (T' - |A|) * Decay%
|R| = (T' - |A| - |D|) * Release%
|S| = T' - |A| - |D| - |R|
The following ascii art shows the effect of phase on a squarewave. Note that the wave is not clipped; the entire wave form is simply shifted to the right by the phase percentage.
x1, phase = 0
____ ____ ____ ____
| | | | | | | |
| | | | | | | |
| |____| |____| |____| |____
x1, phase = 50
____ ____ ____ ____
| | | | | | | |
| | | | | | | |
____| |____| |____| |____| |
x1, phase = 25
____ ____ ____ ____
| | | | | | | |
| | | | | | | |
__| |____| |____| |____| |__
The following ascii art shows the effects of chaning the swing parameter on a simple square wave. Note that the duty cycle of the wave is preserved within each step, and each 2-note cycle takes the same amount of time. Only the timing between the first and second notes of each pair is affected.
Swing = 50%
____ ____ ____ ____
| | | | | | | |
| | | | | | | |
| |____| |____| |____| |____
Swing = 25%
__ ______ __ ______
| | | | | | | |
| | | | | | | |
| |__| |______| |__| |______
Swing = 75%
______ __ ______ __
| | | | | | | |
| | | | | | | |
| |______| |__| |______| |__
Setting the swing too high or too low, especially at higher clock speeds, can compress the shorter note so much that it ceases to exist. In that case the 0-length note is skipped entirely. This can lead to some interesting interactions with Euclidean patterns, as every second step is skipped whether it's on or off.
AIN
and Random
wave modes are treated like a sample-hand-hold of the incoming signal, with the sample taken on the
rising edge of a similarly-configured square wave.
For example, imagine AIN
has a saw wave being sent into it. For example, below we have a saw LFO being sent into
AIN
with CV1 configured to read it.
AIN
/| /| /| /| /|
/ | / | / | / | / |
/ | / | / | / | / |
/ |/ |/ |/ |/ |
CV1 clock x1, phase = 0
____ ____ ____ ____
| | | | | | | |
| | | | | | | |
| |____| |____| |____| |____
CV1 Output
____ ____
| |____ | |____
_____| |____| |__________
- Square: Duty cycle control. 0% is always off, 100% is always on
- Triangle: Symmetry control. 50% results in a symmetrical wave, 0% results in a saw wave, 100% results in a ramp
- Sine: ignored
- Random: offset voltage as a percentage of the maximum output
- AIN: ignored
- KNOB: ignored
The Reset trigger fires only when the clock is stopped and can be used to help synchronize external modules (e.g. other sequencers, sequential switches, etc...)
The Start trigger fires once when the clock is started. The duration of the trigger is at least 10ms, but may be longer depending on the BPM. This allows you to start other modules at the same time as Pam's Workout on the EuroPi.
The duration of the Start
trigger is based on the BPM of the master clock and the static PPQN of 48.
The trigger turns on immediately and stays on for each PPQN pulse until it's stayed on for at least
10ms. The table below shows approximate trigger times for some common BPM settings:
BPM | Trigger length (ms, approx.) | PPQN pulses |
---|---|---|
240 | 10.4 | 2 |
120 | 10.4 | 1 |
90 | 13.9 | 1 |
60 | 20.8 | 1 |
40 | 31.2 | 1 |
30 | 41.7 | 1 |
Most modules that use an external start trigger signal respond to the rising edge of the wave, so the variablility of the trigger width shouldn't cause any harmful effects in most cases.
All quantizers are tuned to treat the root note of their respective scales as C by default, with the quantizer root transposing this by the number of semitones above C. For example if the root is C# the transposed output will be shifted up by 1 semitone.
The following scales are available:
None
-- no quantizationChromatic
-- all 12 semitones can be outputNat Maj
-- natural major scale (C D E F G A B)Har Maj
-- harmonic major scale (C D E F G A# B#)Maj 135
* -- natural major triad (C E G)Maj 1356
* -- natural major triad + 6th (C E G A)Maj 1357
* -- natural major triad + 7th (C E G B)Nat Min
-- natural minor scale (C D Eb F G Ab Bb)Har Min
-- harmonoc minor scale (C D Eb F G Ab B)Min 135
* -- natural minor triad (C Eb G)Min 1356
* -- natural minor triad + 6th (C Eb G Ab)Min 1357
* -- natural minor triad + 7th (C Eb G Bb)Maj Blues
-- major blues scale (C D Eb E G A)Min Blues
-- minor blues scale (C Eb F Gb G Bb)Whole
-- whole tone scale (C D E F# G# A#)Penta
-- pentatonic scale (C D E G A)Dom 7
-- dominant 7th chord (C E G Bb)AIN
-- CV control to select one of the preceding optionsKNOB
-- Direct control over the preceding options by turning K1
*
These options are inspired by the Doepfer A-156 quantizer.
Both k1
and ain
can be configured to control many parameters of the system as CV inputs.
A value of 0V (or k1
fully anticlockwise) is equivalent to choosing the first item from the
available menu, and 12V (or k1
fully clockwise) is equivalent to choosing the last item
from the menu. AIN
and KNOB
are omitted from this choice, even though they appear as
menu items when scrolling.
NOTE: the Wave Shape
parameter of the CV outputs works differently. Instead of dynamically
choosing the output wave shape, the CV output acts as a sample & hold of the signal coming into
ain
. The digital attenuation (see below) is applied BEFORE the sample & hold operation is applied.
The Amplitude
parameter acts as a secondary virtual attenuator, and the Width
parameter acts
as an offset voltage.
There is digital attenuation/gain via the AIN > Gain
or KNOB > Gain
settings. This sets the
percentage of the input signal that is passed to settings listenting to these inputs.
For example, if your modulation source can only output up to 5V you should set the gain to
12.0 / 5.0 * 100.0 = 240%
. This will allow the modulation source to fully sweep the
range of options available.
The AIN > Precision
and KNOB > Precision
settings allow control over the number of samples
taken when reading the input. Higher precision can result in slower processing, which may introduce
errors when running at high clock speeds