1#!/bin/sh
2# the next line restarts using wish \
3exec wish8.4 "$0" "$@"
4
5package require -exact snack 2.2
6
7snack::sound s
8
9array set map {
10    0 2
11    1 3
12    2 4
13    3 5
14    4 7
15    5 9
16    6 12
17    7 15
18    8 19
19    9 23
20    10 28
21    11 34
22    12 41
23    13 49
24    14 56
25    15 63
26}
27
28pack [canvas .c -width 140 -height 100]
29
30for {set i 0} {$i<16} {incr i} {
31  .c create rect [expr 10*$i] 50 [expr 10*$i+10] 100 -fill green  -outline ""
32  .c create rect [expr 10*$i] 20 [expr 10*$i+10] 50  -fill yellow -outline ""
33  .c create rect [expr 10*$i] 0  [expr 10*$i+10] 20  -fill red   -outline ""
34  .c create rect [expr 10*$i] 0  [expr 10*$i+10] 100 -fill black -tag c$i
35}
36for {set i 0} {$i<17} {incr i} {
37  .c create line 0 [expr 6*$i] 140 [expr 6*$i] -width 3
38  .c create line [expr 10*$i] 0 [expr 10*$i] 100 -width 5
39}
40
41pack [frame .f]
42pack [button .f.a -text On -command On] -side left
43pack [button .f.b -text Off -command {s stop}] -side left
44
45proc On {} {
46  s record
47  after 100 Draw
48}
49
50proc Draw {} {
51  if {[s length] > 129} {
52    set spec [s dBPower -fftlen 128 -windowlength 128]
53    s length 0
54    for {set i 0} {$i < 16} {incr i} {
55      set val [lindex $spec $::map($i)]
56      .c coords c$i [expr 10*($i-2)] 0 [expr 10*($i-2)+9] \
57	      [expr 100-1.4*($val+100)]
58    }
59  }
60  if ![snack::audio active] return
61  after 100 Draw
62}
63