heavily customized version of DUMB (Dynamic Universal Music Bibliotheque).
It has been slightly modified by me:
* Added support for Ogg Vorbis-compressed samples in XM files ala FMOD.
* Removed excessive mallocs from the replay core.
* Rerolled the loops in resample.c. Unrolling them made the object file
~250k large while providing little benefit. Even at ~100k, I think it's
still larger than it ought to be, but I'll live with it for now.
Other than that, it's essentially the same thing you'd hear in foobar2000,
minus some subsong detection features. Release builds of the library look
like they might even be slightly faster than FMOD, which is a plus.
- Fixed: Timidity::font_add() did not release the file reader it created.
- Fixed: The SF2 loader did not free the sample headers in its destructor.
SVN r995 (trunk)
193 lines
4.7 KiB
C
193 lines
4.7 KiB
C
|
|
#define MUSIC_IT AL_ID('I','M','P','M')
|
|
|
|
typedef struct MODULUS_MUSIC_INFO {
|
|
char Name[29];
|
|
int Type;
|
|
} MODULUS_MUSIC_INFO;
|
|
|
|
#define ENVELOPE_ON 1
|
|
#define ENVELOPE_LOOP_ON 2
|
|
#define ENVELOPE_SUSTAINLOOP 4
|
|
|
|
typedef struct MODULUS_ENVELOPE {
|
|
unsigned char Flag,
|
|
NumNodes,
|
|
LoopBegin, LoopEnd, SustainLoopBegin, SustainLoopEnd; //in nodes.
|
|
char NodeY[25];
|
|
short NodeTick[25];
|
|
} MODULUS_ENVELOPE;
|
|
|
|
typedef struct MODULUS_VENVELOPE {
|
|
char CurNode;
|
|
unsigned char CurTick;
|
|
char End;
|
|
//float CVolume;
|
|
MODULUS_ENVELOPE *Envelope;
|
|
} MODULUS_VENVELOPE;
|
|
|
|
#define NNA_NOTECUT 1
|
|
#define NNA_NOTECONTINUE 2
|
|
#define NNA_NOTEOFF 3
|
|
#define NNA_NOTEFADE 4
|
|
|
|
#define DCT_OFF 0
|
|
#define DCT_NOTE 1
|
|
#define DCT_SAMPLE 2
|
|
#define DCT_INSTRUMENT 3
|
|
|
|
#define DCA_CUT 0
|
|
#define DCA_NOTEOFF 1
|
|
#define DCA_NOTEFADE 2
|
|
|
|
typedef struct MOULUS_INSTRUMENT {
|
|
unsigned char Flag;
|
|
char VolumeLoopNodeStart, VolumeLoopNodeEnd;
|
|
char SustainLoopNodeStart, SustainLoopNodeEnd;
|
|
char DuplicateCheckType;
|
|
char DuplicateCheckAction;
|
|
char NewNoteAction;
|
|
int FadeOut;
|
|
|
|
unsigned char PitchPanSeperation, //0->64, Bit7: Don't use
|
|
PitchPanCenter; //Note, from C-0 to B-9
|
|
unsigned char GlobalVolume, //0->128
|
|
DefaultPan; //0->64, Bit7: Don't use
|
|
|
|
|
|
unsigned char NoteSample[120];
|
|
unsigned char NoteNote[120];
|
|
|
|
MODULUS_ENVELOPE VolumeEnvelope, PanningEnvelope, PitchEnvelope;
|
|
} MODULUS_INSTRUMENT;
|
|
|
|
#define SAMPLE_HASSAMPLE 1
|
|
#define SAMPLE_16BIT 2
|
|
#define SAMPLE_STEREO 4
|
|
#define SAMPLE_USELOOP 16
|
|
#define SAMPLE_USESUSTAINLOOP 32
|
|
#define SAMPLE_PINGPONGLOOP 64
|
|
#define SAMPLE_PINGPONGSUSTAINLOOP 128
|
|
|
|
#define VIBRATO_SINE 0
|
|
#define VIBRATO_RAMPDOWN 1
|
|
#define VIBRATO_SQUARE 2
|
|
#define VIBRATO_RANDOM 3
|
|
|
|
typedef struct MODULUS_SAMPLE {
|
|
unsigned char GlobalVolume; //0->64
|
|
unsigned char Flag;
|
|
unsigned char Volume;
|
|
int SampleLength; //in samples, not bytes !
|
|
int LoopBegin, LoopEnd; //in samples
|
|
int SustainLoopBegin, SustainLoopEnd;
|
|
int C5Speed; //Number of bytes/sec for C-5
|
|
|
|
SAMPLE *Sample;
|
|
|
|
char VibratoSpeed; //0->64
|
|
char VibratoDepth; //0->64
|
|
char VibratoWaveForm;
|
|
char VibratoRate; //0->64
|
|
} MODULUS_SAMPLE;
|
|
|
|
typedef struct MODULUS_NOTE {
|
|
char Mask; //If Bit0: Note, Bit1: Instrument, Bit2: Volume, Bit3: Panning, Bit4: Command
|
|
char Channel; //if -1, then end of row.
|
|
unsigned char Note;
|
|
char Instrument;
|
|
unsigned char Volume, Panning;
|
|
unsigned char Command, CommandValue;
|
|
} MODULUS_NOTE;
|
|
|
|
typedef struct MODULUS_PATTERN {
|
|
int NumRows;
|
|
int NumNotes;
|
|
MODULUS_NOTE *Note;
|
|
} MODULUS_PATTERN;
|
|
|
|
typedef struct MODULUS_VCHANNEL {
|
|
MODULUS_SAMPLE *Sample; //NULL is unused
|
|
char voice;
|
|
char ChannelVolume;
|
|
char NoteOn;
|
|
char NNA;
|
|
short FadeOutCount, FadeOut;
|
|
float MixVolume, MixPan;
|
|
MODULUS_VENVELOPE *VVolumeEnvelope, *VPanningEnvelope, *VPitchEnvelope;
|
|
MODULUS_VCHANNEL *next, *prev;
|
|
} MODULUS_VCHANNEL;
|
|
|
|
typedef struct MODULUS_CHANNEL {
|
|
unsigned char Volume; //0->64
|
|
unsigned char Pan; //0->32->64, 100 = surround, Bit7: Disable
|
|
char LastNote, LastInstrument, LastSample;
|
|
MODULUS_VCHANNEL *VChannel;
|
|
} MODULUS_CHANNEL;
|
|
|
|
#define FLAG_STEREO 1
|
|
#define FLAG_USEINSTRUMENTS 4
|
|
#define FLAG_LINEARSLIDES 8
|
|
#define FLAG_OLDEFFECT 16
|
|
|
|
typedef struct MODULUS {
|
|
MODULUS_INSTRUMENT *Instrument;
|
|
MODULUS_SAMPLE *Sample;
|
|
MODULUS_PATTERN *Pattern;
|
|
|
|
int NumOrders;
|
|
int NumInstruments;
|
|
int NumSamples;
|
|
int NumPatterns;
|
|
int Flags;
|
|
short Version;
|
|
char GlobalVolume;
|
|
char MixVolume;
|
|
unsigned char Speed, Tempo;
|
|
char PanningSeperation;
|
|
|
|
unsigned char *Order;
|
|
|
|
MODULUS_CHANNEL Channel[64];
|
|
|
|
} MODULUS;
|
|
|
|
#define COMMAND_SET_SONG_SPEED 1
|
|
#define COMMAND_JUMP_TO_ORDER 2
|
|
#define COMMAND_PATTERN_BREAK_TO_ROW 3
|
|
#define COMMAND_SET_CHANNEL_VOLUME 13
|
|
#define COMMAND_SET_SONG_TEMPO 20
|
|
#define COMMAND_SET_GLOBAL_VOLUME 22
|
|
|
|
typedef struct MODULUS_PLAY {
|
|
MODULUS *Music;
|
|
int Loop, Tick;
|
|
int CurOrder, CurPattern, CurPos;
|
|
int Command, CommandVal0, CommandVal1, CommandVal2;
|
|
int pos;
|
|
} MODULUS_PLAY;
|
|
extern MODULUS_PLAY *song;
|
|
|
|
extern int IT_Play_Method;
|
|
|
|
MODULUS *load_it(char*);
|
|
int get_module_size(MODULUS *);
|
|
|
|
int play_it(MODULUS *j, int loop);
|
|
void install_modulus();
|
|
void set_mix_volume(int i);
|
|
|
|
void stop_it();
|
|
int is_music_done();
|
|
void destroy_it(MODULUS *j);
|
|
|
|
//Should be internal:
|
|
extern MODULUS_PLAY *song;
|
|
extern int note_freq[120];
|
|
|
|
extern void MOD_Interrupt(...);
|
|
extern int MOD_Poller(void*);
|
|
|
|
#define IT_TIMER 0
|
|
#define IT_POLL 1
|
|
|