MILC logo

IndexVorigeVolgendeLeeg

Standard MIDI spec 1.1 [1/2]
MIDI Assoc., 01-09-94


    
3 - Meta-Events

A  few meta-events are defined herin. It is not required for every  program
to support every meta-event.

In the syntax descriptions for each of the meta-events a set of conventions
is  used  to describe parameters of the events. The FF  which  begins  each
event, the type of each event, and the lengths of events which do not  have
a  variable  amount of data are given directly in hexadecimal.  A  notation
such  as dd or se, which consists of two lower-case  letters,  mnemonically
represents  an 8-bit value. Four identical lower-case letters such as  wwww
mnemonically  refer to a 16-bit value, stored most-significant-byte  first.
Six  identical lower-case letters such as tttttt refer to a  24-bit  value,
stored  most-significan-byte first. The notation len refers to  teh  length
portion of the meta-event syntax, that is, a number, stored as a  variable-
length  quantity, which specifies how many bytes (possibly text) data  were
just specified by the length.

In  general, meta-events in a track which occur at the same time may  occur
in any order. If a copyright event is used, it should be placed as early as
possible  in  the file, so it will be noticed easily. Sequence  Number  and
Sequence/Track  Name events, if present, must appear at time 0. An  end-of-
track event must occur as the last event in the track.

Meta-events initially defined include:

FF 00 02                     Sequence Number
    This  optional  event, which must occur at the beginning  of  a  track,
    before  any  nonzero  delta-times, and before  any  transmittable  MIDI
    events, specifies the number of a sequence. In a format 2 MIDI File, it
    is used to identify each "pattern" so that a "song" sequence using  the
    Cue  message to refer to the patterns. If the ID numbers  are  omitted,
    the sequences' lacations in order in the file are used as defaults.  In
    a format 0 or 1 MIDI File, which only contain one sequence, this number
    should  be  contained  in the first (or only)  track.  If  transfer  of
    several multitrack sequences is required, this must be done as a  group
    of format 1 files, each with a different sequence number.

FF 01 len text               Text Event
    Any amount of text describing anything. It is a good idea to put a text
    event right at the beginning of a track, with the name of the track,  a
    description  of its intended orchestration, and any  other  information
    which the user wants to put there. Text events may also occur at  other
    times in a track, to be used as lyrics, or descriptions of cue  points.
    The text in this event should be printable ASCII characters for maximum
    interchange.  However, other characters codes using the high-order  bit
    may be used for interchange of files between different programs on  the
    same  computer which supports an extended character set. Programs on  a
    computer  which  does not support non-ASCII  characters  should  ignore
    those characters.

    Meta-event  types 01 through 0F are reserved for various types of  text
    events,  each of which meets the specification of text  events  (above)
    but is used for a different purpose:

FF 02 len text               Copyright Notice
    Contains a copyright notice as printable ASCII text. The notice  should
    contain the characters (C), the year of the copyright, and the owner of
    the  copyright. If several pieces of music are in the same  MIDI  File,
    all of the copyright notices should be placed together in this event so
    that it will be at the beginning of the file. This event should be  the
    first event in the track chunk, at time 0.

FF 03 len text               Sequence/Track Name
    If in a format 0 track, or the first track in a format 1 file, the name
    of the sequence. Otherwise, the name of the track.

FF 04 len text               Instrument Name
    A description of the type of instrumentation to be used in that  track.
    May  be  used  with the MIDI Prefix meta-event to  specify  which  MIDI
    channel the description applies to, or the channel may be specified  as
    text in the event itself.

FF 05 len text               Lyric
    A  lyric to be sung. Generally, each syllable will be a seperate  lyric
    event which begins at the event's time.

FF 06 len text               Marker
    Normally  in a format 0 track, or the first track in a format  1  file.
    The  name of that point in the sequence, such as a rehersal  letter  or
    section name ("First Verse", etc.)

FF 07 len text               Cue Point
    A description of something happening on a film or video screen or stage
    at that point in the musical score ("Car crashes into  house",
    "curtain opens", "she slaps his face", etc.)

FF 20 01 cc                  MIDI Channeel Prefix
    The  MIDI  channel  (0-15)  containted in this event  may  be  used  to
    associate a MIDI channel with all events which follow, including System
    exclusive  and meta-events. This channel is "effective" until the  next
    normal  MIDI event (which contains a channel) or the next MIDI  Channel
    Prefix meta-event. If MIDI channels refer to "tracks", this message may
    into  a  format 0 file, keeping their non-MIDI data associated  with  a
    track. This capability is also present in Yamaha's ESEQ file format.

FF 2F 00                     End of Track
    This  event  is not optional. It is included so that  an  exact  ending
    point may be specified for the track, so that an exect length, which is
    necessary for tracks which are looped or concatenated.


FF 51 03 tttttt              Set Tempo
                             (in microseconds per MIDI quarter-note)
    This   event  indicates  a  tempo  change.  Another  way   of   putting
    "microseconds  per  quarter-note" is "24ths of a microsecond  per  MIDI
    clock".  Repersenting tempos as time per beat instead of beat per  time
    allows absolutly exact long-term synchronization with a time-based sync
    protocol  such  as SMPTE time code or MIDI time code.  This  amount  of
    accuracy  provided by this tempo resolution allows a four-minute  piece
    at  120 beats per minute to be accurate within 500 usec at the  end  of
    the  piece. Ideally, these events should only occur where  MIDI  clocks
    would  be  located -- this convention is intended to  guarntee,  or  at
    least   increase   the   liklihood,   of   compatibility   with   other
    synchronization  devices so that a time signature/tempo map  stored  in
    this format may easily be transfered to another device.

FF 54 05 hr mn se fr ff      SMPTE Offset
    This  event, if present, designates the SMPTE time at which  the  track
    chunk  is supposed to start. It should be present at the  beginning  of
    the  track,  that is, before any nonzero delta-times,  and  before  any
    transmittable  MIDI  events. the hour must be encoded  with  the  SMPTE
    format, just as it is in MIDI Time Code. In a format 1 file, the  SMPTE
    Offset must be stored with the tempo map, and has no meaning in any  of
    the other tracks. The ff field contains fractional frames, in 100ths of
    a  frame,  even in SMPTE-based tracks which specify a  different  frame
    subdivision for delta-times.

FF 58 04 nn dd cc bb         Time Signature
    The  time signature is expressed as four numbers. nn and  dd  represent
    the  numerator  and denominator of the time signature as  it  would  be
    notated.  The  denominator is a neqative power of two: 2  represents  a
    quarter-note,  3  represents  an eighth-note,  etc.  The  cc  parameter
    expresses  the  number  of MIDI clocks in a  metronome  click.  The  bb
    parameter  expresses  the  number  of  notated  32nd-notes  in  a  MIDI
    quarter-note (24 MIDI clocks). This was added because there are already
    multiple  programs which allow a user to specify that what MIDI  thinks
    of as a quarter-note (24 clocks) is to be notated as, or related to  in
    terms of, something else.

    Therefore, the complete event for 6/8 time, where the metronome  clicks
    every three eighth-notes, but there are 24 clocks per quarter-note,  72
    to the bar, would be (in hex):

               FF 58 04 06 03 24 08

    That is, 6/8 time (8 is 2 to the 3rd power, so this is 06 03), 36  MIDI
    clocks  per dotted-quarter (24 hex!), and eight notated 32nd-notes  per
    quarter-note.


FF 59 02 sf mi               Key Signature
    sf = -7: 7 flats
    sf = -1: 1 flat
    sf =  0: key of C
    sf =  1: 1 sharp
    sf =  7: 7 sharps

    mi =  0: major key
    mi =  1: minor key

FF 7F len data               Sequencer Specific Meta-Event
    Special requirements for particular sequencers may use this event type:
    the  first  byte or bytes of data is a manufacturer ID (these  are  one
    byte,  or  if the first byte is 00, three bytes). As with  MIDI  System
    Exclusive,  manufacturers  who define something using  this  meta-event
    should  publish  it  so that others may be used by  a  sequencer  which
    elects  to  use  this as its only file format;  sequencers  with  their
    established  feature-specific  formats  should probably  stick  to  the
    standard features when using this format.

4 - Program Fragments and Example MIDI Files

Here are some of the routines to read and write variable-length numbers  in
MIDI Files. These routines are in C, and use getc and putc, which read  and
write single 8-bit characters from/to the files infile and outfile.

WriteVarLen (value)
register long value;
(
   register long buffer;

   buffer = value & 0x7f;
   while ((value >>= 7) > 0)
   (
      buffer <<= 8;
      buffer |= 0x80;
      buffer += (value & 0x7f);
   )

   while (TRUE)
   (
      putc(buffer,outfile);
      if (buffer & 0x80)
         buffer >>= 8;
      else
         break;
   )
)

doubleword ReadVarLen ()
(
   register doubleword value;
   register byte c;

   if ((value = getc(infile)) & 0x80)
   (
      value &= 0x7f;
      do
      (
         value = (value << 7) + ((c = getc(infile))) & 0x7f);
      ) while (c & 0x80);
   )
   return (value);
)


As an example, MIDI Files for the following excerpt are shown below. First,
a format 0 file is shown, with all information intermingled; then, a format
1 file is shown with all data seperated into four tracks: one for tempo and
time  signature,  and three for the notes. A resolution of 96  "ticks"  per
quarter  note is used. A time signature of 4/4 and a tempo of  120,  though
implied, are explicitly stated.





                   |\
              ---- | > ---------------------------------------
                   |/         ____                    O
Channel 1     ---- X --------------------------------|--------
                  /                                  |
Preset 5      -- / | --------------------------------|--------
                / ____                               |
              -|   |  \ --------------------------------------
                \  |   |
              -- \_|__/ --------------------------------------
                  _|


                   |\
              ---- | > ---------------------------------------
                   |/           \
Channel 2     ---- X ------------>----------|-----------------
                  /             /           |
Preset 46     -- / | ----------<------------|-----------------
                / ____          \           | .
              -|   |  \ --------->---------O------------------
                \  |   |       (
              -- \_|__/ --------\-----------------------------
                  _|             \


                              --O--

              ----__ -----------------------------------------
                 /  \  .
Channel 3     - /    | ---------------------------------------
                     | .
Preset 70     ------ | ---------------------------------------
                    /           O
              ---- / -----------------------------------------
                  /
              -- / -------------------------------------------


The contents of the MIDI stream represented by this example are broken down
here:

Delta-Time  Event-Code  Other Bytes     Comment
(decimal)   (hex)       (decimal)
----------  ----------  -----------     -----------------------------
0           FF 58       04 04 02 24 08  4 bytes; 4/4 time; 24 MIDI
                                        clocks/click, 8 32nd notes/
                                        24 MIDI clocks
0           FF 51       03 500000       3 bytes: 500,000 usec/
                                        quarter note
0           C0          5               Ch.1 Program Change 5
0           C1          46              Ch.2 Program Change 46
0           C2          70              Ch.3 Program Change 70
0           92          48 96           Ch.3 Note On C2, forte
0           92          60 96           Ch.3 Note On C3, forte
96          91          67 64           Ch.2 Note On G3, mezzo-forte
96          90          76 32           Ch.1 Note On E4, piano
192         82          48 64           Ch.3 Note Off C2, standard
0           82          60 64           Ch.3 Note Off C3, standard
0           81          67 64           Ch.2 Note Off G3, standard
0           80          76 64           Ch.1 Note Off E4, standard
0           FF 2F       00              Track End

The  entire  format 0 MIDI file contents in hex follow.  First, the  header
chunk:
              40 54 68 64              MThd
              00 00 00 06              chunk length
              00 00                    format 0
              00 01                    one track
              00 60                    96 per quarter-note

Then the track chunk. Its header followed by the events (notice the running
status is used in places):

              4D 54 72 6B              MTrk
              00 00 00 3B              chunk length (59)

Delta-Time    Event                    Comments
----------    -----------------------  -------------------------------
00            FF 58 04 04 02 18 08     time signature
00            FF 51 03 07 A1 20        tempo
00            C0 05
00            C1 2E
00            C2 46
00            92 30 60
00            3C 60                    running status
60            91 43 40
60            90 4C 20
81 40         82 30 40                 two-byte delta-time
00            3C 40                    running status
00            81 43 40
00            80 4C 40
00            FF 2F 00                 end of track

A  format  1 representation of the file is slightly different.  Its  header
chunk:

              4D 54 68 64              MThd
              00 00 00 06              chunk length
              00 01                    format 1
              00 04                    four tracks
              00 60                    96 per quarter note

First,  the  track chunk for the time signature/tempo  track.  Its  header,
followed by the events:

              4D 54 72 6B              MTrk
              00 00 00 14              chunk length (20)

Delta-Time    Event                    Comments
----------    -----------------------  -------------------------------
00            FF 58 04 04 02 18 08     time signature
00            FF 51 03 07 A1 20        tempo
83 00         FF 2F 00                 end of track

Then,  the track chunk for the first music track. The MIDI  convention  for
note on/off running status is used in this example:

              4D 54 72 6B              MTrk
              00 00 00 10              chunk length (16)

Delta-Time    Event                    Comments
----------    -----------------------  -------------------------------
00            C0 05
81 40         90 4C 20
81 40         4C 00                    Running status: note on, vel=0
00            FF 2F 00

Then, the track chunk for the second music track:

              4D 54 72 6B              MTrk
              00 00 00 0F              chunk length (15)

Delta-Time    Event                    Comments
----------    -----------------------  -------------------------------
00            C1 2E
60            91 43 40
82 20         43 00                    running status
00            FF 2F 00                 end of track


Then, the track chunk for the third music track:

              4D 54 72 6B              MTrk
              00 00 00 15              chunk length (21)

Delta-Time    Event                    Comments
----------    -----------------------  -------------------------------
00            C2 46
00            92 30 60
00            3C 60                    running status
83 00         30 00                    two-byte delta-time, running status
00            3C 00                    running status
00            FF 2F 00                 end of track

    

Index

Vorige

Volgende