2002-02-28 21:10:42 +00:00
|
|
|
/*
|
|
|
|
* This source code is public domain.
|
|
|
|
*
|
|
|
|
* Authors: Olivier Lapicque <olivierl@jps.net>,
|
|
|
|
* Adam Goode <adam@evdebs.org> (endian and char fixes for PPC)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __SNDFILE_H
|
|
|
|
#define __SNDFILE_H
|
|
|
|
|
|
|
|
#ifndef LPCBYTE
|
2004-03-14 22:34:33 +00:00
|
|
|
typedef const BYTE *LPCBYTE;
|
2002-02-28 21:10:42 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#define MOD_AMIGAC2 0x1AB
|
|
|
|
#define MAX_SAMPLE_LENGTH 16000000
|
|
|
|
#define MAX_SAMPLE_RATE 50000
|
|
|
|
#define MAX_ORDERS 256
|
|
|
|
#define MAX_PATTERNS 240
|
|
|
|
#define MAX_SAMPLES 240
|
|
|
|
#define MAX_INSTRUMENTS MAX_SAMPLES
|
|
|
|
#ifdef FASTSOUNDLIB
|
|
|
|
#define MAX_CHANNELS 80
|
|
|
|
#else
|
|
|
|
#define MAX_CHANNELS 128
|
|
|
|
#endif
|
|
|
|
#define MAX_BASECHANNELS 64
|
|
|
|
#define MAX_ENVPOINTS 32
|
|
|
|
#define MIN_PERIOD 0x0020
|
|
|
|
#define MAX_PERIOD 0xFFFF
|
|
|
|
#define MAX_PATTERNNAME 32
|
|
|
|
#define MAX_CHANNELNAME 20
|
|
|
|
#define MAX_INFONAME 80
|
|
|
|
#define MAX_EQ_BANDS 6
|
|
|
|
#define MAX_MIXPLUGINS 8
|
|
|
|
|
|
|
|
|
|
|
|
#define MOD_TYPE_NONE 0x00
|
|
|
|
#define MOD_TYPE_MOD 0x01
|
|
|
|
#define MOD_TYPE_S3M 0x02
|
|
|
|
#define MOD_TYPE_XM 0x04
|
|
|
|
#define MOD_TYPE_MED 0x08
|
|
|
|
#define MOD_TYPE_MTM 0x10
|
|
|
|
#define MOD_TYPE_IT 0x20
|
|
|
|
#define MOD_TYPE_669 0x40
|
|
|
|
#define MOD_TYPE_ULT 0x80
|
|
|
|
#define MOD_TYPE_STM 0x100
|
|
|
|
#define MOD_TYPE_FAR 0x200
|
|
|
|
#define MOD_TYPE_WAV 0x400
|
|
|
|
#define MOD_TYPE_AMF 0x800
|
|
|
|
#define MOD_TYPE_AMS 0x1000
|
|
|
|
#define MOD_TYPE_DSM 0x2000
|
|
|
|
#define MOD_TYPE_MDL 0x4000
|
|
|
|
#define MOD_TYPE_OKT 0x8000
|
|
|
|
#define MOD_TYPE_MID 0x10000
|
|
|
|
#define MOD_TYPE_DMF 0x20000
|
|
|
|
#define MOD_TYPE_PTM 0x40000
|
|
|
|
#define MOD_TYPE_DBM 0x80000
|
|
|
|
#define MOD_TYPE_MT2 0x100000
|
|
|
|
#define MOD_TYPE_AMF0 0x200000
|
|
|
|
#define MOD_TYPE_PSM 0x400000
|
|
|
|
#define MOD_TYPE_J2B 0x800000
|
2004-03-14 22:34:33 +00:00
|
|
|
#define MOD_TYPE_UMX 0x80000000 /* Fake type */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define MAX_MODTYPE 23
|
|
|
|
|
|
|
|
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Channel flags: */
|
|
|
|
/* Bits 0-7: Sample Flags */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define CHN_16BIT 0x01
|
|
|
|
#define CHN_LOOP 0x02
|
|
|
|
#define CHN_PINGPONGLOOP 0x04
|
|
|
|
#define CHN_SUSTAINLOOP 0x08
|
|
|
|
#define CHN_PINGPONGSUSTAIN 0x10
|
|
|
|
#define CHN_PANNING 0x20
|
|
|
|
#define CHN_STEREO 0x40
|
|
|
|
#define CHN_PINGPONGFLAG 0x80
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Bits 8-31: Channel Flags */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define CHN_MUTE 0x100
|
|
|
|
#define CHN_KEYOFF 0x200
|
|
|
|
#define CHN_NOTEFADE 0x400
|
|
|
|
#define CHN_SURROUND 0x800
|
|
|
|
#define CHN_NOIDO 0x1000
|
|
|
|
#define CHN_HQSRC 0x2000
|
|
|
|
#define CHN_FILTER 0x4000
|
|
|
|
#define CHN_VOLUMERAMP 0x8000
|
|
|
|
#define CHN_VIBRATO 0x10000
|
|
|
|
#define CHN_TREMOLO 0x20000
|
|
|
|
#define CHN_PANBRELLO 0x40000
|
|
|
|
#define CHN_PORTAMENTO 0x80000
|
|
|
|
#define CHN_GLISSANDO 0x100000
|
|
|
|
#define CHN_VOLENV 0x200000
|
|
|
|
#define CHN_PANENV 0x400000
|
|
|
|
#define CHN_PITCHENV 0x800000
|
|
|
|
#define CHN_FASTVOLRAMP 0x1000000
|
|
|
|
#define CHN_EXTRALOUD 0x2000000
|
|
|
|
#define CHN_REVERB 0x4000000
|
|
|
|
#define CHN_NOREVERB 0x8000000
|
|
|
|
|
|
|
|
|
|
|
|
#define ENV_VOLUME 0x0001
|
|
|
|
#define ENV_VOLSUSTAIN 0x0002
|
|
|
|
#define ENV_VOLLOOP 0x0004
|
|
|
|
#define ENV_PANNING 0x0008
|
|
|
|
#define ENV_PANSUSTAIN 0x0010
|
|
|
|
#define ENV_PANLOOP 0x0020
|
|
|
|
#define ENV_PITCH 0x0040
|
|
|
|
#define ENV_PITCHSUSTAIN 0x0080
|
|
|
|
#define ENV_PITCHLOOP 0x0100
|
|
|
|
#define ENV_SETPANNING 0x0200
|
|
|
|
#define ENV_FILTER 0x0400
|
|
|
|
#define ENV_VOLCARRY 0x0800
|
|
|
|
#define ENV_PANCARRY 0x1000
|
|
|
|
#define ENV_PITCHCARRY 0x2000
|
|
|
|
|
|
|
|
#define CMD_NONE 0
|
|
|
|
#define CMD_ARPEGGIO 1
|
|
|
|
#define CMD_PORTAMENTOUP 2
|
|
|
|
#define CMD_PORTAMENTODOWN 3
|
|
|
|
#define CMD_TONEPORTAMENTO 4
|
|
|
|
#define CMD_VIBRATO 5
|
|
|
|
#define CMD_TONEPORTAVOL 6
|
|
|
|
#define CMD_VIBRATOVOL 7
|
|
|
|
#define CMD_TREMOLO 8
|
|
|
|
#define CMD_PANNING8 9
|
|
|
|
#define CMD_OFFSET 10
|
|
|
|
#define CMD_VOLUMESLIDE 11
|
|
|
|
#define CMD_POSITIONJUMP 12
|
|
|
|
#define CMD_VOLUME 13
|
|
|
|
#define CMD_PATTERNBREAK 14
|
|
|
|
#define CMD_RETRIG 15
|
|
|
|
#define CMD_SPEED 16
|
|
|
|
#define CMD_TEMPO 17
|
|
|
|
#define CMD_TREMOR 18
|
|
|
|
#define CMD_MODCMDEX 19
|
|
|
|
#define CMD_S3MCMDEX 20
|
|
|
|
#define CMD_CHANNELVOLUME 21
|
|
|
|
#define CMD_CHANNELVOLSLIDE 22
|
|
|
|
#define CMD_GLOBALVOLUME 23
|
|
|
|
#define CMD_GLOBALVOLSLIDE 24
|
|
|
|
#define CMD_KEYOFF 25
|
|
|
|
#define CMD_FINEVIBRATO 26
|
|
|
|
#define CMD_PANBRELLO 27
|
|
|
|
#define CMD_XFINEPORTAUPDOWN 28
|
|
|
|
#define CMD_PANNINGSLIDE 29
|
|
|
|
#define CMD_SETENVPOSITION 30
|
|
|
|
#define CMD_MIDI 31
|
|
|
|
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Volume Column commands */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define VOLCMD_VOLUME 1
|
|
|
|
#define VOLCMD_PANNING 2
|
|
|
|
#define VOLCMD_VOLSLIDEUP 3
|
|
|
|
#define VOLCMD_VOLSLIDEDOWN 4
|
|
|
|
#define VOLCMD_FINEVOLUP 5
|
|
|
|
#define VOLCMD_FINEVOLDOWN 6
|
|
|
|
#define VOLCMD_VIBRATOSPEED 7
|
|
|
|
#define VOLCMD_VIBRATO 8
|
|
|
|
#define VOLCMD_PANSLIDELEFT 9
|
|
|
|
#define VOLCMD_PANSLIDERIGHT 10
|
|
|
|
#define VOLCMD_TONEPORTAMENTO 11
|
|
|
|
#define VOLCMD_PORTAUP 12
|
|
|
|
#define VOLCMD_PORTADOWN 13
|
|
|
|
|
|
|
|
#define RSF_16BIT 0x04
|
|
|
|
#define RSF_STEREO 0x08
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
#define RS_PCM8S 0 /* 8-bit signed */
|
|
|
|
#define RS_PCM8U 1 /* 8-bit unsigned */
|
|
|
|
#define RS_PCM8D 2 /* 8-bit delta values */
|
|
|
|
#define RS_ADPCM4 3 /* 4-bit ADPCM-packed */
|
|
|
|
#define RS_PCM16D 4 /* 16-bit delta values */
|
|
|
|
#define RS_PCM16S 5 /* 16-bit signed */
|
|
|
|
#define RS_PCM16U 6 /* 16-bit unsigned */
|
|
|
|
#define RS_PCM16M 7 /* 16-bit motorola order */
|
|
|
|
#define RS_STPCM8S (RS_PCM8S|RSF_STEREO) /* stereo 8-bit signed */
|
|
|
|
#define RS_STPCM8U (RS_PCM8U|RSF_STEREO) /* stereo 8-bit unsigned */
|
|
|
|
#define RS_STPCM8D (RS_PCM8D|RSF_STEREO) /* stereo 8-bit delta values */
|
|
|
|
#define RS_STPCM16S (RS_PCM16S|RSF_STEREO) /* stereo 16-bit signed */
|
|
|
|
#define RS_STPCM16U (RS_PCM16U|RSF_STEREO) /* stereo 16-bit unsigned */
|
|
|
|
#define RS_STPCM16D (RS_PCM16D|RSF_STEREO) /* stereo 16-bit delta values */
|
|
|
|
#define RS_STPCM16M (RS_PCM16M|RSF_STEREO) /* stereo 16-bit signed big endian */
|
|
|
|
/* IT 2.14 compressed samples */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define RS_IT2148 0x10
|
|
|
|
#define RS_IT21416 0x14
|
|
|
|
#define RS_IT2158 0x12
|
|
|
|
#define RS_IT21516 0x16
|
2002-03-19 04:10:06 +00:00
|
|
|
/* AMS Packed Samples */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define RS_AMS8 0x11
|
|
|
|
#define RS_AMS16 0x15
|
2002-03-19 04:10:06 +00:00
|
|
|
/* DMF Huffman compression */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define RS_DMF8 0x13
|
|
|
|
#define RS_DMF16 0x17
|
2002-03-19 04:10:06 +00:00
|
|
|
/* MDL Huffman compression */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define RS_MDL8 0x20
|
|
|
|
#define RS_MDL16 0x24
|
|
|
|
#define RS_PTM8DTO16 0x25
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Stereo Interleaved Samples */
|
|
|
|
#define RS_STIPCM8S (RS_PCM8S|0x40|RSF_STEREO) /* stereo 8-bit signed */
|
|
|
|
#define RS_STIPCM8U (RS_PCM8U|0x40|RSF_STEREO) /* stereo 8-bit unsigned */
|
|
|
|
#define RS_STIPCM16S (RS_PCM16S|0x40|RSF_STEREO) /* stereo 16-bit signed */
|
|
|
|
#define RS_STIPCM16U (RS_PCM16U|0x40|RSF_STEREO) /* stereo 16-bit unsigned */
|
|
|
|
#define RS_STIPCM16M (RS_PCM16M|0x40|RSF_STEREO) /* stereo 16-bit signed big endian */
|
|
|
|
/* 24-bit signed */
|
2004-03-14 22:34:33 +00:00
|
|
|
#define RS_PCM24S (RS_PCM16S|0x80) /* mono 24-bit signed */
|
2002-03-19 04:10:06 +00:00
|
|
|
#define RS_STIPCM24S (RS_PCM16S|0x80|RSF_STEREO) /* stereo 24-bit signed */
|
2004-03-14 22:34:33 +00:00
|
|
|
#define RS_PCM32S (RS_PCM16S|0xC0) /* mono 24-bit signed */
|
2002-03-19 04:10:06 +00:00
|
|
|
#define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) /* stereo 24-bit signed */
|
|
|
|
|
|
|
|
/* NNA types */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define NNA_NOTECUT 0
|
|
|
|
#define NNA_CONTINUE 1
|
|
|
|
#define NNA_NOTEOFF 2
|
|
|
|
#define NNA_NOTEFADE 3
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* DCT types */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define DCT_NONE 0
|
|
|
|
#define DCT_NOTE 1
|
|
|
|
#define DCT_SAMPLE 2
|
|
|
|
#define DCT_INSTRUMENT 3
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* DNA types */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define DNA_NOTECUT 0
|
|
|
|
#define DNA_NOTEOFF 1
|
|
|
|
#define DNA_NOTEFADE 2
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Mixer Hardware-Dependent features */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define SYSMIX_ENABLEMMX 0x01
|
|
|
|
#define SYSMIX_WINDOWSNT 0x02
|
|
|
|
#define SYSMIX_SLOWCPU 0x04
|
|
|
|
#define SYSMIX_FASTCPU 0x08
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Module flags */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define SONG_EMBEDMIDICFG 0x0001
|
|
|
|
#define SONG_FASTVOLSLIDES 0x0002
|
|
|
|
#define SONG_ITOLDEFFECTS 0x0004
|
|
|
|
#define SONG_ITCOMPATMODE 0x0008
|
|
|
|
#define SONG_LINEARSLIDES 0x0010
|
|
|
|
#define SONG_PATTERNLOOP 0x0020
|
|
|
|
#define SONG_STEP 0x0040
|
|
|
|
#define SONG_PAUSED 0x0080
|
|
|
|
#define SONG_FADINGSONG 0x0100
|
|
|
|
#define SONG_ENDREACHED 0x0200
|
|
|
|
#define SONG_GLOBALFADE 0x0400
|
|
|
|
#define SONG_CPUVERYHIGH 0x0800
|
|
|
|
#define SONG_FIRSTTICK 0x1000
|
|
|
|
#define SONG_MPTFILTERMODE 0x2000
|
|
|
|
#define SONG_SURROUNDPAN 0x4000
|
|
|
|
#define SONG_EXFILTERRANGE 0x8000
|
|
|
|
#define SONG_AMIGALIMITS 0x10000
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Global Options (Renderer) */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define SNDMIX_REVERSESTEREO 0x0001
|
|
|
|
#define SNDMIX_NOISEREDUCTION 0x0002
|
|
|
|
#define SNDMIX_AGC 0x0004
|
|
|
|
#define SNDMIX_NORESAMPLING 0x0008
|
|
|
|
#define SNDMIX_HQRESAMPLER 0x0010
|
|
|
|
#define SNDMIX_MEGABASS 0x0020
|
|
|
|
#define SNDMIX_SURROUND 0x0040
|
|
|
|
#define SNDMIX_REVERB 0x0080
|
|
|
|
#define SNDMIX_EQ 0x0100
|
|
|
|
#define SNDMIX_SOFTPANNING 0x0200
|
|
|
|
#define SNDMIX_ULTRAHQSRCMODE 0x0400
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Misc Flags (can safely be turned on or off) */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define SNDMIX_DIRECTTODISK 0x10000
|
|
|
|
#define SNDMIX_ENABLEMMX 0x20000
|
|
|
|
#define SNDMIX_NOBACKWARDJUMPS 0x40000
|
2002-03-19 04:10:06 +00:00
|
|
|
#define SNDMIX_MAXDEFAULTPAN 0x80000 /* Used by the MOD loader */
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Reverb Types (GM2 Presets) */
|
2004-03-14 22:34:33 +00:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
REVERBTYPE_SMALLROOM,
|
|
|
|
REVERBTYPE_MEDIUMROOM,
|
|
|
|
REVERBTYPE_LARGEROOM,
|
|
|
|
REVERBTYPE_SMALLHALL,
|
|
|
|
REVERBTYPE_MEDIUMHALL,
|
|
|
|
REVERBTYPE_LARGEHALL,
|
|
|
|
NUM_REVERBTYPES
|
2002-02-28 21:10:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
SRCMODE_NEAREST,
|
|
|
|
SRCMODE_LINEAR,
|
|
|
|
SRCMODE_SPLINE,
|
|
|
|
SRCMODE_POLYPHASE,
|
|
|
|
NUM_SRC_MODES
|
2002-02-28 21:10:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Sample Struct */
|
2002-02-28 21:10:42 +00:00
|
|
|
typedef struct _MODINSTRUMENT
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
UINT nLength, nLoopStart, nLoopEnd;
|
|
|
|
UINT nSustainStart, nSustainEnd;
|
|
|
|
signed char *pSample;
|
|
|
|
UINT nC4Speed;
|
|
|
|
WORD nPan;
|
|
|
|
WORD nVolume;
|
|
|
|
WORD nGlobalVol;
|
|
|
|
WORD uFlags;
|
|
|
|
signed char RelativeTone;
|
|
|
|
signed char nFineTune;
|
|
|
|
BYTE nVibType;
|
|
|
|
BYTE nVibSweep;
|
|
|
|
BYTE nVibDepth;
|
|
|
|
BYTE nVibRate;
|
|
|
|
CHAR name[22];
|
2002-02-28 21:10:42 +00:00
|
|
|
} MODINSTRUMENT;
|
|
|
|
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Instrument Struct */
|
2002-02-28 21:10:42 +00:00
|
|
|
typedef struct _INSTRUMENTHEADER
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
UINT nFadeOut;
|
|
|
|
DWORD dwFlags;
|
|
|
|
WORD nGlobalVol;
|
|
|
|
WORD nPan;
|
|
|
|
WORD VolPoints[MAX_ENVPOINTS];
|
|
|
|
WORD PanPoints[MAX_ENVPOINTS];
|
|
|
|
WORD PitchPoints[MAX_ENVPOINTS];
|
|
|
|
BYTE VolEnv[MAX_ENVPOINTS];
|
|
|
|
BYTE PanEnv[MAX_ENVPOINTS];
|
|
|
|
BYTE PitchEnv[MAX_ENVPOINTS];
|
|
|
|
BYTE Keyboard[128];
|
|
|
|
BYTE NoteMap[128];
|
|
|
|
|
|
|
|
BYTE nVolEnv;
|
|
|
|
BYTE nPanEnv;
|
|
|
|
BYTE nPitchEnv;
|
|
|
|
BYTE nVolLoopStart;
|
|
|
|
BYTE nVolLoopEnd;
|
|
|
|
BYTE nVolSustainBegin;
|
|
|
|
BYTE nVolSustainEnd;
|
|
|
|
BYTE nPanLoopStart;
|
|
|
|
BYTE nPanLoopEnd;
|
|
|
|
BYTE nPanSustainBegin;
|
|
|
|
BYTE nPanSustainEnd;
|
|
|
|
BYTE nPitchLoopStart;
|
|
|
|
BYTE nPitchLoopEnd;
|
|
|
|
BYTE nPitchSustainBegin;
|
|
|
|
BYTE nPitchSustainEnd;
|
|
|
|
BYTE nNNA;
|
|
|
|
BYTE nDCT;
|
|
|
|
BYTE nDNA;
|
|
|
|
BYTE nPanSwing;
|
|
|
|
BYTE nVolSwing;
|
|
|
|
BYTE nIFC;
|
|
|
|
BYTE nIFR;
|
|
|
|
WORD wMidiBank;
|
|
|
|
BYTE nMidiProgram;
|
|
|
|
BYTE nMidiChannel;
|
|
|
|
BYTE nMidiDrumKey;
|
|
|
|
signed char nPPS;
|
|
|
|
unsigned char nPPC;
|
|
|
|
CHAR name[32];
|
|
|
|
CHAR filename[12];
|
2002-02-28 21:10:42 +00:00
|
|
|
} INSTRUMENTHEADER;
|
|
|
|
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Channel Struct */
|
2002-02-28 21:10:42 +00:00
|
|
|
typedef struct _MODCHANNEL
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
/* First 32-bytes: Most used mixing information: don't change it */
|
|
|
|
signed char *pCurrentSample;
|
|
|
|
DWORD nPos;
|
|
|
|
DWORD nPosLo; /* actually 16-bit */
|
|
|
|
LONG nInc; /* 16.16 */
|
|
|
|
LONG nRightVol;
|
|
|
|
LONG nLeftVol;
|
|
|
|
LONG nRightRamp;
|
|
|
|
LONG nLeftRamp;
|
|
|
|
/* 2nd cache line */
|
|
|
|
DWORD nLength;
|
|
|
|
DWORD dwFlags;
|
|
|
|
DWORD nLoopStart;
|
|
|
|
DWORD nLoopEnd;
|
|
|
|
LONG nRampRightVol;
|
|
|
|
LONG nRampLeftVol;
|
|
|
|
LONG nFilter_Y1, nFilter_Y2, nFilter_Y3, nFilter_Y4;
|
|
|
|
LONG nFilter_A0, nFilter_B0, nFilter_B1;
|
|
|
|
LONG nROfs, nLOfs;
|
|
|
|
LONG nRampLength;
|
|
|
|
/* Information not used in the mixer */
|
|
|
|
signed char *pSample;
|
|
|
|
LONG nNewRightVol, nNewLeftVol;
|
|
|
|
LONG nRealVolume, nRealPan;
|
|
|
|
LONG nVolume, nPan, nFadeOutVol;
|
|
|
|
LONG nPeriod, nC4Speed, nPortamentoDest;
|
|
|
|
INSTRUMENTHEADER *pHeader;
|
|
|
|
MODINSTRUMENT *pInstrument;
|
|
|
|
DWORD nVolEnvPosition, nPanEnvPosition, nPitchEnvPosition;
|
|
|
|
DWORD nMasterChn, nVUMeter;
|
|
|
|
LONG nGlobalVol, nInsVol;
|
|
|
|
LONG nFineTune, nTranspose;
|
|
|
|
LONG nPortamentoSlide, nAutoVibDepth;
|
|
|
|
UINT nAutoVibPos, nVibratoPos, nTremoloPos, nPanbrelloPos;
|
|
|
|
/* 16-bit members */
|
|
|
|
signed short nVolSwing, nPanSwing;
|
|
|
|
/* 8-bit members */
|
|
|
|
BYTE nNote, nNNA;
|
|
|
|
BYTE nNewNote, nNewIns, nCommand, nArpeggio;
|
|
|
|
BYTE nOldVolumeSlide, nOldFineVolUpDown;
|
|
|
|
BYTE nOldPortaUpDown, nOldFinePortaUpDown;
|
|
|
|
BYTE nOldPanSlide, nOldChnVolSlide;
|
|
|
|
BYTE nVibratoType, nVibratoSpeed, nVibratoDepth;
|
|
|
|
BYTE nTremoloType, nTremoloSpeed, nTremoloDepth;
|
|
|
|
BYTE nPanbrelloType, nPanbrelloSpeed, nPanbrelloDepth;
|
|
|
|
BYTE nOldCmdEx, nOldVolParam, nOldTempo;
|
|
|
|
BYTE nOldOffset, nOldHiOffset;
|
|
|
|
BYTE nCutOff, nResonance;
|
|
|
|
BYTE nRetrigCount, nRetrigParam;
|
|
|
|
BYTE nTremorCount, nTremorParam;
|
|
|
|
BYTE nPatternLoop, nPatternLoopCount;
|
|
|
|
BYTE nRowNote, nRowInstr;
|
|
|
|
BYTE nRowVolCmd, nRowVolume;
|
|
|
|
BYTE nRowCommand, nRowParam;
|
|
|
|
BYTE nLeftVU, nRightVU;
|
|
|
|
BYTE nActiveMacro, nPadding;
|
2002-02-28 21:10:42 +00:00
|
|
|
} MODCHANNEL;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct _MODCHANNELSETTINGS
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
UINT nPan;
|
|
|
|
UINT nVolume;
|
|
|
|
DWORD dwFlags;
|
|
|
|
UINT nMixPlugin;
|
|
|
|
char szName[MAX_CHANNELNAME]; /* changed from CHAR */
|
2002-02-28 21:10:42 +00:00
|
|
|
} MODCHANNELSETTINGS;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct _MODCOMMAND
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
BYTE note;
|
|
|
|
BYTE instr;
|
|
|
|
BYTE volcmd;
|
|
|
|
BYTE command;
|
|
|
|
BYTE vol;
|
|
|
|
BYTE param;
|
2002-02-28 21:10:42 +00:00
|
|
|
} MODCOMMAND, *LPMODCOMMAND;
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/*////////////////////////////////////////////////////////////////// */
|
|
|
|
/* Mix Plugins */
|
|
|
|
#define MIXPLUG_MIXREADY 0x01 /* Set when cleared */
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
class IMixPlugin
|
|
|
|
{
|
|
|
|
public:
|
2004-03-14 22:34:33 +00:00
|
|
|
virtual int AddRef () = 0;
|
|
|
|
virtual int Release () = 0;
|
|
|
|
virtual void SaveAllParameters () = 0;
|
|
|
|
virtual void RestoreAllParameters () = 0;
|
|
|
|
virtual void Process (float *pOutL, float *pOutR, unsigned long nSamples) = 0;
|
|
|
|
virtual void Init (unsigned long nFreq, int bReset) = 0;
|
|
|
|
virtual void MidiSend (DWORD dwMidiCode) = 0;
|
|
|
|
virtual void MidiCommand (UINT nMidiCh, UINT nMidiProg, UINT note, UINT vol) =
|
|
|
|
0;
|
2002-02-28 21:10:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
#define MIXPLUG_INPUTF_MASTEREFFECT 0x01 /* Apply to master mix */
|
|
|
|
#define MIXPLUG_INPUTF_BYPASS 0x02 /* Bypass effect */
|
|
|
|
#define MIXPLUG_INPUTF_WETMIX 0x04 /* Wet Mix (dry added) */
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
typedef struct _SNDMIXPLUGINSTATE
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
DWORD dwFlags; /* MIXPLUG_XXXX */
|
|
|
|
LONG nVolDecayL, nVolDecayR; /* Buffer click removal */
|
|
|
|
int *pMixBuffer; /* Stereo effect send buffer */
|
|
|
|
float *pOutBufferL; /* Temp storage for int -> float conversion */
|
|
|
|
float *pOutBufferR;
|
2002-02-28 21:10:42 +00:00
|
|
|
} SNDMIXPLUGINSTATE, *PSNDMIXPLUGINSTATE;
|
|
|
|
|
|
|
|
typedef struct _SNDMIXPLUGININFO
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
DWORD dwPluginId1;
|
|
|
|
DWORD dwPluginId2;
|
|
|
|
DWORD dwInputRouting; /* MIXPLUG_INPUTF_XXXX */
|
|
|
|
DWORD dwOutputRouting; /* 0=mix 0x80+=fx */
|
|
|
|
DWORD dwReserved[4]; /* Reserved for routing info */
|
|
|
|
CHAR szName[32];
|
|
|
|
CHAR szLibraryName[64]; /* original DLL name */
|
|
|
|
} SNDMIXPLUGININFO, *PSNDMIXPLUGININFO; /* Size should be 128 */
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
typedef struct _SNDMIXPLUGIN
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
IMixPlugin *pMixPlugin;
|
|
|
|
PSNDMIXPLUGINSTATE pMixState;
|
|
|
|
ULONG nPluginDataSize;
|
|
|
|
PVOID pPluginData;
|
|
|
|
SNDMIXPLUGININFO Info;
|
2002-02-28 21:10:42 +00:00
|
|
|
} SNDMIXPLUGIN, *PSNDMIXPLUGIN;
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
typedef BOOL (*PMIXPLUGINCREATEPROC) (PSNDMIXPLUGIN);
|
2002-02-28 21:10:42 +00:00
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/*////////////////////////////////////////////////////////////////// */
|
2002-02-28 21:10:42 +00:00
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
MIDIOUT_START = 0,
|
|
|
|
MIDIOUT_STOP,
|
|
|
|
MIDIOUT_TICK,
|
|
|
|
MIDIOUT_NOTEON,
|
|
|
|
MIDIOUT_NOTEOFF,
|
|
|
|
MIDIOUT_VOLUME,
|
|
|
|
MIDIOUT_PAN,
|
|
|
|
MIDIOUT_BANKSEL,
|
|
|
|
MIDIOUT_PROGRAM
|
2002-02-28 21:10:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct MODMIDICFG
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
char szMidiGlb[9 * 32]; /* changed from CHAR */
|
|
|
|
char szMidiSFXExt[16 * 32]; /* changed from CHAR */
|
|
|
|
char szMidiZXXExt[128 * 32]; /* changed from CHAR */
|
2002-02-28 21:10:42 +00:00
|
|
|
} MODMIDICFG, *LPMODMIDICFG;
|
|
|
|
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
typedef VOID (*LPSNDMIXHOOKPROC) (int *, unsigned long, unsigned long); /* buffer, samples, channels */
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/*============== */
|
2002-02-28 21:10:42 +00:00
|
|
|
class CSoundFile
|
2002-03-19 04:10:06 +00:00
|
|
|
/*============== */
|
2002-02-28 21:10:42 +00:00
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
public: /* Static Members */
|
|
|
|
static UINT m_nXBassDepth, m_nXBassRange;
|
|
|
|
static UINT m_nReverbDepth, m_nReverbDelay, gnReverbType;
|
|
|
|
static UINT m_nProLogicDepth, m_nProLogicDelay;
|
|
|
|
static UINT m_nStereoSeparation;
|
|
|
|
static UINT m_nMaxMixChannels;
|
|
|
|
static LONG m_nStreamVolume;
|
|
|
|
static DWORD gdwSysInfo, gdwSoundSetup, gdwMixingFreq, gnBitsPerSample,
|
|
|
|
gnChannels;
|
|
|
|
static UINT gnAGC, gnVolumeRampSamples, gnVUMeter, gnCPUUsage;
|
|
|
|
static LPSNDMIXHOOKPROC gpSndMixHook;
|
|
|
|
static PMIXPLUGINCREATEPROC gpMixPluginCreateProc;
|
|
|
|
|
|
|
|
public: /* for Editing */
|
|
|
|
MODCHANNEL Chn[MAX_CHANNELS]; /* Channels */
|
|
|
|
UINT ChnMix[MAX_CHANNELS]; /* Channels to be mixed */
|
|
|
|
MODINSTRUMENT Ins[MAX_SAMPLES]; /* Instruments */
|
|
|
|
INSTRUMENTHEADER *Headers[MAX_INSTRUMENTS]; /* Instrument Headers */
|
|
|
|
MODCHANNELSETTINGS ChnSettings[MAX_BASECHANNELS]; /* Channels settings */
|
|
|
|
MODCOMMAND *Patterns[MAX_PATTERNS]; /* Patterns */
|
|
|
|
WORD PatternSize[MAX_PATTERNS]; /* Patterns Lengths */
|
|
|
|
BYTE Order[MAX_ORDERS]; /* Pattern Orders */
|
|
|
|
MODMIDICFG m_MidiCfg; /* Midi macro config table */
|
|
|
|
SNDMIXPLUGIN m_MixPlugins[MAX_MIXPLUGINS]; /* Mix plugins */
|
|
|
|
UINT m_nDefaultSpeed, m_nDefaultTempo, m_nDefaultGlobalVolume;
|
|
|
|
DWORD m_dwSongFlags; /* Song flags SONG_XXXX */
|
|
|
|
UINT m_nChannels, m_nMixChannels, m_nMixStat, m_nBufferCount;
|
|
|
|
UINT m_nType, m_nSamples, m_nInstruments;
|
|
|
|
UINT m_nTickCount, m_nTotalCount, m_nPatternDelay, m_nFrameDelay;
|
|
|
|
UINT m_nMusicSpeed, m_nMusicTempo;
|
|
|
|
UINT m_nNextRow, m_nRow;
|
|
|
|
UINT m_nPattern, m_nCurrentPattern, m_nNextPattern, m_nRestartPos;
|
|
|
|
UINT m_nMasterVolume, m_nGlobalVolume, m_nSongPreAmp;
|
|
|
|
UINT m_nFreqFactor, m_nTempoFactor, m_nOldGlbVolSlide;
|
|
|
|
LONG m_nMinPeriod, m_nMaxPeriod, m_nRepeatCount, m_nInitialRepeatCount;
|
|
|
|
DWORD m_nGlobalFadeSamples, m_nGlobalFadeMaxSamples;
|
|
|
|
UINT m_nMaxOrderPosition;
|
|
|
|
UINT m_nPatternNames;
|
|
|
|
LPSTR m_lpszSongComments, m_lpszPatternNames;
|
|
|
|
char m_szNames[MAX_INSTRUMENTS][32]; /* changed from CHAR */
|
|
|
|
CHAR CompressionTable[16];
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
public:
|
2004-03-14 22:34:33 +00:00
|
|
|
CSoundFile ();
|
|
|
|
~CSoundFile ();
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
public:
|
2004-03-14 22:34:33 +00:00
|
|
|
BOOL Create (LPCBYTE lpStream, DWORD dwMemLength = 0);
|
|
|
|
BOOL Destroy ();
|
|
|
|
UINT GetType () const
|
|
|
|
{
|
|
|
|
return m_nType;
|
|
|
|
}
|
|
|
|
UINT GetNumChannels () const;
|
|
|
|
UINT GetLogicalChannels () const
|
|
|
|
{
|
|
|
|
return m_nChannels;
|
|
|
|
}
|
|
|
|
BOOL SetMasterVolume (UINT vol, BOOL bAdjustAGC = FALSE);
|
|
|
|
UINT GetMasterVolume () const
|
|
|
|
{
|
|
|
|
return m_nMasterVolume;
|
|
|
|
}
|
|
|
|
UINT GetNumPatterns () const;
|
|
|
|
UINT GetNumInstruments () const;
|
|
|
|
UINT GetNumSamples () const
|
|
|
|
{
|
|
|
|
return m_nSamples;
|
|
|
|
}
|
|
|
|
UINT GetCurrentPos () const;
|
|
|
|
UINT GetCurrentPattern () const
|
|
|
|
{
|
|
|
|
return m_nPattern;
|
|
|
|
}
|
|
|
|
UINT GetCurrentOrder () const
|
|
|
|
{
|
|
|
|
return m_nCurrentPattern;
|
|
|
|
}
|
|
|
|
UINT GetSongComments (LPSTR s, UINT cbsize, UINT linesize = 32);
|
|
|
|
UINT GetRawSongComments (LPSTR s, UINT cbsize, UINT linesize = 32);
|
|
|
|
UINT GetMaxPosition () const;
|
|
|
|
void SetCurrentPos (UINT nPos);
|
|
|
|
void SetCurrentOrder (UINT nOrder);
|
|
|
|
void GetTitle (LPSTR s) const
|
|
|
|
{
|
|
|
|
lstrcpyn (s, m_szNames[0], 32);
|
|
|
|
}
|
|
|
|
LPCSTR GetTitle () const
|
|
|
|
{
|
|
|
|
return m_szNames[0];
|
|
|
|
}
|
|
|
|
UINT GetSampleName (UINT nSample, LPSTR s = NULL) const;
|
|
|
|
UINT GetInstrumentName (UINT nInstr, LPSTR s = NULL) const;
|
|
|
|
UINT GetMusicSpeed () const
|
|
|
|
{
|
|
|
|
return m_nMusicSpeed;
|
|
|
|
}
|
|
|
|
UINT GetMusicTempo () const
|
|
|
|
{
|
|
|
|
return m_nMusicTempo;
|
|
|
|
}
|
|
|
|
DWORD GetLength (BOOL bAdjust, BOOL bTotal = FALSE);
|
|
|
|
DWORD GetSongTime ()
|
|
|
|
{
|
|
|
|
return GetLength (FALSE, TRUE);
|
|
|
|
}
|
|
|
|
void SetRepeatCount (int n)
|
|
|
|
{
|
|
|
|
m_nRepeatCount = n;
|
|
|
|
m_nInitialRepeatCount = n;
|
|
|
|
}
|
|
|
|
int GetRepeatCount () const
|
|
|
|
{
|
|
|
|
return m_nRepeatCount;
|
|
|
|
}
|
|
|
|
BOOL IsPaused () const
|
|
|
|
{
|
|
|
|
return (m_dwSongFlags & SONG_PAUSED) ? TRUE : FALSE;
|
|
|
|
}
|
|
|
|
void LoopPattern (int nPat, int nRow = 0);
|
|
|
|
void CheckCPUUsage (UINT nCPU);
|
|
|
|
BOOL SetPatternName (UINT nPat, LPCSTR lpszName);
|
|
|
|
BOOL GetPatternName (UINT nPat, LPSTR lpszName, UINT cbSize =
|
|
|
|
MAX_PATTERNNAME) const;
|
|
|
|
/* Module Loaders */
|
|
|
|
BOOL ReadXM (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadS3M (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadMod (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadMed (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadMTM (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadSTM (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadIT (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL Read669 (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadUlt (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadWav (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadDSM (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadFAR (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadAMS (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadAMS2 (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadMDL (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadOKT (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadDMF (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadPTM (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadDBM (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadAMF (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadMT2 (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadPSM (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadJ2B (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
BOOL ReadUMX (LPCBYTE lpStream, DWORD dwMemLength);
|
|
|
|
|
|
|
|
/* Save Functions */
|
2002-02-28 21:10:42 +00:00
|
|
|
#ifndef MODPLUG_NO_FILESAVE
|
2004-03-14 22:34:33 +00:00
|
|
|
UINT WriteSample (FILE * f, MODINSTRUMENT * pins, UINT nFlags, UINT nMaxLen =
|
|
|
|
0);
|
|
|
|
BOOL SaveXM (LPCSTR lpszFileName, UINT nPacking = 0);
|
|
|
|
BOOL SaveS3M (LPCSTR lpszFileName, UINT nPacking = 0);
|
|
|
|
BOOL SaveMod (LPCSTR lpszFileName, UINT nPacking = 0);
|
|
|
|
BOOL SaveIT (LPCSTR lpszFileName, UINT nPacking = 0);
|
2002-03-19 04:10:06 +00:00
|
|
|
#endif /* MODPLUG_NO_FILESAVE */
|
2004-03-14 22:34:33 +00:00
|
|
|
/* MOD Convert function */
|
|
|
|
UINT GetBestSaveFormat () const;
|
|
|
|
UINT GetSaveFormats () const;
|
|
|
|
void ConvertModCommand (MODCOMMAND *) const;
|
|
|
|
void S3MConvert (MODCOMMAND * m, BOOL bIT) const;
|
|
|
|
void S3MSaveConvert (UINT * pcmd, UINT * pprm, BOOL bIT) const;
|
|
|
|
WORD ModSaveCommand (const MODCOMMAND * m, BOOL bXM) const;
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
public:
|
2004-03-14 22:34:33 +00:00
|
|
|
/* Real-time sound functions */
|
|
|
|
VOID ResetChannels ();
|
|
|
|
|
|
|
|
UINT Read (LPVOID lpBuffer, UINT cbBuffer);
|
|
|
|
UINT CreateStereoMix (int count);
|
|
|
|
BOOL FadeSong (UINT msec);
|
|
|
|
BOOL GlobalFadeSong (UINT msec);
|
|
|
|
UINT GetTotalTickCount () const
|
|
|
|
{
|
|
|
|
return m_nTotalCount;
|
|
|
|
}
|
|
|
|
VOID ResetTotalTickCount ()
|
|
|
|
{
|
|
|
|
m_nTotalCount = 0;
|
|
|
|
}
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
public:
|
2004-03-14 22:34:33 +00:00
|
|
|
/* Mixer Config */
|
|
|
|
static BOOL InitPlayer (BOOL bReset = FALSE);
|
|
|
|
static BOOL SetWaveConfig (UINT nRate, UINT nBits, UINT nChannels, BOOL bMMX =
|
|
|
|
FALSE);
|
|
|
|
static BOOL SetResamplingMode (UINT nMode); /* SRCMODE_XXXX */
|
|
|
|
static BOOL IsStereo ()
|
|
|
|
{
|
|
|
|
return (gnChannels > 1) ? TRUE : FALSE;
|
|
|
|
}
|
|
|
|
static DWORD GetSampleRate ()
|
|
|
|
{
|
|
|
|
return gdwMixingFreq;
|
|
|
|
}
|
|
|
|
static DWORD GetBitsPerSample ()
|
|
|
|
{
|
|
|
|
return gnBitsPerSample;
|
|
|
|
}
|
|
|
|
static DWORD InitSysInfo ();
|
|
|
|
static DWORD GetSysInfo ()
|
|
|
|
{
|
|
|
|
return gdwSysInfo;
|
|
|
|
}
|
|
|
|
/* AGC */
|
|
|
|
static BOOL GetAGC ()
|
|
|
|
{
|
|
|
|
return (gdwSoundSetup & SNDMIX_AGC) ? TRUE : FALSE;
|
|
|
|
}
|
|
|
|
static void SetAGC (BOOL b);
|
|
|
|
static void ResetAGC ();
|
|
|
|
static void ProcessAGC (int count);
|
|
|
|
|
|
|
|
/*GCCFIX -- added these functions back in! */
|
|
|
|
static BOOL SetWaveConfigEx (BOOL bSurround, BOOL bNoOverSampling,
|
|
|
|
BOOL bReverb, BOOL hqido, BOOL bMegaBass, BOOL bNR, BOOL bEQ);
|
|
|
|
/* DSP Effects */
|
|
|
|
static void InitializeDSP (BOOL bReset);
|
|
|
|
static void ProcessStereoDSP (int count);
|
|
|
|
static void ProcessMonoDSP (int count);
|
|
|
|
|
|
|
|
/* [Reverb level 0(quiet)-100(loud)], [delay in ms, usually 40-200ms] */
|
|
|
|
static BOOL SetReverbParameters (UINT nDepth, UINT nDelay);
|
|
|
|
|
|
|
|
/* [XBass level 0(quiet)-100(loud)], [cutoff in Hz 10-100] */
|
|
|
|
static BOOL SetXBassParameters (UINT nDepth, UINT nRange);
|
|
|
|
|
|
|
|
/* [Surround level 0(quiet)-100(heavy)] [delay in ms, usually 5-40ms] */
|
|
|
|
static BOOL SetSurroundParameters (UINT nDepth, UINT nDelay);
|
|
|
|
|
2002-02-28 21:10:42 +00:00
|
|
|
public:
|
2004-03-14 22:34:33 +00:00
|
|
|
BOOL ReadNote ();
|
|
|
|
BOOL ProcessRow ();
|
|
|
|
BOOL ProcessEffects ();
|
|
|
|
UINT GetNNAChannel (UINT nChn) const;
|
|
|
|
void CheckNNA (UINT nChn, UINT instr, int note, BOOL bForceCut);
|
|
|
|
void NoteChange (UINT nChn, int note, BOOL bPorta = FALSE, BOOL bResetEnv =
|
|
|
|
TRUE);
|
|
|
|
void InstrumentChange (MODCHANNEL * pChn, UINT instr, BOOL bPorta =
|
|
|
|
FALSE, BOOL bUpdVol = TRUE, BOOL bResetEnv = TRUE);
|
|
|
|
/* Channel Effects */
|
|
|
|
void PortamentoUp (MODCHANNEL * pChn, UINT param);
|
|
|
|
void PortamentoDown (MODCHANNEL * pChn, UINT param);
|
|
|
|
void FinePortamentoUp (MODCHANNEL * pChn, UINT param);
|
|
|
|
void FinePortamentoDown (MODCHANNEL * pChn, UINT param);
|
|
|
|
void ExtraFinePortamentoUp (MODCHANNEL * pChn, UINT param);
|
|
|
|
void ExtraFinePortamentoDown (MODCHANNEL * pChn, UINT param);
|
|
|
|
void TonePortamento (MODCHANNEL * pChn, UINT param);
|
|
|
|
void Vibrato (MODCHANNEL * pChn, UINT param);
|
|
|
|
void FineVibrato (MODCHANNEL * pChn, UINT param);
|
|
|
|
void VolumeSlide (MODCHANNEL * pChn, UINT param);
|
|
|
|
void PanningSlide (MODCHANNEL * pChn, UINT param);
|
|
|
|
void ChannelVolSlide (MODCHANNEL * pChn, UINT param);
|
|
|
|
void FineVolumeUp (MODCHANNEL * pChn, UINT param);
|
|
|
|
void FineVolumeDown (MODCHANNEL * pChn, UINT param);
|
|
|
|
void Tremolo (MODCHANNEL * pChn, UINT param);
|
|
|
|
void Panbrello (MODCHANNEL * pChn, UINT param);
|
|
|
|
void RetrigNote (UINT nChn, UINT param);
|
|
|
|
void NoteCut (UINT nChn, UINT nTick);
|
|
|
|
void KeyOff (UINT nChn);
|
|
|
|
int PatternLoop (MODCHANNEL *, UINT param);
|
|
|
|
void ExtendedMODCommands (UINT nChn, UINT param);
|
|
|
|
void ExtendedS3MCommands (UINT nChn, UINT param);
|
|
|
|
void ExtendedChannelEffect (MODCHANNEL *, UINT param);
|
|
|
|
void ProcessMidiMacro (UINT nChn, LPCSTR pszMidiMacro, UINT param = 0);
|
|
|
|
void SetupChannelFilter (MODCHANNEL * pChn, BOOL bReset, int flt_modifier =
|
|
|
|
256) const;
|
|
|
|
/* Low-Level effect processing */
|
|
|
|
void DoFreqSlide (MODCHANNEL * pChn, LONG nFreqSlide);
|
|
|
|
|
|
|
|
/* Global Effects */
|
|
|
|
void SetTempo (UINT param);
|
|
|
|
void SetSpeed (UINT param);
|
|
|
|
void GlobalVolSlide (UINT param);
|
|
|
|
DWORD IsSongFinished (UINT nOrder, UINT nRow) const;
|
|
|
|
BOOL IsValidBackwardJump (UINT nStartOrder, UINT nStartRow, UINT nJumpOrder,
|
|
|
|
UINT nJumpRow) const;
|
|
|
|
/* Read/Write sample functions */
|
|
|
|
signed char GetDeltaValue (signed char prev, UINT n) const
|
|
|
|
{
|
|
|
|
return (signed char) (prev + CompressionTable[n & 0x0F]);
|
|
|
|
}
|
|
|
|
UINT PackSample (int &sample, int next);
|
|
|
|
BOOL CanPackSample (LPSTR pSample, UINT nLen, UINT nPacking, BYTE * result =
|
|
|
|
NULL);
|
|
|
|
UINT ReadSample (MODINSTRUMENT * pIns, UINT nFlags, LPCSTR pMemFile,
|
|
|
|
DWORD dwMemLength);
|
|
|
|
BOOL DestroySample (UINT nSample);
|
|
|
|
BOOL DestroyInstrument (UINT nInstr);
|
|
|
|
BOOL IsSampleUsed (UINT nSample);
|
|
|
|
BOOL IsInstrumentUsed (UINT nInstr);
|
|
|
|
BOOL RemoveInstrumentSamples (UINT nInstr);
|
|
|
|
UINT DetectUnusedSamples (BOOL *);
|
|
|
|
BOOL RemoveSelectedSamples (BOOL *);
|
|
|
|
void AdjustSampleLoop (MODINSTRUMENT * pIns);
|
|
|
|
|
|
|
|
/* I/O from another sound file */
|
|
|
|
BOOL ReadInstrumentFromSong (UINT nInstr, CSoundFile *, UINT nSrcInstrument);
|
|
|
|
BOOL ReadSampleFromSong (UINT nSample, CSoundFile *, UINT nSrcSample);
|
|
|
|
|
|
|
|
/* Period/Note functions */
|
|
|
|
UINT GetNoteFromPeriod (UINT period) const;
|
|
|
|
UINT GetPeriodFromNote (UINT note, int nFineTune, UINT nC4Speed) const;
|
|
|
|
UINT GetFreqFromPeriod (UINT period, UINT nC4Speed, int nPeriodFrac =
|
|
|
|
0) const;
|
|
|
|
/* Misc functions */
|
|
|
|
MODINSTRUMENT *GetSample (UINT n)
|
|
|
|
{
|
|
|
|
return Ins + n;
|
|
|
|
}
|
|
|
|
void ResetMidiCfg ();
|
|
|
|
UINT MapMidiInstrument (DWORD dwProgram, UINT nChannel, UINT nNote);
|
|
|
|
BOOL ITInstrToMPT (const void *p, INSTRUMENTHEADER * penv, UINT trkvers);
|
|
|
|
UINT SaveMixPlugins (FILE * f = NULL, BOOL bUpdate = TRUE);
|
|
|
|
UINT LoadMixPlugins (const void *pData, UINT nLen);
|
|
|
|
|
2002-02-28 21:10:42 +00:00
|
|
|
#ifndef NO_FILTER
|
2004-03-14 22:34:33 +00:00
|
|
|
DWORD CutOffToFrequency (UINT nCutOff, int flt_modifier = 256) const; /* [0-255] => [1-10KHz] */
|
2002-02-28 21:10:42 +00:00
|
|
|
#endif
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
/* Static helper functions */
|
2002-02-28 21:10:42 +00:00
|
|
|
public:
|
2004-03-14 22:34:33 +00:00
|
|
|
static DWORD TransposeToFrequency (int transp, int ftune = 0);
|
|
|
|
static int FrequencyToTranspose (DWORD freq);
|
|
|
|
static void FrequencyToTranspose (MODINSTRUMENT * psmp);
|
2002-02-28 21:10:42 +00:00
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
/* System-Dependant functions */
|
2002-02-28 21:10:42 +00:00
|
|
|
public:
|
2004-03-14 22:34:33 +00:00
|
|
|
static MODCOMMAND *AllocatePattern (UINT rows, UINT nchns);
|
|
|
|
static signed char *AllocateSample (UINT nbytes);
|
|
|
|
static void FreePattern (LPVOID pat);
|
|
|
|
static void FreeSample (LPVOID p);
|
|
|
|
static UINT Normalize24BitBuffer (LPBYTE pbuffer, UINT cbsizebytes,
|
|
|
|
DWORD lmax24, DWORD dwByteInc);
|
2002-02-28 21:10:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* inline DWORD BigEndian(DWORD x) { return ((x & 0xFF) << 24) | ((x & 0xFF00) << 8) | ((x & 0xFF0000) >> 8) | ((x & 0xFF000000) >> 24); } */
|
|
|
|
/* inline WORD BigEndianW(WORD x) { return (WORD)(((x >> 8) & 0xFF) | ((x << 8) & 0xFF00)); } */
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/*//////////////////////////////////////////////////////// */
|
|
|
|
/* WAVE format information */
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
#pragma pack(1)
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Standard IFF chunks IDs */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define IFFID_FORM 0x4d524f46
|
|
|
|
#define IFFID_RIFF 0x46464952
|
|
|
|
#define IFFID_WAVE 0x45564157
|
|
|
|
#define IFFID_LIST 0x5453494C
|
|
|
|
#define IFFID_INFO 0x4F464E49
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* IFF Info fields */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define IFFID_ICOP 0x504F4349
|
|
|
|
#define IFFID_IART 0x54524149
|
|
|
|
#define IFFID_IPRD 0x44525049
|
|
|
|
#define IFFID_INAM 0x4D414E49
|
|
|
|
#define IFFID_ICMT 0x544D4349
|
|
|
|
#define IFFID_IENG 0x474E4549
|
|
|
|
#define IFFID_ISFT 0x54465349
|
|
|
|
#define IFFID_ISBJ 0x4A425349
|
|
|
|
#define IFFID_IGNR 0x524E4749
|
|
|
|
#define IFFID_ICRD 0x44524349
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Wave IFF chunks IDs */
|
2002-02-28 21:10:42 +00:00
|
|
|
#define IFFID_wave 0x65766177
|
|
|
|
#define IFFID_fmt 0x20746D66
|
|
|
|
#define IFFID_wsmp 0x706D7377
|
|
|
|
#define IFFID_pcm 0x206d6370
|
|
|
|
#define IFFID_data 0x61746164
|
|
|
|
#define IFFID_smpl 0x6C706D73
|
|
|
|
#define IFFID_xtra 0x61727478
|
|
|
|
|
|
|
|
typedef struct WAVEFILEHEADER
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
DWORD id_RIFF; /* "RIFF" */
|
|
|
|
DWORD filesize; /* file length-8 */
|
|
|
|
DWORD id_WAVE;
|
2002-02-28 21:10:42 +00:00
|
|
|
} WAVEFILEHEADER;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct WAVEFORMATHEADER
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
DWORD id_fmt; /* "fmt " */
|
|
|
|
DWORD hdrlen; /* 16 */
|
|
|
|
WORD format; /* 1 */
|
|
|
|
WORD channels; /* 1:mono, 2:stereo */
|
|
|
|
DWORD freqHz; /* sampling freq */
|
|
|
|
DWORD bytessec; /* bytes/sec=freqHz*samplesize */
|
|
|
|
WORD samplesize; /* sizeof(sample) */
|
|
|
|
WORD bitspersample; /* bits per sample (8/16) */
|
2002-02-28 21:10:42 +00:00
|
|
|
} WAVEFORMATHEADER;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct WAVEDATAHEADER
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
DWORD id_data; /* "data" */
|
|
|
|
DWORD length; /* length of data */
|
2002-02-28 21:10:42 +00:00
|
|
|
} WAVEDATAHEADER;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct WAVESMPLHEADER
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
/* SMPL */
|
|
|
|
DWORD smpl_id; /* "smpl" -> 0x6C706D73 */
|
|
|
|
DWORD smpl_len; /* length of smpl: 3Ch (54h with sustain loop) */
|
|
|
|
DWORD dwManufacturer;
|
|
|
|
DWORD dwProduct;
|
|
|
|
DWORD dwSamplePeriod; /* 1000000000/freqHz */
|
|
|
|
DWORD dwBaseNote; /* 3Ch = C-4 -> 60 + RelativeTone */
|
|
|
|
DWORD dwPitchFraction;
|
|
|
|
DWORD dwSMPTEFormat;
|
|
|
|
DWORD dwSMPTEOffset;
|
|
|
|
DWORD dwSampleLoops; /* number of loops */
|
|
|
|
DWORD cbSamplerData;
|
2002-02-28 21:10:42 +00:00
|
|
|
} WAVESMPLHEADER;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct SAMPLELOOPSTRUCT
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
DWORD dwIdentifier;
|
|
|
|
DWORD dwLoopType; /* 0=normal, 1=bidi */
|
|
|
|
DWORD dwLoopStart;
|
|
|
|
DWORD dwLoopEnd; /* Byte offset ? */
|
|
|
|
DWORD dwFraction;
|
|
|
|
DWORD dwPlayCount; /* Loop Count, 0=infinite */
|
2002-02-28 21:10:42 +00:00
|
|
|
} SAMPLELOOPSTRUCT;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct WAVESAMPLERINFO
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
WAVESMPLHEADER wsiHdr;
|
|
|
|
SAMPLELOOPSTRUCT wsiLoops[2];
|
2002-02-28 21:10:42 +00:00
|
|
|
} WAVESAMPLERINFO;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct WAVELISTHEADER
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
DWORD list_id; /* "LIST" -> 0x5453494C */
|
|
|
|
DWORD list_len;
|
|
|
|
DWORD info; /* "INFO" */
|
2002-02-28 21:10:42 +00:00
|
|
|
} WAVELISTHEADER;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct WAVEEXTRAHEADER
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
DWORD xtra_id; /* "xtra" -> 0x61727478 */
|
|
|
|
DWORD xtra_len;
|
|
|
|
DWORD dwFlags;
|
|
|
|
WORD wPan;
|
|
|
|
WORD wVolume;
|
|
|
|
WORD wGlobalVol;
|
|
|
|
WORD wReserved;
|
|
|
|
BYTE nVibType;
|
|
|
|
BYTE nVibSweep;
|
|
|
|
BYTE nVibDepth;
|
|
|
|
BYTE nVibRate;
|
2002-02-28 21:10:42 +00:00
|
|
|
} WAVEEXTRAHEADER;
|
|
|
|
|
|
|
|
#pragma pack()
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/*///////////////////////////////////////////////////////// */
|
|
|
|
/* Low-level Mixing functions */
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
#define MIXBUFFERSIZE 512
|
|
|
|
#define MIXING_ATTENUATION 4
|
|
|
|
#define MIXING_CLIPMIN (-0x08000000)
|
|
|
|
#define MIXING_CLIPMAX (0x07FFFFFF)
|
|
|
|
#define VOLUMERAMPPRECISION 12
|
|
|
|
#define FADESONGDELAY 100
|
|
|
|
#define EQ_BUFFERSIZE (MIXBUFFERSIZE)
|
|
|
|
#define AGC_PRECISION 9
|
|
|
|
#define AGC_UNITY (1 << AGC_PRECISION)
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Calling conventions */
|
2002-02-28 21:10:42 +00:00
|
|
|
#ifdef MSC_VER
|
|
|
|
#define MPPASMCALL __cdecl
|
|
|
|
#define MPPFASTCALL __fastcall
|
|
|
|
#else
|
|
|
|
#define MPPASMCALL
|
|
|
|
#define MPPFASTCALL
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define MOD2XMFineTune(k) ((int)( (signed char)((k)<<4) ))
|
|
|
|
#define XM2MODFineTune(k) ((int)( (k>>4)&0x0f ))
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
int _muldiv (long a, long b, long c);
|
|
|
|
int _muldivr (long a, long b, long c);
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* Byte swapping functions from the GNU C Library and libsdl */
|
2002-02-28 21:10:42 +00:00
|
|
|
|
|
|
|
/* Swap bytes in 16 bit value. */
|
|
|
|
#ifdef __GNUC__
|
|
|
|
# define bswap_16(x) \
|
|
|
|
(__extension__ \
|
|
|
|
({ unsigned short int __bsx = (x); \
|
|
|
|
((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); }))
|
|
|
|
#else
|
2003-05-22 17:51:01 +00:00
|
|
|
static inline unsigned short int
|
2002-02-28 21:10:42 +00:00
|
|
|
bswap_16 (unsigned short int __bsx)
|
|
|
|
{
|
|
|
|
return ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8));
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Swap bytes in 32 bit value. */
|
|
|
|
#ifdef __GNUC__
|
|
|
|
# define bswap_32(x) \
|
|
|
|
(__extension__ \
|
|
|
|
({ unsigned int __bsx = (x); \
|
|
|
|
((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | \
|
|
|
|
(((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); }))
|
|
|
|
#else
|
2003-05-22 17:51:01 +00:00
|
|
|
static inline unsigned int
|
2002-02-28 21:10:42 +00:00
|
|
|
bswap_32 (unsigned int __bsx)
|
|
|
|
{
|
2004-03-14 22:34:33 +00:00
|
|
|
return ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) |
|
|
|
|
(((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24));
|
2002-02-28 21:10:42 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2002-03-19 04:10:06 +00:00
|
|
|
/* From libsdl */
|
2002-02-28 21:10:42 +00:00
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
|
|
#define bswapLE16(X) bswap_16(X)
|
|
|
|
#define bswapLE32(X) bswap_32(X)
|
|
|
|
#define bswapBE16(X) (X)
|
|
|
|
#define bswapBE32(X) (X)
|
|
|
|
#else
|
|
|
|
#define bswapLE16(X) (X)
|
|
|
|
#define bswapLE32(X) (X)
|
|
|
|
#define bswapBE16(X) bswap_16(X)
|
|
|
|
#define bswapBE32(X) bswap_32(X)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|