Mercurial > hg > tweakathon2ios
diff AppCore.mm @ 0:a223551fdc1f
First commit - copy from tweakathlon.
author | Robert Tubb <rt300@eecs.qmul.ac.uk> |
---|---|
date | Fri, 10 Oct 2014 11:46:42 +0100 |
parents | |
children | 92850a2b099c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/AppCore.mm Fri Oct 10 11:46:42 2014 +0100 @@ -0,0 +1,304 @@ +/* + * Copyright (c) 2011 Dan Wilcox <danomatika@gmail.com> + * + * BSD Simplified License. + * For information on usage and redistribution, and for a DISCLAIMER OF ALL + * WARRANTIES, see the file, "LICENSE.txt," in this distribution. + * + * See https://github.com/danomatika/ofxPd for documentation + * + */ +#include "AppCore.h" + +//-------------------------------------------------------------- +void AppCore::setup(const int numOutChannels, const int numInChannels, + const int sampleRate, const int ticksPerBuffer) { + + ofSetFrameRate(60); + ofSetVerticalSync(true); + //ofSetLogLevel(OF_LOG_VERBOSE); + + // double check where we are ... + cout << ofFilePath::getCurrentWorkingDirectory() << endl; + + if(!pd.init(numOutChannels, numInChannels, sampleRate, ticksPerBuffer)) { + ofLog(OF_LOG_ERROR, "Could not init pd"); + OF_EXIT_APP(1); + } + midiChan = 1; // midi channels are 1-16 + + // subscribe to receive source names + pd.subscribe("toOF"); + pd.subscribe("env"); + + // add message receiver, disables polling (see processEvents) + pd.addReceiver(*this); // automatically receives from all subscribed sources + pd.ignore(*this, "env"); // don't receive from "env" + //pd.ignore(*this); // ignore all sources + //pd.receive(*this, "toOF"); // receive only from "toOF" + + // add midi receiver + //pd.addMidiReceiver(*this); // automatically receives from all channels + //pd.ignoreMidi(*this, 1); // ignore midi channel 1 + pd.ignoreMidi(*this); // ignore all channels + //pd.receiveMidi(*this, 1); // receive only from channel 1 + + // add the data/pd folder to the search path + pd.addToSearchPath("pd"); + + // audio processing on + pd.start(); + + // open patch + //patchName = "targetSynth6.pd"; + patchName = "tweakathon_synth_pulse.pd"; + Patch patch = pd.openPatch(patchName); + cout << patch << endl; + + +} + +//-------------------------------------------------------------- +void AppCore::update() { + ofBackground(100, 100, 100); + + // update scope array from pd + pd.readArray("scope", scopeArray); +} + +//-------------------------------------------------------------- +void AppCore::draw() { + + // draw scope + ofSetColor(0, 255, 0); + ofSetRectMode(OF_RECTMODE_CENTER); + float x = 0, y = ofGetHeight()/2; + float w = ofGetWidth() / (float) scopeArray.size(), h = ofGetHeight()/2; + for(int i = 0; i < scopeArray.size()-1; ++i) { + ofLine(x, y+scopeArray[i]*h, x+w, y+scopeArray[i+1]*h); + x += w; + } +} + +//-------------------------------------------------------------- +void AppCore::exit() { + pd.stop(); +} + +//-------------------------------------------------------------- +void AppCore::playTone(int pitch) { + pd << StartMessage() << "pitch" << pitch << FinishList("tone") << Bang("tone"); +} + +//-------------------------------------------------------------- +void AppCore::keyPressed (int key) { + + switch(key) { + + case 'a': + playTone(60); + break; + case 'w': + playTone(61); + break; + case 's': + playTone(62); + break; + case 'e': + playTone(63); + break; + case 'd': + playTone(64); + break; + case 'f': + playTone(65); + break; + case 't': + playTone(66); + break; + case 'g': + playTone(67); + break; + case 'y': + playTone(68); + break; + case 'h': + playTone(69); + break; + case 'u': + playTone(70); + break; + case 'j': + playTone(71); + break; + case 'k': + playTone(72); + break; + + case ' ': + if(pd.isReceiving(*this, "env")) { + pd.ignore(*this, "env"); + cout << "ignoring env" << endl; + } + else { + pd.receive(*this, "env"); + cout << "receiving from env" << endl; + } + break; + + default: + break; + } +} + +//-------------------------------------------------------------- +void AppCore::audioReceived(float * input, int bufferSize, int nChannels) { + pd.audioIn(input, bufferSize, nChannels); +} + +//-------------------------------------------------------------- +void AppCore::audioRequested(float * output, int bufferSize, int nChannels) { + pd.audioOut(output, bufferSize, nChannels); +} + +//-------------------------------------------------------------- +void AppCore::print(const std::string& message) { + cout << message << endl; +} + +//-------------------------------------------------------------- +void AppCore::receiveBang(const std::string& dest) { + cout << "OF: bang " << dest << endl; +} + +void AppCore::receiveFloat(const std::string& dest, float value) { + cout << "OF: float " << dest << ": " << value << endl; +} + +void AppCore::receiveSymbol(const std::string& dest, const std::string& symbol) { + cout << "OF: symbol " << dest << ": " << symbol << endl; +} + +void AppCore::receiveList(const std::string& dest, const List& list) { + cout << "OF: list " << dest << ": "; + + // step through the list + for(int i = 0; i < list.len(); ++i) { + if(list.isFloat(i)) + cout << list.getFloat(i) << " "; + else if(list.isSymbol(i)) + cout << list.getSymbol(i) << " "; + } + + // you can also use the built in toString function or simply stream it out + // cout << list.toString(); + // cout << list; + + // print an OSC-style type string + cout << list.types() << endl; +} + +void AppCore::receiveMessage(const std::string& dest, const std::string& msg, const List& list) { + cout << "OF: message " << dest << ": " << msg << " " << list.toString() << list.types() << endl; +} + +//-------------------------------------------------------------- +void AppCore::receiveNoteOn(const int channel, const int pitch, const int velocity) { + cout << "OF MIDI: note on: " << channel << " " << pitch << " " << velocity << endl; +} + +void AppCore::receiveControlChange(const int channel, const int controller, const int value) { + cout << "OF MIDI: control change: " << channel << " " << controller << " " << value << endl; +} + +// note: pgm nums are 1-128 to match pd +void AppCore::receiveProgramChange(const int channel, const int value) { + cout << "OF MIDI: program change: " << channel << " " << value << endl; +} + +void AppCore::receivePitchBend(const int channel, const int value) { + cout << "OF MIDI: pitch bend: " << channel << " " << value << endl; +} + +void AppCore::receiveAftertouch(const int channel, const int value) { + cout << "OF MIDI: aftertouch: " << channel << " " << value << endl; +} + +void AppCore::receivePolyAftertouch(const int channel, const int pitch, const int value) { + cout << "OF MIDI: poly aftertouch: " << channel << " " << pitch << " " << value << endl; +} + +// note: pd adds +2 to the port num, so sending to port 3 in pd to [midiout], +// shows up at port 1 in ofxPd +void AppCore::receiveMidiByte(const int port, const int byte) { + cout << "OF MIDI: midi byte: " << port << " " << byte << endl; +} + +//-------------------------------------------------------------- +void AppCore::processEvents() { + + cout << "Number of waiting messages: " << pd.numMessages() << endl; + + while(pd.numMessages() > 0) { + Message& msg = pd.nextMessage(); + + switch(msg.type) { + + case pd::PRINT: + cout << "OF: " << msg.symbol << endl; + break; + + // events + case pd::BANG: + cout << "OF: bang " << msg.dest << endl; + break; + case pd::FLOAT: + cout << "OF: float " << msg.dest << ": " << msg.num << endl; + break; + case pd::SYMBOL: + cout << "OF: symbol " << msg.dest << ": " << msg.symbol << endl; + break; + case pd::LIST: + cout << "OF: list " << msg.list << msg.list.types() << endl; + break; + case pd::MESSAGE: + cout << "OF: message " << msg.dest << ": " << msg.symbol << " " + << msg.list << msg.list.types() << endl; + break; + + // midi + case pd::NOTE_ON: + cout << "OF MIDI: note on: " << msg.channel << " " + << msg.pitch << " " << msg.velocity << endl; + break; + case pd::CONTROL_CHANGE: + cout << "OF MIDI: control change: " << msg.channel + << " " << msg.controller << " " << msg.value << endl; + break; + case pd::PROGRAM_CHANGE: + cout << "OF MIDI: program change: " << msg.channel << " " + << msg.value << endl; + break; + case pd::PITCH_BEND: + cout << "OF MIDI: pitch bend: " << msg.channel << " " + << msg.value << endl; + break; + case pd::AFTERTOUCH: + cout << "OF MIDI: aftertouch: " << msg.channel << " " + << msg.value << endl; + break; + case pd::POLY_AFTERTOUCH: + cout << "OF MIDI: poly aftertouch: " << msg.channel << " " + << msg.pitch << " " << msg.value << endl; + break; + case pd::BYTE: + cout << "OF MIDI: midi byte: " << msg.port << " 0x" + << hex << (int) msg.byte << dec << endl; + break; + + case pd::NONE: + cout << "OF: NONE ... empty message" << endl; + break; + } + } +}