Töne erstellen
-
Hi, kennt ihr eine bibliothek, mit der man Töne generieren kann? Also eig sowas wie ein Oszilliator. Mehr brauch sie nicht können. Das einzige, was ich gefunden hab, war eine kleine directX funktion, aber gibt es vllt auch eine plattformunabhängge lösung?
-
mit der funktion sin() eine sinuskurve erstellen und die in einen rohen audiopuffer reinhauen.
den puffer dann an eine beliebige audio-API schicken, und fertig...
-
-
loki1985 schrieb:
mit der funktion sin() eine sinuskurve erstellen und die in einen rohen audiopuffer reinhauen.
den puffer dann an eine beliebige audio-API schicken, und fertig...nojaa, die funktion für den ton zu machen wird vllt das kleinere problem sein, mir ging es eher um den von dir genannten API aufruf...werd mir den link von finix mal ansehn
-
bin über die "beep" funktion gestolpert, eig suche ich genau so etwas, nur
a) mehrere gleichzeitig
b) eher über boxen
bin im mom dabei, mich mit der wav spezifikation durchzuarbeiten, nur erst eine wav zu speichern kann ja nicht die optimalste lösung sein, oder?^^
-edit- tschuldigung für den doppelpost...

-
also ich finde audio-output mit SDL ganz nett... die tutorials sind etwas rar, aber es geht.
-
Habe mal kurz mein Büchlein als DirectX Referenz genommen:
Du erstellst also einen sekundären Buffer im Format WAVE_FORMAT_PCM.
nChannels gibt die Anzahl an Kanälen an, 1 für Mono, 2 für Stereo. Mono dürfte hier für dich in Frage kommen.nSamplesPerSec ist die Frequenz des Buffers. Ich würde hier 44100 Hz nehmen.
wBitsPerSamples ist die Auflösung der Samples, entweder 8 Bit oder 16 Bit. Für die meisten versuche reichen 8 Bit Auflösung, bei CD Qualität sind es 16 Bit.
nBlockAlign ist die Größe, die unteilbar zum Mixer geschickt wird. nChannels*(wBitsPerSamples/8).
nAvgBytesPerSec gibt an, wie viel Bytes für eine Sekunde benötigt werden. nSamplesPerSec*nBlockAlign.
cbSize = 0.
Bei der BufferDescription gibst du unter lpwfxFormat also das oben genannte an und erzeugst anschließend über CreateSoundBuffer einen Buffer. dwBufferBytes gibt die größe des Buffers in Byte an. Für 3 Sekunden bei 44100 Hz, Stereo, 16 Bit per Sample sind das 3*44100*2*(16/8) Byte = 529200 Byte.
Dann sperrst du ihn über Lock und fütterst ihn mit Daten. Lock gibt ja ein Pointer zurück auf die Samples. pSamples ist bspw. jetzt der Pointer.
Du zählst also jetzt eine Schleife von 0 bis Anzahl Samples(nSamplesPerSec*Sekunden) hoch und füllst pSample[Index] mit Werten.
Wenn du ein Sinuston mit 440 Hz erzeugen willst, liegt die Periode bei 44100/440 . Das müsste also dann so gehen:
pSample[Index] = byte(Amplitude*sin(2.0f*pi*440.0f*float(Index)/44100.0f) - 127.0)Die Amplitude kann ruhig bei 127.0 liegen, damit geht er glaube ich von -6dB bis +6dB, also die volle Lautstärke.
Willst du nun andere Töne da zumixen, berechnest du sie wie oben und addierst sie zusammen.
Die Trompete hier auf meinem Keyboard hat beispielsweise 1 Grundton und 6 Obertöne. Hier müsste ich also den Grundton bspw. 130,blub Hz für C'' Note nehmen, und die Obertöne müssten ein Vielfaches des Grundtons sein. Der Grundton sollte weiterhin eine etwas größere Amplitude haben, die Obertöne etwas weniger. Die Obertöne geben die Klangfarbe des Instruments dann an.
Naja, ist eine feine Sache, aber mit OpenAL habe ich so etwas schneller zusammengebruzelt.
mfg olli