Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wrong intro time calculation #16

Open
dartfnm opened this issue Feb 27, 2020 · 2 comments
Open

Wrong intro time calculation #16

dartfnm opened this issue Feb 27, 2020 · 2 comments

Comments

@dartfnm
Copy link

dartfnm commented Feb 27, 2020

Calculation time with Samples per tick works wrong, if you have 140 bpm music.

push SAMPLES_PER_TICK * 8 * 4
This time doesn't match anything real usesefull ;)

It's mutch better to to calculate time in real seconds not in strange ticks.
push SAMPLE_RATE * 2 * 4; ; SAMPLE_RATE = 44100

@w23
Copy link
Owner

w23 commented Feb 28, 2020

Throughout years making 4k intros I found working with time in seconds exceedingly uncomfortable. It may be added as an option if you really want to use that, but this should be a rather rare special case for e.g. music that doesn't really have strong rhythm to sync to.

Can you share a project that has tick-time synchronization problems?

@dartfnm
Copy link
Author

dartfnm commented Mar 11, 2020

Возьмём конкретный пример, мы имеем музыку в 4klang :
BPM = 140
SAMPLES_PER_TICK = 4725
SAMPLE_RATE = 44100

1 Бар - это квадрат или ( 4 тика ) или (1/4 метронома),

И БАРы считать намного проще, зная только BPM и имея обычное время:

4 * ( 60(sec) / BPM ) = 1,714285714286 (sec/bar) - это 1 бар (такт) 1/4 метронома

или чуть иначе

60(sec) / ( 140(bpm)/ 4 ) = 1,714285714286 (sec/bar)

У меня получилось, что чтобы посчитать 1 бар из твоего времени (push SAMPLES_PER_TICK * 8 * 4), мне пришлось считать так

c) 1./(SAMPLE_RATE/(SAMPLES_PER_TICK * 8 *2)) = 1,714285714286 сек - кол-во секунд на 1 Бар (такт)

Я не очень понимаю что такое SAMPLES_PER_TICK, но решая уравнение, пришел к

solve(1/(SAMPLE_RATE/(SAMPLES_PER_TICK*8*2)) = 4*(60/BPM), SAMPLES_PER_TICK);

Получается что

SAMPLES_PER_TICK = ( 60/4 * SAMPLE_RATE) / BPM;

Получается что в SAMPLES_PER_TICK - спрятано SAMPLE_RATE (зачем он нам тут??), делённый на BPM в тех же Барах, но это капец - как сложно, проще иметь время в секундах, а номер Бара получать простым делением времени на BPM уже в шейдере:

const float bpmBar = 4. * (60. / BPM);
float nBar = iTime / bpmBar; // номер Бара во float

Так что не надо ничего придумывать со временем, а считать как все нормальные люди, тогда с музыкантом общаться становится легче:

patterns_list

А эти Бары, они же доли, они же такты - используются везде, в музыкальных редакторах:
photo_2020-03-11_11-28-57

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants