ich versuche seit ein paar Tagen eine Wellenform eines Soundsamples zu zeichnen. Beispiele, wie man soetwas direkt aus einen wav-file macht gibt's ja genug, aber direkt aus dem RAM bereitet mir Probleme. Ich benutze folgende Procedure um die Wellenform zu zeichnen und es klappte auch auf Anhieb, aber leider nur bei einigen ausgewählten Samples. Die meisten Samples (obwohl im selben Format (44,1kHz; 16bit; mono)), erzeugen einen Read-Error. Die Samples die klappen sehen gezeichnet auch so aus wie ich mir das vorstelle (siehe Beispiel hier, verglichen mir der Ausgabe von Audacity).
Hier der Code (PB 4.41):
Code: Alles auswählen
Procedure TDAE_DrawSample(Image.l, Sample.l, YZoom.f=0.8)
*Pointer=IsSound(Sample)
Blocks.l=GetDXSoundBufferSize(Sample)
Channels.w=GetDXSoundChannels(Sample)
Frequenz.l=GetDXSoundFrequency(Sample)
Bits=GetDXSoundBits(Sample)
; *DirectSoundBuffer.IDirectSoundBuffer=PeekL(*Pointer)
XSize=ImageWidth(Image)
YSize=ImageHeight(Image)
XFaktor=(Blocks/XSize)/2/Channels
Debug "---------------------------------------------------------------"
Debug "Sample: "+Str(Sample)+" - Size: "+Str(XSize)+"x"+Str(YSize)+" - XFaktor: "+Str(XFaktor)
Debug "LenB:"+Str(Blocks)
Debug "Kanäle: "+Str(Channels)
Debug "Rate: "+Str(Frequenz)
Debug "Bits: "+Str(Bits)
Debug "Time: "+Str(GetDXSoundRealLength(Sample))+" ms"
Debug "Pointer="+Str(*Pointer)
StartDrawing(ImageOutput(Image))
Box(0,0,XSize,YSize,RGB(255,255,255))
OldX=XSize : OldY=(YSize/2)
For t=0 To XSize-1;XSize-1
delta=t*2*XFaktor*Channels
ValueL=PeekW(*Pointer-delta)/2
Debug "Adr="+Str(*Pointer-delta)+" - t="+Str(t)+" - Wert="+Str(PeekW(*Pointer-delta)/2)
; LineXY(OldX,OldY,XSize-t,(YSize/2)+(ValueL/32767.0)*YSize*YZoom,0)
LineXY(XSize-t,(YSize/2)-(ValueL/32767.0)*YSize*YZoom,XSize-t,(YSize/2)+(ValueL/32767.0)*YSize*YZoom,0)
; OldX=XSize-t
; OldY=(YSize/2)+(ValueL/32767.0)*YSize*YZoom
Next
StopDrawing()
EndProcedure
Vielleicht hat ja einer 'nen Tipp für mich.
Danke schon mal im Voraus.
Mac