Установка угла поворота в соответствии со значением BPM - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь установить угол поворота для некоторых предметов, чтобы он соответствовал скорости счетчика ударов в минуту. У меня есть элементы, вращающиеся, но я не могу получить значение поворота, соответствующее значению градусов на кадр, которое я определил из BPM.

Код показан ниже. Я прочитал о триге, у меня есть расположение точек по кругу вниз. Они распространяются в соответствии с номером в таблице. И я могу заставить их вращаться. Но они вращаются безумно быстро.

В моей голове все должно быть просто: у меня есть 16 нот в последовательности, скажем, 60 ударов в минуту, что дает мне 22,5 градуса между точками, и они должны вращаться со скоростью 1,5 градуса на кадр, со скоростью 15 кадров в секунду, чтобы вращаться во времени с часами BPM. Это то, что я настроил, но ... они вращаются намного быстрее. Я вручную ввел различные значения, но они не совпадают.


local SCREEN_FRAMERATE = 15
local angleRot  -- the gap between the dots, based upon the number of dots / 360
local rotateSpeed  -- the speed in degrees per second we need to rotate so the dots align with the sounds
local bbppmm  -- the beats per minute of the track



function init()
  -- OTHER CODE HERE


    -- set initial animation properties
  angleRot = (360 / initSequence.length)  -- set the offset between dots
  rotateSpeed = (angleRot/SCREEN_FRAMERATE)  -- work out the degrees per frame we need to rotate


  -- we use a metro to trigger n times per second (SCREEN_FRAMERATE)
  screen_refresh_metro = metro.init()
  screen_refresh_metro.event = function()
    angleRot = angleRot+1
    redraw()
  end
  screen_refresh_metro:start(1/SCREEN_FRAMERATE)
end



-- drawing the graphical interface
function redraw()
  screen.clear()

    screen.level(4)
    screen.rect(0,0,128,64)
    screen.fill()

    screen.level(1)
    screen.circle(64,32,11)
    screen.stroke()

    for i=1,initSequence.length do
    if initSequence.data[i] > 0 then
      screen.circle(
        math.cos((angleRot + rotateSpeed)*i)*11 + 64,  -- angle * radius + offset from zero
        math.sin((angleRot + rotateSpeed)*i)*11 + 32,  -- this line and the above place the circles on the larger circle
        initSequence.data[i] + (freqs[i]/600)  -- this line make the sequence circles the sizes they are
      )
    screen.fill()
    end
  end
    screen.update()
end

Я ожидаю, что точки будут вращаться со скоростью BPM, поэтому при скорости 60 ударов в минуту 22,5 градуса в секунду.

Я получаю гораздо более высокую скорость вращения, хотя она идет так быстро, что журнал не может идти в ногу, и он может быть просто случайным.

1 Ответ

1 голос
/ 07 апреля 2019

Как идиот, я сначала не конвертировал градусы в радианы, правильный код:

math.cos(math.rad(angleRot)*i)*11 + 64,  -- angle * radius + offset from zero
math.sin(math.rad(angleRot)*i)*11 + 32,  -- this line and the above place the circles on the larger circle
...