diff options
Diffstat (limited to 'Src/external_dependencies/openmpt-trunk/soundlib/S3MTools.h')
-rw-r--r-- | Src/external_dependencies/openmpt-trunk/soundlib/S3MTools.h | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/Src/external_dependencies/openmpt-trunk/soundlib/S3MTools.h b/Src/external_dependencies/openmpt-trunk/soundlib/S3MTools.h new file mode 100644 index 00000000..9517dfbe --- /dev/null +++ b/Src/external_dependencies/openmpt-trunk/soundlib/S3MTools.h @@ -0,0 +1,169 @@ +/* + * S3MTools.h + * ---------- + * Purpose: Definition of S3M file structures and helper functions + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#pragma once + +#include "openmpt/all/BuildSettings.hpp" + +#include "../soundlib/ModSample.h" +#include "../soundlib/SampleIO.h" + + +OPENMPT_NAMESPACE_BEGIN + +// S3M File Header +struct S3MFileHeader +{ + // Magic Bytes + enum S3MMagic + { + idEOF = 0x1A, + idS3MType = 0x10, + idPanning = 0xFC, + }; + + // Tracker Versions in the cwtv field + enum S3MTrackerVersions + { + trackerMask = 0xF000, + versionMask = 0x0FFF, + + trkScreamTracker = 0x1000, + trkImagoOrpheus = 0x2000, + trkImpulseTracker = 0x3000, + trkSchismTracker = 0x4000, + trkOpenMPT = 0x5000, + trkBeRoTracker = 0x6000, + trkCreamTracker = 0x7000, + + trkAkord = 0x0208, + trkST3_00 = 0x1300, + trkST3_20 = 0x1320, + trkST3_01 = 0x1301, + trkIT2_07 = 0x3207, + trkIT2_14 = 0x3214, + trkBeRoTrackerOld = 0x4100, // Used from 2004 to 2012 + trkCamoto = 0xCA00, + }; + + // Flags + enum S3MHeaderFlags + { + st2Vibrato = 0x01, // Vibrato is twice as deep. Cannot be enabled from UI. + zeroVolOptim = 0x08, // Volume 0 optimisations + amigaLimits = 0x10, // Enforce Amiga limits + fastVolumeSlides = 0x40, // Fast volume slides (like in ST3.00) + }; + + // S3M Format Versions + enum S3MFormatVersion + { + oldVersion = 0x01, // Old Version, signed samples + newVersion = 0x02, // New Version, unsigned samples + }; + + char name[28]; // Song Title + uint8le dosEof; // Supposed to be 0x1A, but even ST3 seems to ignore this sometimes (see STRSHINE.S3M by Purple Motion) + uint8le fileType; // File Type, 0x10 = ST3 module + char reserved1[2]; // Reserved + uint16le ordNum; // Number of order items + uint16le smpNum; // Number of sample parapointers + uint16le patNum; // Number of pattern parapointers + uint16le flags; // Flags, see S3MHeaderFlags + uint16le cwtv; // "Made With" Tracker ID, see S3MTrackerVersions + uint16le formatVersion; // Format Version, see S3MFormatVersion + char magic[4]; // "SCRM" magic bytes + uint8le globalVol; // Default Global Volume (0...64) + uint8le speed; // Default Speed (1...254) + uint8le tempo; // Default Tempo (33...255) + uint8le masterVolume; // Sample Volume (0...127, stereo if high bit is set) + uint8le ultraClicks; // Number of channels used for ultra click removal + uint8le usePanningTable; // 0xFC => read extended panning table + uint16le reserved2; // Schism Tracker and OpenMPT use this for their extended version information + uint32le reserved3; // Impulse Tracker hides its edit timer here + uint16le reserved4; + uint16le special; // Pointer to special custom data (unused) + uint8le channels[32]; // Channel setup +}; + +MPT_BINARY_STRUCT(S3MFileHeader, 96) + + +// S3M Sample Header +struct S3MSampleHeader +{ + enum SampleType + { + typeNone = 0, + typePCM = 1, + typeAdMel = 2, + }; + + enum SampleFlags + { + smpLoop = 0x01, + smpStereo = 0x02, + smp16Bit = 0x04, + }; + + enum SamplePacking + { + pUnpacked = 0x00, // PCM + pDP30ADPCM = 0x01, // Unused packing type + pADPCM = 0x04, // MODPlugin ADPCM :( + }; + + uint8le sampleType; // Sample type, see SampleType + char filename[12]; // Sample filename + uint8le dataPointer[3]; // Pointer to sample data (divided by 16) + uint32le length; // Sample length, in samples + uint32le loopStart; // Loop start, in samples + uint32le loopEnd; // Loop end, in samples + uint8le defaultVolume; // Default volume (0...64) + char reserved1; // Reserved + uint8le pack; // Packing algorithm, SamplePacking + uint8le flags; // Sample flags + uint32le c5speed; // Middle-C frequency + char reserved2[4]; // Reserved + uint16le gusAddress; // Sample address in GUS memory (used for fingerprinting) + uint16le sb512; // SoundBlaster loop expansion stuff + uint32le lastUsedPos; // More SoundBlaster stuff + char name[28]; // Sample name + char magic[4]; // "SCRS" magic bytes ("SCRI" for Adlib instruments) + + // Convert an S3M sample header to OpenMPT's internal sample header. + void ConvertToMPT(ModSample &mptSmp, bool isST3 = false) const; + // Convert OpenMPT's internal sample header to an S3M sample header. + SmpLength ConvertToS3M(const ModSample &mptSmp); + // Retrieve the internal sample format flags for this sample. + SampleIO GetSampleFormat(bool signedSamples) const; + // Calculate the sample position in file + uint32 GetSampleOffset() const; +}; + +MPT_BINARY_STRUCT(S3MSampleHeader, 80) + + +// Pattern decoding flags +enum S3MPattern +{ + s3mEndOfRow = 0x00, + s3mChannelMask = 0x1F, + s3mNotePresent = 0x20, + s3mVolumePresent = 0x40, + s3mEffectPresent = 0x80, + s3mAnyPresent = 0xE0, + + s3mNoteOff = 0xFE, + s3mNoteNone = 0xFF, +}; + + +OPENMPT_NAMESPACE_END |