kopia lustrzana https://github.com/Jean-MarcHarvengt/MCUME
182 wiersze
8.5 KiB
C
Executable File
182 wiersze
8.5 KiB
C
Executable File
/** EMULib Emulation Library *********************************/
|
|
/** **/
|
|
/** Sound.h **/
|
|
/** **/
|
|
/** This file defines standard sound generation API and **/
|
|
/** functions needed to log soundtrack into a MIDI file. **/
|
|
/** See Sound.c and the sound drivers for the code. **/
|
|
/** **/
|
|
/** Copyright (C) Marat Fayzullin 1996-2021 **/
|
|
/** You are not allowed to distribute this software **/
|
|
/** commercially. Please, notify me, if you make any **/
|
|
/** changes to this file. **/
|
|
/*************************************************************/
|
|
#ifndef SOUND_H
|
|
#define SOUND_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define sample short
|
|
#define BPS16 1
|
|
|
|
/* SetSound() arguments: */
|
|
#define SND_MELODIC 0 /* Melodic sound (default) */
|
|
#define SND_RECTANGLE 0 /* Rectangular wave */
|
|
#define SND_TRIANGLE 1 /* Triangular wave (1/2 rect.)*/
|
|
#define SND_NOISE 2 /* White noise */
|
|
#define SND_PERIODIC 3 /* Periodic noise (not im-ed) */
|
|
#define SND_WAVE 4 /* Wave sound set by SetWave()*/
|
|
#define SND_MIDI 0x100 /* MIDI instrument (ORable) */
|
|
|
|
/* Drum() arguments: */
|
|
#define DRM_CLICK 0 /* Click (default) */
|
|
#define DRM_MIDI 0x100 /* MIDI drum (ORable) */
|
|
|
|
/* MIDI characteristics: */
|
|
#define MIDI_CHANNELS 16 /* Number of MIDI channels */
|
|
#define MIDI_MINFREQ 9 /* Min MIDI frequency (Hz) */
|
|
#define MIDI_MAXFREQ 12285 /* Max MIDI frequency (Hz) */
|
|
#define MIDI_DIVISIONS 1000 /* Number of ticks per second */
|
|
|
|
/* MIDILogging() arguments: */
|
|
#define MIDI_OFF 0 /* Turn MIDI logging off */
|
|
#define MIDI_ON 1 /* Turn MIDI logging on */
|
|
#define MIDI_TOGGLE 2 /* Toggle MIDI logging */
|
|
#define MIDI_QUERY 3 /* Query MIDI logging status */
|
|
|
|
/** InitSound() **********************************************/
|
|
/** Initialize RenderSound() with given parameters. **/
|
|
/*************************************************************/
|
|
unsigned int InitSound(unsigned int Rate,unsigned int Latency);
|
|
|
|
/** TrashSound() *********************************************/
|
|
/** Shut down RenderSound() driver. **/
|
|
/*************************************************************/
|
|
void TrashSound(void);
|
|
|
|
/** RenderAudio() ********************************************/
|
|
/** Render given number of melodic sound samples into an **/
|
|
/** integer buffer for mixing. **/
|
|
/*************************************************************/
|
|
void RenderAudio(int *Wave,unsigned int Samples);
|
|
|
|
/** PlayAudio() **********************************************/
|
|
/** Normalize and play given number of samples from the mix **/
|
|
/** buffer. Returns the number of samples actually played. **/
|
|
/*************************************************************/
|
|
unsigned int PlayAudio(int *Wave,unsigned int Samples);
|
|
|
|
/** RenderAndPlayAudio() *************************************/
|
|
/** Render and play a given number of samples. Returns the **/
|
|
/** number of samples actually played. **/
|
|
/*************************************************************/
|
|
unsigned int RenderAndPlayAudio(unsigned int Samples);
|
|
|
|
/** Sound() **************************************************/
|
|
/** Generate sound of given frequency (Hz) and volume **/
|
|
/** (0..255) via given channel. Setting Freq=0 or Volume=0 **/
|
|
/** turns sound off. **/
|
|
/*************************************************************/
|
|
void Sound(int Channel,int Freq,int Volume);
|
|
|
|
/** Drum() ***************************************************/
|
|
/** Hit a drum of given type with given force (0..255). **/
|
|
/** MIDI drums can be used by ORing their numbers with **/
|
|
/** SND_MIDI. **/
|
|
/*************************************************************/
|
|
void Drum(int Type,int Force);
|
|
|
|
/** SetSound() ***********************************************/
|
|
/** Set sound type at a given channel. MIDI instruments can **/
|
|
/** be set directly by ORing their numbers with SND_MIDI. **/
|
|
/*************************************************************/
|
|
void SetSound(int Channel,int NewType);
|
|
|
|
/** SetChannels() ********************************************/
|
|
/** Set master volume (0..255) and switch channels on/off. **/
|
|
/** Each channel N has corresponding bit 2^N in Switch. Set **/
|
|
/** or reset this bit to turn the channel on or off. **/
|
|
/*************************************************************/
|
|
void SetChannels(int Volume,int Switch);
|
|
|
|
/** SetNoise() ***********************************************/
|
|
/** Initialize random noise generator to the given Seed and **/
|
|
/** then take random output from OUTBit and XOR it with **/
|
|
/** XORBit. **/
|
|
/*************************************************************/
|
|
void SetNoise(int Seed,int OUTBit,int XORBit);
|
|
|
|
/** SetWave() ************************************************/
|
|
/** Set waveform for a given channel. The channel will be **/
|
|
/** marked with sound type SND_WAVE. Set Rate=0 if you want **/
|
|
/** waveform to be an instrument or set it to the waveform **/
|
|
/** own playback rate. **/
|
|
/*************************************************************/
|
|
void SetWave(int Channel,const signed char *Data,int Length,int Rate);
|
|
|
|
/** GetWave() ************************************************/
|
|
/** Get current read position for the buffer set with the **/
|
|
/** SetWave() call. Returns 0 if no buffer has been set, or **/
|
|
/** if there is no playrate set (i.e. wave is instrument). **/
|
|
/*************************************************************/
|
|
const signed char *GetWave(int Channel);
|
|
|
|
/** GetSndRate() *********************************************/
|
|
/** Get current sampling rate used for synthesis. **/
|
|
/*************************************************************/
|
|
unsigned int GetSndRate(void);
|
|
|
|
/** InitMIDI() ***********************************************/
|
|
/** Initialize soundtrack logging into MIDI file FileName. **/
|
|
/** Repeated calls to InitMIDI() will close current MIDI **/
|
|
/** file and continue logging into a new one. **/
|
|
/*************************************************************/
|
|
void InitMIDI(const char *FileName);
|
|
|
|
/** TrashMIDI() **********************************************/
|
|
/** Finish logging soundtrack and close the MIDI file. **/
|
|
/*************************************************************/
|
|
void TrashMIDI(void);
|
|
|
|
/** MIDILogging() ********************************************/
|
|
/** Turn soundtrack logging on/off and return its current **/
|
|
/** status. Possible values of Switch are MIDI_OFF (turn **/
|
|
/** logging off), MIDI_ON (turn logging on), MIDI_TOGGLE **/
|
|
/** (toggle logging), and MIDI_QUERY (just return current **/
|
|
/** state of logging). **/
|
|
/*************************************************************/
|
|
int MIDILogging(int Switch);
|
|
|
|
/** MIDITicks() **********************************************/
|
|
/** Log N 1ms MIDI ticks. **/
|
|
/*************************************************************/
|
|
void MIDITicks(int N);
|
|
|
|
#if !defined(MSDOS) & !defined(UNIX) & !defined(MAEMO) & !defined(WINDOWS) & !defined(S60) & !defined(UIQ) && !defined(ANDROID)
|
|
#define SND_CHANNELS MIDI_CHANNELS /* Default number */
|
|
#endif
|
|
|
|
/** SndDriver ************************************************/
|
|
/** Each sound driver should fill this structure with **/
|
|
/** pointers to hardware-dependent handlers. This has to be **/
|
|
/** done inside the InitSound() function. **/
|
|
/*************************************************************/
|
|
struct SndDriverStruct
|
|
{
|
|
void (*SetSound)(int Channel,int NewType);
|
|
void (*Drum)(int Type,int Force);
|
|
void (*SetChannels)(int Volume,int Switch);
|
|
void (*Sound)(int Channel,int NewFreq,int NewVolume);
|
|
void (*SetWave)(int Channel,const signed char *Data,int Length,int Freq);
|
|
const signed char *(*GetWave)(int Channel);
|
|
};
|
|
extern struct SndDriverStruct SndDriver;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* SOUND_H */
|