#pragma once #include #include #include namespace rtosc { struct AutomationMapping { //0 - linear //1 - log int control_scale; //0 - simple linear (only first four control points are used) //1 - piecewise linear int control_type; float *control_points; int npoints; int upoints; float gain; float offset; }; struct Automation { //If automation is allocated to anything or not bool used; //If automation is used or not bool active; //relative or absolute bool relative; //Cached infomation float param_base_value; char param_path[128]; char param_type; float param_min; float param_max; float param_step; //resolution of parameter. Useful for: //- integer valued controls AutomationMapping map; }; #define RTOSC_AUTOMATION_SLOT_NAME_LEN struct AutomationSlot { //If automation slot has active automations or not bool active; //If automation slot has active automations or not bool used; //Non-negative if a new MIDI binding is being learned int learning; //-1 or a valid MIDI CC + MIDI Channel int midi_cc; //Current state supplied by MIDI value or host float current_state; //Current name char name[128]; //Collection of automations Automation *automations; }; class AutomationMgr { public: AutomationMgr(int slots, int per_slot, int control_points); ~AutomationMgr(void); /** * Create an Automation binding * * - Assumes that each binding takes a new automation slot unless learning * a macro * - Can trigger a MIDI learn (recommended for standalone and not * recommended for plugin modes) */ void createBinding(int slot, const char *path, bool start_midi_learn); void updateMapping(int slot, int sub); //Get/Set Automation Slot values 0..1 void setSlot(int slot_id, float value); void setSlotSub(int slot_id, int sub, float value); float getSlot(int slot_id); void clearSlot(int slot_id); void clearSlotSub(int slot_id, int sub); void setSlotSubGain(int slot_id, int sub, float f); float getSlotSubGain(int slot_id, int sub); void setSlotSubOffset(int slot_id, int sub, float f); float getSlotSubOffset(int slot_id, int sub); void setName(int slot_id, const char *msg); const char * getName(int slot_id); bool handleMidi(int channel, int cc, int val); void set_ports(const struct Ports &p); void set_instance(void *v); void simpleSlope(int slot, int au, float slope, float offset); int free_slot(void) const; AutomationSlot *slots; int nslots; int per_slot; int active_slot; int learn_queue_len; struct AutomationMgrImpl *impl; const rtosc::Ports *p; void *instance; std::function backend; int damaged; }; };