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 ?

    • [^] # Re: Agréable à lire

      Posté par  . É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  (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  (site web personnel) . É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.