Development: Test Cases/IT
This test suite is a collection of IT modules that were created while discovering playback bugs in OpenMPT. It is meant to be an easy way to check for regressions when code is changed, or to verify your own player’s routines if you are concerned about playback compatibility. The tests are designed in a way so that it is easy to figure out if your player is working correctly. In most test cases, your own player’s output can be heard on the left channel, while Impulse Tracker’s output is heard on the right channel. This way, it is easy to find out whether everything works as intended or if there are any discrepancies without having to read any long test descriptions. When it is impossible to do such a cross-verification, a more detailed description of the test can usually be found in the sample, instrument or comment text.
Some test cases mention that they should stay quiet when played correctly. This does not take different ramping algorithms into account (so there might me a small “pop” at the start of samples or when changing the volume), and it is generally expected that the test cases are rendered at a mix rate of 44100 Hz, as otherwise different calculations of channel playback speed and interpolation settings may cause small but noticable differences in playback.
Bit-exact output is not the goal of this test suite, correct playback is, so slight deviations from Impulse Tracker’s output (e.g. different resampling algorithms, pop reduction, etc.) are acceptable. Some tests will only sound correct on the first run. Unless stated otherwise, it is not important that the test output sounds identical when looping the module.
Most test cases are documented (more or less) in OpenMPT’s source code with a reference to the filename of the test case. I am sorry that many tests do not have proper descriptions − I have started this documentation years after I have fixed some of these issues and can thus not remember all the details anymore. If you are stuck with one of the tests, you may have a look at specific source code revisions that are provided with most tests to see what was changed in the code to make it work correctly.
Last but not least, please keep in mind that some descriptions might be wrong or too general. Sometimes, the description might be correct in the given test case, but changing the test case slightly might completely invalidate the description of how an effect is supposed to work, for example. If you know better than me, please correct the texts, and please ask me if you need more information one of the test cases. The documentation is not always optimal because the test cases have been written long before I have created this site.
Autovibrato-Reset.it
Current status: OpenMPT passes this test since revision ???.
Download: Autovibrato-Reset.it
Description:
The autovibrato sweep is not reset when using portamento.
Bidi-Loops.it
Current status: OpenMPT passes this test since revision 793.
Download: Bidi-Loops.it
Description:
In Impulse Tracker’s software mixer, ping-pong loops are shortened by one sample. This does not happen with the GUS hardware driver, but I assume that the software drivers were more popular due to the limitations of the GUS, so OpenMPT emulates this behaviour.
BidiPrecision.it
Current status: OpenMPT passes this test since revision 15871.
Download: BidiPrecision.it
Description:
An extension to Bidi-Loops.it, this test verifies that the loop length of ping-pong loops is precise. The test is not required to stay absolutely silent, but the two channels may not phase, i.e. the sound should be a static buzz.
CarryNNA.it
Current status: OpenMPT passes this test since revision 1503.
Download: CarryNNA.it
Description:
This is a very interesting test case, because it actually sounds different when using Impulse Tracker’s WAV writer and Sound Blaster (and probably other drivers) output (the Sound Blaster 16 MMX driver also follows the behaviour of the WAV writer, to make things even more confusing).
The main difference is that the Sound Blaster driver will only consider the envelope carry flag if the New Note Action is not “Note Cut”. The WAV writer does not check for the NNA and will always apply the carry flag if it’s set. OpenMPT goes after the WAV writer, while e.g. XMPlay used the Sound Blaster behaviour for the volume and panning envelope, but the WAV writer’s behaviour for the filter envelope (because of a bug report some years ago) up until 2016. Obviously it is hard to consider which of the two behaviours is correct, so I would just say that both are. :) However, the WAV writer behaviour definitely is more useful (not being able to use Envelope Carry despite it being enabled is quite misleading), I strongly encourage everyone to implement this behaviour.
cut-carry.it
Current status: OpenMPT passes this test since revision 1165.
Download: cut-carry.it
Description:
Envelopes that have the carry flag set cannot be “picked up” / continued after the note has been cut.
dct_smp_note_test.it
Current status: OpenMPT passes this test since revision 12819.
Download: dct_smp_note_test.it
Description:
Instrument Duplicate Check Type “Sample” should only be carried out if the old and new instrument match (like all other check types).
Instrument Duplicate Check Type “Note” should compare the old and new pattern note, not translated notes according to the instrument’s mapping.
DNA-NoInstr.it
Current status: OpenMPT passes this test since revision 6311.
Download: DNA-NoInstr.it
Description:
OpenMPT previously did not properly check for the correct sample slot or sample map entry in DNA and NNA checks if no instrument number was provided. This testcase should remain silent when played correctly, i.e. both the first and second note on channel 1 should sound until the end of the pattern.
DoubleSlide.it
Current status: OpenMPT passes this test since revision 21807.
Download: DoubleSlide.it
Description:
Impulse Tracker generally initializes effect parameters, effect working memory and similar stuff once per row, before the effects actually run. When using (tone) portamento commands simulatenously in the effect column and volume column, this can lead to surprising results, and in order to emulate them correctly, it is crucial to implement the effect memory initialization in the exact same order as Impulse Tracker does:
- Evaluate effect column Gxx parameter
- Evaluate volume column gx parameter
- Evaluate volume column ex / fx parameter
- Evaluate effect column Exx / Fxx parameter
If played correctly, The left and right channel of this module should sound identical. The last few rows should stay silent.
DoubleSlideCompatGxx.it
Current status: OpenMPT passes this test since revision 21807.
Download: DoubleSlideCompatGxx.it
Description:
A variation of of DoubleSlide.it with the Compatible Gxx flag turned on. The same rules as above apply, but since portamento up / down and tone portamento memory is not linked, there are some natural differences in handling.
empty_sample_offset.it
Current status: OpenMPT passes this test since revision 6343.
Download: empty_sample_offset.it
Description:
In instrument mode, if an offset effect is found next to a note that maps to an invalid sample slot, the offset and illegal note should be ignored completely. Note that this behaviour is different from sample mode, where a previously playing sample will be stopped.
emptyslot.it
Current status: OpenMPT passes this test since revision 1671.
Download: emptyslot.it
Description:
I think, Impulse Tracker treats instruments like an additional layer of abstraction and first replaces the note and instrument in the pattern by the sample and note assignments from the sample map table before further evaluating the pattern. That would explain why for example the empty sample map slots do nothing in this module.
env-flt-max.it
Current status: OpenMPT passes this test since revision 1090 (?).
Download: env-flt-max.it
Description:
If resonance is not applied, the filter envelope’s maximum value does not enable any filtering. However, it also does not disable any filtering when returning from a non-maximum point. This pretty much works like Zxx commands.
EnvLoopEscape.it
Current status: OpenMPT passes this test since revision 4009.
Download: EnvLoopEscape.it
Description:
I created EnvOffLength.it without realizing that it is essentially the same bug as this one.
EnvLoops.it
Current status: OpenMPT passes this test since revision 1213.
Download: EnvLoops.it
Description:
In this test, all possible combinations of the envelope sustain point and envelope loops are tested, and you can see their behaviour on note-off.
If the sustain point is at the loop end and the sustain loop has been released, don't loop anymore.
Probably the most important thing for this test is that in Impulse Tracker (and Fasttracker 2), envelope position is incremented before the point is evaluated, not afterwards, so when no ticks have been processed yet, the envelope position should be invalid.
EnvOffLength.it
Current status: OpenMPT passes this test since revision 4009.
Download: EnvOffLength.it
Description:
If an envelope sustain loop happens to end on exactly the same tick as a note-off event occurs, the envelope is not yet released. It will be released whenever the loop end is being hit again.
EnvReset.it
Current status: OpenMPT passes this test since revision 1481.
Download: EnvReset.it
Description:
Impulse Tracker resets envelopes under some more or less weird conditions. This tests some of them.
extreme-filter-test-1.it
Current status: OpenMPT passes this test since revision 1090.
Download: extreme-filter-test-1.it
Description:
If resonant filters are rendered with integer arithmetic, they may produce scratching noises in some edge cases. You should not hear any scratches or other weird noises when playing this example.
extreme-filter-test-2.it
Current status: OpenMPT passes this test since revision 1090.
Download: extreme-filter-test-2.it
Description:
Same as the above test case. xmp breaks this module’s output even more than older versions of OpenMPT.
Fade-Porta.it
Current status: OpenMPT passes this test since revision 1144.
Download: Fade-Porta.it
Description:
After a note has been stopped in some way (for example through fade-out or note cut), tone portamento effects on the following note are ignored, i.e. there is no portamento from the stopped note to the new note.
filter-7F.it
Current status: OpenMPT passes this test since revision 1090 (?).
Download: filter-7F.it
Description:
A small test case that demonstrates that full cutoff should not enable the filter if no resonance is applied. Resonance is only ever applied if the cutoff is not full or the resonance is not zero.
FilterEnvReset.it
Current status: OpenMPT passes this test since revision 1132.
Download: FilterEnvReset.it
Description:
A cutoff value of 0 should not be reset to full cutoff when triggering a note just because the filter envelope is enabled. This bug is probably very specific to OpenMPT, because it gets rid of some unneccessary code.
FilterPortaSmpChange.it
Current status: OpenMPT passes this test since revision 18417.
Download: FilterPortaSmpChange.it
Description:
Normally Impulse Tracker does not disable the filter on portamento if cutoff was previously at 127 and resonance at 0, but in sample mode that is not the case when the new note plays a different sample.
FilterPortaSmpChange-InsMode.it
Current status: OpenMPT passes this test since revision ?.
Download: FilterPortaSmpChange-InsMode.it
Description:
Complementary test for FilterPortaSmpChange.it in instrument mode. Here the cutoff should never be reset on portamento.
filter-nna.it
Current status: OpenMPT passes this test since revision 1169.
Download: filter-nna.it
Description:
This test is just there to be sure that the filter-reset.it and filter-reset-carry.it test cases do not break NNA background channels.
filter-reset.it
Current status: OpenMPT passes this test since revision 1165.
Download: filter-reset.it
Description:
As mentioned already, filtering is only ever done in IT if either cutoff is not full or if resonance is set. When a Z7F command is found next to a note and no portamento is applied, it disables the filter, however in other cases this should not happen.
filter-reset-carry.it
Current status: OpenMPT passes this test since revision 1165.
Download: filter-reset-carry.it
Description:
I think this is also just an extenion to the previous test case, to make sure that it does not break anything else.
filter-reset-envelope.it
Current status: OpenMPT passes this test since revision 16016.
Download: filter-reset-envelope.it
Description:
This test checks that the filter is reset correctly for delayed filtered notes, and also acts as a regression test for filter-reset.it, because the first implementation for this test broke the other test. The output should stay silent (small pops are okay).
FilterResetPatDelay.it
Current status: OpenMPT passes this test since revision 16137.
Download: FilterResetPatDelay.it
Description:
An extension of filter-reset-envelope.it, this verifies the filter reset behaviour on rows with a Pattern Delay. The filter reset logic should only be applied on rows that are actually retriggering the note: If there is no note delay, the note is retriggered only on the first tick. If there is a note delay, the note is retriggered on every repetition of that row (see PatternDelay-NoteDelay.it).
FineVolColSlide.it
Current status: OpenMPT passes this test since revision 2400.
Download: FineVolColSlide.it
Description:
Unlike fine volume slides in the effect column, fine volume slides in the volume column are only ever executed on the first tick — not on multiples of the first tick if there is a pattern delay. Thus, the left and right channel of this example should always have the same volume.
flt-env-carry.it
Current status: OpenMPT passes this test since revision 693 (?).
Download: flt-env-carry.it
Description:
Envelope carry on the filter envelope. I think this is just a general test on how envelope carry is applied. It is possible that Impulse Tracker’s MMX drivers will play this in a different way from the WAV writer.
fltmacro.it
Current status: OpenMPT passes this test since revision ???.
Download: fltmacro.it
Description:
This test uses a custom macro configuration that uses the instrument volume to control the filter cutoff. A correctly implemented MIDI Macro system should pass this test.
freqreset-noins.it
Current status: OpenMPT passes this test since revision 325.
Download: freqreset-noins.it
Description:
When using multisample instruments, even notes with no instrument number next to them can change the sample (based on the active instrument’s sample map). When switching between samples, you must not forget to update the C-5 frequency of the playing sample as well.
GlobalVolFirstTick.it
Current status: OpenMPT passes this test since revision 6362.
Download: GlobalVolFirstTick.it
Description:
Set Global Volume (Vxx) should be applied on the first tick (and multiples in case of pattern delays). If played correctly, the first and second row of this module should sound more or less identical, i.e. each row should play 16 fading notes.
globalvol-invalid.it
Current status: OpenMPT passes this test since revision 290.
Download: globalvol-invalid.it
Description:
Out-of-range global volume commands (V81...VFF) should not change the current global volume. This test module should remain completely silent.
GlobalVolume-Macro.it
Current status: OpenMPT currently fails this test.
Download: GlobalVolume-Macro.it
Description:
Global volume, channel volume and various other parameters are taken into account when interpreting the 'u' and 'v' letters in MIDI macros. However, this feature seems to be quirky, and I have decided not to support these quirks in OpenMPT, as I do not think that anyone used this feature in Impulse Tracker very much and I would want it to work in a sane way when using it to control instrument plugins in OpenMPT. The quirks are:
- Channel and global volume seem to be applied one row after they have been set. This does not seem to be the whole truth, though, as looking at pattern 0, row 9, you should hear that IT applies the M40 channel volume change on row 10.
- Instrument / sample volume also seems to be applied one row late when using the 'u' macro, but not the 'v' macro (compare first and second pattern, row 15 - 22 each).
There are also some problems with volume swing which might be fixed later.
gxsmp.it
Current status: OpenMPT passes this test since revision 1671.
Download: gxsmp.it
Description:
Another test case with an empty sample map slot which is simply ignored by Impulse Tracker.
gxsmp2.it
Current status: OpenMPT passes this test since revision 1671.
Download: gxsmp2.it
Description:
Going one step further by also changing the sample next to that portamento.
gxxtest.it
Current status: OpenMPT passes this test since revision 4330.
Download: gxxtest.it
Description:
And another similar test.
InitialNoteMemory.it
Current status: OpenMPT passes this test since revision 18838.
Download: InitialNoteMemory.it
Description:
The initial "last note" memory of each channel in Impulse Tracker is initialized to C-0. So the first lone instrument number without any note next to it will play a C-0 of that instrument.
InitialNoteMemoryInstrMode.it
Current status: OpenMPT passes this test since revision 18838.
Download: InitialNoteMemoryInstrMode.it
Description:
A variation of InitialNoteMemory.it, but in instrument mode. The lowest note of instrument 1 has no sample association, which will also cause subsequent notes without instrument number to not play.
ins-flt-porta-reset.it
Current status: OpenMPT passes this test since revision ???.
Download: ins-flt-porta-reset.it
Description:
Instrument filter settings should not be applied if there is a portamento effect.
ins-oc.it
Current status: OpenMPT passes this test since revision 11293.
Download: ins-oc.it
Description:
Instrument number resets envelope behaviour test with Old Effects enabled, Compatible Gxx enabled: Always reset envelopes.
Note: WAV export in Impulse Tracker versions with Envelope Carry support differs from GUS / SoundBlaster playback in the second pattern. This track uses “real” sound card output as a reference.
ins-ox.it
Current status: OpenMPT passes this test since revision 11293.
Download: ins-ox.it
Description:
Instrument number resets envelope behaviour test with Old Effects enabled, Compatible Gxx disabled: Reset envelopes if there is no tone portamento.
Note: WAV export in Impulse Tracker versions with Envelope Carry support differs from GUS / SoundBlaster playback in the second pattern. This track uses “real” sound card output as a reference.
ins-xc.it
Current status: OpenMPT passes this test since revision 11293.
Download: ins-xc.it
Description:
Instrument number resets envelope behaviour test with Old Effects disabled, Compatible Gxx enabled: Reset envelopes if there is a tone portamento.
Note: WAV export in Impulse Tracker versions with Envelope Carry support differs from GUS / SoundBlaster playback in the second pattern. This track uses “real” sound card output as a reference.
ins-xx.it
Current status: OpenMPT passes this test since revision 0.
Download: ins-xx.it
Description:
Instrument number resets envelope behaviour test with Old Effects disabled, Compatible Gxx disabled: Never reset envelopes.
InstrAfterMultisamplePorta.it
Current status: OpenMPT passes this test since revision 7465.
Download: InstrAfterMultisamplePorta.it
Description:
A lone instrument number should only reset sample properties to those of the corresponding sample in instrument mode. Example:
C#5 01 ... <-- sample 1 C-5 .. g02 <-- sample 2 ... 01 ... <-- still sample 1, but with properties of sample 2
In the above example, no sample change happens on the second row. In the third row, sample 1 keeps playing but with the volume and panning properties of sample 2.
InstrumentNumberChange.it
Current status: OpenMPT passes this test since revision 1902.
Download: InstrumentNumberChange.it
Description:
While Impulse Tracker cuts playing samples if it encounters an invalid sample number in sample mode, the same does not happen if we are in instrument mode.
JxxTicks.it
Current status: OpenMPT passes this test since revision 1537.
Download: JxxTicks.it
Description:
Impulse Tracker’s arpeggio logic is pretty sane compared to some other trackers, but one detail should be kept in mind: Pattern Delays reset the tick counter, but it keeps incrementing with Fine Pattern Delays. The arpeggio sequence thus resets every (ticks per row + fine pattern delay) ticks.
LinearSlides.it
Current status: OpenMPT passes this test since revision 4330.
Download: LinearSlides.it
Description:
Impulse Tracker internally uses actual frequency values, while Fasttracker 2 still uses exponentially scaled fine Amiga periods. When doing fine slides, errors from using periods instead of frequency can add up very quickly, and thus the two channel's frequency in this test will converge noticeably.
LoopBreak.it
Current status: OpenMPT passes this test since revision 5413.
Download: LoopBreak.it
Description:
A pattern break (Cxx) on the same row as the end of a pattern loop (SBx) repeats the pattern loop x times and then jumps to the desired row. However, a position jump (Bxx) on the same row as the end of a pattern loop prevents the loop from being executed if it is right of the SBx effect. In this test, the left and right channel of the module should produce the same click patterns.
LoopStartAfterPatternEnd.it
Current status: OpenMPT passes this test since revision 7791.
Download: LoopStartAfterPatternEnd.it
Description:
Since the start row of a pattern loop is not reset on pattern transitions, it is possible to use a loop start past the end of the current pattern when using a pattern loop without explicit start command (SB0). In this case, playback should continue in the next pattern. In the example, this happens because the loop start is set to one row after the loop end after properly terminating the loop in pattern 0.
LxxWith0Portamento-Amiga.it
Current status: OpenMPT passes this test since revision r22552.
Download: LxxWith0Portamento-Amiga.it
Description:
A strange edge case when using Lxx (Volume Slide + Tone Portamento) while the tone portamento effect memory is 0: The tone portamento comamnd is not initialized properly in this case, causing it always to assume that it's trying to execute a portamento down. If the current note is below the note to which the tone portamento would lead, this causes the note to immediately jump to the target note. If the current note is above the target note, nothing happens.
LxxWith0Portamento-Linear.it
Current status: OpenMPT passes this test since revision r22552.
Download: LxxWith0Portamento-Linear.it
Description:
Same as LxxWith0Portamento-Amiga.it, but with linear slides. The difference is that when the current note is above the target note, the frequency is decremented by 1 Hz on every tick (linear slides always slide by at least 1 Hz).
macro-lastnote.it
Current status: OpenMPT passes this test since revision 947 (?).
Download: macro-lastnote.it
Description:
A test of the MIDI macro letter “n”. This letter will always send the MIDI note value of the last triggered note, note cuts and similar “notes” are not considered. This module should remain silent as both channels should receive exactly the same cutoff values.
MacroExtendedParam.it
Current status: OpenMPT passes this test since revision 16715.
Download: MacroExtendedParam.it
Description:
Even fixed macros (Z80-ZFF) can contain the letter “z”, which inserts the raw command parameter into the macro (i.e. a value in [80, FF[). In this file, macro ZF0 is used to insert byte F0 into the string. This way, two MIDI messages to set both the filter cutoff and resonance to 60h are created, which are the same filter settings as used in instrument 2, so the module should stay silent.
MultiZxx.it
Current status: OpenMPT passes this test since revision 947 (?).
Download: MultiZxx.it
Description:
A MIDI macro can contain more than one MIDI message. In this case, the Z90 macro sets both the filter cutoff frequency and resonance, so if only the first MIDI message is considered in this macro, the module will no longer stay silent at row 8.
NoMap.it
Current status: OpenMPT passes this test since revision 1671.
Download: NoMap.it
Description:
Yet another sample map test case. Why are there so many of them? They are all fixed by the same code...
NoMapEffects.it
Current status: OpenMPT passes this test since revision 20790 + 20820.
Download: NoMapEffects.it
Description:
Empty instrument note map slots are truly one of the most mysterious parts of Impulse Tracker’s reply routines. This particular test started out to verify that a currently playing instrument’s envelopes are not reset by sample-less note map slots, but it quickly evolved into a complete nightmare. In this test you see many global effects, and not a single one of them does anything. They do not jump around in the pattern, they do not modify the tempo. Anything in a cell where a sample-less note map slot is hit is ignored completely. This also affects the first row of the module due to InitialNoteMemory.it - this mechanism also takes previously triggered notes into account. Only on row 3 it does not apply, because Note Off / Note Cut / Note Fade invalidate the previously triggered note.
All in all, this absolutely crazy test case should play identically on the left and right channel.
NoSlide.it
Current status: OpenMPT passes this test since revision ???.
Download: NoSlide.it
Description:
This seems to be just a fancy test of portamento from a stopped note, but in this case an empty sample slot assigned to the same instrument was played before.
NoteFade-SmpMode.it
Current status: OpenMPT passes this test since revision 317.
Download: NoteFade-SmpMode.it
Description:
A “note fade” note (any invalid note) should not do anything in sample mode. The sample should not be stopped.
NoteFade-InsMode.it
Current status: OpenMPT passes this test since revision 317.
Download: NoteFade-InsMode.it
Description:
A “note fade” note (any invalid note) should fade out the instrument using its fadeout value.
noteoff2.it
Current status: OpenMPT passes this test since revision ??? + 5829.
Download: noteoff2.it
Description:
The sample changes on rows 4 and 20, but not on rows 8 and 24. However, the new sample′s default volume is loaded.
noteoff3.it
Current status: OpenMPT passes this test since revision 12284.
Download: noteoff3.it
Description:
This is the same as noteoff2.it, but with old effects enabled. In this case, the sample should never fade out.
NoteOffInstr.it
Current status: OpenMPT passes this test since revision 5829.
Download: NoteOffInstr.it
Description:
Any kind of Note Cut (SCx or ^^^) should stop the sample and not set its volume to 0. A subsequent volume command cannot continue the sample, but a note, even without an instrument number can do so. When played back correctly, the module should stay silent.
Off-Porta.it
Current status: OpenMPT passes this test since revision 1344.
Download: Off-Porta.it
Description:
When "Compatible Gxx" is disabled, the key-off flag should only be removed when triggering new notes, but not when continuing a note using a portamento command.
Off-Porta-CompatGxx.it
Current status: OpenMPT passes this test since revision 0 (temporarily broken in rev. 1344).
Download: Off-Porta-CompatGxx.it
Description:
When "Compatible Gxx" is enabled, the key-off flag should also be removed when continuing a note using a portamento command (row 2, 4, 6). This test case was written to discover a code regression when fixing Off-Porta.it).
OffsetWithInstr.it
Current status: OpenMPT passes this test since revision 20863.
Download: OffsetWithInstr.it
Description:
An offset effect can be triggered if only an instrument number and no note is next to it, if the last triggered note was not a note cut, note off or note fade.
PanbrelloHold.it
Current status: OpenMPT passes this test since revision 4712.
Download: PanbrelloHold.it
Description:
The panbrello offset should not only be added on the same row as the panbrello effect appears on, but also on all follow-up rows, until a panning command or a new note is encountered. This test case should remain mostly silent.
PanReset.it
Current status: OpenMPT passes this test since revision 4713.
Download: PanReset.it
Description:
Contrary to XM, the default instrument and sample panning should only be reset when a note is encountered, not when an instrument number (without note) is encountered. The two channels of this module should be panned identically.
PanResetInstr.it
Current status: OpenMPT passes this test since revision 11856.
Download: PanResetInstr.it
Description:
Instruments and samples with a defined panning should not override the channel panning for following notes. That is, if a different instrument with no panning set follows an instrument that has panning set, the first instrument’s panning should not be applied to the second instrument, but rather the channel panning as it was set before playing the first instrument (or if the channel panning was changed while that instrument was playing, the new channel panning applies as well).
If played correctly, this test case should remain silent.
PatternDelay-NoteDelay.it
Current status: OpenMPT passes this test since revision 1240.
Download: PatternDelay-NoteDelay.it
Description:
Delayed notes (using SDx) that are on the same row as a Row Delay effect are retriggered on every repetition. Notes without a note delay are not retriggered.
PatternDelays.it
Current status: OpenMPT passes this test since revision 1224.
Download: PatternDelays.it
Description:
Tick delays (S6x) are added up, but when there are multiple row delays (SEx), only the first one is considered. The tricky part here is that Impulse Tracker even ignores all row delays next to a SE0 row delay. I suggest to do the following:
- Initialize a row delay variable with 0.
- Go through all channels. If there is a row delay on the current row and row delay is 0, set row delay = parameter + 1.
- Calculate the complete row length: row length = (speed + tick delay) * max(1, row delay)
PatternDelaysRetrig.it
Current status: OpenMPT passes this test since revision 1221.
Download: PatternDelaysRetrig.it
Description:
Rows on which a row delay (SEx) effect is placed have multiple “first ticks”, i.e. you should set your “first tick flag” on every tick that is a multiple of speed + tick delay. In this test module, the note pitch is changed multiple times per row, depending on the row and tick delay values.
Note: This test case broke in r3520 and was fixed again in r4895.
PitchPanReset.it
Current status: OpenMPT passes this test since revision 15870.
Download: PitchPanReset.it
Description:
Pitch/Pan Separation can be overriden by panning commands, and should not be affected by Note Off or Note Fade notes.
PortaCutCompat.it
Current status: OpenMPT passes this test since revision 9139.
Download: PortaCutCompat.it
Description:
A follow-up test to PortaSampleCompat.it and PortaInsNumCompat.it to verify that the behaviour described in these tests is not used when currently no note is playing. Both channels should sound identical.
PortaInsNum.it
Current status: OpenMPT passes this test since revision 1671.
Download: PortaInsNum.it
Description:
Portamento with funny sample maps. Without compatible Gxx, portamento between different samples should play the new sample.
PortaInsNumCompat.it
Current status: OpenMPT passes this test since revision 2842.
Download: PortaInsNumCompat.it
Description:
Portamento with funny sample maps, in compatible Gxx mode. With compatible Gxx, portamento between different samples should keep playing the old sample.
PortaJustStoppedNote.it
Current status: OpenMPT passes this test since revision 6193.
Download: PortaJustStoppedNote.it
Description:
Fade-Porta.it already tests the general case of portamento picking up a stopped note (portamento should just be ignored in this case), but there is an edge case when the note just stopped on the previous tick. In this case, OpenMPT did previously behave differently and still execute the portamento effect.
porta-offset.it
Current status: OpenMPT passes this test since revision 0.
Download: porta-offset.it
Description:
Unlike Fasttracker 2, Impulse Tracker does not ignore offset commands next to portamentos and executes them both. Even ModPlug Tracker 1.16 gets this test right.
PortaReset.it
Current status: OpenMPT passes this test since revision 4181.
Download: PortaReset.it
Description:
Impulse Tracker completely resets the tone portamento target on every new non-portamento note, i.e. a follow-up Gxx effect should not slide back to the previously triggered note.
PortaResetAfterRetrigger.it
Current status: OpenMPT passes this test since revision 7465.
Download: PortaResetAfterRetrigger.it
Description:
After a note has stopped playing, a lone instrument number can restart the note. In this case, portamento and other properties should be reset.
PortaSample.it
Current status: OpenMPT passes this test since revision 1671.
Download: PortaSample.it
Description:
Impulse Tracker executes the portamento when switching to instrument two on the second row when compatible Gxx is disabled.
PortaSampleCompat.it
Current status: OpenMPT passes this test since revision 2842.
Download: PortaSampleCompat.it
Description:
Impulse Tracker executes the portamento and doesn't switch to the new sample on the second row when compatible Gxx is enabled.
RandomPan.it
Current status: OpenMPT passes this test since revision 2545.
Download: RandomPan.it
Description:
Pan swing should not be overridden by effects such as instrument panning or panning envelopes. Previously, pan swing was overridden in OpenMPT if the instrument also had a panning envelope. In this file, pan swing should be applied to every note.
RandomWaveform.it
Current status: OpenMPT passes this test since revision 3670.
Download: RandomWaveform.it
Description:
When selecting the random waveform for panbrello, the “speed” nibble indicates for how many ticks the random value will be held. This behaviour is not used for vibrato / tremolo.
ResetEnvNoteOffOldFx.it
Current status: OpenMPT passes this test since revision 11276 - 11283.
Download: ResetEnvNoteOffOldFx.it
Description:
In Old Effects mode, an instrument number next to a note-off does not just recall the default volume and panning, but also resets the envelopes.
If the instrument is different from the currently playing instrument, the new instrument's envelope and default sample settings (default volume, panning, but not global volume) are loaded, but the old sample waveform keeps playing.
When played correctly, the left and right audio channel should sound identical. On the last note, the tracker channels swap their stereo position.
ResetEnvNoteOffOldFx2.it
Current status: OpenMPT passes this test since revision 11284.
Download: ResetEnvNoteOffOldFx2.it
Description:
An extension of ResetEnvNoteOffOldFx.it which also tests instrument note-off and sample sustain loop behaviour: While the sample sustain loop should be released, the instrument should not be faded out.
retrig.it
Current status: OpenMPT passes this test since revision 364.
Download: retrig.it
Description:
A combination of the retrigger effect and instrument envelopes. Not sure how this works.
retrig-short.it
Current status: OpenMPT passes this test since revision 1140.
Download: retrig-short.it
Description:
Impulse Tracker does not retrigger notes that are shorter than the duration of a tick. One might argue that this is a bug in Impulse Tracker, but OpenMPT emulates it anyway.
s7xinsnum.it
Current status: OpenMPT passes this test since revision 1062.
Download: s7xinsnum.it
Description:
Changing the NNA action through the S7x command only affects the current note - The NNA action is reset on every note change, and not on every instrument change.
s77.it
Current status: OpenMPT passes this test since revision 561 (preliminary), 1112.
Download: s77.it
Description:
The S77 / S79 / S7B commands pause the instrument envelopes, they do not turn them off. S78 / S7A / S7C should resume the envelope at exactly the position where it was paused. In this test, it is again very important that the envelope position is incremented before the point is evaluated, not afterwards (see EnvLoops.it).
SampleNumberChange.it
Current status: OpenMPT passes this test since revision 0.
Download: SampleNumberChange.it
Description:
Contrary to InstrumentNumberChange.it, even ModPlug Tracker 1.16 passes it.
SampleSustainAfterPorta.it
Current status: OpenMPT passes this test since revision 20760.
Download: SampleSustainAfterPorta.it
Description:
When a sample’s sustain loop was released, and a new note from a different sample is played with tone portamento applied, the second sample’s sustain loop also stays released.
SampleSustainAfterPortaCompatGxx.it
Current status: OpenMPT passes this test since revision 20760.
Download: SampleSustainAfterPortaCompatGxx.it
Description:
Same as SampleSustainAfterPorta.it, but with Compatible Gxx turned on.
SampleSustainAfterPortaInstrMode.it
Current status: OpenMPT passes this test since revision 20760.
Download: SampleSustainAfterPortaInstrMode.it
Description:
Same as SampleSustainAfterPorta.it, but in instrument mode. Here a difference in the behaviour can be observed when doing a second switch after the initial note-off: The first time, the sustain loop remains disabled, but for the subsequent note, the sustain loop is used again. This does not happen in sample mode.
sbx-priority.it
Current status: OpenMPT passes this test since revision 12171.
Download: sbx-priority.it
Description:
This is an extension of LoopBreak.it. A position jump (Bxx) on the same row as the end of a pattern loop prevents the loop from being executed if it is right of the SBx effect, but if the position jump is left of the SBx effect, the loop should be prioritized. In this test, the left and right channel of the module should produce the same beep patterns.
scx.it
Current status: OpenMPT passes this test since revision 1109.
Download: scx.it
Description:
The SCx command cuts notes just like a normal note cut (^^^), it does not simply mute them. However, there is a difference when placing a lone instrument number after a note that was cut with SCx and one cut with ^^^, as it can be seen in this test case.
SlideDelay.it
Current status: OpenMPT passes this test since revision 3520.
Download: SlideDelay.it
Description:
If there's a note delay, slide and vibrato commands in the volume column next to it should not start before the delay has finished.
So if there's a fine volume slide next to a SD5 effect should start on the 6th (one-based) tick. If this was a normal volume or pitch slide and the speed was 6 ticks per row, it would never execute, as the first non-zero tick would be the seventh tick.
SmpInsPanSurround.it
Current status: OpenMPT passes this test since revision 1259.
Download: SmpInsPanSurround.it
Description:
Sample and instrument panning override the channel surround status, i.e. surround is turned off by samples or instruments with panning enabled.
surround-pan.it
Current status: OpenMPT passes this test since revision 1134.
Download: surround-pan.it
Description:
Pan swing, panbrello, panning envelopes, etc. should have no effect on surround channels.
StoppedInstrSwap.it
Current status: OpenMPT passes this test since revision 5829.
Download: StoppedInstrSwap.it
Description:
An instrument number with no note or next to a ^^^ should always be remembered for the next instrument-less note, even if sample playback is stopped.
SusAfterLoop.it
Current status: OpenMPT passes this test since revision 1085.
Download: SusAfterLoop.it
Description:
When a sample sustain loop, which is placed partly or completely behind a “normal” sample loop is exited (through a note-off event), and the current sample playback position is past the normal loop’s end, it is adjusted to loop start + ((current position - loop start) % loop length).
SwapNNA.it
Current status: OpenMPT passes this test since revision 10239.
Download: SwapNNA.it
Description:
Related to s7xinsnum.it, the NNA action should be reset when doing an instrument swap with portamento.
swaptest.it
Current status: OpenMPT passes this test since revision ???.
Download: swaptest.it
Description:
A test focussing on finding the correct sample playback position when switching samples “on the fly” (using instrument numbers without notes next to them). The module should remain silent when being played.
swing1.it
Current status: OpenMPT passes this test since revision 1046 (?).
Download: swing1.it
Description:
Probably a very MPT-specific bug, as OpenMPT was adding the volume swing to the current volume, so even after setting the volume to 0, it was possible that you could hear the sample playing.
swing2.it
Current status: OpenMPT passes this test since revision 1046 (?).
Download: swing2.it
Description:
This module should remain completely silent, as the random variation is multiplied with the sample volume.
swing3.it
Current status: OpenMPT passes this test since revision 1046 (?).
Download: swing3.it
Description:
Of course you are not supposed to produce the same sequence of random number to fulfil this test case. I think this was just a test to explore which volume variables are actually affected by volume swing, and how it is applied.
swing4.it
Current status: OpenMPT passes this test since revision 1046 (?).
Download: swing4.it
Description:
Same as above.
swing5.it
Current status: OpenMPT passes this test since revision 1046 (?).
Download: swing5.it
Description:
Same as above.
tickdelay.it
Current status: OpenMPT passes this test since revision 4948.
Download: tickdelay.it
Description:
This test detects whether out-of-range note delays are handled properly. If the SDx parameter is greater than the row length (including tick delay, but excluding row delay), any note and volume effects next to it are supposed to ignored (interestingly, the instrument number is saved, but not instantly used). The first two rows test tick delay behaviour (OpenMPT passes this test since revision 1306), the third row tests row delay behaviour.
tremolo.it
Current status: OpenMPT passes this test since revision 345 (?).
Download: tremolo.it
Description:
A test for checking if tremolo tables are implemented correctly.
vibrato.it
Current status: OpenMPT passes this test since revision 1189.
Download: vibrato.it
Description:
A test for checking if vibrato tables are implemented correctly when old FX are disabled.
VibratoDouble.it
Current status: OpenMPT passes this test since revision 7804.
Download: VibratoDouble.it
Description:
Vibrato in the volume column should be applied separately from vibrato in the effect column. The two commands will add up when occuring at the same time. However, since there is only one vibrato effect memory for both commands, the volume column’s vibrato parameter has precedence if it is not 0.
vibrato-oldfx.it
Current status: OpenMPT passes this test since revision 1189.
Download: vibrato-oldfx.it
Description:
A test for checking if vibrato tables are implemented correctly when old FX are enabled. Vibrato is played backwards in this mode!
VibratoSweep0.it
Current status: OpenMPT passes this test since revision 7134.
Download: VibratoSweep0.it
Description:
Auto-vibrato should not be processed at all if the rate (speed) is 0. This is relevant for vibrato waveforms that do not start at zero, i.e. all except sine.
VolColMemory.it
Current status: OpenMPT passes this test since revision 1545.
Download: VolColMemory.it
Description:
Volume column commands a, b, c and d (volume slide) share one effect memory, but it should not be shared with Dxy in the effect column. Furthermore, there is no unified effect memory across different kinds of volume column effects (that's how OpenMPT used to handle it up to revision 1544).
vol-env-carry.it
Current status: OpenMPT passes this test since revision 1781.
Download: vol-env-carry.it
Description:
Similar to flt-env-carry.it. This test case temporarily broke in revision 1481 and was fixed in revision 1781.
Volume-Macro-Letters.it
Current status: OpenMPT passes this test since revision 1465.
Download: Volume-Macro-Letters.it
Description:
This test demonstrates how Zxx macros are parsed in Impulse Tracker:
- Macros are evaluated only on the first tick.
- They appear to be parsed after note / instrument information has been read from the pattern, but before any other effects (excluding "Set Volume").
- 'u' and 'v' macros seem to emit at least a value of 1, not 0 - v00 corresponds to Z01.
I am not quite sure why the first row with notes on it emits a filter value of 1, and I am not even completely sure why OpenMPT gets this right. If interpreted correctly, the module should stay silent (minus slight filter artefacts, of course - but they should be nearly inaudible).
weirdloop.it
Current status: OpenMPT passes this test since revision 0.
Download: weirdloop.it
Description:
A nice broken pattern loop. The voice should say “1 4 2 1 4 2” and then repeat forever “3 4 2”. Theoretically, this would even work in ModPlug Tracker 1.16, if it did not reset the Cxx target on song loop.
ZxxSecrets.it
Current status: OpenMPT passes this test since revision 9855.
Download: ZxxSecrets.it
Description:
Impulse Tracker supports three MIDI macro characters which are not documented in MIDI.TXT:
- h: Host channel, i.e. the pattern channel in which the Zxx command is encountered (0-based).
- o: The last used sample offset value. The high offset (SAx) is not taken into account. Note that offsets above 80h are not clamped, i.e. they generate MIDI command bytes (e.g. O90 would cause a note-on command to be emitted).
- m: This command sends the current MIDI note if the channel is a MIDI channel, but on sample channels the current loop direction (forward = 0, backward = 1) of the sample is stored in the same memory location, so the macro evaluates to that instead of a note number.
In addition, the MIDI messages FA (start song), FC (stop song) and FF (reset) reset the resonant filter parameters (cutoff = 127, resonance = 0) for all channels, but do not immediately update the filter coefficients.
In total, OpenMPT passes 119 out of 120 tests.