#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"

#---------------------------------------------------
# 変数設定
#
set debug 0
set sv(appname) ""
set sv(version) ""
if {[info exists ::starkit::topdir]} {
  set topdir [file dirname [info nameofexecutable]]
} elseif {[regexp {wish([0-9]+|)(.exe|.EXE|)$} $argv0]} {
  set topdir "."
} else {
  set topdir [file dirname $argv0]
}
set ::ENV(VAMP_HOST) $topdir/tools
if {[array names v inWav] == ""} {
  set tempDir [regsub -all -- {[\\]} $::env(TEMP) "/"]
  set v(inWav)   "$tempDir/utau1/temp.wav"
}
if {[array names v utauExe] == ""} {
  if {[file executable "c:/Program Files/UTAU/utau.exe"]} {
    set v(utauExe) "c:/Program Files/UTAU/utau.exe"
  } elseif {[file executable "c:/Program Files (x86)/UTAU/utau.exe"]} {
    set v(utauExe) "c:/Program Files (x86)/UTAU/utau.exe"
  } else {
    set v(utauExe) [regsub -all -- {[\\]} "$::env(ProgramFiles)/UTAU/utau.exe" "/"]
  }
}
set v(reload) 2                 ;# 監視の間隔(秒)
set v(reloadSetting) $v(reload) ;# v(reload)の設定窓用
set v(inWavMtimeSec) 0          ;# 監視対象ファイルの更新日付
set v(inWavMtime) 0             ;# 監視対象ファイルの更新日付
set v(voice) ""                 ;# ボイスライブラリ名
set v(autoSaveInitFile) 1       ;# 1=$topdir/utawaview-init.tclを自動保存する、0=保存しない
set v(alwaysOnTop) 0            ;# 1=常に最前面表示する
set v(extEditor) "please_specify_an_external_editor.exe" ;# 外部の波形エディタexe

;# キャンバス関係
set v(yaxisw) 40                ;# 縦軸表示の横幅
set v(timeh)  20                ;# 横軸表示の縦幅
set v(showWave) 1               ;# 1=波形表示, 0=非表示
set v(waveh)  100               ;# 波形パネルの縦幅
set v(wavehbackup) 100          ;# 波形表示の縦サイズのバックアップをとる
set v(wavehmin)  50             ;# 縮小した際の最小縦幅
set v(wavepps)  200             ;# pixel/sec。
set v(waveScale) 32768          ;# 波形表示縦軸の最大値。0でautoscale
set v(showWhole)  1             ;# 1=常にwav全体を表示させる、0=縮尺固定
set v(zoomRate) 100             ;# ユーザ指定の波形拡大率(単位は%)。
set v(sfont) {Helvetica 8 bold} ;# 目盛り表示のフォント
set v(bg) [. cget -bg]
set v(fg) black
set v(wavColor) black
set v(playStatus) 0      ;# 1=今再生中, 0=今再生してない
set v(playOnsaStatus) 0  ;# 1=現在音叉再生中, 0=現在再生してない
set v(recLab) "temp"         ;# 現在収録中の音名
set v(bigFontSize) 24    ;# フォントサイズ
set v(fontSize) 18       ;# フォントサイズ
set v(smallFontSize) 14  ;# フォントサイズ
set v(sndLength) 0       ;# 現在表示している波形長(秒)
set v(fileHistory) {}    ;# ファイル使用履歴
set v(pDirHistory) {}    ;# 親フォルダ使用履歴
set v(fileHistoryMax) 30  ;# フォルダ使用履歴数の上限

set v(showSpec) 0        ;# 1=スペクトル表示, 0=非表示
set v(spech)    0        ;# スペクトル表示の縦サイズ
set v(spechbackup) 100   ;# スペクトル表示の縦サイズのバックアップをとる
set v(spechmin) 50       ;# スペクトル表示の縦サイズ(縮小時の最小縦幅)
set v(topfr)    8000     ;# スペクトル表示の最高周波数
set v(cmap)     grey     ;# スペクトル配色
set v(contrast) 0        ;# スペクトルのコントラスト
set v(brightness) 0      ;# スペクトルの明るさ
set v(fftlen) 512        ;# FFT長
set v(winlen) 128        ;# 窓長
set v(window) Hamming    ;# スペクトル抽出窓
set v(preemph) 0.97      ;# スペクトル抽出のプリエンファシス

set v(showPow) 0        ;# 1=パワー表示, 0=非表示
set v(powh)    0        ;# パワー表示の縦サイズ
set v(powhmin) 50       ;# パワー表示の縦サイズ(縮小時の最小縦幅)
set v(powhbackup) 100   ;# パワー表示の縦サイズのバックアップをとる
set power(frameLength) 0.02  ;# パワー抽出刻み[sec]
set power(window)  Hanning    ;# パワー抽出時の窓
set power(preemphasis)  0.97  ;# パワー抽出時のプリエンファシス
set power(windowLength)  0.01 ;# パワー抽出窓長[sec]
set power(power) {}           ;# 抽出したパワー値系列を保存する
set power(powerMax) 0         ;# 抽出結果の最大値
set power(powerMin) 0         ;# 抽出結果の最小値
set v(powcolor) #3f9010       ;# パワー曲線の色

set power(uttLow)  28    ;# 無音とみなされる振幅の閾値[dB]
set power(uttHigh) 28    ;# 発話とみなされる振幅の閾値[dB]
set power(uttKeep) 5     ;# 発話中の音量のゆらぎとみなされる幅の閾値[dB]
set power(vLow)    40    ;# 母音とみなされる振幅の閾値[dB]
set power(uttLengthSec) 0.05  ;# 発話中とみなされる時間長[sec]
set power(uttLength) [sec2samp $power(uttLengthSec) $power(frameLength)]  ;# 発話中とみなされる時間長[sample]
set power(silLengthSec) 0.0  ;# ポーズとみなされる時間長[sec]
set power(silLength) [sec2samp $power(silLengthSec) $power(frameLength)]  ;# ポーズとみなされる時間長[sample]
set power(fid) ""                           ;# パワー抽出したファイルのFID

set sv(toneList) {C C# D D# E F F# G G# A A# B} ;# ガイド音名リスト1oct分
set sv(sinScaleMin) 1     ;# ガイドsin音の最低オクターブ
set sv(sinScaleMax) 7     ;# ガイドsin音の最高オクターブ
set sv(sinScale) {}       ;# ガイドsin音の周波数リスト
set sv(sinNote) {}   ;# ガイドsin音の周波数に対応する音名
set f0(guideVol) 4000    ;# ガイドsin音の振幅初期値
set f0(showToneLine) 1                   ;# 1=各音の横線をF0パネルに表示
set  v(toneLineColor) #fffff0            ;# 各音の横線の色
set f0(showTgtLine) 0                    ;# 1=ターゲット音をF0パネルに表示
set f0(fid) ""                           ;# F0抽出したファイルのFID
set f0(threadID) ""                      ;# スレッドID
set f0(extractedMin) 0                   ;# 抽出したF0の最小値
set f0(extractedMax) 0                   ;# 抽出したF0の最大値

set v(showF0) 0           ;# 1=F0表示, 0=非表示
set v(f0h)    0           ;# F0表示の縦サイズ
set v(f0hmin) 50          ;# F0表示の縦サイズ(縮小時の最小縦幅)
set v(f0hbackup) 100      ;# F0表示の縦サイズのバックアップをとる
set f0(method) {DIO+StoneMask}     ;# F0抽出アルゴリズム
set f0(frameLength) 0.01  ;# F0抽出間隔[sec]
set f0(windowLength) 0.01 ;# F0抽出の窓長[sec]
set f0(max) 800           ;# 想定される最高F0
set f0(min) 60            ;# 想定される最低F0
set f0(showMax) 400       ;# F0表示の範囲[Hz]
set f0(showMin) 60        ;# F0表示の範囲[Hz]
set f0(showMinTone)   [lindex $sv(toneList) 0]   ;# F0表示の範囲
set f0(showMinOctave) $sv(sinScaleMin)           ;# F0表示の範囲
set f0(showMaxTone)   [lindex $sv(toneList) end] ;# F0表示の範囲
set f0(showMaxOctave) $sv(sinScaleMax)           ;# F0表示の範囲
set f0(guideTone)   C  ;# 音叉音
set f0(guideOctave) 3  ;# 音叉音
set f0(f0) {}             ;# 抽出したF0系列
set f0(mtimeSecThread) 0  ;# スレッドを使ってF0抽出したwavの更新日時
set f0(working) 0         ;# 1=スレッドを使ってF0抽出中
set v(f0color) #000090    ;# F0曲線の色
set v(tgtf0color) red     ;# ターゲットF0の色
set f0(fixShowRange) 1    ;# 1=F0表示スケールを固定にする
set f0(unit) semitone     ;# F0表示スケール。semitone, Hz

set v(winWidth) 640
set v(winWidthMin) [expr $v(yaxisw) + 100]
set v(winWidthMax) [lindex [wm maxsize .] 0]
set v(winHeight) 0

set v(cWidth)  [expr $v(winWidth) - $v(yaxisw)] ;# 波形画面キャンバスの横幅
set v(cWidthMin) $v(winWidthMin)   ;# 波形画面キャンバスの横幅最小値
set v(cHeight) [expr $v(waveh) + $v(spech) + $v(powh) + $v(f0h) + $v(timeh)]
                                           ;# 波形画面キャンバスの縦幅
set conState 0  ;# console がshowなら1、hideなら0であることをあらわす

set v(sampleRate) 44100  ;# 音声のサンプリング周波数[Hz]
set v(timeUnit) "Bar"          ;# 時間軸の表示方法。Sec. or Bar
set v(bpm) 120                  ;# 拍単位の時間軸(単位=BPM)
set v(bpmTmp) $v(bpm)           ;# 拍単位の時間軸、入力用(単位=BPM)
set v(bpmOffset) 0              ;# 拍単位の時間軸の左側オフセット値(単位=sec)
set v(bpmOffsetTmp) $v(bpmOffset) ;# 拍単位の時間軸の左側オフセット値、入力用(単位=sec)
set v(pmStartDelay) 0 ;# 再生バーの表示開始を遅れさせる秒数。発声タイミング試聴で使う
set v(pmPlayStart)  0 ;# 再生バーの再生開始位置
set v(gridNote) 4     ;# 選択範囲のグリッド単位(0=グリッドしない、4=4分音符、…
set v(alpha) 1        ;# 1=完全不透明, 0=完全透明

set v(wavOffsetPixel) 0 ;# 冒頭音符の先行発声部を表示するための領域長
set v(wavOffsetSec)   0 ;# 冒頭音符の先行発声部を表示するための領域長
set v(wavPre) 0         ;# 冒頭の音符の先行発声値
set v(barPre) 0         ;# 冒頭の音符の前に付ける小節数

# スペクトル配色
set sv(grey) " "
set sv(color1) {#000 #004 #006 #00A #00F \
               #02F #04F #06F #08F #0AF #0CF #0FF #0FE \
               #0FC #0FA #0F8 #0F6 #0F4 #0F2 #0F0 #2F0 \
               #4F0 #6F0 #8F0 #AF0 #CF0 #FE0 #FC0 #FA0 \
               #F80 #F60 #F40 #F20 #F00}
set sv(color2) {#FFF #BBF #77F #33F #00F #07F #0BF #0FF #0FB #0F7 \
               #0F0 #3F0 #7F0 #BF0 #FF0 #FB0 #F70 #F30 #F00}

;# setParam-init.tclに保存する配列のリスト
set startup(arrayForInitFile) {v f0 power startup dev}
;# setParam-init.tclに保存しないキーのリスト
set startup(exclusionKeysForInitFile,aName) { startup v power f0 }
set startup(exclusionKeysForInitFile,startup) { \
  arrayForInitFile choosesaveDir \
  initFile procTextFile textFile sysIniFile \
  exclusionKeysForInitFile,aName \
  exclusionKeysForInitFile,startup \
  exclusionKeysForInitFile,v \
  exclusionKeysForInitFile,power \
  exclusionKeysForInitFile,f0 \
}
set startup(exclusionKeysForInitFile,v) { \
  ext voice reload utauExe autoSaveInitFile inWav \
  sndLength \
  recLab fileHistory pDirHistory \
  playStatus \
  inWavMtimeSec inWavMtime \
}
set startup(exclusionKeysForInitFile,power) { power fid }
set startup(exclusionKeysForInitFile,f0) { f0 extractedMin extractedMax fid mtimeSecThread working }

# パラメータのバックアップ用配列
array unset paramS_bk
array unset paramU_bk
set paramS_bk(N) -1
set paramU_bk(N) -1
set paramS_bk(i) -1
set paramU_bk(i) -1

# キャンバス上の各パラメータのIDを入れる配列
array unset cParamID

# 範囲選択
array unset region
set region(seq) 0
set region(status) ""   ;# 選択範囲の操作が今どんな状態かを保持する

snack::debug $debug
snack::sound snd -channels Mono -rate $v(sampleRate) -debug $debug
snack::sound onsa -channels Mono -rate $v(sampleRate)

image create photo viewmag+22 -data {
   R0lGODlhFgAWAIUAAPwCBBQSFJyanKy2tLzCxHyChNTa3Nzq7Nz29Nzy9Mzy
   9MTu9OTy9Nzi5Oz6/OT29MTi5Kzi7NTy9KTm7JzW3ITO1Lzq7IzW5HzK1LS+
   vMTq7Jze7ITW3GTCzGS+zLTS1MzOzLzq9Kzm7Jze5ITW5HTS3FS2vLze5EzC
   zEyyvEyutJTa5NTu9ITa5FTK1ESirLTm7Mzi5FS6xEy2vESerESmtFSutESm
   rKyqrAz+/Dw+RAzi3ASutHRydAQCBAAAACH5BAEAAAAALAAAAAAWABYAAAbQ
   QIBQGCgWh8jksCgYEAaCozIZKBgOiIRiwSgEpstCw/HYQiKRhBcMCBgQDodk
   MaFU0t9pQHCIyy0TFxgYEVF6GQ4LCQkaERscHR4RH3lUIAkWCyEiIyQlHiYj
   EJVIAQQJJ2gjJSUoKSorlHoCLBQcHC0lLikvHjCGejEiHBgeMjM0NRwPpFQF
   DBHFNjceHAjAYFWoI7cnCVE4OWxtex8QH1EBOjs4zUpGUjw6Pe3j2fP19u/4
   zT766vRI+fvHD4CPgwcJ9qg0UB85JA0dDjEQBAAh/mhDcmVhdGVkIGJ5IEJN
   UFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5OTgu
   IEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVsY29yLmNv
   bQA7
}
image create photo viewmag-22 -data {
   R0lGODlhFgAWAIUAAPwCBBQSFJyanKy2tLzCxHyChNTa3Nzq7Nz29Nzy9Mzy
   9MTu9OTy9Nzi5Oz6/OT29MTi5Kzi7NTy9KTm7JzW3ITO1Lzq7IzW5HzK1LS+
   vMTq7Jze7ITW3GTCzGS+zLTS1MzOzLzq9Kzm7Jze5ITW5HTS3FS2vLze5EzC
   zEyyvEyutJTa5NTu9ITa5FTK1ESirLTm7Mzi5FS6xEy2vESerESmtFSutESm
   rKyqrAz+/Dw+RAzi3ASutHRydAQCBAAAACH5BAEAAAAALAAAAAAWABYAAAbK
   QIBQGCgWh8jksCgYEAaCozIZKBgOiIRiwSgEpstCw/HYQiKRhBcMCBgQDodk
   MaFU0t9pQHCIyy0TFxgYEVF6GQ4LCQkaERscHR4RH3lUIAkWCyEiIyQlHiYj
   EJVIAQQJJ2gjJSUoKSorlHoCLBQcHC0lLikvHjCGejEiHBgeMjM0NRwPpFQF
   DBHFNjceHAjAYFWoI7cnCVE4OWxtex8QH1EBOjs4zUpGUjw6Pe3j2fP19u/4
   7vrq9P3s/avno2BBf/MCClSob4iBIAAh/mhDcmVhdGVkIGJ5IEJNUFRvR0lG
   IFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5OTguIEFsbCBy
   aWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVsY29yLmNvbQA7
}
image create photo appbookopen22 -data {
   R0lGODlhFgAWAIYAAAQCBAQ2NPwCBHSurIS2tBx2dBweHPz+/Ozm1GxiTGyq
   pPz6/Pz69GSqpOzaxPzy5HxuVLSmlOTazPz27PT29NzClPTexHxuXLSmjAxq
   bFSinPTy9KyehNy+lPTy5Pz29HxyXNzWxKSahOzexPzy7IR2ZOTWtESenPTy
   7KSWfIyCbKyijAQGBDyalPTu3KSSdDSOjJyOdCSGhPzu3OzizJSGdPTq1PTq
   3JySdMy6lAyKhOzWtOzi1OTOrJyKbMS2nJySfMS+rAwCBNzOrNTCpNzKpJSG
   ZKyafLSifLyylIx+ZHx6ZDSChAQuLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAIA
   LAAAAAAWABYAAAf/gAABAoSFhoeHAAMAiI2IAAQFjI6EAAaJkQeTjwAICYkK
   BQcLm5WdBwyfhgChB66bp64HCQC1lQ2irqQCAA4PowsLEBESE4wAuLIHFAAV
   Fr+uDBcYxRm1GrmuGxwdFh4Mrh8gGCET1gDYyhsiFSMkDAsMDCUYJhvnJ9kH
   KCnODwwfPlBQsULCPRYAWogK9sHFiwoOPEyQh0JFPXO1YBSYwBEFghjdHkwQ
   OYGgwQwIZRR44GHGDBogabhAsYEEihrUMAIoUMCEDRs3HODIYQHFA6MPcJA7
   KICFjgw7eIzo4cOfiwc/gKwIUm2SkKdDdlDt4AABDaU/iIRwwbTSUyJFOow4
   S3Hkx9oNDDZgXPU0h1wcSIgEGUw4ibVET5WoWMKksePHpdxmyKADAEIWly9H
   JtQkQJMmlAgZCAQAIf5oQ3JlYXRlZCBieSBCTVBUb0dJRiBQcm8gdmVyc2lv
   biAyLjUNCqkgRGV2ZWxDb3IgMTk5NywxOTk4LiBBbGwgcmlnaHRzIHJlc2Vy
   dmVkLg0KaHR0cDovL3d3dy5kZXZlbGNvci5jb20AOw==
}

image create photo hotsync-22 -data {
   R0lGODlhFgAWAIUAAPwCBMTGxPTy9PT29Dx2TCRuPOTm5Pz6/Pz+/Dx2RCRu
   NOzu7Ozq7DRyRBxuNNze3BxeLER6TCRyNBxuLAQCBCxyPARKFAxKHBxqLARC
   FAxSHCxWPBxKLBReJAQ2FBRiJBRmJAxiHARSFAxiJAxOHOTi5ARiHAxeJAQm
   DAReHARSHAQiDAxmJAQ6FARaHAQ+FAQqDAQeDAAAAAAAAAAAAAAAAAAAAAAA
   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAWABYAAAb/
   QIBwKAwYj8Rk0igYDAgFg1FJNA4OiMMgoVAsGFNlYIE9HAgNh6O7WDwgS4b5
   EGlIupO1d0GBDwNmWxVrEmsOE2wCFn9OAxWDCmt5kWsCbRdFThVdGIeRCoiI
   bQsZAAEMAwKUn5NqE6MLGhtjC5F5E7gYurqwBhActJGdExhtuwYLBgwGBh0e
   Y5ESncVtHxgMycsGICHPDKwOsG3Iy8sYIt6Ge6MM7czMIyMkHKbTluzayyUl
   Iyal9WzYjTNQwsCDfidQ/MGFTxtBfiNS/CtyQlc5ZcxKHExhQsWKJRBYYHi3
   r8QHEyZOiPiopIWGDxAennSBMgNLKgBeqDjx4AFKDxcZFOJMAsODURgxcNoJ
   AgAh/mhDcmVhdGVkIGJ5IEJNUFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBE
   ZXZlbENvciAxOTk3LDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpodHRw
   Oi8vd3d3LmRldmVsY29yLmNvbQA7
}

image create photo noatunplay22 -data {
   R0lGODlhFgAWAIQAAPz+/AQyVKTW5JzS5HzC1HS6zGyyzGSmxJTO3FyetJTK
   3FyevITC1FSWtHy6zEyOrEyOtGyqxESKrESCpDx+pDR2nCxulCRmlDRynCxq
   lCRijBxahBxWhBRShBROfAAAACH5BAEAAAAALAAAAAAWABYAAAWHICCOQTCe
   aAoEwmCqsBgMhPDGKVsQLp4PhqDNd5odDMcecYU4JJwHpS+gSFgX1uGU0eh6
   G1JYwPEoQx7nh1YckTwk8Pf7pgokJhNKfj+h5yQVFIGCgn45ExWJihWGORQW
   FxaQFo05GBcZF5qVORcaFxsanJ0cGxujOR0ep0tFHh6oYrGtOAYhACH+aENy
   ZWF0ZWQgYnkgQk1QVG9HSUYgUHJvIHZlcnNpb24gMi41DQqpIERldmVsQ29y
   IDE5OTcsMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCmh0dHA6Ly93d3cu
   ZGV2ZWxjb3IuY29tADs=
}

image create photo player_stop22 -data {
   R0lGODlhFQAVAIQAAPwCBARCZKze7KTW5JzS5JTO3Kza5Hy6zIS+1IzG1IS6
   zHSyzKTS5GyqxGyuxJTK3GSmxFyevGSivFyavFSWtEyOrESCpEyKrESGrDx+
   pCxynDR2nAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAVABUAAAWfICCOZGme
   aBqsbOuWgTAQxGDfNl0EZGAcCCBiODwkFEPeyHdoOp9PpSgwWFivWKwUEGA0
   vo5wePFthLeBRxnSYEPY7Tc6EZHU7fiIXiJBHyYRE4B6hIVoDRSJFBWLjYwV
   FWgRkJSVj4xoFBYXFZydlBecF2gVFqYYpqmnpmimGa+vFhmysBloGRq5uru7
   aLkbvLvAGltcLscsKcrLzEshACH+aENyZWF0ZWQgYnkgQk1QVG9HSUYgUHJv
   IHZlcnNpb24gMi41DQqpIERldmVsQ29yIDE5OTcsMTk5OC4gQWxsIHJpZ2h0
   cyByZXNlcnZlZC4NCmh0dHA6Ly93d3cuZGV2ZWxjb3IuY29tADs=
}

