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); } }
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); }
/// <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); }
/// <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(); }
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); }
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(); } }
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; } } }
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(); } }
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); } }