public static string GenerateTab(Phrase phrase, string tuning = "E,B,G,D,A,E", bool oneLineIfPossible = false) { phrase = phrase.Clone(); while (PhraseHelper.IsPhraseDuplicated(phrase)) { PhraseHelper.TrimPhrase(phrase, phrase.PhraseLength / 2); } var tabParser = new TabParser(tuning); while (phrase.Elements.Min(x => x.Note) > tabParser.TabLines.Last().Number) { NoteHelper.ShiftNotesDirect(phrase, 1, Interval.Octave, Direction.Down); } while (phrase.Elements.Min(x => x.Note) < tabParser.TabLines.Last().Number) { NoteHelper.ShiftNotesDirect(phrase, 1, Interval.Octave); } tabParser.LoadTabFromPhrase(phrase, oneLineIfPossible); return(BuildTab(tabParser)); }
static void Main(string[] args) { var folder = @"..\..\..\Halloumi.Notez.Engine\SourceMidi\doom"; var section = MidiHelper.ReadMidi(folder + @"\AC-Gasoline1.mid"); var phrase = section.Phrases[0]; NoteHelper.ShiftNotesDirect(phrase, 2, Interval.Step); var tab = TabHelper.GenerateTab(phrase, "E,B,G,D,A,D"); Console.WriteLine(tab); Console.WriteLine("push any key.."); Console.ReadLine(); }
private void LoadTab(string fileName) { if (string.IsNullOrEmpty(fileName)) { return; } _currentFile = fileName; FilenameTextbox.Text = Path.GetFileName(fileName); var transposeSteps = Convert.ToInt32(TransposeBox.Items[TransposeBox.SelectedIndex]); var oneLine = OneLineBox.Items[OneLineBox.SelectedIndex].ToString() == "Yes"; var tuningName = TuningBox.Items[TuningBox.SelectedIndex].ToString(); var tuning = ""; if (tuningName == "Drop D") { tuning = "E,B,G,D,A,D"; } else if (tuningName == "E Standard") { tuning = "E,B,G,D,A,E"; } else if (tuningName == "Drop C#") { tuning = "D#,A#,F#,C#,G#,C#"; } else if (tuningName == "Drop C") { tuning = "D,A,F,C,G,C"; } var section = MidiHelper.ReadMidi(_currentFile); var phrase = section.Phrases[0]; NoteHelper.ShiftNotesDirect(phrase, transposeSteps, Interval.Step); TabBox.Text = TabHelper.GenerateTab(phrase, tuning, oneLine); }
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); }