Partikl Multi-Synth Framework & MIDI implementation chart
- Modular Synthesis Framework
- Audio Data Pipeline in the Synth
- MIDI implementation chart
- General MIDI 2 (GM2) feature implementation chart
- Supported RPN's
- Supported SYSEX Messages
- Modular synth SYSEX style commands in MIDI files
Introduction - Intermorphic Partikl Multi-Synth MIDI Implementation Chart
The Intermorphic Partikl Multi-Synth has been designed to work on both desktop and mobile platforms. It supports various sound synthesis approaches including modular synthesis, wavetables, and even mobile-targeting features including SP-MIDI compliance and 3GPP reduced wavetable sets. It uses wavetable data in various formats including DLS format and Ogg, in combination with entirely synthestic generated waveforms.
The modular synthesis approach allows for incredibly rich and open-ended MIDI sound generation with 3rd party extendibility. Click here for full information!
Support for up to 4096 MIDI channels
The Partikl synth is capable of supporting more than 16 MIDI channels. In fact, it can support up to 4096 MIDI channels! This functionality is used by various MIDI Meta file players which might require more than 16 channels to render their MIDI-like data.
Modular Synthesis Framework
Intermorphic Partikl's MIDI software synthesiser has incredibly powerful and flexible support for modular synthesis. This allows for very rich and open-ended MIDI sound generation with a 3rd party extendible plugin set.
Synthesizer networks are also referred to as FXMS networks, and are declared using XML blocks of the form <fxms>...</fxms>.
Intermorphic Partikl's Polyphonic Synthesizer is a modular, 3rd-party extendible synthesizer that allows very fine-grained control over the sound that it creates. Partikl includes a number of optional tone generator classes, including but not limited to:
- Signal-Rate Oscillator - the flexible tone generator
- DSynth - the DSynth, suited to generation of both melodic and percussive sounds
- Particle System - the Particle System, a highly effective granular synthesis unit
If you want help creating content that uses modular synthesis, here are some useful resources:
The sounds may be created in a variety of manners; each MIDI line can have its sound generated completely independently, using one of the following techniques:
- using built-in MIDI wavetable sounds (this is the default behaviour of the Partikl software synth)
- using custom audio sample data stored in either DLS wavetables or compressed audio formats such as the Ogg format.
- using arbitrary tone generator analog-style plug-in synthesis modules (such as Intermorphic Partikl's DSynth or Particle System tone generator plugins), under management of the FXMS class. In this case, sounds are synthesized in real-time according to the algorithm implemented by the tone generator plugin in question. There is huge flexibility in this approach! The Mixtikl Player app makes use of these extensions.
Once sounds have been rendered, they may be processed using arbitrary FXM audio effects networks, using whatever audio plugins might be available on the system.
- separate internal and external audio effects pipelines may be attached to each MIDI line
- global internal and external effects pipelines may also be used, that are applied to the final mix from all MIDI lines.
Note that the difference between internal and external effects pipelines, is that an internal pipeline is in general for creating and internal ownership by a MIDI Meta file player (or application); external pipelines are for direct creation, attachment and manipulation by an external application. Because internal effects should not generally be modified by an application, this means that an .partikl file can be spatialised by an program that attaches a 3D spatialiser as a global external effect, without having any adverse effect on any built-in internal global effects that might be part of the .partikl file definition.
FXM networks are the fundamental DSP pipeline class of the ISS; they are used to implement the modular synthesizer processing. They can contain both signal-rate and control-rate sub-networks
Effects pipelines are defined to the MIDI synthesizer as <FXM> networks, wrapped-up in <effects> ... </effects> XML tags, using either:
- Partikl meta file data
- SYSEX commands within MIDI files (click here for more details).
- Programmatically...
Synth modules are also defined to the MIDI synthesizer as <FXM> networks, but wrapped-up in <fxms> ... </fxms> XML tags. They are supplied to a piece using:
- Partikl meta file data
- SYSEX commands within MIDI files (click here for more details).
- Programmatically...
- Using a GUI that allows directly interacting to create a parameter definition for a specific audio plugin.
Audio Data Pipeline in the Synth
There are 6 stages in the audio processing for the synth:
- Computation of basic instrument audio. This consists of the sample data for all
the notes rendered during a particular instrument played on that channel (note that
the sample data might be custom sample data, as supplied for example within
an Partikl file). The
audio data at this point is in mono. If any Modular Synthesis is defined, then it is done here as an alternative to the default MIDI wavetable
rendering approach.
- Examines all the currently playing notes for the channel and renders the wave data for that instrument
according to the pitch and velocity (loudness) associated with each note. The wave data itself is mono
and the result of superimposing the wave data for all the notes for this control block
is likewise mono. The sample data used might be custom sample data (as supplied for
example from a Partikl file).
Important note on Modular Synthesis: if modular synthesis is in use, due to an FXMS module being defined for this MIDI line, then the appropriate FXMS module is used to synthesise the data (rather than using the default wavetable synthesis approach).
- Examines all the currently playing notes for the channel and renders the wave data for that instrument
according to the pitch and velocity (loudness) associated with each note. The wave data itself is mono
and the result of superimposing the wave data for all the notes for this control block
is likewise mono. The sample data used might be custom sample data (as supplied for
example from a Partikl file).
- Adjustment of audio to account for volume attenuation on that channel.
- Applies a volume reduction if necessary. It is used when the volume to be applied is greater or lesser than the default volume.
- Separation into interleaved stereo data if panning required in the stereo field.
- Applies panning when necessary. This only happens when the output is in stereo and panning is not disabled. Panning may be disabled if some other part of the system will apply a level of spatialisation, such as a 3d sound spatialiser.
- Application of custom per-line audio-plugin effects.
- Applies custom per-line audio-plugin effects. Some examples might be a distortion effect, a phaser, or a 3d sound spatialiser. In the latter case of a 3d spatialiser panning would be disabled in stage 3 since the 3d effect adds its own
panning. There are two sub-stages in this effects processing. The first handles 'internal effects', the second
handles 'external' effects.
Internal effects are typically associated with the content itself. An example might be a distortion effect which is to be used on channel 4 for the duration of the piece. This bundling of effects in content can be achieved in a Partikl file. These effects will always be in place for that particular piece of content regardless of the external application that is playing it.
External effects are those that an external application might create in order to apply application specific effects to any midi content. As the application owns the effects it can also change the parameters in real time. An example might be a 3d sound spatialiser, whose parameters would be manipulated by the external application to reflect the position in space which is deemed to be the source of the sound from that MIDI channel.
Internal and external per-MIDI line effects can be set.
- Applies custom per-line audio-plugin effects. Some examples might be a distortion effect, a phaser, or a 3d sound spatialiser. In the latter case of a 3d spatialiser panning would be disabled in stage 3 since the 3d effect adds its own
panning. There are two sub-stages in this effects processing. The first handles 'internal effects', the second
handles 'external' effects.
- Application of inbuilt MIDI reverb and chorus.
- Adds the audio from this channel into the inbuilt reverb and chorus effects buffers according to the current MIDI controller send levels. These reverb and chorus buffers are processed at a later stage on a global level. This stage may be disabled for the channel if desired, for example when the custom effects required do not want to make use of global effects.
- Application of global internal/external custom audio-plugin effects (not shown in the diagram)
- Applies global internal/external custom audio plugin effects, if any are defined. Such global effects are applied to the final mixed audio data generated from the summed output of all synthesized data from all MIDI lines, after application of any global reverb or chorus effects. Global internal effects are applied first; these are specified using MOMR_PROPERTY_FXM_INTERNAL with a MIDI line value of -1; such effects should not generally be defined by any code other than from a MIDI meta file handler. Global external effects are defined using MOMR_PROPERTY_FXP, and any application is free to set such global effects. Global external effects are used, for example, to 3d-audio spatialise the entire MIDI file.
Figure 1 below shows this pipeline. As we can see, stage 4 is not executed if there are no custom effects (either internal or external) present for that channel. In stages 2 and 3 the audio data is converted into stereo interleaved buffer (if the output format is in stereo) and volume and panning adjustments are made as part of that operation. As previously mentioned, panning may be disabled in certain circumstances such as the use of 3d sound custom effects.

Figure 1: The Partikl synth audio pipeline from per channel rendering to effects processing and final mixing.
MIDI implementation chart
Note: The Intermorphic Partikl synthesizer is purely a software renderer, and does not support transmission of MIDI events.
For the chart below, 'O' means supported, while 'X' means not supported
| Function | Recognized | Remarks | |
|---|---|---|---|
| Basic channel | Default | 1 - 16 | |
| Changed | 1 - 16 | ||
| Mode | Default | Mode 3 | |
| Messages | X | ||
| Altered | X | ||
| Note number | 0 - 127 | ||
| Velocity | Note on | O | |
| Note off | X | ||
| Aftertouch | Key | X | |
| Channel | X | ||
| Pitch bend | O | ||
| Control change | 0, 32 | O | Bank select (MSB, LSB) |
| 1 | O | Modulation Depth | |
| 7 | O | Volume | |
| 10 | O | Pan position | |
| 11 | O | Expression | |
| 64 | O | Hold Pedal | |
| 71 | O | Filter Resonance (affects filter Q) | |
| 74 | O | Filter Brightness (affects cutoff frequency) | |
| 91 | O | Send to reverb (reverb depth) | |
| 93 | O | Send to chorus (chorus depth) | |
| 98, 99 | O | NRPN (LSB, MSB) - reserved | |
| 100, 101 | O | RPN (LSB, MSB) - reserved | |
| 120 | O | All sound off | |
| 121 | O | Reset all controllers | |
| 123 | O | All notes off | |
| Program change | 0 - 127 | ||
| System exclusive | O | GM2 reverb and chorus parameters | |
| System common | Song position | X | |
| Song select | X | ||
| Tune request | X | ||
| System realtime | Clock | X | |
| Commands | X | ||
| Aux. messages | All sounds off | O | |
| Reset all controllers | O | ||
| Local on/off | X | ||
| All notes off | O | ||
| Active sensing | X | ||
| System reset | X |
General MIDI 2 (GM2) feature implementation chart
| Feature | Compliance | Remarks | |
|---|---|---|---|
| Sound source type | wave-table | DLS level 1 and level 2 formats supported | |
| Number of notes | 32+ | configurable to suit device | |
| MIDI channels | 16+ | Can operate with up to 4096 channels | |
| Channels | melody | yes | Channel 10 defaults to rhythmic (i.e. drums), all others default to melodic. Channels can be switched between melodic and rhythmic. |
| rhythm | yes | ||
| Modes | mode 3 | (OMNI OFF, POLY) | |
| Rhythm channels | note off ignored | no | |
| mutual exclusivity | no | ||
| Effects | types | reverb / chorus | Full support for both reverb and chorus subject to how you configure your platform. Note: chorus has one tap. |
| channel sends | yes | ||
| chorus to reverb | yes | ||
| Master volume | no | ||
| Master tuning | fine | no | |
| coarse | no | ||
| Reverb | type | yes | |
| time | yes | ||
| Chorus | type | yes | |
| mod rate | yes | ||
| mod depth | yes | ||
| feedback | yes | ||
| send to reverb | yes | ||
| Scale/octave tuning adjust | no | ||
| GM system messages | GM2 system on | no | |
| GM1 system on | no | ||
| GM system off | no | ||
| Active sensing | no |
Supported RPN's
| RPN# | Parameter | Values and Response |
|---|---|---|
| 0 | Pitch Bend Sensitivity | a maximum range of +/-127 semitones |
Currently no NRPNs are supported, but can be introduced given sufficient demand.
Supported SYSEX Messages
| Message | Message bytes | Remarks |
|---|---|---|
| SP-Midi | 0x7f 0x0b 0x01 <channel-number> <poly value (MIP)> ... <channel-number> <poly value (MIP)> 0xf7 | The synth recognises SP-Midi commands and mutes/unmutes channels appropriately. |
| Reverb | 0x7f 0x04 0x05 0x01 0x01 0x01 0x01 0x01 <reverb-parameter> <reverb-value> 0xf7 | Can be used to set the reverb in accordance with General MIDI 2. |
| Chorus | 0x7f 0x04 0x05 0x01 0x01 0x01 0x01 0x02 <chorus-parameter> <chorus-value> 0xf7 | Can be used to set the chorus in accordance with General MIDI 2. |
Modular synth SYSEX style commands in MIDI files
A MIDI file can have SYSEX-style commands to modify the configuration of the synthesizer in real-time! Specifically, we use a sub-category of "cue point" meta events to deliver a parameterised payload of XML configuration data. Audio effects etc. can be changed at a variety of different levels; the potential to completely or partly change the sound of your piece in real-time is very exciting!
The supported "cue point" text meta event formats are as follows. See the FXMS guide for syntax guidelines and more information.
Synth module settings:
Change entire synth module definition in real-time:
<fxms ...
e.g.
<fxms l="0"> <t="tg/dsynth"><fxms>
Change synth module unit parameter:
<fxmsp v="nnnn,uuuu,pppppppp,vvvvvvvv"/>
nn=line
uu=unit ([0] ... x)
pppppppp=parameter
vvvvvvvv=value (float DSP or integer)
e.g.
<fxmsp v="0,1,1024,.5"/>
Change synth module unit input scale factor:
<fxmsi v="nnnn,uuuu,ii,sssssss"/>
nn=line
uu=unit ([0] ... x)
ii=input index#
ssssssss=scale (float DSP or integer)
e.g.
<fxmsi v="0,1,1,.5"/>
Change synth module unit controller scale factor:
<fxmsc v="nnnn,uuuu,cc,vvvvvvvv"/>
nn=line
uu=unit ([0] ... x)
cc=controller index#
ssssssss=scale (float DSP or integer)
e.g.
<fxmsc v="0,1,1,.5"/>
Internal effects unit settings:
Change FX line unit parameter:
<fxmip v="nnnn,uuuu,pppppppp,vvvvvvvv"/>
nn=line
uu=unit ([0] ... x)
pppppppp=parameter
vvvvvvvv=value (float DSP or integer)
e.g.
<fxmip v="0,1,1024,.5"/>
External target:
Change FX line input scale factor:
<fxmii v="nnnn,uuuu,ii,sssssss"/>
nn=line
uu=unit ([0] ... x)
ii=input index#
ssssssss=scale (float DSP or integer)
e.g.
<fxmii v="0,1,1,.5"/>
Change FX line controller scale factor:
<fxmic v="nnnn,uuuu,cc,vvvvvvvv"/>
nn=line
uu=unit ([0] ... x)
cc=controller index#
ssssssss=scale (float DSP or integer)
e.g.
<fxmic v="0,1,1,.5"/>
