Bass.dll: Länge eines Chiptunes ermitteln.
Guten Morgen,
ich möchte die Länge eines Chiptunes mithilfe der Bass.dll (von un4seen) ermitteln. Ich bin jetzt soweit, dass er mir irgendeine Zahl ausgibt, mit der ich nichts anfangen kann:
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 23:38 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