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