I often find Renoise guesses double the speed of samples I load when I enable Beat Sync.
It often reports 8 when 16 would be more appropriate, or 32 when 64 would be a better fit.
This little bit of lua seems to do a better job to me:
-- round value to nearest integer
function round(x)
return math.floor(0.5 + x)
end
-- samples length in seconds
function sample_length(sample)
local frames = sample.sample_buffer.number_of_frames
local rate = sample.sample_buffer.sample_rate
return frames / rate
end
-- Guesses the number of lines in a loop at the given bpm
function guess_length_in_lines(sample)
local rns = renoise.song()
local length = sample_length(sample)
-- calculate song's beats per second
local bps = rns.transport.bpm / 60
-- calculate samples length in beats at current bpm
local beats_at_bpm = length * bps
-- closest power of two finds us 1, 2, 4, 8, 16, 32 beats etc.
local beats_in_loop = 2 ^ round(math.log(beats_at_bpm) / math.log(2))
-- return a nice round number of lines
return beats_in_loop * rns.transport.lpb
end
I know this kind of guessing can be a little arbitrary but is Renoise finding a floor when it could be rounding?