# -*-Mode:Tcl-*- wsurf::RegisterPlugin pmview \ -description "Plot pitch marks contained in a pitch marks file (.pm) generated by the EST pitchmark program." \ -url "http://www.speech.kth.se/wavesurfer/" \ -addmenuentriesproc pmview::addMenuEntries \ -propertiespageproc pmview::propertyPane \ -applypropertiesproc pmview::applyProperties \ -panecreatedproc pmview::paneCreated \ -redrawproc pmview::redraw \ -cursormovedproc pmview::cursorMoved \ -getconfigurationproc pmview::getConfiguration # ----------------------------------------------------------------------------- namespace eval pmview { } # ---------------------------------------------------------------------------- proc pmview::paneCreated {w pane} { namespace eval [namespace current]::${pane} { variable var } upvar [namespace current]::${pane}::var v set v(drawPMs) 0 } proc pmview::addMenuEntries {w pane m hook x y} { if {[string match query $hook]} { return 0 } if {[string length $hook] == 0} { } elseif {[string match create $hook]} { $m.$hook add command -label "Pitch Marks" \ -command [namespace code [list createPmview $w $pane]] } } proc pmview::createPmview {w pane} { set pane [$w addPane -before $pane -height 20 -scrollheight 20 \ -showyaxis true] addPmview $w $pane } proc pmview::addPmview {w pane args} { upvar [namespace current]::${pane}::var v array set a [list \ -fill red \ -extension ".pm" \ -extendboundaries 1 \ ] array set a $args set v(color) $a(-fill) set v(extension) .[string trim $a(-extension) .] set v(extBounds) $a(-extendboundaries) _readPMfile $w $pane _drawPMs $w $pane } proc pmview::_readPMfile {w pane} { upvar [namespace current]::${pane}::var v $w messageProc "Reading pitch marks file..." set v(zxlist) {} set file [file root [$w getInfo fileName]] if {[catch {open $file.[string trim $v(extension) .]} in]} { return $in } gets $in row gets $in row gets $in row gets $in row gets $in row gets $in row gets $in row gets $in row gets $in row while {[eof $in] == 0} { scan $row "%f" pos lappend v(zxlist) $pos gets $in row } close $in $w messageProc "Pitch marks file read" } proc pmview::_drawPMs {w pane} { upvar [namespace current]::${pane}::var v set c [$pane canvas] set height [$pane cget -scrollheight] $c delete pmview foreach {pos} $v(zxlist) { $c create line [expr {$pos * [$w cget -pixelspersecond]}] 0 \ [expr {$pos * [$w cget -pixelspersecond]}] $height -fill $v(color) \ -tags pmview } foreach otherpane [$w _getPanes] { upvar wsurf::analysis::${otherpane}::var ov if {$ov(drawWaveform) || $ov(drawSpectrogram)} { set othercanvas [$otherpane canvas] $othercanvas delete pmview if {$v(extBounds)} { set height [$otherpane cget -height] foreach {pos} $v(zxlist) { $othercanvas create line [expr {$pos * [$w cget -pixelspersecond]}] 0 \ [expr {$pos * [$w cget -pixelspersecond]}] $height -fill $v(color) \ -tags pmview } } } } set v(drawPMs) 1 } proc pmview::redraw {w pane} { upvar [namespace current]::${pane}::var v if [$w getInfo isRecording] return if {$v(drawPMs)} { _drawPMs $w $pane } } proc pmview::cursorMoved {w pane t var} { upvar [namespace current]::${pane}::var v if [$w getInfo isPlaying] return if {$v(drawPMs)} { $w messageProc [format "Pmview - %s" [$w formatTime $t]] } } proc pmview::propertyPane {w pane} { upvar [namespace current]::${pane}::var v if {$pane==""} return if {$v(drawPMs)} { return [list "Pmview" [namespace code drawPmviewPage]] } } proc pmview::applyProperties {w pane} { if {[string match *wavebar $pane]} return upvar [namespace current]::${pane}::var v if [info exists v(drawPMs)] { if {$v(drawPMs)} { foreach var [list color extension extBounds] { if {[string compare $v(t,$var) $v($var)] != 0} { set v($var) $v(t,$var) set doRedraw 1 } if {[string match extension $var]} { _readPMfile $w $pane } } if [info exists doRedraw] { $w _redrawPane $pane } } } } proc pmview::drawPmviewPage {w pane p} { upvar [namespace current]::${pane}::var v foreach f [winfo children $p] { destroy $f } foreach var {color extension extBounds} { set v(t,$var) $v($var) } colorPropItem $p.f1 "Label color:" 25 \ [namespace current]::${pane}::var(t,color) stringPropItem $p.f2 "Label filename extension:" 25 16 "" \ [namespace current]::${pane}::var(t,extension) booleanPropItem $p.f3 \ "Extend boundaries into waveform and spectrogram panes" "" \ [namespace current]::${pane}::var(t,extBounds) } proc pmview::getConfiguration {w pane} { upvar [namespace current]::${pane}::var v set result {} if {$pane==""} return {} if {$v(drawPMs)} { append result "\$widget pmview::addPmview \$pane \ -extendboundaries $v(extBounds)\ -extension \"$v(extension)\"\ -fill $v(color)" "\n" } return $result }