void ofxTLAudioTrack::draw(){ if(!soundLoaded || player.getBuffer().size() == 0){ ofPushStyle(); ofSetColor(timeline->getColors().disabledColor); ofRectangle(bounds); ofPopStyle(); return; } if(shouldRecomputePreview || viewIsDirty){ // cout << "recomputing waveform for audio file " << getSoundfilePath() << endl; recomputePreview(); } ofPushStyle(); ofSetColor(timeline->getColors().keyColor); ofNoFill(); for(int i = 0; i < previews.size(); i++){ ofPushMatrix(); ofTranslate( normalizedXtoScreenX(computedZoomBounds.min, zoomBounds) - normalizedXtoScreenX(zoomBounds.min, zoomBounds), 0, 0); ofScale(computedZoomBounds.span()/zoomBounds.span(), 1, 1); previews[i].draw(); ofPopMatrix(); } ofPopStyle(); if(getIsPlaying() || timeline->getIsPlaying()){ ofPushStyle(); //will refresh fft bins for other calls too vector<float>& bins = getFFTSpectrum(defaultFFTBins); float binWidth = bounds.width / bins.size(); //find max float averagebin = 0 ; for(int i = 0; i < bins.size(); i++){ maxBinReceived = MAX(maxBinReceived, bins[i]); averagebin += bins[i]; } averagebin /= bins.size(); ofFill(); ofSetColor(timeline->getColors().disabledColor, 120); for(int i = 0; i < bins.size(); i++){ float height = bounds.height * bins[i]/maxBinReceived; float y = bounds.y + bounds.height - height; ofRect(i*binWidth, y, binWidth, height); } ofPopStyle(); } }
vector<float>& ofxTLAudioTrack::getFFTSpectrum(){ return getFFTSpectrum(getFFTBinCount()); }
void ofxTLAudioTrack::draw(){ if(!soundLoaded || player.getBuffer().size() == 0){ ofPushStyle(); ofSetColor(timeline->getColors().disabledColor); ofRectangle(bounds); ofPopStyle(); return; } if(shouldRecomputePreview || viewIsDirty){ recomputePreview(); } //cout << "ofxTLAudioTrack::draw" << endl; ofSetColor(255, 255, 255, 205); ofFill(); ofRect(bounds); ofPushStyle(); //ofSetColor(timeline->getColors().keyColor); ofSetColor(0, 0 , 0, 255); ofNoFill(); for(int i = 0; i < previews.size(); i++){ ofPushMatrix(); ofTranslate( normalizedXtoScreenX(computedZoomBounds.min, zoomBounds) - normalizedXtoScreenX(zoomBounds.min, zoomBounds), 0, 0); ofScale(computedZoomBounds.span()/zoomBounds.span(), 1, 1); previews[i].draw(); ofPopMatrix(); } ofPopStyle(); if(getIsPlaying() || timeline->getIsPlaying()){ ofPushStyle(); //will refresh fft bins for other calls too vector<float>& bins = getFFTSpectrum(defaultFFTBins); float binWidth = bounds.width / bins.size(); //find max float averagebin = 0 ; for(int i = 0; i < bins.size(); i++){ maxBinReceived = MAX(maxBinReceived, bins[i]); averagebin += bins[i]; } averagebin /= bins.size(); ofFill(); ofSetColor(timeline->getColors().disabledColor, 120); for(int i = 0; i < bins.size(); i++){ float height = bounds.height * bins[i]/maxBinReceived; float y = bounds.y + bounds.height - height; ofRect(bounds.x + i*binWidth, y, binWidth, height); } ofPopStyle(); } // playhead ofPushStyle(); ofSetColor(0, 0, 0, 255); float x = normalizedXtoScreenX( oldpos, zoomBounds); ofLine(x, bounds.y, x, bounds.y + bounds.height); ofSetLineWidth(3); ofPopStyle(); /* float pos = player.getPosition(); if (pos) { ofxTLZoomer2D *zoom = (ofxTLZoomer2D*)timeline->getZoomer(); ofRange z = zoom->getViewRange(); ofRange oldz = z; float c = z.center(); float d = pos - c; z.min = ofClamp(z.min + d, 0, 1); z.max = ofClamp(z.max + d, 0, 1); if (z.min == .0 && z.span() < oldz.span()) z.max = oldz.max - oldz.min; if (z.max == 1. && z.span() < oldz.span()) z.min = z.max - oldz.max + oldz.min; }*/ // draw markers: for (vector<AlignMarker>::iterator m = markers.begin(); m != markers.end(); m++) { float xn = screenXtoNormalizedX(millisToScreenX(m->ms)); if (zoomBounds.contains(xn)) { float x = timeline->normalizedXtoScreenX(xn, zoomBounds); if (m->selected) ofSetColor(255, 0, 0, 255); else ofSetColor(0, 0, 0, 255); ofLine(x, bounds.y, x, bounds.y+bounds.height); m->rect = ofRectangle(x - 5, bounds.y + bounds.height - 12, 10, 10); ofSetColor(10, 0, 200, 100); ofFill(); ofRect(m->rect); //cout << "m:" << m->ms << endl; ofSetColor(0, 0, 0, 255); timeline->getFont().drawString(ofToString(m->ms), x+1, bounds.y + 30); } } }