Musik erstellen

Probleme beim Erstellen von 3D-Modellen und Texturen, keine Ahnung womit man Musik macht? Dies ist dein Forum.
BginnR
Beiträge: 39
Registriert: 06.12.2008 19:44
Kontaktdaten:

Musik erstellen

Beitrag von BginnR »

hi leuts
ich hätt da mal ne frage:
kann man mit PureBasic Irgendwelchen Ton oder Lieder erstellen?
vielen dank für jede antwort schon mal im voraus
PB 3.30
PB 4.30 Demo
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Also mit Beep_(freq,dur) kann man auf jeden Fall schonmal den PC biepen lassen^^ aber du denkst bestimmt an komplexere Sounds, da gibts bestimmt einige Möglichkeiten ich hab aber grad keine Parat...
(\/) (°,,,°) (\/)
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Im Code Archiv gibt es einige Beispielquelltexte, wie du zum Beispiel Wave Dateien erstellen kannst.

Ein Beispiel aus dem Code Archiv:

Code: Alles auswählen

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=7431 
; Author: Froggerprogger (updated for PB4.00 by blbltheworm) 
; Date: 04. September 2003 
; OS: Windows 
; Demo: Yes 
  
; Creates a .wav testfile with a sinus tone 
 
;-  04.09.03 by Froggerprogger  
;-  04.09.03 by Froggerprogger  
;-  
;-  Tip: You can replace the byte-text-output with the following:  
;-  
;-  WriteLong($46464952) = "RIFF"  
;-  WriteLong($45564157) = "WAVE"  
;-  WriteLong($20746D66) = "fmt "  
;-  
;-  You can even use WriteString("RIFF") and WriteString("WAVEfmt "), because PB doesn't write a  
;-  terminating 0 - but I don't like this way, perhaps it's too easy ;-)  
;-  
;- For further information on the WAV-format look at: http://www.sonicspot.com/guide/wavefiles.html  
 
#fq = 220                           ; frequenz in Hz for sinustone  
#samplerate = 44100                 ; samplerate  
#bitrate = 16                       ; Bits per sample, #bitrate Mod 8 must be 0 !  
#channels = 2                       ; number of channels  
#secs = 4                           ; time for the sinustone in seconds  
#soundfilename = "wavtest.wav"      ; filename for the soundfile  
 
avBytesPerSec.l = #channels*#bitrate/8*#samplerate  ; calculate the average bytes per second  
 
CreateFile(0, #soundfilename)  
  WriteByte(0,Asc("R"))               ; here you can use WriteLong($46464952) instead - see the tip on top  
  WriteByte(0,Asc("I"))  
  WriteByte(0,Asc("F"))  
  WriteByte(0,Asc("F"))  
  WriteLong(0,36+avBytesPerSec*#secs) ; normally filesize - 8 Bytes, here a bit tricky, fmt-chunk + data-chunk  
 
  WriteByte(0,Asc("W"))  
  WriteByte(0,Asc("A"))  
  WriteByte(0,Asc("V"))  
  WriteByte(0,Asc("E"))  
   
  WriteByte(0,Asc("f"))  
  WriteByte(0,Asc("m"))  
  WriteByte(0,Asc("t"))  
  WriteByte(0,Asc(" "))  
  WriteLong(0,16)                     ; chunk data size  
 
  WriteWord(0,1)                      ; compression code  
  WriteWord(0,#channels)              ; number of channels  
  WriteLong(0,#samplerate)            ; samplerate  
  WriteLong(0,avBytesPerSec)          ; average bytes per second, here 2(channels)*2(block align)*44100(samplerate)  
  WriteWord(0,#bitrate/8*#channels)   ; Block Align ('bytes per sample')  
  WriteWord(0,#bitrate)               ; Bits per sample  
  WriteByte(0,Asc("d"))  
  WriteByte(0,Asc("a"))  
  WriteByte(0,Asc("t"))  
  WriteByte(0,Asc("a"))  
  WriteLong(0,avBytesPerSec*#secs)    ; data chunk size in byes  
 
  Global  actsamplevalue.w         ; for signed RAW data  
   
  For acttime = 1 To #samplerate * #secs  
    For actchannel = 1 To #channels  
        actsamplevalue = 32767 * Sin(2 * #PI * #fq * acttime / #samplerate)  
        WriteWord(0,actsamplevalue)  
    Next  
  Next  
CloseFile(0)  
 
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Musik erstellen

Beitrag von Kaeru Gaman »

BginnR hat geschrieben:hi leuts
ich hätt da mal ne frage:
kann man mit PureBasic Irgendwelchen Ton oder Lieder erstellen?
vielen dank für jede antwort schon mal im voraus
erstellen?

schau erstmal in die Help rein:
Sound: http://www.purebasic.com/german/documen ... index.html

Module: http://www.purebasic.com/german/documen ... index.html

Movie wird benutzt für mp3: http://www.purebasic.com/german/documen ... index.html

... das erstmal zum abspielen.

erstellen ist ein wesentlich komplexeres Thema,
Vermillion hat da schon angeschnitten, WAVs on-the-fly zu erzeugen,
aber das ist SO umfangreich, da solltest du lieber ausführlicher darlegen, worauf du hinaus willst.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
gamma2010
Beiträge: 5
Registriert: 05.03.2010 20:14

Re: Musik erstellen

Beitrag von gamma2010 »

BginnR hat geschrieben: ich hätt da mal ne frage:
kann man mit PureBasic Irgendwelchen Ton oder Lieder erstellen?
Versuchs mal mit MIDI...

Der Code ist auch nicht von mir, aber wenn du den Code an den Anfang schreibst:

Code: Alles auswählen

Global hMidiOut
Procedure MidiOutMessage(hMidi,iStatus,iChannel,iData1,iData2)
  dwMessage = iStatus | iChannel | (iData1 << 8 ) | (iData2 << 16)
  ProcedureReturn midiOutShortMsg_(hMidi, dwMessage) ;
EndProcedure
Procedure SetInstrument(channel,instrument)
  MidiOutMessage(hMidiOut, $C0,  channel, instrument, 0)
EndProcedure
Procedure PlayNote(channel,Note,velocity)
  MidiOutMessage(hMidiOut, $90, channel, Note , velocity)
EndProcedure
Procedure StopNote(channel,Note)
  MidiOutMessage(hMidiOut, $90, channel, Note , 0)
EndProcedure
dann kannst du mit Blöcken aus

Code: Alles auswählen

PlayNote(Channel, Note, Velocity)
Delay(500)
StopNote(Channel, Note)
Töne spielen. Das PlayNote() beginnt den Ton, Delay() lässt natürlich warten, bevor StopNote() den Ton wieder beendet.
Der Channel ist eine Integer, man kann nicht mehrere Töne gleichzeitig auf einem Channel spielen, Note ist eine Hexadezimalzahl (passend ist zum Beispiel $42), und Velocity ist ein Wert zwischen 0 und 100 (ich empfehle 80 bis Hundert). Das eingestellte Instrument ist am Anfang 0 (also Klavier), aber über SetInstrumet kann man das Instrument für jeden Channel beliebig umstellen. Tabellen mit Instrumenten findest du, wenn du bei Google "MIDI" eingibst, 25 ist z.B. eine Gitarre.

Ich garantiere nicht, dass alles stimmt, aber ich benutze das für Musik. Viel Glück!
hmm ... vielleicht sollte ich nachdenken, bevor ich andere mit meinen Problemen belästige...
Antworten