File: S3MTools.h

package info (click to toggle)
libopenmpt 0.4.3-1%2Bdeb10u1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 7,724 kB
  • sloc: cpp: 99,820; sh: 4,503; ansic: 3,449; makefile: 480
file content (143 lines) | stat: -rw-r--r-- 4,097 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 * 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 "BuildSettings.h"

#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,

		trkST3_20			= 0x1320,
		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
	char     reserved2[8];		// More reserved bytes
	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[12];		// Reserved + Internal ST3 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) 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;
};

MPT_BINARY_STRUCT(S3MSampleHeader, 80)


OPENMPT_NAMESPACE_END