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/>.
20 #include "sampler_prg.h"
21 #include "sfzloader.h"
25 CBOX_CLASS_DEFINITION_ROOT(sampler_program
)
27 GSList
*sampler_program_get_next_layer(struct sampler_program
*prg
, struct sampler_channel
*c
, GSList
*next_layer
, int note
, int vel
, float random
)
29 int ch
= (c
- c
->module
->channels
) + 1;
30 for(;next_layer
;next_layer
= g_slist_next(next_layer
))
32 struct sampler_layer
*lr
= next_layer
->data
;
33 struct sampler_layer_data
*l
= &lr
->data
;
38 if (note
>= l
->sw_lokey
&& note
<= l
->sw_hikey
)
41 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
)
43 if (!l
->eff_use_keyswitch
||
44 ((l
->sw_last
== -1 || l
->sw_last
== lr
->last_key
) &&
45 (l
->sw_down
== -1 || (c
->switchmask
[l
->sw_down
>> 5] & (1 << (l
->sw_down
& 31)))) &&
46 (l
->sw_up
== -1 || !(c
->switchmask
[l
->sw_up
>> 5] & (1 << (l
->sw_up
& 31)))) &&
47 (l
->sw_previous
== -1 || l
->sw_previous
== c
->previous_note
)))
49 gboolean play
= lr
->current_seq_position
== 1;
50 lr
->current_seq_position
++;
51 if (lr
->current_seq_position
>= l
->seq_length
)
52 lr
->current_seq_position
= 1;
61 static gboolean
return_layers(GSList
*layers
, const char *keyword
, struct cbox_command_target
*fb
, GError
**error
)
63 for (GSList
*p
= layers
; p
; p
= g_slist_next(p
))
65 if (!cbox_execute_on(fb
, NULL
, keyword
, "o", error
, p
->data
))
71 static gboolean
sampler_program_process_cmd(struct cbox_command_target
*ct
, struct cbox_command_target
*fb
, struct cbox_osc_command
*cmd
, GError
**error
)
73 struct sampler_program
*program
= ct
->user_data
;
74 if (!strcmp(cmd
->command
, "/status") && !strcmp(cmd
->arg_types
, ""))
76 if (!cbox_check_fb_channel(fb
, cmd
->command
, error
))
79 if (!(CBOX_OBJECT_DEFAULT_STATUS(program
, fb
, error
)))
83 if (!strcmp(cmd
->command
, "/regions") && !strcmp(cmd
->arg_types
, ""))
85 if (!cbox_check_fb_channel(fb
, cmd
->command
, error
))
87 return return_layers(program
->all_layers
, "/region", fb
, error
);
89 if (!strcmp(cmd
->command
, "/groups") && !strcmp(cmd
->arg_types
, ""))
91 if (!cbox_execute_on(fb
, NULL
, "/default_group", "o", error
, program
->default_group
))
93 if (!cbox_check_fb_channel(fb
, cmd
->command
, error
))
95 return return_layers(program
->groups
, "/group", fb
, error
);
97 if (!strcmp(cmd
->command
, "/new_group") && !strcmp(cmd
->arg_types
, ""))
99 struct sampler_layer
*l
= sampler_layer_new(program
->module
, program
, NULL
);
100 sampler_program_add_group(program
, l
);
101 return cbox_execute_on(fb
, NULL
, "/uuid", "o", error
, l
);
103 return cbox_object_default_process_cmd(ct
, fb
, cmd
, error
);
107 struct sampler_program
*sampler_program_new(struct sampler_module
*m
, int prog_no
, const char *name
, const char *sample_dir
)
109 struct cbox_document
*doc
= CBOX_GET_DOCUMENT(&m
->module
);
110 struct sampler_program
*prg
= malloc(sizeof(struct sampler_program
));
111 memset(prg
, 0, sizeof(*prg
));
112 CBOX_OBJECT_HEADER_INIT(prg
, sampler_program
, doc
);
113 cbox_command_target_init(&prg
->cmd_target
, sampler_program_process_cmd
, prg
);
116 prg
->prog_no
= prog_no
;
117 prg
->name
= g_strdup(name
);
118 prg
->sample_dir
= g_strdup(sample_dir
);
119 prg
->source_file
= NULL
;
120 prg
->all_layers
= NULL
;
123 prg
->default_group
= sampler_layer_new(m
, prg
, NULL
);
124 prg
->deleting
= FALSE
;
125 CBOX_OBJECT_REGISTER(prg
);
129 struct sampler_program
*sampler_program_new_from_cfg(struct sampler_module
*m
, const char *cfg_section
, const char *name
, int pgm_id
, GError
**error
)
133 char *name2
= NULL
, *sfz_path
= NULL
, *spath
= NULL
;
134 const char *sfz
= NULL
;
136 g_clear_error(error
);
137 if (!strncmp(cfg_section
, "spgm:!", 6))
139 sfz
= cfg_section
+ 6;
140 name2
= strrchr(name
, '/');
146 if (!sfz
&& !cbox_config_has_section(cfg_section
))
148 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
);
151 name2
= cbox_config_get_string(cfg_section
, "name");
153 sfz_path
= cbox_config_get_string(cfg_section
, "sfz_path");
154 spath
= cbox_config_get_string(cfg_section
, "sample_path");
155 sfz
= cbox_config_get_string(cfg_section
, "sfz");
158 if (sfz
&& !sfz_path
&& !spath
)
160 char *lastslash
= strrchr(sfz
, '/');
161 if (lastslash
&& !sfz_path
&& !spath
)
163 char *tmp
= g_strndup(sfz
, lastslash
- sfz
);
164 sfz_path
= cbox_config_permify(tmp
);
170 struct sampler_program
*prg
= sampler_program_new(
172 pgm_id
!= -1 ? pgm_id
: cbox_config_get_int(cfg_section
, "program", 0),
173 name2
? name2
: name
,
174 spath
? spath
: (sfz_path
? sfz_path
: "")
180 prg
->source_file
= g_build_filename(sfz_path
, sfz
, NULL
);
183 prg
->source_file
= g_strdup(sfz
);
186 if (sampler_module_load_program_sfz(m
, prg
, prg
->source_file
, FALSE
, error
))
195 gchar
*s
= g_strdup_printf("layer%d", 1 + i
);
196 const char *layer_section
= cbox_config_get_string(cfg_section
, s
);
200 where
= g_strdup_printf("slayer:%s", layer_section
);
202 prg
->source_file
= g_strdup_printf("config:%s", cfg_section
);
203 struct sampler_layer
*l
= sampler_layer_new_from_section(m
, prg
, where
);
204 sampler_update_layer(m
, l
);
206 g_warning("Sample layer '%s' cannot be created - skipping", layer_section
);
207 else if (!l
->data
.waveform
)
208 g_warning("Sample layer '%s' does not have a waveform - skipping", layer_section
);
210 sampler_program_add_layer(prg
, l
);
213 prg
->all_layers
= g_slist_reverse(prg
->all_layers
);
214 sampler_update_program_layers(m
, prg
);
218 void sampler_program_add_layer(struct sampler_program
*prg
, struct sampler_layer
*l
)
220 // Always call sampler_update_layer before sampler_program_add_layer.
222 prg
->all_layers
= g_slist_prepend(prg
->all_layers
, l
);
225 void sampler_program_delete_layer(struct sampler_program
*prg
, struct sampler_layer
*l
)
227 prg
->all_layers
= g_slist_remove(prg
->all_layers
, l
);
231 void sampler_program_add_group(struct sampler_program
*prg
, struct sampler_layer
*l
)
233 prg
->groups
= g_slist_prepend(prg
->groups
, l
);
236 void sampler_program_destroyfunc(struct cbox_objhdr
*hdr_ptr
)
238 struct sampler_program
*prg
= CBOX_H2O(hdr_ptr
);
239 sampler_unselect_program(prg
->module
, prg
);
242 sampler_rll_destroy(prg
->rll
);
245 for (GSList
*p
= prg
->all_layers
; p
; p
= g_slist_next(p
))
246 CBOX_DELETE((struct sampler_layer
*)p
->data
);
247 for (GSList
*p
= prg
->groups
; p
; p
= g_slist_next(p
))
248 CBOX_DELETE((struct sampler_layer
*)p
->data
);
249 CBOX_DELETE(prg
->default_group
);
252 g_free(prg
->sample_dir
);
253 g_free(prg
->source_file
);
254 g_slist_free(prg
->all_layers
);
258 /////////////////////////////////////////////////////////////////////////////////
260 struct sampler_rll
*sampler_rll_new_from_program(struct sampler_program
*prg
)
262 struct sampler_rll
*rll
= malloc(sizeof(struct sampler_rll
));
264 rll
->layers_release
= NULL
;
266 for (GSList
*p
= prg
->all_layers
; p
; p
= g_slist_next(p
))
268 struct sampler_layer
*l
= p
->data
;
269 if (l
->data
.trigger
== stm_release
)
270 rll
->layers_release
= g_slist_prepend(rll
->layers_release
, l
);
272 rll
->layers
= g_slist_prepend(rll
->layers
, l
);
277 void sampler_rll_destroy(struct sampler_rll
*rll
)
279 g_slist_free(rll
->layers
);
280 g_slist_free(rll
->layers_release
);