public void GenerateSteps() { Measures = new List <Measure>(); float DistanceBetweenBeats = Beats.Diff().ToList().AverageNoOutliers(); var NotesInMeasure = Onsets.Select(x => ((int)Math.Round((x - msTilStart) / DistanceBetweenBeats * Measure.Resolution / BeatsPerMeasure)) % Measure.Resolution).ToList(); var MeasureToPlace = Onsets.Select(x => (int)((x - msTilStart) / DistanceBetweenBeats / BeatsPerMeasure)).ToList(); StepPattern pattern = StepPattern.StartsOnRight.GetRandom(); int j = 0; bool[,] lookup = new bool[Measure.Resolution, MeasureToPlace.Max() + 1]; for (int i = 0; i < Onsets.Count; i += 1) { if (lookup[NotesInMeasure[i], MeasureToPlace[i]]) { continue; } if (NotesInMeasure[i] < 0 || MeasureToPlace[i] < 0) { continue; } while (MeasureToPlace[i] >= Measures.Count) { Measures.Add(new Measure()); } if (j >= pattern.Steps.Count) { pattern = pattern.GetNextViablePattern(); j = 0; } Measures[MeasureToPlace[i]].Steps[NotesInMeasure[i]] = pattern.Steps[j++]; lookup[NotesInMeasure[i], MeasureToPlace[i]] = true; } }
public Form1() { InitializeComponent(); StepPattern.CreateStepPatterns(); this.Traverse(c => { if (c is ButtonBase) { ButtonBase b = c as ButtonBase; b.FlatStyle = FlatStyle.Flat; b.FlatAppearance.BorderColor = Color.Black; b.Cursor = Cursors.Hand; } else if (c is TextBox) { TextBox t = c as TextBox; t.BorderStyle = BorderStyle.FixedSingle; t.Cursor = Cursors.IBeam; } //c.BackColor = Color.FromArgb(40, 40, 40); //c.ForeColor = Color.White; }); TXTBpm.TextChanged += (sender, e) => { if (song != null) { try { song.BeatsPerMinute = (float)Convert.ToDouble((sender as TextBox).Text); } catch (FormatException) { } } }; TXTOffset.TextChanged += (sender, e) => { if (song != null) { try { song.msTilStart = (float)Convert.ToDouble((sender as TextBox).Text); } catch (FormatException) { } } }; }
public void GenerateSteps(List <float> beatTimesMilliseconds) { double MillisecondsPerMeasure = BeatsPerMeasure / BeatsPerMinute * 60000.0f; int MeasureNumber = -1; StepPattern pattern = StepPattern.StartsOnRight.First(); int stepIndex = 0; foreach (var time in beatTimesMilliseconds) { int Measure = (int)((time - msTilStart) / MillisecondsPerMeasure); if (Measure >= beatTimesMilliseconds.Count) { Measures.Add(new Measure()); MeasureNumber += 1; } int MeasureRelativeBeat = (int)(time - (MeasureNumber * MillisecondsPerMeasure) / 36.0); Measures[MeasureNumber].Steps[MeasureRelativeBeat] = pattern.Steps[stepIndex++]; if (stepIndex >= pattern.Steps.Count) { stepIndex = 0; pattern = pattern.GetNextViablePattern(); } } }
public void GenerateStepsV2(float BPM, float Offset, int difficulty, bool RoundBeats) { BeatsPerMinute = BPM; msTilStart = Offset * -1000; List <float> Timings = new List <float>(); float Sensitivity = (100 - difficulty) / 100.0f; float Max = Onsets.Max(); for (int i = 0; i < Onsets.Count; i += 1) { if (Onsets[i] > Max * Sensitivity) { Timings.Add(TimePerSample * i * 1000); } } float MinutesPerBeat = 1 / BPM; float MillisecondsPerMinute = 60000; Measures = new List <Measure>(); float DistanceBetweenBeats = MinutesPerBeat * MillisecondsPerMinute; var NotesInMeasure = Timings.Select(z => (int)(((Math.Round((z - msTilStart) / DistanceBetweenBeats * Measure.Resolution) / (float)BeatsPerMeasure)) + 1) % Measure.Resolution).ToList(); //var MeasureToPlace = Timings.Select(z => (int)((z - msTilStart) / DistanceBetweenBeats / BeatsPerMeasure)).ToList(); var MeasureToPlace = Timings.Select(z => (int)(((Math.Round((z - msTilStart) / DistanceBetweenBeats * Measure.Resolution) / (float)BeatsPerMeasure)) + 1) / Measure.Resolution).ToList(); //StepPattern pattern = StepPattern.StartsOnRight.GetRandom(); //int j = 0; bool[,] lookup = new bool[Measure.Resolution, MeasureToPlace.Max() + 1]; Rounder rounder = new Rounder(0, 3, 4, 6, 8, 9, 12, 15, 16, 18, 20, 21, 24, 27, 28, 30, 32, 33, 36, 39, 40, 42, 44, 45); //for (int i = 0; i < Timings.Count; i += 1) //{ // int r = NotesInMeasure[i]; // if (RoundBeats) // { // r = rounder.Round(NotesInMeasure[i]); // } // if (r < 0 || MeasureToPlace[i] < 0) continue; // if (lookup[r, MeasureToPlace[i]]) continue; // while (MeasureToPlace[i] >= Measures.Count) // { // Measures.Add(new Measure()); // } // if (j >= pattern.Steps.Count) // { // pattern = pattern.GetNextViablePattern(); // j = 0; // } // Measures[MeasureToPlace[i]].Steps[r] = pattern.Steps[j++]; // lookup[r, MeasureToPlace[i]] = true; //} int x = 0; foreach (var step in StepPattern.StepStream(true)) { restart: if (x >= Timings.Count) { break; } int r = NotesInMeasure[x]; if (RoundBeats) { r = rounder.Round(NotesInMeasure[x]); } if (r < 0 || MeasureToPlace[x] < 0 || lookup[r, MeasureToPlace[x]]) { x += 1; goto restart; } while (MeasureToPlace[x] >= Measures.Count) { Measures.Add(new Measure()); } Measures[MeasureToPlace[x]].Steps[r] = step; lookup[r, MeasureToPlace[x]] = true; } }