Visual Vsti Programming
Visual Vsti Programming
Visual VST/i-Programming
H. G. Fortune (Editor), Peter Schoffhauzer, and David Haupt
Visual VST/i-Programming
A Comprehensive Guide to Creating
VST-FX and Instruments with Synthedit
w
Publisher Peter Gorges
Authors H. G. Fortune (Editor), Peter Schoffhauzer, and David Haupt
Cover art Complete Design, www.cmplt.com
Interior design and layout Uwe Senkler
© 2007 Wizoo Publishing GmbH, www.wizoobooks.com
ISBN 978-3-934903-59-3
All rights reserved. No part of this book may be reproduced in any form or
by any electronic or mechanical means, including information storage and
retrieval systems, without permission in writing from the publisher.
All product names and company names mentioned in this book are either
trademarks or registered trademarks of their respective owners.
Foreword by the Editor
As Stevie Winwood put it, “While you see a chance, take it.” Indeed: A
chance meeting at the supermarket next door sparked an idea that re-
sulted in the book you hold in your hands.
SynthEdit, in turn, sparked a VST/i boom. It offers even novices the
opportunity to create a VST/i of their own simply by connecting mod-
ules in the SE environment—no programming languages such as C++
required. This makes creating labyrinthine synthesizers and effects for
use in any VST-compatible audio software or sequencer kid’s stuff
rather than rocket science. Simply stack the building blocks—that is,
modules. What’s more, to beef up its already formidable powers,
SynthEdit accepts third-party modules.
Mastering SynthEdit is fun, and what better way to learn than by doing.
But without a guide to show hidden shortcuts and steer you clear of ob-
stacles and dead-ends, you may find the going too tough for your liking.
With the inside scoop on audio processing provided in this book, you
will better understand the basics and background of audio effects and
synthesis. Every turn of a page takes you that much closer to realizing
your vision of an effect or synthesizer in the virtual realm.
This book is your compass; use it to explore the seductive world of
VST/i. Seasoned sound-sculptor or newbie, you will soon find yourself
creating exciting musical tools.
As this book evolved, I often had cause to call on third-party developers’
help. Though an obliging spirit prevails in the SynthEdit community, I
was dumbfounded to discover how generously these kind people
shared the fruits of their labor.
Specifically, I wish to express my heartfelt gratitude to the following
gentlemen, princes among men all, for sharing their modules by way
of this book:
Ralph Gonzales, Dave Haupt, Rob Herder, Rick Jelliffe, Butch Kratzer,
Simonluca Laitempergher, Oli Larkin, Marc Lindahl, Kelly D. Lynch,
Etric van Mayer, Lance Putnam, Peter Schoffhauzer, Guido
Sconamiglio, and Dan Worrall.
A big round of applause and kudos go to Kelly D. Lynch for contribut-
ing modules unavailable to the public.
Thank you Lance Putnam for proofreading, Vera Kinter for providing
free GUI sets, and Hermann Seib for contributing the VST Host on
www.wizoobooks.com/synthedit for free.
Jeff McClintock provided SynthEdit, a phenomenally flexible tool for
creating anything from basic to advanced VST/i, even for C++ program-
mers using the SE SDK. And he merits special thanks for it.
7
Table of Contents
8
Table of Contents
Vocoders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Creating a Vocoder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Improving Intelligibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
More Mischief with Multi-band Processing . . . . . . . . . . . . . . . . . . 115
Crossovers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Putting Crossover Filters into Practice . . . . . . . . . . . . . . . . . . . . 119
Building a Two-band Compressor . . . . . . . . . . . . . . . . . . . . . . . 120
9
Table of Contents
10
Table of Contents
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
11
11
Welcome to the Wonderful
World of SynthEdit
What’s SynthEdit?
Decades ago, synthesizers were ponderous beasts with a nest of wires
sprouting from their panels. To create sounds, one would plug these
patch cords into different modules such as oscillators, filters, envelope
generators, and amplifiers. The signal path—that is, the order in which
one connected modules—shaped the sound. Hard-wired synths, far
easier to port and use, later won the day. Modular synthesis reared its
head again with the arrival of digital technology. SynthEdit is a software
application enabling today’s users to build audio applications taking
the modular approach of yesteryear. Its modules put many processing
options at your fingertips. Few who practiced the cumbersome chore of
juggling real patch cords would contend that plugging in virtual patch
cords is anything but a quantum leap in convenience.
VST Technology
Storability is what makes SynthEdit stand out in the crowd of modular
software applications. Create a synth or an effect, save it in VST or
VST/i format, and you may share it with or sell it to people owning
VST/i-compatible hosts.
A trademark of Steinberg Media Technologies GmbH, VST stands for
Virtual Studio Technology. Steinberg rolled out Cubase VST for PCs in
1996. VST instruments and effects are separate modules rather than
features of the main application. In 1997, Steinberg released the format
as an open standard, inviting third-party developers to market their
own plug-ins.
13
Chapter 1 Welcome to the Wonderful World of SynthEdit
Figure 1.1
14
X-Raying SynthEdit’s Hierarchic Structure
Figure 1.2
Heads up: Add modules using the Insert menu in the menu bar or the
Structure window’s right-click menu. Some modules are built in; oth-
ers appear in the default SynthEdit folder’s “modules” subdirectory.
SynthEdit automatically lists all folders and modules found in the
“modules” directory, so you can create folders for third-party modules
and copy the modules there.
Plug Types
Voltage Plugs
Most plugs are blue voltage pins. They serve mainly for audio signals
and control voltages. The standard range for control voltages is 0 to 10
volts, and −10 to +10 volts for audio signals. Plugging two or more
cords into the same input adds the signals.
List Plugs
Some modules plugs’ colors vary. For example, an Oscillator (Insert >
Waveform > Oscillator) has a green Waveform plug. These plugs refer-
ence list selections, meaning that green input plugs only accept list
plugs. These include List Entry, List Entry2, (Insert > Controls) and
Voltage To List (Insert > Conversion) modules. A list input accepts one
input only. A list output, in turn, connects to more list inputs, but only
if they are of the same type, such as the Waveform selector of two Oscil-
lator modules.
15
Chapter 1 Welcome to the Wonderful World of SynthEdit
Figure 1.3
Float Plugs
Serving mainly to communicate with GUI modules, these plugs come
in a different shade of blue. Float denotes the data type. They may have
any real number value.
Figure 1.4
MIDI Plugs
The green MIDI in and MIDI out plugs shuttle MIDI data such as note
on, note off, pitch bend, mod wheel, aftertouch, program change, and
control change events to and fro.
Figure 1.5
Text Plugs
Though these crimson text plugs enable mainly filename entry as
shown in figure 1.5, they also serve other purposes. GUI text plugs, for
example, provide caption titles for sub-controls. See the section “What
Are Sub-controls?” on page 193 for details.
16
X-Raying SynthEdit’s Hierarchic Structure
Spare Plugs
One SynthEdit plug type automatically clones itself when connected to
another module, for instance, a switch (Insert > Flow Control > Switch
(Many → 1)). Connect a module’s output to a spare input plug of the
switch, and another spare input plug appears. This means you may
connect as many inputs as you wish. Spare plugs may appear either as
inputs or outputs.
Figure 1.6
GUI Plugs
Some plugs’ background is blue rather than gray. Called GUI plugs,
they serve chiefly to communicate with the GUI and call sub-control
modules home. What sets GUI plugs apart from regular plugs is that
they are updated less frequently, about 20 times a second. To learn
more, see the sections on GUI plugs and Sub-controls.
Figure 1.7
17
Chapter 1 Welcome to the Wonderful World of SynthEdit
Module Properties
Every module offers a Properties window. Right-click a module and
select Properties; a window much like this appears.
Module: Rename the module any way you see fit. The new name
appears in the Structure window.
Plugs: This lists input plugs and their default values. Feel free to set a
default value for any plug. Note that connecting an input to the plug
overrides the values entered here.
Options: Some modules’ advanced settings may only be changed in the
Properties window, for instance, frequency scale (1 Volt/Octave or 1
Volt/kHz) and resolution settings.
CPU: Appearing below the options is a graph showing CPU use and
history. The green dots at the upper left show signal polyphony. See the
section “Polyphony” on page 21 to learn more.
Prefabs
SynthEdit lets you load a full set of modules called a prefab. Consisting
of several modules—anything from a flanger with an LFO to an entire
synth goes—prefabs are usually large and easy to insert. They often
hold modules in a container for easier handling. You will find them in
the “prefabs” folder. The Insert menu lists se1 files; copy frequently
used setups to it for easy, quick loading.
18
X-Raying SynthEdit’s Hierarchic Structure
Figure 1.9
Containers
Containers are key building blocks in SynthEdit. They round up several
modules, herding them into one logical corral to simplify the structure
of a synth, effect, or control feature. Every container affords you a view
of its internal structure and a panel window. Below you see the struc-
ture of a flanger prefab loaded to a container:
Figure 1.10
An IO Mod module feeds the audio signal into the container. The
Delay2 and the DCA modules delay the incoming singal and adjust the
wet signal level. Another IO Mod module routes it out of the container.
The original dry and wet signals blend to create a typical flanger effect.
Check out the section “Conjuring a Flanger” on page 69 for more on
flangers.
19
Chapter 1 Welcome to the Wonderful World of SynthEdit
Controls on Module/Parent
Right-click a container and select Properties. The following panel pops
up:
Figure 1.12
Enable Controls on Parent, and these controls also appear on the main
container. You can handle them as one group as shown in figure 1.13.
This method goes for all control features with sub-controls (Knob,
Pitch Bender, List Entry2, Joystick, LED2, and VU Meter).
20
X-Raying SynthEdit’s Hierarchic Structure
Figure 1.13
Locked Containers
Lock a container if you wish to prevent further editing. Simply clicking
the Lock icon in the toolbar locks the active window. Or right-click the
container module and tick Locked. The spare plugs disappear when a
container locks, deterring you from adding connections. The box icon
in the container heading shows the status. An open green box stands
for unlocked; a closed gray box locked.
Polyphony
Containers are the key to managing polyphony in SynthEdit, so let’s
back up and look at what polyphony is all about. A MIDI to CV module
automatically converts incoming MIDI data into control voltages. Press
several keys at once and the MIDI to CV module produces a polyphonic
signal. The application creates how ever many clones all the down-
stream modules need. Generated internally, these clones are invisible
to us. When the signal leaves the container, the application shoehorns
it back into monophonic format.
A container’s default polyphony is six voices. Give figure 1.11 another
gander and note the option called Polyphony. You may set it to any
number up to 128, the MIDI maximum for voices. This of course limits
the number of voices and clones created during processing.
Heads up:
❖ The polyphony setting affects MIDI to CV modules. A container or
sub-container holds just one MIDI to CV module, so you cannot dial
in different polyphony settings within the same container.
❖ The Properties window shows the number of active clones for each
module. Figure 1.14 shows the bottom of an SV Filter’s Properties
window. The green dots at the CPU graph’s top left signal the speci-
fied clone is active. In figure 1.14’s scenario, max polyphony is four
voices, with three currently active.
21
Chapter 1 Welcome to the Wonderful World of SynthEdit
Figure 1.14
Skins
Use your main container to select a skin for your plug-in. Choose either
the Skin option in the container’s Properties window, or right-click the
container’s Panel window and select the Skin menu from the list.
Automation
This right-click property lists all automation parameters used in the
container. You may define automation parameters specifically for one
patch or globally for all, and configure them as VST parameters or
MIDI continuous controllers for user to access.
22
X-Raying SynthEdit’s Hierarchic Structure
Module/Prefab Categories
Add modules and prefabs in the toolbar’s Insert menu or right-click
menu. They are grouped in different submenus, the default categories
being:
Controls
This menu comprises mostly parameter controls such as knobs, slid-
ers, switch, list and text entry boxes, mod wheel, pitch bend, joystick,
and keyboard as shown in figure 1.15.
Visual feedback modules also fall into this category. This group
includes the frequency analyzer, LED indicators, peak and VU meters,
and a volt meter as shown in figure 1.17.
23
Chapter 1 Welcome to the Wonderful World of SynthEdit
Two other modules merit mention, Fixed Values and Image. The
former produces constant output voltages; the latter displays bmp or
png images on the GUI.
Conversion
This category’s modules convert data types, for example, floats to volts
and vice versa.
Effects
This category’s defaults are delay, flanger, chorus, ring modulation and
hard-clipping distortion modules and prefabs. A Clipper module lets
you restrict control voltages to any range of your choosing.
Examples
This category offers sample prefabs serving to do things like create low
frequency oscillators or a paged panel. You are sure to find these exam-
ples are edifying, so be sure to check them out.
Filters
These components cut frequencies from a signal. Filters come in vari-
ous guises with different characteristics. The most significant differ-
ence is the number of poles (the more poles, the steeper its cutoff
slope), and the frequencies they let pass.
Low pass: Allows only low frequencies to pass, filtering out frequencies
above the cutoff frequency
High pass: Allows only high frequencies to pass, filtering out frequen-
cies below the cutoff frequency
Band pass: Allows only a narrow band of frequencies around the cutoff
to pass, filtering out both low and high frequencies
24
X-Raying SynthEdit’s Hierarchic Structure
Band stop: Filters out a narrow band of frequencies around the cutoff
to, allowing all other frequencies to pass
All pass: Allows all frequencies to pass, but changes the incoming sig-
nal’s phase. Phaser effects usually feature this filter.
Single-pole low-pass filters also serve to smooth parameter changes
and create portamento effects. Use negative voltages for smoother tran-
sitions. See portamento_example.se1 on the disk to learn how to create
portamento by applying a one-pole LP filter to an oscillator’s pitch.
A one-pole high-pass filter set to 20–30 Hz serves to remove DC. Check
out the DC_filter.se1 example for more on this.
Flow Control
Switches let the user configure patch cords and choose sound-shaping
options, for example, to select an LFO’s destination and a signal proces-
sor. Figure 1.18 shows how a switch works using the DC filter prefab
from the preceding example. The Choice list plug lets you select cutoff
frequencies in 0.02, 0.025, and 0.03 increments (20 Hz, 25 Hz. and
30 Hz in 1 Volt/kHz scale).
Input/Output
Use the Sound In and Sound Out modules to access your audio card’s
input and output channels. Note that the unregistered version confines
you to just two output channels.
Wave Player and Wave Recorder modules play files from disk and
record any audio signal in different wav formats.
25
Chapter 1 Welcome to the Wonderful World of SynthEdit
Logic
SynthEdit comes with logic modules that use control voltages to trans-
fer data. 5 volts is the high value denoting true; 0 volts is the low value
denoting false.
This category also features different counters, a shift register, and a
Monostable module for creating a pulse with a fixed length.
Math
This group contains basic math modules such as Multiply, Subtract and
Divide. An Add module is not on board because simply connecting any
signals to the same input adds them. The Floor and Ceil modules
round the voltage input down and up to the nearest whole number. For
example, Floor rounds 1.45 volts down to one volt; Ceil rounds it up to
2 volts.
MIDI
This category’s modules mainly handle MIDI data, filtering it, playing
it from files, and converting it to control voltages and back to MIDI.
The menu also features MIDI sequencer modules, a MIDI Soundfont
Player, a Patch Select module for adding patches to your plug-in, and a
MIDI Automator module that lets you automate controls using a MIDI
mod wheel or controller commands.
Modifiers
This broad category features modules for adjusting levels (VCA—Volt-
age Controlled Amplifier and Level Adj), cross-fading (X-Mix), panning,
and inverting. Two Waveshapers distort signals or impose a customized
transfer function on a control voltage, say to use a specific velocity
curve. Waveshaper lets you draw the transfer curve manually by drag-
ging points, while Waveshaper2 accepts a mathematical equation. A
Rectifier inverts voltages’ charge from negative to positive. A Compara-
tor compares two levels, and a Peak Follower tracks a signal’s envelope.
The Quantizer module constrains the number of input steps, much
like bit reduction. Use this to do things like confine a slider or a knob’s
output value to whole numbers. Sample And Hold holds the incoming
level until it is retriggered.
26
X-Raying SynthEdit’s Hierarchic Structure
Obsolete
This category contains an ancient version of Delay for compatibility.
Use Effects > Delay2 instead.
Special
Many different modules call this group home. Two modules detect and
clean denormal numbers generated by some third-party delays, filters,
and other modules’ feedback loops, unnecessarily consuming CPU
power. Monitor watches over MIDI signals and plugs’ status changes.
The OS Command module carries out system commands. Voice Com-
biner converts polyphonic signals to mono. Random Voltage gener-
ates—you guessed it—random voltages.
SynthEdit does not enable feedback, bar one exception. You can use the
Special > Feedback (delayed) module to create feedback loops. Connect
the Feedback module’s output to any module’s input, and the latter’s
output to the Feedback module’s input to configure feedback loops for
delays and the like. Note that this feedback is not sample based, and its
latency amounts to about 2 milliseconds at 44 kHz sample rate,
depending on audio buffer size.
Sub-Controls
Use these modules to build controls and GUI features. An entire chap-
ter of this book is devoted to these sophisticated tools.
Synths
This folder contains two drum modules, a subtractive synth, phase dis-
tortion synth, and an FM synth example.
VST Plug-ins
SynthEdit lists all VST/i plug-ins found at the location you specified in
Edit > Preferences > File Locations > VST Plugins. Subfolders may be
created in that directory, with their contents listed as submenus.
27
Chapter 1 Welcome to the Wonderful World of SynthEdit
Though SynthEdit lets you load and embed VST/i plug-ins in your
structure, the GUI does not appear if you embed it in your VST. If the
embedded VST/i plug-in is MIDI-enabled, use MIDI controller data to
manipulate it. Check the plug-in’s documentation to learn which con-
trollers you may use.
Heads up: Before releasing a plug-in with an embedded VST/i, check if
the license permits you to do this, or contact the author to get permis-
sion.
Waveform
This menu lists sound-generating modules. There are three types of
oscillators.
The Oscillator module generates band-limited sine, saw, ramp, trian-
gle, and pulse waveforms offering oodles of modulation options. It also
serves as a low-frequency oscillator, and generates white and pink
noise. White noise’s frequency spectrum is flat, whereas pink noise’s
frequency spectrum drops by 3 dB per octave and yields smoother
highs.
28
X-Raying SynthEdit’s Hierarchic Structure
Phase Dist Osc distorts a sine wave’s phase to create complex wave-
forms. Introduced by Casio with the CZ synth line in 1984, phase dis-
tortion is much like FM synthesis.
The Soundfont Oscillator loads and plays selected banks and patches
from Soundfont (.sf2) files. It renders sample data only, without enve-
lope, filter, and velocity settings.
The ADSR module creates amplitude, filter, pitch, and user envelopes.
A, D, S, and R stand for attack, decay, sustain and release, respectively.
Attack: Controls how fast the signal reaches peak level when the player
presses a key.
Decay: Controls how fast the signal falls from peak to sustain level.
Sustain: Controls the level at which the signal remains until the player
releases the key.
Release: Controls how fast the level returns to 0 when the player
releases the key.
Third-party Modules
You can create what in synth-speak is called a third-party module using
the SynthEdit SDK (Software Development Kit) and, say, a C++ com-
piler. Whatever your heart desires—oscillators, filters, effects, logic
operators, and many more—someone somewhere offers a third-party
module to fit the bill. The accompanying data on www.wizoo-
books.com/synthedit offers a rich selection of these. Again, SynthEdit
automatically lists all folders and modules found in the “modules”
directory, so you can create more folders and copy third-party modules.
See the web on www.wizoobooks.com/synthedit for details.
29
2
Designing VST Effects in
SynthEdit
Meet the Family of VST Effects
This chapter examines the different types of VST effects, reviewing the
ins and outs of creating all common signal processors. Beginning with
the basics, it describes how to assemble plug-ins featuring different
parameters and application possibilities. Many tips and much inspira-
tion for fine-tuning plugs await, so let’s get to it.
31
Chapter 2 Designing VST Effects in SynthEdit
Right-click the Structure window and select Panel Edit to open the
interface, which will be appear on the plug-in. The window’s size deter-
mines GUI’s size. Drag and move the sliders to the window’s top left
corner, and adjust window size so it holds the sliders as seen in figure
2.2.
32
Kicking Off a VST Effect Project
Now you can save the plug-in. Open the File menu and select Save As
VST. Enter a name, say, Moog Filter. This header appears in the VST
host. Assign a unique, four-character ID to your plug-in so the host can
identify the plug-in. Click OK to save the VST effect. It should be ready
and waiting in your host. In Cubase SX, it looks like this:
Heads up:
❖ You may need to restart the host program or rescan the VST plug-
ins folder for your VST to appear.
❖ You can register your plug-in with the ID at the following official
Steinberg website:
http://service.steinberg.de/databases/plug-in.nsf/plug-in
Go-to files: Effects\Our first effect\filter.se1
33
Chapter 2 Designing VST Effects in SynthEdit
Heads up:
❖ You may find building a more complex stereo version easier if you
put both the left and right channel setups into a container.
❖ To test your plug-in in the SynthEdit environment, plug an audio
source into the input and wire the outputs to a Sound Out module
or a Freq Analyser as shown in figure 2.5. Saving a plug-in as a
VST/i stores only the main container’s contents; the test signal and
Sound Out modules are not part of the plug-in.
34
Fun with Auto Filters
35
Chapter 2 Designing VST Effects in SynthEdit
You must tweak some parameters before you can use MultiFilters.
Open the filter’s Properties window and adjust the following parame-
ters:
Set Gain Compensation to On. This normalizes the output signal and
prevents clipping by setting the filter’s resonance peak to 0 dB.
Set Filter Stages to 1. This feature cascades several filters to create
steeper slopes, a service we can do without for the moment.
Turn your attention to the Input Mode. Some native and third-party
plug-ins feature variable input ranges or scales for controlling pitch.
Select Pitch/Res to set the Freq(Hz) | Pitch(v) plug to 1 Volt/Octave
mode. This ensures the Q | Res(v) plug controls resonance in a way that
serves our purposes. Be sure to adjust both filters.
Heads up: At times you may need several copies of a module sharing
the same parameter settings. If so, configure the parameters of one
module, and copy it as often as you like using Edit menu copy and
paste commands or key shortcuts. The application also copies your set-
tings, sparing you the tedium of mindless repetition.
36
Fun with Auto Filters
Time to adjust the Slider modules: Open the Pitch Slider’s Properties
window. Select Cutoff to rename it. Note the slider’s default low and
high settings have changed from 0 and 10 volts to 10 and 20,000 volts.
That’s high voltage, so set it back to 0 and 10 volts, as the input scale is
1 volt per octave with 5 volts equaling 440 Hz. Rename the resonance
plug Reso and set the Lo and Hi values to 0 and 10 volts, respectively. If
you prefer a knob’s look and feel to a slider’s, simply select Knob from
the list. Now when you patch in a mono test signal, you should get a
mono output signal.
37
Chapter 2 Designing VST Effects in SynthEdit
You need a VCA (voltage controlled amplifier) module (Insert > Modifi-
ers > VCA) to adjust levels, one for each channel. Open the VCA’s Prop-
erties window and set Response Curve to Decibel to control the input
voltage level in decibel increments. For details on VCA response
curves, see the section on converting signal levels in the SynthEdit
manual.
Heads up: Third-party converter modules offer precise decibel values
for adjusting levels. Some examples in this chapter use DH_dBTo-Volt-
age to this end.
Go-to files:
❖ Effects\Filters\autofilter2.se1
❖ Effects\Filters\autofilter3.se1
38
Fun with Auto Filters
Heads up:
❖ Both input plugs connect to the Peak Follower’s Signal-in plug, con-
verting them to mono and taking the average of the two signals. You
may tap the left and right channels’ envelope individually.
❖ To test the effect in the SynthEdit environment, you may find it nec-
essary to load a loop or other wave file using a Wave Player (Insert >
Input/Output > Wave Player).
❖ Fastest attack and decay values may over-excite the modulation
effect, causing it to spin too fast, the sound to warble, and aliasing
noise in the filter. Enter one volt as the low attack and decay value to
fix that problem.
❖ Equal to 600 milliseconds, 30 volts is fine for higher attack and
decay limits.
❖ Setting the range of the EnvMod knob to −10 Volts … 10 Volts
enables negative modulation. Negative voltages invert the envelope.
Go-to files: Effects\Filters\autofilter4.se1
39
Chapter 2 Designing VST Effects in SynthEdit
Reach for your trusty calculator and confirm that 30 Hz equals 1.1255
V, and 0.01 Hz equals −10.4252 V. Connect a knob to an oscillator’s
Pitch plug, and enter these as high and low values. This affords you
exponential control over the LFO rate within the range of 0.01 Hz and
30 Hz. Name this knob Rate.
40
Fun with Auto Filters
41
Chapter 2 Designing VST Effects in SynthEdit
respective rate and depth. The oscillators’ Phase Mod plug controls the
waveform’s phase. Change this value for one oscillator. Setting Phase
Mod to 10 volts puts the two waveforms in opposite phase, so 0 to 10
volts is a good choice of range. Simply connect a knob to this plug and
name it Stereo. Figure 2.13 outlines the resulting structure. Now con-
nect a Level Adj’s output to plug a filter’s Pitch plug, and the other Level
Adj’s output to the other filter’s Pitch plug.
42
Fun with Auto Filters
Figure 2.14: Complex but not confusing—a tempo sync LFO’s structure
43
Chapter 2 Designing VST Effects in SynthEdit
44
Fun with Auto Filters
Figure 2.16: A List Entry module’s default visuals look like this
❖ Figure 2.17 maps out the final auto-filter structure with a switch sit-
ting between the free-running oscillator and the tempo sync LFO.
Go-to files: Effects\Filters\autofilter7.se1
45
Chapter 2 Designing VST Effects in SynthEdit
Figure 2.17: The whole kit and caboodle—an auto-filter with an LFO and
envelope follower
If this look and feel fails to float your boat, use a skin on www.wizoo-
books.com/synthedit or design one to taste. To apply a skin, you must
load its files to a subfolder of the SynthEdit\skins folder. Named
VK_Mini-Grey, the skin in figure 2.19 came courtesy of Vera Kinter.
Select a skin in one of two ways. Open the Main container’s Properties
window and select the skin from the list at the bottom, or right-click the
panel window and select the skin from the Skin menu.
46
Fun with Auto Filters
Go-to files:
Effects\Filters\autofilter7gui.se1
Effects\Filters\autofilter7gui2.se1
One more chore awaits before saving this filter as a VST plug-in. In
order to enable patches, you must insert a patch selector. Drop a Patch
Select (Insert > MIDI > Patch Select) module anywhere into the struc-
ture. It automatically handles patches and presets. The Panel window
opens with a Patch Select bar at the top. Serving solely to create
patches, it will not appear in the final plug-in. Browse the patch bank,
configure different patches, and give them meaningful names. Once
you have created plenty of presets for your plug-in, click File > Save as
VST.
Heads up: 16 patches is the limit for plug-ins saved using the unregis-
tered version of SynthEdit.
Go-to files: Effects\Filters\autofilter8.se1
47
Chapter 2 Designing VST Effects in SynthEdit
Delay Effects
Basic delay effects load the input signal to a buffer and render it after a
brief interval. Most employ a feedback loop, cycling the output signal
back to the input. The signal repeats infinitely as its amplitude gradu-
ally decreases. Some sonic scientists insert a filter to the feedback loop
to simulate high- and low-frequency damping. Others use more delay
lines (taps) to conjure complex delays. And all this merits our further
investigation.
Figure 2.21 maps the simplest delay structure. Each input channel
feeds a delay line, with a VCA adjusting output levels. The VCA’s
Response Curve plug is in Decibel mode, so the delayed signal’s level
adjusts on a decibel scale. The wet processed signal mixes with the dry
48
Delay Effects
input signal to produce the composite output signal. The Length slider
controls delay time, while the Feedback slider adjusts feedback
amount. The channels share the same settings, so this is a mono delay
imposed on a stereo signal.
Max delay time is one second. To display and enter delay time in milli-
seconds, set the slider’s high value to 1,000 and divide the slider’s out-
put by 100, or use a Divide module (Insert > Math > Divide) to do this.
Connect the slider’s output to the Divide module’s Input 1. This is the
numerator. Open the Divide module’s Properties window and set Input
2 to 100. This divides the slider’s output by 100 for an output range of 0
to 10 volts, suitable for the Modulation plug. Add another slider with a
Divide module and you can control the left and right channels’ delay
times independently. See figure 2.22.
49
Chapter 2 Designing VST Effects in SynthEdit
Heads up: The module’s Properties window lists every plug’s default.
If no wires are connected to the plug, SynthEdit assumes the default
value as input, sparing you the effort of wiring up the Divide modules’
Input 2 plugs. The principle at work here is the same as connecting a
Fixed Values module (Insert > Controls > Fixed Values). Though this
merely provides fixed voltages to the selected plugs, the values appear
in the plug’s label in the Properties window.
50
Delay Effects
Figure 2.25: A low-pass filter in the wet chain dampens high frequencies
(delay3.se1).
Heads up:
❖ “State-variable” means a two-pole filter with a 12 dB/octave slope.
The application calculates low-pass, high-pass, band-pass, and band-
reject filtering simultaneously, so you are free to choose any output
signal.
❖ When resonance approaches 10 volts, the SV filter begins to self-
oscillate, which is uncool in a delay filter. Confine the resonance
slider’s range to 0 to 9 or 9.5 volts to nip this problem in the bud.
❖ Savvy designers set the filter cutoff plug’s low value to about 3 volts,
or 110 Hz, the likelihood of lower frequencies seeing use is slim.
51
Chapter 2 Designing VST Effects in SynthEdit
Connect the Fixed Values module’s Spare plug (Insert > Controls >
Fixed Values) to the Switch module’s Spare plug (Insert > Flow Control
> Switch (Many → 1)), thereby creating selection options. The labels
defined in the switch’s Properties window determine which labels the
list box will display. This structure resides in its own container. To show
the Unit list box on the container and the GUI, open the Container’s
Properties window and enable Controls on Parent and Controls on
Module. If necessary, open the unit container’s panel window and
resize the Unit list box.
52
Delay Effects
Heads up:
❖ Every container comes with a panel holding graphical features. You
can edit and move them around as you would the main GUI’s fea-
tures. Tick the Controls on Module box to show them on the main
structure’s container. Tick the Controls on Parent box to show them
on the main GUI. This option serves chiefly to create custom con-
trol modules. See the section “What Are Sub-controls?” from page
193 onwards for details.
❖ When using this structure, be sure to set the Delay2 modules’ Delay
Time parameter to 10 so one volt of modulation equals one second
of delay.
Once you have chosen the unit and calculated its length, you need a
control feature to set delay length in that unit of measurement. This
length is always the unit length multiplied by a whole number, so you
need a control feature that puts out whole voltages, say a switch with
fixed whole number values. You could also opt for a slider with an out-
put value rounded to whole numbers, as in this example.
A slider or knob produces a floating point number within the given low
and high limits. Two modules round off a signal voltage: Ceil (Insert >
Math > Ceil) rounds the input up to the nearest whole volt (2.5 yields 3
volts; −2.5 yields −2 volts.) Floor (Insert > Math > Floor) rounds the
input down to the nearest whole volt (2.5 yields 2;−2.5 yields −2). Set a
slider’s lower and upper limits to 1 and 8 volts, and the Floor module
will round the output signal down to whole numbers between 1 and 8.
This is fine for selecting delay length in a scale based on beats.
The problem is the slider’s readout shows the floating point value
rather than the rounded number. The solution is to use sub-controls.
Switch the slider or knob’s readout box off in the Properties window by
disabling Show Readout. Instead, task a Text Entry2 sub-control mod-
ule (Insert > Sub-Controls > Text Entry2) to display the value. The input
plug’s blue background tells you this is a GUI Text plug, so you must
convert the signal plug into a GUI Text plug.
53
Chapter 2 Designing VST Effects in SynthEdit
The Volts to Float (Insert > Conversion > Volts to Float) module con-
verts voltage into a float plug, which a Patch Mem–Float Out (Insert >
Sub-Controls > Patch Mem–Float Out) module can then transform into
a GUI float value. In this case, its only purpose is to convert voltage.
Then convert the GUI float value to GUI text using the Text To Float
(Insert > Sub-Controls > Text To Float) module. Bear in mind that GUI
module plugs’ flow may be bidirectional. Here the float value enters the
module on the right, and the text value exits to the left. Open the Text
To Float module’s Properties window to specify how many digits you
wish to see displayed. Set it to 0 to show only the whole number with-
out decimals. Figure 2.28 affords you a view of this structure.
Now you can dump this structure into a container to create a control
prefab for selecting length. Open the container’s panel window and
drag the Text Entry box under the slider. Enable the Controls on Parent
and Controls on Module options for the container. Rename the slider to
Length. Lock the container if no further changes are necessary. For
more on sub-controls, refer to the section “What Are Sub-controls?”
from page 193 onwards.
Figure 2.29
54
Delay Effects
All that remains for you to do now is select a Multiply (Insert > Math >
Multiply) module that multiplies the unit length by the slider or knob
length, and patch its output to the Delay2 module’ Modulation plug.
Multiplication is commutative, so the order of wires is irrelevant. Fig-
ure 2.30 diagrams the resulting structure.
55
Chapter 2 Designing VST Effects in SynthEdit
We must use an external feedback path rather than the Delay2 mod-
ule’s internal feedback circuit. However, if you try to create this struc-
ture with a feedback path, you will get the error message:
“This patch contains a FEEDBACK path, Please remove.”
The reason for this is SynthEdit’s internal structure, in which modules
process audio in buffers rather than by samples. You can hurdle this
obstacle using a Feedback module (Insert > Special > Feedback
(delayed)) to create feedback paths. There is a minor catch, though.
Feedback is not instantaneous; the module introduces a touch of
latency. Its amount hinges on buffer size, usually around 90 to 100
samples. This comes to about 2 milliseconds at 44 kHz, and one milli-
second at 96 kHz sampling rate. Though the effect is negligible in
some applications, timing may suffer in others.
Heads up: Say a patch comprises two chains, one with, the other with-
out feedback. Latency may elicit flanging, leaving undesirable artifacts
in the signal. Insert a Feedback (delayed) module to the other chain to
compensate. On the upside, the two chains are now in sync sans flang-
ing. On the downside, you end up with about 2 milliseconds global
latency. Latency compensation prevents flanging in this patch.
Figure 2.32 outlines the basic cross-feedback delay structure. It bases
on a tempo sync patch, meaning delay length selectors are synchro-
nized to tempo. The top two Feedback (delayed) modules live in the dry
signal path, delaying the signal to compensate for the feedback loop’s
latency. The bottom two feedback modules’ outputs connect to the
Delay2 modules’ Signal in plugs. Level Adj modules adjust their output
levels, thus determining feedback level. The scaled signal feeds back
into the other channel’s Feedback module, creating the cross-delay
effect. VCA modules scale the Delay2 modules’ output signals and
determine the wet (delayed) signal level.
56
Delay Effects
Heads up:
❖ Using the Delay2 modules’ internal feedback is a no-go, so be sure
to set their Feedback plugs to 0.
❖ Simply add a Switch (1 → Many) to transform this cross delay struc-
ture into a conventional feedback delay. Choose between sending
the signal back to the same or the other channel to let you toggle
between conventional and cross feedback. You could also add
another Level Adj module that feeds back to the same channel. This
lets you adjust normal and cross feedback amounts independently.
❖ The signal recycles infinitely at 100 % (10 volts) feedback level. Lev-
els above 100 % (> 10 V) continually ramp up the volume, eventually
distorting the signal and “exploding” the effect. Set feedback to
100 % or lower, unless an endless loop is what you want.
❖ You can set feedback levels in decibels using a DH_dBToVoltage
module.
Go-to files: Delay\crossdelay1.se1
57
Chapter 2 Designing VST Effects in SynthEdit
cumulates with every feedback loop. Resonance and gain pile up quick
in resonant, EQ, and shelving filters with positive gain, soon blowing
the effect up. To prevent this, use filters without resonance or with gain
normalization (DH_MultiFilter2), or allow negative gain in shelving fil-
ters only. The following example employs cascaded one-pole low-pass
and high-pass filters with a smooth 6 dB/octave slope for high and low
frequency damping. Place filters pre Delay2 effects so the filtering
effect accumulates. Figure 2.33 illustrates the structure with the filter.
Heads up:
❖ Filters in the feedback path are nifty, but many settings cut the sig-
nal’s amplitude. Feel free to use feedback levels a touch over 100 %
for experimental effects. This lets you create endless ambient tex-
tures, but mandates careful adjustment of the feedback level. A peak
limiter comes in handy for limiting high feedback levels.
❖ Drop Pan modules in front of the amplifiers to stereo pan the two
channels and create leaner effects.
❖ Place any filter or effect in the feedback chain, say, flangers and
phasers, to conjure striking soundscapes. Again, proceed with cau-
tion when using level-boosting prefabs and adding resonance or
feedback, as output levels may soon spike.
58
Delay Effects
Caution:
Before experimenting with structures containing external feedback
paths and potentially high feedback levels, back off speakers and head-
phones’ volume to protect your equipment and hearing.
Go-to files: Delay\crossdelay2.se1
Now adjust the dry signal’s level, and mix it with the four taps’ output
signals. The delay lines’ delay time is the one second default, so the
sliders’ high value is 1,000. Divide each slider’s output signal by 100 to
enable millisecond delay length settings. All taps sport a dedicated
feedback control. Figure 2.35 shows one tap’s structure with the dry sig-
nal.
59
Chapter 2 Designing VST Effects in SynthEdit
Figure 2.35: Structure of one tap with the dry signal (multitap.se1)
Drop the tap into a container to tidy up. Hold the Control key to mark
the Divide, Delay2, SV Filter, Pan, and DH_dBToVoltage modules for
the tap, and then select Containerise Selection from the Edit menu.
Change the new container’s input labels. The dBToVoltage and Level
Adj modules for the dry signal are also containerized for your conve-
nience. Figure 2.36 maps this structure.
To add more taps, simply copy the Tap container with its controls. Con-
nect the averaged input to the tap’s Signal in plug, and connect its out-
puts to the IO Mod module. Figure 2.37 shows the entire structure.
60
Delay Effects
Go-to files:
Delay\multitap1.se1
Delay\multitap2.se1
Delay\multitap3.se1
61
Chapter 2 Designing VST Effects in SynthEdit
Figure 2.38: A possible layout for the four-tap delay using the default skin
62
Give ’Em Some Room with Reverb
63
Chapter 2 Designing VST Effects in SynthEdit
64
Give ’Em Some Room with Reverb
Figure 2.45 outlines the four comb filters. In this structure, Delay2
modules serve as comb filters, with delay times of 52, 63, 79, and
83 ms. Though seemingly random, textbook reverb design calls for
these values to be mutually prime numbers. The comb filters’ length
determines the simulated room’s size. Moorer suggests using linearly
distributed values over a ratio of 1 to 1.5. Different delay values color
reverb in different ways, so fine-tune the delay times manually. Chang-
ing the length of just one comb filter can have a tremendous impact on
the reverb’s overall sound. The Multiply module divides the result by
the number of comb filters so the reverb and dry signal level are equal.
65
Chapter 2 Designing VST Effects in SynthEdit
The reverb time is defined as the time for the level to drop from the ini-
tial level to −60 dB. Schroeder’s equation for calculating a comb filter’s
time goes like this:
60 –3
T= t= t
–20 log l gl logl gl
g denotes feedback level, and t delay length. Here’s how to calculate the
feedback level for a given delay time and total reverb time:
g = ±e3t⁄T
Take, for example, 52, 63, 79, and 83 ms and one second total reverb
length. This equation yields ±0.8555, ±0.8277, ±0.7889 and ±0.7795
(±8.555, ±8.277, ±7.889 and ±7.795 volts) for the feedback levels. The
structure above is simplified, with the same feedback level for all delay
times. Though this makes it easier to control reverb time, on the down-
side, comb filters with longer delays are slower to fade. Jezar Freeverb
employs this method, with satisfying results. Setting feedback to a
value of one (decay to 10 volts) elicits infinite reverb.
Figure 2.46 shows the all-pass filter structure. It is the SynthEdit equiv-
alent of the all-pass scheme in figure 2.38. A Feedback (delayed) mod-
ule feeds a delay module’s output back to its input. It adds the inverted
and scaled input signal to the Delay2 module’s output signal, lending it
all-pass characteristics. The Inverter module changes the signal’s
charge. The all-pass filters smear the transients in the reverb, creating a
diffuse sound. The longer the delays, the more diffuse the reverb. True
enough, but Moorer recommends some 6 ms for the all-pass’ delay
time because longer delays produce audible reiterations. The left and
right channels delay times’ differ, yielding a stereo effect. If the input
signal is mono, or the input’s stereo width is irrelevant, you can convert
the two channels to mono by averaging. Then only one CombX4 struc-
ture feeding both left and right all-pass filters yield the same results for
mono signals, with the benefit of a lighter CPU load.
66
Give ’Em Some Room with Reverb
67
Chapter 2 Designing VST Effects in SynthEdit
Figure 2.48: A comb filter with a low-pass filter in the feedback loop
This structure is similar to our cross delay. Here the one-pole filters are
set to 1 Volt/kHz mode. Called Delay3 in the prefab, a CombX6 con-
tainer holds six of these in parallel array. Figure 2.49 depicts the main
structure. Divide the Damping knob’s output by 100 to show the damp-
ing frequency in Hz.
This prefab employs delay times proposed by Moorer—50, 53, 61, 68,
72, and 78 ms. To simulate different room sizes, scale these values
using Level Adj modules. Check out moorer2.se1, in which the Size
parameter scales all delay times. To avoid conjuring a ringing metallic
sound, limit the Size parameter to at least one volt.
Go-to files:
Delay\moorer1.se1
Delay\moorer2.se1
68
Modulated Delay Effects (Flanger, Chorus)
Conjuring a Flanger
Mixing two signals, one with several milliseconds of variable delay, cre-
ates a flanging effect. The two signals are out of phase, notching the
frequency spectrum at linearly spaced intervals. As delay time changes,
the notches sweep across the frequency spectrum, conjuring a comb fil-
69
Chapter 2 Designing VST Effects in SynthEdit
ter effect. For more emphasis, the output is often fed back to the input
to give rise to sharp resonant peaks in the frequency spectrum. Figure
2.50 is a spectrogram image of a flanger’s effect on white noise. The
light stripes are notches; the dark stripes resonant peaks.
The term flanger was coined in the mid 20th century, when two tape
machines played the same signal at the same time. An engineer placed
a finger on a tape reel’s flange, slowing one tape and throwing the two
out of sync. When the engineer released the reel, its speed gradually
returned to normal, evincing a groovy psychedelic whoosh.
Figure 2.51 shows the most rudimentary stereo flanger structure. Each
input channel feeds into a delay line, which then mixes with the dry
signal and notches the spectrum.
The delay lines’ delay time is 0.01, or 10 milliseconds. An oscillator
module puts out −5 to +5 volts by default. This setup adds 5 volts to
arrive at 0 to 10 volts to match the input range of the Delay2 module’s
Modulation plug. The Level Adj module scales the output signal,
thereby determining modulation depth. The Modulation plug’s value
changes constantly, so be sure to enable the delays’ Interpolate Output
option. This prevents the dreaded zipper noise and ensures a smoother
output signal. This prefab employs a triangle waveform for the LFO.
Tweak one oscillator’s Phase Mod plug to go stereo. Shifting the two
waveforms’ phases creates a wide-body stereo effect. 5 volts translate to
90 degrees, 10 to 180 degrees phase shift.
70
Modulated Delay Effects (Flanger, Chorus)
71
Chapter 2 Designing VST Effects in SynthEdit
The Patch Mem–List2 module converts the list input into a GUI list
value. The list is then converted to Boolean values (recall GUI plugs’
bidirectional data flow). The List to Bools module converts the Boolean
values back to a list plug, but addresses only options linked to it. If
desired, rename options by opening the Properties window of the List
to Bools module and changing the labels. The GUI list output connects
to a Dropdown List module, which is the actual GUI control feature.
We renamed the module in the example prefab List Entry2.
Figure 2.53
To add a left/right arrow similar to those found in the Controls > List
Entry2 module, simply copy the Bitmap Image, Float to Bool and
Increment2 modules from that prefab, and connect the Increment2
module to the List to Bools module’s List plug. Once you have config-
ured the container’s panel, the arrows let you quickly change options.
We connected a Text Entry2 module to the Name plug of the Patch
Mem–List2 to show a label for the list entry. If you wish, open the Prop-
erties window and select Read-Only mode to make the label readable
only. The Style option—as determined by the current skin’s global.txt
settings—changes the text’s appearance. Figure 2.54 illustrates the
structure. The flanger2.se1 prefab uses this waveform selector.
72
Modulated Delay Effects (Flanger, Chorus)
73
Chapter 2 Designing VST Effects in SynthEdit
The knobs base on the Knob prefab (Controls > Knob) depicted in fig-
ure 2.54. The heart of the prefab is the Patch Mem–Float module. The
Patch Mem module’s Min Value and Max Value plugs define the knobs’
low and high limits. The Animation Position plug connects to Bitmap
Image modules providing the knob view. The actual value goes to two
plugs—a GUI Float Value plug on the left, and a Float Value Out plug
on the right. The prefab employs a float Value Out plug to send the sig-
nal to a Float to Volts (Insert > Conversion > Float to Volts) module,
which converts the value to voltage. The Text Entry2 module merely
brandishes the label.
74
Modulated Delay Effects (Flanger, Chorus)
Use the Patch Mem’s GUI float Value plug to show readouts. Figure
2.59 illustrates the Depth knob’s structure. This setup first scales the
Value plug; then converts it to text for display. The knob’s range is 0 to 5
volts, or 0 to 10 milliseconds. Use a Float Scaler (Insert > Sub-Controls
> Float Scaler) module to scale the knob. The rule for scaling is:
Figure 2.58
75
Chapter 2 Designing VST Effects in SynthEdit
The same goes for all other knobs in this prefab—scale them; then dis-
play the GUI float value plug. The Rate plug is the sole exception; it
uses a third-party module to convert volts to frequency. Figure 2.60 out-
lines the structure. KDL Volts2Hz converts the output voltage to Hz.
Insert > Convert > Volts to Float then converts the Hz value to float,
and a Patch Mem–Float Out sub-control converts it to GUI float. This
sub-control provides the value in GUI float plug format for conversion
to text and display. The unit may connect to the Patch Mem–Float Out
module’s Name plug. Once you configure the readout, it shows you the
LFO’s exact frequency in Hertz.
76
Modulated Delay Effects (Flanger, Chorus)
Figure 2.61
For the sake of convenience, we dumped the delay lines with the oscil-
lators in a container called 2 Voice Chorus. Copying this container adds
two voices to the chorus. Figure 2.61 pictures the container; figure 2.62
the structure.
Figure 2.62: The two delay lines with LFOs inside a container
77
Chapter 2 Designing VST Effects in SynthEdit
Different phases beef up the sound. Add a constant voltage to the oscil-
lators’ Phase Mod plug in the second dual-voice chorus. We added 10
volts in this prefab, as highlighted in figure 2.64. This shifts the phase
180 degrees, putting the two-voice pairs in opposite phase. Feel free to
adjust the value or add a manual control.
78
Modulated Delay Effects (Flanger, Chorus)
79
Chapter 2 Designing VST Effects in SynthEdit
Phaser Effects
Phasers are like flangers, the main difference being that all-pass rather
than comb filters carve notches and peaks into the spectrum. Though
built-in and third-party all-pass filters are available, SynthEdit’s con-
straints preclude real feedback. The good news is that third-party
phaser modules and other filter types can simulate phasers’ peaks and
notches.
Phaser Variation 1
Our first version employs all-pass filters. Rather than changing the fre-
quency spectrum, all-pass filters distort the incoming signal’s phase.
Take, for example, a sine wave. Applying an all-pass filter to it yields a
sine wave of the same amplitude, but with a different phase deter-
mined by the sine wave’s frequency. Different frequencies’ phases shift
differently. So, how do we notch the frequency spectrum if it remains
unchanged? By mixing the wet and dry signal. Frequencies with oppo-
site phases cancel each other out, cutting notches into the spectrum.
The number of all-pass filters in the chain determines the number of
notches.
The first example features a third-party module, EVM All-pass. On the
upside, it does not hog as much CPU as the in-built all-pass filter. On
the downside, it produces aliasing noise when modulated too fast
because it updates filter coefficients less frequently. It will do for stan-
dard phaser modulation rates, though. A dual-stage phaser unit looks
something like the setup in figure 2.66. The signal passes through two
serial all-pass filters, and then mixes with the original signal.
80
Phaser Effects
We created similar containers with two, four, six, and eight serial all-
pass filters to enable stage selection. A 1 → Many switch selects the
number of stages. Figure 2.67 shows this structure.
Figure 2.68 outlines the main structure with two LFOs and controls
much like those in the previous prefabs. A center knob with a 0 to 5 V
range selects the center frequency. The two LFOs modulate the all-pass
filters’ pitch, creating the sweeping effect.
Heads up: Swap the Channel1 and Channel2 containers for EVM
Phaser modules, if you wish. They offer all-pass filters and let you
select stages and control other parameters. See phaser2.se1 to learn
more.
Go-to files:
Phaser\phaser1.se1
Phaser\phaser1.se1
81
Chapter 2 Designing VST Effects in SynthEdit
Phaser Variation 2
The above prefabs simply notch the spectrum; they can’t generate real
feedback. But there are other ways to fake it. This example uses state
variable filters to put notches and peaks in the spectrum, serving up a
sound very much like a phaser. The trick is to subtract the high-pass
output from the state variable filter’s low-pass output, creating a reso-
nant peak as well as phase distortion. Then if you route more of these
filters in parallel, the phase cancellations create notches between the
peaks as shown in figure 2.69—great for simulating a phaser’s whoosh.
82
Phaser Effects
The external structure mirrors the previous prefab’s, except that here a
Feedback knob controls the filters’ resonance amount. Open the Feed-
back knob’s structure and you will see how Subtract and Level Adj mod-
ules shape the output signal. All they do is calculate 1 – (1 – x)2 to
change the resonance curve. Though not strictly necessary, this makes
it easier to adjust the feedback amount. Figure 2.72 graphs this curve
for you.
See phaser3.se1 for the full structure. This effect’s feedback emulation
sounds rather sweet. Note that the notches’ depth corresponds to the
feedback amount.
83
Chapter 2 Designing VST Effects in SynthEdit
Heads up: State variable filters are all-pole filters, meaning they boost
high frequencies near Nyquist, possibly eliciting high-frequency ring-
ing. Prevent this by limiting the phaser’s maximum pitch.
Go-to files: Effects\Phaser\phaser3.se1
Equalization
Equalizers feature prominently in most audio applications. The term
dates back to bygone days when filters compensated certain frequen-
cies’ attenuation in electronic equipment to elicit linear frequency
response. Today equalizers serve many different purposes. They do
things like adjust a boom-box’s tone, boost certain frequencies of an
instrument to make it stand out in the mix, and cut low frequency hum
or noise. Shelving and peaking filters are the most common types.
Shelving filters boost or attenuate frequencies below or above a speci-
fied cutoff frequency. Audiophiles call them low-pass shelving or low-
shelf and high-pass shelving or high-shelf filters. Peaking or peak EQ
filters attenuate or boost a narrow frequency band surrounding the cut-
off frequency, leaving the remainder untouched. The Q factor or filter
bandwidth determines the frequency band’s width. Figure 2.73 charts
some typical response curves. Conventional low-pass, high-pass, and
notch filters also serve to equalize.
Though there are many types of equalizers, for our purposes they come
in four major categories. One comprises tone controls with fixed fre-
quency bands for bass, midrange and highs like the equalizers on mix-
ing desks and DJ gear.
84
Equalization
85
Chapter 2 Designing VST Effects in SynthEdit
Graphic Equalizers
You may add bands for greater flexibility. Graphic equalizers usually
feature seven to 31 equally-spaced frequency bands. The more bands,
the more precisely you can shape sound. Different equalizers use dif-
ferent frequency settings, but frequency bands are usually spaced
equally along a logarithmic scale. Two methods determine the ratio of
two neighboring bands. The base 2 method in 1/N octave mode is:
1
UpperBand = BaseFreq ∗ 2 ⁄N
BaseFreq
LowerBand = 1
2 ⁄N
86
Equalization
The other method arrives at the center frequency using powers of 10.
The 1/N octave mode rule is:
N
UpperBand = BaseFreq ∗ 10 ⁄10
BaseFreq
LowerBand = N
10 ⁄10
Though the two methods yield slightly different results, they are practi-
cally the same. An ISO standard lists a number of preferred center fre-
quencies. Many graphic equalizers, both software and hardware, use
them. Table 2.1 lists these frequencies.
87
Chapter 2 Designing VST Effects in SynthEdit
Heads up:
❖ Chose peak filters’ bandwidth carefully. Different methods serve to
set bandwidths, the most common being proportional-q (variable-q)
and constant-q. The constant-q method adjusts the bandwidth for
different gain settings to curb cross-talk between bands. The above
structure is a classic proportional-q equalizer. If bandwidth is too
narrow, a high-gain boost will yield a resonant sound. When boost-
ing adjacent bands, narrower bandwidth may introduce ripple. If
bandwidth is too broad, you will get more band interaction. 1.3
octaves is a good choice of amount. That way, when you boost two
adjacent sliders by +12 dB, band interaction boosts total gain to
about +17 dB.
❖ A greater slider range also increases ripple, so don’t go beyond a
12-dB boost.
Go-to files: eq10-1.se1
88
Equalization
Each slider has a Patch Mem–Float module assigned, but the SL Slider
linker connects the Animation Position knob to the Joystick Image. Set-
ting the container’s Link plug to True prompts the Slider Linker to link
the two sliders’ position.
A Joystick Image lets you create a slider animation in SynthEdit. It pro-
vides the slider’s knob animation, while the Bitmap Image supplies the
background. This prefab requires two custom skin features,
vslider_med_handle.png and vslider_med_back2.png, found on
www.wizoobooks.com/synthedit. Please copy them to the skin folder
before loading this prefab. These images base on the default vertical
slider; skin and customize them as you wish. For more information on
how to use the Joystick Image, please refer to the section “Joystick
Image” on page 213.
The usual suspects make up the other features in this prefab. Float to
Volts sliders’ connects the Position sliders to voltage. Text To Float and
Text Entry2 modules display the readout and frequency. We placed one
slider below another in the GUI. Figure 2.74 shows their structure.
89
Chapter 2 Designing VST Effects in SynthEdit
The switch bases on the Controls > Switch prefab. Figure 2.75 maps its
structure. Rather than using a Patch Mem module for animation, we
opted for a Float to Bool module to convert the switch’s status to a GUI
Bool value. The Text Entry2 with the Patch Mem merely labels the
switch. GUI plugs connect to just one GUI Bool plug. This means we
need a Bool Splitter (Insert > Sub-Controls > Bool Splitter) module to
connect the Link plug to all the sliders.
Linkable sliders connect to the left and right channels’ Gain plugs. Fig-
ure 2.79 illustrates the user interface.
Heads up: Add meter modules to monitor input/output signal levels
(Controls > Peak Meter), if you wish.
Go-to files: Effects\Equalizer\eq10-2.se1
Effects\Equalizer\Skin files\vslider_med_handle.png
Effects\Equalizer\Skin files\vslider_med_back2.png
Be sure to copy the png files to the actual skin folder.
90
Equalization
Parametric Equalizers
Parametric equalizers afford users great flexibility, enabling them to
adjust equalizer bands’ center frequency and bandwidth. Some para-
metric equalizers also feature different filter types ranging from low-
pass and high-pass to shelving and peaking filters. The following exam-
ple shows you how to create a four-band parametric equalizer with one
low shelf, one high shelf and two peaking bands.
This example uses DH_BiquadFilter modules much like those in the
previous prefabs. Four filters are arrayed serially for each channel, all
operating in Hz/Octave/dB mode. One is configured as a low shelf,
another as a high shelf, and two more in EQ Peak mode. The controls
are also akin to the previous prefabs’. Gain ranges from −18 to 18 dB;
bandwidth is specified in octaves. Frequencies range from 20 Hz to
20 kHz, which equals low and high knob values of 0.5405684 and
10.506353, respectively. The KDL Volts2Hz module converts these val-
ues to Hz. Figures 2.80 and 2.81 show the structure and user interface.
Heads up:
❖ Add bands for more precise control. This ups the CPU load, so if
you use many bands, equip them with On/Bypass switches. See the
section “Optimizing Effects” on page 185 to learn more.
❖ Add filter type selectors for each band if you wish to afford users
even greater flexibility.
Go-to files: Effects\Equalizer\eq_para4.se1
91
Chapter 2 Designing VST Effects in SynthEdit
92
Dynamic Processing
Dynamic Processing
These processors shape a signal’s dynamics and dynamic range. Com-
pressors, limiters, expanders, and gates are most common types. This
book’s scope is limited to explaining compressors and limiters, but
expanders and gates’ structures are very similar.
Compressors limit a signal’s dynamic range, reducing its amplitude
above a given threshold value. Sometimes called make-up gain, a gain
control boosts the softer parts of the signal. A ratio control adjusts the
compression amount by determining the ratio between input and out-
put levels. Set ratio to 2:1, and the compressor halves signal levels
above the threshold. Figure 2.82 graphs some compressor/limiter
transfer curves. Any ratio above 10:1 constitutes limiting. Peak limiters’
ratio is generally infinite to 1. This equates to hard clipping, strictly
maximizing the output level.
93
Chapter 2 Designing VST Effects in SynthEdit
94
Dynamic Processing
The peak meters show the actual levels to help users keep track of the
signal’s status. We used the Peak Meter2 prefab from the Insert > Con-
trols menu. Note that the prefab’s Volts to Float module converts the
level to animation. Open this module’s Properties menu and you will
see two settings, Response and Update Rate. In/Out peak meters
employ a dB peak setting with fast response. The Gain Reduction
meter uses volts DC (Fast), because the signal is already in decibels.
The prefab converts the two channels to mono before displaying
meters.
Heads up:
❖ Lowering the release value increases harmonic distortion. Set
release to 0, and the limiter behaves like a hard-clipping distortion
module. You may want to limit the release parameter’s low value to
prevent this. This prefab’s low value is 1 ms. Extreme settings may
elicit serious distortion.
❖ The Peak Limiter in version v1.0150 may “leak” signals at very high
levels and low release rates, possibly causing more clipping and dis-
tortion.
Go-to files: Effects\Dynamics\limiter1.se1
95
Chapter 2 Designing VST Effects in SynthEdit
The compressor does nothing to the sound at a 1:1 Ratio knob setting.
Set it to 1:20, and you will dial in some serious compression. This
structure takes the ratio value’s reciprocal, and then subtracts it from
one, yielding a value ranging from 0 (1:1) to 0.95 (20:1). The compres-
sor multiplies the difference between input level and threshold by this
value. This is how the Ratio setting determines the amount of gain
reduction. The equation goes like this:
⎠
1 ⎞
GRdB = – max (lndB – ThrdB,0) ∗ 1 – ⎜
⎞ Ratio ⎜
⎠
96
Dynamic Processing
How to Average
Two methods serve to compute a signal’s average, moving average, and
infinite impulse response filters. A moving average filter takes the
weighted sum of N inputs. An infinite response filter takes the
weighted sum of inputs and outputs. We’ll use the latter.
The impulse response of a first-order IIR filter like the 1 Pole LP filter
in SynthEdit is an exponentially decaying signal, so recent samples are
given more weight. In reality, though, response is endless, hence the
name infinite impulse response. A one-pole filter’s time constant is the
time it takes to reach the level of 1/e, or about 37 % of the original level.
Now let’s do the math for a one-pole filter. The equation for calculating
a signal is:
−1
a=
e fst
f
a = e (–2 ∗ pi ∗ fs )
97
Chapter 2 Designing VST Effects in SynthEdit
1
f=
2π t
98
Dynamic Processing
Heads up: Feel free to also use Oli Larkin’s OL_Squareroot module to
compute a signal’s square root.
99
Chapter 2 Designing VST Effects in SynthEdit
In our earlier examples, the Clipper module shaped the transfer curve
shown in figure 2.90. Above 0, the output level equals the input level.
Below 0, the output level is 0. Smoothing out this curve with a knee
replacing the sharp corner changes the compressor’s characteristic.
100
Dynamic Processing
ules scale levels so that one volt equals 10 dB. The knee spans from
about −15 to +10 dB around the threshold. Though not much of a
range, it is just enough to smooth the sound a touch. Subtract this
function from x to arrive at the transfer curve shown in figure 2.91.
To let users choose between a soft and a hard knee, add a structure with
switches rather than the Clipper module. See figure 2.92 for a structure
that selects the type of knee. It sports two switches, 1 → Many and
Many → 1. Here’s why: When the 1 → Many switch selects a hard knee,
the modules in the soft-knee container go to sleep. Yet they continue to
issue residual constant voltage from previous calculations. A second
switch prevents this constant voltage from influencing the sound. Usu-
ally 1 → Many switches are preferable, this being an exception. To learn
more about optimizing patches, see the chapter “Making the Most of
Performance” from page 181 onwards.
101
Chapter 2 Designing VST Effects in SynthEdit
102
Getting Down and Dirty with Distortion Effects
Hard Clipping
A Clipper (Insert > Effects > Clipper) module like the one above can
serve to clip signals hard. Hi Limit and Lo Limit plugs determine maxi-
mum and minimum levels. The basic setup in figure 2.96 yields hard-
clipped distortion. This setup boosts the level high enough to clip the
signal. The Threshold knob adjusts the Clipper module’s high and low
limits. It converts the dB value to voltage using a DH_dBToVoltage
module, and inverts it for the negative limit.
103
Chapter 2 Designing VST Effects in SynthEdit
Soft Clipping
SynthEdit affords you many options for configuring a soft-clipping
setup. Your choices are dedicated third-party modules such as sc:Soft-
Drive and DH_SoftDist, Waveshaper modules, and polynomial distor-
tion. Figure 2.97 portrays one soft-clipping setup. A Waveshaper2 mod-
ule provides distortion by way of a tanh() trigonometric function. This
setup is very similar to the internal structure of the DH_SoftDist mod-
ule. You may change the transfer function or replace the Waveshaper2
module with a Waveshaper enabling any transfer function, including
asymmetrical.
Go-to files:
Effects\Distortion\overdrive1.se1
Effects\Distortion\overdrive2.se1
104
Getting Down and Dirty with Distortion Effects
Fold-back Distortion
Those of us who are slavishly devoted to digital synths love fold-back
distortion waveshapers because they are so easily realized with soft-
ware. A fold-back effect inverts or folds back signal levels extending
beyond a certain threshold. This conjures a distinct sound with flavor
much like frequency modulation or phase modulation synthesis.
Though third-party modules (RH-Fold-back, RH-Fold-back2) do this,
using a Waveshaper2 module is an easy option. Enter
3.75 ∗ (abs(−abs(−abs(x+1.25)+2.5)+2.5)−1.25)
to Waveshaper2 to fold back all signals twice. Figure 2.98 shows the
structure with the transfer curve. Note the absence of distortion in the
−1.25 to 1.25 V range. Multiplying the input by 0.25 scales −5 to 5 volts
to this range. Subtracting 12 dB from the Drive amount yields similar
results because 10–12/20 = 0.2511.
You may use a sine function to soften the fold-back. If you introduce
the function
5 ∗ sin(x ∗ 1.5)
Figure 2.99
105
Chapter 2 Designing VST Effects in SynthEdit
… the Waveshaper first provides soft distortion, then folds the signal
back in a soft curve twice, and finally clips it to ±5 volts. Presto, there
you have your all-purpose sound softener. Figure 2.99 charts the trans-
fer curve. To fold back the signal softly just once before clipping, use:
5 ∗ sin(x ∗ 0.9)
Go-to files:
Effects\Distortion\fold-back1.se1
Effects\Distortion\fold-back2.se1
Effects\Distortion\fold-back3.se1
So, where do these frequencies come from? The answer lies in the
Nyquist-Shannon sampling theorem. It states that the frequency band-
width equals half of the sampling frequency. Dividing the sampling
rate by 2 gives you the Nyquist frequency. The highest frequency at
48 kHz is thus 24,000 Hz. Now if you sample a signal with a frequency
higher than the Nyquist, this frequency aliases back to the spectrum. In
other words, frequencies above the Nyquist are mirrored below it, cre-
ating a signal with another frequency. Case in point: If we wish to sam-
ple a 28 kHz signal at a 48 kHz rate (and 24 kHz bandwidth), we will
create a 20 kHz signal instead.
106
Getting Down and Dirty with Distortion Effects
107
Chapter 2 Designing VST Effects in SynthEdit
Heads up:
❖ Add a low-pass post-filter to smooth high frequency harmonics cre-
ated by distortion.
❖ Some plug-ins drop a band-pass filter in front of the distortion unit
to shape timbre. It’s also good for reducing aliasing.
❖ Some plug-ins use combinations of different distortion types to con-
jure distinct sounds.
❖ Post-equalization gives users another sound-sculpting tool.
Go-to files: Effects\Distortion\distortion1.se1
108
Getting Down and Dirty with Distortion Effects
109
Chapter 2 Designing VST Effects in SynthEdit
Heads up:
❖ An sc:Quantizer module is fully compatible with the in-built Quan-
tizer, but consumes far less CPU power.
❖ Lance Putnam’s LP-BitCrush module creates the same lo-fi effects,
re-sampling, and bit reduction.
Go-to files:
Effects\Lo-fi\resampler1.se1
Effects\Lo-fi\resampler2.se1
Effects\Lo-fi\bitcrusher1.se1
Vocoders
Vocoders were designed in the 1930s to encode and transmit voice sig-
nals via phone lines, and then decode, synthesize, and render the origi-
nal voice. The name is a portmanteau of voice and encoder. They usually
analyze the spectrum of the input signal by splitting the input signal—
called the modulator—into different bands using band-pass filters.
Then they transmit this spectral data to another signal called the carrier
using voltage-controlled amplifiers. This effect lends a vocal quality to
synthesizers, guitars, drum loops, and the like.
Robert Moog introduced vocoders to music in the 1970s when he devel-
oped a ten-band device used by Wendy Carlos in the soundtrack to
Clockwork Orange. A Moog synth provided the carrier signal; a micro-
phone the modulator signal. Many artists since have used vocoders in
pop music. Countless Hollywood robot voices came courtesy of vocod-
ers.
Many analog vocoder units surfaced in the ’70s and ’80s, sporting from
ten to 32 frequency bands for analysis and synthesis. Most used four- or
six-pole band-pass filters with steep 24 to 36 dB/octave slopes to sepa-
rate frequency bands. Steep filters reduce overlapping and interference
between bands, improving encoded speech intelligibility. Figure 2.104
is a diagram of a vocoder.
110
Vocoders
Creating a Vocoder
DH_MultiFilter2 is a fine choice of band-pass filter for many reasons.
For one, the Filter Stages switch makes its steepness easy to adjust. A
two-pole band-pass filter has a 12 dB/oct. slope. With every added stage,
the number of poles increases by two. So, three does the trick for a
36 dB/oct. slope. For the other, peak gain is normalized to 0 dB in BP2
mode. This lets you adjust the filter’s Q factor and, by extension, its
bandwidth, without dialing in big differences in gain. The third reason
is that its internally cascaded filter stages are CPU-friendly.
Even if you’re not obsessively tidy, it’s wise to put each band in its own
container. Figure 2.105 maps the structure of one vocoder band. First,
the filters process both the modulator and carrier signal. Then a Peak
Follower module extracts the modulator signal’s envelope, whose volt-
age controls the carrier band’s amplitude. The Level Adj module acts as
a VCA, adjusting the carrier’s volume. We set the DH_MultiFilter2
modules to BP2 mode, and filter stages to three. The input mode is
Pitch/Res, making it easy to space the bands equally in the logarithmic
frequency domain.
111
Chapter 2 Designing VST Effects in SynthEdit
Figure 2.106 shows a vocoder structure with ten bands. Modulator, Car-
rier, Bandwidth, Attack, and Decay plugs connect to all the bands.
Bands are spaced 3⁄4 octave apart. Pitch voltages are 3.25, 4, 4.75, 5.5,
6.25, 7, 7.45, 8.5, and 9.25, roughly translating to 130, 220, 370, 620,
1050, 1760, 2400, 4500, and 8400 Hz, respectively.
We named the lowest band LP Band, and used a two-stage (24 dB/oct.)
low-pass filter rather than a band-pass filter. HP Band designates the
highest band, and as the name suggests, the container uses a 24 dB/
octave high-pass filter. Analog gear often uses the same ten-band setup
to cover the full frequency spectrum. Despite the few bands, you’ll find
the speech reasonably intelligible. Detecting voiced and unvoiced
sounds helps improve intelligibility, as you will soon discover.
Figure 2.107 outlines a rudimentary stereo vocoder’s structure. This
prefab’s carrier is an oscillator-generated saw wave. Though this is a
common analog setup, you could replace it with something as complex
as a full-fledged polyphonic internal synth engine. The stereo input sig-
nal is the modulator.
112
Vocoders
113
Chapter 2 Designing VST Effects in SynthEdit
Improving Intelligibility
Vocoded speech sounds lifeless. Analog vocoder units often feature a
white noise generator to simulate unvoiced sounds. Most unvoiced
sounds, like the consonants s, t, k, and f, comprise high-frequency hiss
with some resonant frequencies. Detecting the level of frequencies
above 4 kHz serves to assess the sound’s fricative quality. Our example
does this by filtering frequencies below 4 kHz, and then using this con-
trol signal’s envelope to adjust the white noise level. To see how this
works, look no further than figure 2.108.
Adding this noise to the carrier signal notably improves speech intelli-
gibility. Figure 2.105 is a snapshot of this structure.
The Noise knob adjusts the level of noise used to fake unvoiced and fri-
cative sounds. Employ only a noise source for the carrier signal, and
you will get something akin to robotic whispering.
Go-to files: Effects\Vocoder\vocoder2.se1
114
More Mischief with Multi-band Processing
115
Chapter 2 Designing VST Effects in SynthEdit
Crossovers
Crossover filters are key ingredients of a multi-band processor. Choose
the filters carefully because they go a long way towards determining the
processor’s characteristic and transparency. A crossover filter separates
frequency bands, yet it must retain a flat output when the two bands
mix. Its phase response is also important for retaining transient trans-
parency and minimizing band interaction.
Crossovers generally come in two categories, finite impulse response
(FIR) and infinite impulse response (IIR) filters. FIR filters’ linear
phase is an advantage because it benefits transparent band separation.
At the time of writing, FIR crossover filters were unavailable in Synth-
Edit. Most built-in and third-party filters—one-pole, state variable,
biquad and Moog—are recursive IIR filters. Now let’s look at the most
important IIR crossover filters, hopefully without getting too tangled in
filter theory.
One-pole Filters
The simplest crossover uses one-pole filters to separate the two bands.
Surely the most straightforward option is to apply a one-pole low-pass
filter to a signal, and then subtract the low-pass output from the origi-
nal input. This yields the high-pass output, and also ensures the low-
pass and high-pass filters’ sum equates to the original sound. Figure
2.111 graphs a one-pole low-pass and high-pass filter’s frequency
response.
116
More Mischief with Multi-band Processing
One-pole filters’ phase and transient responses are strong, but with just
6 dB/octave slope, their band separation is weak. Figure 2.112 depicts a
rudimentary one-pole crossover.
Linkwitz-Riley Filters
The speaker industry values Linkwitz-Riley filters for their flat summed
output and good band separation. Let’s see if we can second that emo-
tion by cascading two Butterworth filters, each with −3 dB gain at the
cutoff. The cascaded filters’ gain at the crossover frequency is −6 dB,
which comes to 10–6/20 = 0.5. If the low-pass and high-pass filters’ gain
is 0.5 each at the cutoff and you add them, their sum equals one, that is,
a flat frequency spectrum. Figure 2.113 tracks the frequency response
of 24 dB/oct. L-R crossovers. The dashed line runs at −6 dB. This is
where the low-pass and high-pass responses meet, yielding a flat sum.
117
Chapter 2 Designing VST Effects in SynthEdit
118
More Mischief with Multi-band Processing
equals −3 dB. Then set Filter Stages to two to cascade two filters in
serial array. No need to invert polarity here. The four poles yield a sum
360-degree phase shift, so the two outputs are in phase. Figure 2.115
shows the structure.
This should cover the basics, for more math behind Linkwitz-Riley
crossovers, click to http://www.linkwitzlab.com/crossovers.htm.
Go-to files: Effects\Multiband\crossovers.se1
119
Chapter 2 Designing VST Effects in SynthEdit
120
More Mischief with Multi-band Processing
at the pass, so to speak. Users can select Lows to patch only the low
compressor’s outputs signal out, and Highs to patch only the high com-
pressor’s signal out. Both compressors’ outputs connect to the Both
plug, which enables users to tap a composite of the two bands.
121
3
Stepping Up to Synthesis
Our trek through modular audio processing has arrived at an interest-
ing juncture—sound synthesis. Synthesis entails generating audio sig-
nals electronically or digitally. Some synthesis techniques aim to repro-
duce the sound of real-world instruments. Others strive to create
unprecedented, unique, or outright bizarre signals. The most common
synthesis technologies are subtractive, frequency and phase modula-
tion, wavetable, physical modeling, additive, and phase distortion.
Subtractive synthesis may well be the most widespread of the bunch. It
uses different filters to selectively cull frequencies from a wave pro-
duced by oscillators and other sound sources. Digital Yamaha synths
like the DX7 popularized frequency modulation synthesis. Ironically,
they actually used phase modulation, where a waveform modulates the
phase of another oscillator, to do this. Later more synthesis technolo-
gies surfaced, some of which featured fixed wavetables stored in mem-
ory; others mimicking the sound of physical instruments through
physical modeling. Phase distortion synthesis is akin to FM synthesis,
where changing a sine wave’s phase shapes timbre. Additive synthesis
creates sound by adding sine partials rather than subtracting ingredi-
ents of a spectrally rich signal. This chapter deals with the two key
methods of synthesis, subtractive and FM synthesis, explaining their
theory and implementation in SynthEdit.
Heads up: See also the Appendix for a brief history of synthesizers.
123
Chapter 3 Stepping Up to Synthesis
Saw and pulse waves’ spectral content is very rich. For example, a saw
wave with a base frequency of 500 Hz comprises harmonics spaced at
equal intervals, with exponentially decaying amplitude as shown in fig-
ure 3.2. However, many physical instruments’ harmonics’ amplitude is
lower at high frequencies. Filtering the waveform’s high frequency con-
tent simulates this, conjuring a smoother, darker sound. Figure 3.3
shows the same waveform filtered at 2 kHz using a 24 dB/octave reso-
nant low-pass filter. This resonance boosts harmonics at around 2 kHz.
Beyond that, the amplitude now decays at a rate of 30 dB per octave,
that is, faster than in the original spectrum.
124
Less Is More with Subtractive Synthesis
Modulating the filter’s frequency with an envelope lets you vary spec-
tral content over time, say to simulate damping. Usually, another enve-
lope modulates the main amplitude contouring the volume curve. This,
in turn, serves to mimic fast percussive instruments and slow strings
and pads. Figure 3.4 shows a filtered signal’s waveform and spectro-
gram. We applied an envelope to both the amplitude and filter cutoff
frequency. You’ll find the amplitude envelope in the waveform graph,
and the filter envelope in the spectrogram.
125
Chapter 3 Stepping Up to Synthesis
More on MIDI
Before we delve into how to create a subtractive synthesizer, let’s look at
the way instruments communicate. Arriving in the early 1980s, the
MIDI (Musical Instrument Digital Interface) standard aimed to stan-
dardize communication between instruments and synthesizers. Today
musicians everywhere use it for digital communication among instru-
ments, and to control sequencers, synths and effects. MIDI messages
use 16 independent channels to pipe messages to and fro. These mes-
sages include note-on, note-off, pitch bend, mod wheel, control change,
program change, aftertouch, and SysEx messages. Encoded as integer
numbers, they represent notes. MIDI note number 69 corresponds to
A4 (440 Hz), note 70 to A#4, 71 to B4, and so on.
Though both instrument and effect plug-ins can receive MIDI data,
effects lacking a MIDI input run just fine. SynthEdit offers the Plug-in
is Synth option in the Save as VST panel only if the main container
sports a MIDI input plug. Otherwise, it assumes the plug-in is an
effect.
126
Less Is More with Subtractive Synthesis
You could mouse-click the tiny keyboard on your screen to play notes.
The Keyboard module also responds to keystrokes on a keyboard by
producing MIDI notes. This layout resembles two rows of piano key-
boards mapped to letters. Z to M and Q to P signify white keys, while S,
D, G, H, J, 2, 3, 5, 6, 7, 9, and 0 represent the black keys. You’ll find a
chart showing how notes are mapped in figure 3.6.
127
Chapter 3 Stepping Up to Synthesis
Pressing a key elicits a saw wave with the assigned pitch. Be sure to
turn your speakers down before doing this, as the saw wave’s volume
may be very high. The synth converts the MIDI note to pitch at 1 volt/
octave. This pitch controls the oscillator’s frequency. At 10 volts, the
Gate’s output remains high until you press any note, and returns to its
low 0-volt value when you release the last key. Pressing a key triggers
envelopes and other events. In our example, it controls the VCA’s vol-
ume, which adjusts the oscillator’s amplitude. Pressing any key trig-
gers the signal at peak level; releasing all keys mutes the signal. This
primitive on/off design is the cave dweller among synth controllers.
MIDI to CV Properties
Now let’s examine the MIDI to CV module’s controls.
Channel: By default, the module responds to all MIDI channels. You
may limit it to one by picking a MIDI channel from Channel the selec-
tor.
Bend Range: The pitch-bend default setting is 12 semitones. Many
synths offer different pitch-bend ranges, including two semitones.
Specify the range here. If you connect a control to this plug and slap
this feature on the GUI interface, your users can select the pitch bend
wheel’s bend range.
Mono Mode: This plug shoehorns the synth into mono mode to spare
CPU power. Simply set it to On if you wish to conjure a monophonic
synth.
Retrigger: Designed to work in mono mode, it retriggers envelopes
when playing legato. Legato is a fancy term for playing another note
before releasing the previous one.
Portamento Time: Use this control to create portamento effects in legato
mode. Portamento means a continuous gliding movement from one
tone to another. So if you hit a note before releasing its predecessor, the
pitch gradually morphs over a defined time. Often called glide, you can
create a similar effect by squeezing in a one-pole low-pass filter after
the Pitch plug.
Mono Note Priority: Offering Off, Low, High, and Last settings, it con-
trols the synth’s response in mono mode. Play two or more notes in
Low mode, and it uses the lowest pitch. Set to High mode, it uses the
highest pitch. Last plays the first note again if you press and hold one
key, while pressing and releasing another.
128
Less Is More with Subtractive Synthesis
Heads up:
❖ MIDI to CV is territorial; only one can live in one container. Drop
another MIDI to CV module into the container or a sub-container,
and you will get an error message:
You have several “MIDI to CV,” “Soundfont Player,” or “Drum Trig-
ger” modules together. Put each in its own container.
❖ When mono mode is disabled, the Polyphony setting in the con-
tainer’s Properties window defines the polyphony for the MIDI to
CV module in that container.
❖ SynthEdit converts a signal to mono as it leaves the container. This
is why we mustn’t place the MIDI to CV module in a separate con-
tainer. If we did, the control voltages for polyphonic voices would
add up, creating some very seasick off-pitch notes.
129
Chapter 3 Stepping Up to Synthesis
To test our little rig, connect a Keyboard or MIDI in module to the con-
tainer’s MIDI In plug so you can play notes. Wire its outputs to a
Sound Out module so you can audition the results. Figure 3.8 shows
what this looks like.
Play several notes at the same time, and our synth will generate them.
Open the oscillator’s Properties window to view the number of voices
and active oscillator clones. The green dots at the oscillator’s top left
corner point out polyphony. Figure 3.9 shows six voices, with three cur-
rently active.
130
Less Is More with Subtractive Synthesis
Figure 3.9: Look here to see how many voices are active
131
Chapter 3 Stepping Up to Synthesis
Again, the Overall Level plug defines the envelope’s peak level. The
attack value decides how long it takes for the signal to reach this peak.
It then decays to a level specified by the Sustain plug, remaining con-
stant until the Gate plug’s voltage is high. The Decay plug determines
how long this transition takes. Release the key—the gate signal’s volt-
age dips—and the envelope’s level tapers off to 0. The Release plug
determines how long this takes.
Attack, decay, and release plugs’ scale is exponential. The rules for con-
version are:
log (Time)
Volts = + 6.6666
log(2)
Time is specified in seconds. This means the 0-to-10 volts range equals
9.8 ms to 10.07 seconds. Negative voltages also work. Fast, percussive
attacks may mandate even shorter times. But if the time is too short,
pressing and releasing keys may elicit clicks. This is why some synths
limit the shortest time to about 1 ms. Some filters also produce clicks at
hair-trigger release times. A good, flexible scale ranges from −3.2991
(1 ms) low to 9.9885 (10 sec.) high.
David Haupt’s BasicModulePak offers a free module that converts mil-
liseconds to voltage. A voltage-to-millisecond converter module was
unavailable at the time of writing, but you can easily whip one up with
Waveshaper2. Figure 3.11 shows a structure that converts voltage to
time. The Waveshaper’s input range is −5 to +5 volts, so the input must
first be multiplied by 0.5. Using x ∗ 2 instead of x in the equation
restores the original value.
132
Less Is More with Subtractive Synthesis
Once you have built a voltage-to-time converter prefab, you can crown
you efforts with a readout showing the value in seconds. You may rec-
ognize the structure; it leans heavily on the knobs we used in the
Effects chapter. The prefab in figure 3.11 converts voltage to time. The
setup below converts time to a GUI float value, sending it to a Text
Entry2 module for display. Figure 3.12 shows this structure.
Twist this knob and the exact values appear on the GUI as in the exam-
ple in figure 3.13.
133
Chapter 3 Stepping Up to Synthesis
Adding Oscillators
Our first example featured an unsophisticated design sporting a lone
oscillator. Most subtractive synths offer two or three oscillators for each
voice to fatten up sounds. Most oscillators are de-tunable, meaning you
can pitch one oscillator frequency slightly higher or lower than the
other for a bubblier, chubbier sound. Many synths also offer octave or
coarse tuning.
You’ll find a Detuner prefab in the Insert > Controls group. Figure 3.14
shows its structure. Two List plugs are on board; one selects octaves,
the other notes. The Octave plug offers −2, −1, 0, 1, and 2 volts. If you
open the fixed values for Note, you will see 0, 0.0833333333,
0.166666666666, 0.25, and so on. Let’s see what these numbers are all
about: Oscillators usually work with one volt per octave. This means
adding one volt to a pitch detunes the note by one octave. Say you wish
to detune a pitch by one semitone. An octave comprises 12 notes. To
detune a pitch by one semitone, you must add 1/12 to the original
pitch, or roughly 0.083333333 volts. Add 2/12, or about 0.1666666 volts,
to detune by two semitones; 3/12 or 0.25 volts for three steps, 4/12 or
0.3333333 volts for four, and so on. There you have the Fixed Values’
decimal numbers’ origins.
134
Less Is More with Subtractive Synthesis
In this prefab, you’ll find a knob wired to the Fine plug. Its values run
from 0 to 0.08333333333, or 0 to 1 semitones for fine-tuning. You can
extend the control range from −0.08333333333 to 0.08333333333, or −1
to 1 semitone.
Now feast your eyes on a structure with two oscillators, each featuring
detuning controls, in figure 3.15. A detune prefab connects to each of
the oscillator’s Pitch plugs. This lets users tune the two oscillators indi-
vidually and relative to the base pitch provided by the MIDI to CV mod-
ule. We added two knobs for adjusting the oscillators’ level. The Level
Adj modules send these signals to the VCA’s Signal plug, where they
merge. You’re familiar with rest of the structure (the ADSR), so we
spared you a diagram. Though this structure still lacks a filter, you can
conjure some simple lead and pad sounds. Play a couple of notes and
fiddle with the detuning and envelope settings to see what you get.
135
Chapter 3 Stepping Up to Synthesis
Pulse Width
Note that we added two knobs for adjusting pulse width, although they
only shape the waveform when a pulse waveform is selected. Telecom
and electronics engineers call this the pulse wave’s duty cycle. Figure
3.16 shows pulse waves at different pulse width settings.
Different pulse widths’ spectral content varies, lending the wave differ-
ent characteristics. Subtractive synths often use LFOs to modulate
pulse width, achieving a rich flavor similar to the sound of two detuned
oscillators.
In SynthEdit, 0 volts yields a symmetrical waveform. As you jack up the
pulse width value, the waveform grows increasingly asymmetrical.
Approaching 10 volts, it’s more of a short spike. Feel free to use a
Scope2 module—its oscilloscope analyzes signals—from the Insert >
Controls menu to check the waveform’s shape.
136
Less Is More with Subtractive Synthesis
More on Waveforms
The oscillator offers sine, saw, ramp, triangle, pulse, white noise, and
pink noise waveforms. A ramp sounds much like a saw wave because
they share the same shape, though the ramp’s is inverted. Used as an
LFO, it provides falling rather than rising voltage.
The two flavors of noise are white and pink. White noise’s power spec-
tral density is flat, yielding a sharp, bright sound. It serves to create per-
cussive instruments such as snare drums and hi-hats, and spectral
effects. Pink noise’s power density decays at −3 dB per octave for a
softer, darker sound.
Two noise oscillators are usually one too many. Apart from noise type,
there are generally no other parameters to tweak for a noise generator.
You can build a more versatile synth by confining the oscillators’ wave-
forms to sine, triangle, saw, and pulse, and adding a separate noise
oscillator with a dedicated level knob. Figure 3.18 shows how this
works.
137
Chapter 3 Stepping Up to Synthesis
Aptly named Noise, the third oscillator’s waveform is now a white noise
generator. It features a dedicated Level Adj module sporting a Noise
knob. If the Limited List Entry prefab that selects the two main oscilla-
tors’ waveform looks familiar, you may remember it from the “Effects”
chapter. Its list offers sine, triangle, saw, and pulse waves. To see the
full setup, give figure 3.19 a gander. The List to Bools module’s Spare
plug connects to the Bools to List module’s Sine, Triangle, Saw, and
Pulse plugs in that order to create the list.
138
Less Is More with Subtractive Synthesis
Figure 3.19: Limiting waveforms to sine, triangle, saw, and pulse looks like
this
Enable Smooth Peaks and the waveform will resemble a saw wave,
more or less. Disable it, and a big ripple appears at the edge. How
come? Put simply, the waveform is band-limited, meaning that its fre-
quencies range no further than from 0 Hz to half the sampling rate.
The Fourier series tells us summing an infinite number of sine waves
creates a band-limited saw wave. Summing a limited number of sine
waves creates what scientific types call the Gibbs effect; we’d call it rip-
139
Chapter 3 Stepping Up to Synthesis
ples at the edges. The same happens to other waveforms with sharp
edges—ramp and pulse come to mind. So, this rippling waveform is a
fixture in the digital domain. Smooth Peaks curtails the effect, but also
diminishes high frequency content above 4 kHz, as a look at the fre-
quency analyzers in figure 3.21 will confirm.
Enabling Smooth Peaks is a good idea for LFOs; otherwise the Gibbs
effect may introduce weird artifacts near the waveform’s edges. If you
prefer brighter-sounding oscillators, disable this option.
Sizing Up Filters
A subtractive synth without a filter is an exercise in blandness—a curry
dish without spices. Filters lend sounds their flavor by boosting and
cutting the oscillators’ frequencies. So, let’s first review the different
breeds of filter.
Figure 3.22: A small selection of SV filter transfer curves (LP and HP mode)
140
Less Is More with Subtractive Synthesis
Selecting Type
A simple method of selecting the filter type is using a Many → 1 switch.
Look no further than figure 3.23 for an example. But simplest is not
always smartest. You’ll find a 1 → Many switch is a more efficient tool.
See the Optimization chapter’s SV Filter section to learn more.
Resonance Levels
Try adjusting an SV Filter’s pitch and resonance parameters and you
may discover the filter’s resonance spikes somewhere around 10 volts.
This is rarely desirable, and may cause clipping. Also, the resonant
response is nonlinear in the dB scale, as a glance at figure 3.24 attests.
Around 10 volts, the resonance value skyrockets close to the point of
self-oscillation. To prevent this, you may want to confine the resonance
knob’s highest value to about 9.8 volts, or roughly 30 dB resonance.
Heads up: Scoofster SVF, a third-party SV filter, uses the more conve-
nient decibel scale for adjusting resonance. This filter also spares CPU
power in some modes.
141
Chapter 3 Stepping Up to Synthesis
142
Less Is More with Subtractive Synthesis
Mixing Outputs
Some synths let users mix a state variable filter’s low-pass, band-pass,
and high-pass outputs, which beats having to settle for just one type.
Users may then merge various filter outputs and mix their levels to
conjure unique sounds. The only drawback in SynthEdit is the more
outputs you connect, the slower SV Filter runs. Besides, the Level Adj
modules also devour CPU resources. Simply using low-pass, band-
pass, high-pass and band-reject modes is more efficient but less fun.
Figure 3.27 shows an example prefab.
143
Chapter 3 Stepping Up to Synthesis
Based on the preceding prefab, this version first normalizes the output
level to compensate for resonance gain. The Low, Band, and High
plugs patch the low-, band-, and high-pass signals out. The Level Adj
modules tweak these signals’ levels and feed them to the IO Mod,
which blends the batch. Users may dial in unique filter characteristics
by varying these levels. The three outputs change the signal’s phase in
different ways, sometimes creating notches. Mixing Low Pass and Hi
Pass outputs creates a band-reject filter. Negative voltages are good to
go, so entering something like 10 and −10 volts for the low and high
values compels the prefab to subtract the high-pass from the low-pass
output. This evokes a flat response with a resonant peak at the cutoff
frequency, great for adding resonant peaks to a signal.
Heads up: State variable filters are all-pole filters, meaning they boost
high frequencies even when the resonance value is low. This affects
band-pass and high-pass outputs more than the low-pass output. And
mixing these outputs adds a touch more gain.
Biquad Filters
Although SynthEdit version v1.0150 lacks biquad filters, they are com-
monly used in digital filter design. Biquad is short for biquadratic, a
second order filter comprising two poles and two zeros. Many third-
party filters feature this topology, including DH_BiquadFilter,
DH_MultiFilter2, and EVM LP Filter. Scoofster Low-pass also uses a
modified version of a biquad structure.
144
Less Is More with Subtractive Synthesis
145
Chapter 3 Stepping Up to Synthesis
Speed ++ + +++
Highs + ++ +++
Lows +++ ++ +
Resonance ++ ++ ++
146
Less Is More with Subtractive Synthesis
module controls the two oscillators and the ADSR. The subsequent
stage adjusts the noise generator and oscillators’ levels, mixes these sig-
nals, and feeds them to the filter. The VCA applies a volume envelope
before the signal leaves the synth.
Before we build this structure, let’s streamline the synth we created ear-
lier. First we’ll introduce a simple Mix prefab for mixing the oscillators’
outputs. This is nothing more exciting than an empty container with an
input and output as shown in figure 3.30. If you patch several signals
into the In plug, the prefab mixes them and routes the composite
through to the Out. This prefab may seem superfluous now, but it will
make wiring easier later. Before you can make this connection, you
must first wire up the IO Mod’s Spare plug. Then connect the input to
the output, and delete the other wires.
Dropping the oscillators with the Tuners and Level Adj modules into a
separate container makes the structure easier to work with. To do this,
press and hold Shift, and select the Tuner, Oscillator, and Level Adj
modules for an oscillator via mouse-click. Then execute the Edit
menu’s Containerise Selection command. You may have to change
labels or rearrange the plugs’ order. If you like the results, repeat the
procedure for the second and third oscillators. Feel free to reference fig-
ure 3.31; it shows the final structure without the VCA envelope. With
all the components apart from GUI features tidied up in containers,
you’ll find the going much easier.
147
Chapter 3 Stepping Up to Synthesis
Figure 3.31: Make mom proud and put those oscillators away in containers
148
Less Is More with Subtractive Synthesis
149
Chapter 3 Stepping Up to Synthesis
To add a filter envelope, select the VCA ADSR with its control knobs,
copy the whole kit, and paste it into the picture. Connect the MIDI to
CV module’s Gate plug to the newly created ADSR’s Gate plug, and the
envelope’s Signal Out plug to the SV Filter’s Pitch plug. Now every note
triggers an envelope that the synth applies to the filter’s cutoff fre-
quency, thereby modulating it. Figure 3.35 shows the resulting enve-
lope section.
Figure 3.35: An Envelope section with dedicated volume and filter enve-
lopes
150
Less Is More with Subtractive Synthesis
Negative Envelopes
The Overall Level plug’s value adjusts the amount of modulation
applied to the cutoff, with one volt equaling one octave. Some synths
also offer negative modulation. If you enter a negative voltage to the
Overall Level plug, the envelope flips as shown in figure 3.36. You have
two options for adding positive and negative envelopes. One is to set
the Level knob’s control range to −10 to 10 volts. The 12 o’clock position
is passive, meaning that it prompts no modulation. Twisting the knob
clockwise dials in a positive envelope; counterclockwise dials in a nega-
tive envelope.
Here’s the other method for adding negative envelopes: Stake out a
range of 0 to 10 volts, and add a 1 → Many switch with an Inverted
module to one of the chains. Its setting determines if the knob’s value
is inverted, with a neutral or zero setting precluding modulation in
both modes. Figure 3.37 gives an example of this structure. Setting the
Invert switch to On flips the envelope over.
151
Chapter 3 Stepping Up to Synthesis
152
Less Is More with Subtractive Synthesis
Go-to prefabs:
Synthesis > ADSR Exp
Synthesis > PolySynth8
Heads up: David Haupt’s DH_EnvSeg module lets you create enve-
lopes with any number of sections. It also lets you specify the response
curve’s individual sections. For more on this, see the module’s docu-
mentation.
153
Chapter 3 Stepping Up to Synthesis
tracking value. You may wish to extend the cutoff range beyond 10 volts
so key-tracking does not unduly affect the highest frequency when play-
ing low notes. You’ll find a streamlined structure depicting how to con-
nect the Keytrack prefab to the filter in figure 3.42.
154
Less Is More with Subtractive Synthesis
switch that changes the routing mode. And they let you do things like
use a stereo filter to create big, bold sounds by panning the oscillators
sited in front this filter. Frequently a saturation stage follows the filter,
spicing it up with unique sonic flavors. Be sure to bear aliasing in mind
when you give users the tools to saturate or distort signals.
Modulation
A subtractive synth without proper modulation possibilities is a car
without tires—it’ll go, but not very far. Most synths feature one or more
low frequency oscillators. Some boast added envelopes and various
MIDI modulation sources, such as mod wheel, velocity, aftertouch, and
control change messages. You can usually route these to filter cutoff,
pulse width or oscillator pitch, filter resonance, modulation depth, and
sometimes to other destinations. A 1 → Many switch can serve to select
the modulation sources’ destination, but a modulation matrix is more
convenient for mapping modulation sources. A mod matrix lets you
choose sources and destinations, and adjust amounts. Some mod
matrixes offer several destinations for each source with a dedicated
amount knob for each modulation routing. So let’s look at these modu-
lation sources.
LFOs
Synths’ and effects’ low-frequency oscillators are much the same. Most
synths’ LFOs offer frequencies ranging from 0.01 to 30 Hz. Some offer
Sample and Hold so that pressing a key retriggers the LFO. This lets
users do stuff like trigger a random constant voltage at every note-on
message using a noise waveform. If you want two LFOs, simply add
two oscillator modules. Enable Smooth Peaks in the Properties win-
dow—it is the default, but check to confirm this. This option prevents
ripples at the waveform edges. Connect a List selector to each Wave-
form selector. Set Pulse Width to 0 to conjure a symmetrical pulse
wave, or insert a dedicated pulse width knob for each LFO. The Rate
knobs used in this synth are the same as those in the Effects chapter, so
we’ll spare you another structural diagram. The only difference is that
these knobs’ high value is 30 Hz (1.1255 volts). The modulation cir-
cuit’s level adjustment determines modulation depth, as you shall soon
see.
155
Chapter 3 Stepping Up to Synthesis
Heads up:
❖ By default, an LFO is monophonic unless a polyphonic signal
arrives at an input. If you wish to assign an LFO for each voice, you
could connect the MIDI to CV module’s Gate plug to the oscillator’s
PM Depth plug and set the Phase Mod plug to 0. This does not
affect the LFO waveform, but it does coerce the LFO into doing the
polyphonic thing. Be aware that this polyphonic capability takes a
bite out of the CPU pie even when the LFO isn’t modulating.
❖ If you wish to retrigger the LFO’s waveform at every note, patch the
MIDI to CV module’s Gate signal to the oscillator’s Sync plug. This
is another case of coerced polyphony. If you prefer a monophonic
LFO, drop a Voice Combiner module from the Insert > Special
group in front of the Sync plug. It squeezes the signal into mono
format.
❖ Combining an LFO and a Sample and Hold module can conjure
interesting effects. Try this on for size: Insert a Sample and Hold
module after the LFO and connect the Gate signal to the S&H mod-
ule’s Hold plug. Then it retriggers only when you hit a note. The
LFO puts out a polyphonic signal. If you prefer a monophonic sig-
nal, use a Voice Combiner module to convert the Gate signal. Use
an S&H module on a noise waveform to trigger random constant
voltages in response to every note-on message. Figure 3.44 pictures
a monophonic S&H LFO structure.
156
Less Is More with Subtractive Synthesis
Some synths offer a delay parameter for the LFO to determine the time
the LFO modulation takes to reach peak level from 0. You can do this
too by applying a separate envelope, triggered by the Gate signal, to the
LFO that controls signal level. Keep an eye on those polyphonic signals,
though.
Go-to prefabs: Synthesis > SnH LFO
Envelopes
A little structural modification is all it takes to use the filter envelope as
another modulation source. Figure 3.45 shows a modified version of
the mock exponential envelope. The EnvMod plug controls the enve-
lope’s level, and sends the signal to the Mod Out plug. It modulates the
filter’s pitch much like in the unmodified version. The difference here
is that the Env Out plug takes its source from the full level envelope,
before the level adjustment. This means it can serve as a modulation
source.
MIDI Messages
MIDI commands come in many guises. Called velocity, mod wheel,
pitch bend, control change, and aftertouch messages, all serve as mod-
ulation signals. The MIDI to CV module delivers velocity and after-
touch values direct. SynthEdit’s MIDI folder offers a Controller module
that affords access to the others. It sports default outputs for aftertouch
and pitchbend, as well as four user-definable outputs for MIDI CC
(control change) messages. An individual Type selector for each lists
157
Chapter 3 Stepping Up to Synthesis
available control change messages. This list also describes the typical
functions of some CC messages, like 1—Mod Wheel, 2—Breath, 7—
Volume, and so on. You can set these to a fixed CC number, or let your
users freely select the number of CC messages used as modulation
sources.
Figure 3.46
158
Less Is More with Subtractive Synthesis
tinations, simply connect the Spare Output plug to the desired destina-
tion plugs. They will then appear in the list. The Pulse Width and Pitch
plugs connect to the Pulse Width and Pitch plugs of both oscillators,
meaning that a source can be routed to two or more destination plugs
at the same time. If you wish to rename the source and destination
slots, open the switches’ Properties window and change the labels.
The Depth knob bases on the Knob Sm prefab in the Controls folder.
Figure 3.49 delineates its structure. The knob’s range is 0 to 10 volts.
Converted to volts, the signal feeds both inputs of a Level Adj module.
Much like the Level Adj used in the envelope, it transforms the linear
scale into a mock exponential scale for greater tweaking precision, par-
ticularly for low values. Next comes a switch enabling users to invert
the signal. Now, what is that good for? Say the envelope addresses the
oscillators’ pitch. By default, the modulation invokes a positive pitch
change. The Invert switch lets your users select a negative envelope. Of
course, assigning the knob a control range of −10 to 10 volts also does
the trick, but then the Level Adj module converts all negative levels to
positive levels. Using an invert switch is quite convenient for setting
the modulation depth.
159
Chapter 3 Stepping Up to Synthesis
Take a moment to examine the source plugs in figure 3.48 and find the
None setting. To enable it, a connected Fixed Values module produces a
constant 0 volts. This switches off all modules in the path, which light-
ens the CPU load. We created the Velocity and Aftertouch sources by
connecting these MIDI to CV plugs to the switch’s Spare Input plug.
The filter envelope’s Env Out plug supplies the Filter Env source. The
Controllers module’s first controller, which is the Mod Wheel by
default, delivers the modwheel input signal. Looking for inspiration for
your GUI layout? Then look no further than the modulation matrix in
figure 3.50.
Heads up: David Haupt offers a module pack for creating versatile
modulation matrices. It lets users adjust the modulation amount for
each target individually. You’ll find a screenshot in figure 3.51. See the
module’s pack documentation for details.
160
Less Is More with Subtractive Synthesis
You can create similar controls for oscillators. Divide the value by
0.083333 to show the fine-tuning amount in semitones. Feel free to edit
the List Entry2 prefab’s panel layout. To this end, open the List Entry2
container’s panel window. Then arrange the features—arrows, labels,
and list box—any way you see fit, perhaps like the example in figure
3.53.
161
Chapter 3 Stepping Up to Synthesis
Heads up: Clicking a list box opens a drop-down menu. If you wish to
prevent this and use the Dropdown List sub-control strictly for readout,
cover it with a transparent bitmap.
Adding Effects
Many digital and VSTi synths offer effects ranging from simple delay
and chorus to elaborate racks brimming with saturation, delay, reverb,
flanger, and phaser effects. Place saturation and distortion effects after
the filter if you want to saturate each voice. Insert a global distortion
effect after the VCA and a Voice Combiner module. Most other effects
perform best when placed after the VCA. If you use nonlinear modules
in the effect chain, cloning creates one for each voice, possibly wasting
CPU power. A Voice Combiner module prevents this problem.
The Effects chapter x-rays the effects’ internal structure, so we won’t
cover the same ground here. To ensure your synth delivers the best per-
formance with effects, be sure to get a handle on sleep mode, the vari-
ous routings, and polyphonic cloning. The “Making the Most of Perfor-
mance” chapter covers these topics in details; be sure to read it care-
fully. Also note that effects routing influences tone; for example, delay
and chorus configured in a parallel array sound different than in a
serial loop.
162
Less Is More with Subtractive Synthesis
Adding Patches
Adding patches to your synth is easy: Load a Patch Select module from
the Insert > MIDI folder, and connect the synth’s MIDI input to the
MIDI In plug. Though the wiring is invisible, this module connects to
all sliders, knobs, and other GUI features, and automatically adjusts
them in response to a MIDI patch change message. If you insert a
Patch Select module, a patch select bar appears at the top of the panel
window, which figure 3.54 shows so well. It lets you create and navigate
synth patches. Note that this bar does not appear in the exported plug-
in. The registered version of SynthEdit stores up to 128 patches for
your synth; the shareware version stores 16 patches.
MIDI Automation
Now you know how to assign MIDI control change messages to differ-
ent plugs. SynthEdit also offers a convenient way of assigning MIDI
messages to sliders, knobs, and other GUI features—MIDI automa-
tion. To take advantage of it, you must first load a MIDI Automator
module to the prefab, and connect the MIDI input to the Automator’s
MIDI In plug. A MIDI Automator, like the Patch Select module, con-
nects to the control features on the GUI via invisible “wires”.
Three types of MIDI messages serve to automate controls—control
change (CC), registered parameters (RPN), and non-registered parame-
ters (NRPN). Control changes are MIDI channel messages comprising
a controller number and a data value used to adjust a control feature.
The MIDI standard calls for 128 controllers; Table 3.2 lists their stan-
dard definitions.
163
Chapter 3 Stepping Up to Synthesis
164
Less Is More with Subtractive Synthesis
Heads up:
❖ The table above lists standard definitions, but manufacturers’ MIDI
implementations may differ.
❖ Controller data ranges from 0 to 127. Controllers 0 to 31 denote the
MSB, or most significant bits; controllers 32 to 63 denote LSB, or
least significant bits. MSB usually suffice to define a controller; if
not LSB data are also sent to provide a more precise definition. Not
all manufacturers use LSB.
❖ Avoid using bank select, data entry, data increment/decrement,
RPN, NRPN, and controllers higher than 120 for controlling a synth.
RPN and NRPN messages consist of control change messages. The
controller transmits a pair of CC messages to select the RPN/NRPN
number. It sends the parameter number’s higher 7 bits as CC 101/99,
and the lower 7 bits as CC 100/98. Then it sends the actual data as CC 6
(data entry), or sometimes as CC 6 and CC 38 (data entry MSB and
LSB). Sending 127 to both CC 101/99 and CC 100/98 usually resets the
RPN/NRPN parameter number. SynthEdit handles such messages
automatically; you need only set the parameter number to handle
NRPN/RPN messages.
You’ll deal with two general types of GUI features. Slider and List Entry
are individual modules, and the other GUI features use sub-controls to
create the control prefab. You can automate Slider and List Entry mod-
ules in the Properties window. Figure 3.55 shows a Slider’s Properties
window. The MIDI Controller ID option assigns a MIDI controller
from the list. MIDI NRPN does the same for NRPN messages.
165
Chapter 3 Stepping Up to Synthesis
166
Less Is More with Subtractive Synthesis
The structure features a Patch Mem–Float module that stores the mod
wheel image’s position. Right-click the Mod Wheel prefab’s container,
select Automation, and the panel shown in figure 3.57 appears.
This Automation panel lists all Patch Mem modules, their values, and
its assigned MIDI message. Label indicates the Name plug’s value. If
you connect a Text Entry2 module to the Patch Mem, it will show the
name you chose instead, perhaps something like Cutoff. The Control-
ler default is <none>. In the Mod Wheel prefab, it is CC number 1,
which is the mod wheel. Click the Controller box and the Learn and a
Set options appear. Learn assigns the Patch Mem to a controller auto-
matically. Click Set, and a panel appears that lets you choose the MIDI
message type (CC, RPN, or NRPN) and number.
Ignore PC (program change) works much like it does for Slider and
List Entry modules. When enabled, an incoming program change does
not affect the control feature’s value. When Private is enabled, Synth-
Edit hides controls earmarked private from the host, though the host
will show all other control features.
Heads up:
❖ You must load a MIDI Automation module into the structure to
enable automation.
❖ Some prefabs in this book use a Patch Mem–Text to display labels. If
you wish to configure automation, be sure to assign the MIDI mes-
sage to the right Patch Mem. Setting the Private option to True hides
the controls from the host.
❖ The Automation panel also lists Waveshaper and Waveshaper2 mod-
ules. This means if you don’t set Private to True for ADSR knobs’
Waveshapers, the host will list them as text parameters.
If you configure automations, do your users a favor and mention the
MIDI controller numbers in the synth’s documentation.
David Haupt’s DH_BasicModulePak offers a MIDI learn module set
called DH_MIDIControlMeister. It lets you endow your synth with
learning capabilities. See the documentation for more on this.
167
Chapter 3 Stepping Up to Synthesis
In FM jargon, the modulated operator is the carrier, and the other is the
modulator. The terms and technology are the same as in broadcasting,
expect in the latter the carrier frequency usually lies in the MHz range.
In FM synthesis, the carrier is an audible waveform.
168
Getting Funky with FM Synthesis
Figure 3.58 tells you that the carrier’s pitch is 6 volts, or 880 Hz. A pure
sine wave’s frequency spectrum is merely a single spike. The analyzer
shows a spike at 880 Hz with neighboring harmonics called sidebands.
Created by the frequency modulation effect, sidebands’ amplitude and
relationship are determined by the modulator’s frequency and FM
depth. Varying frequency and depth creates different timbres ranging
from metallic sounds to brass and bell-like sounds.
Heads up: Perhaps some of these tones conjure fond (or not so fond)
memories if you owned a Sound Blaster, Sound Blaster Pro, or Sound
Blaster 16 audio card. Their audio cards featured an FM synthesizer
chip (OPL2/OPL3) licensed from Yamaha that produced MIDI sounds
of a similar flavor.
Go-to prefabs: Synthesis > Simple FM Example
169
Chapter 3 Stepping Up to Synthesis
In this setup, only operator 1 and operator 3 are audible; the others
merely modulate these two operators’ frequencies. Operator 2 modu-
lates operator 1’s frequency. The other stack is less straightforward.
Operator 6 modulates both operator 5 and itself via a feedback loop.
Operator 5 modulates the frequency of operator 4, which modulates the
carrier, operator 3. This sophisticated modulation scheme creates com-
plex timbres. See the Yamaha DX7 manual if a desire to discover more
algorithms overwhelms you.
SynthEdit has a couple of—noun alert—modulation configuration lim-
itations. One is that it lacks sample feedback, ruling out feedback loops.
The other is that if you pre-wire a structure for a given algorithm, it lim-
its the synth’s sonic capabilities. You can overcome this barrier by using
a sophisticated modulation matrix like the mod matrix used in many
FM synth plug-ins. Case in point: Say operator 2 modulates operator 1.
If you try configuring a setup where operator 1 modulates operator 2,
you will a create feedback loop, which SynthEdit won’t tolerate. How-
ever, operator 3 can still modulate operators 1 and 2. The no-brainer
rule is any operator can only modulate operators below it, so operator 5
could modulate operators 1, 2, 3, and 4.
This four-operator setup features in figure 3.60. All operators can mod-
ulate any operators below them, and their signals may be routed to the
master output. This means all operators can act as carriers, and all
operators bar operator 1 can act as modulators. Though the setup lacks
feedback loops, it is still flexible.
170
Getting Funky with FM Synthesis
Figure 3.61 depicts the modulation matrix of the setup in figure 3.60.
Lacking the main diagonal, this matrix’s form is triangular. The circles
signify potential modulations. For instance, the circle in row 3, column
2 means operator 3 can modulate operator 2. The missing main diago-
nal would entail a feedback loop, and that’s a no-no.
171
Chapter 3 Stepping Up to Synthesis
Sidling Up to Sidebands
Let’s define a carrier’s frequency as C, and the modulator’s as M. The
modulator introduces harmonics to the carrier frequency. The upper
sidebands always appear at the following frequencies:
C + M, C + 2M, C + 3M, C + 4M, and so on
And the lower sidebands appear at these frequencies:
C − M, C − 2M, C − 3M, C − 4M, and so on
Say the carrier is a 1,000-Hz sine wave, and the modulator is a 200 Hz
sine wave. The carrier’s ascending sideband frequencies are 1,200 Hz,
1,400 Hz, 1,600 Hz, and so on. Its descending sidebands are 800 Hz,
600 Hz, 400 Hz, eventually reaching 0. Sidebands in the negative
domain are reflected, that is, they bounce back from 0. We can treat
them as positive numbers and represent them as such with absolute
value signs. For example, if C = 1 and M = 2, the first sideband is at
|C − M| = |1 − 2| = |−1| = 1. A carrier and a modulator sharing the same
frequency generate a harmonic at 0 Hz, and by extension a constant
DC offset that is visible on the analyzer. A simple one-pole high-pass
filter applied at around 20 Hz prevents this.
We often express carrier and modulator frequencies as C:M or M:C
ratio, because they define the sidebands. Lower sidebands do not occur
when the C:M ratio is 1:M (the carrier is the fundamental frequency),
provided that M ≥ 2 or M = 1. If M = 1, then the first lower sideband is
1 − 1 = 0 Hz, which is a DC offset. The second lower sideband is
|1 − 2 ∗ 1| = |−1| = 1, or a frequency identical to the carrier’s. If M is
greater than 2, then all lower sidebands lie above the carrier frequency,
which rules out lower sidebands. Table 3.3 lists some C : M ratios and
their first ten sideband frequencies.
172
Getting Funky with FM Synthesis
C M 1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 6 7 8 9 10 11
1 2 3 5 7 9 11 13 15 17 19 21
1 3 2 4 5 7 8 10 11 13 14 16
1 4 3 5 7 9 11 13 15 17 19 21
1 5 4 6 9 11 14 16 19 21 24 26
1 6 5 7 11 13 17 19 23 25 29 31
1 7 6 8 13 15 20 22 27 29 34 36
1 8 7 9 15 17 23 25 31 33 39 41
Table 3.3: A chart full of C:M ratios and their first ten sideband frequencies
173
Chapter 3 Stepping Up to Synthesis
Assembling Operators
Now that we know what important ingredients envelopes are, let’s look
at how we can use them to assemble an operator. In DX7, every opera-
tor features a dedicated five-stage envelope that lets us fine-tune vol-
ume and timbre curves. So grouping an oscillator and an envelope gen-
erator together to form an operator seems logical enough. Figure 3.62
shows a structure containing an oscillator, a tuner, an envelope, and a
VCA. Imaginatively named Operator, you can copy and paste this con-
tainer to create clones.
Go-to prefabs: Synthesis > FM Operator
Figure 3.62: The Operator’s structure with a tuner, envelope, and VCA
174
Getting Funky with FM Synthesis
The next chore is adding sliders and list entries to control the detuner
and envelope. Connect list entries to the Octave and Note plugs, and a
slider to the Pitch plug for fine pitch tuning. This prefab’s Fine slider
has a range of −0.0833333 to 0.083333, as in the previous prefabs.
Again, we used basic sliders for the Attack/Decay/Sustain/Release
plugs for simplicity’s sake. Now drop a Level Adj module in after the
Output plug to let your users adjust the operator’s output level. This
output is destined for the main output mixer as shown in figure 3.64.
All you need to do now to create a simple additive synth is stack four of
these operators and connect the outputs to a mixer. Check out the Syn-
thesis > FM1 prefab to see the full structure.
175
Chapter 3 Stepping Up to Synthesis
176
Getting Funky with FM Synthesis
your synth’s basic FM structure is up and ready to run. You may wish to
drop in a one-pole HP filter between the mixer and main output. Set to
about 20 Hz, it removes any DC offset generated by 0 frequency side-
bands. To see the complete structure, check out the FM2 prefab. Note
that the PM Depth knob adjusts Phase Mod depth. This means a PM
Depth setting of 5 volts and modulator Level Adj setting of 10 volts
yield the same amount of FM as a PM Depth setting of 10 volts and a
modulator Level Adj setting of 5 volts. If you wish to extend the modu-
lation depth range, either increase the PM Depth value for all opera-
tors, or assign a wider range to the modulation depth knobs. And if you
wish to convert the linear range to an exponential scale using a Level
Adj module, setting the Depth knobs’ range to 0 to 10 volts and increas-
ing the PM Depth knob’s amount for the operators sounds like a very
good idea.
Go-to files: Synthesis > FM2
177
Chapter 3 Stepping Up to Synthesis
Figure 3.67 shows a basic user interface featuring the default GUI. Feel
free to customize and skin it, and replace standard controls with sub-
controls. This prefab lacks modulation matrix labels. Your users are
sure to appreciate some signposts identifying modulation knobs, so
why not create a skin or background image with the operator numbers
written at the top and left of the modulation matrix. Note that the oper-
ators’ order in the structure is reversed, that is, operator 4 is at the top
and operator 1 at the bottom.
Go-to prefabs: Synthesis > FM3
178
Getting Funky with FM Synthesis
Some synths slap added filters on the main output signal. Try it; you
may like this hybrid synthesis.
Insert after the mixer any external effect that floats your boat—delays,
reverbs, chorus effects, ad infinitum.
179
4
Making the Most of
Performance
A processor’s resources are finite, so the burden a plug-in places on the
CPU matters. Polyphony hinges on CPU usage, and high loads limit
the resources the host program can devote other synths and effects.
Though modular synthesis confines your options for optimizing plug-
ins—certainly in comparison to hand-coded plug-ins—you’ll be
delighted to learn some improvement is possible.
Early versions of SynthEdit were gluttons for CPU performance, but its
author curbed its appetite in later versions. Now when a signal is inac-
tive, it goes to sleep to conserve CPU. Introducing GUI modules
enabled further improvements. GUI modules process signals at about
20 Hz rather than the audio rate, significantly boosting GUI perfor-
mance.
181
Chapter 4 Making the Most of Performance
Modules in sleep mode usually issue a status signal telling the subse-
quent module in the chain that it’s bedtime. Soon all the modules in
the chain go to sleep. The drawback is that the CPU load briefly spikes
when a static signal changes, possibly provoking an audio glitch if the
system is running at peak load. If the signal doesn’t demand updating
at the audio rate, use GUI modules instead to prevent glitches. And if
suitable GUI modules are available, it’s always wise to calculate control
signals on the GUI side.
There are many ways to detect if a module’s output signal is static. A
Monitor (Insert > Special > Monitor) module shows ST_STATIC to
indicate static signals, and ST_RUN for changing signals as depicted in
figure 4.2.
Figure 4.3
182
Go with Better Flow Control
Native modules detect sleep mode, but some third-party modules may
not because the function is not compulsory for SE. If you suspect a
patch is consuming more than its fair share of CPU power, a sleep
mode detector may help track down the culprits.
In the second setup, the active signal enters through the Input pin. It
then goes to all three effects for processing. This wastes beau coup
CPU because the Many → 1 switch routes just one signal to the output.
So, whenever possible, use the 1 → Many switch rather than the
Many → 1 switch. The same goes for SV Filters. Figures 4.6 and 4.7
depict two routing options for choosing a state variable filter mode. The
second uses less than half the CPU power of the first. The reason is,
the SV Filter works fine for one output, but the processing load doubles
183
Chapter 4 Making the Most of Performance
with several outputs connected. The switch in figure 4.7 selects the best
SV Filter for the task at hand, and puts all other filters to sleep to con-
serve CPU. And you can optimize SV Filters further, as you shall soon
discover.
Switches also serve to bypass effects. The switch in figure 4.8 routes the
signal through unchanged, sets the effect to sleep mode, or sends the
signal through the effect container.
184
Optimizing Effects
Figure 4.9 maps out a similar structure that lets users adjust levels for
delay, reverb, chorus, and flanger effects. Adjusting the level before the
effect—that is, backing the Level slider off to 0—turns the effect off.
When a Level Adj module receives zero input, it puts out a static zero
signal and goes to sleep, switching the effect off. If you want an on/off
switch, replace the slider with a 0/10 volts switch or button.
Optimizing Effects
VST effects pose two problems that beg optimization. One is that a
plug-in always interprets its input as a changing signal, so it consumes
the same amount of CPU whether it receives a signal of not. Placing a
Scoofster AutoSleeper module after the input inside the main con-
tainer fixes the problem. It waits for an incoming audible signal, and if
it doesn’t detect one over a reasonable period, puts all subsequent mod-
ules to sleep to conserve CPU power.
185
Chapter 4 Making the Most of Performance
Optimizing Synths
Polyphony
Nothing whets synths’ appetite for CPU like polyphony, as each new
voice begets clones clamoring for added processing. So, chose your
polyphony wisely. Too many voices tax your CPU unnecessarily. Chang-
ing the number of voices on the fly is not an option in SynthEdit
v1.0150, so define the polyphony in the main container. It’s a good idea
to slap a Mono mode switch on the interface to let your users lighten
the CPU load by opting for mono mode.
Envelope Length
A voice usually remains active until the VCA envelope fades to 0.
Longer envelopes means voices are slower to fade, and more simulta-
neously active voices means higher CPU loads. To define a load thresh-
old, simply set the amplitude envelope’s release time accordingly. If
you limit release time to 9 volts rather than 10, a voice fades for no
longer than 5 rather than 10 seconds. Bear in mind, though, that this
also limits the synth’s sonic potential somewhat.
186
Optimizing Synths
187
Chapter 4 Making the Most of Performance
Forced Mono
A Special/Voice Combiner module lets you confine cloning to conserve
CPU power. It combines incoming voices and shoehorns the compos-
ite signal into mono format. Say you drop a Voice Combiner module in
front of a distortion module. This economizes on CPU, but yields a dif-
ferent flavor of distortion reminiscent of a guitar stompbox because the
effect distorts the composite signal rather than individual voices.
188
Fight the Flab by Cutting Calculations
189
Chapter 4 Making the Most of Performance
Go-to prefabs:
Optimization > Stereo Biquad
Go-to prefabs:
Optimization > Stereo SV Filter LP
Detuned Filters
A similar technique can benefit applications with two or more detuned
filters. Say you envision one filter with a cutoff frequency an octave
higher than the other’s. The straightforward approach is to feed in the
same pitch in 1 Volt/Octave mode, and add one volt to one of the two
filters. The bad news is that this entails converting the frequency twice.
So, let’s use the identity:
190
Fight the Flab by Cutting Calculations
2 a+b = 2 a ∗ 2 b
x = 2D
191
5
All About Sub-controls
What Are Sub-controls?
SynthEdit’s sub-control modules are building blocks used to create cus-
tom controls for a synth or effect’s GUI. This chapter covers the basic
concepts you must master to use sub-controls effectively in your Synth-
Edit projects, and provides plenty of examples to help you get off the
ground.
Figure 5.1
Right-click the module, look at its Properties (see figure 5.2), and you
will see that the slider offers you several options. You can:
❖ Assign a MIDI controller for remote control
❖ Set it to ignore program changes
❖ Stake out its range using the Lo Value and Hi Value fields
❖ Change its visuals, turning it into a horizontal slider, knob, or but-
ton
❖ Show and hide its data readout and title
193
Chapter 5 All About Sub-controls
Figure 5.2
Now if you put the module into a container and right-click to view the
container’s Automation window, you will discover the slider controls an
automatable parameter (see figure 5.3). Move the slider with the Auto-
mation window open, and watch the parameter value change with the
slider’s position. Parameters are what ultimately control the processing
of a synth or effect, but much more on this later in the chapter.
Figure 5.3
194
What Are Sub-controls?
Figure 5.4
Figure 5.5
We’ll examine all these modules’ plumbing in greater detail later. For
now, a brief overview will do to let us compare sub-control-based and
native controls.
The big difference between sub-control-driven and native controls is
obvious, yet its importance is easily overlooked. The sub-control-based
control is a prefab. Why is this so important? Though you can alter a
native SynthEdit control‘s appearance, your options are limited to a
fixed selection of visual styles—button, button_sm, vslider_med, and
so forth. While you may substitute different graphic images to re-skin
each style, the number of available default controls is finite. Sub-con-
trols impose no such limitations. You can create as many types of cus-
tom controls as you want or need. The Bitmap Image module displays
any bmp or png image file, and animates multiple-frame images. A
Joystick Image sub-control serves to animate single-frame images hori-
zontally or vertically for slider handles and the like, as well as for two-
dimensional controls. Once your custom control looks and works the
way you want it to, you may simply save it as a prefab, and presto—
there you have a new control type. Save it in your SynthEdit\Pre-
195
Chapter 5 All About Sub-controls
fabs\Controls folder, and it will appear in your Insert menu under Con-
trols. If you acquire a taste for creating lots of custom controls, it may
behoove you to organize them in sub-folders within your Synth-
Edit\Prefabs\Controls folder.
At second glance, figures 5.4 and 5.5 reveal that the control’s graphics
comprises three parts, layered to create the knob. The knob’s body and
shiny cap are Bitmap Image sub-controls; a Tinted Bitmap Image pro-
vides scale markings. While you can create layered images using a good
graphics program, doing this on the fly within SynthEdit by combining
sub-controls affords you added flexibility. Use the panel view of the con-
trol’s container to lay out your control’s graphic features.
Let’s see how the control works. Note that in figure 5.5 the Animation
Position plugs of the Bitmap Image modules for the knob and shiny
cap connect to the Patch Mem–Float module’s Animation Position
plug. When a multiple-frame image moves, the Bitmap Image sub-con-
trol puts out a number in the range of 0.0 to 1.0, where 0.0 is the first
frame and 1.0 is the last frame of the image. Patch Mem–Float then
scales the animation position to the range specified by the Min Value
and Max Value plugs. The result goes to the Value Out plug, and the
Float to Volts module converts it into a control voltage. You’ll find this
module in the Insert menu, under Conversion.
A control based on sub-controls is easy to hide and show. Set its con-
tainer’s Controls on Parent plug (see figure 5.6) to True, and the
graphic sub-controls inside the container appear on the higher level
container’s panel. Set it to False to hide them.
Figure 5.6
This control does not display a numeric readout. If you wish to add
one, add modules to convert the value to text and display the text. Along
with the privilege of building custom sub-controls comes the responsi-
bility of adding features.
196
What Are Sub-controls?
Figure 5.7
The Patch Mem–Float module links the circuit in figure 5.5 to the
parameter. The other sub-controls would not affect the parameter if left
unconnected to Patch Mem–Float. You can assign the parameter a
MIDI controller for remote control in the Automation window. Opt for
Ignore PC = True and it will ignore program change messages. Select-
ing Private = True excludes it from the parameter set available for VST
automation.
197
Chapter 5 All About Sub-controls
198
More on What Sub-Controls Do and How They Do It
VST hosts provide a default interface that allows the end user to edit a
plug-in’s parameters directly, without using the plug-in’s custom GUI.
In fact, some VST plug-ins lack a custom GUI, relying on the host’s
default interface instead. A plug-in’s custom GUI is really just a fancy
graphical editor for the plug-in’s parameters.
This division of GUI and audio processing holds true even within a sin-
gle module for those modules containing both GUI processing and a
direct connection to audio processing. SynthEdit’s native controls han-
dle this internally. Recall how the standard slider module’s parameter
changes when the slider’s grip moves. If a plug on an audio processing
module connects to the slider’s Signal Out plug, it also links to the
slider’s parameter on the audio processing side. When the slider’s GUI
side sends the parameter change to the host, the slider’s audio process-
ing side receives the parameter change from the host and sends it out
on the Signal Out plug to the connected audio processing module.
If you’re dealing with sub-controls, you must provide a way to connect
the GUI features to a parameter. In the case of our example knob, this
is the Patch Mem–Float module affording access to the parameter con-
trolled by the knob. Remember, the only way a sub-control can affect
(or be affected by) audio processing is to pass parameters through the
host.
Of all the SynthEdit sub-controls, only those with Patch Mem in their
names afford you access to parameters. Third-party sub-control mod-
ules, on the other hand, may or may not access parameters directly. The
best way to learn which parameters are in use is to view the Automa-
tion window of the container holding the sub-controls. Some third-
party modules may use their own parameters for internal purposes. It
is usually best to set both Ignore PC and Private to True for parameters
that do not correspond to your synth or effect’s actual sound parame-
ters (see figure 5.9).
Figure 5.9
199
Chapter 5 All About Sub-controls
Figure 5.10
One of the first things you may have noticed about sub-controls is that
some or all of the plugs appear on blue backgrounds (see figure 5.10)
rather than the gray backgrounds commonly found on other SynthEdit
modules. The reason for this difference stems directly from the separa-
tion of GUI and audio. The blue-background plugs serve to make con-
nections on the GUI side of the plug-in, and will not connect directly to
the audio processing plugs with the gray backgrounds. We refer to
plugs with blue backgrounds as GUI plugs. Five data types are defined:
Bool (black) for logical values that can be either True or False
Figure 5.11
200
More on What Sub-Controls Do and How They Do It
Figure 5.12
201
Chapter 5 All About Sub-controls
tion. This goes in either direction, so grabbing the knob’s outer rim or
the shiny cap with the mouse achieves the same effect. The two-way
nature of sub-controls makes it very easy to include animation and
interactive feedback in your GUI design.
Though GUI plugs on both sides can serve as both inputs and outputs,
those at the module’s right are not quite identical to those on the left.
The latter act as masters, those on the right as slaves. You may connect
more than one slave to a master, but only one master to a slave. This
means you could not connect a second Patch Mem–Float to the knob
Bitmap Image Animation Position plug in figure 5.12. Later you will
learn how to solve this problem using splitters.
202
A Look at Native SynthEdit Sub-controls
Figure 5.13
Figure 5.14
dB to Animation
Figure 5.15
203
Chapter 5 All About Sub-controls
Figure 5.16
Float Scaler
Figure 5.17
The Float Scaler calculates a linear function of its input. Use it to scale
a number and/or add an offset. It multiplies the Value In by a specified
amount, and then adds a specified amount:
Value Out = y = mx + b
x is the Value In, m is the input to the Multiply by plug, and b is the
input to the add plug. Figure 5.18 illustrates the example 5.0 ∗ 0.50 +
1.0 = 2.50 + 1.0 = 3.50.
204
A Look at Native SynthEdit Sub-controls
Figure 5.18
The Float Scaler is bidirectional; that is, when the Value Out changes it
also calculates the inverse function,
Value In = x = (y − b)/m
The module does not recalculate anything when the inputs to the Multi-
ply by or Add plugs change.
Image to Frame
Figure 5.19
205
Chapter 5 All About Sub-controls
Figure 5.20
Increment2
Figure 5.21
The Increment2 module steps through the items of a list, selecting the
next item when incremented, or the previous item when decremented.
Increment and Decrement plugs respond when their inputs change
from True to False, so that a momentary contact button increments or
decrements the selection when the mouse button releases.
When the Wrap input is set to True, the selection wraps back around to
the beginning of the list when incremented at the end of the list, or to
the end when decremented at the beginning. SynthEdit’s List Entry2
prefab (Insert menu: Controls) is a good example of this sub-control in
a practical application (see figure 5.22).
206
A Look at Native SynthEdit Sub-controls
Figure 5.22
Spring
Figure 5.23
207
Chapter 5 All About Sub-controls
Figure 5.24
Float to Bool
Figure 5.25
208
A Look at Native SynthEdit Sub-controls
Int To List2
Figure 5.26
The Int to List2 module converts an integer input into a selection in the
list connected to its Out plug. It’s bidirectional, so it also converts a list
selection into an integer. Its two modes of operation are Index and
Value.
In Index mode, lists items are indexed starting at 0. Setting the In
plug’s value to a list item’s index selects the item. Conversely, selecting
a list item sets the In plug to the item’s index. Say the list entries are
saw, pulse, triangle, and sine. Then setting the In plug to one selects
pulse, and selecting sine sets the In plug to three.
Value mode works like Index mode for simple lists, but not if you’re
dealing with a list whose items’ internal values differ from their ordinal
positions. Say the assigned values are
saw = 1, pulse = 2, triangle = 3, sine = 5
In this case, a list item is selected if its assigned value equals the value
of the In plug. Conversely, the In plug is set to the assigned value of the
selected list item. Setting the In plug to 1 selects saw, while selecting
sine sets the In plug to 5. Setting the In plug to an unassigned value—
say, in this case, 4—does not select any list item.
Text To Float
Figure 5.27
This module converts Float values to text strings and vice versa. You
decide if you want the plug to determine the number of decimal places
displayed in the text string automatically, or define a fixed number in
the range of 0 to 10.
209
Chapter 5 All About Sub-controls
Bitmap Image
Figure 5.28
The Bitmap Image sub-control displays the bmp or png image named
by its Filename plug. Employ it for static images or animated controls.
If you use the module with a multiple-frame image, the Animation
Position plug sends the currently displayed frame’s position on a nor-
malized scale of 0.0 to 1.0. This goes both ways, so changing the Ani-
mation Position plug’s value prompts the displayed graphic frame to
change.
Pressing the left mouse button while the cursor hovers over the image
sets the module’s Mouse Down plug to True.
The Frame Count plug outputs the number of frames in the image
when an image file is first loaded, and when the window displaying the
image first opens. Otherwise, it may not always be accurate.
If you want to use the module to animate multiple-frame images, spec-
ify the frame size, type of mouse response, and padding, if any, in a txt
file bearing the same name as the graphic file (with txt in place of the
bmp or png extension). The txt file format is the same as that used for
default SynthEdit skin components.
Earlier in the chapter, Bitmap Image sub-controls in the Knob Sm pre-
fab served to control a numeric control voltage output. The next exam-
ple demonstrates how a Bitmap Image controls list selections.
210
A Look at Native SynthEdit Sub-controls
Figure 5.29
211
Chapter 5 All About Sub-controls
In figure 5.30, you can see how the Bitmap Image’s Animation Position
is converted to an integer frame number. The Int to List uses that inte-
ger value to select the corresponding list item. As usual, a Patch Mem
module provides the parameter interface between the GUI modules
and the audio side.
Figure 5.30
Dropdown List
Figure 5.31
The Dropdown List module displays the items of a list connected to its
List plug, and allows the user to select an item. Select it in the panel
view, and you can resize the module’s GUI by dragging the square siz-
ing handles (see figure 5.32). Normally, it looks like a text box with the
selected item displayed (see figure 5.33). When the user clicks it (with
the panel locked), the list drops down, enabling selection (see figure
5.34).
212
A Look at Native SynthEdit Sub-controls
The Text Entry2 sub-control also accepts these seven font categories.
Joystick Image
Figure 5.35
213
Chapter 5 All About Sub-controls
Text Entry2
Figure 5.41
The Text Entry2 module accepts input and displays output text. Select it
in the panel view, and you can resize the sub-control’s GUI by dragging
the square sizing handles (see figure 5.42).
214
A Look at Native SynthEdit Sub-controls
Figure 5.42
Text Entry2 lets you to select from the same seven font categories avail-
able for the Dropdown List—Normal, Heading 1, Heading 2, Heading
3, User 1, User 2, and User 3. Again, specify font face, size, color, and
background color (including transparent) in the global.txt file using the
same conventions that define standard SynthEdit controls’ fonts.
The module offers two mode settings, Normal and Read-Only.
If you type text into the sub-control’s text box and press the Enter key or
click the mouse outside the text box, the Text plug issues this text when
the Multiline plug setting is False. If its setting is True, the Enter key
advances the insert point to the beginning of the next line. Clicking the
mouse outside the text box still prompts the Text plug to put this text
out.
The module does not retain typed-in text if the Text plug is uncon-
nected.
Figure 5.43
215
Chapter 5 All About Sub-controls
Figure 5.44
216
A Look at Native SynthEdit Sub-controls
217
Chapter 5 All About Sub-controls
Routing Modules
Routing modules help you sidestep some of the constraints on connect-
ing GUI modules. Granted, only one of SynthEdit’s native sub-controls
falls into this group. However, you can hardly do without several third-
party modules in the group if you wish to achieve serviceable results
with SynthEdit sub-controls. Jeff McClintock notes that future Synth-
Edit versions will resolve this issue.
Bool Splitter
Figure 5.47
So, what do you do if you wish to route the same Bool type value to sev-
eral destinations? Easy enough, if the value feeds a left-side plug: Sim-
ply connect it to as many locations as you need (see figure 5.48).
If the value you wish to distribute feeds a right-side plug, you have a
problem. The right-side plug is a slave that can have but one master,
which means you have just the one connection option. This is where
splitters come in. The Bool Splitter duplicates as many right-side plugs
as you need, and passes the value of its left-side plug to all (see figure
5.49).
Although this problem with right-side plugs affects other GUI data
types, SynthEdit provides a splitter for the Bool type only. Third-party
module packs provide splitters for Float, Text, and Int.
218
A Look at Native SynthEdit Sub-controls
Miscellaneous Modules
This group contains sundry modules that don’t quite fit into other cate-
gories. Only one native SynthEdit sub-control falls into this group.
System Command2
Figure 5.50
The System Command2 module lets you call any of the following Win-
dows commands from within your plug-in, using the Filename as the
argument to the command:
❖ Edit
❖ Explore
❖ Find
❖ Open
❖ Print
❖ Properties
A command works only if defined as a valid Windows command for the
specified argument. This depends on Windows Registry settings,
which may vary from one user’s machine to another’s. Filename need
not always be a file. For example, Open can be used with a URL to open
a Web browser on the specified Web page. The Explore command
expects the argument to be a directory path.
Changing the Trigger plug’s Bool value from True to False issues this
command.
219
Chapter 5 All About Sub-controls
Figure 5.51
With a Patch Mem–Text module, you can use a Text Entry2 sub-control
in place of the native Text Entry control, as in figure 5.52.
220
Putting Your Sub-control Skills into Practice
Figure 5.52
221
Chapter 5 All About Sub-controls
Bitmaps as Controls
The Bitmap Image sub-control lets you use multiple-frame bmp or png
images as controls. You’ve seen this application several times in this
chapter, so this example merely rehashes the basics. Figure 5.53 shows
the Bitmap Image module’s right-click Properties.
Here, we’ve selected the moog_knob.png file from the SynthEdit
default skin folder in the Bitmap Image sub-control’s right-click Prop-
erties.
Figure 5.53
This image has 40 frames, so its animation runs very smoothly. Its
associated moog_knob.txt file looks like this:
type animated
frame_size 48, 45
mouse_response rotary
padding 13, 7, 13, 4
222
Putting Your Sub-control Skills into Practice
Figure 5.54
Text Entry2 provides a name for the parameter and a label for the GUI.
Patch Mem–Float’s Min Value and Max Value demarcate the output
voltage range.
You may use any multiple-frame bmp or png image in this way. And
that speaks volumes about sub-controls’ power and flexibility.
Figure 5.55
223
Chapter 5 All About Sub-controls
Figure 5.56
Figure 5.57
224
Putting Your Sub-control Skills into Practice
Figure 5.58
Pressing the button sets the Bitmap Image’s Animation Position to 1.0;
releasing it to 0.0. Float to Bool issues a True for the former, and a False
for the latter. The False-True sequence triggers the File Dialog plug on
the Patch Mem–Text, which opens a Windows File Open dialog. The
selected file name then passes to the Wave Player.
Figure 5.59
225
Chapter 5 All About Sub-controls
Linking to a Website
The System Command2 sub-control performs various functions. Like
the file dialog above, a custom graphic can trigger it (see figure 5.60).
To link to a website, select open as the Command, and enter the com-
plete URL as the Filename as shown in figure 5.61.
Note: Be sure to use the http:// prefix.
Figure 5.60
Figure 5.61
226
Putting Your Sub-control Skills into Practice
Let’s start with the SE Switch control. Figure 5.62 depicts how it looks
in a panel view. Figure 5.63 shows its simple structure, which should
be looking fairly familiar to you by now.
Figure 5.64
Figure 5.64 shows the two-frame image used for the Bitmap Image
sub-control. Its text file contains:
type animated
orientation vert
frame_size 25, 26
padding 5, 2, 5, 3
mouse_response stepped
Note that the switch’s panel view in figure 5.65 was unlocked to change
Text Entry2’s position and text.
227
Chapter 5 All About Sub-controls
Figure 5.65
Figure 5.66
The Tinted Bitmap Image uses a single-frame bmp image file (figure
5.67); the Bitmap Image uses a two-frame bmp image with a mask (fig-
ures 5.68 and 5.69).
228
Putting Your Sub-control Skills into Practice
LED2 works simply enough: Volts to Float and Patch Mem convert each
voltage input to a Float value. DC Volts (Fast) is selected for the Volt to
Float Responses, with Update Rates set to 20 Hz. Selected Patch Mems’
types hinge on whether the left or right side requires Float output. The
value originating in the Signal In plug drives the lens Bitmap Image’s
Animation Position. The Tinted Bitmap Image’s Hue, Saturation, and
Brightness inputs require values ranging from 0.0 to 1.0, so Float Scal-
ers multiply the voltage values by 0.1 to scale them down from Synth-
Edit’s 0-to-10 volt range.
229
Chapter 5 All About Sub-controls
Adding Animation
For our next example, we’ll start with another prefab from the SE
Insert:Controls menu, and then add our own twist to it. Figure 5.71
shows the structure of the Joystick prefab.
Figure 5.71
230
Putting Your Sub-control Skills into Practice
Figure 5.72
Now let’s take the Joystick prefab and modify it to create an animated
version of the DH_JoystickIn module (Figure 5.72). This lets users
employ an external joystick or game pad as an input source for Synth-
Edit.
The DH_JoystickIn’s X-axis and Y-axis outputs range from −5 to +5
volts, which coincides with the Patch Mem–Floats’ Min Value to Max
Value range.
Using the X-axis output to vary the input to the Value plug on the “X”
Patch Mem–Float changes the Animation Position, and moves the
knob sideways. If you want up and down movement, have the
DH_JoystickIn’s Y-axis output vary the input to the Value plug of the
“Y” Patch Mem–float. Figure 5.73 shows you how to do this.
231
Chapter 5 All About Sub-controls
Figure 5.73
Splitting a List
Figure 5.74
Time to build a custom selector button of your very own. This exercise
illustrates lots of important techniques, one being how to split a list
without having a list splitter module at your fingertips. Our selector
will step through a list as it is clicked, returning to the top after arriving
at the last item. Its label will change with each click to show the
selected item. Figures 5.74 and 5.75 depict the prefab and its panel
view. We’ll keep it simple by settling for three selections—A, B, and C.
Figure 5.75
232
Putting Your Sub-control Skills into Practice
For a change of pace, we’ve used a transparent image with a Tinted Bit-
map Image for the button. The tint provides the main color, and the
background fills in the shading. Figure 5.76 shows the structure.
Figure 5.76
Clicking the button moves the Animation Position from 0.0 to 1.0;
releasing it resets it to 0.0. The resulting False-True-False output from
the Float to Bool converter is then split two ways, prompting each of the
Increment2 modules to select the next item in its list. Both Increment2
modules’ Wrap plugs are set to True, so the list returns to the first entry
after reaching its end.
Figure 5.77
233
Chapter 5 All About Sub-controls
The top list connects to the external List Out via a Patch Mem–List2.
Created by List to Bools, the bottom list determines which of the three
Containers at the lower right Controls on Parent is set to True so its
contents appear on the parent panel. The containers hold labels for the
list items; in this case, A, B, and C as shown in figure 5.77. Every item
in the external list requires a dedicated label container. Though some
third-party sub-controls take label information directly from the exter-
nal list, we’re focusing on learning to handle the sub-controls that ship
with SynthEdit. We’ll look at others later. The point here is that the
structure in figure 5.76 splits our list. Though lacking a list splitter
module, we had a Bool Splitter split the input, and fed it to two parallel
lists, thereby achieving much the same result.
Let’s take this a step further to create an LED Stack selector. We’ll make
it horizontal rather than vertical like the standard SynthEdit control
(see figure 5.78). The horizontal LED stack prefab’s and our selector
button’s structures are identical, except that we have split off a third list
to control the LEDs (see figure 5.79).
Figure 5.78
234
Extending the Sub-control Toolkit
Figure 5.79
235
Chapter 5 All About Sub-controls
❖ Data Manipulation
❖ Data Type Conversion
❖ GUI Input/Output
❖ Parameter Interface
❖ Routing
❖ Miscellaneous
Format Conversion
These modules convert values from one format or type of unit to
another. They are great for expressing GUI control values in terms of
familiar or user-friendly units, such as Hz or dB. Having the GUI
thread do the converting spares CPU power.
Figure 5.80
Some Input/Output sub-controls have plugs that adjust text and back-
ground colors dynamically. They accept an integer value representing a
composite of the color’s red, green, and blue (RGB). The modules pic-
tured in figure 5.80 convert several common color specifications to this
integer RGB format:
❖ The hexadecimal format for RGB values that you recognize from
HTML.
❖ Hue, Saturation, and Luminance, as used in many paint programs.
236
Extending the Sub-control Toolkit
❖ Values scaled from 0 to 255 for the red, green, and blue components
in text form.
Figure 5.81
SL Non-linear Scalers
Figure 5.82
and its inverse for conversions between linear and exponential scales
over the same input and output range. Enter the range’s minimum and
maximum values, and the base, multiply, and add parameters to the
module’s right-click Properties. SL_Floats2Hertz converts floats to
Hertz. It also lets you use reference points for the volt/octave scale
other than the 5 volts = 440 Hz option SynthEdit offers.
237
Chapter 5 All About Sub-controls
BK_ListToBools2
Figure 5.83
There’s more to some modules than their appearances would have you
think. Though this module’s plug names tell you it was designed for
algorithm selection, its basic function comes in handy in other situa-
tions. The input is a standard (non-GUI) list entry that lets you set the
four Boolean outputs’ logical states. The output matching the selected
list item is True; the others are False. If you want to control panel selec-
tion using one of the variants of SynthEdit’s List Entry control, this may
be just what the good doctor ordered.
DH_FloatIncrement
Figure 5.84
This module adds or subtracts one from a current float value. You can
set it up to wrap around when it reaches a specified range’s high and
low value.
238
Extending the Sub-control Toolkit
Figure 5.15
All three of these modules cleave the fraction off a floating point num-
ber, leaving an integer. DH_Float Ceil converts to the next higher inte-
ger, DH_FloatFloor converts to the next lower integer, and DH_Float-
Quantizer rounds to the nearest integer.
DH_FloatAbs
Figure 5.86
DH Arithmetic Modules
Figure 5.87
239
Chapter 5 All About Sub-controls
DH_FloatCompare, DH_IntCompare
These modules compare two float or integer values, and depending on
the result, set one of three Boolean outputs to True.
Figure 5.88
DH_FloatMin, DH_FloatMax
You can use DH_FloatMax and DH_FloatMin to find the maximum or
minimum of any number of float values. Connecting one input plug
automatically creates another.
Figure 5.89
DH_FloatToDigits
Figure 5.90
240
Extending the Sub-control Toolkit
DH_ModulusOp
Figure 5.91
Figure 5.92
241
Chapter 5 All About Sub-controls
Figure 5.93
OL Random Float
Figure 5.94
242
Extending the Sub-control Toolkit
RH_2D_3D_Distance
Figure 5.95
RH_Bitcount Set
Figure 5.96
RH_Float_Lcompare
Figure 5.97
This mod compares Float In with Float In2. If they are equal, it sets
Float Out to 5; otherwise Float Out is 0.
243
Chapter 5 All About Sub-controls
RH_Int-Simple_Logic
Figure 5.98
This mod compares Int X and Int Y plugs’ values based on the relation-
ship determined by the Mode plug, which may be:
X == Y, X != Y, X > Y, X < Y, X ≥ Y, or X ≤ Y
A value of True sets Bool Out and Text Out to True, and Float Out and
Int Out to Value High. False sets Bool Out and Text Out to False, and
Float Out and Int Out to Value Low.
RH Logic_Gates
Figure 5.99
These modules implement the basic binary logic gate types for integer
(0 or 1) and Boolean (False or True) inputs. The gate types are:
AND, OR, NAND, NOR, XOR, and XNOR
244
Extending the Sub-control Toolkit
A value of True for the gate output sets Bool Out and Text Out to True,
and Float Out and Int Out to High Value. False sets Bool Out and Text
Out to False, and Float Out and Int Out to Low Value.
RH_Rescale
Figure 5.100
RH_Rescale translates and rescales its Input from the input range pro-
vided by In_Low and In_High, to the output range provided by
Out_Low and Out_High, using a linear transformation.
SL FixedGui Series
Figure 5.101
Use these modules when you need the equivalent of SynthEdit’s Fixed
Values on the GUI side. Enter the desired constant to the Value right-
click Properties field, and it will go to both Out plugs.
SL Gui Limiters
Figure 5.102
Use these to clip GUI float or integer values to a specified range. Enter
Min and Max values to the right-click Properties fields.
245
Chapter 5 All About Sub-controls
DH_ArraySequencer
Figure 5.103
DH_ArrayToFloats
Figure 5.104
246
Extending the Sub-control Toolkit
DH_FloatArray
Figure 5.105
Text/List Manipulation
This group’s sub-controls let you endow your GUI with sophisticated
dynamic lists and other text features. They also enable handy functions
like selecting or constructing file names on the fly.
DH_CharacterBitmapDriver
Figure 5.106
Say you wish to build customized dynamic text display controls. Now
say you want to use fonts that need not be installed on the end user’s
machine. This module gets the job done. The result can look like the
LED Display prefab in figure 5.107’s structure view, and in figure
5.108’s panel view.
247
Chapter 5 All About Sub-controls
248
Extending the Sub-control Toolkit
Figure 5.110
DHFormat, DH_FloatFormat
Figure 5.111
249
Chapter 5 All About Sub-controls
Figure 5.112
DH_StringCompare
Figure 5.113
250
Extending the Sub-control Toolkit
DH_StringLength, DH_StringSearch
Figure 5.114
DH_TextAppend
Figure 5.115
This module simply appends any number of text strings. The Text In
plug automatically clones itself on demand.
251
Chapter 5 All About Sub-controls
Figure 5.116
All three of these modules let you load, manipulate, and store lists of
text items using simple text files. DH_TextArray uses a zero-based
numeric index to access the list items. DH_TextList and DH_TextList2
afford list access at their Selection plugs, which connect to a Dropdown
List or other GUI Input/Output list selection sub-control. Use them
with lists of patch names, file names, modulation sources, or destina-
tions—anywhere you need a custom list.
DH_TextArray and DH_TextList enable dynamic list updating. You can
set up either module to write changes to a file read by several other
DH_TextArrays and DH_TextLists elsewhere in the circuit. More than
one module should not write to the same file.
DH_ListExtractor
Figure 5.117
252
Extending the Sub-control Toolkit
DH_ListGenerator
Figure 5.118
DH_ListSearch
Figure 5.119
253
Chapter 5 All About Sub-controls
DH_ListStandardizer
Figure 5.120
Figure 5.121
You can use KDL conversion modules that convert from GUI lists to
other data types to construct custom lists. Use a comma-separated list
to enter the list items and their values into the List Choices box in the
module’s right-click Properties, as shown in figure 5.122.
The format for each item is:
list item = value
Figure 5.122
254
Extending the Sub-control Toolkit
The list item is what you want displayed in the list; the value is what
you want the module to issue when the item is selected.
Each item’s value is True or False when converting to a Boolean value.
Say you’re dealing with a list of the first eight harmonics. True could
signify harmonics that are the same note; False the others:
Fund = True, 2nd = True, 3rd = False, 4th = True, 5th = False, 6th =
False, 7th = False, 8th = True
If you don’t specify an item’s value with an = sign when converting to
numeric values, the item automatically adopts a value one higher than
the preceding value, starting at 0.
KDL modules that convert GUI lists to text values accept any text string
to the right of the = sign. For example, a list’s items could be patch
names and their values the names of files containing the samples.
KDL GuiText2GuiText
Figure 5.123
Figure 5.124
This module lets you use a Bitmap Image to cycle through a GUI list’s
options.
255
Chapter 5 All About Sub-controls
RH_Int2Text-MidiCC
Figure 5.125
Fed the MIDI CC number, these modules issue a text string showing
the standard assignment for the CC number, or just the number if the
CC number is unassigned.
RH_Int2Text-ascii
Figure 5.126
256
Extending the Sub-control Toolkit
Figure 5.127
257
Chapter 5 All About Sub-controls
List Selection
DH_DropdownList
Figure 5.128
Figure 5.129
258
Extending the Sub-control Toolkit
Figure 5.132
259
Chapter 5 All About Sub-controls
Figure 5.133
It offers dynamic color and font selection for both the text display/click
area and the popup list box.
You can opt to fix the pop-up’s position, or create a floating window.
Use the horizontal and vertical offsets to specify its position relative to
the text display/click area.
DH_PopupMenu
260
Extending the Sub-control Toolkit
You can create a formatted menu with multiple columns, vertical and
horizontal dividers, and non-selectable labels. To do this, build a cus-
tom list with DH_TextList, DH_TextList2 or one of the KDL
GuiList2<any> modules, and insert special formatting characters into
it. Figure 5.137 provides an example. See the DH_PopupMenu docu-
mentation in the DH_Sub-ControlPak User’s Guide for details on spe-
cial formatting characters.
Figure 5.137
Numeric I/O
DH_Breakpoint Input DH_BreakpointInput is a graphic sub-control
for entering and displaying two-dimensional data such as an envelope’s
amplitude and time. It feeds out horizontal (X) values and vertical (Y)
values as two parallel arrays accessed by the modules described in the
section “Float Array Processing” on page 246.
Figure 5.138
261
Chapter 5 All About Sub-controls
Figure 5.139
Figure 5.140
262
Extending the Sub-control Toolkit
Figure 5.141
Dragging the cursor across the Contour display window adjusts the
segments’ heights. You can center the baseline as shown in figure
5.141, or place it at the display’s bottom or top. The module handles
output as well as input. The displayed contour changes to reflect chang-
ing array values.
DH_MinMaxBar
263
Chapter 5 All About Sub-controls
DH_MultiStepInput
Figure 5.144
Figure 5.145
264
Extending the Sub-control Toolkit
Text I/O
DH_PopupTextDisplay DH_PopupTextDisplay initially appears on
the panel as a transparent rectangle, as in figure 5.147. Click it to view
its Text plug’s value in the selected font and colors.
Figure 5.146
DH_TextDisplay
Figure 5.149
265
Chapter 5 All About Sub-controls
DH_TextIO
Figure 5.150
DH_TextIO handles text input and output. Simply type to enter text;
unlike SE Text Entry2, DH_TextIO does not require you to press the
Enter key. It displays text in the selected colors and font. DH_TextIO is
always ready to accept typed input, so it remains on top regardless of its
and other modules’ To Front or To Back settings, and you cannot set its
background to transparent.
DH_PatchArray Modules
Figure 5.151
266
Extending the Sub-control Toolkit
❖ Per Patch mode provides a separate float array, list, or text array for
each patch.
DH_PatchArray-List has a Load From List plug that lets you populate
the list with items from the list of another sub-control connected to the
right-side List plug.
Memory for the array or list is allocated automatically as needed. Cur-
rently, patch memory stores up to 1,000 characters.
Routing Modules
Routing sub-controls fall into two sub-groups:
❖ Simple Routing Modules
❖ Route Switches
Figure 5.152
267
Chapter 5 All About Sub-controls
Splitters can also reverse the direction of flow. For example, figure
5.155 shows how splitters reverse the flow through a
DH_FloatExpCurve to obtain the inverse of an exponential function—a
logarithmic function.
Figure 5.155
RH Redirect Set
Figure 5.156
These modules redirect the input to the output on the same side to
enable left-to-left and right-to-right connections.
SL Gui Splitter Series
Figure 5.157
Another set of splitters, these include right and left hand versions.
268
Extending the Sub-control Toolkit
Route Switches
These modules let you route a source to one of several destinations,
one of several sources to a destination, or control data flow over a given
route.
DH_Route Switches
Figure 5.158
Figure 5.159
269
Chapter 5 All About Sub-controls
OL Control Reset2
Figure 5.160
When the Gate triggers, this module sends the Reset Value to the Value
output plug. In a typical application, this plug connects to the Value
plug of a Patch Mem–Float.
OL Float Gate
Figure 5.161
The OL Float Gate switches a float connection, routing the value of the
In plug through to the Out plug while the Gate is True. Switching the
Gate on, off, or in either direction can serve to send a Reset Value,
depending on the Reset Mode.
SL SliderLinker
Figure 5.162
As the name suggests, this module is handy for linking and unlinking
two sub-controls. When the Link plug is True, the Slider 1 plugs con-
nect to the Slider 2 plugs; False disconnects them.
270
Extending the Sub-control Toolkit
Miscellaneous Modules
These sub-controls either serve special purposes, or don’t fall neatly
into our main categories. They include three sub-groups:
❖ MIDI
❖ File Handling
❖ Other
MIDI
Kelly Lynch’s conversion modules include several sub-control modules
providing MIDI processing interfaces. They entail more than merely
simple data type conversions, so they merit discussion as a separate
group. If you are contemplating using these modules, bear in mind
that GUI and audio are separate processes defying perfect synchroniza-
tion. Though many other KDL MIDI modules convert to and from non-
GUI data types, you won’t find them discussed here because they are
beyond the scope of sub-controls.
KDL GuiFloat2MIDI, KDL GuiInt2MIDI, KDL GuiList2MIDI
Figure 5.163
271
Chapter 5 All About Sub-controls
Figure 5.164
File Handling
These modules let you add custom file browsing and selection features
to your GUI.
DH_FileList, DH_FileList2
Figure 5.165
272
Extending the Sub-control Toolkit
Other
If a module didn’t fit comfortably into any of our categories, it ended up
in this group.
DH_ControlMerger2
Figure 5.166
Figure 5.167
273
Chapter 5 All About Sub-controls
SL_FloatAnimator
Figure 5.168
FloatIO Prefab
The first example is a simple prefab useful for entering and displaying
float values as shown in figure 5.169. Conveniently, it plugs into a float
value on the left or right. Figure 5.170 shows the prefab’s simple struc-
ture comprising a Text Entry2 connected to a Text To Float. Note how
the DH_FloatSplitter connects the Text To Float’s Value plug to both
right- and left-side plugs.
274
More Hands-on Examples
To do this, you must find a way to extract the currently selected item’s
name from the list, which is what a DH_ListExtractor does. Connect it
to the Value plug of the Patch Mem–List 2 (see figure 5.173). We used a
Text Entry2 to display the selection. You could do the same or opt for a
DH_TextDisplay, depending on which offers the colors and fonts you
prefer.
Figure 5.173
275
Chapter 5 All About Sub-controls
You could also connect Bitmap Images to both the Increment and Dec-
rement plugs of Increment2 to step through lists in both directions, as
shown in figures 5.174 and 5.175.
276
More Hands-on Examples
277
Chapter 5 All About Sub-controls
Figure 5.178
278
More Hands-on Examples
Figure 5.179
DH_FloatSubtract subtracts one from the position of the dot (.) to find
the final character’s position, completing step 2.
In step 3, the bottom right DH_FloatSubtract subtracts the rightmost
backslash’s position from the final character’s position to obtain the
length for the DH_SubString module.
Figure 5.180 shows an example of the prefab in use.
Figure 5.180
279
Chapter 5 All About Sub-controls
Figure 5.181
Figure 5.182
For the knobs, we adapted the Knob Sm prefab from the SE Insert:Con-
trols menu to provide float output values. Figure 5.183 shows the
revised Knob structure. Connected to plugs on the Patch Mem–Float
inside the knob structure, the knob’s Min and Max Values range from 0
to 255. Figure 5.182 shows how a DH_FloatToText converts each float
value into text, and how DH_TextToRGB combines them to create a
composite integer RGB value.
280
More Hands-on Examples
Figure 5.183
Figure 5.184
281
Chapter 5 All About Sub-controls
282
More Hands-on Examples
Figure 5.185
Figure 5.186
283
Chapter 5 All About Sub-controls
Figure 5.187
A standard knob prefab from the Insert:Controls menu will do for fine-
tuning. Set its high value to 0.083333 (1/12th), and its low value to 0 so
its full range is one semitone. Its value is added to the quantized knob’s
output value. We opted for a DH_PopupListBox because it displays the
current selection while taking up little space when not in use, and
expands to show all of the available options (in this case) when clicked
(see figures 5.188 and 5.189). Note that DH_TextDisply and
DH_PopupListBox’s titles are blanked out, and do not appear on the
panel view. The DH_TextDisplay Text In plug connects to the IO Mod
so a Name field appears on the prefab’s Properties. This makes it easy
to change the label without having to unlock the prefab or open its
structure view.
284
More Hands-on Examples
Figure 5.190
Figure 5.190 pictures the 4-panel osc selector’s overall structure, yield-
ing the same panel view as in figure 5.186. It takes a little effort to line
up the four sets of controls perfectly in the panel view so that they don’t
shift about when you switch from one oscillator to another. Once in
line, they’ll serve your users well.
Of course, this osc panel selector could use any selection method that
sets one Boolean output to True and all others to False. You could use
one of the KDL PanelSwitch modules with Bitmap Images to create a
tab-like effect as shown in figure 5.191. Here, the DH_TextDisplays on
every oscillator control set prefab’s panel view are sited so each appears
below its tab when the tab is selected. Figure 5.192 shows this struc-
ture.
285
Chapter 5 All About Sub-controls
Figure 5.193
286
More Hands-on Examples
Figure 5.194 shows one way to set this panel up. DH_ControlMerger2
accepts multiple float inputs, and feeds out the most recently adjusted
value and index. Though we wired up just the three controls for this
example, this suffices for demonstrating how this works. The index is
converted to an integer, and used to access an item in the list managed
by DH_TextList2. Pre-loaded from a text file, the list contains entries
for the three controls currently connected to DH_ControlMerger2:
Filter 1 Cutoff;
Filter 1 Resonance;
Filter 1 Env;
Figure 5.194
287
Chapter 5 All About Sub-controls
Figure 5.195
This list uses the same index as the first. The first line is “ Hz;” with a
space as the first character to provide a space between the frequency
number and the Hz unit abbreviation. Resonance amount requires no
adjunct, so the second item is a line with a blank space followed by a
288
More Hands-on Examples
Figure 5.196
For our next little trick, we’ll build a graphic indicator to display the sta-
tus of three MIDI controls—the pitchbend wheel, mod wheel, and
channel aftertouch. Its vertical bar’s heights indicate mod wheel and
aftertouch amounts. A vertical bar indicates the pitch wheel’s amount
of positive action above the midline, and negative bend below it (see fig-
ure 5.196).
Let’s start by building the simplest indicator component first—the mod
wheel display—and save the most complex for last. We’ll use the
DH_MinMaxBar for the display. Set the orientation to Vertical and Min
Value to 0. Max Value will control the height of the bar.
Our plan of attack is to:
❖ Isolate mod wheel messages from the MIDI stream
❖ Extract float values representing the modulation amount
❖ Scale these values to fit DH_MinMaxBar’s 0-to-10 range
First filter everything except mod wheel messages from the MIDI
stream using a DH_MIDIFilter+. Mod wheel messages are sent as
MIDI CC01 messages, with the controller number in the first data byte,
so set the Status to Control Change, and Data1 Min and Data1 Max to
one as shown in figure 5.197.
289
Chapter 5 All About Sub-controls
Figure 5.197
Figure 5.198
290
More Hands-on Examples
Now let’s tackle the channel aftertouch indicator. Though very similar
to the mod wheel indicator, it requires a few changes:
❖ Change the status of DH_MIDIFilter+ to Channel Aftertouch.
❖ Set Data1 Min to 0 and Data1 Max to 127 because the first data byte
indicates the aftertouch amount.
❖ Use the KDL MIDI2GuiFloat’s Data 1 output rather than the Data2
output.
The pitch wheel indicator poses a bigger challenge because the bar
must clear the midline for an upward bend, and dip below it for a
downward bend. This means you have to configure DH_MinMaxBar’s
inputs so that when the wheel turns past the center position, Max Value
ranges from 5 to 10, with Min Value remaining fixed at 5. Likewise,
when the wheel turns past the center position in the other direction,
Max Value must remain fixed at 5, while Min Value ranges from 5
down to 0.
Also bear in mind that pitch bend messages use both data bytes. The
first data byte holds the value’s least significant byte (LSB), and the sec-
ond data byte holds the most significant byte (MSB). MIDI bytes
employ 7 bits representing 128 different values from 0 to 127, so a pitch
bend message’s value is 128 times the MSB value plus the LSB value.
Let’s get the ball rolling by formatting the pitch bend value as a float
value ranging from 0 to 10. Again, a DH_MIDIFilter+ filters out every-
thing apart from the messages of interest, in this case, pitch bend mes-
sages. The defined status is Pitch Bend, and both Data1 and Data2 are
set to the full range of 0 to 127.
Here’s how to combine the LSB and MSB: Use a DH_FloatMultiply to
multiply the KDL MIDI2GuiFloat’s Data 1 output value (the MSB) by
128 and a DH_FloatAdd to add Data 2’s output value (the LSB). Note
that unlike voltages, which add up automatically when connected to the
same point, GUI values must be added explicitly using an add module.
The result is then divided by (127 ∗ 128 + 127)/10 = 1638.3 to scale it
down to the 0-to-10 range. Figure 5.199 shows the circuit we have con-
structed so far.
291
Chapter 5 All About Sub-controls
Figure 5.199
Now let’s see how we can make DH_MaxMinBar’s Min Value range
from 0 to 5 when the scaled pitch bend value is less than 5, and equal to
5 when the pitchbend value is greater than 5. In other words, we want
the Min Value to be the smaller of the current value or 5. And we want
Max Value to range from 5 to 10 for values above 5, and remain at 5 for
lower values, so it must equal the larger of the current value or 5.
In figure 5.200, DH_FloatDivide’s scaled output splits up, feeding a
DH_FloatMin and a DH_FloatMax, each of which receives a constant 5
as another input. DH_FloatMin and DH_FloatMax’s outputs provide
the desired inputs for DH_MaxMinBar’s Min Value and Max Value
plugs.
292
More Hands-on Examples
Figure 5.200
293
Appendix
Bob Moog unveiled the Minimoog in 1970, marking the first real mile-
stone in the history of synthesizers. Wieldy enough for musicians to
play on stage, the Minimoog had the added benefit of bearing the defin-
itive synthesizer pioneer’s name. It wasn’t the first of the breed. Mam-
moth modular systems requiring musicians to connect modules with
patch cords merely to create a single sound predated it. The hassle of
taming these beasts proved too much for all but a few musicians and
bands, among them ’70s-era sonic adventurers Keith Emerson, Walter
nee Wendy Carlos, Tangerine Dream, and Klaus Schulze. The Mini-
moog wasn’t even the first pre-wired, compact synthesizer. The EMS
VCS 3, embraced by artists such as Hawkwind, Yes, and Brian Eno,
preceded it in 1969.
The Minimoog’s basic design provides the template for the classic
synth. It sported three VCOs with one doing double duty as a modulat-
ing LFO, a mixer section, a low-pass filter with resonance, and two
envelope generators, one for the filter and one for amplifier). Competi-
tors soon brought to market variations on the theme. ARP released the
Odyssey in 1972, adding oscillator synchronization, sample and hold,
and a high-pass filter to the sonic equation. The semi-modular ARP
2600 followed in 1971. Though portable and pre-wired, it still offered
some atavistic external cable connections.
295
Appendix A Brief History of Synthesizers
296
forms stored digitally in ROM chips, yet processed sounds using ana-
log filters and the like. The Sequential Prophet VS in 1986 and the PPG
Wave 2 in 1981 brought other forms of synthesis to the world. Those in
the know called the Prophet VS a vector synthesizer, for it could toggle
among four waveforms. The PPG Wave 2 was dubbed a wavetable syn-
thesizer for its ability to scan through a sequence of waveforms stored
in ROM. However imaginative their names, they were in essence sub-
tractive synthesis-driven romplers. The Waldorf MicroWave (1989),
Wave (1995), and later MicroWave II (1997)/XT (1998) took up where
the PPG synths left off.
Two more types of synthesis from this era bear mentioning. Casio
developed phase modulation for their CZ (1985) and VZ (1988) models,
while the Kawai K5 (1987) based on additive synthesis. Like FM synthe-
sizers, they lacked the classic subtractive sound-sculpting capability
that comes courtesy of filters.
The Roland D-50 (1987) and the Korg M1 (1988) went the whole digital
hog. Though their filters, effects, and all other sound-shaping compo-
nents were digital, they continued to take the subtractive path—oscilla-
tor → filter → amplifier plus LFO and additional modulation sources,
with effects like chorus and reverb slapped on for good measure. Rom-
plers are still in production, though with far richer, many more select-
able filters and modulations, and enhanced sound quality, especially
when it comes to waves in ROM. Early models sported 8-bit systems,
followed by 12 and 16 bits with short single-cycle and attack wave-
forms. Today’s synths ship with very complex waveforms. ROM chips
in instruments like the current Yamaha Motifs ES contain up to 173 MB
of wave data (uncompressed).
Though comparatively short, waveforms stored in ROM can conjure
strikingly complex sounds. Listen to a Korg Wavestation (1990), which
brought the benefits of highly flexible wave sequencing to envelope-
controlled oscillators, and you are sure to agree. Its unremarkable com-
mercial success notwithstanding, the Roland JD-800 (1991) was
another highlight of the day. Sliders for touchy-feely instant editing
made a comeback on its chassis.
Analog synthesizers’ renaissance came in the early ’90s, sparked by the
1982 vintage Roland TB-303’s contribution to techno music’s commer-
cial success. Suddenly vintage synthesizers were back in vogue, and
everybody wanted to interact in real time, fondling faders and nudging
knobs to tweak sounds. Soon small companies released a new genera-
tion of analog synthesizers. The Novation Bass-Station (1995), Doepfer
TS-404 (1995), and MAM MB-33 (1997) all sported dedicated knobs,
297
Appendix A Brief History of Synthesizers
switches, and MIDI capability. The analog wave peaked in 2000 with
the release of the Alesis A6 Andromeda, a fantastically complex 16-voice
analog synthesizer. In 2002, even Bob Moog jumped aboard the gravy
train and released an enhanced, programmable Minimoog Voyager.
In the mid ’90s, the guys and gals in white coats let physical modeling
synthesis out the lab and into musicians’ hands. Offering a complex
string model, the Yamaha VP1 debuted in 1995, followed by the VL1/
VL7 in 1995 with reed and brass models. Korg’s efforts yielded the
monophonic Prophecy in 1996 and the polyphonic Z1 in 1997, both fea-
turing various models, analog oscillator emulations among them. Tech-
nics choose a different path for the WSA-1 in 1996, using ROM wave-
forms as drivers. Modeling algorithms and a subsequent subtractive
chain processed the waveforms.
That same year, Clavia released the Nord Lead, the first DSP-powered
virtual analog synthesizer with dedicated knobs and switches for
instant editing. The Roland JP-8000 (1997), Novation SuperNova (1998),
Access Virus A (1998), and Waldorf Q (1999) followed in its footsteps.
Though many brands of synthesis set out to rule the world, none would
match the tenacity and ubiquity of classic subtractive synthesis harking
back to the Minimoog. Its staying power is easily explained: Easy to
grasp, handle, and program, subtractive synthesis is a powerful, intui-
tive way to shape sound. A good sound does not care how it’s been created.
(HGF, 2001)
To learn more about synthesizers and synthesis, visit:
http://www.vintagesynth.org
http://www.synthmuseum.com
http://dictionary.laborlawtalk.com/synthesiser
http://www.cim.mcgill.ca/~clark/nordmodularbook/
nm_book_toc.html
http://arts.ucsc.edu/ems/music/equipment/equipment.html
298
Index
Numerics autofilter7.se1 45
autofilter7gui.se1 47
1 → Many 57 autofilter7gui2.se1 47
1 Pole LP filter 97 automation 22
2 Voice Chorus 77 Autosleeper module 185
3band1.se1 86 average filter 97
4-panel osc Selector 283
B
A
Band pass 24
Access Virus A 298 Band stop 25
Active Detector 183 BasicModulePak 94, 132
adding effects 162 biquad filters 144
adding patches 163 Biquad Stable 145
adding voices 78 bitcrusher1.se1 109
ADSR envelope 131 Bitmap Image 210
ADSR Exp 153 Tinted ~ 215
ADSR Invert 152 Bitmap image 222
ADSR module 29 bitmaps as controls 222
Alesis A6 Andromeda 298 BK_ListToBool 285
aliasing 106 BK_ListToBools2 238
All pass 25 Bool Splitter 218
all-pass filters 63, 80 Bools to List 203
animation 201, 230
Animation Position 210
Appearance 23 C
ARP 295 C:M ratio 172
ARP 2600 295 carrier 168
ASCII 256 cascading SV filters 142
Attack 29 Casio CZ 297
auto filters 35 Casio VZ 297
autofilter1.se1 36 categories 23
autofilter2.se1 38 CC 163
autofilter3.se1 38 center frequencies, ISO standard
autofilter4.se1 39 87
autofilter5.se1 41 Choice list box 25
autofilter6.se1 42
299
Index
300
Index
301
Index
302
Index
303
Index
304
Index
305
RH Logic_Gates 244 sideband frequencies 173
RH Redirect Set 268 sidebands 172
RH_2D_3D_Distance 243 simple filter 32
RH_Bitcount Set 243 Simple FM Example 169
RH_Float_Lcompare 243 skins 22, 46
RH_Int2Text-ascii 256 SL FixedGui Series 245
RH_Int2Text-MidiCC 256 SL Gui Limiters 245
RH_Int-Simple_Logic 244 SL Gui Splitter Series 268
RH_Rescale 245 SL Non-linear Scalers 237
RH-Fold-back 105 SL Slider Linker 89
RH-Fold-back2 105 SL SliderLinker 270
RMS 97 SL_FloatAnimator 274
RMS calculation 98 sleep mode 181
RMS Level Detector Smooth Peaks 139
adding an ~ to a compressor 99 SnH LFO 157
Roland soft clipping 104
D-50 297 soft distortion 102
JD-800 297 soft knee compression 100
JP-8000 298 soft-knee compressor 99
Juno 60 296 sound synthesis 123
Jupiter 8 296 Soundfont Oscillator 29
TB-303 297 spare plugs 17
romplers 296 Special (modules) 27
Root Mean Square, see RMS splitting a list 232
routing modules 218 Spring 207
RPN 163 ST_RUN 182
ST_STATIC 182
state variable filter, see SV filter
S
state-variable 51
saw 124 Stereo Biquad 190
sc:Quantizer 110 stereo controls, adding ~ 89
sc:RevAll-pass 67 stereo cross delay 55
sc:SoftDrive 104 stereo filter 33
Schroeder model 64 stereo LFO 41
Schroeder, Manfred 63 Stereo SV Filter LP 190
schroeder1.se1 65 strings 249–251
Scoofster AutoSleeper module 185 structure 15
Scoofster Low-pass 144 embedding a ~ 54
Scoofster SVF 141 Structure window 14
Scope2 137 sub-controls 27, 193, 198
SDK 29 benefits 197
SE LED2 228 Bitmap Image 210
selector button 232, 275 Bools to List 203
Sequential Circuits 296 dB to Animation 204
Sequential Prophet VS 297 Float Scaler 204
Sequential Sixtrak 296 Float to Bool 208
shelving filters 84 future 293
Index
307
Index
Waveshaper2 188
website, linking to a ~ 226
wet signal 51
white noise 28, 137
vocoder with ~ 114
Y
Yamaha
DX7 123, 168, 296
Motifs ES 297
VL1/VL7 298
VP1 298
308