![]() |
AW: Timing problem
> 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. |
AW: Timing problem
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? |
AW: Timing problem
Jo ist schade ;)
Delphi-Quellcode:
der loop wird deaktiviert wenn die Abtastleiste in DrawGraphics das Ende der Songlänge erreicht hat
if PlayX > SongLength then
begin PlayingSong := False; SKAERO_SetCTLText(SKAERO_GetMainItem(MainHandle, ID_PLAY), 'Play'); end; 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 |
AW: Timing problem
Zitat:
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 |
AW: Timing problem
Delphi-Quellcode:
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...
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; ... 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... |
AW: Timing problem
Nein die rennt nicht ungestört weiter die beendet wenn die letzte note gespielt wurde.
Delphi-Quellcode:
Das funktioniert und arbeite einwandfrei nach dem ich auf den Stop Button klicke
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; oder der Song zu ende ist. gruss |
AW: Timing problem
> 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! |
AW: Timing problem
Zitat:
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:
gruss |
AW: Timing problem
Zitat:
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. :gruebel: |
AW: Timing problem
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:44 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