AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Timing problem

Ein Thema von EWeiss · begonnen am 7. Apr 2011 · letzter Beitrag vom 8. Apr 2011
Antwort Antwort
Seite 4 von 7   « Erste     234 56     Letzte »    
Benutzerbild von Trebxson
Trebxson

Registriert seit: 7. Apr 2011
18 Beiträge
 
Turbo Delphi für Win32
 
#31

AW: Timing problem

  Alt 8. Apr 2011, 02:07
> EDit:
> Forte 180.00EUR Euronen ..

Leider... ich habe daher auch nur die Free-Version. Aber auch in dieser kann man Fenster durch die Gegend bewegen während die Musik spielt. Ich vermute jedoch die Nutzen den Miditreiber für solche Spielchen.
  Mit Zitat antworten Zitat
Benutzerbild von Trebxson
Trebxson

Registriert seit: 7. Apr 2011
18 Beiträge
 
Turbo Delphi für Win32
 
#32

AW: Timing problem

  Alt 8. Apr 2011, 02:15
Ach, ich sehe gerade. Du hast derzeit nur eine Spur und stellst damit eine Klaviatur dar. Ist auch eine Idee. Ich dachte erst die schwarzen und weißen Linien sind bereits die Spuren und sind nur zur optischen Kennung eingefärbt.

Was machst du wenn eine zweite Spur hinzukommen soll? Zum Beispiel ein zweites Instrument?

Dann wäre es doch praktisch, wenn es sie mal geben sollte, den Grafik- und Tonthread einfach mit anderen Parametern zu starten?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#33

AW: Timing problem

  Alt 8. Apr 2011, 02:16
Jo ist schade

Delphi-Quellcode:
  if PlayX > SongLength then
  begin
    PlayingSong := False;
    SKAERO_SetCTLText(SKAERO_GetMainItem(MainHandle, ID_PLAY), 'Play');
  end;
der loop wird deaktiviert wenn die Abtastleiste in DrawGraphics das Ende der Songlänge erreicht hat
die vorher mit FindEndOfSong ermittelt wurde.

So wie es aussieht komme ich nicht drumherum die Anwendung nach PostQuitMessage(0) mit Halt; zu beenden.

Das der Song anhält ist normal wenn das Fenster verschoben wird darum ja auch Winprosessmessages damit
die anderen Threads weiterarbeiten können.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#34

AW: Timing problem

  Alt 8. Apr 2011, 02:17
Ach, ich sehe gerade. Du hast derzeit nur eine Spur und stellst damit eine Klaviatur dar. Ist auch eine Idee. Ich dachte erst die schwarzen und weißen Linien sind bereits die Spuren und sind nur zur optischen Kennung eingefärbt.

Was machst du wenn eine zweite Spur hinzukommen soll? Zum Beispiel ein zweites Instrument?

Dann wäre es doch praktisch, wenn es sie mal geben sollte, den Grafik- und Tonthread einfach mit anderen Parametern zu starten?
Nein ich habe 8 Spuren
Jede Farbe auf den linken Bunten Button (EditButton) repräsentieren eine Spur

Und jeder kannst du ein Instrument zuordnen aus der Bank ..
Die mußt du allerdings erst füllen.

Instrument aus der Bank auswählen Shift drücken und dann einen der Speicherplätze anklicken.
Danach ist das Instrument gespeichert.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Trebxson
Trebxson

Registriert seit: 7. Apr 2011
18 Beiträge
 
Turbo Delphi für Win32
 
#35

AW: Timing problem

  Alt 8. Apr 2011, 02:24
Delphi-Quellcode:
procedure WinProcessMessages;
var
  ProcMsg: TMsg;
begin
  while PeekMessage(ProcMsg, 0, 0, 0, PM_REMOVE) do
  begin
    if (ProcMsg.message = WM_QUIT) then
      Exit;
    TranslateMessage(ProcMsg);
    DispatchMessage(ProcMsg);
  end;
end;

  // Starte den Song
  while PlayingSong do
  begin
    //Weiterlaufen bis die 16.tel Note (Pause) abgelaufen ist
    while GetTickCount < Tick + TempoWait do
      Winprocessmessages;
  ...
Mit exit beendest du ja auch nur die Ausführung der Funktion. Die while PlayingSong do-Schleife wertet das Ergebnis der Nachrichtenbehandlung nicht aus. D.h. die rennt ungestört weiter...
Rückgabewert? Oder gleich ein PlayingSong := false? kA welche Sichtbarkeit deine Variablen haben.

Nebenbei: Was passiert überhaupt wenn deine Anwendung Musik abspielt und etwas anderes (viel anderes bei Mehrkern) lastet dein System übermäßig aus?

Achso, ich mach dann erstmal Feierabend 8 Spuren? Du überrascht schon wieder...

Und noch was weil ich es gerade sehe... du solltest solche Sachen wie DrawGraphics(WinHandle); nicht während des Herunterfahren der Anwendung ausführen. Und Halt wird dir vermutlich Speicherlecks bescheren...

Geändert von Trebxson ( 8. Apr 2011 um 02:30 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#36

AW: Timing problem

  Alt 8. Apr 2011, 02:28
Nein die rennt nicht ungestört weiter die beendet wenn die letzte note gespielt wurde.

Delphi-Quellcode:
procedure TMidiTracker.PlaySong(WinHandle: HWND);
var
  IntA: integer;

begin
  // Verschieb den Grid Ausschnitt wenn die Rote Laufleiste nicht
  // auf dem Grid sichtbar ist
  if (ColumnX < StartX) or (ColumnX > StartX + XSize) then
  begin
    StartX := ColumnX;
    EndX := StartX + XSize;

    if StartX > 999 - XSize then
    begin
      StartX := 999 - XSize;
      EndX := 999;
    end;
  end;

  // Starte das Spielen von der roten Laufleisten position
  PlayX := ColumnX;
  GetColumn(WinHandle, StartX);
  hsi.nPos := StartX + XSizeMid;
  HasStarted := False;
  JustScrolled := False;

  DrawGrid(WinHandle);

  // Reset die alte Note und die alte Instrumenten Variablen
  for IntA := 0 to 7 do
  begin
    OldNote[IntA] := -1;
    OldInst[IntA] := -1;
  end;

  // Nach dem Ende des Songs suchen
  FindEndOfSong;

  Tick := GetTickCount;

  // Starte den Song
  while PlayingSong do
  begin
    //Weiterlaufen bis die 16.tel Note (Pause) abgelaufen ist
    while GetTickCount < Tick + TempoWait do
      Winprocessmessages;

    Tick := GetTickCount;
    PlayNotes;
    DrawGraphics(WinHandle);
    hsi.nPos := StartX + XSizeMid;
    SetScrollInfo(WinHandle, SB_HORZ, hsi, True);
  end;

  // Warte auf die Beendigung der Wiedergabe von der letzten 16.tel Note
  while GetTickCount < Tick + TempoWait do
    Winprocessmessages;

  // Alle Noten Stoppen
  for IntA := 0 to 7 do
  begin
    if SKAERO_GetCheckButtonStatus(SKAERO_GetMainItem(MainHandle,
      IntA + ID_HIDETRACK_FIRST)) = False then
    begin
      channel := IntA;
      if OldNote[IntA] > -1 then
        FlipStopNote(OldNote[IntA] mod 1000);
    end;
  end;

  hsi.nPos := 0;
  hsi.nTrackPos := 0;
  StartX := 0;
  SetScrollInfo(WinHandle, SB_HORZ, hsi, True);
  DrawGrid(WinHandle);

end;
Das funktioniert und arbeite einwandfrei nach dem ich auf den Stop Button klicke
oder der Song zu ende ist.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Trebxson
Trebxson

Registriert seit: 7. Apr 2011
18 Beiträge
 
Turbo Delphi für Win32
 
#37

AW: Timing problem

  Alt 8. Apr 2011, 02:36
> Nein die rennt nicht ungestört weiter die beendet wenn die letzte note gespielt wurde.

Es ging doch aber ums Beenden der Anwendung (während gespielt wird) Nacht!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#38

AW: Timing problem

  Alt 8. Apr 2011, 02:37
Zitat:
nicht während des Herunterfahren der Anwendung ausführen. Und Halt wird dir vermutlich Speicherlecks bescheren...
Darum geht es doch
Wie soll ich das verhindern wenn ich nicht rechtzeitig bzw.. den loop beenden kann
bevor ich die Anwendung Herunterfahre.

Genau das ist mein Problem das meine Anwendung hängt und ich sie nicht beenden kann.


Zitat:
Es ging doch aber ums Beenden der Anwendung (während gespielt wird) Nacht!
Korrekt .. Nacht!

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#39

AW: Timing problem

  Alt 8. Apr 2011, 07:41
Wenn ich mein Window verschiebe hält der Song an.
Richtig weil dann dein Thread die Nachrichtenschleife abarbeitet und da stehe eben jede Menge Nachrichten zum Neuzeichnen an.
Diese werden doch alle abgearbeitet? (direkt vor der kurzen Pause)

Da alles im Hauptthread abläuft, kann wärend der Zeit der Schleife Pause vom Programm auch keine neue Nachricht erzeugt werden.
Und Benutzereingaben des Benutzers werden innerhalb von maximal 62 Millisekunden abgehandelt. Für den Benutzer sollte diese Verzögerung fast garnicht auffallen.

Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#40

AW: Timing problem

  Alt 8. Apr 2011, 10:15
Du könntest mal die Delay-Funktion(en) aus der CodeLib probieren, wobei du erstere natürlich auf NonVCL umschreiben musst, was aber kein großes Problem sein sollte.

Ob das Timing präzise genug ist, um Musik damit abzuspielen, musst du ausprobieren.
Delphi-Quellcode:
procedure Delay(msecs: Longint);
var
  targettime: Longint;
  Msg: TMsg;
begin
  targettime := GetTickCount + msecs;
  while targettime > GetTickCount do
    if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
    begin
      if Msg.message = WM_QUIT then
      begin
        PostQuitMessage(Msg.wParam);
        Break;
      end;
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end;
Macht fast genau das gleiche wie ich es eh schon verwende

gruss
Hagens Variante aber nicht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 7   « Erste     234 56     Letzte »    


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 21:06 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