Fix crash on device reconnect. Use less ad-hoc method to display warnings on bad...
[calfbox.git] / sampler.c
blobd9db05422cf1b8646666d2e997850e2d99406deb
1 /*
2 Calf Box, an open source musical instrument.
3 Copyright (C) 2010-2013 Krzysztof Foltman
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #include "config-api.h"
20 #include "dspmath.h"
21 #include "errors.h"
22 #include "midi.h"
23 #include "module.h"
24 #include "rt.h"
25 #include "sampler.h"
26 #include "sampler_impl.h"
27 #include "sfzloader.h"
28 #include "stm.h"
29 #include <assert.h>
30 #include <errno.h>
31 #include <glib.h>
32 #include <math.h>
33 #include <memory.h>
34 #include <sndfile.h>
35 #include <stdio.h>
36 #include <stdlib.h>
38 #define MAX_RELEASED_GROUPS 4
40 static float sine_wave[2049];
42 GQuark cbox_sampler_error_quark()
44 return g_quark_from_string("cbox-sampler-error-quark");
47 static void sampler_process_block(struct cbox_module *module, cbox_sample_t **inputs, cbox_sample_t **outputs);
48 static void sampler_process_event(struct cbox_module *module, const uint8_t *data, uint32_t len);
49 static void sampler_destroyfunc(struct cbox_module *module);
51 static void lfo_init(struct sampler_lfo *lfo, struct sampler_lfo_params *lfop, int srate, double srate_inv)
53 lfo->phase = 0;
54 lfo->age = 0;
55 lfo->delta = (uint32_t)(lfop->freq * 65536.0 * 65536.0 * CBOX_BLOCK_SIZE * srate_inv);
56 lfo->delay = (uint32_t)(lfop->delay * srate);
57 lfo->fade = (uint32_t)(lfop->fade * srate);
61 static void sampler_voice_release(struct sampler_voice *v, gboolean is_polyaft);
63 static void sampler_start_voice(struct sampler_module *m, struct sampler_channel *c, struct sampler_voice *v, struct sampler_layer_data *l, int note, int vel, int *exgroups, int *pexgroupcount)
65 v->age = 0;
66 if (l->trigger == stm_release)
68 // time since last 'note on' for that note
69 v->age = m->current_time - c->prev_note_start_time[note];
70 double age = v->age * m->module.srate_inv;
71 // if attenuation is more than 84dB, ignore the release trigger
72 if (age * l->rt_decay > 84)
73 return;
75 uint32_t end = l->waveform->info.frames;
76 if (l->end != 0)
77 end = (l->end == -1) ? 0 : l->end;
78 v->last_waveform = l->waveform;
79 v->cur_sample_end = end;
80 if (end > l->waveform->info.frames)
81 end = l->waveform->info.frames;
83 v->output_pair_no = l->output % m->output_pairs;
84 v->serial_no = m->serial_no;
85 v->pos = l->offset;
86 if (l->offset_random)
87 v->pos += ((uint32_t)(rand() + (rand() << 16))) % l->offset_random;
88 if (v->pos >= end)
89 v->pos = end;
90 float delay = l->delay;
91 if (l->delay_random)
92 delay += rand() * (1.0 / RAND_MAX) * l->delay_random;
93 if (delay > 0)
94 v->delay = (int)(delay * m->module.srate);
95 else
96 v->delay = 0;
97 v->frac_pos = 0;
98 v->loop_start = l->loop_start;
99 v->loop_overlap = l->loop_overlap;
100 v->loop_overlap_step = 1.0 / l->loop_overlap;
101 v->gain_fromvel = 1.0 + (l->eff_velcurve[vel] - 1.0) * l->amp_veltrack * 0.01;
102 v->gain_shift = 0.0;
103 v->note = note;
104 v->vel = vel;
105 v->mode = l->waveform->info.channels == 2 ? spt_stereo16 : spt_mono16;
106 v->pitch_shift = 0;
107 v->released = 0;
108 v->released_with_sustain = 0;
109 v->released_with_sostenuto = 0;
110 v->captured_sostenuto = 0;
111 v->channel = c;
112 v->layer = l;
113 v->program = c->program;
114 v->amp_env.shape = &l->amp_env_shape;
115 v->filter_env.shape = &l->filter_env_shape;
116 v->pitch_env.shape = &l->pitch_env_shape;
117 v->last_lgain = 0;
118 v->last_rgain = 0;
119 v->cutoff_shift = vel * l->fil_veltrack / 127.0 + (note - l->fil_keycenter) * l->fil_keytrack;
120 v->loop_mode = l->loop_mode;
121 v->off_by = l->off_by;
122 int auxes = (m->module.outputs - m->module.aux_offset) / 2;
123 if (l->effect1bus >= 1 && l->effect1bus < 1 + auxes)
124 v->send1bus = l->effect1bus;
125 else
126 v->send1bus = 0;
127 if (l->effect2bus >= 1 && l->effect2bus < 1 + auxes)
128 v->send2bus = l->effect2bus;
129 else
130 v->send2bus = 0;
131 v->send1gain = l->effect1 * 0.01;
132 v->send2gain = l->effect2 * 0.01;
133 if (l->group >= 1 && *pexgroupcount < MAX_RELEASED_GROUPS)
135 gboolean found = FALSE;
136 for (int j = 0; j < *pexgroupcount; j++)
138 if (exgroups[j] == l->group)
140 found = TRUE;
141 break;
144 if (!found)
146 exgroups[(*pexgroupcount)++] = l->group;
149 lfo_init(&v->amp_lfo, &l->amp_lfo, m->module.srate, m->module.srate_inv);
150 lfo_init(&v->filter_lfo, &l->filter_lfo, m->module.srate, m->module.srate_inv);
151 lfo_init(&v->pitch_lfo, &l->pitch_lfo, m->module.srate, m->module.srate_inv);
153 cbox_biquadf_reset(&v->filter_left);
154 cbox_biquadf_reset(&v->filter_right);
155 cbox_biquadf_reset(&v->filter_left2);
156 cbox_biquadf_reset(&v->filter_right2);
158 GSList *nif = v->layer->nifs;
159 while(nif)
161 struct sampler_noteinitfunc *p = nif->data;
162 p->notefunc(p, v);
163 nif = nif->next;
166 cbox_envelope_reset(&v->amp_env);
167 cbox_envelope_reset(&v->filter_env);
168 cbox_envelope_reset(&v->pitch_env);
171 void sampler_start_note(struct sampler_module *m, struct sampler_channel *c, int note, int vel, gboolean is_release_trigger)
173 float random = rand() * 1.0 / (RAND_MAX + 1.0);
174 if (!is_release_trigger)
176 c->switchmask[note >> 5] |= 1 << (note & 31);
177 c->prev_note_velocity[note] = vel;
178 c->prev_note_start_time[note] = m->current_time;
180 struct sampler_program *prg = c->program;
181 if (!prg || !prg->rll || prg->deleting)
182 return;
183 GSList *next_layer = sampler_program_get_next_layer(prg, c, !is_release_trigger ? prg->rll->layers : prg->rll->layers_release, note, vel, random);
184 if (!next_layer)
186 if (!is_release_trigger)
187 c->previous_note = note;
188 return;
191 // this might perhaps be optimized by mapping the group identifiers to flat-array indexes
192 // but I'm not going to do that until someone gives me an SFZ worth doing that work ;)
193 int exgroups[MAX_RELEASED_GROUPS], exgroupcount = 0;
195 for (int i = 0; i < MAX_SAMPLER_VOICES; i++)
197 if (m->voices[i].mode == spt_inactive)
199 struct sampler_voice *v = &m->voices[i];
200 struct sampler_layer *l = next_layer->data;
201 // Maybe someone forgot to call sampler_update_layer?
202 assert(l->runtime);
203 sampler_start_voice(m, c, v, l->runtime, note, vel, exgroups, &exgroupcount);
204 next_layer = sampler_program_get_next_layer(prg, c, g_slist_next(next_layer), note, vel, random);
205 if (!next_layer)
206 break;
209 if (!is_release_trigger)
210 c->previous_note = note;
211 if (exgroupcount)
213 for (int i = 0; i < MAX_SAMPLER_VOICES; i++)
215 struct sampler_voice *v = &m->voices[i];
216 if (v->mode == spt_inactive)
217 continue;
219 for (int j = 0; j < exgroupcount; j++)
221 if (v->off_by == exgroups[j] && v->note != note)
223 if (v->layer->off_mode == som_fast)
225 v->released = 1;
226 cbox_envelope_go_to(&v->amp_env, 15);
228 else
230 v->released = 1;
232 break;
239 void sampler_channel_start_release_triggered_voices(struct sampler_channel *c, int note)
241 if (c->program && c->program->rll && c->program->rll->layers_release)
243 if (c->prev_note_velocity[note])
245 sampler_start_note(c->module, c, note, c->prev_note_velocity[note], TRUE);
246 c->prev_note_velocity[note] = 0;
251 void sampler_voice_release(struct sampler_voice *v, gboolean is_polyaft)
253 if ((v->loop_mode == slm_one_shot_chokeable) != is_polyaft)
254 return;
255 if (v->delay >= v->age + CBOX_BLOCK_SIZE)
257 v->released = 1;
258 v->mode = spt_inactive;
260 else
262 if (v->loop_mode != slm_one_shot)
263 v->released = 1;
264 else
265 v->loop_start = -1; // should be guaranteed by layer settings anyway
269 void sampler_stop_note(struct sampler_module *m, struct sampler_channel *c, int note, int vel, gboolean is_polyaft)
271 c->switchmask[note >> 5] &= ~(1 << (note & 31));
272 for (int i = 0; i < MAX_SAMPLER_VOICES; i++)
274 struct sampler_voice *v = &m->voices[i];
275 if (v->channel == c && v->note == note && v->layer->trigger != stm_release)
277 if (v->captured_sostenuto)
278 v->released_with_sostenuto = 1;
279 else if (c->cc[64] >= 64)
280 v->released_with_sustain = 1;
281 else
282 sampler_voice_release(v, is_polyaft);
286 if (c->cc[64] < 64)
287 sampler_channel_start_release_triggered_voices(c, note);
288 else
289 c->sustainmask[note >> 5] |= (1 << (note & 31));
292 void sampler_stop_sustained(struct sampler_module *m, struct sampler_channel *c)
294 for (int i = 0; i < MAX_SAMPLER_VOICES; i++)
296 struct sampler_voice *v = &m->voices[i];
297 if (v->channel == c && v->released_with_sustain && v->layer->trigger != stm_release)
299 if (v->mode != spt_inactive)
301 sampler_voice_release(v, FALSE);
302 v->released_with_sustain = 0;
306 // Start release layers for the newly released keys
307 if (c->program->rll && c->program->rll->layers_release)
309 for (int i = 0; i < 128; i++)
311 if (c->sustainmask[i >> 5] & (1 << (i & 31)))
312 sampler_channel_start_release_triggered_voices(c, i);
315 memset(c->sustainmask, 0, sizeof(c->sustainmask));
318 void sampler_stop_sostenuto(struct sampler_module *m, struct sampler_channel *c)
320 for (int i = 0; i < MAX_SAMPLER_VOICES; i++)
322 struct sampler_voice *v = &m->voices[i];
323 if (v->mode != spt_inactive && v->channel == c && v->released_with_sostenuto && v->layer->trigger != stm_release)
325 sampler_channel_start_release_triggered_voices(c, v->note);
326 sampler_voice_release(v, FALSE);
327 v->released_with_sostenuto = 0;
328 // XXXKF unsure what to do with sustain
331 // Start release layers for the newly released keys
332 if (c->program->rll && c->program->rll->layers_release)
334 for (int i = 0; i < 128; i++)
336 if (c->sostenutomask[i >> 5] & (1 << (i & 31)))
337 sampler_channel_start_release_triggered_voices(c, i);
340 memset(c->sostenutomask, 0, sizeof(c->sostenutomask));
343 void sampler_capture_sostenuto(struct sampler_module *m, struct sampler_channel *c)
345 for (int i = 0; i < MAX_SAMPLER_VOICES; i++)
347 struct sampler_voice *v = &m->voices[i];
348 if (v->mode != spt_inactive && v->channel == c && !v->released && v->loop_mode != slm_one_shot && v->loop_mode != slm_one_shot_chokeable)
350 // XXXKF unsure what to do with sustain
351 v->captured_sostenuto = 1;
352 c->sostenutomask[v->note >> 5] |= (1 << (v->note & 31));
357 void sampler_stop_all(struct sampler_module *m, struct sampler_channel *c)
359 for (int i = 0; i < MAX_SAMPLER_VOICES; i++)
361 struct sampler_voice *v = &m->voices[i];
362 if (v->mode != spt_inactive && v->channel == c)
364 sampler_voice_release(v, v->loop_mode == slm_one_shot_chokeable);
365 v->released_with_sustain = 0;
366 v->released_with_sostenuto = 0;
367 v->captured_sostenuto = 0;
372 void sampler_steal_voice(struct sampler_module *m)
374 int max_age = 0, voice_found = -1;
375 for (int i = 0; i < MAX_SAMPLER_VOICES; i++)
377 struct sampler_voice *v = &m->voices[i];
378 if (v->mode == spt_inactive)
379 continue;
380 if (v->amp_env.cur_stage == 15)
381 continue;
382 int age = m->serial_no - v->serial_no;
383 if (v->loop_start == -1)
384 age += (int)(v->pos * 100.0 / v->cur_sample_end);
385 else
386 if (v->released)
387 age += 10;
388 if (age > max_age)
390 max_age = age;
391 voice_found = i;
394 if (voice_found != -1)
396 m->voices[voice_found].released = 1;
397 cbox_envelope_go_to(&m->voices[voice_found].amp_env, 15);
401 static inline void mix_block_into_with_gain(cbox_sample_t **outputs, int oofs, float *src_left, float *src_right, float gain)
403 cbox_sample_t *dst_left = outputs[oofs];
404 cbox_sample_t *dst_right = outputs[oofs + 1];
405 for (size_t i = 0; i < CBOX_BLOCK_SIZE; i++)
407 dst_left[i] += gain * src_left[i];
408 dst_right[i] += gain * src_right[i];
412 static inline float lfo_run(struct sampler_lfo *lfo)
414 if (lfo->age < lfo->delay)
416 lfo->age += CBOX_BLOCK_SIZE;
417 return 0.f;
420 const int FRAC_BITS = 32 - 11;
421 lfo->phase += lfo->delta;
422 uint32_t iphase = lfo->phase >> FRAC_BITS;
423 float frac = (lfo->phase & ((1 << FRAC_BITS) - 1)) * (1.0 / (1 << FRAC_BITS));
425 float v = sine_wave[iphase] + (sine_wave[iphase + 1] - sine_wave[iphase]) * frac;
426 if (lfo->fade && lfo->age < lfo->delay + lfo->fade)
428 v *= (lfo->age - lfo->delay) * 1.0 / lfo->fade;
429 lfo->age += CBOX_BLOCK_SIZE;
432 return v;
435 static inline float clip01(float v)
437 if (v < 0.f)
438 return 0;
439 if (v > 1.f)
440 return 1;
441 return v;
444 static gboolean is_4pole(struct sampler_layer_data *v)
446 if (v->cutoff == -1)
447 return FALSE;
448 return v->fil_type == sft_lp24 || v->fil_type == sft_hp24 || v->fil_type == sft_bp12;
451 static gboolean is_tail_finished(struct sampler_voice *v)
453 if (v->layer->cutoff == -1)
454 return TRUE;
455 double eps = 1.0 / 65536.0;
456 if (cbox_biquadf_is_audible(&v->filter_left, eps))
457 return FALSE;
458 if (cbox_biquadf_is_audible(&v->filter_right, eps))
459 return FALSE;
460 if (is_4pole(v->layer))
462 if (cbox_biquadf_is_audible(&v->filter_left2, eps))
463 return FALSE;
464 if (cbox_biquadf_is_audible(&v->filter_right2, eps))
465 return FALSE;
468 return TRUE;
471 static inline int addcc(struct sampler_channel *c, int cc_no)
473 return (((int)c->cc[cc_no]) << 7) + c->cc[cc_no + 32];
476 void sampler_voice_process(struct sampler_voice *v, struct sampler_module *m, cbox_sample_t **outputs)
478 struct sampler_layer_data *l = v->layer;
480 // if it's a DAHD envelope without sustain, consider the note finished
481 if (v->amp_env.cur_stage == 4 && v->amp_env.shape->stages[3].end_value == 0)
482 cbox_envelope_go_to(&v->amp_env, 15);
484 struct sampler_channel *c = v->channel;
485 v->age += CBOX_BLOCK_SIZE;
487 if (v->age < v->delay)
488 return;
490 if (v->last_waveform != v->layer->waveform)
492 v->last_waveform = v->layer->waveform;
493 if (v->layer->waveform)
495 v->mode = v->layer->waveform->info.channels == 2 ? spt_stereo16 : spt_mono16;
496 v->cur_sample_end = v->layer->waveform->info.frames;
498 else
500 v->mode = spt_inactive;
501 return;
504 // XXXKF I'm sacrificing sample accuracy for delays for now
505 v->delay = 0;
507 float pitch = (v->note - l->pitch_keycenter) * l->pitch_keytrack + l->tune + l->transpose * 100 + v->pitch_shift;
508 float modsrcs[smsrc_pernote_count];
509 modsrcs[smsrc_vel - smsrc_pernote_offset] = v->vel * (1.0 / 127.0);
510 modsrcs[smsrc_pitch - smsrc_pernote_offset] = pitch * (1.0 / 100.0);
511 modsrcs[smsrc_polyaft - smsrc_pernote_offset] = 0; // XXXKF not supported yet
512 modsrcs[smsrc_pitchenv - smsrc_pernote_offset] = cbox_envelope_get_next(&v->pitch_env, v->released) * 0.01f;
513 modsrcs[smsrc_filenv - smsrc_pernote_offset] = cbox_envelope_get_next(&v->filter_env, v->released) * 0.01f;
514 modsrcs[smsrc_ampenv - smsrc_pernote_offset] = cbox_envelope_get_next(&v->amp_env, v->released) * 0.01f;
516 modsrcs[smsrc_amplfo - smsrc_pernote_offset] = lfo_run(&v->amp_lfo);
517 modsrcs[smsrc_fillfo - smsrc_pernote_offset] = lfo_run(&v->filter_lfo);
518 modsrcs[smsrc_pitchlfo - smsrc_pernote_offset] = lfo_run(&v->pitch_lfo);
520 if (v->amp_env.cur_stage < 0)
522 if (is_tail_finished(v))
524 v->mode = spt_inactive;
525 return;
529 float moddests[smdestcount];
530 moddests[smdest_gain] = 0;
531 moddests[smdest_pitch] = pitch + c->pitchbend;
532 moddests[smdest_cutoff] = v->cutoff_shift;
533 moddests[smdest_resonance] = 0;
534 GSList *mod = l->modulations;
535 if (l->trigger == stm_release)
536 moddests[smdest_gain] -= v->age * l->rt_decay * m->module.srate_inv;
537 static const int modoffset[4] = {0, -1, -1, 1 };
538 static const int modscale[4] = {1, 1, 2, -2 };
539 while(mod)
541 struct sampler_modulation *sm = mod->data;
542 float value = 0.f, value2 = 1.f;
543 if (sm->src < smsrc_pernote_offset)
544 value = c->cc[sm->src] / 127.0;
545 else
546 value = modsrcs[sm->src - smsrc_pernote_offset];
547 value = modoffset[sm->flags & 3] + value * modscale[sm->flags & 3];
549 if (sm->src2 != smsrc_none)
551 if (sm->src2 < smsrc_pernote_offset)
552 value2 = c->cc[sm->src2] / 127.0;
553 else
554 value2 = modsrcs[sm->src2 - smsrc_pernote_offset];
556 value2 = modoffset[(sm->flags & 12) >> 2] + value2 * modscale[(sm->flags & 12) >> 2];
557 value *= value2;
559 moddests[sm->dest] += value * sm->amount;
561 mod = g_slist_next(mod);
564 double maxv = 127 << 7;
565 double freq = l->eff_freq * cent2factor(moddests[smdest_pitch]) ;
566 uint64_t freq64 = (uint64_t)(freq * 65536.0 * 65536.0 * m->module.srate_inv);
567 v->sample_data = v->last_waveform->data;
568 if (v->last_waveform->levels)
570 // XXXKF: optimise later by caching last lookup value
571 // XXXKF: optimise later by using binary search
572 for (int i = 0; i < v->last_waveform->level_count; i++)
574 if (freq64 <= v->last_waveform->levels[i].max_rate)
576 v->sample_data = v->last_waveform->levels[i].data;
577 break;
581 v->delta = freq64 >> 32;
582 v->frac_delta = freq64 & 0xFFFFFFFF;
583 float gain = modsrcs[smsrc_ampenv - smsrc_pernote_offset] * l->volume_linearized * v->gain_fromvel * addcc(c, 7) * addcc(c, 11) / (maxv * maxv);
584 if (moddests[smdest_gain] != 0.0)
585 gain *= dB2gain(moddests[smdest_gain]);
586 float pan = (l->pan + 100) * (1.0 / 200.0) + (addcc(c, 10) * 1.0 / maxv - 0.5) * 2;
587 if (pan < 0)
588 pan = 0;
589 if (pan > 1)
590 pan = 1;
591 v->lgain = gain * (1 - pan) / 32768.0;
592 v->rgain = gain * pan / 32768.0;
593 if (l->cutoff != -1)
595 float cutoff = l->cutoff * cent2factor(moddests[smdest_cutoff]);
596 if (cutoff < 20)
597 cutoff = 20;
598 if (cutoff > m->module.srate * 0.45)
599 cutoff = m->module.srate * 0.45;
600 //float resonance = v->resonance*pow(32.0,c->cc[71]/maxv);
601 float resonance = l->resonance_linearized * dB2gain(moddests[smdest_resonance]);
602 if (resonance < 0.7)
603 resonance = 0.7;
604 if (resonance > 32)
605 resonance = 32;
606 // XXXKF this is found experimentally and probably far off from correct formula
607 if (is_4pole(v->layer))
608 resonance = sqrt(resonance / 0.707) * 0.5;
609 switch(l->fil_type)
611 case sft_lp12:
612 case sft_lp24:
613 cbox_biquadf_set_lp_rbj(&v->filter_coeffs, cutoff, resonance, m->module.srate);
614 break;
615 case sft_hp12:
616 case sft_hp24:
617 cbox_biquadf_set_hp_rbj(&v->filter_coeffs, cutoff, resonance, m->module.srate);
618 break;
619 case sft_bp6:
620 case sft_bp12:
621 cbox_biquadf_set_bp_rbj(&v->filter_coeffs, cutoff, resonance, m->module.srate);
622 break;
623 case sft_lp6:
624 cbox_biquadf_set_1plp(&v->filter_coeffs, cutoff, m->module.srate);
625 break;
626 case sft_hp6:
627 cbox_biquadf_set_1php(&v->filter_coeffs, cutoff, m->module.srate);
628 break;
629 default:
630 assert(0);
634 float left[CBOX_BLOCK_SIZE], right[CBOX_BLOCK_SIZE];
635 float *tmp_outputs[2] = {left, right};
636 uint32_t samples = 0;
637 samples = sampler_voice_sample_playback(v, tmp_outputs);
638 for (int i = samples; i < CBOX_BLOCK_SIZE; i++)
639 left[i] = right[i] = 0.f;
640 if (l->cutoff != -1)
642 cbox_biquadf_process(&v->filter_left, &v->filter_coeffs, left);
643 if (is_4pole(v->layer))
644 cbox_biquadf_process(&v->filter_left2, &v->filter_coeffs, left);
645 cbox_biquadf_process(&v->filter_right, &v->filter_coeffs, right);
646 if (is_4pole(v->layer))
647 cbox_biquadf_process(&v->filter_right2, &v->filter_coeffs, right);
649 mix_block_into_with_gain(outputs, v->output_pair_no * 2, left, right, 1.0);
650 if ((v->send1bus > 0 && v->send1gain != 0) || (v->send2bus > 0 && v->send2gain != 0))
652 if (v->send1bus > 0 && v->send1gain != 0)
654 int oofs = m->module.aux_offset + (v->send1bus - 1) * 2;
655 mix_block_into_with_gain(outputs, oofs, left, right, v->send1gain);
657 if (v->send2bus > 0 && v->send2gain != 0)
659 int oofs = m->module.aux_offset + (v->send2bus - 1) * 2;
660 mix_block_into_with_gain(outputs, oofs, left, right, v->send2gain);
664 v->last_lgain = v->lgain;
665 v->last_rgain = v->rgain;
668 void sampler_process_block(struct cbox_module *module, cbox_sample_t **inputs, cbox_sample_t **outputs)
670 struct sampler_module *m = (struct sampler_module *)module;
672 //float channels[2][CBOX_BLOCK_SIZE];
674 for (int c = 0; c < m->output_pairs + m->aux_pairs; c++)
676 int oo = 2 * c;
677 for (int i = 0; i < CBOX_BLOCK_SIZE; i++)
678 outputs[oo][i] = outputs[oo + 1][i] = 0.f;
681 int vcount = 0, vrel = 0;
682 for (int i = 0; i < MAX_SAMPLER_VOICES; i++)
684 struct sampler_voice *v = &m->voices[i];
686 if (v->mode != spt_inactive)
688 sampler_voice_process(v, m, outputs);
690 if (v->amp_env.cur_stage == 15)
691 vrel++;
692 vcount++;
695 m->active_voices = vcount;
696 if (vcount - vrel > m->max_voices)
697 sampler_steal_voice(m);
698 m->serial_no++;
699 m->current_time += CBOX_BLOCK_SIZE;
702 void sampler_process_cc(struct sampler_module *m, struct sampler_channel *c, int cc, int val)
704 int was_enabled = c->cc[cc] >= 64;
705 int enabled = val >= 64;
706 switch(cc)
708 case 64:
709 if (was_enabled && !enabled)
711 sampler_stop_sustained(m, c);
713 break;
714 case 66:
715 if (was_enabled && !enabled)
716 sampler_stop_sostenuto(m, c);
717 else if (!was_enabled && enabled)
718 sampler_capture_sostenuto(m, c);
719 break;
721 case 120:
722 case 123:
723 sampler_stop_all(m, c);
724 break;
725 case 121:
726 // Recommended Practice (RP-015) Response to Reset All Controllers
727 // http://www.midi.org/techspecs/rp15.php
728 sampler_process_cc(m, c, 64, 0);
729 sampler_process_cc(m, c, 66, 0);
730 c->cc[11] = 127;
731 c->cc[1] = 0;
732 c->pitchbend = 0;
733 c->cc[smsrc_chanaft] = 0;
734 // XXXKF reset polyphonic pressure values when supported
735 return;
737 if (cc < 120)
738 c->cc[cc] = val;
741 void sampler_program_change_byidx(struct sampler_module *m, struct sampler_channel *c, int program_idx)
743 if (c->program)
744 c->program->in_use--;
745 c->program = m->programs[program_idx];
746 c->program->in_use++;
749 void sampler_program_change(struct sampler_module *m, struct sampler_channel *c, int program)
751 // XXXKF replace with something more efficient
752 for (int i = 0; i < m->program_count; i++)
754 // XXXKF support banks
755 if (m->programs[i]->prog_no == program)
757 sampler_program_change_byidx(m, c, i);
758 return;
761 g_warning("Unknown program %d", program);
762 sampler_program_change_byidx(m, c, 0);
765 void sampler_process_event(struct cbox_module *module, const uint8_t *data, uint32_t len)
767 struct sampler_module *m = (struct sampler_module *)module;
768 if (len > 0)
770 int cmd = data[0] >> 4;
771 int chn = data[0] & 15;
772 struct sampler_channel *c = &m->channels[chn];
773 switch(cmd)
775 case 8:
776 sampler_stop_note(m, c, data[1], data[2], FALSE);
777 break;
779 case 9:
780 if (data[2] > 0)
781 sampler_start_note(m, c, data[1], data[2], FALSE);
782 else
783 sampler_stop_note(m, c, data[1], data[2], FALSE);
784 break;
786 case 10:
787 // handle chokeable one shot layers
788 if (data[2] == 127)
789 sampler_stop_note(m, c, data[1], data[2], TRUE);
790 // polyphonic pressure not handled
791 break;
793 case 11:
794 sampler_process_cc(m, c, data[1], data[2]);
795 break;
797 case 12:
798 sampler_program_change(m, c, data[1]);
799 break;
801 case 13:
802 c->cc[smsrc_chanaft] = data[1];
803 break;
805 case 14:
806 c->pitchbend = (data[1] + 128 * data[2] - 8192) * c->pbrange / 8192;
807 break;
813 static void init_channel(struct sampler_module *m, struct sampler_channel *c)
815 c->module = m;
816 c->pitchbend = 0;
817 c->pbrange = 200; // cents
818 memset(c->cc, 0, sizeof(c->cc));
819 c->cc[7] = 100;
820 c->cc[10] = 64;
821 c->cc[11] = 127;
822 c->cc[71] = 64;
823 c->cc[74] = 64;
824 c->previous_note = -1;
825 c->program = m->program_count ? m->programs[0] : NULL;
826 if (c->program)
827 c->program->in_use++;
828 memset(c->switchmask, 0, sizeof(c->switchmask));
829 memset(c->sustainmask, 0, sizeof(c->sustainmask));
830 memset(c->sostenutomask, 0, sizeof(c->sostenutomask));
833 static int get_first_free_program_no(struct sampler_module *m)
835 int prog_no = -1;
836 gboolean found;
838 // XXXKF this has a N-squared complexity - but I'm not seeing
839 // this being used with more than 10 programs at the same time
840 // in the near future
841 do {
842 prog_no++;
843 found = FALSE;
844 for (int i = 0; i < m->program_count; i++)
846 if (m->programs[i]->prog_no == prog_no)
848 found = TRUE;
849 break;
852 } while(found);
854 return prog_no;
857 static int find_program(struct sampler_module *m, int prog_no)
859 for (int i = 0; i < m->program_count; i++)
861 if (m->programs[i]->prog_no == prog_no)
862 return i;
864 return -1;
867 struct release_program_voices_data
869 struct sampler_module *module;
871 struct sampler_program *old_pgm, *new_pgm;
874 static int release_program_voices_execute(void *data)
876 struct release_program_voices_data *rpv = data;
877 struct sampler_module *m = rpv->module;
878 int finished = 1;
880 for (int i = 0; i < 16; i++)
882 if (m->channels[i].program == rpv->old_pgm || m->channels[i].program == NULL)
883 m->channels[i].program = rpv->new_pgm;
885 for (int i = 0; i < MAX_SAMPLER_VOICES; i++)
887 struct sampler_voice *v = &m->voices[i];
889 if (v->mode != spt_inactive)
891 if (v->program == rpv->old_pgm)
893 if (!m->deleting)
894 finished = 0;
895 if (v->amp_env.cur_stage != 15)
897 v->released = 1;
898 cbox_envelope_go_to(&v->amp_env, 15);
904 return finished;
907 static void swap_program(struct sampler_module *m, int index, struct sampler_program *pgm, gboolean delete_old)
909 static struct cbox_rt_cmd_definition release_program_voices = { NULL, release_program_voices_execute, NULL };
911 struct sampler_program *old_program = NULL;
912 if (pgm)
913 old_program = cbox_rt_swap_pointers(m->module.rt, (void **)&m->programs[index], pgm);
914 else
916 void **new_programs = stm_array_clone_remove((void **)m->programs, m->program_count, index);
917 free(cbox_rt_swap_pointers_and_update_count(m->module.rt, (void **)&m->programs, new_programs, &m->program_count, m->program_count - 1));
920 struct release_program_voices_data data = {m, old_program, pgm};
922 cbox_rt_execute_cmd_sync(m->module.rt, &release_program_voices, &data);
924 if (delete_old && old_program)
925 CBOX_DELETE(old_program);
928 static gboolean load_program_at(struct sampler_module *m, const char *cfg_section, const char *name, int prog_no, struct sampler_program **ppgm, GError **error)
930 struct sampler_program *pgm = NULL;
931 int index = find_program(m, prog_no);
932 pgm = sampler_program_new_from_cfg(m, cfg_section, name, prog_no, error);
933 if (!pgm)
934 return FALSE;
936 if (index != -1)
938 swap_program(m, index, pgm, TRUE);
939 return TRUE;
942 struct sampler_program **programs = malloc(sizeof(struct sampler_program *) * (m->program_count + 1));
943 memcpy(programs, m->programs, sizeof(struct sampler_program *) * m->program_count);
944 programs[m->program_count] = pgm;
945 if (ppgm)
946 *ppgm = pgm;
947 free(cbox_rt_swap_pointers_and_update_count(m->module.rt, (void **)&m->programs, programs, &m->program_count, m->program_count + 1));
948 return TRUE;
951 void sampler_unselect_program(struct sampler_module *m, struct sampler_program *prg)
953 // Ensure no new notes are played on that program
954 prg->deleting = TRUE;
955 // Remove from the list of available programs, so that it cannot be selected again
956 for (int i = 0; i < m->program_count; i++)
958 if (m->programs[i] == prg)
959 swap_program(m, i, NULL, FALSE);
963 static gboolean load_from_string(struct sampler_module *m, const char *sample_dir, const char *sfz_data, const char *name, int prog_no, struct sampler_program **ppgm, GError **error)
965 int index = find_program(m, prog_no);
966 struct sampler_program *pgm = sampler_program_new(m, prog_no, name, sample_dir);
967 pgm->source_file = g_strdup("string");
968 if (!sampler_module_load_program_sfz(m, pgm, sfz_data, TRUE, error))
970 free(pgm);
971 return FALSE;
974 if (index != -1)
976 swap_program(m, index, pgm, TRUE);
977 return TRUE;
980 struct sampler_program **programs = calloc((m->program_count + 1), sizeof(struct sampler_program *));
981 memcpy(programs, m->programs, sizeof(struct sampler_program *) * m->program_count);
982 programs[m->program_count] = pgm;
983 if (ppgm)
984 *ppgm = pgm;
985 free(cbox_rt_swap_pointers_and_update_count(m->module.rt, (void **)&m->programs, programs, &m->program_count, m->program_count + 1));
986 return TRUE;
989 gboolean sampler_process_cmd(struct cbox_command_target *ct, struct cbox_command_target *fb, struct cbox_osc_command *cmd, GError **error)
991 struct sampler_module *m = (struct sampler_module *)ct->user_data;
993 if (!strcmp(cmd->command, "/status") && !strcmp(cmd->arg_types, ""))
995 if (!cbox_check_fb_channel(fb, cmd->command, error))
996 return FALSE;
997 for (int i = 0; i < 16; i++)
999 struct sampler_channel *channel = &m->channels[i];
1000 gboolean result;
1001 if (channel->program)
1002 result = cbox_execute_on(fb, NULL, "/patch", "iis", error, i + 1, channel->program->prog_no, channel->program->name);
1003 else
1004 result = cbox_execute_on(fb, NULL, "/patch", "iis", error, i + 1, -1, "");
1005 if (!result)
1006 return FALSE;
1007 if (!(cbox_execute_on(fb, NULL, "/volume", "ii", error, i + 1, addcc(channel, 7)) &&
1008 cbox_execute_on(fb, NULL, "/pan", "ii", error, i + 1, addcc(channel, 10))))
1009 return FALSE;
1012 return cbox_execute_on(fb, NULL, "/active_voices", "i", error, m->active_voices) &&
1013 cbox_execute_on(fb, NULL, "/polyphony", "i", error, MAX_SAMPLER_VOICES) &&
1014 CBOX_OBJECT_DEFAULT_STATUS(&m->module, fb, error);
1016 else
1017 if (!strcmp(cmd->command, "/patches") && !strcmp(cmd->arg_types, ""))
1019 if (!cbox_check_fb_channel(fb, cmd->command, error))
1020 return FALSE;
1021 for (int i = 0; i < m->program_count; i++)
1023 struct sampler_program *prog = m->programs[i];
1024 if (!cbox_execute_on(fb, NULL, "/patch", "isoi", error, prog->prog_no, prog->name, prog, prog->in_use))
1025 return FALSE;
1027 return TRUE;
1029 else if (!strcmp(cmd->command, "/polyphony") && !strcmp(cmd->arg_types, "i"))
1031 int polyphony = CBOX_ARG_I(cmd, 0);
1032 if (polyphony < 1 || polyphony > MAX_SAMPLER_VOICES)
1034 g_set_error(error, CBOX_MODULE_ERROR, CBOX_MODULE_ERROR_FAILED, "Invalid polyphony %d (must be between 1 and %d)", polyphony, (int)MAX_SAMPLER_VOICES);
1035 return FALSE;
1037 m->max_voices = polyphony;
1038 return TRUE;
1040 else if (!strcmp(cmd->command, "/set_patch") && !strcmp(cmd->arg_types, "ii"))
1042 int channel = CBOX_ARG_I(cmd, 0);
1043 if (channel < 1 || channel > 16)
1045 g_set_error(error, CBOX_MODULE_ERROR, CBOX_MODULE_ERROR_FAILED, "Invalid channel %d", channel);
1046 return FALSE;
1048 int value = CBOX_ARG_I(cmd, 1);
1049 struct sampler_program *pgm = NULL;
1050 for (int i = 0; i < m->program_count; i++)
1052 if (m->programs[i]->prog_no == value)
1054 pgm = m->programs[i];
1055 break;
1058 cbox_rt_swap_pointers(m->module.rt, (void **)&m->channels[channel - 1].program, pgm);
1059 return TRUE;
1061 else if (!strcmp(cmd->command, "/load_patch") && !strcmp(cmd->arg_types, "iss"))
1063 struct sampler_program *pgm = NULL;
1064 if (!load_program_at(m, CBOX_ARG_S(cmd, 1), CBOX_ARG_S(cmd, 2), CBOX_ARG_I(cmd, 0), &pgm, error))
1065 return FALSE;
1066 if (fb)
1067 return cbox_execute_on(fb, NULL, "/uuid", "o", error, pgm);
1068 return TRUE;
1070 else if (!strcmp(cmd->command, "/load_patch_from_file") && !strcmp(cmd->arg_types, "iss"))
1072 struct sampler_program *pgm = NULL;
1073 char *cfg_section = g_strdup_printf("spgm:!%s", CBOX_ARG_S(cmd, 1));
1074 gboolean res = load_program_at(m, cfg_section, CBOX_ARG_S(cmd, 2), CBOX_ARG_I(cmd, 0), &pgm, error);
1075 g_free(cfg_section);
1076 if (res && pgm && fb)
1077 return cbox_execute_on(fb, NULL, "/uuid", "o", error, pgm);
1078 return res;
1080 else if (!strcmp(cmd->command, "/load_patch_from_string") && !strcmp(cmd->arg_types, "isss"))
1082 struct sampler_program *pgm = NULL;
1083 if (!load_from_string(m, CBOX_ARG_S(cmd, 1), CBOX_ARG_S(cmd, 2), CBOX_ARG_S(cmd, 3), CBOX_ARG_I(cmd, 0), &pgm, error))
1084 return FALSE;
1085 if (fb)
1086 return cbox_execute_on(fb, NULL, "/uuid", "o", error, pgm);
1087 return TRUE;
1089 else if (!strcmp(cmd->command, "/get_unused_program") && !strcmp(cmd->arg_types, ""))
1091 if (!cbox_check_fb_channel(fb, cmd->command, error))
1092 return FALSE;
1093 return cbox_execute_on(fb, NULL, "/program_no", "i", error, get_first_free_program_no(m));
1095 else
1096 return cbox_object_default_process_cmd(ct, fb, cmd, error);
1097 return TRUE;
1100 gboolean sampler_select_program(struct sampler_module *m, int channel, const gchar *preset, GError **error)
1102 for (int i = 0; i < m->program_count; i++)
1104 if (!strcmp(m->programs[i]->name, preset))
1106 printf("Selecting %s in channel %d\n", preset, channel + 1);
1107 sampler_program_change_byidx(m, &m->channels[channel], i);
1108 return TRUE;
1111 g_set_error(error, CBOX_MODULE_ERROR, CBOX_MODULE_ERROR_FAILED, "Preset not found: %s", preset);
1112 return FALSE;
1115 MODULE_CREATE_FUNCTION(sampler)
1117 int i;
1118 static int inited = 0;
1119 if (!inited)
1121 for (int i = 0; i < 2049; i++)
1122 sine_wave[i] = sin(i * M_PI / 1024.0);
1123 inited = 1;
1126 int max_voices = cbox_config_get_int(cfg_section, "polyphony", MAX_SAMPLER_VOICES);
1127 if (max_voices < 1 || max_voices > MAX_SAMPLER_VOICES)
1129 g_set_error(error, CBOX_SAMPLER_ERROR, CBOX_SAMPLER_ERROR_INVALID_LAYER, "%s: invalid polyphony value", cfg_section);
1130 return NULL;
1132 int output_pairs = cbox_config_get_int(cfg_section, "output_pairs", 1);
1133 if (output_pairs < 1 || output_pairs > 16)
1135 g_set_error(error, CBOX_SAMPLER_ERROR, CBOX_SAMPLER_ERROR_INVALID_LAYER, "%s: invalid output pairs value", cfg_section);
1136 return NULL;
1138 int aux_pairs = cbox_config_get_int(cfg_section, "aux_pairs", 0);
1139 if (aux_pairs < 0 || aux_pairs > 4)
1141 g_set_error(error, CBOX_SAMPLER_ERROR, CBOX_SAMPLER_ERROR_INVALID_LAYER, "%s: invalid aux pairs value", cfg_section);
1142 return NULL;
1145 struct sampler_module *m = calloc(1, sizeof(struct sampler_module));
1146 CALL_MODULE_INIT(m, 0, (output_pairs + aux_pairs) * 2, sampler);
1147 m->output_pairs = output_pairs;
1148 m->aux_pairs = aux_pairs;
1149 m->module.aux_offset = m->output_pairs * 2;
1150 m->module.process_event = sampler_process_event;
1151 m->module.process_block = sampler_process_block;
1152 m->programs = NULL;
1153 m->max_voices = max_voices;
1154 m->serial_no = 0;
1155 m->deleting = FALSE;
1157 for (i = 0; ; i++)
1159 gchar *s = g_strdup_printf("program%d", i);
1160 char *p = cbox_config_get_string(cfg_section, s);
1161 g_free(s);
1163 if (!p)
1165 m->program_count = i;
1166 break;
1169 m->programs = calloc(m->program_count, sizeof(struct sampler_program *));
1170 int success = 1;
1171 for (i = 0; i < m->program_count; i++)
1173 gchar *s = g_strdup_printf("program%d", i);
1174 char *pgm_section = NULL;
1175 int pgm_id = -1;
1176 const char *pgm_name = cbox_config_get_string(cfg_section, s);
1177 g_free(s);
1178 char *at = strchr(pgm_name, '@');
1179 if (at)
1181 pgm_id = atoi(at + 1);
1182 s = g_strndup(pgm_name, at - pgm_name);
1183 pgm_section = g_strdup_printf("spgm:%s", s);
1184 g_free(s);
1186 else
1188 pgm_id = i;
1189 pgm_section = g_strdup_printf("spgm:%s", pgm_name);
1192 m->programs[i] = sampler_program_new_from_cfg(m, pgm_section, pgm_section + 5, pgm_id, error);
1193 g_free(pgm_section);
1194 if (!m->programs[i])
1196 success = 0;
1197 break;
1200 if (!success)
1202 // XXXKF free programs/layers, first ensuring that they're fully initialised
1203 free(m);
1204 return NULL;
1206 memset(m->voices, 0, sizeof(m->voices));
1207 for (i = 0; i < MAX_SAMPLER_VOICES; i++)
1208 m->voices[i].mode = spt_inactive;
1209 m->active_voices = 0;
1211 for (i = 0; i < 16; i++)
1212 init_channel(m, &m->channels[i]);
1214 for (i = 0; i < 16; i++)
1216 gchar *key = g_strdup_printf("channel%d", i + 1);
1217 gchar *preset = cbox_config_get_string(cfg_section, key);
1218 if (preset)
1220 if (!sampler_select_program(m, i, preset, error))
1222 CBOX_DELETE(&m->module);
1223 return NULL;
1226 g_free(key);
1230 return &m->module;
1233 void sampler_destroyfunc(struct cbox_module *module)
1235 struct sampler_module *m = (struct sampler_module *)module;
1236 m->deleting = TRUE;
1238 for (int i = 0; i < m->program_count;)
1240 if (m->programs[i])
1241 CBOX_DELETE(m->programs[i]);
1242 else
1243 i++;
1245 free(m->programs);
1248 #define MAKE_TO_STRING_CONTENT(name, v) \
1249 case v: return name;
1251 #define MAKE_FROM_STRING_CONTENT(n, v) \
1252 if (!strcmp(name, n)) { *value = v; return TRUE; }
1254 #define MAKE_FROM_TO_STRING(enumtype) \
1255 const char *enumtype##_to_string(enum enumtype value) \
1257 switch(value) { \
1258 ENUM_VALUES_##enumtype(MAKE_TO_STRING_CONTENT) \
1259 default: return NULL; \
1263 gboolean enumtype##_from_string(const char *name, enum enumtype *value) \
1265 ENUM_VALUES_##enumtype(MAKE_FROM_STRING_CONTENT) \
1266 return FALSE; \
1269 ENUM_LIST(MAKE_FROM_TO_STRING)
1271 //////////////////////////////////////////////////////////////////////////
1273 struct sampler_update_layer_cmd
1275 struct sampler_module *module;
1276 struct sampler_layer *layer;
1277 struct sampler_layer_data *new_data;
1278 struct sampler_layer_data *old_data;
1281 static int sampler_update_layer_cmd_prepare(void *data)
1283 struct sampler_update_layer_cmd *cmd = data;
1284 cmd->old_data = cmd->layer->runtime;
1285 cmd->new_data = calloc(1, sizeof(struct sampler_layer_data));
1287 sampler_layer_data_clone(cmd->new_data, &cmd->layer->data, TRUE);
1288 sampler_layer_data_finalize(cmd->new_data, cmd->layer->parent_group ? &cmd->layer->parent_group->data : NULL, cmd->module);
1289 if (cmd->layer->runtime == NULL)
1291 // initial update of the layer, so none of the voices need updating yet
1292 // because the layer hasn't been allocated to any voice
1293 cmd->layer->runtime = cmd->new_data;
1294 return 1;
1296 return 0;
1299 static int sampler_update_layer_cmd_execute(void *data)
1301 struct sampler_update_layer_cmd *cmd = data;
1303 for (int i = 0; i < MAX_SAMPLER_VOICES; i++)
1305 if (cmd->module->voices[i].layer == cmd->old_data)
1306 cmd->module->voices[i].layer = cmd->new_data;
1308 cmd->layer->runtime = cmd->new_data;
1309 return 10;
1312 static void sampler_update_layer_cmd_cleanup(void *data)
1314 struct sampler_update_layer_cmd *cmd = data;
1316 sampler_layer_data_destroy(cmd->old_data);
1319 void sampler_update_layer(struct sampler_module *m, struct sampler_layer *l)
1321 // if changing a group, update all child regions instead
1322 if (g_hash_table_size(l->child_layers))
1324 GHashTableIter iter;
1325 g_hash_table_iter_init(&iter, l->child_layers);
1326 gpointer key, value;
1327 while(g_hash_table_iter_next(&iter, &key, &value))
1329 sampler_layer_data_finalize(&((struct sampler_layer *)key)->data, &l->data, m);
1330 sampler_update_layer(m, (struct sampler_layer *)key);
1332 return;
1334 static struct cbox_rt_cmd_definition rtcmd = {
1335 .prepare = sampler_update_layer_cmd_prepare,
1336 .execute = sampler_update_layer_cmd_execute,
1337 .cleanup = sampler_update_layer_cmd_cleanup,
1340 struct sampler_update_layer_cmd lcmd;
1341 lcmd.module = m;
1342 lcmd.layer = l;
1343 lcmd.new_data = NULL;
1344 lcmd.old_data = NULL;
1346 // In order to be able to use the async call, it would be necessary to
1347 // identify old data by layer pointer, not layer data pointer. For now,
1348 // it might be good enough to just use sync calls for this.
1349 cbox_rt_execute_cmd_sync(m->module.rt, &rtcmd, &lcmd);
1352 void sampler_update_program_layers(struct sampler_module *m, struct sampler_program *prg)
1354 struct sampler_rll *new_rll = sampler_rll_new_from_program(prg);
1355 struct sampler_rll *old_rll = cbox_rt_swap_pointers(m->module.rt, (void **)&prg->rll, new_rll);
1356 if (old_rll)
1357 sampler_rll_destroy(old_rll);
1360 //////////////////////////////////////////////////////////////////////////
1361 // Note initialisation functions
1363 void sampler_nif_vel2pitch(struct sampler_noteinitfunc *nif, struct sampler_voice *v)
1365 v->pitch_shift += nif->param * v->vel * (1.0 / 127.0);
1368 void sampler_nif_cc2delay(struct sampler_noteinitfunc *nif, struct sampler_voice *v)
1370 v->delay += nif->param * v->channel->cc[nif->variant] * (1.0 / 127.0) * v->channel->module->module.srate;
1373 void sampler_nif_addrandom(struct sampler_noteinitfunc *nif, struct sampler_voice *v)
1375 float rnd = rand() * 1.0 / RAND_MAX;
1376 switch(nif->variant)
1378 case 0:
1379 v->gain_shift += rnd * nif->param;
1380 break;
1381 case 1:
1382 v->cutoff_shift += rnd * nif->param;
1383 break;
1384 case 2:
1385 v->pitch_shift += rnd * nif->param; // this is in cents
1386 break;
1390 void sampler_nif_vel2env(struct sampler_noteinitfunc *nif, struct sampler_voice *v)
1392 int env_type = (nif->variant) >> 4;
1393 struct cbox_envelope *env = NULL;
1394 switch(env_type)
1396 case 0:
1397 env = &v->amp_env;
1398 break;
1399 case 1:
1400 env = &v->filter_env;
1401 break;
1402 case 2:
1403 env = &v->pitch_env;
1404 break;
1405 default:
1406 assert(0);
1408 if (env->shape != &v->dyn_envs[env_type])
1410 memcpy(&v->dyn_envs[env_type], env->shape, sizeof(struct cbox_envelope_shape));
1411 env->shape = &v->dyn_envs[env_type];
1413 float param = nif->param * v->vel * (1.0 / 127.0);
1414 if ((nif->variant & 15) == 4)
1415 param *= 0.01;
1416 cbox_envelope_modify_dahdsr(env->shape, nif->variant & 15, param, v->channel->module->module.srate * (1.0 / CBOX_BLOCK_SIZE));
1419 //////////////////////////////////////////////////////////////////////////
1421 struct cbox_module_livecontroller_metadata sampler_controllers[] = {
1424 struct cbox_module_keyrange_metadata sampler_keyranges[] = {
1427 DEFINE_MODULE(sampler, 0, 2)