Autor Wątek: [OpenGL] Synchronizacja białego błysku z muzyką  (Przeczytany 667 razy)

Offline slowbro

  • Użytkownik

# Wrzesień 14, 2017, 00:47:17
Cześć

Eksperymentuje obecnie z synchronizacją prostych efektów z muzyką. Muzyka jest napisana w postaci modułu trackerowego. API playera muzyki zwraca wiersz patternu, co można wykorzystać do synchronizacji. W patternie jest 64 wiersze (numerowane od 0 do 63). W związku z tym mam  dwa zagadnienia:

1. Zależy mi, aby w przypadku zwrócenia przez API, że grany jest wiersz o numerze 8, 16, 32 i tak dalej dodając 8 aż do 63 na ekranie pojawił się biały błysk. Warunek sprawdzający mam skonstruowany tak (rowNumber to numer aktualnie granego wiersza):

if (rowNumber % 8 == 0 ||
rowNumber % 8 == 2 ||
rowNumber % 8 == 3 ||
rowNumber % 8 == 4 ||
rowNumber % 8 == 5 ||
rowNumber % 8 == 6 ||
rowNumber % 8 == 7 ||
rowNumber % 8 == 8)
{
whiteFlash();
}
Można jakoś tą rozbudowaną logikę sprawdzającą w nawiasie uprościć i zastąpić bardziej czytelnym kodem? Muzyka ma paręset wierszy w pattermach i oprogramowanie synchronizacji białego błysku do tych wierszy zajmie bardzo dużo sprawdzających warunków logicznych:)

2. Przejście pomiędzy jednym efektem a drugim ma odbyć się w postaci białego błysku. Kod rysujący figury w zależności od tego jaki wiersz modułu muzycznego jest grany przedstawia się następująco:

if ((rowNumber >= 0) && (rowNumber <=127))
{
drawFigure1();
}

if (rowNumber == 128)
whiteFlash();

if ((rowNumber >= 129) && (rowNumber <=256))
{
drawFigure2();
}

Gdy odgrywany jest 128 wiersz ma być biały błysk pomiędzy jednym efektem a drugim, a niestety tego białego błysku nie ma. Kod dotyczący białego błysku działa na 100% poprawnie, ponieważ jak się wywoła biały błysk w czasie trwania jakiegoś efektu to jest ładnie widoczny. Co może być przyczyną tego, że biały błysk nie jest widoczny pomiędzy jednym a drugim efektem? Oto poniżej kod odpowiedzialny za biały błysk:

void whiteFlash()
{
glLoadIdentity();
glTranslatef (0.0f, 0.0f, -5.0f);

glPolygonMode(GL_FRONT, GL_FILL);
glPolygonMode(GL_BACK, GL_FILL);

glDisable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE);

if (alpha <= 1)
{
glColor4f(1.0, 1.0, 1.0, alpha);

glBegin(GL_QUADS);         
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();

alpha += 0.025;
}
else
{
glColor4f(1.0, 1.0, 1.0, alpha_inv);

glBegin(GL_QUADS);         
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();

alpha_inv -= 0.025;
}

glDisable(GL_BLEND);
glEnable(GL_TEXTURE_2D);

return;
}

Dziękuję z góry za odpowiedzi

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Karol

  • Użytkownik

# Wrzesień 14, 2017, 09:32:58
Ten warunek będzie aktywował się praktycznie dla każdego wiersza, jeżeli to ma być na co ósmym wierszu, to powinieneś dać po prostu (rowNumber + 1) % 8 == 0? Jeżeli na każdym wzorze masz bit na ósmym wierszu to powinno działać.

Jeżeli wiersze masz od 0 do 63 to czemu dalej w kodzie używasz wartości większych?
« Ostatnia zmiana: Wrzesień 14, 2017, 09:37:24 wysłana przez Karol »

Offline slowbro

  • Użytkownik

# Wrzesień 14, 2017, 22:04:46
@Karol: Dzięki za wskazówkę, przydała się. Wystarczyło dać w warunku tylko sprawdzenie (rowNumber % 8 == 0) i wszystko działa poprawnie:) I wyjaśnienie do Twego pytania. Wiersze w patternie są numerowane od 0 do 63. To widzi muzyk, który tworzy muzykę w edytorze. Patternów może być więcej niż jeden. API playera zwraca jako numer wiersza kolejne liczby od 0 w górę, czyli do ostatniego wiersza ostatniego patternu:)
« Ostatnia zmiana: Październik 07, 2017, 21:09:14 wysłana przez slowbro »

Offline slowbro

  • Użytkownik

# Wrzesień 17, 2017, 22:31:40
.
« Ostatnia zmiana: Październik 08, 2017, 02:03:06 wysłana przez slowbro »