Forum Liberty Basic France

Général » Préambule au Générateur BF Choses venues d'ailleurs
Le 20/12/2015 à 12h14

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Ici sont rassemblés les messages extraits d'une discussion dans laquelle ils n'avaient rien à faire
Il peut y avoir des "trous" dans le suivi, car j'ai virés des messages sans importance

Pour Chris: Y a pas moyen de déplacer les trucs séparément; c'est tout le fil qui est déplacé
J'ai donc fait des copiés collés des messages venus de là où tu sais, et les ai mis ici
J'ai viré le reste (sans importance) en espérant ne pas avoir trop massacré.
Et j'ai renommé l'autre fi 'Générateur BF"
Mais je m'aperçois après coup que maintenant, dans ce fil, tous les messages sont à mon nom
Si tu a le temps, il faut que tu fasse un copié collé des tiens et que tu le reposte en dessous du miens-tiens
Et je supprimerai les miens-tiens
J'en ai compté 7; Comme tu ne peux pas modifier mes messages, il faudra que tu remette les balises pour que les codes soient dans les conteneurs (si tu n'a pas le temps, copie tel quel, je remettrai les balises)

Pfiouuuu !!! Pas facile de ranger dans cette baraque
____________________
Roro

   
Le 20/12/2015 à 15h58

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Je ne sais que dire... (quelque part ça vient à point nommé : j'avais dans l'idée de générer une fondamentale, et une série d'harmoniques dont le volume serait réglé par un clic sur le potar, si tu vois où je veux en venir^^)

En attendant je me suis inspiré de ton dernier instrument. il est moins perfectionné que le tien, puisqu'il ne détecte que le clic gauche, et qu'il ne suit pas la souris quand on reste avec le clic gauche enfoncé.


Sinon, j'ai pas encore résolu mon problème de multiple, et c'est nécessaire : si on veut qu'il n'y ait pas une sinusoïde tronquée, donc un "top" incongru à l'écoute (ou une scie) il faut s'arranger pour numériser une période multiple de la fréquence générée et de la fréquence d'échantillonnage, je crois pas qu'on puisse y échapper.

Cependant le prochain post sera dans un nouveau fil nommé "comment faire un géné BF" ou quelque chose du genre, le problème n'est pas insurmontable...


Un sage conseil, en terme de projet, est de n'inclure qu'une nouveauté à la fois. J'en ai inclus deux supplémentaires : des boutons radio et une jauge graphique... pssst, pas sérieux ;)

Code VB :
 
 
 
 
 
 
'initialisations
    F1=440      'fréquences générateur disponibles, Herz
    F2=1000
    F3=2800
 
    Ech1=11025  'fréquences d'échantillonnage disponibles
    Ech2=22050
    Ech3=44100
 
    Long1=1     'longueur souhaitée du fichier wav, secondes
    Long2=2
    Long3=5
 
    Volume=80   '0 à 100

    'potentiomètre de volume
    'fond :
    X1Fond$="15":Y1Fond$="9"
    X2Fond$="35":Y2Fond$="111"
    fond$="black"
 
    'glissière
    BasGliss=110
    YMaxGliss=10
    X1Gliss$="16":Y1Gliss$=str$(BasGliss-Volume)
    X2Gliss$="34":Y2Gliss$=str$(BasGliss)
    bande$="red"
 
 
    'nomainwin

'taille fenêtre
    WindowWidth = 624
    WindowHeight = 165
 
'boutons et contrôles
    groupbox #GenBF.gbx1, "Fréquence", 14, 11, 128, 115
    radiobutton #GenBF.rdb1, str$(F1)+" Hz", [F1_On], [F1_Off], 30, 41, 104, 20
    radiobutton #GenBF.rdb2, str$(F2)+" Hz", [F2_On], [F2_Off], 30, 66, 104, 20
    radiobutton #GenBF.rdb3, str$(F3)+" Hz", [F3_On], [F2_Off], 30, 91, 104, 20
 
    groupbox #GenBF.gbx2, "Echantillonnage", 150, 11, 120, 115
    radiobutton #GenBF.rdb4, str$(Ech1)+" ech./s", [Ech1_On], [Ech1_Off], 166, 41, 98, 20
    radiobutton #GenBF.rdb5, str$(Ech2)+" ech./s", [Ech2_On], [Ech1_Off], 166, 66, 98, 20
    radiobutton #GenBF.rdb6, str$(Ech3)+" ech./s", [Ech3_On], [Ech1_Off], 166, 91, 98, 20
 
    groupbox #GenBF.gbx3, "Durée", 278, 11, 104, 115
    radiobutton #GenBF.rdb7, str$(Long1)+" s", [Duree1_On], [Duree1_off], 294, 41, 72, 20
    radiobutton #GenBF.rdb8, str$(Long2)+" s", [Duree2_On], [Duree2_Off], 294, 66, 72, 20
    radiobutton #GenBF.rdb9, str$(Long3)+" s", [Duree3_On], [Duree3_Off], 294, 91, 72, 20
 
    graphicbox #GenBF.graf, 400, 8, 50, 120
    statictext #GenBF.stx1, "Volume", 460, 45, 50, 25
    statictext #GenBF.stx2, str$(Volume), 475, 65, 30, 25
    'textbox #GenBF.txtb1, 425, 60, 50, 25

    button #GenBF.btn1, "Créer", [Generateur], UL, 518, 26, 80, 80 '(créer le fichier wav)

 
'ouverture fenêtre
open "Générateur BF" for window as #GenBF
 
    print #GenBF, "font ms_sans_serif 0 16"
    print #GenBF, "TRAPCLOSE [quit]"
 
    frequence=F1:print #GenBF.rdb1, "set"
    echantillonnage=Ech1:print #GenBF.rdb4, "set"
    duree=Long1:print #GenBF.rdb7, "set"
    gosub [dessin_Potar]
 
    print #GenBF.graf, "when leftButtonUp [Choix_Volume]"
 
    'print #GenBF.txtb1,str$(Volume)

    'print #GenBF, "when leftButtonDown [choice]"
    'print #GenBF, "when leftButtonUp [make]"
    wait
 
'************************************************
[F1_On] frequence=F1:wait
[F1_Off] wait
 
[F2_On] frequence=F2:wait
[F2_Off] wait
 
[F3_On] frequence=F3:wait
[F3_Off] wait
 
[Ech1_On] echantillonnage=Ech1:wait
[Ech1_Off] wait
 
[Ech2_On] echantillonnage=Ech2:wait
[Ech2_Off] wait
 
[Ech3_On] echantillonnage=Ech3:wait
[Ech3_Off] wait
 
[Duree1_On] duree=Long1:wait
[Duree1_off] wait
 
[Duree2_On] duree=Long2:wait
[Duree2_off] wait
 
[Duree3_On] duree=Long3:wait
[Duree3_off] wait
 
[Choix_Volume]
    Y=MouseY
 
    if Y>BasGliss then Y=BasGliss 'dépassement vers le bas de l'écran
    if Y<YMaxGliss then Y=YMaxGliss  'YMaxGliss=10

    Y1Gliss$=str$(Y)
    Volume=BasGliss-Y
 
    gosub [dessin_Potar]
    wait
 
[dessin_Potar]
    'fond du potentiomètre
    print #GenBF.graf, "up"
    print #GenBF.graf, "goto "+X1Fond$+" "+Y1Fond$+" "
    print #GenBF.graf, "down"
    print #GenBF.graf, "backcolor black"
    print #GenBF.graf, "boxfilled "+X2Fond$+" "+Y2Fond$+" "
 
    'couleur de la bande
    print #GenBF.graf, "up"
    print #GenBF.graf, "goto "+X1Gliss$+" "+Y1Gliss$+" "
    print #GenBF.graf, "down"
    print #GenBF.graf, "backcolor red"
    print #GenBF.graf, "boxfilled "+X2Gliss$+" "+Y2Gliss$+" "
 
    'mise à jour affichage numérique
    print #GenBF.stx2, str$(Volume)
    return
 
[Generateur]
    print
    print "Générateur :"
    print "fréquence = ";frequence
    print "fréquence d'échantillonnage = ";echantillonnage
    print "durée = ";duree
    print "volume = ";Volume
 
    pi=3.14159265
 
    'durée entre deux échantillonages (également période de la fréquence d'échantillonnage)
    delta=1/echantillonnage
 
    omega=2*pi*frequence
 
    'période commune à la fréquence d'échantillonnage et à la fréquence générée

    'période fréquence générées
    periode=1/frequence
 
    '256 valeurs crête à crête pour un échantillon, donc zéro à 127
    offset=127  '256 valeurs crête à crête pour un échantillon, donc zéro à 127

    'là maintenant c'est de la recherche...
    'exprimer les deux périodes en entiers, tout en conservant leur porportionnalité
    periode$=str$(periode)
    delta$=str$(delta)
 
    chaine$=str$(periode):gosub [analyse_chaine]:periode$=chaine$
    chaine$=str$(delta):gosub [analyse_chaine]:delta$=chaine$
 
    print "Période générateur = ";periode$
    print "Période delta = ";delta$
 
    'y'a des soirs faut savoir s'arrêter
    'donc on en est là : générer la forme d'onde et la coder pour qu'elle rentre dans un
    'fichier wave

 
 
 
 
    wait
 
[analyse_chaine]
    virgule=0
    scienti=0
    for a=1 to len(chaine$)
        a$=mid$(chaine$,a,1)
        if a$="." then virgule=a
        if a$="e" then scienti=a
    next
 
    avantvirg$=""
    if virgule>0 then
 
        avantvirg$=left$(chaine$, virgule-1)
 
        if scienti>0 then
 
            apresvirg$=mid$(chaine$,virgule+1,scienti-1)
            exposant=val(right$(chaine,len(chaine$)-scienti))
 
        else
            apresvirg$=right$(chaine$,len(chaine$)-virgule+1)
        end if
    else
        avantvirg$=chaine$
    end if
 
    print "avant virgule = ";avantvirg$
    print "apres virgule = ";apresvirg$
    print "puissance de dix = ";exposant
    return
 
[quit]
    'quitte le programme
    close #GenBF
    end
 
 






Bonne nuit !



Edité par Christophe Le 20/12/2015 à 16h00
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 20/12/2015 à 16h01

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Oué !

Elles sont pas sympa, mes courbes^^

(j'ai un peu modifié ton afficheur)
Code VB :
 
 
dim courbeF1(500)
dim courbeF2(500)
dim courbeF3(500)
 
pi=3.1415926536
F1=440:T1=1/F1:omega1=2*pi*F1
F2=660:T2=1/F2:omega2=2*pi*F2
'F3=44100:T3=1/F3:omega3=2*pi*F3

t=0
for a=0 to 499
    courbeF1(a)=40*sin(omega1*t)
    courbeF2(a)=40*sin(omega2*t)
    'courbeF3(a)=40*sin(omega3*t)
    courbeF3(a)=courbeF1(a)+courbeF2(a)
    t=t+0.000015
next
 
 
    nomainwin
    WindowWidth = 415: UpperLeftX = 200
    WindowHeight = 490: UpperLeftY = 200
    graphicbox  #1.gb 5,5,400,450
    open "..." for window_nf as #1
    #1 "trapclose [quit]"
    #1.gb "down ; fill 0 106 53":#1.gb "color 157 157 0"
    for x= 20 to 480 step 20
        #1.gb "line ";x;" 0 ";x;" 600"
    next
    for y= 20 to 480 step 20
        #1.gb "line 0 ";y;" 600 ";y
    next
    #1.gb "color green"
    ph=180:midY1=60:midY2=160:midY3=320
    oldY1=midY1:oldY2=midY2:oldY3=midY3
    for n= 0 to 499
        x=n
        y=midY1+courbeF1(n)
            #1.gb "line ";oldX1;" ";oldY1;" ";x;" ";y
            oldX1=x:oldY1=y
 
        y=midY2+courbeF2(n)
            #1.gb "line ";oldX2;" ";oldY2;" ";x;" ";y
            oldX2=x:oldY2=y
 
        y=midY3+courbeF3(n)
            #1.gb "line ";oldX3;" ";oldY3;" ";x;" ";y
            oldX3=x:oldY3=y
 
    next
    #1.gb "flush"
    wait
    [quit]
        close #1
    end
 
 



Je complète ta pensée du matin : 80% de réflexion, 20% de codage (ou même 90/10...)

Je voulais faire figurer la fréquence d'échantillonnage, mais à l'échelle du graphe, on ne voit rien, elle est trop grande, alors j'ai sommé F1 et F2 à la place

A+
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 20/12/2015 à 16h03

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
No souci, mais avec ta permission à toi, je le reproduis ici, et je remet l'initial dans le post du 02/12/15 à 00h54. C'est pas que je sois si chatouilleux que ça, mais je préfère garder la cohérence de la discussion, et si on se met à modifier un code qui a déjà été posté, on se retrouve avec un autre code quand on veut le consulter à nouveau. (et chut, faut pas le dire, mais je trouve parfois plus simple de faire un copier-coller à partir du forum, plutôt que d'aller chercher l'original sur le disque dur^^)

Autrement et dans le même domaine, je regardais si on pouvait faire un potar rotatif avec l'instruction pie
une pour le fond, et qui fait 270°
l'autre pour le curseur
une fois que ces deux-là sont affichés, on dessine par dessus un circlefill pour ne laisser qu'une bande circulaire
le principe de fonctionnement est le même qu'avec le rectiligne : le curseur se place sur le clic de souris, ou alors il suit la souris.

J'ai abandonné car je ne comprend pas le système des angles : mon essai de 0 à 180° était presque un demi-cercle, et c'est le "presque" qui me chiffonne. Ce sont des angles exprimés en radians ? J'ai du zapper quelque chose

Voici notre code
Code VB :
 
 
'initialisations
    F1=440      'fréquences générateur disponibles, Herz
    F2=1000
    F3=2800
 
    Ech1=11025  'fréquences d'échantillonnage disponibles
    Ech2=22050
    Ech3=44100
 
    Long1=1     'longueur souhaitée du fichier wav, secondes
    Long2=2
    Long3=5
 
    Volume=80   '0 à 100

    'potentiomètre de volume
    'fond :
    X1Fond=15:Y1Fond=9
    X2Fond=35:Y2Fond=111
    fond$="black"
 
    'glissière
    BasGliss=110
    YMaxGliss=10
    X1Gliss=16:Y1Gliss=BasGliss-Volume
    X2Gliss=34:Y2Gliss=BasGliss
    bande$="red"
 
 
    'nomainwin

'taille fenêtre
    WindowWidth = 624
    WindowHeight = 165
 
'boutons et contrôles
    groupbox #GenBF.gbx1, "Fréquence", 14, 11, 128, 115
    radiobutton #GenBF.rdb1, str$(F1)+" Hz", [F1_On], [F1_Off], 30, 41, 104, 20
    radiobutton #GenBF.rdb2, str$(F2)+" Hz", [F2_On], [F2_Off], 30, 66, 104, 20
    radiobutton #GenBF.rdb3, str$(F3)+" Hz", [F3_On], [F2_Off], 30, 91, 104, 20
 
    groupbox #GenBF.gbx2, "Echantillonnage", 150, 11, 120, 115
    radiobutton #GenBF.rdb4, str$(Ech1)+" ech./s", [Ech1_On], [Ech1_Off], 166, 41, 98, 20
    radiobutton #GenBF.rdb5, str$(Ech2)+" ech./s", [Ech2_On], [Ech1_Off], 166, 66, 98, 20
    radiobutton #GenBF.rdb6, str$(Ech3)+" ech./s", [Ech3_On], [Ech1_Off], 166, 91, 98, 20
 
    groupbox #GenBF.gbx3, "Durée", 278, 11, 104, 115
    radiobutton #GenBF.rdb7, str$(Long1)+" s", [Duree1_On], [Duree1_off], 294, 41, 72, 20
    radiobutton #GenBF.rdb8, str$(Long2)+" s", [Duree2_On], [Duree2_Off], 294, 66, 72, 20
    radiobutton #GenBF.rdb9, str$(Long3)+" s", [Duree3_On], [Duree3_Off], 294, 91, 72, 20
 
    graphicbox #GenBF.graf, 0, 0, 0, 0 '§§§§§ Tout mis à 0 pour pas devoir supprimer§§§§§§§§§§§§
    graphicbox #GenBF.pot, 400, 8, 50, 120 '§§§§§§§§§§§§§§§§§§
    statictext #GenBF.stx1, "Volume", 460, 45, 50, 25
    statictext #GenBF.stx2, str$(Volume), 475, 65, 30, 25
    'textbox #GenBF.txtb1, 425, 60, 50, 25

    button #GenBF.btn1, "Créer", [Generateur], UL, 518, 26, 80, 80 '(créer le fichier wav)

 
'ouverture fenêtre
open "Générateur BF" for window as #GenBF
    #GenBF.pot, "down": #GenBF.pot, "fill black" '§§§§§§§§§§§§§§§§§§
    #GenBF.pot, "when leftButtonDown [choicepot]" '§§§§§§§§§§§§§§§§§§
    #GenBF.pot, "when leftButtonUp [makepot]"   '§§§§§§§§§§§§§§§§§§
    print #GenBF, "font ms_sans_serif 0 16"
    print #GenBF, "TRAPCLOSE [quit]"
 
    frequence=F1:print #GenBF.rdb1, "set"
    echantillonnage=Ech1:print #GenBF.rdb4, "set"
    duree=Long1:print #GenBF.rdb7, "set"
    gosub [dessin_Potar]
 
    print #GenBF.graf, "when leftButtonUp [Choix_Volume]"
 
    'print #GenBF.txtb1,str$(Volume)

    'print #GenBF, "when leftButtonDown [choice]"
    'print #GenBF, "when leftButtonUp [make]"
    wait
 
'************************************************
[F1_On] frequence=F1:wait
[F1_Off] wait
 
[F2_On] frequence=F2:wait
[F2_Off] wait
 
[F3_On] frequence=F3:wait
[F3_Off] wait
 
[Ech1_On] echantillonnage=Ech1:wait
[Ech1_Off] wait
 
[Ech2_On] echantillonnage=Ech2:wait
[Ech2_Off] wait
 
[Ech3_On] echantillonnage=Ech3:wait
[Ech3_Off] wait
 
[Duree1_On] duree=Long1:wait
[Duree1_off] wait
 
[Duree2_On] duree=Long2:wait
[Duree2_off] wait
 
[Duree3_On] duree=Long3:wait
[Duree3_off] wait
 
[Choix_Volume]
    Y=MouseY
 
    if Y>BasGliss then Y=BasGliss 'dépassement vers le bas de l'écran
    if Y<YMaxGliss then Y=YMaxGliss  'YMaxGliss=10

    Y1Gliss=Y
    Volume=BasGliss-Y
 
    gosub [dessin_Potar]
    wait
  [choicepot] '----------- LE POTAR EN GRAPHICBOX ----------------
    ypota=MouseY
    #GenBF.pot, "when leftButtonMove [makepot]"
    ypota=MouseY
  wait
  [makepot]
    #GenBF.pot, "when leftButton"
    ypotb=MouseY
    if ypotb > ypota then
      vol = vol- 1
      if vol < 1 then vol=0
     #GenBF.stx2, str$(vol)
    #GenBF.pot, "place ";"10";" ";ypotb
    #GenBF.pot, "color black;backcolor black"
    #GenBF.pot, "boxfilled ";"35";" ";"0"
    end if
    if ypotb < ypota then
     vol = vol+1:#GenBF.stx2, str$(vol)
    #GenBF.pot, "place ";"10";" ";ypotb
    #GenBF.pot, "color red;backcolor red"
    #GenBF.pot, "boxfilled ";"35";" ";"80"
    end if
  wait '----------- FIN DU POTAR EN GRAPHICBOX ----------------

[dessin_Potar]
    'fond du potentiomètre
    print #GenBF.graf, "up"
    print #GenBF.graf, "goto ";X1Fond;" ";Y1Fond
    print #GenBF.graf, "down"
    print #GenBF.graf, "backcolor black"
    print #GenBF.graf, "boxfilled ";X2Fond;" ";Y2Fond
 
    'couleur de la bande
    print #GenBF.graf, "up"
    print #GenBF.graf, "goto ";X1Gliss;" ";Y1Gliss
    print #GenBF.graf, "down"
    print #GenBF.graf, "backcolor red"
    print #GenBF.graf, "boxfilled ";X2Gliss;" ";Y2Gliss
 
    'mise à jour affichage numérique
    print #GenBF.stx2, str$(Volume)
    return
 
[Generateur]
    print
    print "Générateur :"
    print "fréquence = ";frequence
    print "fréquence d'échantillonnage = ";echantillonnage
    print "durée = ";duree
    print "volume = ";Volume
 
    pi=3.14159265
 
    'durée entre deux échantillonages (également période de la fréquence d'échantillonnage)
    delta=1/echantillonnage
 
    omega=2*pi*frequence
 
    'période commune à la fréquence d'échantillonnage et à la fréquence générée

    'période fréquence générées
    periode=1/frequence
 
    '256 valeurs crête à crête pour un échantillon, donc zéro à 127
    offset=127  '256 valeurs crête à crête pour un échantillon, donc zéro à 127

    'là maintenant c'est de la recherche...
    periode$=str$(periode)
    delta$=str$(delta)
    print "Période générateur = ";periode$
    print "Période delta = ";delta$
 
    'y'a des soirs faut savoir s'arrêter
    'donc on en est là : générer la forme d'onde et la coder pour qu'elle rentre dans un
    'fichier wave
    wait
[quit]
    'quitte le programme
    close #GenBF
    end
 
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 20/12/2015 à 16h04

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Bon, je m'arrête là pour ce soir.

J'ai bricolé ça :

Code VB :
 
 
 
dim courbeF1(500)
dim courbeF2(500)
dim courbeF3(500)
 
pi=3.1415926536
F1=440:T1=1/F1:omega1=2*pi*F1
F2=660:T2=1/F2:omega2=2*pi*F2
'F3=44100:T3=1/F3:omega3=2*pi*F3
t=0
 
'longueur division
longdiv=50  'pixels entre chaque division. considérer la division comme un trait sans épaisseur
            'même si la division fera un pixel de large

 
'secondes par division
long1=0.005
long2=0.002
long3=0.001
long4=0.0005
long5=0.0002
long6=0.0001
 
'secondes par division, pour affichage
long1aff$=str$(long1*1000)
long2aff$=str$(long2*1000)
long3aff$=str$(long3*1000)
long4aff$=str$(long4*1000)
long5aff$=str$(long5*1000)
long6aff$=str$(long6*1000)
 
 
 
 
    nomainwin
    WindowWidth = 800: UpperLeftX = 200
    WindowHeight = 600: UpperLeftY = 200
    graphicbox  #1.gb 280,15,500,500
    groupbox #1.gbx3, "Base de temps", 8, 395, 225, 100
    radiobutton #1.rdb1, long1aff$+" ms par div", [SParDiv1_On], [SParDiv1_off], 26, 415, 96, 20
    radiobutton #1.rdb2, long2aff$+" ms par div", [SParDiv2_On], [SParDiv2_Off], 26, 440, 96, 20
    radiobutton #1.rdb3, long3aff$+" ms par div", [SParDiv3_On], [SParDiv3_Off], 26, 465, 96, 20
    radiobutton #1.rdb4, long4aff$+" ms par div", [SParDiv4_On], [SParDiv4_off], 126, 415, 96, 20
    radiobutton #1.rdb5, long5aff$+" ms par div", [SParDiv5_On], [SParDiv5_Off], 126, 440, 96, 20
    radiobutton #1.rdb6, long6aff$+" ms par div", [SParDiv6_On], [SParDiv6_Off], 126, 465, 96, 20
 
 
    open "..." for window_nf as #1
    #1 "trapclose [quit]"
 
    gosub [sinusoides]
    gosub [ecran]
    gosub [dessin]
 
    #1.gb "flush"
    wait
    [quit]
        close #1
    end
[SParDiv1_On] deltaT=long1/longdiv:gosub [sinusoides]:cls:gosub [ecran]:gosub [dessin]:wait
[SParDiv1_off] wait
 
[SParDiv2_On]  deltaT=long2/longdiv:gosub [sinusoides]:cls:gosub [ecran]:gosub [dessin]:wait
[SParDiv2_Off] wait
 
[SParDiv3_On]  deltaT=long3/longdiv:gosub [sinusoides]:cls:gosub [ecran]:gosub [dessin]:wait
[SParDiv3_Off] wait
 
[SParDiv4_On]  deltaT=long4/longdiv:gosub [sinusoides]:cls:gosub [ecran]:gosub [dessin]:wait
[SParDiv4_off] wait
 
[SParDiv5_On]  deltaT=long5/longdiv:gosub [sinusoides]:cls:gosub [ecran]:gosub [dessin]:wait
[SParDiv5_Off] wait
 
[SParDiv6_On]  deltaT=long6/longdiv:gosub [sinusoides]:cls:gosub [ecran]:gosub [dessin]:wait
[SParDiv6_Off] wait
 
[ecran]
    #1.gb "down ; fill 0 106 53":#1.gb "color 157 157 0"
    for x= 0 to 500 step longdiv
        #1.gb "line ";x;" 0 ";x;" 500"
    next
    for y= 0 to 500 step longdiv
        #1.gb "line 0 ";y;" 500 ";y
    next
    return
 
[dessin]
    #1.gb "color green"
    ph=180:midY1=50:midY2=150:midY3=350
    oldY1=midY1:oldY2=midY2:oldY3=midY3
    for n= 0 to 499
        x=n
        y=midY1+courbeF1(n)
            #1.gb "line ";oldX1;" ";oldY1;" ";x;" ";y
            oldX1=x:oldY1=y
 
        y=midY2+courbeF2(n)
            #1.gb "line ";oldX2;" ";oldY2;" ";x;" ";y
            oldX2=x:oldY2=y
 
        y=midY3+courbeF3(n)
            #1.gb "line ";oldX3;" ";oldY3;" ";x;" ";y
            oldX3=x:oldY3=y
 
    next
    return
 
[sinusoides]
 
    t=0
    for a=0 to 499
        courbeF1(a)=40*sin(omega1*t)
        courbeF2(a)=40*sin(omega2*t)
        'courbeF3(a)=40*sin(omega3*t)
        courbeF3(a)=courbeF1(a)+courbeF2(a)
        t=t+deltaT
    next
    return
 
 



C'est quasi pas documenté et il n'y a que la base de temps, il manque le réglage de fréquence, et le réglage de niveau pour chacune des deux voies, la 3ème étant le mélange des deux premières.

Il faut que je trouve pourquoi il y a 3 lignes horizontales affichées, qui normalement n'existent pas (en fait c'est le "0" de chaque courbe)

Si tu as envie de le modifier à ta sauce, n'hésite pas (c'est basé sur ton travail). Pour ma part j'ajouterai les contrôles qui manquent dans les jours qui viennent (moins de temps, malheureusement...)
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 20/12/2015 à 16h06

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Ok, c'était en radians, donc. J'ai même pas percuté, je comprend mieux que mon angle de 180° n'était pas une ligne très droite, et qu'il avait quelques degrés de gite (pour reprendre les termes de marins. D'après le dico on peut dire aussi "qui donne de la bande" ).

Thanks pour les compliments. La suite est simple, on a pas mal planché sur les commandes de fréquences et de volume, et on sait de quoi on cause, maintenant ;) En plus il n'y a plus la restriction d'avoir une période commune : c'est juste un visualisateur.

En fait le gros problème du générateur est que je ne suis pas du métier... donc je navigue un peu dans le flou.

Je recherche la période commune à toutes les fréquences audio et à la fréquence d'échantillonnage :

période commune à toutes les fréquences audio, pour avoir un début de cette période lorsque toutes les sinusoïdes passent simultanément par zéro en montant (par exemple) et la fin de cette période au point suivant de rencontre des sinusoïdes à zéro en montant.

Ensuite, un multiple de cette période avec la fréquence d'échantillonnage, pour avoir un échantillonnage pile poil au début et un autre pile poil à la fin de la période, et c'est cette période qu'on numérisera, et qu'on reproduira à l'identique pour obtenir la durée souhaitée pour le fichier wav

Je me suis pris le chou avec les périodes, alors que si j'avais travaillé avec les fréquences, il était très facile de calculer un ppcm, puis de passer à la période en faisant 1/ppcm. En plus je pouvais garder la résolution du Hz. Toujours été pas très bon en maths^^

Sur ce, bonne nuit, en espérant avoir éclairé...
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 20/12/2015 à 16h07

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
C'est bon, ça va, je vais le faire, ton générateur à fréquence unique, ah là là... De la suite dans les idées, hein ? ;)

Effectivement il n'y a qu'a nettoyer le code de notre illustre inconnu pour ne garder qu'une fréquence et une durée. Quelques contrôles pour modifier ces paramètres en cours d’exécution, et ça roule. Ce soir, si j'ai deux minutes...

La recherche de la période commune, c'est seulement utile si on veut reproduire un son en boucle, on a alors intérêt à ne pas commencer ou finir cette boucle au milieu d'un sommet de sinusoïde. Mais s'il s'agit juste de créer quelques secondes de son qu'on joue une fois ou deux, on s'en fiche, de la période commune.

A+, je peux plus rester...
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 20/12/2015 à 16h09

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Roland:

Faire un son de 1 seconde, c'est déjà répéter en boucle la première période [... ...]il suffit de définir une durée multiple juste de la période


Je vois qu'on va bientôt se trouver sur la même longueur d'onde (elle est facile, certes, mais de circonstance^^)

La première période est la fameuse et fumeuse période commune, Cette période existe fatalement, puisqu'elle est constituée de phénomènes périodiques, il y aura forcément une coïncidence à un moment ou à un autre. Le but est de reproduire cette période dans le fichier wav jusqu'à atteindre la durée souhaitée pour le fichier. Et il y aura effectivement un inévitable trou si on le fait jouer en boucle par JB

J'ai pas encore ma période commune. Plus il y a de fréquences, ou plus elles ont un faible écart entre elles, plus il y a de chances que cette période soit longue. En première approche j'essaierai le ppcm de toutes les fréquences, et son inverse devrait me donner LA période commune. "devrait", hein, j'promet rien :top

Autrement, j'ai intégré l'algorithme du générateur de (faut lui trouver un nom, c'est un peu lassant de parler de l'illustre inconnu par ci et de l'illustre inconnu par là...). L'algorithme est réduit à une seule fréquence. J'ai utilisé ma petite fenêtre avec potar de volume dans l'état où elle était, et j'ai fait correspondre les données de base.

Donc ça marche, MAIS : c'est brut de décoffrage, il n'est pas certain qu'on puisse à l'infini cliquer sur les boutons, il y a peut-être des situations pas prévues.

Egalement, créer un fichier de 5 secondes à 44100 échantillons par seconde, c'est long, mais LONG ! Ne pas brusquer le programme et attendre, car si on clique un peu partout ça finit par le faire planter. Le juge de paix est la mainwin : lorsque le fichier est créé, elle affiche "***** fichier créé ! ******".

Voici le code :
Code VB :
 
 
'initialisations
    F1=440      'fréquences générateur disponibles, Herz
    F2=1000
    F3=2800
 
    Ech1=11025  'fréquences d'échantillonnage disponibles
    Ech2=22050
    Ech3=44100
 
    Long1=1     'longueur souhaitée du fichier wav, secondes
    Long2=2
    Long3=5
 
    Volume=80   '0 à 100
    pi=3.14159265
 
    'potentiomètre de volume
    'fond :
    X1Fond$="15":Y1Fond$="9"
    X2Fond$="35":Y2Fond$="111"
    fond$="black"
 
    'glissière
    BasGliss=110
    YMaxGliss=10
    X1Gliss$="16":Y1Gliss$=str$(BasGliss-Volume)
    X2Gliss$="34":Y2Gliss$=str$(BasGliss)
    bande$="red"
 
 
    'nomainwin

'taille fenêtre
    WindowWidth = 624
    WindowHeight = 165
 
'boutons et contrôles
    groupbox #GenBF.gbx1, "Fréquence", 14, 11, 128, 115
    radiobutton #GenBF.rdb1, str$(F1)+" Hz", [F1_On], [F1_Off], 30, 41, 104, 20
    radiobutton #GenBF.rdb2, str$(F2)+" Hz", [F2_On], [F2_Off], 30, 66, 104, 20
    radiobutton #GenBF.rdb3, str$(F3)+" Hz", [F3_On], [F2_Off], 30, 91, 104, 20
 
    groupbox #GenBF.gbx2, "Echantillonnage", 150, 11, 120, 115
    radiobutton #GenBF.rdb4, str$(Ech1)+" ech./s", [Ech1_On], [Ech1_Off], 166, 41, 98, 20
    radiobutton #GenBF.rdb5, str$(Ech2)+" ech./s", [Ech2_On], [Ech1_Off], 166, 66, 98, 20
    radiobutton #GenBF.rdb6, str$(Ech3)+" ech./s", [Ech3_On], [Ech1_Off], 166, 91, 98, 20
 
    groupbox #GenBF.gbx3, "Durée", 278, 11, 104, 115
    radiobutton #GenBF.rdb7, str$(Long1)+" s", [Duree1_On], [Duree1_off], 294, 41, 72, 20
    radiobutton #GenBF.rdb8, str$(Long2)+" s", [Duree2_On], [Duree2_Off], 294, 66, 72, 20
    radiobutton #GenBF.rdb9, str$(Long3)+" s", [Duree3_On], [Duree3_Off], 294, 91, 72, 20
 
    graphicbox #GenBF.graf, 400, 8, 50, 120
    statictext #GenBF.stx1, "Volume", 460, 45, 50, 25
    statictext #GenBF.stx2, str$(Volume), 475, 65, 30, 25
    'textbox #GenBF.txtb1, 425, 60, 50, 25

    button #GenBF.btn1, "Créer", [Generateur], UL, 518, 26, 80, 80 '(créer le fichier wav)

 
'ouverture fenêtre
open "Générateur BF" for window as #GenBF
 
    print #GenBF, "font ms_sans_serif 0 16"
    print #GenBF, "TRAPCLOSE [quit]"
 
    frequence=F1:print #GenBF.rdb1, "set"
    ech=Ech1:print #GenBF.rdb4, "set"
    duree=Long1:print #GenBF.rdb7, "set"
    gosub [dessin_Potar]
 
    print #GenBF.graf, "when leftButtonUp [Choix_Volume]"
 
    'print #GenBF.txtb1,str$(Volume)

    'print #GenBF, "when leftButtonDown [choice]"
    'print #GenBF, "when leftButtonUp [make]"
    wait
 
'************************************************
[F1_On] frequence=F1:wait
[F1_Off] wait
 
[F2_On] frequence=F2:wait
[F2_Off] wait
 
[F3_On] frequence=F3:wait
[F3_Off] wait
 
[Ech1_On] ech=Ech1:wait
[Ech1_Off] wait
 
[Ech2_On] ech=Ech2:wait
[Ech2_Off] wait
 
[Ech3_On] ech=Ech3:wait
[Ech3_Off] wait
 
[Duree1_On] duree=Long1:wait
[Duree1_off] wait
 
[Duree2_On] duree=Long2:wait
[Duree2_off] wait
 
[Duree3_On] duree=Long3:wait
[Duree3_off] wait
 
[Choix_Volume]
    Y=MouseY
 
    if Y>BasGliss then Y=BasGliss 'dépassement vers le bas de l'écran
    if Y<YMaxGliss then Y=YMaxGliss  'YMaxGliss=10

    Y1Gliss$=str$(Y)
    Volume=BasGliss-Y
 
    gosub [dessin_Potar]
    wait
 
[dessin_Potar]
    'fond du potentiomètre
    print #GenBF.graf, "up"
    print #GenBF.graf, "goto "+X1Fond$+" "+Y1Fond$+" "
    print #GenBF.graf, "down"
    print #GenBF.graf, "backcolor black"
    print #GenBF.graf, "boxfilled "+X2Fond$+" "+Y2Fond$+" "
 
    'couleur de la bande
    print #GenBF.graf, "up"
    print #GenBF.graf, "goto "+X1Gliss$+" "+Y1Gliss$+" "
    print #GenBF.graf, "down"
    print #GenBF.graf, "backcolor red"
    print #GenBF.graf, "boxfilled "+X2Gliss$+" "+Y2Gliss$+" "
 
    'mise à jour affichage numérique
    print #GenBF.stx2, str$(Volume)
    return
 
[Generateur]
    print
    print "Générateur :"
    print "fréquence = ";frequence
    print "fréquence d'échantillonnage = ";ech
    print "durée = ";duree
    print "volume = ";Volume
 
 
    pi=3.14159265
    omega=2*pi*frequence
    offset=127
    delta=1/ech
    data$=""
 
    for t = 0 to duree step delta
        sample=(Volume/100)*sin(omega*t)
        y=sample*offset
        data$=data$;chr$(int(y+offset))
    next t
 
 
    'préparation de l'en-tête du fichier wave : type de fichier, et caractéristiques des données audio.
    ChunkID$="RIFF"                         'toujours RIFF
    ChunkSize$=makeAsciiNumber$(36+255,4)   '
    Format$="WAVE"                          'toujours WAVE
    SubChunk1ID$="fmt "                     'toujours "fmt "
    SubChunk1Size$=makeAsciiNumber$(16,4)   'taille
    AudioFormat$=makeAsciiNumber$(1,2)      '
    NumChannels$=makeAsciiNumber$(1,2)
    SampleRate$=makeAsciiNumber$(ech,4)
    ByteRate$=makeAsciiNumber$(ech,4)
    BlockAlign$=makeAsciiNumber$(1,2)
    BitsPerSample$=makeAsciiNumber$(8,2)
    SubChunk2ID$="data"
    SubChunk2Size$=makeAsciiNumber$(len(data$),4)
 
    'concaténation des données d'organisation dans la chaine wave$
    wave$=ChunkID$;ChunkSize$;Format$;SubChunk1ID$;SubChunk1Size$;AudioFormat$;NumChannels$;SampleRate$;ByteRate$;BlockAlign$;BitsPerSample$;SubChunk2ID$;SubChunk2Size$
 
    'ajout des données audio
    wave$=wave$;data$
 
    'contrôle visuel que tout s'est bien passé, désactiver le nomainwin pour affichage
    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
 
   'enregistrement du fichier wav
   open "newwave2.wav" for output as #out
 
    #out wave$
    close #out
    print :print "***** fichier créé ! ******"
    playwave "newwave2.wav"
    wait
end
 
 
function makeAsciiNumber$(number,length)    'makeAsciiNumber$(11025,4)

        'admettons qu'on désire écrire 11025 sur 4 octets
        multiplier=256^(length-1) '256^(4-1) = 256^3 = 16777216

        for i = length to 1 step -1 'de 4 à 1 par pas de -1

            multiplier=256^(i-1) : if multiplier=0 then multiplier=1
            'i=4 -> multiplier=256^3=16777216
            'i=3        "     =256^2=65536
            'i=2        "     =256^1=256
            'i=1        "     =256^0=1

 
            asc=int(number/multiplier)
            'i=4 -> asc=int(11025/16777216) =0,000657141208649 = 0
            'i=3        "   11025/65536     =0,168228149414    = 0
            'i=2        "   11025/256       =43,06640625       = 43
            'i=1        "   17/1            =17                = 17

 
            number=number-asc*multiplier
            'i=4 -> number = 11025-0*16777216 = 11025
            'i=3        "  = 11025-0*65536    = 11025
            'i=2        "  = 11025-43*256      = 17
            'i=1        "  = 17-17*1           = 0 (???)

 
 
            'on ajoute le caractère avant la chaine
            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
 
 
 
[quit]
    'quitte le programme
    close #GenBF
    end
 
 




Edité par Christophe Le 20/12/2015 à 16h11
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 20/12/2015 à 17h15

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Bon, ben on s'en sort pas trop mal; par contre, je ne suis pas arrivé à réinsérer les miens dans les tiens
Il semble qu'on ne peut poster qu'en "suivant", je les ai donc virés.
Je remets celui-ci because le lien peut intéresser quelqu'un
--------------------------
Collaaaage !
-------------------------
ok, pas de soucis, le temps est relatif. ;)

J'ai fais quelques tentatives de commut's rotatifs, c'est coton; comme sur un écran c'est du x y, c'est la quadrature du cercle..Ou la cerclure du carré .Si je puis dire.
Et si c'est pour faire un caca en 50 lignes, il vaut peut-être mieux garder les radiobuttons qui ne sont pas si mal

Je mets là la page de l'oscillo à Lissajous de cassiope --->: http://libertybasic.fr/forum/topic-129+oscilloscope-simulateur.php

Gare à la tête, c'est du cassiope (et en plus, c'est du dynamique) :s
Pas la peine d'aller voir les liens qu'il a mis en haut de code, il s'est planté; et de toutes façon le code dont il s'est inspiré n'a rien à voir; c'est du LB avec appel de dll et retours de handles. Pour refaire le même en JB, ça a pas dû être évident.

à +++
-------------------------
Fin des hostilités, halte au feu
Pour la suite de l'histoire c'est là-bas--->: http://libertybasic.fr/forum/topic-419+generateur-bf.php
____________________
Roro

   
Général » Préambule au Générateur BF Choses venues d'ailleurs  

 |  |

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