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"
26 #include "sampler_impl.h"
27 #include "sfzloader.h"
38 float sampler_sine_wave
[2049];
40 GQuark
cbox_sampler_error_quark()
42 return g_quark_from_string("cbox-sampler-error-quark");
45 static void sampler_process_block(struct cbox_module
*module
, cbox_sample_t
**inputs
, cbox_sample_t
**outputs
);
46 static void sampler_process_event(struct cbox_module
*module
, const uint8_t *data
, uint32_t len
);
47 static void sampler_destroyfunc(struct cbox_module
*module
);
49 void sampler_steal_voice(struct sampler_module
*m
)
52 struct sampler_voice
*voice_found
= NULL
;
53 for (int i
= 0; i
< 16; i
++)
55 FOREACH_VOICE(m
->channels
[i
].voices_running
, v
)
57 if (v
->amp_env
.cur_stage
== 15)
59 int age
= m
->serial_no
- v
->serial_no
;
60 if (v
->gen
.loop_start
== -1)
61 age
+= (int)((v
->gen
.bigpos
>> 32) * 100.0 / v
->gen
.cur_sample_end
);
74 voice_found
->released
= 1;
75 cbox_envelope_go_to(&voice_found
->amp_env
, 15);
79 static inline float clip01(float v
)
88 void sampler_process_block(struct cbox_module
*module
, cbox_sample_t
**inputs
, cbox_sample_t
**outputs
)
90 struct sampler_module
*m
= (struct sampler_module
*)module
;
92 //float channels[2][CBOX_BLOCK_SIZE];
94 for (int c
= 0; c
< m
->output_pairs
+ m
->aux_pairs
; c
++)
97 for (int i
= 0; i
< CBOX_BLOCK_SIZE
; i
++)
98 outputs
[oo
][i
] = outputs
[oo
+ 1][i
] = 0.f
;
101 int vcount
= 0, vrel
= 0;
102 for (int i
= 0; i
< 16; i
++)
105 FOREACH_VOICE(m
->channels
[i
].voices_running
, v
)
107 sampler_voice_process(v
, m
, outputs
);
109 if (v
->amp_env
.cur_stage
== 15)
113 m
->channels
[i
].active_voices
= cvcount
;
116 m
->active_voices
= vcount
;
117 if (vcount
- vrel
> m
->max_voices
)
118 sampler_steal_voice(m
);
120 m
->current_time
+= CBOX_BLOCK_SIZE
;
123 void sampler_process_event(struct cbox_module
*module
, const uint8_t *data
, uint32_t len
)
125 struct sampler_module
*m
= (struct sampler_module
*)module
;
128 int cmd
= data
[0] >> 4;
129 int chn
= data
[0] & 15;
130 struct sampler_channel
*c
= &m
->channels
[chn
];
134 sampler_channel_stop_note(c
, data
[1], data
[2], FALSE
);
139 sampler_channel_start_note(c
, data
[1], data
[2], FALSE
);
141 sampler_channel_stop_note(c
, data
[1], data
[2], FALSE
);
145 // handle chokeable one shot layers
147 sampler_channel_stop_note(c
, data
[1], data
[2], TRUE
);
148 // polyphonic pressure not handled
152 sampler_channel_process_cc(c
, data
[1], data
[2]);
156 sampler_channel_program_change(c
, data
[1]);
160 c
->cc
[smsrc_chanaft
] = data
[1];
164 c
->pitchwheel
= data
[1] + 128 * data
[2] - 8192;
171 static int get_first_free_program_no(struct sampler_module
*m
)
176 // XXXKF this has a N-squared complexity - but I'm not seeing
177 // this being used with more than 10 programs at the same time
178 // in the near future
182 for (int i
= 0; i
< m
->program_count
; i
++)
184 if (m
->programs
[i
]->prog_no
== prog_no
)
195 static int find_program(struct sampler_module
*m
, int prog_no
)
197 for (int i
= 0; i
< m
->program_count
; i
++)
199 if (m
->programs
[i
]->prog_no
== prog_no
)
205 struct release_program_voices_data
207 struct sampler_module
*module
;
209 struct sampler_program
*old_pgm
, *new_pgm
;
210 uint16_t channels_to_wait_for
;
213 static int release_program_voices_execute(void *data
)
215 struct release_program_voices_data
*rpv
= data
;
216 struct sampler_module
*m
= rpv
->module
;
219 for (int i
= 0; i
< 16; i
++)
221 uint16_t mask
= 1 << i
;
222 struct sampler_channel
*c
= &m
->channels
[i
];
223 if (c
->program
== rpv
->old_pgm
|| c
->program
== NULL
)
225 sampler_channel_set_program_RT(c
, rpv
->new_pgm
);
226 rpv
->channels_to_wait_for
|= mask
;
228 if (rpv
->channels_to_wait_for
& mask
)
230 FOREACH_VOICE(c
->voices_running
, v
)
234 sampler_voice_inactivate(v
, TRUE
);
237 // This is a new voice, started after program change, so it
238 // should not be terminated and waited for.
239 if (v
->program
== rpv
->new_pgm
)
241 // The voice is still going, so repeat until it fades out
243 // If not in final fadeout stage, force final fadeout.
244 if (v
->amp_env
.cur_stage
!= 15)
247 cbox_envelope_go_to(&v
->amp_env
, 15);
256 static void swap_program(struct sampler_module
*m
, int index
, struct sampler_program
*pgm
, gboolean delete_old
)
258 static struct cbox_rt_cmd_definition release_program_voices
= { NULL
, release_program_voices_execute
, NULL
};
260 struct sampler_program
*old_program
= NULL
;
262 old_program
= cbox_rt_swap_pointers(m
->module
.rt
, (void **)&m
->programs
[index
], pgm
);
264 old_program
= cbox_rt_array_remove(m
->module
.rt
, (void ***)&m
->programs
, &m
->program_count
, index
);
266 struct release_program_voices_data data
= {m
, old_program
, pgm
, 0};
268 cbox_rt_execute_cmd_sync(m
->module
.rt
, &release_program_voices
, &data
);
270 if (delete_old
&& old_program
)
271 CBOX_DELETE(old_program
);
274 static void select_initial_program(struct sampler_module
*m
)
276 static struct cbox_rt_cmd_definition release_program_voices
= { NULL
, release_program_voices_execute
, NULL
};
277 struct release_program_voices_data data
= {m
, NULL
, m
->programs
[0], 0};
278 cbox_rt_execute_cmd_sync(m
->module
.rt
, &release_program_voices
, &data
);
281 void sampler_register_program(struct sampler_module
*m
, struct sampler_program
*pgm
)
283 struct sampler_program
**programs
= malloc(sizeof(struct sampler_program
*) * (m
->program_count
+ 1));
284 memcpy(programs
, m
->programs
, sizeof(struct sampler_program
*) * m
->program_count
);
285 programs
[m
->program_count
] = pgm
;
286 free(cbox_rt_swap_pointers_and_update_count(m
->module
.rt
, (void **)&m
->programs
, programs
, &m
->program_count
, m
->program_count
+ 1));
287 if (m
->program_count
== 1)
288 select_initial_program(m
);
291 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
)
293 struct sampler_program
*pgm
= NULL
;
294 int index
= find_program(m
, prog_no
);
295 pgm
= sampler_program_new_from_cfg(m
, cfg_section
, name
, prog_no
, error
);
301 swap_program(m
, index
, pgm
, TRUE
);
305 sampler_register_program(m
, pgm
);
311 void sampler_unselect_program(struct sampler_module
*m
, struct sampler_program
*prg
)
313 // Ensure no new notes are played on that program
314 prg
->deleting
= TRUE
;
315 // Remove from the list of available programs, so that it cannot be selected again
316 for (int i
= 0; i
< m
->program_count
; i
++)
318 if (m
->programs
[i
] == prg
)
319 swap_program(m
, i
, NULL
, FALSE
);
323 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
)
325 int index
= find_program(m
, prog_no
);
326 struct sampler_program
*pgm
= sampler_program_new(m
, prog_no
, name
, NULL
, sample_dir
, error
);
329 pgm
->source_file
= g_strdup("string");
330 if (!sampler_module_load_program_sfz(m
, pgm
, sfz_data
, TRUE
, error
))
338 swap_program(m
, index
, pgm
, TRUE
);
344 struct sampler_program
**programs
= calloc((m
->program_count
+ 1), sizeof(struct sampler_program
*));
345 memcpy(programs
, m
->programs
, sizeof(struct sampler_program
*) * m
->program_count
);
346 programs
[m
->program_count
] = pgm
;
349 free(cbox_rt_swap_pointers_and_update_count(m
->module
.rt
, (void **)&m
->programs
, programs
, &m
->program_count
, m
->program_count
+ 1));
350 if (m
->program_count
== 1)
351 select_initial_program(m
);
355 gboolean
sampler_process_cmd(struct cbox_command_target
*ct
, struct cbox_command_target
*fb
, struct cbox_osc_command
*cmd
, GError
**error
)
357 struct sampler_module
*m
= (struct sampler_module
*)ct
->user_data
;
359 if (!strcmp(cmd
->command
, "/status") && !strcmp(cmd
->arg_types
, ""))
361 if (!cbox_check_fb_channel(fb
, cmd
->command
, error
))
363 for (int i
= 0; i
< 16; i
++)
365 struct sampler_channel
*channel
= &m
->channels
[i
];
367 if (channel
->program
)
368 result
= cbox_execute_on(fb
, NULL
, "/patch", "iis", error
, i
+ 1, channel
->program
->prog_no
, channel
->program
->name
);
370 result
= cbox_execute_on(fb
, NULL
, "/patch", "iis", error
, i
+ 1, -1, "");
373 if (!(cbox_execute_on(fb
, NULL
, "/channel_voices", "ii", error
, i
+ 1, channel
->active_voices
) &&
374 cbox_execute_on(fb
, NULL
, "/volume", "ii", error
, i
+ 1, sampler_channel_addcc(channel
, 7)) &&
375 cbox_execute_on(fb
, NULL
, "/pan", "ii", error
, i
+ 1, sampler_channel_addcc(channel
, 10))))
379 return cbox_execute_on(fb
, NULL
, "/active_voices", "i", error
, m
->active_voices
) &&
380 cbox_execute_on(fb
, NULL
, "/active_pipes", "i", error
, cbox_prefetch_stack_get_active_pipe_count(m
->pipe_stack
)) &&
381 cbox_execute_on(fb
, NULL
, "/polyphony", "i", error
, MAX_SAMPLER_VOICES
) &&
382 CBOX_OBJECT_DEFAULT_STATUS(&m
->module
, fb
, error
);
385 if (!strcmp(cmd
->command
, "/patches") && !strcmp(cmd
->arg_types
, ""))
387 if (!cbox_check_fb_channel(fb
, cmd
->command
, error
))
389 for (int i
= 0; i
< m
->program_count
; i
++)
391 struct sampler_program
*prog
= m
->programs
[i
];
392 if (!cbox_execute_on(fb
, NULL
, "/patch", "isoi", error
, prog
->prog_no
, prog
->name
, prog
, prog
->in_use
))
397 else if (!strcmp(cmd
->command
, "/polyphony") && !strcmp(cmd
->arg_types
, "i"))
399 int polyphony
= CBOX_ARG_I(cmd
, 0);
400 if (polyphony
< 1 || polyphony
> MAX_SAMPLER_VOICES
)
402 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
);
405 m
->max_voices
= polyphony
;
408 else if (!strcmp(cmd
->command
, "/set_patch") && !strcmp(cmd
->arg_types
, "ii"))
410 int channel
= CBOX_ARG_I(cmd
, 0);
411 if (channel
< 1 || channel
> 16)
413 g_set_error(error
, CBOX_MODULE_ERROR
, CBOX_MODULE_ERROR_FAILED
, "Invalid channel %d", channel
);
416 int value
= CBOX_ARG_I(cmd
, 1);
417 struct sampler_program
*pgm
= NULL
;
418 for (int i
= 0; i
< m
->program_count
; i
++)
420 if (m
->programs
[i
]->prog_no
== value
)
422 pgm
= m
->programs
[i
];
426 sampler_channel_set_program(&m
->channels
[channel
- 1], pgm
);
429 else if (!strcmp(cmd
->command
, "/load_patch") && !strcmp(cmd
->arg_types
, "iss"))
431 struct sampler_program
*pgm
= NULL
;
432 if (!load_program_at(m
, CBOX_ARG_S(cmd
, 1), CBOX_ARG_S(cmd
, 2), CBOX_ARG_I(cmd
, 0), &pgm
, error
))
435 return cbox_execute_on(fb
, NULL
, "/uuid", "o", error
, pgm
);
438 else if (!strcmp(cmd
->command
, "/load_patch_from_file") && !strcmp(cmd
->arg_types
, "iss"))
440 struct sampler_program
*pgm
= NULL
;
441 char *cfg_section
= g_strdup_printf("spgm:!%s", CBOX_ARG_S(cmd
, 1));
442 gboolean res
= load_program_at(m
, cfg_section
, CBOX_ARG_S(cmd
, 2), CBOX_ARG_I(cmd
, 0), &pgm
, error
);
444 if (res
&& pgm
&& fb
)
445 return cbox_execute_on(fb
, NULL
, "/uuid", "o", error
, pgm
);
448 else if (!strcmp(cmd
->command
, "/load_patch_from_string") && !strcmp(cmd
->arg_types
, "isss"))
450 struct sampler_program
*pgm
= NULL
;
451 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
))
454 return cbox_execute_on(fb
, NULL
, "/uuid", "o", error
, pgm
);
457 else if (!strcmp(cmd
->command
, "/get_unused_program") && !strcmp(cmd
->arg_types
, ""))
459 if (!cbox_check_fb_channel(fb
, cmd
->command
, error
))
461 return cbox_execute_on(fb
, NULL
, "/program_no", "i", error
, get_first_free_program_no(m
));
464 return cbox_object_default_process_cmd(ct
, fb
, cmd
, error
);
468 gboolean
sampler_select_program(struct sampler_module
*m
, int channel
, const gchar
*preset
, GError
**error
)
470 for (int i
= 0; i
< m
->program_count
; i
++)
472 if (!strcmp(m
->programs
[i
]->name
, preset
))
474 sampler_channel_set_program(&m
->channels
[channel
], m
->programs
[i
]);
478 g_set_error(error
, CBOX_MODULE_ERROR
, CBOX_MODULE_ERROR_FAILED
, "Preset not found: %s", preset
);
482 MODULE_CREATE_FUNCTION(sampler
)
485 static int inited
= 0;
488 for (int i
= 0; i
< 2049; i
++)
489 sampler_sine_wave
[i
] = sin(i
* M_PI
/ 1024.0);
493 int max_voices
= cbox_config_get_int(cfg_section
, "polyphony", MAX_SAMPLER_VOICES
);
494 if (max_voices
< 1 || max_voices
> MAX_SAMPLER_VOICES
)
496 g_set_error(error
, CBOX_SAMPLER_ERROR
, CBOX_SAMPLER_ERROR_INVALID_LAYER
, "%s: invalid polyphony value", cfg_section
);
499 int output_pairs
= cbox_config_get_int(cfg_section
, "output_pairs", 1);
500 if (output_pairs
< 1 || output_pairs
> 16)
502 g_set_error(error
, CBOX_SAMPLER_ERROR
, CBOX_SAMPLER_ERROR_INVALID_LAYER
, "%s: invalid output pairs value", cfg_section
);
505 int aux_pairs
= cbox_config_get_int(cfg_section
, "aux_pairs", 0);
506 if (aux_pairs
< 0 || aux_pairs
> 4)
508 g_set_error(error
, CBOX_SAMPLER_ERROR
, CBOX_SAMPLER_ERROR_INVALID_LAYER
, "%s: invalid aux pairs value", cfg_section
);
512 struct sampler_module
*m
= calloc(1, sizeof(struct sampler_module
));
513 CALL_MODULE_INIT(m
, 0, (output_pairs
+ aux_pairs
) * 2, sampler
);
514 m
->output_pairs
= output_pairs
;
515 m
->aux_pairs
= aux_pairs
;
516 m
->module
.aux_offset
= m
->output_pairs
* 2;
517 m
->module
.process_event
= sampler_process_event
;
518 m
->module
.process_block
= sampler_process_block
;
520 m
->max_voices
= max_voices
;
523 // XXXKF read defaults from some better place, like config
524 // XXXKF allow dynamic change of the number of the pipes
525 m
->pipe_stack
= cbox_prefetch_stack_new(MAX_SAMPLER_VOICES
, cbox_config_get_int("streaming", "streambuf_size", 65536));
526 m
->disable_mixer_controls
= cbox_config_get_int("sampler", "disable_mixer_controls", 0);
528 float srate
= m
->module
.srate
;
529 for (i
= 0; i
< 12800; i
++)
531 float freq
= 440 * pow(2, (i
- 5700) / 1200.0);
534 if (freq
> srate
* 0.45)
536 float omega
=(float)(2*M_PI
*freq
/srate
);
537 m
->sincos
[i
].sine
= sinf(omega
);
538 m
->sincos
[i
].cosine
= cosf(omega
);
539 m
->sincos
[i
].prewarp
= 2.0 * tan(hz2w(freq
, srate
) * 0.5f
);
544 gchar
*s
= g_strdup_printf("program%d", i
);
545 char *p
= cbox_config_get_string(cfg_section
, s
);
550 m
->program_count
= i
;
554 m
->programs
= calloc(m
->program_count
, sizeof(struct sampler_program
*));
556 for (i
= 0; i
< m
->program_count
; i
++)
558 gchar
*s
= g_strdup_printf("program%d", i
);
559 char *pgm_section
= NULL
;
561 const char *pgm_name
= cbox_config_get_string(cfg_section
, s
);
563 char *at
= strchr(pgm_name
, '@');
566 pgm_id
= atoi(at
+ 1);
567 s
= g_strndup(pgm_name
, at
- pgm_name
);
568 pgm_section
= g_strdup_printf("spgm:%s", s
);
574 pgm_section
= g_strdup_printf("spgm:%s", pgm_name
);
577 m
->programs
[i
] = sampler_program_new_from_cfg(m
, pgm_section
, pgm_section
+ 5, pgm_id
, error
);
587 // XXXKF free programs/layers, first ensuring that they're fully initialised
591 m
->voices_free
= NULL
;
592 memset(m
->voices_all
, 0, sizeof(m
->voices_all
));
593 for (i
= 0; i
< MAX_SAMPLER_VOICES
; i
++)
595 struct sampler_voice
*v
= &m
->voices_all
[i
];
596 v
->gen
.mode
= spt_inactive
;
597 sampler_voice_link(&m
->voices_free
, v
);
599 m
->active_voices
= 0;
601 for (i
= 0; i
< 16; i
++)
602 sampler_channel_init(&m
->channels
[i
], m
);
604 for (i
= 0; i
< 16; i
++)
606 gchar
*key
= g_strdup_printf("channel%d", i
+ 1);
607 gchar
*preset
= cbox_config_get_string(cfg_section
, key
);
610 if (!sampler_select_program(m
, i
, preset
, error
))
612 CBOX_DELETE(&m
->module
);
623 void sampler_destroyfunc(struct cbox_module
*module
)
625 struct sampler_module
*m
= (struct sampler_module
*)module
;
629 for (i
= 0; i
< m
->program_count
;)
632 CBOX_DELETE(m
->programs
[i
]);
636 for (i
= 0; i
< 16; i
++)
638 assert (m
->channels
[i
].voices_running
== NULL
);
640 cbox_prefetch_stack_destroy(m
->pipe_stack
);
644 #define MAKE_TO_STRING_CONTENT(name, v) \
647 #define MAKE_FROM_STRING_CONTENT(n, v) \
648 if (!strcmp(name, n)) { *value = v; return TRUE; }
650 #define MAKE_FROM_TO_STRING(enumtype) \
651 const char *enumtype##_to_string(enum enumtype value) \
654 ENUM_VALUES_##enumtype(MAKE_TO_STRING_CONTENT) \
655 default: return NULL; \
659 gboolean enumtype##_from_string(const char *name, enum enumtype *value) \
661 ENUM_VALUES_##enumtype(MAKE_FROM_STRING_CONTENT) \
665 ENUM_LIST(MAKE_FROM_TO_STRING
)
667 //////////////////////////////////////////////////////////////////////////
668 // Note initialisation functions
670 void sampler_nif_vel2pitch(struct sampler_noteinitfunc
*nif
, struct sampler_voice
*v
)
672 v
->pitch_shift
+= nif
->param
* v
->vel
* (1.0 / 127.0);
675 void sampler_nif_cc2delay(struct sampler_noteinitfunc
*nif
, struct sampler_voice
*v
)
677 v
->delay
+= nif
->param
* v
->channel
->cc
[nif
->variant
] * (1.0 / 127.0) * v
->channel
->module
->module
.srate
;
680 void sampler_nif_addrandom(struct sampler_noteinitfunc
*nif
, struct sampler_voice
*v
)
682 float rnd
= rand() * 1.0 / RAND_MAX
;
686 v
->gain_shift
+= rnd
* nif
->param
;
689 v
->cutoff_shift
+= rnd
* nif
->param
;
692 v
->pitch_shift
+= rnd
* nif
->param
; // this is in cents
697 void sampler_nif_vel2env(struct sampler_noteinitfunc
*nif
, struct sampler_voice
*v
)
699 int env_type
= (nif
->variant
) >> 4;
700 struct cbox_envelope
*env
= NULL
;
707 env
= &v
->filter_env
;
715 if (env
->shape
!= &v
->dyn_envs
[env_type
])
717 memcpy(&v
->dyn_envs
[env_type
], env
->shape
, sizeof(struct cbox_envelope_shape
));
718 env
->shape
= &v
->dyn_envs
[env_type
];
720 float param
= nif
->param
* v
->vel
* (1.0 / 127.0);
721 if ((nif
->variant
& 15) == 4)
723 cbox_envelope_modify_dahdsr(env
->shape
, nif
->variant
& 15, param
, v
->channel
->module
->module
.srate
* (1.0 / CBOX_BLOCK_SIZE
));
726 //////////////////////////////////////////////////////////////////////////
728 struct cbox_module_livecontroller_metadata sampler_controllers
[] = {
731 struct cbox_module_keyrange_metadata sampler_keyranges
[] = {
734 DEFINE_MODULE(sampler
, 0, 2)