void irmeasure_sweep(t_irmeasure *x, t_symbol *sym, long argc, t_atom *argv) { t_ess sweep_params; double f1 = 20.0; double f2 = sys_getsr() / 2.0; double length = 30000.0; double fade_in = 50.0; double fade_out = 10.0; double out_length = 5000.0; long num_active_ins = x->num_active_ins; long num_active_outs = x->num_active_outs; AH_SIntPtr mem_size; // Load parameters if (argc > 0) f1 = atom_getfloat(argv++); if (argc > 1) f2 = atom_getfloat(argv++); if (argc > 2) length = atom_getfloat(argv++); if (argc > 3) fade_in = atom_getfloat(argv++); if (argc > 4) fade_out = atom_getfloat(argv++); if (argc > 5) out_length = atom_getfloat(argv++); // Check parameters f1 = irmeasure_param_check(x, "low frequency", f1, 0.0001, x->sample_rate / 2.0); f2 = irmeasure_param_check(x, "high frequency", f2, f2, x->sample_rate / 2.0); length = irmeasure_param_check(x, "length", length, 0.0, HUGE_VAL); fade_in = irmeasure_param_check(x, "fade in time", fade_in, 0.0, length / 2.0); fade_out = irmeasure_param_check(x, "fade out time", fade_out, 0.0, length / 2.0); out_length = irmeasure_param_check(x, "ir length", out_length, 0.0, HUGE_VAL); // Store parameters x->lo_f = f1; x->hi_f = f2; x->fade_in = fade_in / 1000.0; x->fade_out = fade_out / 1000.0; x->length = length / 1000.0; x->out_length = out_length / 1000.0; // Check length of sweep and memory allocation if (ess_params(&sweep_params, x->lo_f, x->hi_f, x->fade_in, x->fade_out, x->length, x->sample_rate, db_to_a(x->amp), 0)) { mem_size = num_active_ins * irmeasure_calc_sweep_mem_size(&sweep_params, num_active_outs, x->out_length, x->sample_rate); if (!schedule_grow_mem_swap(&x->rec_mem, mem_size, mem_size)) object_error((t_object *) x, "not able to allocate adequate memory for recording"); // Get amplitude curve fill_amp_curve_specifier(x->amp_curve, x->amp_curve_specifier, x->amp_curve_num_specifiers); // Start measurement x->current_num_active_ins = num_active_ins; x->current_num_active_outs = num_active_outs; x->measure_mode = SWEEP; x->fft_size = 0; x->test_tone = 0; x->stop_measurement = 0; x->start_measurement = 1; } else { object_error((t_object *) x, "zero length sweep - requested length value is too small"); x->stop_measurement = 1; } }
void irextract_sweep (t_irextract *x, t_symbol *sym, long argc, t_atom *argv) { double f1 = 20; double f2 = 22050; double length = 30000; double fade_in = 50; double fade_out = 10; double out_length = 0; double sample_rate; double amp_curve[33]; t_atom_long num_channels = 1; t_symbol *rec_buffer = 0; // Load parameters if (argc > 0) { rec_buffer = atom_getsym(argv++); sample_rate = buffer_sample_rate(rec_buffer); f2 = sample_rate / 2.; } if (argc > 1) f1 = atom_getfloat(argv++); if (argc > 2) f2 = atom_getfloat(argv++); if (argc > 3) length = atom_getfloat(argv++); if (argc > 4) fade_in = atom_getfloat(argv++); if (argc > 5) fade_out = atom_getfloat(argv++); if (argc > 6) num_channels = atom_getlong(argv++); if (argc > 7) out_length = atom_getfloat(argv++); // Check parameters if (!rec_buffer) { object_error((t_object *)x, "no buffer given"); return; } f1 = irextract_param_check(x, "low frequency", f1, 0.0001, sample_rate / 2); f2 = irextract_param_check(x, "high frequency", f2, f2, sample_rate / 2); length = irextract_param_check(x, "length", length, 0., HUGE_VAL); fade_in = irextract_param_check(x, "fade in time", fade_in, 0., length / 2); fade_out = irextract_param_check(x, "fade out time", fade_out, 0., length / 2); num_channels = (t_atom_long) irextract_param_check(x, "number of channels", (double) num_channels, 1, HIRT_MAX_MEASURE_CHANS); x->out_length = irextract_param_check(x, "output length", out_length, 0., HUGE_VAL) / 1000.; // Check length of sweep and memory allocation fill_amp_curve_specifier(amp_curve, x->amp_curve_specifier, x->amp_curve_num_specifiers); if (ess_params(&x->sweep_params, f1, f2, fade_in / 1000., fade_out / 1000., length / 1000., sample_rate, db_to_a(x->amp), amp_curve)) { // Process x->measure_mode = SWEEP; irextract_process(x, rec_buffer, num_channels, sample_rate); } else object_error((t_object *) x, "zero length sweep - requested length value is too small"); }