542 lines
29 KiB
Text
542 lines
29 KiB
Text
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
IBM Audio Interface Library
|
|||
|
|
|||
|
Extended MIDI (XMIDI) Specification
|
|||
|
|
|||
|
Release 1.02 of 17 August 1992
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Contents
|
|||
|
|
|||
|
Overview ........................................................... 3
|
|||
|
Extended MIDI Controller Reference ................................. 4
|
|||
|
Extended MIDI IFF (.XMI) Structure ................................. 11
|
|||
|
Extended MIDI Global Timbre Library File Format .................... 13
|
|||
|
Glossary of Audio Interface Library Terms .......................... 14
|
|||
|
Overview
|
|||
|
|
|||
|
The term 'Extended MIDI,' or 'XMIDI,' refers to the set of features added to the base Musical
|
|||
|
Instrument Digital Interface (MIDI) data specification by the drivers and utility programs
|
|||
|
included with the Audio Interface Library's Version 2.00 release. The XMIDI standard brings
|
|||
|
many powerful features to the Audio Interface Library which would otherwise be absent in a
|
|||
|
system conforming to the original MIDI standard.
|
|||
|
|
|||
|
Composers who are interested in getting started with XMIDI should pay particular attention to
|
|||
|
the descriptions of the utility programs MIDIFORM, GLIB, MIDIECHO, and CAKEPORT
|
|||
|
in the Tools Reference section of this manual, before moving on to the specific discussions of
|
|||
|
the Extended MIDI controllers below. It is strongly recommended that musicians with even the
|
|||
|
slightest programming knowledge (or interest) examine the Application Program Interface
|
|||
|
Reference section as well, in order to gain the best possible understanding of the Audio
|
|||
|
Interface Library's capabilities.
|
|||
|
|
|||
|
Programmers seeking to master effective Audio Interface Library application design are also
|
|||
|
advised to familiarize themselves with the Tools Reference section, followed by a thorough
|
|||
|
perusal of the Application Program Interface Reference and Technical Notes. Special attention
|
|||
|
should be given to the Programming Examples section as well. The chapters in this section on
|
|||
|
the two primary XMIDI file formats are provided for reference only.
|
|||
|
|
|||
|
Users planning to upgrade Audio Interface Library Version 1 MIDI applications to the XMIDI
|
|||
|
standard should begin with an understanding of the MIDIFORM and GLIB programs and how
|
|||
|
they create and manage the new system's data file formats. Virtually all of the Version 1 API
|
|||
|
functions have been retained, but many have undergone revision or syntactic changes as part of
|
|||
|
the Version 2.0 release. A careful review of the Application Program Interface Reference and
|
|||
|
Programming Examples sections will ease the transition to the new API.
|
|||
|
Extended MIDI Controller Reference
|
|||
|
|
|||
|
XMIDI provides a number of additional MIDI-style Control Change messages which greatly
|
|||
|
extend the range of composition and arrangement options available to the musician and
|
|||
|
application programmer. Below is a list of Extended MIDI Control Change messages available
|
|||
|
in the current Audio Interface Library release, together with explanations of their uses in
|
|||
|
XMIDI sequences.
|
|||
|
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
<EFBFBD> Controller <20> Description <20>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵
|
|||
|
<EFBFBD> 110 (6eh) <20> Channel Lock <20>
|
|||
|
<EFBFBD> 111 (6fh) <20> Channel Lock Protect <20>
|
|||
|
<EFBFBD> 112 (70h) <20> Voice Protect <20>
|
|||
|
<EFBFBD> 113 (71h) <20> Timbre Protect <20>
|
|||
|
<EFBFBD> 114 (72h) <20> Patch Bank Select <20>
|
|||
|
<EFBFBD> 115 (73h) <20> Indirect Controller Prefix <20>
|
|||
|
<EFBFBD> 116 (74h) <20> For Loop Controller <20>
|
|||
|
<EFBFBD> 117 (75h) <20> Next/Break Loop Controller <20>
|
|||
|
<EFBFBD> 118 (76h) <20> Clear Beat/Bar Count <20>
|
|||
|
<EFBFBD> 119 (77h) <20> Callback Trigger <20>
|
|||
|
<EFBFBD> 120 (78h) <20> Sequence Branch Index <20>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Channel Lock (110)
|
|||
|
|
|||
|
< 64: Release previously locked channel and restore default channel
|
|||
|
number mapping
|
|||
|
|
|||
|
>= 64: Seize ("lock") an unlocked, unprotected physical MIDI channel
|
|||
|
(2-9) for assignment to this logical channel # (11-16)
|
|||
|
|
|||
|
The Channel Lock controller is one of the more powerful Extended MIDI controllers. Channel
|
|||
|
locking allows the XMIDI drivers to play multiple XMIDI sequences simultaneously, which in
|
|||
|
turn permits the creation of impressive sound effects and musical "mixes."
|
|||
|
|
|||
|
When used with a value greater than or equal to 64, the Channel Lock controller attempts to
|
|||
|
seize, or "lock," the highest MIDI channel number recognized by the driver's supported
|
|||
|
synthesizer which has the fewest actively playing notes. Channels which are already locked, or
|
|||
|
which have been "protected" against locking by use of the XMIDI Channel Lock Protect
|
|||
|
controller (111), are immune to seizure. If no available MIDI channels are eligible for locking
|
|||
|
under these criteria, the controller will have no effect. (This will occur only if all unprotected
|
|||
|
channels are already locked.)
|
|||
|
|
|||
|
After a MIDI channel has been successfully locked, the driver maps the locked channel onto
|
|||
|
the MIDI channel in which the Channel Lock controller itself appeared. This means that all
|
|||
|
subsequent MIDI events sent on the same channel as the Channel Lock controller (the "logical"
|
|||
|
channel) will instead be transmitted on the newly locked (or "physical") channel.
|
|||
|
This concept is perhaps best illustrated with a typical application of channel locking. Below is
|
|||
|
a list of events comprising a short XMIDI sequence to create a "machine gun" sound effect.
|
|||
|
(Timing and note velocity information has been omitted for simplicity.)
|
|||
|
|
|||
|
Ch 02 Controller 114 = 1 ;XMIDI Patch Bank Select = 1
|
|||
|
Ch 02 Patch = 5 ;MIDI Program Change to patch 5 ("gunshot")
|
|||
|
Ch 02 Pitch Wheel 0 ;Pitch bend centered (no bend)
|
|||
|
Ch 02 Controller 1 = 0 ;Modulation = 0
|
|||
|
Ch 02 Controller 7 = 127 ;Volume = 127
|
|||
|
Ch 02 Controller 10 = 64 ;Panpot = 64 (center of stereo field)
|
|||
|
Ch 02 Controller 116 = 5 ;FOR loop = 1 to 5...
|
|||
|
Ch 02 Note C 5 on ;...sound a brief "gunshot" note...
|
|||
|
Ch 02 Note C 5 off
|
|||
|
Ch 02 Controller 116 = 127 ;...NEXT loop
|
|||
|
|
|||
|
This "machine gun" sequence would be ideal for use as part of an arcade game's sound-effects
|
|||
|
arsenal, except for one serious drawback: what happens if MIDI channel 2 is already being
|
|||
|
used by a background music sequence, or perhaps another sound effect? The controller values
|
|||
|
and patch change in the sequence above would certainly have an unfavorable effect on a
|
|||
|
romantic violin solo playing on channel 2. The problem could be solved by setting aside a
|
|||
|
block of active MIDI channels for use with overlaid sound-effects sequences, but this might be
|
|||
|
an unacceptable compromise for applications requiring playback of any but the simplest XMIDI
|
|||
|
sequences.
|
|||
|
|
|||
|
Channel locking and remapping is a much more satisfactory solution. When composing
|
|||
|
sequences for the XMIDI standard, the composer could assign all tracks in sound effects and
|
|||
|
other overlaid sequences to MIDI channels in the range 11 through 16. MIDI channels in this
|
|||
|
range are not normally recognized by synthesizers supported by the AIL. But if an XMIDI
|
|||
|
Channel Lock controller is then inserted before the first Channel Voice event in the channel,
|
|||
|
the AIL driver can temporarily reassign a physical MIDI channel to the out-of-range logical
|
|||
|
channel number, preventing the channel's use by any other sequence being played for as long
|
|||
|
as it is needed by the sequence which "locked" the channel. A not-so-obvious benefit of this
|
|||
|
scheme is that all sound-effects sequences can safely share the same logical channel numbers
|
|||
|
between 11 and 16, since only the physical channel numbers recognized by the synthesizer are
|
|||
|
vulnerable to usage conflicts.
|
|||
|
|
|||
|
With channel locking installed, the machine gun sound-effect sequence might look like this:
|
|||
|
|
|||
|
Ch 11 Controller 110 = 127 ;XMIDI Channel Lock (seize channel)
|
|||
|
Ch 11 Controller 114 = 1 ;XMIDI Patch Bank Select = 1
|
|||
|
Ch 11 Patch = 5 ;MIDI Program Change to patch 5 ("gunshot")
|
|||
|
Ch 11 Pitch Wheel 0 ;Pitch bend centered (no bend)
|
|||
|
Ch 11 Controller 1 = 0 ;Modulation = 0
|
|||
|
Ch 11 Controller 7 = 127 ;Volume = 127
|
|||
|
Ch 11 Controller 10 = 64 ;Panpot = 64 (center of stereo field)
|
|||
|
Ch 11 Controller 116 = 5 ;FOR loop = 1 to 5...
|
|||
|
Ch 11 Note C 5 on ;...sound a brief "gunshot" note...
|
|||
|
Ch 11 Note C 5 off
|
|||
|
Ch 11 Controller 116 = 127 ;...NEXT loop
|
|||
|
Ch 11 Controller 110 = 0 ;XMIDI Channel Lock (release channel)The sequence's new final event, a Channel Lock controller with the value 0, is actually
|
|||
|
unnecessary since all channels locked by a sequence are released automatically as soon as the
|
|||
|
sequence ends or playback is stopped. However, in sequences with multiple tracks, it is a
|
|||
|
good idea to explicitly release each locked channel as soon as it is no longer needed by the
|
|||
|
sequence, instead of waiting for all tracks to expire. This allows the XMIDI driver to restore
|
|||
|
the channel to the sequence from which it was "stolen," minimizing the disruption to the
|
|||
|
background music.
|
|||
|
|
|||
|
When a locked channel is released, either through a Channel Lock controller with a value
|
|||
|
below 64 or through a C call to the analogous AIL_release_channel() function, the timbre
|
|||
|
bank, patch number, pitch wheel, and MIDI controllers in the channel are updated to their
|
|||
|
correct values before being returned to the service of the original sequence. This relieves the
|
|||
|
application of the responsibility of keeping track of these values while a channel is locked.
|
|||
|
Conversely, when a channel is locked by a Channel Lock controller or its complementary
|
|||
|
AIL_lock_channel() function, the MIDI Sustain (Hold1) controller (64) in the channel is
|
|||
|
forced to its "off" condition and all notes playing in the channel are silenced. No other
|
|||
|
controller values or MIDI messages are initialized! It is essential for a sequence (or an
|
|||
|
application) which has just received a locked channel to initialize all MIDI parameters,
|
|||
|
including MIDI controllers likely to contain undesirable values, the XMIDI Patch Bank Select
|
|||
|
controller and MIDI Program Change number, and the MIDI pitch wheel, to appropriate
|
|||
|
values. (Avoid the temptation to accomplish this with MIDI Channel Mode messages such as
|
|||
|
All Notes Off or Reset All Controllers. Channel Mode messages may be interpreted differently
|
|||
|
by various synthesizers, and the XMIDI driver code which maintains sequence state tables and
|
|||
|
other data structures makes no attempt to interpret them at all.)
|
|||
|
Channel Lock Protect (111)
|
|||
|
|
|||
|
< 64: Channel is eligible for temporary reassignment by
|
|||
|
AIL_lock_channel() or Channel Lock controllers
|
|||
|
|
|||
|
>= 64: Channel may not be locked (seized for reassignment)
|
|||
|
|
|||
|
Occasionally it may be desirable to prevent any sequence or application process from
|
|||
|
interrupting traffic on a given MIDI channel. Depending on its value, the XMIDI Channel
|
|||
|
Lock Protect controller will either render the physical MIDI channel in which it appears
|
|||
|
immune to seizure, or allow it to be considered for seizure when a Channel Lock controller
|
|||
|
message or AIL_lock_channel() call is issued.
|
|||
|
|
|||
|
Voice Protect (112)
|
|||
|
|
|||
|
< 64: Voices playing in channel assume normal priority (release voice
|
|||
|
protection)
|
|||
|
|
|||
|
>= 64: Voices playing in channel assume highest possible priority (assert
|
|||
|
voice protection)
|
|||
|
|
|||
|
Available on some synthesizers, voice protection is an XMIDI feature which allows a sequence
|
|||
|
to discourage the polyphonic voice assignment algorithm from "stealing" synthesizer voices
|
|||
|
from notes played in a given MIDI channel when no free voices are available. If the Voice
|
|||
|
Protect controller's value is less than 64, voices assigned to notes playing in the channel will be
|
|||
|
considered for reassignment to play incoming note events. This is the default condition for
|
|||
|
each channel. Otherwise, the "voice priority" of notes in the channel will constantly assume its
|
|||
|
maximum value, preventing the channel's notes from being robbed of their voices. Voice
|
|||
|
protection should be used conservatively and released as soon as possible, since the synthesizer
|
|||
|
emulation code works best when allowed to make its own decisions regarding voice allocation.
|
|||
|
|
|||
|
Timbre Protect (113)
|
|||
|
|
|||
|
< 64: Timbre currently assigned to this channel's patch may be
|
|||
|
"discarded" (if least-recently-used) to make room in local timbre
|
|||
|
cache or synthesizer memory
|
|||
|
|
|||
|
>= 64: Timbre may not be discarded from cache or synthesizer memory
|
|||
|
|
|||
|
For information on timbre protection, refer to the descriptions of the AIL_protect_timbre() /
|
|||
|
AIL_unprotect_timbre() functions in the Application Program Interface Reference section of
|
|||
|
this manual.
|
|||
|
Patch Bank Select (114)
|
|||
|
|
|||
|
This controller may be used to "extend" the scope of MIDI Program Change (or Cakewalk
|
|||
|
"Patch") messages. Normally, any of 128 synthesizer patches may be selected with a Program
|
|||
|
Change message; however, the Patch Bank Select controller instructs the AIL XMIDI driver to
|
|||
|
associate custom timbres in any of 127 banks with synthesizer patches which are subsequently
|
|||
|
selected in a channel.
|
|||
|
|
|||
|
By convention, patch bank 0 is reserved for the Roland MT-32's built-in patch/timbre
|
|||
|
combinations, and for the Ad Lib-style instruments intended to emulate those patches. Custom
|
|||
|
Roland timbres (and their Ad Lib counterparts) should be placed in patch banks 1 through 126.
|
|||
|
Timbre bank 127 is reserved for custom "drum kit" timbres to be used when playing note
|
|||
|
events on MIDI channel 10.
|
|||
|
|
|||
|
When a MIDI Program Change (or "patch") event is encountered, the XMIDI synthesizer
|
|||
|
driver looks in its collection of timbres from the Global Timbre Library for a custom timbre
|
|||
|
whose "patch number" is the specified Program Change number and whose "bank" is equal to
|
|||
|
the current Patch Bank Select controller value. If the timbre is found, the synthesizer is
|
|||
|
automatically instructed to associate the timbre with the patch which was just selected by the
|
|||
|
Program Change event. Under normal circumstances, the search for the requested timbre
|
|||
|
should not fail, since the application should have been informed in advance of the need for the
|
|||
|
timbre via the AIL_timbre_request() function. (See the Application Program Interface
|
|||
|
Reference section of this manual for more information on XMIDI timbre management.)
|
|||
|
|
|||
|
The default Patch Bank Select controller value is 0. Therefore, AIL applications which do not
|
|||
|
require custom Roland MT-32 timbres may disregard this controller altogether. Otherwise,
|
|||
|
care must be taken to explicitly specify the Timbre Bank Select controller value to be used in
|
|||
|
each channel of every sequence and sound effect used by the application, since the default
|
|||
|
value of 0 is asserted only upon driver initialization -- not when a channel is locked or when a
|
|||
|
sequence stops.
|
|||
|
|
|||
|
Indirect Controller Prefix (115)
|
|||
|
|
|||
|
This controller specifies that the next Control Change message encountered in this channel
|
|||
|
should obtain its value from the Indirect Controller Array's nth byte entry, where n is the
|
|||
|
indirect controller prefix's own value. For more information on the Indirect Controller Array,
|
|||
|
see the AIL_register_sequence() function description in the Application Program Interface
|
|||
|
Reference section of this manual.
|
|||
|
For Loop Controller (116)
|
|||
|
|
|||
|
1-127: Define beginning of MIDI data block to be played a total of v
|
|||
|
times, where v is the For loop controller's value
|
|||
|
|
|||
|
0: Define beginning of MIDI data block to be played indefinitely
|
|||
|
|
|||
|
This controller allows the creation of a loop within an XMIDI sequence. Its use is almost self-
|
|||
|
explanatory, especially for those familiar with BASIC or C's "for...next" construct. A loop
|
|||
|
value of 1 causes the block of MIDI/XMIDI events between the For controller and its
|
|||
|
corresponding Next/Break controller to be executed precisely once -- as if the controllers did
|
|||
|
not exist. Values from 2 to 127 cause the event block to be executed from 2 to 127 times. A
|
|||
|
value of 0, on the other hand, causes the event block to loop indefinitely, interruptable only at
|
|||
|
the application's request.
|
|||
|
|
|||
|
There are four rules to bear in mind when using For...Next/Break loops:
|
|||
|
|
|||
|
* At least one XMIDI 'quantization interval' must separate the For and
|
|||
|
Next/Break loop controllers. In practice, this means that more than
|
|||
|
1/120 second (8.4 milliseconds) of real time must elapse between these
|
|||
|
two events during playback. Otherwise, the application will "hang"
|
|||
|
forever with interrupts disabled, since neither the For nor the
|
|||
|
Next/Break controller automatically terminates the current interval.
|
|||
|
|
|||
|
* The branching effect caused by a Next/Break controller does not result
|
|||
|
in the note queue being flushed, unlike the operation of the
|
|||
|
AIL_branch_index() function. Only the sequence pointer is adjusted by
|
|||
|
the Next/Break controller. Refer to the AIL_branch_index() function
|
|||
|
description in the Application Program Interface Reference for
|
|||
|
additional notes about sequence branching in general.
|
|||
|
|
|||
|
* Multi-track MIDI Format 1 files are converted to MIDI Format 0 during
|
|||
|
the MIDIFORM program's XMIDI compilation process. This implies that
|
|||
|
loops placed on a single track will actually cause events in all other
|
|||
|
tracks to be repeated as well. In situations where it is desired to
|
|||
|
loop tracks independently of each other, a possible solution is to
|
|||
|
split the tracks into multiple XMIDI sequences and have the application
|
|||
|
play each sequence simultaneously.
|
|||
|
|
|||
|
* For...Next/Break controller loops may be nested up to 4 levels deep.
|
|||
|
Next/Break Loop Controller (117)
|
|||
|
|
|||
|
< 64: (Break) Loop iteration stops, regardless of the current For loop
|
|||
|
count
|
|||
|
|
|||
|
>= 64: (Next) Decrement innermost For loop count and, if nonzero, branch
|
|||
|
immediately to the innermost For controller event
|
|||
|
|
|||
|
One application of the Indirect Controller Prefix controller (q.v.) would be to turn a Next
|
|||
|
controller into a Break controller by providing a dynamic controller value as specified above.
|
|||
|
This feature may be used to introduce elements of application program control into sound-effect
|
|||
|
sequences. Otherwise, the Next controller should have a value greater than or equal to 64, in
|
|||
|
order to function in the manner detailed in the preceding For Loop Controller description.
|
|||
|
|
|||
|
Clear Beat/Bar Count (118)
|
|||
|
|
|||
|
(Value unused, 0-127)
|
|||
|
|
|||
|
This controller resets the current beat and measure counters to 0:0. See the AIL_beat_count()
|
|||
|
/ AIL_measure_count() function description in the Application Program Interface Reference
|
|||
|
section for information on the beat and measure counters.
|
|||
|
|
|||
|
Callback Trigger (119)
|
|||
|
|
|||
|
(Value = trigger_value parameter passed to callback function, 0-127)
|
|||
|
|
|||
|
See the AIL_install_callback() function description in the Application Program Interface
|
|||
|
Reference section for information on callback functions.
|
|||
|
|
|||
|
Sequence Branch Index (120)
|
|||
|
|
|||
|
(Value = marker_number parameter passed to AIL_branch_index() function,
|
|||
|
0-127)
|
|||
|
|
|||
|
See the AIL_branch_index() function description in the Application Program Interface
|
|||
|
Reference section for information on sequence branching.
|
|||
|
|
|||
|
* * *
|
|||
|
|
|||
|
In addition to the controllers listed here, some synthesizer drivers (such as the Roland MT-32
|
|||
|
family) provide several other XMIDI Control Change message types. These controllers allow
|
|||
|
the musician to access the synthesizer's set of memory-addressable features, without the need to
|
|||
|
deal directly with MIDI System Exclusive messages. For more information about synthesizer-
|
|||
|
specific XMIDI controllers, as well as a list of general XMIDI controllers supported by each
|
|||
|
driver, refer to the Technical Notes section of this manual.Extended MIDI IFF (.XMI) Structure
|
|||
|
|
|||
|
XMIDI sequence files are "preprocessed" MIDI sequence files. Created by the MIDIFORM
|
|||
|
program described in the Tools Reference section of this manual, XMIDI files are stored in
|
|||
|
accordance with Electronic Arts' Interchange File Format (EA IFF 85) standard. Below is a
|
|||
|
summary of the XMIDI format's technical details, which is presented as an aid to application
|
|||
|
developers with specialized needs not supported directly by the Audio Interface Library.
|
|||
|
|
|||
|
The XMIDI file format preserves all of the information needed to faithfully reproduce the
|
|||
|
MIDI sequence's original sound, while discarding elements of the MIDI storage format that are
|
|||
|
redundant, inefficient, or otherwise unnecessary for real-time playback. An XMIDI file
|
|||
|
containing a single translated MIDI sequence often requires from 10% to 30% less storage
|
|||
|
space, and can be performed with substantially less background processing time.
|
|||
|
|
|||
|
Each XMIDI file created by the MIDIFORM program contains a single IFF "CAT " chunk of
|
|||
|
type XMID. The CAT chunk contains at least one XMIDI sequence, whose local chunks are
|
|||
|
stored within a "FORM" chunk of type XMID. As created by MIDIFORM, the XMIDI file
|
|||
|
may contain a chunk of type FORM XDIR which contains information about the file's
|
|||
|
collection of XMIDI sequences. The XDIR chunk is for the application's benefit, and is not
|
|||
|
currently required by the XMIDI drivers.
|
|||
|
In the expression below, <len> signifies a 32-bit "big endian" (or Motorola 680XX-style,
|
|||
|
MSB first) chunk length, which includes neither itself nor its preceding 4-character CAT ,
|
|||
|
FORM, or local chunk name. Square brackets enclose optional chunks; ellipses are placed
|
|||
|
after the closing braces of chunks or data items which may be repeated.
|
|||
|
|
|||
|
[ FORM<len>XDIR
|
|||
|
{
|
|||
|
INFO<len>
|
|||
|
UWORD # of FORMs XMID in file, 1-65535
|
|||
|
} ]
|
|||
|
|
|||
|
CAT <len>XMID
|
|||
|
{
|
|||
|
FORM<len>XMID
|
|||
|
{
|
|||
|
[ TIMB<len>
|
|||
|
UWORD # of timbre list entries, 0-16384
|
|||
|
{ UBYTE patch number 0-127
|
|||
|
UBYTE timbre bank 0-127 } ... ]
|
|||
|
|
|||
|
[ RBRN<len>
|
|||
|
UWORD # of branch point offsets, 0-127
|
|||
|
{ UWORD Sequence Branch Index controller value 0-127
|
|||
|
ULONG controller offset from start of EVNT chunk } ... ]
|
|||
|
|
|||
|
EVNT<len>
|
|||
|
{ UBYTE interval count (if < 128)
|
|||
|
UBYTE <MIDI event> (if > 127) } ...
|
|||
|
} ...
|
|||
|
}
|
|||
|
|
|||
|
TIMB and RBRN are optional chunks. RBRN is included only if XMIDI Sequence Branch
|
|||
|
Index (120) controllers appear in the original MIDI sequence. The mandatory EVNT chunk
|
|||
|
contains the quantized sequence events. EVNT must appear as the last local chunk in FORM
|
|||
|
XMID, while the other local chunks may appear in any order. <MIDI event> consists of any
|
|||
|
MIDI Channel Voice, System Exclusive, or Meta-event except Note Off. The MIDI 'running
|
|||
|
status' convention is not used. Note On events are followed by their duration in intervals,
|
|||
|
expressed as a MIDI variable-length quantity (i.e., a string of 7-bit bytes stored most
|
|||
|
significant byte first, with the high bit set in all bytes except the last).
|
|||
|
Extended MIDI Global Timbre Library File Format
|
|||
|
|
|||
|
For information about Global Timbre Library data in general, review the discussion of the
|
|||
|
GLIB program in the Tools Reference section of this manual, as well as the descriptions of
|
|||
|
timbre-related functions in the Application Program Interface Reference. A 'boilerplate'
|
|||
|
example of C code to fetch a desired timbre from any Global Timbre Library file can be found
|
|||
|
in the sample program listing XPLAY.C.
|
|||
|
|
|||
|
In the expression below, ellipses are placed after the closing braces of data items which may be
|
|||
|
repeated.
|
|||
|
|
|||
|
File header, one entry for each timbre in file
|
|||
|
|
|||
|
{
|
|||
|
BYTE timbre patch number
|
|||
|
BYTE timbre bank number
|
|||
|
ULONG offset of timbre length word from start of file
|
|||
|
} ...
|
|||
|
|
|||
|
Structure of each timbre as stored in file
|
|||
|
|
|||
|
{
|
|||
|
UWORD timbre length word (size of timbre in bytes + 2)
|
|||
|
{
|
|||
|
UBYTE timbre data byte
|
|||
|
} ...
|
|||
|
} ...
|
|||
|
Glossary of Audio Interface Library Terms
|
|||
|
|
|||
|
ADV: Abbreviation for Audio Driver, the standard MS-DOS filename suffix for AIL device
|
|||
|
drivers. The .ADV files are actually small assembly-language programs which contain the
|
|||
|
"intelligence" needed to support a given PC audio device.
|
|||
|
|
|||
|
API: Application Program Interface. The AIL API module is linked directly with the
|
|||
|
application. It contains the Process Services (described in the API Reference section), as well
|
|||
|
as the actual C or Pascal-callable routines which link the application to its installed audio
|
|||
|
drivers.
|
|||
|
|
|||
|
Bank: A collection of timbres, or software instrument definitions. Think of a bank as a
|
|||
|
"virtual orchestra" which contains a number of different instruments available for use by a
|
|||
|
given driver. See also Bankfile.
|
|||
|
|
|||
|
Bankfile: An MS-DOS file containing a bank. Bankfiles are typically generated by a
|
|||
|
synthesizer's "instrument editor" program. The Audio Interface Library includes a program
|
|||
|
called GLIB which converts these device-specific bankfiles into an efficient, standardized
|
|||
|
runtime file format known as the Global Timbre Library, or GTL. See the description of the
|
|||
|
GLIB program in the Tools Reference section for details.
|
|||
|
|
|||
|
Channel: Most MIDI events can be associated with one of sixteen possible channels. Although
|
|||
|
MIDI is a serial data standard at heart, it is often required to convey information which exists
|
|||
|
as a series of events in a number of parallel, synchronous dimensions. For instance, a single
|
|||
|
MIDI data stream may be expected to "play" an ensemble consisting of a piano, two guitars, a
|
|||
|
drum set, and a brass section. By associating events intended for a given instrument with the
|
|||
|
instrument's unique channel number, the composer of the MIDI sequence can prevent
|
|||
|
acoustically unfortunate conflicts between the pianos, drums, guitars, and horns.
|
|||
|
|
|||
|
Controller: MIDI defines a number of control change events which affect the performance
|
|||
|
characteristics of instruments playing in a particular channel. Each MIDI synthesizer responds
|
|||
|
to a portion of the defined MIDI controller set. For example, the Roland MT-32 recognizes
|
|||
|
the standard MIDI controllers for Volume (controller 7), Panpot (controller 10), Sustain
|
|||
|
(controller 64), and Modulation (controller 1), among others.
|
|||
|
|
|||
|
Global Timbre Library: See Bankfile.
|
|||
|
|
|||
|
GTL: See Bankfile.
|
|||
|
|
|||
|
MIDI Channel: See Channel.
|
|||
|
|
|||
|
MIDI Channel Voice Message: A short representation (2-3 bytes) of a single MIDI event.
|
|||
|
Channel Voice messages include the Note Off, Note On, Polyphonic Key Pressure, Control
|
|||
|
Change, Program Change, Channel Pressure, and Pitch Wheel Change message types.
|
|||
|
|
|||
|
MIDI Controller: See Controller.
|
|||
|
MIDI System Exclusive Message: A device-specific data packet sent to a MIDI synthesizer.
|
|||
|
Often, system exclusive messages are used to control aspects of synthesis not otherwise covered
|
|||
|
by the MIDI standard, such as custom instrument data, reverb control, and channel response
|
|||
|
configuration. Most MIDI synthesizers are accompanied by literature describing what system
|
|||
|
exclusive messages they recognize, if any.
|
|||
|
|
|||
|
Multi-Timbral: Refers to a synthesizer's ability to play notes with more than one type of
|
|||
|
musical instrument at a time.
|
|||
|
|
|||
|
Operator: See Partial.
|
|||
|
|
|||
|
Partial: Also called an operator, a partial is a component of an FM or additive voice (q.v.).
|
|||
|
On the Roland MT-32/LAPC-1 synthesizer, each voice may use from 1 to 4 of 32 available
|
|||
|
partials. On the Ad Lib, Sound Blaster, and other YM3812-based cards, each voice requires 2
|
|||
|
of 18 available partials. The Yamaha YMF262 (OPL3) device, used in some newer FM sound
|
|||
|
cards, provides 36 partials which may be assigned in groups of 2 or 4 per voice.
|
|||
|
|
|||
|
Patch: A patch associates a timbre with a given MIDI channel. In general, the details of patch
|
|||
|
manipulation are handled automatically by the AIL drivers. For information on a given
|
|||
|
synthesizer's patch format, consult the programming manual for the device in question.
|
|||
|
|
|||
|
Patch Bank: See Bank
|
|||
|
|
|||
|
PCM: Abbreviation for Pulse Code Modulation, the technique used for most sampled sound
|
|||
|
playback on the PC. A common variation which implements rudimentary data compression is
|
|||
|
known as ADPCM, or ADaptive Pulse Code Modulation.
|
|||
|
|
|||
|
Polyphonic: Refers to a synthesizer's ability to play more than one voice at a time.
|
|||
|
|
|||
|
Sequence: Simply put, a musical work expressed as a series (sequence) of MIDI events.
|
|||
|
|
|||
|
Sysex: See MIDI System Exclusive Message.
|
|||
|
|
|||
|
System Exclusive Message: See MIDI System Exclusive Message.
|
|||
|
|
|||
|
Timbre: In the Audio Interface Library's parlance, a timbre (pronounced tim'-ber, or
|
|||
|
tam'-ber) is a software definition of a musical instrument. See also Bank and Bankfile.
|
|||
|
|
|||
|
Timbre Cache: Some AIL XMIDI drivers require the application to set aside a small area of
|
|||
|
memory to store instrument definitions. This area is known as the timbre cache. See the API
|
|||
|
Reference's discussion of the AIL_default_timbre_cache_size() function for more information.
|
|||
|
|
|||
|
Track: A logical division of a MIDI sequence. Often, the composer associates a single MIDI
|
|||
|
channel with each track, placing all performance data for each instrument on its own track.
|
|||
|
Voice: As used in the Audio Interface Library, the term voice refers to the minimum
|
|||
|
synthesizer resources needed to play a single note with a given instrument. The Ad Lib and
|
|||
|
similar devices provide a total of 9 simultaneous voices, while the Roland MT-32/LAPC-1
|
|||
|
synthesizer can generate from 8 to 32 voices at once, depending on the number of partials
|
|||
|
(q.v.) used by each voice.
|
|||
|
|
|||
|
XMIDI: Abbreviation for eXtended MIDI. See the preceding parts of this section for details.
|
|||
|
|