1#!/bin/sh
2# the next line restarts using wish \
3exec /usr/local/bin/wish8.6 "$0" "$@" > ~/tkeca.log
4
5#    Tkeca is a Tcl/Tk frontend for Kai Vehmanen's Ecasound
6#    Copyright (C) 2002-2009  Luis Pablo Gasparotto
7#
8#    This program is free software; you can redistribute it and/or modify
9#    it under the terms of the GNU General Public License as published by
10#    the Free Software Foundation; either version 2 of the License, or
11#    (at your option) any later version.
12#
13#    This program is distributed in the hope that it will be useful,
14#    but WITHOUT ANY WARRANTY; without even the implied warranty of
15#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16#    GNU General Public License for more details.
17#
18#    You should have received a copy of the GNU General Public License
19#    along with this program; if not, write to the Free Software
20#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21#
22#    To contact me: lpgasparotto@gmail.com
23
24proc colors {} {
25  package require Tk
26  set wcolors .colors
27  catch {destroy $wcolors}
28  toplevel $wcolors
29  wm title $wcolors "Color palette"
30  wm iconname $wcolors "Listbox"
31  #positionWindow $wcolors
32
33## See Code / Dismiss buttons
34  #set btns [addSeeDismiss $wcolors.buttons $wcolors]
35  #pack $btns -side bottom -fill x
36  frame $wcolors.frame -borderwidth 10
37  pack $wcolors.frame -side top -expand yes -fill y
38
39  scrollbar $wcolors.frame.scroll -command "$wcolors.frame.list yview"
40  listbox $wcolors.frame.list -yscroll "$wcolors.frame.scroll set" \
41	-width 20 -height 16 -setgrid 1
42  pack $wcolors.frame.list $wcolors.frame.scroll -side left -fill y -expand 1
43
44  bind $wcolors.frame.list <Double-1> {
45    tk_setPalette [selection get]
46  }
47  $wcolors.frame.list insert 0 gray60 gray70 gray80 gray85 gray90 gray95 \
48    snow1 snow2 snow3 snow4 seashell1 seashell2 \
49    seashell3 seashell4 AntiqueWhite1 AntiqueWhite2 AntiqueWhite3 \
50    AntiqueWhite4 bisque1 bisque2 bisque3 bisque4 PeachPuff1 \
51    PeachPuff2 PeachPuff3 PeachPuff4 NavajoWhite1 NavajoWhite2 \
52    NavajoWhite3 NavajoWhite4 LemonChiffon1 LemonChiffon2 \
53    LemonChiffon3 LemonChiffon4 cornsilk1 cornsilk2 cornsilk3 \
54    cornsilk4 ivory1 ivory2 ivory3 ivory4 honeydew1 honeydew2 \
55    honeydew3 honeydew4 LavenderBlush1 LavenderBlush2 \
56    LavenderBlush3 LavenderBlush4 MistyRose1 MistyRose2 \
57    MistyRose3 MistyRose4 azure1 azure2 azure3 azure4 \
58    SlateBlue1 SlateBlue2 SlateBlue3 SlateBlue4 RoyalBlue1 \
59    RoyalBlue2 RoyalBlue3 RoyalBlue4 blue1 blue2 blue3 blue4 \
60    DodgerBlue1 DodgerBlue2 DodgerBlue3 DodgerBlue4 SteelBlue1 \
61    SteelBlue2 SteelBlue3 SteelBlue4 DeepSkyBlue1 DeepSkyBlue2 \
62    DeepSkyBlue3 DeepSkyBlue4 SkyBlue1 SkyBlue2 SkyBlue3 \
63    SkyBlue4 LightSkyBlue1 LightSkyBlue2 LightSkyBlue3 \
64    LightSkyBlue4 SlateGray1 SlateGray2 SlateGray3 SlateGray4 \
65    LightSteelBlue1 LightSteelBlue2 LightSteelBlue3 \
66    LightSteelBlue4 LightBlue1 LightBlue2 LightBlue3 \
67    LightBlue4 LightCyan1 LightCyan2 LightCyan3 LightCyan4 \
68    PaleTurquoise1 PaleTurquoise2 PaleTurquoise3 PaleTurquoise4 \
69    CadetBlue1 CadetBlue2 CadetBlue3 CadetBlue4 turquoise1 \
70    turquoise2 turquoise3 turquoise4 cyan1 cyan2 cyan3 cyan4 \
71    DarkSlateGray1 DarkSlateGray2 DarkSlateGray3 \
72    DarkSlateGray4 aquamarine1 aquamarine2 aquamarine3 \
73    aquamarine4 DarkSeaGreen1 DarkSeaGreen2 DarkSeaGreen3 \
74    DarkSeaGreen4 SeaGreen1 SeaGreen2 SeaGreen3 SeaGreen4 \
75    PaleGreen1 PaleGreen2 PaleGreen3 PaleGreen4 SpringGreen1 \
76    SpringGreen2 SpringGreen3 SpringGreen4 green1 green2 \
77    green3 green4 chartreuse1 chartreuse2 chartreuse3 \
78    chartreuse4 OliveDrab1 OliveDrab2 OliveDrab3 OliveDrab4 \
79    DarkOliveGreen1 DarkOliveGreen2 DarkOliveGreen3 \
80    DarkOliveGreen4 khaki1 khaki2 khaki3 khaki4 \
81    LightGoldenrod1 LightGoldenrod2 LightGoldenrod3 \
82    LightGoldenrod4 LightYellow1 LightYellow2 LightYellow3 \
83    LightYellow4 yellow1 yellow2 yellow3 yellow4 gold1 gold2 \
84    gold3 gold4 goldenrod1 goldenrod2 goldenrod3 goldenrod4 \
85    DarkGoldenrod1 DarkGoldenrod2 DarkGoldenrod3 DarkGoldenrod4 \
86    RosyBrown1 RosyBrown2 RosyBrown3 RosyBrown4 IndianRed1 \
87    IndianRed2 IndianRed3 IndianRed4 sienna1 sienna2 sienna3 \
88    sienna4 burlywood1 burlywood2 burlywood3 burlywood4 wheat1 \
89    wheat2 wheat3 wheat4 tan1 tan2 tan3 tan4 chocolate1 \
90    chocolate2 chocolate3 chocolate4 firebrick1 firebrick2 \
91    firebrick3 firebrick4 brown1 brown2 brown3 brown4 salmon1 \
92    salmon2 salmon3 salmon4 LightSalmon1 LightSalmon2 \
93    LightSalmon3 LightSalmon4 orange1 orange2 orange3 orange4 \
94    DarkOrange1 DarkOrange2 DarkOrange3 DarkOrange4 coral1 \
95    coral2 coral3 coral4 tomato1 tomato2 tomato3 tomato4 \
96    OrangeRed1 OrangeRed2 OrangeRed3 OrangeRed4 red1 red2 red3 \
97    red4 DeepPink1 DeepPink2 DeepPink3 DeepPink4 HotPink1 \
98    HotPink2 HotPink3 HotPink4 pink1 pink2 pink3 pink4 \
99    LightPink1 LightPink2 LightPink3 LightPink4 PaleVioletRed1 \
100    PaleVioletRed2 PaleVioletRed3 PaleVioletRed4 maroon1 \
101    maroon2 maroon3 maroon4 VioletRed1 VioletRed2 VioletRed3 \
102    VioletRed4 magenta1 magenta2 magenta3 magenta4 orchid1 \
103    orchid2 orchid3 orchid4 plum1 plum2 plum3 plum4 \
104    MediumOrchid1 MediumOrchid2 MediumOrchid3 MediumOrchid4 \
105    DarkOrchid1 DarkOrchid2 DarkOrchid3 DarkOrchid4 purple1 \
106    purple2 purple3 purple4 MediumPurple1 MediumPurple2 \
107    MediumPurple3 MediumPurple4 thistle1 thistle2 thistle3 \
108    thistle4
109  button $wcolors.dismiss -text "Close" -command {
110    destroy .colors
111    return
112  }
113  pack $wcolors.dismiss -expand yes -fill x
114
115}
116
117proc master {} {
118    global mfe bgcolor mt_font
119    if {[winfo exists .master] != 0} {destroy .master}
120#    toplevel .master -bd 6 -bg $bgcolor -height 200 -width 10
121    toplevel .master -bd 6 -height 200 -width 10
122    wm title .master "Master Volume Control"
123#    frame .master.up -bg $bgcolor
124    frame .master.up
125#    label .master.up.title -bg $bgcolor -text "Master Control"
126    label .master.up.title -text "Master Control"
127#    frame .master.med -bg AntiqueWhite
128    frame .master.med
129#    scale .master.med.control  -activebackground red -font $mt_font -resolution 1 -from 200 -to 0 -length 250 -width 10 -orient vertical -showvalue true -variable mfe(master) -command "
130    scale .master.med.control -resolution 1 -from 200 -to 0 -length 250 -width 10 -orient vertical -showvalue true -variable mfe(master) -command "
131	set mfe(controller_number) 0
132	set mfe(param_number) 1
133	change_master_volume_on_the_fly
134	set mfe(master)"
135
136#    frame .master.low -bg $bgcolor
137    frame .master.low
138#    button .master.low.close  -activebackground LightPink -text Close -command {destroy .master}
139    button .master.low.close -text Close -command {destroy .master}
140    pack .master.up.title -side top -fill x -expand yes
141    pack .master.up -side top -fill x -expand yes
142    pack .master.med.control -side top -fill y -expand yes
143    pack .master.med -side top -fill both -expand yes
144    pack .master.low.close -padx 5 -side left -fill x -expand yes
145    pack .master.low -pady 5 -side top -fill x -expand yes
146
147}
148
149proc change_master_volume_on_the_fly {} {
150    global mfe number_of_tracks stop_command playhandle
151    if {$stop_command==0} {
152	for {set n 1} {$n <= $number_of_tracks} {incr n} {
153	    set master_volume [expr $mfe(volume$n)*$mfe(master)/100]
154	    puts $playhandle "c-select $n\ncop-select $mfe(volume_position$n) \ncopp-select $mfe(param_number)\ncopp-set $master_volume"
155	}
156    }
157}
158
159proc metronome {} {
160    global bgcolor bgcolor2 bgcolor3 mfe track_num
161
162    set bgcolor3 AntiqueWhite2
163    set mt_font [font create -family Helvetica -size 9 -weight normal]
164    if {[winfo exists .metronome] != 0} {destroy .metronome}
165    toplevel .metronome  -bd 6
166    frame .metronome.frame1
167    label .metronome.frame1.label1 -text "Beats per minute: "
168    entry .metronome.frame1.beat -bg White -width 3 -textvariable mfe(effect_parameter110)
169    frame .metronome.frame2
170    menubutton .metronome.frame2.dev_text -text "Device" -relief raised -padx 1 -menu .metronome.frame2.dev_text.type
171	menu .metronome.frame2.dev_text.type -tearoff 0
172		.metronome.frame2.dev_text.type add radiobutton -label Default -variable mfe(device0) -value "Default"
173	        .metronome.frame2.dev_text.type add radiobutton -label alsa,hw:0 -variable mfe(device0) -value "alsa,hw:0"
174		.metronome.frame2.dev_text.type add radiobutton -label alsa,hw:1 -variable mfe(device0) -value "alsa,hw:1"
175		.metronome.frame2.dev_text.type add radiobutton -label alsa,hw:2 -variable mfe(device0) -value "alsa,hw:2"
176		.metronome.frame2.dev_text.type add radiobutton -label alsa,hw:3 -variable mfe(device0) -value "alsa,hw:3"
177		.metronome.frame2.dev_text.type add radiobutton -label alsaplugin,0 -variable mfe(device0) -value "alsaplugin,0"
178		.metronome.frame2.dev_text.type add radiobutton -label alsaplugin,1 -variable mfe(device0) -value "alsaplugin,1"
179		.metronome.frame2.dev_text.type add radiobutton -label alsaplugin,2 -variable mfe(device0) -value "alsaplugin,2"
180		.metronome.frame2.dev_text.type add radiobutton -label alsaplugin,3 -variable mfe(device0) -value "alsaplugin,3"
181		.metronome.frame2.dev_text.type add radiobutton -label jack,system -variable mfe(device0) -value "jack,system"
182		.metronome.frame2.dev_text.type add radiobutton -label /dev/dsp -variable mfe(device0) -value "/dev/dsp"
183		.metronome.frame2.dev_text.type add radiobutton -label /dev/dsp1 -variable mfe(device0) -value "/dev/dsp1"
184		.metronome.frame2.dev_text.type add radiobutton -label /dev/dsp2 -variable mfe(device0) -value "/dev/dsp2"
185		.metronome.frame2.dev_text.type add radiobutton -label /dev/dsp3 -variable mfe(device0) -value "/dev/dsp3"
186	entry .metronome.frame2.dev_entry -bg White -width 16 -textvariable mfe(device0)
187    checkbutton .metronome.enable -width 18 -text "Enable metronome" -variable mfe(track_status0) -onvalue "Play" -offvalue "Mute" -padx 0 -command "
188	    set track_num 0
189	    mute_unmute"
190
191    button .metronome.button -text Ok -command {destroy .metronome}
192
193	grid .metronome.frame1.label1 .metronome.frame1.beat
194	pack .metronome.frame1 -fill both -expand yes -padx 2 -pady 2
195	grid .metronome.frame2.dev_text .metronome.frame2.dev_entry
196	pack .metronome.frame2 -fill both -expand yes -padx 2 -pady 2
197	pack .metronome.enable -fill x -padx 2
198        pack .metronome.button -side bottom -anchor s -fill x
199}
200
201proc latency_comp {} {
202    global sp_minutes sp_seconds sp_minutes_loc sp_seconds_loc locate_name bgcolor bgcolor2 bgcolor3 mfe time_format
203    if {[winfo exists .latency] != 0} {destroy .latency}
204    toplevel .latency  -bd 6
205    wm title .latency "Latency Compensation"
206    frame .latency.frame
207    label .latency.frame.label -text "Latency Compensation (ms): "
208    entry .latency.frame.input -bg White -width 4 -textvariable mfe(latency)
209#    frame .latency.frame2 -bg $bgcolor
210#    button .latency.frame2.button  -activebackground LightPink -text Ok -command {destroy .latency}
211    button .latency.button -text Ok -command {destroy .latency}
212    grid .latency.frame.label .latency.frame.input -sticky ewns
213#    grid .latency.frame2.button -sticky ewns
214    pack .latency.frame -fill both -expand yes -padx 2 -pady 2
215#    pack .latency.frame2 -fill both -expand yes
216    pack .latency.button -fill both -expand yes -padx 2 -pady 2
217}
218
219proc locate {} {
220    global sp_minutes sp_seconds sp_minutes_loc sp_seconds_loc locate_name bgcolor bgcolor2 bgcolor3 mfe time_format
221    if {[winfo exists .locate] != 0} {destroy .locate}
222    toplevel .locate  -bd 6
223    wm title .locate "Locates"
224    frame .locate.locate
225    set loc_number 1
226    if {$time_format=="Minutes"} {
227	for {set loc_number 1} {$loc_number <= 16} {incr loc_number} {
228	    	entry .locate.locate.minutes$loc_number -bg White -justify right -width 3 -textvariable sp_minutes_loc($loc_number)
229		label .locate.locate.position$loc_number -text :
230		entry .locate.locate.seconds$loc_number -bg White -justify right -width 5 -textvariable sp_seconds_loc($loc_number)
231		button .locate.locate.button$loc_number -text $loc_number -command "
232		set locate_name $loc_number
233		move_to_locate"
234	}
235	grid .locate.locate.minutes1 .locate.locate.position1 .locate.locate.seconds1 .locate.locate.button1 -sticky ewns -padx 3
236	grid .locate.locate.minutes2 .locate.locate.position2 .locate.locate.seconds2 .locate.locate.button2 -sticky ewns -padx 3
237	grid .locate.locate.minutes3 .locate.locate.position3 .locate.locate.seconds3 .locate.locate.button3 -sticky ewns -padx 3
238	grid .locate.locate.minutes4 .locate.locate.position4 .locate.locate.seconds4 .locate.locate.button4 -sticky ewns -padx 3
239
240	grid .locate.locate.minutes5 .locate.locate.position5 .locate.locate.seconds5 .locate.locate.button5 -sticky ewns -padx 3
241	grid .locate.locate.minutes6 .locate.locate.position6 .locate.locate.seconds6 .locate.locate.button6 -sticky ewns -padx 3
242	grid .locate.locate.minutes7 .locate.locate.position7 .locate.locate.seconds7 .locate.locate.button7 -sticky ewns -padx 3
243	grid .locate.locate.minutes8 .locate.locate.position8 .locate.locate.seconds8 .locate.locate.button8 -sticky ewns -padx 3
244
245	grid .locate.locate.minutes9 .locate.locate.position9 .locate.locate.seconds9 .locate.locate.button9 -sticky ewns -padx 3
246	grid .locate.locate.minutes10 .locate.locate.position10 .locate.locate.seconds10 .locate.locate.button10 -sticky ewns -padx 3
247	grid .locate.locate.minutes11 .locate.locate.position11 .locate.locate.seconds11 .locate.locate.button11 -sticky ewns -padx 3
248	grid .locate.locate.minutes12 .locate.locate.position12 .locate.locate.seconds12 .locate.locate.button12 -sticky ewns -padx 3
249
250	grid .locate.locate.minutes13 .locate.locate.position13 .locate.locate.seconds13 .locate.locate.button13 -sticky ewns -padx 3
251	grid .locate.locate.minutes14 .locate.locate.position14 .locate.locate.seconds14 .locate.locate.button14 -sticky ewns -padx 3
252	grid .locate.locate.minutes15 .locate.locate.position15 .locate.locate.seconds15 .locate.locate.button15 -sticky ewns -padx 3
253	grid .locate.locate.minutes16 .locate.locate.position16 .locate.locate.seconds16 .locate.locate.button16 -sticky ewns -padx 3
254
255	frame .locate.punch
256	label .locate.punch.in_text -text "Punch-in:"
257	entry .locate.punch.in_minutes -bg White -justify right -width 2 -textvariable mfe(punch_in_minutes)
258	label .locate.punch.in_sep -text :
259	entry .locate.punch.in_seconds -bg White -justify right -width 5 -textvariable mfe(punch_in_seconds)
260
261	label .locate.punch.out_text -text "Punch-Out:"
262	entry .locate.punch.out_minutes -bg White -justify right -width 2 -textvariable mfe(punch_out_minutes)
263	label .locate.punch.out_sep -text :
264	entry .locate.punch.out_seconds -bg White -justify right -width 5 -textvariable mfe(punch_out_seconds)
265
266	pack .locate.locate -fill both -expand yes
267	grid .locate.punch.in_text .locate.punch.in_minutes .locate.punch.in_sep .locate.punch.in_seconds
268	grid .locate.punch.out_text .locate.punch.out_minutes .locate.punch.out_sep .locate.punch.out_seconds
269	pack .locate.punch -fill both -expand yes
270
271    } else {
272	for {set loc_number 1} {$loc_number <= 16} {incr loc_number} {
273	    entry .locate.locate.seconds$loc_number -bg White -justify right -width 7 -textvariable sp_seconds_loc($loc_number)
274	    button .locate.locate.button$loc_number -width 7 -text $loc_number -command "
275	    set locate_name $loc_number
276	    move_to_locate"
277	}
278
279	frame .locate.punch
280	label .locate.punch.in_text -text "Punch-in:"
281	entry .locate.punch.in_seconds -bg White -justify right -width 7 -textvariable mfe(punch_in_seconds)
282
283	label .locate.punch.out_text -text "Punch-Out:"
284	entry .locate.punch.out_seconds -bg White -justify right -width 7 -textvariable mfe(punch_out_seconds)
285
286	grid .locate.locate.seconds1 .locate.locate.button1 -sticky ewns -padx 3
287	grid .locate.locate.seconds2 .locate.locate.button2 -sticky ewns -padx 3
288	grid .locate.locate.seconds3 .locate.locate.button3 -sticky ewns -padx 3
289	grid .locate.locate.seconds4 .locate.locate.button4 -sticky ewns -padx 3
290
291	grid .locate.locate.seconds5 .locate.locate.button5 -sticky ewns -padx 3
292	grid .locate.locate.seconds6 .locate.locate.button6 -sticky ewns -padx 3
293	grid .locate.locate.seconds7 .locate.locate.button7 -sticky ewns -padx 3
294	grid .locate.locate.seconds8 .locate.locate.button8 -sticky ewns -padx 3
295
296	grid .locate.locate.seconds9 .locate.locate.button9 -sticky ewns -padx 3
297	grid .locate.locate.seconds10 .locate.locate.button10 -sticky ewns -padx 3
298	grid .locate.locate.seconds11 .locate.locate.button11 -sticky ewns -padx 3
299	grid .locate.locate.seconds12 .locate.locate.button12 -sticky ewns -padx 3
300
301	grid .locate.locate.seconds13 .locate.locate.button13 -sticky ewns -padx 3
302	grid .locate.locate.seconds14 .locate.locate.button14 -sticky ewns -padx 3
303	grid .locate.locate.seconds15 .locate.locate.button15 -sticky ewns -padx 3
304	grid .locate.locate.seconds16 .locate.locate.button16 -sticky ewns -padx 3
305
306	pack .locate.locate -fill both -expand yes
307	grid .locate.punch.in_text .locate.punch.in_seconds
308	grid .locate.punch.out_text .locate.punch.out_seconds
309	pack .locate.punch -fill both -expand yes
310    }
311}
312
313proc ladspa {} {
314
315global eca_effects effect_param effect_param_name effect_param_to effect_param_from effect_param_resolution effect_param_value effect_index effect_name effect_copy effect_maker ladspa_path env
316
317set env(LADSPA_PATH) $ladspa_path
318.mfe.up1.button configure -state disabled
319.mfe.up2.options configure -state disabled
320.mfe.up2.colors configure -state disabled
321.mfe.up2.time_format configure -state disabled
322.mfe.up2.metronome configure -state disabled
323.mfe.up2.addtrack configure -state disabled
324.mfe.up2.del_all_tracks configure -state disabled
325.mfe.up2.quit configure -state disabled
326.mfe.up2.about configure -state disabled
327.mfe.low.multich2 configure -state disabled
328.mfe.low.latcomp configure -state disabled
329.mfe.low.loc configure -state disabled
330.mfe.low.master configure -state disabled
331.mfe.low.play configure -state disabled
332.mfe.low.rew_to_begin configure -state disabled
333.mfe.low.rew_5 configure -state disabled
334.mfe.low.forw_5 configure -state disabled
335
336ladspa_loading_window
337
338set cmd "exec listplugins"
339catch {eval $cmd} exec_out1
340
341if {[string match *egmentation* $exec_out1] == 1} {
342return}
343
344set exec_out2 [split $exec_out1 \n]
345set file_number 0
346set parameters 0
347
348for {set n 0} {$n <= [llength $exec_out2]} {incr n} {
349    set current_line [lindex $exec_out2 $n]
350    if {[string match *.so* $current_line] == 1} {
351	regsub : $current_line {} current_line
352	set files($file_number) $current_line
353	incr file_number
354
355    }
356}
357
358set exec_out2 " "
359
360for {set n 0} {$n < $file_number} {incr n} {
361
362    set cmd "exec analyseplugin $files($n)"
363    catch {eval $cmd} exec_out1
364    set exec_out2 "$exec_out2$exec_out1"
365#    puts "$exec_out2"
366
367}
368
369set exec_out3 [split $exec_out2 \n]
370set index [expr $eca_effects+1]
371
372for {set n 0} {$n <= [llength $exec_out3]} {incr n} {
373    set srate 0
374    set current_line [lindex $exec_out3 $n]
375    if {[string match {Plugin Label:*} $current_line] == 1} {
376	set parameters 0
377	regsub {Plugin Label: "} $current_line {} plugin_label
378	regsub {"} $plugin_label {} plugin_label
379	set effect_param(ladspa_$plugin_label) 0
380	set effect_index($index) "ladspa_$plugin_label"
381	incr index
382	set past_line [lindex $exec_out3 [expr $n-1]]
383	regsub {Plugin Name: "} $past_line {} plugin_name
384	regsub {"} $plugin_name {} effect_name(ladspa_$plugin_label)
385 	set n [expr $n+2]
386	set current_line [lindex $exec_out3 $n]
387	regsub {Maker: "} $current_line {} plugin_maker
388	regsub {"} $plugin_maker {}  effect_maker(ladspa_$plugin_label)
389	incr n
390	set current_line [lindex $exec_out3 $n]
391	regsub {Copyright: "} $current_line {} plugin_copy
392	regsub {"} $plugin_copy {}  effect_copy(ladspa_$plugin_label)
393	set n [expr $n+6]
394	set current_line [lindex $exec_out3 $n]
395    }
396
397    if {[string match {Ports:*} $current_line] == 1 || $parameters == 1} {
398	set parameters 1
399	if {[string match {*control,*} $current_line] == 1 } {
400	    if {[string match *ERROR:* $current_line ] == 1 || [string match *toggled* $current_line ] == 1} {
401		incr effect_param(ladspa_$plugin_label)
402		set effect_param_to(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 1
403		set effect_param_from(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 0
404		set effect_param_resolution(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 1
405		set effect_param_value(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 0
406	    }
407	    if {[string match *srate* $current_line] == 1 } {
408		regsub -all {\*srate} $current_line {} current_line
409		set srate 1
410	    }
411	    if {[regexp -all {([-+.0-9]+)( to)} $current_line param_from] == 1} {
412	    	incr effect_param(ladspa_$plugin_label)
413		regsub -all { to} $param_from {} effect_param_from(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))
414		set effect_param_value(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) $effect_param_from(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))
415	    }
416	    if {[regexp -all {(\")([(= ),&+-?/%A-Za-z0-9]+)(\")} $current_line param_name] == 1} {
417		regsub -all {\"} $param_name {} effect_param_name(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))
418	    }
419
420	    if {[regexp -all {(to )([-+.0-9]+)} $current_line param_to] == 1} {
421		regsub -all {to } $param_to {} effect_param_to(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))
422		if {[string match {*integer*} $current_line]} {set effect_param_resolution(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 1} else {
423		    set effect_param_resolution(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 0
424	    }
425	    if {[string match {*logarithmic*} $current_line] == 1} {
426		    set effect_param_resolution(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 100
427	    }
428	    if {[string match *...* $effect_param_to(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))] == 1} {
429		    set effect_param_to(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 10000
430		    set effect_param_resolution(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 100
431	    }
432	    if {[string match *...* $effect_param_from(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))] == 1} {
433		    set effect_param_from(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 10000
434		    set effect_param_resolution(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 100
435	    }
436	    if {$srate==1} {
437		set effect_param_to(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) [expr $effect_param_to(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))*44100]
438		set effect_param_from(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) [expr $effect_param_from(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))*44100]
439	    }
440	}
441	}
442    }
443
444}
445ladspa_loading_window
446set eca_effects [expr $index - 1]
447}
448
449proc solo_unsolo {} {
450    global stop_command mfe track_num playhandle solo_tracks number_of_tracks w w2
451    if {$solo_tracks==0} {
452	set solo_tracks 1
453	set mfe(prev_track_status$track_num) $mfe(track_status$track_num)
454	if {$mfe(track_status$track_num)=="Mute"} {
455	    if {$stop_command==0} {
456		puts $playhandle "c-select $track_num\nc-muting"
457	    }
458	}
459	for {set n 1} {$n <= $number_of_tracks} {incr n} {
460	    puts "4.4.2 $w.play$n configure -state disabled"
461	    $w.track$track_num.play configure -state disabled
462    	    if {$n!=$track_num} {
463		set mfe(prev_track_status$n) $mfe(track_status$n)
464		if {$stop_command==0 && $mfe(track_status$n)=="Play"} {
465		    puts $playhandle "c-select $n\nc-muting"
466		}
467		set mfe(track_status$n) "Mute"
468	    } else {
469		set mfe(track_status$n) "Play"
470	    }
471	}
472    } elseif {$solo_tracks==1 && $mfe(track_solo$track_num)=="No Solo"} {
473	set solo_tracks 0
474	for {set n 1} {$n <= $number_of_tracks} {incr n} {
475	    $w.track$track_num.play configure -state normal
476    	    if {$mfe(track_status$n)!=$mfe(prev_track_status$n)} {
477		if {$stop_command==0} {
478		    puts $playhandle "c-select $n\nc-muting"
479		}
480		set mfe(track_status$n) $mfe(prev_track_status$n)
481	    }
482	}
483    } else {
484        if {$mfe(track_solo$track_num)=="Solo"} {
485	    incr solo_tracks
486	    set mfe(track_status$track_num) "Play"
487	} else {
488	    set solo_tracks [expr $solo_tracks-1]
489	    set mfe(track_status$track_num) "Mute"
490	}
491	if {$stop_command==0} {
492	    puts $playhandle "c-select $track_num\nc-muting"
493	}
494    }
495}
496
497proc unsolo_all {} {
498    global stop_command mfe track_num playhandle solo_tracks number_of_tracks w
499    if {$solo_tracks==0} {return}
500    for {set n 1} {$n <= $number_of_tracks} {incr n} {
501	$w.track$n.play configure -state normal
502	if {$mfe(track_solo$n)=="Solo"} {
503	    if {$mfe(prev_track_status$n)=="Mute" && $stop_command==0} {
504		puts $playhandle "c-select $n\nc-muting"
505	    }
506	} else {
507	    if {$mfe(prev_track_status$n)=="Play" && $stop_command==0} {
508		puts $playhandle "c-select $n\nc-muting"
509	    }
510	}
511    	set mfe(track_status$n) $mfe(prev_track_status$n)
512	set mfe(track_solo$n) "No Solo"
513#	$w.play$n configure -state normal
514    }
515    set solo_tracks 0
516}
517
518proc delete_current_track {} {
519    global mfe track_num w
520    unsolo_all
521    set w2 "$w.track$track_num"
522    set mfe(track_status$track_num) "Deleted"
523    destroy $w2.number$track_num
524    destroy $w2.delete$track_num
525    destroy $w2.file$track_num
526    destroy $w2.open$track_num
527    destroy $w2.track_properties$track_num
528    destroy $w2.dev_text$track_num
529    destroy $w2.dev_entry$track_num
530    destroy $w2.chn_text$track_num
531    destroy $w2.chn_entry$track_num
532    destroy $w2.solo$track_num
533    destroy $w2.play$track_num
534    destroy $w2.rec$track_num
535    destroy $w2.effect$track_num
536    destroy $w2.eca_tools$track_num
537    destroy $w2.pan$track_num
538    destroy $w2.slide$track_num
539    destroy $w2
540}
541
542proc add_track {} {
543    global mfe number_of_tracks number_of_files mt_font n eca_effects effect_index effect_name mfe_temp w w2 track_num bgcolor3 mixdown edit_effect prev_loaded_file stop_command solo_tracks
544
545    set bgcolor3 AntiqueWhite2
546    .mfe.up1.save configure -state normal
547    .mfe.up1.saveas configure -state normal
548    .mfe.up2.exportecs configure -state normal
549    .mfe.up2.mixdown configure -state normal
550
551    set number_of_tracks [expr $number_of_tracks-1]
552    unsolo_all
553
554    incr number_of_tracks
555    set n $number_of_tracks
556    if {$mfe(track_status$n)=="Deleted"} {return}
557    set mfe(prev_track_status$n) "Play"
558    set mfe(track_status$n) "Play"
559#    set mfe(track_status$n) "Play"
560#    set mfe(rec_prop_bits$n) "s16_le"
561#    set mfe(rec_prop_channels$n) "1"
562#    set mfe(rec_prop_srate$n) "44100"
563#    set mfe(rec_prop_interl$n) "i"
564#    set mfe(volume$n) 100
565#    set mfe(pan$n) 50
566#    set mfe(device$n) "/dev/dsp"
567#    set mfe(chn$n) "n/a"
568set mfe(volume_position$n) 1
569set mfe(pan_position$n) 2
570set number $n
571set mfe(track_solo$n) "No Solo"
572#    set mfe(track_rec_status$n) "No"
573#    set mfe(track_status$n) "Play"
574
575    	.mfe.tracks.canvas config -scrollregion "0 0 0 [expr $number_of_tracks *30]"
576    	if {$n < 10} {set number "0$n"}
577	set w2 $w
578	set w "$w.track$n"
579	frame $w -width 780 -bd 2 -relief ridge
580	entry $w.number -bg White -width 5 -textvariable mfe(track_name$n)
581	button $w.delete -text "Del" -padx 1 -command "
582	set track_num $n
583	delete_current_track"
584	entry $w.file -bg White -width 12 -textvariable mfe(file$n)
585	button $w.open -font $mt_font -text ... -padx 1 -command "
586	set track_num $n
587	set types {{{Wav files} {*.wav}} {{mp3 files} {*.mp3}} {{raw files} {*.raw}} {{MIDI files} {*.mid}} {{MIDI files} {*.midi}} {{Modules files} {*.mod}} {{efw files} {*.efw}} {{all} {*}}}
588	file_browser"
589	button $w.track_properties -text "P" -relief raised -padx 1 -command "
590	set track_num $n
591	set mixdown 0
592	rec_properties"
593
594	menubutton $w.dev_text -text "D" -relief raised -padx 1 -menu $w.dev_text.type
595	menu $w.dev_text.type -tearoff 0
596		$w.dev_text.type add radiobutton -label Default -variable mfe(device$n) -value "Default"
597		$w.dev_text.type add radiobutton -label alsa,hw:0 -variable mfe(device$n) -value "alsa,hw:0"
598		$w.dev_text.type add radiobutton -label alsa,hw:1 -variable mfe(device$n) -value "alsa,hw:1"
599		$w.dev_text.type add radiobutton -label alsa,hw:2 -variable mfe(device$n) -value "alsa,hw:2"
600		$w.dev_text.type add radiobutton -label alsa,hw:3 -variable mfe(device$n) -value "alsa,hw:3"
601		$w.dev_text.type add radiobutton -label alsaplugin,0 -variable mfe(device$n) -value "alsaplugin,0"
602		$w.dev_text.type add radiobutton -label alsaplugin,1 -variable mfe(device$n) -value "alsaplugin,1"
603		$w.dev_text.type add radiobutton -label alsaplugin,2 -variable mfe(device$n) -value "alsaplugin,2"
604		$w.dev_text.type add radiobutton -label alsaplugin,3 -variable mfe(device$n) -value "alsaplugin,3"
605		$w.dev_text.type add radiobutton -label jack,system -variable mfe(device$n) -value "jack,system"
606		$w.dev_text.type add radiobutton -label /dev/dsp -variable mfe(device$n) -value "/dev/dsp"
607		$w.dev_text.type add radiobutton -label /dev/dsp1 -variable mfe(device$n) -value "/dev/dsp1"
608		$w.dev_text.type add radiobutton -label /dev/dsp2 -variable mfe(device$n) -value "/dev/dsp2"
609		$w.dev_text.type add radiobutton -label /dev/dsp3 -variable mfe(device$n) -value "/dev/dsp3"
610
611	entry $w.dev_entry -width 8 -bg White -textvariable mfe(device$n)
612
613	menubutton $w.chn_text -text "Ch" -relief raised -padx 1 -menu $w.chn_text.type
614	menu $w.chn_text.type -tearoff 0
615		$w.chn_text.type add radiobutton -label n/a -variable mfe(chn$n) -value "n/a"
616		$w.chn_text.type add radiobutton -label 1 -variable mfe(chn$n) -value "1"
617		$w.chn_text.type add radiobutton -label 2 -variable mfe(chn$n) -value "2"
618		$w.chn_text.type add radiobutton -label 3 -variable mfe(chn$n) -value "3"
619		$w.chn_text.type add radiobutton -label 4 -variable mfe(chn$n) -value "4"
620		$w.chn_text.type add radiobutton -label 5 -variable mfe(chn$n) -value "5"
621		$w.chn_text.type add radiobutton -label 6 -variable mfe(chn$n) -value "6"
622		$w.chn_text.type add radiobutton -label 7 -variable mfe(chn$n) -value "7"
623		$w.chn_text.type add radiobutton -label 8 -variable mfe(chn$n) -value "8"
624		$w.chn_text.type add radiobutton -label 9 -variable mfe(chn$n) -value "9"
625		$w.chn_text.type add radiobutton -label 10 -variable mfe(chn$n) -value "10"
626		$w.chn_text.type add radiobutton -label 11 -variable mfe(chn$n) -value "11"
627		$w.chn_text.type add radiobutton -label 12 -variable mfe(chn$n) -value "12"
628		$w.chn_text.type add radiobutton -label 13 -variable mfe(chn$n) -value "13"
629		$w.chn_text.type add radiobutton -label 14 -variable mfe(chn$n) -value "14"
630		$w.chn_text.type add radiobutton -label 15 -variable mfe(chn$n) -value "15"
631		$w.chn_text.type add radiobutton -label 16 -variable mfe(chn$n) -value "16"
632
633	entry $w.chn_entry -width 3 -bg White -textvariable mfe(chn$n)
634
635	checkbutton $w.solo -width 1 -text "S" -variable mfe(track_solo$n) -onvalue "Solo" -offvalue "No Solo" -padx 0 -command "
636	set track_num $n
637	solo_unsolo"
638	checkbutton $w.play -width 1 -text "M" -variable mfe(track_status$n) -onvalue "Mute" -offvalue "Play" -padx 0 -command "
639	set track_num $n
640	mute_unmute"
641	checkbutton $w.rec -width 1 -text "R" -variable mfe(track_rec_status$n)  -onvalue "Yes" -offvalue "No" -padx 0
642
643	menubutton $w.effect -text "E" -relief raised -padx 1 -menu $w.effect.type
644	menu $w.effect.type -tearoff 0
645
646	for {set en 1} {$en <= 8} {incr en} {
647	    if {$prev_loaded_file == 0} {
648		set mfe(effect$en$n) "None"
649		set mfe_temp(effect$en$n) "None"
650		set mfe(effect_attached$en$n) "Bypassed"
651		set effect_fg "gray40"
652	    } else {
653	    	set mfe_temp(effect$en$n) $mfe(effect$en$n)
654		if {$mfe(effect_attached$en$n)=="Bypassed"} {
655		    set effect_fg "gray40"
656		} else {
657		    set effect_fg "black"
658		}
659	    }
660	    if {$mfe(effect$en$n)=="None"} {
661		set effect_name_current "Effect $en"
662		set effect_fg2 "gray40"
663	    } else {
664		set effect_name_current $effect_name($mfe_temp(effect$en$n))
665		set effect_fg2 "black"
666	    }
667
668	    $w.effect.type add cascade -label $effect_name_current -foreground $effect_fg -menu $w.effect.type.$en
669		    menu $w.effect.type.$en -tearoff 0
670		    $w.effect.type.$en add command -label "Add a New Effect" -command "
671			set effect_num $en
672			set track_num $n
673			set edit_effect 0
674    			effect_list"
675		    $w.effect.type.$en add command -label "Edit Current Effect" -foreground $effect_fg2 -command "
676			set effect_num $en
677			set track_num $n
678			set edit_effect 1
679			effect"
680		    $w.effect.type.$en add command -label "Connect/Bypass" -foreground $effect_fg2 -command "
681		    	set effect_num $en
682			set track_num $n
683			effect_bypass
684		    "
685		    $w.effect.type.$en add command -label "Delete Effect" -foreground $effect_fg2 -state disabled -command "
686			set effect_num $en
687			set track_num $n
688			delete_effect"
689
690#	$w.effect$n.type entryconfigure $en -foreground $effect_fg
691
692	if { $mfe(effect$en$n) != "None"} {
693	      $w.effect.type.$en entryconfigure 1 -foreground black
694	      $w.effect.type.$en entryconfigure 2 -foreground black
695	      $w.effect.type.$en entryconfigure 3 -foreground black -state normal
696	      .mfe.tracks.canvas.f.track$n.effect.type.$en entryconfigure 0 -label $mfe(effect_attached$en$n) -state disabled -foreground gray40
697	    }
698	}
699	set prev_loaded_file 0
700	menubutton $w.eca_tools -text "T" -relief raised -padx 1 -menu $w.eca_tools.type
701	menu $w.eca_tools.type -tearoff 0
702	$w.eca_tools.type add command -label "Normalize" -command "
703	set track_num $n
704	ecanormalize"
705	$w.eca_tools.type add command -label "DC Offset Fix" -command "
706	set track_num $n
707	ecafixdc"
708	$w.eca_tools.type add command -label "Wave Edit" -command "
709	set track_num $n
710	wave_edit"
711	$w.eca_tools.type add command -label "Wave File Delete" -command "
712	set track_num $n
713	wave_file_delete"
714
715	scale $w.pan -resolution 1 -from 0 -to 100 -length 130 -width 2 -orient horizontal -showvalue true -variable mfe(pan$n) -command "
716	set track_num $n
717	set mfe(param_number) 1
718	set mfe(param_value) pan$n
719	change_pan_on_the_fly
720	set mfe(pan$n)"
721	scale $w.slide -resolution 1 -from 0 -to 400 -length 200 -width 2 -orient horizontal -showvalue true -variable mfe(volume$n) -command "
722	set track_num $n
723	set mfe(param_number) 1
724	set mfe(param_value) volume$n
725	change_volume_on_the_fly
726	set mfe(volume$n)"
727
728	pack $w.number -expand 1 -fill both -side left
729	pack $w.delete -fill y -side left
730	pack $w.file -expand 1 -fill both -side left
731	pack $w.open -side left -fill y
732	pack $w.track_properties -fill y -side left
733	pack $w.dev_text -fill y -side left
734	pack $w.dev_entry -fill y -side left
735	pack $w.chn_text -fill y -side left
736	pack $w.chn_entry -fill y -side left
737	pack $w.solo -fill y -side left
738	pack $w.play -fill y -side left
739	pack $w.rec -fill y -side left
740	pack $w.effect -fill y -side left
741	pack $w.eca_tools -fill y -side left
742	pack $w.pan -expand yes -fill both -side left
743	pack $w.slide -expand yes -fill both -side left
744	pack $w -expand yes -fill both -side top
745#	pack $w.button -fill both -expand 1 -side left
746#	pack $w -fill both -expand 1 -side top
747
748	set w $w2
749}
750
751proc effect {} {
752    global w mfe mfe_temp mfe_temp2 effect_num effect_number effect2 edit_effect track_num track effect_name effect_param_name effect_param effect_param_value effect_param_from effect_param_to effect_param_resolution effect_maker effect_copy mt_font logarithmic position stop_command bgcolor play_text fw_text rew_text rewbeg_text
753    if {[winfo exists .effect$effect_num$track_num] != 0} {destroy .effect$effect_num$track_num}
754    set effect_label $mfe_temp(effect$effect_num$track_num)
755    set w2 $w
756    set w "$w.track$track_num"
757    if {$effect_label=="pn:metronome"} {
758	set mfe(track_status$track_num) "Play"
759	set mfe(track_rec_status$track_num) "No"
760	if {$mfe(file$track_num)=="" || $mfe(file$track_num)=="(Wave File)"} {set mfe(file$track_num) "null"}
761    }
762    if { $mfe_temp(effect$effect_num$track_num) == "None"} {
763	set mfe(effect$effect_num$track_num) $mfe_temp(effect$effect_num$track_num)
764	$w.effect.type.$effect_num entryconfigure 1 -foreground gray40
765	$w.effect.type.$effect_num entryconfigure 2 -foreground gray40
766	$w.effect.type.$effect_num entryconfigure 3 -foreground gray40
767	set w $w2
768	return
769    } else {
770	$w.effect.type.$effect_num entryconfigure 1 -foreground black
771	$w.effect.type.$effect_num entryconfigure 2 -foreground black
772	$w.effect.type.$effect_num entryconfigure 3 -foreground black -state normal
773    }
774    set effect_label $mfe_temp(effect$effect_num$track_num)
775    set effect_menu_order [expr $effect_num-1]
776    $w.effect.type entryconfigure $effect_menu_order -menu $w.effect.type.$effect_num -label $effect_name($mfe_temp(effect$effect_num$track_num))
777    set w $w2
778    toplevel .effect$effect_num$track_num
779    wm title .effect$effect_num$track_num "$mfe(track_name$track_num) --- Effect: $effect_name($mfe_temp(effect$effect_num$track_num)) Window"
780    message .effect$effect_num$track_num.out -width 600 -text "Track: $mfe(track_name$track_num) --- Effect:$effect_num ----------------- $effect_name($mfe_temp(effect$effect_num$track_num))"
781    pack .effect$effect_num$track_num.out -expand yes -fill both
782
783    if { $mfe(effect$effect_num$track_num) != $mfe_temp(effect$effect_num$track_num) || $edit_effect==0 } {
784	set mfe(effect$effect_num$track_num) $mfe_temp(effect$effect_num$track_num)
785	for {set n 1} {$n <= $effect_param($effect_label)} {incr n} {
786	    set mfe(effect_parameter$n$effect_num$track_num) $effect_param_value($effect_label$n)
787	    set mfe_temp2(effect_parameter$n$effect_num$track_num) $effect_param_value($effect_label$n)
788	}
789    } else {
790	for {set n 1} {$n <= $effect_param($effect_label)} {incr n} {
791	    set effect_param_value($effect_label$n) $mfe(effect_parameter$n$effect_num$track_num)
792	    set mfe_temp2(effect_parameter$n$effect_num$track_num) $effect_param_value($effect_label$n)
793	}
794    }
795    set mfe(effect_parameters$effect_num$track_num) $effect_param($effect_label)
796    for {set n 1} {$n <= $effect_param($effect_label)} {incr n} {
797	set res [expr ($effect_param_to($effect_label$n)-$effect_param_from($effect_label$n))/100]
798	set res [expr abs($res)]
799	set logarithmic 0
800	if {$effect_param_resolution($effect_label$n) != 0 } {set res $effect_param_resolution($effect_label$n)}
801	if {$effect_param_resolution($effect_label$n) == 100 } {
802	    set res [expr ($effect_param_to($effect_label$n)-$effect_param_from($effect_label$n))/10000]
803	    set res [expr abs($res)]
804	    set logarithmic 1
805	}
806	set position "effect_parameter$n$effect_num$track_num"
807	frame .effect$effect_num$track_num.$n
808	label .effect$effect_num$track_num.$n.param_name$n -width 30 -text "$effect_param_name($effect_label$n): " -justify left
809	entry .effect$effect_num$track_num.$n.param_value$n -width 5 -justify left -relief flat -textvariable mfe($position)
810	pack .effect$effect_num$track_num.$n.param_name$n -side left
811	pack .effect$effect_num$track_num.$n.param_value$n -side left
812
813	scale .effect$effect_num$track_num.$n.param$n -from $effect_param_from($effect_label$n) -to $effect_param_to($effect_label$n) -resolution $res -length 300 -width 3 -orient horizontal -showvalue false -variable mfe_temp2($position) -command "
814	set position effect_parameter$n$effect_num$track_num
815	log
816	set track_num $track_num
817	set effect_number $effect_num
818	# set mfe(controller_number) [expr $effect_num+2]
819	set mfe(param_number) $n
820	set mfe(param_value) $position
821	change_controller_on_the_fly
822	set mfe_temp2($position)"
823	pack .effect$effect_num$track_num.$n.param$n -expand 1 -fill x -side right
824#	grid .effect$effect_num$track_num.$n.param_name$n .effect$effect_num$track_num.$n.param_value$n .effect$effect_num$track_num.$n.param$n -sticky ewns
825	pack .effect$effect_num$track_num.$n -expand 1 -fill x -side top
826    }
827
828    frame .effect$effect_num$track_num.buttons -bd 6
829    button .effect$effect_num$track_num.buttons.close -text Close -command "
830	set effect2 $effect_num
831	set track $track_num
832	close_effect
833    "
834
835    button .effect$effect_num$track_num.buttons.preview -text " Preview " -height 0 -command {
836    if {$stop_command == 1} {
837	set stop_command 0
838	set preview 1
839	set effect2 "$effect_num"
840	set track "$track_num"
841	preview}
842    }
843    button .effect$effect_num$track_num.buttons.full_preview -text " Full Preview " -height 0 -command {
844    if {$stop_command == 1} {
845	set stop_command 0
846	set preview 2
847	set track "$track_num"
848	preview }
849    }
850    button .effect$effect_num$track_num.buttons.stop -text " Stop " -height 0 -command {
851	if {$stop_command == 0} {
852	    set play_text "Play"
853	    stop
854	}
855    }
856
857    button .effect$effect_num$track_num.buttons.info -text "Info " -command {
858    set plugin_info "Plug-in Name: $effect_name($mfe_temp(effect$effect_num$track_num))\nMaker: $effect_maker($mfe_temp(effect$effect_num$track_num))\nCopyright: $effect_copy($mfe_temp(effect$effect_num$track_num))"
859    messages [format $plugin_info]
860    }
861
862    pack .effect$effect_num$track_num.buttons.preview -side left -expand 1 -fill x
863    pack .effect$effect_num$track_num.buttons.full_preview -side left -expand 1 -fill x
864    pack .effect$effect_num$track_num.buttons.stop -side left -expand 1 -fill x
865    pack .effect$effect_num$track_num.buttons.close -side left -expand 1 -fill x
866    pack .effect$effect_num$track_num.buttons.info -side left -expand 1 -fill x
867    pack .effect$effect_num$track_num.buttons -in .effect$effect_num$track_num -side top -expand 1 -fill both
868
869}
870
871proc delete_effect {} {
872
873global mfe mfe_temp track_num effect_num w
874    set mfe(effect$effect_num$track_num) "None"
875    set mfe_temp(effect$effect_num$track_num) "None"
876    set effect_order [expr $effect_num-1]
877    .mfe.tracks.canvas.f.track$track_num.effect.type entryconfigure $effect_order -label "Effect $effect_num" -foreground gray40
878    .mfe.tracks.canvas.f.track$track_num.effect.type.$effect_num entryconfigure 0 -label "Add a New Effect" -state normal -foreground black
879    .mfe.tracks.canvas.f.track$track_num.effect.type.$effect_num entryconfigure 3 -state disabled
880    set mfe(effect_attached$effect_num$track_num) "Connected"
881    if {[winfo exists .effect$effect_num$track_num] != 0} {destroy .effect$effect_num$track_num}
882    effect_bypass
883    #effect
884}
885
886proc effect_bypass {} {
887    global mfe mfe_temp track_num effect_num playhandle stop_command effect_param w
888    if {$mfe(effect$effect_num$track_num)=="None" && $mfe_temp(effect$effect_num$track_num)=="None"} {return}
889    set effect_order_number [expr $effect_num-1]
890    if {$stop_command==1} {
891    effect_bypass2
892    return}
893    if {$mfe(effect_attached$effect_num$track_num)=="Connected"} {
894	set mfe(effect_attached$effect_num$track_num) "Bypassed"
895	$w.track$track_num.effect.type entryconfigure $effect_order_number -foreground gray40
896#	$w.effect$track_num.type.$effect_num entryconfigure 4 -label "Bypassed"
897	puts $playhandle "c-select $track_num\n"
898	puts $playhandle "cop-select $mfe(effect_position$effect_num$track_num)\n"
899	puts $playhandle "cop-remove\n"
900	set mfe(number_of_effects$track_num) [expr $mfe(number_of_effects$track_num)-1]
901	set start [expr $mfe(effect_position$effect_num$track_num)-$mfe(pan_position$track_num)]
902	for {set enb $start} {$enb <= 8} {incr enb} {
903	    set mfe(effect_position$effect_num$track_num) [expr $mfe(effect_position$effect_num$track_num)-1]
904	}
905    } else {
906    	set mfe(effect_attached$effect_num$track_num) "Connected"
907	$w.track$track_num.effect.type entryconfigure $effect_order_number -foreground black
908#	$w.effect$track_num.type.$effect_num entryconfigure 4 -label "Connected"
909	set effect_to_add ""
910	if {[string match ladspa* $mfe(effect$effect_num$track_num)]==1} {
911	    regsub ladspa_ $mfe(effect$effect_num$track_num) {} current_effect
912	    set effect_to_add "-el:$current_effect,"
913	} else {
914	    set effect_to_add "-$mfe(effect$effect_num$track_num):"
915	}
916	for {set par 1} {$par <= $effect_param($mfe(effect$effect_num$track_num))} {incr par} {
917	    if {$par>1} {set effect_to_add "$effect_to_add,"}
918	    set effect_to_add "$effect_to_add$mfe(effect_parameter$par$effect_num$track_num)"
919	}
920	puts $playhandle "c-select $track_num\n"
921	puts $playhandle "cop-add $effect_to_add\n"
922	incr mfe(number_of_effects$track_num)
923	set mfe(effect_position$effect_num$track_num) [expr $mfe(number_of_effects$track_num)+$mfe(pan_position$track_num)]
924    }
925}
926
927proc effect_bypass2 {} {
928    global mfe track_num effect_num stop_command effect_param w
929    set w2 $w
930    set w "$w.track$track_num"
931    set effect_order_number [expr $effect_num-1]
932    if {$mfe(effect_attached$effect_num$track_num)=="Connected"} {
933	set mfe(effect_attached$effect_num$track_num) "Bypassed"
934	$w.effect.type entryconfigure $effect_order_number -foreground gray40
935	$w.effect.type.$effect_num entryconfigure 0 -label "Bypassed" -state disabled
936    } else {
937    	set mfe(effect_attached$effect_num$track_num) "Connected"
938	$w.effect.type.$effect_num entryconfigure 0 -label "Connected" -state disabled
939	$w.effect.type entryconfigure $effect_order_number -foreground black
940    }
941    set w $w2
942}
943
944proc file_browser {} {
945    global mfe n types track_num track_num2 file_num numbre_of_tracks
946    if {$mfe(directory)==""} {set mfe(directory) "."}
947    if {$track_num == 0} {
948	set mfe(openfile0) [tk_getOpenFile -initialdir $mfe(directory) -filetypes $types]
949	open_file
950    } else {
951	set mfe(file$track_num) [tk_getOpenFile -initialdir $mfe(directory) -filetypes $types]
952	if {$mfe(file$track_num) != "" && $mfe(file$track_num) != "(Wave File)"} {
953	    set mfe(track_status$track_num) "Play"
954	}
955    }
956}
957
958proc file_browser2 {} {
959    global mfe n types track_num save_as
960    set save_as 1
961    if {$mfe(directory)==""} {set mfe(directory) "."}
962    set mfe(openfile$track_num) [tk_getSaveFile -initialdir $mfe(directory) -filetypes $types]
963}
964
965proc wave_file_delete {} {
966    global track_num mfe
967    if {[winfo exists .wave_file_delete] != 0} {destroy .wave_file_delete}
968    toplevel .wave_file_delete
969    wm title .wave_file_delete "Wave File Delete Warning!"
970    message .wave_file_delete.out  -width 300 -text "Are you sure you want to delete\nfile Track $track_num"
971    button .wave_file_delete.button1 -text Cancel -command {destroy .wave_file_delete}
972    button .wave_file_delete.button2 -text Ok -command {
973	if {[file exists $mfe(file$track_num)]==1} {
974	    file delete $mfe(file$track_num)
975	}
976	destroy .wave_file_delete
977	messages [format "File $mfe(file$track_num) DELETED!"]
978    }
979    pack .wave_file_delete.out
980    pack .wave_file_delete.button1 -padx 30 -side left
981    pack .wave_file_delete.button2 -padx 30
982
983}
984
985proc move_to_locate {} {
986        global sp_minutes sp_seconds sp_seconds2 locate_name sp_minutes_loc sp_seconds_loc playhandle stop_command time_format start_time start_time2
987    if {$stop_command==0} {
988	if {$time_format=="Minutes"} {
989	    set target_time [expr $sp_minutes_loc($locate_name)*60+$sp_seconds_loc($locate_name)]
990	} else {
991	    set target_time $sp_seconds_loc($locate_name)
992	}
993	set sp_minutes $sp_minutes_loc($locate_name)
994	set sp_seconds $sp_seconds_loc($locate_name)
995	set sp_seconds2 $sp_seconds_loc($locate_name)
996	puts $playhandle "setpos $target_time"
997	set start_time2 [clock clicks -milliseconds]
998	tick
999    } else {
1000	set sp_minutes $sp_minutes_loc($locate_name)
1001	set sp_seconds $sp_seconds_loc($locate_name)
1002	display_position
1003    }
1004}
1005
1006proc tick {} {
1007    global stop_command start_time start_time2 sp_seconds sp_seconds2 sp_minutes time_format mfe punch play_text fw_text rew_text rewbeg_text
1008    if {$stop_command==1} {return}
1009    after 50 tick
1010    set elapsedMS [expr {[clock clicks -milliseconds] - $start_time2} - 250]
1011    set sp_seconds [expr $sp_seconds2 + {double($elapsedMS)/1000}]
1012    if {$sp_seconds >= 60 && $time_format=="Minutes"} {
1013	set start_time2 [expr $start_time2+60000+$sp_seconds2]
1014	set sp_minutes [expr $sp_minutes+1]
1015    }
1016    display_position
1017#    if {$stop_command==3} {
1018#	set stop_command 1
1019#	set stop_command 3    }
1020}
1021
1022proc display_position {} {
1023    global sp_minutes sp_seconds time_format
1024    .mfe.low.seconds config  -text [format "%.2f" $sp_seconds]
1025    if {$time_format=="Minutes"} {
1026	.mfe.low.minutes config  -text [format "%02d" $sp_minutes]
1027    }
1028}
1029
1030proc mute_unmute {} {
1031    global stop_command mfe track_num playhandle
1032
1033    if {$stop_command==0} {
1034	    puts $playhandle "c-select $track_num\nc-muting"
1035    }
1036}
1037
1038proc change_controller_on_the_fly {} {
1039    global stop_command mfe track_num effect_number playhandle preview
1040#    set mfe(controller_number) [expr $mfe(controller_number)+$mfe(volume_position$track_num)]
1041
1042    if {$stop_command==0} {
1043	if {$preview==1} {
1044	    puts $playhandle "c-select $track_num\ncop-select $mfe(effect_position1$track_num) \ncopp-select $mfe(param_number)\ncopp-set $mfe($mfe(param_value))"
1045	} else {
1046	    puts $playhandle "c-select $track_num\ncop-select $mfe(effect_position$effect_number$track_num) \ncopp-select $mfe(param_number)\ncopp-set $mfe($mfe(param_value))"
1047	}
1048    }
1049}
1050
1051proc change_volume_on_the_fly {} {
1052    global stop_command mfe track_num effect_number playhandle
1053
1054    if {$stop_command==0} {
1055    	    puts $playhandle "c-select $track_num\ncop-select $mfe(volume_position$track_num) \ncopp-select $mfe(param_number)\ncopp-set [expr $mfe(volume$track_num)*$mfe(master)/100]"
1056    }
1057}
1058
1059proc change_pan_on_the_fly {} {
1060    global stop_command mfe track_num effect_number playhandle
1061
1062    if {$stop_command==0} {
1063	    puts $playhandle "c-select $track_num\ncop-select [expr $mfe(volume_position$track_num)+1] \ncopp-select $mfe(param_number)\ncopp-set $mfe(pan$track_num)"
1064    }
1065}
1066
1067proc stop {} {
1068    global stop_command playhandle punch punch_y punch_t sp_minutes2 sp_seconds2 number_of_tracks mfe start_time w
1069    puts $playhandle "s\n"
1070    puts $playhandle "dump-position \n"
1071    puts $playhandle "q\n"
1072    set stop_command 1
1073    fileevent $playhandle writable read_stop_position
1074    for {set n 1} {$n <= $number_of_tracks} {incr n} {
1075	  if {$mfe(track_status$n)!= "Deleted"} {
1076	    $w.track$n.rec configure -state normal
1077	    $w.track$n.delete configure -state normal
1078	    $w.track$n.file configure -state normal
1079	    $w.track$n.open configure -state normal
1080	    $w.track$n.track_properties configure -state normal
1081	    $w.track$n.dev_text configure -state normal
1082	    $w.track$n.dev_entry configure -state normal
1083	    $w.track$n.chn_text configure -state normal
1084	    $w.track$n.chn_entry configure -state normal
1085	    $w.track$n.eca_tools configure -state normal
1086	  }
1087    }
1088    .mfe.up1.button configure -state normal
1089    .mfe.up2.mixdown configure -state normal
1090#    .mfe.up2.metronome configure -state normal
1091    .mfe.up2.addtrack configure -state normal
1092    .mfe.up2.del_all_tracks configure -state normal
1093    .mfe.up2.quit configure -state normal
1094    .mfe.low.multich2 configure -state normal
1095#    .mfe.low.rew_to_begin configure -state normal
1096#    .mfe.low.rew_5 configure -state normal
1097#    .mfe.low.forw_5 configure -state normal
1098
1099
1100    if {$punch==2} {
1101        set punch 0
1102	for {set n 1} {$n <= $number_of_tracks} {incr n} {
1103	    if {$mfe(track_rec_status$n)=="Yes"} {
1104
1105		if {$mfe(latency)!=0} {
1106		    set latency_seconds [expr $mfe(latency)/1000]
1107    	            set cmd2 "exec [list ecasound -i:$mfe(temp_file$n) -y:$latency_seconds -o:$mfe(temp_file$n)]"
1108		    catch {eval $cmd2} exec_out
1109		}
1110
1111		set cmd "exec [list ecasound -i:$mfe(temp_file2$n) $punch_t -o:$mfe(file$n) $punch_y $punch_t ]"
1112		catch {eval $cmd} exec_out
1113		set total_punch_out [expr $mfe(punch_out_minutes)*60+$mfe(punch_out_seconds)]
1114		set total_punch_in [expr $mfe(punch_in_minutes)*60+$mfe(punch_in_seconds)]
1115		if {$start_time>$total_punch_in} {
1116		    if {$start_time<$total_punch_out} {
1117			set real_proc_time [expr $start_time-$total_punch_in]
1118			set punch_t "-t:$real_proc_time"
1119		    }
1120		    set cmd2 "exec [list ecasound -i:$mfe(temp_file$n) $punch_y $punch_t -o:$mfe(file$n) $punch_y $punch_t ]"
1121		    catch {eval $cmd2} exec_out
1122		}
1123	    }
1124	    file delete $mfe(temp_file$n)
1125	    file delete $mfe(temp_file2$n)
1126	}
1127    } else {
1128
1129	if {$mfe(latency)!=0} {
1130	    set latency_seconds [expr $mfe(latency)/1000]
1131    	    for {set n 1} {$n <= $number_of_tracks} {incr n} {
1132		if {$mfe(track_rec_status$n)=="Yes"} {
1133		    set cmd2 "exec [list ecasound -i:$mfe(file$n) -y:$latency_seconds -o:$mfe(file$n)]"
1134		    catch {eval $cmd2} exec_out
1135		}
1136	    }
1137	}
1138    }
1139
1140}
1141
1142proc read_stop_position {} {
1143    global sp_seconds sp_minutes sp_seconds2 sp_minutes2 playhandle start_time mfe
1144    close $playhandle
1145    set tkeca_log [open "~/tkeca.log" r]
1146    while {[gets $tkeca_log input_line]!= -1} {
1147	if {[string match dump-position* $input_line] ==1} {
1148	    regsub dump-position $input_line {} input_line
1149	    regsub { } $input_line {} start_time
1150	    set sp_minutes2 [expr int($start_time/60)]
1151	    set sp_seconds2 [expr $start_time-60*$sp_minutes]
1152	    if {[expr $sp_seconds+$sp_minutes*60-$start_time] < 1} {
1153		set sp_minutes [expr int($start_time/60)]
1154		set sp_seconds [expr $start_time-60*$sp_minutes]
1155	    } else {
1156		set sp_minutes 0
1157		set sp_seconds 0
1158	    }
1159	display_position
1160	}
1161    }
1162    close $tkeca_log
1163}
1164
1165proc messages {msg} {
1166    if {[winfo exists .msg] != 0} {destroy .msg}
1167    toplevel .msg
1168    wm title .msg "Tkeca Message"
1169    message .msg.out  -width 300 -text $msg
1170    button .msg.button -text Ok -command {destroy .msg}
1171    pack .msg.out -expand 1 -fill x
1172    pack .msg.button
1173}
1174
1175proc ecanormalize {} {
1176    global mfe track_num
1177    if {[winfo exists .normalize] != 0} {destroy .normalize}
1178    toplevel .normalize
1179    wm title .normalize "Normalize Warning!"
1180    message .normalize.out  -width 300 -text "Are you sure you want to Normalize\nfiles on Track $track_num"
1181    button .normalize.button1 -text Cancel -command {destroy .normalize}
1182    button .normalize.button2 -text Ok -command {
1183	set pointer "file$track_num"
1184	if {[string length $mfe($pointer)] > 3} {
1185	    set cmd "exec ecanormalize $mfe($pointer) &"
1186	    catch {eval $cmd} exec_out
1187	    destroy .normalize
1188	    messages [format "File $mfe(file$track_num) NORMALIZED!"]
1189	} else {
1190	    destroy .normalize
1191	}
1192    }
1193    pack .normalize.out
1194    pack .normalize.button1 -padx 30 -side left
1195    pack .normalize.button2 -padx 30
1196}
1197
1198proc ecafixdc {} {
1199    global mfe track_num
1200    if {[winfo exists .fixdc] != 0} {destroy .fixdc}
1201    toplevel .fixdc
1202    wm title .fixdc "Fix DC Warning!"
1203    message .fixdc.out  -width 300 -text "Are you sure you want to fix DC Offset\nin files on Track $track_num"
1204    button .fixdc.button1 -text Cancel -command {destroy .fixdc}
1205    button .fixdc.button2 -text Ok -command {
1206	set pointer "file$track_num"
1207	if {[string length $mfe($pointer)] > 3} {
1208	    set cmd "exec ecafixdc $mfe($pointer) &"
1209	    catch {eval $cmd} exec_out
1210	    destroy .fixdc
1211#	    messages [format "DC Offset fixed in file\n$mfe(file$track_num)"]
1212	} else {
1213	    destroy .fixdc
1214	}
1215    }
1216    pack .fixdc.out
1217    pack .fixdc.button1 -padx 35 -side left
1218    pack .fixdc.button2 -padx 35
1219}
1220
1221proc wave_edit {} {
1222    global mfe track_num wave_editor file_num
1223    set pointer "file$track_num"
1224    set cmd "exec $wave_editor \"$mfe($pointer)\""
1225    catch {eval $cmd} exec_out
1226}
1227
1228proc save_file {} {
1229    global mfe number_of_tracks sp_minutes sp_seconds save_as track_num types sp_minutes_loc sp_seconds_loc
1230    unsolo_all
1231    if {$mfe(openfile0) == ""} {
1232	if {$save_as == 1} {return} else {
1233	    set types {{{mfe files} {*.mfe}} {{all} {*}}}
1234	    set track_num 0
1235	    file_browser2
1236	    if {$mfe(openfile0) == ""} {return}
1237
1238	}
1239    }
1240    if {[string match *.mfe* $mfe(openfile0)] == 0 && [string match *.MFE* $mfe(openfile0)] == 0} {
1241	set mfe(openfile0) "$mfe(openfile0).mfe"
1242    }
1243    set real_number_of_tracks $number_of_tracks
1244    for {set n 1} {$n <= $number_of_tracks} {incr n} {
1245	if {$mfe(track_status$n)=="Deleted"} {
1246	    set real_number_of_tracks [expr $real_number_of_tracks-1]
1247	}
1248    }
1249    set file_to_save [open "$mfe(openfile0)" w]
1250    puts $file_to_save "This file was created by tkeca.tcl version 4.4.2"
1251    puts $file_to_save "$real_number_of_tracks"
1252    puts $file_to_save "$mfe(directory)"
1253    puts $file_to_save "$sp_minutes"
1254    puts $file_to_save "$sp_seconds"
1255    puts $file_to_save "$mfe(master)"
1256    puts $file_to_save "$mfe(multichannel)"
1257    puts $file_to_save "$mfe(rec_prop_bits)"
1258    puts $file_to_save "$mfe(rec_prop_channels)"
1259    puts $file_to_save "$mfe(rec_prop_srate)"
1260    puts $file_to_save "$mfe(rec_prop_interl)"
1261    puts $file_to_save "$mfe(latency)"
1262    puts $file_to_save "$mfe(mixdown_normalize)"
1263    puts $file_to_save "$mfe(mixdown_normalize_amp)"
1264    puts $file_to_save "$mfe(mixdown_normalize_lev)"
1265
1266    for {set n 0} {$n <= $number_of_tracks} {incr n} {
1267    if {$mfe(track_status$n)!="Deleted"} {
1268	puts $file_to_save "$mfe(rec_prop_bits$n)"
1269	puts $file_to_save "$mfe(rec_prop_channels$n)"
1270	puts $file_to_save "$mfe(rec_prop_srate$n)"
1271	puts $file_to_save "$mfe(rec_prop_interl$n)"
1272	puts $file_to_save "$mfe(track_name$n)"
1273	puts $file_to_save "$mfe(file$n)"
1274	puts $file_to_save "$mfe(device$n)"
1275	puts $file_to_save "$mfe(chn$n)"
1276	puts $file_to_save "$mfe(track_status$n)"
1277	puts $file_to_save "$mfe(track_rec_status$n)"
1278	for {set en 1} {$en <= 8} {incr en} {
1279	    puts $file_to_save "$mfe(effect$en$n)"
1280	    puts $file_to_save "$mfe(effect_attached$en$n)"
1281	    if {$mfe(effect$en$n)!="None"} {
1282		puts $file_to_save "$mfe(effect_parameters$en$n)"
1283		for {set p 1} {$p <= $mfe(effect_parameters$en$n)} {incr p} {
1284		    puts $file_to_save "$mfe(effect_parameter$p$en$n)"
1285		}
1286	    }
1287	}
1288	puts $file_to_save "$mfe(volume$n)"
1289	puts $file_to_save "$mfe(pan$n)"
1290
1291    }
1292    }
1293
1294    for {set n 1} {$n <= 16} {incr n} {
1295    	puts $file_to_save "$sp_minutes_loc($n)"
1296	puts $file_to_save "$sp_seconds_loc($n)"
1297    }
1298	puts $file_to_save "$mfe(punch_in_minutes)"
1299	puts $file_to_save "$mfe(punch_in_seconds)"
1300	puts $file_to_save "$mfe(punch_out_minutes)"
1301	puts $file_to_save "$mfe(punch_out_seconds)"
1302
1303    puts $file_to_save "\n"
1304    close $file_to_save
1305    messages [format "File $mfe(openfile0) saved"]
1306}
1307
1308proc open_file {} {
1309    global mfe mfe_temp number_of_tracks sp_minutes sp_seconds w sp_minutes_loc sp_seconds_loc prev_loaded_file
1310    if {$number_of_tracks > 0} {
1311	del_all_tracks
1312    }
1313    if {$mfe(openfile0) == ""} {
1314	return
1315    }
1316    set line_number 0
1317    set file_to_open [open "$mfe(openfile0)" r]
1318    while {[gets $file_to_open input_line] != -1 } {
1319	set temp_file($line_number) $input_line
1320	incr line_number
1321    }
1322    set line_number 0
1323    set number_of_effects 8
1324    set tkeca_version $temp_file($line_number)
1325    if {$temp_file($line_number)!="This file was created by tkeca.tcl version 4.0.0" && $temp_file($line_number)!="This file was created by tkeca.tcl version 4.4.0" && $temp_file($line_number)!="This file was created by tkeca.tcl version 4.4.2" && $temp_file($line_number)!="This file was created by tkeca.tcl version 4.2.0"} {
1326	set number_of_effects 4
1327	if {$temp_file($line_number)!="This file was created by tkeca.tcl version 3.2.0" && $temp_file($line_number)!="This file was created by tkeca.tcl version 3.0.0"} {
1328	    messages [format "File $mfe(openfile0)\nwas not created by tkeca.tcl 3.0.0 or superior"]
1329	    set mfe(openfile0) ""
1330	    return
1331	}
1332    }
1333    incr line_number
1334#    set number_of_tracks3 $number_of_tracks
1335    set number_of_tracks $temp_file($line_number)
1336#    set number_of_tracks2 $number_of_tracks
1337#    for {set number_of_tracks 1} {$number_of_tracks <= $number_of_tracks3} {incr number_of_tracks} {
1338#	set w "$w2.track$number_of_tracks"
1339#	destroy $w.number$number_of_tracks
1340#	destroy $w.delete$number_of_tracks
1341#	destroy $w.name$number_of_tracks
1342#	destroy $w.track_properties$number_of_tracks
1343#	destroy $w.wave_info$number_of_tracks
1344#	destroy $w.dev_text$number_of_tracks
1345#	destroy $w.dev_entry$number_of_tracks
1346#	destroy $w.chn_text$number_of_tracks
1347#	destroy $w.chn_entry$number_of_tracks
1348#	destroy $w.solo$number_of_tracks
1349#	destroy $w.play$number_of_tracks
1350#	destroy $w.rec$number_of_tracks
1351#	destroy $w.effect1$number_of_tracks
1352#	destroy $w.effect2$number_of_tracks
1353#	destroy $w.effect3$number_of_tracks
1354#	destroy $w.effect4$number_of_tracks
1355#	destroy $w.eca_tools$number_of_tracks
1356#	destroy $w.pan$number_of_tracks
1357#	destroy $w.slide$number_of_tracks
1358#    }
1359#    set w $w2
1360#    set number_of_tracks $number_of_tracks2
1361    incr line_number
1362    set mfe(directory) $temp_file($line_number)
1363    incr line_number
1364    set sp_minutes $temp_file($line_number)
1365    incr line_number
1366    set sp_seconds $temp_file($line_number)
1367    incr line_number
1368    if {$tkeca_version == "This file was created by tkeca.tcl version 4.4.0" || $tkeca_version == "This file was created by tkeca.tcl version 4.4.2"} {
1369        set mfe(master) $temp_file($line_number)
1370	incr line_number
1371    }
1372
1373    set mfe(multichannel) $temp_file($line_number)
1374    incr line_number
1375
1376    if {$tkeca_version == "This file was created by tkeca.tcl version 4.4.2"} {
1377	set mfe(rec_prop_bits) $temp_file($line_number)
1378	incr line_number
1379	set mfe(rec_prop_channels) $temp_file($line_number)
1380	incr line_number
1381	set mfe(rec_prop_srate) $temp_file($line_number)
1382	incr line_number
1383	set mfe(rec_prop_interl) $temp_file($line_number)
1384	incr line_number
1385	set mfe(latency) $temp_file($line_number)
1386	incr line_number
1387	set $mfe(mixdown_normalize) $temp_file($line_number)
1388	incr line_number
1389	set $mfe(mixdown_normalize_amp) $temp_file($line_number)
1390	incr line_number
1391	set $mfe(mixdown_normalize_lev) $temp_file($line_number)
1392	incr line_number
1393	set l 0
1394    } else {
1395	set mfe(rec_prop_bits0) $temp_file($line_number)
1396	incr line_number
1397	set mfe(rec_prop_channels0) $temp_file($line_number)
1398	incr line_number
1399	set mfe(rec_prop_srate0) $temp_file($line_number)
1400	incr line_number
1401	set mfe(rec_prop_interl0) $temp_file($line_number)
1402	incr line_number
1403	set l 1
1404    }
1405
1406    for {set n $l} {$n <= $number_of_tracks} {incr n} {
1407	set mfe(rec_prop_bits$n) $temp_file($line_number)
1408	incr line_number
1409	set mfe(rec_prop_channels$n) $temp_file($line_number)
1410	incr line_number
1411	set mfe(rec_prop_srate$n) $temp_file($line_number)
1412	incr line_number
1413	set mfe(rec_prop_interl$n) $temp_file($line_number)
1414	incr line_number
1415	if {$number_of_effects==4} {
1416	    set mfe(track_name$n) "Track $n"
1417	} else {
1418	    set mfe(track_name$n) $temp_file($line_number)
1419	    incr line_number
1420	}
1421	set mfe(file$n) $temp_file($line_number)
1422	incr line_number
1423	set mfe(device$n) $temp_file($line_number)
1424	incr line_number
1425	set mfe(chn$n) $temp_file($line_number)
1426	incr line_number
1427	set mfe(track_status$n) $temp_file($line_number)
1428	incr line_number
1429	set mfe(track_rec_status$n) $temp_file($line_number)
1430	incr line_number
1431	for {set en 1} {$en <= $number_of_effects} {incr en} {
1432	    set mfe(effect$en$n) $temp_file($line_number)
1433	    set mfe_temp(effect$en$n) $temp_file($line_number)
1434	    incr line_number
1435	    if {$number_of_effects==4} {
1436		if {$mfe(effect$en$n)!="None"} {
1437		    set mfe(effect_attached$en$n) "Connected"
1438		} else {
1439	    	    set mfe(effect_attached$en$n) "Bypassed"
1440		}
1441	    } else {
1442		set mfe(effect_attached$en$n) $temp_file($line_number)
1443		incr line_number
1444	    }
1445	    if {$mfe(effect$en$n)!="None"} {
1446		set mfe(effect_parameters$en$n) $temp_file($line_number)
1447		incr line_number
1448		for {set p 1} {$p <= $mfe(effect_parameters$en$n)} {incr p} {
1449		    set mfe(effect_parameter$p$en$n) $temp_file($line_number)
1450		    incr line_number
1451		}
1452	    }
1453	}
1454	if {$number_of_effects==4} {
1455	    set mfe(effect5$n) "None"
1456	    set mfe(effect_attached5$n) "Bypassed"
1457	    set mfe(effect6$n) "None"
1458	    set mfe(effect_attached6$n) "Bypassed"
1459	    set mfe(effect7$n) "None"
1460	    set mfe(effect_attached7$n) "Bypassed"
1461	    set mfe(effect8$n) "None"
1462	    set mfe(effect_attached8$n) "Bypassed"
1463	}
1464	set mfe(volume$n) $temp_file($line_number)
1465	incr line_number
1466	set mfe(pan$n) $temp_file($line_number)
1467	incr line_number
1468	set line_number2 $line_number
1469	set prev_loaded_file 1
1470	set number_of_tracks3 $number_of_tracks
1471	set number_of_tracks $n
1472	set n2 $n
1473#	puts "En open_file w:$w y w2:$w2"
1474	if {$n!=0} {
1475	    add_track
1476	}
1477
1478	set number_of_tracks $number_of_tracks3
1479	set n $n2
1480	set line_number $line_number2
1481    }
1482
1483    for {set locn 1} {$locn <= 16} {incr locn} {
1484    	set sp_minutes_loc($locn) $temp_file($line_number)
1485	incr line_number
1486	set sp_seconds_loc($locn) $temp_file($line_number)
1487	incr line_number
1488    }
1489    	set mfe(punch_in_minutes) $temp_file($line_number)
1490	incr line_number
1491	set mfe(punch_in_seconds) $temp_file($line_number)
1492	incr line_number
1493	set mfe(punch_out_minutes) $temp_file($line_number)
1494	incr line_number
1495	set mfe(punch_out_seconds) $temp_file($line_number)
1496display_position
1497}
1498
1499proc track_data_reset {} {
1500    global mfe track_num
1501    set mfe(rec_prop_bits$track_num) "Signed 16Bit Little Endian"
1502    set mfe(rec_prop_channels$track_num) "1"
1503    set mfe(rec_prop_srate$track_num) "44100"
1504    set mfe(rec_prop_interl$track_num) "i"
1505    set mfe(file$track_num) "(Wave File)"
1506    set mfe(device$track_num) "(I / O Dev.)"
1507    set mfe(chn$track_num) "n/a"
1508    set mfe(track_solo$track_num) "No Solo"
1509    set mfe(track_status$track_num) "Play"
1510    set mfe(track_rec_status$track_num) "No"
1511    for {set en 1} {$en <= 8} {incr en} {
1512	set mfe(effect$en$track_num) "None"
1513	set mfe_temp(effect$en$track_num) "None"
1514	set mfe(effect_attached$en$track_num) "Bypassed"
1515    }
1516    set mfe(volume$track_num) 100
1517    set mfe(pan$track_num) 50
1518}
1519
1520proc del_all_tracks {} {
1521    global number_of_tracks w w2 mfe sp_minutes_loc sp_seconds_loc play_command sp_minutes sp_seconds exit_yes save_as track_num
1522    unsolo_all
1523    .mfe.up1.save configure -state disabled
1524    .mfe.up1.saveas configure -state disabled
1525    .mfe.up2.exportecs configure -state disabled
1526    .mfe.up2.mixdown configure -state disabled
1527
1528    set w2 $w
1529    for {set number_of_tracks1 1} {$number_of_tracks1 <= $number_of_tracks} {incr number_of_tracks1} {
1530	set w "$w2.track$number_of_tracks1"
1531	set mfe(track_status$number_of_tracks1) "Deleted"
1532	destroy $w.number$number_of_tracks1
1533	destroy $w.delete$number_of_tracks1
1534	destroy $w.file$number_of_tracks1
1535	destroy $w.open$number_of_tracks1
1536	destroy $w.track_properties$number_of_tracks1
1537	destroy $w.dev_text$number_of_tracks1
1538	destroy $w.dev_entry$number_of_tracks1
1539	destroy $w.chn_text$number_of_tracks1
1540	destroy $w.chn_entry$number_of_tracks1
1541	destroy $w.solo$number_of_tracks1
1542	destroy $w.play$number_of_tracks1
1543	destroy $w.rec$number_of_tracks1
1544	destroy $w.effect$number_of_tracks1
1545	destroy $w.eca_tools$number_of_tracks1
1546	destroy $w.pan$number_of_tracks1
1547	destroy $w.slide$number_of_tracks1
1548	destroy $w
1549#	set track_num $number_of_tracks1
1550#	track_data_reset
1551    }
1552    set w $w2
1553    set number_of_tracks 0
1554    set mfe(openfile0) ""
1555    set play_command "play"
1556    set mfe(multichannel) 0
1557    set mfe(master) 100
1558    set mfe(rec_prop_bits) "Signed 16Bit Little Endian"
1559    set mfe(rec_prop_channels) "2"
1560    set mfe(rec_prop_srate)  "44100"
1561    set mfe(rec_prop_interl) "i"
1562    set mfe(rec_prop_bits0) "Signed 16Bit Little Endian"
1563    set mfe(rec_prop_channels0) "2"
1564    set mfe(rec_prop_srate0)  "44100"
1565    set mfe(rec_prop_interl0) "i"
1566    set mfe(rec_prop_bitsMD) "Signed 16Bit Little Endian"
1567    set mfe(rec_prop_channelsMD) "2"
1568    set mfe(rec_prop_srateMD) "44100"
1569    set mfe(rec_prop_interlMD) "i"
1570    set sp_minutes 0
1571    set sp_seconds 0
1572    set sp_minutes_loc(1) 0
1573    set sp_minutes_loc(2) 0
1574    set sp_minutes_loc(3) 0
1575    set sp_minutes_loc(4) 0
1576    set sp_minutes_loc(5) 0
1577    set sp_minutes_loc(6) 0
1578    set sp_minutes_loc(7) 0
1579    set sp_minutes_loc(8) 0
1580    set sp_minutes_loc(9) 0
1581    set sp_minutes_loc(10) 0
1582    set sp_minutes_loc(11) 0
1583    set sp_minutes_loc(12) 0
1584    set sp_minutes_loc(13) 0
1585    set sp_minutes_loc(14) 0
1586    set sp_minutes_loc(15) 0
1587    set sp_minutes_loc(16) 0
1588    set sp_seconds_loc(1) 0
1589    set sp_seconds_loc(2) 0
1590    set sp_seconds_loc(3) 0
1591    set sp_seconds_loc(4) 0
1592    set sp_seconds_loc(5) 0
1593    set sp_seconds_loc(6) 0
1594    set sp_seconds_loc(7) 0
1595    set sp_seconds_loc(8) 0
1596    set sp_seconds_loc(9) 0
1597    set sp_seconds_loc(10) 0
1598    set sp_seconds_loc(11) 0
1599    set sp_seconds_loc(12) 0
1600    set sp_seconds_loc(13) 0
1601    set sp_seconds_loc(14) 0
1602    set sp_seconds_loc(15) 0
1603    set sp_seconds_loc(16) 0
1604
1605}
1606
1607proc proc_about {} {
1608messages [format "Tkeca is a Tcl/Tk frontend for Kai Vehmanen's Ecasound
1609Copyright (C) 2002-2003  Luis Pablo Gasparotto
1610This program is free software; you can redistribute it and/or modify \
1611it under the terms of the GNU General Public License as published by \
1612the Free Software Foundation; either version 2 of the License, or \
1613(at your option) any later version.
1614
1615This program is distributed in the hope that it will be useful, \
1616but WITHOUT ANY WARRANTY; without even the implied warranty of \
1617MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the \
1618GNU General Public License for more details.
1619
1620You should have received a copy of the GNU General Public License \
1621along with this program; if not, write to the Free Software \
1622Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1623
1624To contact me: lpgasparotto@gmail.com"]}
1625
1626proc proc_exit {} {
1627    global mfe mfe_temp number_of_tracks sp_minutes sp_seconds sp_minutes_loc sp_seconds_loc saved exit_yes save_as
1628    set saved 1
1629    set line_number 0
1630
1631    if {$number_of_tracks == 0} {
1632	set saved 2
1633    }
1634    if {$mfe(openfile0) == ""} {
1635    set saved [expr $saved - 1]} else {
1636    set file_to_open [open "$mfe(openfile0)" r]
1637    set real_number_of_tracks $number_of_tracks
1638    for {set n 1} {$n <= $number_of_tracks} {incr n} {
1639	if {$mfe(track_status$n)=="Deleted"} {
1640	    set real_number_of_tracks [expr $real_number_of_tracks-1]
1641	}
1642    }
1643    while {[gets $file_to_open input_line] != -1 } {
1644	set temp_file($line_number) $input_line
1645	incr line_number
1646    }
1647    set line_number 1
1648    if {$real_number_of_tracks != $temp_file($line_number)} {set saved 0}
1649    incr line_number
1650    if {$mfe(directory) != $temp_file($line_number)} {set saved 0}
1651    incr line_number
1652#    if {$sp_minutes != $temp_file($line_number)} {set saved 0}
1653    incr line_number
1654#    if {$sp_seconds != $temp_file($line_number)} {set saved 0}
1655    incr line_number
1656    if {$mfe(master) != $temp_file($line_number)} {set saved 0}
1657    incr line_number
1658    if {$mfe(multichannel) != $temp_file($line_number)} {set saved 0}
1659    incr line_number
1660    if {$mfe(rec_prop_bits) != $temp_file($line_number)} {set saved 0}
1661    incr line_number
1662    if {$mfe(rec_prop_channels) != $temp_file($line_number)} {set saved 0}
1663    incr line_number
1664    if {$mfe(rec_prop_srate) != $temp_file($line_number)} {set saved 0}
1665    incr line_number
1666    if {$mfe(rec_prop_interl) != $temp_file($line_number)} {set saved 0}
1667    incr line_number
1668    if {$mfe(latency) != $temp_file($line_number)} {set saved 0}
1669    incr line_number
1670    if {$mfe(mixdown_normalize) != $temp_file($line_number)} {set saved 0}
1671    incr line_number
1672    if {$mfe(mixdown_normalize_amp) != $temp_file($line_number)} {set saved 0}
1673    incr line_number
1674    if {$mfe(mixdown_normalize_lev) != $temp_file($line_number)} {set saved 0}
1675    incr line_number
1676
1677    for {set n 0} {$n <= $number_of_tracks && $saved >0} {incr n} {
1678    if {$mfe(track_status$n)!="Deleted"} {
1679	if {$mfe(rec_prop_bits$n) != $temp_file($line_number)} {set saved 0}
1680	incr line_number
1681	if {$mfe(rec_prop_channels$n) != $temp_file($line_number)} {set saved 0}
1682	incr line_number
1683	if {$mfe(rec_prop_srate$n) != $temp_file($line_number)} {set saved 0}
1684	incr line_number
1685	if {$mfe(rec_prop_interl$n) != $temp_file($line_number)} {set saved 0}
1686	incr line_number
1687	if {$mfe(track_name$n)!= $temp_file($line_number)} {set saved 0 }
1688	incr line_number
1689	if {$mfe(file$n)!= $temp_file($line_number)} {set saved 0 }
1690	incr line_number
1691	if {$mfe(device$n) != $temp_file($line_number)} {set saved 0}
1692	incr line_number
1693	if {$mfe(chn$n) != $temp_file($line_number)} {set saved 0}
1694	incr line_number
1695	if {$mfe(track_status$n) != $temp_file($line_number)} {set saved 0}
1696	incr line_number
1697	if {$mfe(track_rec_status$n) != $temp_file($line_number)} {set saved 0}
1698	incr line_number
1699	for {set en 1} {$en <= 8 && $saved > 0} {incr en} {
1700	    if {$mfe(effect$en$n) != $temp_file($line_number)} {set saved 0}
1701	    if {$mfe_temp(effect$en$n) != $temp_file($line_number)} {set saved 0}
1702	    incr line_number
1703	    if {$mfe(effect_attached$en$n) != $temp_file($line_number)} {set saved 0}
1704	    incr line_number
1705	    if {$mfe(effect$en$n)!="None"} {
1706		set effect_parameters $temp_file($line_number)
1707		incr line_number
1708		for {set p 1} {$p <= $effect_parameters && $saved >0} {incr p} {
1709		    if {$mfe(effect_parameter$p$en$n) != $temp_file($line_number)} {set saved 0}
1710		    incr line_number
1711		}
1712	    }
1713	}
1714	if {$mfe(volume$n) != $temp_file($line_number)} {set saved 0}
1715	incr line_number
1716	if {$mfe(pan$n) != $temp_file($line_number)} {set saved 0}
1717	incr line_number
1718    }
1719    }
1720	for {set n 1} {$n <= 16} {incr n} {
1721	    if {$sp_minutes_loc($n)!= $temp_file($line_number)} {set saved 0}
1722	    incr line_number
1723	    if {$sp_seconds_loc($n)!= $temp_file($line_number)} {set saved 0}
1724	    incr line_number
1725	}
1726	if {$mfe(punch_in_minutes)!= $temp_file($line_number)} {set saved 0 }
1727	incr line_number
1728	if {$mfe(punch_in_seconds)!= $temp_file($line_number)} {set saved 0 }
1729	incr line_number
1730	if {$mfe(punch_out_minutes)!= $temp_file($line_number)} {set saved 0 }
1731	incr line_number
1732	if {$mfe(punch_out_seconds)!= $temp_file($line_number)} {set saved 0 }
1733	incr line_number
1734    }
1735    if {$saved == 0} {
1736	if {[winfo exists .save_alert] != 0} {destroy .save_alert}
1737	toplevel .save_alert
1738	wm title .save_alert "Lose Changes Warning!"
1739	message .save_alert.out  -width 300 -text "You will lose the latest changes! \nWhat do you want to do?"
1740	button .save_alert.button1 -text Cancel -command {
1741	destroy .save_alert
1742	}
1743	button .save_alert.button2 -text "Lose changes" -command {
1744	    destroy .save_alert
1745	    if {$exit_yes==1} {exit}
1746	    if {$exit_yes==2} {del_all_tracks}
1747	    if {$exit_yes==5} {
1748		del_all_tracks
1749		file_browser
1750	    }
1751	}
1752	button .save_alert.button3 -text "Save changes" -command {
1753	    destroy .save_alert
1754	    set save_as 0
1755	    if {$exit_yes==1} {
1756		save_file
1757		exit}
1758	    if {$exit_yes==2} {
1759		save_file
1760		del_all_tracks
1761	    }
1762	    if {$exit_yes==5} {
1763		save_file
1764		del_all_tracks
1765		file_browser
1766	    }
1767	}
1768	pack .save_alert.out
1769	pack .save_alert.button1 -padx 10 -side left
1770	pack .save_alert.button2 -padx 10 -side left
1771	pack .save_alert.button3 -padx 10
1772    } else {
1773	if {$exit_yes==1} {exit}
1774	if {$exit_yes==2} {del_all_tracks}
1775	if {$exit_yes==5} {
1776	    del_all_tracks
1777	    file_browser
1778	}
1779    }
1780}
1781
1782proc export_ecs {} {
1783    global export_ecs eca_string mfe
1784    set export_ecs 1
1785    play
1786    set export_ecs 0
1787    set types {{{Ecasound Chain Setup} {*.ecs}}}
1788    if {$mfe(directory)==""} {set mfe(directory) "."}
1789    set ecs_file [tk_getSaveFile -initialdir $mfe(directory) -filetypes $types]
1790    if {$ecs_file==""} {return}
1791    if {[string match *.ecs* $ecs_file] == 0 && [string match *.ECS* $ecs_file] == 0} {
1792	set ecs_file "$ecs_file.ecs"
1793    }
1794    set ecs_exported_file [open "$ecs_file" w]
1795    puts $ecs_exported_file $eca_string
1796    close $ecs_exported_file
1797    messages [format "Exported to\n$ecs_file"]
1798}
1799
1800proc log {} {
1801    global mfe logarithmic position mfe_temp2
1802    if {$logarithmic == 1} {
1803	set mfe($position) [expr $mfe_temp2($position)/100]
1804	set mfe($position) [expr $mfe($position)*$mfe($position)]
1805    } else {set mfe($position) $mfe_temp2($position)}
1806}
1807
1808proc effect_list {} {
1809    global mfe mfe_temp track_num effect_num eca_effects effect_index effect_name bgcolor stop_command
1810    if {$stop_command==0} {
1811    messages [format "Please, press the STOP button\nbefore add new effects to Track $track_num"]
1812    return
1813    }
1814    if {[winfo exists .effect$effect_num$track_num] != 0} {destroy .effect$effect_num$track_num}
1815    toplevel .effect$effect_num$track_num
1816    wm title .effect$effect_num$track_num "Effect List"
1817    frame .effect$effect_num$track_num.list
1818    listbox .effect$effect_num$track_num.list.list -width 60 -height 25 -selectmode single -yscrollcommand {.effect$effect_num$track_num.list.ysbar set} -exportselection 0
1819    scrollbar .effect$effect_num$track_num.list.ysbar -width 8 -command {.effect$effect_num$track_num.list.list yview}
1820    pack .effect$effect_num$track_num.list.list -side left -fill both -expand yes
1821    pack .effect$effect_num$track_num.list.ysbar -side left -fill y
1822    pack .effect$effect_num$track_num.list -in .effect$effect_num$track_num -side top -fill both -expand yes
1823    .effect$effect_num$track_num.list.list insert end "None"
1824    for {set en 1} {$en <= $eca_effects } {incr en} {
1825	.effect$effect_num$track_num.list.list insert end $effect_name($effect_index($en))
1826    }
1827    frame .effect$effect_num$track_num.buttons
1828    button .effect$effect_num$track_num.buttons.button1 -text Ok -command {
1829    set selected [.effect$effect_num$track_num.list.list curselection]
1830    if {$selected < 1} {set selected 0}
1831    set mfe_temp(effect$effect_num$track_num) $effect_index($selected)
1832    set mfe(effect_attached$effect_num$track_num) "Bypassed"
1833    effect_bypass
1834    effect}
1835    button .effect$effect_num$track_num.buttons.button2 -text Cancel -command {
1836    destroy .effect$effect_num$track_num
1837    return}
1838    pack .effect$effect_num$track_num.buttons.button1 -padx 5 -side left -fill x -expand yes
1839    pack .effect$effect_num$track_num.buttons.button2 -padx 5 -side left -fill x -expand yes
1840    pack .effect$effect_num$track_num.buttons -in .effect$effect_num$track_num -pady 5 -side bottom -fill x
1841}
1842
1843proc close_effect {} {
1844    global mfe mfe_temp effect2 track stop_command
1845    set mfe(effect$effect2$track) $mfe_temp(effect$effect2$track)
1846    destroy .effect$effect2$track
1847}
1848
1849proc options {} {
1850    global mt_font option_value option_parameter bgcolor bgcolor2 line_number ladspa_path ecasoundrc
1851    if {[winfo exists .options] != 0} {destroy .options}
1852    set rc_infile [open $ecasoundrc r]
1853    set line_number 0
1854    toplevel .options -width 600
1855    wm title .options "Ecasound Global Settings"
1856    frame .options.up
1857    message .options.up.out -width 540 -text "Global Settings"
1858    pack .options.up.out -side top
1859    pack .options.up -pady 2
1860    #-expand 1 -fill x -side top
1861
1862    frame .options.med
1863    canvas .options.med.canvas  -width 520 -height 300 -yscrollcommand [list .options.med.yscroll set]
1864    set w2 [frame .options.med.canvas.f -bd 0]
1865    .options.med.canvas create window 0 0 -anchor nw -window $w2 -tags options
1866    scrollbar .options.med.yscroll  -orient vertical -width 8 -command [list .options.med.canvas yview]
1867    while {[gets $rc_infile input_line] != -1} {
1868	set temp_file($line_number) $input_line
1869	set current_parameter [split $input_line =]
1870	set option_parameter($line_number) [lindex $current_parameter 0]
1871	regsub -all {( )} $option_parameter($line_number) {} option_parameter($line_number)
1872	set option_value($line_number) [lindex $current_parameter 1]
1873	regsub -all {( )} $option_value($line_number) {} option_value($line_number)
1874	if {[string match *adspa* $option_parameter($line_number)] == 1} {
1875	    set ladspa_path $option_value($line_number)
1876	}
1877	.options.med.canvas config -scrollregion "0 0 0 [expr $line_number *23]"
1878#	set w3 $w2.$line_number
1879#	frame $w3
1880  	label $w2.param$line_number  -width 30 -font $mt_font -text $option_parameter($line_number) -anchor w
1881#	$w2 create label  -width 30 -font $mt_font -text $option_parameter($line_number) -anchor w
1882#	entry $w2.value$line_number -bg white -width 400 -textvariable option_value($line_number)
1883#    	$w2 create entry -bg white -width 50 -textvariable option_value($line_number)
1884	entry $w2.value$line_number -bg white -width 50 -textvariable option_value($line_number)
1885#	pack $w2.param$line_number -side left
1886#	pack $w2.value$line_number -side left -expand 1 -fill x
1887	grid $w2.param$line_number $w2.value$line_number -sticky news
1888	grid columnconfig $w2 1 -weight 10
1889#	pack $w2 -expand 1 -fill x -side top
1890	incr line_number
1891    }
1892#    for {set row_number 0} {$row_number < $line_number} {incr row_number} {
1893
1894#    }
1895
1896    #pack .options.med.canvas.f -expand 1 -fill x -side top
1897    pack .options.med.canvas -expand 1 -fill both -side left
1898    pack .options.med.yscroll -fill y -expand 1 -side top
1899    pack .options.med -fill both -expand 1 -side top
1900    frame .options.low
1901    button .options.low.ok -text Ok -command {save_options}
1902    button .options.low.cancel -text Cancel -command {destroy .options}
1903    pack .options.low.ok -padx 5 -fill x -expand 1 -side left
1904    pack .options.low.cancel -padx 5 -fill x -expand 1 -side left
1905    pack .options.low -pady 5 -fill x -expand 1 -side left
1906    bind .options <Configure> {.options.med.canvas itemconfigure options -width [expr [winfo width .options]-15]}
1907    close $rc_infile
1908}
1909
1910proc save_options {} {
1911    global option_value option_parameter line_number wave_editor ladspa_path eca_effects ecasoundrc default_audio_io
1912    set rc_infile [open $ecasoundrc w]
1913    for {set row_number 0} {$row_number < $line_number} {incr row_number} {
1914	puts $rc_infile "$option_parameter($row_number) = $option_value($row_number)"
1915	if {[string match *wave-editor* $option_parameter($row_number)] == 1} {
1916	    set wave_editor $option_value($row_number)
1917	}
1918	if {[string match *ladsp* $option_parameter($row_number)] == 1 && $ladspa_path != $option_value($row_number)} {
1919	    set ladspa_path $option_value($row_number)
1920	    set eca_effects 69
1921	    ladspa
1922	}
1923	if {[string match *efault-outpu* $option_parameter($row_number)] == 1 && $default_audio_io != $option_value($row_number)} {
1924	    set default_audio_io $option_value($row_number)
1925	}
1926    }
1927    close $rc_infile
1928    destroy .options
1929}
1930
1931proc rec_properties {} {
1932    global mfe track_num bgcolor mixdown mt_font time_format
1933    if {[winfo exists .rec_properties$track_num] != 0} {destroy .rec_properties$track_num}
1934    if {$mfe(multichannel)==1 && $track_num!=0} {return}
1935    if {$mfe(multichannel)==0 && $track_num==0} {return}
1936
1937    if {$mixdown==0} {
1938	set w .rec_properties$track_num
1939	toplevel $w
1940	label $w.text -text "$mfe(track_name$track_num) Recording Properties"
1941	wm title .rec_properties$track_num "$mfe(track_name$track_num)"
1942	set current_track_bits $mfe(rec_prop_bits$track_num)
1943	set current_track_chn $mfe(rec_prop_channels$track_num)
1944	set current_track_srate $mfe(rec_prop_srate$track_num)
1945	set current_track_interl $mfe(rec_prop_interl$track_num)
1946    } elseif {$mixdown==1} {
1947	set w .rec_properties$track_num
1948	toplevel $w
1949    	label $w.text -text "Mixdown Properties"
1950	wm title $w "Mixdown Properties Window"
1951	if {[winfo exists .locate] != 0} {destroy}
1952	if {$time_format=="Seconds"} {time_format}
1953	set current_track_bits $mfe(rec_prop_bitsMD)
1954	set current_track_chn $mfe(rec_prop_channelsMD)
1955	set current_track_srate $mfe(rec_prop_srateMD)
1956	set current_track_interl $mfe(rec_prop_interlMD)
1957	set mixdown_begin_min $mfe(mixdown_begin_min)
1958	set mixdown_begin_sec $mfe(mixdown_begin_sec)
1959	set mixdown_end_min $mfe(mixdown_end_min)
1960	set mixdown_end_sec $mfe(mixdown_end_sec)
1961	set mixdown_normalize $mfe(mixdown_normalize)
1962	set mixdown_normalize_amp $mfe(mixdown_normalize_amp)
1963	set mixdown_normalize_lev $mfe(mixdown_normalize_lev)
1964    } else {
1965	set w .rec_properties
1966	toplevel $w
1967    	label $w.text -text "Global Multichannel Properties"
1968	wm title $w "Multichannel"
1969	set track_num ""
1970	set current_track_bits $mfe(rec_prop_bits)
1971	set current_track_chn $mfe(rec_prop_channels)
1972	set current_track_srate $mfe(rec_prop_srate)
1973	set current_track_interl $mfe(rec_prop_interl)
1974    }
1975    #set bits_list {u8 s16_le s16_be s24_le s24_be s32_le s32_be f32_le f32_be}
1976    set bits_list {"Unsigned 8Bit" "Signed 16Bit Little Endian" "Signed 16Bit Big Endian" "Signed 24Bit Little Endian" "Signed 24Bit Big Endian" "Signed 32Bit Little Endian" "Signed 32Bit Big Endian" "F. Point 32Bit Little Endian" "F. Point 32Bit Big Endian"}
1977    frame $w.bits
1978#    label $w.bits.l  -text "Bits:" -justify left
1979    labelframe $w.bits.title -text "Depth"
1980#    ttk::combobox $w.bits.title.box -textvariable mfe(rec_prop_bits$track_num) -state readonly -values $bits_list
1981    spinbox $w.bits.title.box -textvariable mfe(rec_prop_bits$track_num) -state readonly -values $bits_list
1982#    frame $w.bitsa -bg $bgcolor
1983#    frame $w.bitsb -bg $bgcolor
1984#    frame $w.bitsc -bg $bgcolor
1985#    frame $w.bitsd -bg $bgcolor
1986#    frame $w.bitse -bg $bgcolor
1987#    radiobutton $w.bitsa.1 -font $mt_font -bg $bgcolor -text "Unsigned 8 bits" -variable mfe(rec_prop_bits$track_num) -value "u8" -justify left
1988#    radiobutton $w.bitsb.2 -font $mt_font -bg $bgcolor -text "Signed 16 bits little endian" -variable mfe(rec_prop_bits$track_num) -value "s16_le" -justify left
1989#    radiobutton $w.bitsb.3 -font $mt_font -bg $bgcolor -text "Signed 16 bits big endian" -variable mfe(rec_prop_bits$track_num) -value "s16_be" -justify left
1990#    radiobutton $w.bitsc.4 -font $mt_font -bg $bgcolor -text "Signed 24 bits little endian" -variable mfe(rec_prop_bits$track_num) -value "s24_le" -justify left
1991#    radiobutton $w.bitsc.5 -font $mt_font -bg $bgcolor -text "Signed 24 bits big endian" -variable mfe(rec_prop_bits$track_num) -value "s24_be" -justify left
1992#    radiobutton $w.bitsd.6 -font $mt_font -bg $bgcolor -text "Signed 32 bits little endian" -variable mfe(rec_prop_bits$track_num) -value "s32_le" -justify left
1993#    radiobutton $w.bitsd.7 -font $mt_font -bg $bgcolor -text "Signed 32 bits big endian" -variable mfe(rec_prop_bits$track_num) -value "s32_be" -justify left
1994#    radiobutton $w.bitse.8 -font $mt_font -bg $bgcolor -text "Floating point 32 bits little endian" -variable mfe(rec_prop_bits$track_num) -value "f32_le" -justify left
1995#    radiobutton $w.bitse.9 -font $mt_font -bg $bgcolor -text "Floating point 32 bits big endian" -variable mfe(rec_prop_bits$track_num) -value "f32_be" -justify left
1996
1997    if {$mixdown!=1} {
1998	set channels_list {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16}
1999	frame $w.channels
2000	labelframe $w.channels.title -text "Channels"
2001#	ttk::combobox $w.channels.title.box -textvariable mfe(rec_prop_channels$track_num) -state readonly -values $channels_list
2002	spinbox $w.channels.title.box -textvariable mfe(rec_prop_channels$track_num) -state readonly -values $channels_list
2003#	frame $w.channels
2004#	label $w.channels.l  -text "Channels:" -justify left
2005#	frame $w.channels1 -bg $bgcolor
2006#	frame $w.channels2 -bg $bgcolor
2007#	radiobutton $w.channels1.1 -font $mt_font -bg $bgcolor -text "1" -variable mfe(rec_prop_channels$track_num) -value "1"
2008#	radiobutton $w.channels1.2 -font $mt_font -bg $bgcolor -text "2" -variable mfe(rec_prop_channels$track_num) -value "2"
2009#	radiobutton $w.channels1.3 -font $mt_font -bg $bgcolor -text "3" -variable mfe(rec_prop_channels$track_num) -value "3"
2010#	radiobutton $w.channels1.4 -font $mt_font -bg $bgcolor -text "4" -variable mfe(rec_prop_channels$track_num) -value "4"
2011#	radiobutton $w.channels1.5 -font $mt_font -bg $bgcolor -text "5" -variable mfe(rec_prop_channels$track_num) -value "5"
2012#	radiobutton $w.channels1.6 -font $mt_font -bg $bgcolor -text "6" -variable mfe(rec_prop_channels$track_num) -value "6"
2013#	radiobutton $w.channels1.7 -font $mt_font -bg $bgcolor -text "7" -variable mfe(rec_prop_channels$track_num) -value "7"
2014#	radiobutton $w.channels1.8 -font $mt_font -bg $bgcolor -text "8" -variable mfe(rec_prop_channels$track_num) -value "8"
2015#	radiobutton $w.channels2.9 -font $mt_font -bg $bgcolor -text "9" -variable mfe(rec_prop_channels$track_num) -value "9"
2016#	radiobutton $w.channels2.10 -font $mt_font -bg $bgcolor -text "10" -variable mfe(rec_prop_channels$track_num) -value "10"
2017#	radiobutton $w.channels2.11 -font $mt_font -bg $bgcolor -text "11" -variable mfe(rec_prop_channels$track_num) -value "11"
2018#	radiobutton $w.channels2.12 -font $mt_font -bg $bgcolor -text "12" -variable mfe(rec_prop_channels$track_num) -value "12"
2019#	radiobutton $w.channels2.13 -font $mt_font -bg $bgcolor -text "13" -variable mfe(rec_prop_channels$track_num) -value "13"
2020#	radiobutton $w.channels2.14 -font $mt_font -bg $bgcolor -text "14" -variable mfe(rec_prop_channels$track_num) -value "14"
2021#	radiobutton $w.channels2.15 -font $mt_font -bg $bgcolor -text "15" -variable mfe(rec_prop_channels$track_num) -value "15"
2022#	radiobutton $w.channels2.16 -font $mt_font -bg $bgcolor -text "16" -variable mfe(rec_prop_channels$track_num) -value "16"
2023    }
2024
2025    set srates_list {8000 11025 16000 22050 32000 44100 48000 88200 96000 192000}
2026    frame $w.srate
2027    labelframe $w.srate.title -text "Sample Rate (KHz)"
2028#    ttk::combobox $w.srate.title.box -textvariable mfe(rec_prop_srate$track_num) -state readonly -values $srates_list
2029    spinbox $w.srate.title.box -textvariable mfe(rec_prop_srate$track_num) -state readonly -values $srates_list
2030#    frame $w.srate
2031#    label $w.srate.l  -text "Sample Rate:" -justify left
2032#    frame $w.srate1 -bg $bgcolor
2033#    frame $w.srate2 -bg $bgcolor
2034#    radiobutton $w.srate1.1 -font $mt_font -bg $bgcolor -text "8000" -variable mfe(rec_prop_srate$track_num) -value "8000"
2035#    radiobutton $w.srate1.2 -font $mt_font -bg $bgcolor -text "11025" -variable mfe(rec_prop_srate$track_num) -value "11025"
2036#    radiobutton $w.srate1.3 -font $mt_font -bg $bgcolor -text "16000" -variable mfe(rec_prop_srate$track_num) -value "16000"
2037#    radiobutton $w.srate1.4 -font $mt_font -bg $bgcolor -text "22050" -variable mfe(rec_prop_srate$track_num) -value "22050"
2038#    radiobutton $w.srate1.5 -font $mt_font -bg $bgcolor -text "32000" -variable mfe(rec_prop_srate$track_num) -value "32000"
2039#    radiobutton $w.srate1.6 -font $mt_font -bg $bgcolor -text "44100" -variable mfe(rec_prop_srate$track_num) -value "44100"
2040#    radiobutton $w.srate1.7 -font $mt_font -bg $bgcolor -text "48000" -variable mfe(rec_prop_srate$track_num) -value "48000"
2041#    radiobutton $w.srate1.8 -font $mt_font -bg $bgcolor -text "96000" -variable mfe(rec_prop_srate$track_num) -value "96000"
2042
2043#	set interl_list {i n}
2044    frame $w.interl
2045    labelframe $w.interl.title -text "Interleaved"
2046#	ttk::combobox $w.interl.title.box -textvariable mfe(rec_prop_interl$track_num) -state readonly -values $interl_list
2047      radiobutton $w.interl.title.box -text "Yes" -variable mfe(rec_prop_interl$track_num) -value "i"
2048      radiobutton $w.interl.title.box1 -text "No" -variable mfe(rec_prop_interl$track_num) -value "n"
2049#    frame $w.interleaved
2050#    label $w.interleaved.l  -text "Interleaved:" -justify left
2051#    frame $w.interleaved1 -bg $bgcolor
2052#    radiobutton $w.interleaved1.1 -font $mt_font -bg $bgcolor -text "Interleaved      " -variable mfe(rec_prop_interl$track_num) -value "i"
2053#    radiobutton $w.interleaved1.2 -font $mt_font -bg $bgcolor -text "Non Interleaved" -variable mfe(rec_prop_interl$track_num) -value "n"
2054
2055    pack $w.text -side top
2056
2057    pack $w.bits.title.box
2058    pack $w.bits.title
2059    pack $w.bits -padx 3 -pady 3
2060#    pack $w.bits.l -expand yes -fill x -side top
2061#    pack $w.bits -expand yes -fill x -side top
2062#    pack $w.bitsa.1
2063#    grid $w.bitsb.2 $w.bitsb.3
2064#    grid $w.bitsc.4 $w.bitsc.5
2065#    grid $w.bitsd.6 $w.bitsd.7
2066#    grid $w.bitse.8 $w.bitse.9
2067#    pack $w.bitsa
2068#    pack $w.bitsb
2069#    pack $w.bitsc
2070#    pack $w.bitsd
2071#    pack $w.bitse
2072    if {$mixdown!=1} {
2073	pack $w.channels.title.box
2074	pack $w.channels.title
2075	pack $w.channels -padx 3 -pady 3
2076#	pack $w.channels.l -expand yes -fill x -side top
2077#	pack $w.channels -expand yes -fill x -side top
2078#	grid $w.channels1.1 $w.channels1.2 $w.channels1.3 $w.channels1.4 $w.channels1.5 $w.channels1.6 $w.channels1.7 $w.channels1.8 -sticky ewns
2079#	grid $w.channels2.9 $w.channels2.10 $w.channels2.11 $w.channels2.12 $w.channels2.13 $w.channels2.14 $w.channels2.15 $w.channels2.16 -sticky ewns
2080#	pack $w.channels1
2081#	pack $w.channels2
2082    }
2083
2084    pack $w.srate.title.box
2085    pack $w.srate.title
2086    pack $w.srate -padx 3 -pady 3
2087
2088#    pack $w.srate.l -expand yes -fill x -side top
2089#    pack $w.srate -expand yes -fill x -side top
2090#    grid $w.srate1.1 $w.srate1.2 $w.srate1.3 $w.srate1.4 $w.srate1.5 $w.srate1.6 $w.srate1.7 $w.srate1.8 -sticky ewns
2091#    pack $w.srate1
2092    #pack $w.interl.title.box
2093    #pack $w.interl.title.box1
2094    grid $w.interl.title.box $w.interl.title.box1
2095    pack $w.interl.title
2096    pack $w.interl -padx 3 -pady 3
2097#    pack $w.interleaved.l -expand yes -fill x -side top
2098#    pack $w.interleaved -expand yes -fill x -side top
2099#    grid $w.interleaved1.1 $w.interleaved1.2 -sticky ewns
2100#    pack $w.interleaved1
2101
2102    if {$mixdown != 1} {
2103    	button $w.close -text "Close" -command {if {$mixdown != 0} {destroy .rec_properties} else {destroy .rec_properties$track_num}}
2104	pack $w.close -expand yes -fill x -side top
2105	set mfe(rec_prop_bits$track_num) $current_track_bits
2106	set mfe(rec_prop_channels$track_num) $current_track_chn
2107	set mfe(rec_prop_srate$track_num) $current_track_srate
2108	set mfe(rec_prop_interl$track_num) $current_track_interl
2109
2110    } else {
2111
2112	frame $w.pr_time
2113	labelframe $w.pr_time.l -text "Processing Time:"
2114
2115	#frame $w.pr_time.l
2116	label $w.pr_time.l.1 -text "Start Position: "
2117	entry $w.pr_time.l.2 -bg White -justify right -width 3 -textvariable mfe(mixdown_begin_min)
2118	label $w.pr_time.l.3 -text :
2119	entry $w.pr_time.l.4 -bg White -justify right -width 5 -textvariable mfe(mixdown_begin_sec)
2120
2121	label $w.pr_time.l.5 -text "End Position: "
2122	entry $w.pr_time.l.6 -bg White -justify right -width 3 -textvariable mfe(mixdown_end_min)
2123	label $w.pr_time.l.7 -text :
2124	entry $w.pr_time.l.8 -bg White -justify right -width 5 -textvariable mfe(mixdown_end_sec)
2125
2126	#grid $w.pr_time.l
2127	grid $w.pr_time.l.1 $w.pr_time.l.2 $w.pr_time.l.3 $w.pr_time.l.4
2128	grid $w.pr_time.l.5 $w.pr_time.l.6 $w.pr_time.l.7 $w.pr_time.l.8
2129	pack $w.pr_time.l
2130	pack $w.pr_time
2131
2132	set disabled {Disabled "not available"}
2133	set normalize_list {Yes No}
2134	set normalize_amp_list {-12dBFS -11dBFS -10dBFS -9dBFS -8dBFS -7dBFS -6dBFS -5dBFS -4dBFS -3dBFS -2dBFS -1dBFS 0dBFS}
2135	set normalize_lev_list {-6dBFS -5dBFS -4dBFS -3dBFS -2dBFS -1dBFS 0dBFS}
2136	frame $w.normalize
2137	labelframe $w.normalize.title -text "Normalize: "
2138	radiobutton $w.normalize.title.1 -text "Yes" -variable mfe(mixdown_normalize) -value "Yes" -command {
2139	    .rec_propertiesMD.normalize_amp.title.box configure -state readonly -textvariable mfe(mixdown_normalize_amp)
2140	    .rec_propertiesMD.normalize_lev.title.box configure -state readonly -textvariable mfe(mixdown_normalize_lev)
2141	}
2142	radiobutton $w.normalize.title.2 -text "No" -variable mfe(mixdown_normalize) -value "No" -command {
2143	    .rec_propertiesMD.normalize_amp.title.box configure -state disabled -textvariable disabled
2144	    .rec_propertiesMD.normalize_lev.title.box configure -state disabled -textvariable disabled
2145	}
2146
2147	#ttk::combobox $w.normalize.title.box -textvariable mfe(mixdown_normalize) -state readonly -values $normalize_list
2148	frame $w.normalize_amp
2149	labelframe $w.normalize_amp.title -text "Amplitude"
2150#	ttk::combobox $w.normalize_amp.title.box -textvariable mfe(mixdown_normalize_amp) -state readonly -values $normalize_amp_list
2151	spinbox $w.normalize_amp.title.box -textvariable mfe(mixdown_normalize_amp) -state readonly -values $normalize_amp_list
2152	frame $w.normalize_lev
2153	labelframe $w.normalize_lev.title -text "Level"
2154#	ttk::combobox $w.normalize_lev.title.box -textvariable mfe(mixdown_normalize_lev) -state readonly -values $normalize_lev_list
2155	spinbox $w.normalize_lev.title.box -textvariable mfe(mixdown_normalize_lev) -state readonly -values $normalize_lev_list
2156#	frame $w.normalize
2157#	label $w.normalize.l  -text "Apply Normalize After Mixdown:" -justify left
2158#	frame $w.normalize1 -bg $bgcolor
2159#	radiobutton $w.normalize1.1 -font $mt_font -bg $bgcolor -text "Yes           " -variable mfe(mixdown_normalize) -value "Yes"
2160#	radiobutton $w.normalize1.2 -font $mt_font -bg $bgcolor -text "No" -variable mfe(mixdown_normalize) -value "No"
2161#	pack $w.normalize.l
2162#	pack $w.normalize -expand yes -fill x -side top
2163#	grid $w.normalize1.1 $w.normalize1.2 -sticky ewns
2164#	pack $w.normalize1
2165	#pack $w.normalize.title.box
2166	grid $w.normalize.title.1 $w.normalize.title.2
2167	#pack $w.normalize.title.1
2168	#pack $w.normalize.title.2
2169	pack $w.normalize.title
2170	pack $w.normalize -padx 3 -pady 3
2171	pack $w.normalize_amp.title.box
2172	pack $w.normalize_amp.title
2173	pack $w.normalize_amp -padx 3 -pady 3
2174	pack $w.normalize_lev.title.box
2175	pack $w.normalize_lev.title
2176	pack $w.normalize_lev -padx 3 -pady 3
2177
2178#	frame $w.buttons
2179	set mixdown 5
2180	if {$mfe(mixdown_normalize)=="Yes"} {
2181	    .rec_propertiesMD.normalize_amp.title.box configure -state readonly -textvariable mfe(mixdown_normalize_amp)
2182	    .rec_propertiesMD.normalize_lev.title.box configure -state readonly -textvariable mfe(mixdown_normalize_lev)
2183	} else {
2184	    .rec_propertiesMD.normalize_amp.title.box configure -state disabled -textvariable disabled
2185	    .rec_propertiesMD.normalize_lev.title.box configure -state disabled -textvariable disabled
2186	}
2187
2188	button $w.close -justify right -text "Ok" -command {
2189    	    set mixdown 1
2190    	    destroy .rec_propertiesMD
2191    	}
2192    	button $w.close2 -justify right -text "Cancel" -command {
2193    	    set mixdown 5
2194    	    destroy .rec_propertiesMD
2195    	    return
2196    	}
2197#	    file_browser2
2198#	    set mixdown 4
2199#	    .mfe.up1.button configure -state disabled
2200#	    .mfe.up2.mixdown configure -state disabled
2201#	    .mfe.up2.addtrack configure -state disabled
2202#	    .mfe.up2.del_all_tracks configure -state disabled
2203#	    .mfe.up2.quit configure -state disabled
2204#	    .mfe.low.multich2 configure -state disabled
2205#	    .mfe.low.play configure -state disabled
2206#	    .mfe.low.master configure -state disabled
2207#	    .mfe.low.loc configure -state disabled
2208#	    .mfe.low.rew_to_begin configure -state disabled
2209#	    .mfe.low.rew_5 configure -state disabled
2210#	    .mfe.low.forw_5 configure -state disabled
2211#	    mixdown"
2212	#grid $w.buttons.close $w.buttons.close2 -sticky ewns
2213	pack $w.close -side left -expand yes -fill x -padx 2 -pady 2
2214	pack $w.close2 -side left -expand yes -fill x -padx 2 -pady 2
2215	set mfe(rec_prop_bitsMD) $current_track_bits
2216	set mfe(rec_prop_channelsMD) $current_track_chn
2217	set mfe(rec_prop_srateMD) $current_track_srate
2218	set mfe(rec_prop_interlMD) $current_track_interl
2219	set mfe(mixdown_begin_min) $mixdown_begin_min
2220	set mfe(mixdown_begin_sec) $mixdown_begin_sec
2221	set mfe(mixdown_end_min) $mixdown_end_min
2222	set mfe(mixdown_end_sec) $mixdown_end_sec
2223	set mfe(mixdown_normalize) $mixdown_normalize
2224	set mfe(mixdown_normalize_amp) $mixdown_normalize_amp
2225	set mfe(mixdown_normalize_lev) $mixdown_normalize_lev
2226    }
2227}
2228
2229proc ladspa_loading_window {} {
2230    if {[winfo exists .ladspa_loading] != 0} {
2231        destroy .ladspa_loading
2232	.mfe.up1.button configure -state normal
2233	.mfe.up2.options configure -state normal
2234	.mfe.up2.colors configure -state normal
2235	.mfe.up2.time_format configure -state normal
2236	.mfe.up2.metronome configure -state normal
2237	.mfe.up2.addtrack configure -state normal
2238	.mfe.up2.del_all_tracks configure -state normal
2239	.mfe.up2.quit configure -state normal
2240	.mfe.up2.about configure -state normal
2241	.mfe.low.multich2 configure -state normal
2242	.mfe.low.latcomp configure -state normal
2243	.mfe.low.loc configure -state normal
2244	.mfe.low.master configure -state normal
2245	.mfe.low.play configure -state normal
2246	.mfe.low.rew_to_begin configure -state normal
2247	.mfe.low.rew_5 configure -state normal
2248	.mfe.low.forw_5 configure -state normal
2249    } else {
2250        toplevel .ladspa_loading
2251	message .ladspa_loading.out -width 350 -text "Please wait!\nTkeca is loading LADSPA plug-ins"
2252	pack .ladspa_loading.out -expand y -fill x
2253	wm title .ladspa_loading "LADSPA"
2254	tkwait visibility .ladspa_loading
2255	tkwait visibility .ladspa_loading.out
2256    }
2257}
2258
2259proc time_format {} {
2260    global time_format bgcolor sp_minutes sp_seconds sp_seconds_loc sp_minutes_loc mfe
2261    set loc_number 1
2262    if {[winfo exists .locate] != 0} {
2263      destroy .locate
2264      set locate_present 1
2265    } else {
2266      set locate_present 0
2267    }
2268    if {$time_format=="Minutes"} {
2269	set time_format "Seconds"
2270	set sp_seconds [expr $sp_seconds+$sp_minutes*60]
2271	set sp_minutes 0
2272	set mfe(punch_in_seconds) [expr $mfe(punch_in_minutes)*60+$mfe(punch_in_seconds)]
2273	set mfe(punch_in_minutes) 0
2274	set mfe(punch_out_seconds) [expr $mfe(punch_out_minutes)*60+$mfe(punch_out_seconds)]
2275	set mfe(punch_out_minutes) 0
2276	.mfe.low.minutes configure -width 0 -text ""
2277	.mfe.low.position2 configure -width 0 -text ""
2278	.mfe.low.seconds configure -width 7 -text $sp_seconds
2279	for {set n 1} {$n <= 16} {incr n} {
2280		set sp_seconds_loc($n) [expr $sp_seconds_loc($n)+$sp_minutes_loc($n)*60]
2281		set sp_minutes_loc($n) 0
2282	}
2283    } else {
2284	set time_format "Minutes"
2285	set sp_minutes [expr $sp_seconds/60]
2286	set sp_minutes [expr int($sp_minutes)]
2287	set sp_seconds [expr $sp_seconds-$sp_minutes*60]
2288	set mfe(punch_in_minutes) [expr $mfe(punch_in_seconds)/60]
2289	set mfe(punch_in_minutes) [expr int($mfe(punch_in_seconds))]
2290	set mfe(punch_in_seconds) [expr $mfe(punch_in_seconds)-$mfe(punch_in_minutes)*60]
2291	.mfe.low.minutes configure -width 3 -text $sp_minutes
2292	.mfe.low.position2 configure -text :
2293	.mfe.low.seconds configure -width 5 -text $sp_seconds
2294	for {set n 1} {$n <= 16} {incr n} {
2295	  set sp_minutes_loc($n) [expr $sp_seconds_loc($n)/60]
2296	  set sp_minutes_loc($n) [expr int($sp_minutes_loc($n))]
2297	  set sp_seconds_loc($n) [expr $sp_seconds_loc($n)-$sp_minutes_loc($n)*60]
2298	}
2299    }
2300    if {$locate_present==1} {locate}
2301}
2302
2303proc wave_file_ext {} {
2304global mfe wf_ext n
2305    if {[string match *.wav $mfe(file$n)]==1} {set wf_ext ".wav"}
2306    if {[string match *.mp2 $mfe(file$n)]==1} {set wf_ext ".mp2"}
2307    if {[string match *.mp3 $mfe(file$n)]==1} {set wf_ext ".mp3"}
2308    if {[string match *.raw $mfe(file$n)]==1} {set wf_ext ".raw"}
2309    if {[string match *.au $mfe(file$n)]==1} {set wf_ext ".au"}
2310    if {[string match *.aif $mfe(file$n)]==1} {set wf_ext ".aif"}
2311    if {[string match *.aiff $mfe(file$n)]==1} {set wf_ext ".aiff"}
2312    if {[string match *.aifc $mfe(file$n)]==1} {set wf_ext ".aifc"}
2313    if {[string match *.snd $mfe(file$n)]==1} {set wf_ext ".snd"}
2314    if {[string match *.mid $mfe(file$n)]==1} {set wf_ext ".mid"}
2315    if {[string match *.midi $mfe(file$n)]==1} {set wf_ext ".midi"}
2316    if {[string match *.mod $mfe(file$n)]==1} {set wf_ext ".mod"}
2317}
2318
2319proc play {} {
2320    global mfe number_of_tracks msg stop_command sp_minutes sp_seconds effect_param playhandle mixdown export_ecs eca_string tracks_to_play tracks_to_rec start_time start_time2 sp_seconds2 punch wf_ext n punch_y punch_t default_audio_io w w2 solo_tracks preview missed_files
2321    if {$mfe(directory)==""} {set mfe(directory) "."}
2322    set missed_files ""
2323    set eca_string {}
2324    set eca_string_i {}
2325    set eca_string_o {}
2326    set track_count 0
2327    set preview 0
2328    set number_of_devices 0
2329    set number_of_devices_i 0
2330    set device(0) " "
2331    set device(1) " "
2332    set device_i(0) " "
2333    set device_i(1) " "
2334    set added_device 0
2335    set added_device_i 0
2336    set tracks_to_play 0
2337    set tracks_to_rec 0
2338    set mfe(muted_chains) ""
2339    set metronome 0
2340    set punch_sequence ""
2341    set punch 0
2342    set punched 0
2343    set start_time [expr $sp_minutes*60+$sp_seconds]
2344#    messages [format "Iniciando MIXDOWN"]
2345
2346    if {$mfe(punch_in_minutes)!=0 || $mfe(punch_in_seconds)!=0 || $mfe(punch_out_minutes)!=0 || $mfe(punch_out_seconds)!=0} {
2347	set punch 1
2348	set punch_in [expr $mfe(punch_in_minutes)*60+$mfe(punch_in_seconds)]
2349	if {$punch_in<$start_time} {
2350	    set punch_in $start_time
2351	}
2352	set punch_out [expr $mfe(punch_out_minutes)*60+$mfe(punch_out_seconds)]
2353	if {$punch_out<$start_time} {
2354	    set punch 3
2355#	    messages [format "Start Position Time is beyond\nthe Punch Out Position\n\nYou should:\n- Uncheck the REC checkboxes,\n- Change the Start Position or\n- Change the Punch Out position"]
2356#	    return
2357	}
2358	set proc_time [expr $punch_out-$punch_in]
2359	set punch_y "-y:$punch_in"
2360	set punch_t "-t:$proc_time"
2361    }
2362
2363    if {$mfe(track_status0)=="Play" && $mixdown!=1} {
2364	set l 0
2365    } else {
2366	set l 1
2367    }
2368    if {$mixdown!=0} {
2369      if {$mfe(rec_prop_bitsMD)=="Unsigned 8Bit"} {set bitsMD "u8"}
2370      if {$mfe(rec_prop_bitsMD)=="Signed 16Bit Little Endian"} {set bitsMD "s16_le"}
2371      if {$mfe(rec_prop_bitsMD)=="Signed 16Bit Big Endian"} {set bitsMD "s16_be"}
2372      if {$mfe(rec_prop_bitsMD)=="Signed 24Bit Little Endian"} {set bitsMD "s24_le"}
2373      if {$mfe(rec_prop_bitsMD)=="Signed 24Bit Big Endian"} {set bitsMD "s24_be"}
2374      if {$mfe(rec_prop_bitsMD)=="Signed 32Bit Little Endian"} {set bitsMD "s32_le"}
2375      if {$mfe(rec_prop_bitsMD)=="Signed 32Bit Big Endian"} {set bitsMD "s32_be"}
2376      if {$mfe(rec_prop_bitsMD)=="F. Point 32Bit Little Endian"} {set bitsMD "f32_le"}
2377      if {$mfe(rec_prop_bitsMD)=="F. Point 32Bit Big Endian"} {set bitsMD "f32_be"}
2378    }
2379
2380    for {set n $l} {$n <= $number_of_tracks} {incr n} {
2381    if {$mfe(rec_prop_bits$n)=="Unsigned 8Bit"} {set bits "u8"}
2382    if {$mfe(rec_prop_bits$n)=="Signed 16Bit Little Endian"} {set bits "s16_le"}
2383    if {$mfe(rec_prop_bits$n)=="Signed 16Bit Big Endian"} {set bits "s16_be"}
2384    if {$mfe(rec_prop_bits$n)=="Signed 24Bit Little Endian"} {set bits "s24_le"}
2385    if {$mfe(rec_prop_bits$n)=="Signed 24Bit Big Endian"} {set bits "s24_be"}
2386    if {$mfe(rec_prop_bits$n)=="Signed 32Bit Little Endian"} {set bits "s32_le"}
2387    if {$mfe(rec_prop_bits$n)=="Signed 32Bit Big Endian"} {set bits "s32_be"}
2388    if {$mfe(rec_prop_bits$n)=="F. Point 32Bit Little Endian"} {set bits "f32_le"}
2389    if {$mfe(rec_prop_bits$n)=="F. Point 32Bit Big Endian"} {set bits "f32_be"}
2390    if {[file exists $mfe(file$n)] != 1 && $mfe(track_rec_status$n) == "No" && $mfe(file$n)!="null" && $mfe(track_status$n)!="Deleted"} {
2391	    set missed_files "$missed_files$mfe(file$n)\n"
2392	    incr n
2393    } else {
2394    if {$mixdown == 1 || $export_ecs == 1} {
2395	set skip_muted_tracks "Yes"
2396    } else {
2397	.mfe.up1.button configure -state disabled
2398	.mfe.up2.mixdown configure -state disabled
2399#	.mfe.up2.metronome configure -state disabled
2400	.mfe.up2.addtrack configure -state disabled
2401	.mfe.up2.del_all_tracks configure -state disabled
2402	.mfe.up2.quit configure -state disabled
2403	.mfe.low.multich2 configure -state disabled
2404#	.mfe.low.rew_to_begin configure -state disabled
2405#	.mfe.low.rew_5 configure -state disabled
2406#	.mfe.low.forw_5 configure -state disabled
2407#	set mfe(directory) "$w.rec$n"
2408	if {$n!=0 && $mfe(track_status$n)!="Deleted"} {
2409    	    $w2.track$n.rec configure -state disabled
2410	    $w2.track$n.delete configure -state disabled
2411	    $w2.track$n.file configure -state disabled
2412	    $w2.track$n.open configure -state disabled
2413	    $w2.track$n.track_properties configure -state disabled
2414	    $w2.track$n.dev_text configure -state disabled
2415	    $w2.track$n.dev_entry configure -state disabled
2416	    $w2.track$n.chn_text configure -state disabled
2417	    $w2.track$n.chn_entry configure -state disabled
2418	    $w2.track$n.eca_tools configure -state disabled
2419
2420	    set skip_muted_tracks "No"
2421#	    set quote "'"
2422#	    set mfe(file_quoted$n) "$quote$mfe(file$n)$quote"
2423	}
2424    }
2425
2426    if {$mfe(track_status$n)!="Mute" || $skip_muted_tracks!="Yes"} {
2427	set mfe(volume_position$n) 1
2428	set mfe(pan_position$n) 2
2429	if {$punch==3 && $mfe(track_rec_status$n)=="Yes"} {
2430	    set mfe(track_rec_status$n) "No"
2431	    set punch 4
2432	}
2433	if {$mfe(track_status$n)=="Mute" && $mfe(track_rec_status$n)=="No"} {
2434	    if {$mfe(muted_chains)!=""} {
2435		set mfe(muted_chains) "$mfe(muted_chains),$n"
2436	    } else {
2437		set mfe(muted_chains) $n
2438	    }
2439	}
2440#[string length $mfe(file$n)] > 3
2441	    if {$mfe(track_status$n)!="Deleted" && $mfe(file$n)!="(Wave File)"} {
2442
2443		if {$mfe(track_rec_status$n)=="No"} {
2444		    if {$punched==1} {
2445			set mfe(track_rec_status$n) "Yes"
2446			set punched 0
2447		    }
2448#		    set mfe(file$n) "[list $mfe(file$n)]"
2449#		    set eca_string "$eca_string-a:$n -i:\"$mfe(file$n)\""
2450#		    set eca_string "$eca_string-a:$n -i:'$mfe(file$n)'"
2451# este es el que funciona
2452#		    set eca_string "$eca_string-a:$n -i:[list $mfe(file$n)]"
2453
2454		    if {$export_ecs == 1} {
2455			if {$n > 1} {
2456			    lappend eca_string "\n-a:$n"
2457#			    set eca_string "$eca_string\n-a:$n "
2458			} else {
2459			    lappend eca_string "-a:$n"
2460#			    set eca_string "$eca_string-a:$n "
2461			}
2462		    	lappend eca_string "-i:\"$mfe(file$n)\""
2463#			set eca_string "$eca_string-i:$mfe(file_quoted$n)"
2464		    } else {
2465    			lappend eca_string "-a:$n"
2466#			set eca_string "$eca_string-a:$n "
2467			lappend eca_string "-i:$mfe(file$n)"
2468#			set eca_string "$eca_string-i:$mfe(file_quoted$n) "
2469		    }
2470		    if {$mfe(rec_prop_channels$n)==1} {
2471			if {$mfe(chn$n)!= "n/a" && $mfe(multichannel)==1} {
2472			    lappend eca_string "-erc:1,$mfe(chn$n)"
2473#			    set eca_string "$eca_string-erc:1,$mfe(chn$n) "
2474			} else {
2475		    	    lappend eca_string "-erc:1,2"
2476#			    set eca_string "$eca_string-erc:1,2 "
2477			}
2478
2479			set mfe(volume_position$n) 2
2480			set mfe(pan_position$n) 3
2481		    }
2482		    lappend eca_string "-ea:[expr $mfe(volume$n)*$mfe(master)/100]"
2483#		    set eca_string "$eca_string-ea:[expr $mfe(volume$n)*$mfe(master)/100]"
2484		    lappend eca_string "-epp:$mfe(pan$n)"
2485#		    set eca_string "$eca_string-epp:$mfe(pan$n) "
2486		    set tracks_to_play 1
2487		    if {$mixdown!=1} {
2488			if {$mfe(device$n)=="Default" || $mfe(device$n)=="(I / O Dev.)"} {
2489			    set current_audio_output $default_audio_io
2490			} else {
2491    			    set current_audio_output $mfe(device$n)
2492			}
2493			for {set nd 0} {$nd <= $number_of_devices} {incr nd} {
2494			    if {$device($nd)==$current_audio_output} {
2495				set device_chains($nd) "$device_chains($nd),$n"
2496				set added_device 1
2497			    }
2498			}
2499			if {$added_device==0} {
2500			    incr number_of_devices
2501			    set device_chains($number_of_devices) "$n"
2502			    set device($nd) $current_audio_output
2503
2504			} else {
2505			    set added_device 0
2506			}
2507		    }
2508		    set mfe(number_of_effects$n) 0
2509		    set effect_list ""
2510		    for {set en 1} {$en <= 8} {incr en} {
2511			if {$mfe(effect$en$n) != "None" && $mfe(effect_attached$en$n) == "Connected"} {
2512			    incr mfe(number_of_effects$n)
2513			    set mfe(effect_position$en$n) [expr $mfe(pan_position$n)+$mfe(number_of_effects$n)]
2514			    if {[string match ladspa* $mfe(effect$en$n)]==1} {
2515				regsub ladspa_ $mfe(effect$en$n) {} current_effect
2516				set effect_list "$effect_list-el:$current_effect,"
2517			    } elseif {[string match pn:* $mfe(effect$en$n)]==1} {
2518				set effect_list "$effect_list-$mfe(effect$en$n),"
2519			    } else {
2520				set effect_list "$effect_list-$mfe(effect$en$n):"
2521			    }
2522			    for {set par 1} {$par <= $effect_param($mfe(effect$en$n)) } {incr par} {
2523				if {$par>1} {set effect_list "$effect_list,"}
2524				set effect_list "$effect_list$mfe(effect_parameter$par$en$n)"
2525			    }
2526			    lappend eca_string "$effect_list"
2527#			    set eca_string "$eca_string$effect_list "
2528			    set effect_list ""
2529			}
2530		    }
2531#		    set eca_string "$eca_string $punch_sequence"
2532		    if {$mixdown == 1} {
2533			if {$mfe(mixdown_begin_min)!=0 || $mfe(mixdown_begin_sec)!=0 || $mfe(mixdown_end_min)!=0 || $mfe(mixdown_end_sec)!=0} {
2534			    set mixdown_start [expr $mfe(mixdown_begin_sec)+($mfe(mixdown_begin_min)*60)]
2535			    set mixdown_end [expr $mfe(mixdown_end_sec)+($mfe(mixdown_end_min)*60)]
2536			    set mixdown_proc_time [expr $mixdown_end-$mixdown_start]
2537			    lappend eca_string "-y:$mixdown_start"
2538#			    set eca_string "$eca_string-y:$mixdown_start "
2539			    if {$mixdown_proc_time>0} {
2540				lappend eca_string "-t:$mixdown_proc_time"
2541#				set eca_string "$eca_string-t:$mixdown_proc_time "
2542			    }
2543			}
2544#		    lappebd eca_string "\\"
2545		    }
2546#		    lappend eca_string "\n"
2547		} else {
2548		    set tracks_to_rec 1
2549		    if {$punch==0} {
2550			for {set nd 0} {$nd <= $number_of_devices_i} {incr nd} {
2551			    if {$mfe(device$n)=="Default" || $mfe(device$n)=="(I / O Dev.)"} {
2552				set current_audio_input $default_audio_io
2553			    } else {
2554				set current_audio_input $mfe(device$n)
2555			    }
2556			    if {$device_i($nd)==$current_audio_input} {
2557			        set device_chains_i($nd) "$device_chains_i($nd),$n"
2558			        set added_device_i 1
2559			    }
2560			}
2561			if {$added_device_i==0} {
2562		    	    incr number_of_devices_i
2563		    	    set device_chains_i($number_of_devices_i) "$n"
2564			    set device_i($nd) $current_audio_input
2565		        } else {
2566		    	    set added_device_i 0
2567			}
2568#			set eca_string "$eca_string-a:$n"
2569			if {$mfe(multichannel)==1} {
2570			    if {$export_ecs == 1 && $n > 1} {
2571				lappend eca_string_o "\n-a:$n"
2572#				set eca_string_o "$eca_string_o\n-a:$n "
2573			    } else {
2574			    	lappend eca_string_o "-a:$n"
2575#				set eca_string_o "$eca_string_o-a:$n "
2576			    }
2577			    lappend eca_string_o "-f:$bits,1ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n)"
2578#			    set eca_string_o "$eca_string_o-f:$mfe(rec_prop_bits$n),1ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n) "
2579			    lappend eca_string_o "-erc:$mfe(chn$n),1"
2580			    lappend eca_string_o "-o:$mfe(file$n)"
2581#			    set eca_string_o "$eca_string_o-erc:$mfe(chn$n),1 -o:$mfe(file$n) "
2582			} else {
2583			    set mfe(rec_prop_channels$n) 2
2584			    if {$export_ecs == 1 && $n > 1} {
2585				lappend eca_string_o "\n-a:$n"
2586#				set eca_string_o "$eca_string_o\n-a:$n "
2587			    } else {
2588			    	lappend eca_string_o "-a:$n"
2589#			    	set eca_string_o "$eca_string_o-a:$n "
2590			    }
2591			    lappend eca_string_o "-f:$bits,$mfe(rec_prop_channels$n)ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n)"
2592			    lappend eca_string_o "-o:$mfe(file$n)"
2593#			    set eca_string_o "$eca_string_o-f:$mfe(rec_prop_bits$n),$mfe(rec_prop_channels$n)ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n) -o:$mfe(file$n) "
2594			}
2595#		    lappend eca_string_o "\n"
2596		    } else {
2597			set punch 2
2598			for {set nd 0} {$nd <= $number_of_devices_i} {incr nd} {
2599			    if {$mfe(device$n)=="Default" || $mfe(device$n)=="(I / O Dev.)"} {
2600				set current_audio_input $default_audio_io
2601			    } else {
2602				set current_audio_input $mfe(device$n)
2603			    }
2604			    if {$device_i($nd)==$current_audio_input} {
2605			        set device_chains_i($nd) "$device_chains_i($nd),temp-$n"
2606				set added_device_i 1
2607			    }
2608			}
2609
2610			if {$added_device_i==0} {
2611		    	    incr number_of_devices_i
2612		    	    set device_chains_i($number_of_devices_i) "temp-$n"
2613			    set device_i($nd) $current_audio_input
2614		        } else {
2615		    	    set added_device_i 0
2616			}
2617#			lappend eca_string_o "-a:temp-$n"
2618			wave_file_ext
2619			set mfe(temp_file$n) "temp-$n$wf_ext"
2620			if {$mfe(multichannel)==1} {
2621			    lappend eca_string_o "-f:$bits,1ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n)"
2622#			    set eca_string_o "$eca_string_o-f:$mfe(rec_prop_bits$n),1ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n) "
2623			    lappend eca_string_o "-erc:$mfe(chn$n),1"
2624#			    set eca_string_o "$eca_string_o-erc:$mfe(chn$n),1 "
2625			    lappend eca_string_o "-o:$mfe(temp_file$n)"
2626#			    set eca_string_o "$eca_string_o-o:$mfe(temp_file$n) "
2627			} else {
2628			    set mfe(rec_prop_channels$n) 2
2629			    lappend eca_string_o "-f:$bits,$mfe(rec_prop_channels$n)ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n)"
2630#			    set eca_string_o "$eca_string_o-f:$mfe(rec_prop_bits$n),$mfe(rec_prop_channels$n)ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n) "
2631			    lappend eca_string_o "-o:$mfe(temp_file$n)"
2632#			    set eca_string_o "$eca_string_o-o:$mfe(temp_file$n)"
2633			}
2634			set punched 1
2635			set mfe(track_rec_status$n) "No"
2636			set n [expr $n-1]
2637#			lappend eca_string_o "\n"
2638		    }
2639		}
2640
2641
2642	}
2643	if {$punch==4} {
2644	    set mfe(track_rec_status$n) "Yes"
2645	    set punch 3
2646	}
2647
2648    }
2649    }
2650    }
2651
2652    if {$tracks_to_play == 1} {
2653	for {set n 1} {$n <= $number_of_devices} {incr n} {
2654	    if {$export_ecs == 1} {
2655		lappend eca_string_o "\n-a:$device_chains($n)"
2656#		set eca_string_o "$eca_string_o\n-a:$device_chains($n) "
2657	    } else {
2658	    	lappend eca_string_o "-a:$device_chains($n)"
2659#	    	set eca_string_o "$eca_string_o-a:$device_chains($n) "
2660	    }
2661	    lappend eca_string_o "-o:$device($n)"
2662#	    set eca_string_o "$eca_string_o-o:$device($n) "
2663	}
2664    }
2665
2666    if {$mixdown == 1} {
2667	set normalize ""
2668	set exec_out1 ""
2669	set exec_out3 ""
2670	lappend eca_string "-a:all"
2671#	set eca_string "$eca_string-a:all "
2672	lappend eca_string "-f:$bitsMD,$mfe(rec_prop_channelsMD)ch,$mfe(rec_prop_srateMD),$mfe(rec_prop_interlMD)"
2673#	set eca_string "$eca_string-f:$mfe(rec_prop_bitsMD),$mfe(rec_prop_channelsMD)ch,$mfe(rec_prop_srateMD),$mfe(rec_prop_interlMD) "
2674	lappend eca_string "-o:$mfe(openfileMD)"
2675#	set eca_string "$eca_string-o:$mfe(openfileMD) "
2676
2677
2678	if {$mfe(mixdown_normalize)=="Yes"} {
2679	    set normalize "ecanormalize $mfe(openfileMD) -a $mfe(mixdown_normalize_amp) -l $mfe(mixdown_normalize_lev)"
2680	}
2681	set mixdown 0
2682	set cmd1 "exec ecasound $eca_string"
2683	catch {eval $cmd1} exec_out1
2684	puts $eca_string
2685	if {$mfe(mixdown_normalize)=="Yes"} {
2686	    set cmd3 "exec $normalize"
2687	    catch {eval $cmd3} exec_out3
2688	}
2689#	set mixdown_out [open "mixdown.txt" w]
2690#	puts $mixdown_out "eca_string: $eca_string"
2691#	puts $mixdown_out "$exec_out1"
2692#	puts $mixdown_out "normalize: $normalize"
2693#	puts $mixdown_out "$exec_out3"
2694#	close $mixdown_out
2695
2696	messages [format "MIXDOWN done"]
2697	destroy .rec_propertiesMD
2698	tkwait visibility .msg
2699	tkwait window .msg
2700
2701	.mfe.up1.button configure -state normal
2702	.mfe.up2.options configure -state normal
2703	.mfe.up1.save configure -state normal
2704	.mfe.up1.saveas configure -state normal
2705	.mfe.up2.time_format configure -state normal
2706	.mfe.up2.metronome configure -state normal
2707	.mfe.up2.exportecs configure -state normal
2708	.mfe.up2.mixdown configure -state normal
2709	.mfe.up2.addtrack configure -state normal
2710	.mfe.up2.del_all_tracks configure -state normal
2711	.mfe.up2.quit configure -state normal
2712	.mfe.up2.about configure -state normal
2713	.mfe.low.multich2 configure -state normal
2714	.mfe.low.latcomp configure -state normal
2715	.mfe.low.loc configure -state normal
2716	.mfe.low.master configure -state normal
2717	.mfe.low.play configure -state normal
2718#	.mfe.low.rew_to_begin configure -state normal
2719#	.mfe.low.rew_5 configure -state normal
2720#	.mfe.low.forw_5 configure -state normal
2721	return
2722    }
2723    if {$tracks_to_rec == 1} {
2724        for {set n 1} {$n <= $number_of_devices_i} {incr n} {
2725	lappend eca_string_i "-a:$device_chains_i($n)"
2726#	set eca_string_i "$eca_string_i-a:$device_chains_i($n) "
2727	lappend eca_string_i "-i:$device_i($n)"
2728#	set eca_string_i "$eca_string_i-i:$device_i($n)\n"
2729	}
2730    }
2731    set eca_string "$eca_string_i $eca_string $eca_string_o"
2732    if {$mfe(multichannel)==1} {
2733        set eca_string "[list -f:$bits,$mfe(rec_prop_channels)ch,$mfe(rec_prop_srate),$mfe(rec_prop_interl)] $eca_string"
2734#	set eca_string "-f:$mfe(rec_prop_bits),$mfe(rec_prop_channels)ch,$mfe(rec_prop_srate),$mfe(rec_prop_interl)] $eca_string"
2735    }
2736
2737    puts "Ecasound Chainsetup:\n$eca_string"
2738    puts "--------------------\n"
2739
2740    if {$export_ecs == 1} {
2741	.mfe.up1.button configure -state normal
2742	.mfe.up2.mixdown configure -state normal
2743#	.mfe.up2.metronome configure -state normal
2744	.mfe.up2.addtrack configure -state normal
2745	.mfe.up2.del_all_tracks configure -state normal
2746	.mfe.up2.quit configure -state normal
2747	.mfe.low.multich2 configure -state normal
2748#	.mfe.low.rew_to_begin configure -state normal
2749#	.mfe.low.rew_5 configure -state normal
2750#	.mfe.low.forw_5 configure -state normal
2751	regsub -all {\{} $eca_string {} eca_string
2752	regsub -all {\}} $eca_string {} eca_string
2753#	regsub -all {(\-a)} $eca_string {\\n} eca_string
2754	return
2755    }
2756    if {$punch==2} {
2757        for {set n 1} {$n <= $number_of_tracks} {incr n} {
2758	    if {$mfe(track_rec_status$n)=="Yes"} {
2759		wave_file_ext
2760		set mfe(temp_file2$n) "temp2-$n$wf_ext"
2761		set cmd "exec ecasound [list -i:$mfe(file$n) $punch_y $punch_t -o:$mfe(temp_file2$n) $punch_t ]"
2762#		set cmd "exec ecasound -i:$mfe(file_quoted$n) $punch_y $punch_t -o:$mfe(temp_file2$n) $punch_t"
2763		catch {eval $cmd} exec_out
2764		set cmd2 "exec ecasound [list -i:$mfe(file$n) $punch_y $punch_t -ea:0 -o:$mfe(file$n) $punch_y $punch_t ]"
2765#		set cmd2 "exec ecasound -i:$mfe(file_quoted$n) $punch_y $punch_t -ea:0 -o:$mfe(file_quoted$n) $punch_y $punch_t "
2766		catch {eval $cmd2} exec_out
2767	    }
2768	}
2769    }
2770
2771#    if {$mfe(metronome_enable)=="Yes"} {
2772#	set eca_string "$eca_string -a:metronome -i:null -o:$mfe(metronome_device) -pn:metronome,$mfe(metronome_beat)"
2773#    }
2774
2775
2776    set tkeca_log [open "~/tkeca.log" w]
2777	puts $tkeca_log "eca_string: $eca_string"
2778	puts $tkeca_log "eca_string_i: $eca_string_i"
2779	puts $tkeca_log "eca_string_o: $eca_string_o"
2780	puts $tkeca_log "tracks_to_rec:$tracks_to_rec"
2781    close $tkeca_log
2782    puts "eca_string: $eca_string"
2783    set playhandle [open "|ecasound -c $eca_string" w]
2784    puts "playhandle: $playhandle"
2785    puts "Ecasound Interactive Mode Commands:\n"
2786    puts "-----------------------------------\n"
2787    fconfigure $playhandle -buffering line -buffersize 8000 -blocking 0
2788    if {$mfe(muted_chains)!=""} {
2789	puts $playhandle "c-select $mfe(muted_chains)\n"
2790	puts "c-select $mfe(muted_chains)\n"
2791	puts $playhandle "c-muting\n"
2792	puts "c-muting\n"
2793    }
2794    puts $playhandle "setpos $start_time\n"
2795    puts "setpos $start_time\n"
2796    puts $playhandle "t\n"
2797    puts "t\n"
2798#remover esta linea despues
2799    set start_time2 [clock clicks -milliseconds]
2800    set sp_seconds2 $sp_seconds
2801    tick
2802    if {$tracks_to_play == 0 && $tracks_to_rec == 0} {
2803#	set stop_command 1
2804	if {$missed_files != ""} {
2805	messages [format "No tracks to be played or recorded\nFile(s):\n$missed_files\nWas(Were) not found."]
2806	} else {
2807	messages [format "No tracks to be played or recorded"]
2808	}
2809	stop
2810    }
2811	if {$missed_files != ""} {
2812	messages [format "File(s):\n$missed_files\nWas(Were) not found."]
2813	}
2814}
2815
2816proc preview {} {
2817    global mfe msg stop_command sp_minutes sp_seconds punch effect_param playhandle mixdown eca_string track effect effect2 preview default_audio_io number_of_tracks w play_text
2818    set start_time [expr $sp_minutes*60+$sp_seconds]
2819    set punch 0
2820    set eca_string {}
2821    set n $track
2822    set tracks_to_play 0
2823    set mfe(volume_position$n) 1
2824    set mfe(pan_position$n) 2
2825
2826    if {[string length $mfe(file$n)] > 3 && $mfe(file$n)!="(Wave File)"} {
2827	.mfe.up1.button configure -state disabled
2828	.mfe.up2.mixdown configure -state disabled
2829#	.mfe.up2.metronome configure -state disabled
2830	.mfe.up2.addtrack configure -state disabled
2831	.mfe.up2.del_all_tracks configure -state disabled
2832	.mfe.up2.quit configure -state disabled
2833	.mfe.low.multich2 configure -state disabled
2834#	.mfe.low.rew_to_begin configure -state disabled
2835#	.mfe.low.rew_5 configure -state disabled
2836#	.mfe.low.forw_5 configure -state disabled
2837	set play_text "stop"
2838	if {$mfe(track_status$n)=="Play"} {
2839	    lappend eca_string "-a:$n"
2840	    lappend eca_string "-i:$mfe(file$n)"
2841
2842		if {$mfe(rec_prop_channels$n)==1} {
2843		    if {$mfe(chn$n)!= "n/a" && $mfe(multichannel)==1} {
2844			lappend eca_string "-erc:1,$mfe(chn$n)"
2845		    } else {
2846		    	lappend eca_string "-erc:1,2"
2847		    }
2848			lappend eca_string "-ea:[expr $mfe(volume$n)*$mfe(master)/100]"
2849			lappend eca_string "-epp:$mfe(pan$n)"
2850			set mfe(volume_position$n) 2
2851			set mfe(pan_position$n) 3
2852		}
2853
2854		set tracks_to_play 1
2855	    }
2856
2857	if {$preview == 2} {
2858	    set mfe(number_of_effects$track) 0
2859	    for {set en 1} {$en <= 8} {incr en} {
2860		set effect_list ""
2861		if {$mfe(effect$en$track) != "None" && $mfe(effect_attached$en$track) != "Bypassed"} {
2862		    set mfe(effect_position$en$track) [expr $mfe(pan_position$track)+$mfe(number_of_effects$track)]
2863		    if {[string match ladspa* $mfe(effect$en$track)]==1} {
2864			regsub ladspa_ $mfe(effect$en$track) {} current_effect
2865			set effect_list "$effect_list-el:$current_effect,"
2866		    } elseif {[string match pn:* $mfe(effect$en$track)]==1} {
2867			set effect_list "$effect_list-$mfe(effect$en$track),"
2868		    } else {
2869		    	set effect_list "$effect_list-$mfe(effect$en$track):"
2870		    }
2871		    for {set par 1} {$par <= $effect_param($mfe(effect$en$track)) } {incr par} {
2872			if {$par>1} {set effect_list "$effect_list,"}
2873			set effect_list "$effect_list$mfe(effect_parameter$par$en$track)"
2874		    }
2875		}
2876	    lappend eca_string "$effect_list"
2877	    }
2878
2879	} else {
2880	    set effect_list ""
2881	    set mfe(effect_position1$track) [expr $mfe(pan_position$track)+1]
2882	    set en $effect2
2883	    if {$mfe(effect$en$track) != "None" && $mfe(effect_attached$en$track) != "Bypassed"} {
2884		if {[string match ladspa* $mfe(effect$en$track)]==1} {
2885			regsub ladspa_ $mfe(effect$en$track) {} current_effect
2886			set effect_list "$effect_list-el:$current_effect,"
2887		} elseif {[string match pn:* $mfe(effect$en$track)]==1} {
2888			set effect_list "$effect_list-$mfe(effect$en$track),"
2889		} else {
2890			set effect_list "$effect_list-$mfe(effect$en$track):"
2891		}
2892		for {set par 1} {$par <= $effect_param($mfe(effect$en$track)) } {incr par} {
2893		    if {$par>1} {set effect_list "$effect_list,"}
2894		    set effect_list "$effect_list$mfe(effect_parameter$par$en$track)"
2895		}
2896	    lappend eca_string "$effect_list"
2897	    }
2898
2899	}
2900    }
2901    if {$tracks_to_play ==1} {
2902	for {set n1 1} {$n1 <= $number_of_tracks} {incr n1} {
2903	    $w.track$n1.rec configure -state disabled
2904	}
2905	if {$mfe(device$track)=="Default" || $mfe(device$track)=="(I / O Dev.)"} {
2906	    lappend eca_string "-a:$n"
2907	    lappend eca_string "-o:$default_audio_io"
2908	} else {
2909	    lappend eca_string "-a:$n"
2910	    lappend eca_string "-o:$mfe(device$track)"
2911	}
2912#	set review_status [open track_view_status.txt2 w]
2913#	puts $review_status $eca_string
2914#	close $review_status
2915	set playhandle [open "|ecasound -c $eca_string" w]
2916	fconfigure $playhandle -buffering none -blocking 0
2917	puts $playhandle "setpos $start_time\n"
2918	puts $playhandle "t\n"
2919    } else {
2920 	set stop_command 1
2921	messages [format "No tracks to be played or recorded"]
2922    }
2923}
2924
2925############################### Main Section #################################################
2926# VARIABLES DESCRIPTION:
2927#	mt_font: Default font
2928#	number_of_tracks: Number of displayed tracks
2929#	track_number: Number of current track
2930#	sp_minutes: Starting position in minutes and;
2931#	sp_seconds: Starting position in seconds
2932# 	mfe(track_nameN): Name of track N
2933#	mfe(openfileN): Name and path of the track N wave file
2934# 	mfe(deviceN): Name and path of the track N audio device
2935# 	mfe(track_statusN): Status of track N (Could be "Play", "Rec" or "Mute")
2936#	mfe(effectnN): Name of effect n on track N
2937#	mfe(effect_parametersnN): Number of parameters of effect n on track N
2938#	mfe(effect_parameterPnN): Value for parameter P of effect n on track N
2939#	mfe(volumeN): volume of track N
2940#	mfe(panN): Left/Right percent
2941#	effect_name(nnn): A more descriptive name of the effect called nnn by ecasound
2942#	effect_param(nnn): Number of parameters of the effect called nnn by ecasound
2943#	effect_param_name(nnnN): Name of parameter N of effect called nnn by ecasound
2944#	effect_param_value(nnnN): Default value for parameter N of effect called nnn by ecasound
2945#	effect_param_from(nnnN): Begin value for parameter N of effect called nnn by ecasound
2946#	effect_param_to(nnnN): Ending value for parameter N of effect called nnn by ecasound
2947#	effect_param_resolution(nnnN): Resolution for parameter N of effect called nnn by ecasound
2948
2949# Variables definition section
2950
2951global mfe exit_yes track_num effect_num effect_param eca_effects ecasoundrc mixdown tracks_to_play tracks_to_rec play_text fw_text rew_text rewbeg_text sp_seconds_loc sp_minutes_loc wave_editor time_format prev_loaded_file default_audio_io solo_tracks effect sp_seconds sp_minutes sp_seconds2 start_time2 bit_list
2952
2953#ttk::setTheme clam
2954tk_setPalette seashell3
2955
2956set bgcolor cyan3
2957
2958frame .mfe
2959frame .mfe.up1 -bd 6
2960frame .mfe.up2 -bd 6
2961#frame .mfe.header -bg $bgcolor
2962frame .mfe.tracks
2963frame .mfe.low -bd 6
2964
2965set row 1
2966set number_of_tracks 0
2967set toprocess " "
2968set solo_tracks 0
2969
2970set mt_font [font create -family Helvetica -size 9 -weight normal]
2971
2972set play_command "play"
2973set mixdown 0
2974set export_ecs 0
2975set stop_position 0
2976set mfe(directory) "."
2977set mfe(multichannel) 0
2978set mfe(rec_prop_bits0) "Signed 16Bit Little Endian"
2979set mfe(rec_prop_channels0) "2"
2980set mfe(rec_prop_srate0)  "44100"
2981set mfe(rec_prop_interl0) "i"
2982set mfe(rec_prop_bits) "Signed 16Bit Little Endian"
2983set mfe(rec_prop_channels) "2"
2984set mfe(rec_prop_srate)  "44100"
2985set mfe(rec_prop_interl) "i"
2986set mfe(rec_prop_bitsMD) "Signed 16Bit Little Endian"
2987set mfe(rec_prop_channelsMD) "2"
2988set mfe(rec_prop_srateMD) "44100"
2989set mfe(rec_prop_interlMD) "i"
2990
2991set mfe(master) 100
2992set mfe(mixdown_begin_min) 0
2993set mfe(mixdown_begin_sec) 0
2994set mfe(mixdown_end_min) 0
2995set mfe(mixdown_end_sec) 0
2996set mfe(mixdown_normalize) "No"
2997
2998set sp_minutes_loc(1) 0
2999set sp_minutes_loc(2) 0
3000set sp_minutes_loc(3) 0
3001set sp_minutes_loc(4) 0
3002set sp_minutes_loc(5) 0
3003set sp_minutes_loc(6) 0
3004set sp_minutes_loc(7) 0
3005set sp_minutes_loc(8) 0
3006set sp_minutes_loc(9) 0
3007set sp_minutes_loc(10) 0
3008set sp_minutes_loc(11) 0
3009set sp_minutes_loc(12) 0
3010set sp_minutes_loc(13) 0
3011set sp_minutes_loc(14) 0
3012set sp_minutes_loc(15) 0
3013set sp_minutes_loc(16) 0
3014
3015set sp_seconds_loc(1) 0
3016set sp_seconds_loc(2) 0
3017set sp_seconds_loc(3) 0
3018set sp_seconds_loc(4) 0
3019set sp_seconds_loc(5) 0
3020set sp_seconds_loc(6) 0
3021set sp_seconds_loc(7) 0
3022set sp_seconds_loc(8) 0
3023set sp_seconds_loc(9) 0
3024set sp_seconds_loc(10) 0
3025set sp_seconds_loc(11) 0
3026set sp_seconds_loc(12) 0
3027set sp_seconds_loc(13) 0
3028set sp_seconds_loc(14) 0
3029set sp_seconds_loc(15) 0
3030set sp_seconds_loc(16) 0
3031set mfe(mixdown_normalize) "No"
3032set mfe(mixdown_normalize_amp) "-12dBFS"
3033set mfe(mixdown_normalize_lev) "-6dBFS"
3034set mfe(punch_in_minutes) 0
3035set mfe(punch_in_seconds) 0
3036set mfe(punch_out_minutes) 0
3037set mfe(punch_out_seconds) 0
3038set mfe(latency) 0
3039set mfe(track_status0) "Mute"
3040set mfe(track_name0) "Metronome"
3041set mfe(volume0) 100
3042set mfe(file0) null
3043set mfe(pan0) 50
3044set mfe(device0) "Default"
3045set mfe(chn0) 2
3046set mfe(track_solo0) "No Solo"
3047set mfe(track_rec_status0) "No"
3048set mfe(effect10) "pn:metronome"
3049set mfe(effect_parameter110) 120
3050set mfe_temp(effect10) "None"
3051set mfe(effect_attached10) "Connected"
3052set mfe(effect_parameters10) 1
3053set n 0
3054for {set en 2} {$en <= 8} {incr en} {
3055    set mfe(effect$en$n) "None"
3056    set mfe_temp(effect$en$n) "None"
3057    set mfe(effect_attached$en$n) "Bypassed"
3058}
3059
3060set mfe(metronome_beat) 100
3061
3062set time_format "Minutes"
3063
3064label .mfe.up1.title -justify left -text "TKECA 4.4.3 - Tcl/Tk Frontend for Ecasound - 2003-2011 Luis Pablo Gasparotto "
3065label .mfe.up1.text -text "Current Directory: "
3066entry .mfe.up1.entry -bg White -textvariable mfe(directory)
3067label .mfe.up1.text2 -text "Current File: "
3068entry .mfe.up1.entry2 -state disabled -textvariable mfe(openfile0)
3069button .mfe.up1.button -text "Open file" -height 0 -command {set n 0
3070set types {{{mfe files} {*.mfe}} {{all} {*}}}
3071set track_num 0
3072set save_as 0
3073set exit_yes 5
3074proc_exit
3075}
3076button .mfe.up1.save -text "Save file" -height 0 -command {
3077set save_as 0
3078save_file}
3079button .mfe.up1.saveas -text "Save file as" -height 0 -command {
3080set types {{{mfe files} {*.mfe}} {{all} {*}}}
3081set track_num 0
3082file_browser2
3083save_file}
3084button .mfe.up2.exportecs -text "Export .ecs" -command {export_ecs}
3085#button .mfe.up2.mixdown  -activebackground LightPink -text "Mixdown" -command {mixdown}
3086button .mfe.up2.mixdown -text "Mixdown" -command {
3087	.mfe.up1.button configure -state disabled
3088	.mfe.up1.save configure -state disabled
3089	.mfe.up1.saveas configure -state disabled
3090	.mfe.up2.options configure -state disabled
3091	.mfe.up2.colors configure -state disabled
3092	.mfe.up2.time_format configure -state disabled
3093	.mfe.up2.metronome configure -state disabled
3094	.mfe.up2.mixdown configure -state disabled
3095	.mfe.up2.exportecs configure -state disabled
3096	.mfe.up2.addtrack configure -state disabled
3097	.mfe.up2.del_all_tracks configure -state disabled
3098	.mfe.up2.quit configure -state disabled
3099	.mfe.up2.about configure -state disabled
3100	.mfe.low.multich2 configure -state disabled
3101	.mfe.low.loc configure -state disabled
3102	.mfe.low.latcomp configure -state disabled
3103	.mfe.low.master configure -state disabled
3104	.mfe.low.play configure -state disabled
3105#	.mfe.low.rew_to_begin configure -state disabled
3106#	.mfe.low.rew_5 configure -state disabled
3107#	.mfe.low.forw_5 configure -state disabled
3108
3109    set types {{{Wav files} {*.wav}} {{mp3 files} {*.mp3}} {{raw files} {*.raw}} {{all} {*}}}
3110    set track_num "MD"
3111    set mfe(track_statusMD) "Rec"
3112    if {$number_of_tracks==0} {
3113	messages [format "There's no tracks to make Mixdown!"]
3114	return
3115    }
3116    set mixdown 1
3117    rec_properties
3118    tkwait window .rec_propertiesMD
3119    destroy .rec_propertiesMD
3120    if {$mixdown==5} {
3121	messages [format "Mixdown aborted by user!"]
3122	.mfe.up1.button configure -state normal
3123	.mfe.up1.save configure -state normal
3124	.mfe.up1.saveas configure -state normal
3125	.mfe.up2.options configure -state normal
3126	.mfe.up2.colors configure -state normal
3127	.mfe.up2.time_format configure -state normal
3128	.mfe.up2.metronome configure -state normal
3129	.mfe.up2.mixdown configure -state normal
3130	.mfe.up2.exportecs configure -state normal
3131	.mfe.up2.addtrack configure -state normal
3132	.mfe.up2.del_all_tracks configure -state normal
3133	.mfe.up2.quit configure -state normal
3134	.mfe.up2.about configure -state normal
3135	.mfe.low.multich2 configure -state normal
3136	.mfe.low.loc configure -state normal
3137	.mfe.low.latcomp configure -state normal
3138	.mfe.low.master configure -state normal
3139	.mfe.low.play configure -state normal
3140	return
3141    }
3142    file_browser2
3143    toplevel .rec_propertiesMD
3144    wm title .rec_propertiesMD "Processing..."
3145    message .rec_propertiesMD.out -width 350 -text "Please wait!\nProcessing Mixdown"
3146    pack .rec_propertiesMD.out -expand y -fill x
3147    tkwait visibility .rec_propertiesMD
3148    tkwait visibility .rec_propertiesMD.out
3149    play
3150}
3151
3152button .mfe.up2.options -justify right -text Options -command {options}
3153button .mfe.up2.colors -justify right -text Colors -command {colors}
3154button .mfe.up2.time_format -justify right -text "Time Format" -command {time_format}
3155button .mfe.up2.metronome -justify right -text "Metronome" -command {metronome}
3156button .mfe.up2.addtrack -justify right -text "Add Track" -command {
3157incr number_of_tracks
3158set mfe(volume_position$number_of_tracks) 1
3159set mfe(pan_position$number_of_tracks) 2
3160set mfe(track_name$number_of_tracks) "Track $number_of_tracks"
3161set track_num $number_of_tracks
3162track_data_reset
3163set mfe(track_name$number_of_tracks) "Track $number_of_tracks"
3164set mfe(device$number_of_tracks) "(I / O Dev.)"
3165add_track}
3166button .mfe.up2.del_all_tracks -justify right -text "Close" -command {
3167set save_as 0
3168set exit_yes 2
3169proc_exit
3170}
3171button .mfe.up2.quit -justify right -text Quit -command {
3172set exit_yes 1
3173proc_exit
3174}
3175button .mfe.up2.about -justify right -text "About TKECA" -command {
3176proc_about
3177}
3178
3179#label .mfe.header.text1 -bg $bgcolor -justify left -text " Name     "
3180#label .mfe.header.text2 -bg $bgcolor -justify left -text "File                              "
3181#label .mfe.header.text3 -bg $bgcolor -justify left -text " "
3182#label .mfe.header.text4 -bg $bgcolor -justify left -text "                 "
3183#label .mfe.header.text5 -bg $bgcolor -justify left -text "Solo Mute  Rec. "
3184#label .mfe.header.text6 -bg $bgcolor -justify left -text "                 "
3185#label .mfe.header.text7 -bg $bgcolor -justify left -text "Pan                               "
3186#label .mfe.header.text8 -bg $bgcolor -justify left -text "Volume                            "
3187
3188pack .mfe.up1.title -side top -fill x -expand 1
3189pack .mfe.up1.text -side left  -fill x -expand 1
3190pack .mfe.up1.entry -side left  -fill x -expand 1
3191pack .mfe.up1.text2 -side left  -fill x -expand 1
3192pack .mfe.up1.entry2 -side left  -fill x -expand 1
3193pack .mfe.up1.button -side left  -fill x -expand 1
3194pack .mfe.up1.save -side left -fill x -expand 1
3195pack .mfe.up1.saveas -side top -fill x -expand 1
3196
3197pack .mfe.up2.exportecs -side left -fill x -expand 1
3198pack .mfe.up2.mixdown -side left -fill x -expand 1
3199pack .mfe.up2.options -side left -fill x -expand 1
3200pack .mfe.up2.colors -side left -fill x -expand 1
3201pack .mfe.up2.time_format -side left -fill x -expand 1
3202pack .mfe.up2.metronome -side left -fill x -expand 1
3203pack .mfe.up2.addtrack -side left -fill x -expand 1
3204pack .mfe.up2.del_all_tracks -side left -fill x -expand 1
3205pack .mfe.up2.quit -side left -fill x -expand 1
3206pack .mfe.up2.about -side left -fill x -expand 1
3207# grid .mfe.up2.exportecs .mfe.up2.mixdown .mfe.up2.options .mfe.up2.time_format .mfe.up2.addtrack .mfe.up2.del_all_tracks .mfe.up2.quit .mfe.up2.about -sticky ewns
3208pack .mfe.up1 -side top -fill x
3209pack .mfe.up2 -side top -fill x
3210
3211# pack .mfe.header.text1 -side left -fill x
3212# pack .mfe.header.text2 -side left -fill x
3213# pack .mfe.header.text3 -side left -fill x
3214# pack .mfe.header.text4 -side left -fill x
3215# pack .mfe.header.text5 -side left -fill x
3216# pack .mfe.header.text6 -side left -fill x
3217# pack .mfe.header.text7 -side left -fill x
3218# pack .mfe.header.text8 -side left -fill x
3219# pack .mfe.header -pady 2
3220# pack .mfe.tracks -expand true -fill both
3221.mfe.up1.save configure -state disabled
3222.mfe.up1.saveas configure -state disabled
3223.mfe.up2.exportecs configure -state disabled
3224.mfe.up2.mixdown configure -state disabled
3225
3226set bgcolor2 AntiqueWhite3
3227canvas .mfe.tracks.canvas -width 780 -height 400 -yscrollcommand [list .mfe.tracks.yscroll set]
3228.mfe.tracks.canvas config -scrollregion "0 0 0 400"
3229scrollbar .mfe.tracks.yscroll -orient vertical -width 8 -command [list .mfe.tracks.canvas yview]
3230
3231set w [frame .mfe.tracks.canvas.f -width 780 -height 400 -bd 0]
3232.mfe.tracks.canvas create window 0 0 -anchor nw -window $w -tags tracks_window
3233
3234#pack .mfe.tracks.canvas.f -side left -fill x -expand true
3235pack .mfe.tracks.canvas -side left -fill both -expand true
3236pack .mfe.tracks.yscroll -side top -fill y -expand true
3237pack .mfe.tracks -side top -fill both -expand true
3238
3239set stop_command 1
3240set sp_minutes 0
3241set sp_seconds 0
3242set play_text "Play"
3243set fw_text "Fw 5''"
3244set rew_text "Rew 5''"
3245set rewbeg_text "Go to 00:00"
3246
3247label .mfe.low.position -text "Position:"
3248label .mfe.low.minutes -width 3 -text 0
3249label .mfe.low.position2 -text :
3250label .mfe.low.seconds -width 5 -text 0.00
3251label .mfe.low.spaces -text " "
3252label .mfe.low.multich -text "Multichannel:"
3253checkbutton .mfe.low.multich2 -width 1 -variable mfe(multichannel) -onvalue 1 -offvalue 0 -command "
3254set mixdown 3
3255set track_num 0
3256rec_properties"
3257
3258button .mfe.low.latcomp -text "Latency Compensation" -height 0 -command {
3259latency_comp
3260}
3261
3262button .mfe.low.loc -text Loc -height 0 -command {
3263locate
3264}
3265
3266button .mfe.low.master -text Master -height 0 -command {
3267master
3268}
3269
3270button .mfe.low.play -textvariable play_text -height 0 -command {
3271    if {$stop_command == 1} {
3272	set stop_command 0
3273	set play_text "Stop"
3274	play
3275	if {$tracks_to_play==0 && $tracks_to_rec==0} {
3276	    set stop_command 1
3277	    set play_text "Play"
3278	}
3279    } else {
3280	set stop_command 1
3281	set play_text "Play"
3282	stop
3283    }
3284}
3285
3286button .mfe.low.rew_to_begin -textvariable rewbeg_text  -height 0 -command {
3287    set sp_minutes 0
3288    set sp_seconds 0
3289    set sp_seconds2 0
3290    if {$stop_command == 1} {
3291	display_position
3292    } else {
3293	puts $playhandle "setpos 0"
3294	set start_time2 [clock clicks -milliseconds]
3295	tick
3296    }
3297}
3298
3299button .mfe.low.rew_5 -textvariable rew_text -height 0 -command {
3300    set starting_time [expr $sp_seconds+$sp_minutes*60]
3301    if {$starting_time > 5} {
3302        set starting_time [expr $starting_time-5]
3303        if {$time_format=="Minutes"} {
3304    	    set sp_minutes [expr $starting_time/60]
3305	    set sp_minutes [expr int($sp_minutes)]
3306	    set sp_seconds [expr $starting_time-$sp_minutes*60]
3307	} else {
3308	    set sp_seconds $starting_time
3309	}
3310    } else {
3311	set sp_minutes 0
3312	set sp_seconds 0
3313    }
3314    if {$stop_command == 1} {
3315	display_position
3316    } else {
3317	set sp_seconds2 $starting_time
3318	puts $playhandle "setpos $starting_time"
3319	set start_time2 [clock clicks -milliseconds]
3320	tick
3321    }
3322}
3323
3324button .mfe.low.forw_5 -textvariable fw_text -height 0 -command {
3325    set starting_time [expr $sp_seconds+$sp_minutes*60]
3326    set starting_time [expr $starting_time+5]
3327    if {$time_format=="Minutes"} {
3328	set sp_minutes [expr $starting_time/60]
3329	set sp_minutes [expr int($sp_minutes)]
3330	set sp_seconds [expr $starting_time-$sp_minutes*60]
3331    } else {
3332	set sp_seconds $starting_time
3333    }
3334    if {$stop_command == 1} {
3335	display_position
3336    } else {
3337	set sp_seconds2 $starting_time
3338	puts $playhandle "setpos $starting_time"
3339	set start_time2 [clock clicks -milliseconds]
3340	tick
3341    }
3342}
3343
3344pack .mfe.low.position -side left
3345pack .mfe.low.minutes -side left
3346pack .mfe.low.position2 -side left
3347pack .mfe.low.seconds -side left
3348pack .mfe.low.spaces -side left
3349pack .mfe.low.multich -side left
3350pack .mfe.low.multich2 -side left
3351pack .mfe.low.latcomp -side left
3352
3353pack .mfe.low.loc -side left -fill x -expand true
3354pack .mfe.low.master -side left -fill x -expand true
3355pack .mfe.low.play -side left -fill x -expand true
3356pack .mfe.low.rew_to_begin -side left -fill x -expand true
3357pack .mfe.low.rew_5 -side left -fill x -expand true
3358pack .mfe.low.forw_5 -side left -fill x
3359pack .mfe.low -fill x -expand false
3360pack .mfe -fill both -expand true
3361
3362bind .mfe <Configure> {.mfe.tracks.canvas itemconfigure tracks_window -width [expr [winfo width .mfe]-15]}
3363
3364set ecasoundrc "~/.ecasoundrc"
3365
3366if {[file exists $ecasoundrc] != 1} {
3367    set ecasoundrc "~/.ecasound/ecasoundrc"
3368    if {[file exists $ecasoundrc] != 1} {
3369	set ecasoundrc "/usr/local/share/ecasound/ecasoundrc"
3370	if {[file exists $ecasoundrc] != 1} {
3371	    set ecasoundrc "/usr/share/ecasound/ecasoundrc"
3372	    if {[file exists $ecasoundrc] != 1} {
3373		puts "Tkeca is unable to find ecasoundrc file"
3374		exit
3375	    }
3376	}
3377    }
3378}
3379
3380set rc_infile [open $ecasoundrc r]
3381
3382tkwait visibility .mfe
3383tkwait visibility .mfe.low
3384#tkwait visibility .mfe.up1
3385#tkwait visibility .mfe.up2
3386wm title . "TKECA 4.4.3 - Tcl/Tk Frontend for Ecasound"
3387
3388set ladspa_path 0
3389
3390set prev_loaded_file 0
3391set eca_effects 69
3392
3393set effect(1) "eal|Limiter|1|Limit %|0|100|100|0"
3394set effect(2) "ec|Compressor|2|Compression Rate (Db)|0|1|1|0|Threshold %|0|100|50|0"
3395set effect(3) "eca|Advanced Compressor|4|Peak Level %|0|100|69|0|Release Time (Seconds)|0|5|2|0|Fast Compressor Rate|0|1|0.5|0|Compressor Rate (Db)|0|1|1|0"
3396set effect(4) "enm|Noise Gate|5|Threshold Level %|0|100|100|0|Pre Hold Time (ms)|0|2000|200|0|Attack Time (ms)|0|2000|200|0|Post Hold Time (ms)|0|2000|200|0|Release Time (ms)|0|2000|200|0"
3397set effect(5) "ef1|Resonant Bandpass Filter|2|Center Frequency (Hz)|0|20000|0|0|Width (Hz)|0|2000|0|0"
3398set effect(6) "ef3|Resonant Lowpass Filter|3|Cutoff Frequency (Hz)|0|5000|0|0|Resonance|0|2|0|0|Gain|0|1|0|0"
3399set effect(7) "efa|Allpass Filter|2|Delay Samples|0|10000|0|0|Feedback %|0|100|50|0"
3400set effect(8) "efb|Bandpass Filter|2|Center Frequency (Hz)|0|11000|11000|0|Width (Hz)|0|22000|22000|0"
3401set effect(9) "efh|Highpass Filter|1|Cutoff Frequency (Hz)|10000|22000|10000|0"
3402set effect(10) "efl|Lowpass Filter|1|Cutoff Frequency (Hz)|0|10000|0|0"
3403set effect(11) "efr|Bandreject Filter|2|Center Frequency (Hz)|0|11000|11000|0|Width (Hz)|0|22000|22000|0"
3404set effect(12) "efs|Resonator Filter|2|Center Frequency (Hz)|0|11000|11000|0|Width (Hz)|0|22000|22000|0"
3405set effect(13) "etd|Delay|4|Delay Time (ms)|0|2000|200|0|Surround Mode (Normal, Surround St., Spread)|0|2|0|1|Number of Delays|0|100|50|0|Mix %|0|100|50|0"
3406set effect(14) "etc|Chorus|4|Delay Time (ms)|0|2000|200|0|Variance Time Samples|0|10000|500|0|Feedback %|0|100|50|0|LFO Frequency (Hz)|0|100|50|0"
3407set effect(15) "etr|Reverb|3|Delay Time (ms)|0|2000|200|0|Surround Mode (0=Normal, 1=Surround)|0|1|0|1|Feedback %|0|100|50|0"
3408set effect(16) "ete|Advanced Reverb|3|Room Size (Meters)|0|100|10|0|Feedback %|0|100|50|0|Wet %|0|100|50|0"
3409set effect(17) "etf|Fake Stereo|1|Delay Time (ms)|0|500|40|0"
3410set effect(18) "etl|Flanger|4|Delay Time (ms)|0|1000|200|0|Variance Time Samples|0|10000|200|0|Feedback %|0|100|50|0|LFO Frequency (Hz)|0|100|50|0"
3411set effect(19) "etm|Multitap Delay|3|Delay Time (ms)|0|2000|200|0|Number of Delays|0|100|20|0|Mix %|0|100|50|0"
3412set effect(20) "etp|Phaser|4|Delay Time (ms)|0|2000|200|0|Variance Time Samples|0|10000|100|0|Feedback %|0|100|50|0|LFO Frequency (Hz)|0|100|50|0"
3413set effect(21) "pn:metronome|Metronome|1|BPM|30|300|120|1"
3414set effect(22) "pn:dyn_compress_supersoft|Dynamic Compressor (Super Soft)|1|Gain %|0|1000|100|1"
3415set effect(23) "pn:dyn_compress_soft|Dynamic Compressor (Soft)|1|Gain %|0|1000|100|1"
3416set effect(24) "pn:dyn_compress_medium|Dynamic Compressor (Medium)|1|Gain %|0|1000|100|1"
3417set effect(25) "pn:dyn_compress_hard|Dynamic Compressor (Hard)|1|Gain %|0|1000|100|1"
3418set effect(26) "pn:dyn_compress_brutal|Dynamic Compressor (Brutal)|1|Gain %|0|1000|100|1"
3419set effect(27) "pn:eq_template|10 Bands Equalizer|10|10hz|0|500|100|1|40hz|0|500|100|1|100hz|0|500|100|1|220hz|0|500|100|1|460hz|0|500|100|1|940hz|0|500|100|1|1900hz|0|500|100|1|3800hz|0|500|100|1|7620hz|0|500|100|1|15300hz|0|500|100|1"
3420set effect(28) "pn:eq_template2|2 Bands Equalizer|2|1000hz|0|500|100|1|4000hz|0|500|100|1"
3421set effect(29) "pn:f_lowp_sine|Resonator Lowpass Filter (Controlled by a sine wave)|0"
3422set effect(30) "pn:f_lowp_sine2|Lowpass Filter (Controlled by a sine wave)|0"
3423set effect(31) "pn:f_high_and_low|Parallel High amd Lowpass Filter|0"
3424set effect(32) "pn:f_res_bandpass|Resonator Bandpass Filter|2|Freq|0|4500|1500|1|Width|1|2100|700|1"
3425set effect(33) "pn:f_res_lowpass|Resonator Lowpass Filter|1|Freq|0|2000|800|1"
3426set effect(34) "pn:f_lowpass|Simple Lowpass Filter|1|Freq|0|2000|300|1"
3427set effect(35) "pn:f_bandpass|Bandpass Filter|2|Freq|0|4500|1500|1|Width|1|2100|700|1"
3428set effect(36) "pn:f_rejectband|Band Reject Filter|0"
3429set effect(37) "pn:f_highpass|Resonator Lowpass Filter|1|Freq|0|3000|1500|1"
3430set effect(38) "pn:f_inverse_comb|Inverse Combined Filter|0"
3431set effect(39) "pn:f_resonator|Resonator Filter|0"
3432set effect(40) "pn:f_two_filters|Parallel Highpass and Lowpass Filter|2|Low Freq Gain %|0|1000|100|1|High Freq Gain %|0|1000|100|1"
3433set effect(41) "pn:f_two_filters_pareq|Two Parallel Filters with Gain Controls|4|Low Freq|0|2000|200|1|Low Gain %|0|1000|100|1|High Freq|2000|4000|2000|1|High Gain %|0|1000|100|1"
3434set effect(42) "pn:f_filtertest|Two Parallel Filters|2|Freq 1|0|2000|100|1|Freq 2|4000|10000|5000|1"
3435set effect(43) "pn:gate_noisegate_1|Noise Gate|0"
3436set effect(44) "pn:gate_noisegate_delanalog|Noise Gate for Analog Hum Removal|0"
3437set effect(45) "pn:gate_crop|Crop Gate Example|0"
3438set effect(46) "pn:gate_threshold|Threshold Gate Example|0"
3439set effect(47) "pn:time_reverb1|Bathroom Reverb|0"
3440set effect(48) "pn:time_reverb2|Plain Reverb|0"
3441set effect(49) "pn:time_reverb3|Fake Stereo|0"
3442set effect(50) "pn:time_reverb4|Reverb Combo|0"
3443set effect(51) "pn:time_delay1|200ms Triple Delay|0"
3444set effect(52) "pn:time_delay2|200ms Triple Multidelay|0"
3445set effect(53) "pn:time_wicked_dub|Wicked Dub Mix|0"
3446set effect(54) "pn:time_flanger1|Flanger Example|0"
3447set effect(55) "pn:time_chorus1|Chorus Example|0"
3448set effect(56) "pn:time_phaser1|Phaser Example|0"
3449set effect(57) "pn:var_sweeping_pan|Sweeping Pan Envelope|1|Speed Hz|0.1|100|0.2|0.01"
3450set effect(58) "pn:var_switching_pan|Alternates between Left and Right|1|Speed Hz|0.1|100|0.2|0.01"
3451set effect(59) "pn:chipmunk_generator|Chipmunk Generator|0"
3452set effect(60) "pn:var_parchid|Chipmunk Sweep|2|Pitch |0|500|100|1|Mod. Freq |0|1|0.5|0.01"
3453set effect(61) "pn:var_paralmadness|Parallel Madness|3|Freq 1|0|1|0.2|0.01|Freq 2|0|1|0.2|0.01|Freq 3|0|1|0.2|0.01"
3454# Contributed Arto Hamara
3455set effect(62) "pn:var_stretched_tape|Stretched Tape|0"
3456set effect(63) "pn:var_molten_tape|Molten Tape|0"
3457set effect(64) "pn:var_dali|Dali|0"
3458# Contributed S Macy
3459set effect(65) "pn:var_aw|Classic Auto Wah|1|Speed|0.01|1|0.1|0.01"
3460set effect(66) "pn:var_aw_custom|Classic Auto Wah with Controls|3|Low|0|1000|100|1|High|5000|10000|8000|1|Speed|0.01|1|0.1|0.01"
3461set effect(67) "pn:var_aw_tri|Auto Wah Triangular Osc.|1|Speed|0.01|1|0.1|0.01"
3462set effect(68) "pn:var_aw_tri_custom|Auto Wah Triangular Osc. with Control|1|Speed|0.01|1|0.1|0.01"
3463set effect(69) "pn:var_aw_ksv|Volume Sensitive Wah|0"
3464
3465set effect_index(0) "None"
3466
3467for {set n 1} {$n <= $eca_effects} {incr n} {
3468    set current_effect [split $effect($n) |]
3469    set effect_index($n) [lindex $current_effect 0]
3470    set effect_name($effect_index($n)) [lindex $current_effect 1]
3471    set effect_maker($effect_index($n)) "Kai Vehmanen"
3472    set effect_copy($effect_index($n)) "(c) 1997-2001 Kai Vehmanen"
3473    if {$n>=62 && $n<= 64} {
3474	set effect_maker($effect_index($n)) "Arto Hamara"
3475	set effect_copy($effect_index($n)) "(c) Unknown"
3476    }
3477    if {$n>=65 && $n<= 69} {
3478	set effect_maker($effect_index($n)) "S. Macy"
3479	set effect_copy($effect_index($n)) "(c) Unknown"
3480    }
3481    set effect_param($effect_index($n)) [lindex $current_effect 2]
3482    set pn2 3
3483    for {set pn 1} {$pn <= $effect_param($effect_index($n))} {incr pn} {
3484	set effect_param_name($effect_index($n)$pn) [lindex $current_effect $pn2]
3485	incr pn2
3486	set effect_param_from($effect_index($n)$pn) [lindex $current_effect $pn2]
3487	incr pn2
3488	set effect_param_to($effect_index($n)$pn) [lindex $current_effect $pn2]
3489	incr pn2
3490	set effect_param_value($effect_index($n)$pn) [lindex $current_effect $pn2]
3491	incr pn2
3492	set effect_param_resolution($effect_index($n)$pn) [lindex $current_effect $pn2]
3493	incr pn2
3494    }
3495}
3496
3497while {[gets $rc_infile input_line] != -1 } {
3498    set current_line [split $input_line =]
3499    set current_parameter [lindex $current_line 0]
3500    set current_value [lindex $current_line 1]
3501    if {[string match *ladspa* $current_parameter] == 1} {
3502	regsub { } $current_value {} current_value
3503	set ladspa_path $current_value
3504    }
3505    if {[string match *wave-editor* $current_parameter] == 1} {
3506	regsub { } $current_value {} current_value
3507	set wave_editor $current_value
3508    }
3509    if {[string match *efault-output* $current_parameter] == 1} {
3510	regsub {default-output =} $current_value {} current_value
3511	regsub { } $current_value {} current_value
3512	set default_audio_io $current_value
3513    }
3514}
3515
3516if {[string match */* $ladspa_path] == 1 || [string match /* $ladspa_path] == 1} {ladspa} else {messages [format "No LADSPA Support"]}
3517
3518