/// <summary> /// The create. /// </summary> /// <param name="sequence"> /// The sequence. /// </param> /// <param name="sequenceStream"> /// The sequence stream. /// </param> /// <exception cref="Exception"> /// Thrown if congeneric tracks count not equals 1 (track is not monophonic). /// </exception> public void Create(CommonSequence sequence, Stream sequenceStream) { string stringSequence = FileHelper.ReadSequenceFromStream(sequenceStream); var doc = new XmlDocument(); doc.LoadXml(stringSequence); var parser = new MusicXmlParser(); parser.Execute(doc); ScoreTrack tempTrack = parser.ScoreModel; if (tempTrack.CongenericScoreTracks.Count != 1) { throw new Exception("Track contains more then one or zero congeneric score tracks (parts)."); } MatterRepository.CreateOrExtractExistingMatterForSequence(sequence); BaseChain notesSequence = ConvertCongenericScoreTrackToNotesBaseChain(tempTrack.CongenericScoreTracks[0]); long[] notesAlphabet = ElementRepository.GetOrCreateNotesInDb(notesSequence.Alphabet); sequence.Notation = Notation.Notes; Create(sequence, notesAlphabet, notesSequence.Building); BaseChain measuresSequence = ConvertCongenericScoreTrackToMeasuresBaseChain(tempTrack.CongenericScoreTracks[0]); long[] measuresAlphabet = MeasureRepository.GetOrCreateMeasuresInDb(measuresSequence.Alphabet); sequence.Notation = Notation.Measures; sequence.Id = default; Create(sequence, measuresAlphabet, measuresSequence.Building); sequence.Notation = Notation.FormalMotifs; var pauseTreatments = EnumExtensions.ToArray <PauseTreatment>().Where(pt => pt != PauseTreatment.NotApplicable); foreach (PauseTreatment pauseTreatment in pauseTreatments) { BaseChain fmotifsSequence = ConvertCongenericScoreTrackToFormalMotifsBaseChain(tempTrack.CongenericScoreTracks[0], pauseTreatment, false); long[] fmotifsAlphabet = FmotifRepository.GetOrCreateFmotifsInDb(fmotifsSequence.Alphabet); sequence.Id = default; Create(sequence, fmotifsAlphabet, fmotifsSequence.Building, pauseTreatment, false); fmotifsSequence = ConvertCongenericScoreTrackToFormalMotifsBaseChain(tempTrack.CongenericScoreTracks[0], pauseTreatment, true); fmotifsAlphabet = FmotifRepository.GetOrCreateFmotifsInDb(fmotifsSequence.Alphabet); sequence.Id = default; Create(sequence, fmotifsAlphabet, fmotifsSequence.Building, pauseTreatment, true); } }