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
Musik erstellen
Musik erstellen
PB 3.30
PB 4.30 Demo
PB 4.30 Demo
- Vermilion
- Beiträge: 1846
- Registriert: 08.04.2006 16:00
- Computerausstattung: Apple iMac (2010) & HP Notebook
- Wohnort: Heidekreis
Im Code Archiv gibt es einige Beispielquelltexte, wie du zum Beispiel Wave Dateien erstellen kannst.
Ein Beispiel aus dem Code Archiv:
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)
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: Musik erstellen
erstellen?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
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.
Der Weise weiß, dass er ein Narr ist.
Re: Musik erstellen
Versuchs mal mit MIDI...BginnR hat geschrieben: ich hätt da mal ne frage:
kann man mit PureBasic Irgendwelchen Ton oder Lieder erstellen?
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
Code: Alles auswählen
PlayNote(Channel, Note, Velocity)
Delay(500)
StopNote(Channel, Note)
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...