Well solved myself … it was all there.
So i’ve just modified the given code to read 4 channel WAV files also …
in Sample.h i modified the MiniMaxima structure to support 4 channels (L,LC,RC,R)
typedef struct {
double minL;
double maxL;
double minLC;
double maxLC;
double minRC;
double maxRC;
double minR;
double maxR;
} MiniMaxima;
in Sample.cpp modified the generateWaveform and drawWaveform functions. The drawWaveform has been extended with an in and out parameters that specify the portion of the sound wave you need to draw, so in=0.0 means the beginning of the sample and out=1.0 means the end of the sample.
i attach them in case anyone need to draw 4 channels …
void Sample::generateWaveForm(vector<MiniMaxima> * _waveForm)
{
_waveForm->clear();
bool loopState = getIsLooping();
setLooping(false);
bool playState = getIsPlaying();
double tmpSpeed = getSpeed();
setSpeed(1.0f);
play();
// waveform display method based on this discussion [http://answers.google.com/answers/threadview/id/66003.html](http://answers.google.com/answers/threadview/id/66003.html)
double sampleL, sampleR, sampleLC, sampleRC;
while ((long)position<getLength()) {
MiniMaxima mm;
mm.minL = mm.minR = mm.maxL = mm.maxR = 0;
mm.minLC = mm.minRC = mm.maxLC = mm.maxRC = 0;
for (int i = 0; i < 256; i++){
if(myChannels == 1) {
sampleL = update();
sampleR = sampleL;
}
else if (myChannels == 2){
sampleL = update()*0.5;
sampleR = update()*0.5;
}
else if (myChannels == 4){
sampleL = update()*0.25;
sampleR = update()*0.25;
sampleLC = update()*0.25;
sampleRC = update()*0.25;
}
// 1 or 2 channels
mm.minL = MIN(mm.minL, sampleL);
mm.minR = MIN(mm.minR, sampleR);
mm.maxL = MAX(mm.maxL, sampleL);
mm.maxR = MAX(mm.maxR, sampleR);
// for 4 channels
if (myChannels == 4)
{
mm.minLC = MIN(mm.minLC, sampleLC);
mm.minRC = MIN(mm.minRC, sampleRC);
mm.maxLC = MAX(mm.maxLC, sampleLC);
mm.maxRC = MAX(mm.maxRC, sampleRC);
}
}
_waveForm->push_back(mm);
}
position = 0;
setLooping(loopState);
setSpeed(tmpSpeed);
if(playState) play();
}
//---------------------------------------------------------------
void Sample::drawWaveForm(int _x, int _y, int _w, int _h,float _inPoint, float _outPoint, vector<MiniMaxima> * _waveForm)
{
glPushMatrix();
glTranslated(_x, _y-(_h/8), 0);
int start = int(_inPoint * float(_waveForm->size()));
int end = int(_outPoint * float(_waveForm->size()));
int size = end - start;
float waveFormZoomX = (float)size/(float)_w;
for (unsigned int i = start+1; i < end; i++)
{
if(i-start>=0)
{
if(myChannels == 1) {
ofSetColor(200, 200, 255);
ofLine((i-1-start)/waveFormZoomX, _h + (int)(_waveForm->at(i-1).minR*_h), (i-start)/waveFormZoomX, _h + (int)(_waveForm->at(i).maxR*_h));
ofLine((i-start)/waveFormZoomX, _h + (int)(_waveForm->at(i).maxR*_h), (i-start)/waveFormZoomX, _h + (int) (_waveForm->at(i).minR*_h));
} else if (myChannels ==2) {
ofSetColor(200, 200, 255);
ofLine((i-1-start)/waveFormZoomX, (int)(_waveForm->at(i-1).minL*_h), (i-start)/waveFormZoomX, (int)(_waveForm->at(i).maxL*_h));
ofLine((i-start)/waveFormZoomX, (int)(_waveForm->at(i).maxL*_h), (i-start)/waveFormZoomX, (int) (_waveForm->at(i).minL*_h));
ofLine((i-1-start)/waveFormZoomX, (_h/2) + (int)(_waveForm->at(i-1).minR*_h), (i-start)/waveFormZoomX, (_h/2) + (int)(_waveForm->at(i).maxR*_h));
ofLine((i-start)/waveFormZoomX, (_h/2) + (int)(_waveForm->at(i).maxR*_h), (i-start)/waveFormZoomX, (_h/2) + (int) (_waveForm->at(i).minR*_h));
}
else if (myChannels ==4)
{
// LEFT channel
ofSetColor(255, 0, 0);
//ofLine((i-1)/waveFormZoomX, _waveForm->at(i).minR*(float)_h, i/waveFormZoomX, _waveForm->at(i).maxR*(float)_h);
ofLine((i-1-start)/waveFormZoomX, (int)(_waveForm->at(i-1).minL*_h), (i-start)/waveFormZoomX, (int)(_waveForm->at(i).maxL*(_h/2)));
ofLine((i-start)/waveFormZoomX, (int)(_waveForm->at(i).maxL*_h), (i-start)/waveFormZoomX, (int) (_waveForm->at(i).minL*(_h/2)));
// RIGHT channel
ofSetColor(0, 255, 0);
ofLine((i-1-start)/waveFormZoomX, (_h/4) + (int)(_waveForm->at(i-1).minR*(_h/2)), (i-start)/waveFormZoomX, (_h/4) + (int)(_waveForm->at(i).maxR*(_h/2)));
ofLine((i-start)/waveFormZoomX, (_h/4) + (int)(_waveForm->at(i).maxR*(_h/2)), (i-start)/waveFormZoomX, (_h/4) + (int) (_waveForm->at(i).minR*(_h/2)));
// LEFT CENTER channel
ofSetColor(0, 0,255);
ofLine((i-1-start)/waveFormZoomX, (2*(_h/4)) + (int)(_waveForm->at(i-1).minLC*(_h/2)), (i-start)/waveFormZoomX, (2*(_h/4)) + (int)(_waveForm->at(i).maxLC*(_h/2)));
ofLine((i-start)/waveFormZoomX, (2*(_h/4)) + (int)(_waveForm->at(i).maxLC*(_h/2)), (i-start)/waveFormZoomX, (2*(_h/4)) + (int) (_waveForm->at(i).minLC*(_h/2)));
// RIGHT CENTER channel
ofSetColor(255, 255, 255);
ofLine((i-1-start)/waveFormZoomX, (3*(_h/4)) + (int)(_waveForm->at(i-1).minRC*(_h/2)), (i-start)/waveFormZoomX, (3*(_h/4)) + (int)(_waveForm->at(i).maxRC*(_h/2)));
ofLine((i-start)/waveFormZoomX, (3*(_h/4)) + (int)(_waveForm->at(i).maxRC*(_h/2)), (i-start)/waveFormZoomX, (3*(_h/4)) + (int) (_waveForm->at(i).minRC*(_h/2)));
}
}
}
float waveFormDisplayScale = (float)size/(float)_w;
if(myChannels == 1) {
ofLine(position/waveFormDisplayScale, -(float)_h*0.0, position/waveFormDisplayScale, (float)_h*2.0);
}
else if(myChannels ==2)
{
ofLine(position/waveFormDisplayScale, -(float)_h*0.5, position/waveFormDisplayScale, (float)_h*1.5);
}
glPopMatrix();
}
e*