Indlæsning af PCM data (.WAV)
Hejsa,Jeg står i den situation, at jeg prøver at læse selve lyd-dataen fra en .WAV-fil (bedre kendt som PCM data). Jeg er udemærket klarover at ikke alle WAV-filer er ens, men er 100% sikker på den jeg har brugt af, følger strukturen beskrevet her: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
Mit problem er i at når jeg læser samples (som i følge den linkede hjemmeside) er signed ints, og jegprøver at bruge .read() på min .wav fil, får jeg umildbart ikke nogle tal som giver mening.
Har også kigget her: http://princessblade.net/SmallHost/CWaveFile_Information.html
Hvor der påståes at der skal bruges short ints (grundet 16-bit), men intet giver det ønskede billede eller det rigtige output af waveformen :(
Her er min wavfil.cpp klasse:
[code]
#include <fstream>
#include <math.h>
#include <string>
#include <algorithm>
using namespace std;
class wavfile {
string path;
unsigned int bitsPerSample, sampleRate, filesize, bytesPerSecond, filelength;
fstream file;
float* samples;
public:
wavfile (string);
unsigned int bitspersample ();
unsigned int samplerate ();
unsigned int size ();
unsigned int length ();
unsigned int byterate ();
private:
void instantiate ();
void sampleArray (int, int);
};
wavfile::wavfile(const string p){
path = p;
wavfile::instantiate();
}
void wavfile::instantiate(){
file.open(path.c_str(), ios::in|ios::binary);
file.seekg(0, ios::end);
filesize = (int) file.tellg();
file.seekg(24, ios::beg);
file.read ((char *)&sampleRate, sizeof(sampleRate));
file.seekg(34, ios::beg);
bitsPerSample = (unsigned int) file.get();
file.seekg (28, ios::beg);
file.read ((char *)&bytesPerSecond, sizeof(bytesPerSecond));
filelength = ceil((double )(filesize-44)/ (double) bytesPerSecond);
samples = new float[300];
sampleArray(300, 256);
for(unsigned int i = 0; i < 300; i++){
cout << samples[i] << endl;
}
}
unsigned int wavfile::bitspersample(){
return bitsPerSample;
}
unsigned int wavfile::samplerate(){
return sampleRate;
}
unsigned int wavfile::size(){
return filesize;
}
unsigned int wavfile::length(){
return filelength;
}
unsigned int wavfile::byterate(){
return bytesPerSecond;
}
void wavfile::sampleArray(int amount, int precision){
//Sikre at hvert skridt er et multiplicit af 4, sådan så vi rammer et sample (og ikke lander midt i ét)
unsigned int steplength = (((filesize-44) / (amount*precision))/4)*4;
unsigned int stepAmount = amount*precision;
unsigned int counter = 0;
int pcounter = 1;
int currentValue = 0;
for(unsigned int i = 0; i < stepAmount; i++){
file.seekg(44+(i*steplength), ios::beg);
short int left;
short int right;
file.read ((char *)&left, 2);
file.read ((char *)&right, 2);
int tempValue = max(left, right);
if(tempValue > currentValue){
currentValue = tempValue;
}
if(pcounter == precision){
samples[counter] = (float) currentValue / (float) 32767;
pcounter = 1;
counter++;
} else {
pcounter++;
}
}
}
[/code]