#!/bin/sh 
# the next line restarts using wish \
exec /usr/local/bin/wish8.6 "$0" "$@" > ~/tkeca.log

#    Tkeca is a Tcl/Tk frontend for Kai Vehmanen's Ecasound
#    Copyright (C) 2002-2009  Luis Pablo Gasparotto
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
#    To contact me: lpgasparotto@gmail.com	

proc colors {} {
  package require Tk
  set wcolors .colors
  catch {destroy $wcolors}
  toplevel $wcolors
  wm title $wcolors "Color palette"
  wm iconname $wcolors "Listbox"
  #positionWindow $wcolors

## See Code / Dismiss buttons
  #set btns [addSeeDismiss $wcolors.buttons $wcolors]
  #pack $btns -side bottom -fill x
  frame $wcolors.frame -borderwidth 10
  pack $wcolors.frame -side top -expand yes -fill y

  scrollbar $wcolors.frame.scroll -command "$wcolors.frame.list yview"
  listbox $wcolors.frame.list -yscroll "$wcolors.frame.scroll set" \
	-width 20 -height 16 -setgrid 1
  pack $wcolors.frame.list $wcolors.frame.scroll -side left -fill y -expand 1

  bind $wcolors.frame.list <Double-1> {
    tk_setPalette [selection get]
  }
  $wcolors.frame.list insert 0 gray60 gray70 gray80 gray85 gray90 gray95 \
    snow1 snow2 snow3 snow4 seashell1 seashell2 \
    seashell3 seashell4 AntiqueWhite1 AntiqueWhite2 AntiqueWhite3 \
    AntiqueWhite4 bisque1 bisque2 bisque3 bisque4 PeachPuff1 \
    PeachPuff2 PeachPuff3 PeachPuff4 NavajoWhite1 NavajoWhite2 \
    NavajoWhite3 NavajoWhite4 LemonChiffon1 LemonChiffon2 \
    LemonChiffon3 LemonChiffon4 cornsilk1 cornsilk2 cornsilk3 \
    cornsilk4 ivory1 ivory2 ivory3 ivory4 honeydew1 honeydew2 \
    honeydew3 honeydew4 LavenderBlush1 LavenderBlush2 \
    LavenderBlush3 LavenderBlush4 MistyRose1 MistyRose2 \
    MistyRose3 MistyRose4 azure1 azure2 azure3 azure4 \
    SlateBlue1 SlateBlue2 SlateBlue3 SlateBlue4 RoyalBlue1 \
    RoyalBlue2 RoyalBlue3 RoyalBlue4 blue1 blue2 blue3 blue4 \
    DodgerBlue1 DodgerBlue2 DodgerBlue3 DodgerBlue4 SteelBlue1 \
    SteelBlue2 SteelBlue3 SteelBlue4 DeepSkyBlue1 DeepSkyBlue2 \
    DeepSkyBlue3 DeepSkyBlue4 SkyBlue1 SkyBlue2 SkyBlue3 \
    SkyBlue4 LightSkyBlue1 LightSkyBlue2 LightSkyBlue3 \
    LightSkyBlue4 SlateGray1 SlateGray2 SlateGray3 SlateGray4 \
    LightSteelBlue1 LightSteelBlue2 LightSteelBlue3 \
    LightSteelBlue4 LightBlue1 LightBlue2 LightBlue3 \
    LightBlue4 LightCyan1 LightCyan2 LightCyan3 LightCyan4 \
    PaleTurquoise1 PaleTurquoise2 PaleTurquoise3 PaleTurquoise4 \
    CadetBlue1 CadetBlue2 CadetBlue3 CadetBlue4 turquoise1 \
    turquoise2 turquoise3 turquoise4 cyan1 cyan2 cyan3 cyan4 \
    DarkSlateGray1 DarkSlateGray2 DarkSlateGray3 \
    DarkSlateGray4 aquamarine1 aquamarine2 aquamarine3 \
    aquamarine4 DarkSeaGreen1 DarkSeaGreen2 DarkSeaGreen3 \
    DarkSeaGreen4 SeaGreen1 SeaGreen2 SeaGreen3 SeaGreen4 \
    PaleGreen1 PaleGreen2 PaleGreen3 PaleGreen4 SpringGreen1 \
    SpringGreen2 SpringGreen3 SpringGreen4 green1 green2 \
    green3 green4 chartreuse1 chartreuse2 chartreuse3 \
    chartreuse4 OliveDrab1 OliveDrab2 OliveDrab3 OliveDrab4 \
    DarkOliveGreen1 DarkOliveGreen2 DarkOliveGreen3 \
    DarkOliveGreen4 khaki1 khaki2 khaki3 khaki4 \
    LightGoldenrod1 LightGoldenrod2 LightGoldenrod3 \
    LightGoldenrod4 LightYellow1 LightYellow2 LightYellow3 \
    LightYellow4 yellow1 yellow2 yellow3 yellow4 gold1 gold2 \
    gold3 gold4 goldenrod1 goldenrod2 goldenrod3 goldenrod4 \
    DarkGoldenrod1 DarkGoldenrod2 DarkGoldenrod3 DarkGoldenrod4 \
    RosyBrown1 RosyBrown2 RosyBrown3 RosyBrown4 IndianRed1 \
    IndianRed2 IndianRed3 IndianRed4 sienna1 sienna2 sienna3 \
    sienna4 burlywood1 burlywood2 burlywood3 burlywood4 wheat1 \
    wheat2 wheat3 wheat4 tan1 tan2 tan3 tan4 chocolate1 \
    chocolate2 chocolate3 chocolate4 firebrick1 firebrick2 \
    firebrick3 firebrick4 brown1 brown2 brown3 brown4 salmon1 \
    salmon2 salmon3 salmon4 LightSalmon1 LightSalmon2 \
    LightSalmon3 LightSalmon4 orange1 orange2 orange3 orange4 \
    DarkOrange1 DarkOrange2 DarkOrange3 DarkOrange4 coral1 \
    coral2 coral3 coral4 tomato1 tomato2 tomato3 tomato4 \
    OrangeRed1 OrangeRed2 OrangeRed3 OrangeRed4 red1 red2 red3 \
    red4 DeepPink1 DeepPink2 DeepPink3 DeepPink4 HotPink1 \
    HotPink2 HotPink3 HotPink4 pink1 pink2 pink3 pink4 \
    LightPink1 LightPink2 LightPink3 LightPink4 PaleVioletRed1 \
    PaleVioletRed2 PaleVioletRed3 PaleVioletRed4 maroon1 \
    maroon2 maroon3 maroon4 VioletRed1 VioletRed2 VioletRed3 \
    VioletRed4 magenta1 magenta2 magenta3 magenta4 orchid1 \
    orchid2 orchid3 orchid4 plum1 plum2 plum3 plum4 \
    MediumOrchid1 MediumOrchid2 MediumOrchid3 MediumOrchid4 \
    DarkOrchid1 DarkOrchid2 DarkOrchid3 DarkOrchid4 purple1 \
    purple2 purple3 purple4 MediumPurple1 MediumPurple2 \
    MediumPurple3 MediumPurple4 thistle1 thistle2 thistle3 \
    thistle4
  button $wcolors.dismiss -text "Close" -command {
    destroy .colors
    return
  }
  pack $wcolors.dismiss -expand yes -fill x

}

proc master {} {
    global mfe bgcolor mt_font
    if {[winfo exists .master] != 0} {destroy .master}
#    toplevel .master -bd 6 -bg $bgcolor -height 200 -width 10
    toplevel .master -bd 6 -height 200 -width 10
    wm title .master "Master Volume Control"
#    frame .master.up -bg $bgcolor
    frame .master.up
#    label .master.up.title -bg $bgcolor -text "Master Control"
    label .master.up.title -text "Master Control"
#    frame .master.med -bg AntiqueWhite
    frame .master.med
#    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 "
    scale .master.med.control -resolution 1 -from 200 -to 0 -length 250 -width 10 -orient vertical -showvalue true -variable mfe(master) -command "
	set mfe(controller_number) 0
	set mfe(param_number) 1
	change_master_volume_on_the_fly  
	set mfe(master)"

#    frame .master.low -bg $bgcolor
    frame .master.low
#    button .master.low.close  -activebackground LightPink -text Close -command {destroy .master}
    button .master.low.close -text Close -command {destroy .master}
    pack .master.up.title -side top -fill x -expand yes
    pack .master.up -side top -fill x -expand yes
    pack .master.med.control -side top -fill y -expand yes
    pack .master.med -side top -fill both -expand yes
    pack .master.low.close -padx 5 -side left -fill x -expand yes    
    pack .master.low -pady 5 -side top -fill x -expand yes    
    
}

proc change_master_volume_on_the_fly {} {
    global mfe number_of_tracks stop_command playhandle
    if {$stop_command==0} {
	for {set n 1} {$n <= $number_of_tracks} {incr n} {
	    set master_volume [expr $mfe(volume$n)*$mfe(master)/100]
	    puts $playhandle "c-select $n\ncop-select $mfe(volume_position$n) \ncopp-select $mfe(param_number)\ncopp-set $master_volume"
	}
    }
}

proc metronome {} {
    global bgcolor bgcolor2 bgcolor3 mfe track_num

    set bgcolor3 AntiqueWhite2
    set mt_font [font create -family Helvetica -size 9 -weight normal]
    if {[winfo exists .metronome] != 0} {destroy .metronome}
    toplevel .metronome  -bd 6
    frame .metronome.frame1
    label .metronome.frame1.label1 -text "Beats per minute: "
    entry .metronome.frame1.beat -bg White -width 3 -textvariable mfe(effect_parameter110)
    frame .metronome.frame2
    menubutton .metronome.frame2.dev_text -text "Device" -relief raised -padx 1 -menu .metronome.frame2.dev_text.type
	menu .metronome.frame2.dev_text.type -tearoff 0
		.metronome.frame2.dev_text.type add radiobutton -label Default -variable mfe(device0) -value "Default"
	        .metronome.frame2.dev_text.type add radiobutton -label alsa,hw:0 -variable mfe(device0) -value "alsa,hw:0"
		.metronome.frame2.dev_text.type add radiobutton -label alsa,hw:1 -variable mfe(device0) -value "alsa,hw:1"
		.metronome.frame2.dev_text.type add radiobutton -label alsa,hw:2 -variable mfe(device0) -value "alsa,hw:2"
		.metronome.frame2.dev_text.type add radiobutton -label alsa,hw:3 -variable mfe(device0) -value "alsa,hw:3"
		.metronome.frame2.dev_text.type add radiobutton -label alsaplugin,0 -variable mfe(device0) -value "alsaplugin,0"
		.metronome.frame2.dev_text.type add radiobutton -label alsaplugin,1 -variable mfe(device0) -value "alsaplugin,1"
		.metronome.frame2.dev_text.type add radiobutton -label alsaplugin,2 -variable mfe(device0) -value "alsaplugin,2"
		.metronome.frame2.dev_text.type add radiobutton -label alsaplugin,3 -variable mfe(device0) -value "alsaplugin,3"
		.metronome.frame2.dev_text.type add radiobutton -label jack,system -variable mfe(device0) -value "jack,system"
		.metronome.frame2.dev_text.type add radiobutton -label /dev/dsp -variable mfe(device0) -value "/dev/dsp"
		.metronome.frame2.dev_text.type add radiobutton -label /dev/dsp1 -variable mfe(device0) -value "/dev/dsp1"
		.metronome.frame2.dev_text.type add radiobutton -label /dev/dsp2 -variable mfe(device0) -value "/dev/dsp2"
		.metronome.frame2.dev_text.type add radiobutton -label /dev/dsp3 -variable mfe(device0) -value "/dev/dsp3"
	entry .metronome.frame2.dev_entry -bg White -width 16 -textvariable mfe(device0)
    checkbutton .metronome.enable -width 18 -text "Enable metronome" -variable mfe(track_status0) -onvalue "Play" -offvalue "Mute" -padx 0 -command "
	    set track_num 0
	    mute_unmute"

    button .metronome.button -text Ok -command {destroy .metronome}
	
	grid .metronome.frame1.label1 .metronome.frame1.beat
	pack .metronome.frame1 -fill both -expand yes -padx 2 -pady 2
	grid .metronome.frame2.dev_text .metronome.frame2.dev_entry
	pack .metronome.frame2 -fill both -expand yes -padx 2 -pady 2
	pack .metronome.enable -fill x -padx 2
        pack .metronome.button -side bottom -anchor s -fill x
}

proc latency_comp {} {
    global sp_minutes sp_seconds sp_minutes_loc sp_seconds_loc locate_name bgcolor bgcolor2 bgcolor3 mfe time_format
    if {[winfo exists .latency] != 0} {destroy .latency}
    toplevel .latency  -bd 6
    wm title .latency "Latency Compensation"
    frame .latency.frame
    label .latency.frame.label -text "Latency Compensation (ms): "
    entry .latency.frame.input -bg White -width 4 -textvariable mfe(latency)
#    frame .latency.frame2 -bg $bgcolor
#    button .latency.frame2.button  -activebackground LightPink -text Ok -command {destroy .latency}
    button .latency.button -text Ok -command {destroy .latency}
    grid .latency.frame.label .latency.frame.input -sticky ewns
#    grid .latency.frame2.button -sticky ewns
    pack .latency.frame -fill both -expand yes -padx 2 -pady 2
#    pack .latency.frame2 -fill both -expand yes
    pack .latency.button -fill both -expand yes -padx 2 -pady 2
}

proc locate {} {
    global sp_minutes sp_seconds sp_minutes_loc sp_seconds_loc locate_name bgcolor bgcolor2 bgcolor3 mfe time_format
    if {[winfo exists .locate] != 0} {destroy .locate}
    toplevel .locate  -bd 6
    wm title .locate "Locates"
    frame .locate.locate
    set loc_number 1
    if {$time_format=="Minutes"} {
	for {set loc_number 1} {$loc_number <= 16} {incr loc_number} {
	    	entry .locate.locate.minutes$loc_number -bg White -justify right -width 3 -textvariable sp_minutes_loc($loc_number)
		label .locate.locate.position$loc_number -text :
		entry .locate.locate.seconds$loc_number -bg White -justify right -width 5 -textvariable sp_seconds_loc($loc_number)
		button .locate.locate.button$loc_number -text $loc_number -command "
		set locate_name $loc_number
		move_to_locate"
	}
	grid .locate.locate.minutes1 .locate.locate.position1 .locate.locate.seconds1 .locate.locate.button1 -sticky ewns -padx 3
	grid .locate.locate.minutes2 .locate.locate.position2 .locate.locate.seconds2 .locate.locate.button2 -sticky ewns -padx 3
	grid .locate.locate.minutes3 .locate.locate.position3 .locate.locate.seconds3 .locate.locate.button3 -sticky ewns -padx 3
	grid .locate.locate.minutes4 .locate.locate.position4 .locate.locate.seconds4 .locate.locate.button4 -sticky ewns -padx 3
    
	grid .locate.locate.minutes5 .locate.locate.position5 .locate.locate.seconds5 .locate.locate.button5 -sticky ewns -padx 3 
	grid .locate.locate.minutes6 .locate.locate.position6 .locate.locate.seconds6 .locate.locate.button6 -sticky ewns -padx 3
	grid .locate.locate.minutes7 .locate.locate.position7 .locate.locate.seconds7 .locate.locate.button7 -sticky ewns -padx 3
	grid .locate.locate.minutes8 .locate.locate.position8 .locate.locate.seconds8 .locate.locate.button8 -sticky ewns -padx 3
    
	grid .locate.locate.minutes9 .locate.locate.position9 .locate.locate.seconds9 .locate.locate.button9 -sticky ewns -padx 3
	grid .locate.locate.minutes10 .locate.locate.position10 .locate.locate.seconds10 .locate.locate.button10 -sticky ewns -padx 3
	grid .locate.locate.minutes11 .locate.locate.position11 .locate.locate.seconds11 .locate.locate.button11 -sticky ewns -padx 3 
	grid .locate.locate.minutes12 .locate.locate.position12 .locate.locate.seconds12 .locate.locate.button12 -sticky ewns -padx 3 
    
	grid .locate.locate.minutes13 .locate.locate.position13 .locate.locate.seconds13 .locate.locate.button13 -sticky ewns -padx 3
	grid .locate.locate.minutes14 .locate.locate.position14 .locate.locate.seconds14 .locate.locate.button14 -sticky ewns -padx 3
	grid .locate.locate.minutes15 .locate.locate.position15 .locate.locate.seconds15 .locate.locate.button15 -sticky ewns -padx 3
	grid .locate.locate.minutes16 .locate.locate.position16 .locate.locate.seconds16 .locate.locate.button16 -sticky ewns -padx 3

	frame .locate.punch
	label .locate.punch.in_text -text "Punch-in:"
	entry .locate.punch.in_minutes -bg White -justify right -width 2 -textvariable mfe(punch_in_minutes)
	label .locate.punch.in_sep -text :
	entry .locate.punch.in_seconds -bg White -justify right -width 5 -textvariable mfe(punch_in_seconds)

	label .locate.punch.out_text -text "Punch-Out:"
	entry .locate.punch.out_minutes -bg White -justify right -width 2 -textvariable mfe(punch_out_minutes)
	label .locate.punch.out_sep -text :
	entry .locate.punch.out_seconds -bg White -justify right -width 5 -textvariable mfe(punch_out_seconds)
    
	pack .locate.locate -fill both -expand yes
	grid .locate.punch.in_text .locate.punch.in_minutes .locate.punch.in_sep .locate.punch.in_seconds
	grid .locate.punch.out_text .locate.punch.out_minutes .locate.punch.out_sep .locate.punch.out_seconds 
	pack .locate.punch -fill both -expand yes

    } else {
	for {set loc_number 1} {$loc_number <= 16} {incr loc_number} {
	    entry .locate.locate.seconds$loc_number -bg White -justify right -width 7 -textvariable sp_seconds_loc($loc_number)
	    button .locate.locate.button$loc_number -width 7 -text $loc_number -command "
	    set locate_name $loc_number
	    move_to_locate"
	}

	frame .locate.punch
	label .locate.punch.in_text -text "Punch-in:"
	entry .locate.punch.in_seconds -bg White -justify right -width 7 -textvariable mfe(punch_in_seconds)

	label .locate.punch.out_text -text "Punch-Out:"
	entry .locate.punch.out_seconds -bg White -justify right -width 7 -textvariable mfe(punch_out_seconds)

	grid .locate.locate.seconds1 .locate.locate.button1 -sticky ewns -padx 3
	grid .locate.locate.seconds2 .locate.locate.button2 -sticky ewns -padx 3
	grid .locate.locate.seconds3 .locate.locate.button3 -sticky ewns -padx 3
	grid .locate.locate.seconds4 .locate.locate.button4 -sticky ewns -padx 3
    
	grid .locate.locate.seconds5 .locate.locate.button5 -sticky ewns -padx 3 
	grid .locate.locate.seconds6 .locate.locate.button6 -sticky ewns -padx 3
	grid .locate.locate.seconds7 .locate.locate.button7 -sticky ewns -padx 3
	grid .locate.locate.seconds8 .locate.locate.button8 -sticky ewns -padx 3
    
	grid .locate.locate.seconds9 .locate.locate.button9 -sticky ewns -padx 3
	grid .locate.locate.seconds10 .locate.locate.button10 -sticky ewns -padx 3
	grid .locate.locate.seconds11 .locate.locate.button11 -sticky ewns -padx 3 
	grid .locate.locate.seconds12 .locate.locate.button12 -sticky ewns -padx 3 
    
	grid .locate.locate.seconds13 .locate.locate.button13 -sticky ewns -padx 3
	grid .locate.locate.seconds14 .locate.locate.button14 -sticky ewns -padx 3
	grid .locate.locate.seconds15 .locate.locate.button15 -sticky ewns -padx 3
	grid .locate.locate.seconds16 .locate.locate.button16 -sticky ewns -padx 3
    
	pack .locate.locate -fill both -expand yes
	grid .locate.punch.in_text .locate.punch.in_seconds
	grid .locate.punch.out_text .locate.punch.out_seconds 
	pack .locate.punch -fill both -expand yes
    }
}

proc ladspa {} {

global 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

set env(LADSPA_PATH) $ladspa_path  
.mfe.up1.button configure -state disabled	
.mfe.up2.options configure -state disabled	
.mfe.up2.colors configure -state disabled	
.mfe.up2.time_format configure -state disabled
.mfe.up2.metronome configure -state disabled
.mfe.up2.addtrack configure -state disabled	
.mfe.up2.del_all_tracks configure -state disabled	
.mfe.up2.quit configure -state disabled	
.mfe.up2.about configure -state disabled	
.mfe.low.multich2 configure -state disabled	
.mfe.low.latcomp configure -state disabled	
.mfe.low.loc configure -state disabled	
.mfe.low.master configure -state disabled	
.mfe.low.play configure -state disabled	
.mfe.low.rew_to_begin configure -state disabled	
.mfe.low.rew_5 configure -state disabled	
.mfe.low.forw_5 configure -state disabled	 

ladspa_loading_window

set cmd "exec listplugins"
catch {eval $cmd} exec_out1

if {[string match *egmentation* $exec_out1] == 1} {
return}

set exec_out2 [split $exec_out1 \n]
set file_number 0
set parameters 0

for {set n 0} {$n <= [llength $exec_out2]} {incr n} {
    set current_line [lindex $exec_out2 $n]
    if {[string match *.so* $current_line] == 1} {
	regsub : $current_line {} current_line
	set files($file_number) $current_line
	incr file_number

    }
}

set exec_out2 " "

for {set n 0} {$n < $file_number} {incr n} {

    set cmd "exec analyseplugin $files($n)"
    catch {eval $cmd} exec_out1
    set exec_out2 "$exec_out2$exec_out1"
#    puts "$exec_out2"

}

set exec_out3 [split $exec_out2 \n]
set index [expr $eca_effects+1]

for {set n 0} {$n <= [llength $exec_out3]} {incr n} {
    set srate 0
    set current_line [lindex $exec_out3 $n]
    if {[string match {Plugin Label:*} $current_line] == 1} {    
	set parameters 0
	regsub {Plugin Label: "} $current_line {} plugin_label
	regsub {"} $plugin_label {} plugin_label
	set effect_param(ladspa_$plugin_label) 0
	set effect_index($index) "ladspa_$plugin_label" 
	incr index
	set past_line [lindex $exec_out3 [expr $n-1]]
	regsub {Plugin Name: "} $past_line {} plugin_name
	regsub {"} $plugin_name {} effect_name(ladspa_$plugin_label)
 	set n [expr $n+2]
	set current_line [lindex $exec_out3 $n]	
	regsub {Maker: "} $current_line {} plugin_maker
	regsub {"} $plugin_maker {}  effect_maker(ladspa_$plugin_label)
	incr n
	set current_line [lindex $exec_out3 $n]	
	regsub {Copyright: "} $current_line {} plugin_copy
	regsub {"} $plugin_copy {}  effect_copy(ladspa_$plugin_label)
	set n [expr $n+6]
	set current_line [lindex $exec_out3 $n]	
    }	
    
    if {[string match {Ports:*} $current_line] == 1 || $parameters == 1} {
	set parameters 1
	if {[string match {*control,*} $current_line] == 1 } {
	    if {[string match *ERROR:* $current_line ] == 1 || [string match *toggled* $current_line ] == 1} {
		incr effect_param(ladspa_$plugin_label)
		set effect_param_to(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 1
		set effect_param_from(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 0
		set effect_param_resolution(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 1
		set effect_param_value(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 0
	    }
	    if {[string match *srate* $current_line] == 1 } {
		regsub -all {\*srate} $current_line {} current_line
		set srate 1
	    }
	    if {[regexp -all {([-+.0-9]+)( to)} $current_line param_from] == 1} {
	    	incr effect_param(ladspa_$plugin_label)
		regsub -all { to} $param_from {} effect_param_from(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))
		set effect_param_value(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) $effect_param_from(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))
	    } 
	    if {[regexp -all {(\")([(= ),&+-?/%A-Za-z0-9]+)(\")} $current_line param_name] == 1} {
		regsub -all {\"} $param_name {} effect_param_name(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))
	    }

	    if {[regexp -all {(to )([-+.0-9]+)} $current_line param_to] == 1} {
		regsub -all {to } $param_to {} effect_param_to(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))
		if {[string match {*integer*} $current_line]} {set effect_param_resolution(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 1} else {
		    set effect_param_resolution(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 0
	    }
	    if {[string match {*logarithmic*} $current_line] == 1} {
		    set effect_param_resolution(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 100	    
	    }
	    if {[string match *...* $effect_param_to(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))] == 1} {	
		    set effect_param_to(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 10000
		    set effect_param_resolution(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 100	    	
	    }
	    if {[string match *...* $effect_param_from(ladspa_$plugin_label$effect_param(ladspa_$plugin_label))] == 1} {	
		    set effect_param_from(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 10000	
		    set effect_param_resolution(ladspa_$plugin_label$effect_param(ladspa_$plugin_label)) 100	    	
	    }
	    if {$srate==1} {
		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]
		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] 
	    }
	} 
	}
    }

}
ladspa_loading_window
set eca_effects [expr $index - 1]
}

proc solo_unsolo {} {
    global stop_command mfe track_num playhandle solo_tracks number_of_tracks w w2 
    if {$solo_tracks==0} {
	set solo_tracks 1
	set mfe(prev_track_status$track_num) $mfe(track_status$track_num)    
	if {$mfe(track_status$track_num)=="Mute"} {
	    if {$stop_command==0} {
		puts $playhandle "c-select $track_num\nc-muting"
	    }
	}
	for {set n 1} {$n <= $number_of_tracks} {incr n} {
	    puts "4.4.2 $w.play$n configure -state disabled"
	    $w.track$track_num.play configure -state disabled
    	    if {$n!=$track_num} {
		set mfe(prev_track_status$n) $mfe(track_status$n)    
		if {$stop_command==0 && $mfe(track_status$n)=="Play"} {
		    puts $playhandle "c-select $n\nc-muting"
		}
		set mfe(track_status$n) "Mute"
	    } else { 
		set mfe(track_status$n) "Play"
	    }
	}
    } elseif {$solo_tracks==1 && $mfe(track_solo$track_num)=="No Solo"} {
	set solo_tracks 0
	for {set n 1} {$n <= $number_of_tracks} {incr n} {
	    $w.track$track_num.play configure -state normal
    	    if {$mfe(track_status$n)!=$mfe(prev_track_status$n)} {
		if {$stop_command==0} {
		    puts $playhandle "c-select $n\nc-muting"
		}
		set mfe(track_status$n) $mfe(prev_track_status$n)
	    }
	}
    } else {
        if {$mfe(track_solo$track_num)=="Solo"} {
	    incr solo_tracks
	    set mfe(track_status$track_num) "Play"
	} else {
	    set solo_tracks [expr $solo_tracks-1]
	    set mfe(track_status$track_num) "Mute"
	}
	if {$stop_command==0} {
	    puts $playhandle "c-select $track_num\nc-muting"
	}
    }
}

proc unsolo_all {} {
    global stop_command mfe track_num playhandle solo_tracks number_of_tracks w
    if {$solo_tracks==0} {return}
    for {set n 1} {$n <= $number_of_tracks} {incr n} {
	$w.track$n.play configure -state normal
	if {$mfe(track_solo$n)=="Solo"} {
	    if {$mfe(prev_track_status$n)=="Mute" && $stop_command==0} {
		puts $playhandle "c-select $n\nc-muting"
	    }
	} else {
	    if {$mfe(prev_track_status$n)=="Play" && $stop_command==0} {
		puts $playhandle "c-select $n\nc-muting"
	    }
	}
    	set mfe(track_status$n) $mfe(prev_track_status$n)
	set mfe(track_solo$n) "No Solo"
#	$w.play$n configure -state normal
    }
    set solo_tracks 0
}

proc delete_current_track {} {   
    global mfe track_num w
    unsolo_all
    set w2 "$w.track$track_num"
    set mfe(track_status$track_num) "Deleted"
    destroy $w2.number$track_num 
    destroy $w2.delete$track_num  
    destroy $w2.file$track_num 
    destroy $w2.open$track_num 
    destroy $w2.track_properties$track_num 
    destroy $w2.dev_text$track_num  
    destroy $w2.dev_entry$track_num  
    destroy $w2.chn_text$track_num  
    destroy $w2.chn_entry$track_num  
    destroy $w2.solo$track_num 
    destroy $w2.play$track_num 
    destroy $w2.rec$track_num  
    destroy $w2.effect$track_num 
    destroy $w2.eca_tools$track_num 
    destroy $w2.pan$track_num 
    destroy $w2.slide$track_num 
    destroy $w2
}

proc add_track {} {
    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
    
    set bgcolor3 AntiqueWhite2
    .mfe.up1.save configure -state normal
    .mfe.up1.saveas configure -state normal
    .mfe.up2.exportecs configure -state normal
    .mfe.up2.mixdown configure -state normal

    set number_of_tracks [expr $number_of_tracks-1]
    unsolo_all

    incr number_of_tracks
    set n $number_of_tracks
    if {$mfe(track_status$n)=="Deleted"} {return}
    set mfe(prev_track_status$n) "Play"
    set mfe(track_status$n) "Play"
#    set mfe(track_status$n) "Play"
#    set mfe(rec_prop_bits$n) "s16_le"
#    set mfe(rec_prop_channels$n) "1"
#    set mfe(rec_prop_srate$n) "44100"
#    set mfe(rec_prop_interl$n) "i"
#    set mfe(volume$n) 100
#    set mfe(pan$n) 50
#    set mfe(device$n) "/dev/dsp"
#    set mfe(chn$n) "n/a"
set mfe(volume_position$n) 1    
set mfe(pan_position$n) 2
set number $n
set mfe(track_solo$n) "No Solo"
#    set mfe(track_rec_status$n) "No"
#    set mfe(track_status$n) "Play"

    	.mfe.tracks.canvas config -scrollregion "0 0 0 [expr $number_of_tracks *30]"
    	if {$n < 10} {set number "0$n"}
	set w2 $w
	set w "$w.track$n"
	frame $w -width 780 -bd 2 -relief ridge
	entry $w.number -bg White -width 5 -textvariable mfe(track_name$n)
	button $w.delete -text "Del" -padx 1 -command "
	set track_num $n 
	delete_current_track"
	entry $w.file -bg White -width 12 -textvariable mfe(file$n)
	button $w.open -font $mt_font -text ... -padx 1 -command "
	set track_num $n 
	set types {{{Wav files} {*.wav}} {{mp3 files} {*.mp3}} {{raw files} {*.raw}} {{MIDI files} {*.mid}} {{MIDI files} {*.midi}} {{Modules files} {*.mod}} {{efw files} {*.efw}} {{all} {*}}}
	file_browser"
	button $w.track_properties -text "P" -relief raised -padx 1 -command "
	set track_num $n 
	set mixdown 0
	rec_properties"

	menubutton $w.dev_text -text "D" -relief raised -padx 1 -menu $w.dev_text.type
	menu $w.dev_text.type -tearoff 0
		$w.dev_text.type add radiobutton -label Default -variable mfe(device$n) -value "Default"
		$w.dev_text.type add radiobutton -label alsa,hw:0 -variable mfe(device$n) -value "alsa,hw:0"
		$w.dev_text.type add radiobutton -label alsa,hw:1 -variable mfe(device$n) -value "alsa,hw:1"
		$w.dev_text.type add radiobutton -label alsa,hw:2 -variable mfe(device$n) -value "alsa,hw:2"
		$w.dev_text.type add radiobutton -label alsa,hw:3 -variable mfe(device$n) -value "alsa,hw:3"
		$w.dev_text.type add radiobutton -label alsaplugin,0 -variable mfe(device$n) -value "alsaplugin,0"
		$w.dev_text.type add radiobutton -label alsaplugin,1 -variable mfe(device$n) -value "alsaplugin,1"
		$w.dev_text.type add radiobutton -label alsaplugin,2 -variable mfe(device$n) -value "alsaplugin,2"
		$w.dev_text.type add radiobutton -label alsaplugin,3 -variable mfe(device$n) -value "alsaplugin,3"
		$w.dev_text.type add radiobutton -label jack,system -variable mfe(device$n) -value "jack,system"
		$w.dev_text.type add radiobutton -label /dev/dsp -variable mfe(device$n) -value "/dev/dsp"
		$w.dev_text.type add radiobutton -label /dev/dsp1 -variable mfe(device$n) -value "/dev/dsp1"
		$w.dev_text.type add radiobutton -label /dev/dsp2 -variable mfe(device$n) -value "/dev/dsp2"
		$w.dev_text.type add radiobutton -label /dev/dsp3 -variable mfe(device$n) -value "/dev/dsp3" 

	entry $w.dev_entry -width 8 -bg White -textvariable mfe(device$n)
	
	menubutton $w.chn_text -text "Ch" -relief raised -padx 1 -menu $w.chn_text.type
	menu $w.chn_text.type -tearoff 0
		$w.chn_text.type add radiobutton -label n/a -variable mfe(chn$n) -value "n/a"
		$w.chn_text.type add radiobutton -label 1 -variable mfe(chn$n) -value "1"
		$w.chn_text.type add radiobutton -label 2 -variable mfe(chn$n) -value "2"
		$w.chn_text.type add radiobutton -label 3 -variable mfe(chn$n) -value "3"
		$w.chn_text.type add radiobutton -label 4 -variable mfe(chn$n) -value "4"
		$w.chn_text.type add radiobutton -label 5 -variable mfe(chn$n) -value "5"
		$w.chn_text.type add radiobutton -label 6 -variable mfe(chn$n) -value "6"
		$w.chn_text.type add radiobutton -label 7 -variable mfe(chn$n) -value "7"
		$w.chn_text.type add radiobutton -label 8 -variable mfe(chn$n) -value "8"
		$w.chn_text.type add radiobutton -label 9 -variable mfe(chn$n) -value "9"
		$w.chn_text.type add radiobutton -label 10 -variable mfe(chn$n) -value "10"
		$w.chn_text.type add radiobutton -label 11 -variable mfe(chn$n) -value "11"
		$w.chn_text.type add radiobutton -label 12 -variable mfe(chn$n) -value "12"
		$w.chn_text.type add radiobutton -label 13 -variable mfe(chn$n) -value "13"
		$w.chn_text.type add radiobutton -label 14 -variable mfe(chn$n) -value "14"
		$w.chn_text.type add radiobutton -label 15 -variable mfe(chn$n) -value "15"
		$w.chn_text.type add radiobutton -label 16 -variable mfe(chn$n) -value "16"
	
	entry $w.chn_entry -width 3 -bg White -textvariable mfe(chn$n)
	
	checkbutton $w.solo -width 1 -text "S" -variable mfe(track_solo$n) -onvalue "Solo" -offvalue "No Solo" -padx 0 -command "
	set track_num $n
	solo_unsolo"
	checkbutton $w.play -width 1 -text "M" -variable mfe(track_status$n) -onvalue "Mute" -offvalue "Play" -padx 0 -command "
	set track_num $n
	mute_unmute"
	checkbutton $w.rec -width 1 -text "R" -variable mfe(track_rec_status$n)  -onvalue "Yes" -offvalue "No" -padx 0

	menubutton $w.effect -text "E" -relief raised -padx 1 -menu $w.effect.type
	menu $w.effect.type -tearoff 0

	for {set en 1} {$en <= 8} {incr en} {
	    if {$prev_loaded_file == 0} {
		set mfe(effect$en$n) "None"
		set mfe_temp(effect$en$n) "None"
		set mfe(effect_attached$en$n) "Bypassed"
		set effect_fg "gray40"
	    } else {
	    	set mfe_temp(effect$en$n) $mfe(effect$en$n)
		if {$mfe(effect_attached$en$n)=="Bypassed"} {
		    set effect_fg "gray40"
		} else {
		    set effect_fg "black"
		}
	    }
	    if {$mfe(effect$en$n)=="None"} {
		set effect_name_current "Effect $en"
		set effect_fg2 "gray40"
	    } else {
		set effect_name_current $effect_name($mfe_temp(effect$en$n))
		set effect_fg2 "black"
	    }

	    $w.effect.type add cascade -label $effect_name_current -foreground $effect_fg -menu $w.effect.type.$en
		    menu $w.effect.type.$en -tearoff 0
		    $w.effect.type.$en add command -label "Add a New Effect" -command "
			set effect_num $en
			set track_num $n
			set edit_effect 0
    			effect_list"
		    $w.effect.type.$en add command -label "Edit Current Effect" -foreground $effect_fg2 -command "
			set effect_num $en
			set track_num $n
			set edit_effect 1
			effect"
		    $w.effect.type.$en add command -label "Connect/Bypass" -foreground $effect_fg2 -command "
		    	set effect_num $en
			set track_num $n
			effect_bypass	
		    "
		    $w.effect.type.$en add command -label "Delete Effect" -foreground $effect_fg2 -state disabled -command "
			set effect_num $en
			set track_num $n
			delete_effect"
	
#	$w.effect$n.type entryconfigure $en -foreground $effect_fg

	if { $mfe(effect$en$n) != "None"} {
	      $w.effect.type.$en entryconfigure 1 -foreground black 
	      $w.effect.type.$en entryconfigure 2 -foreground black  
	      $w.effect.type.$en entryconfigure 3 -foreground black -state normal  
	      .mfe.tracks.canvas.f.track$n.effect.type.$en entryconfigure 0 -label $mfe(effect_attached$en$n) -state disabled -foreground gray40
	    }
	}    
	set prev_loaded_file 0
	menubutton $w.eca_tools -text "T" -relief raised -padx 1 -menu $w.eca_tools.type
	menu $w.eca_tools.type -tearoff 0
	$w.eca_tools.type add command -label "Normalize" -command "
	set track_num $n
	ecanormalize"
	$w.eca_tools.type add command -label "DC Offset Fix" -command "
	set track_num $n
	ecafixdc"
	$w.eca_tools.type add command -label "Wave Edit" -command "
	set track_num $n
	wave_edit"
	$w.eca_tools.type add command -label "Wave File Delete" -command "
	set track_num $n
	wave_file_delete"

	scale $w.pan -resolution 1 -from 0 -to 100 -length 130 -width 2 -orient horizontal -showvalue true -variable mfe(pan$n) -command "
	set track_num $n
	set mfe(param_number) 1
	set mfe(param_value) pan$n
	change_pan_on_the_fly  
	set mfe(pan$n)"
	scale $w.slide -resolution 1 -from 0 -to 400 -length 200 -width 2 -orient horizontal -showvalue true -variable mfe(volume$n) -command "
	set track_num $n
	set mfe(param_number) 1
	set mfe(param_value) volume$n
	change_volume_on_the_fly  
	set mfe(volume$n)"

	pack $w.number -expand 1 -fill both -side left
	pack $w.delete -fill y -side left 
	pack $w.file -expand 1 -fill both -side left 
	pack $w.open -side left -fill y
	pack $w.track_properties -fill y -side left 
	pack $w.dev_text -fill y -side left 
	pack $w.dev_entry -fill y -side left 
	pack $w.chn_text -fill y -side left 
	pack $w.chn_entry -fill y -side left 
	pack $w.solo -fill y -side left 
	pack $w.play -fill y -side left 
	pack $w.rec -fill y -side left 
	pack $w.effect -fill y -side left 
	pack $w.eca_tools -fill y -side left 
	pack $w.pan -expand yes -fill both -side left 
	pack $w.slide -expand yes -fill both -side left
	pack $w -expand yes -fill both -side top
#	pack $w.button -fill both -expand 1 -side left
#	pack $w -fill both -expand 1 -side top
    
	set w $w2
}

proc effect {} {
    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
    if {[winfo exists .effect$effect_num$track_num] != 0} {destroy .effect$effect_num$track_num}
    set effect_label $mfe_temp(effect$effect_num$track_num)
    set w2 $w
    set w "$w.track$track_num"
    if {$effect_label=="pn:metronome"} {
	set mfe(track_status$track_num) "Play"
	set mfe(track_rec_status$track_num) "No"
	if {$mfe(file$track_num)=="" || $mfe(file$track_num)=="(Wave File)"} {set mfe(file$track_num) "null"}
    }
    if { $mfe_temp(effect$effect_num$track_num) == "None"} {
	set mfe(effect$effect_num$track_num) $mfe_temp(effect$effect_num$track_num)
	$w.effect.type.$effect_num entryconfigure 1 -foreground gray40
	$w.effect.type.$effect_num entryconfigure 2 -foreground gray40
	$w.effect.type.$effect_num entryconfigure 3 -foreground gray40
	set w $w2
	return
    } else {
	$w.effect.type.$effect_num entryconfigure 1 -foreground black 
	$w.effect.type.$effect_num entryconfigure 2 -foreground black  
	$w.effect.type.$effect_num entryconfigure 3 -foreground black -state normal  
    }
    set effect_label $mfe_temp(effect$effect_num$track_num)
    set effect_menu_order [expr $effect_num-1]
    $w.effect.type entryconfigure $effect_menu_order -menu $w.effect.type.$effect_num -label $effect_name($mfe_temp(effect$effect_num$track_num))    
    set w $w2    
    toplevel .effect$effect_num$track_num
    wm title .effect$effect_num$track_num "$mfe(track_name$track_num) --- Effect: $effect_name($mfe_temp(effect$effect_num$track_num)) Window"
    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))"
    pack .effect$effect_num$track_num.out -expand yes -fill both    

    if { $mfe(effect$effect_num$track_num) != $mfe_temp(effect$effect_num$track_num) || $edit_effect==0 } {
	set mfe(effect$effect_num$track_num) $mfe_temp(effect$effect_num$track_num)
	for {set n 1} {$n <= $effect_param($effect_label)} {incr n} {	    
	    set mfe(effect_parameter$n$effect_num$track_num) $effect_param_value($effect_label$n)
	    set mfe_temp2(effect_parameter$n$effect_num$track_num) $effect_param_value($effect_label$n)
	}
    } else {
	for {set n 1} {$n <= $effect_param($effect_label)} {incr n} {	    
	    set effect_param_value($effect_label$n) $mfe(effect_parameter$n$effect_num$track_num)
	    set mfe_temp2(effect_parameter$n$effect_num$track_num) $effect_param_value($effect_label$n)
	}
    }
    set mfe(effect_parameters$effect_num$track_num) $effect_param($effect_label)
    for {set n 1} {$n <= $effect_param($effect_label)} {incr n} {
	set res [expr ($effect_param_to($effect_label$n)-$effect_param_from($effect_label$n))/100]
	set res [expr abs($res)]
	set logarithmic 0
	if {$effect_param_resolution($effect_label$n) != 0 } {set res $effect_param_resolution($effect_label$n)}
	if {$effect_param_resolution($effect_label$n) == 100 } {
	    set res [expr ($effect_param_to($effect_label$n)-$effect_param_from($effect_label$n))/10000]
	    set res [expr abs($res)]
	    set logarithmic 1
	}
	set position "effect_parameter$n$effect_num$track_num"
	frame .effect$effect_num$track_num.$n
	label .effect$effect_num$track_num.$n.param_name$n -width 30 -text "$effect_param_name($effect_label$n): " -justify left
	entry .effect$effect_num$track_num.$n.param_value$n -width 5 -justify left -relief flat -textvariable mfe($position)
	pack .effect$effect_num$track_num.$n.param_name$n -side left 
	pack .effect$effect_num$track_num.$n.param_value$n -side left 

	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 "
	set position effect_parameter$n$effect_num$track_num
	log
	set track_num $track_num
	set effect_number $effect_num 
	# set mfe(controller_number) [expr $effect_num+2]
	set mfe(param_number) $n
	set mfe(param_value) $position
	change_controller_on_the_fly  
	set mfe_temp2($position)" 
	pack .effect$effect_num$track_num.$n.param$n -expand 1 -fill x -side right
#	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
	pack .effect$effect_num$track_num.$n -expand 1 -fill x -side top
    }

    frame .effect$effect_num$track_num.buttons -bd 6
    button .effect$effect_num$track_num.buttons.close -text Close -command "
	set effect2 $effect_num
	set track $track_num
	close_effect
    "

    button .effect$effect_num$track_num.buttons.preview -text " Preview " -height 0 -command { 
    if {$stop_command == 1} { 
	set stop_command 0
	set preview 1
	set effect2 "$effect_num"
	set track "$track_num"
	preview}
    } 
    button .effect$effect_num$track_num.buttons.full_preview -text " Full Preview " -height 0 -command { 
    if {$stop_command == 1} { 
	set stop_command 0
	set preview 2
	set track "$track_num"
	preview }
    } 
    button .effect$effect_num$track_num.buttons.stop -text " Stop " -height 0 -command { 
	if {$stop_command == 0} { 
	    set play_text "Play"
	    stop
	}
    } 

    button .effect$effect_num$track_num.buttons.info -text "Info " -command {
    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))"
    messages [format $plugin_info]    
    }
     
    pack .effect$effect_num$track_num.buttons.preview -side left -expand 1 -fill x
    pack .effect$effect_num$track_num.buttons.full_preview -side left -expand 1 -fill x
    pack .effect$effect_num$track_num.buttons.stop -side left -expand 1 -fill x
    pack .effect$effect_num$track_num.buttons.close -side left -expand 1 -fill x
    pack .effect$effect_num$track_num.buttons.info -side left -expand 1 -fill x
    pack .effect$effect_num$track_num.buttons -in .effect$effect_num$track_num -side top -expand 1 -fill both
    
}

proc delete_effect {} {

global mfe mfe_temp track_num effect_num w
    set mfe(effect$effect_num$track_num) "None"
    set mfe_temp(effect$effect_num$track_num) "None"
    set effect_order [expr $effect_num-1]
    .mfe.tracks.canvas.f.track$track_num.effect.type entryconfigure $effect_order -label "Effect $effect_num" -foreground gray40
    .mfe.tracks.canvas.f.track$track_num.effect.type.$effect_num entryconfigure 0 -label "Add a New Effect" -state normal -foreground black
    .mfe.tracks.canvas.f.track$track_num.effect.type.$effect_num entryconfigure 3 -state disabled
    set mfe(effect_attached$effect_num$track_num) "Connected"
    if {[winfo exists .effect$effect_num$track_num] != 0} {destroy .effect$effect_num$track_num}
    effect_bypass
    #effect
}

proc effect_bypass {} {
    global mfe mfe_temp track_num effect_num playhandle stop_command effect_param w
    if {$mfe(effect$effect_num$track_num)=="None" && $mfe_temp(effect$effect_num$track_num)=="None"} {return}
    set effect_order_number [expr $effect_num-1]
    if {$stop_command==1} {
    effect_bypass2
    return}
    if {$mfe(effect_attached$effect_num$track_num)=="Connected"} {
	set mfe(effect_attached$effect_num$track_num) "Bypassed"
	$w.track$track_num.effect.type entryconfigure $effect_order_number -foreground gray40
#	$w.effect$track_num.type.$effect_num entryconfigure 4 -label "Bypassed"
	puts $playhandle "c-select $track_num\n"
	puts $playhandle "cop-select $mfe(effect_position$effect_num$track_num)\n"
	puts $playhandle "cop-remove\n"
	set mfe(number_of_effects$track_num) [expr $mfe(number_of_effects$track_num)-1]
	set start [expr $mfe(effect_position$effect_num$track_num)-$mfe(pan_position$track_num)]
	for {set enb $start} {$enb <= 8} {incr enb} {	
	    set mfe(effect_position$effect_num$track_num) [expr $mfe(effect_position$effect_num$track_num)-1]
	}
    } else {
    	set mfe(effect_attached$effect_num$track_num) "Connected"
	$w.track$track_num.effect.type entryconfigure $effect_order_number -foreground black
#	$w.effect$track_num.type.$effect_num entryconfigure 4 -label "Connected"
	set effect_to_add ""
	if {[string match ladspa* $mfe(effect$effect_num$track_num)]==1} {
	    regsub ladspa_ $mfe(effect$effect_num$track_num) {} current_effect
	    set effect_to_add "-el:$current_effect,"
	} else {
	    set effect_to_add "-$mfe(effect$effect_num$track_num):"
	}	
	for {set par 1} {$par <= $effect_param($mfe(effect$effect_num$track_num))} {incr par} { 
	    if {$par>1} {set effect_to_add "$effect_to_add,"}
	    set effect_to_add "$effect_to_add$mfe(effect_parameter$par$effect_num$track_num)"
	}
	puts $playhandle "c-select $track_num\n"
	puts $playhandle "cop-add $effect_to_add\n"
	incr mfe(number_of_effects$track_num)
	set mfe(effect_position$effect_num$track_num) [expr $mfe(number_of_effects$track_num)+$mfe(pan_position$track_num)]
    }
}

proc effect_bypass2 {} {
    global mfe track_num effect_num stop_command effect_param w
    set w2 $w
    set w "$w.track$track_num"
    set effect_order_number [expr $effect_num-1]
    if {$mfe(effect_attached$effect_num$track_num)=="Connected"} {
	set mfe(effect_attached$effect_num$track_num) "Bypassed"
	$w.effect.type entryconfigure $effect_order_number -foreground gray40
	$w.effect.type.$effect_num entryconfigure 0 -label "Bypassed" -state disabled
    } else {
    	set mfe(effect_attached$effect_num$track_num) "Connected"
	$w.effect.type.$effect_num entryconfigure 0 -label "Connected" -state disabled
	$w.effect.type entryconfigure $effect_order_number -foreground black
    }
    set w $w2
}

proc file_browser {} {
    global mfe n types track_num track_num2 file_num numbre_of_tracks
    if {$mfe(directory)==""} {set mfe(directory) "."}
    if {$track_num == 0} {
	set mfe(openfile0) [tk_getOpenFile -initialdir $mfe(directory) -filetypes $types]
	open_file
    } else {
	set mfe(file$track_num) [tk_getOpenFile -initialdir $mfe(directory) -filetypes $types]
	if {$mfe(file$track_num) != "" && $mfe(file$track_num) != "(Wave File)"} {
	    set mfe(track_status$track_num) "Play"
	}
    }
}

proc file_browser2 {} {
    global mfe n types track_num save_as
    set save_as 1
    if {$mfe(directory)==""} {set mfe(directory) "."}
    set mfe(openfile$track_num) [tk_getSaveFile -initialdir $mfe(directory) -filetypes $types]
}

proc wave_file_delete {} {
    global track_num mfe
    if {[winfo exists .wave_file_delete] != 0} {destroy .wave_file_delete}
    toplevel .wave_file_delete 
    wm title .wave_file_delete "Wave File Delete Warning!"
    message .wave_file_delete.out  -width 300 -text "Are you sure you want to delete\nfile Track $track_num" 
    button .wave_file_delete.button1 -text Cancel -command {destroy .wave_file_delete}
    button .wave_file_delete.button2 -text Ok -command { 
	if {[file exists $mfe(file$track_num)]==1} {
	    file delete $mfe(file$track_num)
	}
	destroy .wave_file_delete
	messages [format "File $mfe(file$track_num) DELETED!"]
    }
    pack .wave_file_delete.out 
    pack .wave_file_delete.button1 -padx 30 -side left 
    pack .wave_file_delete.button2 -padx 30

}

proc move_to_locate {} {
        global sp_minutes sp_seconds sp_seconds2 locate_name sp_minutes_loc sp_seconds_loc playhandle stop_command time_format start_time start_time2
    if {$stop_command==0} {
	if {$time_format=="Minutes"} {
	    set target_time [expr $sp_minutes_loc($locate_name)*60+$sp_seconds_loc($locate_name)]
	} else {
	    set target_time $sp_seconds_loc($locate_name)
	}
	set sp_minutes $sp_minutes_loc($locate_name)
	set sp_seconds $sp_seconds_loc($locate_name)
	set sp_seconds2 $sp_seconds_loc($locate_name)
	puts $playhandle "setpos $target_time"
	set start_time2 [clock clicks -milliseconds]
	tick
    } else {
	set sp_minutes $sp_minutes_loc($locate_name)
	set sp_seconds $sp_seconds_loc($locate_name)
	display_position
    }
}

proc tick {} {
    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
    if {$stop_command==1} {return}
    after 50 tick
    set elapsedMS [expr {[clock clicks -milliseconds] - $start_time2} - 250]
    set sp_seconds [expr $sp_seconds2 + {double($elapsedMS)/1000}]
    if {$sp_seconds >= 60 && $time_format=="Minutes"} {
	set start_time2 [expr $start_time2+60000+$sp_seconds2]
	set sp_minutes [expr $sp_minutes+1]
    }
    display_position
#    if {$stop_command==3} {
#	set stop_command 1
#	set stop_command 3    }
}

proc display_position {} {
    global sp_minutes sp_seconds time_format
    .mfe.low.seconds config  -text [format "%.2f" $sp_seconds]
    if {$time_format=="Minutes"} {
	.mfe.low.minutes config  -text [format "%02d" $sp_minutes]
    }
}

proc mute_unmute {} {
    global stop_command mfe track_num playhandle
    
    if {$stop_command==0} {
	    puts $playhandle "c-select $track_num\nc-muting"
    }
}

proc change_controller_on_the_fly {} {
    global stop_command mfe track_num effect_number playhandle preview
#    set mfe(controller_number) [expr $mfe(controller_number)+$mfe(volume_position$track_num)]
    
    if {$stop_command==0} {
	if {$preview==1} {
	    puts $playhandle "c-select $track_num\ncop-select $mfe(effect_position1$track_num) \ncopp-select $mfe(param_number)\ncopp-set $mfe($mfe(param_value))"
	} else {
	    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))"
	}
    }
}

proc change_volume_on_the_fly {} {
    global stop_command mfe track_num effect_number playhandle
    
    if {$stop_command==0} {
    	    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]"
    }
}

proc change_pan_on_the_fly {} {
    global stop_command mfe track_num effect_number playhandle
    
    if {$stop_command==0} {
	    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)"
    }
}

proc stop {} {
    global stop_command playhandle punch punch_y punch_t sp_minutes2 sp_seconds2 number_of_tracks mfe start_time w
    puts $playhandle "s\n"
    puts $playhandle "dump-position \n"
    puts $playhandle "q\n"
    set stop_command 1
    fileevent $playhandle writable read_stop_position
    for {set n 1} {$n <= $number_of_tracks} {incr n} {
	  if {$mfe(track_status$n)!= "Deleted"} {
	    $w.track$n.rec configure -state normal
	    $w.track$n.delete configure -state normal
	    $w.track$n.file configure -state normal
	    $w.track$n.open configure -state normal
	    $w.track$n.track_properties configure -state normal
	    $w.track$n.dev_text configure -state normal
	    $w.track$n.dev_entry configure -state normal
	    $w.track$n.chn_text configure -state normal
	    $w.track$n.chn_entry configure -state normal
	    $w.track$n.eca_tools configure -state normal
	  }
    }
    .mfe.up1.button configure -state normal
    .mfe.up2.mixdown configure -state normal
#    .mfe.up2.metronome configure -state normal
    .mfe.up2.addtrack configure -state normal
    .mfe.up2.del_all_tracks configure -state normal
    .mfe.up2.quit configure -state normal
    .mfe.low.multich2 configure -state normal
#    .mfe.low.rew_to_begin configure -state normal
#    .mfe.low.rew_5 configure -state normal
#    .mfe.low.forw_5 configure -state normal


    if {$punch==2} { 
        set punch 0
	for {set n 1} {$n <= $number_of_tracks} {incr n} {
	    if {$mfe(track_rec_status$n)=="Yes"} {    

		if {$mfe(latency)!=0} { 
		    set latency_seconds [expr $mfe(latency)/1000]
    	            set cmd2 "exec [list ecasound -i:$mfe(temp_file$n) -y:$latency_seconds -o:$mfe(temp_file$n)]"		
		    catch {eval $cmd2} exec_out
		}
		
		set cmd "exec [list ecasound -i:$mfe(temp_file2$n) $punch_t -o:$mfe(file$n) $punch_y $punch_t ]"
		catch {eval $cmd} exec_out
		set total_punch_out [expr $mfe(punch_out_minutes)*60+$mfe(punch_out_seconds)]
		set total_punch_in [expr $mfe(punch_in_minutes)*60+$mfe(punch_in_seconds)]
		if {$start_time>$total_punch_in} { 
		    if {$start_time<$total_punch_out} { 
			set real_proc_time [expr $start_time-$total_punch_in]		    
			set punch_t "-t:$real_proc_time"
		    }
		    set cmd2 "exec [list ecasound -i:$mfe(temp_file$n) $punch_y $punch_t -o:$mfe(file$n) $punch_y $punch_t ]"		
		    catch {eval $cmd2} exec_out
		}
	    }
	    file delete $mfe(temp_file$n)
	    file delete $mfe(temp_file2$n)
	}
    } else {
    
	if {$mfe(latency)!=0} { 
	    set latency_seconds [expr $mfe(latency)/1000]
    	    for {set n 1} {$n <= $number_of_tracks} {incr n} {
		if {$mfe(track_rec_status$n)=="Yes"} {    
		    set cmd2 "exec [list ecasound -i:$mfe(file$n) -y:$latency_seconds -o:$mfe(file$n)]"		
		    catch {eval $cmd2} exec_out
		}
	    }
	}
    }

}

proc read_stop_position {} {
    global sp_seconds sp_minutes sp_seconds2 sp_minutes2 playhandle start_time mfe
    close $playhandle
    set tkeca_log [open "~/tkeca.log" r]
    while {[gets $tkeca_log input_line]!= -1} {
	if {[string match dump-position* $input_line] ==1} {
	    regsub dump-position $input_line {} input_line
	    regsub { } $input_line {} start_time 
	    set sp_minutes2 [expr int($start_time/60)]
	    set sp_seconds2 [expr $start_time-60*$sp_minutes]
	    if {[expr $sp_seconds+$sp_minutes*60-$start_time] < 1} {
		set sp_minutes [expr int($start_time/60)]
		set sp_seconds [expr $start_time-60*$sp_minutes]
	    } else {
		set sp_minutes 0
		set sp_seconds 0
	    }
	display_position    
	}
    }
    close $tkeca_log
}

proc messages {msg} {
    if {[winfo exists .msg] != 0} {destroy .msg}
    toplevel .msg 
    wm title .msg "Tkeca Message"
    message .msg.out  -width 300 -text $msg
    button .msg.button -text Ok -command {destroy .msg}
    pack .msg.out -expand 1 -fill x
    pack .msg.button
}

proc ecanormalize {} {
    global mfe track_num
    if {[winfo exists .normalize] != 0} {destroy .normalize}
    toplevel .normalize 
    wm title .normalize "Normalize Warning!"
    message .normalize.out  -width 300 -text "Are you sure you want to Normalize\nfiles on Track $track_num" 
    button .normalize.button1 -text Cancel -command {destroy .normalize}
    button .normalize.button2 -text Ok -command { 
	set pointer "file$track_num"
	if {[string length $mfe($pointer)] > 3} { 
	    set cmd "exec ecanormalize $mfe($pointer) &" 
	    catch {eval $cmd} exec_out
	    destroy .normalize
	    messages [format "File $mfe(file$track_num) NORMALIZED!"]
	} else {
	    destroy .normalize
	}
    }
    pack .normalize.out 
    pack .normalize.button1 -padx 30 -side left 
    pack .normalize.button2 -padx 30
}

proc ecafixdc {} {
    global mfe track_num
    if {[winfo exists .fixdc] != 0} {destroy .fixdc}
    toplevel .fixdc 
    wm title .fixdc "Fix DC Warning!"
    message .fixdc.out  -width 300 -text "Are you sure you want to fix DC Offset\nin files on Track $track_num" 
    button .fixdc.button1 -text Cancel -command {destroy .fixdc}
    button .fixdc.button2 -text Ok -command { 
	set pointer "file$track_num"
	if {[string length $mfe($pointer)] > 3} { 
	    set cmd "exec ecafixdc $mfe($pointer) &" 
	    catch {eval $cmd} exec_out
	    destroy .fixdc
#	    messages [format "DC Offset fixed in file\n$mfe(file$track_num)"]
	} else {
	    destroy .fixdc
	}
    }
    pack .fixdc.out 
    pack .fixdc.button1 -padx 35 -side left 
    pack .fixdc.button2 -padx 35
}

proc wave_edit {} {
    global mfe track_num wave_editor file_num
    set pointer "file$track_num"
    set cmd "exec $wave_editor \"$mfe($pointer)\"" 
    catch {eval $cmd} exec_out
}

proc save_file {} {
    global mfe number_of_tracks sp_minutes sp_seconds save_as track_num types sp_minutes_loc sp_seconds_loc
    unsolo_all
    if {$mfe(openfile0) == ""} {
	if {$save_as == 1} {return} else {
	    set types {{{mfe files} {*.mfe}} {{all} {*}}}
	    set track_num 0
	    file_browser2
	    if {$mfe(openfile0) == ""} {return}

	}
    }
    if {[string match *.mfe* $mfe(openfile0)] == 0 && [string match *.MFE* $mfe(openfile0)] == 0} {
	set mfe(openfile0) "$mfe(openfile0).mfe"
    }
    set real_number_of_tracks $number_of_tracks
    for {set n 1} {$n <= $number_of_tracks} {incr n} {
	if {$mfe(track_status$n)=="Deleted"} {
	    set real_number_of_tracks [expr $real_number_of_tracks-1]
	}
    }
    set file_to_save [open "$mfe(openfile0)" w]
    puts $file_to_save "This file was created by tkeca.tcl version 4.4.2"
    puts $file_to_save "$real_number_of_tracks"
    puts $file_to_save "$mfe(directory)"
    puts $file_to_save "$sp_minutes"
    puts $file_to_save "$sp_seconds"
    puts $file_to_save "$mfe(master)"    
    puts $file_to_save "$mfe(multichannel)"    
    puts $file_to_save "$mfe(rec_prop_bits)"
    puts $file_to_save "$mfe(rec_prop_channels)"
    puts $file_to_save "$mfe(rec_prop_srate)"
    puts $file_to_save "$mfe(rec_prop_interl)"
    puts $file_to_save "$mfe(latency)"
    puts $file_to_save "$mfe(mixdown_normalize)"
    puts $file_to_save "$mfe(mixdown_normalize_amp)"
    puts $file_to_save "$mfe(mixdown_normalize_lev)"

    for {set n 0} {$n <= $number_of_tracks} {incr n} {
    if {$mfe(track_status$n)!="Deleted"} {
	puts $file_to_save "$mfe(rec_prop_bits$n)"
	puts $file_to_save "$mfe(rec_prop_channels$n)"
	puts $file_to_save "$mfe(rec_prop_srate$n)"
	puts $file_to_save "$mfe(rec_prop_interl$n)"
	puts $file_to_save "$mfe(track_name$n)"
	puts $file_to_save "$mfe(file$n)"
	puts $file_to_save "$mfe(device$n)"
	puts $file_to_save "$mfe(chn$n)"
	puts $file_to_save "$mfe(track_status$n)"
	puts $file_to_save "$mfe(track_rec_status$n)"
	for {set en 1} {$en <= 8} {incr en} {
	    puts $file_to_save "$mfe(effect$en$n)"
	    puts $file_to_save "$mfe(effect_attached$en$n)"
	    if {$mfe(effect$en$n)!="None"} {
		puts $file_to_save "$mfe(effect_parameters$en$n)"
		for {set p 1} {$p <= $mfe(effect_parameters$en$n)} {incr p} {
		    puts $file_to_save "$mfe(effect_parameter$p$en$n)"		
		}
	    }
	}
	puts $file_to_save "$mfe(volume$n)"
	puts $file_to_save "$mfe(pan$n)"

    }
    }
    
    for {set n 1} {$n <= 16} {incr n} {
    	puts $file_to_save "$sp_minutes_loc($n)"
	puts $file_to_save "$sp_seconds_loc($n)"
    }
	puts $file_to_save "$mfe(punch_in_minutes)"
	puts $file_to_save "$mfe(punch_in_seconds)"
	puts $file_to_save "$mfe(punch_out_minutes)"
	puts $file_to_save "$mfe(punch_out_seconds)"

    puts $file_to_save "\n"
    close $file_to_save	
    messages [format "File $mfe(openfile0) saved"]
}

proc open_file {} {
    global mfe mfe_temp number_of_tracks sp_minutes sp_seconds w sp_minutes_loc sp_seconds_loc prev_loaded_file
    if {$number_of_tracks > 0} {
	del_all_tracks
    }
    if {$mfe(openfile0) == ""} {
	return
    }
    set line_number 0
    set file_to_open [open "$mfe(openfile0)" r]
    while {[gets $file_to_open input_line] != -1 } {
	set temp_file($line_number) $input_line
	incr line_number
    }
    set line_number 0
    set number_of_effects 8
    set tkeca_version $temp_file($line_number)
    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"} { 
	set number_of_effects 4
	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"} {
	    messages [format "File $mfe(openfile0)\nwas not created by tkeca.tcl 3.0.0 or superior"]
	    set mfe(openfile0) ""
	    return	
	}
    }
    incr line_number
#    set number_of_tracks3 $number_of_tracks
    set number_of_tracks $temp_file($line_number)
#    set number_of_tracks2 $number_of_tracks
#    for {set number_of_tracks 1} {$number_of_tracks <= $number_of_tracks3} {incr number_of_tracks} {
#	set w "$w2.track$number_of_tracks"
#	destroy $w.number$number_of_tracks 
#	destroy $w.delete$number_of_tracks 
#	destroy $w.name$number_of_tracks 
#	destroy $w.track_properties$number_of_tracks 
#	destroy $w.wave_info$number_of_tracks 
#	destroy $w.dev_text$number_of_tracks 
#	destroy $w.dev_entry$number_of_tracks 
#	destroy $w.chn_text$number_of_tracks 
#	destroy $w.chn_entry$number_of_tracks 
#	destroy $w.solo$number_of_tracks 
#	destroy $w.play$number_of_tracks 
#	destroy $w.rec$number_of_tracks 
#	destroy $w.effect1$number_of_tracks 
#	destroy $w.effect2$number_of_tracks 
#	destroy $w.effect3$number_of_tracks 
#	destroy $w.effect4$number_of_tracks 
#	destroy $w.eca_tools$number_of_tracks 
#	destroy $w.pan$number_of_tracks 
#	destroy $w.slide$number_of_tracks
#    }
#    set w $w2
#    set number_of_tracks $number_of_tracks2
    incr line_number
    set mfe(directory) $temp_file($line_number)
    incr line_number
    set sp_minutes $temp_file($line_number)
    incr line_number
    set sp_seconds $temp_file($line_number)
    incr line_number
    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"} {
        set mfe(master) $temp_file($line_number)
	incr line_number
    }

    set mfe(multichannel) $temp_file($line_number)
    incr line_number
    
    if {$tkeca_version == "This file was created by tkeca.tcl version 4.4.2"} {
	set mfe(rec_prop_bits) $temp_file($line_number)
	incr line_number
	set mfe(rec_prop_channels) $temp_file($line_number)
	incr line_number
	set mfe(rec_prop_srate) $temp_file($line_number)
	incr line_number
	set mfe(rec_prop_interl) $temp_file($line_number)
	incr line_number
	set mfe(latency) $temp_file($line_number)
	incr line_number
	set $mfe(mixdown_normalize) $temp_file($line_number)	
	incr line_number
	set $mfe(mixdown_normalize_amp) $temp_file($line_number)	
	incr line_number
	set $mfe(mixdown_normalize_lev) $temp_file($line_number)	
	incr line_number
	set l 0
    } else {
	set mfe(rec_prop_bits0) $temp_file($line_number)
	incr line_number
	set mfe(rec_prop_channels0) $temp_file($line_number)
	incr line_number
	set mfe(rec_prop_srate0) $temp_file($line_number)
	incr line_number
	set mfe(rec_prop_interl0) $temp_file($line_number)
	incr line_number
	set l 1
    }
    
    for {set n $l} {$n <= $number_of_tracks} {incr n} {
	set mfe(rec_prop_bits$n) $temp_file($line_number)
	incr line_number
	set mfe(rec_prop_channels$n) $temp_file($line_number)
	incr line_number
	set mfe(rec_prop_srate$n) $temp_file($line_number)
	incr line_number
	set mfe(rec_prop_interl$n) $temp_file($line_number)
	incr line_number
	if {$number_of_effects==4} {
	    set mfe(track_name$n) "Track $n"
	} else {
	    set mfe(track_name$n) $temp_file($line_number)
	    incr line_number
	}
	set mfe(file$n) $temp_file($line_number)
	incr line_number
	set mfe(device$n) $temp_file($line_number)
	incr line_number
	set mfe(chn$n) $temp_file($line_number)
	incr line_number
	set mfe(track_status$n) $temp_file($line_number)
	incr line_number
	set mfe(track_rec_status$n) $temp_file($line_number)
	incr line_number
	for {set en 1} {$en <= $number_of_effects} {incr en} {
	    set mfe(effect$en$n) $temp_file($line_number)
	    set mfe_temp(effect$en$n) $temp_file($line_number)
	    incr line_number
	    if {$number_of_effects==4} {  
		if {$mfe(effect$en$n)!="None"} {
		    set mfe(effect_attached$en$n) "Connected"
		} else {
	    	    set mfe(effect_attached$en$n) "Bypassed"
		}
	    } else {
		set mfe(effect_attached$en$n) $temp_file($line_number)
		incr line_number
	    }
	    if {$mfe(effect$en$n)!="None"} {
		set mfe(effect_parameters$en$n) $temp_file($line_number)
		incr line_number
		for {set p 1} {$p <= $mfe(effect_parameters$en$n)} {incr p} {
		    set mfe(effect_parameter$p$en$n) $temp_file($line_number)  		
		    incr line_number
		}
	    }
	}
	if {$number_of_effects==4} { 
	    set mfe(effect5$n) "None"
	    set mfe(effect_attached5$n) "Bypassed"
	    set mfe(effect6$n) "None"
	    set mfe(effect_attached6$n) "Bypassed"
	    set mfe(effect7$n) "None"
	    set mfe(effect_attached7$n) "Bypassed"
	    set mfe(effect8$n) "None"
	    set mfe(effect_attached8$n) "Bypassed"
	}
	set mfe(volume$n) $temp_file($line_number)
	incr line_number
	set mfe(pan$n) $temp_file($line_number)
	incr line_number
	set line_number2 $line_number
	set prev_loaded_file 1
	set number_of_tracks3 $number_of_tracks
	set number_of_tracks $n
	set n2 $n
#	puts "En open_file w:$w y w2:$w2"
	if {$n!=0} {
	    add_track
	}

	set number_of_tracks $number_of_tracks3
	set n $n2
	set line_number $line_number2
    }

    for {set locn 1} {$locn <= 16} {incr locn} {
    	set sp_minutes_loc($locn) $temp_file($line_number)
	incr line_number
	set sp_seconds_loc($locn) $temp_file($line_number)
	incr line_number
    }
    	set mfe(punch_in_minutes) $temp_file($line_number)
	incr line_number
	set mfe(punch_in_seconds) $temp_file($line_number)
	incr line_number
	set mfe(punch_out_minutes) $temp_file($line_number)
	incr line_number
	set mfe(punch_out_seconds) $temp_file($line_number)
display_position
}

proc track_data_reset {} {
    global mfe track_num
    set mfe(rec_prop_bits$track_num) "Signed 16Bit Little Endian"
    set mfe(rec_prop_channels$track_num) "1"
    set mfe(rec_prop_srate$track_num) "44100"
    set mfe(rec_prop_interl$track_num) "i"
    set mfe(file$track_num) "(Wave File)"
    set mfe(device$track_num) "(I / O Dev.)"
    set mfe(chn$track_num) "n/a"
    set mfe(track_solo$track_num) "No Solo"
    set mfe(track_status$track_num) "Play"
    set mfe(track_rec_status$track_num) "No"
    for {set en 1} {$en <= 8} {incr en} {
	set mfe(effect$en$track_num) "None"
	set mfe_temp(effect$en$track_num) "None" 
	set mfe(effect_attached$en$track_num) "Bypassed"
    }
    set mfe(volume$track_num) 100
    set mfe(pan$track_num) 50
}

proc del_all_tracks {} {
    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
    unsolo_all
    .mfe.up1.save configure -state disabled
    .mfe.up1.saveas configure -state disabled
    .mfe.up2.exportecs configure -state disabled
    .mfe.up2.mixdown configure -state disabled

    set w2 $w
    for {set number_of_tracks1 1} {$number_of_tracks1 <= $number_of_tracks} {incr number_of_tracks1} {
	set w "$w2.track$number_of_tracks1"
	set mfe(track_status$number_of_tracks1) "Deleted"
	destroy $w.number$number_of_tracks1 
	destroy $w.delete$number_of_tracks1 
	destroy $w.file$number_of_tracks1
	destroy $w.open$number_of_tracks1
	destroy $w.track_properties$number_of_tracks1
	destroy $w.dev_text$number_of_tracks1 
	destroy $w.dev_entry$number_of_tracks1 
	destroy $w.chn_text$number_of_tracks1 
	destroy $w.chn_entry$number_of_tracks1 
	destroy $w.solo$number_of_tracks1
	destroy $w.play$number_of_tracks1
	destroy $w.rec$number_of_tracks1 
	destroy $w.effect$number_of_tracks1
	destroy $w.eca_tools$number_of_tracks1
	destroy $w.pan$number_of_tracks1
	destroy $w.slide$number_of_tracks1
	destroy $w
#	set track_num $number_of_tracks1
#	track_data_reset
    }
    set w $w2
    set number_of_tracks 0
    set mfe(openfile0) ""
    set play_command "play"
    set mfe(multichannel) 0
    set mfe(master) 100
    set mfe(rec_prop_bits) "Signed 16Bit Little Endian"
    set mfe(rec_prop_channels) "2"
    set mfe(rec_prop_srate)  "44100"
    set mfe(rec_prop_interl) "i"
    set mfe(rec_prop_bits0) "Signed 16Bit Little Endian"
    set mfe(rec_prop_channels0) "2"
    set mfe(rec_prop_srate0)  "44100"
    set mfe(rec_prop_interl0) "i"
    set mfe(rec_prop_bitsMD) "Signed 16Bit Little Endian"
    set mfe(rec_prop_channelsMD) "2"
    set mfe(rec_prop_srateMD) "44100"
    set mfe(rec_prop_interlMD) "i"
    set sp_minutes 0
    set sp_seconds 0
    set sp_minutes_loc(1) 0
    set sp_minutes_loc(2) 0
    set sp_minutes_loc(3) 0
    set sp_minutes_loc(4) 0
    set sp_minutes_loc(5) 0
    set sp_minutes_loc(6) 0
    set sp_minutes_loc(7) 0
    set sp_minutes_loc(8) 0
    set sp_minutes_loc(9) 0 
    set sp_minutes_loc(10) 0
    set sp_minutes_loc(11) 0
    set sp_minutes_loc(12) 0
    set sp_minutes_loc(13) 0
    set sp_minutes_loc(14) 0
    set sp_minutes_loc(15) 0
    set sp_minutes_loc(16) 0
    set sp_seconds_loc(1) 0
    set sp_seconds_loc(2) 0
    set sp_seconds_loc(3) 0
    set sp_seconds_loc(4) 0
    set sp_seconds_loc(5) 0
    set sp_seconds_loc(6) 0
    set sp_seconds_loc(7) 0
    set sp_seconds_loc(8) 0
    set sp_seconds_loc(9) 0 
    set sp_seconds_loc(10) 0
    set sp_seconds_loc(11) 0
    set sp_seconds_loc(12) 0
    set sp_seconds_loc(13) 0
    set sp_seconds_loc(14) 0
    set sp_seconds_loc(15) 0
    set sp_seconds_loc(16) 0
    
}

proc proc_about {} {
messages [format "Tkeca is a Tcl/Tk frontend for Kai Vehmanen's Ecasound
Copyright (C) 2002-2003  Luis Pablo Gasparotto
This program is free software; you can redistribute it and/or modify \
it under the terms of the GNU General Public License as published by \
the Free Software Foundation; either version 2 of the License, or \
(at your option) any later version.

This program is distributed in the hope that it will be useful, \
but WITHOUT ANY WARRANTY; without even the implied warranty of \
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the \
GNU General Public License for more details.

You should have received a copy of the GNU General Public License \
along with this program; if not, write to the Free Software \
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

To contact me: lpgasparotto@gmail.com"]}

proc proc_exit {} {
    global mfe mfe_temp number_of_tracks sp_minutes sp_seconds sp_minutes_loc sp_seconds_loc saved exit_yes save_as 
    set saved 1
    set line_number 0
    
    if {$number_of_tracks == 0} {
	set saved 2
    }
    if {$mfe(openfile0) == ""} {
    set saved [expr $saved - 1]} else {
    set file_to_open [open "$mfe(openfile0)" r]
    set real_number_of_tracks $number_of_tracks
    for {set n 1} {$n <= $number_of_tracks} {incr n} {
	if {$mfe(track_status$n)=="Deleted"} {
	    set real_number_of_tracks [expr $real_number_of_tracks-1]
	}
    }
    while {[gets $file_to_open input_line] != -1 } {
	set temp_file($line_number) $input_line
	incr line_number
    }
    set line_number 1
    if {$real_number_of_tracks != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(directory) != $temp_file($line_number)} {set saved 0}
    incr line_number
#    if {$sp_minutes != $temp_file($line_number)} {set saved 0}
    incr line_number
#    if {$sp_seconds != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(master) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(multichannel) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(rec_prop_bits) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(rec_prop_channels) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(rec_prop_srate) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(rec_prop_interl) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(latency) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(mixdown_normalize) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(mixdown_normalize_amp) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(mixdown_normalize_lev) != $temp_file($line_number)} {set saved 0}
    incr line_number

    for {set n 0} {$n <= $number_of_tracks && $saved >0} {incr n} {
    if {$mfe(track_status$n)!="Deleted"} {
	if {$mfe(rec_prop_bits$n) != $temp_file($line_number)} {set saved 0}
	incr line_number
	if {$mfe(rec_prop_channels$n) != $temp_file($line_number)} {set saved 0}
	incr line_number
	if {$mfe(rec_prop_srate$n) != $temp_file($line_number)} {set saved 0}
	incr line_number
	if {$mfe(rec_prop_interl$n) != $temp_file($line_number)} {set saved 0}
	incr line_number
	if {$mfe(track_name$n)!= $temp_file($line_number)} {set saved 0 }
	incr line_number
	if {$mfe(file$n)!= $temp_file($line_number)} {set saved 0 }
	incr line_number
	if {$mfe(device$n) != $temp_file($line_number)} {set saved 0} 
	incr line_number
	if {$mfe(chn$n) != $temp_file($line_number)} {set saved 0} 
	incr line_number
	if {$mfe(track_status$n) != $temp_file($line_number)} {set saved 0} 
	incr line_number
	if {$mfe(track_rec_status$n) != $temp_file($line_number)} {set saved 0} 
	incr line_number
	for {set en 1} {$en <= 8 && $saved > 0} {incr en} {
	    if {$mfe(effect$en$n) != $temp_file($line_number)} {set saved 0} 
	    if {$mfe_temp(effect$en$n) != $temp_file($line_number)} {set saved 0} 
	    incr line_number
	    if {$mfe(effect_attached$en$n) != $temp_file($line_number)} {set saved 0} 
	    incr line_number
	    if {$mfe(effect$en$n)!="None"} {
		set effect_parameters $temp_file($line_number)
		incr line_number
		for {set p 1} {$p <= $effect_parameters && $saved >0} {incr p} {
		    if {$mfe(effect_parameter$p$en$n) != $temp_file($line_number)} {set saved 0}   		
		    incr line_number
		}
	    }
	}
	if {$mfe(volume$n) != $temp_file($line_number)} {set saved 0} 
	incr line_number
	if {$mfe(pan$n) != $temp_file($line_number)} {set saved 0} 
	incr line_number
    }
    }
	for {set n 1} {$n <= 16} {incr n} {
	    if {$sp_minutes_loc($n)!= $temp_file($line_number)} {set saved 0} 
	    incr line_number
	    if {$sp_seconds_loc($n)!= $temp_file($line_number)} {set saved 0} 
	    incr line_number
	}
	if {$mfe(punch_in_minutes)!= $temp_file($line_number)} {set saved 0 }
	incr line_number
	if {$mfe(punch_in_seconds)!= $temp_file($line_number)} {set saved 0 }
	incr line_number
	if {$mfe(punch_out_minutes)!= $temp_file($line_number)} {set saved 0 }
	incr line_number
	if {$mfe(punch_out_seconds)!= $temp_file($line_number)} {set saved 0 }
	incr line_number
    }
    if {$saved == 0} {
	if {[winfo exists .save_alert] != 0} {destroy .save_alert}
	toplevel .save_alert 
	wm title .save_alert "Lose Changes Warning!"
	message .save_alert.out  -width 300 -text "You will lose the latest changes! \nWhat do you want to do?" 
	button .save_alert.button1 -text Cancel -command {
	destroy .save_alert
	}
	button .save_alert.button2 -text "Lose changes" -command { 
	    destroy .save_alert
	    if {$exit_yes==1} {exit}
	    if {$exit_yes==2} {del_all_tracks}
	    if {$exit_yes==5} {
		del_all_tracks
		file_browser
	    }
	}
	button .save_alert.button3 -text "Save changes" -command { 
	    destroy .save_alert
	    set save_as 0
	    if {$exit_yes==1} {
		save_file
		exit} 
	    if {$exit_yes==2} {
		save_file
		del_all_tracks
	    }
	    if {$exit_yes==5} {
		save_file
		del_all_tracks
		file_browser	    
	    }
	}
	pack .save_alert.out 
	pack .save_alert.button1 -padx 10 -side left 
	pack .save_alert.button2 -padx 10 -side left 
	pack .save_alert.button3 -padx 10
    } else {
	if {$exit_yes==1} {exit} 
	if {$exit_yes==2} {del_all_tracks}
	if {$exit_yes==5} {
	    del_all_tracks
	    file_browser
	}	
    }
}

proc export_ecs {} {
    global export_ecs eca_string mfe 
    set export_ecs 1
    play
    set export_ecs 0
    set types {{{Ecasound Chain Setup} {*.ecs}}}
    if {$mfe(directory)==""} {set mfe(directory) "."}
    set ecs_file [tk_getSaveFile -initialdir $mfe(directory) -filetypes $types]
    if {$ecs_file==""} {return}
    if {[string match *.ecs* $ecs_file] == 0 && [string match *.ECS* $ecs_file] == 0} {
	set ecs_file "$ecs_file.ecs"
    }
    set ecs_exported_file [open "$ecs_file" w]
    puts $ecs_exported_file $eca_string
    close $ecs_exported_file 
    messages [format "Exported to\n$ecs_file"]
}

proc log {} {
    global mfe logarithmic position mfe_temp2
    if {$logarithmic == 1} {
	set mfe($position) [expr $mfe_temp2($position)/100]
	set mfe($position) [expr $mfe($position)*$mfe($position)]
    } else {set mfe($position) $mfe_temp2($position)} 
}

proc effect_list {} {
    global mfe mfe_temp track_num effect_num eca_effects effect_index effect_name bgcolor stop_command
    if {$stop_command==0} {
    messages [format "Please, press the STOP button\nbefore add new effects to Track $track_num"]
    return
    }
    if {[winfo exists .effect$effect_num$track_num] != 0} {destroy .effect$effect_num$track_num}
    toplevel .effect$effect_num$track_num 
    wm title .effect$effect_num$track_num "Effect List"
    frame .effect$effect_num$track_num.list
    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
    scrollbar .effect$effect_num$track_num.list.ysbar -width 8 -command {.effect$effect_num$track_num.list.list yview}
    pack .effect$effect_num$track_num.list.list -side left -fill both -expand yes
    pack .effect$effect_num$track_num.list.ysbar -side left -fill y
    pack .effect$effect_num$track_num.list -in .effect$effect_num$track_num -side top -fill both -expand yes
    .effect$effect_num$track_num.list.list insert end "None"
    for {set en 1} {$en <= $eca_effects } {incr en} {
	.effect$effect_num$track_num.list.list insert end $effect_name($effect_index($en))
    }
    frame .effect$effect_num$track_num.buttons
    button .effect$effect_num$track_num.buttons.button1 -text Ok -command {
    set selected [.effect$effect_num$track_num.list.list curselection]
    if {$selected < 1} {set selected 0}
    set mfe_temp(effect$effect_num$track_num) $effect_index($selected)
    set mfe(effect_attached$effect_num$track_num) "Bypassed"
    effect_bypass
    effect}
    button .effect$effect_num$track_num.buttons.button2 -text Cancel -command {
    destroy .effect$effect_num$track_num
    return}
    pack .effect$effect_num$track_num.buttons.button1 -padx 5 -side left -fill x -expand yes
    pack .effect$effect_num$track_num.buttons.button2 -padx 5 -side left -fill x -expand yes
    pack .effect$effect_num$track_num.buttons -in .effect$effect_num$track_num -pady 5 -side bottom -fill x
}

proc close_effect {} {
    global mfe mfe_temp effect2 track stop_command
    set mfe(effect$effect2$track) $mfe_temp(effect$effect2$track)
    destroy .effect$effect2$track
}

proc options {} {
    global mt_font option_value option_parameter bgcolor bgcolor2 line_number ladspa_path ecasoundrc
    if {[winfo exists .options] != 0} {destroy .options}
    set rc_infile [open $ecasoundrc r]
    set line_number 0
    toplevel .options -width 600
    wm title .options "Ecasound Global Settings"
    frame .options.up
    message .options.up.out -width 540 -text "Global Settings"
    pack .options.up.out -side top
    pack .options.up -pady 2 
    #-expand 1 -fill x -side top

    frame .options.med 
    canvas .options.med.canvas  -width 520 -height 300 -yscrollcommand [list .options.med.yscroll set]
    set w2 [frame .options.med.canvas.f -bd 0]
    .options.med.canvas create window 0 0 -anchor nw -window $w2 -tags options
    scrollbar .options.med.yscroll  -orient vertical -width 8 -command [list .options.med.canvas yview]
    while {[gets $rc_infile input_line] != -1} {
	set temp_file($line_number) $input_line
	set current_parameter [split $input_line =] 
	set option_parameter($line_number) [lindex $current_parameter 0]
	regsub -all {( )} $option_parameter($line_number) {} option_parameter($line_number)
	set option_value($line_number) [lindex $current_parameter 1]
	regsub -all {( )} $option_value($line_number) {} option_value($line_number)
	if {[string match *adspa* $option_parameter($line_number)] == 1} {
	    set ladspa_path $option_value($line_number)
	}
	.options.med.canvas config -scrollregion "0 0 0 [expr $line_number *23]"
#	set w3 $w2.$line_number
#	frame $w3  
  	label $w2.param$line_number  -width 30 -font $mt_font -text $option_parameter($line_number) -anchor w	
#	$w2 create label  -width 30 -font $mt_font -text $option_parameter($line_number) -anchor w	
#	entry $w2.value$line_number -bg white -width 400 -textvariable option_value($line_number)
#    	$w2 create entry -bg white -width 50 -textvariable option_value($line_number)
	entry $w2.value$line_number -bg white -width 50 -textvariable option_value($line_number)
#	pack $w2.param$line_number -side left
#	pack $w2.value$line_number -side left -expand 1 -fill x
	grid $w2.param$line_number $w2.value$line_number -sticky news
	grid columnconfig $w2 1 -weight 10
#	pack $w2 -expand 1 -fill x -side top
	incr line_number
    }
#    for {set row_number 0} {$row_number < $line_number} {incr row_number} {

#    } 

    #pack .options.med.canvas.f -expand 1 -fill x -side top
    pack .options.med.canvas -expand 1 -fill both -side left
    pack .options.med.yscroll -fill y -expand 1 -side top
    pack .options.med -fill both -expand 1 -side top
    frame .options.low
    button .options.low.ok -text Ok -command {save_options}
    button .options.low.cancel -text Cancel -command {destroy .options}
    pack .options.low.ok -padx 5 -fill x -expand 1 -side left
    pack .options.low.cancel -padx 5 -fill x -expand 1 -side left
    pack .options.low -pady 5 -fill x -expand 1 -side left
    bind .options <Configure> {.options.med.canvas itemconfigure options -width [expr [winfo width .options]-15]}
    close $rc_infile
}

proc save_options {} {
    global option_value option_parameter line_number wave_editor ladspa_path eca_effects ecasoundrc default_audio_io
    set rc_infile [open $ecasoundrc w]
    for {set row_number 0} {$row_number < $line_number} {incr row_number} {
	puts $rc_infile "$option_parameter($row_number) = $option_value($row_number)"
	if {[string match *wave-editor* $option_parameter($row_number)] == 1} {
	    set wave_editor $option_value($row_number)
	}
	if {[string match *ladsp* $option_parameter($row_number)] == 1 && $ladspa_path != $option_value($row_number)} {
	    set ladspa_path $option_value($row_number)
	    set eca_effects 69
	    ladspa
	}
	if {[string match *efault-outpu* $option_parameter($row_number)] == 1 && $default_audio_io != $option_value($row_number)} {
	    set default_audio_io $option_value($row_number)
	}
    }
    close $rc_infile
    destroy .options
}

proc rec_properties {} {
    global mfe track_num bgcolor mixdown mt_font time_format
    if {[winfo exists .rec_properties$track_num] != 0} {destroy .rec_properties$track_num}
    if {$mfe(multichannel)==1 && $track_num!=0} {return}
    if {$mfe(multichannel)==0 && $track_num==0} {return} 

    if {$mixdown==0} {
	set w .rec_properties$track_num
	toplevel $w
	label $w.text -text "$mfe(track_name$track_num) Recording Properties"
	wm title .rec_properties$track_num "$mfe(track_name$track_num)"
	set current_track_bits $mfe(rec_prop_bits$track_num)
	set current_track_chn $mfe(rec_prop_channels$track_num)
	set current_track_srate $mfe(rec_prop_srate$track_num)
	set current_track_interl $mfe(rec_prop_interl$track_num)
    } elseif {$mixdown==1} {
	set w .rec_properties$track_num
	toplevel $w
    	label $w.text -text "Mixdown Properties"
	wm title $w "Mixdown Properties Window"
	if {[winfo exists .locate] != 0} {destroy}
	if {$time_format=="Seconds"} {time_format}
	set current_track_bits $mfe(rec_prop_bitsMD)
	set current_track_chn $mfe(rec_prop_channelsMD)
	set current_track_srate $mfe(rec_prop_srateMD)
	set current_track_interl $mfe(rec_prop_interlMD)
	set mixdown_begin_min $mfe(mixdown_begin_min)
	set mixdown_begin_sec $mfe(mixdown_begin_sec)
	set mixdown_end_min $mfe(mixdown_end_min)
	set mixdown_end_sec $mfe(mixdown_end_sec)
	set mixdown_normalize $mfe(mixdown_normalize)
	set mixdown_normalize_amp $mfe(mixdown_normalize_amp)
	set mixdown_normalize_lev $mfe(mixdown_normalize_lev)
    } else {
	set w .rec_properties
	toplevel $w
    	label $w.text -text "Global Multichannel Properties"
	wm title $w "Multichannel"
	set track_num ""
	set current_track_bits $mfe(rec_prop_bits)
	set current_track_chn $mfe(rec_prop_channels)
	set current_track_srate $mfe(rec_prop_srate)
	set current_track_interl $mfe(rec_prop_interl)
    }
    #set bits_list {u8 s16_le s16_be s24_le s24_be s32_le s32_be f32_le f32_be}
    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"}
    frame $w.bits 
#    label $w.bits.l  -text "Bits:" -justify left
    labelframe $w.bits.title -text "Depth" 
#    ttk::combobox $w.bits.title.box -textvariable mfe(rec_prop_bits$track_num) -state readonly -values $bits_list
    spinbox $w.bits.title.box -textvariable mfe(rec_prop_bits$track_num) -state readonly -values $bits_list
#    frame $w.bitsa -bg $bgcolor 
#    frame $w.bitsb -bg $bgcolor 
#    frame $w.bitsc -bg $bgcolor 
#    frame $w.bitsd -bg $bgcolor 
#    frame $w.bitse -bg $bgcolor 
#    radiobutton $w.bitsa.1 -font $mt_font -bg $bgcolor -text "Unsigned 8 bits" -variable mfe(rec_prop_bits$track_num) -value "u8" -justify left
#    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
#    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
#    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
#    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
#    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
#    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
#    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
#    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

    if {$mixdown!=1} {
	set channels_list {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16}
	frame $w.channels
	labelframe $w.channels.title -text "Channels" 
#	ttk::combobox $w.channels.title.box -textvariable mfe(rec_prop_channels$track_num) -state readonly -values $channels_list
	spinbox $w.channels.title.box -textvariable mfe(rec_prop_channels$track_num) -state readonly -values $channels_list
#	frame $w.channels 
#	label $w.channels.l  -text "Channels:" -justify left
#	frame $w.channels1 -bg $bgcolor 
#	frame $w.channels2 -bg $bgcolor 
#	radiobutton $w.channels1.1 -font $mt_font -bg $bgcolor -text "1" -variable mfe(rec_prop_channels$track_num) -value "1"
#	radiobutton $w.channels1.2 -font $mt_font -bg $bgcolor -text "2" -variable mfe(rec_prop_channels$track_num) -value "2"
#	radiobutton $w.channels1.3 -font $mt_font -bg $bgcolor -text "3" -variable mfe(rec_prop_channels$track_num) -value "3"
#	radiobutton $w.channels1.4 -font $mt_font -bg $bgcolor -text "4" -variable mfe(rec_prop_channels$track_num) -value "4"
#	radiobutton $w.channels1.5 -font $mt_font -bg $bgcolor -text "5" -variable mfe(rec_prop_channels$track_num) -value "5"
#	radiobutton $w.channels1.6 -font $mt_font -bg $bgcolor -text "6" -variable mfe(rec_prop_channels$track_num) -value "6"
#	radiobutton $w.channels1.7 -font $mt_font -bg $bgcolor -text "7" -variable mfe(rec_prop_channels$track_num) -value "7"
#	radiobutton $w.channels1.8 -font $mt_font -bg $bgcolor -text "8" -variable mfe(rec_prop_channels$track_num) -value "8"
#	radiobutton $w.channels2.9 -font $mt_font -bg $bgcolor -text "9" -variable mfe(rec_prop_channels$track_num) -value "9"
#	radiobutton $w.channels2.10 -font $mt_font -bg $bgcolor -text "10" -variable mfe(rec_prop_channels$track_num) -value "10"
#	radiobutton $w.channels2.11 -font $mt_font -bg $bgcolor -text "11" -variable mfe(rec_prop_channels$track_num) -value "11"
#	radiobutton $w.channels2.12 -font $mt_font -bg $bgcolor -text "12" -variable mfe(rec_prop_channels$track_num) -value "12"
#	radiobutton $w.channels2.13 -font $mt_font -bg $bgcolor -text "13" -variable mfe(rec_prop_channels$track_num) -value "13"
#	radiobutton $w.channels2.14 -font $mt_font -bg $bgcolor -text "14" -variable mfe(rec_prop_channels$track_num) -value "14"
#	radiobutton $w.channels2.15 -font $mt_font -bg $bgcolor -text "15" -variable mfe(rec_prop_channels$track_num) -value "15"
#	radiobutton $w.channels2.16 -font $mt_font -bg $bgcolor -text "16" -variable mfe(rec_prop_channels$track_num) -value "16"
    }

    set srates_list {8000 11025 16000 22050 32000 44100 48000 88200 96000 192000}
    frame $w.srate
    labelframe $w.srate.title -text "Sample Rate (KHz)" 
#    ttk::combobox $w.srate.title.box -textvariable mfe(rec_prop_srate$track_num) -state readonly -values $srates_list
    spinbox $w.srate.title.box -textvariable mfe(rec_prop_srate$track_num) -state readonly -values $srates_list
#    frame $w.srate 
#    label $w.srate.l  -text "Sample Rate:" -justify left
#    frame $w.srate1 -bg $bgcolor 
#    frame $w.srate2 -bg $bgcolor 
#    radiobutton $w.srate1.1 -font $mt_font -bg $bgcolor -text "8000" -variable mfe(rec_prop_srate$track_num) -value "8000"
#    radiobutton $w.srate1.2 -font $mt_font -bg $bgcolor -text "11025" -variable mfe(rec_prop_srate$track_num) -value "11025"
#    radiobutton $w.srate1.3 -font $mt_font -bg $bgcolor -text "16000" -variable mfe(rec_prop_srate$track_num) -value "16000"
#    radiobutton $w.srate1.4 -font $mt_font -bg $bgcolor -text "22050" -variable mfe(rec_prop_srate$track_num) -value "22050"
#    radiobutton $w.srate1.5 -font $mt_font -bg $bgcolor -text "32000" -variable mfe(rec_prop_srate$track_num) -value "32000"
#    radiobutton $w.srate1.6 -font $mt_font -bg $bgcolor -text "44100" -variable mfe(rec_prop_srate$track_num) -value "44100"
#    radiobutton $w.srate1.7 -font $mt_font -bg $bgcolor -text "48000" -variable mfe(rec_prop_srate$track_num) -value "48000"
#    radiobutton $w.srate1.8 -font $mt_font -bg $bgcolor -text "96000" -variable mfe(rec_prop_srate$track_num) -value "96000"

#	set interl_list {i n}
    frame $w.interl
    labelframe $w.interl.title -text "Interleaved" 
#	ttk::combobox $w.interl.title.box -textvariable mfe(rec_prop_interl$track_num) -state readonly -values $interl_list
      radiobutton $w.interl.title.box -text "Yes" -variable mfe(rec_prop_interl$track_num) -value "i"
      radiobutton $w.interl.title.box1 -text "No" -variable mfe(rec_prop_interl$track_num) -value "n"
#    frame $w.interleaved 
#    label $w.interleaved.l  -text "Interleaved:" -justify left
#    frame $w.interleaved1 -bg $bgcolor 
#    radiobutton $w.interleaved1.1 -font $mt_font -bg $bgcolor -text "Interleaved      " -variable mfe(rec_prop_interl$track_num) -value "i"
#    radiobutton $w.interleaved1.2 -font $mt_font -bg $bgcolor -text "Non Interleaved" -variable mfe(rec_prop_interl$track_num) -value "n"

    pack $w.text -side top	

    pack $w.bits.title.box
    pack $w.bits.title
    pack $w.bits -padx 3 -pady 3
#    pack $w.bits.l -expand yes -fill x -side top
#    pack $w.bits -expand yes -fill x -side top
#    pack $w.bitsa.1
#    grid $w.bitsb.2 $w.bitsb.3
#    grid $w.bitsc.4 $w.bitsc.5
#    grid $w.bitsd.6 $w.bitsd.7
#    grid $w.bitse.8 $w.bitse.9
#    pack $w.bitsa
#    pack $w.bitsb
#    pack $w.bitsc
#    pack $w.bitsd
#    pack $w.bitse
    if {$mixdown!=1} {
	pack $w.channels.title.box
	pack $w.channels.title
	pack $w.channels -padx 3 -pady 3
#	pack $w.channels.l -expand yes -fill x -side top
#	pack $w.channels -expand yes -fill x -side top
#	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
#	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
#	pack $w.channels1
#	pack $w.channels2
    }

    pack $w.srate.title.box
    pack $w.srate.title
    pack $w.srate -padx 3 -pady 3

#    pack $w.srate.l -expand yes -fill x -side top
#    pack $w.srate -expand yes -fill x -side top
#    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
#    pack $w.srate1
    #pack $w.interl.title.box
    #pack $w.interl.title.box1
    grid $w.interl.title.box $w.interl.title.box1
    pack $w.interl.title
    pack $w.interl -padx 3 -pady 3
#    pack $w.interleaved.l -expand yes -fill x -side top
#    pack $w.interleaved -expand yes -fill x -side top
#    grid $w.interleaved1.1 $w.interleaved1.2 -sticky ewns
#    pack $w.interleaved1

    if {$mixdown != 1} {
    	button $w.close -text "Close" -command {if {$mixdown != 0} {destroy .rec_properties} else {destroy .rec_properties$track_num}}
	pack $w.close -expand yes -fill x -side top
	set mfe(rec_prop_bits$track_num) $current_track_bits
	set mfe(rec_prop_channels$track_num) $current_track_chn 
	set mfe(rec_prop_srate$track_num) $current_track_srate
	set mfe(rec_prop_interl$track_num) $current_track_interl 
	
    } else {
	
	frame $w.pr_time 
	labelframe $w.pr_time.l -text "Processing Time:"

	#frame $w.pr_time.l
	label $w.pr_time.l.1 -text "Start Position: "
	entry $w.pr_time.l.2 -bg White -justify right -width 3 -textvariable mfe(mixdown_begin_min)
	label $w.pr_time.l.3 -text :
	entry $w.pr_time.l.4 -bg White -justify right -width 5 -textvariable mfe(mixdown_begin_sec)

	label $w.pr_time.l.5 -text "End Position: "
	entry $w.pr_time.l.6 -bg White -justify right -width 3 -textvariable mfe(mixdown_end_min)
	label $w.pr_time.l.7 -text :
	entry $w.pr_time.l.8 -bg White -justify right -width 5 -textvariable mfe(mixdown_end_sec)
	
	#grid $w.pr_time.l
	grid $w.pr_time.l.1 $w.pr_time.l.2 $w.pr_time.l.3 $w.pr_time.l.4
	grid $w.pr_time.l.5 $w.pr_time.l.6 $w.pr_time.l.7 $w.pr_time.l.8
	pack $w.pr_time.l
	pack $w.pr_time
	
	set disabled {Disabled "not available"}
	set normalize_list {Yes No}
	set normalize_amp_list {-12dBFS -11dBFS -10dBFS -9dBFS -8dBFS -7dBFS -6dBFS -5dBFS -4dBFS -3dBFS -2dBFS -1dBFS 0dBFS}
	set normalize_lev_list {-6dBFS -5dBFS -4dBFS -3dBFS -2dBFS -1dBFS 0dBFS}
	frame $w.normalize
	labelframe $w.normalize.title -text "Normalize: " 
	radiobutton $w.normalize.title.1 -text "Yes" -variable mfe(mixdown_normalize) -value "Yes" -command {
	    .rec_propertiesMD.normalize_amp.title.box configure -state readonly -textvariable mfe(mixdown_normalize_amp)
	    .rec_propertiesMD.normalize_lev.title.box configure -state readonly -textvariable mfe(mixdown_normalize_lev)
	}
	radiobutton $w.normalize.title.2 -text "No" -variable mfe(mixdown_normalize) -value "No" -command {
	    .rec_propertiesMD.normalize_amp.title.box configure -state disabled -textvariable disabled
	    .rec_propertiesMD.normalize_lev.title.box configure -state disabled -textvariable disabled
	}

	#ttk::combobox $w.normalize.title.box -textvariable mfe(mixdown_normalize) -state readonly -values $normalize_list
	frame $w.normalize_amp
	labelframe $w.normalize_amp.title -text "Amplitude" 
#	ttk::combobox $w.normalize_amp.title.box -textvariable mfe(mixdown_normalize_amp) -state readonly -values $normalize_amp_list
	spinbox $w.normalize_amp.title.box -textvariable mfe(mixdown_normalize_amp) -state readonly -values $normalize_amp_list
	frame $w.normalize_lev
	labelframe $w.normalize_lev.title -text "Level" 
#	ttk::combobox $w.normalize_lev.title.box -textvariable mfe(mixdown_normalize_lev) -state readonly -values $normalize_lev_list
	spinbox $w.normalize_lev.title.box -textvariable mfe(mixdown_normalize_lev) -state readonly -values $normalize_lev_list
#	frame $w.normalize 
#	label $w.normalize.l  -text "Apply Normalize After Mixdown:" -justify left
#	frame $w.normalize1 -bg $bgcolor 
#	radiobutton $w.normalize1.1 -font $mt_font -bg $bgcolor -text "Yes           " -variable mfe(mixdown_normalize) -value "Yes"
#	radiobutton $w.normalize1.2 -font $mt_font -bg $bgcolor -text "No" -variable mfe(mixdown_normalize) -value "No"
#	pack $w.normalize.l
#	pack $w.normalize -expand yes -fill x -side top
#	grid $w.normalize1.1 $w.normalize1.2 -sticky ewns
#	pack $w.normalize1
	#pack $w.normalize.title.box
	grid $w.normalize.title.1 $w.normalize.title.2
	#pack $w.normalize.title.1
	#pack $w.normalize.title.2
	pack $w.normalize.title
	pack $w.normalize -padx 3 -pady 3
	pack $w.normalize_amp.title.box
	pack $w.normalize_amp.title
	pack $w.normalize_amp -padx 3 -pady 3
	pack $w.normalize_lev.title.box
	pack $w.normalize_lev.title
	pack $w.normalize_lev -padx 3 -pady 3

#	frame $w.buttons
	set mixdown 5
	if {$mfe(mixdown_normalize)=="Yes"} {
	    .rec_propertiesMD.normalize_amp.title.box configure -state readonly -textvariable mfe(mixdown_normalize_amp)
	    .rec_propertiesMD.normalize_lev.title.box configure -state readonly -textvariable mfe(mixdown_normalize_lev)
	} else {
	    .rec_propertiesMD.normalize_amp.title.box configure -state disabled -textvariable disabled
	    .rec_propertiesMD.normalize_lev.title.box configure -state disabled -textvariable disabled
	}

	button $w.close -justify right -text "Ok" -command {
    	    set mixdown 1
    	    destroy .rec_propertiesMD
    	}
    	button $w.close2 -justify right -text "Cancel" -command {
    	    set mixdown 5
    	    destroy .rec_propertiesMD
    	    return
    	}
#	    file_browser2
#	    set mixdown 4
#	    .mfe.up1.button configure -state disabled
#	    .mfe.up2.mixdown configure -state disabled
#	    .mfe.up2.addtrack configure -state disabled
#	    .mfe.up2.del_all_tracks configure -state disabled
#	    .mfe.up2.quit configure -state disabled
#	    .mfe.low.multich2 configure -state disabled
#	    .mfe.low.play configure -state disabled
#	    .mfe.low.master configure -state disabled	    
#	    .mfe.low.loc configure -state disabled	    
#	    .mfe.low.rew_to_begin configure -state disabled
#	    .mfe.low.rew_5 configure -state disabled
#	    .mfe.low.forw_5 configure -state disabled
#	    mixdown"
	#grid $w.buttons.close $w.buttons.close2 -sticky ewns
	pack $w.close -side left -expand yes -fill x -padx 2 -pady 2
	pack $w.close2 -side left -expand yes -fill x -padx 2 -pady 2
	set mfe(rec_prop_bitsMD) $current_track_bits
	set mfe(rec_prop_channelsMD) $current_track_chn
	set mfe(rec_prop_srateMD) $current_track_srate
	set mfe(rec_prop_interlMD) $current_track_interl
	set mfe(mixdown_begin_min) $mixdown_begin_min
	set mfe(mixdown_begin_sec) $mixdown_begin_sec
	set mfe(mixdown_end_min) $mixdown_end_min
	set mfe(mixdown_end_sec) $mixdown_end_sec
	set mfe(mixdown_normalize) $mixdown_normalize
	set mfe(mixdown_normalize_amp) $mixdown_normalize_amp
	set mfe(mixdown_normalize_lev) $mixdown_normalize_lev
    }
}

proc ladspa_loading_window {} {
    if {[winfo exists .ladspa_loading] != 0} {
        destroy .ladspa_loading
	.mfe.up1.button configure -state normal	
	.mfe.up2.options configure -state normal	
	.mfe.up2.colors configure -state normal	
	.mfe.up2.time_format configure -state normal
	.mfe.up2.metronome configure -state normal
	.mfe.up2.addtrack configure -state normal	
	.mfe.up2.del_all_tracks configure -state normal	
	.mfe.up2.quit configure -state normal	
	.mfe.up2.about configure -state normal	
	.mfe.low.multich2 configure -state normal	
	.mfe.low.latcomp configure -state normal	
	.mfe.low.loc configure -state normal	
	.mfe.low.master configure -state normal	
	.mfe.low.play configure -state normal	
	.mfe.low.rew_to_begin configure -state normal	
	.mfe.low.rew_5 configure -state normal	
	.mfe.low.forw_5 configure -state normal	 
    } else {
        toplevel .ladspa_loading 
	message .ladspa_loading.out -width 350 -text "Please wait!\nTkeca is loading LADSPA plug-ins"
	pack .ladspa_loading.out -expand y -fill x
	wm title .ladspa_loading "LADSPA"
	tkwait visibility .ladspa_loading
	tkwait visibility .ladspa_loading.out
    }
}

proc time_format {} {
    global time_format bgcolor sp_minutes sp_seconds sp_seconds_loc sp_minutes_loc mfe
    set loc_number 1
    if {[winfo exists .locate] != 0} {
      destroy .locate
      set locate_present 1
    } else {
      set locate_present 0
    }
    if {$time_format=="Minutes"} {
	set time_format "Seconds"
	set sp_seconds [expr $sp_seconds+$sp_minutes*60]
	set sp_minutes 0
	set mfe(punch_in_seconds) [expr $mfe(punch_in_minutes)*60+$mfe(punch_in_seconds)]
	set mfe(punch_in_minutes) 0
	set mfe(punch_out_seconds) [expr $mfe(punch_out_minutes)*60+$mfe(punch_out_seconds)]
	set mfe(punch_out_minutes) 0
	.mfe.low.minutes configure -width 0 -text ""
	.mfe.low.position2 configure -width 0 -text ""
	.mfe.low.seconds configure -width 7 -text $sp_seconds
	for {set n 1} {$n <= 16} {incr n} {
		set sp_seconds_loc($n) [expr $sp_seconds_loc($n)+$sp_minutes_loc($n)*60]
		set sp_minutes_loc($n) 0
	}
    } else {
	set time_format "Minutes"
	set sp_minutes [expr $sp_seconds/60]
	set sp_minutes [expr int($sp_minutes)]
	set sp_seconds [expr $sp_seconds-$sp_minutes*60]
	set mfe(punch_in_minutes) [expr $mfe(punch_in_seconds)/60]
	set mfe(punch_in_minutes) [expr int($mfe(punch_in_seconds))]
	set mfe(punch_in_seconds) [expr $mfe(punch_in_seconds)-$mfe(punch_in_minutes)*60]
	.mfe.low.minutes configure -width 3 -text $sp_minutes
	.mfe.low.position2 configure -text :
	.mfe.low.seconds configure -width 5 -text $sp_seconds
	for {set n 1} {$n <= 16} {incr n} {
	  set sp_minutes_loc($n) [expr $sp_seconds_loc($n)/60]
	  set sp_minutes_loc($n) [expr int($sp_minutes_loc($n))]
	  set sp_seconds_loc($n) [expr $sp_seconds_loc($n)-$sp_minutes_loc($n)*60]
	}
    }
    if {$locate_present==1} {locate}
}

proc wave_file_ext {} {
global mfe wf_ext n
    if {[string match *.wav $mfe(file$n)]==1} {set wf_ext ".wav"}
    if {[string match *.mp2 $mfe(file$n)]==1} {set wf_ext ".mp2"}
    if {[string match *.mp3 $mfe(file$n)]==1} {set wf_ext ".mp3"}
    if {[string match *.raw $mfe(file$n)]==1} {set wf_ext ".raw"}
    if {[string match *.au $mfe(file$n)]==1} {set wf_ext ".au"}
    if {[string match *.aif $mfe(file$n)]==1} {set wf_ext ".aif"}
    if {[string match *.aiff $mfe(file$n)]==1} {set wf_ext ".aiff"}
    if {[string match *.aifc $mfe(file$n)]==1} {set wf_ext ".aifc"}
    if {[string match *.snd $mfe(file$n)]==1} {set wf_ext ".snd"}
    if {[string match *.mid $mfe(file$n)]==1} {set wf_ext ".mid"}
    if {[string match *.midi $mfe(file$n)]==1} {set wf_ext ".midi"}
    if {[string match *.mod $mfe(file$n)]==1} {set wf_ext ".mod"}
}

proc play {} {
    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
    if {$mfe(directory)==""} {set mfe(directory) "."}
    set missed_files ""
    set eca_string {}
    set eca_string_i {}
    set eca_string_o {}
    set track_count 0
    set preview 0
    set number_of_devices 0
    set number_of_devices_i 0
    set device(0) " "
    set device(1) " "
    set device_i(0) " "
    set device_i(1) " "
    set added_device 0
    set added_device_i 0
    set tracks_to_play 0
    set tracks_to_rec 0
    set mfe(muted_chains) ""
    set metronome 0
    set punch_sequence ""
    set punch 0
    set punched 0
    set start_time [expr $sp_minutes*60+$sp_seconds]
#    messages [format "Iniciando MIXDOWN"]

    if {$mfe(punch_in_minutes)!=0 || $mfe(punch_in_seconds)!=0 || $mfe(punch_out_minutes)!=0 || $mfe(punch_out_seconds)!=0} {
	set punch 1
	set punch_in [expr $mfe(punch_in_minutes)*60+$mfe(punch_in_seconds)]
	if {$punch_in<$start_time} {
	    set punch_in $start_time
	}
	set punch_out [expr $mfe(punch_out_minutes)*60+$mfe(punch_out_seconds)]
	if {$punch_out<$start_time} {
	    set punch 3
#	    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"]
#	    return
	}
	set proc_time [expr $punch_out-$punch_in]
	set punch_y "-y:$punch_in"
	set punch_t "-t:$proc_time"
    }
    
    if {$mfe(track_status0)=="Play" && $mixdown!=1} {
	set l 0
    } else {
	set l 1
    }
    if {$mixdown!=0} {
      if {$mfe(rec_prop_bitsMD)=="Unsigned 8Bit"} {set bitsMD "u8"}
      if {$mfe(rec_prop_bitsMD)=="Signed 16Bit Little Endian"} {set bitsMD "s16_le"}
      if {$mfe(rec_prop_bitsMD)=="Signed 16Bit Big Endian"} {set bitsMD "s16_be"}
      if {$mfe(rec_prop_bitsMD)=="Signed 24Bit Little Endian"} {set bitsMD "s24_le"}
      if {$mfe(rec_prop_bitsMD)=="Signed 24Bit Big Endian"} {set bitsMD "s24_be"}
      if {$mfe(rec_prop_bitsMD)=="Signed 32Bit Little Endian"} {set bitsMD "s32_le"}
      if {$mfe(rec_prop_bitsMD)=="Signed 32Bit Big Endian"} {set bitsMD "s32_be"}
      if {$mfe(rec_prop_bitsMD)=="F. Point 32Bit Little Endian"} {set bitsMD "f32_le"}
      if {$mfe(rec_prop_bitsMD)=="F. Point 32Bit Big Endian"} {set bitsMD "f32_be"}
    }
    
    for {set n $l} {$n <= $number_of_tracks} {incr n} {
    if {$mfe(rec_prop_bits$n)=="Unsigned 8Bit"} {set bits "u8"}
    if {$mfe(rec_prop_bits$n)=="Signed 16Bit Little Endian"} {set bits "s16_le"}
    if {$mfe(rec_prop_bits$n)=="Signed 16Bit Big Endian"} {set bits "s16_be"}
    if {$mfe(rec_prop_bits$n)=="Signed 24Bit Little Endian"} {set bits "s24_le"}
    if {$mfe(rec_prop_bits$n)=="Signed 24Bit Big Endian"} {set bits "s24_be"}
    if {$mfe(rec_prop_bits$n)=="Signed 32Bit Little Endian"} {set bits "s32_le"}
    if {$mfe(rec_prop_bits$n)=="Signed 32Bit Big Endian"} {set bits "s32_be"}
    if {$mfe(rec_prop_bits$n)=="F. Point 32Bit Little Endian"} {set bits "f32_le"}
    if {$mfe(rec_prop_bits$n)=="F. Point 32Bit Big Endian"} {set bits "f32_be"}
    if {[file exists $mfe(file$n)] != 1 && $mfe(track_rec_status$n) == "No" && $mfe(file$n)!="null" && $mfe(track_status$n)!="Deleted"} {
	    set missed_files "$missed_files$mfe(file$n)\n"
	    incr n
    } else {
    if {$mixdown == 1 || $export_ecs == 1} {
	set skip_muted_tracks "Yes"
    } else {
	.mfe.up1.button configure -state disabled
	.mfe.up2.mixdown configure -state disabled
#	.mfe.up2.metronome configure -state disabled
	.mfe.up2.addtrack configure -state disabled
	.mfe.up2.del_all_tracks configure -state disabled
	.mfe.up2.quit configure -state disabled
	.mfe.low.multich2 configure -state disabled
#	.mfe.low.rew_to_begin configure -state disabled
#	.mfe.low.rew_5 configure -state disabled
#	.mfe.low.forw_5 configure -state disabled
#	set mfe(directory) "$w.rec$n"
	if {$n!=0 && $mfe(track_status$n)!="Deleted"} {
    	    $w2.track$n.rec configure -state disabled
	    $w2.track$n.delete configure -state disabled
	    $w2.track$n.file configure -state disabled
	    $w2.track$n.open configure -state disabled
	    $w2.track$n.track_properties configure -state disabled
	    $w2.track$n.dev_text configure -state disabled
	    $w2.track$n.dev_entry configure -state disabled
	    $w2.track$n.chn_text configure -state disabled
	    $w2.track$n.chn_entry configure -state disabled
	    $w2.track$n.eca_tools configure -state disabled

	    set skip_muted_tracks "No"    
#	    set quote "'"
#	    set mfe(file_quoted$n) "$quote$mfe(file$n)$quote"
	}
    }
    
    if {$mfe(track_status$n)!="Mute" || $skip_muted_tracks!="Yes"} {
	set mfe(volume_position$n) 1
	set mfe(pan_position$n) 2
	if {$punch==3 && $mfe(track_rec_status$n)=="Yes"} {
	    set mfe(track_rec_status$n) "No"
	    set punch 4
	}
	if {$mfe(track_status$n)=="Mute" && $mfe(track_rec_status$n)=="No"} {
	    if {$mfe(muted_chains)!=""} {
		set mfe(muted_chains) "$mfe(muted_chains),$n" 
	    } else {
		set mfe(muted_chains) $n 
	    }
	}
#[string length $mfe(file$n)] > 3
	    if {$mfe(track_status$n)!="Deleted" && $mfe(file$n)!="(Wave File)"} { 

		if {$mfe(track_rec_status$n)=="No"} {    
		    if {$punched==1} {
			set mfe(track_rec_status$n) "Yes"    
			set punched 0
		    }
#		    set mfe(file$n) "[list $mfe(file$n)]"
#		    set eca_string "$eca_string-a:$n -i:\"$mfe(file$n)\""
#		    set eca_string "$eca_string-a:$n -i:'$mfe(file$n)'"
# este es el que funciona		    
#		    set eca_string "$eca_string-a:$n -i:[list $mfe(file$n)]"
		    
		    if {$export_ecs == 1} {
			if {$n > 1} {
			    lappend eca_string "\n-a:$n"
#			    set eca_string "$eca_string\n-a:$n "
			} else {
			    lappend eca_string "-a:$n"
#			    set eca_string "$eca_string-a:$n "
			}
		    	lappend eca_string "-i:\"$mfe(file$n)\""
#			set eca_string "$eca_string-i:$mfe(file_quoted$n)"
		    } else {
    			lappend eca_string "-a:$n" 
#			set eca_string "$eca_string-a:$n "
			lappend eca_string "-i:$mfe(file$n)"
#			set eca_string "$eca_string-i:$mfe(file_quoted$n) "
		    }
		    if {$mfe(rec_prop_channels$n)==1} {
			if {$mfe(chn$n)!= "n/a" && $mfe(multichannel)==1} {
			    lappend eca_string "-erc:1,$mfe(chn$n)"
#			    set eca_string "$eca_string-erc:1,$mfe(chn$n) "
			} else {
		    	    lappend eca_string "-erc:1,2"
#			    set eca_string "$eca_string-erc:1,2 "
			}

			set mfe(volume_position$n) 2
			set mfe(pan_position$n) 3
		    }
		    lappend eca_string "-ea:[expr $mfe(volume$n)*$mfe(master)/100]" 
#		    set eca_string "$eca_string-ea:[expr $mfe(volume$n)*$mfe(master)/100]" 
		    lappend eca_string "-epp:$mfe(pan$n)"
#		    set eca_string "$eca_string-epp:$mfe(pan$n) "
		    set tracks_to_play 1
		    if {$mixdown!=1} {
			if {$mfe(device$n)=="Default" || $mfe(device$n)=="(I / O Dev.)"} {
			    set current_audio_output $default_audio_io
			} else {
    			    set current_audio_output $mfe(device$n)
			}
			for {set nd 0} {$nd <= $number_of_devices} {incr nd} {
			    if {$device($nd)==$current_audio_output} {
				set device_chains($nd) "$device_chains($nd),$n"
				set added_device 1
			    }
			}
			if {$added_device==0} {
			    incr number_of_devices
			    set device_chains($number_of_devices) "$n"
			    set device($nd) $current_audio_output
		    
			} else {
			    set added_device 0
			}
		    }
		    set mfe(number_of_effects$n) 0
		    set effect_list ""
		    for {set en 1} {$en <= 8} {incr en} { 
			if {$mfe(effect$en$n) != "None" && $mfe(effect_attached$en$n) == "Connected"} {
			    incr mfe(number_of_effects$n)
			    set mfe(effect_position$en$n) [expr $mfe(pan_position$n)+$mfe(number_of_effects$n)]
			    if {[string match ladspa* $mfe(effect$en$n)]==1} {
				regsub ladspa_ $mfe(effect$en$n) {} current_effect
				set effect_list "$effect_list-el:$current_effect,"
			    } elseif {[string match pn:* $mfe(effect$en$n)]==1} {
				set effect_list "$effect_list-$mfe(effect$en$n),"
			    } else {
				set effect_list "$effect_list-$mfe(effect$en$n):"
			    }	
			    for {set par 1} {$par <= $effect_param($mfe(effect$en$n)) } {incr par} { 
				if {$par>1} {set effect_list "$effect_list,"}
				set effect_list "$effect_list$mfe(effect_parameter$par$en$n)"
			    }
			    lappend eca_string "$effect_list"
#			    set eca_string "$eca_string$effect_list "
			    set effect_list ""
			}    
		    }
#		    set eca_string "$eca_string $punch_sequence"
		    if {$mixdown == 1} {
			if {$mfe(mixdown_begin_min)!=0 || $mfe(mixdown_begin_sec)!=0 || $mfe(mixdown_end_min)!=0 || $mfe(mixdown_end_sec)!=0} {
			    set mixdown_start [expr $mfe(mixdown_begin_sec)+($mfe(mixdown_begin_min)*60)]
			    set mixdown_end [expr $mfe(mixdown_end_sec)+($mfe(mixdown_end_min)*60)]
			    set mixdown_proc_time [expr $mixdown_end-$mixdown_start]
			    lappend eca_string "-y:$mixdown_start"
#			    set eca_string "$eca_string-y:$mixdown_start "
			    if {$mixdown_proc_time>0} {
				lappend eca_string "-t:$mixdown_proc_time"
#				set eca_string "$eca_string-t:$mixdown_proc_time "
			    }
			}
#		    lappebd eca_string "\\"
		    } 
#		    lappend eca_string "\n"
		} else {
		    set tracks_to_rec 1
		    if {$punch==0} {
			for {set nd 0} {$nd <= $number_of_devices_i} {incr nd} {
			    if {$mfe(device$n)=="Default" || $mfe(device$n)=="(I / O Dev.)"} {
				set current_audio_input $default_audio_io
			    } else {
				set current_audio_input $mfe(device$n)    
			    }
			    if {$device_i($nd)==$current_audio_input} {
			        set device_chains_i($nd) "$device_chains_i($nd),$n"
			        set added_device_i 1
			    }
			}
			if {$added_device_i==0} {
		    	    incr number_of_devices_i
		    	    set device_chains_i($number_of_devices_i) "$n"
			    set device_i($nd) $current_audio_input
		        } else {
		    	    set added_device_i 0
			}
#			set eca_string "$eca_string-a:$n" 
			if {$mfe(multichannel)==1} { 
			    if {$export_ecs == 1 && $n > 1} {
				lappend eca_string_o "\n-a:$n"			
#				set eca_string_o "$eca_string_o\n-a:$n "
			    } else {
			    	lappend eca_string_o "-a:$n"			
#				set eca_string_o "$eca_string_o-a:$n " 
			    }
			    lappend eca_string_o "-f:$bits,1ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n)" 
#			    set eca_string_o "$eca_string_o-f:$mfe(rec_prop_bits$n),1ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n) " 
			    lappend eca_string_o "-erc:$mfe(chn$n),1"
			    lappend eca_string_o "-o:$mfe(file$n)" 
#			    set eca_string_o "$eca_string_o-erc:$mfe(chn$n),1 -o:$mfe(file$n) "
			} else {
			    set mfe(rec_prop_channels$n) 2
			    if {$export_ecs == 1 && $n > 1} {
				lappend eca_string_o "\n-a:$n"			
#				set eca_string_o "$eca_string_o\n-a:$n "
			    } else {
			    	lappend eca_string_o "-a:$n"			
#			    	set eca_string_o "$eca_string_o-a:$n " 
			    }
			    lappend eca_string_o "-f:$bits,$mfe(rec_prop_channels$n)ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n)"
			    lappend eca_string_o "-o:$mfe(file$n)" 
#			    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) " 
			}
#		    lappend eca_string_o "\n"
		    } else {
			set punch 2
			for {set nd 0} {$nd <= $number_of_devices_i} {incr nd} {
			    if {$mfe(device$n)=="Default" || $mfe(device$n)=="(I / O Dev.)"} {
				set current_audio_input $default_audio_io
			    } else {
				set current_audio_input $mfe(device$n)    
			    }
			    if {$device_i($nd)==$current_audio_input} {
			        set device_chains_i($nd) "$device_chains_i($nd),temp-$n"
				set added_device_i 1
			    }
			}

			if {$added_device_i==0} {
		    	    incr number_of_devices_i
		    	    set device_chains_i($number_of_devices_i) "temp-$n"
			    set device_i($nd) $current_audio_input
		        } else {
		    	    set added_device_i 0
			}
#			lappend eca_string_o "-a:temp-$n"
			wave_file_ext
			set mfe(temp_file$n) "temp-$n$wf_ext"
			if {$mfe(multichannel)==1} { 
			    lappend eca_string_o "-f:$bits,1ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n)"
#			    set eca_string_o "$eca_string_o-f:$mfe(rec_prop_bits$n),1ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n) " 
			    lappend eca_string_o "-erc:$mfe(chn$n),1"
#			    set eca_string_o "$eca_string_o-erc:$mfe(chn$n),1 " 
			    lappend eca_string_o "-o:$mfe(temp_file$n)"
#			    set eca_string_o "$eca_string_o-o:$mfe(temp_file$n) "
			} else {
			    set mfe(rec_prop_channels$n) 2
			    lappend eca_string_o "-f:$bits,$mfe(rec_prop_channels$n)ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n)"
#			    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) " 
			    lappend eca_string_o "-o:$mfe(temp_file$n)"
#			    set eca_string_o "$eca_string_o-o:$mfe(temp_file$n)"
			}
			set punched 1
			set mfe(track_rec_status$n) "No"    
			set n [expr $n-1]		
#			lappend eca_string_o "\n"
		    }
		}


	}    
	if {$punch==4} {
	    set mfe(track_rec_status$n) "Yes"
	    set punch 3
	}

    }
    }
    }
        
    if {$tracks_to_play == 1} {
	for {set n 1} {$n <= $number_of_devices} {incr n} {
	    if {$export_ecs == 1} {
		lappend eca_string_o "\n-a:$device_chains($n)" 
#		set eca_string_o "$eca_string_o\n-a:$device_chains($n) " 
	    } else {
	    	lappend eca_string_o "-a:$device_chains($n)" 
#	    	set eca_string_o "$eca_string_o-a:$device_chains($n) " 
	    }
	    lappend eca_string_o "-o:$device($n)"
#	    set eca_string_o "$eca_string_o-o:$device($n) "
	}
    }

    if {$mixdown == 1} {
	set normalize ""
	set exec_out1 ""
	set exec_out3 ""
	lappend eca_string "-a:all" 
#	set eca_string "$eca_string-a:all "
	lappend eca_string "-f:$bitsMD,$mfe(rec_prop_channelsMD)ch,$mfe(rec_prop_srateMD),$mfe(rec_prop_interlMD)"
#	set eca_string "$eca_string-f:$mfe(rec_prop_bitsMD),$mfe(rec_prop_channelsMD)ch,$mfe(rec_prop_srateMD),$mfe(rec_prop_interlMD) "
	lappend eca_string "-o:$mfe(openfileMD)"
#	set eca_string "$eca_string-o:$mfe(openfileMD) "
	
	
	if {$mfe(mixdown_normalize)=="Yes"} {	
	    set normalize "ecanormalize $mfe(openfileMD) -a $mfe(mixdown_normalize_amp) -l $mfe(mixdown_normalize_lev)"
	}
	set mixdown 0
	set cmd1 "exec ecasound $eca_string"
	catch {eval $cmd1} exec_out1
	puts $eca_string
	if {$mfe(mixdown_normalize)=="Yes"} {	
	    set cmd3 "exec $normalize"
	    catch {eval $cmd3} exec_out3
	}	
#	set mixdown_out [open "mixdown.txt" w]
#	puts $mixdown_out "eca_string: $eca_string"
#	puts $mixdown_out "$exec_out1"
#	puts $mixdown_out "normalize: $normalize"
#	puts $mixdown_out "$exec_out3"
#	close $mixdown_out

	messages [format "MIXDOWN done"]
	destroy .rec_propertiesMD
	tkwait visibility .msg
	tkwait window .msg

	.mfe.up1.button configure -state normal	
	.mfe.up2.options configure -state normal
	.mfe.up1.save configure -state normal
	.mfe.up1.saveas configure -state normal				
	.mfe.up2.time_format configure -state normal
	.mfe.up2.metronome configure -state normal
	.mfe.up2.exportecs configure -state normal
	.mfe.up2.mixdown configure -state normal
	.mfe.up2.addtrack configure -state normal	
	.mfe.up2.del_all_tracks configure -state normal	
	.mfe.up2.quit configure -state normal	
	.mfe.up2.about configure -state normal	
	.mfe.low.multich2 configure -state normal	
	.mfe.low.latcomp configure -state normal	
	.mfe.low.loc configure -state normal	
	.mfe.low.master configure -state normal	
	.mfe.low.play configure -state normal	
#	.mfe.low.rew_to_begin configure -state normal	
#	.mfe.low.rew_5 configure -state normal	
#	.mfe.low.forw_5 configure -state normal	 
	return
    }
    if {$tracks_to_rec == 1} {
        for {set n 1} {$n <= $number_of_devices_i} {incr n} {
	lappend eca_string_i "-a:$device_chains_i($n)" 
#	set eca_string_i "$eca_string_i-a:$device_chains_i($n) " 
	lappend eca_string_i "-i:$device_i($n)"
#	set eca_string_i "$eca_string_i-i:$device_i($n)\n"
	}
    }
    set eca_string "$eca_string_i $eca_string $eca_string_o"
    if {$mfe(multichannel)==1} {         
        set eca_string "[list -f:$bits,$mfe(rec_prop_channels)ch,$mfe(rec_prop_srate),$mfe(rec_prop_interl)] $eca_string"
#	set eca_string "-f:$mfe(rec_prop_bits),$mfe(rec_prop_channels)ch,$mfe(rec_prop_srate),$mfe(rec_prop_interl)] $eca_string"
    }
        
    puts "Ecasound Chainsetup:\n$eca_string"
    puts "--------------------\n"

    if {$export_ecs == 1} {
	.mfe.up1.button configure -state normal
	.mfe.up2.mixdown configure -state normal
#	.mfe.up2.metronome configure -state normal
	.mfe.up2.addtrack configure -state normal
	.mfe.up2.del_all_tracks configure -state normal
	.mfe.up2.quit configure -state normal
	.mfe.low.multich2 configure -state normal
#	.mfe.low.rew_to_begin configure -state normal
#	.mfe.low.rew_5 configure -state normal
#	.mfe.low.forw_5 configure -state normal
	regsub -all {\{} $eca_string {} eca_string
	regsub -all {\}} $eca_string {} eca_string
#	regsub -all {(\-a)} $eca_string {\\n} eca_string
	return
    }
    if {$punch==2} { 
        for {set n 1} {$n <= $number_of_tracks} {incr n} {
	    if {$mfe(track_rec_status$n)=="Yes"} {    
		wave_file_ext
		set mfe(temp_file2$n) "temp2-$n$wf_ext"
		set cmd "exec ecasound [list -i:$mfe(file$n) $punch_y $punch_t -o:$mfe(temp_file2$n) $punch_t ]"
#		set cmd "exec ecasound -i:$mfe(file_quoted$n) $punch_y $punch_t -o:$mfe(temp_file2$n) $punch_t"
		catch {eval $cmd} exec_out
		set cmd2 "exec ecasound [list -i:$mfe(file$n) $punch_y $punch_t -ea:0 -o:$mfe(file$n) $punch_y $punch_t ]"		
#		set cmd2 "exec ecasound -i:$mfe(file_quoted$n) $punch_y $punch_t -ea:0 -o:$mfe(file_quoted$n) $punch_y $punch_t "		
		catch {eval $cmd2} exec_out
	    }
	}
    }
    
#    if {$mfe(metronome_enable)=="Yes"} {
#	set eca_string "$eca_string -a:metronome -i:null -o:$mfe(metronome_device) -pn:metronome,$mfe(metronome_beat)" 
#    }


    set tkeca_log [open "~/tkeca.log" w]
	puts $tkeca_log "eca_string: $eca_string"
	puts $tkeca_log "eca_string_i: $eca_string_i"
	puts $tkeca_log "eca_string_o: $eca_string_o"
	puts $tkeca_log "tracks_to_rec:$tracks_to_rec"
    close $tkeca_log
    puts "eca_string: $eca_string"
    set playhandle [open "|ecasound -c $eca_string" w]
    puts "playhandle: $playhandle"
    puts "Ecasound Interactive Mode Commands:\n"
    puts "-----------------------------------\n"
    fconfigure $playhandle -buffering line -buffersize 8000 -blocking 0
    if {$mfe(muted_chains)!=""} {
	puts $playhandle "c-select $mfe(muted_chains)\n"
	puts "c-select $mfe(muted_chains)\n"
	puts $playhandle "c-muting\n"
	puts "c-muting\n"
    }
    puts $playhandle "setpos $start_time\n"
    puts "setpos $start_time\n"
    puts $playhandle "t\n"
    puts "t\n"
#remover esta linea despues
    set start_time2 [clock clicks -milliseconds]
    set sp_seconds2 $sp_seconds
    tick
    if {$tracks_to_play == 0 && $tracks_to_rec == 0} { 
#	set stop_command 1
	if {$missed_files != ""} {
	messages [format "No tracks to be played or recorded\nFile(s):\n$missed_files\nWas(Were) not found."]
	} else {
	messages [format "No tracks to be played or recorded"]
	}
	stop
    }
	if {$missed_files != ""} {
	messages [format "File(s):\n$missed_files\nWas(Were) not found."]
	}
}

proc preview {} {
    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
    set start_time [expr $sp_minutes*60+$sp_seconds]
    set punch 0
    set eca_string {}
    set n $track
    set tracks_to_play 0
    set mfe(volume_position$n) 1
    set mfe(pan_position$n) 2

    if {[string length $mfe(file$n)] > 3 && $mfe(file$n)!="(Wave File)"} { 
	.mfe.up1.button configure -state disabled
	.mfe.up2.mixdown configure -state disabled
#	.mfe.up2.metronome configure -state disabled
	.mfe.up2.addtrack configure -state disabled
	.mfe.up2.del_all_tracks configure -state disabled
	.mfe.up2.quit configure -state disabled
	.mfe.low.multich2 configure -state disabled
#	.mfe.low.rew_to_begin configure -state disabled
#	.mfe.low.rew_5 configure -state disabled
#	.mfe.low.forw_5 configure -state disabled
	set play_text "stop"
	if {$mfe(track_status$n)=="Play"} {
	    lappend eca_string "-a:$n" 
	    lappend eca_string "-i:$mfe(file$n)"
		
		if {$mfe(rec_prop_channels$n)==1} {
		    if {$mfe(chn$n)!= "n/a" && $mfe(multichannel)==1} {
			lappend eca_string "-erc:1,$mfe(chn$n)"
		    } else {
		    	lappend eca_string "-erc:1,2"
		    }
			lappend eca_string "-ea:[expr $mfe(volume$n)*$mfe(master)/100]" 
			lappend eca_string "-epp:$mfe(pan$n)"
			set mfe(volume_position$n) 2
			set mfe(pan_position$n) 3
		}
		
		set tracks_to_play 1
	    }

	if {$preview == 2} {
	    set mfe(number_of_effects$track) 0
	    for {set en 1} {$en <= 8} {incr en} { 
		set effect_list ""
		if {$mfe(effect$en$track) != "None" && $mfe(effect_attached$en$track) != "Bypassed"} {
		    set mfe(effect_position$en$track) [expr $mfe(pan_position$track)+$mfe(number_of_effects$track)]
		    if {[string match ladspa* $mfe(effect$en$track)]==1} {
			regsub ladspa_ $mfe(effect$en$track) {} current_effect
			set effect_list "$effect_list-el:$current_effect,"
		    } elseif {[string match pn:* $mfe(effect$en$track)]==1} {
			set effect_list "$effect_list-$mfe(effect$en$track),"
		    } else {	
		    	set effect_list "$effect_list-$mfe(effect$en$track):"
		    }
		    for {set par 1} {$par <= $effect_param($mfe(effect$en$track)) } {incr par} { 
			if {$par>1} {set effect_list "$effect_list,"}
			set effect_list "$effect_list$mfe(effect_parameter$par$en$track)"
		    }
		}    
	    lappend eca_string "$effect_list"
	    }

	} else {
	    set effect_list ""
	    set mfe(effect_position1$track) [expr $mfe(pan_position$track)+1]
	    set en $effect2
	    if {$mfe(effect$en$track) != "None" && $mfe(effect_attached$en$track) != "Bypassed"} {
		if {[string match ladspa* $mfe(effect$en$track)]==1} {
			regsub ladspa_ $mfe(effect$en$track) {} current_effect
			set effect_list "$effect_list-el:$current_effect,"
		} elseif {[string match pn:* $mfe(effect$en$track)]==1} {
			set effect_list "$effect_list-$mfe(effect$en$track),"
		} else {
			set effect_list "$effect_list-$mfe(effect$en$track):"
		}	
		for {set par 1} {$par <= $effect_param($mfe(effect$en$track)) } {incr par} { 
		    if {$par>1} {set effect_list "$effect_list,"}
		    set effect_list "$effect_list$mfe(effect_parameter$par$en$track)"
		}
	    lappend eca_string "$effect_list"
	    }    
		
	}
    }
    if {$tracks_to_play ==1} {	
	for {set n1 1} {$n1 <= $number_of_tracks} {incr n1} {
	    $w.track$n1.rec configure -state disabled	
	}	
	if {$mfe(device$track)=="Default" || $mfe(device$track)=="(I / O Dev.)"} {
	    lappend eca_string "-a:$n" 
	    lappend eca_string "-o:$default_audio_io"
	} else {
	    lappend eca_string "-a:$n" 
	    lappend eca_string "-o:$mfe(device$track)"
	}
#	set review_status [open track_view_status.txt2 w]
#	puts $review_status $eca_string
#	close $review_status
	set playhandle [open "|ecasound -c $eca_string" w]
	fconfigure $playhandle -buffering none -blocking 0
	puts $playhandle "setpos $start_time\n"
	puts $playhandle "t\n"
    } else {	
 	set stop_command 1
	messages [format "No tracks to be played or recorded"]
    }
}

############################### Main Section #################################################
# VARIABLES DESCRIPTION:
#	mt_font: Default font
#	number_of_tracks: Number of displayed tracks
#	track_number: Number of current track
#	sp_minutes: Starting position in minutes and;
#	sp_seconds: Starting position in seconds
# 	mfe(track_nameN): Name of track N
#	mfe(openfileN): Name and path of the track N wave file
# 	mfe(deviceN): Name and path of the track N audio device
# 	mfe(track_statusN): Status of track N (Could be "Play", "Rec" or "Mute")
#	mfe(effectnN): Name of effect n on track N
#	mfe(effect_parametersnN): Number of parameters of effect n on track N
#	mfe(effect_parameterPnN): Value for parameter P of effect n on track N
#	mfe(volumeN): volume of track N
#	mfe(panN): Left/Right percent
#	effect_name(nnn): A more descriptive name of the effect called nnn by ecasound
#	effect_param(nnn): Number of parameters of the effect called nnn by ecasound
#	effect_param_name(nnnN): Name of parameter N of effect called nnn by ecasound
#	effect_param_value(nnnN): Default value for parameter N of effect called nnn by ecasound
#	effect_param_from(nnnN): Begin value for parameter N of effect called nnn by ecasound
#	effect_param_to(nnnN): Ending value for parameter N of effect called nnn by ecasound
#	effect_param_resolution(nnnN): Resolution for parameter N of effect called nnn by ecasound

# Variables definition section

global 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

#ttk::setTheme clam
tk_setPalette seashell3

set bgcolor cyan3

frame .mfe
frame .mfe.up1 -bd 6
frame .mfe.up2 -bd 6
#frame .mfe.header -bg $bgcolor 
frame .mfe.tracks
frame .mfe.low -bd 6

set row 1
set number_of_tracks 0
set toprocess " "
set solo_tracks 0

set mt_font [font create -family Helvetica -size 9 -weight normal]

set play_command "play"
set mixdown 0
set export_ecs 0
set stop_position 0
set mfe(directory) "."
set mfe(multichannel) 0
set mfe(rec_prop_bits0) "Signed 16Bit Little Endian"
set mfe(rec_prop_channels0) "2"
set mfe(rec_prop_srate0)  "44100"
set mfe(rec_prop_interl0) "i"
set mfe(rec_prop_bits) "Signed 16Bit Little Endian"
set mfe(rec_prop_channels) "2"
set mfe(rec_prop_srate)  "44100"
set mfe(rec_prop_interl) "i"
set mfe(rec_prop_bitsMD) "Signed 16Bit Little Endian"
set mfe(rec_prop_channelsMD) "2"
set mfe(rec_prop_srateMD) "44100"
set mfe(rec_prop_interlMD) "i"

set mfe(master) 100
set mfe(mixdown_begin_min) 0
set mfe(mixdown_begin_sec) 0
set mfe(mixdown_end_min) 0
set mfe(mixdown_end_sec) 0
set mfe(mixdown_normalize) "No"

set sp_minutes_loc(1) 0
set sp_minutes_loc(2) 0
set sp_minutes_loc(3) 0
set sp_minutes_loc(4) 0
set sp_minutes_loc(5) 0
set sp_minutes_loc(6) 0
set sp_minutes_loc(7) 0
set sp_minutes_loc(8) 0
set sp_minutes_loc(9) 0 
set sp_minutes_loc(10) 0
set sp_minutes_loc(11) 0
set sp_minutes_loc(12) 0
set sp_minutes_loc(13) 0
set sp_minutes_loc(14) 0
set sp_minutes_loc(15) 0
set sp_minutes_loc(16) 0

set sp_seconds_loc(1) 0
set sp_seconds_loc(2) 0
set sp_seconds_loc(3) 0
set sp_seconds_loc(4) 0
set sp_seconds_loc(5) 0
set sp_seconds_loc(6) 0
set sp_seconds_loc(7) 0
set sp_seconds_loc(8) 0
set sp_seconds_loc(9) 0 
set sp_seconds_loc(10) 0
set sp_seconds_loc(11) 0
set sp_seconds_loc(12) 0
set sp_seconds_loc(13) 0
set sp_seconds_loc(14) 0
set sp_seconds_loc(15) 0
set sp_seconds_loc(16) 0
set mfe(mixdown_normalize) "No"
set mfe(mixdown_normalize_amp) "-12dBFS"
set mfe(mixdown_normalize_lev) "-6dBFS"
set mfe(punch_in_minutes) 0
set mfe(punch_in_seconds) 0
set mfe(punch_out_minutes) 0
set mfe(punch_out_seconds) 0
set mfe(latency) 0
set mfe(track_status0) "Mute"
set mfe(track_name0) "Metronome"
set mfe(volume0) 100
set mfe(file0) null
set mfe(pan0) 50
set mfe(device0) "Default"
set mfe(chn0) 2
set mfe(track_solo0) "No Solo"
set mfe(track_rec_status0) "No"
set mfe(effect10) "pn:metronome"
set mfe(effect_parameter110) 120
set mfe_temp(effect10) "None"
set mfe(effect_attached10) "Connected"
set mfe(effect_parameters10) 1
set n 0
for {set en 2} {$en <= 8} {incr en} {    
    set mfe(effect$en$n) "None"
    set mfe_temp(effect$en$n) "None"
    set mfe(effect_attached$en$n) "Bypassed"
}

set mfe(metronome_beat) 100

set time_format "Minutes"

label .mfe.up1.title -justify left -text "TKECA 4.4.3 - Tcl/Tk Frontend for Ecasound - 2003-2011 Luis Pablo Gasparotto " 
label .mfe.up1.text -text "Current Directory: "
entry .mfe.up1.entry -bg White -textvariable mfe(directory)
label .mfe.up1.text2 -text "Current File: "
entry .mfe.up1.entry2 -state disabled -textvariable mfe(openfile0)
button .mfe.up1.button -text "Open file" -height 0 -command {set n 0 
set types {{{mfe files} {*.mfe}} {{all} {*}}}
set track_num 0
set save_as 0
set exit_yes 5
proc_exit
}
button .mfe.up1.save -text "Save file" -height 0 -command {
set save_as 0
save_file} 
button .mfe.up1.saveas -text "Save file as" -height 0 -command {
set types {{{mfe files} {*.mfe}} {{all} {*}}}
set track_num 0
file_browser2
save_file} 
button .mfe.up2.exportecs -text "Export .ecs" -command {export_ecs} 
#button .mfe.up2.mixdown  -activebackground LightPink -text "Mixdown" -command {mixdown} 
button .mfe.up2.mixdown -text "Mixdown" -command {
	.mfe.up1.button configure -state disabled	
	.mfe.up1.save configure -state disabled
	.mfe.up1.saveas configure -state disabled		
	.mfe.up2.options configure -state disabled	
	.mfe.up2.colors configure -state disabled	
	.mfe.up2.time_format configure -state disabled
	.mfe.up2.metronome configure -state disabled
	.mfe.up2.mixdown configure -state disabled
	.mfe.up2.exportecs configure -state disabled
	.mfe.up2.addtrack configure -state disabled	
	.mfe.up2.del_all_tracks configure -state disabled	
	.mfe.up2.quit configure -state disabled	
	.mfe.up2.about configure -state disabled	
	.mfe.low.multich2 configure -state disabled	
	.mfe.low.loc configure -state disabled	
	.mfe.low.latcomp configure -state disabled	
	.mfe.low.master configure -state disabled	
	.mfe.low.play configure -state disabled	
#	.mfe.low.rew_to_begin configure -state disabled	
#	.mfe.low.rew_5 configure -state disabled	
#	.mfe.low.forw_5 configure -state disabled	 

    set types {{{Wav files} {*.wav}} {{mp3 files} {*.mp3}} {{raw files} {*.raw}} {{all} {*}}}
    set track_num "MD"
    set mfe(track_statusMD) "Rec"
    if {$number_of_tracks==0} {
	messages [format "There's no tracks to make Mixdown!"]
	return
    }
    set mixdown 1
    rec_properties
    tkwait window .rec_propertiesMD
    destroy .rec_propertiesMD
    if {$mixdown==5} {
	messages [format "Mixdown aborted by user!"]
	.mfe.up1.button configure -state normal
	.mfe.up1.save configure -state normal
	.mfe.up1.saveas configure -state normal
	.mfe.up2.options configure -state normal
	.mfe.up2.colors configure -state normal
	.mfe.up2.time_format configure -state normal
	.mfe.up2.metronome configure -state normal
	.mfe.up2.mixdown configure -state normal
	.mfe.up2.exportecs configure -state normal
	.mfe.up2.addtrack configure -state normal
	.mfe.up2.del_all_tracks configure -state normal
	.mfe.up2.quit configure -state normal
	.mfe.up2.about configure -state normal
	.mfe.low.multich2 configure -state normal
	.mfe.low.loc configure -state normal
	.mfe.low.latcomp configure -state normal
	.mfe.low.master configure -state normal
	.mfe.low.play configure -state normal
	return
    }
    file_browser2
    toplevel .rec_propertiesMD 
    wm title .rec_propertiesMD "Processing..."
    message .rec_propertiesMD.out -width 350 -text "Please wait!\nProcessing Mixdown"
    pack .rec_propertiesMD.out -expand y -fill x
    tkwait visibility .rec_propertiesMD
    tkwait visibility .rec_propertiesMD.out
    play
}

button .mfe.up2.options -justify right -text Options -command {options}
button .mfe.up2.colors -justify right -text Colors -command {colors}
button .mfe.up2.time_format -justify right -text "Time Format" -command {time_format}
button .mfe.up2.metronome -justify right -text "Metronome" -command {metronome}
button .mfe.up2.addtrack -justify right -text "Add Track" -command {
incr number_of_tracks
set mfe(volume_position$number_of_tracks) 1    
set mfe(pan_position$number_of_tracks) 2
set mfe(track_name$number_of_tracks) "Track $number_of_tracks"
set track_num $number_of_tracks
track_data_reset
set mfe(track_name$number_of_tracks) "Track $number_of_tracks"
set mfe(device$number_of_tracks) "(I / O Dev.)"
add_track}
button .mfe.up2.del_all_tracks -justify right -text "Close" -command {
set save_as 0
set exit_yes 2
proc_exit
}
button .mfe.up2.quit -justify right -text Quit -command {
set exit_yes 1
proc_exit
}
button .mfe.up2.about -justify right -text "About TKECA" -command {
proc_about
}

#label .mfe.header.text1 -bg $bgcolor -justify left -text " Name     "
#label .mfe.header.text2 -bg $bgcolor -justify left -text "File                              "
#label .mfe.header.text3 -bg $bgcolor -justify left -text " "
#label .mfe.header.text4 -bg $bgcolor -justify left -text "                 "
#label .mfe.header.text5 -bg $bgcolor -justify left -text "Solo Mute  Rec. "
#label .mfe.header.text6 -bg $bgcolor -justify left -text "                 "
#label .mfe.header.text7 -bg $bgcolor -justify left -text "Pan                               "
#label .mfe.header.text8 -bg $bgcolor -justify left -text "Volume                            "   

pack .mfe.up1.title -side top -fill x -expand 1
pack .mfe.up1.text -side left  -fill x -expand 1
pack .mfe.up1.entry -side left  -fill x -expand 1
pack .mfe.up1.text2 -side left  -fill x -expand 1
pack .mfe.up1.entry2 -side left  -fill x -expand 1
pack .mfe.up1.button -side left  -fill x -expand 1
pack .mfe.up1.save -side left -fill x -expand 1
pack .mfe.up1.saveas -side top -fill x -expand 1

pack .mfe.up2.exportecs -side left -fill x -expand 1
pack .mfe.up2.mixdown -side left -fill x -expand 1
pack .mfe.up2.options -side left -fill x -expand 1
pack .mfe.up2.colors -side left -fill x -expand 1
pack .mfe.up2.time_format -side left -fill x -expand 1
pack .mfe.up2.metronome -side left -fill x -expand 1
pack .mfe.up2.addtrack -side left -fill x -expand 1
pack .mfe.up2.del_all_tracks -side left -fill x -expand 1
pack .mfe.up2.quit -side left -fill x -expand 1
pack .mfe.up2.about -side left -fill x -expand 1
# 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
pack .mfe.up1 -side top -fill x
pack .mfe.up2 -side top -fill x

# pack .mfe.header.text1 -side left -fill x
# pack .mfe.header.text2 -side left -fill x
# pack .mfe.header.text3 -side left -fill x
# pack .mfe.header.text4 -side left -fill x
# pack .mfe.header.text5 -side left -fill x
# pack .mfe.header.text6 -side left -fill x
# pack .mfe.header.text7 -side left -fill x
# pack .mfe.header.text8 -side left -fill x
# pack .mfe.header -pady 2
# pack .mfe.tracks -expand true -fill both
.mfe.up1.save configure -state disabled
.mfe.up1.saveas configure -state disabled
.mfe.up2.exportecs configure -state disabled
.mfe.up2.mixdown configure -state disabled

set bgcolor2 AntiqueWhite3
canvas .mfe.tracks.canvas -width 780 -height 400 -yscrollcommand [list .mfe.tracks.yscroll set]
.mfe.tracks.canvas config -scrollregion "0 0 0 400"
scrollbar .mfe.tracks.yscroll -orient vertical -width 8 -command [list .mfe.tracks.canvas yview]

set w [frame .mfe.tracks.canvas.f -width 780 -height 400 -bd 0]
.mfe.tracks.canvas create window 0 0 -anchor nw -window $w -tags tracks_window

#pack .mfe.tracks.canvas.f -side left -fill x -expand true
pack .mfe.tracks.canvas -side left -fill both -expand true
pack .mfe.tracks.yscroll -side top -fill y -expand true
pack .mfe.tracks -side top -fill both -expand true

set stop_command 1
set sp_minutes 0
set sp_seconds 0
set play_text "Play"
set fw_text "Fw 5''"
set rew_text "Rew 5''"
set rewbeg_text "Go to 00:00"

label .mfe.low.position -text "Position:"
label .mfe.low.minutes -width 3 -text 0
label .mfe.low.position2 -text :
label .mfe.low.seconds -width 5 -text 0.00
label .mfe.low.spaces -text " "
label .mfe.low.multich -text "Multichannel:"
checkbutton .mfe.low.multich2 -width 1 -variable mfe(multichannel) -onvalue 1 -offvalue 0 -command "
set mixdown 3
set track_num 0
rec_properties"

button .mfe.low.latcomp -text "Latency Compensation" -height 0 -command { 
latency_comp
}

button .mfe.low.loc -text Loc -height 0 -command { 
locate
}

button .mfe.low.master -text Master -height 0 -command { 
master
}

button .mfe.low.play -textvariable play_text -height 0 -command { 
    if {$stop_command == 1} { 
	set stop_command 0
	set play_text "Stop"
	play 
	if {$tracks_to_play==0 && $tracks_to_rec==0} {
	    set stop_command 1
	    set play_text "Play"
	}	    	
    } else {
	set stop_command 1
	set play_text "Play"
	stop 
    }
} 

button .mfe.low.rew_to_begin -textvariable rewbeg_text  -height 0 -command { 
    set sp_minutes 0	 
    set sp_seconds 0
    set sp_seconds2 0
    if {$stop_command == 1} { 
	display_position	 
    } else {
	puts $playhandle "setpos 0"
	set start_time2 [clock clicks -milliseconds]
	tick
    }
} 

button .mfe.low.rew_5 -textvariable rew_text -height 0 -command { 
    set starting_time [expr $sp_seconds+$sp_minutes*60]
    if {$starting_time > 5} {
        set starting_time [expr $starting_time-5]
        if {$time_format=="Minutes"} {
    	    set sp_minutes [expr $starting_time/60]
	    set sp_minutes [expr int($sp_minutes)]
	    set sp_seconds [expr $starting_time-$sp_minutes*60]
	} else {
	    set sp_seconds $starting_time
	}
    } else {
	set sp_minutes 0	 
	set sp_seconds 0
    }
    if {$stop_command == 1} { 
	display_position
    } else {
	set sp_seconds2 $starting_time
	puts $playhandle "setpos $starting_time"
	set start_time2 [clock clicks -milliseconds]
	tick
    }
} 

button .mfe.low.forw_5 -textvariable fw_text -height 0 -command { 
    set starting_time [expr $sp_seconds+$sp_minutes*60]
    set starting_time [expr $starting_time+5]
    if {$time_format=="Minutes"} {    
	set sp_minutes [expr $starting_time/60]
	set sp_minutes [expr int($sp_minutes)]
	set sp_seconds [expr $starting_time-$sp_minutes*60]
    } else {
	set sp_seconds $starting_time
    }
    if {$stop_command == 1} { 
	display_position
    } else {
	set sp_seconds2 $starting_time
	puts $playhandle "setpos $starting_time"
	set start_time2 [clock clicks -milliseconds]
	tick
    }
} 

pack .mfe.low.position -side left
pack .mfe.low.minutes -side left
pack .mfe.low.position2 -side left
pack .mfe.low.seconds -side left
pack .mfe.low.spaces -side left
pack .mfe.low.multich -side left
pack .mfe.low.multich2 -side left
pack .mfe.low.latcomp -side left

pack .mfe.low.loc -side left -fill x -expand true
pack .mfe.low.master -side left -fill x -expand true
pack .mfe.low.play -side left -fill x -expand true
pack .mfe.low.rew_to_begin -side left -fill x -expand true
pack .mfe.low.rew_5 -side left -fill x -expand true
pack .mfe.low.forw_5 -side left -fill x
pack .mfe.low -fill x -expand false
pack .mfe -fill both -expand true

bind .mfe <Configure> {.mfe.tracks.canvas itemconfigure tracks_window -width [expr [winfo width .mfe]-15]}

set ecasoundrc "~/.ecasoundrc"

if {[file exists $ecasoundrc] != 1} {
    set ecasoundrc "~/.ecasound/ecasoundrc"
    if {[file exists $ecasoundrc] != 1} {
	set ecasoundrc "/usr/local/share/ecasound/ecasoundrc"
	if {[file exists $ecasoundrc] != 1} {
	    set ecasoundrc "/usr/share/ecasound/ecasoundrc"
	    if {[file exists $ecasoundrc] != 1} {
		puts "Tkeca is unable to find ecasoundrc file"
		exit
	    }
	}
    }
}

set rc_infile [open $ecasoundrc r]

tkwait visibility .mfe
tkwait visibility .mfe.low
#tkwait visibility .mfe.up1
#tkwait visibility .mfe.up2
wm title . "TKECA 4.4.3 - Tcl/Tk Frontend for Ecasound" 

set ladspa_path 0

set prev_loaded_file 0
set eca_effects 69

set effect(1) "eal|Limiter|1|Limit %|0|100|100|0"
set effect(2) "ec|Compressor|2|Compression Rate (Db)|0|1|1|0|Threshold %|0|100|50|0"
set 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"
set 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"
set effect(5) "ef1|Resonant Bandpass Filter|2|Center Frequency (Hz)|0|20000|0|0|Width (Hz)|0|2000|0|0"
set effect(6) "ef3|Resonant Lowpass Filter|3|Cutoff Frequency (Hz)|0|5000|0|0|Resonance|0|2|0|0|Gain|0|1|0|0"
set effect(7) "efa|Allpass Filter|2|Delay Samples|0|10000|0|0|Feedback %|0|100|50|0"
set effect(8) "efb|Bandpass Filter|2|Center Frequency (Hz)|0|11000|11000|0|Width (Hz)|0|22000|22000|0"
set effect(9) "efh|Highpass Filter|1|Cutoff Frequency (Hz)|10000|22000|10000|0"
set effect(10) "efl|Lowpass Filter|1|Cutoff Frequency (Hz)|0|10000|0|0"
set effect(11) "efr|Bandreject Filter|2|Center Frequency (Hz)|0|11000|11000|0|Width (Hz)|0|22000|22000|0"
set effect(12) "efs|Resonator Filter|2|Center Frequency (Hz)|0|11000|11000|0|Width (Hz)|0|22000|22000|0"
set 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"
set 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"
set 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"
set effect(16) "ete|Advanced Reverb|3|Room Size (Meters)|0|100|10|0|Feedback %|0|100|50|0|Wet %|0|100|50|0"
set effect(17) "etf|Fake Stereo|1|Delay Time (ms)|0|500|40|0"
set 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"
set 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"
set 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"
set effect(21) "pn:metronome|Metronome|1|BPM|30|300|120|1"
set effect(22) "pn:dyn_compress_supersoft|Dynamic Compressor (Super Soft)|1|Gain %|0|1000|100|1"
set effect(23) "pn:dyn_compress_soft|Dynamic Compressor (Soft)|1|Gain %|0|1000|100|1"
set effect(24) "pn:dyn_compress_medium|Dynamic Compressor (Medium)|1|Gain %|0|1000|100|1"
set effect(25) "pn:dyn_compress_hard|Dynamic Compressor (Hard)|1|Gain %|0|1000|100|1"
set effect(26) "pn:dyn_compress_brutal|Dynamic Compressor (Brutal)|1|Gain %|0|1000|100|1"
set 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"
set effect(28) "pn:eq_template2|2 Bands Equalizer|2|1000hz|0|500|100|1|4000hz|0|500|100|1"
set effect(29) "pn:f_lowp_sine|Resonator Lowpass Filter (Controlled by a sine wave)|0"
set effect(30) "pn:f_lowp_sine2|Lowpass Filter (Controlled by a sine wave)|0"
set effect(31) "pn:f_high_and_low|Parallel High amd Lowpass Filter|0"
set effect(32) "pn:f_res_bandpass|Resonator Bandpass Filter|2|Freq|0|4500|1500|1|Width|1|2100|700|1"
set effect(33) "pn:f_res_lowpass|Resonator Lowpass Filter|1|Freq|0|2000|800|1"
set effect(34) "pn:f_lowpass|Simple Lowpass Filter|1|Freq|0|2000|300|1"
set effect(35) "pn:f_bandpass|Bandpass Filter|2|Freq|0|4500|1500|1|Width|1|2100|700|1"
set effect(36) "pn:f_rejectband|Band Reject Filter|0"
set effect(37) "pn:f_highpass|Resonator Lowpass Filter|1|Freq|0|3000|1500|1"
set effect(38) "pn:f_inverse_comb|Inverse Combined Filter|0"
set effect(39) "pn:f_resonator|Resonator Filter|0"
set 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"
set 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"
set effect(42) "pn:f_filtertest|Two Parallel Filters|2|Freq 1|0|2000|100|1|Freq 2|4000|10000|5000|1"
set effect(43) "pn:gate_noisegate_1|Noise Gate|0"
set effect(44) "pn:gate_noisegate_delanalog|Noise Gate for Analog Hum Removal|0"
set effect(45) "pn:gate_crop|Crop Gate Example|0"
set effect(46) "pn:gate_threshold|Threshold Gate Example|0"
set effect(47) "pn:time_reverb1|Bathroom Reverb|0"
set effect(48) "pn:time_reverb2|Plain Reverb|0"
set effect(49) "pn:time_reverb3|Fake Stereo|0"
set effect(50) "pn:time_reverb4|Reverb Combo|0"
set effect(51) "pn:time_delay1|200ms Triple Delay|0"
set effect(52) "pn:time_delay2|200ms Triple Multidelay|0"
set effect(53) "pn:time_wicked_dub|Wicked Dub Mix|0"
set effect(54) "pn:time_flanger1|Flanger Example|0"
set effect(55) "pn:time_chorus1|Chorus Example|0"
set effect(56) "pn:time_phaser1|Phaser Example|0"
set effect(57) "pn:var_sweeping_pan|Sweeping Pan Envelope|1|Speed Hz|0.1|100|0.2|0.01"
set effect(58) "pn:var_switching_pan|Alternates between Left and Right|1|Speed Hz|0.1|100|0.2|0.01"
set effect(59) "pn:chipmunk_generator|Chipmunk Generator|0"
set effect(60) "pn:var_parchid|Chipmunk Sweep|2|Pitch |0|500|100|1|Mod. Freq |0|1|0.5|0.01"
set 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"
# Contributed Arto Hamara
set effect(62) "pn:var_stretched_tape|Stretched Tape|0"
set effect(63) "pn:var_molten_tape|Molten Tape|0"
set effect(64) "pn:var_dali|Dali|0"
# Contributed S Macy
set effect(65) "pn:var_aw|Classic Auto Wah|1|Speed|0.01|1|0.1|0.01"
set 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"
set effect(67) "pn:var_aw_tri|Auto Wah Triangular Osc.|1|Speed|0.01|1|0.1|0.01"
set effect(68) "pn:var_aw_tri_custom|Auto Wah Triangular Osc. with Control|1|Speed|0.01|1|0.1|0.01"
set effect(69) "pn:var_aw_ksv|Volume Sensitive Wah|0"

set effect_index(0) "None"

for {set n 1} {$n <= $eca_effects} {incr n} {
    set current_effect [split $effect($n) |]
    set effect_index($n) [lindex $current_effect 0]
    set effect_name($effect_index($n)) [lindex $current_effect 1]
    set effect_maker($effect_index($n)) "Kai Vehmanen"
    set effect_copy($effect_index($n)) "(c) 1997-2001 Kai Vehmanen"
    if {$n>=62 && $n<= 64} {
	set effect_maker($effect_index($n)) "Arto Hamara"
	set effect_copy($effect_index($n)) "(c) Unknown"
    }	
    if {$n>=65 && $n<= 69} {
	set effect_maker($effect_index($n)) "S. Macy"
	set effect_copy($effect_index($n)) "(c) Unknown"
    }	
    set effect_param($effect_index($n)) [lindex $current_effect 2]
    set pn2 3
    for {set pn 1} {$pn <= $effect_param($effect_index($n))} {incr pn} {    
	set effect_param_name($effect_index($n)$pn) [lindex $current_effect $pn2]
	incr pn2
	set effect_param_from($effect_index($n)$pn) [lindex $current_effect $pn2]
	incr pn2				
	set effect_param_to($effect_index($n)$pn) [lindex $current_effect $pn2]
	incr pn2
	set effect_param_value($effect_index($n)$pn) [lindex $current_effect $pn2]
	incr pn2
	set effect_param_resolution($effect_index($n)$pn) [lindex $current_effect $pn2]
	incr pn2
    }
}

while {[gets $rc_infile input_line] != -1 } {
    set current_line [split $input_line =] 
    set current_parameter [lindex $current_line 0]
    set current_value [lindex $current_line 1]
    if {[string match *ladspa* $current_parameter] == 1} {
	regsub { } $current_value {} current_value
	set ladspa_path $current_value
    }
    if {[string match *wave-editor* $current_parameter] == 1} {
	regsub { } $current_value {} current_value
	set wave_editor $current_value
    }
    if {[string match *efault-output* $current_parameter] == 1} {
	regsub {default-output =} $current_value {} current_value
	regsub { } $current_value {} current_value
	set default_audio_io $current_value
    }
}

if {[string match */* $ladspa_path] == 1 || [string match /* $ladspa_path] == 1} {ladspa} else {messages [format "No LADSPA Support"]}

