⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tkpanel.tcl

📁 MIDI解码程序(用VC编写)
💻 TCL
📖 第 1 页 / 共 2 页
字号:
#!/usr/local/bin/wishx -f## TiMidity++ -- MIDI to WAVE converter and player# Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp># Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>## 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## TkMidity -- Tcl/Tk Interface for TiMidity#	written by Takashi IWAI## Tk control panel routine##----------------# initialize global variables#proc InitGlobal {} {    global Stat tk_patchLevel    if [catch {expr $Stat(new_tcltk) == 0 || $Stat(new_tcltk) == 1}] {	set Stat(new_tcltk) 0	if [regexp "(\[0-9\]+\.\[0-9\]+)" $tk_patchLevel cur] {	    if {$cur >= 4.0} {		set Stat(new_tcltk) 1	    }	}    }    # time table and volume    set Stat(MaxSecs) 0    set Stat(LastSec) 0    set Stat(TotalTimeStr) "/ 0:00"    # message lines    set Stat(CurMsgs) 0    set Stat(MaxMsgs) 500    # current status    set Stat(Playing) 0    set Stat(Paused) 0    set Stat(Blinking) 0    # MIDI file list    set Stat(CurIdx) -1    set Stat(MaxFiles) 0    set Stat(FileList) {}    set Stat(ShuffleList) {}    set Stat(CurFile) "--------"    set Stat(NextFile) "--------"    global Config    # playing mode    set Config(Tracing) 0    set Config(RepeatPlay) 0    set Config(ShufflePlay) 0    set Config(AutoStart) 0    set Config(AutoExit) 0    set Config(ConfirmExit) 1    # display configuration    set Config(Disp:file) 1    set Config(Disp:time) 1    set Config(Disp:text) 1    set Config(Disp:volume) 1    set Config(Disp:button) 1    set Config(Disp:trace) 1    set Config(CurFileMode) 0    # current volume    set Config(CurVol) 75    wm title . "TkMidity"    wm iconname . "TkMidity"    global bitmap_path    wm iconbitmap . @$bitmap_path/timidity.xbm}#----------------# read a message from stdin#proc HandleInput {} {    global Stat Config    set mlist [gets stdin]    set msg [lindex $mlist 0]    if {$msg == "RSET"} {	if {$Config(Tracing)} {	    TraceReset	}    } elseif {$msg == "TIME"} {	# set total time	set csecs [expr [lindex $mlist 1] / 100]	set mins [expr $csecs / 60]	set secs [expr $csecs % 60]	set Stat(TotalTimeStr) [format "/ %d:%02d" $mins $secs]	set Stat(MaxSecs) $csecs	set tics [expr $csecs / 8]	set tics [expr (($tics + 4) / 5) * 5]	.body.time.scale configure -tickinterval $tics -to $csecs	SetTime 0    } elseif {$msg == "MVOL"} {	# set master volume	SetVolume [lindex $mlist 1]    } elseif {$msg == "FILE"} {	# set playing file	set Stat(CurFile) [retrieve-filename [lindex $mlist 1]]	wm title . "TkMidity: $Stat(CurFile)"	wm iconname . "TkMidity: $Stat(CurFile)"	if {$Config(CurFileMode) == 0} {	    .body.curfile configure -text "$Stat(CurFile) / 00:00"	} else {	    .body.curfile configure -text "$Stat(CurFile) / -$Stat(TotalTimeStr)"	}	AppendMsg "------"    } elseif {$msg == "LIST"} {	# set file list	.body.file.list delete 0 end	set Stat(MaxFiles) [lindex $mlist 1]	set Stat(FileList) {}	for {set i 0} {$i < $Stat(MaxFiles)} {incr i} {	    set file [gets stdin]	    .body.file.list insert end $file	    lappend Stat(FileList) $file	}	set Stat(CurIdx) -1	SelectNumber    } elseif {$msg == "ALST"} {	# append file list	set i $Stat(MaxFiles)	set Stat(MaxFiles) [expr $i + [lindex $mlist 1]]	for {} {$i < $Stat(MaxFiles)} {incr i} {	    set file [gets stdin]	    .body.file.list insert end $file	    if {$Config(ShufflePlay)} {		lappend Stat(ShuffleList) [llength $Stat(FileList)]	    }	    lappend Stat(FileList) $file	}	.body.file.list select set $Stat(CurIdx)    } elseif {$msg == "ERRR"} {	# delete file list	.body.file.list delete $Stat(CurIdx)	set Stat(MaxFiles) [expr $Stat(MaxFiles) - 1]	set tmplist {}	for {set i 0} {$i < $Stat(CurIdx)} {incr i} {	    lappend tmplist [lindex $Stat(FileList) $i]	}	for {set i $Stat(CurIdx)} {$i < $Stat(MaxFiles)} {incr i} {	    lappend tmplist [lindex $Stat(FileList) [expr $i + 1]]	}	set Stat(FileList) {}	for {set i 0} {$i < $Stat(MaxFiles)} {incr i} {	    lappend Stat(FileList) [lindex $tmplist $i]	}	if {$Stat(CurIdx) >= $Stat(MaxFiles)} {	    if {$Config(RepeatPlay)} {		set Stat(CurIdx) 0	    } elseif {$Config(AutoExit)} {		QuitCmd	    } else {		StopCmd	    }	}	SelectNumber    } elseif {$msg == "PREV"} {	# previous file	set Stat(CurIdx) [expr $Stat(CurIdx) - 1]	if {$Stat(CurIdx) < 0} {set Stat(CurIdx) 0}	SelectNumber    } elseif {$msg == "NEXT"||$msg == "TEND"} {	# next file	incr Stat(CurIdx)	if {$Stat(CurIdx) >= $Stat(MaxFiles)} {	    if {$Config(RepeatPlay)} {		set Stat(CurIdx) 0	    } elseif {$Config(AutoExit)} {		QuitCmd	    } else {		StopCmd	    }	}	SelectNumber    } elseif {$msg == "CMSG"} {	# put message	set type [lindex $mlist 1]	set str [gets stdin]	AppendMsg $str    } elseif {$msg == "LYRC"} {	# put message	set type [lindex $mlist 1]	set str [gets stdin]	.body.text.buf insert end $str    } elseif {$msg == "CERR"} {	error [format "%s: %s" $Stat(NextFile) [gets stdin]]	WriteMsg "NEXT"    } elseif {$msg == "QUIT"} {	# quit	exit    } elseif {$msg == "RSTA"} {	# restart file	SelectNumber    }}#----------------# make shuffled list#proc MakeShuffleList {} {    global Stat    set Stat(ShuffleList) {}    for {set i 0} {$i < $Stat(MaxFiles)} {incr i} {	lappend Stat(ShuffleList) $i    }    set len [expr $Stat(MaxFiles) - 1]    while {$len > 0} {	set pos [my-random [expr $len + 1]]	set tmp [lindex $Stat(ShuffleList) $pos]	set Stat(ShuffleList) [lreplace $Stat(ShuffleList) $pos $pos \					[lindex $Stat(ShuffleList) $len]]	set Stat(ShuffleList) [lreplace $Stat(ShuffleList) $len $len $tmp]	set len [expr $len - 1]    }}## append a string to message buffer#proc AppendMsg {str} {    global Stat    incr Stat(CurMsgs)    if {$Stat(CurMsgs) >= $Stat(MaxMsgs)} { ClearMsg }    .body.text.buf insert end $str\n    .body.text.buf yview -pickplace end}## clear message buffer#proc ClearMsg {} {    global Stat    .body.text.buf delete 0.0 end    .body.text.buf yview 0    set Stat(CurMsgs) 0}#----------------# select the file in listbox and load it#proc SelectNumber {} {    global Stat Config    if {$Stat(new_tcltk)} {	.body.file.list select clear 0 end    } else {	.body.file.list select clear    }    set idx -1    if {$Stat(CurIdx) >= 0 && $Stat(CurIdx) < [llength $Stat(FileList)]} {	if {$Config(ShufflePlay)} {	    if {$Stat(ShuffleList) == {}} {		MakeShuffleList	    }	    set idx [lindex $Stat(ShuffleList) $Stat(CurIdx)]	} else {	    set idx $Stat(CurIdx)	}	set thefile [lindex $Stat(FileList) $idx]	set Stat(NextFile) $thefile    }    if {$idx >= 0} {	if {$Stat(new_tcltk)} {#	    .body.file.list select set $idx	} else {#	    .body.file.list select from $idx#	    .body.file.list select to $idx	}	.body.curfile configure -text\		"Playing: [lindex $Stat(FileList) $idx]"	LoadCmd $idx	set Stat(Playing) 1    } else {	SetTime 0	.body.curfile configure -text "-------- / 00:00"	set Stat(Playing) 0	set Stat(Paused) 0    }    DispButtonPlay}## update current time#proc SetTime {val} {    global Stat Config    if {$Stat(CurIdx) == -1} {	return    }    set Stat(LastSec) $val    if {$Config(CurFileMode) == 0} {	set curt [sec2time $val]	.body.curfile configure\		-text "$Stat(CurFile) / $curt"    } else {	set curt [sec2time [expr $val - $Stat(MaxSecs)]]	.body.curfile configure\		-text "$Stat(CurFile) / $curt"    }    set curt [sec2time $val]    .body.time.label configure\	    -text "$curt / $Stat(TotalTimeStr)"    .body.time.scale set $val    DispButtonPlay}## colorize buttons with each state#proc DispButtonPlay {} {    global Stat    if {$Stat(Playing)} {	if {$Stat(Blinking)} {	    set color green	    set Stat(Blinking) 0	} else {	    set color red	    set Stat(Blinking) 1	}	.body.button.play configure -fg $color -activeforeground $color    } else {	.body.button.play configure -fg black -activeforeground black    }    if {$Stat(Playing) && $Stat(Paused)} {	.body.button.pause configure -fg red -activeforeground red    } else {	.body.button.pause configure -fg black -activeforeground black    }}## update current volume#proc SetVolume {val} {    global Config    set Config(CurVol) $val    .body.volume.scale set $val}#----------------# write message# messages are: PREV, NEXT, QUIT, FWRD, BACK, RSET, STOP#	LOAD\n<filename>, JUMP <time>, VOLM <volume>#proc WriteMsg {str} {    puts stdout $str    flush stdout}#----------------# callback commands### jump to specified time#proc JumpCmd {val} {    global Stat    if {$val != $Stat(LastSec)} {	WriteMsg [format "JUMP %d" [expr $val * 100]]    }}## change volume amplitude#proc VolumeCmd {val {force 0}} {    global Config    if {$val < 0} {set val 0}    if {$val > 200} {set val 200}    if {$force != 0 || $val != $Config(CurVol)} {	WriteMsg [format "VOLM %d" $val]    }}## load the specified file#proc LoadCmd {idx} {    global Stat Config    WriteMsg "LOAD"    WriteMsg [lindex $Stat(FileList) $idx]    AppendMsg ""}## play the first file#proc PlayCmd {} {    global Stat    if {$Stat(Playing) == 0} {	WriteMsg "NEXT"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -