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

Free Pascal Discussion :

Production d'un fichier MIDI à partir d'une chaîne de caractères façon QBasic [Free Pascal]


Sujet :

Free Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut Production d'un fichier MIDI à partir d'une chaîne de caractères façon QBasic
    Bonjour !

    J'avais trouvé sur le forum freebasic.net un programme amusant, qui produit un fichier MIDI à partir d'une chaîne de caractères suivant la syntaxe de la commande PLAY de QBasic.

    J'ai essayé de traduire le code en Pascal, et pour le moment je n'y suis pas arrivé. Je poste mon code au cas où quelqu'un verrait l'erreur avant moi.

    Le fichier sarabande.mid est produit par le programme en Basic ; le fichier sarabande1.mid est produit mon programme en Pascal. Si vous l'écoutez, ça donne quelque chose d'amusant : on dirait de la musique "contemporaine". Il faudrait que j'essaie de l'envoyer à France-Musique...

    La transcription de la sarabande de Bach est l'œuvre de votre serviteur. J'espère que vous apprécierez le raffinement de la chose.
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Hello !

    Ca fait un peu requiem, ta version
    C'est pas une question de tempo à régler ? On dirait que le tien est 5 fois plus "lent" que l'original.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par M.Dlb Voir le message
    Ca fait un peu requiem, ta version
    C'est pas une question de tempo à régler ? On dirait que le tien est 5 fois plus "lent" que l'original.
    Hélas, je crois qu'il n'y a pas seulement une différence de tempo : ça n'a carrément plus rien à voir.

    Bon, je vais comparer encore une fois le code original avec ma traduction. Mais je vais utiliser une chaîne plus courte. (Je ne sais pas pourquoi je n'ai pas eu cette idée plus tôt.)
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Bonne nouvelle. Avec une chaîne de départ plus courte (CDE), les deux fichiers produits sont identiques.

    Code VisualBasic : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include "play2mid.bas"
     
    midiFileName = "test1bas.mid"
    Play("CDE")

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    00000000: 4d54 6864 0000 0006 0000 0001 0078 4d54  MThd.........xMT
    00000010: 726b 0000 0014 0090 307f 7880 3000 0090  rk......0.x.0...
    00000020: 327f 7880 3200 00ff 2f00                 2.x.2.../.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    uses
      SysUtils, Play2Mid;
     
    begin
      midiFileName := 'test1pas.mid';
      Play('CDE');
    end.
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    00000000: 4d54 6864 0000 0006 0000 0001 0078 4d54  MThd.........xMT
    00000010: 726b 0000 0014 0090 307f 7880 3000 0090  rk......0.x.0...
    00000020: 327f 7880 3200 00ff 2f00                 2.x.2.../.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    J'ai trouvé et corrigé une erreur. Il ne reste plus qu'une différence entre mes deux sarabandes : un "%" au lieu d'un "&". Mais je n'arrive pas à voir quelle est la partie du code qui génère ces caractères.

    Bizarrement, à l'écoute, les deux fichiers semblent identiques.
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Si quelqu'un comprend à quoi sert cette fonction, je suis preneur d'une explication.

    Code VisualBasic : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function WriteVarLen(Value as integer) as string
      dim a as string
      a = chr(Value and 127)
      do while (Value > 127)
        Value = Value shr 7
        a = chr((Value and 127) or 128) + a
      loop
      return a
    end function

    Je pense l'avoir traduite comme il faut, mais sans en comprendre du tout la logique.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    J'ai trouvé la dernière erreur. Il fallait utiliser Round et non pas Trunc. En pièce jointe la version corrigée.
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/09/2015, 13h16
  2. Réponses: 0
    Dernier message: 26/05/2009, 15h08
  3. importer module à partir d'une chaîne de caractères
    Par j_p_g dans le forum Général Python
    Réponses: 2
    Dernier message: 23/04/2007, 15h15
  4. Réponses: 21
    Dernier message: 22/06/2006, 21h11
  5. Réponses: 8
    Dernier message: 16/06/2006, 01h06

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