Exemple #1
0
 public static Model.Evidence GetEvidence(MeiElement _evd)
 {
     if (_evd is mei.Unclear unclear)
     {
         if (unclear.HasCert() == false)
         {
             return(Model.Evidence.Unclear_unknown);
         }
         else
         {
             string cert = "Unclear_" + unclear.GetCertValue();
             if (Enum.TryParse(cert, true, out Model.Evidence evidence))
             {
                 return(evidence);
             }
             else
             {
                 return(Model.Evidence.Invalid);
             }
         }
     }
     else if (_evd is mei.Supplied)
     {
         return(Model.Evidence.Supplied);
     }
     else
     {
         throw new InvalidOperationException("Ops! The current element should be <unclear> or <supplied>!");
     }
 }
Exemple #2
0
        /// <summary>
        /// Reads Mei-File and generates sequences per panel.
        /// </summary>
        /// <param name="_filedir">Path to Mei file</param>
        /// <returns>List of sequence objects</returns>
        public static List <Sequence> GetSequences(string _filedir)
        {
            MeiDocument doc  = MeiImport.ImportDocument(_filedir);
            MeiElement  root = doc.Root;

            List <Sequence> sequences = new List <Sequence>();

            string piece;

            //Get name of piece
            try
            {
                piece = root.Element <MeiHead>().Element <FileDesc>().Descendants <Title>().FirstOrDefault().Value;
            }
            catch
            {
                string[] splitUri = doc.BaseUri.Split('/');
                piece = splitUri[splitUri.Length - 1];
            }

            foreach (Panel panel in root.Descendants <Panel>())
            {
                List <Sequence> sequencesPerPart = SequenceHandler.GetPreConversionSequence(panel, piece);

                foreach (Sequence stateSequence in sequencesPerPart)
                {
                    sequences.Add(stateSequence);
                }
            }

            return(sequences);
        }
        public void TestIDHandling()
        {
            XElement testelement = new XElement("ligature", new XElement("note", new XAttribute("label", "test")), new XAttribute(XNamespace.Xml + "id", "t-123"));

            MeiElement test = MeiImport.XmlToMei(testelement);

            Assert.AreEqual(test.GetId(), "t-123");
            Assert.IsNotNull(test.Element <Note>().GetId());
        }
        public void GetSequencesTest()
        {
            int countSequences = this.testList.Count();

            MeiElement root       = MeiImport.ImportDocument("..\\..\\files\\VatS-13a-TuSolus.xml").Root;
            int        countPanel = root.Descendants <Panel>().Count();

            Assert.AreEqual(countPanel, countSequences);
        }
        public void XmlToMeiTest()
        {
            XElement testelement = new XElement("ligature", new XElement("note", "bla"));

            MeiElement compare = new Ligature();

            MeiElement test = MeiImport.XmlToMei(testelement);

            Assert.IsInstanceOfType(test, compare.GetType());
        }
Exemple #6
0
        /// <summary>
        /// Converts mei.Damage or mei.Gap into Model.Gap and sets GapType and Reason.
        /// </summary>
        /// <param name="_gap">Empty Model.Gap object</param>
        /// <param name="_meigap">MeiElement, needs to be mei.Damage or mei.Gap</param>
        /// <returns>Model.Gap object with data</returns>
        public static Model.Gap ConvertGap(Model.Gap _gap, MeiElement _meigap)
        {
            if (_meigap is mei.Gap _gapgap)
            {
                _gap.GapType = Model.GapType.Gap;
                _gap.Reason  = _gapgap.GetReasonValue();
            }
            else if (_meigap is mei.Damage _damagegap)
            {
                _gap.GapType = Model.GapType.Damage;
                _gap.Reason  = _damagegap.GetAgentValue();
            }
            else
            {
                _gap.GapType = Model.GapType.Null;
            }

            return(_gap);
        }
        public void InvalidRootTest()
        {
            XElement testelement = new XElement("blubb", new XElement("note"));

            MeiElement conversion_test = MeiImport.XmlToMei(testelement);
        }
Exemple #8
0
        /// <summary>
        /// Invokes a Sequence object for the given MEI element
        /// </summary>
        /// <param name="_sequence">Sequence</param>
        /// <param name="layerElement">MEI Element to process</param>
        internal static ObjectInSequence InvokeSequenceObject(Sequence _sequence, MeiElement layerElement, Evidence evidence = Evidence.Clear, int ligaturePos = 0, string ligForm = null)
        {
            ObjectInSequence obj = null;

            if (layerElement is mei.Note note)
            {
                obj = new Model.Note();
                NoteConverter.ConvertNote((Model.Note)obj, note);

                //check for @lig attribute
                if (note.HasLig())
                {
                    ligForm = note.GetLigValue();
                }

                TinyConverters.LigatureHandler((Model.Note)obj, ligaturePos, ligForm);
            }
            // Ligatures needs to be be handled recursively to get their elements and store related data
            else if (layerElement is mei.Ligature ligature)
            {
                foreach (MeiElement ligaturChild in ligature.Elements())
                {
                    ligaturePos++;
                    InvokeSequenceObject(_sequence, ligaturChild, evidence, ligaturePos, ligature.GetFormValue());
                }
                ligaturePos = 0;
            }
            else if (layerElement is mei.Rest)
            {
                obj = new Model.Rest();
                RestConverter.ConvertRest((Model.Rest)obj, (mei.Rest)layerElement);
            }
            else if (layerElement is Chord)
            {
                // We need a List of all objects in the Chord to add them to the sequence at the same position
                List <ObjectInSequence> lstChordEvents = new List <ObjectInSequence>();
                foreach (MeiElement noteRest in layerElement.Descendants())
                {
                    ObjectInSequence objNoteRest = InvokeSequenceObject(null, noteRest);
                    if (objNoteRest != null)
                    {
                        lstChordEvents.Add(objNoteRest);
                    }
                }

                _sequence?.AddToSequence(lstChordEvents.ToArray());
            }
            else if (layerElement is mei.KeySig)
            {
                // We need a List of all KeyAccids in the KeySig to add them to the sequence at the same position
                List <ObjectInSequence> lstAcids = new List <ObjectInSequence>();
                foreach (KeyAccid keyAccid in layerElement.Elements())
                {
                    lstAcids.Add(InvokeSequenceObject(null, keyAccid));
                }

                _sequence?.AddToSequence(lstAcids.ToArray());
            }
            else if (layerElement is KeyAccid)
            {
                obj = new Model.KeyAccidental();
                AccidentalConverter.ConvertKeyAccidental((Model.KeyAccidental)obj, (mei.KeyAccid)layerElement);
            }
            else if (layerElement is mei.Accid)
            {
                obj = new Model.Accidental();
                AccidentalConverter.ConvertAccidental((Model.Accidental)obj, (mei.Accid)layerElement);
            }
            else if (layerElement is mei.Mensur)
            {
                obj = new Model.Mensur();
                MensurProportionConverter.ConvertMensur((Model.Mensur)obj, (mei.Mensur)layerElement);
            }
            else if (layerElement is mei.Proport)
            {
                obj = new Model.Proportion();
                MensurProportionConverter.ConvertProportion((Model.Proportion)obj, (mei.Proport)layerElement);
            }
            else if (layerElement is mei.BarLine)
            {
                obj = new Model.Barline();
                TinyConverters.ConvertBarline((Model.Barline)obj, (mei.BarLine)layerElement);
            }
            else if (layerElement is mei.Dot)
            {
                obj = new Model.Dot();
            }
            else if (layerElement is mei.Clef)
            {
                obj = new Model.Clef();
                TinyConverters.ConvertClef((Model.Clef)obj, (mei.Clef)layerElement);
            }
            else if (layerElement is mei.Custos)
            {
                obj = new Model.Custos();
                TinyConverters.ConvertCustos((Model.Custos)obj, (mei.Custos)layerElement);
            }
            else if (layerElement is mei.Unclear || layerElement is mei.Supplied)
            {
                Evidence evd = TinyConverters.GetEvidence(layerElement);
                foreach (MeiElement evdChild in layerElement.Elements())
                {
                    InvokeSequenceObject(_sequence, evdChild, evd);
                }
            }
            else if (layerElement is mei.Damage || layerElement is mei.Gap)
            {
                obj = new Model.Gap();
                TinyConverters.ConvertGap((Model.Gap)obj, layerElement);
            }

            if (obj != null)
            {
                //After type definition, add ID of MEI element
                obj.ID = layerElement.GetId();

                //Set Evidence
                obj.Evidence = evidence;

                //Add to sequence if defined
                _sequence?.AddToSequence(obj);
            }

            return(obj);
        }