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