SEM: (developers)

Developer Reference

Felt duty bound to update a previous document on elementary DSP. Next on my vague intimations list is a version with notes on the Win32 SDK.

download dsp pdf

SEM Modules for SynthEdit

SEMs were grouped in zip distributions as they were developed. My opinion is that it's better to develop your own custom SEMs to fit your application. The SDK is simple to use with Borland FCLT and allows you to use an rudimentary knowledge of C++ to accomplish most tasks easily, and moves you in the right direction to boot.

There was and is no documentation for most SEMs, many are unoptimised, some have denormals and a few have bugs. Some work pretty good! :) Rather than take the time to sort them, I'd rather encourage you to take the few hours to install FCLT and read the free C++ .pdfs from microsoft and help yourself. The listings below are provided primarily for support of old projects.

Volts to Scale SEMs
       Three sems that sort SE volts to preset or user defined scales.

April 2009 SEM Update
       An assortment of new modules faster to add as a group :) Includes:

5bpfs - 5 band pass filters, 5 in/outs
5bpfsa - 5 band pass filters applied to one signal
bwg9 - 9 band banded waveguide
decimals5 - separate outputs for 5 decimal places
flow switch4/8 - outputs volts for flow control for last gated input
latch3 - output goes high on clock pulse after gate
latch4 - 10v output goes to 0v on gate until next clock pulse
m-s - simple 1st order mass-spring
rnd mix/rnd sel - pulse driven randomised many>1 modules set by % value
stoq0 - stochastic impulse train generator
stoq1 - above mk. II

DSP Pack
seed4 - generates recallable sequence of seed values
seed6 - generates recallable sequence of seed values
seeds4 - generates 4 seed values
seeds8 - generates 8 seed values
seeds12 - generates 12 seed values
seeds16 - generates 16 seed values

       Clocks and Counters:
clock1 - simple pulse clock with reset pin
clock2 - pulse clock with randomisation
count - counter with gate and reset pins
count3 - counter adds interval, loop, wrap, and start pins and loop pulse out
count4 - adds bounce mode, improved
regular - outputs a pulse for every nth pulse received
regular2 - adds ability to limit number of pulses output until reset
segments - similar to regular with randomisable increment value
wakegui - outputs a pulse when input signal changes with rate ceiling

accum - created for tracking the speed of joystick movement. output voltage increases with modulation.
allpass - 1-pole allpass to complement native 2-pole (frequency dependent phase response - view sawtooth osc with scope)
allpass res - unoptimised. simple multitap delay with damping and allpass for easy resonance modeling.
cos - unoptimised. simple cosine module.
drift - smoothes modulation with separate 'down' and 'up' rates
plate1 - simple rectangular algorithmic reverb. denormals :)
softsides - independent high and low limiting (limit = 1v past threshold)
softsides2 - adds variable squishing amount
spring1 - simple spring reverb emulation. also denormals :)
verb5s/6m/8m/10apm - four simple algorithmic reverbs. not the best but perhaps useful somewhere

env1 - a simple 0-10v when triggered. my first sleeping envelope so hopefully okay.

gate switch - 2>1 control voltage switch operated by two gate pins
gate toggle - toggles cv signals between two destinations
latch - outputs pulse on first gate on or after reset. must be reset before new pulse
latch2 - output stays high on gate until reset
NO gate - outputs 10v if first pin is > 0v unless 2nd pin is > 0v
toggle - gate switches 10v signal between two outputs

brush - impulse cluster modeler
gravity - attractor based oscillator
msres1 - 1st order mass-spring resonator (creates decaying sine)
msres2 - 2nd order mass-spring resonator with reflective bounding for modeling impulses and percussion
msres2sync - adds sync pin
msres3 - 3rd order mass-spring resonator (no limiting)
msres7 - 7th order resonator, perhaps useful for bell synthesis
noise3 - syncable noise source (clips)
noise4 - syncable noise source (doesn't clip)
noise5 - syncable cz101 style noise source (pulse output)
noise6 - syncable sawtooth oscillator with randomised frequency per wavecycle
noise6si - as above with sine waveform
noise6sq - as above with square waveform
osc7sq - 7 low-cpu squarewave oscs for analog hihat emulation (hipass for 808)
perfecto - 2 cross-modulating oscs with very high cpu (my first for audio)
t osc - attractor based oscillator

phase seq - produces gate signals for 8 phase locations (Phase Seq VST)
pulse to gate - transforms pulses into timed multitriggers
serial - an indexable 16 step sequencer
stepseq - a clocked 16 step sequencer with reset to step
word seq1 - passes up to 12 input voltages at specified times, for sequencing phonemes

cz101ms - converts 0-99v to cz101 envelope times
volts to note info - splits pitch voltage for note name animations

Waveguide SEMs

This first generation of waveguide SEMs are primitive.. most have no internal gain or gain balancing and 'explode' easily with high gain levels, so watch your ears (and use a limiter!) when experimenting with them.

boing - bowed string waveguide
brush - impulse cluster modeler
cylinder33 - waveguide drum module
fauna - fauna vsti dsp bore
kl tract - kelly-lochbaum vocal tract module
oscine tract - songbird vocal tract waveguide
pling peq - plucked string waveguide with inline parametric eq
reed5c - 1st order reed with 1 register hole and inline parametric eq
snare1 - cylinder33 with 4 'snare' vectors
sym5p - 5 channel fdn with parametric eq

Here's a replacement for the default background I find useful for positioning GUI elements.

Using Borland FCLT for the SynthEdit SDK

I use Borland's ancient free compiler Free Command Line Tools to compile SEMs. There are instructions for Microsoft's free Visual C++ compiler elsewhere online. Personally I find the IDEless FCLT immensely less complicated. You are left to find instructions for installing FCLT elsewhere as well.. this information is duplicated in several places online. While slightly involved, it shouldn't take more than half an hour from start to finish to install the FCLT compiler.

To install the SynthEdit SDK, place the synthedit SDK folder structure inside ..\Program Files\Synthedit\

Inside the SDK folder, create a shortcut (right click > new > shortcut) to cmd.exe (the DOS command window). If your XP install is like mine, the 'Target' field is %SystemRoot%\system32\cmd.exe

To create a SEM, open the bc_make.bat file (Borland Compiler Makefile) with Notepad or any other text editor (one with line numbers is handy) and replace 'se-gain' with the name of the module you wish to create.

Edit Module.cpp with Notepad to add your code and Module.h (header) to add your variable declarations.

If you don't already know C++, I recommend "C++ A Beginner's Guide" by Herbert Schildt. Microsoft have recently decided to distribute this as a free .pdf. Schildt is precise and clear in is language and thorough in his explanation, anyone who writes instructions should familiarise themselves with his style. The first few hundred pages are enough to implement audio processing, you may find all the knowledge you need for simple functions in the first 50 pages. INTs are good - floats and doubles are more cpu intensive to compute.

To compile a module, double-click on the shortcut to run the command window. To go into a folder, type cd foldername [enter] and to exit a folder, type cd ..\ [enter]

Navigate into the folder for the module you want to compile and type bc_make [enter]

This performs the same action as executing the bc_make.bat file by clicking on it.

The DOS window will display error messages or a confirmation that the file has been created and copied successfully. If it's a simple module, the whole process might not take you more than two minutes.

No, really! Without having to learn an IDE, it really is that simple!

Here are some quick .gifs to illustrate how simple it is to adapt the se_gain2 script to make your own modules.

Please note that this was one of my first SEMs, so don't copy the code!!! I used this example because it shows how to implement a function and how to modify the se_gain2 example to make your module stay awake.

The code is, specifically, the *wrong* way to code a delay, although I own a budget hardware module that uses the same technique! A circular buffer technique is preferable.. and, if it doesn't need to be more than 65536 samples long, using UNSIGNED SHORT INTs for the pointer and read variables means that you don't have to do any bounds checking and wrapping, because they wrap automatically ;) So DON'T read the code, just glance at the notes.

HEADER FILE (Module.h)

original content © 2011 xoxos · all rights reserved

VST PlugIn Interface Technology by Steinberg Media Technologies GmbH