Page 1 sur 2
script modification de texte sur page en fonction d'un selec
Posté : 03 mai 2006, 12:41
par ph.rincon
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
Posté : 03 mai 2006, 13:06
par Vaedan
// 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#
suite
Posté : 03 mai 2006, 14:39
par ph.rincon
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...
Re: suite
Posté : 03 mai 2006, 14:42
par Vaedan
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...
Posté : 03 mai 2006, 21:13
par ph.rincon
J'essaie dès que j'ai un moment...
Vraiment merci, je te tiens au courant !
...suite...
Posté : 03 mai 2006, 21:41
par ph.rincon
J'ai honte !
Je ne parviens pas à mettre en oeuvre ton script... Peux-tu m'aiguiller encore ?
Merci Merci Merci
Posté : 03 mai 2006, 23:55
par Cyrano
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...
Posté : 04 mai 2006, 09:08
par phrincon
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 !

Posté : 04 mai 2006, 09:15
par Cyrano
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...
Posté : 04 mai 2006, 15:35
par phrincon
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
Posté : 04 mai 2006, 17:07
par Cyrano
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...

...suite...
Posté : 04 mai 2006, 19:11
par phrincon
Posté : 04 mai 2006, 20:00
par Cyrano
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...

...suite...
Posté : 04 mai 2006, 21:03
par phrincon
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 !
Qu'en dis-tu ?
Merci encore pour ta rapidité

Posté : 04 mai 2006, 21:15
par Cyrano
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.