tutorials.de Buch-Aktion 05/2012
Seite 2 von 2 ErsteErste 12
Like Tree2Danke
ERLEDIGT
JA
ANTWORTEN
23
ZUGRIFFE
460
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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, ...?

  2. #17
    Crosaider Crosaider ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    12
    Also es ist mindestens ein Leerzeichen in jeder Zeile und bei einigen Zeilen 2 Leerzeichen. Ein Tabulator kommt nie vor.
     

  3. #18
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Vorausgesetzt, keine Zeile ist länger als 100 Zeichen
    und die wort-Variable ist groß genug für die Wörter
    Code 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;
    }
    Ungetestet
    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, ...?

  4. #19
    Crosaider Crosaider ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    12
    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)
     

  5. #20
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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, ...?

  6. #21
    Crosaider Crosaider ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    12
    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)
     

  7. #22
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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, ...?

  8. #23
    Crosaider Crosaider ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    12
    Wie jetzt das ABER habe ich nicht ganz verstanden. Ich überschreibe doch die Zahl bei der Rechnung. Oder wie meinst du das****
     

  9. #24
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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:
    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);
    oder einfach zuerst ende, dann start berechnen.
     
    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

  1. [AS3] XML Datei auswerten
    Von SCIPIO-AEMILIANUS im Forum Flash Plattform
    Antworten: 0
    Letzter Beitrag: 03.01.10, 17:08
  2. log (*.txt)datei auswerten
    Von Wormz im Forum Visual Basic 6.0
    Antworten: 6
    Letzter Beitrag: 09.08.07, 20:12
  3. Datei auswerten (beschränkte Möglichkeiten)
    Von Razorhawk im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 28.09.05, 11:08
  4. Antworten: 3
    Letzter Beitrag: 17.05.05, 11:26
  5. Log-Datei auswerten
    Von poolpage im Forum PHP
    Antworten: 4
    Letzter Beitrag: 11.08.02, 14:41