public static int ComputeNumberOfFrameForGroove(int length, int[] groove, int groovePadMode) { // Look in the cache first. var key = new CacheGrooveLengthKey() { groove = groove, groovePadMode = groovePadMode }; if (cachedGrooveLengths.TryGetValue(key, out var grooveLengthArray)) { return(grooveLengthArray[length]); } grooveLengthArray = new int[Pattern.MaxLength]; // Add to cache if not found. var idx = 0; var grooveIterator = new GrooveIterator(groove, groovePadMode); // This is really not optimal, not need to run the full iterator until the very end. for (int i = 0; i < grooveLengthArray.Length; i++) { if (grooveIterator.IsPadFrame) { grooveIterator.Advance(); } grooveLengthArray[idx++] = grooveIterator.FrameIndex; grooveIterator.Advance(); } cachedGrooveLengths.Add(key, grooveLengthArray); return(grooveLengthArray[length]); }
protected void UpdateTempo() { if (famitrackerTempo) { // Tempo/speed logic straight from Famitracker. var tempoDecrement = (song.FamitrackerTempo * 24) / famitrackerSpeed; var tempoRemainder = (song.FamitrackerTempo * 24) % famitrackerSpeed; if (famitrackerTempoCounter <= 0) { int ticksPerSec = palPlayback ? 50 : 60; famitrackerTempoCounter += (60 * ticksPerSec) - tempoRemainder; } famitrackerTempoCounter -= tempoDecrement; } else { grooveIterator.Advance(); } }