AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TMIDIPlayerComp
Thema durchsuchen
Ansicht
Themen-Optionen

TMIDIPlayerComp

Ein Thema von EWeiss · begonnen am 6. Jun 2011 · letzter Beitrag vom 5. Feb 2016
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: TMIDIPlayer2

  Alt 24. Mai 2015, 07:29
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

Geändert von EWeiss (24. Mai 2015 um 08:57 Uhr)
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: TMIDIPlayer2

  Alt 24. Mai 2015, 09:38
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
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: TMIDIPlayer2

  Alt 24. Mai 2015, 09:43
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

Geändert von EWeiss (24. Mai 2015 um 10:11 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: TMIDIPlayer2

  Alt 24. Mai 2015, 14:58
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

Geändert von EWeiss (24. Mai 2015 um 15:22 Uhr)
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: TMIDIPlayer2

  Alt 24. Mai 2015, 16:13
@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
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: TMIDIPlayer2

  Alt 24. Mai 2015, 16:17
Zitat:
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.
Deshalb werden die SysEx Befehle ja auch in den Pausen übertragen.

Zitat:
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
Wie du zeit hast.
Bedenke das ist ein Freeware Projekt ist also nicht ausgelegt für den Professionellen Bereich.
Und nein ich möchte mir das nicht antun meine Zeit (gegen Bares) in das Projekt zu stecken es würde sich einfach nicht lohnen.
Ich ändere etwas dran wenn ich zeit finde oder Lust dazu habe das soll nicht in MÜSSEN ausarten


gruss

Geändert von EWeiss (24. Mai 2015 um 16:21 Uhr)
  Mit Zitat antworten Zitat
wolfmusic

Registriert seit: 19. Feb 2012
Ort: Tschechische Republik
1 Beiträge
 
#7

AW: TMIDIPlayer2 SysEx

  Alt 30. Mai 2015, 17:48
Hallo, sorry für mein Deutsch übersetzt mit Google Trans.

Ich hatte auch Probleme mit den SysEx und ich schaffte es, durch Änderung der Code TMidiPlayer2.pas beheben. Ich bin kein professioneller Programmierer, aber jetzt SysEx-Funktion.
Ich lege Bearbeitungsverfahren TMidiDriver.DoOnMidiTimer.
Ich habe Änderungen in Version 0.9.5.1 durchgeführt. Sicher wird es auch in den folgenden Versionen.
Änderungen werden durch (****** JV *****) hervorgehoben.

Einen schönen Tag noch.

wolfmusic

Modifizierten Code:

Delphi-Quellcode:
procedure TMidiDriver.DoOnMidiTimer;
var
(****************************JV ******************************************)
  i, n: Integer;
(****************************JV ******************************************)
  TickTime: LongWord;
  DeltaTime: LongWord;
  AMidiTrack: TMidiTrack;
  pEvent: pMidiEvent;
  EventCode: byte;
  ChannelNo: byte;
  ActiveNoteRemains: boolean;
  OutNote: byte;
  EventPositon: LongWord;
  (****************************JV ******************************************)
  SysExJv: array of Byte; (*Word*)
  (****************************JV ******************************************)
begin
  if not Assigned(MidiFile) then Exit;

  TickTime := GetTickCount;
  if LastOutputTime = 0 then
  begin
    DeltaTime := TickTime - FStartTime;
    FCurrentTime := round(DeltaTime * FSpeed);
  end else
  begin
    DeltaTime := TickTime - LastOutputTime;
    FCurrentTime := FCurrentTime + round(DeltaTime * FSpeed);
  end;
  LastOutputTime := TickTime;
  FCurrentPos := MidiFile.Time2TickPos(FCurrentTime);

// I have found a MIDI file which does not have the end of track mark.
// Following sentences are for the case to stop playing forcibly.
  if FCurrentTime > (MidiFile.Duration + 300) then
  begin
    Suspend := true; // to prohibit calling DoOnMidiTimer in PlayThread
    if FStepMode then
      SendMessage(FPlayerHandle, WM_MIDI_EndOfTrack, 0, 1)
    else
      PostMessage(FPlayerHandle, WM_MIDI_EndOfTrack, 0, 1);
    exit;
  end;

  for i := 0 to MidiFile.TrackCount - 1 do
  begin
    AMidiTrack := MidiFile.GetTrack(i);
    if not AMidiTrack.EndOfTrack then
      with AMidiTrack do
      begin
        while (AMidiTrack.PlayPos < AMidiTrack.EventCount) do
        begin
          pEvent := GetEvent(PlayPos);
          EventPositon := pEvent^.Positon;
          if (Round(FCurrentPos) <= EventPositon) then
            break;
          if PEvent.Event = $FF then
            ProcessEvent(i, pEvent)
          else if AMidiTrack.Active then
          begin
            EventCode := pEvent^.Event and $F0;
            ChannelNo := pEvent^.Event and $0F;
            if pEvent^.Msg = 'then // Not a System Exclusive Message ?
            begin
              ActiveNoteRemains := IsActiveNote(ChannelNo);
            // The note number for drum channel defines the different percussion instruments,
            // So, we should not change that.
              if ChannelNo = DrumChannel then // Drum channel ?
                OutNote := pEvent^.Data1
            // Output the adjusted note number for the Note On, Note Off and Note Aftertouch Events
            // by FPitch value.
              else if (EventCode = $80) or (EventCode = $90) or (EventCode = $A0) then
              begin
                OutNote := pEvent^.Data1 + FPitch;
                if (EventCode = $80) or ((EventCode = $90) and (pEvent^.Data2 = 0)) then
                begin
                  if FChannelState[ChannelNo] then
                    DeleteConvRecord(pEvent^.Event and $0F, pEvent^.Data1, OutNote)
                end else if FChannelState[ChannelNo] then
                  AddConvRecord(pEvent^.Event and $0F, pEvent^.Data1, OutNote);
              end else
                OutNote := pEvent^.Data1;

              if FChannelState[ChannelNo] then
                MidiOut.PutShort(pEvent^.Event, OutNote, pEvent^.Data2)
              else begin
                if ActiveNoteRemains then
                begin
                // $B0 + ChannelNo : Control change, 123 : All Notes Off
                  MidiOut.PutShort($B0 + ChannelNo, 123, pEvent^.Data2);
                  ClearChannelRecord(ChannelNo);
                end;
              // Activate following 2 lines if we want to process Control change messages and
              // Program change messages regardless of channel's On/Off state.
                if (EventCode = $B0) or (EventCode = $C0) then
                  MidiOut.PutShort(pEvent^.Event, pEvent^.Data1, pEvent^.Data2);
              end;
            end else if (not NoExclusiveMsg) then
             // if FChannelState[ChannelNo] then
(********************************************JV ******************************************)
            // original MidiOut.PutLong(pAnsiChar(pEvent^.Msg), Length(pEvent^.Msg));

               if (EventCode = $F0) and (pEvent^.Msg <> '') then
               {if pEvent^.Msg <> '' then}
                 begin
                   SetLength(SysExJv, 0);
                   SetLength(SysExJv, Length(pEvent^.Msg) + 1);
                   SysExJv[0]:= $F0;
                   for n:= 0 to Length(pEvent^.Msg) - 1 do
                      begin
                        SysExJv[N + 1]:= Byte(pEvent^.Msg[N + 1]);
                      end;
                   MidiOut.PutLong(@SysExJv[0], Length(SysExJv));
                 end;
(********************************************JV ******************************************)
           // if FChannelState[ChannelNo] then
            if FChannelState[ChannelNo] or (pEvent^.Msg <> '') or (EventCode = $B0)
              or (EventCode = $C0) then
              if FStepMode then
                SendMessage(FPlayerHandle, WM_MIDI_Event, i, integer(pEvent))
              else
                PostMessage(FPlayerHandle, WM_MIDI_Event, i, integer(pEvent));
          end;
        // Messages for meta event are posted in the procedure ProcessEvent.
         { if FStepMode then
            SendMessage(FPlayerHandle, WM_MIDI_Event, i, integer(pEvent))
          else
            PostMessage(FPlayerHandle, WM_MIDI_Event, i, integer(pEvent));  }

          PlayPos := PlayPos + 1;
        end;
      end;
  end;

  if FStepMode then
    SendMessage(FPlayerHandle, WM_MIDI_PosUpdate, FCurrentTime, FCurrentPos)
  else
    PostMessage(FPlayerHandle, WM_MIDI_PosUpdate, FCurrentTime, FCurrentPos);
end;
Angehängte Dateien
Dateityp: txt TMidiDriver.DoOnMidiTimer.txt (5,8 KB, 14x aufgerufen)

Geändert von wolfmusic (31. Mai 2015 um 09:54 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 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