aboutsummaryrefslogtreecommitdiffstats
path: root/ofxMaxim/ofxMaximiPhoneExample
diff options
context:
space:
mode:
Diffstat (limited to 'ofxMaxim/ofxMaximiPhoneExample')
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/bin/data/Default.pngbin0 -> 5518 bytes
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/bin/data/Icon.pngbin0 -> 1040 bytes
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/bin/data/beat2.wavbin0 -> 211140 bytes
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/bin/data/remoteatmos.wavbin0 -> 2798636 bytes
-rwxr-xr-xofxMaxim/ofxMaximiPhoneExample/iPhoneEmptyExample.xcodeproj/project.pbxproj909
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/iPhone_Prefix.pch8
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/install.xml35
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/fft.cpp592
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/fft.h76
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maxiFFT.cpp257
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maxiFFT.h120
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maximilian.cpp712
-rwxr-xr-xofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maximilian.h355
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/src/ofxMaxim.h50
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/ofxiphone-Info.plist36
-rw-r--r--ofxMaxim/ofxMaximiPhoneExample/src/main.mm8
-rwxr-xr-xofxMaxim/ofxMaximiPhoneExample/src/testApp.h42
-rwxr-xr-xofxMaxim/ofxMaximiPhoneExample/src/testApp.mm116
18 files changed, 3316 insertions, 0 deletions
diff --git a/ofxMaxim/ofxMaximiPhoneExample/bin/data/Default.png b/ofxMaxim/ofxMaximiPhoneExample/bin/data/Default.png
new file mode 100644
index 0000000..e782497
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/bin/data/Default.png
Binary files differ
diff --git a/ofxMaxim/ofxMaximiPhoneExample/bin/data/Icon.png b/ofxMaxim/ofxMaximiPhoneExample/bin/data/Icon.png
new file mode 100644
index 0000000..2d926c8
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/bin/data/Icon.png
Binary files differ
diff --git a/ofxMaxim/ofxMaximiPhoneExample/bin/data/beat2.wav b/ofxMaxim/ofxMaximiPhoneExample/bin/data/beat2.wav
new file mode 100644
index 0000000..c71cee6
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/bin/data/beat2.wav
Binary files differ
diff --git a/ofxMaxim/ofxMaximiPhoneExample/bin/data/remoteatmos.wav b/ofxMaxim/ofxMaximiPhoneExample/bin/data/remoteatmos.wav
new file mode 100644
index 0000000..87e3cdf
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/bin/data/remoteatmos.wav
Binary files differ
diff --git a/ofxMaxim/ofxMaximiPhoneExample/iPhoneEmptyExample.xcodeproj/project.pbxproj b/ofxMaxim/ofxMaximiPhoneExample/iPhoneEmptyExample.xcodeproj/project.pbxproj
new file mode 100755
index 0000000..dd49a5e
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/iPhoneEmptyExample.xcodeproj/project.pbxproj
@@ -0,0 +1,909 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 45;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 00EF442D12BAD6C000FF6AA4 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00EF442C12BAD6C000FF6AA4 /* Accelerate.framework */; };
+ 00FA16C112B98DFC000A9A42 /* install.xml in Resources */ = {isa = PBXBuildFile; fileRef = 00FA16B712B98DFC000A9A42 /* install.xml */; };
+ 00FA16C412B98DFC000A9A42 /* maximilian.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00FA16BD12B98DFC000A9A42 /* maximilian.cpp */; };
+ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+ 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; };
+ 5326AEA810A23A0500278DE6 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5326AEA710A23A0500278DE6 /* CoreLocation.framework */; };
+ 53F323EB10A20EDB00E0DAE4 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53F323EA10A20EDB00E0DAE4 /* OpenAL.framework */; };
+ 5E25689710ED26CC00A9501C /* CppUnit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E25687010ED26CC00A9501C /* CppUnit.a */; };
+ 5E25689810ED26CC00A9501C /* PocoFoundation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E25687110ED26CC00A9501C /* PocoFoundation.a */; };
+ 5E25689910ED26CC00A9501C /* PocoNet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E25687210ED26CC00A9501C /* PocoNet.a */; };
+ 5E25689A10ED26CC00A9501C /* PocoUtil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E25687310ED26CC00A9501C /* PocoUtil.a */; };
+ 5E25689B10ED26CC00A9501C /* PocoXML.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E25687410ED26CC00A9501C /* PocoXML.a */; };
+ 5E2568A410ED26CD00A9501C /* CppUnit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E25688010ED26CC00A9501C /* CppUnit.a */; };
+ 5E2568A510ED26CD00A9501C /* PocoFoundation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E25688110ED26CC00A9501C /* PocoFoundation.a */; };
+ 5E2568A610ED26CD00A9501C /* PocoNet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E25688210ED26CC00A9501C /* PocoNet.a */; };
+ 5E2568A710ED26CD00A9501C /* PocoUtil.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E25688310ED26CC00A9501C /* PocoUtil.a */; };
+ 5E2568A810ED26CD00A9501C /* PocoXML.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E25688410ED26CC00A9501C /* PocoXML.a */; };
+ BB16EBD20F2B2A9500518274 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB16EBD10F2B2A9500518274 /* OpenGLES.framework */; };
+ BB16EBD90F2B2AB500518274 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB16EBD80F2B2AB500518274 /* QuartzCore.framework */; };
+ BB24DD8F10DA77E000E9C588 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = BB24DD8C10DA77E000E9C588 /* Default.png */; };
+ BB24DD9010DA77E000E9C588 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BB24DD8D10DA77E000E9C588 /* Icon.png */; };
+ BB24DDCA10DA781C00E9C588 /* ofxiphone-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB24DDC910DA781C00E9C588 /* ofxiphone-Info.plist */; };
+ BBE5EAB80F49AD8400F28951 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBE5EAB70F49AD8400F28951 /* AudioToolbox.framework */; };
+ E434BF6512477ED500452519 /* freeimage-iphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E434BF6412477ED500452519 /* freeimage-iphone.a */; };
+ E434BF6812477EDE00452519 /* freeimage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E434BF6712477EDE00452519 /* freeimage.a */; };
+ E434BF7312477FBA00452519 /* freetype-iphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E434BF7212477FBA00452519 /* freetype-iphone.a */; };
+ E496D5B11252C8210098A2B3 /* glu-iphone.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E496D5AF1252C8210098A2B3 /* glu-iphone.a */; };
+ E496D5B21252C8210098A2B3 /* glu.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E496D5B01252C8210098A2B3 /* glu.a */; };
+ E49BCC7A12554CD6009F19D0 /* libofxiPhone_macosx_Debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E49BCC5012554B6A009F19D0 /* libofxiPhone_macosx_Debug.a */; };
+ E4A8229F12560AFE002F86A2 /* freetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4A8229E12560AFE002F86A2 /* freetype.a */; };
+ E4A823A412561BE3002F86A2 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4A823A312561BE3002F86A2 /* CoreGraphics.framework */; };
+ E4D8936E11527B74007E1F53 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4D8936B11527B74007E1F53 /* main.mm */; };
+ E4D8936F11527B74007E1F53 /* testApp.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4D8936D11527B74007E1F53 /* testApp.mm */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ E49BCC4F12554B6A009F19D0 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = E49BCC4812554B69009F19D0 /* iPhone+OF Lib.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = BB24DED610DA7A3F00E9C588;
+ remoteInfo = "iPhone+OF Static Library";
+ };
+ E49BCC6D12554C6C009F19D0 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = E49BCC4812554B69009F19D0 /* iPhone+OF Lib.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = BB24DE5C10DA7A3F00E9C588;
+ remoteInfo = "iPhone+OF Static Library";
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 00EF442C12BAD6C000FF6AA4 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = /System/Library/Frameworks/Accelerate.framework; sourceTree = "<absolute>"; };
+ 00FA16B712B98DFC000A9A42 /* install.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = install.xml; sourceTree = "<group>"; };
+ 00FA16BD12B98DFC000A9A42 /* maximilian.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = maximilian.cpp; sourceTree = "<group>"; };
+ 00FA16BE12B98DFC000A9A42 /* maximilian.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = maximilian.h; sourceTree = "<group>"; };
+ 00FA16C012B98DFC000A9A42 /* ofxMaxim.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ofxMaxim.h; sourceTree = "<group>"; };
+ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 1D6058910D05DD3D006BFB54 /* emptyExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = emptyExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 32CA4F630368D1EE00C91783 /* iPhone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhone_Prefix.pch; sourceTree = "<group>"; };
+ 5326AEA710A23A0500278DE6 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
+ 53F323EA10A20EDB00E0DAE4 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; };
+ 5E25687010ED26CC00A9501C /* CppUnit.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = CppUnit.a; path = ../../../libs/poco/lib/iphone/CppUnit.a; sourceTree = SOURCE_ROOT; };
+ 5E25687110ED26CC00A9501C /* PocoFoundation.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = PocoFoundation.a; path = ../../../libs/poco/lib/iphone/PocoFoundation.a; sourceTree = SOURCE_ROOT; };
+ 5E25687210ED26CC00A9501C /* PocoNet.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = PocoNet.a; path = ../../../libs/poco/lib/iphone/PocoNet.a; sourceTree = SOURCE_ROOT; };
+ 5E25687310ED26CC00A9501C /* PocoUtil.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = PocoUtil.a; path = ../../../libs/poco/lib/iphone/PocoUtil.a; sourceTree = SOURCE_ROOT; };
+ 5E25687410ED26CC00A9501C /* PocoXML.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = PocoXML.a; path = ../../../libs/poco/lib/iphone/PocoXML.a; sourceTree = SOURCE_ROOT; };
+ 5E25688010ED26CC00A9501C /* CppUnit.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = CppUnit.a; path = ../../../libs/poco/lib/osx/CppUnit.a; sourceTree = SOURCE_ROOT; };
+ 5E25688110ED26CC00A9501C /* PocoFoundation.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = PocoFoundation.a; path = ../../../libs/poco/lib/osx/PocoFoundation.a; sourceTree = SOURCE_ROOT; };
+ 5E25688210ED26CC00A9501C /* PocoNet.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = PocoNet.a; path = ../../../libs/poco/lib/osx/PocoNet.a; sourceTree = SOURCE_ROOT; };
+ 5E25688310ED26CC00A9501C /* PocoUtil.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = PocoUtil.a; path = ../../../libs/poco/lib/osx/PocoUtil.a; sourceTree = SOURCE_ROOT; };
+ 5E25688410ED26CC00A9501C /* PocoXML.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = PocoXML.a; path = ../../../libs/poco/lib/osx/PocoXML.a; sourceTree = SOURCE_ROOT; };
+ BB16EBD10F2B2A9500518274 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
+ BB16EBD80F2B2AB500518274 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ BB24DD8C10DA77E000E9C588 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
+ BB24DD8D10DA77E000E9C588 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; };
+ BB24DDC910DA781C00E9C588 /* ofxiphone-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "ofxiphone-Info.plist"; sourceTree = "<group>"; };
+ BB24DDCF10DA784F00E9C588 /* FreeImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FreeImage.h; sourceTree = "<group>"; };
+ BB24DDE210DA785000E9C588 /* ftconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftconfig.h; sourceTree = "<group>"; };
+ BB24DDE310DA785000E9C588 /* ftheader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftheader.h; sourceTree = "<group>"; };
+ BB24DDE410DA785000E9C588 /* ftmodule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftmodule.h; sourceTree = "<group>"; };
+ BB24DDE510DA785000E9C588 /* ftoption.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftoption.h; sourceTree = "<group>"; };
+ BB24DDE610DA785000E9C588 /* ftstdlib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftstdlib.h; sourceTree = "<group>"; };
+ BB24DDE710DA785000E9C588 /* freetype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = freetype.h; sourceTree = "<group>"; };
+ BB24DDE810DA785000E9C588 /* ftbbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftbbox.h; sourceTree = "<group>"; };
+ BB24DDE910DA785000E9C588 /* ftbdf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftbdf.h; sourceTree = "<group>"; };
+ BB24DDEA10DA785000E9C588 /* ftbitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftbitmap.h; sourceTree = "<group>"; };
+ BB24DDEB10DA785000E9C588 /* ftcache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftcache.h; sourceTree = "<group>"; };
+ BB24DDEC10DA785000E9C588 /* ftchapters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftchapters.h; sourceTree = "<group>"; };
+ BB24DDED10DA785000E9C588 /* fterrdef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fterrdef.h; sourceTree = "<group>"; };
+ BB24DDEE10DA785000E9C588 /* fterrors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fterrors.h; sourceTree = "<group>"; };
+ BB24DDEF10DA785000E9C588 /* ftgasp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftgasp.h; sourceTree = "<group>"; };
+ BB24DDF010DA785000E9C588 /* ftglyph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftglyph.h; sourceTree = "<group>"; };
+ BB24DDF110DA785000E9C588 /* ftgxval.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftgxval.h; sourceTree = "<group>"; };
+ BB24DDF210DA785000E9C588 /* ftgzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftgzip.h; sourceTree = "<group>"; };
+ BB24DDF310DA785000E9C588 /* ftimage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftimage.h; sourceTree = "<group>"; };
+ BB24DDF410DA785000E9C588 /* ftincrem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftincrem.h; sourceTree = "<group>"; };
+ BB24DDF510DA785000E9C588 /* ftlcdfil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftlcdfil.h; sourceTree = "<group>"; };
+ BB24DDF610DA785000E9C588 /* ftlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftlist.h; sourceTree = "<group>"; };
+ BB24DDF710DA785000E9C588 /* ftlzw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftlzw.h; sourceTree = "<group>"; };
+ BB24DDF810DA785000E9C588 /* ftmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftmac.h; sourceTree = "<group>"; };
+ BB24DDF910DA785000E9C588 /* ftmm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftmm.h; sourceTree = "<group>"; };
+ BB24DDFA10DA785000E9C588 /* ftmodapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftmodapi.h; sourceTree = "<group>"; };
+ BB24DDFB10DA785000E9C588 /* ftmoderr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftmoderr.h; sourceTree = "<group>"; };
+ BB24DDFC10DA785000E9C588 /* ftotval.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftotval.h; sourceTree = "<group>"; };
+ BB24DDFD10DA785000E9C588 /* ftoutln.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftoutln.h; sourceTree = "<group>"; };
+ BB24DDFE10DA785000E9C588 /* ftpfr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftpfr.h; sourceTree = "<group>"; };
+ BB24DDFF10DA785000E9C588 /* ftrender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftrender.h; sourceTree = "<group>"; };
+ BB24DE0010DA785000E9C588 /* ftsizes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftsizes.h; sourceTree = "<group>"; };
+ BB24DE0110DA785000E9C588 /* ftsnames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftsnames.h; sourceTree = "<group>"; };
+ BB24DE0210DA785000E9C588 /* ftstroke.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftstroke.h; sourceTree = "<group>"; };
+ BB24DE0310DA785000E9C588 /* ftsynth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftsynth.h; sourceTree = "<group>"; };
+ BB24DE0410DA785000E9C588 /* ftsystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftsystem.h; sourceTree = "<group>"; };
+ BB24DE0510DA785000E9C588 /* fttrigon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fttrigon.h; sourceTree = "<group>"; };
+ BB24DE0610DA785000E9C588 /* fttypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fttypes.h; sourceTree = "<group>"; };
+ BB24DE0710DA785000E9C588 /* ftwinfnt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftwinfnt.h; sourceTree = "<group>"; };
+ BB24DE0810DA785000E9C588 /* ftxf86.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftxf86.h; sourceTree = "<group>"; };
+ BB24DE0910DA785000E9C588 /* t1tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = t1tables.h; sourceTree = "<group>"; };
+ BB24DE0A10DA785000E9C588 /* ttnameid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ttnameid.h; sourceTree = "<group>"; };
+ BB24DE0B10DA785000E9C588 /* tttables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tttables.h; sourceTree = "<group>"; };
+ BB24DE0C10DA785000E9C588 /* tttags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tttags.h; sourceTree = "<group>"; };
+ BB24DE0D10DA785000E9C588 /* ttunpat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ttunpat.h; sourceTree = "<group>"; };
+ BB24DE0E10DA785000E9C588 /* ft2build.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ft2build.h; sourceTree = "<group>"; };
+ BBE5EAB70F49AD8400F28951 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
+ DA7851271105C039007EFC90 /* glu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = glu.h; sourceTree = "<group>"; };
+ DA7851281105C039007EFC90 /* gluos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gluos.h; sourceTree = "<group>"; };
+ E434BF6412477ED500452519 /* freeimage-iphone.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "freeimage-iphone.a"; path = "../../../libs/FreeImage/lib/iphone/freeimage-iphone.a"; sourceTree = SOURCE_ROOT; };
+ E434BF6712477EDE00452519 /* freeimage.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = freeimage.a; path = ../../../libs/FreeImage/lib/osx/freeimage.a; sourceTree = SOURCE_ROOT; };
+ E434BF7212477FBA00452519 /* freetype-iphone.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "freetype-iphone.a"; path = "../../../libs/freetype/lib/iphone/freetype-iphone.a"; sourceTree = SOURCE_ROOT; };
+ E496D5AF1252C8210098A2B3 /* glu-iphone.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "glu-iphone.a"; path = "../../../libs/glu/lib/iphone/glu-iphone.a"; sourceTree = SOURCE_ROOT; };
+ E496D5B01252C8210098A2B3 /* glu.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = glu.a; path = ../../../libs/glu/lib/iphone/glu.a; sourceTree = SOURCE_ROOT; };
+ E49BCC4812554B69009F19D0 /* iPhone+OF Lib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "iPhone+OF Lib.xcodeproj"; path = "../../../libs/openFrameworksCompiled/project/iphone/iPhone+OF Lib.xcodeproj"; sourceTree = SOURCE_ROOT; };
+ E4A8229E12560AFE002F86A2 /* freetype.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = freetype.a; path = ../../../libs/freetype/lib/osx/freetype.a; sourceTree = SOURCE_ROOT; };
+ E4A823A312561BE3002F86A2 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ E4D8936B11527B74007E1F53 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = main.mm; path = src/main.mm; sourceTree = SOURCE_ROOT; };
+ E4D8936C11527B74007E1F53 /* testApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = testApp.h; path = src/testApp.h; sourceTree = SOURCE_ROOT; };
+ E4D8936D11527B74007E1F53 /* testApp.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = testApp.mm; path = src/testApp.mm; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E49BCC7A12554CD6009F19D0 /* libofxiPhone_macosx_Debug.a in Frameworks */,
+ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
+ 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */,
+ BB16EBD20F2B2A9500518274 /* OpenGLES.framework in Frameworks */,
+ BB16EBD90F2B2AB500518274 /* QuartzCore.framework in Frameworks */,
+ BBE5EAB80F49AD8400F28951 /* AudioToolbox.framework in Frameworks */,
+ 53F323EB10A20EDB00E0DAE4 /* OpenAL.framework in Frameworks */,
+ 5326AEA810A23A0500278DE6 /* CoreLocation.framework in Frameworks */,
+ 5E25689710ED26CC00A9501C /* CppUnit.a in Frameworks */,
+ 5E25689810ED26CC00A9501C /* PocoFoundation.a in Frameworks */,
+ 5E25689910ED26CC00A9501C /* PocoNet.a in Frameworks */,
+ 5E25689A10ED26CC00A9501C /* PocoUtil.a in Frameworks */,
+ 5E25689B10ED26CC00A9501C /* PocoXML.a in Frameworks */,
+ 5E2568A410ED26CD00A9501C /* CppUnit.a in Frameworks */,
+ 5E2568A510ED26CD00A9501C /* PocoFoundation.a in Frameworks */,
+ 5E2568A610ED26CD00A9501C /* PocoNet.a in Frameworks */,
+ 5E2568A710ED26CD00A9501C /* PocoUtil.a in Frameworks */,
+ 5E2568A810ED26CD00A9501C /* PocoXML.a in Frameworks */,
+ E434BF6512477ED500452519 /* freeimage-iphone.a in Frameworks */,
+ E434BF6812477EDE00452519 /* freeimage.a in Frameworks */,
+ E434BF7312477FBA00452519 /* freetype-iphone.a in Frameworks */,
+ E496D5B11252C8210098A2B3 /* glu-iphone.a in Frameworks */,
+ E496D5B21252C8210098A2B3 /* glu.a in Frameworks */,
+ E4A8229F12560AFE002F86A2 /* freetype.a in Frameworks */,
+ E4A823A412561BE3002F86A2 /* CoreGraphics.framework in Frameworks */,
+ 00EF442D12BAD6C000FF6AA4 /* Accelerate.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 00FA16B612B98DFC000A9A42 /* ofxMaxim */ = {
+ isa = PBXGroup;
+ children = (
+ 00FA16B712B98DFC000A9A42 /* install.xml */,
+ 00FA16B812B98DFC000A9A42 /* libs */,
+ 00FA16BF12B98DFC000A9A42 /* src */,
+ );
+ path = ofxMaxim;
+ sourceTree = "<group>";
+ };
+ 00FA16B812B98DFC000A9A42 /* libs */ = {
+ isa = PBXGroup;
+ children = (
+ 00FA16BD12B98DFC000A9A42 /* maximilian.cpp */,
+ 00FA16BE12B98DFC000A9A42 /* maximilian.h */,
+ );
+ path = libs;
+ sourceTree = "<group>";
+ };
+ 00FA16BF12B98DFC000A9A42 /* src */ = {
+ isa = PBXGroup;
+ children = (
+ 00FA16C012B98DFC000A9A42 /* ofxMaxim.h */,
+ );
+ path = src;
+ sourceTree = "<group>";
+ };
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 1D6058910D05DD3D006BFB54 /* emptyExample.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
+ isa = PBXGroup;
+ children = (
+ BB24DDC910DA781C00E9C588 /* ofxiphone-Info.plist */,
+ E4D8936A11527B74007E1F53 /* src */,
+ BB24DD8B10DA77E000E9C588 /* data */,
+ BB24E1F710DAA51900E9C588 /* openFrameworks */,
+ BB16F26B0F2B646B00518274 /* addons */,
+ BB16E9930F2B1E5900518274 /* libs */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ );
+ name = CustomTemplate;
+ sourceTree = "<group>";
+ };
+ 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 32CA4F630368D1EE00C91783 /* iPhone_Prefix.pch */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ 29B97323FDCFA39411CA2CEA /* core frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 53F323EA10A20EDB00E0DAE4 /* OpenAL.framework */,
+ E4A823A312561BE3002F86A2 /* CoreGraphics.framework */,
+ BBE5EAB70F49AD8400F28951 /* AudioToolbox.framework */,
+ BB16EBD80F2B2AB500518274 /* QuartzCore.framework */,
+ BB16EBD10F2B2A9500518274 /* OpenGLES.framework */,
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
+ 1D30AB110D05D00D00671497 /* Foundation.framework */,
+ 288765FC0DF74451002DB57D /* CoreGraphics.framework */,
+ 5326AEA710A23A0500278DE6 /* CoreLocation.framework */,
+ 00EF442C12BAD6C000FF6AA4 /* Accelerate.framework */,
+ );
+ name = "core frameworks";
+ sourceTree = "<group>";
+ };
+ 5E25686A10ED26BE00A9501C /* poco */ = {
+ isa = PBXGroup;
+ children = (
+ 5E25686E10ED26CC00A9501C /* lib */,
+ );
+ name = poco;
+ sourceTree = "<group>";
+ };
+ 5E25686E10ED26CC00A9501C /* lib */ = {
+ isa = PBXGroup;
+ children = (
+ 5E25686F10ED26CC00A9501C /* iphone */,
+ 5E25687F10ED26CC00A9501C /* osx */,
+ );
+ name = lib;
+ path = ../../../libs/poco/lib;
+ sourceTree = SOURCE_ROOT;
+ };
+ 5E25686F10ED26CC00A9501C /* iphone */ = {
+ isa = PBXGroup;
+ children = (
+ 5E25687010ED26CC00A9501C /* CppUnit.a */,
+ 5E25687110ED26CC00A9501C /* PocoFoundation.a */,
+ 5E25687210ED26CC00A9501C /* PocoNet.a */,
+ 5E25687310ED26CC00A9501C /* PocoUtil.a */,
+ 5E25687410ED26CC00A9501C /* PocoXML.a */,
+ );
+ name = iphone;
+ path = ../../../libs/poco/lib/iphone;
+ sourceTree = SOURCE_ROOT;
+ };
+ 5E25687F10ED26CC00A9501C /* osx */ = {
+ isa = PBXGroup;
+ children = (
+ 5E25688010ED26CC00A9501C /* CppUnit.a */,
+ 5E25688110ED26CC00A9501C /* PocoFoundation.a */,
+ 5E25688210ED26CC00A9501C /* PocoNet.a */,
+ 5E25688310ED26CC00A9501C /* PocoUtil.a */,
+ 5E25688410ED26CC00A9501C /* PocoXML.a */,
+ );
+ name = osx;
+ path = ../../../libs/poco/lib/osx;
+ sourceTree = SOURCE_ROOT;
+ };
+ BB16E9930F2B1E5900518274 /* libs */ = {
+ isa = PBXGroup;
+ children = (
+ BBE5E94E0F497BD800F28951 /* core */,
+ );
+ name = libs;
+ sourceTree = "<group>";
+ };
+ BB16F26B0F2B646B00518274 /* addons */ = {
+ isa = PBXGroup;
+ children = (
+ 00FA16B612B98DFC000A9A42 /* ofxMaxim */,
+ );
+ name = addons;
+ sourceTree = "<group>";
+ };
+ BB24DD8B10DA77E000E9C588 /* data */ = {
+ isa = PBXGroup;
+ children = (
+ BB24DD8C10DA77E000E9C588 /* Default.png */,
+ BB24DD8D10DA77E000E9C588 /* Icon.png */,
+ );
+ name = data;
+ path = bin/data;
+ sourceTree = "<group>";
+ };
+ BB24DDCD10DA784F00E9C588 /* FreeImage */ = {
+ isa = PBXGroup;
+ children = (
+ BB24DDCE10DA784F00E9C588 /* include */,
+ BB24DDD010DA784F00E9C588 /* lib */,
+ );
+ name = FreeImage;
+ path = ../../../libs/FreeImage;
+ sourceTree = SOURCE_ROOT;
+ };
+ BB24DDCE10DA784F00E9C588 /* include */ = {
+ isa = PBXGroup;
+ children = (
+ BB24DDCF10DA784F00E9C588 /* FreeImage.h */,
+ );
+ path = include;
+ sourceTree = "<group>";
+ };
+ BB24DDD010DA784F00E9C588 /* lib */ = {
+ isa = PBXGroup;
+ children = (
+ E434BF6612477EDE00452519 /* osx */,
+ BB24DDD110DA784F00E9C588 /* iphone */,
+ );
+ path = lib;
+ sourceTree = "<group>";
+ };
+ BB24DDD110DA784F00E9C588 /* iphone */ = {
+ isa = PBXGroup;
+ children = (
+ E434BF6412477ED500452519 /* freeimage-iphone.a */,
+ );
+ path = iphone;
+ sourceTree = "<group>";
+ };
+ BB24DDDD10DA785000E9C588 /* freetype */ = {
+ isa = PBXGroup;
+ children = (
+ BB24DDDE10DA785000E9C588 /* include */,
+ BB24DE1110DA785000E9C588 /* lib */,
+ );
+ name = freetype;
+ path = ../../../libs/freetype;
+ sourceTree = SOURCE_ROOT;
+ };
+ BB24DDDE10DA785000E9C588 /* include */ = {
+ isa = PBXGroup;
+ children = (
+ BB24DDDF10DA785000E9C588 /* freetype2 */,
+ BB24DE0E10DA785000E9C588 /* ft2build.h */,
+ );
+ path = include;
+ sourceTree = "<group>";
+ };
+ BB24DDDF10DA785000E9C588 /* freetype2 */ = {
+ isa = PBXGroup;
+ children = (
+ BB24DDE010DA785000E9C588 /* freetype */,
+ );
+ path = freetype2;
+ sourceTree = "<group>";
+ };
+ BB24DDE010DA785000E9C588 /* freetype */ = {
+ isa = PBXGroup;
+ children = (
+ BB24DDE110DA785000E9C588 /* config */,
+ BB24DDE710DA785000E9C588 /* freetype.h */,
+ BB24DDE810DA785000E9C588 /* ftbbox.h */,
+ BB24DDE910DA785000E9C588 /* ftbdf.h */,
+ BB24DDEA10DA785000E9C588 /* ftbitmap.h */,
+ BB24DDEB10DA785000E9C588 /* ftcache.h */,
+ BB24DDEC10DA785000E9C588 /* ftchapters.h */,
+ BB24DDED10DA785000E9C588 /* fterrdef.h */,
+ BB24DDEE10DA785000E9C588 /* fterrors.h */,
+ BB24DDEF10DA785000E9C588 /* ftgasp.h */,
+ BB24DDF010DA785000E9C588 /* ftglyph.h */,
+ BB24DDF110DA785000E9C588 /* ftgxval.h */,
+ BB24DDF210DA785000E9C588 /* ftgzip.h */,
+ BB24DDF310DA785000E9C588 /* ftimage.h */,
+ BB24DDF410DA785000E9C588 /* ftincrem.h */,
+ BB24DDF510DA785000E9C588 /* ftlcdfil.h */,
+ BB24DDF610DA785000E9C588 /* ftlist.h */,
+ BB24DDF710DA785000E9C588 /* ftlzw.h */,
+ BB24DDF810DA785000E9C588 /* ftmac.h */,
+ BB24DDF910DA785000E9C588 /* ftmm.h */,
+ BB24DDFA10DA785000E9C588 /* ftmodapi.h */,
+ BB24DDFB10DA785000E9C588 /* ftmoderr.h */,
+ BB24DDFC10DA785000E9C588 /* ftotval.h */,
+ BB24DDFD10DA785000E9C588 /* ftoutln.h */,
+ BB24DDFE10DA785000E9C588 /* ftpfr.h */,
+ BB24DDFF10DA785000E9C588 /* ftrender.h */,
+ BB24DE0010DA785000E9C588 /* ftsizes.h */,
+ BB24DE0110DA785000E9C588 /* ftsnames.h */,
+ BB24DE0210DA785000E9C588 /* ftstroke.h */,
+ BB24DE0310DA785000E9C588 /* ftsynth.h */,
+ BB24DE0410DA785000E9C588 /* ftsystem.h */,
+ BB24DE0510DA785000E9C588 /* fttrigon.h */,
+ BB24DE0610DA785000E9C588 /* fttypes.h */,
+ BB24DE0710DA785000E9C588 /* ftwinfnt.h */,
+ BB24DE0810DA785000E9C588 /* ftxf86.h */,
+ BB24DE0910DA785000E9C588 /* t1tables.h */,
+ BB24DE0A10DA785000E9C588 /* ttnameid.h */,
+ BB24DE0B10DA785000E9C588 /* tttables.h */,
+ BB24DE0C10DA785000E9C588 /* tttags.h */,
+ BB24DE0D10DA785000E9C588 /* ttunpat.h */,
+ );
+ path = freetype;
+ sourceTree = "<group>";
+ };
+ BB24DDE110DA785000E9C588 /* config */ = {
+ isa = PBXGroup;
+ children = (
+ BB24DDE210DA785000E9C588 /* ftconfig.h */,
+ BB24DDE310DA785000E9C588 /* ftheader.h */,
+ BB24DDE410DA785000E9C588 /* ftmodule.h */,
+ BB24DDE510DA785000E9C588 /* ftoption.h */,
+ BB24DDE610DA785000E9C588 /* ftstdlib.h */,
+ );
+ path = config;
+ sourceTree = "<group>";
+ };
+ BB24DE1110DA785000E9C588 /* lib */ = {
+ isa = PBXGroup;
+ children = (
+ E4A8229D12560AFE002F86A2 /* osx */,
+ BB24DE1210DA785000E9C588 /* iphone */,
+ );
+ path = lib;
+ sourceTree = "<group>";
+ };
+ BB24DE1210DA785000E9C588 /* iphone */ = {
+ isa = PBXGroup;
+ children = (
+ E434BF7212477FBA00452519 /* freetype-iphone.a */,
+ );
+ path = iphone;
+ sourceTree = "<group>";
+ };
+ BB24DE1F10DA785000E9C588 /* glu */ = {
+ isa = PBXGroup;
+ children = (
+ DA7851261105C039007EFC90 /* include_iphone */,
+ BB24DE2510DA785000E9C588 /* lib */,
+ );
+ name = glu;
+ path = ../../../libs/glu;
+ sourceTree = SOURCE_ROOT;
+ };
+ BB24DE2510DA785000E9C588 /* lib */ = {
+ isa = PBXGroup;
+ children = (
+ BB24DE2610DA785000E9C588 /* iphone */,
+ );
+ path = lib;
+ sourceTree = "<group>";
+ };
+ BB24DE2610DA785000E9C588 /* iphone */ = {
+ isa = PBXGroup;
+ children = (
+ E496D5AF1252C8210098A2B3 /* glu-iphone.a */,
+ E496D5B01252C8210098A2B3 /* glu.a */,
+ );
+ path = iphone;
+ sourceTree = "<group>";
+ };
+ BB24E1F710DAA51900E9C588 /* openFrameworks */ = {
+ isa = PBXGroup;
+ children = (
+ E49BCC4812554B69009F19D0 /* iPhone+OF Lib.xcodeproj */,
+ );
+ name = openFrameworks;
+ sourceTree = "<group>";
+ };
+ BB3F144E0F4C6BF200A33527 /* core libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 5E25686A10ED26BE00A9501C /* poco */,
+ BB24DDCD10DA784F00E9C588 /* FreeImage */,
+ BB24DDDD10DA785000E9C588 /* freetype */,
+ BB24DE1F10DA785000E9C588 /* glu */,
+ 29B97315FDCFA39411CA2CEA /* Other Sources */,
+ );
+ name = "core libraries";
+ sourceTree = "<group>";
+ };
+ BBE5E94E0F497BD800F28951 /* core */ = {
+ isa = PBXGroup;
+ children = (
+ BB3F144E0F4C6BF200A33527 /* core libraries */,
+ 29B97323FDCFA39411CA2CEA /* core frameworks */,
+ );
+ name = core;
+ sourceTree = "<group>";
+ };
+ DA7851261105C039007EFC90 /* include_iphone */ = {
+ isa = PBXGroup;
+ children = (
+ DA7851271105C039007EFC90 /* glu.h */,
+ DA7851281105C039007EFC90 /* gluos.h */,
+ );
+ path = include_iphone;
+ sourceTree = "<group>";
+ };
+ E434BF6612477EDE00452519 /* osx */ = {
+ isa = PBXGroup;
+ children = (
+ E434BF6712477EDE00452519 /* freeimage.a */,
+ );
+ name = osx;
+ path = ../../../libs/FreeImage/lib/osx;
+ sourceTree = SOURCE_ROOT;
+ };
+ E49BCC4912554B69009F19D0 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ E49BCC5012554B6A009F19D0 /* libofxiPhone_macosx_Debug.a */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ E4A8229D12560AFE002F86A2 /* osx */ = {
+ isa = PBXGroup;
+ children = (
+ E4A8229E12560AFE002F86A2 /* freetype.a */,
+ );
+ name = osx;
+ path = ../../../libs/freetype/lib/osx;
+ sourceTree = SOURCE_ROOT;
+ };
+ E4D8936A11527B74007E1F53 /* src */ = {
+ isa = PBXGroup;
+ children = (
+ E4D8936B11527B74007E1F53 /* main.mm */,
+ E4D8936D11527B74007E1F53 /* testApp.mm */,
+ E4D8936C11527B74007E1F53 /* testApp.h */,
+ );
+ path = src;
+ sourceTree = SOURCE_ROOT;
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 1D6058900D05DD3D006BFB54 /* emptyExample */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "emptyExample" */;
+ buildPhases = (
+ 1D60588D0D05DD3D006BFB54 /* Resources */,
+ 1D60588E0D05DD3D006BFB54 /* Sources */,
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */,
+ 9255DD331112741900D6945E /* ShellScript */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ E49BCC6E12554C6C009F19D0 /* PBXTargetDependency */,
+ );
+ name = emptyExample;
+ productName = iPhone;
+ productReference = 1D6058910D05DD3D006BFB54 /* emptyExample.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "iPhoneEmptyExample" */;
+ compatibilityVersion = "Xcode 3.1";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
+ projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = E49BCC4912554B69009F19D0 /* Products */;
+ ProjectRef = E49BCC4812554B69009F19D0 /* iPhone+OF Lib.xcodeproj */;
+ },
+ );
+ projectRoot = "";
+ targets = (
+ 1D6058900D05DD3D006BFB54 /* emptyExample */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+ E49BCC5012554B6A009F19D0 /* libofxiPhone_macosx_Debug.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libofxiPhone_macosx_Debug.a;
+ remoteRef = E49BCC4F12554B6A009F19D0 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 1D60588D0D05DD3D006BFB54 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ BB24DD8F10DA77E000E9C588 /* Default.png in Resources */,
+ BB24DD9010DA77E000E9C588 /* Icon.png in Resources */,
+ BB24DDCA10DA781C00E9C588 /* ofxiphone-Info.plist in Resources */,
+ 00FA16C112B98DFC000A9A42 /* install.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 9255DD331112741900D6945E /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "cp -rf bin/data/ \"$TARGET_BUILD_DIR/$PRODUCT_NAME.app\"\n";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 1D60588E0D05DD3D006BFB54 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ E4D8936E11527B74007E1F53 /* main.mm in Sources */,
+ E4D8936F11527B74007E1F53 /* testApp.mm in Sources */,
+ 00FA16C412B98DFC000A9A42 /* maximilian.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ E49BCC6E12554C6C009F19D0 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = "iPhone+OF Static Library";
+ targetProxy = E49BCC6D12554C6C009F19D0 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 1D6058940D05DD3E006BFB54 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = iPhone_Prefix.pch;
+ GCC_THUMB_SUPPORT = NO;
+ INFOPLIST_FILE = "ofxiphone-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 4.2;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../libs/freetype/lib/osx\"",
+ );
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ 1D6058950D05DD3E006BFB54 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = iPhone_Prefix.pch;
+ GCC_THUMB_SUPPORT = NO;
+ INFOPLIST_FILE = "ofxiphone-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 4.2;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../libs/freetype/lib/osx\"",
+ );
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = iphoneos;
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMPRESS_PNG_FILES = NO;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_THUMB_SUPPORT = NO;
+ GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+ GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = NO;
+ GCC_WARN_ABOUT_POINTER_SIGNEDNESS = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO;
+ GCC_WARN_PROTOTYPE_CONVERSION = NO;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ ../../../libs/poco/include,
+ "../../../addons/ofxAccelerometer/**",
+ "../../../addons/ofxMultitouch/**",
+ "../../../addons/ofxiPhone/**",
+ "../../../libs/openFrameworks/**",
+ "../../../libs/freetype/**",
+ );
+ IPHONEOS_DEPLOYMENT_TARGET = 4.2;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../libs/freetype/lib\"",
+ "\"$(SRCROOT)/../../../libs/freeimage/lib\"",
+ "\"$(SRCROOT)/../../../libs/FreeImage/lib/iphone\"",
+ "\"$(SRCROOT)/../../../libs/FreeImage/lib/osx\"",
+ "\"$(SRCROOT)/../../../libs/freetype/lib/iphone\"",
+ "\"$(SRCROOT)/../../../libs/freetype/lib/osx\"",
+ "\"$(SRCROOT)/../../../libs/glu/lib/iphone\"",
+ "\"$(SRCROOT)/../../../libs/poco/lib/osx\"",
+ "\"$(SRCROOT)/../../../libs/poco/lib/iphone\"",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 10.5;
+ ONLY_ACTIVE_ARCH = NO;
+ OTHER_LDFLAGS = "-ObjC";
+ PREBINDING = NO;
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos4.2;
+ TARGETED_DEVICE_FAMILY = 1;
+ WARNING_LDFLAGS = "";
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMPRESS_PNG_FILES = NO;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_DYNAMIC_NO_PIC = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_THUMB_SUPPORT = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ ../../../libs/poco/include,
+ "../../../addons/ofxAccelerometer/**",
+ "../../../addons/ofxMultitouch/**",
+ "../../../addons/ofxiPhone/**",
+ "../../../libs/openFrameworks/**",
+ "../../../libs/freetype/**",
+ );
+ IPHONEOS_DEPLOYMENT_TARGET = 4.2;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../libs/freetype/lib\"",
+ "\"$(SRCROOT)/../../../libs/freeimage/lib\"",
+ "\"$(SRCROOT)/../../../libs/FreeImage/lib/iphone\"",
+ "\"$(SRCROOT)/../../../libs/FreeImage/lib/osx\"",
+ "\"$(SRCROOT)/../../../libs/freetype/lib/iphone\"",
+ "\"$(SRCROOT)/../../../libs/freetype/lib/osx\"",
+ "\"$(SRCROOT)/../../../libs/glu/lib/iphone\"",
+ "\"$(SRCROOT)/../../../libs/poco/lib/osx\"",
+ "\"$(SRCROOT)/../../../libs/poco/lib/iphone\"",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 10.5;
+ ONLY_ACTIVE_ARCH = NO;
+ OTHER_LDFLAGS = "-ObjC";
+ PREBINDING = NO;
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos4.2;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Release;
+ };
+ E49BCC2F12554938009F19D0 /* ReleaseArmv7 */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COMPRESS_PNG_FILES = NO;
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_DYNAMIC_NO_PIC = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_THUMB_SUPPORT = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = (
+ ../../../libs/poco/include,
+ "../../../addons/ofxAccelerometer/**",
+ "../../../addons/ofxMultitouch/**",
+ "../../../addons/ofxiPhone/**",
+ "../../../libs/openFrameworks/**",
+ "../../../libs/freetype/**",
+ );
+ IPHONEOS_DEPLOYMENT_TARGET = 4.2;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../libs/freetype/lib\"",
+ "\"$(SRCROOT)/../../../libs/freeimage/lib\"",
+ "\"$(SRCROOT)/../../../libs/FreeImage/lib/iphone\"",
+ "\"$(SRCROOT)/../../../libs/FreeImage/lib/osx\"",
+ "\"$(SRCROOT)/../../../libs/freetype/lib/iphone\"",
+ "\"$(SRCROOT)/../../../libs/freetype/lib/osx\"",
+ "\"$(SRCROOT)/../../../libs/glu/lib/iphone\"",
+ "\"$(SRCROOT)/../../../libs/poco/lib/osx\"",
+ "\"$(SRCROOT)/../../../libs/poco/lib/iphone\"",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 10.5;
+ ONLY_ACTIVE_ARCH = NO;
+ OTHER_LDFLAGS = "-ObjC";
+ PREBINDING = NO;
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
+ SDKROOT = iphoneos4.2;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = ReleaseArmv7;
+ };
+ E49BCC3012554938009F19D0 /* ReleaseArmv7 */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = iPhone_Prefix.pch;
+ GCC_THUMB_SUPPORT = NO;
+ INFOPLIST_FILE = "ofxiphone-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 4.2;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../libs/freetype/lib/osx\"",
+ );
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = iphoneos;
+ };
+ name = ReleaseArmv7;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "emptyExample" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1D6058940D05DD3E006BFB54 /* Debug */,
+ 1D6058950D05DD3E006BFB54 /* Release */,
+ E49BCC3012554938009F19D0 /* ReleaseArmv7 */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "iPhoneEmptyExample" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ C01FCF5008A954540054247B /* Release */,
+ E49BCC2F12554938009F19D0 /* ReleaseArmv7 */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
diff --git a/ofxMaxim/ofxMaximiPhoneExample/iPhone_Prefix.pch b/ofxMaxim/ofxMaximiPhoneExample/iPhone_Prefix.pch
new file mode 100644
index 0000000..fd3401c
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/iPhone_Prefix.pch
@@ -0,0 +1,8 @@
+//
+// Prefix header for all source files of the 'iPhone' target in the 'iPhone' project
+//
+
+#ifdef __OBJC__
+ #import <Foundation/Foundation.h>
+ #import <UIKit/UIKit.h>
+#endif
diff --git a/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/install.xml b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/install.xml
new file mode 100644
index 0000000..58923be
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/install.xml
@@ -0,0 +1,35 @@
+<install>
+ <version>0.1</version>
+ <author>Goldsmiths Creative Computing</author>
+ <url>http://www.maximilian.strangeloop.co.uk/</url>
+ <requires></requires>
+
+
+ <add>
+ <!-- ===================================================================== -->
+ <!-- ========================== add per project using this addon ========= -->
+ <!-- ===================================================================== -->
+
+ <src>
+
+ <folder name="addons/ofxMaxim/src">
+ <file>../../../addons/ofxMaxim/src/ofxMaxim.h</file>
+ </folder>
+
+ <folder name="addons/ofxMaxim/libs">
+ <file>../../../addons/ofxMaxim/libs/fft.h</file>
+ <file>../../../addons/ofxMaxim/libs/fft.cpp</file>
+ <file>../../../addons/ofxMaxim/libs/fftOctaveAnalyzer.h</file>
+ <file>../../../addons/ofxMaxim/libs/fftOctaveAnalyzer.cpp</file>
+ <file>../../../addons/ofxMaxim/libs/maximilian.h</file>
+ <file>../../../addons/ofxMaxim/libs/maximilian.cpp</file>
+ </folder>
+
+ </src>
+
+ <include>
+ <path>../../../addons/ofxMaxim/src</path>
+ <path>../../../addons/ofxMaxim/libs</path>
+ </include>
+ </add>
+</install> \ No newline at end of file
diff --git a/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/fft.cpp b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/fft.cpp
new file mode 100644
index 0000000..e19498d
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/fft.cpp
@@ -0,0 +1,592 @@
+/*
+ * maximilian
+ * platform independent synthesis library using portaudio or rtaudio
+ *
+ * Created by Mick Grierson on 29/12/2009.
+ * Copyright 2009 Mick Grierson & Strangeloop Limited. All rights reserved.
+ * Thanks to the Goldsmiths Creative Computing Team.
+ * Special thanks to Arturo Castro for the PortAudio implementation.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+/*
+
+ fft.cpp
+
+ Based on K+R Numerical recipes in C and some other stuff hacked about.
+
+ */
+
+#include "fft.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+
+int **gFFTBitTable = NULL;
+const int MaxFastBits = 16;
+
+int IsPowerOfTwo(int x)
+{
+ if (x < 2)
+ return false;
+
+ if (x & (x - 1))
+ 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];
+ //use malloc for 16 byte alignment
+ gFFTBitTable = (int**) malloc(MaxFastBits * sizeof(int*));
+
+ int len = 2;
+ for (int b = 1; b <= MaxFastBits; b++) {
+
+// gFFTBitTable[b - 1] = new int[len];
+ gFFTBitTable[b - 1] = (int*) malloc(len * sizeof(int));
+
+ 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 = (float*) malloc(Half * sizeof(float));
+ float *tmpImag = (float*) malloc(Half * sizeof(float));
+
+ 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 "Rectangular";
+ case 1:
+ return "Bartlett";
+ case 2:
+ return "Hamming";
+ case 3:
+ return "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));
+ }
+}
+
+void fft::genWindow(int whichFunction, int NumSamples, float *window)
+{
+ int i;
+
+ if (whichFunction == 1) {
+ // Bartlett (triangular) window
+ for (i = 0; i < NumSamples / 2; i++) {
+ window[i] = (i / (float) (NumSamples / 2));
+ window[i + (NumSamples / 2)] =
+ (1.0 - (i / (float) (NumSamples / 2)));
+ }
+ }
+
+ if (whichFunction == 2) {
+ // Hamming
+ for (i = 0; i < NumSamples; i++)
+ window[i] = 0.54 - 0.46 * cos(2 * M_PI * i / (NumSamples - 1));
+ }
+
+ if (whichFunction == 3) {
+ // Hanning
+ for (i = 0; i < NumSamples; i++)
+ window[i] = 0.50 - 0.50 * cos(2 * M_PI * i / (NumSamples - 1));
+ }
+}
+
+/* constructor */
+fft::fft(int fftSize) {
+ n = fftSize;
+ half = fftSize / 2;
+ //use malloc for 16 byte alignment
+ in_real = (float *) malloc(n * sizeof(float));
+ in_img = (float *) malloc(n * sizeof(float));
+ out_real = (float *) malloc(n * sizeof(float));
+ out_img = (float *) malloc(n * sizeof(float));
+
+#ifdef __APPLE_CC__
+ log2n = log2(n);
+ A.realp = (float *) malloc(half * sizeof(float));
+ A.imagp = (float *) malloc(half * sizeof(float));
+ setupReal = vDSP_create_fftsetup(log2n, FFT_RADIX2);
+ if (setupReal == NULL) {
+ printf("\nFFT_Setup failed to allocate enough memory for"
+ "the real FFT.\n");
+ }
+ polar = (float *) malloc(n * sizeof(float));
+#endif
+}
+
+/* destructor */
+fft::~fft() {
+ delete[] in_real, out_real, in_img, out_img;
+#ifdef __APPLE_CC__
+ vDSP_destroy_fftsetup(setupReal);
+ delete[] A.realp;
+ delete[] A.imagp;
+ delete[] polar;
+#endif
+
+}
+
+/* Calculate the power spectrum */
+void fft::powerSpectrum(int start, float *data, float *window, float *magnitude,float *phase, float *power, float *avg_power) {
+ int i;
+ float total_power = 0.0f;
+
+
+ //windowing
+ for (i = 0; i < n; i++) {
+ in_real[i] = data[start + i] * window[i];
+ }
+
+
+ RealFFT(n, 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]);
+
+ if (magnitude[i] < 0.000001){ // less than 0.1 nV
+ magnitude[i] = 0; // out of range
+ } else {
+ magnitude[i] = 20.0*log10(magnitude[i] + 1); // get to to db scale
+ }
+ phase[i] = atan2(out_img[i],out_real[i]);
+ }
+ /* calculate average power */
+ *(avg_power) = total_power / (float) half;
+
+}
+
+#ifdef __APPLE_CC__
+
+/* Calculate the power spectrum */
+void fft::powerSpectrum_vdsp(int start, float *data, float *window, float *magnitude,float *phase) {
+
+ uint32_t i;
+
+ //multiply by window
+ vDSP_vmul(data, 1, window, 1, in_real, 1, n);
+
+ //convert to split complex format - evens and odds
+ vDSP_ctoz((COMPLEX *) in_real, 2, &A, 1, half);
+
+
+ //calc fft
+ vDSP_fft_zrip(setupReal, &A, 1, log2n, FFT_FORWARD);
+
+ //scale by 2 (see vDSP docs)
+ static float scale=0.5;
+ vDSP_vsmul(A.realp, 1, &scale, A.realp, 1, half);
+ vDSP_vsmul(A.imagp, 1, &scale, A.imagp, 1, half);
+
+ //back to split complex format
+ vDSP_ztoc(&A, 1, (COMPLEX*) out_real, 2, half);
+
+ //convert to polar
+ vDSP_polar(out_real, 2, polar, 2, half);
+
+ for (i = 0; i < half; i++) {
+ magnitude[i]=polar[2*i]+1.0;
+ phase[i]=polar[2*i + 1];
+ }
+ float ref = 1.0;
+ vDSP_vdbcon(magnitude, 1, &ref, magnitude, 1, half, 1);
+
+
+
+}
+
+#endif
+
+void fft::inversePowerSpectrum(int start, float *finalOut, float *window, float *magnitude,float *phase) {
+ int i;
+
+ /* get real and imag part */
+ for (i = 0; i < half; i++) {
+ float mag = pow(10.0, magnitude[i] / 20.0) - 1.0;
+ in_real[i] = mag *cos(phase[i]);
+ in_img[i] = mag *sin(phase[i]);
+ }
+
+ /* zero negative frequencies */
+ memset(in_real+half, half, 0.0);
+ memset(in_img+half, half, 0.0);
+
+ FFT(n, 1, in_real, in_img, out_real, out_img); // second parameter indicates inverse transform
+
+ for (i = 0; i < n; i++) {
+ finalOut[start + i] += out_real[i] * window[i]
+ ;
+ }
+
+}
+
+
+#ifdef __APPLE_CC__
+void fft::inversePowerSpectrum_vdsp(int start, float *finalOut, float *window, float *magnitude,float *phase) {
+ uint32_t i;
+
+ for (i = 0; i < half; i++) {
+ polar[2*i] = pow(10.0, magnitude[i] / 20.0) - 1.0;
+ polar[2*i + 1] = phase[i];
+ }
+
+ vDSP_rect(polar, 2, in_real, 2, half);
+
+ vDSP_ctoz((COMPLEX*) in_real, 2, &A, 1, half);
+ vDSP_fft_zrip(setupReal, &A, 1, log2n, FFT_INVERSE);
+ vDSP_ztoc(&A, 1, (COMPLEX*) out_real, 2, half);
+
+ static float scale = 1./(2. * n);
+ vDSP_vsmul(out_real, 1, &scale, out_real, 1, n);
+
+ //multiply by window
+ vDSP_vmul(out_real, 1, window, 1, finalOut, 1, n);
+
+}
+
+#endif
diff --git a/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/fft.h b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/fft.h
new file mode 100644
index 0000000..77aa777
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/fft.h
@@ -0,0 +1,76 @@
+/*
+ * maximilian
+ * platform independent synthesis library using portaudio or rtaudio
+ *
+ * Created by Mick Grierson on 29/12/2009.
+ * Copyright 2009 Mick Grierson & Strangeloop Limited. All rights reserved.
+ * Thanks to the Goldsmiths Creative Computing Team.
+ * Special thanks to Arturo Castro for the PortAudio implementation.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef _FFT
+#define _FFT
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846 /* pi */
+#endif
+
+#ifdef __APPLE_CC__
+#include <Accelerate/Accelerate.h>
+#endif
+
+
+class fft {
+
+public:
+
+ fft(int fftSize);
+ ~fft();
+
+ int n; //fftSize
+ int half; //halfFFTSize
+
+ float *in_real, *out_real, *in_img, *out_img;
+
+#ifdef __APPLE_CC__
+ int log2n; //log2(n);
+ FFTSetup setupReal;
+ COMPLEX_SPLIT A;
+ float *polar;
+ void powerSpectrum_vdsp(int start, float *data, float *window, float *magnitude,float *phase);
+ void inversePowerSpectrum_vdsp(int start, float *finalOut, float *window, float *magnitude,float *phase);
+#endif;
+
+ /* Calculate the power spectrum */
+ void powerSpectrum(int start, float *data, float *window, float *magnitude, float *phase, float *power, float *avg_power);
+ /* ... the inverse */
+ void inversePowerSpectrum(int start, float *finalOut, float *window, float *magnitude,float *phase);
+
+ static void genWindow(int whichFunction, int NumSamples, float *window);
+
+};
+
+
+#endif
diff --git a/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maxiFFT.cpp b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maxiFFT.cpp
new file mode 100644
index 0000000..eee8ee8
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maxiFFT.cpp
@@ -0,0 +1,257 @@
+/*
+ * maximilian
+ * platform independent synthesis library using portaudio or rtaudio
+ *
+ * Created by Mick Grierson on 29/12/2009.
+ * Copyright 2009 Mick Grierson & Strangeloop Limited. All rights reserved.
+ * Thanks to the Goldsmiths Creative Computing Team.
+ * Special thanks to Arturo Castro for the PortAudio implementation.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include "maxiFFT.h"
+#include <iostream>
+#include "math.h"
+
+using namespace std;
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//F F T
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void maxiFFT::setup(int _fftSize, int _windowSize, int _hopSize) {
+ _fft = new fft(_fftSize);
+ fftSize = _fftSize;
+ windowSize = _windowSize;
+ bins = fftSize / 2;
+ hopSize = _hopSize;
+ buffer = (float *) malloc(fftSize * sizeof(float));
+ magnitudes = (float *) malloc(bins * sizeof(float));
+ phases = (float *) malloc(bins * sizeof(float));
+ powers = (float *) malloc(bins * sizeof(float));
+ avgPower = new float;
+ memset(buffer, 0, fftSize * sizeof(float));
+ memset(magnitudes, 0, bins * sizeof(float));
+ memset(phases, 0, bins * sizeof(float));
+ memset(powers, 0, bins * sizeof(float));
+ *avgPower = 0;
+ pos =windowSize - hopSize;
+ newFFT = 0;
+ window = (float*) malloc(fftSize * sizeof(float));
+ memset(window, 0, fftSize * sizeof(float));
+ fft::genWindow(3, windowSize, window);
+}
+
+bool maxiFFT::process(float value) {
+ //add value to buffer at current pos
+ buffer[pos++] = value;
+ //if buffer full, run fft
+ newFFT = pos == windowSize;
+ if (newFFT) {
+#if defined(__APPLE_CC__) && !defined(_NO_VDSP)
+ _fft->powerSpectrum_vdsp(0, buffer, window, magnitudes, phases);
+#else
+ _fft->powerSpectrum(0, buffer, window, magnitudes, phases, powers, avgPower);
+#endif
+ //shift buffer back by one hop size
+ memcpy(buffer, buffer + hopSize, (windowSize - hopSize) * sizeof(float));
+ //set the new data to zero (is this necessary?, it will get overwritten)
+ memset(buffer + windowSize - hopSize, 0, hopSize * sizeof(float));
+ //reset pos to start of hop
+ pos= windowSize - hopSize;
+ }
+ return newFFT;
+}
+
+maxiFFT::~maxiFFT() {
+ delete _fft;
+ delete[] buffer,magnitudes,phases,powers, window;
+ delete avgPower;
+}
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//I N V E R S E F F T
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void maxiIFFT::setup(int _fftSize, int _windowSize, int _hopSize) {
+ _fft = new fft(_fftSize);
+ fftSize = _fftSize;
+ windowSize = _windowSize;
+ bins = fftSize / 2;
+ hopSize = _hopSize;
+ buffer = (float *) malloc(fftSize * sizeof(float));
+ ifftOut = (float *) malloc(fftSize * sizeof(float));
+ memset(buffer, 0, windowSize * sizeof(float));
+ pos =0;
+ window = (float*) malloc(fftSize * sizeof(float));
+ memset(window, 0, fftSize * sizeof(float));
+ fft::genWindow(3, windowSize, window);
+}
+
+float maxiIFFT::process(float *magnitudes, float *phases) {
+ if (0==pos) {
+ //do ifft
+ memset(ifftOut, 0, fftSize * sizeof(float));
+#if defined(__APPLE_CC__) && !defined(_NO_VDSP)
+ _fft->inversePowerSpectrum_vdsp(0, ifftOut, window, magnitudes, phases);
+#else
+ _fft->inversePowerSpectrum(0, ifftOut, window, magnitudes, phases);
+#endif
+ //add to output
+ //shift back by one hop
+ memcpy(buffer, buffer+hopSize, (fftSize - hopSize) * sizeof(float));
+ //clear the end chunk
+ memset(buffer + (fftSize - hopSize), 0, hopSize * sizeof(float));
+ //merge new output
+ for(int i=0; i < fftSize; i++) {
+ buffer[i] += ifftOut[i];
+ }
+ }
+
+ nextValue = buffer[pos];
+ //limit the values, this alg seems to spike occasionally (and break the audio drivers)
+ if (nextValue > 0.99999f) nextValue = 0.99999f;
+ if (nextValue < -0.99999f) nextValue = -0.99999f;
+ if (hopSize == ++pos ) {
+ pos=0;
+ }
+
+ return nextValue;
+}
+
+maxiIFFT::~maxiIFFT() {
+ delete _fft;
+ delete[] ifftOut, buffer, window;
+};
+
+
+
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//O C T A V E A N A L Y S E R
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+
+void maxiFFTOctaveAnalyzer::setup(float samplingRate, int nBandsInTheFFT, int nAveragesPerOctave){
+
+ samplingRate = samplingRate;
+ nSpectrum = nBandsInTheFFT;
+ spectrumFrequencySpan = (samplingRate / 2.0f) / (float)(nSpectrum);
+ nAverages = nBandsInTheFFT;
+ // fe: 2f for octave bands, sqrt(2) for half-octave bands, cuberoot(2) for third-octave bands, etc
+ if (nAveragesPerOctave==0) // um, wtf?
+ nAveragesPerOctave = 1;
+ nAveragesPerOctave = nAveragesPerOctave;
+ averageFrequencyIncrement = pow(2.0f, 1.0f/(float)(nAveragesPerOctave));
+ // this isn't currently configurable (used once here then no effect), but here's some reasoning:
+ // 43 is a good value if you want to approximate "computer" octaves: 44100/2/2/2/2/2/2/2/2/2/2
+ // 55 is a good value if you'd rather approximate A-440 octaves: 440/2/2/2
+ // 65 is a good value if you'd rather approximate "middle-C" octaves: ~262/2/2
+ // you could easily double it if you felt the lowest band was just rumble noise (as it probably is)
+ // but don't go much smaller unless you have a huge fft window size (see below for more why)
+ // keep in mind, if you change it, that the number of actual bands may change +/-1, and
+ // for some values, the last averaging band may not be very useful (may extend above nyquist)
+ firstOctaveFrequency = 55.0f;
+ // for each spectrum[] bin, calculate the mapping into the appropriate average[] bin.
+ // this gives us roughly log-sized averaging bins, subject to how "fine" the spectrum bins are.
+ // with more spectrum bins, you can better map into the averaging bins (especially at low
+ // frequencies) or use more averaging bins per octave. with an fft window size of 2048,
+ // sampling rate of 44100, and first octave around 55, that's about enough to do half-octave
+ // analysis. if you don't have enough spectrum bins to map adequately into averaging bins
+ // at the requested number per octave then you'll end up with "empty" averaging bins, where
+ // there is no spectrum available to map into it. (so... if you have "nonreactive" averages,
+ // either increase fft buffer size, or decrease number of averages per octave, etc)
+ spe2avg = new int[nSpectrum];
+ int avgidx = 0;
+ float averageFreq = firstOctaveFrequency; // the "top" of the first averaging bin
+ // we're looking for the "top" of the first spectrum bin, and i'm just sort of
+ // guessing that this is where it is (or possibly spectrumFrequencySpan/2?)
+ // ... either way it's probably close enough for these purposes
+ float spectrumFreq = spectrumFrequencySpan;
+ for (int speidx=0; speidx < nSpectrum; speidx++) {
+ while (spectrumFreq > averageFreq) {
+ avgidx++;
+ averageFreq *= averageFrequencyIncrement;
+ }
+ spe2avg[speidx] = avgidx;
+ spectrumFreq += spectrumFrequencySpan;
+ }
+ nAverages = avgidx;
+ averages = new float[nAverages];
+ peaks = new float[nAverages];
+ peakHoldTimes = new int[nAverages];
+ peakHoldTime = 0; // arbitrary
+ peakDecayRate = 0.9f; // arbitrary
+ linearEQIntercept = 1.0f; // unity -- no eq by default
+ linearEQSlope = 0.0f; // unity -- no eq by default
+}
+
+void maxiFFTOctaveAnalyzer::calculate(float * fftData){
+
+ int last_avgidx = 0; // tracks when we've crossed into a new averaging bin, so store current average
+ float sum = 0.0f; // running total of spectrum data
+ int count = 0; // count of spectrums accumulated (for averaging)
+ for (int speidx=0; speidx < nSpectrum; speidx++) {
+ count++;
+ sum += fftData[speidx] * (linearEQIntercept + (float)(speidx) * linearEQSlope);
+ int avgidx = spe2avg[speidx];
+ if (avgidx != last_avgidx) {
+
+ for (int j = last_avgidx; j < avgidx; j++){
+ averages[j] = sum / (float)(count);
+ }
+ count = 0;
+ sum = 0.0f;
+ }
+ last_avgidx = avgidx;
+ }
+ // the last average was probably not calculated...
+ if ((count > 0) && (last_avgidx < nAverages)){
+ averages[last_avgidx] = sum / (float)(count);
+ }
+
+ // update the peaks separately
+ for (int i=0; i < nAverages; i++) {
+ if (averages[i] >= peaks[i]) {
+ // save new peak level, also reset the hold timer
+ peaks[i] = averages[i];
+ peakHoldTimes[i] = peakHoldTime;
+ } else {
+ // current average does not exceed peak, so hold or decay the peak
+ if (peakHoldTimes[i] > 0) {
+ peakHoldTimes[i]--;
+ } else {
+ peaks[i] *= peakDecayRate;
+ }
+ }
+ }
+}
diff --git a/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maxiFFT.h b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maxiFFT.h
new file mode 100644
index 0000000..4d73441
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maxiFFT.h
@@ -0,0 +1,120 @@
+/*
+ * maximilian
+ * platform independent synthesis library using portaudio or rtaudio
+ *
+ * Created by Mick Grierson on 29/12/2009.
+ * Copyright 2009 Mick Grierson & Strangeloop Limited. All rights reserved.
+ * Thanks to the Goldsmiths Creative Computing Team.
+ * Special thanks to Arturo Castro for the PortAudio implementation.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef _MAXI_FFT
+#define _MAXI_FFT
+
+//#define _NO_VDSP //set this if you don't want to use apple's vDSP fft functions
+
+
+#include "fft.h"
+
+class maxiFFT {
+
+public:
+ maxiFFT(){
+ _fft = 0;
+ };
+ ~maxiFFT();
+ void setup(int fftSize, int windowSize, int hopSize);
+ bool process(float value);
+ float *magnitudes, *phases, *powers;
+ float *avgPower;
+ int windowSize;
+ int hopSize;
+
+private:
+ float *buffer, *window;
+ int bins;
+ int pos;
+ float nextValue;
+ int fftSize;
+ fft *_fft;
+ bool newFFT;
+};
+
+class maxiIFFT {
+
+public:
+ maxiIFFT(){
+ _fft=0;
+ };
+ ~maxiIFFT();
+ void setup(int fftSize, int windowSize, int hopSize);
+ float process(float *magnitudes, float *phases);
+
+private:
+ float *ifftOut, *buffer, *window;
+ int windowSize;
+ int bins;
+ int hopSize;
+ int pos;
+ float nextValue;
+ int fftSize;
+ fft *_fft;
+};
+
+
+class maxiFFTOctaveAnalyzer {
+/*based on code by David Bollinger, http://www.davebollinger.com/
+ */
+public:
+
+ float samplingRate; // sampling rate in Hz (needed to calculate frequency spans)
+ int nSpectrum; // number of spectrum bins in the fft
+ int nAverages; // number of averaging bins here
+ int nAveragesPerOctave; // number of averages per octave as requested by user
+ float spectrumFrequencySpan; // the "width" of an fft spectrum bin in Hz
+ float firstOctaveFrequency; // the "top" of the first averaging bin here in Hz
+ float averageFrequencyIncrement; // the root-of-two multiplier between averaging bin frequencies
+ float * averages; // the actual averages
+ float * peaks; // peaks of the averages, aka "maxAverages" in other implementations
+ int * peakHoldTimes; // how long to hold THIS peak meter? decay if == 0
+ int peakHoldTime; // how long do we hold peaks? (in fft frames)
+ float peakDecayRate; // how quickly the peaks decay: 0f=instantly .. 1f=not at all
+ int * spe2avg; // the mapping between spectrum[] indices and averages[] indices
+ // the fft's log equalizer() is no longer of any use (it would be nonsense to log scale
+ // the spectrum values into log-sized average bins) so here's a quick-and-dirty linear
+ // equalizer instead:
+ float linearEQSlope; // the rate of linear eq
+ float linearEQIntercept; // the base linear scaling used at the first averaging bin
+ // the formula is: spectrum[i] * (linearEQIntercept + i * linearEQSlope)
+ // so.. note that clever use of it can also provide a "gain" control of sorts
+ // (fe: set intercept to 2f and slope to 0f to double gain)
+
+ void setup(float samplingRate, int nBandsInTheFFT, int nAveragesPerOctave);
+
+ void calculate(float * fftData);
+
+};
+
+#endif \ No newline at end of file
diff --git a/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maximilian.cpp b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maximilian.cpp
new file mode 100644
index 0000000..efd6d28
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maximilian.cpp
@@ -0,0 +1,712 @@
+
+/*
+ * maximilian.cpp
+ * platform independent synthesis library using portaudio or rtaudio
+ *
+ * Created by Mick Grierson on 29/12/2009.
+ * Copyright 2009 Mick Grierson & Strangeloop Limited. All rights reserved.
+ * Thanks to the Goldsmiths Creative Computing Team.
+ * Special thanks to Arturo Castro for the PortAudio implementation.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include "maximilian.h"
+#include "math.h"
+
+int channels=2;
+int samplerate=44100;
+int buffersize=1024;
+float chandiv= 1;
+
+double sineBuffer[514]={0,0.012268,0.024536,0.036804,0.049042,0.06131,0.073547,0.085785,0.097992,0.1102,0.12241,0.13455,0.1467,0.15884,0.17093,0.18301,0.19507,0.20709,0.21909,0.23105,0.24295,0.25485,0.26669,0.2785,0.29025,0.30197,0.31366,0.32529,0.33685,0.34839,0.35986,0.37128,0.38266,0.39395,0.40521,0.41641,0.42752,0.4386,0.44958,0.46051,0.47137,0.48215,0.49286,0.50351,0.51407,0.52457,0.53497,0.54529,0.55554,0.5657,0.57578,0.58575,0.59567,0.60547,0.6152,0.62482,0.63437,0.6438,0.65314,0.66238,0.67151,0.68057,0.68951,0.69833,0.70706,0.7157,0.72421,0.7326,0.74091,0.74908,0.75717,0.76514,0.77298,0.7807,0.7883,0.79581,0.80316,0.81042,0.81754,0.82455,0.83142,0.8382,0.84482,0.85132,0.8577,0.86392,0.87006,0.87604,0.88187,0.8876,0.89319,0.89862,0.90396,0.90912,0.91415,0.91907,0.92383,0.92847,0.93295,0.93729,0.9415,0.94556,0.94949,0.95325,0.95691,0.96039,0.96375,0.96692,0.97,0.9729,0.97565,0.97827,0.98074,0.98306,0.98523,0.98724,0.98914,0.99084,0.99243,0.99387,0.99515,0.99628,0.99725,0.99808,0.99875,0.99927,0.99966,0.99988,0.99997,0.99988,0.99966,0.99927,0.99875,0.99808,0.99725,0.99628,0.99515,0.99387,0.99243,0.99084,0.98914,0.98724,0.98523,0.98306,0.98074,0.97827,0.97565,0.9729,0.97,0.96692,0.96375,0.96039,0.95691,0.95325,0.94949,0.94556,0.9415,0.93729,0.93295,0.92847,0.92383,0.91907,0.91415,0.90912,0.90396,0.89862,0.89319,0.8876,0.88187,0.87604,0.87006,0.86392,0.8577,0.85132,0.84482,0.8382,0.83142,0.82455,0.81754,0.81042,0.80316,0.79581,0.7883,0.7807,0.77298,0.76514,0.75717,0.74908,0.74091,0.7326,0.72421,0.7157,0.70706,0.69833,0.68951,0.68057,0.67151,0.66238,0.65314,0.6438,0.63437,0.62482,0.6152,0.60547,0.59567,0.58575,0.57578,0.5657,0.55554,0.54529,0.53497,0.52457,0.51407,0.50351,0.49286,0.48215,0.47137,0.46051,0.44958,0.4386,0.42752,0.41641,0.40521,0.39395,0.38266,0.37128,0.35986,0.34839,0.33685,0.32529,0.31366,0.30197,0.29025,0.2785,0.26669,0.25485,0.24295,0.23105,0.21909,0.20709,0.19507,0.18301,0.17093,0.15884,0.1467,0.13455,0.12241,0.1102,0.097992,0.085785,0.073547,0.06131,0.049042,0.036804,0.024536,0.012268,0,-0.012268,-0.024536,-0.036804,-0.049042,-0.06131,-0.073547,-0.085785,-0.097992,-0.1102,-0.12241,-0.13455,-0.1467,-0.15884,-0.17093,-0.18301,-0.19507,-0.20709,-0.21909,-0.23105,-0.24295,-0.25485,-0.26669,-0.2785,-0.29025,-0.30197,-0.31366,-0.32529,-0.33685,-0.34839,-0.35986,-0.37128,-0.38266,-0.39395,-0.40521,-0.41641,-0.42752,-0.4386,-0.44958,-0.46051,-0.47137,-0.48215,-0.49286,-0.50351,-0.51407,-0.52457,-0.53497,-0.54529,-0.55554,-0.5657,-0.57578,-0.58575,-0.59567,-0.60547,-0.6152,-0.62482,-0.63437,-0.6438,-0.65314,-0.66238,-0.67151,-0.68057,-0.68951,-0.69833,-0.70706,-0.7157,-0.72421,-0.7326,-0.74091,-0.74908,-0.75717,-0.76514,-0.77298,-0.7807,-0.7883,-0.79581,-0.80316,-0.81042,-0.81754,-0.82455,-0.83142,-0.8382,-0.84482,-0.85132,-0.8577,-0.86392,-0.87006,-0.87604,-0.88187,-0.8876,-0.89319,-0.89862,-0.90396,-0.90912,-0.91415,-0.91907,-0.92383,-0.92847,-0.93295,-0.93729,-0.9415,-0.94556,-0.94949,-0.95325,-0.95691,-0.96039,-0.96375,-0.96692,-0.97,-0.9729,-0.97565,-0.97827,-0.98074,-0.98306,-0.98523,-0.98724,-0.98914,-0.99084,-0.99243,-0.99387,-0.99515,-0.99628,-0.99725,-0.99808,-0.99875,-0.99927,-0.99966,-0.99988,-0.99997,-0.99988,-0.99966,-0.99927,-0.99875,-0.99808,-0.99725,-0.99628,-0.99515,-0.99387,-0.99243,-0.99084,-0.98914,-0.98724,-0.98523,-0.98306,-0.98074,-0.97827,-0.97565,-0.9729,-0.97,-0.96692,-0.96375,-0.96039,-0.95691,-0.95325,-0.94949,-0.94556,-0.9415,-0.93729,-0.93295,-0.92847,-0.92383,-0.91907,-0.91415,-0.90912,-0.90396,-0.89862,-0.89319,-0.8876,-0.88187,-0.87604,-0.87006,-0.86392,-0.8577,-0.85132,-0.84482,-0.8382,-0.83142,-0.82455,-0.81754,-0.81042,-0.80316,-0.79581,-0.7883,-0.7807,-0.77298,-0.76514,-0.75717,-0.74908,-0.74091,-0.7326,-0.72421,-0.7157,-0.70706,-0.69833,-0.68951,-0.68057,-0.67151,-0.66238,-0.65314,-0.6438,-0.63437,-0.62482,-0.6152,-0.60547,-0.59567,-0.58575,-0.57578,-0.5657,-0.55554,-0.54529,-0.53497,-0.52457,-0.51407,-0.50351,-0.49286,-0.48215,-0.47137,-0.46051,-0.44958,-0.4386,-0.42752,-0.41641,-0.40521,-0.39395,-0.38266,-0.37128,-0.35986,-0.34839,-0.33685,-0.32529,-0.31366,-0.30197,-0.29025,-0.2785,-0.26669,-0.25485,-0.24295,-0.23105,-0.21909,-0.20709,-0.19507,-0.18301,-0.17093,-0.15884,-0.1467,-0.13455,-0.12241,-0.1102,-0.097992,-0.085785,-0.073547,-0.06131,-0.049042,-0.036804,-0.024536,-0.012268,0,0.012268
+};
+
+void setup();//use this to do any initialisation if you want.
+
+void play(double *channels);//run dac!
+
+maxiOsc::maxiOsc(){
+ phase = 0.0;
+// memset(phases,0,500);
+// memset(freqs,0,500);
+}
+
+double maxiOsc::noise() {
+ //always the same unless you seed it.
+ float r = rand()/(float)RAND_MAX;
+ output=r*2-1;
+ return(output);
+}
+
+double maxiOsc::sinewave(double frequency) {
+ output=sin (phase*(TWOPI));
+ if ( phase >= 1.0 ) phase -= 1.0;
+ phase += (1./(samplerate/(frequency)));
+ return(output);
+
+}
+
+double maxiOsc::sinebuf4(double frequency) {
+ double remainder;
+ double a,b,c,d,a1,a2,a3;
+ phase += 512./(samplerate/(frequency));
+ if ( phase >= 511 ) phase -=512;
+ remainder = phase - floor(phase);
+
+ if (phase==0) {
+ a=sineBuffer[(long) 512];
+ b=sineBuffer[(long) phase];
+ c=sineBuffer[(long) phase+1];
+ d=sineBuffer[(long) phase+2];
+
+ } else {
+ a=sineBuffer[(long) phase-1];
+ b=sineBuffer[(long) phase];
+ c=sineBuffer[(long) phase+1];
+ d=sineBuffer[(long) phase+2];
+
+ }
+
+ a1 = 0.5f * (c - a);
+ a2 = a - 2.5 * b + 2.f * c - 0.5f * d;
+ a3 = 0.5f * (d - a) + 1.5f * (b - c);
+ output = double (((a3 * remainder + a2) * remainder + a1) * remainder + b);
+ return(output);
+}
+
+double maxiOsc::sinebuf(double frequency) {
+ double remainder;
+ phase += 512./(samplerate/(frequency*chandiv));
+ if ( phase >= 511 ) phase -=512;
+ remainder = phase - floor(phase);
+ output = (double) ((1-remainder) * sineBuffer[1+ (long) phase] + remainder * sineBuffer[2+(long) phase]);
+ return(output);
+}
+
+double maxiOsc::coswave(double frequency) {
+ output=cos (phase*(TWOPI));
+ if ( phase >= 1.0 ) phase -= 1.0;
+ phase += (1./(samplerate/(frequency)));
+ return(output);
+
+}
+
+double maxiOsc::phasor(double frequency) {
+ output=phase;
+ if ( phase >= 1.0 ) phase -= 1.0;
+ phase += (1./(samplerate/(frequency)));
+ return(output);
+}
+
+double maxiOsc::square(double frequency) {
+ if (phase<0.5) output=-1;
+ if (phase>0.5) output=1;
+ if ( phase >= 1.0 ) phase -= 1.0;
+ phase += (1./(samplerate/(frequency)));
+ return(output);
+}
+
+double maxiOsc::pulse(double frequency, double duty) {
+ if (duty<0.) duty=0;
+ if (duty>1.) duty=1;
+ if ( phase >= 1.0 ) phase -= 1.0;
+ phase += (1./(samplerate/(frequency)));
+ if (phase<duty) output=-1.;
+ if (phase>duty) output=1.;
+ return(output);
+}
+
+double maxiOsc::phasor(double frequency, double startphase, double endphase) {
+ output=phase;
+ if (phase<startphase) {
+ phase=startphase;
+ }
+ if ( phase >= endphase ) phase = startphase;
+ phase += ((endphase-startphase)/(samplerate/(frequency)));
+ return(output);
+}
+
+
+double maxiOsc::saw(double frequency) {
+
+ output=phase;
+ if ( phase >= 1.0 ) phase -= 2.0;
+ phase += (1./(samplerate/(frequency)));
+ return(output);
+
+}
+
+double maxiOsc::triangle(double frequency, double phase) {
+ output=tri*2;
+ if ( phase >= 1.0 ) phase -= 1.0;
+ phase += (1./(samplerate/(frequency*chandiv)));
+ if (phase <= 0.5 ) {
+ tri = phase;
+ } else {
+ tri =(1-phase);
+ }
+ return(output);
+
+}
+
+//I like this.
+double maxiEnvelope::line(int numberofsegments,double segments[1000]) {
+ period=2./(segments[valindex+1]*0.004);
+ nextval=segments[valindex+2];
+ currentval=segments[valindex];
+ if (currentval-amplitude > 0.0000001 && valindex < numberofsegments) {
+ amplitude += ((currentval-startval)/(samplerate/period));
+ } else if (currentval-amplitude < -0.0000001 && valindex < numberofsegments) {
+ amplitude -= (((currentval-startval)*(-1))/(samplerate/period));
+ } else if (valindex >numberofsegments-1) {
+ valindex=numberofsegments-2;
+ } else {
+ valindex=valindex+2;
+ startval=currentval;
+ }
+ output=amplitude;
+ return(output);
+}
+
+//and this
+void maxiEnvelope::trigger(int index,double amp) {
+ valindex=index;
+ amplitude=amp;
+
+}
+
+//and this
+double maxiDelayline::dl(double input, int size, double feedback) {
+ if ( phase >=size ) phase = 0;
+ memory[phase]=(memory[phase]*feedback)+(input*feedback)*0.5;
+ phase+=1;
+ output=memory[phase+1];
+ return(output);
+
+}
+
+double maxiDelayline::dl(double input, int size, double feedback, int position) {
+ if ( phase >=size ) phase = 0;
+ if ( position >=size ) position = 0;
+ memory[phase]=(memory[phase]*feedback)+(input*feedback)*chandiv;
+ phase+=1;
+ output=memory[position];
+ return(output);
+
+}
+
+//I particularly like these. cutoff between 0 and 1
+double maxiFilter::lopass(double input, double cutoff) {
+ output=outputs[0] + cutoff*(input-outputs[0]);
+ outputs[0]=output;
+ return(output);
+}
+//as above
+double maxiFilter::hipass(double input, double cutoff) {
+ output=input-(outputs[0] + cutoff*(input-outputs[0]));
+ outputs[0]=output;
+ return(output);
+}
+//awesome. cuttof is freq in hz. res is between 1 and whatever. Watch out!
+double maxiFilter::lores(double input,double cutoff1, double resonance) {
+ cutoff=cutoff1*0.5;
+ if (cutoff>(samplerate*0.25)) cutoff=(samplerate*0.25);
+ if (resonance<1.) resonance = 1.;
+ z=cos(TWOPI*cutoff/samplerate);
+ c=2-2*z;
+ double r=(sqrt(2.0)*sqrt(-pow((z-1.0),3.0))+resonance*(z-1))/(resonance*(z-1));
+ x=x+(input-y)*c;
+ y=y+x;
+ x=x*r;
+ output=y;
+ return(output);
+}
+
+//this is just stupid. Kindof works.
+double maxiFilter::hires(double input,double cutoff1, double resonance) {
+ cutoff=cutoff1*0.5;
+ if (cutoff>(samplerate*0.25)) cutoff=(samplerate*0.25);
+ if (resonance<1.) resonance = 1.;
+ z=cos(TWOPI*cutoff/samplerate);
+ c=2-2*z;
+ double r=(sqrt(2.0)*sqrt(-pow((z-1.0),3.0))+resonance*(z-1))/(resonance*(z-1));
+ x=x+(input-y)*c;
+ y=y+x;
+ x=x*r;
+ output=input-y;
+ return(output);
+}
+
+//This works a bit. Needs attention.
+double maxiFilter::bandpass(double input,double cutoff1, double resonance) {
+ cutoff=cutoff1;
+ if (cutoff>(samplerate*0.5)) cutoff=(samplerate*0.5);
+ if (resonance>=1.) resonance=0.999999;
+ z=cos(TWOPI*cutoff/samplerate);
+ inputs[0] = (1-resonance)*(sqrt(resonance*(resonance-4.0*pow(z,2.0)+2.0)+1));
+ inputs[1] = 2*z*resonance;
+ inputs[2] = pow((resonance*-1),2);
+
+ output=inputs[0]*input+inputs[1]*outputs[1]+inputs[2]*outputs[2];
+ outputs[2]=outputs[1];
+ outputs[1]=output;
+ return(output);
+}
+
+//stereo bus
+double *maxiMix::stereo(double input,double two[2],double x) {
+ if (x>1) x=1;
+ if (x<0) x=0;
+ two[0]=input*sqrt(1.0-x);
+ two[1]=input*sqrt(x);
+ return(two);
+}
+
+//quad bus
+double *maxiMix::quad(double input,double four[4],double x,double y) {
+ if (x>1) x=1;
+ if (x<0) x=0;
+ if (y>1) y=1;
+ if (y<0) y=0;
+ four[0]=input*sqrt((1.0-x)*y);
+ four[1]=input*sqrt((1.0-x)*(1.0-y));
+ four[2]=input*sqrt(x*y);
+ four[3]=input*sqrt(x*(1.0-y));
+ return(four);
+}
+
+//ambisonic bus
+double *maxiMix::ambisonic(double input,double eight[8],double x,double y,double z) {
+ if (x>1) x=1;
+ if (x<0) x=0;
+ if (y>1) y=1;
+ if (y<0) y=0;
+ if (z>1) y=1;
+ if (z<0) y=0;
+ eight[0]=input*(sqrt((1.0-x)*y)*1.0-z);
+ eight[1]=input*(sqrt((1.0-x)*(1.0-y))*1.0-z);
+ eight[2]=input*(sqrt(x*y)*1.0-z);
+ eight[3]=input*(sqrt(x*(1.0-y))*1.0-z);
+ eight[4]=input*(sqrt((1.0-x)*y)*z);
+ eight[5]=input*(sqrt((1.0-x)*(1.0-y))*z);
+ eight[6]=input*sqrt((x*y)*z);
+ eight[7]=input*sqrt((x*(1.0-y))*z);
+ return(eight);
+}
+
+
+bool maxiSample::load(string fileName) {
+ myPath = fileName;
+ return read();
+}
+
+void maxiSample::trigger() {
+ position = 0;
+}
+
+double maxiSample::play() {
+ long length=myDataSize*(1./myChannels);
+ double remainder;
+ short* buffer = (short *)myData;
+ position=(position+1);
+ remainder = position - (long) position;
+ if ((long) position>length) position=0;
+ output = (double) ((1-remainder) * buffer[1+ (long) position] + remainder * buffer[2+(long) position])/32767;//linear interpolation
+ return(output);
+}
+
+double maxiSample::play(double speed) {
+ double remainder;
+ long a,b;
+// long length=myDataSize*0.5;
+ short* buffer = (short *)myData;
+ position=position+((speed*chandiv*myChannels)/(samplerate/mySampleRate));
+ if (speed >=0) {
+
+ if ((long) position>=length-1) position=1;
+ remainder = position - floor(position);
+ if (position+1<length) {
+ a=position+1;
+
+ }
+ else {
+ a=length-1;
+ }
+ if (position+2<length)
+ {
+ b=position+2;
+ }
+ else {
+ b=length-1;
+ }
+
+ output = (double) ((1-remainder) * buffer[a] + remainder * buffer[b])/32767;//linear interpolation
+} else {
+ if ((long) position<0) position=length;
+ remainder = position - floor(position);
+ if (position-1>=0) {
+ a=position-1;
+
+ }
+ else {
+ a=0;
+ }
+ if (position-2>=0) {
+ b=position-2;
+ }
+ else {
+ b=0;
+ }
+ output = (double) ((-1-remainder) * buffer[a] + remainder * buffer[b])/32767;//linear interpolation
+ }
+ return(output);
+}
+
+double maxiSample::play(double frequency, double start, double end) {
+ double remainder;
+// long length=myDataSize;
+ if (end>=length) end=length-1;
+ long a,b;
+ short* buffer = (short *)myData;
+ if (frequency >0.) {
+ if (position<start) {
+ position=start;
+ }
+
+ if ( position >= end ) position = start;
+ position += ((end-start)/(samplerate/(frequency*chandiv)));
+ remainder = position - floor(position);
+ long pos = floor(position);
+ if (pos+1<length) {
+ a=pos+1;
+
+ }
+ else {
+ a=pos-1;
+ }
+ if (pos+2<length) {
+ b=pos+2;
+ }
+ else {
+ b=length-1;
+ }
+
+ output = (double) ((1-remainder) * buffer[a] +
+ remainder * buffer[b])/32767;//linear interpolation
+ } else {
+ frequency=frequency-(frequency+frequency);
+ if ( position <= start ) position = end;
+ position -= ((end-start)/(samplerate/(frequency*chandiv)));
+ remainder = position - floor(position);
+ long pos = floor(position);
+ if (pos-1>=0) {
+ a=pos-1;
+ }
+ else {
+ a=0;
+ }
+ if (pos-2>=0) {
+ b=pos-2;
+ }
+ else {
+ b=0;
+ }
+ output = (double) ((-1-remainder) * buffer[a] +
+ remainder * buffer[b])/32767;//linear interpolation
+
+ }
+
+ return(output);
+}
+
+//better cubic inerpolation. Cobbled together from various (pd externals, yehar, other places).
+double maxiSample::play4(double frequency, double start, double end) {
+ double remainder;
+ double a,b,c,d,a1,a2,a3;
+ short* buffer = (short*)myData;
+ if (frequency >0.) {
+ if (position<start) {
+ position=start;
+ }
+ if ( position >= end ) position = start;
+ position += ((end-start)/(samplerate/(frequency*chandiv)));
+ remainder = position - floor(position);
+ if (position>0) {
+ a=buffer[(int)(floor(position))-1];
+
+ } else {
+ a=buffer[0];
+
+ }
+
+ b=buffer[(long) position];
+ if (position<end-2) {
+ c=buffer[(long) position+1];
+
+ } else {
+ c=buffer[0];
+
+ }
+ if (position<end-3) {
+ d=buffer[(long) position+2];
+
+ } else {
+ d=buffer[0];
+ }
+ a1 = 0.5f * (c - a);
+ a2 = a - 2.5 * b + 2.f * c - 0.5f * d;
+ a3 = 0.5f * (d - a) + 1.5f * (b - c);
+ output = (double) (((a3 * remainder + a2) * remainder + a1) * remainder + b) / 32767;
+
+ } else {
+ frequency=frequency-(frequency+frequency);
+ if ( position <= start ) position = end;
+ position -= ((end-start)/(samplerate/(frequency*chandiv)));
+ remainder = position - floor(position);
+ if (position>start && position < end-1) {
+ a=buffer[(long) position+1];
+
+ } else {
+ a=buffer[0];
+
+ }
+
+ b=buffer[(long) position];
+ if (position>start) {
+ c=buffer[(long) position-1];
+
+ } else {
+ c=buffer[0];
+
+ }
+ if (position>start+1) {
+ d=buffer[(long) position-2];
+
+ } else {
+ d=buffer[0];
+ }
+ a1 = 0.5f * (c - a);
+ a2 = a - 2.5 * b + 2.f * c - 0.5f * d;
+ a3 = 0.5f * (d - a) + 1.5f * (b - c);
+ output = (double) (((a3 * remainder + a2) * -remainder + a1) * -remainder + b) / 32767;
+
+ }
+
+ return(output);
+}
+
+double maxiSample::bufferPlay(unsigned char &bufferin,long length) {
+ double remainder;
+ short* buffer = (short *)bufferin;
+ position=(position+1);
+ remainder = position - (long) position;
+ if ((long) position>length) position=0;
+ output = (double) ((1-remainder) * buffer[1+ (long) position] + remainder * buffer[2+(long) position])/32767;//linear interpolation
+ return(output);
+}
+
+double maxiSample::bufferPlay(unsigned char &bufferin,double speed,long length) {
+ double remainder;
+ long a,b;
+ short* buffer = (short *)bufferin;
+ position=position+((speed*chandiv*myChannels)/(samplerate/mySampleRate));
+ if (speed >=0) {
+
+ if ((long) position>=length-1) position=1;
+ remainder = position - floor(position);
+ if (position+1<length) {
+ a=position+1;
+
+ }
+ else {
+ a=length-1;
+ }
+ if (position+2<length)
+ {
+ b=position+2;
+ }
+ else {
+ b=length-1;
+ }
+
+ output = (double) ((1-remainder) * buffer[a] + remainder * buffer[b])/32767;//linear interpolation
+ } else {
+ if ((long) position<0) position=length;
+ remainder = position - floor(position);
+ if (position-1>=0) {
+ a=position-1;
+
+ }
+ else {
+ a=0;
+ }
+ if (position-2>=0) {
+ b=position-2;
+ }
+ else {
+ b=0;
+ }
+ output = (double) ((-1-remainder) * buffer[a] + remainder * buffer[b])/32767;//linear interpolation
+ }
+ return(output);
+}
+
+double maxiSample::bufferPlay(unsigned char &bufferin,double frequency, double start, double end) {
+ double remainder;
+ length=end;
+ long a,b;
+ short* buffer = (short *)bufferin;
+ if (frequency >0.) {
+ if (position<start) {
+ position=start;
+ }
+
+ if ( position >= end ) position = start;
+ position += ((end-start)/(samplerate/(frequency*chandiv)));
+ remainder = position - floor(position);
+ long pos = floor(position);
+ if (pos+1<length) {
+ a=pos+1;
+
+ }
+ else {
+ a=pos-1;
+ }
+ if (pos+2<length) {
+ b=pos+2;
+ }
+ else {
+ b=length-1;
+ }
+
+ output = (double) ((1-remainder) * buffer[a] +
+ remainder * buffer[b])/32767;//linear interpolation
+ } else {
+ frequency=frequency-(frequency+frequency);
+ if ( position <= start ) position = end;
+ position -= ((end-start)/(samplerate/(frequency*chandiv)));
+ remainder = position - floor(position);
+ long pos = floor(position);
+ if (pos-1>=0) {
+ a=pos-1;
+ }
+ else {
+ a=0;
+ }
+ if (pos-2>=0) {
+ b=pos-2;
+ }
+ else {
+ b=0;
+ }
+ output = (double) ((-1-remainder) * buffer[a] +
+ remainder * buffer[b])/32767;//linear interpolation
+
+ }
+
+ return(output);
+}
+
+//better cubic inerpolation. Cobbled together from various (pd externals, yehar, other places).
+double maxiSample::bufferPlay4(unsigned char &bufferin,double frequency, double start, double end) {
+ double remainder;
+ double a,b,c,d,a1,a2,a3;
+ short* buffer = (short*)bufferin;
+ if (frequency >0.) {
+ if (position<start) {
+ position=start;
+ }
+ if ( position >= end ) position = start;
+ position += ((end-start)/(samplerate/(frequency*chandiv)));
+ remainder = position - floor(position);
+ if (position>0) {
+ a=buffer[(int)(floor(position))-1];
+
+ } else {
+ a=buffer[0];
+
+ }
+
+ b=buffer[(long) position];
+ if (position<end-2) {
+ c=buffer[(long) position+1];
+
+ } else {
+ c=buffer[0];
+
+ }
+ if (position<end-3) {
+ d=buffer[(long) position+2];
+
+ } else {
+ d=buffer[0];
+ }
+ a1 = 0.5f * (c - a);
+ a2 = a - 2.5 * b + 2.f * c - 0.5f * d;
+ a3 = 0.5f * (d - a) + 1.5f * (b - c);
+ output = (double) (((a3 * remainder + a2) * remainder + a1) * remainder + b) / 32767;
+
+ } else {
+ frequency=frequency-(frequency+frequency);
+ if ( position <= start ) position = end;
+ position -= ((end-start)/(samplerate/(frequency*chandiv)));
+ remainder = position - floor(position);
+ if (position>start && position < end-1) {
+ a=buffer[(long) position+1];
+
+ } else {
+ a=buffer[0];
+
+ }
+
+ b=buffer[(long) position];
+ if (position>start) {
+ c=buffer[(long) position-1];
+
+ } else {
+ c=buffer[0];
+
+ }
+ if (position>start+1) {
+ d=buffer[(long) position-2];
+
+ } else {
+ d=buffer[0];
+ }
+ a1 = 0.5f * (c - a);
+ a2 = a - 2.5 * b + 2.f * c - 0.5f * d;
+ a3 = 0.5f * (d - a) + 1.5f * (b - c);
+ output = (double) (((a3 * remainder + a2) * -remainder + a1) * -remainder + b) / 32767;
+
+ }
+
+ return(output);
+}
+
+
+void maxiSample::getLength() {
+ length=myDataSize*0.5;
+}
+
+
diff --git a/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maximilian.h b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maximilian.h
new file mode 100755
index 0000000..86fcef4
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/libs/maximilian.h
@@ -0,0 +1,355 @@
+/*
+ * maximilian.h
+ * platform independent synthesis library using portaudio or rtaudio
+ *
+ * Created by Mick Grierson on 29/12/2009.
+ * Copyright 2009 Mick Grierson & Strangeloop Limited. All rights reserved.
+ * Thanks to the Goldsmiths Creative Computing Team.
+ * Special thanks to Arturo Castro for the PortAudio implementation.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef MAXIMILIAN_H
+#define MAXIMILIAN_H
+
+//#define MAXIMILIAN_PORTAUDIO
+#define MAXIMILIAN_RT_AUDIO
+
+#include "ofMain.h"
+#include "ofUtils.h"
+
+
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <cstdlib>
+
+using namespace std;
+#define TWOPI 3.14159*2
+
+class maxiOsc {
+
+ double frequency;
+ double phase;
+ double startphase;
+ double endphase;
+ double output;
+ double tri;
+
+
+public:
+ maxiOsc();
+ double sinewave(double frequency);
+ double coswave(double frequency);
+ double phasor(double frequency);
+ double phasor(double frequency, double startphase, double endphase);
+ double saw(double frequency);
+ double triangle(double frequency,double phase);
+ double square(double frequency);
+ double pulse(double frequency, double duty);
+ double noise();
+ double sinebuf(double frequency);
+ double sinebuf4(double frequency);
+
+};
+
+
+class maxiEnvelope {
+
+ double period;
+ double output;
+ double startval;
+ double currentval;
+ double nextval;
+
+public:
+ double line(int numberofsegments,double segments[100]);
+ void trigger(int index,double amp);
+ int valindex;
+ double amplitude;
+
+};
+
+
+class maxiDelayline {
+ double frequency;
+ int phase;
+ double startphase;
+ double endphase;
+ double output;
+ double memory[88200];
+
+public:
+ double dl(double input, int size, double feedback);
+ double dl(double input, int size, double feedback, int position);
+
+
+};
+
+
+class maxiFilter {
+ double gain;
+ double input;
+ double output;
+ double inputs[10];
+ double outputs[10];
+ double cutoff1;
+ double x;//speed
+ double y;//pos
+ double z;//pole
+ double c;//filter coefficient
+public:
+ double cutoff;
+ double resonance;
+ double lores(double input,double cutoff1, double resonance);
+ double hires(double input,double cutoff1, double resonance);
+ double bandpass(double input,double cutoff1, double resonance);
+ double lopass(double input,double cutoff);
+ double hipass(double input,double cutoff);
+
+};
+
+class maxiMix {
+ double input;
+ double two[2];
+ double four[4];
+ double eight[8];
+public:
+ double x;
+ double y;
+ double z;
+ double *stereo(double input,double two[2],double x);
+ double *quad(double input,double four[4], double x,double y);
+ double *ambisonic(double input,double eight[8],double x,double y, double z);
+
+};
+
+
+class maxiSample {
+
+private:
+ string myPath;
+ int myChunkSize;
+ int mySubChunk1Size;
+ short myFormat;
+ int myByteRate;
+ short myBlockAlign;
+ short myBitsPerSample;
+ int myDataSize;
+ double position;
+ double speed;
+ double output;
+
+public:
+ short myChannels;
+ int mySampleRate;
+ long length;
+ void getLength();
+
+ char* myData;
+
+ // get/set for the Path property
+
+ ~maxiSample()
+ {
+ delete myData;
+ myChunkSize = NULL;
+ mySubChunk1Size = NULL;
+ myFormat = NULL;
+ myChannels = NULL;
+ mySampleRate = NULL;
+ myByteRate = NULL;
+ myBlockAlign = NULL;
+ myBitsPerSample = NULL;
+ myDataSize = NULL;
+ }
+
+// maxiSample();
+
+ bool load(string fileName);
+
+ void trigger();
+
+ // read a wav file into this class
+ bool read()
+ {
+ bool result;
+ ifstream inFile( myPath.c_str(), ios::in | ios::binary);
+ result = inFile;
+
+ if (inFile) {
+ //printf("Reading wav file...\n"); // for debugging only
+
+ inFile.seekg(4, ios::beg);
+ inFile.read( (char*) &myChunkSize, 4 ); // read the ChunkSize
+
+ inFile.seekg(16, ios::beg);
+ inFile.read( (char*) &mySubChunk1Size, 4 ); // read the SubChunk1Size
+
+ //inFile.seekg(20, ios::beg);
+ inFile.read( (char*) &myFormat, sizeof(short) ); // read the file format. This should be 1 for PCM
+
+ //inFile.seekg(22, ios::beg);
+ inFile.read( (char*) &myChannels, sizeof(short) ); // read the # of channels (1 or 2)
+
+ //inFile.seekg(24, ios::beg);
+ inFile.read( (char*) &mySampleRate, sizeof(int) ); // read the samplerate
+
+ //inFile.seekg(28, ios::beg);
+ inFile.read( (char*) &myByteRate, sizeof(int) ); // read the byterate
+
+ //inFile.seekg(32, ios::beg);
+ inFile.read( (char*) &myBlockAlign, sizeof(short) ); // read the blockalign
+
+ //inFile.seekg(34, ios::beg);
+ inFile.read( (char*) &myBitsPerSample, sizeof(short) ); // read the bitspersample
+
+ //ignore any extra chunks
+ char chunkID[4]="";
+ int filePos = 36;
+ bool found = false;
+ while(!found && !inFile.eof()) {
+ inFile.seekg(filePos, ios::beg);
+ inFile.read((char*) &chunkID, sizeof(char) * 4);
+ inFile.seekg(filePos + 4, ios::beg);
+ inFile.read( (char*) &myDataSize, sizeof(int) ); // read the size of the data
+ filePos += 8;
+ if (strcmp(chunkID,"data") == 0) {
+ found = true;
+ }else{
+ filePos += myDataSize;
+ }
+ }
+
+
+
+ // read the data chunk
+ myData = (char*) malloc(myDataSize * sizeof(char));
+ inFile.seekg(filePos, ios::beg);
+ inFile.read(myData, myDataSize);
+ length=myDataSize*(0.5/myChannels);
+
+ inFile.close(); // close the input file
+ }
+
+
+ return result; // this should probably be something more descriptive
+ }
+
+
+ double play();
+
+ double play(double speed);
+
+ double play(double frequency, double start, double end);
+
+ double play4(double frequency, double start, double end);
+
+ double bufferPlay(unsigned char &bufferin,long length);
+
+ double bufferPlay(unsigned char &bufferin,double speed,long length);
+
+ double bufferPlay(unsigned char &bufferin,double frequency, double start, double end);
+
+ double bufferPlay4(unsigned char &bufferin,double frequency, double start, double end);
+
+ //int open(char *filename) {
+ // // open the wav file
+ // char *path = new char[50];
+ // strcpy(path, filename);
+ // sample *myWav = new sample(path);
+ // return 0;
+ // }
+ // // print a summary of the wav file
+ // int info() {
+ // char *summary = myWav->getSummary();
+ // printf("Summary:\n%s", summary);
+ // return 0;
+ // }
+ // int savefile() {
+ // // write the summary back out
+ // strcpy(path, "testout.wav");
+ // myWav->setPath(path);
+ // myWav->save();
+ // return 0:
+ // }
+ // int close() {
+ // // collect the garbage
+ // delete summary;
+ // delete path;
+ // delete myWav;
+ //
+ // return 0;
+ // }
+ // write out the wav file
+ bool save()
+ {
+ fstream myFile (myPath.c_str(), ios::out | ios::binary);
+
+ // write the wav file per the wav file format
+ myFile.seekp (0, ios::beg);
+ myFile.write ("RIFF", 4);
+ myFile.write ((char*) &myChunkSize, 4);
+ myFile.write ("WAVE", 4);
+ myFile.write ("fmt ", 4);
+ myFile.write ((char*) &mySubChunk1Size, 4);
+ myFile.write ((char*) &myFormat, 2);
+ myFile.write ((char*) &myChannels, 2);
+ myFile.write ((char*) &mySampleRate, 4);
+ myFile.write ((char*) &myByteRate, 4);
+ myFile.write ((char*) &myBlockAlign, 2);
+ myFile.write ((char*) &myBitsPerSample, 2);
+ myFile.write ("data", 4);
+ myFile.write ((char*) &myDataSize, 4);
+ myFile.write (myData, myDataSize);
+
+ return true;
+ }
+
+ // return a printable summary of the wav file
+ char *getSummary()
+ {
+ char *summary = new char[250];
+ sprintf(summary, " Format: %d\n Channels: %d\n SampleRate: %d\n ByteRate: %d\n BlockAlign: %d\n BitsPerSample: %d\n DataSize: %d\n", myFormat, myChannels, mySampleRate, myByteRate, myBlockAlign, myBitsPerSample, myDataSize);
+ std::cout << myDataSize;
+ return summary;
+ }
+};
+
+
+class maxiMap {
+public:
+ static double inline linlin(double val, double inMin, double inMax, double outMin, double outMax) {
+ return ((val - inMin) / (inMax - inMin) * (outMax - outMin)) + outMin;
+ }
+
+ static double inline linexp(double val, double inMin, double inMax, double outMin, double outMax) {
+ //clipping
+ val = max(min(val, inMax), inMin);
+ return pow((outMax / outMin), (val - inMin) / (inMax - inMin)) * outMin;
+ }
+};
+
+
+#endif
diff --git a/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/src/ofxMaxim.h b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/src/ofxMaxim.h
new file mode 100644
index 0000000..317ba34
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/ofxMaxim/src/ofxMaxim.h
@@ -0,0 +1,50 @@
+/*
+ * maximilian
+ * platform independent synthesis library using portaudio or rtaudio
+ *
+ * Created by Mick Grierson on 29/12/2009.
+ * Copyright 2009 Mick Grierson & Strangeloop Limited. All rights reserved.
+ * Thanks to the Goldsmiths Creative Computing Team.
+ * Special thanks to Arturo Castro for the PortAudio implementation.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef _OFMAXIM_H
+#define _OFMAXIM_H
+
+#include "maximilian.h"
+//#include "maxiFFT.h"
+
+
+typedef maxiMix ofxMaxiMix;
+typedef maxiOsc ofxMaxiOsc;
+typedef maxiEnvelope ofxMaxiEnvelope;
+typedef maxiDelayline ofxMaxiDelayline;
+typedef maxiFilter ofxMaxiFilter;
+typedef maxiSample ofxMaxiSample;
+//typedef maxiFFT ofxMaxiFFT;
+//typedef maxiIFFT ofxMaxiIFFT;
+//typedef maxiFFTOctaveAnalyzer ofxMaxiFFTOctaveAnalyzer;
+
+#endif
diff --git a/ofxMaxim/ofxMaximiPhoneExample/ofxiphone-Info.plist b/ofxMaxim/ofxMaximiPhoneExample/ofxiphone-Info.plist
new file mode 100644
index 0000000..43db2fa
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/ofxiphone-Info.plist
@@ -0,0 +1,36 @@
+<?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>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleIdentifier</key>
+ <string>${PRODUCT_NAME:identifier}</string>
+ <key>UIStatusBarHidden</key>
+ <true/>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UIApplicationExitsOnSuspend</key>
+ <true/>
+ <key>UIInterfaceOrientation</key>
+ <string>UIInterfaceOrientationPortrait</string>
+</dict>
+</plist>
diff --git a/ofxMaxim/ofxMaximiPhoneExample/src/main.mm b/ofxMaxim/ofxMaximiPhoneExample/src/main.mm
new file mode 100644
index 0000000..a0b6b4c
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/src/main.mm
@@ -0,0 +1,8 @@
+#include "ofMain.h"
+#include "testApp.h"
+
+int main(){
+ ofSetupOpenGL(1024,768, OF_FULLSCREEN); // <-------- setup the GL context
+
+ ofRunApp(new testApp);
+}
diff --git a/ofxMaxim/ofxMaximiPhoneExample/src/testApp.h b/ofxMaxim/ofxMaximiPhoneExample/src/testApp.h
new file mode 100755
index 0000000..ac944e5
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/src/testApp.h
@@ -0,0 +1,42 @@
+#pragma once
+
+#include "ofMain.h"
+#include "ofxiPhone.h"
+#include "ofxiPhoneExtras.h"
+#include "ofxMaxim.h"
+
+
+class testApp : public ofxiPhoneApp {
+
+public:
+ ~testApp();
+ void setup();
+ void update();
+ void draw();
+ void exit();
+
+ void touchDown(ofTouchEventArgs &touch);
+ void touchMoved(ofTouchEventArgs &touch);
+ void touchUp(ofTouchEventArgs &touch);
+ void touchDoubleTap(ofTouchEventArgs &touch);
+
+ void lostFocus();
+ void gotFocus();
+ void gotMemoryWarning();
+ void deviceOrientationChanged(int newOrientation);
+
+ void audioReceived( float * input, int bufferSize, int nChannels );
+ void audioRequested( float * output, int bufferSize, int nChannels );
+
+ int initialBufferSize;
+ int sampleRate;
+
+
+ ofxMaxiOsc myOsc1;
+ ofxMaxiSample sample1;
+ double patch1,sample,outputs1[2];
+ ofxMaxiMix channel1;
+
+};
+
+
diff --git a/ofxMaxim/ofxMaximiPhoneExample/src/testApp.mm b/ofxMaxim/ofxMaximiPhoneExample/src/testApp.mm
new file mode 100755
index 0000000..8dc9e95
--- /dev/null
+++ b/ofxMaxim/ofxMaximiPhoneExample/src/testApp.mm
@@ -0,0 +1,116 @@
+#include "testApp.h"
+#include "ofxMaxim.h"
+
+testApp::~testApp() {
+
+ delete sample1.myData;
+
+}
+
+
+//--------------------------------------------------------------
+void testApp::setup(){
+ ofEnableAlphaBlending();
+ // register touch events
+ ofRegisterTouchEvents(this);
+
+ // initialize the accelerometer
+ ofxAccelerometer.setup();
+
+ //iPhoneAlerts will be sent to this.
+ ofxiPhoneAlerts.addListener(this);
+
+ sampleRate = 44100;
+ initialBufferSize = 512;
+
+ sample1.load(ofToDataPath("beat2.wav"));
+
+ ofSoundStreamSetup(2,0,this, sampleRate, initialBufferSize, 4);
+
+ //If you want a landscape oreintation
+ //iPhoneSetOrientation(OFXIPHONE_ORIENTATION_LANDSCAPE_RIGHT);
+
+ ofBackground(255,255,255);
+}
+
+//--------------------------------------------------------------
+void testApp::update(){
+
+}
+
+//--------------------------------------------------------------
+void testApp::draw(){
+
+}
+
+//--------------------------------------------------------------
+void testApp::exit(){
+
+}
+
+
+//--------------------------------------------------------------
+void testApp::audioRequested(float * output, int bufferSize, int nChannels){
+
+ if( initialBufferSize != bufferSize ){
+ ofLog(OF_LOG_ERROR, "your buffer size was set to %i - but the stream needs a buffer size of %i", initialBufferSize, bufferSize);
+ return;
+ }
+
+ for (int i = 0; i < bufferSize; i++){
+
+ sample=sample1.play(1.);
+ channel1.stereo(sample,outputs1,0.5);
+
+ output[i*nChannels ] = outputs1[0];
+ output[i*nChannels + 1] = outputs1[1];
+
+ }
+
+}
+
+//--------------------------------------------------------------
+void testApp::audioReceived(float * input, int bufferSize, int nChannels){
+
+}
+
+//--------------------------------------------------------------
+void testApp::touchDown(ofTouchEventArgs &touch){
+
+}
+
+//--------------------------------------------------------------
+void testApp::touchMoved(ofTouchEventArgs &touch){
+
+}
+
+//--------------------------------------------------------------
+void testApp::touchUp(ofTouchEventArgs &touch){
+
+}
+
+//--------------------------------------------------------------
+void testApp::touchDoubleTap(ofTouchEventArgs &touch){
+
+}
+
+//--------------------------------------------------------------
+void testApp::lostFocus(){
+
+}
+
+//--------------------------------------------------------------
+void testApp::gotFocus(){
+
+}
+
+//--------------------------------------------------------------
+void testApp::gotMemoryWarning(){
+
+}
+
+//--------------------------------------------------------------
+void testApp::deviceOrientationChanged(int newOrientation){
+
+}
+