Log In  


This is a really weird bug, but stat calls for pattern index, note index, and "number of ticks played" do not always sync up and sometimes one changes before the other. It was intermittent and hard to track down. In order to compensate for this, I had to write something to insulate myself from it:

function poll_songpos()
  local pat = stat(24)
  local n = stat(21)
  local ticks = stat(26)

  -- compensate for bug (!) where pattern sometimes changes before note
  if pat ~= songpos.pat and n ~= songpos.n then
    songpos.pat = pat
    songpos.n = n

    if songpos.prevticks > 0 and ticks >= songpos.prevticks then
      songpos.ticks = 0
      songpos.waitingforticksync = true
    end
  elseif pat == songpos.pat and n ~= songpos.n then
    songpos.n = n
  end

  -- compensate for bug (!) where pattern sometimes changes before ticks
  if songpos.waitingforticksync then
    if ticks < songpos.prevticks then
      songpos.waitingforticksync = false
    end
  else
    songpos.ticks = ticks
    songpos.prevticks = ticks
  end
end

(I then changed all other code to use songpos as the source of truth, rather than the stat calls)

However, this caused a big headache and was hard to track down and it would be great if this wrapper were not necessary. Also I'm not 100% sure this wrapper code is completely bulletproof; I simply wrote it out of necessity to get the issue out of the way from the specific cart I was working on.

Sorry I don't have a cart demonstrating the issue, but I will try to make one. I just wanted to get this reported sooner rather than later, in hopes that it might get addressed for the upcoming update :D

EDIT: as a reminder I also have another bug thread about stat(24) returning 0 instead of -1 which hasn't been fixed yet

PS
Thanks again, @zep, for adding these sfx state-related stat calls a while back; it is super fun to get stuff to react to music/sfx, in a way that is not easily possible on most other platforms!




[Please log in to post a comment]