aboutsummaryrefslogtreecommitdiff
path: root/Src/external_dependencies/openmpt-trunk/soundlib/XMTools.h
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/external_dependencies/openmpt-trunk/soundlib/XMTools.h
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-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.h191
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