@@ -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