Wav-Dateien übereinander legen



  • Hallo!

    Ich hab folgendes problem: Ich muss 2 sounds gleichzeitig abspielen. Der eine is aufgenommen un in ner HWAVEIN-variable. der andere is wahlweise entweder ne mp3 oder ne wav-datei, ganz egal. Ich hab schon gegooglet allerdings scheinbar naach den falshcen schlüsselwörtern. Wenn mir irgendwer vielleicht nur ein paar schlüsselwörter geben könnte, wäre ich seh dankebar. Ich hab mir überlegt das man die sounds vielleicht übereinander legt un dann nur eine datei abspielen muss...
    Ist das möglich?

    MFG

    Hansi



  • Hansi schrieb:

    Ist das möglich?

    einfach Aimplitude1 * 0.5 + Amplitude2 * 0.5



  • Hallo!

    Und wie soll ich das dann mit dem quellcode hinkriegen?

    MFG

    Hansi



  • Gibt es keine Möglichkeite an die Sounddaten heranzukommen? mithilfe von DSound könnte ich dir so etwas programmieren



  • Welche sounddaten meinst du denn?

    MFG

    Hansi



  • [quote="Hansi"]Welche sounddaten meinst du denn?

    Die Sample Daten

    hab da mal ein Tutorial geschreiben das dir vielleicht helfen kann:
    Audioprogrammierung unter Windows mit C++ für Computerspiele:
    http://turing.fh-landshut.de/~jamann/Audioprogrammierung unter Windows mit C++ fuer Computerspiele.pdf



  • Danke das Tutorial arbeite ich mal durch! ALso ich kenne Samplerate, BytesperSample ,Sampling frequency, ByteRate un Bits per sample. Ist es das?

    MFg

    Hansi



  • Hansi schrieb:

    Ist es das?

    Nein. Sampledaten sind einfach die gespeicherten Amplitudenauslenkungen

    auf den ersten 5 Seiten meines Tutorials steht alles was man wissen muss um aus zwei vorhanden wav Dateien eine "gemeinsame/gefadete" zu machen

    vielleicht solltest du als erstes einfach ein programm programmieren das zwei wave dateien zu einer gemeinsamen zusammen mixt



  • Alles klar. Ich werds probieren. Danke für die ganze Hilfe!!!

    MFG

    Hansi



  • 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





  • 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


Anmelden zum Antworten