-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathmain.go
126 lines (96 loc) · 2.81 KB
/
main.go
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package main
import (
"flag"
"fmt"
"image"
"image/draw"
"log"
"os"
"github.com/xigh/go-wavreader"
)
var (
OFFSET = flag.Uint64("offset", 0, "sey begin of samples")
LENGTH = flag.Uint64("length", 0, "set number of samples [0 means all]")
RATIO = flag.Float64("ratio", 0.8, "set ratio")
WIDTH = flag.Uint("width", 2048, "set width")
HEIGHT = flag.Uint("height", 450, "set height")
HIDEAVG = flag.Bool("hideavg", false, "hide average")
HIDERULERS = flag.Bool("hiderulers", false, "hide rulers")
OUT = flag.String("out", "out.png", "set output filename")
BINS = flag.Uint("bins", 512, "set freq bins")
PREEMP = flag.Float64("preemp", 0.95, "pre-emphasis")
RECTANGLE = flag.Bool("rectangle", false, "use rectangle window")
DFT = flag.Bool("dft", false, "use dft instead of fft")
LOG10 = flag.Bool("log10", false, "pretty")
MAG = flag.Bool("mag", false, "mag")
BG0 = flag.String("BG0", "000", "set background color 0")
BG1 = flag.String("BG1", "333", "set background color 1")
FG0 = flag.String("FG0", "0972a2", "set forground color 0")
FG1 = flag.String("FG1", "6b5f7e", "set forground color 1")
RUL = flag.String("RUL", "a0b0c0", "set rulers color")
)
func main() {
flag.Parse()
if flag.NArg() == 0 {
fmt.Printf("usage: fft [options] file.wav\n")
return
}
name := flag.Arg(0)
r, err := os.Open(name)
if err != nil {
log.Fatal(err)
}
defer r.Close()
wr, err := wavreader.New(r)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s: %dHz, %d channels, %d samples, %v\n",
name, wr.Rate(), wr.Chans(), wr.Len(), wr.Duration())
start := *OFFSET
if start > wr.Len() {
log.Fatalf("offset bigger than file")
}
length := *LENGTH
if start+length > wr.Len() {
log.Printf("length too long\n")
length = wr.Len() - start
}
samples := make([]float64, length)
for i := uint64(0); i < length; i++ {
s, err := wr.At(0, start+i)
if err != nil {
log.Fatal(err)
}
samples[i] = float64(s)
}
if *PREEMP > 0 {
for i := len(samples) - 1; i > 0; i-- {
samples[i] = samples[i] - *PREEMP*samples[i-1]
}
}
W := int(*WIDTH)
H := int(*HEIGHT)
B := int(*BINS)
bounds := image.Rect(-20, -20, W+20, H+40+B)
img := NewImage128(bounds)
bg0 := ParseColor(*BG0)
fmt.Printf("bg0: %.8x\n", bg0)
draw.Draw(img, img.Bounds(), image.NewUniform(bg0), image.ZP, draw.Src)
fmt.Println("drawwav:")
i0 := img.Sub(image.Rect(0, 0, W, H))
drawwav(i0, samples)
fmt.Println("drawfft:")
i1 := img.Sub(image.Rect(0, H+20, W, H+20+B))
drawfft(i1, samples, wr.Rate(), uint32(B))
a0, s0 := img.Stats()
fmt.Printf("img stats: %d reads, %d writes\n", a0, s0)
fmt.Printf("saving %q\n", *OUT)
err = savePng(img, *OUT)
if err != nil {
log.Fatalf("savePng failed: %v", err)
}
fmt.Printf("saved %q\n", *OUT)
a1, s1 := img.Stats()
fmt.Printf("img stats: %d reads, %d writes\n", a1, s1)
}