Interressant ist das der Sound vorher im Speicher erzeugt wird.
oder als paket(Exe und source) hier runterladbar.
Code: Alles auswählen
;TV-Test-picture
;#Swidht=640
;#SHeight=480
#SCREEN_X=800
#SCREEN_Y=600
#SCREEN_DEPTH=32
#MyFontID=1
Sender.s="PUREBASIC"
XSchritt=#SCREEN_X/20
YSchritt=#SCREEN_Y/15
Mode=1
DelayZeit=5000
;Make tv-noise, generate a sound in mem without a WAV-file
#pi = 3.141593 ; pi
fq = 250 ; frequenz in Hz for sinustone
#samplerate = 44100 ; samplerate
#bitrate = 16 ; Bits per sample, #bitrate Mod 8 must be 0 !
#channels = 2 ; number of channels
#secs = 1 ; time for the tone in seconds
BytesNeeded=#samplerate * #secs * #channels *2
BytesNeeded=BytesNeeded + 44;(44 is the header)
mem1=GlobalAlloc_(#GMEM_FIXED,Bytesneeded) ;Api only ;)
mem2=GlobalAlloc_(#GMEM_FIXED,Bytesneeded)
avBytesPerSec.l = #channels*#bitrate/8*#samplerate ; calculate the average bytes per second
Global actsamplevalue.w ; for signed RAW data
offset=44
For acttime = 1 To #samplerate * #secs
For actchannel = 1 To #channels
If fq <= 150
m = 1
ElseIf fq >= 300
m = -1
EndIf
fq + m
actsamplevalue = 32766 * Sin(2 * #pi * fq * acttime / #samplerate)
If actsamplevalue <20000
actsamplevalue = actsamplevalue +5000
EndIf
PokeW(mem2+offset,Random(32765))
PokeW(mem1+offset,actsamplevalue )
offset+2
Next
Next
PokeL(mem1,$46464952) ;
PokeL(mem1+4,36+avBytesPerSec*#secs) ;WriteLong(36+avBytesPerSec*#secs) ; normally filesize - 8 Bytes, here a bit tricky, fmt-chunk + data-chunk
PokeL(mem1+8,$45564157)
PokeL(mem1+12,$20746D66)
PokeL(mem1+16,16);WriteLong(16) ; chunk data size
PokeW(mem1+20,1);WriteWord(1) ; compression code
PokeW(mem1+22,#Channels);WriteWord(#channels) ; number of channels
PokeL(mem1+24,#samplerate);WriteLong(#samplerate) ; samplerate
PokeL(mem1+28,avBytesPerSec);WriteLong(avBytesPerSec) ; average bytes per second, here 2(channels)*2(block align)*44100(samplerate)
PokeW(mem1+32,#bitrate/8*#channels);WriteWord(#bitrate/8*#channels) ; Block Align ('bytes per sample')
PokeW(mem1+34,#bitrate);WriteWord(#bitrate) ; Bits per sample
PokeS(Mem1+36,"data");WriteByte(Asc("d"))
PokeL(mem1+40,avBytesPerSec*#secs);;WriteLong(avBytesPerSec*#secs) ; data chunk size in byes
PokeL(mem2,$46464952) ;
PokeL(mem2+4,36+avBytesPerSec*#secs) ;WriteLong(36+avBytesPerSec*#secs) ; normally filesize - 8 Bytes, here a bit tricky, fmt-chunk + data-chunk
PokeL(mem2+8,$45564157)
PokeL(mem2+12,$20746D66)
PokeL(mem2+16,16);WriteLong(16) ; chunk data size
PokeW(mem2+20,1);WriteWord(1) ; compression code
PokeW(mem2+22,#Channels);WriteWord(#channels) ; number of channels
PokeL(mem2+24,#samplerate);WriteLong(#samplerate) ; samplerate
PokeL(mem2+28,avBytesPerSec);WriteLong(avBytesPerSec) ; average bytes per second, here 2(channels)*2(block align)*44100(samplerate)
PokeW(mem2+32,#bitrate/8*#channels);WriteWord(#bitrate/8*#channels) ; Block Align ('bytes per sample')
PokeW(mem2+34,#bitrate);WriteWord(#bitrate) ; Bits per sample
PokeS(Mem2+36,"data");WriteByte(Asc("d"))
PokeL(mem2+40,avBytesPerSec*#secs);;WriteLong(avBytesPerSec*#secs) ; data chunk size in byes
; Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
#SoundSync = $0
#SoundASync = $1
#SoundMemory = $4
#SoundLoop = $8
#SoundNoStop = $10
#SoundNoDefault = $2
If InitSprite()=0 Or InitKeyboard() = 0
MessageRequester("Error", "Can't open DirectX 7 Or later", 0)
End
EndIf
If OpenScreen(#SCREEN_X, #SCREEN_Y, #SCREEN_DEPTH, "TV-TEST")
Flags=#PB_Font_Bold
Result = LoadFont(#MyFontID, "Times New Roman", 32, Flags)
UseFont(#MyFontID)
StartDrawing(ScreenOutput())
Pitch = DrawingBufferPitch()
StopDrawing()
White = $FFFFFF
Noise = 0
Carry = 0
Index = 0
Seed = $12345
Repeat
FlipBuffers()
If IsScreenActive()
ClearScreen($50,$50,$50)
StartDrawing(ScreenOutput())
T1=GetTickCount_()
If T1>T0+DelayZeit
If Mode=1
Mode=2
result=sndPlaySound_(mem2,#SoundASync |#SoundMemory|#SoundLoop )
Else
Mode=1
result=sndPlaySound_(mem1,#SoundASync |#SoundMemory|#SoundLoop )
EndIf
T0=T1
EndIf
If Mode=1
;Draw grid
DrawingMode(1)
X=0
Y=0
While x<#SCREEN_X-1
LineXY(X, 0, X, #SCREEN_Y-1 , $FFFFFF)
X+XSchritt
While y< #SCREEN_Y-1
LineXY(0, y, #SCREEN_X-1, y , $FFFFFF)
y+YSchritt
Wend
Wend
LineXY(#SCREEN_X-1, 0, #SCREEN_X-1, #SCREEN_Y-1 , $FFFFFF)
LineXY(0, #SCREEN_Y-1, #SCREEN_X-1, #SCREEN_Y-1 , $FFFFFF)
;draw boxes
Box(XSchritt*4,YSchritt*2,xSchritt*1.5,YSchritt*3,$FFFFFF) ;white
Box(XSchritt*5.5,YSchritt*2,xSchritt*1.5,YSchritt*3,$00FFFF);yellow
Box(XSchritt*7,YSchritt*2,xSchritt*1.5,YSchritt*3,$AAAA00);ligh bluegreen
Box(XSchritt*8.5,YSchritt*2,xSchritt*1.5,YSchritt*3,$00AA44);green
Box(XSchritt*10,YSchritt*2,xSchritt*1.5,YSchritt*3,$FF00FF);purple
Box(XSchritt*11.5,YSchritt*2,xSchritt*1.5,YSchritt*3,$0000FF);red
Box(XSchritt*13,YSchritt*2,xSchritt*1.5,YSchritt*3,$FF0000);blue
Box(XSchritt*14.5,YSchritt*2,xSchritt*1.5,YSchritt*3,$000000);black
Box(XSchritt*4,YSchritt*5,xSchritt*3,YSchritt*2,$000000);black
Box(XSchritt*7,YSchritt*5,xSchritt*3,YSchritt*2,$505050);darkgrey
Box(XSchritt*10,YSchritt*5,xSchritt*3,YSchritt*2,$A0A0A0);lighgrey
Box(XSchritt*13,YSchritt*5,xSchritt*3,YSchritt*2,$FFFFFF);white
Box(XSchritt*4,YSchritt*7,xSchritt*12,YSchritt*3,$FFFFFF);white
Box(XSchritt*6,YSchritt*7+1,xSchritt*8,YSchritt-1,$000000);black
Box(XSchritt*5.5,YSchritt*8,xSchritt*10.5,YSchritt,$505050);darkgrey
For I=1 To 5
Box(XSchritt*6 + (I* XSchritt/3),YSchritt*8,xSchritt/6,YSchritt,$FFFFFF);white
Box(XSchritt*6 + XSchritt/6 + (I*XSchritt/3),YSchritt*8,xSchritt/6,YSchritt,$000000);white
;Box(XSchritt*4.25+ I*(XSchritt/4),YSchritt*8,xSchritt/4,YSchritt,$000000);black
Next I
For I=1 To 10
Box(XSchritt*8 + (I* XSchritt/6),YSchritt*8,xSchritt/12,YSchritt,$FFFFFF);white
Box(XSchritt*8 + XSchritt/12 + (I*XSchritt/6),YSchritt*8,xSchritt/12,YSchritt,$000000);white
;Box(XSchritt*4.25+ I*(XSchritt/4),YSchritt*8,xSchritt/4,YSchritt,$000000);black
Next I
mschritt=2
For I=1 To 20
Box(XSchritt*10.5 + (I* Mschritt*2),YSchritt*8,mSchritt,YSchritt,$FFFFFF);white
Box(XSchritt*10.5 + 2 + (I*mSchritt*2),YSchritt*8,mschritt,YSchritt,$000000);white
;Box(XSchritt*4.25+ I*(XSchritt/4),YSchritt*8,xSchritt/4,YSchritt,$000000);black
Next I
Box(XSchritt*13,YSchritt*8,xSchritt*2.5,YSchritt,RGB(174,84,0));brown
FrontColor($FF,$FF,$FF)
DrawingFont(FontID())
Locate((#SCREEN_X - TextLength(sender) )/2,YSchritt*7-2)
DrawText(Sender)
LineXY(#SCREEN_X/2, YSchritt*6,#SCREEN_X/2, YSchritt*9 , $FFFFFF)
LineXY(#SCREEN_X/2+xSchritt/4, YSchritt*9,#SCREEN_X/2+xSchritt/4, YSchritt*10, $000000)
LineXY(xSchritt*9.75, YSchritt*9,#SCREEN_X/2+xSchritt/4, YSchritt*9, $000000)
LineXY(xSchritt*9.75, YSchritt*9,#SCREEN_X/2+xSchritt/4, YSchritt*10, $000000)
FillArea(#SCREEN_X/2, YSchritt*9.1, 0, 0)
Box(XSchritt*4,YSchritt*10,xSchritt*8,YSchritt,$3333FF);red
Box(XSchritt*4,YSchritt*11,xSchritt*8,YSchritt,$FF3333);blue
Box(XSchritt*12,YSchritt*10,xSchritt*4,YSchritt*2,$505050);darkgrey
;Draw circle
DrawingMode(4)
Ellipse(#SCREEN_X/2, #SCREEN_Y/2, #SCREEN_Y/2 -1,#SCREEN_Y/2 -1 , $FFFFFF)
EndIf
If Mode=2
For y = 0 To #SCREEN_Y
For x = 0 To #SCREEN_X
noise = seed;
noise = noise >> 3
noise = noise ! seed
carry = noise & 1
seed = seed >> 1
seed = seed | ( carry << 30)
noise = noise & $FF
*Screen.LONG = DrawingBuffer()
*Screen + (Pitch * y) + (x*4)
;*Screen\l =Random(1) * $FFFFFF
*Screen\l = (noise<<16) | (noise << 8) | noise
Next x
Next y
EndIf
StopDrawing()
EndIf
Delay(1)
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
Else
MessageRequester("Error", "Can't open a 640*480 - 16 bit screen !", 0)
EndIf
GlobalFree_(mem1)
GlobalFree_(mem2)
End