Erweiterte Soundbefehle

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Erweiterte Soundbefehle

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Beitrag von Stefan »

@Kaeru Gaman

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

Gruß
Stefan
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

:allright:
Bild
Win11 Pro 64-Bit, PB_6.11b1
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

cool :allright:

ich kam halt drauf, wegen sound für ace invaders... :wink:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag 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
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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) 
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
dige
Beiträge: 1236
Registriert: 08.09.2004 08:53

Re: Erweiterte Soundbefehle

Beitrag 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!!!
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
dige
Beiträge: 1236
Registriert: 08.09.2004 08:53

Beitrag von dige »

Weitere neue Soundbefehle im englischen Forum:
http://www.purebasic.fr/english/viewtopic.php?t=23336&
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten