home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 3 / FREEWARE.BIN / towns_os / pcmsel / makepmb.c < prev    next >
Text File  |  1980-01-02  |  4KB  |  115 lines

  1. /**************************************************************************
  2.  
  3.         PCM音色セレクタ     Ver.1.0A
  4.  
  5.             1991/01/12       by HONESEN
  6.  
  7. ***************************************************************************/
  8.  
  9. pragma Off(Floating_point);
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <egb.h>
  15.  
  16. char    inst[32][128];      /* インスツルメントテーブル */
  17.  
  18. struct sound {
  19.     char    nam[32];            /* ファイル名 */
  20.     long    id;                 /* サウンドID  */
  21. }       snd[256];           /* サウンドデータテーブル */
  22.  
  23. int     snd_max = 0;        /* 音色数 */
  24.  
  25.  
  26. void main()
  27. {
  28.     char    pmb_nam[32], name[32], snd_nam[9];
  29.     int     i, k, l, tno;
  30.     long    j, sid, ssiz, sum;
  31.     extern long search_snd(long id, char *nam);
  32.     FILE    *fp, *pmb_fp;
  33.  
  34.  
  35. /*** PMBファイルをオープン ***/
  36.     scanf("%s\n", pmb_nam);
  37.     if ((pmb_fp=fopen(pmb_nam, "wb")) == NULL) exit(1);
  38.  
  39.  
  40. /*** インスツルメント、サウンドデータをテーブルに登録 ***/
  41.     tno = 0;
  42.     while ((scanf("%s %d\n",name,&i)!=EOF) && tno<32) {
  43.         i--;
  44.         if ((fp=fopen(name, "rb")) != NULL) {
  45.             fseek(fp, 8+128*i, SEEK_SET);
  46.             for (j=0; j<128; j++) inst[tno][j] = getc(fp);
  47.             for (j=32; j<64; j+=4) {
  48.         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);
  49.         else {
  50.                     sid = *(long *)(inst[tno]+j);
  51.                     *(long *)(inst[tno]+j) = search_snd(sid, name);
  52.         }
  53.                 if (*(short*)(inst[tno]+16+(j-32)/2) == 127) break;
  54.             }
  55.             fclose(fp);
  56.             tno++;
  57.         }
  58.     }
  59.  
  60. /*** 空き音色番号は、1番と同じインスツルメントにしておく ***/
  61.     for (j=tno; j<32; j++)
  62.         for (k=0; k<128; k++) inst[j][k] = inst[0][k];
  63.  
  64. /*** PMBファイル、リストファイル出力 ***/
  65.     for (j=0; j<8; j++) putc(' ', pmb_fp);
  66.     for (j=0; j<32; j++)
  67.         for (k=0; k<128; k++) putc(inst[j][k], pmb_fp);
  68.     printf(" <<< PCM音色セレクタ v1.0A >>>\n\n");
  69.     printf("作成ファイル名 = %s\n\n", pmb_nam);
  70.     printf("  = サウンドデータ一覧 =\n\n");
  71.     printf("SOUND ID        SOUND NAME        PCM DATA SIZE(byte)\n");
  72.     printf("-----------------------------------------------------\n");
  73.     sum = 0;
  74.     for (j=0; j<snd_max; j++) {
  75.         fp = fopen(snd[j].nam, "rb");
  76.         fseek(fp, 8+128*32+8, SEEK_SET);
  77.         while ((l=fread(&sid, 4, 1, fp))!=0 && sid!=snd[j].id) {
  78.             fread(&ssiz, 4, 1, fp);
  79.             fseek(fp, ssiz+24, SEEK_CUR);
  80.         }
  81.     if (l) {
  82.             fread(&ssiz, 4, 1, fp);
  83.             fseek(fp, -16, SEEK_CUR);
  84.             fread(snd_nam, 8, 1, fp); snd_nam[8] = '\0';
  85.             fwrite(snd_nam, 8, 1, pmb_fp);
  86.             fwrite(&j, 4, 1, pmb_fp);
  87.             for (k=0; k<4; k++) getc(fp);
  88.             for (k=0; k<ssiz+20; k++) fputc(getc(fp), pmb_fp);
  89.             printf("   %2d            %-8s            %5d\n", j, snd_nam, ssiz);
  90.             sum += ((ssiz+32)%256? ((ssiz+32)/256+1)*256: ssiz+32);
  91.     }
  92.         fclose(fp);
  93.     }
  94.     printf("-----------------------------------------------------\n");
  95.     printf("  必要なウェーブメモリサイズ = %d byte\n", sum);
  96.     if (sum > 65536) printf("\n              メモリ容量オーバです!\n");
  97.  
  98. /*** 終了 ***/
  99.     fclose(pmb_fp);
  100. }
  101.  
  102. long search_snd(id, nam)
  103. long    id;
  104. char    *nam;
  105. {
  106.     long     i;
  107.  
  108.     for (i=0; i<snd_max; i++) {
  109.         if (!strcmp(nam, snd[i].nam) && (id==snd[i].id)) return(i);
  110.     }
  111.     strcpy(snd[i].nam, nam);
  112.     snd[i].id = id;
  113.     return((long)snd_max++);
  114. }
  115.