Seite 1 von 2

Erweiterte Soundbefehle

Verfasst: 27.01.2005 16:17
von Stefan
Hallo

Ich hab heute mal ein paar Sound-Befehle gecodet, die ich in der Sound-Library vermisse:
:D

Code: Alles auswählen

Structure DSBCAPS
  dwSize.l 
  dwFlags.l
  dwBufferBytes.l 
  dwUnlockTransferRate.l
  dwPlayCpuOverhead.l
EndStructure


Procedure IsSoundPlaying(Sound);returns weather the Sound is playing or not.
  Address=IsSound(Sound)
  If Address=0:ProcedureReturn 0:EndIf
  *DSB.IDirectSoundBuffer=PeekL(Address)
  *DSB\GetStatus(@Status)
  If Status=1 Or Status=5
    ProcedureReturn 1
  EndIf
  ProcedureReturn 0
EndProcedure

Procedure GetSoundPosition(Sound);returns the current position of the Sound.(in bytes)
  Address=IsSound(Sound)
  If Address=0:ProcedureReturn 0:EndIf
  *DSB.IDirectSoundBuffer=PeekL(Address)
  *DSB\GetCurrentPosition(@Position,0)
  ProcedureReturn Position
EndProcedure

Procedure SetSoundPosition(Sound,Position);sets the current position of the Sound.(in bytes)
  Address=IsSound(Sound)
  If Address=0:ProcedureReturn 0:EndIf
  *DSB.IDirectSoundBuffer=PeekL(Address)
  ProcedureReturn *DSB\SetCurrentPosition(Position)
EndProcedure

Procedure GetSoundSize(Sound);Returns the size of the Sound in bytes.
  Address=IsSound(Sound)
  If Address=0:ProcedureReturn 0:EndIf
  *DSB.IDirectSoundBuffer=PeekL(Address)
  Caps.DSBCAPS\dwSize=SizeOf(DSBCAPS)
  *DSB\GetCaps(@Caps)
  ProcedureReturn Caps\dwBufferBytes
EndProcedure




;Example:
InitSound()

File$=OpenFileRequester("Load wav-file","*.wav","wav-file |*.wav",0) 

Result=LoadSound(1,File$)

If Result=0:MessageRequester("ERROR","Can't load sound."):End:EndIf

OpenWindow(1,0,0,400,25,#PB_Window_MinimizeGadget|#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Play")

PlaySound(1)
Repeat
  Event=WindowEvent()
  
  SetWindowTitle(1,Str(GetSoundPosition(1))+"/"+Str(GetSoundSize(1)))
Until Event=#PB_Event_CloseWindow Or IsSoundPlaying(1)=0

Falls Interesse besteht, kann ich daraus auch eine UserLibrary machen. :wink:

Gruß
Stefan

Verfasst: 28.01.2005 03:01
von Kaeru Gaman
fallst du sowas kannst:

ich wär scharf auf ne proc, die nen sound ERZEUGT, die nur die frequenz übergeben bekommt.

sozusagen ein BEEP() für die soundkarte...

Verfasst: 29.01.2005 11:19
von Stefan
@Kaeru Gaman

Schau dir mal das an:
http://robsite.de/php/pureboard-archiv/ ... 999d18ba0b

Gruß
Stefan

Verfasst: 29.01.2005 11:59
von Falko
:allright:

Verfasst: 29.01.2005 13:04
von Kaeru Gaman
cool :allright:

ich kam halt drauf, wegen sound für ace invaders... :wink:

Verfasst: 29.01.2005 18:21
von AndyX
Ich hab ein bisschen mit dem code (beep für soundkarte) gespielt, und ne zahl dazugegeben, und auf einmal hört sich das an wie ne verzerrte e-gitarre. :o :o :o :mrgreen: :mrgreen: :mrgreen: :mrgreen: :D :D :D :D :D

Und zwar bei:

Code: Alles auswählen

SoundValue = 127 + 127 * Sin(i * w / #SampleRate)

Code: Alles auswählen

*1.55
hintendrangeben. <)

Als Melodie zum Abrocken :lol: :mrgreen::

Code: Alles auswählen

MakeSound(0,420,1000)
makesound(1,600,500)
makesound(2,640,250)
makesound(3,620,125)
makesound(4,2500,600)

PlaySound(0)
Delay(990)
PlaySound(1)
Delay(490)
PlaySound(2)
Delay(240)
PlaySound(3)
Delay(110)
PlaySound(4)
Delay(2500)

QuitSound(0)
quitsound(1)
quitsound(2)
quitsound(3)
quitsound(4)
Klingt zwar nicht so ganz deliziös, aber schon mal n anfang. :mrgreen:

Mal schauen, wie man nen klavier oder e-bass sound hinkriegt. :lol: :lol: :lol:

Mfg,
AndyX

Verfasst: 29.01.2005 18:43
von Falko
Hier ein toller Effekt. Klingt wie eine Sirene
[EDIT] Nochmals vielen Dank an GPI für die Konvertierung von Delphi nach Purebasic[/Edit]

Code: Alles auswählen

Structure WAVE 
wFormatTag.w 
nChannels.w 
nSamplesPerSec.l 
nAvgBytesPerSec.l 
nBlockAlign.w 
wBitsPerSample.w 
cbSize.w 
EndStructure 

Procedure MakeSound(nr,Frequency, duration); 
  SoundValue.b 
  w.f; // omega ( 2 * pi * frequency) 
  #Mono= $0001; 
  #SampleRate= 11025; // 8000, 11025, 22050, or 44100 
  #RiffId.s = "RIFF"; 
  #WaveId.s=  "WAVE"; 
  #FmtId.s=   "fmt "; 
  #DataId.s=  "data"; 
  ;#pi=3.1415 

  WaveFormatEx.WAVE 
  WaveFormatEx\wFormatTag=#WAVE_FORMAT_PCM; 
  WaveFormatEx\nChannels =#Mono; 
  WaveFormatEx\nSamplesPerSec = #SampleRate; 
  WaveFormatEx\wBitsPerSample = $0008; 
  WaveFormatEx\nBlockAlign = (WaveFormatEx\nChannels * WaveFormatEx\wBitsPerSample) /8 
  WaveFormatEx\nAvgBytesPerSec = WaveFormatEx\nSamplesPerSec * WaveFormatEx\nBlockAlign; 
  WaveFormatEx\cbSize = 0; 
  
  DataCount = (duration * #SampleRate)/1000; // sound data 
  RiffCount = 4+4 +4+ SizeOf(WAVE)+4 +4+ DataCount 
  
  start=AllocateMemory(RiffCount+100) 
  MS=start 
  
  PokeS(MS,#RiffId):MS+4   ;'RIFF' 
  PokeL(MS,RiffCount):MS+4 ;file Data size 
  PokeS(MS,#WaveId):MS+4   ;'WAVE' 
  PokeS(MS,#FmtId):MS+4    ;'fmt ' 
  TempInt = SizeOf(WAVE); 
  PokeL(MS,TempInt):MS+4   ;TWaveFormat data size 
  
  PokeW(MS,WaveFormatEx\wFormatTag):MS+2; WaveFormatEx record 
  PokeW(MS,WaveFormatEx\nChannels):MS+2 
  PokeL(MS,WaveFormatEx\nSamplesPerSec):MS+4 
  PokeL(MS,WaveFormatEx\nAvgBytesPerSec):MS+4 
  PokeW(MS,WaveFormatEx\nBlockAlign):MS+2 
  PokeW(MS,WaveFormatEx\wBitsPerSample):MS+2 
  PokeW(MS,WaveFormatEx\cbSize):MS+2 
  
  PokeS(MS,#DataId):MS+4   ;'data' 
  PokeL(MS,DataCount):MS+4 ;sound data size 
  
  ;{Calculate And write out the tone signal}  // now the Data values 
  
  w = 2 * #pi * Frequency;  omega 
  For i = 0 To DataCount - 1 
   ;// wt = w *i /SampleRate 
   ;SoundValue := 127 + trunc(127 * Sin(i * w / SampleRate)); 
   SoundValue = 127 + 127 * Sin(i * w / #SampleRate); 
   PokeB(MS,SoundValue):MS+1; 
  Next 
  ;// you could save the wave tone To file with : 
  ;// MS.Seek(0, soFromBeginning); 
  ;// MS.SaveToFile('C:\MyFile.wav'); 
  ;// then reload And play them without having To 
  ;// construct them each time. 
  ;{now play the sound} 
  ;sndPlaySound(MS.Memory, SND_MEMORY Or SND_SYNC); 
  ;MS.Free; 
  
  CatchSound(nr,start) 
EndProcedure 
Procedure QuitSound(nr) 
  StopSound(nr) 
  FreeSound(nr) 
  FreeMemory(nr) 
EndProcedure 
InitSound()
 OpenWindow(0,0,50,50,50,#PB_Window_SystemMenu ,"BEEP")  
Repeat 
   w + 5 
   If w = 360: w = 0: EndIf 
   b.f = 2 * 3.141 * w / 360 ; Winkel zu Bogenmaß 
   f = Sin(b) * 400 + 500 
MakeSound(0,f*5,100) 
PlaySound(0) 
Delay(5)
Until WindowEvent()=#PB_Event_CloseWindow
CloseWindow(0)
QuitSound(0) 

Re: Erweiterte Soundbefehle

Verfasst: 30.11.2006 14:05
von dige
Stefan hat geschrieben:Hallo

Ich hab heute mal ein paar Sound-Befehle gecodet, die ich in der Sound-Library vermisse:

Gruß
Stefan
Super! :allright:
Genau das habe ich verzweifelt gesucht. Funktioniert auch mit P4.01
fantastisch. Vielen Dank Stefan!!!

Verfasst: 30.11.2006 14:20
von nco2k
@Stefan
könntest du bitte dein IsSoundPlaying() zu einem SoundStatus() ummodifizieren.

-1: Sound ist unterbrochen ("paused").
0: Sound ist angehalten ("stopped").
> 0: Sound wird abgespielt.

ausserdem wäre es richtig geil wenn du ein PauseSound() und ResumeSound() basteln könntest. :allright:

edit: oops 27 Jan 2005. :oops:

c ya,
nco2k

Verfasst: 30.11.2006 14:36
von dige
Weitere neue Soundbefehle im englischen Forum:
http://www.purebasic.fr/english/viewtopic.php?t=23336&