Metronome

func metronome (beats_per_minute = 72, beats_per_bar = 4) {

    var counter   = 0
    var duration  = 60/beats_per_minute
    var base_time = Time.micro+duration

    STDOUT.autoflush(true)

    for next_time in (base_time..Inf `by` duration) {
        if (counter++ %% beats_per_bar) {
            print "\nTICK"
        }
        else {
            print " tick"
        }
        Sys.sleep(next_time - Time.micro)
    }
}

say metronome(ARGV.map{ Num(_) }...)

Output:

Last updated

Was this helpful?