[dzach] 2007-6-27: A sound generator for beeps, clicks and noises can be created using [Snack]. Here is a way to produce such sounds, using [snack]'s filters: ---- package req snack namespace eval ::soundgen { variable var } proc ::soundgen::init {} { variable var # define sinewaves set var(low) [snack::filter generator 880 32767 0.0 sine] set var(high) [snack::filter generator 990 32767 0.0 sine] set var(veryhigh) [snack::filter generator 1650 32767 0.0 sine] # define some noise set var(noisy) [snack::filter generator 0 2000 0.0 noise] # define sound objects set var(beep) [snack::sound -channels 1] set var(chaos) [snack::sound -channels 1] # create sounds $var(beep) filter $var(low) -start 0 -end 500 $var(beep) filter $var(high) -start 500 -end 750 $var(beep) filter $var(low) -start 750 -end 1250 $var(beep) filter $var(veryhigh) -start 1250 -end 1750 $var(beep) filter $var(noisy) -start 1750 $var(chaos) filter $var(noisy) -end 300 } proc ::soundgen::beep {type args} { variable var # use catch in case the sound device is busy. # on windows this might not be necessary catch { switch -- $type { raise { eval $var(beep) play -start 250 -end 750 $args } drop { eval $var(beep) play -start 500 -end 1200 $args } trill { eval $var(beep) play -start 0 -end 1250 $args } lowbeep { eval $var(beep) play -start 750 -end 1250 $args } highbeep { eval $var(beep) play -start 1250 -end 1750 $args } chaos { eval $var(chaos) play -end 500 $args } beep - default { eval $var(beep) play -start 500 -end 750 $args } } } } # test code # create a sound clock that counts 5sec, 10sec, 30sec and 1min proc tick {} {set clock [clock sec] if {$clock % 60 == 0} { # cascade two sounds soundgen::beep trill -command {soundgen::beep chaos -end 1000} } elseif {$clock % 30 == 0} { soundgen::beep trill } elseif {$clock % 10 == 0} { soundgen::beep drop } elseif {$clock % 5 == 0} { soundgen::beep raise } { soundgen::beep highbeep } after 1000 tick } # start test soundgen::init tick ---- [[ [Category Package] | [Category Music] | [Category Sound] ]]