Dateien auf eine bestimmte Länge pitchen/ziehen

Hi Torben,

Ist es möglich, (über die bass.dll) ein File auf eine bestimmte länge runter/hochzupitchen?

Hintergrund: Ich werde in naher zukunft unseren Wiederholungs-aufzeichnungsserver neu Installieren (kannst dich ja noch erinnern ans .ogg Problem, das jetzt übrigends endgültig fehlerfrei läuft :wink: ). Dann sind die Files nicht exakt 60:00:00min lang, sondern nur 59:59:XX. Dies verursacht bei 2 Wiederholungen hintereinander den Effekt, dass zwichen den Wdh’s ein Track aus der Playlist “angespielt” wird. Deshalb wärs super, wenn man das File so runterpitchen könnte, dass es 60:01 (beispielsweise) lang ist. Das ist denke ich unhörbar.

am besten dann auch noch per Script (wenn titelname xx, dann pitche auf YY-länge )

Was meinst du? ist sowas möglich und findest du es einbauenswert?

grüße, michi

Geht schon, mit der BASS_FX.DLL :slight_smile: Du kannst sogar das Tempo unabhängig vom Pitch regeln.

Du musst für jeden Player die BASS_FX-Option aktivieren (im der Soundkarten-Konfigurationsdialog). Per Script kannst du mit SetTempo arbeiten, um das Tempo (und damit die tatsächliche Spieldauer) zu ändern:

item.SetTempo(36000000000/item.GetDuration)

macht den Titel genau eine Stunde lang :wink:

okay :slight_smile:

…danke :slight_smile:

grüße, michi

Hi,

[code]procedure OnPlayerStart(PlayerControl: IPlayerControl; Item: IPlaylistItem);
begin
Item.SetTempo(36000000000/item.GetDuration)
end;

begin
end.
[/code]

Ich habe es gerade mit diesem Script ausprobiert. Nur leider funktioniert es nicht (kommt auch keine Fehlermeldung)

was mache ich falsch?

grüße, michi

BASS_FX ist installiert und aktiviert? Dann solltest du im PFL-Dialog hinterher auch den veränderten Tempo-Wert sehen.

BASS_FX ist installiert und aktiviert? Dann solltest du im PFL-Dialog hinterher auch den veränderten Tempo-Wert sehen.

Ich habe im Konfigurationsprogramm für jeden Player unter “Soundkarte” sowie unter “PFL-Soundkarte” und im PFL unter Soundkarte jeweils “Tempo und Pitchanpassung” aktiviert. Muss ich da noch die bass_fx.dll irgendwo hinverschieben(denn die liegt ja im obersten Verzeichnis)?

Im PFL-dialog sehe ich auch die Pitch/Tempo regler, nur die stehen beide auf 0, auch nach Ausführen des Scripts.

Jedoch fällt mir auf, dass sehr kurzen Dateien (7sek Länge) sehr SCHNELL abgespielt werden (ca 3 sek Länge)…

ich kann mir da keinen Reim drauf machen :wink:

Was bedeutet denn der Parameter von SetTempo? eine art faktor, um wieviel die Datei länger gezogen wird?

grüße, michi

Ja, SetTempo erwartet einen Faktor. 36000000000 müsste 1 Stunde in DirectX-Einheiten sein, wenn ich mich nicht verrechnet oder bei den Nullen verzählt habe :wink: 606010000000. Rechne nochmal nach :wink:

mhh,

Da kommt ja dann bei Tracks, die kürzer sind als eine Stunde immer ein Wert größer 1 raus ( Da unterm Bruchstrich eine zahl kleiner die 36000000000 steht)…

kann es sein, dass bei Zahlen größer 1 der Track schneller gemacht wird (habe es mit ein paar zahlen brobiert… bei z.B 300 wars eindeutig :wink: )…
ist das Richtig?

Logisch überlegt wären dann die Faktoren zwischen 0,000…1 und 0,999… dafür da, um den Track in die Länge zu ziehen (Item.GetDuration/36000000000). dann passiert aber überhaupt nichts (selbst wenn ich es mit 0.1 probiere)

kannst du mit meinen Vermutungen irgendwas anfangen?

grüße, michi

Hm, stimmt, dann müsstest du den Kehrwert nehmen. Hatte gestern schon etwas Bier getrunken :wink:

hehe, kein Ding…

naja, weil die werte zwischen 0 und 1 kein ergebnis brachten, hab ich mal noch n bissl rumgespielt, und rausgefunden, dass der normalwert von GetTempo “0” ist, mit werten größer 0 wird gestaucht, und mit werten kleiner 0 wird gezogen. (getestet mit faktoren 20 und -20, da wirds hörbar)

Nur dann greift die Methode des Ausrechnens des Parameters von SetTempo nichtmehr, oder?

(Beispiel: ich habe ein 30 min langes Stück, will es auf 60 strecken: dafür würde ich “-36000000000/Item.GetDuration” nehmen. dort müsste dannn der Wert “-2” herauskommen. -2 halbiert aber die geschwindigkeit des Tracks nicht :frowning:

Hast du eine Idee?

Sorry, dass ich dich eventuell nerve mit dem Thema…

grüße, michi

Ah, Mist, ich war auf dem falschen Dampfer. Die Tempo-Angabe ist kein Faktor, sondern eine Prozentangabe, wie der Pitch-Regler an einem CD-Player. Die Formel musst du dir jetzt selbst aufstellen (und dann hier posten g).

ok, da greift dann wohl der gute alte Dreisatz :wink:

[code]procedure OnPlayerStart(PlayerControl: IPlayerControl; Item: IPlaylistItem);
var tempo : single;
begin
tempo:=-100/Item.GetDuration*36000000000+100;
Item.SetTempo(tempo);
end;

begin
end.
[/code]

grüße, michi