Du bist nicht angemeldet.

Kontrollzentrum

Spenden

Jeder Euro hilft uns, euch zu helfen.

Adsense

Downloads

Stabil: 3.3.8.1 (Q, H)
Stabil: 3.3.12.0 (Q, H)
Beta: 3.3.11.5 (Q, H)
SciTE: 4/5/2014 (Q, H)
Hilfe Deutsch: 12/23/2013 (Q)
Download: OrganizeIncludes (Q)
Stand: 02.06.2014 - 2:21 Uhr

Lieber Besucher, herzlich willkommen bei: AutoIt.de - Das deutsche AutoIt-Forum. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

  • »Developer30« ist der Autor dieses Themas

Registrierungsdatum: 12. Juli 2010

Beruf: Schüler

  • Private Nachricht senden

1

Sonntag, 8. August 2010, 17:16

Fehler in meinem Script (Bass.dll)

Hey @ all,
ich hab mal wieder eine Frage zu den BassDlls. Leider habe ich noch nicht sehr viel Erfahrung damit gesammelt, und habe versuch ein kleines Script zu schreiben, welches aber nicht funktioniert :( .
Ich hoffe jemand kann mir weiterhelfen.

Hier mein Script:

  Spoiler Spoiler


AutoIt-Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <Bass.au3>
#include <BassConstants.au3>
#include <BassFX.au3>
#include <BassMix.au3>
#include <BassEnc.au3>
_BASS_Startup(@ScriptDir & "\bass.dll")
_BASS_MIX_Startup(@ScriptDir & "\bassmix.dll")
_BASS_FX_Startup(@ScriptDir & "\bass_fx.dll")
_BASS_Init(0, -1, 44100, 0, "")
_BASS_Encode_Startup()

$smpl1 = _BASS_StreamCreateFile(False, @ScriptDir & "\beispiel_1.mp3", 0, 0, $BASS_STREAM_DECODE)
$smpl2 = _BASS_StreamCreateFile(False, @ScriptDir & "\beispiel_2.mp3", 0, 0, $BASS_STREAM_DECODE)

$hTempo1 = _BASS_FX_TempoCreate($smpl1, 0)
_BASS_ChannelSetAttribute($hTempo1, $BASS_ATTRIB_TEMPO, 0)
_BASS_ChannelSetAttribute($hTempo1, $BASS_ATTRIB_TEMPO_PITCH, 0)
$hTempo2 = _BASS_FX_TempoCreate($smpl2, 0)
_BASS_ChannelSetAttribute($hTempo2, $BASS_ATTRIB_TEMPO, 0)
_BASS_ChannelSetAttribute($hTempo2, $BASS_ATTRIB_TEMPO_PITCH, 0)

$hMixer = _BASS_Mixer_StreamCreate(44100, 2, 0)
_BASS_Mixer_StreamAddChannel($hMixer,$hTempo1, 0)
_BASS_Mixer_StreamAddChannel($hMixer,$hTempo2, 0)
_BASS_ChannelPlay($hMixer, 1)
_BASS_Encode_Start($hMixer, @ScriptDir & "\test.wav", $BASS_ENCODE_PCM)

sleep(1000)
_BASS_STOP()
_BASS_FREE()


mfG Developer30
"Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
"Programmers never die: they just GOSUB without RETURN"
"I tried to change the world but I couldn't find the source code."

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Developer30« (1. November 2010, 11:57)


eukalyptus

koala's favourite

Registrierungsdatum: 1. November 2007

Wohnort: Wien

  • Private Nachricht senden

2

Montag, 9. August 2010, 11:12

Alle Streams, welche nicht direkt abgespielt werden, müssen Decodingstreams sein; Nur der letzte in der Kette soll ein "normaler" abspielbarer Stream sein.
File -> Tempo -> Mixer
Also musst du auch bei Tempocreate $BASS_STREAM_DECODE angeben.

mfgE

  • »Developer30« ist der Autor dieses Themas

Registrierungsdatum: 12. Juli 2010

Beruf: Schüler

  • Private Nachricht senden

3

Montag, 9. August 2010, 18:49

thx^^
"Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
"Programmers never die: they just GOSUB without RETURN"
"I tried to change the world but I couldn't find the source code."

  • »Developer30« ist der Autor dieses Themas

Registrierungsdatum: 12. Juli 2010

Beruf: Schüler

  • Private Nachricht senden

4

Montag, 1. November 2010, 10:17

habe mich nochmal hiermit beschäftigt.. das thema liegt zwar schon länger zurück, aber ich habe nochmal ein paar Fragen...
Warum funktioniert das Script nur dann, wenn da _BASS_ChannelPlay($hMixer, 1) steht?

Und ist es möglich, dass die Streams nicht gleichzeitig sondern hintereinander abgespielt werden.. Ich hab was von _BASS_Mixer_StreamAddChannelEx. Ist eine Verzögerung damit möglich? Wenn ja, wie?

  Spoiler Spoiler

AutoIt-Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <Bass.au3>
#include <BassConstants.au3>
#include <BassFX.au3>
#include <BassMix.au3>
#include <BassExt.au3>
#include <BassEnc.au3>
_BASS_Startup(@ScriptDir & "\bass.dll")
_BASS_MIX_Startup(@ScriptDir & "\bassmix.dll")
_BASS_FX_Startup(@ScriptDir & "\bass_fx.dll")
_BASS_EXT_Startup(@ScriptDir & "\bassext.dll")
_BASS_Init(0, -1, 44100, 0, "")
_BASS_Encode_Startup()

$smpl1 = _BASS_StreamCreateFile(False, @ScriptDir & "\test1.mp3", 0, 0, $BASS_STREAM_DECODE)
$smpl2 = _BASS_StreamCreateFile(False, @ScriptDir & "\test2.wav", 0, 0, $BASS_STREAM_DECODE)

$hTempo1 = _BASS_FX_TempoCreate($smpl1, $BASS_STREAM_DECODE)
_BASS_ChannelSetAttribute($hTempo1, $BASS_ATTRIB_TEMPO, 0)
_BASS_ChannelSetAttribute($hTempo1, $BASS_ATTRIB_TEMPO_PITCH, 0)
$hTempo2 = _BASS_FX_TempoCreate($smpl2, $BASS_STREAM_DECODE)
_BASS_ChannelSetAttribute($hTempo2, $BASS_ATTRIB_TEMPO, 0)
_BASS_ChannelSetAttribute($hTempo2, $BASS_ATTRIB_TEMPO_PITCH, 0)

$hMixer = _BASS_Mixer_StreamCreate(44100, 2, 0)
_BASS_Mixer_StreamAddChannel($hMixer,$hTempo1, 0)
_BASS_Mixer_StreamAddChannel($hMixer,$hTempo2, 0)
_BASS_ChannelPlay($hMixer, 1)
_BASS_Encode_Start($hMixer, @ScriptDir & "\test.wav", $BASS_ENCODE_PCM)

sleep(1000)
_BASS_STOP()
_BASS_RecordFree()
_BASS_FREE()
"Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
"Programmers never die: they just GOSUB without RETURN"
"I tried to change the world but I couldn't find the source code."

eukalyptus

koala's favourite

Registrierungsdatum: 1. November 2007

Wohnort: Wien

  • Private Nachricht senden

5

Montag, 1. November 2010, 11:06

Im Prinzip ganz einfach:

AutoIt-Quellcode

1
2
3
4
$iBytesStart = _BASS_ChannelSeconds2Bytes($hTempo2, 5)
$iBytesLength = _BASS_ChannelSeconds2Bytes($hTempo2, 3)
ConsoleWrite(@CRLF & "! Start nach 5s = " & $iBytesStart & " bytes / spiele 3s = " & $iBytesLength & " bytes" & @CRLF & @CRLF)
_BASS_Mixer_StreamAddChannelEx($hMixer, $hTempo2, 0, $iBytesStart, $iBytesLength)


Allerdings hat die BassMix.au3 hier einen Bug:
Zeile 599 :

AutoIt-Quellcode

1
Local $BASS_ret_ = DllCall($_ghBassMixDll, "int", "BASS_Mixer_StreamAddChannelEx", "hwnd", $handle, "dword", $channel, "uint64", $length)

muss natürlich so aussehen:

AutoIt-Quellcode

1
Local $BASS_ret_ = DllCall($_ghBassMixDll, "int", "BASS_Mixer_StreamAddChannelEx", "hwnd", $handle, "dword", $channel, "dword", $flags, "uint64", $start, "uint64", $length)


E

Edit: Alternativ dazu kann man auch einen Syncpunkt (BASS_ChannelSetSync) erstellen, an dem dann das nächste Sample gestartet wird - das muss ich mir aber erst mal genauer ansehen

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »eukalyptus« (1. November 2010, 11:11)


  • »Developer30« ist der Autor dieses Themas

Registrierungsdatum: 12. Juli 2010

Beruf: Schüler

  • Private Nachricht senden

6

Montag, 1. November 2010, 11:15

ich glaube ich hab eine ältere Version der BassMix.au3.. bei mir ist das jedenfalls nicht Zeile 599 sondern 512.
Warum gibt mir Encode immer eine 36byte datei zurück, sobald ich _BASS_ChannelPlay($hMixer, 1) auskommentiere?
"Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
"Programmers never die: they just GOSUB without RETURN"
"I tried to change the world but I couldn't find the source code."

eukalyptus

koala's favourite

Registrierungsdatum: 1. November 2007

Wohnort: Wien

  • Private Nachricht senden

7

Montag, 1. November 2010, 11:23

Du willst also eine Audiodatei erstellen, ohne daß etwas abgespielt wird?

  • »Developer30« ist der Autor dieses Themas

Registrierungsdatum: 12. Juli 2010

Beruf: Schüler

  • Private Nachricht senden

8

Montag, 1. November 2010, 11:25

ja
"Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
"Programmers never die: they just GOSUB without RETURN"
"I tried to change the world but I couldn't find the source code."

eukalyptus

koala's favourite

Registrierungsdatum: 1. November 2007

Wohnort: Wien

  • Private Nachricht senden

9

Montag, 1. November 2010, 11:32

Um die Samples zum Encoder zu bekommen, gibt es 2 Möglichkeiten:

1) Normalen Stream abspielen (wie jetzt)
2) Decoding Stream verwenden und mit _BASS_ChannelGetData die Samples "auslesen"

Vielleicht hilft dir dieses Beispiel etwas weiter:

  Spoiler Spoiler

AutoIt-Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#AutoIt3Wrapper_UseX64=n
#include "Bass.au3"
#include "BassMix.au3"
#include "BassEnc.au3"

Global $iOutputFreq = 32000

_BASS_Startup()
___Debug(@error, "load bass.dll")

_BASS_ENCODE_Startup()
___Debug(@error, "load bassenc.dll")

_BASS_MIX_Startup()
___Debug(@error, "load bassmix.dll")

_BASS_Init(0, -1, 44100, 0, "")
___Debug(@error, "initialize bass")

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

$sFile = FileOpenDialog("Open...", "", "Wav Files (*.wav)")
___Debug($sFile = "", $sFile)

$hMusicHandle = _BASS_StreamCreateFile(False, $sFile, 0, 0, $BASS_STREAM_DECODE)
___Debug(@error, "create stream from file")
$aInfo = _BASS_ChannelGetInfo($hMusicHandle)
___Debug(@error, "get channel infos")

$hMixer = _BASS_Mixer_StreamCreate($iOutputFreq, $aInfo[1], BitOR($BASS_MIXER_END, $BASS_STREAM_DECODE))
___Debug(@error, "create mixer stream")

_BASS_Mixer_StreamAddChannel($hMixer, $hMusicHandle, $BASS_MIXER_FILTER)
___Debug(@error, "add channel to mixer")

$hEncoder = _BASS_Encode_Start($hMixer, @ScriptDir & "\Resampled.wav", $BASS_ENCODE_PCM)
___Debug(@error, "set up encoder")

$iBytes = _BASS_ChannelGetLength($hMusicHandle, $BASS_POS_BYTE)
___Debug(@error, "get filesize: " & $iBytes)

$iBytes = $iBytes * $iOutputFreq / $aInfo[0]
$iDone = 0

While _BASS_ChannelIsActive($hMixer)
    $iLength = _BASS_ChannelGetData($hMixer, $pBuffer, $iBuffer)
    ___Debug(@error, "read data: " & $iLength & " bytes")

    $iDone += $iLength
    ___Debug(-1, Round($iDone * 100 / $iBytes) & "% done")
WEnd

_BASS_Encode_Stop($hEncoder)
___Debug(@error, "stop encoder")

_BASS_StreamFree($hMixer)
___Debug(@error, "free stream")

_BASS_Free()
___Debug(@error, "free bass")

Func ___DeBug($iError, $sAction)
    Switch $iError
        Case -1
            ConsoleWrite(@CRLF & "-" & $sAction & @CRLF)
        Case 0
            ConsoleWrite(@CRLF & "+" & $sAction & " - OK" & @CRLF)
        Case Else
            ConsoleWrite(@CRLF & "!" & $sAction & " - FAILED" & @CRLF)
            Exit
    EndSwitch
EndFunc   ;==>___DeBug


mfgE

  • »Developer30« ist der Autor dieses Themas

Registrierungsdatum: 12. Juli 2010

Beruf: Schüler

  • Private Nachricht senden

10

Montag, 1. November 2010, 11:37

thx für das beispiel.. ich werde mal versuchen meine Ideen damit umzusetzen.. :)
"Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
"Programmers never die: they just GOSUB without RETURN"
"I tried to change the world but I couldn't find the source code."

eukalyptus

koala's favourite

Registrierungsdatum: 1. November 2007

Wohnort: Wien

  • Private Nachricht senden

11

Montag, 1. November 2010, 11:47

Encoded 10 Sekunden von test1.mp3, nach 5 Sekunden startet test2.wav für 3 Sekunden:

  Spoiler Spoiler

AutoIt-Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "Bass.au3"
#include "BassFX.au3"
#include "BassMix.au3"
#include "BassExt.au3"
#include "BassEnc.au3"
_BASS_Startup(@ScriptDir & "\bass.dll")
_BASS_MIX_Startup(@ScriptDir & "\bassmix.dll")
_BASS_FX_Startup(@ScriptDir & "\bass_fx.dll")
_BASS_EXT_Startup(@ScriptDir & "\bassext.dll")
_BASS_Init(0, -1, 44100, 0, "")
_BASS_Encode_Startup()

$smpl1 = _BASS_StreamCreateFile(False, @ScriptDir & "\test1.mp3", 0, 0, $BASS_STREAM_DECODE)
$smpl2 = _BASS_StreamCreateFile(False, @ScriptDir & "\test2.wav", 0, 0, $BASS_STREAM_DECODE)

$hTempo1 = _BASS_FX_TempoCreate($smpl1, $BASS_STREAM_DECODE)
_BASS_ChannelSetAttribute($hTempo1, $BASS_ATTRIB_TEMPO, 0)
_BASS_ChannelSetAttribute($hTempo1, $BASS_ATTRIB_TEMPO_PITCH, 0)
$hTempo2 = _BASS_FX_TempoCreate($smpl2, $BASS_STREAM_DECODE)
_BASS_ChannelSetAttribute($hTempo2, $BASS_ATTRIB_TEMPO, 0)
_BASS_ChannelSetAttribute($hTempo2, $BASS_ATTRIB_TEMPO_PITCH, 0)

$hMixer = _BASS_Mixer_StreamCreate(44100, 2, BitOR($BASS_MIXER_END, $BASS_STREAM_DECODE))
_BASS_Mixer_StreamAddChannel($hMixer, $hTempo1, 0)

$iBytesStart = _BASS_ChannelSeconds2Bytes($hTempo2, 5)
$iBytesLength = _BASS_ChannelSeconds2Bytes($hTempo2, 3)
ConsoleWrite(@CRLF & "! Start nach 5s = " & $iBytesStart & " bytes / spiele 3s = " & $iBytesLength & " bytes" & @CRLF & @CRLF)
_BASS_Mixer_StreamAddChannelEx($hMixer, $hTempo2, 0, $iBytesStart, $iBytesLength)
_BASS_Encode_Start($hMixer, @ScriptDir & "\test.wav", $BASS_ENCODE_PCM)


Global $tBuffer = DllStructCreate("byte[20000]")
Global $pBuffer = DllStructGetPtr($tBuffer)

$iBytesEncode = _BASS_ChannelSeconds2Bytes($hMixer, 10) ; 10 sekunden Aufnahmelänge

For $i = 1 To $iBytesEncode Step 20000
    If $i + 20000 <= $iBytesEncode Then
        _BASS_ChannelGetData($hMixer, $pBuffer, 20000)
    Else
        _BASS_ChannelGetData($hMixer, $pBuffer, $iBytesEncode - $i)
    EndIf
Next

_BASS_FREE()

  • »Developer30« ist der Autor dieses Themas

Registrierungsdatum: 12. Juli 2010

Beruf: Schüler

  • Private Nachricht senden

12

Montag, 1. November 2010, 11:56

perfekt :thumbsup:
danke :party:
"Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
"Programmers never die: they just GOSUB without RETURN"
"I tried to change the world but I couldn't find the source code."

eukalyptus

koala's favourite

Registrierungsdatum: 1. November 2007

Wohnort: Wien

  • Private Nachricht senden

13

Montag, 1. November 2010, 12:48

Hab einen kleinen Fehler gemacht!

Bei _BASS_ChannelSeconds2Bytes musst du den Handle des Mixerstreams verwenden, sonst stimmen die Sekunden nicht, wenn du Samples mit anderer Samplingfrequenz verwendest!

Hier noch ein kurzes Beispiel:

  Spoiler Spoiler

AutoIt-Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include "Bass.au3"
#include "BassMix.au3"
#include "BassEnc.au3"

;result:         0s                          10s
;output.wav:     |----------------------------|
;sample1.wav:       |----------|
;sample2.wav:             |----------------|
;sample3.wav:                      |-------------|

$iBufferSize = 20000 ; bytes

_BASS_Startup()
_BASS_MIX_Startup()
_BASS_Encode_Startup()

_BASS_Init(0, -1, 44100, 0, "")

$hStream1 = _BASS_StreamCreateFile(False, @ScriptDir & "\sample1.wav", 0, 0, $BASS_STREAM_DECODE)

$hStream2 = _BASS_StreamCreateFile(False, @ScriptDir & "\sample2.wav", 0, 0, $BASS_STREAM_DECODE)
_BASS_ChannelSetPosition($hStream2, _BASS_ChannelSeconds2Bytes($hStream2, 5), $BASS_POS_BYTE) ;sample offset: 5s

$hStream3 = _BASS_StreamCreateFile(False, @ScriptDir & "\sample3.wav", 0, 0, $BASS_STREAM_DECODE)

$hMixer = _BASS_Mixer_StreamCreate(44100, 2, BitOR($BASS_MIXER_END, $BASS_STREAM_DECODE))

_BASS_Mixer_StreamAddChannelEx($hMixer, $hStream1, BitOR($BASS_MIXER_FILTER, $BASS_STREAM_AUTOFREE), _
        _BASS_ChannelSeconds2Bytes($hMixer, 1), _BASS_ChannelSeconds2Bytes($hMixer, 4)) ;sample1.wav: start: 1s / duration: 4s

_BASS_Mixer_StreamAddChannelEx($hMixer, $hStream2, BitOR($BASS_MIXER_FILTER, $BASS_STREAM_AUTOFREE), _
        _BASS_ChannelSeconds2Bytes($hMixer, 3), _BASS_ChannelSeconds2Bytes($hMixer, 6)) ;sample2.wav: start: 3s (sample offset 5s) / duration: 6s

_BASS_Mixer_StreamAddChannelEx($hMixer, $hStream3, BitOR($BASS_MIXER_FILTER, $BASS_STREAM_AUTOFREE), _
        _BASS_ChannelSeconds2Bytes($hMixer, 6), _BASS_ChannelSeconds2Bytes($hMixer, 5)) ;sample3.wav: start: 6s / duration: 5s

_BASS_Encode_Start($hMixer, @ScriptDir & "\output.wav", $BASS_ENCODE_PCM)


$tBuffer = DllStructCreate("byte[" & $iBufferSize & "]")
$pBuffer = DllStructGetPtr($tBuffer)

$iBytesEncode = _BASS_ChannelSeconds2Bytes($hMixer, 10); max length of output.wav

For $i = 1 To $iBytesEncode Step $iBufferSize
    If $i + $iBufferSize <= $iBytesEncode Then
        _BASS_ChannelGetData($hMixer, $pBuffer, $iBufferSize)
    Else
        _BASS_ChannelGetData($hMixer, $pBuffer, $iBytesEncode - $i)
    EndIf
Next

_BASS_FREE()

autoit.de Webutation