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/>.
24 #include "sampler_prg.h"
25 #include "sfzloader.h"
30 CBOX_CLASS_DEFINITION_ROOT(sampler_program
)
32 GSList
*sampler_program_get_next_layer(struct sampler_program
*prg
, struct sampler_channel
*c
, GSList
*next_layer
, int note
, int vel
, float random
, gboolean is_first
)
34 int ch
= (c
- c
->module
->channels
) + 1;
35 for(;next_layer
;next_layer
= g_slist_next(next_layer
))
37 struct sampler_layer
*lr
= next_layer
->data
;
38 struct sampler_layer_data
*l
= lr
->runtime
;
41 if ((l
->trigger
== stm_first
&& !is_first
) ||
42 (l
->trigger
== stm_legato
&& is_first
))
46 if (note
>= l
->sw_lokey
&& note
<= l
->sw_hikey
)
49 if (note
>= l
->lokey
&& note
<= l
->hikey
&& vel
>= l
->lovel
&& vel
<= l
->hivel
&& ch
>= l
->lochan
&& ch
<= l
->hichan
&& random
>= l
->lorand
&& random
< l
->hirand
&&
50 (l
->cc_number
== -1 || (c
->cc
[l
->cc_number
] >= l
->locc
&& c
->cc
[l
->cc_number
] <= l
->hicc
)))
52 if (!l
->eff_use_keyswitch
||
53 ((l
->sw_last
== -1 || l
->sw_last
== lr
->last_key
) &&
54 (l
->sw_down
== -1 || (c
->switchmask
[l
->sw_down
>> 5] & (1 << (l
->sw_down
& 31)))) &&
55 (l
->sw_up
== -1 || !(c
->switchmask
[l
->sw_up
>> 5] & (1 << (l
->sw_up
& 31)))) &&
56 (l
->sw_previous
== -1 || l
->sw_previous
== c
->previous_note
)))
58 gboolean play
= lr
->current_seq_position
== 1;
59 lr
->current_seq_position
++;
60 if (lr
->current_seq_position
>= l
->seq_length
)
61 lr
->current_seq_position
= 1;
70 static gboolean
return_layers(GSList
*layers
, const char *keyword
, struct cbox_command_target
*fb
, GError
**error
)
72 for (GSList
*p
= layers
; p
; p
= g_slist_next(p
))
74 if (!cbox_execute_on(fb
, NULL
, keyword
, "o", error
, p
->data
))
80 static gboolean
sampler_program_process_cmd(struct cbox_command_target
*ct
, struct cbox_command_target
*fb
, struct cbox_osc_command
*cmd
, GError
**error
)
82 struct sampler_program
*program
= ct
->user_data
;
83 if (!strcmp(cmd
->command
, "/status") && !strcmp(cmd
->arg_types
, ""))
85 if (!cbox_check_fb_channel(fb
, cmd
->command
, error
))
88 if (!((!program
->name
|| cbox_execute_on(fb
, NULL
, "/name", "s", error
, program
->name
)) &&
89 cbox_execute_on(fb
, NULL
, "/sample_dir", "s", error
, program
->sample_dir
) &&
90 cbox_execute_on(fb
, NULL
, "/source_file", "s", error
, program
->source_file
) &&
91 cbox_execute_on(fb
, NULL
, "/program_no", "i", error
, program
->prog_no
) &&
92 cbox_execute_on(fb
, NULL
, "/in_use", "i", error
, program
->in_use
) &&
93 CBOX_OBJECT_DEFAULT_STATUS(program
, fb
, error
)))
97 if (!strcmp(cmd
->command
, "/regions") && !strcmp(cmd
->arg_types
, ""))
99 if (!cbox_check_fb_channel(fb
, cmd
->command
, error
))
101 return return_layers(program
->all_layers
, "/region", fb
, error
);
103 if (!strcmp(cmd
->command
, "/groups") && !strcmp(cmd
->arg_types
, ""))
105 if (!cbox_check_fb_channel(fb
, cmd
->command
, error
))
107 if (!cbox_execute_on(fb
, NULL
, "/default_group", "o", error
, program
->default_group
))
109 return return_layers(program
->groups
, "/group", fb
, error
);
111 if (!strcmp(cmd
->command
, "/control_inits") && !strcmp(cmd
->arg_types
, ""))
113 if (!cbox_check_fb_channel(fb
, cmd
->command
, error
))
115 for (GSList
*p
= program
->ctrl_init_list
; p
; p
= p
->next
)
117 const struct sampler_ctrlinit
*cin
= (const struct sampler_ctrlinit
*)&p
->data
;
118 if (!cbox_execute_on(fb
, NULL
, "/control_init", "ii", error
, (int)cin
->controller
, (int)cin
->value
))
123 if (!strcmp(cmd
->command
, "/add_control_init") && !strcmp(cmd
->arg_types
, "ii"))
125 sampler_program_add_controller_init(program
, CBOX_ARG_I(cmd
, 0), CBOX_ARG_I(cmd
, 1));
128 if (!strcmp(cmd
->command
, "/delete_control_init") && !strcmp(cmd
->arg_types
, "ii"))
130 sampler_program_remove_controller_init(program
, CBOX_ARG_I(cmd
, 0), CBOX_ARG_I(cmd
, 1));
133 if (!strcmp(cmd
->command
, "/new_group") && !strcmp(cmd
->arg_types
, ""))
135 struct sampler_layer
*l
= sampler_layer_new(program
->module
, program
, NULL
);
136 sampler_program_add_group(program
, l
);
137 return cbox_execute_on(fb
, NULL
, "/uuid", "o", error
, l
);
139 if (!strcmp(cmd
->command
, "/clone_to") && !strcmp(cmd
->arg_types
, "si"))
141 struct cbox_instrument
*instrument
= (struct cbox_instrument
*)CBOX_ARG_O(cmd
, 0, program
, cbox_instrument
, error
);
144 struct cbox_module
*module
= instrument
->module
;
145 if (strcmp(module
->engine_name
, "sampler"))
147 g_set_error(error
, CBOX_MODULE_ERROR
, CBOX_MODULE_ERROR_FAILED
, "Cannot copy sampler program to module '%s' of type '%s'", module
->instance_name
, module
->engine_name
);
150 struct sampler_program
*prg
= sampler_program_clone(program
, (struct sampler_module
*)module
, CBOX_ARG_I(cmd
, 1), error
);
153 sampler_register_program((struct sampler_module
*)module
, prg
);
154 return cbox_execute_on(fb
, NULL
, "/uuid", "o", error
, prg
);
156 if (!strcmp(cmd
->command
, "/load_file") && !strcmp(cmd
->arg_types
, "si"))
158 if (!cbox_check_fb_channel(fb
, cmd
->command
, error
))
160 struct cbox_blob
*blob
= cbox_blob_new_from_file(program
->name
, program
->tarfile
, program
->sample_dir
, CBOX_ARG_S(cmd
, 0), CBOX_ARG_I(cmd
, 1), error
);
163 return cbox_execute_on(fb
, NULL
, "/data", "b", error
, blob
);
165 return cbox_object_default_process_cmd(ct
, fb
, cmd
, error
);
168 struct sampler_program
*sampler_program_new(struct sampler_module
*m
, int prog_no
, const char *name
, struct cbox_tarfile
*tarfile
, const char *sample_dir
, GError
**error
)
170 gchar
*perm_sample_dir
= g_strdup(sample_dir
);
171 if (!perm_sample_dir
)
174 struct cbox_document
*doc
= CBOX_GET_DOCUMENT(&m
->module
);
175 struct sampler_program
*prg
= malloc(sizeof(struct sampler_program
));
178 g_free(perm_sample_dir
);
181 memset(prg
, 0, sizeof(*prg
));
182 CBOX_OBJECT_HEADER_INIT(prg
, sampler_program
, doc
);
183 cbox_command_target_init(&prg
->cmd_target
, sampler_program_process_cmd
, prg
);
186 prg
->prog_no
= prog_no
;
187 prg
->name
= g_strdup(name
);
188 prg
->tarfile
= tarfile
;
189 prg
->source_file
= NULL
;
190 prg
->sample_dir
= perm_sample_dir
;
191 prg
->all_layers
= NULL
;
194 prg
->ctrl_init_list
= NULL
;
195 prg
->default_group
= sampler_layer_new(m
, prg
, NULL
);
196 prg
->deleting
= FALSE
;
198 CBOX_OBJECT_REGISTER(prg
);
202 struct sampler_program
*sampler_program_new_from_cfg(struct sampler_module
*m
, const char *cfg_section
, const char *name
, int pgm_id
, GError
**error
)
206 char *name2
= NULL
, *sfz_path
= NULL
, *spath
= NULL
, *tar_name
= NULL
;
207 const char *sfz
= NULL
;
208 struct cbox_tarfile
*tarfile
= NULL
;
210 g_clear_error(error
);
211 tar_name
= cbox_config_get_string(cfg_section
, "tar");
212 if (!strncmp(cfg_section
, "spgm:!", 6))
214 sfz
= cfg_section
+ 6;
215 if (!strncmp(sfz
, "sbtar:", 6))
218 gchar
*p
= strchr(sfz
+ 6, ';');
221 char *tmp
= g_strndup(sfz
+ 6, p
- sfz
- 6);
222 tarfile
= cbox_tarpool_get_tarfile(app
.tarpool
, tmp
, error
);
231 g_set_error(error
, CBOX_MODULE_ERROR
, CBOX_MODULE_ERROR_FAILED
, "Cannot load sampler program '%s' from section '%s': missing name of a file inside a tar archive", name
, cfg_section
);
237 name2
= strrchr(name
, '/');
246 tarfile
= cbox_tarpool_get_tarfile(app
.tarpool
, tar_name
, error
);
250 if (!sfz
&& !cbox_config_has_section(cfg_section
))
252 g_set_error(error
, CBOX_MODULE_ERROR
, CBOX_MODULE_ERROR_FAILED
, "Cannot load sampler program '%s' from section '%s': section not found", name
, cfg_section
);
255 name2
= cbox_config_get_string(cfg_section
, "name");
257 sfz_path
= cbox_config_get_string(cfg_section
, "sfz_path");
258 spath
= cbox_config_get_string(cfg_section
, "sample_path");
259 sfz
= cbox_config_get_string(cfg_section
, "sfz");
260 if (tarfile
&& !sfz_path
)
264 if (sfz
&& !sfz_path
&& !spath
&& !tarfile
)
266 char *lastslash
= strrchr(sfz
, '/');
267 if (lastslash
&& !sfz_path
&& !spath
)
269 char *tmp
= g_strndup(sfz
, lastslash
- sfz
);
270 sfz_path
= cbox_config_permify(tmp
);
276 struct sampler_program
*prg
= sampler_program_new(
278 pgm_id
!= -1 ? pgm_id
: cbox_config_get_int(cfg_section
, "program", 0),
279 name2
? name2
: name
,
281 spath
? spath
: (sfz_path
? sfz_path
: ""),
290 prg
->source_file
= g_build_filename(sfz_path
, sfz
, NULL
);
293 prg
->source_file
= g_strdup(sfz
);
296 if (sampler_module_load_program_sfz(m
, prg
, prg
->source_file
, FALSE
, error
))
305 gchar
*s
= g_strdup_printf("layer%d", 1 + i
);
306 const char *layer_section
= cbox_config_get_string(cfg_section
, s
);
310 where
= g_strdup_printf("slayer:%s", layer_section
);
312 prg
->source_file
= g_strdup_printf("config:%s", cfg_section
);
313 struct sampler_layer
*l
= sampler_layer_new_from_section(m
, prg
, where
);
315 g_warning("Sample layer '%s' cannot be created - skipping", layer_section
);
318 sampler_layer_update(l
);
319 if (!l
->data
.eff_waveform
)
320 g_warning("Sample layer '%s' does not have a waveform - skipping", layer_section
);
322 sampler_program_add_layer(prg
, l
);
326 prg
->all_layers
= g_slist_reverse(prg
->all_layers
);
327 sampler_program_update_layers(prg
);
331 void sampler_program_add_layer(struct sampler_program
*prg
, struct sampler_layer
*l
)
333 // Always call sampler_update_layer before sampler_program_add_layer.
335 prg
->all_layers
= g_slist_prepend(prg
->all_layers
, l
);
338 void sampler_program_delete_layer(struct sampler_program
*prg
, struct sampler_layer
*l
)
340 prg
->all_layers
= g_slist_remove(prg
->all_layers
, l
);
344 void sampler_program_add_group(struct sampler_program
*prg
, struct sampler_layer
*l
)
346 prg
->groups
= g_slist_prepend(prg
->groups
, l
);
349 void sampler_program_add_controller_init(struct sampler_program
*prg
, uint8_t controller
, uint8_t value
)
351 union sampler_ctrlinit_union u
;
353 u
.cinit
.controller
= controller
;
354 u
.cinit
.value
= value
;
355 prg
->ctrl_init_list
= g_slist_append(prg
->ctrl_init_list
, u
.ptr
);
358 void sampler_program_remove_controller_init(struct sampler_program
*prg
, uint8_t controller
, int which
)
360 for (GSList
**p
= &prg
->ctrl_init_list
; *p
; )
362 const struct sampler_ctrlinit
*cin
= (const struct sampler_ctrlinit
*)&(*p
)->data
;
363 if (cin
->controller
!= controller
)
370 GSList
*q
= (GSList
*)cbox_rt_swap_pointers(prg
->module
->module
.rt
, (void **)p
, (*p
)->next
);
377 void sampler_program_destroyfunc(struct cbox_objhdr
*hdr_ptr
)
379 struct sampler_program
*prg
= CBOX_H2O(hdr_ptr
);
380 sampler_unselect_program(prg
->module
, prg
);
383 sampler_rll_destroy(prg
->rll
);
386 for (GSList
*p
= prg
->all_layers
; p
; p
= g_slist_next(p
))
387 CBOX_DELETE((struct sampler_layer
*)p
->data
);
388 for (GSList
*p
= prg
->groups
; p
; p
= g_slist_next(p
))
389 CBOX_DELETE((struct sampler_layer
*)p
->data
);
390 CBOX_DELETE(prg
->default_group
);
393 g_free(prg
->sample_dir
);
394 g_free(prg
->source_file
);
395 g_slist_free(prg
->all_layers
);
396 g_slist_free(prg
->ctrl_init_list
);
398 cbox_tarpool_release_tarfile(app
.tarpool
, prg
->tarfile
);
402 void sampler_program_update_layers(struct sampler_program
*prg
)
404 struct sampler_module
*m
= prg
->module
;
405 struct sampler_rll
*new_rll
= sampler_rll_new_from_program(prg
);
406 struct sampler_rll
*old_rll
= cbox_rt_swap_pointers(m
->module
.rt
, (void **)&prg
->rll
, new_rll
);
408 sampler_rll_destroy(old_rll
);
411 static void add_child_layers_of_group(struct sampler_program
*newprg
, struct sampler_layer
*group
)
413 sampler_layer_update(group
);
416 g_hash_table_iter_init(&iter
, group
->child_layers
);
418 while(g_hash_table_iter_next(&iter
, &key
, &value
))
420 sampler_layer_reset_switches((struct sampler_layer
*)key
, newprg
->module
);
421 sampler_program_add_layer(newprg
, (struct sampler_layer
*)key
);
425 struct sampler_program
*sampler_program_clone(struct sampler_program
*prg
, struct sampler_module
*m
, int prog_no
, GError
**error
)
427 struct sampler_program
*newprg
= sampler_program_new(m
, prog_no
, prg
->name
, prg
->tarfile
, prg
->sample_dir
, error
);
430 if (prg
->source_file
)
431 newprg
->source_file
= g_strdup(prg
->source_file
);
432 // The values are stored as a union aliased with the data pointer, so no need to deep-copy
433 newprg
->ctrl_init_list
= g_slist_copy(prg
->ctrl_init_list
);
435 if (prg
->default_group
)
437 // XXXKF remove the original default group
438 newprg
->default_group
= sampler_layer_new_clone(prg
->default_group
, m
, newprg
, NULL
);
439 add_child_layers_of_group(newprg
, newprg
->default_group
);
441 newprg
->groups
= g_slist_copy(prg
->groups
);
442 for (GSList
*p
= newprg
->groups
; p
; p
= g_slist_next(p
))
444 struct sampler_layer
*l
= p
->data
;
445 l
= sampler_layer_new_clone(l
, m
, newprg
, NULL
);
447 add_child_layers_of_group(newprg
, l
);
449 sampler_program_update_layers(newprg
);
451 newprg
->tarfile
->refs
++;
456 /////////////////////////////////////////////////////////////////////////////////
458 struct sampler_rll
*sampler_rll_new_from_program(struct sampler_program
*prg
)
460 struct sampler_rll
*rll
= malloc(sizeof(struct sampler_rll
));
462 rll
->layers_release
= NULL
;
463 rll
->layers_oncc
= NULL
;
464 for (int i
= 0; i
< 4; i
++)
465 rll
->cc_trigger_bitmask
[i
] = 0;
467 for (GSList
*p
= prg
->all_layers
; p
; p
= g_slist_next(p
))
469 struct sampler_layer
*l
= p
->data
;
470 int cc
= l
->data
.on_cc_number
;
473 rll
->layers_oncc
= g_slist_prepend(rll
->layers_oncc
, l
);
474 rll
->cc_trigger_bitmask
[cc
>> 5] |= 1 << (cc
& 31);
476 else if (l
->data
.trigger
== stm_release
)
477 rll
->layers_release
= g_slist_prepend(rll
->layers_release
, l
);
479 rll
->layers
= g_slist_prepend(rll
->layers
, l
);
484 void sampler_rll_destroy(struct sampler_rll
*rll
)
486 g_slist_free(rll
->layers
);
487 g_slist_free(rll
->layers_release
);
488 g_slist_free(rll
->layers_oncc
);