1 /*
2 * menu.h
3 * DIN Is Noise is copyright (c) 2006-2021 Jagannathan Sampath
4 * DIN Is Noise is released under GNU Public License 2.0
5 * For more information, please visit https://dinisnoise.org/
6 */
7 
8 #ifndef __menu
9 #define __menu
10 
11 #define MENU uis.main_menu
12 #define MENUP &MENU
13 
14 #include "button.h"
15 #include "checkbutton.h"
16 #include "ui.h"
17 #include "label.h"
18 #include "separator.h"
19 #include "arrow_button.h"
20 #include "spinner.h"
21 #include "spinner2.h"
22 #include "options_list.h"
23 #include "label_field.h"
24 #include "slider.h"
25 #include "tap_bpm.h"
26 #include "plus_button.h"
27 #include "minus_button.h"
28 #include "curve_listener.h"
29 #include "item_list.h"
30 #include "instrument.h"
31 #include "drone.h"
32 #include "drawrrow.h"
33 
34 #include <map>
35 #include <vector>
36 #include <string>
37 
38 #define TOGGLEMENU MENU.toggle ();
39 
40 struct ball;
41 
42 DECL_CLICK_LISTENER (pan_zoom_listener)
43 DECL_STATE_LISTENER (snap_listener)
44 DECL_FIELD_LISTENER (gater_bpm_listener)
45 DECL_FIELD_LISTENER (voice_volume_listener)
46 DECL_FIELD_LISTENER (drone_master_volume_listener)
47 
48 struct arrowlis : click_listener, change_listener<field> {
49   void clicked (button& b);
50   void changed (field& f);
51 };
52 
53 struct defarrowlis : state_listener, change_listener<field> {
54   void changed (checkbutton& cb);
55   void changed (field& f);
56 };
57 
58 struct octave_shift_listener : click_listener, change_listener<field> {
59   void clicked (button& b);
60   void changed (field& f);
61 };
62 
63 struct drone_handle_size_listener : change_listener<field> {
64   int last;
drone_handle_size_listenerdrone_handle_size_listener65   drone_handle_size_listener () : last (0) {}
66   void changed (field& f);
67 };
68 
69 struct binaural_drones_listener : click_listener, change_listener<field>, state_listener, option_listener, selection_listener {
70 
71 	std::string val[5];
72 
73 	static const char* justs[];
74 	int just;
75 
76 	enum {EQUAL = 0, GREATER_THAN_EQUAL, LESSER_THAN_EQUAL, RANGE, ID};
77 	int select_rule, select_what;
78 
79 	void clicked (button& b);
80 	void changed (field& f);
81 	void changed (checkbutton& cb);
82   void picked (label& lbl, int dir);
83 	void selected (item_list& il, int i);
84 
85 	void set_hz (int w, float v);
86 	binaural_drones_listener ();
87 
88 };
89 
90 struct ball_ops_listener : click_listener, state_listener, change_listener<field>, option_listener {
91 	int op_id;
92 	ball_ops_listener ();
93 	void changed (checkbutton& cb);
94 	void changed (field& f);
95 	void picked (label& lbl, int dir);
96 	void clicked (button& b);
97 };
98 
99 DECL_FIELD_LISTENER(drone_trail_length_listener)
100 DECL_FIELD_LISTENER(change_drone_vel_listener)
101 DECL_FIELD_LISTENER(change_drone_accel_listener)
102 DECL_FIELD_LISTENER(rotate_drone_vel_listener)
103 DECL_FIELD_LISTENER(drones_per_min_listener)
104 DECL_FIELD_LISTENER(orbit_insertion_time_listener)
105 DECL_FIELD_LISTENER(drone_lifetime_listener)
106 
107 struct drone_commands_listener : click_listener, state_listener {
108   void clicked (button& b);
109 	void changed (checkbutton& cb);
110   void startwanding ();
111 };
112 
113 DECL_CLICK_LISTENER(phrase_commands_listener)
114 
115 struct snap_drones_listener : change_listener<field>, option_listener {
116 	void changed (field& f);
117 	void picked (label& l, int dir);
118 };
119 
120 DECL_STATE_LISTENER(plugin_listener)
121 
122 DECL_FIELD_LISTENER (ball_direction_listener)
123 DECL_FIELD_LISTENER (note_poly_radius_listener)
124 DECL_FIELD_LISTENER (note_poly_points_listener)
125 DECL_FIELD_LISTENER (trail_length_listener)
126 DECL_FIELD_LISTENER (ball_volume_listener)
127 DECL_FIELD_LISTENER (ball_speed_listener)
128 DECL_FIELD_LISTENER (slit_size_listener)
129 DECL_FIELD_LISTENER (slit_anim_time_listener)
130 DECL_FIELD_LISTENER (ball_attack_time_listener)
131 DECL_FIELD_LISTENER (ball_decay_time_listener)
132 
133 struct mondrian_listener : click_listener, change_listener<field>, state_listener, option_listener   {
134 
135   void clicked (button& b);
136   void changed (field& f);
137 	void changed (checkbutton& cb);
138 	void picked (label& l, int dir);
139 
140 	static const char* split_types [3];
141 	static const int MAX_SPLIT_TYPES = 2;
142 	int hsplit, vsplit;
143 	void check_split_type (options_list& ol, int& o);
144 	void handle_split (int& var, int dir, float t);
145 	void handle_auto_pick_box (options_list& ol, int dir, int& v);
146 
147 	static const char* selection_targets [2];
148 	static const char* pick_box_types [];
149 	static const char* auto_split_at_types [];
150 	static const char* auto_split_orient_types [];
151 
152 };
153 
154 struct style_listener :  option_listener {
155   static const int num_styles = 2;
156   static const int last_style = num_styles - 1;
157   static std::string styles [num_styles];
158   int id;
159   options_list& oplist;
160   std::string what;
161   std::string prefix;
162 
style_listenerstyle_listener163   style_listener (options_list& ol, const std::string& wh, const std::string& pfx) : oplist(ol), what(wh), prefix(pfx) {id = 0;}
164   void set_style (const std::string& style);
165   void get_style ();
166   void next_style (int dir);
167   void picked (label& lbl, int dir);
168 
169 };
170 
171 struct read_write_mod {
172 	virtual void read_mod () = 0;
173 	virtual void write_mod () = 0;
174 };
175 
176 struct range_data : read_write_mod {
177 	int range;
178 	int mod;
range_datarange_data179 	range_data () : range(0), mod(0) {}
180 	void read_mod ();
181 	void write_mod ();
182 };
183 
184 #define MAKE_RANGE_DATA_AND_MOUSE_SLIDER_LISTENER(name) struct name : range_data, mouse_slider_listener { \
185   void after_slide (); \
186   void moused (int dir, double scl); \
187 };
188 
189 MAKE_RANGE_DATA_AND_MOUSE_SLIDER_LISTENER (adjust_range_left_listener)
190 MAKE_RANGE_DATA_AND_MOUSE_SLIDER_LISTENER (adjust_range_right_listener)
191 MAKE_RANGE_DATA_AND_MOUSE_SLIDER_LISTENER (adjust_range_both_listener)
192 MAKE_RANGE_DATA_AND_MOUSE_SLIDER_LISTENER (adjust_range_height_listener)
193 
194 struct range_height_listener : range_data, click_listener, mouse_slider_listener {
195 	void clicked (button& b);
196 	void moused (int dir, double scl);
197 	void after_slide ();
198 };
199 
200 struct change_note_listener : click_listener, mouse_slider_listener {
201 	int id;
202 	void moused (int dir, double scl);
203 	void clicked (button& b);
204 };
205 
206 DECL_CLICK_LISTENER (change_note_both_listener)
207 
208 struct change_note_options_listener : option_listener {
209 	void picked (label& lbl, int dir);
210 	void set (label& lbl, int v);
211 };
212 
213 struct board_height_listener : read_write_mod, click_listener, mouse_slider_listener {
214 	vector<int> moda;
215 	void read_mod ();
216 	void write_mod ();
217 	void clicked (button& b);
218 	void moused (int dir, double scl);
219 	void after_slide ();
220 };
221 
222 DECL_CLICK_LISTENER (range_width_listener)
223 
224 struct set_range_listener : click_listener, option_listener {
225 	int i;
set_range_listenerset_range_listener226 	set_range_listener () : i(1) {}
227 	void clicked (button& b);
228 	void picked (label& lbl, int dir);
229 };
230 
231 struct range_mod_lis : curve_listener, click_listener, state_listener {
232 	void changed (checkbutton& cb);
233 	void clicked (button& b);
234 	void edited (curve_editor* ed, int i);
235 };
236 
237 DECL_FIELD_LISTENER (range_defaults_lis)
238 
239 struct oscilloscope;
240 struct scope_listener : change_listener<field>, state_listener {
241 	oscilloscope* oscp;
242   void changed (field& f);
243   void changed (checkbutton& cb);
244 	void setup ();
245 };
246 
247 struct tap_bpm_listener : change_listener<tap_display>, state_listener {
248   void changed (tap_display& td);
249   void changed (checkbutton& cb);
250 };
251 
252 struct recording_listener : click_listener, typing_listener, state_listener {
253 	void clicked (button& b);
254 	void changed (checkbutton& cb);
255 	void typing (field& f);
256 };
257 
258 
259 DECL_CLICK_LISTENER (misc_listener)
260 
261 #define DRONE_PARAMS_N 123
262 #define DECL_DRONE_PARAMS \
263 widget* wdrone_params [] = { \
264 		&sp_drone_master_vol,\
265     &sp_drone_vol,\
266 		&cb_modulation,\
267 		&cb_motion,\
268 		&cb_visual,\
269     &cb_chuck,\
270     &cb_defaults,\
271 		&separators.dp0,\
272 		&separators.dp1,\
273 		&sp_dam_depth,\
274 		&sp_dfm_depth,\
275 		&sp_dam_bpm,\
276 		&sp_dfm_bpm,\
277     &diram.lbl,\
278     &diram.hor,\
279     &diram.vert,\
280     &diram.vel,\
281     &diram.accel,\
282     &dirfm.lbl,\
283     &dirfm.hor,\
284     &dirfm.vert,\
285     &dirfm.vel,\
286     &dirfm.accel,\
287     &autorotate.title,\
288     &autorotate.whichl,\
289     &autorotate.start,\
290     &autorotate.stop,\
291     &autorotate.toggle,\
292     &autorotate.clockwise,\
293     &autorotate.anticlockwise,\
294     &autorotate.rpm,\
295     &autorotate.deg,\
296     &autorotate.tps,\
297     &autorotate.mov,\
298     &autorotate.smooth,\
299     &autorotate.tick,\
300     &autorotate.autoflip.lbl,\
301     &autorotate.autoflip.angle,\
302     &autorotate.autoflip.set,\
303     &autorotate.autoflip.unset,\
304     &autorotate.autoflip.toggle,\
305     &sva.lbl,\
306     &sva.whats,\
307     &sva.neg,\
308     &sva.zero,\
309     &sva.hor,\
310     &sva.vert,\
311     &sva.vel,\
312     &sva.accel,\
313 		&sp_change_drone_vel,\
314 		&sp_change_drone_accel,\
315 		&sp_rotate_drone_vel,\
316 		&sp_drones_per_min,\
317 		&sp_drone_lifetime,\
318 		&sp_orbit_insertion_time,\
319     &velgt0,\
320     &accelgt0,\
321     &sp_wand_dist,\
322     &ol_drones_are,\
323     &riset,\
324     &fallt,\
325     &lifetime,\
326 		&ol_drone_is,\
327     &handlesize,\
328     &trailsize,\
329     &dva.whichl,\
330     &dva.ldir,\
331     &dva.odir,\
332     &dva.neg,\
333     &dva.randomize,\
334     &dva.sync,\
335     &dva.mag,\
336     &dva.clockwise,\
337     &dva.anticlockwise,\
338     &dva.autorotate.cb,\
339     &dva.autorotate.mov,\
340     &dva.autorotate.dir,\
341     &dva.autorotate.rpm,\
342     &dva.autorotate.dps,\
343     &dva.autorotate.tps,\
344     &dva.autoflip.cb,\
345     &dva.autoflip.deg,\
346     &anchored,\
347     &dronearrowdefaults.lbl,\
348     &dronearrowdefaults.neck,\
349     &dronearrowdefaults.shoulder.width,\
350     &dronearrowdefaults.shoulder.position,\
351     &dronearrowdefaults.cap,\
352     &dronearrowdefaults.arrow,\
353     &seloncre,\
354     &sp_bounces,\
355     &ol_bounce_style,\
356     &sp_rebound,\
357     &chapt,\
358     &chspeed,\
359     &chlen,\
360     &chflip,\
361     &chtog,\
362     &chtrail,\
363     &choutline,\
364     &chautoresettrails,\
365 		&sp_change_drone_handle_size,\
366 		&sp_change_drone_trail_length,\
367 		&l_drone_arrow,\
368 		&dronearrow.shoulder.position,\
369 		&dronearrow.shoulder.width,\
370     &dronearrow.neck,\
371     &dronearrow.cap,\
372     &dronearrow.decap,\
373 		&cb_draw_mesh,\
374 		&ol_color,\
375 		&s_red_min,\
376 		&s_green_min,\
377 		&s_blue_min,\
378 		&s_red_max,\
379 		&s_green_max,\
380 		&s_blue_max,\
381 		&sp_stiff,\
382 		&b_arrow_reset,\
383 		&cb_show_anchors,\
384 		&cb_show_vel,\
385 		&cb_show_accel,\
386 		&cb_show_gravity,\
387 	}; // !actung! new adds above cb_show_anchors
388 
389 
390 
391 #define COLOR_SLIDERS_M 6
392 #define COLOR_SLIDERS_N (COLOR_SLIDERS_M + 1)
393 #define DECL_COLOR_SLIDERS widget* slrs [] = {\
394 	MENUP.s_red_min, MENUP.s_green_min, MENUP.s_blue_min,\
395 	MENUP.s_red_max, MENUP.s_green_max, MENUP.s_blue_max, \
396 	MENUP.ol_color\
397 	};
398 
399 // the DIN menu
400 struct menu : widget, option_listener, change_listener<field>, change_listener< slider<float> >, state_listener {
401 
402 	checkbutton cb_close_octave\
403 	, cb_resize_separation\
404 	, cb_snapx, cb_snapy, cb_snapboth, cb_snapnone\
405 	, cb_record\
406 	, cb_show_waveform_samples\
407 	, cb_draw_curve\
408 	, cb_overlay\
409 	, cb_file, cb_instrument, cb_editors, cb_parameters, cb_mkb_drone_tools, \
410 							cb_mkb_drone_params, cb_mkb_voice, cb_mkb_ranges, cb_mkb_misc, \
411 							cb_ed_tools, cb_mon_parameters, cb_mon_tools, cb_mon_misc, cb_mon_boxops, \
412 							cb_mon_ballops, cb_binaural_drones_tools, cb_binaural_drones_edit\
413 	, cb_label_vertices\
414 	, cb_mark_segments\
415 	, cb_selection_only\
416 	, cb_turn\
417 	, cb_turn_sync\
418 	, cb_speed\
419 	, cb_speed_sync\
420 	, cb_teleport\
421 	, cb_clone\
422 	, cb_clone_can_clone\
423 	, cb_transform\
424 	, cb_auto_split_box, cb_auto_delete_box\
425 	, cb_mondrian_auto_adjust_voices\
426 	, cb_draw_boxes, cb_fill_boxes, cb_draw_notes, cb_label_notes, cb_label_hz_vol,\
427 		cb_draw_ball_position, cb_draw_ball_heading, cb_draw_ball_trails\
428 	, cb_mark_ran\
429 	, cb_mod_ran\
430 	, cb_pitch_dis, cb_vol_dis, cb_draw_mesh\
431 	, cb_scope\
432 	, cb_am, cb_fm, cb_gater, cb_octave_shift\
433 	, cb_auto_reset\
434 	, cb_am_bpm\
435 	, cb_fm_bpm\
436 	, cb_sync_rows_cols\
437 	, seloncre\
438 	, b_microtonal_keyboard, b_keyboard_keyboard, b_mondrian, b_binaural_drones\
439 	, cb_show_anchors, cb_show_vel, cb_show_accel, cb_show_gravity, cb_conn_wrap\
440 	, cb_modulation, cb_motion, cb_visual, cb_defaults, cb_chuck, choutline, chautoresettrails\
441   , trackcon, velgt0, accelgt0;
442 
443 	MAKE_STATE_LISTENER (cb_conn_wrap_lis, wrapl)
444   MAKE_STATE_LISTENER (autoresettrailslis, aurl)
445 
446 	button \
447     bbd_select_all, bbd_select_none, bbd_invert_select, bbd_select, bbd_select2, bbd_sync, bbd_delete, bbd_modulate, bbd_flip\
448   , b_create_binaurals_on_notes, b_create_binaurals_from_pitch\
449 	, b_pick_curve, b_swap_curves, b_insert_vertex, b_delete_vertex, b_undo, b_redo, b_copy, b_paste, b_fold_tangents, b_unfold_tangents\
450 	, b_draw_replacement_curve, b_add_curve, b_replace_curve, b_delete_curve, b_start_capture, b_assign_capture, b_stop_rotating\
451 	, b_turn_off_ui, b_exit_din, b_clear_record\
452   , b_save, b_close\
453   , l_draw_ball, b_add_balls, b_move_selected_balls, b_select_all_targets, b_invert_selected_targets\
454 	, b_select_targets_in_box, b_delete_selected_targets, b_delete_all_targets, b_split_horizontal\
455 	, b_split_vertical, b_delete_box, b_freeze_balls, b_thaw_balls, b_modulate_balls_up, b_modulate_balls_down\
456   , b_clear_modulations, b_auto_change_direction_clockwise, b_auto_change_direction_anti_clockwise\
457 	, b_stop_auto_changing_direction, b_flip_direction, b_actual_voices, b_make_random_color\
458 	, b_add_remove_slits, b_remove_slits_on_edge, b_toggle_slit_anim, b_toggle_wreckers\
459 	, b_toggle_healers, b_toggle_bouncers, b_switch_ball_type, b_select_wreckers, b_select_healers\
460 	, b_make_note_grid, b_make_nxn_grid, b_delete_all_boxes, b_ball_trig\
461 	, b_selected_to_all, b_default_to_selected, b_default_to_all\
462 	, b_adjust_range_height, b_adjust_board_height, b_adjust_range_left, b_adjust_range_right, b_adjust_range_both\
463 	, b_change_note_left, b_change_note_right, b_change_note_both\
464 	, b_get_cur_ran\
465 	, b_rm_start_all, b_rm_stop_all, b_rm_toggle, b_rm_pause_resume\
466 	, b_key_to_pitch_at_cursor\
467 	, b_orbit_selected_drones, b_select_attractees, b_select_attractors\
468 	, b_scale_drones\
469   , b_set_xform_center\
470 	, b_rotate_drones\
471 	, b_launch_drones\
472 	, b_stop_launching_drones\
473 	, b_set_targets\
474 	, b_clear_targets\
475 	, b_track_drones\
476 	, b_select_tracked_drones\
477 	, b_flip_rows_cols\
478 	, b_set_to_mesh_cols\
479 	, b_set_to_mesh_rows\
480 	, b_record_phrase, b_clear_phrases\
481 	, b_move_drones, b_delete_drones\
482 	, b_select_all_drones, b_invert_drone_selection\
483 	, balloon\
484 	, b_select_launchers\
485 	, b_freeze_drones, b_thaw_drones\
486 	, b_set, b_unset, b_toggle\
487   , b_menu, b_microtonal_keyboard_waveform, b_drone_waveform, b_drone_modulation, b_voice_modulation, \
488 		b_range_modulation, b_range_width_height, b_range_pitch_vol, b_gater, b_noise_interpolator, \
489 		b_keyboard_keyboard_waveform, b_attack, b_decay, b_midi_velocity, b_mondrian_waveform, b_mondrian_attack, \
490 		b_mondrian_decay, b_delays, b_octave_shift, b_compressor, b_morse_code, b_binaural_drones_waveform,\
491 		b_point_modulation,\
492 		b_connect, b_disconnect, b_drone_pend, b_abort_octave_shift,\
493 		b_arrow_reset, b_mute, b_unmute, drone2noise, noise2drone,\
494     immortalize, mortalize, reincarnate,\
495     chuck, chflip, chtog;
496 
497 
498   struct moddirs : click_listener {
499     int what;
500     label lbl;
501     button vert, hor, vel, accel;
502     #define DECL_BUTTONS button* b[] = {&vert, &hor, &vel, &accel};
moddirsmenu::moddirs503     moddirs (int w) {
504       what = w;
505       DECL_BUTTONS
506       for (int i = 0; i < 4; ++i) b[i]->set_listener(this);
507     }
508     void setup (const std::string& l);
509     void clicked (button& cb);
510   } diram, dirfm;
511 
512   MAKE_CLICK_LISTENER(drone2noiselis, d2nl)
513   MAKE_CLICK_LISTENER(noise2dronelis, n2dl)
514 	MAKE_CLICK_LISTENER(b_menu_lis,mbl)
515 	MAKE_CLICK_LISTENER(b_ed_lis,edl)
516 	MAKE_CLICK_LISTENER(b_inst_lis,insl)
517 	MAKE_CLICK_LISTENER(b_connect_lis,bconl)
518 	MAKE_CLICK_LISTENER(b_disconnect_lis,bdconl)
519 	MAKE_CLICK_LISTENER(b_abort_octave_shift_lis,aosl)
520 	MAKE_CLICK_LISTENER(b_arrow_reset_lis,awl)
521   MAKE_CLICK_LISTENER (b_mute_lis, mul)
522   MAKE_CLICK_LISTENER (b_unmute_lis, umul)
523   MAKE_CLICK_LISTENER (b_set_xform_center_lis, xcl)
524   MAKE_CLICK_LISTENER (mortalizel, morl)
525   MAKE_CLICK_LISTENER (immortalizel, immorl)
526   MAKE_CLICK_LISTENER (reincarnatel, reinl)
527   MAKE_CLICK_LISTENER (chuckl, chl)
528   MAKE_CLICK_LISTENER (chflipl, flpl)
529   MAKE_CLICK_LISTENER (chtogl, ctogl)
530 
531 
532 	label_field lf_bd_start_pitch\
533 	, lf_curve_name\
534 	, lf_bd_spacing\
535 	, lf_vol_fade_time, lf_pitch_fade_time, lf_master_volume, lf_modulation_amount, lf_l, lf_r, lf_sep, lf_vol\
536 	, lf_file, lf_conn_steps;
537 
538 
539 	struct lf_conn_steps_lis : change_listener<field>, typing_listener {
540 		void changed (field& f);
541 		void typing (field& f);
542 	} stepsl;
543 
544 	field f_mesh_xy\
545 	, bdf_value;
546 
547 	plus_button bm_zoom_in\
548 	,pb_zoom_in;
549 
550 	minus_button bm_zoom_out\
551 	, mb_zoom_out;
552 
553 	item_list il_binaural_drones;
554 
555 	label l_library\
556 	, l_capture\
557 	, l_snap\
558 	, l_ran_mod\
559 	, l_drone_arrow\
560 	, l_tap_bpm, l_tap_bpm_value\
561   , l_octave_shift, l_gater\
562 	, l_drone_order\
563 	, l_use_drone_pend\
564 	, l_apply_to\
565 	, l_phrase_position\
566 	, l_adjust_height, l_adjust_range;
567 
568 	arrow_button abm_left, abm_right, abm_up, abm_down\
569 	, ab_octave_down, ab_octave_up\
570 	, bd_modulate_up, bd_modulate_down\
571 	, abe_left, abe_right, abe_up, abe_down\
572 	, abl_left, abl_right;
573 
574 	spinner<float> sp_bd_separation\
575 	, sp_waveform_hz\
576 	, sp_curve_limit\
577 	, sp_curve_rpm\
578 	, dp_bpm1\
579 	, sp_turn_every\
580 	, sp_turn_min, sp_turn_max\
581 	, sp_speed_every\
582 	, sp_speed_min, sp_speed_max\
583 	, sp_max_speed\
584 	, sp_tel_every\
585 	, sp_tel_radius\
586 	, sp_clone_every\
587 	, sp_clone_offset\
588 	, sp_transform_every\
589 	, sp_auto_split_time, sp_auto_delete_time, sp_min_split_size\
590 	, sp_mondrian_change_vol, sp_mondrian_change_attack_time, sp_mondrian_change_decay_time, sp_mondrian_change_speed,\
591 		sp_mondrian_change_slit_size, sp_mondrian_change_slit_anim_time, sp_mondrian_change_note_poly_radius\
592 	, sp_mesh_dur\
593 	, sp_snap_left, sp_snap_right\
594 	, sp_ran_mod_width, sp_ran_mod_height\
595 	, sp_ran_mod_width_bpm, sp_ran_mod_height_bpm\
596 	, sp_octave_shift_bpm\
597 	, sp_gater_bpm\
598 	, sp_voice_volume\
599 	, sp_drone_master_vol\
600   , sp_drone_vol\
601 	, sp_change_drone_vel\
602 	, sp_change_drone_accel\
603 	, sp_drones_per_min\
604 	, sp_drone_lifetime\
605 	, sp_orbit_insertion_time\
606 	, sp_am_depth, sp_fm_depth\
607 	, sp_am_bpm, sp_fm_bpm\
608 	, sp_dam_depth, sp_dfm_depth\
609 	, sp_dam_bpm, sp_dfm_bpm\
610 	, sp_stiff\
611   , sp_rotate_drone_vel\
612   , chapt, chspeed, chlen\
613   ;
614 
615 
616   MAKE_FIELD_LISTENER(sp_wand_dist_lis, wandl)
617   MAKE_FIELD_LISTENER(risel,rl)
618   MAKE_FIELD_LISTENER(falll,fl)
619   MAKE_FIELD_LISTENER(speedl,spdl)
620   MAKE_FIELD_LISTENER(lengthl,lenl)
621   MAKE_FIELD_LISTENER(angleperframel, apfl)
622   MAKE_FIELD_LISTENER(traill, chtll)
623 
624   MAKE_FIELD_LISTENER(handlesizel, handl)
625   MAKE_FIELD_LISTENER(trailsizel, trll)
626   MAKE_FIELD_LISTENER(lifetimel,lifel)
627 
628 	spinner<int> sp_bd_pairs\
629 	, sp_waveform_periods\
630 	, sp_default_width, sp_default_height\
631 	, sp_lev_sz\
632 	, sp_scope_height\
633 	, sp_scope_samples\
634 	, sp_mondrian_num_boxes\
635 	, sp_max_clones\
636 	, sp_max_balls\
637 	, sp_mondrian_min_voices,  sp_mondrian_change_dir, sp_mondrian_change_trail_size, sp_mondrian_change_note_poly_points\
638 	, sp_mesh_rows, sp_mesh_cols\
639 	, sp_drones_per_pend\
640 	, dp_numdrones\
641 	, sp_browse_drone\
642 	, sp_range\
643 	, sp_change_drone_handle_size\
644 	, sp_change_drone_trail_length\
645   , sp_wand_dist, chtrail;
646 
647   spinner2<int> handlesize, trailsize, sp_bounces, sp_rebound;
648   spinner2<float> lifetime, gabt, riset, fallt;
649 
650   struct {
651     label lbl;
652     spinner2<float> neck;
653     struct {
654       spinner2<float> position, width;
655     } shoulder;
656     checkbutton cap;
657     drawrrow arrow;
658 	} dronearrowdefaults;
659 
660 	options_list ol_key_note, ol_justification\
661 	, ol_select_what, ol_select_rule, ol_just, ol_mirror\
662 	, ol_vertices_carry_tangents\
663 	, ol_mirror_tangents\
664 	, ol_curve_style\
665 	, ol_set_range\
666 	, ol_change_note\
667 	, ol_change_note_style\
668 	, ol_fixed\
669 	, ol_ball_types, ol_split_types_h, ol_split_types_v, ol_selection_targets\
670 	, ol_auto_pick_box_split, ol_auto_pick_box_delete, ol_auto_split_at, ol_auto_split_orient\
671 	, ol_browse_balls\
672 	, ol_bouncer, ol_healer, ol_wrecker\
673 	, ol_snap_style\
674 	, dp_orient\
675 	, ol_drone_is\
676 	, ol_bounce_style\
677 	, ol_create_this\
678 	, ol_drone_order\
679 	, ol_mesh_point\
680 	, ol_gater_style\
681 	, ol_am_style, ol_fm_style\
682 	, ol_set_unset_toggle\
683 	, ol_color\
684   , ol_add_wand\
685   , ol_drones_are\
686   , anchored;
687 
688 	MAKE_OPTION_LISTENER (ol_color_lis, ocoll)
689   MAKE_OPTION_LISTENER (ol_add_wand_lis, awdl)
690   MAKE_OPTION_LISTENER (ol_drones_are_lis, darl)
691   MAKE_OPTION_LISTENER (anchoredl, ancl)
692 
693 
694 	octave_shift_listener osl;
695   style_listener gater_style_lis;
696   gater_bpm_listener gbl;
697   voice_volume_listener vvl;
698 	drone_master_volume_listener dmvol;
699   MAKE_FIELD_LISTENER(sp_drone_vol_lis, dvol);
700   drone_handle_size_listener dhsl;
701   drone_trail_length_listener dtl;
702 	change_drone_vel_listener dvl;
703   change_drone_accel_listener dal;
704   rotate_drone_vel_listener rdvl;
705   drones_per_min_listener dpml;
706 	drone_lifetime_listener dlf;
707 	orbit_insertion_time_listener oil;
708 	style_listener am_style_lis, fm_style_lis;
709 	MAKE_CLICK_LISTENER(b_set_unset_toggle_lis, sutl)
710 	MAKE_CLICK_LISTENER(b_scale_drones_lis, bsdl)
711 	MAKE_CLICK_LISTENER(b_move_drones_lis, bmdl)
712 	MAKE_CLICK_LISTENER(b_move_drones_under_gravity_lis, dugl)
713 	MAKE_MOUSE_SLIDER_LISTENER(ms_scale_drones_lis, ms_sdl)
714 	MAKE_CLICK_LISTENER(b_rotate_drones_lis, brdl)
715 	MAKE_MOUSE_SLIDER_LISTENER (ms_rotate_drones_lis, ms_rdl)
716 	MAKE_STATE_LISTENER(cb_am_bpm_lis, abl)
717 	MAKE_STATE_LISTENER(cb_fm_bpm_lis, fbl)
718 	MAKE_FIELD_LISTENER(drones_per_pend_lis, dppl)
719 	MAKE_FIELD_LISTENER(sp_stiff_lis, stiffl)
720   MAKE_FIELD_LISTENER(gabt_lis, gabtl)
721 	MAKE_CLICK_LISTENER(set_to_mesh_rows_lis, stmrl)
722 	MAKE_CLICK_LISTENER(set_to_mesh_cols_lis, stmcl)
723 	drone_commands_listener dcl;
724 	snap_drones_listener sdl;
725 	phrase_commands_listener pcl;
726 	set_range_listener sral;
727 	range_width_listener rwl;
728 	range_height_listener rhl;
729 	board_height_listener bhl;
730 	change_note_listener cnl, cnr;
731 	change_note_both_listener cnb;
732 	change_note_options_listener cnol, cnsl;
733 	adjust_range_left_listener arl;
734 	adjust_range_right_listener arr;
735 	adjust_range_both_listener arb;
736 	range_mod_lis rml;
737 	MAKE_OPTION_LISTENER (ol_fixed_lis, fxl)
738 	range_defaults_lis rdel;
739 
740   struct pitch_vol_dis_pix_lis : state_listener, change_listener<field> {
741     void changed (checkbutton& cb);
742     void changed (field& f);
743   } pvdl;
744 
745 	MAKE_STATE_LISTENER (cb_draw_mesh_lis, dml)
746 	scope_listener scol;
747 	ball_ops_listener bolis;
748 	ball_attack_time_listener batl;
749 	ball_decay_time_listener bdtl;
750 	ball_speed_listener bsl;
751 	ball_direction_listener brl;
752 	ball_volume_listener bvl;
753 	trail_length_listener tll;
754 	note_poly_radius_listener nprl;
755 	note_poly_points_listener nppl;
756 	slit_size_listener ssl;
757 	slit_anim_time_listener satl;
758 	mondrian_listener monl;
759 	binaural_drones_listener bdl;
760 	pan_zoom_listener pzl;
761 	snap_listener snl;
762 
763   struct curve_ops_listener : click_listener, state_listener, change_listener<field> {
764     void clicked (button& b);
765     void changed (checkbutton& cb);
766     void changed (field& f);
767   } col;
768 
769 	misc_listener miscl;
770 	recording_listener recl;
771 	MAKE_FIELD_LISTENER (sp_dam_depth_lis, damdl)
772 	MAKE_FIELD_LISTENER (sp_dfm_depth_lis, dfmdl)
773 	MAKE_FIELD_LISTENER (sp_dam_bpm_lis, dambpml)
774 	MAKE_FIELD_LISTENER (sp_dfm_bpm_lis, dfmbpml)
775 	MAKE_FIELD_LISTENER (sp_browse_drone_lis, brwdl)
776 	MAKE_FIELD_LISTENER (sp_am_depth_lis, amdl)
777 	MAKE_FIELD_LISTENER (sp_fm_depth_lis, fmdl)
778 	MAKE_FIELD_LISTENER (sp_am_bpm_lis, ambpml)
779 	MAKE_FIELD_LISTENER (sp_fm_bpm_lis, fmbpml)
780 	MAKE_FIELD_LISTENER (sp_bounces_lis, bol)
781 	MAKE_FIELD_LISTENER (sp_rebound_lis, rebl)
782 	MAKE_FIELD_LISTENER (sp_range_lis, ranl)
783 	MAKE_FIELD_LISTENER (sp_ran_mod_width_lis, rmwl)
784 	MAKE_FIELD_LISTENER (sp_ran_mod_height_lis, rmhl)
785 	MAKE_FIELD_LISTENER (sp_ran_mod_width_bpm_lis, rmwbl)
786 	MAKE_FIELD_LISTENER (sp_ran_mod_height_bpm_lis, rmhbl)
787 
788 
789 	slider<float> s_phrase_position;
790 	slider<float> s_red_min, s_green_min, s_blue_min;
791 	slider<float> s_red_max, s_green_max, s_blue_max;
792 	MAKE_SLIDER_LISTENER (sc_color_lis, cscl)
793 	MAKE_START_SLIDE_LISTENER(ss_color_lis, slider<float>, cssl)
794 	MAKE_CLICK_LISTENER (sc_close_lis, cscll)
795 
796 
797 	float am_depth, fm_depth; // for voice modulation
798 	float dam_depth, dfm_depth, dam_bpm, dfm_bpm; // for drone modulation
799   void init_modulation ();
800 
801 	std::map<std::string, spinner<float>*> bpm_map;
802 	void update_bpm (const std::string& name, float value);
803 
804 	void load_range (int r);
805 	void load_range_mod (int r);
806 
807 	struct {
808     spinner<float> neck;
809     struct {
810       spinner<float> position, width;
811     } shoulder;
812     button cap, decap;
813 	} dronearrow;
814 	arrowlis arrowl;
815   defarrowlis defarrowl;
816 
817   tap_display td_tap_display;
818   tap_bpm_listener tbl;
819   void mark_tap_target ();
820 
821 	void update_binaurals_list ();
822 
823   void set_repeat (button** B, int n, double dt); // to enable click repeat on pan & zoom buttons
824   void set_zoom_repeat (double dt);
825   void set_pan_repeat (double dt);
826   void set_snap (int what);
827   void set_vertices_carry_tangents (int i);
828   void set_mirror_tangents (int i);
829 
830   // tabs
831   int num_tabs;
832   std::vector<checkbutton*> tabs;
833   std::map< checkbutton*, std::vector<widget*> > tab_members;
834   checkbutton *last_tab, *cur_tab, *next_tab;
835 	void setup_tabs (ui* scr);
836 	void setup_tabs (checkbutton** tl, int n, int clear = 0);
837 	void add_to_tab (checkbutton* cb, widget* w);
838 	void remove_from_tab (checkbutton* cb, widget* w);
839 	void position_tabs ();
840 	void position_menu_items ();
841 	void handle_voice_tab_items (const char* viv);
842 
843 	struct separators_t {
844 		separator main, dp0, dp1;
845 	} separators;
846 
847 	instrument* next_tab_instr;
848 
849 	void move_items (int dx, int dy);
850   int show;
851   int menu_mousex, menu_mousey; // last mouse position on menu
852   int screen_mousex, screen_mousey;  // mouse position on screen when menu becomes visible
853 	box<int> bg_extents;
854 	float opacity;
855   void calc_bg ();
856   void set_pos (int x, int y);
857   void setup ();
858   void update ();
859   int handle_input ();
860   void changed (field& f);
861   void changed (slider<float>& s);
862   void changed (checkbutton& cb);
863   void changed (tap_display& tb);
864   void picked (label& lbl, int dir);
865 
866   static const int nitems = 483;
867   static const int n_inst_ed = 27;
868   widget* items [nitems];
869   void loadspinners ();
870   void savespinners ();
871 
872   std::vector<widget*> editors;
873   void show_editors (ui* inst);
874   void hide_editors ();
875 
876   menu ();
877 
878   void setup_items ();
879   void draw ();
880   void toggle (int mouse_warp = 1);
881 
882 	void set_ball_ops (ball* b);
883 	void clear_ball_ops ();
884 
885 	get_fixed_color gc_top, gc_bottom;
886 	get_blend_color gc_blend;
887 	get_random_color gc_rand;
888 	colorer_t colorer;
889 
890 	MAKE_STATE_LISTENER(cb_modulation_lis, cmod)
891 	MAKE_STATE_LISTENER(cb_motion_lis, cmot)
892 	MAKE_STATE_LISTENER(cb_visual_lis, cvis)
893   MAKE_STATE_LISTENER(cb_defaults_lis, cdef)
894   MAKE_STATE_LISTENER(cb_chuck_lis,cch)
895 
896 	void set_drone_params_items (int s, int e);
897 
898   ~menu ();
899 
900   struct autorott : option_listener, click_listener {
901 
902     label title;
903 
904     label mov;
905     button smooth, tick;
906 
907     enum {VELOCITY, ACCELERATION, BOTH};
908     options_list whichl;
909     int which;
910 
911     button start, stop, toggle;
912     button clockwise, anticlockwise;
913 
914     MAKE_CLICK_LISTENER (startlis,startl)
915     MAKE_CLICK_LISTENER (stoplis,stopl)
916     MAKE_CLICK_LISTENER (togglis,togl)
917     MAKE_CLICK_LISTENER (clockwiselis, clkl)
918     MAKE_CLICK_LISTENER (anticlockwiselis, aclkl)
919 
920     enum {RPM, DEG, TPS, MOVEMENT};
921     spinner<float> rpm;
922     MAKE_FIELD_LISTENER (rpmlis, rpml)
923     MAKE_FIELD_LISTENER (deglis, degl)
924     MAKE_FIELD_LISTENER (tpslis, tpsl)
925 
926     spinner<float> deg;
927     spinner<float> tps;
928 
929     void setup ();
930     void picked (label& lbl, int dir);
931     void clicked (button& b);
932 
933     struct autoflipt {
934       label lbl;
935       button set, unset, toggle;
936       spinner<float> angle;
937       MAKE_CLICK_LISTENER(setlis, setl)
938       MAKE_CLICK_LISTENER(unsetlis, unsetl)
939       MAKE_CLICK_LISTENER(toglis, togl)
940       MAKE_FIELD_LISTENER (anglis, angl)
941     } autoflip;
942 
943   } autorotate;
944 
945 
946   struct setvelaccel : click_listener, option_listener {
947     label lbl;
948     options_list whats;
949     int what;
950     button zero, hor, vert, vel, accel;
951     checkbutton neg;
952     void setup ();
953     void clicked (button& b);
954     void picked (label& lbl, int dir);
955   } sva;
956 
957   struct defvelaccelui : option_listener {
958 
959     defvelaccel* cur;
960 
961     enum {VELOCITY, ACCELERATION};
962     options_list whichl;
963     int which;
964 
965     label ldir;
966     options_list odir;
967     int idir;
968     enum {HORIZONTAL, VERTICAL, MOUSE};
969 
970     spinner2<float> mag;
971     spinner<float> clockwise, anticlockwise;
972     checkbutton neg;
973 
974     checkbutton randomize;
975 
976     checkbutton sync;
977     void checksync (float v, anglet& t, spinner<float>& sp);
978 
979     struct autorotatet {
980       checkbutton cb;
981       MAKE_STATE_LISTENER (chklis, chkl)
982       static const char *diropts[], *movopts[];
983       options_list dir;
984       options_list mov;
985       MAKE_OPTION_LISTENER (dirlis, dirl)
986       MAKE_OPTION_LISTENER (movlis, movl)
987       spinner2<float> rpm, dps, tps;
988       void setup ();
989       void load ();
990     } autorotate;
991 
992     struct autoflipt {
993       checkbutton cb;
994       MAKE_STATE_LISTENER (chklis, chkl)
995       spinner2<float> deg;
996 #ifdef __WIDGET_MOVE__
997       void setup ();
998 #endif
999     } autoflip;
1000 
1001     void picked (label&, int);
1002     MAKE_OPTION_LISTENER (dirlis, dirl)
1003     MAKE_FIELD_LISTENER (maglis, magl)
1004     MAKE_FIELD_LISTENER (rpmlis, rpml)
1005     MAKE_FIELD_LISTENER (dpslis, dpsl)
1006     MAKE_FIELD_LISTENER (tpslis, tpsl)
1007     MAKE_FIELD_LISTENER (deglis, degl)
1008     MAKE_FIELD_LISTENER (varlis, varl)
1009     MAKE_STATE_LISTENER (chklis, chkl)
1010     MAKE_FIELD_LISTENER (clocklis, clockl)
1011     MAKE_FIELD_LISTENER (anticlocklis, aclockl)
1012 
1013     void setup ();
1014     void load ();
1015 
1016   } dva;
1017 
1018 };
1019 #endif
1020