Hi,
Du hast nicht geschrieben, wie professionell du dabei vorgehen möchtest. Willst du mehrere Stimmen wiedergeben, dann bleibt dir nichts anderes übrig, als zu mischen oder DirectX zu verwenden. Willst du verschiedene Wellenformen (Sägezahn, Sinus, Quadrat usw.), dann wird es ein wenig komplizierter....
Du schreibst ausserdem, dass du keine WAV-Dateien wiederegben möchtest. Warum denn nicht??? WAV-Dateien brauchst du nicht zu laden. Falls du nur eine Sinus-Welle spielen möchtest, brauchst du nur eine WAV-Structur zu erstellen (TWaveHdr) und diese mit einem bestimmten Format (TWaveFormatEx) abzuspielen. Falls du diese Sinuskurve loopen tust (TWaveHeader.dwLoop = -1), dann hast du einen ewig langen ton. Die Sinuskurve selbst kannst du anhand einer Formel, wie:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| r: single; WaveHeader: TWaveHdr; GetMem(WaveHeader.lpData, 440);
r := 0; WaveHeader.dwBufferLength = 440;
for i = 0 to 440-1 do begin PByte(WaveHeader.lpData)[i]^ = Sin(r) * 127 + 128; r := r + 360 / 440; end; |
(naja, auf diese Formel (8Bit 44100Khz Mono) keine Gewähr. Probier mal lieber ein wenig rum)
Nun kannst du in einer Routine die Tonlänge abfragen und anhand vom Volume den Ton abklingen oder aufklinen lassen. Du kannst natürlich auch mit der Frequenz spielen. Dazu lies dir doch die MMSystem-Doku durch. Falls du nicht weiterkommst, schreib nochmal.
Übrigens: Willst du mehrere Stimmen, dann nimm DirectX und erstelle mehrere SoundBuffer, mit denen du im selben Verfahern wie hier, Töne ausgibst. So schwierig ist das nicht. Ich denke, dass ca. 20 Zeilen für deine Zwecke genügen sollten.
Ansonsten: ...solltest du es dir gut überlegen, ob es sinnvoll ist, in einem Multimedia-Betriebssystem noch Daten direkt an einen Port zu senden....
Grüsse
NightHawk