IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Pascal Discussion :

Correspondance arithmétique entre html et Pascal


Sujet :

Langage Pascal

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut Correspondance arithmétique entre html et Pascal
    Bonsoir,

    dans une page web je trouve un calculateur de BPM dont la ligne principale s'écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bpmAvg = 60000 * count / (msecs - msecsFirst);
    et la même ligne écrite dans un programme en Lazarus / FreePascal doit ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bpmAvg := 6 * 0.0001 * count / (msecs - msecsFirst);
    pour afficher les mêmes valeurs.
    count c'est le nombre de fois qu'on appuie sur la barre Espace en rythme tout en écoutant la musique.

    Quelqu'un pourra m'expliquer ce mystère ?

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 885
    Points : 11 401
    Points
    11 401
    Billets dans le blog
    6
    Par défaut
    Salut,
    Si le programme Pascal mesure bien des millisecondes, il ne saurait afficher la bonne valeur en bpm avec ce calcul !
    Comment la durée est-elle mesurée ?

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Bonjour Yves,

    et merci de me rejoindre dans cette galère, allez, ramons ensemble :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    procedure TForm1.Count;
    begin
      if not running then exit;
     
      msecs := Now;
      if beatcount = 0 then begin
        Form1.Caption := 'First Beat';
        msecsFirst := msecs;
        beatcount := 1;
      end else begin
        // rien à voir avec le html...  6 * 0.0001
        // après beaucoup d'essais hier soir, il semblerait que cette valeur soit 
        // plus proche de la vérité :
        bpmAvg := 0.0008 * beatcount / (msecs - msecsFirst); // EDIT : mieux avec 0.0008
        bpmWhole := round(bpmAvg);
        inc(beatcount);
        Form1.Caption := FloatToStr(bpmWhole);
      end;
    end;
    Ce code est appelé à chaque fois qu'on appuie sur la barre d'espace en rythme avec la musique, beatcount étant mis à 0 au start du comptage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      case key of
        27: Close;
        32: Count;  // space
        67: Clear;  // c
        83: Start;  // s
        84: sTop;   // t
      end;
      key := 0;
    end;
    Et si ces choses t'intéressent et que tu connais Python, tu peux aussi regarder cette page où tu pourras télécharger un tar.gz qui contient un script.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 434
    Points : 1 133
    Points
    1 133
    Par défaut
    Bonjour,

    Là pour autant que je voie correctement le programme pascal utilise now (soit un TDateTime en fait un flottant où l'unité est le jour (86400 secondes)
    A TDateTime value is encoded a double-precision floating point value. It is encoded
    in accordance with the Microsoft Excel specification, also used in the Variant type of Mi-
    crosoft’s VB and COM technologies:
    • The integer part (the part in front of the decimal point) of this floating point value
    contains the number of elapsed days since 30 Dec 1899
    • The fractional part contains the number of elapsed milliseconds since the start of the
    day, divided by the total number of milliseconds in a day.
    Alors que le site web utilise la fonction gettime de javascript:
    Date.prototype.getTime()

    La méthode getTime() renvoie la valeur numérique correspondant au temps pour la date renseignée, d'après le temps universel (c'est-à-dire relative à UTC, une mesure donnée par getTime() sera indépendante du fuseau horaire sur lequel on se trouve). Cette valeur numérique est le nombre de millisecondes écoulées depuis le premier janvier 1970 à minuit UTC.
    Donc pour être correcte la valeur devrait être 0.000011574074074074074074074074074074

    Comme toujours si je ne me suis pas trompé quelque part

    Cordialement

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Citation Envoyé par acaumes Voir le message
    un flottant où l'unité est le jour (86400 secondes)
    Merci pour cette précision que j'ignorais.

    Sinon, il est bizarre ton résultat, alors je l'ai utilisé très raccourci ainsi, dans ces 3 exemples (bien sûr, un à la fois, je n'ai pas mis les "//" pour alléger et rendre plus agréables la lecture et les comparaisons.
    La 1re ligne c'est mon essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          bpmAvg := 0.0008   * beatcount / (msecs - msecsFirst); // --> ~60
          bpmAvg := 0.000011 * beatcount / (msecs - msecsFirst); // --> ~1
          bpmAvg := 0.00011  * beatcount / (msecs - msecsFirst); // --> ~10
          bpmAvg := 0.0011   * beatcount / (msecs - msecsFirst); // --> ~88
    et comme je prononce le mot mississipi tout en appuyant à chaque fois sur espace, ce qui correspond peu ou prou à 1 seconde, le 1er résultat me va bien,

    Et si j'utilise 0.00086400, je gagne des ~63...70, c'est un poil trop.
    Maintenant, ce n'est pas critique, dans la mesure où il s'agit in fine de classer des chansons en fonction de leurs tempos respectifs. Mais bon, autant faire juste, non ?

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 885
    Points : 11 401
    Points
    11 401
    Billets dans le blog
    6
    Par défaut
    La durée mesurée par la différence de ces TDateTime très mal nommés l'est donc en jours.
    On a donc bpmAvg = beatcount / (dt2 - dt1) en coups par jour.
    Pour obtenir le résultat par minute, il convient donc à mon sens de diviser le résultat par 24 heures de 60 minutes, soit le multiplier par 6,94e-4 ; disons 0.000694 plutôt que 0.0008...

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    disons 0.000694 plutôt que 0.0008...
    J'ai lancé le bazar en surveillant la trotteuse d'une horloge pour appuyer sur ESPACE à chaque pas et au bout de 30 secondes le compteur affichait 60.


    ,

    Et pour les curieux, une fiche avec KeyPreview à True, un TTimer nommé chrono et un TStatusBar (name: stb) et ces quelques lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
      private
        running: boolean;
        starttime, duration: TTime;
        msecs, msecsFirst: TTime;
        bpmAvg, bpmWhole: double;
        beatcount: integer;
        bpm: double;
        Bob: boolean;
        procedure Count;
        procedure Clear;
        procedure Start;
        procedure Stop;
      public
     
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      case key of
        27: Close;
        32: Count;  // space
        67: Clear;  // c
        83: Start;  // s
        84: sTop;   // t
      end;
      key := 0;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      running := False;
      Bob := False;//True;
      if Bob then
        stb.SimpleText:='Beats Per Minute (c) Bob van der Poel'
      else
        stb.SimpleText:='Beats Per Minute (c) Rich Reel';
    end;
     
    procedure TForm1.chronoTimer(Sender: TObject);
    begin
      if not running then exit; // sécurité
     
      if Bob then begin
        duration := Now - starttime;
        //bpm := round(60.0/duration) * beatcount;
        bpm := round(69.4/duration) * beatcount; // sans doute mieux avec la valeur d'Yves
        Form1.Caption := FloatToStr(round(bpm / 100000));
      end;
    end;
     
    procedure TForm1.Count;
    begin
      if not running then exit;
     
      if Bob then begin
        inc(beatcount);
      end else begin
        msecs := Now;
        if beatcount = 0 then begin
          Form1.Caption := 'First Beat';
          msecsFirst := msecs;
          beatcount := 1;
        end else begin
          bpmAvg := 0.000694 * beatcount / (msecs - msecsFirst); // --> ~60
          bpmWhole := round(bpmAvg);
          inc(beatcount);
          Form1.Caption := FloatToStr(bpmWhole);
        end;
      end;
    end;
     
    procedure TForm1.Clear;
    begin
      if running then exit;
      beatcount := 0;
      Caption := IntToStr(beatcount);
    end;
     
    procedure TForm1.Start;
    begin
      if not running then running := True else exit;
      Self.Color := clLime;
      Clear;
      if Bob then begin
        starttime := Now;
        chrono.Enabled := True;
      end;
    end;
     
    procedure TForm1.Stop;
    begin
      if running then running := False;
      if Bob then chrono.Enabled:=False;
      Self.Color:=clDefault;
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. correspondance entre html et jsf
    Par anisj1m dans le forum JSF
    Réponses: 8
    Dernier message: 02/11/2007, 10h08
  2. Problème marge entre html et php
    Par dom59111 dans le forum Langage
    Réponses: 3
    Dernier message: 29/10/2007, 10h27
  3. Switch entre html:radio
    Par maxf1 dans le forum Struts 1
    Réponses: 15
    Dernier message: 09/01/2007, 15h37
  4. [XHTML/HTML] Difference entre HTML et XHTML?
    Par celine_tr dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 07/09/2006, 21h34
  5. [LG]Transmission de données entre C et pascal
    Par jer_the_one dans le forum Langage
    Réponses: 16
    Dernier message: 26/05/2004, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo