Skip to content
ceski edited this page Apr 30, 2024 · 1 revision

Native MIDI Implementation

Woof! provides native MIDI support via WinMM for Windows, ALSA for Linux, and Core MIDI for macOS.

Configuration

The following config keys are located in woof.cfg:

Key Value Description
midi_complevel 0 Vanilla
1 Standard
2 Full
Compatibility level. "Vanilla" emulates Doom's DMX driver. "Standard" emulates Microsoft GS Wavetable Synth. "Full" sends all MIDI messages.
midi_reset_type 0 No SysEx
1 General MIDI
2 Roland GS
3 Yamaha XG
Reset type. "No SysEx" is a partial reset for devices that don't support the others.
midi_reset_delay -1 Auto
0 to 2000 ms
Delay after reset. Hardware devices require time to execute a reset. If the first few notes of a song are cut off, try increasing this value.
midi_ctf 0 Disable
1 Enable
Emulate Roland SC-55 capital tone fallback (CTF). Attempts to fix incorrectly written songs that cause missing notes, pianos sounds, or silence.

Legend

Symbol Meaning
✔️ Supported
⚠️ Conditionally supported, see notes
Not supported

Channel and System Messages

Status Byte MIDI Message Vanilla Standard Full
0x8n Note Off ✔️ ✔️ ✔️
0x9n Note On ✔️ ✔️ ✔️
0xAn Polyphonic Key Pressure (Aftertouch) ✔️
0xBn Control Change (Controller) ✔️ ✔️ ✔️
0xCn Program Change ✔️ ✔️ ✔️
0xDn Channel Pressure (Channel Aftertouch) ✔️
0xEn Pitch Bend ✔️ ✔️ ✔️
0xF0 SysEx SOX ✔️
0xF7 SysEx EOX ✔️
0xFF Meta Message ✔️ ✔️ ✔️

Meta Messages

Meta Type Function Vanilla Standard Full
0x06 Marker (Final Fantasy: loopStart, loopEnd) ✔️ ✔️
0x2F End of Track ✔️ ✔️ ✔️
0x51 Set Tempo ✔️ ✔️ ✔️

Registered Parameter Numbers

RPN MSB RPN LSB Function Vanilla Standard Full
0x00 0x00 Pitch Bend Sensitivity ✔️ ✔️
0x00 0x01 Channel Fine Tuning ✔️ ✔️
0x00 0x02 Channel Coarse Tuning ✔️ ✔️
0x00 0x03 Tuning Program Select ✔️
0x00 0x04 Tuning Bank Select ✔️
0x00 0x05 Modulation Depth Range ✔️
0x7F 0x7F RPN NULL ✔️ ✔️

Controllers

CC# Hex Function Vanilla Standard Full
0 0x00 Bank Select (MSB) ✔️ ✔️
1 0x01 Modulation Wheel (MSB) ✔️ ✔️ ✔️
2 0x02 Breath Controller (MSB) ✔️
4 0x04 Foot Controller (MSB) ✔️
5 0x05 Portamento Time (MSB) ✔️
6 0x06 Data Entry (MSB) ✔️ ✔️
7 0x07 Channel Volume (MSB) ✔️ ✔️ ✔️
8 0x08 Balance (MSB) ✔️
10 0x0A Pan (MSB) ✔️ ✔️ ✔️
11 0x0B Expression (MSB) ✔️ ✔️ ✔️
12 0x0C Effect Control 1 (MSB) ✔️
13 0x0D Effect Control 2 (MSB) ✔️
16 0x10 General Purpose Controller 1 (MSB) ✔️
17 0x11 General Purpose Controller 2 (MSB) ✔️
18 0x12 General Purpose Controller 3 (MSB) ✔️
19 0x13 General Purpose Controller 4 (MSB) ✔️
32 0x20 Bank Select (LSB) ✔️ ✔️
33 0x21 Modulation Wheel (LSB) ✔️
34 0x22 Breath Controller (LSB) ✔️
36 0x24 Foot Controller (LSB) ✔️
37 0x25 Portamento Time (LSB) ✔️
38 0x26 Data Entry (LSB) ✔️ ✔️
39 0x27 Channel Volume (LSB)
40 0x28 Balance (LSB) ✔️
42 0x2A Pan (LSB) ✔️
43 0x2B Expression (LSB) ✔️
44 0x2C Effect Control 1 (LSB) ✔️
45 0x2D Effect Control 2 (LSB) ✔️
48 0x30 General Purpose Controller 1 (LSB) ✔️
49 0x31 General Purpose Controller 2 (LSB) ✔️
50 0x32 General Purpose Controller 3 (LSB) ✔️
51 0x33 General Purpose Controller 4 (LSB) ✔️
64 0x40 Sustain Pedal (Damper, Hold 1) ✔️ ✔️ ✔️
65 0x41 Portamento On/Off ✔️
66 0x42 Sostenuto ✔️
67 0x43 Soft Pedal ✔️ ⚠️[1] ✔️
68 0x44 Legato Footswitch ✔️
69 0x45 Hold 2 ✔️
70 0x46 Sound Controller 1 (Default: Sound Variation) ✔️
71 0x47 Sound Controller 2 (Default: Timbre/Harmonic Quality) ✔️
72 0x48 Sound Controller 3 (Default: Release Time) ✔️
73 0x49 Sound Controller 4 (Default: Attack Time) ✔️
74 0x4A Sound Controller 5 (Default: Brightness) ✔️
75 0x4B Sound Controller 6 (GM2 Default: Decay Time) ✔️
76 0x4C Sound Controller 7 (GM2 Default: Vibrato Rate) ✔️
77 0x4D Sound Controller 8 (GM2 Default: Vibrato Depth) ✔️
78 0x4E Sound Controller 9 (GM2 Default: Vibrato Delay) ✔️
79 0x4F Sound Controller 10 (GM2 Default: Undefined) ✔️
80 0x50 General Purpose Controller 5 ✔️
81 0x51 General Purpose Controller 6 ✔️
82 0x52 General Purpose Controller 7 ✔️
83 0x53 General Purpose Controller 8 ✔️
84 0x54 Portamento Control ✔️
88 0x58 High Resolution Velocity Prefix ✔️
91 0x5B Effects 1 Depth (Default: Reverb Send Level) ✔️ ⚠️[1] ✔️
92 0x5C Effects 2 Depth (Default: Tremolo Depth) ✔️
93 0x5D Effects 3 Depth (Default: Chorus Send Level) ✔️ ⚠️[1] ✔️
94 0x5E Effects 4 Depth (Default: Celeste [Detune] Depth) ✔️
95 0x5F Effects 5 Depth (Default: Phaser Depth) ✔️
96 0x60 Data Increment ✔️
97 0x61 Data Decrement ✔️
98 0x62 Non-Registered Parameter Number (LSB) ✔️
99 0x63 Non-Registered Parameter Number (MSB) ✔️
100 0x64 Registered Parameter Number (LSB) ✔️ ✔️
101 0x65 Registered Parameter Number (MSB) ✔️ ✔️
110 0x6E EMIDI: Track Designation ✔️ ✔️
111 0x6F EMIDI: Track Exclusion / RPG Maker Loop ⚠️[2] ⚠️[2]
112 0x70 EMIDI: Program Change ✔️ ✔️
113 0x71 EMIDI: Channel Volume ✔️ ✔️
116 0x74 EMIDI: Loop Begin ✔️ ✔️
117 0x75 EMIDI: Loop End ✔️ ✔️
118 0x76 EMIDI: Global Loop Begin ✔️ ✔️
119 0x77 EMIDI: Global Loop End ✔️ ✔️
120 0x78 All Sound Off ✔️ ✔️ ✔️
121 0x79 Reset All Controllers ✔️ ✔️ ✔️
122 0x7A Local Control On/Off ✔️
123 0x7B All Notes Off ✔️ ✔️ ✔️
124 0x7C Omni Mode Off ✔️
125 0x7D Omni Mode On ✔️
126 0x7E Poly Mode Off (Mono Mode On) ✔️ ✔️
127 0x7F Poly Mode On (Mono Mode Off) ✔️ ✔️

Notes

  1. Soft Pedal (CC#67), Reverb Send Level (CC#91), and Chorus Send Level (CC#93) are not supported by Microsoft GS Wavetable Synth but are included at Standard compatibility level to match Vanilla and Full.
  2. RPG Maker Loop conflicts with EMIDI: Track Exclusion (CC#111 for both). An RPG Maker loop point will function only if no EMIDI events are found in the MIDI file.