AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TMIDIPlayer2

TMIDIPlayer2

Ein Thema von EWeiss · begonnen am 6. Jun 2011 · letzter Beitrag vom 22. Jun 2013
Antwort Antwort
Seite 6 von 8   « Erste     456 78   
Benutzerbild von EWeiss
EWeiss
Registriert seit: 16. Okt 2010
Delphi unit MIDIFile2.pas, MidiPlayer2.pas and Instrument.pas
Copyright Silhwan Hyun. All rights reserved.

These units are free. It may be used both in commercial and non-commercial software either in original or in modified form.
The units can be freely distributed in any way and by any means provided this copyright notice is preserved.


Disclaimer :
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESSED
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
THE USE OR OTHER DEALINGS IN THE SOFTWARE.

----------------------------------------------------------------------
v1.1 (02 Jun 2012) "ShowMIDILyrics"
- Put a reasonable space between characters.
- Fixed artifact bugs.

Ver 0.9.41 (02 Jun 2012) "MIDITest"
- The enabled state of VolumeBar is depends on the VolumeAdjustable property of TMIDIPlayer2
- Added a sub-form to adjust tempo & pitch.
- Added a TMemo to display sync lyrics
- Removed a TCheckBox for mute control (=> it may be not effective if we use a synthesizer
other than Microsoft MIDI Mapper or Microsoft Wavetable Synth)
- Added sync lyrics Window Gdi+
- Added Multilanguage support
-------------------------------------
Ver 0.9.51 (11 Feb 2013) kMIDIPlayer
Neuigkeiten und Changelog siehe im Header MIDIFile2 und MidiPlayer2.pas
-------------------------------------
Ver 0.9.52 (19 May 2013) kMIDIPlayer
- Bug fix : gets incorrect value of CurrentTime or CurrentPos just after reposition.
(= errors at procedures of TMidiPlayer2 : SetCurrentTime, SetCurrentTime)
- Changed to process Program change event at procedure TMidiDriver.ProcessEvent,
* Needed to set proper program if first playing starts at middle of music.

gruss
Miniaturansicht angehängter Grafiken
21.05.jpg  
Angehängte Dateien
Dateityp: rar MIDIPlayer_w_MusicSheet.rar (2,92 MB, 37x aufgerufen)
Dateityp: txt Revision_Notification.txt (13,3 KB, 17x aufgerufen)

Geändert von EWeiss (22. Jun 2013 um 17:30 Uhr)
 
musicman56
 
#51
  Alt 23. Dez 2011, 15:00
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) -

Geändert von musicman56 (23. Dez 2011 um 15:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss
 
#52
  Alt 23. Dez 2011, 16:08
Die aktuelle Textposition ermittle ich (OpenGL) über das Elapsed Event also zu welcher zeit der Text geschrieben wird.
Die Procedure

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
  Mit Zitat antworten Zitat
beanbear6

 
Delphi 7 Enterprise
 
#53
  Alt 24. Dez 2011, 10:28
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
Miniaturansicht angehängter Grafiken
bild.jpg  
Reiner
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss
 
#54
  Alt 28. Mai 2012, 10:57
Neue version online..

gruss
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss
 
#55
  Alt 28. Mai 2012, 20:31
hat sich erst mal erledigt

Geändert von EWeiss (30. Mai 2012 um 13:59 Uhr)
  Mit Zitat antworten Zitat
beanbear6

 
Delphi 7 Enterprise
 
#56
  Alt 29. Mai 2012, 05:58
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
Reiner
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss
 
#57
  Alt 29. Mai 2012, 09:31
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

Geändert von EWeiss (29. Mai 2012 um 10:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss
 
#58
  Alt 3. Jun 2012, 08:18
Neue Version oben siehe change log

gruss
  Mit Zitat antworten Zitat
midijorss
 
#59
  Alt 24. Jun 2012, 12:20
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

Geändert von midijorss (24. Jun 2012 um 12:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss
 
#60
  Alt 24. Jun 2012, 13:44
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 = 'Wordsthen
                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)
Miniaturansicht angehängter Grafiken
24.06.jpg  

Geändert von EWeiss (24. Jun 2012 um 14:00 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf