Ignore JACK port connection failures due to connection already existing.
[calfbox.git] / sampler_prg.c
bloba3012f6b5ed4f67be465f0b560defefa44eac887
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 "sampler.h"
20 #include "sampler_prg.h"
21 #include "sfzloader.h"
23 #include <assert.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;
34 if (!l->waveform)
35 continue;
36 if (l->sw_last != -1)
38 if (note >= l->sw_lokey && note <= l->sw_hikey)
39 lr->last_key = note;
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;
53 if (play)
54 return next_layer;
58 return NULL;
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))
66 return FALSE;
68 return TRUE;
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))
77 return FALSE;
79 if (!(CBOX_OBJECT_DEFAULT_STATUS(program, fb, error)))
80 return FALSE;
81 return TRUE;
83 if (!strcmp(cmd->command, "/regions") && !strcmp(cmd->arg_types, ""))
85 if (!cbox_check_fb_channel(fb, cmd->command, error))
86 return FALSE;
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))
92 return FALSE;
93 if (!cbox_check_fb_channel(fb, cmd->command, error))
94 return FALSE;
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);
115 prg->module = m;
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;
121 prg->rll = NULL;
122 prg->groups = NULL;
123 prg->default_group = sampler_layer_new(m, prg, NULL);
124 prg->deleting = FALSE;
125 CBOX_OBJECT_REGISTER(prg);
126 return 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)
131 int i;
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, '/');
141 if (name2)
142 name2++;
144 else
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);
149 return FALSE;
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);
165 g_free(tmp);
166 sfz = lastslash + 1;
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 : "")
177 if (sfz)
179 if (sfz_path)
180 prg->source_file = g_build_filename(sfz_path, sfz, NULL);
181 else
183 prg->source_file = g_strdup(sfz);
186 if (sampler_module_load_program_sfz(m, prg, prg->source_file, FALSE, error))
187 return prg;
188 CBOX_DELETE(prg);
189 return NULL;
192 for (i = 0; ; i++)
194 char *where = NULL;
195 gchar *s = g_strdup_printf("layer%d", 1 + i);
196 const char *layer_section = cbox_config_get_string(cfg_section, s);
197 g_free(s);
198 if (!layer_section)
199 break;
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);
205 if (!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);
209 else
210 sampler_program_add_layer(prg, l);
211 g_free(where);
213 prg->all_layers = g_slist_reverse(prg->all_layers);
214 sampler_update_program_layers(m, prg);
215 return 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.
221 assert(l->runtime);
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);
240 if (prg->rll)
242 sampler_rll_destroy(prg->rll);
243 prg->rll = NULL;
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);
251 g_free(prg->name);
252 g_free(prg->sample_dir);
253 g_free(prg->source_file);
254 g_slist_free(prg->all_layers);
255 free(prg);
258 /////////////////////////////////////////////////////////////////////////////////
260 struct sampler_rll *sampler_rll_new_from_program(struct sampler_program *prg)
262 struct sampler_rll *rll = malloc(sizeof(struct sampler_rll));
263 rll->layers = NULL;
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);
271 else
272 rll->layers = g_slist_prepend(rll->layers, l);
274 return rll;
277 void sampler_rll_destroy(struct sampler_rll *rll)
279 g_slist_free(rll->layers);
280 g_slist_free(rll->layers_release);
281 free(rll);