/*
 *	***  EUP BGM演奏用ヘッダファイル  ***
 *
 *	**  Sample  **
 *
 *	char	path[]="a.eup";		演奏ファイル名
 *	char	eup_buf[100000];	演奏データバッファ
 *	int	buf_size;		バッファサイズ
 *	int	sign;			曲の先頭の拍子
 *
 *	eup_init();
 *	eup_load((char *)path , (char *)eup_buf , &buf_size , &sign);
 *	SND_eup_play_start((char *)eup_buf , buf_size , sign);
 *	  wait
 *	eup_term();
 *
 */



/*  関数のプロトタイプ宣言  */
void	eup_init(void);				/*  EUP初期化		*/
void	eup_term(void);				/*  EUP開放		*/
int	eup_set(char *,char *,int ,int *);	/*  EUPの演奏設定のみ	*/
int	eup_load(char *,char *,int *,int *);	/*  EUPの読込&設定	*/


char swork[16384];			/*　サウンドドライバ作業領域	*/



void eup_init(void)
{
int	_mute_data;

	SND_init(swork);
	SND_elevol_set(0,127,127);
	_mute_data=SND_get_elevol_mute( 0 );
	SND_elevol_mute(_mute_data | 0x0f);
	SND_eup_init();
	SND_rs_midi_init();
}


void eup_term(void)
{
	SND_rs_midi_end();
	SND_eup_end();
	SND_end();
}


int eup_set(char *path,char *eup_buf,int flen,int *signature)
{
int	i,size,tempo;
char	buffer[128];
char	bankpath[128];
char	fm_bankname[8];
char	pcm_bankname[8];
FILE	*fp;

	if (flen<=2048+4+1+1) return(1);

	for(i=0;i<32;i++) SND_eup_mute_set(i,(int)eup_buf[i+852]);
	for(i=0;i<32;i++) SND_eup_port_set(i,(int)eup_buf[i+884]);
	for(i=0;i<32;i++) SND_eup_midi_ch_set(i,(int)eup_buf[i+916]);
	for(i=0;i<32;i++) SND_eup_bias_set(i,(int)eup_buf[i+948]);
	for(i=0;i<32;i++) SND_eup_transpose_set(i,(int)eup_buf[i+980]);
	for(i=0;i< 6;i++) SND_midi_ch_assign(i,(int)eup_buf[i+1748]);
	for(i=0;i< 8;i++) SND_midi_ch_assign(i+64,(int)eup_buf[i+1754]);
	SND_pcm_mode_set(0);

	for(i=0;path[i]!='\0';i++) bankpath[i]=path[i];

	memcpy(&bankpath[i],&eup_buf[1762],8);
	if(bankpath[i]!='\0'){
	  strcat(bankpath,".fmb");
	  SND_fm_bank_load(bankpath,fm_bankname);
	  }

	memcpy(&bankpath[i],&eup_buf[1770],8);
	if(bankpath[i]!='\0'){
	  strcat(bankpath,".pmb");
	  SND_pcm_bank_load(bankpath,pcm_bankname);
	  }

	*signature=(int)eup_buf[2052];
	tempo=(int)eup_buf[2053];
	SND_eup_tempo_set(tempo);
}


int eup_load(char *path,char *eup_buf,int *flen,int *signature)
{
int	i,j,size,tempo;
char	buffer[128];
char	bankpath[128];
char	fm_bankname[8];
char	pcm_bankname[8];
FILE	*fp;

	if((fp=fopen(path,"rb")) == NULL) return(1);
	fseek(fp,0,SEEK_END);
	*flen=(unsigned int)ftell(fp);
	fseek(fp,0,SEEK_SET);
	if (*flen<=2048+4+1+1) return(1);

	fseek(fp,852,SEEK_SET);
	fread(buffer,1,32,fp);
	for(i=0;i<32;i++) SND_eup_mute_set(i,(int)buffer[i]);
	fread(buffer,1,32,fp);
	for(i=0;i<32;i++) SND_eup_port_set(i,(int)buffer[i]);
	fread(buffer,1,32,fp);
	for(i=0;i<32;i++) SND_eup_midi_ch_set(i,(int)buffer[i]);
	fread(buffer,1,32,fp);
	for(i=0;i<32;i++) SND_eup_bias_set(i,(int)buffer[i]);
	fread(buffer,1,32,fp);
	for(i=0;i<32;i++) SND_eup_transpose_set(i,(int)buffer[i]);
	fseek(fp,1748,SEEK_SET);
	fread(buffer,1,6,fp);
	for(i=0;i< 6;i++) SND_midi_ch_assign(i,(int)buffer[i]);
	fread(buffer,1,8,fp);
	for(i=0;i< 8;i++) SND_midi_ch_assign(i+64,(int)buffer[i]);

	SND_pcm_mode_set(0);

	for(i=0;path[i]!='\0';i++) bankpath[i]=path[i];
	while((path[i]!='\\')&&(path[i]!=':')&&(i>=0))i--;
	i++;

	fread(&bankpath[i],1,8,fp);
	if(bankpath[i]!='\0'){
	  strcat(bankpath,".fmb");
	  SND_fm_bank_load(bankpath,fm_bankname);
	  }

	fread(&bankpath[i],1,8,fp);
	if(bankpath[i]!='\0'){
	  strcat(bankpath,".pmb");
	  SND_pcm_bank_load(bankpath,pcm_bankname);
	  }

	fseek(fp,2048,SEEK_SET);
	fread(&size,4,1,fp);
	fread(buffer,1,2,fp);
	*signature=(int)buffer[0];
	tempo=(int)buffer[1];
	SND_eup_tempo_set(tempo);

	*flen-=2048+4+1+1;
	/*if((eup_buf=malloc(*flen))==0) return(1);*/
	fread(eup_buf,1,*flen,fp);
	fclose(fp);
	return(0);
}
