/** gRPC definitions for external control of sushi
*
* @copyright 2018 - 2022 Modern Ancient Instruments Networked AB, dba Elk, Stockholm
*/
syntax = "proto3";
package sushi_rpc;
service SystemController
{
rpc GetSushiVersion (GenericVoidValue) returns (GenericStringValue) {}
rpc GetBuildInfo (GenericVoidValue) returns (SushiBuildInfo) {}
rpc GetInputAudioChannelCount (GenericVoidValue) returns (GenericIntValue) {}
rpc GetOutputAudioChannelCount (GenericVoidValue) returns (GenericIntValue) {}
}
service TransportController
{
rpc GetSamplerate (GenericVoidValue) returns (GenericFloatValue) {}
rpc GetPlayingMode (GenericVoidValue) returns (PlayingMode) {}
rpc GetSyncMode (GenericVoidValue) returns (SyncMode) {}
rpc GetTimeSignature (GenericVoidValue) returns (TimeSignature) {}
rpc GetTempo (GenericVoidValue) returns (GenericFloatValue) {}
rpc SetTempo (GenericFloatValue) returns (GenericVoidValue) {}
rpc SetPlayingMode (PlayingMode) returns (GenericVoidValue) {}
rpc SetSyncMode (SyncMode) returns (GenericVoidValue) {}
rpc SetTimeSignature (TimeSignature) returns (GenericVoidValue) {}
}
service TimingController
{
rpc GetTimingsEnabled (GenericVoidValue) returns (GenericBoolValue) {}
rpc SetTimingsEnabled (GenericBoolValue) returns (GenericVoidValue) {}
rpc GetEngineTimings (GenericVoidValue) returns (CpuTimings) {}
rpc GetTrackTimings (TrackIdentifier) returns (CpuTimings) {}
rpc GetProcessorTimings (ProcessorIdentifier) returns (CpuTimings) {}
rpc ResetAllTimings (GenericVoidValue) returns (GenericVoidValue) {}
rpc ResetTrackTimings (TrackIdentifier) returns (GenericVoidValue) {}
rpc ResetProcessorTimings (ProcessorIdentifier) returns (GenericVoidValue) {}
}
service KeyboardController
{
rpc SendNoteOn (NoteOnRequest) returns (GenericVoidValue) {}
rpc SendNoteOff (NoteOffRequest) returns (GenericVoidValue) {}
rpc SendNoteAftertouch (NoteAftertouchRequest) returns (GenericVoidValue) {}
rpc SendAftertouch (NoteModulationRequest) returns (GenericVoidValue) {}
rpc SendPitchBend (NoteModulationRequest) returns (GenericVoidValue) {}
rpc SendModulation (NoteModulationRequest) returns (GenericVoidValue) {}
}
service AudioGraphController
{
rpc GetAllProcessors (GenericVoidValue) returns (ProcessorInfoList) {}
rpc GetAllTracks (GenericVoidValue) returns (TrackInfoList) {}
rpc GetTrackId (GenericStringValue) returns (TrackIdentifier) {}
rpc GetTrackInfo (TrackIdentifier) returns (TrackInfo) {}
rpc GetTrackProcessors (TrackIdentifier) returns (ProcessorInfoList) {}
rpc GetProcessorId (GenericStringValue) returns (ProcessorIdentifier) {}
rpc GetProcessorInfo (ProcessorIdentifier) returns (ProcessorInfo) {}
rpc GetProcessorBypassState (ProcessorIdentifier) returns (GenericBoolValue) {}
rpc GetProcessorState (ProcessorIdentifier) returns (ProcessorState) {}
rpc SetProcessorBypassState (ProcessorBypassStateSetRequest) returns (GenericVoidValue) {}
rpc SetProcessorState (ProcessorStateSetRequest) returns (GenericVoidValue) {}
rpc CreateTrack (CreateTrackRequest) returns (GenericVoidValue) {}
rpc CreateMultibusTrack (CreateMultibusTrackRequest) returns (GenericVoidValue) {}
rpc CreatePreTrack (CreatePreTrackRequest) returns (GenericVoidValue) {}
rpc CreatePostTrack (CreatePostTrackRequest) returns (GenericVoidValue) {}
rpc CreateProcessorOnTrack (CreateProcessorRequest) returns (GenericVoidValue) {}
rpc MoveProcessorOnTrack (MoveProcessorRequest) returns (GenericVoidValue) {}
rpc DeleteProcessorFromTrack (DeleteProcessorRequest) returns (GenericVoidValue) {}
rpc DeleteTrack (TrackIdentifier) returns (GenericVoidValue) {}
}
service ProgramController
{
rpc GetProcessorCurrentProgram (ProcessorIdentifier) returns (ProgramIdentifier) {}
rpc GetProcessorCurrentProgramName (ProcessorIdentifier) returns (GenericStringValue) {}
rpc GetProcessorProgramName (ProcessorProgramIdentifier) returns (GenericStringValue) {}
rpc GetProcessorPrograms (ProcessorIdentifier) returns (ProgramInfoList) {}
rpc SetProcessorProgram (ProcessorProgramSetRequest) returns (GenericVoidValue) {}
}
service ParameterController
{
rpc GetTrackParameters (TrackIdentifier) returns (ParameterInfoList) {}
rpc GetProcessorParameters (ProcessorIdentifier) returns (ParameterInfoList) {}
rpc GetParameterId (ParameterIdRequest) returns (ParameterIdentifier) {}
rpc GetParameterInfo (ParameterIdentifier) returns (ParameterInfo) {}
rpc GetParameterValue (ParameterIdentifier) returns (GenericFloatValue) {}
rpc GetParameterValueInDomain (ParameterIdentifier) returns (GenericFloatValue) {}
rpc GetParameterValueAsString (ParameterIdentifier) returns (GenericStringValue) {}
rpc SetParameterValue (ParameterValue) returns (GenericVoidValue) {}
rpc GetTrackProperties (TrackIdentifier) returns (PropertyInfoList) {}
rpc GetProcessorProperties (ProcessorIdentifier) returns (PropertyInfoList) {}
rpc GetPropertyId (PropertyIdRequest) returns (PropertyIdentifier) {}
rpc GetPropertyInfo (PropertyIdentifier) returns (PropertyInfo) {}
rpc GetPropertyValue (PropertyIdentifier) returns (GenericStringValue) {}
rpc SetPropertyValue (PropertyValue) returns (GenericVoidValue) {}
}
service MidiController
{
rpc GetInputPorts (GenericVoidValue) returns (GenericIntValue) {}
rpc GetOutputPorts (GenericVoidValue) returns (GenericIntValue) {}
rpc GetAllKbdInputConnections (GenericVoidValue) returns (MidiKbdConnectionList) {}
rpc GetAllKbdOutputConnections (GenericVoidValue) returns (MidiKbdConnectionList) {}
rpc GetAllCCInputConnections (GenericVoidValue) returns (MidiCCConnectionList) {}
rpc GetAllPCInputConnections (GenericVoidValue) returns (MidiPCConnectionList) {}
rpc GetCCInputConnectionsForProcessor (ProcessorIdentifier) returns (MidiCCConnectionList) {}
rpc GetPCInputConnectionsForProcessor (ProcessorIdentifier) returns (MidiPCConnectionList) {}
rpc GetMidiClockOutputEnabled (GenericIntValue) returns (GenericBoolValue) {}
rpc SetMidiClockOutputEnabled (MidiClockSetRequest) returns (GenericVoidValue) {}
rpc ConnectKbdInputToTrack (MidiKbdConnection) returns (GenericVoidValue) {}
rpc ConnectKbdOutputFromTrack (MidiKbdConnection) returns (GenericVoidValue) {}
rpc ConnectCCToParameter (MidiCCConnection) returns (GenericVoidValue) {}
rpc ConnectPCToProcessor (MidiPCConnection) returns (GenericVoidValue) {}
rpc DisconnectKbdInput (MidiKbdConnection) returns (GenericVoidValue) {}
rpc DisconnectKbdOutput (MidiKbdConnection) returns (GenericVoidValue) {}
rpc DisconnectCC (MidiCCConnection) returns (GenericVoidValue) {}
rpc DisconnectPC (MidiPCConnection) returns (GenericVoidValue) {}
rpc DisconnectAllCCFromProcessor (ProcessorIdentifier) returns (GenericVoidValue) {}
rpc DisconnectAllPCFromProcessor (ProcessorIdentifier) returns (GenericVoidValue) {}
}
service AudioRoutingController
{
rpc GetAllInputConnections (GenericVoidValue) returns (AudioConnectionList) {}
rpc GetAllOutputConnections (GenericVoidValue) returns (AudioConnectionList) {}
rpc GetInputConnectionsForTrack (TrackIdentifier) returns (AudioConnectionList) {}
rpc GetOutputConnectionsForTrack (TrackIdentifier) returns (AudioConnectionList) {}
rpc ConnectInputChannelToTrack (AudioConnection) returns (GenericVoidValue) {}
rpc ConnectOutputChannelFromTrack (AudioConnection) returns (GenericVoidValue) {}
rpc DisconnectInput (AudioConnection) returns (GenericVoidValue) {}
rpc DisconnectOutput (AudioConnection) returns (GenericVoidValue) {}
rpc DisconnectAllInputsFromTrack (TrackIdentifier) returns (GenericVoidValue) {}
rpc DisconnectAllOutputFromTrack (TrackIdentifier) returns (GenericVoidValue) {option deprecated = true;}
rpc DisconnectAllOutputsFromTrack (TrackIdentifier) returns (GenericVoidValue) {}
}
service CvGateController
{
rpc GetCvInputChannelCount (GenericVoidValue) returns (GenericIntValue) {}
rpc GetCvOutputChannelCount (GenericVoidValue) returns (GenericIntValue) {}
rpc GetAllCvInputConnections (GenericVoidValue) returns (CvConnectionList) {}
rpc GetAllCvOutputConnections (GenericVoidValue) returns (CvConnectionList) {}
rpc GetAllGateInputConnections (GenericVoidValue) returns (GateConnectionList) {}
rpc GetAllGateOutputConnections (GenericVoidValue) returns (GateConnectionList) {}
rpc GetCvInputConnectionsForProcessor (ProcessorIdentifier) returns (CvConnectionList) {}
rpc GetCvOutputConnectionsForProcessor (ProcessorIdentifier) returns (CvConnectionList) {}
rpc GetGateInputConnectionsForProcessor (ProcessorIdentifier) returns (GateConnectionList) {}
rpc GetGateOutputConnectionsForProcessor (ProcessorIdentifier) returns (GateConnectionList) {}
rpc ConnectCvInputToParameter (CvConnection) returns (GenericVoidValue) {}
rpc ConnectCvOutputFromParameter (CvConnection) returns (GenericVoidValue) {}
rpc ConnectGateInputToProcessor (GateConnection) returns (GenericVoidValue) {}
rpc ConnectGateOutputFromProcessor (GateConnection) returns (GenericVoidValue) {}
rpc DisconnectCvInput (CvConnection) returns (GenericVoidValue) {}
rpc DisconnectCvOutput (CvConnection) returns (GenericVoidValue) {}
rpc DisconnectGateInput (GateConnection) returns (GenericVoidValue) {}
rpc DisconnectGateOutput (GateConnection) returns (GenericVoidValue) {}
rpc DisconnectAllCvInputsFromProcessor (ProcessorIdentifier) returns (GenericVoidValue) {}
rpc DisconnectAllCvOutputsFromProcessor (ProcessorIdentifier) returns (GenericVoidValue) {}
rpc DisconnectAllGateInputsFromProcessor (ProcessorIdentifier) returns (GenericVoidValue) {}
rpc DisconnectAllGateOutputsFromProcessor (ProcessorIdentifier) returns (GenericVoidValue) {}
}
service OscController
{
rpc GetSendIP (GenericVoidValue) returns (GenericStringValue) {}
rpc GetSendPort (GenericVoidValue) returns (GenericIntValue) {}
rpc GetReceivePort (GenericVoidValue) returns (GenericIntValue) {}
rpc GetEnabledParameterOutputs (GenericVoidValue) returns (OscParameterOutputList) {}
rpc EnableOutputForParameter (ParameterIdentifier) returns (GenericVoidValue) {}
rpc DisableOutputForParameter (ParameterIdentifier) returns (GenericVoidValue) {}
rpc EnableAllOutput (GenericVoidValue) returns (GenericVoidValue) {}
rpc DisableAllOutput (GenericVoidValue) returns (GenericVoidValue) {}
}
service SessionController
{
rpc SaveSession (GenericVoidValue) returns (SessionState) {}
rpc RestoreSession (SessionState) returns (GenericVoidValue) {}
}
service NotificationController
{
rpc SubscribeToTransportChanges (GenericVoidValue) returns (stream TransportUpdate) {}
rpc SubscribeToEngineCpuTimingUpdates (GenericVoidValue) returns (stream CpuTimings) {}
rpc SubscribeToTrackChanges (GenericVoidValue) returns (stream TrackUpdate) {}
rpc SubscribeToProcessorChanges (GenericVoidValue) returns (stream ProcessorUpdate) {}
rpc SubscribeToParameterUpdates (ParameterNotificationBlocklist) returns (stream ParameterUpdate) {}
rpc SubscribeToPropertyUpdates (PropertyNotificationBlocklist) returns (stream PropertyValue) {}
}
/**
* Global wrappers for primitive types.
*
* gRPC requires the usage of custom messages as arguments/return types of services,
* and it is good practice to define custom values for better future expansion of the
* protocol.
*
* However, this leads to unnecessary bloat especially for cases where it's clear
* that a primitive type is the best choice (e.g. GetNumSomething), so we define here
* some common cases to all services.
*/
message GenericVoidValue {}
message GenericFloatValue
{
float value = 1;
}
message GenericIntValue
{
int32 value = 1;
}
message GenericBoolValue
{
bool value = 1;
}
message GenericStringValue
{
string value = 1;
}
message OptionalBoolValue
{
bool has_value = 1;
bool value = 2;
}
message OptionalIntValue
{
bool has_value = 1;
int32 value = 2;
}
/* Common types */
message SushiBuildInfo
{
string version = 1;
repeated string build_options = 2;
int32 audio_buffer_size = 3;
string commit_hash = 4;
string build_date = 5;
}
message TrackIdentifier
{
int32 id = 1;
}
message ProcessorIdentifier
{
int32 id = 1;
}
message ParameterIdentifier
{
int32 processor_id = 1;
int32 parameter_id = 2;
}
message PropertyIdentifier
{
int32 processor_id = 1;
int32 property_id = 2;
}
/* 0 is reserved for "not set" in protobuf, so we don't use it for a valid response */
message ParameterType
{
enum Type
{
DUMMY = 0;
BOOL = 1;
INT = 2;
FLOAT = 3;
}
Type type = 1;
}
/* Messages */
message PlayingMode
{
enum Mode
{
DUMMY = 0;
STOPPED = 1;
PLAYING = 2;
RECORDING = 3;
}
Mode mode = 1;
}
message SyncMode
{
enum Mode
{
DUMMY = 0;
INTERNAL = 1;
MIDI = 2;
LINK = 3;
}
Mode mode = 1;
}
message TimeSignature
{
int32 numerator = 1;
int32 denominator = 2;
}
message CpuTimings
{
float average = 1;
float min = 2;
float max = 3;
}
message NoteOnRequest
{
TrackIdentifier track = 1;
int32 channel = 2;
int32 note = 3;
float velocity = 4;
}
message NoteOffRequest
{
TrackIdentifier track = 1;
int32 channel = 2;
int32 note = 3;
float velocity = 4;
}
message NoteAftertouchRequest
{
TrackIdentifier track = 1;
int32 channel = 2;
int32 note = 3;
float value = 4;
}
message NoteModulationRequest
{
TrackIdentifier track = 1;
int32 channel = 2;
float value = 3;
}
message TrackType
{
enum Type
{
DUMMY = 0;
REGULAR = 1;
PRE = 2;
POST = 3;
}
Type type = 1;
}
message TrackInfo
{
int32 id = 1;
string label = 2;
string name = 3;
int32 channels = 4;
int32 buses = 5;
TrackType type = 6;
repeated ProcessorIdentifier processors = 7;
}
message TrackInfoList
{
repeated TrackInfo tracks = 1;
}
message ProcessorInfo
{
int32 id = 1;
string label = 2;
string name = 3;
int32 parameter_count = 4;
int32 program_count = 5;
}
message ProcessorInfoList
{
repeated ProcessorInfo processors = 1;
}
message ProgramIdentifier
{
int32 program = 1;
}
message ProcessorProgramIdentifier
{
ProcessorIdentifier processor = 1;
int32 program = 2;
}
message ProgramInfo
{
ProgramIdentifier id = 1;
string name = 2;
}
message ProgramInfoList
{
repeated ProgramInfo programs = 1;
}
message ProcessorProgramSetRequest
{
ProcessorIdentifier processor = 1;
ProgramIdentifier program = 2;
}
message ProcessorBypassStateSetRequest
{
ProcessorIdentifier processor = 1;
bool value = 2;
}
message ProcessorState
{
OptionalIntValue program_id = 1;
OptionalBoolValue bypassed = 2;
repeated PropertyValue properties = 3;
repeated ParameterValue parameters = 4;
bytes binary_data = 5;
}
message ProcessorStateSetRequest
{
ProcessorIdentifier processor = 1;
ProcessorState state = 2;
}
message ParameterInfo
{
int32 id = 1;
ParameterType type = 2;
string label = 3;
string name = 4;
string unit = 5;
bool automatable = 6;
float min_domain_value = 7;
float max_domain_value = 8;
}
message ParameterInfoList
{
repeated ParameterInfo parameters = 1;
}
message ParameterIdRequest
{
ProcessorIdentifier processor = 1;
string ParameterName = 2;
}
message ParameterValue
{
ParameterIdentifier parameter = 1;
float value = 2;
}
message ParameterUpdate
{
ParameterIdentifier parameter = 1;
float normalized_value = 2;
float domain_value = 3;
string formatted_value = 4;
}
message PropertyInfo
{
int32 id = 1;
string name = 2;
string label = 3;
}
message PropertyInfoList
{
repeated PropertyInfo properties = 1;
}
message PropertyValue
{
PropertyIdentifier property = 1;
string value = 2;
}
message PropertyIdRequest
{
ProcessorIdentifier processor = 1;
string property_name = 2;
}
message PluginType
{
enum Type
{
DUMMY = 0;
INTERNAL = 1;
VST2X = 2;
VST3X = 3;
LV2 = 4;
}
Type type = 1;
}
message ProcessorPosition
{
bool add_to_back = 1;
ProcessorIdentifier before_processor = 2;
}
message CreateTrackRequest
{
string name = 1;
int32 channels = 2;
}
message CreateMultibusTrackRequest
{
string name = 1;
int32 buses = 2;
}
message CreatePreTrackRequest
{
string name = 1;
}
message CreatePostTrackRequest
{
string name = 1;
}
message CreateProcessorRequest
{
string name = 1;
string uid = 2;
string path = 3;
PluginType type = 4;
TrackIdentifier track = 5;
ProcessorPosition position = 6;
}
message MoveProcessorRequest
{
ProcessorIdentifier processor = 1;
TrackIdentifier source_track = 2;
TrackIdentifier dest_track = 3;
ProcessorPosition position = 4;
}
message DeleteProcessorRequest
{
ProcessorIdentifier processor = 1;
TrackIdentifier track = 2;
}
message ParameterNotificationBlocklist
{
repeated ParameterIdentifier parameters = 1;
}
message PropertyNotificationBlocklist
{
repeated PropertyIdentifier properties = 1;
}
message MidiChannel
{
enum Channel
{
DUMMY = 0;
MIDI_CH_1 = 1;
MIDI_CH_2 = 2;
MIDI_CH_3 = 3;
MIDI_CH_4 = 4;
MIDI_CH_5 = 5;
MIDI_CH_6 = 6;
MIDI_CH_7 = 7;
MIDI_CH_8 = 8;
MIDI_CH_9 = 9;
MIDI_CH_10 = 10;
MIDI_CH_11 = 11;
MIDI_CH_12 = 12;
MIDI_CH_13 = 13;
MIDI_CH_14 = 14;
MIDI_CH_15 = 15;
MIDI_CH_16 = 16;
MIDI_CH_OMNI = 17;
}
Channel channel = 1;
}
message AudioConnection
{
TrackIdentifier track = 1;
int32 track_channel = 2;
int32 engine_channel = 3;
}
message AudioConnectionList
{
repeated AudioConnection connections = 1;
}
message CvConnection
{
ParameterIdentifier parameter = 1;
int32 cv_port_id = 2;
}
message CvConnectionList
{
repeated CvConnection connections = 1;
}
message GateConnection
{
ProcessorIdentifier processor = 1;
int32 gate_port_id = 2;
int32 channel = 3;
int32 note_no = 4;
}
message GateConnectionList
{
repeated GateConnection connections = 1;
}
message MidiKbdConnection
{
TrackIdentifier track = 1;
MidiChannel channel = 2;
int32 port = 3;
bool raw_midi = 7;
}
message MidiKbdConnectionList
{
repeated MidiKbdConnection connections = 1;
}
message MidiCCConnection
{
ParameterIdentifier parameter = 1;
MidiChannel channel = 2;
int32 port = 3;
int32 cc_number = 4;
float min_range = 5;
float max_range = 6;
bool relative_mode = 7;
}
message MidiCCConnectionList
{
repeated MidiCCConnection connections = 1;
}
message MidiPCConnection
{
ProcessorIdentifier processor = 1;
MidiChannel channel = 2;
int32 port = 3;
}
message MidiPCConnectionList
{
repeated MidiPCConnection connections = 1;
}
message MidiClockSetRequest
{
int32 port = 1;
bool enabled = 2;
}
message OscParameterOutputList
{
repeated string path = 1;
}
message TransportUpdate
{
oneof Transport
{
float tempo = 1;
PlayingMode playing_mode = 2;
SyncMode sync_mode = 3;
TimeSignature time_signature = 4;
}
}
message TrackUpdate
{
enum Action
{
DUMMY = 0;
TRACK_ADDED = 1;
TRACK_DELETED = 2;
}
Action action = 1;
TrackIdentifier track = 2;
}
message ProcessorUpdate
{
enum Action
{
DUMMY = 0;
PROCESSOR_ADDED = 1;
PROCESSOR_DELETED = 2;
}
Action action = 1;
ProcessorIdentifier processor = 2;
TrackIdentifier parent_track = 3;
}
message MidiKbdConnectionState
{
string track = 1;
MidiChannel channel = 2;
int32 port = 3;
bool raw_midi = 7;
}
message MidiCCConnectionState
{
string processor = 1;
ParameterIdentifier parameter = 2;
MidiChannel channel = 3;
int32 port = 4;
int32 cc_number = 5;
float min_range = 6;
float max_range = 7;
bool relative_mode = 8;
}
message MidiPCConnectionState
{
string processor = 1;
MidiChannel channel = 2;
int32 port = 3;
}
message MidiState
{
int32 inputs = 1;
int32 outputs = 2;
repeated MidiKbdConnectionState kbd_input_connections = 3;
repeated MidiKbdConnectionState kbd_output_connections = 4;
repeated MidiCCConnectionState cc_connections = 5;
repeated MidiPCConnectionState pc_connections = 6;
repeated int32 enabled_clock_outputs = 7;
}
message OscParameterState
{
string processor = 1;
repeated int32 parameter_ids = 2;
}
message OscState
{
bool enable_all_processor_outputs = 1;
repeated OscParameterState enabled_processor_outputs = 2;
}
message TrackAudioConnectionState
{
string track = 1;
int32 track_channel = 2;
int32 engine_channel = 3;
}
message EngineState
{
float sample_rate = 1;
float tempo = 2;
PlayingMode playing_mode = 3;
SyncMode sync_mode = 4;
TimeSignature time_signature = 5;
bool clip_detection_input = 6;
bool clip_detection_output = 7;
bool master_limiter = 8;
int32 used_audio_inputs = 9;
int32 used_audio_outputs = 10;
repeated TrackAudioConnectionState input_connections = 11;
repeated TrackAudioConnectionState output_connections = 12;
}
message PluginClass
{
string name = 1;
string label = 2;
string uid = 3;
string path = 4;
PluginType type = 5;
ProcessorState state = 6;
}
message TrackState
{
string name = 1;
string label = 2;
int32 channels = 3;
int32 buses = 4;
TrackType type = 5;
ProcessorState track_state = 6;
repeated PluginClass processors = 7;
}
message SessionState
{
SushiBuildInfo sushi_info = 1;
string save_date = 2;
OscState osc_state = 3;
MidiState midi_state = 4;
EngineState engine_state = 5;
repeated TrackState tracks = 6;
}