You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
4.1 KiB
121 lines
4.1 KiB
3 years ago
|
/*
|
||
|
Calf Box, an open source musical instrument.
|
||
|
Copyright (C) 2010-2013 Krzysztof Foltman
|
||
|
|
||
|
This program is free software: you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation, either version 3 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
#ifndef CBOX_SAMPLER_PRG_H
|
||
|
#define CBOX_SAMPLER_PRG_H
|
||
|
|
||
|
#include "cmd.h"
|
||
|
#include "dom.h"
|
||
|
|
||
|
struct cbox_tarfile;
|
||
|
struct sampler_channel;
|
||
|
|
||
|
CBOX_EXTERN_CLASS(sampler_program)
|
||
|
|
||
|
#define MAX_MIDI_CURVES 32
|
||
|
|
||
|
struct sampler_keyswitch_group
|
||
|
{
|
||
|
uint8_t lo, hi, num_used, def_value;
|
||
|
uint32_t group_offset;
|
||
|
uint8_t key_offsets[];
|
||
|
};
|
||
|
|
||
|
// Runtime layer lists; in future, I might something more clever, like a tree
|
||
|
struct sampler_rll
|
||
|
{
|
||
|
GSList *layers_oncc;
|
||
|
uint32_t cc_trigger_bitmask[4]; // one bit per CC
|
||
|
uint8_t lokey, hikey;
|
||
|
uint8_t ranges_by_key[128];
|
||
|
uint32_t layers_by_range_count;
|
||
|
GSList **layers_by_range, **release_layers_by_range;
|
||
|
struct sampler_keyswitch_group **keyswitch_groups;
|
||
|
uint32_t keyswitch_group_count;
|
||
|
uint32_t keyswitch_key_count;
|
||
|
gboolean has_release_layers;
|
||
|
};
|
||
|
|
||
|
struct sampler_rll_iterator
|
||
|
{
|
||
|
struct sampler_channel *channel;
|
||
|
int note, vel;
|
||
|
float random;
|
||
|
gboolean is_first, is_release;
|
||
|
GSList *next_layer;
|
||
|
struct sampler_rll *rll;
|
||
|
uint32_t next_keyswitch_index;
|
||
|
};
|
||
|
|
||
|
struct sampler_ctrlinit
|
||
|
{
|
||
|
uint16_t controller;
|
||
|
uint8_t value;
|
||
|
};
|
||
|
|
||
|
union sampler_ctrlinit_union {
|
||
|
gpointer ptr;
|
||
|
struct sampler_ctrlinit cinit;
|
||
|
};
|
||
|
|
||
|
struct sampler_ctrllabel {
|
||
|
uint16_t controller;
|
||
|
gchar *label;
|
||
|
};
|
||
|
|
||
|
struct sampler_program
|
||
|
{
|
||
|
CBOX_OBJECT_HEADER()
|
||
|
struct cbox_command_target cmd_target;
|
||
|
|
||
|
struct sampler_module *module;
|
||
|
gchar *name;
|
||
|
int prog_no;
|
||
|
struct sampler_layer *global;
|
||
|
GSList *all_layers;
|
||
|
GSList *ctrl_init_list;
|
||
|
GSList *ctrl_label_list;
|
||
|
struct sampler_rll *rll;
|
||
|
gchar *sample_dir; // can be empty, cannot be NULL
|
||
|
gchar *source_file; // can be empty, cannot be NULL
|
||
|
int in_use;
|
||
|
struct cbox_tarfile *tarfile;
|
||
|
gboolean deleting;
|
||
|
struct sampler_midi_curve *curves[MAX_MIDI_CURVES];
|
||
|
float *interpolated_curves[MAX_MIDI_CURVES];
|
||
|
};
|
||
|
|
||
|
extern struct sampler_rll *sampler_rll_new_from_program(struct sampler_program *prg);
|
||
|
extern void sampler_rll_destroy(struct sampler_rll *rll);
|
||
|
|
||
|
extern void sampler_rll_iterator_init(struct sampler_rll_iterator *iter, struct sampler_rll *rll, struct sampler_channel *c, int note, int vel, float random, gboolean is_first, gboolean is_release);
|
||
|
extern struct sampler_layer *sampler_rll_iterator_next(struct sampler_rll_iterator *iter);
|
||
|
|
||
|
extern 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);
|
||
|
extern struct sampler_program *sampler_program_new_from_cfg(struct sampler_module *m, const char *cfg_section, const char *name, int pgm_id, GError **error);
|
||
|
extern void sampler_program_add_layer(struct sampler_program *prg, struct sampler_layer *l);
|
||
|
extern void sampler_program_delete_layer(struct sampler_program *prg, struct sampler_layer *l);
|
||
|
extern void sampler_program_add_group(struct sampler_program *prg, struct sampler_layer *l);
|
||
|
extern void sampler_program_add_controller_init(struct sampler_program *prg, uint16_t controller, uint8_t value);
|
||
|
extern void sampler_program_add_controller_label(struct sampler_program *prg, uint16_t controller, gchar *label); // keeps ownership
|
||
|
extern void sampler_program_remove_controller_init(struct sampler_program *prg, uint16_t controller, int which);
|
||
|
extern void sampler_program_update_layers(struct sampler_program *prg);
|
||
|
extern struct sampler_program *sampler_program_clone(struct sampler_program *prg, struct sampler_module *m, int prog_no, GError **error);
|
||
|
|
||
|
#endif
|