123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- /*
- * 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
|