Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   TMIDIPlayerComp (https://www.delphipraxis.net/160875-tmidiplayercomp.html)

beanbear6 20. Dez 2011 11:10

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

EWeiss 20. Dez 2011 11:30

AW: TMIDIPlayer2
 
Zitat:

Ich will eben kein fertiges Programm
Das programm ist ja eigentlich schon fertig ;)
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

beanbear6 20. Dez 2011 11:45

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

EWeiss 20. Dez 2011 11:49

AW: TMIDIPlayer2
 
Zitat:

Nochmals vielen Dank für die Hilfe die ich hier kriege!!!
Kein Problem .. Helfe gerne soweit ich es kann.

Mal abwarten vielleicht hat noch jemand anderes ein paar Tips.

gruss

musicman56 20. Dez 2011 14:58

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 www.midiland.de gibt es den Midifile-Optimizer. Das ist ein schönes Beispiel, wie die Textanzeige dargestellt werden sollte.

@All: Unter www.live-player.de gibt es meinen Player kostenlos. Ich arbeite nicht mit Lauftext, sondern mit statischem RTF-Text. Geht aber auch nicht anders, weil zu einem einzigen Titel bis zu 4 Files hinterlegt werden können: mid, wma, mp3 und wav. Ausser der WAV werden die Files natürlich in einer (SQL-)Datenbank gespeichert. Wie gesagt, ich bin auch eher der Datenbank- als der Midi-Spezialist.

EWeiss 20. Dez 2011 15:31

AW: TMIDIPlayer2
 
Zitat:

Wie gesagt, ich bin auch eher der Datenbank- als der Midi-Spezialist.
Na ja ist ja kein Midi Spezifisches Problem sondern ein Memo Parsing problem :)

gruss

beanbear6 20. Dez 2011 17:14

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

EWeiss 23. Dez 2011 11:50

AW: TMIDIPlayer2
 
Neue Version oben.. nur TMidiPlayer2_without_Com

Copyright Text Fehler beseitig hat im Lyric Text nichts zu suchen.
Beispiel:
Zitat:

ALL rights reserved. Not for broadcast or
transmission of any kind.
DO NOT DUPLICATE. NOT FOR RENTAL.
Zusätzlich arbeite ich "ganz leise im Hintergrund!" an einem Lyric(Karaoke) Display in OpenGL
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

beanbear6 23. Dez 2011 12:48

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;

EWeiss 23. Dez 2011 12:59

AW: TMIDIPlayer2
 
Zitat:

wär das eventuell mit RichText leichter zu lösen??
Denke nicht.
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

musicman56 23. Dez 2011 14:00

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) -

EWeiss 23. Dez 2011 15:08

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

beanbear6 24. Dez 2011 09:28

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

EWeiss 28. Mai 2012 09:57

AW: TMIDIPlayer2
 
Neue version online..

gruss

EWeiss 28. Mai 2012 19:31

AW: TMIDIPlayer2
 
hat sich erst mal erledigt

beanbear6 29. Mai 2012 04:58

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

EWeiss 29. Mai 2012 08:31

AW: TMIDIPlayer2
 
Zitat:

Kann ich da auch Lyrics eines externen Hardware-
Midifile-Players importieren und anzeigen lassen?
Die frage ist was du darunter verstehst.
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

EWeiss 3. Jun 2012 07:18

AW: TMIDIPlayer2
 
Neue Version oben siehe change log

gruss

midijorss 24. Jun 2012 11:20

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:

....

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;
           
...........
I hope, you'll do better than me and your "KaraGL" project supports the standard midifile...

Best regards,
midijor

EWeiss 24. Jun 2012 12:44

AW: TMIDIPlayer2
 
Thanks for the Information
i have added all this by me and silhwan self

see here.

Delphi-Quellcode:
    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;
best regards Emil

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)

midijorss 24. Jun 2012 13:25

AW: TMIDIPlayer2
 
Zitat:

Zitat von EWeiss (Beitrag 1172194)
Thanks for the Information
i have added all this by me and silhwan self

see here.

Delphi-Quellcode:
    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;
best regards Emil

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)

Hi,

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

EWeiss 24. Jun 2012 13:31

AW: TMIDIPlayer2
 
Zitat:

I hope, he publish the source codes on Delphi-PRAXIS forum...
Yes. But not without the consent of Silhwan
to many work for compare instruments from MidiFile to.

sorry

regards

EWeiss 11. Feb 2013 10:36

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

beanbear6 11. Feb 2013 14:58

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)

EWeiss 11. Feb 2013 17:26

AW: TMIDIPlayer2
 
Zitat:

Zitat von beanbear6 (Beitrag 1202897)
Hallo Emil,
wow wow das sind ja herrliche Neuigkeiten!!
Gibt es dann in naher Zukunft eine neue Version
von den MidiComps?
Gruß Reiner
(beanbear6)

Was für neue?
Die sind erst überarbeitet worden.

Um was geht es dir denn genau das du meinst bzw. glaubst eine neue Version zu benötigen.

gruss

EWeiss 13. Feb 2013 10:58

AW: TMIDIPlayer2
 
Kleines update vom 12.2

Delphi-Quellcode:
procedure TMainForm.FormShow(Sender: TObject);
....
ViewChannelForm.ResetFields(true{Reset Device}); // ** Added at 2013-02-12
Archiv aktualisiert.
Zudem noch einige nicht verwendete Variablen und Proceduren entfernt.

gruss

EWeiss 21. Mai 2013 18:20

AW: TMIDIPlayer2
 
Neue Version oben!

TMidiplayer verwendet nun MidiSheetMusic-2.5 als Slave.
Angepasster Quelltext von MidiSheetMusic im Archiv enthalten.

gruss

hathor 21. Mai 2013 19:09

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.

EWeiss 21. Mai 2013 20:35

AW: TMIDIPlayer2
 
Zitat:

Zitat von hathor (Beitrag 1215985)
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.

Ist möglich ;)
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

EWeiss 23. Mai 2013 05:36

AW: TMIDIPlayer2
 
Für die Leute die das projekt verwenden eine kleine korrektur.

Zitat:

There should be a modification to allow position change by mouse click on music sheet
at stopped state.

Delphi-Quellcode:
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
gruss

EWeiss 22. Jun 2013 16:39

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

mm1256 23. Mai 2015 18:38

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.

EWeiss 23. Mai 2015 18:55

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:

Author : Silhwan Hyun (e-mail addr : hyunsh@hanafos.com)

Contibutors
Emil Weiss : Test & Advice for update/debug

Revision History
--------------------------
Ver 0.9.7.1 03 May 2015
- Support Refrain Control (added recorded type TVerseData)

Ver 0.9.7 20 Mar 2015
- Support Verse control :
property VerseCount
function GetVerse(Index: integer): PVerseData;

Ver 0.9.6.3 05 May 2014
- Support data file(*.DAT)

Ver 0.9.6.2 5 Apr 2014
- Fix package conflict with Tnt Unicode Controls VCL
( The referenced unit TntClasses is substituted with TntCollection )

Ver 0.9.6.1 2 Jun 2013
- Bug fix at getting FLyricsTrack

Ver 0.9.6 2 May 2013
- Added property TimeSinature

Ver 0.9.5.1 11 Feb 2013
- Some addtions to accept non-standard Karaoke files and RIFF MIDI Files(*.RMI)
- Bug fix : The value of FIsValid is not set to false if exception occurs at executing
function "GetInfo".
MidiPlayer
Zitat:

Revision History
------------------------------
v0.9.6 (20 Mar 2015)
- Support Repeat playing of defined interval :
function SetRepeatSection, procedure ResetRepeatSection

- Support Repeat playing of Verse :
property RepeatVerse;

- Support instrument assignment per channel :
procedure AssignInstrument, property ForceInst
DatReader und Read_anyEncoded für Unicode

Zitat:

Ist es angedacht, den Player Musikertauglich zu machen?
Kannst ja selber machen Quelltext ist ja vorhanden.
Wenn der Player dir nicht reicht.

gruss

mm1256 23. Mai 2015 22:55

AW: TMIDIPlayer2
 
Zitat:

Zitat von EWeiss (Beitrag 1302819)
Kann auf meinem Rechner die von dir angegebenen Fehler Probleme nicht nachvollziehen.

Welche Soundmodule/Expander und Midi-Schnittstellen verwendest du denn zum Testen? Ich kann die beschriebenen Fehler mit allen mir verfügbaren Midi-Schnittstellen (Motu Micro Lite, E-MU, M-Audio MIDISport 2X2, M-Audio USB Uno) und Expandern/Keyboards (Ketron SD2, Roland SD 50, Roland Integra-7, Korg PA1-X, Korg PA3-X) nachvollziehen. Am Schlimmsten ist es mit dem Integra-7, weil der sehr sensibel auf "verschluckte" SysEx reagiert.

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:

Zitat von EWeiss (Beitrag 1302819)
Zudem gibt es schon eine überholte Version von der Komponente die aber bisher noch nicht veröffentlicht wurde.

Dann werde ich nochmal drüber schaun, wenn das Update da ist.

Bin auch gern bereit, das Update vorab zu testen.

beanbear6 24. Mai 2015 02:34

AW: TMIDIPlayer2
 
Hi Emil,
wann darf man denn mit dem Update rechnen? Find ich ja megatoll!!!
Wird das Update öffentlich gestellt?
Gruß Reiner

EWeiss 24. Mai 2015 07:29

AW: TMIDIPlayer2
 
Zitat:

Welche Soundmodule/Expander und Midi-Schnittstellen verwendest du denn zum Testen? Ich kann die beschriebenen Fehler mit allen mir verfügbaren Midi-Schnittstellen (Motu Micro Lite, E-MU, M-Audio MIDISport 2X2, M-Audio USB Uno) und Expandern/Keyboards (Ketron SD2, Roland SD 50, Roland Integra-7, Korg PA1-X, Korg PA3-X) nachvollziehen. Am Schlimmsten ist es mit dem Integra-7, weil der sehr sensibel auf "verschluckte" SysEx reagiert.

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.
Dann sag das doch deutlich ;)
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:

wann darf man denn mit dem Update rechnen?
Bin mir noch nicht sicher .. arbeite noch dran.

gruss

mm1256 24. Mai 2015 09:38

AW: TMIDIPlayer2
 
Zitat:

Zitat von EWeiss (Beitrag 1302865)
Dann sag das doch deutlich ;)
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....

Bitte entschuldige. Musiker sind manchmal ein etwas seltsames Volk. Sie können sich nur schwer vorstellen, dass ein "Standard User" (wie du ihn bezeichnest) sich mit Midifiles auseinander setzt. Die Böhm kann natürlich nur GM, bzw. es gab als die gebaut wurde ja fast nichts anderes ausser GM und XG von Yamaha. Aber: Hab mal nach der Böhm-Diamant-300-CT gegoogelt. Woooow...ist ein sehr schickes Teil, gefällt mir :thumb:

EWeiss 24. Mai 2015 09:43

AW: TMIDIPlayer2
 
Zitat:

Bitte entschuldige. Musiker sind manchmal ein etwas seltsames Volk.
Warum entschuldigen.. ;)
Bin selbst einer.

Zitat:

Die Böhm kann natürlich nur GM, bzw. es gab als die gebaut wurde ja fast nichts anderes ausser GM und XG von Yamaha.
Gebaut wurde ? Von wem..

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

EWeiss 24. Mai 2015 14:58

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

mm1256 24. Mai 2015 16:13

AW: TMIDIPlayer2
 
Zitat:

Zitat von EWeiss (Beitrag 1302879)
@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.....

Mit den Herstellern hat das Problem eigentlich nichts zu tun. Soweit ich das derzeit einschätzen kann, gibt es beim MidiPlayer2 - so wie bei manch anderen Komponenten auch - Timing-Probleme beim Senden von SysEx. Ob's beim MidiPlayer2 am MidiOut liegt oder beim Abarbeiten der MidiEvents kann ich derzeit auch noch nicht sagen. Ist jedenfalls nicht so einfach zuz finden, denn wenn's einfach wäre, hätte es der Programmierer ja schon anders oder besser gelöst.

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.
Seite 2 von 3     12 3      

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