| 
							- #pragma once
 - #include <rtosc/ports.h>
 - #include <rtosc/rtosc.h>
 - #include <cassert>
 - 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<void(const char *)> backend;
 - 
 -         int damaged;
 - };
 - };
 
 
  |