Generierten Sound nicht erst speichern sondern direkt abspielen.

Ich generiere hier Sinustöne. Diese speichere ich als WAV ab. Da ich immer nur eine Sekunde Tonlänge und 44100kHz Samplingfrequenz habe, habe ich mir einen Header aus einer Sounddatei "geklaut und setzte immer den gleichen Herader vor den eigentlichen Daten.
Das klappt prima.

Nun möchte ich die Töne aber nicht erst als Datei abspeichern und danach mit f.OpenAsSound wieder einlesen, sonder gleich abspielen.
Ich habe schon sehr viel ausprobiert. Klappt alles nicht. Deshalb frage ich Euch schon wieder…

Ich bastel erst einen Datenstring mit dem Ton:

[code] dim i As integer
dim myByte As integer
dim myByte2 As double
dim Einzelsamples As integer

samples=""

Einzelsamples=Samplelaenge*samplerate

for i = 1 to Einzelsamples

myByte=round(sin(i*frequenz/samplerate*PI*2)*-127)+127

samples=samples+chrb(mybyte)

next[/code]

Dann speichere ich den ganzen String mit vorangestelltem Header ab:

[code] Dim bs As BinaryStream
Dim f As FolderItem
Dim newFolder as FolderItem
Dim v As Variant
Dim s As new Sound

newFolder=SpecialFolder.Desktop.child(“ToneMakerSounds”)
newFolder.createAsFolder

f = SpecialFolder.Desktop.Child(“ToneMakerSounds”).Child(Dateiname)

bs = BinaryStream.Create(f, True)

If bs <> Nil Then
bs.Write(Datenstring)
bs.Close
end if[/code]

Fertig ist meine WAV Datei. Klappt auch gut so.

Wenn ich nun die Datei nicht erst speichern will, sondern direkt nach dem erzeugen abspielen will, wie mache ich denn das?
Ich habe schon einiges versucht. Deshalb sind noch “Reste”, wie Variant und Sound zu sehen :slight_smile:

Vielen Dank im Voraus!
Viele Grüße
Britta

Ich fürchte, dass du hier mit Bordmitteln alleine nicht weiterkommst. Solange es keine Möglichkeit gibt, eine Property Sound anders zu instantiieren als mittels eines Folderitems und dieses nicht in einen Temporärspeicher schreiben kann (oder geht das womöglich?) statt auf Festplatte, bleibt dir m.E. nur der Weg über Plugins oder Declares. Christian hat da mit Sicherheit was im Angebot.

Auf dem Mac sehe ich, dass ein NSSound auch mit den Daten instantiiert werden kann: NSSound kennt den Initialisierer initWithData. NSDate aus einem Memoryblock beispielsweise lässt sich mit wenigen Declares erzeugen, der Aufruf für NSSound ebenso. Ich habe allerdings keinen Schimmer, wie das mit den anderen Plattformen aussieht. Es würde mich aber sehr wundern, wenn es da nicht Ähnliches gäbe.

erstens würde ich mal dringend empfehlen beim Zusammenbau einen Memoryblock zu nehmen statt immer String+String. Der Plus Operator mit Schleifen ist recht langsam, weil jedes mal viele Bytes kopiert werden.

Ulrich, bevor wir Britta zu Declares schicken, wie wre es mal zu fragen, ob das fr Web oder Desktop ist? Und Mac, Windows oder Linux?

Die NSSoundMBS Klasse ist im MBS Plugin drin:
https://www.monkeybreadsoftware.net/class-nssoundmbs.shtml

Zum Abspielen für Mac/Win/Linux auf dem Desktop, könnte man die PortAudioStreamBufferedMBS Klasse nehmen:
http://www.monkeybreadsoftware.net/class-portaudiostreambufferedmbs.shtml

Also ich schreibe auf dem Mac. Compiliert werden soll es für Desktop Win+Mac.

Ich hatte befürchtet, dass sowas kommt :slight_smile: Ok, werde ich machen.

Das sieht so aus, als ob es genau das ist, was ich suche :slight_smile:

Ich wusel mich da mal durch. Audio kann man ja auch einzeln erwerben habe ich gesehen.

Vielen Dank für Eure Hilfe!
Viele Grüße
Britta

Da kann ich nicht anders als dir völlig recht zu geben. Wat de Bur nich kennt … Ich tummele mich eben zurzeit nur auf Mac & iOS …

Und ansonsten ist es doch schade, dass “da gibt’s doch bestimmt was von MBS” vermutlich Plagiatsvorwürfe nach sich ziehen würde :wink:

Ich schreibe seit 15 Jahren an den Plugins. Da ist vieles schon mal vorgekommen :slight_smile: