From 33521f7d0c082c1a4da4e687108d432fd3edce71 Mon Sep 17 00:00:00 2001 From: William Fish <wfish001@gold.ac.uk> Date: Fri, 18 May 2018 01:46:06 +0100 Subject: [PATCH] final push --- Final_Version/Arduino/serialLED.ino | 134 ++ Final_Version/ofxBeat-master/.gitignore | 11 + Final_Version/ofxBeat-master/README.md | 60 + .../ofxBeat-master/ofxBeatExample/Makefile | 13 + .../ofxBeatExample/Project.xcconfig | 17 + .../ofxBeat-master/ofxBeatExample/addons.make | 1 + .../ofxBeatExample/bin/data/.gitkeep | 0 .../ofxBeat-master/ofxBeatExample/config.make | 142 ++ .../ofxBeatExample.xcodeproj/project.pbxproj | 1267 +++++++++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 55055 bytes .../xcschemes/ofxBeatExample Debug.xcscheme | 86 ++ .../xcschemes/ofxBeatExample Release.xcscheme | 86 ++ .../xcschemes/xcschememanagement.plist | 14 + .../ofxBeatExample/openFrameworks-Info.plist | 22 + .../ofxBeatExample/src/main.cpp | 13 + .../ofxBeatExample/src/testApp.cpp | 67 + .../ofxBeatExample/src/testApp.h | 26 + Final_Version/ofxBeat-master/src/fft.cpp | 480 +++++++ Final_Version/ofxBeat-master/src/fft.h | 26 + Final_Version/ofxBeat-master/src/ofxBeat.cpp | 205 +++ Final_Version/ofxBeat-master/src/ofxBeat.h | 79 + Final_Version/src/beatDetection.cpp | 39 + .../src/beatDetection.h | 0 Final_Version/src/disco.cpp | 292 ++++ Final_Version/src/disco.h | 44 + Final_Version/src/electro.cpp | 340 +++++ Final_Version/src/electro.h | 42 + Final_Version/src/main.cpp | 15 + Final_Version/src/ofApp.cpp | 172 +++ Final_Version/src/ofApp.h | 54 + Final_Version/src/techno.cpp | 321 +++++ Final_Version/src/techno.h | 54 + .../strandtest/serialLED/serialLED.ino | 175 --- .../strandtest/serialLED/serialLED.ino | 134 ++ .../LEDprogress}/src/main.cpp | 0 .../LEDprogress}/src/ofApp.cpp | 0 .../LEDprogress}/src/ofApp.h | 0 .../Prototype}/src/Visualizer.cpp | 0 .../Prototype}/src/Visualizer.h | 0 .../Prototype}/src/main.cpp | 0 .../Prototype}/src/particle.cpp | 0 .../Prototype}/src/particle.h | 0 .../UserInterfaceState.xcuserstate | Bin .../VisualProgress}/VIS4/src/main.cpp | 0 .../VisualProgress}/VIS4/src/ofApp.cpp | 0 .../VisualProgress}/VIS4/src/ofApp.h | 0 .../VisualProgress}/VISUAL 3/src/main.cpp | 0 .../VisualProgress}/VISUAL 3/src/ofApp.cpp | 0 .../VisualProgress}/VISUAL 3/src/ofApp.h | 0 .../VisualProgress}/Visual 1/Circle class.cpp | 0 .../VisualProgress}/Visual 1/Circle class.hpp | 0 .../VisualProgress}/Visual 1/main.cpp | 0 .../VisualProgress}/Visual 1/ofApp.cpp | 0 .../VisualProgress}/Visual 1/ofApp.h | 0 .../Visual 2/src/Visualizer.cpp | 0 .../VisualProgress}/Visual 2/src/Visualizer.h | 0 .../VisualProgress}/Visual 2/src/main.cpp | 0 .../VisualProgress}/Visual 2/src/ofApp.cpp | 0 .../VisualProgress}/Visual 2/src/ofApp.h | 0 .../VisualProgress}/Visual 2/src/particle.cpp | 0 .../VisualProgress}/Visual 2/src/particle.h | 0 .../src/beatDetection.cpp | 0 .../visual_consolidation/src/beatDetection.h | 26 + .../visual_consolidation/src/disco.cpp | 0 .../visual_consolidation/src/disco.h | 0 .../visual_consolidation/src/electro.cpp | 0 .../visual_consolidation/src/electro.h | 0 .../visual_consolidation/src/main.cpp | 0 .../visual_consolidation/src/ofApp.cpp | 0 .../visual_consolidation/src/ofApp.h | 0 .../visual_consolidation/src/techno.cpp | 0 .../visual_consolidation/src/techno.h | 0 .../pp_amendments.txt | 0 OLD_FILES/readme.txt | 1 + .../resources_references.txt | 0 readme.txt | 40 +- 77 files changed, 4313 insertions(+), 192 deletions(-) create mode 100644 Final_Version/Arduino/serialLED.ino create mode 100644 Final_Version/ofxBeat-master/.gitignore create mode 100644 Final_Version/ofxBeat-master/README.md create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/Makefile create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/Project.xcconfig create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/addons.make create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/bin/data/.gitkeep create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/config.make create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/project.pbxproj create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/project.xcworkspace/xcuserdata/darren.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/xcshareddata/xcschemes/ofxBeatExample Debug.xcscheme create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/xcshareddata/xcschemes/ofxBeatExample Release.xcscheme create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/xcuserdata/darren.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/openFrameworks-Info.plist create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/src/main.cpp create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/src/testApp.cpp create mode 100644 Final_Version/ofxBeat-master/ofxBeatExample/src/testApp.h create mode 100644 Final_Version/ofxBeat-master/src/fft.cpp create mode 100644 Final_Version/ofxBeat-master/src/fft.h create mode 100644 Final_Version/ofxBeat-master/src/ofxBeat.cpp create mode 100644 Final_Version/ofxBeat-master/src/ofxBeat.h create mode 100644 Final_Version/src/beatDetection.cpp rename {VisualProgress/visual_consolidation => Final_Version}/src/beatDetection.h (100%) create mode 100644 Final_Version/src/disco.cpp create mode 100644 Final_Version/src/disco.h create mode 100644 Final_Version/src/electro.cpp create mode 100644 Final_Version/src/electro.h create mode 100644 Final_Version/src/main.cpp create mode 100644 Final_Version/src/ofApp.cpp create mode 100644 Final_Version/src/ofApp.h create mode 100644 Final_Version/src/techno.cpp create mode 100644 Final_Version/src/techno.h delete mode 100644 LEDprogress/Arduino_LED/strandtest/serialLED/serialLED.ino create mode 100644 OLD_FILES/LEDprogress/Arduino_LED/strandtest/serialLED/serialLED.ino rename {LEDprogress => OLD_FILES/LEDprogress}/src/main.cpp (100%) rename {LEDprogress => OLD_FILES/LEDprogress}/src/ofApp.cpp (100%) rename {LEDprogress => OLD_FILES/LEDprogress}/src/ofApp.h (100%) rename {Prototype => OLD_FILES/Prototype}/src/Visualizer.cpp (100%) rename {Prototype => OLD_FILES/Prototype}/src/Visualizer.h (100%) rename {Prototype => OLD_FILES/Prototype}/src/main.cpp (100%) rename {Prototype => OLD_FILES/Prototype}/src/particle.cpp (100%) rename {Prototype => OLD_FILES/Prototype}/src/particle.h (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/VIS4/VIS4.xcodeproj/project.xcworkspace/xcuserdata/jamesjcarty.xcuserdatad/UserInterfaceState.xcuserstate (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/VIS4/src/main.cpp (100%) mode change 100755 => 100644 rename {VisualProgress => OLD_FILES/VisualProgress}/VIS4/src/ofApp.cpp (100%) mode change 100755 => 100644 rename {VisualProgress => OLD_FILES/VisualProgress}/VIS4/src/ofApp.h (100%) mode change 100755 => 100644 rename {VisualProgress => OLD_FILES/VisualProgress}/VISUAL 3/src/main.cpp (100%) mode change 100755 => 100644 rename {VisualProgress => OLD_FILES/VisualProgress}/VISUAL 3/src/ofApp.cpp (100%) mode change 100755 => 100644 rename {VisualProgress => OLD_FILES/VisualProgress}/VISUAL 3/src/ofApp.h (100%) mode change 100755 => 100644 rename {VisualProgress => OLD_FILES/VisualProgress}/Visual 1/Circle class.cpp (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/Visual 1/Circle class.hpp (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/Visual 1/main.cpp (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/Visual 1/ofApp.cpp (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/Visual 1/ofApp.h (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/Visual 2/src/Visualizer.cpp (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/Visual 2/src/Visualizer.h (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/Visual 2/src/main.cpp (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/Visual 2/src/ofApp.cpp (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/Visual 2/src/ofApp.h (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/Visual 2/src/particle.cpp (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/Visual 2/src/particle.h (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/visual_consolidation/src/beatDetection.cpp (100%) create mode 100644 OLD_FILES/VisualProgress/visual_consolidation/src/beatDetection.h rename {VisualProgress => OLD_FILES/VisualProgress}/visual_consolidation/src/disco.cpp (100%) mode change 100755 => 100644 rename {VisualProgress => OLD_FILES/VisualProgress}/visual_consolidation/src/disco.h (100%) mode change 100755 => 100644 rename {VisualProgress => OLD_FILES/VisualProgress}/visual_consolidation/src/electro.cpp (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/visual_consolidation/src/electro.h (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/visual_consolidation/src/main.cpp (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/visual_consolidation/src/ofApp.cpp (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/visual_consolidation/src/ofApp.h (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/visual_consolidation/src/techno.cpp (100%) rename {VisualProgress => OLD_FILES/VisualProgress}/visual_consolidation/src/techno.h (100%) rename pp_amendments.txt => OLD_FILES/pp_amendments.txt (100%) create mode 100644 OLD_FILES/readme.txt rename resources_references.txt => OLD_FILES/resources_references.txt (100%) diff --git a/Final_Version/Arduino/serialLED.ino b/Final_Version/Arduino/serialLED.ino new file mode 100644 index 0000000..c8b42d2 --- /dev/null +++ b/Final_Version/Arduino/serialLED.ino @@ -0,0 +1,134 @@ +#include <Adafruit_NeoPixel.h> +#ifdef __AVR__ +#include <avr/power.h> +#endif + +#define PIN 6 //digital pin you're plugged in to +#define stripLength 30 //quantity of LEDS on strip + + +//A serial communication/neopixel hybrid for controlling visuals via an arduino and visual studio. +//Requires a WS2812B LED strip to work +//The basic idea of the program is to recieve incoming bytes from serial communication, and use these to decide which LEDS to light up +//we didnt need to get too complex with this as the results we wanted were easy to achieve +//Very much learnt this from scratch so there may be some issues with this further down the line,but for a project of this +//size it's perfeclty fine. + +Adafruit_NeoPixel strip = Adafruit_NeoPixel(stripLength, PIN, NEO_GRB + NEO_KHZ800); + + +int incomingByte = 0; //incomingByte is the basis for control + + +bool electroControl = false; //booleans for controlling states +bool discoControl = false; +void setup() { + + Serial.begin(57600); + strip.begin(); + strip.show(); // Initialize all pixels to 'off' + +} + +void loop() { + + + incomingByte = Serial.read(); //reads the incoming byte + + //techno visual control + if (incomingByte == 1) { //if the byte sent is 1(if beatvalue in c++ code is over a certain amount)... + discoControl = false; //discocontrol becomes false, to disable the calling of the disco visual, explained later + for (int i = 0; i < 30; i++) { + strip.setPixelColor(i, strip.Color(240, 240, 240)); //sets all pixel to nearly white + + } + for(int i = 0;i<10;i++){ //poor programming but it serves a simple purpose, to delay the program a bit without using wait, keeps the LEDS cleared after they fire + strip.show(); + } + + for (int i = 0; i < 30; i++) { + strip.setPixelColor(i, strip.Color(0, 0, 0)); //turns the pixels off again, causing a flash + + } + strip.show(); + } + + else if(incomingByte ==2){ // electro visual control + discoControl=false; + for (int i = 0; i < 30; i++) { + strip.setPixelColor(i, strip.Color(240, 120, 0)); //sets them to orange, didnt want any fancy leds here as the colour matched sun felt warming + strip.show(); + } + } + else if(incomingByte ==3){ //little more complicated for this one as it needed to use the rainbow function + + discoControl=true; //discocontrol becomes true to enable function + }else if(incomingByte ==4){ //the rainbow function would linger while going back to techno visual, recieves a 1 off byte '4' to disable it + discoControl=false; + for (int i = 0; i < 30; i++) { + strip.setPixelColor(i, strip.Color(0, 0, 0)); //sets all to off if recieving '4' + + } + strip.show(); + } + if(discoControl){ // + rainbow(2); //(X)= wait, longer may look better but it needs to complete its cycle, problematic when going back and forth between visuals. + + + } + + +// Didnt use this in the end, leaving here for future use +// +//void rgbControl(uint32_t bytes_index, uint32_t bytes_r, uint32_t bytes_g, uint32_t bytes_b) { +// //RGB INDEX CONTROL +// +// //Serial.readBytes(bytes,4); //store data incoming bytes into [bytes] buffer, returns amount of bytes given +// strip.setPixelColor(bytes_index, strip.Color(bytes_r, bytes_g, bytes_b)); +// if (bytes_r == 0 && bytes_g == 0 && bytes_b == 0) { //clears all the LEDS as they're very bright and annoying +// for (int i = 0; i <= 9; i++) { +// strip.setPixelColor(i, 0, 0, 0); +// strip.show(); +// } +// } +// strip.show(); +// +//} + +// Also didnt use this +//void mouseControl(uint32_t i, uint32_t c) { +// +// strip.setPixelColor(i, c); +// strip.show(); +} + +// Default neopixel animation that we adapted to work with serial communication, didn't need to recreate as the effect was perfect for our visual +void rainbow(uint8_t wait) { + if(discoControl){ + uint16_t i, j; + + for (j = 0; j < 256; j++) { + for (i = 0; i < strip.numPixels(); i++) { + strip.setPixelColor(i, Wheel((i + j) & 255)); + } + strip.show(); + delay(wait); + } + } +} + + + +//default neopixel function +uint32_t Wheel(byte WheelPos) { + WheelPos = 255 - WheelPos; + if (WheelPos < 85) { + return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); + } + if (WheelPos < 170) { + WheelPos -= 85; + return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); + } + WheelPos -= 170; + return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); +} diff --git a/Final_Version/ofxBeat-master/.gitignore b/Final_Version/ofxBeat-master/.gitignore new file mode 100644 index 0000000..4130f3b --- /dev/null +++ b/Final_Version/ofxBeat-master/.gitignore @@ -0,0 +1,11 @@ + +# OS generated files # +###################### +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + diff --git a/Final_Version/ofxBeat-master/README.md b/Final_Version/ofxBeat-master/README.md new file mode 100644 index 0000000..6c20afc --- /dev/null +++ b/Final_Version/ofxBeat-master/README.md @@ -0,0 +1,60 @@ +# ofxBeat + +A simple beat detection routine for openFrameworks that gives 32 fft bands +plus separate output for kick, snare, and hihat. Created for inclusion in the +Cyril language for live coded visuals. + +## Provenance + +This builds on the beat tracking code in [ofxBeatTracking](https://github.com/zenwerk/ofxBeatTracking), which itself was based on C++ code from Dominic Mazzoni, which was based on an free FFT implementation in Fortan. Further details +are in the comments [here](https://github.com/zenwerk/ofxBeatTracking/blob/master/fft.cpp). + +## Usage + +Install the addon as usual, then in your openFrameworks app define an instance +of ofxBeat, for example: + + class testApp : public ofBaseApp{ + + ofxBeat beat; + void audioReceived(float*, int, int); + + // ... rest of your app class ... + }; + +Then initialize the sound stream in your app `setup()` method, for example: + + void testApp::setup(){ + ofSoundStreamSetup(0, 1, this, 44100, beat.getBufferSize(), 4); + } + +Add the following method to pass on audio events to the FFT processor: + + void testApp::audioReceived(float* input, int bufferSize, int nChannels) { + beat.audioReceived(input, bufferSize, nChannels); + } + +Add a call to the update method to your app's update method to perform the +fft processing on recevied audio, for example: + + void testApp::update() { + beat.update(ofGetElapsedTimeMillis()); + } + +You can then use the separate bands to get information in the current beat +graph. These methods return a value between 1 and 0. It's 1 when a beat +is detected and fades away to 0 based on the detected time between beats. + + float kick = beat.kick(); + float snare = beat.snare(); + float hihat = beat.hihat(); + +You can also access the raw fft bands using the following function, where `i` +is a value between 0 and 31 (i.e. 32 fft bands indexed from 0): + + float selectedBand = beat.getBand(i); + +## Limitations + +This is a pretty basic implementation of beat detection but it is fast and +gets a fairly good result. diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/Makefile b/Final_Version/ofxBeat-master/ofxBeatExample/Makefile new file mode 100644 index 0000000..7a7fe8b --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/Makefile @@ -0,0 +1,13 @@ +# Attempt to load a config.make file. +# If none is found, project defaults in config.project.make will be used. +ifneq ($(wildcard config.make),) + include config.make +endif + +# make sure the the OF_ROOT location is defined +ifndef OF_ROOT + OF_ROOT=../../.. +endif + +# call the project makefile! +include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/Project.xcconfig b/Final_Version/ofxBeat-master/ofxBeatExample/Project.xcconfig new file mode 100644 index 0000000..c90f7b1 --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/Project.xcconfig @@ -0,0 +1,17 @@ +//THE PATH TO THE ROOT OF OUR OF PATH RELATIVE TO THIS PROJECT. +//THIS NEEDS TO BE DEFINED BEFORE CoreOF.xcconfig IS INCLUDED +OF_PATH = ../../.. + +//THIS HAS ALL THE HEADER AND LIBS FOR OF CORE +#include "../../../libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig" + +//ICONS - NEW IN 0072 +ICON_NAME_DEBUG = icon-debug.icns +ICON_NAME_RELEASE = icon.icns +ICON_FILE_PATH = $(OF_PATH)/libs/openFrameworksCompiled/project/osx/ + +//IF YOU WANT AN APP TO HAVE A CUSTOM ICON - PUT THEM IN YOUR DATA FOLDER AND CHANGE ICON_FILE_PATH to: +//ICON_FILE_PATH = bin/data/ + +OTHER_LDFLAGS = $(OF_CORE_LIBS) +HEADER_SEARCH_PATHS = $(OF_CORE_HEADERS) diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/addons.make b/Final_Version/ofxBeat-master/ofxBeatExample/addons.make new file mode 100644 index 0000000..e39b174 --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/addons.make @@ -0,0 +1 @@ +ofxBeat diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/bin/data/.gitkeep b/Final_Version/ofxBeat-master/ofxBeatExample/bin/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/config.make b/Final_Version/ofxBeat-master/ofxBeatExample/config.make new file mode 100644 index 0000000..df10f64 --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/config.make @@ -0,0 +1,142 @@ +################################################################################ +# CONFIGURE PROJECT MAKEFILE (optional) +# This file is where we make project specific configurations. +################################################################################ + +################################################################################ +# OF ROOT +# The location of your root openFrameworks installation +# (default) OF_ROOT = ../../.. +################################################################################ +# OF_ROOT = ../../.. + +################################################################################ +# PROJECT ROOT +# The location of the project - a starting place for searching for files +# (default) PROJECT_ROOT = . (this directory) +# +################################################################################ +# PROJECT_ROOT = . + +################################################################################ +# PROJECT SPECIFIC CHECKS +# This is a project defined section to create internal makefile flags to +# conditionally enable or disable the addition of various features within +# this makefile. For instance, if you want to make changes based on whether +# GTK is installed, one might test that here and create a variable to check. +################################################################################ +# None + +################################################################################ +# PROJECT EXTERNAL SOURCE PATHS +# These are fully qualified paths that are not within the PROJECT_ROOT folder. +# Like source folders in the PROJECT_ROOT, these paths are subject to +# exlclusion via the PROJECT_EXLCUSIONS list. +# +# (default) PROJECT_EXTERNAL_SOURCE_PATHS = (blank) +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_EXTERNAL_SOURCE_PATHS = + +################################################################################ +# PROJECT EXCLUSIONS +# These makefiles assume that all folders in your current project directory +# and any listed in the PROJECT_EXTERNAL_SOURCH_PATHS are are valid locations +# to look for source code. The any folders or files that match any of the +# items in the PROJECT_EXCLUSIONS list below will be ignored. +# +# Each item in the PROJECT_EXCLUSIONS list will be treated as a complete +# string unless teh user adds a wildcard (%) operator to match subdirectories. +# GNU make only allows one wildcard for matching. The second wildcard (%) is +# treated literally. +# +# (default) PROJECT_EXCLUSIONS = (blank) +# +# Will automatically exclude the following: +# +# $(PROJECT_ROOT)/bin% +# $(PROJECT_ROOT)/obj% +# $(PROJECT_ROOT)/%.xcodeproj +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_EXCLUSIONS = + +################################################################################ +# PROJECT LINKER FLAGS +# These flags will be sent to the linker when compiling the executable. +# +# (default) PROJECT_LDFLAGS = -Wl,-rpath=./libs +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ + +# Currently, shared libraries that are needed are copied to the +# $(PROJECT_ROOT)/bin/libs directory. The following LDFLAGS tell the linker to +# add a runtime path to search for those shared libraries, since they aren't +# incorporated directly into the final executable application binary. +# TODO: should this be a default setting? +# PROJECT_LDFLAGS=-Wl,-rpath=./libs + +################################################################################ +# PROJECT DEFINES +# Create a space-delimited list of DEFINES. The list will be converted into +# CFLAGS with the "-D" flag later in the makefile. +# +# (default) PROJECT_DEFINES = (blank) +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_DEFINES = + +################################################################################ +# PROJECT CFLAGS +# This is a list of fully qualified CFLAGS required when compiling for this +# project. These CFLAGS will be used IN ADDITION TO the PLATFORM_CFLAGS +# defined in your platform specific core configuration files. These flags are +# presented to the compiler BEFORE the PROJECT_OPTIMIZATION_CFLAGS below. +# +# (default) PROJECT_CFLAGS = (blank) +# +# Note: Before adding PROJECT_CFLAGS, note that the PLATFORM_CFLAGS defined in +# your platform specific configuration file will be applied by default and +# further flags here may not be needed. +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_CFLAGS = + +################################################################################ +# PROJECT OPTIMIZATION CFLAGS +# These are lists of CFLAGS that are target-specific. While any flags could +# be conditionally added, they are usually limited to optimization flags. +# These flags are added BEFORE the PROJECT_CFLAGS. +# +# PROJECT_OPTIMIZATION_CFLAGS_RELEASE flags are only applied to RELEASE targets. +# +# (default) PROJECT_OPTIMIZATION_CFLAGS_RELEASE = (blank) +# +# PROJECT_OPTIMIZATION_CFLAGS_DEBUG flags are only applied to DEBUG targets. +# +# (default) PROJECT_OPTIMIZATION_CFLAGS_DEBUG = (blank) +# +# Note: Before adding PROJECT_OPTIMIZATION_CFLAGS, please note that the +# PLATFORM_OPTIMIZATION_CFLAGS defined in your platform specific configuration +# file will be applied by default and further optimization flags here may not +# be needed. +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_OPTIMIZATION_CFLAGS_RELEASE = +# PROJECT_OPTIMIZATION_CFLAGS_DEBUG = + +################################################################################ +# PROJECT COMPILERS +# Custom compilers can be set for CC and CXX +# (default) PROJECT_CXX = (blank) +# (default) PROJECT_CC = (blank) +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_CXX = +# PROJECT_CC = diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/project.pbxproj b/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/project.pbxproj new file mode 100644 index 0000000..12f1238 --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/project.pbxproj @@ -0,0 +1,1267 @@ +<?xml version="1.0"?> +<plist version="1.0"> + <dict> + <key>archiveVersion</key> + <string>1</string> + <key>classes</key> + <dict /> + <key>objectVersion</key> + <string>46</string> + <key>objects</key> + <dict> + <key>F21017D5316CB2B55CD68641</key> + <dict> + <key>explicitFileType</key> + <string>sourcecode.c.h</string> + <key>fileEncoding</key> + <string>30</string> + <key>isa</key> + <string>PBXFileReference</string> + <key>name</key> + <string>ofxBeat.h</string> + <key>path</key> + <string>../../../addons/ofxBeat/src/ofxBeat.h</string> + <key>sourceTree</key> + <string>SOURCE_ROOT</string> + </dict> + <key>C098DBE008A1B5C6D12ABFFD</key> + <dict> + <key>fileRef</key> + <string>C6684F2AB3BF96EE746EF6DA</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>C6684F2AB3BF96EE746EF6DA</key> + <dict> + <key>explicitFileType</key> + <string>sourcecode.cpp.cpp</string> + <key>fileEncoding</key> + <string>30</string> + <key>isa</key> + <string>PBXFileReference</string> + <key>name</key> + <string>ofxBeat.cpp</string> + <key>path</key> + <string>../../../addons/ofxBeat/src/ofxBeat.cpp</string> + <key>sourceTree</key> + <string>SOURCE_ROOT</string> + </dict> + <key>4FA7C66BC39A49BCFA509386</key> + <dict> + <key>explicitFileType</key> + <string>sourcecode.c.h</string> + <key>fileEncoding</key> + <string>30</string> + <key>isa</key> + <string>PBXFileReference</string> + <key>name</key> + <string>fft.h</string> + <key>path</key> + <string>../../../addons/ofxBeat/src/fft.h</string> + <key>sourceTree</key> + <string>SOURCE_ROOT</string> + </dict> + <key>2593B7743D30DF6DEB591433</key> + <dict> + <key>children</key> + <array> + <string>B85440CFD1540D81C05B85CB</string> + <string>4FA7C66BC39A49BCFA509386</string> + <string>C6684F2AB3BF96EE746EF6DA</string> + <string>F21017D5316CB2B55CD68641</string> + </array> + <key>isa</key> + <string>PBXGroup</string> + <key>name</key> + <string>src</string> + <key>sourceTree</key> + <string><group></string> + </dict> + <key>5B3BFE89BB3B98E8FC2F783F</key> + <dict> + <key>children</key> + <array> + <string>2593B7743D30DF6DEB591433</string> + </array> + <key>isa</key> + <string>PBXGroup</string> + <key>name</key> + <string>ofxBeat</string> + <key>sourceTree</key> + <string><group></string> + </dict> + <key>A86D7323CE1A9450906A91DD</key> + <dict> + <key>fileRef</key> + <string>B85440CFD1540D81C05B85CB</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>B85440CFD1540D81C05B85CB</key> + <dict> + <key>explicitFileType</key> + <string>sourcecode.cpp.cpp</string> + <key>fileEncoding</key> + <string>30</string> + <key>isa</key> + <string>PBXFileReference</string> + <key>name</key> + <string>fft.cpp</string> + <key>path</key> + <string>../../../addons/ofxBeat/src/fft.cpp</string> + <key>sourceTree</key> + <string>SOURCE_ROOT</string> + </dict> + <key>BB4B014C10F69532006C3DED</key> + <dict> + <key>children</key> + <array> + <string>5B3BFE89BB3B98E8FC2F783F</string> + </array> + <key>isa</key> + <string>PBXGroup</string> + <key>name</key> + <string>addons</string> + <key>sourceTree</key> + <string><group></string> + </dict> + <key>BBAB23BE13894E4700AA2426</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>GLUT.framework</string> + <key>path</key> + <string>../../../libs/glut/lib/osx/GLUT.framework</string> + <key>sourceTree</key> + <string><group></string> + </dict> + <key>BBAB23C913894ECA00AA2426</key> + <dict> + <key>children</key> + <array> + <string>E7F985F515E0DE99003869B5</string> + <string>E4C2424410CC5A17004149E2</string> + <string>E4C2424510CC5A17004149E2</string> + <string>E4C2424610CC5A17004149E2</string> + <string>E45BE9710E8CC7DD009D7055</string> + <string>E45BE9720E8CC7DD009D7055</string> + <string>E45BE9730E8CC7DD009D7055</string> + <string>E45BE9740E8CC7DD009D7055</string> + <string>E45BE9750E8CC7DD009D7055</string> + <string>E45BE9760E8CC7DD009D7055</string> + <string>E45BE9770E8CC7DD009D7055</string> + <string>E45BE9790E8CC7DD009D7055</string> + <string>E45BE97A0E8CC7DD009D7055</string> + <string>E7E077E415D3B63C0020DFD4</string> + <string>E7E077E715D3B6510020DFD4</string> + </array> + <key>isa</key> + <string>PBXGroup</string> + <key>name</key> + <string>system frameworks</string> + <key>sourceTree</key> + <string><group></string> + </dict> + <key>BBAB23CA13894EDB00AA2426</key> + <dict> + <key>children</key> + <array> + <string>BBAB23BE13894E4700AA2426</string> + </array> + <key>isa</key> + <string>PBXGroup</string> + <key>name</key> + <string>3rd party frameworks</string> + <key>sourceTree</key> + <string><group></string> + </dict> + <key>BBAB23CB13894F3D00AA2426</key> + <dict> + <key>fileRef</key> + <string>BBAB23BE13894E4700AA2426</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E4328143138ABC890047C5CB</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.pb-project</string> + <key>name</key> + <string>openFrameworksLib.xcodeproj</string> + <key>path</key> + <string>../../../libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj</string> + <key>sourceTree</key> + <string>SOURCE_ROOT</string> + </dict> + <key>E4328144138ABC890047C5CB</key> + <dict> + <key>children</key> + <array> + <string>E4328148138ABC890047C5CB</string> + </array> + <key>isa</key> + <string>PBXGroup</string> + <key>name</key> + <string>Products</string> + <key>sourceTree</key> + <string><group></string> + </dict> + <key>E4328147138ABC890047C5CB</key> + <dict> + <key>containerPortal</key> + <string>E4328143138ABC890047C5CB</string> + <key>isa</key> + <string>PBXContainerItemProxy</string> + <key>proxyType</key> + <string>2</string> + <key>remoteGlobalIDString</key> + <string>E4B27C1510CBEB8E00536013</string> + <key>remoteInfo</key> + <string>openFrameworks</string> + </dict> + <key>E4328148138ABC890047C5CB</key> + <dict> + <key>fileType</key> + <string>archive.ar</string> + <key>isa</key> + <string>PBXReferenceProxy</string> + <key>path</key> + <string>openFrameworksDebug.a</string> + <key>remoteRef</key> + <string>E4328147138ABC890047C5CB</string> + <key>sourceTree</key> + <string>BUILT_PRODUCTS_DIR</string> + </dict> + <key>E4328149138ABC9F0047C5CB</key> + <dict> + <key>fileRef</key> + <string>E4328148138ABC890047C5CB</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E45BE5980E8CC70C009D7055</key> + <dict> + <key>children</key> + <array> + <string>BBAB23CA13894EDB00AA2426</string> + <string>BBAB23C913894ECA00AA2426</string> + </array> + <key>isa</key> + <string>PBXGroup</string> + <key>name</key> + <string>frameworks</string> + <key>sourceTree</key> + <string><group></string> + </dict> + <key>E45BE9710E8CC7DD009D7055</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>AGL.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/AGL.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E45BE9720E8CC7DD009D7055</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>ApplicationServices.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/ApplicationServices.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E45BE9730E8CC7DD009D7055</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>AudioToolbox.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/AudioToolbox.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E45BE9740E8CC7DD009D7055</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>Carbon.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/Carbon.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E45BE9750E8CC7DD009D7055</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>CoreAudio.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/CoreAudio.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E45BE9760E8CC7DD009D7055</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>CoreFoundation.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/CoreFoundation.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E45BE9770E8CC7DD009D7055</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>CoreServices.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/CoreServices.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E45BE9790E8CC7DD009D7055</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>OpenGL.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/OpenGL.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E45BE97A0E8CC7DD009D7055</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>QuickTime.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/QuickTime.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E45BE97B0E8CC7DD009D7055</key> + <dict> + <key>fileRef</key> + <string>E45BE9710E8CC7DD009D7055</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E45BE97C0E8CC7DD009D7055</key> + <dict> + <key>fileRef</key> + <string>E45BE9720E8CC7DD009D7055</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E45BE97D0E8CC7DD009D7055</key> + <dict> + <key>fileRef</key> + <string>E45BE9730E8CC7DD009D7055</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E45BE97E0E8CC7DD009D7055</key> + <dict> + <key>fileRef</key> + <string>E45BE9740E8CC7DD009D7055</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E45BE97F0E8CC7DD009D7055</key> + <dict> + <key>fileRef</key> + <string>E45BE9750E8CC7DD009D7055</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E45BE9800E8CC7DD009D7055</key> + <dict> + <key>fileRef</key> + <string>E45BE9760E8CC7DD009D7055</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E45BE9810E8CC7DD009D7055</key> + <dict> + <key>fileRef</key> + <string>E45BE9770E8CC7DD009D7055</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E45BE9830E8CC7DD009D7055</key> + <dict> + <key>fileRef</key> + <string>E45BE9790E8CC7DD009D7055</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E45BE9840E8CC7DD009D7055</key> + <dict> + <key>fileRef</key> + <string>E45BE97A0E8CC7DD009D7055</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E4B69B4A0A3A1720003C02F2</key> + <dict> + <key>children</key> + <array> + <string>E4B6FCAD0C3E899E008CF71C</string> + <string>E4EB6923138AFD0F00A09F29</string> + <string>E4B69E1C0A3A1BDC003C02F2</string> + <string>E4EEC9E9138DF44700A80321</string> + <string>BB4B014C10F69532006C3DED</string> + <string>E45BE5980E8CC70C009D7055</string> + <string>E4B69B5B0A3A1756003C02F2</string> + </array> + <key>isa</key> + <string>PBXGroup</string> + <key>sourceTree</key> + <string><group></string> + </dict> + <key>E4B69B4C0A3A1720003C02F2</key> + <dict> + <key>attributes</key> + <dict> + <key>LastUpgradeCheck</key> + <string>0460</string> + </dict> + <key>buildConfigurationList</key> + <string>E4B69B4D0A3A1720003C02F2</string> + <key>compatibilityVersion</key> + <string>Xcode 3.2</string> + <key>developmentRegion</key> + <string>English</string> + <key>hasScannedForEncodings</key> + <string>0</string> + <key>isa</key> + <string>PBXProject</string> + <key>knownRegions</key> + <array> + <string>English</string> + <string>Japanese</string> + <string>French</string> + <string>German</string> + </array> + <key>mainGroup</key> + <string>E4B69B4A0A3A1720003C02F2</string> + <key>productRefGroup</key> + <string>E4B69B4A0A3A1720003C02F2</string> + <key>projectDirPath</key> + <string /> + <key>projectReferences</key> + <array> + <dict> + <key>ProductGroup</key> + <string>E4328144138ABC890047C5CB</string> + <key>ProjectRef</key> + <string>E4328143138ABC890047C5CB</string> + </dict> + </array> + <key>projectRoot</key> + <string /> + <key>targets</key> + <array> + <string>E4B69B5A0A3A1756003C02F2</string> + </array> + </dict> + <key>E4B69B4D0A3A1720003C02F2</key> + <dict> + <key>buildConfigurations</key> + <array> + <string>E4B69B4E0A3A1720003C02F2</string> + <string>E4B69B4F0A3A1720003C02F2</string> + </array> + <key>defaultConfigurationIsVisible</key> + <string>0</string> + <key>defaultConfigurationName</key> + <string>Release</string> + <key>isa</key> + <string>XCConfigurationList</string> + </dict> + <key>E4B69B4E0A3A1720003C02F2</key> + <dict> + <key>baseConfigurationReference</key> + <string>E4EB6923138AFD0F00A09F29</string> + <key>buildSettings</key> + <dict> + <key>HEADER_SEARCH_PATHS</key> + <array> + <string>$(OF_CORE_HEADERS)</string> + <string>../../../addons/ofxBeat/libs</string> + <string>../../../addons/ofxBeat/src</string> + </array> + <key>ARCHS</key> + <string>$(NATIVE_ARCH)</string> + <key>CONFIGURATION_BUILD_DIR</key> + <string>$(SRCROOT)/bin/</string> + <key>COPY_PHASE_STRIP</key> + <string>NO</string> + <key>DEAD_CODE_STRIPPING</key> + <string>YES</string> + <key>GCC_AUTO_VECTORIZATION</key> + <string>YES</string> + <key>GCC_ENABLE_SSE3_EXTENSIONS</key> + <string>YES</string> + <key>GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS</key> + <string>YES</string> + <key>GCC_INLINES_ARE_PRIVATE_EXTERN</key> + <string>NO</string> + <key>GCC_OPTIMIZATION_LEVEL</key> + <string>0</string> + <key>GCC_SYMBOLS_PRIVATE_EXTERN</key> + <string>NO</string> + <key>GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS</key> + <string>YES</string> + <key>GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO</key> + <string>NO</string> + <key>GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL</key> + <string>NO</string> + <key>GCC_WARN_UNINITIALIZED_AUTOS</key> + <string>NO</string> + <key>GCC_WARN_UNUSED_VALUE</key> + <string>NO</string> + <key>GCC_WARN_UNUSED_VARIABLE</key> + <string>NO</string> + <key>MACOSX_DEPLOYMENT_TARGET</key> + <string>10.6</string> + <key>OTHER_CPLUSPLUSFLAGS</key> + <array> + <string>-D__MACOSX_CORE__</string> + <string>-lpthread</string> + <string>-mtune=native</string> + </array> + <key>SDKROOT</key> + <string>macosx</string> + </dict> + <key>isa</key> + <string>XCBuildConfiguration</string> + <key>name</key> + <string>Debug</string> + </dict> + <key>E4B69B4F0A3A1720003C02F2</key> + <dict> + <key>baseConfigurationReference</key> + <string>E4EB6923138AFD0F00A09F29</string> + <key>buildSettings</key> + <dict> + <key>HEADER_SEARCH_PATHS</key> + <array> + <string>$(OF_CORE_HEADERS)</string> + <string>../../../addons/ofxBeat/libs</string> + <string>../../../addons/ofxBeat/src</string> + </array> + <key>ARCHS</key> + <string>$(NATIVE_ARCH)</string> + <key>CONFIGURATION_BUILD_DIR</key> + <string>$(SRCROOT)/bin/</string> + <key>COPY_PHASE_STRIP</key> + <string>YES</string> + <key>DEAD_CODE_STRIPPING</key> + <string>YES</string> + <key>GCC_AUTO_VECTORIZATION</key> + <string>YES</string> + <key>GCC_ENABLE_SSE3_EXTENSIONS</key> + <string>YES</string> + <key>GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS</key> + <string>YES</string> + <key>GCC_INLINES_ARE_PRIVATE_EXTERN</key> + <string>NO</string> + <key>GCC_OPTIMIZATION_LEVEL</key> + <string>3</string> + <key>GCC_SYMBOLS_PRIVATE_EXTERN</key> + <string>NO</string> + <key>GCC_UNROLL_LOOPS</key> + <string>YES</string> + <key>GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS</key> + <string>YES</string> + <key>GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO</key> + <string>NO</string> + <key>GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL</key> + <string>NO</string> + <key>GCC_WARN_UNINITIALIZED_AUTOS</key> + <string>NO</string> + <key>GCC_WARN_UNUSED_VALUE</key> + <string>NO</string> + <key>GCC_WARN_UNUSED_VARIABLE</key> + <string>NO</string> + <key>MACOSX_DEPLOYMENT_TARGET</key> + <string>10.6</string> + <key>OTHER_CPLUSPLUSFLAGS</key> + <array> + <string>-D__MACOSX_CORE__</string> + <string>-lpthread</string> + <string>-mtune=native</string> + </array> + <key>SDKROOT</key> + <string>macosx</string> + </dict> + <key>isa</key> + <string>XCBuildConfiguration</string> + <key>name</key> + <string>Release</string> + </dict> + <key>E4B69B580A3A1756003C02F2</key> + <dict> + <key>buildActionMask</key> + <string>2147483647</string> + <key>files</key> + <array> + <string>E4B69E200A3A1BDC003C02F2</string> + <string>E4B69E210A3A1BDC003C02F2</string> + <string>A86D7323CE1A9450906A91DD</string> + <string>C098DBE008A1B5C6D12ABFFD</string> + </array> + <key>isa</key> + <string>PBXSourcesBuildPhase</string> + <key>runOnlyForDeploymentPostprocessing</key> + <string>0</string> + </dict> + <key>E4B69B590A3A1756003C02F2</key> + <dict> + <key>buildActionMask</key> + <string>2147483647</string> + <key>files</key> + <array> + <string>E7F985F815E0DEA3003869B5</string> + <string>E7E077E815D3B6510020DFD4</string> + <string>E4EB6799138ADC1D00A09F29</string> + <string>E4328149138ABC9F0047C5CB</string> + <string>E45BE97B0E8CC7DD009D7055</string> + <string>E45BE97C0E8CC7DD009D7055</string> + <string>E45BE97D0E8CC7DD009D7055</string> + <string>E45BE97E0E8CC7DD009D7055</string> + <string>E45BE97F0E8CC7DD009D7055</string> + <string>E45BE9800E8CC7DD009D7055</string> + <string>E45BE9810E8CC7DD009D7055</string> + <string>E45BE9830E8CC7DD009D7055</string> + <string>E45BE9840E8CC7DD009D7055</string> + <string>E4C2424710CC5A17004149E2</string> + <string>E4C2424810CC5A17004149E2</string> + <string>E4C2424910CC5A17004149E2</string> + <string>E7E077E515D3B63C0020DFD4</string> + </array> + <key>isa</key> + <string>PBXFrameworksBuildPhase</string> + <key>runOnlyForDeploymentPostprocessing</key> + <string>0</string> + </dict> + <key>E4B69B5A0A3A1756003C02F2</key> + <dict> + <key>buildConfigurationList</key> + <string>E4B69B5F0A3A1757003C02F2</string> + <key>buildPhases</key> + <array> + <string>E4B69B580A3A1756003C02F2</string> + <string>E4B69B590A3A1756003C02F2</string> + <string>E4B6FFFD0C3F9AB9008CF71C</string> + <string>E4C2427710CC5ABF004149E2</string> + </array> + <key>buildRules</key> + <array /> + <key>dependencies</key> + <array> + <string>E4EEB9AC138B136A00A80321</string> + </array> + <key>isa</key> + <string>PBXNativeTarget</string> + <key>name</key> + <string>ofxBeatExample</string> + <key>productName</key> + <string>myOFApp</string> + <key>productReference</key> + <string>E4B69B5B0A3A1756003C02F2</string> + <key>productType</key> + <string>com.apple.product-type.application</string> + </dict> + <key>E4B69B5B0A3A1756003C02F2</key> + <dict> + <key>explicitFileType</key> + <string>wrapper.application</string> + <key>includeInIndex</key> + <string>0</string> + <key>isa</key> + <string>PBXFileReference</string> + <key>path</key> + <string>ofxBeatExampleDebug.app</string> + <key>sourceTree</key> + <string>BUILT_PRODUCTS_DIR</string> + </dict> + <key>E4B69B5F0A3A1757003C02F2</key> + <dict> + <key>buildConfigurations</key> + <array> + <string>E4B69B600A3A1757003C02F2</string> + <string>E4B69B610A3A1757003C02F2</string> + </array> + <key>defaultConfigurationIsVisible</key> + <string>0</string> + <key>defaultConfigurationName</key> + <string>Release</string> + <key>isa</key> + <string>XCConfigurationList</string> + </dict> + <key>E4B69B600A3A1757003C02F2</key> + <dict> + <key>buildSettings</key> + <dict> + <key>COMBINE_HIDPI_IMAGES</key> + <string>YES</string> + <key>COPY_PHASE_STRIP</key> + <string>NO</string> + <key>FRAMEWORK_SEARCH_PATHS</key> + <array> + <string>$(inherited)</string> + <string>$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)</string> + </array> + <key>FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1</key> + <string>"$(SRCROOT)/../../../libs/glut/lib/osx"</string> + <key>GCC_DYNAMIC_NO_PIC</key> + <string>NO</string> + <key>GCC_GENERATE_DEBUGGING_SYMBOLS</key> + <string>YES</string> + <key>GCC_MODEL_TUNING</key> + <string>NONE</string> + <key>ICON</key> + <string>$(ICON_NAME_DEBUG)</string> + <key>ICON_FILE</key> + <string>$(ICON_FILE_PATH)$(ICON)</string> + <key>INFOPLIST_FILE</key> + <string>openFrameworks-Info.plist</string> + <key>INSTALL_PATH</key> + <string>$(HOME)/Applications</string> + <key>LIBRARY_SEARCH_PATHS</key> + <array> + <string>$(inherited)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_16)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_17)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_18)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_19)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_20)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_21)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_22)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_23)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_24)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_25)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_26)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_27)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_28)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_29)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_30)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_31)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_32)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_33)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_34)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_35)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_36)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_37)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_38)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_39)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_40)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_41)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_42)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_43)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_44)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_45)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_46)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_47)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_48)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_49)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_50)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_51)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_52)</string> + </array> + <key>PRODUCT_NAME</key> + <string>$(TARGET_NAME)Debug</string> + <key>WRAPPER_EXTENSION</key> + <string>app</string> + </dict> + <key>isa</key> + <string>XCBuildConfiguration</string> + <key>name</key> + <string>Debug</string> + </dict> + <key>E4B69B610A3A1757003C02F2</key> + <dict> + <key>buildSettings</key> + <dict> + <key>COMBINE_HIDPI_IMAGES</key> + <string>YES</string> + <key>COPY_PHASE_STRIP</key> + <string>YES</string> + <key>FRAMEWORK_SEARCH_PATHS</key> + <array> + <string>$(inherited)</string> + <string>$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)</string> + </array> + <key>FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1</key> + <string>"$(SRCROOT)/../../../libs/glut/lib/osx"</string> + <key>GCC_GENERATE_DEBUGGING_SYMBOLS</key> + <string>YES</string> + <key>GCC_MODEL_TUNING</key> + <string>NONE</string> + <key>ICON</key> + <string>$(ICON_NAME_RELEASE)</string> + <key>ICON_FILE</key> + <string>$(ICON_FILE_PATH)$(ICON)</string> + <key>INFOPLIST_FILE</key> + <string>openFrameworks-Info.plist</string> + <key>INSTALL_PATH</key> + <string>$(HOME)/Applications</string> + <key>LIBRARY_SEARCH_PATHS</key> + <array> + <string>$(inherited)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_4)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_5)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_6)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_14)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_15)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_1)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_7)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_8)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_9)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_10)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_11)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_12)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_13)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_16)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_17)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_18)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_19)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_20)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_21)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_22)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_23)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_24)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_25)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_26)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_27)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_28)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_29)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_30)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_31)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_32)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_33)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_34)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_35)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_36)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_37)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_38)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_39)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_40)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_41)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_42)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_43)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_44)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_45)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_46)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_47)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_48)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_49)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_50)</string> + <string>$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_51)</string> + </array> + <key>PRODUCT_NAME</key> + <string>$(TARGET_NAME)</string> + <key>WRAPPER_EXTENSION</key> + <string>app</string> + </dict> + <key>isa</key> + <string>XCBuildConfiguration</string> + <key>name</key> + <string>Release</string> + </dict> + <key>E4B69E1C0A3A1BDC003C02F2</key> + <dict> + <key>children</key> + <array> + <string>E4B69E1D0A3A1BDC003C02F2</string> + <string>E4B69E1E0A3A1BDC003C02F2</string> + <string>E4B69E1F0A3A1BDC003C02F2</string> + </array> + <key>isa</key> + <string>PBXGroup</string> + <key>path</key> + <string>src</string> + <key>sourceTree</key> + <string>SOURCE_ROOT</string> + </dict> + <key>E4B69E1D0A3A1BDC003C02F2</key> + <dict> + <key>fileEncoding</key> + <string>30</string> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>sourcecode.cpp.cpp</string> + <key>name</key> + <string>main.cpp</string> + <key>path</key> + <string>src/main.cpp</string> + <key>sourceTree</key> + <string>SOURCE_ROOT</string> + </dict> + <key>E4B69E1E0A3A1BDC003C02F2</key> + <dict> + <key>explicitFileType</key> + <string>sourcecode.cpp.cpp</string> + <key>fileEncoding</key> + <string>30</string> + <key>isa</key> + <string>PBXFileReference</string> + <key>name</key> + <string>testApp.cpp</string> + <key>path</key> + <string>src/testApp.cpp</string> + <key>sourceTree</key> + <string>SOURCE_ROOT</string> + </dict> + <key>E4B69E1F0A3A1BDC003C02F2</key> + <dict> + <key>fileEncoding</key> + <string>30</string> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>sourcecode.c.h</string> + <key>name</key> + <string>testApp.h</string> + <key>path</key> + <string>src/testApp.h</string> + <key>sourceTree</key> + <string>SOURCE_ROOT</string> + </dict> + <key>E4B69E200A3A1BDC003C02F2</key> + <dict> + <key>fileRef</key> + <string>E4B69E1D0A3A1BDC003C02F2</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E4B69E210A3A1BDC003C02F2</key> + <dict> + <key>fileRef</key> + <string>E4B69E1E0A3A1BDC003C02F2</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E4B6FCAD0C3E899E008CF71C</key> + <dict> + <key>fileEncoding</key> + <string>30</string> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>text.plist.xml</string> + <key>path</key> + <string>openFrameworks-Info.plist</string> + <key>sourceTree</key> + <string><group></string> + </dict> + <key>E4B6FFFD0C3F9AB9008CF71C</key> + <dict> + <key>buildActionMask</key> + <string>2147483647</string> + <key>files</key> + <array /> + <key>inputPaths</key> + <array /> + <key>isa</key> + <string>PBXShellScriptBuildPhase</string> + <key>outputPaths</key> + <array /> + <key>runOnlyForDeploymentPostprocessing</key> + <string>0</string> + <key>shellPath</key> + <string>/bin/sh</string> + <key>shellScript</key> + <string>cp -f ../../../libs/fmodex/lib/osx/libfmodex.dylib "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/libfmodex.dylib"; install_name_tool -change ./libfmodex.dylib @executable_path/libfmodex.dylib "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME"; +mkdir -p "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Resources/" +cp -f "$ICON_FILE" "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Resources/" +</string> + </dict> + <key>E4C2424410CC5A17004149E2</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>AppKit.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/AppKit.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E4C2424510CC5A17004149E2</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>Cocoa.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/Cocoa.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E4C2424610CC5A17004149E2</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>IOKit.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/IOKit.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E4C2424710CC5A17004149E2</key> + <dict> + <key>fileRef</key> + <string>E4C2424410CC5A17004149E2</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E4C2424810CC5A17004149E2</key> + <dict> + <key>fileRef</key> + <string>E4C2424510CC5A17004149E2</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E4C2424910CC5A17004149E2</key> + <dict> + <key>fileRef</key> + <string>E4C2424610CC5A17004149E2</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E4C2427710CC5ABF004149E2</key> + <dict> + <key>buildActionMask</key> + <string>2147483647</string> + <key>dstPath</key> + <string /> + <key>dstSubfolderSpec</key> + <string>10</string> + <key>files</key> + <array> + <string>BBAB23CB13894F3D00AA2426</string> + </array> + <key>isa</key> + <string>PBXCopyFilesBuildPhase</string> + <key>runOnlyForDeploymentPostprocessing</key> + <string>0</string> + </dict> + <key>E4EB6799138ADC1D00A09F29</key> + <dict> + <key>fileRef</key> + <string>BBAB23BE13894E4700AA2426</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E4EB691F138AFCF100A09F29</key> + <dict> + <key>fileEncoding</key> + <string>4</string> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>text.xcconfig</string> + <key>name</key> + <string>CoreOF.xcconfig</string> + <key>path</key> + <string>../../../libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig</string> + <key>sourceTree</key> + <string>SOURCE_ROOT</string> + </dict> + <key>E4EB6923138AFD0F00A09F29</key> + <dict> + <key>fileEncoding</key> + <string>4</string> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>text.xcconfig</string> + <key>path</key> + <string>Project.xcconfig</string> + <key>sourceTree</key> + <string><group></string> + </dict> + <key>E4EEB9AB138B136A00A80321</key> + <dict> + <key>containerPortal</key> + <string>E4328143138ABC890047C5CB</string> + <key>isa</key> + <string>PBXContainerItemProxy</string> + <key>proxyType</key> + <string>1</string> + <key>remoteGlobalIDString</key> + <string>E4B27C1410CBEB8E00536013</string> + <key>remoteInfo</key> + <string>openFrameworks</string> + </dict> + <key>E4EEB9AC138B136A00A80321</key> + <dict> + <key>isa</key> + <string>PBXTargetDependency</string> + <key>name</key> + <string>openFrameworks</string> + <key>targetProxy</key> + <string>E4EEB9AB138B136A00A80321</string> + </dict> + <key>E4EEC9E9138DF44700A80321</key> + <dict> + <key>children</key> + <array> + <string>E4EB691F138AFCF100A09F29</string> + <string>E4328143138ABC890047C5CB</string> + </array> + <key>isa</key> + <string>PBXGroup</string> + <key>name</key> + <string>openFrameworks</string> + <key>sourceTree</key> + <string><group></string> + </dict> + <key>E7E077E415D3B63C0020DFD4</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>CoreVideo.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/CoreVideo.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E7E077E515D3B63C0020DFD4</key> + <dict> + <key>fileRef</key> + <string>E7E077E415D3B63C0020DFD4</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E7E077E715D3B6510020DFD4</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>QTKit.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/QTKit.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E7E077E815D3B6510020DFD4</key> + <dict> + <key>fileRef</key> + <string>E7E077E715D3B6510020DFD4</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + <key>E7F985F515E0DE99003869B5</key> + <dict> + <key>isa</key> + <string>PBXFileReference</string> + <key>lastKnownFileType</key> + <string>wrapper.framework</string> + <key>name</key> + <string>Accelerate.framework</string> + <key>path</key> + <string>/System/Library/Frameworks/Accelerate.framework</string> + <key>sourceTree</key> + <string><absolute></string> + </dict> + <key>E7F985F815E0DEA3003869B5</key> + <dict> + <key>fileRef</key> + <string>E7F985F515E0DE99003869B5</string> + <key>isa</key> + <string>PBXBuildFile</string> + </dict> + </dict> + <key>rootObject</key> + <string>E4B69B4C0A3A1720003C02F2</string> + </dict> +</plist> diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ecb5a60 --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Workspace + version = "1.0"> + <FileRef + location = "self:ofxBeatExample.xcodeproj"> + </FileRef> +</Workspace> diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/project.xcworkspace/xcuserdata/darren.xcuserdatad/UserInterfaceState.xcuserstate b/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/project.xcworkspace/xcuserdata/darren.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..c6d21ad6d85cd63d842cc1d8b6fa2dc221f592e9 GIT binary patch literal 55055 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 PUxyt2zdQav?dX32Hk6=* literal 0 HcmV?d00001 diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/xcshareddata/xcschemes/ofxBeatExample Debug.xcscheme b/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/xcshareddata/xcschemes/ofxBeatExample Debug.xcscheme new file mode 100644 index 0000000..b6f5120 --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/xcshareddata/xcschemes/ofxBeatExample Debug.xcscheme @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "0460" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2" + BuildableName = "ofxBeatExample.app" + BlueprintName = "ofxBeatExample" + ReferencedContainer = "container:ofxBeatExample.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> + <Testables> + </Testables> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2" + BuildableName = "ofxBeatExample.app" + BlueprintName = "ofxBeatExample" + ReferencedContainer = "container:ofxBeatExample.xcodeproj"> + </BuildableReference> + </MacroExpansion> + </TestAction> + <LaunchAction + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + buildConfiguration = "Debug" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "YES" + allowLocationSimulation = "YES"> + <BuildableProductRunnable> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2" + BuildableName = "ofxBeatExample.app" + BlueprintName = "ofxBeatExample" + ReferencedContainer = "container:ofxBeatExample.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + <AdditionalOptions> + </AdditionalOptions> + </LaunchAction> + <ProfileAction + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + buildConfiguration = "Debug" + debugDocumentVersioning = "YES"> + <BuildableProductRunnable> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2" + BuildableName = "ofxBeatExample.app" + BlueprintName = "ofxBeatExample" + ReferencedContainer = "container:ofxBeatExample.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Debug" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/xcshareddata/xcschemes/ofxBeatExample Release.xcscheme b/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/xcshareddata/xcschemes/ofxBeatExample Release.xcscheme new file mode 100644 index 0000000..80ec586 --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/xcshareddata/xcschemes/ofxBeatExample Release.xcscheme @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "0460" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2" + BuildableName = "ofxBeatExample.app" + BlueprintName = "ofxBeatExample" + ReferencedContainer = "container:ofxBeatExample.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB" + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Release"> + <Testables> + </Testables> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2" + BuildableName = "ofxBeatExample.app" + BlueprintName = "ofxBeatExample" + ReferencedContainer = "container:ofxBeatExample.xcodeproj"> + </BuildableReference> + </MacroExpansion> + </TestAction> + <LaunchAction + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + buildConfiguration = "Release" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "YES" + allowLocationSimulation = "YES"> + <BuildableProductRunnable> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2" + BuildableName = "ofxBeatExample.app" + BlueprintName = "ofxBeatExample" + ReferencedContainer = "container:ofxBeatExample.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + <AdditionalOptions> + </AdditionalOptions> + </LaunchAction> + <ProfileAction + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + buildConfiguration = "Release" + debugDocumentVersioning = "YES"> + <BuildableProductRunnable> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "E4B69B5A0A3A1756003C02F2" + BuildableName = "ofxBeatExample.app" + BlueprintName = "ofxBeatExample" + ReferencedContainer = "container:ofxBeatExample.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Release"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/xcuserdata/darren.xcuserdatad/xcschemes/xcschememanagement.plist b/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/xcuserdata/darren.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..13dfb6e --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/ofxBeatExample.xcodeproj/xcuserdata/darren.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>SuppressBuildableAutocreation</key> + <dict> + <key>E4B69B5A0A3A1756003C02F2</key> + <dict> + <key>primary</key> + <true/> + </dict> + </dict> +</dict> +</plist> diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/openFrameworks-Info.plist b/Final_Version/ofxBeat-master/ofxBeatExample/openFrameworks-Info.plist new file mode 100644 index 0000000..edb46d2 --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/openFrameworks-Info.plist @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIdentifier</key> + <string>com.yourcompany.openFrameworks</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1.0</string> + <key>CFBundleIconFile</key> + <string>${ICON}</string> +</dict> +</plist> diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/src/main.cpp b/Final_Version/ofxBeat-master/ofxBeatExample/src/main.cpp new file mode 100644 index 0000000..a7d241d --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/src/main.cpp @@ -0,0 +1,13 @@ +#include "ofMain.h" +#include "testApp.h" + +//======================================================================== +int main( ){ + ofSetupOpenGL(1024,768,OF_WINDOW); // <-------- setup the GL context + + // this kicks off the running of my app + // can be OF_WINDOW or OF_FULLSCREEN + // pass in width and height too: + ofRunApp(new testApp()); + +} diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/src/testApp.cpp b/Final_Version/ofxBeat-master/ofxBeatExample/src/testApp.cpp new file mode 100644 index 0000000..e7283cf --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/src/testApp.cpp @@ -0,0 +1,67 @@ +#include "testApp.h" + +//-------------------------------------------------------------- +void testApp::setup(){ + ofSoundStreamSetup(0, 1, this, 44100, beat.getBufferSize(), 4); +} + +//-------------------------------------------------------------- +void testApp::update(){ + beat.update(ofGetElapsedTimeMillis()); +} + +//-------------------------------------------------------------- +void testApp::draw(){ + cout << beat.kick() << "," << beat.snare() << "," << beat.hihat() << endl; +} + + +void testApp::audioReceived(float* input, int bufferSize, int nChannels) { + beat.audioReceived(input, bufferSize, nChannels); +} + + +//-------------------------------------------------------------- +void testApp::keyPressed(int key){ + +} + +//-------------------------------------------------------------- +void testApp::keyReleased(int key){ + +} + +//-------------------------------------------------------------- +void testApp::mouseMoved(int x, int y ){ + +} + +//-------------------------------------------------------------- +void testApp::mouseDragged(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void testApp::mousePressed(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void testApp::mouseReleased(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void testApp::windowResized(int w, int h){ + +} + +//-------------------------------------------------------------- +void testApp::gotMessage(ofMessage msg){ + +} + +//-------------------------------------------------------------- +void testApp::dragEvent(ofDragInfo dragInfo){ + +} diff --git a/Final_Version/ofxBeat-master/ofxBeatExample/src/testApp.h b/Final_Version/ofxBeat-master/ofxBeatExample/src/testApp.h new file mode 100644 index 0000000..bfaf141 --- /dev/null +++ b/Final_Version/ofxBeat-master/ofxBeatExample/src/testApp.h @@ -0,0 +1,26 @@ +#pragma once + +#include "ofMain.h" +#include "ofxBeat.h" + +class testApp : public ofBaseApp{ + ofxBeat beat; + + public: + void setup(); + void update(); + void draw(); + + void keyPressed(int key); + void keyReleased(int key); + void mouseMoved(int x, int y ); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void windowResized(int w, int h); + void dragEvent(ofDragInfo dragInfo); + void gotMessage(ofMessage msg); + + void audioReceived(float*, int, int); + +}; diff --git a/Final_Version/ofxBeat-master/src/fft.cpp b/Final_Version/ofxBeat-master/src/fft.cpp new file mode 100644 index 0000000..f7db58c --- /dev/null +++ b/Final_Version/ofxBeat-master/src/fft.cpp @@ -0,0 +1,480 @@ +/********************************************************************** + + fft.cpp + + + This class is a C++ wrapper for original code + written by Dominic Mazzoni in September 2000 + + This file contains a few FFT routines, including a real-FFT + routine that is almost twice as fast as a normal complex FFT, + and a power spectrum routine which is more convenient when + you know you don't care about phase information. It now also + contains a few basic windowing functions. + + Some of this code was based on a free implementation of an FFT + by Don Cross, available on the web at: + + http://www.intersrv.com/~dcross/fft.html + + The basic algorithm for his code was based on Numerical Recipes + in Fortran. I optimized his code further by reducing array + accesses, caching the bit reversal table, and eliminating + float-to-double conversions, and I added the routines to + calculate a real FFT and a real power spectrum. + + Note: all of these routines use single-precision floats. + I have found that in practice, floats work well until you + get above 8192 samples. If you need to do a larger FFT, + you need to use doubles. + +**********************************************************************/ + +#include "fft.h" +#include <stdlib.h> +#include <stdio.h> +#include <math.h> + +int **gFFTBitTable = NULL; +const int MaxFastBits = 16; + +int IsPowerOfTwo(int x) +{ + if (x < 2) + return false; + + if (x & (x - 1)) /* Thanks to 'byang' for this cute trick! */ + return false; + + return true; +} + +int NumberOfBitsNeeded(int PowerOfTwo) +{ + int i; + + if (PowerOfTwo < 2) { + fprintf(stderr, "Error: FFT called with size %d\n", PowerOfTwo); + exit(1); + } + + for (i = 0;; i++) + if (PowerOfTwo & (1 << i)) + return i; +} + +int ReverseBits(int index, int NumBits) +{ + int i, rev; + + for (i = rev = 0; i < NumBits; i++) { + rev = (rev << 1) | (index & 1); + index >>= 1; + } + + return rev; +} + +void InitFFT() +{ + gFFTBitTable = new int *[MaxFastBits]; + + int len = 2; + for (int b = 1; b <= MaxFastBits; b++) { + + gFFTBitTable[b - 1] = new int[len]; + + for (int i = 0; i < len; i++) + gFFTBitTable[b - 1][i] = ReverseBits(i, b); + + len <<= 1; + } +} + +inline int FastReverseBits(int i, int NumBits) +{ + if (NumBits <= MaxFastBits) + return gFFTBitTable[NumBits - 1][i]; + else + return ReverseBits(i, NumBits); +} + +/* + * Complex Fast Fourier Transform + */ + +void FFT(int NumSamples, + bool InverseTransform, + float *RealIn, float *ImagIn, float *RealOut, float *ImagOut) +{ + int NumBits; /* Number of bits needed to store indices */ + int i, j, k, n; + int BlockSize, BlockEnd; + + double angle_numerator = 2.0 * M_PI; + float tr, ti; /* temp real, temp imaginary */ + + if (!IsPowerOfTwo(NumSamples)) { + fprintf(stderr, "%d is not a power of two\n", NumSamples); + exit(1); + } + + if (!gFFTBitTable) + InitFFT(); + + if (InverseTransform) + angle_numerator = -angle_numerator; + + NumBits = NumberOfBitsNeeded(NumSamples); + + /* + ** Do simultaneous data copy and bit-reversal ordering into outputs... + */ + + for (i = 0; i < NumSamples; i++) { + j = FastReverseBits(i, NumBits); + RealOut[j] = RealIn[i]; + ImagOut[j] = (ImagIn == NULL) ? 0.0 : ImagIn[i]; + } + + /* + ** Do the FFT itself... + */ + + BlockEnd = 1; + for (BlockSize = 2; BlockSize <= NumSamples; BlockSize <<= 1) { + + double delta_angle = angle_numerator / (double) BlockSize; + + float sm2 = sin(-2 * delta_angle); + float sm1 = sin(-delta_angle); + float cm2 = cos(-2 * delta_angle); + float cm1 = cos(-delta_angle); + float w = 2 * cm1; + float ar0, ar1, ar2, ai0, ai1, ai2; + + for (i = 0; i < NumSamples; i += BlockSize) { + ar2 = cm2; + ar1 = cm1; + + ai2 = sm2; + ai1 = sm1; + + for (j = i, n = 0; n < BlockEnd; j++, n++) { + ar0 = w * ar1 - ar2; + ar2 = ar1; + ar1 = ar0; + + ai0 = w * ai1 - ai2; + ai2 = ai1; + ai1 = ai0; + + k = j + BlockEnd; + tr = ar0 * RealOut[k] - ai0 * ImagOut[k]; + ti = ar0 * ImagOut[k] + ai0 * RealOut[k]; + + RealOut[k] = RealOut[j] - tr; + ImagOut[k] = ImagOut[j] - ti; + + RealOut[j] += tr; + ImagOut[j] += ti; + } + } + + BlockEnd = BlockSize; + } + + /* + ** Need to normalize if inverse transform... + */ + + if (InverseTransform) { + float denom = (float) NumSamples; + + for (i = 0; i < NumSamples; i++) { + RealOut[i] /= denom; + ImagOut[i] /= denom; + } + } +} + +/* + * Real Fast Fourier Transform + * + * This function was based on the code in Numerical Recipes in C. + * In Num. Rec., the inner loop is based on a single 1-based array + * of interleaved real and imaginary numbers. Because we have two + * separate zero-based arrays, our indices are quite different. + * Here is the correspondence between Num. Rec. indices and our indices: + * + * i1 <-> real[i] + * i2 <-> imag[i] + * i3 <-> real[n/2-i] + * i4 <-> imag[n/2-i] + */ + +void RealFFT(int NumSamples, float *RealIn, float *RealOut, float *ImagOut) +{ + int Half = NumSamples / 2; + int i; + + float theta = M_PI / Half; + + float *tmpReal = new float[Half]; + float *tmpImag = new float[Half]; + + for (i = 0; i < Half; i++) { + tmpReal[i] = RealIn[2 * i]; + tmpImag[i] = RealIn[2 * i + 1]; + } + + FFT(Half, 0, tmpReal, tmpImag, RealOut, ImagOut); + + float wtemp = float (sin(0.5 * theta)); + + float wpr = -2.0 * wtemp * wtemp; + float wpi = float (sin(theta)); + float wr = 1.0 + wpr; + float wi = wpi; + + int i3; + + float h1r, h1i, h2r, h2i; + + for (i = 1; i < Half / 2; i++) { + + i3 = Half - i; + + h1r = 0.5 * (RealOut[i] + RealOut[i3]); + h1i = 0.5 * (ImagOut[i] - ImagOut[i3]); + h2r = 0.5 * (ImagOut[i] + ImagOut[i3]); + h2i = -0.5 * (RealOut[i] - RealOut[i3]); + + RealOut[i] = h1r + wr * h2r - wi * h2i; + ImagOut[i] = h1i + wr * h2i + wi * h2r; + RealOut[i3] = h1r - wr * h2r + wi * h2i; + ImagOut[i3] = -h1i + wr * h2i + wi * h2r; + + wr = (wtemp = wr) * wpr - wi * wpi + wr; + wi = wi * wpr + wtemp * wpi + wi; + } + + RealOut[0] = (h1r = RealOut[0]) + ImagOut[0]; + ImagOut[0] = h1r - ImagOut[0]; + + delete[]tmpReal; + delete[]tmpImag; +} + +/* + * PowerSpectrum + * + * This function computes the same as RealFFT, above, but + * adds the squares of the real and imaginary part of each + * coefficient, extracting the power and throwing away the + * phase. + * + * For speed, it does not call RealFFT, but duplicates some + * of its code. + */ + +void PowerSpectrum(int NumSamples, float *In, float *Out) +{ + int Half = NumSamples / 2; + int i; + + float theta = M_PI / Half; + + float *tmpReal = new float[Half]; + float *tmpImag = new float[Half]; + float *RealOut = new float[Half]; + float *ImagOut = new float[Half]; + + for (i = 0; i < Half; i++) { + tmpReal[i] = In[2 * i]; + tmpImag[i] = In[2 * i + 1]; + } + + FFT(Half, 0, tmpReal, tmpImag, RealOut, ImagOut); + + float wtemp = float (sin(0.5 * theta)); + + float wpr = -2.0 * wtemp * wtemp; + float wpi = float (sin(theta)); + float wr = 1.0 + wpr; + float wi = wpi; + + int i3; + + float h1r, h1i, h2r, h2i, rt, it; + //float total=0; + + for (i = 1; i < Half / 2; i++) { + + i3 = Half - i; + + h1r = 0.5 * (RealOut[i] + RealOut[i3]); + h1i = 0.5 * (ImagOut[i] - ImagOut[i3]); + h2r = 0.5 * (ImagOut[i] + ImagOut[i3]); + h2i = -0.5 * (RealOut[i] - RealOut[i3]); + + rt = h1r + wr * h2r - wi * h2i; //printf("Realout%i = %f",i,rt);total+=fabs(rt); + it = h1i + wr * h2i + wi * h2r; // printf(" Imageout%i = %f\n",i,it); + + Out[i] = rt * rt + it * it; + + rt = h1r - wr * h2r + wi * h2i; + it = -h1i + wr * h2i + wi * h2r; + + Out[i3] = rt * rt + it * it; + + wr = (wtemp = wr) * wpr - wi * wpi + wr; + wi = wi * wpr + wtemp * wpi + wi; + } + //printf("total = %f\n",total); + rt = (h1r = RealOut[0]) + ImagOut[0]; + it = h1r - ImagOut[0]; + Out[0] = rt * rt + it * it; + + rt = RealOut[Half / 2]; + it = ImagOut[Half / 2]; + Out[Half / 2] = rt * rt + it * it; + + delete[]tmpReal; + delete[]tmpImag; + delete[]RealOut; + delete[]ImagOut; +} + +/* + * Windowing Functions + */ + +int NumWindowFuncs() +{ + return 4; +} + +char *WindowFuncName(int whichFunction) +{ + switch (whichFunction) { + default: + case 0: + return (char *)"Rectangular"; + case 1: + return (char *)"Bartlett"; + case 2: + return (char *)"Hamming"; + case 3: + return (char *)"Hanning"; + } +} + +void WindowFunc(int whichFunction, int NumSamples, float *in) +{ + int i; + + if (whichFunction == 1) { + // Bartlett (triangular) window + for (i = 0; i < NumSamples / 2; i++) { + in[i] *= (i / (float) (NumSamples / 2)); + in[i + (NumSamples / 2)] *= + (1.0 - (i / (float) (NumSamples / 2))); + } + } + + if (whichFunction == 2) { + // Hamming + for (i = 0; i < NumSamples; i++) + in[i] *= 0.54 - 0.46 * cos(2 * M_PI * i / (NumSamples - 1)); + } + + if (whichFunction == 3) { + // Hanning + for (i = 0; i < NumSamples; i++) + in[i] *= 0.50 - 0.50 * cos(2 * M_PI * i / (NumSamples - 1)); + } +} + +/* constructor */ +fft::fft() { + + +} + +/* destructor */ +fft::~fft() { + + +} + +/* Calculate the power spectrum */ +void fft::powerSpectrum(int start, int half, float *data, int windowSize,float *magnitude,float *phase, float *power, float *avg_power) { + int i; + int windowFunc = 3; + float total_power = 0.0f; + + /* processing variables*/ + float *in_real = new float[windowSize]; + float *in_img = new float[windowSize]; + float *out_real = new float[windowSize]; + float *out_img = new float[windowSize]; + + for (i = 0; i < windowSize; i++) { + in_real[i] = data[start + i]; + } + + WindowFunc(windowFunc, windowSize, in_real); + RealFFT(windowSize, in_real, out_real, out_img); + + for (i = 0; i < half; i++) { + /* compute power */ + power[i] = out_real[i]*out_real[i] + out_img[i]*out_img[i]; + total_power += power[i]; + /* compute magnitude and phase */ + magnitude[i] = 2.0*sqrt(power[i]); + phase[i] = atan2(out_img[i],out_real[i]); + } + /* calculate average power */ + *(avg_power) = total_power / (float) half; + + delete[]in_real; + delete[]in_img; + delete[]out_real; + delete[]out_img; +} + +void fft::inversePowerSpectrum(int start, int half, int windowSize, float *finalOut,float *magnitude,float *phase) { + int i; + int windowFunc = 3; + + /* processing variables*/ + float *in_real = new float[windowSize]; + float *in_img = new float[windowSize]; + float *out_real = new float[windowSize]; + float *out_img = new float[windowSize]; + + /* get real and imag part */ + for (i = 0; i < half; i++) { + in_real[i] = magnitude[i]*cos(phase[i]); + in_img[i] = magnitude[i]*sin(phase[i]); + } + + /* zero negative frequencies */ + for (i = half; i < windowSize; i++) { + in_real[i] = 0.0; + in_img[i] = 0.0; + } + + FFT(windowSize, 1, in_real, in_img, out_real, out_img); // second parameter indicates inverse transform + WindowFunc(windowFunc, windowSize, out_real); + + for (i = 0; i < windowSize; i++) { + finalOut[start + i] += out_real[i]; + } + + delete[]in_real; + delete[]in_img; + delete[]out_real; + delete[]out_img; +} diff --git a/Final_Version/ofxBeat-master/src/fft.h b/Final_Version/ofxBeat-master/src/fft.h new file mode 100644 index 0000000..7ff7e5d --- /dev/null +++ b/Final_Version/ofxBeat-master/src/fft.h @@ -0,0 +1,26 @@ + +#ifndef _FFT +#define _FFT + +#ifndef M_PI +#define M_PI 3.14159265358979323846 /* pi */ +#endif + + +class fft { + + public: + + fft(); + ~fft(); + + /* Calculate the power spectrum */ + void powerSpectrum(int start, int half, float *data, int windowSize,float *magnitude,float *phase, float *power, float *avg_power); + /* ... the inverse */ + void inversePowerSpectrum(int start, int half, int windowSize, float *finalOut,float *magnitude,float *phase); + + +}; + + +#endif diff --git a/Final_Version/ofxBeat-master/src/ofxBeat.cpp b/Final_Version/ofxBeat-master/src/ofxBeat.cpp new file mode 100644 index 0000000..8206f27 --- /dev/null +++ b/Final_Version/ofxBeat-master/src/ofxBeat.cpp @@ -0,0 +1,205 @@ +// +// ofxBeat.cpp +// Cyril +// +// Created by Darren Mothersele on 20/11/2013. +// +// + +#include "ofxBeat.h" + +ofxBeat::ofxBeat() : buffer_size(1024), fft_size(512) { + bandTimes[KICK_BAND] = 0; + bandTimes[SNARE_BAND] = 0; + bandTimes[HIHAT_BAND] = 0; + beatSizes[KICK_BAND] = 0; + beatSizes[SNARE_BAND] = 0; + beatSizes[HIHAT_BAND] = 0; + + int fft_size=512; + int buffer_size = 1024; + for(int i = 0; i < fft_size; i++) + fftSmoothed[i] = 0; + + for(int i = 0; i < FFT_SUBBANDS; i++) + { + for(int l = 0; l < ENERGY_HISTORY; l++){ + energyHistory[i][l] = 0; + } + fftSubbands[i] = 0; + averageEnergy[i] = 0; + fftVariance[i] = 0; + beatValueArray[i] = 0; + } + + audio_input = new float[buffer_size]; + magnitude = new float[fft_size]; + phase = new float[fft_size]; + power = new float[fft_size]; + magnitude_average = new float[fft_size]; + magnitude_average_snapshot = new float[fft_size]; + + for (int i = 0; i < fft_size; i++) { + magnitude[i] = 0; + phase[i] = 0; + power[i] = 0; + magnitude_average_snapshot[i] = 0; + magnitude_average[i] = 0; + } + + historyPos = 0; + fftInit = true; + beatValue = 1.08; + enableBeatDetect(); +} + + +void ofxBeat::updateFFT() { + if(fftInit) { + in_fft = magnitude; + for (int i = 0; i < fft_size; i++) { + if (fftSmoothed[i] < in_fft[i]) { + fftSmoothed[i] = in_fft[i]; + } + fftSmoothed[i] *= .91f; + } + + if(bDetectBeat) { + for(int i = 0; i < FFT_SUBBANDS; i++) { + fftSubbands[i] = 0; + + for(int b = 0; b < fft_size/FFT_SUBBANDS; b++) { + fftSubbands[i] += in_fft[i*(fft_size/FFT_SUBBANDS)+b]; + } + fftSubbands[i] = fftSubbands[i]*(float)FFT_SUBBANDS/(float)fft_size; + + for(int b=0; b < fft_size/FFT_SUBBANDS; b++) { + fftVariance[i] += pow(in_fft[i*(fft_size/FFT_SUBBANDS)+b] - fftSubbands[i], 2); + } + fftVariance[i] = fftVariance[i]*(float)FFT_SUBBANDS/(float)fft_size; + + + beatValueArray[i] = (-0.0025714*fftVariance[i])+1.35; + } + + + for(int i = 0; i < FFT_SUBBANDS; i++) { + averageEnergy[i] = 0; + for(int h = 0; h < ENERGY_HISTORY; h++) { + + averageEnergy[i] += energyHistory[i][h]; + } + + averageEnergy[i] /= ENERGY_HISTORY; + } + + + for(int i = 0; i < FFT_SUBBANDS; i++) { + + energyHistory[i][historyPos] = fftSubbands[i]; + } + + historyPos = (historyPos+1) % ENERGY_HISTORY; + + } + } +} + + +float ofxBeat::getMagnitude() { + return * magnitude; +} +float ofxBeat::getBand(int i) { + return fftSubbands[i]; +} + +float ofxBeat::kick() { + return beats[KICK_BAND]; +} +float ofxBeat::snare() { + return beats[SNARE_BAND]; +} +float ofxBeat::hihat() { + return beats[HIHAT_BAND]; +} + +void ofxBeat::updateBand(bool a, int b, int t) { + if (a) { + beats[b] = 1; + beatSizes[b] = t - bandTimes[b]; + bandTimes[b] = t; + } + else { + int span = t - bandTimes[b]; + if (span < beatSizes[b] && beatSizes[b] > 0) { + beats[b] = ofMap(span, 0, beatSizes[b], 1, 0); + } + else { + beats[b] = 0; + } + } +} + +int ofxBeat::getBufferSize() { + return buffer_size; +} + +void ofxBeat::update(int _t) { + updateFFT(); + updateBand(isKick(), KICK_BAND, _t); + updateBand(isSnare(), SNARE_BAND, _t); + updateBand(isHat(), HIHAT_BAND, _t); +} + +void ofxBeat::audioReceived(float* input, int bufferSize, int nChannels) { + memcpy(audio_input, input, sizeof(float) * bufferSize); + float avg_power = 0.0f; + myfft.powerSpectrum(0, (int)fft_size, audio_input, buffer_size, magnitude, phase, power, &avg_power); + + for (int i = 0; i < fft_size; i++) { + magnitude[i] = powf(magnitude[i], 0.5); + } + + for (int i = 0; i < fft_size; i++) { + float x = 0.085; + magnitude_average[i] = (magnitude[i] * x) + (magnitude_average[i] * (1 - x)); + } +} + +bool ofxBeat::isBeat(int subband) +{ + return fftSubbands[subband] > averageEnergy[subband]*beatValueArray[subband]; +} + +bool ofxBeat::isKick() +{ + return isBeat(0); +} + +bool ofxBeat::isSnare() +{ + int low = 1; + int hi = FFT_SUBBANDS/3; + int thresh = (hi-low)/3; + return isBeatRange(low, hi, thresh); +} + +bool ofxBeat::isHat() +{ + int low = FFT_SUBBANDS/2; + int hi = FFT_SUBBANDS-1; + int thresh = (hi-low)/3; + return isBeatRange(low, hi, thresh); +} + +bool ofxBeat::isBeatRange(int low, int high, int threshold) +{ + int num = 0; + for(int i = low; i < high+1; i++) { + if(isBeat(i)) { + num++; + } + } + return num > threshold; +} + diff --git a/Final_Version/ofxBeat-master/src/ofxBeat.h b/Final_Version/ofxBeat-master/src/ofxBeat.h new file mode 100644 index 0000000..ca5f7d8 --- /dev/null +++ b/Final_Version/ofxBeat-master/src/ofxBeat.h @@ -0,0 +1,79 @@ +// +// ofxBeat.h +// Cyril +// +// Created by Darren Mothersele on 20/11/2013. +// +// + +#ifndef __Cyril__ofxBeat__ +#define __Cyril__ofxBeat__ + +#include "ofMain.h" +#include "fft.h" + +#define FFT_BINS 512 +#define FFT_SUBBANDS 256 +#define ENERGY_HISTORY 43 + +#define KICK_BAND 0 +#define SNARE_BAND 1 +#define HIHAT_BAND 2 + +class ofxBeat { + + float fftSmoothed[FFT_BINS]; + float averageEnergy[FFT_SUBBANDS]; + float fftVariance[FFT_SUBBANDS]; + float beatValueArray[FFT_SUBBANDS]; + float energyHistory[FFT_SUBBANDS][ENERGY_HISTORY]; + float *in_fft; + float beatValue; + int historyPos; + bool fftInit; + ofSoundPlayer soundtrack; + + float fftSubbands[FFT_SUBBANDS]; + int bandTimes[3]; + int beatSizes[3]; + float beats[3]; + + int buffer_size; + int fft_size; + + float *magnitude, *phase, *power, *audio_input; + float *magnitude_average, *magnitude_average_snapshot; + + bool bDetectBeat; + + fft myfft; + + void updateBand(bool,int,int); + void updateFFT(); + +public: + ofxBeat(); + + void enableBeatDetect() {bDetectBeat = true;} + void disableBeatDetect() {bDetectBeat = false;} + bool isBeat(int subband); + bool isKick(); + bool isSnare(); + bool isHat(); + bool isBeatRange(int low, int high, int threshold); + void setBeatValue(float bv) {beatValue = bv;} + + void update(int); + void audioReceived(float*, int, int); + + float kick(); + float snare(); + float hihat(); + float getMagnitude(); + + float getBand(int); + + int getBufferSize(); +}; + +#endif /* defined(__Cyril__ofxBeat__) */ diff --git a/Final_Version/src/beatDetection.cpp b/Final_Version/src/beatDetection.cpp new file mode 100644 index 0000000..130dcbc --- /dev/null +++ b/Final_Version/src/beatDetection.cpp @@ -0,0 +1,39 @@ +#include "beatDetection.h" + +//Processes the OfxBeatMaster add on +//alot of these functions are required by default + + + +void beatDetection::setup() { + ofSoundStreamSetup(0, 1, this, 44100, beat.getBufferSize(), 4); //sets your number of inputs/outputs, sample rate, buffer size, number of buffers +} + + + + +float beatDetection::returnBeat() { //returns lows (where kick drums are) as a power value (or volume of subband) + + beat.update(ofGetElapsedTimeMillis()); //only need to call this once, updates your values + float selectedBand1 = beat.getBand(1); //band 1 of 256 FFT subbands, we lose a lot of lows with it this low, however its where a lot of the basslines and kicks are that we need to activate our visuals + + return selectedBand1; + +} + + +float beatDetection::returnHiHat() { //returns hihat value + + + float selectedBand = beat.getBand(100); //returns band 100 as a float, gives a volume for that channel(sometimes works well, some songs need adjusting as their highs are further down into the mids) + + //float selectedBand = beat.hihat(); //returns a 1 or 0 , is decided whether its 1 or 0 in the fft by averaging a range of the subbands and if they're over a threshold. + return selectedBand; + +} + +void beatDetection::audioReceived(float* input, int bufferSize, int nChannels) { //needed for ofxbeatmaster + beat.audioReceived(input, bufferSize, nChannels); +} + + diff --git a/VisualProgress/visual_consolidation/src/beatDetection.h b/Final_Version/src/beatDetection.h similarity index 100% rename from VisualProgress/visual_consolidation/src/beatDetection.h rename to Final_Version/src/beatDetection.h diff --git a/Final_Version/src/disco.cpp b/Final_Version/src/disco.cpp new file mode 100644 index 0000000..ba68c7c --- /dev/null +++ b/Final_Version/src/disco.cpp @@ -0,0 +1,292 @@ +#include "disco.h" + + +disco::disco() { + + barWidth = ofGetScreenWidth(); + + barHeight = ofGetScreenHeight()/128; + +} + + + +//-------------------------------------------------------------- +void disco::setup() { + + glEnable(GL_DEPTH_TEST); //enable depth of objects for openGL + +} + +//-------------------------------------------------------------- +void disco::update() { + + + + + + +} +//-------------------------------------------------------------- +void disco::draw(float value, float hihat_value) { //values are passed via ofApp, the values represent the volume/power of the highs and lows of the FFT + + ofColor colorOne(128, 0, 128); //colours for gradient + ofColor colorTwo(0, 255, 255); + + ofBackgroundGradient(colorOne, colorTwo, OF_GRADIENT_LINEAR); //gradient background, looks cooler than normal flat + + float hiHatValue = hihat_value; + float beatValue = value; + + + if (beatValue > 5 && prevBeat < 4.9) { //these values need adjusting depending on the sound you're outputting via line in/mic, if the value is in a certain range, increment counter by 1 + counter++; + } + + + + if (counter >= (loops * 2)) { //controls the amount of loops the program will do, used for controlling animation state. Value needs changing depending on how many different animations/visuals you have + counter = 0; //sets it back to 0, therefore resetting the animation back from the start + + } + + + //Circle VISUAL + + if (counter <= (loops * 1) - 1) { //decide the order of animations with this + + + for (int i = 0; i < counter&&i < 32; i++) { //Makes the circles spawn when counter increeases + + + + ofSetColor(255, 255, 150); + ofDrawCircle(50 + (i * 100), 75 + (i * 75), 50); + + + ofSetColor(255, 0, 0); + ofDrawCircle(950 + (i * -100), 75 + (i * 80), 50); + + } + + } + + + + + else if (counter >= (loops * 1) && counter <= (loops * 2)) { //second loop threshold + + + cam.begin(); + + if (beatValue > 5 && prevBeat<4.9) { + newCounter++; //new counter variable as this had to be reset independantly to counter + + } + + + if (newCounter >= 4) { //if its above 4, restart + newCounter = 0; + } + + if (newCounter == 1) { + + //simple opengl cube creation + glRotatef(200, 1.0, 0.4, 0.2); + glBegin(GL_QUADS); + + ofSetColor(255, 0, 0); + glVertex3f(-150, 150, -150); //top left + glVertex3f(-150, 150, 150); //top right + glVertex3f(150, 150, 150); //bottom left + glVertex3f(150, 150, -150); //bottom right + + + + glVertex3f(-150, -150, -150); + glVertex3f(-150, -150, 150); + glVertex3f(150, -150, 150); + glVertex3f(150, -150, -150); + + glVertex3f(-150, 150, -150); + glVertex3f(-150, 150, 150); + glVertex3f(-150, -150, 150); + glVertex3f(-150, -150, -150); + + glVertex3f(-150, 150, -150); + glVertex3f(-150, -150, -150); + glVertex3f(150, -150, -150); + glVertex3f(150, 150, -150); + + glVertex3f(-150, 150, 150); + glVertex3f(-150, -150, 150); + glVertex3f(150, -150, 150); + glVertex3f(150, 150, 150); + + glVertex3f(150, 150, 150); + glVertex3f(150, -150, 150); + glVertex3f(150, -150, -150); + glVertex3f(150, 150, -150); + + + //right side + + glEnd(); + + + + } + else if (newCounter == 2) { + + glBegin(GL_QUADS); + glRotatef(100, 0.5, 0.1, 0.2); + ofSetColor(0, 255, 255); + glVertex3f(-200, 200, -200); + glVertex3f(-200, 200, 200); + glVertex3f(200, 200, 200); + glVertex3f(200, 200, -200); + + glVertex3f(-200, -200, -200); + glVertex3f(-200, -200, 200); + glVertex3f(200, -200, 200); + glVertex3f(200, -200, -200); + + glVertex3f(-200, 200, -200); + glVertex3f(-200, 200, 200); + glVertex3f(-200, -200, 200); + glVertex3f(-200, -200, -200); + + glVertex3f(-200, 200, -200); + glVertex3f(-200, -200, -200); + glVertex3f(200, -200, -200); + glVertex3f(200, 200, -200); + + + glVertex3f(-200, 200, 200); + glVertex3f(-200, -200, 200); + glVertex3f(200, -200, 200); + glVertex3f(200, 200, 200); + + //back + + ofSetColor(0, 255, 255); + glVertex3f(200, 200, 200); + glVertex3f(200, -200, 200); + glVertex3f(200, -200, -200); + glVertex3f(200, 200, -200); + + //right side + + glEnd(); + + } + else if (newCounter == 3) { + + glBegin(GL_QUADS); + glRotatef(200, .8, 0.8, 0.1); + ofSetColor(255, 255, 0); + glVertex3f(-300, 300, -300); + glVertex3f(-300, 300, 300); + glVertex3f(300, 300, 300); + glVertex3f(300, 300, -300); + + glVertex3f(-300, -300, -300); + glVertex3f(-300, -300, 300); + glVertex3f(300, -300, 300); + glVertex3f(300, -300, -300); + + glVertex3f(-300, 300, -300); + glVertex3f(-300, 300, 300); + glVertex3f(-300, -300, 300); + glVertex3f(-300, -300, -300); + + glVertex3f(-300, 300, -300); + glVertex3f(-300, -300, -300); + glVertex3f(300, -300, -300); + glVertex3f(300, 300, -300); + + glVertex3f(-300, 300, 300); + glVertex3f(-300, -300, 300); + glVertex3f(300, -300, 300); + glVertex3f(300, 300, 300); + + glVertex3f(300, 300, 300); + glVertex3f(300, -300, 300); + glVertex3f(300, -300, -300); + glVertex3f(300, 300, -300); + + //right side + + glEnd(); + + + } + else if (newCounter == 4) { + glBegin(GL_QUADS); + glRotatef(200,0.70, 0.4, 0.4); + ofSetColor(200, 0, 255); + glVertex3f(-250, 250, -250); + glVertex3f(-250, 250, 250); + glVertex3f(250, 250, 250); + glVertex3f(250, 250, -250); + + glVertex3f(-250, -250, -250); + glVertex3f(-250, -250, 250); + glVertex3f(250, -250, 250); + glVertex3f(250, -250, -250); + + glVertex3f(-250, 250, -250); + glVertex3f(-250, 250, 250); + glVertex3f(-250, -250, 250); + glVertex3f(-250, -250, -250); + + glVertex3f(-250, 250, -250); + glVertex3f(-250, -250, -250); + glVertex3f(250, -250, -250); + glVertex3f(250, 250, -250); + + glVertex3f(-250, 250, 250); + glVertex3f(-250, -250, 250); + glVertex3f(250, -250, 250); + glVertex3f(250, 250, 250); + + //back + + glVertex3f(250, 250, 250); + glVertex3f(250, -250, 250); + glVertex3f(250, -250, -250); + glVertex3f(250, 250, -250); + + //right side + + glEnd(); + + } + + cam.end(); + + + + + } + + prevBeat = value; +} + +int disco::roundUp(int numToRound, int multiple) { //round up function,need this for skip button, copied from stackoverflow https://stackoverflow.com/questions/3407012/c-rounding-up-to-the-nearest-multiple-of-a-number + + assert(multiple && ((multiple & (multiple - 1)) == 0)); + return (numToRound + multiple) & -multiple; + +} + +void disco::keyPressed(int key) { + if (key == 'x') { + + counter = roundUp(counter, 32); + + + } +} + + diff --git a/Final_Version/src/disco.h b/Final_Version/src/disco.h new file mode 100644 index 0000000..4a38d52 --- /dev/null +++ b/Final_Version/src/disco.h @@ -0,0 +1,44 @@ +#pragma once +#include "ofMain.h" +#include "ofxBeat.h" + +#include "beatDetection.h" + + + +class disco{ + + +public: + + + disco(); + void setup(); + void update(); + void draw(float, float); + int roundUp(int, int); + void keyPressed(int key); + + + +private: + + + //bar variables + int barWidth; + int barHeight; + float prevBeat = 0; + + + // + ofEasyCam cam; + int i =0; + int scale = 0; + int counter = 0; + int loops = 32; + + int newCounter = 0; + + + +}; diff --git a/Final_Version/src/electro.cpp b/Final_Version/src/electro.cpp new file mode 100644 index 0000000..858e02b --- /dev/null +++ b/Final_Version/src/electro.cpp @@ -0,0 +1,340 @@ +#include "electro.h" + + + +//Synthwave/Electro style visual, not much going on, synthwave is more about the colours and the music than harsh changes + + +//very similar to format of other classes, only new features/techniques will be commented + +electro::electro() { + + + +} + + +//-------------------------------------------------------------- +void electro::setup() { + + + cam.setNearClip(1); + cam.setFarClip(-5); + cam.setDistance(10); + + glEnable(GL_DEPTH_TEST); + +} + + + + +//-------------------------------------------------------------- +void electro::update(float value, float hihat_value) { + + + + +} + + + +//-------------------------------------------------------------- +void electro::draw(float value, float hihat_value) { + + + + + + float hiHatValue = hihat_value; + float beatValue = value; + + + if (beatValue > 5 && prevBeat<4.9) { //these values need adjusting depending on the sound you're outputting via line in/mic + //counter++; + } + + + if (counter >= (loops * 2)) { + counter = 0; + + } + + //visual 1 + //creates a 3d scene from opengl shapes, sun is massive and translated far away so it doesnt change in size much, horizon is made with a plane facing down to create the illusion of the ground + + if (counter <= (loops * 1) - 1){ + + + ofColor colorOne(24, 0, 113); + ofColor colorTwo(194, 14, 68); + ofBackgroundGradient(colorOne, colorTwo, OF_GRADIENT_LINEAR); + + cam.begin(); + + + + //Sun + //Uses gludisk to create 'primitives' + //created multiple layers to give effect of shape on the sun + + glPushMatrix(); + + glTranslatef(2, 900, -5000); //translate + glScalef(3, 3, 3); //scale + GLUquadricObj *Disk; //create a pointer to gluquadricObj + Disk = gluNewQuadric(); //new instance of class + gluQuadricDrawStyle(Disk, GLU_FILL); //set to disk + glColor3f(1.000, 0.647, 0.000); //colour of disk + gluDisk(Disk, 0, 500, 50, 50); // object name, inner radius, outer radius, slices, loops + glPopMatrix(); + + glPushMatrix(); + glTranslatef(2, 900, -4995); + glScalef(2.9, 2.9, 2.9); + GLUquadricObj *P_Disk; + P_Disk = gluNewQuadric(); + gluQuadricDrawStyle(P_Disk, GLU_FILL); + glColor3f(1.000, 0.549, 0.000); + gluPartialDisk(P_Disk, 0, 500, 50, 5, 90, 180); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(2, 900, -4990); + glScalef(2.85, 2.85, 2.85); + GLUquadricObj *P_Disk_2; + P_Disk_2 = gluNewQuadric(); + gluQuadricDrawStyle(P_Disk_2, GLU_FILL); + glColor3f(1.000, 0.500, 0.000); + gluPartialDisk(P_Disk, 0, 500, 50, 5, 135, 90); + glPopMatrix(); + + + glPushMatrix(); + glColor3f(0.000, 1.000, 1.000); + + //DRAW GRID + //had to be a rectangle so couldnt do with 1 loop + glTranslatef(0, 0, ofGetElapsedTimef() * 4); + glLineWidth(1.); + for (int i = -size; i <= size; i++) { + glBegin(GL_LINES); + glVertex3f(x - i / 7, y - 5, -300); + glVertex3f(x - i / 7, y - 5, 0); + glEnd(); + }; + + + for (int i = -size*2.0; i <= size; i++) { + glBegin(GL_LINES); + glVertex3f(x - size / 7.12, y - 5, z + i ); + glVertex3f(x + size / 7.12, y - 5, z + i ); + glEnd(); + }; + + + //DRAW GROUND PLANE + glPushMatrix(); + glBegin(GL_QUADS); + glColor3f(0.1, 0.0, 0.3); + glVertex3f(-1000, -5.5, -300); + glVertex3f(1000, -5.5, -300); + glColor3f(0.1, 0.0, 0.1); + glVertex3f(1000, -5.5, 50); + glVertex3f(-1000, -5.5, 50); + glEnd(); + glPopMatrix(); + + glPopMatrix(); + + //DRAWING TUNNEL LINES + + + + glPushMatrix(); + glTranslatef(0, 0, ofGetElapsedTimef() * 4); + glLineWidth(5.); + glBegin(GL_LINE_LOOP); + + + + + if (beatValue > 5 && prevBeat<4.9) { + glColor3f(0.000, 1.000, 1.000); + + } + else { + glColor3f(1.0,0.8,0); + } + + for (int i = 0; i < 7; i++) { + + + + glVertex3f(-size / 7, -9, -50 * i); + glVertex3f(-size / 6, 6, -50 *i); + glVertex3f(-size / 7, 11, -50 * i); + glVertex3f(+size / 7, 11, -50 * i); + glVertex3f(+size / 6, 6, -50 * i); + glVertex3f(+size / 7, -9, -50 * i); + + + } + glEnd(); + glPopMatrix(); + + +//DRAWING CUBE, only need to draw 2 sides to give illusion of cube as we'll never see them + glPushMatrix(); + + glScalef(0.2, 0.2, 0.2); + glTranslatef(0, -10 - sin(ofGetElapsedTimef()), -3); + glLineWidth(3.); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + glBegin(GL_QUADS); + + glColor3f(.8, 0, 0.74); + + glVertex3f(-5.f, 5.f, -5.f); + glVertex3f(-5.f, 5.f, 5.f); + glVertex3f(5.f, 5.f, 5.f); + glVertex3f(5.f, 5.f, -5.f); + + glVertex3f(-5.f, 5.f, 5.f); + glVertex3f(-5.f, -5.f, 5.f); + glVertex3f(5.f, -5.f, 5.f); + glVertex3f(5.f, 5.f, 5.f); + glEnd(); + + glPopMatrix(); + + glPushMatrix(); + glScalef(0.2, 0.2, 0.2); + glTranslatef(0, -10 - sin(ofGetElapsedTimef()), -3); + + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + glBegin(GL_QUADS); + + glColor3f(0.000, 0.05, .250); + + glVertex3f(-5.f, 5.f, -5.f); + glVertex3f(-5.f, 5.f, 5.f); + glVertex3f(5.f, 5.f, 5.f); + glVertex3f(5.f, 5.f, -5.f); + + glVertex3f(-5.f, 5.f, 5.f); + glVertex3f(-5.f, -5.f, 5.f); + glVertex3f(5.f, -5.f, 5.f); + glVertex3f(5.f, 5.f, 5.f); + glEnd(); + + glPopMatrix(); + + + + + // //scanlines + //used offset of rectangles with a lower alpha channel to give appearance of old CRT style scanlines + ofRotateZ(2); + if (beatValue > 5 && prevBeat<4.9) { + ofTranslate(0, 1+sin(ofGetElapsedTimef() / 3) / 3, 5); + } + else { + ofTranslate(0, sin(ofGetElapsedTimef() / 3) / 3, 5); + } + + + ofSetColor(0, 0, 0,100); + + for (float i = -10; i < 7; i += 0.06) { + ofDrawRectangle(-8.5, 0.006 + i, 6.5, 0.024); + } + + for (float i = -10; i < 7; i+=0.06) { + if (beatValue > 3&&prevBeat<3.8) { + ofDrawRectangle(-2, i+0.1, 3, 0.024); + } + else { + ofDrawRectangle(-2, i, 3, 0.024); + } + } + + for (float i = -10; i < 7; i += 0.06) { + ofDrawRectangle(1, 0.006+i, 20, 0.024); + } + + cam.end(); + + + } + + //VISUAL 2 MOON GLUDISKS, didnt develop this one, leaving as i want to work on this in the future, can uncomment to make it work though + + else if (counter >= (loops * 1) - 1 && counter <= (loops * 2) - 1) { + + + ofColor colorOne(24, 0, 60); + ofColor colorTwo(0, 0, 0); + ofBackgroundGradient(colorOne, colorTwo, OF_GRADIENT_LINEAR); + cam.begin(); + glPushMatrix(); + + + glTranslatef(2, 900, -5000); + glScalef(3, 3, 3); + GLUquadricObj *Disk; + Disk = gluNewQuadric(); + gluQuadricDrawStyle(Disk, GLU_FILL); + glColor3f(.800, .800, .800); + gluDisk(Disk, 0, 500, 50, 50); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(400, 1300, -4995); + glScalef(2.9, 2.9, 2.9); + GLUquadricObj *Disk_2; + Disk_2 = gluNewQuadric(); + gluQuadricDrawStyle(Disk_2, GLU_FILL); + glColor3f(.700,.700,.700); + gluDisk(Disk_2, 0, 200, 50, 5); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(400, 1300, -4990); + glScalef(2.85, 2.85, 2.85); + GLUquadricObj *P_Disk_2; + P_Disk_2 = gluNewQuadric(); + gluQuadricDrawStyle(P_Disk_2, GLU_FILL); + glColor3f(.600, 0.600, 0.600); + gluPartialDisk(P_Disk_2, 0, 200, 50, 5, 135, 243); + glPopMatrix(); + cam.end(); + } + + + + prevBeat = value; + +} + +int electro::roundUp(int numToRound, int multiple) { //round up function,need this for skip button, copied from stackoverflow https://stackoverflow.com/questions/3407012/c-rounding-up-to-the-nearest-multiple-of-a-number + + assert(multiple && ((multiple & (multiple - 1)) == 0)); + return (numToRound + multiple) & -multiple; + +} + +void electro::keyPressed(int key) { + if (key == 'x') { + + std::cout << loops * 1 - 1 << endl; + std::cout << loops * 2 << endl; + + counter = roundUp(counter, 32); + + + + } +} + + diff --git a/Final_Version/src/electro.h b/Final_Version/src/electro.h new file mode 100644 index 0000000..8c14c9c --- /dev/null +++ b/Final_Version/src/electro.h @@ -0,0 +1,42 @@ +#pragma once +#include "ofMain.h" +#include "ofxBeat.h" + +#include "beatDetection.h" + + + +class electro { + + +public: + + electro(); + void setup(); + void update(float, float); + void draw(float, float); + int roundUp(int, int); + void keyPressed(int key); + +private: + int counter=0; + int loops = 32; + + float prevBeat; + + + + + + + ofEasyCam cam; + float size = 150; + float x = 0; + float y = 0; + float z = 0; + + + + + +}; \ No newline at end of file diff --git a/Final_Version/src/main.cpp b/Final_Version/src/main.cpp new file mode 100644 index 0000000..a8e7365 --- /dev/null +++ b/Final_Version/src/main.cpp @@ -0,0 +1,15 @@ +#include "ofMain.h" +#include "ofApp.h" + + + +//======================================================================== +int main() { + //ofSetupOpenGL(1024, 768, OF_WINDOW); // <-------- setup the GL context + ofSetupOpenGL(1024, 768, OF_FULLSCREEN); + // this kicks off the running of my app + // can be OF_WINDOW or OF_FULLSCREEN + // pass in width and height too: + ofRunApp(new ofApp()); + +} \ No newline at end of file diff --git a/Final_Version/src/ofApp.cpp b/Final_Version/src/ofApp.cpp new file mode 100644 index 0000000..ec1ee8d --- /dev/null +++ b/Final_Version/src/ofApp.cpp @@ -0,0 +1,172 @@ +#include "ofApp.h" + + +//REQUIRES OFXBEATMASTER ADDON FOR OPENFRAMEWORKS + +//Reacts to sound from either mic or line in, we use line in for demonstrating the program +//may have bad results on mic in + + + +//CAN BE TESTED, EVERYTHING WITH 'TESTING MODE' NEXT TO NEED UNCOMMENTING TO WORK +//SIMULATE A KICK BY PRESSING i THEN o IMMEDIATELY AFTER + +//-------------------------------------------------------------- +void ofApp::setup() { + + + ofEnableDepthTest(); + + newBeat.setup(); //initialise FFT / Beat detection + technoVisual.setup(); //initialise the setup functions for visuals + electroVisual.setup(); + discoVisual.setup(); + //ofSoundStreamListDevices(); debugging + + ofEnableSmoothing(); // smoothing + ofSetFrameRate(60); //changes frame rate + + + + //Arduino serial communication + serial.setup("COM5", 57600); //change to whatever port you have Arduino plugged in to, won't cause problems if uncommented and ran without something in port. +} + +//-------------------------------------------------------------- +void ofApp::update() { + + + + +} + +//-------------------------------------------------------------- +void ofApp::draw() { + + + ledControl(); + + //buttons for changing visuals + if (visualSelect == 0) { + technoVisual.draw(newBeat.returnBeat(), newBeat.returnHiHat()); //returned values from functions in beatDetection, passed into individual classes + //technoVisual.draw(x,y); TESTING MODE + } + else if (visualSelect == 1) { + electroVisual.draw(newBeat.returnBeat(), newBeat.returnHiHat()); + //electroVisual.draw(x,y); TESTING MODE + + } + + + else if (visualSelect == 2) { + discoVisual.draw(newBeat.returnBeat(), newBeat.returnHiHat()); + //discoVisual.draw(x,y); TESTING MODE + } + + + +} + +void ofApp::ledControl() +{ + + + if (visualSelect == 0) { + + + if (newBeat.returnHiHat() > 2) { //send a byte when over a volume threshold which is sent to arduino, then creates a 'pulse' in the LEDS + + serial.writeByte(1); //sends byte of 1 + + } + + + + } + + +} + + + +//-------------------------------------------------------------- +void ofApp::keyPressed(int key) { + //runs keypressed functions in appropriate classes, when a key is pressed + technoVisual .keyPressed(key); + electroVisual.keyPressed(key); + discoVisual.keyPressed(key); + + + //buttons to change visuals + + if (key == 'a'){ + + serial.writeByte(4); + visualSelect = 0; + + } + else if (key == 's') { + + serial.writeByte(2); + visualSelect = 1; + } + else if (key == 'd') { + serial.writeByte(3); + visualSelect = 2; + } + + //TESTING MODE + else if (key == 'i') { + x = 20; + } + else if (key == 'o') { + x = 0; + } + + + + + +} + +//-------------------------------------------------------------- +void ofApp::keyReleased(int key) { + +} + +//-------------------------------------------------------------- +void ofApp::mouseMoved(int x, int y) { + +} + +//-------------------------------------------------------------- +void ofApp::mouseDragged(int x, int y, int button) { + +} + +//-------------------------------------------------------------- +void ofApp::mousePressed(int x, int y, int button) { + +} + +//-------------------------------------------------------------- +void ofApp::mouseReleased(int x, int y, int button) { + +} + +//-------------------------------------------------------------- +void ofApp::windowResized(int w, int h) { + +} + +//-------------------------------------------------------------- +void ofApp::gotMessage(ofMessage msg) { + +} + + + +//-------------------------------------------------------------- +void ofApp::dragEvent(ofDragInfo dragInfo) { + +} \ No newline at end of file diff --git a/Final_Version/src/ofApp.h b/Final_Version/src/ofApp.h new file mode 100644 index 0000000..2ddf705 --- /dev/null +++ b/Final_Version/src/ofApp.h @@ -0,0 +1,54 @@ +#pragma once +#include "ofMain.h" +#include "ofxBeat.h" +#include "beatDetection.h" +#include "disco.h" +#include "techno.h" +#include "electro.h" + + +class ofApp : public ofBaseApp { + + + +public: + void setup(); + void update(); + void draw(); + + void keyPressed(int key); + void keyReleased(int key); + void mouseMoved(int x, int y); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void windowResized(int w, int h); + void dragEvent(ofDragInfo dragInfo); + void gotMessage(ofMessage msg); + void ledControl(); + + + //VISUALS + int x = 0; + int y = 0; + + int visualSelect = 0; + + disco discoVisual; + techno technoVisual; + electro electroVisual; + beatDetection newBeat; + + + //LEDS, dont need most of these now, may use in future + //bool bSendSerialMessage; // a flag for sending serial + //char bytesRead[3]; // data from serial, we will be trying to read 3 + //char bytesReadString[4]; // a string needs a null terminator, so we need 3 + 1 bytes + //int nBytesRead; // how much did we read? + //int nTimesRead; // how many times did we read? + //float readTime; // when did we last read? + //int greenIncrease = 10; + ofSerial serial; + + +}; \ No newline at end of file diff --git a/Final_Version/src/techno.cpp b/Final_Version/src/techno.cpp new file mode 100644 index 0000000..92dbb75 --- /dev/null +++ b/Final_Version/src/techno.cpp @@ -0,0 +1,321 @@ +#include "techno.h" + + +//only new things will be commented as layout and logic remains the same + + +techno::techno() { + + barWidth = ofGetScreenWidth(); + + barHeight = ofGetScreenHeight()/128; + + + //sets up points of cloud visuals + for (int j = 0; j<n; j++) { + tx[j] = ofRandom(0, 1600); + ty[j] = ofRandom(0, 1600); + } +} + + + +//-------------------------------------------------------------- +void techno::setup() { + + glEnable(GL_DEPTH_TEST); + +} + + +//-------------------------------------------------------------- +void techno::update(float value, float hihat_value) { + + + +} + + +//-------------------------------------------------------------- +void techno::draw(float value, float hihat_value) { + + float hiHatValue = hihat_value; + float beatValue = value; + + + + if (beatValue > 5&&prevBeat<4.9) { //these values need adjusting depending on the sound you're outputting via line in/mic + counter++; + + } + + if (counter >= (loops * 5)) { + counter = 0; + } + + + //LINE VISUAL + ofBackgroundGradient(0, 15, OF_GRADIENT_CIRCULAR); //gradient background, looks cooler than normal flat + + if (counter <= (loops * 1) - 1) { //decide the order of animations with this + for (int i = 0; i<counter&&i < 32; i++) { + ofSetColor(200); + ofDrawRectangle(barWidth / 5, 50 + (i * 32), barWidth / 1.6, barHeight); + } + + } + + + //LINES WITH OPENGL CUBE IN BACKGROUND + + else if (counter >= (loops * 1) - 1 && counter <= (loops * 2) - 1) { + for (int i = 0; i < 32; i++) { + ofSetColor(200); + ofDrawRectangle(barWidth / 5, 50 + (i * 32), barWidth / 1.6, barHeight); + } + + + + for (int i = 0; i <(counter - 32) && i <= 6; i++) { + cam.begin(); + glLineWidth(7.); + glRotatef(sin(ofGetElapsedTimef()) * 100, 1.0, 0.0, 0.0); //rotate using sin wave + glRotatef(sin(ofGetElapsedTimef()) * 80, 0.0, 0.0, 0.4); + + if (beatValue > 5 && prevBeat<4.9) { //change scale if over a certain value + glScalef(1.2, 1.3, 1.4); + } + + + + if (i == 1) { + glLineWidth(7.); + glScalef(0.74, 0.74, 0.74); + glBegin(GL_LINE_LOOP); + glColor3f(0.8f, 0.8f, 0.8f); + glVertex3f(-250.0f, 250.0f, -250.0f); + glVertex3f(-250.0f, -250.0f, -250.0f); + glVertex3f(-250.0f, -250.0f, 250.0f); + glVertex3f(-250.0f, 250.0f, 250.0f); + + + glEnd(); + } + else if (i == 2) { + glLineWidth(7.); + glScalef(0.74, 0.74, 0.74); + glBegin(GL_LINE_LOOP); + glVertex3f(250.0f, 250.0f, -250.0f); + glVertex3f(250.0f, -250.0f, -250.0f); + glVertex3f(250.0f, -250.0f, 250.0f); + glVertex3f(250.0f, 250.0f, 250.0f); + + glEnd(); + } + else if (i == 3) { + glLineWidth(7.); + glScalef(0.74, 0.74, 0.74); + glBegin(GL_LINES); + glVertex3f(-250.0f, -250.0f, -250.0f); + glVertex3f(250.0f, -250.0f, -250.0f); + glVertex3f(-250.0f, 250.0f, -250.0f); + glVertex3f(250.0f, 250.0f, -250.0f); + glEnd(); + } + else if (i == 4) { + glLineWidth(7.); + glScalef(0.74, 0.74, 0.74); + glBegin(GL_LINES); + glVertex3f(-250.0f, 250.0f, 250.0f); + glVertex3f(250.0f, 250.0f, 250.0f); + glEnd(); + + } + else if (i == 5) { + glLineWidth(7.); + glScalef(0.74, 0.74, 0.74); + glBegin(GL_LINES); + glVertex3f(-250.0f, -250.0f, 250.0f); + glVertex3f(250.0f, -250.0f, 250.0f); + glEnd(); + } + + + cam.end(); + + } + + + } + + + + //OFFSET TRIANGLE VISUAL + //uses simple opengl geometry to create two triangles, the smaller triangle reacts to hihats, the larger to low end frequencies + + else if (counter >= (loops * 2) - 1 && counter <= (loops * 3) - 1) { + + + glLineWidth(3.); + if (hiHatValue >2) { //when using beat.getBand(100); + glPushMatrix(); + //if (hiHatValue >= 1) { //when using beat.snare(); + cam.begin(); + glBegin(GL_LINE_LOOP); + glColor3f(0.8f, 0.8f, 0.8f); + + + glVertex3f(0, 150, 0); + glVertex3f(-100, -50, 0); + glVertex3f(100, -50, 0); + + glEnd(); + cam.end(); + glPopMatrix(); + } + + if (beatValue > 5 && prevBeat<4.9) { + cam.begin(); + glBegin(GL_LINE_LOOP); + glColor3f(0.8f, 0.8f, 0.8f); + + + glVertex3f(300, -100, 50); + glVertex3f(100, 300, 50); + glVertex3f(-100, -100, 50); + + glEnd(); + cam.end(); + } + + + } + + + + //DEFORMED PLANE VISUAL + + //creates two square geometries, and moves them on a hihat + else if (counter >= (loops * 3) - 1 && counter <= (loops * 4) - 1) { + + glLineWidth(3.); + cam.begin(); + glRotatef(sin(ofGetElapsedTimef()) * 20, 1.0, 0.0, 0.0); + glRotatef(sin(ofGetElapsedTimef()) * 5, 0.0, 0.0, 0.6); + + if (hiHatValue > 2) { + glBegin(GL_LINE_LOOP); //changes drawing mode and scale on hihat value, may not to be adjusted if working incorrectly + scale = 50; + + } + else { + glBegin(GL_QUADS); + scale = 0; + } + + + + glColor3f(0.6f, 0.6f, 0.6f); + glVertex3f(0 + scale, 0 + scale, 100 + scale); + glVertex3f(0 + scale, -150 + scale, 0 + scale); + glVertex3f(-150 + scale, -150 + scale, 0 + scale); + glVertex3f(-150 + scale, 0 + scale, 0 + scale); + + + glVertex3f(0 + scale, 0 + scale, 100 + scale); + glVertex3f(-150 + scale, 0 + scale, 0 + scale); + glVertex3f(-150 + scale, 150 + scale, 0 + scale); + glVertex3f(0 + scale, 150 + scale, 0 + scale); + + glVertex3f(0 + scale, 0 + scale, 100 + scale); + glVertex3f(0 + scale, 150 + scale, 0 + scale); + glVertex3f(150 + scale, 150 + scale, 0 + scale); + glVertex3f(150 + scale, 0 + scale, 0 + scale); + + glVertex3f(0 + scale, 0 + scale, 100 + scale); + glVertex3f(150 + scale, 0 + scale, 0 + scale); + glVertex3f(150 + scale, -150 + scale, 0 + scale); + glVertex3f(0 + scale, -150 + scale, 0 + scale); + + glEnd(); + cam.end(); + } + + + + //Cloud vertex visual, we referenced and adapted the code from + //https://github.com/julien/ofspectrum + + else if (counter >= (loops * 4) - 1 && counter <= (loops * 5) - 1) { + + + + float time = ofGetElapsedTimef(); + float dt = time - time0; + dt = ofClamp(dt, 0.0, 0.1); + time0 = time; //Store the current time + + + + Rad = ofMap(beatValue / 2, 0, 20, 600, 620, true); //we update the radius and velocity of the points with the beat value and hi hat value, values need adjusting for volume you're outputting + Vel = ofMap(hiHatValue / 1000, 0, 0.1, 0.05, 0.5); + + //Update particles positions + for (int j = 0; j<n; j++) { + tx[j] += Vel * dt * 2; + ty[j] += Vel * dt / 2; + p[j].x = ofSignedNoise(tx[j]) * Rad*1.3; + p[j].y = ofSignedNoise(ty[j]) * Rad*1.3; + } + + ofPushMatrix(); + ofTranslate(ofGetWidth() / 2, ofGetHeight() / 2); + ofRotateZ(ofGetElapsedTimef() * 20); + + //Draw points + //line colours + glLineWidth(1.); + ofSetColor(200); + //ofFill(); + for (int i = 0; i<n; i++) { + ofCircle(p[i], 1); + } + + //Draw lines between near points + float dist = 30; //Threshold parameter of distance + dist += counter - 128; + for (int j = 0; j<n; j++) { + for (int k = j + 1; k<n; k++) { + if (ofDist(p[j].x, p[j].y, p[k].x, p[k].y) + < dist) { + ofLine(p[j], p[k]); + } + } + } + + ofPopMatrix(); + + } + + prevBeat = value; + + + + +} + + +int techno::roundUp(int numToRound, int multiple) { //round up function,need this for skip button, copied from stackoverflow https://stackoverflow.com/questions/3407012/c-rounding-up-to-the-nearest-multiple-of-a-number + + assert(multiple && ((multiple & (multiple - 1)) == 0)); + return (numToRound + multiple) & -multiple; + +} + +void techno::keyPressed(int key) { + if (key == 'x') { + counter = roundUp(counter, 32); + } +} + + diff --git a/Final_Version/src/techno.h b/Final_Version/src/techno.h new file mode 100644 index 0000000..7c4a6ee --- /dev/null +++ b/Final_Version/src/techno.h @@ -0,0 +1,54 @@ + +#pragma once +#include "ofMain.h" +#include "ofxBeat.h" + +#include "beatDetection.h" + +class techno{ + + +public: + + + techno(); + void setup(); + void update(float,float); + void draw(float,float); + int roundUp(int,int); + void keyPressed(int key); + + + +private: + + + //bar variables + int barWidth; + int barHeight; + float prevBeat = 0; + + + ofEasyCam cam; + int i =0; + int scale = 0; + int counter = 0; + int loops = 32; + + + //cloud variables + float curAvgVolume = 0; + int x = 0; + int n = 800; + float Rad = 600; //Cloud raduis parameter + float Vel = 0.2; //Cloud points velocity parameter + float time0 = 0; //Time value, used for dt computing + //Offsets for Perlin noise calculation for points + float tx[800], ty[800]; + ofPoint p[800]; + + + + + +}; \ No newline at end of file diff --git a/LEDprogress/Arduino_LED/strandtest/serialLED/serialLED.ino b/LEDprogress/Arduino_LED/strandtest/serialLED/serialLED.ino deleted file mode 100644 index 83b94b0..0000000 --- a/LEDprogress/Arduino_LED/strandtest/serialLED/serialLED.ino +++ /dev/null @@ -1,175 +0,0 @@ -#include <Adafruit_NeoPixel.h> -#ifdef __AVR__ -#include <avr/power.h> -#endif - -#define PIN 6 -#define stripLength 30 - -Adafruit_NeoPixel strip = Adafruit_NeoPixel(stripLength, PIN, NEO_GRB + NEO_KHZ800); - - -int incomingByte = 0; -char bytes [4]; -void setup() { - - Serial.begin(57600); - strip.begin(); - strip.show(); // Initialize all pixels to 'off' - -} - -void loop() { - - //buffer of chars, store incoming bytes in - - - - - - incomingByte = Serial.read(); - if (incomingByte == 1) { - for (int i = 0; i < 60; i++) { - - - strip.setPixelColor(i, strip.Color(200, 0, 0)); - - - } for (int x = 0; x < 20; x++) { - strip.show(); - } - } - else { - for (int i = 0; i < 60; i++) { - strip.setPixelColor(i, strip.Color(0, 0, 200)); - - - - } - for(int x =0; x < 20; x++){ - strip.show(); - } - - } - -} - - -// - -//Serial.readBytes(bytes,4); -//strip.setPixelColor(bytes[3], strip.Color(bytes[0],bytes[1],bytes[2])); //index control of LEDS(VERY BUGGY) -//strip.show(); - -//Serial.readBytes(bytes,4); -//rgbControl(bytes[3],bytes[0],bytes[1],bytes[2]); - - - - - - -void rgbControl(uint32_t bytes_index, uint32_t bytes_r, uint32_t bytes_g, uint32_t bytes_b) { - //RGB INDEX CONTROL - - //Serial.readBytes(bytes,4); //store data incoming bytes into [bytes] buffer, returns amount of bytes given - strip.setPixelColor(bytes_index, strip.Color(bytes_r, bytes_g, bytes_b)); - if (bytes_r == 0 && bytes_g == 0 && bytes_b == 0) { //clears all the LEDS as they're very bright and annoying - for (int i = 0; i <= 9; i++) { - strip.setPixelColor(i, 0, 0, 0); - strip.show(); - } - } - strip.show(); - -} - - -void mouseControl(uint32_t i, uint32_t c) { - - strip.setPixelColor(i, c); - strip.show(); -} -// Fill the dots one after the other with a color -void colorWipe(uint32_t c, uint8_t wait) { - for (uint16_t i = 0; i < strip.numPixels(); i++) { - - //delay(wait); - } -} - -void rainbow(uint8_t wait) { - uint16_t i, j; - - for (j = 0; j < 256; j++) { - for (i = 0; i < strip.numPixels(); i++) { - strip.setPixelColor(i, Wheel((i + j) & 255)); - } - strip.show(); - delay(wait); - } -} - -// Slightly different, this makes the rainbow equally distributed throughout -void rainbowCycle(uint8_t wait) { - uint16_t i, j; - - for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel - for (i = 0; i < strip.numPixels(); i++) { - strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); - } - strip.show(); - delay(wait); - } -} - -//Theatre-style crawling lights. -void theaterChase(uint32_t c, uint8_t wait) { - for (int j = 0; j < 10; j++) { //do 10 cycles of chasing - for (int q = 0; q < 3; q++) { - for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) { - strip.setPixelColor(i + q, c); //turn every third pixel on - } - strip.show(); - - delay(wait); - - for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) { - strip.setPixelColor(i + q, 0); //turn every third pixel off - } - } - } -} - -//Theatre-style crawling lights with rainbow effect -void theaterChaseRainbow(uint8_t wait) { - for (int j = 0; j < 256; j++) { // cycle all 256 colors in the wheel - for (int q = 0; q < 3; q++) { - for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) { - strip.setPixelColor(i + q, Wheel( (i + j) % 255)); //turn every third pixel on - } - strip.show(); - - delay(wait); - - for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) { - strip.setPixelColor(i + q, 0); //turn every third pixel off - } - } - } -} - -// Input a value 0 to 255 to get a color value. -// The colours are a transition r - g - b - back to r. -uint32_t Wheel(byte WheelPos) { - WheelPos = 255 - WheelPos; - if (WheelPos < 85) { - return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); - } - if (WheelPos < 170) { - WheelPos -= 85; - return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); - } - WheelPos -= 170; - return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); -} diff --git a/OLD_FILES/LEDprogress/Arduino_LED/strandtest/serialLED/serialLED.ino b/OLD_FILES/LEDprogress/Arduino_LED/strandtest/serialLED/serialLED.ino new file mode 100644 index 0000000..c8b42d2 --- /dev/null +++ b/OLD_FILES/LEDprogress/Arduino_LED/strandtest/serialLED/serialLED.ino @@ -0,0 +1,134 @@ +#include <Adafruit_NeoPixel.h> +#ifdef __AVR__ +#include <avr/power.h> +#endif + +#define PIN 6 //digital pin you're plugged in to +#define stripLength 30 //quantity of LEDS on strip + + +//A serial communication/neopixel hybrid for controlling visuals via an arduino and visual studio. +//Requires a WS2812B LED strip to work +//The basic idea of the program is to recieve incoming bytes from serial communication, and use these to decide which LEDS to light up +//we didnt need to get too complex with this as the results we wanted were easy to achieve +//Very much learnt this from scratch so there may be some issues with this further down the line,but for a project of this +//size it's perfeclty fine. + +Adafruit_NeoPixel strip = Adafruit_NeoPixel(stripLength, PIN, NEO_GRB + NEO_KHZ800); + + +int incomingByte = 0; //incomingByte is the basis for control + + +bool electroControl = false; //booleans for controlling states +bool discoControl = false; +void setup() { + + Serial.begin(57600); + strip.begin(); + strip.show(); // Initialize all pixels to 'off' + +} + +void loop() { + + + incomingByte = Serial.read(); //reads the incoming byte + + //techno visual control + if (incomingByte == 1) { //if the byte sent is 1(if beatvalue in c++ code is over a certain amount)... + discoControl = false; //discocontrol becomes false, to disable the calling of the disco visual, explained later + for (int i = 0; i < 30; i++) { + strip.setPixelColor(i, strip.Color(240, 240, 240)); //sets all pixel to nearly white + + } + for(int i = 0;i<10;i++){ //poor programming but it serves a simple purpose, to delay the program a bit without using wait, keeps the LEDS cleared after they fire + strip.show(); + } + + for (int i = 0; i < 30; i++) { + strip.setPixelColor(i, strip.Color(0, 0, 0)); //turns the pixels off again, causing a flash + + } + strip.show(); + } + + else if(incomingByte ==2){ // electro visual control + discoControl=false; + for (int i = 0; i < 30; i++) { + strip.setPixelColor(i, strip.Color(240, 120, 0)); //sets them to orange, didnt want any fancy leds here as the colour matched sun felt warming + strip.show(); + } + } + else if(incomingByte ==3){ //little more complicated for this one as it needed to use the rainbow function + + discoControl=true; //discocontrol becomes true to enable function + }else if(incomingByte ==4){ //the rainbow function would linger while going back to techno visual, recieves a 1 off byte '4' to disable it + discoControl=false; + for (int i = 0; i < 30; i++) { + strip.setPixelColor(i, strip.Color(0, 0, 0)); //sets all to off if recieving '4' + + } + strip.show(); + } + if(discoControl){ // + rainbow(2); //(X)= wait, longer may look better but it needs to complete its cycle, problematic when going back and forth between visuals. + + + } + + +// Didnt use this in the end, leaving here for future use +// +//void rgbControl(uint32_t bytes_index, uint32_t bytes_r, uint32_t bytes_g, uint32_t bytes_b) { +// //RGB INDEX CONTROL +// +// //Serial.readBytes(bytes,4); //store data incoming bytes into [bytes] buffer, returns amount of bytes given +// strip.setPixelColor(bytes_index, strip.Color(bytes_r, bytes_g, bytes_b)); +// if (bytes_r == 0 && bytes_g == 0 && bytes_b == 0) { //clears all the LEDS as they're very bright and annoying +// for (int i = 0; i <= 9; i++) { +// strip.setPixelColor(i, 0, 0, 0); +// strip.show(); +// } +// } +// strip.show(); +// +//} + +// Also didnt use this +//void mouseControl(uint32_t i, uint32_t c) { +// +// strip.setPixelColor(i, c); +// strip.show(); +} + +// Default neopixel animation that we adapted to work with serial communication, didn't need to recreate as the effect was perfect for our visual +void rainbow(uint8_t wait) { + if(discoControl){ + uint16_t i, j; + + for (j = 0; j < 256; j++) { + for (i = 0; i < strip.numPixels(); i++) { + strip.setPixelColor(i, Wheel((i + j) & 255)); + } + strip.show(); + delay(wait); + } + } +} + + + +//default neopixel function +uint32_t Wheel(byte WheelPos) { + WheelPos = 255 - WheelPos; + if (WheelPos < 85) { + return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); + } + if (WheelPos < 170) { + WheelPos -= 85; + return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); + } + WheelPos -= 170; + return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); +} diff --git a/LEDprogress/src/main.cpp b/OLD_FILES/LEDprogress/src/main.cpp similarity index 100% rename from LEDprogress/src/main.cpp rename to OLD_FILES/LEDprogress/src/main.cpp diff --git a/LEDprogress/src/ofApp.cpp b/OLD_FILES/LEDprogress/src/ofApp.cpp similarity index 100% rename from LEDprogress/src/ofApp.cpp rename to OLD_FILES/LEDprogress/src/ofApp.cpp diff --git a/LEDprogress/src/ofApp.h b/OLD_FILES/LEDprogress/src/ofApp.h similarity index 100% rename from LEDprogress/src/ofApp.h rename to OLD_FILES/LEDprogress/src/ofApp.h diff --git a/Prototype/src/Visualizer.cpp b/OLD_FILES/Prototype/src/Visualizer.cpp similarity index 100% rename from Prototype/src/Visualizer.cpp rename to OLD_FILES/Prototype/src/Visualizer.cpp diff --git a/Prototype/src/Visualizer.h b/OLD_FILES/Prototype/src/Visualizer.h similarity index 100% rename from Prototype/src/Visualizer.h rename to OLD_FILES/Prototype/src/Visualizer.h diff --git a/Prototype/src/main.cpp b/OLD_FILES/Prototype/src/main.cpp similarity index 100% rename from Prototype/src/main.cpp rename to OLD_FILES/Prototype/src/main.cpp diff --git a/Prototype/src/particle.cpp b/OLD_FILES/Prototype/src/particle.cpp similarity index 100% rename from Prototype/src/particle.cpp rename to OLD_FILES/Prototype/src/particle.cpp diff --git a/Prototype/src/particle.h b/OLD_FILES/Prototype/src/particle.h similarity index 100% rename from Prototype/src/particle.h rename to OLD_FILES/Prototype/src/particle.h diff --git a/VisualProgress/VIS4/VIS4.xcodeproj/project.xcworkspace/xcuserdata/jamesjcarty.xcuserdatad/UserInterfaceState.xcuserstate b/OLD_FILES/VisualProgress/VIS4/VIS4.xcodeproj/project.xcworkspace/xcuserdata/jamesjcarty.xcuserdatad/UserInterfaceState.xcuserstate similarity index 100% rename from VisualProgress/VIS4/VIS4.xcodeproj/project.xcworkspace/xcuserdata/jamesjcarty.xcuserdatad/UserInterfaceState.xcuserstate rename to OLD_FILES/VisualProgress/VIS4/VIS4.xcodeproj/project.xcworkspace/xcuserdata/jamesjcarty.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/VisualProgress/VIS4/src/main.cpp b/OLD_FILES/VisualProgress/VIS4/src/main.cpp old mode 100755 new mode 100644 similarity index 100% rename from VisualProgress/VIS4/src/main.cpp rename to OLD_FILES/VisualProgress/VIS4/src/main.cpp diff --git a/VisualProgress/VIS4/src/ofApp.cpp b/OLD_FILES/VisualProgress/VIS4/src/ofApp.cpp old mode 100755 new mode 100644 similarity index 100% rename from VisualProgress/VIS4/src/ofApp.cpp rename to OLD_FILES/VisualProgress/VIS4/src/ofApp.cpp diff --git a/VisualProgress/VIS4/src/ofApp.h b/OLD_FILES/VisualProgress/VIS4/src/ofApp.h old mode 100755 new mode 100644 similarity index 100% rename from VisualProgress/VIS4/src/ofApp.h rename to OLD_FILES/VisualProgress/VIS4/src/ofApp.h diff --git a/VisualProgress/VISUAL 3/src/main.cpp b/OLD_FILES/VisualProgress/VISUAL 3/src/main.cpp old mode 100755 new mode 100644 similarity index 100% rename from VisualProgress/VISUAL 3/src/main.cpp rename to OLD_FILES/VisualProgress/VISUAL 3/src/main.cpp diff --git a/VisualProgress/VISUAL 3/src/ofApp.cpp b/OLD_FILES/VisualProgress/VISUAL 3/src/ofApp.cpp old mode 100755 new mode 100644 similarity index 100% rename from VisualProgress/VISUAL 3/src/ofApp.cpp rename to OLD_FILES/VisualProgress/VISUAL 3/src/ofApp.cpp diff --git a/VisualProgress/VISUAL 3/src/ofApp.h b/OLD_FILES/VisualProgress/VISUAL 3/src/ofApp.h old mode 100755 new mode 100644 similarity index 100% rename from VisualProgress/VISUAL 3/src/ofApp.h rename to OLD_FILES/VisualProgress/VISUAL 3/src/ofApp.h diff --git a/VisualProgress/Visual 1/Circle class.cpp b/OLD_FILES/VisualProgress/Visual 1/Circle class.cpp similarity index 100% rename from VisualProgress/Visual 1/Circle class.cpp rename to OLD_FILES/VisualProgress/Visual 1/Circle class.cpp diff --git a/VisualProgress/Visual 1/Circle class.hpp b/OLD_FILES/VisualProgress/Visual 1/Circle class.hpp similarity index 100% rename from VisualProgress/Visual 1/Circle class.hpp rename to OLD_FILES/VisualProgress/Visual 1/Circle class.hpp diff --git a/VisualProgress/Visual 1/main.cpp b/OLD_FILES/VisualProgress/Visual 1/main.cpp similarity index 100% rename from VisualProgress/Visual 1/main.cpp rename to OLD_FILES/VisualProgress/Visual 1/main.cpp diff --git a/VisualProgress/Visual 1/ofApp.cpp b/OLD_FILES/VisualProgress/Visual 1/ofApp.cpp similarity index 100% rename from VisualProgress/Visual 1/ofApp.cpp rename to OLD_FILES/VisualProgress/Visual 1/ofApp.cpp diff --git a/VisualProgress/Visual 1/ofApp.h b/OLD_FILES/VisualProgress/Visual 1/ofApp.h similarity index 100% rename from VisualProgress/Visual 1/ofApp.h rename to OLD_FILES/VisualProgress/Visual 1/ofApp.h diff --git a/VisualProgress/Visual 2/src/Visualizer.cpp b/OLD_FILES/VisualProgress/Visual 2/src/Visualizer.cpp similarity index 100% rename from VisualProgress/Visual 2/src/Visualizer.cpp rename to OLD_FILES/VisualProgress/Visual 2/src/Visualizer.cpp diff --git a/VisualProgress/Visual 2/src/Visualizer.h b/OLD_FILES/VisualProgress/Visual 2/src/Visualizer.h similarity index 100% rename from VisualProgress/Visual 2/src/Visualizer.h rename to OLD_FILES/VisualProgress/Visual 2/src/Visualizer.h diff --git a/VisualProgress/Visual 2/src/main.cpp b/OLD_FILES/VisualProgress/Visual 2/src/main.cpp similarity index 100% rename from VisualProgress/Visual 2/src/main.cpp rename to OLD_FILES/VisualProgress/Visual 2/src/main.cpp diff --git a/VisualProgress/Visual 2/src/ofApp.cpp b/OLD_FILES/VisualProgress/Visual 2/src/ofApp.cpp similarity index 100% rename from VisualProgress/Visual 2/src/ofApp.cpp rename to OLD_FILES/VisualProgress/Visual 2/src/ofApp.cpp diff --git a/VisualProgress/Visual 2/src/ofApp.h b/OLD_FILES/VisualProgress/Visual 2/src/ofApp.h similarity index 100% rename from VisualProgress/Visual 2/src/ofApp.h rename to OLD_FILES/VisualProgress/Visual 2/src/ofApp.h diff --git a/VisualProgress/Visual 2/src/particle.cpp b/OLD_FILES/VisualProgress/Visual 2/src/particle.cpp similarity index 100% rename from VisualProgress/Visual 2/src/particle.cpp rename to OLD_FILES/VisualProgress/Visual 2/src/particle.cpp diff --git a/VisualProgress/Visual 2/src/particle.h b/OLD_FILES/VisualProgress/Visual 2/src/particle.h similarity index 100% rename from VisualProgress/Visual 2/src/particle.h rename to OLD_FILES/VisualProgress/Visual 2/src/particle.h diff --git a/VisualProgress/visual_consolidation/src/beatDetection.cpp b/OLD_FILES/VisualProgress/visual_consolidation/src/beatDetection.cpp similarity index 100% rename from VisualProgress/visual_consolidation/src/beatDetection.cpp rename to OLD_FILES/VisualProgress/visual_consolidation/src/beatDetection.cpp diff --git a/OLD_FILES/VisualProgress/visual_consolidation/src/beatDetection.h b/OLD_FILES/VisualProgress/visual_consolidation/src/beatDetection.h new file mode 100644 index 0000000..5d40ee3 --- /dev/null +++ b/OLD_FILES/VisualProgress/visual_consolidation/src/beatDetection.h @@ -0,0 +1,26 @@ +#pragma once +#include "ofMain.h" +#include "ofxBeat.h" + + +class beatDetection : public ofBaseApp { + + void audioReceived(float*, int, int); + +public: + + + void setup(); + + + float returnBeat(); + + float returnHiHat(); + + ofxBeat beat; + ofSoundPlayer song; + + + + +}; \ No newline at end of file diff --git a/VisualProgress/visual_consolidation/src/disco.cpp b/OLD_FILES/VisualProgress/visual_consolidation/src/disco.cpp old mode 100755 new mode 100644 similarity index 100% rename from VisualProgress/visual_consolidation/src/disco.cpp rename to OLD_FILES/VisualProgress/visual_consolidation/src/disco.cpp diff --git a/VisualProgress/visual_consolidation/src/disco.h b/OLD_FILES/VisualProgress/visual_consolidation/src/disco.h old mode 100755 new mode 100644 similarity index 100% rename from VisualProgress/visual_consolidation/src/disco.h rename to OLD_FILES/VisualProgress/visual_consolidation/src/disco.h diff --git a/VisualProgress/visual_consolidation/src/electro.cpp b/OLD_FILES/VisualProgress/visual_consolidation/src/electro.cpp similarity index 100% rename from VisualProgress/visual_consolidation/src/electro.cpp rename to OLD_FILES/VisualProgress/visual_consolidation/src/electro.cpp diff --git a/VisualProgress/visual_consolidation/src/electro.h b/OLD_FILES/VisualProgress/visual_consolidation/src/electro.h similarity index 100% rename from VisualProgress/visual_consolidation/src/electro.h rename to OLD_FILES/VisualProgress/visual_consolidation/src/electro.h diff --git a/VisualProgress/visual_consolidation/src/main.cpp b/OLD_FILES/VisualProgress/visual_consolidation/src/main.cpp similarity index 100% rename from VisualProgress/visual_consolidation/src/main.cpp rename to OLD_FILES/VisualProgress/visual_consolidation/src/main.cpp diff --git a/VisualProgress/visual_consolidation/src/ofApp.cpp b/OLD_FILES/VisualProgress/visual_consolidation/src/ofApp.cpp similarity index 100% rename from VisualProgress/visual_consolidation/src/ofApp.cpp rename to OLD_FILES/VisualProgress/visual_consolidation/src/ofApp.cpp diff --git a/VisualProgress/visual_consolidation/src/ofApp.h b/OLD_FILES/VisualProgress/visual_consolidation/src/ofApp.h similarity index 100% rename from VisualProgress/visual_consolidation/src/ofApp.h rename to OLD_FILES/VisualProgress/visual_consolidation/src/ofApp.h diff --git a/VisualProgress/visual_consolidation/src/techno.cpp b/OLD_FILES/VisualProgress/visual_consolidation/src/techno.cpp similarity index 100% rename from VisualProgress/visual_consolidation/src/techno.cpp rename to OLD_FILES/VisualProgress/visual_consolidation/src/techno.cpp diff --git a/VisualProgress/visual_consolidation/src/techno.h b/OLD_FILES/VisualProgress/visual_consolidation/src/techno.h similarity index 100% rename from VisualProgress/visual_consolidation/src/techno.h rename to OLD_FILES/VisualProgress/visual_consolidation/src/techno.h diff --git a/pp_amendments.txt b/OLD_FILES/pp_amendments.txt similarity index 100% rename from pp_amendments.txt rename to OLD_FILES/pp_amendments.txt diff --git a/OLD_FILES/readme.txt b/OLD_FILES/readme.txt new file mode 100644 index 0000000..ef1a0c6 --- /dev/null +++ b/OLD_FILES/readme.txt @@ -0,0 +1 @@ +Contains old working project files, wanted to leave them here so we could relate to them in write up/in the future \ No newline at end of file diff --git a/resources_references.txt b/OLD_FILES/resources_references.txt similarity index 100% rename from resources_references.txt rename to OLD_FILES/resources_references.txt diff --git a/readme.txt b/readme.txt index dcdf3dd..78add15 100644 --- a/readme.txt +++ b/readme.txt @@ -1,17 +1,23 @@ -William Fish, James Carty - - - - -OCBOX: A visual and audio experience 2018 - - -The FFT works from sound input, via line/mic in. The effectiveness of the fft -is worsened when music is picked up by a mic. Please try to use Line in via -sound card. - - -REQUIRED ADDONS; - -OFXBEAT MASTER (supplied in repo) -Arduino (code is marked where to remove for function without arduino/LED) +William Fish, James Carty + + + +OCBOX: A demonstration of visual and audio 2018 + + +The FFT works from sound input, via line/mic in. The effectiveness of the fft is worsened when music is picked up by a mic. Please try to use Line in via sound card or similar + + +Included in Final_version Folder; + + +OcBox final build supplied as src folder + + +Required Addons; + +OfxBeatMaster (supplied in repo) + +Non required Addons; + +Arduino code (code is marked where to remove for function without arduino/LED) -- GitLab