![]() |
Bass.dll: Länge eines Chiptunes ermitteln.
Guten Morgen,
ich möchte die Länge eines Chiptunes mithilfe der Bass.dll (von ![]()
Delphi-Quellcode:
So ist beispielsweise der Wert, der mir ausgegeben wird, 24348. Die Länge des Chiptunes ist aber 38 Sekunden. Ich weiß jetzt nicht, wie ich die 24348 in MM:SS umwandeln soll.
Round(BASS_ChannelBytes2Seconds(mods, BASS_MusicGetLength(mods, True)));
Ich habe nach diesem Problem hier auch schon gesucht und bin auf den TBassDLLPlayer gestoßen. Da habe ich mir den SourceCode mal angeschaut und habe diese Funktion gefunden:
Delphi-Quellcode:
Da ich nur Chiptunes abspiele, wird nur dieser Teil benötigt, was ja im endeffekt, angepasst an meine Variablen, das gleiche ist, wie mein SourceCode:
var SpeedinProzent: Integer;
... function TBassdllPlayer.GetSongLength: integer; begin Result := 0; Case Modus of moSamples: Result := round(BASS_ChannelBytes2Seconds(Channel, BASS_StreamGetLength(Channel))); moMusik : Result := round(BASS_ChannelBytes2Seconds(Channel, BASS_MusicGetLength(Channel, True)) * (SpeedinProzent / 100)); end; end;
Delphi-Quellcode:
Das einzige, was hier noch zusätzlich eingeführt wurde ist die SpeedinProzent-Variable, die aber (ersichtlich aus dem weiteren Quelltext) standardmäßig auf 100 gesetzt werden sollte:
moMusik : Result := round(BASS_ChannelBytes2Seconds(Channel, BASS_MusicGetLength(Channel, True)) * (SpeedinProzent / 100));
Delphi-Quellcode:
Wenn die also 100 ist, dann wäre (SpeedinProzent / 100)=1 und 1*round(BASS_ChannelBytes2Seconds(Channel, BASS_MusicGetLength(Channel, True)) auch wieder das gleiche Ergebnis, was ich auch schon habe.
procedure TBassdllPlayer.ResetDefaultValues;
var i: integer; begin ... SpeedinProzent := 100; ... end; Kann mir jetzt jemand sagen, wie ich nun die Länge in MM:SS bekomme? Danke, Whoopee EDIT: Die Doku der DLL sagt wie man die Länge bekommt, aber nicht, wie man sie umrechnet :/. Zitat:
|
Re: Bass.dll: Länge eines Chiptunes ermitteln.
Hm.. jetzt habe ich einfach mal das BASS_ChannelBytes2Seconds() weggenommen und ich erhalte -1. In der Doku steht: "If succesful, then the music's length is returned, else -1 is returned. Use BASS_ErrorGetCode to get the error code.". Also habe ich in den ErrorCodes nachgeschaut und folgendes festgestellt: BASS_ERROR_NOTAVAIL = 37; // requested data is not available.
Das hilft mir aber auch nicht großartig weiter :D. |
Re: Bass.dll: Länge eines Chiptunes ermitteln.
Also, wenn du noch etwas weiter gelesen hättest, dann hättest du vielleicht auch die BassPlayerEx-Komponente entdeckt. Dort habe ich diese Umrechnung gleich mit eingebaut.
Delphi-Quellcode:
Time kommt von BASS_ChannelBytes2Seconds.
Result:=Format('%.2d:%.2d', [Time div 60, Time mod 60]);
Wieso du da -1 bekommst weiss ich auch nicht. MfG Thorsten |
Re: Bass.dll: Länge eines Chiptunes ermitteln.
Gruß :hi:
So kriegt man die Zeit in Millisekunden:
Delphi-Quellcode:
Und so die Millisekunden in ein Zeitformat umwandeln:
Function GetSongLen : Integer;
var MilliSec : Integer; FloatPos : FLOAT; begin FloatPos := BASS_ChannelBytes2Seconds(CurStream, BASS_ChannelGetLength(CurStream)); MilliSec := Trunc(1000 * FloatPos); if MilliSec < 0 then MilliSec := 0; result := MilliSec; //für Sekunden div 1000 end;
Delphi-Quellcode:
Function MSecToStr(Milliseconds : Int64) : String;
var H, M, S : integer; begin Result:=''; Milliseconds:=trunc(Milliseconds/1000); H := Milliseconds div 3600; M := (Milliseconds mod 3600) div 60; S := (Milliseconds mod 3600) mod 60; if H>0 then Result:=Format('%d:%2.2d:%2.2d', [H, M, S]) //HH:MM:SS else Result:=Format('%2.2d:%2.2d', [M, S]); //MM:SS end; |
Re: Bass.dll: Länge eines Chiptunes ermitteln.
Super, danke für den Hinweis.
Thorsten PS: Dies findet sich auch alles in der BassPlayerEx-Komponente. |
Re: Bass.dll: Länge eines Chiptunes ermitteln.
Liste der Anhänge anzeigen (Anzahl: 1)
TheReaper: danke für den Quelltext :). Nur geht das leider immer noch nicht so, wie ich mir das denke. Da ich nur mit der bass.dll arbeiten will, musste ich den Code etwas abändern:
BASS_ChannelBytes2Seconds(CurStream, BASS_ChannelGetLength(CurStream)); --> BASS_ChannelBytes2Seconds(mods, BASS_MusicGetLength(mods, True)); Das war's auch eigentlich schon. Ich habe mal ein SourceBSP hier als Anhang beigelegt.. evtl. kann ja jemand etwas damit anfangen :>. Whoopee :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:48 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