www.pudn.com > sn068s.zip > SOUND.H


#ifndef SNEeSe_sound_h 
#define SNEeSe_sound_h 
 
#include "misc.h" 
#include "spc.h" 
 
#define OUTPUT_AUDIO_UNSIGNED_8 
#define OUTPUT_AUDIO_UNSIGNED_16 
 
#define ADSR 
/*#define ADSR_OPTIONAL*/ 
 
#define SOUND_FREQ 32000    /* 32kHz true SNES mix speed */ 
#define SOUND_LAG  10       /* Lag between sound mixed and sound heard (1/LAG sec) */ 
 
#define PREMIX_LOWER_LIMIT_16 (-0x8000FF) 
#define PREMIX_UPPER_LIMIT_16 (0x7FFF00) 
#define PREMIX_SHIFT_16 8 
#define PREMIX_LOWER_LIMIT_8 (-0x80FFFF) 
#define PREMIX_UPPER_LIMIT_8 (0x7F0000) 
#define PREMIX_SHIFT_8 16 
 
#ifdef OUTPUT_AUDIO_UNSIGNED_8 
#define OUTPUT_ZERO_BASE_8 0x80 
#define OUTPUT_LOWER_LIMIT_8 0 
#define OUTPUT_UPPER_LIMIT_8 0xFF 
typedef unsigned char output_sample_8; 
#else 
#define OUTPUT_ZERO_BASE_8 0 
#define OUTPUT_LOWER_LIMIT_8 0x80 
#define OUTPUT_UPPER_LIMIT_8 0x7F 
typedef signed char output_sample_8; 
#endif 
 
#ifdef OUTPUT_AUDIO_UNSIGNED_16 
#define OUTPUT_ZERO_BASE_16 0x8000 
#define OUTPUT_LOWER_LIMIT_16 0 
#define OUTPUT_UPPER_LIMIT_16 0xFFFF 
typedef unsigned short output_sample_16; 
#else 
#define OUTPUT_ZERO_BASE_16 0 
#define OUTPUT_LOWER_LIMIT_16 0x8000 
#define OUTPUT_UPPER_LIMIT_16 0x7FFF 
typedef short output_sample_16; 
#endif 
 
#define SPC_CTRL SPCRAM[0xF1] 
#define SPC_DSP_ADDR SPCRAM[0xF2] 
 
#define BRR_PACKET_END  (1 << 0)    /* BRR end block flag */ 
#define BRR_PACKET_LOOP (1 << 1)    /* BRR sample loop flag */ 
 
#define DSP_MAIN_LVOL   0x0C    /* Master volume, left channel */ 
#define DSP_MAIN_RVOL   0x1C    /* Master volume, right channel */ 
#define DSP_ECHO_LVOL   0x2C    /* Echo volume, left channel */ 
#define DSP_ECHO_RVOL   0x3C    /* Echo volume, right channel */ 
#define DSP_KON         0x4C    /* Key on */ 
#define DSP_KOF         0x5C    /* Key off */ 
#define DSP_FLG         0x6C    /* Reset, mute, echo enable, noise frequency */ 
#define DSP_ENDX        0x7C    /* Sample played end-block */ 
 
#define DSP_EFB     0x0D    /* Echo feedback */ 
#define DSP_PMON    0x2D    /* Pitch modulation */ 
#define DSP_NON     0x3D    /* Noise enable */ 
#define DSP_EON     0x4D    /* Echo enable */ 
#define DSP_DIR     0x5D    /* Sample directory */ 
#define DSP_ESA     0x6D    /* Echo start address */ 
#define DSP_EDL     0x7D    /* Echo delay */  
 
#define DSP_VOICE_LVOL      0   /* Voice volume, left channel */ 
#define DSP_VOICE_RVOL      1   /* Voice volume, right channel */ 
#define DSP_VOICE_PITCH_L   2   /* Playback pitch, low 8 bits */ 
#define DSP_VOICE_PITCH_H   3   /* Playback pitch, high 6 bits */ 
#define DSP_VOICE_SRCN      4   /* Source number */ 
#define DSP_VOICE_ADSR1     5   /* ADSR register 1 */ 
#define DSP_VOICE_ADSR2     6   /* ADSR register 2 */ 
#define DSP_VOICE_GAIN      7   /* GAIN register */ 
#define DSP_VOICE_ENVX      8   /* ADSR/GAIN envelope height */ 
#define DSP_VOICE_OUTX      9   /* Envelope-applied sample output */ 
 
#define DSP_FLG_RESET (1 << 7) 
#define DSP_FLG_MUTE  (1 << 6) 
#define DSP_FLG_NECEN (1 << 5) 
 
#define ENVX_MAX 0x7F000000 
 
#ifdef SPC2MHz 
#define SPC_CLOCK_HZ (2048000) 
#else 
#define SPC_CLOCK_HZ (1024000) 
#endif 
 
#define TIMER_0_CYCLES_PER_TICK (SPC_CLOCK_HZ / 8000) 
#define TIMER_1_CYCLES_PER_TICK (SPC_CLOCK_HZ / 8000) 
#define TIMER_2_CYCLES_PER_TICK (SPC_CLOCK_HZ / 64000) 
#define SOUND_CYCLES_PER_SAMPLE (SPC_CLOCK_HZ / 32000) 
#define RELEASE_TIME (SOUND_CYCLES_PER_SAMPLE) 
 
EXTERN unsigned TotalCycles,CycleLatch0,CycleLatch1,CycleLatch2; 
 
EXTERN unsigned SPC_T0_cycle_latch; 
EXTERN unsigned short SPC_T0_position, SPC_T0_target; 
 
EXTERN unsigned SPC_T1_cycle_latch; 
EXTERN unsigned short SPC_T1_position, SPC_T1_target; 
 
EXTERN unsigned SPC_T2_cycle_latch; 
EXTERN unsigned short SPC_T2_position, SPC_T2_target; 
 
EXTERN unsigned char SPC_T0_counter, SPC_T1_counter, SPC_T2_counter; 
 
EXTERN unsigned char SPC_MASK; 
EXTERN unsigned SPC_DSP_DATA; 
EXTERN signed char ENVX_ENABLED, sound_enabled; 
EXTERN int sound_bits; 
 
EXTERN unsigned sound_cycle_latch; 
EXTERN unsigned sound_output_position; 
 
EXTERN int voice_handle; 
EXTERN signed char block_written[2]; 
 
#ifdef ADSR_OPTIONAL 
EXTERN signed char ADSR_ENABLED = -1; 
#endif 
 
EXTERN unsigned char SPC_DSP[256]; 
EXTERN unsigned char SNDkeys; 
 
EXTERN void Remove_Sound(); 
EXTERN int Install_Sound(int stereo); 
EXTERN void Reset_Sound_DSP(); 
 
EXTERN void SPC_READ_DSP(); 
EXTERN void SPC_WRITE_DSP(); 
 
EXTERN void Update_SPC_Timer_0(); 
EXTERN void Update_SPC_Timer_1(); 
EXTERN void Update_SPC_Timer_2(); 
 
EXTERN void sound_pause(void); 
EXTERN void sound_resume(void); 
 
#endif /* SNEeSe_sound_h */