Text aus Datei auswerten && Wii Timingproblem

Beim 0 Beat startet die Note - sry falsch ausgrdrückt.

Da bis dahin aber schon ein paar Beats vergangen sind wird das durch das GAP (Lücke wie du sagtest) aufgefüllt und beginnt daher erst nach 15 Sekunden.

Das wäre der normale Code den ich im mom habe. Sind halt ein paar Funktionen aus einer extra Wiilib (GRRLIB) drin.

Code:
while(1) 
	{	
		fscanf(txt, ": %ld %ld %ld %s\n", &start, &laenge, &hoehe, text);
		
		start = start / (250 * 4) * 60 + (15650 / 1000); // BPM = 250 GAP = 15650
		ende = (start + laenge) / (250 * 4) * 60 + (15650 / 1000); // BPM = 250 GAP = 15650
		
		GRRLIB_DrawImg(rmode->fbWidth / 2 - cover->w / 2, rmode->efbHeight / 2 - cover->h / 2, cover, 0, 1, 1, RGBA(255, 255, 255, 255)); // Textur zeichnen
		GRRLIB_PrintfTTF(0, 0, myFont, "Keri Hilson - I like", 24, RGBA(255, 255, 255, 255)); // Text zeichnen
		
		GRRLIB_Render(); // Auf Bildschirm rendern

		usleep((start - vorbei) * 1000000);
		
		GRRLIB_DrawImg(rmode->fbWidth / 2 - cover->w / 2, rmode->efbHeight / 2 - cover->h / 2, cover, 0, 1, 1, RGBA(255, 255, 255, 255)); // Textur zeichnen
		GRRLIB_PrintfTTF(0, 0, myFont, "Keri Hilson - I like", 24, RGBA(255, 255, 255, 255));  // Text zeichnen
		
		GRRLIB_PrintfTTF(30, 30, myFont, text, 24, RGBA(255, 255, 255, 255)); // Notentext zeichnen
	
        WPAD_ScanPads(); //WiiMote nach Buttonklick scannen

        if (WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME)
		{
			MP3Player_Stop();
			break;
		}
		
		GRRLIB_Render(); // BIldschirm rendern
		
		usleep((ende - start) * 1000000);

		vorbei = ende;
    }
 
Zuletzt bearbeitet:
Also...zuerst Punkt c anschauen

Mögliche Problemquellen:

a) Ist usleep wirklich genau?
Ich denk zwar 'Ja', da die Wii im Gegensatz zu Windows
hauptsächlich auf solche Sachen ausgelegt ist.
Trotzdem..vllt. ist usleep ja einfach aber ungenau,
und es gibt noch eine bessere Möglichkeit?
(Müsste mich selber erst einlesen bzw. herumprobieren)

b) Der Code zwischen den zwei usleeps braucht auch Zeit.
Die wird bei der Wartezeitberechnung nicht berücksichtigt.
Das hat zwar nichts mit dem zu-schnell-sein zu tun, kann
aber (wenns dann funktioniert) zu einer leichten Verlangsamung führen,
vor allem bei langen Liedern.
Wird meistens vernachlässigbar sein, aber trotzdem.
Zum Ausgleichen bräuchte man aber vom System aus eine Zeitfunktion
(die nicht wartet, sondern die 'aktuelle' Zeit seit Einschalten oder so liefert.)

c) Hauptproblem: Die Formeln für start und Ende.

Zuerst start:
start = startbeat / (bpm * 4) * 60 + (gap / 1000);
Schaut ziemlich gut aus, aber: Warum *4 bei bpm?

Ende:
ende = (startbeat + beatlänge) / (bpm * 4) * 60 + (gap / 1000);
Prinzipiell (bis auf die *4-Frage) auch in Ordnung,

großes ABER:
Beim startbeat verwendest du nicht die Zahl aus der Datei,
sondern start, das vorher schon durch die ganze bpm-gap-Berechnung gejagt wurde.
...



Punkt c ausbessern.
Wenns dann kleinere Abweichungen vom Soll gibt, die anderen zwei Punkte.
Wenns noch immer große Probleme gibt...wieder melden :D

PS: Homebrew ist schon was feines :)
 
Bei der start-Berechnung verwendest du die Anfangbeatzahl aus der Datei.
Die ist auch in start. Ist aber kein Problem, der Neue start-Wert kommt ja
erst am Schluss der Rechnung rein.

Bei der ende-Berechnung wird auch der Anfangsbeatwert aus der Datei gebraucht.
Dort verwendest du auch start. In start steht aber nicht mehr die Zahl aus der Datei drin,
sondern das durchgerechnete aus der oberen Zeile.

edit: So besser:
C++:
int x;
fscanf(txt, ": %ld %ld %ld %s\n", &x, &laenge, &hoehe, text);
start = x / (250 * 4) * 60 + (15650 / 1000);
ende = (x + laenge) / (250 * 4) * 60 + (15650 / 1000);
oder einfach zuerst ende, dann start berechnen.
 
Zurück