home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
- The C Include file for the dissidents' samp.library. This library reads
- and writes SAMP files. Set your editor's TAB width to 3.
-
- Version 1.0 Dec 1989
-
- by Jim Fiore and Jeff Glatt
-
- ****************************************************************************/
-
- #ifndef SAMP_H
- #define SAMP_H
-
- /* ============ SAMP.LIB ERROR CODES ============ */
- #define SUCCESS 0 /* Operation successful */
- #define LIBINUSE 1 /* Some other task is using samp.library */
- #define NOOPENFILE 2 /* Cannot open the file */
- #define NOTSAMP 3 /* Not a SAMP file */
- #define BADSAMP 4 /* Bad SAMP file */
- #define NOSUPPORT equ 5 /* SAMP file not supported */
- #define OUTOFRANGE 6 /* Too few waves in the file */
- #define OUTOFMEM 7 /* No mem to load the next wave */
- #define NOMOREWAVES 8 /* No more waves in the file */
- #define USERABORT 9 /* Application Abort */
-
- /*
- #define ID_SAMP MakeID('S','A','M','P')
- #define ID_NAME MakeID('N','A','M','E')
- */
-
- /* ======================= The SAMP file MHDR chunk ===================== */
-
- #define ID_MHDR MakeID('M','H','D','R')
-
- /* MHDR size is dependant on the size of the imbedded playMap. */
-
- typedef struct {
- UBYTE NumOfWaves, /* The number of waves in this file */
- Format, /* # of ORIGINAL significant bits from 8-28 */
- Flags, /* Various bits indicate various functions */
- PlayMode, /* determines play MODE of the playMap */
- NumOfChans,
- Pad,
- PlayMap[128][4]; /* a map of which wave numbers to use for
- each of 128 possible Midi Notes. Default to 4 */
- } MHDRChunk;
-
- #define INDEPENDANT 0
- #define MULTI 1
- #define STEREO 2
- #define PAN 3
-
-
- /* ====================== The SAMP file BODY chunk ====================== */
-
- #define ID_BODY MakeID('B','O','D','Y')
-
- /* Every wave has an 80 byte waveHeader, followed by its data. The waveHeader
- structure is as follows: */
-
- typedef struct {
- ULONG WaveSize;
- USHORT MidiSampNum;
- UBYTE LoopType, InsType;
- ULONG Period, Rate, LoopStart, LoopEnd;
- UBYTE RootNote, VelStart;
- USHORT VelTable[16];
- ULONG ATAKsize, RLSEsize, FATKsize, FRLSsize, USERsize;
- USHORT USERtype;
- } waveHeader;
-
- #define SPECIFIC 0
- #define VOLMOD 1
- #define PERMOD 2
- #define LOOPING 3
-
-
- /* ================ SAMPlib SampleHeader64 structure ============= */
- /* Used by the lib to load SAMP files */
-
- struct SampleHeader64
- {
- BYTE *OneShotAddr;
- UBYTE Flags; /* bit 7 on = no overlay */
- UBYTE VelStart;
- USHORT VelTable[16];
- BYTE *OneShotEnd; /* loop start, as well */
- USHORT *TransTable; /* points to ORIGINAL_PITCH */
- USHORT RootNote;
- ULONG LoopLength; /* in words, bit 31 cannot be set */
- UBYTE AttackRate; /* 0 - 255 */
- UBYTE AttackInc; /* 1 - 64 */
- UBYTE DecayRate; /* 1 - 255 */
- UBYTE DecayDec; /* 1 - 64 */
- UBYTE SustLevel; /* 0 - 64 */
- UBYTE ReleaseRate; /* 1 - 255 */
- UBYTE ReleaseDec; /* 1 - 64 */
- UBYTE ClipNote;
- ULONG WaveSize; /* in bytes */
- };
-
- /* ====================== For the Transpose table ==================== */
- /* For playback of the wave */
-
- struct TransposeNode
- {
- struct TransposeNode *Next;
- struct TransposeNode *Prev;
- ULONG Rate;
- USHORT *Orig;
- ULONG TSize;
- };
-
- #define AUDIO_HARDWARE_FUDGE .279365
-
-
- /* =================== the library's SAMPInfo structure ================ */
-
- struct SAMPInfo
- { struct FileHandle *Handle;
- UBYTE SAMP[4];
- ULONG FileSize;
- UBYTE MHDR[4];
- ULONG MHDRsize;
- UBYTE NumOfWaves,
- SampleFormat,
- Flags,
- PlayMode,
- NumOfChans,
- Pad,
- PlayMap[128][4];
- ULONG ANNOChunk, /* DOS Seek() offset from beginning of file to ANNO chunk */
- BODYChunk,
- NAMEChunk,
- AUTHChunk,
- COPYChunk;
- APTR ATAK,
- RLSE,
- FATK, /* Vector for the application's FATK routine */
- FRLS,
- USER,
- EXTRA;
- ULONG SeekPos;
- ULONG MemType; /* AllocMem() attributes of mem where sample data is loaded */
- USHORT MaxChars, /* Max # of chars in string buffer */
- LowPer,
- HighPer;
- };
-
- /* ======================== Instrument types ========================= */
- /* You can construct the InsType field by OR'ing the family with the
- class. For example,
-
- InsType = STRING | VIOLA_BOW;
- */
-
- /* Instrument Families */
- #define STRING 0x10
- #define WOODWIND 0x20
- #define KEYBOARD 0x30
- #define GUITAR 0x40
- #define VOICE 0x50
- #define DRUM1 0x60
- #define DRUM2 0x70
- #define PERCUSSION1 0x80
- #define BRASS1 0x90
- #define BRASS2 0xA0
- #define CYMBAL 0xB0
- #define EFFECT1 0xC0
- #define EFFECT2 0xD0
- #define SYNTH 0xE0
-
- /* Instrument Classes */
-
- /* For the STRING family, the high nibble is as follows: */
-
- #define VIOLIN_BOW 0x1
- #define VIOLIN_PLUCK 0x2
- #define VIOLIN_GLIS 0x3
- #define VIOLIN_TREM 0x4
- #define VIOLA_BOW 0x5
- #define VIOLA_PLUCK 0x6
- #define VIOLA_GLIS 0x7
- #define VIOLA_TREM 0x8
- #define CELLO_BOW 0x9
- #define CELLO_PLUCK 0xA
- #define CELLO_GLIS 0xB
- #define CELLO_TREM 0xC
- #define BASS_BOW 0xD
- #define BASS_PLUCK 0xE
- #define BASS_TREM 0xF
-
- /* For the BRASS1 family, the high nibble is as follows: */
-
- #define BARITONE_SAX 0x1
- #define BARI_GROWL 0x2
- #define TENOR_SAX 0x3
- #define TENOR_GROWL 0x4
- #define ALTO_SAX 0x5
- #define ALTO_GROWL 0x6
- #define SOPRANO_SAX 0x7
- #define SOPRANO_GROWL 0x8
- #define TRUMPET 0x9
- #define MUTED_TRUMPET 0xA
- #define TRUMPET_DROP 0xB
- #define TROMBONE 0xC
- #define TROMBONE_SLIDE 0xD
- #define TROMBONE_MUTE 0xE
-
- /* For the BRASS2 family, the high nibble is as follows: */
-
- #define FRENCH_HORN 0x1
- #define TUBA 0x2
- #define FLUGAL_HORN 0x3
- #define ENGLISH_HORN 0x4
-
- /* For the WOODWIND family, the high nibble is as follows: */
-
- #define CLARINET 0x1
- #define FLUTE 0x2
- #define PAN_FLUTE 0x3
- #define OBOE 0x4
- #define PICCOLO 0x5
- #define RECORDER 0x6
- #define BASSOON 0x7
- #define BASS_CLARINET 0x8
- #define HARMONICA 0x9
-
- /* For the KEYBOARD family, the high nibble is as follows: */
-
- #define GRAND_PIANO 0x1
- #define ELEC_PIANO 0x2
- #define HONKYTONK 0x3
- #define TOY_PIANO 0x4
- #define HARPSICHORD 0x5
- #define CLAVINET 0x6
- #define PIPE_ORGAN 0x7
- #define HAMMOND_B3 0x8
- #define FARFISA_ORGAN 0x9
- #define HARP 0xA
-
- /* For the DRUM1 family, the high nibble is as follows: */
-
- #define KICK 0x1
- #define SNARE 0x2
- #define TOM 0x3
- #define TIMBALES 0x4
- #define CONGA_HIT 0x5
- #define CONGA_SLAP 0x6
- #define BRUSH_SNARE 0x7
- #define ELEC_SNARE 0x8
- #define ELEC_KICK 0x9
- #define ELEC_TOM 0xA
- #define RIMSHOT 0xB
- #define CROSS_STICK 0xC
- #define BONGO 0xD
- #define STEEL_DRUM 0xE
- #define DOUBLE_TOM 0xF
-
- /* For the DRUM2 family, the high nibble is as follows: */
-
- #define TIMPANI 0x1
- #define TIMPANI_ROLL 0x2
- #define LOG_DRUM 0x3
-
- /* For the PERCUSSION1 family, the high nibble is as follows: */
-
- #define BLOCK 0x1
- #define COWBELL 0x2
- #define TRIANGLE 0x3
- #define TAMBOURINE 0x4
- #define WHISTLE 0x5
- #define MARACAS 0x6
- #define BELL 0x7
- #define VIBES 0x8
- #define MARIMBA 0x9
- #define XYLOPHONE 0xA
- #define TUBULAR_BELLS 0xB
- #define GLOCKENSPEIL 0xC
-
- /* For the CYMBAL family, the high nibble is as follows: */
-
- #define CLOSED_HIHAT 0x1
- #define OPEN_HIHAT 0x2
- #define STEP_HIHAT 0x3
- #define RIDE 0x4
- #define BELL_CYMBAL 0x5
- #define CRASH 0x6
- #define CHOKE_CRASH 0x7
- #define GONG 0x8
- #define BELL_TREE 0x9
- #define CYMBAL_ROLL 0xA
-
- /* For the GUITAR family, the high nibble is as follows: */
-
- #define ELECTRIC 0x1
- #define MUTED_ELEC 0x2
- #define DISTORTED 0x3
- #define ACOUSTIC 0x4
- #define STRING_12 0x5
- #define NYLON_STRING 0x6
- #define POWER_CHORD 0x7
- #define HARMONICS 0x8
- #define CHORD_STRUM 0x9
- #define BANJO 0xA
- #define ELEC_BASS 0xB
- #define SLAPPED_BASS 0xC
- #define POPPED_BASS 0xD
- #define SITAR 0xE
- #define MANDOLIN 0xF
-
- /* For the VOICE family, the high nibble is as follows: */
-
- #define MALE_AHH 0x1
- #define FEMALE_AHH 0x2
- #define MALE_OOO 0x3
- #define FEMALE_OOO 0x4
- #define FEMALE 0x5
- #define BREATHY 0x6
- #define LAUGH 0x7
- #define WHISTLER 0x8
-
- /* For the EFFECTS1 family, the high nibble is as follows: */
-
- #define EXPLOSION 0x1
- #define GUNSHOT 0x2
- #define CREAKING_DOOR 0x3
- #define DOOR_SLAM 0x4
- #define DOOR_CLOSE 0x5
- #define SPACEGUN 0x6
- #define JET_ENGINE 0x7
- #define PROPELLER 0x8
- #define HELOCOPTER 0x9
- #define BROKEN_GLASS 0xA
- #define THUNDER 0xB
- #define RAIN 0xC
- #define BIRDS 0xD
- #define JUNGLE_NOISES 0xE
- #define FOOTSTEP 0xF
-
- /* For the EFFECTS2 family, the high nibble is as follows: */
-
- #define MACHINE_GUN 0x1
- #define TELEPHONE 0x2
- #define DOG_BARK 0x3
- #define DOG_GROWL 0x4
- #define BOAT_WHISTLE 0x5
- #define OCEAN 0x6
- #define WIND 0x7
- #define CROWD_BOOS 0x8
- #define APPLAUSE 0x9
- #define ROARING_CROWDS 0xA
- #define SCREAM 0xB
- #define SWORD_CLASH 0xC
- #define AVALANCE 0xD
- #define BOUNCING_BALL 0xE
- #define BALL_ON_BAT 0xF /* OR CLUB */
-
- /* For the SYNTH family, the high nibble is as follows: */
-
- #define SYNTH_STRINGS 0x1
- #define SQUARE_WAVE 0x2
- #define SAWTOOTH_WAVE 0x3
- #define TRI_WAVE 0x4
- #define SINE_WAVE 0x5
- #define NOISE 0x6
-
- /* ======================== SAMP.LIB ROUTINES ========================= */
-
- struct SAMPInfo *OpenSampWrite();
- struct SAMPInfo *OpenSampRead();
- BOOL WriteWaves(), WriteNames(), WriteMHDR(), WriteSampChunk(), WriteSampData();
- void CloseSamp();
- void LoadPlaymap();
- void MixPlaymap();
- SHORT ReadWaves();
- USHORT *MakeTransTable();
- UBYTE *SAMPErrorMsg();
-
- #endif
-