memlnaut-nisps/nisps/midi/generated/midi_devices.hpp
monkey-w1n5t0n 9a9b66c5ee feat(midi-devices): canonical external-synth CC templates + dual codegen
Add a durable, committed source of truth for external MIDI synth control:
- synth-midi-cc.json: verified CC maps + provenance/sources (8 devices researched)
- schemas/midi_device.schema.json + schemas/midi_devices/*.json: 6 CC-controllable
  device templates (Moog Sub 37/Sub Phatty, Creamware Pro-12 ASB, Elektron Analog
  Keys, ASM Hydrasynth, Roland JD-800), params keyed {id, cc, label, min, max,
  default, group}.
- codegen/generate-midi-devices.ts (isolated from the mode golden test) emits both
  nisps/midi/generated/midi_devices.hpp (no-heap constexpr, firmware+WASM) and
  manifold/src/midi-devices/generated/ (typed catalogue for the browser).
- codegen/seed-midi-devices.ts: reproducible seed from the research artifact.

Lets a performer pick a device and address its parameters by name (not CC number)
on both the firmware and the Manifold browser engine.
2026-06-28 20:03:17 +02:00

572 lines
37 KiB
C++

// AUTOGENERATED — do not edit. Source: schemas/midi_devices/*.json. Run `bun run codegen/generate-midi-devices.ts` to regenerate.
//
// No-heap, constexpr MIDI device templates for the RP2350 firmware (and WASM).
// Names are std::string_view into flash; CC/value fields are uint8_t.
#ifndef NISPS_MIDI_GENERATED_MIDI_DEVICES_HPP
#define NISPS_MIDI_GENERATED_MIDI_DEVICES_HPP
#include <array>
#include <cstdint>
#include <span>
#include <string_view>
namespace nisps::midi::generated {
struct MidiParam {
std::string_view id;
std::string_view label;
std::uint8_t cc;
std::uint8_t min;
std::uint8_t max;
std::uint8_t default_value;
std::string_view group;
};
struct MidiDevice {
std::string_view device_id;
std::string_view name;
std::string_view manufacturer;
std::uint8_t default_channel; // 1-16
std::uint8_t value_min;
std::uint8_t value_max;
std::span<const MidiParam> params;
};
inline constexpr std::array<MidiParam, 117> kAsmHydrasynthParams = {{
MidiParam{"bank_select_msb", "Bank Select MSB", 0, 0, 127, 64, "global"},
MidiParam{"mod_wheel", "Mod Wheel", 1, 0, 127, 64, "mod"},
MidiParam{"noise_vol", "Noise Vol", 3, 0, 127, 64, "osc"},
MidiParam{"glide_time", "Glide Time", 5, 0, 127, 64, "osc"},
MidiParam{"master_volume", "Master Volume", 7, 0, 127, 64, "mix"},
MidiParam{"noise_pan", "Noise Pan", 8, 0, 127, 64, "osc"},
MidiParam{"ring_mod_vol", "Ring Mod Vol", 9, 0, 127, 64, "mod"},
MidiParam{"ring_mod_pan", "Ring Mod Pan", 10, 0, 127, 64, "mod"},
MidiParam{"expression_pedal", "Expression Pedal", 11, 0, 127, 64, "global"},
MidiParam{"pre_fx_param1", "PRE-FX Param1", 12, 0, 127, 64, "fx"},
MidiParam{"pre_fx_param2", "PRE-FX Param2", 13, 0, 127, 64, "fx"},
MidiParam{"delay_feedback", "Delay Feedback", 14, 0, 127, 64, "fx"},
MidiParam{"delay_time", "Delay Time", 15, 0, 127, 64, "env"},
MidiParam{"macro_1", "Macro 1", 16, 0, 127, 64, "mod"},
MidiParam{"macro_2", "Macro 2", 17, 0, 127, 64, "mod"},
MidiParam{"macro_3", "Macro 3", 18, 0, 127, 64, "mod"},
MidiParam{"macro_4", "Macro 4", 19, 0, 127, 64, "mod"},
MidiParam{"macro_5", "Macro 5", 20, 0, 127, 64, "mod"},
MidiParam{"macro_6", "Macro 6", 21, 0, 127, 64, "mod"},
MidiParam{"macro_7", "Macro 7", 22, 0, 127, 64, "mod"},
MidiParam{"macro_8", "Macro 8", 23, 0, 127, 64, "mod"},
MidiParam{"osc1_wavscan", "OSC1 WavScan", 24, 0, 127, 64, "osc"},
MidiParam{"env4_attack", "ENV4 Attack", 25, 0, 127, 64, "env"},
MidiParam{"osc2_wavscan", "OSC2 WavScan", 26, 0, 127, 64, "osc"},
MidiParam{"env4_decay", "ENV4 Decay", 27, 0, 127, 64, "env"},
MidiParam{"lfo2_gain", "LFO2 Gain", 28, 0, 127, 64, "lfo"},
MidiParam{"mutator1_ratio", "Mutator1 Ratio", 29, 0, 127, 64, "mod"},
MidiParam{"mutator1_depth", "Mutator1 Depth", 30, 0, 127, 64, "mod"},
MidiParam{"mutator1_dry_wet", "Mutator1 Dry/Wet", 31, 0, 127, 64, "fx"},
MidiParam{"bank_select_lsb", "Bank Select LSB", 32, 0, 127, 64, "global"},
MidiParam{"mutator2_ratio", "Mutator2 Ratio", 33, 0, 127, 64, "mod"},
MidiParam{"mutator2_depth", "Mutator2 Depth", 34, 0, 127, 64, "mod"},
MidiParam{"mutator2_dry_wet", "Mutator2 Dry/Wet", 35, 0, 127, 64, "fx"},
MidiParam{"mutator3_ratio", "Mutator3 Ratio", 36, 0, 127, 64, "mod"},
MidiParam{"mutator3_depth", "Mutator3 Depth", 37, 0, 127, 64, "mod"},
MidiParam{"mutator3_dry_wet", "Mutator3 Dry/Wet", 39, 0, 127, 64, "fx"},
MidiParam{"mutator4_ratio", "Mutator4 Ratio", 40, 0, 127, 64, "mod"},
MidiParam{"mutator4_depth", "Mutator4 Depth", 41, 0, 127, 64, "mod"},
MidiParam{"mutator4_dry_wet", "Mutator4 Dry/Wet", 42, 0, 127, 64, "fx"},
MidiParam{"rm12_depth", "RM12 Depth (Ring Mod Depth)", 43, 0, 127, 64, "mod"},
MidiParam{"osc1_vol", "OSC1 Vol", 44, 0, 127, 64, "osc"},
MidiParam{"osc1_pan", "OSC1 Pan", 45, 0, 127, 64, "osc"},
MidiParam{"osc2_vol", "OSC2 Vol", 46, 0, 127, 64, "osc"},
MidiParam{"osc2_pan", "OSC2 Pan", 47, 0, 127, 64, "osc"},
MidiParam{"osc3_vol", "OSC3 Vol", 48, 0, 127, 64, "osc"},
MidiParam{"osc3_pan", "OSC3 Pan", 49, 0, 127, 64, "osc"},
MidiParam{"filter1_drive", "Filter1 Drive", 50, 0, 127, 64, "filter"},
MidiParam{"filter1_keytrack", "Filter1 Keytrack", 51, 0, 127, 64, "filter"},
MidiParam{"filter1_lfo1_amt", "Filter1 LFO1 Amt", 52, 0, 127, 64, "lfo"},
MidiParam{"filter1_vel_env", "Filter1 Vel Env", 53, 0, 127, 64, "env"},
MidiParam{"filter1_env1_amt", "Filter1 ENV1 Amt", 54, 0, 127, 64, "env"},
MidiParam{"filter2_cutoff", "Filter2 Cutoff", 55, 0, 127, 64, "filter"},
MidiParam{"filter2_res", "Filter2 Res", 56, 0, 127, 64, "filter"},
MidiParam{"filter2_type_morph", "Filter2 Type/Morph", 57, 0, 127, 64, "filter"},
MidiParam{"filter2_keytrack", "Filter2 Keytrack", 58, 0, 127, 64, "filter"},
MidiParam{"filter2_lfo1_amt", "Filter2 LFO1 Amt", 59, 0, 127, 64, "lfo"},
MidiParam{"filter2_vel_env", "Filter2 Vel Env", 60, 0, 127, 64, "env"},
MidiParam{"filter2_env1_amt", "Filter2 ENV1 Amt", 61, 0, 127, 64, "env"},
MidiParam{"amp_lfo2_amt", "Amp LFO2 Amt", 62, 0, 127, 64, "lfo"},
MidiParam{"delay_wet_tone", "Delay Wet Tone", 63, 0, 127, 64, "fx"},
MidiParam{"sustain_pedal", "Sustain Pedal", 64, 0, 127, 64, "env"},
MidiParam{"reverb_time", "Reverb Time", 65, 0, 127, 64, "fx"},
MidiParam{"glide_on_off", "Glide On/Off", 66, 0, 127, 64, "osc"},
MidiParam{"reverb_tone", "Reverb Tone", 67, 0, 127, 64, "fx"},
MidiParam{"post_fx_param1", "POST-FX Param1", 68, 0, 127, 64, "fx"},
MidiParam{"post_fx_param2", "POST-FX Param2", 69, 0, 127, 64, "fx"},
MidiParam{"lfo1_gain", "LFO1 Gain", 70, 0, 127, 64, "lfo"},
MidiParam{"filter1_res", "Filter1 Res", 71, 0, 127, 64, "filter"},
MidiParam{"lfo1_rate", "LFO1 Rate", 72, 0, 127, 64, "lfo"},
MidiParam{"lfo2_rate", "LFO2 Rate", 73, 0, 127, 64, "lfo"},
MidiParam{"filter1_cutoff", "Filter1 Cutoff", 74, 0, 127, 64, "filter"},
MidiParam{"lfo3_gain", "LFO3 Gain", 75, 0, 127, 64, "lfo"},
MidiParam{"lfo3_rate", "LFO3 Rate", 76, 0, 127, 64, "lfo"},
MidiParam{"lfo4_gain", "LFO4 Gain", 77, 0, 127, 64, "lfo"},
MidiParam{"lfo4_rate", "LFO4 Rate", 78, 0, 127, 64, "lfo"},
MidiParam{"lfo5_gain", "LFO5 Gain", 79, 0, 127, 64, "lfo"},
MidiParam{"lfo5_rate", "LFO5 Rate", 80, 0, 127, 64, "lfo"},
MidiParam{"env1_attack", "ENV1 Attack", 81, 0, 127, 64, "env"},
MidiParam{"env1_decay", "ENV1 Decay", 82, 0, 127, 64, "env"},
MidiParam{"env1_sustain", "ENV1 Sustain", 83, 0, 127, 64, "env"},
MidiParam{"env1_release", "ENV1 Release", 84, 0, 127, 64, "env"},
MidiParam{"env2_attack", "ENV2 Attack", 85, 0, 127, 64, "env"},
MidiParam{"env2_decay", "ENV2 Decay", 86, 0, 127, 64, "env"},
MidiParam{"env2_sustain", "ENV2 Sustain", 87, 0, 127, 64, "env"},
MidiParam{"env2_release", "ENV2 Release", 88, 0, 127, 64, "env"},
MidiParam{"env3_attack", "ENV3 Attack", 89, 0, 127, 64, "env"},
MidiParam{"env3_decay", "ENV3 Decay", 90, 0, 127, 64, "env"},
MidiParam{"reverb_dry_wet", "Reverb Dry/Wet", 91, 0, 127, 64, "fx"},
MidiParam{"delay_dry_wet", "Delay Dry/Wet", 92, 0, 127, 64, "fx"},
MidiParam{"pre_fx_mix", "PRE-FX Mix", 93, 0, 127, 64, "fx"},
MidiParam{"post_fx_mix", "POST-FX Mix", 94, 0, 127, 64, "fx"},
MidiParam{"detune", "Detune", 95, 0, 127, 64, "osc"},
MidiParam{"env3_sustain", "ENV3 Sustain", 96, 0, 127, 64, "env"},
MidiParam{"env3_release", "ENV3 Release", 97, 0, 127, 64, "env"},
MidiParam{"env5_attack", "ENV5 Attack", 102, 0, 127, 64, "env"},
MidiParam{"env5_decay", "ENV5 Decay", 103, 0, 127, 64, "env"},
MidiParam{"env5_sustain", "ENV5 Sustain", 104, 0, 127, 64, "env"},
MidiParam{"env5_release", "ENV5 Release", 105, 0, 127, 64, "env"},
MidiParam{"arp_division", "ARP Division", 106, 0, 127, 64, "arp"},
MidiParam{"arp_gate", "ARP Gate", 107, 0, 127, 64, "arp"},
MidiParam{"arp_mode", "ARP Mode", 108, 0, 127, 64, "arp"},
MidiParam{"arp_ratchet", "ARP Ratchet", 109, 0, 127, 64, "arp"},
MidiParam{"arp_chance", "ARP Chance", 110, 0, 127, 64, "arp"},
MidiParam{"osc1_cent", "OSC1 Cent", 111, 0, 127, 64, "osc"},
MidiParam{"osc2_cent", "OSC2 Cent", 112, 0, 127, 64, "osc"},
MidiParam{"osc3_cent", "OSC3 Cent", 113, 0, 127, 64, "osc"},
MidiParam{"osc3_f_rate", "OSC3 F Rate", 114, 0, 127, 64, "osc"},
MidiParam{"noise_f_rate", "Noise F Rate", 115, 0, 127, 64, "osc"},
MidiParam{"ring_mod_f_rate", "Ring Mod F Rate", 116, 0, 127, 64, "mod"},
MidiParam{"stereo_width", "Stereo Width", 117, 0, 127, 64, "global"},
MidiParam{"osc1_f_rate", "OSC1 F Rate", 118, 0, 127, 64, "osc"},
MidiParam{"osc2_f_rate", "OSC2 F Rate", 119, 0, 127, 64, "osc"},
MidiParam{"arp_octave", "ARP Octave (repurposed from standard 'All Sounds Off')", 120, 0, 127, 64, "arp"},
MidiParam{"arp_length", "ARP Length", 122, 0, 127, 64, "arp"},
MidiParam{"all_notes_off", "All Notes Off", 123, 0, 127, 64, "global"},
MidiParam{"env4_release", "ENV4 Release", 124, 0, 127, 64, "env"},
MidiParam{"env4_sustain", "ENV4 Sustain", 125, 0, 127, 64, "env"},
}};
inline constexpr std::array<MidiParam, 80> kCreamwarePro12AsbParams = {{
MidiParam{"bank_select", "Bank Select", 0, 0, 127, 64, "global"},
MidiParam{"modulation", "Modulation", 1, 0, 127, 64, "mod"},
MidiParam{"unison_voices", "Unison Voices", 2, 0, 127, 64, "global"},
MidiParam{"unison_detune", "Unison Detune", 3, 0, 127, 64, "osc"},
MidiParam{"glide_time", "Glide Time", 5, 0, 127, 64, "osc"},
MidiParam{"data_entry", "Data Entry", 6, 0, 127, 64, "global"},
MidiParam{"device_volume", "Device Volume", 7, 0, 127, 64, "mix"},
MidiParam{"lfo_settings_retrig", "LFO Settings Retrig", 8, 0, 127, 64, "lfo"},
MidiParam{"lfo_settings_phase", "LFO Settings Phase", 9, 0, 127, 64, "lfo"},
MidiParam{"volume", "Volume", 11, 0, 127, 64, "mix"},
MidiParam{"osc_a_frequency", "Osc A Frequency", 12, 0, 127, 64, "osc"},
MidiParam{"osc_a_shape_saw", "Osc A Shape Saw", 13, 0, 127, 64, "osc"},
MidiParam{"osc_a_shape_pulse", "Osc A Shape Pulse", 14, 0, 127, 64, "osc"},
MidiParam{"osc_a_pulse_width", "Osc A Pulse Width", 15, 0, 127, 64, "osc"},
MidiParam{"osc_a_sync", "Osc A Sync", 16, 0, 127, 64, "osc"},
MidiParam{"osc_b_frequency", "Osc B Frequency", 17, 0, 127, 64, "osc"},
MidiParam{"osc_b_fine", "Osc B Fine", 18, 0, 127, 64, "osc"},
MidiParam{"osc_b_shape_saw", "Osc B Shape Saw", 19, 0, 127, 64, "osc"},
MidiParam{"osc_b_shape_triangle", "Osc B Shape Triangle", 20, 0, 127, 64, "osc"},
MidiParam{"master_tune", "Master Tune", 21, 0, 127, 64, "osc"},
MidiParam{"osc_b_shape_pulse", "Osc B Shape Pulse", 22, 0, 127, 64, "osc"},
MidiParam{"aftertouch_pitch", "Aftertouch Pitch", 23, 0, 127, 64, "mod"},
MidiParam{"bend_range", "Bend Range", 24, 0, 127, 64, "global"},
MidiParam{"osc_a_volume", "Osc A Volume", 25, 0, 127, 64, "osc"},
MidiParam{"osc_b_volume", "Osc B Volume", 26, 0, 127, 64, "osc"},
MidiParam{"osc_b_pulse_width", "Osc B Pulse Width", 27, 0, 127, 64, "osc"},
MidiParam{"osc_b_lo_freq", "Osc B Lo Freq", 28, 0, 127, 64, "osc"},
MidiParam{"osc_b_keyboard", "Osc B Keyboard", 29, 0, 127, 64, "osc"},
MidiParam{"aftertouch_dest_freq_a", "Aftertouch Dest Freq A", 30, 0, 127, 64, "mod"},
MidiParam{"aftertouch_dest_freq_b", "Aftertouch Dest Freq B", 31, 0, 127, 64, "mod"},
MidiParam{"bank_select_cc32", "Bank Select", 32, 0, 127, 64, "global"},
MidiParam{"noise_volume", "Noise Volume", 33, 0, 127, 64, "osc"},
MidiParam{"aftertouch_pw", "Aftertouch PW", 34, 0, 127, 64, "mod"},
MidiParam{"aftertouch_mw", "Aftertouch MW", 35, 0, 127, 64, "mod"},
MidiParam{"external_volume", "External Volume", 36, 0, 127, 64, "mix"},
MidiParam{"aftertouch_dest_pw", "Aftertouch Dest PW", 37, 0, 127, 64, "mod"},
MidiParam{"aftertouch_dest_pw_cc38", "Aftertouch Dest PW", 38, 0, 127, 64, "mod"},
MidiParam{"keyboard_amount", "Keyboard Amount", 39, 0, 127, 64, "global"},
MidiParam{"cutoff", "Cutoff", 40, 0, 127, 64, "filter"},
MidiParam{"resonance", "Resonance", 41, 0, 127, 64, "filter"},
MidiParam{"envelope_amount", "Envelope Amount", 42, 0, 127, 64, "env"},
MidiParam{"filter_env_attack", "Filter Env Attack", 43, 0, 127, 64, "env"},
MidiParam{"filter_env_decay", "Filter Env Decay", 44, 0, 127, 64, "env"},
MidiParam{"filter_env_sustain", "Filter Env Sustain", 45, 0, 127, 64, "env"},
MidiParam{"filter_env_velocity", "Filter Env Velocity", 46, 0, 127, 64, "env"},
MidiParam{"filter_release", "Filter Release", 47, 0, 127, 64, "env"},
MidiParam{"aftertouch_lfo_freq", "Aftertouch LFO Freq", 48, 0, 127, 64, "lfo"},
MidiParam{"release", "Release", 49, 0, 127, 64, "env"},
MidiParam{"aftertouch_filter", "Aftertouch Filter", 50, 0, 127, 64, "filter"},
MidiParam{"aftertouch_amp", "Aftertouch Amp", 51, 0, 127, 64, "mod"},
MidiParam{"amp_env_attack", "Amp Env Attack", 52, 0, 127, 64, "env"},
MidiParam{"amp_env_decay", "Amp Env Decay", 53, 0, 127, 64, "env"},
MidiParam{"amp_env_sustain", "Amp Env Sustain", 54, 0, 127, 64, "env"},
MidiParam{"amp_env_velocity", "Amp Env Velocity", 55, 0, 127, 64, "env"},
MidiParam{"mw_intensity", "MW Intensity", 56, 0, 127, 64, "global"},
MidiParam{"mw_offset", "MW Offset", 57, 0, 127, 64, "global"},
MidiParam{"poly_mod_osc_b", "Poly Mod OSC B", 58, 0, 127, 64, "mod"},
MidiParam{"adr", "ADR", 59, 0, 127, 64, "env"},
MidiParam{"keyb_mode_retrig", "Keyb Mode Retrig", 60, 0, 127, 64, "mod"},
MidiParam{"low_note", "Low Note", 61, 0, 127, 64, "global"},
MidiParam{"amp_env_release", "Amp Env Release", 62, 0, 127, 64, "env"},
MidiParam{"poly_mod_filter_env", "Poly Mod Filter Env", 63, 0, 127, 64, "env"},
MidiParam{"poly_mod_destination_freq_a", "Poly Mod Destination Freq A", 75, 0, 127, 64, "mod"},
MidiParam{"poly_mod_destination_freq_b", "Poly Mod Destination Freq B", 76, 0, 127, 64, "mod"},
MidiParam{"poly_mod_destination_pw", "Poly Mod Destination PW", 77, 0, 127, 64, "mod"},
MidiParam{"poly_mod_destination_pw_cc78", "Poly Mod Destination PW", 78, 0, 127, 64, "mod"},
MidiParam{"poly_mod_destination_filter", "Poly Mod Destination Filter", 79, 0, 127, 64, "filter"},
MidiParam{"amt", "Amt", 98, 0, 127, 64, "global"},
MidiParam{"wheel_mod_source_mix", "Wheel Mod Source Mix", 108, 0, 127, 64, "mod"},
MidiParam{"time_velocity_attack_filter_env", "Time Velocity Attack Filter Env", 113, 0, 127, 64, "env"},
MidiParam{"time_velocity_dec_rel_filter_env", "Time Velocity Dec/Rel Filter Env", 114, 0, 127, 64, "env"},
MidiParam{"time_velocity_dec_rel_amp_env", "Time Velocity Dec/Rel Amp Env", 116, 0, 127, 64, "env"},
MidiParam{"time_velocity_attack_amp_env", "Time Velocity Attack Amp Env", 117, 0, 127, 64, "env"},
MidiParam{"all_sounds_off", "All Sounds Off", 120, 0, 127, 64, "global"},
MidiParam{"local_control_off", "Local Control Off", 121, 0, 127, 64, "global"},
MidiParam{"all_notes_off", "All Notes Off", 122, 0, 127, 64, "global"},
MidiParam{"omni_off", "Omni Off", 124, 0, 127, 64, "global"},
MidiParam{"omni_on", "Omni On", 125, 0, 127, 64, "global"},
MidiParam{"mono_on", "Mono On", 126, 0, 127, 64, "global"},
MidiParam{"poly_on", "Poly On", 127, 0, 127, 64, "global"},
}};
inline constexpr std::array<MidiParam, 85> kElektronAnalogKeysParams = {{
MidiParam{"modulation_modwheel", "Modulation: Modwheel (MSB, 14-bit pair with CC 33)", 1, 0, 127, 64, "mod"},
MidiParam{"modulation_breath", "Modulation: Breath (MSB, 14-bit pair with CC 34)", 2, 0, 127, 64, "mod"},
MidiParam{"performance_parameter_a", "Performance: Parameter A", 3, 0, 127, 64, "global"},
MidiParam{"performance_parameter_b", "Performance: Parameter B", 4, 0, 127, 64, "global"},
MidiParam{"osc_slide_time", "OSC: Slide Time", 5, 0, 127, 64, "osc"},
MidiParam{"amp_volume", "Amp: Volume", 7, 0, 127, 64, "mix"},
MidiParam{"performance_parameter_c", "Performance: Parameter C", 8, 0, 127, 64, "global"},
MidiParam{"performance_parameter_d", "Performance: Parameter D", 9, 0, 127, 64, "global"},
MidiParam{"amp_pan", "Amp: Pan", 10, 0, 127, 64, "mix"},
MidiParam{"performance_parameter_e", "Performance: Parameter E", 11, 0, 127, 64, "global"},
MidiParam{"osc1_pitch", "OSC1: Pitch (MSB, 14-bit pair with CC 48)", 16, 0, 127, 64, "osc"},
MidiParam{"osc2_pitch", "OSC2: Pitch (MSB, 14-bit pair with CC 49)", 17, 0, 127, 64, "osc"},
MidiParam{"filter_1_frequency", "Filter 1: Frequency (MSB, 14-bit pair with CC 50)", 18, 0, 127, 64, "filter"},
MidiParam{"filter_2_frequency", "Filter 2: Frequency (MSB, 14-bit pair with CC 51)", 19, 0, 127, 64, "filter"},
MidiParam{"filter_env_depth_a", "Filter Env: Depth A (MSB, 14-bit pair with CC 52)", 20, 0, 127, 64, "env"},
MidiParam{"filter_env_depth_b", "Filter Env: Depth B (MSB, 14-bit pair with CC 53)", 21, 0, 127, 64, "env"},
MidiParam{"aux_env_depth_a", "AUX Env: Depth A (MSB, 14-bit pair with CC 54)", 22, 0, 127, 64, "env"},
MidiParam{"aux_env_depth_b", "AUX Env: Depth B (MSB, 14-bit pair with CC 55)", 23, 0, 127, 64, "env"},
MidiParam{"lfo1_depth_a", "LFO1: Depth A (MSB, 14-bit pair with CC 56)", 24, 0, 127, 64, "lfo"},
MidiParam{"lfo1_depth_b", "LFO1: Depth B (MSB, 14-bit pair with CC 57)", 25, 0, 127, 64, "lfo"},
MidiParam{"lfo2_depth_a", "LFO2: Depth A (MSB, 14-bit pair with CC 58)", 26, 0, 127, 64, "lfo"},
MidiParam{"lfo2_depth_b", "LFO2: Depth B (MSB, 14-bit pair with CC 59)", 27, 0, 127, 64, "lfo"},
MidiParam{"modulation_modwheel_cc33", "Modulation: Modwheel (LSB)", 33, 0, 127, 64, "mod"},
MidiParam{"modulation_breath_cc34", "Modulation: Breath (LSB)", 34, 0, 127, 64, "mod"},
MidiParam{"osc1_pitch_cc48", "OSC1: Pitch (LSB)", 48, 0, 127, 64, "osc"},
MidiParam{"osc2_pitch_cc49", "OSC2: Pitch (LSB)", 49, 0, 127, 64, "osc"},
MidiParam{"filter_1_frequency_cc50", "Filter 1: Frequency (LSB)", 50, 0, 127, 64, "filter"},
MidiParam{"filter_2_frequency_cc51", "Filter 2: Frequency (LSB)", 51, 0, 127, 64, "filter"},
MidiParam{"filter_env_depth_a_cc52", "Filter Env: Depth A (LSB; MkI: 'EnvF Gate Length')", 52, 0, 127, 64, "env"},
MidiParam{"filter_env_depth_b_cc53", "Filter Env: Depth B (LSB)", 53, 0, 127, 64, "env"},
MidiParam{"aux_env_depth_a_cc54", "AUX Env: Depth A (LSB)", 54, 0, 127, 64, "env"},
MidiParam{"aux_env_depth_b_cc55", "AUX Env: Depth B (LSB)", 55, 0, 127, 64, "env"},
MidiParam{"lfo1_depth_a_cc56", "LFO1: Depth A (LSB)", 56, 0, 127, 64, "lfo"},
MidiParam{"lfo1_depth_b_cc57", "LFO1: Depth B (LSB)", 57, 0, 127, 64, "lfo"},
MidiParam{"lfo2_depth_a_cc58", "LFO2: Depth A (LSB)", 58, 0, 127, 64, "lfo"},
MidiParam{"lfo2_depth_b_cc59", "LFO2: Depth B (LSB)", 59, 0, 127, 64, "lfo"},
MidiParam{"performance_parameter_f", "Performance: Parameter F", 64, 0, 127, 64, "global"},
MidiParam{"performance_parameter_g", "Performance: Parameter G", 65, 0, 127, 64, "global"},
MidiParam{"performance_parameter_h", "Performance: Parameter H", 66, 0, 127, 64, "global"},
MidiParam{"performance_parameter_i", "Performance: Parameter I", 67, 0, 127, 64, "global"},
MidiParam{"performance_parameter_j", "Performance: Parameter J", 68, 0, 127, 64, "global"},
MidiParam{"osc1_level", "OSC1: Level", 69, 0, 127, 64, "osc"},
MidiParam{"osc1_waveform", "OSC1: Waveform", 70, 0, 127, 64, "osc"},
MidiParam{"osc1_sub_oscillator", "OSC1: Sub Oscillator", 71, 0, 127, 64, "osc"},
MidiParam{"osc1_pulsewidth", "OSC1: Pulsewidth", 72, 0, 127, 64, "osc"},
MidiParam{"osc1_pwm_speed", "OSC1: PWM Speed", 73, 0, 127, 64, "osc"},
MidiParam{"osc1_pwm_depth", "OSC1: PWM Depth", 74, 0, 127, 64, "osc"},
MidiParam{"noise_s_h", "Noise: S&H", 75, 0, 127, 64, "osc"},
MidiParam{"noise_fade", "Noise: Fade", 76, 0, 127, 64, "osc"},
MidiParam{"noise_level", "Noise: Level", 77, 0, 127, 64, "osc"},
MidiParam{"osc2_level", "OSC2: Level", 78, 0, 127, 64, "osc"},
MidiParam{"osc2_waveform", "OSC2: Waveform", 79, 0, 127, 64, "osc"},
MidiParam{"osc2_sub_oscillator", "OSC2: Sub Oscillator", 80, 0, 127, 64, "osc"},
MidiParam{"osc2_pulsewidth", "OSC2: Pulsewidth", 81, 0, 127, 64, "osc"},
MidiParam{"osc2_pwm_speed", "OSC2: PWM Speed", 82, 0, 127, 64, "osc"},
MidiParam{"osc2_pwm_depth", "OSC2: PWM Depth", 83, 0, 127, 64, "osc"},
MidiParam{"osc_sync_amount", "OSC: Sync Amount", 84, 0, 127, 64, "osc"},
MidiParam{"osc_bend_amount", "OSC: Bend Amount", 85, 0, 127, 64, "osc"},
MidiParam{"filter_1_overdrive", "Filter 1: Overdrive", 86, 0, 127, 64, "filter"},
MidiParam{"osc_vibrato_speed", "OSC: Vibrato Speed (Analog Keys/MkI)", 88, 0, 127, 64, "osc"},
MidiParam{"filter_1_resonance", "Filter 1: Resonance", 89, 0, 127, 64, "filter"},
MidiParam{"filter_2_resonance", "Filter 2: Resonance", 90, 0, 127, 64, "filter"},
MidiParam{"amp_chorus_send", "Amp: Chorus Send", 91, 0, 127, 64, "fx"},
MidiParam{"amp_delay_send", "Amp: Delay Send", 92, 0, 127, 64, "fx"},
MidiParam{"amp_reverb_send", "Amp: Reverb Send", 93, 0, 127, 64, "fx"},
MidiParam{"track_mute", "Track: Mute", 94, 0, 127, 64, "global"},
MidiParam{"track_level", "Track: Level", 95, 0, 127, 64, "mix"},
MidiParam{"filter_1_envelope_depth", "Filter 1: Envelope Depth", 102, 0, 127, 64, "env"},
MidiParam{"filter_2_envelope_depth", "Filter 2: Envelope Depth", 103, 0, 127, 64, "env"},
MidiParam{"amp_env_attack", "Amp Env: Attack", 104, 0, 127, 64, "env"},
MidiParam{"amp_env_decay", "Amp Env: Decay", 105, 0, 127, 64, "env"},
MidiParam{"amp_env_sustain", "Amp Env: Sustain", 106, 0, 127, 64, "env"},
MidiParam{"amp_env_release", "Amp Env: Release", 107, 0, 127, 64, "env"},
MidiParam{"filter_env_attack", "Filter Env: Attack", 108, 0, 127, 64, "env"},
MidiParam{"filter_env_decay", "Filter Env: Decay", 109, 0, 127, 64, "env"},
MidiParam{"filter_env_sustain", "Filter Env: Sustain", 110, 0, 127, 64, "env"},
MidiParam{"filter_env_release", "Filter Env: Release", 111, 0, 127, 64, "env"},
MidiParam{"aux_env_attack", "AUX Env: Attack", 112, 0, 127, 64, "env"},
MidiParam{"aux_env_decay", "AUX Env: Decay", 113, 0, 127, 64, "env"},
MidiParam{"aux_env_sustain", "AUX Env: Sustain", 114, 0, 127, 64, "env"},
MidiParam{"aux_env_release", "AUX Env: Release", 115, 0, 127, 64, "env"},
MidiParam{"lfo1_speed", "LFO1: Speed", 116, 0, 127, 64, "lfo"},
MidiParam{"lfo1_multiplier", "LFO1: Multiplier", 117, 0, 127, 64, "lfo"},
MidiParam{"lfo2_speed", "LFO2: Speed", 118, 0, 127, 64, "lfo"},
MidiParam{"lfo2_multiplier", "LFO2: Multiplier", 119, 0, 127, 64, "lfo"},
}};
inline constexpr std::array<MidiParam, 71> kMoogSubPhattyParams = {{
MidiParam{"modulation_wheel", "Modulation Wheel", 1, 0, 127, 64, "mod"},
MidiParam{"filter_mod_amount", "Filter Mod Amount", 2, 0, 127, 64, "filter"},
MidiParam{"lfo_rate", "LFO Rate", 3, 0, 127, 64, "lfo"},
MidiParam{"pitch_mod_amount", "Pitch Mod Amount", 4, 0, 127, 64, "mod"},
MidiParam{"glide_rate", "Glide Rate", 5, 0, 127, 64, "osc"},
MidiParam{"output_level", "Output Level (Volume)", 7, 0, 127, 64, "mix"},
MidiParam{"noise_level", "Noise Level", 8, 0, 127, 64, "osc"},
MidiParam{"vco_1_wave", "VCO 1 Wave", 9, 0, 127, 64, "osc"},
MidiParam{"vco_2_frequency", "VCO 2 Frequency", 12, 0, 127, 64, "osc"},
MidiParam{"vco_2_beat_frequency", "VCO 2 Beat Frequency", 13, 0, 127, 64, "osc"},
MidiParam{"vco_2_wave", "VCO 2 Wave", 14, 0, 127, 64, "osc"},
MidiParam{"vco_1_level", "VCO 1 Level", 15, 0, 127, 64, "osc"},
MidiParam{"vco_2_level", "VCO 2 Level", 16, 0, 127, 64, "osc"},
MidiParam{"vco_1_sub_level", "VCO 1 Sub Level", 17, 0, 127, 64, "osc"},
MidiParam{"multidrive_amount", "Multidrive Amount", 18, 0, 127, 64, "filter"},
MidiParam{"filter_cutoff_frequency", "Filter Cutoff Frequency", 19, 0, 127, 64, "filter"},
MidiParam{"wave_mod_amount", "Wave Mod Amount", 20, 0, 127, 64, "mod"},
MidiParam{"filter_resonance", "Filter Resonance", 21, 0, 127, 64, "filter"},
MidiParam{"filter_eg_amount", "Filter EG Amount", 22, 0, 127, 64, "filter"},
MidiParam{"filter_eg_attack", "Filter EG Attack", 23, 0, 127, 64, "env"},
MidiParam{"filter_eg_decay", "Filter EG Decay", 24, 0, 127, 64, "env"},
MidiParam{"filter_eg_sustain", "Filter EG Sustain", 25, 0, 127, 64, "env"},
MidiParam{"filter_eg_release", "Filter EG Release", 26, 0, 127, 64, "env"},
MidiParam{"filter_kb_tracking_amount", "Filter KB Tracking Amount", 27, 0, 127, 64, "filter"},
MidiParam{"amplifier_eg_attack", "Amplifier EG Attack", 28, 0, 127, 64, "env"},
MidiParam{"amplifier_eg_decay", "Amplifier EG Decay", 29, 0, 127, 64, "env"},
MidiParam{"amplifier_eg_sustain", "Amplifier EG Sustain", 30, 0, 127, 64, "env"},
MidiParam{"amplifier_eg_release", "Amplifier EG Release", 31, 0, 127, 64, "env"},
MidiParam{"glide_on_off", "Glide On/Off", 65, 0, 127, 64, "osc"},
MidiParam{"legato", "Legato", 68, 0, 127, 64, "global"},
MidiParam{"pitch_mod_osc_2_only", "Pitch Mod OSC 2 Only", 70, 0, 127, 64, "mod"},
MidiParam{"modulation_source", "Modulation Source", 71, 0, 127, 64, "mod"},
MidiParam{"wave_mod_destination", "Wave Mod Destination", 72, 0, 127, 64, "mod"},
MidiParam{"gated_glide", "Gated Glide", 73, 0, 127, 64, "osc"},
MidiParam{"vco_1_octave", "VCO 1 Octave", 74, 0, 127, 64, "osc"},
MidiParam{"vco_2_octave", "VCO 2 Octave", 75, 0, 127, 64, "osc"},
MidiParam{"lfo_range", "LFO Range", 76, 0, 127, 64, "lfo"},
MidiParam{"vco_hard_sync", "VCO Hard Sync", 77, 0, 127, 64, "osc"},
MidiParam{"lfo_kb_tracking_amount", "LFO KB Tracking Amount", 78, 0, 127, 64, "lfo"},
MidiParam{"filter_eg_velocity_to_time", "Filter EG Velocity to Time", 79, 0, 127, 64, "filter"},
MidiParam{"amplifier_eg_velocity_to_time", "Amplifier EG Velocity to Time", 80, 0, 127, 64, "mix"},
MidiParam{"vco_gate_reset", "VCO Gate Reset", 81, 0, 127, 64, "filter"},
MidiParam{"filter_eg_reset", "Filter EG Reset", 82, 0, 127, 64, "filter"},
MidiParam{"amplifier_eg_reset", "Amplifier EG Reset", 83, 0, 127, 64, "filter"},
MidiParam{"glide_type", "Glide Type", 85, 0, 127, 64, "osc"},
MidiParam{"filter_eg_repeat", "Filter EG Repeat", 86, 0, 127, 64, "filter"},
MidiParam{"amplifier_eg_repeat", "Amplifier EG Repeat", 87, 0, 127, 64, "mix"},
MidiParam{"release_on_off", "Release On/Off", 88, 0, 127, 64, "env"},
MidiParam{"keyboard_octave", "Keyboard Octave", 89, 0, 127, 64, "osc"},
MidiParam{"filter_eg_kb_amount", "Filter EG KB Amount", 90, 0, 127, 64, "filter"},
MidiParam{"amplifier_eg_kb_amount", "Amplifier EG KB Amount", 91, 0, 127, 64, "mix"},
MidiParam{"amplifier_eg_velocity_to_amplitude", "Amplifier EG Velocity to Amplitude", 92, 0, 127, 64, "mix"},
MidiParam{"lfo_gate_reset", "LFO Gate Reset", 93, 0, 127, 64, "lfo"},
MidiParam{"glide_legato", "Glide Legato", 94, 0, 127, 64, "osc"},
MidiParam{"lfo_midi_sync", "LFO MIDI Sync", 102, 0, 127, 64, "lfo"},
MidiParam{"filter_eg_delay", "Filter EG Delay", 103, 0, 127, 64, "filter"},
MidiParam{"amplifier_eg_delay", "Amplifier EG Delay", 104, 0, 127, 64, "fx"},
MidiParam{"filter_eg_hold", "Filter EG Hold", 105, 0, 127, 64, "env"},
MidiParam{"amplifier_eg_hold", "Amplifier EG Hold", 106, 0, 127, 64, "env"},
MidiParam{"pitch_bend_up", "Pitch Bend Up", 107, 0, 127, 64, "osc"},
MidiParam{"pitch_bend_down", "Pitch Bend Down", 108, 0, 127, 64, "osc"},
MidiParam{"filter_poles", "Filter Poles", 109, 0, 127, 64, "filter"},
MidiParam{"filter_eg_velocity_to_amplitude", "Filter EG Velocity to Amplitude", 110, 0, 127, 64, "filter"},
MidiParam{"note_priority", "Note Priority", 111, 0, 127, 64, "global"},
MidiParam{"filter_eg_gate_source", "Filter EG Gate Source", 113, 0, 127, 64, "filter"},
MidiParam{"volume_eg_gate_source", "Volume (Amplifier) EG Gate Source", 114, 0, 127, 64, "mix"},
MidiParam{"filter_eg_trigger_mode", "Filter EG Trigger Mode", 115, 0, 127, 64, "filter"},
MidiParam{"external_input_level", "External Input Level", 116, 0, 127, 64, "mix"},
MidiParam{"filter_eg_fast_decay", "Filter EG Fast Decay", 117, 0, 127, 64, "env"},
MidiParam{"amplifier_eg_fast_decay", "Amplifier EG Fast Decay", 118, 0, 127, 64, "env"},
MidiParam{"keyboard_transpose", "Keyboard Transpose", 119, 0, 127, 64, "global"},
}};
inline constexpr std::array<MidiParam, 81> kMoogSub37Params = {{
MidiParam{"bank_select", "Bank Select", 0, 0, 127, 64, "global"},
MidiParam{"mod_wheel", "Mod Wheel", 1, 0, 127, 64, "mod"},
MidiParam{"reserved_midi_breath_control", "Reserved - MIDI Breath Control", 2, 0, 127, 64, "global"},
MidiParam{"lfo_1_rate", "LFO 1 Rate (also LFO 1 Clock Divider)", 3, 0, 127, 64, "lfo"},
MidiParam{"mod_1_pitch_amount", "Mod 1 Pitch Amount", 4, 0, 127, 64, "mod"},
MidiParam{"glide_time", "Glide Time", 5, 0, 127, 64, "osc"},
MidiParam{"reserved_data_entry", "Reserved - Data Entry", 6, 0, 127, 64, "global"},
MidiParam{"master_volume", "Master Volume", 7, 0, 127, 64, "mix"},
MidiParam{"lfo_2_rate", "LFO 2 Rate (also LFO 2 Clock Divider)", 8, 0, 127, 64, "lfo"},
MidiParam{"osc_1_wave", "Osc 1 Wave", 9, 0, 127, 64, "osc"},
MidiParam{"reserved_midi_pan", "Reserved - MIDI Pan", 10, 0, 127, 64, "mix"},
MidiParam{"mod_1_filter_amount", "Mod 1 Filter Amount", 11, 0, 127, 64, "filter"},
MidiParam{"osc_2_frequency", "Osc 2 Frequency", 12, 0, 127, 64, "osc"},
MidiParam{"osc_2_beat_frequency", "Osc 2 Beat Frequency", 13, 0, 127, 64, "osc"},
MidiParam{"osc_2_wave", "Osc 2 Wave", 14, 0, 127, 64, "osc"},
MidiParam{"mod_2_pitch_amount", "Mod 2 Pitch Amount", 15, 0, 127, 64, "mod"},
MidiParam{"mod_2_filter_amount", "Mod 2 Filter Amount", 16, 0, 127, 64, "filter"},
MidiParam{"mod_2_pgm_dest_amount", "Mod 2 Pgm Dest Amount", 17, 0, 127, 64, "mod"},
MidiParam{"filter_multidrive", "Filter Multidrive", 18, 0, 127, 64, "filter"},
MidiParam{"filter_cutoff", "Filter Cutoff", 19, 0, 127, 64, "filter"},
MidiParam{"mod_1_pgm_dest_amount", "Mod 1 Pgm Dest Amount", 20, 0, 127, 64, "mod"},
MidiParam{"filter_resonance", "Filter Resonance", 21, 0, 127, 64, "filter"},
MidiParam{"filter_kb_amount", "Filter KB Amount", 22, 0, 127, 64, "filter"},
MidiParam{"filter_eg_attack_time", "Filter EG Attack Time", 23, 0, 127, 64, "env"},
MidiParam{"filter_eg_decay_time", "Filter EG Decay Time", 24, 0, 127, 64, "env"},
MidiParam{"filter_eg_sustain_time", "Filter EG Sustain Time", 25, 0, 127, 64, "env"},
MidiParam{"filter_eg_release_time", "Filter EG Release Time", 26, 0, 127, 64, "env"},
MidiParam{"filter_eg_amount", "Filter EG Amount", 27, 0, 127, 64, "filter"},
MidiParam{"amp_eg_attack_time", "Amp EG Attack Time", 28, 0, 127, 64, "env"},
MidiParam{"amp_eg_decay_time", "Amp EG Decay Time", 29, 0, 127, 64, "env"},
MidiParam{"amp_eg_sustain_time", "Amp EG Sustain Time", 30, 0, 127, 64, "env"},
MidiParam{"amp_eg_release_time", "Amp EG Release Time", 31, 0, 127, 64, "env"},
MidiParam{"bank_select_cc32", "Bank Select (LSB)", 32, 0, 127, 64, "global"},
MidiParam{"mod_wheel_cc33", "Mod Wheel (LSB)", 33, 0, 127, 64, "mod"},
MidiParam{"hold_pedal_sustain", "Hold Pedal/Sustain", 64, 0, 127, 64, "env"},
MidiParam{"glide_on", "Glide On", 65, 0, 127, 64, "osc"},
MidiParam{"arpeggiator_latch", "Arpeggiator Latch", 69, 0, 127, 64, "arp"},
MidiParam{"mod_1_osc_1_2_select", "Mod 1 Osc 1/2 Select", 70, 0, 127, 64, "mod"},
MidiParam{"mod_1_source", "Mod 1 Source", 71, 0, 127, 64, "mod"},
MidiParam{"mod_2_source", "Mod 2 Source", 72, 0, 127, 64, "mod"},
MidiParam{"arp_on_off", "Arp On/Off", 73, 0, 127, 64, "arp"},
MidiParam{"osc_1_octave", "Osc 1 Octave", 74, 0, 127, 64, "osc"},
MidiParam{"osc_2_octave", "Osc 2 Octave", 75, 0, 127, 64, "osc"},
MidiParam{"lfo_1_range", "LFO 1 Range", 76, 0, 127, 64, "lfo"},
MidiParam{"osc_2_hard_sync_on_off", "Osc 2 Hard Sync On/Off", 77, 0, 127, 64, "osc"},
MidiParam{"lfo_2_range", "LFO 2 Range", 78, 0, 127, 64, "lfo"},
MidiParam{"filter_eg_kb_amount", "Filter EG KB Amount", 79, 0, 127, 64, "filter"},
MidiParam{"amp_eg_kb_amount", "Amp EG KB Amount", 80, 0, 127, 64, "mix"},
MidiParam{"osc_kb_reset_on_off", "Osc KB Reset On/Off", 81, 0, 127, 64, "filter"},
MidiParam{"filter_eg_reset", "Filter EG Reset", 82, 0, 127, 64, "filter"},
MidiParam{"amp_eg_reset", "Amp EG Reset", 83, 0, 127, 64, "filter"},
MidiParam{"reserved_portamento_control", "Reserved - Portamento Control", 84, 0, 127, 64, "osc"},
MidiParam{"glide_type", "Glide Type", 85, 0, 127, 64, "osc"},
MidiParam{"filter_eg_velocity_amount", "Filter EG Velocity Amount", 86, 0, 127, 64, "filter"},
MidiParam{"amp_eg_velocity_amount", "Amp EG Velocity Amount", 87, 0, 127, 64, "mix"},
MidiParam{"mod_2_osc_1_2_select", "Mod 2 Osc 1/2 Select", 88, 0, 127, 64, "mod"},
MidiParam{"kb_octave", "KB Octave", 89, 0, 127, 64, "osc"},
MidiParam{"mod_1_destination", "Mod 1 Destination", 91, 0, 127, 64, "mod"},
MidiParam{"mod_2_destination", "Mod 2 Destination", 92, 0, 127, 64, "mod"},
MidiParam{"lfo_1_kb_reset", "LFO 1 KB Reset", 93, 0, 127, 64, "lfo"},
MidiParam{"glide_legato", "Glide Legato", 94, 0, 127, 64, "osc"},
MidiParam{"lfo_2_kb_reset", "LFO 2 KB Reset", 95, 0, 127, 64, "lfo"},
MidiParam{"glide_dest_osc_1_2_both", "Glide Dest Osc 1/2/Both", 102, 0, 127, 64, "osc"},
MidiParam{"filter_eg_delay", "Filter EG Delay", 103, 0, 127, 64, "filter"},
MidiParam{"amp_eg_delay", "Amp EG Delay", 104, 0, 127, 64, "fx"},
MidiParam{"filter_eg_hold", "Filter EG Hold", 105, 0, 127, 64, "env"},
MidiParam{"amp_eg_hold", "Amp EG Hold", 106, 0, 127, 64, "env"},
MidiParam{"pitch_bend_up_amount", "Pitch Bend Up Amount", 107, 0, 127, 64, "osc"},
MidiParam{"pitch_bend_down_amount", "Pitch Bend Down Amount", 108, 0, 127, 64, "osc"},
MidiParam{"filter_slopes", "Filter Slopes (Poles)", 109, 0, 127, 64, "filter"},
MidiParam{"osc_duo_mode_on_off", "Osc Duo Mode On/Off", 110, 0, 127, 64, "mod"},
MidiParam{"kb_ctrl_lo_hi", "KB Ctrl Lo/Hi", 111, 0, 127, 64, "global"},
MidiParam{"filter_eg_multi_trig", "Filter EG Multi Trig", 112, 0, 127, 64, "filter"},
MidiParam{"amp_eg_multi_trig", "Amp EG Multi Trig", 113, 0, 127, 64, "mix"},
MidiParam{"osc_1_level", "Osc 1 Level", 114, 0, 127, 64, "osc"},
MidiParam{"osc_1_sub_level", "Osc 1 Sub Level", 115, 0, 127, 64, "osc"},
MidiParam{"osc_2_level", "Osc 2 Level", 116, 0, 127, 64, "osc"},
MidiParam{"noise_level", "Noise Level", 117, 0, 127, 64, "osc"},
MidiParam{"feedback_ext_level", "Feedback/Ext Level", 118, 0, 127, 64, "mix"},
MidiParam{"kb_transpose", "KB Transpose (receive only)", 119, 0, 127, 64, "global"},
MidiParam{"local_control_on_off", "Local Control On/Off", 122, 0, 127, 64, "global"},
}};
inline constexpr std::array<MidiParam, 13> kRolandJd800Params = {{
MidiParam{"modulation", "Modulation", 1, 0, 127, 64, "mod"},
MidiParam{"breath_controller", "Breath Controller", 2, 0, 127, 64, "global"},
MidiParam{"portamento_time", "Portamento Time", 5, 0, 127, 64, "osc"},
MidiParam{"data_entry_msb", "Data Entry MSB (RPN; receive only)", 6, 0, 127, 64, "global"},
MidiParam{"volume_part_level", "Volume / Part Level", 7, 0, 127, 64, "mix"},
MidiParam{"pan", "Pan", 10, 0, 127, 64, "mix"},
MidiParam{"expression", "Expression", 11, 0, 127, 64, "global"},
MidiParam{"hold_sustain_pedal", "Hold / Sustain Pedal", 64, 0, 127, 64, "env"},
MidiParam{"portamento_on_off", "Portamento On/Off", 65, 0, 127, 64, "osc"},
MidiParam{"rpn_lsb", "RPN LSB (receive only)", 100, 0, 127, 64, "global"},
MidiParam{"rpn_msb", "RPN MSB (receive only)", 101, 0, 127, 64, "global"},
MidiParam{"reset_all_controllers", "Reset All Controllers (receive only)", 121, 0, 127, 64, "global"},
MidiParam{"all_notes_off", "All Notes Off (receive only)", 123, 0, 127, 64, "global"},
}};
inline constexpr MidiDevice kAsmHydrasynth = {
"asm_hydrasynth",
"ASM Hydrasynth",
"Ashun Sound Machines (ASM)",
1,
0,
127,
std::span<const MidiParam>{kAsmHydrasynthParams},
};
inline constexpr MidiDevice kCreamwarePro12Asb = {
"creamware_pro12_asb",
"Creamware Pro-12 ASB",
"Creamware / Sonic Core",
1,
0,
127,
std::span<const MidiParam>{kCreamwarePro12AsbParams},
};
inline constexpr MidiDevice kElektronAnalogKeys = {
"elektron_analog_keys",
"Elektron Analog Keys",
"Elektron",
1,
0,
127,
std::span<const MidiParam>{kElektronAnalogKeysParams},
};
inline constexpr MidiDevice kMoogSubPhatty = {
"moog_sub_phatty",
"Moog Sub Phatty",
"Moog",
1,
0,
127,
std::span<const MidiParam>{kMoogSubPhattyParams},
};
inline constexpr MidiDevice kMoogSub37 = {
"moog_sub37",
"Moog Sub 37",
"Moog",
1,
0,
127,
std::span<const MidiParam>{kMoogSub37Params},
};
inline constexpr MidiDevice kRolandJd800 = {
"roland_jd800",
"Roland JD-800",
"Roland",
1,
0,
127,
std::span<const MidiParam>{kRolandJd800Params},
};
inline constexpr std::size_t kMidiDeviceCount = 6u;
inline constexpr std::array<MidiDevice, kMidiDeviceCount> kMidiDevices = {{
kAsmHydrasynth,
kCreamwarePro12Asb,
kElektronAnalogKeys,
kMoogSubPhatty,
kMoogSub37,
kRolandJd800,
}};
} // namespace nisps::midi::generated
#endif // NISPS_MIDI_GENERATED_MIDI_DEVICES_HPP