JS80P

A MIDI driven, performance oriented, versatile, free and open source synthesizer VST plugin for Linux and Windows
JS80P screenshot
JS80P has two oscillators (and a sub-harmonic sine), and a lot of filters, effects, envelopes, LFOs, and powerful macros to shape your sound with subtractive, additive, FM, PM, and AM synthesis, complete with polyphonic, monophonic, and split keyboard modes, MTS-ESP tuning support, and analog imperfection emulation.
JS80P is VST compatible - VST® is a trademark of Steinberg Media Technologies GmbH, registered in Europe and other countries.

Download (v3.0.0)

Which distribution should I download?

For newer CPUs with AVX

Windows and Linux, 64 bit

Windows

Linux

For older CPUs with SSE2

Windows and Linux, 64 bit and 32 bit

Windows

Linux

Source Code

What's New in v3.0.0

  • Oscillator fine detune range can now go from -4 octaves to +4 octaves.

  • LFO amount can now be controlled by an Envelope when the LFO is assigned to a polyphonic parameter.

  • LFO frequency can now use logarithmic scale.

  • Envelope attack, decay, and release shape can now be configured.

  • Envelope time parameters can now be tempo-synced, so that their unit of measurement becomes beats instead of seconds.

  • Voices can now update Envelope settings optionally at note end as well.

  • The number of Envelopes has been increased to 12.

  • The number of Macros has been increased to 30.

  • Macro distortion shape can now be configured.

  • The midpoint of Macros can now be customized, making it easier to shape the pitch bend wheel's range.

  • Filter Q parameter can also use logarithmic scale.

  • The Echo and Reverb effects can now apply gradually increasing distortion to the delayed signal.

  • The Q factor of the high-pass filter can now be adjusted in the Chorus, Echo, and Reverb effects.

  • The released note and the release velocity can also be used as a parameter controller. (Note: unfortunately, most MIDI keyboards don't send meaningful note release velocities.)

  • Improved MIDI compatibility, including responding to Monophonic Mode ON/OFF messages.

  • New operating modes: monophonic hold and polyphonic hold to keep notes ringing without a sustain pedal.

  • Various performance and RAM usage improvements.

  • The source distribution can now be compiled for RISC-V 64 systems thanks to @aimixsaka.

  • New presets: Analog Brass AT, Analog Brass mod, Bouncy.

  • All parameters and features are now explained in detail in the documentation.

  • FST: hosts which support VSTXML files can now show full length parameter names instead of abbreviations.

  • Bugfix: when a MIDI-based controller (or its proxy parameter) was assigned directly to a parameter (ie. not via a Macro), and a buffer size greater than 256 samples was in use, then changes of the controller could produce sudden jumps and audible glitches in the parameter's value. Now these changes are always performed smoothly.

  • Bugfix: some MIDI devices send Note Off messages as Note On messages with 0 velocity. These messages were misinterpreted, but now they are handled correctly.

  • Bugfix: neither the FST nor the VST 3 plugin notified the host when a parameter was changed or a patch was loaded from file, so the host wouldn't ask the user when exiting whether to write unsaved changes to disk, and the undo history wasn't updated either. Now both plugin types will notify the host when something is changed on JS80P's user interface.

  • Bugfix: dynamic envelope parameter changes could produce glitches, sudden jumps, and some sections of the envelope could get lost, especially in monophonic mode.

  • Bugfix: decayed notes were not garbage collected when envelopes were assigned only to the amplitude parameter of the oscillators, but not to the first oscillator's subharmonic amplitude which was left at the default 0 setting. (E.g. the Bells 1 and 2 presets while holding the sustain pedal.)

  • Bugfix: the FST plugin will no longer crash if it is loaded in a host which does not supply a host-callback. (Hosts like that are probably rare, and features like tempo-synchronization cannot work in such hosts.)

Demos


Demo 4: JS80P v3.0.0 in REAPER 7.14
Download: MP3 | FLAC | MIDI | patch

Demo 3: JS80P v1.7.3 in REAPER 6.79
Download: MP3 | FLAC | MIDI | patch

Demo 2: JS80P v1.0 in REAPER 4.402
Download: MP3 | FLAC | MIDI | patch

Demo 1: JS80P v1.0 in REAPER 4.402
Download: MP3 | FLAC | MIDI | patch

Table of Contents

Features

Table of Contents

Installation

Before Installing: Choosing a Distribution

If your plugin host application does not support VST 3, but does support VST 2.4, then you have to download and install the FST version of JS80P. Otherwise, you should go with a VST 3 bundle on both Windows and Linux.

If your CPU supports AVX instructions and you use a 64 bit plugin host application (also known as "x86_64"), then you should download a JS80P package that is optimized for AVX compatible processors. If you have an older computer, or if you experience crashes, then you should go with one of the SSE2 compatible JS80P packages.

If you are using an older VST 3 host, or if you are running a 32 bit (also known as "i686" or "x86") VST 3 host on a 64 bit Linux system, then it might not be able to load the VST 3 bundle, so you will have to go with a VST 3 single file JS80P package that matches the architecture of your host application.

The 32 bit versions are usually only needed by those who deliberately use a 32 bit plugin host application, e.g. because they want to keep using some really old plugins which are not available for 64 bit systems.

If you are in doubt, then try the VST 3 bundle, and if your plugin host application doesn't recognize it, then try the 64 bit VST 3 single file edition, then the 64 bit FST version, then the 32 bit VST 3 single file edition, and so on.

Note that all versions use the same high-precision sound synthesis engine internally, so the CPU architecture does not affect the sound quality.

Packages

These are the file names that you will find on GitHub on the "Releases" page:

Table of Contents

System Requirements

Tested with REAPER 7.14.

A buffer size of around 6 ms (256 samples at 44.1 kHz sample rate) usually gives good performance and low latency.

Note: a RISC-V 64 port is available as a separate project by @aimixsaka.

Dependencies on Windows

Typical Windows systems usually have the MSVC library already installed, but in case you need it, you can download it from Microsoft's website.

(Most people need the X64 version of this library. To use the 32 bit version of the plugin, you will need the X86 version of the library. See the Before Installing: Choosing a Distribution section for more information.)

Dependencies on Linux

On Linux, the libxcb, libxcb-render, and libcairo libraries, and either the kdialog or the zenity application are required to run JS80P. To install them on Debian based distributions (e.g. Ubuntu), you can use the following command:

sudo apt-get install libxcb1 libxcb-render0 libcairo2 zenity kdialog

Note that if you want to run the 32 bit version of JS80P on a 64 bit system, then you will have to install the 32 bit version of the libraries, for example:

sudo apt-get install libxcb1:i386 libxcb-render0:i386 libcairo2:i386 zenity kdialog

VST 3 Bundle on Windows

  1. Download JS80P.
  2. Extract the ZIP archive.
  3. Copy the entire js80p.vst3 folder to your VST 3 folder which is usually C:\Users\YourUserName\AppData\Local\Programs\Common\VST3.

VST 3 Bundle on Linux

  1. Download JS80P.
  2. Extract the ZIP archive.
  3. Copy the entire js80p.vst3 directory to your VST 3 directory which is usually ~/.vst3.

VST 3 Single File on Windows

  1. Download JS80P.
  2. Extract the ZIP archive.
  3. Copy the js80p.vst3 file to your VST 3 folder which is usually C:\Users\YourUserName\AppData\Local\Programs\Common\VST3.

VST 3 Single File on Linux

  1. Download JS80P.
  2. Extract the ZIP archive.
  3. Copy the js80p.vst3 file to your VST 3 directory which is usually ~/.vst3.

FST (VST 2.4) on Windows

  1. Download JS80P.
  2. Extract the ZIP archive.
  3. Copy the js80p.dll file to the folder where you keep your VST 2.4 plugins.
  4. Optionally, if your host application can load .vstxml files, it is recommended to copy the js80p.vstxml file as well to the folder where you keep your VST 2.4 plugins.

Note: VST 2.4 plugins are usually put in the C:\Program Files\VstPlugins folder.

FST (VST 2.4) on Linux

  1. Download JS80P.
  2. Extract the ZIP archive.
  3. Copy the js80p.so file to the directory where you keep your VST 2.4 plugins.
  4. Optionally, if your host application can load .vstxml files, it is recommended to copy the js80p.vstxml file as well to the directory where you keep your VST 2.4 plugins.

Note: VST 2.4 plugins are usually put in the ~/.vst directory.

Setting up MTS-ESP Tuning Providers

Windows

Download and install either the free MTS-ESP Mini plugin or the paid MTS-ESP Suite plugin by ODDSound. Follow the instructions on the website, where you can also find the User Guide documentation for each product.

Note: it is possible to use a different tuning provider without installing any of the above plugins, but you may have to manually download the LIBMTS.dll library from the ODDSound/MTS-ESP GitHub repository, and put it in a folder where Windows can find it:

Linux

As of November, 2023, there is no official distribution of the MTS-ESP tuning provider plugins by ODDSound for Linux, however, there are plugins which can act as a tuning provider, for example, Surge XT.

To use MTS-ESP, you may have to download the libMTS.so library from the ODDSound/MTS-ESP GitHub repository, and put it in the /usr/local/lib directory, if it is not already installed on your system. As of November, 2023, libMTS.so is only available for x86_64 Linux systems.

Table of Contents

Usage

Signal Chain (Simplified)

Signal Chain

Table of Contents

Knobs

Most of the parameters that control various aspects of the sound that are produced by JS80P can be adjusted via virtual knobs on the screen:

Table of Contents

Controllers

Controllers are various events and automations that can be used for setting the momentary value (on a relative scale between 0% and 100%) of a JS80P parameter knob:

Table of Contents

Synthesizer (Synth)

This tab contains the foundational settings of the sound.

Main Panel

Import Patch, Export Patch

The two icons at the top left corner allow saving and loading synth settings (often called "patches" or "presets") as ordinary files, e.g. for transferring sounds across projects, different host applications, computers, etc.

Note Handling

Click on the black bar below the Import Patch and Export Patch icons, or use the mouse wheel while holding the mouse cursor over it to change how JS80P handles note events. The available options are:

Operating Mode (MODE)

Choose whether to mix the sound of the two oscillators or route low notes to one oscillator, and higher notes to the other. The available options are:

Modulator Additive Volume (MIX)

When the MODE knob is in the Mix&Mod position, this knob controls how loud the first oscillator can be heard in the output. Turn it down to 0% in order to make the first oscillator contribute to the final sound only via modulation.

Phase Modulation (PM)

Turn it up to have the first oscillator modulate the phase of the second oscillator when the MODE knob is in the Mix&Mod position.

Frequency Modulation (FM)

Turn it up to have the first oscillator modulate the frequency of the second oscillator when the MODE knob is in the Mix&Mod position.

Amplitude Modulation (AM)

Turn it up to have the first oscillator modulate the amplitude of the second oscillator when the MODE knob is in the Mix&Mod position.

Table of Contents

Common Oscillator Settings

Tuning

Click on the black bar next to the oscillator's name, or use the mouse wheel while holding the mouse cursor over it to change the tuning. The available options are:

Oscillator Inaccuracy

The first screw icon next to the tuning selector adds a level of randomization to the oscillator's frequency, mimicking the imperfectness of analog synthesizers. The more the screw is turned, the more off each note will be from the correct pitch.

When the inaccuracy of the two oscillators is set to the same value, and the MODE knob is in the Mix&Mod position, then the oscillators will synchronize their randomness: each note will be off from the correct pitch by a random amount, but within a single voice, the two oscillators will be off by the same amount.

Oscillator Instability

The second screw icon next to the tuning selector adds a level of randomization to the oscillator's frequency over time, mimicking the imperfectness of analog synthesizers. The more the screw is turned, the more the oscillator will diverge from the correct pitch, hovering sometimes above, and sometimes below.

When the instability of the two oscillators is set to the same value, and the MODE knob is in the Mix&Mod position, then the oscillators will synchronize their random divergence: each note will be off from the correct pitch by a random amount, but within a single voice, the two oscillators will always be off by the same amount, and will always diverge by the same amount in the same direction.

Fine Detune x4 (FIN x4)

The Fine Detune (FIN) parameter goes from -1200 cents to +1200 cents (-1 octave to +1 octave), but if you want to go extreme with pitch bends, this toggle switch can increase the range to -4800 cents to +4800 cents (-4 octaves to +4 octaves).

Portamento Length (PRT)

The time it takes for the oscillator's frequency to reach the current note's pitch starting from the pitch of the previous note.

When the synthesizer is in MONO mode, and notes are played in a legato fashion (notes are started before the previous ones would have ended), then it also controls how long the oscillator's amplitude will take to match the velocity of the latest note.

Portamento Depth (PRD)

When set to a non-zero value (specified in cents), the oscillator's frequency will glide to the current note's pitch from a fixed level of detuning in accordance with the PRT setting.

When its value is 0 s, then the starting frequency of the glide will be the pitch of the previous note.

Detune (DTN)

Coarse detune, specifying how many semitones higher or lower the oscillator should play above or below the note's actual pitch.

Fine Detune (FIN)

Fine detune, specifying how many cents higher or lower the oscillator should play above or below the note's actual pitch.

Amplitude (AMP)

Sets the volume of the oscillator before any filtering and shaping.

Filter Logarithmic Frequency (LG F)

The toggle switch above the FREQ knob can switch between using a linear or a logarithmic scale for the knob.

Filter Logarithmic Q Factor (LG Q)

The toggle switch above the Q knob can switch between using a linear or a logarithmic scale for the knob.

Filter Cutoff Frequency Inaccuracy

The first little screw next to the LG Q switch adds a level of randomization to the filter's frequency to mimic imperfections of analog synthesizers.

Be careful with this, because with certain filter settings, too much randomization can produce loud noises and sound artifacts or make the filter completely silent.

Filter Q Inaccuracy

The second little screw next to the LG Q switch adds a level of randomization to the filter's Q factor to mimic imperfections of analog synthesizers.

Be careful with this, because with certain filter settings, too much randomization can produce loud noises and sound artifacts or make the filter completely silent.

Filter Type (TYPE)

The following filter types are available:

Filter Cutoff Frequency (FREQ)

The cutoff frequency of the filter.

Be careful with this, because depending on other settings of the filter, a too low or too high cutoff frequency can produce loud noises and sound artifacts or it can make the filter completely silent.

Filter Q Factor (Q)

The quality factor of the filter. Its precise meaning depends on the position of the TYPE knob. This knob has no effect for the low-shelf and high-shelf filters.

Be careful with this, because depending on other settings of the filter, a too low or too high Q factor can produce loud noises and sound artifacts or it can make the filter completely silent.

Filter Gain (GAIN)

Controls the boosting or attenuation when the TYPE knob is in the Bell, LS (low-shelf), or HS (high-shelf) positions. It has no effect on other filter types.

Be careful with this, because too much boosting can make the signal too loud.

Wave Folding (FOLD)

A wave folder is a similar wave shaping effect to a clipping distortion, but the portion of the signal that is above the maximum level is not clipped, but reflected back on itself. Then if it reaches the maximum amplitude again in the opposite direction, then it is reflected again and again. This process adds a lot of complexity to the sound, making it sound metallic.

Velocity Sensitivity (VEL S)

Controls how the oscillator's volume reacts to note velocity. When it's set to 0%, then the oscillator will use a fixed volume for each note. Between 0% and 100%, the oscillator's volume will react to velocity linearly. Above 100%, the oscillator's volume will react to note velocity more and more logarithmically.

Volume (VOL)

The last chance to control the oscillator's volume after wave shaping and filtering.

Width (WID)

When set to 0%, the oscillator will play all notes exactly in the middle of the stereo field. When set to a positive value, higher notes will lean towards the right side of the stereo field, and bass notes will lean towards the left. When set to a negative value, high notes will lean towards the left side, and bass notes will lean towards the right.

Panning (PAN)

Changes the position of the oscillator in the stereo field. Positive values move the oscillator towards the right side, negative values move it towards the left side.

Waveform (WAV)

Selects the waveform of the oscillator. The available options are:

Table of Contents

Oscillator 1 (Modulator)

Subharmonic Amplitude (SUB)

Sets how loud the subharmonic oscillator should be. The subharmonic oscillator plays a sine wave exactly one octave below the oscillator's main frequency.

Oscillator 2 (Carrier)

Distortion (DIST)

Soft-clipping distortion.

Table of Contents

Effects

Volume Controls

There are three volume controls placed at strategic points of the effects chain. Their purpose is twofold: they control the loudness of the signal, and they also measure the incoming peaks for the signal loudness based controllers.

Note that the first volume controller goes up to 200% so that you can boost the signal which is going into the distortion effects.

Distortions

Overdrive (Odrv, GAIN)

Subtle saturation and soft-clipping distortion to add a little bit of crunchiness to the sound.

Distortion (Dist, GAIN)

Heavy distortion for angrier sounds with a lot of bite.

Filters

See oscillator filters.

Chorus

The chorus effect mixes a signal with slightly delayed copies of itself, and modulates the delay times with low-frequency oscillators so that the cloned signals have a subtle variation in their phase and pitch relative to the original signal and to each other. This creates the illusion of having many different instances of the signal, making it sound bigger and fatter.

Logarithmic High-pass Filter Q Factor (LG Q)

The first component in the Chorus effect is a high-pass filter, in order to control the low end of the sound, and to avoid bass frequencies becoming muddy. This toggle switch makes the resonance parameter of the high-pass filter use a logarithmic scale instead of a linear scale.

Logarithmic LFO Frequency (LG LFO FREQ)

Switch between a linear and a logarithmic scale for the LFO frequency (FREQ) parameter.

Logarithmic Filter Cutoff Frequencies (LG FILTER FREQS)

Switch between a linear and a logarithmic scale for the high-pass filter at the beginning of the Chorus effect's signal chain, and for the high-shelf filter near the end of it.

Tempo Synchronization (BPM SYNC)

Turn on tempo synchronization for the low-frequency oscillators and the delays in the effect, so that what they normally measure in terms of seconds will be measured in terms of beats instead. (This only works in hosts which provide tempo information to plugins.)

Note: in order to prevent the memory that is allocated for delay buffers from growing arbitrarily large, JS80P will not go below 30 BPM for tempo synchronization.

High-pass Filter Cutoff Frequency (HP F)

Set the cutoff frequency of the high-pass filter that is at the beginning of the signal chain of the effect in order to keep it from making bass frequencies too muddy.

High-pass Filter Cutoff Frequency (HP Q)

Set the resonance of the high-pass filter that is at the beginning of the signal chain of the effect.

Type (TYPE)

Select the chorus type. Different chorus types feature a different number of voices (ranging from 3 up to 7) which are arranged in various different positions in the stereo field (with regards to the WIDTH parameter as well), with various different loudness values, etc.

Delay Time (DEL)

The maximum time by which the chorus voices are lagging behind the main voice.

LFO Frequency (FREQ)

Controls how quickly the lag of each chorus voice varies.

Depth (DPT)

Control how much the chorus voices vary their lag behind the main voice.

Dampening Frequency (DF)

Chorus voices are sent into a high-shelf filter which can be used for attenuating higher frequencies, making the chorused sound warmer, darker. This parameter sets the cutoff frequency of the filter.

Dampening Gain (DG)

Control how much the high-shelf filter attenuates high frequencies.

Feedback (FB)

Tell how loud the output of the effect is to be mixed back into its input. Be careful with this, because too much feedback can lead to a loud runaway signal feedback loop.

Stereo Width (WID)

Set the stereo spread of the chorus. When set to 0%, all the voices are placed in the middle of the stereo field.

Wet Volume (WET)

Control the loudness of the chorused signal.

Dry Volume (DRY)

Control the loudness of the original, unmodified input signal.

Table of Contents

Echo

The Echo effect repeats the input signal with a delay, optionally with various levels of filtering and distortion, and with side-chain compression.

Logarithmic High-pass Filter Q Factor (LG Q)

The first component in the Echo effect is a high-pass filter, in order to control the low end of the sound, and to avoid bass frequencies becoming muddy. This toggle switch makes the resonance parameter of the high-pass filter use a logarithmic scale instead of a linear scale.

Logarithmic Filter Cutoff Frequencies (LG FILTER FREQS)

Switch between a linear and a logarithmic scale for the high-pass filter at the beginning of the Echo effect's signal chain, and for the high-shelf filter near the end of it.

Tempo Sync (BPM SYNC)

Turn on tempo synchronization for the delay lines in the effect, so that time will be measured in terms of beats instead of in terms of seconds. (This only works in hosts which provide tempo information to plugins.)

Note: in order to prevent the memory that is allocated for delay buffers from growing arbitrarily large, JS80P will not go below 30 BPM for tempo synchronization.

Input Volume (IN V)

Control the input signal level for the effect. This parameter goes from 0% to 200%, so that the signal can be boosted for the distortion that is built into the effect.

High-pass Filter Cutoff Frequency (HP F)

Set the cutoff frequency of the high-pass filter that is at the beginning of the signal chain of the effect in order to keep it from making bass frequencies too muddy.

High-pass Filter Cutoff Frequency (HP Q)

Set the resonance for the high-pass filter that is at the beginning of the signal chain of the effect.

Delay Time (DEL)

Set how long the echo signal will lag behind the original signal.

Note: to simulate the feel of old tape delays, assign an LFO to the delay time parameter which is set to oscillate very slowly, by a really low amount, maybe with a tiny amount of randomization.

Distortion (DIST)

Add some saturation or soft-clipping distortion to the delayed signal. This can also come handy for simulating slightly overdriven analog tape delay effect units.

Dampening Frequency (DF)

The delayed signal is sent into a high-shelf filter which can be used for attenuating higher frequencies, making the echo sound warmer, darker. This parameter sets the cutoff frequency of the filter.

Dampening Gain (DG)

Control how much the high-shelf filter attenuates high frequencies.

Feedback (FB)

Tell how loud the output of the effect is to be mixed back into its input. Be careful with this, because too much feedback can lead to a loud runaway signal feedback loop.

Stereo Width (WID)

Set the stereo spread of the echos. The further away this value is from 0%, the further from the center the echos will be, bouncing back and forth between the right and left speaker.

Side-chain Compression Threshold (CTH)

Threshold for the side-chain compression: when the input signal goes above this level, the effect will reduce the volume of the echos in order to keep them from stealing the spotlight from the original signal in the mix. Once the input signal goes below the threshold, the echos will be brought up to their intended level.

Side-chain Compression Attack Time (CATK)

Set how fast or how slow the compression should kick in when the raw signal goes above the threshold.

Side-chain Compression Release Time (CREL)

Set how fast or how slow the compression should bring back the echo signal to its normal level once the raw input signal goes below the threshold.

Side-chain Compression Ratio (CR)

Control the amount of compression that is applied to the echo signal based on the loudness of the raw input signal.

For example, if the compression threshold is -11 dB, and the input signal is -5 dB, then the input is 6 dB louder than the threshold, because -11 + 6 = -5. A compression ratio of 3 will turn this 6 dB difference into 6 / 3 = 2 dB, so the target gain will be -11 + 2 = -9 dB, which means a -4 dB signal reduction. The trick with side-chaining is that the necessary loudness reduction is calculated for one signal, but applied to another; in this case, the echo signal is the one which gets the -4 dB reduction, in order to let the raw sound shine.

Later, if the input signal reaches -2 dB, then the difference from the -11 dB threshold will be 9 dB. Since 9 / 3 = 3, and -11 + 3 = -8, the -2 dB signal will need a -6 dB reduction in order to hit the -8 dB signal level. Therefore, a reduction of -6 dB will be applied to the echo signal.

Then when the input signal goes below -11 dB, no more loudness reduction will be applied to the echo signal.

Wet Volume (WET)

Control the loudness of the echo signal.

Dry Volume (DRY)

Control the loudness of the original, unmodified input signal.

Table of Contents

Reverb

The Reverb effect combines multiple delay lines to simulate sound reflections that can be heard in various rooms, optionally with various levels of filtering and distortion, and with side-chain compression.

The signal chain is similar to the one in the Echo effect, so many of the parameters work the same way as described there.

Only the parameters that are unique to the Reverb effect are listed below.

Type (TYPE)

Select from various distributions and numbers of reflections, ranging from small rooms with just a handful of reflection points, to large cathedrals with many spread out reflections.

Room Reflectivity (ROOM)

Control how reflective the room is, in other words, how loud are the sounds that bounce off its walls. The higher this value, the longer it takes for the reverberation to decay into silence after the raw input signal goes quiet.

Table of Contents

Macros (MC)

Macros are controllers that can combine and transform other momentary value based controllers, like MIDI CC, pitch wheel position, and even other macros. Basic controllers like the modulation wheel of a MIDI keyboard go from 0% to 100% on a linear scale. Macros can (for example) make it go from 80% down to 30% and use a non-linear curve in between.

The typical usage of a macro is to assign a controller to its input (IN) parameter, set up the minimum, maximum, distortion, etc. parameters, and then assign the macro to an oscillator, filter, effect, envelope, or LFO parameter. Assigning various other controllers (e.g. note value, velocity, other macros, etc.) to the parameters of a macros can result in interesting and creative interactions between controllers.

Midpoint

Move the mouse cursor over the first function graph icon at the top right corner of a macro, and start moving it while holding the left mouse button down, or start using the mouse wheel to adjust the midpoint of the macro's input.

This is most useful when the input of the macro is associated with the pitch bend wheel of a MIDI keyboard, and you want precise control over the range that is covered by the lower and the upper half of the wheel's movement.

Distortion Shape

Click on the second function graph icon at the top right corner of a macro, or use the mouse wheel while holding the mouse cursor over it to select the non-linearity shape that the macro will use when its distortion (DIST) parameter is set to a value above 0%.

Input (IN)

Assign the controller that you want to transform via the macro to this parameter.

Minimum Value (MIN)

The macro will output this value when either its input or its amount parameter is at the 0% position.

Maximum Value (MAX)

The macro will output this value when both its input and its amount parameters are at the 100% position.

Amount (AMT)

Scale the input by this amount.

Distortion (DIST)

Tell how far the macro should diverge from the linear path between its minimum and maximum values.

Randomness (RAND)

Set how much the macro's value should be randomized while still staying between the minimum and maximum values.

Table of Contents

Envelope Generators (ENV)

An envelope generator is a controller that shapes the sound over time by defining target values for parameters which will be reached in a given amount of time after a note is triggered.

Many of the synthesis parameters are polyphonic, which means that each simultaneously playing voice can use different values and run their own individual timeline for those parameters, as long as an envelope is assigned to them.

Envelopes in JS80P use DAHDSR stages to reach four different values for their assigned parameters:

Note: when an envelope is assigned to an amplitude or volume parameter, it is recommended to have its initial and final level be set to 0%.

The transitions between values can take various different shapes:

Each non-linear shape has 3 different versions with various steepness.

Attack Shape

The first icon in the header row of envelope settings selects the shape that defines how the envelope will go from the initial level to the peak level. Click on it to select a different shape, or use the mouse wheel while holding the cursor over it.

Decay Shape

The second icon in the header row of envelope settings selects the shape that defines how the envelope will go from the peak level to the sustain level. Click on it to select a different shape, or use the mouse wheel while holding the cursor over it.

Release Shape

The third icon in the header row of envelope settings selects the shape that defines how the envelope will go from the sustain level to the final level. Click on it to select a different shape, or use the mouse wheel while holding the cursor over it.

Update Mode

When a note is triggered and a voice starts to track its own envelope timeline for a parameter, its default behaviour is to capture a snapshot of the envelope settings at that moment, and run the envelope generator with those values. Changing the envelope settings after this moment has no effect at all on already engaged voices while they are playing. This behaviour can be adjusted by selecting a different update strategy by clicking on the box next to the transition shapes, or using the mouse wheel while holding the cursor over it. The available options are:

Tempo Synchronization (BPM)

The time interval of each stage will be measured in terms of beats instead of in seconds if the host provides tempo information to the plugin.

Time Inaccuracy

The first little screw in the top right corner of envelope settings adds randomization to envelope stage lengths. Useful for simulating imperfectness of analog hardware.

Level Inaccuracy

The second little screw in the top right corner of envelope settings adds randomization to envelope levels. Useful for simulating imperfectness of analog hardware.

Amount (AMT)

Scales all four levels of the envelope.

Initial Level (INI)

The level where the envelope starts.

Peak Level (PEAK)

Target level for the Attack stage.

Sustain Level (SUS)

Target level for the Decay stage.

Final Level (FIN)

Target level for the Release stage.

Delay Time (DEL)

How long the envelope will stay on the initial level before the Attack stage begins.

Attack Time (ATK)

How long it will take to reach the peak level from the initial level.

Hold Time (HOLD)

How long the envelope will stay on the peak level.

Decay Time (DEC)

How long it will take to reach the sustain level from the peak level.

Release Time (REL)

How long it will take to reach the final level from the value where the parameter is at when the note stop event is received.

Table of Contents

Low-Frequency Oscillators (LFOs)

A low-frequency oscillator (LFO) is a controller which makes a parameter's value oscillate back and forth between two values.

Logarithmic Frequency (LG FREQ)

Toggle the frequency parameter of the LFO between a logarithmic and a linear scale.

Center (CENTER)

Make the LFO oscillate around the midpoint of the minimum and maximum values instead of between the two extremes. This makes a difference when the amount parameter of the LFO is set to a value below 100%: by default, the LFO will oscillate above the minimum value, and it won't reach the maximum, but when the LFO is centered, it will not reach either extremes, it will stay within a radius of the midpoint which is half the value of the amount parameter. (This is similar to the unipolar/bipolar LFO modes in other synthesizers.)

Amount Envelope (AMT ENV)

Click on the black box next to the centering switch in the header row of an LFO, or use the mouse wheel while holding the cursor above it to associate an envelope generator with the LFO. When an LFO with an amount envelope is assigned to a synthesis parameter that can accept control from envelope generators as well, then each voice will run their own envelope and LFO timeline for that parameter when a new note is triggered.

Furthermore, if a parameter of an LFO which has an amount envelope is controlled by another LFO which also has an amount envelope, then each new note will have its own timeline for both of those LFOs and envelopes. (Up to 6 timelines can be maintained by each parameter for each note. When that limit runs out, or when there's a dependency cycle between LFOs, then some of the LFOs will be run globally, as if there was no envelope assigned to them.)

Note that when the LFO is assigned to a parameter which doesn't accept control from envelope generators, then the amount envelope has no effect.

Tempo Synchronization (BPM SYNC)

The LFO's frequency is normally measured in Hertz (Hz) which means "cycles per second". Click on the BPM SYNC switch to change that to "cycles per beat" instead. (This only works in hosts which provide tempo information to plugins.)

Waveform (WAV)

Same as the waveform parameter of the audio-range oscillators, except that LFOs don't have the "Custom" option.

Frequency (FREQ)

Set how many oscillations to do per second (or per beat, when the BPM SYNC switch is turned on).

Phase (PHS)

Shift the (initial) phase of the oscillator.

Minimum Value (MIN)

Set the lowest value of the oscillation. When it is greater than the maximum value, then the waveform is flipped upside down.

Maximum Value (MAX)

Set the highest value of the oscillation. When it is less than the minimum value, then the waveform is flipped upside down.

Amount (AMT)

Set the amplitude of the oscillation.

Distortion (DIST)

Distort the waveform with a soft-clipping distortion.

Randomness (RAND)

Randomize the waveform.

Table of Contents

Presets

JS80P has a few built-in presets, and in case you don't like your plugin host application's preset browser, you can load and save them as ordinary files. For each plugin type, you can find these presets in the presets folder in the ZIP archive, and you can load them into JS80P by clicking on the Import Patch icon near the top left corner of the main screen of the plugin.

Blank

The default, empty patch, a blank canvas.

Bright Organ

A bright, clean, Hammond-like organ sound. Aftertouch and mod wheel increase the vibrato. The softer you play, the slower the attack, the harder you play, the harder the attack.

Chariots-Aftertouch

A Vangelis-inspired split keyboard patch. Notes below C3 are modulated with an inverse sawtooth LFO, notes above C3 get some wavefolding treatment if you use aftertouch. The mod wheel controls the vibrato of notes above C3, and the pitch wheel also affects only these notes.

Chariots

A Vangelis-inspired split keyboard patch. Notes below C3 are modulated with an inverse sawtooth LFO, notes above C3 get some wavefolding treatment, depending on the velocity. The harder you play, the longer it takes for the wavefolder to kick in. The mod wheel controls the vibrato of notes above C3, and the pitch wheel also affects only these notes.

Demo 1

The patch from the first demo video of JS80P. The mod wheel makes the sound brighter, the volume knob (CC 7) adjusts the inverse sawtooth LFO which controls the filter before the wavefolder.

Demo 2

The patch from the second demo video of JS80P. This split keyboard patch has slow tremolo bass notes below Gb3, with extremely long release (just press a key, and you're good for about 2 measures with your left hand being free, even without a sustain pedal), and plucky lead notes, with the mod wheel and the volume knob (CC 7) controlling the timbre. (However, it is not recommended with this patch to adjust the mod wheel while a right hand note is playing.)

Kalimba

A simple kalimba sound with percussive attack and short decay. The sustain pedal adds more reverb and echo, and lengthens note decay.

Rock Organ

A little darker, overdriven Hammond-like organ sound. Aftertouch and mod wheel increase the vibrato. The softer you play, the slower the attack, the harder you play, the harder the attack.

Sandstorm

A dirty, harsh, detuned FM lead sound. Mod wheel and aftertouch make it even dirtier and harsher.

Stereo Saw

A little bit metallic sounding sawtooth wave. Note velocity slightly affects the timbre, mod wheel and aftertouch add wavefolding. The volume knob adjusts an LFO which controls filter resonance.

Acid Lead 1

Sawtooth wave based acid lead sound. Aftertouch and mod wheel increase the vibrato, the sustain pedal lengthens the decay.

Acid Lead 2

Square wave based acid lead sound. Aftertouch and mod wheel increase the vibrato, the sustain pedal lengthens the decay.

Acid Lead 3

Another sawtooth wave based acid lead sound. Aftertouch and mod wheel increase the vibrato, the sustain pedal lengthens the decay.

Bells 1

A bright bell sound. Aftertouch and mod wheel increase the vibrato, the sustain pedal lengthens the decay.

Bells 2

A slightly darker bell sound. Aftertouch and mod wheel increase the vibrato, the sustain pedal lengthens the decay.

Flute

A synth flute sound with a couple of tricks: the pitch of the notes decreases slightly when they end, and the mod wheel adds a little embellishment to the beginning of each note. Aftertouch adds more emphasis to the note.

FM Womp 1

A clean FM sound where the modulator and the carrier use different envelopes, so the notes start with a slight "wah" effect. Aftertouch and mod wheel increase the vibrato. Aftertouch also adds more modulation.

FM Womp 2

A slightly distorted FM sound where the modulator and the carrier use different envelopes, so the notes start with a slight "wah" effect. Aftertouch and mod wheel increase the vibrato. Aftertouch also adds more modulation, making the sound brighter and more distorted.

FM Womp 3

A more distorted FM sound where the modulator and the carrier use different envelopes, so the notes start with a slight "wah" effect. Aftertouch and mod wheel increase the vibrato. Aftertouch also adds more modulation, making the sound brighter and more distorted.

Tech Noir Lead 1

A brass sound for futuristic sci-fi dystopias with a slower filter sweep at the beginning of notes, depending on note velocity. Mod wheel adds vibrato, aftertouch adds emphasis and brightness.

Tech Noir Lead 2

A brass sound for futuristic sci-fi dystopias with a harsher filter sweep at the beginning of notes, depending on note velocity. Mod wheel adds vibrato, aftertouch adds emphasis and brightness.

Tech Noir Lead 3

A darker brass sound for futuristic sci-fi dystopias with a filter sweep at the beginning of notes, depending on note velocity. Mod wheel adds vibrato, aftertouch adds emphasis and brightness.

Derezzed

This Daft Punk inspired patch is built around sawtooth waves with lots of distortions. Mod wheel makes upcoming notes brighter (without affecting the currently sounding ones), and it increases the distortion. Aftertouch adds vibrato.

Ambient Pad 1

Slowly evolving pad sound with sci-fi vibe. The mod wheel destabilizes the tuning, the aftertouch increases that effect, and adds slight distortions.

Ambient Pad 2

Slowly evolving pad sound with a dark sci-fi vibe. The mod wheel destabilizes the tuning, the aftertouch increases that effect, and adds slight distortions.

Ambient Pad 3

Slowly evolving pad sound with a dark sci-fi vibe. The mod wheel destabilizes the tuning, the aftertouch increases that effect, and adds ghostly, distant screams.

Saw Piano

A sawtooth wave based sound where high notes decay quickly, lower notes decay slowly, but decay time is also affected by note velocity. The harder you play, the brighter and richer the timbre, and the harder the note attack. Mod wheel controls the vibrato, and aftertouch controls filtering. The sustain pedal lengthens note decay.

Saw Piano Reversed

A sawtooth wave based sound which sounds like as if you were playing a recording backwards. The time it takes for notes to un-decay depends on note pitch and velocity. The harder you play, the brighter and richer the sound gets. Mod wheel controls the vibrato, aftertouch adjusts the filtering.

Nightmare Lead

Starts out as a nice, filtered sawtooth wave, but as you begin to turn the mod wheel and add some aftertouch, it becomes more and more menacing and distorted, until it finally descends into madness.

Tremolo Lead

Thick lead sound. Aftertouch adds vibrato and harmonics, mod wheel opens up the filter and adds a tremolo effect. Filtering also responds to note velocity.

Monophonic Saw

A sawtooth wave based monophonic, sustained sound with smooth legato glides. The harder you play, the brighter and richer the timbre, and the harder the note attack. Mod wheel controls the vibrato, and aftertouch controls the filtering and the wavefolder. The sustain pedal lengthens note decay.

Dystopian Cathedral

Play softly and this futuristic organ-like patch will sound smooth as butter, but when you start playing with more force, the sound will become angry, fat, and in-your-face. The mod wheel increases the level of madness.

Gloomy Brass

Turn the mod wheel down for a soft, warm, and fat sound, turn it up for brassy swells, distortion, and reverb. Aftertouch adds some harshness and vibrato.

Gloomy Brass Raindrops

A version of Gloomy Brass where each note is followed by a raindrop after a random amount of time.

Sawyer

Recreation of the iconic bass and lead sound from Tom Sawyer by Rush. Notes below middle C will do the well-known resonance sweep and then turn into a dark growl (which you can spice up with the mod wheel and some aftertouch), and notes above middle C will be bright, but will lose much of their brightness while doing a huge vibrato when you turn up the mod wheel or apply aftertouch. (Note that this is not a split-keyboard patch, because both oscillators are required to make this sound good in stereo - instead, the effect is achieved through trickery with the Note controller and the Distortion knob of Macro 12 and 13.)

Analog Brass AT

Play softly, pianissimo for a soft, smooth, warm, and fat analog brass sound. Play fortissimo and use aftertouch for big bright swells. The mod wheel adds vibrato, and the pitch wheel goes from -3 octaves to +1 octave.

Analog Brass mod

Turn the mod wheel down and play softly, pianissimo for a soft, smooth, warm, and fat analog brass sound. Turn it up and play fortissimo for big bright swells. Aftertouch adds vibrato, and the pitch wheel goes from -3 octaves to +1 octave.

Bouncy

The sound of a ping-pong ball dropping on a glockenspiel, showcasing a use of LFO amount envelopes.

Table of Contents

Bugs

If you find bugs, please report them at https://github.com/attilammagyar/js80p/issues.

Table of Contents

Frequently Asked Questions

Mac version?

Sorry, it's not likely to happen anytime soon, unless someone is willing to create and maintain a Mac fork of JS80P. For me to do it, it would require quite a large investment, both in terms of effort and financially. If MacOS would be available (at a reasonable price) for installing it in a virtual machine that could be used for testing, I'd consider that. But as long as it cannot be obtained (legally) without also buying a Mac, and I'm happy with my current computer, I'm not going to invest in a new one.

Table of Contents

Parameters, Envelopes, LFOs, and polyphony: how do they work?

By default, knobs and toggles act globally. This means that if you adjust a knob with your mouse, or if you assign a MIDI event (controller change, note velocity, etc.), a macro, or an LFO to it and adjust the parameter via that, or if you use automation in your plugin host application, then that parameter will change for all sounding notes.

But if you assign an envelope generator as a controller to a parameter, then each voice will use its own timeline for that parameter, and the parameter's value will change over time for each simultaneously sounding note independently from each other, according to the envelope's settings. By default, envelope generator settings are only evaluated once for each note, at the very beginning of the note, so if the parameters of the envelope generator are changed, then it will only affect the notes that start after the adjustment. This behaviour can be changed by setting a different update mode for the envelope generator.

Similarly, if you assign an LFO to a parameter which can accept control from envelope generators, and the LFO is associated with an amount envelope, then the LFO becomes polyphonic, and its amount will be controlled by the envelope generator for each polyphonic voice independently from the other voices. Note that this is transitive up to a limit: if a parameter of a polyphonic LFO is controlled by another LFO, then the second LFO will also become polyphonic if it has an amount envelope assigned to it. An LFO chain like this can contain up to 6 LFOs and envelopes. If a chain contains more than that, or has dependency cycles where LFOs control each other's parameters, then some of the LFOs in the chain will be treated as if there weren't any envelopes assigned to them.

To have polyphonic voice parameters sample and hold a MIDI value or a macro's momentary value for the entire duration of a note, independently of other voices and subsequent changes of the value (e.g. to use lower filter cutoff frequency for low-velocity notes so that they sound softer), then you have to use an envelope generator: turn up all the levels of the envelope to 100%, assign the MIDI value or the macro to the amount parameter of the envelope, and assign the envelope to control the parameter.

Table of Contents

The knobs in the waveform harmonics section don't do anything, is this a bug?

To hear the effect of those knobs, you have to select the Custom waveform for the oscillator.

(Note that these parameters are CPU-intensive to process, so they are not sample accurate, they are not smoothed, and they are processed only once for each rendering block. Due to this, if you change them while a note is playing, or assign a controller to them, then you might hear "steps" or even clicks.)

Table of Contents

How can parameters be automated? What parameters does the plugin export?

The intended way of automating JS80P's parameters is to assign a MIDI Control Change (MIDI CC) message to a parameter (or use MIDI Learn) as a controller, and turn the corresponding knob on your MIDI keyboard while playing, or edit the MIDI CC events in your host application's MIDI editor.

However, the VST 3 plugin format requires plugins to export a proxy parameter for each MIDI CC message that they want to receive, and as a side-effect, these parameters can also be automated using the host application's usual automation editor. For the sake of consistency, the FST plugin also exports automatable parameters for each supported MIDI CC message.

For example, in both plugin types, you might assign the MIDI CC 1 (Modulation Wheel) controller to the Phase Modulation (PM) parameter of the synthesizer, and then add automation in the host application to the MIDI CC 1 (Modulation Wheel) (VST 3) or ModWh (FST) parameter. JS80P will then interpret the changes of this parameter the same way as if you were turning the modulation wheel on a MIDI keyboard.

Table of Contents

Aren't Phase Modulation and Frequency Modulation equivalent? Why have both?

The reason for JS80P having both kinds of modulation is that they are not always equivalent. They are only identical when the modulator signal is a simple sinusoid. With each added harmonic to the modulator, PM and FM start to differ more and more. A detailed mathematical explanation of this is shown in doc/pm-fm-equivalence.pdf.

Table of Contents

Where does the name come from?

In 2022, I started developing a browser-based synthesizer using the Web Audio API, mostly being inspired by the Yamaha CS-80. I named that project JS-80. Then I started adding one little feature and customization option after the other, then it got out of hand, and I also started finding limitations of doing audio in the browser. So I decided to implement a cleaned up version of this synth in C++ as a DAW plugin (with a better waveshaper antialiasing method than what's available in the browser), and so JS80P was born.

Table of Contents

FL Studio: How to assign a MIDI CC to a JS80P knob?

FL Studio does not send all MIDI events that come out of a MIDI keyboard to plugins by default, and unfortunately, MIDI Control Change (MIDI CC) messages are among the kinds of MIDI data that it swallows. To make everything work, you have to connect the MIDI CC events of your device to one of the MIDI CC helper proxy parameters that are provided by JS80P. (JS80P does not directly expose its parameters to the host, in order to avoid conflicts between the host's automations and JS80P's internal controller assignments.)

For example, let's say a physical knob on your MIDI keyboard is configured to send its changes in MIDI CC 7 messages. To make this knob turn the Phase Modulation (PM) virtual knob in JS80P, you have to do the following steps:

  1. Click on the small triangle in the top left corner of the plugin window of JS80P, and select the "Browse parameters" menu item.

  2. Find the parameter named "Vol" (FST) or "MIDI CC 7 (Volume)" (VST 3) in the browser. Click on it with the right mouse button.

  3. Select the "Link to controller..." menu item.

  4. Turn the knob on your MIDI keyboard until FL Studio recognizes it.

  5. Now click on the area below the Phase Modulation (PM) virtual knob in JS80P's interface.

  6. Select either the "MIDI CC 7 (Volume)" option, or the "MIDI Learn" option, and turn the physical knob on your MIDI keyboard again.

Table of Contents

FL Studio: How to assign Channel Pressure (Aftertouch) to a JS80P knob?

FL Studio does not send all MIDI events that come out of a MIDI keyboard to plugins by default, and unfortunately, Channel Pressure (also known as Channel Aftertouch) messages are among the kinds of MIDI data that it swallows.

Getting the Channel Pressure to work in FL Studio is a similar, but slightly more complicated procedure than setting up MIDI CC. For example, to make Channel Pressure control the Phase Modulation (PM) virtual knob in JS80P, you have to do the following steps:

  1. Click on the small triangle in the top left corner of the plugin window of JS80P, and select the "Browse parameters" menu item.

  2. Press a piano key on your MIDI keyboard, and hold it down without triggering aftertouch.

  3. While holding the piano key down, find the parameter named "Ch AT" (FST) or "Channel Aftertouch" (VST 3) in FL Studio's browser. Click on it with the right mouse button.

  4. Select the "Link to controller..." menu item (keep holding the piano key).

  5. Now push the piano key harder to trigger aftertouch.

  6. Click on the area below the Phase Modulation (PM) virtual knob in JS80P's interface.

  7. Select the "Channel Aftertouch" option.

Table of Contents

FL Studio: How to use the Sustain Pedal?

FL Studio does not send all MIDI events that come out of a MIDI keyboard to plugins by default, and unfortunately, the MIDI Control Change (MIDI CC) message which contains information about the sustain pedal's state is among the kinds of MIDI data that it swallows.

To add insult to injury, FL Studio pretends that it notifies the plugin about the pedal's state, but in reality, it just defers sending NOTE OFF events until the pedal is released. This might give the desired effect in some cases, but it breaks patches that assign additional functionality to the pedal besides sustaining notes, like for example lengthening envelope release times.

To make everything work, you have to assign the sustain pedal's MIDI CC events to the MIDI CC helper proxy parameter where JS80P expects them, and you have to turn off FL Studio's default behavior of handling the pedal on behalf of plugins.

  1. Open "Options / MIDI settings" from the main menu.

  2. Turn off the "Foot pedal controls note off" option.

  3. Close the Settings dialog window.

  4. Click on the small triangle in the top left corner of the plugin window of JS80P, and select the "Browse parameters" menu item.

  5. Find the parameter named "Sustn" (FST) or "MIDI CC 64 (Sustain Pedal)" (VST 3) in the browser. Click on it with the right mouse button.

  6. Select the "Link to controller..." menu item.

  7. Press the pedal.

Table of Contents

Development

This section contains information for those who downloaded the source code of JS80P and want to compile it themselves.

Tools

Linux

Windows

Dependencies

The lib/ directory contains code from the following projects:

Note that the lib/ directory does not include the whole SDK packages, it only contains what's required for compiling JS80P.

Linux

To compile JS80P on e.g. Ubuntu Linux 22.04 for all supported platforms, the following packages need to be installed:

apt-get install \
    binutils \
    build-essential \
    g++ \
    gcc-multilib \
    g++-multilib \
    libcairo2-dev \
    libcairo2-dev:i386 \
    libx11-dev \
    libx11-dev:i386 \
    libxcb1-dev \
    libxcb1-dev:i386 \
    libxcb-render0-dev \
    libxcb-render0-dev:i386 \
    mingw-w64

Compiling

Windows

Assuming that you have installed MinGW-w64 to C:\mingw64, you can use the following commands to run tests and compile JS80P for Windows:

SET PATH=C:\mingw64\bin;%PATH%
SET TARGET_PLATFORM=x86_64-w64-mingw32
SET DEV_OS=windows

mingw32-make.exe check
mingw32-make.exe all

Linux

Run make check for running tests.

The following commands (on a 64 bit Linux environment) will compile JS80P for 64 bit Windows, 32 bit Windows, x86_64 Linux, x86 Linux, and RISC-V 64 Linux respectively:

TARGET_PLATFORM=x86_64-w64-mingw32 make all
TARGET_PLATFORM=i686-w64-mingw32 make all
TARGET_PLATFORM=x86_64-gpp make all
TARGET_PLATFORM=i686-gpp make all
TARGET_PLATFORM=riscv64-gpp make all

Table of Contents

Theory

Table of Contents

This website does not use any cookies.
Copyright © 2024 Attila M. Magyar and contributors