# 1 "A:\SRCci\SNDKEY.CCI"

# 1 "A:\SRCci\SNDKEY.CCI"
# 12 "A:\SRCci\SNDKEY.CCI"
char PltDat[3][16] =
{

{ 0, 0, 0},
{ 0, 0, 0},
{ 7, 7, 8},
{12,12,13},
{ 6, 5, 7},
{ 8, 7, 9},
{10, 9,11},
{11,11,12},

{ 5, 5, 6},
{ 0, 0,11},
{ 0,11, 0},
{ 0,11,11},
{11, 0, 0},
{11, 0,11},
{11,11, 0},
{14,14,15}
};
# 38 "A:\SRCci\SNDKEY.CCI"
int init()
{
DSP_sysInit(0);
KBF_sysInit();
KBF_kan_off();
FDL_sysInit();

sdk_control(0);

DSP_writePage(0);
DSP_setPlt( PltDat );
DSP_boxf(0,24,639,463,0,(0x1000|(((5)&15)<<4)|((6)&15)));

DSP_writePage(1);
DSP_setPlt( PltDat );
DSP_title("Sand Key","1.00",15,7,0,0);
evt_setDspTime( 1, 432, 4, 7, 0 );
SYL_clear();
}

char *SndPtr=0;
char *Bname[8];
int Snd_init()
{
int est;
if ( (SndPtr = calloc(16384,1))==0)
exit(1);
SND_init(SndPtr);
SND_elevol_init();
est=SND_get_elevol_mute();
SND_elevol_mute(est | 3);
return(0);
}
# 78 "A:\SRCci\SNDKEY.CCI"
int term()
{
FDL_sysEnd();
KBF_sysEnd();
DSP_sysEnd();
if (SndPtr)
{
SND_end();
free(SndPtr);
SndPtr=0;
}

}
# 95 "A:\SRCci\SNDKEY.CCI"
int DlgMvFunc(int evtNo, char *sbj)
{
char *dlg;
short fr[4];

dlg = EVT_getPtr(sbj);
fr[0] = DLG_getFr(dlg,0);
fr[1] = DLG_getFr(dlg,1);
fr[2] = DLG_getFr(dlg,2);
fr[3] = DLG_getFr(dlg,3);
if ( DlgMove( fr ) )
{ DLG_move( dlg, fr[0], fr[1] );
}
return ((-2));
}



int x0,y0;
int oct=4;
int key_flag=1;
int P_flag=0;
int inst=0;
char *Iname[8];
char *Ibuf[128];
char *MOJI[2] = {"FM..","PCM."};


int fm_inst_print()
{
int c,i,in;

for (i=0;i<5;i++)
{
if (inst+i-2<0)
in=127+i+inst-1;
else if (inst+i-2>127)
in=inst+i-130;
else
in=inst+i-2;

SND_inst_read(0,in,Ibuf);
strcpy (Iname,"");
strncat (Iname,Ibuf,8);

if (i==2)
c=13;
else
c=8;

DSP_str(x0+110,y0+81+i*9,c,1,
8,"%03d:%-8s",in,Iname);
}
}

int pcm_inst_print()
{
int c,i,in;

for (i=0;i<5;i++)
{
if (inst+i-2<0)
in=31+i+inst-1;
else if (inst+i-2>31)
in=inst+i-34;
else
in=inst+i-2;

SND_inst_read(64,in,Ibuf);
strcpy (Iname,"");
strncat (Iname,Ibuf,8);

if (i==2)
c=13;
else
c=8;

DSP_str(x0+110,y0+81+i*9,c,1,
8,"%03d:%-8s",in,Iname);
}
}

int Inst_print()
{
if (P_flag==1)
{
pcm_inst_print();
return(0);
}

else
{
fm_inst_print();
return(0);
}
}



int Oct_print()
{
DSP_str(x0+66,y0+87,7,8,16,"O%d",oct);
}


int fmbload(char *fn)
{
int i;
P_flag=0;
SND_fm_bank_load(fn,Bname);

for (i=0;i<6;i++)
SND_inst_change(i,inst);
Inst_print();
}

int pmbload(char *fn)
{
int i;
P_flag=1;
SND_pcm_bank_load(fn,Bname);

if (inst>31)
inst=0;

for (i=0;i<8;i++)
SND_inst_change(i+64,inst);
Inst_print();
}

int instload(int flag)
{

char *fdl;
int ret;
char *fn;
char *ext;


if ( (fdl = FDL_open(0))==0 )
return ((-1));
FDL_set_title(fdl,"Inst.LOAD");

if (flag==0)
FDL_set_wildcard(fdl,"*.fmb");
else
FDL_set_wildcard(fdl,"*.pmb");

for(;;)
{
ret=FDL_start(fdl);
if (ret!=(0))
break;
fn=FDL_get_filename(fdl);
if (*fn == '\0')
continue;

if (flag==1)
pmbload(fn);
else
fmbload(fn);

FDL_close(fdl);
return(0);
}
}



int event()
{
char *evt;
int para[1];
char *dlg;
char *mosTk;
int ret;

if ( (evt=EVT_alloc(0,50))==0)
return((-1));
para[0]=evt;
dlg=DLG_open((0x10020),(0x10020),
252,130,8,"setDispFunc",para);

if (dlg==0)
{
EVT_free(evt);
return((-1));
}

mosTk=MOS_push();
DLG_dsp(dlg);


while(1)
{
MOS_curDisp(1);
ret=EVT_chk(evt,0);
if (ret==9999)
break;
}


DLG_close(dlg);
EVT_free(evt);
MOS_pop(mosTk);
return(0);
}


int setDispFunc(char *dlg)
{

int xs,ys,x,y;
char *evt;
int nowCol;
int evtNo;
int para[1];
int i,j;


x0=DLG_getFr(dlg,0);
y0=DLG_getFr(dlg,1);
xs=DLG_getFr(dlg,2);
ys=DLG_getFr(dlg,3);


para=DLG_getPtr(dlg);
evt=para[0];

DSP_boxfHol(x0+2,y0+2,x0+252-1,y0+2+20-1,0,1,7,0);
DSP_str(x0+4,y0+4,7,1,16,"Sand Key");
EVT_set_mos(evt,4,0,(0x02)|(0x10),(1),
x0,y0,x0+252-1,y0+20-1+2,"DlgMvFunc",dlg);

DSP_boxfHol(x0+214,y0+4,x0+248,y0+4+15,0,1,7,8);
DSP_str(x0+216,y0+5,10,1,14,"EXIT");
EVT_set_mos(evt,0,9999,(0x01),(1),
x0+214,y0+4,x0+248,y0+4+15,0,0);

for (i=0;i<2;i++)
{
DSP_boxfHol(x0+252-35,y0+107-i*20,x0+252-2,y0+124-i*20,0,
9,7,1);
DSP_str(x0+252-33,y0+108-i*20,15,9-i,16,MOJI[i]);
EVT_set_mos(evt,1+i*45,i,(0x01),(1),
x0+252-35,y0+107-i*20,x0+252-2,y0+124-i*20,
"instload",0);
}


for(i=0;i<2;i++)
{
DSP_boxHol(x0+22,y0+91+i*18,x0+40,y0+106+i*18,0,
1,0);
DSP_str(x0+23,y0+94+i*18,15,8
,12,"%c%c",0x2d-i*2,0x2d-i*2);
EVT_set_mos(evt,i+2,1-i,(0x01)|(0x10),(1),
x0+22,y0+91+i*18,x0+40,y0+106+i*18,
"InstChange",0);
}

for(i=0;i<2;i++)
{
DSP_boxHol(x0+2,y0+91+i*18,x0+17,y0+106+i*18,0,
1,0);
DSP_str(x0+5,y0+93+i*18,15,8,12,"%c",0x2d-i*2);
EVT_set_mos(evt,i+44,1-i,(0x01),(1),
x0+2,y0+91+i*18,x0+17,y0+106+i*18,
"InstChange",0);

}


DSP_boxfHol(x0+108,y0+79,x0+109+8*12,y0+125,0,
8,1,1);



for (i=0;i<2;i++)
{
DSP_boxfHol(x0+58+i*18,y0+106,x0+73+i*18,y0+110+11,0,
7,15,1);
DSP_str(x0+62+i*18,y0+110,(0x1000|(((1)&15)<<4)|((5)&15)),7
,8,"%c",0x2d-i*2);
EVT_set_mos(evt,i+5,1-i,(0x01),(1),
x0+58+i*18,y0+106,x0+73+i*18,y0+110+11,"OctChange",0);
}

for (i=0;i<22;i++)
{
DSP_boxfHol(x0+16+i*10,y0+24,x0+24+i*10,y0+72,0
,15,7,0);
EVT_set_mos(evt,i+22,i,(0x01),(1),
x0+16+i*10,y0+24,x0+24+i*10,y0+72,"WhiteKey",0);
}

for (j=0;j<3;j++)
{
for (i=0;i<2;i++)
{
DSP_boxfHol(x0+21+i*10+j*70,y0+24,x0+27+i*10+j*70,y0+48,0,
1,2,0);
EVT_set_mos(evt,i+j*5+7,i+j*5,(0x01),(1),
x0+21+i*10+j*70,y0+24,x0+27+i*10+j*70,y0+48,
"BlackKey",0);
}

for (i=0;i<3;i++)
{
DSP_boxfHol(x0+51+i*10+j*70,y0+24,x0+57+i*10+j*70,y0+48,0,
1,2,8);
EVT_set_mos(evt,i+j*5+9,i+j*5+2,(0x01),(1),
x0+51+i*10+j*70,y0+24,x0+57+i*10+j*70,y0+48,
"BlackKey",0);
}
}



Inst_print();
Oct_print();

}

int W_KEY[22] = {0,2,4,5,7,9,11,
12,14,16,17,19,21,23,
24,26,28,29,31,33,35,
36};

int B_KEY[15] = {1,3,6,8,10,13,15,18,20,22,
25,27,30,32,34};


int KeyOff()
{
SND_key_off(key_flag+P_flag*64);
key_flag++;
if (key_flag>5)
key_flag=0;
}

int WhiteKey(int cl)
{
KeyOff();
SND_key_on(key_flag+P_flag*64,oct*12+W_KEY[cl],120);
}

int BlackKey(int cl)
{
KeyOff();
SND_key_on(key_flag+P_flag*64,oct*12+B_KEY[cl],120);
}


int OctChange(int cl)
{
if (cl==0)
{
oct++;
if (oct>6)
oct=6;
}
else
{
oct--;
if (oct<1)
oct=1;
}

Oct_print();
}



int Tone(int inst)
{
int i;
for(i=0;i<6;i++)
SND_inst_change(i+P_flag*64,inst);
}


int InstChange(int cl)
{
int i;

for (i=0;i<6;i++)
SND_key_abort(P_flag*64+i);

if (cl==0)
{
inst++;
if (inst>127-P_flag*96)
{
inst=0;
}
}
else
{
inst--;
if (inst<0)
{
inst=127-P_flag*96;
}
}
Tone(inst);

Inst_print();
}
# 509 "A:\SRCci\SNDKEY.CCI"
int main( int argc, char **argv )
{
init();
Snd_init();

event();
term();
return (0);
}
