Esempio n. 1
0
        public void SetTabTuning(string tabTuning)
        {
            var notes = tabTuning.Split(',').ToList();

            notes.Reverse();

            TabLines = new List <TabLine>();

            var lastRoot = int.MinValue;

            foreach (var note in notes)
            {
                var number = NoteHelper.NoteToNumber(note);

                if (number <= lastRoot)
                {
                    number += 12;
                }

                TabLines.Add(new TabLine()
                {
                    Number = number
                });

                lastRoot = number;
            }

            TabLines.Reverse();
        }
        private void LoadTrainingData(List <Phrase> sourceRiffs = null)
        {
            if (sourceRiffs == null)
            {
                _riffs = Directory.GetFiles(_rootFolder, "*.mid", SearchOption.AllDirectories)
                         .Select(x => MidiHelper.ReadMidi(x).Phrases[0])
                         .ToList();
            }
            else
            {
                _riffs = sourceRiffs.ToList();
            }



            var largeRiffs = _riffs.Where(riff => riff.PhraseLength > _riffLength).ToList();

            foreach (var largeRiff in largeRiffs)
            {
                PhraseHelper.TrimPhrase(largeRiff, _riffLength);
            }

            foreach (var halfSizeRiff in _riffs.Where(riff => riff.PhraseLength == _riffLength / 2M))
            {
                PhraseHelper.DuplicatePhrase(halfSizeRiff);
            }

            foreach (var quarterSizeRiff in _riffs.Where(riff => riff.PhraseLength == _riffLength / 4M))
            {
                PhraseHelper.DuplicatePhrase(quarterSizeRiff);
                PhraseHelper.DuplicatePhrase(quarterSizeRiff);
            }

            foreach (var wrongSizeRiff in _riffs.Where(riff => riff.PhraseLength != _riffLength))
            {
                Console.WriteLine("Riff " + wrongSizeRiff.Description + " is not " + _riffLength + " steps long - it's " + wrongSizeRiff.PhraseLength);
            }

            _riffs = _riffs.Where(riff => riff.PhraseLength == _riffLength).ToList();

            var wrongScaleRiffs = new List <Phrase>();

            foreach (var scaleRiff in _riffs)
            {
                var matchingScales = ScaleHelper.FindMatchingScales(scaleRiff).Where(x => x.DistanceFromScale == 0).Select(x => x.Scale.Name).ToList();
                if (!matchingScales.Contains(_baseScale))
                {
                    Console.WriteLine("Riff " + scaleRiff.Description + " DOES NOT contain base scale - is possibly " + (matchingScales.FirstOrDefault() ?? "??"));
                    wrongScaleRiffs.Add(scaleRiff);
                }
            }
            _riffs = _riffs.Except(wrongScaleRiffs).ToList();


            var wrongOctaveRiffs = new List <Phrase>();
            var lowestNote       = NoteHelper.NoteToNumber("C2");
            var highestNote      = NoteHelper.NoteToNumber("C4");

            foreach (var octaveRiff in _riffs)
            {
                var lowNote  = octaveRiff.Elements.Min(x => x.Note);
                var highNote = octaveRiff.Elements.Max(x => x.Note);

                if (lowNote >= NoteHelper.NoteToNumber("C3") && lowNote < NoteHelper.NoteToNumber("C4"))
                {
                    NoteHelper.ShiftNotesDirect(octaveRiff, 1, Interval.Octave, Direction.Down);
                    lowNote  = octaveRiff.Elements.Min(x => x.Note);
                    highNote = octaveRiff.Elements.Max(x => x.Note);
                }
                if (lowNote >= NoteHelper.NoteToNumber("C1") && lowNote < NoteHelper.NoteToNumber("C2"))
                {
                    NoteHelper.ShiftNotesDirect(octaveRiff, 1, Interval.Octave, Direction.Up);
                    lowNote  = octaveRiff.Elements.Min(x => x.Note);
                    highNote = octaveRiff.Elements.Max(x => x.Note);
                }

                if (lowNote < lowestNote || highNote > highestNote)
                {
                    Console.WriteLine("Riff "
                                      + octaveRiff.Description
                                      + " (" + NoteHelper.NumberToNote(lowNote)
                                      + "-" + NoteHelper.NumberToNote(highNote)
                                      + ") is outside the correct note range ("
                                      + NoteHelper.NumberToNote(lowestNote)
                                      + "-" + NoteHelper.NumberToNote(highestNote)
                                      + ").");
                    wrongOctaveRiffs.Add(octaveRiff);
                }
            }
            _riffs = _riffs.Except(wrongOctaveRiffs).ToList();
        }
        public Phrase GeneratePhrase(string baseRiff = "")
        {
            var riffs = _riffs.OrderBy(x => _random.NextDouble()).Take(_numberOfRiffsToMerge).ToList();

            if (baseRiff != "")
            {
                var riff = _riffs.Where(x => x.Description.ToLower() == baseRiff.ToLower()).ToList();
                if (riff.Count == 1)
                {
                    riffs = riffs.Except(riff).Take(_numberOfRiffsToMerge - 1).ToList();
                    riffs.InsertRange(0, riff);
                }
            }

            GenerateRiffProbabilities(riffs);

            var noteCount = GetNumberOfNotes();
            var phrase    = GenratePhraseBasic(noteCount);

            var perfectRepeats = GetPerfectRepeats();
            var timingRepeats  = GetTimingRepeats(perfectRepeats);
            var repeats        = perfectRepeats.Union(timingRepeats)
                                 .OrderBy(x => x.WindowSize)
                                 .ThenBy(x => x.WindowStart)
                                 .ThenBy(x => x.MatchWindowStart)
                                 .ToList();

            foreach (var repeat in repeats)
            {
                var sectionStartPositions = new List <decimal>
                {
                    repeat.WindowStart,
                    repeat.WindowStart + repeat.WindowSize,
                    repeat.MatchWindowStart,
                    repeat.MatchWindowStart + repeat.WindowSize
                };

                foreach (var position in sectionStartPositions)
                {
                    var element = phrase.Elements.FirstOrDefault(x => x.Position == position);
                    if (element != null)
                    {
                        continue;
                    }

                    element = GetNewRandomElement(position);
                    if (element != null)
                    {
                        phrase.Elements.Add(element);
                    }
                }
            }

            foreach (var repeat in repeats)
            {
                phrase.Elements.RemoveAll(x => x.Position >= repeat.MatchWindowStart &&
                                          x.Position < repeat.MatchWindowStart + repeat.WindowSize);

                var repeatingElements = phrase
                                        .Elements
                                        .Where(x => x.Position >= repeat.WindowStart &&
                                               x.Position < repeat.WindowStart + repeat.WindowSize)
                                        .Select(x => x.Clone())
                                        .ToList();

                foreach (var element in repeatingElements)
                {
                    element.Position = element.Position - repeat.WindowStart + repeat.MatchWindowStart;
                    if (repeat.MatchType != RepeatingElementsFinder.MatchResult.TimingMatch)
                    {
                        continue;
                    }

                    var probability = _probabilities.FirstOrDefault(x => x.Position == element.Position);
                    if (probability != null)
                    {
                        element.Note = GetRandomNote(probability.Notes);
                    }
                }

                phrase.Elements.AddRange(repeatingElements);
            }


            phrase.Elements = phrase.Elements.OrderBy(x => x.Position).ToList();
            phrase.Elements.RemoveAll(x => x.Position >= _riffLength);

            PhraseHelper.UpdateDurationsFromPositions(phrase, _riffLength);

            phrase.Bpm = 60;


            var lowNote = phrase.Elements.Min(x => x.Note);

            if (lowNote <= NoteHelper.NoteToNumber("C2"))
            {
                NoteHelper.ShiftNotesDirect(phrase, 1, Interval.Octave, Direction.Up);
            }

            return(phrase);
        }