Seite 1 von 1

Musik erstellen

Verfasst: 06.04.2009 15:14
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

Verfasst: 06.04.2009 15:15
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...

Verfasst: 06.04.2009 15:37
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)  
 

Re: Musik erstellen

Verfasst: 06.04.2009 15:55
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.

Re: Musik erstellen

Verfasst: 05.03.2010 20:28
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!