TV-Noise
Verfasst: 22.02.2005 17:16
Ursprünglich war das dingen von benny, aber ich habs dann mal aufgebohrt und ein bissl -TV Bild gemacht.
Interressant ist das der Sound vorher im Speicher erzeugt wird.
oder als paket(Exe und source) hier runterladbar.
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