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

#    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: luispa8@yahoo.com.ar	

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 -bg $bgcolor
    frame .locate.locate -bg $bgcolor
    set loc_number 1
    if {$time_format=="Minutes"} {
	for {set n 1} {$n <= 4} {incr n} {
	    for {set en 1} {$en <= 4} {incr en} {	
		entry .locate.locate.minutes$loc_number -bg White -width 3 -textvariable sp_minutes_loc($loc_number)
		label .locate.locate.position$loc_number -bg $bgcolor -text :
		entry .locate.locate.seconds$loc_number -bg White -width 5 -textvariable sp_seconds_loc($loc_number)
		button .locate.locate.button$loc_number -bg AntiqueWhite -activebackground LightPink -text $loc_number -command "
		set locate_name $loc_number
		move_to_locate"
		incr loc_number
	    }
	}
	frame .locate.punch -bg $bgcolor
	label .locate.punch.in_text -bg $bgcolor -text "Punch-in Position:"
	entry .locate.punch.in_minutes -bg White -width 3 -textvariable mfe(punch_in_minutes)
	label .locate.punch.in_sep -bg $bgcolor -text :
	entry .locate.punch.in_seconds -bg White -width 5 -textvariable mfe(punch_in_seconds)

	label .locate.punch.out_text -bg $bgcolor -text "Punch-Out Position"
	entry .locate.punch.out_minutes -bg White -width 3 -textvariable mfe(punch_out_minutes)
	label .locate.punch.out_sep -bg $bgcolor -text :
	entry .locate.punch.out_seconds -bg White -width 5 -textvariable mfe(punch_out_seconds)

    } else {
	for {set n 1} {$n <= 4} {incr n} {
	    for {set en 1} {$en <= 4} {incr en} {	
		entry .locate.locate.minutes$loc_number -bg $bgcolor -fg $bgcolor -width 0 -textvariable sp_minutes_loc($loc_number) -state disabled -relief flat
		label .locate.locate.position$loc_number -bg $bgcolor -text ""
		entry .locate.locate.seconds$loc_number -bg White -width 7 -textvariable sp_seconds_loc($loc_number)
		button .locate.locate.button$loc_number -bg AntiqueWhite -activebackground LightPink -text $loc_number -command "
		set locate_name $loc_number
		move_to_locate"
		incr loc_number
	    }
	}
	frame .locate.punch -bg $bgcolor
	label .locate.punch.in_text -bg $bgcolor -text "Punch-in Position:"
	entry .locate.punch.in_minutes -bg $bgcolor -fg $bgcolor -width 0 -textvariable mfe(punch_in_minutes) -state disabled -relief flat
	label .locate.punch.in_sep -bg $bgcolor -text ""
	entry .locate.punch.in_seconds -bg White -width 7 -textvariable mfe(punch_in_seconds)

	label .locate.punch.out_text -bg $bgcolor -text "Punch-Out Position"
	entry .locate.punch.out_minutes -bg $bgcolor -fg $bgcolor -width 0 -textvariable mfe(punch_out_minutes) -state disabled -relief flat
	label .locate.punch.out_sep -bg $bgcolor -text ""
	entry .locate.punch.out_seconds -bg White -width 7 -textvariable mfe(punch_out_seconds)
    }
    
    grid .locate.locate.minutes1 .locate.locate.position1 .locate.locate.seconds1 .locate.locate.button1  \
    .locate.locate.minutes2 .locate.locate.position2 .locate.locate.seconds2 .locate.locate.button2 \
    .locate.locate.minutes3 .locate.locate.position3 .locate.locate.seconds3 .locate.locate.button3 \
    .locate.locate.minutes4 .locate.locate.position4 .locate.locate.seconds4 .locate.locate.button4 \
    -sticky ewns
    grid .locate.locate.minutes5 .locate.locate.position5 .locate.locate.seconds5 .locate.locate.button5 \
    .locate.locate.minutes6 .locate.locate.position6 .locate.locate.seconds6 .locate.locate.button6 \
    .locate.locate.minutes7 .locate.locate.position7 .locate.locate.seconds7 .locate.locate.button7 \
    .locate.locate.minutes8 .locate.locate.position8 .locate.locate.seconds8 .locate.locate.button8 \
    -sticky ewns
    grid .locate.locate.minutes9 .locate.locate.position9 .locate.locate.seconds9 .locate.locate.button9 \
    .locate.locate.minutes10 .locate.locate.position10 .locate.locate.seconds10 .locate.locate.button10 \
    .locate.locate.minutes11 .locate.locate.position11 .locate.locate.seconds11 .locate.locate.button11 \
    .locate.locate.minutes12 .locate.locate.position12 .locate.locate.seconds12 .locate.locate.button12 \
    -sticky ewns
    grid .locate.locate.minutes13 .locate.locate.position13 .locate.locate.seconds13 .locate.locate.button13 \
    .locate.locate.minutes14 .locate.locate.position14 .locate.locate.seconds14 .locate.locate.button14 \
    .locate.locate.minutes15 .locate.locate.position15 .locate.locate.seconds15 .locate.locate.button15 \
    .locate.locate.minutes16 .locate.locate.position16 .locate.locate.seconds16 .locate.locate.button16 \
    -sticky ewns

    pack .locate.locate
    grid .locate.punch.in_text .locate.punch.in_minutes .locate.punch.in_sep .locate.punch.in_seconds \
    .locate.punch.out_text .locate.punch.out_minutes .locate.punch.out_sep .locate.punch.out_seconds 
    pack .locate.punch
}

proc move_to_locate {} {
        global sp_minutes sp_seconds locate_name sp_minutes_loc sp_seconds_loc 
	set sp_minutes $sp_minutes_loc($locate_name)
	set sp_seconds $sp_seconds_loc($locate_name)
	display_position
}

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  

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] 
	    }
	} 
	}
    }
        
}

set eca_effects [expr $index - 1]
}

proc solo_unsolo {} {
    global stop_command mfe track_num playhandle solo_tracks number_of_tracks w prev_track_status 
    if {$solo_tracks==0} {
	set solo_tracks 1
	set 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} {
	    $w.play$n configure -state disabled
    	    if {$n!=$track_num} {
		set 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.play$n configure -state normal
    	    if {$mfe(track_status$n)!=$prev_track_status($n)} {
		if {$stop_command==0} {
		    puts $playhandle "c-select $n\nc-muting"
		}
		set mfe(track_status$n) $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 prev_track_status 
    if {$solo_tracks==0} {return}
    for {set n 1} {$n <= $number_of_tracks} {incr n} {
	if {$mfe(track_solo$n)=="Solo"} {
	    if {$prev_track_status($n)=="Mute" && $stop_command==0} {
		puts $playhandle "c-select $n\nc-muting"
	    }
	} else {
	    if {$prev_track_status($n)=="Play" && $stop_command==0} {
		puts $playhandle "c-select $n\nc-muting"
	    }
	}
    	set mfe(track_status$n) $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
    set mfe(track_status$track_num) "Deleted"
    destroy $w.number$track_num 
    destroy $w.delete$track_num  
    destroy $w.file$track_num 
    destroy $w.open$track_num 
    destroy $w.track_properties$track_num 
    destroy $w.dev_text$track_num  
    destroy $w.dev_entry$track_num  
    destroy $w.chn_text$track_num  
    destroy $w.chn_entry$track_num  
    destroy $w.solo$track_num 
    destroy $w.play$track_num 
    destroy $w.rec$track_num  
    destroy $w.effect$track_num 
    destroy $w.eca_tools$track_num 
    destroy $w.pan$track_num 
    destroy $w.slide$track_num 
}

proc add_track {} {
    global mfe number_of_tracks number_of_files mt_font n eca_effects effect_index effect_name mfe_temp w track_num bgcolor3 mixdown edit_effect prev_loaded_file stop_command
    set bgcolor3 AntiqueWhite2
    set n $number_of_tracks
    if {$mfe(track_status$n)=="Deleted"} {return}
#    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 *29]"
	if {$n < 10} {set number "0$n"}

	entry $w.number$n -bg AntiqueWhite -font $mt_font -width 5 -textvariable mfe(track_name$n)
	button $w.delete$n -bg LightSkyBlue -activebackground LightSeaGreen -font $mt_font -text "Del" -padx 1 -command "
	set track_num $n 
	delete_current_track"
	entry $w.file$n -bg White -font $mt_font -width 12 -textvariable mfe(file$n)
	button $w.open$n -bg LightPink2 -activebackground LightSeaGreen -font $mt_font -text ... -padx 1 -command "
	set track_num $n 
	set types {{{Wav files} {*.wav}} {{mp3 files} {*.mp3}} {{raw files} {*.raw}} {{efw files} {*.efw}} {{all} {*}}}
	file_browser"
	button $w.track_properties$n -bg LightBlue3 -activebackground LightSeaGreen -font $mt_font -text "P" -relief raised -padx 1 -command "
	set track_num $n 
	set mixdown 0
	rec_properties"

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

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

	menubutton $w.effect$n -bg LightPink2 -activebackground LightSeaGreen -font $mt_font -text "E" -relief raised -padx 1 -menu $w.effect$n.type
	menu $w.effect$n.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 "gray"
	    } else {
	    	set mfe_temp(effect$en$n) $mfe(effect$en$n)
		if {$mfe(effect_attached$en$n)=="Bypassed"} {
		    set effect_fg "gray"
		} else {
		    set effect_fg "black"
		}
	    }
	    if {$mfe(effect$en$n)=="None"} {
		set effect_name_current "Effect $en"
		set effect_fg2 "gray"
	    } else {
		set effect_name_current $effect_name($mfe_temp(effect$en$n))
		set effect_fg2 "black"
	    }

	    $w.effect$n.type add cascade -label $effect_name_current -foreground $effect_fg -menu $w.effect$n.type.$en
		    menu $w.effect$n.type.$en -tearoff 0
		    $w.effect$n.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$n.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$n.type.$en add command -label "Connect/Bypass" -foreground $effect_fg2 -command "
		    	set effect_num $en
			set track_num $n
			effect_bypass	
		    "
		    $w.effect$n.type.$en add command -label "Delete Effect" -foreground $effect_fg2 -command "
			set effect_num $en
			set track_num $n
			delete_effect"
	
#	$w.effect$n.type entryconfigure $en -foreground $effect_fg
	}    
	set prev_loaded_file 0
	menubutton $w.eca_tools$n -font $mt_font -bg LightBlue3 -activebackground LightSeaGreen -text "T" -relief raised -padx 1 -menu $w.eca_tools$n.type
	menu $w.eca_tools$n.type -tearoff 0
	$w.eca_tools$n.type add command -label "Normalize" -command "
	set track_num $n
	ecanormalize"
	$w.eca_tools$n.type add command -label "DC Offset Fix" -command "
	set track_num $n
	ecafixdc"
	$w.eca_tools$n.type add command -label "Wave Edit" -command "
	set track_num $n
	wave_edit"
	$w.eca_tools$n.type add command -label "Wave File Delete" -command "
	set track_num $n
	wave_file_delete"

	scale $w.pan$n -bg $bgcolor3 -activebackground red -font $mt_font -from 0 -to 100 -length 130 -width 3 -orient horizontal -showvalue true -variable mfe(pan$n) -command "
	set track_num $n
	set mfe(controller_number) 1
	set mfe(param_number) 1
	set mfe(param_value) pan$n
	change_volume_pan_on_the_fly  
	set mfe(pan$n)"
	scale $w.slide$n -bg $bgcolor3 -activebackground red -font $mt_font -resolution 1 -from 0 -to 300 -length 229 -width 3 -orient horizontal -showvalue true -variable mfe(volume$n) -command "
	set track_num $n
	set mfe(controller_number) 0
	set mfe(param_number) 1
	set mfe(param_value) volume$n
	change_volume_pan_on_the_fly  
	set mfe(volume$n)"
	grid $w.number$n $w.delete$n $w.file$n $w.open$n $w.track_properties$n $w.dev_text$n $w.dev_entry$n $w.chn_text$n $w.chn_entry$n $w.solo$n $w.play$n $w.rec$n $w.effect$n $w.eca_tools$n $w.pan$n $w.slide$n -sticky ewns

}
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]
    $w.effect$track_num.type entryconfigure $effect_order -label "Effect $effect_num" -foreground gray
    set mfe(effect_attached$effect_num$track_num) "Connected"
    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.effect$track_num.type entryconfigure $effect_order_number -foreground gray
#	$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.effect$track_num.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 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$track_num.type entryconfigure $effect_order_number -foreground gray
#	$w.effect$track_num.type.$effect_num entryconfigure 4 -label "Bypassed"
    } else {
    	set mfe(effect_attached$effect_num$track_num) "Connected"
#	$w.effect$track_num.type.$effect_num entryconfigure 4 -label "Connected"
	$w.effect$track_num.type entryconfigure $effect_order_number -foreground black
    }
}

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) != ""} {
	    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 -bg AntiqueWhite
    message .wave_file_delete.out -bg AntiqueWhite -width 300 -text "Are you sure you want to delete\nfile Track $track_num" 
    button .wave_file_delete.button1 -bg LightBlue -activebackground LightPink -text Cancel -command {destroy .fixdc}
    button .wave_file_delete.button2 -bg LightBlue -activebackground LightPink -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 tick {} {
    global stop_command start_time sp_seconds sp_seconds2 sp_minutes time_format mfe punch play_text fw_text rew_text rewbeg_text
    if {$stop_command} {return}
    after 50 tick
    set elapsedMS [expr {[clock clicks -milliseconds] - $start_time} - 250]
    set sp_seconds [expr $sp_seconds2 + {double($elapsedMS)/1000}]
    if {$sp_seconds >= 60 && $time_format=="Minutes"} {
	set start_time [expr $start_time+60000+$sp_seconds2]
	set sp_minutes [expr $sp_minutes+1]
    }
    display_position
}

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

}

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} {
	$w.rec$n 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"} {    
		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)
	}
    }

}

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 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)
    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)==""} {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$track_num.type.$effect_num entryconfigure 1 -foreground gray
	$w.effect$track_num.type.$effect_num entryconfigure 2 -foreground gray
	$w.effect$track_num.type.$effect_num entryconfigure 3 -foreground gray
	return
    } else {
	$w.effect$track_num.type.$effect_num entryconfigure 1 -foreground black    
	$w.effect$track_num.type.$effect_num entryconfigure 2 -foreground black    
	$w.effect$track_num.type.$effect_num entryconfigure 3 -foreground black    
    }
    set effect_label $mfe_temp(effect$effect_num$track_num)
    set effect_menu_order [expr $effect_num-1]
    $w.effect$track_num.type entryconfigure $effect_menu_order -menu $w.effect$track_num.type.$effect_num -label $effect_name($mfe_temp(effect$effect_num$track_num))    
    
    toplevel .effect$effect_num$track_num
    message .effect$effect_num$track_num.out -width 600 -bg $bgcolor -text "Track:$track_num --- Effect:$effect_num ----------------- $effect_name($mfe_temp(effect$effect_num$track_num))"
    pack .effect$effect_num$track_num.out -expand yes -fill x    

    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 -font $mt_font -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  -side right
	pack .effect$effect_num$track_num.$n
    }

    frame .effect$effect_num$track_num.buttons -bd 3 -bg $bgcolor
    button .effect$effect_num$track_num.buttons.close -bg AntiqueWhite -activebackground LightPink -text Close -command "
	set effect2 $effect_num
	set track $track_num
	close_effect
    "

    button .effect$effect_num$track_num.buttons.preview -bg AntiqueWhite -activebackground LightPink -text " Preview " -height 0 -command { 
    if {$stop_command == 1} { 
	set stop_command 0
	set preview 1
	set effect2 "$effect_num"
	set track "$track_num"
	set play_text "Stop"
	set fw_text " "
	set rew_text " "
	set rewbeg_text " "
	preview}
    } 
    button .effect$effect_num$track_num.buttons.full_preview -bg AntiqueWhite -activebackground LightPink -text " Full Preview " -height 0 -command { 
    if {$stop_command == 1} { 
	set stop_command 0
	set preview 2
	set track "$track_num"
	set play_text "Stop"
	set fw_text " "
	set rew_text " "
	set rewbeg_text " "
	preview }
    } 

    button .effect$effect_num$track_num.buttons.info -bg AntiqueWhite -activebackground LightPink -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 both
    pack .effect$effect_num$track_num.buttons.full_preview -side left -expand 1 -fill both
    pack .effect$effect_num$track_num.buttons.close -side left -expand 1 -fill both
    pack .effect$effect_num$track_num.buttons.info -side left -expand 1 -fill both
    pack .effect$effect_num$track_num.buttons -in .effect$effect_num$track_num -side top -expand 1 -fill both
    
}

proc messages {msg} {
    if {[winfo exists .msg] != 0} {destroy .msg}
    toplevel .msg -bg AntiqueWhite
    message .msg.out -bg AntiqueWhite -width 300 -text $msg
    button .msg.button -bg LightBlue -activebackground LightPink -text Ok -command {destroy .msg}
    pack .msg.out -expand y -fill x
    pack .msg.button
}


proc ecanormalize {} {
    global mfe track_num
    if {[winfo exists .normalize] != 0} {destroy .normalize}
    toplevel .normalize -bg AntiqueWhite
    message .normalize.out -bg AntiqueWhite -width 300 -text "Are you sure you want to Normalize\nfiles on Track $track_num" 
    button .normalize.button1 -bg LightBlue -activebackground LightPink -text Cancel -command {destroy .normalize}
    button .normalize.button2 -bg LightBlue -activebackground LightPink -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 -bg AntiqueWhite
    message .fixdc.out -bg AntiqueWhite -width 300 -text "Are you sure you want to fix DC Offset\nin files on Track $track_num" 
    button .fixdc.button1 -bg LightBlue -activebackground LightPink -text Cancel -command {destroy .fixdc}
    button .fixdc.button2 -bg LightBlue -activebackground LightPink -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.0.0"
    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(multichannel)"    
    puts $file_to_save "$mfe(rec_prop_bits0)"
    puts $file_to_save "$mfe(rec_prop_channels0)"
    puts $file_to_save "$mfe(rec_prop_srate0)"
    puts $file_to_save "$mfe(rec_prop_interl0)"

    for {set n 1} {$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 {$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
    if {$temp_file($line_number)!="This file was created by tkeca.tcl version 4.0.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} {
	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 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
    set mfe(multichannel) $temp_file($line_number)
    incr line_number
    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

    for {set n 1} {$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
	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)
}

proc track_data_reset {} {
    global mfe track_num
    set mfe(rec_prop_bits$track_num) "s16_le"
    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) ""
    set mfe(device$track_num) "Default"
    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 mfe sp_minutes_loc sp_seconds_loc play_command sp_minutes sp_seconds exit_yes save_as track_num
    for {set number_of_tracks1 1} {$number_of_tracks1 <= $number_of_tracks} {incr number_of_tracks1} {
	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
#	set track_num $number_of_tracks1
#	track_data_reset
    }
    set number_of_tracks 0
    set mfe(openfile0) ""
    set play_command "play"
    set mfe(multichannel) 0
    set mfe(rec_prop_bits0) "s16_le"
    set mfe(rec_prop_channels0) "2"
    set mfe(rec_prop_srate0)  "44100"
    set mfe(rec_prop_interl0) "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: luispa8@yahoo.com.ar"]}

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(multichannel) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(rec_prop_bits0) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(rec_prop_channels0) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(rec_prop_srate0) != $temp_file($line_number)} {set saved 0}
    incr line_number
    if {$mfe(rec_prop_interl0) != $temp_file($line_number)} {set saved 0}
    incr line_number

    for {set n 1} {$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} {
	toplevel .save_alert -bg AntiqueWhite
	message .save_alert.out -bg AntiqueWhite -width 300 -text "You will lose the latest changes! \nWhat do you want to do?" 
	button .save_alert.button1 -bg LightBlue -activebackground LightPink -text Cancel -command {
	destroy .save_alert
	}
	button .save_alert.button2 -bg LightBlue -activebackground LightPink -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 -bg LightBlue -activebackground LightPink -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 mixdown {} {
    global track_num mixdown mfe types number_of_tracks
    set types {{{Wav files} {*.wav}} {{mp3 files} {*.mp3}} {{raw files} {*.raw}} {{all} {*}}}
    set mfe(rec_prop_bitsMD) "s16_le"
    set mfe(rec_prop_channelsMD) "2"
    set mfe(rec_prop_srateMD) "44100"
    set mfe(rec_prop_interlMD) "i"
    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
}

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 pause {} {
    global pause playhandle
    if {$pause == "Pause"} {
	puts $playhandle "s\n"
	set pause "Continue"    
    } else {
    	puts $playhandle "t\n"    
	set pause "Pause"
    }

}
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 -bg $bgcolor
    frame .effect$effect_num$track_num.list
    listbox .effect$effect_num$track_num.list.list -width 40 -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 y
    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
    .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 -bg $bgcolor
    button .effect$effect_num$track_num.buttons.button1 -bg AntiqueWhite -activebackground LightPink -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 -bg AntiqueWhite -activebackground LightPink -text Cancel -command {
    destroy .effect$effect_num$track_num
    return}
    pack .effect$effect_num$track_num.buttons.button1 -padx 50 -side left
    pack .effect$effect_num$track_num.buttons.button2 -padx 50 -side left
    pack .effect$effect_num$track_num.buttons -in .effect$effect_num$track_num -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 -bg $bgcolor
    frame .options.up -bg $bgcolor
    message .options.up.out -bg $bgcolor -width 540 -text "Global Settings"
    pack .options.up.out -expand y -fill x    
    pack .options.up -expand y -fill x    

    frame .options.med -bg AntiqueWhite
    canvas .options.med.canvas -bg AntiqueWhite -width 520 -height 340 -yscrollcommand [list .options.med.yscroll set]
    set w2 [frame .options.med.canvas.f -bg AntiqueWhite -bd 0]
    .options.med.canvas create window 0 0 -anchor nw -window $w2
    scrollbar .options.med.yscroll -bg AntiqueWhite -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]"
    	label $w2.param$line_number -bg AntiqueWhite -font $mt_font -text $option_parameter($line_number) -anchor w	
    	entry $w2.value$line_number -bg white -width 50 -textvariable option_value($line_number)
	incr line_number
    }
    for {set row_number 0} {$row_number < $line_number} {incr row_number} {
	grid $w2.param$row_number $w2.value$row_number -sticky w
    } 

    pack .options.med.canvas -expand true -side left
    pack .options.med.yscroll -fill y -expand true -side top
    pack .options.med -fill x -expand true -side top
    button .options.ok -bg LightBlue -activebackground LightPink -text Ok -command {save_options}
    button .options.cancel -bg LightBlue -activebackground LightPink -text Cancel -command {destroy .options}
    pack .options.ok -fill x -expand true -side left
    pack .options.cancel -fill x -expand true -side left
    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
    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}
    toplevel .rec_properties$track_num -bg $bgcolor 
    set w .rec_properties$track_num
    if {$mixdown==0} {
	label $w.text -bg $bgcolor -text "Track $track_num Properties"
    } elseif {$mixdown==1} {
    	label $w.text -bg $bgcolor -text "Mixdown Properties"
    } else {
	label $w.text -bg $bgcolor -text "Global Multichannel Properties"
	set track_num 0
    }
    set mfe(rec_prop_bits$track_num) "s16_le"
    set mfe(rec_prop_channels$track_num) "2"
    set mfe(rec_prop_srate$track_num)  "44100"
    set mfe(rec_prop_interl$track_num) "i"

    frame $w.bits -bg AntiqueWhite
    label $w.bits.l -bg AntiqueWhite -text "Bits:" -justify left
    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
    
    frame $w.channels -bg AntiqueWhite
    label $w.channels.l -bg AntiqueWhite -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"

    frame $w.srate -bg AntiqueWhite
    label $w.srate.l -bg AntiqueWhite -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"
    
    frame $w.interleaved -bg AntiqueWhite
    label $w.interleaved.l -bg AntiqueWhite -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.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
    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.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 -sticky ewns
    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
#    grid $w.srate2.5 $w.srate2.6 $w.srate2.7 $w.srate2.8 -sticky ewns
    pack $w.srate1
#    pack $w.srate2
    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 -bg LightSkyBlue -activebackground LightPink -text "Close" -command "
	    destroy .rec_properties$track_num
	    return"
	pack $w.close -expand yes -fill x -side top
    } else {
	set mfe(mixdown_compressor) "No"
	set mfe(mixdown_compressor_peak_level) 69
	set mfe(mixdown_compressor_release_time) 0.2
	set mfe(mixdown_compressor_fast_rate) 0.5
	set mfe(mixdown_compressor_comp_rate) 0.5
	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"
	
	frame $w.pr_time -bg AntiqueWhite
	label $w.pr_time.l -bg AntiqueWhite -text "Processing Time:" -justify left

	frame $w.pr_time2 -bg $bgcolor
	label $w.pr_time2.l -font $mt_font -bg $bgcolor -text "Start Position: "
	entry $w.pr_time2.2 -font $mt_font -bg White -width 3 -textvariable mfe(mixdown_begin_min)
	label $w.pr_time2.3 -font $mt_font -bg $bgcolor -text :
	entry $w.pr_time2.4 -font $mt_font -bg White -width 5 -textvariable mfe(mixdown_begin_sec)

	label $w.pr_time2.5 -font $mt_font -bg $bgcolor -text "              End Position: "
	entry $w.pr_time2.6 -font $mt_font -bg White -width 3 -textvariable mfe(mixdown_end_min)
	label $w.pr_time2.7 -font $mt_font -bg $bgcolor -text :
	entry $w.pr_time2.8 -font $mt_font -bg White -width 5 -textvariable mfe(mixdown_end_sec)

	frame $w.compressor -bg AntiqueWhite
	label $w.compressor.l -bg AntiqueWhite -text "Apply Compressor After Mixdown:" -justify left
	frame $w.compressor1 -bg $bgcolor 
	frame $w.compressor3 -bg $bgcolor 
	frame $w.compressor4 -bg $bgcolor 
	frame $w.compressor5 -bg $bgcolor 
	frame $w.compressor6 -bg $bgcolor 
	radiobutton $w.compressor1.1 -font $mt_font -bg $bgcolor -text "Yes           " -variable mfe(mixdown_compressor) -value "Yes"
	radiobutton $w.compressor1.2 -font $mt_font -bg $bgcolor -text "No" -variable mfe(mixdown_compressor) -value "No"
	label $w.compressor3.1 -font $mt_font -bg $bgcolor -width 20 -text "Peak Level %:"
	entry $w.compressor3.1b -font $mt_font -bg $bgcolor -width 5 -justify left -relief flat -textvariable mfe(mixdown_compressor_peak_level)
	scale $w.compressor3.2 -bg $bgcolor -activebackground red -font $mt_font -from 0 -to 100 -resolution 1 -length 280 -width 3 -orient horizontal -showvalue false -variable mfe(mixdown_compressor_peak_level)
	label $w.compressor4.3 -font $mt_font -bg $bgcolor -width 20 -text "Release Time (Seconds):"
	entry $w.compressor4.3b -font $mt_font -bg $bgcolor -width 5 -justify left -relief flat -textvariable mfe(mixdown_compressor_release_time)
	scale $w.compressor4.4 -bg $bgcolor -activebackground red -font $mt_font -from 0 -to 2 -resolution 0.05 -length 280 -width 3 -orient horizontal -showvalue false -variable mfe(mixdown_compressor_release_time)
	label $w.compressor5.5 -font $mt_font -bg $bgcolor -width 20 -text "Fast Compr. Rate:"
	entry $w.compressor5.5b -font $mt_font -bg $bgcolor -width 5 -justify left -relief flat -textvariable mfe(mixdown_compressor_fast_rate)
	scale $w.compressor5.6 -bg $bgcolor -activebackground red -font $mt_font -from 0 -to 1 -resolution 0.01 -length 280 -width 3 -orient horizontal -showvalue false -variable mfe(mixdown_compressor_fast_rate)
	label $w.compressor6.7 -font $mt_font -bg $bgcolor -width 20 -text "Compressor Rate:"
	entry $w.compressor6.7b -font $mt_font -bg $bgcolor -width 5 -justify left -relief flat -textvariable mfe(mixdown_compressor_comp_rate)
	scale $w.compressor6.8 -bg $bgcolor -activebackground red -font $mt_font -from 0 -to 1 -resolution 0.01 -length 280 -width 3 -orient horizontal -showvalue false -variable mfe(mixdown_compressor_comp_rate)
	
	pack  $w.pr_time -expand yes -fill x -side top
	pack  $w.pr_time.l -expand yes -fill x -side top
	grid  $w.pr_time2.l $w.pr_time2.2 $w.pr_time2.3 $w.pr_time2.4 $w.pr_time2.5 $w.pr_time2.6 $w.pr_time2.7 $w.pr_time2.8 -sticky ewns
	pack  $w.pr_time2 -expand yes -fill x -side top
	pack $w.compressor.l -expand yes -fill x -side top
	pack $w.compressor -expand yes -fill x -side top
	grid $w.compressor1.1 $w.compressor1.2 -sticky ewns
	pack $w.compressor1 -expand yes -fill x -side top
	pack $w.compressor3.1 -side left
	pack $w.compressor3.1b -side left
	pack $w.compressor3.2
	pack $w.compressor4.3 -side left
	pack $w.compressor4.3b -side left
	pack $w.compressor4.4
	pack $w.compressor5.5 -side left
	pack $w.compressor5.5b -side left
	pack $w.compressor5.6
	pack $w.compressor6.7 -side left
	pack $w.compressor6.7b -side left
	pack $w.compressor6.8
	pack $w.compressor3 -expand yes -fill x -side top
	pack $w.compressor4 -expand yes -fill x -side top
	pack $w.compressor5 -expand yes -fill x -side top
	pack $w.compressor6 -expand yes -fill x -side top
	
	frame $w.normalize -bg AntiqueWhite
	label $w.normalize.l -bg AntiqueWhite -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
    	button $w.close -bg LightSkyBlue -activebackground LightPink -text "Ok" -command "
	    file_browser2
	    play
	    destroy .rec_properties$track_num
	    return"
	
	pack $w.close -expand yes -fill x -side top
    }
}

proc ladspa_loading_window {} {
    if {[winfo exists .ladspa_loading] != 0} {
        destroy .ladspa_loading
        return
    }
    toplevel .ladspa_loading
    message .ladspa_loading.out -width 300 -text "Please wait!\nTkeca is loading LADSPA plug-ins"
    pack .ladspa_loading.out -expand y -fill x
}



############################### 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 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

set bgcolor cyan3

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

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

set mt_font [font create -family Helvetica -size 10 -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) "s16_le"
set mfe(rec_prop_channels0) "2"
set mfe(rec_prop_srate0)  "44100"
set mfe(rec_prop_interl0) "i"

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(punch_in_minutes) 0
set mfe(punch_in_seconds) 0
set mfe(punch_out_minutes) 0
set mfe(punch_out_seconds) 0
set time_format "Minutes"

label .mfe.up1.title -justify left -bg $bgcolor -text "TKECA 4.0.2 - Tcl/Tk Frontend for Ecasound - 2003-2004 Luis Pablo Gasparotto " 
label .mfe.up1.text -bg $bgcolor -text "Current Directory: "
entry .mfe.up1.entry -textvariable mfe(directory)
label .mfe.up1.text2 -bg $bgcolor -text "Current File: "
entry .mfe.up1.entry2 -state disabled -textvariable mfe(openfile0)
button .mfe.up1.button -bg AntiqueWhite -activebackground LightPink -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 -bg AntiqueWhite -activebackground LightPink -text "Save file" -height 0 -command {
set save_as 0
save_file} 
button .mfe.up1.saveas -bg AntiqueWhite -activebackground LightPink -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 -bg AntiqueWhite -activebackground LightPink -text "Export .ecs" -command {export_ecs} 
button .mfe.up2.mixdown -bg AntiqueWhite -activebackground LightPink -text "Mixdown" -command {mixdown} 
button .mfe.up2.options -bg AntiqueWhite -activebackground LightPink -justify right -text Options -command {options}
button .mfe.up2.time_format -bg AntiqueWhite -activebackground LightPink -justify right -text "Time Format" -command {time_format}
button .mfe.up2.addtrack -bg AntiqueWhite -activebackground LightPink -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"
add_track}
button .mfe.up2.del_all_tracks -bg AntiqueWhite -activebackground LightPink -justify right -text "Close" -command {
set save_as 0
set exit_yes 2
proc_exit
}
button .mfe.up2.quit -bg AntiqueWhite -activebackground LightPink -justify right -text Quit -command {
set exit_yes 1
proc_exit
}
button .mfe.up2.about -bg AntiqueWhite -activebackground LightPink -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                                 "   

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

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.time_format -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
pack .mfe.up1 -side top -fill x -expand 1 
pack .mfe.up2 -side top -fill x -expand 1

pack .mfe.header.text1 -side left -expand 0
pack .mfe.header.text2 -side left -expand 0
pack .mfe.header.text3 -side left -expand 0
pack .mfe.header.text4 -side left -expand 0
pack .mfe.header.text5 -side left -expand 0
pack .mfe.header.text6 -side left -expand 0
pack .mfe.header.text7 -side left -expand 0
pack .mfe.header.text8 -side left -expand 0
pack .mfe.header
pack .mfe.tracks.yscroll -side right -fill y -expand 1
pack .mfe.tracks.canvas -side left -fill y -expand 1

set w [frame .mfe.tracks.canvas.f -bd 0]
.mfe.tracks.canvas create window 0 0 -anchor nw -window $w

pack .mfe

set stop_command 1
set sp_minutes 0
set sp_seconds 0
set pause "Pause"
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 -bg $bgcolor -text "Position:"
label .mfe.low.minutes -bg AntiqueWhite -width 3 -text 00
label .mfe.low.position2 -bg $bgcolor -text :
label .mfe.low.seconds -bg AntiqueWhite -width 5 -text 00.00
label .mfe.low.spaces -bg $bgcolor -text " "
label .mfe.low.multich -bg $bgcolor -text "Multichannel:"
checkbutton .mfe.low.multich2 -width 1 -bg $bgcolor -variable mfe(multichannel) -onvalue 1 -offvalue 0 -command "
set mixdown 3
set track_num 0
rec_properties"

button .mfe.low.loc -bg AntiqueWhite -activebackground LightPink -text Loc -height 0 -command { 
locate
}

button .mfe.low.play -bg AntiqueWhite -activebackground LightPink -textvariable play_text -height 0 -command { 
    if {$stop_command == 1} { 
	set stop_command 0
	set play_text "Stop"
	set fw_text " "
	set rew_text " "
	set rewbeg_text " "
	play 
	if {$tracks_to_play==0 && $tracks_to_rec==0} {
	    set stop_command 1
	    set play_text "Play"
	    set fw_text "Fw 5''"
	    set rew_text "Rew 5''"
	    set rewbeg_text "Go to 00:00"

	}	    	
    } else {
	set stop_command 1
	set play_text "Play"
	set fw_text "Fw 5''"
	set rew_text "Rew 5''"
	set rewbeg_text "Go to 00:00"
	stop 
    }
} 

button .mfe.low.pause -bg AntiqueWhite -activebackground LightPink -textvariable pause -height 0 -command { 
    if {$stop_command == 0} {pause}
} 

button .mfe.low.rew_to_begin -bg AntiqueWhite -activebackground LightPink -textvariable rewbeg_text  -height 0 -command { 
    if {$stop_command == 1} { 
	set sp_minutes 0	 
	set sp_seconds 0
	display_position	 
    }
} 

button .mfe.low.rew_5 -bg AntiqueWhite -activebackground LightPink -textvariable rew_text -height 0 -command { 
    if {$stop_command == 1} { 
	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
	    }
	    display_position
	} else {
	    set sp_minutes 0	 
	    set sp_seconds 0
	    display_position
	}	 
    }
} 

button .mfe.low.forw_5 -bg AntiqueWhite -activebackground LightPink -textvariable fw_text -height 0 -command { 
    if {$stop_command == 1} { 
	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
	}
	display_position
    }
} 

pack .mfe.tracks -side top
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.loc -side left -fill x -expand 1
pack .mfe.low.play -side left -fill x -expand 1
pack .mfe.low.pause -side left -fill x -expand 1
pack .mfe.low.rew_to_begin -side left -fill x -expand 1
pack .mfe.low.rew_5 -side left -fill x -expand 1
pack .mfe.low.forw_5 -side left -fill x -expand 1
pack .mfe.low -fill both -expand 1
pack .mfe

ladspa_loading_window

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
    }
}

set ecasoundrc "~/.ecasoundrc"

if {[file exists $ecasoundrc] != 1} {
    set ecasoundrc "~/.ecasound/ecasoundrc"
    if {[file exists $ecasoundrc] != 1} {
	exec cp /usr/share/ecasound/ecasoundrc $env(HOME)/.ecasoundrc
	set ecasoundrc "~/.ecasoundrc"
    }
}
    set rc_infile [open $ecasoundrc r]

set ladspa_path 0

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 {puts "No LADSPA Support"}

ladspa_loading_window


proc time_format {} {
    global time_format bgcolor sp_minutes sp_seconds sp_seconds_loc sp_minutes_loc mfe
    set loc_number 1
    if {$time_format=="Minutes"} {
	set time_format "Seconds"
	set sp_seconds [expr $sp_seconds+$sp_minutes*60]
	set sp_minutes 0
	.mfe.low.minutes configure -bg $bgcolor -width 0 -text ""
	.mfe.low.position2 configure -bg $bgcolor -width 0 -text ""
	.mfe.low.seconds configure -bg AntiqueWhite -width 7 -text $sp_seconds
	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
	if {[winfo exists .locate] != 0} {
	    for {set n 1} {$n <= 4} {incr n} {
		for {set en 1} {$en <= 4} {incr en} {	
		    set sp_seconds_loc($loc_number) [expr $sp_seconds_loc($loc_number)+$sp_minutes_loc($loc_number)*60]
		    set sp_minutes_loc($loc_number) 0
		    .locate.locate.minutes$loc_number configure -bg $bgcolor -fg $bgcolor -width 0 -state disabled -relief flat
		    .locate.locate.position$loc_number configure -bg $bgcolor -text ""
		    .locate.locate.seconds$loc_number configure -width 7
		    incr loc_number
		}
	    }	
	    .locate.punch.in_minutes configure -bg $bgcolor -fg $bgcolor -width 0 -state disabled -relief flat
	    .locate.punch.in_sep configure -bg $bgcolor -text ""
	    .locate.punch.in_seconds configure -bg White -width 7
	    .locate.punch.out_minutes configure -bg $bgcolor -fg $bgcolor -width 0 -state disabled -relief flat
	    .locate.punch.out_sep configure -bg $bgcolor -text ""
	    .locate.punch.out_seconds configure -width 7
	} else {
	    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]
	.mfe.low.minutes configure -bg AntiqueWhite -width 3 -text $sp_minutes
	.mfe.low.position2 configure -bg $bgcolor -text :
	.mfe.low.seconds configure -bg AntiqueWhite -width 5 -text $sp_seconds
	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]
	if {[winfo exists .locate] != 0} {
	    for {set n 1} {$n <= 4} {incr n} {
		for {set en 1} {$en <= 4} {incr en} {	
		    set sp_minutes_loc($loc_number) [expr $sp_seconds_loc($loc_number)/60]
		    set sp_minutes_loc($loc_number) [expr int($sp_minutes_loc($loc_number))]
		    set sp_seconds_loc($loc_number) [expr $sp_seconds_loc($loc_number)-$sp_minutes_loc($loc_number)*60]
		    .locate.locate.minutes$loc_number configure -bg White -fg Black -width 3 -state normal -relief sunken
		    .locate.locate.position$loc_number configure -bg $bgcolor -text ":"
		    .locate.locate.seconds$loc_number configure -width 5
		    incr loc_number
		}
	    }	
	    .locate.punch.in_minutes configure -bg White -fg black -width 3 -state normal -relief sunken
	    .locate.punch.in_sep configure -bg $bgcolor -text ":"
	    .locate.punch.in_seconds configure -bg White -width 5
	    .locate.punch.out_minutes configure -bg White -fg Black -width 0 -state normal -relief sunken
	    .locate.punch.out_sep configure -bg $bgcolor -text ":"
	    .locate.punch.out_seconds configure -width 5
	} else {
	    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]
	    }
	}
    }
}

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"}
}

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 sp_seconds2 punch wf_ext n punch_y punch_t default_audio_io w
    if {$mfe(directory)==""} {set mfe(directory) "."}
    set eca_string ""
    set eca_string_i ""
    set eca_string_o ""
    set track_count 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 punch_sequence ""
    set punch 0
    set punched 0
    set start_time [expr $sp_minutes*60+$sp_seconds]
    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"
    }
    for {set n 1} {$n <= $number_of_tracks} {incr n} {
    if {$mixdown == 1 || $export_ecs == 1} {
	set skip_muted_tracks "Yes"
    } else {
    	$w.rec$n configure -state disabled	
	set skip_muted_tracks "No"    
    }
    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 
	    }
	}
	    if {[string length $mfe(file$n)] > 3 && $mfe(track_status$n)!="Deleted"} { 
		if {$mfe(track_rec_status$n)=="No"} {    
		    if {$punched==1} {
			set mfe(track_rec_status$n) "Yes"    
			set punched 0
		    }
		    set eca_string "$eca_string-a:$n -i:$mfe(file$n)"
		    if {$mfe(rec_prop_channels$n)==1} {
			if {$mfe(chn$n)!= "n/a" && $mfe(multichannel)==1} {
			    set eca_string "$eca_string -erc:1,$mfe(chn$n)"
			} else {
		    	    set eca_string "$eca_string -erc:1,2"
			}

			set mfe(volume_position$n) 2
			set mfe(pan_position$n) 3
		    }
		    set eca_string "$eca_string -ea:$mfe(volume$n) -epp:$mfe(pan$n)"
		    set tracks_to_play 1
		    if {$mixdown!=1} {
			if {$mfe(device$n)=="Default"} {
			    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
		    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 eca_string "$eca_string -el:$current_effect,"
			    } elseif {[string match pn:* $mfe(effect$en$n)]==1} {
				set eca_string "$eca_string -$mfe(effect$en$n),"
			    } else {
				set eca_string "$eca_string -$mfe(effect$en$n):"
			    }	
			    for {set par 1} {$par <= $effect_param($mfe(effect$en$n)) } {incr par} { 
				if {$par>1} {set eca_string "$eca_string,"}
				set eca_string "$eca_string$mfe(effect_parameter$par$en$n)"
			    }
			}    
		    }
#		    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]
			    set eca_string "$eca_string -y:$mixdown_start"
			    if {$mixdown_proc_time>0} {
				set eca_string "$eca_string -t:$mixdown_proc_time"
			    }
			}
		    set eca_string "$eca_string \\"
		    } 
		    set eca_string "$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"} {
				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} { 
			    set eca_string_o "$eca_string_o-a:$n -f:$mfe(rec_prop_bits$n),1ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n) -erc:$mfe(chn$n),1 -o:$mfe(file$n)"

			} else {
			    set mfe(rec_prop_channels$n) 2
			    set eca_string_o "$eca_string_o-a:$n -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)"

			}
		    set eca_string_o "$eca_string_o \n"
		    } else {
			set punch 2
			for {set nd 0} {$nd <= $number_of_devices_i} {incr nd} {
			    if {$device_i($nd)==$mfe(device$n)} {
				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
			}
			set eca_string_o "$eca_string_o-a:temp-$n" 
			wave_file_ext
			set mfe(temp_file$n) "temp-$n$wf_ext"
			if {$mfe(multichannel)==1} { 
			    set eca_string_o "$eca_string_o -f:$mfe(rec_prop_bits$n),1ch,$mfe(rec_prop_srate$n),$mfe(rec_prop_interl$n) -erc:$mfe(chn$n),1 -o:$mfe(temp_file$n)"

			} else {
			    set mfe(rec_prop_channels$n) 2
			    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(temp_file$n)"			    
			}
			set punched 1
			set mfe(track_rec_status$n) "No"    
			set n [expr $n-1]		
			set eca_string_o "$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} {
	    set eca_string_o "$eca_string_o-a:$device_chains($n) -o:$device($n)\n"   
	}
    }	
    if {$mixdown == 1} {
	set normalize ""
	set exec_out1 ""
	set exec_out3 ""

	set eca_string "$eca_string-a:all -f:$mfe(rec_prop_bitsMD),$mfe(rec_prop_channelsMD)ch,$mfe(rec_prop_srateMD),$mfe(rec_prop_interlMD)"

	if {$mfe(mixdown_compressor)!="None"} {
	    set eca_string "$eca_string -o:stdout | ecasound -i:stdin -eca:$mfe(mixdown_compressor_peak_level),$mfe(mixdown_compressor_release_time),$mfe(mixdown_compressor_fast_rate),$mfe(mixdown_compressor_comp_rate) -o:$mfe(openfileMD)"
	} else {
	    set eca_string "$eca_string -o:$mfe(openfileMD)"
	}
	if {$mfe(mixdown_normalize)=="Yes"} {	
	    set normalize "ecanormalize $mfe(openfileMD)"
	}
	set mixdown 0
	set eca_string "ecasound $eca_string"
	set cmd1 "exec $eca_string"
	catch {eval $cmd1} exec_out1

	if {$mfe(mixdown_compressor)!="None"} {
	    file delete tmp.wav
	}
	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"]
	return
    }
    if {$tracks_to_rec == 1} {
        for {set n 1} {$n <= $number_of_devices_i} {incr n} {
	set eca_string_i "$eca_string_i-a:$device_chains_i($n) -i:$device_i($n)\n"   
	}
    }
    set eca_string "$eca_string_i$eca_string$eca_string_o"
    if {$mfe(multichannel)==1} {         
        set eca_string " -f:$mfe(rec_prop_bits0),$mfe(rec_prop_channels0)ch,$mfe(rec_prop_srate0),$mfe(rec_prop_interl0) $eca_string "    
    }
        
    puts "Ecasound Chainsetup:\n$eca_string"
    puts "--------------------\n"

    if {$export_ecs == 1} {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 [list ecasound -i:$mfe(file$n) $punch_y $punch_t -o:$mfe(temp_file2$n) $punch_t ]"
		catch {eval $cmd} exec_out
		set cmd2 "exec [list ecasound -i:$mfe(file$n) $punch_y $punch_t -ea:0 -o:$mfe(file$n) $punch_y $punch_t ]"		
		catch {eval $cmd2} exec_out
	    }
	}
    }
    set tkeca_log [open "~/tkeca.log" w]
#	puts $tkeca_log " "
    close $tkeca_log
    set playhandle [open "|ecasound -c $eca_string" w]
    puts "Ecasound Interactive Mode Commands:\n"
    puts "-----------------------------------\n"
    fconfigure $playhandle -buffering line -buffersize full -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_time [clock clicks -milliseconds]
    set sp_seconds2 $sp_seconds
    tick
    if {$tracks_to_play == 0 && $tracks_to_rec == 0} { 
	set stop_command 1
	messages [format "No tracks to be played or recorded"]
    }
}

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
    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} { 
	if {$mfe(track_status$n)=="Play"} {
	    set eca_string "$eca_string -a:$n -i:$mfe(file$n)"
		
		if {$mfe(rec_prop_channels$n)==1} {
		    if {$mfe(chn$n)!= "n/a" && $mfe(multichannel)==1} {
			set eca_string "$eca_string -erc:1,$mfe(chn$n)"
		    } else {
		    	set eca_string "$eca_string -erc:1,2"
		    }
			set eca_string "$eca_string -ea:$mfe(volume$n) -epp:$mfe(pan$n)"
			set mfe(volume_position$n) 2
			set mfe(pan_position$n) 3
		}
		
		set tracks_to_play 1
	    }
	if {$preview == 2} {
	    for {set en 1} {$en <= 8} {incr en} { 
		if {$mfe(effect$en$track) != "None" } {
		    if {[string match ladspa* $mfe(effect$en$track)]==1} {
			regsub ladspa_ $mfe(effect$en$track) {} current_effect
			set eca_string "$eca_string -el:$current_effect,"
		    } elseif {[string match pn:* $mfe(effect$en$track)]==1} {
			set eca_string "$eca_string -$mfe(effect$en$track),"
		    } else {	
		    	set eca_string "$eca_string -$mfe(effect$en$track):"
		    }
		    for {set par 1} {$par <= $effect_param($mfe(effect$en$track)) } {incr par} { 
			if {$par>1} {set eca_string "$eca_string,"}
			set eca_string "$eca_string$mfe(effect_parameter$par$en$track)"
		    }
		}    
	    }

	} else {
	    set en $effect2
	    if {$mfe(effect$en$track) != "None" } {
		if {[string match ladspa* $mfe(effect$en$track)]==1} {
			regsub ladspa_ $mfe(effect$en$track) {} current_effect
			set eca_string "$eca_string -el:$current_effect,"
		} elseif {[string match pn:* $mfe(effect$en$track)]==1} {
			set eca_string "$eca_string -$mfe(effect$en$track),"
		} else {
			set eca_string "$eca_string -$mfe(effect$en$track):"
		}	
		for {set par 1} {$par <= $effect_param($mfe(effect$en$track)) } {incr par} { 
		    if {$par>1} {set eca_string "$eca_string,"}
		    set eca_string "$eca_string$mfe(effect_parameter$par$en$track)"
		}
	    }    
		
	}
    }
    if {$tracks_to_play ==1} {	
	for {set n1 1} {$n1 <= $number_of_tracks} {incr n1} {
	    $w.rec$n1 configure -state disabled	
	}	
	if {$mfe(device$track)=="Default"} {
	    set eca_string "$eca_string -a:$n -o:$default_audio_io"
	} else {
	    set eca_string "$eca_string -a:$n -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 -r$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"]
    }
}
