Seite 1 von 4

TV-Noise

Verfasst: 22.02.2005 17:16
von Rings
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.

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

Verfasst: 22.02.2005 17:35
von MVXA
Bei mir beendet sich das Programm sofort :(. Ich sehe zwar kurz nur eine Frame aber dann ist auch Programm sofort wieder weg. Wenn ich den Debugger mit starte wird der gleich mit beendet (ich hab zum test mal ein paar test strings geschrieben). Hab PB 3.92 mit Win XP SP1.

Verfasst: 22.02.2005 17:39
von bluejoke
Geilooo!

Ich hab Bennys TV-Noise als Bildschirmschoner, machst du aus deinem auch noch einen?

Verfasst: 22.02.2005 17:59
von DarkDragon
:mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Meine Eltern waren erstmal erschreckt, als ich denen das Ding vorgeführt hab. Bei mir stürtzt nichts ab.

Verfasst: 22.02.2005 18:23
von Rob
Das ist gut ^_^
Nur stürzt es leider nach dem ersten Testbild ab: "The specific output is NULL" in Zeile 114 (StartDrawing(ScreenOutput()))Hab PB 3.92.

Verfasst: 22.02.2005 18:29
von bluejoke
Die Exe funzt bei mir auf jeden Fall tadellos. Mitm source hab ichs nicht probiert.
WinXP Sp.1

Verfasst: 22.02.2005 18:46
von benny
Probiert mal Zeile 2o5 + 2o6 mit folgenden zu ersetzen:

Code: Alles auswählen

   For y = 0 To #SCREEN_Y-1
    For x = 0 To #SCREEN_X-1

@Rings:

Sauber gemacht ... gefällt mir :!:

Verfasst: 22.02.2005 18:56
von orange-blue
Gefallt ma sehr gut!
Eigentlich könnte man aus diesen ganzen Sachen/Effekten eine PB-Bildschrimschoner Sammlung machen! :mrgreen:

Verfasst: 22.02.2005 19:16
von Leo
Sehr schön :allright:

Ich hatte fast das Gefühl, wirklich TV zu gucken ^^

Verfasst: 22.02.2005 19:18
von ts-soft
Nachdem ich die Änderung von Benny eingebaut habe funzt beides :allright: