📄 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 + -