Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bass.dll: Länge eines Chiptunes ermitteln. (https://www.delphipraxis.net/54848-bass-dll-laenge-eines-chiptunes-ermitteln.html)

Mr Whoopee 12. Okt 2005 13:40


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:
Round(BASS_ChannelBytes2Seconds(mods, BASS_MusicGetLength(mods, True)));
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.
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:
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;
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:
Delphi-Quellcode:
moMusik : Result := round(BASS_ChannelBytes2Seconds(Channel, BASS_MusicGetLength(Channel, True)) * (SpeedinProzent / 100));
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:
Delphi-Quellcode:
procedure TBassdllPlayer.ResetDefaultValues;
var i: integer;
begin
...
  SpeedinProzent := 100;
...
end;
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.

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:

BASS_MusicGetLength

--------------------------------------------------------------------------------

Retrieves the length of a MOD music.

DWORD WINAPI BASS_MusicGetLength(
HMUSIC handle,
BOOL playlen
);


Parameters
handle The MOD music's handle.
playlen The length to retrieve... TRUE = the playback length (in bytes), FALSE = the order length.


Return value
If succesful, then the music's length is returned, else -1 is returned. Use BASS_ErrorGetCode to get the error code.

Error codes
BASS_ERROR_HANDLE handle is not valid.
BASS_ERROR_NOTAVAIL The BASS_MUSIC_CALCLEN flag was not used with BASS_MusicLoad, or the playback length could not be calculated (the music does not end).


Example
To start playback of a MOD music from the beginning of the last order.

DWORD len=BASS_MusicGetLength(music,FALSE); // get length
BASS_ChannelSetPosition(music,MAKELONG(len-1,0)); // seek to last order
BASS_ChannelPlay(music,FALSE); // play



See also
BASS_ChannelBytes2Seconds, BASS_ChannelSetPosition, BASS_MusicLoad

Mr Whoopee 12. Okt 2005 16:46

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.

omata 12. Okt 2005 20:09

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:
  Result:=Format('%.2d:%.2d', [Time div 60, Time mod 60]);
Time kommt von BASS_ChannelBytes2Seconds.

Wieso du da -1 bekommst weiss ich auch nicht.

MfG
Thorsten

TheReaper 12. Okt 2005 21:25

Re: Bass.dll: Länge eines Chiptunes ermitteln.
 
Gruß :hi:

So kriegt man die Zeit in Millisekunden:
Delphi-Quellcode:
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;
Und so die Millisekunden in ein Zeitformat umwandeln:
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;

omata 12. Okt 2005 22:17

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.

Mr Whoopee 13. Okt 2005 00:28

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