1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
package main
import (
"fmt"
"io"
"os"
"path"
"strings"
"github.com/cryptix/wav"
"gonum.org/v1/plot"
"gonum.org/v1/plot/plotter"
"gonum.org/v1/plot/plotutil"
"gonum.org/v1/plot/vg"
)
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, "Usage: plotWav <file.wav>\n")
os.Exit(1)
}
// open file
testInfo, err := os.Stat(os.Args[1])
checkErr(err)
testWav, err := os.Open(os.Args[1])
checkErr(err)
wavReader, err := wav.NewReader(testWav, testInfo.Size())
checkErr(err)
// File informations
fmt.Println(wavReader)
// limit sample count
sampleCnt := wavReader.GetSampleCount()
if sampleCnt > 10000 {
sampleCnt = 10000
}
// setup plotter
p, err := plot.New()
checkErr(err)
p.Title.Text = "Waveplot"
p.X.Label.Text = "t"
p.Y.Label.Text = "Ampl"
pts := make(plotter.XYs, sampleCnt)
// read samples and construct points for plot
for i := range pts {
n, err := wavReader.ReadSample()
if err == io.EOF {
break
}
checkErr(err)
pts[i].X = float64(i)
pts[i].Y = float64(n)
}
err = plotutil.AddLinePoints(p, "", pts)
checkErr(err)
// construct output filename
inputFname := path.Base(os.Args[1])
plotFname := strings.Split(inputFname, ".")[0] + ".pdf"
if err := p.Save(10*vg.Inch, 4*vg.Inch, plotFname); err != nil {
panic(err)
}
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
|