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).

Messages #

Note off (8x) and note on (9x)
The most basic MIDI event.
Control change (Bx)
See the list of supported CCs.
Program change (Cx)
For changing the currently playing instrument of a part.
Pitch bend (Ex)
For twangs and the like.

Control changes (CC) #

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 select (MSB: 101, LSB: 100)
Sets the RPN to be affected by the Data entry CC. See the supported RPN list.
NRPN select (MSB: 99, LSB: 98)

Normally sets NRPN to be affected by the Data entry CC. In MSGS however, no NRPNs are supported, leaving this effectively useless.

That's not to say it doesn't do anything, however. If this CC is encountered, MSGS always sets it to 3FFF, the RPN reset ID.

Data entry (MSB: 6, LSB: 38)
Sets the currently selected RPN or NRPN to the specified value.
Modulation wheel (MSB: 1, LSB: 33)
Sets an automatic vibrato effect, set to a rate of about 5 Hz. Its equivalent LSB CC is ignored.
Volume (7)
Sets the current part's overall volume level (0–127).
Pan (10)
Sets the current part's panning balance (0 = hard left, 64 = centered, 127 = hard right).
Expression (11)
Modifies the part's volume continuously. Useful for things like crescendos.
Hold/sustain pedal (64)
When set, this sustains currently-playing notes until it is reset.
All sound off (120)
Kills all sound indiscriminately. Can also be used as a "panic" button.
All controllers off (121)
Resets the state of all controllers. Specifically:
All notes off (123)
Kills all notes. If the Hold/Sustain Pedal is enabled, it waits until that particular CC is disabled first.
Mono mode (126)
Kills all notes and enables Mono mode for this particular part.
Poly mode (127)
Kills all notes and enables Poly mode for this particular part.

Registered Parameter Numbers #

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.

System Exclusives (SysEx) #

This section will use the following convention:

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

In general:

SYSEX[1] contains a vendor ID, of which only three are recognized:

Universal non-realtime #

Only GM Reset is supported by this vendor ID:

Universal realtime #

Only Set Master Volume is supported by this vendor ID:

Roland #

For this vendor ID:

SYSEX[5:8] contains the GS address to be modified (and hence the operation to be done), and will be one of the following:

Additional Information #

See Also #