AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bass.dll: Länge eines Chiptunes ermitteln.
Thema durchsuchen
Ansicht
Themen-Optionen

Bass.dll: Länge eines Chiptunes ermitteln.

Ein Thema von Mr Whoopee · begonnen am 12. Okt 2005 · letzter Beitrag vom 13. Okt 2005
Antwort Antwort
Mr Whoopee

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

Bass.dll: Länge eines Chiptunes ermitteln.

  Alt 12. Okt 2005, 14: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
Mr Whoopee

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

Re: Bass.dll: Länge eines Chiptunes ermitteln.

  Alt 12. Okt 2005, 17:46
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 .
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Bass.dll: Länge eines Chiptunes ermitteln.

  Alt 12. Okt 2005, 21:09
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.

  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
  Mit Zitat antworten Zitat
TheReaper

Registriert seit: 27. Feb 2003
Ort: chemnitz
90 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Bass.dll: Länge eines Chiptunes ermitteln.

  Alt 12. Okt 2005, 22:25
Gruß

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;
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Bass.dll: Länge eines Chiptunes ermitteln.

  Alt 12. Okt 2005, 23:17
Super, danke für den Hinweis.

Thorsten



PS: Dies findet sich auch alles in der BassPlayerEx-Komponente.
  Mit Zitat antworten Zitat
Mr Whoopee

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

Re: Bass.dll: Länge eines Chiptunes ermitteln.

  Alt 13. Okt 2005, 01:28
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
Angehängte Dateien
Dateityp: rar bass.dll_200.rar (101,5 KB, 40x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 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