Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/06/2024, à 06:55

temps

[résolu] problème de manipulation sur for en c++

Bonjour,
Je dessine des formes en c++
Temps que je dessinais ces formes avec à une échelle prédéfinie tout allait bien. (nombre d'unité fixe que je connaissais puisque choisit avant d'écrire le code)
J'ai voulu ajouter la possibilité de changer d'échelle, mais je n'arrive pas à écrire un code qui va bien.

        // calcul du nombre d'unité
        int dif,dif1,diif1;
        dif = k3[j]-k1[j];   //hauteur du point haut moins la hauteur du point bas coté montant
        for (int i=0; i<dif; i = i + nbumonte){dif1 =i;} // je calcul combien de points à dessiner
        // dif1 = dif/nbumonte;
        if (dif1<1){dif1=1;}
        if (dif1<nbumonte){diif1=nbumonte-dif1;}// calcul rattrapage pour garder le même nombre d'unité
        int dif2,dif3,diif3;
        dif2 = k3[j]-k5[j];  //hauteur du point haut moins la hauteur du point bas coté descendant
        for (int i=0; i<dif2; i = i + nbudescend){dif3 =i;}
        //dif3 = dif2/nbudescend;
        if (dif3<1){dif3=1;}
        if (dif3<nbudescend){diif3=nbudescend-dif3;} //rattrapage pour garder le même nombre d'unité
        //fin calcul nombre unité

et dans le switch j'ai

 for (int i = (k1[j]+2); i < (k3[j]-2); i++) { f<<tabn[i];for(int xy =0; xy < dif1; xy++){i++;}}

En détail, si cela intéresse pour décrire le contexte, toutes les voyelles peuvent être dessinée avec la même forme, c'est juste le nombre d'unité de temps qui change (l'échelle), imaginez un serpent qui ondule qui vient se heurter à un bloc bien dense.
Donc pour pouvoir avoir les voyelles j'ai ajouté à mon application, deux variateurs de nombre d'unités. Mais je n'arrive pas à écrire le code qui garde toujours la même forme quelque soit le nombre d'unité de base.
Est-ce que quelqu'un sait comment faire ?

Cordialement

P.S. ça peut être utile pour avoir une idée des valeurs, sous cette forme le i a 7 unités, le u 11 unité, puis le a, le o , le ou, le ai, le e ... et le dessin est entre 1 et 250 unités de hauteur avec les courbes qui suivent plusieurs lois et la forme dessinée crée avec le tableur  est :

127,128,127,128,133,125,135,124,136,126,138,119,139,115,136,113,133,115,128,118,128,121,133,120,140,120,144,120,145,122,147,113,147,107,144,102,139,103,135,106,135,110,141,111,151,111,157,110,160,112,163,101,164,90,160,84,154,85,145,92,140,106,140,116,146,120,151,120,157,120,163,103,166,88,164,77,158,77,148,85,143,99,147,106,159,107,164,110,168,118,167,103,172,81,176,64,170,62,158,73,148,98,142,114,147,119,156,119,165,125,164,110,167,89,169,68,164,65,155,70,149,90,152,101,162,106,166,118,164,130,156,101,161,78,157,69,149,73,145,91,151,101,163,105,170,117,174,115,173,95,166,81,154,78,139,82,135,99,145,108,155,112,167,119,182,101,190,79,181,70,164,73,139,85,128,105,142,111,156,111,173,112,195,86,205,66,196,58,174,66,144,85,123,108,122,110,148,102,172,93,190,92,212,68,218,53,207,49,185,56,159,67,149,75,157,82,178,76,197,70,211,77,221,60,221,49,211,44,191,49,173,57,164,65,171,70,190,65,206,64,213,70,219,61,215,55,201,54,181,63,160,76,149,88,145,101,146,118,146,118,158,106,177,94,193,72,199,59,197,56,181,63,166,75,159,83,163,84,174,85,186,77,193,71,198,67,208,49,212,41,209,44,194,54,176,69,167,85,166,87,170,88,173,90,177,85,177,78,181,70,193,56,196,55,191,66,178,80,166,89,162,92,164,93,164,96,160,101,152,107,146,111,141,113,135,117,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127,128,127

Dernière modification par temps (Le 20/06/2024, à 16:00)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#2 Le 19/06/2024, à 08:39

iznobe

Re : [résolu] problème de manipulation sur for en c++

Bonjour , c ' est une echelle de quel type ?

en base 10 , c ' est tres simple a calculer .


Mais comme tu donnes du code , avec tres peu d' explication , ni meme le resultat attendu , je doute que quelqu un passe par là et te donnes un debut de solution .
ton code parle de nombre d' unité , et toi tu parles d' echelle , y a pas un soucis ?


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#3 Le 19/06/2024, à 09:55

temps

Re : [résolu] problème de manipulation sur for en c++

Bonjour,
merci pour la réponse. je corrige les fichiers execu du code donnée dans cette application graphique sous qt
Il n'y a pas de problème dans l'usage des termes, une échelle est une dimension, ici ce sont bien des changements d'échelle sur l'axe des abscisses qui sont donnés par l'application. Ces changements d'échelles se font par rapport à une unité, cette unité est celle imposée par les normes du moment. Je pense avoir utilisé les termes les plus approprié pour décrire ce que je cherche à dire. En plus de détail :
Dans ce système de dessin seul l'axe des abscisse est modifié. Les positions sur l'ordonné reste fixe. Nous allons avoir toujours la même distance entre 2 points sur l'axe des abscisses, nous sommes bien en base 10, et nous élargissons la forme.
Au moment plus rien ne marche, je ne génère plus que des signaux carrés
Comme l'effet s'obtient à 63% de la distance de chaque courbe entre deux point cela donne comme écriture pour le cas entre 13 et 23 unités abscisse, les valeur k1 et k3 étant sur les ordonnés:

            for (int i=0; i<dif; i = i + nbumonte -12 ){dif1 =i;}
            for (int i = (k1[j]); i < (k1[j]+1); i++) { for (int k = 0; k < 3; k++) { f<<tabn[i]; } }
            for (int i = (k1[j]+1); i < (k1[j]+2); i++) { for (int k = 0; k < 2; k++) { f<<tabn[i]; } }
            for (int i = (k1[j]+2); i < (k1[j]+3); i++) { for (int k = 0; k < 1; k++) { f<<tabn[i]; } }
            for (int i = (k1[j]); i < (k3[j]-2); i++) { f<<tabn[i];for(int xy =0; xy < dif1; xy++){i++;}}
            for (int i = (k3[j]-3); i < (k3[j]-2); i++) { for (int k = 0; k < 1; k++) { f<<tabn[i]; } }
            for (int i = (k3[j]-2); i < (k3[j]-1); i++) { for (int k = 0; k < 2; k++) { f<<tabn[i]; } }
            for (int i = (k3[j]-1); i < (k3[j]); i++) { for (int k = 0; k < 3; k++) { f<<tabn[i]; } }
            for (int i = 0; i < (k4[j]+k7); i++){ f<<tabn[(k3[j])]; }

mais je dois avoir une erreur sévère dans le code car je n'ai plus que des signaux carré, même si la forme générale est la bonne, c'est ma manière de varier qui ne s'écrit pas comme il faut

P.S. Pour essayer de mieux dire les choses, je dessine des formes à l'aide d'une série de 2 points, (un haut et un bas). Je relie ces deux points à l'aide d'une courbe, il faut que cette courbe ait toujours le même nombre d'unités sur l'axe des abscisse quelque soit la variation sur l'axe des ordonnés. Ce que j'ai essayé de faire, c'est d'avoir une autre constante d'espace sur l'axe des x, entre 2 points. Actuellement j'ai tout qui s'écrit à la hauteur des 2 point, je n'ai plus de courbe. Une erreur sévère dans le code, mais je n'arrive pas à trouver ou. A la lecture finale ça ne se voit pas car normalise "-norm" de sox corrige le fichier final, mais ça me gène de ne pas avoir la forme de courbe désirée, car c'est la forme de courbe qui crée les inerties et les cinétique qui produisent le son que je désire. Si je ne maitrise pas cette partie, je ne peux pas avancer dans mon projet. En fait c'est très important, car le nombre d'unité d'une forme, donne l'effet, c'est comme un marqueur, une porteuse en électricité. Nous pouvons marier deux formes et les entendre parfaitement, pour cela il suffit que les deux formes aient un nombre d'unité différent sur l'axe des abscisses. D'où l'importance de maitriser les courbes. J'y arrivais en détaillant une seule base d'unité, mais j'y arrive plus maintenant que j'ai introduit la possibilité de plusieurs bases.
Cordialement

Dernière modification par temps (Le 20/06/2024, à 09:23)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#4 Le 19/06/2024, à 14:14

temps

Re : [résolu] problème de manipulation sur for en c++

Oups après avoir tout détruit, je suis bon pour reprendre mes 11 générateurs wav à zéro, j'ai enfin trouvé ou était l'erreur dans le code.
En détail, je n'ai pas mis de sécurité dans le code et impérativement la première valeur de la forme est celle du bas, la deuxième celle du haut.
Si nous regardons le code de la forme donnée, quand j'ai écris à la main j'ai inversé le sens et op tout mes générateur wav sont tombé en panne, j'avais bien vu que ça marchait toujours pour toute les autres formes, je ne sais pas pourquoi je suis partie sur l'idée qu'un bug était apparu sur mes générateurs wav, et ce n'était pas le cas. la 128,133, il fallait 127,133 (128 est un point haut) et mettre la première valeur à la fin pour respecter l'ordre. Pas d'erreur dans le tableur c'est en ajustant à la fin que je me suis trompé.
Le bilan reste positif car l'événement m'a poussé à aller controler le fichier wav avant correction sox, et seul 3 des générateurs wav me semble digne d'être garder, les autres je vais entièrement les reprendre pour que la courbe ait exactement la forme désirée.
Cordialement

P.S.
Comme dit l'erreur n'était pas dans la construction des for, mais dans les données, cela m'a permis d'améliorer le ri avec les boucle for, car maintenant le repère n'est plus juste l'axe des ordonnées, mais la programmation d'un ajustement en fonction de la valeur des abscisses. Plus tard et de manière à varier les formes dans les générateurs j'ajouterai des sortie en fonction de l'écart entre le x et les delta (y), mais au plus simple le tri donne :

    // calcul du nombre d'unité
        /**********tri k3-k1**********/
   
        int dif,dif1,je;
        dif = k3[j]-k1[j];
        for (int i=0; i<dif; i = i + nbumonte){dif1 =i;}
        // dif1 = dif/nbumonte;
        if (dif1<nbumonte){mem3 =1;}
        if (dif1 > nbumonte){mem3 =2;}        
        if (dif < 6){ switch(dif){
                      case 5: mem3=3;  break;
                      case 4: mem3=4;  break;
                      case 3: mem3=5;  break;
                      case 2: mem3=6;  break;
                      case 1: mem3=7;  break;
                      }
        
        /**********tri k5-k1**********/        
        int dif2,dif3;
        dif2 = k3[j]-k5[j];
        for (int i=0; i<dif2; i = i + nbudescend){dif3 =i;}
        //dif3 = dif2/nbudescend;
        if (dif3 < nbudescend){mem31 =1;}
        if (dif3 > nbudescend){mem31 =2;}
        if (dif2 < 6){ switch(dif2){
                      case 5: mem31=3;  break;
                      case 4: mem31=4;  break;
                      case 3: mem31=5;  break;
                      case 2: mem31=6;  break;
                      case 1: mem31=7;  break;
                      }

        //fin calcul nombre unité 

Dernière modification par temps (Le 20/06/2024, à 09:11)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#5 Le 20/06/2024, à 08:53

temps

Re : [résolu] problème de manipulation sur for en c++

Bonjour,
j'ai corrigé, j'ai posté en résolu un peu vite. J'ai bien trouvé la cause qui faussait tous mes générateurs, mais c'est pas pour ça qu'ils dessinent exactement ce que je veux.
Lors de la création des générateurs comme le premier fonctionnais bien, et qu'ensuite sox corrige, je ne me suis pas aperçu que les nouveaux générateur wav ajoutés ne faisait pas ce qui était attendu (signaux carrés à la place de courbes)

Je vais essayer de poser le problème.
1-Nous dessinons des formes avec une série de point haut et de point bas sur l'axe des ordonnés.
2- Nous relions ces 2 points à l'aide d'une courbe qui a toujours la même valeur sur l'axe des abscisse.
3- Nous avons plusieurs formes de courbe, chaque générateur possède sa propre forme car à la décélération nous créons une dépression qi crée le son, en plus simple c'est la forme de la courbe qui cré l'inertie. donc dans un générateur les courbes doivent toutes avoir la même forme.
4- Nous avons introduit dans les générateurs wav la possibilité de sélection la valeur constante des abscisses, ce qui fait que l'équilibre entre la valeur des ordonnés et des abscisses varie selon la demande faite pour l'axe des abscisses.

Au moment j'envisage une cascade de switch, pour trier j'ai commencé à écrire le code dans le message précédent.

J'espère avoir bien détailler le problème, si quelqu'un trouve ça simple, je suis preneur d'une solution, de mon coté je vais essayer d'avancer.
Cordialement


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#6 Le 20/06/2024, à 11:52

krodelabestiole

Re : [résolu] problème de manipulation sur for en c++

temps a écrit :

2- Nous relions ces 2 points à l'aide d'une courbe qui a toujours la même valeur sur l'axe des abscisse.

ça ressemble à une droite verticale a priori ?

En ligne

#7 Le 20/06/2024, à 14:35

temps

Re : [résolu] problème de manipulation sur for en c++

Bonjour,
merci pour la réponse.
Oui tout à fait le cas le plus simple est un trait vertical comme ici présenté.
Oui tout à fait toute projection d'une courbe sur un axe est toujours une droite, ici l'axe des abscisses.
Pendant mes études dans les années 80, avec notre enseignant nous nous amusions à créer des trucs sympa avec des signaux carrés.
J'ai 11 générateur wav, dont un en triangle (simple trait), un en carré, puis différentes formes de courbe dont une type 1-1-2-3-5-8- fibonaci, chaque courbe a une sonorité différente
avec les switch, ça marche bien, j'avais beaucoup d'erreur avec les for, je travaille dessus, j'en suis là

        // calcul du nombre d'unité
        /**********tri k3-k1***front-montant*******/

        int dif,dif1,dif6,tri;
        dif = k3[j]-k1[j];
        
        if (dif > 5){

            if (dif< nbumonte){tri = 1;} // si les unités de la hauteur du front est inférieur aux unités de l'axe des x
            if (dif>= nbumonte){tri = 2;} // si les unités de la hauteur du front est supérieur aux unités de l'axe des x

            switch(tri) {
            case 1:
                //for (int i=0; i<nbumonte; i = i + dif){dif6 =i;} // calcul du nombre d'unité sur x pour chaque unité y
                dif1 = nbumonte / dif ;
                dif6 = nbumonte % dif ;
                mem5= 8;
                if (dif1 > 1){mem5 =9;}
                break;
            case 2:
                //for (int i=0; i<dif; i = i + nbumonte){dif1 =i;}// calcul du nombre d'unité sur y pour chaque unité x
                dif1 = dif / nbumonte ;
                dif6 = dif % nbumonte ;
                mem5 =1;
                if (dif1 > 1){mem5 =2;}
                break;
            }
        }

        if (dif < 6){ switch(dif){
            case 5: mem5=3;  break;
            case 4: mem5=4;  break;
            case 3: mem5=5;  break;
            case 2: mem5=6;  break;
            case 1: mem5=7;  break;
            }}

        /**********tri k5-k1***front descendant*******/
        int dif2,dif3,dif5,tri1;
        dif2 = k3[j]-k5[j];
        
                if (dif2 > 5){

            if (dif2< nbudescend){tri1 = 1;} // si les unités de la hauteur du front est inférieur aux unités de l'axe des x
            if (dif2>= nbudescend){tri1 = 2;} // si les unités de la hauteur du front est supérieur aux unités de l'axe des x

            switch(tri1) {
            case 1:
                //for (int i=0; i<dif2; i = i + nbudescend){dif3 =i;} // calcul du nombre d'unité sur x pour chaque unité y
                dif3 = nbudescend / dif2;
                dif5 = nbudescend % dif2;
                mem51= 8;
                if (dif3 >1){mem51 =9;}
                break;
            case 2:
                //for (int i=0; i<dif2; i = i + nbudescend){dif3 =i;}// calcul du nombre d'unité sur y pour chaque unité x
                dif3 = dif2 / nbudescend ;
                dif5 =  dif2 % nbudescend;
                mem51= 1;
                if (dif3 >1){mem51 =2;}
                break;
            }
        }
            if (dif2 < 6){ switch(dif2){
            case 5: mem51=3;  break;
            case 4: mem51=4;  break;
            case 3: mem51=5;  break;
            case 2: mem51=6;  break;
            case 1: mem51=7;  break;
            }
      }

        //fin calcul nombre unité       

Ce qui m'a trompé c'est sox qui est très très puissant, sox a masquer mes erreurs de code en transformant mes signaux carré en courbes comme il faut.
même avec un mauvaix code sox répare trop fort les dev de sox, mais bon, je veux avoir les bons wav

Je poste en résolu, le code donné avec les switch va bien, il ne me reste qu'a pousser les travaux dans le second switch pour dessiner les formes de courbes désiré

P.S.Retour d'info, ça déchire, sur la voix humaine, simplement avec les signaux triangulaire c'est déjà top, l'erreur a été salvatrice
j'ai injecté le code des 3 premiers générateurs en téléchargement, le temps de finir tous les générateurs, et je corrige tous les exemples donnés sur le site.
Cordialement

Dernière modification par temps (Le 22/06/2024, à 04:59)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne