diff options
Diffstat (limited to 'tutorials/sndkit/sblive/emu10k.dsp')
-rw-r--r-- | tutorials/sndkit/sblive/emu10k.dsp | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/tutorials/sndkit/sblive/emu10k.dsp b/tutorials/sndkit/sblive/emu10k.dsp new file mode 100644 index 0000000..5bb6022 --- /dev/null +++ b/tutorials/sndkit/sblive/emu10k.dsp @@ -0,0 +1,378 @@ +// + +// DSP code for SB Live (C) 4Front Technologies 2001. All rights reserved. + +#define HAVE_EQ +#define HAVE_SURR_EQ + +#define COPY(a,b) ACC3(a, b, 0, 0) + +// Temporary variables + +.gpr TMP_L +.gpr TMP_R +.gpr PCMTMP_L +.gpr PCMTMP_R +.gpr S_SUM_L +.gpr S_SUM_R +.gpr AUX_L +.gpr AUX_R +.gpr MIC_L +.gpr MIC_R +.gpr VUTMP +.gpr VUTMP2 +.gpr CENTER_TMP +.gpr LFE_TMP +.gpr SURR_TMP_R +.gpr SURR_TMP_L +#ifdef AUDIGY +.gpr SPDIF_TMP_L +.gpr SPDIF_TMP_R +#endif + +// Some parameters that are currently predefined by the assembler +//.parm PCM 100 stereo +//.parm MAIN 100 stereo VOL + +#ifdef HAVE_EQ +#include "equalizer.mac" +#endif + +// Monitor volumes and peak meters + +#ifdef HAVE_EQ +.parm EQUALIZER 0 group + INCLUDE_EQPARMS +#endif + +.parm FRONT 0 group +.parm SPDINVOL 100 mono SPDIF +.parm SPDINMONVU 0 stereopeak - +.parm CDSPDINVOL 100 mono DIGCD +.parm CDSPDINMONVU 0 stereopeak - +.parm AC97VOL 0 mono AC97 +.parm AC97MONVU 0 stereopeak - +.parm FRONTPCM 100 mono PCM +.parm FRONTPCMVU 0 stereopeak - +.parm FRONTAUX 100 mono AUX +.parm FRONTAUXVU 0 stereopeak - +#ifdef AUDIGY +.parm FRONTMIC 100 mono MIC +.parm FRONTMICVU 0 stereopeak - +#endif +.parm FRONTVOL 100 stereo VOL +.parm FRONTVU 0 stereopeak - + +.parm SURR 0 group +.parm R_SPDINVOL 0 mono SPDIF +.parm R_SPDINMONVU 0 stereopeak - +.parm R_CDSPDINVOL 0 mono DIGCD +.parm R_CDSPDINMONVU 0 stereopeak - +.parm R_AC97VOL 0 mono AC97 +.parm R_AC97MONVU 0 stereopeak - +.parm SURRPCM 100 mono PCM +.parm SURRPCMVU 0 stereopeak - +.parm SURRAUX 0 mono AUX +.parm SURRAUXVU 0 stereopeak - +#ifdef AUDIGY +.parm SURRMIC 100 mono MIC +.parm SURRMICVU 0 stereopeak - +#endif +.parm SURRVOL 100 stereo VOL +.parm SURRVU 0 stereopeak - + +// Recording volumes and VU meters +.parm RECORD 0 group +.parm SPDIFREC 100 mono SPDIF +.parm SPDIFVU 0 stereopeak - +.parm CDSPDIFREC 100 mono DIGCD +.parm CDVU 0 stereopeak - +.parm AC97REC 100 mono AC97 +.parm AC97VU 0 stereopeak - +.parm LOOP 0 mono PCM +.parm LOOPVU 0 stereopeak - +.parm RECAUX 100 mono AUX +.parm RECAUXVU 0 stereopeak - +#ifdef AUDIGY +.parm RECMIC 0 mono MIC +.parm RECMICVU 0 stereopeak - +#endif +.parm RECVOL 100 stereo VOL +.parm RECVU 0 stereopeak - + +// Dummy placeholders for the main VU meter. +.gpr VU_L +.gpr VU_R + +#ifdef AUDIGY +#include "emu10k2.mac" +#else +#include "emu10k1.mac" +#endif + +#ifdef AUDIGY +.parm _PASSTHROUGH 0 onoff; +#endif + +#ifdef HAVE_EQ + INCLUDE_EQVARS + INCLUDE_DELAYS(L) + INCLUDE_DELAYS(R) +# ifdef HAVE_SURR_EQ + INCLUDE_DELAYS(SL) + INCLUDE_DELAYS(SR) +# endif +#endif + +#include "vu.mac" + +#ifdef AUDIGY +// Take wavetable engine front sends (0,1) + MACINTS(TMP_L, 0, SEND_L, 1) + MACINTS(TMP_R, 0, SEND_R, 1) + MACS(PCMTMP_L, 0, TMP_L, PCM_L) + MACS(PCMTMP_R, 0, TMP_R, PCM_R) + +// Take raw S/PDIF from the dedicated sends + COPY(SPDIF_TMP_L, SPDIF_L) + COPY(SPDIF_TMP_R, SPDIF_R) + +// Do the same for surround and rear speaker outputs (sum them together) + SUM(S_SUM_L, SEND_SL, SEND_RL, 0) + SUM(S_SUM_R, SEND_SR, SEND_RR, 0) + MACINTS(CENTER_TMP, 0, SEND_C, 1) + MACINTS(LFE_TMP, 0, SEND_W, 1) + MACS(S_SUM_L, 0, S_SUM_L, PCM_L) + MACS(S_SUM_R, 0, S_SUM_R, PCM_R) +#else +// Take wavetable engine front sends (0,1) and multiply them by 4 to boost volume + MACINTS(TMP_L, 0, SEND_L, 4) + MACINTS(TMP_R, 0, SEND_R, 4) + MACS(PCMTMP_L, 0, TMP_L, PCM_L) + MACS(PCMTMP_R, 0, TMP_R, PCM_R) + +// Do the same for rear outputs (2,3) + MACINTS(S_SUM_L, 0, SEND_SL, 4) + MACINTS(S_SUM_R, 0, SEND_SR, 4) + MACS(S_SUM_L, 0, S_SUM_L, PCM_L) + MACS(S_SUM_R, 0, S_SUM_R, PCM_R) +#endif + +// +// Auxiliary input monitors (front channel) +// + + MACS(AUX_L, 0, PCMTMP_L, FRONTPCM) + MACS(AUX_R, 0, PCMTMP_R, FRONTPCM) + VU(FRONTPCMVU_L, AUX_L) + VU(FRONTPCMVU_R, AUX_R) + MACS(AUX_L, AUX_L, CDSPDIFIN_L, CDSPDINVOL) + MACS(AUX_R, AUX_R, CDSPDIFIN_R, CDSPDINVOL) + // CD S/PDIF input monitor VU + VUSCALE(CDSPDINMONVU_L, CDSPDIFIN_L, CDSPDINVOL) + VUSCALE(CDSPDINMONVU_R, CDSPDIFIN_R, CDSPDINVOL) + + MACS(AUX_L, AUX_L, AC97IN_L, AC97VOL) + MACS(AUX_R, AUX_R, AC97IN_R, AC97VOL) + // AC97 monitor VU + VUSCALE(AC97MONVU_L, AC97IN_L, AC97VOL) + VUSCALE(AC97MONVU_R, AC97IN_R, AC97VOL) + + MACS(AUX_L, AUX_L, GPSPDIFIN_L, SPDINVOL) + MACS(AUX_R, AUX_R, GPSPDIFIN_R, SPDINVOL) + // S/PDIF input monitor VU + VUSCALE(SPDINMONVU_L, GPSPDIFIN_L, SPDINVOL) + VUSCALE(SPDINMONVU_R, GPSPDIFIN_R, SPDINVOL) + // Boost S/PDIF input level by summing it twice + MACS(AUX_L, AUX_L, GPSPDIFIN_L, SPDINVOL) + MACS(AUX_R, AUX_R, GPSPDIFIN_R, SPDINVOL) + + // Auxiliary inputs (Live Drive) + MACS(AUX_L, AUX_L, AUXIN_L, FRONTAUX) + MACS(AUX_R, AUX_R, AUXIN_R, FRONTAUX) + VUSCALE(FRONTAUXVU_L, AUXIN_L, FRONTAUX) + VUSCALE(FRONTAUXVU_R, AUXIN_R, FRONTAUX) + +// Apply main volume to the aux input front volume + MACS(AUX_L, 0, AUX_L, MAIN_L) + MACS(AUX_R, 0, AUX_R, MAIN_R) + +#ifdef AUDIGY + // Livedrive mic inputs + MACS(MIC_L, MIC_L, MICIN_L, FRONTMIC) + MACS(MIC_R, MIC_R, MICIN_R, FRONTMIC) + VUSCALE(FRONTMICVU_L, MICIN_L, FRONTMIC) + VUSCALE(FRONTMICVU_R, MICIN_R, FRONTMIC) + +// Apply main volume to the aux input front volume + MACS(MIC_L, 0, AUX_L, MAIN_L) + MACS(MIC_R, 0, AUX_R, MAIN_R) +#endif + +#ifdef HAVE_EQ + EQUALIZER(L, L, AUX_L) + EQUALIZER(R, R, AUX_R) +#endif + +// Secondary sends before applying front volume +#ifdef AUDIGY + MACINTS(SPDOUT1_L, 0, AUX_L, _PASSTHROUGH_OFF) + MACINTS(SPDOUT1_R, 0, AUX_R, _PASSTHROUGH_OFF) + +// S/PDIF passthrough +.const 0x1008 0x1008 +.const 0xffff0000 0xffff0000 +.gpr TMP0 +.gpr TMP1 +.gpr TMP2 + +// Left channel + COPY(TMP2, SPDIF_TMP_L) + SKIP(CCR, CCR, 0x1008, 1) + ACC3(TMP2, 0, 65536, TMP2) + ANDXOR(TMP2, TMP2, 0xffff0000, 0) + MACINTS(TMP0, 0, TMP2, _PASSTHROUGH_ON) + ANDXOR(TMP1, _PASSTHROUGH_ON, 1, 1) + MACINTS(TMP1, 0, AUX_L, TMP1) + ACC3(SPDOUT1_L, TMP0, TMP1, 0) + +// Right channel + COPY(TMP2, SPDIF_TMP_R) + SKIP(CCR, CCR, 0x1008, 1) + ACC3(TMP2, 0, 65536, TMP2) + ANDXOR(TMP2, TMP2, 0xffff0000, 0) + MACINTS(TMP0, 0, TMP2, _PASSTHROUGH_ON) + ANDXOR(TMP1, _PASSTHROUGH_ON, 1, 1) + MACINTS(TMP1, 0, AUX_R, TMP1) + ACC3(SPDOUT1_R, TMP0, TMP1, 0) +#else + COPY(SPDOUT1_L, AUX_L) + COPY(SPDOUT1_R, AUX_R) +#endif + +// Update main peak meters + VU(VU_L, AUX_L) + VU(VU_R, AUX_R) + +// Mix the PCM sends with monitor inputs in and write to front output + MACS(FRONT_L, 0, AUX_L, FRONTVOL_L) + MACS(FRONT_R, 0, AUX_R, FRONTVOL_R) + + MACS(HEADPH_L, 0, AUX_L, FRONTVOL_L) + MACS(HEADPH_R, 0, AUX_R, FRONTVOL_R) + VUSCALE(FRONTVU_L, AUX_L, FRONTVOL_L) + VUSCALE(FRONTVU_R, AUX_R, FRONTVOL_R) + +// +// Auxiliary input monitors (rear channel) +// + + MACS(S_SUM_L, 0, S_SUM_L, SURRPCM) + MACS(S_SUM_R, 0, S_SUM_R, SURRPCM) + VU(SURRPCMVU_L, S_SUM_L) + VU(SURRPCMVU_R, S_SUM_R) + MACS(S_SUM_L, S_SUM_L, CDSPDIFIN_L, R_CDSPDINVOL) + MACS(S_SUM_R, S_SUM_R, CDSPDIFIN_R, R_CDSPDINVOL) + // CD S/PDIF input monitor VU + VUSCALE(R_CDSPDINMONVU_L, CDSPDIFIN_L, R_CDSPDINVOL) + VUSCALE(R_CDSPDINMONVU_R, CDSPDIFIN_R, R_CDSPDINVOL) + + MACS(S_SUM_L, S_SUM_L, AC97IN_L, R_AC97VOL) + MACS(S_SUM_R, S_SUM_R, AC97IN_R, R_AC97VOL) + // AC97 monitor VU + VUSCALE(R_AC97MONVU_L, AC97IN_L, R_AC97VOL) + VUSCALE(R_AC97MONVU_R, AC97IN_R, R_AC97VOL) + + MACS(S_SUM_L, S_SUM_L, GPSPDIFIN_L, R_SPDINVOL) + MACS(S_SUM_R, S_SUM_R, GPSPDIFIN_R, R_SPDINVOL) + // S/PDIF input monitor VU + VUSCALE(R_SPDINMONVU_L, GPSPDIFIN_L, R_SPDINVOL) + VUSCALE(R_SPDINMONVU_R, GPSPDIFIN_R, R_SPDINVOL) + + MACS(S_SUM_L, S_SUM_L, AUXIN_L, SURRAUX) + MACS(S_SUM_R, S_SUM_R, AUXIN_R, SURRAUX) + VUSCALE(SURRAUXVU_L, AUXIN_L, SURRAUX) + VUSCALE(SURRAUXVU_R, AUXIN_R, SURRAUX) +#ifdef AUDIGY + MACS(S_SUM_L, S_SUM_L, MICIN_L, SURRMIC) + MACS(S_SUM_R, S_SUM_R, MICIN_R, SURRMIC) + VUSCALE(SURRMICVU_L, MICIN_L, SURRMIC) + VUSCALE(SURRMICVU_R, MICIN_R, SURRMIC) +#endif +#if 0 + // Boost S/PDIF input level by summing it twice + MACS(S_SUM_L, S_SUM_L, GPSPDIFIN_L, R_SPDINVOL) + MACS(S_SUM_R, S_SUM_R, GPSPDIFIN_R, R_SPDINVOL) +#endif + + MACS(TMP_L, 0, S_SUM_L, MAIN_L) + MACS(TMP_R, 0, S_SUM_R, MAIN_R) +#if defined(HAVE_EQ) && defined(HAVE_SURR_EQ) + EQUALIZER(L, SL, TMP_L) + EQUALIZER(R, SR, TMP_R) +#endif + MACS(SURR_L, 0, TMP_L, SURRVOL_L) + MACS(SURR_R, 0, TMP_R, SURRVOL_R) + +#ifdef AUDIGY + MACS(DSURR_L, 0, TMP_L, SURRVOL_L) + MACS(DSURR_R, 0, TMP_R, SURRVOL_R) +#else + MACS(AC97SURR_L, 0, TMP_L, SURRVOL_L) + MACS(AC97SURR_R, 0, TMP_R, SURRVOL_R) + MACINTS(CENTER_TMP, 0, SEND_C, 1) + MACINTS(LFE_TMP, 0, SEND_W, 1) + +#endif + VUSCALE(SURRVU_L, TMP_L, SURRVOL_L) + VUSCALE(SURRVU_R, TMP_R, SURRVOL_R) + +// +// Misc outputs +// + + SUM(DCENTER, CENTER_TMP, 0, 0) + SUM(DLFE, LFE_TMP, 0, 0) + SUM(ACENTER, CENTER_TMP, 0, 0) + SUM(ALFE, LFE_TMP, 0, 0) + +// +// Recording sources and VU meters +// + + MACS(TMP_L, 0, AC97IN_L, AC97REC) + MACS(TMP_R, 0, AC97IN_R, AC97REC) + VUSCALE(AC97VU_L, AC97IN_L, AC97REC) + VUSCALE(AC97VU_R, AC97IN_R, AC97REC) + + MACS(TMP_L, TMP_L, GPSPDIFIN_L, SPDIFREC) + MACS(TMP_R, TMP_R, GPSPDIFIN_R, SPDIFREC) + VUSCALE(SPDIFVU_L, GPSPDIFIN_L, SPDIFREC) + VUSCALE(SPDIFVU_R, GPSPDIFIN_R, SPDIFREC) + + MACS(TMP_L, TMP_L, CDSPDIFIN_L, CDSPDIFREC) + MACS(TMP_R, TMP_R, CDSPDIFIN_R, CDSPDIFREC) + VUSCALE(CDVU_L, CDSPDIFIN_L, CDSPDIFREC) + VUSCALE(CDVU_R, CDSPDIFIN_R, CDSPDIFREC) + + MACS(TMP_L, TMP_L, PCMTMP_L, LOOP) + MACS(TMP_R, TMP_R, PCMTMP_R, LOOP) + VUSCALE(LOOPVU_L, PCMTMP_L, LOOP) + VUSCALE(LOOPVU_R, PCMTMP_R, LOOP) + + MACS(TMP_L, TMP_L, AUXIN_L, RECAUX) + MACS(TMP_R, TMP_R, AUXIN_R, RECAUX) + VUSCALE(RECAUXVU_L, AUXIN_L, RECAUX) + VUSCALE(RECAUXVU_R, AUXIN_R, RECAUX) + +#ifdef AUDIGY + MACS(TMP_L, TMP_L, MICIN_L, RECMIC) + MACS(TMP_R, TMP_R, MICIN_R, RECMIC) + VUSCALE(RECMICVU_L, MICIN_L, RECMIC) + VUSCALE(RECMICVU_R, MICIN_R, RECMIC) +#endif + + MACS(ADC_L, 0, TMP_L, RECVOL_L) + MACS(ADC_R, 0, TMP_R, RECVOL_R) + VUSCALE(RECVU_L, TMP_L, RECVOL_L) + VUSCALE(RECVU_R, TMP_R, RECVOL_R) |