AW: TMIDIPlayer2
Hallo Emil,
ich habe mir den Quelltext des Players mangels Zeit noch nicht angesehen. Aber, ich kenne einige Bibliotheken von anderen Anbietern und weiß darum, wie diese die Anzeige realisiert haben. Meistens liest man ja alle Midi-Events in eine Liste (abgeleitete TList) ein, und schickt die Events dann der Reihe nach an den Midi-Port. Diese Liste muss einen Integer mit der aktuellen Text-Position enthalten. Wie ich vorher schon mal angedeutet habe, ist das die Anzahl der Chars von Beginn an (kannst also jederzeit auch den Copyright-String oder andere Events ausblenden). Den Integer erzeugt man ganz einfach bei der ersten Erstellung des "gesamten" Textes im Memo. Um unnötiges Aktualisieren zu verhindern, und die Lesbarkeit beim Abspielen zu verbessern, macht man das meistens "Wort für Wort" oder auch zeilenweise. Der User kann somit den Trackbar an jede gewünschte Position ziehen, und der Text stimmt immer. Der Vorteil ist: Es geht auch mit einem einfachen Memo, weil "Sel.." und Co verwendet werden kann. Sel.Begin ist der Integer und Sel.End ist die nächste Zeile (Zeilenumbruch) Aber...only my 2 cents, will mich nicht in deine Planung einmischen. OT - eigentlich eine Frage an den Forums-Admin: In der Vorschau wird die Signatur angezeigt bzw. angehängt, aber nicht im Beitrag. Was muss man denn da einstellen/ändern? Hab schon in den Einstellungen gesucht, aber nichts gefunden. Komisch ist: Nachdem ich einen Beitrag nachträglich bearbeitet habe, ist die Signatur seltsamerweise da... also doppelt. Evtl. Browser-Problem? Mit musikalischem Gruss ------------------------ - musicman56 (Otto) - |
AW: TMIDIPlayer2
Die aktuelle Textposition ermittle ich (OpenGL) über das Elapsed Event also zu welcher zeit der Text geschrieben wird.
Die Procedure
Delphi-Quellcode:
procedure TForm1.MidiPlayerGotLyrics(Track: Integer; Event: PMidiEvent);
liefert mir den korrekten String zurück ein zusätzliches addieren in einer TList innerhalb der Mainform wäre also in dem Fall doppelt gemoppelt da der Komplette text vorher schon in einer TList addiert wird. Bei OpenGL habe ich kein problem den Text auszugeben (finden) da er wie schon gesagt über Elapsed ermittelt wird. Hingegen im Memo/Richedit finde ich einfach nicht den Ansatz wie ich das hier realisieren soll. gruss |
AW: TMIDIPlayer2
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Emil,
hm seltsam, ich hab ein RichEdit dazugesetzt wo ich die Zeilenumbrüche einwandfrei kriege, aber im SyncLyrics macht er mir das einfach nicht. Hast Du ne Idee, woran das liegen kann?? Gruß und frohes Fest Reiner |
AW: TMIDIPlayer2
Neue version online..
gruss |
AW: TMIDIPlayer2
hat sich erst mal erledigt
|
AW: TMIDIPlayer2
Hi EWeiss,
das sieht ja cool aus!! Jetzt geht auch die Lyrics einwandfrei. Ich hab da nen Sonderfall mit diesen Kompos: Kann ich da auch Lyrics eines externen Hardware- Midifile-Players importieren und anzeigen lassen? Gruß beanbear |
AW: TMIDIPlayer2
Zitat:
Ich habe eine externe 250Gb große Festplatte (USB) warum sollte ein MidiFile das ich dort ablege nicht funktionieren vorrausgesetzt das Midifile enthält Lyrics Lade mal ein MidiFile von dem Player hoch. gruss |
AW: TMIDIPlayer2
Neue Version oben siehe change log
gruss |
AW: TMIDIPlayer2
Hello Emil,
Thanks again to you and Silhwan Hyun for your great effort for TMIDIPlayer2 project :-) I've tried to play the standard midifile many times than found a solution. I've added two variations after implemetation and other provided codes in MidiFile2 unit as below.
Delphi-Quellcode:
I hope, you'll do better than me and your "KaraGL" project supports the standard midifile....... implementation var isMetaLyric : Boolean; nMetaTextCount : Integer; ..... function TMidiFile2.ReadFromFile(const FileName: WideString): Boolean; var FileInfo: TMidiFileInfo; I,N: Integer; begin FLyricsTrack := -1; FLyrics := ''; if isMetaLyric then isMetaLyric := False; // Added by midijor nMetaTextCount := 0; // Added by midijor ............. end; // In SaveMetaEvent procedure procedure SaveMetaEvent(Status_: byte; Elapsed_: LongWord); var ...... DataType2 : byte; // Added by midijor str3 : AnsiString; // Added by midijor ...... begin ........... TempoMap[TempoCounter-1].Tempo := Tempo; end else // Added by midijor if DataType = $05 then // for metaLyric begin New(pEvent); pEvent^.Event := Status_; pEvent^.Positon := Elapsed_; pEvent^.Data1 := DataType; pEvent^.Msg := str2; if isMetaLyric = false then isMetaLyric := True; // isMetaLyric founded MidiTrack.AddEvent(pEvent); end else if DataType = $01 then // for converting metaText to metaLyric begin if isMetaLyric = false then begin DataType2 := $05; if (str2[1] = '@') then //Chr($40) begin // some information end else if str2[1] = Chr($5C) then // '\' clear line. begin if nMetaTextCount > 0 then begin str3 := Chr(10); New(pEvent); pEvent^.Event := Status_; pEvent^.Positon := Elapsed_; pEvent^.Data1 := DataType2; pEvent^.Msg := str3; MidiTrack.AddEvent(pEvent); str3 := ' '+ Chr($A); //for new line New(pEvent); pEvent^.Event := Status_; pEvent^.Positon := Elapsed_; pEvent^.Data1 := DataType2; pEvent^.Msg := str3; MidiTrack.AddEvent(pEvent); end; nMetaTextCount := nMetaTextCount + 1; str3 := Copy(str2, 2, Length(str2) -1); New(pEvent); pEvent^.Event := Status_; pEvent^.Positon := Elapsed_; pEvent^.Data1 := DataType2; pEvent^.Msg := str3; MidiTrack.AddEvent(pEvent); end else if str2[1] = Chr($2F) then // New Line '/' begin str3 := ' '+ Chr($A); //for new line New(pEvent); pEvent^.Event := Status_; pEvent^.Positon := Elapsed_; pEvent^.Data1 := DataType2; pEvent^.Msg := str3; MidiTrack.AddEvent(pEvent); str3 := Copy(str2, 2, Length(str2) -1); New(pEvent); pEvent^.Event := Status_; pEvent^.Positon := Elapsed_; pEvent^.Data1 := DataType2; pEvent^.Msg := str3; MidiTrack.AddEvent(pEvent); end else begin New(pEvent); pEvent^.Event := Status_; pEvent^.Positon := Elapsed_; pEvent^.Data1 := DataType2; pEvent^.Msg := str2; MidiTrack.AddEvent(pEvent); end; end; // if MidiTrack.isMetaLyric = false then end else if DataType = $02 then begin New(pEvent); pEvent^.Event := Status_; pEvent^.Positon := Elapsed_; pEvent^.Data1 := DataType; pEvent^.Msg := str2; MidiTrack.AddEvent(pEvent); end else if DataType = $03 then begin New(pEvent); pEvent^.Event := Status_; pEvent^.Positon := Elapsed_; pEvent^.Data1 := DataType; pEvent^.Msg := str2; MidiTrack.AddEvent(pEvent); end else if DataType = $04 then begin New(pEvent); pEvent^.Event := Status_; pEvent^.Positon := Elapsed_; pEvent^.Data1 := DataType; pEvent^.Msg := str2; MidiTrack.AddEvent(pEvent); end; end; ........... Best regards, midijor |
AW: TMIDIPlayer2
Thanks for the Information
i have added all this by me and silhwan self see here.
Delphi-Quellcode:
best regards Emil
case Event^.Data1 of
// ** MIDI Karaoke file type 1 (Soft Karaoke) uses data type code $1 for recording lyrics // ** instead of data type code $5. // ** The identifier of this file type is text "@KMIDI KARAOKE FILE" as the first text at position 0. // ** (Applied at ver 0.9.5) $1: begin if FTrackKeyword = '' then if (Event^.Positon = 0) and (Event^.Msg = '@KMIDI KARAOKE FILE') then FFoundKaraokeId := true else // The name of Track 1 = "Soft Karaoke", Track 2 = "Words" if FFoundKaraokeId2 and (FTrackName = 'Words') then FFoundKaraokeId := true; // For very suspicious karaoke file if not FFoundKaraokeId then if FTrackName = 'Words' then if High(FRawLyrics) = -1 then if pos('@L', string(FTrackKeyword)) <> 0 then if pos('@T', string(FTrackKeyword)) <> 0 then FFoundKaraokeId := true; ps.. the last File show as see image i can not upload the source on this time without permission of Silhwan. (es geht nichts über Denglish) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz