Skip to content

Commit a26418b

Browse files
author
falkTX
committed
Set offset when triggering samples
1 parent a593de0 commit a26418b

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

drmr.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ static inline void layer_to_sample(drmr_sample *sample, float gain) {
229229
sample->data = sample->layers[0].data;
230230
}
231231

232-
static inline void trigger_sample(DrMr *drmr, int nn, uint8_t* const data) {
232+
static inline void trigger_sample(DrMr *drmr, int nn, uint8_t* const data, uint32_t offset) {
233233
// need to mutex this to avoid getting the samples array
234234
// changed after the check that the midi-note is valid
235235
pthread_mutex_lock(&drmr->load_mutex);
@@ -244,13 +244,13 @@ static inline void trigger_sample(DrMr *drmr, int nn, uint8_t* const data) {
244244
build_midi_info_message(drmr,data);
245245
}
246246
drmr->samples[nn].active = 1;
247-
drmr->samples[nn].offset = 0;
247+
drmr->samples[nn].offset = offset;
248248
drmr->samples[nn].velocity = drmr->ignore_velocity?1.0f:((float)data[2])/VELOCITY_MAX;
249249
}
250250
pthread_mutex_unlock(&drmr->load_mutex);
251251
}
252252

253-
static inline void untrigger_sample(DrMr *drmr, int nn) {
253+
static inline void untrigger_sample(DrMr *drmr, int nn, uint32_t offset) {
254254
pthread_mutex_lock(&drmr->load_mutex);
255255
if (nn >= 0 && nn < drmr->num_samples) {
256256
if (drmr->samples[nn].layer_count > 0) {
@@ -259,7 +259,7 @@ static inline void untrigger_sample(DrMr *drmr, int nn) {
259259
fprintf(stderr,"Failed to find layer at: %i for %f\n",nn,*drmr->gains[nn]);
260260
}
261261
drmr->samples[nn].active = 0;
262-
drmr->samples[nn].offset = 0;
262+
drmr->samples[nn].offset = offset;
263263
}
264264
pthread_mutex_unlock(&drmr->load_mutex);
265265
}
@@ -286,19 +286,20 @@ static void run(LV2_Handle instance, uint32_t n_samples) {
286286
if (ev->body.type == drmr->uris.midi_event) {
287287
uint8_t nn;
288288
uint8_t* const data = (uint8_t* const)(ev + 1);
289+
uint32_t offset = (ev->time.frames > 0 && ev->time.frames < n_samples) ? ev->time.frames : 0;
289290
//int channel = *data & 15;
290291
switch ((*data) >> 4) {
291292
case 8:
292293
if (!drmr->ignore_note_off) {
293294
nn = data[1];
294295
nn-=baseNote;
295-
untrigger_sample(drmr,nn);
296+
untrigger_sample(drmr,nn,offset);
296297
}
297298
break;
298299
case 9: {
299300
nn = data[1];
300301
nn-=baseNote;
301-
trigger_sample(drmr,nn,data);
302+
trigger_sample(drmr,nn,data,offset);
302303
break;
303304
}
304305
default:
@@ -333,10 +334,11 @@ static void run(LV2_Handle instance, uint32_t n_samples) {
333334
if (trigger) {
334335
int32_t si = ((const LV2_Atom_Int*)trigger)->body;
335336
uint8_t mdata[3];
337+
uint32_t offset = (ev->time.frames > 0 && ev->time.frames < n_samples) ? ev->time.frames : 0;
336338
mdata[0] = 0x90; // note on
337339
mdata[1] = si+baseNote;
338340
mdata[2] = 0x7f;
339-
trigger_sample(drmr,si,mdata);
341+
trigger_sample(drmr,si,mdata,offset);
340342
}
341343
if (ignvel)
342344
drmr->ignore_velocity = ((const LV2_Atom_Bool*)ignvel)->body;

0 commit comments

Comments
 (0)