Forum Liberty Basic France
• Index
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
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 v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Citation:
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
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
Roro
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".
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
Roro
Citation:
Hem, hem... farceur
Citation:
ç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:
Et moins cher qu'un vrai ! 8-)
Il est quasiment dans sa forme définitive, il reste encore à :
Hop, au taf !
Bon dimanche.
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 v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Citation:
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:
Il faut mettre un:
handle, "flush" après la ligne d'affichage.
Citation:
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$"
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
Roro
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+
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 v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
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 ?
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
Roro
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
Si ça marche pas c'est qu'il y a un problème
Edité par Christophe Le 03/08/2016 à 14h54
____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Quand on somme deux ondes sans déphasage, il n'y a aucune raison d'avoir un résultat amorti
Citation:
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
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
Roro
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 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
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

Edité par Christophe Le 03/08/2016 à 23h08
____________________
Just BASIC v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
Citation:
ça , c'est une onde amortie--->[
Il n'y a rien d'amorti
ça , c'est une onde amortie--->[

____________________
Roro
Roro
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...)

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 v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
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
Parce que là, ça prête à confusion
____________________
Roro
Roro
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
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 v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
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
Mais moi je trouve que les premiers modes d'affichages étaient très bien; je ne suis pas difficile
____________________
Roro
Roro
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 :
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
Roro
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+

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 v2.0 :
utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc
Just BASIC v2.0 :
• Index
2 Utilisateurs en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 2 Visiteurs
Utilisateurs en ligne : Aucun membre connecté
Utilisateurs en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie