• # Latence

    Posté par  . Évalué à 10.

    On récupère le tempo avec combien de temps de latence du coup ?

  • # Sources

    Posté par  . Évalué à 10.

    Faire un journal court pourquoi pas mais mettre les sources dedans serait quand même plus agréable pour ceux qui veulent lire ce que tu as fait :

    package com.i2bp.taptempo;
    
    import org.apache.commons.cli.CommandLine;
    import org.apache.commons.cli.CommandLineParser;
    import org.apache.commons.cli.DefaultParser;
    import org.apache.commons.cli.HelpFormatter;
    import org.apache.commons.cli.Option;
    import org.apache.commons.cli.Options;
    import org.apache.commons.cli.ParseException;
    
    import java.text.DecimalFormat;
    import java.util.Scanner;
    import java.util.ArrayDeque;
    import java.util.Date;
    import java.util.Deque;
    
    public class TapTempo {
    
      static double computeBPM(long currentTime, long lastTime, int occurenceCount) {
        if (occurenceCount == 0) {
            occurenceCount = 1;
        }
    
        double elapsedTime = currentTime - lastTime;
        double meanTime = elapsedTime / occurenceCount;
        double bpm = 60.0 * 1000 / meanTime;
    
        return bpm;
      }
    
    
      public static void main(String[] args) throws Exception {
    
        int precision = 0;
        int resetTime = 5;
        int sampleSize = 5;
        Options options = new Options();
        Deque<Long> hitTimePoints = new ArrayDeque<Long>();;
    
        Option optHelp = new Option("h", "help", false, "Display this help message.");
        optHelp.setRequired(false);
        options.addOption(optHelp);
    
        Option optPrecision = new Option("p", "precision", true, "Set the decimal precision of the tempo display. Default is 0 digits, max is 5 digits.");
        optPrecision.setRequired(false);
        options.addOption(optPrecision);
    
        Option optResetTime = new Option("r", "reset-time", true, "Set the time in second to reset the computation. Default is 5 seconds.");
        optResetTime.setRequired(false);
        options.addOption(optResetTime);
    
        Option optSampleSize = new Option("s", "sample-size", true, "Set the number of samples needed to compute the tempo. Default is 5 samples.");
        optSampleSize.setRequired(false);
        options.addOption(optSampleSize);
    
        Option optVersion = new Option("v", "version", false, "Display the version.");
        optVersion.setRequired(false);
        options.addOption(optVersion);
    
        CommandLineParser parser = new DefaultParser();
        HelpFormatter formatter = new HelpFormatter();
        CommandLine cmd = null;
    
        try {
          cmd = parser.parse(options, args);
          if (cmd.hasOption('p')) {
            precision = Integer.parseInt(cmd.getOptionValue('p'));
        if (precision < 0) {
          precision = 0;
        } else if (precision > 5) {
          precision = 5;
        }
          }
          if (cmd.hasOption('r')) {
            resetTime = Integer.parseInt(cmd.getOptionValue('r'));
        if (resetTime < 1) {
          resetTime = 1;
        }
          }
          if (cmd.hasOption('s')) {
            sampleSize = Integer.parseInt(cmd.getOptionValue('s'));
        if (sampleSize < 1) {
          sampleSize = 1;
        }
          }
        } catch (ParseException|NumberFormatException e) {
          System.out.println(e.getClass() + ": "+ e.getMessage());
          formatter.printHelp("TempoTap", options);
          System.exit(1);
        }
    
        if (cmd.hasOption('h') || cmd.hasOption('v')) {
          if (cmd.hasOption('h')) {
            formatter.printHelp("TempoTap", options);
          }
          if (cmd.hasOption('v')) {
            System.out.println("Version: 1.0");
          }
          System.exit(0);
        }
    
        DecimalFormat df = new DecimalFormat();
        df.setMaximumFractionDigits(precision);
        df.setMinimumFractionDigits(precision);
    
        System.out.println("Hit enter key for each beat (q to quit).\n"); 
    
        Scanner keyboard = new Scanner(System.in);
        keyboard.useDelimiter("");
    
        boolean shouldContinue = true;
        while (shouldContinue) {
    
          char c;
          do {
            c =  keyboard.next().charAt(0);
            if (c == 'q') {
              shouldContinue = false;
              System.out.println("Bye Bye!\n");
              break;
            }
          } while (c != 10);
    
          if(shouldContinue) {
            long currentTime = System.currentTimeMillis();
    
            // Reset if the hit diff is too big.
            if (!hitTimePoints.isEmpty() && currentTime - hitTimePoints.getLast() > resetTime * 1000) {
              // Clear the history.
              hitTimePoints.clear();
            }
    
            hitTimePoints.add(currentTime);
            if (hitTimePoints.size() > 1) {
              double bpm = computeBPM(hitTimePoints.getLast(), hitTimePoints.getFirst(), hitTimePoints.size() - 1);
    
         String bpmRepresentation = df.format(bpm);
             System.out.println("Tempo: " + bpmRepresentation + " bpm");
            } else {
              System.out.println("[Hit enter key one more time to start bpm computation...]");
            }
    
            while (hitTimePoints.size() > sampleSize) {
              hitTimePoints.pop();
            }
          }
        }
      }
    
    }
    • [^] # Re: Sources

      Posté par  . Évalué à 8.

      Sérieusement? Il y en a encore qui parsent leurs lignes de commandes avec autre chose que l'excellentissime JCommander???

      http://www.jcommander.org/

      La vie est bien trop courte pour parser les lignes de commande à la main.

    • [^] # Re: Sources

      Posté par  . Évalué à 10.

      Ca manque de factory, d’abstract Singleton factory bean et d’aop quand même, et les logs peuvent même pas être shippes à kibana pour indexage.
      Pas sur que ça passe la review du sdlc ça, les señor architects vont râler.

      Linuxfr, le portail francais du logiciel libre et du neo nazisme.

    • [^] # Re: Sources

      Posté par  . Évalué à 5.

      Tu viens de recopier du code GPL sans préciser la licence. Je vais de ce pas te dénoncer à la FSF. RMS va venir s'occuper de ton cas et ton corps sera jeté aux manchots :-)

      Bon, je vais faire l'effort de mettre tout ça sur gitlab, même si c'est seulement 150 lignes de code un peu crade.

      • [^] # Re: Sources

        Posté par  . Évalué à 4.

        c'est seulement 150 lignes de code un peu crade.

        Ça fait répétition ça. T’as déjà précisé dans le titre que c’était du Java.

        • [^] # Re: Sources

          Posté par  (site web personnel) . Évalué à 2.

          Et encore, il n'a pas mis le plugin maven qui permet de définir le nombre de secondes par minutes dans un fichier XML dont la DTD est téléchargée à la volée.

    • [^] # Re: Sources

      Posté par  . Évalué à 6.

      long currentTime = System.currentTimeMillis();

      Dans ce cas il faut utiliser System#nanoTime et non System#currentTimeMillis. nanoTime est monotone alors que currentTimeMillis ne l'est pas (oui le nommage est pourri et il faut savoir lire entre les lignes de la doc)

      https://docs.oracle.com/javase/9/docs/api/java/lang/System.html#nanoTime--
      https://docs.oracle.com/javase/9/docs/api/java/lang/System.html#currentTimeMillis--

      • [^] # Re: Sources

        Posté par  (site web personnel) . Évalué à 2.

        C'est marrant la vie, j'ai découvert aujourd'hui cette histoire d'horloge monotonique (en regardant de près un bug dans GTK/Wayland), je vais mouler sur DLFP et je tombe sur ton message.

  • # Github ou GitLab

    Posté par  . Évalué à -9.

    pour partager du code tu connais ?

  • # Verbosité

    Posté par  (site web personnel) . Évalué à 2.

    Merci pour ce portage en Java, et bravo pour l'effort.

    Le Java étant proche du C++, j'imagine que tu n'as pas trop rencontré de difficultés ? Si oui, lesquelles ?

    Dommage que ce ne soit pas plus orienté objet comme l'original, mais sinon pour un langage réputé comme "verbeux", tu t'en sors pas mal :-)

  • # I2BP

    Posté par  . Évalué à 5.

    J'ai des questions qui n'ont rien à voir avec TapTempo…

    Je viens d'aller voir sur un whois, tu as créé i2bp.com en 2004. Une petite recherche sur Google m'a rappelé que "l'affaire i2bp" datait de 2001. Le nom était tout simplement dispo ? Ça m'épate qu'il n'ai pas été récupéré par des professionnels du référencement/parking… ou alors la boite qui disait révolutionner la compression vidéo n'utilisait pas ce nom peut-être ?
    Si ils l'utilisaient, à quel point ça aide pour le référencement maintenant ?

    • [^] # Re: I2BP

      Posté par  . Évalué à 5.

      Oui, après le fiasco de i2bp le domaine a juste pas été renouvelé et est devenu disponible. J'en ai profité.

      Il y avait moins de requins sur l'Internet à l'époque. Du coup j'ai un chouette domaine avec une histoire et seulement 4 lettres. :-)

      • [^] # Re: I2BP

        Posté par  . Évalué à 3.

        Tu as déjà regardé combien de sites pointaient vers chez toi ? Je me demande ce qu'il reste des liens vers un site comme ça 17 ans après.

        (C'est possible avec la Google Search Console, mais faut un compte Google et quelques manips pour leur indiquer que tu es proprio du nom)

      • [^] # Re: I2BP

        Posté par  . Évalué à 4.

        J’ai été voir ce que c’était ib2p du coup et je suis tombé sur I2bp : bluff ou coup de génie ? : « Une jeune pousse, baptisée Web Fr et incubée à l'Atelier de l'innovation, prétend pouvoir transmettre des vidéos en qualité VHS sur un simple modem. Après enquête, la prouesse semble irréalisable et les fondateurs un tantinet mégalomanes… »

        Wow putain, c’est vieux de ouf !

        • [^] # Re: I2BP

          Posté par  . Évalué à 3.

          Aaaah, le début des années 2000 et la bulle dotcom. Tout une époque.
          On pouvait même dire sans trop mentir que java était interprété à l’epoque. Tu vois pas les trolls que ça ouvrait?

          Linuxfr, le portail francais du logiciel libre et du neo nazisme.

        • [^] # Re: I2BP

          Posté par  (site web personnel, Mastodon) . Évalué à 2.

          Je connaissais pas l'histoire non plus, et j'ai trouvé cet autre lien plus complet sur l'histoire complète.

          Le plus triste dans l'histoire, c'est que ces gars ont quand même pu lever des fortunes (pas autant qu'ils espéraient mais quand même beaucoup comparé au fait qu'y avait rien à montrer! 7 millions de francs pour le projet quand même, pas mal en 2000; puis le fondateur a revendu ses parts 3,2 millions de francs à la fin!) pendant des années, même si tout le monde — même à l'époque semblerait-il — s'accordait pour dire que c'était du pipeau. Enfin bon, c'est pas comme si c'est le seul exemple, y en a plein qui ont arnaqué des fortunes, mais tout de même ça m'attriste toujours de voir ce type d'histoire, et la seule chose qui en reste, c'est quelques articles que tout le monde va oublier.

          Film d'animation libre en CC by-sa/Art Libre, fait avec GIMP et autre logiciels libres: ZeMarmot [ http://film.zemarmot.net ]

Suivre le flux des commentaires

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