home *** CD-ROM | disk | FTP | other *** search
- Ad Lib, January 1989
- --------------------
-
- The .INS instrument files have been grouped together to create a .BNK (bank)
- file. The purpose of this is to save space. DOS will allocate 1K of space
- for a file regardless of how small the file actually is. So the bank file
- saves a significant amount of space.
-
- We are currently modifying our software to use the .BNK file instead of
- .INS files. The new software versions will all be numbered 1.5 and will
- not support the old .INS files. However, a utility will be provided to
- convert between the two formats. The default name for the bank file is
- STANDARD.BNK although any name may be used as long as the file extension
- is .BNK.
-
- The .BNK file a basically a collection of the old .INS file structures (as
- shown in Appendix C of the Programmer's Manual) with the waveform added to
- the end.
-
-
- Structure of .BNK files
- -----------------------
-
- FIELD# SIZE-bytes TYPE DESCRIPTION
-
- HEADER
- 1 1 char file version, major
- 2 1 char file version, minor
- 3 6 char signature: "ADLIB-"
- 4 2 unsigned number of list entries used
- 5 2 unsigned total number of list entries in file
- 6 4 long absolute offset in file of start of name list
- 7 4 long absolute offset in file of start of data
- 8 8 char filler (set to zero)
-
- INSTRUMENT NAME SECTION RECORD
- 1 2 unsigned index into data section
- 2 1 char flag: 0 if this record is not used, else 1
- 3 9 char instrument name (max 8 char + NULL)
-
- DATA SECTION RECORD
- 1 1 char mode (0=melodic, 1=percussive)
- 2 1 char voice number (if percussive mode)
- 3 13 char modulator (operator 0) parameters
- 4 13 char carrier (operator 1) parameters
- 5 1 char wave form for modulator
- 6 1 char wave form for carrier
-
-
- There is one header at the very beginning of the file. Field #6 in the
- header is the absolute offset of the start of the instrument name section.
-
- The instrument name section contains a list of records which contain the
- instrument name, a flag and a pointer to the data section. Header field #5
- gives the total number of records in this list, although not all of these
- records may be in use. Header field #4 gives the number of name records which
- are actually being used. The records in use will be placed at the beginning
- of the section and will be arranged alphabetically by instrument name.
-
- The data section contains the records of instrument parameters. One of these
- records is equivalent to the .INS file structure, except that the 2-byte
- fields are now 1-byte long. Two more bytes have been added for the wave
- form type for each operator.
-
- So, to read an instrument from the new bank file:
- 1. Read the header.
- 2. Use header field #6 to do a seek to the start of the instrument name
- section.
- 3. Search the name section for the desired name. (The search is delimited
- by header field #4.)
- 4. When found, get its index into the data section (name field #1).
- 5. Calculate the address where the data for this instument will be found:
- header_field_#7 + (index * sizeof_data_record)
- 6. Do a seek to the calculated address and read the data.
-
-
- Notes
- -----
-
- The instrument names are alphabetically arranged so that you are not limited
- to using a linear search method. A binary search would be appropriate.
-
- If you are going to be creating or deleting an instrument, you must preserve
- the alphabetical order of instrument names. However, the data section is
- not neccesarily ordered. When adding data, you can find the data record
- to use from the index pointer from the first unused instrument name
- record.
-
- The unused instrument name records are not empty: the pointers into the data
- section are valid and are used when adding instruments. When expanding the
- instrument name section, field #1 must be initialized to a valid value.
- (In this case, the data section must be shifted down and header field #7
- must be adjusted accordingly.) The purpose of having empty name records is
- to avoid having to rewrite the entire file every time an instrument is added.
-
-
- C Structures
- ------------
- The following are C structures which correspond to the information
- given above.
-
-
- /* Instrument bank file header */
- typedef struct {
- char majorVersion;
- char minorVersion;
- char sig [6]; /* signature: "ADLIB-" */
- unsigned nrDefined; /* number of list entries used */
- unsigned nrEntry; /* number of total entries in list */
- long offsetIndex; /* offset in file of start of name list */
- long offsetTimbre; /* offset in file of start of data */
- char filler [8]; /* must be zero */
- } BankHeader;
-
-
- /* Name of instrument with a pointer to its position in the file */
- typedef struct {
- unsigned nrReference; /* index into data section */
- char usedFlag; /* 0 if this entry is not used */
- char TimbreName [9]; /* max 8 char's + NULL */
- } BankEntry;
-
-
- /* Operator structure */
- typedef struct {
- char ksl;
- char freqMult;
- char feedBack; /* used by operator 0 only */
- char attack;
- char sustLevel;
- char sustain;
- char decay;
- char release;
- char output;
- char am;
- char vib;
- char ksr;
- char fm; /* used by operator 0 only */
- } Operator;
-
-
- typedef struct {
- char mode;
- char percVoice;
- Operator op0;
- Operator op1;
- char wave0; /* wave form for operator 0 */
- char wave1; /* wave form for operator 1 */
- } PackedTimbre;
-
-
-