Allow sample to be triggered by clicking on notification led
This commit is contained in:
parent
b5f2a60d44
commit
925f6b20a4
51
drmr.c
51
drmr.c
@ -212,6 +212,26 @@ static inline void layer_to_sample(drmr_sample *sample, float gain) {
|
|||||||
sample->data = sample->layers[0].data;
|
sample->data = sample->layers[0].data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void trigger_sample(DrMr *drmr, int nn, uint8_t* const data) {
|
||||||
|
// need to mutex this to avoid getting the samples array
|
||||||
|
// changed after the check that the midi-note is valid
|
||||||
|
pthread_mutex_lock(&drmr->load_mutex);
|
||||||
|
if (nn >= 0 && nn < drmr->num_samples) {
|
||||||
|
if (drmr->samples[nn].layer_count > 0) {
|
||||||
|
layer_to_sample(drmr->samples+nn,*(drmr->gains[nn]));
|
||||||
|
if (drmr->samples[nn].limit == 0)
|
||||||
|
fprintf(stderr,"Failed to find layer at: %i for %f\n",nn,*drmr->gains[nn]);
|
||||||
|
}
|
||||||
|
if (data) {
|
||||||
|
lv2_atom_forge_frame_time(&drmr->forge, 0);
|
||||||
|
build_midi_info_message(drmr,data);
|
||||||
|
}
|
||||||
|
drmr->samples[nn].active = 1;
|
||||||
|
drmr->samples[nn].offset = 0;
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&drmr->load_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
#define DB3SCALE -0.8317830986718104f
|
#define DB3SCALE -0.8317830986718104f
|
||||||
#define DB3SCALEPO 1.8317830986718104f
|
#define DB3SCALEPO 1.8317830986718104f
|
||||||
// taken from lv2 example amp plugin
|
// taken from lv2 example amp plugin
|
||||||
@ -242,21 +262,7 @@ static void run(LV2_Handle instance, uint32_t n_samples) {
|
|||||||
case 9: {
|
case 9: {
|
||||||
uint8_t nn = data[1];
|
uint8_t nn = data[1];
|
||||||
nn-=baseNote;
|
nn-=baseNote;
|
||||||
// need to mutex this to avoid getting the samples array
|
trigger_sample(drmr,nn,data);
|
||||||
// changed after the check that the midi-note is valid
|
|
||||||
pthread_mutex_lock(&drmr->load_mutex);
|
|
||||||
if (nn >= 0 && nn < drmr->num_samples) {
|
|
||||||
if (drmr->samples[nn].layer_count > 0) {
|
|
||||||
layer_to_sample(drmr->samples+nn,*(drmr->gains[nn]));
|
|
||||||
if (drmr->samples[nn].limit == 0)
|
|
||||||
fprintf(stderr,"Failed to find layer at: %i for %f\n",nn,*drmr->gains[nn]);
|
|
||||||
}
|
|
||||||
lv2_atom_forge_frame_time(&drmr->forge, 0);
|
|
||||||
build_midi_info_message(drmr,data);
|
|
||||||
drmr->samples[nn].active = 1;
|
|
||||||
drmr->samples[nn].offset = 0;
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&drmr->load_mutex);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -267,10 +273,9 @@ static void run(LV2_Handle instance, uint32_t n_samples) {
|
|||||||
const LV2_Atom_Object *obj = (LV2_Atom_Object*)&ev->body;
|
const LV2_Atom_Object *obj = (LV2_Atom_Object*)&ev->body;
|
||||||
if (obj->body.otype == drmr->uris.ui_msg) {
|
if (obj->body.otype == drmr->uris.ui_msg) {
|
||||||
const LV2_Atom* path = NULL;
|
const LV2_Atom* path = NULL;
|
||||||
lv2_object_get(obj, drmr->uris.kit_path, &path, 0);
|
const LV2_Atom* trigger = NULL;
|
||||||
if (!path)
|
lv2_object_get(obj, drmr->uris.kit_path, &path, drmr->uris.sample_trigger, &trigger, 0);
|
||||||
fprintf(stderr,"Got UI message without kit_path, ignoring\n");
|
if (path) {
|
||||||
else {
|
|
||||||
int reqPos = (drmr->curReq+1)%REQ_BUF_SIZE;
|
int reqPos = (drmr->curReq+1)%REQ_BUF_SIZE;
|
||||||
char *tmp = NULL;
|
char *tmp = NULL;
|
||||||
if (reqPos >= 0 &&
|
if (reqPos >= 0 &&
|
||||||
@ -280,6 +285,14 @@ static void run(LV2_Handle instance, uint32_t n_samples) {
|
|||||||
drmr->curReq = reqPos;
|
drmr->curReq = reqPos;
|
||||||
if (tmp) free(tmp);
|
if (tmp) free(tmp);
|
||||||
}
|
}
|
||||||
|
if (trigger) {
|
||||||
|
int32_t si = ((const LV2_Atom_Int*)trigger)->body;
|
||||||
|
uint8_t mdata[3];
|
||||||
|
mdata[0] = 0x90; // note on
|
||||||
|
mdata[1] = si+baseNote;
|
||||||
|
mdata[2] = 0x7f;
|
||||||
|
trigger_sample(drmr,si,mdata);
|
||||||
|
}
|
||||||
} else if (obj->body.otype == drmr->uris.get_state) {
|
} else if (obj->body.otype == drmr->uris.get_state) {
|
||||||
lv2_atom_forge_frame_time(&drmr->forge, 0);
|
lv2_atom_forge_frame_time(&drmr->forge, 0);
|
||||||
build_state_message(drmr);
|
build_state_message(drmr);
|
||||||
|
4
drmr.h
4
drmr.h
@ -150,6 +150,7 @@ typedef struct {
|
|||||||
LV2_URID string_urid;
|
LV2_URID string_urid;
|
||||||
LV2_URID get_state;
|
LV2_URID get_state;
|
||||||
LV2_URID midi_info;
|
LV2_URID midi_info;
|
||||||
|
LV2_URID sample_trigger;
|
||||||
} drmr_uris;
|
} drmr_uris;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -208,6 +209,9 @@ void map_drmr_uris(LV2_URID_Map *map,
|
|||||||
uris->midi_info =
|
uris->midi_info =
|
||||||
map->map(map->handle,
|
map->map(map->handle,
|
||||||
DRMR_URI "#midiinfo");
|
DRMR_URI "#midiinfo");
|
||||||
|
uris->sample_trigger =
|
||||||
|
map->map(map->handle,
|
||||||
|
DRMR_URI "#sampletrigger");
|
||||||
uris->atom_eventTransfer =
|
uris->atom_eventTransfer =
|
||||||
map->map(map->handle, LV2_ATOM__eventTransfer);
|
map->map(map->handle, LV2_ATOM__eventTransfer);
|
||||||
uris->atom_resource =
|
uris->atom_resource =
|
||||||
|
30
drmr_ui.c
30
drmr_ui.c
@ -65,7 +65,7 @@ typedef struct {
|
|||||||
int samples;
|
int samples;
|
||||||
int baseNote;
|
int baseNote;
|
||||||
|
|
||||||
GQuark gain_quark, pan_quark;
|
GQuark gain_quark, pan_quark, trigger_quark;
|
||||||
|
|
||||||
int curKit;
|
int curKit;
|
||||||
int kitReq;
|
int kitReq;
|
||||||
@ -92,6 +92,24 @@ static gboolean pan_callback(GtkRange* range, GtkScrollType type, gdouble value,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean trigger_led_clicked(GtkWidget *widget, GdkEvent *event, gpointer data) {
|
||||||
|
LV2_Atom_Forge_Frame set_frame;
|
||||||
|
DrMrUi* ui = (DrMrUi*)data;
|
||||||
|
int32_t tidx = GPOINTER_TO_INT(g_object_get_qdata(G_OBJECT(widget),ui->trigger_quark));
|
||||||
|
uint8_t msg_buf[1024];
|
||||||
|
lv2_atom_forge_set_buffer(&ui->forge, msg_buf, 1024);
|
||||||
|
LV2_Atom *msg = (LV2_Atom*)lv2_atom_forge_resource
|
||||||
|
(&ui->forge, &set_frame, 1, ui->uris.ui_msg);
|
||||||
|
lv2_atom_forge_property_head(&ui->forge, ui->uris.sample_trigger,0);
|
||||||
|
lv2_atom_forge_int(&ui->forge, tidx);
|
||||||
|
lv2_atom_forge_pop(&ui->forge,&set_frame);
|
||||||
|
ui->write(ui->controller,DRMR_CONTROL,
|
||||||
|
lv2_atom_total_size(msg),
|
||||||
|
ui->uris.atom_eventTransfer,
|
||||||
|
msg);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void fill_sample_table(DrMrUi* ui, int samples, char** names, GtkWidget** notify_leds, GtkWidget** gain_sliders, GtkWidget** pan_sliders) {
|
static void fill_sample_table(DrMrUi* ui, int samples, char** names, GtkWidget** notify_leds, GtkWidget** gain_sliders, GtkWidget** pan_sliders) {
|
||||||
int row = 0;
|
int row = 0;
|
||||||
int col = 0;
|
int col = 0;
|
||||||
@ -116,7 +134,7 @@ static void fill_sample_table(DrMrUi* ui, int samples, char** names, GtkWidget**
|
|||||||
|
|
||||||
for(si = 0;si<samples;si++) {
|
for(si = 0;si<samples;si++) {
|
||||||
GtkWidget *frame,*vbox,*hbox,*gain_vbox,*pan_vbox;
|
GtkWidget *frame,*vbox,*hbox,*gain_vbox,*pan_vbox;
|
||||||
GtkWidget *button_box, *led;
|
GtkWidget *button_box, *led_event_box, *led;
|
||||||
GtkWidget* gain_slider;
|
GtkWidget* gain_slider;
|
||||||
GtkWidget* pan_slider;
|
GtkWidget* pan_slider;
|
||||||
GtkWidget* gain_label;
|
GtkWidget* gain_label;
|
||||||
@ -188,10 +206,15 @@ static void fill_sample_table(DrMrUi* ui, int samples, char** names, GtkWidget**
|
|||||||
|
|
||||||
button_box = gtk_hbox_new(false,2);
|
button_box = gtk_hbox_new(false,2);
|
||||||
|
|
||||||
|
led_event_box = gtk_event_box_new();
|
||||||
|
g_object_set_qdata(G_OBJECT(led_event_box),ui->trigger_quark,GINT_TO_POINTER(si));
|
||||||
|
g_signal_connect(G_OBJECT(led_event_box),"button-release-event",
|
||||||
|
G_CALLBACK(trigger_led_clicked),ui);
|
||||||
led = gtk_image_new_from_pixbuf(led_off_pixbuf);
|
led = gtk_image_new_from_pixbuf(led_off_pixbuf);
|
||||||
if (notify_leds) notify_leds[si] = led;
|
if (notify_leds) notify_leds[si] = led;
|
||||||
|
gtk_container_add(GTK_CONTAINER(led_event_box),led);
|
||||||
|
|
||||||
gtk_box_pack_start(GTK_BOX(button_box),led,false,false,0);
|
gtk_box_pack_start(GTK_BOX(button_box),led_event_box,false,false,0);
|
||||||
gtk_box_pack_start(GTK_BOX(button_box),gtk_label_new(""),true,true,0);
|
gtk_box_pack_start(GTK_BOX(button_box),gtk_label_new(""),true,true,0);
|
||||||
|
|
||||||
|
|
||||||
@ -576,6 +599,7 @@ instantiate(const LV2UI_Descriptor* descriptor,
|
|||||||
ui->kits = scan_kits();
|
ui->kits = scan_kits();
|
||||||
ui->gain_quark = g_quark_from_string("drmr_gain_quark");
|
ui->gain_quark = g_quark_from_string("drmr_gain_quark");
|
||||||
ui->pan_quark = g_quark_from_string("drmr_pan_quark");
|
ui->pan_quark = g_quark_from_string("drmr_pan_quark");
|
||||||
|
ui->trigger_quark = g_quark_from_string("drmr_trigger_quark");
|
||||||
ui->gain_sliders = NULL;
|
ui->gain_sliders = NULL;
|
||||||
ui->pan_sliders = NULL;
|
ui->pan_sliders = NULL;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user