Mercurial > hg > precise-onset-detection
view ofxPreciseOnsetDetectorOffline/PreciseOnsetVisualiser.cpp @ 6:eb29c6b6dff8
added pointer version of visualiser
author | Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk> |
---|---|
date | Sun, 19 Jan 2014 23:07:13 +0000 |
parents | 93b9a9471011 |
children | b1c13e8bec26 |
line wrap: on
line source
/* * PreciseOnsetVisualiser.cpp * ofxPreciseOnsetDetectionOffline * * Created by Andrew Robertson on 28/12/2013. * Copyright 2013 QMUL. All rights reserved. * */ #include "PreciseOnsetVisualiser.h" PreciseOnsetVisualiser::PreciseOnsetVisualiser(){ } PreciseOnsetVisualiser::~PreciseOnsetVisualiser(){ printf("deleting pointer in visualiser\n"); pod = NULL; delete pod; } void PreciseOnsetVisualiser::newFile(){ resetWindow(); windowPress = 0; soundPlay.loadSound(pod->loadedFilename, false); stop(); // paused = true; // soundPlay.play(); // soundPlay.setPaused(true); } double PreciseOnsetVisualiser::windowWidth(){ return windowEnd - windowStart; } void PreciseOnsetVisualiser::update(){ currentPlayPosition = positionSeconds(); if (currentPlayPosition > windowEnd){ double tmp = windowWidth(); windowEnd += tmp; windowStart += tmp; //printf("Scrolling\n"); } } void PreciseOnsetVisualiser::draw(){ //if plotting use this, else comment out ofSetColor(ofColor::white); window.drawBackground(); ofSetColor(ofColor::black); window.drawOutline(); //draw df function /* int startIndex = 0; while (startIndex < (int)pod->dfValues.size() && pod->frameIndexToSeconds(startIndex) < windowStart) startIndex++; int endIndex = 0; while (endIndex < (int)pod->dfValues.size()-1 && pod->frameIndexToSeconds(endIndex) < windowEnd) endIndex++; */ ofSetColor(ofColor::tan); // plotter.drawVector(pod->dfValues, startIndex, endIndex, window); plotter.drawVector(pod->dfValues, round(pod->secondsToFrameIndex(windowStart)), round(pod->secondsToFrameIndex(windowEnd)), window); ofSetColor(ofColor::black); ofDrawBitmapString(ofToString(round(pod->secondsToFrameIndex(windowStart)), 1), window.x, window.y-10); ofDrawBitmapString(ofToString(round(pod->secondsToFrameIndex(windowEnd)), 1), window.x+window.width, window.y-10); ofSetColor(ofColor::blue); plotter.drawBeatStripes(pod->onsetLocations, window, windowStart, windowEnd); //play position ofSetColor(ofColor::red); plotter.drawStripe(positionSeconds(), window, windowStart, windowEnd); ofSetColor(ofColor::black); ofDrawBitmapString(ofToString(windowStart, 1), window.x, window.y+window.height+10); ofDrawBitmapString(ofToString(windowEnd, 1), window.x+window.width, window.y+window.height+10); } double PreciseOnsetVisualiser::positionSeconds(){ return soundPlay.getPosition()*pod->samples/44100.; } //void PreciseOnsetVisualiser::drawOnsets(DoubleVector& onsetTimesSeconds, ofxWindowregion& window, double startTime, double endTime){ //} void PreciseOnsetVisualiser::resetWindow(){ windowStart = 0; windowEnd = 8; // while (windowEnd < pod->samples/44100.) // windowEnd *= 2; windowEnd = pod->samples/44100.; printf("reset: start %.1f end %.1f\n", windowStart, windowEnd); } void PreciseOnsetVisualiser::cropStart(){ if (soundPlay.getPositionMS()/1000. < windowEnd){ windowStart = soundPlay.getPositionMS()/1000.; printf("s: start %.1f end %.1f\n", windowStart, windowEnd); } } void PreciseOnsetVisualiser::cropStartSeconds(double& val){ if (val < windowEnd) windowStart = val; } void PreciseOnsetVisualiser::cropEnd(){//crops to play position if (soundPlay.getPositionMS()/1000. > windowStart){ windowEnd = soundPlay.getPositionMS()/1000.; printf("crop end: start %.1f end %.1f\n", windowStart, windowEnd); } } void PreciseOnsetVisualiser::cropEndSeconds(double& val){ if (val > windowStart) windowEnd = val; printf("crop end: start %.1f end %.1f\n", windowStart, windowEnd); } void PreciseOnsetVisualiser::mousePressed(int& x, int& y){ if (window.tapped(x, y)){ windowPress = windowStart + (windowEnd-windowStart)*(x - window.x)/window.width; double newPos = windowPress/(double)(pod->samples/44100.); printf("window position is %.1f new pos %f\n", windowPress, newPos); soundPlay.setPositionMS(windowPress*1000.0); } } void PreciseOnsetVisualiser::togglePlay(){ if (!paused ){ soundPlay.setPaused(true); paused = true; printf("was playing\n"); } else { soundPlay.setPaused(false);// paused = false; printf("was not playing\n"); } } void PreciseOnsetVisualiser::stop(){ soundPlay.stop(); //then get set to be played soundPlay.play(); soundPlay.setPaused(true); soundPlay.setPositionMS(windowStart*1000.0); paused = true; } void PreciseOnsetVisualiser::zoomIn(){ double positionNow = positionSeconds(); if (positionNow > windowEnd){ double tmp = windowWidth(); windowEnd += windowWidth(); windowStart += tmp; } windowStart = positionNow - (windowEnd-windowStart)/4; if (windowStart < 0) windowStart = 0; windowEnd = positionNow + (windowEnd-windowStart)/4; } void PreciseOnsetVisualiser::zoomOut(){ double positionNow = positionSeconds(); if (positionNow > windowEnd){ double tmp = windowWidth(); windowEnd += tmp; windowStart += tmp; } windowStart = positionNow - (windowEnd-windowStart); windowEnd = positionNow + (windowEnd-windowStart); if (windowStart < 0) windowStart = 0; } void PreciseOnsetVisualiser::scrollLeft(){ double tmp = windowWidth(); windowStart = max(0., windowStart - windowWidth()/2.); windowEnd = windowStart + tmp; checkPosition(); } void PreciseOnsetVisualiser::scrollRight(){ double tmp = windowWidth(); windowStart = min( windowStart+tmp/2., pod->samples/44100.); windowEnd = windowStart + tmp; checkPosition(); } void PreciseOnsetVisualiser::scrollRightSecs(double secs){ double positionNow = positionSeconds(); double newPosition = min(positionNow+secs, pod->samples/44100.); soundPlay.setPositionMS(newPosition*1000.); double tmp = windowWidth()/2.; while (windowEnd < newPosition){ windowEnd += tmp; windowStart += tmp; } } void PreciseOnsetVisualiser::scrollLeftSecs(double secs){ double positionNow = positionSeconds(); double newPosition = max(positionNow-secs, 0.); soundPlay.setPositionMS(newPosition*1000.); double tmp = windowWidth()/2.; while (windowStart > newPosition){ windowEnd -= tmp; windowStart -= tmp; } } void PreciseOnsetVisualiser::checkPosition(){ double positionNow = positionSeconds(); if (positionNow < windowStart || positionNow > windowEnd) soundPlay.setPositionMS(windowStart*1000.); } void PreciseOnsetVisualiser::setPositionSeconds(double secs){ soundPlay.setPositionMS(secs*1000.); double tmp = windowEnd - windowStart; while (windowStart > max(0. , secs)){ windowStart -= tmp; windowEnd -= tmp; } while (windowEnd < min(pod->samples/44100. , secs)){ windowStart += tmp; windowEnd += tmp; } } double PreciseOnsetVisualiser::lengthSeconds(){ return pod->samples/44100.; }