#ifndef _NMODULE_H__
#define _NMODULE_H__  1

# ifndef _NDEFINES_H__
#  error "include <naudio\ndefines.h> first"
# endif

#define S_N_MODNAME  32
#define S_N_PATNAME  32
#define N_MAX_INSTS  255
#define N_MAX_SEQS   128
#define N_MAX_PATS   N_MAX_SEQS
#define N_MAX_VOICES 8        /* 32 in V2.0 ? */

#define N_PERIODS    36
#define P_LOWEST     108      /* lowest aMIGa (PT)  period /Ftune! */
#define P_HIGHEST    907      /* highest aMIGa (PT) period /Ftune! */


struct n_voice_1_
{
   signed   note  : 8;
   unsigned index : 8;
   unsigned cmd   : 8;
   unsigned p1    : 4;     /* sadly Pure-C's bitfields are broken */
   unsigned p2    : 4;     /* they are 16 bit minimum */
};

struct n_voice_2_
{
   sbyte    note;
   byte     index;
   byte     cmd;
   byte     para;
};


struct n_voice_3_
{
   word     info;
   word     cmd;
};

typedef union
{
   struct n_voice_1_ b;
   struct n_voice_2_ n;
   struct n_voice_3_ w;
} n_voice;


typedef struct
{
   char     name[ S_N_PATNAME];
   word     n_voices,               /* # voices in this pattern */
            n_entries;
   n_voice  data[ 1];               /* bogus value */
} n_pattern;


typedef struct
{
   char        name[ S_N_MODNAME];
   byte        no_samples,
               no_pats,
               no_seqs,
               repeat;
   char        sequence[ N_MAX_SEQS];
   n_sample    *samples[ N_MAX_INSTS + 1];    /* #0 unused */
   n_pattern   *patterns[ N_MAX_SEQS];
} n_module;


#define ARPEGGIO     0
#define PORTA_UP     1
#define PORTA_DOWN   2
#define TONE_PORTA   3
#define VIBRATO      4
#define TONE_VOLSL   5
#define VIB_VOLSL    6
#define TREMOLO      7
#define OFFSET       9
#define VOLSLIDE     10
#define POS_JUMP     11
#define VOLUME       12
#define PAT_BREAK    13
#define EXTENDED     14
#define SPEED        15

#define FILTER       0
#define FSLIDE_UP    1
#define FSLIDE_DOWN  2
#define GLISSANDO    3
#define VIB_WAVE     4
#define FINETUNE     5
#define PAT_LOOP     6
#define TREM_WAVE    7
#define RETRIGGER    9
#define FVOLSL_UP    10
#define FVOLSL_DOWN  11
#define CUT_NOTE     12
#define NOTE_DELAY   13
#define PAT_DELAY    14
#define FUNK         15

#define WAVE_SINE    0
#define WAVE_RAMP    1
#define WAVE_SQUARE  2

#define nmodule_voice_on( x)  (ntrack.c_voices |  (1 << (x) - 1))
#define nmodule_voice_off( x) (ntrack.c_voices & ~(1 << (x) - 1))

n_module    *nmodule_create   _C_PROTO(( char *name));
void        nmodule_free      _C_PROTO(( n_module *song));
n_module    *nmodule_load     _C_PROTO(( char *fname));
n_module    *_nmodule_load    _C_PROTO(( char *fname, int force, int optimize));
int         nmodule_save      _C_PROTO(( char *fname, n_module *p, int mode));
n_pattern   *npattern_create  _C_PROTO(( char *name, word entries, word voices));
void        npattern_free     _C_PROTO(( n_pattern *p));

#endif
