#!/bin/sh
#
# wizardの雛形は http://wiki.tcl.tk/8053 より。 
#
# the next line restarts using wish \
exec wish "$0" "$@"

package require -exact snack 2.2
package require Tktable

# version 1.2
# - (修正) 空白入りwavファイル名に対応した。

# version 1.1
# - (追加) ヘッダ一覧窓を追加した(wavヘッダ一覧表示ボタンで表示)。
# - (修正) ヘッダ情報の異なるwavファイル群を結合できないエラーを修正した。(一旦raw形式で書き出したものを読み込んで結合させるようにした)
# - (追加) 分解・結合時にプログレスバーを表示するようにした。
# - (変更) フォルダの初期値を変更した（tclファイルで実行した場合を考慮した。exeでは変更なし）

#
# wizard用のページを初期化
#
proc wizard {toplevel pages} {
  toplevel $toplevel
  set page_list {}

  for {set i 1} {$i <= $pages} {incr i} {
    ;# set finish {}
    set page $toplevel.p$i
    frame $page
    frame $page.page
    lappend page_list $page.page
    button $page.p -text "前へ <<" -command [list move $page.page -1]
    button $page.n -text ">> 次へ" -command [list move $page.page 1]
    button $page.e -text "終了"    -command finish
    if {$i == 1 || $i == 4 || $i == 7} {
      $page.p configure -state disabled
      $page.n configure -state disabled
    } elseif {$i == 3 || $i == 6} {
      $page.n configure -state disabled
    } elseif {$i == 5} {
      $page.p configure -command [list move $page.page -4]
    }
    grid $page.page -columnspan 4  -sticky nsew
    ;# grid $page.p $page.n {*}$finish
    grid $page.p $page.n $page.e
    grid columnconfigure $page 3 -weight 1
    grid rowconfigure $page 0 -weight 1
  }
  return $page_list
}

#---------------------------------------------------
#
# ページ移動
#
proc move {page {offset 0}} {
  global pageTitle

  set page [winfo parent $page]
  regexp {^(.*\.p)([0-9]+)$} $page -> root number
  if [moveConfirm $number $offset] return
  pack forget $page
  set newnumber [expr {$number + $offset}]
  set newpage "$root$newnumber"
  pack $newpage -fill both -expand 1
  set title [lindex $pageTitle [expr $newnumber - 1]]
  wm title [winfo toplevel $newpage] $title
}

#---------------------------------------------------
#
# 終了処理
#
proc finish {} {
  destroy .
  exit
}

#---------------------------------------------------
# 結合対象のディレクトリを指定する
#
proc chooseDir {initDir} {
  set d [tk_chooseDirectory -initialdir $initDir -title "結合フォルダの選択"]
  if {$d != ""} {
    return $d
  } else {
    return $initDir
  }
}

#---------------------------------------------------
# 保存wavファイルを指定する
#
proc chooseSaveWav {initDir initFile mode} {
  set openTypes [ list {{MS Wav Files} {.wav}} {{All Files} {*}} ]
  if {$mode == "w"} {
    set d [tk_getSaveFile \
      -initialdir $initDir -initialfile $initFile -filetypes $openTypes \
      -defaultextension "wav"]
  } else {
    set d [tk_getOpenFile \
      -initialdir $initDir -initialfile $initFile -filetypes $openTypes \
      -defaultextension "wav"]
  }

  if {$d != ""} {
    return $d
  } else {
    return $initFile
  }
}

#---------------------------------------------------
# 保存labファイルを指定する
#
proc chooseSaveLab {initDir initFile mode} {
  set openTypes [ list \
    {{復元用ラベルファイル} {.txt}} \
    {{ラベルファイル(わぶでば用)} {.lab}} \
    {{All Files} {*}} ]
  if {$mode == "w"} {
    set d [tk_getSaveFile \
      -initialdir $initDir -initialfile $initFile -filetypes $openTypes \
      -defaultextension "lab"]
  } else {
    set d [tk_getOpenFile \
      -initialdir $initDir -initialfile $initFile -filetypes $openTypes \
      -defaultextension "lab"]
  }

  if {$d != ""} {
    return $d
  } else {
    return $initFile
  }
}

#---------------------------------------------------
# ページ移動できるかのチェックなど。移動不可能なら1を返す
#
proc moveConfirm {page offset} {
  global procDir

  if {$page == 2 && $offset == 1} {
    set filenames [glob -nocomplain [format "%s/*.wav" $procDir]]
    if {$filenames == ""} {
      tk_messageBox -title "エラー" \
        -message "指定したフォルダにはwavファイルがありません。"
      return 1
    }
  }
  return 0
}

#---------------------------------------------------
# procDir/*.wavのヘッダ内容を閲覧する
#
proc viewHeaders {} {
  global procDir headerList

  if {[file exists $procDir] == 0} {
    tk_messageBox -title "エラー" -message "$procDir が見つかりません。"
    return
  }

  set filenames [glob -nocomplain [format "%s/*.wav" $procDir]]
  if {[llength $filenames] < 1} {
    tk_messageBox -title "エラー" \
      -message "指定したフォルダにはwavファイルがありません。"
    return
  }

  array unset headerList
  set headerList(0,0) "ファイル名"
  set headerList(0,1) "サンプリング周波数"
  set headerList(0,2) "エンコーディング"
  set headerList(0,3) "チャンネル数"
  set headerList(0,4) "サンプル数"
  set headerList(0,5) "最大値"
  set headerList(0,6) "最小値"
  set headerList(0,7) "ヘッダサイズ"
  array unset kindNum
  set kindNum($headerList(0,1)) 0
  set kindNum($headerList(0,2)) 0
  set kindNum($headerList(0,3)) 0
  set r 1
  foreach fn $filenames {
    snack::sound sndTmp0 -load $fn
    set tmpHeader [sndTmp0 info]

    set headerList($r,0) [file tail $fn]          ;# ファイル名
    set headerList($r,1) [lindex $tmpHeader 1]    ;# サンプリング周波数
    set headerList($r,2) [lindex $tmpHeader 4]    ;# エンコーディング
    set headerList($r,3) [lindex $tmpHeader 5]    ;# チャンネル数
    set headerList($r,4) [lindex $tmpHeader 0]    ;# サンプル数
    set headerList($r,5) [lindex $tmpHeader 2]    ;# 最大値
    set headerList($r,6) [lindex $tmpHeader 3]    ;# 最小値
    set headerList($r,7) [lindex $tmpHeader 7]    ;# ヘッダサイズ

    if {$headerList(1,1) != $headerList($r,1)} {
      incr kindNum($headerList(0,1))
    }
    if {$headerList(1,2) != $headerList($r,2)} {
      incr kindNum($headerList(0,2))
    }
    if {$headerList(1,3) != $headerList($r,3)} {
      incr kindNum($headerList(0,3))
    }

    incr r
  }
  set rSize $r
  set cSize 8

  # 表を作る
  set w .headerWindow
  toplevel $w
  set table [table $w.t -variable headerList -rows $rSize -cols $cSize \
    -colwidth 19 \
    -multiline 0 -selectmode extended \
    -titlerows 1 -titlecols 1 -selecttitle 0 \
    -colstretchmode none -rowstretchmode none \
    -padx 1 -pady 1 \
    -xscrollcommand "$w.x set" -yscrollcommand "$w.y set" ]
  scrollbar $w.x -command "$table xview" -orient horizontal
  scrollbar $w.y -command "$table yview" -orient vertical
  grid $table $w.y -sticky news
  grid $w.x -sticky news
  grid rowconfigure $w 0 -weight 1
  grid columnconfigure $w 0 -weight 1
  $table tag configure active -bg #A0A0A0  ;# アクティブなセルの背景色
  $table tag configure none   -bg #C0C050  ;# 頻度０のセルの背景色

  bind Table <MouseWheel> {
    if {%D > 0} {
      ::tk::table::MoveCell $table  -1 0  ;# 上へ
    } else {
      ::tk::table::MoveCell $table   1 0  ;# 下へ
    }
    $table selection anchor active
  }

  $table tag delete diff   ;# diffタグを消去
  for {set r 2} {$r < $rSize} {incr r} {
    for {set c 1} {$c <= 3} {incr c} {
      if {$headerList(1,$c) != $headerList($r,$c)} {
        $table tag celltag diff $r,$c   ;# diffタグを付ける
      }
    }
  }
  $table tag configure diff -bg #C0C050  ;# ヘッダの違うセルの色を変える

  ;# ヘッダが統一されてなければ通知する
  set msg ""
  if {$kindNum($headerList(0,1)) > 0} {
    set msg "$headerList(0,1)、"
  }
  if {$kindNum($headerList(0,2)) > 0} {
    set msg "$msg $headerList(0,2)、"
  }
  if {$kindNum($headerList(0,3)) > 0} {
    set msg "$msg $headerList(0,3)、"
  }
  if {$msg != ""} {
    set msg "$msg が統一されていません。"
    tk_messageBox -title "" -message "$msg"
  }
}


#---------------------------------------------------
# procDir/*.wavを結合して$saveWavFilename に保存する
#
proc wavJoin {} {
  global procDir saveWavFilename saveLabFilename

  if {[file extension $saveLabFilename] == ".lab"} {
    set labType waves
  } else {
    set labType wavTar
  }

  if {[file exists $procDir] == 0} {
    tk_messageBox -title "エラー" -message "$procDir が見つかりません。"
    return
  }

  set filenames [glob -nocomplain [format "%s/*.wav" $procDir]]
  if {[llength $filenames] < 1} {
    tk_messageBox -title "エラー" \
      -message "指定したフォルダにはwavファイルがありません。"
    return
  }
  set fp [open $saveLabFilename w]

  if {$labType == "waves"} {
    puts $fp "#"
  }

  initProgressWindow

  # １つめのwavファイルを取り込んでヘッダ情報を得る
  set fn [lindex $filenames 0]
  set filenames [lreplace $filenames 0 0]
  snack::sound sndTmp0 -load $fn
  set outHeader [sndTmp0 info]

  # rawファイルで書き出して再び読み込む
  set workfile $saveWavFilename.raw
  sndTmp0 write $workfile -fileformat RAW -byteorder littleEndian
  snack::sound snd -load $workfile \
    -rate     [lindex $outHeader 1] \
    -encoding [lindex $outHeader 4] \
    -channels [lindex $outHeader 5] \
    -fileformat RAW \
    -byteorder littleEndian

  set ln [file rootname [file tail $fn]]
  if {$labType == "waves"} {
    set p [snd length -unit SECONDS]
    puts $fp "    $p 121 \"E_$ln\""
  } else {
    set p [snd length]
    puts $fp "$p \"$ln\""
  }
  set cnt 1
  updateProgressWindow [expr 100 * $cnt / [llength $filenames]]

  foreach fn $filenames {
    # wavファイルをrawファイルに書き出して再び読み込む
    snack::sound sndTmp2 -load $fn
    sndTmp2 write $workfile -fileformat RAW -byteorder littleEndian
    snack::sound sndTmp3 -load $workfile \
      -rate     [lindex $outHeader 1] \
      -encoding [lindex $outHeader 4] \
      -channels [lindex $outHeader 5] \
      -fileformat RAW \
      -byteorder littleEndian
    # 結合
    snd concatenate sndTmp3
    set ln [file rootname [file tail $fn]]
    if {$labType == "waves"} {
      set p [snd length -unit SECONDS]
      puts $fp "    $p 121 \"E_$ln\""
    } else {
      set p [snd length]
      puts $fp "$p \"$ln\""
    }
    incr cnt
    updateProgressWindow [expr 100 * $cnt / [llength $filenames]]
  }

  # 結合wavファイルを保存
  snd write $saveWavFilename -fileformat WAV
  file delete $workfile

  close $fp
  deleteProgressWindow

  tk_messageBox -title "結合終了" \
    -message "$cnt 個のwavファイルを結合しました。"

  # 次の画面へ移動
  move .wzrd.p3.page 1
}

#---------------------------------------------------
# $saveWavFilename を分解して saveDir に保存する
#
proc wavSplit {} {
  global saveDir saveWavFilename saveLabFilename

  if {[file exists $saveWavFilename] == 0} {
    tk_messageBox -title "エラー" -message "$saveWavFilename が見つかりません。"
    return
  }

  if {[file exists $saveLabFilename] == 0} {
    tk_messageBox -title "エラー" -message "$saveLabFilename が見つかりません。"
    return
  }

  if {[file exists $saveDir] == 0} {
      file mkdir $saveDir
  }

  snack::sound snd -load $saveWavFilename
  set sampleRate [snd cget -rate]

  if {[file extension $saveLabFilename] == ".lab"} {
    set labType waves
  } else {
    set labType wavTar
  }

  # 分割数numを得る
  set fp [open $saveLabFilename r]
  if {$labType == "waves"} {
    while {! [eof $fp]} {
      if {[gets $fp] == "#"} break
    }
  }
  set num 0
  while {! [eof $fp]} {
    gets $fp
    incr num
  }
  close $fp

  # 改めてファイルを開いて結合していく
  set fp [open $saveLabFilename r]

  if {$labType == "waves"} {
    while {! [eof $fp]} {
      if {[gets $fp] == "#"} break
    }
  }

  initProgressWindow

  set cnt 0
  set start 0
  while {! [eof $fp]} {
    ;# 一行読んで位置とラベル名を取得
    set line [gets $fp]
    set end ""
    set ln ""
    regsub {^[[:space:]]+} $line "" line        ;# 最初の空白を切り詰め
    regsub {[[:space:]]+$} $line "" line        ;# 最後の空白を切り詰め
    if {$labType == "waves"} {
      if {[regexp {\"} $line]} {
        ;# ver.1.2以降のコード(空白入りファイル名に対応したコード)
        regsub {E_} $line "" line                   ;# ラベル冒頭の E_ を削除
        set end [lindex [split $line " "] 0]
        regexp {\"(.+)\"} $line tmp ln
      } else {
        ;# ver.1.1以前のコード(ファイル名に空白が無いことを前提にしたバージョンのコード)
        regsub -all {[[:space:]]+} $line " " line   ;# 複数連続の空白を切り詰め
        regsub {E_} $line "" line                   ;# ラベル冒頭の E_ を削除
        set tmpList [split $line " "]
        set end [lindex $tmpList 0]
        set ln  [lindex $tmpList 2]
      }
    } else {
      if {[regexp {\"} $line]} {
        ;# ver.1.2以降のコード(空白入りファイル名に対応したコード)
        set end [lindex [split $line " "] 0]
        regexp {\"(.+)\"} $line tmp ln
      } else {
        ;# ver.1.1以前のコード(ファイル名に空白が無いことを前提にしたバージョンのコード)
        regsub -all {[[:space:]]+} $line " " line   ;# 複数連続の空白を切り詰め
        set tmpList [split $line " "]
        set end [lindex $tmpList 0]
        set ln  [lindex $tmpList 1]
      }
    }

    if {$end == "" || $ln == ""} continue

    if {$labType == "waves"} {
      set end [expr int($end * $sampleRate)]      ;# 単位変換:秒→サンプル
    }

    snd write "$saveDir/$ln.wav" -start $start -end $end

    set start $end
    incr cnt
    updateProgressWindow [expr 100 * $cnt / $num]
  }

  close $fp
  deleteProgressWindow

  tk_messageBox -title "分解終了" \
    -message "$cnt 個のwavファイルに分解しました。"

  # 次の画面へ移動
  move .wzrd.p6.page 1
}

#---------------------------------------------------
#   指定した窓が起動済みかチェック。起動済みならフォーカスする。
#
proc isExist {w} {
  if [winfo exists $w] {
    raise $w
    focus $w
    return 1
  } else {
    return 0
  }
}

#---------------------------------------------------
# プログレスバーを初期化して表示する
#
proc initProgressWindow {{title "now processing..."}} {
  global prgWindow v
  if [isExist $prgWindow] return

  toplevel $prgWindow
  wm title $prgWindow $title
  wm attributes $prgWindow -toolwindow 1
  wm attributes $prgWindow -topmost 1
  bind $prgWindow <Escape> "destroy $prgWindow"
  set topg [split [wm geometry .] "x+"]
  set x [expr [lindex $topg 2] + [lindex $topg 0] / 2 - 100]
  set y [expr [lindex $topg 3] + [lindex $topg 1] / 2 - 5]
  wm geometry $prgWindow "+$x+$y"

  set v(progress) 0

  ttk::progressbar $prgWindow.p -length 200 -variable v(progress) -mode determinate
  pack $prgWindow.p

  raise $prgWindow
  focus $prgWindow
}

#---------------------------------------------------
# プログレスバーを更新する。進捗状況は$progress(0〜100)で指定する)
#
proc updateProgressWindow {progress} {
  global v prgWindow

  set v(progress) $progress
  raise $prgWindow
  focus $prgWindow
  update
}

#---------------------------------------------------
# プログレスバーを消去する
#
proc deleteProgressWindow {} {
  global prgWindow
  destroy $prgWindow
}


#---------------------------
# 大域変数
set pages [wizard .wzrd 7]               ;# ページ数指定、初期化
set FONT {{ＭＳ Ｐゴシック} 12 normal}
set v(appname) wavTar
set v(version) 1.2
set v(progress) 0
set prgWindow .prgWindow

# v(exe)=1..exe化したものを実行している。 0..activeTclでtclファイルを実行している
if [regexp $v(appname) [info nameofexecutable]] {
  set v(exe) 1
} else {
  set v(exe) 0
}

# DLしたファイルを保存するディレクトリなど
if $v(exe) {
  set v(progDir) "[file dirname [info nameofexecutable]]"
} else {
  set v(progDir) "[pwd]"
}

# set procDir [file dirname [info script]]    ;# 結合するフォルダ
set procDir $v(progDir)    ;# 結合するフォルダ
set saveWavFilename "$v(progDir)/result.wav"
set saveLabFilename "$v(progDir)/result.txt"
set saveDir "$v(progDir)/result"  ;# 分解結果を出力するフォルダ
set pageTitle {
  "wavTar - 開始画面" 
  "wavTar - 結合：データ入力"
  "wavTar - 結合：確認"
  "wavTar - 結合：完了"
  "wavTar - 分解：データ入力"
  "wavTar - 分解：確認"
  "wavTar - 分解：完了"
}

array unset headerList

#---------------------------
# 開始画面
set p 1
set frm($p) [frame .wzrd.p$p.page.f]
label $frm($p).l -text "$v(appname) - wav ファイル結合/分解ツール ver. $v(version)" -font $FONT
text $frm($p).t -font $FONT -width 40 -height 5
$frm($p).t insert end {
処理内容を選んで下さい。
}
pack $frm($p) -fill both -expand 1 -padx 10 -pady 10 -side top
frame $frm($p).f
pack [button $frm($p).f.join -text "wavファイル群を1つのwavファイルに結合" \
  -command { \
    set mode "join" ; \
    move .wzrd.p1.page 1 \
  } ] -expand 1 -pady 5
pack [button $frm($p).f.split -text "結合wavファイルをwavファイル群に分解" \
  -command { \
    set mode "split" ; \
    move .wzrd.p1.page 4 \
  } ] -expand 1 -pady 5
pack $frm($p).f -fill both -expand 1 -side bottom
pack $frm($p).l $frm($p).t


#---------------------------
# 画面２ - wav結合に必要なデータの入力
incr p
set frm($p) [frame .wzrd.p$p.page.f]
label $frm($p).l -text "wavファイル結合： 設定" -font $FONT
text $frm($p).t -font $FONT -width 40 -height 5
$frm($p).t insert end {
入力wavファイル群のあるフォルダ、結合結果wavファイル、復元用ラベルファイルを指定して下さい。}
pack $frm($p) -fill both -expand 1 -padx 10 -pady 10 -side top
frame $frm($p).f

grid [label $frm($p).f.l00 -text "結合対象のフォルダ："] \
  -row 0 -column 0 -sticky e -ipady 2 -ipadx 2
grid [entry $frm($p).f.l01 -textvar procDir -relief solid -width 80] \
  -row 0 -column 1 -sticky w -ipady 2 -ipadx 2
grid [button $frm($p).f.b -text 選択 -command \
  {set procDir [chooseDir $procDir]} ] \
  -row 0 -column 2 -sticky w -pady 2 -padx 2
grid [button $frm($p).f.b2 -text wavヘッダ一覧表示 -command \
  {viewHeaders} ] \
  -row 0 -column 3 -sticky w -pady 2 -padx 2

grid [label $frm($p).f.l10 -text "結合結果wavファイル："] \
  -row 1 -column 0 -sticky e -ipady 2 -ipadx 2
grid [entry $frm($p).f.l11 -textvar saveWavFilename -relief solid -width 80] \
  -row 1 -column 1 -sticky w -ipady 2 -ipadx 2
grid [button $frm($p).f.b12 -text 選択 -command {\
  set saveWavFilename [chooseSaveWav $procDir $saveWavFilename w]}] \
  -row 1 -column 2 -sticky w -pady 2 -padx 2

grid [label $frm($p).f.l20 -text "復元用ラベルファイル："] \
  -row 2 -column 0 -sticky e -ipady 2 -ipadx 2
grid [entry $frm($p).f.l21 -textvar saveLabFilename -relief solid -width 80] \
  -row 2 -column 1 -sticky w -ipady 2 -ipadx 2
grid [button $frm($p).f.b22 -text 選択 -command {\
  set saveLabFilename [chooseSaveLab $procDir $saveLabFilename w]}] \
  -row 2 -column 2 -sticky w -pady 2 -padx 2

#pack [entry $frm($p).f.l  -textvar procDir -relief solid] -side left -fill both -expand 1
#pack [button $frm($p).f.b -text 選択 -command {set procDir [chooseDir $procDir]}] -side left
pack $frm($p).l -fill both -expand 1
pack $frm($p).f -fill both -expand 1 -side bottom
pack $frm($p).t -fill both -expand 1 -padx 2 -pady 2


#---------------------------
# 画面３ - 結合前の確認
incr p
set frm($p) [frame .wzrd.p$p.page.f]
label $frm($p).l -text "wavファイル結合： 確認" -font $FONT
text $frm($p).t -font $FONT -width 40 -height 5
$frm($p).t insert end {
以下内容で間違いなければ「wav結合」を押して下さい。}
pack $frm($p) -fill both -expand 1 -padx 10 -pady 10 -side top

pack [frame $frm($p).f -relief solid] -fill both -expand 1 -side bottom
pack [button $frm($p).f.b -text "wav結合" -command wavJoin] -side left -fill both -expand 1
pack $frm($p).l $frm($p).t -fill both -expand 1 -side top

pack [frame $frm($p).c] -fill both -expand 1 -side bottom -anchor w
grid [label $frm($p).c.l00 -text "結合対象のフォルダ："] \
  -row 0 -column 0 -sticky e -ipadx 2 -ipady 2
grid [label $frm($p).c.l01 -textvar procDir -fg red] \
  -row 0 -column 1 -sticky w -ipadx 2 -ipady 2
grid [label $frm($p).c.l10 -text "結合結果wavファイル："] \
  -row 1 -column 0 -sticky e -ipadx 2 -ipady 2
grid [label $frm($p).c.l11 -textvar saveWavFilename -fg red] \
  -row 1 -column 1 -sticky w -ipadx 2 -ipady 2
grid [label $frm($p).c.l20 -text "復元用ラベルファイル："] \
  -row 2 -column 0 -sticky e -ipadx 2 -ipady 2
grid [label $frm($p).c.l21 -textvar saveLabFilename -fg red] \
  -row 2 -column 1 -sticky w -ipadx 2 -ipady 2


#---------------------------
# 画面４ - 終了
incr p
set frm($p) [frame .wzrd.p$p.page.f]
label $frm($p).l -text "wavファイル結合： 終了" -font $FONT
text $frm($p).t -font $FONT -width 40 -height 5
$frm($p).t insert end {
結合終了しました。}
pack $frm($p) -fill both -expand 1 -padx 10 -pady 10 -side top
frame $frm($p).f
pack [label $frm($p).f.l  -relief solid] -side left -fill both -expand 1
pack $frm($p).f -fill both -expand 1 -side bottom
pack $frm($p).l $frm($p).t

#---------------------------
# 画面５ - wav分解に必要なデータの入力
incr p
set frm($p) [frame .wzrd.p$p.page.f]
label $frm($p).l -text "wavファイル分解： 設定" -font $FONT
text $frm($p).t -font $FONT -width 40 -height 5
$frm($p).t insert end {
分解したい結合wavファイル、復元用ラベルファイル、出力フォルダを指定して下さい。}
pack $frm($p) -fill both -expand 1 -padx 10 -pady 10 -side top
frame $frm($p).f

grid [label $frm($p).f.l10 -text "結合済wavファイル："] \
  -row 0 -column 0 -sticky e -ipady 2 -ipadx 2
grid [entry $frm($p).f.l11 -textvar saveWavFilename -relief solid -width 80] \
  -row 0 -column 1 -sticky w -ipady 2 -ipadx 2
grid [button $frm($p).f.b12 -text 選択 -command {\
  set saveWavFilename [chooseSaveWav $saveDir $saveWavFilename r]}] \
  -row 0 -column 2 -sticky w -pady 2 -padx 2

grid [label $frm($p).f.l20 -text "復元用ラベルファイル："] \
  -row 1 -column 0 -sticky e -ipady 2 -ipadx 2
grid [entry $frm($p).f.l21 -textvar saveLabFilename -relief solid -width 80] \
  -row 1 -column 1 -sticky w -ipady 2 -ipadx 2
grid [button $frm($p).f.b22 -text 選択 -command {\
  set saveLabFilename [chooseSaveLab $saveDir $saveLabFilename r]}] \
  -row 1 -column 2 -sticky w -pady 2 -padx 2

grid [label $frm($p).f.l00 -text "出力フォルダ："] \
  -row 2 -column 0 -sticky e -ipady 2 -ipadx 2
grid [entry $frm($p).f.l01 -textvar saveDir -relief solid -width 80] \
  -row 2 -column 1 -sticky w -ipady 2 -ipadx 2
grid [button $frm($p).f.b -text 選択 -command \
  {set saveDir [chooseDir $saveDir]} ] \
  -row 2 -column 2 -sticky w -pady 2 -padx 2

pack $frm($p).l -fill both -expand 1
pack $frm($p).f -fill both -expand 1 -side bottom
pack $frm($p).t -fill both -expand 1 -padx 2 -pady 2


#---------------------------
# 画面６ - 分解前の確認
incr p
set frm($p) [frame .wzrd.p$p.page.f]
label $frm($p).l -text "wavファイル分解： 確認" -font $FONT
text $frm($p).t -font $FONT -width 40 -height 5
$frm($p).t insert end {
以下内容で間違いなければ「wav分解」を押して下さい。}
pack $frm($p) -fill both -expand 1 -padx 10 -pady 10 -side top

pack [frame $frm($p).f -relief solid] -fill both -expand 1 -side bottom
pack [button $frm($p).f.b -text "wav分解" -command wavSplit] -side left -fill both -expand 1
pack $frm($p).l $frm($p).t -fill both -expand 1 -side top

pack [frame $frm($p).c] -fill both -expand 1 -side bottom -anchor w
grid [label $frm($p).c.l10 -text "結合済wavファイル："] \
  -row 0 -column 0 -sticky e -ipadx 2 -ipady 2
grid [label $frm($p).c.l11 -textvar saveWavFilename -fg red] \
  -row 0 -column 1 -sticky w -ipadx 2 -ipady 2
grid [label $frm($p).c.l20 -text "復元用ラベルファイル："] \
  -row 1 -column 0 -sticky e -ipadx 2 -ipady 2
grid [label $frm($p).c.l21 -textvar saveLabFilename -fg red] \
  -row 1 -column 1 -sticky w -ipadx 2 -ipady 2
grid [label $frm($p).c.l00 -text "出力フォルダ："] \
  -row 2 -column 0 -sticky e -ipadx 2 -ipady 2
grid [label $frm($p).c.l01 -textvar saveDir -fg red] \
  -row 2 -column 1 -sticky w -ipadx 2 -ipady 2


#---------------------------
# 画面７ - 終了
incr p
set frm($p) [frame .wzrd.p$p.page.f]
label $frm($p).l -text "wavファイル分解： 終了" -font $FONT
text $frm($p).t -font $FONT -width 40 -height 5
$frm($p).t insert end {
分解終了しました。}
pack $frm($p) -fill both -expand 1 -padx 10 -pady 10 -side top
frame $frm($p).f
pack [label $frm($p).f.l  -relief solid] -side left -fill both -expand 1
pack $frm($p).f -fill both -expand 1 -side bottom
pack $frm($p).l $frm($p).t


# show the first page
move [lindex $pages 0]
wm title . wavTar
wm geometry . 300x200
wm withdraw .
wm protocol .wzrd WM_DELETE_WINDOW finish
wm protocol . WM_DELETE_WINDOW finish

bind .wzrd <F1> {console show}

