script modification de texte sur page en fonction d'un selec

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : script modification de texte sur page en fonction d'un selec

par ant » 09 mai 2006, 11:59

Etant musicien, je me permets d'intervenir car a mon avis il y a une omission importante dans la discution.

Je m'adresse surtout à ph.rincon et à tous les musiciens ici. Pour les autres, désolé si mon langage est un peu abstrait.

L'algorithme proposé par Vaedan est trés juste mais seulement si on suit le cycle des quintes (C, G, D, A, E, B, F#, C# etc)

Néanmoins, sont ignorées toutes les tonalités qui suivent le cycle des quartes (F, Bb, Eb, Ab, Db, Gb, Cb)

Pour être plus clair, si je dispose d"un morceau en C, disons une suite d'accords quelconque et, si je veux la transposer 1 ton en dessous, ca me donne une tonalité en A#.
Hors, aucun morceau est écrit en A#. On choisira de préférence une tonalité en Bb et une tonalité en Bb n'est pas égale à une tonalité en A# car les altérations à la clé changent complètement.

Donc ma question est:

Comment fais tu donc pour gérer ces altérations et prendre en compte le fait qu'un utilisateur puisse au choix définir une tonalité en C# ou Rb ou A# et Bb etc?

J'espère que je me susi fait comprendre.

par Cyrano » 04 mai 2006, 21:15

Mouais, ben les expressions régulières vont à mon sens être la solution la plus appropriée. Il faut créer des "masques" pour isoler la note à transposer : donc on décompose :
- [
- A (ou B, ou F#, etc..)
- m (ou M, ou m7 etc...)
- ]
Ça va donner quelque chose du genre:
$masque = "#\[(A|A\#|B|..etc..)m?(?:7|9)?\]#"i;
Ensuite la fonction de Vaedan pour la transposition, la réécriture avec preg_replace() et l'affichage de la version transposée.

...suite...

par phrincon » 04 mai 2006, 21:03

En fait le problème est moins compliqué que tu l'imagine.

Un DOm7 (do mineur 7) devient un REm7 quant on le monte d'un ton. Les tierces et septièmes et neuviemes... changent relativement sans avoir besoin de le notifier... c'est une aubaine ! :idea:

Qu'en dis-tu ?

Merci encore pour ta rapidité :!: :!:

par Cyrano » 04 mai 2006, 20:00

Mouais, ben alors il va falloir faire ça à première vue de la manière suivante et les fonctions suggérées par Vaedan vont être utiles.

Il faut dans un premier temps répertorier tous les accords possibles dans l'ordre : ça ne se limite pas aux dieses et aux mineurs, il y a sauf erreur les majeures, les 7ieme, et d'autres que je connais très largement moins et mettre ça dans un tableau. La transposition se fera uniquement sur les notes A à G en passant pas les dieses et il faudra traiter à part pour les remettre après les mineures, majeures, 7iemes etc...

Ensuite, il va falloir parser les textes pour récupérer chaque note, en extraire la note elle-même avec ou sans diese et les variantes à part, faire la modification de valeur sur la note, reconstruire les variantes et ré-écrire le texte..... je me demande dans quelle mesure l'utilisation des expressions régulières ne serait pas appropriée...

Ça se fera pas en 5mn je sens... :-k

...suite...

par phrincon » 04 mai 2006, 19:11

Eactement t'as tout pigé, c'est exactement comme avec un capo... :D :D :D

par Cyrano » 04 mai 2006, 17:07

Ok, précise moi un détail pour que je sois sûr et si c'est ce que je pense, ça va être un poil plus compliqué :
Tu as un texte avec des accord: par exemple, un texte dont l'air est en Do# et avec le formulaire, tu voudrais le monter d'un demi-ton par exemple et donc afficher le même texte mais en Ré : le [C#] du texte doit donc devenir un [D], ou le [G] doit devenir un [G#] (ou un [A] ? pas sûr, suis pas musicologue) : c'est bien ça ? Un peu comme on joue sur une guitare simplement en changeant le capo de place sur le manche... :-k

...suite...

par phrincon » 04 mai 2006, 15:35

Pardon, je n'avais pas pigé...

voilà le code de la page (le code du script étant strictement celui que ma passé Vaedan)

Code : Tout sélectionner

<form action="/www/french/Public/transposer.php" method="post"> <div id="action0"> <strong>Transpose chords:</strong> <select name="transpose" id="transposeSelect" size="1" onChange=""> <option value="-5">-5 semitones</option><option value="-4">-4 semitones</option><option value="-3">-3 semitones</option><option value="-2">-2 semitones</option><option value="-1">-1 semitone</option><option value="0" selected="selected">None</option><option value="1">+1 semitone</option><option value="2">+2 semitones</option><option value="3">+3 semitones</option><option value="4">+4 semitones</option><option value="5">+5 semitones</option><option value="6">+6 semitones</option></select> </div> </form></div> <div class="chordline">[G]Ziggy played guitar,[Bm]jamming good</div> <div class="chordline">with Wierd and [C]Gilly and the Spiders from[D] Mars.</div> <div class="chordline">He played it left [G]hand, but made it too [Bm]far</div> <div class="chordline">became the spe[C]cial man, and we were [D]Ziggy's band.</div> <br> </div>

Ce que je veux donc c'est que les accords qui apparaissent entre crochets puissent changer en fontion du choix de l'utilisateur dans le select...

J'espère que je vous donne toutes les infos et que vous saisissez là où je pêche.

Merci encore

par Cyrano » 04 mai 2006, 09:15

Ce que je te demande, c'est du code : sans le voir (même avec des trous là où tu ne sais pas) on ne devinera pas.

...suite...

par phrincon » 04 mai 2006, 09:08

Voilà,

J'ai copié le script dans une page que j'ai enregistrée en php(transposer.php). Sur une autre page j'ai créé un formulaire puis un select. J'ai choisis la méthode post et en action j'ai dirigé vers la page transposer.php.

Mon problème c'est que je ne sais pas comment indiquer dans le corps de ma page quels sont les éléments texte (les accords) qui doivent être modifier par l'ordre de transposition.

J'avais oublié : mon serveur d'évaluation fonctionne tout comme il faut (easyphp) !

Merci pour votre patience ! :?

par Cyrano » 03 mai 2006, 23:55

Montre donc de quelle manière tu as essayé de l'utiliser, même si on sait que c'est pas bon, ça donnera un point de départ pour te remettre sur la route parce que ça montrera aussi ce que tu en as compris. Les explication n'en seront que mieux adaptées.

...suite...

par ph.rincon » 03 mai 2006, 21:41

J'ai honte !

Je ne parviens pas à mettre en oeuvre ton script... Peux-tu m'aiguiller encore ?

Merci Merci Merci

...suite...

par ph.rincon » 03 mai 2006, 21:13

J'essaie dès que j'ai un moment...

Vraiment merci, je te tiens au courant !

Re: suite

par Vaedan » 03 mai 2006, 14:42

Merci pour ta rapidité. Je me rejouis de le voir tourner !
Mais merci :)
Pardonne mon ignorance, mais comment dois-je le mettre en oeuvre ?
Afin de le faire fonctionner, tu dois mettre ce code dans la page vers laquelle pointe ton formulaire. Une fois les valeurs récupérées tu les envoies dans la fonction.

suite

par ph.rincon » 03 mai 2006, 14:39

Merci pour ta rapidité. Je me rejouis de le voir tourner !

Pardonne mon ignorance, mais comment dois-je le mettre en oeuvre ?

Dans un fichier externe vers lequel pointera mon form, dans la page elle-même ?

Mercc encore pour ton aide précieuse...

par Vaedan » 03 mai 2006, 13:06

// SCRIPT :
//___________________________________

// Permet de décaler une note
function transpo_note( $note, $demi_tons )
{
    // Liste
    $notes = array( 'a','a#','b', 'c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#' );

    // Récupération de l'ID de la note
    $id = array_search( $note, $notes );

    // ID de la nouvelle note
    $id = ( $id + $demi_tons ) % 12;

    // Note décalée
    return $notes[ $id ];
}

// Permet de décaler un accord
function transpo_accord( $accord, $demi_tons )
{
    // Récupérations des notes
    $notes = explode( '/', $accord );

    // Transposition des notes
    $num = count( $notes );
    for ( $i = 0; $i < $num; $i++ )
    {
        $notes[ $i ] = transpo_note( $notes[ $i ], $demi_tons );
    }

    // Accord décalé
    return implode( '/', $notes );
}


// EXEMPLE :
//___________________________________

echo transpo_note( 'f#', 3 ); // a
echo transpo_accord( 'a/b/c', 1 ); // a#/c/c#