Wav-Dateien übereinander legen
-
Also hab jetz ma bissl angefangen... Das tut lässt sich übrigens gut lesen! Ich lese nämlich normalerweise sehr ungern, aber das war echt cool. Allerdings hab ich en kleines problem un zwar wenn ich die Anzahl im array auf 520000 erhöhe, kommt von microsoft die fehlermeldung, das das programm beendet werden müsste...
Hier mein code:
char ID[4]; unsigned long int ChunkSize; char Format[4]; char Subchunk1ID[4]; unsigned long int Subchunk1Size; WORD AudioFormat; WORD NumChannels; unsigned long int SampleRate; unsigned long int ByteRate; WORD BlockAlign; WORD BitsPerSample; char Subchunk2ID[4]; MessageBox(NULL,"Hallo",NULL,MB_OK); unsigned long int i=510000; unsigned long int Subchunk2Size; short Data[510000]; //short Data2[510000]; /// Variablen mit Daten fuellen ID[0] = 'R'; ID[1] = 'I'; ID[2] = 'F'; ID[3] = 'F'; ChunkSize = 36 /*groeße des wave headers*/ + i*2/*sampledaten*/; Format[0] = 'W'; Format[1] = 'A'; Format[2] = 'V'; Format[3] = 'E'; Subchunk1ID[0] = 'f'; Subchunk1ID[1] = 'm'; Subchunk1ID[2] = 't'; Subchunk1ID[3] = ' '; Subchunk1Size = 16; AudioFormat = 1; // PCM NumChannels = 1; // MONO SampleRate = 44100; ByteRate = 44100*2; BlockAlign = 2; BitsPerSample = 16; Subchunk2ID[0] = 'd'; Subchunk2ID[1] = 'a'; Subchunk2ID[2] = 't'; Subchunk2ID[3] = 'a'; Subchunk2Size = i*2; for(int x = 0; x<36000; x++) { Data[x] = sin((x/180.0f*M_PI)*4) *10000; } // WaveDatei speichern FILE *file = NULL; file = fopen("alt.wav", "rb"); fread(&ID, 4*sizeof(char), 1, file); fread(&ChunkSize, sizeof(unsigned long), 1, file); fread(&Format, 4*sizeof(char), 1, file); fread(&Subchunk1ID, 4*sizeof(char), 1, file); fread(&Subchunk1Size, sizeof(int), 1, file); fread(&AudioFormat, sizeof(AudioFormat), 1, file); fread(&NumChannels, sizeof(NumChannels), 1, file); fread(&SampleRate, sizeof(int), 1, file); fread(&ByteRate, sizeof(int), 1, file); fread(&BlockAlign, sizeof(WORD), 1, file); fread(&BitsPerSample, sizeof(WORD), 1, file); fread(&Subchunk2ID, 4*sizeof(char), 1, file); fread(&Subchunk2Size, sizeof(unsigned long), 1, file); fread(&Data, 2*i, 1, file); fclose(file); FILE *file2 = NULL; file2 = fopen("neu.wav", "wb"); ID[0] = 'R'; ID[1] = 'I'; ID[2] = 'F'; ID[3] = 'F'; ChunkSize = 36 /*groeße des wave headers*/ + i*2/*sampledaten*/; Format[0] = 'W'; Format[1] = 'A'; Format[2] = 'V'; Format[3] = 'E'; Subchunk1ID[0] = 'f'; Subchunk1ID[1] = 'm'; Subchunk1ID[2] = 't'; Subchunk1ID[3] = ' '; Subchunk1Size = 16; AudioFormat = 1; // PCM NumChannels = 1; // MONO SampleRate = 44100*2; ByteRate = 44100*4; BlockAlign = 2; BitsPerSample = 16; Subchunk2ID[0] = 'd'; Subchunk2ID[1] = 'a'; Subchunk2ID[2] = 't'; Subchunk2ID[3] = 'a'; Subchunk2Size = i*2; fwrite(&ID, 4*sizeof(char), 1, file2); fwrite(&ChunkSize, sizeof(unsigned long), 1, file2); fwrite(&Format, 4*sizeof(char), 1, file2); fwrite(&Subchunk1ID, 4*sizeof(char), 1, file2); fwrite(&Subchunk1Size, sizeof(int), 1, file2); fwrite(&AudioFormat, sizeof(AudioFormat), 1, file2); fwrite(&NumChannels, sizeof(NumChannels), 1, file2); fwrite(&SampleRate, sizeof(int), 1, file2); fwrite(&ByteRate, sizeof(int), 1, file2); fwrite(&BlockAlign, sizeof(WORD), 1, file2); fwrite(&BitsPerSample, sizeof(WORD), 1, file2); fwrite(&Subchunk2ID, 4*sizeof(char), 1, file2); fwrite(&Subchunk2Size, sizeof(unsigned long), 1, file2); fwrite(&Data, 2*i, 1, file2); fclose(file2);Kann das sein das man keine größeren array erzeugen kann? Das zusammenlegen müsste dann doch so funktionieren, dass ich (Data1+Data2)/2 rechne un das dann die Variable Data für die neue zusammengelegte wav-datei is oder?
MFG
Hansi
-
steht doch alles auf meiner Homepage ;):
http://turing.fh-landshut.de/~jamann/Der Unterschied zwischen Stack und Heap.pdf
-
Also das funzt jetz alles... Aber ich hab nomma ne frage, wäre es möglich wenn ich aufnehme, da irgendwie die frequenz die ich ins mikro singe auszulesen? Ich mein ich hab das ganze jetz mit fft gemacht, aber würd mich ma interessieren. Also auf jeden fall danke für die hilfe! Das was ich hinkriegen wollte läuft jetz alles. VIelen dank!
MFG
Hansi
-
die frequenz die ich ins mikro singe auszulesen?
jedes modem arbeitet so

mmh... du müsstest halt die hin und her gänge pro sekunden messen z. B. immer merken wenn du vom positiven ins negative kommst und irgendeinen counter hochzählen - der nach einer sekunde die Frequenz darstellt und dieser counter wird dann halt nach ner sekunde wieder auf null gestellt - kannst ja mal nen sinustun mit bekannter frequenz generieren und mal schauen ob du damit auf ein annehmbares ergebnis kommst..
-
Naja nach einer sekunde, das wäre für meine zwecke zu lang, aber ich probier trotzdem ma bissl... Danke!
MFG
Hansi
-
Frequenz ist einfach definiert als die Anzahl der Hin- und Hergänge pro Sekunde
wenn du nur eine halbe Sekunde die Hin und Hergänge misst, dann kannst du auch ausrechnen wieivel Hin und Hergänge es in einer Sekunde gibt - oder?
-
ja stimmt auch wieder. Ich kann ja dann praktisch meine abstände in denen ich messe selbst definieren... aber wie funktioniert das denn in data wenn ich z.B. hintergrundmusik un gesang dabei hab, dann isses ja nich mehr nur eine freuquenz, oder?
MFG
Hansi
-
Hallo! Ich hab ein tolles neues problem, sorry das ich schon wieder damit nerve. Un zwar waren bei mir in der dsound.h die ganzen Variablentypen mit der 8 hinten(z.B. LPDIRECTSOUNDCAPTURE8) nicht definiert. Also hab ich mir auf irgendner homepage ne neue dsound.h runtergeladen, als ich das dann kompiliert hab, kam 1 un aufgelöstes externes Sybol. Das hab ich rausgekriegt indem ich einfach die 8 hinter DirectSoundCaptureCreate8 weggemacht habe. Wenn ich jetz zuerst die Funktion InitDirectSound() un danach lpCaptureBuffer->Start(0) aufrufe, adann kommt von microsoft irgendwie dieses fenster mit Problembericht senden. Sorry, dass ich vorher gesagt hab es würde alles klappen, aber so wirklich hatte ichs nich ausprobiert... Ich hab gedacht gut, wenn der linker keine fehler mehr anzeigt, wirds wohl funktionieren.
Was mach ich denn falsch? Ich hab genau denselbsen code wie im pdf-Dokument.
MFG
Hansi
-
du benötigst DXSDK 8 oder höher - wie man Lib + Include Pfäde setzen muss damit es funktioniert steht ja im Tut
-
Ja ok. Werds mir ma runterladen, weil ich hab zuzeit einfach nur die visual c++ 6 standard edition. Danke! Von den include sachen und den libs her müsste alles stimmen, das hab ich auch so gemacht wies da steht.
MFG
Hansi
-
Sorry war wohl bissl voreilig, also es funzt alles, danke nochma für die hilfe!!!!
Vielen Dank
MFG
Hansi
-
es gibt hier auch einem Beitrag der audio-mixer heißt - im Spiele/Grafikprogrammierungforum
dort wurde darüber diskutiert, wei man Audiodateien zusammenmischen kann
mein beschriebene Methode funktioniert zwar, ist aber nicht optimal
-
Naja, aber ich glaub für meine zwecke wirds wohl reichen.
MFG
Hansi
-
Hallo!
Ich bins ma wieder. Hab nochma ne frage, un zwar kommt wenn ich die beiden Variablen data von 2 songs addiere un dann durch zwei teile un das dann in ne wav-Datei schreibe. auf dem rechten Channel zwar das richtige (also die 2 songs parallel), auf dem linken Channel kommt allerdings nur ein rauschen, wodran liegt das denn? Kann man das irgendwie wegbekommen?
MFG
Hansi
-
Hallo!
Hat sich erledigt... Ich hab einfach Data nachher nochma *2 genommen un dann awrs auf beiden channels.
MFG
Hansi
-
Hi! Ich bins ma wieder. Un zwar wollt ich ma fragen wie ich diese Anzahl in den beiden Befehlen
lpCB->Lock(0, 206000*2, &SoundData1, &dwSoundDataSize1, &SoundData2, &dwSoundDataSize2, 0); memcpy(&a->Array, SoundData1, 2*206000);höher als 2*206000 machen kann.Sobald ich die nämlich höher stelle, kommt en Problembericht. Ich denk ma das liegt wahscheinlich wieder dadran, das der Stack überlastet wird. Kann man das auch irgendwie wieder auf den Heap umlegen oder funktioniert das diesma net?
Vielen Dank
Hansi
-
anstatt dein Array auf so anzulegen:
char Array[200000000];legst du es einfach so an:
char *Array = new char[2000000000];
-
Ja das is ja net das problem, dass hab ich ja schon so. Das Problem muss irgendwo anders liegen. Kann es vll sein, dass memcpy nur bis zu dieser bestimmten Arraygrenze die auf den Stack passt kopieren kann? oder liegts dadran, dass LPVOID SoundData zu groß wird?
MFG
Hansi