# Rabbadak's BPM Tap V1.1 # ~~~~~~~~~~~~~~~~~~~~~~~ # # Measure BPM by tapping a key to the rhythm # # # Author: Hendrik "Rabbadak" Dilling (bpmtap@rabbadak.de) # Status: Gamma # Distribution: Public Domain # History: # - 1.0 # - first release, wish version # - 1.1 # - ported to REd0 ::red0::scriptname "BPM Tap" ::red0::menu Start ::tap::buildgui namespace eval tap { proc buildgui {} { catch {destroy .tap} toplevel .tap pack [label .tap.l2 -text "Average BPM"] -fill x pack [label .tap.abpm -relief sunken -bd 2] -fill x pack [label .tap.l1 -text "Last BPM"] -fill x pack [label .tap.lbpm -relief sunken -bd 2] -fill x pack [label .tap.l3 -text "Taps"] -fill x pack [label .tap.taps -textvariable ::tap::taps -relief sunken -bd 2] -fill x bind .tap ::tap::tapped menu .tap.menu .tap.menu add command -label "Reset" -command ::tap::reset .tap configure -menu .tap.menu ::tap::reset } set lasttap 444 set deltatap [clock clicks -milliseconds] set taps 0 set avgtap 444 proc tapped {} { set x [clock clicks -milliseconds] if {$::tap::deltatap == 0} { set ::tap::deltatap $x .tap.abpm configure -text "---" .tap.lbpm configure -text "---" incr ::tap::taps } else { set ::tap::lasttap [expr "$x-$::tap::deltatap"] set ::tap::deltatap $x set ::tap::avgtap [expr "((double($::tap::avgtap)*double($::tap::taps))+double($::tap::lasttap))/($::tap::taps.0+1)"] incr ::tap::taps 1 .tap.abpm configure -text [expr "60000/double($::tap::avgtap)"] .tap.lbpm configure -text [expr "60000/double($::tap::lasttap)"] } } proc reset {} { set ::tap::deltatap 0 set ::tap::lasttap 0 set ::tap::taps 0 .tap.abpm configure -text "N/A" .tap.lbpm configure -text "N/A" } }