Manual: Compatible Playback

Why a compatible playback mode?


Playback accuracy has always been a problem with tracked music. While the tracker interface with its effect letters and such is simple and fast to use, the internal algorithms used to process effects are not always as simple as they might appear on-screen. For example, due to a little typo, an effect might behave erratically under certain conditions in its original tracker application.

When another tracker (like OpenMPT) decides to support a certain third-party format (for example the XM format of Fasttracker 2), it should faithfully reproduce the meaning of every effect letter and all other behaviour. Sadly, this has not always been the case with (Open)MPT. In the past, users of other trackers have often complained that OpenMPT does not behave like other trackers and thus replays their music (that has been written in another tracker like Fasttracker 2) incorrectly.

Often, making OpenMPT “emulate” those original behaviours, or indeed “quirks”, is the matter of changing a single line of code. However, the same feature that has previously been playing wrong in (Open)MPT may of course, after having fixed it, sound “wrong” in any modules composed with (Open)MPT that made use of this feature. Thus, the programmers of OpenMPT found it necessary to add a “Compatible Playback” option (to be found in the Song Properties) to switch between OpenMPT’s and other tracker’s behaviour. That way, people do not have to fear that their modules made with older versions of OpenMPT suddenly sound wrong after upgrading, and people who want to listen to their tunes made with another application can also happily listen to them without problems.

What should I do when composing a track in OpenMPT?
That depends on your intentions and goals. When using OpenMPT’s own MPTM format, you do not need to care about compatibility settings. You do not need to enable any compatible playback mode — it does not hurt to do so, but some commands behave in more logical or consistent way when some compatibility settings are disabled.

However, if you are composing IT and XM modules, you most likely want to spread them on the internet and share them with friends. In that case, it is important to set all compatibility settings to their defaults, because many people are using other players (such as XMPlay, Schism Tracker, MilkyTracker or indeed Impulse Tracker and Fasttracker 2), and all of those try to “emulate” Impulse Tracker and Fasttracker 2 as precisely as possible - they do not want to emulate OpenMPT’s own “quirks”. Thus, if you compose a track in those formats, you are absolutely recommended to enable the most compatible playback by clicking the Set Defaults button in the compatibility section of the Song Properties dialog - you do not want to get a bad review on your music because it sounds “totally horrible” in XMPlay, just because you forgot to turn on compatible playback, do you?

You should take Impulse Tracker (for IT files) or Fasttracker 2 (for XM files) as a reference when composing your tracks, or at least XMPlay (a very accurate player for both file formats) if you cannot get the original trackers to run. Upcoming OpenMPT updates will bring further improvements to the compatible playback mode, so if something in OpenMPT sounds different from Impulse Tracker / Fasttracker 2, do not hesitate to report it on our Issue Tracker and it will most likely sound correct in the next version of OpenMPT - when enabling the respective compatible setting, that is.

It is advised to use Compatibility Export together with this feature.

Upgrading from an old OpenMPT version
When loading a module made with an earlier version of OpenMPT, only the compatibility settings that apply to this old versions are enabled, newer settings will not be enabled automatically. This way, playback will be as close as possible to the version the module was last saved with.

If you resume your work on a module made with an earlier version, it is recommended to switch to the default compatibility settings in the Song Properties dialog — as long as your module still sounds identical afterwards, of course. If it does not, you may want to go through all compatibility settings and review what changes they introduce, and if applicable modify the module so that it will also sound correct after enabling these compatibility settings.

Playback Compatibility Settings


The Playback Compatibility Settings dialog allows you to edit the detailed compatibility settings. Below is a list of all possible compatibility settings that can be toggled in this dialog.

Common compatibility settings
The following compatibility settings apply to all formats. Some of them may only be visible in legacy modules saved with old OpenMPT versions.

Greyed out checkboxes indicate the emulation of really old OpenMPT bugs. After disabling those checkboxes, they will remain unavailable.


 * OpenMPT 1.17 compatible random variation behaviour for instruments Random volume and panning variation behaves like in early OpenMPT versions.
 * Plugin volume MIDI CC bug emulation Swaps the controller and parameter byte of the MIDI channel volume CC when choosing “MIDI volume” as an instrument’s volume command handling, effectively breaking the MIDI command.
 * Old Pitch Wheel behaviour for instrument plugins Enables the counterintuitive MIDI pitch wheel behaviour found in earlier OpenMPT versions where sample and plugin portmento did not match.
 * Execute regular portamento slides at speed 1 Only fine and extra-fine portamentos are supposed to do something at a speed of one tick per row. This setting is automatically enabled for modules made with very old versions of OpenMPT.
 * Compute note frequency in Hertz rather than periods For best accuracy of high-pitched notes, all note slides etc. are computed in Hertz rather than tracker periods.
 * Clamp tempo to 32-255 range Tempo slides cannot exceed a tempo of 255.
 * Global volume slide memory is per-channel If disabled, there is only one effect memory for global volume slide commands.
 * Panning commands override surround and random pan variation If disabled, surround and random pan variation effects are not interrupted by panning commands.
 * Note delays next to a row delay are repeated on every row repetition Delayed notes that are on the same row as a row delay are retriggered on every row repetition.

IT compatibility settings
Impulse Tracker’s playback routine is relatively bug-free and logical. OpenMPT’s IT playback is already relatively good even with compatible mode being disabled, however some small (and not-so-small) details are not handled correctly. Sometimes they can cause quite drastic differences in playback.

The following compatibility settings are only available in IT and MPTM modules.


 * Retrigger instrument envelopes on instrument change An instrument number with no note next to it plays the new instrument and plays its envelopes from start.
 * Volume column portamento never does fine portamento A fine portamento followed by e00 and f00 is not continued as a fine portamento. Instead, its parameter is treated as if it was a normal portamento.
 * IT arpeggio algorithm Handles arpeggio slightly differently than OpenMPT’s default.
 * Out-of-range delay commands queue new instrument A note next to a delay command that exceeds the current row’s length is not played, but its instrument number will be used for the next note (if it has no instrument number).
 * Gxx shares memory with Exx and Fxx All portamento commands use the same memory.
 * After finishing a pattern loop, set the pattern loop target to the next row A lone SBx effect with no corresponding SB0 will restart its loop one row after the previous loop, if there was one in the same pattern.
 * Nested pattern loop behaviour If there are several pattern loops running concurrently, execute them like IT and FT2 do.
 * Do not reset ping pong direction with instrument numbers An instrument number does not cause a ping-pong loop to change its direction.
 * IT envelope reset behaviour The rules for when to restart envelopes are changed to Impulse Tracker’s WAV writer behaviour.
 * Forget the previous note after cutting it An instrument number after a note cut cannot restart the previously playing note.
 * More IT-like Vibrato, Tremolo and Panbrello handling These effects will use Impulse Tracker’s waveforms and retrigger behaviour.
 * Ixx behaves like in IT Tremor reset and tick counting behaviour is more like in IT.
 * Qxx behaves like in IT Retrigger tick counting is more like in IT.
 * Properly update C-5 frequency when changing note in multisampled instrument When playing a multisampled instrument with no instrument numbers in the pattern, the middle-C frequency is still updated properly.
 * Clear portamento target after it has been reached Once the portamento target has been reached, any subsequent Tone Portamento effects will do nothing.
 * Do not reset loop count on pattern break If a pattern loop is interrupted by a pattern break, the loop count is remembered for subsequent loops.
 * Offset after sample end is treated like in IT With “Old Effects” enabled, the offset is clamped to the sample end (so when there is no sample loop, the note will not sound). Otherwise, the sample plays from start.
 * Volume and panning random variation work more like in IT Among the biggest differences, volume random variation is a percentage of the instrument’s global volume, note of its note volume.
 * NNA is reset on every note change, not every instrument change When using S7x effects to change an instrument’s NNA behaviour, the original value is reset with the next note rather than the next instrument number.
 * SCx really stops the sample and does not just mute it A subsequent volume effect cannot pick up a note that was previously stopped using the SCx command.
 * IT-style envelope position advance + enable/disable behaviour When disabling envelopes, the last value of the envelope keeps being applied.
 * More compatible instrument change + portamento Resets the volume envelope even on notes with Tone Portamento. A sample change during a Tone Portamento with “Compatible Gxx” enabled does not cause the new sample to be played.
 * Do not repeat last sample point in ping pong loop, like IT’s software mixer Not noticeable unless you use ping-pong-looped chip samples. If disabled, OpenMPT sounds more like IT’s Gravis Ultrasound driver.
 * Use triggered note rather than translated note for PPS and DNA note check When modifying the note-to-note mapping of an instrument, the Pitch-Pan-Separation and Duplicate Note Action are based on the note found in the pattern rather than the “translated” note.
 * SAx does not apply an offset effect to a note next to it High Offset commands next to a note do not instantly apply an offset effect, they only affect subsequent Offset commands.
 * User IT’s filter coefficients (unless extended filter range is used) and behaviour Higher resonance than OpenMPT’s original filter implementation, and slightly different rules when to enable and disable filters.
 * Panning modulation is disabled on surround channels Panning random variation, panbrello and panning envelopes are ignored on surround channels, unless OpenMPT’s “Quad Surround” panning mode (S9B command) is enabled.
 * Do not retrigger already stopped channels A sample is not retriggered if it already stopped playing. Unfortunately, this also affects retriggering very short samples (such as Hi-Hats), so it is advised to put a silent loop at the end of such samples if they need to be retriggered.
 * Do not apply any portamento if no previous note is playing Applying Tone Portamento on a channel where a note was previously stopped will not slide from this stopped note to the new note but rather play the new note directly at its target frequency.
 * Only reset note-off status on portamento in IT Compatible Gxx mode Only reset the “Note Off” status of a note with Tone Portamento if “Compatible Gxx” is enabled.
 * Volume column effects share their memory with the effect column Volume slides in the volume column have no own effect memory but share it with their effect column counterparts. This setting also ensures that fine volume slides in the volume column are only applied on the very first tick of a row, and not on multiples of the first tick if there is a Pattern Delay command.
 * Portamento with sample swap plays the new sample from the beginning When swapping samples during a Tone Portamento, they are played from the start rather than being continued at the play position of the old sample.
 * Ignore instrument note map entries with no note completely When triggering a note that is mapped to nothing at all in an instrument’s sample map, it should not even trigger New Note Actions and such.
 * IT-style first tick handling If there is a note delay, fine volume slides next to it will be executed on the tick that matches the delay rather than the “true” first tick of the row.
 * IT-style sample&hold panbrello waveform Setting the panbrello waveform to “random” will cause the speed parameter of the Panbrello command to hold the current random value for the given number of ticks.
 * New notes reset portamento target in IT A previous portamento target is not remembered after a note change with no Tone Portamento.
 * Do not reset panbrello effect until next note or panning effect After executing Panbrello, its panning offset remains on the following rows until a new note or other panning effect is encountered. If disabled, the panning offset is reset immediately.
 * Sample and instrument panning is only applied on note change, not instrument change An instrument number does not re-apply the sample’s or instrument’s default panning, only a new note does.
 * Bxx on the same row as SBx terminates the loop in IT Pattern loops that also have a Position Jump on the last row are never executed.
 * Instrument number with note-off recalls default volume Even an instrument number next to a Note-Off note will apply the sample’s default volume.
 * Lone instrument number after portamento within multi-sampled instrument sets the target sample's settings A tone portamento between two notes of the same instrument that are assigned to different samples does not switch to new samples; However, a lone instrument number after such a tone portamento will apply the sample settings (volume and panning) of the target sample while continuing to play the first sample. Additionally, this setting resets the portamento on a stopped note if it is picked up using a lone instrument number.

XM compatibility settings
Fasttracker 2 has a very quirky playback routine which makes even common pattern effects (and combinations thereof) behave totally unpredictable. These idiosyncrasies are not handled very well (or not at all) when compatible playback is disabled, so you are absolutely advised to use the default compatible playback settings for XM Files. Many people listen to those files with MilkyTracker and XMPlay, and those two programs emulate Fasttracker 2’s quirks rather well - and so does OpenMPT’s compatible playback mode.

The following compatibility settings are only available in XM modules.


 * Use smooth Fasttracker 2 volume ramping Enables extra smooth sample ramping, like Fasttracker 2 did it. When enabled, percussive instruments (e.g. Bass Drums) will sound very muffled, as most of their attack will be lost.
 * FT2 arpeggio algorithm FT2 has a very buggy arpeggio command that, among other things, plays arpeggios backwards (second parameter’s note comes first).
 * Rxx behaves like in FT2 The Retrigger command also has very erratic behaviour in FT2, which is emulated by this setting.
 * Vibrato depth in volume column does not actually execute the vibrato effect The uxx command only sets the vibrato speed for subsequent vibrato commands, but does not actually play a vibrato.
 * Do not play portamento-ed note if no previous note is playing If there is no playing note, a new note with a Tone Portamento command next to it will not sound.
 * FT2-style Kxx handling Key Off is another weird command in FT2 and behaves differently with volume commands and instrument numbers next to it.
 * Volume-column pan slides are finer lxx and rxx are as fine as fine panning slides in Impulse Tracker.
 * FT2-style 9xx edge case handling Notes with offset commands beyond the sample length are never triggered.
 * Do not allow ModPlug extensions to X command Only X1x and X2x commands will work, X5x and higher do not.
 * Retrigger envelopes if there is a note delay with no note A note delay with no note next to it will still retrigger instrument envelopes.
 * Lxx only sets the pan envelope position if the volume envelope's sustain flag is set
 * Portamento with instrument number applies volume settings of new sample, but not the new sample itself
 * No volume column memory Volume column slides do not have a parameter memory.
 * Next pattern starts on the same row as the last E60 command After a pattern loop has been executed, the next pattern will start from the row where the loop started rather than from the first row. To avoid this, put a Pattern Break command at the end of the pattern.
 * Keep processing faded channels for later portamento pickup After a channel has been faded out, a Tone Portamento can still pick up this silent note.
 * Reload sample settings even if a note-off is placed next to an instrument number Even an instrument number next to a Note-Off note will apply the sample’s default volume and panning.
 * Portamento with note delay next to it is ignored Tone Portamentos only work on notes with no note delays.
 * Ignore out-of-range transposed notes A note, after applying the sample’s transpose amount, may not leave a certain range of notes. If it does, it is ignored.
 * Bxx or Dxx on the same row as E6x terminates the loop Pattern loops that also have a Position Jump or Pattern Break effect on the last row are never executed.
 * Portamento target is not reset with new notes Applying a Tone Portamento after a new note with no portamento has been triggered will slide back to the last note with portamento.
 * Sustain point at end of envelope loop stops the loop after release If the sustain point is at the loop end and the sustain point has been released, don't loop anymore.
 * Txx behaves like in FT2 Tremor is another somewhat idiosyncratic command in FT2.
 * Do not trigger notes with out-of-range note delay If the note delay is greater than the ticks per row (ignoring any pattern delays), it is ignored.
 * Use FT2's broken period handling When sliding a note too deep, it will wrap around at some point and become a very high note.
 * Panning command with delayed note-off is ignored If there is a Note Delay and Note-Off, a panning command next to them is ignored.
 * FT2-style volume column handling if there is a note delay If there is a note delay, volume column effects are not executed on the first tick and, if there is an instrument number, on the delayed tick.
 * Round sample finetune to multiples of 8 FT2 has a finetune ranging from -128 to 127, but a finetune change only be heard at every multiple of 8.
 * Fade instrument on note-off when there is no volume envelope; instrument numbers reset note-off status. Instruments with no instrument envelope are instantly muted when a note-off is encountered. If this note-off is not delayed (i.e. there is no EDx effect next to it), the instrument is also faded out, which is only relevant if a volume effect is encountered after the note-off. Additionally, instrument numbers after a note-off reset the note-off status, so the sustain status of the envelope is reset.
 * Emulate FT2's tremolo ramp down / triangle waveform The “ramp down” tremolo waveform (E71) is very buggy and even influenced by vibrato in FT2.
 * Portamento Up and Down have separate effect memory 1xx and 2xx do not share effect memory.

S3M compatibility settings
The following compatibility settings are only available in S3M modules. They are not saved in S3M files, but OpenMPT tries to guess the most appropriate settings when loading such files.

S3M files made with OpenMPT always use all compatibility settings. However, when loading S3M files made with less compatible trackers (such as Impulse Tracker), compatible playback settings are disabled automatically as required. Re-saving such a file in OpenMPT will re-enable them.


 * Do not reset panbrello effect until next note or panning effect After executing Panbrello, its panning offset remains on the following rows until a new note or other panning effect is encountered. If disabled, the panning offset is reset immediately.
 * Do not process any effects on muted S3M channels Any effect commands (even tempo and global volume commands) on muted channels are completely ignored. Many trackers and players still apply these commands on muted channels.
 * Most effects share the same memory Most effects in ScreamTracker 3 share a single effect memory (the only exception being vibrato and tone portamento effects). Many trackers and players implement effect-specific memory instead.
 * Portamento with instrument number applies volume settings of new sample, but not the new sample itself The default volume of the sample number next to a Tone Portamento command is applied, but no sample swap happens.
 * Do not remember vibrato type in effect memory Do not distinguish between vibrato types in effect memory, so that e.g. U1F followed by H00 causes the second effect to play a H1F vibrato. Effectively, this also means that Kxx will never play a fine vibrato.
 * Portamento immediately following an arpeggio effect continues at the last arpeggiated note If a portamento up or portamento down effect immediately follows an arpeggio effect, it starts sliding from the last arpeggiated note, and not from the channel frequency as it was before the arpeggio.

MOD compatibility settings
The following compatibility settings are only available in MOD modules. They are not saved in MOD files, but OpenMPT tries to guess the most appropriate settings when loading such files.


 * VBlank timing F20 and above sets speed instead of tempo.
 * ProTracker one-shot loops If (and only if) a sample’s loop starts at 0, the sample is first played in its entire length. Afterwards, only the loop section of the sample is repeated.
 * Ignore panning commands 8xx and E8x commands will do nothing.
 * Enable on-the-fly sample swapping Instrument numbers with no note next to them cause the playing sample to be exchanged by the newly specified sample. The effect takes place as soon as the currently played sample reaches its loop end.
 * Out-of-range note delay is played on next row A note that is played with a note delay greater than the current ticks per row is postponed to the first tick of the next row, unless the next row already plays another note. The postponed note is played with an instant portamento from a previously playing note rather than being played from start.
 * Tempo changes are handled on second tick instead of first F20 and above are only applied after the first tick of the row. At a speed of one tick per row, the change happens on the next row.