23 lines
612 B
Tcl
23 lines
612 B
Tcl
package require sound
|
|
|
|
# Encapsulate the tone generation
|
|
set filter [snack::filter generator 1 20000 0.5 sine -1]
|
|
set sound [snack::sound -rate 22050]
|
|
proc play {frequency length} {
|
|
global filter sound
|
|
|
|
$filter configure $frequency
|
|
$sound play -filter $filter
|
|
|
|
# Need to run event loop; Snack uses it internally
|
|
after $length {set donePlay 1}
|
|
vwait donePlay
|
|
|
|
$sound stop
|
|
}
|
|
|
|
# Major scale up, then down; extra delay at ends of scale
|
|
set tonicFrequency 261.63; # C4
|
|
foreach i {0 2 4 5 7 9 11 12 11 9 7 5 4 2 0} {
|
|
play [expr {$tonicFrequency*2**($i/12.0)}] [expr {$i%12?250:500}]
|
|
}
|