2 terminatorX - realtime audio scratching software
3 Copyright (C) 1999, 2000 Alexander König
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 Description: This implements the "sequenceable parameters".
24 #include "tX_seqpar.h"
27 #include "tX_mastergui.h"
28 #include "tX_global.h"
29 #include "tX_sequencer.h"
30 #include "tX_extdial.h"
33 #define TX_SEQPAR_DEFAULT_SCALE 0.05
35 list <tX_seqpar *> tX_seqpar :: all;
36 list <tX_seqpar *> tX_seqpar :: update;
37 pthread_mutex_t tX_seqpar :: update_lock = PTHREAD_MUTEX_INITIALIZER;
39 #define tt ((vtt_class *) vtt)
41 void tX_seqpar :: default_constructor()
52 last_event_recorded=NULL;
55 tX_seqpar :: tX_seqpar ()
57 default_constructor();
61 tX_seqpar :: tX_seqpar (void * mytt)
63 default_constructor();
67 tX_seqpar :: tX_seqpar (float max, float min, float scale, int mappable)
69 default_constructor();
76 void tX_seqpar :: set_mapping_parameters(float max, float min, float scale, int mappable)
85 tX_seqpar :: tX_seqpar (void *mytt, float max, float min, float scale, int mappable)
87 default_constructor();
96 void tX_seqpar :: handle_mouse_input(float adjustment)
100 tmpvalue=get_value()+adjustment*scale_value;
101 if (tmpvalue>max_value) tmpvalue=max_value;
102 if (tmpvalue<min_value) tmpvalue=min_value;
104 /*printf("Handling %s, max %f, min %f, scale %f, val: %f\n", get_name(), max_value, min_value, scale_value, tmpvalue);*/
106 receive_input_value(tmpvalue);
109 #ifdef USE_ALSA_MIDI_IN
110 void tX_seqpar :: handle_midi_input( const tX_midievent& event )
112 float tmpvalue = -1000;
114 //event.print( (string(__FUNCTION__) + " - " + get_name()).c_str() );
118 if( event.type == tX_midievent::CC || event.type == tX_midievent::PITCHBEND )
120 tmpvalue = event.value * (max_value-min_value) + min_value;
122 else if( event.type == tX_midievent::NOTE )
124 tmpvalue = event.is_noteon;
131 if (tmpvalue>max_value) tmpvalue=max_value;
132 if (tmpvalue<min_value) tmpvalue=min_value;
136 tmpvalue=event.value;
139 receive_input_value(tmpvalue);
143 void tX_seqpar :: set_vtt (void *mytt)
148 tX_seqpar :: ~tX_seqpar()
150 pthread_mutex_lock(&update_lock);
152 pthread_mutex_unlock(&update_lock);
153 sequencer.delete_all_events_for_sp(this);
157 void tX_seqpar :: do_touch()
159 if (sequencer.is_recording())
162 touch_timestamp=sequencer.get_timestamp();
166 void tX_seqpar :: untouch_all()
168 list <tX_seqpar *> :: iterator sp;
170 for (sp=all.begin(); sp!=all.end(); sp++)
176 void tX_seqpar :: create_persistence_ids()
178 list <tX_seqpar *> :: iterator sp;
181 for (sp=all.begin(); sp!=all.end(); sp++)
184 (*sp)->set_persistence_id(pid);
188 tX_seqpar* tX_seqpar :: get_sp_by_persistence_id(unsigned int pid)
190 list <tX_seqpar *> :: iterator sp;
192 for (sp=all.begin(); sp!=all.end(); sp++)
194 if ((*sp)->get_persistence_id()==pid) return ((*sp));
197 fprintf (stderr, "oops: failed to lookup persistence id [%i].\n", pid);
202 void tX_seqpar :: record_value(const float value)
204 #define last_event ((tX_event *) last_event_recorded)
206 /* recording more than one event per seqpar for
207 one timestamp doesn't make sense... so if the
208 last_event_recorded was for the current timestamp
209 we simply set that event's value to the current one.
211 if ((last_event) && (last_event->get_timestamp() == sequencer.get_timestamp()))
213 last_event->set_value(value);
215 else last_event_recorded=(void *) sequencer.record(this, value);
218 void tX_seqpar :: receive_gui_value(const float value)
228 void tX_seqpar :: receive_input_value(const float value)
235 void tX_seqpar :: receive_forward_value(const float value)
240 void tX_seqpar :: materialize_forward_values()
242 list <tX_seqpar *> :: iterator sp;
244 for (sp=all.begin(); sp!=all.end(); sp++)
246 (*sp)->exec_value((*sp)->fwd_value);
251 char * tX_seqpar :: get_vtt_name()
253 if (vtt) return tt->name;
254 else return "Master Track";
257 const char * tX_seqpar :: get_name()
259 return "This string means trouble!";
262 float tX_seqpar :: get_value()
264 printf("Ooops. tX_seqpar::get_value() called. Trouble.");
268 void tX_seqpar :: do_exec(const float value)
270 fprintf(stderr, "oops: called do_exec() of tX_seqpar.\n");
273 void tX_seqpar :: exec_value(const float value)
275 fprintf(stderr, "oops: called exec_value() of tX_seqpar.\n");
278 void tX_seqpar :: do_update_graphics()
280 fprintf(stderr, "oops: called do_update_graphics() of tX_seqpar.\n");
283 void tX_seqpar :: update_graphics()
286 do_update_graphics();
287 while (gtk_events_pending()) gtk_main_iteration(); /* gtk_flush */
291 void tX_seqpar :: update_all_graphics()
293 list <tX_seqpar *> :: iterator sp;
295 pthread_mutex_lock(&update_lock);
299 pthread_mutex_unlock(&update_lock);
303 while (gtk_events_pending()) gtk_main_iteration();
304 for (sp=update.begin(); sp!=update.end(); sp++)
306 (*sp)->update_graphics();
308 update.erase(update.begin(), update.end());
309 pthread_mutex_unlock(&update_lock);
312 void tX_seqpar :: init_all_graphics()
314 list <tX_seqpar *> :: iterator sp;
316 pthread_mutex_lock(&update_lock);
318 for (sp=all.begin(); sp!=all.end(); sp++)
320 (*sp)->update_graphics();
322 while (gtk_events_pending()) gtk_main_iteration();
324 pthread_mutex_unlock(&update_lock);
327 void tX_seqpar_update :: exec_value(const float value)
330 pthread_mutex_lock(&update_lock);
331 update.push_front(this);
332 pthread_mutex_unlock(&update_lock);
335 void tX_seqpar_no_update :: exec_value(const float value)
340 void tX_seqpar_no_update :: do_update_graphics()
346 void tX_seqpar_no_update_active_forward :: receive_forward_value(const float value)
352 void tX_seqpar_update_active_forward :: receive_forward_value(const float value)
360 /**** Sequencable Parameter: MASTER VOLUME ****/
362 tX_seqpar_master_volume :: tX_seqpar_master_volume()
364 set_mapping_parameters(2.5, 0, 0.1, 0);
367 void tX_seqpar_master_volume :: do_exec(const float value)
369 vtt_class :: set_master_volume(value);
372 void tX_seqpar_master_volume :: do_update_graphics ()
374 gtk_adjustment_set_value(volume_adj, vtt_class::master_volume);
377 const char * tX_seqpar_master_volume :: get_name()
379 return "Master Volume";
382 /**** Sequencable Parameter: MASTER PITCH ****/
384 tX_seqpar_master_pitch :: tX_seqpar_master_pitch()
386 set_mapping_parameters(3.0, -3.0, 0.1, 0);
389 void tX_seqpar_master_pitch :: do_exec(const float value)
391 vtt_class :: set_master_pitch(value);
394 void tX_seqpar_master_pitch :: do_update_graphics ()
396 gtk_adjustment_set_value(pitch_adj, globals.pitch);
399 const char * tX_seqpar_master_pitch :: get_name()
401 return "Master Pitch";
404 /**** Sequencable Parameter: TURNTABLE SPEED ****/
406 tX_seqpar_vtt_speed :: tX_seqpar_vtt_speed()
408 // min max scale are not required for this parameter
409 set_mapping_parameters(3.0, -3.0, 0.1, 1);
412 /* speed works differently so we need an extra input-handler */
414 void tX_seqpar_vtt_speed :: handle_mouse_input(float adjustment)
416 if (tt->do_scratch) tt->sp_speed.receive_input_value(adjustment);
417 tt->sense_cycles=globals.sense_cycles;
420 void tX_seqpar_vtt_speed :: do_exec(const float value)
422 tt->speed=value*tt->audiofile_pitch_correction;
425 const char * tX_seqpar_vtt_speed :: get_name()
427 return "Speed (Scratching)";
430 /**** Sequencable Parameter: TURNTABLE SPIN ****/
432 tX_seqpar_spin :: tX_seqpar_spin()
434 set_mapping_parameters(1, 0, 0, 0);
437 void tX_seqpar_spin :: do_exec(const float value)
439 if (value > 0) tt->speed=tt->res_pitch;
443 const char * tX_seqpar_spin :: get_name()
445 return "Motor Spin (On/Off)";
448 /**** Sequencable Parameter: TURNTABLE VOLUME ****/
450 tX_seqpar_vtt_volume :: tX_seqpar_vtt_volume()
452 set_mapping_parameters(2.0, 0, TX_SEQPAR_DEFAULT_SCALE, 1);
455 float tX_seqpar_vtt_volume :: get_value(){ return tt->rel_volume; }
457 void tX_seqpar_vtt_volume :: do_exec(const float value)
459 tt->set_volume(value);
462 void tX_seqpar_vtt_volume :: do_update_graphics ()
464 gtk_adjustment_set_value(tt->gui.volume, 2.0-tt->rel_volume);
467 const char * tX_seqpar_vtt_volume :: get_name()
472 /**** Sequencable Parameter : Pan ****/
474 tX_seqpar_vtt_pan :: tX_seqpar_vtt_pan()
476 set_mapping_parameters(1.0, -1.0, TX_SEQPAR_DEFAULT_SCALE, 1);
479 float tX_seqpar_vtt_pan :: get_value(){ return tt->pan; }
481 void tX_seqpar_vtt_pan :: do_exec(const float value)
486 void tX_seqpar_vtt_pan :: do_update_graphics ()
488 gtk_adjustment_set_value(tt->gui.pan, tt->pan);
491 const char * tX_seqpar_vtt_pan :: get_name()
496 /**** Sequencable Parameter: TURNTABLE PITCH ****/
498 tX_seqpar_vtt_pitch :: tX_seqpar_vtt_pitch()
500 set_mapping_parameters(3.0, -3.0, TX_SEQPAR_DEFAULT_SCALE, 1);
503 float tX_seqpar_vtt_pitch :: get_value(){ return tt->rel_pitch; }
505 void tX_seqpar_vtt_pitch :: do_exec(const float value)
507 tt->set_pitch(value);
510 void tX_seqpar_vtt_pitch :: do_update_graphics ()
512 gtk_adjustment_set_value(tt->gui.pitch, tt->rel_pitch);
515 const char * tX_seqpar_vtt_pitch :: get_name()
520 /**** Sequencable Parameter: TURNTABLE TRIGGER ****/
522 tX_seqpar_vtt_trigger :: tX_seqpar_vtt_trigger()
524 set_mapping_parameters(0.01, 0, 1, 1);
528 void tX_seqpar_vtt_trigger :: do_exec(const float value)
530 if (value > 0) tt->trigger();
534 const char * tX_seqpar_vtt_trigger :: get_name()
536 return "Trigger (Start/Stop)";
539 /**** Sequencable Parameter: TURNTABLE LOOP ****/
541 tX_seqpar_vtt_loop :: tX_seqpar_vtt_loop()
543 set_mapping_parameters(0, 0, 0, 0);
548 void tX_seqpar_vtt_loop :: do_exec(const float value)
550 tt->set_loop(value>0);
553 const char * tX_seqpar_vtt_loop :: get_name()
555 return "Loop (On/Off)";
558 void tX_seqpar_vtt_loop :: do_update_graphics ()
560 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tt->gui.loop), tt->loop);
563 /**** Sequencable Parameter: TURNTABLE SYNC CLIENT ****/
565 tX_seqpar_vtt_sync_client :: tX_seqpar_vtt_sync_client()
567 set_mapping_parameters(0,0,0,0);
570 void tX_seqpar_vtt_sync_client :: do_exec(const float value)
572 tt->set_sync_client((value>0), tt->sync_cycles);
575 void tX_seqpar_vtt_sync_client :: do_update_graphics ()
577 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tt->gui.sync_client), tt->is_sync_client);
580 const char * tX_seqpar_vtt_sync_client :: get_name()
582 return "Sync Client (On/Off)";
585 /**** Sequencable Parameter: TURNTABLE SYNC CYCLES ****/
587 tX_seqpar_vtt_sync_cycles :: tX_seqpar_vtt_sync_cycles()
589 set_mapping_parameters(0,0,0,0);
592 void tX_seqpar_vtt_sync_cycles :: do_exec(const float value)
594 tt->set_sync_client(tt->is_sync_client, (int) value);
597 void tX_seqpar_vtt_sync_cycles :: do_update_graphics ()
599 gtk_adjustment_set_value(tt->gui.cycles, tt->sync_cycles);
602 const char * tX_seqpar_vtt_sync_cycles :: get_name()
604 return "Sync Cycles";
607 /**** Sequencable Parameter: TURNTABLE LP ENABLE ****/
609 tX_seqpar_vtt_lp_enable :: tX_seqpar_vtt_lp_enable()
611 set_mapping_parameters(0.01,0,1,1);
615 void tX_seqpar_vtt_lp_enable :: do_exec(const float value)
617 tt->lp_set_enable(value>0);
620 void tX_seqpar_vtt_lp_enable :: do_update_graphics ()
622 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tt->gui.lp_enable), tt->lp_enable);
625 const char * tX_seqpar_vtt_lp_enable :: get_name()
627 return "Lowpass: Enable (On/Off)";
630 /**** Sequencable Parameter: TURNTABLE LP GAIN ****/
632 tX_seqpar_vtt_lp_gain :: tX_seqpar_vtt_lp_gain()
634 set_mapping_parameters(2.0,0, TX_SEQPAR_DEFAULT_SCALE, 1);
637 float tX_seqpar_vtt_lp_gain :: get_value() { return tt->lp_gain; }
639 void tX_seqpar_vtt_lp_gain :: do_exec(const float value)
641 tt->lp_set_gain(value);
644 const char * tX_seqpar_vtt_lp_gain :: get_name()
646 return "Lowpass: Input Gain";
649 void tX_seqpar_vtt_lp_gain :: do_update_graphics ()
651 gtk_adjustment_set_value(tt->gui.lp_gain, tt->lp_gain);
654 /**** Sequencable Parameter: TURNTABLE LP RESO ****/
656 tX_seqpar_vtt_lp_reso :: tX_seqpar_vtt_lp_reso()
658 set_mapping_parameters(0.99, 0, TX_SEQPAR_DEFAULT_SCALE, 1);
661 float tX_seqpar_vtt_lp_reso :: get_value() { return tt->lp_reso; }
663 void tX_seqpar_vtt_lp_reso :: do_exec(const float value)
665 tt->lp_set_reso(value);
668 void tX_seqpar_vtt_lp_reso :: do_update_graphics ()
670 gtk_adjustment_set_value(tt->gui.lp_reso, tt->lp_reso);
673 const char * tX_seqpar_vtt_lp_reso :: get_name()
675 return "Lowpass: Resonance";
678 /**** Sequencable Parameter: TURNTABLE LP FREQUENCY ****/
680 tX_seqpar_vtt_lp_freq :: tX_seqpar_vtt_lp_freq()
682 set_mapping_parameters(0.99, 0, TX_SEQPAR_DEFAULT_SCALE, 1);
685 float tX_seqpar_vtt_lp_freq :: get_value() { return tt->lp_freq; }
687 void tX_seqpar_vtt_lp_freq :: do_exec(const float value)
689 tt->lp_set_freq(value);
692 const char * tX_seqpar_vtt_lp_freq :: get_name()
694 return "Lowpass: Cutoff Frequency";
697 void tX_seqpar_vtt_lp_freq :: do_update_graphics ()
699 gtk_adjustment_set_value(tt->gui.lp_freq, tt->lp_freq);
702 /**** Sequencable Parameter: TURNTABLE ECHO ENABLE ****/
704 tX_seqpar_vtt_ec_enable :: tX_seqpar_vtt_ec_enable()
706 set_mapping_parameters(0.01,0,1,1);
710 void tX_seqpar_vtt_ec_enable :: do_exec(const float value)
712 tt->ec_set_enable(value>0);
715 void tX_seqpar_vtt_ec_enable :: do_update_graphics ()
717 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tt->gui.ec_enable), tt->ec_enable);
720 const char * tX_seqpar_vtt_ec_enable :: get_name()
722 return "Echo: Enable (On/Off)";
725 /**** Sequencable Parameter: TURNTABLE ECHO LENGTH ****/
727 tX_seqpar_vtt_ec_length :: tX_seqpar_vtt_ec_length()
729 set_mapping_parameters(1.0, 0, TX_SEQPAR_DEFAULT_SCALE, 1);
732 float tX_seqpar_vtt_ec_length :: get_value() { return tt->ec_length; }
734 void tX_seqpar_vtt_ec_length :: do_exec(const float value)
736 tt->ec_set_length(value);
739 void tX_seqpar_vtt_ec_length :: do_update_graphics ()
741 gtk_adjustment_set_value(tt->gui.ec_length, tt->ec_length);
744 const char * tX_seqpar_vtt_ec_length :: get_name()
746 return "Echo: Duration";
749 /**** Sequencable Parameter: TURNTABLE ECHO FEEDBACK ****/
751 tX_seqpar_vtt_ec_feedback :: tX_seqpar_vtt_ec_feedback()
753 set_mapping_parameters(1.0, 0, TX_SEQPAR_DEFAULT_SCALE, 1);
756 float tX_seqpar_vtt_ec_feedback :: get_value() { return tt->ec_feedback; }
758 void tX_seqpar_vtt_ec_feedback :: do_exec(const float value)
760 tt->ec_set_feedback(value);
763 void tX_seqpar_vtt_ec_feedback :: do_update_graphics ()
765 gtk_adjustment_set_value(tt->gui.ec_feedback, tt->ec_feedback);
768 const char * tX_seqpar_vtt_ec_feedback :: get_name()
770 return "Echo: Feedback";
773 /**** Sequencable Parameter: TURNTABLE ECHO PAN ****/
775 tX_seqpar_vtt_ec_pan :: tX_seqpar_vtt_ec_pan()
777 set_mapping_parameters(1.0, -1.0, TX_SEQPAR_DEFAULT_SCALE, 1);
780 float tX_seqpar_vtt_ec_pan :: get_value() { return tt->ec_pan; }
782 void tX_seqpar_vtt_ec_pan :: do_exec(const float value)
784 tt->ec_set_pan(value);
787 void tX_seqpar_vtt_ec_pan :: do_update_graphics ()
789 gtk_adjustment_set_value(tt->gui.ec_pan, tt->ec_pan);
792 const char * tX_seqpar_vtt_ec_pan :: get_name()
797 /**** Sequencable Parameter: TURNTABLE ECHO VOLUME ****/
799 tX_seqpar_vtt_ec_volume :: tX_seqpar_vtt_ec_volume()
801 set_mapping_parameters(0.0, 3.0, TX_SEQPAR_DEFAULT_SCALE, 1);
804 float tX_seqpar_vtt_ec_volume :: get_value() { return tt->ec_volume; }
806 void tX_seqpar_vtt_ec_volume :: do_exec(const float value)
808 tt->ec_set_volume(value);
811 void tX_seqpar_vtt_ec_volume :: do_update_graphics ()
813 gtk_adjustment_set_value(tt->gui.ec_volume, tt->ec_volume);
816 const char * tX_seqpar_vtt_ec_volume :: get_name()
818 return "Echo: Volume";
822 /**** Sequencable Parameter: TURNTABLE MUTE ****/
824 tX_seqpar_vtt_mute :: tX_seqpar_vtt_mute()
826 set_mapping_parameters(0.01,0,1,1);
830 void tX_seqpar_vtt_mute :: do_exec(const float value)
832 tt->set_mute(value>0);
835 const char * tX_seqpar_vtt_mute :: get_name()
837 return "Mute (On/Off)";
840 /** LADSPA fx parameters **/
842 tX_seqpar_vttfx :: tX_seqpar_vttfx()
844 fx_value=(float *) malloc(sizeof(float));
846 set_mapping_parameters(0,0,0,0);
849 tX_seqpar_vttfx :: ~tX_seqpar_vttfx()
854 void tX_seqpar_vttfx :: set_name(const char *n, const char *sn)
857 strcpy(label_name, sn);
861 float tX_seqpar_vttfx :: get_value()
866 void tX_seqpar_vttfx :: create_widget()
868 fprintf(stderr, "tX: Ooops. create_widget() for tX_seqpar_vttfx.\n");
871 const char * tX_seqpar_vttfx :: get_name()
876 void tX_seqpar_vttfx_float :: create_widget()
878 float tmp=max_value - min_value/1000;
881 myadj=GTK_ADJUSTMENT(gtk_adjustment_new(*fx_value, min_value, max_value, tmp, tmp, tmp));
882 mydial=new tX_extdial(label_name, myadj);
883 gtk_signal_connect(GTK_OBJECT(myadj), "value_changed", (GtkSignalFunc) tX_seqpar_vttfx_float :: gtk_callback, this);
884 widget = mydial->get_widget();
887 tX_seqpar_vttfx_float :: ~tX_seqpar_vttfx_float()
892 void tX_seqpar_vttfx_float :: do_exec(const float value)
897 void tX_seqpar_vttfx_float :: do_update_graphics()
899 gtk_adjustment_set_value(myadj, *fx_value);
902 GtkSignalFunc tX_seqpar_vttfx_float :: gtk_callback(GtkWidget* w, tX_seqpar_vttfx_float *sp)
904 sp->receive_gui_value(sp->myadj->value);
908 #define WID_DYN TRUE, TRUE, 0
909 #define WID_FIX FALSE, FALSE, 0
911 void tX_seqpar_vttfx_int :: create_widget()
913 float tmp=max_value - min_value/1000;
917 myadj=GTK_ADJUSTMENT(gtk_adjustment_new(*fx_value, min_value, max_value, tmp, tmp, tmp));
918 widget=gtk_hbox_new(FALSE, 2);
919 tmpwid=gtk_label_new(label_name);
920 gtk_widget_show(tmpwid);
921 gtk_box_pack_start(GTK_BOX(widget), tmpwid, WID_FIX);
923 tmpwid=gtk_spin_button_new(myadj,1.0,0);
924 gtk_widget_show(tmpwid);
925 gtk_box_pack_start(GTK_BOX(widget), tmpwid, WID_DYN);
927 gtk_signal_connect(GTK_OBJECT(myadj), "value_changed", (GtkSignalFunc) tX_seqpar_vttfx_int :: gtk_callback, this);
930 tX_seqpar_vttfx_int :: ~tX_seqpar_vttfx_int()
932 gtk_widget_destroy(widget);
935 void tX_seqpar_vttfx_int :: do_exec(const float value)
940 void tX_seqpar_vttfx_int :: do_update_graphics()
942 gtk_adjustment_set_value(myadj, *fx_value);
945 GtkSignalFunc tX_seqpar_vttfx_int :: gtk_callback(GtkWidget* w, tX_seqpar_vttfx_int *sp)
947 sp->receive_gui_value(sp->myadj->value);
951 void tX_seqpar_vttfx_bool :: create_widget()
954 widget=gtk_check_button_new_with_label(label_name);
955 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), 0);
956 gtk_signal_connect(GTK_OBJECT(widget), "clicked", (GtkSignalFunc) tX_seqpar_vttfx_bool :: gtk_callback, this);
959 tX_seqpar_vttfx_bool :: ~tX_seqpar_vttfx_bool()
961 gtk_widget_destroy(widget);
964 void tX_seqpar_vttfx_bool :: do_exec(const float value)
969 GtkSignalFunc tX_seqpar_vttfx_bool :: gtk_callback(GtkWidget* w, tX_seqpar_vttfx_bool *sp)
971 sp->receive_gui_value(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sp->widget)));
975 void tX_seqpar_vttfx_bool :: do_update_graphics()
977 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), *fx_value==max_value);