Give Me 3 Synths
In my next three articles I'll profile three native Linux software synthesizers (a.k.a. softsynths). I'll introduce their basic synthesis architectures and program operations, then I'll guide my readers briefly through the process of creating a new sound for each synth profiled. Our voyage begins with Nick Dowell's Analogue Modeling SYNTHesizer, better known as amSynth.
amSynth Synthesis Basics
The amSynth Web page advertises that the program "... provides virtual analogue synthesis in the style of the classic Moog Minimoog/Roland Junos". If you've never heard those instruments, check out some of the excellent demonstrations of the MiniMoog and Juno G/60/106 synths on YouTube to get an idea of what kind of sounds amSynth sets out to produce.
The Roland and Moog synthesizers are considered the classic analog synths, with highly characteristic audio palettes resulting from unique implementations of the fundamental design for all similar subtractive synthesizers. An oscillator supplies the primary audio signal source by cycling a waveform such as a sine or sawtooth wave at a designated frequency. The output from the oscillator is filtered to subtract unwanted frequency ranges, then the filtered signal is fitted with an amplitude envelope, modulated by an LFO (low frequency oscillator) and optionally further processed with effects such as reverb and distortion. A simple process, but the possibilities increase greatly when two or more oscillators provide the audio source.
amSynth (Figure 1) follows the classic subtractive synthesis design and adds a few niceties of its own. The core audio source is a pair of analog-style oscillators, each with access to five cyclic waveforms and one noise source. The output from this stage passes through amSynth's unique mixer to balance the combined oscillators and apply an optional ring modulation effect. The mixed signal is then sent through a very Moog-like filter (with ADSR envelope) and on to the amplifier stage (and its own ADSR envelope). The separation of filter and amplifier envelopes is significant in sound design for amSynth, it allows independent control of the sound's harmonic content and amplitude.
The LFO is optional, but unless you prefer flat dead sounds you'll definitely want to use it. The LFO modulates its target by "disturbing" it with a very low frequency. When applied to the amplifier the LFO produces a vibrato effect, very useful for animating a static sound. Interesting pitch and spectral effects occur when the LFO is applied to the oscillators or the filter stage. For a final sweetening you can apply some high-quality reverb (Freeverb, actually), or a dash of amSynth's own pretty good distortion/crunch effect.
amSynth will autodetect the running audio and MIDI systems, or you can use the Config/Audio & MIDI dialog (Figure 2) to manually select ALSA, OSS, or JACK audio I/O, along with ALSA or OSS MIDI connectivity. amSynth automatically connects to a running JACK system, but you can easily redefine its audio and MIDI connections with a utility such as QJackCtl or Patchage. Alas, amSynth currently has no support for LASH or JACK MIDI.
MIDI controllers may be assigned to any amSynth parameter through the simple Config/MIDI Controllers dialog (Figure 3). This capability allows dynamic synthesis programming with MIDI control surfaces or sequencer tracks. Figure 4 demonstrates a simple setup in which controller #1 (Mod Wheel) operates amSynth's Frequency Modulation Amount knob while controller #8 (Balance) does the same for the Filter Modulation Amount.
Polyphony and the MIDI Receive channel can be set with the scrollers in the top right corner of the main display. Settings at 0 will result in peak values for both settings, i.e. polyphonic play of up to 128 voices and reception on all 16 MIDI channels.
All of amSynth's panels and controls are presented in a single window. Knobs are controlled by clicking and holding the left mouse button, but be aware that the parameter value will jump from its current location to the pointer's position on the knob.
As advertised, amSynth is easy to learn and simple to navigate. Now let's see how easily we can make a new sound with amSynth.
Given its relatively small number of building blocks and their uncomplicated natures, classical subtractive synthesis is a straightforward process. You tune your oscillators, filter them for your desired harmonic content, and amplify the results to your satisfaction. I could build a preset from amSynth's initialized plain-vanilla settings, but I'm going to cheat a little instead. First I'll derive a new preset from an old one, then I'll use amSynth's preset randomizer to create a completely new sound.
amSynth opens with the Derren preset, which you can hear in its square-waved glory in amSynth Example 1. For this first example I'll alter only one parameter: I'll change the first oscillator's waveform from a square wave to a sine. Now listen to the dramatic effect of that single change in amSynth Example 2. At this point I save the changes, rename the preset, save the sound bank, and proceed to my next project.
I ran the Preset/Randomise function on amSynth's second default preset, Synth Strings 1. I began with certain characteristics of the desired sound already in my inner ear, and I knew I wanted a sustained sound for a soft pad. I used the randomization as a starting point, with the understanding that it is a rather unpredictable tool. I expected to do some tweaking to get closer to my sonic ideal, especially since the randomization is unmasked, meaning that it could affect every function in amSynth. The careful experimenter will always check the distortion and master volume levels after every randomization and keep them low for the sake of his or her speakers.
I applied the randomizer about a dozen times before it produced a sound with internal movement sufficient to fit my needs. I fiddled with various settings, with special attention to envelope parameters, until I had formed a slowly modulating sound useful for sustained pads. You can see the final program in Figure 5 and hear its audio output in Random Pad 1.
I have a few helpful habits when working with amSynth's preset randomizer. The process returns a high percentage of sounds with noise and random waveforms, often at high volume, but before I abandon them I drop the output level and switch the oscillator waves to the more cyclic forms. If the sound is too organ-like I un-sync the oscillators and activate the mixer's ring modulator. I also routinely finesse the amplifier's output envelope with values for more sensible sustain and release times. The filter and modulation parameters control the sound's spectral liveliness, but I like to define the amplitude envelope first. Incidentally, amSynth's controls responds quickly and smoothly to parameter changes in realtime, manually or via MIDI. However, wide abrupt changes in value will probably cause discontinuities in the audio output.
amSynth is not multitimbral, but you can run multiple instances. The File menu includes a New Instance item, but it crashes JACK on my JAD 1.0 system. Fortunately I can successfully invoke amSynth repeatedly from a terminal prompt or from my Fluxbox applications menu. Each instance can have its own MIDI channel, so it's a simple matter to set up a multitimbral suite of amSynths.
Alas, amSynth has been an orphaned project since its last public release (1.2.0) in late 2006. Nevertheless, it is an open-source project licensed under the GPL, so hope remains that someone will someday pick up where its original author left off. Fortunately amSynth is in a nicely usable state right now. It needs more original presets, and hopefully I've inspired a reader or two to get under its hood and start building their own custom sound banks. amSynth is easy to program, and it's great fun to make your own sounds, so hop to it and be sure to let me know if you come up with some interesting sounds and music for this very fine analogue modeling synthesizer.
Similis sum folio de quo ludunt venti.
- October 2014 Issue of Linux Journal: Embedded
- Encrypt Your Dog (Mutt and GPG)
- Practical Tiny Core in the Fire Service
- DevOps for Dummies
- Tech Tip: Really Simple HTTP Server with Python
- New Products
- New Products
- Python Scripts as a Replacement for Bash Utility Scripts
- Open Axiom
- Returning Values from Bash Functions
Free DevOps eBooks, Videos, and more!
Regardless of where you are in your DevOps process, Linux Journal can help!
We offer here the DEFINITIVE DevOps for Dummies, a mobile Application Development Primer, and advice & help from the expert sources like:
- Linux Journal