hekeus@6: #include "ofMain.h" samer@23: #include "ofxOsc.h" hekeus@6: #include "Voice.h" hekeus@6: samer@22: #define MAX_VOICES 10 hekeus@6: hekeus@6: class melodyTriangle : public ofBaseApp{ hekeus@6: hekeus@6: public: samer@22: ~melodyTriangle(); samer@23: melodyTriangle(const char *host, int port, int numVoices, samer@23: bool enableKeys, int voiceIdOffset, int receivePort); samer@22: hekeus@6: void setup(); hekeus@6: void update(); hekeus@6: void draw(); hekeus@6: hekeus@6: void keyPressed(int key); hekeus@6: void keyReleased(int key); hekeus@6: void mouseMoved(int x, int y ); hekeus@6: void mouseDragged(int x, int y, int button); hekeus@6: void mousePressed(int x, int y, int button); hekeus@6: void mouseReleased(int x, int y, int button); hekeus@6: void windowResized(int w, int h); samer@22: samer@22: private: samer@23: class bad_voice_id : public std::exception { samer@23: int id; samer@23: public: samer@23: bad_voice_id(int id): id(id) {} samer@23: ~bad_voice_id() throw() {} samer@23: const char *what() const throw(); samer@23: }; samer@23: samer@22: // private methods samer@23: Voice *get_voice(int id) throw(bad_voice_id); samer@23: samer@23: void voiceKeypress(Voice *v, int key); samer@22: void sendReplyTo(); samer@12: void sendCalibrate(); samer@23: void sendDeath(int id); samer@23: void sendPosition(Voice *v); samer@12: void sendPeriod(int id, int num, int den); samer@12: void sendShift(int id, int num, int den); samer@12: void sendOctave(int id, int oct); samer@13: void sendAmplitude(int id, float amp); samer@22: bool clipToTriangle(int *cx, int *cy); samer@22: void fitTriangleIn(int w, int h); samer@22: void handleMessage(ofxOscMessage &m); samer@23: void reset(); samer@22: samer@22: // Immutable after construction and setup samer@22: ofxOscSender sender; samer@22: ofxOscReceiver receiver; samer@22: int receivePort; // for sending /reply_to message samer@22: int numVoices; hekeus@6: samer@22: // somewhat mutable (on window resize) samer@22: int x1,y1,x2,y2,x3,y3; // Triangle Coords samer@22: int DX13, DY13, SQLEN13; // to optimise clipping hekeus@6: samer@22: // mutable state samer@23: Voice *voices[MAX_VOICES]; samer@23: int voiceGrabbed; samer@23: bool constrained; samer@23: bool enableKeys; samer@23: int display_frames; samer@23: string display_msg; samer@22: ofTrueTypeFont display_font; hekeus@6: };