Mehrere Sounds gleichzeitig abspielen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Mehrere Sounds gleichzeitig abspielen

Beitrag von Xaby »

LoadSound() lädt ja eine AudioDatei in den Speicher.

Wie kann ich den Speicher kopieren?
Also einfach sagen, dass nicht nur #Sound1 mein Sound ist, sondern #Sound2 auch den Inhalt von #Sound1 besitzen soll ...

ich meine, sonst müsste ich ja jedes Mal auf die Festplatte zugreifen und den Ton, wenn er mehrmals gleichzeitig abgespielt werden soll laden.

Das wäre doof.

Und gleich noch eine Frage. Wie kann ich selbst einen Sound erzeugen, ohne erst eine WaveDatei schreiben zu müssen?

Wenn ich zum Beispiel eine Funktion habe, würde ich die gern als Klang nutzen können.

Für JaPBe gab es da CreateSound(), aber das hat hin und wieder Fehler verursacht.

Irgendwie wird es mit CatchSound() gehen nehme ich an, aber es gibt kein SoundID() Befehl wie bei Image oder Gadget, um die Speicheradresse zu bekommen :roll:
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Wie kann ich selbst einen Sound erzeugen, ohne erst eine WaveDatei schreiben zu müssen?
boardsuche müßte helfen.

> Irgendwie wird es mit CatchSound() gehen nehme ich an
du kannst mehrere Catches auf das selbe Label ausführen.
musst halt mit IncludeBinary den sound einfügen beim compilieren.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Das Problem ist, dass es dynamisch sein soll.
Ich weiß noch nicht, ob es 3 mal der gleiche Ton sein soll oder öfter bzw. weniger. Und dann will ich das auch mit mehreren Geräuschen machen.

Eine Art CopySound, was man dann nutzen könnte, wenn man die Töne gleichzeitig abspielen muss, wäre ideal und wenn man den Ton nicht mehr benötigt, gibt man den Speicher wieder frei.

Dann hab ich im günstigsten Fall jeden unterschiedlichen Ton nur einmal im Speicher. Als wenn ich vorher schon jeden möglichen Ton vorsorglich öfter in den Speicher lade.

:?
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

hmm naja ich mache es derzeit auch nur so das ich einfach sage ich brauche eine bestimmte anzahl von Sounds und wenn all abgespielt werden dann kommt halt nich noch einer :

Hier meine Cde:
; Gibt den Status des Sounds zurück
Procedure SoundStatus(Sound)
  *DSB.IDirectSoundBuffer=PeekL(IsSound(Sound)) 
  *DSB\GetCurrentPosition(@Status,0) 
  ProcedureReturn Status 
EndProcedure 

; Initialisiert die MultiSound umgebung, 
; damit wird die maximale Anzahl der gleichen Sounds angegeben,
; Standard 10
Procedure InitMultiSound(Menge=10)
  Global MultiSound_Menge = Menge-1
  ProcedureReturn #True
EndProcedure
 

; Lädt ein MultiSound
Procedure LoadMultiSound(Sound, FileName$)
  For n = 0 To MultiSound_Menge
    Ergebnis = LoadSound(Sound+n, FileName$)
  Next n
  ProcedureReturn Ergebnis
EndProcedure


; Spielt ein freien MultiSound ab und gibt deren SoundID zurück
; Wenn alle belegt sind, wird der 0te abgespielt
Procedure PlayMultiSound(Sound)
  For Nr = 0 To MultiSound_Menge
    If Not SoundStatus(Sound+Nr)
      PlaySound(Sound+Nr)
      ProcedureReturn Sound+Nr
    EndIf
  Next Nr
  PlaySound(Sound)
  ProcedureReturn Sound
EndProcedure
Und hier ein Beispiel:
InitSound()
UseOGGSoundDecoder()
InitMultiSound()

DateiName$ = OpenFileRequester("Musik""*.*""*.*", 0)
If DateiName$
  LoadMultiSound(0, DateiName$)
  MessageRequester("Echo""Nun folgt ein mehrfaches Echo")
  Repeat
    PlayMultiSound(0)
    Delay(Random(500))
  ForEver   
EndIf
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo genau, würde ich spontan ähnlich machen...
8x oder so gleichzeitig sollte für die meisten sounds reichen.

aber.. grundsätzlich geb ich dir insofern recht, dass ich nicht g l a u b e,
dass die sound-hardware nicht mehrfach auf den selben speicherbereich zugreifen kann.
also, eigentlich müßte ich doch einen sound nur 1x im speicher haben müssen,
und (virtually) beliebig oft abspielen können.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Geht mit MIDI ja auch.

Jedes Instrument liegt nur einmal im Speicher, kann aber mehrmals gleichzeitig abgespielt werden.

Also mehrstimmig.

Bis zu 64 Stimmen gleichzeitig.

Heutige Hardware kann 256 Stimmen oder mehr gleichzeitig abspielen und dann auch noch direkt 3D-Effekte in den Ton reinrechnen.

Wie funktioniert MOD?

Da gibt es allerdings auch mehrere Varianten.
Mal kann man nur 4 (oder bis 32) Stimmen gleichzeitig spielen und wenn man das selbe Instrument zur selben Zeit spielt, zählt das ebenfalls als Stimme.

http://de.youtube.com/watch?v=qwyxaiIYv7Q

Zum selbst probieren
Bild

http://www.unfungames.com/mariopaint/

So etwas in der Richtung wollte ich mit PureBasic machen.
Oder wie das hier:
BildBild

Piano-Tastatur:
http://www.purebasic.fr/german/viewtopi ... e&start=10

Und scheinbar gutes MIDI-Interface hatte NicTheQuick schon mal gemacht.

Es gibt wohl auch eine MiniFMOD-Engine oder so etwas.

Aber ich wollte halt selbst mal so etwas machen.

Ein kleines Musik-Programm.

Hier gab es auch schon einige Ansätze zum Thema Musikprogramme:
http://www.purebasic.fr/german/viewtopi ... ght=gensfx

:roll:

Ziel sollte sein, möglichst komplexe wohlklingende Musik zu erschaffen, die aber keine riesigen WAVE-Daten oder MP3s von der Festplatte laden muss. So ähnlich wie DEMOs, die nur ein paar KByte groß sind und selbst ihre Sounds generieren.
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Xaby hat geschrieben:Geht mit MIDI ja auch.
sorry, schnubbu, aber MIDI is kein WAVE.

bei MIDI hast du einen chip, der eine syntheziser-fähigkeit besitzt.
dasselbe MIDI-File hört sich auf nem anderen Soundchip anders an.
heutzutage ist der unterschied auf PCs mit Soundblaster-kompatiblen karten fast marginal,
aber spiel das mal auf nem YAMAHA oder ROLAND ab, dem du auch MIDI-files rüberschicken kannst,
da hörst du den unterschied wirklich.

ein WAVE hingegen ist eine gespeicherte wellenform, die klangfarbe bereits drin hat.
im grunde fast nur anstellungswerte für die membran des lautsprechers.
diese werden aus dem speicher an die soundkarte gestreamt.

das grundsätzliche problem ist also der gleichzeitige zugriff auf die selbe wellenform, die als binary im speicher steht.
natürlich wäre sowas möglich, die frage is, ob das standard-I/O auf nem windows-system sowas zulässt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Hab selbst ein YAMAHA PSR-320

Zwischen einem Synthesizer und einem Keyboard bestehen da noch unterschiede. Viele von den Soundkarten, die es heute gibt, haben keinen eigenen WAVE-Table, sondern laden vom Betriebssystem fertige WAVEs in den Soundspeicher.

Früher waren die Rechner einfach zu langsam, um auch noch den Sound zu verwalten, deshalb brauchte man Soundkarten mit Arbeitsspeicher.

MIDI und WAVE ist nicht das gleiche, da gebe ich dir Recht.
Aber am Ende, was der Rechner mit macht, das ist das gleiche.

Nur dass du bei MIDI 127 Standard-Instrumente vorgegeben hast und bei WAVE bzw. MOD-Dateien selbst bestimmen kannst, wie der einzelne Ton klingt.

Ein Syntherizer besitzt die Möglichkeit, dass man seinen WAVE-Table verändert. Ein Keyboard bleibt bei seinem festen WAVE-Table.

Ein WAVE-Table ist nichts weiter als ein großer Speicher, wo ein Sample von jedem Instrument liegt.

Und wieso ein YAMAHA oder ROLAND besser klingt als eine 20,- Euro Soundkarte ist einfach.

Die Qualität des WAVE-Tables bestimmt, wie gut der Klang ist.
Habe ich einen großen WAVE-Table und kann hochauflösender die Samples abspeichern, so ist die Klangwiedergabe reiner.

Stell dir vor, die eine Soundkarte hat nur Samples mit 11kHz Abtastrate und die andere mit 96kHz. Die eine nur 8Bit pro Takt und die andere 24 Bit. ...

Wieso haben die VTech-Lerncomputer früher immer so eine "Computerstimme" gehabt, ist genau der gleiche Grund. Weil Speicher teuer war und noch ist.

Schau dir mal das Programm an:
http://www.myriad-online.com/en/products/melody.htm

Bringt seinen eigenen WAVE-Table mit.
Bild

Je Speicherintensiver der WAVE-Table, desto klarer die Samples.

Code: Alles auswählen

;/ Folker Linstedt
;/ 2008-02-14
;/ FLMOD, Folker Module Abspieler. Wandelt Noten in Frequenzen für Töne um, eine Art Musikspieler


;{
; in Hz
;   C 261.63
; #C 277.65
;   D 293.67
; #D 311.65
;   E 329.63
;   F 349.23
; #F 370.615
;   G 392.00
; #G 416.00
;   A 440.00
; #A 466.94
;   B 493.88 (B=H)
; 
; Eine Oktave hoeher, alle Frequenzen verdoppeln.
; Eine Oktave tiefer, alle Frequenzen halbieren.
; 
; Wave Generierer > GoldWave f(x) [Voll/Musikprg]
;}

Global Dim F.f(12)
F( 0)=261.63
F( 1)=277.65
F( 2)=293.67
F( 3)=311.65
F( 4)=329.63
F( 5)=349.23
F( 6)=370.615
F( 7)=392.00
F( 8)=416.00
F( 9)=440.00
F(10)=466.94
F(11)=493.88 

;/ Instrument laden, Instrument spielt Ton C

Structure FLNote
  octave.l ; Oktave
  note.l  ;
  time.l ; Zeit bis Note endet
EndStructure

Global Dim FLNote.FLNote(5) 

Procedure PlayMusic(S.s) ;/ Hier sollte dann irgendwie lustiges Zeug rein kommen ;-)

EndProcedure

PlayMusic("CCDEFGG")



If InitSound()
  If LoadSound(0,"C:\F\Soundmix\Export\LowTom2.wav");LoadSound(0,"C:\F\Soundmix\Export\chiffpad.wav")
  
  ;/ Die Frequenz des Tons ist die Frequenz der Audiodatei geteilt durch die Frequenz von C * die Frequenz des eigentlichen Tons
  ;Oktave=1 ;/ 1 ist Standard C
    
  For i=11 To 11
  
    For Oktave=0 To 2
  
      Freq.f=44100/(262/F(i)/(1/(Pow(2,1-Oktave)))) ;/ 4 ;/ Multiplikation funktioniert an dieser Stelle nicht
      SoundFrequency(0, Freq)
      PlaySound(0)
  
      MessageRequester("Spiele Ton "+Str(Oktave),Str(i))  
    Next  
    
  Next  
  
  Else
    MessageRequester("Fehler beim Laden","")  
  
  EndIf
  
Else 
  MessageRequester("Geht nicht","")  
  
EndIf  
Solltest oben ein gespeichertes "normales" C als WAVE haben.
Kannst du ganz einfach mit Sound-Club (Freeware) machen.
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

guck ich morgen mal, thnx für den link.

dass der WAVE-table das ausschlaggebende ist, weiß ich - jedenfalls ist es das meistens.
es gibt auch synthis, die noch echte synthis sind,
also, den sound wirklich synthetisieren anhand einer hüllkurve.
das ist der unterschied zwischen einem synthi und einem MIDI-keyboard,
und früher gab es extra-chips auf den soundkarten für sowas.

btw....
ich erinner mich noch, dass mein spezi in der 9ten (mitte der 80er) sich nen YAMAHA-Flügel-Wavetable gekauft hat.
das war ne extra box, die man ans keyboard angeschlossen hat.
das teil hat wie ein echter konzertflügel geklungen, und hat damals über 1000DM gekostet.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Tja, das waren noch Zeiten ...

Es gibt ja immer noch Synthesizer, die richtig Geld kosten.
Aber dann muss man Musik schon als Hobby oder als Beruf haben.

Ist sicherlich ein Unterschied, ob allein der Synthesizer 3.500 Euro kostet oder die ganze Stereo Anlage nur 50,- Euro ...

aber wenn man sich für eine hochwertige Komponente entscheidet, muss man das auf der gesamten Linie durchziehen.

Wäre genauso, wenn ich zwar einen hammergeilen Fotoapparat habe, aber am Ende zu Schlecker gehe und dort meine Bilder für einen Cent ausdrucken lasse :)

Dass ist das schöne am Programmieren. Wenn es auf einem 300,- Euro Rechner funktioniert, wird es auf einem 4.000,- Euro Rechner auch nicht anders sein :mrgreen: (vielleicht etwas schneller)

Programmieren ist eigentlich ein recht günstiges Hobby. Einmal zahlen für das Programm zum Erstellen von Programmen (Compiler) und das war es eigentlich schon.

Internetkosten fallen ja so oder so an.

:?

Syntheziser ohne Ende http://www.vintagesynth.com/
Wenn man einen Software-Sytheziser basteln könnte, könnte man sich seine Instrumente quasi mit ein paar Einstellungen generieren lassen.

Das ist wohl so ähnlich wie Raytracing für fotorealistische Bilder.
:?
Zuletzt geändert von Xaby am 15.02.2008 01:24, insgesamt 1-mal geändert.
Kinder an die Macht http://scratch.mit.edu/
Antworten