diff --git a/Contexte/Contexte.docx b/Contexte/Contexte.docx
deleted file mode 100644
index b101d2f..0000000
Binary files a/Contexte/Contexte.docx and /dev/null differ
diff --git a/Contexte/Diagramme Cas Utilisation.drawio b/Contexte/Diagramme Cas Utilisation.drawio
deleted file mode 100644
index 9eb3eb7..0000000
--- a/Contexte/Diagramme Cas Utilisation.drawio
+++ /dev/null
@@ -1 +0,0 @@
-7VtZc+I4EP41PGbKJ8cjRzIztcluarMzm+ybsIVRRrYoWQ4wv34l37LEEQKYVPECVkvG8tf9dbdaomOPw9VXChbzB+JD3LEMf9WxJx3LMg3X4F9Css4kXcvMBAFFfj6oEjyh37C4M5cmyIexNJARghlayEKPRBH0mCQDlJKlPGxGsPzUBQigInjyAFal/yKfzTNp3+pV8m8QBfPiyWZ3kPWEoBicv0k8Bz5Z1kT2bcceU0JYdhWuxhAL8ApcsvvuNvSWE6MwYvvccOv86BoPD9MpnYa/w9vo/q+5d+Pa2c+8AZzkb5zPlq0LCJZzxODTAniiveRq7tijOQsxb5n8EsSLDPgZWkH+rNEMYTwmmFAu8+EMJJj3jtTp5m/wBimDq5oon/5XSELI6JoPWck2sawpopDNa0oohSBXflD+VIUPv8ghegdcpqmgA31uL3mTUDYnAYkAvq2kI0qSyBfITAzeqsbcE7LIMXyFjK1z4wcJIzLCHDG6fs7vTxsvovHFLZqTVb1zss5bGyFngAaQbXvPHEDxcls1QyEGDL3JZNHBnt/6SBCfS6nRQf6c3DlY/YbiYpJQD+Y3VbobUgrWtWELMSDe/BjL0T/nbs/xZs9omE42g8qQSkgOty1HZd4F2xaM/KFwr7zpYRDHyMuEdwgXP324+dlX85PGO+7pzc+9ml/p/XpX86uNt80zmF+RDFR5yA+GMIoBgwlVLJPnUgtxmYR46DGRaYxEGoF43nYPphA/khgxRCI+ZEoYI2FtwBCjQHQw0khkSMIwiuC4zCS3xtD90xa3Ab+rpjG2JovpniqJcU6b8kUkgkfK9xrI2SpwrqVBrhQeP/8zFOx+EsTt08B8kZK+LksNTzR8FC9IhKZpV9O1YsxXMAKnHVCfBlm7a8kJjqNCaxrOGY3StFsJPyvEnquAw1svtZ4q9ohGFXqKkFVFqRcpSOlDlg/ieTrXrcEp8/nbgLL2jWJHT6I+pmBLoc4/FEHVt7dNjZ4jUUPjrfs6n3MyYvQU3J46Y7szHGDug5EIVsL/JPz9a/7n0lEtc5+2YC2rMhfgb4yD/I25w9/skSIfyyUN9nVJR0+sP0atgUKtexB5MIvn6ZtHIo6LSwwumV5uM2Xvq/QanJVe7awmC3rVyVVSbQe9zM6xV6BHoleL69aP2YC6ptsrchl+wj/CdOgwFJ0eCRdiRadbCrbOPFcObBrmmboide9k1HOvke1o1LM/KfXUbR05smXsGjBKIiIodlmksvry8tTRLE/Pmy322uSU2TkgnB1eUJ1i4v2SGLW1ELabRN19SWRdFom6ConyFauAgX9+j2JGkxCmxVPxLMuYoNkMeWLHM+VXKf+ThJdGMrNRfnasL64aurSVSfdEiLvtbK/qaHYAyXaFLSkmfWQDYzfj+p80bPUVxg1fScJSzpEknQdDNG36acF1Bt4IRRdXX7WMxnqsp6uvnrPob++oXF8okErdyFKB7LlnzARs3e5JF4QCjfycS70FV4yTOi6FgTQkqA7G1CDn0DAZWx5myC/YQFcDOMi3tjwOOKxvihV7XiHyfbxJmbIjPYbyjIHMAk0ttashgX0y5akR/aq8DcpzGumBrdl9O6/y1OBwVd4m5jUPMBlqandW5TlX5h2sPLvftvLUOvlVeZvcZk9WnnVG5bkTdvNsBMH4dZT8F/0BHm+Wd8Vpj89aiH/Xomqj/uorJi1K+5bYi8La+RdM26ZdI+bfWeEhwFWtj8FwQVQraDexdxpne5wzbghroWz3/MmHefKu0yfHKj5ogbQ+J5Wsfah02WVzx5HXW47RMqfca95waNLnmC3nDdeE/XDdaWLZkXTHm9U/xrKz19X/7uzb/wE=
\ No newline at end of file
diff --git a/Contexte/Diagramme_Cas_Utilisations.png b/Contexte/Diagramme_Cas_Utilisations.png
deleted file mode 100644
index 0953a8b..0000000
Binary files a/Contexte/Diagramme_Cas_Utilisations.png and /dev/null differ
diff --git a/Contexte/Persona/Baptiste.png b/Contexte/Persona/Baptiste.png
deleted file mode 100644
index 64b6b7d..0000000
Binary files a/Contexte/Persona/Baptiste.png and /dev/null differ
diff --git a/Contexte/Persona/Corrine.png b/Contexte/Persona/Corrine.png
deleted file mode 100644
index bcb42d0..0000000
Binary files a/Contexte/Persona/Corrine.png and /dev/null differ
diff --git a/Contexte/Persona/Pierre.png b/Contexte/Persona/Pierre.png
deleted file mode 100644
index 7f4ab66..0000000
Binary files a/Contexte/Persona/Pierre.png and /dev/null differ
diff --git a/Contexte/Persona/User Story Baptiste.png b/Contexte/Persona/User Story Baptiste.png
deleted file mode 100644
index 1441d51..0000000
Binary files a/Contexte/Persona/User Story Baptiste.png and /dev/null differ
diff --git a/Contexte/Persona/User Story Corrine.png b/Contexte/Persona/User Story Corrine.png
deleted file mode 100644
index 957efa3..0000000
Binary files a/Contexte/Persona/User Story Corrine.png and /dev/null differ
diff --git a/Contexte/Persona/User Story Pierre.png b/Contexte/Persona/User Story Pierre.png
deleted file mode 100644
index 96218dd..0000000
Binary files a/Contexte/Persona/User Story Pierre.png and /dev/null differ
diff --git a/Contexte/Sketch/Details Partition.png b/Contexte/Sketch/Details Partition.png
deleted file mode 100644
index 8199f15..0000000
Binary files a/Contexte/Sketch/Details Partition.png and /dev/null differ
diff --git a/Contexte/Sketch/Favoris.png b/Contexte/Sketch/Favoris.png
deleted file mode 100644
index 245f81d..0000000
Binary files a/Contexte/Sketch/Favoris.png and /dev/null differ
diff --git a/Contexte/Sketch/Page_Accueil.png b/Contexte/Sketch/Page_Accueil.png
deleted file mode 100644
index 59c2a67..0000000
Binary files a/Contexte/Sketch/Page_Accueil.png and /dev/null differ
diff --git a/Contexte/StoryBoard/Image/Details Partition.png b/Contexte/StoryBoard/Image/Details Partition.png
deleted file mode 100644
index 8199f15..0000000
Binary files a/Contexte/StoryBoard/Image/Details Partition.png and /dev/null differ
diff --git a/Contexte/StoryBoard/Image/Favori.png b/Contexte/StoryBoard/Image/Favori.png
deleted file mode 100644
index 325861d..0000000
Binary files a/Contexte/StoryBoard/Image/Favori.png and /dev/null differ
diff --git a/Contexte/StoryBoard/Image/Favoris.png b/Contexte/StoryBoard/Image/Favoris.png
deleted file mode 100644
index 245f81d..0000000
Binary files a/Contexte/StoryBoard/Image/Favoris.png and /dev/null differ
diff --git a/Contexte/StoryBoard/Image/Page Acceuil.png b/Contexte/StoryBoard/Image/Page Acceuil.png
deleted file mode 100644
index 158a50b..0000000
Binary files a/Contexte/StoryBoard/Image/Page Acceuil.png and /dev/null differ
diff --git a/Contexte/StoryBoard/Image/bar-recherche.PNG b/Contexte/StoryBoard/Image/bar-recherche.PNG
deleted file mode 100644
index d5a2245..0000000
Binary files a/Contexte/StoryBoard/Image/bar-recherche.PNG and /dev/null differ
diff --git a/Contexte/StoryBoard/Image/bouton_lancer.PNG b/Contexte/StoryBoard/Image/bouton_lancer.PNG
deleted file mode 100644
index 7b62af4..0000000
Binary files a/Contexte/StoryBoard/Image/bouton_lancer.PNG and /dev/null differ
diff --git a/Contexte/StoryBoard/Image/bouton_tri.PNG b/Contexte/StoryBoard/Image/bouton_tri.PNG
deleted file mode 100644
index f41f870..0000000
Binary files a/Contexte/StoryBoard/Image/bouton_tri.PNG and /dev/null differ
diff --git a/Contexte/StoryBoard/Image/bouton_tri_par_difficulte.png b/Contexte/StoryBoard/Image/bouton_tri_par_difficulte.png
deleted file mode 100644
index 8854282..0000000
Binary files a/Contexte/StoryBoard/Image/bouton_tri_par_difficulte.png and /dev/null differ
diff --git a/Contexte/StoryBoard/Image/bouton_tri_par_instrument.png b/Contexte/StoryBoard/Image/bouton_tri_par_instrument.png
deleted file mode 100644
index 91681e0..0000000
Binary files a/Contexte/StoryBoard/Image/bouton_tri_par_instrument.png and /dev/null differ
diff --git a/Contexte/StoryBoard/Image/bouton_tri_par_ordre_alphabetique.png b/Contexte/StoryBoard/Image/bouton_tri_par_ordre_alphabetique.png
deleted file mode 100644
index cc88e38..0000000
Binary files a/Contexte/StoryBoard/Image/bouton_tri_par_ordre_alphabetique.png and /dev/null differ
diff --git a/Contexte/StoryBoard/Image/même_compo.PNG b/Contexte/StoryBoard/Image/même_compo.PNG
deleted file mode 100644
index 3e165b2..0000000
Binary files a/Contexte/StoryBoard/Image/même_compo.PNG and /dev/null differ
diff --git a/Contexte/StoryBoard/StoryBoard_Baptiste.docx b/Contexte/StoryBoard/StoryBoard_Baptiste.docx
deleted file mode 100644
index eea94fb..0000000
Binary files a/Contexte/StoryBoard/StoryBoard_Baptiste.docx and /dev/null differ
diff --git a/Contexte/StoryBoard/StoryBoard_Corinne.docx b/Contexte/StoryBoard/StoryBoard_Corinne.docx
deleted file mode 100644
index b266e17..0000000
Binary files a/Contexte/StoryBoard/StoryBoard_Corinne.docx and /dev/null differ
diff --git a/Contexte/StoryBoard/StoryBoard_pierre.docx b/Contexte/StoryBoard/StoryBoard_pierre.docx
deleted file mode 100644
index 088dd70..0000000
Binary files a/Contexte/StoryBoard/StoryBoard_pierre.docx and /dev/null differ
diff --git a/Contexte/edit.txt b/Contexte/edit.txt
deleted file mode 100644
index 5a3a76b..0000000
--- a/Contexte/edit.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Pierre : https://www.hubspot.fr/make-my-persona?persona=-NRsDth3GptLpLd2KlRq
-Baptiste : https://www.hubspot.fr/make-my-persona?persona=-NRxkXdvCS2jHr7u5PJz
-Corrine : https://www.hubspot.fr/make-my-persona?persona=-NRsEXWJlPfCnBdUqmJl
-
-User Story Pierre : https://www.canva.com/design/DAFe4DrRK-0/4eT5Hl9yj_U46cMt-TdlZw/edit?utm_content=DAFe4DrRK-0&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton
-User Story Baptiste : https://www.canva.com/design/DAFe4JlhJTA/b1-Dk9lBY3hDeMsNbxcmNA/edit?utm_content=DAFe4JlhJTA&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton
-User Story Corrine : https://www.canva.com/design/DAFe4IVvv84/H-k_-bL1TaoNv2XO7z2XOg/edit?utm_content=DAFe4IVvv84&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton
diff --git a/MusiLib/MusiLib.sln b/MusiLib/MusiLib.sln
new file mode 100644
index 0000000..eb5193b
--- /dev/null
+++ b/MusiLib/MusiLib.sln
@@ -0,0 +1,27 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31611.283
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MusiLib", "MusiLib\MusiLib.csproj", "{0990C3B0-336B-4149-A13E-1E10F136A8A8}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0990C3B0-336B-4149-A13E-1E10F136A8A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0990C3B0-336B-4149-A13E-1E10F136A8A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0990C3B0-336B-4149-A13E-1E10F136A8A8}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {0990C3B0-336B-4149-A13E-1E10F136A8A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0990C3B0-336B-4149-A13E-1E10F136A8A8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0990C3B0-336B-4149-A13E-1E10F136A8A8}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}
+ EndGlobalSection
+EndGlobal
diff --git a/MusiLib/MusiLib/App.xaml b/MusiLib/MusiLib/App.xaml
new file mode 100644
index 0000000..20b83a2
--- /dev/null
+++ b/MusiLib/MusiLib/App.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MusiLib/MusiLib/App.xaml.cs b/MusiLib/MusiLib/App.xaml.cs
new file mode 100644
index 0000000..f389066
--- /dev/null
+++ b/MusiLib/MusiLib/App.xaml.cs
@@ -0,0 +1,39 @@
+using MusiLib.Model;
+
+namespace MusiLib;
+
+public partial class App : Application
+{
+
+ public Manager MyManager { get; private set; } = new Manager(new Stub.Stub());
+
+ public string FileNameFU { get; set; } = "favorisUtilisateurs.xml";
+ public string FileNameP { get; set; } = "partitions.xml";
+ public string FilePath { get; set; } = FileSystem.AppDataDirectory;
+
+ public App()
+ {
+ InitializeComponent();
+
+ string favorisUtilisateursFilePath = Path.Combine(FilePath, FileNameFU);
+ string partitionsFilePath = Path.Combine(FilePath, FileNameP);
+
+ /*Si les fichiers existent déjà , on récupère la persistance car on a donc des favoris à récupérer*/
+ if (File.Exists(partitionsFilePath) && File.Exists(favorisUtilisateursFilePath))
+ {
+ MyManager = new Manager(new DataContractPersistance.DataContractPers());
+ }
+
+ MyManager.chargeDonnees();
+
+ MainPage = new AppShell();
+
+ if (!File.Exists(partitionsFilePath) && !File.Exists(favorisUtilisateursFilePath))
+ {
+ MyManager.Persistance = new DataContractPersistance.DataContractPers();
+ }
+
+ MyManager.sauvegardeDonnees();
+
+ }
+}
diff --git a/MusiLib/MusiLib/AppShell.xaml b/MusiLib/MusiLib/AppShell.xaml
new file mode 100644
index 0000000..f271e48
--- /dev/null
+++ b/MusiLib/MusiLib/AppShell.xaml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/MusiLib/MusiLib/AppShell.xaml.cs b/MusiLib/MusiLib/AppShell.xaml.cs
new file mode 100644
index 0000000..02ecd04
--- /dev/null
+++ b/MusiLib/MusiLib/AppShell.xaml.cs
@@ -0,0 +1,9 @@
+namespace MusiLib;
+
+public partial class AppShell : Shell
+{
+ public AppShell()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/MusiLib/MusiLib/DataContractPersistance/DataContractPers.cs b/MusiLib/MusiLib/DataContractPersistance/DataContractPers.cs
new file mode 100644
index 0000000..383925a
--- /dev/null
+++ b/MusiLib/MusiLib/DataContractPersistance/DataContractPers.cs
@@ -0,0 +1,142 @@
+using Microsoft.Maui.Controls.PlatformConfiguration;
+using MusiLib.Model;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Runtime.Serialization;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml;
+
+namespace MusiLib.DataContractPersistance
+{
+ public class DataContractPers : IPersistanceManager
+ {
+ public string FilePath { get; set; } = FileSystem.AppDataDirectory; /* FileSystem.AppDataDirectory permet de renvoyez le chemin d'accès au répertoire spécifique de donnée
+ * ou l'application peut stocker des fichiers ou des données persistantes*/
+ public string FileNameFU { get; set; } = "favorisUtilisateurs.xml"; /* déclaration des noms des fichiers stockés pour la persistance*/
+ public string FileNameP { get; set; } = "partitions.xml";
+
+ public (List, List) chargeDonnees() /*Méthode permettant de charger les données*/
+ {
+ var partitionsSerializer = new DataContractSerializer(typeof(List));
+ var favorisUtilisateursSerializer = new DataContractSerializer(typeof(DataToPersist));
+
+ List partitions = new List();
+ List favoris = new List();
+
+ using (Stream partitionsStream = File.OpenRead(Path.Combine(FilePath, "partitions.xml"))) /*Path.Combine permet de combiner plusieurs segments de chemin en une seule chaine de chemin*/
+ {
+ partitions = partitionsSerializer.ReadObject(partitionsStream) as List; /*Serializer permet de convertir des objets */
+ }
+
+ using (Stream favorisUtilisateursStream = File.OpenRead(Path.Combine(FilePath, "favorisUtilisateurs.xml")))
+ {
+ DataToPersist data = favorisUtilisateursSerializer.ReadObject(favorisUtilisateursStream) as DataToPersist;
+ favoris = data.favoris;
+ }
+
+ return (partitions, favoris);
+ }
+
+
+ public void sauvegardeDonnees(List p, List f) /*Méthode permettant de sauvegarder les données*/
+ {
+ var partitionsSerializer = new DataContractSerializer(typeof(List));
+ var favorisUtilisateursSerializer = new DataContractSerializer(typeof(DataToPersist));
+
+ if (!Directory.Exists(FilePath))
+ {
+ Debug.WriteLine("Directory créé à l'instant");
+ Debug.WriteLine(Directory.GetDirectoryRoot(FilePath));
+ Debug.WriteLine(FilePath);
+ Directory.CreateDirectory(FilePath);
+ }
+
+ using (Stream partitionsStream = File.Create(Path.Combine(FilePath, FileNameP)))
+ {
+ partitionsSerializer.WriteObject(partitionsStream, p);
+ }
+
+ DataToPersist data = new DataToPersist();
+ data.favoris = f;
+
+ using (Stream favorisUtilisateursStream = File.Create(Path.Combine(FilePath, FileNameFU)))
+ {
+ favorisUtilisateursSerializer.WriteObject(favorisUtilisateursStream, data);
+ }
+ }
+
+ public void sauvegardeFavoriAdd(Partition fav) /*Méthode permettant la sauvegarde de favoris*/
+ {
+ var favorisUtilisateursSerializer = new DataContractSerializer(typeof(DataToPersist));
+
+ if (!Directory.Exists(FilePath))
+ {
+ Debug.WriteLine("Directory créé à l'instant");
+ Debug.WriteLine(Directory.GetDirectoryRoot(FilePath));
+ Debug.WriteLine(FilePath);
+ Directory.CreateDirectory(FilePath);
+ }
+
+ List favoris = new List();
+ using (Stream favorisUtilisateursStream = File.OpenRead(Path.Combine(FilePath, FileNameFU)))
+ {
+ DataToPersist data = favorisUtilisateursSerializer.ReadObject(favorisUtilisateursStream) as DataToPersist;
+ if (data != null && data.favoris != null)
+ {
+ favoris = data.favoris;
+ }
+ }
+
+ favoris.Add(fav);
+
+ using (Stream favorisUtilisateursStream = File.Create(Path.Combine(FilePath, FileNameFU)))
+ {
+ DataToPersist data = new DataToPersist();
+ data.favoris = favoris;
+ favorisUtilisateursSerializer.WriteObject(favorisUtilisateursStream, data);
+ }
+
+ Debug.WriteLine("Nouveau favori sauvegardé !");
+ }
+
+ public void sauvegardeFavoriRemove(Partition fav) /*Méthode permettant la sauvegarde de suppression de favoris */
+ {
+ var favorisUtilisateursSerializer = new DataContractSerializer(typeof(DataToPersist));
+
+ if (!Directory.Exists(FilePath))
+ {
+ Debug.WriteLine("Directory créé à l'instant");
+ Debug.WriteLine(Directory.GetDirectoryRoot(FilePath));
+ Debug.WriteLine(FilePath);
+ Directory.CreateDirectory(FilePath);
+ }
+
+ List favoris = new List();
+ using (Stream favorisUtilisateursStream = File.OpenRead(Path.Combine(FilePath, FileNameFU)))
+ {
+ DataToPersist data = favorisUtilisateursSerializer.ReadObject(favorisUtilisateursStream) as DataToPersist;
+ if (data != null && data.favoris != null)
+ {
+ favoris = data.favoris;
+ }
+ }
+
+ favoris.RemoveAll(f => f.Nom == fav.Nom);
+
+ using (Stream favorisUtilisateursStream = File.Create(Path.Combine(FilePath, FileNameFU)))
+ {
+ DataToPersist data = new DataToPersist();
+ data.favoris = favoris;
+ favorisUtilisateursSerializer.WriteObject(favorisUtilisateursStream, data);
+ }
+
+ Debug.WriteLine("Favori supprimé de la sauvegarde !");
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/MusiLib/MusiLib/DataContractPersistance/DataToPersist.cs b/MusiLib/MusiLib/DataContractPersistance/DataToPersist.cs
new file mode 100644
index 0000000..66d9b1e
--- /dev/null
+++ b/MusiLib/MusiLib/DataContractPersistance/DataToPersist.cs
@@ -0,0 +1,15 @@
+using MusiLib.Model;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MusiLib.DataContractPersistance
+{
+ public class DataToPersist
+ {
+ public List partitions { get; set; } = new List();
+ public List favoris { get; set; } = new List();
+ }
+}
diff --git a/MusiLib/MusiLib/MauiProgram.cs b/MusiLib/MusiLib/MauiProgram.cs
new file mode 100644
index 0000000..5399d33
--- /dev/null
+++ b/MusiLib/MusiLib/MauiProgram.cs
@@ -0,0 +1,24 @@
+using MusiLib.Model;
+using MusiLib.Views;
+using Plugin.Maui.Audio;
+
+namespace MusiLib;
+
+public static class MauiProgram
+{
+ public static MauiApp CreateMauiApp()
+ {
+ var builder = MauiApp.CreateBuilder();
+ builder
+ .UseMauiApp()
+ .ConfigureFonts(fonts =>
+ {
+ fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
+ fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
+ });
+
+ builder.Services.AddSingleton(AudioManager.Current);
+
+ return builder.Build();
+ }
+}
diff --git a/MusiLib/MusiLib/Model/IPersistanceManager.cs b/MusiLib/MusiLib/Model/IPersistanceManager.cs
new file mode 100644
index 0000000..d3b94dc
--- /dev/null
+++ b/MusiLib/MusiLib/Model/IPersistanceManager.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MusiLib.Model
+{
+ public interface IPersistanceManager
+ {
+ (List, List) chargeDonnees();
+
+ /*déclaration de fonctions abstraites*/
+ void sauvegardeDonnees(List p, List f);
+
+ void sauvegardeFavoriAdd(Partition fav);
+
+ void sauvegardeFavoriRemove(Partition fav);
+ }
+}
diff --git a/MusiLib/MusiLib/Model/Manager.cs b/MusiLib/MusiLib/Model/Manager.cs
new file mode 100644
index 0000000..b424c29
--- /dev/null
+++ b/MusiLib/MusiLib/Model/Manager.cs
@@ -0,0 +1,60 @@
+using MusiLib.Model;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MusiLib.Model
+{
+ public class Manager
+ {
+ public IPersistanceManager Persistance { get; set; }
+ public List partitions { get; private set; }
+ public List favoris { get; private set; }
+
+ public Manager()
+ {
+ partitions = new List();
+ favoris = new List();
+ }
+
+ public Manager(IPersistanceManager persistance)
+ {
+ Persistance = persistance;
+ partitions = new List();
+ favoris = new List();
+ }
+
+ public void ajouterPartition(Partition partition)
+ {
+ partitions.Add(partition);
+ }
+
+ public void chargeDonnees()
+ {
+ var donnees = Persistance.chargeDonnees(); /*variable local, permet d'éviter la répétition d'un nom de type dans une déclaration de variable */
+ partitions.AddRange(donnees.Item1);
+ favoris.AddRange(donnees.Item2);
+ }
+
+ public void sauvegardeDonnees() /*Sauvegarde les partitions et favoris*/
+ {
+ Persistance.sauvegardeDonnees(partitions, favoris);
+ }
+
+ public void sauvegardeFavoriAdd(Partition fav) /*Sauvegarde des Favoris*/
+ {
+ Persistance.sauvegardeFavoriAdd(fav);
+ }
+
+ public void sauvegardeFavoriRemove(Partition fav) /*Suppression d'une partition contenu dans les Favoris*/
+ {
+ Persistance.sauvegardeFavoriRemove(fav);
+ }
+
+ }
+}
+
+
diff --git a/MusiLib/MusiLib/Model/Metronome.cs b/MusiLib/MusiLib/Model/Metronome.cs
new file mode 100644
index 0000000..1b53f84
--- /dev/null
+++ b/MusiLib/MusiLib/Model/Metronome.cs
@@ -0,0 +1,68 @@
+using Plugin.Maui.Audio;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Maui.Controls;
+
+
+namespace MusiLib.Model
+{
+ public class Metronome
+ {
+ public AudioPlayer player;
+ public bool isMusicPlaying;
+ public bool isMusicBeginning;
+
+ public Metronome()
+ {
+ player = DependencyService.Get(); /* DependencyService = méthode utilisée pour obtenir une instance d'un service audio personnalisé.*/
+ isMusicPlaying = false;
+ }
+
+ public async Task Lancer(string cheminFichier)
+ {
+ var fichierAudio = (AudioPlayer)AudioManager.Current.CreatePlayer(await FileSystem.OpenAppPackageFileAsync(cheminFichier)); /*Créer un lecteur Audio à partir d'un fichier se trouvant dans le package de l'application*/
+ player = fichierAudio;
+ player.Play(); /*Méthode permettant de lancer la musique venant de Plugin.Maui.Audio */
+ isMusicPlaying=true;
+ isMusicBeginning =true;
+ }
+ public void PlayMusic() /*Méthode permettant de jouer/relancer la musique*/
+ {
+ player.Play();
+ isMusicPlaying = true;
+ }
+ public void PauseMusic() /*Méthode permettant la mise en pause de la musique*/
+ {
+ player.Pause();
+ isMusicPlaying = false;
+ }
+ public void StopMusic() /*Méthode permettant de stopper la lecture de la musique*/
+ {
+ if (isMusicBeginning)
+ {
+ player.Stop(); /*Méthode permettant de stopper la musique venant de Plugin.Maui.Audio*/
+ isMusicPlaying = false;
+ isMusicBeginning = false;
+ }
+ }
+ public void ReglerTempo(float tempo) /*Méthode permettant de regler la vitesse d'un objet de classe méttronome*/
+ {
+ if(!isMusicBeginning)
+ {
+ return;
+ }
+ if(!isMusicPlaying)
+ {
+ player.Speed = tempo; /*Méthode de Plugin.maui.Audio permettant de régler la vitesse d'un audio/vidéo*/
+ player.Pause();
+ return;
+ }
+ player.Speed = tempo;
+ }
+ }
+
+}
+
diff --git a/MusiLib/MusiLib/Model/Partition.cs b/MusiLib/MusiLib/Model/Partition.cs
new file mode 100644
index 0000000..538760d
--- /dev/null
+++ b/MusiLib/MusiLib/Model/Partition.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Serialization;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MusiLib.Model
+{
+ [DataContract]
+ public class Partition
+ {
+ [DataMember]
+ public static int idTotal = 0;
+ [DataMember]
+ public string Nom { get; private set; }
+ [DataMember]
+ public List Image { get; private set; }
+ [DataMember]
+ public int IdPartition { get; private set; }
+ [DataMember]
+ public string Auteur { get; private set; }
+ [DataMember]
+ public string Complexite { get; private set; }
+ [DataMember]
+ public string Description { get; private set; }
+ [DataMember]
+ public string Instrument { get; private set; }
+ [DataMember]
+ public string Son { get; private set; }
+
+ public Partition(string nom, string auteur, string complexite, string description, string instrument, string son)
+ {
+ Nom = nom;
+ IdPartition = idTotal;
+ Auteur = auteur;
+ Complexite = complexite;
+ Description = description;
+ Instrument = instrument;
+ Image = new List();
+ Son = son;
+ }
+ public void ajouterImage(string image)
+ {
+ Image.Add(image);
+ }
+ public void supprimerImage(string image)
+ {
+ Image.Remove(image);
+ }
+
+ }
+}
diff --git a/MusiLib/MusiLib/Model/Trier.cs b/MusiLib/MusiLib/Model/Trier.cs
new file mode 100644
index 0000000..ba1fa31
--- /dev/null
+++ b/MusiLib/MusiLib/Model/Trier.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using MusiLib.Model;
+
+namespace MusiLib.Model
+{
+ public class Trier
+ {
+ private List partitionsInitiales;
+ private List partitionsFiltrees;
+
+ public Trier(List partitions)
+ {
+ partitionsInitiales = partitions;
+ partitionsFiltrees = new List(partitionsInitiales);
+ }
+
+ public List TrierParInstrument(string instrument) /*Méthode permettant de trier les partitions par instrument*/
+ {
+ partitionsFiltrees = partitionsInitiales.Where(p => p.Instrument.ToLower() == instrument.ToLower()).ToList(); /*ToLower permet la convertion d'une chaine de caractères en minuscules*/
+ return partitionsFiltrees;
+ }
+
+ public List TrierParComplexite(string complexite) /*Méthode permettant de trier les partitions par leur complexité (difficulté à les jouer)*/
+ {
+ partitionsFiltrees = partitionsInitiales.Where(p => p.Complexite.ToLower() == complexite.ToLower()).ToList();
+ Console.WriteLine("string : " + complexite);
+ foreach (Partition partition in partitionsInitiales)
+ {
+ Console.WriteLine(partition.Complexite);
+ }
+ return partitionsFiltrees;
+ }
+
+ public List TrierParOrdreAlphabetique(string ordre) /*Méthode permetttant de trier les partitions par l'ordre alphabétique de leur Nom*/
+ {
+ if (ordre == "Croissant")
+ partitionsFiltrees = partitionsInitiales.OrderBy(p => p.Nom).ToList();
+ else if (ordre == "Décroissant")
+ partitionsFiltrees = partitionsInitiales.OrderByDescending(p => p.Nom).ToList();
+
+ return partitionsFiltrees;
+ }
+ }
+}
diff --git a/MusiLib/MusiLib/MusiLib.csproj b/MusiLib/MusiLib/MusiLib.csproj
new file mode 100644
index 0000000..0261ade
--- /dev/null
+++ b/MusiLib/MusiLib/MusiLib.csproj
@@ -0,0 +1,65 @@
+
+
+
+ net6.0-android;net6.0-ios;net6.0-maccatalyst
+ $(TargetFrameworks);net6.0-windows10.0.19041.0
+
+
+ Exe
+ MusiLib
+ true
+ true
+ enable
+
+
+ MusiLib
+
+
+ fr.iut.musilib
+ c2deb312-b3f3-425c-8e4b-18b5328ffd7c
+
+
+ 1.0
+ 1
+
+ 14.2
+ 14.0
+ 23.0
+ 10.0.17763.0
+ 10.0.17763.0
+ 6.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PartitionView.xaml
+
+
+
+
diff --git a/MusiLib/MusiLib/Platforms/Android/AndroidManifest.xml b/MusiLib/MusiLib/Platforms/Android/AndroidManifest.xml
new file mode 100644
index 0000000..c612c62
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/Android/AndroidManifest.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MusiLib/MusiLib/Platforms/Android/MainActivity.cs b/MusiLib/MusiLib/Platforms/Android/MainActivity.cs
new file mode 100644
index 0000000..1313faa
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/Android/MainActivity.cs
@@ -0,0 +1,11 @@
+using Android.App;
+using Android.Content.PM;
+using Android.OS;
+
+namespace MusiLib;
+
+
+[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density, ScreenOrientation = ScreenOrientation.Portrait)]
+public class MainActivity : MauiAppCompatActivity
+{
+}
diff --git a/MusiLib/MusiLib/Platforms/Android/MainApplication.cs b/MusiLib/MusiLib/Platforms/Android/MainApplication.cs
new file mode 100644
index 0000000..869ce7e
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/Android/MainApplication.cs
@@ -0,0 +1,15 @@
+using Android.App;
+using Android.Runtime;
+
+namespace MusiLib;
+
+[Application]
+public class MainApplication : MauiApplication
+{
+ public MainApplication(IntPtr handle, JniHandleOwnership ownership)
+ : base(handle, ownership)
+ {
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
diff --git a/MusiLib/MusiLib/Platforms/Android/Resources/values/colors.xml b/MusiLib/MusiLib/Platforms/Android/Resources/values/colors.xml
new file mode 100644
index 0000000..c04d749
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/Android/Resources/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #512BD4
+ #2B0B98
+ #2B0B98
+
\ No newline at end of file
diff --git a/MusiLib/MusiLib/Platforms/MacCatalyst/AppDelegate.cs b/MusiLib/MusiLib/Platforms/MacCatalyst/AppDelegate.cs
new file mode 100644
index 0000000..2e894b0
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/MacCatalyst/AppDelegate.cs
@@ -0,0 +1,9 @@
+using Foundation;
+
+namespace MusiLib;
+
+[Register("AppDelegate")]
+public class AppDelegate : MauiUIApplicationDelegate
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
diff --git a/MusiLib/MusiLib/Platforms/MacCatalyst/Info.plist b/MusiLib/MusiLib/Platforms/MacCatalyst/Info.plist
new file mode 100644
index 0000000..c96dd0a
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/MacCatalyst/Info.plist
@@ -0,0 +1,30 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/MusiLib/MusiLib/Platforms/MacCatalyst/Program.cs b/MusiLib/MusiLib/Platforms/MacCatalyst/Program.cs
new file mode 100644
index 0000000..9dcf8b7
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/MacCatalyst/Program.cs
@@ -0,0 +1,15 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace MusiLib;
+
+public class Program
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
diff --git a/MusiLib/MusiLib/Platforms/Tizen/Main.cs b/MusiLib/MusiLib/Platforms/Tizen/Main.cs
new file mode 100644
index 0000000..0f2afa1
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/Tizen/Main.cs
@@ -0,0 +1,16 @@
+using System;
+using Microsoft.Maui;
+using Microsoft.Maui.Hosting;
+
+namespace MusiLib;
+
+class Program : MauiApplication
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+
+ static void Main(string[] args)
+ {
+ var app = new Program();
+ app.Run(args);
+ }
+}
diff --git a/MusiLib/MusiLib/Platforms/Tizen/tizen-manifest.xml b/MusiLib/MusiLib/Platforms/Tizen/tizen-manifest.xml
new file mode 100644
index 0000000..988df34
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/Tizen/tizen-manifest.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ maui-appicon-placeholder
+
+
+
+
+ http://tizen.org/privilege/internet
+
+
+
+
\ No newline at end of file
diff --git a/MusiLib/MusiLib/Platforms/Windows/App.xaml b/MusiLib/MusiLib/Platforms/Windows/App.xaml
new file mode 100644
index 0000000..107462c
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/Windows/App.xaml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/MusiLib/MusiLib/Platforms/Windows/App.xaml.cs b/MusiLib/MusiLib/Platforms/Windows/App.xaml.cs
new file mode 100644
index 0000000..8ceeb23
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/Windows/App.xaml.cs
@@ -0,0 +1,24 @@
+using Microsoft.UI.Xaml;
+
+// To learn more about WinUI, the WinUI project structure,
+// and more about our project templates, see: http://aka.ms/winui-project-info.
+
+namespace MusiLib.WinUI;
+
+///
+/// Provides application-specific behavior to supplement the default Application class.
+///
+public partial class App : MauiWinUIApplication
+{
+ ///
+ /// Initializes the singleton application object. This is the first line of authored code
+ /// executed, and as such is the logical equivalent of main() or WinMain().
+ ///
+ public App()
+ {
+ this.InitializeComponent();
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/MusiLib/MusiLib/Platforms/Windows/Package.appxmanifest b/MusiLib/MusiLib/Platforms/Windows/Package.appxmanifest
new file mode 100644
index 0000000..81fb4da
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/Windows/Package.appxmanifest
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+ $placeholder$
+ User Name
+ $placeholder$.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MusiLib/MusiLib/Platforms/Windows/app.manifest b/MusiLib/MusiLib/Platforms/Windows/app.manifest
new file mode 100644
index 0000000..83d965a
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/Windows/app.manifest
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+ true/PM
+ PerMonitorV2, PerMonitor
+
+
+
diff --git a/MusiLib/MusiLib/Platforms/iOS/AppDelegate.cs b/MusiLib/MusiLib/Platforms/iOS/AppDelegate.cs
new file mode 100644
index 0000000..2e894b0
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/iOS/AppDelegate.cs
@@ -0,0 +1,9 @@
+using Foundation;
+
+namespace MusiLib;
+
+[Register("AppDelegate")]
+public class AppDelegate : MauiUIApplicationDelegate
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
diff --git a/MusiLib/MusiLib/Platforms/iOS/Info.plist b/MusiLib/MusiLib/Platforms/iOS/Info.plist
new file mode 100644
index 0000000..0004a4f
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/iOS/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ LSRequiresIPhoneOS
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/MusiLib/MusiLib/Platforms/iOS/Program.cs b/MusiLib/MusiLib/Platforms/iOS/Program.cs
new file mode 100644
index 0000000..9dcf8b7
--- /dev/null
+++ b/MusiLib/MusiLib/Platforms/iOS/Program.cs
@@ -0,0 +1,15 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace MusiLib;
+
+public class Program
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
diff --git a/MusiLib/MusiLib/Properties/launchSettings.json b/MusiLib/MusiLib/Properties/launchSettings.json
new file mode 100644
index 0000000..edf8aad
--- /dev/null
+++ b/MusiLib/MusiLib/Properties/launchSettings.json
@@ -0,0 +1,8 @@
+{
+ "profiles": {
+ "Windows Machine": {
+ "commandName": "MsixPackage",
+ "nativeDebugging": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/MusiLib/MusiLib/Resources/AppIcon/appicon.png b/MusiLib/MusiLib/Resources/AppIcon/appicon.png
new file mode 100644
index 0000000..4ecbc4a
Binary files /dev/null and b/MusiLib/MusiLib/Resources/AppIcon/appicon.png differ
diff --git a/MusiLib/MusiLib/Resources/AppIcon/appicon.svg b/MusiLib/MusiLib/Resources/AppIcon/appicon.svg
new file mode 100644
index 0000000..9d63b65
--- /dev/null
+++ b/MusiLib/MusiLib/Resources/AppIcon/appicon.svg
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/MusiLib/MusiLib/Resources/AppIcon/appiconfg.svg b/MusiLib/MusiLib/Resources/AppIcon/appiconfg.svg
new file mode 100644
index 0000000..21dfb25
--- /dev/null
+++ b/MusiLib/MusiLib/Resources/AppIcon/appiconfg.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/MusiLib/MusiLib/Resources/Fonts/OpenSans-Regular.ttf b/MusiLib/MusiLib/Resources/Fonts/OpenSans-Regular.ttf
new file mode 100644
index 0000000..a49f11d
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Fonts/OpenSans-Regular.ttf differ
diff --git a/MusiLib/MusiLib/Resources/Fonts/OpenSans-Semibold.ttf b/MusiLib/MusiLib/Resources/Fonts/OpenSans-Semibold.ttf
new file mode 100644
index 0000000..23911e4
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Fonts/OpenSans-Semibold.ttf differ
diff --git a/MusiLib/MusiLib/Resources/Images/amazing.png b/MusiLib/MusiLib/Resources/Images/amazing.png
new file mode 100644
index 0000000..77e6321
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/amazing.png differ
diff --git a/MusiLib/MusiLib/Resources/Images/au_clair.png b/MusiLib/MusiLib/Resources/Images/au_clair.png
new file mode 100644
index 0000000..a1e753b
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/au_clair.png differ
diff --git a/MusiLib/MusiLib/Resources/Images/aura_lee_love_me.png b/MusiLib/MusiLib/Resources/Images/aura_lee_love_me.png
new file mode 100644
index 0000000..b6d290d
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/aura_lee_love_me.png differ
diff --git a/MusiLib/MusiLib/Resources/Images/dotnet_bot.svg b/MusiLib/MusiLib/Resources/Images/dotnet_bot.svg
new file mode 100644
index 0000000..abfaff2
--- /dev/null
+++ b/MusiLib/MusiLib/Resources/Images/dotnet_bot.svg
@@ -0,0 +1,93 @@
+
diff --git a/MusiLib/MusiLib/Resources/Images/etoile.png b/MusiLib/MusiLib/Resources/Images/etoile.png
new file mode 100644
index 0000000..a4176e5
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/etoile.png differ
diff --git a/MusiLib/MusiLib/Resources/Images/etoile_vide.png b/MusiLib/MusiLib/Resources/Images/etoile_vide.png
new file mode 100644
index 0000000..d4b1fc4
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/etoile_vide.png differ
diff --git a/MusiLib/MusiLib/Resources/Images/fais_dodo_colas.png b/MusiLib/MusiLib/Resources/Images/fais_dodo_colas.png
new file mode 100644
index 0000000..6477793
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/fais_dodo_colas.png differ
diff --git a/MusiLib/MusiLib/Resources/Images/frere_jacques.png b/MusiLib/MusiLib/Resources/Images/frere_jacques.png
new file mode 100644
index 0000000..f118c49
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/frere_jacques.png differ
diff --git a/MusiLib/MusiLib/Resources/Images/logo.png b/MusiLib/MusiLib/Resources/Images/logo.png
new file mode 100644
index 0000000..4ecbc4a
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/logo.png differ
diff --git a/MusiLib/MusiLib/Resources/Images/ode_a_la.png b/MusiLib/MusiLib/Resources/Images/ode_a_la.png
new file mode 100644
index 0000000..f7e3bac
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/ode_a_la.png differ
diff --git a/MusiLib/MusiLib/Resources/Images/partition.png b/MusiLib/MusiLib/Resources/Images/partition.png
new file mode 100644
index 0000000..4bc0acf
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/partition.png differ
diff --git a/MusiLib/MusiLib/Resources/Images/tri.png b/MusiLib/MusiLib/Resources/Images/tri.png
new file mode 100644
index 0000000..ed3f8e1
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/tri.png differ
diff --git a/MusiLib/MusiLib/Resources/Raw/40_BPM_Metronome.mp3 b/MusiLib/MusiLib/Resources/Raw/40_BPM_Metronome.mp3
new file mode 100644
index 0000000..f4ec766
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/40_BPM_Metronome.mp3 differ
diff --git a/MusiLib/MusiLib/Resources/Raw/AboutAssets.txt b/MusiLib/MusiLib/Resources/Raw/AboutAssets.txt
new file mode 100644
index 0000000..15d6244
--- /dev/null
+++ b/MusiLib/MusiLib/Resources/Raw/AboutAssets.txt
@@ -0,0 +1,15 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories). Deployment of the asset to your application
+is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
+
+
+
+These files will be deployed with you package and will be accessible using Essentials:
+
+ async Task LoadMauiAsset()
+ {
+ using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
+ using var reader = new StreamReader(stream);
+
+ var contents = reader.ReadToEnd();
+ }
diff --git a/MusiLib/MusiLib/Resources/Raw/ah-vous-dirai-je-maman.mid b/MusiLib/MusiLib/Resources/Raw/ah-vous-dirai-je-maman.mid
new file mode 100644
index 0000000..82bcd03
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/ah-vous-dirai-je-maman.mid differ
diff --git a/MusiLib/MusiLib/Resources/Raw/amazing-grace.mid b/MusiLib/MusiLib/Resources/Raw/amazing-grace.mid
new file mode 100644
index 0000000..4bcdce8
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/amazing-grace.mid differ
diff --git a/MusiLib/MusiLib/Resources/Raw/au_clair_de_la_lune.mp3 b/MusiLib/MusiLib/Resources/Raw/au_clair_de_la_lune.mp3
new file mode 100644
index 0000000..9551d00
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/au_clair_de_la_lune.mp3 differ
diff --git a/MusiLib/MusiLib/Resources/Raw/au_clair_de_la_lune.wav b/MusiLib/MusiLib/Resources/Raw/au_clair_de_la_lune.wav
new file mode 100644
index 0000000..1cd6d0a
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/au_clair_de_la_lune.wav differ
diff --git a/MusiLib/MusiLib/Resources/Raw/aura-lee-love-me-tender.mid b/MusiLib/MusiLib/Resources/Raw/aura-lee-love-me-tender.mid
new file mode 100644
index 0000000..ce15d20
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/aura-lee-love-me-tender.mid differ
diff --git a/MusiLib/MusiLib/Resources/Raw/fais-dodo-colas-mon-petit-frere.mid b/MusiLib/MusiLib/Resources/Raw/fais-dodo-colas-mon-petit-frere.mid
new file mode 100644
index 0000000..de63a64
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/fais-dodo-colas-mon-petit-frere.mid differ
diff --git a/MusiLib/MusiLib/Resources/Raw/frere-jacques.mid b/MusiLib/MusiLib/Resources/Raw/frere-jacques.mid
new file mode 100644
index 0000000..a50803a
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/frere-jacques.mid differ
diff --git a/MusiLib/MusiLib/Resources/Raw/la-mort-d-ase-tod-death.mid b/MusiLib/MusiLib/Resources/Raw/la-mort-d-ase-tod-death.mid
new file mode 100644
index 0000000..bd53033
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/la-mort-d-ase-tod-death.mid differ
diff --git a/MusiLib/MusiLib/Resources/Raw/lettre-a-elise.mid b/MusiLib/MusiLib/Resources/Raw/lettre-a-elise.mid
new file mode 100644
index 0000000..829916a
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/lettre-a-elise.mid differ
diff --git a/MusiLib/MusiLib/Resources/Raw/romance-en-mi-majeur.mid b/MusiLib/MusiLib/Resources/Raw/romance-en-mi-majeur.mid
new file mode 100644
index 0000000..9840962
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/romance-en-mi-majeur.mid differ
diff --git a/MusiLib/MusiLib/Resources/Splash/splash.png b/MusiLib/MusiLib/Resources/Splash/splash.png
new file mode 100644
index 0000000..4ecbc4a
Binary files /dev/null and b/MusiLib/MusiLib/Resources/Splash/splash.png differ
diff --git a/MusiLib/MusiLib/Resources/Splash/splash.svg b/MusiLib/MusiLib/Resources/Splash/splash.svg
new file mode 100644
index 0000000..21dfb25
--- /dev/null
+++ b/MusiLib/MusiLib/Resources/Splash/splash.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/MusiLib/MusiLib/Resources/Styles/Colors.xaml b/MusiLib/MusiLib/Resources/Styles/Colors.xaml
new file mode 100644
index 0000000..245758b
--- /dev/null
+++ b/MusiLib/MusiLib/Resources/Styles/Colors.xaml
@@ -0,0 +1,44 @@
+
+
+
+
+ #512BD4
+ #DFD8F7
+ #2B0B98
+ White
+ Black
+ #E1E1E1
+ #C8C8C8
+ #ACACAC
+ #919191
+ #6E6E6E
+ #404040
+ #212121
+ #141414
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #F7B548
+ #FFD590
+ #FFE5B9
+ #28C2D1
+ #7BDDEF
+ #C3F2F4
+ #3E8EED
+ #72ACF1
+ #A7CBF6
+
+
\ No newline at end of file
diff --git a/MusiLib/MusiLib/Resources/Styles/Styles.xaml b/MusiLib/MusiLib/Resources/Styles/Styles.xaml
new file mode 100644
index 0000000..1ec9d55
--- /dev/null
+++ b/MusiLib/MusiLib/Resources/Styles/Styles.xaml
@@ -0,0 +1,384 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MusiLib/MusiLib/Stub/Stub.cs b/MusiLib/MusiLib/Stub/Stub.cs
new file mode 100644
index 0000000..62dc8eb
--- /dev/null
+++ b/MusiLib/MusiLib/Stub/Stub.cs
@@ -0,0 +1,61 @@
+using Microsoft.Maui.Controls;
+using MusiLib.Model;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Cryptography.X509Certificates;
+using System.Text;
+using System.Threading.Tasks;
+
+
+namespace MusiLib.Stub
+{
+ public class Stub : IPersistanceManager
+ {
+ public (List, List) chargeDonnees()
+ {
+ List partitions = new List();
+
+ List favoris = new List();
+
+
+ /*Charge toutes nos partitions*/
+
+ Partition amazing_grace = new Partition("Amazing Grace", "John Newton", "Facile", "Amazing Grace est l'un des cantiques chrétiens les plus célèbres dans le monde anglophone. La première publication des paroles date de 1779. Associé à diverses mélodies au fil des années, il est aujourd'hui interprété sur la musique de New Britain", "piano", "amazing-grace.mid");
+ Partition au_clair_de_la_lune = new Partition("Au clair de la lune", "Édouard-Léon Scott de Martinville", "Moyen", "Au clair de la lune est une chanson populaire française dont la mélodie, très caractéristique, ainsi que les paroles — surtout celles du premier couplet — sont si familières qu'elles ont fait l'objet d'innombrables citations, adaptations, parodies, pastiches, etc.", "piano", "au_clair_de_la_lune.wav");
+ Partition aura_lee_love_me = new Partition("aura lee love me", "Elvis Presley", "Facile", " Love Me Tender est une ballade de 1956 enregistrée par Elvis Presley et publiée par Elvis Presley Music du film du même nom de la 20th Century Fox . Les paroles sont créditées à Vera Matson (bien que le parolier réel était son mari, Ken Darby) et Elvis Presley lui-même. La mélodie est identique à la ballade sentimentale de la guerre civile Aura Lea et donc attribuée au compositeur d'Aura Lea, l'Anglais George R. Poulton.", "piano", "aura-lee-love-me-tender.mid");
+ Partition ode_a_la_joie = new Partition("Hymne à la joie", "Friedrich von Schiller", "Difficile", "Ode à la joie — appelée également Hymne à la joie1 — est un poème de Friedrich von Schiller écrit en 1785. Il est surtout connu comme finale du quatrième et dernier mouvement de la 9e Symphonie de Beethoven, devenu l'hymne officiel de l'Union européenne2.Ce poème célèbre l'idéal de l'unité et de la fraternité humaines (« Millions d’êtres, soyez tous embrassés d’une commune étreinte ! ). Son titre original est An die Freude, mais il est souvent appelé Ode an die Freude.", "piano", "amazing-grace.mid");
+ Partition fais_dodo_colas = new Partition("Fais dodo", "Inconnu", "Facile", "Fais dodo est une berceuse enfantine en langue française dont l'auteur est inconnu et est dans le domaine public. La mélodie, très connue, date du XVIIIe siècle et se chante dans toutes les régions de France et également au Québec. Il y a quelques variantes, où les ingrédients du texte changent : nougat au lieu de chocolat, d'autres fois des bateaux : « Papa est en haut qui fait des bateaux pour le p'tit Pierrot qui fait son dodo... » ", "piano", "fais-dodo-colas-mon-petit-frere.mid");
+ Partition Frere_Jacques = new Partition("Frère Jacques", "Jean-Philippe Rameau", "Moyen", "Frère Jacques est une chanson enfantine française du XVIIIe siècle, connue dans le monde entier et traduite dans de nombreuses langues. Longtemps considérée comme anonyme, elle a vraisemblablement pour auteur Jean-Philippe Rameau. Selon l'historienne et musicologue Sylvie Bouissou, l'auteur de la chanson n'est autre que Jean-Philippe Rameau1,2. En effet, dans un exemplaire de son ouvrage Diapason général de tous les instruments à vent (1772), Louis-Joseph Francœur, violoniste de l'Opéra de Paris dans les années où Rameau y était actif, a inséré les manuscrits de quatre canons qu'il attribue à Rameau, parmi lesquels on trouve donc Frère Jacques, mais surtout deux autres déjà connus comme étant de Rameau;", "piano", "frere-jacques.mid");
+ amazing_grace.ajouterImage("amazing.png");
+ amazing_grace.ajouterImage("au_clair.png");
+ au_clair_de_la_lune.ajouterImage("au_clair.png");
+ aura_lee_love_me.ajouterImage("aura_lee_love_me.png");
+ ode_a_la_joie.ajouterImage("ode_a_la.png");
+ fais_dodo_colas.ajouterImage("fais_dodo_colas.png");
+ Frere_Jacques.ajouterImage("frere_jacques.png");
+ partitions.Add(amazing_grace);
+ partitions.Add(au_clair_de_la_lune);
+ partitions.Add(aura_lee_love_me);
+ partitions.Add(ode_a_la_joie);
+ partitions.Add(fais_dodo_colas);
+ partitions.Add(Frere_Jacques);
+ return (partitions, favoris);
+ }
+
+ public void sauvegardeDonnees(List p, List f)
+ {
+
+ }
+
+ public void sauvegardeFavoriAdd(Partition fav)
+ {
+
+ }
+
+ public void sauvegardeFavoriRemove(Partition fav)
+ {
+
+ }
+ }
+}
diff --git a/MusiLib/MusiLib/Views/Accueil.xaml b/MusiLib/MusiLib/Views/Accueil.xaml
new file mode 100644
index 0000000..3e552fa
--- /dev/null
+++ b/MusiLib/MusiLib/Views/Accueil.xaml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MusiLib/MusiLib/Views/Accueil.xaml.cs b/MusiLib/MusiLib/Views/Accueil.xaml.cs
new file mode 100644
index 0000000..cf52062
--- /dev/null
+++ b/MusiLib/MusiLib/Views/Accueil.xaml.cs
@@ -0,0 +1,200 @@
+using Plugin.Maui.Audio;
+using MusiLib.Model;
+
+namespace MusiLib.Views
+{
+ public partial class Accueil : ContentPage, IAllowClick
+ {
+ public Manager MyManager => (App.Current as App).MyManager;
+
+ private List partitionsInitiales;
+ private List partitionsFiltrees;
+ private Trier trieur;
+
+ public Accueil()
+ {
+ InitializeComponent();
+ partitionsInitiales = MyManager.partitions.ToList();
+ partitionsFiltrees = new List(partitionsInitiales);
+ trieur = new Trier(MyManager.partitions.ToList());
+ BindingContext = MyManager;
+ chargerPartitions();
+ }
+
+ /*Nous redirige vers la page des favoris*/
+ private void GoToFavorisButton(object sender, EventArgs e)
+ {
+ if (!IAllowClick.AllowTap) return;
+ else IAllowClick.AllowTap = false;
+
+ Navigation.PushAsync(new Favoris());
+
+ IAllowClick.ResumeTap();
+ }
+
+ /*Nous redirige vers la partition sur laquelle on a cliqué*/
+ private void GoToPartitionButton(object sender, EventArgs e)
+ {
+ if (!IAllowClick.AllowTap) return;
+ else IAllowClick.AllowTap = false;
+
+ var button = (ImageButton)sender;
+ var idAutomation = button.AutomationId;
+
+ if (int.TryParse(idAutomation, out int id))
+ {
+ Navigation.PushAsync(new PartitionView(id));
+ }
+
+ IAllowClick.ResumeTap();
+ }
+
+ /*Charge automatiquement toutes les partitions en ImageButton et les affiche à l'écran*/
+ private void chargerPartitions()
+ {
+ /*Supprime les partitions présentes (on les différencie des autres ImageButton grâce à l'automationId*/
+ var imageButtonsToRemove = grille.Children.OfType().Where(btn => !string.IsNullOrEmpty(btn.AutomationId)).ToList();
+ foreach (var button in imageButtonsToRemove)
+ {
+ grille.Children.Remove(button);
+ }
+
+
+ int imagesParLigne = 3;
+ int indice = 0;
+
+ /*Crée les ImageButton des partitions*/
+ foreach (Partition partition in partitionsFiltrees)
+ {
+ int indicePartition = MyManager.partitions.IndexOf(partition);
+
+ ImageButton imageButton = new ImageButton
+ {
+ Source = partition.Image[0],
+ WidthRequest = 175,
+ HeightRequest = 175,
+ AutomationId = indicePartition.ToString(),
+ };
+
+ imageButton.Clicked += GoToPartitionButton;
+
+ int ligne = 1 + (indice / imagesParLigne);
+ int colonne = indice % imagesParLigne;
+
+ imageButton.Margin = GetImageButtonMargin(colonne);
+
+ Grid.SetRow(imageButton, ligne);
+ Grid.SetColumn(imageButton, colonne);
+ grille.Children.Add(imageButton);
+
+ indice++;
+ }
+ }
+
+ /*Récupère des valeurs prédéfinies pour les margin de chargerFavoris afin d'avoir un affichage aligné*/
+ private Thickness GetImageButtonMargin(int colonne)
+ {
+ if (colonne == 0)
+ {
+ return new Thickness(30, 0, 0, 0);
+ }
+ else if (colonne == 1)
+ {
+ return new Thickness(90, 0, 0, 0);
+ }
+ else
+ {
+ return new Thickness(150, 0, 0, 0);
+ }
+ }
+
+ /*Permet de modifier l'affichage des partitions en fonction de ce qu'on recherche*/
+ private void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ string texteRecherche = e.NewTextValue;
+
+ partitionsFiltrees.Clear();
+
+ foreach (Partition partition in partitionsInitiales)
+ {
+ if (partition.Nom.ToLower().Contains(texteRecherche.ToLower()))
+ {
+ partitionsFiltrees.Add(partition);
+ }
+ }
+
+ chargerPartitions();
+ }
+
+ /*Lance un popup de plusieurs choix quand on clic sur le bouton de tri*/
+ private async void TriButton_Clicked(object sender, EventArgs e)
+ {
+ var action = await DisplayActionSheet("Trier par", "Annuler", null, "Type", "Difficulté", "Ordre alphabétique", "Réinitialiser");
+
+ switch (action)
+ {
+ case "Type":
+ await TrierParTypeButton();
+ break;
+ case "Difficulté":
+ await TrierParDifficulteButton();
+ break;
+ case "Ordre alphabétique":
+ await TrierParOrdreAlphabetiqueButton();
+ break;
+ case "Réinitialiser":
+ ReinitialiserButton();
+ break;
+ }
+
+ }
+
+ /*Lance un popup de plusieurs choix quand on clic sur Type dans le popup TriButton_Clicked*/
+ private async Task TrierParTypeButton()
+ {
+ var action = await DisplayActionSheet("Trier par", "Annuler", null, "Batterie", "Guitare", "Piano");
+
+ if (action == "Annuler")
+ return;
+
+ var partitionsTriees = trieur.TrierParInstrument(action);
+ partitionsFiltrees = new List(partitionsTriees);
+ chargerPartitions();
+ }
+
+ /*Lance un popup de plusieurs choix quand on clic sur Difficulté dans le popup TriButton_Clicked*/
+ private async Task TrierParDifficulteButton()
+ {
+ var action = await DisplayActionSheet("Trier par", "Annuler", null, "Facile", "Moyen", "Difficile");
+
+ if (action == "Annuler")
+ return;
+
+ var partitionsTriees = trieur.TrierParComplexite(action);
+ partitionsFiltrees = new List(partitionsTriees);
+ chargerPartitions();
+ }
+
+ /*Lance un popup de plusieurs choix quand on clic sur Ordre Alphabétique dans le popup TriButton_Clicked*/
+ private async Task TrierParOrdreAlphabetiqueButton()
+ {
+ var action = await DisplayActionSheet("Trier par", "Annuler", null, "Croissant", "Décroissant");
+
+ if (action == "Annuler")
+ return;
+
+ var partitionsTriees = trieur.TrierParOrdreAlphabetique(action);
+ partitionsFiltrees = new List(partitionsTriees);
+ chargerPartitions();
+ }
+
+ /*Réinitialise les partitions pour annuler le tri*/
+ private void ReinitialiserButton()
+ {
+ partitionsFiltrees.Clear();
+ partitionsFiltrees.AddRange(partitionsInitiales);
+ chargerPartitions();
+ }
+
+ }
+}
diff --git a/MusiLib/MusiLib/Views/Favoris.xaml b/MusiLib/MusiLib/Views/Favoris.xaml
new file mode 100644
index 0000000..bdb6a7e
--- /dev/null
+++ b/MusiLib/MusiLib/Views/Favoris.xaml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MusiLib/MusiLib/Views/Favoris.xaml.cs b/MusiLib/MusiLib/Views/Favoris.xaml.cs
new file mode 100644
index 0000000..c69d223
--- /dev/null
+++ b/MusiLib/MusiLib/Views/Favoris.xaml.cs
@@ -0,0 +1,209 @@
+using MusiLib.Model;
+using System.Diagnostics;
+
+namespace MusiLib.Views;
+
+
+public partial class Favoris : ContentPage, IAllowClick
+{
+
+ public Manager MyManager => (App.Current as App).MyManager;
+
+ private List partitionsInitiales;
+ private List partitionsFiltrees;
+ private Trier trieur;
+
+ public Favoris()
+ {
+ InitializeComponent();
+ partitionsInitiales = MyManager.favoris.ToList();
+ partitionsFiltrees = new List(partitionsInitiales);
+ trieur = new Trier(MyManager.favoris.ToList());
+ chargerFavoris();
+ }
+
+ /*Nous redirige vers l'accueil avec le logo de l'appli*/
+ private void GoToAccueilByLogoButton(object sender, EventArgs e)
+ {
+ if (!IAllowClick.AllowTap) return;
+ else IAllowClick.AllowTap = false;
+
+ Navigation.PopAsync();
+
+ IAllowClick.ResumeTap();
+ }
+
+ /*Nous redirige vers la partition sur laquelle on a cliqué*/
+ private void GoToPartitionButton(object sender, EventArgs e)
+ {
+ if (!IAllowClick.AllowTap) return;
+ else IAllowClick.AllowTap = false;
+
+ var button = (ImageButton)sender;
+ var idAutomation = button.AutomationId;
+
+ if (int.TryParse(idAutomation, out int id))
+ {
+ Navigation.PushAsync(new PartitionView(id));
+ }
+
+ IAllowClick.ResumeTap();
+ }
+
+ /*Permet de charger automatiquement tout les favoris qu'on a et les afficher à l'écran*/
+ private void chargerFavoris()
+ {
+ /*Supprime les partitions présentes (on les différencie des autres ImageButton grâce à l'automationId*/
+ var imageButtonsToRemove = grille.Children.OfType().Where(btn => !string.IsNullOrEmpty(btn.AutomationId)).ToList();
+ foreach (var button in imageButtonsToRemove)
+ {
+ grille.Children.Remove(button);
+ }
+
+ int imagesParLigne = 3;
+ int indice = 0;
+
+ /*Crée les ImageButton des partitions*/
+ foreach (Partition favoris in partitionsFiltrees)
+ {
+ string nomFavori = favoris.Nom;
+ int indicePartition = MyManager.partitions.FindIndex(partition => partition.Nom == nomFavori);
+
+ ImageButton imageButton = new ImageButton
+ {
+ Source = favoris.Image[0],
+ WidthRequest = 175,
+ HeightRequest = 175,
+ AutomationId = indicePartition.ToString(),
+ };
+
+ imageButton.Clicked += GoToPartitionButton;
+
+ int ligne = 1 + (indice / imagesParLigne);
+ int colonne = indice % imagesParLigne;
+
+ imageButton.Margin = GetImageButtonMargin(colonne);
+
+ Grid.SetRow(imageButton, ligne);
+ Grid.SetColumn(imageButton, colonne);
+ grille.Children.Add(imageButton);
+
+ indice++;
+ }
+ }
+
+ /*Récupère des valeurs prédéfinies pour les margin de chargerFavoris afin d'avoir un affichage aligné*/
+ private Thickness GetImageButtonMargin(int colonne)
+ {
+ if (colonne == 0)
+ {
+ return new Thickness(30, 0, 0, 0);
+ }
+ else if (colonne == 1)
+ {
+ return new Thickness(90, 0, 0, 0);
+ }
+ else
+ {
+ return new Thickness(150, 0, 0, 0);
+ }
+ }
+
+ /*Permet de modifier l'affichage des partitions en fonction de ce qu'on recherche*/
+ private void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ string texteRecherche = e.NewTextValue;
+
+ partitionsFiltrees.Clear();
+
+ foreach (Partition partition in partitionsInitiales)
+ {
+ if (partition.Nom.ToLower().Contains(texteRecherche.ToLower()))
+ {
+ partitionsFiltrees.Add(partition);
+ }
+ }
+
+ chargerFavoris();
+ }
+
+ /*Lance un popup de plusieurs choix quand on clic sur le bouton de tri*/
+ private async void TriButton_Clicked(object sender, EventArgs e)
+ {
+ var action = await DisplayActionSheet("Trier par", "Annuler", null, "Type", "Difficulté", "Ordre alphabétique", "Réinitialiser");
+
+ switch (action)
+ {
+ case "Type":
+ await TrierParTypeButton();
+ break;
+ case "Difficulté":
+ await TrierParDifficulteButton();
+ break;
+ case "Ordre alphabétique":
+ await TrierParOrdreAlphabetiqueButton();
+ break;
+ case "Réinitialiser":
+ ReinitialiserButton();
+ break;
+ }
+
+ }
+
+ /*Lance un popup de plusieurs choix quand on clic sur Type dans le popup TriButton_Clicked*/
+ private async Task TrierParTypeButton()
+ {
+ var action = await DisplayActionSheet("Trier par", "Annuler", null, "Batterie", "Guitare", "Piano");
+
+ if (action == "Annuler")
+ return;
+
+ var partitionsTriees = trieur.TrierParInstrument(action);
+ partitionsFiltrees = new List(partitionsTriees);
+ chargerFavoris();
+ }
+
+ /*Lance un popup de plusieurs choix quand on clic sur Difficulté dans le popup TriButton_Clicked*/
+ private async Task TrierParDifficulteButton()
+ {
+ var action = await DisplayActionSheet("Trier par", "Annuler", null, "Facile", "Moyen", "Difficile");
+
+ if (action == "Annuler")
+ return;
+
+ var partitionsTriees = trieur.TrierParComplexite(action);
+ partitionsFiltrees = new List(partitionsTriees);
+ chargerFavoris();
+ }
+
+ /*Lance un popup de plusieurs choix quand on clic sur Ordre Alphabétique dans le popup TriButton_Clicked*/
+ private async Task TrierParOrdreAlphabetiqueButton()
+ {
+ var action = await DisplayActionSheet("Trier par", "Annuler", null, "Croissant", "Décroissant");
+
+ if (action == "Annuler")
+ return;
+
+ var partitionsTriees = trieur.TrierParOrdreAlphabetique(action);
+ partitionsFiltrees = new List(partitionsTriees);
+ chargerFavoris();
+ }
+
+ /*Réinitialise les partitions pour annuler le tri*/
+ private void ReinitialiserButton()
+ {
+ partitionsFiltrees.Clear();
+ partitionsFiltrees.AddRange(partitionsInitiales);
+ chargerFavoris();
+ }
+
+ /*Charge à chaque réapparition de la page (quand on revient d'une partition par exemple) les partitions afin de remettre les partitions si jamais une est supprimé des favoris*/
+ protected override void OnAppearing()
+ {
+ base.OnAppearing();
+ partitionsInitiales = MyManager.favoris.ToList();
+ partitionsFiltrees = new List(partitionsInitiales);
+ chargerFavoris();
+ }
+
+}
\ No newline at end of file
diff --git a/MusiLib/MusiLib/Views/IAllowClick.cs b/MusiLib/MusiLib/Views/IAllowClick.cs
new file mode 100644
index 0000000..3989d86
--- /dev/null
+++ b/MusiLib/MusiLib/Views/IAllowClick.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MusiLib.Views
+{
+ /*Permet de mettre un délai entre chaque clic pour éviter les problèmes de multi-pages sur Android*/
+ /*Est utilisé sur chaque bouton sous la forme :
+
+ if (!IAllowClick.AllowTap) return;
+ else IAllowClick.AllowTap = false;
+
+ ......
+
+ IAllowClick.ResumeTap();
+ */
+ public interface IAllowClick
+ {
+ public static bool AllowTap = true;
+
+ public static async void ResumeTap()
+ {
+ await Task.Delay(500);
+ AllowTap = true;
+ }
+ }
+}
diff --git a/MusiLib/MusiLib/Views/PartitionView.xaml b/MusiLib/MusiLib/Views/PartitionView.xaml
new file mode 100644
index 0000000..8cc0970
--- /dev/null
+++ b/MusiLib/MusiLib/Views/PartitionView.xaml
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MusiLib/MusiLib/Views/PartitionView.xaml.cs b/MusiLib/MusiLib/Views/PartitionView.xaml.cs
new file mode 100644
index 0000000..bc74e9b
--- /dev/null
+++ b/MusiLib/MusiLib/Views/PartitionView.xaml.cs
@@ -0,0 +1,239 @@
+using Microsoft.Maui.Controls.PlatformConfiguration;
+using MusiLib.Model;
+using System.Collections.Concurrent;
+using System.Diagnostics;
+
+namespace MusiLib.Views;
+
+
+public partial class PartitionView : ContentPage
+{
+
+ public Manager MyManager => (App.Current as App).MyManager;
+
+ public Metronome music = new Metronome();
+ public Metronome metronome = new Metronome();
+
+ public string NomPartitionTitle { get; set; }
+ public int IdTab { get; set; }
+
+
+ public PartitionView()
+ {
+ InitializeComponent();
+ BindingContext = MyManager;
+ }
+
+ public PartitionView(int id)
+ {
+ InitializeComponent();
+ IdTab = id;
+ BindingContext = this;
+ NomPartitionTitle = MyManager.partitions[IdTab].Nom;
+ Part.BindingContext = MyManager.partitions[IdTab];
+
+ InitializeButton();
+ ChargerPartitionsSimilaires();
+ }
+
+ /*Permet de lancer la musique de la partition en cours*/
+ private void Play_Music(object sender, EventArgs e)
+ {
+
+ Button button = (Button)sender;
+ if (!music.isMusicBeginning)
+ {
+ _ = music.Lancer(MyManager.partitions[IdTab].Son);
+ Slider sliderMusic = (Slider)FindByName("tempo_slider");
+ music.ReglerTempo((float)sliderMusic.Value);
+ button.Text = "Pause";
+ }
+ else if(!music.isMusicPlaying)
+ {
+ music.PlayMusic();
+ button.Text = "Pause";
+ }
+ else
+ {
+ music.PauseMusic();
+ button.Text = "Jouer";
+ }
+ }
+
+ /*Permet de lancer le métronome*/
+ private void Play_Metronome(object sender, EventArgs e)
+ {
+
+ Button button = (Button)sender;
+ if (!metronome.isMusicBeginning)
+ {
+ _ = metronome.Lancer("40_BPM_Metronome.mp3");
+ Slider sliderMetro = (Slider)FindByName("BPM_slider");
+ metronome.ReglerTempo((float) sliderMetro.Value);
+ button.Text = "Pause";
+ }
+ else if (!metronome.isMusicPlaying)
+ {
+ metronome.PlayMusic();
+ button.Text = "Pause";
+ }
+ else
+ {
+ metronome.PauseMusic();
+ button.Text = "Jouer";
+ }
+ }
+
+ /*Permet d'arrêter la musique*/
+ private void Stop_Music(object sender, EventArgs e)
+ {
+ music.StopMusic();
+ Slider sliderMusic = (Slider)FindByName("tempo_slider");
+ Slider sliderMetro = (Slider)FindByName("BPM_slider");
+ Button button = (Button)FindByName("play_music_button");
+ button.Text = "Jouer";
+ sliderMusic.Value = 1;
+ sliderMetro.Value = 1;
+ }
+
+ /*Permet d'arrêter le métronome*/
+ private void Stop_Metronome(object sender, EventArgs e)
+ {
+ metronome.StopMusic();
+ Button button = (Button)FindByName("play_metronome_button");
+ button.Text = "Jouer";
+ }
+
+ /*Coupe la musique et le métronome quand on revient en arrière avec le bouton retour du téléphone*/
+ protected override bool OnBackButtonPressed()
+ {
+ metronome.StopMusic();
+ music.StopMusic();
+ return base.OnBackButtonPressed();
+ }
+
+ /*Coupe la musique et le métronome quand on revient en arrière*/
+ protected override void OnDisappearing()
+ {
+ base.OnDisappearing();
+ metronome.StopMusic();
+ music.StopMusic();
+ }
+
+ /*Initialise le Shell_Navigating au chargement de la page*/
+ protected override void OnAppearing()
+ {
+ base.OnAppearing();
+ Shell.Current.Navigating += Shell_Navigating;
+ }
+
+ /*Coupe la musique et le métronome quand on revient en arrière avec le bouton retour de l'appli | Fonctionne avec OnDisappearing*/
+ private void Shell_Navigating(object sender, ShellNavigatingEventArgs e)
+ {
+ if (e.Source == ShellNavigationSource.ShellItemChanged)
+ {
+ metronome.StopMusic();
+ music.StopMusic();
+ }
+ }
+
+ /*Permet de mettre la bonne image suivant si la partition est en favori ou pas au chargement*/
+ private void InitializeButton()
+ {
+ if (MyManager.favoris.Any(favori => favori.Nom == MyManager.partitions[IdTab].Nom))
+ {
+ favoriButton.Source = "etoile.png";
+ }
+ else
+ {
+ favoriButton.Source = "etoile_vide.png";
+ }
+ }
+
+ /*Initialise et crée des ImageButton des partitions du même auteur et même instrument pour les afficher automatiquement*/
+ private void ChargerPartitionsSimilaires()
+ {
+ string auteur = MyManager.partitions[IdTab].Auteur;
+ string instrument = MyManager.partitions[IdTab].Instrument;
+
+ var partitionsSimilaires = MyManager.partitions.Where(p => p.Auteur.ToLower() == auteur.ToLower() ||
+ p.Instrument.ToLower() == instrument.ToLower()).ToList();
+
+ uint i = 1;
+
+ foreach (var partition in partitionsSimilaires)
+ {
+ ++i;
+ if(i>9)
+ {
+ return;
+ }
+ int indicePartition = MyManager.partitions.IndexOf(partition);
+
+ var imageButton = new ImageButton
+ {
+ Source = partition.Image[0],
+ HeightRequest = 80,
+ WidthRequest = 80,
+ AutomationId = indicePartition.ToString()
+ };
+
+ imageButton.Clicked += GoToPartitionButton;
+
+ PartitionsSimilairesStackLayout.Children.Add(imageButton);
+ }
+ }
+
+
+
+ /*Nous redirige vers la partition sur laquelle on a cliqué*/
+ private void GoToPartitionButton(object sender, EventArgs e)
+ {
+ if (!IAllowClick.AllowTap) return;
+ else IAllowClick.AllowTap = false;
+
+ var button = (ImageButton)sender;
+ var idAutomation = button.AutomationId;
+
+ if (int.TryParse(idAutomation, out int id))
+ {
+ Navigation.PushAsync(new PartitionView(id));
+ }
+
+ IAllowClick.ResumeTap();
+ }
+
+ /*Permet d'ajouter une partition aux favoris, sauvegarde sur le téléphone et change l'image du bouton*/
+ private void AddFavoriButton(object sender, EventArgs e)
+ {
+ ImageButton button = (ImageButton)sender;
+
+ if (!MyManager.favoris.Any(favori => favori.Nom == MyManager.partitions[IdTab].Nom))
+ {
+ MyManager.favoris.Add(MyManager.partitions[IdTab]);
+ MyManager.sauvegardeFavoriAdd(MyManager.partitions[IdTab]);
+ button.Source = "etoile.png";
+ }
+ else
+ {
+ MyManager.favoris.RemoveAll(f => f.Nom == MyManager.partitions[IdTab].Nom);
+ MyManager.sauvegardeFavoriRemove(MyManager.partitions[IdTab]);
+ button.Source = "etoile_vide.png";
+ }
+ }
+
+ /*Permet d'envoyer la valeur du slider pour modifier le tempo de la musique*/
+ private void TempoSlider(object sender, ValueChangedEventArgs e)
+ {
+ float selectedValue = (float)e.NewValue;
+ music.ReglerTempo(selectedValue);
+ }
+
+ /*Permet d'envoyer la valeur du slider pour modifier le tempo du métronome*/
+ private void BPMSlider(object sender, ValueChangedEventArgs e)
+ {
+ float selectedValue = (float)e.NewValue;
+ metronome.ReglerTempo(selectedValue);
+ }
+
+}
diff --git a/vivien_Dufour-Maxime_Andre-Masse Contexte.docx b/vivien_Dufour-Maxime_Andre-Masse Contexte.docx
deleted file mode 100644
index f964290..0000000
Binary files a/vivien_Dufour-Maxime_Andre-Masse Contexte.docx and /dev/null differ
diff --git a/vivien_Dufour-Maxime_Andre-Masse Contexte.pdf b/vivien_Dufour-Maxime_Andre-Masse Contexte.pdf
deleted file mode 100644
index 43a3bdc..0000000
Binary files a/vivien_Dufour-Maxime_Andre-Masse Contexte.pdf and /dev/null differ