GDVP License

Midi

8 · MIDI Implementation

← Patch Management · Manual index · Next: The Front Panel →

GDVP is a "Universal Host" MIDI device: 16-channel multitimbral, 14-bit-capable, with NRPN support and a defined CC map (Canonical MIDI Implementation Schema, MIS v0.9.1). This chapter documents the control surface and — importantly — which messages are fully wired vs. tracked but stubbed. Sources: gdvp_midi_processor.c/.h, gdvp/config/gdvp_canonical_map.json.


8.1 Channels map to Parts

MIDI channel N → Part (N−1). Channel 1 = Part 0, … channel 16 = Part 15. Each Part is an independent instrument with its own patch and voice mode (Concepts §1.1). There are 16 of each, so the mapping is exact and fixed. The MIDI state matrix tracks all 128 CCs across all 16 channels independently (gdvp_midi_state_matrix_t).

Manufacturer / model IDs: GDVP = 125, model "Producer Engine" = 1 (from the canonical map).


8.2 Notes, velocity, panic

  • Note-on / note-off drive the Part's voice mode via the VAM. The host-side entry points are gdvp_system_host_note_on/off(system, part_id, note, velocity).
  • Velocity (0–127) is carried into the voice and scales the envelope.
  • All Notes Off (CC 123) → graceful envelope release of the channel's voices (gdvp_client_all_notes_off).
  • All Sound Off (CC 120) → hard panic, bypassing envelopes (gdvp_client_panic).
  • Reset All Controllers (CC 121) → re-initialises the MIDI state matrix to GM defaults.

8.3 High-resolution 14-bit CC pairing

GDVP natively wants 14-bit control values (Parameters §6.1). The processor handles standard MIDI 14-bit CC pairing automatically:

  • A CC 0–31 message is the MSB: it is latched and routed immediately (with zero LSB) so coarse moves respond instantly.
  • The matching CC 32–63 message is the LSB: it is combined with the latched MSB (MSB<<7 | LSB) for a full 14-bit update.
  • A standalone 7-bit CC is expanded value << 7 to 14-bit.

So you get smooth high-resolution control if your controller sends MSB/LSB pairs, and sane behaviour if it sends 7-bit only.


8.4 The control map

These are the explicit, guaranteed bindings from gdvp_canonical_map.json.

Control Change (CC)

CC Name Parameter
1 Mod Wheel GDVP_PARAM_MOD_WHEEL_CV
7 Volume GDVP_PARAM_VOLUME_CV
10 Pan GDVP_PARAM_PAN_CV
16 Osc1 Pitch Bend GDVP_PARAM_OSC1_PITCH_BEND_CV
17 Osc1 Pulse Width GDVP_PARAM_OSC1_PWM_CV
18 Osc1 Shape GDVP_PARAM_OSC1_SHAPE_CV
20 Osc2 Pitch Bend GDVP_PARAM_OSC2_PITCH_BEND_CV
21 Osc2 Pulse Width GDVP_PARAM_OSC2_PWM_CV
22 Osc2 Shape GDVP_PARAM_OSC2_SHAPE_CV
23 Osc2 Detune GDVP_PARAM_OSC2_DETUNE_CV
24 Osc Mix GDVP_PARAM_OSC_MIX_CV
71 Filter Resonance (Timbre) GDVP_PARAM_FILTER_RESONANCE_CV
74 Filter Cutoff (Brightness) GDVP_PARAM_FILTER_CUTOFF_CV
75 Filter Env Attack GDVP_PARAM_FILTER_ATTACK_CV
76 Filter Env Decay GDVP_PARAM_FILTER_DECAY_CV
77 Filter Env Sustain GDVP_PARAM_FILTER_SUSTAIN_CV
78 Filter Env Release GDVP_PARAM_FILTER_RELEASE_CV

NRPN

NRPN (MSB/LSB) Name Parameter
1 / 0 Oscillator FM Depth GDVP_PARAM_OSC_FM_DEPTH_CV
1 / 1 Oscillator FM Ratio GDVP_PARAM_OSC_FM_RATIO_CV
2 / 0 Filter Drive GDVP_PARAM_FILTER_DRIVE_CV
2 / 1 Filter Type GDVP_PARAM_FILTER_TYPE_CV

NRPN selection uses the standard CC 99/98 (MSB/LSB) sequence; data entry follows.

Mixer (front-panel CCs)

The mixer master/input gains are exposed on CC 87–90+ (GDVP_PARAM_MIXER_MASTER_GAIN, GDVP_PARAM_MIXER_INPUT_GAIN_0…5) for hands-on mixing from a controller.


8.5 What is tracked but NOT yet acted on

Several standard messages are received and stored in the MIDI matrix but currently perform no engine action — the handler returns success without doing anything. Don't rely on these yet:

Message Status
CC 64 Damper / Sustain pedal ⚠️ tracked, no sustain action (facade hook not wired)
CC 65 Portamento on/off ⚠️ tracked, no action
CC 66 Sostenuto ⚠️ tracked, no action
CC 68 Legato footswitch ⚠️ tracked, no action
CC 126 Mono Mode On ⚠️ acknowledged, does not reconfigure the VAM
CC 127 Poly Mode On ⚠️ acknowledged, does not reconfigure the VAM
CC 91 Reverb depth, CC 93 Chorus depth routed as generic sound-controllers; the GFX effects they drive are now active and wired to the Global EFX Bus

To change voice mode today, use the front-panel control / gdvp_param_bridge_update_voice_mode, not CC 126/127. See Appendix A.


8.6 Pitch bend & aftertouch

The parameter space defines MPE-style targets — GDVP_PARAM_PITCH_BEND_CV, GDVP_PARAM_CHANNEL_PRESSURE_CV, GDVP_PARAM_POLY_PRESSURE_CV (Parameters §6.4). Pitch bend is applied per-Part in the voice executor with a default ±2 semitone range (0–48 configurable), added to all sounding voices (Performance §3.7). The CC matrix reserves tracking slots for pitch-bend and aftertouch alongside the 128 CCs (130 tracking targets per Part).


8.7 Smart CC immunity

To protect the real-time audio thread, host CCs pass through a decimation layer (gdvp_host_push_smart_cc) before reaching the engine:

  • Noise floor: changes smaller than GDVP_CC_NOISE_FLOOR (8, in 14-bit CV) are ignored — controller jitter doesn't flood the queue.
  • Max latency: a value is force-pushed at least every GDVP_CC_MAX_LATENCY_MS (50 ms) even if below the noise floor, so slow sweeps still track.
  • Load-aware routing: routing adapts to SPSC queue capacity under heavy traffic.

This is why ultra-fine CC dithering may not register, but musical moves always do — and why a busy MIDI stream can't glitch the audio. See Concepts §1.4.


← Patch Management · Manual index · Next: The Front Panel →