Wave spielerei

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Markus2

Betreff: Wave spielerei

BeitragDi, Nov 09, 2004 13:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Mischt eine Wave Datei mit 1/2 1/4 1/8 Speed vorwärts oder rückwärts .
Nur 44kHz 16 Bit Stereo !

BlitzBasic: [AUSKLAPPEN]


;-----------------------------------------------------------------------
Graphics 640,480,16,2
Print \"Umrechnen\"
ok=shWAVE(\"a.wav\",\"b.wav\")
If ok=1 Then
Print \"Ready\"
Print \"Load\"
Musik = LoadSound(\"b.wav\")
Print \"Play\"
Channel = PlaySound(Musik)
Print \"Wait Key\"
WaitKey : FreeSound Musik
End
Else
Print \"Fehler beim laden !?\"
EndIf
;-----------------------------------------------------------------------

;-----------------------------------------------------------------------
Function shWAVE(FileIn$,FileOut$)

Local StreamIn,Dummy$,Wav_Length,Wav_fmt,Wav_Length2
Local Wav_Format,Wav_Kanal,Wav_Sample,Wav_BPS1
Local Wav_BPS2,Wav_Length3

;Datei öffnen
If FileType(FileIn$) <> 1 Then Return 0
StreamIn = ReadFile(FileIn$)

Local h=0

;Kopf Daten lesen (44 Bytes)
Dummy$ = Read_Wav_Bytes$(StreamIn,4) :h=h+4 ; Read 'RIFF'
Wav_Length = ReadInt(StreamIn) :h=h+4 ; Read Length
Dummy$ = Read_Wav_Bytes$(StreamIn,4) :h=h+4 ; Read 'WAVE'
Wav_fmt = Read_Wav_Bytes$(StreamIn,4) :h=h+4 ; Read 'fmt'
Wav_Length2 = ReadInt(StreamIn) :h=h+4 ; Read Length
Wav_Format = ReadShort(StreamIn) :h=h+2 ; Read Format (0=Mono ; 1=Stereo)
Wav_Kanal = ReadShort(StreamIn) :h=h+2 ; Read Kanal
Wav_Sample = ReadInt(StreamIn) :h=h+4 ; Read Sample e.g. 41MHz
Wav_BPS1 = ReadInt(StreamIn) :h=h+4 ; Read Bytes per second
Wav_BPS2 = ReadShort(StreamIn) :h=h+2 ; Read Bytes per sample
Dummy$ = ReadShort(StreamIn) :h=h+2 ; Read Bits per sample

;Print \"Wav_Length \"+Wav_Length
;Print \"Wav_Length2 \"+Wav_Length2

Local ok=0
While True
h=h+1
ok=ok+1
Dummy$ = Dummy$ + Chr(ReadByte(StreamIn))
If Right$(Dummy,4) = \"data\" Then
Exit
EndIf
If ok>32 Then Exit
Wend

If Right(Dummy$,4) <> \"data\" Then
DebugLog \"Wave Header stimmt nicht !? Kein 'data' drinne !?\"
Return 0
EndIf

Wav_Length3 = ReadInt(StreamIn) : h=h+4

Print \"Wav_Length3 \"+Wav_Length3

;Speicher Bank für Kopf Daten

Print \"Header länge = \"+h+\" Bytes\"

Header = CreateBank(h)
SeekFile StreamIn,0
For I = 0 To h-1
PokeByte Header,I,ReadByte(StreamIn)
Next

;Speicher Bank für Wave Daten
Amplitudes = CreateBank(Wav_Length3 )
For I = 0 To Wav_Length3 -1
PokeByte Amplitudes,I,ReadByte(StreamIn) -128
Next

;erste Datei schließen und zweite öffnen
CloseFile StreamIn
StreamOut = WriteFile(FileOut$)

;Kopf Daten wieder speichern 1:1
For I = 0 To h-1
WriteByte StreamOut,PeekByte(Header,I)
Next

If Wav_Kanal = 1 Then Print \"Mono\"
If Wav_Kanal = 2 Then Print \"Stereo\"

If Wav_BPS2=1 Then Print \"8 Bit\"
If Wav_BPS2=2 Then Print \"16 Bit\"
If Wav_BPS2=4 Then Print \"32 Bit\"

;Wave Daten speichern
Local i1=0
Local w1,w2
;i=Wav_Length3-1-3
i=0 ;176400*8*3

For I1 =0 To Wav_Length3-1 Step 1
If Wav_Kanal = 2 Then
If Wav_BPS2 = 4 Then
; 16Bit - Stereo
w1v#=PeekShort(Amplitudes,I1)
w1r#=PeekShort(Amplitudes,I )
w2v#=PeekShort(Amplitudes,I1+2)
w2r#=PeekShort(Amplitudes,I+2)
I1 = I1 + 3

;w1=(w1v*0.75+w1r*0.25) ;vorwärts
;w2=(w2v*0.75+w2r*0.25)
;w1=w1r ;nur Rückwärts
;w2=w2r
w1=(w1v*0.5+w1r*0.5)
w2=(w2v*0.5+w2r*0.5)

WriteShort StreamOut,myShort(w1)
WriteShort StreamOut,myShort(w2)
;If c=0 Then i=i-4
If c=0 Then i=i+ 4
c=c+1:If c=8 Then c=0
EndIf
EndIf
Next

;zweite Datei schließen
CloseFile StreamOut

FreeBank Header
FreeBank Amplitudes

Return 1

End Function
; ==============================================================

; ==============================================================
Function Read_Wav_Bytes$(Stream,Number)
Local I,Out$,Character
For I = 1 To Number
Character = ReadByte(Stream)
If Character = 0 Then
Exit
Else
Out$ = Out$ + Chr$(Character)
EndIf
Next
Return Out$
End Function
; ==============================================================

Function myShort(i)

Local b1,b2,b3,b4

b4 = i And $FF
b3 = Int(i / $100) And $FF ;normal mit \ aber das kennt BB wohl nicht !?
b2 = Int(i / $10000) And $FF
b1 = Int(i / $1000000) And $FF

b1=b1+128
b2=b2+128
b3=b3+128
b4=b4+128

Return b4+(b3*$100)+(b2*$10000)+(b1*$1000000)

End Function
  • Zuletzt bearbeitet von Markus2 am Di, Nov 09, 2004 20:07, insgesamt 2-mal bearbeitet
 

David

BeitragDi, Nov 09, 2004 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Zitat:

;normal mit \ aber das kennt BB wohl nicht !?


Was willst du denn damit mitteilen? Der Divisionsoperator ist doch meistens "/". In irgendeiner Sprach gab's mal diesen "\" für Ganzzahloperationen.
Du hättest übrigens auch shr bzw shl verwenden können. Möglichweise ist das etwas schneller.

grüße
http://bl4ckd0g.funpic.de

Markus2

BeitragDi, Nov 09, 2004 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
@Alle
Habe das mit der data Erkennung korrigiert weil die
Header nicht immer die gleiche größe haben ...
Der Header sollte jetzt 1:1 übernommen werden .

@David

\ = Dividieren ohne das man dann Nachkommastellen hat ,
war nur ein Hinweis für mich selber Wink

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group