Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Bass] Musik langsamer abspielen (https://www.delphipraxis.net/135987-%5Bbass%5D-musik-langsamer-abspielen.html)

WorstNightmare 21. Jun 2009 17:29


[Bass] Musik langsamer abspielen
 
Hallo,
ich versuche gerade mittels Bass.dll eine Wavedatei langsam abzuspielen, denn normalerweise ist sie viel zu schnell.

Mein Ansatz:
Delphi-Quellcode:
var
  FS: TFileStream;
  MS: TMemoryStream;
  CH: HCHANNEL;
begin
  FS := TFileStream.Create('E:\vgmstream\dump.wav', fmOpenRead);
  MS := TMemoryStream.Create;
  try
    MS.CopyFrom(FS, 0);
  finally
    FS.Free;
  end;

  CH := BASS_StreamCreateFile(True, MS.Memory, 0, MS.Size, 0);

  if BASS_ChannelSetAttribute(CH, BASS_ATTRIB_TEMPO, 3.2) then
    Showmessage('success')
  else
    Showmessage(IntToStr(Bass_ErrorGetCode));

  Bass_ChannelPlay(Ch, True);
  MS.Free;
BASS_ATTRIB_TEMPO ist in BASS_FX.pas deklariert; muss ich da vielleicht vorher noch irgendwas laden/setzen?
Es kommt immer Fehler 19 -> Illegaler Typ

omata 21. Jun 2009 17:42

Re: [Bass] Musik langsamer abspielen
 
Zitat:

Zitat von WorstNightmare
Es kommt immer Fehler 19 -> Illegaler Typ

Wann kommt dieser Fehler?
Beim Kompilieren oder beim Ausführen?
Welche Zeile genau?

Gausi 21. Jun 2009 17:46

Re: [Bass] Musik langsamer abspielen
 
Soweit ich weiß, muss man dafür den Channel erstmal umbauen. Nach dem CH := CreateFile muss da noch zusätzlich ein TempoCreate dazu:
Delphi-Quellcode:
// ...
CH := BASS_StreamCreateFile(True, MS.Memory, 0, MS.Size, 0);
Ch := BASS_FX_TempoCreate(Ch, BASS_FX_FREERESSOURCE);
// ...
Dann sollte es klappen.

WorstNightmare 21. Jun 2009 17:51

Re: [Bass] Musik langsamer abspielen
 
Mh, beim BASS_FX_TempoCreate kommt Fehler 4000 - Not a decoding channel.

@omata: Das ist der Bass-Errorcode.

Gausi 21. Jun 2009 17:54

Re: [Bass] Musik langsamer abspielen
 
Dann erstell zuerst einen Decoding-Stream, dazu den letzten Parameter auf BASS_STREAM_DECODE setzen.
Delphi-Quellcode:
CH := BASS_StreamCreateFile(True, MS.Memory, 0, MS.Size, BASS_STREAM_DECODE);
Ch := BASS_FX_TempoCreate(Ch, BASS_FX_FREERESSOURCE);

omata 21. Jun 2009 17:59

Re: [Bass] Musik langsamer abspielen
 
Versuch mal folgendes...
Delphi-Quellcode:
var
  FS: TFileStream;
  MS: TMemoryStream;
  CH: HCHANNEL;
begin
  FS := TFileStream.Create('E:\vgmstream\dump.wav', fmOpenRead);
  MS := TMemoryStream.Create;
  try
    MS.CopyFrom(FS, 0);

    MS.Position := 0;
    CH := BASS_StreamCreateFile(
      True, MS.Memory, 0, MS.Size,
      BASS_STREAM_DECODE or BASS_STREAM_PRESCAN
    );

    CH := BASS_FX_TempoCreate(CH, BASS_FX_FREESOURCE);

    Bass_ChannelPlay(CH, True);
    BASS_FX_TempoSet(CH, -10, 0, -100);
  finally
    FS.Free;
    MS.Free;
  end;
end;

WorstNightmare 21. Jun 2009 18:04

Re: [Bass] Musik langsamer abspielen
 
OK, jetzt geht es zwar, aber es ist immer noch viel zu schnell.

Delphi-Quellcode:
  if not BASS_ChannelSetAttribute(CH, BASS_ATTRIB_TEMPO, -100.0) then
    Showmessage(IntToStr(Bass_ErrorGetCode));
Die WAVE-Datei wurde aus einem Spiel extrahiert. Dort lag sie in einem speziellen Format vor, welches in PCM konvertiert wurde. So ist die Wave-Datei 2 Sekunden lang, obwohl es sonst ~4 sind.

@omata: BASS_FX_TempoSet gibt es bei mir nicht.

Gausi 21. Jun 2009 18:08

Re: [Bass] Musik langsamer abspielen
 
Dann bau halt nur meine beiden Zeilen ein, und nimm ansonsten deinen Code. ;-)

Oder klappt das auch nicht? :gruebel:

WorstNightmare 21. Jun 2009 18:10

Re: [Bass] Musik langsamer abspielen
 
Genau das hab ich auch gemacht und es kommt kein Fehler mehr, aber es ist immer noch zu schnell, und noch kleiner kann ich den Tempowert nicht machen (dann kommt Fehler 20 - Illegaler Parameter) :wink:

Gausi 21. Jun 2009 18:15

Re: [Bass] Musik langsamer abspielen
 
Brauchst du denn auch die schnelle Version der Datei? Dann sonst würde ich die mal mit nem Wave-Editor behandeln. Denn dieses Tempo-Zeugs ist auch nicht grade schön für die Performance. ;-)

WorstNightmare 21. Jun 2009 18:17

Re: [Bass] Musik langsamer abspielen
 
Mhh, eigentlich wollte ich es dynamisch haben, d.h. die Datei wird extrahiert, konvertiert und dann direkt abgespielt, ohne dass sie vorher extern bearbeitet werden muss.
Die Performance spielt bei so einer geringen Datenmenge denke ich keine große Rolle.

Edit:
Ich habe meiner Schwester die Datei mal gegeben - sie arbeitet viel mit Sony Vegas und sagte mir, sie könne sie vielleicht richtig biegen. Also hat sie sie in Sony Vegas importiert, STRG gedrückt (damit der Ton verlängert, nicht verdoppelt wird), die Tonspur länger gezogen. Dann hörte es sich immer noch quietschig an. In den Eigenschaften der Tonspur hat sie bei "Tonhöhenrand" einen Haken bei "Auf Stretch fixieren" gemacht und tada - es hörte sich wie im Original an.
Kann man sowas auch mit Delphi hinbekommen? :(

Wishmaster 21. Jun 2009 22:44

Re: [Bass] Musik langsamer abspielen
 
Hi

aus reiner Neugier hast du alle Tempo Optionen ausprobiert? Ich habe kaum Erfahrung mit der bass_fx.dll

Delphi-Quellcode:
BASS_ATTRIB_TEMPO
BASS_ATTRIB_TEMPO_OPTION_USE_AA_FILTER
BASS_ATTRIB_TEMPO_OPTION_AA_FILTER_LENGTH
BASS_ATTRIB_TEMPO_OPTION_USE_QUICKALGO
BASS_ATTRIB_TEMPO_OPTION_SEQUENCE_MS
BASS_ATTRIB_TEMPO_OPTION_SEEKWINDOW_MS
BASS_ATTRIB_TEMPO_OPTION_OVERLAP_MS
Aus der Bass_fx Hilfe
Zitat:

Tuning the option attributes parameters
The time-stretch algorithm has few parameters that can be tuned to optimize sound quality for certain application. The current default parameters have been chosen by iterative if-then analysis (read: "trial and error") to obtain best subjective sound quality in pop/rock music processing, but in applications processing different kind of sound the default parameter set may result into a sub-optimal result.

omata 22. Jun 2009 00:16

Re: [Bass] Musik langsamer abspielen
 
Zitat:

Zitat von WorstNightmare
Kann man sowas auch mit Delphi hinbekommen?

Du kannst ja nicht nur das Tempo verändern, sondern auch die Samplerate + das "Pitch Scaling" und diese drei Parameter beliegig mischen.

Ausprobieren kannst du das ja mal mit meinem Player, dort kannst du unter dem Reiter "Effekte" diese drei Größen verändern.

WorstNightmare 22. Jun 2009 14:03

Re: [Bass] Musik langsamer abspielen
 
So, ich habe jetzt einfach den Fehler an seinem Ursprung beseitigt:
Das Programm welches ich benutzte, um die RAW-Daten in eine Wave-Datei zu verwandeln, hat fehlerhaft gearbeitet, da es die genaue SampleRate nicht kannte. Ich lasse nun mein Programm den Wave-Header selbst schreiben und es geht alles einwandfrei.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 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