Forum Liberty Basic France

Général » Générateur BF Ou qui tente de l'être
Le 18/06/2016 à 16h24

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 336
Reprise du message précédent

Pas touché au procédé d'affichage de la courbe, toujours calculée en fonction de la largeur de la fenêtre de visu. Ce n'est donc pas forcément l'allure de la courbe stockée dans le fichier.

par contre j'ai innové dans la présentation des données :

les paramètres du fichier wav sont maintenant dans une fenêtre qu'on ouvre par le bouton adéquat, et qu'on peut ouvrir et refermer à volonté. Dommage collatéral : je n'arrive pas à récupérer la valeur d'une textbox. Pas de souci pour les combobox.

La seconde différence est la gestion des fréquences, balance et volume global par clic de souris sur les chiffres.

La troisième me chagrine un peu : vu la taille de plus en plus conséquente, j'ai dû placer le fichier dans un zip (c'était tellement commode de placer le code tel quel entre les balises et qu'on pouvait prendre par un simple copier-coller)

Enfin, voici, avec probablement quelques bugs mais normalement ça fonctionne :
gbf 18juin2016_1ab2b.zip
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais 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/06/2016 à 20h29

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1844
Citation:
pas forcément l'allure de la courbe

Et ben si tu affiche une fréquence et une amplitude, tant que les temps/divi sont justes, c'est bon
Ce qu'il y a dans le fichier ont s'en tape, c'est du pré langage machine (qui serait différent sous une autre forme de stockage.
Ce n'est pas un gros inconvénient de mettre en zip
J'ai hâte de voir ça
____________________
Roro

   
Le 18/06/2016 à 23h49

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1844
Houla la
La modif des valeurs !!! Tu n'a pas cherché la simplicité ni la sobriété
J'espère que ce saucissonage de nombres sert ailleurs (codage du fichier ??)
Sinon, c'est franchement "luxueux".
____________________
Roro

   
Le 19/06/2016 à 10h38

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 336
Citation:
Ce qu'il y a dans le fichier ont s'en tape

Hem, hem... farceur ;)

Citation:
La modif des valeurs !!! Tu n'a pas cherché la simplicité ni la sobriété

ça fait beaucoup de lignes, en effet. Mais on doit se rapprocher d'un bon compromis "complexité technique/simplicité d'emploi", avec une zone sensible à la souris pour chaque chiffre, et clic droit/clic gauche pour en changer la valeur. Je n'ai pas pensé à reprendre nos essais du début de cette discussion, je suis parti sur une idée. Il y a peut-être moyen de simplifier.

Citation:
Sinon, c'est franchement "luxueux".

Et moins cher qu'un vrai ! 8-)

Il est quasiment dans sa forme définitive, il reste encore à :
  • revoir l'affichage de la courbe.
  • rendre permanent l'affichage des chiffres et de la courbe, car pour l'instant tout s'efface si on fait passer une fenêtre devant : nécessité d'apprendre les redraw, flush and so on, genre de trucs auxquels je n'ai encore rien pigé (je vais reprendre le souci de 1180michel, http://libertybasic.fr/forum/topic-438+question-sur-redraw.php).
  • a savoir récupérer le contenu d'une textbox quand sa fenêtre est fermée. Pour les combobox il suffit de transférer l'option sélectionnée pendant que la fenêtre est ouverte, mais pour le textbox ça ne marche pas ou je m'y prend mal.


Hop, au taf !

Bon dimanche.
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais 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 19/06/2016 à 14h38

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1844
Citation:
Il y a peut-être moyen de simplifier.

Si tu n'a pas besoin du saucissonnange des nombres ailleurs, pourquoi ne pas agir directement sur le nombre, au lieu de passer par des chaînes ?
freq1 = freq1 +/- 10, 100, 1000, 10000
Et afficher
handle, str$(freq1)
(en réalignant à droite, comme je l'avais fait sur un prop d'essai, et avec une police plus grosse (confort du clic)
Citation:
tout s'efface

Il faut mettre un:
handle, "flush" après la ligne d'affichage.
Citation:
contenu d'une textbox quand sa fenêtre est fermée

Je pense que tu peux mettre un:
handle du textbox, "!contents? var$" n'importe où et tu aura le contenu
Sinon, il faut mettre dans une variable avant la fermeture
Mais bon, var$ et une variable, on devrait donc pouvoir y accéder de partout (à condition d'avoir "lu" le textbox avant la fermeture avec:
handle du textbox, "!contents? var$"
____________________
Roro

   
Le 02/08/2016 à 17h12

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 336
Hello tout le monde !

Juste pour donner un signe de vie et dire un petit bonjour.

On avance, on avance, mais le chemin est long.

C'est fou ce qu'à chaque projet je minimise la longueur du chemin...

L'oscilloscope m'a donné beaucoup de fil à retordre, car il devait afficher l'impossible : placer en 200 pixels les milliers ou dizaines de milliers d'échantillons contenus dans la période de la somme des fréquences. Considérer qu'il y a plusieurs échantillons sur une seule colonne de pixels est logique, mais trompeur, car on arrive à une succession de mini maxi qui donne l'illusion d'une courbe-enveloppe, mais qui ne reflète pas du tout la réelle forme d'onde...

Donc, en désespoir de cause, s'il y a 200 pixels sur l'oscillo, j'y affiche 200 échantillons consécutifs : c'est ce qu'il y a dans le fichier, et ça renseigne beaucoup mieux sur la qualité de la numérisation : éviter les peignes et favoriser les belles courbes.

J'ai donc ajouté deux boutons pour déplacer la fenêtre d'affichage dans le fichier. Il y a encore un petit bug et une incertitude, mais on avance

Assez bavardé, voici la version à ce jour, pour les ceusses que ça intéresse, Et en zip, parce que le code est trop long pour le forum.
gbf 2 aout 2016.bas.zip

Je m'en vais voir les messages non lus depuis ma dernière connexion.

Et Roland tu avais raison pour mon "saucissonnage" de nombre, c'est drôlement compliqué, j'admet
A+
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais 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 02/08/2016 à 20h38

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1844
Gloups! J'ai testé sans toucher aux paramètres par défaut
L'affichage montre une onde amortie, c'est pas normal puisque le niveau est constant (70)
Avec 400 et 900 c'est correct, il n'y a pas d'amortissement
WT F ?
____________________
Roro

   
Le 03/08/2016 à 14h34

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 336
Que nenni ! ne pas confondre le niveau moyen fixé par le 070 et l'affichage du niveau instantané, qui est la stricte somme des niveaux de Gen.1 et Gen.2 à l'instant t. Clique sur le bouton "+" en bas à droite, tu devrais voir qu'elle s'amortira dans l'autre sens^^. En fait on explore la forme d'onde par pas de 200 échantillons

Si ça marche pas c'est qu'il y a un problème



Edité par Christophe Le 03/08/2016 à 14h54
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais 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 03/08/2016 à 18h47

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1844
Quand on somme deux ondes sans déphasage, il n'y a aucune raison d'avoir un résultat amorti
Citation:
dizaines de milliers d'échantillons

Si tu veux afficher des échantillons il faut mettre un commut Analogique/Echantilloneur
Une sinusoïde, c'est: "a sinus(oméga*t)", c'est pas des échantillons
A mon humble avis
____________________
Roro

   
Le 03/08/2016 à 23h02

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 336
Si, j'affiche bien des échantillons : dans la visu, horizontalement chaque pixel correspond à un calcul, et est séparé du précédent par une période de la fréquence d'échantillonnage, la même que pour le fichier audio. On "voit" donc les échantillons tels qu'ils sont créés. Les différences avec la génération du fichier audio sont l'amplitude, et des bornes de début et de fin des calculs adaptés à la taille de la visu.

L'écran de visu joue aussi le rôle de vue analogique, en admettant qu'entre deux échantillons la vraie vie trace une droite et non une courbe compliquée qui rendrait le tracé complètement faux.

Citation:
il n'y a aucune raison d'avoir un résultat amorti

Il n'y a rien d'amorti, ce sont deux ondes entretenues simultanément présentes sur le même fil ;) "+" et "-" pour naviguer à l'intérieur de la forme d'onde...



Edité par Christophe Le 03/08/2016 à 23h08
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais 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 04/08/2016 à 18h14

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1844
Citation:
Il n'y a rien d'amorti

ça , c'est une onde amortie--->[
____________________
Roro

   
Le 04/08/2016 à 22h56

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 336
Non, ça y ressemble, mais c'est pas, c'est cyclique et voici les 200 échantillons suivants :



A défaut d'avoir simulé en JB un circuit RLC en régime amorti (ça devrait pas être trop compliqué à faire, je suppose. Si j'ai deux minutes un jour...)
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais 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 05/08/2016 à 09h22

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1844
Ah ok, mais alors, il vaut mieux garder le premier type d'affichage avec base de temps réglable
Parce que là, ça prête à confusion
____________________
Roro

   
Le 05/08/2016 à 18h12

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 336
En effet, mais c'est parce que je n'ai pas fourni les bonnes données pour une illustration du fonctionnement de la visu, en fait je cherchais une incohérence dans la durée à afficher dans la visu (il y en a au moins une). L'essentiel était déjà d'obtenir le bon fonctionnement de l'affichage de la courbe, et de ce coté là, c'est OK.

l'étape suivante est de créer un ascenseur horizontal pour naviguer plus facilement qu'avec les boutons "+" et "-", et concevoir le passage en "plein écran", qui pour le coup, t'aurait tout de suite détrompé quant à la nature de la courbe^^.

Cependant, telle qu'elle est, la visu est parlante, car elle est le reflet fidèle de ce qu'il y a dans le fichier, et on sait ce qu'on envoie au système audio : toute autre solution entraine une "conversion" d'une fréquence d'échantillonnage à une autre, et peut amener des surprises.

Par exemple, une période d'une sinusoïde de 1000 Hz dure 1 milliseconde. Si on veut afficher cette période sur un écran de 200 pixels de large, l'écart de temps entre deux pixels vaudra 0.001/200 = 5 microsecondes. Cette durée représente une période de la fréquence d'échantillonnage "visu", qui vaut 1/T = 1/0.000005, soit ...200 kHz

En numérisant à 200 kHz on obtient plus de détails qu'à 44.1 : l'affichage est déjà trompeur. Et si on perd des informations parce qu'on aura numérisé une fréquence supérieure à (44.1)/2 (le théorème de Nyquist Shannon le dit et notre programme peut le faire), l'affichage, qui numérise à 200 kHz, ne perdra pas d'information et affichera une courbe erronée, par rapport au contenu du fichier.

Voilà donc pourquoi je préfère une visu "1 pixel = 1 échantillon du fichier", même si elle est parfois "trompeuse" de prime abord...

a+
'tophe
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais 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 05/08/2016 à 18h31

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1844
Bon, ben alors il faut afficher au moins deux périodes de la fréquence la plus basse
Mais moi je trouve que les premiers modes d'affichages étaient très bien; je ne suis pas difficile
____________________
Roro

   
Le 28/01/2017 à 11h02

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1844
Je déterre le sujet, car j'ai trouvé ça chez les anglophones
Je n'ai pas encore regardé de près
Je le livre tel quel à ta sagacité:
Code VB :
 
    'This program lets you create little sound samples
    'It uses 11025 samples per second, 8 bits per sample
    'and mono sound.
    'One second of sound will use 11025 bytes, each
    'byte represents the volume of the sound at any
    'point in time. (0-255) The changing volume creates
    'the frequency of the sound you hear.
    'The sound can be left pure or modulated by another
    'tone
    true=1  'program variables
    false=0
    dim hz$(12)
    dim mhz$(12)
    hz$(0)="55.000(A)"
    hz$(1)="58.270(A#)"
    hz$(2)="61.735(B)"
    hz$(3)="65.406(C)"
    hz$(4)="69.296(C#)"
    hz$(5)="73.416(D)"
    hz$(6)="77.782(D#)"
    hz$(7)="82.407(E)"
    hz$(8)="87.307(F)"
    hz$(9)="92.499(F#)"
    hz$(10)="97.999(G)"
    hz$(11)="103.826(G#)"
    hz$(12)="110.000(A)"
    mhz$(0)="130.813(C)"
    mhz$(1)="261.626(C)"
    mhz$(2)="523.251(C)"
    mhz$(3)="1046.502(C)"
    wv$(0)="Sine"
    wv$(1)="Square"
    wv$(2)="Saw Tooth"
    wv$(3)="Triangular"
    mwv$(0)="Sine"
    mwv$(4)="None"
    vo$(0)="10%"
    vo$(1)="20%"
    vo$(2)="30%"
    vo$(3)="40%"
    vo$(4)="50%"
    vo$(5)="60%"
    vo$(6)="70%"
    vo$(7)="80%"
    vo$(8)="90%"
    vo$(9)="100%"
    mvo$(0)="10%"
    mvo$(1)="20%"
    mvo$(2)="30%"
    mvo$(3)="40%"
    mvo$(4)="50%"
    mvo$(5)="60%"
    mvo$(6)="70%"
    mvo$(7)="80%"
    mvo$(8)="90%"
    mvo$(9)="100%"
    du$(0)="100ms"
    du$(1)="500ms"
    du$(2)="1000ms"
    du$(3)="5000ms"
  nomainwin    'open our window
    WindowWidth = 600: WindowHeight = 500
    UpperLeftX = int((DisplayWidth-WindowWidth)/2)
    UpperLeftY = int((DisplayHeight-WindowHeight)/2)
    graphicbox  #scope.graph, 50, 20, 500, 300
    statictext  #scope.hz, "Hertz" ,125, 360,80,20
    combobox    #scope.hz, hz$(),[hertz],125,380,80,20
    combobox    #scope.mhz,mhz$(),[mhertz],125,420,80,20
    statictext  #scope.wv, "Wave Form" ,225, 360,80,20
    combobox    #scope.wv, wv$(),[wave],225,380,80,20
    combobox    #scope.mwv,mwv$(),[mwave],225,420,80,20
    statictext  #scope.vo, "Volume" ,325, 360,80,20
    combobox    #scope.vo, vo$(),[volume],325,380,80,20
    combobox    #scope.mvo,mvo$(),[modvol],325,420,80,20
    statictext  #scope.du, "Duration" ,420, 360,80,20
    combobox    #scope.du, du$(),[duration],420,380,80,20
    button      #scope.save, "Save",[save],UL,125,325
    button      #scope.play, "Play",[play],UL,225,325
    button      #scope.loop, "Loop",[repeat],UL,325,325
    button      #scope.stop, "Stop",[stop],UL,425,325
  open "Tone Generator" for window_nf as #scope
    print #scope, "trapclose [quit]"  'draw the scope background and flush it
    print #scope.graph, "down"
    for y= 300 to 0 step -2
        print #scope.graph, "color ";y/2+100;" ";y/2+100;" ";y/2+100
        print #scope.graph, "line 0 ";y;" ";"500 ";y
        print #scope.graph, "line 0 ";y-1;" ";"500 ";y-1
    next y
    print #scope.graph, "color yellow"
    print #scope.graph, "line 0 150 500 150"
    print #scope.graph, "flush"
    print #scope.hz, "select 55.000(A)" 'set the initial combobox data
    hertz=55
    print #scope.wv, "select Sine"
    wave$="Sine"
    print #scope.vo, "select 100%"
    volume=1
    print #scope.du, "select 1000ms"
    duration=1
    print #scope.mhz, "select 261.626(C)"
    mhertz=261.626
    print #scope.mwv, "select Sine"
    mwave$="Sine"
    print #scope.mvo, "select 10%"
    modvol=.1
    gosub [chart]
    'now wait for user input
  wait
  [hertz]
    print #scope.hz, "contents? text$"  ' button and combobox handlers
    hertz=val(text$)
    gosub [chart]
  wait
  [mhertz]
    print #scope.mhz, "contents? text$"
    mhertz=val(text$)
    gosub [chart]
  wait
  [wave]
    print #scope.wv, "contents? wave$"
    gosub [chart]
  wait
  [mwave]
    print #scope.mwv, "contents? mwave$"
    gosub [chart]
    wait
    [volume]
    print #scope.vo, "contents? text$"
    volume=val(text$)/100
    gosub [chart]
  wait
  [modvol]
    print #scope.mvo, "contents? text$"
    modvol=val(text$)/100
    gosub [chart]
  wait
  [duration]
    print #scope.du, "contents? text$"
    duration=val(text$)/1000
    gosub [chart]
  wait
  [stop]
    playwave ""
    repeat=false
  wait
  [save]
    filedialog "Save As...", "*.wav", fileName$
    open fileName$ for output as #t
    print #t, header$
    print #t, tone$
    close #t
  wait
  [repeat]
    repeat=true
    ' now drop down to [play]
  [play]
    samplesPerSecond=11025  'create the .wav file header
    channels=1 'mono
    bitsPerSample=8
    blockAlign=(bitsPerSample*channels)/8
    bytesPerSecond=blockAlign*samplesPerSecond
    'this is the only element that changes in the header
    dataSize=len(tone$)  'normally dataSize=bytesPerSecond*duration
    waveSize=dataSize+36
    header$=""
    header$=header$+"RIFF"
    number=waveSize
    byte4=int(number/16777216)
    number=number-(byte4*16777216)
    byte3=int(number/65536)
    number=number-(byte3*65536)
    byte2=int(number/256)
    byte1=number-(byte2*256)
    header$=header$+chr$(byte1)+chr$(byte2)+chr$(byte3)+chr$(byte4) ' lof -8
    header$=header$+"WAVE"
    header$=header$+"fmt "
    header$=header$+chr$(16)+chr$(0)+chr$(0)+chr$(0) ' fmt chunk length 16 bytes
    header$=header$+chr$(1)+chr$(0) ' pcm
    header$=header$+chr$(channels)+chr$(0) ' 1 = mono
    number=samplesPerSecond
    byte4=int(number/16777216)
    number=number-(byte4*16777216)
    byte3=int(number/65536)
    number=number-(byte3*65536)
    byte2=int(number/256)
    byte1=number-(byte2*256)
    header$=header$+chr$(byte1)+chr$(byte2)+chr$(byte3)+chr$(byte4) ' samples per second
    number=bytesPerSecond
    byte4=int(number/16777216)
    number=number-(byte4*16777216)
    byte3=int(number/65536)
    number=number-(byte3*65536)
    byte2=int(number/256)
    byte1=number-(byte2*256)
    header$=header$+chr$(byte1)+chr$(byte2)+chr$(byte3)+chr$(byte4) ' bytes per second
    number=blockAlign
    byte2=int(number/256)
    byte1=number-(byte2*256)
    header$=header$+chr$(byte1)+chr$(byte2) ' block align
    number=bitsPerSample
    byte2=int(number/256)
    byte1=number-(byte2*256)
    header$=header$+chr$(byte1)+chr$(byte2) ' bits per sample
    header$=header$+"data"
    number=dataSize
    byte4=int(number/16777216)
    number=number-(byte4*16777216)
    byte3=int(number/65536)
    number=number-(byte3*65536)
    byte2=int(number/256)
    byte1=number-(byte2*256)
    header$=header$+chr$(byte1)+chr$(byte2)+chr$(byte3)+chr$(byte4) ' number of data bytes
  open "tone.wav" for output as #tone
    print #tone, header$
    print #tone, tone$
    close #tone
    if repeat then
        playwave "tone.wav", loop
    else
        playwave "tone.wav"
    end if
  wait
  [chart]
    samplesPerSecond=11025
    channels=1 'mono
    bitsPerSample=8
    blockAlign=(bitsPerSample*channels)/8
    bytesPerSecond=blockAlign*samplesPerSecond
    dataSize=bytesPerSecond*duration
    [createwavedata]
    tone$=""
     select case wave$
 
            case "Sine"
                tone$=""
                degree=0
                increment=360/(samplesPerSecond/hertz)
                for byte = 1 to dataSize
                    degree=degree+increment
                    if degree>359 then degree=0
                    ypos=(sin(degree/57.29577951)*128*volume)+128
                    t=int(ypos)
                    tone$=tone$+chr$(t)
                next
             case "Square"
                period=samplesPerSecond/hertz/2
                counter=0
                high=true
                for byte= 1 to dataSize
                if high then
                    ypos=128+(128*volume)
                    counter=counter+1
                    if counter>=period then
                        high=false
                        counter=0
                   end if
                 else
                    ypos=128-(128*volume)
                    counter=counter+1
                    if counter>=period then
                        high=true
                        counter=0
                    end if
                 end if
                 t=int(ypos)
                 if t<0 then t=0
                 if t>255 then t=255
                 tone$=tone$+chr$(t)
                 next
            case "Saw Tooth"
                period=samplesPerSecond/hertz
                increment=(256*volume)/period
                counter=0
                ypos=128+128*volume
                for byte= 1 to dataSize
                    if counter>=period then
                        ypos=128+128*volume
                        counter=0
                    end if
                ypos=ypos-increment
                counter = counter +1
                t=int(ypos)
                if t<0 then t=0
                if t>255 then t=255
                tone$=tone$+chr$(t)
                next
            case "Triangular"
                period=samplesPerSecond/hertz/2
                increment=(256*volume)/period
                counter=0
                ypos=128+128*volume
                high=true
                for byte= 1 to dataSize
                if high then
                    ypos=ypos-increment
                    counter=counter+1
                    if counter>=period then
                        high=false
                        counter=0
                   end if
                 else
                    ypos=ypos+increment
                    counter=counter+1
                    if counter>=period then
                        high=true
                        counter=0
                    end if
                 end if
                 t=int(ypos)
                 if t<0 then t=0
                 if t>255 then t=255
                tone$=tone$+chr$(t)
                next
    end select
  [modulatewavedata]
    temp$=tone$
    tone$=""
    select case mwave$
            case "Sine"
                degree=0
                increment=360/(samplesPerSecond/mhertz)
                for byte = 1 to dataSize
                    degree=degree+increment
                    if degree>359 then degree=0
                    ypos=(sin(degree/57.29577951)*128*modvol)+128
                    t=int(ypos)
                    t=t+asc(mid$(temp$,byte,1))-128
                    if t<0 then t=0
                    if t>255 then t=255
                    tone$=tone$+chr$(t)
                next
            case "None"
            tone$=temp$
            temp$=""
    end select
    xpos=0  'graph the first 500 values from the file
    ypos=150
    print #scope.graph, "discard ; redraw ; place 0 150"
    for byte = 1 to 500
        ypos=asc(mid$(tone$,byte,1))+22
        print #scope.graph, "color red ;goto ";xpos;" ";ypos
        xpos=xpos+1
    next
  wait
  [quit]
    close #scope
  end
 
 
' frequency chart of the musical scale

'0  A        55.000  110.000  220.000  440.000    880.000  1,760.000
'1  A#/Bb    58.270  116.541  233.082  466.164    932.328  1,864.655
'2  B        61.735  123.471  246.942  493.883    987.767  1,975.533
'3  C        65.406  130.813  261.626  523.251  1,046.502  2,093.005
'4  C#/Db    69.296  138.591  277.183  554.365  1,108.731  2,217.461
'5  D        73.416  146.832  293.665  587.330  1,174.659  2,349.318
'6  D#/Eb    77.782  155.563  311.127  622.254  1,244.508  2,489.016
'7  E        82.407  164.814  329.628  659.255  1,318.510  2,637.020
'8  F        87.307  174.614  349.228  698.456  1,396.913  2,793.826
'9  F#/Gb    92.499  184.997  369.994  739.989  1,479.978  2,959.955
'10  G       97.999  195.998  391.995  783.991  1,567.982  3,135.963
'11  G#/Ab  103.826  207.652  415.305  830.609  1,661.219  3,322.438
'12  A      110.000  220.000  440.000  880.000  1,760.000  3,520.000

 
____________________
Roro

   
Le 02/02/2017 à 18h11

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 336
Pas mal... Joli, même, et plus simple que le mien ;) (mais il est vrai que je voulais aussi une interface spécifique, laquelle a bien alourdi les travaux de recherche et le code, pour un résultat "qui fonctionne" mais qui n'est pas top. Egalement, j'avais "fouillé" plus loin dans les options et les possibilités du généBF)

Il manipule des fréquences à virgule, ce que je m'étais interdit parce que j'utilisais le ppcm (ou le pgcd ? ) des fréquences des générateurs pour calculer la durée de la période résultant de leur mélange.

L'utilisation de notes musicales est une idée.

Le graphe n'affiche que les premiers échantillons du fichier, tout comme le mien.

Je regarderai la mécanique en détail plus tard.

Merci pour cette petite contribution.

A+
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais 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

   
Général » Générateur BF Ou qui tente de l'être  

 |  |

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