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

ph.rincon
Invité n'ayant pas de compte PHPfrance

03 mai 2006, 12:41

Salut à tous,
Je débute tout juste en programmation php (en programmation tout court d'ailleurs) et je voudrais développer un script me permettant de transposer directement sur une page web des accords de guitare en fonction du choix des visiteurs : 1 ton plus haut, 1 ton plus bas etc...

comme pour le fameux site web chordie... (mais eux c'est en php).
http://www.chordie.com/chord.pere/www.g ... id=2727932

Juste pour info :
Transposer un morceau, c'est le faire "glisser" d'une tonalité à une autre, plus grave ou plus aigüe.

Par exemple si j'ai un morceau avec la suite d'accords suivants : DO/LA/FA mais que je n'arrive pas à chanter dessus parce que trop grave et bien je peux commencer plus aiguë, en RE exemple et ma suite devient alors RE/SI/SOL
j'ai donc tranposer ma suite d'accords d'un ton et demi.

de DO à RE = 1 ton
de LA à SI = 1 ton
de FA à Sol = 1 ton

J'espère que je suis clair...

Je me demande s'il ne serait pas mieux de faire tout en texte, pas d'image d'accord mais les noms des accords (do, sol etc.).


Quelqu'un peut-il m'aider ???

Mille merci

Eléphant du PHP | 493 Messages

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#
Modifié en dernier par Vaedan le 03 mai 2006, 14:40, modifié 1 fois.

ph.rincon
Invité n'ayant pas de compte PHPfrance

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...

Eléphant du PHP | 493 Messages

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.

ph.rincon
Invité n'ayant pas de compte PHPfrance

03 mai 2006, 21:13

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

Vraiment merci, je te tiens au courant !

ph.rincon
Invité n'ayant pas de compte PHPfrance

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

Mammouth du PHP | 19672 Messages

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

phrincon
Invité n'ayant pas de compte PHPfrance

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 ! :?

Mammouth du PHP | 19672 Messages

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

phrincon
Invité n'ayant pas de compte PHPfrance

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

Mammouth du PHP | 19672 Messages

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
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

phrincon
Invité n'ayant pas de compte PHPfrance

04 mai 2006, 19:11

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

Mammouth du PHP | 19672 Messages

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
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

phrincon
Invité n'ayant pas de compte PHPfrance

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é :!: :!:

Mammouth du PHP | 19672 Messages

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: