#!/bin/csh -f
# ----------------------------------------------------------------- #
#             The Speech Signal Processing Toolkit (SPTK)           #
#             developed by SPTK Working Group                       #
#             http://sp-tk.sourceforge.net/                         #
# ----------------------------------------------------------------- #
#                                                                   #
#  Copyright (c) 1984-2007  Tokyo Institute of Technology           #
#                           Interdisciplinary Graduate School of    #
#                           Science and Engineering                 #
#                                                                   #
#                1996-2015  Nagoya Institute of Technology          #
#                           Department of Computer Science          #
#                                                                   #
# All rights reserved.                                              #
#                                                                   #
# Redistribution and use in source and binary forms, with or        #
# without modification, are permitted provided that the following   #
# conditions are met:                                               #
#                                                                   #
# - Redistributions of source code must retain the above copyright  #
#   notice, this list of conditions and the following disclaimer.   #
# - Redistributions in binary form must reproduce the above         #
#   copyright notice, this list of conditions and the following     #
#   disclaimer in the documentation and/or other materials provided #
#   with the distribution.                                          #
# - Neither the name of the SPTK working group nor the names of its #
#   contributors may be used to endorse or promote products derived #
#   from this software without specific prior written permission.   #
#                                                                   #
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND            #
# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,       #
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF          #
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE          #
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS #
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,          #
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED   #
# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,     #
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON #
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,   #
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY    #
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE           #
# POSSIBILITY OF SUCH DAMAGE.                                       #
# ----------------------------------------------------------------- #

#########################################################################
#                                                                       #
#   Draw a Waveform                                                     #
#                                                                       #
#                                               1997.1  K.Koishida      #
#                                               2010.6  T.Sawada        #
#                                                                       #
#########################################################################

onintr clean

set path    = ( /usr/pkg/SPTK/bin $path )
set sptkver = '3.9'
set cvsid   = '$Id: gwave.in,v 1.24 2015/12/14 05:45:40 uratec Exp $'

set cmnd = $0
set cmnd = $cmnd:t
set file

@ start     = 0
@ term      = -1
@ numscreen = 5
@ numdata   = 2000
set ymax    = 2000
set pen     = 1
set F       = 1
set type    = f

set flagy2      = 0
set flagfile    = 0
set flagnumdata = 0
set flagy       = 0

@ i = 0
while ($i < $#argv)
        @ i++
        switch ("$argv[$i]")
        case -s:
                @ i++
                set start = $argv[$i]
                breaksw
        case -e:
                @ i++
                set term = $argv[$i]
                breaksw
        case -n:
                @ i++
                @ numdata = $argv[$i]
                set flagnumdata = 1
                breaksw
        case -i:
                @ i++
                set numscreen = $argv[$i]
                breaksw
        case -y:
                @ i++
                set ymax = $argv[$i]
                set flagy = 1
                breaksw
        case -y2:
                @ i++
                set ymin = $argv[$i]
                set flagy = 1
                set flagy2 = 1
                breaksw
        case -p:
                @ i++
                set pen = $argv[$i]
                breaksw
        case -F:
                @ i++
                set F   = $argv[$i]
                breaksw
        case +c:
                set type = c
                breaksw
        case +s:
                set type = s
                breaksw
        case +i3:
                set type = i3
                breaksw
        case +i:
                set type = i
                breaksw
        case +l:
                set type = l
                breaksw
        case +le:
                set type = le
                breaksw
        case +C:
                set type = C
                breaksw
        case +S:
                set type = S
                breaksw
        case +I:
                set type = I
                breaksw
        case +I3:
                set type = I3
                breaksw
        case +L:
                set type = L
                breaksw
        case +LE:
                set type = LE
                breaksw
        case +f:
                set type = f
                breaksw
        case +d:
                set type = d
                breaksw
        case +de:
                set type = de
                breaksw
        case -h:
                set exit_status = 0
                goto usage
                breaksw
        default:
                set file = "$argv[$i]"
                set flagfile = 1
                if ( ! -f "$file" ) then
                        echo2 "${cmnd} : Cannot open file ${file}\!"
                        set exit_status = 1
                        goto usage
                endif
                breaksw
        endsw
end

# when input stream is stdin
if ("$file" == "") then
    rm -fr /tmp/sptk-gwave-$uid-$$
    cat > /tmp/sptk-gwave-$uid-$$
    set file=/tmp/sptk-gwave-$uid-$$
endif

goto main

usage:
        echo2 ''
        echo2 " $cmnd - draw a waveform"
        echo2 ''
        echo2 '  usage:'
        echo2 "       $cmnd [ options ] [ infile ] > stdout"
        echo2 '  options:'
        echo2 '       -F  F         : factor                       [1]'
        echo2 '       -s  s         : start point                  [0]'
        echo2 '       -e  e         : end point                    [EOF]'
        echo2 '       -n  n         : data number of one screen    [N/A]'
        echo2 '       -i  i         : number of screen             [5]'
        echo2 '       -y  ymax      : maximum amplitude            [N/A]'
        echo2 '       -y2 ymin      : minimum amplitude            [-ymax]'
        echo2 '       -p  p         : pen number                   [1]'
        echo2 '       +type         : input data type              [f]'
        echo2 '                        c  (char)         C  (unsigned char) '
        echo2 '                        s  (short)        S  (unsigned short)'
        echo2 '                        i3 (int, 3byte)   I3 (unsigned int, 3byte)'
        echo2 '                        i  (int)          I  (unsigned int)'
        echo2 '                        l  (long)         L  (unsigned long)'
        echo2 '                        le (long long)    LE (unsigned long) '
        echo2 '                        f  (float)        d  (double)'
        echo2 '                        de (long double)'
        echo2 '       -h            : print this message'
        echo2 '  infile:'
        echo2 '       waveform                                     [stdin]'
        echo2 '  stdout:'
        echo2 '       XY-plotter command'
        echo2 '  notice:'
        echo2 '       If options of amplitude are not used,'
        echo2 '        value of amplitude is automatically determined.'
        echo2 '       If -n option is not used,'
        echo2 '        entire waveform is displayed.'
        echo2 ''
        echo2 " SPTK: version $sptkver"
        echo2 " CVS Info: $cvsid"
        echo2 ''
exit $exit_status

main:

if ( ! $flagnumdata ) then
        if ( $term > 0 ) then
                @ wc = $term
        else
                set wc = ` x2x +${type}a $file | wc -l `
        endif
        @ wc = $wc - $start
                
        @ rest = $wc % $numscreen
        @ wc /= $numscreen
        if ($rest) @ wc++
        @ numdata = $wc
endif

if ( ! $flagy ) then
        set val = (`x2x +${type}f < $file | sopr -ABS  | minmax -o 2 | x2x +fa`)

	set ymax = $val
	set ymin = -$val
endif

if ( ! $flagy2 ) then
        set ymin = -$ymax
endif

set width  = 1.7 
set height = 0.4

@ n1  = $numdata - 1
@ end = $start + $n1

set ox  = `echo "20 * $F" | bc -l`
set oy  = `echo "225 * $F" | bc -l`

@ xs  = $start
@ xe  = $xs + $n1

if ( $numdata < 10 ) then
        @ dx = 1
else
        @ dx = $numdata / 10
endif

while ( $numscreen > 0 )

        @ i = 0
        set xscale = ()
        set x = 0

        while (1)
               @ x = $dx * $i + $xs
            if ( $x <= $xe - $dx ) then
                 set xscale = ($xscale $x)
               @ i++
            else 
                 set xscale = ($xscale $x)
                 break
            endif
        end       

        fig -o $ox $oy -W $width -H $height -p $pen -F $F<< EOF
                x      $xs $xe
                y      $ymin $ymax
                xscale $xscale
                yscale $ymin $ymax
EOF
        x2x +${type}f $file |\
        bcut +f -s $start -e $end |\
        fdrw -o $ox $oy -W $width -H $height -p $pen -g 0 \
             -y $ymin $ymax -n $numdata -F $F

        @ numscreen--
        set oy  =  `echo "$oy - 50 * $F" | bc -l`
        @ xs    += $numdata 
        @ xe    += $numdata 
        @ start += $numdata 
        @ end   += $numdata 

end
clean:

rm -fr /tmp/sptk-gwave-$uid-$$
