Microsoft GS Wavetable Synth (“MSGS”)
Supported Events
-
Updated
Numbers denoted like FF represent a hexadecimal
number. Fx means F0 plus
x, where x is a variable
number from 0-15 (0 to F).
GENERAL NOTE:
Roland's GS standard has the concept of parts as
separate from MIDI channels. There are 16 of them,
and by default, these match their respective MIDI channels
(Part 1 maps to Ch.1, Part 2 maps to Ch.2, and so on).
Part IDs (which marks their location in a GS device's memory)
are mapped in a weird way. Part 10 has ID 0.
Parts 11 to 16 are assigned the IDs 10 - 15, while the
rest has IDs matching their part numbers (e.g. Part 1 has ID 1).
For this section, CC numbers will be given in decimal
and will be represented as regular text.
Bank select (MSB: 0, LSB: 32)
Sets the bank for the next program change. This allows
the use for variations on instrument sounds. For example,
patch 81 is a square wave lead, but setting the bank
MSB to 1 will produce as pure as approximation of a 50%
square wave as possible. Setting it to 8 will give you a
sine wave instead. You can refer to this list for a short description
of what variations are available.
Keep in mind that setting this CC after a program change will
not have any effect!
In addition, this will only work after
the GS Reset SysEx has
been sent. Some software such as vanBasco's Karaoke Player
can do this automatically, however.
RPN numbers are given as xxyy,
where xx is the RPN number's MSB, and yy is its LSB.
Pitch bend (0000)
Range of bending for the Pitch Bend message.
Upon data entry, only MSB is taken
into account, while LSB is ignored.
In this case, this means only the range in semitones
are considered.
Fine tune (0001)
Transposes the entire part by some amount of cents
relative to 2000 (= A 440Hz)
Both LSB and MSB are accepted on data entry.
Coarse tune (0002)
Transposes the entire part by some amount
of semitones relative to MSB = 40
(= A 440Hz).
Upon data entry, only MSB is taken
into account, while LSB is ignored.
Let SYSEX, where SYSEX is an
array containing the entire SysEx string as a series
of 8-bit numbers from start (marked with F0) to finish
(marked with F7). The array starts at 0, so
SYSEX[0] = F0.
Array slices are written in Python's slice notation, so
SYSEX[:3] == SYSEX[0:3] ==
{SYSEX[0], SYSEX[1], SYSEX[2]}.
Example: SYSEX = F0 41 10 42 12 40 00 7F 00 41 F7
SYSEX[0]: F0
SYSEX[1:3]: 41 10
SYSEX[3:7]: 42 12 40 00
and so on…
In general:
SYSEX must have a minimum length of 6 bytes.
SYSEX[2] normally contains the device or
sysex channel ID.
It is ignored in MSGS.
SYSEX[1] contains a vendor ID, of which only
three are recognized:
Continuing from above, SYSEX[4] = 01.
This enables strict GM mode. However, whichever value is found
in here doesn't seem to actually matter, and will set GM mode regardless.
SYSEX must have a minimum length of 11 bytes.
This includes the checksum byte.
However, although the checksum byte must be present to
fulfill the 11 bytes minimum, it is not
actually checked.
Keep in mind that setting an invalid checksum
may render it not working on proper GS hardware.
SYSEX[3:5] must be 42 12
(pick GS model ID, send the following SysEx data).
SYSEX[5:8] contains the GS address to be
modified (and hence the operation to be done), and will
be one of the following:
40 00 7F = GS Reset.
This switches the
synth to GS-compatible mode, and must be sent
first in order to use the operations below,
as well as the bank select CC.
Any data following this reset address won't have any effect.
40 1x 02 = Set MIDI Channel for
This Part.
x is the part ID.
A single byte yy follows, and is
the MIDI channel to map that part to. I believe this is
expressed normally, with 00 specifying
the first MIDI channel and 0F specifying the
last one.
40 1x 15 = Set as Drum Channel.
x is the part ID.
A single byte yy follows, and is
either 00 (for False) or 01
(for True).
40 1x 40 = Scale Tuning.
x is the part ID.
Directly following this is the tuning adjustment for
12 notes on the scale, made up of 7-bit numbers
where 00 is an adjustment of -64.
If tuning data is for less than 12 notes, it can
be terminated by inserting an 80.
The maximum number of MIDI events it can
handle per second is 1000.
Maximum polyphony appears to be 32 voices, although some say
it's 64 in Windows XP. "Certain sources" say this appears to
be actually 48 (+6 overload voices). Whatever the case,
it seems noticeably reduced by now.
A quirk of the synth is that one note played in quick
succession will immediately kill the previous instance
of that note, say a snare drum with velocity 127
and then another with velocity 59—the lower velocity
snare drum will
cut off the higher velocity one including envelopes.
This effect may
be used for echo effects or a quick release, however
this may not work as expected on more advanced synths.
The lack of customization for CC 1 (Mod Wheel)
may drive you to use the pitch wheel messages. In which
case, ensure that the ranges are defined by setting
RPN 0000 appropriately.
MSGS prioritizes notes playing at
lower channel numbers
than higher ones, for example Ch.1 is prioritized over
Ch.2. If you find yourself bumping up against
the polyphony limit, consider giving your channel layout
a look.
BotB's Lyceum entry on MSGS. Contains general info on how to compose for this thing and basically summarizes this entire page in practical terms (for most use cases).
Roland SC-55 owner's manual. This is known to be the synthesizer that MSGS emulates (poorly), and you may find more info about GS and Roland's SysEx structure here.