et la c'est a lui de voir !! c'est pas mon code a la base ! (non! non! je me defile pas !!

pour la banque de violon, c'est faisable, mais une question me titille
quel genre de violon , un violon seul ou un ensemble (nappe) de violons ?

Code : Tout sélectionner
;MonPiano version 1.12 par Jacobus 09/2004 et Dobro (modifs) et Zapman (modifs)
; PureBasic 3.91 / 3.90 (voir ligne 25)
;Utilisation de la Librairie MoreProgressBarGadget de Denis (Top comme Lib!)
;Destination : SoundEditor, projet de ZapMan
;A intégrer
;
;Reste à intégrer un recorder (Flype?) pour transférer les créations dans SE
;Partitionneur à base d'un éditorgadget (en cours quand j'ai le temps, comme le player))
;les idées, critiques, optimisations et autres sont bienvenues.
;
;Déjà avec ça on peut... vous pouvez vous amuser
;@+ Jacobus
;
;BMP, ico, et banques de sons disponibles sur freesoundeditor.com
;Si vous préférez l'exe, demandez moi
;-Declaration des procedures
Declare.s ApplicationDir()
Declare Load_Sounds(Chemin$)
Declare Enregistrer_part()
Procedure IsSound(son) ; COMPATIBILITE PureBasic 3.90
ProcedureReturn 1 ; Commenter ces 3 lignes pour
EndProcedure ; la version 3.91 et plus
InitSound()
Enumeration
#window = 0
EndEnumeration
Enumeration
;- constantes images
#Image1
#Image2
#Image3
#Image4
#Image5
#Image6
#touche_blanche
#touche_noire
;
;- constantes panel
#panel_1
#SHORTCUTS
#Btn_load
#Text_load
#frame1
#frame2
#frame3
#frame4
#Text_Acces
#Text_Info
#Text_concept
#ProgBar_1
#ProgBar_38
#editor_part
#frame5
#btn_clear
#btn_compte
#text_compte
#btn_enregistrer
#frame6
#ProgBar_39
#ProgBar_40
#ProgBar_41
#ProgBar_42
#frame7
#ProgBar_43
#ProgBar_44
#CBankChoice
EndEnumeration
Global appli_dir$ ; varialble contenant le chemin de l'application
Global son_charge
;
;-catch images
Image1 = CatchImage(1, ?Image1)
Image2 = CatchImage(2, ?Image2)
Image3 = CatchImage(3, ?Image3)
Image4 = CatchImage(4, ?Image4)
Image5 = CatchImage(5, ?Image5)
Image6 = CatchImage(6, ?Image6)
Image7 = CatchImage(7, ?Image7)
ToucheB = CatchImage(8, ?ToucheB)
ToucheN = CatchImage(9, ?ToucheN)
Image10 = CatchImage(10, ?Image10)
DataSection
;-Data images
Image0 : IncludeBinary "Images\AUTOLOAD.ico"
Image1 : IncludeBinary "Images\About.ico"
Image2 : IncludeBinary "Images\Bal_droite.ico"
Image3 : IncludeBinary "Images\Bal_gauche.ico"
Image4 : IncludeBinary "Images\level.ico"
Image5 : IncludeBinary "Images\level_01.ico"
Image6 : IncludeBinary "Images\level_02.ico"
Image7 : IncludeBinary "Images\level_03.ico"
ToucheB : IncludeBinary "Images\argent.BMP"
ToucheN : IncludeBinary "Images\noire.BMP"
Image10 : IncludeBinary "Images\icon2.ico"
;
; Type de notes
Notes:
Data$ "Do_1","B","#226" ; <>
Data$ "Do#_1","N","W"
Data$ "Ré_1","B","X"
Data$ "Ré_#1","N","C"
Data$ "Mi_1","B","V"
Data$ "Fa_1","B","B"
Data$ "Fa#_1","N","N"
Data$ "Sol_1","B","#188" ; ,?
Data$ "Sol#_1","N","#190" ; ;.
Data$ "La_1","B","#191" ; :/
Data$ "La#_1","N","#223" ; !§
Data$ "Si_1","B","#16"
Data$ "Do_2","B","Q"
Data$ "Do#_2","N","S"
Data$ "Ré_2","B","D"
Data$ "Ré_#2","N","F"
Data$ "Mi_2","B","G"
Data$ "Fa_2","B","H"
Data$ "Fa#_2","N","J"
Data$ "Sol_2","B","K"
Data$ "Sol#_2","N","L"
Data$ "La_2","B","M"
Data$ "La#_2","N","#192" ; ù%
Data$ "Si_2","B","Rt"
Data$ "Do_3","B","A"
Data$ "Do#_3","N","Z"
Data$ "Ré_3","B","E"
Data$ "Ré_#3","N","R"
Data$ "Mi_3","B","T"
Data$ "Fa_3","B","Y"
Data$ "Fa#_3","N","U"
Data$ "Sol_3","B","I"
Data$ "Sol#_3","N","O"
Data$ "La_3","B","P"
Data$ "La#_3","N","#221" ; ^¨
Data$ "Si_3","B","#186" ; $£
Data$ "Do_4","B","#222" ; ²
EndDataSection
;**************************
;creations des directory
If ExamineDirectory(0, "Mes Partitions", "") = 0
CreateDirectory("Mes Partitions")
EndIf
If ExamineDirectory(0, "BANKS", "") = 0
CreateDirectory("BANKS")
EndIf
appli_dir$=ApplicationDir() ; appli_dir$ renvoie le chemin ou se trouve l'application piano !!
;
;***************************************
;
;- fenetre principale
If OpenWindow(0,0,0,745,425,#PB_Window_SystemMenu|#PB_Window_ScreenCentered| #PB_Window_MinimizeGadget| #PB_Window_Invisible,"MonPiano 1.0") And CreateGadgetList(WindowID(0))
CouleurFond = CreateSolidBrush_(RGB(0, 0, 0)); fond noir pour la ToolBar
SetClassLong_(WindowID(0), #GCL_HBRBACKGROUND, CouleurFond)
DeleteObject_(CouleurFond)
HideWindow(0, 0)
;-Barre outils
If CreateToolBar(0,WindowID())
ToolBarImageButton(1, Image1)
ToolBarToolTip(1,"Info")
ToolBarSeparator()
ToolBarImageButton(2, Image4)
ToolBarToolTip(2,"Mode mute")
ToolBarImageButton(3, Image5)
ToolBarToolTip(3,"Volume niveau 1")
ToolBarImageButton(4, Image6)
ToolBarToolTip(4,"Volume niveau 2")
ToolBarImageButton(5, Image7)
ToolBarToolTip(5,"Volume niveau 3")
ToolBarSeparator()
ToolBarImageButton(6, Image3)
ToolBarToolTip(6,"Balance tout le son sur Haut parleur gauche")
ToolBarImageButton(7, Image2)
ToolBarToolTip(7,"Balance tout le son sur Haut parleur droit")
ToolBarImageButton(8, Image10)
ToolBarToolTip(8,"Retour en Stéréo")
ToolBarSeparator()
EndIf
;-Marquage frappe
Frame3DGadget(#frame5,5,290,210,130,"Touches frappées")
EditorGadget(#editor_part, 10,310,100,110,Text)
ButtonGadget(#btn_clear,120,310,90,20,"Clear list")
ButtonGadget(#btn_compte,120,335,90,20,"Count Items")
Compteur=CountGadgetItems(#editor_part)
If Compteur = 0
TextGadget(#text_compte,120,360,90,30,"0 touche frappée",#PB_Text_Border)
Else
TextGadget(#text_compte,120,360,90,30,""+ Str(CountGadgetItems(#editor_part))+" Touches frappées",#PB_Text_Border)
EndIf
ButtonGadget(#btn_enregistrer,120,395,90,20,"Enregistrer")
;-Visual volume
Frame3DGadget(#frame6,240,290,100,130,"Volume actuel");activé par la toolbar
ProgressBarGadget(#ProgBar_39, 250,310,20,100, 0,100,#PB_ProgressBar_Vertical):SetProgressBarColor(#ProgBar_39, #Blue, #Black)
SetGadgetState(#ProgBar_39, 40)
ProgressBarGadget(#ProgBar_40, 270,310,20,100, 0,100,#PB_ProgressBar_Vertical):SetProgressBarColor(#ProgBar_40, #Green, #Black)
SetGadgetState(#ProgBar_40, 60)
ProgressBarGadget(#ProgBar_41, 290,310,20,100, 0,100,#PB_ProgressBar_Vertical):SetProgressBarColor(#ProgBar_41, #Yellow, #Black)
SetGadgetState(#ProgBar_41, 80)
ProgressBarGadget(#ProgBar_42, 310,310,20,100, 0,100,#PB_ProgressBar_Vertical):SetProgressBarColor(#ProgBar_42, #Red, #Black)
SetGadgetState(#ProgBar_42, 100)
;-Visual balance
Frame3DGadget(#frame7,350,290,85,130,"Balance");activé par la toolbar
ProgressBarGadget(#ProgBar_43, 360,310,30,100, 0,100,#PB_ProgressBar_Vertical):SetProgressBarColor(#ProgBar_43, #Green, #Black)
SetGadgetState(#ProgBar_43, 100)
ProgressBarGadget(#ProgBar_44, 395,310,30,100, 0,100,#PB_ProgressBar_Vertical):SetProgressBarColor(#ProgBar_44, #Green, #Black)
SetGadgetState(#ProgBar_44, 100)
;- panel gadget
PanelGadget(#panel_1,0,25,745,260); création de la boîte à onglets
;-Clavier
OpenGadgetList(#panel_1 ,"PANEL 1") ; Ajout d'un onglet
AddGadgetItem (#panel_1,-1,"CLAVIER SYNTHE");nomination de l'onglet
;
; Initialisation des notes
Structure Notes
Nom.s
CouleurTouche.s
ToucheClavierPC.l
Son.l
EndStructure
Dim Notes.Notes(37)
Restore Notes
;
For ct = 0 To 36
Read Nom$
Notes(ct)\Nom = Nom$
Read Couleur$
Notes(ct)\CouleurTouche = Couleur$
Read TouchePC$
If TouchePC$="Sp"
Notes(ct)\ToucheClavierPC = #PB_Shortcut_Space
ElseIf TouchePC$="Rt"
Notes(ct)\ToucheClavierPC = #PB_Shortcut_Return
ElseIf Left(TouchePC$,1)="#"
Notes(ct)\ToucheClavierPC = Val(Right(TouchePC$,Len(TouchePC$)-1))
Else
Notes(ct)\ToucheClavierPC = Asc(TouchePC$)
EndIf
;
If Notes(ct)\CouleurTouche = "B"
CImage = ToucheB;touche blanche
Color1 = #Blue
Color2 = #White
Else
CImage = ToucheN;touche noire
Color1 = #Green
Color2 = #Black
EndIf
ButtonImageGadget(ct+100,ct*20,0,20,100,CImage )
;Merci à Denis pour sa Lib MoreProgressBarGadget, en couleurs, extra !
ProgressBarGadget(ct+200, ct*20,180,20,50, 0,100,#PB_ProgressBar_Vertical):SetProgressBarColor(ct+200, Color1, Color2)
Next
;
;Inscription des touches de raccourcis correspondantes sous les touches,
;leur position est étudiée en fonction de l'affichage,
;donc à ne pas modifier pour la correspondance. (évite un textgadget pour chaque)
TextGadget(#SHORTCUTS, 0, 102, 740, 20," < W X C V B N ? . / § Shift Q S D F G H J K L M % Ret A Z E R T Y U I O P ^ £ ²")
;
Frame3DGadget(#frame1,5,123,730,45,"Load Sounds"); pour faire joli
ComboBoxGadget(#CBankChoice,14,140,150,100)
GadgetToolTip(#CBankChoice,"Chargement d'une banque de sons")
ProgressBarGadget(#ProgBar_1, 180,140,250,20, 0,100);barre de chargement des fichiers sons
SetProgressBarColor(#ProgBar_1, #Yellow, #Black);colorisation de la barre de chargement
ExamineDirectory(0, "BANKS", "")
While NextDirectoryEntry() = 2
If DirectoryEntryName()<>"." And DirectoryEntryName()<>".."
AddGadgetItem (#CBankChoice,-1,DirectoryEntryName())
EndIf
Wend
SetGadgetState(#CBankChoice,0)
Load_Sounds("BANKS\"+GetGadgetText(#CBankChoice)+"\")
;
;-Obtention de banques
OpenGadgetList(#panel_1 ,"PANEL 2"); ajout d'un nouvel onglet, idem suivants
AddGadgetItem (#panel_1,-1,"Obtenir d'autres sonorités")
Frame3DGadget(#frame2,5,10,730,220,"Les banques sons, Comment les obtenir")
TextGadget(#Text_Acces, 20, 30, 700, 180,"Un certain nombre de banques sont livrées avec la version de base de MonPiano et vous pouvez les charger et jouer à votre guise. "+Chr(13)+""+Chr(13)+" Si vous souhaitez obtenir plus de banques et ainsi augmenter vôtre créativité musicale, n'hésitez pas à vous rendre sur : "+Chr(13)+""+Chr(13)+" http://www.freesoundeditor.com "+Chr(13)+""+Chr(13)+" Là vous trouverez les dernières nouveautés en matière de sonorités. Les banques sont composées de 36 sons chacune correspondant aux 36 touches du clavier. Vous pourrez acquérir chaque banque ou des lots de banques sons pour une somme modique. Les capacités de stockage des banques sons dépendent uniquement de la taille de votre disque dur et de votre intérêt pour la musique. Alors à bientôt sur freesoundeditor.com."+Chr(13)+""+Chr(13)+"Vous pouvez créer vous-même vos banques sons en composant des dossiers de 36 fichiers wav que vous aurez renommé, son1;son2; son3 etc..."+Chr(13)+"ASTUCE : Vous pouvez y mettre par exemple 12 Bass; 12 Beats; 12 guitares ... ensemble et jouer de 3 instruments en même temps. ")
CloseGadgetList()
;-Info
OpenGadgetList(#panel_1 ,"PANEL 3")
AddGadgetItem (#panel_1,-1,"Utilisation")
Frame3DGadget(#frame3,5,10,730,220,"Usage et destination")
TextGadget(#Text_Info, 20, 30, 700, 180,"Cet instrument est conçu pour accompagner SoundEditor, le meilleur logiciel d'édition de sons du moment."+Chr(13)+""+Chr(13)+" Ainsi vous pouvez créer votre mélodie à partir de ce piano, simple à appréhender dans son fonctionnement, et générer des fichiers wav que vous pourrez modifier, triturer, agrémenter... d'effets divers dans SoundEditor."+Chr(13)+""+Chr(13)+" Dans une prochaine version, il vous sera possible d'écrire votre partition en même temps que vous jouerez, sans rien faire d'autre que taper les touches de votre piano. De cette façon votre mélodie sera sauvegardée sous forme de fichier texte si vous le souhaitez, et si une mélodie que vous avez joué vous plaît, vous n'aurez qu'à éditer cette partition pour la conserver et donc vous en rappeler sans rechercher dans vos souvenirs sur quelles touches vous aviez frappé.."+Chr(13)+""+Chr(13)+" ASTUCES : - Le clavier de votre piano réagit de deux façons: Soit avec la souris et le curseur que vous pointez sur la touche en faisant un clic gauche. Soit en pianotant directement sur les touches de votre clavier d'ordinateur (AZERTY). Vous pouvez aussi faire les deux en même temps, de la main gauche vous pianotez et de la main droite vous utilisez la souris.")
CloseGadgetList()
;-Concept
OpenGadgetList(#panel_1 ,"PANEL 4")
AddGadgetItem (#panel_1,-1,"Conception et Développement")
Frame3DGadget(#frame4,5,10,730,220,"MonPiano - Développement")
TextGadget(#Text_concept, 20, 30, 700, 180,"- Jacobus 09/2004 - PB 3.91 - Windows Me - */ Lib MoreProgressBarGadget de Denis /* For ZapMan Project, SoundEditor "+Chr(13)+" - Dobro: Auteur/Compositeur de Banques de sons, "+Chr(13)+" - Ben...suffit de rajouter vos noms si ça vous dit de poursuivre le développement avec moi. "+Chr(13)+""+Chr(13)+" Reste à faire : Intégration d'un recorder - Partitionneur (en cours) - Optimisation de l'interface - Autres idées à germer -")
CloseGadgetList()
;-boucle event
MemSoundBank = 0
Repeat
EventID.l = WaitWindowEvent()
Touche = 0
ct = 0
If EventID.l = #WM_KEYDOWN
Touche = EventwParam()
ct = 0
While Notes(ct)\ToucheClavierPC<>Touche And ct<36 : ct + 1 : Wend
EndIf
;
If son_charge And (EventID.l = #PB_EventGadget Or Notes(ct)\ToucheClavierPC=Touche)
If EventID.l = #PB_EventGadget
notouche = EventGadgetID() - 100
Else
notouche = ct
EndIf
If notouche>-1 And notouche <37
;On vérifie que chaque son ait été correctement initialisé pour chaque touche/bouton
;et si oui le son est joué dès qu'on enfonce une touche/bouton
;Dans le même temps on rempli la ProgressBar attitrée pendant 200 ms puis on la vide
;On obtient ainsi l'effet d'équalizer et on peut visualiser ce que l'on fait.
For t=0 To 36
If t<>notouche
StopSound(Notes(t)\Son)
EndIf
Next t
Resultat0 = IsSound(Notes(notouche)\Son) :If Resultat0<>0 :PlaySound(Notes(notouche)\Son,0) :EndIf
SetGadgetState(notouche + 200, 100) :Delay(200) :SetGadgetState(notouche + 200, 0)
AddGadgetItem(#editor_part, -1, Notes(notouche)\Nom)
EndIf
EndIf
;
;- Evènements Gadgets
If EventID.l = #PB_EventGadget
If son_charge<>1
MessageRequester("alerte!", "aucune banque son n'a été chargée !",#PB_MessageRequester_Ok )
Load_Sounds("")
EndIf
Select EventGadgetID()
Case #CBankChoice
If GetGadgetState(#CBankChoice) < 0
SetGadgetState(#CBankChoice,0)
EndIf
If GetGadgetState(#CBankChoice) <> MemSoundBank
SetGadgetState(#ProgBar_1,0); remise à zéro de la barre de chargement
Load_Sounds("BANKS\"+GetGadgetText(#CBankChoice)+"\")
MemSoundBank = GetGadgetState(#CBankChoice)
EndIf
Case #btn_compte
Compteur=CountGadgetItems(#editor_part)
If Compteur = 0
TextGadget(#text_compte,120,360,90,30,"0 touche frappée")
Else
TextGadget(#text_compte,120,360,90,30,""+ Str(CountGadgetItems(#editor_part))+" Touches frappées",#PB_Text_Border)
EndIf
Case #btn_clear
ClearGadgetItemList(#editor_part)
TextGadget(#text_compte,120,360,90,30,""+ Str(CountGadgetItems(#editor_part))+" Touches frappées",#PB_Text_Border)
Case #btn_enregistrer
;create_MesPartitions()
Enregistrer_part()
EndSelect
EndIf
;-Evènement Menus
If EventID.l = #PB_EventMenu
Select EventID
Case #PB_EventMenu
Select EventMenuID()
Case 0 ;Load
SetGadgetState(#ProgBar_1,0)
Case 1 ;Info
MessageRequester("MonPiano V1.1", "MonPiano version 1.1 par Jacobus 09/2004 "+Chr(13)+" Généré avec : PureBasic 3.91 "+Chr(13)+" Système Windows Me ",#MB_ICONINFORMATION | #PB_MessageRequester_Ok)
Case 2 ; mute
SetGadgetState(#ProgBar_39, 40)
SetGadgetState(#ProgBar_40, 0)
SetGadgetState(#ProgBar_41, 0)
SetGadgetState(#ProgBar_42, 0)
SetGadgetState(#ProgBar_43, -100)
SetGadgetState(#ProgBar_44, -100)
;Ce bouton sert à couper le volume de chaque son, donc...
For t=0 To 36
SoundVolume(Notes(t)\son, 0);son_0 ramené au volume 0
Next t
Case 3 ; level 1
SetGadgetState(#ProgBar_39, 40)
SetGadgetState(#ProgBar_40, 60)
SetGadgetState(#ProgBar_41, 0)
SetGadgetState(#ProgBar_42, 0)
SetGadgetState(#ProgBar_43, 100)
SetGadgetState(#ProgBar_44, 100)
;Bouton permettant de ramener le volume au 1/3 du général, donc...
For t=0 To 36
SoundVolume(Notes(t)\son, 33);;son_0 ramené à 33% du volume max
Next t
Case 4 ; level 2
SetGadgetState(#ProgBar_39, 40)
SetGadgetState(#ProgBar_40, 60)
SetGadgetState(#ProgBar_41, 80)
SetGadgetState(#ProgBar_42, 0)
SetGadgetState(#ProgBar_43, 100)
SetGadgetState(#ProgBar_44, 100)
For t=0 To 36
SoundVolume(Notes(t)\son, 66);;son_0 ramené à 66% du volume max
Next t
Case 5 ; level 3
SetGadgetState(#ProgBar_39, 40)
SetGadgetState(#ProgBar_40, 60)
SetGadgetState(#ProgBar_41, 80)
SetGadgetState(#ProgBar_42, 100)
SetGadgetState(#ProgBar_43, 100)
SetGadgetState(#ProgBar_44, 100)
; volume max pour chaque son
For t=0 To 36
SoundVolume(Notes(t)\son, 100);;son_0 ramené à 100% du volume max
Next t
Case 6 ; balance HP gauche
SetGadgetState(#ProgBar_43, 100)
SetGadgetState(#ProgBar_44, -100)
For t=0 To 36
SoundPan(Notes(t)\son, -100); a gauche
Next t
Case 7 ; balance HP droit
SetGadgetState(#ProgBar_43, -100)
SetGadgetState(#ProgBar_44, 100)
For t=0 To 36
SoundPan(Notes(t)\son, 100); a droite
Next t
Case 8;Stéréo
SetGadgetState(#ProgBar_43, 100)
SetGadgetState(#ProgBar_44, 100)
For t=0 To 36
SoundPan(Notes(t)\son, 0); balle au centre remise en jeux ... jeu je m'egare la !! :-D
Next t
EndSelect
Case #PB_Event_CloseWindow
Quit=1
EndSelect
EndIf
Until EventID=#PB_Event_CloseWindow
Quit=1
EndIf
End
Procedure Load_Sounds(NomChemin$)
son_charge=1
Contenu = FileSize(NomChemin$)
If Contenu = -1 ;s'il n'y a rien dans le dossier Bank...
MessageRequester("Répertoire vide !", "IL N'Y A AUCUN FICHIER WAV DANS VOTRE BANQUE ("+NomChemin$+")",#MB_ICONEXCLAMATION | #PB_MessageRequester_Ok)
son_charge = 0
EndIf
;
;Initialisation et chargement de chaque son dans le tableau "Notes()\son"
;
For t=0 To 36
nomson$ =NomChemin$+"son"+Str(t)+".wav"
If FileSize(nomson$)<1
nomson$ =NomChemin$+"sound"+Str(t)+".wav"
EndIf
If FileSize(nomson$)<1
MessageRequester("Y a comme un Blème !", "Ce dossier ne contient pas tous les fichiers requis ("+nomson$+")")
t = 36
Else
LoadSound(t,nomson$)
;
Notes(t)\son=t
SetGadgetState(#ProgBar_1, t*3); ProgressBar chargée à 100%
EndIf
Next t
EndProcedure
;
Procedure Enregistrer_part()
Fichier.s = SaveFileRequester("Enregistrer Ma partition ","Mes Partitions\ ","Partition |*.txt", 0)
If Fichier = ""
Else
If GetExtensionPart(Fichier) = ""
Fichier = Fichier + ".txt"
EndIf
Partition.s = GetFilePart(Fichier.s)
EnregistreFichier = #True
If FileSize(Fichier.s)>0
Reponse = MessageRequester("Cette partition a déjà été enregistrée !","Voulez-vous remplacer : " + Partition + " ? Elle a déjà été enregistrée !" ,#MB_ICONEXCLAMATION |#PB_MessageRequester_YesNo )
If Reponse = 6
a$ + "Yes"
ElseIf Reponse = 7
a$ + "No"
Else
a$ + "Cancel"
If Reponse <> 6
EnregistreFichier = #False
EndIf
EndIf
EndIf
EndIf
If EnregistreFichier
If CreateFile(0,Fichier.s)
Nombre_de_touches_frappees = CountGadgetItems(#editor_part)
For n = 0 To Nombre_de_touches_frappees -1
ItemsText.s = GetGadgetItemText(#editor_part,n,0)
WriteStringN(ItemsText)
Next
CloseFile(0)
EndIf
EndIf
EndProcedure
Procedure.s ApplicationDir()
; astuce publiée par le Soldat inconnu !!
appdir$ = Space(255)
GetCurrentDirectory_(255, @appdir$)
If Right(appdir$, 1) <> "\" ; si l'adresse ne finit pas par "\"
appdir$ = appdir$ + "\" ; on rajoute le "\"
EndIf
ProcedureReturn appdir$
EndProcedure