192 lines
6.6 KiB
C
192 lines
6.6 KiB
C
|
/*
|
||
|
* 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
|