Seite 1 von 2

FQ über normalen Lautsprecher

Verfasst: 19.04.2007 14:29
von Andreas_S
Hier ein Code mit dem man eine Frequenz über den Lautsprecher abspielen kann:

Code: Alles auswählen

Procedure InitDirectBeep_()
 InitSound() 
EndProcedure

Procedure DirectBeep_(fq,ms,Samplerate,Bitrate,Channels,Wait=1)
 avBytesPerSec=Channels*Bitrate/8*Samplerate
 secs.d=ms/1000
 *Mem=AllocateMemory(avBytesPerSec*secs+44)
  PokeB(*Mem+0,Asc("R"))
  PokeB(*Mem+1,Asc("I"))
  PokeB(*Mem+2,Asc("F"))
  PokeB(*Mem+3,Asc("F"))

  PokeL(*Mem+4,avBytesPerSec*secs+44)

  PokeB(*Mem+8,Asc("W"))
  PokeB(*Mem+9,Asc("A"))
  PokeB(*Mem+10,Asc("V"))
  PokeB(*Mem+11,Asc("E"))

  PokeB(*Mem+12,Asc("f"))
  PokeB(*Mem+13,Asc("m"))
  PokeB(*Mem+14,Asc("t"))
  PokeB(*Mem+15,Asc(" "))

  PokeL(*Mem+16,16)

  PokeW(*Mem+20,1)
  PokeW(*Mem+22,Channels)
  PokeL(*Mem+24,Samplerate)
  PokeL(*Mem+28,Channels*Bitrate/8*Samplerate)
  PokeW(*Mem+32,Bitrate/8*Channels)
  PokeW(*Mem+34,Bitrate)

  PokeB(*Mem+36,Asc("d"))
  PokeB(*Mem+37,Asc("a"))
  PokeB(*Mem+38,Asc("t"))
  PokeB(*Mem+39,Asc("a"))

  PokeL(*Mem+40,avBytesPerSec*secs)

  actsamplevalue.w

   For acttime=1 To samplerate*secs
    For actchannel=1 To channels
     actsamplevalue=32767*Sin(2*#PI*fq*acttime/samplerate)
     PokeW(*Mem+44+k,actsamplevalue)
     k+2
    Next
   Next

  Sound=CatchSound(#PB_Any,*Mem)
  PlaySound(Sound)
  SoundVolume(Sound,100)
   If Wait=1
    Delay(ms)
    FreeSound(Sound)
   EndIf
  FreeMemory(*Mem)
EndProcedure

InitDirectBeep_()

DirectBeep_(1000,1000,44100,16,2)
Ich hoffe den kann jemand verwenden.

Verfasst: 19.04.2007 14:32
von Andreas_S
Jetzt hab ich ihn in der Laberecke auf gemacht sch****!!!

Verfasst: 19.04.2007 14:34
von Kaeru Gaman
:lol: kein problem...

scotty, ein topic und zwei beiträge zum beamen...

Verfasst: 19.04.2007 14:35
von Andreas_S
Danke für's vershieben!

Verfasst: 19.04.2007 15:07
von ts-soft
Ne wave-datei in den Speicher poken ist ja mal was feines :allright:

Die Soundnummer 9999 solltest Du vielleicht auf 0 setzen, weiß zwar nicht,
ob es wie bei Gadgets ist, weil dann würde Speicher für 10000 Sounds
reserviert.

Verfasst: 19.04.2007 15:16
von Andreas_S
Nagut, hab ich nur gemacht das man nicht plötzlich mit der gleigen ID da steht. Normalerweise nimmt man ja die ID 0, oder?

Verfasst: 19.04.2007 15:19
von ts-soft
Dann nimmt man #PB_Any !
Dynamische IDs sollten immer in Include-Dateien, wiederverwendbaren
Proceduren, UserLibs usw. verwendet werden.

Verfasst: 19.04.2007 16:01
von Andreas_S
Gute Idee, schon geändert.

Verfasst: 19.04.2007 16:06
von Andreas_S
Wenn man das apspielen lasst ist doch am Schluss so ein Knacks.

Wie bekomm ich den weg?

Verfasst: 19.04.2007 16:48
von ts-soft
PBprogger hat geschrieben:Gute Idee, schon geändert.
Aber nicht genau in der Hilfe nachgelesen :wink:

Code: Alles auswählen

; falsch
;   CatchSound(#PB_Any,*Mem)
;   PlaySound(#PB_Any)
;   SoundVolume(#PB_Any,100)
;    If Wait=1
;     Delay(ms)
;     FreeSound(#PB_Any)
;    EndIf 

; richtig
MySound.l = CatchSound(#PB_Any, *Mem)
PlaySound(MySound)
SoundVolume(MySound, 100)
If Wait = 1
  Delay(ms)
  FreeSound(MySound)
EndIf