Aller hop je m'y mets aussi, un petit TapTempo en Crystal.
Personne ne l'a encore fait, donc ça va permettre de faire découvrir un peu plus ce langage.
Le code est disponible sur https://github.com/syrm/taptempo
Et sinon voici la classe complète :
require "option_parser"
class TapTempo
@taps = Array(Time::Span).new
@sample = 5
@resetTime = 5
@precision = 0
def initialize
generateHelp
end
def tap
currentTap = Time.monotonic
checkResetTime
@taps.shift if @taps.size == @sample
@taps << currentTap
end
def loop
STDIN.raw &.each_char do |char|
break if char == 'q'
tap
displayBPM
end
puts "Bye Bye!"
end
private def checkResetTime
return if @taps.empty?
@taps.clear if Time.monotonic - @taps[-1] > Time::Span.new(0, 0, @resetTime)
end
private def displayBPM
if @taps.size == 1
puts "[Hit a key one more time to start bpm computation...]\r"
return
end
puts sprintf "Tempo: %." + normalizePrecision + "f bpm\r", getBPM
end
private def getBPM
60.0 / ((@taps[-1] - @taps[0]) / (@taps.size.to_f - 1)).to_f
end
private def normalizePrecision
return "" if @precision == 0
@precision.to_s
end
private def generateHelp
OptionParser.parse! do |parser|
parser.banner = "Usage: #{PROGRAM_NAME} [options]"
parser.on("-h", "--help", "display this help message") do
puts parser
exit
end
parser.on("-p", "--precision=#{@precision}", "set the decimal precision of the tempo display") { |precision| @precision = precision.to_i }
parser.on("-r", "--reset-time=#{@resetTime}", "set the time in second to reset the computation") { |resetTime| @resetTime = resetTime.to_i }
parser.on("-s", "--sample-size=#{@sample}", "set the number of samples needed to compute the tempo") { |sample| @sample = sample.to_i }
end
end
end
tapTempo = TapTempo.new
tapTempo.loop
# Agréable à lire
Posté par mzf (site web personnel) . Évalué à 1.
Le découpage en sous-fonction rend la lecture très agréable. J'imagine que ce n'est pas spécialement dû au langage, mais à ta manière de développer alors bravo :-)
Je suis intrigué par la méthode
generateHelp
. Apparemment elle fait à la fois l'affichage du message d'aide et l'analyse des paramètres d'entrée. Est-ce dû au langage Crystal ou est-ce un choix de ta part ?[^] # Re: Agréable à lire
Posté par srm . Évalué à 1.
Merci pour le compliment.
C'est du à la lib que j'ai utilisé sinon j'aurais codé ça différemment, le nommage de cette fonction est d'ailleurs nul
[^] # Re: Agréable à lire
Posté par Axioplase ıɥs∀ (site web personnel) . Évalué à 4.
Si tu as aimé son code, tu vas aimer lire "Clean Code", de Robert Martin.
# C'est marrant...
Posté par nlhss (site web personnel) . Évalué à 3.
on dirait du ruby.
Ce serait pas la version compilée de Ruby, ce langage Crystal ?
[^] # Re: C'est marrant...
Posté par Marc Quinton . Évalué à 5.
si si :-) un sous-ensemble de ruby compilable.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.