duke3d/audiolib/_al_midi.h

175 lines
4.2 KiB
C
Executable File

/*
Copyright (C) 1994-1995 Apogee Software, Ltd.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef ___AL_MIDI_H
#define ___AL_MIDI_H
#define NO_ADLIB_DETECTION "NOAL"
#define STEREO_DETUNE 5
#define lobyte( num ) ( ( unsigned )*( ( char * )&( num ) ) )
#define hibyte( num ) ( ( unsigned )*( ( ( char * )&( num ) ) + 1 ) )
#define AL_VoiceNotFound -1
#define alFreqH 0xb0
#define alEffects 0xbd
/* Number of slots for the voices on the chip */
#define NumChipSlots 18
#define NUM_VOICES 9
#define NUM_CHANNELS 16
#define NOTE_ON 0x2000 /* Used to turn note on or toggle note */
#define NOTE_OFF 0x0000
#define MAX_VELOCITY 0x7f
#define MAX_OCTAVE 7
#define MAX_NOTE ( MAX_OCTAVE * 12 + 11 )
#define FINETUNE_MAX 31
#define FINETUNE_RANGE ( FINETUNE_MAX + 1 )
#define PITCHBEND_CENTER 1638400
#define note_off 0x80
#define note_on 0x90
#define poly_aftertouch 0xa0
#define control_change 0xb0
#define program_chng 0xc0
#define channel_aftertouch 0xd0
#define pitch_wheel 0xe0
#define MIDI_VOLUME 7
#define MIDI_PAN 10
#define MIDI_DETUNE 94
#define MIDI_ALL_NOTES_OFF 0x7B
#define MIDI_RESET_ALL_CONTROLLERS 0x79
#define MIDI_RPN_MSB 100
#define MIDI_RPN_LSB 101
#define MIDI_DATAENTRY_MSB 6
#define MIDI_DATAENTRY_LSB 38
#define MIDI_PITCHBEND_RPN 0
enum cromatic_scale
{
C = 0x157,
C_SHARP = 0x16B,
D_FLAT = 0x16B,
D = 0x181,
D_SHARP = 0x198,
E_FLAT = 0x198,
E = 0x1B0,
F_FLAT = 0x1B0,
E_SHARP = 0x1CA,
F = 0x1CA,
F_SHARP = 0x1E5,
G_FLAT = 0x1E5,
G = 0x202,
G_SHARP = 0x220,
A_FLAT = 0x220,
A = 0x241,
A_SHARP = 0x263,
B_FLAT = 0x263,
B = 0x287,
C_FLAT = 0x287,
B_SHARP = 0x2AE,
};
/* Definition of octave information to be ORed onto F-Number */
enum octaves
{
OCTAVE_0 = 0x0000,
OCTAVE_1 = 0x0400,
OCTAVE_2 = 0x0800,
OCTAVE_3 = 0x0C00,
OCTAVE_4 = 0x1000,
OCTAVE_5 = 0x1400,
OCTAVE_6 = 0x1800,
OCTAVE_7 = 0x1C00
};
typedef struct VOICE
{
struct VOICE *next;
struct VOICE *prev;
unsigned num;
unsigned key;
unsigned velocity;
unsigned channel;
unsigned pitchleft;
unsigned pitchright;
int timbre;
int port;
unsigned status;
} VOICE;
typedef struct
{
VOICE *start;
VOICE *end;
} VOICELIST;
typedef struct
{
VOICELIST Voices;
int Timbre;
int Pitchbend;
int KeyOffset;
unsigned KeyDetune;
unsigned Volume;
unsigned EffectiveVolume;
int Pan;
int Detune;
unsigned RPN;
short PitchBendRange;
short PitchBendSemiTones;
short PitchBendHundreds;
} CHANNEL;
typedef struct
{
unsigned char SAVEK[ 2 ];
unsigned char Level[ 2 ];
unsigned char Env1[ 2 ];
unsigned char Env2[ 2 ];
unsigned char Wave[ 2 ];
unsigned char Feedback;
signed char Transpose;
signed char Velocity;
} TIMBRE;
extern TIMBRE ADLIB_TimbreBank[ 256 ];
static void AL_ResetVoices( void );
static void AL_CalcPitchInfo( void );
static void AL_SetVoiceTimbre( int voice );
static void AL_SetVoiceVolume( int voice );
static int AL_AllocVoice( void );
static int AL_GetVoice( int channel, int key );
static void AL_SetVoicePitch( int voice );
static void AL_SetChannelVolume( int channel, int volume );
static void AL_SetChannelPan( int channel, int pan );
static void AL_SetChannelDetune( int channel, int detune );
#endif