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 #ifndef CBOX_SAMPLER_H
20 #define CBOX_SAMPLER_H
22 #include "biquad-float.h"
25 #include "onepole-float.h"
26 #include "prefetch_pipe.h"
27 #include "sampler_layer.h"
28 #include "sampler_prg.h"
32 #define MAX_SAMPLER_VOICES 128
34 #define CBOX_SAMPLER_ERROR cbox_sampler_error_quark()
38 CBOX_SAMPLER_ERROR_FAILED
,
39 CBOX_SAMPLER_ERROR_INVALID_LAYER
,
40 CBOX_SAMPLER_ERROR_INVALID_WAVEFORM
,
41 CBOX_SAMPLER_ERROR_NO_PROGRAMS
44 struct sampler_noteinitfunc
;
47 #define GET_RT_FROM_sampler_channel(channel) ((channel)->module->module.rt)
49 struct sampler_channel
51 struct sampler_module
*module
;
53 uint32_t switchmask
[4];
54 uint32_t sustainmask
[4];
55 uint32_t sostenutomask
[4];
57 uint8_t cc
[smsrc_perchan_count
];
58 struct sampler_program
*program
;
59 struct sampler_voice
*voices_running
;
61 uint8_t prev_note_velocity
[128];
62 uint32_t prev_note_start_time
[128];
63 int channel_volume_cc
, channel_pan_cc
;
69 uint32_t phase
, delta
;
70 uint32_t age
, delay
, fade
;
75 enum sampler_player_type mode
;
79 uint64_t bigpos
, bigdelta
;
80 uint64_t virtpos
, virtdelta
;
81 uint32_t loop_start
, loop_end
;
82 uint32_t cur_sample_end
;
84 float last_lgain
, last_rgain
;
88 // In-memory mode only
89 uint32_t loop_overlap
;
90 float loop_overlap_step
;
91 float stretching_jump
;
92 float stretching_crossfade
;
93 uint32_t play_count
, loop_count
;
94 int16_t scratch_bandlimited
[2 * MAX_INTERPOLATION_ORDER
* 2];
96 // Streaming mode only
97 int16_t *streaming_buffer
;
98 uint32_t consumed
, consumed_credit
, streaming_buffer_frames
;
99 gboolean prefetch_only_loop
, in_streaming_buffer
;
104 struct sampler_voice
*prev
, *next
;
105 struct sampler_layer_data
*layer
;
106 // Note: may be NULL when program is being deleted
107 struct sampler_program
*program
;
108 struct cbox_waveform
*last_waveform
;
109 struct sampler_gen gen
;
110 struct cbox_prefetch_pipe
*current_pipe
;
113 int released
, released_with_sustain
, released_with_sostenuto
, captured_sostenuto
;
119 float gain_shift
, gain_fromvel
;
120 struct cbox_biquadf_state filter_left
, filter_right
;
121 struct cbox_biquadf_state filter_left2
, filter_right2
;
122 struct cbox_biquadf_coeffs filter_coeffs
, filter_coeffs_extra
;
123 struct cbox_onepolef_state onepole_left
, onepole_right
;
124 struct cbox_onepolef_coeffs onepole_coeffs
;
125 struct sampler_channel
*channel
;
126 struct cbox_envelope amp_env
, filter_env
, pitch_env
;
127 struct sampler_lfo amp_lfo
, filter_lfo
, pitch_lfo
;
128 enum sampler_loop_mode loop_mode
;
130 int send1bus
, send2bus
;
131 float send1gain
, send2gain
;
133 struct cbox_envelope_shape dyn_envs
[3]; // amp, filter, pitch
134 struct cbox_biquadf_state eq_left
[3], eq_right
[3];
135 struct cbox_biquadf_coeffs eq_coeffs
[3];
136 gboolean layer_changed
;
138 uint64_t last_level_min_rate
;
139 uint32_t last_eq_bitmask
;
144 struct sampler_module
146 struct cbox_module module
;
148 struct sampler_voice
*voices_free
, voices_all
[MAX_SAMPLER_VOICES
];
149 struct sampler_channel channels
[16];
150 struct sampler_program
**programs
;
152 int active_voices
, max_voices
;
154 int output_pairs
, aux_pairs
;
155 uint32_t current_time
;
157 int disable_mixer_controls
;
158 struct cbox_prefetch_stack
*pipe_stack
;
159 struct cbox_sincos sincos
[12800];
162 #define MAX_RELEASED_GROUPS 4
164 extern GQuark
cbox_sampler_error_quark(void);
166 extern void sampler_register_program(struct sampler_module
*m
, struct sampler_program
*pgm
);
167 extern gboolean
sampler_select_program(struct sampler_module
*m
, int channel
, const gchar
*preset
, GError
**error
);
168 extern void sampler_unselect_program(struct sampler_module
*m
, struct sampler_program
*prg
);
170 extern void sampler_channel_init(struct sampler_channel
*c
, struct sampler_module
*m
);
171 // This function may only be called from RT thread!
172 extern void sampler_channel_set_program_RT(struct sampler_channel
*c
, struct sampler_program
*prg
);
173 // ... and this one is RT-safe
174 extern void sampler_channel_set_program(struct sampler_channel
*c
, struct sampler_program
*prg
);
175 extern void sampler_channel_start_note(struct sampler_channel
*c
, int note
, int vel
, gboolean is_release_trigger
);
176 extern void sampler_channel_stop_note(struct sampler_channel
*c
, int note
, int vel
, gboolean is_polyaft
);
177 extern void sampler_channel_program_change(struct sampler_channel
*c
, int program
);
178 extern void sampler_channel_stop_sustained(struct sampler_channel
*c
);
179 extern void sampler_channel_stop_sostenuto(struct sampler_channel
*c
);
180 extern void sampler_channel_capture_sostenuto(struct sampler_channel
*c
);
181 extern void sampler_channel_release_groups(struct sampler_channel
*c
, int note
, int exgroups
[MAX_RELEASED_GROUPS
], int exgroupcount
);
182 extern void sampler_channel_stop_all(struct sampler_channel
*c
);
183 extern void sampler_channel_process_cc(struct sampler_channel
*c
, int cc
, int val
);
185 extern void sampler_voice_start(struct sampler_voice
*v
, struct sampler_channel
*c
, struct sampler_layer_data
*l
, int note
, int vel
, int *exgroups
, int *pexgroupcount
);
186 extern void sampler_voice_release(struct sampler_voice
*v
, gboolean is_polyaft
);
187 extern void sampler_voice_process(struct sampler_voice
*v
, struct sampler_module
*m
, cbox_sample_t
**outputs
);
188 extern void sampler_voice_link(struct sampler_voice
**pv
, struct sampler_voice
*v
);
189 extern void sampler_voice_unlink(struct sampler_voice
**pv
, struct sampler_voice
*v
);
190 extern void sampler_voice_inactivate(struct sampler_voice
*v
, gboolean expect_active
);
191 extern void sampler_voice_update_params_from_layer(struct sampler_voice
*v
);
193 extern float sampler_sine_wave
[2049];
195 static inline int sampler_channel_addcc(struct sampler_channel
*c
, int cc_no
)
197 return (((int)c
->cc
[cc_no
]) << 7) + c
->cc
[cc_no
+ 32];
200 #define FOREACH_VOICE(var, p) \
201 for (struct sampler_voice *p = (var), *p##_next = NULL; p && (p##_next = p->next, TRUE); p = p##_next)