public void ValueNoteEqualsSecondTest() { var note1 = new ValueNote(new Pitch(1, 'A', 0), new Duration(1, 4, false, 480), false, Tie.None); var note2 = new ValueNote(new Pitch(1, 'B', -2), new Duration(1, 4, false, 480), false, Tie.None); Assert.IsTrue(note1.Equals(note2)); }
public void ValueNoteEqualsFirstTest() { var note1 = new ValueNote(new Pitch(1, 'A', 0), new Duration(1, 4, false, 480), false, Tie.None); var note2 = new ValueNote(new Pitch(1, 'A', 0), new Duration(1, 4, false, 480), false, Tie.Start); Assert.IsTrue(!note1.Equals(note2)); }
public void ValueNoteCloneTest() { var note1 = new ValueNote(new Pitch(1, 'A', 0), new Duration(1, 4, false, 480), false, Tie.Stop); var note2 = (ValueNote)note1.Clone(); Assert.IsTrue(note1.Equals(note2)); Assert.AreNotSame(note1, note2); }
public void MultiNoteEqualsTest() { var note1 = new ValueNote(new Pitch(1, 'A', 0), new Duration(1, 4, false, 480), false, Tie.None); note1.AddPitch(new Pitch(1, 'B', 0)); var note2 = new ValueNote(new Pitch(1, 'A', 0), new Duration(1, 4, false, 480), false, Tie.None); note2.AddPitch(new Pitch(1, 'B', 0)); Assert.IsTrue(note1.Equals(note2)); }
/// <summary> /// The modify note with attributes. /// </summary> /// <param name="note"> /// The note. /// </param> /// <returns> /// The <see cref="ValueNote"/>. /// </returns> public ValueNote ModifyNoteWithAttributes(ValueNote note) { var newPitches = note.Pitch.Select(p => new Pitch(p.MidiNumber)).ToList(); return new ValueNote(newPitches, note.Duration, note.Triplet, note.Tie); }
/// <summary> /// The tie gathered. /// </summary> /// <returns> /// The <see cref="Fmotiv"/>. /// </returns> /// <exception cref="Exception"> /// Thrown in many cases. /// </exception> public Fmotiv TieGathered() { // возвращает копию этого объекта, соединив все залигованные ноты, если такие имеются // (тоесть вместо трех залигованных нот в фмотиве будет отображаться одна, с суммарной длительностью но такой же высотой ValueNote buffNote = null; var temp = (Fmotiv)Clone(); var tempGathered = new Fmotiv(Type, Id); int count = temp.NoteList.Count; for (int i = 0; i < count; i++) { if (!Enum.IsDefined(typeof(Tie), temp.NoteList[0].Tie)) { throw new Exception("LibiadaMusic: Tie is not valid!"); } // если лига отсутствует if (temp.NoteList[0].Tie == Tie.None) { if (buffNote != null) { throw new Exception("LibiadaMusic: Tie started but (stop)/(startstop) note NOT following!"); } tempGathered.NoteList.Add((ValueNote)temp.NoteList[0].Clone()); // очистка текущей позиции ноты, для перехода к следущей в очереди temp.NoteList.RemoveAt(0); } else { // пауза не может быть залигованна, ошибка если лига на паузе! if (temp.NoteList[0].Pitch.Count == 0) { throw new Exception("LibiadaMusic: Pause can't be with Tie! Sorry!"); } // начало лиги стартовая нота if (temp.NoteList[0].Tie == Tie.Start) { // если уже был старт лиги, и еще раз начинается старт if (buffNote != null) { throw new Exception("LibiadaMusic: Tie note start after existing start note!"); } buffNote = (ValueNote)temp.NoteList[0].Clone(); // очистка текущей позиции ноты, для перехода к следущей в очереди temp.NoteList.RemoveAt(0); } else { // должно быть уже собрано что то в буффере так как лига продолжающаяся или завершающаяся if (buffNote == null) { throw new Exception("LibiadaMusic: Tie note (stopes and starts)/(stops), without previous note start!"); } // высота залигованных нот должна быть одинакова if (!buffNote.PitchEquals(temp.NoteList[0].Pitch)) { throw new Exception("LibiadaMusic: Pitches of tie notes not equal!"); } // уже начавшаяся лига продолжается, с условием что будет еще следущая лигованная нота if (temp.NoteList[0].Tie == Tie.StartStop) { // добавляется длительность, и копируется старая высота звучания и приоритет buffNote = new ValueNote(buffNote.Pitch, buffNote.Duration.AddDuration(temp.NoteList[0].Duration), buffNote.Triplet, Tie.None, buffNote.Priority); // очистка текущей позиции ноты, для перехода к следущей в очереди temp.NoteList.RemoveAt(0); } else { // конечная нота в последовательности лигованных нот if (temp.NoteList[0].Tie == Tie.Stop) { // добавляется длительность, и копируется старая высота звучания и приоритет buffNote = new ValueNote(buffNote.Pitch, buffNote.Duration.AddDuration(temp.NoteList[0].Duration), buffNote.Triplet, Tie.None, buffNote.Priority); // завершен сбор лигованных нот, результат кладется в возвращаемый буфер. tempGathered.NoteList.Add((ValueNote)buffNote.Clone()); // очистка буффера залигованных нот buffNote = null; // очистка текущей позиции ноты, для перехода к следущей в очереди temp.NoteList.RemoveAt(0); } else { { throw new Exception("LibiadaMusic: Tie is not valid!"); } } } } } } return tempGathered; }