Wave-datei erzeugen von Daten

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Wave-datei erzeugen von Daten

Beitrag von WPö »

Klar sieht's gut aus. :)

Du bist seit über vier Jahren dabei und kannst doch wohl noch so ein bißchen Quelltext schreiben? Klar sind das WAVE-Daten. Die übergibst Du mit CatchSound() Deiner Audio-Hardware. Vergiß nicht, das Audio-Signal um mind. 40dB zu dämpfen, bevor Du auf einen Mikrofoneingang gehst!

Den Rest schreibste jetzt auch mal selbst, gell?

Gruß - WPö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Wave-datei erzeugen von Daten

Beitrag von super_castle »

So, jetzt funktioniert es.
Alle Daten werden korrekt übertragen als Wav zum MPF1, bzw werden auch als wav abgespeichert.

Gruss

Code: Alles auswählen


  SetCurrentDirectory(GetPathPart(ProgramFilename()))
  
  Global *tonspeicher.l,*datspeicher.l,tonlaenge.l,datlaenge.l,bytespersec.l
  Global uni_w.u,lobyte.c,hibyte.c,secs.f
  Global samplerate.l,bitrate.l,channels.l,volume.l,n_samples.l,n_dat.l,zaehler.l
  
  Declare w_impulse(n_impulse.l,khz.l)
  Declare bit_0()
  Declare bit_1()
  Declare w_byte(byte_bits.c)
  Declare a_sync()
  Declare m_sync()
  Declare e_sync()
  Declare vn_spann()
  
  Procedure w_impulse(n_impulse.l,khz.l)
    Protected n_size.l,i.l,h.l,l.l
  
    khz * 1000
    n_size=samplerate/(2*khz)
    For i=1 To n_impulse
      ; hipegel
      For h=1 To n_size
        PokeW(*tonspeicher+n_samples,volume)
        n_samples + 2
      Next  
      ; lopegel
      For h=1 To n_size
        PokeW(*tonspeicher+n_samples,-volume)
        n_samples + 2
      Next 
    Next   
  EndProcedure
  
  Procedure bit_0()
    w_impulse(8,2) ; 8 * 2 khz
    w_impulse(2,1) ; 2 * 1 khz
  EndProcedure
  
  Procedure bit_1()
    w_impulse(4,2) ; 4 * 2 khz
    w_impulse(4,1) ; 4 * 1 khz
  EndProcedure
  
  Procedure w_byte(byte_bits.c)
    Protected i.l
    bit_0()
    For i=0 To 7
      If (byte_bits & (1<<i))
         bit_1()
      Else
         bit_0()
      EndIf
    Next i
    bit_1()
  EndProcedure
  
  Procedure a_sync()
    w_impulse(4000,1) ; 4 sec 1khz
  EndProcedure
  
  Procedure m_sync()
    w_impulse(4000,2) ; 2 sec 2khz
  EndProcedure
  
  Procedure e_sync()
    w_impulse(4000,2) ; 2 sec 2khz
  EndProcedure
  
  Procedure vn_spann()
    Protected i.l
    For i=1 To 100
      PokeW(*tonspeicher+n_samples,0)
      n_samples + 2
    Next
  EndProcedure  
  
  InitSprite()
  InitSound()
 
  OpenWindow(0,0,0,800,600,"sound-test",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0),10,10,350,300,0,0,0)
  
  text1=TextGadget(#PB_Any, 10,380,200,20, "Taste-Q") 
  
  ClearScreen(RGB(128,128,128))
  
  OpenFile(0,"dice2.bin")
  datlaenge=Lof(0) 
  *datspeicher= AllocateMemory(datlaenge) 
  ReadData(0, *datspeicher, datlaenge)
  CloseFile(0)
                       
  samplerate = 8000
  bitrate = 16                      
  channels = 1  
  volume=32000  
                                                       
  bytespersec = channels*bitrate/8*samplerate  
  
  secs=(datlaenge*8+7*8)*0.006+10
  
  tonlaenge=bytesperSec*secs+44
  *tonspeicher= AllocateMemory(tonlaenge) 
  
  Repeat
    
    Event.l = WaitWindowEvent(2)
  
    If GetAsyncKeyState_(#VK_Q)   
    
      SetGadgetText(text1,"erstelle") 
      
      PokeS(*tonspeicher,"RIFF")     
      PokeL(*tonspeicher+4,36+bytespersec*secs)        
      PokeS(*tonspeicher+8,"WAVE")  
      PokeS(*tonspeicher+12,"fmt ")  
      PokeL(*tonspeicher+16,16) 
      PokeW(*tonspeicher+20,1) 
      PokeW(*tonspeicher+22,channels)          
      PokeL(*tonspeicher+24,samplerate )  
      PokeL(*tonspeicher+28,bytespersec) 
      PokeW(*tonspeicher+32,bitrate/8*channels) 
      PokeW(*tonspeicher+34,bitrate) 
      PokeS(*tonspeicher+36,"data")   
      PokeL(*tonspeicher+40,bytespersec*secs) 
      
      n_samples=44
      
      vn_spann()
      
      a_sync()
      
      uni_w=1   ;filenummer 2byte
      lobyte=uni_w & $00ff
      hibyte=uni_w & $ff00/256
      w_byte(lobyte)
      w_byte(hibyte)
      
      uni_w=$1800   ;startadresse $1800 2byte
      lobyte=uni_w & $00ff
      hibyte=uni_w & $ff00/256
      w_byte(lobyte)
      w_byte(hibyte)
      
      uni_w=$1800+datlaenge-1  ;endadresse $1800+datlaenge 2byte
      lobyte=uni_w & $00ff
      hibyte=uni_w & $ff00/256
      w_byte(lobyte)
      w_byte(hibyte)
      
      uni_w=0
      For zaehler=0 To datlaenge-1 ;programmdaten zur checksumme
        uni_w= uni_w+PeekB(*datspeicher+zaehler)
      Next
      lobyte=uni_w & $00ff  ;checksumme 1byte
      w_byte(lobyte)
      
      m_sync()
      
      For zaehler=0 To datlaenge-1 ;programmdaten
        lobyte = PeekB(*datspeicher+zaehler)
        w_byte(lobyte)   
      Next
      
      e_sync()
     
      CreateFile(0, "wavtest.wav")  
      WriteData(0,*tonspeicher,tonlaenge)
      CloseFile(0)
      
      SetGadgetText(text1,"Datei und Speicher") 
     EndIf
      
     If GetAsyncKeyState_(#VK_S)     
       CatchSound(0, *tonspeicher)
       PlaySound(0)  
     EndIf
     
  Until Event = #PB_Event_CloseWindow   

End 

Antworten