-
Ist garantiert min. ein Leerzeichen drin oder kann als Trennzeichen
auch mal ein einzelner Tabulator dabei sein?Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Also es ist mindestens ein Leerzeichen in jeder Zeile und bei einigen Zeilen 2 Leerzeichen. Ein Tabulator kommt nie vor.
-
Vorausgesetzt, keine Zeile ist länger als 100 Zeichen
und die wort-Variable ist groß genug für die Wörter
UngetestetCode cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
int zeile_einlesen(FILE *dat, int *z1, int *z2, int *z3, char *wort) { char zeile[100]; int i; if(!fgets(zeile, 100, dat)) return 1; i = strlen(zeile) - 1; while(i >= 0) { if(zeile[i] == 10 || zeile[i] == 13 || zeile[i] == ' ') zeile[i--] = '\0'; else break; } while(i >= 0) { if(zeile[i] != 32) --i; else break; } while(i >= 0) { if(zeile[i] == 32) --i; else break; } if(i < 1) return 2; zeile[++i] = '\0'; strcpy(wort, &zeile[++i]); if(3 != sscanf(zeile, ": %d %d %d", z1, z2, z3)) return 3; return 0; }
Aufruf:
Code cpp:1 2 3 4
if(zeile_einlesen(txt, &z1, &z2, &z3, wort)) { //Fehler }
GrußNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Ich wer mal noch ein bisschen genauer - stehe nämlich gerade noch vor einem anderen Problem auch wenns jetzt etwas vom Thema abweicht.
Die Textdatei ist nämliche eine Lyrics Dateivon dem Programm Ultrastar (Karaoke für den PC). Ich bin gerade dabei das ganze für die Wii umzusetzten. Der aufbau dabei ist:
0 - beginn des Textes
3 - Notenlänge
14 - Tonhöhe
Notentext
Hier nochmal ein Auschnit aus der Textdatei:
Code :1 2 3 4 5
: 0 3 14 Sun : 8 3 11 down, : 16 2 14 fri : 20 2 14 day : 24 3 11 night,
Die Zahlen sind die Beats an denen die Note startet - jedes Lied hat also eine BPM (Beats per Minute) und eine GAP (weiß nicht genau was das ist). Die Beats berechnen sich so. Nehmen wir mal an BPM = 90 und GAP = 15000
start / (90 * 4) * 60 + Gap /1000 = Zeit nach der die Note startet
0 / (90 * 4) * 60 + 15000 /1000 = 15 Sekunden
Jetzt möchte ich so lange warten bis die Note startet, den Notentext ausgeben und dann die Länge der Note warten. Habe das so versucht:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13
unsigned long start, laenge, hoehe; unsigned long ende, vorbei = 0; 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 usleep((start - vorbei) * 1000000); printf("%s", text); usleep((ende - start) * 1000000); vorbei = ende;
Habe den Code etwas vereinfacht - die Dauerschleife ist raus und die Wii Befehle habe ich auch rausgenommen.
Allerdings wird so der Text viel schneller angezeigt als er sollte. Innerhalb von ca 10 Sekunden ist die komplette txt Datei durchgelaufen. Das ist ja nicht sinn der Sache. Eigentlich sollte ja so der Text passend zum Lied ausgegeben werden (Voraussetzung dafür ist natürlich das die txt Datei richtig ist - das ist hier aber 100%ig der Fall).
Noch ne Idee warum das ganze so schnell durchläuft? Ich sehe darin gerade keinen Fehler...Geändert von Crosaider (05.11.11 um 15:37 Uhr)
-
Hab nicht wirklich verstanden, was los ist...
bitte vereinfache den Code nicht.
Pro Zeile: Notenlänge und Tonhöhe versteh ich ja, aber warum ist 0 der "Textbeginn"?
Gap wird wohl "Lücke" oder so sein.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
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; }Geändert von Crosaider (05.11.11 um 16:00 Uhr)
-
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
PS: Homebrew ist schon was feines
Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Wie jetzt das ABER habe ich nicht ganz verstanden. Ich überschreibe doch die Zahl bei der Rechnung. Oder wie meinst du das****
-
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:
oder einfach zuerst ende, dann start berechnen.Code cpp:1 2 3 4
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);
Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
Ähnliche Themen
-
[AS3] XML Datei auswerten
Von SCIPIO-AEMILIANUS im Forum Flash PlattformAntworten: 0Letzter Beitrag: 03.01.10, 17:08 -
log (*.txt)datei auswerten
Von Wormz im Forum Visual Basic 6.0Antworten: 6Letzter Beitrag: 09.08.07, 20:12 -
Datei auswerten (beschränkte Möglichkeiten)
Von Razorhawk im Forum C/C++Antworten: 0Letzter Beitrag: 28.09.05, 11:08 -
PHP Tabellendaten auswerten und in Datei exportieren
Von patges im Forum PHPAntworten: 3Letzter Beitrag: 17.05.05, 11:26 -
Log-Datei auswerten
Von poolpage im Forum PHPAntworten: 4Letzter Beitrag: 11.08.02, 14:41



2Danke


Zitieren
Login






