Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Beim 2. Durchlauf der Daten kommt ein Fehler

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 03.03.2010, 17:21    Titel: Beim 2. Durchlauf der Daten kommt ein Fehler Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 03.03.2010, 18:42    Titel: Antworten mit Zitat

Wahrscheinlich setzt du nicht alle Variablen zurück.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 04.03.2010, 10:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 04.03.2010, 13:46    Titel: Antworten mit Zitat

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 grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 04.03.2010, 15:46    Titel: Antworten mit Zitat

Jup, jetzt läuft es.

Danke an alle.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz