diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/external_dependencies/openmpt-trunk/soundlib/XMTools.h | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/external_dependencies/openmpt-trunk/soundlib/XMTools.h')
-rw-r--r-- | Src/external_dependencies/openmpt-trunk/soundlib/XMTools.h | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/Src/external_dependencies/openmpt-trunk/soundlib/XMTools.h b/Src/external_dependencies/openmpt-trunk/soundlib/XMTools.h new file mode 100644 index 00000000..5369c7a7 --- /dev/null +++ b/Src/external_dependencies/openmpt-trunk/soundlib/XMTools.h @@ -0,0 +1,191 @@ +/* + * XMTools.h + * --------- + * Purpose: Definition of XM 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" + + +OPENMPT_NAMESPACE_BEGIN + + +// XM File Header +struct XMFileHeader +{ + enum XMHeaderFlags + { + linearSlides = 0x01, + extendedFilterRange = 0x1000, + }; + + char signature[17]; // "Extended Module: " + char songName[20]; // Song Name, not null-terminated (any nulls are treated as spaces) + uint8le eof; // DOS EOF Character (0x1A) + char trackerName[20]; // Software that was used to create the XM file + uint16le version; // File version (1.02 - 1.04 are supported) + uint32le size; // Header Size + uint16le orders; // Number of Orders + uint16le restartPos; // Restart Position + uint16le channels; // Number of Channels + uint16le patterns; // Number of Patterns + uint16le instruments; // Number of Unstruments + uint16le flags; // Song Flags + uint16le speed; // Default Speed + uint16le tempo; // Default Tempo +}; + +MPT_BINARY_STRUCT(XMFileHeader, 80) + + +// XM Instrument Data +struct XMInstrument +{ + // Envelope Flags + enum XMEnvelopeFlags + { + envEnabled = 0x01, + envSustain = 0x02, + envLoop = 0x04, + }; + + uint8le sampleMap[96]; // Note -> Sample assignment + uint16le volEnv[24]; // Volume envelope nodes / values (0...64) + uint16le panEnv[24]; // Panning envelope nodes / values (0...63) + uint8le volPoints; // Volume envelope length + uint8le panPoints; // Panning envelope length + uint8le volSustain; // Volume envelope sustain point + uint8le volLoopStart; // Volume envelope loop start point + uint8le volLoopEnd; // Volume envelope loop end point + uint8le panSustain; // Panning envelope sustain point + uint8le panLoopStart; // Panning envelope loop start point + uint8le panLoopEnd; // Panning envelope loop end point + uint8le volFlags; // Volume envelope flags + uint8le panFlags; // Panning envelope flags + uint8le vibType; // Sample Auto-Vibrato Type + uint8le vibSweep; // Sample Auto-Vibrato Sweep + uint8le vibDepth; // Sample Auto-Vibrato Depth + uint8le vibRate; // Sample Auto-Vibrato Rate + uint16le volFade; // Volume Fade-Out + uint8le midiEnabled; // MIDI Out Enabled (0 / 1) + uint8le midiChannel; // MIDI Channel (0...15) + uint16le midiProgram; // MIDI Program (0...127) + uint16le pitchWheelRange; // MIDI Pitch Wheel Range (0...36 halftones) + uint8le muteComputer; // Mute instrument if MIDI is enabled (0 / 1) + uint8le reserved[15]; // Reserved + + enum EnvType + { + EnvTypeVol, + EnvTypePan, + }; + // Convert OpenMPT's internal envelope representation to XM envelope data. + void ConvertEnvelopeToXM(const InstrumentEnvelope &mptEnv, uint8le &numPoints, uint8le &flags, uint8le &sustain, uint8le &loopStart, uint8le &loopEnd, EnvType env); + // Convert XM envelope data to an OpenMPT's internal envelope representation. + void ConvertEnvelopeToMPT(InstrumentEnvelope &mptEnv, uint8 numPoints, uint8 flags, uint8 sustain, uint8 loopStart, uint8 loopEnd, EnvType env) const; + + // Convert OpenMPT's internal sample representation to an XMInstrument. + uint16 ConvertToXM(const ModInstrument &mptIns, bool compatibilityExport); + // Convert an XMInstrument to OpenMPT's internal instrument representation. + void ConvertToMPT(ModInstrument &mptIns) const; + // Apply auto-vibrato settings from sample to file. + void ApplyAutoVibratoToXM(const ModSample &mptSmp, MODTYPE fromType); + // Apply auto-vibrato settings from file to a sample. + void ApplyAutoVibratoToMPT(ModSample &mptSmp) const; + + // Get a list of samples that should be written to the file. + std::vector<SAMPLEINDEX> GetSampleList(const ModInstrument &mptIns, bool compatibilityExport) const; +}; + +MPT_BINARY_STRUCT(XMInstrument, 230) + + +// XM Instrument Header +struct XMInstrumentHeader +{ + uint32le size; // Size of XMInstrumentHeader + XMInstrument + char name[22]; // Instrument Name, not null-terminated (any nulls are treated as spaces) + uint8le type; // Instrument Type (Apparently FT2 writes some crap here, but it's the same crap for all instruments of the same module!) + uint16le numSamples; // Number of Samples associated with instrument + uint32le sampleHeaderSize; // Size of XMSample + XMInstrument instrument; + + // Write stuff to the header that's always necessary (also for empty instruments) + void Finalise(); + + // Convert OpenMPT's internal sample representation to an XMInstrument. + void ConvertToXM(const ModInstrument &mptIns, bool compatibilityExport); + // Convert an XMInstrument to OpenMPT's internal instrument representation. + void ConvertToMPT(ModInstrument &mptIns) const; +}; + +MPT_BINARY_STRUCT(XMInstrumentHeader, 263) + + +// XI Instrument Header +struct XIInstrumentHeader +{ + enum + { + fileVersion = 0x102, + }; + + char signature[21]; // "Extended Instrument: " + char name[22]; // Instrument Name, not null-terminated (any nulls are treated as spaces) + uint8le eof; // DOS EOF Character (0x1A) + char trackerName[20]; // Software that was used to create the XI file + uint16le version; // File Version (1.02) + XMInstrument instrument; + uint16le numSamples; // Number of embedded sample headers + samples + + // Convert OpenMPT's internal sample representation to an XIInstrumentHeader. + void ConvertToXM(const ModInstrument &mptIns, bool compatibilityExport); + // Convert an XIInstrumentHeader to OpenMPT's internal instrument representation. + void ConvertToMPT(ModInstrument &mptIns) const; +}; + +MPT_BINARY_STRUCT(XIInstrumentHeader, 298) + + +// XM Sample Header +struct XMSample +{ + enum XMSampleFlags + { + sampleLoop = 0x01, + sampleBidiLoop = 0x02, + sample16Bit = 0x10, + sampleStereo = 0x20, + + sampleADPCM = 0xAD, // MODPlugin :( + }; + + uint32le length; // Sample Length (in bytes) + uint32le loopStart; // Loop Start (in bytes) + uint32le loopLength; // Loop Length (in bytes) + uint8le vol; // Default Volume + int8le finetune; // Sample Finetune + uint8le flags; // Sample Flags + uint8le pan; // Sample Panning + int8le relnote; // Sample Transpose + uint8le reserved; // Reserved (abused for ModPlug's ADPCM compression) + char name[22]; // Sample Name, not null-terminated (any nulls are treated as spaces) + + // Convert OpenMPT's internal sample representation to an XMSample. + void ConvertToXM(const ModSample &mptSmp, MODTYPE fromType, bool compatibilityExport); + // Convert an XMSample to OpenMPT's internal sample representation. + void ConvertToMPT(ModSample &mptSmp) const; + // Retrieve the internal sample format flags for this instrument. + SampleIO GetSampleFormat() const; +}; + +MPT_BINARY_STRUCT(XMSample, 40) + + +OPENMPT_NAMESPACE_END |