Journal TapTempo en Crystal-Lang

Posté par . Licence CC By‐SA.
Étiquettes :
12
27
juil.
2018

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 (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 ?

  • # C'est marrant...

    Posté par . Évalué à 3.

    on dirait du ruby.

    Ce serait pas la version compilée de Ruby, ce langage Crystal ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.