home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
pcmsel
/
makepmb.c
< prev
next >
Wrap
Text File
|
1980-01-02
|
4KB
|
115 lines
/**************************************************************************
PCM音色セレクタ Ver.1.0A
1991/01/12 by HONESEN
***************************************************************************/
pragma Off(Floating_point);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <egb.h>
char inst[32][128]; /* インスツルメントテーブル */
struct sound {
char nam[32]; /* ファイル名 */
long id; /* サウンドID */
} snd[256]; /* サウンドデータテーブル */
int snd_max = 0; /* 音色数 */
void main()
{
char pmb_nam[32], name[32], snd_nam[9];
int i, k, l, tno;
long j, sid, ssiz, sum;
extern long search_snd(long id, char *nam);
FILE *fp, *pmb_fp;
/*** PMBファイルをオープン ***/
scanf("%s\n", pmb_nam);
if ((pmb_fp=fopen(pmb_nam, "wb")) == NULL) exit(1);
/*** インスツルメント、サウンドデータをテーブルに登録 ***/
tno = 0;
while ((scanf("%s %d\n",name,&i)!=EOF) && tno<32) {
i--;
if ((fp=fopen(name, "rb")) != NULL) {
fseek(fp, 8+128*i, SEEK_SET);
for (j=0; j<128; j++) inst[tno][j] = getc(fp);
for (j=32; j<64; j+=4) {
if (j>32 && *(short*)(inst[tno]+16+(j-32)/2)==*(short*)(inst[tno]+14+(j-32)/2)) *(long*)(inst[tno]+j) = *(long*)(inst[tno]+j-4);
else {
sid = *(long *)(inst[tno]+j);
*(long *)(inst[tno]+j) = search_snd(sid, name);
}
if (*(short*)(inst[tno]+16+(j-32)/2) == 127) break;
}
fclose(fp);
tno++;
}
}
/*** 空き音色番号は、1番と同じインスツルメントにしておく ***/
for (j=tno; j<32; j++)
for (k=0; k<128; k++) inst[j][k] = inst[0][k];
/*** PMBファイル、リストファイル出力 ***/
for (j=0; j<8; j++) putc(' ', pmb_fp);
for (j=0; j<32; j++)
for (k=0; k<128; k++) putc(inst[j][k], pmb_fp);
printf(" <<< PCM音色セレクタ v1.0A >>>\n\n");
printf("作成ファイル名 = %s\n\n", pmb_nam);
printf(" = サウンドデータ一覧 =\n\n");
printf("SOUND ID SOUND NAME PCM DATA SIZE(byte)\n");
printf("-----------------------------------------------------\n");
sum = 0;
for (j=0; j<snd_max; j++) {
fp = fopen(snd[j].nam, "rb");
fseek(fp, 8+128*32+8, SEEK_SET);
while ((l=fread(&sid, 4, 1, fp))!=0 && sid!=snd[j].id) {
fread(&ssiz, 4, 1, fp);
fseek(fp, ssiz+24, SEEK_CUR);
}
if (l) {
fread(&ssiz, 4, 1, fp);
fseek(fp, -16, SEEK_CUR);
fread(snd_nam, 8, 1, fp); snd_nam[8] = '\0';
fwrite(snd_nam, 8, 1, pmb_fp);
fwrite(&j, 4, 1, pmb_fp);
for (k=0; k<4; k++) getc(fp);
for (k=0; k<ssiz+20; k++) fputc(getc(fp), pmb_fp);
printf(" %2d %-8s %5d\n", j, snd_nam, ssiz);
sum += ((ssiz+32)%256? ((ssiz+32)/256+1)*256: ssiz+32);
}
fclose(fp);
}
printf("-----------------------------------------------------\n");
printf(" 必要なウェーブメモリサイズ = %d byte\n", sum);
if (sum > 65536) printf("\n メモリ容量オーバです!\n");
/*** 終了 ***/
fclose(pmb_fp);
}
long search_snd(id, nam)
long id;
char *nam;
{
long i;
for (i=0; i<snd_max; i++) {
if (!strcmp(nam, snd[i].nam) && (id==snd[i].id)) return(i);
}
strcpy(snd[i].nam, nam);
snd[i].id = id;
return((long)snd_max++);
}