Esempio n. 1
0
 private void SwitchPart(Dictionary <string, PartContext> partHeaders, string partString, int partId)
 {
     currentPart = partHeaders[partString];
     if (currentPart.Voice >= 0)
     {
         OnTrackChanged(currentPart.Voice);
     }
     else
     {
         // if there are no midi instruments for the part ie
         // the midi-instruments string length is 0
         if (currentPart.Instruments[0] == null)
         {
             ParseVoice(partId, int.Parse(currentPart.Id));
             // then pass the name of the part to the Instrument parser
             ParseInstrumentNameAndFireChange(currentPart.Name);
         }
         else
         {
             if (currentPart.Instruments[0]?.Channel != null)
             {
                 ParseVoice(partId, int.Parse(currentPart.Instruments[0]?.Channel));
             }
             ParseInstrumentAndFireChange(currentPart.Instruments[0]);
         }
         currentLayer = 0;
         OnLayerChanged(currentLayer);
     }
 }
Esempio n. 2
0
        public ProgressManager GetPartManager(int relativeWeight = 1)
        {
            var pm = new ProgressManager();

            lock (_partProgresses)
                _partProgresses[pm] = new PartContext(relativeWeight);
            pm.OnProgress += (sender, evArgs) => HandlePartProgress(sender, pm, evArgs.Progress);
            return(pm);
        }
Esempio n. 3
0
        /// <summary>
        /// 从excel文件导入到入库表
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public static List <GetPart> GetgetPartTableFromExcel(string filePath)
        {
            var parts = new List <GetPart>();
            // List<GetPart> parts = new List<GetPart>();
            HSSFWorkbook hssfWorkbook;

            using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                hssfWorkbook = new HSSFWorkbook(fileStream);
            }
            var sheet = hssfWorkbook.GetSheetAt(0);
            var rows  = sheet.GetRowEnumerator();

            rows.MoveNext();
            using (PartContext pc = new PartContext())
            {
                while (rows.MoveNext())
                {
                    HSSFRow row  = (HSSFRow)rows.Current;
                    GetPart part = new GetPart();
                    if (row.FirstCellNum < 0)
                    {
                        continue;
                    }
                    if (row.FirstCellNum == 0)
                    {
                        part.PartNum  = row.GetCell(0).ToString().Trim();
                        part.PartName = row.GetCell(1).ToString().Trim();
                        part.PartType = row.GetCell(2).ToString().Trim();
                        part.Unit     = row.GetCell(3).ToString().Trim();
                        //bool b = row.GetCell(4) == null;
                        part.Price  = row.GetCell(4) == null?0:(decimal?)row.GetCell(4).NumericCellValue;
                        part.GetNum = (long)row.GetCell(5).NumericCellValue;
                    }
                    else
                    {
                        part.PartNum  = "";
                        part.PartName = row.Cells[0].ToString().Trim();
                        part.PartType = row.Cells[1].ToString().Trim();
                        part.Unit     = row.Cells[2].ToString().Trim();

                        part.Price  = (decimal?)row.Cells[3].NumericCellValue;
                        part.GetNum = (long)row.Cells[4].NumericCellValue;
                    }
                    part.GetTime = DateTime.Now.ToShortDateString();
                    parts.Add(part);
                    // pc.GetParts.Add(part);
                }
                //pc.SaveChanges();
            }
            MessageBox.Show($"成功导入{parts.Count}条数据");
            return(parts);
        }
Esempio n. 4
0
        /// <summary>
        /// 确认导入的入库表数量并更新设备表
        /// </summary>
        /// <param name="getParts"></param>
        /// <param name="pc"></param>
        public static void ConfimGetPart(IEnumerable <GetPart> getParts, PartContext pc)
        {
            foreach (var getPart in getParts)
            {
                Part findPart;
                //首先要确认的是物料编码
                if (getPart.PartNum != "")
                {
                    findPart = pc.Parts.FirstOrDefault(gp => gp.PartNum == getPart.PartNum);
                }

                else    //如果不行就查询名称或者型号
                {
                    findPart =
                        pc.Parts.FirstOrDefault(
                            gp => gp.PartName == getPart.PartName && gp.PartType == getPart.PartType);
                }
                if (findPart != null)
                {
                    findPart.Num += getPart.GetNum;
                }
                else
                {
                    findPart = new Part()
                    {
                        PartName = getPart.PartName,
                        PartType = getPart.PartType,
                        PartNum  = getPart.PartNum,
                        Price    = getPart.Price,
                        Num      = getPart.GetNum,
                        Unit     = getPart.Unit,
                        Remark   = getPart.GetTime
                    };
                }
                pc.GetParts.AddOrUpdate(getPart);
                pc.Parts.AddOrUpdate(findPart);
            }
            pc.SaveChanges();
        }
Esempio n. 5
0
        private PartContext ParsePartHeader(XElement part)
        {
            if (part.Name.LocalName == "part-group")
            {
                return(null);
            }
            PartContext partHeader      = new PartContext(part.Attribute("id")?.Value, part.Element("part-name")?.Value);
            var         midiInstruments = part.Elements("midi-instrument").ToList();

            for (int x = 0; x < midiInstruments.Count; x++)
            {
                var    instrument   = midiInstruments[x];
                string instrumentId = instrument?.Attribute("id")?.Value;
                string channel      = instrument?.Element("midi-channel")?.Value;
                string name         = instrument?.Element("midi-name")?.Value;
                string bank         = instrument?.Element("midi-bank")?.Value;
                int    program      = 0;
                int.TryParse(instrument?.Element("midi-program")?.Value, out program);
                string unpitched = instrument?.Element("midi-unpitched")?.Value;
                partHeader.Instruments[x] = new MidiInstrument(instrumentId, channel, name, bank, (byte)program, unpitched);
            }
            return(partHeader);
        }
Esempio n. 6
0
        private void OnWrite(Unit w, Action OnSuccess, Action OnFailure)
        {
            var ByteArrays  = vts.TakeWriteBuffer();
            var TotalLength = ByteArrays.Sum(b => b.Length);
            var WriteBuffer = new Byte[GetMinNotLessPowerOfTwo(TotalLength)];
            var Offset      = 0;

            foreach (var b in ByteArrays)
            {
                Array.Copy(b, 0, WriteBuffer, Offset, b.Length);
                Offset += b.Length;
            }
            var RemoteEndPoint = this.RemoteEndPoint;
            var SessionId      = this.SessionId;
            var SecureContext  = this.SecureContext;
            var Indices        = new List <int>();

            RawReadingContext.DoAction(c =>
            {
                if (c.NotAcknowledgedIndices.Count == 0)
                {
                    return;
                }
                var MaxHandled   = c.Parts.MaxHandled;
                var Acknowledged = new List <int>();
                foreach (var i in c.NotAcknowledgedIndices)
                {
                    if (c.Parts.IsEqualOrAfter(MaxHandled, i))
                    {
                        Acknowledged.Add(i);
                    }
                    else if (PartContext.IsSuccessor(i, MaxHandled))
                    {
                        Acknowledged.Add(i);
                        MaxHandled = i;
                    }
                }
                foreach (var i in Acknowledged)
                {
                    c.NotAcknowledgedIndices.Remove(i);
                }
                Indices.Add(MaxHandled);
                Indices.AddRange(c.NotAcknowledgedIndices);
                c.NotAcknowledgedIndices.Clear();
            });
            if ((ByteArrays.Length == 0) && (Indices.Count == 0))
            {
                OnSuccess();
                return;
            }
            var Success = true;
            var Parts   = new List <Byte[]>();

            CookedWritingContext.DoAction(c =>
            {
                var Time          = DateTime.UtcNow;
                var WritingOffset = 0;
                while ((Indices.Count > 0) || (WritingOffset < TotalLength))
                {
                    var Index = PartContext.GetSuccessor(c.WritenIndex);

                    var NumIndex = Indices.Count;
                    if (NumIndex > 0xFFFF)
                    {
                        Success = false;
                        return;
                    }

                    var IsACK = NumIndex > 0;

                    var Length     = Math.Min(12 + (IsACK ? 2 + NumIndex * 2 : 0) + TotalLength - WritingOffset, MaxPacketLength);
                    var DataLength = Length - (12 + (IsACK ? 2 + NumIndex * 2 : 0));
                    if (DataLength < 0)
                    {
                        Success = false;
                        return;
                    }
                    var Buffer = new Byte[Length];
                    Buffer[0]  = (Byte)(SessionId & 0xFF);
                    Buffer[1]  = (Byte)((SessionId >> 8) & 0xFF);
                    Buffer[2]  = (Byte)((SessionId >> 16) & 0xFF);
                    Buffer[3]  = (Byte)((SessionId >> 24) & 0xFF);

                    var Flag = 0;
                    if (IsACK)
                    {
                        Flag      |= 1; //ACK
                        Buffer[12] = (Byte)(NumIndex & 0xFF);
                        Buffer[13] = (Byte)((NumIndex >> 8) & 0xFF);
                        var j      = 0;
                        foreach (var i in Indices)
                        {
                            Buffer[14 + j * 2]     = (Byte)(i & 0xFF);
                            Buffer[14 + j * 2 + 1] = (Byte)((i >> 8) & 0xFF);
                            j += 1;
                        }
                        Indices.Clear();
                    }

                    Array.Copy(WriteBuffer, WritingOffset, Buffer, 12 + (IsACK ? 2 + NumIndex * 2 : 0), DataLength);
                    WritingOffset += DataLength;

                    var IsEncrypted = (SecureContext != null);
                    if (IsEncrypted)
                    {
                        Flag |= 2; //ENC
                    }
                    Buffer[4] = (Byte)(Flag & 0xFF);
                    Buffer[5] = (Byte)((Flag >> 8) & 0xFF);
                    Buffer[6] = (Byte)(Index & 0xFF);
                    Buffer[7] = (Byte)((Index >> 8) & 0xFF);

                    var Verification = 0;
                    if (SecureContext != null)
                    {
                        var Key       = SecureContext.ServerToken.Concat(Cryptography.SHA256(Buffer.Skip(4).Take(4)));
                        var HMACBytes = Cryptography.HMACSHA256Simple(Key, Buffer).Take(4).ToArray();
                        Verification  = HMACBytes[0] | ((Int32)(HMACBytes[1]) << 8) | ((Int32)(HMACBytes[2]) << 16) | ((Int32)(HMACBytes[3]) << 24);
                    }
                    else
                    {
                        Verification = Cryptography.CRC32(Buffer);
                    }

                    Buffer[8]  = (Byte)(Verification & 0xFF);
                    Buffer[9]  = (Byte)((Verification >> 8) & 0xFF);
                    Buffer[10] = (Byte)((Verification >> 16) & 0xFF);
                    Buffer[11] = (Byte)((Verification >> 24) & 0xFF);

                    var Part = new Part {
                        Index = Index, ResendTime = Time.AddIntMilliseconds(GetTimeoutMilliseconds(0)), Data = Buffer, ResentCount = 0
                    };
                    if (!c.Parts.TryPushPart(Index, Buffer))
                    {
                        Success = false;
                        return;
                    }
                    Parts.Add(Part.Data);
                    if (Server.ServerContext.EnableLogTransport)
                    {
                        Server.ServerContext.RaiseSessionLog(new SessionLogEntry {
                            Token = SessionId.ToString("X8"), RemoteEndPoint = RemoteEndPoint, Time = DateTime.UtcNow, Type = "UdpTransport", Name = "Send", Message = "Index: " + Index.ToInvariantString() + " Length: " + Part.Data.Length.ToInvariantString()
                        });
                    }

                    c.WritenIndex = Index;
                }
            });
            foreach (var p in Parts)
            {
                try
                {
                    SendPacket(RemoteEndPoint, p);
                }
                catch
                {
                    Success = false;
                    break;
                }
            }
            if (!Success)
            {
                OnFailure();
            }
            else
            {
                OnSuccess();
            }
        }
Esempio n. 7
0
        private void Check()
        {
            var IsRunning = this.IsRunning;

            var RemoteEndPoint = this.RemoteEndPoint;
            int SessionId      = 0;

            this.ConnectionStateValue.Check(v =>
            {
                SessionId = this.SessionId;
                return(v);
            });
            var SecureContext = this.SecureContext;
            var Indices       = new List <int>();

            RawReadingContext.DoAction(c =>
            {
                if (c.NotAcknowledgedIndices.Count == 0)
                {
                    return;
                }
                var CurrentTime = DateTime.UtcNow;
                if ((CurrentTime - c.LastCheck).TotalMilliseconds < CheckTimeout)
                {
                    return;
                }
                c.LastCheck = CurrentTime;
                var NotAcknowledgedIndices = new SortedSet <int>(c.NotAcknowledgedIndices);
                var MaxHandled             = c.Parts.MaxHandled;
                var Acknowledged           = new List <int>();
                foreach (var i in NotAcknowledgedIndices)
                {
                    if (c.Parts.IsEqualOrAfter(MaxHandled, i))
                    {
                        Acknowledged.Add(i);
                    }
                    else if (PartContext.IsSuccessor(i, MaxHandled))
                    {
                        Acknowledged.Add(i);
                        MaxHandled = i;
                    }
                }
                foreach (var i in Acknowledged)
                {
                    NotAcknowledgedIndices.Remove(i);
                }
                Indices.Add(MaxHandled);
                Indices.AddRange(NotAcknowledgedIndices);
            });

            var Parts = new List <Byte[]>();

            CookedWritingContext.DoAction(cc =>
            {
                if (cc.Timer == null)
                {
                    return;
                }
                cc.Timer.Dispose();
                cc.Timer = null;
                if (!IsRunning)
                {
                    return;
                }

                if (Indices.Count > 0)
                {
                    var Index = Indices[0];

                    var NumIndex = Indices.Count;
                    if (NumIndex > 0xFFFF)
                    {
                        return;
                    }

                    var Flag = 8; //AUX

                    var Length = 12 + 2 + NumIndex * 2;
                    if (Length > MaxPacketLength)
                    {
                        return;
                    }
                    var Buffer = new Byte[Length];
                    Buffer[0]  = (Byte)(SessionId & 0xFF);
                    Buffer[1]  = (Byte)((SessionId >> 8) & 0xFF);
                    Buffer[2]  = (Byte)((SessionId >> 16) & 0xFF);
                    Buffer[3]  = (Byte)((SessionId >> 24) & 0xFF);

                    Flag      |= 1; //ACK
                    Buffer[12] = (Byte)(NumIndex & 0xFF);
                    Buffer[13] = (Byte)((NumIndex >> 8) & 0xFF);
                    var j      = 0;
                    foreach (var i in Indices)
                    {
                        Buffer[14 + j * 2]     = (Byte)(i & 0xFF);
                        Buffer[14 + j * 2 + 1] = (Byte)((i >> 8) & 0xFF);
                        j += 1;
                    }
                    Indices.Clear();

                    if (SecureContext != null)
                    {
                        Flag |= 2; //ENC
                    }
                    Buffer[4] = (Byte)(Flag & 0xFF);
                    Buffer[5] = (Byte)((Flag >> 8) & 0xFF);
                    Buffer[6] = (Byte)(Index & 0xFF);
                    Buffer[7] = (Byte)((Index >> 8) & 0xFF);

                    var Verification = 0;
                    if (SecureContext != null)
                    {
                        var Key       = SecureContext.ClientToken.Concat(Cryptography.SHA256(Buffer.Skip(4).Take(4)));
                        var HMACBytes = Cryptography.HMACSHA256Simple(Key, Buffer).Take(4).ToArray();
                        Verification  = HMACBytes[0] | ((Int32)(HMACBytes[1]) << 8) | ((Int32)(HMACBytes[2]) << 16) | ((Int32)(HMACBytes[3]) << 24);
                    }
                    else
                    {
                        Verification = Cryptography.CRC32(Buffer);
                    }

                    Buffer[8]  = (Byte)(Verification & 0xFF);
                    Buffer[9]  = (Byte)((Verification >> 8) & 0xFF);
                    Buffer[10] = (Byte)((Verification >> 16) & 0xFF);
                    Buffer[11] = (Byte)((Verification >> 24) & 0xFF);

                    Parts.Add(Buffer);
                    //Debug.WriteLine(Times.DateTimeUtcWithMillisecondsToString(DateTime.UtcNow) + " SendAux SessionId: " + SessionId.ToString("X8") + " Index: " + Index.ToString());
                }

                if (cc.Parts.Parts.Count == 0)
                {
                    return;
                }
                var t = DateTime.UtcNow;
                cc.Parts.ForEachTimedoutPacket(SessionId, t, (i, d) => Parts.Add(d));
                var Wait = Math.Max(Convert.ToInt32((cc.Parts.Parts.Min(p => p.Value.ResendTime) - t).TotalMilliseconds), 0);
                cc.Timer = new Timer(o => Check(), null, Wait, Timeout.Infinite);
            });

            foreach (var p in Parts)
            {
                try
                {
                    SendPacket(RemoteEndPoint, p);
                }
                catch
                {
                    break;
                }
            }
        }
Esempio n. 8
0
        private void OnWrite(IStreamedVirtualTransportClient vtc, Action OnSuccess, Action <SocketError> OnFailure)
        {
            var ByteArrays  = vtc.TakeWriteBuffer();
            var TotalLength = ByteArrays.Sum(b => b.Length);
            var WriteBuffer = new Byte[GetMinNotLessPowerOfTwo(TotalLength)];
            var Offset      = 0;

            foreach (var b in ByteArrays)
            {
                Array.Copy(b, 0, WriteBuffer, Offset, b.Length);
                Offset += b.Length;
            }
            var RemoteEndPoint = this.RemoteEndPoint;
            int SessionId      = 0;
            var State          = ConnectionState.Initial;

            this.ConnectionStateValue.Update(v =>
            {
                SessionId = this.SessionId;
                State     = v;
                if (v == ConnectionState.Initial)
                {
                    return(ConnectionState.Connecting);
                }
                return(v);
            });
            if (State == ConnectionState.Connecting)
            {
                throw new InvalidOperationException();
            }
            var SecureContext = this.SecureContext;
            var Indices       = new List <int>();

            RawReadingContext.DoAction(c =>
            {
                if (c.NotAcknowledgedIndices.Count == 0)
                {
                    return;
                }
                var MaxHandled   = c.Parts.MaxHandled;
                var Acknowledged = new List <int>();
                foreach (var i in c.NotAcknowledgedIndices)
                {
                    if (c.Parts.IsEqualOrAfter(MaxHandled, i))
                    {
                        Acknowledged.Add(i);
                    }
                    else if (PartContext.IsSuccessor(i, MaxHandled))
                    {
                        Acknowledged.Add(i);
                        MaxHandled = i;
                    }
                }
                foreach (var i in Acknowledged)
                {
                    c.NotAcknowledgedIndices.Remove(i);
                }
                Indices.Add(MaxHandled);
                Indices.AddRange(c.NotAcknowledgedIndices);
                c.NotAcknowledgedIndices.Clear();
            });
            if ((ByteArrays.Length == 0) && (Indices.Count == 0))
            {
                OnSuccess();
                return;
            }
            var se    = SocketError.Success;
            var Parts = new List <Byte[]>();

            CookedWritingContext.DoAction(c =>
            {
                var Time          = DateTime.UtcNow;
                var WritingOffset = 0;
                while (WritingOffset < TotalLength)
                {
                    var Index = PartContext.GetSuccessor(c.WritenIndex);

                    var NumIndex = Indices.Count;
                    if (NumIndex > 0xFFFF)
                    {
                        se = SocketError.NoBufferSpaceAvailable;
                        return;
                    }

                    var IsACK = NumIndex > 0;
                    var Flag  = 0;
                    if (State == ConnectionState.Initial)
                    {
                        Flag |= 4; //INI
                        IsACK = false;
                    }

                    var Length     = Math.Min(12 + (IsACK ? 2 + NumIndex * 2 : 0) + TotalLength - WritingOffset, MaxPacketLength);
                    var DataLength = Length - (12 + (IsACK ? 2 + NumIndex * 2 : 0));
                    if (DataLength < 0)
                    {
                        se = SocketError.NoBufferSpaceAvailable;
                        return;
                    }
                    var Buffer = new Byte[Length];
                    Buffer[0]  = (Byte)(SessionId & 0xFF);
                    Buffer[1]  = (Byte)((SessionId >> 8) & 0xFF);
                    Buffer[2]  = (Byte)((SessionId >> 16) & 0xFF);
                    Buffer[3]  = (Byte)((SessionId >> 24) & 0xFF);

                    if (IsACK)
                    {
                        Flag      |= 1; //ACK
                        Buffer[12] = (Byte)(NumIndex & 0xFF);
                        Buffer[13] = (Byte)((NumIndex >> 8) & 0xFF);
                        var j      = 0;
                        foreach (var i in Indices)
                        {
                            Buffer[14 + j * 2]     = (Byte)(i & 0xFF);
                            Buffer[14 + j * 2 + 1] = (Byte)((i >> 8) & 0xFF);
                            j += 1;
                        }
                        Indices.Clear();
                    }

                    Array.Copy(WriteBuffer, WritingOffset, Buffer, 12 + (IsACK ? 2 + NumIndex * 2 : 0), DataLength);
                    WritingOffset += DataLength;

                    if (SecureContext != null)
                    {
                        Flag |= 2; //ENC
                    }
                    Buffer[4] = (Byte)(Flag & 0xFF);
                    Buffer[5] = (Byte)((Flag >> 8) & 0xFF);
                    Buffer[6] = (Byte)(Index & 0xFF);
                    Buffer[7] = (Byte)((Index >> 8) & 0xFF);

                    var Verification = 0;
                    if (SecureContext != null)
                    {
                        var Key       = SecureContext.ClientToken.Concat(Cryptography.SHA256(Buffer.Skip(4).Take(4)));
                        var HMACBytes = Cryptography.HMACSHA256Simple(Key, Buffer).Take(4).ToArray();
                        Verification  = HMACBytes[0] | ((Int32)(HMACBytes[1]) << 8) | ((Int32)(HMACBytes[2]) << 16) | ((Int32)(HMACBytes[3]) << 24);
                    }
                    else
                    {
                        Verification = Cryptography.CRC32(Buffer);
                    }

                    Buffer[8]  = (Byte)(Verification & 0xFF);
                    Buffer[9]  = (Byte)((Verification >> 8) & 0xFF);
                    Buffer[10] = (Byte)((Verification >> 16) & 0xFF);
                    Buffer[11] = (Byte)((Verification >> 24) & 0xFF);

                    var Part = new Part {
                        Index = Index, ResendTime = Time.AddIntMilliseconds(GetTimeoutMilliseconds(0)), Data = Buffer, ResentCount = 0
                    };
                    if (!c.Parts.TryPushPart(Index, Buffer))
                    {
                        se = SocketError.NoBufferSpaceAvailable;
                        return;
                    }
                    Parts.Add(Part.Data);
                    //Debug.WriteLine(Times.DateTimeUtcWithMillisecondsToString(DateTime.UtcNow) + " Send SessionId: " + SessionId.ToString("X8") + " Index: " + Index.ToString());

                    c.WritenIndex = Index;
                }
                if (c.Timer == null)
                {
                    c.Timer = new Timer(o => Check(), null, CheckTimeout, Timeout.Infinite);
                }
            });
            foreach (var p in Parts)
            {
                try
                {
                    SendPacket(RemoteEndPoint, p);
                }
                catch
                {
                    se = SocketError.Interrupted;
                    break;
                }
            }
            if (se != SocketError.Success)
            {
                OnFailure(se);
            }
            else
            {
                OnSuccess();
            }
        }
Esempio n. 9
0
        private void ParseNote(int p, XElement noteElement, string partId, Dictionary <string, PartContext> partHeaders)
        {
            Note newNote = new Note();

            newNote.IsFirstNote = true;

            bool isRest       = false;
            bool isStartOfTie = false;
            bool isEndOfTie   = false;
            int  noteNumber   = 0;

            // skip grace notes
            // TODO : why do we skip grace notes ?
            if (noteElement.Element("grace") != null)
            {
                return;
            }
            var voice = noteElement.Element("voice");

            // TODO : !newNote.isHarmonicNote() is always true ...
            if (voice != null && !newNote.IsHarmonicNote)
            {
                if ((int.Parse(voice.Value) - 1) != currentLayer)
                {
                    currentLayer = byte.Parse(voice.Value);
                    currentLayer = currentLayer - 1;
                    OnLayerChanged(currentLayer);
                }
            }

            EnhanceFromChord(noteElement, newNote);

            var noteEls = noteElement.Elements().ToList();

            // See if note is part of a chord
            foreach (var element in noteEls)
            {
                string tagName = element.Name.ToString();
                if (tagName == "instrument")
                {
                    PartContext      header      = partHeaders[partId];
                    MidiInstrument[] instruments = header.Instruments;
                    foreach (MidiInstrument ins in instruments)
                    {
                        if (ins != null && ins.Id == element.Attribute("id")?.Value)
                        {
                            ParseVoice(p, FindInstrument(ins));
                            ParseInstrumentAndFireChange(ins);
                        }
                    }
                }
                else if (tagName == "unpitched")
                {
                    // To Determine if Note is Percussive
                    newNote.IsPercussionNote = true;
                    var display_note = element.Element("display-step");
                    if (display_note != null)
                    {
                        noteNumber = GetNoteNumber(display_note.Value[0]);
                    }

                    var display_octave = element.Element("display-octave");
                    if (display_octave != null)
                    {
                        int octave_byte = int.Parse(display_octave.Value);
                        noteNumber += (octave_byte * 12);
                    }
                }
                else if (tagName == "pitch")
                {
                    string sStep = element.Element("step")?.Value;
                    noteNumber = GetNoteNumber(sStep[0]);
                    var alter = element.Element("alter");
                    if (alter != null)
                    {
                        noteNumber += int.Parse(alter.Value);
                        if (noteNumber > 11)
                        {
                            noteNumber = 0;
                        }
                        else if (noteNumber < 0)
                        {
                            noteNumber = 11;
                        }
                    }

                    var octaveNumber = 0;
                    int.TryParse(element.Element("octave")?.Value, out octaveNumber);

                    // Compute the actual note number, based on octave and note
                    int intNoteNumber = ((octaveNumber) * 12) + noteNumber;
                    if (intNoteNumber > 127)
                    {
                        throw new ApplicationException("Note value " + intNoteNumber + " is larger than 127");
                    }
                    noteNumber = intNoteNumber;
                }
                else if (tagName == "rest")
                {
                    isRest = true;
                }
            }

            // duration
            var    element_duration = noteElement.Element("duration");
            double durationValue    = double.Parse(element_duration.Value);
            var    decimalDuration  = durationValue / (divisionsPerBeat * beatsPerMeasure);

            // Tied Note
            var notations = noteElement.Element("notations");
            var tied      = notations?.Element("tied");

            if (tied != null)
            {
                string tiedValue = tied.Attribute("type")?.Value;
                if (tiedValue.Equals("start", StringComparison.OrdinalIgnoreCase))
                {
                    isStartOfTie = true;
                }
                else if (tiedValue.Equals("stop", StringComparison.OrdinalIgnoreCase))
                {
                    isEndOfTie = true;
                }
            }

            int attackVelocity = currentPart.CurrentVolume;
            int decayVelocity  = this.curVelocity;

            // Set up the note
            if (isRest)
            {
                newNote.IsRest   = true;
                newNote.Duration = decimalDuration;

                // turn off sound for rest notes
                newNote.OnVelocity  = 0;
                newNote.OffVelocity = 0;
            }
            else
            {
                newNote.Value        = noteNumber;
                newNote.Duration     = decimalDuration;
                newNote.IsStartOfTie = isStartOfTie;
                newNote.IsEndOfTie   = isEndOfTie;
                newNote.OnVelocity   = attackVelocity;
                newNote.OffVelocity  = decayVelocity;
            }

            OnNoteParsed(newNote);

            // Add Lyric
            var lyric = noteElement.Element("lyric");
            var lyric_text_element = lyric?.Element("text");

            if (lyric_text_element != null)
            {
                OnLyricParsed(lyric_text_element.Value);
            }
        }