diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jssmod.h	Fri Sep 28 01:54:23 2012 +0300
@@ -0,0 +1,307 @@
+/*
+ * miniJSS - Module structure and handling routines
+ * Programmed and designed by Matti 'ccr' Hamalainen
+ * (C) Copyright 2006-2009 Tecnic Software productions (TNSP)
+ */
+#ifndef JSSMOD_H
+#define JSSMOD_H
+
+#include "jss.h"
+#include "dmres.h"
+
+
+// Max data size definitions
+#define jsetMaxRows         (256)   // Max number of rows
+#define jsetMaxPatterns     (256)   // Max patterns
+#define jsetMaxTracks       (jsetMaxPatterns * jsetMaxPatterns) // Max tracks
+#define jsetMaxInstruments  (512)
+#define jsetMaxOrders       (260)
+#define jsetNNotes          (11 * 12)
+#define jsetMinNote         (0)     // Smallest note number
+#define jsetMaxNote         (jsetNNotes - 1)
+#define jsetMaxEnvPoints    (32)    // Max number of envelope points
+
+
+// Instrument envelope flags
+#define jenvfUsed           (0x01)  // Envelope is used
+#define jenvfSustain        (0x02)  // Envelope has a sustain point (XM) or has sustain loop (IT)
+#define jenvfLooped         (0x04)  // Envelope is looped
+
+// Instrument vibrato waveform types
+#define jvibSine            (0)
+#define jvibRamp            (1)
+#define jvibSquare          (2)
+#define jvibRandom          (3)
+
+// General stuff
+#define jsetNoteOff         (-2)
+#define jsetOrderEnd        (-1)
+#define jsetOrderSkip       (-2)
+
+
+// General module flags
+#define jmdfAmigaPeriods    (0x0001)    // Use non-linear periods (Amiga)
+#define jmdfAmigaLimits     (0x0002)    // Use Amiga-styled valuelimits
+#define jmdfStereo          (0x0008)    // Use stereo output, if possible
+
+#define jmdfFT2Replay       (0x0010)    // Use FT2 replaying bugs/features
+#define jmdfST300Slides     (0x0020)    // Use Scream Tracker 3.00 slides
+#define jmdfByteLStart      (0x0040)    // LStart is in BYTES instead of WORDS (MOD only)
+
+
+// Module format types
+enum JMDT
+{
+    jmdtMOD = 1,
+    jmdtS3M,
+    jmdtXM,
+    jmdtIT
+};
+
+
+// Bits for sample conversion routines
+#define jsampDelta          (0x01)
+#define jsampFlipSign       (0x02)
+#define jsampSwapEndianess  (0x04)
+#define jsampSplit          (0x08)
+
+
+// Internal instrument structure
+typedef struct
+{
+    size_t size,            // Length in units
+        loopS,              // Loop start position in units
+        loopE;              // Loop end position in units
+    int volume,             // Volume [jsetMinVol...jsetMaxVol]
+        flags,              // Flags - see jss.h jsfXXXX
+        C4BaseSpeed,        // C4BaseSpeed
+        ERelNote,           // Extended: Relative note value
+        EFineTune,          // Extended: Fine-tune value
+        EPanning;           // Extended: Panning
+#ifndef JSS_LIGHT
+    char *desc;
+#endif
+    void *data;             // Sample data
+
+    BOOL hasData;
+    int convFlags;
+} JSSInstrument;
+
+
+// Envelope point structure
+typedef struct
+{
+    int frame, value;
+} JSSEnvelopePoint;
+
+
+// Envelope structure
+typedef struct
+{
+    int flags,
+        npoints,
+        sustain,
+        loopS,
+        loopE;
+    JSSEnvelopePoint points[jsetMaxEnvPoints];
+} JSSEnvelope;
+
+
+// Extended instrument
+typedef struct
+{
+#ifndef JSS_LIGHT
+    char *desc;
+#endif
+    int nsamples, sNumForNotes[jsetNNotes];
+    JSSEnvelope volumeEnv, panningEnv;
+    int vibratoType,
+        vibratoSweep,
+        vibratoDepth,
+        vibratoRate,
+        fadeOut;
+} JSSExtInstrument;
+
+
+// Internal pattern structures
+typedef struct
+{
+    int note,
+        instrument,
+        volume,
+        effect,
+        param;
+} JSSNote;
+
+
+typedef struct
+{
+    int nrows, nchannels;
+    JSSNote *data;
+} JSSPattern;
+
+
+// Module structure
+typedef struct
+{
+    int     moduleType;     // Type of the module
+    char    *moduleName;    // Title/name
+    char    *trackerName;   // Tracker software name
+    int     defSpeed,       // Initial values
+            defTempo,
+            defFlags,
+            defRestartPos,
+            intVersion,     // Format's internal version
+            nchannels,
+            ninstruments,
+            nextInstruments,
+            npatterns,
+            norders;
+
+    int     defPanning[jsetNChannels];
+    int     orderList[jsetMaxOrders];
+    JSSPattern       *patterns[jsetMaxPatterns + 1];
+    JSSInstrument    *instruments[jsetMaxInstruments];
+    JSSExtInstrument *extInstruments[jsetMaxInstruments];
+
+#ifdef JSS_SUP_THREADS
+    DMMutex *mutex;
+#endif
+
+} JSSModule;
+
+
+#ifdef JSS_SUP_JSSMOD
+
+#define JSSMOD_VERSION    (0x10)
+
+enum
+{
+    PATMODE_RAW_HORIZ = 1,
+    PATMODE_COMP_HORIZ,
+    PATMODE_RAW_VERT,
+    PATMODE_COMP_VERT,
+    PATMODE_RAW_ELEM,
+    PATMODE_LAST    
+};
+
+/* JSSMOD typedefs
+ */
+typedef struct
+{
+    char  idMagic[2];     // "JM"
+    Uint8 idVersion;      // 0x10 for 1.0, etc.
+    Sint16
+        norders,            // Number of orders in orderlist
+        npatterns,          // Number of patterns
+        nchannels,          // Number of channels
+        nextInstruments,    // Number of extended instruments
+        ninstruments,       // Number of sample-instruments
+        defFlags,           // Flags field: see jmdf* flags
+        intVersion,         // Internal version, format dependant
+        defRestartPos,      // Default restart position in orderlist
+        defSpeed,           // Default speed (ticks/row)
+        defTempo,           // Default tempo (BPM)
+        patMode;            // Pattern data format mode
+
+    /*
+    - After this, norders long orders table will follow, of type:
+      Sint16 orderList[norders];
+    
+    - Pattern data, format depends on patMode.
+    
+    - Extended instruments (*)
+    
+    - Sample instrument headers (*)
+    
+    - Sample data (format depends) (*)
+    
+    (*) Items are optional and may have been omitted. Fields in the 
+        module and other headers are used to indicate if these items exist.
+    */
+} JSSMODHeader;
+
+
+typedef struct
+{
+    Uint16 frame, value;
+} JSSMODEnvelopePoint;
+
+
+typedef struct
+{
+    int flags,
+        npoints,
+        sustain,
+        loopS,
+        loopE;
+    JSSMODEnvelopePoint points[jsetMaxEnvPoints];
+} JSSMODEnvelope;
+
+
+typedef struct
+{
+    Sint16 nsamples;
+    Uint8 sNumForNotes[jsetNNotes];
+    JSSMODEnvelope volumeEnv, panningEnv;
+    Sint16 vibratoType,
+            vibratoSweep,
+            vibratoDepth,
+            vibratoRate;
+    int     fadeOut;
+} JSSMODExtInstrument;
+
+
+typedef struct
+{
+    int     size,           // Length in units
+            loopS,          // Loop start position in units
+            loopE;          // Loop end position in units
+    Sint16 volume,         // Volume [jsetMinVol...jsetMaxVol]
+            flags,          // Flags - see jss.h jsfXXXX
+            C4BaseSpeed,    // C4BaseSpeed
+            ERelNote,       // Extended: Relative note value
+            EFineTune,      // Extended: Fine-tune value
+            EPanning;       // Extended: Panning
+    Uint8 convFlags,      // Conversion flags .. jsampXXXX
+            hasData;        // != 0 if there is sample data
+} JSSMODInstrument;
+
+
+#define COMP_NOTE           (0x01)
+#define COMP_INSTRUMENT     (0x02)
+#define COMP_VOLUME         (0x04)
+#define COMP_EFFECT         (0x08)
+#define COMP_PARAM          (0x10)
+#define COMP_ALL (COMP_NOTE | COMP_INSTRUMENT | COMP_VOLUME | COMP_EFFECT | COMP_PARAM)
+
+
+typedef struct
+{
+    size_t nrows, size;
+} JSSMODPattern;
+
+#endif
+
+#ifndef JSS_LIGHT
+char*               jssASCIItoStr(char *, const char, const size_t);
+BOOL                jssEncodeSample8(Uint8 *, const size_t, const int);
+BOOL                jssEncodeSample16(Uint16 *, const size_t, const int);
+#endif
+BOOL                jssDecodeSample8(Uint8 *, const size_t, const int);
+BOOL                jssDecodeSample16(Uint16 *, const size_t, const int);
+JSSModule *         jssAllocateModule(void);
+int                 jssFreeModule(JSSModule *);
+JSSPattern *        jssAllocatePattern(int, int);
+JSSInstrument *     jssAllocateInstrument(void);
+JSSExtInstrument *  jssAllocateExtInstrument(void);
+
+#ifdef JSS_SUP_XM
+int        jssLoadXM(DMResource *, JSSModule **);
+#endif
+
+#ifdef JSS_SUP_JSSMOD
+int        jssLoadJSSMOD(Uint8 *, const size_t, JSSModule **);
+#endif
+
+#endif // JSSMOD_H