public void Mutate(Measure measure) { var randomRate = ThreadSafeRandom.ThisThreadsRandom.Next(0, 100); if (randomRate < Rate) { var geneticEventsManager = Singleton <GeneticEventsManager> .Instance(); var randomEvent = geneticEventsManager.RandomEventWithRate(); var index = ThreadSafeRandom.ThisThreadsRandom.Next(measure.Events.Count); if (randomEvent == (int)RestOrTie.Rest) { while (index + 1 < measure.Events.Count && measure.Events[index + 1].Number == (int)RestOrTie.Tie) { index = ThreadSafeRandom.ThisThreadsRandom.Next(measure.Events.Count); } measure.Events[index] = new Rest(randomEvent, index); return; } if (randomEvent == (int)RestOrTie.Tie) { while (index == 0 || (index - 1 >= 0 && measure.Events[index - 1].Number == (int)RestOrTie.Rest)) { index = ThreadSafeRandom.ThisThreadsRandom.Next(measure.Events.Count); } measure.Events[index] = new Tie(randomEvent, index); return; } var noteName = NoteUtilities.GetNoteName((SevenBitNumber)randomEvent).ToString(); measure.Events[index] = new Note(noteName, randomEvent, index); } }
private Measure GetNewMeasureWithOriginalTies(int order) { var events = new List <Event>(); var geneticEventsManager = Singleton <GeneticEventsManager> .Instance(); var indexOfevent = 0; while (events.Count < BaseMelody.SizeOfMeasure) { var randomEvent = geneticEventsManager.RandomRestOrNote(); if (BaseMelody.Measures[order].Events[indexOfevent].Number == (int)RestOrTie.Tie) { // Ensure that ties are not generated after rests if (events.Last().Number == (int)RestOrTie.Rest) { events.Remove(events.Last()); var note = geneticEventsManager.RandomNote(); var name = NoteUtilities.GetNoteName((SevenBitNumber)note).ToString(); events.Add(new Note(name, note, events.Count)); } events.Add(new Tie((int)RestOrTie.Tie, events.Count)); } else { // Ensure that ties are not generated in first position if (indexOfevent == 0 && (randomEvent == (int)RestOrTie.Tie)) { continue; } // Ensure that ties are not generated after rests if (events.Any() && events.Last().Number == (int)RestOrTie.Rest && randomEvent == (int)RestOrTie.Tie) { continue; } switch (randomEvent) { case (int)RestOrTie.Rest: events.Add(new Rest(randomEvent, events.Count)); break; default: var name = NoteUtilities.GetNoteName((SevenBitNumber)randomEvent).ToString(); events.Add(new Note(name, randomEvent, events.Count)); break; } } indexOfevent++; } return(new Measure(events, order)); }
public Event Clone() { if (Number == (int)RestOrTie.Tie) { return(new Tie(Number, Order)); } if (Number == (int)RestOrTie.Rest) { return(new Rest(Number, Order)); } var name = NoteUtilities.GetNoteName((SevenBitNumber)Number).ToString(); return(new Note(name, Number, Order)); }
public void Mutate(Measure measure) { if (!measure.Events.OfType <Rest>().Any()) { return; } var randomRate = ThreadSafeRandom.ThisThreadsRandom.Next(0, 100); if (randomRate < Rate) { var geneticEventsManager = Singleton <GeneticEventsManager> .Instance(); for (int i = 0; i < measure.Events.Count; i++) { if (measure.Events[i].Number == (int)RestOrTie.Rest && i + 1 < measure.Events.Count && measure.Events[i + 1].Number == (int)RestOrTie.Tie) { var randomNote = geneticEventsManager.RandomNote(); var noteName = NoteUtilities.GetNoteName((SevenBitNumber)randomNote).ToString(); measure.Events[i] = new Note(noteName, randomNote, i); } } } }
/// <summary> /// Gets name of the note presented by the specified <see cref="NoteEvent"/>. /// </summary> /// <param name="noteEvent">Note event to get note name of.</param> /// <returns>Note name of the <paramref name="noteEvent"/>.</returns> /// <exception cref="ArgumentNullException"><paramref name="noteEvent"/> is null.</exception> public static NoteName GetNoteName(this NoteEvent noteEvent) { ThrowIfArgument.IsNull(nameof(noteEvent), noteEvent); return(NoteUtilities.GetNoteName(noteEvent.NoteNumber)); }