home *** CD-ROM | disk | FTP | other *** search
/ Audio 4.94 - Over 11,000 Files / audio-11000.iso / msdos / convrtrs / mf2rol / listbnk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-04  |  3.6 KB  |  147 lines

  1. #include <stdio.h>
  2.  
  3. /* Instrument bank file header */
  4. typedef struct {
  5.    char      majorVersion;
  6.    char      minorVersion;
  7.    char      sig [6];            /* signature: "ADLIB-" */
  8.    unsigned  nrDefined;          /* number of list entries used */
  9.    unsigned  nrEntry;            /* number of total entries in list */
  10.    long      offsetIndex;        /* offset in file of start of name list */
  11.    long      offsetTimbre;       /* offset in file of start of data */
  12.    char      filler [8];         /* must be zero */
  13. } BankHeader;
  14.  
  15.  
  16. /* Name of instrument with a pointer to its position in the file */
  17. typedef struct {
  18.    unsigned nrReference;       /* index into data section */
  19.    char  usedFlag;             /* 0 if this entry is not used */
  20.    char  TimbreName [9];       /* max 8 char's + NULL */
  21. } BankEntry;
  22.  
  23.  
  24. /* Operator structure */
  25. typedef struct {
  26.    char  ksl;
  27.    char  freqMult;
  28.    char  feedBack;              /* used by operator 0 only */
  29.    char  attack;
  30.    char  sustLevel;
  31.    char  sustain;
  32.    char  decay;
  33.    char  release;
  34.    char  output;
  35.    char  am;
  36.    char  vib;
  37.    char  ksr;
  38.    char  fm;                    /* used by operator 0 only */
  39. } Operator;
  40.  
  41.  
  42. typedef struct {
  43.     char      mode;
  44.     char      percVoice;
  45.     Operator  op0;
  46.     Operator  op1;
  47.     char      wave0;            /* wave form for operator 0 */
  48.     char      wave1;            /* wave form for operator 1 */
  49. } PackedTimbre;
  50.  
  51. struct dat {
  52.     char name[9];
  53.     char pmode;
  54.     int voicenum;
  55.     unsigned idx;
  56. };
  57.  
  58. BankHeader bh;
  59. BankEntry be;
  60. PackedTimbre pt;
  61.  
  62. FILE *fin;
  63. badfile()
  64. {
  65.     fprintf(stderr, "File is not an AdLib Instrument Bank file\n");
  66.     exit(1);
  67.     fclose(fin);
  68. }
  69.  
  70. main(argc,argv)
  71. int argc;
  72. char *argv[];
  73. {
  74.     int i, j;
  75.     struct dat *d, *q;
  76.     char *malloc();
  77.     int maxidx;
  78.  
  79.     printcopy();
  80.     if (argc != 2) {
  81.         fprintf(stderr, "LISTBNK - This program lists the instruments within a .BNK file.\n");
  82.         fprintf(stderr, "Usage:\n    listbnk bnkfile\nExample:\n    listbnk standard.bnk\n");
  83.         fprintf(stderr, "Percussion instruments are labeled with a P followed by the\n");
  84.         fprintf(stderr, "voice number (06 through 10) the instrument is assigned to.\n");
  85.         exit(1);
  86.     }
  87.     if ((fin=fopen(argv[1], "rb")) == NULL) {
  88.         fprintf(stderr, "Cannot open file: %s\n", argv[1]);
  89.         exit(1);
  90.     };
  91.     if (fread(&bh, 1, sizeof(BankHeader), fin) != sizeof(BankHeader))
  92.         badfile();
  93.     if (strncmp(bh.sig, "ADLIB-", 6) != 0)
  94.         badfile();
  95.     if ((d=(struct dat *) malloc(bh.nrDefined * sizeof(struct dat))) == NULL) {
  96.         fprintf(stderr, "Not enough memory.\n");
  97.         exit(1);
  98.     }
  99.     if (fseek(fin, bh.offsetIndex, 0) != 0)
  100.         badfile();
  101.     q = d;
  102.     maxidx = 0;
  103.     for (i=0; i<bh.nrEntry ;i++) {
  104.         if (fread(&be, 1, sizeof(BankEntry), fin) != sizeof(BankEntry))
  105.             badfile();
  106.         if (be.usedFlag) {
  107.             strcpy(q->name, be.TimbreName);
  108.             q->idx = be.nrReference;
  109.             if (be.nrReference > maxidx)
  110.                 maxidx = be.nrReference;
  111.             q++;
  112.         }
  113.     }
  114.     if (fseek(fin, bh.offsetTimbre, 0) != 0)
  115.         badfile();
  116.     maxidx++;
  117.     for (i=0; i<maxidx; i++) {
  118.         if (fread(&pt, 1, sizeof(PackedTimbre), fin) != sizeof(PackedTimbre))
  119.             badfile();
  120.         for (j=0, q=d; j<bh.nrDefined; j++, q++)
  121.             if (q->idx == i)
  122.                 break;
  123.         if (j < bh.nrDefined) {
  124.             q->pmode = pt.mode;
  125.             q->voicenum = pt.percVoice;
  126.         }
  127.     }
  128.     printf("\nBank file %s contains %d instruments\n\n", argv[1], bh.nrDefined);
  129.     for (i=0, q=d; i<bh.nrDefined; i++, q++) {
  130.         if (q->pmode)
  131.             printf("  P%02d-%-8s", q->voicenum, q->name);
  132.         else
  133.             printf("      %-8s", q->name);
  134.         if ((i+1)%5 == 0)
  135.             printf("\n");
  136.     }
  137.     if (i%5 != 0)
  138.         printf("\n");
  139.     fclose(fin);
  140. }
  141. printcopy()
  142. {
  143.     static char notice[] = "Bankfile Listing Utility  V1.0   A. A. Kapauan 1991";
  144.     fprintf(stderr, "\n%s\n\n", notice);
  145. }
  146.  
  147.