Forum Liberty Basic France

Jeux » Mots Croisés Langue au chat
Le 13/11/2015 à 12h41

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2501
Reprise du message précédent

Après tests et cogitations, la conclusion du B.E.M (Bureau 'Enquête et Mystères)
Quand la "for next" est longue (bien remplie) le bouton et le flag sont lus;
Exemple: Dans la boucle: [go] de la machine à dormir debout
Qui est incluse dans: Compose_3a.zip
Où le bouton "Stop" fonctionne très bien
Quand la boucle est courte (peu d'instruction à l'intérieur) plus rien n'est lu; ni boutons, ni clic souris, ni position souris. La "for next" est sourde et aveugle.
____________________
Roro

   
Le 13/11/2015 à 19h01

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Bein ça, c'est du programme^^^... Tu as du y passer un bon moment...

Pour ma part j'ai pas trouvé grand chose.

Éventuellement j'ai concocté un petit programme avec des boutons pour tester.
Tel qu'il est là, il prend en compte l'exit for... seulement lorsque la boucle est terminée.

Possible aussi que je n'ai pas compris le problème.

Tu peux faire quelque chose avec ça ?
Code VB :
 
'test exit for et bouton

    WindowWidth = 200
    WindowHeight = 270
 
    'pour tester l'exit : 0=pas d'exit, 1=exit for
    sto=0
 
    'boucle
    debut=0
    fin=10000
    tour$=""
 
    'prépa affichage fenêtre
    statictext #test,"Tour n°",25,10,50,30
    statictext #test,"Boucle",25,50,60,20
    statictext #test,"Début :",35,75,60,20
    statictext #test,"Fin :",35,95,60,20
 
    statictext #test.tr,tour$,75,10,120,50
 
    textbox #test.deb,95,70,50,20
    textbox #test.fin,95,90,50,20
 
    button #test.lancer, "Lancer la boucle", [lancer], UL, 15, 120, 170, 30
    button #test.stop, "Faire l'EXIT FOR", [stop], UL, 15, 160, 170, 30
    button #test.quitter, "Quitter", [quit], UL, 15, 200, 170, 30
 
    'affichage fenêtre
    open "Test EXIT FOR et boutons" for window as #test
 
    'taille d'affichage du tour actuel de la boucle
    print #test.tr,"!font arial 24"
 
    'affichage début et fin de la boucle
    print #test.deb,str$(debut)
    print #test.fin,str$(fin)
 
    wait
 
 
'fin du programme, au cas où...
end
 
 
'******** zone des sous-programmes ********
[lancer]
    print:print "on va lancer la boucle"
 
    'lecture du début et de la fin de la boucle
    print #test.deb,"!contents? deb$"
    print #test.fin,"!contents? fin$"
    deb=val(deb$)
    fin=val(fin$)
 
    'on lance la boucle
    for a=deb to fin
        print a
        print #test.tr,str$(a)
        if sto=1 then exit for
    next
 
    print "fin de boucle"
wait
 
 
[stop]
    print "sto passe à 1"
    sto=1
wait
 
 
[quit]
    print : print "On quitte..."
    close #test
    end
 
 
 
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 13/11/2015 à 22h30

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2501
Bah j'ai fait la même chose, sauf que j'y ai ajouté des "whenmouse..." des "whenbutton..."...des tests de position souris et quelqu''autres subtilités
Y a rien qui marche; rien de rien.
Et pourtant, j'ai des programmes qui utilisent un bouton "stop" (qui mets un flag à "1") avec un "if flag=1 then exit for" dans la boucle.
Et ça marche.
La seule différence que j'ai noté, c'est le contenu de la boucle (boucle bien pleine, ça marche; boucle pas assez pleine, ça marche pô)
Je soupçonne le concepteur du langage d'avoir utilisés des subterfuges pour gagner en vitesse d'exécution.
Il a juste oublié que le diable se cache dans les subterfuges
____________________
Roro

   
Le 14/11/2015 à 14h51

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
J'ai pas pu tester avec petit et grand contenu, Si ça fonctionne différemment à programme identique, il y a bien un bug quelque part. Et c'est pas une incompatibilité avec une autre instruction, puisque c'est la version courte qui ne marche pas (tu as enlevé une partie du code de la grande boucle pour obtenir la petite, ou c'est deux boucles différentes ?)

Pour mon prog d'essai, j'ai pigé un peu plus tard que mon "exit for" ne pourrait pas fonctionner : la variable de sortie devient 1 lorsqu'on clique sur le bouton, mais quand l'ordi exécute la boucle, il ne peut pas écouter les boutons. Pour cela il faut attendre la fin de la boucle et tomber sur l'instruction wait. Pour preuve, l'appui sur "quitter" n'est pris en compte qu'à la fin de la boucle.

Par contre, si on relance la boucle, sto est toujours 1, et la boucle s'arrête dès le premier tour, comme quoi l'"exit for" fonctionne ici

Mais comment écrire la boucle pour que le wait soit à l'intérieur ?

Je chercherais une autre solution pour contourner l'obstacle, AMHA
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 14/11/2015 à 15h01

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2501
Ah oui, bonne idée; je vais tester en enlevant des instructions d'une boucle qui fonctionne.
On en aura le coeur net

Edit: Aaaargh..! Les programmes où le stop marche ont une pause
Le bouton doit être lu pendant la pause
____________________
Roro

   
Le 14/11/2015 à 15h39

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2501
Youhou..! Le problème est résolu
Il suffit de mettre un gosub [pause] dans la boucle
avec une pause d'une seule milliseconde ça marche
Code VB :
 
     NOMAINWIN
    WindowWidth = 295
    WindowHeight = 290
    UpperLeftX = (DisplayWidth-WindowWidth)-200
    UpperLeftY = 20 ' (DisplayHeight-WindowHeight)
    TEXTBOX #w.testa, 30 , 30, 70, 25
    BUTTON #w.go, "Go !", [go], UL, 120, 30, 40, 20
    TEXTBOX #w.entr, 180, 30, 70, 25
    BUTTON #w.sto, "Stop !", [stop], UL, 20, 70, 40, 20
    TEXTBOX #w.dur, 100, 170, 90, 25
    GRAPHICBOX #w.m 5, 5, 280, 250
    OPEN "Test B" FOR window_nf AS #w
    #w, "TRAPCLOSE [closetest]"
    #w.m , "down"
    #w.m , "fill blue; color yellow; backcolor blue"
    #w.m, "place 180 70": #w.m, "\Entrer"
    #w.m, "place 170 90": #w.m, "\Borne compteur"
     #w.m, "place 90 210": #w.m, "\Entrer temps de pause"
     #w.entr, "10000": #w.dur, "200"
  wait
    [go]
      #w.dur, "!contents? dur$": dur=val(dur$)
      r=0
      #w.entr, "!contents? var$"
    for a=1 to val(var$)
        if sto=1 then sto=0: exit for
       #w.testa, str$(r)
       r=r+1
       gosub [pause]
    next a
  wait
  [stop]
    sto=1
  wait
  [pause]
    timer dur, [temps]
   wait
  [temps]
    timer 0
  return
  wait
  [closetest]
    CLOSE  #w
    END
 
____________________
Roro

   
Le 14/11/2015 à 16h05

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Alors là, j'ai fait un copié-collé de ton rajout dans mon prog, et scotché je suis...

Donc le temps de la pause, c'est comme si la boucle n'était pas en cours d’exécution (ou n'existait pas ? ), et l'état des boutons est à nouveau lisible ?

Un clic fait entre deux tours sera pris en compte quelle que soit la durée de la pause, puisque ce serait le fait de sortir momentanément de la boucle qui permette de lire l'état des boutons, et donc d'exécuter leur sous-programme ?

Points d'interrogation simplement de circonstance, car j'hypothèsise ;)

Je médite sur les débouchés.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 14/11/2015 à 17h57

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2501
Citation:
Je médite sur les débouchés.

Médite donc aussi sur quelque chose à coder.
Et d'inédit; tant qu'à faire....
Parce que si on compte sur la quarantaine de visiteurs journaliers pour donner des idées, je crois qu'on peut attendre longtemps
____________________
Roro

   
Le 14/11/2015 à 22h11

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Je ne sais pas, y'a du y avoir un bug dans l'exit for du puits à inspiration, car plus rien ne sort du pipeline.Zéro, nada, ketchi, null, nothing (at all) pas même un pet de souris colonisatrice de pipeline désaffecté.

Idée de programmation pour toi ou pour moi ?

Un générateur BF, qui produit des sons fondamentaux, avec leurs harmoniques paramétrables ? Il n'y a pas d'instructions pour jouer du son en JB/LB, mais rien n'empêche de créer un fichier wav qu'on charge ensuite pour écouter le résultat. En fait c'est plutôt pour continuer à apprendre le JB, c'est pas grave si c'est pas possible, du moment que l'organisation du truc est cohérente et que les routines soient fonctionnelles.

Enfin voilà, quoi... et les visiteurs visitent :lu
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 15/11/2015 à 10h58

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2501
Citation:
Un générateur BF,

Si tu veux te faire les griffes, jette un z'oeil sur ce qu'a fait un anglophone.
(Il faut attendre que toute l'onde soit générée pour entendre le son)
J'ai tenté de retrouver l'auteur chez JB english, mais l'outil de recherche est un peu olé olé.
Prévois de l'aspirine, c'est pas de la rigolade
Code VB :
 
 nomainwin
    WindowWidth=500
    WindowHeight=400
    UpperLeftX=INT((DisplayWidth-WindowWidth)/2)
    UpperLeftY=INT((DisplayHeight-WindowHeight)/2)
    freq1=261           'middle C
    freq2=freq1*1.25992'1.25    'major third
    freq3=freq1*1.49831'1.50    'fifth
    freq4=freq1*1.68179'1.6667  'major sixth
    pi=3.14159265
    omega1=2*pi*freq1
    omega2=2*pi*freq2
    omega3=2*pi*freq3
    omega4=2*pi*freq4
    amp=.75   'a number between 0 and 1
    delta=1/11025
    offset=127
    open "wave" for graphics_nf_nsb as #g ' _fs_nsb as #g
    #g "down ; trapclose [QUIT]"
    for t = 0 to .5 step delta
        sample=amp/2*sin(omega1*t)    'freq1
        x=DisplayWidth*t
        y=sample*offset
        print sample, y+offset
        data$=data$;chr$(int(y+offset))
        '#g "goto ";x;" ";y+offset
    next t
    for t = 0 to .5 step delta
        sample=amp/4*sin(omega1*t)+amp/3*sin(omega2*t)  '1 and 2
        x=DisplayWidth*t
        y=sample*offset
        print sample, y+offset
        data$=data$;chr$(int(y+offset))
        '#g "goto ";x;" ";y+offset
    next t
    for t = 0 to .5 step delta
        sample=amp/4*sin(omega1*t)+amp/4*sin(omega2*t)+amp/3*sin(omega3*t)  '1, 2 and 3
        x=DisplayWidth*t
        y=sample*offset
        print sample, y+offset
        data$=data$;chr$(int(y+offset))
        '#g "goto ";x;" ";y+offset
    next t
    #g "fill white"
    #g "color blue ; place 0 ";yOffset+1;" ; goto ";DisplayWidth;" ";yOffset+1
    #g "color red ; place 0 ";yOffset+127;" ; goto ";DisplayWidth;" ";yOffset+127
    #g "color blue ; place 0 ";yOffset+255;" ; goto ";DisplayWidth;" ";yOffset+255
    #g "color black ; place 0 ";127+yOffset
    flag=0
    for t = 0 to 2 step delta
        if (t>.125  and t<.750) then
            sample=amp/4*sin(omega1*t)+amp/4*sin(omega2*t)+amp/4*sin(omega3*t)+amp/4*sin(omega4*t+t)  'all
        else
            sample=amp/4*sin(omega1*t)+amp/4*sin(omega2*t)+amp/4*sin(omega3*t)  '1, 2 and 3
        end if
        x=DisplayWidth*t
        y=sample*offset
        print sample, y+offset
        data$=data$;chr$(int(y+offset))
        #g "goto ";x;" ";y+offset
    next t
    ChunkID$="RIFF"
    ChunkSize$=makeAsciiNumber$(36+255,4)
    Format$="WAVE"
    SubChunk1ID$="fmt "
    SubChunk1Size$=makeAsciiNumber$(16,4)
    AudioFormat$=makeAsciiNumber$(1,2)
    NumChannels$=makeAsciiNumber$(1,2)
    SampleRate$=makeAsciiNumber$(11025,4)
    ByteRate$=makeAsciiNumber$(11025,4)
    BlockAlign$=makeAsciiNumber$(1,2)
    BitsPerSample$=makeAsciiNumber$(8,2)
    SubChunk2ID$="data"
    SubChunk2Size$=makeAsciiNumber$(len(data$),4)
    wave$=ChunkID$;ChunkSize$;Format$;SubChunk1ID$;SubChunk1Size$;AudioFormat$;NumChannels$;SampleRate$;ByteRate$;BlockAlign$;BitsPerSample$;SubChunk2ID$;SubChunk2Size$
    wave$=wave$;data$
    ChunkID$=mid$(wave$,1,4)    : print "ChunkID$:";ChunkID$ 'should be "RIFF"
    ChunkSize$=mid$(wave$,5,4)
    ChunkSize=bigAsciiNumber(ChunkSize$) : print "ChunkSize$:"; ChunkSize$,"ChunkSize:";ChunkSize,"File length:";len(wave$)
    Format$=mid$(wave$,9,4) : print "Format$:";Format$  'should be "WAVE"
    SubChunk1ID$=mid$(wave$,13,4) : print "SubChunk1ID$:";SubChunk1ID$ 'should be "fmt "
    SubChunk1Size$=mid$(wave$,17,4)
    SubChunk1Size=bigAsciiNumber(SubChunk1Size$) : print "SubChunk1Size$:";SubChunk1Size$,"SubChunk1Size:";SubChunk1Size
    AudioFormat$=mid$(wave$,21,2)
    AudioFormat=bigAsciiNumber(AudioFormat$) : print "AudioFormat$:";AudioFormat$,"AudioFormat:";AudioFormat
    NumChannels$=mid$(wave$,23,2)
    NumChannels=bigAsciiNumber(NumChannels$) : print "NumChannels$:";NumChannels$,"NumChannels:";NumChannels
    SampleRate$=mid$(wave$,25,4)
    SampleRate=bigAsciiNumber(SampleRate$) : print "SampleRate$:";SampleRate$,"SampleRate:";SampleRate
    ByteRate$=mid$(wave$,29,4)
    ByteRate=bigAsciiNumber(ByteRate$) : print "ByteRate$:";ByteRate$,"ByteRate:";ByteRate
    BlockAlign$=mid$(wave$,33,2)
    BlockAlign=bigAsciiNumber(BlockAlign$) : print "BlockAlign$:";BlockAlign$,"BlockAlign:";BlockAlign
    BitsPerSample$=mid$(wave$,35,2)
    BitsPerSample=bigAsciiNumber(BitsPerSample$) : print "BitsPerSample$:";BitsPerSample$,"BitsPerSample:";BitsPerSample
    'data
    SubChunk2ID$=mid$(wave$,37,4) : print "SubChunkID$:";SubChunkID$ 'should be "data"
    SubChunk2Size$=mid$(wave$,41,4)
    SubChunk2Size=bigAsciiNumber(SubChunk2Size$) : print "SubChunk2Size$:";SubChunk2Size$,"SubChunk2Size:";SubChunk2Size
   open "newwave2.wav" for output as #out
    #out wave$
    close #out
    playwave "newwave2.wav"
    kill  "newwave2.wav"
    wait
    [QUIT]
    close #g
    end
    function makeAsciiNumber$(number,length)
        multiplier=256^(length-1)
        for i = length to 1 step -1
            multiplier=256^(i-1) : if multiplier=0 then multiplier=1
            asc=int(number/multiplier)
            number=number-asc*multiplier
            str$=chr$(asc);str$
            'print asc,chr$(asc),asc*multiplier,multiplier,number,,str$
        next i
        makeAsciiNumber$=str$
    end function
    function bigAsciiNumber(str$)
        multiplier=1
        for i = 1 to 4
            token$=mid$(str$,i,1)
            'print token$,asc(token$),asc(token$)*multiplier,multiplier
            num=num+asc(token$)*multiplier
            multiplier=multiplier*256
        next i
        bigAsciiNumber=num
    end function
 
 
____________________
Roro

   
Le 16/11/2015 à 16h42

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Faut pas se laisser impressionner, c'est simplement le code qui est très ramassé ;)

Par contre plus je l'étudie, plus je suis perplexe sur son calcul des échantillons. T'en pense quoi, toi ?
(dans les commentaires, il y a aussi des hypothèses, je dis pas que j'ai bon)

Code VB :
 
    'CODE INCOMPLET, on peut le lancer quand même.
  nomainwin
 
    'Dimensions et centrage de la future fenêtre qui accuiellera la forme d'onde
    WindowWidth=500
    WindowHeight=400
    UpperLeftX=INT((DisplayWidth-WindowWidth)/2)
    UpperLeftY=INT((DisplayHeight-WindowHeight)/2)
 
    'fréquences Do, Mi, Sol, La (me suis contenté de regarder dans un tableau)
    freq1=261           'middle C
    freq2=freq1*1.25992'1.25    'major third
    freq3=freq1*1.49831'1.50    'fifth
    freq4=freq1*1.68179'1.6667  'major sixth

    'calcul pulsations, utiles pour la création de la sinusoide sur le graphique
    'et les échantillons à mettre dans le fichier wav
    pi=3.14159265
    omega1=2*pi*freq1
    omega2=2*pi*freq2
    omega3=2*pi*freq3
    omega4=2*pi*freq4
 
    'probablement l'amplification, 1 = valeur max
    amp=.75   'a number between 0 and 1

    'intervalle de temps entre deux échantillons
    delta=1/11025
 
    'décalage (un échantillon est codé sur 256  valeurs contenues dans un octet., on se place au milieu
    'pour avoir les parties positives et négatives de la sinusoide)
    offset=127
 
    'on ouvre la fenêtre graphique (facile, celle-là^^)
    open "wave" for graphics_nf_nsb as #g ' _fs_nsb as #g

    'là, je pige pas : on va au programme de fermeture lorsqu'on veut dessiner la courbe ???
    #g "down ; trapclose [QUIT]"    'équivalent d'un "print #g"

    'fréquence 1 calculée pour affichage de la sinusoide
    'et insertion des échantillons dans la chaîne data$
    for t = 0 to .5 step delta 'pour une demi-seconde au pas de 1/11025è de sec

        'calcul de l'échantillon
        sample=amp/2*sin(omega1*t)  ' 0.75/2 * par un truc qui varie de -1 à 1, donc la valeur
                                    ' de l'échantillon est comprise entre -0.375 et +0.375

        x=DisplayWidth*t    'varie de 0 à la moitié de la largeur d'écran (puisque for t=0 à 0.5)
                                            'à quoi sert x ?

        y=sample*offset     'valeur de l'échantillon multipliée par le décalage ???
                            '-47.625 < y < +47.625

        'écrit la valeur de sample, y+offset, sur la mainwin, y'a le temps d'aller boire un café.
        '(normalement inactif, puisqu'il y a l'instrution NOMAINWIN en début de prog.)
        print sample, y+offset  'autrement dit : sample*offset+offset...
                                '79,375 < y+offset < 174.625

        'stockage des échantillons
        data$=data$;chr$(int(y+offset)) 'à chaque tour, data$ s'enrichit d'un caractère
                                        'correspondant à la partie entière de y+offset
                                        'l'échantillon est donc codé par un octet allant de
                                        'chr$(79) à chr$(174)

        'initialement, en commentaire :
        '#g "goto ";x;" ";y+offset

    next t
 
'ARRET ICI
close #g
end
 
 


Je n'ai pas été plus loin pour le moment. Je n'ai pas demandé l'avis de l'auteur, mais c'est du décorticage de code pour apprendre, en aucun cas une critique.

(édité pour rectifier une grossière erreur : un OCTET contient 8 bits et peut prendre 256 valeurs. Dans le prog, la donnée est codée sur 256 valeurs, et non 256 octets)



Edité par Christophe Le 17/11/2015 à 17h15
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 16/11/2015 à 20h01

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2501
Hey, pas mal l'analyse.
"#g "down ; trapclose [QUIT]"
Le: "down" est obligatoire pour afficher en mode graphique (abbaisse le crayon)
Le: "trapclose [QUIT]" présent dans tout les programmes gère la croix de fermeture de la fenêtre.

"print sample, y+offset" : J'ai un doute pour l'affichage en mainwin, il devrait pas y avoir un point virgule et non une virgule ?
Ce que j'en pense ? Que c'est pas demain que j'y pomperai quelque chose. :p :| :( :s
J'ai attaqué sous un autre angle, j'ai ouvert le fichier généré dans un éditeur pour voir s'il y avait moyen de le découper.
J'ai vite lâché prise

Edit, tu a été un peu trop vaillant au sécateur le truc s'ouvre mais ne marche pas.
J'avais commencé de l'élaguer aussi, j'en ai plusieurs versions plus ou moins déplumées qui fonctionnent
____________________
Roro

   
Le 16/11/2015 à 21h49

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Possible que j'ai remodifié le programme après l'avoir posté, pour qu'il se ferme normalement. Le "close #g:end" n'est pas suffisant ?

Roland:

Le: "down" est obligatoire pour afficher en mode graphique (abaisse le crayon)
Le: "trapclose [QUIT]" présent dans tout les programmes gère la croix de fermeture de la fenêtre.


Oui, mais les deux dans la même commande, je n'ai toujours pas capté la finalité

Pour le "print sample, y+offset" ça se comporte comme dans un print using, J'ai testé en mettant le nomainwin en commentaire : la virgule se comporte comme un tab, alors que le point-virgule empêche simplement d'aller à la ligne pour afficher la donnée d'après. (au fait, avec la mainwin, c'est long, long, long, une demi-seconde de données audio...).

Les fichiers audio sont pour moi une vieille connaissance : j'ai voulu un jour (avec Qbasic ou JustBasic ?) extraire les données de l’en-tête (la trentaine de ligne qui commence dans le programme par
ChunkID$="RIFF"
ChunkSize$=makeAsciiNumber$(36+255,4)
Format$="WAVE"
SubChunk1ID$="fmt "
....
mais je n'ai jamais cherché à lire les données audio proprement dites, ce qui fait que je ne peux pas affirmer que sa méthode est bonne ou pas.

Elle me semble surprenante. A confirmer, mais dans le programme, du moins pour ce que j'ai analysé, il y a un octet par échantillon, donc 256 valeurs. S'il veut 75% du niveau total disponible, ça représente 3/4 de 256, soit 186 valeurs. Si on place le point milieu à la valeur 127, la limite basse de l'échantillon est à 127-186/2=31, et la limite haute est à 127+186/2=223, donc j'encadre son y comme ça : 31 > y > 223, là où il l'encadre 79 > y > 174.

Il obtient bien sa sinusoïde à la bonne fréquence, mais avec un niveau qui n'est pas le 0.75 qu'il a défini pour son paramètre amp

Désolé pour la technique. :( :top :)

Je pense simplement qu'il a programmé ça à la va-vite, pour voir si c'était faisable, et qu'il ne s'est pas préoccupé d'aller plus loin, parce que ça semblait fonctionner.

Je vais quand même explorer plus loin, quand j'aurais deux minutes... si je fais un géné BF, il me faut savoir comment créer un wav 8-)
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 16/11/2015 à 22h15

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2501
Citation:
#g:end" n'est pas suffisant

Il faut le "Close#..."
Citation:
les deux dans la même commande

On peut enchainer les instructions en les séparant par des point virgules et en enfermant le tout dans les guillements
ça fait gagner des lignes

Pour exploiter le truc, il faudrait l'épurer jusqu'à obtenir la sinusoïde pure; parce si j'ai compris, il en mélange plusieurs, ça ne facilite pas la compréhension.
Citation:
Une demi seconde d'audio c'est long

J'avais récupéré des samples d'une seconde en wav pour faire "compose" ils faisaient 6,5 Mo la pièce!
cassiope les avaient réduit à 250 Ko sans détérioration; en fait ils étaient plein de vide.
Le wav, ça pèse; c'est pour ça qu'on a inventé le midi.
Citation:
créer un wav 8

N'oublie pas d'y mettre la procédure magique de stop; ou y a du redémarrage de pc à prévoir. Lol!
Le mieux serait d'en faire un petit bout et de le lire en boucle

Mais en fait ce code est une arnaque; il ne crée pas du son, il crée un fichier son. Nuannnnce.
____________________
Roro

   
Le 17/11/2015 à 18h01

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
C'est même une machination, y'a qu'à voir les cartes graphiques et le cinéma : que du décor, rien derrière. Voleurs ! :lol

MIDI ne transporte pas d'audio, mais juste des instructions pour jouer de l'audio, le rendu sonore peut être différent d'une machine à une autre, en fonction des banques d'instruments dont elle dispose. Là je parle "vite", parce que je n'en sais pas plus...

Je crois bien qu'on a été un peu endormi : bévues et boulettes
  • Dans le listing j'avais écrit qu'un échantillon sonore était codé sur 256 octets, alors que cet échantillon est seulement UN octet, qui peut prendre 256 valeurs. Sorry, c'est rectifié
  • Je viens enfin de comprendre que #g "down ; trapclose [QUIT]", avec le point-virgule comme séparateur, se comportait comme deux commandes distinctes # "down", et #"trapclose [QUIT] et complètement indépendantes. J'aurais mis le temps, merci Roland d'avoir insisté.
  • si si, il y a bien le "close#" dans le code fourni, tu as surement fait une manip qui l'a fait sauter. Par contre la fenêtre ne sert à rien : il n'y a aucun affichage graphique durant ce bout de programme. En fait il y en a, mais en commentaire, et je ne l'ai pas testé


Pour ma part, si j'avais fait le programme, j'aurais fait la somme des quatre générateurs pour obtenir la forme d'onde, et c'est seulement avec la forme finale que j'aurais créé le wav échantillon par échantillon. Je ne vois pas où l'auteur veut en venir avec sa manière de combiner les fréquences au fur et à mesure. Je n'ai pas encore assez étudié son listing, Il a sûrement une bonne raison d'avoir procédé comme il l'a fait.

Je termine l'étude et je tiens au courant ici (on a bien dérivé du sujet initial, mais le thème de la dérive touche à sa fin), Si je me lance dans "mon" générateur BF il fera l'objet d'une conversation dédiée.

(et déjà 18h00, purée !)



Edité par Christophe Le 17/11/2015 à 18h01
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 17/11/2015 à 21h24

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2501
D'après moi, et à entendre le son obtenu, il a dû mettre une incrémentation au déphasage.
C'est sûr que ce code est expérimental
Je continue de rechercher l'auteur sur le forum anglophone, qui est encore plus bordélique que celui-ci ; et qui de plus est en anglais.
T'inquiète pour la dérive, on peut déplacer les messages, mais comme je trouve que la dérive, c'est plutôt sympa, je laisse comme ça.
____________________
Roro

   
Le 18/11/2015 à 00h53

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Oui, code expérimental.

Autrement, on avance :

1. playwave ne mache pas avec wine. Possible que ce soit simplement un paramétrage dans Wine sur le pilote audio à utiliser

2. trois secondes et demi pendant lesquelles on entend (en millisecondes) :

0 à 500 : Do
500 à 1000 : Do Mi
1000 à 1625 : Do Mi Sol
1625 à 2250 : Do Mi Sol La
2250 à 3500 : Do Mi Sol

Bonne nuit
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 18/11/2015 à 01h47

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2501
Ah ouais, tu a l'air de drôlement maîtriser l'audio pour avoir différencié les rondelles.
J'envisage un générateur de musique avec les règles de composition, mais c'est un sacré morceau (pour quelqu'un qui balbutie le solfège comme moi)
Je pompe les idées sur deux softs russes que j'ai.
Mais cette fois, je ne tape pas une ligne de code tant que tout n'est pas clair
Enfin...Je vais essayer de me retenir.
____________________
Roro

   
Le 18/11/2015 à 15h13

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Tu dormais pas encore, à ç'teurlà, toi ?

J'aurais été très heureux de trouver les notes "à l'oreille", mais il s'agit plus prosaïquement du résultat de l'étude du code^^. Il reste encore à analyser la construction de l'en-tête et sa mise en fichier, suivie des données audio. Je l'ai trouvé plus simple à étudier que le code d'un certain Cassiopee au sujet de combo-sprite-box volantes.

Autrement j'ai des notions sur beaucoup de choses, dont la musique et l'audio, mais ça reste des notions.

Pour un projet de programmation, on dit qu'en effet c'est 80% de réflexion et 20% de codage. Un schéma papier abouti de ce qu'on veut faire, et une bonne culture dans le domaine qu'on veut reproduire, sont un plus. Oui, je sais, ça me va bien d'écrire ça, moi qui ai si longtemps foncé tête baissée sur le clavier^^ Mais c'est peut-être justement pour ça...
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 18/11/2015 à 16h17

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2501
Citation:
plus simple à étudier que le code d'un certain Cassiopee

Je t'avais prévenu, ce gars là est un sorcier du JB; qui soit dit en passant nous a abandonnés pour de bon (pas venu depuis le: 25/09/15). Grosse perte. Snif! Espérons qu'il ne lui est rien arrivé de fâcheux. Amen!
La génération audio par le code est intéressante car elle ouvre la voie à la compo mathématique.
Tiens, en parlant de ça, comme tu t'intéresse à l'audio, je mets dans mon casier un petit soft de ouf que tu peux garder pour quand tu sera à la retraite. Y a rien à installer. Pour avoir une idée de l'ampleur du phénomène; tu lance, tu ferme toutes les petites fenêtres, et là, tu vois qu'il y a vraiment des fous.
C'est là --->: Autogam.zip
Prévois du café, y a de la nuit blanche en perspective. :lol
____________________
Roro

   
Le 18/11/2015 à 21h21

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Pas de bol, il demande VB60.dll, et le prog est sous la forme exe. (Ou VBrun60, cité de mémoire, je n'ai plus le nom exact en tête). Je l'ai téléchargé et mis dans le system32 de mon wine windows xp, mais pas de changement. Je verrais plus tard.

Par contre j'ai lu la présentation, cela semble en effet plutôt sophistiqué. Je ne pense pas aller jusque là avec mon "générateur BF". Mais bon, si ça marche, y'aura peut-être de quoi se faire plaisir...

Pas de travail d'analyse cet après-midi.

Le bonjour à Cassiopee, s'il nous lit. Je ne le connais pas, mais combien sont-ils dans la vraie vie à se connaître sur un forum ? Il est parti fâché, ou il ne vient simplement plus ?

A+
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Jeux » Mots Croisés Langue au chat  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie