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 tX_seqpar :: tX_seqpar () : bound_midi_event()
52 last_event_recorded=NULL;
55 void tX_seqpar :: set_mapping_parameters(float max, float min, float scale, int mappable)
63 void tX_seqpar :: handle_mouse_input(float adjustment)
67 tmpvalue=get_value()+adjustment*scale_value;
68 if (tmpvalue>max_value) tmpvalue=max_value;
69 if (tmpvalue<min_value) tmpvalue=min_value;
71 /*printf("Handling %s, max %f, min %f, scale %f, val: %f\n", get_name(), max_value, min_value, scale_value, tmpvalue);*/
73 receive_input_value(tmpvalue);
76 #ifdef USE_ALSA_MIDI_IN
77 void tX_seqpar :: handle_midi_input( const tX_midievent& event )
79 float tmpvalue = -1000;
81 //event.print( (string(__FUNCTION__) + " - " + get_name()).c_str() );
85 if( event.type == tX_midievent::CC || event.type == tX_midievent::PITCHBEND )
87 tmpvalue = event.value * (max_value-min_value) + min_value;
89 else if( event.type == tX_midievent::NOTE )
91 tmpvalue = event.is_noteon;
98 if (tmpvalue>max_value) tmpvalue=max_value;
99 else if (tmpvalue<min_value) tmpvalue=min_value;
103 tmpvalue=event.value;
108 /* Not using receive() as we want immediate GUI update... */
110 record_value(tmpvalue);
111 do_update_graphics();
115 void tX_seqpar :: set_vtt (void *mytt)
120 tX_seqpar :: ~tX_seqpar()
122 pthread_mutex_lock(&update_lock);
124 pthread_mutex_unlock(&update_lock);
125 sequencer.delete_all_events_for_sp(this, tX_sequencer::DELETE_ALL);
129 void tX_seqpar :: do_touch()
131 if (sequencer.is_recording())
134 touch_timestamp=sequencer.get_timestamp();
138 void tX_seqpar :: untouch_all()
140 list <tX_seqpar *> :: iterator sp;
142 for (sp=all.begin(); sp!=all.end(); sp++)
148 void tX_seqpar :: create_persistence_ids()
150 list <tX_seqpar *> :: iterator sp;
153 for (sp=all.begin(); sp!=all.end(); sp++)
156 (*sp)->set_persistence_id(pid);
160 tX_seqpar* tX_seqpar :: get_sp_by_persistence_id(unsigned int pid)
162 list <tX_seqpar *> :: iterator sp;
164 for (sp=all.begin(); sp!=all.end(); sp++)
166 if ((*sp)->get_persistence_id()==pid) return ((*sp));
169 fprintf (stderr, "oops: failed to lookup persistence id [%i].\n", pid);
174 void tX_seqpar :: record_value(const float value)
176 #define last_event ((tX_event *) last_event_recorded)
178 /* recording more than one event per seqpar for
179 one timestamp doesn't make sense... so if the
180 last_event_recorded was for the current timestamp
181 we simply set that event's value to the current one.
183 if ((last_event) && (last_event->get_timestamp() == sequencer.get_timestamp()))
185 last_event->set_value(value);
187 else last_event_recorded=(void *) sequencer.record(this, value);
190 void tX_seqpar :: receive_gui_value(const float value)
200 void tX_seqpar :: receive_input_value(const float value)
207 void tX_seqpar :: receive_forward_value(const float value)
212 void tX_seqpar :: materialize_forward_values()
214 list <tX_seqpar *> :: iterator sp;
216 for (sp=all.begin(); sp!=all.end(); sp++)
218 (*sp)->exec_value((*sp)->fwd_value);
223 char * tX_seqpar :: get_vtt_name()
225 if (vtt) return tt->name;
226 else return "Master Track";
229 void tX_seqpar :: restore_meta(xmlNodePtr node) {
232 buffer=(char *) xmlGetProp(node, (xmlChar *) "id");
233 if (buffer) { sscanf(buffer, "%i", &persistence_id); }
234 else { tX_error("no ID for seqpar %s", this->get_name()); }
236 buffer=(char *) xmlGetProp(node, (xmlChar *) "midiType");
238 if (strcmp("cc", buffer)==0) {
239 bound_midi_event.type=tX_midievent::CC;
240 } else if (strcmp("note", buffer)==0) {
241 bound_midi_event.type=tX_midievent::NOTE;
242 } else if (strcmp("pitchbend", buffer)==0) {
243 bound_midi_event.type=tX_midievent::PITCHBEND;
245 tX_error("unknown midiType \"%s\" for seqpar %s", buffer, this->get_name());
248 buffer=(char *) xmlGetProp(node, (xmlChar *) "midiChannel");
249 if (buffer) { sscanf(buffer, "%i", &bound_midi_event.channel); }
250 else { tX_error("no midiChannel for seqpar %s", this->get_name()); }
252 buffer=(char *) xmlGetProp(node, (xmlChar *) "midiNumber");
253 if (buffer) { sscanf(buffer, "%i", &bound_midi_event.number); }
254 else { tX_error("no midiNumber for seqpar %s", this->get_name()); }
256 /* else: no MIDI init.... */
259 void tX_seqpar :: store_meta(FILE *rc, gzFile rz) {
262 if (bound_midi_event.type!=tX_midievent::NONE) {
265 switch (bound_midi_event.type) {
266 case tX_midievent::NOTE: type="note"; break;
267 case tX_midievent::CC: type="cc"; break;
268 case tX_midievent::PITCHBEND: type="pitchbend"; break;
269 default: type="error";
271 sprintf(buffer, "id=\"%i\" midiType=\"%s\" midiChannel=\"%i\" midiNumber=\"%i\"", persistence_id, type, bound_midi_event.channel, bound_midi_event.number);
273 sprintf(buffer, "id=\"%i\"", persistence_id);
279 const char * tX_seqpar :: get_name()
281 return "This string means trouble!";
284 float tX_seqpar :: get_value()
286 printf("Ooops. tX_seqpar::get_value() called. Trouble.");
290 void tX_seqpar :: update_graphics()
293 do_update_graphics();
294 while (gtk_events_pending()) gtk_main_iteration(); /* gtk_flush */
298 void tX_seqpar :: update_all_graphics()
300 list <tX_seqpar *> :: iterator sp;
302 pthread_mutex_lock(&update_lock);
306 pthread_mutex_unlock(&update_lock);
310 while (gtk_events_pending()) gtk_main_iteration();
311 for (sp=update.begin(); sp!=update.end(); sp++)
313 (*sp)->update_graphics();
315 update.erase(update.begin(), update.end());
316 pthread_mutex_unlock(&update_lock);
319 void tX_seqpar :: init_all_graphics()
321 list <tX_seqpar *> :: iterator sp;
323 pthread_mutex_lock(&update_lock);
325 for (sp=all.begin(); sp!=all.end(); sp++)
327 (*sp)->update_graphics();
329 while (gtk_events_pending()) gtk_main_iteration();
331 pthread_mutex_unlock(&update_lock);
334 void tX_seqpar_update :: exec_value(const float value)
337 pthread_mutex_lock(&update_lock);
338 update.push_front(this);
339 pthread_mutex_unlock(&update_lock);
342 void tX_seqpar_no_update :: exec_value(const float value)
347 void tX_seqpar_no_update :: do_update_graphics()
353 void tX_seqpar_no_update_active_forward :: receive_forward_value(const float value)
359 void tX_seqpar_update_active_forward :: receive_forward_value(const float value)
367 /**** Sequencable Parameter: MASTER VOLUME ****/
369 tX_seqpar_master_volume :: tX_seqpar_master_volume()
371 set_mapping_parameters(2.5, 0, 0.1, 0);
374 void tX_seqpar_master_volume :: do_exec(const float value)
376 vtt_class :: set_master_volume(value);
379 void tX_seqpar_master_volume :: do_update_graphics ()
381 gtk_adjustment_set_value(volume_adj, 2.0-vtt_class::master_volume);
384 const char * tX_seqpar_master_volume :: get_name()
386 return "Master Volume";
389 /**** Sequencable Parameter: MASTER PITCH ****/
391 tX_seqpar_master_pitch :: tX_seqpar_master_pitch()
393 set_mapping_parameters(3.0, -3.0, 0.1, 0);
396 void tX_seqpar_master_pitch :: do_exec(const float value)
398 vtt_class :: set_master_pitch(value);
401 void tX_seqpar_master_pitch :: do_update_graphics ()
403 gtk_adjustment_set_value(pitch_adj, globals.pitch);
406 const char * tX_seqpar_master_pitch :: get_name()
408 return "Master Pitch";
411 /**** Sequencable Parameter: TURNTABLE SPEED ****/
413 tX_seqpar_vtt_speed :: tX_seqpar_vtt_speed()
415 // min max scale are not required for this parameter
416 set_mapping_parameters(3.0, -3.0, 0.1, 1);
419 /* speed works differently so we need an extra input-handler */
421 void tX_seqpar_vtt_speed :: handle_mouse_input(float adjustment)
423 if (tt->do_scratch) tt->sp_speed.receive_input_value(adjustment);
424 tt->sense_cycles=globals.sense_cycles;
427 void tX_seqpar_vtt_speed :: do_exec(const float value)
429 tt->speed=value*tt->audiofile_pitch_correction;
432 const char * tX_seqpar_vtt_speed :: get_name()
434 return "Speed (Scratching)";
437 /**** Sequencable Parameter: TURNTABLE SPIN ****/
439 tX_seqpar_spin :: tX_seqpar_spin()
441 set_mapping_parameters(1, 0, 0, 0);
444 void tX_seqpar_spin :: do_exec(const float value)
446 if (value > 0) tt->speed=tt->res_pitch;
450 const char * tX_seqpar_spin :: get_name()
452 return "Motor Spin (On/Off)";
455 /**** Sequencable Parameter: TURNTABLE VOLUME ****/
457 tX_seqpar_vtt_volume :: tX_seqpar_vtt_volume()
459 set_mapping_parameters(2.0, 0, TX_SEQPAR_DEFAULT_SCALE, 1);
462 float tX_seqpar_vtt_volume :: get_value(){ return tt->rel_volume; }
464 void tX_seqpar_vtt_volume :: do_exec(const float value)
466 tt->set_volume(value);
469 void tX_seqpar_vtt_volume :: do_update_graphics ()
471 gtk_adjustment_set_value(tt->gui.volume, 2.0-tt->rel_volume);
474 const char * tX_seqpar_vtt_volume :: get_name()
479 /**** Sequencable Parameter : Pan ****/
481 tX_seqpar_vtt_pan :: tX_seqpar_vtt_pan()
483 set_mapping_parameters(1.0, -1.0, TX_SEQPAR_DEFAULT_SCALE, 1);
486 float tX_seqpar_vtt_pan :: get_value(){ return tt->pan; }
488 void tX_seqpar_vtt_pan :: do_exec(const float value)
493 void tX_seqpar_vtt_pan :: do_update_graphics ()
495 gtk_adjustment_set_value(tt->gui.pan, tt->pan);
498 const char * tX_seqpar_vtt_pan :: get_name()
503 /**** Sequencable Parameter: TURNTABLE PITCH ****/
505 tX_seqpar_vtt_pitch :: tX_seqpar_vtt_pitch()
507 set_mapping_parameters(3.0, -3.0, TX_SEQPAR_DEFAULT_SCALE, 1);
510 float tX_seqpar_vtt_pitch :: get_value(){ return tt->rel_pitch; }
512 void tX_seqpar_vtt_pitch :: do_exec(const float value)
514 tt->set_pitch(value);
517 void tX_seqpar_vtt_pitch :: do_update_graphics ()
519 gtk_adjustment_set_value(tt->gui.pitch, tt->rel_pitch);
522 const char * tX_seqpar_vtt_pitch :: get_name()
527 /**** Sequencable Parameter: TURNTABLE TRIGGER ****/
529 tX_seqpar_vtt_trigger :: tX_seqpar_vtt_trigger()
531 set_mapping_parameters(0.01, 0, 1, 1);
535 void tX_seqpar_vtt_trigger :: do_exec(const float value)
537 if (value > 0) tt->trigger();
541 const char * tX_seqpar_vtt_trigger :: get_name()
543 return "Trigger (Start/Stop)";
546 /**** Sequencable Parameter: TURNTABLE LOOP ****/
548 tX_seqpar_vtt_loop :: tX_seqpar_vtt_loop()
550 set_mapping_parameters(0, 0, 0, 0);
555 void tX_seqpar_vtt_loop :: do_exec(const float value)
557 tt->set_loop(value>0);
560 const char * tX_seqpar_vtt_loop :: get_name()
562 return "Loop (On/Off)";
565 void tX_seqpar_vtt_loop :: do_update_graphics ()
567 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tt->gui.loop), tt->loop);
570 /**** Sequencable Parameter: TURNTABLE SYNC CLIENT ****/
572 tX_seqpar_vtt_sync_client :: tX_seqpar_vtt_sync_client()
574 set_mapping_parameters(0,0,0,0);
577 void tX_seqpar_vtt_sync_client :: do_exec(const float value)
579 tt->set_sync_client((value>0), tt->sync_cycles);
582 void tX_seqpar_vtt_sync_client :: do_update_graphics ()
584 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tt->gui.sync_client), tt->is_sync_client);
587 const char * tX_seqpar_vtt_sync_client :: get_name()
589 return "Sync Client (On/Off)";
592 /**** Sequencable Parameter: TURNTABLE SYNC CYCLES ****/
594 tX_seqpar_vtt_sync_cycles :: tX_seqpar_vtt_sync_cycles()
596 set_mapping_parameters(0,0,0,0);
599 void tX_seqpar_vtt_sync_cycles :: do_exec(const float value)
601 tt->set_sync_client(tt->is_sync_client, (int) value);
604 void tX_seqpar_vtt_sync_cycles :: do_update_graphics ()
606 gtk_adjustment_set_value(tt->gui.cycles, tt->sync_cycles);
609 const char * tX_seqpar_vtt_sync_cycles :: get_name()
611 return "Sync Cycles";
614 /**** Sequencable Parameter: TURNTABLE LP ENABLE ****/
616 tX_seqpar_vtt_lp_enable :: tX_seqpar_vtt_lp_enable()
618 set_mapping_parameters(0.01,0,1,1);
622 void tX_seqpar_vtt_lp_enable :: do_exec(const float value)
624 tt->lp_set_enable(value>0);
627 void tX_seqpar_vtt_lp_enable :: do_update_graphics ()
629 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tt->gui.lp_enable), tt->lp_enable);
632 const char * tX_seqpar_vtt_lp_enable :: get_name()
634 return "Lowpass: Enable (On/Off)";
637 /**** Sequencable Parameter: TURNTABLE LP GAIN ****/
639 tX_seqpar_vtt_lp_gain :: tX_seqpar_vtt_lp_gain()
641 set_mapping_parameters(2.0,0, TX_SEQPAR_DEFAULT_SCALE, 1);
644 float tX_seqpar_vtt_lp_gain :: get_value() { return tt->lp_gain; }
646 void tX_seqpar_vtt_lp_gain :: do_exec(const float value)
648 tt->lp_set_gain(value);
651 const char * tX_seqpar_vtt_lp_gain :: get_name()
653 return "Lowpass: Input Gain";
656 void tX_seqpar_vtt_lp_gain :: do_update_graphics ()
658 gtk_adjustment_set_value(tt->gui.lp_gain, tt->lp_gain);
661 /**** Sequencable Parameter: TURNTABLE LP RESO ****/
663 tX_seqpar_vtt_lp_reso :: tX_seqpar_vtt_lp_reso()
665 set_mapping_parameters(0.99, 0, TX_SEQPAR_DEFAULT_SCALE, 1);
668 float tX_seqpar_vtt_lp_reso :: get_value() { return tt->lp_reso; }
670 void tX_seqpar_vtt_lp_reso :: do_exec(const float value)
672 tt->lp_set_reso(value);
675 void tX_seqpar_vtt_lp_reso :: do_update_graphics ()
677 gtk_adjustment_set_value(tt->gui.lp_reso, tt->lp_reso);
680 const char * tX_seqpar_vtt_lp_reso :: get_name()
682 return "Lowpass: Resonance";
685 /**** Sequencable Parameter: TURNTABLE LP FREQUENCY ****/
687 tX_seqpar_vtt_lp_freq :: tX_seqpar_vtt_lp_freq()
689 set_mapping_parameters(0.99, 0, TX_SEQPAR_DEFAULT_SCALE, 1);
692 float tX_seqpar_vtt_lp_freq :: get_value() { return tt->lp_freq; }
694 void tX_seqpar_vtt_lp_freq :: do_exec(const float value)
696 tt->lp_set_freq(value);
699 const char * tX_seqpar_vtt_lp_freq :: get_name()
701 return "Lowpass: Cutoff Frequency";
704 void tX_seqpar_vtt_lp_freq :: do_update_graphics ()
706 gtk_adjustment_set_value(tt->gui.lp_freq, tt->lp_freq);
709 /**** Sequencable Parameter: TURNTABLE ECHO ENABLE ****/
711 tX_seqpar_vtt_ec_enable :: tX_seqpar_vtt_ec_enable()
713 set_mapping_parameters(0.01,0,1,1);
717 void tX_seqpar_vtt_ec_enable :: do_exec(const float value)
719 tt->ec_set_enable(value>0);
722 void tX_seqpar_vtt_ec_enable :: do_update_graphics ()
724 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tt->gui.ec_enable), tt->ec_enable);
727 const char * tX_seqpar_vtt_ec_enable :: get_name()
729 return "Echo: Enable (On/Off)";
732 /**** Sequencable Parameter: TURNTABLE ECHO LENGTH ****/
734 tX_seqpar_vtt_ec_length :: tX_seqpar_vtt_ec_length()
736 set_mapping_parameters(1.0, 0, TX_SEQPAR_DEFAULT_SCALE, 1);
739 float tX_seqpar_vtt_ec_length :: get_value() { return tt->ec_length; }
741 void tX_seqpar_vtt_ec_length :: do_exec(const float value)
743 tt->ec_set_length(value);
746 void tX_seqpar_vtt_ec_length :: do_update_graphics ()
748 gtk_adjustment_set_value(tt->gui.ec_length, tt->ec_length);
751 const char * tX_seqpar_vtt_ec_length :: get_name()
753 return "Echo: Duration";
756 /**** Sequencable Parameter: TURNTABLE ECHO FEEDBACK ****/
758 tX_seqpar_vtt_ec_feedback :: tX_seqpar_vtt_ec_feedback()
760 set_mapping_parameters(1.0, 0, TX_SEQPAR_DEFAULT_SCALE, 1);
763 float tX_seqpar_vtt_ec_feedback :: get_value() { return tt->ec_feedback; }
765 void tX_seqpar_vtt_ec_feedback :: do_exec(const float value)
767 tt->ec_set_feedback(value);
770 void tX_seqpar_vtt_ec_feedback :: do_update_graphics ()
772 gtk_adjustment_set_value(tt->gui.ec_feedback, tt->ec_feedback);
775 const char * tX_seqpar_vtt_ec_feedback :: get_name()
777 return "Echo: Feedback";
780 /**** Sequencable Parameter: TURNTABLE ECHO PAN ****/
782 tX_seqpar_vtt_ec_pan :: tX_seqpar_vtt_ec_pan()
784 set_mapping_parameters(1.0, -1.0, TX_SEQPAR_DEFAULT_SCALE, 1);
787 float tX_seqpar_vtt_ec_pan :: get_value() { return tt->ec_pan; }
789 void tX_seqpar_vtt_ec_pan :: do_exec(const float value)
791 tt->ec_set_pan(value);
794 void tX_seqpar_vtt_ec_pan :: do_update_graphics ()
796 gtk_adjustment_set_value(tt->gui.ec_pan, tt->ec_pan);
799 const char * tX_seqpar_vtt_ec_pan :: get_name()
804 /**** Sequencable Parameter: TURNTABLE ECHO VOLUME ****/
806 tX_seqpar_vtt_ec_volume :: tX_seqpar_vtt_ec_volume()
808 set_mapping_parameters(0.0, 3.0, TX_SEQPAR_DEFAULT_SCALE, 1);
811 float tX_seqpar_vtt_ec_volume :: get_value() { return tt->ec_volume; }
813 void tX_seqpar_vtt_ec_volume :: do_exec(const float value)
815 tt->ec_set_volume(value);
818 void tX_seqpar_vtt_ec_volume :: do_update_graphics ()
820 gtk_adjustment_set_value(tt->gui.ec_volume, tt->ec_volume);
823 const char * tX_seqpar_vtt_ec_volume :: get_name()
825 return "Echo: Volume";
829 /**** Sequencable Parameter: TURNTABLE MUTE ****/
831 tX_seqpar_vtt_mute :: tX_seqpar_vtt_mute()
833 set_mapping_parameters(0.01,0,1,1);
837 void tX_seqpar_vtt_mute :: do_exec(const float value)
839 tt->set_mute(value>0);
842 const char * tX_seqpar_vtt_mute :: get_name()
844 return "Mute (On/Off)";
847 /** LADSPA fx parameters **/
849 tX_seqpar_vttfx :: tX_seqpar_vttfx()
851 fx_value=(float *) malloc(sizeof(float));
853 set_mapping_parameters(0,0,0,0);
856 tX_seqpar_vttfx :: ~tX_seqpar_vttfx()
861 void tX_seqpar_vttfx :: set_name(const char *n, const char *sn)
864 strcpy(label_name, sn);
868 float tX_seqpar_vttfx :: get_value()
873 void tX_seqpar_vttfx :: create_widget()
875 fprintf(stderr, "tX: Ooops. create_widget() for tX_seqpar_vttfx.\n");
878 const char * tX_seqpar_vttfx :: get_name()
883 void tX_seqpar_vttfx_float :: create_widget()
885 float tmp=max_value - min_value/1000;
888 myadj=GTK_ADJUSTMENT(gtk_adjustment_new(*fx_value, min_value, max_value, tmp, tmp, tmp));
889 mydial=new tX_extdial(label_name, myadj);
890 gtk_signal_connect(GTK_OBJECT(myadj), "value_changed", (GtkSignalFunc) tX_seqpar_vttfx_float :: gtk_callback, this);
891 widget = mydial->get_widget();
894 tX_seqpar_vttfx_float :: ~tX_seqpar_vttfx_float()
899 void tX_seqpar_vttfx_float :: do_exec(const float value)
904 void tX_seqpar_vttfx_float :: do_update_graphics()
906 gtk_adjustment_set_value(myadj, *fx_value);
909 GtkSignalFunc tX_seqpar_vttfx_float :: gtk_callback(GtkWidget* w, tX_seqpar_vttfx_float *sp)
911 sp->receive_gui_value(sp->myadj->value);
915 #define WID_DYN TRUE, TRUE, 0
916 #define WID_FIX FALSE, FALSE, 0
918 void tX_seqpar_vttfx_int :: create_widget()
920 float tmp=max_value - min_value/1000;
924 myadj=GTK_ADJUSTMENT(gtk_adjustment_new(*fx_value, min_value, max_value, tmp, tmp, tmp));
925 widget=gtk_vbox_new(FALSE, 2);
927 tmpwid=gtk_spin_button_new(myadj,1.0,0);
928 gtk_widget_show(tmpwid);
929 gtk_box_pack_start(GTK_BOX(widget), tmpwid, WID_DYN);
931 gtk_signal_connect(GTK_OBJECT(myadj), "value_changed", (GtkSignalFunc) tX_seqpar_vttfx_int :: gtk_callback, this);
933 tmpwid=gtk_label_new(label_name);
934 gtk_widget_show(tmpwid);
935 gtk_box_pack_start(GTK_BOX(widget), tmpwid, WID_FIX);
938 tX_seqpar_vttfx_int :: ~tX_seqpar_vttfx_int()
940 gtk_widget_destroy(widget);
943 void tX_seqpar_vttfx_int :: do_exec(const float value)
948 void tX_seqpar_vttfx_int :: do_update_graphics()
950 gtk_adjustment_set_value(myadj, *fx_value);
953 GtkSignalFunc tX_seqpar_vttfx_int :: gtk_callback(GtkWidget* w, tX_seqpar_vttfx_int *sp)
955 sp->receive_gui_value(sp->myadj->value);
959 void tX_seqpar_vttfx_bool :: create_widget()
962 widget=gtk_check_button_new_with_label(label_name);
963 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), 0);
964 gtk_signal_connect(GTK_OBJECT(widget), "clicked", (GtkSignalFunc) tX_seqpar_vttfx_bool :: gtk_callback, this);
967 tX_seqpar_vttfx_bool :: ~tX_seqpar_vttfx_bool()
969 gtk_widget_destroy(widget);
972 void tX_seqpar_vttfx_bool :: do_exec(const float value)
977 GtkSignalFunc tX_seqpar_vttfx_bool :: gtk_callback(GtkWidget* w, tX_seqpar_vttfx_bool *sp)
979 sp->receive_gui_value(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sp->widget)));
983 void tX_seqpar_vttfx_bool :: do_update_graphics()
985 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), *fx_value==max_value);