[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

[QUIZ] Polyrhythm Trainer (#194

Daniel Moore

2/27/2009 5:29:00 PM

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

The three rules of Ruby Quiz:

1. Please do not post any solutions or spoiler discussion for this
quiz until 48 hours have elapsed from the time this message was
sent.

2. Support Ruby Quiz by submitting ideas and responses
as often as you can! Visit: <http://rubyquiz.str...

3. Enjoy!

Suggestion: A [QUIZ] in the subject of emails about the problem
helps everyone on Ruby Talk follow the discussion. Please reply to
the original quiz message, if you can.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

## Polyrhythm Trainer (#194)

Greetings fellow Rubyists,

This week's quiz is to create a polyrhythm training program. The user
will be prompted to tap out a rhythm with two keys: left and right.
Each time the user presses a key the program will display how close to
the correct timing the key press occurred. The program will be
configurable to train the user in any polyrhythm 2:3, 5:4, 11:17, and
so on. The program will also have a configurable tempo. After a number
of complete rhythms the program will display the ratio of how many
notes were successfully struck, success determined by being within a
threshold around the perfect timing.

The display can be as simple as a console application or use a full
graphical interface. [Ruby Inside][1] recently had an article about
graphical toolkits if you are interested.

[Polyrhythm][2] is the simultaneous sounding of two or more independent rhythms.

[1]: http://www.rubyinside.com/ruby-gui-programming-survey-results...
[2]: http://en.wikipedia.org/wiki/...

Have Fun!
--
-Daniel
http://rubyquiz...

2 Answers

Daniel Moore

3/7/2009 7:53:00 PM

0

This quiz may be worthy of a revisit in the future. Until then, here
is my solution: the beginnings of an "Annoyance" trainer.

# rhythm.rb

class Rhythm
BPM = 20
SECONDS_PER_MINUTE = 60.0

def initialize(n, sym)
@sym = sym
@seconds_per_hit = SECONDS_PER_MINUTE/(BPM*n)
@last_hit = @seconds_per_hit
@hit_count = 0
@time = 0

puts @seconds_per_hit
end

def elapse(time_elapsed)
hit = false
if @last_hit >= @seconds_per_hit
@hit_count += 1
@last_hit -= @seconds_per_hit
puts "#{"%1.3f" % @time}: #{@sym}"
hit = true
end
@time += time_elapsed
@last_hit += time_elapsed
return hit
end
end

s = '@'

rhythms = ARGV.map{|arg| Rhythm.new(arg.to_i, s = s.succ)}

delta = 0.05
time = 0

while true
hit = rhythms.map{|r| r.elapse(delta)}.inject(false) {|hit, r| hit || r}
print "\a" if hit
time += delta
sleep delta
end

The program will beep indefinitely, producing a sound every time the
rhythm should be struck (to the nearest 20th of a second).

Usage: ruby rhythm.rb [rhythms]

EX: > ruby rhythm.rb 3 2
1.0
1.5
0.000: A
0.000: B
1.000: A
1.500: B
2.000: A
3.000: A
3.000: B
4.000: A
4.500: B
5.000: A

Crank up the volume on your PC speaker and have a blast near your co-workers!

http://rubyquiz.strd6.com/q...

Todd Benson

3/8/2009 9:50:00 PM

0

> configurable to train the user in any polyrhythm 2:3, 5:4, 11:17

11:17 is simply a modified 2:3, but I challenge anyone to do it with
any degree of precision at high tempo and only 2 references (2 keys).
If you can use your whole hand (as in playing a piano), it might be
easier. Scriabin, for example, would frequently throw his poor
pianist into 11:3, 9:4, etc. brief, but frequent, frenzies (see piano
sonata no. 1 in F minor).

Todd