Bass.au3 - Tempo/Pitch bestimmen und .mp3 exportieren

  • Nabend,

    also ich kann ja Tempo und Pitch einen Bass-Streams setzen. Nun möchte ich aber zusätzlich den Stream dann als Musik-File exportieren lassen. Wie kann ich das realisieren? Außerdem habe ich für den Stream auch die Lautstärke verändert, sie soll aber auf dem Standard-Niveau bleiben. Hier mein Basis-Code:

    Spoiler anzeigen
    [autoit]

    #include <Bass.au3>
    #include <BassConstants.au3>
    #include <BassFX.au3>
    #include <BassFXConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_Startup("..." & "\bass.dll")
    _BASS_FX_Startup("..." & "\bassfx.dll")
    _BASS_Init(0, -1, 44100, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $StreamCreateFile = _BASS_StreamCreateFile(0, "... .mp3", 0, 0, $BASS_STREAM_DECODE)
    $Random_Track = _BASS_FX_TempoCreate($StreamCreateFile, 0)
    _BASS_ChannelSetAttribute($Random_Track, $BASS_ATTRIB_TEMPO_PITCH, X)
    _BASS_ChannelSetAttribute($Random_Track, $BASS_ATTRIB_TEMPO, X)
    _BASS_ChannelSetVolume($Random_Track, X)

    [/autoit]


    Hoffe auf Hilfe, Gruß Andy :)

    Einmal editiert, zuletzt von AndyTR (14. Juni 2011 um 14:38)

  • Es hängt davon ab, was du genau erreichen willst.

    Im Prinzip musst du nur _Bass_Encode_Start auf den Tempostream anwenden um den Stream zu speichern.
    Das geht in Echtzeit (während des Abspielens) oder auch viel schneller, wenn der Tempstream auch ein Decodingstream ist.
    Beispiele in der Hilfe: _Bass_Encode_Start.au3 oder Resample.au3

    Um die Lautstärke auf dem original Level zu behalten, kannst du den TempoStream (als Decodingstream) auf einen Mixerstream setzen via _BASS_Mixer_StreamCreate und _BASS_Mixer_StreamAddChannel.
    Beim Mixerstream kannst du die Lautstärke ändern ohne die Lautstärke des Tempostreams zu beeinflussen (welcher ja gespeichert wird)

    Alles klar?

    E

  • Mittlerweil bin ich schon ganz gut voran gekommen. In Echtzeit wird der Stream exportiert und die Lautstärke scheint auf 100% zu bleiben.
    Ich möchte es gerne möglichst schnell exportiert haben - nicht in Echtzeit - also Tempo-Stream dann offenbar als Decode (kriege ich aber nicht hin), und dass ich abfragen kann, ob das Exportieren beendet wurde und das Schreiben in die .mp3 abgeschlossen ist.

    Hoffe nochmal auf Deine Hilfe eukalyptus, wer sollte sich wenn auch mit der Bass-UDF auskenne, wenn nicht Du :rolleyes:

    Grüße :)

    Es muss nurnoch manuell eine Sample.mp3 in den Ordner geschoben werden...

    Spoiler anzeigen
    [autoit]

    #include "Bass.au3"
    #include "BassConstants.au3"
    #include "BassEnc.au3"
    #include "BassEncConstants.au3"
    #include "BassFX.au3"
    #include "BassFXConstants.au3"

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{ESC}", "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_Startup(@ScriptDir & "\Dlls\bass.dll")
    _BASS_Encode_Startup(@ScriptDir & "\Dlls\bassenc.dll")
    _BASS_FX_Startup(@ScriptDir & "\Dlls\bassfx.dll")
    _BASS_Init(0, -1, 44100, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $StreamCreateFile = _BASS_StreamCreateFile(0, @ScriptDir & "\Sample.mp3", 0, 0, $BASS_STREAM_DECODE)
    $Random_Track = _BASS_FX_TempoCreate($StreamCreateFile, 0)
    _BASS_ChannelSetAttribute($Random_Track, $BASS_ATTRIB_TEMPO_PITCH, 3)
    _BASS_ChannelSetAttribute($Random_Track, $BASS_ATTRIB_TEMPO, 30)
    _BASS_ChannelSetVolume($Random_Track, 5) ; hier sehr leise (also während Wiedergabe), Export aber offenbar Standard-Volume

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_Encode_Start($Random_Track, 'lame -r -x -b128 -h - "' & @ScriptDir & '\Sample - Encode.mp3"', 0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _BASS_ChannelPlay($Random_Track, 1)
    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _BASS_Free()
    Exit
    EndFunc

    [/autoit]
  • Hier ein kurzes Beispielscript für dich:

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_UseX64=n
    #include <BASS.au3>
    #include <BASSENC.au3>
    #include <BASSFX.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $tBuffer = DllStructCreate("byte[100000]")
    Global $pBuffer = DllStructGetPtr($tBuffer)
    Global $iBuffer = DllStructGetSize($tBuffer)

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_Startup()
    _BASS_ENCODE_Startup()
    _BASS_FX_Startup()
    _BASS_Init(0, -1, 44100, 0, "")

    [/autoit] [autoit][/autoit] [autoit]

    Global $sFile = FileOpenDialog("Open...", @ScriptDir, "playable formats (*.MP3;*.MP2;*.MP1;*.OGG;*.WAV;*.AIFF;*.AIF)")
    Global $hStream = _BASS_StreamCreateFile(False, $sFile, 0, 0, $BASS_STREAM_DECODE)
    Global $hTempo = _BASS_FX_TempoCreate($hStream, $BASS_STREAM_DECODE)

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_ChannelSetAttribute($hTempo, $BASS_ATTRIB_TEMPO_PITCH, 3)
    _BASS_ChannelSetAttribute($hTempo, $BASS_ATTRIB_TEMPO, 30)
    Global $fRatio = _BASS_FX_TempoGetRateRatio($hTempo)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hEncoder = _BASS_Encode_Start($hTempo, '"' & @ScriptDir & '\lame" -r -x -b192 -h - "' & @ScriptDir & '\output.mp3"', 0)
    Global $iLength = _BASS_ChannelGetLength($hTempo, $BASS_POS_BYTE)

    [/autoit] [autoit][/autoit] [autoit]

    Global $fRead = 0
    ConsoleWrite("+ ============" & @CRLF)
    While _BASS_ChannelIsActive($hTempo)
    $fRead += _BASS_ChannelGetData($hTempo, $pBuffer, $iBuffer) * $fRatio
    ConsoleWrite("! " & Round($fRead * 100 / $iLength) & "% done" & @CRLF)
    WEnd
    ConsoleWrite("+ ============" & @CRLF & "! 100% finito" & @CRLF & "+ ============" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_Encode_Stop($hEncoder)
    _BASS_StreamFree($hStream)
    _BASS_Free()

    [/autoit]

    E