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:
Beitrag
von Stefan » 27.01.2005 16:17
Hallo
Ich hab heute mal ein paar Sound-Befehle gecodet, die ich in der Sound-Library vermisse:
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.
Gruß
Stefan
Kaeru Gaman
Beiträge: 17389 Registriert: 10.11.2004 03:22
Beitrag
von Kaeru Gaman » 28.01.2005 03:01
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.
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 » 29.01.2005 11:59
Win11 Pro 64-Bit, PB_6.11b1
Kaeru Gaman
Beiträge: 17389 Registriert: 10.11.2004 03:22
Beitrag
von Kaeru Gaman » 29.01.2005 13:04
cool
ich kam halt drauf, wegen sound für ace invaders...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
AndyX
Beiträge: 1272 Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:
Beitrag
von AndyX » 29.01.2005 18:21
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.
Und zwar bei:
hintendrangeben.
Als Melodie zum Abrocken
:
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.
Mal schauen, wie man nen klavier oder e-bass sound hinkriegt.
Mfg,
AndyX
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 » 29.01.2005 18:43
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)
Win11 Pro 64-Bit, PB_6.11b1
dige
Beiträge: 1236 Registriert: 08.09.2004 08:53
Beitrag
von dige » 30.11.2006 14:05
Stefan hat geschrieben: Hallo
Ich hab heute mal ein paar Sound-Befehle gecodet, die ich in der Sound-Library vermisse:
Gruß
Stefan
Super!
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."
nco2k
Beiträge: 892 Registriert: 08.09.2004 23:13
Beitrag
von nco2k » 30.11.2006 14:20
@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.
edit: oops 27 Jan 2005.
c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
dige
Beiträge: 1236 Registriert: 08.09.2004 08:53
Beitrag
von dige » 30.11.2006 14:36
"Papa, ich laufe schneller - dann ist es nicht so weit."