Do not create default MIDI port if enable_common_midi_input is set in [io] section.
[calfbox.git] / sampler.c
blob0b42fbd29fdb89f53edf514aab80aa35b80c01d4
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);
50 static void sampler_voice_activate(struct sampler_voice *v, enum sampler_player_type mode);
52 static void lfo_init(struct sampler_lfo *lfo, struct sampler_lfo_params *lfop, int srate, double srate_inv)
54 lfo->phase = 0;
55 lfo->age = 0;
56 lfo->delta = (uint32_t)(lfop->freq * 65536.0 * 65536.0 * CBOX_BLOCK_SIZE * srate_inv);
57 lfo->delay = (uint32_t)(lfop->delay * srate);
58 lfo->fade = (uint32_t)(lfop->fade * srate);
62 static void sampler_voice_release(struct sampler_voice *v, gboolean is_polyaft);
64 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)
66 sampler_gen_reset(&v->gen);
67 v->age = 0;
68 if (l->trigger == stm_release)
70 // time since last 'note on' for that note
71 v->age = m->current_time - c->prev_note_start_time[note];
72 double age = v->age * m->module.srate_inv;
73 // if attenuation is more than 84dB, ignore the release trigger
74 if (age * l->rt_decay > 84)
75 return;
77 uint32_t end = l->waveform->info.frames;
78 if (l->end != 0)
79 end = (l->end == -1) ? 0 : l->end;
80 v->last_waveform = l->waveform;
81 v->gen.cur_sample_end = end;
82 if (end > l->waveform->info.frames)
83 end = l->waveform->info.frames;
85 v->output_pair_no = l->output % m->output_pairs;
86 v->serial_no = m->serial_no;
88 uint32_t pos = l->offset;
89 pos = l->offset;
90 if (l->offset_random)
91 pos += ((uint32_t)(rand() + (rand() << 16))) % l->offset_random;
92 if (pos >= end)
93 pos = end;
94 v->gen.pos = pos;
96 float delay = l->delay;
97 if (l->delay_random)
98 delay += rand() * (1.0 / RAND_MAX) * l->delay_random;
99 if (delay > 0)
100 v->delay = (int)(delay * m->module.srate);
101 else
102 v->delay = 0;
103 v->gen.loop_overlap = l->loop_overlap;
104 v->gen.loop_overlap_step = 1.0 / l->loop_overlap;
105 v->gain_fromvel = 1.0 + (l->eff_velcurve[vel] - 1.0) * l->amp_veltrack * 0.01;
106 v->gain_shift = 0.0;
107 v->note = note;
108 v->vel = vel;
109 v->pitch_shift = 0;
110 v->released = 0;
111 v->released_with_sustain = 0;
112 v->released_with_sostenuto = 0;
113 v->captured_sostenuto = 0;
114 v->channel = c;
115 v->layer = l;
116 v->play_count = 0;
117 v->program = c->program;
118 v->amp_env.shape = &l->amp_env_shape;
119 v->filter_env.shape = &l->filter_env_shape;
120 v->pitch_env.shape = &l->pitch_env_shape;
122 v->cutoff_shift = vel * l->fil_veltrack / 127.0 + (note - l->fil_keycenter) * l->fil_keytrack;
123 v->loop_mode = l->loop_mode;
124 v->off_by = l->off_by;
125 int auxes = (m->module.outputs - m->module.aux_offset) / 2;
126 if (l->effect1bus >= 1 && l->effect1bus < 1 + auxes)
127 v->send1bus = l->effect1bus;
128 else
129 v->send1bus = 0;
130 if (l->effect2bus >= 1 && l->effect2bus < 1 + auxes)
131 v->send2bus = l->effect2bus;
132 else
133 v->send2bus = 0;
134 v->send1gain = l->effect1 * 0.01;
135 v->send2gain = l->effect2 * 0.01;
136 if (l->group >= 1 && *pexgroupcount < MAX_RELEASED_GROUPS)
138 gboolean found = FALSE;
139 for (int j = 0; j < *pexgroupcount; j++)
141 if (exgroups[j] == l->group)
143 found = TRUE;
144 break;
147 if (!found)
149 exgroups[(*pexgroupcount)++] = l->group;
152 lfo_init(&v->amp_lfo, &l->amp_lfo, m->module.srate, m->module.srate_inv);
153 lfo_init(&v->filter_lfo, &l->filter_lfo, m->module.srate, m->module.srate_inv);
154 lfo_init(&v->pitch_lfo, &l->pitch_lfo, m->module.srate, m->module.srate_inv);
156 cbox_biquadf_reset(&v->filter_left);
157 cbox_biquadf_reset(&v->filter_right);
158 cbox_biquadf_reset(&v->filter_left2);
159 cbox_biquadf_reset(&v->filter_right2);
161 GSList *nif = v->layer->nifs;
162 while(nif)
164 struct sampler_noteinitfunc *p = nif->data;
165 p->notefunc(p, v);
166 nif = nif->next;
169 cbox_envelope_reset(&v->amp_env);
170 cbox_envelope_reset(&v->filter_env);
171 cbox_envelope_reset(&v->pitch_env);
173 sampler_voice_activate(v, l->waveform->info.channels == 2 ? spt_stereo16 : spt_mono16);
176 #define FOREACH_VOICE(var, p) \
177 for (struct sampler_voice *p = (var), *p##_next = NULL; p && (p##_next = p->next, TRUE); p = p##_next)
179 static void sampler_release_groups(struct sampler_module *m, struct sampler_channel *c, int note, int exgroups[MAX_RELEASED_GROUPS], int exgroupcount)
181 if (exgroupcount)
183 FOREACH_VOICE(c->voices_running, v)
185 for (int j = 0; j < exgroupcount; j++)
187 if (v->off_by == exgroups[j] && v->note != note)
189 if (v->layer->off_mode == som_fast)
191 v->released = 1;
192 cbox_envelope_go_to(&v->amp_env, 15);
194 else
196 v->released = 1;
198 break;
205 void sampler_start_note(struct sampler_module *m, struct sampler_channel *c, int note, int vel, gboolean is_release_trigger)
207 float random = rand() * 1.0 / (RAND_MAX + 1.0);
208 if (!is_release_trigger)
210 c->switchmask[note >> 5] |= 1 << (note & 31);
211 c->prev_note_velocity[note] = vel;
212 c->prev_note_start_time[note] = m->current_time;
214 struct sampler_program *prg = c->program;
215 if (!prg || !prg->rll || prg->deleting)
216 return;
217 GSList *next_layer = sampler_program_get_next_layer(prg, c, !is_release_trigger ? prg->rll->layers : prg->rll->layers_release, note, vel, random);
218 if (!next_layer)
220 if (!is_release_trigger)
221 c->previous_note = note;
222 return;
225 // this might perhaps be optimized by mapping the group identifiers to flat-array indexes
226 // but I'm not going to do that until someone gives me an SFZ worth doing that work ;)
227 int exgroups[MAX_RELEASED_GROUPS], exgroupcount = 0;
229 FOREACH_VOICE(m->voices_free, v)
231 struct sampler_layer *l = next_layer->data;
232 // Maybe someone forgot to call sampler_update_layer?
233 assert(l->runtime);
234 sampler_start_voice(m, c, v, l->runtime, note, vel, exgroups, &exgroupcount);
235 next_layer = sampler_program_get_next_layer(prg, c, g_slist_next(next_layer), note, vel, random);
236 if (!next_layer)
237 break;
239 if (!is_release_trigger)
240 c->previous_note = note;
241 sampler_release_groups(m, c, note, exgroups, exgroupcount);
244 void sampler_channel_start_release_triggered_voices(struct sampler_channel *c, int note)
246 if (c->program && c->program->rll && c->program->rll->layers_release)
248 if (c->prev_note_velocity[note])
250 sampler_start_note(c->module, c, note, c->prev_note_velocity[note], TRUE);
251 c->prev_note_velocity[note] = 0;
256 void sampler_voice_link(struct sampler_voice **pv, struct sampler_voice *v)
258 v->prev = NULL;
259 v->next = *pv;
260 if (*pv)
261 (*pv)->prev = v;
262 *pv = v;
265 void sampler_voice_unlink(struct sampler_voice **pv, struct sampler_voice *v)
267 if (*pv == v)
268 *pv = v->next;
269 if (v->prev)
270 v->prev->next = v->next;
271 if (v->next)
272 v->next->prev = v->prev;
273 v->prev = NULL;
274 v->next = NULL;
277 void sampler_voice_inactivate(struct sampler_voice *v, gboolean expect_active)
279 assert((v->gen.mode != spt_inactive) == expect_active);
280 sampler_voice_unlink(&v->channel->voices_running, v);
281 v->gen.mode = spt_inactive;
282 v->channel = NULL;
283 sampler_voice_link(&v->program->module->voices_free, v);
286 void sampler_voice_activate(struct sampler_voice *v, enum sampler_player_type mode)
288 assert(v->gen.mode == spt_inactive);
289 sampler_voice_unlink(&v->program->module->voices_free, v);
290 assert(mode != spt_inactive);
291 assert(v->channel);
292 v->gen.mode = mode;
293 sampler_voice_link(&v->channel->voices_running, v);
296 void sampler_voice_release(struct sampler_voice *v, gboolean is_polyaft)
298 if ((v->loop_mode == slm_one_shot_chokeable) != is_polyaft)
299 return;
300 if (v->delay >= v->age + CBOX_BLOCK_SIZE)
302 v->released = 1;
303 sampler_voice_inactivate(v, TRUE);
305 else
307 if (v->loop_mode != slm_one_shot && !v->layer->count)
308 v->released = 1;
312 void sampler_stop_note(struct sampler_module *m, struct sampler_channel *c, int note, int vel, gboolean is_polyaft)
314 c->switchmask[note >> 5] &= ~(1 << (note & 31));
315 FOREACH_VOICE(c->voices_running, v)
317 if (v->note == note && v->layer->trigger != stm_release)
319 if (v->captured_sostenuto)
320 v->released_with_sostenuto = 1;
321 else if (c->cc[64] >= 64)
322 v->released_with_sustain = 1;
323 else
324 sampler_voice_release(v, is_polyaft);
328 if (c->cc[64] < 64)
329 sampler_channel_start_release_triggered_voices(c, note);
330 else
331 c->sustainmask[note >> 5] |= (1 << (note & 31));
334 void sampler_stop_sustained(struct sampler_module *m, struct sampler_channel *c)
336 FOREACH_VOICE(c->voices_running, v)
338 if (v->channel == c && v->released_with_sustain && v->layer->trigger != stm_release)
340 sampler_voice_release(v, FALSE);
341 v->released_with_sustain = 0;
344 // Start release layers for the newly released keys
345 if (c->program && c->program->rll && c->program->rll->layers_release)
347 for (int i = 0; i < 128; i++)
349 if (c->sustainmask[i >> 5] & (1 << (i & 31)))
350 sampler_channel_start_release_triggered_voices(c, i);
353 memset(c->sustainmask, 0, sizeof(c->sustainmask));
356 void sampler_stop_sostenuto(struct sampler_module *m, struct sampler_channel *c)
358 FOREACH_VOICE(c->voices_running, v)
360 if (v->released_with_sostenuto && v->layer->trigger != stm_release)
362 sampler_channel_start_release_triggered_voices(c, v->note);
363 sampler_voice_release(v, FALSE);
364 v->released_with_sostenuto = 0;
365 // XXXKF unsure what to do with sustain
368 // Start release layers for the newly released keys
369 if (c->program && c->program->rll && c->program->rll->layers_release)
371 for (int i = 0; i < 128; i++)
373 if (c->sostenutomask[i >> 5] & (1 << (i & 31)))
374 sampler_channel_start_release_triggered_voices(c, i);
377 memset(c->sostenutomask, 0, sizeof(c->sostenutomask));
380 void sampler_capture_sostenuto(struct sampler_module *m, struct sampler_channel *c)
382 FOREACH_VOICE(c->voices_running, v)
384 if (!v->released && v->loop_mode != slm_one_shot && v->loop_mode != slm_one_shot_chokeable && !v->layer->count)
386 // XXXKF unsure what to do with sustain
387 v->captured_sostenuto = 1;
388 c->sostenutomask[v->note >> 5] |= (1 << (v->note & 31));
393 void sampler_stop_all(struct sampler_module *m, struct sampler_channel *c)
395 FOREACH_VOICE(c->voices_running, v)
397 sampler_voice_release(v, v->loop_mode == slm_one_shot_chokeable);
398 v->released_with_sustain = 0;
399 v->released_with_sostenuto = 0;
400 v->captured_sostenuto = 0;
404 void sampler_steal_voice(struct sampler_module *m)
406 int max_age = 0;
407 struct sampler_voice *voice_found = NULL;
408 for (int i = 0; i < 16; i++)
410 FOREACH_VOICE(m->channels[i].voices_running, v)
412 if (v->amp_env.cur_stage == 15)
413 continue;
414 int age = m->serial_no - v->serial_no;
415 if (v->gen.loop_start == -1)
416 age += (int)(v->gen.pos * 100.0 / v->gen.cur_sample_end);
417 else
418 if (v->released)
419 age += 10;
420 if (age > max_age)
422 max_age = age;
423 voice_found = v;
427 if (voice_found)
429 voice_found->released = 1;
430 cbox_envelope_go_to(&voice_found->amp_env, 15);
434 static inline void mix_block_into_with_gain(cbox_sample_t **outputs, int oofs, float *src_left, float *src_right, float gain)
436 cbox_sample_t *dst_left = outputs[oofs];
437 cbox_sample_t *dst_right = outputs[oofs + 1];
438 for (size_t i = 0; i < CBOX_BLOCK_SIZE; i++)
440 dst_left[i] += gain * src_left[i];
441 dst_right[i] += gain * src_right[i];
445 static inline float lfo_run(struct sampler_lfo *lfo)
447 if (lfo->age < lfo->delay)
449 lfo->age += CBOX_BLOCK_SIZE;
450 return 0.f;
453 const int FRAC_BITS = 32 - 11;
454 lfo->phase += lfo->delta;
455 uint32_t iphase = lfo->phase >> FRAC_BITS;
456 float frac = (lfo->phase & ((1 << FRAC_BITS) - 1)) * (1.0 / (1 << FRAC_BITS));
458 float v = sine_wave[iphase] + (sine_wave[iphase + 1] - sine_wave[iphase]) * frac;
459 if (lfo->fade && lfo->age < lfo->delay + lfo->fade)
461 v *= (lfo->age - lfo->delay) * 1.0 / lfo->fade;
462 lfo->age += CBOX_BLOCK_SIZE;
465 return v;
468 static inline float clip01(float v)
470 if (v < 0.f)
471 return 0;
472 if (v > 1.f)
473 return 1;
474 return v;
477 static gboolean is_4pole(struct sampler_layer_data *v)
479 if (v->cutoff == -1)
480 return FALSE;
481 return v->fil_type == sft_lp24 || v->fil_type == sft_hp24 || v->fil_type == sft_bp12;
484 static gboolean is_tail_finished(struct sampler_voice *v)
486 if (v->layer->cutoff == -1)
487 return TRUE;
488 double eps = 1.0 / 65536.0;
489 if (cbox_biquadf_is_audible(&v->filter_left, eps))
490 return FALSE;
491 if (cbox_biquadf_is_audible(&v->filter_right, eps))
492 return FALSE;
493 if (is_4pole(v->layer))
495 if (cbox_biquadf_is_audible(&v->filter_left2, eps))
496 return FALSE;
497 if (cbox_biquadf_is_audible(&v->filter_right2, eps))
498 return FALSE;
501 return TRUE;
504 static inline int addcc(struct sampler_channel *c, int cc_no)
506 return (((int)c->cc[cc_no]) << 7) + c->cc[cc_no + 32];
509 void sampler_voice_process(struct sampler_voice *v, struct sampler_module *m, cbox_sample_t **outputs)
511 struct sampler_layer_data *l = v->layer;
512 assert(v->gen.mode != spt_inactive);
514 // if it's a DAHD envelope without sustain, consider the note finished
515 if (v->amp_env.cur_stage == 4 && v->amp_env.shape->stages[3].end_value == 0)
516 cbox_envelope_go_to(&v->amp_env, 15);
518 struct sampler_channel *c = v->channel;
519 v->age += CBOX_BLOCK_SIZE;
521 if (v->age < v->delay)
522 return;
524 if (v->last_waveform != v->layer->waveform)
526 v->last_waveform = v->layer->waveform;
527 if (v->layer->waveform)
529 v->gen.mode = v->layer->waveform->info.channels == 2 ? spt_stereo16 : spt_mono16;
530 v->gen.cur_sample_end = v->layer->waveform->info.frames;
532 else
534 sampler_voice_inactivate(v, TRUE);
535 return;
538 // XXXKF I'm sacrificing sample accuracy for delays for now
539 v->delay = 0;
541 float pitch = (v->note - l->pitch_keycenter) * l->pitch_keytrack + l->tune + l->transpose * 100 + v->pitch_shift;
542 float modsrcs[smsrc_pernote_count];
543 modsrcs[smsrc_vel - smsrc_pernote_offset] = v->vel * (1.0 / 127.0);
544 modsrcs[smsrc_pitch - smsrc_pernote_offset] = pitch * (1.0 / 100.0);
545 modsrcs[smsrc_polyaft - smsrc_pernote_offset] = 0; // XXXKF not supported yet
546 modsrcs[smsrc_pitchenv - smsrc_pernote_offset] = cbox_envelope_get_next(&v->pitch_env, v->released) * 0.01f;
547 modsrcs[smsrc_filenv - smsrc_pernote_offset] = cbox_envelope_get_next(&v->filter_env, v->released) * 0.01f;
548 modsrcs[smsrc_ampenv - smsrc_pernote_offset] = cbox_envelope_get_next(&v->amp_env, v->released) * 0.01f;
550 modsrcs[smsrc_amplfo - smsrc_pernote_offset] = lfo_run(&v->amp_lfo);
551 modsrcs[smsrc_fillfo - smsrc_pernote_offset] = lfo_run(&v->filter_lfo);
552 modsrcs[smsrc_pitchlfo - smsrc_pernote_offset] = lfo_run(&v->pitch_lfo);
554 if (v->amp_env.cur_stage < 0)
556 if (is_tail_finished(v))
558 sampler_voice_inactivate(v, TRUE);
559 return;
563 float moddests[smdestcount];
564 moddests[smdest_gain] = 0;
565 moddests[smdest_pitch] = pitch;
566 moddests[smdest_cutoff] = v->cutoff_shift;
567 moddests[smdest_resonance] = 0;
568 GSList *mod = l->modulations;
569 if (l->trigger == stm_release)
570 moddests[smdest_gain] -= v->age * l->rt_decay * m->module.srate_inv;
572 if (c->pitchwheel)
573 moddests[smdest_pitch] += c->pitchwheel * (c->pitchwheel > 0 ? l->bend_up : l->bend_down) >> 13;
575 static const int modoffset[4] = {0, -1, -1, 1 };
576 static const int modscale[4] = {1, 1, 2, -2 };
577 while(mod)
579 struct sampler_modulation *sm = mod->data;
580 float value = 0.f, value2 = 1.f;
581 if (sm->src < smsrc_pernote_offset)
582 value = c->cc[sm->src] / 127.0;
583 else
584 value = modsrcs[sm->src - smsrc_pernote_offset];
585 value = modoffset[sm->flags & 3] + value * modscale[sm->flags & 3];
587 if (sm->src2 != smsrc_none)
589 if (sm->src2 < smsrc_pernote_offset)
590 value2 = c->cc[sm->src2] / 127.0;
591 else
592 value2 = modsrcs[sm->src2 - smsrc_pernote_offset];
594 value2 = modoffset[(sm->flags & 12) >> 2] + value2 * modscale[(sm->flags & 12) >> 2];
595 value *= value2;
597 moddests[sm->dest] += value * sm->amount;
599 mod = g_slist_next(mod);
602 double maxv = 127 << 7;
603 double freq = l->eff_freq * cent2factor(moddests[smdest_pitch]) ;
604 uint64_t freq64 = (uint64_t)(freq * 65536.0 * 65536.0 * m->module.srate_inv);
605 v->gen.sample_data = v->last_waveform->data;
606 if (v->last_waveform->levels)
608 // XXXKF: optimise later by caching last lookup value
609 // XXXKF: optimise later by using binary search
610 for (int i = 0; i < v->last_waveform->level_count; i++)
612 if (freq64 <= v->last_waveform->levels[i].max_rate)
614 v->gen.sample_data = v->last_waveform->levels[i].data;
615 break;
619 gboolean post_sustain = v->released && v->loop_mode == slm_loop_sustain;
620 if (v->layer->count > 0)
622 // End the loop on the last time
623 gboolean play_loop = (v->play_count < v->layer->count - 1);
624 v->gen.loop_start = play_loop ? 0 : (uint32_t)-1;
625 v->gen.loop_end = v->gen.cur_sample_end;
627 else
629 gboolean play_loop = v->layer->loop_end && (v->loop_mode == slm_loop_continuous || (v->loop_mode == slm_loop_sustain && !post_sustain)) && v->layer->on_cc_number == -1;
630 v->gen.loop_start = play_loop ? v->layer->loop_start : (uint32_t)-1;
631 v->gen.loop_end = play_loop ? v->layer->loop_end : v->gen.cur_sample_end;
634 v->gen.delta = freq64 >> 32;
635 v->gen.frac_delta = freq64 & 0xFFFFFFFF;
636 float gain = modsrcs[smsrc_ampenv - smsrc_pernote_offset] * l->volume_linearized * v->gain_fromvel * addcc(c, 7) * addcc(c, 11) / (maxv * maxv);
637 if (moddests[smdest_gain] != 0.0)
638 gain *= dB2gain(moddests[smdest_gain]);
639 // http://drealm.info/sfz/plj-sfz.xhtml#amp "The overall gain must remain in the range -144 to 6 decibels."
640 if (gain > 2)
641 gain = 2;
642 float pan = (l->pan + 100) * (1.0 / 200.0) + (addcc(c, 10) * 1.0 / maxv - 0.5) * 2;
643 if (pan < 0)
644 pan = 0;
645 if (pan > 1)
646 pan = 1;
647 v->gen.lgain = gain * (1 - pan) / 32768.0;
648 v->gen.rgain = gain * pan / 32768.0;
649 if (l->cutoff != -1)
651 float cutoff = l->cutoff * cent2factor(moddests[smdest_cutoff]);
652 if (cutoff < 20)
653 cutoff = 20;
654 if (cutoff > m->module.srate * 0.45)
655 cutoff = m->module.srate * 0.45;
656 //float resonance = v->resonance*pow(32.0,c->cc[71]/maxv);
657 float resonance = l->resonance_linearized * dB2gain(moddests[smdest_resonance]);
658 if (resonance < 0.7)
659 resonance = 0.7;
660 if (resonance > 32)
661 resonance = 32;
662 // XXXKF this is found experimentally and probably far off from correct formula
663 if (is_4pole(v->layer))
664 resonance = sqrt(resonance / 0.707) * 0.5;
665 switch(l->fil_type)
667 case sft_lp12:
668 case sft_lp24:
669 cbox_biquadf_set_lp_rbj(&v->filter_coeffs, cutoff, resonance, m->module.srate);
670 break;
671 case sft_hp12:
672 case sft_hp24:
673 cbox_biquadf_set_hp_rbj(&v->filter_coeffs, cutoff, resonance, m->module.srate);
674 break;
675 case sft_bp6:
676 case sft_bp12:
677 cbox_biquadf_set_bp_rbj(&v->filter_coeffs, cutoff, resonance, m->module.srate);
678 break;
679 case sft_lp6:
680 cbox_biquadf_set_1plp(&v->filter_coeffs, cutoff, m->module.srate);
681 break;
682 case sft_hp6:
683 cbox_biquadf_set_1php(&v->filter_coeffs, cutoff, m->module.srate);
684 break;
685 default:
686 assert(0);
690 float left[CBOX_BLOCK_SIZE], right[CBOX_BLOCK_SIZE];
691 float *tmp_outputs[2] = {left, right};
692 uint32_t samples = 0;
693 uint32_t pos = v->gen.pos;
694 samples = sampler_gen_sample_playback(&v->gen, tmp_outputs);
695 if (v->layer->count && v->gen.pos < pos)
696 v->play_count++;
698 for (int i = samples; i < CBOX_BLOCK_SIZE; i++)
699 left[i] = right[i] = 0.f;
700 if (l->cutoff != -1)
702 cbox_biquadf_process(&v->filter_left, &v->filter_coeffs, left);
703 if (is_4pole(v->layer))
704 cbox_biquadf_process(&v->filter_left2, &v->filter_coeffs, left);
705 cbox_biquadf_process(&v->filter_right, &v->filter_coeffs, right);
706 if (is_4pole(v->layer))
707 cbox_biquadf_process(&v->filter_right2, &v->filter_coeffs, right);
709 mix_block_into_with_gain(outputs, v->output_pair_no * 2, left, right, 1.0);
710 if ((v->send1bus > 0 && v->send1gain != 0) || (v->send2bus > 0 && v->send2gain != 0))
712 if (v->send1bus > 0 && v->send1gain != 0)
714 int oofs = m->module.aux_offset + (v->send1bus - 1) * 2;
715 mix_block_into_with_gain(outputs, oofs, left, right, v->send1gain);
717 if (v->send2bus > 0 && v->send2gain != 0)
719 int oofs = m->module.aux_offset + (v->send2bus - 1) * 2;
720 mix_block_into_with_gain(outputs, oofs, left, right, v->send2gain);
723 if (v->gen.mode == spt_inactive)
724 sampler_voice_inactivate(v, FALSE);
727 void sampler_process_block(struct cbox_module *module, cbox_sample_t **inputs, cbox_sample_t **outputs)
729 struct sampler_module *m = (struct sampler_module *)module;
731 //float channels[2][CBOX_BLOCK_SIZE];
733 for (int c = 0; c < m->output_pairs + m->aux_pairs; c++)
735 int oo = 2 * c;
736 for (int i = 0; i < CBOX_BLOCK_SIZE; i++)
737 outputs[oo][i] = outputs[oo + 1][i] = 0.f;
740 int vcount = 0, vrel = 0;
741 for (int i = 0; i < 16; i++)
743 int cvcount = 0;
744 FOREACH_VOICE(m->channels[i].voices_running, v)
746 sampler_voice_process(v, m, outputs);
748 if (v->amp_env.cur_stage == 15)
749 vrel++;
750 cvcount++;
752 m->channels[i].active_voices = cvcount;
753 vcount += cvcount;
755 m->active_voices = vcount;
756 if (vcount - vrel > m->max_voices)
757 sampler_steal_voice(m);
758 m->serial_no++;
759 m->current_time += CBOX_BLOCK_SIZE;
762 void sampler_process_cc(struct sampler_module *m, struct sampler_channel *c, int cc, int val)
764 // Handle CC triggering.
765 if (c->program && c->program->rll && c->program->rll->layers_oncc && m->voices_free)
767 struct sampler_rll *rll = c->program->rll;
768 if (!(rll->cc_trigger_bitmask[cc >> 5] & (1 << (cc & 31))))
769 return;
770 int old_value = c->cc[cc];
771 for (GSList *p = rll->layers_oncc; p; p = p->next)
773 struct sampler_layer *layer = p->data;
774 assert(layer->runtime);
775 // Only trigger on transition between 'out of range' and 'in range' values.
776 // XXXKF I'm not sure if it's what is expected here, but don't have
777 // the reference implementation handy.
778 if (layer->runtime->on_cc_number == cc &&
779 (val >= layer->runtime->on_locc && val <= layer->runtime->on_hicc) &&
780 !(old_value >= layer->runtime->on_locc && old_value <= layer->runtime->on_hicc))
782 struct sampler_voice *v = m->voices_free;
783 int exgroups[MAX_RELEASED_GROUPS], exgroupcount = 0;
784 sampler_start_voice(m, c, v, layer->runtime, layer->runtime->pitch_keycenter, 127, exgroups, &exgroupcount);
785 sampler_release_groups(m, c, -1, exgroups, exgroupcount);
789 int was_enabled = c->cc[cc] >= 64;
790 int enabled = val >= 64;
791 switch(cc)
793 case 64:
794 if (was_enabled && !enabled)
796 sampler_stop_sustained(m, c);
798 break;
799 case 66:
800 if (was_enabled && !enabled)
801 sampler_stop_sostenuto(m, c);
802 else if (!was_enabled && enabled)
803 sampler_capture_sostenuto(m, c);
804 break;
806 case 120:
807 case 123:
808 sampler_stop_all(m, c);
809 break;
810 case 121:
811 // Recommended Practice (RP-015) Response to Reset All Controllers
812 // http://www.midi.org/techspecs/rp15.php
813 sampler_process_cc(m, c, 64, 0);
814 sampler_process_cc(m, c, 66, 0);
815 c->cc[11] = 127;
816 c->cc[1] = 0;
817 c->pitchwheel = 0;
818 c->cc[smsrc_chanaft] = 0;
819 // XXXKF reset polyphonic pressure values when supported
820 return;
822 if (cc < 120)
823 c->cc[cc] = val;
826 void sampler_program_change(struct sampler_module *m, struct sampler_channel *c, int program)
828 // XXXKF replace with something more efficient
829 for (int i = 0; i < m->program_count; i++)
831 // XXXKF support banks
832 if (m->programs[i]->prog_no == program)
834 sampler_channel_set_program_RT(c, m->programs[i]);
835 return;
838 g_warning("Unknown program %d", program);
839 sampler_channel_set_program_RT(c, m->programs[0]);
842 void sampler_process_event(struct cbox_module *module, const uint8_t *data, uint32_t len)
844 struct sampler_module *m = (struct sampler_module *)module;
845 if (len > 0)
847 int cmd = data[0] >> 4;
848 int chn = data[0] & 15;
849 struct sampler_channel *c = &m->channels[chn];
850 switch(cmd)
852 case 8:
853 sampler_stop_note(m, c, data[1], data[2], FALSE);
854 break;
856 case 9:
857 if (data[2] > 0)
858 sampler_start_note(m, c, data[1], data[2], FALSE);
859 else
860 sampler_stop_note(m, c, data[1], data[2], FALSE);
861 break;
863 case 10:
864 // handle chokeable one shot layers
865 if (data[2] == 127)
866 sampler_stop_note(m, c, data[1], data[2], TRUE);
867 // polyphonic pressure not handled
868 break;
870 case 11:
871 sampler_process_cc(m, c, data[1], data[2]);
872 break;
874 case 12:
875 sampler_program_change(m, c, data[1]);
876 break;
878 case 13:
879 c->cc[smsrc_chanaft] = data[1];
880 break;
882 case 14:
883 c->pitchwheel = data[1] + 128 * data[2] - 8192;
884 break;
890 static void init_channel(struct sampler_module *m, struct sampler_channel *c)
892 c->module = m;
893 c->voices_running = NULL;
894 c->active_voices = 0;
895 c->pitchwheel = 0;
896 memset(c->cc, 0, sizeof(c->cc));
897 c->cc[7] = 100;
898 c->cc[10] = 64;
899 c->cc[11] = 127;
900 c->cc[71] = 64;
901 c->cc[74] = 64;
902 c->previous_note = -1;
903 c->program = NULL;
904 sampler_channel_set_program_RT(c, m->program_count ? m->programs[0] : NULL);
905 memset(c->switchmask, 0, sizeof(c->switchmask));
906 memset(c->sustainmask, 0, sizeof(c->sustainmask));
907 memset(c->sostenutomask, 0, sizeof(c->sostenutomask));
910 void sampler_channel_set_program_RT(struct sampler_channel *c, struct sampler_program *prg)
912 if (c->program)
913 c->program->in_use--;
914 c->program = prg;
915 if (prg)
917 for(GSList *p = prg->ctrl_init_list; p; p = p->next)
919 union sampler_ctrlinit_union u;
920 u.ptr = p->data;
921 // printf("Setting controller %d -> %d\n", u.cinit.controller, u.cinit.value);
922 c->cc[u.cinit.controller] = u.cinit.value;
924 c->program->in_use++;
928 #define sampler_channel_set_program_args(ARG) ARG(struct sampler_program *, prg)
930 DEFINE_RT_VOID_FUNC(sampler_channel, c, sampler_channel_set_program)
932 sampler_channel_set_program_RT(c, prg);
935 static int get_first_free_program_no(struct sampler_module *m)
937 int prog_no = -1;
938 gboolean found;
940 // XXXKF this has a N-squared complexity - but I'm not seeing
941 // this being used with more than 10 programs at the same time
942 // in the near future
943 do {
944 prog_no++;
945 found = FALSE;
946 for (int i = 0; i < m->program_count; i++)
948 if (m->programs[i]->prog_no == prog_no)
950 found = TRUE;
951 break;
954 } while(found);
956 return prog_no;
959 static int find_program(struct sampler_module *m, int prog_no)
961 for (int i = 0; i < m->program_count; i++)
963 if (m->programs[i]->prog_no == prog_no)
964 return i;
966 return -1;
969 struct release_program_voices_data
971 struct sampler_module *module;
973 struct sampler_program *old_pgm, *new_pgm;
974 uint16_t channels_to_wait_for;
977 static int release_program_voices_execute(void *data)
979 struct release_program_voices_data *rpv = data;
980 struct sampler_module *m = rpv->module;
981 int finished = 1;
983 for (int i = 0; i < 16; i++)
985 uint16_t mask = 1 << i;
986 struct sampler_channel *c = &m->channels[i];
987 if (c->program == rpv->old_pgm || c->program == NULL)
989 sampler_channel_set_program_RT(c, rpv->new_pgm);
990 rpv->channels_to_wait_for |= mask;
992 if (rpv->channels_to_wait_for & mask)
994 FOREACH_VOICE(c->voices_running, v)
996 if (v->program == rpv->new_pgm)
997 continue;
998 if (!m->deleting)
999 finished = 0;
1000 if (v->amp_env.cur_stage != 15)
1002 v->released = 1;
1003 cbox_envelope_go_to(&v->amp_env, 15);
1009 return finished;
1012 static void swap_program(struct sampler_module *m, int index, struct sampler_program *pgm, gboolean delete_old)
1014 static struct cbox_rt_cmd_definition release_program_voices = { NULL, release_program_voices_execute, NULL };
1016 struct sampler_program *old_program = NULL;
1017 if (pgm)
1018 old_program = cbox_rt_swap_pointers(m->module.rt, (void **)&m->programs[index], pgm);
1019 else
1020 cbox_rt_array_remove(m->module.rt, (void ***)&m->programs, &m->program_count, index);
1022 struct release_program_voices_data data = {m, old_program, pgm, 0};
1024 cbox_rt_execute_cmd_sync(m->module.rt, &release_program_voices, &data);
1026 if (delete_old && old_program)
1027 CBOX_DELETE(old_program);
1030 static void select_initial_program(struct sampler_module *m)
1032 static struct cbox_rt_cmd_definition release_program_voices = { NULL, release_program_voices_execute, NULL };
1033 struct release_program_voices_data data = {m, NULL, m->programs[0], 0};
1034 cbox_rt_execute_cmd_sync(m->module.rt, &release_program_voices, &data);
1037 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)
1039 struct sampler_program *pgm = NULL;
1040 int index = find_program(m, prog_no);
1041 pgm = sampler_program_new_from_cfg(m, cfg_section, name, prog_no, error);
1042 if (!pgm)
1043 return FALSE;
1045 if (index != -1)
1047 swap_program(m, index, pgm, TRUE);
1048 return TRUE;
1051 struct sampler_program **programs = malloc(sizeof(struct sampler_program *) * (m->program_count + 1));
1052 memcpy(programs, m->programs, sizeof(struct sampler_program *) * m->program_count);
1053 programs[m->program_count] = pgm;
1054 if (ppgm)
1055 *ppgm = pgm;
1056 free(cbox_rt_swap_pointers_and_update_count(m->module.rt, (void **)&m->programs, programs, &m->program_count, m->program_count + 1));
1057 if (m->program_count == 1)
1058 select_initial_program(m);
1059 return TRUE;
1062 void sampler_unselect_program(struct sampler_module *m, struct sampler_program *prg)
1064 // Ensure no new notes are played on that program
1065 prg->deleting = TRUE;
1066 // Remove from the list of available programs, so that it cannot be selected again
1067 for (int i = 0; i < m->program_count; i++)
1069 if (m->programs[i] == prg)
1070 swap_program(m, i, NULL, FALSE);
1074 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)
1076 int index = find_program(m, prog_no);
1077 struct sampler_program *pgm = sampler_program_new(m, prog_no, name, sample_dir);
1078 pgm->source_file = g_strdup("string");
1079 if (!sampler_module_load_program_sfz(m, pgm, sfz_data, TRUE, error))
1081 free(pgm);
1082 return FALSE;
1085 if (index != -1)
1087 swap_program(m, index, pgm, TRUE);
1088 if (ppgm)
1089 *ppgm = pgm;
1090 return TRUE;
1093 struct sampler_program **programs = calloc((m->program_count + 1), sizeof(struct sampler_program *));
1094 memcpy(programs, m->programs, sizeof(struct sampler_program *) * m->program_count);
1095 programs[m->program_count] = pgm;
1096 if (ppgm)
1097 *ppgm = pgm;
1098 free(cbox_rt_swap_pointers_and_update_count(m->module.rt, (void **)&m->programs, programs, &m->program_count, m->program_count + 1));
1099 if (m->program_count == 1)
1100 select_initial_program(m);
1101 return TRUE;
1104 gboolean sampler_process_cmd(struct cbox_command_target *ct, struct cbox_command_target *fb, struct cbox_osc_command *cmd, GError **error)
1106 struct sampler_module *m = (struct sampler_module *)ct->user_data;
1108 if (!strcmp(cmd->command, "/status") && !strcmp(cmd->arg_types, ""))
1110 if (!cbox_check_fb_channel(fb, cmd->command, error))
1111 return FALSE;
1112 for (int i = 0; i < 16; i++)
1114 struct sampler_channel *channel = &m->channels[i];
1115 gboolean result;
1116 if (channel->program)
1117 result = cbox_execute_on(fb, NULL, "/patch", "iis", error, i + 1, channel->program->prog_no, channel->program->name);
1118 else
1119 result = cbox_execute_on(fb, NULL, "/patch", "iis", error, i + 1, -1, "");
1120 if (!result)
1121 return FALSE;
1122 if (!(cbox_execute_on(fb, NULL, "/channel_voices", "ii", error, i + 1, channel->active_voices) &&
1123 cbox_execute_on(fb, NULL, "/volume", "ii", error, i + 1, addcc(channel, 7)) &&
1124 cbox_execute_on(fb, NULL, "/pan", "ii", error, i + 1, addcc(channel, 10))))
1125 return FALSE;
1128 return cbox_execute_on(fb, NULL, "/active_voices", "i", error, m->active_voices) &&
1129 cbox_execute_on(fb, NULL, "/polyphony", "i", error, MAX_SAMPLER_VOICES) &&
1130 CBOX_OBJECT_DEFAULT_STATUS(&m->module, fb, error);
1132 else
1133 if (!strcmp(cmd->command, "/patches") && !strcmp(cmd->arg_types, ""))
1135 if (!cbox_check_fb_channel(fb, cmd->command, error))
1136 return FALSE;
1137 for (int i = 0; i < m->program_count; i++)
1139 struct sampler_program *prog = m->programs[i];
1140 if (!cbox_execute_on(fb, NULL, "/patch", "isoi", error, prog->prog_no, prog->name, prog, prog->in_use))
1141 return FALSE;
1143 return TRUE;
1145 else if (!strcmp(cmd->command, "/polyphony") && !strcmp(cmd->arg_types, "i"))
1147 int polyphony = CBOX_ARG_I(cmd, 0);
1148 if (polyphony < 1 || polyphony > MAX_SAMPLER_VOICES)
1150 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);
1151 return FALSE;
1153 m->max_voices = polyphony;
1154 return TRUE;
1156 else if (!strcmp(cmd->command, "/set_patch") && !strcmp(cmd->arg_types, "ii"))
1158 int channel = CBOX_ARG_I(cmd, 0);
1159 if (channel < 1 || channel > 16)
1161 g_set_error(error, CBOX_MODULE_ERROR, CBOX_MODULE_ERROR_FAILED, "Invalid channel %d", channel);
1162 return FALSE;
1164 int value = CBOX_ARG_I(cmd, 1);
1165 struct sampler_program *pgm = NULL;
1166 for (int i = 0; i < m->program_count; i++)
1168 if (m->programs[i]->prog_no == value)
1170 pgm = m->programs[i];
1171 break;
1174 sampler_channel_set_program(&m->channels[channel - 1], pgm);
1175 return TRUE;
1177 else if (!strcmp(cmd->command, "/load_patch") && !strcmp(cmd->arg_types, "iss"))
1179 struct sampler_program *pgm = NULL;
1180 if (!load_program_at(m, CBOX_ARG_S(cmd, 1), CBOX_ARG_S(cmd, 2), CBOX_ARG_I(cmd, 0), &pgm, error))
1181 return FALSE;
1182 if (fb)
1183 return cbox_execute_on(fb, NULL, "/uuid", "o", error, pgm);
1184 return TRUE;
1186 else if (!strcmp(cmd->command, "/load_patch_from_file") && !strcmp(cmd->arg_types, "iss"))
1188 struct sampler_program *pgm = NULL;
1189 char *cfg_section = g_strdup_printf("spgm:!%s", CBOX_ARG_S(cmd, 1));
1190 gboolean res = load_program_at(m, cfg_section, CBOX_ARG_S(cmd, 2), CBOX_ARG_I(cmd, 0), &pgm, error);
1191 g_free(cfg_section);
1192 if (res && pgm && fb)
1193 return cbox_execute_on(fb, NULL, "/uuid", "o", error, pgm);
1194 return res;
1196 else if (!strcmp(cmd->command, "/load_patch_from_string") && !strcmp(cmd->arg_types, "isss"))
1198 struct sampler_program *pgm = NULL;
1199 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))
1200 return FALSE;
1201 if (fb && pgm)
1202 return cbox_execute_on(fb, NULL, "/uuid", "o", error, pgm);
1203 return TRUE;
1205 else if (!strcmp(cmd->command, "/get_unused_program") && !strcmp(cmd->arg_types, ""))
1207 if (!cbox_check_fb_channel(fb, cmd->command, error))
1208 return FALSE;
1209 return cbox_execute_on(fb, NULL, "/program_no", "i", error, get_first_free_program_no(m));
1211 else
1212 return cbox_object_default_process_cmd(ct, fb, cmd, error);
1213 return TRUE;
1216 gboolean sampler_select_program(struct sampler_module *m, int channel, const gchar *preset, GError **error)
1218 for (int i = 0; i < m->program_count; i++)
1220 if (!strcmp(m->programs[i]->name, preset))
1222 sampler_channel_set_program(&m->channels[channel], m->programs[i]);
1223 return TRUE;
1226 g_set_error(error, CBOX_MODULE_ERROR, CBOX_MODULE_ERROR_FAILED, "Preset not found: %s", preset);
1227 return FALSE;
1230 MODULE_CREATE_FUNCTION(sampler)
1232 int i;
1233 static int inited = 0;
1234 if (!inited)
1236 for (int i = 0; i < 2049; i++)
1237 sine_wave[i] = sin(i * M_PI / 1024.0);
1238 inited = 1;
1241 int max_voices = cbox_config_get_int(cfg_section, "polyphony", MAX_SAMPLER_VOICES);
1242 if (max_voices < 1 || max_voices > MAX_SAMPLER_VOICES)
1244 g_set_error(error, CBOX_SAMPLER_ERROR, CBOX_SAMPLER_ERROR_INVALID_LAYER, "%s: invalid polyphony value", cfg_section);
1245 return NULL;
1247 int output_pairs = cbox_config_get_int(cfg_section, "output_pairs", 1);
1248 if (output_pairs < 1 || output_pairs > 16)
1250 g_set_error(error, CBOX_SAMPLER_ERROR, CBOX_SAMPLER_ERROR_INVALID_LAYER, "%s: invalid output pairs value", cfg_section);
1251 return NULL;
1253 int aux_pairs = cbox_config_get_int(cfg_section, "aux_pairs", 0);
1254 if (aux_pairs < 0 || aux_pairs > 4)
1256 g_set_error(error, CBOX_SAMPLER_ERROR, CBOX_SAMPLER_ERROR_INVALID_LAYER, "%s: invalid aux pairs value", cfg_section);
1257 return NULL;
1260 struct sampler_module *m = calloc(1, sizeof(struct sampler_module));
1261 CALL_MODULE_INIT(m, 0, (output_pairs + aux_pairs) * 2, sampler);
1262 m->output_pairs = output_pairs;
1263 m->aux_pairs = aux_pairs;
1264 m->module.aux_offset = m->output_pairs * 2;
1265 m->module.process_event = sampler_process_event;
1266 m->module.process_block = sampler_process_block;
1267 m->programs = NULL;
1268 m->max_voices = max_voices;
1269 m->serial_no = 0;
1270 m->deleting = FALSE;
1272 for (i = 0; ; i++)
1274 gchar *s = g_strdup_printf("program%d", i);
1275 char *p = cbox_config_get_string(cfg_section, s);
1276 g_free(s);
1278 if (!p)
1280 m->program_count = i;
1281 break;
1284 m->programs = calloc(m->program_count, sizeof(struct sampler_program *));
1285 int success = 1;
1286 for (i = 0; i < m->program_count; i++)
1288 gchar *s = g_strdup_printf("program%d", i);
1289 char *pgm_section = NULL;
1290 int pgm_id = -1;
1291 const char *pgm_name = cbox_config_get_string(cfg_section, s);
1292 g_free(s);
1293 char *at = strchr(pgm_name, '@');
1294 if (at)
1296 pgm_id = atoi(at + 1);
1297 s = g_strndup(pgm_name, at - pgm_name);
1298 pgm_section = g_strdup_printf("spgm:%s", s);
1299 g_free(s);
1301 else
1303 pgm_id = i;
1304 pgm_section = g_strdup_printf("spgm:%s", pgm_name);
1307 m->programs[i] = sampler_program_new_from_cfg(m, pgm_section, pgm_section + 5, pgm_id, error);
1308 g_free(pgm_section);
1309 if (!m->programs[i])
1311 success = 0;
1312 break;
1315 if (!success)
1317 // XXXKF free programs/layers, first ensuring that they're fully initialised
1318 free(m);
1319 return NULL;
1321 m->voices_free = NULL;
1322 memset(m->voices_all, 0, sizeof(m->voices_all));
1323 for (i = 0; i < MAX_SAMPLER_VOICES; i++)
1325 struct sampler_voice *v = &m->voices_all[i];
1326 v->gen.mode = spt_inactive;
1327 sampler_voice_link(&m->voices_free, v);
1329 m->active_voices = 0;
1331 for (i = 0; i < 16; i++)
1332 init_channel(m, &m->channels[i]);
1334 for (i = 0; i < 16; i++)
1336 gchar *key = g_strdup_printf("channel%d", i + 1);
1337 gchar *preset = cbox_config_get_string(cfg_section, key);
1338 if (preset)
1340 if (!sampler_select_program(m, i, preset, error))
1342 CBOX_DELETE(&m->module);
1343 return NULL;
1346 g_free(key);
1350 return &m->module;
1353 void sampler_destroyfunc(struct cbox_module *module)
1355 struct sampler_module *m = (struct sampler_module *)module;
1356 m->deleting = TRUE;
1358 for (int i = 0; i < m->program_count;)
1360 if (m->programs[i])
1361 CBOX_DELETE(m->programs[i]);
1362 else
1363 i++;
1365 free(m->programs);
1368 #define MAKE_TO_STRING_CONTENT(name, v) \
1369 case v: return name;
1371 #define MAKE_FROM_STRING_CONTENT(n, v) \
1372 if (!strcmp(name, n)) { *value = v; return TRUE; }
1374 #define MAKE_FROM_TO_STRING(enumtype) \
1375 const char *enumtype##_to_string(enum enumtype value) \
1377 switch(value) { \
1378 ENUM_VALUES_##enumtype(MAKE_TO_STRING_CONTENT) \
1379 default: return NULL; \
1383 gboolean enumtype##_from_string(const char *name, enum enumtype *value) \
1385 ENUM_VALUES_##enumtype(MAKE_FROM_STRING_CONTENT) \
1386 return FALSE; \
1389 ENUM_LIST(MAKE_FROM_TO_STRING)
1391 //////////////////////////////////////////////////////////////////////////
1393 struct sampler_update_layer_cmd
1395 struct sampler_module *module;
1396 struct sampler_layer *layer;
1397 struct sampler_layer_data *new_data;
1398 struct sampler_layer_data *old_data;
1401 static int sampler_update_layer_cmd_prepare(void *data)
1403 struct sampler_update_layer_cmd *cmd = data;
1404 cmd->old_data = cmd->layer->runtime;
1405 cmd->new_data = calloc(1, sizeof(struct sampler_layer_data));
1407 sampler_layer_data_clone(cmd->new_data, &cmd->layer->data, TRUE);
1408 sampler_layer_data_finalize(cmd->new_data, cmd->layer->parent_group ? &cmd->layer->parent_group->data : NULL, cmd->module);
1409 if (cmd->layer->runtime == NULL)
1411 // initial update of the layer, so none of the voices need updating yet
1412 // because the layer hasn't been allocated to any voice
1413 cmd->layer->runtime = cmd->new_data;
1414 return 1;
1416 return 0;
1419 static int sampler_update_layer_cmd_execute(void *data)
1421 struct sampler_update_layer_cmd *cmd = data;
1423 for (int i = 0; i < 16; i++)
1425 FOREACH_VOICE(cmd->module->channels[i].voices_running, v)
1427 if (v->layer == cmd->old_data)
1428 v->layer = cmd->new_data;
1431 cmd->layer->runtime = cmd->new_data;
1432 return 10;
1435 static void sampler_update_layer_cmd_cleanup(void *data)
1437 struct sampler_update_layer_cmd *cmd = data;
1439 sampler_layer_data_destroy(cmd->old_data);
1442 void sampler_update_layer(struct sampler_module *m, struct sampler_layer *l)
1444 // if changing a group, update all child regions instead
1445 if (g_hash_table_size(l->child_layers))
1447 GHashTableIter iter;
1448 g_hash_table_iter_init(&iter, l->child_layers);
1449 gpointer key, value;
1450 while(g_hash_table_iter_next(&iter, &key, &value))
1452 sampler_layer_data_finalize(&((struct sampler_layer *)key)->data, &l->data, m);
1453 sampler_update_layer(m, (struct sampler_layer *)key);
1455 return;
1457 static struct cbox_rt_cmd_definition rtcmd = {
1458 .prepare = sampler_update_layer_cmd_prepare,
1459 .execute = sampler_update_layer_cmd_execute,
1460 .cleanup = sampler_update_layer_cmd_cleanup,
1463 struct sampler_update_layer_cmd lcmd;
1464 lcmd.module = m;
1465 lcmd.layer = l;
1466 lcmd.new_data = NULL;
1467 lcmd.old_data = NULL;
1469 // In order to be able to use the async call, it would be necessary to
1470 // identify old data by layer pointer, not layer data pointer. For now,
1471 // it might be good enough to just use sync calls for this.
1472 cbox_rt_execute_cmd_sync(m->module.rt, &rtcmd, &lcmd);
1475 void sampler_update_program_layers(struct sampler_module *m, struct sampler_program *prg)
1477 struct sampler_rll *new_rll = sampler_rll_new_from_program(prg);
1478 struct sampler_rll *old_rll = cbox_rt_swap_pointers(m->module.rt, (void **)&prg->rll, new_rll);
1479 if (old_rll)
1480 sampler_rll_destroy(old_rll);
1483 //////////////////////////////////////////////////////////////////////////
1484 // Note initialisation functions
1486 void sampler_nif_vel2pitch(struct sampler_noteinitfunc *nif, struct sampler_voice *v)
1488 v->pitch_shift += nif->param * v->vel * (1.0 / 127.0);
1491 void sampler_nif_cc2delay(struct sampler_noteinitfunc *nif, struct sampler_voice *v)
1493 v->delay += nif->param * v->channel->cc[nif->variant] * (1.0 / 127.0) * v->channel->module->module.srate;
1496 void sampler_nif_addrandom(struct sampler_noteinitfunc *nif, struct sampler_voice *v)
1498 float rnd = rand() * 1.0 / RAND_MAX;
1499 switch(nif->variant)
1501 case 0:
1502 v->gain_shift += rnd * nif->param;
1503 break;
1504 case 1:
1505 v->cutoff_shift += rnd * nif->param;
1506 break;
1507 case 2:
1508 v->pitch_shift += rnd * nif->param; // this is in cents
1509 break;
1513 void sampler_nif_vel2env(struct sampler_noteinitfunc *nif, struct sampler_voice *v)
1515 int env_type = (nif->variant) >> 4;
1516 struct cbox_envelope *env = NULL;
1517 switch(env_type)
1519 case 0:
1520 env = &v->amp_env;
1521 break;
1522 case 1:
1523 env = &v->filter_env;
1524 break;
1525 case 2:
1526 env = &v->pitch_env;
1527 break;
1528 default:
1529 assert(0);
1531 if (env->shape != &v->dyn_envs[env_type])
1533 memcpy(&v->dyn_envs[env_type], env->shape, sizeof(struct cbox_envelope_shape));
1534 env->shape = &v->dyn_envs[env_type];
1536 float param = nif->param * v->vel * (1.0 / 127.0);
1537 if ((nif->variant & 15) == 4)
1538 param *= 0.01;
1539 cbox_envelope_modify_dahdsr(env->shape, nif->variant & 15, param, v->channel->module->module.srate * (1.0 / CBOX_BLOCK_SIZE));
1542 //////////////////////////////////////////////////////////////////////////
1544 struct cbox_module_livecontroller_metadata sampler_controllers[] = {
1547 struct cbox_module_keyrange_metadata sampler_keyranges[] = {
1550 DEFINE_MODULE(sampler, 0, 2)