diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/src/Voice.cpp b/src/Voice.cpp new file mode 100644 index 0000000..e80ae69 --- /dev/null +++ b/src/Voice.cpp @@ -0,0 +1,118 @@ +#include "Voice.h" + +void Voice::setup(Receiver &receiver) +{ + _font = Font(_font_name, _size); + _tex = gl::TextureFont::create(_font); + + /*- NET -*/ + receiver.setListener(_channel + "/utterance", + [&](const osc::Message &m){ + std::lock_guard lock(_utterance_mutex); + std::string u = m[0].string(); + if(_utterance != u) { + _utterance = u; + _utterance_cb(this); + } + }); + + receiver.setListener(_channel + "/font/color", + [&](const osc::Message &m){ + std::lock_guard lock(_color_mutex); + float a = m[0].flt(); + float r = m[1].flt(); + float g = m[2].flt(); + float b = m[3].flt(); + ColorA c(r, g, b, a); + if(_color != c) { + _color = c; + _change_cb(this); + console() << _name << ": change color" << endl; + console() << r << ", " << g << ", " << b << ", " << a << endl; + } + }); + + receiver.setListener(_channel + "/background", + [&](const osc::Message &m){ + std::lock_guard lock(_color_mutex); + float a = m[0].flt(); + float r = m[1].flt(); + float g = m[2].flt(); + float b = m[3].flt(); + ColorA c(r, g, b, a); + if(_background != c) { + _background = c; + _change_cb(this); + console() << _name << ": change background" << endl; + console() << r << ", " << g << ", " << b << ", " << a << endl; + } + }); + + receiver.setListener(_channel + "/font/size", + [&](const osc::Message &m){ + std::lock_guard lock(_font_mutex); + int s = m[0].int32(); + if(_size != s) { + _size = s; + _change_cb(this); + _update_font = true; + console() << _name << ": change font size" << endl; + } + }); + + receiver.setListener(_channel + "/font/type", + [&](const osc::Message &m){ + std::lock_guard lock(_font_mutex); + std::string type = m[0].string(); + if(_font.getName() != type) { + _font_name = type; + _change_cb(this); + _update_font = true; + console() << _name << ": change font type" << endl; + } + }); + +} + +void Voice::update() +{ + if(_update_font){ + // need to check if the font name is valide... bof... + _font = Font(_font_name, _size); + _tex = gl::TextureFont::create(_font); + _update_font = false; + } +} + +void Voice::draw(Rectf &bounds) +{ +// gl::color(_color); + vec2 offset = vec2(0); + _tex->drawStringWrapped(_utterance, bounds + offset); +} + +void VoiceAloud::setup() +{ + auto ctx = audio::master(); + + mFilter = ctx->makeNode( new audio::FilterLowPassNode ); + mGen = ctx->makeNode( new audio::GenSineNode ); + mGain = ctx->makeNode( new audio::GainNode ); + + mGen->setFreq( _freq ); + mFilter->setCutoffFreq(_freq / 2); + mFilter->setResonance(0.5f); + mGain->setValue( _amp ); + + mGen >> mFilter >> mGain >> ctx->getOutput(); + mGen->enable(); + + ctx->enable(); + +} + +void VoiceAloud::update() +{ + mGen->setFreq( _freq ); + mGain->setValue( _amp ); +} diff --git a/src/Voice.h b/src/Voice.h new file mode 100644 index 0000000..e1eaaf9 --- /dev/null +++ b/src/Voice.h @@ -0,0 +1,78 @@ +#ifndef _Voice_ +#define _Voice_ + +#include "cinder/gl/gl.h" +#include "cinder/gl/TextureFont.h" +#include "cinder/gl/GlslProg.h" +#include "cinder/osc/Osc.h" +#include "cinder/audio/Voice.h" + +#include "cinder/audio/Context.h" +#include "cinder/audio/GenNode.h" +#include "cinder/audio/GainNode.h" +#include "cinder/audio/FilterNode.h" +#include "cinder/audio/NodeEffects.h" + +#include "cinder/Timeline.h" + +using namespace ci; +using namespace ci::app; +using namespace std; + +/*- NET -*/ +using Receiver = osc::ReceiverUdp; + +/*- Voice -*/ +class Voice { +public: + Voice(std::string name, std::string channel, std::string font, int size, ColorA8u color, ColorA8u background, std::function utterance_cb, std::function change_cb) + : _name(name), + _channel(channel), + _utterance(name), + _font_name(font), + _size(size), + _color(color), + _background(background), + _utterance_cb(utterance_cb), + _change_cb(change_cb) + {}; + void setup(Receiver &receiver); + void update(); + void draw(Rectf &bounds); + + std::string _name; + std::string _channel; + std::string _utterance; + Font _font; + std::string _font_name; + ColorA8u _color; + ColorA8u _background; + int _size; + bool _update_font = false; + gl::TextureFontRef _tex; + + gl::GlslProgRef _glsl; + + std::mutex _color_mutex, _font_mutex, _utterance_mutex; + + std::function _utterance_cb, _change_cb; + + audio::VoiceRef _sound; + +}; + +class VoiceAloud { +public: + VoiceAloud(float freq, float amp) : _freq(freq), _amp(amp) {}; + void setup(); + void update(); + + audio::GenNodeRef mGen; // Gen's generate audio signals + audio::FilterLowPassNodeRef mFilter; + audio::GainNodeRef mGain; // Gain modifies the volume of the signal + + Anim _freq; + Anim _amp; +}; + +#endif /* Voice_hpp */ diff --git a/src/voicemachineApp.cpp b/src/voicemachineApp.cpp index 074b6bc..c686757 100644 --- a/src/voicemachineApp.cpp +++ b/src/voicemachineApp.cpp @@ -1,34 +1,280 @@ #include "cinder/app/App.h" #include "cinder/app/RendererGl.h" #include "cinder/gl/gl.h" +#include "cinder/gl/TextureFont.h" +#include "cinder/osc/Osc.h" +#include "cinder/Json.h" +#include "cinder/Log.h" +#include "cinder/Timeline.h" + +#include "Voice.h" using namespace ci; using namespace ci::app; using namespace std; -class voicemachineApp : public App { +int WINDOW_H = 1500; +float RATIO = 0.5625; + + +/*- NET -*/ +using Receiver = osc::ReceiverUdp; +using protocol = asio::ip::udp; + +std::string hexA(ColorA8u c) { + //https://stackoverflow.com/questions/5100718/integer-to-hex-string-in-c + uint32_t cu = c.a << 24 | c.r << 16 | c.g << 8 | c.b; + std::stringstream hex_s; + hex_s << "0x" << std::setfill ('0') << std::setw(sizeof(uint32_t)) << std::hex << cu; + return hex_s.str(); +} + +ColorA8u lerp_color(const ColorA8u &start, const ColorA8u &end, float t ) { + uint8_t r = abs(floor(start.r + (end.r - start.r) * t)); + uint8_t g = abs(floor(start.g + (end.g - start.g) * t)); + uint8_t b = abs(floor(start.b + (end.b - start.b) * t)); + uint8_t a = abs(floor(start.a + (end.a - start.a) * t)); + return ColorA8u(r, g, b, a); +} + +class VoiceMachineApp : public App { public: - void setup() override; - void mouseDown( MouseEvent event ) override; - void update() override; - void draw() override; + VoiceMachineApp(); + void setup() override; + void update() override; + void draw() override; + void cleanup() override; + + void keyDown( KeyEvent event ) override; + + void stage_config(); + void save_config(); + + void utterance(Voice* v); + void change(Voice* v); + void clear(); + + std::map _map_voices; + Voice* _current_voice = NULL; + + Anim _background = ColorA8u::black(); + Anim _voice_color = ColorA8u::white(); + +// ColorA8u _background = ColorA8u::black(); +// ColorA8u _voice_color = ColorA8u::white(); + + + /*- NET -*/ + std::shared_ptr _io_service; + std::shared_ptr _work; + std::thread _thread; + std::shared_ptr _receiver; + std::map _connections; + std::mutex _command_mutex; + +// VoiceAloud audio = VoiceAloud(100, 0.5f); + }; -void voicemachineApp::setup() +VoiceMachineApp::VoiceMachineApp() +: _io_service(new asio::io_service), + _work(new asio::io_service::work(*_io_service)) +// _receiver(PORT, protocol::v4(), *_io_service) +{} + +void VoiceMachineApp::stage_config() { + try { + const JsonTree config(loadAsset("voice.config.json")); + + // RECEIVER PORT + int port = config["port_voicemachine"].getValue(); + _receiver = std::shared_ptr(new Receiver(port, protocol::v4(), *_io_service)); + + //VOICES + for(auto &voice: config["voices"].getChildren()){ + std::string name = voice["name"].getValue(); + std::string channel = voice["osc_channel"]["root"].getValue(); + std::string font = voice["font"].getValue(); + int size = voice["size"].getValue(); + std::string hexcolor = voice["color"].getValue(); + ColorA8u color = ColorA8u::hexA(std::stoul(hexcolor, nullptr, 16)); + std::string hexbackground = voice["background"].getValue(); + ColorA background = ColorA::hexA(std::stoul(hexbackground, nullptr, 16)); + + std::function utterance_cb = [=](Voice* v) { + this->utterance(v); + }; + + std::function change_cb = [=](Voice* v) { + this->change(v); + }; + + + Voice* v = new Voice(name, channel, font, size, color, background, utterance_cb, change_cb); + _map_voices[name] = v; + +// //garbage +// _current_voice = v; + } + + std::string command_channel = config["command_osc_channel"].getValue(); + + _receiver->setListener(command_channel, + [&](const osc::Message &m){ + std::lock_guard lock(_command_mutex); + std::string cmd = m[0].string(); + + console() << "command: " << cmd << endl; + + if(cmd == "save") save_config(); + else if (cmd == "clear") clear(); + }); + + } catch (ci::Exception &exc) { + CI_LOG_D("Failed to stage config: " << exc.what()); + } + } -void voicemachineApp::mouseDown( MouseEvent event ) +void VoiceMachineApp::save_config() { + try { + JsonTree config(loadAsset("voice.config.json")); + + JsonTree voices = config.getChild("voices"); + + for(int i = 0; i < voices.getNumChildren(); i++) { + Voice* v = _map_voices[voices[i]["name"].getValue()]; + voices[i]["font"] = JsonTree("font", v->_font.getName()); + voices[i]["size"] = JsonTree("size", v->_size); + voices[i]["color"] = JsonTree("color", hexA(v->_color)); + voices[i]["background"] = JsonTree("background", hexA(v->_background)); + } + + config["voices"] = voices; + config.write(getAssetPath("voice.config.json")); + + CI_LOG_D("saved config"); + + } catch (ci::Exception &exc) { + CI_LOG_D("Failed to save config: " << exc.what()); + } } -void voicemachineApp::update() +void VoiceMachineApp::utterance(Voice* v) { + console() << "utterance : " << v->_name << endl; + if(_current_voice != v) { + _current_voice = v; + timeline().apply( &_voice_color, _current_voice->_color, 4.5f, EaseInSine(), lerp_color ); + timeline().apply( &_background, _current_voice->_background, 7.5f, EaseInCubic(), lerp_color ).appendTo(&_voice_color); + } + + } -void voicemachineApp::draw() +void VoiceMachineApp::change(Voice* v) { - gl::clear( Color( 0, 0, 0 ) ); + console() << "change : " << v->_name << endl; + _current_voice = v; + _background = _current_voice->_background; + _voice_color = _current_voice->_color; } -CINDER_APP( voicemachineApp, RendererGl ) + +void VoiceMachineApp::clear() +{ + console() << "clearing" << endl; + _current_voice = NULL; +} + +void VoiceMachineApp::setup() +{ + +// audio.setup(); + + stage_config(); + + for(const auto& [n, v]: _map_voices) + v->setup(*_receiver); + + try { + _receiver->bind(); + } catch (const osc::Exception &e) { + CI_LOG_E("Error receiver bind: " << e.what() << " - " << e.value()); + quit(); + } + + _receiver->listen( + [](asio::error_code e, protocol::endpoint end) -> bool { + if(e){ + CI_LOG_E("Error receiver listen: " << e.message() << " - " << e.value() << " - " << end); + return false; + } return true; + }); + + //3. start thread + _thread = std::thread(std::bind( + [](std::shared_ptr &service){ + service->run(); + }, _io_service)); +} + +void VoiceMachineApp::update() +{ + for(const auto& [n, v]: _map_voices) + v->update(); + +// audio.update(); +} + +void VoiceMachineApp::draw() +{ + gl::setMatricesWindow( getWindowSize() ); + gl::enableAlphaBlending(); + + gl::clear(_background.value()); + gl::color(_voice_color); + + if(_current_voice){ + Rectf bounds( 40, _current_voice->_tex->getAscent() + 40, getWindowWidth() - 40, getWindowHeight() - 40 ); + _current_voice->draw(bounds); + } +} + +void VoiceMachineApp::cleanup() +{ + _work.reset(); + _io_service->stop(); + _thread.join(); +} + +void VoiceMachineApp::keyDown( KeyEvent event ) +{ + switch( event.getChar() ) { + case 's': + { + CI_LOG_D("saving config..."); + save_config(); + break; + } +// case '-': +// mFont = Font( mFont.getName(), mFont.getSize() - 1 ); +// mTextureFont = gl::TextureFont::create( mFont ); +// break; + } +} + + + +auto settingsFunc = [](App::Settings *settings) { + settings->setMultiTouchEnabled( false ); + settings->setFrameRate(25); + settings->setWindowSize(int(WINDOW_H * RATIO), WINDOW_H ); +// settings->setFullScreen(); + //FullScreenOptions& exclusive( bool enable = true ) +}; + + +CINDER_APP( VoiceMachineApp, RendererGl, settingsFunc ) diff --git a/xcode/voicemachine.xcodeproj/project.pbxproj b/xcode/voicemachine.xcodeproj/project.pbxproj index 151992f..09b7b69 100644 --- a/xcode/voicemachine.xcodeproj/project.pbxproj +++ b/xcode/voicemachine.xcodeproj/project.pbxproj @@ -16,14 +16,12 @@ 00B784B60FF439BC000DE1D7 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00B784B20FF439BC000DE1D7 /* CoreAudio.framework */; }; 00B9955A1B128DF400A5C623 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00B995581B128DF400A5C623 /* IOKit.framework */; }; 00B9955B1B128DF400A5C623 /* IOSurface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00B995591B128DF400A5C623 /* IOSurface.framework */; }; - 5323E6B20EAFCA74003A9687 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5323E6B10EAFCA74003A9687 /* CoreVideo.framework */; }; - 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; - 4C873AE62C144407A9725762 /* Osc.h in Headers */ = {isa = PBXBuildFile; fileRef = A43DE166BACA4EFFBF60EEAD /* Osc.h */; }; - 61BC22F18F324E6E8815BD34 /* Osc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EEED49B18AF14821BF61F719 /* Osc.cpp */; }; - 9694A235FF1F47B6B3C80AEC /* voicemachine_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = BA89722D261F445CBA3D8E1C /* voicemachine_Prefix.pch */; }; - 7CFBE1F4D6B14DE585A12E16 /* CinderApp.icns in Resources */ = {isa = PBXBuildFile; fileRef = AE451D503FF042C9AE08908C /* CinderApp.icns */; }; - A6850AE63D214AEDA0375FB5 /* Resources.h in Headers */ = {isa = PBXBuildFile; fileRef = D36537B11C304E7DAA1E9FDD /* Resources.h */; }; 14BED3D2B12E45A98475E9EA /* voicemachineApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0C0230F695948E8B2D6A7B3 /* voicemachineApp.cpp */; }; + 5323E6B20EAFCA74003A9687 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5323E6B10EAFCA74003A9687 /* CoreVideo.framework */; }; + 61BC22F18F324E6E8815BD34 /* Osc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EEED49B18AF14821BF61F719 /* Osc.cpp */; }; + 7CFBE1F4D6B14DE585A12E16 /* CinderApp.icns in Resources */ = {isa = PBXBuildFile; fileRef = AE451D503FF042C9AE08908C /* CinderApp.icns */; }; + 8C053D7E27E7402800BE7270 /* Voice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C053D7D27E7402800BE7270 /* Voice.cpp */; }; + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -37,17 +35,19 @@ 00B995581B128DF400A5C623 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; 00B995591B128DF400A5C623 /* IOSurface.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOSurface.framework; path = System/Library/Frameworks/IOSurface.framework; sourceTree = SDKROOT; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 16410EF0C18C4B3D9B23B091 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 5323E6B10EAFCA74003A9687 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = /System/Library/Frameworks/CoreVideo.framework; sourceTree = ""; }; + 8C053D7C27E7402800BE7270 /* Voice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Voice.h; path = ../src/Voice.h; sourceTree = ""; }; + 8C053D7D27E7402800BE7270 /* Voice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Voice.cpp; path = ../src/Voice.cpp; sourceTree = ""; }; 8D1107320486CEB800E47090 /* voicemachine.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = voicemachine.app; sourceTree = BUILT_PRODUCTS_DIR; }; - B0C0230F695948E8B2D6A7B3 /* voicemachineApp.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.cpp; path = ../src/voicemachineApp.cpp; sourceTree = ""; name = voicemachineApp.cpp; }; - D36537B11C304E7DAA1E9FDD /* Resources.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ../include/Resources.h; sourceTree = ""; name = Resources.h; }; - AE451D503FF042C9AE08908C /* CinderApp.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = ../resources/CinderApp.icns; sourceTree = ""; name = CinderApp.icns; }; - 16410EF0C18C4B3D9B23B091 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; name = Info.plist; }; - BA89722D261F445CBA3D8E1C /* voicemachine_Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = "\"\""; path = voicemachine_Prefix.pch; sourceTree = ""; name = voicemachine_Prefix.pch; }; - EEED49B18AF14821BF61F719 /* Osc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.cpp; path = ../blocks/OSC/src/cinder/osc/Osc.cpp; sourceTree = ""; name = Osc.cpp; }; - A43DE166BACA4EFFBF60EEAD /* Osc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ../blocks/OSC/src/cinder/osc/Osc.h; sourceTree = ""; name = Osc.h; }; + A43DE166BACA4EFFBF60EEAD /* Osc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Osc.h; path = ../blocks/OSC/src/cinder/osc/Osc.h; sourceTree = ""; }; + AE451D503FF042C9AE08908C /* CinderApp.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = CinderApp.icns; path = ../resources/CinderApp.icns; sourceTree = ""; }; + B0C0230F695948E8B2D6A7B3 /* voicemachineApp.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.cpp; name = voicemachineApp.cpp; path = ../src/voicemachineApp.cpp; sourceTree = ""; }; + BA89722D261F445CBA3D8E1C /* voicemachine_Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = "\"\""; path = voicemachine_Prefix.pch; sourceTree = ""; }; + D36537B11C304E7DAA1E9FDD /* Resources.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Resources.h; path = ../include/Resources.h; sourceTree = ""; }; + EEED49B18AF14821BF61F719 /* Osc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.cpp; name = Osc.cpp; path = ../blocks/OSC/src/cinder/osc/Osc.cpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,9 +72,19 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 01B97315FEAEA392516A2CEA /* Blocks */ = { + isa = PBXGroup; + children = ( + 674D71528C1B4016B5E8F7A8 /* OSC */, + ); + name = Blocks; + sourceTree = ""; + }; 080E96DDFE201D6D7F000001 /* Source */ = { isa = PBXGroup; children = ( + 8C053D7D27E7402800BE7270 /* Voice.cpp */, + 8C053D7C27E7402800BE7270 /* Voice.h */, B0C0230F695948E8B2D6A7B3 /* voicemachineApp.cpp */, ); name = Source; @@ -128,47 +138,6 @@ name = voicemachine; sourceTree = ""; }; - A844FD97CE404410A8F0EE52 /* osc */ = { - isa = PBXGroup; - children = ( - EEED49B18AF14821BF61F719 /* Osc.cpp */, - A43DE166BACA4EFFBF60EEAD /* Osc.h */, - ); - name = osc; - sourceTree = ""; - }; - 62DA978992674AE3A1DE794A /* cinder */ = { - isa = PBXGroup; - children = ( - A844FD97CE404410A8F0EE52 /* osc */, - ); - name = cinder; - sourceTree = ""; - }; - 945EEA54632045E092AADDB7 /* src */ = { - isa = PBXGroup; - children = ( - 62DA978992674AE3A1DE794A /* cinder */, - ); - name = src; - sourceTree = ""; - }; - 674D71528C1B4016B5E8F7A8 /* OSC */ = { - isa = PBXGroup; - children = ( - 945EEA54632045E092AADDB7 /* src */, - ); - name = OSC; - sourceTree = ""; - }; - 01B97315FEAEA392516A2CEA /* Blocks */ = { - isa = PBXGroup; - children = ( - 674D71528C1B4016B5E8F7A8 /* OSC */, - ); - name = Blocks; - sourceTree = ""; - }; 29B97315FDCFA39411CA2CEA /* Headers */ = { isa = PBXGroup; children = ( @@ -196,6 +165,39 @@ name = Frameworks; sourceTree = ""; }; + 62DA978992674AE3A1DE794A /* cinder */ = { + isa = PBXGroup; + children = ( + A844FD97CE404410A8F0EE52 /* osc */, + ); + name = cinder; + sourceTree = ""; + }; + 674D71528C1B4016B5E8F7A8 /* OSC */ = { + isa = PBXGroup; + children = ( + 945EEA54632045E092AADDB7 /* src */, + ); + name = OSC; + sourceTree = ""; + }; + 945EEA54632045E092AADDB7 /* src */ = { + isa = PBXGroup; + children = ( + 62DA978992674AE3A1DE794A /* cinder */, + ); + name = src; + sourceTree = ""; + }; + A844FD97CE404410A8F0EE52 /* osc */ = { + isa = PBXGroup; + children = ( + EEED49B18AF14821BF61F719 /* Osc.cpp */, + A43DE166BACA4EFFBF60EEAD /* Osc.h */, + ); + name = osc; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -222,6 +224,8 @@ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; + attributes = { + }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "voicemachine" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; @@ -259,6 +263,7 @@ files = ( 14BED3D2B12E45A98475E9EA /* voicemachineApp.cpp in Sources */, 61BC22F18F324E6E8815BD34 /* Osc.cpp in Sources */, + 8C053D7E27E7402800BE7270 /* Voice.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -269,17 +274,17 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - DEAD_CODE_STRIPPING = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; GCC_DYNAMIC_NO_PIC = NO; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = voicemachine_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = voicemachine_Prefix.pch; GCC_SYMBOLS_PRIVATE_EXTERN = NO; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; @@ -301,12 +306,12 @@ GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; GCC_OPTIMIZATION_LEVEL = 3; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = voicemachine_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( "NDEBUG=1", "$(inherited)", ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = voicemachine_Prefix.pch; GCC_SYMBOLS_PRIVATE_EXTERN = NO; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; @@ -333,10 +338,7 @@ MACOSX_DEPLOYMENT_TARGET = 10.13; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; - USER_HEADER_SEARCH_PATHS = ( - "\"$(CINDER_PATH)/include\" ../include", - ../blocks/OSC/src, - ); + USER_HEADER_SEARCH_PATHS = "\"$(CINDER_PATH)/include\" ../include ../blocks/OSC/src"; }; name = Debug; }; @@ -352,10 +354,7 @@ HEADER_SEARCH_PATHS = "\"$(CINDER_PATH)/include\""; MACOSX_DEPLOYMENT_TARGET = 10.13; SDKROOT = macosx; - USER_HEADER_SEARCH_PATHS = ( - "\"$(CINDER_PATH)/include\" ../include", - ../blocks/OSC/src, - ); + USER_HEADER_SEARCH_PATHS = "\"$(CINDER_PATH)/include\" ../include ../blocks/OSC/src"; }; name = Release; };