I have seen this question asked a few times in various places online, and compared to the (outdated) solution in the old SynthEdit e-book this is quite an elegant solution. Your first move is to add a List Entry 4 module, then in the properties, enter the list of waveforms you want to have in your list (lets face it, if you have a four VCO synth, you really don’t need the White Noise and Pink Noise option on each one- you may even opt to have a separate noise source). You need to follow this format very carefully: Sine=0,Saw=1,Ramp=2,Triangle=3,Pulse=4,White Noise=5,Pink Noise=6 Just choose the options you want from this list, and enter them in the Item List box. Only use spaces where I have shown them, and remember the correct format name of waveform before number. You may think having option 0 is odd, but it’s an Enumerated List and in C++ (the language of Synthedit) these always start at 0. The actual text names you use in the list don’t have to be the names that are used in the Modules list, you can use names that are meaningful to you. Connecting the “Hint” plug on the List Entry 4 module to the “Name” plug on the Patch Memory List3 uses the name of the list that the module is connected to as a hint when you hover the mouse cursor oven the list box. The List to Text module supplies the list of items that will appear in the dropdown list, this needs no properties to be set.
The limited choice list in action in a VCO panel.
This can be applied to any module that has a List Selection plug such as an SV Filter, or a TD_Modules LFO. All you need to do is go through the list of options, always starting the list at 0 for the first item, then select the ones you want to keep/use. Note: As usual with PatchMemory modules, don’t copy and paste the one from this module… it WILL retain the values it took from the List Entry 4 module. In the structure below I have adapted the list for the SV Filter to take the Band Reject option out of the list: Low Pass=0,High Pass=1,Bandpass=2
The purpose of this module (as stated in Part1) is to ensure that each oscillator starts randomly out of phase with the rest of the bank. It consists of a bank of seven ED Random Volts modules, with the trigger to generate the random voltages taken from the MIDI input Trigger plug. Note: if you don’t have the ED modules they can be found at https://www.elenadesign.eu/repo/ You must ensure that the Minimum plug is set to -5, and the maximum to 5 on each module to get the correct operation.
The Offset module.
Here we have a Fixed Values (Volts) module to provide our bank of offset voltages. Each one is fed into its own Level Adj module on Input 1 Plug, and the Offset Level input is fed to each amplifier except for the Centre (Oscillator 4), since this is a 0 volts offset it could be left out, but it’s there for the sake of making 100% sure that there’s no offset at all on this Oscillator by holding it at 0 Volts. By this means we can increase the spacing of the offsets, while keeping the frequency ratios constant (this does make sense – honest). The offset level works best with the range of Minimum = 0V and Maximum = 3V (OK you can go beyond 3V offset gain, but to my ears it start to sound really out of tune.) Once again all the fixed voltages for the offsets are shown in the Properties panel on the RHS of the image.
The oscillator prefab is shown below. It consists of seven HD Oscillators (these are included in the community modules found at http://www.synthedit.com/modules/community_modules.zip) In the lower half you can see some plugs with numbers against them. These refer to the “Offset” Voltages. The HD Oscillators give a brighter sound than the original Oscillator modules, each one has its own offset voltage, these are our “Offset Frequencies” as SynthEdit voltages: -0.11002313 V -0.06288439 V -0.01952356 V 0.0 V which is our centre frequency. 0.01991221 V 0.06216538 V 0.10745242 V The ratio between these voltages is always constant, but they pass through an amplifier module which controls the gain equally on each offset, preserving the voltage ratios, but increasing the spacing between them to replicate the original “Offset” control on the Supersaw synthesizer. The Phase Mod plugs are fed by another module which generates a random voltage each time a MIDI trigger pulse is received, this recreates in part the sound of the original oscillator by ensuring that each module starts at a random point the the sawtooth cycle.
Oscillator Bank (Prefab).
Internal structure of the oscillator bank. There are four Input IO Modules: 1) The main pitch input which connects to the Detuner and the MIDI input 2) The Offset, this carries the offset voltages for the oscillators 3) The Phase Input, which carries the random phase control signals for each oscillator. 4) The Level Controls for the Detune (Supersaw) Volume, and the Centre Volume. There is only one IO Output module this carries the Centre Frequency audio output, and the Supersaw audio output
Detailed view of the Control Inputs for the Oscillators and connections.
Detailed view of the Audio Outputs, and Level Control inputs.
First a little bit of history. The Roland JP-8000 synthesizer was released in the mid 1990’s as part of the first wave of virtual analogue modelling hardware synthesizers (or VA synths). One of the types of oscillator was the so called “Supersaw Oscillator”. This relied on one sawtooth oscillator which was fixed to the centre frequency of the note being played, say standard A or 440 Hz. There were six other oscillators which were all slightly de-tunable, however the frequency ratio between the oscillators was always a fixed proportion (except when used with no detuning or in the “unison” mode). These super-saw oscillators provided a “big” lush sound ideal for string sounds, big pads, and much loved by a lot of EDM artists. There is no unfortunately no information easily available from Roland regarding the tuning ratios, however there have been attempts at “reverse engineering”, and there is a complex in-depth analysis on line at: Link to download Adam Szabo’s PDF analysis of how to emulate a super-saw oscillator
This is the SynthEdit “Supersaw” module we can create from what we know from this analysis:
So this is the complete Supersaw module. The buffer modules are just Level Adj modules with the Input 2 plug fixed at 10 Volts.
High pass filtering to improve.
The Anti-Alias HPF in the output is there to cut-off any frequencies below the note(s) played on the keyboard. This is included because by its very nature the Supersaw out plug is carrying a lot of harmonics, which carry the risk of creating some nasty rasping sounds due to some of to some of them clashing and causing aliasing products, this just keeps the sound nice and clean and bright with no raspy LF rumbles.
Going Forward- making the synth your own.
How you construct your final Synth is down to your own preferences, such as adding an LFO, a second ADSR for the filter sweep, types of filter, whether you have another VCO to use as a Sub-Oscillator, or to give the option of a more standard VCO with the usual sine/saw/triangle/pulse choices…the list is endless. I deliberately haven’t shown any controls to keep the layout looking a bit easier to understand. The things to remember are: 1) The Supersaw module needs the Trigger pulse to recreate the sound properly 2) The HPF tracking must be connected to the Pitch output of the MIDI-CV2.
A container is a special type of module that can contain other SynthEdit modules (much like a folder contains files), they can be used to contain all the modules performing a specific function, such as a custom built control using sub controls. Using a Container keeps all the modules in use by this function grouped together making for neater, easier to understand plug in design structures. To see all the modules and patch cords inside a container open its structure view by double clicking the top of the module. Connections into and out of the container are handled by an IO Mod module. SynthEdit will automatically add an IO Mod module when a container is created, however you can add more if you wish so that you can keep inputs, outputs and controls separated. Open the containers Panel View (right click- Panel Edit) to see the user controls inside the container, or you can display the controls on the module itself by enabling the Containers Controls on module in the properties panel Using containers will not generally harm efficiency. Audio doesn’t actually travel through the IO Module, but goes directly to the correct destination.
Left Hand Side
-> Visible:- Determines if any controls inside the container will be visible in the main panel. This can be used to switch between control panels, and hide controls when they are either irrelevant, or not required (I.e. for advanced and basic control panels, or hiding a sequencer when not in use ). Important note: if there are GUI modules in the container that are essential to the operation of your Synth/Effect this container must always be visible for the Synth/Effect to work correctly. Never, and I really do mean never put GUI and DSP modules in the same container if the Synth relies on the DSP modules! -> Inputs:- (In this case MIDI In) – Variable – Depends on the internal structure of the module, and any external connections.
Right Hand Side: <- Outputs:- (In this case Trigger, Gate etc.) Variable – Depends on the internal structure of the module, and any external connections.
Locking Containers (V1.4 only). Containers are marked with an icon that also shows if the container’s structure and panel views are locked for editing. As well as the change in padlock icon to red, any “Spare” plugs will also be hidden. You can still add modules, change parameters, and use the controls in panel view, but you cannot delete anything, or change the panel layout once it’s locked. Note: In V1.5 the lock icon never appears as only the panel view is lockable. In V1.5 the contents of a container are always editable, they are never locked.
Containers serve these purposes:
1) Allows the grouping of a synthesizer’s functions into easy to manage groups of modules. For example, separating the Filter and LFO sections of a synthesizer. 2) Containers are used for controlling SynthEdit’s polyphonic behaviour. The default number of voices for a container is 6. Note: A container is only made Polyphonic if it connected directly or indirectly to a MIDI To CV 2 module. 3) Keeping things neater and more manageable: If you containerize the various synthesizer modules in your project, you’ll be able to understand the signal flow, patching, and which module does what a lot easier than one big sprawling mess of modules and patch cables!
Containerizing existing modules. You don’t need to add an IO Module to the structure SE does this for you as soon as you “containerize” your modules. (Unless of course you want to add more)
Creating an empty Container. Just create the Container as you would any other module, when you open it you’ll find one IO module inside, you can add others for outputs, controls etc.
NOTE: If you intend to use several independent synths in a project, each one must be inside its own container.
NOTE: If you use modules that have a default value internally set to one of the plugs, such as the Level Adj module inside a container, and connect these to an IO Module the IO Module’s Plugs will then take on this default value, which in the case of control voltages can cause unwanted offsets. (See below)
The internal structure of the Container is above, and as you can see the Rectifier and Inverter inputs read 0 volts in the properties, whereas the Level Adj1/2 inputs read 8 volts. In some structures this could lead to you ending up with an unwanted 8 Volts offset on a control voltage.
Using GUI connections into Containers.
SynthEdit Sub Controls are only active when the control panel window is open. When you close the control panel, the sub-controls become inactive. Note: GUI pins will only communicate with modules visible in the same window. This behaviour is to support the new VST3 standards. Example: – You have a Knob image which is inside a Container, connected to Patch Memory which is outside the container. The knob cannot respond to mouse movements and is ‘frozen’. It’s usually only the structure view that experiences the issue, if the knob’s container has ‘Controls on Parent’ set it will work fine on the Panel view. The reason is – With ‘Control on Parent’ set, the knob is displayed on it’s parent container’s window, the same container the Patch Memory is in. This can be confusing – So whenever possible, confine your GUI connections within the same container.
TIP: Remember to name your containers so you know what they do. Renaming as things like VCO, VCF, Modulation routing etc. will help you when revisiting older projects to make changes, or fix bugs.
GUI modules need to be seen
Sub Controls function only while their Container’s Panel is open. i.e. if you close you synthesiser’s control panel, those sub controls become inactive. Therefore you must never rely on GUI modules to process audio signals (there are other very good reasons too). The exception is hybrid modules such as Patch Memory which continue to provide patch-selection and automation functions via their DSP plugs.
Avoid using splitters
Due to a design mistake, SynthEdit 1.0 had the Container’s ‘Control on Parent’ pin on the wrong side. This made it impossible to connect it to a Patch Memory module (needed for save/recall of paged panel settings). The ‘Bool Splitter’ was introduced to fix this problem, but the bool splitter causes problems of it’s own. The bool splitter ‘reflects’ any one input signal back out it’s other inputs, this is a bad design because it is not clear which module is in control of the others. The result is modules ‘fighting’ each other for control. Symptoms include ‘flaky’ inconsistent behaviour and patches not saved/recalled correctly. 3rd party module developers have sometimes copied SynthEdit’s example and released modules that rely on the use of splitters. If at all possible avoid using splitters.
Patch Memory Modules.
Don’t cut and paste them from another part of the structure, as they will retain their old values, and it may be extremely difficult to remove these values, or you’ll get unpredictable behaviour. Patch Memory modules retain the last lot of values they received from the connections they had to the modules in question. Well after all they are called memory modules.
Displaying text labels for controls or module functions on a container panel.
It may seem like a good idea to use a Patch Memory Text Out module, and a Text Entry4 module to allow you to change the name on a control held inside a container. After all you can just edit the text in the containers properties, and it will them be retained for all time can’t you? Trap: Well yes it will work, but you’ll find that the text will not display if the audio engine isn’t running, it will be OK in the VST, but not in Synthedit. Also if the Prefab in the container was given text labels when it was created and you want to change them it may well give you a hard time updating them (see above). It’s a little unpredictable, and if you copy and paste the modules the text in the labels can get you into quite a tangle trying to sort it out. You have been warned. TRAP: Another method is to put a Text Entry4 module in the container with no connections, untick the “Writeable” property and when you want to label the control open the container and edit the text from there, it will still be retained until you change it. Recommended method of adding control labels and Panel labels: The best method is to use use either a stock or third party Text Entry module, and take the Text output to an IO module so you can edit the text label. This means no reliance on Patch Memory and the Audio Engine Running. Just make sure the Container properties are set to “Visible“ TIP: Most third party Text Entry modules (Elena Novaretti’s for example) also have Text and Background ARGB colour plugs you can link to an IO module for editing too.
This is a useful but sometimes misunderstood module (unless you have a background in electronics. I’m (hopefully) going to try and make it simpler to understand what they do and how to use them.
What a comparator actually does.
The comparator has one simple function. The name sort of gives it away really. It has two inputs; Input A and Input B. We are basically comparing A with B and changing the output when A is greater than B. Input A is normally a variable voltage, and Input B is a fixed or reference voltage. Say our reference (B) is 5 Volts, when Input A is greater than our reference of 5 volts the comparator will change its output from Low to High, if the value falls below the reference of 5 volts the output will change from High to Low. Often these high and low values will be something like Low = 0 Volts, High = 5 Volts in line with hardware logic voltages. With the SynthEdit Comparator module we have two further input plugs Hi Out Val, and Lo Out Val. with these we can set the High Value, and Low value that will be output. So if you wanted you could specify that when the comparator was triggered (or High) the output would be 3 Volts, and when it was not triggered (or Low) the output would be 6 volts. This makes the comparator quite a versatile tool for controlling signal flow and other modules.
What a comparator does not do.
It does not act as an amplifier or attenuator. It does not change the frequency of audio.
Here’s some layouts to demonstrate what I’m talking about.
Below you can see a more visual demonstration with a Sinewave input.
Changing the reference value only changes the point at which we switch from low to high. The only effect on the output is the point at which we switch. To change the output levels we change the Hi out and Lo out values.
It’s quite easy using a comparator to create a variable width pulse from a waveform such as sine or triangle. Any time you want to compare two voltages to control another module, the comparator is your go-to module.
Example:-Gated Amplifier.
As the comparator itself doesn’t strictly pass audio through (unchanged anyway-it would be very distorted as it will just create a massively clipped version of the audio input) we can’t use it to pass audio through when the level exceeds the threshold voltage, but there’s an easy way to fix this, by creating a quite versatile gated amplifier by using a few extra modules. The idea of this structure is to take an audio input, use the peak follower to calculate the maximum level of the audio input, and use this to compare to our threshold voltage, as soon as the level exceeds the threshold + 10 volts is sent to Input 2 of the Level Adj module (that’s our gate, 0 Volts on input 2 = no output, and 10 Volts on input 2 = Full volume. The Attack and Decay sliders set how quickly the Peak Follower and thus the Comparator will respond to changes in level of the signal, and thus how quickly the gate will open after you exceed the threshold, and how quickly the gate will close after the input drops below the threshold. Attack/Decay times that are too fast will result in low frequencies becoming “glitchy” and sounding distorted. Note-Audio Levels and Threshold voltage: Audio in Synthedit is at a default of -5 to +5 V volts peak to peak, so we only need a maximum of 5 Volts for the Maximum value on the slider (In reality you’ll probably want to set the threshold quite a bit lower than this). Note-Threshold polarity: Although the audio input is -5 to +5V peak to peak, the output from our peak level detector is always positive, so the Threshold voltage should only be positive (-ve threshold voltage = permanent silence). Of course you might want to reverse this and only pass signals below a threshold, to do this just reverse the values on the Hi/Lo Out Val plugs (Hi = 0V, Lo= 10V).
This is another good module to gain an understanding of how sub controls work, and how the various modules interact.
The Stock Joystick module
It’s all fairly standard stuff in this prefab, apart from introducing the Spring Module. The Joystick Image module reports both of the Joystick control image X and Y positions as floating point values in the normal default range of 0 to 1 (Position X and Position Y plugs). A static Bitmap Image provides the background for the joystick control. Scaled from 0 to 1, the X and Y Positions plugs are connected to the Animation Position input plugs of the respective PatchMemory Float 3 modules. The PatchMemory Float3 Low Value and High Value are set to −5 and +5, respectively, which are set in the Properties panel.
These modules scale the Animation Position to float values within this range, and the Floating Point values are then converted to Voltages by the Float to Volts modules, and the voltages are fed to the X and Y output plugs. When the user releases the left mouse button after clicking or dragging the joystick knob, the Mouse Down value changes from True to False, this value is then input to both of the Spring Modules which sets the Animation Positions to the default value of 0.5, thereby centering the joystick knob as soon as the left mouse button is released. The default return value is set in the Properties Panel (see below). For the X axis: 0 = Left, 0.5 = Centre, 1.0 = Right. For the X axis: 0 = Bottom, 0.5 = Centre, 1.0 = Top.
Creating a custom slider control from a joystick control.
Its suggested in the SE help file that using the stock Joystick Image GUI control is a good place to start creating your own slider control. You can, but I find a much better option is the third party ED Joystick Image control, as this allows you to “constrain” the movement of the control in the X or Y axis, whereas the native SE control doesn’t, meaning you can still move the control horizontally…not ideal. By constrain we mean that you can set limits on how far the joystick’s knob can be moved in the X or Y axis, so if we set a minimum of 0.5 and a maximum of 0.5 for the Constrain X Min, and Constrain X Max, and leave the Constrain Y values at their default of 0 for the Minimum, and 1.0 for the Maximum, then we will get a vertical slider control, with no possibility of horizontal movement.
The structure of our new slider control prefab. There’s nothing too unusual in here, just a few things need explaining. Module names: Slider = ED Joystick Image. Scale = Image2 (SE Sub-Controls) Title = Text Entry4 Value = Text Entry4 I have just renamed these to make it easier to see what’s going on. You won’t find the Slider knob image or the Scale image in SE, you would need to create these yourself. This can be done in Paintshop Pro, Photoshop or similar editing software by cropping the scale off the VSlider_Med.png image and saving the knob as Slider-Knob.png (for example) and copying and pasting the scale into a new image V-Slider-Scale.png (for example). Don’t use the existing file names as this will mess up the SE controls! Don’t forget to save them as .png to preserve the transparency. You can now modify the new slider scale to the length you can require, and stretch your new slider control to fit. Note: you cannot “stretch” or resize the images used by the SE Image2 Sub-control. The Patch Memory modules on the Title and Decimal point are to enable you to set your values for the control without opening it, and editing, however the values you set will no show until you run the audio engine. The CTRL Scaling Factor sets how finely you can control the slider when the CTRL key is held down. For most purposes the default of 0.1 is fine.
The finished prefab control. I have put in output plugs for GUI as well as DSP controls, including the animation position, whether you do so is entirely up to you. As the DSP Float output is taken from the Patch Memory Float3 it’s already normalized, and suitable for DSP usage.