Mercurial > hg > soniczoomios
changeset 44:a1e75b94c505
Snap to eval points. Double tap to go to preset (doesn't quite work yet). Coloured locks. Changed Question 2. Fixed some leaks.
author | Robert Tubb <rt300@eecs.qmul.ac.uk> |
---|---|
date | Mon, 22 Apr 2013 18:32:34 +0100 |
parents | b91a1859829a |
children | c2fffc8ea84d |
files | IntroViewController.xib Question.m QuestionnaireViewController.mm ServerComms.mm SliderViewController.mm SliderViewController.xib TopButtonViewController.h TopButtonViewController.mm TopButtonViewController.xib eventLogger.h eventLogger.mm grid.h grid.mm presetManager.h presetManager.mm testApp.h testApp.mm |
diffstat | 17 files changed, 324 insertions(+), 173 deletions(-) [+] |
line wrap: on
line diff
--- a/IntroViewController.xib Fri Apr 19 18:50:04 2013 +0100 +++ b/IntroViewController.xib Mon Apr 22 18:32:34 2013 +0100 @@ -42,7 +42,6 @@ <string key="NSFrame">{{326, 881}, {116, 44}}</string> <reference key="NSSuperview" ref="766721923"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView"/> <string key="NSReuseIdentifierKey">_NS:9</string> <bool key="IBUIOpaque">NO</bool> <string key="targetRuntimeIdentifier">IBIPadFramework</string> @@ -120,14 +119,14 @@ bG9jayIgYnV0dG9ucy4gQWZ0ZXIgdGhpcyBhIHNob3J0IHF1ZXN0aW9ubmFpcmUgd2lsbCBhcHBlYXIg dGhhdCB3aWxsIGhlbHAgdXMgYXNzZXNzIHRoZSBpbnRlcmZhY2UgZnVydGhlci4gQWZ0ZXIgdGhhdCwg cGxlYXNlIGZlZWwgZnJlZSB0byB1c2UgaXQgc29tZSBtb3JlOiB0aGUgbW9yZSBkYXRhIHdlIGdldCB0 -aGUgYmV0dGVyLiDigKjigKhQTEVBU0UgTk9URTogWW91ciBhY3Rpb25zIHdpbGwgYmUgbG9nZ2VkLCBh -bmQgc2VudCB0byBhIHNlY3VyZSBzZXJ2ZXIgaGVyZSBhdCBRdWVlbiBNYXJ5IFVuaXZlcnNpdHkuICBI -b3dldmVyIG5vIHBlcnNvbmFsIGRhdGEgKG5hbWUsIGVtYWlsIGV0Yy4pIHdpbGwgYmUgY29sbGVjdGVk -LCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRCBvciBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBJdCBpcyBo -aWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYXJlIGNvbm5lY3RlZCB0byBXaUZpIGludGVybmV0IHdo -aWxzdCB1c2luZyB0aGlzIEFwcCwgb3RoZXJ3aXNlIHRoZSBsb2cgZGF0YSB3aWxsIHRha2UgdXAgc3Bh -Y2Ugb24geW91ciBkZXZpY2UuDVRvIGNvbnNlbnQgdG8gdGhpcyBwbGVhc2UgcHJlc3MgIkFncmVlIiBi -ZWxvdy4gVG8gZGVjbGluZSBqdXN0IGV4aXQgdGhlIGFwcC4NA</bytes> +aGUgYmV0dGVyLiDigKjigKjigKhQTEVBU0UgTk9URTogWW91ciBhY3Rpb25zIHdpbGwgYmUgbG9nZ2Vk +LCBhbmQgc2VudCB0byBhIHNlY3VyZSBzZXJ2ZXIgaGVyZSBhdCBRdWVlbiBNYXJ5IFVuaXZlcnNpdHku +ICBIb3dldmVyIG5vIHBlcnNvbmFsIGRhdGEgKG5hbWUsIGVtYWlsIGV0Yy4pIHdpbGwgYmUgY29sbGVj +dGVkLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRCBvciBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBJdCBp +cyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYXJlIGNvbm5lY3RlZCB0byBXaUZpIGludGVybmV0 +IHdoaWxzdCB1c2luZyB0aGlzIEFwcCwgb3RoZXJ3aXNlIHRoZSBsb2cgZGF0YSB3aWxsIHRha2UgdXAg +c3BhY2Ugb24geW91ciBkZXZpY2UuDVRvIGNvbnNlbnQgdG8gdGhpcyBwbGVhc2UgcHJlc3MgIkFncmVl +IiBiZWxvdy4gVG8gZGVjbGluZSBqdXN0IGV4aXQgdGhlIGFwcC4NA</bytes> </object> <object class="NSColor" key="IBUITextColor"> <int key="NSColorSpace">1</int>
--- a/Question.m Fri Apr 19 18:50:04 2013 +0100 +++ b/Question.m Mon Apr 22 18:32:34 2013 +0100 @@ -44,18 +44,19 @@ if(type == AGREE_DISAGREE){ [Question setCount:NUM_CHOICES]; - // potential leak - return [[NSArray alloc] initWithObjects: + NSArray *answers = [[[NSArray alloc] initWithObjects: @"Strongly agree",@"Agree", @"Neither agree nor disagree", - @"Disagree",@"Strongly disagree", nil]; - + @"Disagree",@"Strongly disagree", nil] autorelease]; + + return answers; }else if(type == SLIDERS_ZOOMER){ [Question setCount:NUM_CHOICES]; - // potential leak - return [[NSArray alloc] initWithObjects: + NSArray *answers = [[[NSArray alloc] initWithObjects: @"definitely the Sliders", @"maybe the Sliders", @"Neither/Both equal", - @"maybe the Zoomer", @"definitely the Zoomer", nil]; + @"maybe the Zoomer", @"definitely the Zoomer", nil] autorelease]; + + return answers; }else{ return nil; }
--- a/QuestionnaireViewController.mm Fri Apr 19 18:50:04 2013 +0100 +++ b/QuestionnaireViewController.mm Mon Apr 22 18:32:34 2013 +0100 @@ -76,21 +76,11 @@ //---------------------------------------------------------------- - (void)dealloc { - [_questionText release]; - [_questionArray release]; - [_titleText release]; - [_finishButton release]; - [_nextButton release]; - [_previousButton release]; - [_commentText release]; - [_numberChooser release]; - [_interfacePreferenceOptions release]; - [_lickertOptions release]; - [_pleaseAnswer release]; [super dealloc]; } //---------------------------------------------------------------- - (void)viewDidUnload { + [self.questionArray release]; [self setQuestionText:nil]; [self setTitleText:nil]; [self setFinishButton:nil]; @@ -211,7 +201,7 @@ // potential leak self.questionArray = [NSArray arrayWithObjects: [[Question alloc] initWithTextAndType:@"I am familiar with music software and sound synthesis.":AGREE_DISAGREE], - [[Question alloc] initWithTextAndType:@"The best interface to get a feel for the possibilities of the synth was...":SLIDERS_ZOOMER], + [[Question alloc] initWithTextAndType:@"The ability to retrace my steps using the history path was useful...":AGREE_DISAGREE], [[Question alloc] initWithTextAndType:@"The best interface for discovering interesting sounds quickly was...":SLIDERS_ZOOMER], [[Question alloc] initWithTextAndType:@"The best interface for fine tuning a sound was...":SLIDERS_ZOOMER], [[Question alloc] initWithTextAndType:@"The correspondence between the sliders and the grid was understandable.":AGREE_DISAGREE], @@ -224,6 +214,7 @@ [[Question alloc] initWithTextAndType:@"The interface better for performing live would be...":SLIDERS_ZOOMER], [[Question alloc] initWithTextAndType:@"The Zoomer was an improvement on just using a randomiser.":AGREE_DISAGREE], [[Question alloc] initWithTextAndType:@"The combination of Zoomer and Sliders was better than either individually.":AGREE_DISAGREE], + [[Question alloc] initWithTextAndType:@"I enjoy 'happy accidents' in the creative process.":AGREE_DISAGREE], [[Question alloc] initWithTextAndType:@"Overall, the interface I preferred using was...":SLIDERS_ZOOMER], // ?????? nil]; // The zoomer seemed more appropriate to explore the synth sound controls (red) than the note sequence controls (blue)
--- a/ServerComms.mm Fri Apr 19 18:50:04 2013 +0100 +++ b/ServerComms.mm Mon Apr 22 18:32:34 2013 +0100 @@ -52,6 +52,7 @@ [request setHTTPBody:postData ]; NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:request delegate:self]; + [theConnection release]; self.requestInProgress = YES; return YES; // asynchronous one??
--- a/SliderViewController.mm Fri Apr 19 18:50:04 2013 +0100 +++ b/SliderViewController.mm Mon Apr 22 18:32:34 2013 +0100 @@ -30,8 +30,8 @@ - (void)viewDidLoad { int left = 22; - int top = 3; - const int height = 62; + int top = 10; + const int height = 50; const int width = 337; [super viewDidLoad]; @@ -39,7 +39,7 @@ for(int i=0;i<10;i++){ if(i==5){ - top = 0; + top = 10; left = left*3 + width; } SliderController * sliderV = [[SliderController alloc] initWithNibName:@"SliderController" bundle:nil delegate:self pID:i]; @@ -51,6 +51,9 @@ NSLog(@"setting name to %@", self.paramNames[i]); [sliderV changeLabel:self.paramNames[i] ]; [sliderV setParamValue:44]; + if(i>=5){ + [sliderV makeRed]; + } top += height; [self.sliderArray addObject:sliderV]; // not working @@ -96,7 +99,6 @@ ((testApp *)self.theOFAppRef)->sliderMoved(which,value); } - (void)setSlider:(int)which to:(float)value{ - NSLog(@"set slider to"); [[self.sliderArray objectAtIndex:which] setParamValue:value]; } - (void)populateParamNames{
--- a/SliderViewController.xib Fri Apr 19 18:50:04 2013 +0100 +++ b/SliderViewController.xib Mon Apr 22 18:32:34 2013 +0100 @@ -51,7 +51,7 @@ <object class="IBUIView" id="703174665"> <reference key="NSNextResponder" ref="766721923"/> <int key="NSvFlags">292</int> - <string key="NSFrame">{{0, 6}, {6, 313}}</string> + <string key="NSFrame">{{0, 6}, {6, 272}}</string> <reference key="NSSuperview" ref="766721923"/> <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="579598868"/> @@ -65,7 +65,7 @@ <object class="IBUIView" id="579598868"> <reference key="NSNextResponder" ref="766721923"/> <int key="NSvFlags">292</int> - <string key="NSFrame">{{762, 6}, {6, 313}}</string> + <string key="NSFrame">{{762, 6}, {6, 272}}</string> <reference key="NSSuperview" ref="766721923"/> <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="577336253"/> @@ -79,10 +79,9 @@ <object class="IBUIView" id="577336253"> <reference key="NSNextResponder" ref="766721923"/> <int key="NSvFlags">292</int> - <string key="NSFrame">{{0, 319}, {768, 6}}</string> + <string key="NSFrame">{{0, 272}, {768, 6}}</string> <reference key="NSSuperview" ref="766721923"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView"/> <string key="NSReuseIdentifierKey">_NS:9</string> <object class="NSColor" key="IBUIBackgroundColor"> <int key="NSColorSpace">1</int> @@ -91,7 +90,7 @@ <string key="targetRuntimeIdentifier">IBIPadFramework</string> </object> </array> - <string key="NSFrameSize">{768, 325}</string> + <string key="NSFrameSize">{768, 278}</string> <reference key="NSSuperview"/> <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="868794118"/> @@ -143,9 +142,9 @@ <reference key="object" ref="766721923"/> <array class="NSMutableArray" key="children"> <reference ref="868794118"/> - <reference ref="577336253"/> <reference ref="703174665"/> <reference ref="579598868"/> + <reference ref="577336253"/> </array> <reference key="parent" ref="0"/> </object>
--- a/TopButtonViewController.h Fri Apr 19 18:50:04 2013 +0100 +++ b/TopButtonViewController.h Mon Apr 22 18:32:34 2013 +0100 @@ -21,6 +21,10 @@ @property (retain, nonatomic) IBOutlet UIBarButtonItem *pauseButton; @property (retain, strong, nonatomic) IBOutlet UIBarButtonItem *qButton; @property (retain, strong,nonatomic) IBOutlet UIBarButtonItem *newUserButton; +@property (retain, nonatomic) IBOutlet UIBarButtonItem *lockXButton; +@property (retain, nonatomic) IBOutlet UIBarButtonItem *lockYButton; + + - (IBAction)nextSequence:(id)sender; - (IBAction)smoothSwitchChanged:(id)sender;
--- a/TopButtonViewController.mm Fri Apr 19 18:50:04 2013 +0100 +++ b/TopButtonViewController.mm Mon Apr 22 18:32:34 2013 +0100 @@ -85,11 +85,17 @@ presetManager.showNameDialog(); } +// this is crap - (IBAction)lockSequencePressed:(id)sender { UIBarButtonItem *button = (UIBarButtonItem *)sender; if([button.title isEqualToString:@"Lock X"]){ ((testApp *)self.theOFAppRef)->lockSequencerPressed(true); button.title = @"Unlock X"; + // if other one is locked , ulock it + if([self.lockYButton.title isEqualToString:@"Unlock Y"]){ + ((testApp *)self.theOFAppRef)->lockSynthPressed(false); + self.lockYButton.title = @"Lock Y"; + } }else if([button.title isEqualToString:@"Unlock X"]){ ((testApp *)self.theOFAppRef)->lockSequencerPressed(false); button.title = @"Lock X"; @@ -103,6 +109,12 @@ if([button.title isEqualToString:@"Lock Y"]){ ((testApp *)self.theOFAppRef)->lockSynthPressed(true); button.title = @"Unlock Y"; + // if other one is locked , ulock it + if([self.lockXButton.title isEqualToString:@"Unlock X"]){ + ((testApp *)self.theOFAppRef)->lockSequencerPressed(false); + self.lockXButton.title = @"Lock X"; + } + }else if([button.title isEqualToString:@"Unlock Y"]){ ((testApp *)self.theOFAppRef)->lockSynthPressed(false); button.title = @"Lock Y"; @@ -165,6 +177,8 @@ [_smoothSwitch release]; [_smoothToggle release]; [_savePresetButton release]; + [_lockXButton release]; + [_lockYButton release]; [super dealloc]; } - (void)viewDidUnload { @@ -176,6 +190,8 @@ [self setSmoothSwitch:nil]; [self setSmoothToggle:nil]; [self setSavePresetButton:nil]; + [self setLockXButton:nil]; + [self setLockYButton:nil]; [super viewDidUnload]; } @end
--- a/TopButtonViewController.xib Fri Apr 19 18:50:04 2013 +0100 +++ b/TopButtonViewController.xib Mon Apr 22 18:32:34 2013 +0100 @@ -95,6 +95,7 @@ <int key="IBUISystemItemIdentifier">18</int> </object> <object class="IBUIBarButtonItem" id="552018169"> + <bool key="IBUIEnabled">NO</bool> <string key="targetRuntimeIdentifier">IBIPadFramework</string> <int key="IBUIStyle">1</int> <reference key="IBUIToolbar" ref="358683122"/> @@ -121,12 +122,20 @@ <string key="targetRuntimeIdentifier">IBIPadFramework</string> <int key="IBUIStyle">1</int> <reference key="IBUIToolbar" ref="358683122"/> + <object class="NSColor" key="IBUITintColor"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MC4wOTM2MTE4Njg3NiAwLjE1MTc4MTc4MzUgMC43MDI5OTc2MjIzAA</bytes> + </object> </object> <object class="IBUIBarButtonItem" id="597523981"> <string key="IBUITitle">Lock Y</string> <string key="targetRuntimeIdentifier">IBIPadFramework</string> <int key="IBUIStyle">1</int> <reference key="IBUIToolbar" ref="358683122"/> + <object class="NSColor" key="IBUITintColor"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MC42MzU1MDg2NjE3IDAuMDcwMjA0OTU5ODMgMC4wNjI3MTI1NTE4MwA</bytes> + </object> </object> <object class="IBUIBarButtonItem" id="680653375"> <string key="targetRuntimeIdentifier">IBIPadFramework</string> @@ -147,7 +156,6 @@ <string key="NSFrame">{{59, 11}, {59, 21}}</string> <reference key="NSSuperview" ref="766721923"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView"/> <string key="NSReuseIdentifierKey">_NS:9</string> <bool key="IBUIOpaque">NO</bool> <bool key="IBUIClipsSubviews">YES</bool> @@ -276,6 +284,22 @@ <int key="connectionID">51</int> </object> <object class="IBConnectionRecord"> + <object class="IBCocoaTouchOutletConnection" key="connection"> + <string key="label">lockXButton</string> + <reference key="source" ref="841351856"/> + <reference key="destination" ref="189059998"/> + </object> + <int key="connectionID">56</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBCocoaTouchOutletConnection" key="connection"> + <string key="label">lockYButton</string> + <reference key="source" ref="841351856"/> + <reference key="destination" ref="597523981"/> + </object> + <int key="connectionID">57</int> + </object> + <object class="IBConnectionRecord"> <object class="IBCocoaTouchEventConnection" key="connection"> <string key="label">savePressed:</string> <reference key="source" ref="996249183"/> @@ -532,7 +556,7 @@ <nil key="activeLocalization"/> <dictionary class="NSMutableDictionary" key="localizations"/> <nil key="sourceID"/> - <int key="maxID">55</int> + <int key="maxID">57</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> <array class="NSMutableArray" key="referencedPartialClassDescriptions"> @@ -604,6 +628,8 @@ </object> </dictionary> <dictionary class="NSMutableDictionary" key="outlets"> + <string key="lockXButton">UIBarButtonItem</string> + <string key="lockYButton">UIBarButtonItem</string> <string key="newUserButton">UIBarButtonItem</string> <string key="pauseButton">UIBarButtonItem</string> <string key="playButton">UIBarButtonItem</string> @@ -614,6 +640,14 @@ <string key="smoothToggle">UISwitch</string> </dictionary> <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName"> + <object class="IBToOneOutletInfo" key="lockXButton"> + <string key="name">lockXButton</string> + <string key="candidateClassName">UIBarButtonItem</string> + </object> + <object class="IBToOneOutletInfo" key="lockYButton"> + <string key="name">lockYButton</string> + <string key="candidateClassName">UIBarButtonItem</string> + </object> <object class="IBToOneOutletInfo" key="newUserButton"> <string key="name">newUserButton</string> <string key="candidateClassName">UIBarButtonItem</string>
--- a/eventLogger.h Fri Apr 19 18:50:04 2013 +0100 +++ b/eventLogger.h Mon Apr 22 18:32:34 2013 +0100 @@ -63,7 +63,9 @@ EVALUATION_POINT, // 21 EMPTY_EVENT, // 22 SMOOTHING_ON, // 23 - SMOOTHING_OFF}; // 24 + SMOOTHING_OFF, // 24 + SNAPPED_TO_EVALPT, // 25 + PRESET_DOUBLE_TAPPED}; //--------------------------------------------------------------------------- @@ -175,6 +177,7 @@ void saveSessionToFile(); void drawTrail(const TwoVector min, const TwoVector max); vector<lEvent> getDrawableEventsInRange(const TwoVector min, const TwoVector max); + vector<lEvent *> getEvaluationPointsInRange(const TwoVector min, const TwoVector max); vector<TwoVector> getRecentPath(int numEvents); void clearTrail(); @@ -217,7 +220,8 @@ }; - + lEvent * e; + //---------------------------------------------------------------------------
--- a/eventLogger.mm Fri Apr 19 18:50:04 2013 +0100 +++ b/eventLogger.mm Mon Apr 22 18:32:34 2013 +0100 @@ -303,6 +303,25 @@ eventsToDraw.clear(); } //---------------------------------------------------------------------------- +vector<lEvent *> EventLogger::getEvaluationPointsInRange(const TwoVector min, const TwoVector max){ + vector<lEvent *> results; + if(eventsToDraw.size() <= 0){ + return results; + + } + + deque<lEvent>::iterator eiter; + deque<lEvent>::iterator preveiter; + for(eiter = --eventsToDraw.end(); eiter >= eventsToDraw.begin(); eiter--){ + if((*eiter).eventType == EVALUATION_POINT){ + if( ((*eiter).val1 > min.x ) && ((*eiter).val2 > min.y ) && ((*eiter).val1 < max.x ) && ((*eiter).val2 < max.y )){ + results.push_back(&(*eiter)); + } + } + } + return results; +} +//---------------------------------------------------------------------------- void EventLogger::drawTrail(const TwoVector min, const TwoVector max){ if(eventsToDraw.size() <= 0){ return; @@ -322,7 +341,11 @@ for(eiter = --eventsToDraw.end(); eiter >= eventsToDraw.begin(); eiter--){ //cout << i << '\n'; - if( (*eiter).eventType == SCROLL || (*eiter).eventType == EVALUATION_POINT){ + if( (*eiter).eventType == SCROLL + || (*eiter).eventType == EVALUATION_POINT + || (*eiter).eventType == RANDOMISE + || (*eiter).eventType == CHANGE_SLIDER) + { i++; if(i > SCROLL_TRAIL_LENGTH){ return; @@ -542,6 +565,14 @@ case SWAP_VIEW: theEvents.push_back(lEvent(evtType,0.0 , 0.0 , sliderID)); // slider ID is which view break; + // these cases are move events that need to be put in events to draw + case RANDOMISE: + theEvents.push_back(lEvent(evtType,centre.x,centre.y)); + eventsToDraw.push_back(lEvent(evtType,centre.x,centre.y)); + if(eventsToDraw.size() > SCROLL_TRAIL_LENGTH){ + eventsToDraw.pop_front(); + } + break; default: // default is just an event type with no values theEvents.push_back(lEvent(evtType));
--- a/grid.h Fri Apr 19 18:50:04 2013 +0100 +++ b/grid.h Mon Apr 22 18:32:34 2013 +0100 @@ -19,13 +19,12 @@ using namespace std; class Preset; - - class Grid { public: bool snapped; - + bool automatedMovement; + bool presetWasTapped; Hilbert hilbert; Grid(); @@ -34,6 +33,8 @@ void move(TwoVector moveP); // shift view by pixels void zoom(float factor); + void tap(TwoVector pixel); // user has tapped a point + typedef enum{NO_INTERPOLATION, INTERPOLATE_GRID, INTERPOLATE_PRESET} interpolateModeType; interpolateModeType interpolateMode; void snapCheck(); @@ -49,11 +50,16 @@ void setMinZoom(); void setMaxZoom(); void setInterpolation(interpolateModeType mode); + + Preset * getClosestPresetOf(vector<Preset *> closePresets); + void interpolateTo(TwoVector coord); // HILBERT now does each coord for this vector<int> calculateParamsFromCoord(TwoVector coord); TwoVector calculateCoordFromParams(vector<int> params); vector<int> calculateInterpolatedParamsFromCoord(TwoVector coord); TwoVector coordToPixel(TwoVector coord); + TwoVector pixelToCoord(TwoVector pixel); + void setScale(double scaleLevel); // the inverse stuff void setParams(vector<int>); @@ -81,7 +87,7 @@ TwoVector snapCentre; TwoVector snapDist; // number of pixels to snap to GUI Preset * closestPreset; // pointer to the currently selected (snapped to ) preset.. NULL if none. - + Preset * tappedPreset; // pointer to currently highlighted (tapped) bool maxZoom, minZoom; vector<int> midiCC; // the actual params @@ -103,6 +109,7 @@ void setCoord(TwoVector coord); void drawCrossHairs(); + double calculateInterpolateLevel(); vector<int> interpVector(vector<int> upper, vector<int> lower, float frac); vector<int> interpHilbert(int bitlevel, TwoVector coord);
--- a/grid.mm Fri Apr 19 18:50:04 2013 +0100 +++ b/grid.mm Mon Apr 22 18:32:34 2013 +0100 @@ -25,6 +25,7 @@ } void Grid::init(){ + presetWasTapped = false; maxValue = pow(2.0,paramsPerDim*paramBitDepth)-1; interpolateMode = NO_INTERPOLATION; @@ -222,21 +223,21 @@ if(colCycle == 0){ ofSetColor(255,255,255,alpha); }else if(colCycle == 1){ - ofSetColor(255,0,0,alpha); + ofSetColor(75,0,130,alpha); }else if(colCycle == 2){ ofSetColor(0,0,255,alpha); }else if(colCycle == 3){ ofSetColor(0,255,0,alpha); }else if(colCycle == 4){ - ofSetColor(255,0,255,alpha); + ofSetColor(255,255,0,alpha); }else if(colCycle == 5){ - ofSetColor(0,255,255,alpha); + ofSetColor(255,127,0,alpha); }else if(colCycle == 6){ - ofSetColor(255,255,0,alpha); + ofSetColor(255,0,0,alpha); }else if(colCycle == 7){ - ofSetColor(255,255,255,alpha); + ofSetColor(255,255,255,255); }else{ - ofSetColor(255,255,255,alpha); + ofSetColor(255,255,255,255); cout << "colour cycle > 7\n"; } @@ -364,14 +365,23 @@ return pix; } +//----------------------------------------------------------------------- +TwoVector Grid::pixelToCoord(TwoVector pixel){ + return pixel*scale + topLeft; + +} //----------------------------------------------------------------------- void Grid::drawPresets(){ presetManager.drawPresetsInRange(topLeft, topLeft + size); // draw snapped preset info - if(snapped && closestPreset != NULL){ - ofDrawBitmapString( closestPreset->displayTextDescription(), pixSize.x/2+10, pixSize.y/2+10 ); + if(tappedPreset && tappedPreset != NULL){ + TwoVector presetPos = coordToPixel(tappedPreset->coordinates); + ofDrawBitmapString( tappedPreset->displayTextDescription(), presetPos.x, presetPos.y ); + }else if( (snapped) && closestPreset != NULL){ + ofDrawBitmapString( closestPreset->displayTextDescription(), pixSize.x/2 +10, pixSize.y/2+10 ); } + } @@ -421,6 +431,36 @@ } +//-------------------------------------------------------------- +void Grid::tap(TwoVector pixel){ + static Preset * lastTappedPreset; + + // search nearby for preset + TwoVector tapCoord = pixelToCoord(pixel); + + vector<Preset *> closePresets = presetManager.getPresetsInRange(tapCoord - snapDist*2*scale, tapCoord + snapDist*2*scale); + if(closePresets.size() > 0){ + tappedPreset = getClosestPresetOf(closePresets); + //interpolateTo(coordinates); + cout << "tapped preset: " << tappedPreset->name << "\n"; + presetWasTapped = true; + + if(lastTappedPreset == tappedPreset){ + cout << "DOUBLE tapped preset: " << tappedPreset->name << "\n"; + + //TODO interpolate to this! exciting! + setCoord(tappedPreset->coordinates); // should just go there and do all the calcs + ((testApp *)ofGetAppPtr())->setAllGUISliders(getParams()); + eventLogger.logEvent(PRESET_DOUBLE_TAPPED, getCoord(), scale); + + + } + + lastTappedPreset = tappedPreset; + }else{ + // nothing ? + } +} //-------------------------------------------------------------- @@ -478,8 +518,23 @@ } //-------------------------------------------------------------- +Preset * Grid::getClosestPresetOf(vector<Preset *> somepresets){ + double dist, mindist = maxValue; + Preset * cPreset = somepresets[0]; + + for(vector<Preset *>::iterator piter = somepresets.begin(); piter < somepresets.end(); piter++){ + dist = (*piter)->coordinates.distanceTo(centre); + + if(dist < mindist){ + mindist = dist; + cPreset = (*piter); + } + } + return cPreset; +} +//-------------------------------------------------------------- void Grid::snapCheck(){ - + lEvent *closestEvalPt; if(interpolateMode == INTERPOLATE_GRID){ snapped = false; closestPreset = NULL; @@ -488,31 +543,50 @@ } // no presets visible // check environs for presets. + vector<Preset *> 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<Preset *>::iterator piter = closePresets.begin(); piter < closePresets.end(); piter++){ - dist = (*piter)->coordinates.distanceTo(centre); - - if(dist < mindist){ - mindist = dist; - closestPreset = *piter; - } - } + presetWasTapped = false; + closestPreset = getClosestPresetOf(closePresets); snapCentre = closestPreset->coordinates; eventLogger.logEvent(SNAPPED_TO_PRESET, getCoord(),closestPreset->creationTime ); - //cout << "SNAPPED CHECK\n"; - - // causes too many problems just move it + }else{ - snapped = false; - closestPreset = NULL; - snapCentre = centre; + // do an evaluation snap check . duplicate code >:[ + + vector<lEvent *> closeEvalPoints = eventLogger.getEvaluationPointsInRange(centre - snapDist*scale, centre + snapDist*scale); + if(closeEvalPoints.size() > 0){ + snapped = true; + + double dist, mindist = maxValue; + closestEvalPt = closeEvalPoints[0]; + + for(vector<lEvent *>::iterator eiter = closeEvalPoints.begin(); eiter < closeEvalPoints.end(); eiter++){ + TwoVector coord = TwoVector((*eiter)->val1,(*eiter)->val2); + dist = coord.distanceTo(centre); + + if(dist < mindist){ + mindist = dist; + closestEvalPt = (*eiter); + snapCentre = coord; + } + + } + + eventLogger.logEvent(SNAPPED_TO_EVALPT, getCoord() ); + + }else{ + snapped = false; + closestPreset = NULL; + closestEvalPt = NULL; + tappedPreset = NULL; + snapCentre = centre; + } + + + }
--- a/presetManager.h Fri Apr 19 18:50:04 2013 +0100 +++ b/presetManager.h Mon Apr 22 18:32:34 2013 +0100 @@ -104,7 +104,7 @@ // names values // check if already there // find and return all(?) presets within a certain coordinate range - vector<Preset *> thePresets; + vector<Preset> thePresets; int addPreset(string name); int loadPreset(const TwoVector coord, const string name, long long stime);
--- a/presetManager.mm Fri Apr 19 18:50:04 2013 +0100 +++ b/presetManager.mm Mon Apr 22 18:32:34 2013 +0100 @@ -107,13 +107,13 @@ Json::Value root; // use jsoncpp - vector<Preset *>::iterator presetIter; + vector<Preset>::iterator presetIter; int i = 0; for(presetIter = thePresets.begin(); presetIter < thePresets.end(); presetIter++){ // only save the preset to file if it was ours... (other users and defaults saved elewhere) - if((*presetIter)->creatorDeviceID == eventLogger.deviceID){ - root["presets"][i] = (*presetIter)->presetToJson(); + if((*presetIter).creatorDeviceID == eventLogger.deviceID){ + root["presets"][i] = (*presetIter).presetToJson(); i++; } } @@ -157,7 +157,7 @@ // now put into variables const Json::Value jpresets = root["presets"]; - for ( int index = 0; index < jpresets.size(); ++index ) thePresets.push_back(new Preset(jpresets[index])); + for ( int index = 0; index < jpresets.size(); ++index ) thePresets.push_back(Preset(jpresets[index])); //printAll(); @@ -205,7 +205,7 @@ TwoVector coord = theGridView.getCoordForPresetSave(); - thePresets.push_back(new Preset(coord, name,nextID, eventLogger.userName, eventLogger.deviceID)); + thePresets.push_back(Preset(coord, name,nextID, eventLogger.userName, eventLogger.deviceID)); eventLogger.logEvent(SAVE_PRESET, coord); // poke grid view to get it to show details theGridView.snapCheck(); @@ -216,7 +216,7 @@ //--------------------------------------------------------------------------- int PresetManager::loadPreset(const TwoVector coord, const string name, long long stime){ - thePresets.push_back(new Preset(coord, name,nextID, stime)); + thePresets.push_back(Preset(coord, name,nextID, stime)); // if ok return nextID++; @@ -229,10 +229,10 @@ // so: put burden on saving rather than retrieving, make into list and index using coordinates vector<Preset *> results; - vector<Preset *>::iterator presetIter; + vector<Preset>::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); + 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)); } }
--- a/testApp.h Fri Apr 19 18:50:04 2013 +0100 +++ b/testApp.h Mon Apr 22 18:32:34 2013 +0100 @@ -116,6 +116,7 @@ void gotMemoryWarning(); void deviceOrientationChanged(int newOrientation); + bool tapFlag; ofxOscSender sender; void sendOSCParams();
--- a/testApp.mm Fri Apr 19 18:50:04 2013 +0100 +++ b/testApp.mm Mon Apr 22 18:32:34 2013 +0100 @@ -43,16 +43,16 @@ // now do things that will affect the start up state of the app - /* - if(eventLogger.questionnaireCompleted){ // then we go into do-what-you-like mode + if(true){ + // if(eventLogger.questionnaireCompleted){ // then we go into do-what-you-like mode freeUseMode(); }else{ // then we're in timed session mode showIntro(); } - */ - freeUseMode(); + + //freeUseMode(); // GO paused = false; eventLogger.logEvent(APP_STARTED); @@ -109,8 +109,8 @@ //SLIDER - setupSliderGui(); - sliderGUI->setVisible(false); + //setupSliderGui(); + //sliderGUI->setVisible(false); // initial slider vals for(int i=0; i<10;i++){ @@ -134,22 +134,24 @@ [topButtonViewController show:(id)this]; topButtonViewController.view.frame = CGRectMake(0,0,getWidth(),44); - usernameAlertViewController = [[UsernameAlertViewController alloc] init]; - [usernameAlertViewController setAppRef:(id)this]; + + + //SLIDER + + sliderViewController = [[SliderViewController alloc] initWithNibName:@"SliderViewController" bundle:nil]; + [ofxiPhoneGetGLParentView() addSubview:sliderViewController.view]; + [sliderViewController setAppRef:(id)this]; + sliderViewController.view.frame = CGRectMake(0,getHeight()-43 - 278,getWidth(),278); + [sliderViewController show:(id)this]; helpViewController = [[HelpViewController alloc] initWithNibName:@"HelpViewController" bundle:nil]; [ofxiPhoneGetGLParentView() addSubview:helpViewController.view]; [helpViewController setAppRef:(id)this]; helpViewController.view.hidden = YES; - //SLIDER - - sliderViewController = [[SliderViewController alloc] initWithNibName:@"SliderViewController" bundle:nil]; - [ofxiPhoneGetGLParentView() addSubview:sliderViewController.view]; - [sliderViewController setAppRef:(id)this]; - sliderViewController.view.frame = CGRectMake(0,getHeight()-43 - 325,getWidth(),325); - [sliderViewController show:(id)this]; - + + usernameAlertViewController = [[UsernameAlertViewController alloc] init]; + [usernameAlertViewController setAppRef:(id)this]; setAllGUISliders(theGridView.getParams()); @@ -233,7 +235,7 @@ } //SLIDER - delete sliderGUI; + //delete sliderGUI; cout << "exit done \n"; } @@ -484,15 +486,15 @@ sendOSCParams(); } - eventLogger.logEvent(CHANGE_SLIDER, TwoVector(),0.0,which , value); - + eventLogger.logEvent(CHANGE_SLIDER, theGridView.getCoord(),0.0,which , value); + } //-------------------------------------------------------------- void testApp::setAllGUISliders(vector<int> vals){ - //SLIDER + // an update caused by zoomer view being moved for(int i = 0; i<NUM_PARAMS;i++){ - sliders[i]->setValue(vals[i]); + //sliders[i]->setValue(vals[i]); sliderVals[i] = vals[i]; [sliderViewController setSlider:i to:vals[i]]; @@ -521,7 +523,7 @@ setAllGUISliders(sliderVals); - eventLogger.logEvent(RANDOMISE, theGridView.getCoord() ,0.0); + eventLogger.logEvent(RANDOMISE, theGridView.getCoord() ,theGridView.getScale()); } //-------------------------------------------------------------- @@ -665,7 +667,7 @@ setAllGUISliders(theGridView.getParams()); } - + // MOVE MOMENTUM if(moveVel.norm() > 0.3){ if(theGridView.snapped){ // stop it (snap check sends snap event) @@ -720,23 +722,16 @@ //-------------------------------------------------------------- void testApp::touchDown(ofTouchEventArgs &touch){ - // in slider gui area? - //SLIDER - if(whichInterfaceShowing == SLIDERS){ - return; - }else if (whichInterfaceShowing == BOTH && touch.x < (SLIDER_GUI_WIDTH+10)){ - return; - - }// otherwise we're good to let the zoomer handle touch numActiveTouches++; preventingMovePostScroll = false; - + tapFlag = false; // unless touch 0 if(touch.id == 0){ touch0.setCoord(touch.x,touch.y); prevTouch0 = touch0; // stop zoom zoomVel = 0.0; + tapFlag = true; }else if(touch.id == 1){ touch1.setCoord(touch.x,touch.y); @@ -760,18 +755,7 @@ //-------------------------------------------------------------- void testApp::touchMoved(ofTouchEventArgs &touch){ - - // TODO check if in gui area!!! - //SLIDER - if(whichInterfaceShowing == SLIDERS){ - return; - }else if (whichInterfaceShowing == BOTH && touch.x < (SLIDER_GUI_WIDTH+10)){ - return; - - } - - // otherwise we're good to let the zoomer handle touch - + tapFlag = false; // which one? keep track of each touch point if(touch.id == 0){ touch0.setCoord(touch.x,touch.y); @@ -794,6 +778,53 @@ } //-------------------------------------------------------------- +void testApp::touchUp(ofTouchEventArgs &touch){ + if(numActiveTouches > 0) numActiveTouches--; // dirty + preventingMovePostScroll = false; + // TODO check if in gui area!!! + //SLIDER + if(whichInterfaceShowing == SLIDERS){ + return; + } + + if(tapFlag){ + cout << "TAP!!\n"; + // look for close preset + theGridView.tap(TwoVector(touch.x,touch.y)); + } + tapFlag = false; + // which one? + if(touch.id == 0){ + // tricky situation - we tried to zoom but may have left non-move finger on + prevTouch0.setCoord(touch.x,touch.y); + + }else if(touch.id == 1){ + + + prevTouch1.setCoord(0,0); + + } + if(numActiveTouches == 0){ + // check time since last move + // check time since last move - if + unsigned int moveTime = ofGetSystemTimeMicros(); + if(moveTime - lastMoveTime > 100000){ + moveVel = TwoVector(); // zero + }else{ + moveVel = (move*0.3 + prevMove*0.34 + prevMove2*0.38); // use the time + + } + lastMoveTime = moveTime; + }else if (numActiveTouches == 1){ + // just zoomed , but now lifted one of the fingers + // can be bad if moved so create special mode to stop scroll (special modes bad!) + preventingMovePostScroll = true; + } + +} + + +//-------------------------------------------------------------- // handle a finger being dragged void testApp::handleScroll(){ @@ -854,50 +885,6 @@ } //-------------------------------------------------------------- -void testApp::touchUp(ofTouchEventArgs &touch){ - if(numActiveTouches > 0) numActiveTouches--; // dirty - preventingMovePostScroll = false; - // TODO check if in gui area!!! - //SLIDER - if(whichInterfaceShowing == SLIDERS){ - return; - }else if (whichInterfaceShowing == BOTH && touch.x < 256){ - return; - - }// otherwise we're good to let the zoomer handle touch - - - // which one? - if(touch.id == 0){ - // tricky situation - we tried to zoom but may have left non-move finger on - prevTouch0.setCoord(touch.x,touch.y); - - }else if(touch.id == 1){ - - - prevTouch1.setCoord(0,0); - - } - if(numActiveTouches == 0){ - // check time since last move - // check time since last move - if - unsigned int moveTime = ofGetSystemTimeMicros(); - if(moveTime - lastMoveTime > 100000){ - moveVel = TwoVector(); // zero - }else{ - moveVel = (move*0.3 + prevMove*0.34 + prevMove2*0.38); // use the time - - } - lastMoveTime = moveTime; - }else if (numActiveTouches == 1){ - // just zoomed , but now lifted one of the fingers - // can be bad if moved so create special mode to stop scroll (special modes bad!) - preventingMovePostScroll = true; - } - -} - -//-------------------------------------------------------------- void testApp::touchDoubleTap(ofTouchEventArgs &touch){ // preset? @@ -1244,7 +1231,7 @@ vector<double> vals; for(int i = 0; i< N ; i++){ - sliderVals = theGridView.calculateParamsFromCoord(presetManager.thePresets[i]->coordinates); + sliderVals = theGridView.calculateParamsFromCoord(presetManager.thePresets[i].coordinates); vals.push_back((sliderVals[0]+32)*8.); // DC offset for(int i=1; i<5;i++){