# HG changeset patch # User Robert Tubb # Date 1354732922 0 # Node ID 5ee5ef99e1171c68c6849da3bff1d03238ee0b21 # Parent 7541aeaebcdcc07ce08b0a040e261a4455d417fd presets have "icons" and save OK. Snapping works. move velocity still frustrating. diff -r 7541aeaebcdc -r 5ee5ef99e117 eventLogger.h --- a/eventLogger.h Tue Dec 04 18:36:00 2012 +0000 +++ b/eventLogger.h Wed Dec 05 18:42:02 2012 +0000 @@ -21,19 +21,47 @@ #include #include #include "2dvector.h" -enum leventType {SAVE_PRESET, SAVE_DESET, SCROLL, ZOOM, CHANGE_SLIDER, SWAP_VIEW}; +enum leventType {SAVE_PRESET, SAVE_DESET, SCROLL, SCROLL_STOPPED, ZOOM, CHANGE_SLIDER, SWAP_VIEW, SET_MIN_ZOOM, SET_MAX_ZOOM}; class lEvent{ - +public: // try and make this as compact as possible. leventType eventType; double val1; // x coord, scale if zoom double val2; // y coord, 0 if zoom int sliderID; + lEvent(leventType eType, double v1, double v2 = 0.0,int sID = 0){ + eventType = eType; + val1 = v1; + val2 = v2; + sliderID = sID; + } +}; +//--------------------------------------------------------------------------- +inline istream& operator>>(istream & is, lEvent& e){ + is.setf(ios_base::fixed,ios_base::floatfield); + is.precision(1); -}; + char delim; + int eType; + is >> eType >> delim >> e.val1 >> delim >> e.val2 >> delim >> e.sliderID; + + e.eventType = (leventType)eType; + + return is; +} +//--------------------------------------------------------------------------- +inline ostream& operator<<(ostream & os, const lEvent& e){ + os.setf(ios_base::fixed,ios_base::floatfield); + os.precision(1); + + os << e.eventType << ',' << e.val1 << ',' << e.val2 << ',' << e.sliderID << '\n'; + + return os; + } + //--------------------------------------------------------------------------- class EventLogger{ public: @@ -41,14 +69,28 @@ /* time, type, value */ + bool loggingEnabled; + vector theEvents; string userID; // get something from hardware?? EventLogger(); - void logEvent(const leventType& evtType,const TwoVector& centre, const double& scale, const int& sliderID); + void logEvent(const leventType& evtType,const TwoVector& centre = TwoVector(), const double& scale = 1.0, const int& sliderID = -1, const double& sliderVal = 0.0); + void logEvent(const leventType& evtType,const int& sliderID, const double& sliderVal); void sendHttp(); + + void printAll(){ + cout << "ALL LOGGED EVENTS!: \n"; + vector::iterator evIter; + for(evIter = theEvents.begin(); evIter < theEvents.end(); evIter++){ + cout << *evIter; + + } + }; }; + + #endif /* defined(__oscSenderExample__eventLogger__) */ diff -r 7541aeaebcdc -r 5ee5ef99e117 eventLogger.mm --- a/eventLogger.mm Tue Dec 04 18:36:00 2012 +0000 +++ b/eventLogger.mm Wed Dec 05 18:42:02 2012 +0000 @@ -15,7 +15,8 @@ EventLogger::EventLogger(){ // if first time opened request a user ID from the server... use time? - + loggingEnabled = true; + double timemsd = [NSDate timeIntervalSinceReferenceDate]; long long timems = (long long)(timemsd*1000); cout << "Time (ms) = " << timems << "\n"; @@ -24,10 +25,13 @@ CFUUIDRef theUUID = CFUUIDCreate(NULL); CFStringRef tstring = CFUUIDCreateString(NULL, theUUID); CFRelease(theUUID); - + + + + } -void EventLogger::logEvent(const leventType& evtType,const TwoVector& centre, const double& scale = 1.0, const int& sliderID = -1){ +void EventLogger::logEvent(const leventType& evtType,const TwoVector& centre, const double& scale, const int& sliderID, const double& sliderVal){ //cout << "log: " << evtType << "\n"; // scroll has 2 double coords @@ -38,21 +42,27 @@ // get time for key index + // thinFactor + if(!loggingEnabled) return; switch ( evtType ) { case SAVE_PRESET: + theEvents.push_back(lEvent(evtType,centre.x,centre.y)); // Code break; case SAVE_DESET: - // Code + theEvents.push_back(lEvent(evtType,centre.x,centre.y)); break; case SCROLL: - // Code + theEvents.push_back(lEvent(evtType,centre.x,centre.y)); + break; + case SCROLL_STOPPED: + theEvents.push_back(lEvent(evtType,centre.x,centre.y)); break; case ZOOM: - // Code + theEvents.push_back(lEvent(evtType,scale)); break; case CHANGE_SLIDER: - // Code + theEvents.push_back(lEvent(evtType,sliderVal , 0.0 , sliderID)); break; default: // Code @@ -61,10 +71,21 @@ } - +void EventLogger::logEvent(const leventType& evtType,const int& sliderID, const double& sliderVal){ + if(!loggingEnabled) return; + // sliderThinFactor + switch ( evtType ) { + case CHANGE_SLIDER: + theEvents.push_back(lEvent(evtType,sliderVal , 0.0 , sliderID)); + break; + default: + // Code + break; + } +} void EventLogger::sendHttp(){ - string url = "http://www.rootnot.co.uk/cgi-bin/"; + string url = "http://www.rootnot.co.uk/cgi-bin/zoomlogs.cgi"; ofURLFileLoader fileLoader; ofHttpResponse resp; resp = fileLoader.get(url); diff -r 7541aeaebcdc -r 5ee5ef99e117 grid.h --- a/grid.h Tue Dec 04 18:36:00 2012 +0000 +++ b/grid.h Wed Dec 05 18:42:02 2012 +0000 @@ -26,11 +26,18 @@ int codeLength; // the 1d size of the code, determines max extent of single tile, related to params per dim const int paramBitDepth; // number of bits for the parameter control data - i.e. always 7 for midi CC + + TwoVector topLeft; // top left corner of view, surface coords TwoVector bottomRight; TwoVector size; // size of view, surface coords TwoVector pixSize; // size of view pixels (ie screen size!) TwoVector centre; + + + TwoVector snapCentre; + TwoVector snapDist; // number of pixels to snap to + bool maxZoom, minZoom; int cubeWidth; // side of hypercube. 2 for binary coding. @@ -46,8 +53,6 @@ void viewWasChanged(); void checkConsistencies(); - - vector intToGray(int num, int dimToTravel=3) const; vector coordTobase32(double coord) const; vector grayToMidi(vector > grayCodes) const; @@ -64,23 +69,28 @@ void drawPresets(); void setCoord(TwoVector coord); - TwoVector coordToPixel(TwoVector coord); + void drawCrossHairs(); + void snapCheck(); public: + Grid(); ~Grid(); void init(); void move(TwoVector moveP); // shift view by pixels void zoom(float factor); - + bool snapped; void draw(); // draw lines void update(); // change according to zoom vector calculateParamsFromCoord(TwoVector coord) const; TwoVector calculateCoordFromParams(vector params) const; - + TwoVector coordToPixel(TwoVector coord); vector getParams(); TwoVector getCoord(); + void setMinZoom(); + void setMaxZoom(); + // the inverse stuff void setParams(vector); diff -r 7541aeaebcdc -r 5ee5ef99e117 grid.mm --- a/grid.mm Tue Dec 04 18:36:00 2012 +0000 +++ b/grid.mm Wed Dec 05 18:42:02 2012 +0000 @@ -34,8 +34,9 @@ //set scale and position to mid way scale = pow(32.0,6.0); + snapDist = TwoVector(10,10); + snapped = false; - size.setCoord(pixSize.x*scale, pixSize.y*scale); centre.setCoord(maxValue/2 , maxValue/2); topLeft.setCoord(centre.x - size.x/2, centre.y - size.y/2); @@ -61,7 +62,7 @@ template int sgn(T val) { return (T(0) < val) - (val < T(0)); } - +//-------------------------------------------------------------- void Grid::makeCode(){ ////////////////////////////////~~~,,,,,,,,......... @@ -330,12 +331,7 @@ ////////-------///////// // draw centre cross hairs - ofSetColor(255, 0, 0); - ofNoFill(); - ofLine(pixSize.x/2-20, pixSize.y/2, pixSize.x/2+20, pixSize.y/2); - ofLine(pixSize.x/2, pixSize.y/2-20, pixSize.x/2, pixSize.y/2+20); - ofEllipse(pixSize.x/2, pixSize.y/2, 20, 20); - ofFill(); + drawCrossHairs(); ////////-------//////// /* ostringstream temp; @@ -344,6 +340,24 @@ ofDrawBitmapString( s, pixSize.x/2+10, pixSize.y/2+10 ); */ } +//----------------------------------------------------------------------- +void Grid::drawCrossHairs(){ + // snapping + TwoVector pos; + if(snapped){ + pos = coordToPixel(snapCentre); + }else{ + pos = coordToPixel(centre); + + } + ofSetColor(255, 0, 0); + ofNoFill(); + ofLine(pos.x-20, pos.y, pos.x+20, pos.y); + ofLine(pos.x, pos.y-20, pos.x, pos.y+20); + ofEllipse(pos.x, pos.y, 20, 20); + ofFill(); +} +//----------------------------------------------------------------------- TwoVector Grid::coordToPixel(TwoVector coord){ TwoVector pix; pix.x = (coord.x - topLeft.x)/scale; @@ -354,16 +368,7 @@ //----------------------------------------------------------------------- void Grid::drawPresets(){ - vector points; - TwoVector pos; - points = presetManager.getPresetsInRange(topLeft, topLeft + size); - vector::iterator piter; - for(piter = points.begin(); piter < points.end(); piter++){ - ofSetColor(255, 255, 255, 200); - pos = coordToPixel(*piter); - ofCircle(pos.x, pos.y, 2); - - } + presetManager.drawPresetsInRange(topLeft, topLeft + size); } //----------------------------------------------------------------------- @@ -413,6 +418,7 @@ } + //-------------------------------------------------------------- void Grid::move(TwoVector moveP){ // numspacing, pixelspacing stay the same @@ -425,11 +431,13 @@ centre = centre - moveS; viewWasChanged(); - eventLogger.logEvent(-1, centre, scale); + eventLogger.logEvent(SCROLL, centre, scale); } //-------------------------------------------------------------- void Grid::zoom(float factor){ + if(snapped)centre = (centre + snapCentre)*0.5; // clunky + if(maxZoom && factor > 1.0){ return; @@ -454,33 +462,74 @@ viewWasChanged(); - eventLogger.logEvent(-2, centre, scale); + eventLogger.logEvent(ZOOM, centre, scale); -} -void setMaxZoom(){ // got to smallest (white) +} +//-------------------------------------------------------------- +void Grid::snapCheck(){ + // check environs for presets. + Preset * closestPreset; + vector closePresets = presetManager.getPresetsInRange(centre - snapDist*scale, centre + snapDist*scale); + if(closePresets.size() > 0){ + snapped = true; + // find closest + double dist, mindist = maxValue; + closestPreset = closePresets[0]; + + for(vector::iterator piter = closePresets.begin(); piter < closePresets.end(); piter++){ + dist = (*piter)->coordinates.distanceTo(centre); + + if(dist < mindist){ + mindist = dist; + closestPreset = *piter; + } + } + snapCentre = closestPreset->coordinates; + + }else{ + snapped = false; + snapCentre = centre; + } + } //-------------------------------------------------------------- -void setMinZoom(){ // go to entire space (orange) - +void Grid::setMaxZoom(){ // got to smallest (white) + if(snapped)centre = snapCentre; + size.x = maxValue*2.0; + scale = size.x/pixSize.x; + size.y = scale * pixSize.y; + viewWasChanged(); +} +//-------------------------------------------------------------- +void Grid::setMinZoom(){ // go to entire space (orange) + if(snapped)centre = snapCentre; + size.x = minValue*2.0; + scale = size.x/pixSize.x; + size.y = scale * pixSize.y; + viewWasChanged(); } //-------------------------------------------------------------- void Grid::viewWasChanged(){ + snapCheck(); checkLimits(); - // and calculate new params? - - vector params = calculateParamsFromCoord(centre); + // calculate new params? + vector params; + if(snapped){ + params = calculateParamsFromCoord(snapCentre); + }else{ + params = calculateParamsFromCoord(centre); + } for(int i = 0;i<2*paramsPerDim;i++){ midiCC[i] = params[i]; } - // update sliders if nec. } //-------------------------------------------------------------- void Grid::checkLimits(){ // check for maximum zoom level - // TODO: DODGY + if(size.x > maxValue*2.0){ cout << "maxZoom\n"; @@ -550,11 +599,15 @@ void Grid::setCoord(TwoVector coord){ centre = coord; + viewWasChanged(); } //-------------------------------------------------------------- TwoVector Grid::getCoord(){ - + // return read point crosshairs + if(snapped){ + return snapCentre; + } return centre; } //-------------------------------------------------------------- @@ -582,6 +635,12 @@ } //-------------------------------------------------------------- +//-------------------------------------------------------------- +//-------------------------------------------------------------- +//-------------------------------------------------------------- +//-------------------------------------------------------------- +#pragma mark const utils + TwoVector Grid::calculateCoordFromParams(vector params) const{ vector ccValueX(paramsPerDim); @@ -757,7 +816,6 @@ } //-------------------------------------------------------------- -// WHY HERE XCODE? vector Grid::codesToBase32(vector > inCodes) const{ vector result; for(int i=0;i pixVals; double timemsd = [NSDate timeIntervalSinceReferenceDate]; TwoVector coordinates; - Preset(TwoVector acoord, string aname,int aID){ + // from save button press + Preset(TwoVector acoord, string aname,int aID, const vector & pixCols){ coordinates = acoord; name = aname; presetID = aID; timemsd = [NSDate timeIntervalSinceReferenceDate]; savetime = (long long)(timemsd*1000); + pixVals = pixCols; + }; Preset(int aID){ @@ -46,13 +50,17 @@ }; - Preset(TwoVector acoord, string aname,int aID, long long stime){ + // from file load + Preset(TwoVector acoord, string aname,int aID, long long stime, const vector & pixCols){ coordinates = acoord; name = aname; presetID = aID; savetime = stime; + pixVals = pixCols; }; + + void draw(); }; @@ -72,12 +80,14 @@ TwoVector recallPreset(int presetID); // by name ? id? TwoVector recallPreset(string name); // by name ? id? - vector getPresetsInRange(TwoVector min, TwoVector max); + vector getPresetsInRange(TwoVector min, TwoVector max); + void drawPresetsInRange(const TwoVector min, const TwoVector max); + vector makePresetPicture(TwoVector coord); void printAll(); void startupLoadAll(); // get stuff from XML void exitAndSaveAll(); // save to XML, delete presets array (?) - void deleteAll(); + void clearAll(); PresetManager(); }; @@ -113,7 +123,6 @@ } TwoVector pcoord(px,py); int n = p.loadPreset(pcoord, pname, stime); - cout << "read preset : " << n << '\n'; return(is); } diff -r 7541aeaebcdc -r 5ee5ef99e117 presetManager.mm --- a/presetManager.mm Tue Dec 04 18:36:00 2012 +0000 +++ b/presetManager.mm Wed Dec 05 18:42:02 2012 +0000 @@ -12,24 +12,61 @@ extern Grid theGridView; PresetManager presetManager; //--------------------------------------------------------------------------- - - +void Preset::draw(){ + // + int sz = 2; + TwoVector pos = theGridView.coordToPixel(coordinates); // euch -rely on grid view? + + if(pixVals.size() < 9){ + cout << "NO PRESET PIC\n"; + return; + } + //middle row + // centre + ofSetColor(pixVals[0]); + ofRect(pos.x, pos.y,sz,sz); + // right + ofSetColor(pixVals[1]); + ofRect(pos.x+sz, pos.y,sz,sz); + // left + ofSetColor(pixVals[2]); + ofRect(pos.x-sz, pos.y,sz,sz); + + //top + // centre + ofSetColor(pixVals[3]); + ofRect(pos.x, pos.y+sz,sz,sz); + // right + ofSetColor(pixVals[4]); + ofRect(pos.x+sz, pos.y+sz,sz,sz); + // left + ofSetColor(pixVals[5]); + ofRect(pos.x-sz, pos.y+sz,sz,sz); + + // bottom + // centre + ofSetColor(pixVals[6]); + ofRect(pos.x, pos.y-sz,sz,sz); + // right + ofSetColor(pixVals[7]); + ofRect(pos.x+sz, pos.y-sz,sz,sz); + // left + ofSetColor(pixVals[8]); + ofRect(pos.x-sz, pos.y-sz,sz,sz); +}; +//--------------------------------------------------------------------------- PresetManager::PresetManager(){ timesOpened = 0; nextID = 0; - startupLoadAll(); - + } -//--------------------------------------------------------------------------- -void PresetManager::deleteAll(){ - thePresets.clear(); -} + //--------------------------------------------------------------------------- void PresetManager::printAll(){ cout << "ALL PRESETS: \n"; vector::iterator presetIter; for(presetIter = thePresets.begin(); presetIter < thePresets.end(); presetIter++){ - cout << **presetIter << "\n"; + cout << **presetIter; } } @@ -54,40 +91,67 @@ } - - // check for same coords (!?!) - thePresets.push_back(new Preset(coord, name,nextID)); + // make piccy + vector presetPicture = makePresetPicture(coord); + thePresets.push_back(new Preset(coord, name,nextID, presetPicture)); // if ok return nextID++; } //--------------------------------------------------------------------------- +vector PresetManager::makePresetPicture(TwoVector coord){ + // convert midi parameters to a nice piccy + vector params = theGridView.calculateParamsFromCoord(coord); + vector pixCols; + + ofColor col(255,0,0); + for(int i=0; i<9;i++){ + col.setHue(params[i]*2); + pixCols.push_back(col); + } + return pixCols; +} +//--------------------------------------------------------------------------- int PresetManager::loadPreset(const TwoVector coord, const string name, long long stime){ - - - thePresets.push_back(new Preset(coord, name,nextID, stime)); + vector presetPicture = makePresetPicture(coord); // or just store it?? + thePresets.push_back(new Preset(coord, name,nextID, stime, presetPicture)); + // if ok return nextID++; } //--------------------------------------------------------------------------- -vector PresetManager::getPresetsInRange(const TwoVector min, const TwoVector max){ +vector PresetManager::getPresetsInRange(const TwoVector min, const TwoVector max){ //return all the coordinates. oh and names (displayed at certain scales?). // TODO INEFFICIENT FOR LOTS OF PRESETS. CALLED EVERY GRAPHICS UPDATE! // so: put burden on saving rather than retrieving, make into list and index using coordinates - vector results; + vector results; vector::iterator presetIter; for(presetIter = thePresets.begin(); presetIter < thePresets.end(); presetIter++){ if( ((*presetIter)->coordinates.x > min.x ) && ((*presetIter)->coordinates.y > min.y ) && ((*presetIter)->coordinates.x < max.x ) && ((*presetIter)->coordinates.y < max.y )){ - results.push_back((*presetIter)->coordinates); + results.push_back(*presetIter); } } return results; } + + +//--------------------------------------------------------------------------- +void PresetManager::drawPresetsInRange(const TwoVector min, const TwoVector max){ + vector pInRange = getPresetsInRange(min, max); + vector::iterator piter; + int i = 0; + for(piter = pInRange.begin(); piter < pInRange.end(); piter++){ + + (*piter)->draw(); + i++; + } + +} //--------------------------------------------------------------------------- void PresetManager::startupLoadAll(){ // get stuff from file @@ -97,19 +161,15 @@ ifstream presetFile(fname.c_str()); // simply prints file - int i= 0; + if(!presetFile){ cout<<"no preset file"; return; } - while(presetFile >> *this){ - cout << "loaded" << i++ << " presets\n"; - // parse line - - } + while(presetFile >> *this); + presetFile.close(); - timesOpened++; } //--------------------------------------------------------------------------- @@ -125,8 +185,16 @@ presetFile << **presetIter << "\n"; } presetFile.close(); + + // TODO dleete all the new events?? + } + +//--------------------------------------------------------------------------- +void PresetManager::clearAll(){ + thePresets.clear(); +} //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- diff -r 7541aeaebcdc -r 5ee5ef99e117 testApp.h --- a/testApp.h Tue Dec 04 18:36:00 2012 +0000 +++ b/testApp.h Wed Dec 05 18:42:02 2012 +0000 @@ -32,9 +32,9 @@ TwoVector touch1; TwoVector prevTouch0; TwoVector prevTouch1; - + bool xLocked, yLocked; - + int framesSinceLastScroll; TwoVector moveVel; // velocity at which we were moving the grid @@ -43,7 +43,7 @@ double slowFactor; double zoomVel; // do the same double prevZoom, prevZoom2; - TwoVector prevMove, prevMove2; + TwoVector move, prevMove, prevMove2; vector sliderVals; vector freqIndexes; diff -r 7541aeaebcdc -r 5ee5ef99e117 testApp.mm --- a/testApp.mm Tue Dec 04 18:36:00 2012 +0000 +++ b/testApp.mm Wed Dec 05 18:42:02 2012 +0000 @@ -17,7 +17,7 @@ sender.setup( HOST, PORT ); ofSetFrameRate(30); // reciever - + framesSinceLastScroll = 0; prevTouchX = 0; prevTouchY = 0; @@ -84,6 +84,8 @@ // setup OF sound stream ofSoundStreamSetup(2, 1, this, 44100, ofxPd::blockSize()*ticksPerBuffer, 3); + presetManager.startupLoadAll(); + } #pragma mark GUI //-------------------------------------------------------------- @@ -130,6 +132,7 @@ string name = n.str(); presetManager.addPreset(theGridView.getCoord(),name); + eventLogger.logEvent(SAVE_PRESET, theGridView.getCoord()); } /* if(!keyboard->isKeyboardShowing()){ @@ -149,23 +152,33 @@ cout << "LOCK SEQUENCE (X)\n"; // lock xLocked = !xLocked; + presetManager.clearAll(); }else if(e.widget->getName() == "LOCK SYNTH (Y)") { cout << "LOCK SYNTH (Y)\n"; // lock - - yLocked = !yLocked; + if(((ofxUIButton *)e.widget)->getValue()){ + yLocked = true; + }else{ + yLocked = false; + + } }else if(e.widget->getName() == "ZOOM MIN") { if(((ofxUIButton *)e.widget)->getValue()){ cout << "ZOOM MIN\n"; + theGridView.setMinZoom(); + eventLogger.logEvent(SET_MIN_ZOOM); } }else if(e.widget->getName() == "ZOOM MAX") { if(((ofxUIButton *)e.widget)->getValue()){ cout << "ZOOM MAX\n"; + theGridView.setMaxZoom(); + eventLogger.logEvent(SET_MAX_ZOOM); + //eventLogger.printAll(); } }else{ cout << "GUI error : unknown event recieved\n"; @@ -225,6 +238,8 @@ ofxUISlider *slider = (ofxUISlider *) e.widget; sliderMoved(i-1,slider->getScaledValue()); // internal array 0 indexed + + } } @@ -240,6 +255,9 @@ // TODO if <5 do frequencer stuff and send list to PD // if > 5 send control value to PD sendParametersToPD(); + + eventLogger.logEvent(CHANGE_SLIDER, which , value); + } //-------------------------------------------------------------- void testApp::setAllGUISliders(vector vals){ @@ -295,23 +313,24 @@ sender.sendMessage( m ); } - // continiue to move at velocity + // continiue to move at velocity, unless snapped if (numActiveTouches == 0){ // no touches, use momentum // TODO set velocity to 0 when hits walls - if(moveVel.norm() > 0.1){ + if(moveVel.norm() > 0.3 && !theGridView.snapped){ theGridView.move(moveVel); moveVel = moveVel*slowFactor; // and get new parameter values - if(standardGUIShowing)setAllGUISliders(theGridView.getParams()); + setAllGUISliders(theGridView.getParams()); sendParametersToPD(); - }else if(moveVel.norm() > 0.01){ + }else if(moveVel.norm() > 0.01 || theGridView.snapped){ // stop it moveVel.setCoord(0.0,0.0); - if(standardGUIShowing)setAllGUISliders(theGridView.getParams()); + setAllGUISliders(theGridView.getParams()); sendParametersToPD(); + eventLogger.logEvent(SCROLL_STOPPED, theGridView.getCoord() ); }else{ // stopped - do nothing } @@ -322,6 +341,7 @@ theGridView.zoom(zoomVel + 1.0); // +1 because zoomVel factor is + or - , wheras zoom is a multiplier near 1 zoomVel = zoomVel*slowFactor; } + framesSinceLastScroll++; } //-------------------------------------------------------------- void testApp::sendOSCParams(){ @@ -428,20 +448,31 @@ } + //-------------------------------------------------------------- void testApp::handleScroll(){ + TwoVector move = touch0 - prevTouch0; - moveVel = move*0.3 + prevMove*0.34 + prevMove2*0.38; // broke? + if(yLocked){ + move.y = 0.0; + } + if(xLocked){ + move.x = 0.0; + } + + moveVel = (move*0.3 + prevMove*0.34 + prevMove2*0.38)* (1.0/(float)framesSinceLastScroll); // use the time + prevMove2 = prevMove; prevMove = move; + theGridView.move(move); // and get new parameter values setAllGUISliders(theGridView.getParams()); sendParametersToPD(); - + framesSinceLastScroll = 0; } //-------------------------------------------------------------- void testApp::handleZoom(){