private void ParseNote(IXmlNode node)
{
var note = new Note();
var noteId = node.GetAttribute("id");
node.IterateChildren(c =>
{
if (c.NodeType == XmlNodeType.Element)
{
switch (c.LocalName)
{
case "Properties":
ParseNoteProperties(c, note, noteId);
break;
case "AntiAccent":
if (GetValue(c).ToLower() == "normal")
{
note.IsGhost = true;
}
break;
case "LetRing":
note.IsLetRing = true;
break;
case "Trill":
note.TrillValue = Std.ParseInt(GetValue(c));
note.TrillSpeed = Duration.Sixteenth;
break;
case "Accent":
var accentFlags = Std.ParseInt(GetValue(c));
if ((accentFlags & 0x01) != 0)
note.IsStaccato = true;
if ((accentFlags & 0x04) != 0)
note.Accentuated = AccentuationType.Heavy;
if ((accentFlags & 0x08) != 0)
note.Accentuated = AccentuationType.Normal;
break;
case "Tie":
if (c.GetAttribute("origin").ToLower() == "true")
{
note.IsTieOrigin = true;
}
if (c.GetAttribute("destination").ToLower() == "true")
{
note.IsTieDestination = true;
}
break;
case "Vibrato":
switch (GetValue(c))
{
case "Slight":
note.Vibrato = VibratoType.Slight;
break;
case "Wide":
note.Vibrato = VibratoType.Wide;
break;
}
break;
case "LeftFingering":
note.IsFingering = true;
switch (GetValue(c))
{
case "P":
note.LeftHandFinger = Fingers.Thumb;
break;
case "I":
note.LeftHandFinger = Fingers.IndexFinger;
break;
case "M":
note.LeftHandFinger = Fingers.MiddleFinger;
break;
case "A":
note.LeftHandFinger = Fingers.AnnularFinger;
break;
case "C":
note.LeftHandFinger = Fingers.LittleFinger;
break;
}
break;
case "RightFingering":
note.IsFingering = true;
switch (GetValue(c))
{
case "P":
note.RightHandFinger = Fingers.Thumb;
break;
case "I":
note.RightHandFinger = Fingers.IndexFinger;
break;
case "M":
note.RightHandFinger = Fingers.MiddleFinger;
break;
case "A":
note.RightHandFinger = Fingers.AnnularFinger;
break;
case "C":
note.RightHandFinger = Fingers.LittleFinger;
break;
}
break;
}
}
});
_noteById[noteId] = note;
}