![]() |
AW: TMIDIPlayer2
Hi Emil, hi an die andren..
ja also wie schon gepostet, ist es bei vielen Midis so, dass der zu singende Text einfach zu spät angezeigt wird. Demnach ist es besser, den Text als Ganzes anzuzeigen und mit z.B. roter Farbe die Textposition anzuzeigen. Ich will eben kein fertiges Programm, will das (leider ohne Hilfe gehts nicht) selber hinkriegen. Ich kann viel im Datenbankbereich, aber mit Midis usw. bin ich halt überfordert. Es muss aber nicht sein ja? Nur wenns relativ einfach zu lösen ist wärs einfach klasse... Gruß und vielen Dank an alle! beanbear6 |
AW: TMIDIPlayer2
Zitat:
Lediglich das Parsen der Memo so das kein doppelter Eintrag angezeigt(selektiert) wird .. also Zeile für zeile müßte ich noch machen .Habe da aber noch keine Lösung gefunden(bzw. damit noch nicht viel gemacht). Vielleicht hat ja jemand ein beispiel dann addiere ich es noch zum Projekt. gruss |
AW: TMIDIPlayer2
Hi Emil,
ja das Ganze klappt megagut!!! Kann Midis abspielen und hab den kompletten Text dazu... Ich guck mal ich hatte sowas ähnliches mal... vielleicht findi noch das Testprogramm, das hat auf Tastendruck den Text einfach markiert. Weist, wenn ich das selber kompilieren und bearbeiten kann, kann ich noch eigene Datenbanksachen drüberbauen, das krieg ich locker hin... Nochmals vielen Dank für die Hilfe die ich hier kriege!!! Gruß aus Passau |
AW: TMIDIPlayer2
Zitat:
Mal abwarten vielleicht hat noch jemand anderes ein paar Tips. gruss |
AW: TMIDIPlayer2
Hallo,
ich bin Delphi-mäßig auch mehr im Datenbankbereich tätig. Mit Midi's kenn ich mich einigermaßen aus, das problem ist bei mir momentan die Zeit. Nach Weihnachten wird es besser. Dann kann ich vielleicht auch was konstruktives dazu beitragen. Auf Anhieb würde ich das mal so versuchen: 1. Dem ganzen Text in ein Memo, mit Zeilenumbruch. Einen Counter auf null setzen. 2. Mit den Lyrics-Events den Counter jeweils um die Länge des Strings erhöhen ==> Sel-End. Der Counter ist quasi nix anderes als die Summe der von Midi-beginn an ausgegebenen Zeichen. 3. Sel-Begin berechnen: Vom Sel-End zurück gehen bis zum letzten Zeilen-Umbruch Der Haken an der Vorgehensweise ist, dass beim Bewegen des TrackBars die Logik nicht mehr stimmt. Aber zumindest beim Abspielen ohne Unterbrechnung müsste es so gehen. @Emil: Unter ![]() @All: Unter ![]() |
AW: TMIDIPlayer2
Zitat:
gruss |
AW: TMIDIPlayer2
Hi musicman56 und Emil,
ja das mit der Trackbar dachte ich auch schon dran, aber das denke ich kann man unberücksichtigt lassen. Wenn ein File gestoppt wird, denke ich solls von vorn neu beginnen - also das macht mir keine Sorgen... :) Ich such immer noch das Beispiel von damals wo der Text markiert wurde... Gruß und Dank an alle. beanbear6 |
AW: TMIDIPlayer2
Neue Version oben.. nur TMidiPlayer2_without_Com
Copyright Text Fehler beseitig hat im Lyric Text nichts zu suchen. Beispiel: Zitat:
ist meines erachtens das einfachste.. mit Memo's geht es einfach nicht. Wird aber dieses Jahr nichts mehr mit Hochladen.. wenn fertig dann ist es fertig. Ein Frohes Weihnachtsfest wünsche ich euch allen. gruss |
AW: TMIDIPlayer2
Hi Emil,
wär das eventuell mit RichText leichter zu lösen?? Ich hab von einem guten Bekannten folgenden Quellcode erhalten. Im Ansatz ist das fast das was benötigt wird... (Auch an alle hier ein ruhiges besinnliches Weihnachtsfest und nen guten Rutsch) :)
Delphi-Quellcode:
var
such: string; suchmodus: boolean; start: integer; procedure TForm1.FormCreate(Sender: TObject); begin KeyPreview := true; Button2Click(Sender); end; procedure TForm1.Button1Click(Sender: TObject); begin suchmodus := true; label1.caption := 'Suchmodus ist ein'; end; procedure TForm1.Button2Click(Sender: TObject); begin suchmodus := false; label1.caption := 'Suchmodus ist aus'; Label2.caption := ''; Memo1.sellength := 0; such := ''; start := 1; end; procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); var x, lg: integer; begin if suchmodus then begin if (key = #8) and (such <> '') then begin delete(such, length(such), 1); start := 1; end else if key >= #32 then such := such + Key; if such = '' then begin label2.caption := ''; Memo1.sellength := 0; start := 1; key := #0; exit; end; lg := length(such); label2.caption := such; if (key = #13) and (Memo1.sellength > 0) then inc(start, lg); Memo1.sellength := 0; for x := start to length(memo1.text) - lg + 1 do if lstrcmpi(pchar(such), Pchar(copy(Memo1.text, x, lg))) = 0 then begin Memo1.selstart := x - 1; Memo1.sellength := lg; Memo1.setfocus; Memo1.perform(EM_SCROLLCARET, 0, 0); start := x; break; end; if Memo1.sellength = 0 then start := 1; key := #0; end; end; |
AW: TMIDIPlayer2
Zitat:
Memo/Richedit ist ja fast identisch was die suche im Text betrifft. Das problem ist ganz einfach dies das ein string im Memo/Richedit Text öfter vorkommen kann. Da immer der gesamte Text durchsucht wird "of" in der 5 aber auch in der ersten Zeile stehen kann springt der Cursor dann wenn du in zeile 5 bist logischerweise in die zeile 1. Also zu den zuerst gefundenen "of" Eintrag. gruss |
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) |
AW: TMIDIPlayer2
Zitat:
Your coding method is very nice :-) And the KMIDIPlayer seems an advanced midi player... I understand about permission of Silhwan. I hope, he publish the source codes on Delphi-PRAXIS forum... Best regards, midijor |
AW: TMIDIPlayer2
Zitat:
to many work for compare instruments from MidiFile to. sorry regards |
AW: TMIDIPlayer2
Nach eingehender vorheriger beratung seitens (Instrument.pas) haben wir uns
entschlossen den Quelltext offenzulegen. Instrumente können nun einzeln abhängig vom selektierten Fader verändert werden. gruss |
AW: TMIDIPlayer2
Hallo Emil,
wow wow das sind ja herrliche Neuigkeiten!! Gibt es dann in naher Zukunft eine neue Version von den MidiComps? Gruß Reiner (beanbear6) |
AW: TMIDIPlayer2
Zitat:
Die sind erst überarbeitet worden. Um was geht es dir denn genau das du meinst bzw. glaubst eine neue Version zu benötigen. gruss |
AW: TMIDIPlayer2
Kleines update vom 12.2
Delphi-Quellcode:
Archiv aktualisiert.
procedure TMainForm.FormShow(Sender: TObject);
.... ViewChannelForm.ResetFields(true{Reset Device}); // ** Added at 2013-02-12 Zudem noch einige nicht verwendete Variablen und Proceduren entfernt. gruss |
AW: TMIDIPlayer2
Neue Version oben!
TMidiplayer verwendet nun MidiSheetMusic-2.5 als Slave. Angepasster Quelltext von MidiSheetMusic im Archiv enthalten. gruss |
AW: TMIDIPlayer2
Danke für den Source Code!
kMIDIPlayer läuft störungsfrei. Die Grafik von MidiSheetMusic ist sehr resourcenfressend. Bei meinem ACER-NB Extensa 5220 mit CPU T9300 und UMA-Grafik wird alles blockiert. Sogar der Maus-Cursor lässt sich nicht mehr bewegen. |
AW: TMIDIPlayer2
Zitat:
Bei mir habe ich in der hinsicht keine probleme. Ein Programm als Slave zu kontrollieren ist immer etwas aufwendiger und unterumständen kann das auch auf kosten der resourcen gehen. Ich müßte mal testen wie sich das verhält wenn ich eine Version von MidiSheet mit VS2012 kompiliere, könnte man aber auch selbst machen wenn man über VS2012 verfügt. Diese im Archiv ist mit SharpDevelop kompiliert worden. gruss |
AW: TMIDIPlayer2
Für die Leute die das projekt verwenden eine kleine korrektur.
Zitat:
Delphi-Quellcode:
gruss
in procedure TMainForm.WndProc of MIDITest.pas
. . else if (Msg.Msg = WM_Mouse_Clicked) then // mouse click on music sheet of MidiSheetMusic begin if (FhServer <> 0) and (Paused or (not MidiPlayer.Playing)) then begin if (not Paused) then begin Paused := true; for I := 0 to MidiPlayer.MidiFile.TrackCount - 1 do // "I" should be declared as a local variable MidiPlayer.MidiFile.GetTrack(I).EndOfTrack := false; end; PostMessage(FhServer, WM_MIDI_PosUpdate, WPARAM(Msg.WParam), 0{=Move to new position}); PrevPosMs := Midifile.Tick2TimePos(Msg.WParam); MidiPlayer.CurrentTime := PrevPosMs; PrevPosTicks := Msg.WParam; MidiPlayerPosUpdate(PrevPosMs, Msg.WParam); end; end |
AW: TMIDIPlayer2
Neue Version oben.
Was geändert bzw. addiert wurde kann man im Text Revision_Notification nachlesen. Wer das Menü gerne in Deutsch haben will kann folgendermaßen vorgehen. 1. MusicSheet Projekt öffen 2. TextLib.resx ins Deutsche übersetzen 3. Nach der übersetzung als TextLib.de-DE.resx speichern und zum Projekt addieren 4. Öffne LyricsEdit.cs und ändere die Sprache nach German (nicht vergessen die Buttonbeschriftung hier zu ändern) 5. Neu kompilieren gruss |
AW: TMIDIPlayer2
Hallo,
weil ich aktuell auf der Suche nach einem guten MidiPlayer mit Quellcode für Delphi bin, habe ich die aktuelle Version mal getestet. Das Ergebnis war dann doch gelinde gesagt etwas ernüchternd. Etwa knapp die Hälfte meiner Midifiles läuft mit dem Player nicht. Habe mit der kMIDIPlayer.exe auf mehreren Rechnern unterschiedlichster Performance getestet. Die augenfälligsten Probleme sind: - SysEx werden verschluckt. Kann man mit MidiOx nachvollziehen. - Notenhänger bei langen Noten, d.h. NoteOff's werden nicht gesendet oder gehen verloren. - Das Tempo stimmt manchmal nicht. Bevor ich mich weiter damit beschäftige, zwei Fragen: 1) Ist es angedacht, den Player Musikertauglich zu machen? 2) Wenn ja, in welcher Zeit, und was kostet es? Bis etwa 300 Euronen wären akzeptabel. Ansonsten, wenn jemand einen guten Player kennt, bin für jeden Tipp dankbar. |
AW: TMIDIPlayer2
Kann auf meinem Rechner die von dir angegebenen Fehler Probleme nicht nachvollziehen.
Zudem gibt es schon eine überholte Version von der Komponente die aber bisher noch nicht veröffentlicht wurde. Außer in meinem VPiano allerdings nicht als Komponente. MidiFile2 Zitat:
Zitat:
Zitat:
Wenn der Player dir nicht reicht. gruss |
AW: TMIDIPlayer2
Zitat:
Wenn ich nur Standard-GM-Midi's (oder GM2) durch den Microsoft GS Wavetable Synth jage, passt ja auch alles wunderbar. Aber, kein Musiker arbeitet mit diesen Sounds, und somit auch nicht mit Standard-GM-Midi's. Das hab ich auch mit "musikertauglich" gemeint. Zitat:
Bin auch gern bereit, das Update vorab zu testen. |
AW: TMIDIPlayer2
Hi Emil,
wann darf man denn mit dem Update rechnen? Find ich ja megatoll!!! Wird das Update öffentlich gestellt? Gruß Reiner |
AW: TMIDIPlayer2
Zitat:
Ich gehe vom Standard User aus der unter Windows mal eben seine Midi-Files testen will. Wenn ich meine Integrierte Midi Schnittstelle meiner Böhm-Diamant-300-CT verwende sieht das natürlich anders aus. Davon hast du allerdings nichts erwähnt. Aber egal.... Zitat:
gruss |
AW: TMIDIPlayer2
Zitat:
|
AW: TMIDIPlayer2
Zitat:
Bin selbst einer. Zitat:
Im ernst.. Habe sie selbst gebaut und ja wirklich im sinne von gebaut. Jeden einzelnen Widerstand selbst auf die Platinen gelötet. Anders wäre Sie auch gar nicht zu finanzieren gewesen. Wenn man bedenkt das Sie zu dieser Zeit mal locker 32 000.-DM (Fertig) gekostet hat. Heute bekommt man dafür fast nichts mehr.. gruss |
AW: TMIDIPlayer2
Neue Version online..
Die neue Komponente findet sich im Archiv unter TMIDIPlayer2_v0971 @mm1256 Kann nicht dafür garantieren das es deinen Ansprüchen genügt. Denke mal nicht denn dazu müsste man die ganzen Spezifikationen deiner Soundmodule/Expander kennen um die Schnittstelle darauf hin anzupassen. So wie dir bekannt sein dürfte hat jeder Hardware Hersteller da seine eigenen Vorstellungen. Trotz alledem sollten einige Probleme behoben sein. Und neue Funktionen wurden hinzugefügt. gruss |
AW: TMIDIPlayer2
Zitat:
Heute nachmittag hatte ich etwas Zeit und hab mal mit höheren Prioritäten rumprobiert. Es ändert sich was. Wenn ich z.B. die Anwendung auf REALTIME_PRIORITY_CLASS setze, dann laufen manche Midifiles die mit normaler Priorität nicht laufen. Zur Info: Besonders beim Senden von SysEx sind Expander/Soundmodule manchmal für ein paar Millisekunden "tot", d.h. reagieren nicht auf weitere Midi-Events. Darum werden die zu sendenden Events i.d.R. in einen RingPuffer (FirstIn-LastOut) geschrieben, der dann bei Verzögerungen wieder aufholt, wodurch sicher gestellt ist, dass kein Event verloren geht. Wie das beim MidiPlayer2 gelöst ist, habe ich mir noch nicht angesehen. Vielleicht komme ich diese Woche dazu, die MidiPlayer2.pas mal unter die Lupe zu nehmen. Werde dann berichten. Das generelle Problem ist nämlich, dass es keine (mir bekannten) guten Midi-Komponenten mit Source für Delphi gibt. Alle haben sie irgendwo eine kleine Macke, und die meisten davon werden sowieso nicht weiter entwickelt. Zur Not muss ich selber mal ganz von vorne anfangen. Wenn nur die Zeit dafür da wäre :cyclops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz