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