// Mappings from MIDI controllers to the UI. (We don't really build
// a more complicated data structure than this in Nageru itself either;
// we just edit and match directly against the protobuf.)

syntax = "proto2";

import "midi_mapping.proto";

// All the mappings for a given a bus.
message MIDIMappingBusProto {
	// TODO: If we need support for lots of buses (i.e., more than the typical eight
	// on a mixer), add a system for bus banks, like we have for controller banks.
	// optional int32 bus_bank = 1;

	optional MIDIControllerProto stereo_width = 37;
	optional MIDIControllerProto treble = 2;
	optional MIDIControllerProto mid = 3;
	optional MIDIControllerProto bass = 4;
	optional MIDIControllerProto gain = 5;
	optional MIDIControllerProto compressor_threshold = 6;
	optional MIDIControllerProto fader = 7;

	optional MIDIButtonProto toggle_mute = 8;
	optional MIDIButtonProto toggle_locut = 9;
	optional MIDIButtonProto toggle_auto_gain_staging = 10;
	optional MIDIButtonProto toggle_compressor = 11;
	optional MIDIButtonProto clear_peak = 12;

	// These are really global (controller bank change affects all buses),
	// but it's not uncommon that we'd want one button per bus to switch banks.
	// E.g., if the user binds the “mute” button to “next bank”, they'd want every
	// mute button on the mixer to do that, so they need one mapping per bus.
	optional MIDIButtonProto prev_bank = 13;
	optional MIDIButtonProto next_bank = 14;
	optional MIDIButtonProto select_bank_1 = 15;
	optional MIDIButtonProto select_bank_2 = 16;
	optional MIDIButtonProto select_bank_3 = 17;
	optional MIDIButtonProto select_bank_4 = 18;
	optional MIDIButtonProto select_bank_5 = 19;
	optional MIDIButtonProto toggle_limiter = 20;
	optional MIDIButtonProto toggle_auto_makeup_gain = 21;

	// Video mixing.
	optional MIDIButtonProto switch_video_channel = 38;
	optional MIDIButtonProto apply_transition = 39;

	// Main UI. Really global, but see the comment on lo-cut etc. above.
	optional MIDIButtonProto prev_audio_view = 40;
	optional MIDIButtonProto next_audio_view = 41;
	optional MIDIButtonProto begin_new_video_segment = 42;
	optional MIDIButtonProto exit = 43;

	// These are also global (they belong to the master bus), and unlike
	// the bank change commands, one would usually have only one of each,
	// but there's no reason to limit them to one each, and the editor UI
	// becomes simpler if they are the treated the same way as the bank
	// commands.
	optional MIDIControllerProto locut = 22;
	optional MIDIControllerProto limiter_threshold = 23;
	optional MIDIControllerProto makeup_gain = 24;

	// Per-bus lights.
	optional MIDILightProto is_muted = 25;
	optional MIDILightProto locut_is_on = 26;
	optional MIDILightProto auto_gain_staging_is_on = 27;
	optional MIDILightProto compressor_is_on = 28;
	optional MIDILightProto has_peaked = 29;

	// Global lights. Same logic as above for why they're in this proto.
	optional MIDILightProto bank_1_is_selected = 30;
	optional MIDILightProto bank_2_is_selected = 31;
	optional MIDILightProto bank_3_is_selected = 32;
	optional MIDILightProto bank_4_is_selected = 33;
	optional MIDILightProto bank_5_is_selected = 34;
	optional MIDILightProto limiter_is_on = 35;
	optional MIDILightProto auto_makeup_gain_is_on = 36;
}

// The top-level protobuf, containing all the bus mappings, as well as
// more global settings.
//
// Since a typical mixer will have fewer physical controls than what Nageru
// could use, Nageru supports so-called controller banks. A mapping can
// optionally belong to a bank, and if so, that mapping is only active when
// that bank is selected. The user can then select the current bank using
// other mappings, typically by having some mixer button assigned to
// “next bank”. This yields effective multiplexing of lesser-used controls.
message MIDIMappingProto {
	optional int32 num_controller_banks = 1 [default = 0];  // Max 5.

	// Bus controller banks.
	optional int32 stereo_width_bank = 19;
	optional int32 treble_bank = 2;
	optional int32 mid_bank = 3;
	optional int32 bass_bank = 4;
	optional int32 gain_bank = 5;
	optional int32 compressor_threshold_bank = 6;
	optional int32 fader_bank = 7;

	// Bus button banks.
	optional int32 toggle_mute_bank = 8;
	optional int32 toggle_locut_bank = 9;
	optional int32 toggle_auto_gain_staging_bank = 10;
	optional int32 toggle_compressor_bank = 11;
	optional int32 clear_peak_bank = 12;

	// Bus (not non-audio) buttons.
	optional int32 switch_video_channel_bank = 24;
	optional int32 apply_transition_bank = 25;

	// Global controller banks.
	optional int32 locut_bank = 13;
	optional int32 limiter_threshold_bank = 14;
	optional int32 makeup_gain_bank = 15;

	// Global buttons.
	optional int32 toggle_limiter_bank = 16;
	optional int32 toggle_auto_makeup_gain_bank = 17;

	// Global non-audio buttons.
	optional int32 prev_audio_view_bank = 20;
	optional int32 next_audio_view_bank = 21;
	optional int32 begin_new_video_segment_bank = 22;
	optional int32 exit_bank = 23;

	repeated MIDIMappingBusProto bus_mapping = 18;
}
