/*---------------------------------------------------------------------------------*/ /* Includes */ /*---------------------------------------------------------------------------------*/ #ifndef _LV2_PLUGIN_H_ #define _LV2_PLUGIN_H_ #include #include "lv2/lv2plug.in/ns/ext/atom/forge.h" // util includes atom.h #include "lv2/lv2plug.in/ns/ext/atom/util.h" #include "lv2/lv2plug.in/ns/lv2core/lv2.h" #include "lv2/lv2plug.in/ns/ext/urid/urid.h" #include "lv2/lv2plug.in/ns/ext/state/state.h" /*----------------------------------------------------------------------------*/ /* Global definitions */ /*----------------------------------------------------------------------------*/ // lv2 stuff #define DRD_DRUMMER_URI "http://rx3.net/AlkorZ3/drummer" #define DRD_GAIN_MIN -60.0f #define DRD_GAIN_MAX 6.0f #define DRD_VELOCITY_MIN 0 #define DRD_VELOCITY_MAX 127 #define DRD_DB3SCALE -0.8317830986718104f #define DRD_DB3SCALEPO 1.8317830986718104f // taken from lv2 example amp plugin #define DRD_DB_CO(g) ( ( g) > DRD_GAIN_MIN ? powf( 10.0f, ( g) * 0.05f) : 0.0f) #define DRD_PORT_NUMBER_MAX 32 #define DRD_REQ_BUF_SIZE 10 typedef enum { DRD_LV2_CONTROL = 0, DRD_LV2_MASTER_LEFT, DRD_LV2_MASTER_RIGHT, DRD_LV2_LEFT_00, DRD_LV2_RIGHT_00, DRD_LV2_LEFT_01, DRD_LV2_RIGHT_01, DRD_LV2_LEFT_02, DRD_LV2_RIGHT_02, DRD_LV2_LEFT_03, DRD_LV2_RIGHT_03, DRD_LV2_LEFT_04, DRD_LV2_RIGHT_04, DRD_LV2_LEFT_05, DRD_LV2_RIGHT_05, DRD_LV2_LEFT_06, DRD_LV2_RIGHT_06, DRD_LV2_LEFT_07, DRD_LV2_RIGHT_07, DRD_LV2_LEFT_08, DRD_LV2_RIGHT_08, DRD_LV2_LEFT_09, DRD_LV2_RIGHT_09, DRD_LV2_LEFT_10, DRD_LV2_RIGHT_10, DRD_LV2_LEFT_11, DRD_LV2_RIGHT_11, DRD_LV2_LEFT_12, DRD_LV2_RIGHT_12, DRD_LV2_LEFT_13, DRD_LV2_RIGHT_13, DRD_LV2_LEFT_14, DRD_LV2_RIGHT_14, DRD_LV2_LEFT_15, DRD_LV2_RIGHT_15, DRD_LV2_LEFT_16, DRD_LV2_RIGHT_16, DRD_LV2_LEFT_17, DRD_LV2_RIGHT_17, DRD_LV2_LEFT_18, DRD_LV2_RIGHT_18, DRD_LV2_LEFT_19, DRD_LV2_RIGHT_19, DRD_LV2_LEFT_20, DRD_LV2_RIGHT_20, DRD_LV2_LEFT_21, DRD_LV2_RIGHT_21, DRD_LV2_LEFT_22, DRD_LV2_RIGHT_22, DRD_LV2_LEFT_23, DRD_LV2_RIGHT_23, DRD_LV2_LEFT_24, DRD_LV2_RIGHT_24, DRD_LV2_LEFT_25, DRD_LV2_RIGHT_25, DRD_LV2_LEFT_26, DRD_LV2_RIGHT_26, DRD_LV2_LEFT_27, DRD_LV2_RIGHT_27, DRD_LV2_LEFT_28, DRD_LV2_RIGHT_28, DRD_LV2_LEFT_29, DRD_LV2_RIGHT_29, DRD_LV2_LEFT_30, DRD_LV2_RIGHT_30, DRD_LV2_LEFT_31, DRD_LV2_RIGHT_31, DRD_LV2_BASENOTE, DRD_LV2_GAIN_00, DRD_LV2_GAIN_01, DRD_LV2_GAIN_02, DRD_LV2_GAIN_03, DRD_LV2_GAIN_04, DRD_LV2_GAIN_05, DRD_LV2_GAIN_06, DRD_LV2_GAIN_07, DRD_LV2_GAIN_08, DRD_LV2_GAIN_09, DRD_LV2_GAIN_10, DRD_LV2_GAIN_11, DRD_LV2_GAIN_12, DRD_LV2_GAIN_13, DRD_LV2_GAIN_14, DRD_LV2_GAIN_15, DRD_LV2_GAIN_16, DRD_LV2_GAIN_17, DRD_LV2_GAIN_18, DRD_LV2_GAIN_19, DRD_LV2_GAIN_20, DRD_LV2_GAIN_21, DRD_LV2_GAIN_22, DRD_LV2_GAIN_23, DRD_LV2_GAIN_24, DRD_LV2_GAIN_25, DRD_LV2_GAIN_26, DRD_LV2_GAIN_27, DRD_LV2_GAIN_28, DRD_LV2_GAIN_29, DRD_LV2_GAIN_30, DRD_LV2_GAIN_31, DRD_LV2_PAN_00, DRD_LV2_PAN_01, DRD_LV2_PAN_02, DRD_LV2_PAN_03, DRD_LV2_PAN_04, DRD_LV2_PAN_05, DRD_LV2_PAN_06, DRD_LV2_PAN_07, DRD_LV2_PAN_08, DRD_LV2_PAN_09, DRD_LV2_PAN_10, DRD_LV2_PAN_11, DRD_LV2_PAN_12, DRD_LV2_PAN_13, DRD_LV2_PAN_14, DRD_LV2_PAN_15, DRD_LV2_PAN_16, DRD_LV2_PAN_17, DRD_LV2_PAN_18, DRD_LV2_PAN_19, DRD_LV2_PAN_20, DRD_LV2_PAN_21, DRD_LV2_PAN_22, DRD_LV2_PAN_23, DRD_LV2_PAN_24, DRD_LV2_PAN_25, DRD_LV2_PAN_26, DRD_LV2_PAN_27, DRD_LV2_PAN_28, DRD_LV2_PAN_29, DRD_LV2_PAN_30, DRD_LV2_PAN_31, DRD_LV2_CORE_EVENT, DRD_LV2_NUM_PORTS } DRT_Port_Index; typedef struct { LV2_URID midi_event; LV2_URID ui_msg; LV2_URID kit_path; LV2_URID atom_eventTransfer; LV2_URID atom_object; LV2_URID string_urid; LV2_URID bool_urid; LV2_URID int_urid; LV2_URID get_state; LV2_URID midi_info; LV2_URID sample_trigger; LV2_URID velocity_toggle; LV2_URID note_off_toggle; LV2_URID channel_nb; LV2_URID zero_position; LV2_URID sample_add; LV2_URID sample_remove; } DRT_Drummer_URIS; /* typedef struct { SF_INFO *Info; char Active; uint32_t Offset; uint32_t Limit; uint32_t Layer_Count; float Velocity; // drmr_layer *layers; float *Data; int Data_Offset; } DRT_Sample; */ typedef struct { DRT_Instrument *Instrument_Ptr; DRT_Layer *Layer_Ptr; float *Data_Ptr; uint32_t Limit; SF_INFO *SF_Info_Ptr; int Data_Offset; char Active; uint32_t Offset; float Velocity; bool Sustained; } DRT_Sample; typedef struct DRT_LV2_Base { DRT_Base Base; // Ports float *Master_Left; float *Master_Right; float **Left; float **Right; LV2_Atom_Sequence *Control_Port; LV2_Atom_Sequence *Core_Event_Port; LV2_Atom_Forge Forge; // params int Channel; int Channel_Nb; int Zero_Position; float **Gains; float **Pans; float *BaseNote; bool Sustain; // URIs LV2_URID_Map *Map_Ptr; DRT_Drummer_URIS URIS; // Kit info DRT_Kit *Kit_Cur_Ptr; uint8_t Bank_Id_LSB; uint8_t Bank_Id_MSB; uint8_t Program_Id; uint8_t Bank_Id_LSB_New; uint8_t Bank_Id_MSB_New; uint8_t Program_Id_New; DRT_Kit_Id Kit_Id; char *Current_Path; char **Request_Buf; int CurReq; // Samples DRT_Sample Samples[DRD_PORT_NUMBER_MAX]; uint8_t Sample_Number; // Loading Thread Stuff pthread_mutex_t Load_Mutex; pthread_cond_t Load_Cond; pthread_t Load_Thread; } DRT_LV2_Base; /* typedef struct { // Ports float *master_left; float *master_right; float **left; float **right; LV2_Atom_Sequence *control_port; LV2_Atom_Sequence *core_event_port; LV2_Atom_Forge forge; // params int channel; bool ignore_velocity; bool ignore_note_off; int channel_nb; int zero_position; float **gains; float **pans; float *baseNote; double rate; // URIs LV2_URID_Map *map; drmr_uris uris; // Kit info char *current_path; char **request_buf; int curReq; // Samples drmr_sample *samples; uint8_t num_samples; // loading thread stuff pthread_mutex_t load_mutex; pthread_cond_t load_cond; pthread_t load_thread; } DrMr; */ static inline void DR_Map_Drummer_URIS( LV2_URID_Map *Map_Ptr, DRT_Drummer_URIS *URIS) { URIS->midi_event = Map_Ptr->map( Map_Ptr->handle, "http://lv2plug.in/ns/ext/midi#MidiEvent"); URIS->string_urid = Map_Ptr->map( Map_Ptr->handle, LV2_ATOM__String); URIS->bool_urid = Map_Ptr->map( Map_Ptr->handle, LV2_ATOM__Bool); URIS->int_urid = Map_Ptr->map( Map_Ptr->handle, LV2_ATOM__Int); URIS->ui_msg = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#uimsg"); URIS->kit_path = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#kitpath"); URIS->get_state = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#getstate"); URIS->midi_info = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#midiinfo"); URIS->sample_trigger = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#sampletrigger"); URIS->velocity_toggle = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#velocitytoggle"); URIS->note_off_toggle = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#noteofftoggle"); URIS->channel_nb = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#channelnb"); URIS->zero_position = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#zeroposition"); URIS->sample_add = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#sampleadd"); URIS->sample_remove = Map_Ptr->map( Map_Ptr->handle, DRD_DRUMMER_URI "#sampleremove"); URIS->atom_eventTransfer = Map_Ptr->map( Map_Ptr->handle, LV2_ATOM__eventTransfer); URIS->atom_object = Map_Ptr->map( Map_Ptr->handle, LV2_ATOM__Object); } # ifdef _LV2_PLUGIN_C_ /*----------------------------------------------------------------------------*/ /* Private Definitions */ /*----------------------------------------------------------------------------*/ # endif // ifdef _LV2_PLUGIN_C_ # ifndef _LV2_PLUGIN_C_ /*----------------------------------------------------------------------------*/ /* Public Prototypes */ /*----------------------------------------------------------------------------*/ # else // ifndef _LV2_PLUGIN_C_ /*----------------------------------------------------------------------------*/ /* Private Prototypes */ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static void *DR_LV2_Load_Thread( DRT_LV2_Base *); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static inline LV2_Atom *DR_LV2_Message_Midi_Info_Build( DRT_LV2_Base *, uint8_t *); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ DRT_Status DR_LV2_Kit_Samples_Load( DRT_LV2_Base *, DRT_Kit *); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ DRT_Status DR_LV2_CurKit_Samples_Load( DRT_LV2_Base *); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static inline void DR_Layer_To_Sample( DRT_Sample *, float); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static inline void DR_Sample_Trigger( DRT_LV2_Base *, int, uint8_t *const, uint32_t); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static inline void DR_Sample_Untrigger( DRT_LV2_Base *, int, uint32_t); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static inline void DR_Sample_UnSustain( DRT_LV2_Base *, uint32_t); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static LV2_Handle DR_LV2_Instantiate(const LV2_Descriptor *, double, const char *, const LV2_Feature * const *); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static void DR_LV2_Connect_Port( LV2_Handle, uint32_t, void *); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static void DR_LV2_Run( LV2_Handle, uint32_t); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static void DR_LV2_Cleanup( LV2_Handle); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static LV2_State_Status DR_LV2_Save_State( LV2_Handle, LV2_State_Store_Function, void *, uint32_t, const LV2_Feature *const *); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static LV2_State_Status DR_LV2_Restore_State( LV2_Handle, LV2_State_Retrieve_Function, void *, uint32_t, const LV2_Feature *const *); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ static const void *DR_LV2_Extension_Data( const char *); /*----------------------------------------------------------------------------*/ /* */ /*----------------------------------------------------------------------------*/ LV2_SYMBOL_EXPORT const LV2_Descriptor *lv2_descriptor( uint32_t); # endif // ifndef _LV2_PLUGIN_C_ /*----------------------------------------------------------------------------*/ #endif // ifndef _LV2_PLUGIN_H_