📄 mzpokeysnd.c
字号:
if(flags & SND_BIT16) { filter_data = filter_22; filter_size = filter_size_22; } else { filter_data = filter_22_8; filter_size = filter_size_22_8; } pokey_frq = 1786050; /* 0.2% off ideal */ audible_frq = 10000; /* 30db filter attenuation */ break; case 11025: if(flags & SND_BIT16) { filter_data = filter_11; filter_size = filter_size_11; } else { filter_data = filter_11_8; filter_size = filter_size_11_8; } pokey_frq = 1786050; /* 0.2% off ideal */ audible_frq = 4500; /* 30db filter attenuation */ break; case 48000: if(flags & SND_BIT16) { filter_data = filter_48; filter_size = filter_size_48; } else { filter_data = filter_48_8; filter_size = filter_size_48_8; } pokey_frq = 1776000; /* 0.7% off ideal */ audible_frq = 20000; /* ultrasound */ break; case 8000: if(flags & SND_BIT16) { filter_data = filter_8; filter_size = filter_size_8; } else { filter_data = filter_8_8; filter_size = filter_size_8_8; } pokey_frq = 1792000; /* 0.1% off ideal */ audible_frq = 4000; /* Nyquist, also 30db attn, should be 50 */ break;#endif
default: //TCPMP precalced filter table 44100hz 16bit
{
#include "filter.h"
memset(filter_data,0,sizeof(filter_data));
memcpy(filter_data,filter_44,sizeof(filter_44));
filter_size = sizeof(filter_44)/sizeof(filter_44[0]);
pokey_frq = 1808100;
audible_frq = 20947;
break;
}
/* default: pokey_frq = (int)(((double)pokey_frq_ideal/sample_rate) + 0.5) * sample_rate; filter_size = remez_filter_table((double)sample_rate/pokey_frq, &cutoff, quality); audible_frq = (unsigned) (cutoff * pokey_frq);
{
#include <stdio.h>
int i;
FILE* f = fopen("\\filter.h","w+");
fprintf(f,"static const double filter_44[%d] = {\n",filter_size);
for (i=0;i<filter_size;++i)
fprintf(f,"%13.13f,\n",filter_data[i]);
fprintf(f,"};\n");
fclose(f);
}
*/ } build_poly4(); build_poly5(); build_poly9(); build_poly17();#ifdef __PLUS if (clear_regs)#endif { ResetPokeyState(pokey_states); ResetPokeyState(pokey_states + 1); } num_cur_pokeys = num_pokeys; return 0; /* OK */}/*****************************************************************************//* Function: Update_pokey_sound() *//* *//* Inputs: addr - the address of the parameter to be changed *//* val - the new value to be placed in the specified address *//* gain - specified as an 8-bit fixed point number - use 1 for no *//* amplification (output is multiplied by gain) *//* *//* Outputs: Adjusts local globals - no return value *//* *//*****************************************************************************/static void Update_readout_0(PokeyState* ps){ if(ps->c0vo) ps->readout_0 = readout0_vo; else if(ps->c0sw4) ps->readout_0 = readout0_hipass; else ps->readout_0 = readout0_normal;}static void Update_readout_1(PokeyState* ps){ if(ps->c1vo) ps->readout_1 = readout1_vo; else if(ps->c1sw4) ps->readout_1 = readout1_hipass; else ps->readout_1 = readout1_normal;}static void Update_readout_2(PokeyState* ps){ if(ps->c2vo) ps->readout_2 = readout2_vo; else ps->readout_2 = readout2_normal;}static void Update_readout_3(PokeyState* ps){ if(ps->c3vo) ps->readout_3 = readout3_vo; else ps->readout_3 = readout3_normal;}static void Update_event0(PokeyState* ps){ if(ps->c0sw3) { if(ps->c0sw2) ps->event_0 = event0_pure; else { if(ps->c0sw1) ps->event_0 = event0_p4; else ps->event_0 = event0_p917; } } else { if(ps->c0sw2) ps->event_0 = event0_p5; else { if(ps->c0sw1) ps->event_0 = event0_p4_p5; else ps->event_0 = event0_p917_p5; } }}static void Update_event1(PokeyState* ps){ if(ps->c1sw3) { if(ps->c1sw2) ps->event_1 = event1_pure; else { if(ps->c1sw1) ps->event_1 = event1_p4; else ps->event_1 = event1_p917; } } else { if(ps->c1sw2) ps->event_1 = event1_p5; else { if(ps->c1sw1) ps->event_1 = event1_p4_p5; else ps->event_1 = event1_p917_p5; } }}static void Update_event2(PokeyState* ps){ if(ps->c2sw3) { if(ps->c2sw2) ps->event_2 = event2_pure; else { if(ps->c2sw1) ps->event_2 = event2_p4; else ps->event_2 = event2_p917; } } else { if(ps->c2sw2) ps->event_2 = event2_p5; else { if(ps->c2sw1) ps->event_2 = event2_p4_p5; else ps->event_2 = event2_p917_p5; } }}static void Update_event3(PokeyState* ps){ if(ps->c3sw3) { if(ps->c3sw2) ps->event_3 = event3_pure; else { if(ps->c3sw1) ps->event_3 = event3_p4; else ps->event_3 = event3_p917; } } else { if(ps->c3sw2) ps->event_3 = event3_p5; else { if(ps->c3sw1) ps->event_3 = event3_p4_p5; else ps->event_3 = event3_p917_p5; } }}static void Update_c0divstart(PokeyState* ps){ if(ps->c1_f0) { if(ps->c0_hf) { ps->c0divstart = 256; ps->c0divstart_p = ps->c0diva + 7; } else { ps->c0divstart = 256 * ps->mdivk; ps->c0divstart_p = (ps->c0diva+1)*ps->mdivk; } } else { if(ps->c0_hf) ps->c0divstart = ps->c0diva + 4; else ps->c0divstart = (ps->c0diva+1) * ps->mdivk; }}static void Update_c1divstart(PokeyState* ps){ if(ps->c1_f0) { if(ps->c0_hf) ps->c1divstart = ps->c0diva + 256*ps->c1diva + 7; else ps->c1divstart = (ps->c0diva + 256*ps->c1diva + 1) * ps->mdivk; } else ps->c1divstart = (ps->c1diva + 1) * ps->mdivk;}static void Update_c2divstart(PokeyState* ps){ if(ps->c3_f2) { if(ps->c2_hf) { ps->c2divstart = 256; ps->c2divstart_p = ps->c2diva + 7; } else { ps->c2divstart = 256 * ps->mdivk; ps->c2divstart_p = (ps->c2diva+1)*ps->mdivk; } } else { if(ps->c2_hf) ps->c2divstart = ps->c2diva + 4; else ps->c2divstart = (ps->c2diva+1) * ps->mdivk; }}static void Update_c3divstart(PokeyState* ps){ if(ps->c3_f2) { if(ps->c2_hf) ps->c3divstart = ps->c2diva + 256*ps->c3diva + 7; else ps->c3divstart = (ps->c2diva + 256*ps->c3diva + 1) * ps->mdivk; } else ps->c3divstart = (ps->c3diva + 1) * ps->mdivk;}static void Update_audctl(PokeyState* ps, unsigned char val){ unsigned char nc0_hf,nc2_hf,nc1_f0,nc3_f2,nc0sw4,nc1sw4,new_divk; unsigned char recalc0=0; unsigned char recalc1=0; unsigned char recalc2=0; unsigned char recalc3=0; unsigned int cnt0 = 0; unsigned int cnt1 = 0; unsigned int cnt2 = 0; unsigned int cnt3 = 0; nc0_hf = (val & 0x40) != 0; nc2_hf = (val & 0x20) != 0; nc1_f0 = (val & 0x10) != 0; nc3_f2 = (val & 0x08) != 0; nc0sw4 = (val & 0x04) != 0; nc1sw4 = (val & 0x02) != 0; if(val & 0x01) new_divk = 114; else new_divk = 28; if(new_divk != ps->mdivk) { recalc0 = recalc1 = recalc2 = recalc3 = 1; } if(nc1_f0 != ps->c1_f0) { recalc0 = recalc1 = 1; } if(nc3_f2 != ps->c3_f2) { recalc2 = recalc3 = 1; } if(nc0_hf != ps->c0_hf) { recalc0 = 1; if(nc1_f0) recalc1 = 1; } if(nc2_hf != ps->c2_hf) { recalc2 = 1; if(nc3_f2) recalc3 = 1; } if(recalc0) { if(ps->c0_hf) cnt0 = ps->c0divpos; else cnt0 = ps->c0divpos/ps->mdivk; } if(recalc1) { if(ps->c1_f0) { if(ps->c0_hf) cnt1 = ps->c1divpos/256; else cnt1 = ps->c1divpos/256/ps->mdivk; } else { cnt1 = ps->c1divpos/ps->mdivk; } } if(recalc2) { if(ps->c2_hf) cnt2 = ps->c2divpos; else cnt2 = ps->c2divpos/ps->mdivk; } if(recalc3) { if(ps->c3_f2) { if(ps->c2_hf) cnt3 = ps->c3divpos/256; else cnt3 = ps->c3divpos/256/ps->mdivk; } } if(recalc0) { if(nc0_hf) ps->c0divpos = cnt0; else ps->c0divpos = cnt0*new_divk; } if(recalc1) { if(nc1_f0) { if(nc0_hf) ps->c1divpos = cnt1*256+cnt0; else ps->c1divpos = (cnt1*256+cnt0)*new_divk; } else { ps->c1divpos = cnt1*new_divk; } } if(recalc2) { if(nc2_hf) ps->c2divpos = cnt2; else ps->c2divpos = cnt2*new_divk; } if(recalc3) { if(nc3_f2) { if(nc2_hf) ps->c3divpos = cnt3*256+cnt2; else ps->c3divpos = (cnt3*256+cnt2)*new_divk; } } ps->c0_hf = nc0_hf; ps->c2_hf = nc2_hf; ps->c1_f0 = nc1_f0; ps->c3_f2 = nc3_f2; ps->c0sw4 = nc0sw4; ps->c1sw4 = nc1sw4; ps->mdivk = new_divk;}static void Update_c0stop(PokeyState* ps){ unsigned long lim = pokey_frq/2/audible_frq; unsigned char hfa = 0; ps->c0stop = 0; if(ps->c0vo || ps->vol0 == 0) ps->c0stop = 1; else if(!ps->c0sw4 && ps->c0sw3 && ps->c0sw2) /* If channel 0 is a pure tone... */ { if(ps->c1_f0) { if(ps->c1divstart <= lim) { ps->c0stop = 1; hfa = 1; } } else { if(ps->c0divstart <= lim) { ps->c0stop = 1; hfa = 1; } } } else if(!ps->c0sw4 && ps->c0sw3 && !ps->c0sw2 && ps->c0sw1) /* if channel 0 is poly4... */ { /* period for poly4 signal is 15 cycles */ if(ps->c1_f0) { if(ps->c1divstart <= lim*2/15) /* all poly4 signal is above Nyquist */ { ps->c0stop = 1; hfa = 1; } } else { if(ps->c0divstart <= lim*2/15) { ps->c0stop = 1; hfa = 1; } } } ps->outvol_0 = 2*ps->readout_0(ps); if(hfa) ps->outvol_0 = ps->vol0;}static void Update_c1stop(PokeyState* ps){ unsigned long lim = pokey_frq/2/audible_frq; unsigned char hfa = 0; ps->c1stop = 0; if(!ps->c1_f0 && (ps->c1vo || ps->vol1 == 0)) ps->c1stop = 1; else if(!ps->c1sw4 && ps->c1sw3 && ps->c1sw2 && ps->c1divstart <= lim) /* If channel 1 is a pure tone */ { ps->c1stop = 1; hfa = 1; } else if(!ps->c1sw4 && ps->c1sw3 && !ps->c1sw2 && ps->c1sw1 && ps->c1divstart <= lim*2/15) /* all poly4 signal is above Nyquist */ { ps->c1stop = 1; hfa = 1; } ps->outvol_1 = 2*ps->readout_1(ps); if(hfa) ps->outvol_1 = ps->vol1;}static void Update_c2stop(PokeyState* ps){ unsigned long lim = pokey_frq/2/audible_frq; unsigned char hfa = 0; ps->c2stop = 0; if(!ps->c0sw4 && (ps->c2vo || ps->vol2 == 0)) ps->c2stop = 1; /* If channel 2 is a pure tone and no filter for c0... */ else if(ps->c2sw3 && ps->c2sw2 && !ps->c0sw4) { if(ps->c3_f2) { if(ps->c3divstart <= lim) { ps->c2stop = 1; hfa = 1; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -