1 #ifndef CLM_H 2 #define CLM_H 3 4 #define MUS_VERSION 6 5 #define MUS_REVISION 19 6 #define MUS_DATE "17-Nov-18" 7 8 /* isn't mus_env_interp backwards? */ 9 10 #include "sndlib.h" 11 12 #ifndef _MSC_VER 13 #include <sys/param.h> 14 #endif 15 #if HAVE_COMPLEX_TRIG 16 #include <complex.h> 17 #endif 18 19 #if(!defined(M_PI)) 20 #define M_PI 3.14159265358979323846264338327 21 #define M_PI_2 (M_PI / 2.0) 22 #endif 23 24 #define MUS_DEFAULT_SAMPLING_RATE 44100.0 25 #define MUS_DEFAULT_FILE_BUFFER_SIZE 8192 26 #define MUS_DEFAULT_ARRAY_PRINT_LENGTH 8 27 28 typedef enum {MUS_NOT_SPECIAL, MUS_SIMPLE_FILTER, MUS_FULL_FILTER, MUS_OUTPUT, MUS_INPUT, MUS_DELAY_LINE} mus_clm_extended_t; 29 30 typedef struct mus_any_class mus_any_class; 31 typedef struct { 32 struct mus_any_class *core; 33 } mus_any; 34 35 36 typedef enum {MUS_INTERP_NONE, MUS_INTERP_LINEAR, MUS_INTERP_SINUSOIDAL, MUS_INTERP_ALL_PASS, 37 MUS_INTERP_LAGRANGE, MUS_INTERP_BEZIER, MUS_INTERP_HERMITE} mus_interp_t; 38 39 typedef enum {MUS_RECTANGULAR_WINDOW, MUS_HANN_WINDOW, MUS_WELCH_WINDOW, MUS_PARZEN_WINDOW, MUS_BARTLETT_WINDOW, 40 MUS_HAMMING_WINDOW, MUS_BLACKMAN2_WINDOW, MUS_BLACKMAN3_WINDOW, MUS_BLACKMAN4_WINDOW, 41 MUS_EXPONENTIAL_WINDOW, MUS_RIEMANN_WINDOW, MUS_KAISER_WINDOW, MUS_CAUCHY_WINDOW, MUS_POISSON_WINDOW, 42 MUS_GAUSSIAN_WINDOW, MUS_TUKEY_WINDOW, MUS_DOLPH_CHEBYSHEV_WINDOW, MUS_HANN_POISSON_WINDOW, 43 MUS_CONNES_WINDOW, MUS_SAMARAKI_WINDOW, MUS_ULTRASPHERICAL_WINDOW, 44 MUS_BARTLETT_HANN_WINDOW, MUS_BOHMAN_WINDOW, MUS_FLAT_TOP_WINDOW, 45 MUS_BLACKMAN5_WINDOW, MUS_BLACKMAN6_WINDOW, MUS_BLACKMAN7_WINDOW, MUS_BLACKMAN8_WINDOW, MUS_BLACKMAN9_WINDOW, MUS_BLACKMAN10_WINDOW, 46 MUS_RV2_WINDOW, MUS_RV3_WINDOW, MUS_RV4_WINDOW, MUS_MLT_SINE_WINDOW, MUS_PAPOULIS_WINDOW, MUS_DPSS_WINDOW, MUS_SINC_WINDOW, 47 MUS_NUM_FFT_WINDOWS} mus_fft_window_t; 48 49 typedef enum {MUS_SPECTRUM_IN_DB, MUS_SPECTRUM_NORMALIZED, MUS_SPECTRUM_RAW} mus_spectrum_t; 50 typedef enum {MUS_CHEBYSHEV_EITHER_KIND, MUS_CHEBYSHEV_FIRST_KIND, MUS_CHEBYSHEV_SECOND_KIND, MUS_CHEBYSHEV_BOTH_KINDS} mus_polynomial_t; 51 52 #define MUS_MAX_CLM_SINC_WIDTH 65536 53 #define MUS_MAX_CLM_SRC 65536.0 54 55 56 /* this is internal -- for clm->clm2xen */ 57 typedef struct { 58 mus_any_class *core; 59 int chan; 60 mus_long_t loc; 61 char *file_name; 62 int chans; 63 mus_float_t **obufs; 64 mus_float_t *obuf0, *obuf1; 65 mus_long_t data_start, data_end; 66 mus_long_t out_end; 67 mus_sample_t output_sample_type; 68 mus_header_t output_header_type; 69 } rdout; 70 /* end internal stuff */ 71 72 73 #ifdef __cplusplus 74 extern "C" { 75 #endif 76 77 MUS_EXPORT void mus_initialize(void); 78 79 MUS_EXPORT int mus_make_generator_type(void); 80 81 MUS_EXPORT mus_any_class *mus_generator_class(mus_any *ptr); 82 MUS_EXPORT mus_any_class *mus_make_generator(int type, char *name, 83 void (*release)(mus_any *ptr), 84 char *(*describe)(mus_any *ptr), 85 bool (*equalp)(mus_any *gen1, mus_any *gen2)); 86 87 MUS_EXPORT void mus_generator_set_length(mus_any_class *p, mus_long_t (*length)(mus_any *ptr)); 88 MUS_EXPORT void mus_generator_set_scaler(mus_any_class *p, mus_float_t (*scaler)(mus_any *ptr)); 89 MUS_EXPORT void mus_generator_set_channels(mus_any_class *p, int (*channels)(mus_any *ptr)); 90 MUS_EXPORT void mus_generator_set_location(mus_any_class *p, mus_long_t (*location)(mus_any *ptr)); 91 MUS_EXPORT void mus_generator_set_set_location(mus_any_class *p, mus_long_t (*set_location)(mus_any *ptr, mus_long_t loc)); 92 MUS_EXPORT void mus_generator_set_channel(mus_any_class *p, int (*channel)(mus_any *ptr)); 93 MUS_EXPORT void mus_generator_set_file_name(mus_any_class *p, char *(*file_name)(mus_any *ptr)); 94 MUS_EXPORT void mus_generator_set_extended_type(mus_any_class *p, mus_clm_extended_t extended_type); 95 MUS_EXPORT void mus_generator_set_read_sample(mus_any_class *p, mus_float_t (*read_sample)(mus_any *ptr, mus_long_t samp, int chan)); 96 MUS_EXPORT void mus_generator_set_feeders(mus_any *g, 97 mus_float_t (*feed)(void *arg, int direction), 98 mus_float_t (*block_feed)(void *arg, int direction, mus_float_t *block, mus_long_t start, mus_long_t end)); 99 MUS_EXPORT void mus_generator_copy_feeders(mus_any *dest, mus_any *source); 100 101 MUS_EXPORT mus_float_t mus_radians_to_hz(mus_float_t radians); 102 MUS_EXPORT mus_float_t mus_hz_to_radians(mus_float_t hz); 103 MUS_EXPORT mus_float_t mus_degrees_to_radians(mus_float_t degrees); 104 MUS_EXPORT mus_float_t mus_radians_to_degrees(mus_float_t radians); 105 MUS_EXPORT mus_float_t mus_db_to_linear(mus_float_t x); 106 MUS_EXPORT mus_float_t mus_linear_to_db(mus_float_t x); 107 MUS_EXPORT mus_float_t mus_odd_multiple(mus_float_t x, mus_float_t y); 108 MUS_EXPORT mus_float_t mus_even_multiple(mus_float_t x, mus_float_t y); 109 MUS_EXPORT mus_float_t mus_odd_weight(mus_float_t x); 110 MUS_EXPORT mus_float_t mus_even_weight(mus_float_t x); 111 MUS_EXPORT const char *mus_interp_type_to_string(int type); 112 113 MUS_EXPORT mus_float_t mus_srate(void); 114 MUS_EXPORT mus_float_t mus_set_srate(mus_float_t val); 115 MUS_EXPORT mus_long_t mus_seconds_to_samples(mus_float_t secs); 116 MUS_EXPORT mus_float_t mus_samples_to_seconds(mus_long_t samps); 117 MUS_EXPORT int mus_array_print_length(void); 118 MUS_EXPORT int mus_set_array_print_length(int val); 119 MUS_EXPORT mus_float_t mus_float_equal_fudge_factor(void); 120 MUS_EXPORT mus_float_t mus_set_float_equal_fudge_factor(mus_float_t val); 121 122 MUS_EXPORT mus_float_t mus_ring_modulate(mus_float_t s1, mus_float_t s2); 123 MUS_EXPORT mus_float_t mus_amplitude_modulate(mus_float_t s1, mus_float_t s2, mus_float_t s3); 124 MUS_EXPORT mus_float_t mus_contrast_enhancement(mus_float_t sig, mus_float_t index); 125 MUS_EXPORT mus_float_t mus_dot_product(mus_float_t *data1, mus_float_t *data2, mus_long_t size); 126 #if HAVE_COMPLEX_TRIG 127 MUS_EXPORT complex double mus_edot_product(complex double freq, complex double *data, mus_long_t size); 128 #endif 129 130 MUS_EXPORT bool mus_arrays_are_equal(mus_float_t *arr1, mus_float_t *arr2, mus_float_t fudge, mus_long_t len); 131 MUS_EXPORT mus_float_t mus_polynomial(mus_float_t *coeffs, mus_float_t x, int ncoeffs); 132 MUS_EXPORT void mus_rectangular_to_polar(mus_float_t *rl, mus_float_t *im, mus_long_t size); 133 MUS_EXPORT void mus_rectangular_to_magnitudes(mus_float_t *rl, mus_float_t *im, mus_long_t size); 134 MUS_EXPORT void mus_polar_to_rectangular(mus_float_t *rl, mus_float_t *im, mus_long_t size); 135 MUS_EXPORT mus_float_t mus_array_interp(mus_float_t *wave, mus_float_t phase, mus_long_t size); 136 MUS_EXPORT mus_float_t mus_bessi0(mus_float_t x); 137 MUS_EXPORT mus_float_t mus_interpolate(mus_interp_t type, mus_float_t x, mus_float_t *table, mus_long_t table_size, mus_float_t y); 138 MUS_EXPORT bool mus_is_interp_type(int val); 139 MUS_EXPORT bool mus_is_fft_window(int val); 140 141 MUS_EXPORT int mus_sample_type_zero(mus_sample_t samp_type); 142 MUS_EXPORT mus_float_t (*mus_run_function(mus_any *g))(mus_any *gen, mus_float_t arg1, mus_float_t arg2); 143 MUS_EXPORT mus_float_t (*mus_run1_function(mus_any *g))(mus_any *gen, mus_float_t arg); 144 145 146 /* -------- generic functions -------- */ 147 148 MUS_EXPORT int mus_type(mus_any *ptr); 149 MUS_EXPORT void mus_free(mus_any *ptr); 150 MUS_EXPORT char *mus_describe(mus_any *gen); 151 MUS_EXPORT bool mus_equalp(mus_any *g1, mus_any *g2); 152 MUS_EXPORT mus_float_t mus_phase(mus_any *gen); 153 MUS_EXPORT mus_float_t mus_set_phase(mus_any *gen, mus_float_t val); 154 MUS_EXPORT mus_float_t mus_set_frequency(mus_any *gen, mus_float_t val); 155 MUS_EXPORT mus_float_t mus_frequency(mus_any *gen); 156 MUS_EXPORT mus_float_t mus_run(mus_any *gen, mus_float_t arg1, mus_float_t arg2); 157 MUS_EXPORT mus_long_t mus_length(mus_any *gen); 158 MUS_EXPORT mus_long_t mus_set_length(mus_any *gen, mus_long_t len); 159 MUS_EXPORT mus_long_t mus_order(mus_any *gen); 160 MUS_EXPORT mus_float_t *mus_data(mus_any *gen); 161 MUS_EXPORT mus_float_t *mus_set_data(mus_any *gen, mus_float_t *data); 162 MUS_EXPORT const char *mus_name(mus_any *ptr); 163 MUS_EXPORT mus_float_t mus_scaler(mus_any *gen); 164 MUS_EXPORT mus_float_t mus_set_scaler(mus_any *gen, mus_float_t val); 165 MUS_EXPORT mus_float_t mus_offset(mus_any *gen); 166 MUS_EXPORT mus_float_t mus_set_offset(mus_any *gen, mus_float_t val); 167 MUS_EXPORT mus_float_t mus_width(mus_any *gen); 168 MUS_EXPORT mus_float_t mus_set_width(mus_any *gen, mus_float_t val); 169 MUS_EXPORT char *mus_file_name(mus_any *ptr); 170 MUS_EXPORT void mus_reset(mus_any *ptr); 171 MUS_EXPORT mus_any *mus_copy(mus_any *gen); 172 MUS_EXPORT mus_float_t *mus_xcoeffs(mus_any *ptr); 173 MUS_EXPORT mus_float_t *mus_ycoeffs(mus_any *ptr); 174 MUS_EXPORT mus_float_t mus_xcoeff(mus_any *ptr, int index); 175 MUS_EXPORT mus_float_t mus_set_xcoeff(mus_any *ptr, int index, mus_float_t val); 176 MUS_EXPORT mus_float_t mus_ycoeff(mus_any *ptr, int index); 177 MUS_EXPORT mus_float_t mus_set_ycoeff(mus_any *ptr, int index, mus_float_t val); 178 MUS_EXPORT mus_float_t mus_increment(mus_any *rd); 179 MUS_EXPORT mus_float_t mus_set_increment(mus_any *rd, mus_float_t dir); 180 MUS_EXPORT mus_long_t mus_location(mus_any *rd); 181 MUS_EXPORT mus_long_t mus_set_location(mus_any *rd, mus_long_t loc); 182 MUS_EXPORT int mus_channel(mus_any *rd); 183 MUS_EXPORT int mus_channels(mus_any *ptr); 184 MUS_EXPORT int mus_position(mus_any *ptr); /* only C, envs (snd-env.c), shares slot with mus_channels */ 185 MUS_EXPORT int mus_interp_type(mus_any *ptr); 186 MUS_EXPORT mus_long_t mus_ramp(mus_any *ptr); 187 MUS_EXPORT mus_long_t mus_set_ramp(mus_any *ptr, mus_long_t val); 188 MUS_EXPORT mus_long_t mus_hop(mus_any *ptr); 189 MUS_EXPORT mus_long_t mus_set_hop(mus_any *ptr, mus_long_t val); 190 MUS_EXPORT mus_float_t mus_feedforward(mus_any *gen); 191 MUS_EXPORT mus_float_t mus_set_feedforward(mus_any *gen, mus_float_t val); 192 MUS_EXPORT mus_float_t mus_feedback(mus_any *rd); 193 MUS_EXPORT mus_float_t mus_set_feedback(mus_any *rd, mus_float_t dir); 194 195 MUS_EXPORT bool mus_phase_exists(mus_any *gen); 196 MUS_EXPORT bool mus_frequency_exists(mus_any *gen); 197 MUS_EXPORT bool mus_length_exists(mus_any *gen); 198 MUS_EXPORT bool mus_order_exists(mus_any *gen); 199 MUS_EXPORT bool mus_data_exists(mus_any *gen); 200 MUS_EXPORT bool mus_name_exists(mus_any *gen); 201 MUS_EXPORT bool mus_scaler_exists(mus_any *gen); 202 MUS_EXPORT bool mus_offset_exists(mus_any *gen); 203 MUS_EXPORT bool mus_width_exists(mus_any *gen); 204 MUS_EXPORT bool mus_file_name_exists(mus_any *gen); 205 MUS_EXPORT bool mus_xcoeffs_exists(mus_any *gen); 206 MUS_EXPORT bool mus_ycoeffs_exists(mus_any *gen); 207 MUS_EXPORT bool mus_increment_exists(mus_any *gen); 208 MUS_EXPORT bool mus_location_exists(mus_any *gen); 209 MUS_EXPORT bool mus_channel_exists(mus_any *gen); 210 MUS_EXPORT bool mus_channels_exists(mus_any *gen); 211 MUS_EXPORT bool mus_position_exists(mus_any *gen); 212 MUS_EXPORT bool mus_interp_type_exists(mus_any *gen); 213 MUS_EXPORT bool mus_ramp_exists(mus_any *gen); 214 MUS_EXPORT bool mus_hop_exists(mus_any *gen); 215 MUS_EXPORT bool mus_feedforward_exists(mus_any *gen); 216 MUS_EXPORT bool mus_feedback_exists(mus_any *gen); 217 218 219 /* -------- generators -------- */ 220 221 MUS_EXPORT mus_float_t mus_oscil(mus_any *o, mus_float_t fm, mus_float_t pm); 222 MUS_EXPORT mus_float_t mus_oscil_unmodulated(mus_any *ptr); 223 MUS_EXPORT mus_float_t mus_oscil_fm(mus_any *ptr, mus_float_t fm); 224 MUS_EXPORT mus_float_t mus_oscil_pm(mus_any *ptr, mus_float_t pm); 225 MUS_EXPORT bool mus_is_oscil(mus_any *ptr); 226 MUS_EXPORT mus_any *mus_make_oscil(mus_float_t freq, mus_float_t phase); 227 228 MUS_EXPORT bool mus_is_oscil_bank(mus_any *ptr); 229 MUS_EXPORT mus_float_t mus_oscil_bank(mus_any *ptr); 230 MUS_EXPORT mus_any *mus_make_oscil_bank(int size, mus_float_t *freqs, mus_float_t *phases, mus_float_t *amps, bool stable); 231 232 MUS_EXPORT mus_any *mus_make_ncos(mus_float_t freq, int n); 233 MUS_EXPORT mus_float_t mus_ncos(mus_any *ptr, mus_float_t fm); 234 MUS_EXPORT bool mus_is_ncos(mus_any *ptr); 235 236 MUS_EXPORT mus_any *mus_make_nsin(mus_float_t freq, int n); 237 MUS_EXPORT mus_float_t mus_nsin(mus_any *ptr, mus_float_t fm); 238 MUS_EXPORT bool mus_is_nsin(mus_any *ptr); 239 240 MUS_EXPORT mus_any *mus_make_nrxysin(mus_float_t frequency, mus_float_t y_over_x, int n, mus_float_t r); 241 MUS_EXPORT mus_float_t mus_nrxysin(mus_any *ptr, mus_float_t fm); 242 MUS_EXPORT bool mus_is_nrxysin(mus_any *ptr); 243 244 MUS_EXPORT mus_any *mus_make_nrxycos(mus_float_t frequency, mus_float_t y_over_x, int n, mus_float_t r); 245 MUS_EXPORT mus_float_t mus_nrxycos(mus_any *ptr, mus_float_t fm); 246 MUS_EXPORT bool mus_is_nrxycos(mus_any *ptr); 247 248 MUS_EXPORT mus_any *mus_make_rxykcos(mus_float_t freq, mus_float_t phase, mus_float_t r, mus_float_t ratio); 249 MUS_EXPORT mus_float_t mus_rxykcos(mus_any *ptr, mus_float_t fm); 250 MUS_EXPORT bool mus_is_rxykcos(mus_any *ptr); 251 252 MUS_EXPORT mus_any *mus_make_rxyksin(mus_float_t freq, mus_float_t phase, mus_float_t r, mus_float_t ratio); 253 MUS_EXPORT mus_float_t mus_rxyksin(mus_any *ptr, mus_float_t fm); 254 MUS_EXPORT bool mus_is_rxyksin(mus_any *ptr); 255 256 MUS_EXPORT mus_float_t mus_delay(mus_any *gen, mus_float_t input, mus_float_t pm); 257 MUS_EXPORT mus_float_t mus_delay_unmodulated(mus_any *ptr, mus_float_t input); 258 MUS_EXPORT mus_float_t mus_tap(mus_any *gen, mus_float_t loc); 259 MUS_EXPORT mus_float_t mus_tap_unmodulated(mus_any *gen); 260 MUS_EXPORT mus_any *mus_make_delay(int size, mus_float_t *line, int line_size, mus_interp_t type); 261 MUS_EXPORT bool mus_is_delay(mus_any *ptr); 262 MUS_EXPORT bool mus_is_tap(mus_any *ptr); 263 MUS_EXPORT mus_float_t mus_delay_tick(mus_any *ptr, mus_float_t input); 264 MUS_EXPORT mus_float_t mus_delay_unmodulated_noz(mus_any *ptr, mus_float_t input); 265 266 MUS_EXPORT mus_float_t mus_comb(mus_any *gen, mus_float_t input, mus_float_t pm); 267 MUS_EXPORT mus_float_t mus_comb_unmodulated(mus_any *gen, mus_float_t input); 268 MUS_EXPORT mus_any *mus_make_comb(mus_float_t scaler, int size, mus_float_t *line, int line_size, mus_interp_t type); 269 MUS_EXPORT bool mus_is_comb(mus_any *ptr); 270 MUS_EXPORT mus_float_t mus_comb_unmodulated_noz(mus_any *ptr, mus_float_t input); 271 272 MUS_EXPORT mus_float_t mus_comb_bank(mus_any *bank, mus_float_t inval); 273 MUS_EXPORT mus_any *mus_make_comb_bank(int size, mus_any **combs); 274 MUS_EXPORT bool mus_is_comb_bank(mus_any *g); 275 276 MUS_EXPORT mus_float_t mus_notch(mus_any *gen, mus_float_t input, mus_float_t pm); 277 MUS_EXPORT mus_float_t mus_notch_unmodulated(mus_any *gen, mus_float_t input); 278 MUS_EXPORT mus_any *mus_make_notch(mus_float_t scaler, int size, mus_float_t *line, int line_size, mus_interp_t type); 279 MUS_EXPORT bool mus_is_notch(mus_any *ptr); 280 281 MUS_EXPORT mus_float_t mus_all_pass(mus_any *gen, mus_float_t input, mus_float_t pm); 282 MUS_EXPORT mus_float_t mus_all_pass_unmodulated(mus_any *gen, mus_float_t input); 283 MUS_EXPORT mus_any *mus_make_all_pass(mus_float_t backward, mus_float_t forward, int size, mus_float_t *line, int line_size, mus_interp_t type); 284 MUS_EXPORT bool mus_is_all_pass(mus_any *ptr); 285 MUS_EXPORT mus_float_t mus_all_pass_unmodulated_noz(mus_any *ptr, mus_float_t input); 286 287 MUS_EXPORT mus_float_t mus_all_pass_bank(mus_any *bank, mus_float_t inval); 288 MUS_EXPORT mus_any *mus_make_all_pass_bank(int size, mus_any **combs); 289 MUS_EXPORT bool mus_is_all_pass_bank(mus_any *g); 290 291 MUS_EXPORT mus_any *mus_make_moving_average(int size, mus_float_t *line); 292 MUS_EXPORT mus_any *mus_make_moving_average_with_initial_sum(int size, mus_float_t *line, mus_float_t sum); 293 MUS_EXPORT bool mus_is_moving_average(mus_any *ptr); 294 MUS_EXPORT mus_float_t mus_moving_average(mus_any *ptr, mus_float_t input); 295 296 MUS_EXPORT mus_any *mus_make_moving_max(int size, mus_float_t *line); 297 MUS_EXPORT bool mus_is_moving_max(mus_any *ptr); 298 MUS_EXPORT mus_float_t mus_moving_max(mus_any *ptr, mus_float_t input); 299 300 MUS_EXPORT mus_any *mus_make_moving_norm(int size, mus_float_t *line, mus_float_t norm); 301 MUS_EXPORT bool mus_is_moving_norm(mus_any *ptr); 302 MUS_EXPORT mus_float_t mus_moving_norm(mus_any *ptr, mus_float_t input); 303 304 MUS_EXPORT mus_float_t mus_table_lookup(mus_any *gen, mus_float_t fm); 305 MUS_EXPORT mus_float_t mus_table_lookup_unmodulated(mus_any *gen); 306 MUS_EXPORT mus_any *mus_make_table_lookup(mus_float_t freq, mus_float_t phase, mus_float_t *wave, mus_long_t wave_size, mus_interp_t type); 307 MUS_EXPORT bool mus_is_table_lookup(mus_any *ptr); 308 MUS_EXPORT mus_float_t *mus_partials_to_wave(mus_float_t *partial_data, int partials, mus_float_t *table, mus_long_t table_size, bool normalize); 309 MUS_EXPORT mus_float_t *mus_phase_partials_to_wave(mus_float_t *partial_data, int partials, mus_float_t *table, mus_long_t table_size, bool normalize); 310 311 MUS_EXPORT mus_float_t mus_sawtooth_wave(mus_any *gen, mus_float_t fm); 312 MUS_EXPORT mus_any *mus_make_sawtooth_wave(mus_float_t freq, mus_float_t amp, mus_float_t phase); 313 MUS_EXPORT bool mus_is_sawtooth_wave(mus_any *gen); 314 315 MUS_EXPORT mus_float_t mus_square_wave(mus_any *gen, mus_float_t fm); 316 MUS_EXPORT mus_any *mus_make_square_wave(mus_float_t freq, mus_float_t amp, mus_float_t phase); 317 MUS_EXPORT bool mus_is_square_wave(mus_any *gen); 318 319 MUS_EXPORT mus_float_t mus_triangle_wave(mus_any *gen, mus_float_t fm); 320 MUS_EXPORT mus_any *mus_make_triangle_wave(mus_float_t freq, mus_float_t amp, mus_float_t phase); 321 MUS_EXPORT bool mus_is_triangle_wave(mus_any *gen); 322 MUS_EXPORT mus_float_t mus_triangle_wave_unmodulated(mus_any *ptr); 323 324 MUS_EXPORT mus_float_t mus_pulse_train(mus_any *gen, mus_float_t fm); 325 MUS_EXPORT mus_any *mus_make_pulse_train(mus_float_t freq, mus_float_t amp, mus_float_t phase); 326 MUS_EXPORT bool mus_is_pulse_train(mus_any *gen); 327 MUS_EXPORT mus_float_t mus_pulse_train_unmodulated(mus_any *ptr); 328 329 MUS_EXPORT void mus_set_rand_seed(uint64_t seed); 330 MUS_EXPORT uint64_t mus_rand_seed(void); 331 MUS_EXPORT mus_float_t mus_random(mus_float_t amp); 332 MUS_EXPORT mus_float_t mus_frandom(mus_float_t amp); 333 MUS_EXPORT int mus_irandom(int amp); 334 335 MUS_EXPORT mus_float_t mus_rand(mus_any *gen, mus_float_t fm); 336 MUS_EXPORT mus_any *mus_make_rand(mus_float_t freq, mus_float_t base); 337 MUS_EXPORT bool mus_is_rand(mus_any *ptr); 338 MUS_EXPORT mus_any *mus_make_rand_with_distribution(mus_float_t freq, mus_float_t base, mus_float_t *distribution, int distribution_size); 339 340 MUS_EXPORT mus_float_t mus_rand_interp(mus_any *gen, mus_float_t fm); 341 MUS_EXPORT mus_any *mus_make_rand_interp(mus_float_t freq, mus_float_t base); 342 MUS_EXPORT bool mus_is_rand_interp(mus_any *ptr); 343 MUS_EXPORT mus_any *mus_make_rand_interp_with_distribution(mus_float_t freq, mus_float_t base, mus_float_t *distribution, int distribution_size); 344 MUS_EXPORT mus_float_t mus_rand_interp_unmodulated(mus_any *ptr); 345 MUS_EXPORT mus_float_t mus_rand_unmodulated(mus_any *ptr); 346 347 MUS_EXPORT mus_float_t mus_asymmetric_fm(mus_any *gen, mus_float_t index, mus_float_t fm); 348 MUS_EXPORT mus_float_t mus_asymmetric_fm_unmodulated(mus_any *gen, mus_float_t index); 349 MUS_EXPORT mus_any *mus_make_asymmetric_fm(mus_float_t freq, mus_float_t phase, mus_float_t r, mus_float_t ratio); 350 MUS_EXPORT bool mus_is_asymmetric_fm(mus_any *ptr); 351 352 MUS_EXPORT mus_float_t mus_one_zero(mus_any *gen, mus_float_t input); 353 MUS_EXPORT mus_any *mus_make_one_zero(mus_float_t a0, mus_float_t a1); 354 MUS_EXPORT bool mus_is_one_zero(mus_any *gen); 355 356 MUS_EXPORT mus_float_t mus_one_pole(mus_any *gen, mus_float_t input); 357 MUS_EXPORT mus_any *mus_make_one_pole(mus_float_t a0, mus_float_t b1); 358 MUS_EXPORT bool mus_is_one_pole(mus_any *gen); 359 360 MUS_EXPORT mus_float_t mus_two_zero(mus_any *gen, mus_float_t input); 361 MUS_EXPORT mus_any *mus_make_two_zero(mus_float_t a0, mus_float_t a1, mus_float_t a2); 362 MUS_EXPORT bool mus_is_two_zero(mus_any *gen); 363 MUS_EXPORT mus_any *mus_make_two_zero_from_frequency_and_radius(mus_float_t frequency, mus_float_t radius); 364 365 MUS_EXPORT mus_float_t mus_two_pole(mus_any *gen, mus_float_t input); 366 MUS_EXPORT mus_any *mus_make_two_pole(mus_float_t a0, mus_float_t b1, mus_float_t b2); 367 MUS_EXPORT bool mus_is_two_pole(mus_any *gen); 368 MUS_EXPORT mus_any *mus_make_two_pole_from_frequency_and_radius(mus_float_t frequency, mus_float_t radius); 369 370 MUS_EXPORT mus_float_t mus_one_pole_all_pass(mus_any *f, mus_float_t input); 371 MUS_EXPORT mus_any *mus_make_one_pole_all_pass(int size, mus_float_t coeff); 372 MUS_EXPORT bool mus_is_one_pole_all_pass(mus_any *ptr); 373 374 MUS_EXPORT mus_float_t mus_formant(mus_any *ptr, mus_float_t input); 375 MUS_EXPORT mus_any *mus_make_formant(mus_float_t frequency, mus_float_t radius); 376 MUS_EXPORT bool mus_is_formant(mus_any *ptr); 377 MUS_EXPORT mus_float_t mus_set_formant_frequency(mus_any *ptr, mus_float_t freq_in_hz); 378 MUS_EXPORT void mus_set_formant_radius_and_frequency(mus_any *ptr, mus_float_t radius, mus_float_t frequency); 379 MUS_EXPORT mus_float_t mus_formant_with_frequency(mus_any *ptr, mus_float_t input, mus_float_t freq_in_radians); 380 381 MUS_EXPORT mus_float_t mus_formant_bank(mus_any *bank, mus_float_t inval); 382 MUS_EXPORT mus_float_t mus_formant_bank_with_inputs(mus_any *bank, mus_float_t *inval); 383 MUS_EXPORT mus_any *mus_make_formant_bank(int size, mus_any **formants, mus_float_t *amps); 384 MUS_EXPORT bool mus_is_formant_bank(mus_any *g); 385 386 MUS_EXPORT mus_float_t mus_firmant(mus_any *ptr, mus_float_t input); 387 MUS_EXPORT mus_any *mus_make_firmant(mus_float_t frequency, mus_float_t radius); 388 MUS_EXPORT bool mus_is_firmant(mus_any *ptr); 389 MUS_EXPORT mus_float_t mus_firmant_with_frequency(mus_any *ptr, mus_float_t input, mus_float_t freq_in_radians); 390 391 MUS_EXPORT mus_float_t mus_filter(mus_any *ptr, mus_float_t input); 392 MUS_EXPORT mus_any *mus_make_filter(int order, mus_float_t *xcoeffs, mus_float_t *ycoeffs, mus_float_t *state); 393 MUS_EXPORT bool mus_is_filter(mus_any *ptr); 394 395 MUS_EXPORT mus_float_t mus_fir_filter(mus_any *ptr, mus_float_t input); 396 MUS_EXPORT mus_any *mus_make_fir_filter(int order, mus_float_t *xcoeffs, mus_float_t *state); 397 MUS_EXPORT bool mus_is_fir_filter(mus_any *ptr); 398 399 MUS_EXPORT mus_float_t mus_iir_filter(mus_any *ptr, mus_float_t input); 400 MUS_EXPORT mus_any *mus_make_iir_filter(int order, mus_float_t *ycoeffs, mus_float_t *state); 401 MUS_EXPORT bool mus_is_iir_filter(mus_any *ptr); 402 MUS_EXPORT mus_float_t *mus_make_fir_coeffs(int order, mus_float_t *env, mus_float_t *aa); 403 404 MUS_EXPORT mus_float_t *mus_filter_set_xcoeffs(mus_any *ptr, mus_float_t *new_data); 405 MUS_EXPORT mus_float_t *mus_filter_set_ycoeffs(mus_any *ptr, mus_float_t *new_data); 406 MUS_EXPORT int mus_filter_set_order(mus_any *ptr, int order); 407 408 MUS_EXPORT mus_float_t mus_filtered_comb(mus_any *ptr, mus_float_t input, mus_float_t pm); 409 MUS_EXPORT mus_float_t mus_filtered_comb_unmodulated(mus_any *ptr, mus_float_t input); 410 MUS_EXPORT bool mus_is_filtered_comb(mus_any *ptr); 411 MUS_EXPORT mus_any *mus_make_filtered_comb(mus_float_t scaler, int size, mus_float_t *line, int line_size, mus_interp_t type, mus_any *filt); 412 413 MUS_EXPORT mus_float_t mus_filtered_comb_bank(mus_any *bank, mus_float_t inval); 414 MUS_EXPORT mus_any *mus_make_filtered_comb_bank(int size, mus_any **combs); 415 MUS_EXPORT bool mus_is_filtered_comb_bank(mus_any *g); 416 417 MUS_EXPORT mus_float_t mus_wave_train(mus_any *gen, mus_float_t fm); 418 MUS_EXPORT mus_float_t mus_wave_train_unmodulated(mus_any *gen); 419 MUS_EXPORT mus_any *mus_make_wave_train(mus_float_t freq, mus_float_t phase, mus_float_t *wave, mus_long_t wsize, mus_interp_t type); 420 MUS_EXPORT bool mus_is_wave_train(mus_any *gen); 421 422 MUS_EXPORT mus_float_t *mus_partials_to_polynomial(int npartials, mus_float_t *partials, mus_polynomial_t kind); 423 MUS_EXPORT mus_float_t *mus_normalize_partials(int num_partials, mus_float_t *partials); 424 425 MUS_EXPORT mus_any *mus_make_polyshape(mus_float_t frequency, mus_float_t phase, mus_float_t *coeffs, int size, int cheby_choice); 426 MUS_EXPORT mus_float_t mus_polyshape(mus_any *ptr, mus_float_t index, mus_float_t fm); 427 MUS_EXPORT mus_float_t mus_polyshape_unmodulated(mus_any *ptr, mus_float_t index); 428 #define mus_polyshape_no_input(Obj) mus_polyshape(Obj, 1.0, 0.0) 429 MUS_EXPORT bool mus_is_polyshape(mus_any *ptr); 430 431 MUS_EXPORT mus_any *mus_make_polywave(mus_float_t frequency, mus_float_t *coeffs, int n, int cheby_choice); 432 MUS_EXPORT mus_any *mus_make_polywave_tu(mus_float_t frequency, mus_float_t *tcoeffs, mus_float_t *ucoeffs, int n); 433 MUS_EXPORT bool mus_is_polywave(mus_any *ptr); 434 MUS_EXPORT mus_float_t mus_polywave_unmodulated(mus_any *ptr); 435 MUS_EXPORT mus_float_t mus_polywave(mus_any *ptr, mus_float_t fm); 436 MUS_EXPORT mus_float_t mus_chebyshev_t_sum(mus_float_t x, int n, mus_float_t *tn); 437 MUS_EXPORT mus_float_t mus_chebyshev_u_sum(mus_float_t x, int n, mus_float_t *un); 438 MUS_EXPORT mus_float_t mus_chebyshev_tu_sum(mus_float_t x, int n, mus_float_t *tn, mus_float_t *un); 439 MUS_EXPORT mus_float_t (*mus_polywave_function(mus_any *g))(mus_any *gen, mus_float_t fm); 440 441 MUS_EXPORT mus_float_t mus_env(mus_any *ptr); 442 MUS_EXPORT mus_any *mus_make_env(mus_float_t *brkpts, int npts, mus_float_t scaler, mus_float_t offset, mus_float_t base, 443 mus_float_t duration, mus_long_t end, mus_float_t *odata); 444 MUS_EXPORT bool mus_is_env(mus_any *ptr); 445 MUS_EXPORT mus_float_t mus_env_interp(mus_float_t x, mus_any *env); 446 MUS_EXPORT mus_long_t *mus_env_passes(mus_any *gen); /* for Snd */ 447 MUS_EXPORT mus_float_t *mus_env_rates(mus_any *gen); /* for Snd */ 448 MUS_EXPORT mus_float_t mus_env_offset(mus_any *gen); /* for Snd */ 449 MUS_EXPORT mus_float_t mus_env_scaler(mus_any *gen); /* for Snd */ 450 MUS_EXPORT mus_float_t mus_env_initial_power(mus_any *gen); /* for Snd */ 451 MUS_EXPORT int mus_env_breakpoints(mus_any *gen); /* for Snd */ 452 MUS_EXPORT mus_float_t mus_env_any(mus_any *e, mus_float_t (*connect_points)(mus_float_t val)); 453 MUS_EXPORT mus_float_t (*mus_env_function(mus_any *g))(mus_any *gen); 454 455 MUS_EXPORT mus_any *mus_make_pulsed_env(mus_any *e, mus_any *p); 456 MUS_EXPORT bool mus_is_pulsed_env(mus_any *ptr); 457 MUS_EXPORT mus_float_t mus_pulsed_env(mus_any *pl, mus_float_t inval); 458 MUS_EXPORT mus_float_t mus_pulsed_env_unmodulated(mus_any *pl); 459 460 MUS_EXPORT bool mus_is_file_to_sample(mus_any *ptr); 461 MUS_EXPORT mus_any *mus_make_file_to_sample(const char *filename); 462 MUS_EXPORT mus_any *mus_make_file_to_sample_with_buffer_size(const char *filename, mus_long_t buffer_size); 463 MUS_EXPORT mus_float_t mus_file_to_sample(mus_any *ptr, mus_long_t samp, int chan); 464 465 MUS_EXPORT mus_float_t mus_readin(mus_any *rd); 466 MUS_EXPORT mus_any *mus_make_readin_with_buffer_size(const char *filename, int chan, mus_long_t start, int direction, mus_long_t buffer_size); 467 #define mus_make_readin(Filename, Chan, Start, Direction) mus_make_readin_with_buffer_size(Filename, Chan, Start, Direction, mus_file_buffer_size()) 468 MUS_EXPORT bool mus_is_readin(mus_any *ptr); 469 470 MUS_EXPORT bool mus_is_output(mus_any *ptr); 471 MUS_EXPORT bool mus_is_input(mus_any *ptr); 472 MUS_EXPORT mus_float_t mus_in_any(mus_long_t frample, int chan, mus_any *IO); 473 MUS_EXPORT bool mus_in_any_is_safe(mus_any *IO); 474 475 /* new 6.0 */ 476 MUS_EXPORT mus_float_t *mus_file_to_frample(mus_any *ptr, mus_long_t samp, mus_float_t *f); 477 MUS_EXPORT mus_any *mus_make_file_to_frample(const char *filename); 478 MUS_EXPORT bool mus_is_file_to_frample(mus_any *ptr); 479 MUS_EXPORT mus_any *mus_make_file_to_frample_with_buffer_size(const char *filename, mus_long_t buffer_size); 480 MUS_EXPORT mus_float_t *mus_frample_to_frample(mus_float_t *matrix, int mx_chans, mus_float_t *in_samps, int in_chans, mus_float_t *out_samps, int out_chans); 481 482 MUS_EXPORT bool mus_is_frample_to_file(mus_any *ptr); 483 MUS_EXPORT mus_float_t *mus_frample_to_file(mus_any *ptr, mus_long_t samp, mus_float_t *data); 484 MUS_EXPORT mus_any *mus_make_frample_to_file_with_comment(const char *filename, int chans, mus_sample_t samp_type, mus_header_t head_type, const char *comment); 485 #define mus_make_frample_to_file(Filename, Chans, SampType, HeadType) mus_make_frample_to_file_with_comment(Filename, Chans, SampType, HeadType, NULL) 486 MUS_EXPORT mus_any *mus_continue_frample_to_file(const char *filename); 487 488 MUS_EXPORT void mus_file_mix_with_reader_and_writer(mus_any *outf, mus_any *inf, 489 mus_long_t out_start, mus_long_t out_framples, mus_long_t in_start, 490 mus_float_t *mx, int mx_chans, mus_any ***envs); 491 MUS_EXPORT void mus_file_mix(const char *outfile, const char *infile, 492 mus_long_t out_start, mus_long_t out_framples, mus_long_t in_start, 493 mus_float_t *mx, int mx_chans, mus_any ***envs); 494 495 MUS_EXPORT bool mus_is_sample_to_file(mus_any *ptr); 496 MUS_EXPORT mus_any *mus_make_sample_to_file_with_comment(const char *filename, int out_chans, mus_sample_t samp_type, mus_header_t head_type, const char *comment); 497 #define mus_make_sample_to_file(Filename, Chans, SampType, HeadType) mus_make_sample_to_file_with_comment(Filename, Chans, SampType, HeadType, NULL) 498 MUS_EXPORT mus_float_t mus_sample_to_file(mus_any *ptr, mus_long_t samp, int chan, mus_float_t val); 499 MUS_EXPORT mus_any *mus_continue_sample_to_file(const char *filename); 500 MUS_EXPORT int mus_close_file(mus_any *ptr); 501 MUS_EXPORT mus_any *mus_sample_to_file_add(mus_any *out1, mus_any *out2); 502 503 MUS_EXPORT mus_float_t mus_out_any(mus_long_t frample, mus_float_t val, int chan, mus_any *IO); 504 MUS_EXPORT mus_float_t mus_safe_out_any_to_file(mus_long_t samp, mus_float_t val, int chan, mus_any *IO); 505 MUS_EXPORT bool mus_out_any_is_safe(mus_any *IO); 506 MUS_EXPORT mus_float_t mus_out_any_to_file(mus_any *ptr, mus_long_t samp, int chan, mus_float_t val); 507 508 MUS_EXPORT void mus_locsig(mus_any *ptr, mus_long_t loc, mus_float_t val); 509 MUS_EXPORT mus_any *mus_make_locsig(mus_float_t degree, mus_float_t distance, mus_float_t reverb, int chans, 510 mus_any *output, int rev_chans, mus_any *revput, mus_interp_t type); 511 MUS_EXPORT bool mus_is_locsig(mus_any *ptr); 512 MUS_EXPORT mus_float_t mus_locsig_ref(mus_any *ptr, int chan); 513 MUS_EXPORT mus_float_t mus_locsig_set(mus_any *ptr, int chan, mus_float_t val); 514 MUS_EXPORT mus_float_t mus_locsig_reverb_ref(mus_any *ptr, int chan); 515 MUS_EXPORT mus_float_t mus_locsig_reverb_set(mus_any *ptr, int chan, mus_float_t val); 516 MUS_EXPORT void mus_move_locsig(mus_any *ptr, mus_float_t degree, mus_float_t distance); 517 MUS_EXPORT mus_float_t *mus_locsig_outf(mus_any *ptr); 518 MUS_EXPORT mus_float_t *mus_locsig_revf(mus_any *ptr); 519 MUS_EXPORT void *mus_locsig_closure(mus_any *ptr); 520 MUS_EXPORT void mus_locsig_set_detour(mus_any *ptr, void (*detour)(mus_any *ptr, mus_long_t val)); 521 MUS_EXPORT int mus_locsig_channels(mus_any *ptr); 522 MUS_EXPORT int mus_locsig_reverb_channels(mus_any *ptr); 523 524 MUS_EXPORT bool mus_is_move_sound(mus_any *ptr); 525 MUS_EXPORT mus_float_t mus_move_sound(mus_any *ptr, mus_long_t loc, mus_float_t val); 526 MUS_EXPORT mus_any *mus_make_move_sound(mus_long_t start, mus_long_t end, int out_channels, int rev_channels, 527 mus_any *doppler_delay, mus_any *doppler_env, mus_any *rev_env, 528 mus_any **out_delays, mus_any **out_envs, mus_any **rev_envs, 529 int *out_map, mus_any *output, mus_any *revput, bool free_arrays, bool free_gens); 530 MUS_EXPORT mus_float_t *mus_move_sound_outf(mus_any *ptr); 531 MUS_EXPORT mus_float_t *mus_move_sound_revf(mus_any *ptr); 532 MUS_EXPORT void *mus_move_sound_closure(mus_any *ptr); 533 MUS_EXPORT void mus_move_sound_set_detour(mus_any *ptr, void (*detour)(mus_any *ptr, mus_long_t val)); 534 MUS_EXPORT int mus_move_sound_channels(mus_any *ptr); 535 MUS_EXPORT int mus_move_sound_reverb_channels(mus_any *ptr); 536 537 MUS_EXPORT mus_any *mus_make_src(mus_float_t (*input)(void *arg, int direction), mus_float_t srate, int width, void *closure); 538 MUS_EXPORT mus_any *mus_make_src_with_init(mus_float_t (*input)(void *arg, int direction), mus_float_t srate, int width, void *closure, void (*init)(void *p, mus_any *g)); 539 MUS_EXPORT mus_float_t mus_src(mus_any *srptr, mus_float_t sr_change, mus_float_t (*input)(void *arg, int direction)); 540 MUS_EXPORT bool mus_is_src(mus_any *ptr); 541 MUS_EXPORT mus_float_t *mus_src_20(mus_any *srptr, mus_float_t *in_data, mus_long_t dur); 542 MUS_EXPORT mus_float_t *mus_src_05(mus_any *srptr, mus_float_t *in_data, mus_long_t dur); 543 MUS_EXPORT void mus_src_to_buffer(mus_any *srptr, mus_float_t (*input)(void *arg, int direction), mus_float_t *out_data, mus_long_t dur); 544 MUS_EXPORT void mus_src_init(mus_any *ptr); 545 546 MUS_EXPORT bool mus_is_convolve(mus_any *ptr); 547 MUS_EXPORT mus_float_t mus_convolve(mus_any *ptr, mus_float_t (*input)(void *arg, int direction)); 548 MUS_EXPORT mus_any *mus_make_convolve(mus_float_t (*input)(void *arg, int direction), mus_float_t *filter, mus_long_t fftsize, mus_long_t filtersize, void *closure); 549 550 MUS_EXPORT mus_float_t *mus_spectrum(mus_float_t *rdat, mus_float_t *idat, mus_float_t *window, mus_long_t n, mus_spectrum_t type); 551 MUS_EXPORT void mus_fft(mus_float_t *rl, mus_float_t *im, mus_long_t n, int is); 552 MUS_EXPORT mus_float_t *mus_make_fft_window(mus_fft_window_t type, mus_long_t size, mus_float_t beta); 553 MUS_EXPORT mus_float_t *mus_make_fft_window_with_window(mus_fft_window_t type, mus_long_t size, mus_float_t beta, mus_float_t mu, mus_float_t *window); 554 MUS_EXPORT const char *mus_fft_window_name(mus_fft_window_t win); 555 MUS_EXPORT const char **mus_fft_window_names(void); 556 557 MUS_EXPORT mus_float_t *mus_autocorrelate(mus_float_t *data, mus_long_t n); 558 MUS_EXPORT mus_float_t *mus_correlate(mus_float_t *data1, mus_float_t *data2, mus_long_t n); 559 MUS_EXPORT mus_float_t *mus_convolution(mus_float_t *rl1, mus_float_t *rl2, mus_long_t n); 560 MUS_EXPORT void mus_convolve_files(const char *file1, const char *file2, mus_float_t maxamp, const char *output_file); 561 MUS_EXPORT mus_float_t *mus_cepstrum(mus_float_t *data, mus_long_t n); 562 563 MUS_EXPORT bool mus_is_granulate(mus_any *ptr); 564 MUS_EXPORT mus_float_t mus_granulate(mus_any *ptr, mus_float_t (*input)(void *arg, int direction)); 565 MUS_EXPORT mus_float_t mus_granulate_with_editor(mus_any *ptr, mus_float_t (*input)(void *arg, int direction), int (*edit)(void *closure)); 566 MUS_EXPORT mus_any *mus_make_granulate(mus_float_t (*input)(void *arg, int direction), 567 mus_float_t expansion, mus_float_t length, mus_float_t scaler, 568 mus_float_t hop, mus_float_t ramp, mus_float_t jitter, int max_size, 569 int (*edit)(void *closure), 570 void *closure); 571 MUS_EXPORT int mus_granulate_grain_max_length(mus_any *ptr); 572 MUS_EXPORT void mus_granulate_set_edit_function(mus_any *ptr, int (*edit)(void *closure)); 573 574 MUS_EXPORT mus_long_t mus_set_file_buffer_size(mus_long_t size); 575 MUS_EXPORT mus_long_t mus_file_buffer_size(void); 576 577 MUS_EXPORT mus_float_t mus_apply(mus_any *gen, mus_float_t f1, mus_float_t f2); 578 579 MUS_EXPORT bool mus_is_phase_vocoder(mus_any *ptr); 580 MUS_EXPORT mus_any *mus_make_phase_vocoder(mus_float_t (*input)(void *arg, int direction), 581 int fftsize, int overlap, int interp, 582 mus_float_t pitch, 583 bool (*analyze)(void *arg, mus_float_t (*input)(void *arg1, int direction)), 584 int (*edit)(void *arg), /* return value is ignored (int return type is intended to be consistent with granulate) */ 585 mus_float_t (*synthesize)(void *arg), 586 void *closure); 587 MUS_EXPORT mus_float_t mus_phase_vocoder(mus_any *ptr, mus_float_t (*input)(void *arg, int direction)); 588 MUS_EXPORT mus_float_t mus_phase_vocoder_with_editors(mus_any *ptr, 589 mus_float_t (*input)(void *arg, int direction), 590 bool (*analyze)(void *arg, mus_float_t (*input)(void *arg1, int direction)), 591 int (*edit)(void *arg), 592 mus_float_t (*synthesize)(void *arg)); 593 594 MUS_EXPORT mus_float_t *mus_phase_vocoder_amp_increments(mus_any *ptr); 595 MUS_EXPORT mus_float_t *mus_phase_vocoder_amps(mus_any *ptr); 596 MUS_EXPORT mus_float_t *mus_phase_vocoder_freqs(mus_any *ptr); 597 MUS_EXPORT mus_float_t *mus_phase_vocoder_phases(mus_any *ptr); 598 MUS_EXPORT mus_float_t *mus_phase_vocoder_phase_increments(mus_any *ptr); 599 600 601 MUS_EXPORT mus_any *mus_make_ssb_am(mus_float_t freq, int order); 602 MUS_EXPORT bool mus_is_ssb_am(mus_any *ptr); 603 MUS_EXPORT mus_float_t mus_ssb_am_unmodulated(mus_any *ptr, mus_float_t insig); 604 MUS_EXPORT mus_float_t mus_ssb_am(mus_any *ptr, mus_float_t insig, mus_float_t fm); 605 606 MUS_EXPORT void mus_clear_sinc_tables(void); 607 MUS_EXPORT void *mus_environ(mus_any *gen); 608 MUS_EXPORT void *mus_set_environ(mus_any *gen, void *e); 609 MUS_EXPORT mus_any *mus_bank_generator(mus_any *g, int i); 610 #ifdef __cplusplus 611 } 612 #endif 613 614 #endif 615 616 617 /* Change log. 618 * 619 * 17-Nov: changed rand seed unsigned long to uint64_t. 620 * 15-Jul-18: granulate method to set jitter (K Matheussen). 621 * -------- 622 * 22-Sep: removed clm_default_frequency. 623 * 3-Aug: mus_long_t is now int64_t. 624 * 18-Jul: mus_<method>_exists. 625 * 13-Jul: mus_run1_function. 626 * 11-Jul-17: removed *clm-default-frequency*. 627 * -------- 628 * 5-Aug: removed some now-obsolete mus_locsig functions. 629 * 5-Jul: added stable arg to mus_make_oscil_bank. 630 * 15-Feb: removed mus_set_name, changed mus_free to void. 631 * 31-Jan-15: removed mus_multiply_arrays. 632 * -------- 633 * 8-Nov: mus_copy, mus_bank_generator. 634 * 24-Oct: mus_generator_set_feeders. 635 * 10-Aug: data-format -> sample-type. 636 * 17-Apr: moving_norm generator. 637 * 14-Apr: mus_frame and mus_mixer removed, "frame" replaced by "frample" in IO functions. 638 * 11-Apr: mus_even|odd_weight|multiple. 639 * 9-Apr: deprecate mus_is_delay_line. 640 * 2-Apr: mus_make_moving_average_with_sum. 641 * 19-Mar: deprecate mus_make_env_with_length. 642 * 17-Feb-14: mus_*_p -> mus_is_*. 643 * -------- 644 * 7-Dec: mus_set_formant_frequency, mus_src_20 and mus_src_05 changed. Removed mus_in_any_from_file. 645 * 29-Nov: mus_make_polywave_tu. 646 * 11-Oct: mus_vector_to_file, mus_vector_mix. 647 * 19-Apr: rxyk!cos and rxyk!sin from generators.scm. 648 * 11-Apr: mus_tap_p as a better name for mus_delay_line_p. 649 * 27-Mar: comb-bank, all-pass-bank, filtered-comb-bank, pulsed-env, oscil-bank. 650 * 21-Mar: one-pole-all-pass generator. 651 * 14-Mar: formant-bank generator. 652 * removed mus_delay_tick_noz. 653 * 4-Mar: moving_max generator. 654 * removed the unstable filter check in make_two_pole. 655 * 21-Jan-13: changed mus_formant_bank parameters. 656 * -------- 657 * 22-Dec: removed all the safety settings. 658 * 15-Nov: removed mus_env_t, mus_env_type, and other recently deprecated stuff. 659 * 15-Jul: more changes for clm2xen. 660 * 4-July-12: moved various struct definitions to clm.c 661 * added accessors for mus_any_class etc. 662 * -------- 663 * 1-Sep: mus_type. 664 * 20-Aug: changed type of mus_locsig to void, added mus_locsig_function_reset. 665 * removed function-as-output-location from locsig et al. 666 * 14-Jul-11: removed pthread stuff. 667 * -------- 668 * 7-Mar-10: protect in-any and out-any from sample numbers less than 0. 669 * -------- 670 * 14-Oct: sine-summation, sum-of-sines, sum-of-cosines removed. 671 * 28-Aug: changed some fft-related sizes from int to mus_long_t. 672 * 17-Aug: mus_frame|mixer_copy|fill. 673 * 27-Jul: mus_float_t for Float, and mus_long_t for off_t. 674 * 15-Jun: mus_rectangular_to_magnitudes (polar, but ignore phases). 675 * 11-Jun: mus_cepstrum. 676 * 11-May: MUS_ENV_LINEAR and friends, also mus_env_linear|exponential. 677 * mus_frame_to_frame_mono|stereo. 678 * 12-Mar: sinc, papoulis and dpss (slepian windows). 679 * 1-Jan-09: added MUS_EXPORT. 680 * -------- 681 * 11-Dec: deprecated the sine-summation, sum-of-cosines, and sum-of-sines generators. 682 * 30-Oct: mus_sample_to_file_add. 683 * mus_describe once again allocates a fresh output string. 684 * finally removed sine-bank. 685 * 9-Oct: various thread-related internal changes. 686 * 14-Jul: mus_data_format_zero. 687 * 12-Jul: mus_interp_type_p and mus_fft_window_p for C++'s benefit. 688 * 1-July: mus-safety and various ints changed to mus_long_t. 689 * 20-Jun: support for pthreads. 690 * 16-Jun: changed init_mus_module to mus_initialize. 691 * 30-May: changed polyshape to use cos and added cheby_choice arg to mus_make_polyshape. 692 * 27-May: mus_waveshape retired -- generators.scm has a wrapper for it. 693 * clm_free, clm_realloc etc for rt work. 694 * mus_chebyshev_tu_sum. 695 * 25-May: mus_polywave algorithm changed. 696 * 17-May: mus_normalize_partials. 697 * 12-Apr: added choice arg to mus_make_polywave. 698 * 8-Apr: polywave uses sine-bank if highest harmonic out of Chebyshev range. 699 * 1-Mar: mus_set_name. 700 * 26-Feb: removed mus_cosines (use mus_length) 701 * 24-Feb: removed mus_make_env_with_start, added mus_make_env_with_length 702 * 20-Feb: clm 4: 703 * polywave for polyshape and waveshape. 704 * mus_formant_with_frequency. 705 * firmant generator. 706 * removed mus_formant_radius and mus_set_formant_radius. 707 * removed "gain" arg from mus_make_formant. 708 * reversed the order of the arguments to mus_make_formant. 709 * fixed long-standing bug in gain calculation in mus_formant. 710 * mus_env_any for arbitrary connecting functions. 711 * 15-Feb: nrxysin and nrxycos for sine-summation. 712 * 12-Feb: nsin for sum_of_sines, ncos for sum_of_cosines. 713 * 4-Feb: clm_default_frequency (clm2xen) and *clm-default-frequency* (ws.scm). 714 * 7-Jan-08: :dur replaced by :length in make-env. 715 * -------- 716 * 19-Oct: all *_0 *_1 *_2 names now use _fm|_pm|_unmodulated|_no_input. 717 * 17-Oct: replace some method macros with functions (def-clm-struct local methods need true names). 718 * 15-Oct: mus_oscil_1 -> _fm, _2->_pm. 719 * mus_phase_vocoder_outctr accessors changed to use mus_location. 720 * 11-Oct: changed default srate to 44100. 721 * 5-Oct: mus_oscil_2. 722 * 6-Sep: changed asymmetric-fm to use cos(sin) and added amplitude normalization. 723 * 6-Aug: mus_autocorrelate, mus_correlate. 724 * 3-Aug: blackman5..10 and Rife-Vincent (RV2..4 fft), mlt-sine windows. 725 * 16-July: removed start arg from mus_make_env (see mus_make_env_with_start). 726 * 5-July: changed some mus_float_ts to doubles in env funcs. 727 * exp envs now use repeated multiplies rather than direct exp call. 728 * 19-June: mus-increment on gens with a notion of frequency (phase increment); 729 * to make room for this, asymmetric-fm ratio and sine-summation b moved to mus-offset. 730 * 22-Feb: mus_big_fft and mus_spectrum_t. 731 * 21-Feb: mus_fft_window_name. 732 * 14-Feb-07: three more fft window choices. 733 * -------- 734 * 27-Nov: move-sound array access parallel to locsig. 735 * 22-Nov: had to add non-backwards-compatible reverb chans arg to mus_make_locsig. 736 * 21-Nov: mus_float_equal_fudge_factor, mus_arrays_are_equal. 737 * 30-July: renamed average to moving_average. 738 * 28-July: renamed make_ppolar and make_zpolar to make_two_pole|zero_from_radius_and_frequency. 739 * added mus_scaler and mus_frequency methods for two_pole and two_zero. 740 * 21-July: removed mus_wrapper field -- old way can't work since we need the original Xen object. 741 * 3-July: mus_move_sound (dlocsig) generator. 742 * changed return type of mus_locsig to float. 743 * 28-June: mus_filtered_comb generator. 744 * 8-May: mus_apply now takes 3 args: gen, two doubles (rather than bug-prone varargs). 745 * 1-Mar-06: granulate now has a local random number seed (settable via the mus-location method). 746 * -------- 747 * 20-Dec: samaraki and ultraspherical windows. 748 * this required a non-backwards-compatible additional argument in mus_make_fft_window_with_window. 749 * 1-Nov: mus_filter_set_x|ycoeffs, mus_filter_set_order (needed by Snd). 750 * 1-May: mus-scaler|feedback ok with delay and average. 751 * 18-Apr: mus_set_environ. 752 * 11-Apr: mus_mixer|frame_offset, mus_frame_scale (for higher level generic functions). 753 * 23-Mar: frame_to_frame arg interpretation changed. 754 * 21-Mar: mus_make_readin|file_to_sample|file_to_frame_with_buffer_size. 755 * 16-Mar: polyshape generator (waveshaper as polynomial + oscil) 756 * mus_chebyshev_first|second_kind. 757 * mus_partials_to_waveshape no longer normalizes the partials. 758 * 18-Feb: mus_interpolate. 759 * 14-Feb: deprecated mus_restart_env and mus_clear_filter_state. 760 * 7-Feb-05: mus_reset method, replaces mus_restart_env and mus_clear_filter_state. 761 * -------- 762 * 20-Dec: changed "jitter" handling if hop < .05 in granulate. 763 * 15-Dec: mus_generator? for type checks (clm2xen). 764 * 11-Sep: removed buffer generator. 765 * 6-Sep: removed mus_oscil_bank, mus_bank. 766 * 24-Aug: removed mus_inspect method -- overlaps mus_describe and is useless given gdb capabilities. 767 * 27-July: mus_granulate_with_editor and mus_phase_vocoder_with_editors. 768 * 21-July: edit-func as run-time arg to granulate (for CL/clm compatibility) 769 * 19-July: clm 3: 770 * deprecated mus_ina|b, mus-outa|b|c|d. 771 * mus_make_frame_to_file_with_comment, mus_mixer_scale, mus_make_frame|mixer_with_data. 772 * mus_make_scalar_mixer, mus_mixer_add, mus_continue_frame_to_file. 773 * changed pv_* to phase_vocoder_* 774 * 28-June: ssb_am + added fm arg (ssb_am_1 is the previous form). 775 * 21-June: wrapper method. 776 * 14-June: ssb_am generator. 777 * deprecated mus-a*|b*, replaced by mus-x|ycoeff. 778 * 9-June: mus_edot_product. 779 * 7-June: removed mus-x*|y* generic functions. 780 * 24-May: distribution arg to make-rand, make-rand-interp. 781 * 11-May: type arg to mus_make_table_lookup|wave_train, MUS_INTERP_NONE, MUS_INTERP_HERMITE. 782 * mus-interp-type. 783 * 10-May: changed MUS_LINEAR and MUS_SINUSOIDAL to MUS_INTERP_LINEAR and MUS_INTERP_SINUSOIDAL. 784 * mus-linear renamed mus-interp-linear, mus-sinusoidal renamed mus-interp-sinusoidal. 785 * added type arg to mus_make_delay|all_pass|comb|notch. 786 * added mus_delay_tick, all-pass delay line interpolation. 787 * 3-May: envelope arg to make-rand and make-rand-interp to give any arbitrary random number distribution. 788 * added mus_make_rand_with_distribution and mus_make_rand_interp_with_distribution. 789 * rand/rand-interp mus-data returns distribution (weight) function, mus-length its length. 790 * locsig mus-data returns output scalers, mus-xcoeffs returns reverb scalers 791 * 26-Apr: mus_sum_of_sines changed to mus_sine_bank. 792 * new mus_sum_of_sines parallels mus_sum_of_cosines. 793 * deprecated mus_sin. 794 * 14-Apr: changed "2" to "_to_" in several function names. 795 * 12-Apr: mus_average, mus_average_p, mus_make_average. 796 * 17-Mar: edit function added to mus_granulate. 797 * replaced MUS_DATA_POSITION with MUS_DATA_WRAPPER. 798 * 22-Jan: various "environ" variables renamed for Windows' benefit. 799 * 5-Jan-04: env_interp bugfix. 800 * -------- 801 * 29-Sep: removed length arg from spectrum in clm2xen. 802 * 24-Aug: changed mus_length|ramp|hop type to mus_long_t. 803 * 21-Aug: export MUS_INPUT and friends (needed for specialized INA handlers). 804 * 11-Aug: int -> bool. 805 * 7-Aug: removed mus_type. 806 * 20-July: more run methods. 807 * 15-July: linear->dB check for 0.0 arg. 808 * 27-June: mus_samples_to_seconds and mus_seconds_to_samples. 809 * 9-June: mus_mix_with_reader_and_writer. 810 * 27-May: bugfix: interpolating all-pass ("zall-pass") had an extra delay. 811 * 25-Apr: mus_spectrum and mus_convolution now return mus_float_t*. 812 * 9-Apr: removed MUS_HANNING_WINDOW (use MUS_HANN_WINDOW). 813 * 3-Mar: mus_delay_line_p for tap error checking. 814 * 27-Feb: mus_length for env -> original duration in samples. 815 * 21-Feb: mus_set_cosines added, mus_cosines moved to hop slot. 816 * mus_[set_]x1/x2/y1/y2. 817 * 10-Feb: mus_file_name moved into the mus_input|output structs. 818 * folded mus_input|output into mus_any. 819 * moved mus_frame|mixer declarations into clm.c. 820 * all mus_input|output|frame|mixer pointers->mus_any. 821 * all method void pointers->mus_any. 822 * 7-Feb: split strings out of clm2xen.c into clm-strings.h. 823 * 3-Feb: mus_offset for envs, mus_width for square_wave et al. 824 * new core class fields(10) for various methods. 825 * 7-Jan-03: mus_src with very large sr_change segfault bugfix. 826 * -------- 827 * 17-Dec: mus_env_offset|initial_power for Snd exp env optimizations. 828 * 13-Sep: mus_frandom and mus_irandom(for Snd optimizer). 829 * 19-Aug: changed internal phase-vocoder array accessor names 830 * 13-Aug: set!(*-ref) for frame, locsig, mixer, locsig-reverb. 831 * 29-Jul: various *_1 cases for the optimizer. 832 * 15-Jul: mus_continue_sample2file. 833 * 10-Jul: mus_file_name. 834 * 7-Jun: fftw support added. 835 * 31-May: changed mus_any_class. 836 * 3-May: many int->mus_long_t changes for large files. 837 * 8-Apr: off-by-1 env bug(Lisp/C are now identical), env_interp of exp env beyond end bugfix. 838 * 1-Apr: sine-summation n=0 bugfix. 839 * 27-Mar: negative degree locsig bugfix. 840 * 18-Mar: mus_move_locsig. 841 * 15-Mar: n-chan locsig(and reverb scalers), 'type' arg to mus_make_locsig. 842 * 6-Mar: mus_scaler in asymmetric-fm now refers to the "r" parameter, "a" in sine-summation. 843 * 5-Mar: dumb typo in asymmetric-fm generator fixed. 844 * 19-Feb: buffer reallocation redundant free bugfix. 845 * 25-Jan-02: mus_increment of env returns base. 846 * -------- 847 * 10-Dec: add outctr calls, phase-vocoder bugfixes, thanks to Scott Wilson. 848 * 21-Oct: fill in some set-data methods. 849 * 1-Sep: mus_polar2rectangular. 850 * 6-July: scm -> xen. 851 * 26-May: mus_rand_seed. 852 * 22-May: locsig reverb distance calc was upside down. 853 * 18-May: mus_describe and mus_inspect returned string should not be freed any more. 854 * 7-May: filled in some leftover equal_p methods. 855 * 1-Apr: mus_make_file2sample_with_comment and mus_length for file->sample/sample->file. 856 * mus_file_buffer_size. 857 * 26-Mar: extended_type field added to mus_any_class for more robust type checking. 858 * 16-Mar: mus_phase of env -> current_value. 859 * 28-Feb: added mus_position(currently only for envs). 860 * 8-Feb: clm2scm.h. 861 * 24-Jan: mus-bank in clm2scm. 862 * 5-Jan: clm2scm gens are applicable. 863 * 4-Jan: mus_bank. 864 * 2-Jan-01: mus_run method. 865 * -------- 866 * 28-Dec: mus_clear_filter_state and other minor tweaks for Snd. 867 * 28-Nov: Dolph-Chebyshev window(under HAVE_GSL flag -- needs complex trig support). 868 * 8-Nov: mus_clear_sinc_tables. 869 * 12-Oct: mus_formant_bank takes one input(can't remember why I had an array here) 870 * 27-Sep: mus_array_interp bugfix(imitates mus.lisp now). 871 * 18-Sep: clm now assumes it's used as a part of sndlib. 872 * 11-Sep: generalized set! to generic functions in clm2scm.c. 873 * 31-Aug: changed formant field setters(thanks to Anders Vinjar). 874 * 10-Aug: removed built-in setf support(clm2scm.c). 875 * 31-Jul: mus_granulate tries to protect against illegal length and ramp values. 876 * 24-Jul: mus_make_fir_coeffs. 877 * 20-Jul: sum_of_sines, atan2 to rectangular->polar, phase_vocoder gen. 878 * 22-June: made mus_bessi0 local again. 879 * 1-June: bugfixes for linuxppc 2000. 880 * 19-May: mus_apply. 881 * 8-May: added "const" and XEN_PROCEDURE_CAST(for c++), made mus_bessi0 global. 882 * 24-Apr: changed formant radius to match lisp version(it's now 1-old_radius) 883 * 20-Apr: mus_convolve_files 884 * 7-Apr: src width bug fixed 885 * 31-Mar: finally implemented set-location for envs. 886 * 14-Feb: buffer-full?. 887 * 1-Feb: removed mus_phasepartials2waveshape. 888 * 3-Jan-00: format and type args added to make_sample2file, 889 * mus_file_close. 890 * removed make_file_input and make_file_output. 891 * -------- 892 * 29-Dec: various bugfixes especially in envelope handlers. 893 * 19-Nov: mus_oscil_bank and mus_formant_bank. 894 * 5-Nov: mus_sin exported. 895 * 4-Oct:(scm) make-env arg order changed to reflect mus.lisp. 896 * 29-Sep: implemented mus-increment and mus-frequency for granulate(as in mus.lisp). 897 * clm's fft renamed mus-fft to avoid collision with snd's version. 898 * added max_size arg to make_granulate(to reflect mus.lisp). 899 * 25-Sep-99: added width arg to make_src -- forgot this somehow in first pass. 900 * decided to make mus_inspect return char* like mus_describe. 901 */ 902