Wave-Synthesizer
Übersicht

![]() |
mpmxyzBetreff: Wave-Synthesizer |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Einfach nur geil ![]() 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 ![]() Laenge=72000 Samplerate=1410 Bittiefe=16 Kanaele=1 |
||
![]() |
orpheus_2003 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Der Fernseher ist ja mal, abgesehen von dem Rauschen am Ende, super. ![]() 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 ( ![]() 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. ![]() |
||
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) |
![]() |
4pacBetreff: WAV-Synth mit GUI |
![]() Antworten mit Zitat ![]() |
---|---|---|
Finde ich ja total geil, das Gerät ![]() 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". ![]() ![]() |
||
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Um das Programm auszumachen sollte man auch noch Keyhit(Key_Escape) ganz unten ergänzen | ||
01010100 01100101 01000100 01111001 00100000 00111010 01000100 |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group