rt300@0: #include "testApp.h" rt300@2: rt300@24: #define SLIDER_GUI_WIDTH 256 rt300@25: #define NUM_PARAMS 10 rt300@0: extern Grid theGridView; rt300@0: extern PresetManager presetManager; rt300@1: extern EventLogger eventLogger; rt300@3: extern Frequencer frequencer; rt300@9: rt300@24: const vector parameterNames; rt300@24: rt300@24: const string sliderParamNames[10] = {"Transpose", "1/4 note","1/6 note","1/7 note","1/8 note","Waveform", "Filter Type","Filter Freq", "Envelope","FM amt"}; rt300@24: //const vector v(ra[0],ra[1]); rt300@24: rt300@24: rt300@7: //DeviceID3523537000 rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::setup(){ rt300@16: paused = true; rt300@16: rt300@24: rt300@16: ofBackground( 0, 0, 0 ); rt300@0: ofEnableAlphaBlending(); rt300@21: //ofEnableSmoothing(); rt300@0: rt300@0: // open an outgoing connection to HOST:PORT rt300@0: sender.setup( HOST, PORT ); rt300@3: ofSetFrameRate(30); rt300@0: // reciever rt300@6: lastMoveTime = ofGetSystemTimeMicros(); rt300@0: prevTouchX = 0; rt300@0: prevTouchY = 0; rt300@0: rt300@0: xLocked = false; rt300@0: yLocked = false; rt300@0: rt300@0: numActiveTouches = 0; rt300@3: touch0.setCoord(17./7., 2./3.); rt300@0: touch1.setCoord(10,20); rt300@3: rt300@0: prevTouch0.setCoord(1,2); rt300@0: prevTouch1.setCoord(10,20); rt300@0: prevDist = 10; rt300@16: slowFactor = 0.98; rt300@16: rt300@16: rt300@16: // the 5 harmonics for the frequencer rt300@16: freqIndexes.push_back(0); rt300@16: freqIndexes.push_back(4); rt300@16: freqIndexes.push_back(6); rt300@16: freqIndexes.push_back(7); rt300@16: freqIndexes.push_back(8); rt300@16: rt300@16: rt300@16: ofxiPhoneSetOrientation( OFXIPHONE_ORIENTATION_PORTRAIT ); // do this before setting up all the other objects rt300@0: rt300@24: // initialise the interfaces rt300@0: theGridView.init(); rt300@0: rt300@24: setupSliderGui(); rt300@24: sliderGUI->setVisible(true); rt300@0: rt300@0: // initial slider vals rt300@0: for(int i=0; i<10;i++){ rt300@0: sliderVals.push_back(64); rt300@0: } rt300@8: rt300@24: // initialise PD rt300@24: rt300@2: int ticksPerBuffer = 8; // 8 * 64 = buffer len of 512 rt300@2: rt300@2: // setup the app core rt300@2: core.setup(2, 1, 44100, ticksPerBuffer); rt300@2: rt300@2: // setup OF sound stream rt300@2: ofSoundStreamSetup(2, 1, this, 44100, ofxPd::blockSize()*ticksPerBuffer, 3); rt300@1: rt300@24: rt300@24: rt300@24: // set up iOS gui stuff rt300@24: bottomTabViewController = [[BottomTabViewController alloc] initWithNibName:@"BottomTabViewController" bundle:nil]; rt300@24: [ofxiPhoneGetGLParentView() addSubview:bottomTabViewController.view]; rt300@24: rt300@24: [bottomTabViewController setAppRef:(id)this]; rt300@24: [bottomTabViewController show:(id)this]; rt300@24: rt300@24: bottomTabViewController.view.frame = CGRectMake(0,getHeight()-44,getWidth(),44); rt300@24: rt300@24: ///// rt300@24: rt300@24: topButtonViewController = [[TopButtonViewController alloc] initWithNibName:@"TopButtonViewController" bundle:nil]; rt300@24: [ofxiPhoneGetGLParentView() addSubview:topButtonViewController.view]; rt300@24: [topButtonViewController setAppRef:(id)this]; rt300@24: [topButtonViewController show:(id)this]; rt300@24: topButtonViewController.view.frame = CGRectMake(0,0,getWidth(),44); rt300@24: rt300@25: usernameAlertViewController = [[UsernameAlertViewController alloc] init]; rt300@25: /* rt300@25: sliderViewController = [[SliderViewController alloc] initWithNibName:@"SLiderViewController" bundle:nil]; rt300@25: [ofxiPhoneGetGLParentView() addSubview:sliderViewController.view]; rt300@25: rt300@25: [sliderViewController setAppRef:(id)this]; rt300@25: [sliderViewController show:(id)this]; rt300@25: rt300@25: sliderViewController.view.frame = CGRectMake(0,getHeight()-43 - 363,getWidth(),44); rt300@25: */ rt300@25: rt300@24: // initialise user logging stuff rt300@5: presetManager.startupLoadAll(); rt300@7: eventLogger.init(); rt300@24: rt300@25: whichInterfaceShowing = BOTH; rt300@24: // GO rt300@16: paused = false; rt300@16: rt300@24: } rt300@24: rt300@24: rt300@24: //-------------------------------------------------------------- rt300@24: void testApp::exit(){ rt300@25: rt300@25: presetManager.exitAndSaveAll(); rt300@25: eventLogger.exitAndSave(); rt300@25: rt300@24: core.exit(); rt300@24: rt300@25: // are these handled automatically? rt300@25: //[introViewController release]; rt300@25: //[topButtonViewController release]; rt300@25: //[bottomTabViewController release]; rt300@24: rt300@24: delete sliderGUI; rt300@24: rt300@24: cout << "exit done \n"; rt300@0: } rt300@24: rt300@24: //-------------------------------------------------------------- rt300@3: #pragma mark GUI rt300@16: //-- rt300@16: float testApp::getWidth(){ rt300@16: // depends on orientation rt300@16: return ofGetWidth(); rt300@16: rt300@16: } rt300@16: float testApp::getHeight(){ rt300@16: // depends on orientation rt300@16: return ofGetHeight(); rt300@16: rt300@16: } rt300@24: #pragma mark GUI rt300@24: //////////////////////////// rt300@24: // These functions called from iOS toolbars rt300@24: //-------------------------------------------------------------- rt300@24: void testApp::lockSequencerPressed(bool locked){ rt300@24: theGridView.shiftCentreToSnapped(); rt300@24: xLocked = locked; rt300@25: eventLogger.logEvent(SEQ_LOCKED); rt300@25: rt300@24: rt300@24: } rt300@24: //-------------------------------------------------------------- rt300@24: void testApp::lockSynthPressed(bool locked){ rt300@24: theGridView.shiftCentreToSnapped(); rt300@24: yLocked = locked; rt300@25: eventLogger.logEvent(SYNTH_LOCKED); rt300@24: rt300@24: } rt300@24: //-------------------------------------------------------------- rt300@24: void testApp::seqStartStop(bool go){ rt300@24: if(!go){ //stop rt300@24: core.pd.startMessage(); rt300@24: core.pd.addFloat(0); rt300@24: core.pd.finishMessage("fromOF", "seqStartStop"); rt300@25: eventLogger.logEvent(PAUSE_PRESSED); rt300@24: }else { // play rt300@24: //stopSequencer(); rt300@24: core.pd.startMessage(); rt300@24: core.pd.addFloat(1); rt300@24: core.pd.finishMessage("fromOF", "seqStartStop"); rt300@25: eventLogger.logEvent(PLAY_PRESSED); rt300@24: } rt300@24: } rt300@24: //-------------------------------------------------------------- rt300@24: void testApp::showQuestionnaire(){ rt300@24: // stop updating / drawing rt300@24: rt300@24: // if(eventLogger.questionnaireCompleted) return; rt300@24: rt300@24: paused = true; rt300@24: rt300@24: //stopSequencer rt300@24: core.pd.startMessage(); rt300@24: core.pd.addFloat(0); rt300@24: core.pd.finishMessage("fromOF", "seqStartStop"); rt300@24: rt300@24: questionnaireViewController = [[QuestionnaireViewController alloc] initWithNibName:@"QuestionnaireViewController" bundle:nil]; rt300@24: [ofxiPhoneGetGLParentView() addSubview:questionnaireViewController.view]; rt300@24: rt300@24: [questionnaireViewController setAppRef:(id)this]; rt300@24: [questionnaireViewController show:(id)this]; rt300@24: rt300@24: whichInterfaceShowing = QUESTIONNAIRE; rt300@24: rt300@24: rt300@24: } rt300@24: //-------------------------------------------------------------- rt300@24: void testApp::questionnaireHidden(vector answers){ rt300@24: // send answers to server as json rt300@24: eventLogger.questionnaireAnswersObtained(answers); rt300@24: rt300@24: // set "we've done questionnaire" to true in event logger rt300@24: paused = false; rt300@24: rt300@24: //startSequencer (TODO what about the toggle ? ?) rt300@24: core.pd.startMessage(); rt300@24: core.pd.addFloat(1); rt300@24: core.pd.finishMessage("fromOF", "seqStartStop"); rt300@24: whichInterfaceShowing = BOTH; rt300@24: // tell bottomtabviewcontroller rt300@24: rt300@24: } rt300@24: //-------------------------------------------------------------- rt300@24: void testApp::showIntro(){ rt300@24: paused = true; rt300@25: rt300@24: cout << "SHOW INTRO\n"; rt300@24: rt300@24: introViewController = [[IntroViewController alloc] initWithNibName:@"IntroViewController" bundle:nil]; rt300@24: [ofxiPhoneGetGLParentView() addSubview:introViewController.view]; rt300@24: rt300@24: [introViewController setAppRef:(id)this]; rt300@24: [introViewController show:(id)this]; rt300@24: rt300@24: rt300@24: whichInterfaceShowing = INTRO; rt300@24: rt300@24: } rt300@24: //-------------------------------------------------------------- rt300@24: void testApp::introHidden(bool OK){ rt300@24: if(OK){ rt300@24: paused = false; rt300@25: eventLogger.consentGiven = true; rt300@24: whichInterfaceShowing = BOTH; rt300@25: // show username prompt rt300@25: [usernameAlertViewController showUserNamePrompt]; rt300@24: } rt300@24: // no unOK rt300@24: } rt300@24: //-------------------------------------------------------------- rt300@24: // called from BottomTabViewController iOS segmented thing rt300@24: void testApp::interfaceSelected(int which){ rt300@24: switch (which){ rt300@24: case 0: rt300@24: rt300@24: whichInterfaceShowing = SLIDERS; rt300@24: sliderGUI->setVisible(true); rt300@24: // set the slider values to stuff got from zoomer rt300@24: sliderVals = theGridView.getParams(); rt300@24: setAllGUISliders(sliderVals); rt300@25: rt300@24: break; rt300@24: case 1: rt300@24: rt300@24: whichInterfaceShowing = BOTH; rt300@24: sliderGUI->setVisible(true); rt300@24: // set the slider values to stuff got from zoomer rt300@24: sliderVals = theGridView.getParams(); rt300@24: setAllGUISliders(sliderVals); rt300@24: break; rt300@24: case 2: rt300@24: rt300@24: sliderGUI->setVisible(false); rt300@24: whichInterfaceShowing = ZOOMER; rt300@24: break; rt300@24: } rt300@25: eventLogger.logEvent(SWAP_VIEW,TwoVector(),0.0, which); rt300@24: } rt300@24: //-------------------------------------------------------------- rt300@24: //-------------------------------------------------------------- rt300@24: void testApp::setupSliderGui(){ rt300@24: float xInit = OFX_UI_GLOBAL_WIDGET_SPACING; rt300@24: float length = SLIDER_GUI_WIDTH - (OFX_UI_GLOBAL_WIDGET_SPACING*2); rt300@24: rt300@24: rt300@24: //float dim = 42; rt300@24: rt300@24: // make this iphone size...? rt300@24: int height = 480; rt300@24: int width = 320; rt300@24: float dim = (height-10.0*OFX_UI_GLOBAL_WIDGET_SPACING)/10.0; rt300@24: // LEFT GUI rt300@24: sliderGUI = new ofxUICanvas(0,100,SLIDER_GUI_WIDTH,getHeight()); rt300@24: rt300@24: // Uh.. loop this rt300@24: for(int i = 1; i<=10;i++){ rt300@24: rt300@24: ofxUISlider *slider; rt300@25: slider = (ofxUISlider *)sliderGUI->addWidgetDown(new ofxUISlider(length,dim,0.0,127,64,sliderParamNames[i-1])); rt300@24: slider->setDrawPadding(true); rt300@24: if(i <= 5){ rt300@24: slider->setColorFill(ofColor(0,0,255)); rt300@24: slider->setColorFillHighlight(ofColor(0,0,255)); rt300@24: }else{ rt300@24: slider->setColorFill(ofColor(255,0,0)); rt300@24: slider->setColorFillHighlight(ofColor(255,0,0)); rt300@24: } rt300@24: rt300@24: sliders.push_back(slider); rt300@24: } rt300@24: rt300@24: rt300@24: rt300@24: ofAddListener(sliderGUI->newGUIEvent, this, &testApp::sliderGUIEvent); rt300@24: rt300@24: } rt300@24: //-------------------------------------------------------------- rt300@24: void testApp::sliderGUIEvent(ofxUIEventArgs &e){ rt300@24: if(whichInterfaceShowing == ZOOMER){ rt300@24: cout << "GUI ERROR"; rt300@24: return; rt300@24: } rt300@24: rt300@0: // "normal" parameter changes rt300@0: for(int i = 1; i<=10;i++){ rt300@0: rt300@24: if(e.widget->getName() == sliderParamNames[i-1]) rt300@0: { rt300@0: //cout << "param change: " << p; rt300@0: ofxUISlider *slider = (ofxUISlider *) e.widget; rt300@3: sliderMoved(i-1,slider->getScaledValue()); // internal array 0 indexed rt300@0: } rt300@0: } rt300@24: rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@3: void testApp::sliderMoved(int which, float value){ rt300@3: // an update caused by slider view being touched rt300@0: sliderVals[which] = (int)value; rt300@0: theGridView.setParams(sliderVals); rt300@24: rt300@3: sendParametersToPD(); rt300@5: rt300@9: eventLogger.logEvent(CHANGE_SLIDER, TwoVector(),0.0,which , value); rt300@5: rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@3: void testApp::setAllGUISliders(vector vals){ rt300@3: // an update caused by zoomer view being moved rt300@25: for(int i = 0; isetValue(vals[i]); rt300@1: sliderVals[i] = vals[i]; rt300@0: } rt300@3: rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@25: void testApp::randomise(){ rt300@25: // pick random settings for all params rt300@25: for(int i=0; i < NUM_PARAMS ; i++){ rt300@25: sliderVals[i] = ofRandom(0, 127); rt300@25: rt300@25: } rt300@25: rt300@25: // send to grid, sliders and PD rt300@25: theGridView.setParams(sliderVals); rt300@25: setAllGUISliders(sliderVals); rt300@25: sendParametersToPD(); rt300@25: rt300@25: eventLogger.logEvent(RANDOMISE, theGridView.getCoord() ,0.0); rt300@25: rt300@25: } rt300@25: //-------------------------------------------------------------- rt300@3: void testApp::sendParametersToPD(){ rt300@3: // frequencer stuff to get 16 steps rt300@3: vector vals; rt300@3: rt300@3: rt300@3: vals.push_back((sliderVals[0]+32)*8.); // DC offset rt300@3: for(int i=1; i<5;i++){ rt300@3: vals.push_back((sliderVals[i] - 64)*2.); rt300@3: } rt300@3: rt300@3: vector steps = frequencer.freqMagEdit(freqIndexes, vals); rt300@3: // send a list using the List object rt300@3: List seqSteps; rt300@3: rt300@3: seqSteps.addSymbol("seqSteps"); rt300@3: for(int i=0; i < 16; i++){ rt300@3: seqSteps.addFloat(round(steps[i])); // rounding here?? rt300@3: } rt300@3: rt300@3: core.pd.sendList("fromOF", seqSteps); rt300@8: rt300@3: sendOscShape(sliderVals[5]); rt300@3: sendFiltType(sliderVals[6]); rt300@3: sendFiltFreq(sliderVals[7]); rt300@3: sendEnvShape(sliderVals[8]); rt300@3: sendModFreq(sliderVals[9]); rt300@3: rt300@3: } rt300@8: //-------------------------------------------------------------- rt300@3: #pragma mark STANDARD OF FUNCTIONS rt300@3: //-------------------------------------------------------------- rt300@0: void testApp::update(){ rt300@0: //we do a heartbeat on iOS as the phone will shut down the network connection to save power rt300@0: //this keeps the network alive as it thinks it is being used. rt300@16: if(paused) return; rt300@16: rt300@0: if( ofGetFrameNum() % 120 == 0 ){ rt300@0: ofxOscMessage m; rt300@0: m.setAddress( "/misc/heartbeat" ); rt300@0: m.addIntArg( ofGetFrameNum() ); rt300@0: sender.sendMessage( m ); rt300@0: } rt300@0: rt300@5: // continiue to move at velocity, unless snapped rt300@3: rt300@3: if (numActiveTouches == 0){ // no touches, use momentum rt300@3: rt300@22: if(moveVel.norm() > 0.3){ rt300@22: if(theGridView.snapped){ rt300@22: // stop it, send snap event rt300@22: moveVel.setCoord(0.0,0.0); rt300@22: }else{ rt300@22: theGridView.move(moveVel); rt300@22: moveVel = moveVel*slowFactor; rt300@22: } rt300@3: // and get new parameter values rt300@5: setAllGUISliders(theGridView.getParams()); rt300@3: sendParametersToPD(); rt300@22: }else if(moveVel.norm() > 0.01){ // and less than 0.3 rt300@3: // stop it rt300@3: moveVel.setCoord(0.0,0.0); rt300@5: setAllGUISliders(theGridView.getParams()); rt300@3: sendParametersToPD(); rt300@5: eventLogger.logEvent(SCROLL_STOPPED, theGridView.getCoord() ); rt300@22: rt300@3: }else{ rt300@3: // stopped - do nothing rt300@3: } rt300@3: rt300@0: } rt300@0: // continiue to zoom at velocity rt300@0: if (numActiveTouches < 2 && abs(zoomVel)>0.001){ rt300@0: theGridView.zoom(zoomVel + 1.0); // +1 because zoomVel factor is + or - , wheras zoom is a multiplier near 1 rt300@0: zoomVel = zoomVel*slowFactor; rt300@0: } rt300@6: rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::sendOSCParams(){ rt300@0: rt300@0: vector params = theGridView.getParams(); // FILTER HERE? NEED FLOATS... rt300@0: vector::iterator iter = params.begin(); rt300@0: rt300@0: ofxOscMessage m; rt300@0: m.setAddress( "p" ); rt300@0: rt300@0: for(;iter < params.end();iter++){ rt300@0: rt300@0: m.addFloatArg( *iter ); rt300@0: rt300@0: } rt300@0: sender.sendMessage( m ); rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::draw(){ rt300@16: if(paused) return; rt300@24: rt300@24: switch (whichInterfaceShowing){ rt300@24: case SLIDERS: rt300@24: break; rt300@24: case ZOOMER: rt300@24: theGridView.draw(); rt300@24: break; rt300@24: case BOTH: rt300@24: rt300@24: theGridView.draw(); rt300@24: break; rt300@24: case INTRO: rt300@24: break; rt300@24: rt300@24: case QUESTIONNAIRE: rt300@24: break; rt300@24: rt300@0: } rt300@16: rt300@4: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchDown(ofTouchEventArgs &touch){ rt300@24: rt300@24: // TODO check if in gui area!!! rt300@24: if(whichInterfaceShowing == SLIDERS){ rt300@24: return; rt300@24: }else if (whichInterfaceShowing == BOTH && touch.x < (SLIDER_GUI_WIDTH+10)){ rt300@24: return; rt300@24: rt300@24: }// otherwise we're good to let the zoomer handle touch rt300@0: rt300@0: numActiveTouches++; rt300@0: // absolute position doesn't matter rt300@0: // which one? rt300@0: if(touch.id == 0){ rt300@0: touch0.setCoord(touch.x,touch.y); rt300@0: prevTouch0 = touch0; rt300@0: }else if(touch.id == 1){ rt300@0: rt300@0: touch1.setCoord(touch.x,touch.y); rt300@0: prevTouch1 = touch1; rt300@0: rt300@0: } rt300@0: if(numActiveTouches == 1){ rt300@0: moveVel.setCoord(0.0, 0.0); rt300@0: prevMove.setCoord(0.0, 0.0); rt300@0: prevMove2.setCoord(0.0, 0.0); rt300@0: }else if(numActiveTouches == 2){ rt300@0: zoomVel = 0.0; rt300@0: prevZoom = 0.0; rt300@0: prevZoom2 = 0.0; rt300@0: double dist = touch1.distanceTo(touch0); rt300@0: prevDist = dist; rt300@0: } rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchMoved(ofTouchEventArgs &touch){ rt300@1: rt300@24: // TODO check if in gui area!!! rt300@24: if(whichInterfaceShowing == SLIDERS){ rt300@24: return; rt300@24: }else if (whichInterfaceShowing == BOTH && touch.x < (SLIDER_GUI_WIDTH+10)){ rt300@24: return; rt300@24: rt300@24: }// otherwise we're good to let the zoomer handle touch rt300@24: rt300@1: rt300@7: // check if in other gui area rt300@16: if(touch.x > getWidth()-200 && touch.y < 300){ rt300@7: return; rt300@7: } rt300@0: rt300@1: // which one? keep track of each touch point rt300@0: if(touch.id == 0){ rt300@0: touch0.setCoord(touch.x,touch.y); rt300@0: rt300@0: }else if(touch.id == 1){ rt300@0: rt300@0: touch1.setCoord(touch.x,touch.y); rt300@0: } rt300@0: rt300@1: if(numActiveTouches == 1){ rt300@0: rt300@1: handleScroll(); rt300@0: }else if(numActiveTouches == 2){ rt300@1: handleZoom(); rt300@0: rt300@0: } rt300@0: prevTouch0 = touch0; rt300@0: rt300@0: rt300@0: } rt300@5: rt300@1: //-------------------------------------------------------------- rt300@1: void testApp::handleScroll(){ rt300@6: rt300@1: TwoVector move = touch0 - prevTouch0; rt300@5: if(yLocked){ rt300@5: move.y = 0.0; rt300@5: } rt300@5: if(xLocked){ rt300@5: move.x = 0.0; rt300@5: } rt300@5: rt300@6: // check time since last move - if rt300@6: unsigned int moveTime = ofGetSystemTimeMicros(); rt300@6: if(moveTime - lastMoveTime > 100000){ rt300@6: moveVel = TwoVector(); // zero rt300@6: }else{ rt300@6: moveVel = (move*0.3 + prevMove*0.34 + prevMove2*0.38); // use the time rt300@6: rt300@6: } rt300@6: lastMoveTime = moveTime; rt300@6: rt300@5: rt300@1: prevMove2 = prevMove; rt300@1: prevMove = move; rt300@1: rt300@5: rt300@3: theGridView.move(move); rt300@3: rt300@3: // and get new parameter values rt300@3: setAllGUISliders(theGridView.getParams()); rt300@3: sendParametersToPD(); rt300@1: } rt300@1: //-------------------------------------------------------------- rt300@1: void testApp::handleZoom(){ rt300@1: // work out change in difference rt300@1: double dist = touch1.distanceTo(touch0); rt300@1: double zoomFactor = prevDist/dist; rt300@1: rt300@1: //TODO check for sensible maximums, e.g. spurious touch data rt300@1: if(zoomFactor > 2.0 || zoomFactor < 0.5){ rt300@1: cout << "Zoom too much!!!!" << zoomFactor; rt300@1: zoomFactor = 1.0; rt300@1: } rt300@1: rt300@1: zoomVel = (zoomFactor-1)*0.3 + prevZoom*0.34 + prevZoom2*0.38; rt300@1: prevZoom2 = prevZoom; rt300@1: prevZoom = (zoomFactor-1); rt300@1: rt300@1: theGridView.zoom(zoomFactor); rt300@1: rt300@1: prevDist = dist; rt300@3: rt300@1: } rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchUp(ofTouchEventArgs &touch){ rt300@1: if(numActiveTouches > 0) numActiveTouches--; // dirty rt300@1: rt300@24: // TODO check if in gui area!!! rt300@24: if(whichInterfaceShowing == SLIDERS){ rt300@24: return; rt300@24: }else if (whichInterfaceShowing == BOTH && touch.x < 256){ rt300@24: return; rt300@1: rt300@24: }// otherwise we're good to let the zoomer handle touch rt300@24: rt300@1: rt300@0: // which one? rt300@0: if(touch.id == 0){ rt300@0: // tricky situation - we tried to zoom but may have left non-move finger on rt300@0: prevTouch0.setCoord(touch.x,touch.y); rt300@0: rt300@0: }else if(touch.id == 1){ rt300@0: rt300@0: rt300@0: prevTouch1.setCoord(0,0); rt300@6: rt300@6: } rt300@6: if(numActiveTouches == 0){ rt300@6: // check time since last move rt300@6: // check time since last move - if rt300@6: unsigned int moveTime = ofGetSystemTimeMicros(); rt300@6: if(moveTime - lastMoveTime > 100000){ rt300@6: moveVel = TwoVector(); // zero rt300@6: }else{ rt300@6: moveVel = (move*0.3 + prevMove*0.34 + prevMove2*0.38); // use the time rt300@6: rt300@6: } rt300@6: lastMoveTime = moveTime; rt300@0: } rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchDoubleTap(ofTouchEventArgs &touch){ rt300@0: // preset? rt300@25: rt300@25: /* ballses everything for some reason rt300@25: TwoVector centre = TwoVector(getWidth()*0.5,getHeight()*0.5); rt300@25: // if near centre rt300@25: if((touch.x < centre.x+10) && (touch.x > centre.x-10) && (touch.y < centre.y+10) && (touch.y > centre.y-10)){ rt300@25: numActiveTouches = 0; // dirty rt300@25: presetManager.showNameDialog(); rt300@25: rt300@25: } rt300@25: */ rt300@25: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::lostFocus(){ rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::gotFocus(){ rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::gotMemoryWarning(){ rt300@0: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::deviceOrientationChanged(int newOrientation){ rt300@16: /* rt300@0: cout << "orientation: " << newOrientation; rt300@15: rt300@0: if(newOrientation == 4){ rt300@16: ofxiPhoneSetOrientation( OF_ORIENTATION_DEFAULT ); rt300@16: rt300@0: }else if(newOrientation == 3){ rt300@0: ofxiPhoneSetOrientation( OF_ORIENTATION_90_LEFT ); rt300@16: }else if(newOrientation == 3){ rt300@16: ofxiPhoneSetOrientation( OF_ORIENTATION_90_LEFT ); rt300@16: } rt300@16: rt300@16: rt300@16: [ofxiPhoneGetGLView() updateDimensions]; rt300@16: */ rt300@0: } rt300@0: rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchCancelled(ofTouchEventArgs& args){ rt300@0: rt300@0: } rt300@3: //--------------------------------------------------------------- rt300@3: // AUDIO STUFF rt300@3: //--------------------------------------------------------------- rt300@3: rt300@3: #pragma mark AUDIO STREAMS rt300@3: //-------------------------------------------------------------- rt300@3: void testApp::audioReceived(float * input, int bufferSize, int nChannels) { rt300@3: core.audioReceived(input, bufferSize, nChannels); rt300@3: } rt300@3: rt300@3: void testApp::audioRequested(float * output, int bufferSize, int nChannels) { rt300@3: core.audioRequested(output, bufferSize, nChannels); rt300@3: } rt300@3: //--------------------------------------------------------------- rt300@3: #pragma mark UTILITIES rt300@0: rt300@0: // 5hz cut off rt300@0: const double fB[3] = {0.049489956268677, 0.098979912537354, 0.049489956268677}; rt300@0: rt300@0: const double fA[3] = {1.000000000000000, -1.279632424997809, 0.477592250072517}; rt300@0: rt300@0: // 1hz cut off rt300@0: //const double fB[3] = {0.002550535158536, 0.005101070317073, 0.002550535158536}; rt300@0: rt300@0: //const double fA[3] = {1.000000000000000, -1.852146485395936, 0.862348626030081}; rt300@0: rt300@0: rt300@0: //a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb)- a(2)*y(n-1) - ... - a(na+1)*y(n-na) rt300@0: //--------------------------------------------------------------- rt300@0: vector testApp::vectorFilter(vector newVec){ rt300@0: static vector x0(10,0); rt300@0: static vector x1(10,0); rt300@0: static vector x2(10,0); rt300@0: static vector y0(10,0); rt300@0: static vector y1(10,0); rt300@0: static vector y2(10,0); rt300@0: rt300@0: x0 = newVec; rt300@0: rt300@0: // this low passes a bunch of params values all at once rt300@0: int sz = newVec.size(); rt300@0: for(int i=0; i