Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.05.2010, 14:22

Töne erstellen

Hallo,
ich wollte mich mal ein bisschen der Soundprogrammierung widmen. Mein Ziel ist es ein Programm zu schreiben, das einzelne Töne erstellt und diese dann als wav speichert. Bisher funktioniert alles wunderbar. Ich hab eine Samplestuktur, eine Exportfunktion etc. Aber iwie funktioniert das schreiben von Daten in den Sampledatenblock und in den wav daten block nicht (soll heissen, das alles funktionert, nur das wenn ich exportiere meine wav datei immer Stille enthält).
Ich habe es so probiert:

C-/C++-Quelltext

1
2
3
4
void makeSound(SAMPLE* sample, int freq = 0xffff)
{
    memset(sample->data, freq, sample->len*2);
}

Aber so scheint es nciht zu funktionieren...
Meine Frage wäre also wie erstellt man (PCM)Sound Daten?

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

2

19.05.2010, 16:15

Ich verstehe dein Problem irgendwie nicht richtig (und glaube das es auch anderen so geht). Ein bischen mehr Code wäre sicherlich nicht hinderlich...
z.B.: Wie ist SAMPLE definiert, wie speicherst du die Daten in der Datei, wie erstellst du die Daten, wo, wann und wie wird makeSound aufgerufen,...
Hier kann (leider) niemand Gedanken lesen...
Signaturen werden überbewertet

Tobiking

1x Rätselkönig

  • Private Nachricht senden

3

19.05.2010, 17:11

Ich versteh auch nicht ganz was du da tust. Ich vermute aber du hast eine falsche Vorstellung von einem Sample.

Ein Ton ist charakterisiert durch eine Schwingung. Ein Sample ist die Amplitude zu einem bestimmten Zeitpunkt. Bei deinem memset ist die Amplitude immer gleich (und zwar freq). Daher bekommst du keine Schwingung und damit auch keinen Ton. Wenn du z.B. einen Sinus Ton haben willst, dann musst du die einzelnen Samples so setzen, das diese hinterandner eine Sinus Schwingung ergeben. Das ist von der Samplerate und der Frequenz des Tones abhängig. Eine Samplerate von 48 khz heißt z.B. das 48000 Samples eine Sekunde ergeben. Willst du nun einen Ton mit der Frequenz 440 hz (ist irgendein a) haben willst, musst du zusehen das du 440 komplette Sinusschwingungen auf 48000 Samples verteilst.

4

20.05.2010, 14:19

ooooh vielen dank :D
Ich hatte einfach nen kompletten Denkfehler drinn... Ich hab gerade eine Funktion fuer eine Rechteckwelle geschrieben und jetzt funktioniert alles wunderbar :D

5

21.05.2010, 03:39

Naja wunderbar ist relativ :D nach ein zwei test siehts nicht mehr ganz so toll aus... Das erstellen funktioniert nur, wenn ich 8 bit stereo benutze. Ich bin mir ziemlich sicher, das es an meiner Rechteckswellenfunktion liegt. Hat jemand eine gute oder funktionierende Rechteckswellenfunktion? Von mir aus auch eine Sinuswellenfunktion. Waere echt super! Vielen dank schon mal im vor raus :)

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

6

21.05.2010, 11:59

Hallo,

Das ist die Grundformel:
§a*(-1)^{floor(t*f)}§
t: Zeit (in sekunden)
f: Frequenz (in 1/s)
a: Amplitude (Lautstärke)
Damit solltest du hinkommen...

Hier ein Applet zu testen der Formeln:
http://www.schulphysik.de/java/physlet/applets/piano1.html

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Werbeanzeige