void hoa_space_rotate_points(t_hoa_space *x, t_object *patcherview, t_pt pt, long modifiers) { double loudspeaker_angle = CICM_2PI / (double)x->f_number_of_microphones; double mapped_x = (pt.x - x->f_center.x) / x->f_center.x; double mapped_y = (pt.y - x->f_center.y) / x->f_center.y * -1.; double rotation = Tools::angle(mapped_x, mapped_y) - CICM_PI2; double offset = rotation - x->f_reference_angle; offset *= -1.; while(offset < 0.) offset += CICM_2PI; int nbDecalage = offset / loudspeaker_angle; double decimal = (offset - loudspeaker_angle * nbDecalage) / loudspeaker_angle; double newcoeff; int index1, index2; for(int i = 0; i < x->f_number_of_microphones; i++) { index1 = ((i + nbDecalage) + x->f_number_of_microphones) % x->f_number_of_microphones; index2 = ((i + 1 + nbDecalage) + x->f_number_of_microphones) % x->f_number_of_microphones; newcoeff = x->f_mode_values[index2] * decimal + x->f_mode_values[index1] * (1. - decimal); atom_setfloat(x->f_tempory_values+i ,newcoeff); } hoa_space_coefficients_set(x, NULL, x->f_number_of_microphones, x->f_tempory_values); hoa_space_output(x); }
void *hoa_space_new(t_symbol *s, int argc, t_atom *argv) { t_hoa_space *x = NULL; t_dictionary *d; long flags; long defc; t_atom *defv; x = (t_hoa_space *)object_alloc(hoa_space_class); if (x) { if (!(d = object_dictionaryarg(argc,argv))) return NULL; flags = 0 | JBOX_DRAWFIRSTIN | JBOX_DRAWINLAST | JBOX_TRANSPARENT | JBOX_GROWY | JBOX_DRAWBACKGROUND ; jbox_new((t_jbox *)x, 1, argc, argv); x->j_box.b_firstin = (t_object *)x; x->f_viewer = new AmbisonicViewer(1); x->f_recomposer = new AmbisonicRecomposer(1, 4); x->f_out = listout(x); x->f_number_of_microphones = 4; x->f_new_number = 4; x->f_defer = clock_new(x, (t_method)hoa_space_do_channels_set); attr_dictionary_process(x, d); binbuf_copy_atoms(d, gensym("@channels"), &defc, &defv); if(defc && defv) { x->f_new_number = Tools::clip(long(atom_getlong(defv)), (long)3, (long)MAX_CHANNELS); hoa_space_do_channels_set(x); defc = 0; free(defv); defv = NULL; } binbuf_copy_atoms(d, gensym("@coeffs"), &defc, &defv); if(defc && defv) { hoa_space_coefficients_set(x, NULL, defc, defv); defc = 0; free(defv); defv = NULL; } jbox_ready((t_jbox *)x); } return (x); }
void hoa_space_retract_points(t_hoa_space *x, t_object *patcherview, t_pt pt, long modifiers) { double mapped_x = (pt.x - x->f_center.x) / x->f_center.x; double mapped_y = (pt.y - x->f_center.y) / x->f_center.y * -1.; double radius = (Tools::radius(mapped_x, mapped_y) - (1. / 6.)) * (31. / 20.); double offset = x->f_retractation - radius; for(int i = 0; i < x->f_number_of_microphones; i++) atom_setfloat(x->f_tempory_values+i ,x->f_mode_values[i] - offset); hoa_space_coefficients_set(x, NULL, x->f_number_of_microphones, x->f_tempory_values); hoa_space_output(x); }
void hoa_space_draw_points(t_hoa_space *x, t_object *patcherview, t_pt pt, long modifiers) { double loudspeaker_angle = CICM_2PI / (double)x->f_number_of_microphones; double loudspeaker_angle_mid = loudspeaker_angle / 2.; double mapped_x = (pt.x - x->f_center.x); double mapped_y = (pt.y - x->f_center.y); double angle = Tools::radian_wrap(Tools::angle(mapped_x, -mapped_y) - CICM_PI2); double radius = Tools::radius(mapped_x, mapped_y); if(radius < x->f_radius_circle) { if(angle > CICM_2PI - loudspeaker_angle_mid || angle < loudspeaker_angle_mid) atom_setfloat(x->f_tempory_values, 0.); else { for(int i = 1; i < x->f_number_of_microphones; i++) { if(angle > i * loudspeaker_angle - loudspeaker_angle_mid && angle < i * loudspeaker_angle + loudspeaker_angle_mid) atom_setfloat(x->f_tempory_values+i, 0.); } } } else { double center_x = Tools::abscissa(x->f_radius_circle, angle - CICM_PI2 + CICM_PI); mapped_x = mapped_x - center_x; double center_y = Tools::ordinate(x->f_radius_circle, angle - CICM_PI2 + CICM_PI); mapped_y = -mapped_y - center_y; double radius = Tools::radius(mapped_x, mapped_y) / (4. * x->f_radius_circle); if(angle > CICM_2PI - loudspeaker_angle_mid || angle < loudspeaker_angle_mid) atom_setfloat(x->f_tempory_values, radius); else { for(int i = 1; i < x->f_number_of_microphones; i++) { if(angle > i * loudspeaker_angle - loudspeaker_angle_mid && angle < i * loudspeaker_angle + loudspeaker_angle_mid) atom_setfloat(x->f_tempory_values+i, radius); } } } hoa_space_coefficients_set(x, NULL, x->f_number_of_microphones, x->f_tempory_values); hoa_space_output(x); }
void hoa_space_do_channels_set(t_hoa_space *x) { long order; delete x->f_viewer; delete x->f_recomposer; x->f_number_of_microphones = x->f_new_number; if(x->f_number_of_microphones % 2 == 0) order = (x->f_number_of_microphones - 2) / 2; else order = (x->f_number_of_microphones - 1) / 2; x->f_viewer = new AmbisonicViewer(order); x->f_recomposer = new AmbisonicRecomposer(order, x->f_number_of_microphones, Hoa_Fixe); hoa_space_coefficients_set(x, NULL, 0, NULL); jbox_redraw((t_jbox *)x); }
void hoa_space_do_channels_set(t_hoa_space *x) { long order; delete x->f_viewer; delete x->f_recomposer; x->f_number_of_microphones = x->f_new_number; if(x->f_number_of_microphones % 2 == 0) order = (x->f_number_of_microphones - 2) / 2; else order = (x->f_number_of_microphones - 1) / 2; x->f_viewer = new AmbisonicViewer(order); x->f_recomposer = new AmbisonicRecomposer(order, x->f_number_of_microphones, Hoa_Fixe); hoa_space_coefficients_set(x, NULL, 0, NULL); ebox_invalidate_layer((t_ebox *)x, gensym("background_layer")); ebox_invalidate_layer((t_ebox *)x, gensym("microphones_layer")); ebox_invalidate_layer((t_ebox *)x, gensym("center_layer")); ebox_invalidate_layer((t_ebox *)x, gensym("harmonics_layer")); ebox_redraw((t_ebox *)x); }