private float FindFirstBeatTime(float[] beatTimes, float predictedBeatTimeDiff, BeatController.BeatLabelProcessorParams beatParams)
    {
        float result = 0;


        int requiredHits  = (int)((float)beatParams.beatFinderStepRange * beatParams.beatFinderHitThreshold);
        int allowedMisses = beatParams.beatFinderStepRange - requiredHits;

        for (int beatIndex = 0; beatIndex < beatTimes.Length - beatParams.beatFinderStepRange - 1; beatIndex++)
        {
            float currentBeatTime   = beatTimes[beatIndex];
            float predictedNextBeat = currentBeatTime + predictedBeatTimeDiff;
            int   missCounter       = 0;
            float nextTime          = 0;
            float error             = 0;
            bool  isStartingBeat    = false;
            for (int i = beatIndex + 1; i < beatIndex + beatParams.beatFinderStepRange; i++)
            {
                nextTime = beatTimes[i];
                while (nextTime > predictedNextBeat + beatParams.allowedErrorRange)
                {
                    predictedNextBeat += predictedBeatTimeDiff;
                    // didnt miss miss beat but skipped too much!
                    missCounter++;
                }

                error = Mathf.Abs(predictedNextBeat - nextTime);
                if (error > beatParams.allowedErrorRange)
                {
                    missCounter++;
                }

                if ((i - beatIndex) - missCounter > requiredHits)
                {
                    isStartingBeat = true;
                    result         = currentBeatTime;
                    break;
                }
                else if (missCounter > allowedMisses)
                {
                    // too many misses -> try next beat
                    break;
                }
            }
        }

        return(result);
    }
    public Beat ComputeBeat(BeatController.BeatLabelProcessorParams beatParams)
    {
        Beat beat = null;

        if (_beatFile == null)
        {
            Debug.LogError("No BeatLabel File handed to BeatProcessor!");
            return(beat);
        }

        float[] beatTimes = parseBeatTimes();
        if (beatTimes.Length < 100)
        {
            Debug.LogError("Cannot parse Beattimes -> " + beatTimes.Length + " beats are not enough!");
        }
        else
        {
            float[] beatTimeDifferences = computeBeatDifferences(beatTimes);

            System.Array.Sort(beatTimeDifferences);

            float predictedBeatTimeDiff = beatTimeDifferences[(int)(beatTimeDifferences.Length * beatParams.fakeMedian)];

            //foreach(float f in beatTimeDifferences)
            //{
            //    Debug.Log("BeatTime: " + f);
            //}

            float firstBeatTime = FindFirstBeatTime(beatTimes, predictedBeatTimeDiff, beatParams);

            beat = new Beat(predictedBeatTimeDiff, firstBeatTime);

            Debug.Log(beat);
        }
        return(beat);
    }