Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        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);
                    }
                }
            }
        }
Beispiel #5
0
        /// <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));
        }