static void knob_mousedrag(t_knob *x, t_object *patcherview, t_pt pt, long modifiers) { t_rect rect; ebox_get_rect_for_view((t_ebox *)x, &rect); if(x->f_circular) { const float size = rect.width * 0.5f; const float angle = pd_angle(pt.x - size, -(size - pt.y)); if(x->f_endless) { const float value = pd_wrap((angle - EPD_PI2) / EPD_2PI, 0.f, 1.f); if(ebox_parameter_isinverted((t_ebox *)x, 1)) { ebox_parameter_setvalue_normalized((t_ebox *)x, 1, 1.f - value, 1); } else { ebox_parameter_setvalue_normalized((t_ebox *)x, 1, value, 1); } } else { const float value = (pd_clip(pd_wrap((angle - EPD_PI2) / EPD_2PI, 0.f, 1.f), 0.125f, 0.875f) - 0.125f) / 0.75f; if(ebox_parameter_isinverted((t_ebox *)x, 1)) { ebox_parameter_setvalue_normalized((t_ebox *)x, 1, 1.f - value, 1); } else { ebox_parameter_setvalue_normalized((t_ebox *)x, 1, value, 1); } } knob_output(x); ebox_invalidate_layer((t_ebox *)x, cream_sym_needle_layer); ebox_redraw((t_ebox *)x); } else { const float current = ebox_parameter_getvalue_normalized((t_ebox *)x, 1); const float diff = (x->f_reference - pt.y) / (rect.width) * (ebox_parameter_isinverted((t_ebox *)x, 1) ? -1.f : 1.f); if(x->f_endless) { ebox_parameter_setvalue_normalized((t_ebox *)x, 1, pd_wrap(current + diff, 0.f, 1.f), 1); } else { ebox_parameter_setvalue_normalized((t_ebox *)x, 1, pd_clip(current + diff, 0.f, 1.f), 1); } x->f_reference = pt.y; } knob_output(x); ebox_invalidate_layer((t_ebox *)x, cream_sym_needle_layer); ebox_redraw((t_ebox *)x); }
static void knob_float(t_knob *x, float f) { if(x->f_endless) { const float min = ebox_parameter_getmin((t_ebox *)x, 1); const float max = ebox_parameter_getmax((t_ebox *)x, 1); f = pd_wrap(f, min, max); } ebox_parameter_setvalue((t_ebox *)x, 1, f, 1); knob_output(x); ebox_invalidate_layer((t_ebox *)x, cream_sym_needle_layer); ebox_redraw((t_ebox *)x); }
static t_pd_err knob_notify(t_knob *x, t_symbol *s, t_symbol *msg, void *sender, void *data) { if(msg == cream_sym_attr_modified) { if(s == cream_sym_bgcolor || s == cream_sym_bdcolor || s == cream_sym_necolor || s == cream_sym_endless || s == cream_sym_bdsize) { ebox_invalidate_layer((t_ebox *)x, cream_sym_needle_layer); ebox_invalidate_layer((t_ebox *)x, cream_sym_background_layer); } } else if(msg == cream_sym_value_changed) { knob_output(x); ebox_invalidate_layer((t_ebox *)x, cream_sym_background_layer); ebox_redraw((t_ebox *)x); } return 0; }
static void knob_bang(t_knob *x, float f) { ebox_parameter_notify_changes((t_ebox *)x, 1); knob_output(x); }
void knob_mousedrag(t_knob *x, t_object *patcherview, t_pt pt, long modifiers) { float angle = pd_angle(pt.x - x->j_box.b_rect.width * 0.5, (x->j_box.b_rect.height * 0.5 - pt.y)) / EPD_2PI; if(x->f_mode) { if(x->f_endless) { if(x->f_min < x->f_max) { angle = -angle; angle -= 0.25; while (angle < 0.) angle += 1.; while (angle > 1.) angle -= 1.; x->f_value = angle * (x->f_max - x->f_min) + x->f_min; } else { angle += 0.25; while (angle < 0.) angle += 1.; while (angle > 1.) angle -= 1.; x->f_value = angle * (x->f_min - x->f_max) + x->f_max; } } else { if(x->f_min < x->f_max) { angle = -angle; angle -= 0.25; while (angle < 0.) angle += 1.; while (angle > 1.) angle -= 1.; angle = pd_clip_minmax(angle, 0.125, 0.875); angle -= 0.125; angle *= 1. / 0.75; x->f_value = angle * (x->f_max - x->f_min) + x->f_min; } else { angle += 0.25; while (angle < 0.) angle += 1.; while (angle > 1.) angle -= 1.; angle = pd_clip_minmax(angle, 0.125, 0.875); angle -= 0.125; angle *= 1. / 0.75; x->f_value = angle * (x->f_min - x->f_max) + x->f_max; } } } else { float diff = x->f_ref_y - pt.y; if(diff == 0xffffffff) return; if(x->f_min < x->f_max) { if(x->f_endless) { x->f_value = fmodf(diff / 50. * (x->f_max - x->f_min) + x->f_ref_value + x->f_max - x->f_min, x->f_max - x->f_min); } else x->f_value = pd_clip_minmax(diff / 50. * (x->f_max - x->f_min) + x->f_ref_value, x->f_min, x->f_max); } else { if(x->f_endless) { x->f_value = fmodf(diff / 50. * (x->f_min - x->f_max) + x->f_ref_value + x->f_min - x->f_max, x->f_min - x->f_max); } else x->f_value = pd_clip_minmax(diff / 50. * (x->f_min - x->f_max) + x->f_ref_value, x->f_max, x->f_min); } } ebox_invalidate_layer((t_ebox *)x, gensym("needle_layer")); ebox_redraw((t_ebox *)x); knob_output(x); }
void knob_bang(t_knob *x) { knob_output(x); }
void knob_float(t_knob *x, float f) { knob_set(x, f); knob_output(x); }