 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 03.03.2010, 17:21 Titel: Beim 2. Durchlauf der Daten kommt ein Fehler |
|
|
Ich wandle Daten um in eine Wave für den MPF1.
Beim ersten mal werden die Daten richtig abgespeichert/übertragen und es funktioniert.
Wenn ich jetzt bei der Abfrage die "2" eingebe für "neue datei" , dann werden irgendwie falsche Daten in die Wave gespeichert.
Auch wenn ich den vorherigen Name eingebe.
Wenn ich jetzt die Exe verlasse und neu Starte um eine neue Wave zu erstellen, geht es.
Irgendwie wird der Speicher nicht richtig behandelt von mir?
gruss
Code: |
#include "vbcompat.bi"
#INCLUDE "windows.bi"
#INCLUDE ONCE "win/mmsystem.bi"
screen 18,32
const samplerate = 8000
Const volume = 32000
Const channels = 1
Const bitrate = 16
Dim shared as integer nsamples ,bytespersec,secs,datenlaenge,wavlaenge,zaehler,checksumme
Dim Shared As short wdaten
dim Shared As byte ptr wavbuffer
dim shared as byte ptr datenbuffer
Dim shared As String dateiname
Dim As Integer ff = FreeFile
sub writeimpulse(nimpulse as integer,khz as integer)
khz*=1000 ' khz->hz
dim as integer size=samplerate/(2*khz)
for i as integer=1 to nimpulse
' high pegel
for h as integer=1 to size
CAST(Short PTR,wavbuffer)[nsamples\2] = volume
nsamples+=2
next
' low pegel
for l as integer=1 to size
CAST(Short PTR,wavbuffer)[nsamples\2] = -volume
nsamples+=2
next
next
end sub
sub lobit
writeimpulse(8,2) ' 8 * 2 khz.
writeimpulse(2,1) ' 2 * 1 khz.
end sub
sub hibit
writeimpulse(4,2) ' 4 * 2 khz.
writeimpulse(4,1) ' 4 * 1 khz.
end sub
sub writebyte(bits as ubyte)
lobit ' start bit
for i as integer = 0 to 7
if (bits and 1) then hibit else lobit
bits shr = 1
next
hibit ' stop bit
end sub
sub startsync
writeimpulse(4000,1) ' 4 sec. 1 khz.
end sub
sub midsync
writeimpulse(4000,2) ' 2 sec. 2 khz.
end sub
sub endsync
writeimpulse(4000,2) ' 2 sec. 2 khz.
end Sub
nochmal:
Input "Dateiname : ";dateiname
If FILEEXISTS( dateiname ) Then
Open dateiname for Binary as #ff
datenlaenge=LOF(1)
datenbuffer= Allocate(datenlaenge)
GET #ff , ,datenbuffer[0], datenlaenge
CLOSE #ff
EndIf
bytespersec=channels*bitrate/8*samplerate
secs=CInt(datenlaenge*8+7*8)*0.006+10
wavlaenge=bytespersec*secs+44
wavbuffer = allocate(wavlaenge)
Cast(UInteger PTR,wavbuffer)[0] = CVI("RIFF")
CAST(UINTEGER PTR,wavbuffer)[4\4] = 36+bytespersec*secs
CAST(UINTEGER PTR,wavbuffer)[8\4] = CVI("WAVE")
CAST(UINTEGER PTR,wavbuffer)[12\4] = CVI("fmt ")
Cast(UINTEGER PTR,wavbuffer)[16\4] = 16
Cast(SHORT PTR,wavbuffer)[20\2] = 1
CAST(Short PTR,wavbuffer)[22\2] = channels
Cast(UINTEGER PTR,wavbuffer)[24\4] = samplerate
Cast(UINTEGER PTR,wavbuffer)[28\4] = bytespersec
Cast(UINTEGER PTR,wavbuffer)[32\4] = bitrate/8*channels
Cast(Short PTR,wavbuffer)[34\2] = bitrate
CAST(UINTEGER PTR,wavbuffer)[36\4] = CVI("data")
Cast(UINTEGER PTR,wavbuffer)[40\4] = bytespersec*secs
nsamples = 44
startsync
' 2 byte filename lo hi
wdaten=1
writebyte(LoByte(wdaten))
writebyte(HiByte(wdaten))
' 2 byte start address lo hi
wdaten=&h1800
writebyte(LoByte(wdaten))
writebyte(HiByte(wdaten))
' 2 byte end address lo hi
wdaten=&h1800+datenlaenge-1
writebyte(LoByte(wdaten))
writebyte(HiByte(wdaten))
' 1 byte check sum lo
For zaehler = 0 To datenlaenge - 1
checksumme = checksumme+datenbuffer[zaehler]
Next
writebyte(LoByte(checksumme))
midsync
For zaehler = 0 To datenlaenge - 1
wdaten= datenbuffer[zaehler]
writebyte(LoByte(wdaten))
Next
endsync
Print "Bin-Datei-Laenge = ";datenlaenge
Print "Wav-Datei-Laenge = ";wavlaenge
Print
dateiname="wavetest.wav"
Open dateiName FOR Binary AS #ff
Put #ff , , wavbuffer[0], wavlaenge
Close #ff
Print "wavetest.wav gespeichert"
Print "0 = Ende ";"1 = Spielen ";"2 = neue Datei"
Do
Input zaehler
If zaehler=1 Then
sndPlaySound "wavetest.wav", SND_SYNC
EndIf
If zaehler=2 Then
DeAllocate(wavbuffer)
DeAllocate(datenbuffer)
GoTo nochmal
EndIf
If zaehler=0 Then
Exit Do
EndIf
Loop
DeAllocate(wavbuffer)
DEALLOCATE(datenbuffer)
|
|
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 03.03.2010, 18:42 Titel: |
|
|
Wahrscheinlich setzt du nicht alle Variablen zurück. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 04.03.2010, 10:57 Titel: |
|
|
Sieht auf den ersten blick nicht dannach aus als muesse da was zurueck gesetzt werden und abgesehen vom Prgrammierstil wirkt es auf den ersten blick auch ganz ok....
Bei einem versuch stuertzt das gleich nachdem ich eine glueltige wav angebe das programm bei den code mit einem ueberlauf des speichers ab...
Code: | FOR zaehler = 0 TO datenlaenge - 1
wdaten= datenbuffer[zaehler]
writebyte(LOBYTE(wdaten))
NEXT
|
also ab da solltest du nochmal alles kontrollieren das auch nichts ausserhalb des bereichs geschrieben wird.... _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 04.03.2010, 13:46 Titel: |
|
|
Hmmm..
Ich habe nur dies geändert, da ging es:
Code: | ...
CAST(SHORT PTR,wavbuffer)[32\2] = bitrate\8*channels '<- SHORT!! und \ statt /
...
CAST(UINTEGER PTR,wavbuffer)[36\4] = CVI("data") 'data hier klein geschrieben!
... |
Hier Testversion ohne Schnickschnack
http://www.freebasic-portal.de/porticula/toene-des-mpf1-erzeugen-1049.html _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 04.03.2010, 15:46 Titel: |
|
|
Jup, jetzt läuft es.
Danke an alle.
Gruss |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|