Skip to content
ceski edited this page Feb 7, 2025 · 2 revisions

Native MIDI Implementation

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

Configuration File

The following native MIDI options are located in woof.cfg. The default values are recommended for most users.

Name Default Min Max Description
midi_complevel 1 0 2 Compatibility level (0 = Vanilla; 1 = Standard; 2 = Full). "Vanilla" emulates Doom's DMX driver. "Standard" emulates Microsoft GS Wavetable Synth. "Full" sends all MIDI messages.
midi_reset_type 1 0 3 Reset type (0 = No SysEx; 1 = GM; 2 = GS; 3 = XG). "No SysEx" is a partial reset for devices that don't support SysEx messages.
midi_reset_delay -1 -1 2000 Delay after reset (-1 = Auto; 0 = None; 1-2000 = Milliseconds). 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 1 0 1 Fix invalid instruments by emulating SC-55 capital tone fallback (CTF). This may help with missing notes, pianos sounds, or silence caused by incorrectly written songs.
midi_sysex_volume 0 0 1 Use SysEx messages to control volume. Useful for real or emulated hardware MIDI devices when making adjustments to the above options.
midi_gain 0 -20 0 Gain [dB] adjustment for native MIDI only. Does not affect other music types.

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