rt300@0: #include "testApp.h" rt300@2: rt300@39: rt300@0: extern Grid theGridView; rt300@0: extern PresetManager presetManager; rt300@1: extern EventLogger eventLogger; rt300@3: extern Frequencer frequencer; rt300@35: extern Hilbert hilbert; 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@46: // really GUI and all that stuff should be somewhere else rt300@46: rt300@43: //-------------------------------------------------------------- rt300@43: void testApp::setup(){ rt300@43: rt300@43: // initilaise rt300@43: rt300@43: initialiseVariables(); rt300@43: initialiseGUIs(); rt300@43: rt300@43: // initialise PD rt300@43: rt300@43: int ticksPerBuffer = 8; // 8 * 64 = buffer len of 512 rt300@43: core.setup(2, 1, 44100, ticksPerBuffer); rt300@46: // send to PD rt300@46: List toPD; rt300@46: toPD.addSymbol("smoothing"); rt300@46: toPD.addFloat(70); // rounding here?? rt300@46: core.pd.sendList("fromOF", toPD); rt300@46: //cout << ctrlName[i] << "sending" << ctrlout[i] << "\n"; rt300@43: rt300@43: // setup OF sound stream rt300@43: ofSoundStreamSetup(2, 1, this, 44100, ofxPd::blockSize()*ticksPerBuffer, 3); rt300@43: rt300@43: tsc = [[TimedSessionController alloc] init]; rt300@43: [tsc setAppRef:(id)this]; rt300@43: rt300@43: //-------------------------------------- rt300@43: // load stuff rt300@43: loadSequences(); rt300@43: rt300@43: // load presets rt300@43: presetManager.startLoadAll(); rt300@43: rt300@43: eventLogger.startLoadAll(); rt300@43: //-------------------------------------- rt300@43: rt300@43: // now do things that will affect the start up state of the app rt300@43: rt300@46: //if(true){ rt300@46: if(eventLogger.questionnaireCompleted){ // then we go into do-what-you-like mode rt300@43: rt300@43: freeUseMode(); rt300@46: randomise(); rt300@43: }else{ rt300@43: // then we're in timed session mode rt300@43: showIntro(); rt300@43: } rt300@44: rt300@44: //freeUseMode(); rt300@43: // GO rt300@43: paused = false; rt300@43: eventLogger.logEvent(APP_STARTED); rt300@43: } rt300@24: rt300@43: //----------------------------------------------------------------------------- rt300@35: rt300@7: //DeviceID3523537000 rt300@42: void testApp::initialiseVariables(){ rt300@46: animatingGrid = false; rt300@16: paused = true; rt300@39: sendMIDIAndOSC = false; rt300@46: allowAnimation = false; rt300@16: ofBackground( 0, 0, 0 ); rt300@0: ofEnableAlphaBlending(); rt300@36: currentSequence = 0; rt300@40: //ofEnableSmoothing(); rt300@37: rt300@29: // open an outgoing connection to HOST:PORT for OSC rt300@29: rt300@29: sender.setup( OSC_HOST, OSC_PORT ); rt300@28: ofSetFrameRate(50); rt300@43: 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@27: preventingMovePostScroll = false; 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@42: ofxiPhoneSetOrientation( OFXIPHONE_ORIENTATION_PORTRAIT ); rt300@42: ofxiPhoneExternalDisplay::mirrorOn(); rt300@42: } rt300@43: //--------------------------------------------------------- rt300@42: void testApp::initialiseGUIs(){ rt300@0: theGridView.init(); rt300@0: rt300@43: rt300@43: //SLIDER rt300@44: //setupSliderGui(); rt300@44: //sliderGUI->setVisible(false); 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@37: rt300@37: 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.view.frame = CGRectMake(0,getHeight()-44,getWidth(),44); rt300@29: bottomTabViewController.view.hidden = YES; rt300@37: 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@44: rt300@44: rt300@44: //SLIDER rt300@44: rt300@44: sliderViewController = [[SliderViewController alloc] initWithNibName:@"SliderViewController" bundle:nil]; rt300@44: [ofxiPhoneGetGLParentView() addSubview:sliderViewController.view]; rt300@44: [sliderViewController setAppRef:(id)this]; rt300@44: sliderViewController.view.frame = CGRectMake(0,getHeight()-43 - 278,getWidth(),278); rt300@44: [sliderViewController show:(id)this]; rt300@26: rt300@27: helpViewController = [[HelpViewController alloc] initWithNibName:@"HelpViewController" bundle:nil]; rt300@27: [ofxiPhoneGetGLParentView() addSubview:helpViewController.view]; rt300@27: [helpViewController setAppRef:(id)this]; rt300@27: helpViewController.view.hidden = YES; rt300@27: rt300@44: rt300@44: usernameAlertViewController = [[UsernameAlertViewController alloc] init]; rt300@44: [usernameAlertViewController setAppRef:(id)this]; rt300@36: rt300@47: rt300@47: ////// rt300@47: rt300@47: rt300@47: ///////// rt300@47: rt300@42: setAllGUISliders(theGridView.getParams()); rt300@25: rt300@42: } rt300@43: //-------------------------------------------------------------------------- rt300@42: void testApp::initialiseMIDI(){ rt300@36: rt300@39: ///////////////////////// rt300@39: // MIDI rt300@39: rt300@39: midiChannel = 7; rt300@47: midiOffset = 12; rt300@39: rt300@39: // enables the network midi session between iOS and Mac OSX on a rt300@39: // local wifi network rt300@39: // rt300@39: // in ofxMidi: open the input/outport network ports named "Session 1" rt300@39: // rt300@39: // on OSX: use the Audio MIDI Setup Utility to connect to the iOS device rt300@39: // rt300@39: ofxMidi::enableNetworking(); rt300@39: rt300@39: // list the number of available input & output ports rt300@39: ofxMidiIn::listPorts(); rt300@39: ofxMidiOut::listPorts(); rt300@39: rt300@39: // create and open input ports rt300@39: for(int i = 0; i < ofxMidiIn::getNumPorts(); ++i) { rt300@39: rt300@39: // new object rt300@39: inputs.push_back(new ofxMidiIn); rt300@39: rt300@39: // set this class to receive incoming midi events rt300@39: inputs[i]->addListener(this); rt300@39: rt300@39: // open input port via port number rt300@39: inputs[i]->openPort(i); rt300@39: } rt300@39: rt300@39: // create and open output ports rt300@39: for(int i = 0; i < ofxMidiOut::getNumPorts(); ++i) { rt300@39: rt300@39: // new object rt300@39: outputs.push_back(new ofxMidiOut); rt300@39: rt300@39: // open input port via port number rt300@39: outputs[i]->openPort(i); rt300@39: } rt300@39: rt300@39: // set this class to receieve midi device (dis)connection events rt300@39: ofxMidi::setConnectionListener(this); rt300@39: rt300@39: // END MIDI rt300@42: rt300@42: } rt300@24: rt300@24: rt300@24: //-------------------------------------------------------------- rt300@24: void testApp::exit(){ rt300@37: rt300@25: presetManager.exitAndSaveAll(); rt300@25: eventLogger.exitAndSave(); rt300@37: 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@39: // clean up MIDI rt300@39: for(int i = 0; i < inputs.size(); ++i) { rt300@39: inputs[i]->closePort(); rt300@39: inputs[i]->removeListener(this); rt300@39: delete inputs[i]; rt300@39: } rt300@39: rt300@39: for(int i = 0; i < outputs.size(); ++i) { rt300@39: outputs[i]->closePort(); rt300@39: delete outputs[i]; rt300@39: } rt300@39: rt300@43: //SLIDER rt300@44: //delete sliderGUI; rt300@37: 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@39: eventLogger.logEvent(SEQ_LOCKED); // TODO whatabout unlock? 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@37: rt300@24: // if(eventLogger.questionnaireCompleted) return; rt300@37: rt300@27: [topButtonViewController pausePressed:(id)this]; rt300@24: rt300@24: //stopSequencer rt300@27: seqStartStop(false); 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@37: rt300@24: } rt300@24: //-------------------------------------------------------------- rt300@28: void testApp::questionnaireHidden(vector answers, const char* userComments){ rt300@24: // send answers to server as json rt300@28: eventLogger.questionnaireAnswersObtained(answers, userComments); rt300@39: rt300@39: freeUseMode(); rt300@37: rt300@39: } rt300@39: //-------------------------------------------------------------- rt300@39: // shortcut function for testing rt300@39: void testApp::justStart(){ rt300@39: freeUseMode(); rt300@39: } rt300@39: //-------------------------------------------------------------- rt300@39: void testApp::freeUseMode(){ rt300@38: interfaceSelected(1); rt300@32: [bottomTabViewController show:(id)this withSelection:1]; rt300@24: rt300@38: [topButtonViewController enableSmoothSwitch:(id)this]; rt300@37: rt300@39: sendMIDIAndOSC = true; rt300@46: allowAnimation = true; rt300@38: } rt300@38: //-------------------------------------------------------------- rt300@38: void testApp::setInterp(int state){ rt300@38: if(state == 0){ rt300@38: theGridView.setInterpolation(Grid::NO_INTERPOLATION); rt300@39: eventLogger.logEvent(SMOOTHING_OFF); rt300@38: }else if(state == 1){ rt300@38: theGridView.setInterpolation(Grid::INTERPOLATE_GRID); rt300@39: eventLogger.logEvent(SMOOTHING_ON); rt300@38: } rt300@38: // tell sliders and PD rt300@38: setAllGUISliders(theGridView.getParams()); rt300@39: rt300@33: } rt300@33: //-------------------------------------------------------------- rt300@24: void testApp::showIntro(){ rt300@37: rt300@24: cout << "SHOW INTRO\n"; rt300@37: rt300@29: [tsc cancelTimers]; rt300@29: bottomTabViewController.view.hidden = YES; 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@25: eventLogger.consentGiven = true; rt300@29: // rt300@29: // clear presets? rt300@46: //presetManager.clearAll(); rt300@25: // show username prompt rt300@25: [usernameAlertViewController showUserNamePrompt]; rt300@32: // reset top buttons rt300@32: [topButtonViewController unlockAll]; rt300@32: randomise(); rt300@24: } rt300@24: // no unOK rt300@24: } rt300@24: //-------------------------------------------------------------- rt300@42: void testApp::startTimedSession(){ rt300@42: [tsc startTimer]; rt300@42: // timer will show alert and set interface rt300@42: } rt300@42: //-------------------------------------------------------------- rt300@39: // called from BottomTabViewController iOS segmented thing, also timed session controller rt300@24: void testApp::interfaceSelected(int which){ rt300@47: if(whichInterfaceShowing == HELP){ rt300@47: // hide the help rt300@47: [helpViewController hide:(id) this]; rt300@47: } rt300@24: switch (which){ rt300@39: case 0: // slider rt300@43: //SLIDER rt300@24: whichInterfaceShowing = SLIDERS; rt300@43: rt300@43: [sliderViewController show:(id)this]; 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@39: case 1: // both rt300@43: //SLIDER rt300@24: whichInterfaceShowing = BOTH; rt300@43: rt300@43: [sliderViewController show:(id)this]; rt300@24: // set the slider values to stuff got from zoomer rt300@24: sliderVals = theGridView.getParams(); rt300@24: setAllGUISliders(sliderVals); rt300@39: rt300@24: break; rt300@39: case 2: // zoomer rt300@43: //SLIDER rt300@43: rt300@43: [sliderViewController hide:(id)this]; rt300@24: whichInterfaceShowing = ZOOMER; rt300@24: break; rt300@24: } rt300@39: eventLogger.logEvent(SWAP_VIEW,theGridView.getCoord(),theGridView.getScale(), which); rt300@24: } rt300@24: //-------------------------------------------------------------- rt300@39: rt300@43: rt300@0: //-------------------------------------------------------------- rt300@3: void testApp::sliderMoved(int which, float value){ rt300@43: rt300@3: // an update caused by slider view being touched rt300@0: sliderVals[which] = (int)value; rt300@0: theGridView.setParams(sliderVals); rt300@37: rt300@3: sendParametersToPD(); rt300@39: if(sendMIDIAndOSC){ rt300@39: rt300@39: sendMidiParam(which); rt300@39: sendOSCParams(); rt300@39: } rt300@5: rt300@44: eventLogger.logEvent(CHANGE_SLIDER, theGridView.getCoord(),0.0,which , value); rt300@44: rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@3: void testApp::setAllGUISliders(vector vals){ rt300@44: rt300@3: // an update caused by zoomer view being moved rt300@46: // can be called by theGridView or testApp rt300@46: // casues PD and midi to be sent rt300@46: rt300@25: for(int i = 0; isetValue(vals[i]); rt300@1: sliderVals[i] = vals[i]; rt300@43: rt300@43: [sliderViewController setSlider:i to:vals[i]]; rt300@0: } rt300@3: rt300@39: sendParametersToPD(); rt300@39: if(sendMIDIAndOSC){ rt300@39: rt300@39: sendMidiParams(); rt300@39: sendOSCParams(); rt300@39: } rt300@39: rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@25: void testApp::randomise(){ rt300@25: // pick random settings for all params rt300@39: rt300@39: // random zoom? no. rt300@25: for(int i=0; i < NUM_PARAMS ; i++){ rt300@25: sliderVals[i] = ofRandom(0, 127); rt300@25: rt300@25: } rt300@37: currentSequence = ofRandom(0, sequences.size()-1); rt300@25: // send to grid, sliders and PD rt300@25: theGridView.setParams(sliderVals); rt300@25: setAllGUISliders(sliderVals); rt300@39: rt300@39: rt300@44: eventLogger.logEvent(RANDOMISE, theGridView.getCoord() ,theGridView.getScale()); rt300@25: rt300@25: } rt300@39: //-------------------------------------------------------------- rt300@27: void testApp::showHelp(){ rt300@46: previousInterface = whichInterfaceShowing; rt300@29: whichInterfaceShowing = HELP; rt300@27: seqStartStop(false); rt300@27: [topButtonViewController pausePressed:(id)this]; rt300@27: helpViewController.view.hidden = NO; rt300@27: eventLogger.logEvent(HELP_PRESSED); rt300@46: rt300@27: } rt300@27: void testApp::helpHidden(){ rt300@46: whichInterfaceShowing = previousInterface; rt300@27: // start seq? rt300@27: rt300@27: } rt300@25: //-------------------------------------------------------------- rt300@46: int testApp::nextSequence(){ rt300@36: currentSequence++; rt300@36: if(currentSequence >= sequences.size()){ rt300@36: currentSequence = 0; rt300@36: } rt300@36: sendParametersToPD(); rt300@46: return currentSequence; rt300@36: } rt300@36: //-------------------------------------------------------------- rt300@39: //-------------------------------------------------------------- rt300@39: #pragma mark sending to pd and midi rt300@3: void testApp::sendParametersToPD(){ rt300@37: static int previousSequence; rt300@36: rt300@45: if(core.patchName == "synth5paramMM.pd"){ rt300@45: // frequencer stuff to get 16 steps rt300@45: rt300@45: vector vals; rt300@45: rt300@45: rt300@45: vals.push_back((sliderVals[0]+32)*8.); // DC offset rt300@45: for(int i=1; i<5;i++){ rt300@45: vals.push_back((sliderVals[i] - 64)*2.); rt300@45: } rt300@45: rt300@45: vector steps = frequencer.freqMagEdit(freqIndexes, vals); rt300@45: List seqSteps; rt300@45: seqSteps.addSymbol("seqSteps"); rt300@45: for(int i=0; i < 16; i++){ rt300@45: seqSteps.addFloat(round(steps[i])); rt300@45: } rt300@45: core.pd.sendList("fromOF", seqSteps); rt300@45: rt300@45: rt300@45: // send synth params rt300@45: sendOscShape(sliderVals[5]); rt300@45: sendFiltType(sliderVals[6]); rt300@45: sendFiltFreq(sliderVals[7]); rt300@45: sendEnvShape(sliderVals[8]); rt300@45: sendModFreq(sliderVals[9]); rt300@45: rt300@45: }else if (core.patchName == "synth10param.pd"){ rt300@45: // for 10 param synth we get sequence from saved presets rt300@45: // and send 5 extra synth params rt300@45: if(currentSequence != previousSequence){ rt300@45: List seqSteps; rt300@45: rt300@45: seqSteps.addSymbol("seqSteps"); rt300@45: if(currentSequence >= sequences.size() || currentSequence < 0){ rt300@45: cout << "ERROR: not a valid sequence index\n"; rt300@45: for(int i=0; i < 16; i++){ rt300@45: seqSteps.addFloat(50); rt300@45: } rt300@45: }else{ rt300@45: for(int i=0; i < 16; i++){ rt300@45: seqSteps.addFloat(round(sequences[currentSequence][i])); rt300@45: } rt300@45: } rt300@45: rt300@45: core.pd.sendList("fromOF", seqSteps); rt300@45: previousSequence = currentSequence; rt300@45: } rt300@45: /* rt300@45: @"Amp Env",@"Waveform",@"FM amount",@"FM frequency",@"Reverb", rt300@45: @"Filter Type",@"Filter Cut off",@"Filter Resonance",@"Filter Envelope",@"SOMETHING", rt300@45: */ rt300@45: // send synth params rt300@45: sendAmpEnvShape(sliderVals[0]); rt300@45: sendOscShape(sliderVals[1]); rt300@45: sendFMAmt(sliderVals[2]); rt300@45: sendModFreq(sliderVals[3]); rt300@45: sendRevAmt(sliderVals[4]); rt300@45: rt300@45: sendFiltType(sliderVals[5]); rt300@45: sendFiltFreq(sliderVals[6]); rt300@45: sendResonance(sliderVals[7]); rt300@45: sendFiltEnvShape(sliderVals[8]); rt300@45: sendFiltEnvModAmt(sliderVals[9]); rt300@45: //sendUmame(sliderVals[8]); rt300@45: //sendX(sliderVals[2]); rt300@45: //sendX(sliderVals[3]); rt300@45: rt300@45: rt300@45: rt300@45: rt300@45: rt300@45: rt300@37: } rt300@45: rt300@37: rt300@36: /* rt300@45: cout << "SLIDERVALS: "; rt300@45: for(int i=0;i<10;i++){ rt300@45: cout << sliderVals[i] << ","; rt300@3: } rt300@45: cout << '\n'; rt300@45: */ rt300@3: rt300@3: } rt300@39: //-------------------------------------------------------------- rt300@39: void testApp::sendMidiParam(int which){ rt300@39: int midiChannel = 7; rt300@39: int offset = 0; rt300@39: rt300@39: for(int i = 0; i < outputs.size(); ++i) { rt300@39: outputs[i]->sendControlChange(midiChannel, offset+which, sliderVals[which]); rt300@39: } rt300@39: rt300@39: rt300@39: } rt300@39: //-------------------------------------------------------------- rt300@39: void testApp::sendMidiParams(){ rt300@39: rt300@39: for(int i = 0; i< sliderVals.size(); i++){ rt300@39: for(int j = 0; j < outputs.size(); ++j) { rt300@39: outputs[j]->sendControlChange(midiChannel, midiOffset+i, sliderVals[i]); rt300@39: } rt300@39: } rt300@39: rt300@39: } rt300@39: //-------------------------------------------------------------- rt300@39: void testApp::sendOSCParams(){ rt300@39: rt300@39: ofxOscMessage m; rt300@39: m.setAddress( "sonicZoom" ); rt300@39: rt300@39: for(int i = 0; i< sliderVals.size(); i++){ rt300@39: rt300@39: m.addFloatArg(sliderVals[i]); rt300@39: rt300@39: } rt300@39: sender.sendMessage( m ); rt300@39: } rt300@39: //-------------------------------------------------------------- rt300@39: rt300@27: void testApp::setupNewUser(){ rt300@27: // this function is for supervised trials with my ipad rt300@27: eventLogger.newUser(); rt300@27: } rt300@8: //-------------------------------------------------------------- rt300@3: #pragma mark STANDARD OF FUNCTIONS rt300@3: //-------------------------------------------------------------- rt300@0: void testApp::update(){ rt300@37: rt300@16: if(paused) return; rt300@16: rt300@46: if(theGridView.automatedMovementInProgress){ rt300@46: theGridView.update(); rt300@46: return; rt300@46: } rt300@46: rt300@32: if(ofxiPhoneExternalDisplay::isExternalScreenConnected()){ rt300@32: if(!ofxiPhoneExternalDisplay::isMirroring()){ rt300@32: ofxiPhoneExternalDisplay::mirrorOn(); rt300@32: printf("turned on Mirroring!\n"); rt300@32: } rt300@32: } rt300@32: rt300@46: if(animatingGrid){ rt300@46: // theGrid rt300@46: rt300@46: } rt300@27: // continiue to move or zoom at velocity, unless snapped rt300@3: rt300@3: if (numActiveTouches == 0){ // no touches, use momentum rt300@32: // ZOOM MOMENTUM rt300@32: // continiue to zoom at velocity rt300@32: if (numActiveTouches < 2 && abs(zoomVel)>0.001){ rt300@32: theGridView.zoom(zoomVel + 1.0); // +1 because zoomVel factor is + or - , wheras zoom is a multiplier near 1 rt300@32: zoomVel = zoomVel*slowFactor; rt300@32: moveVel.setCoord(0.0,0.0);; // don't move if zooming! Too many events! rt300@35: rt300@37: setAllGUISliders(theGridView.getParams()); rt300@39: rt300@32: } rt300@44: // MOVE MOMENTUM rt300@22: if(moveVel.norm() > 0.3){ rt300@22: if(theGridView.snapped){ rt300@28: // stop it (snap check sends 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@37: // and get new parameter values rt300@5: setAllGUISliders(theGridView.getParams()); rt300@39: 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@39: rt300@5: eventLogger.logEvent(SCROLL_STOPPED, theGridView.getCoord() ); rt300@22: rt300@3: }else{ rt300@3: // stopped - do nothing rt300@3: } rt300@37: rt300@0: } rt300@37: rt300@0: } rt300@0: //-------------------------------------------------------------- rt300@39: rt300@0: void testApp::draw(){ rt300@37: rt300@24: switch (whichInterfaceShowing){ rt300@24: case SLIDERS: rt300@24: break; rt300@24: case ZOOMER: rt300@24: theGridView.draw(); rt300@37: rt300@24: break; rt300@24: case BOTH: rt300@33: rt300@33: theGridView.draw(); rt300@37: rt300@24: break; rt300@24: case INTRO: rt300@24: break; rt300@24: rt300@24: case QUESTIONNAIRE: rt300@24: break; rt300@24: rt300@0: } rt300@4: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchDown(ofTouchEventArgs &touch){ rt300@46: if(theGridView.automatedMovementInProgress) return; rt300@46: if(whichInterfaceShowing == SLIDERS){ rt300@46: return; rt300@46: } rt300@0: numActiveTouches++; rt300@27: preventingMovePostScroll = false; rt300@44: tapFlag = false; // unless touch 0 rt300@0: if(touch.id == 0){ rt300@0: touch0.setCoord(touch.x,touch.y); rt300@0: prevTouch0 = touch0; rt300@32: // stop zoom rt300@32: zoomVel = 0.0; rt300@44: tapFlag = true; 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@27: 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@37: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchMoved(ofTouchEventArgs &touch){ rt300@46: if(theGridView.automatedMovementInProgress) return; rt300@46: if(whichInterfaceShowing == SLIDERS){ rt300@46: return; rt300@46: } rt300@46: rt300@44: tapFlag = false; 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@37: rt300@1: if(numActiveTouches == 1){ rt300@27: if(preventingMovePostScroll) return; rt300@1: handleScroll(); rt300@0: }else if(numActiveTouches == 2){ rt300@1: handleZoom(); rt300@0: rt300@0: } rt300@0: prevTouch0 = touch0; rt300@37: rt300@0: rt300@0: } rt300@5: rt300@1: //-------------------------------------------------------------- rt300@44: void testApp::touchUp(ofTouchEventArgs &touch){ rt300@46: if(theGridView.automatedMovementInProgress) return; rt300@46: if(whichInterfaceShowing == SLIDERS){ rt300@46: return; rt300@46: } rt300@44: if(numActiveTouches > 0) numActiveTouches--; // dirty rt300@44: preventingMovePostScroll = false; rt300@44: // TODO check if in gui area!!! rt300@44: //SLIDER rt300@44: if(whichInterfaceShowing == SLIDERS){ rt300@44: return; rt300@44: } rt300@44: rt300@44: if(tapFlag){ rt300@44: cout << "TAP!!\n"; rt300@44: // look for close preset rt300@46: rt300@44: theGridView.tap(TwoVector(touch.x,touch.y)); rt300@44: } rt300@44: tapFlag = false; rt300@44: // which one? rt300@44: if(touch.id == 0){ rt300@44: // tricky situation - we tried to zoom but may have left non-move finger on rt300@44: prevTouch0.setCoord(touch.x,touch.y); rt300@44: rt300@44: }else if(touch.id == 1){ rt300@44: rt300@44: rt300@44: prevTouch1.setCoord(0,0); rt300@44: rt300@44: } rt300@44: if(numActiveTouches == 0){ rt300@44: // check time since last move rt300@44: // check time since last move - if rt300@44: unsigned int moveTime = ofGetSystemTimeMicros(); rt300@44: if(moveTime - lastMoveTime > 100000){ rt300@44: moveVel = TwoVector(); // zero rt300@44: }else{ rt300@44: moveVel = (move*0.3 + prevMove*0.34 + prevMove2*0.38); // use the time rt300@44: rt300@44: } rt300@44: lastMoveTime = moveTime; rt300@44: }else if (numActiveTouches == 1){ rt300@44: // just zoomed , but now lifted one of the fingers rt300@44: // can be bad if moved so create special mode to stop scroll (special modes bad!) rt300@44: preventingMovePostScroll = true; rt300@44: } rt300@44: rt300@44: } rt300@44: rt300@44: rt300@44: //-------------------------------------------------------------- rt300@27: // handle a finger being dragged rt300@1: void testApp::handleScroll(){ rt300@37: 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@37: 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@37: rt300@1: prevMove2 = prevMove; rt300@1: prevMove = move; rt300@1: rt300@37: rt300@3: theGridView.move(move); rt300@3: rt300@3: // and get new parameter values rt300@3: setAllGUISliders(theGridView.getParams()); rt300@39: rt300@1: } rt300@1: //-------------------------------------------------------------- rt300@27: // handle pinch movememnt 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@35: rt300@3: rt300@37: setAllGUISliders(theGridView.getParams()); rt300@39: rt300@37: rt300@37: rt300@1: } rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchDoubleTap(ofTouchEventArgs &touch){ rt300@0: // preset? rt300@25: rt300@25: /* ballses everything for some reason rt300@37: TwoVector centre = TwoVector(getWidth()*0.5,getHeight()*0.5); rt300@37: // if near centre rt300@37: if((touch.x < centre.x+10) && (touch.x > centre.x-10) && (touch.y < centre.y+10) && (touch.y > centre.y-10)){ rt300@37: numActiveTouches = 0; // dirty rt300@37: presetManager.showNameDialog(); rt300@37: rt300@37: } rt300@25: */ rt300@25: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::lostFocus(){ rt300@37: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::gotFocus(){ rt300@37: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::gotMemoryWarning(){ rt300@37: rt300@0: } rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::deviceOrientationChanged(int newOrientation){ rt300@37: /* rt300@37: cout << "orientation: " << newOrientation; rt300@37: rt300@37: if(newOrientation == 4){ rt300@37: ofxiPhoneSetOrientation( OF_ORIENTATION_DEFAULT ); rt300@37: rt300@37: }else if(newOrientation == 3){ rt300@37: ofxiPhoneSetOrientation( OF_ORIENTATION_90_LEFT ); rt300@37: }else if(newOrientation == 3){ rt300@37: ofxiPhoneSetOrientation( OF_ORIENTATION_90_LEFT ); rt300@37: } rt300@37: rt300@37: rt300@37: [ofxiPhoneGetGLView() updateDimensions]; rt300@37: */ rt300@0: } rt300@0: rt300@0: rt300@0: //-------------------------------------------------------------- rt300@0: void testApp::touchCancelled(ofTouchEventArgs& args){ rt300@37: 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 127){ rt300@35: cout << "ERROR: bad slider value!"; rt300@35: return; rt300@35: } rt300@3: rt300@3: static int numpoints = 5; rt300@3: static int numcontrols = 5; rt300@3: //float values[points][controls] = rt300@3: float ctrlout[numcontrols]; rt300@45: string ctrlName[4] = {"pWidth" , "sqVol", "sawVol", "sineVol"}; rt300@45: float values[5][4] = rt300@45: {{0.5, 0., 0., 1.}, // 0 rt300@45: {0.5, 0., 0., 1.}, // 32 rt300@45: {0.5, 0., 1., 0.}, // 64 rt300@45: {0.5, 1., 1., 0.}, // 96 rt300@45: {0.01,1., 1., 0.}}; // 127 rt300@37: rt300@3: float fidx = (numpoints-1)*ctrlin/128.; rt300@3: int idx = floor(fidx); rt300@3: float frac = fidx - idx; rt300@3: for(int i=0; i < numcontrols; i++){ rt300@3: ctrlout[i] = (1 - frac)*values[idx][i] + (frac)*values[idx+1][i]; rt300@3: // send to PD rt300@3: List toPD; rt300@3: rt300@3: toPD.addSymbol(ctrlName[i]); rt300@3: toPD.addFloat(ctrlout[i]); // rounding here?? rt300@37: rt300@3: core.pd.sendList("fromOF", toPD); rt300@3: //cout << ctrlName[i] << "sending" << ctrlout[i] << "\n"; rt300@3: } rt300@3: rt300@2: } rt300@8: //--------------------------------------------------------------- rt300@3: void testApp::sendFiltType(int ctrlin){ rt300@35: if(ctrlin < 0 || ctrlin > 127){ rt300@35: cout << "ERROR: bad slider value!"; rt300@35: return; rt300@35: } rt300@45: /* rt300@45: static int numpoints = 3; rt300@45: static int numcontrols = 2; rt300@45: //float values[points][controls] = rt300@45: float ctrlout[numcontrols]; rt300@45: string ctrlName[2] = {"fType","reson"}; rt300@45: float values[3][2] = rt300@45: {{0., 45}, // 0 rt300@45: {0.5, 120}, // 64 rt300@45: {1., 55}}; // 127 rt300@45: */ rt300@45: rt300@45: static int numpoints = 2; rt300@45: static int numcontrols = 1; rt300@45: //float values[points][controls] = rt300@45: float ctrlout[numcontrols]; rt300@45: string ctrlName[2] = {"fType"}; rt300@45: float values[2][1] = rt300@45: {{0.}, // 0 rt300@45: {1.},}; // 127 rt300@45: rt300@45: float fidx = (numpoints-1)*ctrlin/128.; rt300@45: int idx = floor(fidx); rt300@45: float frac = fidx - idx; rt300@45: rt300@45: for(int i=0; i < numcontrols; i++){ rt300@45: ctrlout[i] = (1 - frac)*values[idx][i] + (frac)*values[idx+1][i]; rt300@45: // send to PD rt300@45: List toPD; rt300@45: rt300@45: toPD.addSymbol(ctrlName[i]); rt300@45: toPD.addFloat(ctrlout[i]); // rounding here?? rt300@45: rt300@45: core.pd.sendList("fromOF", toPD); rt300@45: //cout << ctrlName[i] << "sending" << ctrlout[i] << "\n"; rt300@45: } rt300@45: } rt300@45: //--------------------------------------------------------------- rt300@45: void testApp::sendFiltTypeOld(int ctrlin){ rt300@45: if(ctrlin < 0 || ctrlin > 127){ rt300@45: cout << "ERROR: bad slider value!"; rt300@45: return; rt300@45: } rt300@3: static int numpoints = 3; rt300@3: static int numcontrols = 4; rt300@3: //float values[points][controls] = rt300@3: float ctrlout[numcontrols]; rt300@3: string ctrlName[4] = {"lpLev" , "bpLev", "hpLev", "reson"}; rt300@3: float values[3][4] = rt300@37: {{2., 0., 0., 1.}, // 0 rt300@24: {0., 10., 0., 10.}, // 64 rt300@24: {0., 0., 1., 1.}}; // 127 rt300@3: rt300@3: float fidx = (numpoints-1)*ctrlin/128.; rt300@3: int idx = floor(fidx); rt300@3: float frac = fidx - idx; rt300@3: for(int i=0; i < numcontrols; i++){ rt300@3: ctrlout[i] = (1 - frac)*values[idx][i] + (frac)*values[idx+1][i]; rt300@3: // send to PD rt300@3: List toPD; rt300@3: rt300@3: toPD.addSymbol(ctrlName[i]); rt300@3: toPD.addFloat(ctrlout[i]); // rounding here?? rt300@3: rt300@3: core.pd.sendList("fromOF", toPD); rt300@3: //cout << ctrlName[i] << "sending" << ctrlout[i] << "\n"; rt300@3: } rt300@2: } rt300@8: //--------------------------------------------------------------- rt300@3: void testApp::sendFiltFreq(int ctrlin){ rt300@35: if(ctrlin < 0 || ctrlin > 127){ rt300@35: cout << "ERROR: bad slider value!"; rt300@35: return; rt300@35: } rt300@24: // smooth this rt300@24: float fin = ctrlin; rt300@24: float fout; rt300@24: fout = (int)ctrlSmoother(fin); rt300@3: List toPD; rt300@3: rt300@3: toPD.addSymbol("filtFreq"); rt300@37: toPD.addFloat(fout); rt300@3: rt300@3: core.pd.sendList("fromOF", toPD); rt300@3: } rt300@8: //--------------------------------------------------------------- rt300@3: void testApp::sendEnvShape(int ctrlin){ rt300@35: if(ctrlin < 0 || ctrlin > 127){ rt300@35: cout << "ERROR: bad slider value!"; rt300@35: return; rt300@35: } rt300@3: static int numpoints = 5; rt300@3: static int numcontrols = 3; rt300@3: //float values[points][controls] = rt300@3: float ctrlout[numcontrols]; rt300@3: string ctrlName[3] = {"attack" , "decay", "sustain"}; rt300@3: float values[5][3] = rt300@37: {{0., 0., 0.}, // 0 rt300@3: {0., 0.5, 0.}, // 32 rt300@3: {0.0, 1., 0.8}, // 64 rt300@3: {0.99, 0.3, 0.}, // 96 rt300@3: {0.3, 0.1, 0.}}; // 127 rt300@3: rt300@3: float fidx = (numpoints-1)*ctrlin/128.; rt300@3: int idx = floor(fidx); rt300@3: float frac = fidx - idx; rt300@3: for(int i=0; i < numcontrols; i++){ rt300@3: ctrlout[i] = (1 - frac)*values[idx][i] + (frac)*values[idx+1][i]; rt300@3: // send to PD rt300@3: List toPD; rt300@3: rt300@3: toPD.addSymbol(ctrlName[i]); rt300@3: toPD.addFloat(ctrlout[i]); // rounding here?? rt300@3: rt300@3: core.pd.sendList("fromOF", toPD); rt300@3: //cout << ctrlName[i] << "sending" << ctrlout[i] << "\n"; rt300@3: } rt300@3: } rt300@8: //--------------------------------------------------------------- rt300@43: // alternative envelopes: seperate for amp and filt rt300@43: void testApp::sendAmpEnvShape(int ctrlin){ rt300@43: if(ctrlin < 0 || ctrlin > 127){ rt300@43: cout << "ERROR: bad slider value!"; rt300@43: return; rt300@43: } rt300@43: static int numpoints = 5; rt300@43: static int numcontrols = 3; rt300@43: //float values[points][controls] = rt300@43: float ctrlout[numcontrols]; rt300@43: string ctrlName[3] = {"attack" , "decay", "sustain"}; rt300@43: float values[5][3] = rt300@43: {{0., 0., 0.}, // 0 rt300@43: {0., 0.5, 0.}, // 32 rt300@43: {0.0, 1., 0.8}, // 64 rt300@43: {0.99, 0.3, 0.}, // 96 rt300@43: {0.3, 0.1, 0.}}; // 127 rt300@43: rt300@43: float fidx = (numpoints-1)*ctrlin/128.; rt300@43: int idx = floor(fidx); rt300@43: float frac = fidx - idx; rt300@43: for(int i=0; i < numcontrols; i++){ rt300@43: ctrlout[i] = (1 - frac)*values[idx][i] + (frac)*values[idx+1][i]; rt300@43: // send to PD rt300@43: List toPD; rt300@43: toPD.addSymbol("aenv"); rt300@43: toPD.addSymbol(ctrlName[i]); rt300@43: toPD.addFloat(ctrlout[i]); // rounding here?? rt300@43: rt300@43: core.pd.sendList("fromOF", toPD); rt300@43: //cout << ctrlName[i] << "sending" << ctrlout[i] << "\n"; rt300@43: } rt300@43: } rt300@43: //--------------------------------------------------------------- rt300@43: void testApp::sendFiltEnvShape(int ctrlin){ rt300@43: if(ctrlin < 0 || ctrlin > 127){ rt300@43: cout << "ERROR: bad slider value!"; rt300@43: return; rt300@43: } rt300@43: static int numpoints = 5; rt300@43: static int numcontrols = 3; rt300@43: //float values[points][controls] = rt300@43: float ctrlout[numcontrols]; rt300@43: string ctrlName[3] = {"attack" , "decay", "sustain"}; rt300@43: float values[5][3] = rt300@43: {{0., 0., 0.}, // 0 rt300@43: {0., 0.5, 0.}, // 32 rt300@43: {0.0, 1., 0.8}, // 64 rt300@43: {0.99, 0.3, 0.}, // 96 rt300@43: {0.3, 0.1, 0.}}; // 127 rt300@43: rt300@43: float fidx = (numpoints-1)*ctrlin/128.; rt300@43: int idx = floor(fidx); rt300@43: float frac = fidx - idx; rt300@43: for(int i=0; i < numcontrols; i++){ rt300@43: ctrlout[i] = (1 - frac)*values[idx][i] + (frac)*values[idx+1][i]; rt300@43: // send to PD rt300@43: List toPD; rt300@43: toPD.addSymbol("fenv"); rt300@43: toPD.addSymbol(ctrlName[i]); rt300@43: toPD.addFloat(ctrlout[i]); // rounding here?? rt300@43: rt300@43: core.pd.sendList("fromOF", toPD); rt300@43: //cout << ctrlName[i] << "sending" << ctrlout[i] << "\n"; rt300@43: } rt300@43: } rt300@43: //--------------------------------------------------------------- rt300@45: void testApp::sendFiltEnvModAmt(int ctrlin){ rt300@45: if(ctrlin < 0 || ctrlin > 127){ rt300@45: cout << "ERROR: bad slider value!"; rt300@45: return; rt300@45: } rt300@45: float amt = ctrlin/127.0; rt300@45: List toPD; rt300@45: rt300@45: toPD.addSymbol("fenv"); rt300@45: toPD.addSymbol("amount"); rt300@45: toPD.addFloat(amt); // rounding here?? rt300@45: rt300@45: core.pd.sendList("fromOF", toPD); rt300@45: } rt300@45: //--------------------------------------------------------------- rt300@3: void testApp::sendModFreq(int ctrlin){ rt300@35: if(ctrlin < 0 || ctrlin > 127){ rt300@35: cout << "ERROR: bad slider value!"; rt300@35: return; rt300@35: } rt300@3: float fm = ctrlin/127.; rt300@3: List toPD; rt300@3: rt300@3: toPD.addSymbol("FMFreq"); rt300@3: toPD.addFloat(fm); // rounding here?? rt300@3: rt300@3: core.pd.sendList("fromOF", toPD); rt300@8: } rt300@35: //--------------------------------------------------------------- rt300@45: //--------------------------------------------------------------- rt300@45: void testApp::sendRevAmt(int ctrlin){ rt300@45: if(ctrlin < 0 || ctrlin > 127){ rt300@45: cout << "ERROR: bad slider value!"; rt300@45: return; rt300@45: } rt300@45: static int numpoints = 5; rt300@45: static int numcontrols = 2; rt300@45: //float values[points][controls] = rt300@45: float ctrlout[numcontrols]; rt300@45: string ctrlName[3] = {"revDryWet" , "revLength"}; rt300@45: float values[5][3] = rt300@45: {{0., 0.1}, // 0 rt300@45: {0., 0.1}, // 32 rt300@45: {0.3, 30.}, // 64 rt300@45: {0.6, 60.}, // 96 rt300@45: {1., 95.}}; // 127 rt300@45: rt300@45: float fidx = (numpoints-1)*ctrlin/128.; rt300@45: int idx = floor(fidx); rt300@45: float frac = fidx - idx; rt300@45: for(int i=0; i < numcontrols; i++){ rt300@45: ctrlout[i] = (1 - frac)*values[idx][i] + (frac)*values[idx+1][i]; rt300@45: // send to PD rt300@45: List toPD; rt300@45: toPD.addSymbol(ctrlName[i]); rt300@45: toPD.addFloat(ctrlout[i]); // rounding here?? rt300@45: rt300@45: core.pd.sendList("fromOF", toPD); rt300@45: //cout << ctrlName[i] << "sending" << ctrlout[i] << "\n"; rt300@45: } rt300@35: rt300@45: } rt300@45: //--------------------------------------------------------------- rt300@45: void testApp::sendResonance(int ctrlin){ rt300@45: if(ctrlin < 0 || ctrlin > 127){ rt300@45: cout << "ERROR: bad slider value!"; rt300@45: return; rt300@45: } rt300@45: float res = ctrlin; rt300@45: List toPD; rt300@45: rt300@45: toPD.addSymbol("reson"); rt300@45: toPD.addFloat(res); // rounding here?? rt300@45: rt300@45: core.pd.sendList("fromOF", toPD); rt300@45: } rt300@45: //--------------------------------------------------------------------------- rt300@45: void testApp::sendFMAmt(int ctrlin){ rt300@45: static int numpoints = 4; rt300@45: static int numcontrols = 1; rt300@45: //float values[points][controls] = rt300@45: float ctrlout[numcontrols]; rt300@45: string ctrlName[1] = {"FMAmt"}; rt300@45: float values[4][1] = rt300@45: {{0.}, // 0 rt300@45: {0.}, // rt300@45: {0.3}, // rt300@45: {1.}}; // 127 rt300@45: rt300@45: float fidx = (numpoints-1)*ctrlin/128.; rt300@45: int idx = floor(fidx); rt300@45: float frac = fidx - idx; rt300@45: for(int i=0; i < numcontrols; i++){ rt300@45: ctrlout[i] = (1 - frac)*values[idx][i] + (frac)*values[idx+1][i]; rt300@45: // send to PD rt300@45: List toPD; rt300@45: toPD.addSymbol(ctrlName[i]); rt300@45: toPD.addFloat(ctrlout[i]); // rounding here?? rt300@45: rt300@45: core.pd.sendList("fromOF", toPD); rt300@45: //cout << ctrlName[i] << "sending" << ctrlout[i] << "\n"; rt300@45: } rt300@45: } rt300@45: //--------------------------------------------------------------------------- rt300@45: void testApp::sendDistortion(int ctrlin){ rt300@45: static int numpoints = 5; rt300@45: static int numcontrols = 2; rt300@45: //float values[points][controls] = rt300@45: float ctrlout[numcontrols]; rt300@45: string ctrlName[2] = {"sigGain", "sineGain"}; rt300@45: float values[5][2] = rt300@45: {{0., 0.}, // 0 rt300@45: {0., 0.}, // rt300@45: {20, 0.}, // rt300@45: {45 , 0.}, // rt300@45: {0, 18}}; // 127 rt300@45: rt300@45: float fidx = (numpoints-1)*ctrlin/128.; rt300@45: int idx = floor(fidx); rt300@45: float frac = fidx - idx; rt300@45: for(int i=0; i < numcontrols; i++){ rt300@45: ctrlout[i] = (1 - frac)*values[idx][i] + (frac)*values[idx+1][i]; rt300@45: // send to PD rt300@45: List toPD; rt300@45: toPD.addSymbol(ctrlName[i]); rt300@45: toPD.addFloat(ctrlout[i]); // rounding here?? rt300@45: rt300@45: core.pd.sendList("fromOF", toPD); rt300@45: //cout << ctrlName[i] << "sending" << ctrlout[i] << "\n"; rt300@45: } rt300@45: } rt300@45: //--------------------------------------------------------------------------- rt300@45: //=========================================================================== rt300@35: //--------------------------------------------------------------------------- rt300@35: void saveSequences(){ rt300@35: ofFile sequenceFile(ofxiPhoneGetDocumentsDirectory() + "pilot_sequences.json" ,ofFile::WriteOnly); rt300@35: rt300@35: // the 5 harmonics for the frequencer rt300@35: vector freqIndexes; rt300@35: freqIndexes.push_back(0); rt300@35: freqIndexes.push_back(4); rt300@35: freqIndexes.push_back(6); rt300@35: freqIndexes.push_back(7); rt300@35: freqIndexes.push_back(8); rt300@35: rt300@35: // loop thru all presets rt300@35: int N = presetManager.thePresets.size(); rt300@35: rt300@35: vector sliderVals; rt300@35: rt300@35: Json::Value root; rt300@35: rt300@35: vector vals; rt300@35: rt300@35: for(int i = 0; i< N ; i++){ rt300@44: sliderVals = theGridView.calculateParamsFromCoord(presetManager.thePresets[i].coordinates); rt300@35: rt300@35: vals.push_back((sliderVals[0]+32)*8.); // DC offset rt300@35: for(int i=1; i<5;i++){ rt300@35: vals.push_back((sliderVals[i] - 64)*2.); rt300@35: } rt300@35: rt300@35: rt300@35: vector steps = frequencer.freqMagEdit(freqIndexes, vals); rt300@35: rt300@35: for(int j = 0; j<16;j++){ rt300@35: root["sequences"][i][j] = int(steps[j]); rt300@35: } rt300@35: vals.clear(); rt300@35: } rt300@35: rt300@35: //cout << root; rt300@35: sequenceFile << root; rt300@35: } rt300@35: //=-------------------------------------------------------------------- rt300@36: void testApp::loadSequences(){ rt300@36: rt300@36: // read in sequence preset file rt300@45: string jsonFile = ofFilePath::getAbsolutePath(ofToDataPath("pilot_sequences.json")); rt300@45: rt300@45: cout << "SQUENCES FILE: " << jsonFile << "\n"; rt300@45: //string jsonFile = ofxiPhoneGetDocumentsDirectory() + "pilot_sequences.json"; rt300@37: rt300@36: Json::Value root; rt300@36: Json::Reader reader; rt300@37: rt300@36: ifstream theFile(jsonFile.c_str()); rt300@36: stringstream fileText; rt300@36: string line; rt300@36: if(!theFile){ rt300@36: cout<<"can't find sequence file: " << jsonFile.c_str() << "\n"; rt300@36: return; rt300@36: }else{ rt300@36: rt300@36: while(theFile){ rt300@36: theFile >> line; rt300@36: // cout << line << "\n"; // lots? rt300@37: fileText << line; rt300@36: } rt300@36: rt300@36: theFile.close(); rt300@36: } rt300@36: rt300@36: bool parsingSuccessful = reader.parse( fileText.str(), root ); rt300@36: rt300@36: if ( !parsingSuccessful ) rt300@36: { rt300@36: // report to the user the failure and their locations in the document. rt300@36: std::cout << "Failed to parse sequence JSON: \n" rt300@36: << reader.getFormattedErrorMessages(); rt300@36: return; rt300@36: } rt300@36: rt300@36: // now put into variables rt300@36: const Json::Value jseqs = root["sequences"]; rt300@36: int N = jseqs.size(); rt300@36: for(int i=0; i()); rt300@36: for(int j=0; j maxMessages) rt300@39: messages.pop_front(); rt300@39: } rt300@39: rt300@39: //-------------------------------------------------------------- rt300@39: void testApp::newMidiMessage(ofxMidiMessage& msg) { rt300@39: //addMessage(msg.toString()); rt300@39: rt300@39: // look at what it is rt300@39: rt300@39: if(msg.channel == midiChannel && msg.status == MIDI_CONTROL_CHANGE){ rt300@39: int ctl_num = msg.control; rt300@39: int ctl_val = msg.value; rt300@39: if(ctl_num - midiOffset >= 0 && ctl_num - midiOffset < sliderVals.size()){ rt300@39: sliderVals[ctl_num] = (int)ctl_val; rt300@39: theGridView.setParams(sliderVals); rt300@39: } rt300@39: } rt300@39: rt300@39: } rt300@39: rt300@39: //-------------------------------------------------------------- rt300@39: void testApp::midiInputAdded(string name, bool isNetwork) { rt300@39: stringstream msg; rt300@39: msg << "ofxMidi: input added: " << name << " network: " << isNetwork; rt300@39: cout << msg.str(); rt300@39: addMessage(msg.str()); rt300@39: rt300@39: // create and open a new input port rt300@39: ofxMidiIn * newInput = new ofxMidiIn; rt300@39: newInput->openPort(name); rt300@39: newInput->addListener(this); rt300@39: inputs.push_back(newInput); rt300@39: } rt300@39: rt300@39: //-------------------------------------------------------------- rt300@39: void testApp::midiInputRemoved(string name, bool isNetwork) { rt300@39: stringstream msg; rt300@39: msg << "ofxMidi: input removed: " << name << " network: " << isNetwork << endl; rt300@39: cout << msg.str(); rt300@39: addMessage(msg.str()); rt300@39: rt300@39: // close and remove input port rt300@39: vector::iterator iter; rt300@39: for(iter = inputs.begin(); iter != inputs.end(); ++iter) { rt300@39: ofxMidiIn * input = (*iter); rt300@39: if(input->getName() == name) { rt300@39: input->closePort(); rt300@39: input->removeListener(this); rt300@39: delete input; rt300@39: inputs.erase(iter); rt300@39: break; rt300@39: } rt300@39: } rt300@39: } rt300@39: rt300@39: //-------------------------------------------------------------- rt300@39: void testApp::midiOutputAdded(string name, bool isNetwork) { rt300@39: stringstream msg; rt300@39: msg << "ofxMidi: output added: " << name << " network: " << isNetwork << endl; rt300@39: cout << msg.str(); rt300@39: addMessage(msg.str()); rt300@39: rt300@39: // create and open new output port rt300@39: ofxMidiOut * newOutput = new ofxMidiOut; rt300@39: newOutput->openPort(name); rt300@39: outputs.push_back(newOutput); rt300@39: } rt300@39: rt300@39: //-------------------------------------------------------------- rt300@39: void testApp::midiOutputRemoved(string name, bool isNetwork) { rt300@39: stringstream msg; rt300@39: msg << "ofxMidi: output removed: " << name << " network: " << isNetwork << endl; rt300@39: cout << msg.str(); rt300@39: addMessage(msg.str()); rt300@39: rt300@39: // close and remove output port rt300@39: vector::iterator iter; rt300@39: for(iter = outputs.begin(); iter != outputs.end(); ++iter) { rt300@39: ofxMidiOut * output = (*iter); rt300@39: if(output->getName() == name) { rt300@39: output->closePort(); rt300@39: delete output; rt300@39: outputs.erase(iter); rt300@39: break; rt300@39: } rt300@39: } rt300@39: } rt300@39: //--------------------------------------------------------------