Wave-Synthesizer

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

mpmxyz

Betreff: Wave-Synthesizer

BeitragSa, Jul 11, 2009 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir gestern abend das Wave-Format angesehen.
Und da diese Seite es gut erklärt, habe ich nun eine Art Soundgenerator programmiert.
Code: [AUSKLAPPEN]
;;Einstellungen;;
Local Laenge=72000
Local Samplerate=44100
Local Bittiefe=16
Local Kanaele=2
;;;;;;;;;;;;;;;;;


Local Blockgroesse=Kanaele*Bittiefe/8
Local BytesProSekunde=Blockgroesse*Samplerate

Local File=WriteFile("Test.wav")

WriteByte File,Asc("R");Riff-Header
WriteByte File,Asc("I")
WriteByte File,Asc("F")
WriteByte File,Asc("F")
WriteInt File,(4+24+8+Kanaele*Laenge*Bittiefe/8)   ;Länge der restlichen Datei
WriteByte File,Asc("W");4 Bytes
WriteByte File,Asc("A")
WriteByte File,Asc("V")
WriteByte File,Asc("E")


WriteByte File,Asc("f");"fmt "-Chunk; 24 Bytes
WriteByte File,Asc("m")
WriteByte File,Asc("t")
WriteByte File,Asc(" ")
WriteInt File,16
WriteShort File,1      ;PCM-Format
WriteShort File,Kanaele   ;
WriteInt File,Samplerate
WriteInt File,BytesProSekunde
WriteShort File,Blockgroesse
WriteShort File,Bittiefe


Local Wert
Local Time
Local Kanal
Local Bytes

WriteByte File,Asc("d");8
WriteByte File,Asc("a")
WriteByte File,Asc("t")
WriteByte File,Asc("a")
WriteInt File,Kanaele*Laenge*Bittiefe/8
For Time=0 To Laenge-1
   For Kanal=0 To Kanaele-1
      Select Kanal
         Case 0;links/Mono
            Wert=Sin(2*Time*1.5^Sin(Time/25.0)*1.0000025^Time)*20000*0.99995^Time*Sin(Time/100.0);Eigener Code hier
         Case 1;rechts
            Wert=Sin(2*Time*1.5^Sin(Time/25.0)*1.0000025^Time)*20000*0.99995^Time*Cos(Time/100.0);Eigener Code hier
         ;Case 2
         ;   Wert=
      End Select
      Select Bittiefe/8
         Case 1
            WriteByte File,Wert      ;Von 0 bis 255
         Case 2
            WriteShort File,Wert   ;Von -2^15 bis +2^15-1
      End Select
   Next
Next


CloseFile File

;Test
Local Sound=LoadSound("Test.wav")

Repeat
   If MouseHit(1)
      PlaySound(Sound)
;   ElseIf MouseDown(1)      ;Für schnell zu wiederholende Geräusche "entkommentieren".
;      PlaySound(Sound)
   EndIf
   
   Delay 100
Until KeyHit(1)
End


Im Moment muss man seine "Soundformel" in den Code eingeben.
Sie sollte von der Zeit abhängig sein.
Eine Zeiteinheit entspricht einem Sample.
Bei einer Samplerate von 44100 Hz entspricht das ca. 22,7 µs.

Ihr könnt eure eigenen, sich gut anhörenden Versuche hier hineinstellen.
Die Formel(n) und die Dateieigenschaften reichen dafür aus.
Ich werde auch noch eine Liste mit Formeln in diese Nachricht einfügen.

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

aletes

BeitragSa, Jul 11, 2009 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Einfach nur geil Very Happy
Hier meine Versuche:

Das hört sich ein wenig komisch an:
Laenge=72000
Samplerate=1410
Bittiefe=16
Kanaele=5

Das bringt euren Schreibtisch zum Beben(Ihr müsst eure Lautsprecher ein wenig lauter stellen, sonst hört ihr nichts Wink ):
Laenge=72000
Samplerate=1410
Bittiefe=16
Kanaele=1

orpheus_2003

BeitragSo, Jul 12, 2009 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Cooles Teil.....

Das ist geil:

Local Laenge=122000
Local Samplerate=10
Local Bittiefe=16
Local Kanaele=7
GazerStar - the beginning
http://gazerstar.lexigame.de/
Wizard (Worktitel)
http://wizard.lexigame.de

Chrise

BeitragSo, Jul 12, 2009 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie geil:
Code: [AUSKLAPPEN]
Local Laenge=72000
Local Samplerate=1410
Local Bittiefe=16
Local Kanaele=10


Code: [AUSKLAPPEN]

Local Laenge=72000
Local Samplerate=100
Local Bittiefe=16
Local Kanaele=20


Mein bisheriger Favorit
Code: [AUSKLAPPEN]

Local Laenge=44000
Local Samplerate=20000
Local Bittiefe=16
Local Kanaele=5


Code: [AUSKLAPPEN]
Local Laenge=144000
Local Samplerate=5050
Local Bittiefe=16
Local Kanaele=1


Also mir gefällts ^^
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

mpmxyz

BeitragSo, Jul 12, 2009 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist ja seltsam...
Ihr habt wohl keine Lust, die Formeln zu ändern...
Es ist aber trotzdem schön, dass es so vielen gefällt. ^^

Hier sind mal meine Versuche:

Das war das erste, was ich nach einem normalem Ton gemacht habe:
Code: [AUSKLAPPEN]
Laenge=144000
Samplerate=44100
Bittiefe=16
Kanaele=1
;Mono
Wert=Sin(2*Time*1.5^Sin(Time/25.0)*1.0000025^Time)*10000*0.99995^Time


Das hört sich in etwa wie ein Xylophon an:
Code: [AUSKLAPPEN]
Laenge=72000
Samplerate=44100
Bittiefe=16
Kanaele=1
;Mono
Wert=Sin(2*Time)*20000*0.9999^Time


Und das sollte eine Quinte mit einem "Xylophon" sein:
Code: [AUSKLAPPEN]
Laenge=72000
Samplerate=44100
Bittiefe=16
Kanaele=1
;Mono
Wert=Sin(2*Time)*15000*0.99995^Time+Sin(2.0^(3.0/7.0)*Time)*15000*0.99995^Time


Schon einmal etwas von "Schwebungen" gehört?
Code: [AUSKLAPPEN]
Laenge=72000
Samplerate=44100
Bittiefe=16
Kanaele=1
;Mono
Wert=Sin(2*Time)*15000*0.99995^Time+Sin(2.1*Time)*15000*0.99995^Time


Laser-Sounds für alle:
Code: [AUSKLAPPEN]
Laenge=36000
Samplerate=44100
Bittiefe=16
Kanaele=1
;Mono
Wert=Sin(15*Time*0.9999^Time)*25000*0.999^Time


Mit Zufallsbefehlen lassen sich interessante Effekte erzielen:
Code: [AUSKLAPPEN]
Laenge=36000
Samplerate=44100
Bittiefe=16
Kanaele=1
;Mono
Wert=Sin(3*Time/Log(Time)*Log(5))*25000*0.9999^(Time*2)+Rand(-5000,5000)*0.999^(Time*2)


Wer eher auf heutige Waffen setzt:
Code: [AUSKLAPPEN]
Laenge=36000
Samplerate=44100
Bittiefe=16
Kanaele=1
;Mono
Local RDN,OLDRDN
If Time Mod 10=0 Then OLDRDN=RDN:RDN=Rand(-30000,30000)
Wert=(RDN*(Time Mod 10)+OLDRDN*(10-Time Mod 10))*0.9999^(Time*2)/10


Edit: Dieser Sound kommt mir irgendwoher bekannt vor:
Code: [AUSKLAPPEN]
Laenge=72000
Samplerate=44100
Bittiefe=16
Kanaele=1
;Mono
Wert=Sin(Time*Sqr(1.001)^Time)*15000





Mal sehen, ob jetzt jemand etwas an den Formeln selbst herumschraubt. Smile
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

n-Halbleiter

BeitragMo, Jul 13, 2009 12:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Fernseher ist ja mal, abgesehen von dem Rauschen am Ende, super. Wink

Ich habe auch ein wenig herumexperimentiert, allerdings mit deiner Formel für "heutige Waffen". Das einzige, mit dem ich noch nicht so zufrieden bin, ist die Länge. Ich finde auf die schnelle keine, bei der das Rauschen am Ende ( Rolling Eyes ) weg ist. Naja...

Code: [AUSKLAPPEN]

Laenge=13600
Samplerate=44100
Bittiefe=16
Kanaele=1

Local RDN,OLDRDN
If Time Mod Rand(8,12)=0 Then OLDRDN=RDN:RDN=Rand(-30000,30000)
Wert=(RDN*(Time Mod Rand(8,12))+OLDRDN*(15-Time Mod Rand(8,12)))*0.9999^(Time*2)/10


Viel Spaß noch. Wink
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

4pac

Betreff: WAV-Synth mit GUI

BeitragSa, Okt 03, 2009 18:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Finde ich ja total geil, das Gerät Smile hab mir heute mal den Spaß gemacht, das ganze in eine GUI mit BlitzPlus reinzusetzen. Richtig cool wird es allerdings erst, wenn der Formel-Parser eingebaut ist, denn die Formel muss man im Moment nach wie vor im Quellcode editieren.

Code: [AUSKLAPPEN]

; GLOBALS DES WAV-SYNTHS
Global Laenge
Global Samplerate
Global Bittiefe
Global Kanaele
;;;;;;;;;;;;;;;;;
Global Wert
Global Time
Global Kanal
Global Bytes


; ANFANG GUI AUFBAU ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

window=CreateWindow( "mpmxyz´s WAV-Synth",GadgetWidth(Desktop())/4,GadgetHeight(Desktop())/4,550,450,0,1)
panel_0=CreatePanel( 0,0,600,430,window )
SetPanelColor panel_0, 128,128,128
SetPanelImage panel_0,"res\mainbg.jpg"

panel_1=CreatePanel( 20,40,492,345,panel_0 )
SetPanelColor panel_1, 128,128,128
SetPanelImage panel_1,"res\panelbg.jpg"

; 1. Eingabebereich -------------------------------------------
;label_laenge = CreateLabel("Länge",20,40,80,20,panel_1)
Global slider_laenge = CreateSlider( 120,40,250,20,panel_1)
SetSliderRange(slider_laenge,2000,288000)

Global txtfield_laenge = CreateTextField( 390,40,60,20,panel_1)
SetGadgetText(txtfield_laenge,"1")

; 2. Eingabebereich -------------------------------------------
;label_samplerate = CreateLabel("Samplerate",20,70,80,20,panel_1)
Global slider_samplerate = CreateSlider( 120,70,250,20,panel_1)
SetSliderRange(slider_samplerate,500,96000)

Global txtfield_samplerate = CreateTextField( 390,70,60,20,panel_1)
SetGadgetText(txtfield_samplerate,"1")

; 3. Eingabebereich -------------------------------------------
;label_bittiefe = CreateLabel("Bittiefe",20,100,80,20,panel_1)
Global slider_bittiefe = CreateSlider( 120,100,250,20,panel_1)
SetSliderRange(slider_bittiefe,2,50)

Global txtfield_bittiefe = CreateTextField( 390,100,60,20,panel_1)
SetGadgetText(txtfield_bittiefe,"1")

; 4. Eingabebereich -------------------------------------------
;label_kanaele = CreateLabel("Kanäle",20,130,80,20,panel_1)
Global slider_kanaele = CreateSlider( 120,130,250,20,panel_1)
SetSliderRange(slider_kanaele,1,33)

Global txtfield_kanaele = CreateTextField( 390,130,60,20,panel_1)
SetGadgetText(txtfield_kanaele,"1")

; Formel-Eingabe-----------------------------------------------
Global txtfield_formel = CreateTextField( 40,210,370,20,panel_1)
DisableGadget (txtfield_formel)
btn_formeleditor = CreateButton("...",420,210,30,20,panel_1)
DisableGadget (btn_formeleditor)

; -------------------------------------------------------------
btn_generate = CreateButton("Generieren",150,290,100,25,panel_1)
btn_savesound = CreateButton("WAV Speichern",260,290,100,25,panel_1)

; ENDE GUI AUFBAU ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''



While Not KeyHit(1)

   WaitEvent()
   Select EventID()
   
      Case $401 ; ein Gadget-Event
      
         Select EventSource()
         
            Case slider_laenge
               SetGadgetText(txtfield_laenge, SliderValue(slider_laenge))
               If SliderValue(slider_laenge) = 0 Then SetGadgetText(txtfield_laenge,1)
            Case slider_samplerate
               SetGadgetText(txtfield_samplerate, SliderValue(slider_samplerate))
               If SliderValue(slider_samplerate) = 0 Then SetGadgetText(txtfield_samplerate,1)
            Case slider_bittiefe
               SetGadgetText(txtfield_bittiefe, SliderValue(slider_bittiefe))
               If SliderValue(slider_bittiefe) = 0 Then SetGadgetText(txtfield_bittiefe,1)
            Case slider_kanaele
               SetGadgetText(txtfield_kanaele, SliderValue(slider_kanaele))
               If SliderValue(slider_kanaele) = 0 Then SetGadgetText(txtfield_kanaele,1)
               
            Case btn_generate
               Laenge=TextFieldText$(txtfield_laenge)
               Samplerate=TextFieldText$(txtfield_samplerate)
               Bittiefe=TextFieldText$(txtfield_bittiefe)
               Kanaele=TextFieldText$(txtfield_kanaele)
               Gosub generate
               ;FreeSound Sound
            Case btn_savesound
               dateiname$ = RequestFile$("WAV-Datei speichern unter","WAV",1)
               CopyFile "Test.wav", dateiname$
               
         End Select
         
      Case $803
         Exit
   
   End Select
   
   
Wend


End

; -------------------------------
.generate

Local Blockgroesse=Kanaele*Bittiefe/8
Local BytesProSekunde=Blockgroesse*Samplerate

Local File=WriteFile("Test.wav")

WriteByte File,Asc("R");Riff-Header
WriteByte File,Asc("I")
WriteByte File,Asc("F")
WriteByte File,Asc("F")
WriteInt File,(4+24+8+Kanaele*Laenge*Bittiefe/8)   ;Länge der restlichen Datei
WriteByte File,Asc("W");4 Bytes
WriteByte File,Asc("A")
WriteByte File,Asc("V")
WriteByte File,Asc("E")


WriteByte File,Asc("f");"fmt "-Chunk; 24 Bytes
WriteByte File,Asc("m")
WriteByte File,Asc("t")
WriteByte File,Asc(" ")
WriteInt File,16
WriteShort File,1      ;PCM-Format
WriteShort File,Kanaele   ;
WriteInt File,Samplerate
WriteInt File,BytesProSekunde
WriteShort File,Blockgroesse
WriteShort File,Bittiefe

WriteByte File,Asc("d");8
WriteByte File,Asc("a")
WriteByte File,Asc("t")
WriteByte File,Asc("a")
WriteInt File,Kanaele*Laenge*Bittiefe/8
For Time=0 To Laenge-1
   For Kanal=0 To Kanaele-1
      Select Kanal
         Case 0;links/Mono
            Wert=Sin(2*Time*1.5^Sin(Time/25.0)*1.0000025^Time)*20000*0.99995^Time*Sin(Time/100.0);Eigener Code hier
         Case 1;rechts
            Wert=Sin(2*Time*1.5^Sin(Time/25.0)*1.0000025^Time)*20000*0.99995^Time*Cos(Time/100.0);Eigener Code hier
         ;Case 2
         ;   Wert=
      End Select
      Select Bittiefe/8
         Case 1
            WriteByte File,Wert      ;Von 0 bis 255
         Case 2
            WriteShort File,Wert   ;Von -2^15 bis +2^15-1
      End Select
   Next
Next


CloseFile File

Sound=LoadSound("Test.wav")
PlaySound(Sound)

Return


Die 2 Bilderchens braucht ihr, wenn ihr das Beispiel mit GUI nachvollziehen wollt (in einen unterordner "res" tun".

user posted image

user posted image

BlitzMoritz

BeitragSo, Okt 04, 2009 12:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleine Anmerkung: Ohne viel ändern zu müssen, sollte mpmxyz's schöne Idee auch für das BlitzMax-Codearchiv zu verwenden sein! Einfach ein Graphics 400,300 voranstellen, die ; durch ' ersetzen - und sofort läufts - hab's gerade auf Linux getestet.

tedy

BeitragSo, Okt 04, 2009 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Um das Programm auszumachen sollte man auch noch Keyhit(Key_Escape) ganz unten ergänzen
01010100 01100101 01000100 01111001 00100000 00111010 01000100

M0rgenstern

BeitragDo, Jan 07, 2010 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
@ mpmxyz:
Einfach Klasse.

Ich hab ein wenig mit dem Programm rumgespielt und versteh jetzt sogar schon den Nutzen der Variablen (Also die ganz oben im Programm).
Damit kann man sich tolle Sachen basteln.
Darf man die sounds die damit erstellt werden in eigenen Projekten nutzen?


Ist echt super das Teil. Schöne Arbeit.

Lg, M0rgenstern

mpmxyz

BeitragFr, Jan 08, 2010 12:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, du kannst die erstellten Dateien so nutzen, wie du möchtest.
Du hast ja die Dateien erzeugt. (Es ist dein Werk!)
Und der dazu nötige Code kommt aus dem Codearchiv.
->Der Code ist frei und du darfst ihn so verwenden, wie du möchtest.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group