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 new virtual turntable class. It replaces
22 the old turntable.c from terminatorX 3.2 and earlier. The lowpass
23 filter is based on some sample code by Paul Kellett
24 <paul.kellett@maxim.abel.co.uk>
26 08 Dec 1999 - Switched to the new audiofile class
30 #include "tX_global.h"
34 #include "tX_mastergui.h"
35 #include "tX_sequencer.h"
44 #include "tX_loaddlg.h"
46 #define USE_PREFETCH 1
49 #define my_prefetch(base, index); __asm__ __volatile__ ("prefetch index(%0)\n" : : "r" (base));
50 #define my_prefetchw(base, index); __asm__ __volatile__ ("prefetchw index(%0)\n" : : "r" (base));
52 #define my_prefetch(base, index); /* NOP */;
53 #define my_prefetchw(base, index); /* NOP */;
56 extern void build_vtt_gui(vtt_class *);
57 extern void gui_set_name(vtt_class *vtt, char *newname);
58 extern void gui_set_filename(vtt_class *vtt, char *newname);
59 extern void delete_gui(vtt_class *vtt);
60 extern void gui_update_display(vtt_class *vtt);
61 extern void gui_clear_master_button(vtt_class *vtt);
62 extern void cleanup_vtt(vtt_class *vtt);
63 extern int vg_get_current_page(vtt_class *vtt);
64 extern void vg_set_current_page(vtt_class *vtt, int page);
66 int vtt_class::vtt_amount=0;
67 list <vtt_class *> vtt_class::main_list;
68 list <vtt_class *> vtt_class::render_list;
69 int16_t* vtt_class::mix_out_buffer=NULL;
70 f_prec * vtt_class::mix_buffer=NULL;
71 f_prec * vtt_class::mix_buffer_end=NULL;
73 int vtt_class::samples_in_mix_buffer=0;
74 pthread_mutex_t vtt_class::render_lock=PTHREAD_MUTEX_INITIALIZER;
75 pthread_mutex_t vtt_class::main_lock=PTHREAD_MUTEX_INITIALIZER;
76 f_prec vtt_class::master_volume=1.0;
77 f_prec vtt_class::res_master_volume=1.0;
78 //f_prec vtt_class::saturate_fac=((f_prec) SAMPLE_MAX-SAMPLE_BORDER)*1.0/FLT_MAX;
79 f_prec vtt_class::saturate_fac=0.1;
80 int vtt_class::do_saturate=0;
81 vtt_class * vtt_class::sync_master=NULL;
82 int vtt_class::master_triggered=0;
83 int vtt_class::master_triggered_at=0;
84 vtt_class * vtt_class::focused_vtt=NULL;
85 f_prec vtt_class::mix_max=0;
86 f_prec vtt_class::vol_channel_adjust=1.0;
88 #define GAIN_AUTO_ADJUST 0.8
90 vtt_class :: vtt_class (int do_create_gui)
93 sprintf (name, "Turntable %i", vtt_amount);
94 strcpy(filename, "NONE");
110 x_control=CONTROL_SCRATCH;
111 y_control=CONTROL_CUTOFF;
117 lp_setup(lp_gain, lp_reso, lp_freq);
125 // pthread_mutex_lock(&main_lock);
126 main_list.push_back(this);
127 // pthread_mutex_unlock(&main_lock);
130 /* "connecting" the seq-parameters */
132 sp_speed.set_vtt((void *) this);
133 sp_volume.set_vtt((void *) this);
134 sp_pitch.set_vtt((void *) this);
135 sp_trigger.set_vtt((void *) this);
136 sp_loop.set_vtt((void *) this);
137 sp_sync_client.set_vtt((void *) this);
138 sp_sync_cycles.set_vtt((void *) this);
139 sp_lp_enable.set_vtt((void *) this);
140 sp_lp_gain.set_vtt((void *) this);
141 sp_lp_reso.set_vtt((void *) this);
142 sp_lp_freq.set_vtt((void *) this);
143 sp_ec_enable.set_vtt((void *) this);
144 sp_ec_length.set_vtt((void *) this);
145 sp_ec_feedback.set_vtt((void *) this);
146 sp_mute.set_vtt((void *) this);
147 sp_spin.set_vtt((void *) this);
152 lp_fx=new vtt_fx_lp();
153 lp_fx->set_vtt((void *) this);
154 fx_list.push_back(lp_fx);
156 ec_fx=new vtt_fx_ec();
157 ec_fx->set_vtt((void *) this);
158 fx_list.push_back(ec_fx);
163 lp_fx->set_panel_widget(gui.lp_panel->get_widget());
164 ec_fx->set_panel_widget(gui.ec_panel->get_widget());
168 set_master_volume(globals.volume);
169 set_output_buffer_size(samples_in_mix_buffer);
174 vtt_class :: ~vtt_class()
178 // pthread_mutex_lock(&main_lock);
179 main_list.remove(this);
180 // pthread_mutex_unlock(&main_lock);
181 if (audiofile) delete audiofile;
182 //if (buffer) free(buffer);
183 if (output_buffer) free(output_buffer);
186 while (fx_list.size())
188 effect=(*fx_list.begin());
189 fx_list.remove(effect);
196 void vtt_class :: set_name(char *newname)
198 strcpy(name, newname);
199 gui_set_name(this, name);
202 int vtt_class :: load_file(char *fname)
205 int was_playing=is_playing;
207 if (is_playing) stop();
209 if (audiofile) delete(audiofile);
216 audiofile=new tx_audiofile();
217 res=audiofile->load(fname);
219 if (res==TX_AUDIO_SUCCESS)
221 buffer=audiofile->get_buffer();
222 samples_in_buffer=audiofile->get_no_samples();
223 maxpos=audiofile->get_no_samples();
224 strcpy(filename, fname);
225 if (was_playing) trigger();
226 // printf("Successfully loaded %s, %08x, %i\n", fname, buffer, samples_in_buffer);
231 gui_update_display(this);
233 ec_set_length(ec_length);
238 int vtt_class :: set_output_buffer_size(int newsize)
240 list <vtt_fx *> :: iterator effect;
242 if (output_buffer) free(output_buffer);
243 output_buffer = (float *) malloc (sizeof(float)*newsize);
244 end_of_outputbuffer = output_buffer + newsize; //size_t(sizeof(float)*(newsize));
246 samples_in_outputbuffer=newsize;
247 inv_samples_in_outputbuffer=1.0/samples_in_outputbuffer;
249 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
251 (*effect)->reconnect_buffer();
254 if (output_buffer) return(0);
258 void vtt_class :: set_volume(f_prec newvol)
264 void vtt_class :: recalc_volume()
266 res_volume=rel_volume*res_master_volume;
268 mm_res_volume.s[0]=mm_res_volume.s[1]=res_volume;
272 void vtt_class :: set_pitch(f_prec newpitch)
275 // res_pitch=fabs(globals.pitch)*rel_pitch;
276 res_pitch=globals.pitch*rel_pitch;
278 ec_set_length(ec_length);
281 void vtt_class :: recalc_pitch()
283 // res_pitch=fabs(globals.pitch)*rel_pitch;
284 res_pitch=globals.pitch*rel_pitch;
286 ec_set_length(ec_length);
289 void vtt_class :: set_autotrigger(int newstate)
291 autotrigger=newstate;
294 void vtt_class :: set_loop(int newstate)
299 void vtt_class :: set_controls (int x, int y)
305 void vtt_class :: set_mute(int newstate)
310 void vtt_class :: lp_set_enable (int newstate)
315 void vtt_class :: lp_set_gain (f_prec gain)
318 lp_resgain=lp_gain*lp_autogain;
321 void vtt_class :: lp_set_reso(f_prec reso)
325 lp_b=reso*(1.0+(1.0/lp_a));
326 lp_autogain=1.0-reso*GAIN_AUTO_ADJUST;
327 lp_resgain=lp_gain*lp_autogain;
330 void vtt_class :: lp_set_freq(f_prec freq)
335 lp_b=lp_reso*(1.0+(1.0/lp_a));
337 //printf("a %f, b%f\n", lp_a, lp_b);
340 void vtt_class :: lp_setup(f_prec gain, f_prec reso, f_prec freq)
346 lp_b=reso*(1.0+(1.0/lp_a));
348 lp_autogain=1.0-reso*GAIN_AUTO_ADJUST;
349 lp_resgain=lp_gain*lp_autogain;
352 void vtt_class :: ec_set_enable(int newstate)
357 /* Max length is 1.0 */
359 void vtt_class :: ec_set_length(f_prec length)
367 ec_res_length=length*samples_in_buffer;
371 ec_res_length=length*samples_in_buffer/res_pitch;
374 if (ec_res_length<0) ec_res_length*=-1;
376 if (ec_res_length>=EC_MAX_BUFFER)
378 ec_res_length=EC_MAX_BUFFER*length;
381 delay=(int )floor(ec_res_length);
383 ec_delay=&ec_buffer[delay];
386 void vtt_class :: ec_set_feedback(f_prec feedback)
388 ec_feedback=feedback;
391 void vtt_class :: ec_clear_buffer()
395 for (i=0; i<EC_MAX_BUFFER; i++)
402 void vtt_class :: render()
404 list <vtt_fx *> :: iterator effect;
411 if (sense_cycles==0) sp_speed.receive_input_value(0);
416 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
418 if ((*effect)->isEnabled()) (*effect)->run();
422 extern void vg_create_fx_gui(vtt_class *vtt, vtt_fx_ladspa *effect, LADSPA_Plugin *plugin);
424 vtt_fx_ladspa * vtt_class :: add_effect (LADSPA_Plugin *plugin)
426 vtt_fx_ladspa *new_effect;
428 new_effect = new vtt_fx_ladspa (plugin, this);
429 pthread_mutex_lock(&render_lock);
430 fx_list.push_back(new_effect);
431 if (is_playing) new_effect->activate();
432 pthread_mutex_unlock(&render_lock);
433 vg_create_fx_gui(this, new_effect, plugin);
438 void vtt_class :: calc_speed()
440 do_mute=fade_out=fade_in=0;
442 if (speed != speed_target)
445 speed_step=speed_target-speed_real;
449 if (speed_target != speed_real)
451 speed_real+=speed_step;
452 if ((speed_step<0) && (speed_real<speed_target)) speed_real=speed_target;
454 if ((speed_step>0) && (speed_real>speed_target)) speed_real=speed_target;
459 if ((speed_last==0) && (speed_real !=0))
467 if ((speed_last!=0) && (speed_real==0))
474 speed_last = speed_real;
476 if (mute != mute_old)
480 fade_out=1; fade_in=0;
485 fade_in=1; fade_out=0;
496 void vtt_class :: render_scratch()
517 for (sample =0,out=output_buffer, fade_vol=0.0; sample < samples_in_outputbuffer;sample++, out++, fade_vol+=inv_samples_in_outputbuffer)
519 if ((speed_real!=0) || (fade_out))
534 master_triggered_at=sample;
554 master_triggered_at=sample;
564 pos_a_f=floor(pos_f);
565 pos_i=(unsigned int) pos_a_f;
567 amount_b=pos_f-pos_a_f;
568 amount_a=1.0-amount_b;
577 sample_a=(f_prec) *ptr;
579 if (pos_i == samples_in_buffer)
586 sample_b=(f_prec) *ptr;
589 sample_res=(sample_a*amount_a)+(sample_b*amount_b);
593 sample_res*=fade_vol;
598 sample_res*=1.0-fade_vol;
611 void vtt_class :: forward_turntable()
622 if ((speed_real==0) && (!fade_out)) return;
625 /* following code is problematic as adding speed_real*n is
626 different from adding speed_real n times to pos_f.
628 well it speeds things up quite a bit and double precision
629 seems to do a satisfying job.
631 #define pos_f_test to prove that.
634 pos_f_tmp=pos_f+speed_real*samples_in_outputbuffer;
636 if ((pos_f_tmp > 0) && (pos_f_tmp < maxpos))
646 /* now the slow way ;) */
648 for (sample =0; sample < samples_in_outputbuffer; sample++)
662 master_triggered_at=sample;
682 master_triggered_at=sample;
696 diff=pos_f_tmp-pos_f;
697 if (diff!=0) printf("fast: %f, slow: %f, diff: %f, tt: %s\n", pos_f_tmp, pos_f, diff, name);
703 The following lowpass filter is based on some sample code by
704 Paul Kellett <paul.kellett@maxim.abel.co.uk>
707 void vtt_class :: render_lp()
711 for (sample = output_buffer; sample<end_of_outputbuffer; sample++)
713 lp_buf0 = lp_a * lp_buf0 + lp_freq * ((*sample)*lp_resgain + lp_b * (lp_buf0 - lp_buf1));
714 lp_buf1 = lp_a * lp_buf1 + lp_freq * lp_buf0;
720 void vtt_class :: render_ec()
726 /* my_prefetchw(ec_ptr, 0);
727 my_prefetchw(ec_ptr, 8);
728 my_prefetchw(ec_ptr, 16);
729 my_prefetchw(ec_ptr, 32);*/
731 feed.s[0]=ec_feedback;
732 feed.s[1]=ec_feedback;
736 for (sample = (mmx_t*) output_buffer; sample<(mmx_t*) end_of_outputbuffer; sample++, ec_ptr+=2)
739 if (ec_ptr>ec_delay) ec_ptr=ec_buffer;
741 movq_m2r(*sample, mm1);
742 movq_m2r(*ec_ptr, mm2);
747 movq_r2m(mm2, *sample);
748 movq_r2m(mm2, *ec_ptr);
758 for (i=0, sample = output_buffer; i<samples_in_outputbuffer; i++, sample++, ec_ptr++)
760 if (ec_ptr>ec_delay) ec_ptr=ec_buffer;
762 temp= *sample + (*ec_ptr) *ec_feedback;
769 int vtt_class :: set_mix_buffer_size(int no_samples)
771 list <vtt_class *> :: iterator vtt;
774 if (mix_buffer) free(mix_buffer);
775 mix_buffer=(float *) malloc (sizeof(float)*no_samples);
776 mix_buffer_end=mix_buffer+no_samples;
778 if (mix_out_buffer) free(mix_out_buffer);
779 mix_out_buffer=(int16_t *) malloc (sizeof(int16_t)*no_samples + 4); /* extra 4 for 3DNow! */
780 samples_in_mix_buffer=no_samples;
782 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
784 res|=(*vtt)->set_output_buffer_size(no_samples);
787 if ((!mix_buffer) || (!mix_out_buffer) || res) return(1);
791 int16_t * vtt_class :: render_all_turntables()
793 list <vtt_class *> :: iterator vtt, next;
809 int32_t *temp_int=&mm_max.d[1];
813 pthread_mutex_lock(&render_lock);
815 switch (render_list.size())
817 case 0: for (sample=0; sample<samples_in_mix_buffer; sample++)
819 mix_out_buffer[sample]=0;
822 /* case 1: vtt=render_list.begin();
826 for (sample=0; sample<samples_in_mix_buffer; sample++)
828 temp=((*vtt)->output_buffer[sample]*(*vtt)->res_volume);
829 if (temp>SAMPLE_BORDER)
836 if (temp<-SAMPLE_BORDER)
842 mix_out_buffer[sample]=(int16_t) temp;
845 for (sample=0; sample<samples_in_mix_buffer; sample++)
847 mix_out_buffer[sample]=(int16_t) ((*vtt)->output_buffer[sample]*(*vtt)->res_volume);
851 vtt=render_list.begin();
854 max=(*vtt)->max_value;
858 for (sample=0; sample<samples_in_mix_buffer; sample++)
860 temp=(*vtt)->output_buffer[sample];
861 mix_buffer[sample]=temp*(*vtt)->res_volume;
863 if (temp>max) max=temp;
864 else if (temp<min) min=temp;
867 mm_max.s[1]=mm_max.s[0]=max;
868 mm_min.s[1]=mm_min.s[0]=min;
870 movq_m2r(mm_max, mm1);
871 movq_m2r(mm_min, mm2);
872 movq_m2r((*vtt)->mm_res_volume, mm0);
874 for(mix=(mmx_t *)mix_buffer, vtt_buffer=(mmx_t*)(*vtt)->output_buffer; mix < (mmx_t*) mix_buffer_end; mix++, vtt_buffer++)
876 movq_m2r(*vtt_buffer, mm3);
885 movq_r2m(mm1, mm_max);
886 movq_r2m(mm2, mm_min);
890 if (mm_max.s[0]>mm_max.s[1]) max=mm_max.s[0]; else max=mm_max.s[1];
891 if (mm_min.s[0]<mm_min.s[0]) min=mm_min.s[0]; else min=mm_min.s[1];
895 if (min>max) (*vtt)->max_value=min; else (*vtt)->max_value=max;
898 for (sample=0; sample<samples_in_mix_buffer; sample++)
900 mix_buffer[sample]=(*vtt)->output_buffer[sample]*(*vtt)->res_volume;
903 if (master_triggered)
905 pthread_mutex_unlock(&render_lock);
906 // pthread_mutex_lock(&main_lock);
907 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
909 if ((*vtt)->is_sync_client)
911 if ((*vtt)->sync_countdown)
913 (*vtt)->sync_countdown--;
917 (*vtt)->sync_countdown=(*vtt)->sync_cycles;
922 // pthread_mutex_unlock(&main_lock);
923 pthread_mutex_lock(&render_lock);
925 vtt=render_list.begin();
926 for (vtt++; vtt!=render_list.end(); vtt++)
930 max=(*vtt)->max_value;
934 for (sample=0; sample<samples_in_mix_buffer; sample++)
936 temp=(*vtt)->output_buffer[sample];
937 mix_buffer[sample]+=temp*(*vtt)->res_volume;
939 if (temp>max) max=temp;
940 else if (temp<min) min=temp;
943 mm_max.s[1]=mm_max.s[0]=max;
944 mm_min.s[1]=mm_min.s[0]=min;
946 movq_m2r(mm_max, mm1);
947 movq_m2r(mm_min, mm2);
948 movq_m2r((*vtt)->mm_res_volume, mm0);
950 for(mix=(mmx_t *)mix_buffer, vtt_buffer=(mmx_t*)(*vtt)->output_buffer; mix < (mmx_t*) mix_buffer_end; mix++, vtt_buffer++)
952 movq_m2r(*vtt_buffer, mm3);
963 movq_r2m(mm1, mm_max);
964 movq_r2m(mm2, mm_min);
968 if (mm_max.s[0]>mm_max.s[1]) max=mm_max.s[0]; else max=mm_max.s[1];
969 if (mm_min.s[0]<mm_min.s[0]) min=mm_min.s[0]; else min=mm_min.s[1];
973 if (min>max) (*vtt)->max_value=min; else (*vtt)->max_value=max;
975 for (sample=0; sample<samples_in_mix_buffer; sample++)
977 mix_buffer[sample]+=(*vtt)->output_buffer[sample]*(*vtt)->res_volume;
987 for (sample=0; sample<samples_in_mix_buffer; sample++)
989 temp=mix_buffer[sample];
990 mix_out_buffer[sample]=(int16_t) temp;
992 if (temp>max) max=temp;
993 else if (temp<min) min=temp;
996 mm_max.s[1]=mm_max.s[0]=max;
997 mm_min.s[1]=mm_min.s[0]=min;
999 movq_m2r(mm_max, mm1);
1000 movq_m2r(mm_min, mm2);
1002 for(mix_int=(int32_t*) mix_out_buffer, mix=(mmx_t *)mix_buffer; mix < (mmx_t*) mix_buffer_end; mix++, mix_int++)
1004 movq_m2r(*mix, mm3);
1006 pfmax_r2r(mm3, mm1);
1007 pfmin_r2r(mm3, mm2);
1009 pf2id_r2r(mm3, mm4);
1011 packssdw_r2r(mm4, mm0);
1013 movq_r2m(mm0, mm_max);
1018 movq_r2m(mm1, mm_max);
1019 movq_r2m(mm2, mm_min);
1023 if (mm_max.s[0]>mm_max.s[1]) max=mm_max.s[0]; else max=mm_max.s[1];
1024 if (mm_min.s[0]<mm_min.s[0]) min=mm_min.s[0]; else min=mm_min.s[1];
1026 /* for (sample=0, mix_int=(int32_t*) mix_buffer; sample<samples_in_mix_buffer; sample++, mix_int++)
1028 mix_out_buffer[sample]=(int16_t) *mix_int;
1033 if (min>max) mix_max=min; else mix_max=max;
1035 for (sample=0; sample<samples_in_mix_buffer; sample++)
1037 mix_out_buffer[sample]=(int16_t)mix_buffer[sample];
1044 vtt=render_list.begin();
1045 while (vtt!=render_list.end())
1050 if ((*vtt)->want_stop) (*vtt)->stop_nolock();
1053 pthread_mutex_unlock(&render_lock);
1055 return(mix_out_buffer);
1058 void vtt_class :: forward_all_turntables()
1060 list <vtt_class *> :: iterator vtt, next;
1062 if (render_list.size()>0)
1064 vtt=render_list.begin();
1065 (*vtt)->forward_turntable();
1067 if (master_triggered)
1069 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1071 if ((*vtt)->is_sync_client)
1073 if ((*vtt)->sync_countdown)
1075 (*vtt)->sync_countdown--;
1079 (*vtt)->sync_countdown=(*vtt)->sync_cycles;
1086 vtt=render_list.begin();
1087 for (vtt++; vtt!=render_list.end(); vtt++)
1089 (*vtt)->forward_turntable();
1094 vtt=render_list.begin();
1095 while (vtt!=render_list.end())
1100 if ((*vtt)->want_stop) (*vtt)->stop_nolock();
1106 int vtt_class :: trigger()
1108 list <vtt_fx *> :: iterator effect;
1110 if (!buffer) return (1);
1112 if (!is_playing) pthread_mutex_lock(&render_lock);
1114 if (res_pitch>=0) pos_f=0;
1118 speed_real=res_pitch;
1119 speed_target=res_pitch;
1124 /* activating plugins */
1125 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
1127 (*effect)->activate();
1138 master_triggered_at=0;
1147 render_list.push_front(this);
1151 render_list.push_back(this);
1153 pthread_mutex_unlock(&render_lock);
1158 int vtt_class :: stop_nolock()
1160 list <vtt_fx *> :: iterator effect;
1164 pthread_mutex_unlock(&render_lock);
1167 render_list.remove(this);
1178 /* deactivating plugins */
1179 for (effect=fx_list.begin(); effect != fx_list.end(); effect++)
1181 (*effect)->deactivate();
1187 int vtt_class :: stop()
1191 pthread_mutex_lock(&render_lock);
1195 pthread_mutex_unlock(&render_lock);
1200 void vtt_class :: set_sync_master(int master)
1204 if (sync_master) sync_master->set_sync_master(0);
1210 if (sync_master==this) sync_master=0;
1212 gui_clear_master_button(this);
1216 void vtt_class :: set_sync_client(int slave, int cycles)
1218 is_sync_client=slave;
1220 // sync_countdown=cycles;
1224 void vtt_class :: set_sync_client_ug(int slave, int cycles)
1226 set_sync_client(slave, cycles);
1229 void vtt_class :: set_master_volume(f_prec new_volume)
1231 list <vtt_class *> :: iterator vtt;
1233 master_volume=new_volume;
1234 globals.volume=new_volume;
1236 if (main_list.size()>0)
1238 // res_master_volume=master_volume/((f_prec) main_list.size());
1239 vol_channel_adjust=sqrt((f_prec) main_list.size());
1240 res_master_volume=master_volume/vol_channel_adjust;
1244 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1246 (*vtt)->recalc_volume();
1250 void vtt_class :: set_master_pitch(f_prec new_pitch)
1252 list <vtt_class *> :: iterator vtt;
1254 globals.pitch=new_pitch;
1255 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1257 (*vtt)->recalc_pitch();
1261 void vtt_class :: enable_saturate (int newstate)
1263 do_saturate=newstate;
1266 void vtt_class :: focus_no(int no)
1268 list <vtt_class *> :: iterator vtt;
1271 for (i=0, vtt=main_list.begin(); vtt!=main_list.end(); vtt++, i++)
1280 void vtt_class :: focus_next()
1282 list <vtt_class *> :: iterator vtt;
1286 if (main_list.size())
1288 focused_vtt=(*main_list.begin());
1293 for (vtt=main_list.begin(); vtt!=main_list.end() ; vtt++)
1295 if ((*vtt)==focused_vtt)
1298 if (vtt==main_list.end())
1300 focused_vtt=(*main_list.begin());
1311 focused_vtt=(*main_list.begin());
1314 void vtt_class :: set_scratch(int newstate)
1318 sp_spin.receive_input_value(0);
1320 sense_cycles=globals.sense_cycles;
1324 sp_spin.receive_input_value(1);
1331 void vtt_class :: handle_input(int control, f_prec value)
1337 case CONTROL_SCRATCH:
1338 if (do_scratch) sp_speed.receive_input_value(value*globals.mouse_speed);
1339 sense_cycles=globals.sense_cycles;
1342 case CONTROL_VOLUME:
1343 temp=rel_volume+MAGIC*value*globals.mouse_speed;
1344 if (temp>2.0) temp=2.0;
1345 else if (temp<0) temp=0;
1346 sp_volume.receive_input_value(temp);
1349 case CONTROL_CUTOFF:
1350 temp=lp_freq+MAGIC*value*globals.mouse_speed;
1351 if (temp>0.99) temp=0.99;
1352 else if (temp<0) temp=0;
1353 sp_lp_freq.receive_input_value(temp);
1356 case CONTROL_FEEDBACK:
1357 temp=ec_feedback+MAGIC*value*globals.mouse_speed;
1358 if (temp>1.0) temp=1.0;
1359 else if (temp<0) temp=0;
1360 sp_ec_feedback.receive_input_value(temp);
1365 void vtt_class :: unfocus()
1370 extern void vg_display_ycontrol(vtt_class *vtt);
1371 extern void vg_display_xcontrol(vtt_class *vtt);
1373 void vtt_class :: set_x_input_parameter(tX_seqpar *sp)
1376 vg_display_xcontrol(this);
1379 void vtt_class :: set_y_input_parameter(tX_seqpar *sp)
1382 vg_display_ycontrol(this);
1385 void vtt_class :: xy_input(f_prec x_value, f_prec y_value)
1387 if (x_par) x_par->handle_mouse_input(x_value*globals.mouse_speed);
1388 if (y_par) y_par->handle_mouse_input(y_value*globals.mouse_speed);
1390 /* handle_input(x_control, x_value);
1391 handle_input(y_control, y_value);*/
1395 #define store(data); if (fwrite((void *) &data, sizeof(data), 1, output)!=1) res+=1;
1397 int vtt_class :: save(FILE * output)
1399 list <vtt_fx *> :: iterator effect;
1408 store(is_sync_master);
1409 store(is_sync_client);
1428 pid=sp_speed.get_persistence_id();
1430 pid=sp_volume.get_persistence_id();
1432 pid=sp_pitch.get_persistence_id();
1434 pid=sp_trigger.get_persistence_id();
1436 pid=sp_loop.get_persistence_id();
1438 pid=sp_sync_client.get_persistence_id();
1440 pid=sp_sync_cycles.get_persistence_id();
1442 pid=sp_lp_enable.get_persistence_id();
1444 pid=sp_lp_gain.get_persistence_id();
1446 pid=sp_lp_reso.get_persistence_id();
1448 pid=sp_lp_freq.get_persistence_id();
1450 pid=sp_ec_enable.get_persistence_id();
1452 pid=sp_ec_length.get_persistence_id();
1454 pid=sp_ec_feedback.get_persistence_id();
1456 pid=sp_mute.get_persistence_id();
1458 pid=sp_spin.get_persistence_id();
1461 counter=fx_list.size();
1464 for (effect=fx_list.begin(); effect!=fx_list.end(); effect++)
1466 (*effect)->save(output);
1473 pid=x_par->get_persistence_id();
1486 pid=y_par->get_persistence_id();
1495 hidden=gui.main_panel->is_hidden();
1498 hidden=gui.trigger_panel->is_hidden();
1501 hidden=gui.lp_panel->is_hidden();
1504 hidden=gui.ec_panel->is_hidden();
1510 #define atload(data); if (fread((void *) &data, sizeof(data), 1, input)!=1) res+=1;
1512 int vtt_class :: load_10(FILE * input)
1518 atload(is_sync_master);
1519 atload(is_sync_client);
1520 atload(sync_cycles);
1526 atload(autotrigger);
1537 lp_setup(lp_gain, lp_reso, lp_freq);
1541 ec_set_length(ec_length);
1542 atload(ec_feedback);
1543 ec_set_feedback(ec_feedback);
1549 int vtt_class :: load_11(FILE * input)
1557 atload(is_sync_master);
1558 atload(is_sync_client);
1559 atload(sync_cycles);
1565 atload(autotrigger);
1576 lp_setup(lp_gain, lp_reso, lp_freq);
1580 ec_set_length(ec_length);
1581 atload(ec_feedback);
1582 ec_set_feedback(ec_feedback);
1585 sp_speed.set_persistence_id(pid);
1587 sp_volume.set_persistence_id(pid);
1589 sp_pitch.set_persistence_id(pid);
1591 sp_trigger.set_persistence_id(pid);
1593 sp_loop.set_persistence_id(pid);
1595 sp_sync_client.set_persistence_id(pid);
1597 sp_sync_cycles.set_persistence_id(pid);
1599 sp_lp_enable.set_persistence_id(pid);
1601 sp_lp_gain.set_persistence_id(pid);
1603 sp_lp_reso.set_persistence_id(pid);
1605 sp_lp_freq.set_persistence_id(pid);
1607 sp_ec_enable.set_persistence_id(pid);
1609 sp_ec_length.set_persistence_id(pid);
1611 sp_ec_feedback.set_persistence_id(pid);
1613 sp_mute.set_persistence_id(pid);
1615 sp_spin.set_persistence_id(pid);
1618 vg_set_current_page(this, gui_page);
1623 int vtt_class :: load_12(FILE * input)
1631 LADSPA_Plugin *plugin;
1633 vtt_fx_ladspa *ladspa_effect;
1637 this->set_name(buffer);
1639 atload(is_sync_master);
1640 atload(is_sync_client);
1641 atload(sync_cycles);
1647 atload(autotrigger);
1656 lp_setup(lp_gain, lp_reso, lp_freq);
1660 ec_set_length(ec_length);
1661 atload(ec_feedback);
1662 ec_set_feedback(ec_feedback);
1665 sp_speed.set_persistence_id(pid);
1667 sp_volume.set_persistence_id(pid);
1669 sp_pitch.set_persistence_id(pid);
1671 sp_trigger.set_persistence_id(pid);
1673 sp_loop.set_persistence_id(pid);
1675 sp_sync_client.set_persistence_id(pid);
1677 sp_sync_cycles.set_persistence_id(pid);
1679 sp_lp_enable.set_persistence_id(pid);
1681 sp_lp_gain.set_persistence_id(pid);
1683 sp_lp_reso.set_persistence_id(pid);
1685 sp_lp_freq.set_persistence_id(pid);
1687 sp_ec_enable.set_persistence_id(pid);
1689 sp_ec_length.set_persistence_id(pid);
1691 sp_ec_feedback.set_persistence_id(pid);
1693 sp_mute.set_persistence_id(pid);
1695 sp_spin.set_persistence_id(pid);
1699 for (i=0; i<counter; i++)
1704 case TX_FX_BUILTINCUTOFF:
1705 for (t=0; t<fx_list.size(); t++) effect_down(lp_fx);
1708 case TX_FX_BUILTINECHO:
1709 for (t=0; t<fx_list.size(); t++) effect_down(ec_fx);
1714 plugin=LADSPA_Plugin::getPluginByUniqueID(id);
1717 ladspa_effect=add_effect(plugin);
1718 ladspa_effect->load(input);
1722 sprintf(buffer,"Fatal Error: Couldn't find required plugin with ID [%i].", id);
1729 tx_note("Fatal Error loading set: unknown effect type!");
1739 set_x_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
1741 else set_x_input_parameter(NULL);
1748 set_y_input_parameter(tX_seqpar :: get_sp_by_persistence_id(pid));
1750 else set_y_input_parameter(NULL);
1753 gui.main_panel->hide(hidden);
1756 gui.trigger_panel->hide(hidden);
1759 gui.lp_panel->hide(hidden);
1762 gui.ec_panel->hide(hidden);
1767 int vtt_class :: save_all(FILE* output)
1770 list <vtt_class *> :: iterator vtt;
1773 tX_seqpar :: create_persistence_ids();
1776 store(master_volume);
1777 store(globals.pitch);
1778 pid=sp_master_volume.get_persistence_id();
1780 pid=sp_master_pitch.get_persistence_id();
1783 for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++)
1785 res+=(*vtt)->save(output);
1788 sequencer.save(output);
1793 int vtt_class :: load_all_10(FILE* input, char *fname)
1795 int res=0, restmp=0;
1796 list <vtt_class *> :: iterator vtt;
1797 unsigned int i, max, size;
1800 char ftmp[PATH_MAX];
1802 while (main_list.size())
1804 delete((*main_list.begin()));
1808 atload(master_volume);
1809 set_master_volume(master_volume);
1810 globals.volume=master_volume;
1811 atload(globals.pitch);
1812 set_master_pitch(globals.pitch);
1814 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
1815 ld_set_setname(fname);
1817 for (i=0; i<max; i++)
1819 newvtt=new vtt_class(1);
1820 res+=newvtt->load_10(input);
1822 if (strlen(newvtt->filename))
1824 /* ftmp IS NECESSARY !!! */
1825 strcpy(ftmp, newvtt->filename);
1826 ld_set_filename(ftmp);
1828 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
1829 restmp=newvtt->load_file(ftmp);
1832 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
1833 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
1845 int vtt_class :: load_all_11(FILE* input, char *fname)
1847 int res=0, restmp=0;
1848 list <vtt_class *> :: iterator vtt;
1849 unsigned int i, max, size;
1852 char ftmp[PATH_MAX];
1855 while (main_list.size())
1857 delete((*main_list.begin()));
1861 atload(master_volume);
1862 set_master_volume(master_volume);
1863 globals.volume=master_volume;
1864 atload(globals.pitch);
1865 set_master_pitch(globals.pitch);
1867 sp_master_volume.set_persistence_id(pid);
1869 sp_master_pitch.set_persistence_id(pid);
1871 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
1872 ld_set_setname(fname);
1874 for (i=0; i<max; i++)
1876 newvtt=new vtt_class(1);
1877 res+=newvtt->load_11(input);
1879 if (strlen(newvtt->filename))
1881 /* ftmp IS NECESSARY !!! */
1882 strcpy(ftmp, newvtt->filename);
1883 ld_set_filename(ftmp);
1885 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
1886 restmp=newvtt->load_file(ftmp);
1889 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
1890 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
1894 sequencer.load(input);
1902 int vtt_class :: load_all_12(FILE* input, char *fname)
1904 int res=0, restmp=0;
1905 list <vtt_class *> :: iterator vtt;
1906 unsigned int i, max, size;
1909 char ftmp[PATH_MAX];
1912 while (main_list.size())
1914 delete((*main_list.begin()));
1918 atload(master_volume);
1919 set_master_volume(master_volume);
1920 globals.volume=master_volume;
1921 atload(globals.pitch);
1922 set_master_pitch(globals.pitch);
1924 sp_master_volume.set_persistence_id(pid);
1926 sp_master_pitch.set_persistence_id(pid);
1928 ld_create_loaddlg(TX_LOADDLG_MODE_MULTI, max);
1929 ld_set_setname(fname);
1931 for (i=0; i<max; i++)
1933 newvtt=new vtt_class(1);
1934 res+=newvtt->load_12(input);
1936 if (strlen(newvtt->filename))
1938 /* ftmp IS NECESSARY !!! */
1939 strcpy(ftmp, newvtt->filename);
1940 ld_set_filename(ftmp);
1942 //restmp=load_wav(newvtt->filename, &newbuffer, &size);
1943 restmp=newvtt->load_file(ftmp);
1946 gtk_box_pack_start(GTK_BOX(control_parent), newvtt->gui.control_box, TRUE, TRUE, 0);
1947 gtk_box_pack_start(GTK_BOX(audio_parent), newvtt->gui.audio_box, TRUE, TRUE, 0);
1951 sequencer.load(input);
1958 void add_vtt(GtkWidget *ctrl, GtkWidget *audio, char *fn)
1961 hmmpg = new vtt_class(1);
1962 gtk_box_pack_start(GTK_BOX(ctrl), hmmpg->gui.control_box, TRUE, TRUE, 0);
1963 gtk_box_pack_start(GTK_BOX(audio), hmmpg->gui.audio_box, TRUE, TRUE, 0);
1964 if (fn) hmmpg->load_file(fn);
1967 extern void vg_move_fx_panel_up(GtkWidget *wid, vtt_class *vtt);
1968 extern void vg_move_fx_panel_down(GtkWidget *wid, vtt_class *vtt);
1970 //#define debug_fx_stack(); for (i=fx_list.begin(); i != fx_list.end(); i++) puts((*i)->get_info_string());
1971 #define debug_fx_stack();
1973 void vtt_class :: effect_up(vtt_fx *effect)
1975 list <vtt_fx *> :: iterator i;
1976 list <vtt_fx *> :: iterator previous;
1981 if ((*fx_list.begin())==effect) return;
1983 for (previous=i=fx_list.begin(); i != fx_list.end(); i++)
1995 pthread_mutex_lock(&render_lock);
1996 fx_list.remove(effect);
1997 fx_list.insert(previous, effect);
1998 pthread_mutex_unlock(&render_lock);
2000 vg_move_fx_panel_up(effect->get_panel_widget(), this);
2006 void vtt_class :: effect_down(vtt_fx *effect)
2008 list <vtt_fx *> :: iterator i;
2013 for (i=fx_list.begin(); i != fx_list.end(); i++)
2022 if ((ok) && (i!=fx_list.end()))
2025 if (i==fx_list.end()) return;
2028 pthread_mutex_lock(&render_lock);
2029 fx_list.remove(effect);
2031 fx_list.insert(i, effect);
2032 vg_move_fx_panel_down(effect->get_panel_widget(), this);
2033 pthread_mutex_unlock(&render_lock);
2039 void vtt_class :: effect_remove(vtt_fx_ladspa *effect)
2041 pthread_mutex_lock(&render_lock);
2042 fx_list.remove(effect);
2043 pthread_mutex_unlock(&render_lock);