Page 1 sur 4

Pure_Guitare_Classique (cordes à vide, MAJ pour v4 en page4)

Publié : mar. 14/févr./2006 17:13
par Huitbit
Hi!
(voir la page 4 pour la version avec PureBasic v.4)

Objectif: TOUT tenter(grille, tabs, partition, manche, midi,...) pour comprendre et savoir retrouver plus de 2000 accords de guitare! :)

En attendant de m'occuper de mon "wargame" j'ai commencé(voir dans les hors sujets "Help les musicos" un programme sur les accords de guitare(faire deux projets en même temps ça permet de s'aérer l'esprit et d'apprendre des choses :P ).

Image

Pour l'instant il y a:

un manche en diagonale en plein écran(respect des proportions du manche et des écarts entre les barres de fret)

la liste de plus de 50 familles d'accords

la coloration du "doigt" sur le manche en fonction de la note et de la composante de l'accord

la hauteur des notes est connue(exemple La4, Mi5...) ça servira pour le midi!

la composition de l'accord (chaque intervalle a sa couleur)
le nom et la valeur de l'intervalle
la position de la souris sur le manche(corde, case)
une proposition de grille (en fonction de la position choisie)
une gestion des cordes à vide(à affiner)
il n y a pas


de tablature (idem)
de partition (idem)
de fonction mémoire
de midi[/color]

Questions:

je voulais mettre les textes à l'horizontale mais j'ai pas pu faire de 3D dans UseBuffer. Normal?(résolu)Merci Dri

La rotation ne se passe bien qu'avec des sprites carrés???(résolu)Merci Dri

Où se place spritequality3D??(résolu)Merci Dri

Un grabsprite ne prend pas ce qu'il y a hors écran??(résolu)Merci Dri



Voilà le code
(tous les accords sont dans les datas, l'unité est le demi-ton ex: note=2 >ré; note=4 >mi)


voir page 3 pour les commentaires
( codé avec V3.94, mise à jour 18 sept 2006)

Code : Tout sélectionner

;**************données pour les graphiques*****************
#e=26 ;grandeur de référence
#angle=55
#pi=3.1415927
Enumeration
#spr_compo_accord
  #spr_doigt
  #spr_manche
  #spr_affichage
  #spr_affichage3D
  #spr_purenote
 EndEnumeration

;*************données pour les calculs des accords************
Structure note
  valeur.b
  resultat.b
  visible.b
  hauteur.b
  nom.s
  priorite.b
  nombre.b
  intervalle.s
  intervalle_valeur.b
  couleur.f
  
EndStructure

Structure accord
  intervalles.b
  nom.s
  priorites.b
EndStructure
;*********************************
Dim accord.accord(60,6)
Dim note.note (6,17);"7ième" corde pour les composantes de l'accord
total.b; total=fondamentale+intervalle_accord
;************************************************************
Global fondamentale.b,nom_accord.s,numero_accord.b, corde.b,kaz.b,composante_accord.b,total.b,numero_accord.b,droitier.b,taille_cadre.f,calcul_cadre.f, nom_intervalle.s
Global x_centre_rotation.l,y_centre_rotation.l, x_purenote.l,y_purenote.l,taille.f,calcul.f,affichage_fondamendale.b,affichage_accord.b,affichage_position.b,affichage_grille.b, position.b,position_romaine.s,nombre_cases_cadre.b
;*************************************************************
Declare selection_notes() 
;***********Données initiales******************************
fondamentale=4 ;exemple fondamentale Mi                 *
numero_accord=0; accord de Mi majeur                      *
droitier=1 ;                                                                         *
position=0;                                                                         *
position_romaine="  ";                                                     * 
nombre_cases_cadre=4   ;                                             *
;*************************************************************

x_control.l
y_control.l

;**************************Procédures************************************
 ;*****************lecture des datas ************************* 
Procedure.b lecture_datas() 
Restore intervalles
For i=0 To 55
  For j=0 To 6
    Read accord(i,j)\intervalles 
  Next j
Next i

Restore nom
For i=0 To 55
  Read accord(i,1)\nom
Next i

Restore priorites
For i=0 To 55
  For j=0 To 6
    Read accord(i,j)\priorites
  Next j
Next i
EndProcedure
;*******************initialisation du manche de la guitare*******************
Procedure.b initialisation()
;initialisation des 6 cordes
For kaz=0 To 14
  note(0,kaz)\valeur=4+kaz ;mi
  note(1,kaz)\valeur=9+kaz ;la
  note(2,kaz)\valeur=14+kaz;re
  note(3,kaz)\valeur=19+kaz;sol
  note(4,kaz)\valeur=23+kaz;si
  note(5,kaz)\valeur=28+kaz;mi
Next kaz
;initialisation à 99 de note(corde,kaz)\resultat  (99=pas de note!)
For corde=0 To 5
  For kaz=0 To 14
    note(corde,kaz)\resultat=99
    note(corde,kaz)\hauteur=3
    note(corde,kaz)\visible=0
  Next kaz
Next corde
; limitation des valeurs entre 0 et 11 et introduction de la hauteur des notes 
For corde=0 To 5
  For kaz=0 To 14
    
    While note(corde,kaz)\valeur>11
      note(corde,kaz)\valeur-12;on enlève une octave  
      note(corde,kaz)\hauteur+1; hauteur+1 toutes les octaves
    Wend
    
  Next kaz
Next corde
EndProcedure
;************************position en chiffres romains***********
Procedure.b chiffre_romains(chiffre.b)
  Select chiffre
    
    Case 1
      position_romaine="I"
    Case 2
      position_romaine="II" 
    Case 3
      position_romaine="III"
    Case 4
      position_romaine="IV" 
    Case 5
      position_romaine="V"
    Case 6
      position_romaine="VI" 
    Case 7
      position_romaine="VII"
    Case 8
      position_romaine="VIII" 
    Case 9
      position_romaine="IX"
    Case 10
      position_romaine="X" 
    Case 11
      position_romaine="XI"
    Case 12
      position_romaine="XII"
      
  EndSelect
EndProcedure
;****************identification de l'accord*************
Procedure.b identification_accord()
  
      Select fondamentale
        
        Case 0
         nom_accord=" Do  "
        Case 1
          nom_accord=" Do# "
        Case 2
          nom_accord=" Re  "
        Case 3
          nom_accord=" Re# "
        Case 4
         nom_accord=" Mi  "
        Case 5
         nom_accord=" Fa  "
        Case 6
         nom_accord=" Fa# "
        Case 7
          nom_accord=" Sol "
        Case 8
          nom_accord="Sol#"
        Case 9
          nom_accord=" La  "
        Case 10
          nom_accord=" La# "
        Case 11
          nom_accord=" Si  "
      EndSelect
      nom_accord=nom_accord+ accord(numero_accord,1)\nom
     
     
EndProcedure
;*************************choix de la couleur des doigts***********************
Procedure.b couleur_doigts()
  Select (note(corde,kaz)\resultat-fondamentale);couleurs des doigts 
    Case 0
      note(corde,kaz)\couleur=RGB(255, 0, 0)      ;en fonction de l'intervalle
    Case 1
      note(corde,kaz)\couleur=RGB(255, 128, 0)
    Case 2
      note(corde,kaz)\couleur=RGB(255, 255, 0)
    Case 3
      note(corde,kaz)\couleur=RGB(128, 255, 0)
    Case 4
      note(corde,kaz)\couleur=RGB( 0,255, 0)
    Case 5
      note(corde,kaz)\couleur=RGB(0,255, 128)
    Case 6
      note(corde,kaz)\couleur=RGB(0,255,255)
    Case 7
      note(corde,kaz)\couleur=RGB(0,128,255)
    Case 8
      note(corde,kaz)\couleur=RGB(0,0,255)
    Case 9
      note(corde,kaz)\couleur=RGB(128,0, 255)
    Case 10
      note(corde,kaz)\couleur=RGB(128, 0, 128)
    Case 11
      note(corde,kaz)\couleur=RGB(128,0, 0)
  EndSelect
EndProcedure
;****************************dessin d'un "doigt"***************************
Procedure.f doigts(a.b,b.b,texte.s)
  ;******************sprite doigts****************************************
  CreateSprite(#spr_doigt,#e,#e)
  StartDrawing(SpriteOutput(#spr_doigt))
  Box(0,0,#e,#e,RGB(12,9,0))
  Circle(#e/2,#e/2,#e/2,note(a,b)\couleur)
  DrawingMode(1)
  DrawingFont(FontID())
  FrontColor(255,255,255)
  Locate(2,5)
  DrawText(texte)
  StopDrawing() 
EndProcedure
;******************passage des valeurs numériques aux notes*********************
Procedure.b identification()
  For corde=0 To 5
    For kaz=0 To 14
      
      Select note(corde,kaz)\valeur;identification des notes
        
        Case 0
          note(corde,kaz)\nom=" Do  "
        Case 1
          note(corde,kaz)\nom=" Do# "
        Case 2
          note(corde,kaz)\nom=" Re  "
        Case 3
          note(corde,kaz)\nom=" Re# "
        Case 4
          note(corde,kaz)\nom=" Mi  "
        Case 5
          note(corde,kaz)\nom=" Fa  "
        Case 6
          note(corde,kaz)\nom=" Fa# "
        Case 7
          note(corde,kaz)\nom=" Sol "
        Case 8
          note(corde,kaz)\nom="Sol#"
        Case 9
          note(corde,kaz)\nom=" La  "
        Case 10
          note(corde,kaz)\nom=" La# "
        Case 11
          note(corde,kaz)\nom=" Si  "
      EndSelect
      
    Next kaz
  Next corde
EndProcedure
;************************** calcul du placement des notes de l'accord sur le manche**************** 
Procedure.b calcul_resultat()
  For composante_accord=0 To 6
    For corde=0 To 5
      For kaz=0 To 14
        If accord(numero_accord,composante_accord)\intervalles<>20
        total=fondamentale+accord(numero_accord,composante_accord)\intervalles
        EndIf
        
        While total>11
          total=total-12
        Wend
        
        If note(corde,kaz)\valeur = total
          note(corde,kaz)\resultat=note(corde,kaz)\valeur
          If (note(corde,kaz)\resultat-fondamentale)<0
            note(corde,kaz)\resultat+12
          EndIf
                    couleur_doigts();  procédure qui nécessite des valeurs entre 0 et 12
        EndIf
        
      Next kaz
    Next corde
  Next composante_accord
 
  ; limitation des valeurs entre 0 et 11 
  For corde=0 To 5
    For kaz=0 To 14
      If  note(corde,kaz)\resultat<>99
        
        While note(corde,kaz)\resultat>11
          note(corde,kaz)\resultat-12;on enlève une octave  
        Wend
        
      EndIf
      Next kaz
  Next corde
  
EndProcedure
;**********************dessin purenote*************************
Procedure.b dessin_purenote()
  CreateSprite(#spr_purenote,24,26)  
  
  StartDrawing(SpriteOutput(#spr_purenote))
  
  DrawingMode(4)
  Ellipse(9,19,9,7,RGB(128,255,255))
  FillArea(9,19,RGB(128,255,255),RGB(255,255,255))
  DrawingMode(1)
  Circle(5,18,2,RGB(0,0,10))
  Circle(13,18,2,RGB(0,0,10))
  Plot(5,17,RGB(255,255,255))
  Plot(13,17,RGB(255,255,255))
  Plot(4,21,RGB(0,0,10))
  Plot(13,21,RGB(0,0,10))
  Plot(3,15,RGB(0,0,10))
  Plot(14,15,RGB(0,0,10))
  LineXY(4,14,5,14,RGB(0,0,10))
  LineXY(12,14,13,14,RGB(0,0,10))
  LineXY(5,22,12,22,RGB(0,0,10))
  LineXY(6,23,11,23,RGB(0,0,10))
  LineXY(16,15,16,0,RGB(128,255,255))
  LineXY(17,0,23,6,RGB(128,255,255))
  LineXY(17,4,23,10,RGB(128,255,255))
  LineXY(17,5,17,16,RGB(128,255,255))
  LineXY(23,7,23,9,RGB(128,255,255))
  FillArea(19,4,RGB(128,255,255),RGB(255,255,255))
  Plot(22,10,RGB(128,255,255))
  Plot(22,11,RGB(128,255,255))
  Plot(21,11,RGB(128,255,255))
  
  StopDrawing()
EndProcedure
;**************gestion des intervalles diminués**************
Procedure.b intervalle_diminue(valeur.b)
  If valeur=6
   If (numero_accord=1) Or (numero_accord=4) Or (numero_accord=9) Or (numero_accord=27) Or (numero_accord=32) Or (numero_accord=34) Or (numero_accord=35) Or (numero_accord=36) Or (numero_accord=41) Or (numero_accord=47) 
  nom_intervalle="5dim"
  Else
  nom_intervalle="4aug"
  EndIf
  EndIf
  
   If valeur=8
   If (numero_accord=28) Or (numero_accord=30)  
  nom_intervalle="6mi"
  Else
  nom_intervalle="5aug"
  EndIf
  EndIf
  
   If valeur=9
   If (numero_accord=35) 
  nom_intervalle="7dim"
  Else
  nom_intervalle="6Ma"
  EndIf
  EndIf
  
  
EndProcedure
  
;*******fabrication du sprite composante_accord**********
Procedure.b dessin_composantaccord()
  CreateSprite(#spr_compo_accord,12*#e,26)
  UseBuffer(#spr_compo_accord)
  For composante_accord=0 To 6
   
    For kaz=0 To 14
       Select accord(numero_accord,composante_accord)\intervalles
          
          Case 0
            note(6,kaz)\couleur=RGB(255, 0, 0)
            doigts(6,kaz,"  F")
            TransparentSpriteColor(#spr_doigt,12, 9, 0) 
            DisplayTransparentSprite(#spr_doigt,0,0)
          Case 1
            note(6,kaz)\couleur=RGB(255, 128, 0)
            doigts(6,kaz,"2mi")
            TransparentSpriteColor(#spr_doigt,12, 9, 0) 
            DisplayTransparentSprite(#spr_doigt,#e,0)
          Case 2
            note(6,kaz)\couleur=RGB(255, 255, 0)
            doigts(6,kaz,"2Ma")
            TransparentSpriteColor(#spr_doigt,12, 9, 0) 
            DisplayTransparentSprite(#spr_doigt,2*#e,0)
          Case 3
            note(6,kaz)\couleur=RGB(128, 255, 0)
            doigts(6,kaz,"3mi")
            TransparentSpriteColor(#spr_doigt,12, 9, 0) 
            DisplayTransparentSprite(#spr_doigt,3*#e,0)
          Case 4
            note(6,kaz)\couleur=RGB( 0,255, 0)
            doigts(6,kaz,"3Ma")
            TransparentSpriteColor(#spr_doigt,12, 9, 0) 
            DisplayTransparentSprite(#spr_doigt,4*#e,0)
          Case 5
            note(6,kaz)\couleur=RGB(0,255, 128)
            doigts(6,kaz,"  4 ")
            TransparentSpriteColor(#spr_doigt,12, 9, 0) 
            DisplayTransparentSprite(#spr_doigt,5*#e,0)
          Case 6
            note(6,kaz)\couleur=RGB(0,255,255)
            intervalle_diminue(6)
            doigts(6,kaz,nom_intervalle)
            TransparentSpriteColor(#spr_doigt,12, 9, 0) 
            DisplayTransparentSprite(#spr_doigt,6*#e,0)
          Case 7
            note(6,kaz)\couleur=RGB(0,128,255)
            doigts(6,kaz,"  5")
            TransparentSpriteColor(#spr_doigt,12, 9, 0) 
            DisplayTransparentSprite(#spr_doigt,7*#e,0)
          Case 8
            note(6,kaz)\couleur=RGB(0,0,255)
            intervalle_diminue(8)
            doigts(6,kaz,nom_intervalle)
            TransparentSpriteColor(#spr_doigt,12, 9, 0) 
            DisplayTransparentSprite(#spr_doigt,8*#e,0)
          Case 9
            note(6,kaz)\couleur=RGB(128,0, 255)
            intervalle_diminue(9)
            doigts(6,kaz,nom_intervalle)
            TransparentSpriteColor(#spr_doigt,12, 9, 0) 
            DisplayTransparentSprite(#spr_doigt,9*#e,0)
          Case 10
            note(6,kaz)\couleur=RGB(128, 0, 128)
            doigts(6,kaz,"7mi")
            TransparentSpriteColor(#spr_doigt,12, 9, 0) 
            DisplayTransparentSprite(#spr_doigt,10*#e,0)
          Case 11
            note(6,kaz)\couleur=RGB(128,0, 0)
            doigts(6,kaz,"7Ma")
            TransparentSpriteColor(#spr_doigt,12, 9, 0) 
            DisplayTransparentSprite(#spr_doigt,11*#e,0)
        EndSelect
         Next kaz
  Next composante_accord
  UseBuffer(-1)
EndProcedure
;*******************recherche de l'intervalle correspondant à une note**********
Procedure.b recherche_intervalle()
 
  For corde=0 To 5
    For kaz=0 To 14
       intervalle.b=note(corde,kaz)\valeur-fondamentale
      If intervalle>11
        intervalle-12
      EndIf
      If intervalle<0
        intervalle+12
      EndIf
      note(corde,kaz)\intervalle_valeur=intervalle
      Select intervalle
        Case 0
          note(corde,kaz)\intervalle="F"
        Case 1
          note(corde,kaz)\intervalle="2mi"
          
        Case 2
           note(corde,kaz)\intervalle="2Ma"
        Case 3
          note(corde,kaz)\intervalle="3mi"
        Case 4
           note(corde,kaz)\intervalle="3Ma"
        Case 5
           note(corde,kaz)\intervalle="4"
        Case 6
          intervalle_diminue(6)
          note(corde,kaz)\intervalle=nom_intervalle
        Case 7
           note(corde,kaz)\intervalle="5"
        Case 8
           intervalle_diminue(8)
           note(corde,kaz)\intervalle=nom_intervalle
        Case 9
           intervalle_diminue(9)
           note(corde,kaz)\intervalle=nom_intervalle
        Case 10
           note(corde,kaz)\intervalle="7mi"
        Case 11
           note(corde,kaz)\intervalle="7Ma"
      EndSelect
    Next kaz
  Next corde
;***************affectation des priorites des notes sur le manche en fonction des intervalles******* 
For corde=0 To 5
For kaz=0 To 14
If note(corde,kaz)\resultat<>99
  For composante_accord=0 To 6
   If note(corde,kaz)\intervalle_valeur=accord(numero_accord, composante_accord)\intervalles
  note(corde,kaz)\priorite=accord(numero_accord, composante_accord)\priorites
  EndIf 
Next composante_accord
EndIf
Next kaz
Next corde
EndProcedure        

;******************dessin des boules infos**********************
Procedure.b dessin_boule_infos()
 ;**********************boules pour affichage des données************
;cadre info
  For i =0 To 100 Step 3
    Circle(117*(1-droitier)+867*droitier,200,100-i,RGB(90+i,155+i,155+i)); boule "grille"
    Circle(2*x_centre_rotation-(117*(1-droitier)+867*droitier),2*y_centre_rotation-200,100-i,RGB(90+i,155+i,155+i))
  Next i
 ; dessin de la  grille en fonction du nombre de cases choisies
  For i=0 To 5
    LineXY(117*(1-droitier)+867*droitier-60+24*i,140,117*(1-droitier)+867*droitier-60+24*i,260,RGB(0,0,0))
  Next i
  For i=0 To nombre_cases_cadre
    LineXY(117*(1-droitier)+867*droitier-60,140+120/nombre_cases_cadre*i,117*(1-droitier)+867*droitier+60,140+120/nombre_cases_cadre*i,RGB(0,0,0))
  Next i
  
  For i=0 To 5; dessin de l'accord sur la grille
    For j=position+1 To (position+nombre_cases_cadre)
      If note(i,j)\resultat<>99 And note(i,j)\visible=1
   Circle(117*(1-droitier)+867*droitier-60+24*i,140+(j-(position+1))*120/nombre_cases_cadre+60/nombre_cases_cadre,13-nombre_cases_cadre,RGB(0,0,0))
     EndIf
    Next j
 Next i
;***************************bouton du menu*******************
  For i =0 To 20 Step 2
    Circle(117*(1-droitier)+867*droitier,340,20-i,RGB(90+i*3,155+i*3,155+i*3));droitier/gaucher
    Circle(117*(1-droitier)+867*droitier+70*Pow(-1,droitier),321,20-i,RGB(90+i*3,155+i*3,155+i*3));fondamentale
    Circle(117*(1-droitier)+867*droitier+121*Pow(-1,droitier),270,20-i,RGB(90+i*3,155+i*3,155+i*3));accord
  Circle(117*(1-droitier)+867*droitier+140*Pow(-1,droitier),200,20-i,RGB(90+i*3,155+i*3,155+i*3));position
  Circle(117*(1-droitier)+867*droitier+121*Pow(-1,droitier),130,20-i,RGB(90+i*3,155+i*3,155+i*3));grille 
  Circle(117*(1-droitier)+867*droitier+70*Pow(-1,droitier),79,20-i,RGB(90+i*3,155+i*3,155+i*3));quitter 
  Next i
   FrontColor(64,128,128)
  Locate(117*(1-droitier)+867*droitier-9,332)
  DrawText("D/G")
  Locate(117*(1-droitier)+867*droitier-9+70*Pow(-1,droitier),313)
  DrawText("Fon")
  Locate(117*(1-droitier)+867*droitier-10+121*Pow(-1,droitier),262)
  DrawText("Acc")
  Locate(117*(1-droitier)+867*droitier-10+140*Pow(-1,droitier),192)
  DrawText("Pos")
  Locate(117*(1-droitier)+867*droitier-14+121*Pow(-1,droitier),122)
  DrawText("Grille")
  Locate(117*(1-droitier)+867*droitier-8+70*Pow(-1,droitier),70)
  DrawText("Fin")
  
  
EndProcedure
;****************************dessin des cordes*****************
Procedure.b dessin_cordes()
  StartDrawing(SpriteOutput(#spr_manche))
 
  DrawingMode(1); dessin des cordes métal et nylon
   
  j=0
  k=0
  For i= 0 To 5;cordes
    Box(640-#e*(2.5-i),640-taille/2-#e,(1+j+k)*(1-droitier)+(4-j-k)*droitier,taille+2*#e,RGB(136, 154, 159))
    If i<3
      Line(640-#e*(2.5-i),640-taille/2-#e,1,taille+2*#e,RGB(droitier*232, 232, 232))
    Else
      Line(640-#e*(2.5-i),640-taille/2-#e,1,taille+2*#e,RGB((1-droitier)*232, 232, 232))
    EndIf
    If j<2
      j=j+1
    Else
      j=0
      k=1
    EndIf
  Next i
  StopDrawing()
EndProcedure
;******************dessin du cadre "position"***************
Procedure.b cadre_position()
  calcul=0
  calcul_cadre=0
  taille_cadre=0
  For i=0 To (position-1)
    calcul=calcul+4.44*#e*Pow(2,-i/12) 
  Next i
  For i=0 To (position+nombre_cases_cadre-1)
    calcul_cadre=calcul_cadre+4.44*#e*Pow(2,-i/12)
  Next i
  taille_cadre=calcul_cadre-calcul
  StartDrawing(SpriteOutput(#spr_affichage))
  DrawingMode(4)
  For i=0 To 20 
    Box(640-3*#e-i,640-taille/2+calcul,6*#e+2*i,taille_cadre,RGB(90+i*3,155+i*3,155+i*3))
  Next i
  Locate(640+4*#e,640-taille/2+calcul)
  FrontColor(255,255,255)
  DrawingMode(1)
  chiffre_romains(position+1); position correspond à la nième barre de fret d'où n+1ième case
  DrawText(position_romaine)
  StopDrawing()
EndProcedure 
;*******fabrication du sprite manche************************
Procedure.b sprite_manche()
  CreateSprite(#spr_manche,1280,1280)
  StartDrawing(SpriteOutput(#spr_manche))
  Box(0,0,1280,1280,RGB(64,128,128))
  taille=0
  calcul=0
  For i=0 To 14 ;calcul de la taille du manche avec 15 frets
    taille=taille+4.44*#e*Pow(2,-i/12)
  Next i
  
  Box(640-3*#e,640-taille/2-#e,6*#e,#e,RGB(252, 253, 204));sillet
  Box(640-3*#e,640-taille/2,6*#e,taille+2*#e,RGB(12, 9, 0));manche
  
  DrawingMode(4);dessin des frets
  
  For i=0 To 14;fret
    calcul=calcul+4.44*#e*Pow(2,-i/12)
    Ellipse(640,640-taille/2+calcul,3*#e,3,RGB(220, 185, 82))
    FillArea(641,641-taille/2+calcul,RGB(220, 185, 82),RGB(229, 202, 125))
  Next i
  StopDrawing()
  dessin_cordes()
   
EndProcedure

;********************sprite final************************
  Procedure.b sprite_final()
   
    CreateSprite(#spr_affichage,1280,1280,#PB_Sprite_Texture)
   UseBuffer(#spr_affichage)
  DisplaySprite(#spr_manche,0,0)

  For i=0 To 5
    calcul=0
    For j=1 To 14;fret
      calcul=calcul+4.44*#e*Pow(2,-(j-1)/12)
      If note(i,j)\resultat<>99
        doigts(i,j,note(i,j)\nom)
        TransparentSpriteColor(#spr_doigt,12, 9, 0) 
        DisplayTransparentSprite(#spr_doigt,640-3*#e+((1-droitier)*(5-i)+droitier*i)*#e,648-taille/2+calcul-1.5*#e)
      EndIf
      Next j
    Next i
    UseBuffer(-1)
    cadre_position()
    CreateSprite3D(#spr_affichage3D,#spr_affichage)
     RotateSprite3D(#spr_affichage3D,#angle*Pow(-1,droitier),1)
EndProcedure
;*****************************changement de vue*******************
Procedure.b droitier_gaucher()
  If MouseButton(1)<>0
    droitier=droitier+1
    affichage_position=0
    affichage_accord=0
    affichage_fondamendale=0
    affichage_grille=0
   If droitier>1
        droitier=0
      EndIf
      Delay(128)
      FreeSprite(#spr_affichage)
      FreeSprite3D(#spr_affichage3D)
      sprite_manche()
      sprite_final()
       
    EndIf

  EndProcedure 
;************choix de la fondamentale*************************
  Procedure.b choix_fondamentale()
    If MouseButton(1)<>0
      affichage_fondamendale.b=affichage_fondamendale+1
      affichage_accord=0
      affichage_position=0
      affichage_grille=0
      Delay(128)
      If affichage_fondamendale>1
        affichage_fondamendale=0
        EndIf
      EndIf
     EndProcedure
  ;*************affichage de la liste des fondamentales***************
    Procedure.b affiche_fond()
      x_box_fondamentale.l=117*(1-droitier)+867*droitier-90*droitier+50*(1-droitier)
    If affichage_fondamendale=1
    StartDrawing(ScreenOutput())
    DrawingMode(1)
       For i=0 To 20
        Box(x_box_fondamentale,361,40,12*(20-i),RGB(70+i*4,135+i*4,135+i*4))
      Next i
      For kaz=1 To 12
              FrontColor(255,255,255)
        Locate(117*(1-droitier)+867*droitier-90*droitier+50*(1-droitier),361+(kaz-1)*20)
        DrawText(note(4,kaz)\nom)
        
      Next kaz
      StopDrawing()
      If x_purenote>x_box_fondamentale And x_purenote<x_box_fondamentale+40 And y_purenote>361 And y_purenote<601
         
        If MouseButton(1)<> 0 
          affichage_fondamendale=0
          fondamentale=Int((y_purenote-361)/20)
          Delay(128)
          initialisation()
          calcul_resultat()
          identification()
          recherche_intervalle()
          selection_notes()
          FreeSprite(#spr_compo_accord)
          FreeSprite(#spr_affichage)
          FreeSprite3D(#spr_affichage3D)
          dessin_composantaccord()
          sprite_manche()
          sprite_final()
          EndIf
        EndIf
        
    
    EndIf
  EndProcedure
 ;*********************choix de l'accord***********************************
  Procedure.b choix_accord()
    If MouseButton(1)<>0
      affichage_fondamendale=0
      affichage_position=0
      affichage_grille=0
      affichage_accord.b=affichage_accord+1
      Delay(128)
      If affichage_accord>1
        affichage_accord=0
      EndIf
    EndIf
  EndProcedure
  ;*******affichage de la liste des accords************
  Procedure.b affiche_acc()
    x_box_accord=117*(1-droitier)+867*droitier+121*Pow(-1,droitier)-200
    If affichage_accord=1
    StartDrawing(ScreenOutput())
    DrawingMode(1)
    For i=0 To 20
      Box(x_box_accord,310,400,12*(20-i),RGB(70+i*4,135+i*4,135+i*4))
    Next i
    For j=0 To 11
      For i=0 To 4
        FrontColor(255,255,255)
       Locate(117*(1-droitier)+867*droitier+121*Pow(-1,droitier)-200+i*80+10,310+j*20)
     DrawText( accord(j*5+i,1)\nom)
  Next i
Next j
StopDrawing()
If x_purenote>x_box_accord And x_purenote<x_box_accord+400 And y_purenote>310 And y_purenote<550
   
   If MouseButton(1)<> 0
     affichage_accord=0
   numero_accord=Int((x_purenote-x_box_accord)/80)+5*Int((y_purenote-310)/20)
    Delay(128)
    initialisation()
    calcul_resultat()
    identification()
    recherche_intervalle()
    selection_notes()
    FreeSprite(#spr_compo_accord)
    FreeSprite(#spr_affichage)
    FreeSprite3D(#spr_affichage3D)
    dessin_composantaccord()
    sprite_manche()
    sprite_final()
  EndIf
EndIf


EndIf 
EndProcedure

;************choix de la position*************************
Procedure.b choix_position()
  If MouseButton(1)<>0
    affichage_position.b=affichage_position+1
    affichage_accord=0
    affichage_fondamendale=0
    affichage_grille=0
    Delay(128)
    If affichage_position>1
      affichage_position=0
    EndIf
  EndIf
EndProcedure
  ;*************affichage de la liste des positions**************
Procedure.b affiche_pos()
  x_box_position.l=117*(1-droitier)+867*droitier-160*droitier+120*(1-droitier)
  If affichage_position=1
    StartDrawing(ScreenOutput())
    DrawingMode(1)
    For i=0 To 20
      Box(x_box_position,240,40,12*(20-i),RGB(70+i*4,135+i*4,135+i*4))
    Next i
    For kaz=1 To 12
      FrontColor(255,255,255)
      Locate(117*(1-droitier)+867*droitier-160*droitier+120*(1-droitier)+10,240+(kaz-1)*20)
      chiffre_romains(kaz)
      DrawText(position_romaine)
      
    Next kaz
    StopDrawing()
    If x_purenote>x_box_position And x_purenote<x_box_position+40 And y_purenote>240 And y_purenote<481
       
      If MouseButton(1)<> 0 
         affichage_position=0
        position=Int((y_purenote-240)/20)
        Delay(128)
        FreeSprite(#spr_affichage)
        FreeSprite3D(#spr_affichage3D)
        sprite_final()
      EndIf
    EndIf
    
    
  EndIf
EndProcedure
 ;************choix de la grille*************************
Procedure.b choix_grille()
  If MouseButton(1)<>0
    affichage_grille.b=affichage_grille+1
     affichage_position=0
     affichage_accord=0
     affichage_fondamendale=0
     Delay(128)
    If affichage_grille>1
       affichage_grille=0
    EndIf
  EndIf
EndProcedure
  ;*************affichage de la liste des grilles**************
Procedure.b affiche_grille()
   x_box_grille.l=117*(1-droitier)+867*droitier-141*droitier+100*(1-droitier)
   If affichage_grille=1
     StartDrawing(ScreenOutput())
     DrawingMode(1)
     For i=0 To 3
       Box(x_box_grille,170,40,12*(3-i),RGB(160+i*10,225+i*10,225+i*10))
    Next i
    For i=4 To 6
       FrontColor(255,255,255)
       Locate(x_box_grille+15,170+12*(i-4)-2)
       DrawText(Str(i))
    Next i
     StopDrawing()
     If x_purenote>x_box_grille And x_purenote<x_box_grille+40 And y_purenote>170 And y_purenote<206
       
      If MouseButton(1)<> 0 
         affichage_grille=0
         nombre_cases_cadre=Int((y_purenote-170)/12)+4

        Delay(128)
        FreeSprite(#spr_affichage)
        FreeSprite3D(#spr_affichage3D)
        sprite_final()
   EndIf
  EndIf
  EndIf
  EndProcedure
  

  
  ;****************************** selection des notes*****************************
  Procedure selection_notes()
  ;initialisation
 For corde=0 To 5
    For kaz=0 To 14
       note(corde,kaz)\visible=0
       note(corde,kaz)\nombre=0
        Next kaz
 Next corde 
    
     
For i = 0 To 5 ;passage en revue des 6 cordes et detection des notes qui ont l'indice de priorite le plus grand
     indice_priorite_max.b=0
     kaz_priorite_max.b= position+1
     
     For j= position+1 To position+nombre_cases_cadre
     If note(i,j)\resultat<>99
     
         indice_priorite.b=note(i,j)\priorite+7*(3-note(i,j)\nombre)
        
        If indice_priorite>indice_priorite_max
             kaz_priorite_max=j
             indice_priorite_max=  indice_priorite                          
         EndIf  
         
     EndIf          
     Next j
     
    
    note(i,kaz_priorite_max)\visible=1
    note(i,kaz_priorite_max)\nombre=note(i,kaz_priorite_max)\nombre+1
    
    For  l=0 To 5
        For m=position+1 To position+nombre_cases_cadre
          If note(l,m)\intervalle_valeur=note(i,kaz_priorite_max)\intervalle_valeur
             note(l,m)\nombre=note(i,kaz_priorite_max)\nombre
          EndIf
        Next m
   Next l
   
   Next i
         

EndProcedure     
         
 ;*****************************************************************        


  
;***********************fin des procédures*************************************

lecture_datas()
initialisation()
calcul_resultat()
identification()
recherche_intervalle()
selection_notes()
 
InitKeyboard()
InitMouse()
InitSprite() 
InitSprite3D() 
;*****************écran********************************* 
OpenScreen(1024,768,32,"Pure_Guitare") ;ouverture d'un écran de profondeur 32 
LoadFont(1,"arial",9,#PB_Font_HighQuality|#PB_Font_Bold)
;*********sprite pure_note***********************************
dessin_purenote()
;****************barrette des composantes de l'accord******************
dessin_composantaccord()
;************************dessin du manche**********************************
sprite_manche()
sprite_final()
CreateSprite3D(#spr_affichage3D,#spr_affichage)
RotateSprite3D(#spr_affichage3D,#angle*Pow(-1,droitier),1)

;************************programme principal****************
MouseLocate(117*(1-droitier)+867*droitier,200); position de départ de la souris

Repeat
  Delay(10)
  ClearScreen(64,128,128)
  Start3D()
  Sprite3DQuality(1)
  DisplaySprite3D(#spr_affichage3D,-148+40*droitier,-236);manche incliné de la guitare
  Stop3D()
  
  DisplayTransparentSprite(#spr_compo_accord,712*droitier,0); composantes de l'accord
StartDrawing(ScreenOutput())
DrawingMode(1)
DrawingFont(FontID())
identification_accord()
;*****************************************************************************
dessin_boule_infos()
;*****************************************************************************
StopDrawing()
;************************affichage des composantes de l'accord en haut à gauche*******

ExamineMouse()

x_purenote=MouseX()
y_purenote=MouseY()
;************coordonnées du centre de rotation***********************
x_centre_rotation=640-148+40*droitier
y_centre_rotation=640-236
;***********rotation de -#angle  et de centre(x_centre_rotation,y_centre_rotation) **********
 x_control=Cos(-#angle*Pow(-1,droitier)*#pi/180)*(x_purenote-x_centre_rotation)-Sin(-#angle*Pow(-1,droitier)*#pi/180)*(y_purenote-y_centre_rotation)+x_centre_rotation
 y_control=Cos(-#angle*Pow(-1,droitier)*#pi/180)*(y_purenote-y_centre_rotation)+Sin(-#angle*Pow(-1,droitier)*#pi/180)*(x_purenote-x_centre_rotation)+y_centre_rotation


StartDrawing(ScreenOutput());******affichage du texte***************
DrawingMode(1)
FrontColor(255,255,255)
Locate( 2*x_centre_rotation-(117*(1-droitier)+867*droitier)-39,2*y_centre_rotation-261)
DrawText(nom_accord)
FrontColor(64,128,128)
Locate( 2*x_centre_rotation-(117*(1-droitier)+867*droitier)-35,2*y_centre_rotation-241)
DrawText("Corde n° :")
Locate( 2*x_centre_rotation-(117*(1-droitier)+867*droitier)-35,2*y_centre_rotation-221)
DrawText("Case  n° :")
Locate( 2*x_centre_rotation-(117*(1-droitier)+867*droitier)-35,2*y_centre_rotation-201)
DrawText("Note :")
Locate( 2*x_centre_rotation-(117*(1-droitier)+867*droitier)-35,2*y_centre_rotation-181)
DrawText("Intervalle :")
Locate( 2*x_centre_rotation-(117*(1-droitier)+867*droitier)-35,2*y_centre_rotation-161)
DrawText("Demi-ton(s) :")
StopDrawing()


If MouseDeltaX()=0 Or MouseDeltaY()=0;afficher les infos si la souris est immobile
  
; **********ID corde************ 
; afficher les infos si la souris est au dessus du manche
  If Abs(x_control-x_centre_rotation)<3*#e And y_control>-192 And y_control<948 And  affichage_accord<>1 And affichage_fondamendale<>1 And affichage_position<>1
   delta.f=Abs(Int((x_control-(x_centre_rotation-3*#e))/#e)-(x_control-(x_centre_rotation-3*#e))/#e); quand delta=0,5 le curseur est pile sur une corde
 
;************ID Case***********
 calcul=0;  variable pour le calcul de la position de la barre de fret 
j=0; compteur de cases
Repeat
calcul=calcul+4.44*#e*Pow(2,-(j)/12)
position_fret.l=y_centre_rotation-taille/2+calcul
j=j+1
Until position_fret> y_control
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(128,0,140)

If delta >0.35 And delta<0.75 
  Locate( 2*x_centre_rotation-(117*(1-droitier)+867*droitier)+30,2*y_centre_rotation-241)
  DrawText(Str(6*droitier+(1-droitier)+Pow(-1,droitier)*Int((x_control-(x_centre_rotation-3*#e))/#e)))
  Locate(2*x_centre_rotation-(117*(1-droitier)+867*droitier)+3,2*y_centre_rotation-201)
  corde_resultat.b=5*(1-droitier)-Pow(-1,droitier)*Int((x_control-(x_centre_rotation-3*#e))/#e)
  DrawText(note(corde_resultat,j)\nom+Str(note(corde_resultat,j)\hauteur))
  Locate(2*x_centre_rotation-(117*(1-droitier)+867*droitier)+35,2*y_centre_rotation-181)
  DrawText(note(corde_resultat,j)\intervalle)
  Locate( 2*x_centre_rotation-(117*(1-droitier)+867*droitier)+50,2*y_centre_rotation-161)
  DrawText(Str(note(corde_resultat,j)\intervalle_valeur))
 
EndIf
Locate(2*x_centre_rotation-(117*(1-droitier)+867*droitier)+30,2*y_centre_rotation-221)
DrawText(Str(j))
StopDrawing()

EndIf
EndIf
;****************** choix du mode droitier / gaucher******************************
If Abs((x_purenote-(117*(1-droitier)+867*droitier-8)))<20 And Abs(y_purenote-340)<20 And  affichage_accord<>1 And affichage_fondamendale<>1
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(255,255,255) 
Locate(117*(1-droitier)+867*droitier-55,360)
DrawText("Droitier / Gaucher ?")
StopDrawing()
droitier_gaucher()
EndIf
;**********************choix de la fondamentale**************************************
If Abs(x_purenote-(117*(1-droitier)+867*droitier+70*Pow(-1,droitier)))<20 And Abs(y_purenote-321)<20 And  affichage_accord<>1
StartDrawing(ScreenOutput())
DrawingMode(1)
  FrontColor(255,255,255) 
  Locate(117*(1-droitier)+867*droitier+70*Pow(-1,droitier)-50,341)
  DrawText("Fondamentale ?")
  StopDrawing()
  choix_fondamentale()

EndIf
affiche_fond()
;*******************choix de l'accord*************************
If Abs(x_purenote-(117*(1-droitier)+867*droitier+121*Pow(-1,droitier)))<20 And Abs(y_purenote-270)<20 And affichage_position<>1
  StartDrawing(ScreenOutput())
  DrawingMode(1)
  FrontColor(255,255,255) 
  Locate(117*(1-droitier)+867*droitier+121*Pow(-1,droitier)-25,290)
  DrawText("Accord ?")
  StopDrawing()
  choix_accord()

EndIf
affiche_acc()
;*******choix de la position************************
If Abs(x_purenote-(117*(1-droitier)+867*droitier+140*Pow(-1,droitier)))<20 And Abs(y_purenote-200)<20 And affichage_grille<>1
  StartDrawing(ScreenOutput())
  DrawingMode(1)
  FrontColor(255,255,255) 
  Locate(117*(1-droitier)+867*droitier+140*Pow(-1,droitier)-25,220)
  DrawText("Position ?")
  StopDrawing()
 choix_position()
EndIf
affiche_pos()
;************choix des dimensions de la grille******************
If Abs(x_purenote-(117*(1-droitier)+867*droitier+121*Pow(-1,droitier)))<20 And Abs(y_purenote-130)<20 
  StartDrawing(ScreenOutput())
   DrawingMode(1)
   FrontColor(255,255,255) 
   Locate(117*(1-droitier)+867*droitier+121*Pow(-1,droitier)-50,150)
   DrawText("4,5 ou 6 cases?")
   StopDrawing()
   choix_grille()
EndIf
selection_notes()
 affiche_grille()

;*******************Quitter****************************

If Abs(x_purenote-(117*(1-droitier)+867*droitier+70*Pow(-1,droitier)))<20 And Abs(y_purenote-79)<20
StartDrawing(ScreenOutput())
DrawingMode(1)
   FrontColor(255,255,255) 
  Locate(117*(1-droitier)+867*droitier+70*Pow(-1,droitier)-25,99)
  DrawText("Quitter ?")
  StopDrawing()
  If MouseButton(1)<>0
    End
  EndIf
EndIf
;******************************curseur souris "Purenote"******************************
DisplayTransparentSprite(#spr_purenote,x_purenote-9,y_purenote-19);affichage de Pure_Note
;*************************************************************************************
FlipBuffers()


If ExamineKeyboard()
  ;****************quitter le programme*************************
   If KeyboardPushed(#PB_Key_Escape)   ; press Esc to quit
    End
  EndIf 
  
;******************saisie d'écran**********************
   If KeyboardReleased(#PB_Key_F1) 
    Ecran=GrabSprite(#PB_Any,0,0,1024,768) 
    SaveSprite(Ecran,"SauveEcran.BMP",#PB_ImagePlugin_BMP) 
   EndIf 
EndIf
ForEver

    
DataSection ; accords

intervalles:
Data.b 0,4,7,20,20,20,20,0,4,6,20,20,20,20,0,4,8,20,20,20,20,0,3,7,20,20,20,20,0,3,6,20,20,20,20; X|X(b5)|X+|Xmi|Xdim
Data.b 0,3,8,20,20,20,20,0,7,20,20,20,20,20,0,5,7,20,20,20,20,0,2,7,20,20,20,20,0,2,6,20,20,20,20;Xmi(#5)|X5|Xsus|Xsus2|Xsus2(b5)
Data.b 0,2,4,7,20,20,20,0,4,5,7,20,20,20,0,4,7,9,20,20,20,0,2,4,7,9,20,20;X2|X4|X6|X6/9
Data.b 0,2,3,7,20,20,20,0,3,5,7,20,20,20,0,3,5,7,9,20,20,0,3,7,9,20,20,20;Xmi2|Xmi4|Xmi4/6|Xmi6
Data.b 0,2,3,7,9,20,20,0,2,5,7,20,20,20,0,4,7,11,20,20,20,0,3,7,10,20,20,20; Xmi6/9|X2sus|Xma7|Xmi7
Data.b 0,3,7,11,20,20,20,0,4,7,10,20,20,20,0,2,7,11,20,20,20,0,5,7,10,20,20,20;Xmi(ma7)|X7|Xma7sus9|X7sus
Data.b 0,2,7,10,20,20,20,0,4,6,9,20,20,20,0,3,7,8,20,20,20,0,2,3,8,20,20,20;X7sus9|X6(b5)|Xmi(b6)|Xmi2(#5)
Data.b 0,3,5,7,8,20,20,0,1,3,7,9,20,20,0,4,6,11,20,20,20,0,4,8,11,20,20,20;Xmi4(b6)|Xmi6(b9)|Xma7(b5)|Xma7(#5)
Data.b 0,3,6,10,20,20,20,0,3,6,9,20,20,20,0,4,6,10,20,20,20,0,4,8,10,20,20,20;Xmi7(b5)|X°7|X7(b5)|X7(#5)
Data.b 0,1,4,7,10,20,20,0,3,4,7,10,20,20,0,1,4,8,10,20,20,0,5,6,10,20,20,20;X7(b9)X7(#9)X7(#5,b9)X7sus(b5)
Data.b 0,1,5,7,10,20,20,0,2,4,7,11,20,20,0,2,3,7,10,20,20,0,2,3,7,11,20,20;X7sus(b9)|Xma9|Xmi9|Xmi(ma9)
Data.b 0,2,4,7,10,20,20,0,2,4,6,10,20,20,0,2,5,6,10,20,20,0,2,3,5,7,10,20;X9|X9(b5)|X9sus|Xmi11
Data.b 0,2,4,5,7,10,20,0,2,4,5,7,9,11,0,2,3,5,7,9,10,0,2,4,5,7,9,10;X11|Xma13|Xmi13|X13
Data.b 0,1,4,5,7,9,10,0,2,5,7,9,10,20;X13(b9)|X13sus9

nom:
Data.s "ma","(b5)","+","min","dim","mi(#5)","5","sus","sus2","sus2(b5)"
Data.s "2","4","6","6/9","mi2","mi4","mi4/6","mi6","mi6/9","2sus","ma7","mi7"
Data.s "mi(ma7)","7","ma7sus9","7sus","7sus9","6(b5)","mi(b6)","mi2(#5)"
Data.s "mi4(b6)","mi6(b9)","ma7(b5)","ma7(#5)","mi7(b5)","°7","7(b5)","7(#5)"
Data.s "7(b9)","7(#9)","7(#5,b9)","7sus(b5)","7sus(b9)","ma9","mi9","mi(ma9)"
Data.s "9","9(b5)","9sus","mi11","11","ma13","mi13","13","13(b9)","13sus9" 


priorites:
Data.b 1,3,2,0,0,0,0,1,2,3,0,0,0,0,1,2,3,0,0,0,0,1,3,2,0,0,0,0,1,2,3,0,0,0,0; X|X(b5)|X+|Xmi|Xdim
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7;Xmi(#5)|X5|Xsus|Xsus2|Xsus2(b5)
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7;X2|X4|X6|X6/9
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7;Xmi2|Xmi4|Xmi4/6|Xmi6
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7; Xmi6/9|X2sus|Xma7|Xmi7
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7;Xmi(ma7)|X7|Xma7sus9|X7sus
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7;X7sus9|X6(b5)|Xmi(b6)|Xmi2(#5)
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7;Xmi4(b6)|Xmi6(b9)|Xma7(b5)|Xma7(#5)
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7;Xmi7(b5)|X°7|X7(b5)|X7(#5)
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7;X7(b9)X7(#9)X7(#5,b9)X7sus(b5)
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7;X7sus(b9)|Xma9|Xmi9|Xmi(ma9)
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7;X9|X9(b5)|X9sus|Xmi11
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,6,4,3,2,1,7,5;X11|Xma13|Xmi13|X13
Data.b 1,2,3,4,5,6,7,1,2,3,4,5,6,7;X13(b9)|X13sus9
 
EndDataSection 

  







PS: pour les débutants qui avaient peur comme moi des datas et des structures, ...foncez, ça fait gagner beaucoup de temps :D !
Et bientôt, les pointeurs :wink: ...

Merci d'avance!

Re: Pure_Guitare_Classique (étape n°1)

Publié : mar. 14/févr./2006 17:19
par Dr. Dri
Huitbit a écrit :Questions:

je voulais mettre les textes à l'horizontale mais j'ai pas pu faire de 3D dans UseBuffer. Normal?

La rotation ne se passe bien qu'avec des sprites carrés?
Où se place spritequality3D?
Un grabsprite ne prend pas ce qu'il y a hors écran?
usebuffer est ignoré pour la 3D et les Sprite3D

En fait le Sprite qui sert de texture à un Sprite3d devrait toujours être carré (16*16, 64*64, 256*256...)

Sprite3DQuality() se place apres Start3D()

Hors de l'écran, en fait il n'y a rien donc c'est remplacé par du noir.

Dri :)

Pure_Note!

Publié : ven. 14/avr./2006 23:54
par Huitbit
Ch’tite MAJ en attendant la suite (voir premier post) !

Voilà Pure_Note, un curseur de souris instruit :) .
Image

Pour faire tous mes tests je travaille sur un manche virtuel redressé ainsi qu’une souris virtuelle de contrôle.
Car avec un manche en diagonale et des barres de fret non équidistantes, ça pourrait être un peu chaud!

Rappel pour une rotation :
Si x = r*cos(a) et y = r*sin(a)
Si on « rote » d’un angle b
x’ = r*cos(a+b) et y’ = r*sin(a+b)
x’ = r*[cos(a)*cos(b) – sin(a)*sin(b)] et y’ = r*[sin(a)*cos(b) + sin(b)*cos(a)]
finalement
x’ = x*cos(b)-y*sin(b) et y’ = y*cos(b) + x*sin(b)
Il ne faut pas oublier que tous les points sont définis par rapport au centre de rotation O(x0,y0)!
(X’-x0) = (x-x0)*cos(b)-(y-y0)*sin(b)
(y’-y0) = (y-y0)*cos(b) + (x-x0)*sin(b)


Quand je rajouterai les tablatures j’utiliserai la même méthode.
Pour les listes d'accords et de notes, je fabriquerai un menu déroulant dans la grosse boule

Question : est-ce qu’il y a déjà quelque chose de déjà tout prêt pour centrer du texte par rapport à un point ?

Hasta la vista!


PS : Si vous avez des idées d'amélioration, ça m'interesse!
Merci d'avance!

Publié : sam. 15/avr./2006 11:48
par Backup
y a un big problemme dans ce prg ! :?

tu est peut etre gauché non ? D
tel que tu le montre la , le manche est pas facile a comprendre

en effet l'habitude en tablature (qui est une representation du manche)

c'est d'avoir le dessin du manche comme le vois le guitariste qui joue
c'est a dire les corde Basse en bas et aigue en haut ! :D

la tu nous represente le manche comme si quelqu'un se trouve Devant le guitariste !! :?

pour une rapidité de lecture , il vaudrai mieu avoir la vue traditionnel
apres tout ce prg s'adresse au guitariste pas a son publique ! :D


donc un Mi7 serai representé de la sorte

le scié vers la gauche de l'image (pour un guitariste droitier !)
les cordes aigues en haut de l'image, les basse en bas
comme un guitariste droitier voit son manche lorsqu'il joue !

E||---------|----------|----------|-------0----|-----------------------
B||--------|----------|-----0-----|------------|---0----------------
G||----0---|----------|----------|-------0----|--------------
D||--------|----0-----|----------|-------------|----------------
A||--------|----0-----|----------|--------------|---0--------
E||--------|----------|----------|--------0-----|------


actuellement ton manche est representé dans l'autre sens !! (vue du publique ):D

d'autre part tu aurai du montrer l'espace se trouvant avant le Scié
de façon a mettre le point qui indique le jeu d'une corde a vide ! :D


Mi mineure

E-0--||-------|--------|-------
B-0--||-------|--------|-------
G-0--||-------|--------|-----
D----||----0---|--------|------
A----||----0---|--------|-------
E-0--||-------|--------|-------
ici ^ les cordes a vide !! (0) pour corde joué et (x) pour cordes etouffées

:D

bon courage c'est bien partis !! :D

Mea Culpa!

Publié : sam. 15/avr./2006 12:49
par Huitbit
Rien n'échappe à Magic Dobro!

Je suis gaucher (left-handed quoi!) et...c'est bien un manche de gaucher!
Les grilles sont faites pour les droitiers, les paires de ciseaux, les voitures,les pianos, les saxos, les ouvre-boîtes :mad: ..., et mêmes les guitares sont faites pour les droitiers, je voulais juste rétablir provisoirement l'équilibre! :wink:

La fonction miroir droitier/gaucher est prévue (car les gauchers pensent toujours aux droitiers!).
C'est vrai que pour "vous", on dirait le manche de quelqu'un placé en face(ou le manche vu dans un miroir!)
Pour ce qui est des cordes à vides, je rajouterai une bulle avec la grille et une autre avec la tablature, comme ça les cordes à vides et les notes non jouées pourront apparaître!

@Dobro
Tu jouerais pas avec une guitare de gaucher retournée?
Pour les droitiers, la basse est aussi en haut(côté pouce) sur le manche non?
Attention à la bière! Le rhum c'est plus sain!

Sur les tab' c'est ok!
Si je fais pas gaffe je risque de faire une belle soupe!


Merci pour les remarques!
Je sais que vous êtes nombreux à bosser sur la V4!

Re: Mea Culpa!

Publié : sam. 15/avr./2006 13:28
par comtois
Huitbit a écrit : Je suis gaucher (left-handed quoi!) et...c'est bien un manche de gaucher!
Les grilles sont faites pour les droitiers, les paires de ciseaux, les voitures,les pianos, les saxos, les ouvre-boîtes :mad: ..., et mêmes les guitares sont faites pour les droitiers, je voulais juste rétablir provisoirement l'équilibre! :wink:
hé hé , tu as raison, même l'anse des tasses est à droite !!

Tu as le soutien d'un autre gaucher :)

Re: Mea Culpa!

Publié : sam. 15/avr./2006 15:37
par Backup
Huitbit a écrit : @Dobro
Tu jouerais pas avec une guitare de gaucher retournée?
Pour les droitiers, la basse est aussi en haut(côté pouce) sur le manche non?
Attention à la bière! Le rhum c'est plus sain!

ben non ! justement moi je te parle de "Norme"

pour un droitié le manche est representé scie a gauche corde aigue en haut et corde basse en bas !!


ex pour guitare pro (qui est devenu un standard !! )

Image

le manche de guitare est representé avec les cordes Basse en bas et les cordes aigue en haut de l'image !!
les cordes a vide sur le Scié ...

bref c'est l'exacte representation du system des tablatures
je t'ai d'ailleurs photographié la tablature qui va avec ....
le tout sur un accords de Mi Majeur (E)... :D

tu vois j'ai rien bu ! :lol:

c'est en fait ce que voi le guitariste lorsqu'il penche sa tete pour voir ses doigts !!

si il prenait une photo par dessus son manche (comme il le voit depuis sa position de guitariste avec la guitare dans les mains ) il y aurai bien les cordes basse en bas de l'image et les cordes aigues en Haut ! :D

pour un gaucher c'est exeactement pareille sauf que le Scie serai a droite !! Mais les Cordes Basse serai Toujours en Bas de l'image !!
:D

Ah ouais, d'accord!

Publié : dim. 16/avr./2006 4:17
par Huitbit
J'avais pas bien compris la question! :roll:
Je connaissais ni ce logiciel, ni cette convention (le dessin du manche avec les cordes en bas).

Mais, c'est juste une tablature "décorée" non ?

Dans mon prog, j'ai dessiné le manche comme je le voyais étant donné que j'avais prévu la grille et la tab'

Dans guitar pro, on ne s'occupe que de la tab'

Je crois que le mieux ce sera de laisser le choix (manche à gauche, à droite, chanterelle en haut, en bas)

Par contre pour les tablatures, les grilles et les partitions, je respecterai les conventions!

DOBRO 1 HUITBIT 0
Moralité: avant de chatouiller un gratteux, il faut faire tourner sept fois son clavier sur son bureau (et c'est pas facile!)

Re: Ah ouais, d'accord!

Publié : dim. 16/avr./2006 16:00
par Backup
Huitbit a écrit :J'avais pas bien compris la question! :roll:
Je connaissais ni ce logiciel, ni cette convention (le dessin du manche avec les cordes en bas).
Mais, c'est juste une tablature "décorée" non ?
ben oui tu as tout a fait raison , je dirai mem plus ce sont les tablatures qui reprennent le principe du manche !! :lol:
en effet le manche etait la bien avant les tablatures :D ....

mais oui c'est bien une norme , car tout les logiciel que je connais reprennent ce principe des qu'il montre la representation d'un manche de guitare !!

le choix tu peut le proposer pour Droitie ou Gauché , c'est a dire le Scié a droite pour les gauchés , et a gauche pour les droitiés, du moment que tu laisse les Basses en bas de l'image et les aigues en haut ! :D

ps : quelques fois les diagrammes (representation du manche) , sont dessiné avec le scié en haut (manche verticale) et les basse a gauche, les aigue a droites !!
mais je trouve cette notation pas tres pratique car elle force un travail intellectuel suplementaire :D


en tout cas je t'encourage, car mem si des programme du genre existe, c'est toujours bien de se creer des projet comme celui la :D


pour les tablatures en guitare il existe 2 logiciel qui tienne le haut du pavé
c'est Guitare Pro 5 et Tabledit 2.64c8

sinon les outsider sont Melody assistant, et Harmony assistant
melody assistant propose meme un synthetiseur vocal qui te chante la partition, !! tu lui file les parole, les notes , et c'est partie, c'est tres impressionnant :D il est basé sur le synthe vocal Mbrola !! (une reference) :D

Dobro knows...

Publié : mar. 18/avr./2006 19:39
par Huitbit
(pour la mise à jour voir le post n°1)

On m'a toujours dit qu'il fallait écouter les grands!
Donc j'ai mis les basses en bas (c'est vrai que c'est plus logique!)

J'ai tout mis sous forme de sous-programmes, comme ça, si un kamikaze veut mettre le nez dans le programme pour optimiser telle ou telle fonction, ce sera plus facile!

Question?
Pour certaines procédures j'ai mis le type au hasard! :?
Exemple: pour les dessins, j'ai mis en .b!
Le type de la procédure dépend de la valeur retournée au prog principal?


Prochaine étape, un menu déroulant pour choisir les accords! :wink:

Hasta la vista!

PS: j'ai choisi de faire des "gadgetboutons" ronds car (à mon avis) c'est plus facile à gérer(deux valeurs absolues suffisent)
PS: pour démarrer toujours en droitier ou gaucher, il suffit de changer la valeur de la variable "droitier "(0 gaucher/ 1droitier) au début du programme!

Publié : mar. 18/avr./2006 21:38
par Backup
Question?
Pour certaines procédures j'ai mis le type au hasard! Confused
Exemple: pour les dessins, j'ai mis en .b!
Le type de la procédure dépend de la valeur retournée au prog principal?
ben oui ! :D c'est bien cela !! le type c'est pour la valeur renvoyé ! :D


ps: Bravo pour le changement , c'est nettement plus convivial ! :D

Publié : mer. 19/avr./2006 20:40
par bernard13
normalement il ya pas besoin de programme pour apprendre la guitare
tu as ou tu as pas l'oreille musicale , c'est une question de feeling

Publié : mer. 19/avr./2006 21:34
par AWEAR
Avant d'avoir l'oreille musicale, à moins que tu ne sois un prodige, il te faut un minimum de base, et les accords en font parti. Personnellement je n'ai jamais fait de guitar, mais c'est ce genre de logiciel qui peut aider à apprendre, tu auras beau avoir l'"oreille musicale", si tu n'a pas les bases, tu n'iras pas très loin, et d'ailleurs la façon dont tu parles me fait penser que tu jamais pratiquer la musique, donc je me pose la question, "ton feeling", tu le sors d'où ?
Tu dis qu'il n'y a pas besoin d'apprendre, mais à ton avis pourquoi existe-t-il des professeurs de guitare ? Tout simplement parce que tu ne peux pas avoir le niveau d'un virtuose dès les premières fois.
Certes un style personnel se travaille, mais il se travaille grâce a ce que les autres ont fait, donc je ne comprends pas pourquoi ce logiciel ne pourrais pas aider à apprendre la guitare, à partir du moment où il te permet d'apprendre les bases de la guitare.

Publié : jeu. 20/avr./2006 1:38
par Backup
bernard13 a écrit :normalement il ya pas besoin de programme pour apprendre la guitare
tu as ou tu as pas l'oreille musicale , c'est une question de feeling
premierement HuitBit ne fait pas ce programme pour que les gens apprennent a jouer de la guitare !!
c'est un outil qui sert au gens qui font de la guitare , debutant ou pro ! :D

l'oreille musicale est un concept qui ne veut pas dire grand choses
prends par exemple les indous , ils utilisent des gammes utilisant les quarts de ton !! chose qui n'existe meme pas dans notre musique occidentale !! :D


pour ce qui est du feeling , c'est vrais que des gens en ont d'autres pas , mais cela n'a rien a voir specifiquement avec la guitare ....

le feeling c'est vachement dur a definir !!
ce peut etre une variation du tempo (le Groove), ou du temps d'une seule note....
ou bien l'utilisation d'une gamme qui va mieux sonner !!
voila ! cela n'as pas grand choses a voir avec l'aprentissage d'un instrument !!


je n'ai jamais pris de cours de guitare , mais j'ai potassé des bouquins, Ecouter les autre guitaristes (copains ou disques... )
bref en autodidacte , mais j'ai ramé et surement perdu beaucoup de temps, comme quoi les cours ça peut quand meme aider !! :D

le petit soft que huitbit fait peut aider certaine personne !!
(moi j'ai "la regle a Dadi" comme dico d'accords ! :D )

Publié : jeu. 20/avr./2006 1:40
par Backup
bernard13 a écrit :normalement il ya pas besoin de programme pour apprendre la guitare
tu as ou tu as pas l'oreille musicale , c'est une question de feeling
premierement HuitBit ne fait pas ce programme pour que les gens apprennent a jouer de la guitare !!
c'est un outil qui sert au gens qui font de la guitare , debutant ou pro ! :D

l'oreille musicale est un concept qui ne veut pas dire grand choses
prends par exemple les indous , ils utilisent des gammes utilisant les quarts de ton !! chose qui n'existe meme pas dans notre musique occidentale !! :D


pour ce qui est du feeling , c'est vrais que des gens en ont d'autres pas , mais cela n'a rien a voir specifiquement avec la guitare ....

le feeling c'est vachement dur a definir !!
ce peut etre une variation du tempo (le Groove), ou du temps d'une seule note....
ou bien l'utilisation d'une gamme qui va mieux sonner !!
voila ! cela n'as pas grand choses a voir avec l'aprentissage d'un instrument !!


je n'ai jamais pris de cours de guitare , mais j'ai potassé des bouquins, Ecouter les autre guitaristes (copains ou disques... )
bref en autodidacte , mais j'ai ramé et surement perdu beaucoup de temps, comme quoi les cours ça peut quand meme aider !! :D

le petit soft que huitbit fait peut aider certaine personne !!
(moi j'ai "la regle a Dadi" comme dico d'accords ! :D )