TimPlayer is a soundtrack player module capable of playing multiple files at once as well as samples/gingles.
For download of the module and its documentation, refer to DigitalCD's download section.
Version 1.22, 2013-05-09
- MDL, Global volume effects EA and EB are slides, not fine slides and have memory.
- MDL, Volume slides effects Gxx, Hxx have the same stepping has extra fine slides GEx, HEx while fine slides GFx, HFx are 4 times coarser.
- MDL, Volume slides GE0, GF0, HE0, HF0 are slides by 0, not memory.
- MDL, Panning effect 8xx, sets panning by xx modulo 128, i.e. top bit is ignored.
- MDL, Panning effects E1 and E2 are slides with memory.
- MDL, Pitch slides are independant of sample frequency. IT/S3M translate the frequency/8363Hz ratio into a relative tone added to the note number and apply non-linear Amiga slides on that updated tone causing two identical notes to slide at different speed if their sample frequency differs. In MDL the frequency is taken into account after the final tone is determined.
- MDL, Retrigger Ixy behave has E9y (trigger at frame 0, y, 2y, ...), volume change x is not applied for frame 0.
- MDL, Keyoff turns sustain off and fades note volume to 0 (~= XM except that XM forces volume to 0 if no volume envelope).
- MDL, Slot (note + inst + effects) replication of n in pattern decoding was incorrectly replicating the previous slot in the n+1 following rows instead of n.
- S3M, Some samples may not be defined. They are not treated as samples of size 0 but ignored completely (i.e. attempt to play a note with such a sample will not even cut the note that was previously playing).
- XM, Keyoff fades note volume to 0 but does not terminate the note, applying an instrument will reactivate it.
- Play, Various corrections for combination of no note but instrument specified in pattern:
- Intempestive check for sample size 0 treated those as non-existing sample.
- Non-existing sample (or above case) dereferenced null pointer and set note volume to whatever was at that offset (0 on my machine).
- XM does not reset the note parameters (volume, sustain, ...) using the defaults of the new instrument but of the playing one.
- S3M treats non-stored samples as undefined ones, IT as ones with max volume and size 0, the rest as ones with volume 0 and size 0. Their sample list are I presume fixed size arrays initialised in that way.
- Play, Various corrections related to note maps in instruments:
- Was dereferencing NULL pointer while trying to read note map for corrupted instruments without note map.
- IT ignores instrument if it maps to sample 0 (like undefined samples for S3M).
- MDL uses an empty sample with volume to 0 if instrument maps to sample 0.
Version 1.21, 2012-12-02
Converted player routines to C. Mixing and filters are now the only parts remaining in assembler.
- MOD, added Soundtracker 2.6/IceTracker variants with 1 track per channel (just like Digital Symphony).
- Loaders, added loader for Future Composer 1.0-1.4.
- FAR, incorrect calculations for portamento.
- IT, shouldn't keep garbage as comments if comments offset is outside file limits.
- Play, Instrument/Sample parameters not always reset correctly.
- Play, retrigs with volume change by +-x, changes were 4 times too little.
- Play, retrigs with no volume change, should not restore sample default volume.
- Play, retrig MOD/XM/IT, counter not always reset correctly after new note.
- Play, retrig PTM, counter was reset every frame.
- Play, vibrato, slight rounding errors.
- Play, auto volume/pitch slides/portamento, effect was reactivated even after reaching target.
Version 1.20, 2012-09-01
- Play: Authors are supposed to set tempo/speed on entry of each song sections but sometimes forgot to do so. I noticed that most of the time they relied on the same tempo/speed as the end of the previous section but if you play directly you get the song's default tempo/speed.
To make it consistent, while calculating song length I save tempo/speed for each position in the sequence and use these values while playing. The benefit is double, consistent timing from both normal replay or from jumping to the new section (or jumping anywhere else using SWI SongPosition).
- Loaders, added support for DigiTrakker (.mdl).
- Loaders, added support for X-Tracker (.dmf).
- Loaders, added support for Imago Orpheus (.imf).
- DBM, implemented effect E3xx (Play backward).
- Digi, implemented effect E3xx (Play backward).
- FAR, implemented the whole set of effects, vibratos may have some issues.
- MMD, implemented effect 2000 (Reverse sample).
- ULT, implemented effects 5x1/51x (Loop off), 5x2/52x (Reverse+Loop off).
- Loader, fixed a few problems when releasing memory for files which failed to load: memory leaks and attempts to free unallocated memory.
- Loader, centralized some checks and error messages as well as removal of control characters.
- 669, From some documentation of other trackers like Farandole and FunkTracker I gained a few hints on the very incomplete info on 669:
- Tempo gives the duration of a row as tempo/32 seconds, thought another mention gives a correspondance of tempo 4 = MOD speed 6 which would give you, depending of the default beat of 120 (old 15 inst. MOD) or 125, 31.25 or 33.33 instead of 32. From the files at hand, the 3 values could well coexists depending on the origin of the file (Composer 669, UNIS 669 or a converter).
- In 669, there is no decomposition of rows into frames (i.e. MOD speed = 1), so 669 tempo is not to be translated to speed = 669 tempo + 2 like modplug does (cf. 669 tempo 4 = MOD speed 6?) nor even speed = tempo like some other played do, but into corresponding tempo values. Slide effects give the slide for the whole row, not a frame.
- 669 uses linear slides but applied on the frequency (thus not the XM/IT "linear mode" which slides in fractions of semitones). From tests I think slides are given in steps of 64 Hz.
- DskT, both pitch limits where set 1 octave too high.
- FAR, tempo gives the duration of a row as tempo/32 seconds.
- FAR, there is no decomposition of rows into frames (i.e. MOD speed = 1), so tempo is not to be translated to speed but into corresponding tempo values.
- FAR, volume column is stored as volume + 1 and value 0 means no volume setting.
- FAR, undocumented: the number of rows in a pattern is stored as rows - 2.
- GTK, effect 0xA9 is not a "Set Tempo" but a "Set Tempo Fraction" so it is now left unimplemented.
- GTK, effect 0x0A (Detune) xy is finetune by (x - y), i.e with twice the range of normal finetune.
- GTK, effect 0x0F with values < 32 (Set Speed) forces tempo to 125.
- PTM, forgot to translate sample frequency as (8363 Hz + reltone value), this affects pitch slides amplitude.
- PTM, set sample offset is given in bytes (affects 16-bit samples).
- PTM, found the PolyPlayer PP.EXE release by the author of PolyTracker and got to test it on DosBox.
- The explainations from an ex-PolyTracker user I got 10 years ago are wrong, slides/vibrato are not by value + 1 but value and 0 is memory.
- Volume slides Axy with both xy set behave as slide up by x.
- Volume effcts Cxx or Gxx with xx above 64, clip xx to 64.
- Retrig E9x behaves as the XM retrig E9z with z = x - 1, x= 0 having no effect.
- Delay EDx behaves as the MOD delay EDz with z = x - 1, x= 0 having no effect.
- Retrig Hxy, another new implementation specific retrig!
- STM, maximal sequence length is 128, not 64.
- STM, pitch limit was set one octave too low.
- ULT, tempo of 0, resets speed to 6 and tempo to 125.
- ULT, most effects have memory (start ULTRA.EXE in DOSBOX and click on Effects).
- ULT, portamento is a fire and forget effect (i.e. continues in the following lines even if not specified till reaches target, or portamento of 0 is given or new note starts).
- ULT, the more recent versions allow 8 octaves instead of 5.
- ULT, every note was played one semitone too high.
- ULT, what does "Finetune is a linear value added to the sample frequency" mean? From my own tests it is neither a fraction of a semitone, nor a simple addition to the sample frequency. According to MilkyTracker freq = (1 + x / (1<<15)) * basefreq which seems to work.
- ULT, 16-bit samples: size is given as a number of samples, but loop start/end in number of bytes!!!
Version 1.19, 2012-04-06
- Loader, went too far in the removal of control characters in texts beause multi-line comments were shown as a single line!
- Coconizer, pitch is neither Amiga period nor a fraction of semitones (linear mode) but a 1.16 fixed point fraction of output frequency (1/48us).
- Coconizer, translate volume from log to linear at runtime instead of during loading so that volume slides should be correct.
- Coconizer, auto slide effects implemented.
- DskT, pitch in linear mode is in 1/32th of semitone instead of 1/16th like in IT/XM so slides were too fast.
- DskT, translate volume from log to linear at runtime instead of during loading so that volume slides should be correct.
- IT, acceptable channel number in patterns is [0-63], not [0-64]. Corrupted value 64 present in "Locutus of Borg" made the internal consistency checks return it in error.
- MUSX, fix loading of corrupted files so as not to crash during playback.
- MUSX, translate volume from log to linear at runtime instead of during loading so that volume slides should be correct.
- PTM, according to a more recent version of the spare documentation available, PolyTracker uses a special GUS volume table. The table seems to behave like a gamma correction curve which amplifies the low volumes.
Version 1.18, 2012-03-05
- Mix, optimize mixing of notes with volume 0.
- IT, resonant filters are implemented (cutoff, resonance, envelopes, commands SFx and Zxx).
- IT, format 2.15 uses a new sample decompression technique.
- SWIs, extended SWI Configure with code 11 to disable/enable IT filters.
- Mix, note polyphony was reduced when CPU usage is too high even if the cause is external to the player (disc access, ...). To work around this, when the player reaches the current note polyphony with CPU usage < 50%, it now resets the note polyphony to 64.
- Play, set envelope position effect should only be applied at frame 0.
- Play, envelopes turned off in instrument definition were never turned on by corresponding effect.
- Coconizer, fix an incorrect note range checking that invalidated all notes.
- IT, initial global volume is in range [0-128] not [0-64].
- IT, keyoff in sample mode does nothing.
- OctaMED, fix note range. OctaMED Soundstudio central note is C-4.
- OctaMED, always clear unused bits of note numbers (garbage present in some OctaMED 3/5 files).
- STM, fix an attempt to free an unallocated memory, causing TimAbs to crash.
- XM, reaching the end of the volume envelope doesn't trigger a fadeout like for IT.
Version 1.17, 2011-09-27
- Added loaders for the following formats:
- MED V2.1 (.med but with MMD0 header)
- OctaMED (.med, .mmd0, .mmd1, .mmd2)
- OctaMED Soundstudio (.mmd3)
- Graoumf Tracker (.gtk, .gt2)
- Loaders, provide default tempo or speed if 0 is given in track.
- DBM, samples can be shared by multiple instruments.
- DBM, invalid note number 0x1f serves as keyoff.
- DBM, instrument mode was not activate.
- DBM, confusing format doc about loop end, its repeat length.
- DTM, support older version of format with MOD encoded patterns.
- DTM, if sample length is 0, bits per sample can be 0.
- DTM, extract version and comments when present.
Version 1.16, 2011-08-18
- Loaders, Added loader for the following format: Oktalyzer (.okta)
- Loaders, the new fast scan to, if possible, directly select the appropriate loader based on the contents of the first bytes in the file has a bug causing the converter to ignore most loaders. It is only by chance that the bug is not triggered for the player module.
- AMF, version 1.0 of the format can be found either with the long or short version of the sample descriptors.
- DT, unused patterns are not stored in file.
Version 1.15, 2011-08-16
- MOD, check for TXP (The Xperience) and NSMS variants (SoundTracker 31).
- Extended SongPosition SWI to be able to read frame information.
- New SWI SongLoad2 = SongLoad + compatibility flags for MOD files.
- Added loaders for the following formats:
- DIGI Booser (.digi)
- DigiBooster Pro (.dbm)
- Digital Sound Interface Kit (.dsm)
- DSMI Advanced Module Format (.amf)
- ASYLUM Music Format (.amf)
- Digital Tracker (.dtm)
- Add new Code 4 to FXGlobalSettings to allow pre-amplification in fonction of note polyphony (like what is done for songs).
- Loaders, some very small files failed to load with an End of file error due to the way PTM and STM loaders report an error when they fail to load in one go the fixed size blocks (header, channel mapping, etc.), instead of returning that the file can't be in this format.
- Replay, fix jumps to last position from last position.
- Replay, fix jump loop implementation for multiple loops in same row. All counters in the row must be processed and the last active one in the row used for the jump. As a side effect it means that the number of loops from a row is only the least common multiple of the individual loops (repeats + 1): x + x leads only to x loops, 2 + 3 to 6 loops, 2 + 4 to 4 loops, etc.
- Replay, fix jump loop implementation for multiple loops in same column with single loop start. The loop count set by the second loop affects inner loop in a different way if you count from 0 to jump loop effect value instead of the other way around. Note that since the counter is reset to 0 at the end of the first loop, the second counter is always restarted and thus an infinite loop is created.
The above infinite loops are impossible in ST3/IT files, because the loop start is moved to after the loop end pos once a loop is completed.
- Replay, instrument next to a note cut was ignored.
- Replay, ensure that sample swapping is only performed for MOD and IT files (even if this is a non-standard behaviour for MOD files).
- Replay, on most formats Sample set offset and Finetune effects work only in combination with new notes.
- DSym, unknown effects were seen as effect 32 (loop off).
- DSym, fix lzw decoding leaving a value undefined when dictionary is full (causing appereance of a random noise in large samples).
- IT, pitch slides order in volume column is down and up, not up and down like the volume slide effects. Presumably to use notation Ex and Fx like in effects column.
- IT, (Extra) fine pitch slides up/down by 0 (EE0, EF0, FE0, FF0) are not memory (only E00, F00 are) but real slides by 0.
- IT, no note nr + Instrument behave as new note with last note nr if no note was playing.
- IT, if last note was cut in note column there is no last note.
- IT, implemented IT specific version of Tremor and Retrigger effects.
- IT, panning slides behave as if range is [0-64] like in the volume column, not like [0-255] as can be presumed by the Xxx command. I also didn't pay attention that sliding direction is reversed compared to XM, x is left y is right.
- IT, note cut SC0 and note delay SD0 behave as SC1 and SD1.
- IT, global volume slide WFF slides down not up, in opposition to the behaviour of the other volume slides.
- MOD, changes for 15 instrument versions:
- Offset 0x1d7 is tempo, not restart position, meaning that most will now play with a tempo of 120 instead of 128.
- Fxx is always speed, not tempo (i.e. VBLANK mode).
- Sample repeat offset is in bytes, not halfwords (since there was already a check that divide that offset in two when repeat offset + repeat size exceeds the sample size, most cases where already correct).
- MOD, invalid values of C command (volume) are clipped to 64, not ignored (Mc Hammer/mod).
- MUSX, slightly more corruption tolerant loader.
- S3M, volume slides D0F and DF0 are applied on all frames, invalid Dxy values behave as D0y (slide down).
- S3M, implemented S3M specific versions of Retrigger effect.
- S3M, note cut SC0 (no delay) does nothing.
- S3M, many effects are documented as using memory when value 00 is used, but they actually just reuse the last non-0 effect value of any previous effect.
- ULT, split comments in lines of 32 characters.
- XM, should now be able to load old 1.02 and 1.03 format versions.
- XM, values above maximal values are not ignored but clipped to maximal values.
- XM, all slides in the form ?xy slide up (right for panning) by x if x > 0, down by y else (if x and y > 0 it still a slide up).
- XM, none of the volume column effects use a memory.
- XM, XM uses 6 independant memories for the 6 pitch slide effects 1xx, 2xx, E1x, E2x, X1x, X2x.
- XM, volume slides EAx, EBx share a different memory from Axy.
- XM, implementation XM specific versions of Retrigger effect (2 since E9x and R0x behave very differently).
Weirder, Rxy uses independant memory for x and y, meaning that once you uses x > 0 (changes the volume of retrigged note) the only way to stop retrigs from affecting volume is to use x = 8 documented as undefined.
- SWIs, (V)FXChannelParams returned sample nr as a negative value if sample nr > 127.
- FXs, corrected FXNoteSettings code 0, read mode was not not implemented.
Version 1.14, 2010-06-12
- Implement loading of song from memory.
- DigitalSymphony, implement Unset sample loop and Line jump effects
- DigitalSymphony, take into account allowed effects table.
- Replay, fix jumps to last position.
- Replay, S3M cuts notes on high pitch.
- Replay, repeat row plays note once, apply 0-frame effects on each repeat.
Version 1.13, 20 April 2010
- Digital Symphony, fixed loading of songs containing samples of size 0 with title.
- Replay, default behaviour is now to bound high pitch, only IT will continue to cut notes.
- Replay, fixed Digital Symphony not to change the playing sample when a sample without a note is specified.
- Replay, fixed Tremolo and Panbrello.
- Replay, fixed volume slides, up has priority when both up and down, in MOD/DSym/MTM loaders.
- Replay, fixed unnecessary instrument parameter resets on each repreat or a row.
Version 1.12, 19 december 2009
- MOD loader updated to deal correctly with 8 channels StarTrekker files ('FLT8' tag).
Version 1.11, 19 November 2009
- Recompiled for ARMv7 compatibility.
- New Coconizer loader.
Version 1.10, 21 February 2009
- Mix With multiple streams, when end up restoring ourselves as previous handler in 8-bit mode, causing a background crash.
Version 1.09, 12 January 2008
- New Desktop Tracker loader.
- Slightly faster mixing.
- Fix in bug introduced in 1.08 causing sometimes early termination of a note.
Version 1.08, 21 April 2007
- New 669 and MatrixTRK loaders.
- Better volume scaling.
Version 1.07, 15 April 2006
- Merged 26-bit and 32-bit versions.
- Impulse Tracker treats stereo samples as if they were mono.
- Various XM replay fixes.
DigitalCD has been setup to use TimPlayer for the relevant file types, so start DigitalCD and drop your files on it's music files control panel. Should you experience problems then remove every 'tim' entry in the file !DigitalCD.Setup and DigitalCD will use the good old trusted modules.
TimPlayer supports the following formats:
- Archimedes Tracker (File type: CB6).
- Desktop Tracker (File type: CB6).
- Digital Symphonies (File type: 10B).
- MatrixTRK Modules (File type: 00B).
- Protracker and variants: Falcon, FastTracker, StarTrekker, Oktalyzer, TakeTracker (File type: CB5, CC5).
- Composer 669 (File type: 1B1, extension: .669).
- DigiSound (File type: 1B1).
- Farandole Composer (File type: 1B1, extension: .far). Barely supported, the internal working of that player differs too much from the others players.
- FastTracker2 (File type: 1AF, extension: .xm).
- ImpulseTracker (File type: 1AE, extension: .it). Resonant filters are not supported.
- MultiTracker (File type: 1B1, extension: .mtm).
- PolyTracker (File type: 1B1, extension: .ptm).
- ScreamTracker (File type: 1B0, extension: .stm).
- ScreamTracker3 (File type: 1B0, extension: .s3m).
- Ultra Tracker (File type: 1B1, extension: .ult).
- An A5000 is enough for 4 channels MODs, a StrongARM is required for songs with 64 channels.
- Either the original 8-bit sound or a 16-bit card.
The main features are turned toward sound quality rather than speed:
- 32-bit internal precision for mixing, dithered to 8-bit or 16-bit.
- In 8-bit mode, the logarithmic buffers are generated using a linear to logarithmic translation table with 12 significant bits instead of the usual 8-bit table found in most players (quiet sounds are much clearer).
- Linear interpolation is used for resampling.
- Offers an equalizer with up to 10 second order IIR filters.
- Dynamic Gain Control allows to boost the volume level of songs with many channels while ensuring that no clipping occurs.
- Volume ramping: instead of jumping from one note volume to the other, the player will use a volume ramp of a few ms at the start of every frame, which will remove most of the pops and clicks in the sound.
- Supports multiple effects on the same channel.
- Provides timing (in ms) of song position and the song duration.
- Accept Surround effect (not Prologic) which sends the sound to the tiny lateral amplifiers instead of the big ones of your HiFi installation.
- Performs a limitation of the note polyphony when the CPU usage becomes too high, to prevent freezing the computer. When a song requests to play more notes than allowed by the note polyphony, the mixing routines will only play the notes with the highest volume.