Einzelnen Beitrag anzeigen

Mr Whoopee

Registriert seit: 28. Jun 2004
73 Beiträge
 
#1

Bass.dll: Länge eines Chiptunes ermitteln.

  Alt 12. Okt 2005, 13:40
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
  Mit Zitat antworten Zitat