comparison jssmod.h @ 0:32250b436bca

Initial re-import.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 28 Sep 2012 01:54:23 +0300
parents
children 064d1d1d5b0f
comparison
equal deleted inserted replaced
-1:000000000000 0:32250b436bca
1 /*
2 * miniJSS - Module structure and handling routines
3 * Programmed and designed by Matti 'ccr' Hamalainen
4 * (C) Copyright 2006-2009 Tecnic Software productions (TNSP)
5 */
6 #ifndef JSSMOD_H
7 #define JSSMOD_H
8
9 #include "jss.h"
10 #include "dmres.h"
11
12
13 // Max data size definitions
14 #define jsetMaxRows (256) // Max number of rows
15 #define jsetMaxPatterns (256) // Max patterns
16 #define jsetMaxTracks (jsetMaxPatterns * jsetMaxPatterns) // Max tracks
17 #define jsetMaxInstruments (512)
18 #define jsetMaxOrders (260)
19 #define jsetNNotes (11 * 12)
20 #define jsetMinNote (0) // Smallest note number
21 #define jsetMaxNote (jsetNNotes - 1)
22 #define jsetMaxEnvPoints (32) // Max number of envelope points
23
24
25 // Instrument envelope flags
26 #define jenvfUsed (0x01) // Envelope is used
27 #define jenvfSustain (0x02) // Envelope has a sustain point (XM) or has sustain loop (IT)
28 #define jenvfLooped (0x04) // Envelope is looped
29
30 // Instrument vibrato waveform types
31 #define jvibSine (0)
32 #define jvibRamp (1)
33 #define jvibSquare (2)
34 #define jvibRandom (3)
35
36 // General stuff
37 #define jsetNoteOff (-2)
38 #define jsetOrderEnd (-1)
39 #define jsetOrderSkip (-2)
40
41
42 // General module flags
43 #define jmdfAmigaPeriods (0x0001) // Use non-linear periods (Amiga)
44 #define jmdfAmigaLimits (0x0002) // Use Amiga-styled valuelimits
45 #define jmdfStereo (0x0008) // Use stereo output, if possible
46
47 #define jmdfFT2Replay (0x0010) // Use FT2 replaying bugs/features
48 #define jmdfST300Slides (0x0020) // Use Scream Tracker 3.00 slides
49 #define jmdfByteLStart (0x0040) // LStart is in BYTES instead of WORDS (MOD only)
50
51
52 // Module format types
53 enum JMDT
54 {
55 jmdtMOD = 1,
56 jmdtS3M,
57 jmdtXM,
58 jmdtIT
59 };
60
61
62 // Bits for sample conversion routines
63 #define jsampDelta (0x01)
64 #define jsampFlipSign (0x02)
65 #define jsampSwapEndianess (0x04)
66 #define jsampSplit (0x08)
67
68
69 // Internal instrument structure
70 typedef struct
71 {
72 size_t size, // Length in units
73 loopS, // Loop start position in units
74 loopE; // Loop end position in units
75 int volume, // Volume [jsetMinVol...jsetMaxVol]
76 flags, // Flags - see jss.h jsfXXXX
77 C4BaseSpeed, // C4BaseSpeed
78 ERelNote, // Extended: Relative note value
79 EFineTune, // Extended: Fine-tune value
80 EPanning; // Extended: Panning
81 #ifndef JSS_LIGHT
82 char *desc;
83 #endif
84 void *data; // Sample data
85
86 BOOL hasData;
87 int convFlags;
88 } JSSInstrument;
89
90
91 // Envelope point structure
92 typedef struct
93 {
94 int frame, value;
95 } JSSEnvelopePoint;
96
97
98 // Envelope structure
99 typedef struct
100 {
101 int flags,
102 npoints,
103 sustain,
104 loopS,
105 loopE;
106 JSSEnvelopePoint points[jsetMaxEnvPoints];
107 } JSSEnvelope;
108
109
110 // Extended instrument
111 typedef struct
112 {
113 #ifndef JSS_LIGHT
114 char *desc;
115 #endif
116 int nsamples, sNumForNotes[jsetNNotes];
117 JSSEnvelope volumeEnv, panningEnv;
118 int vibratoType,
119 vibratoSweep,
120 vibratoDepth,
121 vibratoRate,
122 fadeOut;
123 } JSSExtInstrument;
124
125
126 // Internal pattern structures
127 typedef struct
128 {
129 int note,
130 instrument,
131 volume,
132 effect,
133 param;
134 } JSSNote;
135
136
137 typedef struct
138 {
139 int nrows, nchannels;
140 JSSNote *data;
141 } JSSPattern;
142
143
144 // Module structure
145 typedef struct
146 {
147 int moduleType; // Type of the module
148 char *moduleName; // Title/name
149 char *trackerName; // Tracker software name
150 int defSpeed, // Initial values
151 defTempo,
152 defFlags,
153 defRestartPos,
154 intVersion, // Format's internal version
155 nchannels,
156 ninstruments,
157 nextInstruments,
158 npatterns,
159 norders;
160
161 int defPanning[jsetNChannels];
162 int orderList[jsetMaxOrders];
163 JSSPattern *patterns[jsetMaxPatterns + 1];
164 JSSInstrument *instruments[jsetMaxInstruments];
165 JSSExtInstrument *extInstruments[jsetMaxInstruments];
166
167 #ifdef JSS_SUP_THREADS
168 DMMutex *mutex;
169 #endif
170
171 } JSSModule;
172
173
174 #ifdef JSS_SUP_JSSMOD
175
176 #define JSSMOD_VERSION (0x10)
177
178 enum
179 {
180 PATMODE_RAW_HORIZ = 1,
181 PATMODE_COMP_HORIZ,
182 PATMODE_RAW_VERT,
183 PATMODE_COMP_VERT,
184 PATMODE_RAW_ELEM,
185 PATMODE_LAST
186 };
187
188 /* JSSMOD typedefs
189 */
190 typedef struct
191 {
192 char idMagic[2]; // "JM"
193 Uint8 idVersion; // 0x10 for 1.0, etc.
194 Sint16
195 norders, // Number of orders in orderlist
196 npatterns, // Number of patterns
197 nchannels, // Number of channels
198 nextInstruments, // Number of extended instruments
199 ninstruments, // Number of sample-instruments
200 defFlags, // Flags field: see jmdf* flags
201 intVersion, // Internal version, format dependant
202 defRestartPos, // Default restart position in orderlist
203 defSpeed, // Default speed (ticks/row)
204 defTempo, // Default tempo (BPM)
205 patMode; // Pattern data format mode
206
207 /*
208 - After this, norders long orders table will follow, of type:
209 Sint16 orderList[norders];
210
211 - Pattern data, format depends on patMode.
212
213 - Extended instruments (*)
214
215 - Sample instrument headers (*)
216
217 - Sample data (format depends) (*)
218
219 (*) Items are optional and may have been omitted. Fields in the
220 module and other headers are used to indicate if these items exist.
221 */
222 } JSSMODHeader;
223
224
225 typedef struct
226 {
227 Uint16 frame, value;
228 } JSSMODEnvelopePoint;
229
230
231 typedef struct
232 {
233 int flags,
234 npoints,
235 sustain,
236 loopS,
237 loopE;
238 JSSMODEnvelopePoint points[jsetMaxEnvPoints];
239 } JSSMODEnvelope;
240
241
242 typedef struct
243 {
244 Sint16 nsamples;
245 Uint8 sNumForNotes[jsetNNotes];
246 JSSMODEnvelope volumeEnv, panningEnv;
247 Sint16 vibratoType,
248 vibratoSweep,
249 vibratoDepth,
250 vibratoRate;
251 int fadeOut;
252 } JSSMODExtInstrument;
253
254
255 typedef struct
256 {
257 int size, // Length in units
258 loopS, // Loop start position in units
259 loopE; // Loop end position in units
260 Sint16 volume, // Volume [jsetMinVol...jsetMaxVol]
261 flags, // Flags - see jss.h jsfXXXX
262 C4BaseSpeed, // C4BaseSpeed
263 ERelNote, // Extended: Relative note value
264 EFineTune, // Extended: Fine-tune value
265 EPanning; // Extended: Panning
266 Uint8 convFlags, // Conversion flags .. jsampXXXX
267 hasData; // != 0 if there is sample data
268 } JSSMODInstrument;
269
270
271 #define COMP_NOTE (0x01)
272 #define COMP_INSTRUMENT (0x02)
273 #define COMP_VOLUME (0x04)
274 #define COMP_EFFECT (0x08)
275 #define COMP_PARAM (0x10)
276 #define COMP_ALL (COMP_NOTE | COMP_INSTRUMENT | COMP_VOLUME | COMP_EFFECT | COMP_PARAM)
277
278
279 typedef struct
280 {
281 size_t nrows, size;
282 } JSSMODPattern;
283
284 #endif
285
286 #ifndef JSS_LIGHT
287 char* jssASCIItoStr(char *, const char, const size_t);
288 BOOL jssEncodeSample8(Uint8 *, const size_t, const int);
289 BOOL jssEncodeSample16(Uint16 *, const size_t, const int);
290 #endif
291 BOOL jssDecodeSample8(Uint8 *, const size_t, const int);
292 BOOL jssDecodeSample16(Uint16 *, const size_t, const int);
293 JSSModule * jssAllocateModule(void);
294 int jssFreeModule(JSSModule *);
295 JSSPattern * jssAllocatePattern(int, int);
296 JSSInstrument * jssAllocateInstrument(void);
297 JSSExtInstrument * jssAllocateExtInstrument(void);
298
299 #ifdef JSS_SUP_XM
300 int jssLoadXM(DMResource *, JSSModule **);
301 #endif
302
303 #ifdef JSS_SUP_JSSMOD
304 int jssLoadJSSMOD(Uint8 *, const size_t, JSSModule **);
305 #endif
306
307 #endif // JSSMOD_H