diff --git a/.gitignore b/.gitignore index 475a2375557958c6f577bd5f68b04ca109718e85..0b97d8ba01e95d0036e28ff1ed0967f907335321 100644 --- a/.gitignore +++ b/.gitignore @@ -11,8 +11,8 @@ Introjucer/Builds/Linux/build Introjucer/Builds/VisualStudio2010/Debug Introjucer/Builds/VisualStudio2010/Release Introjucer/Builds/VisualStudio2010/*.user -Introjucer/Builds/VisualStudio2010/The Jucer.sdf -Introjucer/Builds/VisualStudio2010/The Jucer.v11.suo +Introjucer/Builds/VisualStudio2010/*.sdf +Introjucer/Builds/VisualStudio2010/*.suo # 3. extra files Builds/Linux/build/data @@ -35,6 +35,17 @@ Builds/VisualStudio2012/open-ephys.vcxproj.user Builds/VisualStudio2012/windowState.xml Builds/VisualStudio2012/pipetest.bit +Builds/VisualStudio2010/Debug +Builds/VisualStudio2010/Release +Builds/VisualStudio2010/ipch +Builds/VisualStudio2010/open-ephys.sdf +Builds/VisualStudio2010/open-ephys.opensdf +Builds/VisualStudio2010/open-ephys.suo +Builds/VisualStudio2010/open-ephys.v11.suo +Builds/VisualStudio2010/open-ephys.vcxproj.user +Builds/VisualStudio2010/windowState.xml +Builds/VisualStudio2010/pipetest.bit + # 5. Miscellanous generated files (Doxygen, etc.) Source/Docs/* diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile index bed0ecf2ad1ce509b0740260c522624a73d1fa6a..3998a067c3418ac21b86beec90f57de8921f5b36 100644 --- a/Builds/Linux/Makefile +++ b/Builds/Linux/Makefile @@ -79,12 +79,6 @@ OBJECTS := \ $(OBJDIR)/RecordControl_3e1c6062.o \ $(OBJDIR)/Merger_2f90542e.o \ $(OBJDIR)/Splitter_6e27a57b.o \ - $(OBJDIR)/SpikePlot_c1cf98bd.o \ - $(OBJDIR)/BaseUIElement_ec903c4d.o \ - $(OBJDIR)/GenericAxes_d802ed92.o \ - $(OBJDIR)/PlotUtils_9ef52686.o \ - $(OBJDIR)/ProjectionAxes_7c67c3e8.o \ - $(OBJDIR)/WaveAxes_8adc45d2.o \ $(OBJDIR)/SpikeObject_24e8c655.o \ $(OBJDIR)/SpikeDisplayCanvas_b208ff6e.o \ $(OBJDIR)/DataWindow_83ce6754.o \ @@ -93,6 +87,7 @@ OBJECTS := \ $(OBJDIR)/SpikeDetector_300d85e7.o \ $(OBJDIR)/AudioNode_94606ff3.o \ $(OBJDIR)/EventNode_95c842b7.o \ + $(OBJDIR)/RHD2000Editor_d7ddd6b.o \ $(OBJDIR)/RecordControlEditor_244084cb.o \ $(OBJDIR)/ReferenceNodeEditor_19ee0fac.o \ $(OBJDIR)/ResamplingNodeEditor_f2d6f061.o \ @@ -358,36 +353,6 @@ $(OBJDIR)/Splitter_6e27a57b.o: ../../Source/Processors/Utilities/Splitter.cpp @echo "Compiling Splitter.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" -$(OBJDIR)/SpikePlot_c1cf98bd.o: ../../Source/Processors/Visualization/SpikePlotting/SpikePlot.cpp - -@mkdir -p $(OBJDIR) - @echo "Compiling SpikePlot.cpp" - @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" - -$(OBJDIR)/BaseUIElement_ec903c4d.o: ../../Source/Processors/Visualization/SpikePlotting/BaseUIElement.cpp - -@mkdir -p $(OBJDIR) - @echo "Compiling BaseUIElement.cpp" - @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" - -$(OBJDIR)/GenericAxes_d802ed92.o: ../../Source/Processors/Visualization/SpikePlotting/GenericAxes.cpp - -@mkdir -p $(OBJDIR) - @echo "Compiling GenericAxes.cpp" - @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" - -$(OBJDIR)/PlotUtils_9ef52686.o: ../../Source/Processors/Visualization/SpikePlotting/PlotUtils.cpp - -@mkdir -p $(OBJDIR) - @echo "Compiling PlotUtils.cpp" - @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" - -$(OBJDIR)/ProjectionAxes_7c67c3e8.o: ../../Source/Processors/Visualization/SpikePlotting/ProjectionAxes.cpp - -@mkdir -p $(OBJDIR) - @echo "Compiling ProjectionAxes.cpp" - @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" - -$(OBJDIR)/WaveAxes_8adc45d2.o: ../../Source/Processors/Visualization/SpikePlotting/WaveAxes.cpp - -@mkdir -p $(OBJDIR) - @echo "Compiling WaveAxes.cpp" - @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" - $(OBJDIR)/SpikeObject_24e8c655.o: ../../Source/Processors/Visualization/SpikeObject.cpp -@mkdir -p $(OBJDIR) @echo "Compiling SpikeObject.cpp" @@ -428,6 +393,11 @@ $(OBJDIR)/EventNode_95c842b7.o: ../../Source/Processors/EventNode.cpp @echo "Compiling EventNode.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/RHD2000Editor_d7ddd6b.o: ../../Source/Processors/Editors/RHD2000Editor.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling RHD2000Editor.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/RecordControlEditor_244084cb.o: ../../Source/Processors/Editors/RecordControlEditor.cpp -@mkdir -p $(OBJDIR) @echo "Compiling RecordControlEditor.cpp" diff --git a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj index 7e8e6bbfbee72ab1d7a9d008b5e4d07a813ddf61..093db028d4f0867999a63c6d036379a7ac2bb377 100644 --- a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj +++ b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj @@ -6,3710 +6,2805 @@ objectVersion = 46; objects = { -/* Begin PBXBuildFile section */ - 002427B013C43CE3E6D4E9B5 /* juce_opengl.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5915DB02FB7CA8CEC1BF38A9 /* juce_opengl.mm */; }; - 004E78BC139419671A9EA137 /* MainWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E08E877C3A6283CF5C803957 /* MainWindow.cpp */; }; - 00A0D05390DB9F2B74DDAA78 /* Bessel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1989E86F8DFDE34887AC0326 /* Bessel.cpp */; }; - 06BCB79AE267E5841F641E38 /* juce_cryptography.mm in Sources */ = {isa = PBXBuildFile; fileRef = 488D1B00C9E5FE4DAB035EDF /* juce_cryptography.mm */; }; - 0836C50051EF59BF91D7B12D /* LfpDisplayEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A91849BE6B96EB8C0663469 /* LfpDisplayEditor.cpp */; }; - 09673DA3B4D6EA61DEFC0C46 /* DataViewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 47A3942AC30A3212C01F1CAF /* DataViewport.cpp */; }; - 0AE243437B40602D35435C32 /* AudioComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B04D87ED6AA4897B6CD3CCF6 /* AudioComponent.cpp */; }; - 0BD17A4E45BB5A2A05731A1A /* SpikePlot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61AD209597F427C4EA8E4F62 /* SpikePlot.cpp */; }; - 0CEFF81CD8861F959DB13362 /* RecordControlEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1552007C6C6AF750278C5BE5 /* RecordControlEditor.cpp */; }; - 0D3DFADD627629AD52668186 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 39F287BE4C0B4F3BD4A949FD /* Accelerate.framework */; }; - 11D82BA398E9433440B76F66 /* PhaseDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFD9560522567A033226BD7 /* PhaseDetector.cpp */; }; - 129ADFA8B25DE091AFA2D9E3 /* Custom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8D895B3AD895C6E7FD446BF /* Custom.cpp */; }; - 13F1111511DD01E843E631CA /* ProcessorList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 79C91DDF3BC3F15D0338E504 /* ProcessorList.cpp */; }; - 14BDAEA656AAFA60334CC55C /* AccessClass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 420B0E95F1300ABFDC125DBF /* AccessClass.cpp */; }; - 1691EC0AC4C7083D65B925E2 /* FPGAOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9D78F50147005EDB0E89E2B4 /* FPGAOutput.cpp */; }; - 19BB86C918F89D1377F8A0E1 /* SpikeObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5894D40A0E8FA6E9B3EBF9D9 /* SpikeObject.cpp */; }; - 1B620FC17AAECA4C5DE741E2 /* DataWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 66463AB11EA4D6341C32F27E /* DataWindow.cpp */; }; - 21539690A9A5DD20AFAF41D3 /* SignalGeneratorEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9136BD46BE1E28A96FBBD440 /* SignalGeneratorEditor.cpp */; }; - 23E05FAB008AC5755DB85BB5 /* BaseUIElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0B8C88B127EB4378B76B08C /* BaseUIElement.cpp */; }; - 24CC7E9A7E87F762D4AB0467 /* DataThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92602D7166325C7232B85EDD /* DataThread.cpp */; }; - 251E09656F171E3F0733B33C /* GenericAxes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B03E89A306A88F7FE43B831 /* GenericAxes.cpp */; }; - 285FF16149C85F2793EBCBAE /* Design.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2B93450006102A0093F5EACB /* Design.cpp */; }; - 2B29D90B985E9EB788472EFE /* SplitterEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D51315B4241B019BE43EE4F1 /* SplitterEditor.cpp */; }; - 2B4A80DCF867DC025C21966B /* Merger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4867923F31CC3EDC9B1A5BE5 /* Merger.cpp */; }; - 2D2BDB63CBD0BED07FF9E44B /* RecentFilesMenuTemplate.nib in Resources */ = {isa = PBXBuildFile; fileRef = BBE1DB78E35135B41537DCB5 /* RecentFilesMenuTemplate.nib */; }; - 3130878C465F3294A89CA142 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E31563D2E7DDD8315F369233 /* IOKit.framework */; }; - 3162B66BC8118715AAA527D7 /* UIComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D2A3B4CDD296B4CEC6902FD7 /* UIComponent.cpp */; }; - 352F3875222B1D233013AAF9 /* ReferenceNodeEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9C39C584DA6F507E773687EE /* ReferenceNodeEditor.cpp */; }; - 38568B2E6C61E2F07173B568 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C868329EBC1BBA606AB2EB88 /* AudioToolbox.framework */; }; - 3933895CA488855A23943F61 /* ParameterEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46E3A634686BFEF787229582 /* ParameterEditor.cpp */; }; - 3A2E957EB8D117C535F119E9 /* ArduinoOutputEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1AD76E8111A738A8F3717060 /* ArduinoOutputEditor.cpp */; }; - 3C464BC802026D6EF6AD3818 /* OpenGLCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F2FDC07162CAEDE524F09CFC /* OpenGLCanvas.cpp */; }; - 3D0C7CA4AD9E3963D52E89BD /* DiscRecording.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D685CFEA6344360FBFC355B6 /* DiscRecording.framework */; }; - 3FF289281D3318A7BA8BB44D /* juce_audio_processors.mm in Sources */ = {isa = PBXBuildFile; fileRef = B20469D88488F0809126CC80 /* juce_audio_processors.mm */; }; - 4AD3281B0CCF122A25E33667 /* Biquad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 22801F75289646F6A85E5583 /* Biquad.cpp */; }; - 4FA2949D3023FC2E377AFFB6 /* unibody-8.otf in Resources */ = {isa = PBXBuildFile; fileRef = 61317B5191E05925F232E18C /* unibody-8.otf */; }; - 4FEC4EC2796E37A3B11B50B9 /* Filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 587FCA2485B9C89C2A99C23A /* Filter.cpp */; }; - 512D7D16D0A95BDD0D6D6E45 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FD13AA663EEE7CC2F83033D /* WebKit.framework */; }; - 52472ED70173042204958538 /* ProjectionAxes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E55A43D066A2B892DBCA640 /* ProjectionAxes.cpp */; }; - 52AE3F7AEED81BA9ED5C4830 /* ChannelSelector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E216D095C98F850A5FB6FB0F /* ChannelSelector.cpp */; }; - 5570682BF1A39FB3E3FAC182 /* LfpDisplayCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A94E809624F99387E600399 /* LfpDisplayCanvas.cpp */; }; - 55CD2E9F373B69C3E8363B78 /* SourceNodeEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6328434A329C353DB8D9512C /* SourceNodeEditor.cpp */; }; - 582C224AA50C9395810C8E27 /* ofSerial.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 308F614D30DCB9AE3767C928 /* ofSerial.cpp */; }; - 58D3FF3B1F462634167BDFB5 /* ControlPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 610E487E060C42B52FD5AAC9 /* ControlPanel.cpp */; }; - 58E0EC510F2A88E14AE55439 /* juce_gui_extra.mm in Sources */ = {isa = PBXBuildFile; fileRef = 27DC0E650D6D54DF29E6DB68 /* juce_gui_extra.mm */; }; - 591CED1277A8C945EF60841C /* MessageCenter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BD2C39F13FDE202141C4B41 /* MessageCenter.cpp */; }; - 5AE42EF7A713B1EC0ACF9EDE /* FilterNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B0E8FAD5AC445F612E3468B9 /* FilterNode.cpp */; }; - 6029B20DF2BD523AC0F78896 /* FilterEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D90290A0AA2C36CE757E46D5 /* FilterEditor.cpp */; }; - 627C7B84F5FD275FAF43663A /* WiFiOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2D41C43686CDE35E86A389D7 /* WiFiOutput.cpp */; }; - 6306AA945375749C4FE834E6 /* Main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2C89EC72FF6A7118EF459DC3 /* Main.cpp */; }; - 6510492BAE00C95DC620F493 /* juce_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = A6A579E4E4AEA865BC71148C /* juce_core.mm */; }; - 66F3B79BDF9BFB631D7E3584 /* RecordNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A4E2CAAF556D557B24182414 /* RecordNode.cpp */; }; - 6702EEA4E99D503C0EE933C4 /* GenericEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3AE8303545E28D793312F46 /* GenericEditor.cpp */; }; - 685151FF4FB872983524A5C3 /* SpikeDisplayNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DAA04A0FD47097893712B241 /* SpikeDisplayNode.cpp */; }; - 69630D3ECA4D6014EE3734CD /* State.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C1CB526B75E406851FA918C6 /* State.cpp */; }; - 6A13D8F42A330E2C410B43E3 /* EditorViewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7E875E681E18D693D5ADB2FB /* EditorViewport.cpp */; }; - 6B67D7B6301182C7621294B6 /* FPGAThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA23A1334E4CFA77BC18A153 /* FPGAThread.cpp */; }; - 7015D104F55D5B128341CEA8 /* juce_graphics.mm in Sources */ = {isa = PBXBuildFile; fileRef = BBDFB328C3D5FC72A0446E6A /* juce_graphics.mm */; }; - 702C9BFCE865CB6C6B8BFB0D /* rhd2000registers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5DB3B3197F8C1E5EE159D6FC /* rhd2000registers.cpp */; }; - 704484388E63CDE33491E1AB /* EventDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39464D2A22940DA2DDCCCFC6 /* EventDetector.cpp */; }; - 71111DE81104B1536ECB6DFB /* SourceNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA6FDB1366BE7EC30F1539B /* SourceNode.cpp */; }; - 739573501D1D440A72C5C2E5 /* RHD2000Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A3FB0EA0264580F6B00D993B /* RHD2000Thread.cpp */; }; - 784125612E2B7AC6CD89D835 /* EventNodeEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 70151263C4CB8A4F79431E11 /* EventNodeEditor.cpp */; }; - 7F188166D38DA7FB23311413 /* ImageIcon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 04C6B933E1603B4D0916570D /* ImageIcon.cpp */; }; - 80E5365461A5A7A32C48C563 /* EventNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F94DD42C7BBF81C101D3F605 /* EventNode.cpp */; }; - 85A60568B3DC342C76B4E679 /* GenericProcessor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3AE038CACE48AF85C4FB1ED5 /* GenericProcessor.cpp */; }; - 895102FADC23C73AA37D79C1 /* WaveAxes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 036A7626AA8B2E3ABC4D926B /* WaveAxes.cpp */; }; - 89FCE8890946693CD5FC4A70 /* okFrontPanelDLL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 235A8987D99A191D07208D2F /* okFrontPanelDLL.cpp */; }; - 8A5BACA019DA9B0EFAD5CE93 /* ProcessorGraph.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 555D34D0CD8776EE5996CC3A /* ProcessorGraph.cpp */; }; - 9212DC2AEE118398CC970DDF /* CoreMIDI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 243817BA562AD7FA76C834C9 /* CoreMIDI.framework */; }; - 9227961C07C0EE73E89C90B5 /* juce_audio_devices.mm in Sources */ = {isa = PBXBuildFile; fileRef = 65F4459CC1832883FFF6C166 /* juce_audio_devices.mm */; }; - 955561F4FF4484648FDB9F73 /* FileReaderThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1718EC50691D8421EC00F8B3 /* FileReaderThread.cpp */; }; - 95AE939ADE096394CCD2526F /* EditorViewportButtons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9F3B3184EC6D42CEA35D6ED8 /* EditorViewportButtons.cpp */; }; - 96142DE6467CA74A74E669D4 /* IntanThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9C089C090E400CC0E8BBB827 /* IntanThread.cpp */; }; - 992137E90F9D41522FD56875 /* MergerEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 29FD7B383C5DDACAA7B8DFD3 /* MergerEditor.cpp */; }; - 996F9E4989EB47941D8100DA /* SignalGenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5522973FA48A13C6BED293FE /* SignalGenerator.cpp */; }; - 9A80E3D1D1758A31D2169497 /* CustomLookAndFeel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3774BBCA6CB133D9A854CF71 /* CustomLookAndFeel.cpp */; }; - 9D17609E468FC65EB70ED7F4 /* RBJ.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A21A229CFACC67E31F4F727 /* RBJ.cpp */; }; - 9E30156DBCE4EAF9EFAF0AC4 /* juce_audio_utils.mm in Sources */ = {isa = PBXBuildFile; fileRef = 56728EC77C65482B9C86FF4D /* juce_audio_utils.mm */; }; - 9E8544C3983B3203530B5A49 /* Parameter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD2370F8F4A44446558A08FB /* Parameter.cpp */; }; - A0DAD4E5F7583349DC9275F2 /* juce_data_structures.mm in Sources */ = {isa = PBXBuildFile; fileRef = DBCA7E2FFCFD1354DD19DDD6 /* juce_data_structures.mm */; }; - A269A876BDF3B7011FA4C681 /* juce_gui_basics.mm in Sources */ = {isa = PBXBuildFile; fileRef = 23609D430A25F54723269E91 /* juce_gui_basics.mm */; }; - A2EE65335FB2810C04ECBFAF /* juce_audio_formats.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6B28CEAF75E22F2CCCACBCC7 /* juce_audio_formats.mm */; }; - A44FEA7117CFE2F06B9889B4 /* Legendre.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C4B0DF8094C90543A65E03E3 /* Legendre.cpp */; }; - A454D138EC507C01D299AB0F /* WiFiOutputEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C79249376E3FDF10615E16EA /* WiFiOutputEditor.cpp */; }; - A94130738A9973148544664A /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5A00ACFA3D76168F22F1205 /* Cocoa.framework */; }; - AA16BE5A6BBD024C8FCFCDA8 /* VisualizerEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAA3B9396EA62166234DAEF1 /* VisualizerEditor.cpp */; }; - AB6FC90FA7FACBC78BAD23F8 /* PlotUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DB7638B853C81BC53651DCA2 /* PlotUtils.cpp */; }; - AD032CEA5DBE4D4C76D3D2D1 /* ArduinoOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D38E60AC4854B6E1EDE488EB /* ArduinoOutput.cpp */; }; - AD7D05519200FB0EE1C7617A /* BinaryData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A512C5B237A77EF6FB8E11A0 /* BinaryData.cpp */; }; - AE06672D2CBF8F64465B2126 /* RootFinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3F69480D6145C77992FA59BA /* RootFinder.cpp */; }; - AF67C81811F18FCE6AA9C895 /* SpikeDisplayEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1EC95CD1D830F6D85ADB3B9D /* SpikeDisplayEditor.cpp */; }; - B226387EB0FCE3BE6773FF61 /* Cascade.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 09BCBD414282A3AA4F66A3A5 /* Cascade.cpp */; }; - B3B08037F49EC7540586828F /* ChebyshevI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AC2CFF4DA5CE431FCC628BA3 /* ChebyshevI.cpp */; }; - B6C73582C501D8C3C03A4860 /* ChebyshevII.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B767A249792EB15A87054409 /* ChebyshevII.cpp */; }; - BBE886EA79C50D0D68A5A753 /* PoleFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65312FAD0900119CDF6CF414 /* PoleFilter.cpp */; }; - BE54C019A73BBAE05BFD7D17 /* ResamplingNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A98A22CF5F208ED6DBE08063 /* ResamplingNode.cpp */; }; - BF3254F07C15D467D6DB3FEF /* AudioEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 10BE33089BA6F3468F36CD6C /* AudioEditor.cpp */; }; - C0E966234C8AF91C19CF6EA4 /* Param.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3F6C67E29CDEDF2EF61C054F /* Param.cpp */; }; - C2475E008FEB33B3EA7B6C7F /* juce_audio_basics.mm in Sources */ = {isa = PBXBuildFile; fileRef = DF3C9A1DD67E879E4E0A2727 /* juce_audio_basics.mm */; }; - C3406F00595AEFF068EDB162 /* FPGAOutputEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 169F1B20FC9FFE88C53D2735 /* FPGAOutputEditor.cpp */; }; - C59764685E62E7C4D323F84B /* LfpDisplayNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA535EA158451360B7B8AE52 /* LfpDisplayNode.cpp */; }; - C6F08BF3EF53274A42BB88EB /* Channel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BC055494F9FEE3F90630541 /* Channel.cpp */; }; - C853FCE2F6C91B3643322CF0 /* PracticalSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9F577889CB6C54A2F7B1CA80 /* PracticalSocket.cpp */; }; - C8D7AC0B88A9A2C182B2B752 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBB769DEBCD6468C13A3CD25 /* Carbon.framework */; }; - C9AC286A46B3A1318F298DEF /* rhd2000datablock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECB5A75A81B90327F58CBD9E /* rhd2000datablock.cpp */; }; - CA4DCF67B48352BE633A616D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C055D09224D84121A3EBB29F /* QuartzCore.framework */; }; - CAB9D9DEF279F93132B45F90 /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80C1B737D2C2CB519D1787D7 /* QTKit.framework */; }; - CB470032BC92A30906C96258 /* Elliptic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 392408C1943AC6234BAAC743 /* Elliptic.cpp */; }; - D0873C347977633B4421B94D /* SpikeDetectorEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A252FE4E6A360CBC4AF694B3 /* SpikeDetectorEditor.cpp */; }; - D0E9E20F9D8FDA700BB6D820 /* Splitter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2C4730CAFED4F6292B575318 /* Splitter.cpp */; }; - D19775DC99C67AD20F98EF17 /* Documentation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E90FCB43DA2FF766597DA75E /* Documentation.cpp */; }; - DA836EC803E4FF4EDEBE6386 /* rhd2000evalboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2D2BAC4320470CF68743F58E /* rhd2000evalboard.cpp */; }; - DDDFAE2042D8AD20CC78CE3C /* ofArduino.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3753B3B311AE0A9F4CC5AD40 /* ofArduino.cpp */; }; - DE758AF46844DF951655966C /* AudioNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B27F558F42AC78F0E564B5AF /* AudioNode.cpp */; }; - E100912B2FCE36A30D097C95 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C21DBFB38865E5AFE367C6F /* OpenGL.framework */; }; - E4DA638CDD4DD574A6CD843E /* RecordControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 258938780F93A7CF41366F26 /* RecordControl.cpp */; }; - E5CBEA12D7AD7788C9BF5737 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27313EA12BC45638321922CA /* CoreAudio.framework */; }; - E85DA5FC9A162F129ABA7113 /* SignalChainManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0987F7E90136D0E08A606A22 /* SignalChainManager.cpp */; }; - ED8CB527B27C67E9E4DA027C /* SpikeDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC3B7E4E25505D9044BFACC7 /* SpikeDetector.cpp */; }; - EDEE5E21F0C9BDB7DB796083 /* AudioResamplingNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 76F569AE7B444D8F69EE0E86 /* AudioResamplingNode.cpp */; }; - EE56A6BBBFA4A27A4BCF7279 /* SpikeDisplayCanvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7D4C9E3ED3763847C087F46 /* SpikeDisplayCanvas.cpp */; }; - F0EC60AEFAFF3D289F8110BE /* ResamplingNodeEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C5ABE6BDCA91410BA92A7BD9 /* ResamplingNodeEditor.cpp */; }; - F4397EAE00E0B9F96C8B6C07 /* InfoLabel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 17E13CCDA0C82F92EAB05BE6 /* InfoLabel.cpp */; }; - F505DF3C2BA492B5A2F28D05 /* Butterworth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B47B3368AA1A182B0CA1AB26 /* Butterworth.cpp */; }; - FA2A052548AAD146F3F5AD83 /* juce_video.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4A7695E93CE32F4E95042FCB /* juce_video.mm */; }; - FAE745870674A07A65690433 /* DataBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 788F8B7719B70465762B634B /* DataBuffer.cpp */; }; - FCB767F14565886C9D823916 /* juce_events.mm in Sources */ = {isa = PBXBuildFile; fileRef = C29E664781AA2396C8D59543 /* juce_events.mm */; }; - FD4865450F4C47FF3C6327FE /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56169D835A3E3029D6E3904C /* QuickTime.framework */; }; - FDCFDC9CC6D7A82131190FB0 /* ReferenceNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BBD9C2AED6F500D090069007 /* ReferenceNode.cpp */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 0052A4FD257928E5D83927E6 /* juce_WavAudioFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_WavAudioFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp; sourceTree = SOURCE_ROOT; }; - 01859D6E7D95E44BD8E17D91 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_cryptography/juce_module_info; sourceTree = SOURCE_ROOT; }; - 018F4E079EB12A78C4F8F773 /* juce_MidiBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiBuffer.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h; sourceTree = SOURCE_ROOT; }; - 01C313C323E5CB995C939E0B /* juce_Component.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Component.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp; sourceTree = SOURCE_ROOT; }; - 01D791730840EB0BA7FD61BA /* juce_Socket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Socket.h; path = ../../JuceLibraryCode/modules/juce_core/network/juce_Socket.h; sourceTree = SOURCE_ROOT; }; - 020205BB77179A9BE3FFF1E1 /* juce_win32_QuickTimeMovieComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_QuickTimeMovieComponent.cpp; path = ../../JuceLibraryCode/modules/juce_video/native/juce_win32_QuickTimeMovieComponent.cpp; sourceTree = SOURCE_ROOT; }; - 020F745606F9516D8D246E04 /* SimpleKeyEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SimpleKeyEvent.h; path = ../../Source/Processors/Visualization/SpikePlotting/SimpleKeyEvent.h; sourceTree = SOURCE_ROOT; }; - 0242AB5BCD8C002DC2E30BAC /* juce_MidiOutput.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiOutput.h; path = ../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h; sourceTree = SOURCE_ROOT; }; - 027C1143CC66EA8F73C39A74 /* juce_ThreadWithProgressWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ThreadWithProgressWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h; sourceTree = SOURCE_ROOT; }; - 0287B009511521BEAAE8A52C /* DataThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataThread.h; path = ../../Source/Processors/DataThreads/DataThread.h; sourceTree = SOURCE_ROOT; }; - 028D4D3C0862B4B1312E2395 /* SourceNodeEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SourceNodeEditor.h; path = ../../Source/Processors/Editors/SourceNodeEditor.h; sourceTree = SOURCE_ROOT; }; - 02DA588D3B873F1971ACD912 /* juce_FlacAudioFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FlacAudioFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp; sourceTree = SOURCE_ROOT; }; - 0316B49B86725305C70783CA /* juce_AudioPluginFormatManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioPluginFormatManager.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp; sourceTree = SOURCE_ROOT; }; - 033AE5DE19F0EEDC47D41C80 /* juce_FileChooserDialogBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileChooserDialogBox.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp; sourceTree = SOURCE_ROOT; }; - 036A7626AA8B2E3ABC4D926B /* WaveAxes.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WaveAxes.cpp; path = ../../Source/Processors/Visualization/SpikePlotting/WaveAxes.cpp; sourceTree = SOURCE_ROOT; }; - 03D7B457E0915E43A6AFF4B4 /* juce_AudioUnitPluginFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioUnitPluginFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h; sourceTree = SOURCE_ROOT; }; - 04C474E0F2F7FDEC714A673C /* juce_PathIterator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PathIterator.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp; sourceTree = SOURCE_ROOT; }; - 04C6B933E1603B4D0916570D /* ImageIcon.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ImageIcon.cpp; path = ../../Source/Processors/Editors/ImageIcon.cpp; sourceTree = SOURCE_ROOT; }; - 04ED2387517934A84ACF9865 /* juce_BubbleComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BubbleComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp; sourceTree = SOURCE_ROOT; }; - 05997833A4AA137FD64348AD /* juce_TextDragAndDropTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextDragAndDropTarget.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h; sourceTree = SOURCE_ROOT; }; - 05BD169B8574607A6F6AD3B6 /* juce_Identifier.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Identifier.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp; sourceTree = SOURCE_ROOT; }; - 05C35036E964AAD6024E0766 /* MergerA-01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "MergerA-01.png"; path = "../../Resources/Images/Buttons/MergerA-01.png"; sourceTree = SOURCE_ROOT; }; - 05DCAE8CA29532E2169D7AC1 /* juce_Matrix3D.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Matrix3D.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_Matrix3D.h; sourceTree = SOURCE_ROOT; }; - 06072EC6BCD3B7D8C17C2402 /* juce_AudioProcessor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioProcessor.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp; sourceTree = SOURCE_ROOT; }; - 064393C83AD2AFB2EEF1A920 /* BaseUIElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BaseUIElement.h; path = ../../Source/Processors/Visualization/SpikePlotting/BaseUIElement.h; sourceTree = SOURCE_ROOT; }; - 078625CF5C083AD538D23401 /* juce_AudioCDReader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioCDReader.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp; sourceTree = SOURCE_ROOT; }; - 0790CCE2FCFDFA6944DFC402 /* juce_PopupMenu.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PopupMenu.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp; sourceTree = SOURCE_ROOT; }; - 07FD5E530E9E6BFB2ACA4B8C /* juce_audio_formats.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_audio_formats.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h; sourceTree = SOURCE_ROOT; }; - 081E86FE0B991469CFA8D7EA /* juce_CPlusPlusCodeTokeniser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CPlusPlusCodeTokeniser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp; sourceTree = SOURCE_ROOT; }; - 085F51FEE5C5FDAA321090A0 /* juce_CachedComponentImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CachedComponentImage.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h; sourceTree = SOURCE_ROOT; }; - 087FA26464FB283EC6FD4795 /* juce_NamedPipe.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_NamedPipe.cpp; path = ../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp; sourceTree = SOURCE_ROOT; }; - 08907A4BA0D5628476D19C48 /* juce_RelativePointPath.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativePointPath.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp; sourceTree = SOURCE_ROOT; }; - 08A7A7FD7D77C0657270E9BF /* juce_DrawableText.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableText.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp; sourceTree = SOURCE_ROOT; }; - 08DAD5894A480950C66F5873 /* juce_ArrowButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ArrowButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h; sourceTree = SOURCE_ROOT; }; - 09160DF53438B400BFE85E07 /* juce_InputSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InputSource.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h; sourceTree = SOURCE_ROOT; }; - 0987F7E90136D0E08A606A22 /* SignalChainManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SignalChainManager.cpp; path = ../../Source/UI/SignalChainManager.cpp; sourceTree = SOURCE_ROOT; }; - 09A159213372995F3CCEB85B /* juce_String.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_String.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_String.h; sourceTree = SOURCE_ROOT; }; - 09BCBD414282A3AA4F66A3A5 /* Cascade.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Cascade.cpp; path = ../../Source/Dsp/Cascade.cpp; sourceTree = SOURCE_ROOT; }; - 0A2AD4AB14F93364EFB9611E /* miso-regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = "miso-regular.ttf"; path = "../../Resources/Fonts/miso-regular.ttf"; sourceTree = SOURCE_ROOT; }; - 0A351ED88CF00C0697701E73 /* juce_Logger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Logger.h; path = ../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.h; sourceTree = SOURCE_ROOT; }; - 0A413228C75C046CE683E0E6 /* juce_String.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_String.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_String.cpp; sourceTree = SOURCE_ROOT; }; - 0A42FFB89531588E51762D3E /* juce_android_Audio.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Audio.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp; sourceTree = SOURCE_ROOT; }; - 0A46EF94E558D5E19F96E646 /* juce_Timer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Timer.cpp; path = ../../JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp; sourceTree = SOURCE_ROOT; }; - 0A8BC957DBEE226346C1EA25 /* juce_BigInteger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BigInteger.cpp; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp; sourceTree = SOURCE_ROOT; }; - 0AA8F001A50408977E76ED96 /* juce_RecentlyOpenedFilesList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RecentlyOpenedFilesList.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp; sourceTree = SOURCE_ROOT; }; - 0AAFE3F4D106138401C190C5 /* juce_GlowEffect.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GlowEffect.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp; sourceTree = SOURCE_ROOT; }; - 0B2502A656E77E00AF15A343 /* juce_ApplicationCommandInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationCommandInfo.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h; sourceTree = SOURCE_ROOT; }; - 0B2B7732073D56E484950C8D /* RecordControlEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RecordControlEditor.h; path = ../../Source/Processors/Editors/RecordControlEditor.h; sourceTree = SOURCE_ROOT; }; - 0B382285EEDD8A3FDB45C074 /* juce_ThreadPool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ThreadPool.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h; sourceTree = SOURCE_ROOT; }; - 0B5B63E563EFA7E816DE3DCA /* juce_OutputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OutputStream.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h; sourceTree = SOURCE_ROOT; }; - 0BB4380EDFEAAE0DAB255B90 /* juce_BlowFish.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BlowFish.cpp; path = ../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.cpp; sourceTree = SOURCE_ROOT; }; - 0BCAC20DAB10B957168B85D6 /* juce_Result.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Result.h; path = ../../JuceLibraryCode/modules/juce_core/misc/juce_Result.h; sourceTree = SOURCE_ROOT; }; - 0C646E9950FB580B21E1F2BD /* juce_WindowsMediaAudioFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_WindowsMediaAudioFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp; sourceTree = SOURCE_ROOT; }; - 0CCB1C4D687001E04DE1DD9C /* juce_SubregionStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SubregionStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp; sourceTree = SOURCE_ROOT; }; - 0CCE619599DB39323E49FF3C /* ResamplingNodeEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ResamplingNodeEditor.h; path = ../../Source/Processors/Editors/ResamplingNodeEditor.h; sourceTree = SOURCE_ROOT; }; - 0D3C20D1F00B7B1381E6B987 /* juce_TabbedButtonBar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TabbedButtonBar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp; sourceTree = SOURCE_ROOT; }; - 0D884C2CF25F23CE6B99B2A1 /* juce_Singleton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Singleton.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h; sourceTree = SOURCE_ROOT; }; - 0D8ECE32F7D0FE74185F6EF4 /* juce_PropertyPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PropertyPanel.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h; sourceTree = SOURCE_ROOT; }; - 0DBB88B6BEC06FCECE4CBD28 /* juce_ApplicationCommandInfo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ApplicationCommandInfo.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp; sourceTree = SOURCE_ROOT; }; - 0DD0CBF9BBD4A503F2B7868D /* juce_ListenerList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ListenerList.h; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h; sourceTree = SOURCE_ROOT; }; - 0DE9D2FE41553B4D4316DD55 /* juce_DirectoryIterator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DirectoryIterator.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp; sourceTree = SOURCE_ROOT; }; - 0E4B0B8425DBA19B6F3FE4BF /* juce_UIViewComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_UIViewComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_UIViewComponent.h; sourceTree = SOURCE_ROOT; }; - 0E98E81084F183B8426EDA7F /* juce_DynamicObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DynamicObject.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h; sourceTree = SOURCE_ROOT; }; - 0FA84E49DB493BCC886A355F /* juce_MD5.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MD5.h; path = ../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.h; sourceTree = SOURCE_ROOT; }; - 0FDD7551AC98348D4A98ADC7 /* ProcessorGraph.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProcessorGraph.h; path = ../../Source/Processors/ProcessorGraph.h; sourceTree = SOURCE_ROOT; }; - 0FE8ACC50ED8E7FFC9E6B9B4 /* ControlPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ControlPanel.h; path = ../../Source/UI/ControlPanel.h; sourceTree = SOURCE_ROOT; }; - 105B1452DF6CE1D80D69A9D1 /* ProcessorList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProcessorList.h; path = ../../Source/UI/ProcessorList.h; sourceTree = SOURCE_ROOT; }; - 106E81B939C6B35E34DD71FE /* juce_CodeEditorComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CodeEditorComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h; sourceTree = SOURCE_ROOT; }; - 1086169B0EE86E04B64575C2 /* Dsp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Dsp.h; path = ../../Source/Dsp/Dsp.h; sourceTree = SOURCE_ROOT; }; - 108DF32ADFBA5CA48F928A92 /* juce_File.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_File.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_File.h; sourceTree = SOURCE_ROOT; }; - 10BE33089BA6F3468F36CD6C /* AudioEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioEditor.cpp; path = ../../Source/Processors/Editors/AudioEditor.cpp; sourceTree = SOURCE_ROOT; }; - 113404D3FDE3745DF1E8D014 /* juce_ReadWriteLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReadWriteLock.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h; sourceTree = SOURCE_ROOT; }; - 1191BF3048664183033BFF89 /* juce_DropShadowEffect.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DropShadowEffect.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp; sourceTree = SOURCE_ROOT; }; - 1194EE0956A9645270582979 /* juce_android_Messaging.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Messaging.cpp; path = ../../JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp; sourceTree = SOURCE_ROOT; }; - 11A5824E0239C86801BE2EB8 /* juce_MouseEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MouseEvent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h; sourceTree = SOURCE_ROOT; }; - 11D619EEF63C1827EA91F593 /* juce_UndoManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_UndoManager.cpp; path = ../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp; sourceTree = SOURCE_ROOT; }; - 1246C8A62803B7E115713705 /* juce_LocalisedStrings.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LocalisedStrings.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp; sourceTree = SOURCE_ROOT; }; - 12B5243A9435FABAFBE20165 /* juce_Quaternion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Quaternion.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_Quaternion.h; sourceTree = SOURCE_ROOT; }; - 12B5DDCB6E5ECD93A4C55BB5 /* LfpDisplayCanvas.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LfpDisplayCanvas.h; path = ../../Source/Processors/Visualization/LfpDisplayCanvas.h; sourceTree = SOURCE_ROOT; }; - 1307DAE32BA702565A67D127 /* juce_MidiFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiFile.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp; sourceTree = SOURCE_ROOT; }; - 13212C01A5E138553FAFBE9C /* juce_Drawable.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Drawable.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp; sourceTree = SOURCE_ROOT; }; - 13D9868B08E941F6827E157C /* juce_ResizableWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResizableWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.h; sourceTree = SOURCE_ROOT; }; - 13D9DC48F19699485F9888A4 /* juce_PathIterator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PathIterator.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h; sourceTree = SOURCE_ROOT; }; - 1463D2DAB3A1D8CEE825056A /* juce_AudioCDReader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioCDReader.h; path = ../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h; sourceTree = SOURCE_ROOT; }; - 146C6A6E3C6B17F2AF475B50 /* juce_OpenGLFrameBuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OpenGLFrameBuffer.cpp; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp; sourceTree = SOURCE_ROOT; }; - 14DD0220B41F74C01A9DC676 /* juce_GlyphArrangement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GlyphArrangement.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h; sourceTree = SOURCE_ROOT; }; - 14F594C425F332F455A16D35 /* okFrontPanelDLL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = okFrontPanelDLL.h; path = "../../Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.h"; sourceTree = SOURCE_ROOT; }; - 14FE601229C9A40C6E182F28 /* juce_mac_MouseCursor.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_MouseCursor.mm; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm; sourceTree = SOURCE_ROOT; }; - 1518D2BA7FCAF267EF1F02E6 /* juce_win32_Windowing.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Windowing.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp; sourceTree = SOURCE_ROOT; }; - 154303EE3929F26B93792187 /* SourceNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SourceNode.h; path = ../../Source/Processors/SourceNode.h; sourceTree = SOURCE_ROOT; }; - 1552007C6C6AF750278C5BE5 /* RecordControlEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RecordControlEditor.cpp; path = ../../Source/Processors/Editors/RecordControlEditor.cpp; sourceTree = SOURCE_ROOT; }; - 159790C750B1F8B485DBB499 /* juce_win32_FileChooser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_FileChooser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp; sourceTree = SOURCE_ROOT; }; - 161E095C716133CB255B6CCD /* juce_MidiKeyboardState.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiKeyboardState.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h; sourceTree = SOURCE_ROOT; }; - 167524110873F9888CF1B9E8 /* juce_ApplicationCommandID.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationCommandID.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h; sourceTree = SOURCE_ROOT; }; - 168823A9EBD85BFBFD2CE2EE /* RadioButtons-03.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons-03.png"; path = "../../Resources/Images/Icons/RadioButtons-03.png"; sourceTree = SOURCE_ROOT; }; - 169F1B20FC9FFE88C53D2735 /* FPGAOutputEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FPGAOutputEditor.cpp; path = ../../Source/Processors/Editors/FPGAOutputEditor.cpp; sourceTree = SOURCE_ROOT; }; - 1712916024EC787B6C231732 /* RadioButtons_selected_over-03.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-03.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-03.png"; sourceTree = SOURCE_ROOT; }; - 1718EC50691D8421EC00F8B3 /* FileReaderThread.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FileReaderThread.cpp; path = ../../Source/Processors/DataThreads/FileReaderThread.cpp; sourceTree = SOURCE_ROOT; }; - 1719507D8A73EA71F1C3F306 /* cpmono-plain-serialized */ = {isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-plain-serialized"; path = "../../Resources/Fonts/cpmono-plain-serialized"; sourceTree = SOURCE_ROOT; }; - 172FA5C9EC4B16BC0C45F269 /* juce_Variant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Variant.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.h; sourceTree = SOURCE_ROOT; }; - 174842EA681FA29BE38A6272 /* juce_ButtonPropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ButtonPropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; - 1777330D3BDAE99A93F98943 /* juce_Font.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Font.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h; sourceTree = SOURCE_ROOT; }; - 178AD28BF5BC92B58A3A3539 /* juce_MixerAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MixerAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h; sourceTree = SOURCE_ROOT; }; - 17B29FF3D3EA14EF2BE149BB /* juce_ComponentBoundsConstrainer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentBoundsConstrainer.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp; sourceTree = SOURCE_ROOT; }; - 17CACEC7EA0A4B55A06A0993 /* juce_MidiDataConcatenator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiDataConcatenator.h; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h; sourceTree = SOURCE_ROOT; }; - 17CE6B2913E72ED8727ECD56 /* AudioResamplingNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioResamplingNode.h; path = ../../Source/Processors/AudioResamplingNode.h; sourceTree = SOURCE_ROOT; }; - 17E13CCDA0C82F92EAB05BE6 /* InfoLabel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = InfoLabel.cpp; path = ../../Source/UI/InfoLabel.cpp; sourceTree = SOURCE_ROOT; }; - 17FB020EFEAED8493D3CB121 /* juce_ToolbarItemComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToolbarItemComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h; sourceTree = SOURCE_ROOT; }; - 1819C1C4DE5FEEDEA143E3D2 /* juce_mac_MainMenu.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_MainMenu.mm; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MainMenu.mm; sourceTree = SOURCE_ROOT; }; - 18A730DF335EEB3A4D13FDCA /* juce_MessageManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MessageManager.cpp; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp; sourceTree = SOURCE_ROOT; }; - 18B410DA5435C02C82BA13F8 /* juce_BooleanPropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BooleanPropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h; sourceTree = SOURCE_ROOT; }; - 18C2F9CA38393D106FB834E2 /* juce_AudioPluginFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioPluginFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp; sourceTree = SOURCE_ROOT; }; - 18CFDBCD4A5B80E78DADCFEB /* juce_RectanglePlacement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RectanglePlacement.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp; sourceTree = SOURCE_ROOT; }; - 19043050D1DADAEAB48FB803 /* juce_AudioCDBurner.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioCDBurner.h; path = ../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h; sourceTree = SOURCE_ROOT; }; - 19148DBA36B94FA639DF3A72 /* CustomLookAndFeel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CustomLookAndFeel.h; path = ../../Source/UI/CustomLookAndFeel.h; sourceTree = SOURCE_ROOT; }; - 193FED8339417E8E6264957A /* juce_ElementComparator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ElementComparator.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h; sourceTree = SOURCE_ROOT; }; - 1989E86F8DFDE34887AC0326 /* Bessel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Bessel.cpp; path = ../../Source/Dsp/Bessel.cpp; sourceTree = SOURCE_ROOT; }; - 19A8A8E1BF043B390E02C429 /* juce_linux_Messaging.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Messaging.cpp; path = ../../JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp; sourceTree = SOURCE_ROOT; }; - 19AB6653E818B409554C5606 /* juce_ScopedValueSetter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScopedValueSetter.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h; sourceTree = SOURCE_ROOT; }; - 1A22BB28E65B6D6636CCEBF1 /* RadioButtons_selected_over-02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-02.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-02.png"; sourceTree = SOURCE_ROOT; }; - 1AD76E8111A738A8F3717060 /* ArduinoOutputEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ArduinoOutputEditor.cpp; path = ../../Source/Processors/Editors/ArduinoOutputEditor.cpp; sourceTree = SOURCE_ROOT; }; - 1AEEC114AFAB6E81205FBCD1 /* juce_AttributedString.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AttributedString.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h; sourceTree = SOURCE_ROOT; }; - 1B27BF1CF3F235A55CD5107D /* juce_ResamplingAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResamplingAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - 1BF01252E3A30560525CE057 /* juce_win32_WebBrowserComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_WebBrowserComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp; sourceTree = SOURCE_ROOT; }; - 1C474C73937D98E9D3FFEEC0 /* juce_FilePreviewComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FilePreviewComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h; sourceTree = SOURCE_ROOT; }; - 1C639F4C139C8D7753AA9BB6 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_gui_extra/juce_module_info; sourceTree = SOURCE_ROOT; }; - 1C93ECD2B04F39923E66B529 /* ReferenceNodeEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ReferenceNodeEditor.h; path = ../../Source/Processors/Editors/ReferenceNodeEditor.h; sourceTree = SOURCE_ROOT; }; - 1CB0D7AC988EDEC838A1C546 /* juce_AudioSampleBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioSampleBuffer.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h; sourceTree = SOURCE_ROOT; }; - 1CCC1D4213B17ABF6222EC82 /* juce_PropertiesFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PropertiesFile.cpp; path = ../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp; sourceTree = SOURCE_ROOT; }; - 1CFA355CD6811C253C72BDDA /* juce_KeyPressMappingSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyPressMappingSet.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h; sourceTree = SOURCE_ROOT; }; - 1D1ABA743E533A4B7A50DBB0 /* juce_ReverbAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReverbAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h; sourceTree = SOURCE_ROOT; }; - 1D7578F927EC030203A11978 /* juce_CodeDocument.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CodeDocument.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp; sourceTree = SOURCE_ROOT; }; - 1D7FEC587CFE464A21830C4D /* juce_win32_SystemTrayIcon.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_SystemTrayIcon.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp; sourceTree = SOURCE_ROOT; }; - 1DF5FD417930A62110DF0419 /* juce_ModalComponentManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ModalComponentManager.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp; sourceTree = SOURCE_ROOT; }; - 1E9FE44F0CCC6604B5469412 /* juce_KeyMappingEditorComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyMappingEditorComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp; sourceTree = SOURCE_ROOT; }; - 1EC95CD1D830F6D85ADB3B9D /* SpikeDisplayEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeDisplayEditor.cpp; path = ../../Source/Processors/Editors/SpikeDisplayEditor.cpp; sourceTree = SOURCE_ROOT; }; - 1F12D1392E5DF34C3A3C445D /* juce_NewLine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NewLine.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_NewLine.h; sourceTree = SOURCE_ROOT; }; - 205E9A5C31827555F1CAC30D /* juce_OpenGL_osx.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGL_osx.h; path = ../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_osx.h; sourceTree = SOURCE_ROOT; }; - 208DCD7025D0DF2740C01E4A /* juce_TextPropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextPropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h; sourceTree = SOURCE_ROOT; }; - 20EB4F22A76954F2986F364A /* juce_mac_Windowing.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_Windowing.mm; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_Windowing.mm; sourceTree = SOURCE_ROOT; }; - 215B159836CE40810964B773 /* juce_Uuid.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Uuid.h; path = ../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h; sourceTree = SOURCE_ROOT; }; - 215E1BD79B5870D5356810F0 /* Visualizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Visualizer.h; path = ../../Source/Processors/Visualization/Visualizer.h; sourceTree = SOURCE_ROOT; }; - 217032322A2570ABAC47194C /* juce_Image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Image.h; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.h; sourceTree = SOURCE_ROOT; }; - 21A0260D2DB039B81DF4970C /* juce_FileSearchPath.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileSearchPath.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp; sourceTree = SOURCE_ROOT; }; - 21C11A58CAA0F9E86AA204EC /* juce_Slider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Slider.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.h; sourceTree = SOURCE_ROOT; }; - 21D3C1095D2B5A834D998B74 /* juce_android_OpenSL.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_OpenSL.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp; sourceTree = SOURCE_ROOT; }; - 222AC2E9BEFE12BE7FF88879 /* juce_Thread.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Thread.cpp; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp; sourceTree = SOURCE_ROOT; }; - 22801F75289646F6A85E5583 /* Biquad.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Biquad.cpp; path = ../../Source/Dsp/Biquad.cpp; sourceTree = SOURCE_ROOT; }; - 229989EC8A6F145C81348CA9 /* PhaseDetector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PhaseDetector.h; path = ../../Source/Processors/PhaseDetector.h; sourceTree = SOURCE_ROOT; }; - 235A8987D99A191D07208D2F /* okFrontPanelDLL.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = okFrontPanelDLL.cpp; path = "../../Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.cpp"; sourceTree = SOURCE_ROOT; }; - 23609D430A25F54723269E91 /* juce_gui_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_gui_basics.mm; path = ../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm; sourceTree = SOURCE_ROOT; }; - 23A6BA852B71DAAF3F709428 /* RHD2000Thread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RHD2000Thread.h; path = ../../Source/Processors/DataThreads/RHD2000Thread.h; sourceTree = SOURCE_ROOT; }; - 23C7EA9C89CC98A5EFEC12FA /* juce_GZIPCompressorOutputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GZIPCompressorOutputStream.h; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h; sourceTree = SOURCE_ROOT; }; - 23D82A4C165DD596474F30E4 /* juce_ColourSelector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ColourSelector.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.h; sourceTree = SOURCE_ROOT; }; - 23EAFAEA6457DB4E452F8715 /* SignalGenerator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SignalGenerator.h; path = ../../Source/Processors/SignalGenerator.h; sourceTree = SOURCE_ROOT; }; - 23F048594D4C9AD8C3399877 /* juce_android_SystemStats.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_SystemStats.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp; sourceTree = SOURCE_ROOT; }; - 243817BA562AD7FA76C834C9 /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; - 24D86195580EFB86AC084DCC /* cpmono_extra_light.otf */ = {isa = PBXFileReference; lastKnownFileType = file.otf; name = cpmono_extra_light.otf; path = ../../Resources/Fonts/cpmono_extra_light.otf; sourceTree = SOURCE_ROOT; }; - 25433DB6D2EAEBB307EFB960 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_graphics/juce_module_info; sourceTree = SOURCE_ROOT; }; - 256E22D98B16B09BD521C4A4 /* juce_AudioProcessorEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioProcessorEditor.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h; sourceTree = SOURCE_ROOT; }; - 258938780F93A7CF41366F26 /* RecordControl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RecordControl.cpp; path = ../../Source/Processors/Utilities/RecordControl.cpp; sourceTree = SOURCE_ROOT; }; - 25ABEB43042E98C668A16432 /* SpikeDisplayEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikeDisplayEditor.h; path = ../../Source/Processors/Editors/SpikeDisplayEditor.h; sourceTree = SOURCE_ROOT; }; - 25DCA4D0E86DFB51AF637D21 /* juce_win32_Midi.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Midi.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp; sourceTree = SOURCE_ROOT; }; - 25F7BEADC001FA3D1EA9B32C /* juce_DrawablePath.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawablePath.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp; sourceTree = SOURCE_ROOT; }; - 261B5AA82F2A86CC5500D8D2 /* ArduinoIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ArduinoIcon.png; path = ../../Resources/Images/Icons/ArduinoIcon.png; sourceTree = SOURCE_ROOT; }; - 265EDA19C88E74249FD66609 /* SignalGeneratorEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SignalGeneratorEditor.h; path = ../../Source/Processors/Editors/SignalGeneratorEditor.h; sourceTree = SOURCE_ROOT; }; - 266FC6DA3123E576811DD828 /* juce_FlacAudioFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FlacAudioFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h; sourceTree = SOURCE_ROOT; }; - 26FF78F12CCB8725C0DAF9C2 /* juce_MidiInput.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiInput.h; path = ../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h; sourceTree = SOURCE_ROOT; }; - 27313EA12BC45638321922CA /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; - 27548017AB2ABAF17E1D5DF5 /* juce_FileInputSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileInputSource.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h; sourceTree = SOURCE_ROOT; }; - 27DC0E650D6D54DF29E6DB68 /* juce_gui_extra.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_gui_extra.mm; path = ../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.mm; sourceTree = SOURCE_ROOT; }; - 2847E92BB432EEB9D5A59260 /* juce_StringArray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StringArray.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.h; sourceTree = SOURCE_ROOT; }; - 284F3E94F0C96EA1DD89E606 /* juce_FileFilter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileFilter.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileFilter.cpp; sourceTree = SOURCE_ROOT; }; - 28847C807E6B05303FB8FB34 /* juce_mac_Strings.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_Strings.mm; path = ../../JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm; sourceTree = SOURCE_ROOT; }; - 28D5AEEEFC4FA8877419C829 /* juce_posix_NamedPipe.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_posix_NamedPipe.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp; sourceTree = SOURCE_ROOT; }; - 2924B990E35D3B51AA245978 /* juce_MessageListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MessageListener.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h; sourceTree = SOURCE_ROOT; }; - 29381F22B8FDF48C3EAC3A9F /* juce_OpenGLPixelFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OpenGLPixelFormat.cpp; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp; sourceTree = SOURCE_ROOT; }; - 29D7893C278FFE00782637B6 /* Bessel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Bessel.h; path = ../../Source/Dsp/Bessel.h; sourceTree = SOURCE_ROOT; }; - 29FD7B383C5DDACAA7B8DFD3 /* MergerEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MergerEditor.cpp; path = ../../Source/Processors/Editors/MergerEditor.cpp; sourceTree = SOURCE_ROOT; }; - 2A3230DEAAC86A9090950703 /* juce_Path.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Path.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp; sourceTree = SOURCE_ROOT; }; - 2AB1CC4252DB09507ED31482 /* juce_Application.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Application.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp; sourceTree = SOURCE_ROOT; }; - 2AE12F85965B8BE4A0E12F67 /* juce_PropertiesFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PropertiesFile.h; path = ../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h; sourceTree = SOURCE_ROOT; }; - 2B134713E91426120A994CB7 /* juce_Random.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Random.cpp; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp; sourceTree = SOURCE_ROOT; }; - 2B19F2DE42A91F56C2380F9A /* juce_Expression.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Expression.cpp; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp; sourceTree = SOURCE_ROOT; }; - 2B93450006102A0093F5EACB /* Design.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Design.cpp; path = ../../Source/Dsp/Design.cpp; sourceTree = SOURCE_ROOT; }; - 2BC005B37A0FB3179C2F3AC7 /* juce_CoreAudioFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CoreAudioFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h; sourceTree = SOURCE_ROOT; }; - 2C4730CAFED4F6292B575318 /* Splitter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Splitter.cpp; path = ../../Source/Processors/Utilities/Splitter.cpp; sourceTree = SOURCE_ROOT; }; - 2C89EC72FF6A7118EF459DC3 /* Main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = SOURCE_ROOT; }; - 2D1BF69121265C83C7937EB6 /* juce_AudioIODevice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioIODevice.h; path = ../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h; sourceTree = SOURCE_ROOT; }; - 2D20F49E12A7D313049E0258 /* juce_ScopedWriteLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScopedWriteLock.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h; sourceTree = SOURCE_ROOT; }; - 2D2BAC4320470CF68743F58E /* rhd2000evalboard.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rhd2000evalboard.cpp; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp"; sourceTree = SOURCE_ROOT; }; - 2D41C43686CDE35E86A389D7 /* WiFiOutput.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WiFiOutput.cpp; path = ../../Source/Processors/WiFiOutput.cpp; sourceTree = SOURCE_ROOT; }; - 2D577016FEEE23DD5703C924 /* juce_DialogWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DialogWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.cpp; sourceTree = SOURCE_ROOT; }; - 2DA0032B6DF10345C4842BF5 /* juce_CharacterFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CharacterFunctions.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h; sourceTree = SOURCE_ROOT; }; - 2F2EDBE0623561191234AF21 /* juce_LAMEEncoderAudioFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LAMEEncoderAudioFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp; sourceTree = SOURCE_ROOT; }; - 2F8252D3FF527D6559B12615 /* juce_LowLevelGraphicsSoftwareRenderer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LowLevelGraphicsSoftwareRenderer.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp; sourceTree = SOURCE_ROOT; }; - 2F9BB379BCFCFE0D88CC0408 /* juce_AudioProcessorGraph.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioProcessorGraph.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h; sourceTree = SOURCE_ROOT; }; - 2FE6DAFB634FF3C20F1D6FD7 /* juce_CaretComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CaretComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h; sourceTree = SOURCE_ROOT; }; - 2FF422D0633A28558D0227EC /* juce_ComponentBuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentBuilder.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h; sourceTree = SOURCE_ROOT; }; - 301783FC4E3B19CA3C0AC85B /* juce_LowLevelGraphicsSoftwareRenderer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LowLevelGraphicsSoftwareRenderer.h; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h; sourceTree = SOURCE_ROOT; }; - 3063CF211ABB734A9FD452EC /* Custom.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Custom.h; path = ../../Source/Dsp/Custom.h; sourceTree = SOURCE_ROOT; }; - 308F614D30DCB9AE3767C928 /* ofSerial.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ofSerial.cpp; path = ../../Source/Processors/Serial/ofSerial.cpp; sourceTree = SOURCE_ROOT; }; - 313970BBDAAA4EDC8B322F3A /* juce_ComponentMovementWatcher.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentMovementWatcher.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp; sourceTree = SOURCE_ROOT; }; - 314955FB1E6DD74C71EB8907 /* juce_AudioFormatReaderSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioFormatReaderSource.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h; sourceTree = SOURCE_ROOT; }; - 316FB94579DA666A388F429A /* juce_WildcardFileFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WildcardFileFilter.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_WildcardFileFilter.h; sourceTree = SOURCE_ROOT; }; - 31A3925602D128195100B74D /* juce_ApplicationProperties.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ApplicationProperties.cpp; path = ../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp; sourceTree = SOURCE_ROOT; }; - 31BE5E435604D33173940048 /* juce_ToggleButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToggleButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp; sourceTree = SOURCE_ROOT; }; - 31FDA03EF1B527B336FA6263 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_events/juce_module_info; sourceTree = SOURCE_ROOT; }; - 32976762B1DB850DB65B9504 /* juce_FileInputSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileInputSource.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp; sourceTree = SOURCE_ROOT; }; - 32A1325430309CF4114C9618 /* juce_GenericAudioProcessorEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GenericAudioProcessorEditor.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp; sourceTree = SOURCE_ROOT; }; - 32B658D7A44849A6F640AF37 /* miso-bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = "miso-bold.ttf"; path = "../../Resources/Fonts/miso-bold.ttf"; sourceTree = SOURCE_ROOT; }; - 32CEF6C84CD06B18035B035C /* RadioButtons_selected-05.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected-05.png"; path = "../../Resources/Images/Icons/RadioButtons_selected-05.png"; sourceTree = SOURCE_ROOT; }; - 32D568631762765C07D4BF0D /* juce_NSViewComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NSViewComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_NSViewComponent.h; sourceTree = SOURCE_ROOT; }; - 33A69BDDCFCD4A4DC14A9961 /* juce_KeyPress.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyPress.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp; sourceTree = SOURCE_ROOT; }; - 349C9FCEDC32E73DCB7AE806 /* juce_WindowsRegistry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WindowsRegistry.h; path = ../../JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h; sourceTree = SOURCE_ROOT; }; - 353937A4E68C8C6916C6D1F9 /* juce_FileBrowserComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileBrowserComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp; sourceTree = SOURCE_ROOT; }; - 35AEAE0CC0B546625E163B9B /* sine_wave.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = sine_wave.png; path = ../../Resources/Images/Icons/sine_wave.png; sourceTree = SOURCE_ROOT; }; - 35C0963BAB9A82F12CDC9F76 /* juce_NamedValueSet.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_NamedValueSet.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp; sourceTree = SOURCE_ROOT; }; - 361D8C54B3E54766CBC48046 /* Biquad.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Biquad.h; path = ../../Source/Dsp/Biquad.h; sourceTree = SOURCE_ROOT; }; - 361E3A46C9BFAD1530593487 /* juce_PopupMenu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PopupMenu.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h; sourceTree = SOURCE_ROOT; }; - 3663C981D28BF165C1B601A7 /* juce_OptionalScopedPointer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OptionalScopedPointer.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h; sourceTree = SOURCE_ROOT; }; - 36A9736F04AAA2F8E9D711BB /* juce_SpinLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SpinLock.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h; sourceTree = SOURCE_ROOT; }; - 3753B3B311AE0A9F4CC5AD40 /* ofArduino.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ofArduino.cpp; path = ../../Source/Processors/Serial/ofArduino.cpp; sourceTree = SOURCE_ROOT; }; - 3774BBCA6CB133D9A854CF71 /* CustomLookAndFeel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CustomLookAndFeel.cpp; path = ../../Source/UI/CustomLookAndFeel.cpp; sourceTree = SOURCE_ROOT; }; - 381F5DC605AE69088004DF80 /* PipelineB-01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PipelineB-01.png"; path = "../../Resources/Images/Buttons/PipelineB-01.png"; sourceTree = SOURCE_ROOT; }; - 38313692308D501E4CADF1D5 /* Layout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Layout.h; path = ../../Source/Dsp/Layout.h; sourceTree = SOURCE_ROOT; }; - 38711221C089A16CC29E93D2 /* juce_ActionListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionListener.h; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h; sourceTree = SOURCE_ROOT; }; - 38A9627672C2562DBE257A05 /* cpmono-extralight-serialized */ = {isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-extralight-serialized"; path = "../../Resources/Fonts/cpmono-extralight-serialized"; sourceTree = SOURCE_ROOT; }; - 38B5A37F33AE3FB2014BF095 /* juce_StringArray.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StringArray.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp; sourceTree = SOURCE_ROOT; }; - 38E493BFC36AC80B1CDAAF35 /* juce_TreeView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TreeView.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.h; sourceTree = SOURCE_ROOT; }; - 390856DF83DAC70909D5B397 /* juce_Button.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Button.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h; sourceTree = SOURCE_ROOT; }; - 390EA3109658E8C51EFC8F61 /* juce_PluginDirectoryScanner.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PluginDirectoryScanner.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp; sourceTree = SOURCE_ROOT; }; - 392408C1943AC6234BAAC743 /* Elliptic.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Elliptic.cpp; path = ../../Source/Dsp/Elliptic.cpp; sourceTree = SOURCE_ROOT; }; - 393801D2B91773D376D874B0 /* juce_ImageButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h; sourceTree = SOURCE_ROOT; }; - 39422C7D01635DD9C00B5136 /* juce_mac_CoreMidi.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_mac_CoreMidi.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp; sourceTree = SOURCE_ROOT; }; - 39464D2A22940DA2DDCCCFC6 /* EventDetector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EventDetector.cpp; path = ../../Source/Processors/EventDetector.cpp; sourceTree = SOURCE_ROOT; }; - 39F287BE4C0B4F3BD4A949FD /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; - 3A2C762575D9728B1F822ED3 /* juce_AsyncUpdater.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AsyncUpdater.cpp; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp; sourceTree = SOURCE_ROOT; }; - 3A6E9EC3DA618EBA06B9DEEB /* juce_AudioSubsectionReader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioSubsectionReader.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h; sourceTree = SOURCE_ROOT; }; - 3A6FE617A781EEFFD39E1216 /* RadioButtons_neutral-02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_neutral-02.png"; path = "../../Resources/Images/Icons/RadioButtons_neutral-02.png"; sourceTree = SOURCE_ROOT; }; - 3A71F2C959CA7DD3C33DC411 /* juce_mac_CarbonViewWrapperComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_mac_CarbonViewWrapperComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h; sourceTree = SOURCE_ROOT; }; - 3A9826A8C3B668BCC760BEB7 /* juce_gui_basics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_gui_basics.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h; sourceTree = SOURCE_ROOT; }; - 3AC9B61C10692BBA96D2F775 /* juce_OpenGL_android.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGL_android.h; path = ../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_android.h; sourceTree = SOURCE_ROOT; }; - 3AE038CACE48AF85C4FB1ED5 /* GenericProcessor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GenericProcessor.cpp; path = ../../Source/Processors/GenericProcessor.cpp; sourceTree = SOURCE_ROOT; }; - 3B307527FC3241258EA68519 /* juce_ToneGeneratorAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToneGeneratorAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h; sourceTree = SOURCE_ROOT; }; - 3BC3A723444252E177C1B1BD /* juce_AudioFormatWriter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioFormatWriter.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h; sourceTree = SOURCE_ROOT; }; - 3BEB59C6E8F833331C0783D5 /* juce_IIRFilter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_IIRFilter.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp; sourceTree = SOURCE_ROOT; }; - 3C18EC09535EA506FC0CBC62 /* juce_OpenGL_ios.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGL_ios.h; path = ../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_ios.h; sourceTree = SOURCE_ROOT; }; - 3C1E0B87DA3E9AC60D2894F7 /* juce_TableListBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TableListBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.h; sourceTree = SOURCE_ROOT; }; - 3C92F249799E7CBF41FABEA0 /* juce_mac_WebBrowserComponent.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_WebBrowserComponent.mm; path = ../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm; sourceTree = SOURCE_ROOT; }; - 3D100F6FDB04756402F3BCC9 /* juce_mac_CoreGraphicsContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_mac_CoreGraphicsContext.h; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h; sourceTree = SOURCE_ROOT; }; - 3DA70F9AAA904543B519874B /* juce_AudioPluginInstance.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioPluginInstance.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h; sourceTree = SOURCE_ROOT; }; - 3E0942A2D72F50FDE27C14AE /* juce_StretchableObjectResizer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StretchableObjectResizer.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp; sourceTree = SOURCE_ROOT; }; - 3E22E947444B5849011B6C4E /* juce_MouseInputSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseInputSource.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp; sourceTree = SOURCE_ROOT; }; - 3E55A43D066A2B892DBCA640 /* ProjectionAxes.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ProjectionAxes.cpp; path = ../../Source/Processors/Visualization/SpikePlotting/ProjectionAxes.cpp; sourceTree = SOURCE_ROOT; }; - 3EAE25787DBFBA8EFC42A277 /* RecordNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RecordNode.h; path = ../../Source/Processors/RecordNode.h; sourceTree = SOURCE_ROOT; }; - 3EAF57CE45DBACE2F88DA4C5 /* juce_FileChooser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileChooser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp; sourceTree = SOURCE_ROOT; }; - 3EE92345839A4E5F608D82AC /* juce_Sampler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Sampler.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h; sourceTree = SOURCE_ROOT; }; - 3F56A025C4D83EBDB66E3676 /* juce_AppleRemote.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AppleRemote.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AppleRemote.h; sourceTree = SOURCE_ROOT; }; - 3F69480D6145C77992FA59BA /* RootFinder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RootFinder.cpp; path = ../../Source/Dsp/RootFinder.cpp; sourceTree = SOURCE_ROOT; }; - 3F6C67E29CDEDF2EF61C054F /* Param.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Param.cpp; path = ../../Source/Dsp/Param.cpp; sourceTree = SOURCE_ROOT; }; - 3F8DFB0DB8B82F0C2CFBCA05 /* juce_BufferingAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BufferingAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - 3FA24B406E4A9F9F54421C6A /* juce_ChannelRemappingAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChannelRemappingAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h; sourceTree = SOURCE_ROOT; }; - 3FB80C5CFD953986778DCBA2 /* juce_linux_Files.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Files.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp; sourceTree = SOURCE_ROOT; }; - 3FC794735FA8DDA39A62224B /* UIComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = UIComponent.h; path = ../../Source/UI/UIComponent.h; sourceTree = SOURCE_ROOT; }; - 3FFC2A3429D8B1D957D18CA7 /* MergerB-02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "MergerB-02.png"; path = "../../Resources/Images/Buttons/MergerB-02.png"; sourceTree = SOURCE_ROOT; }; - 3FFD5E5D5C1D8B48DBBB9D18 /* juce_Result.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Result.cpp; path = ../../JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp; sourceTree = SOURCE_ROOT; }; - 402BC572EE3E8EC418946CE0 /* juce_AudioTransportSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioTransportSource.h; path = ../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h; sourceTree = SOURCE_ROOT; }; - 405298E6CE1C80EC7CC43A87 /* juce_FileTreeComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileTreeComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h; sourceTree = SOURCE_ROOT; }; - 40C22F3CD61DDB9C7B3DCCA6 /* juce_KeyListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyListener.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h; sourceTree = SOURCE_ROOT; }; - 40F5B73C1A044670FA28DC89 /* SpikePlot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikePlot.h; path = ../../Source/Processors/Visualization/SpikePlotting/SpikePlot.h; sourceTree = SOURCE_ROOT; }; - 4133FE7830C52BBA035D82B8 /* juce_TimeSliceThread.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TimeSliceThread.cpp; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp; sourceTree = SOURCE_ROOT; }; - 414D8E6E4EE98E66C2583A50 /* juce_TextPropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextPropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; - 416B99B14B44CB16B725C4B2 /* juce_StretchableObjectResizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StretchableObjectResizer.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h; sourceTree = SOURCE_ROOT; }; - 4179FCF100DC52282D0F9753 /* juce_JSON.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_JSON.h; path = ../../JuceLibraryCode/modules/juce_core/json/juce_JSON.h; sourceTree = SOURCE_ROOT; }; - 41AF61914A96159E9EA194B0 /* juce_linux_Clipboard.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Clipboard.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Clipboard.cpp; sourceTree = SOURCE_ROOT; }; - 420843E39C285B620B220C1D /* juce_LeakedObjectDetector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LeakedObjectDetector.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h; sourceTree = SOURCE_ROOT; }; - 420B0E95F1300ABFDC125DBF /* AccessClass.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AccessClass.cpp; path = ../../Source/AccessClass.cpp; sourceTree = SOURCE_ROOT; }; - 42BF0530EADF336E58D39CD3 /* juce_FloatVectorOperations.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FloatVectorOperations.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h; sourceTree = SOURCE_ROOT; }; - 43420911407CC35CE2A02B38 /* juce_StretchableLayoutManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StretchableLayoutManager.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp; sourceTree = SOURCE_ROOT; }; - 434E153E6C8337C1E4A2709A /* juce_ButtonPropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ButtonPropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h; sourceTree = SOURCE_ROOT; }; - 4434939E139A45962C8CFB4C /* juce_DrawableShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableShape.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp; sourceTree = SOURCE_ROOT; }; - 44E04E5F584A8BFAD062A09D /* juce_ShapeButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ShapeButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h; sourceTree = SOURCE_ROOT; }; - 45258533F9F65AC96D3080B3 /* juce_MultiTouchMapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MultiTouchMapper.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h; sourceTree = SOURCE_ROOT; }; - 4540694F9744C9F4D29149CE /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_opengl/juce_module_info; sourceTree = SOURCE_ROOT; }; - 455FFBB0C34B760D892D2D57 /* juce_OpenGLPixelFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGLPixelFormat.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h; sourceTree = SOURCE_ROOT; }; - 45883809F1335E6C745F8155 /* juce_ModalComponentManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ModalComponentManager.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h; sourceTree = SOURCE_ROOT; }; - 458A112D564ED066211FD482 /* juce_ToneGeneratorAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToneGeneratorAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - 45A66E543B62A2C32AB3BA23 /* juce_AudioDeviceSelectorComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioDeviceSelectorComponent.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h; sourceTree = SOURCE_ROOT; }; - 45D440B69BDB210B17CD424B /* juce_ImageComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.h; sourceTree = SOURCE_ROOT; }; - 4608E765A643BC0CB2C1BB02 /* juce_CriticalSection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CriticalSection.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h; sourceTree = SOURCE_ROOT; }; - 463A302B39C7815EB981CEBD /* juce_Point.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Point.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h; sourceTree = SOURCE_ROOT; }; - 4650B5724FE3C0608FB07A04 /* juce_TextLayout.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextLayout.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp; sourceTree = SOURCE_ROOT; }; - 46E3A634686BFEF787229582 /* ParameterEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ParameterEditor.cpp; path = ../../Source/Processors/Editors/ParameterEditor.cpp; sourceTree = SOURCE_ROOT; }; - 46EF49B14DF7357A8287D9D8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; }; - 47041E3794FA20F67F39AE63 /* juce_ChildProcess.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChildProcess.cpp; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp; sourceTree = SOURCE_ROOT; }; - 475824F60D47C28C392954A7 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_audio_processors/juce_module_info; sourceTree = SOURCE_ROOT; }; - 47976F6BE2942EED64AEA4D2 /* RadioButtons_selected_over-04.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-04.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-04.png"; sourceTree = SOURCE_ROOT; }; - 47A3942AC30A3212C01F1CAF /* DataViewport.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DataViewport.cpp; path = ../../Source/UI/DataViewport.cpp; sourceTree = SOURCE_ROOT; }; - 47BDFDD28759B342B1C50BC0 /* juce_AbstractFifo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AbstractFifo.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h; sourceTree = SOURCE_ROOT; }; - 47EE021D6C891095140ED7A9 /* juce_ios_UIViewComponentPeer.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_ios_UIViewComponentPeer.mm; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm; sourceTree = SOURCE_ROOT; }; - 482A60A44EE6CB84FCB9DC88 /* juce_AudioThumbnailBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioThumbnailBase.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h; sourceTree = SOURCE_ROOT; }; - 483ABD5C1CF789943AB4AFB6 /* juce_ComponentPeer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentPeer.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.h; sourceTree = SOURCE_ROOT; }; - 4867923F31CC3EDC9B1A5BE5 /* Merger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Merger.cpp; path = ../../Source/Processors/Utilities/Merger.cpp; sourceTree = SOURCE_ROOT; }; - 488D1B00C9E5FE4DAB035EDF /* juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_cryptography.mm; path = ../../JuceLibraryCode/modules/juce_cryptography/juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; - 48E4FA55FD4440AF44EEA437 /* juce_linux_FileChooser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_FileChooser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp; sourceTree = SOURCE_ROOT; }; - 48F6281AB92B232E5187D00C /* SignalChainManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SignalChainManager.h; path = ../../Source/UI/SignalChainManager.h; sourceTree = SOURCE_ROOT; }; - 4939A8B8300394AAD0926C0B /* Legendre.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Legendre.h; path = ../../Source/Dsp/Legendre.h; sourceTree = SOURCE_ROOT; }; - 496180D5D96088CBB59035B1 /* juce_DrawableShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableShape.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h; sourceTree = SOURCE_ROOT; }; - 4978EF4C5F506F3289BC0D99 /* juce_SubregionStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SubregionStream.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h; sourceTree = SOURCE_ROOT; }; - 499A12199A8A8C5AEDAA47E4 /* juce_FilenameComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FilenameComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h; sourceTree = SOURCE_ROOT; }; - 49D837FD08100AF0DB797DB4 /* juce_SparseSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SparseSet.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h; sourceTree = SOURCE_ROOT; }; - 49FA151B1837E543D18858EB /* FilterEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterEditor.h; path = ../../Source/Processors/Editors/FilterEditor.h; sourceTree = SOURCE_ROOT; }; - 4A28A492852AEFBF508C1FC1 /* juce_RelativePointPath.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativePointPath.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h; sourceTree = SOURCE_ROOT; }; - 4A7695E93CE32F4E95042FCB /* juce_video.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_video.mm; path = ../../JuceLibraryCode/modules/juce_video/juce_video.mm; sourceTree = SOURCE_ROOT; }; - 4A94E809624F99387E600399 /* LfpDisplayCanvas.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpDisplayCanvas.cpp; path = ../../Source/Processors/Visualization/LfpDisplayCanvas.cpp; sourceTree = SOURCE_ROOT; }; - 4AD95B75DC581E32650FEDF6 /* juce_IIRFilterAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_IIRFilterAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - 4AE1520FF569371665090B39 /* juce_AiffAudioFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AiffAudioFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp; sourceTree = SOURCE_ROOT; }; - 4AE36D25675E32A897F97BFA /* juce_TabbedComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TabbedComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp; sourceTree = SOURCE_ROOT; }; - 4B03E89A306A88F7FE43B831 /* GenericAxes.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GenericAxes.cpp; path = ../../Source/Processors/Visualization/SpikePlotting/GenericAxes.cpp; sourceTree = SOURCE_ROOT; }; - 4B3DBFE485F45E62C53A90B8 /* juce_MenuBarModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MenuBarModel.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h; sourceTree = SOURCE_ROOT; }; - 4B5998D72503BD73D28E828A /* juce_osx_MessageQueue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_osx_MessageQueue.h; path = ../../JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h; sourceTree = SOURCE_ROOT; }; - 4B74A7F0FDCE3E1706E5B320 /* juce_ApplicationCommandTarget.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ApplicationCommandTarget.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp; sourceTree = SOURCE_ROOT; }; - 4BB38A2CD55BF23C7C3E3387 /* juce_ToolbarItemPalette.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToolbarItemPalette.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp; sourceTree = SOURCE_ROOT; }; - 4C3EA47E012B2D63ADE599DD /* juce_PathStrokeType.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PathStrokeType.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp; sourceTree = SOURCE_ROOT; }; - 4C4E2282C145D13C86CB23FA /* juce_OpenGLHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGLHelpers.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLHelpers.h; sourceTree = SOURCE_ROOT; }; - 4C81E05B39376F54775A1027 /* juce_Colour.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Colour.h; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h; sourceTree = SOURCE_ROOT; }; - 4CA9556E9C18029A47F34C7C /* juce_LAMEEncoderAudioFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LAMEEncoderAudioFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h; sourceTree = SOURCE_ROOT; }; - 4CCA36B2A6C4821E493E74D2 /* juce_AudioFormatReader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFormatReader.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp; sourceTree = SOURCE_ROOT; }; - 4CF403118BBAAD5B6763542A /* juce_OpenGLContext.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OpenGLContext.cpp; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLContext.cpp; sourceTree = SOURCE_ROOT; }; - 4D67518E9223C1C19BD4EF2E /* juce_linux_Threads.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Threads.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp; sourceTree = SOURCE_ROOT; }; - 4D84A3A970FB67566A1E5B0B /* juce_KnownPluginList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KnownPluginList.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h; sourceTree = SOURCE_ROOT; }; - 4D8F94CA49DB11E07918B4C9 /* juce_UnitTest.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_UnitTest.cpp; path = ../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp; sourceTree = SOURCE_ROOT; }; - 4E520E7960CC5098C2352E70 /* juce_MouseCursor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MouseCursor.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h; sourceTree = SOURCE_ROOT; }; - 4E6EE225098D32E7D5DE60B2 /* SpikeDisplayCanvas.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikeDisplayCanvas.h; path = ../../Source/Processors/Visualization/SpikeDisplayCanvas.h; sourceTree = SOURCE_ROOT; }; - 4E71B355F2BABAF69CC4114D /* juce_ConcertinaPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ConcertinaPanel.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h; sourceTree = SOURCE_ROOT; }; - 4EC254B133A7AAE377B9B3AE /* juce_LassoComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LassoComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h; sourceTree = SOURCE_ROOT; }; - 4F31D61C0C2AB3472C6C1429 /* juce_MACAddress.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MACAddress.cpp; path = ../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp; sourceTree = SOURCE_ROOT; }; - 4F4234DC14D3689C22655D0C /* juce_ComponentListener.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentListener.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp; sourceTree = SOURCE_ROOT; }; - 4F4E8E3B32DB7A91B41C9FFA /* MergerB-01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "MergerB-01.png"; path = "../../Resources/Images/Buttons/MergerB-01.png"; sourceTree = SOURCE_ROOT; }; - 4FD13AA663EEE7CC2F83033D /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; - 50DB7E5C152DDD03F2FA4C2D /* BebasNeue.otf */ = {isa = PBXFileReference; lastKnownFileType = file.otf; name = BebasNeue.otf; path = ../../Resources/Fonts/BebasNeue.otf; sourceTree = SOURCE_ROOT; }; - 50DD8D693741DD18106C0BA7 /* juce_ComponentListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentListener.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h; sourceTree = SOURCE_ROOT; }; - 510ACDAD798813D7FC110197 /* juce_TabbedComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TabbedComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h; sourceTree = SOURCE_ROOT; }; - 511C443A0A806706A772E981 /* juce_Primes.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Primes.cpp; path = ../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.cpp; sourceTree = SOURCE_ROOT; }; - 515213CC3271E8DEA8125D33 /* juce_DynamicLibrary.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DynamicLibrary.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h; sourceTree = SOURCE_ROOT; }; - 51926BEEA63BF141D93A5B36 /* juce_RelativePoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativePoint.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp; sourceTree = SOURCE_ROOT; }; - 5265AD5F97C9E813E14937A7 /* juce_RectanglePlacement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RectanglePlacement.h; path = ../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h; sourceTree = SOURCE_ROOT; }; - 5284E69CC601457D5C7C1063 /* juce_linux_SystemTrayIcon.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_SystemTrayIcon.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp; sourceTree = SOURCE_ROOT; }; - 52A8F84DCDDF0186B511B9CD /* juce_FilenameComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FilenameComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp; sourceTree = SOURCE_ROOT; }; - 53130F5F47EB211416C028F6 /* juce_UnitTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_UnitTest.h; path = ../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h; sourceTree = SOURCE_ROOT; }; - 5343D594AA7D444A7C6AD924 /* juce_GZIPDecompressorInputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GZIPDecompressorInputStream.h; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h; sourceTree = SOURCE_ROOT; }; - 5379FC603780F30A2F05FE78 /* juce_AsyncUpdater.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AsyncUpdater.h; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h; sourceTree = SOURCE_ROOT; }; - 53C8A2696FE4389E4AB4441C /* juce_Slider.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Slider.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.cpp; sourceTree = SOURCE_ROOT; }; - 54339ADDCB6F8E9E7721A986 /* juce_android_Windowing.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Windowing.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp; sourceTree = SOURCE_ROOT; }; - 5522973FA48A13C6BED293FE /* SignalGenerator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SignalGenerator.cpp; path = ../../Source/Processors/SignalGenerator.cpp; sourceTree = SOURCE_ROOT; }; - 555D34D0CD8776EE5996CC3A /* ProcessorGraph.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ProcessorGraph.cpp; path = ../../Source/Processors/ProcessorGraph.cpp; sourceTree = SOURCE_ROOT; }; - 55811E331B55E0547326CF22 /* juce_TopLevelWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TopLevelWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp; sourceTree = SOURCE_ROOT; }; - 558E925DAC57ADF8810559AC /* juce_linux_Windowing.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Windowing.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Windowing.cpp; sourceTree = SOURCE_ROOT; }; - 55EBFCA56B915C8CD043365C /* juce_win32_DirectWriteTypeLayout.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DirectWriteTypeLayout.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp; sourceTree = SOURCE_ROOT; }; - 55F7467B96E236DD558228C9 /* juce_CharPointer_UTF8.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CharPointer_UTF8.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h; sourceTree = SOURCE_ROOT; }; - 560A28C1966B1817873CF764 /* juce_MidiMessageSequence.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiMessageSequence.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp; sourceTree = SOURCE_ROOT; }; - 56169D835A3E3029D6E3904C /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = System/Library/Frameworks/QuickTime.framework; sourceTree = SDKROOT; }; - 562E4A50364EEDC3AA2AACB8 /* juce_RelativeTime.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativeTime.h; path = ../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h; sourceTree = SOURCE_ROOT; }; - 563F35B171FAF2540923CE45 /* juce_AudioDataConverters.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioDataConverters.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp; sourceTree = SOURCE_ROOT; }; - 564380494D23DB70680FB0B5 /* juce_TreeView.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TreeView.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.cpp; sourceTree = SOURCE_ROOT; }; - 565EEC8F429ABF5F9A867137 /* juce_MouseEvent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseEvent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp; sourceTree = SOURCE_ROOT; }; - 56728EC77C65482B9C86FF4D /* juce_audio_utils.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_audio_utils.mm; path = ../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.mm; sourceTree = SOURCE_ROOT; }; - 56D29967F43612F663727FAF /* WaveAxes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WaveAxes.h; path = ../../Source/Processors/Visualization/SpikePlotting/WaveAxes.h; sourceTree = SOURCE_ROOT; }; - 570299171BCE863C54FBBA54 /* juce_ConcertinaPanel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ConcertinaPanel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp; sourceTree = SOURCE_ROOT; }; - 57941E5B2E1FF6028A68D4A7 /* RadioButtons-02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons-02.png"; path = "../../Resources/Images/Icons/RadioButtons-02.png"; sourceTree = SOURCE_ROOT; }; - 57C6DD2537116B30FB948A08 /* juce_RSAKey.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RSAKey.h; path = ../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.h; sourceTree = SOURCE_ROOT; }; - 57F66B4A911601169AF195E9 /* juce_AudioProcessorPlayer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioProcessorPlayer.cpp; path = ../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp; sourceTree = SOURCE_ROOT; }; - 57FBA8BC3104D3AF41FBECD8 /* EditorViewport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EditorViewport.h; path = ../../Source/UI/EditorViewport.h; sourceTree = SOURCE_ROOT; }; - 581287A24510A9EACEE09CE4 /* juce_DocumentWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DocumentWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.h; sourceTree = SOURCE_ROOT; }; - 586448E180F8ACBF5A1565B0 /* juce_gui_extra.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_gui_extra.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.h; sourceTree = SOURCE_ROOT; }; - 586B1E0743FFBE9081A25F4F /* juce_CodeEditorComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CodeEditorComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp; sourceTree = SOURCE_ROOT; }; - 587FCA2485B9C89C2A99C23A /* Filter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Filter.cpp; path = ../../Source/Dsp/Filter.cpp; sourceTree = SOURCE_ROOT; }; - 5894D40A0E8FA6E9B3EBF9D9 /* SpikeObject.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeObject.cpp; path = ../../Source/Processors/Visualization/SpikeObject.cpp; sourceTree = SOURCE_ROOT; }; - 58958CC3F750D383261E2FBC /* juce_SliderPropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SliderPropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h; sourceTree = SOURCE_ROOT; }; - 5915DB02FB7CA8CEC1BF38A9 /* juce_opengl.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_opengl.mm; path = ../../JuceLibraryCode/modules/juce_opengl/juce_opengl.mm; sourceTree = SOURCE_ROOT; }; - 59389DC8664617FD51740F36 /* juce_DirectShowComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DirectShowComponent.h; path = ../../JuceLibraryCode/modules/juce_video/playback/juce_DirectShowComponent.h; sourceTree = SOURCE_ROOT; }; - 5962848AA3DD93A29EFF5B94 /* juce_data_structures.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_data_structures.h; path = ../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h; sourceTree = SOURCE_ROOT; }; - 5A746CDDE80FEA2E45B5BA66 /* juce_mac_AppleRemote.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_AppleRemote.mm; path = ../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm; sourceTree = SOURCE_ROOT; }; - 5A7D81B70480B40EEBC2FF54 /* juce_MessageListener.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MessageListener.cpp; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp; sourceTree = SOURCE_ROOT; }; - 5A8D46BEB81DDF24462E3D92 /* PoleFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PoleFilter.h; path = ../../Source/Dsp/PoleFilter.h; sourceTree = SOURCE_ROOT; }; - 5AB3809F029824EE2DE0A798 /* juce_ImageFileFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageFileFormat.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp; sourceTree = SOURCE_ROOT; }; - 5B2A4DD7133CDE5AEC24CC07 /* GenericProcessor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GenericProcessor.h; path = ../../Source/Processors/GenericProcessor.h; sourceTree = SOURCE_ROOT; }; - 5B2CDF3CF10A92F6CA45F3DE /* juce_AudioPlayHead.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioPlayHead.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h; sourceTree = SOURCE_ROOT; }; - 5B411F4FCF0F69798C9E4A88 /* juce_ScrollBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScrollBar.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h; sourceTree = SOURCE_ROOT; }; - 5B6B25AA065FB6CDE7D6C507 /* juce_ApplicationProperties.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationProperties.h; path = ../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h; sourceTree = SOURCE_ROOT; }; - 5B7EC53FD2232CA799D6C018 /* juce_win32_DirectSound.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DirectSound.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp; sourceTree = SOURCE_ROOT; }; - 5BB1E90842FD8A212CC2D132 /* juce_CodeDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CodeDocument.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.h; sourceTree = SOURCE_ROOT; }; - 5C1D2D28960C7957A15B3FE4 /* juce_ChannelRemappingAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChannelRemappingAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - 5C5E4C396CD83C46F58644A2 /* triangle_wave.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = triangle_wave.png; path = ../../Resources/Images/Icons/triangle_wave.png; sourceTree = SOURCE_ROOT; }; - 5C7EEDD80F88872A87FD561B /* juce_AudioFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp; sourceTree = SOURCE_ROOT; }; - 5CE99545433261F3B4A46252 /* juce_AudioFormatReaderSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFormatReaderSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp; sourceTree = SOURCE_ROOT; }; - 5D9792840E8050DCC766B368 /* juce_OpenGLRenderer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGLRenderer.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLRenderer.h; sourceTree = SOURCE_ROOT; }; - 5DB3B3197F8C1E5EE159D6FC /* rhd2000registers.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rhd2000registers.cpp; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000registers.cpp"; sourceTree = SOURCE_ROOT; }; - 5DB6A07B827D62571BB51943 /* juce_Justification.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Justification.h; path = ../../JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h; sourceTree = SOURCE_ROOT; }; - 5DC1AF69A773401DB1E8FB32 /* juce_RelativeTime.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativeTime.cpp; path = ../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp; sourceTree = SOURCE_ROOT; }; - 5E0F8A60411A03461FD687CE /* juce_GroupComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GroupComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h; sourceTree = SOURCE_ROOT; }; - 5E1EFF4EEA5684FA00CAA353 /* juce_ResizableBorderComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResizableBorderComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h; sourceTree = SOURCE_ROOT; }; - 5E663D5A55F191AB92A1383F /* juce_FileInputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileInputStream.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h; sourceTree = SOURCE_ROOT; }; - 5E94E897783BEEFE61E61A2C /* juce_android_WebBrowserComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_WebBrowserComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp; sourceTree = SOURCE_ROOT; }; - 5EA61EDD64BE1E401DD0AA5E /* SpikeDisplayNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikeDisplayNode.h; path = ../../Source/Processors/SpikeDisplayNode.h; sourceTree = SOURCE_ROOT; }; - 5EA661C13CB7197A45F20028 /* PipelineB-02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PipelineB-02.png"; path = "../../Resources/Images/Buttons/PipelineB-02.png"; sourceTree = SOURCE_ROOT; }; - 5F64FDAFCA899A16C7FDDBCA /* AudioNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioNode.h; path = ../../Source/Processors/AudioNode.h; sourceTree = SOURCE_ROOT; }; - 5F6DCA68A982E930389644FD /* juce_linux_Network.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Network.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp; sourceTree = SOURCE_ROOT; }; - 5FEBF3F722DB6191BF659816 /* juce_ArrowButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ArrowButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp; sourceTree = SOURCE_ROOT; }; - 5FEFF62D585CF777C950E569 /* juce_LookAndFeel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LookAndFeel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp; sourceTree = SOURCE_ROOT; }; - 601654292170CD2D60E912A6 /* juce_linux_ALSA.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_ALSA.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp; sourceTree = SOURCE_ROOT; }; - 603764889DE750F8E87F6428 /* juce_win32_Direct2DGraphicsContext.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Direct2DGraphicsContext.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp; sourceTree = SOURCE_ROOT; }; - 605C7ACB09E7739EBE4F1539 /* juce_AudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h; sourceTree = SOURCE_ROOT; }; - 60B1BDA3E9E14F9515963082 /* juce_BasicNativeHeaders.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BasicNativeHeaders.h; path = ../../JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h; sourceTree = SOURCE_ROOT; }; - 60C73954D517E868937D98D7 /* GenericAxes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GenericAxes.h; path = ../../Source/Processors/Visualization/SpikePlotting/GenericAxes.h; sourceTree = SOURCE_ROOT; }; - 610E487E060C42B52FD5AAC9 /* ControlPanel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ControlPanel.cpp; path = ../../Source/UI/ControlPanel.cpp; sourceTree = SOURCE_ROOT; }; - 61317B5191E05925F232E18C /* unibody-8.otf */ = {isa = PBXFileReference; lastKnownFileType = file.otf; name = "unibody-8.otf"; path = "../../Resources/Fonts/unibody-8.otf"; sourceTree = SOURCE_ROOT; }; - 61481DD4AAC7731CE984937D /* juce_OpenGLExtensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGLExtensions.h; path = ../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGLExtensions.h; sourceTree = SOURCE_ROOT; }; - 617F5DFAAE97F48FA996A781 /* juce_DrawableRectangle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableRectangle.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h; sourceTree = SOURCE_ROOT; }; - 61AD209597F427C4EA8E4F62 /* SpikePlot.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikePlot.cpp; path = ../../Source/Processors/Visualization/SpikePlotting/SpikePlot.cpp; sourceTree = SOURCE_ROOT; }; - 61B0CBF705D5FC0431776286 /* juce_OpenGLShaderProgram.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OpenGLShaderProgram.cpp; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp; sourceTree = SOURCE_ROOT; }; - 627956A7A1CB15251D02C8C5 /* juce_ScopedXLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScopedXLock.h; path = ../../JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h; sourceTree = SOURCE_ROOT; }; - 6328434A329C353DB8D9512C /* SourceNodeEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SourceNodeEditor.cpp; path = ../../Source/Processors/Editors/SourceNodeEditor.cpp; sourceTree = SOURCE_ROOT; }; - 6340B1D2FECEABBBE6C0DE28 /* Types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Types.h; path = ../../Source/Dsp/Types.h; sourceTree = SOURCE_ROOT; }; - 63AF6BE7FE2A9E7882743B4F /* juce_mac_Network.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_Network.mm; path = ../../JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm; sourceTree = SOURCE_ROOT; }; - 63D8339BD02403BA38BA0E31 /* PlotUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PlotUtils.h; path = ../../Source/Processors/Visualization/SpikePlotting/PlotUtils.h; sourceTree = SOURCE_ROOT; }; - 63F4150ABBA43B2215230034 /* juce_IIRFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_IIRFilter.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h; sourceTree = SOURCE_ROOT; }; - 642C4CFA27846188E3D53688 /* juce_AudioDeviceManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioDeviceManager.h; path = ../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h; sourceTree = SOURCE_ROOT; }; - 649F22404167E0D0EA244196 /* juce_Toolbar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Toolbar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.cpp; sourceTree = SOURCE_ROOT; }; - 6514FD7E6C5EC12735E49FBC /* juce_mac_FileChooser.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_FileChooser.mm; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_FileChooser.mm; sourceTree = SOURCE_ROOT; }; - 651E9B78A5139F7A5BCA4D90 /* juce_PropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; - 65312FAD0900119CDF6CF414 /* PoleFilter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PoleFilter.cpp; path = ../../Source/Dsp/PoleFilter.cpp; sourceTree = SOURCE_ROOT; }; - 6535D85C084292220330EDD9 /* juce_ResamplingAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResamplingAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h; sourceTree = SOURCE_ROOT; }; - 65751E743D5EFD4066E50746 /* juce_LagrangeInterpolator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LagrangeInterpolator.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h; sourceTree = SOURCE_ROOT; }; - 6589EAEF497ABA76A295B121 /* juce_VSTPluginFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_VSTPluginFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h; sourceTree = SOURCE_ROOT; }; - 658D08592154525DA1C40826 /* juce_FileLogger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileLogger.cpp; path = ../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp; sourceTree = SOURCE_ROOT; }; - 6596D69CCD1502DC6BBD15F1 /* juce_CharPointer_UTF32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CharPointer_UTF32.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h; sourceTree = SOURCE_ROOT; }; - 65980344D141B0008A94E2E4 /* juce_win32_DirectShowComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DirectShowComponent.cpp; path = ../../JuceLibraryCode/modules/juce_video/native/juce_win32_DirectShowComponent.cpp; sourceTree = SOURCE_ROOT; }; - 65A447DCF8A68BAABC20FC7D /* juce_FileFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileFilter.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileFilter.h; sourceTree = SOURCE_ROOT; }; - 65BE7542749DCCAE33ACF40F /* juce_OldSchoolLookAndFeel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OldSchoolLookAndFeel.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/lookandfeel/juce_OldSchoolLookAndFeel.h; sourceTree = SOURCE_ROOT; }; - 65DA1366481AB10AFB3AF344 /* juce_PerformanceCounter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PerformanceCounter.h; path = ../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h; sourceTree = SOURCE_ROOT; }; - 65F4459CC1832883FFF6C166 /* juce_audio_devices.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_audio_devices.mm; path = ../../JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm; sourceTree = SOURCE_ROOT; }; - 66463AB11EA4D6341C32F27E /* DataWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DataWindow.cpp; path = ../../Source/Processors/Visualization/DataWindow.cpp; sourceTree = SOURCE_ROOT; }; - 66C663401829E0F7E787F708 /* juce_PropertySet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PropertySet.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h; sourceTree = SOURCE_ROOT; }; - 66D3F831CE4F6AE89E4C869A /* juce_LinkedListPointer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LinkedListPointer.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h; sourceTree = SOURCE_ROOT; }; - 66F524552E8DE88CDC2E40FD /* silkscreen-serialized */ = {isa = PBXFileReference; lastKnownFileType = file; name = "silkscreen-serialized"; path = "../../Resources/Fonts/silkscreen-serialized"; sourceTree = SOURCE_ROOT; }; - 66FE597910F6A68CBB6FA055 /* juce_MemoryInputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MemoryInputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp; sourceTree = SOURCE_ROOT; }; - 670987D88775D6B240C34820 /* juce_NotificationType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NotificationType.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h; sourceTree = SOURCE_ROOT; }; - 674FDCCEF6A1379A0F689004 /* juce_ComponentBoundsConstrainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentBoundsConstrainer.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h; sourceTree = SOURCE_ROOT; }; - 67BB47E709B643D4C01AB34C /* juce_AudioDeviceSelectorComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioDeviceSelectorComponent.cpp; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp; sourceTree = SOURCE_ROOT; }; - 6832130272774CD542793762 /* juce_mac_CoreGraphicsContext.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_CoreGraphicsContext.mm; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm; sourceTree = SOURCE_ROOT; }; - 686FA8DDF2848517CBFB9E4A /* juce_MouseCursor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseCursor.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp; sourceTree = SOURCE_ROOT; }; - 6880C148A38A5C8D0092E358 /* Merger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Merger.h; path = ../../Source/Processors/Utilities/Merger.h; sourceTree = SOURCE_ROOT; }; - 6917A53BAA3CA2819E4C10BF /* juce_ToolbarItemComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToolbarItemComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp; sourceTree = SOURCE_ROOT; }; - 693E9C5C9A435F791921DAAE /* juce_AudioDeviceManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioDeviceManager.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp; sourceTree = SOURCE_ROOT; }; - 696F2DC49934E6F01A2DF9FE /* juce_FileTreeComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileTreeComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp; sourceTree = SOURCE_ROOT; }; - 698B0EC670DA47934444381B /* juce_win32_Network.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Network.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp; sourceTree = SOURCE_ROOT; }; - 6A559D9595A54EF52BF0773A /* juce_Range.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Range.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_Range.h; sourceTree = SOURCE_ROOT; }; - 6A63308EBE68478531604BA4 /* juce_DirectoryContentsList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DirectoryContentsList.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp; sourceTree = SOURCE_ROOT; }; - 6ABF91320A2EB6D307091AEE /* juce_mac_CameraDevice.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_CameraDevice.mm; path = ../../JuceLibraryCode/modules/juce_video/native/juce_mac_CameraDevice.mm; sourceTree = SOURCE_ROOT; }; - 6B28CEAF75E22F2CCCACBCC7 /* juce_audio_formats.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_audio_formats.mm; path = ../../JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm; sourceTree = SOURCE_ROOT; }; - 6B32691AA8B3D304B68CFA64 /* juce_MemoryMappedAudioFormatReader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MemoryMappedAudioFormatReader.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h; sourceTree = SOURCE_ROOT; }; - 6B7252D3F574AE21BE464327 /* PipelineA-02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PipelineA-02.png"; path = "../../Resources/Images/Buttons/PipelineA-02.png"; sourceTree = SOURCE_ROOT; }; - 6B90F5150FA8E114E8AE98BF /* juce_AudioFormatWriter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFormatWriter.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp; sourceTree = SOURCE_ROOT; }; - 6BA113C799640798D3F29A06 /* juce_ProgressBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ProgressBar.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.h; sourceTree = SOURCE_ROOT; }; - 6BA7D7A7E3E2E646E50D334A /* juce_FileSearchPathListComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileSearchPathListComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp; sourceTree = SOURCE_ROOT; }; - 6BBBC0907D7A62E2F3AB9BDF /* juce_Colours.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Colours.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp; sourceTree = SOURCE_ROOT; }; - 6C24163DC4ECD731489CC4F6 /* juce_OwnedArray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OwnedArray.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h; sourceTree = SOURCE_ROOT; }; - 6C36C3C304EB066B1DFCCD9C /* juce_SystemClipboard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SystemClipboard.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h; sourceTree = SOURCE_ROOT; }; - 6C8489C41782E3D391AF0C26 /* juce_Identifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Identifier.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_Identifier.h; sourceTree = SOURCE_ROOT; }; - 6CA98F8581CEAE2DC9AEBCE9 /* juce_CallbackMessage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CallbackMessage.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h; sourceTree = SOURCE_ROOT; }; - 6CBD8647DB17F1B58B14A3BC /* juce_win32_AudioCDBurner.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_AudioCDBurner.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp; sourceTree = SOURCE_ROOT; }; - 6D34DD9AB987A67BADE71C65 /* RadioButtons-05.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons-05.png"; path = "../../Resources/Images/Icons/RadioButtons-05.png"; sourceTree = SOURCE_ROOT; }; - 6D4BA4399FDEB6D2195B257D /* juce_SplashScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SplashScreen.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.h; sourceTree = SOURCE_ROOT; }; - 6D4DFC260B2966E3EBFC0C79 /* juce_SliderPropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SliderPropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; - 6D59D5780ECD2CC9703CB499 /* Butterworth.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Butterworth.h; path = ../../Source/Dsp/Butterworth.h; sourceTree = SOURCE_ROOT; }; - 6D619C7A3A14981DC4EFF223 /* juce_IIRFilterAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_IIRFilterAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h; sourceTree = SOURCE_ROOT; }; - 6D77949E9C7C9B5A7795C0E0 /* juce_PathStrokeType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PathStrokeType.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h; sourceTree = SOURCE_ROOT; }; - 6DA8EC2F779DEBB701FE33CA /* juce_win32_HiddenMessageWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_HiddenMessageWindow.h; path = ../../JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h; sourceTree = SOURCE_ROOT; }; - 6DCDFF2618CFEECEACE87630 /* juce_android_GraphicsContext.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_GraphicsContext.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp; sourceTree = SOURCE_ROOT; }; - 6DD526F86CBF2C3B3487FFE1 /* juce_ComponentBuilder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentBuilder.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp; sourceTree = SOURCE_ROOT; }; - 6E2F243D8F70CC92391204A4 /* juce_MultiDocumentPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MultiDocumentPanel.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h; sourceTree = SOURCE_ROOT; }; - 6EA1CC7DACDDBA863179521A /* juce_TemporaryFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TemporaryFile.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp; sourceTree = SOURCE_ROOT; }; - 6EF4EFD6D74D2573AC6B6A6F /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_audio_devices/juce_module_info; sourceTree = SOURCE_ROOT; }; - 6F9B89F7AD0E13887871D4FE /* SourceDrop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = SourceDrop.png; path = ../../Resources/Images/Icons/SourceDrop.png; sourceTree = SOURCE_ROOT; }; - 6FE8B0DD6116E6A3456ECF09 /* juce_ios_UIViewComponent.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_ios_UIViewComponent.mm; path = ../../JuceLibraryCode/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm; sourceTree = SOURCE_ROOT; }; - 700597338DEC9AB65C4C8A5E /* juce_DrawableText.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableText.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h; sourceTree = SOURCE_ROOT; }; - 70151263C4CB8A4F79431E11 /* EventNodeEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EventNodeEditor.cpp; path = ../../Source/Processors/Editors/EventNodeEditor.cpp; sourceTree = SOURCE_ROOT; }; - 70BF68C222D1E0A0368EB845 /* juce_ApplicationCommandManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ApplicationCommandManager.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp; sourceTree = SOURCE_ROOT; }; - 70ECB490BD59F59D003F3BEE /* juce_android_CameraDevice.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_CameraDevice.cpp; path = ../../JuceLibraryCode/modules/juce_video/native/juce_android_CameraDevice.cpp; sourceTree = SOURCE_ROOT; }; - 70F06DBCA3948BCC1062E36F /* ChannelSelector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ChannelSelector.h; path = ../../Source/Processors/Editors/ChannelSelector.h; sourceTree = SOURCE_ROOT; }; - 71CF8F6995DF1BA2038C21D6 /* juce_AlertWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AlertWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.h; sourceTree = SOURCE_ROOT; }; - 7291F19253205B1A5138908E /* juce_DynamicObject.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DynamicObject.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp; sourceTree = SOURCE_ROOT; }; - 72C33BA70B9EE82E39F1EC6C /* juce_MP3AudioFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MP3AudioFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h; sourceTree = SOURCE_ROOT; }; - 72FCE41894123FC5DB01566B /* juce_OpenGL_win32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGL_win32.h; path = ../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_win32.h; sourceTree = SOURCE_ROOT; }; - 7387114E34496F4606550863 /* juce_HyperlinkButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_HyperlinkButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp; sourceTree = SOURCE_ROOT; }; - 73ACB7A051EDE5F676E35FFD /* juce_PerformanceCounter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PerformanceCounter.cpp; path = ../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp; sourceTree = SOURCE_ROOT; }; - 73C69D948D33899821536025 /* juce_SystemTrayIconComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SystemTrayIconComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h; sourceTree = SOURCE_ROOT; }; - 748E62D05C8FFF74DCA234C7 /* juce_ThreadPool.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ThreadPool.cpp; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp; sourceTree = SOURCE_ROOT; }; - 74A81014471CC0EB0D5E6571 /* juce_ValueTree.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ValueTree.cpp; path = ../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp; sourceTree = SOURCE_ROOT; }; - 74DE857CEFA10BC49FF591DB /* juce_Synthesiser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Synthesiser.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h; sourceTree = SOURCE_ROOT; }; - 753B81CCB5A6B6929679E7B7 /* juce_Application.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Application.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h; sourceTree = SOURCE_ROOT; }; - 7555A13E69B99B1B6C7295FD /* juce_InputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp; sourceTree = SOURCE_ROOT; }; - 758BC480F153DEA79304366B /* ofArduino.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ofArduino.h; path = ../../Source/Processors/Serial/ofArduino.h; sourceTree = SOURCE_ROOT; }; - 75A4EEE127FAB86D65FF5F6E /* juce_RelativeCoordinatePositioner.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativeCoordinatePositioner.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp; sourceTree = SOURCE_ROOT; }; - 75E0C433EC27CFB712CD9F75 /* juce_PluginListComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PluginListComponent.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h; sourceTree = SOURCE_ROOT; }; - 75FCE8908DD9055F90E93716 /* juce_ResizableBorderComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableBorderComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp; sourceTree = SOURCE_ROOT; }; - 76140C0485FDDA98C3D98E2A /* juce_OldSchoolLookAndFeel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OldSchoolLookAndFeel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/lookandfeel/juce_OldSchoolLookAndFeel.cpp; sourceTree = SOURCE_ROOT; }; - 766923F74E30FF5D6B12E7CE /* juce_DrawableComposite.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableComposite.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h; sourceTree = SOURCE_ROOT; }; - 76E89CBE70BF8F2476B7AA34 /* juce_SortedSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SortedSet.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h; sourceTree = SOURCE_ROOT; }; - 76F569AE7B444D8F69EE0E86 /* AudioResamplingNode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioResamplingNode.cpp; path = ../../Source/Processors/AudioResamplingNode.cpp; sourceTree = SOURCE_ROOT; }; - 7719FB81DDF23CF0164B131D /* juce_BlowFish.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BlowFish.h; path = ../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.h; sourceTree = SOURCE_ROOT; }; - 77B3E84324445076F1F907E9 /* juce_win32_Threads.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Threads.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp; sourceTree = SOURCE_ROOT; }; - 783D8922D5C687E170FA1A2C /* cpmono_plain.otf */ = {isa = PBXFileReference; lastKnownFileType = file.otf; name = cpmono_plain.otf; path = ../../Resources/Fonts/cpmono_plain.otf; sourceTree = SOURCE_ROOT; }; - 784233150B26826701C09103 /* juce_MidiKeyboardComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiKeyboardComponent.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h; sourceTree = SOURCE_ROOT; }; - 786A97B2B4E2BB6406546647 /* juce_FileSearchPathListComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileSearchPathListComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h; sourceTree = SOURCE_ROOT; }; - 786F6A40506C2094B812F4D5 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_audio_basics/juce_module_info; sourceTree = SOURCE_ROOT; }; - 788F8B7719B70465762B634B /* DataBuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DataBuffer.cpp; path = ../../Source/Processors/DataThreads/DataBuffer.cpp; sourceTree = SOURCE_ROOT; }; - 789139D88F449BE488BF3CCB /* juce_AudioFormatReader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioFormatReader.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h; sourceTree = SOURCE_ROOT; }; - 78BA978C614603B5E9ECFFF1 /* juce_ComponentPeer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentPeer.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp; sourceTree = SOURCE_ROOT; }; - 78CC9639B933CE2497264EF2 /* juce_KeyPress.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyPress.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h; sourceTree = SOURCE_ROOT; }; - 793A4A777FEFA450F86C78EE /* juce_GraphicsContext.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GraphicsContext.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp; sourceTree = SOURCE_ROOT; }; - 79BBD2F2F31D76CC4F5BD012 /* RadioButtons_selected-04.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected-04.png"; path = "../../Resources/Images/Icons/RadioButtons_selected-04.png"; sourceTree = SOURCE_ROOT; }; - 79C91DDF3BC3F15D0338E504 /* ProcessorList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ProcessorList.cpp; path = ../../Source/UI/ProcessorList.cpp; sourceTree = SOURCE_ROOT; }; - 7A93BFD2180B5E00B124CB1A /* juce_PixelFormats.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PixelFormats.h; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h; sourceTree = SOURCE_ROOT; }; - 7A9F37527280A470F201FB6E /* juce_SystemTrayIconComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SystemTrayIconComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp; sourceTree = SOURCE_ROOT; }; - 7ACB1CB66D69738904358F43 /* Design.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Design.h; path = ../../Source/Dsp/Design.h; sourceTree = SOURCE_ROOT; }; - 7B42B28FDB2E3AC67EF296F8 /* PracticalSocket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PracticalSocket.h; path = ../../Source/Network/PracticalSocket.h; sourceTree = SOURCE_ROOT; }; - 7B674BB1DA11A4E58EA71624 /* juce_EdgeTable.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_EdgeTable.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp; sourceTree = SOURCE_ROOT; }; - 7BCE1C09508E1B9CFC79C185 /* juce_CaretComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CaretComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp; sourceTree = SOURCE_ROOT; }; - 7BD2C39F13FDE202141C4B41 /* MessageCenter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MessageCenter.cpp; path = ../../Source/UI/MessageCenter.cpp; sourceTree = SOURCE_ROOT; }; - 7BE7EBBCC4DCF760A1AA697E /* juce_DirectoryContentsList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DirectoryContentsList.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h; sourceTree = SOURCE_ROOT; }; - 7C0F2759385C66CAC3EC362D /* juce_win32_ActiveXComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_ActiveXComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp; sourceTree = SOURCE_ROOT; }; - 7C15112E5F287ACDD74480F5 /* juce_QuickTimeMovieComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_QuickTimeMovieComponent.h; path = ../../JuceLibraryCode/modules/juce_video/playback/juce_QuickTimeMovieComponent.h; sourceTree = SOURCE_ROOT; }; - 7C1D87A0C78F661FB459786B /* saw_wave.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = saw_wave.png; path = ../../Resources/Images/Icons/saw_wave.png; sourceTree = SOURCE_ROOT; }; - 7C6921FE817699C1B95AEBF6 /* juce_ScopedReadLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScopedReadLock.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h; sourceTree = SOURCE_ROOT; }; - 7C71195623459A6C2524D418 /* juce_MidiKeyboardComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiKeyboardComponent.cpp; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp; sourceTree = SOURCE_ROOT; }; - 7CD03E334269D693E1B84856 /* juce_AudioTransportSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioTransportSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp; sourceTree = SOURCE_ROOT; }; - 7CE1E34F6A0091E720854E75 /* juce_Value.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Value.h; path = ../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h; sourceTree = SOURCE_ROOT; }; - 7CF939BD59D45EB41B5FE628 /* juce_Button.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Button.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp; sourceTree = SOURCE_ROOT; }; - 7D363D7B36A55EEB3198A827 /* juce_android_Midi.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Midi.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp; sourceTree = SOURCE_ROOT; }; - 7D36B006AE0B139D8A3D8641 /* juce_win32_DirectWriteTypeface.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DirectWriteTypeface.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp; sourceTree = SOURCE_ROOT; }; - 7D8100DC3A532980AEAAD909 /* juce_ArrayAllocationBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ArrayAllocationBase.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h; sourceTree = SOURCE_ROOT; }; - 7D88F7083884A5ED2DBE7534 /* juce_GroupComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GroupComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp; sourceTree = SOURCE_ROOT; }; - 7D9374931D760ADC65DCBFC6 /* DataViewport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataViewport.h; path = ../../Source/UI/DataViewport.h; sourceTree = SOURCE_ROOT; }; - 7E40891072657FB5ADC2FAB7 /* juce_Array.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Array.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_Array.h; sourceTree = SOURCE_ROOT; }; - 7E581214A64A535E03EA759B /* juce_AlertWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AlertWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.cpp; sourceTree = SOURCE_ROOT; }; - 7E875E681E18D693D5ADB2FB /* EditorViewport.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EditorViewport.cpp; path = ../../Source/UI/EditorViewport.cpp; sourceTree = SOURCE_ROOT; }; - 7EA46209F07B2C8A83D0873A /* juce_AudioProcessorGraph.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioProcessorGraph.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp; sourceTree = SOURCE_ROOT; }; - 7EBB3F8185EB597DEF77534D /* juce_Message.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Message.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_Message.h; sourceTree = SOURCE_ROOT; }; - 7EBEBC6DBA8DCA5A5D8C72E1 /* juce_Timer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Timer.h; path = ../../JuceLibraryCode/modules/juce_events/timers/juce_Timer.h; sourceTree = SOURCE_ROOT; }; - 7ECD5DB4BEBC44559D064E08 /* juce_Logger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Logger.cpp; path = ../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp; sourceTree = SOURCE_ROOT; }; - 7EFF8622168303A4391D6CAE /* RootFinder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RootFinder.h; path = ../../Source/Dsp/RootFinder.h; sourceTree = SOURCE_ROOT; }; - 7F17077973FFDD70C4B78E7E /* juce_PlatformDefs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PlatformDefs.h; path = ../../JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h; sourceTree = SOURCE_ROOT; }; - 7F1E84C068D3E6AA13CDD699 /* juce_Justification.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Justification.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.cpp; sourceTree = SOURCE_ROOT; }; - 7F49EA0CD3379397520AA6F1 /* juce_DeletedAtShutdown.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DeletedAtShutdown.cpp; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp; sourceTree = SOURCE_ROOT; }; - 7F92025F0B8FD4FA725CC70B /* juce_ImageConvolutionKernel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageConvolutionKernel.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp; sourceTree = SOURCE_ROOT; }; - 7F93E4F0CC8B842AC1D3E560 /* juce_ToolbarItemPalette.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToolbarItemPalette.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h; sourceTree = SOURCE_ROOT; }; - 7FDFE493862CE27EFCAC3F7F /* RadioButtons-04.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons-04.png"; path = "../../Resources/Images/Icons/RadioButtons-04.png"; sourceTree = SOURCE_ROOT; }; - 803D306CDAC2BD3BA04534EA /* juce_AudioProcessorEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioProcessorEditor.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp; sourceTree = SOURCE_ROOT; }; - 8077C8D1C544F458947D693E /* juce_TextLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextLayout.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h; sourceTree = SOURCE_ROOT; }; - 80A612858FA1177A262744C6 /* juce_HyperlinkButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_HyperlinkButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h; sourceTree = SOURCE_ROOT; }; - 80C1B737D2C2CB519D1787D7 /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; - 80D57E78015C789503FE24B4 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_audio_utils/juce_module_info; sourceTree = SOURCE_ROOT; }; - 80E8C07F5807C65BCDFCCF94 /* juce_AudioSampleBuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioSampleBuffer.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp; sourceTree = SOURCE_ROOT; }; - 80EEDD40F49120ADBE9DCBDF /* rhd2000datablock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rhd2000datablock.h; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000datablock.h"; sourceTree = SOURCE_ROOT; }; - 811C4D165AD7AABF4055059C /* juce_Expression.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Expression.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.h; sourceTree = SOURCE_ROOT; }; - 816EB8024DD50DE4B7E84CB8 /* juce_ByteOrder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ByteOrder.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h; sourceTree = SOURCE_ROOT; }; - 81D578AA5F277EB0946050E5 /* juce_win32_DragAndDrop.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DragAndDrop.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp; sourceTree = SOURCE_ROOT; }; - 820BB485C2DEA7F63723CC03 /* ProjectionAxes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProjectionAxes.h; path = ../../Source/Processors/Visualization/SpikePlotting/ProjectionAxes.h; sourceTree = SOURCE_ROOT; }; - 822A504EE33F35F18A7F21AF /* juce_AiffAudioFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AiffAudioFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h; sourceTree = SOURCE_ROOT; }; - 82EB2BDE7B9A4D5D945497B9 /* juce_MidiMessageSequence.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiMessageSequence.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h; sourceTree = SOURCE_ROOT; }; - 837D266B3F62C3B05C2BC28C /* BinaryData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = SOURCE_ROOT; }; - 83803D96768258DA20710764 /* juce_XmlElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_XmlElement.h; path = ../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h; sourceTree = SOURCE_ROOT; }; - 83950E9D0D7C100B7DCA0E55 /* juce_TextButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h; sourceTree = SOURCE_ROOT; }; - 83E5EA2AA0CB928889AC80AB /* SpikeDetectorEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikeDetectorEditor.h; path = ../../Source/Processors/Editors/SpikeDetectorEditor.h; sourceTree = SOURCE_ROOT; }; - 847F6986DFA468BA8D80A531 /* miso-light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = "miso-light.ttf"; path = "../../Resources/Fonts/miso-light.ttf"; sourceTree = SOURCE_ROOT; }; - 8515A61F1E3BD62B9B95B495 /* juce_audio_utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_audio_utils.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.h; sourceTree = SOURCE_ROOT; }; - 8515E367462BEF36233E2447 /* juce_AudioUnitPluginFormat.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_AudioUnitPluginFormat.mm; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm; sourceTree = SOURCE_ROOT; }; - 8551342E7D16FCA4F9A80BC5 /* juce_AudioSubsectionReader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioSubsectionReader.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp; sourceTree = SOURCE_ROOT; }; - 85928E2EF1C438EBC9EB07EA /* juce_ImageCache.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageCache.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp; sourceTree = SOURCE_ROOT; }; - 85C3F7CDF87409A56082DF67 /* juce_FileListComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileListComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp; sourceTree = SOURCE_ROOT; }; - 86515FD9AD34D6FF96C0D8B6 /* juce_BufferingAudioFormatReader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BufferingAudioFormatReader.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp; sourceTree = SOURCE_ROOT; }; - 8689288B66B16EFB106CB2F4 /* juce_TextInputTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextInputTarget.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h; sourceTree = SOURCE_ROOT; }; - 86E8E44A13F17083ED300BD5 /* juce_ChangeListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChangeListener.h; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h; sourceTree = SOURCE_ROOT; }; - 86F4AAFCE3FEB34E325F3020 /* juce_win32_ComSmartPtr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_ComSmartPtr.h; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h; sourceTree = SOURCE_ROOT; }; - 8751DF970A9E3598683BACAF /* FPGAThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FPGAThread.h; path = ../../Source/Processors/DataThreads/FPGAThread.h; sourceTree = SOURCE_ROOT; }; - 879B0383EF2A8B116903A500 /* juce_ImageCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageCache.h; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h; sourceTree = SOURCE_ROOT; }; - 87B4BA68E49DD11197B7AFDB /* JuceHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = SOURCE_ROOT; }; - 880CC7C325EFF665AC3006D2 /* juce_KeyListener.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyListener.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp; sourceTree = SOURCE_ROOT; }; - 881237D5E366342B117C0ED7 /* juce_WildcardFileFilter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_WildcardFileFilter.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_WildcardFileFilter.cpp; sourceTree = SOURCE_ROOT; }; - 8822ADC9DB83FAF39B841E31 /* juce_Font.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Font.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp; sourceTree = SOURCE_ROOT; }; - 886E18520E8BD77234E1B686 /* FilterNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterNode.h; path = ../../Source/Processors/FilterNode.h; sourceTree = SOURCE_ROOT; }; - 8882F8EBE55F52FA8E519249 /* juce_android_Files.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Files.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp; sourceTree = SOURCE_ROOT; }; - 88E5D0906646465409715828 /* juce_PreferencesPanel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PreferencesPanel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp; sourceTree = SOURCE_ROOT; }; - 891B132A0355007B4F37454C /* juce_GraphicsContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GraphicsContext.h; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h; sourceTree = SOURCE_ROOT; }; - 893E1A681FF162F6C9069F62 /* juce_HashMap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_HashMap.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h; sourceTree = SOURCE_ROOT; }; - 894C0CAC31D382477E7A122E /* juce_PluginDirectoryScanner.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PluginDirectoryScanner.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h; sourceTree = SOURCE_ROOT; }; - 89B0B267EF0A2A19A082EB86 /* juce_android_Fonts.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Fonts.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp; sourceTree = SOURCE_ROOT; }; - 8A026DB58E3555F7B070DA61 /* juce_MemoryBlock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MemoryBlock.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h; sourceTree = SOURCE_ROOT; }; - 8A91849BE6B96EB8C0663469 /* LfpDisplayEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpDisplayEditor.cpp; path = ../../Source/Processors/Editors/LfpDisplayEditor.cpp; sourceTree = SOURCE_ROOT; }; - 8A989F74B1957BCB3B9BA398 /* rhd2000registers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rhd2000registers.h; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000registers.h"; sourceTree = SOURCE_ROOT; }; - 8AA1009705E8A9531C707ED1 /* juce_JSON.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_JSON.cpp; path = ../../JuceLibraryCode/modules/juce_core/json/juce_JSON.cpp; sourceTree = SOURCE_ROOT; }; - 8AE2DDA47B2DFDEEEF69B12F /* FileReaderIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = FileReaderIcon.png; path = ../../Resources/Images/Icons/FileReaderIcon.png; sourceTree = SOURCE_ROOT; }; - 8B0C9D288C428BA5D956AE13 /* juce_MidiMessage.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiMessage.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp; sourceTree = SOURCE_ROOT; }; - 8B49B07BC7534B247ADC756A /* juce_WeakReference.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WeakReference.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h; sourceTree = SOURCE_ROOT; }; - 8B745839B225E44C9EB5C6FA /* ParameterEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ParameterEditor.h; path = ../../Source/Processors/Editors/ParameterEditor.h; sourceTree = SOURCE_ROOT; }; - 8B7EB54E1F773517A65D935C /* juce_DropShadowEffect.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DropShadowEffect.h; path = ../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h; sourceTree = SOURCE_ROOT; }; - 8B9C0831BE4E09B7C0078B7E /* ArduinoOutputEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ArduinoOutputEditor.h; path = ../../Source/Processors/Editors/ArduinoOutputEditor.h; sourceTree = SOURCE_ROOT; }; - 8C077447B0DFC739C7D2E437 /* juce_MemoryInputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MemoryInputStream.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h; sourceTree = SOURCE_ROOT; }; - 8C268C3D0B8EC2BB8953E7F7 /* juce_ModifierKeys.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ModifierKeys.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp; sourceTree = SOURCE_ROOT; }; - 8C38407151E149A7E2A15801 /* juce_SHA256.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SHA256.h; path = ../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.h; sourceTree = SOURCE_ROOT; }; - 8C3B6865F2053C80A6E692F1 /* juce_Label.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Label.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.cpp; sourceTree = SOURCE_ROOT; }; - 8CAEF601359DB6CB50E89D1A /* juce_ActionBroadcaster.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ActionBroadcaster.cpp; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp; sourceTree = SOURCE_ROOT; }; - 8D4FBD30E1C9EC0DA749BC83 /* juce_DropShadower.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DropShadower.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp; sourceTree = SOURCE_ROOT; }; - 8D6A419A4678968762A59B28 /* juce_BufferingAudioFormatReader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BufferingAudioFormatReader.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h; sourceTree = SOURCE_ROOT; }; - 8D9DD6147EC0553B092FD367 /* juce_RSAKey.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RSAKey.cpp; path = ../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.cpp; sourceTree = SOURCE_ROOT; }; - 8E61792F6D6FC75CF18095CC /* juce_AudioPluginFormatManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioPluginFormatManager.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h; sourceTree = SOURCE_ROOT; }; - 8E696460A8A860B7A4044DFC /* juce_WebBrowserComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WebBrowserComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h; sourceTree = SOURCE_ROOT; }; - 8E78AAA58721DE609F6FFC61 /* juce_DragAndDropContainer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DragAndDropContainer.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp; sourceTree = SOURCE_ROOT; }; - 8EB76CA261F62A89B3D25F81 /* juce_Thread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Thread.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_Thread.h; sourceTree = SOURCE_ROOT; }; - 8F0549459970F529587D6CDD /* juce_WindowsMediaAudioFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WindowsMediaAudioFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h; sourceTree = SOURCE_ROOT; }; - 8F08D5488CE147D693BA21E2 /* juce_osx_ObjCHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_osx_ObjCHelpers.h; path = ../../JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h; sourceTree = SOURCE_ROOT; }; - 8F29CAC0059E3697A5A3652F /* juce_URL.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_URL.cpp; path = ../../JuceLibraryCode/modules/juce_core/network/juce_URL.cpp; sourceTree = SOURCE_ROOT; }; - 8F3C158B4FB92CFC48324896 /* juce_SelectedItemSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SelectedItemSet.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h; sourceTree = SOURCE_ROOT; }; - 8F7B13BF318C11900A2277DD /* juce_XmlDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_XmlDocument.h; path = ../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h; sourceTree = SOURCE_ROOT; }; - 901C720965646841A94EB099 /* juce_ActiveXControlComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActiveXControlComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h; sourceTree = SOURCE_ROOT; }; - 901DB6D5FE9134F2ADB9AE46 /* juce_ChildProcess.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChildProcess.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h; sourceTree = SOURCE_ROOT; }; - 90607327D7A1BB3C2C4E9264 /* juce_Random.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Random.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_Random.h; sourceTree = SOURCE_ROOT; }; - 9069CE21141F5A4C5721BCF3 /* juce_audio_devices.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_audio_devices.h; path = ../../JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h; sourceTree = SOURCE_ROOT; }; - 9070DC685E666BBFC2E19DA9 /* juce_PropertyPanel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PropertyPanel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp; sourceTree = SOURCE_ROOT; }; - 90AD1B6A2293F625D786507A /* juce_MathsFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MathsFunctions.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h; sourceTree = SOURCE_ROOT; }; - 90F2939F533A26AC021E42B1 /* juce_ColourGradient.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ColourGradient.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp; sourceTree = SOURCE_ROOT; }; - 911CCC0A579792DC56807DEC /* juce_DrawableRectangle.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableRectangle.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp; sourceTree = SOURCE_ROOT; }; - 9136BD46BE1E28A96FBBD440 /* SignalGeneratorEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SignalGeneratorEditor.cpp; path = ../../Source/Processors/Editors/SignalGeneratorEditor.cpp; sourceTree = SOURCE_ROOT; }; - 917988BE74F2180BFC0583A3 /* juce_MissingGLDefinitions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MissingGLDefinitions.h; path = ../../JuceLibraryCode/modules/juce_opengl/native/juce_MissingGLDefinitions.h; sourceTree = SOURCE_ROOT; }; - 918837CC0447C50774036664 /* juce_StretchableLayoutResizerBar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StretchableLayoutResizerBar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp; sourceTree = SOURCE_ROOT; }; - 91D7B1F8B94AE9CFCC53771F /* EventDetector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EventDetector.h; path = ../../Source/Processors/EventDetector.h; sourceTree = SOURCE_ROOT; }; - 9200FC900D22733AE716C364 /* juce_CharPointer_UTF16.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CharPointer_UTF16.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h; sourceTree = SOURCE_ROOT; }; - 921F5D04122F324502DA4E75 /* juce_TextEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextEditor.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.cpp; sourceTree = SOURCE_ROOT; }; - 92528D6653802FACF658D8EA /* FPGAOutputEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FPGAOutputEditor.h; path = ../../Source/Processors/Editors/FPGAOutputEditor.h; sourceTree = SOURCE_ROOT; }; - 92602D7166325C7232B85EDD /* DataThread.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DataThread.cpp; path = ../../Source/Processors/DataThreads/DataThread.cpp; sourceTree = SOURCE_ROOT; }; - 927AE946A1371490D809876E /* juce_MidiMessage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiMessage.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h; sourceTree = SOURCE_ROOT; }; - 927FCF11005E78D499DAF197 /* juce_CallOutBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CallOutBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.h; sourceTree = SOURCE_ROOT; }; - 92CB21BEE17D1DD03106AD87 /* ofSerial.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ofSerial.h; path = ../../Source/Processors/Serial/ofSerial.h; sourceTree = SOURCE_ROOT; }; - 92E07CA13571893873565AC7 /* juce_SplashScreen.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SplashScreen.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.cpp; sourceTree = SOURCE_ROOT; }; - 92E3405CB31ACFE3F80BBAD4 /* OpenEphysBoardLogoBlack.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = OpenEphysBoardLogoBlack.png; path = ../../Resources/Images/Icons/OpenEphysBoardLogoBlack.png; sourceTree = SOURCE_ROOT; }; - 92EC6BB8A8C4C5A61F43C233 /* juce_ToggleButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToggleButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h; sourceTree = SOURCE_ROOT; }; - 9360657FDE33FA37D80075D1 /* juce_InterprocessConnection.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InterprocessConnection.cpp; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp; sourceTree = SOURCE_ROOT; }; - 9380932BED279F91B8C1C04B /* juce_Rectangle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Rectangle.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h; sourceTree = SOURCE_ROOT; }; - 93EFC1AA800FC5DA2F04A213 /* RadioButtons_neutral-04.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_neutral-04.png"; path = "../../Resources/Images/Icons/RadioButtons_neutral-04.png"; sourceTree = SOURCE_ROOT; }; - 93F842958BCE6A9E09862CF7 /* juce_LADSPAPluginFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LADSPAPluginFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h; sourceTree = SOURCE_ROOT; }; - 9428D7423971764AC0BA9CB7 /* State.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = State.h; path = ../../Source/Dsp/State.h; sourceTree = SOURCE_ROOT; }; - 945DC754F2EACDFFB7926DE8 /* juce_FileChooser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileChooser.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h; sourceTree = SOURCE_ROOT; }; - 946FDFCA107B3F4C74C471B4 /* juce_InterprocessConnectionServer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InterprocessConnectionServer.h; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h; sourceTree = SOURCE_ROOT; }; - 94BD861806F8EA598EC09370 /* juce_ResizableCornerComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableCornerComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp; sourceTree = SOURCE_ROOT; }; - 95B57108E929DD11F898B7B1 /* FileReaderThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FileReaderThread.h; path = ../../Source/Processors/DataThreads/FileReaderThread.h; sourceTree = SOURCE_ROOT; }; - 95EC6B1536DC65070D0ADCEE /* juce_ListBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ListBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.h; sourceTree = SOURCE_ROOT; }; - 967138FE8A086734ADC8CABB /* juce_Value.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Value.cpp; path = ../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp; sourceTree = SOURCE_ROOT; }; - 96E99CD031BD069997E387FE /* juce_MidiBuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiBuffer.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp; sourceTree = SOURCE_ROOT; }; - 96F2A45DCB9BB53844B0ED4F /* juce_CodeTokeniser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CodeTokeniser.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h; sourceTree = SOURCE_ROOT; }; - 971E49A78543AADB8CA1D2B7 /* juce_OpenGLTexture.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OpenGLTexture.cpp; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp; sourceTree = SOURCE_ROOT; }; - 9731D54410B06C1000370316 /* juce_Image.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Image.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp; sourceTree = SOURCE_ROOT; }; - 97431963DB8D535DEDA9AD47 /* juce_core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_core.h; path = ../../JuceLibraryCode/modules/juce_core/juce_core.h; sourceTree = SOURCE_ROOT; }; - 97C4F046D88561EEE245BE99 /* RadioButtons_selected_over-05.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-05.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-05.png"; sourceTree = SOURCE_ROOT; }; - 982E1A954C316920557F029C /* juce_android_Network.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Network.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp; sourceTree = SOURCE_ROOT; }; - 984BC60C0AFF3EDED692FA01 /* GenericEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GenericEditor.h; path = ../../Source/Processors/Editors/GenericEditor.h; sourceTree = SOURCE_ROOT; }; - 985F2B5047476B272B1A4BD4 /* EventNodeEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EventNodeEditor.h; path = ../../Source/Processors/Editors/EventNodeEditor.h; sourceTree = SOURCE_ROOT; }; - 988F01B2B51B2AC7293D07DA /* juce_MidiMessageCollector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiMessageCollector.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp; sourceTree = SOURCE_ROOT; }; - 98C81B13A0C34D8A4E93ADD1 /* juce_ToolbarButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToolbarButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h; sourceTree = SOURCE_ROOT; }; - 98D2D452F48C86F47FB90BAD /* juce_PNGLoader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PNGLoader.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp; sourceTree = SOURCE_ROOT; }; - 996E4EA6B532E4E436F50243 /* juce_DeletedAtShutdown.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DeletedAtShutdown.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h; sourceTree = SOURCE_ROOT; }; - 9978BC2A359BC506F69E545F /* juce_SystemStats.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SystemStats.cpp; path = ../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp; sourceTree = SOURCE_ROOT; }; - 99E1BC08B886CFDD2CCFD462 /* open-ephys.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "open-ephys.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 9A21A229CFACC67E31F4F727 /* RBJ.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RBJ.cpp; path = ../../Source/Dsp/RBJ.cpp; sourceTree = SOURCE_ROOT; }; - 9A29EBC10219D89919E12FCB /* juce_ComponentDragger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentDragger.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h; sourceTree = SOURCE_ROOT; }; - 9B178E9015CF469CFD41BC79 /* juce_BufferedInputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BufferedInputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp; sourceTree = SOURCE_ROOT; }; - 9B4EA34E8F90B7CC77694B7E /* juce_DialogWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DialogWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.h; sourceTree = SOURCE_ROOT; }; - 9B5D838CB6224E82C9B36AA3 /* juce_android_Misc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Misc.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp; sourceTree = SOURCE_ROOT; }; - 9B9EDDFA0AE4991BC7FC7263 /* MessageCenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MessageCenter.h; path = ../../Source/UI/MessageCenter.h; sourceTree = SOURCE_ROOT; }; - 9BC055494F9FEE3F90630541 /* Channel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Channel.cpp; path = ../../Source/Processors/Channel.cpp; sourceTree = SOURCE_ROOT; }; - 9BE34B4DECBF4EBFD27C9792 /* juce_AudioIODeviceType.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioIODeviceType.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp; sourceTree = SOURCE_ROOT; }; - 9C089C090E400CC0E8BBB827 /* IntanThread.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = IntanThread.cpp; path = ../../Source/Processors/DataThreads/IntanThread.cpp; sourceTree = SOURCE_ROOT; }; - 9C21DBFB38865E5AFE367C6F /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 9C39C584DA6F507E773687EE /* ReferenceNodeEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ReferenceNodeEditor.cpp; path = ../../Source/Processors/Editors/ReferenceNodeEditor.cpp; sourceTree = SOURCE_ROOT; }; - 9C4342320D2DD65E2BD6351C /* juce_ToolbarButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToolbarButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp; sourceTree = SOURCE_ROOT; }; - 9C5F99C38CC703FBB871401A /* juce_ReverbAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ReverbAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - 9C701D5A7298B83CE05ECEBB /* juce_TextEditorKeyMapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextEditorKeyMapper.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h; sourceTree = SOURCE_ROOT; }; - 9C864C7DBAF37CD0719996A9 /* juce_FileBrowserListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileBrowserListener.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h; sourceTree = SOURCE_ROOT; }; - 9C96B0CBFF3D34885BB8B020 /* juce_FileDragAndDropTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileDragAndDropTarget.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h; sourceTree = SOURCE_ROOT; }; - 9CEDA04DB321755AF74D6FAF /* ChebyshevII.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ChebyshevII.h; path = ../../Source/Dsp/ChebyshevII.h; sourceTree = SOURCE_ROOT; }; - 9D050A509BEB9E3879DA35C6 /* ostrich.ttf */ = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = ostrich.ttf; path = ../../Resources/Fonts/ostrich.ttf; sourceTree = SOURCE_ROOT; }; - 9D13E0F774807670270F4790 /* juce_Drawable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Drawable.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h; sourceTree = SOURCE_ROOT; }; - 9D2510B5E6180456C53A455E /* juce_ComboBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComboBox.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp; sourceTree = SOURCE_ROOT; }; - 9D78F50147005EDB0E89E2B4 /* FPGAOutput.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FPGAOutput.cpp; path = ../../Source/Processors/FPGAOutput.cpp; sourceTree = SOURCE_ROOT; }; - 9EAAE3C0BFF3D753C375A5FC /* juce_DrawableImage.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableImage.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp; sourceTree = SOURCE_ROOT; }; - 9EC1C0A21FDCB81BE0EA60EA /* juce_ApplicationBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationBase.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h; sourceTree = SOURCE_ROOT; }; - 9F2853D1A12B686BE3BA2C61 /* juce_OpenGLImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGLImage.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.h; sourceTree = SOURCE_ROOT; }; - 9F2BCD132F453B9D9EF09F15 /* RadioButtons-01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons-01.png"; path = "../../Resources/Images/Icons/RadioButtons-01.png"; sourceTree = SOURCE_ROOT; }; - 9F3B3184EC6D42CEA35D6ED8 /* EditorViewportButtons.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EditorViewportButtons.cpp; path = ../../Source/UI/EditorViewportButtons.cpp; sourceTree = SOURCE_ROOT; }; - 9F577889CB6C54A2F7B1CA80 /* PracticalSocket.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PracticalSocket.cpp; path = ../../Source/Network/PracticalSocket.cpp; sourceTree = SOURCE_ROOT; }; - 9F61AF101B43110732BB8814 /* juce_AffineTransform.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AffineTransform.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp; sourceTree = SOURCE_ROOT; }; - 9F6664EB2C39D224C6BCC75E /* juce_Viewport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Viewport.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h; sourceTree = SOURCE_ROOT; }; - 9F845E950F19FEC4E6C88F91 /* juce_Typeface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Typeface.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h; sourceTree = SOURCE_ROOT; }; - 9FC97A1CFD250F7215B4E397 /* juce_mac_AudioCDBurner.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_AudioCDBurner.mm; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm; sourceTree = SOURCE_ROOT; }; - 9FDCF1E2B4651E58240400B9 /* juce_TextEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextEditor.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.h; sourceTree = SOURCE_ROOT; }; - 9FFD9560522567A033226BD7 /* PhaseDetector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PhaseDetector.cpp; path = ../../Source/Processors/PhaseDetector.cpp; sourceTree = SOURCE_ROOT; }; - A0D768F1B92568344DAC9F0B /* juce_win32_Fonts.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Fonts.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp; sourceTree = SOURCE_ROOT; }; - A0E3B98412D88921BB0AA58E /* AudioEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioEditor.h; path = ../../Source/Processors/Editors/AudioEditor.h; sourceTree = SOURCE_ROOT; }; - A15596CDCC27B86FC070D7FA /* juce_Desktop.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Desktop.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp; sourceTree = SOURCE_ROOT; }; - A17E8162EC7A0E513DDEB23C /* juce_PluginDescription.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PluginDescription.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp; sourceTree = SOURCE_ROOT; }; - A19C4BB4BD69D4351B344A17 /* juce_MenuBarComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MenuBarComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp; sourceTree = SOURCE_ROOT; }; - A252FE4E6A360CBC4AF694B3 /* SpikeDetectorEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeDetectorEditor.cpp; path = ../../Source/Processors/Editors/SpikeDetectorEditor.cpp; sourceTree = SOURCE_ROOT; }; - A3B6D091280930A016DF8FDA /* juce_OpenGLContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGLContext.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLContext.h; sourceTree = SOURCE_ROOT; }; - A3CAB6B56641ED68D9784348 /* PipelineA-01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PipelineA-01.png"; path = "../../Resources/Images/Buttons/PipelineA-01.png"; sourceTree = SOURCE_ROOT; }; - A3FB0EA0264580F6B00D993B /* RHD2000Thread.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RHD2000Thread.cpp; path = ../../Source/Processors/DataThreads/RHD2000Thread.cpp; sourceTree = SOURCE_ROOT; }; - A41AEA0D3ACB2B1E6713AE08 /* juce_OpenGLGraphicsContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGLGraphicsContext.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h; sourceTree = SOURCE_ROOT; }; - A41C5A4CD5CF8EEFF993A8B1 /* MathSupplement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MathSupplement.h; path = ../../Source/Dsp/MathSupplement.h; sourceTree = SOURCE_ROOT; }; - A4E2CAAF556D557B24182414 /* RecordNode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RecordNode.cpp; path = ../../Source/Processors/RecordNode.cpp; sourceTree = SOURCE_ROOT; }; - A4FC82A8339698B6C1AC5F18 /* juce_LookAndFeel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LookAndFeel.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h; sourceTree = SOURCE_ROOT; }; - A512C5B237A77EF6FB8E11A0 /* BinaryData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = SOURCE_ROOT; }; - A540869F28EE158A0A348C28 /* juce_ImageConvolutionKernel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageConvolutionKernel.h; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h; sourceTree = SOURCE_ROOT; }; - A54886FC74BE0DDC74094EF5 /* juce_DragAndDropContainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DragAndDropContainer.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h; sourceTree = SOURCE_ROOT; }; - A5C9A0FBD818AEF57858FB31 /* juce_AffineTransform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AffineTransform.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h; sourceTree = SOURCE_ROOT; }; - A5E8E0CF6DA1AEAEE9D872DE /* juce_StandardHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StandardHeader.h; path = ../../JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h; sourceTree = SOURCE_ROOT; }; - A65F5AD9D0C532EBB3A2067D /* juce_GZIPDecompressorInputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GZIPDecompressorInputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp; sourceTree = SOURCE_ROOT; }; - A6736FBDFBB0B82E22D2B1C0 /* juce_ThreadLocalValue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ThreadLocalValue.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h; sourceTree = SOURCE_ROOT; }; - A6A579E4E4AEA865BC71148C /* juce_core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_core.mm; path = ../../JuceLibraryCode/modules/juce_core/juce_core.mm; sourceTree = SOURCE_ROOT; }; - A708E79EB9EB7CC44030F5D5 /* juce_ColourGradient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ColourGradient.h; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h; sourceTree = SOURCE_ROOT; }; - A764EF4F46F472715B250E41 /* muteon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = muteon.png; path = ../../Resources/Images/Buttons/muteon.png; sourceTree = SOURCE_ROOT; }; - A769611E9CBFC127AF5AFB0D /* juce_Time.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Time.cpp; path = ../../JuceLibraryCode/modules/juce_core/time/juce_Time.cpp; sourceTree = SOURCE_ROOT; }; - A7875D5F8D2A632C99791002 /* juce_ComboBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComboBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h; sourceTree = SOURCE_ROOT; }; - A7D4C9E3ED3763847C087F46 /* SpikeDisplayCanvas.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeDisplayCanvas.cpp; path = ../../Source/Processors/Visualization/SpikeDisplayCanvas.cpp; sourceTree = SOURCE_ROOT; }; - A7FE538FF09AC8A58DE8F1BD /* RadioButtons_selected-02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected-02.png"; path = "../../Resources/Images/Icons/RadioButtons_selected-02.png"; sourceTree = SOURCE_ROOT; }; - A8B4D80D55E48F50809DC5E4 /* juce_ios_Windowing.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_ios_Windowing.mm; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm; sourceTree = SOURCE_ROOT; }; - A93F302B8D91A997F54D231B /* juce_MarkerList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MarkerList.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h; sourceTree = SOURCE_ROOT; }; - A950BD747F318BF6D555CB06 /* juce_mac_Files.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_Files.mm; path = ../../JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm; sourceTree = SOURCE_ROOT; }; - A95D898F0998F4609E992B5F /* Elliptic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Elliptic.h; path = ../../Source/Dsp/Elliptic.h; sourceTree = SOURCE_ROOT; }; - A98A22CF5F208ED6DBE08063 /* ResamplingNode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ResamplingNode.cpp; path = ../../Source/Processors/ResamplingNode.cpp; sourceTree = SOURCE_ROOT; }; - A9A0BC63EB466C75D1B9326A /* juce_MidiMessageCollector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiMessageCollector.h; path = ../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h; sourceTree = SOURCE_ROOT; }; - A9F5A8F835A1A734DF7F6775 /* juce_ChoicePropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChoicePropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; - AA3209223925B66A97AB4509 /* juce_TooltipClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TooltipClient.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h; sourceTree = SOURCE_ROOT; }; - AA3DAC9A4A3FF9E7D279FB23 /* RadioButtons_selected-03.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected-03.png"; path = "../../Resources/Images/Icons/RadioButtons_selected-03.png"; sourceTree = SOURCE_ROOT; }; - AA7F6609B897B9E134377A62 /* cpmono_light.otf */ = {isa = PBXFileReference; lastKnownFileType = file.otf; name = cpmono_light.otf; path = ../../Resources/Fonts/cpmono_light.otf; sourceTree = SOURCE_ROOT; }; - AADBA8C0AD524CE677428AFF /* juce_GlowEffect.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GlowEffect.h; path = ../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h; sourceTree = SOURCE_ROOT; }; - AB4C7059669AC385B02179C1 /* juce_FileLogger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileLogger.h; path = ../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h; sourceTree = SOURCE_ROOT; }; - ABA3FCD5D762336535D56D94 /* juce_ScopedLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScopedLock.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h; sourceTree = SOURCE_ROOT; }; - AC116E6590D49AB2EF19CB9E /* juce_OpenGLImage.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OpenGLImage.cpp; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.cpp; sourceTree = SOURCE_ROOT; }; - AC2CFF4DA5CE431FCC628BA3 /* ChebyshevI.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ChebyshevI.cpp; path = ../../Source/Dsp/ChebyshevI.cpp; sourceTree = SOURCE_ROOT; }; - ACA28D2B1FECD2C57F0250A6 /* juce_DirectoryContentsDisplayComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DirectoryContentsDisplayComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h; sourceTree = SOURCE_ROOT; }; - ACAE4A2D65AAC6A36DA9DBCF /* juce_OggVorbisAudioFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OggVorbisAudioFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp; sourceTree = SOURCE_ROOT; }; - AD1950C0733B3470777BF861 /* juce_BubbleMessageComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BubbleMessageComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h; sourceTree = SOURCE_ROOT; }; - AD7311B9A37893CA0C4BC119 /* juce_ZipFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ZipFile.cpp; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp; sourceTree = SOURCE_ROOT; }; - AD7D35FCD8CF66B6C393A7F7 /* juce_FileBrowserComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileBrowserComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h; sourceTree = SOURCE_ROOT; }; - AD960F561259904BA68DDA73 /* juce_MemoryMappedFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MemoryMappedFile.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h; sourceTree = SOURCE_ROOT; }; - ADCB42E4C5641007A4B78025 /* SpikeObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikeObject.h; path = ../../Source/Processors/Visualization/SpikeObject.h; sourceTree = SOURCE_ROOT; }; - AE1EA04666EAD34D0CA0373D /* juce_opengl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_opengl.h; path = ../../JuceLibraryCode/modules/juce_opengl/juce_opengl.h; sourceTree = SOURCE_ROOT; }; - AE6786E4659DAC92F52E9FA3 /* juce_Toolbar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Toolbar.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.h; sourceTree = SOURCE_ROOT; }; - AE9359DBA841F88EF3DA9700 /* juce_FileSearchPath.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileSearchPath.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h; sourceTree = SOURCE_ROOT; }; - AEC2DABFC0517B4BE0CD704C /* juce_mac_AudioCDReader.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_AudioCDReader.mm; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm; sourceTree = SOURCE_ROOT; }; - AEF53FD0FBBFF5242EDD7032 /* juce_Viewport.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Viewport.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp; sourceTree = SOURCE_ROOT; }; - AF1F3010721A6B29062E4838 /* juce_LowLevelGraphicsContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LowLevelGraphicsContext.h; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h; sourceTree = SOURCE_ROOT; }; - AF3E3AE70160C3392B237316 /* juce_mac_CoreAudio.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_mac_CoreAudio.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp; sourceTree = SOURCE_ROOT; }; - AF8ADA74003E96998A5E4404 /* juce_Typeface.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Typeface.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp; sourceTree = SOURCE_ROOT; }; - AFB684CE06F9256324EE0B4C /* juce_FillType.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FillType.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp; sourceTree = SOURCE_ROOT; }; - AFE835E175F7159E1E7C6CC7 /* juce_CharacterFunctions.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CharacterFunctions.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp; sourceTree = SOURCE_ROOT; }; - B00A9C0BAD3AF9F48E36A38F /* juce_MouseListener.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseListener.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp; sourceTree = SOURCE_ROOT; }; - B021D393D0E2625741512320 /* juce_RenderingHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RenderingHelpers.h; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h; sourceTree = SOURCE_ROOT; }; - B04D87ED6AA4897B6CD3CCF6 /* AudioComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioComponent.cpp; path = ../../Source/Audio/AudioComponent.cpp; sourceTree = SOURCE_ROOT; }; - B081687E52C6A5157CFCCB17 /* cpmono-black-serialized */ = {isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-black-serialized"; path = "../../Resources/Fonts/cpmono-black-serialized"; sourceTree = SOURCE_ROOT; }; - B0A076D9536B6754F34E4606 /* juce_win32_ASIO.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_ASIO.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp; sourceTree = SOURCE_ROOT; }; - B0DCDCB162FDBF972FA5B548 /* juce_mac_MessageManager.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_MessageManager.mm; path = ../../JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm; sourceTree = SOURCE_ROOT; }; - B0E8FAD5AC445F612E3468B9 /* FilterNode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterNode.cpp; path = ../../Source/Processors/FilterNode.cpp; sourceTree = SOURCE_ROOT; }; - B1082A8A306A1947F5B0E5FC /* Splitter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Splitter.h; path = ../../Source/Processors/Utilities/Splitter.h; sourceTree = SOURCE_ROOT; }; - B113BC1061788A9ECB1337C5 /* juce_OpenGLGraphicsContext.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OpenGLGraphicsContext.cpp; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp; sourceTree = SOURCE_ROOT; }; - B11E5B5E4483AF89E6DCBAB3 /* juce_ImageButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp; sourceTree = SOURCE_ROOT; }; - B123E2F4439DAD65196A2A9D /* juce_ProgressBar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ProgressBar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp; sourceTree = SOURCE_ROOT; }; - B13BDA434DEF56BB48B26896 /* miso-serialized */ = {isa = PBXFileReference; lastKnownFileType = file; name = "miso-serialized"; path = "../../Resources/Fonts/miso-serialized"; sourceTree = SOURCE_ROOT; }; - B174EBEF82212C8624300F59 /* juce_AudioPluginFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioPluginFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h; sourceTree = SOURCE_ROOT; }; - B17AA637E5C357FACC38EBB7 /* juce_SHA256.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SHA256.cpp; path = ../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.cpp; sourceTree = SOURCE_ROOT; }; - B1887A7D2E27FF4DD03D16C1 /* DefaultDataSource.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = DefaultDataSource.png; path = ../../Resources/Images/Icons/DefaultDataSource.png; sourceTree = SOURCE_ROOT; }; - B1A8C18C6E4B3572B8B750AD /* juce_MultiTimer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MultiTimer.cpp; path = ../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp; sourceTree = SOURCE_ROOT; }; - B1ECBE9C48227CBDB16E3702 /* juce_ShapeButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ShapeButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp; sourceTree = SOURCE_ROOT; }; - B2017626F9A05C8C0EBE9B7E /* juce_MD5.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MD5.cpp; path = ../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.cpp; sourceTree = SOURCE_ROOT; }; - B20469D88488F0809126CC80 /* juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_audio_processors.mm; path = ../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; - B2241E3C5C9F93389586F357 /* juce_DirectoryIterator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DirectoryIterator.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h; sourceTree = SOURCE_ROOT; }; - B23E6EBB5F99CF7FC72FAC4E /* VisualizerEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = VisualizerEditor.h; path = ../../Source/Processors/Editors/VisualizerEditor.h; sourceTree = SOURCE_ROOT; }; - B24098EC4FD79D5EDC9383EC /* juce_Initialisation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Initialisation.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Initialisation.h; sourceTree = SOURCE_ROOT; }; - B27F558F42AC78F0E564B5AF /* AudioNode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioNode.cpp; path = ../../Source/Processors/AudioNode.cpp; sourceTree = SOURCE_ROOT; }; - B2EF409A1F459E964756BA7C /* juce_FileInputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileInputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp; sourceTree = SOURCE_ROOT; }; - B2FA9CC4754E136F22281176 /* juce_ImageEffectFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageEffectFilter.h; path = ../../JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h; sourceTree = SOURCE_ROOT; }; - B3BAC48D01C49D8727D08097 /* juce_ListBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ListBox.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.cpp; sourceTree = SOURCE_ROOT; }; - B43C27BEC3AB681389FC5FC5 /* juce_RelativeCoordinate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativeCoordinate.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h; sourceTree = SOURCE_ROOT; }; - B47B3368AA1A182B0CA1AB26 /* Butterworth.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Butterworth.cpp; path = ../../Source/Dsp/Butterworth.cpp; sourceTree = SOURCE_ROOT; }; - B4C52FC94D6C680C33ED85C9 /* juce_File.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_File.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_File.cpp; sourceTree = SOURCE_ROOT; }; - B4F0C0B262654C4782B5AC49 /* juce_FileChooserDialogBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileChooserDialogBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h; sourceTree = SOURCE_ROOT; }; - B5ADA0C1BDBFAE2A2F8ECB48 /* juce_EdgeTable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_EdgeTable.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h; sourceTree = SOURCE_ROOT; }; - B5B417E4196236A2CDE7F0CF /* juce_AudioFormatManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioFormatManager.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp; sourceTree = SOURCE_ROOT; }; - B5E8A19FF91BEAD02C63E05B /* juce_LowLevelGraphicsPostScriptRenderer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LowLevelGraphicsPostScriptRenderer.h; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h; sourceTree = SOURCE_ROOT; }; - B5FBD4DBD2CFE0FFF457D7F6 /* juce_ReferenceCountedArray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReferenceCountedArray.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h; sourceTree = SOURCE_ROOT; }; - B60D02B5BF564ABC88841B1F /* juce_TableHeaderComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TableHeaderComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h; sourceTree = SOURCE_ROOT; }; - B64193A23B69D4A88CDEDD0C /* juce_MidiOutput.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiOutput.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp; sourceTree = SOURCE_ROOT; }; - B64893F699A10B03AA4AFF6B /* juce_CharPointer_ASCII.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CharPointer_ASCII.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h; sourceTree = SOURCE_ROOT; }; - B6567CAE2B538E79E7DA814C /* juce_ThreadWithProgressWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ThreadWithProgressWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp; sourceTree = SOURCE_ROOT; }; - B674DCA2C2A6AF6B58AA7820 /* juce_ComponentAnimator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentAnimator.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp; sourceTree = SOURCE_ROOT; }; - B678CFC6B378A58834D2E41F /* juce_LowLevelGraphicsPostScriptRenderer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LowLevelGraphicsPostScriptRenderer.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp; sourceTree = SOURCE_ROOT; }; - B70D836E0756C3D4EE8E20F2 /* SpikeDetector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikeDetector.h; path = ../../Source/Processors/SpikeDetector.h; sourceTree = SOURCE_ROOT; }; - B767A249792EB15A87054409 /* ChebyshevII.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ChebyshevII.cpp; path = ../../Source/Dsp/ChebyshevII.cpp; sourceTree = SOURCE_ROOT; }; - B7BEB7779860FE877E4D1BC8 /* juce_TextDiff.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextDiff.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp; sourceTree = SOURCE_ROOT; }; - B7D848E4F85AE11FDE4D164D /* juce_linux_AudioCDReader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_AudioCDReader.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp; sourceTree = SOURCE_ROOT; }; - B83EBFAE6306941F79044523 /* juce_DirectoryContentsDisplayComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DirectoryContentsDisplayComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp; sourceTree = SOURCE_ROOT; }; - B87864B2D6A2E741D4B426A3 /* juce_mac_Threads.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_Threads.mm; path = ../../JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm; sourceTree = SOURCE_ROOT; }; - B87C1BD13762817BE27DC2F7 /* juce_FillType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FillType.h; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h; sourceTree = SOURCE_ROOT; }; - B8A9063181FEE1920095F824 /* juce_ChangeBroadcaster.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChangeBroadcaster.h; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h; sourceTree = SOURCE_ROOT; }; - B8D19858CC01BB5F7C35ED58 /* juce_XmlDocument.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_XmlDocument.cpp; path = ../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp; sourceTree = SOURCE_ROOT; }; - B917780A75945062761B6945 /* WiFiOutput.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WiFiOutput.h; path = ../../Source/Processors/WiFiOutput.h; sourceTree = SOURCE_ROOT; }; - B93B8666F8AF2E5D2E851B1C /* juce_VSTPluginFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_VSTPluginFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp; sourceTree = SOURCE_ROOT; }; - B9E2607F1605D308CB331FCC /* juce_StringPairArray.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StringPairArray.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp; sourceTree = SOURCE_ROOT; }; - BA03776682290FF1AF4C0106 /* juce_PluginDescription.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PluginDescription.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h; sourceTree = SOURCE_ROOT; }; - BA09F5CDB1C01E0FC153DB8E /* juce_NativeMessageBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NativeMessageBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_NativeMessageBox.h; sourceTree = SOURCE_ROOT; }; - BA2923571505AD47CA1EF878 /* WiFiOutputEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WiFiOutputEditor.h; path = ../../Source/Processors/Editors/WiFiOutputEditor.h; sourceTree = SOURCE_ROOT; }; - BABBEE3876B90C8A57C3074D /* juce_ComponentAnimator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentAnimator.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h; sourceTree = SOURCE_ROOT; }; - BAE93A5EEC37D7B4C793BFA2 /* juce_QuickTimeAudioFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_QuickTimeAudioFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp; sourceTree = SOURCE_ROOT; }; - BB0BB31575E1377F0C560D53 /* juce_RelativeCoordinate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativeCoordinate.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp; sourceTree = SOURCE_ROOT; }; - BB26BA9CFAE8C836251E8EAF /* MainWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainWindow.h; path = ../../Source/MainWindow.h; sourceTree = SOURCE_ROOT; }; - BBC386B5A369262583AD4DDA /* juce_QuickTimeAudioFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_QuickTimeAudioFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h; sourceTree = SOURCE_ROOT; }; - BBD9C2AED6F500D090069007 /* ReferenceNode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ReferenceNode.cpp; path = ../../Source/Processors/ReferenceNode.cpp; sourceTree = SOURCE_ROOT; }; - BBDFB328C3D5FC72A0446E6A /* juce_graphics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_graphics.mm; path = ../../JuceLibraryCode/modules/juce_graphics/juce_graphics.mm; sourceTree = SOURCE_ROOT; }; - BBE1DB78E35135B41537DCB5 /* RecentFilesMenuTemplate.nib */ = {isa = PBXFileReference; lastKnownFileType = file.nib; path = RecentFilesMenuTemplate.nib; sourceTree = SOURCE_ROOT; }; - BBF5345C0570D87C01A73FF9 /* noise_wave.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = noise_wave.png; path = ../../Resources/Images/Icons/noise_wave.png; sourceTree = SOURCE_ROOT; }; - BC06C1E8052799F4696101C3 /* juce_mac_SystemStats.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_SystemStats.mm; path = ../../JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm; sourceTree = SOURCE_ROOT; }; - BC3B7E4E25505D9044BFACC7 /* SpikeDetector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeDetector.cpp; path = ../../Source/Processors/SpikeDetector.cpp; sourceTree = SOURCE_ROOT; }; - BC953E395B22FB1D305E483E /* juce_MACAddress.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MACAddress.h; path = ../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h; sourceTree = SOURCE_ROOT; }; - BCB6A6D5A0C1417D74C29632 /* juce_win32_Files.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Files.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp; sourceTree = SOURCE_ROOT; }; - BCBBF8764A2101CD0E91DB5D /* juce_DropShadower.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DropShadower.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h; sourceTree = SOURCE_ROOT; }; - BD1D02C70CCE095217581A5F /* juce_ios_MessageManager.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_ios_MessageManager.mm; path = ../../JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm; sourceTree = SOURCE_ROOT; }; - BD59A961F87AB628777894DC /* juce_AudioThumbnailCache.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioThumbnailCache.cpp; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp; sourceTree = SOURCE_ROOT; }; - BDFF189EC742274DD2629196 /* juce_RectangleList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RectangleList.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.cpp; sourceTree = SOURCE_ROOT; }; - BE506F381B90833512348968 /* juce_FloatVectorOperations.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FloatVectorOperations.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp; sourceTree = SOURCE_ROOT; }; - BEC4B69320BE492526794DFB /* wifi.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = wifi.png; path = ../../Resources/Images/Icons/wifi.png; sourceTree = SOURCE_ROOT; }; - BF647E1FAE73208AC29C14F7 /* juce_Sampler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Sampler.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp; sourceTree = SOURCE_ROOT; }; - BF8B07C8BC86002C3DC94DEE /* juce_MemoryOutputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MemoryOutputStream.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h; sourceTree = SOURCE_ROOT; }; - BF9B6B0B73FF87595307D858 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_gui_basics/juce_module_info; sourceTree = SOURCE_ROOT; }; - BFF368651E3CEE5A900391A6 /* square_wave.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = square_wave.png; path = ../../Resources/Images/Icons/square_wave.png; sourceTree = SOURCE_ROOT; }; - C055D09224D84121A3EBB29F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - C0A718EA721772EA6B837F39 /* juce_win32_SystemStats.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_SystemStats.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp; sourceTree = SOURCE_ROOT; }; - C0B54E0803BA87C8BC353551 /* juce_video.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_video.h; path = ../../JuceLibraryCode/modules/juce_video/juce_video.h; sourceTree = SOURCE_ROOT; }; - C0C6335FEE0844872FDF4EE2 /* juce_Memory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Memory.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_Memory.h; sourceTree = SOURCE_ROOT; }; - C10DC7C6E887B4EAAB8EDF38 /* juce_ChoicePropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChoicePropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h; sourceTree = SOURCE_ROOT; }; - C1435AB0105CDC29A3124E4F /* juce_CustomTypeface.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CustomTypeface.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp; sourceTree = SOURCE_ROOT; }; - C16065CD5A8054262B81C1A3 /* juce_cryptography.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_cryptography.h; path = ../../JuceLibraryCode/modules/juce_cryptography/juce_cryptography.h; sourceTree = SOURCE_ROOT; }; - C17E85281A455245543930E5 /* juce_mac_NSViewComponentPeer.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_NSViewComponentPeer.mm; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm; sourceTree = SOURCE_ROOT; }; - C195559D311BAB51CFB545BA /* juce_MultiDocumentPanel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MultiDocumentPanel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp; sourceTree = SOURCE_ROOT; }; - C1CB526B75E406851FA918C6 /* State.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = State.cpp; path = ../../Source/Dsp/State.cpp; sourceTree = SOURCE_ROOT; }; - C1E1CCE5796B40E0A45FB021 /* juce_AudioThumbnail.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioThumbnail.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.h; sourceTree = SOURCE_ROOT; }; - C209C7633D01E525231EE894 /* juce_GlyphArrangement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GlyphArrangement.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp; sourceTree = SOURCE_ROOT; }; - C2746A86EC16D3EA9FAC2C1D /* juce_XmlElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_XmlElement.cpp; path = ../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp; sourceTree = SOURCE_ROOT; }; - C29BC68B2721471F32906FEB /* ResamplingNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ResamplingNode.h; path = ../../Source/Processors/ResamplingNode.h; sourceTree = SOURCE_ROOT; }; - C29E664781AA2396C8D59543 /* juce_events.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_events.mm; path = ../../JuceLibraryCode/modules/juce_events/juce_events.mm; sourceTree = SOURCE_ROOT; }; - C2D1409D20E154E43569C725 /* juce_ImagePreviewComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImagePreviewComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp; sourceTree = SOURCE_ROOT; }; - C2F9D279FCC5C4AD56A0C1DF /* juce_Decibels.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Decibels.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h; sourceTree = SOURCE_ROOT; }; - C39772F796D85E8FE98474D5 /* Filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Filter.h; path = ../../Source/Dsp/Filter.h; sourceTree = SOURCE_ROOT; }; - C3BD84D9B090F98DD09F5958 /* Params.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Params.h; path = ../../Source/Dsp/Params.h; sourceTree = SOURCE_ROOT; }; - C41504F388D0B181B003B627 /* juce_RelativePoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativePoint.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h; sourceTree = SOURCE_ROOT; }; - C446923C1950EB5BE5E67F15 /* juce_TargetPlatform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TargetPlatform.h; path = ../../JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h; sourceTree = SOURCE_ROOT; }; - C454DFC77F19AB044372610E /* juce_MarkerList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MarkerList.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp; sourceTree = SOURCE_ROOT; }; - C4B0DF8094C90543A65E03E3 /* Legendre.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Legendre.cpp; path = ../../Source/Dsp/Legendre.cpp; sourceTree = SOURCE_ROOT; }; - C51CD15B311D0AAC08D0B908 /* ImageIcon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ImageIcon.h; path = ../../Source/Processors/Editors/ImageIcon.h; sourceTree = SOURCE_ROOT; }; - C5287F057A6A88BC33D5498A /* juce_DrawableComposite.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableComposite.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp; sourceTree = SOURCE_ROOT; }; - C54760E4888674CF3CF022E6 /* juce_AudioProcessor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioProcessor.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h; sourceTree = SOURCE_ROOT; }; - C5785E58E6F915165729EF16 /* RecordControl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RecordControl.h; path = ../../Source/Processors/Utilities/RecordControl.h; sourceTree = SOURCE_ROOT; }; - C5ABE6BDCA91410BA92A7BD9 /* ResamplingNodeEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ResamplingNodeEditor.cpp; path = ../../Source/Processors/Editors/ResamplingNodeEditor.cpp; sourceTree = SOURCE_ROOT; }; - C5D0E0996D20BEEEDBFD64FA /* juce_ValueTree.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ValueTree.h; path = ../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h; sourceTree = SOURCE_ROOT; }; - C5D9C53AE4AE414244E1E19A /* muteoff.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = muteoff.png; path = ../../Resources/Images/Buttons/muteoff.png; sourceTree = SOURCE_ROOT; }; - C5F9A0F8EB81AC15D9BDD61F /* juce_OpenGLFrameBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGLFrameBuffer.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h; sourceTree = SOURCE_ROOT; }; - C660716FDD337EFB1A7C6C72 /* juce_Path.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Path.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h; sourceTree = SOURCE_ROOT; }; - C679AE9BBB9B1EE3BAB09E11 /* juce_FileBasedDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileBasedDocument.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.h; sourceTree = SOURCE_ROOT; }; - C67AA7952D9EF7E248118B85 /* juce_StringPool.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StringPool.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp; sourceTree = SOURCE_ROOT; }; - C67C5EC0EE8DBC501C8AA395 /* juce_NamedPipe.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NamedPipe.h; path = ../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h; sourceTree = SOURCE_ROOT; }; - C6BDC4DAD5B40321DA67462A /* juce_ApplicationCommandTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationCommandTarget.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h; sourceTree = SOURCE_ROOT; }; - C6E19D3864B40A52BCC49315 /* juce_ModifierKeys.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ModifierKeys.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h; sourceTree = SOURCE_ROOT; }; - C74399C81B1A0552CC52093E /* juce_GenericAudioProcessorEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GenericAudioProcessorEditor.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h; sourceTree = SOURCE_ROOT; }; - C79249376E3FDF10615E16EA /* WiFiOutputEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WiFiOutputEditor.cpp; path = ../../Source/Processors/Editors/WiFiOutputEditor.cpp; sourceTree = SOURCE_ROOT; }; - C7A68BAFB04A7D5FD81FA82B /* juce_PropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h; sourceTree = SOURCE_ROOT; }; - C7A76C0D1B3DC4A1F059E59B /* juce_Label.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Label.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.h; sourceTree = SOURCE_ROOT; }; - C7CA628FE3E1E3D16B24E059 /* juce_android_Threads.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Threads.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp; sourceTree = SOURCE_ROOT; }; - C844D1792A91BE2D8808CB14 /* juce_MessageManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MessageManager.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h; sourceTree = SOURCE_ROOT; }; - C868329EBC1BBA606AB2EB88 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - C916444FD4BFB79D4DE9FCAF /* juce_AttributedString.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AttributedString.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp; sourceTree = SOURCE_ROOT; }; - C98D4FF283E598244E89CD83 /* juce_TextDiff.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextDiff.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h; sourceTree = SOURCE_ROOT; }; - CA09B0483969444C7CD106DC /* juce_mac_Fonts.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_Fonts.mm; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm; sourceTree = SOURCE_ROOT; }; - CAA3B9396EA62166234DAEF1 /* VisualizerEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = VisualizerEditor.cpp; path = ../../Source/Processors/Editors/VisualizerEditor.cpp; sourceTree = SOURCE_ROOT; }; - CB2C4FD47184B2FE84408CAD /* RadioButtons_neutral-03.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_neutral-03.png"; path = "../../Resources/Images/Icons/RadioButtons_neutral-03.png"; sourceTree = SOURCE_ROOT; }; - CC35C78D5B446ABF57DDDAE0 /* juce_ImageFileFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageFileFormat.h; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h; sourceTree = SOURCE_ROOT; }; - CC42C4D4230BE4F1071CB2D3 /* juce_ResizableEdgeComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResizableEdgeComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h; sourceTree = SOURCE_ROOT; }; - CC62E20B1189C697DD238810 /* juce_OpenGL_linux.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGL_linux.h; path = ../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_linux.h; sourceTree = SOURCE_ROOT; }; - CCC20313AD0D0993F9EDD1B3 /* SplitterEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SplitterEditor.h; path = ../../Source/Processors/Editors/SplitterEditor.h; sourceTree = SOURCE_ROOT; }; - CD2370F8F4A44446558A08FB /* Parameter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Parameter.cpp; path = ../../Source/Processors/Parameter.cpp; sourceTree = SOURCE_ROOT; }; - CD2E26CFD0DC7F6090E15A20 /* juce_Line.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Line.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h; sourceTree = SOURCE_ROOT; }; - CD41C1D09F6D73FA33993F45 /* juce_Desktop.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Desktop.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h; sourceTree = SOURCE_ROOT; }; - CD492AC7B458FA6C321B9D0B /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_core/juce_module_info; sourceTree = SOURCE_ROOT; }; - CD7E06ED47B243518F42DA49 /* MergerA-02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "MergerA-02.png"; path = "../../Resources/Images/Buttons/MergerA-02.png"; sourceTree = SOURCE_ROOT; }; - CD83E301AE42E6E3317D575D /* juce_TableHeaderComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TableHeaderComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp; sourceTree = SOURCE_ROOT; }; - CDC18ABAFEF000C720CE8622 /* juce_CallOutBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CallOutBox.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.cpp; sourceTree = SOURCE_ROOT; }; - CE2BD40797A6E7647FDBE736 /* juce_ColourSelector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ColourSelector.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.cpp; sourceTree = SOURCE_ROOT; }; - CF5BC8DB7D66C655DABA9129 /* juce_android_FileChooser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_FileChooser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_android_FileChooser.cpp; sourceTree = SOURCE_ROOT; }; - CF758CB1E06DDA1AB7F5C9CC /* juce_events.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_events.h; path = ../../JuceLibraryCode/modules/juce_events/juce_events.h; sourceTree = SOURCE_ROOT; }; - CFB86C1F2A6076ADC36692AA /* Utilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Utilities.h; path = ../../Source/Dsp/Utilities.h; sourceTree = SOURCE_ROOT; }; - D01254FA41688494C3CB0889 /* silkscreen.ttf */ = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = silkscreen.ttf; path = ../../Resources/Fonts/silkscreen.ttf; sourceTree = SOURCE_ROOT; }; - D0247929128D618A2EB01D86 /* juce_OpenGLHelpers.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OpenGLHelpers.cpp; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp; sourceTree = SOURCE_ROOT; }; - D056D7F6C8EA8A6BBCC5C092 /* juce_InputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InputStream.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h; sourceTree = SOURCE_ROOT; }; - D06A8FDAD8B22537EA594383 /* juce_StretchableLayoutResizerBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StretchableLayoutResizerBar.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h; sourceTree = SOURCE_ROOT; }; - D0B8C88B127EB4378B76B08C /* BaseUIElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BaseUIElement.cpp; path = ../../Source/Processors/Visualization/SpikePlotting/BaseUIElement.cpp; sourceTree = SOURCE_ROOT; }; - D0D7CE266BD7CC5455926700 /* juce_AudioSourcePlayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioSourcePlayer.h; path = ../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h; sourceTree = SOURCE_ROOT; }; - D0E568AD5445AF061317E01D /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_audio_formats/juce_module_info; sourceTree = SOURCE_ROOT; }; - D11BC618E53E6605B3A579E1 /* juce_MemoryBlock.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MemoryBlock.cpp; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp; sourceTree = SOURCE_ROOT; }; - D128F31F18331117287F5EC5 /* ArduinoOutput.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ArduinoOutput.h; path = ../../Source/Processors/ArduinoOutput.h; sourceTree = SOURCE_ROOT; }; - D162391A46FF93093C328F9D /* juce_GZIPCompressorOutputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GZIPCompressorOutputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp; sourceTree = SOURCE_ROOT; }; - D171071934C8F7F925B0D113 /* juce_TableListBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TableListBox.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.cpp; sourceTree = SOURCE_ROOT; }; - D1D8F82F848413581B274A5D /* juce_win32_CameraDevice.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_CameraDevice.cpp; path = ../../JuceLibraryCode/modules/juce_video/native/juce_win32_CameraDevice.cpp; sourceTree = SOURCE_ROOT; }; - D1F9878B45ABC403F3749567 /* juce_FileBasedDocument.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileBasedDocument.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp; sourceTree = SOURCE_ROOT; }; - D22D3958949713747DAF59A3 /* juce_linux_SystemStats.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_SystemStats.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp; sourceTree = SOURCE_ROOT; }; - D2696B30CBEAD7CE72510AFA /* InfoLabel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoLabel.h; path = ../../Source/UI/InfoLabel.h; sourceTree = SOURCE_ROOT; }; - D2A3B4CDD296B4CEC6902FD7 /* UIComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = UIComponent.cpp; path = ../../Source/UI/UIComponent.cpp; sourceTree = SOURCE_ROOT; }; - D2CCDDF54D6D6F2BF4281F2D /* juce_BooleanPropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BooleanPropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; - D30880F1F9F514CEEDB9F48B /* AppConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = SOURCE_ROOT; }; - D357A886F6365DA33D639FF5 /* juce_mac_NSViewComponent.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_NSViewComponent.mm; path = ../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm; sourceTree = SOURCE_ROOT; }; - D38E60AC4854B6E1EDE488EB /* ArduinoOutput.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ArduinoOutput.cpp; path = ../../Source/Processors/ArduinoOutput.cpp; sourceTree = SOURCE_ROOT; }; - D3AE8303545E28D793312F46 /* GenericEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GenericEditor.cpp; path = ../../Source/Processors/Editors/GenericEditor.cpp; sourceTree = SOURCE_ROOT; }; - D41ED9ADBE3B27E185B2E3F3 /* RadioButtons_neutral-05.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_neutral-05.png"; path = "../../Resources/Images/Icons/RadioButtons_neutral-05.png"; sourceTree = SOURCE_ROOT; }; - D48EB74E1B5AAC7846196B01 /* juce_linux_Fonts.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Fonts.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp; sourceTree = SOURCE_ROOT; }; - D4B0BD47094D79AB6382228B /* juce_OpenGLTexture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGLTexture.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLTexture.h; sourceTree = SOURCE_ROOT; }; - D4F94F0232F0CD426DFC44C5 /* juce_PreferencesPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PreferencesPanel.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.h; sourceTree = SOURCE_ROOT; }; - D51315B4241B019BE43EE4F1 /* SplitterEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SplitterEditor.cpp; path = ../../Source/Processors/Editors/SplitterEditor.cpp; sourceTree = SOURCE_ROOT; }; - D51575B9AA7216CCE4B558E4 /* juce_TopLevelWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TopLevelWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.h; sourceTree = SOURCE_ROOT; }; - D55137DE3404D7DF2A1F50D0 /* juce_GIFLoader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GIFLoader.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp; sourceTree = SOURCE_ROOT; }; - D5D6DAA3CFDD395096D2B072 /* juce_ReferenceCountedObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReferenceCountedObject.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h; sourceTree = SOURCE_ROOT; }; - D60F42AEB8551E83215691C3 /* juce_ZipFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ZipFile.h; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h; sourceTree = SOURCE_ROOT; }; - D679982E05B9510FE239D690 /* juce_OutputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OutputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp; sourceTree = SOURCE_ROOT; }; - D685CFEA6344360FBFC355B6 /* DiscRecording.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; }; - D71AD519382D547C958B0175 /* juce_UndoableAction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_UndoableAction.h; path = ../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h; sourceTree = SOURCE_ROOT; }; - D7807913367AD1B1FCBDEFAC /* juce_ApplicationBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ApplicationBase.cpp; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp; sourceTree = SOURCE_ROOT; }; - D7E51310BD1B8EF6A2A77177 /* juce_MenuBarModel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MenuBarModel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp; sourceTree = SOURCE_ROOT; }; - D840E516B1DE9F3F730283D5 /* juce_KeyboardFocusTraverser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyboardFocusTraverser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp; sourceTree = SOURCE_ROOT; }; - D88B0ADDC9BF206E3D2EE9F6 /* juce_RectangleList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RectangleList.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h; sourceTree = SOURCE_ROOT; }; - D8A40F2BFBEC65019C867786 /* juce_Time.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Time.h; path = ../../JuceLibraryCode/modules/juce_core/time/juce_Time.h; sourceTree = SOURCE_ROOT; }; - D8AA3ED11D45FACF74B5FC05 /* RadioButtons_neutral-01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_neutral-01.png"; path = "../../Resources/Images/Icons/RadioButtons_neutral-01.png"; sourceTree = SOURCE_ROOT; }; - D8AFDCC674A7514B7019EEA6 /* juce_DrawableButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h; sourceTree = SOURCE_ROOT; }; - D8D895B3AD895C6E7FD446BF /* Custom.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Custom.cpp; path = ../../Source/Dsp/Custom.cpp; sourceTree = SOURCE_ROOT; }; - D90290A0AA2C36CE757E46D5 /* FilterEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterEditor.cpp; path = ../../Source/Processors/Editors/FilterEditor.cpp; sourceTree = SOURCE_ROOT; }; - D952A208CC8164F0B459EC9E /* juce_linux_WebBrowserComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_WebBrowserComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp; sourceTree = SOURCE_ROOT; }; - D960588B732D973B82500E2D /* juce_AudioProcessorListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioProcessorListener.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h; sourceTree = SOURCE_ROOT; }; - D9C9FCA6D705B72B80DB1142 /* juce_Socket.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Socket.cpp; path = ../../JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp; sourceTree = SOURCE_ROOT; }; - D9CB4CEC2C07346BE69262A0 /* RadioButtons_selected-01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected-01.png"; path = "../../Resources/Images/Icons/RadioButtons_selected-01.png"; sourceTree = SOURCE_ROOT; }; - DA0AE9F4A1DDC3555247216F /* IntanIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = IntanIcon.png; path = ../../Resources/Images/Icons/IntanIcon.png; sourceTree = SOURCE_ROOT; }; - DA30BA6BF482A353393D5926 /* juce_RelativeRectangle.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativeRectangle.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp; sourceTree = SOURCE_ROOT; }; - DA4A6BD7079F2BC73B5035F3 /* OpenGLCanvas.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OpenGLCanvas.h; path = ../../Source/Processors/Visualization/OpenGLCanvas.h; sourceTree = SOURCE_ROOT; }; - DAA04A0FD47097893712B241 /* SpikeDisplayNode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeDisplayNode.cpp; path = ../../Source/Processors/SpikeDisplayNode.cpp; sourceTree = SOURCE_ROOT; }; - DAA4306D30617137463ED247 /* juce_RelativeRectangle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativeRectangle.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h; sourceTree = SOURCE_ROOT; }; - DAC81FECCE54087394BE69F7 /* juce_WaitableEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WaitableEvent.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h; sourceTree = SOURCE_ROOT; }; - DACD0879E139527D971D3AC4 /* juce_FileListComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileListComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h; sourceTree = SOURCE_ROOT; }; - DB4F34DA0F04B40EB6A50FB1 /* juce_SystemStats.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SystemStats.h; path = ../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h; sourceTree = SOURCE_ROOT; }; - DB4FB8EAFA1714529E527C3D /* juce_win32_Messaging.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Messaging.cpp; path = ../../JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp; sourceTree = SOURCE_ROOT; }; - DB4FF7675E5C98CF62DA8A2E /* AccessClass.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AccessClass.h; path = ../../Source/AccessClass.h; sourceTree = SOURCE_ROOT; }; - DB550BAB034060FF4578BB64 /* juce_audio_basics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_audio_basics.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h; sourceTree = SOURCE_ROOT; }; - DB702F259EF24DAB9EC99D0A /* FPGAOutput.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FPGAOutput.h; path = ../../Source/Processors/FPGAOutput.h; sourceTree = SOURCE_ROOT; }; - DB7638B853C81BC53651DCA2 /* PlotUtils.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PlotUtils.cpp; path = ../../Source/Processors/Visualization/SpikePlotting/PlotUtils.cpp; sourceTree = SOURCE_ROOT; }; - DB7866AFC8A4894810DBD05E /* juce_InterProcessLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InterProcessLock.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h; sourceTree = SOURCE_ROOT; }; - DBB769DEBCD6468C13A3CD25 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; - DBB86AD59BA3F6EC09AF2C02 /* LfpDisplayNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LfpDisplayNode.h; path = ../../Source/Processors/LfpDisplayNode.h; sourceTree = SOURCE_ROOT; }; - DBCA7E2FFCFD1354DD19DDD6 /* juce_data_structures.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_data_structures.mm; path = ../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm; sourceTree = SOURCE_ROOT; }; - DBED17FBB262C4DACEEDA9B0 /* juce_MidiKeyboardState.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiKeyboardState.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp; sourceTree = SOURCE_ROOT; }; - DC200873B263C55E82B5384D /* juce_MultiTimer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MultiTimer.h; path = ../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h; sourceTree = SOURCE_ROOT; }; - DD5695DE97CEF7BE76869232 /* juce_FileOutputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileOutputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp; sourceTree = SOURCE_ROOT; }; - DD91BA89F53CB299B8A30B26 /* IntanThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IntanThread.h; path = ../../Source/Processors/DataThreads/IntanThread.h; sourceTree = SOURCE_ROOT; }; - DDE157BB06373ECDBB23469C /* juce_StretchableLayoutManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StretchableLayoutManager.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h; sourceTree = SOURCE_ROOT; }; - DDE89F0D5E01F079323CC89C /* juce_AudioProcessorPlayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioProcessorPlayer.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h; sourceTree = SOURCE_ROOT; }; - DE4861552DB1976665B25DFD /* juce_HighResolutionTimer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_HighResolutionTimer.cpp; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp; sourceTree = SOURCE_ROOT; }; - DEB9A630503639D42056236B /* juce_UndoManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_UndoManager.h; path = ../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h; sourceTree = SOURCE_ROOT; }; - DEE2959DBBC84EA8448A0F77 /* juce_TimeSliceThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TimeSliceThread.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h; sourceTree = SOURCE_ROOT; }; - DEF465116BB906FD116DA5EB /* ofConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ofConstants.h; path = ../../Source/Processors/Serial/ofConstants.h; sourceTree = SOURCE_ROOT; }; - DF3C9A1DD67E879E4E0A2727 /* juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_audio_basics.mm; path = ../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; - DFAA7B563CEFB94D9ADB5D6A /* juce_CPlusPlusCodeTokeniser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CPlusPlusCodeTokeniser.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h; sourceTree = SOURCE_ROOT; }; - DFFB7396DCE9DF1253217584 /* juce_AudioThumbnailCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioThumbnailCache.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h; sourceTree = SOURCE_ROOT; }; - E040EA8B5BB61ABBBD14F12F /* juce_OggVorbisAudioFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OggVorbisAudioFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h; sourceTree = SOURCE_ROOT; }; - E08E877C3A6283CF5C803957 /* MainWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainWindow.cpp; path = ../../Source/MainWindow.cpp; sourceTree = SOURCE_ROOT; }; - E0ADC34D69113B79C2F4FF24 /* juce_CustomTypeface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CustomTypeface.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h; sourceTree = SOURCE_ROOT; }; - E0C264CF6345ABB4CAB98B92 /* juce_ScopedPointer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScopedPointer.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h; sourceTree = SOURCE_ROOT; }; - E20D5F2F75478DA4943CEDBD /* juce_ActionBroadcaster.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionBroadcaster.h; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h; sourceTree = SOURCE_ROOT; }; - E216D095C98F850A5FB6FB0F /* ChannelSelector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ChannelSelector.cpp; path = ../../Source/Processors/Editors/ChannelSelector.cpp; sourceTree = SOURCE_ROOT; }; - E21CA41B44E191F1804F9662 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_data_structures/juce_module_info; sourceTree = SOURCE_ROOT; }; - E23FA5E940A1434B0305875D /* juce_ResizableCornerComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResizableCornerComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h; sourceTree = SOURCE_ROOT; }; - E2F46E110416D628C11392CA /* Parameter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Parameter.h; path = ../../Source/Processors/Parameter.h; sourceTree = SOURCE_ROOT; }; - E31563D2E7DDD8315F369233 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - E33F167E4AA1C44596A1EBED /* juce_mac_CoreGraphicsHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_mac_CoreGraphicsHelpers.h; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h; sourceTree = SOURCE_ROOT; }; - E34E535DA9CBF248E32F7B45 /* juce_ReadWriteLock.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ReadWriteLock.cpp; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp; sourceTree = SOURCE_ROOT; }; - E37140E9E8F7CFDDEEEF6148 /* juce_ToolbarItemFactory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToolbarItemFactory.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h; sourceTree = SOURCE_ROOT; }; - E3C4B6B362320594789E1297 /* juce_PropertySet.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PropertySet.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp; sourceTree = SOURCE_ROOT; }; - E3D9DABE0A9C1DCE6A6515CB /* juce_MixerAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MixerAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - E419C9DA3202B8B6EC2DB723 /* juce_Reverb.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Reverb.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h; sourceTree = SOURCE_ROOT; }; - E42B745B4D2DCADE54F94757 /* EventNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EventNode.h; path = ../../Source/Processors/EventNode.h; sourceTree = SOURCE_ROOT; }; - E44B26F5D97CB483242DE05B /* RBJ.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RBJ.h; path = ../../Source/Dsp/RBJ.h; sourceTree = SOURCE_ROOT; }; - E48A7B152993BCF473725A19 /* juce_CameraDevice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CameraDevice.h; path = ../../JuceLibraryCode/modules/juce_video/capture/juce_CameraDevice.h; sourceTree = SOURCE_ROOT; }; - E4A2E203101AF37C169F1569 /* juce_BufferingAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BufferingAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h; sourceTree = SOURCE_ROOT; }; - E53FEAA3754E6B5D99516D56 /* juce_KnownPluginList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KnownPluginList.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp; sourceTree = SOURCE_ROOT; }; - E58A18793D25A1D75811A052 /* juce_ImagePreviewComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImagePreviewComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h; sourceTree = SOURCE_ROOT; }; - E594A85A291E0625E0410A85 /* LfpDisplayEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LfpDisplayEditor.h; path = ../../Source/Processors/Editors/LfpDisplayEditor.h; sourceTree = SOURCE_ROOT; }; - E5B10AA248D400FDB2645084 /* juce_win32_WASAPI.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_WASAPI.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp; sourceTree = SOURCE_ROOT; }; - E666E60CC07666669FC77C7D /* juce_MemoryOutputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MemoryOutputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp; sourceTree = SOURCE_ROOT; }; - E67C5ACDC8208CDE200EC8C6 /* juce_graphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_graphics.h; path = ../../JuceLibraryCode/modules/juce_graphics/juce_graphics.h; sourceTree = SOURCE_ROOT; }; - E6D3A973D5CEF18CA2BAFF59 /* juce_TextButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp; sourceTree = SOURCE_ROOT; }; - E7366E169158F5A2D1D7B55A /* juce_MidiFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiFile.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h; sourceTree = SOURCE_ROOT; }; - E7460F066237871A704733E7 /* juce_InterprocessConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InterprocessConnection.h; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h; sourceTree = SOURCE_ROOT; }; - E79259F2164D16553A69B458 /* AudioComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioComponent.h; path = ../../Source/Audio/AudioComponent.h; sourceTree = SOURCE_ROOT; }; - E79B7DC03F81DA1F8CDE21CA /* juce_ApplicationCommandManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationCommandManager.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h; sourceTree = SOURCE_ROOT; }; - E7ACE8C1456403A574236451 /* cpmono-bold-serialized */ = {isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-bold-serialized"; path = "../../Resources/Fonts/cpmono-bold-serialized"; sourceTree = SOURCE_ROOT; }; - E7EE416EF527C7506B499070 /* juce_BigInteger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BigInteger.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h; sourceTree = SOURCE_ROOT; }; - E8174B3346AA69361BF73AE1 /* Cascade.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Cascade.h; path = ../../Source/Dsp/Cascade.h; sourceTree = SOURCE_ROOT; }; - E835BEB3C42E4B241804BE13 /* cpmono-light-serialized */ = {isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-light-serialized"; path = "../../Resources/Fonts/cpmono-light-serialized"; sourceTree = SOURCE_ROOT; }; - E8480C4ED7F9579F6172F7B5 /* Common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Common.h; path = ../../Source/Dsp/Common.h; sourceTree = SOURCE_ROOT; }; - E8964C0BE264A55753BC6B7B /* juce_linux_Midi.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Midi.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp; sourceTree = SOURCE_ROOT; }; - E90E364612E6D6EACBE0C063 /* juce_DirectXPluginFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DirectXPluginFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_DirectXPluginFormat.h; sourceTree = SOURCE_ROOT; }; - E90FCB43DA2FF766597DA75E /* Documentation.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Documentation.cpp; path = ../../Source/Dsp/Documentation.cpp; sourceTree = SOURCE_ROOT; }; - E91923510CB2280C3A3B9E9C /* juce_LocalisedStrings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LocalisedStrings.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h; sourceTree = SOURCE_ROOT; }; - E91A272EF06892937CB4B9CE /* juce_ComponentDragger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentDragger.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp; sourceTree = SOURCE_ROOT; }; - E93BE115650B1CB80EACB841 /* EditorViewportButtons.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EditorViewportButtons.h; path = ../../Source/UI/EditorViewportButtons.h; sourceTree = SOURCE_ROOT; }; - E946426F95E0240683CB3337 /* juce_DrawablePath.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawablePath.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h; sourceTree = SOURCE_ROOT; }; - E97684DCE824DEDA6683C6CD /* juce_Synthesiser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Synthesiser.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp; sourceTree = SOURCE_ROOT; }; - EA2FC92CECD1EDA1F07DC59C /* juce_TooltipWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TooltipWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.h; sourceTree = SOURCE_ROOT; }; - EA354D7D8E48D461415D52D8 /* juce_JPEGLoader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_JPEGLoader.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp; sourceTree = SOURCE_ROOT; }; - EA535EA158451360B7B8AE52 /* LfpDisplayNode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpDisplayNode.cpp; path = ../../Source/Processors/LfpDisplayNode.cpp; sourceTree = SOURCE_ROOT; }; - EA73332E3D5AEC04ADDFBB2A /* juce_AudioDataConverters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioDataConverters.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h; sourceTree = SOURCE_ROOT; }; - EA9518CDEA7049C21D5CE2D5 /* juce_Process.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Process.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_Process.h; sourceTree = SOURCE_ROOT; }; - EAB2319C7AA57E06A2247CDF /* juce_BorderSize.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BorderSize.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h; sourceTree = SOURCE_ROOT; }; - EAB637B566FEBBDADA654262 /* juce_VSTMidiEventList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_VSTMidiEventList.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h; sourceTree = SOURCE_ROOT; }; - EAB6A66678B122C578B16445 /* juce_HighResolutionTimer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_HighResolutionTimer.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h; sourceTree = SOURCE_ROOT; }; - EAC262A83CD2BEA14542AE89 /* juce_StringPool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StringPool.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.h; sourceTree = SOURCE_ROOT; }; - EAC7A64301F0BF2C5E33A1F9 /* juce_InterprocessConnectionServer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InterprocessConnectionServer.cpp; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp; sourceTree = SOURCE_ROOT; }; - EAEA49B9394D802B79CA8164 /* juce_StringPairArray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StringPairArray.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h; sourceTree = SOURCE_ROOT; }; - EB5F9A50EB53A57D6AE303C2 /* juce_mac_QuickTimeMovieComponent.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_QuickTimeMovieComponent.mm; path = ../../JuceLibraryCode/modules/juce_video/native/juce_mac_QuickTimeMovieComponent.mm; sourceTree = SOURCE_ROOT; }; - EBD8622EAEF10558809888B7 /* RadioButtons_selected_over-01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-01.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-01.png"; sourceTree = SOURCE_ROOT; }; - EC780F52ABBD7317A5CE2F33 /* ChebyshevI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ChebyshevI.h; path = ../../Source/Dsp/ChebyshevI.h; sourceTree = SOURCE_ROOT; }; - EC95A2CF4B33EA37DA5FC1AC /* nordic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = nordic.ttf; path = ../../Resources/Fonts/nordic.ttf; sourceTree = SOURCE_ROOT; }; - ECA6FDB1366BE7EC30F1539B /* SourceNode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SourceNode.cpp; path = ../../Source/Processors/SourceNode.cpp; sourceTree = SOURCE_ROOT; }; - ECB5A75A81B90327F58CBD9E /* rhd2000datablock.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rhd2000datablock.cpp; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000datablock.cpp"; sourceTree = SOURCE_ROOT; }; - ECBEF88BBC974D96ED781C75 /* juce_posix_SharedCode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_posix_SharedCode.h; path = ../../JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h; sourceTree = SOURCE_ROOT; }; - ECCE033FF2ACE42188FA4A7F /* juce_TemporaryFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TemporaryFile.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h; sourceTree = SOURCE_ROOT; }; - ECE3BE71EB6B9CF1CE869BBE /* juce_BubbleComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BubbleComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h; sourceTree = SOURCE_ROOT; }; - ED86166920362E9D2BE2CB26 /* juce_SVGParser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SVGParser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp; sourceTree = SOURCE_ROOT; }; - ED887A521EEB8F3EBA7DDB31 /* juce_AudioIODeviceType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioIODeviceType.h; path = ../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h; sourceTree = SOURCE_ROOT; }; - EDA209B0E7D124EA581023AD /* juce_AudioFormatManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioFormatManager.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h; sourceTree = SOURCE_ROOT; }; - EDAC82BD742A54182E8DF2FE /* juce_RelativeCoordinatePositioner.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativeCoordinatePositioner.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h; sourceTree = SOURCE_ROOT; }; - EE0336B43A39FD585DF638EE /* juce_ResizableEdgeComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableEdgeComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp; sourceTree = SOURCE_ROOT; }; - EE2C669B127D00C86B1B8CA8 /* juce_win32_Registry.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Registry.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp; sourceTree = SOURCE_ROOT; }; - EE4DD055D31F7D9DC718DBD8 /* juce_ComponentMovementWatcher.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentMovementWatcher.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h; sourceTree = SOURCE_ROOT; }; - EEA51B7EF1CF19028C6672E0 /* juce_DocumentWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DocumentWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp; sourceTree = SOURCE_ROOT; }; - EEFC66D2DF5FD66B4D83B22F /* juce_Component.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Component.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h; sourceTree = SOURCE_ROOT; }; - EF059B26886B32000BCF8CFF /* juce_MouseInputSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MouseInputSource.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h; sourceTree = SOURCE_ROOT; }; - EF3F9AA8D70E1D4D55F13182 /* juce_AudioThumbnail.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioThumbnail.cpp; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp; sourceTree = SOURCE_ROOT; }; - EF4A6E0E1232071252ACCD7B /* juce_RelativeParallelogram.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativeParallelogram.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h; sourceTree = SOURCE_ROOT; }; - EF610B2A17D9B1C0D24DCE67 /* juce_android_JNIHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_android_JNIHelpers.h; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h; sourceTree = SOURCE_ROOT; }; - EF7B66764093D950724EFE70 /* juce_OpenGLShaderProgram.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OpenGLShaderProgram.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h; sourceTree = SOURCE_ROOT; }; - EFC21F3CD0EB87D67E044E06 /* juce_MenuBarComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MenuBarComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h; sourceTree = SOURCE_ROOT; }; - F09FD6D9CA4997216ADBF54F /* DataBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataBuffer.h; path = ../../Source/Processors/DataThreads/DataBuffer.h; sourceTree = SOURCE_ROOT; }; - F0CA3600E09054D7DB3B0067 /* SmoothedFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SmoothedFilter.h; path = ../../Source/Dsp/SmoothedFilter.h; sourceTree = SOURCE_ROOT; }; - F0D9A28C206D7A8BA7089D29 /* juce_KeyMappingEditorComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyMappingEditorComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h; sourceTree = SOURCE_ROOT; }; - F0F3834D46EA8FC8ADB206DB /* juce_AbstractFifo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AbstractFifo.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp; sourceTree = SOURCE_ROOT; }; - F1099BFF0BC1656A23D62E84 /* juce_ScrollBar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ScrollBar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp; sourceTree = SOURCE_ROOT; }; - F10FB240E10A5742CE366A91 /* juce_TabbedButtonBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TabbedButtonBar.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h; sourceTree = SOURCE_ROOT; }; - F17DF27524262A21A3EC932D /* juce_PluginListComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PluginListComponent.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp; sourceTree = SOURCE_ROOT; }; - F1A3975235880CAC1D5757F4 /* juce_MP3AudioFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MP3AudioFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp; sourceTree = SOURCE_ROOT; }; - F1DBAE92084D9D90234AC436 /* juce_AudioSourcePlayer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioSourcePlayer.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp; sourceTree = SOURCE_ROOT; }; - F230A4C0186379F9EB0B0F74 /* ReferenceNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ReferenceNode.h; path = ../../Source/Processors/ReferenceNode.h; sourceTree = SOURCE_ROOT; }; - F28414731D9EE1F75D7B7043 /* juce_AudioFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h; sourceTree = SOURCE_ROOT; }; - F2A500BA3500C4A9D5792A54 /* juce_DrawableImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableImage.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h; sourceTree = SOURCE_ROOT; }; - F2EDB88302B8A9356F43B834 /* juce_Primes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Primes.h; path = ../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h; sourceTree = SOURCE_ROOT; }; - F2F11D7C596DAE5579610CCC /* juce_win32_AudioCDReader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_AudioCDReader.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp; sourceTree = SOURCE_ROOT; }; - F2FDC07162CAEDE524F09CFC /* OpenGLCanvas.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OpenGLCanvas.cpp; path = ../../Source/Processors/Visualization/OpenGLCanvas.cpp; sourceTree = SOURCE_ROOT; }; - F3D0224E4247BCB06A9E4DDF /* juce_KeyPressMappingSet.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyPressMappingSet.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp; sourceTree = SOURCE_ROOT; }; - F3F48717927A4E24F7373C09 /* juce_NamedValueSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NamedValueSet.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h; sourceTree = SOURCE_ROOT; }; - F463A19E6EFEB2837582B117 /* juce_audio_processors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_audio_processors.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h; sourceTree = SOURCE_ROOT; }; - F46843B979D0385C733C797A /* juce_BubbleMessageComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BubbleMessageComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp; sourceTree = SOURCE_ROOT; }; - F4D2A03314AB1CF852CC4F2A /* juce_CPlusPlusCodeTokeniserFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CPlusPlusCodeTokeniserFunctions.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h; sourceTree = SOURCE_ROOT; }; - F5642B98949DC0FA45EF904E /* juce_BufferedInputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BufferedInputStream.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h; sourceTree = SOURCE_ROOT; }; - F5A00ACFA3D76168F22F1205 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - F6EBDA368C553C37BE703BE5 /* juce_Vector3D.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Vector3D.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_Vector3D.h; sourceTree = SOURCE_ROOT; }; - F70B7D65EF56B8A0ED36478C /* juce_WavAudioFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WavAudioFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h; sourceTree = SOURCE_ROOT; }; - F796260525BD82FFC1D1732C /* juce_Uuid.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Uuid.cpp; path = ../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp; sourceTree = SOURCE_ROOT; }; - F7979AFD5780D9B2208736EE /* juce_TooltipWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TooltipWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp; sourceTree = SOURCE_ROOT; }; - F7F374C05CDE0DB7712D18D1 /* juce_Atomic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Atomic.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h; sourceTree = SOURCE_ROOT; }; - F8322ED101601866FFB1698C /* juce_FileOutputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileOutputStream.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h; sourceTree = SOURCE_ROOT; }; - F88A99110564C87FBA281F2C /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_video/juce_module_info; sourceTree = SOURCE_ROOT; }; - F8E202A1374401022F87F26E /* juce_CoreAudioFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CoreAudioFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp; sourceTree = SOURCE_ROOT; }; - F8EFE3709FDDC2D5F0843058 /* juce_Variant.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Variant.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp; sourceTree = SOURCE_ROOT; }; - F94BFC6B5057806EEF8B59DA /* juce_AudioIODevice.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioIODevice.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp; sourceTree = SOURCE_ROOT; }; - F94DD42C7BBF81C101D3F605 /* EventNode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EventNode.cpp; path = ../../Source/Processors/EventNode.cpp; sourceTree = SOURCE_ROOT; }; - F9E2371F1A99B292F2947FF5 /* juce_DragAndDropTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DragAndDropTarget.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h; sourceTree = SOURCE_ROOT; }; - F9F37AD1C3E7CA932FF44E69 /* juce_LagrangeInterpolator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LagrangeInterpolator.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp; sourceTree = SOURCE_ROOT; }; - FA1F1E9C7DEA48CAE6C247F4 /* OpenEphysBoardLogoGray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = OpenEphysBoardLogoGray.png; path = ../../Resources/Images/Icons/OpenEphysBoardLogoGray.png; sourceTree = SOURCE_ROOT; }; - FA23A1334E4CFA77BC18A153 /* FPGAThread.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FPGAThread.cpp; path = ../../Source/Processors/DataThreads/FPGAThread.cpp; sourceTree = SOURCE_ROOT; }; - FA2F04BA4E146ABF649BBE89 /* rhd2000evalboard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rhd2000evalboard.h; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h"; sourceTree = SOURCE_ROOT; }; - FAC7E62CC15CA977A6FC72D1 /* juce_ChangeBroadcaster.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChangeBroadcaster.cpp; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp; sourceTree = SOURCE_ROOT; }; - FB1B880F24F376D1AC52F2A6 /* juce_DrawableButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp; sourceTree = SOURCE_ROOT; }; - FB1EA9CB3C695925627B0AC6 /* juce_HeapBlock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_HeapBlock.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h; sourceTree = SOURCE_ROOT; }; - FB33617B5082CC0CDC189F2C /* juce_KeyboardFocusTraverser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyboardFocusTraverser.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h; sourceTree = SOURCE_ROOT; }; - FB7E91937D3BBE00F64F0B72 /* juce_Colours.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Colours.h; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h; sourceTree = SOURCE_ROOT; }; - FC080F7DF94ABCB7EA09224A /* juce_Colour.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Colour.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp; sourceTree = SOURCE_ROOT; }; - FC85D30C66E7A4E4A6CA29AE /* cpmono_bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file.otf; name = cpmono_bold.otf; path = ../../Resources/Fonts/cpmono_bold.otf; sourceTree = SOURCE_ROOT; }; - FC887C6CD74FE33F8BA784A6 /* MergerEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MergerEditor.h; path = ../../Source/Processors/Editors/MergerEditor.h; sourceTree = SOURCE_ROOT; }; - FD3A6BD3A8898E137DF257B9 /* juce_RelativeParallelogram.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativeParallelogram.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp; sourceTree = SOURCE_ROOT; }; - FD770E73FD462E9C9F6DBFB2 /* juce_PositionableAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PositionableAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h; sourceTree = SOURCE_ROOT; }; - FD88DA941838FC91D222DF35 /* juce_RecentlyOpenedFilesList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RecentlyOpenedFilesList.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h; sourceTree = SOURCE_ROOT; }; - FDAAB4F0D2A15A6F0F71945A /* juce_ResizableWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp; sourceTree = SOURCE_ROOT; }; - FEB3730E084D7DD433D14A6C /* juce_MouseListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MouseListener.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h; sourceTree = SOURCE_ROOT; }; - FEF0A4E3C8D22A830BCE2B67 /* juce_linux_JackAudio.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_JackAudio.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp; sourceTree = SOURCE_ROOT; }; - FF082466FC37DC44320B3B7E /* juce_Draggable3DOrientation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Draggable3DOrientation.h; path = ../../JuceLibraryCode/modules/juce_opengl/opengl/juce_Draggable3DOrientation.h; sourceTree = SOURCE_ROOT; }; - FF1B5858C942CA02EEC38E69 /* juce_ios_Audio.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ios_Audio.cpp; path = ../../JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp; sourceTree = SOURCE_ROOT; }; - FF3E5A9F8B9250790C6DA089 /* juce_URL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_URL.h; path = ../../JuceLibraryCode/modules/juce_core/network/juce_URL.h; sourceTree = SOURCE_ROOT; }; - FF450FAFD49105CE7157DFC0 /* Channel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Channel.h; path = ../../Source/Processors/Channel.h; sourceTree = SOURCE_ROOT; }; - FFBB9CE85A7C91FB11E4AEC8 /* juce_ImageComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp; sourceTree = SOURCE_ROOT; }; - FFFBDB9A00240D797751FEE6 /* DataWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataWindow.h; path = ../../Source/Processors/Visualization/DataWindow.h; sourceTree = SOURCE_ROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 7BE915E5A64C787EBF13A8E7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 0D3DFADD627629AD52668186 /* Accelerate.framework in Frameworks */, - 38568B2E6C61E2F07173B568 /* AudioToolbox.framework in Frameworks */, - C8D7AC0B88A9A2C182B2B752 /* Carbon.framework in Frameworks */, - A94130738A9973148544664A /* Cocoa.framework in Frameworks */, - E5CBEA12D7AD7788C9BF5737 /* CoreAudio.framework in Frameworks */, - 9212DC2AEE118398CC970DDF /* CoreMIDI.framework in Frameworks */, - 3D0C7CA4AD9E3963D52E89BD /* DiscRecording.framework in Frameworks */, - 3130878C465F3294A89CA142 /* IOKit.framework in Frameworks */, - E100912B2FCE36A30D097C95 /* OpenGL.framework in Frameworks */, - CAB9D9DEF279F93132B45F90 /* QTKit.framework in Frameworks */, - CA4DCF67B48352BE633A616D /* QuartzCore.framework in Frameworks */, - FD4865450F4C47FF3C6327FE /* QuickTime.framework in Frameworks */, - 512D7D16D0A95BDD0D6D6E45 /* WebKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 008433D940C09C1A15B916BA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 39F287BE4C0B4F3BD4A949FD /* Accelerate.framework */, - C868329EBC1BBA606AB2EB88 /* AudioToolbox.framework */, - DBB769DEBCD6468C13A3CD25 /* Carbon.framework */, - F5A00ACFA3D76168F22F1205 /* Cocoa.framework */, - 27313EA12BC45638321922CA /* CoreAudio.framework */, - 243817BA562AD7FA76C834C9 /* CoreMIDI.framework */, - D685CFEA6344360FBFC355B6 /* DiscRecording.framework */, - E31563D2E7DDD8315F369233 /* IOKit.framework */, - 9C21DBFB38865E5AFE367C6F /* OpenGL.framework */, - 80C1B737D2C2CB519D1787D7 /* QTKit.framework */, - C055D09224D84121A3EBB29F /* QuartzCore.framework */, - 56169D835A3E3029D6E3904C /* QuickTime.framework */, - 4FD13AA663EEE7CC2F83033D /* WebKit.framework */, - ); - name = Frameworks; - sourceTree = "<group>"; - }; - 048B10371EA2D5C7D883CC70 /* Icons */ = { - isa = PBXGroup; - children = ( - 261B5AA82F2A86CC5500D8D2 /* ArduinoIcon.png */, - 92E3405CB31ACFE3F80BBAD4 /* OpenEphysBoardLogoBlack.png */, - FA1F1E9C7DEA48CAE6C247F4 /* OpenEphysBoardLogoGray.png */, - 9F2BCD132F453B9D9EF09F15 /* RadioButtons-01.png */, - 57941E5B2E1FF6028A68D4A7 /* RadioButtons-02.png */, - 168823A9EBD85BFBFD2CE2EE /* RadioButtons-03.png */, - 7FDFE493862CE27EFCAC3F7F /* RadioButtons-04.png */, - 6D34DD9AB987A67BADE71C65 /* RadioButtons-05.png */, - D8AA3ED11D45FACF74B5FC05 /* RadioButtons_neutral-01.png */, - 3A6FE617A781EEFFD39E1216 /* RadioButtons_neutral-02.png */, - CB2C4FD47184B2FE84408CAD /* RadioButtons_neutral-03.png */, - 93EFC1AA800FC5DA2F04A213 /* RadioButtons_neutral-04.png */, - D41ED9ADBE3B27E185B2E3F3 /* RadioButtons_neutral-05.png */, - D9CB4CEC2C07346BE69262A0 /* RadioButtons_selected-01.png */, - A7FE538FF09AC8A58DE8F1BD /* RadioButtons_selected-02.png */, - AA3DAC9A4A3FF9E7D279FB23 /* RadioButtons_selected-03.png */, - 79BBD2F2F31D76CC4F5BD012 /* RadioButtons_selected-04.png */, - 32CEF6C84CD06B18035B035C /* RadioButtons_selected-05.png */, - EBD8622EAEF10558809888B7 /* RadioButtons_selected_over-01.png */, - 1A22BB28E65B6D6636CCEBF1 /* RadioButtons_selected_over-02.png */, - 1712916024EC787B6C231732 /* RadioButtons_selected_over-03.png */, - 47976F6BE2942EED64AEA4D2 /* RadioButtons_selected_over-04.png */, - 97C4F046D88561EEE245BE99 /* RadioButtons_selected_over-05.png */, - BBF5345C0570D87C01A73FF9 /* noise_wave.png */, - 7C1D87A0C78F661FB459786B /* saw_wave.png */, - 35AEAE0CC0B546625E163B9B /* sine_wave.png */, - BFF368651E3CEE5A900391A6 /* square_wave.png */, - 5C5E4C396CD83C46F58644A2 /* triangle_wave.png */, - BEC4B69320BE492526794DFB /* wifi.png */, - 6F9B89F7AD0E13887871D4FE /* SourceDrop.png */, - B1887A7D2E27FF4DD03D16C1 /* DefaultDataSource.png */, - 8AE2DDA47B2DFDEEEF69B12F /* FileReaderIcon.png */, - DA0AE9F4A1DDC3555247216F /* IntanIcon.png */, - ); - name = Icons; - sourceTree = "<group>"; - }; - 09C2000EFECCE35F3F793E55 /* lookandfeel */ = { - isa = PBXGroup; - children = ( - 5FEFF62D585CF777C950E569 /* juce_LookAndFeel.cpp */, - A4FC82A8339698B6C1AC5F18 /* juce_LookAndFeel.h */, - ); - name = lookandfeel; - sourceTree = "<group>"; - }; - 09F214A405A08FDFC47244A5 /* players */ = { - isa = PBXGroup; - children = ( - 57F66B4A911601169AF195E9 /* juce_AudioProcessorPlayer.cpp */, - DDE89F0D5E01F079323CC89C /* juce_AudioProcessorPlayer.h */, - ); - name = players; - sourceTree = "<group>"; - }; - 0A3CD1724922FB098543C013 /* native */ = { - isa = PBXGroup; - children = ( - 1194EE0956A9645270582979 /* juce_android_Messaging.cpp */, - BD1D02C70CCE095217581A5F /* juce_ios_MessageManager.mm */, - 19A8A8E1BF043B390E02C429 /* juce_linux_Messaging.cpp */, - B0DCDCB162FDBF972FA5B548 /* juce_mac_MessageManager.mm */, - 4B5998D72503BD73D28E828A /* juce_osx_MessageQueue.h */, - 627956A7A1CB15251D02C8C5 /* juce_ScopedXLock.h */, - 6DA8EC2F779DEBB701FE33CA /* juce_win32_HiddenMessageWindow.h */, - DB4FB8EAFA1714529E527C3D /* juce_win32_Messaging.cpp */, - ); - name = native; - sourceTree = "<group>"; - }; - 147EC1A2CF770171DFB61105 /* sampler */ = { - isa = PBXGroup; - children = ( - BF647E1FAE73208AC29C14F7 /* juce_Sampler.cpp */, - 3EE92345839A4E5F608D82AC /* juce_Sampler.h */, - ); - name = sampler; - sourceTree = "<group>"; - }; - 14805A0D1A6C3ED796515AD6 /* format */ = { - isa = PBXGroup; - children = ( - 18C2F9CA38393D106FB834E2 /* juce_AudioPluginFormat.cpp */, - B174EBEF82212C8624300F59 /* juce_AudioPluginFormat.h */, - 0316B49B86725305C70783CA /* juce_AudioPluginFormatManager.cpp */, - 8E61792F6D6FC75CF18095CC /* juce_AudioPluginFormatManager.h */, - ); - name = format; - sourceTree = "<group>"; - }; - 14AA2721588E8A9253FFA98B /* synthesisers */ = { - isa = PBXGroup; - children = ( - E97684DCE824DEDA6683C6CD /* juce_Synthesiser.cpp */, - 74DE857CEFA10BC49FF591DB /* juce_Synthesiser.h */, - ); - name = synthesisers; - sourceTree = "<group>"; - }; - 17BAAA5A77781988BAA8CDEF /* xml */ = { - isa = PBXGroup; - children = ( - B8D19858CC01BB5F7C35ED58 /* juce_XmlDocument.cpp */, - 8F7B13BF318C11900A2277DD /* juce_XmlDocument.h */, - C2746A86EC16D3EA9FAC2C1D /* juce_XmlElement.cpp */, - 83803D96768258DA20710764 /* juce_XmlElement.h */, - ); - name = xml; - sourceTree = "<group>"; - }; - 18CF6DB446071363AB4F1EC4 /* midi */ = { - isa = PBXGroup; - children = ( - 96E99CD031BD069997E387FE /* juce_MidiBuffer.cpp */, - 018F4E079EB12A78C4F8F773 /* juce_MidiBuffer.h */, - 1307DAE32BA702565A67D127 /* juce_MidiFile.cpp */, - E7366E169158F5A2D1D7B55A /* juce_MidiFile.h */, - DBED17FBB262C4DACEEDA9B0 /* juce_MidiKeyboardState.cpp */, - 161E095C716133CB255B6CCD /* juce_MidiKeyboardState.h */, - 8B0C9D288C428BA5D956AE13 /* juce_MidiMessage.cpp */, - 927AE946A1371490D809876E /* juce_MidiMessage.h */, - 560A28C1966B1817873CF764 /* juce_MidiMessageSequence.cpp */, - 82EB2BDE7B9A4D5D945497B9 /* juce_MidiMessageSequence.h */, - ); - name = midi; - sourceTree = "<group>"; - }; - 1BF4F68D4169491DD79D0B01 /* contexts */ = { - isa = PBXGroup; - children = ( - 793A4A777FEFA450F86C78EE /* juce_GraphicsContext.cpp */, - 891B132A0355007B4F37454C /* juce_GraphicsContext.h */, - AF1F3010721A6B29062E4838 /* juce_LowLevelGraphicsContext.h */, - B678CFC6B378A58834D2E41F /* juce_LowLevelGraphicsPostScriptRenderer.cpp */, - B5E8A19FF91BEAD02C63E05B /* juce_LowLevelGraphicsPostScriptRenderer.h */, - 2F8252D3FF527D6559B12615 /* juce_LowLevelGraphicsSoftwareRenderer.cpp */, - 301783FC4E3B19CA3C0AC85B /* juce_LowLevelGraphicsSoftwareRenderer.h */, - ); - name = contexts; - sourceTree = "<group>"; - }; - 1D78FCCF430CD91FD1DBD95B /* UI */ = { - isa = PBXGroup; - children = ( - 9F3B3184EC6D42CEA35D6ED8 /* EditorViewportButtons.cpp */, - E93BE115650B1CB80EACB841 /* EditorViewportButtons.h */, - 0987F7E90136D0E08A606A22 /* SignalChainManager.cpp */, - 48F6281AB92B232E5187D00C /* SignalChainManager.h */, - 7E875E681E18D693D5ADB2FB /* EditorViewport.cpp */, - 57FBA8BC3104D3AF41FBECD8 /* EditorViewport.h */, - 79C91DDF3BC3F15D0338E504 /* ProcessorList.cpp */, - 105B1452DF6CE1D80D69A9D1 /* ProcessorList.h */, - 3774BBCA6CB133D9A854CF71 /* CustomLookAndFeel.cpp */, - 19148DBA36B94FA639DF3A72 /* CustomLookAndFeel.h */, - 17E13CCDA0C82F92EAB05BE6 /* InfoLabel.cpp */, - D2696B30CBEAD7CE72510AFA /* InfoLabel.h */, - 47A3942AC30A3212C01F1CAF /* DataViewport.cpp */, - 7D9374931D760ADC65DCBFC6 /* DataViewport.h */, - 7BD2C39F13FDE202141C4B41 /* MessageCenter.cpp */, - 9B9EDDFA0AE4991BC7FC7263 /* MessageCenter.h */, - 610E487E060C42B52FD5AAC9 /* ControlPanel.cpp */, - 0FE8ACC50ED8E7FFC9E6B9B4 /* ControlPanel.h */, - D2A3B4CDD296B4CEC6902FD7 /* UIComponent.cpp */, - 3FC794735FA8DDA39A62224B /* UIComponent.h */, - ); - name = UI; - sourceTree = "<group>"; - }; - 1DF9A40DB990AEC6AD278C31 /* network */ = { - isa = PBXGroup; - children = ( - 4F31D61C0C2AB3472C6C1429 /* juce_MACAddress.cpp */, - BC953E395B22FB1D305E483E /* juce_MACAddress.h */, - 087FA26464FB283EC6FD4795 /* juce_NamedPipe.cpp */, - C67C5EC0EE8DBC501C8AA395 /* juce_NamedPipe.h */, - D9C9FCA6D705B72B80DB1142 /* juce_Socket.cpp */, - 01D791730840EB0BA7FD61BA /* juce_Socket.h */, - 8F29CAC0059E3697A5A3652F /* juce_URL.cpp */, - FF3E5A9F8B9250790C6DA089 /* juce_URL.h */, - ); - name = network; - sourceTree = "<group>"; - }; - 1E253D48AC292849CD3054CB /* maths */ = { - isa = PBXGroup; - children = ( - 0A8BC957DBEE226346C1EA25 /* juce_BigInteger.cpp */, - E7EE416EF527C7506B499070 /* juce_BigInteger.h */, - 2B19F2DE42A91F56C2380F9A /* juce_Expression.cpp */, - 811C4D165AD7AABF4055059C /* juce_Expression.h */, - 90AD1B6A2293F625D786507A /* juce_MathsFunctions.h */, - 2B134713E91426120A994CB7 /* juce_Random.cpp */, - 90607327D7A1BB3C2C4E9264 /* juce_Random.h */, - 6A559D9595A54EF52BF0773A /* juce_Range.h */, - ); - name = maths; - sourceTree = "<group>"; - }; - 208431C2D4A7C383FD247CE3 /* format_types */ = { - isa = PBXGroup; - children = ( - 03D7B457E0915E43A6AFF4B4 /* juce_AudioUnitPluginFormat.h */, - 8515E367462BEF36233E2447 /* juce_AudioUnitPluginFormat.mm */, - E90E364612E6D6EACBE0C063 /* juce_DirectXPluginFormat.h */, - 93F842958BCE6A9E09862CF7 /* juce_LADSPAPluginFormat.h */, - EAB637B566FEBBDADA654262 /* juce_VSTMidiEventList.h */, - B93B8666F8AF2E5D2E851B1C /* juce_VSTPluginFormat.cpp */, - 6589EAEF497ABA76A295B121 /* juce_VSTPluginFormat.h */, - ); - name = format_types; - sourceTree = "<group>"; - }; - 2097A54F0DC05D433BEB7C81 /* sources */ = { - isa = PBXGroup; - children = ( - F1DBAE92084D9D90234AC436 /* juce_AudioSourcePlayer.cpp */, - D0D7CE266BD7CC5455926700 /* juce_AudioSourcePlayer.h */, - 7CD03E334269D693E1B84856 /* juce_AudioTransportSource.cpp */, - 402BC572EE3E8EC418946CE0 /* juce_AudioTransportSource.h */, - ); - name = sources; - sourceTree = "<group>"; - }; - 21BB3DD364DC0C39CC9594B9 /* processors */ = { - isa = PBXGroup; - children = ( - 5B2CDF3CF10A92F6CA45F3DE /* juce_AudioPlayHead.h */, - 3DA70F9AAA904543B519874B /* juce_AudioPluginInstance.h */, - 06072EC6BCD3B7D8C17C2402 /* juce_AudioProcessor.cpp */, - C54760E4888674CF3CF022E6 /* juce_AudioProcessor.h */, - 803D306CDAC2BD3BA04534EA /* juce_AudioProcessorEditor.cpp */, - 256E22D98B16B09BD521C4A4 /* juce_AudioProcessorEditor.h */, - 7EA46209F07B2C8A83D0873A /* juce_AudioProcessorGraph.cpp */, - 2F9BB379BCFCFE0D88CC0408 /* juce_AudioProcessorGraph.h */, - D960588B732D973B82500E2D /* juce_AudioProcessorListener.h */, - 32A1325430309CF4114C9618 /* juce_GenericAudioProcessorEditor.cpp */, - C74399C81B1A0552CC52093E /* juce_GenericAudioProcessorEditor.h */, - A17E8162EC7A0E513DDEB23C /* juce_PluginDescription.cpp */, - BA03776682290FF1AF4C0106 /* juce_PluginDescription.h */, - ); - name = processors; - sourceTree = "<group>"; - }; - 23BCC80BAA5B674946A538A4 /* menus */ = { - isa = PBXGroup; - children = ( - A19C4BB4BD69D4351B344A17 /* juce_MenuBarComponent.cpp */, - EFC21F3CD0EB87D67E044E06 /* juce_MenuBarComponent.h */, - D7E51310BD1B8EF6A2A77177 /* juce_MenuBarModel.cpp */, - 4B3DBFE485F45E62C53A90B8 /* juce_MenuBarModel.h */, - 0790CCE2FCFDFA6944DFC402 /* juce_PopupMenu.cpp */, - 361E3A46C9BFAD1530593487 /* juce_PopupMenu.h */, - ); - name = menus; - sourceTree = "<group>"; - }; - 2512062DBF7A12B895E6F6D9 /* audio_cd */ = { - isa = PBXGroup; - children = ( - 19043050D1DADAEAB48FB803 /* juce_AudioCDBurner.h */, - 078625CF5C083AD538D23401 /* juce_AudioCDReader.cpp */, - 1463D2DAB3A1D8CEE825056A /* juce_AudioCDReader.h */, - ); - name = audio_cd; - sourceTree = "<group>"; - }; - 259BB14332EF6F524455BF3C /* broadcasters */ = { - isa = PBXGroup; - children = ( - 8CAEF601359DB6CB50E89D1A /* juce_ActionBroadcaster.cpp */, - E20D5F2F75478DA4943CEDBD /* juce_ActionBroadcaster.h */, - 38711221C089A16CC29E93D2 /* juce_ActionListener.h */, - 3A2C762575D9728B1F822ED3 /* juce_AsyncUpdater.cpp */, - 5379FC603780F30A2F05FE78 /* juce_AsyncUpdater.h */, - FAC7E62CC15CA977A6FC72D1 /* juce_ChangeBroadcaster.cpp */, - B8A9063181FEE1920095F824 /* juce_ChangeBroadcaster.h */, - 86E8E44A13F17083ED300BD5 /* juce_ChangeListener.h */, - 0DD0CBF9BBD4A503F2B7868D /* juce_ListenerList.h */, - ); - name = broadcasters; - sourceTree = "<group>"; - }; - 2A882D30C0E50E70FCD95554 /* lookandfeel */ = { - isa = PBXGroup; - children = ( - 76140C0485FDDA98C3D98E2A /* juce_OldSchoolLookAndFeel.cpp */, - 65BE7542749DCCAE33ACF40F /* juce_OldSchoolLookAndFeel.h */, - ); - name = lookandfeel; - sourceTree = "<group>"; - }; - 2A96C9BD7209F57EE8E19BBA /* hashing */ = { - isa = PBXGroup; - children = ( - B2017626F9A05C8C0EBE9B7E /* juce_MD5.cpp */, - 0FA84E49DB493BCC886A355F /* juce_MD5.h */, - B17AA637E5C357FACC38EBB7 /* juce_SHA256.cpp */, - 8C38407151E149A7E2A15801 /* juce_SHA256.h */, - ); - name = hashing; - sourceTree = "<group>"; - }; - 2D49786EE07B37713213F905 /* juce_opengl */ = { - isa = PBXGroup; - children = ( - 57F522311CAC2E8BF761B95A /* opengl */, - 7C6BF9E0D166E4E5C3F2A005 /* native */, - 4540694F9744C9F4D29149CE /* juce_module_info */, - AE1EA04666EAD34D0CA0373D /* juce_opengl.h */, - ); - name = juce_opengl; - sourceTree = "<group>"; - }; - 328279397CFDFC5C31C08F49 /* images */ = { - isa = PBXGroup; - children = ( - 9731D54410B06C1000370316 /* juce_Image.cpp */, - 217032322A2570ABAC47194C /* juce_Image.h */, - 85928E2EF1C438EBC9EB07EA /* juce_ImageCache.cpp */, - 879B0383EF2A8B116903A500 /* juce_ImageCache.h */, - 7F92025F0B8FD4FA725CC70B /* juce_ImageConvolutionKernel.cpp */, - A540869F28EE158A0A348C28 /* juce_ImageConvolutionKernel.h */, - 5AB3809F029824EE2DE0A798 /* juce_ImageFileFormat.cpp */, - CC35C78D5B446ABF57DDDAE0 /* juce_ImageFileFormat.h */, - ); - name = images; - sourceTree = "<group>"; - }; - 328BE41789531FE4F91F7DA1 /* Juce Modules */ = { - isa = PBXGroup; - children = ( - 9311E4762BC3218510204A0F /* juce_audio_basics */, - 83416B76189CFC2030936CCA /* juce_audio_devices */, - E2F864696FA2DDDAD60C7E83 /* juce_audio_formats */, - 95530BD93D8ECFCC072C0850 /* juce_audio_processors */, - 702A741EEADCBB982DDE18B0 /* juce_audio_utils */, - 7333A0F468D3745057EB2368 /* juce_core */, - F196226BFBA15D76688C61C6 /* juce_cryptography */, - A7F7E551BA5A75737261BB4C /* juce_data_structures */, - F61CCB10A356CE4278F74478 /* juce_events */, - 448EFC87A2DEF32F9547F801 /* juce_graphics */, - 83E1A8B708A967FC7D5B9FE4 /* juce_gui_basics */, - E3229181F8CC2BD5E409AF00 /* juce_gui_extra */, - 2D49786EE07B37713213F905 /* juce_opengl */, - AD985677A45CD32AB58EECA5 /* juce_video */, - ); - name = "Juce Modules"; - sourceTree = "<group>"; - }; - 3564F28A16A2BDF3B1D5035E /* Source */ = { - isa = PBXGroup; - children = ( - B43FF50BCF27E5D575CEF309 /* Plugins */, - 420B0E95F1300ABFDC125DBF /* AccessClass.cpp */, - DB4FF7675E5C98CF62DA8A2E /* AccessClass.h */, - B016FBDF648372A23D7EAAD8 /* Network */, - BCD632E634E0F8A50827F9B6 /* Dsp */, - C451728043944D40C69166C1 /* Audio */, - 83A3E005DDFCC55F277EEDA5 /* Processors */, - 1D78FCCF430CD91FD1DBD95B /* UI */, - E08E877C3A6283CF5C803957 /* MainWindow.cpp */, - BB26BA9CFAE8C836251E8EAF /* MainWindow.h */, - 2C89EC72FF6A7118EF459DC3 /* Main.cpp */, - ); - name = Source; - sourceTree = "<group>"; - }; - 3CAB707CFF748C665802E65E /* logging */ = { - isa = PBXGroup; - children = ( - 658D08592154525DA1C40826 /* juce_FileLogger.cpp */, - AB4C7059669AC385B02179C1 /* juce_FileLogger.h */, - 7ECD5DB4BEBC44559D064E08 /* juce_Logger.cpp */, - 0A351ED88CF00C0697701E73 /* juce_Logger.h */, - ); - name = logging; - sourceTree = "<group>"; - }; - 3DA4EA9C737426FDAF1484AD /* windows */ = { - isa = PBXGroup; - children = ( - 7E581214A64A535E03EA759B /* juce_AlertWindow.cpp */, - 71CF8F6995DF1BA2038C21D6 /* juce_AlertWindow.h */, - CDC18ABAFEF000C720CE8622 /* juce_CallOutBox.cpp */, - 927FCF11005E78D499DAF197 /* juce_CallOutBox.h */, - 78BA978C614603B5E9ECFFF1 /* juce_ComponentPeer.cpp */, - 483ABD5C1CF789943AB4AFB6 /* juce_ComponentPeer.h */, - 2D577016FEEE23DD5703C924 /* juce_DialogWindow.cpp */, - 9B4EA34E8F90B7CC77694B7E /* juce_DialogWindow.h */, - EEA51B7EF1CF19028C6672E0 /* juce_DocumentWindow.cpp */, - 581287A24510A9EACEE09CE4 /* juce_DocumentWindow.h */, - BA09F5CDB1C01E0FC153DB8E /* juce_NativeMessageBox.h */, - FDAAB4F0D2A15A6F0F71945A /* juce_ResizableWindow.cpp */, - 13D9868B08E941F6827E157C /* juce_ResizableWindow.h */, - B6567CAE2B538E79E7DA814C /* juce_ThreadWithProgressWindow.cpp */, - 027C1143CC66EA8F73C39A74 /* juce_ThreadWithProgressWindow.h */, - F7979AFD5780D9B2208736EE /* juce_TooltipWindow.cpp */, - EA2FC92CECD1EDA1F07DC59C /* juce_TooltipWindow.h */, - 55811E331B55E0547326CF22 /* juce_TopLevelWindow.cpp */, - D51575B9AA7216CCE4B558E4 /* juce_TopLevelWindow.h */, - ); - name = windows; - sourceTree = "<group>"; - }; - 3DE49DED45C5CDD8D184E248 /* Serial */ = { - isa = PBXGroup; - children = ( - 3753B3B311AE0A9F4CC5AD40 /* ofArduino.cpp */, - 758BC480F153DEA79304366B /* ofArduino.h */, - DEF465116BB906FD116DA5EB /* ofConstants.h */, - 308F614D30DCB9AE3767C928 /* ofSerial.cpp */, - 92CB21BEE17D1DD03106AD87 /* ofSerial.h */, - ); - name = Serial; - sourceTree = "<group>"; - }; - 42DE5996B56B332A5B6C636D /* undomanager */ = { - isa = PBXGroup; - children = ( - D71AD519382D547C958B0175 /* juce_UndoableAction.h */, - 11D619EEF63C1827EA91F593 /* juce_UndoManager.cpp */, - DEB9A630503639D42056236B /* juce_UndoManager.h */, - ); - name = undomanager; - sourceTree = "<group>"; - }; - 42F1804D0EC2EB60625F783F /* midi_io */ = { - isa = PBXGroup; - children = ( - 26FF78F12CCB8725C0DAF9C2 /* juce_MidiInput.h */, - 988F01B2B51B2AC7293D07DA /* juce_MidiMessageCollector.cpp */, - A9A0BC63EB466C75D1B9326A /* juce_MidiMessageCollector.h */, - B64193A23B69D4A88CDEDD0C /* juce_MidiOutput.cpp */, - 0242AB5BCD8C002DC2E30BAC /* juce_MidiOutput.h */, - ); - name = midi_io; - sourceTree = "<group>"; - }; - 444DE4CB4BD092CB31057DFC /* buttons */ = { - isa = PBXGroup; - children = ( - 5FEBF3F722DB6191BF659816 /* juce_ArrowButton.cpp */, - 08DAD5894A480950C66F5873 /* juce_ArrowButton.h */, - 7CF939BD59D45EB41B5FE628 /* juce_Button.cpp */, - 390856DF83DAC70909D5B397 /* juce_Button.h */, - FB1B880F24F376D1AC52F2A6 /* juce_DrawableButton.cpp */, - D8AFDCC674A7514B7019EEA6 /* juce_DrawableButton.h */, - 7387114E34496F4606550863 /* juce_HyperlinkButton.cpp */, - 80A612858FA1177A262744C6 /* juce_HyperlinkButton.h */, - B11E5B5E4483AF89E6DCBAB3 /* juce_ImageButton.cpp */, - 393801D2B91773D376D874B0 /* juce_ImageButton.h */, - B1ECBE9C48227CBDB16E3702 /* juce_ShapeButton.cpp */, - 44E04E5F584A8BFAD062A09D /* juce_ShapeButton.h */, - E6D3A973D5CEF18CA2BAFF59 /* juce_TextButton.cpp */, - 83950E9D0D7C100B7DCA0E55 /* juce_TextButton.h */, - 31BE5E435604D33173940048 /* juce_ToggleButton.cpp */, - 92EC6BB8A8C4C5A61F43C233 /* juce_ToggleButton.h */, - 9C4342320D2DD65E2BD6351C /* juce_ToolbarButton.cpp */, - 98C81B13A0C34D8A4E93ADD1 /* juce_ToolbarButton.h */, - ); - name = buttons; - sourceTree = "<group>"; - }; - 448EFC87A2DEF32F9547F801 /* juce_graphics */ = { - isa = PBXGroup; - children = ( - D3C338AADE455AEA6C248E21 /* colour */, - 1BF4F68D4169491DD79D0B01 /* contexts */, - 328279397CFDFC5C31C08F49 /* images */, - 7E444D9FB4474A6546E9B779 /* image_formats */, - 91DA3CD69EAB03C727AA39C8 /* geometry */, - 89F126369D1761C7A09E35C3 /* placement */, - 6837ABCAE2AD67F0AD5F9AE3 /* fonts */, - D6EA061B97C039BF4BAAB444 /* effects */, - E30221BFC59C887A6337E8C8 /* native */, - 25433DB6D2EAEBB307EFB960 /* juce_module_info */, - E67C5ACDC8208CDE200EC8C6 /* juce_graphics.h */, - ); - name = juce_graphics; - sourceTree = "<group>"; - }; - 45BA9E76F27503E30F331299 /* commands */ = { - isa = PBXGroup; - children = ( - 167524110873F9888CF1B9E8 /* juce_ApplicationCommandID.h */, - 0DBB88B6BEC06FCECE4CBD28 /* juce_ApplicationCommandInfo.cpp */, - 0B2502A656E77E00AF15A343 /* juce_ApplicationCommandInfo.h */, - 70BF68C222D1E0A0368EB845 /* juce_ApplicationCommandManager.cpp */, - E79B7DC03F81DA1F8CDE21CA /* juce_ApplicationCommandManager.h */, - 4B74A7F0FDCE3E1706E5B320 /* juce_ApplicationCommandTarget.cpp */, - C6BDC4DAD5B40321DA67462A /* juce_ApplicationCommandTarget.h */, - F3D0224E4247BCB06A9E4DDF /* juce_KeyPressMappingSet.cpp */, - 1CFA355CD6811C253C72BDDA /* juce_KeyPressMappingSet.h */, - ); - name = commands; - sourceTree = "<group>"; - }; - 469F0AB7234589951A8F29FA /* Resources */ = { - isa = PBXGroup; - children = ( - 46EF49B14DF7357A8287D9D8 /* Info.plist */, - BBE1DB78E35135B41537DCB5 /* RecentFilesMenuTemplate.nib */, - 61317B5191E05925F232E18C /* unibody-8.otf */, - ); - name = Resources; - sourceTree = "<group>"; - }; - 4C669ADBEAE5CF82CBABD50D /* SpikePlotting */ = { - isa = PBXGroup; - children = ( - 61AD209597F427C4EA8E4F62 /* SpikePlot.cpp */, - 40F5B73C1A044670FA28DC89 /* SpikePlot.h */, - D0B8C88B127EB4378B76B08C /* BaseUIElement.cpp */, - 064393C83AD2AFB2EEF1A920 /* BaseUIElement.h */, - 4B03E89A306A88F7FE43B831 /* GenericAxes.cpp */, - 60C73954D517E868937D98D7 /* GenericAxes.h */, - DB7638B853C81BC53651DCA2 /* PlotUtils.cpp */, - 63D8339BD02403BA38BA0E31 /* PlotUtils.h */, - 3E55A43D066A2B892DBCA640 /* ProjectionAxes.cpp */, - 820BB485C2DEA7F63723CC03 /* ProjectionAxes.h */, - 020F745606F9516D8D246E04 /* SimpleKeyEvent.h */, - 036A7626AA8B2E3ABC4D926B /* WaveAxes.cpp */, - 56D29967F43612F663727FAF /* WaveAxes.h */, - ); - name = SpikePlotting; - sourceTree = "<group>"; - }; - 4CA0453E4C12495F1018A4E1 /* filebrowser */ = { - isa = PBXGroup; - children = ( - B83EBFAE6306941F79044523 /* juce_DirectoryContentsDisplayComponent.cpp */, - ACA28D2B1FECD2C57F0250A6 /* juce_DirectoryContentsDisplayComponent.h */, - 6A63308EBE68478531604BA4 /* juce_DirectoryContentsList.cpp */, - 7BE7EBBCC4DCF760A1AA697E /* juce_DirectoryContentsList.h */, - 353937A4E68C8C6916C6D1F9 /* juce_FileBrowserComponent.cpp */, - AD7D35FCD8CF66B6C393A7F7 /* juce_FileBrowserComponent.h */, - 9C864C7DBAF37CD0719996A9 /* juce_FileBrowserListener.h */, - 3EAF57CE45DBACE2F88DA4C5 /* juce_FileChooser.cpp */, - 945DC754F2EACDFFB7926DE8 /* juce_FileChooser.h */, - 033AE5DE19F0EEDC47D41C80 /* juce_FileChooserDialogBox.cpp */, - B4F0C0B262654C4782B5AC49 /* juce_FileChooserDialogBox.h */, - 284F3E94F0C96EA1DD89E606 /* juce_FileFilter.cpp */, - 65A447DCF8A68BAABC20FC7D /* juce_FileFilter.h */, - 85C3F7CDF87409A56082DF67 /* juce_FileListComponent.cpp */, - DACD0879E139527D971D3AC4 /* juce_FileListComponent.h */, - 52A8F84DCDDF0186B511B9CD /* juce_FilenameComponent.cpp */, - 499A12199A8A8C5AEDAA47E4 /* juce_FilenameComponent.h */, - 1C474C73937D98E9D3FFEEC0 /* juce_FilePreviewComponent.h */, - 6BA7D7A7E3E2E646E50D334A /* juce_FileSearchPathListComponent.cpp */, - 786A97B2B4E2BB6406546647 /* juce_FileSearchPathListComponent.h */, - 696F2DC49934E6F01A2DF9FE /* juce_FileTreeComponent.cpp */, - 405298E6CE1C80EC7CC43A87 /* juce_FileTreeComponent.h */, - C2D1409D20E154E43569C725 /* juce_ImagePreviewComponent.cpp */, - E58A18793D25A1D75811A052 /* juce_ImagePreviewComponent.h */, - 881237D5E366342B117C0ED7 /* juce_WildcardFileFilter.cpp */, - 316FB94579DA666A388F429A /* juce_WildcardFileFilter.h */, - ); - name = filebrowser; - sourceTree = "<group>"; - }; - 4DD214F6A346B4C4F28B3C5A /* embedding */ = { - isa = PBXGroup; - children = ( - 901C720965646841A94EB099 /* juce_ActiveXControlComponent.h */, - 32D568631762765C07D4BF0D /* juce_NSViewComponent.h */, - 0E4B0B8425DBA19B6F3FE4BF /* juce_UIViewComponent.h */, - ); - name = embedding; - sourceTree = "<group>"; - }; - 4E3C60995CC567F1A839CAE3 /* Utilities */ = { - isa = PBXGroup; - children = ( - 258938780F93A7CF41366F26 /* RecordControl.cpp */, - C5785E58E6F915165729EF16 /* RecordControl.h */, - 4867923F31CC3EDC9B1A5BE5 /* Merger.cpp */, - 6880C148A38A5C8D0092E358 /* Merger.h */, - 2C4730CAFED4F6292B575318 /* Splitter.cpp */, - B1082A8A306A1947F5B0E5FC /* Splitter.h */, - ); - name = Utilities; - sourceTree = "<group>"; - }; - 530413F49A2E29570D8A9761 /* timers */ = { - isa = PBXGroup; - children = ( - B1A8C18C6E4B3572B8B750AD /* juce_MultiTimer.cpp */, - DC200873B263C55E82B5384D /* juce_MultiTimer.h */, - 0A46EF94E558D5E19F96E646 /* juce_Timer.cpp */, - 7EBEBC6DBA8DCA5A5D8C72E1 /* juce_Timer.h */, - ); - name = timers; - sourceTree = "<group>"; - }; - 553F5880E9CFE9C4A045C0C0 /* effects */ = { - isa = PBXGroup; - children = ( - C2F9D279FCC5C4AD56A0C1DF /* juce_Decibels.h */, - 3BEB59C6E8F833331C0783D5 /* juce_IIRFilter.cpp */, - 63F4150ABBA43B2215230034 /* juce_IIRFilter.h */, - F9F37AD1C3E7CA932FF44E69 /* juce_LagrangeInterpolator.cpp */, - 65751E743D5EFD4066E50746 /* juce_LagrangeInterpolator.h */, - E419C9DA3202B8B6EC2DB723 /* juce_Reverb.h */, - ); - name = effects; - sourceTree = "<group>"; - }; - 572BB2781CE421A968F9D023 /* native */ = { - isa = PBXGroup; - children = ( - 8882F8EBE55F52FA8E519249 /* juce_android_Files.cpp */, - EF610B2A17D9B1C0D24DCE67 /* juce_android_JNIHelpers.h */, - 9B5D838CB6224E82C9B36AA3 /* juce_android_Misc.cpp */, - 982E1A954C316920557F029C /* juce_android_Network.cpp */, - 23F048594D4C9AD8C3399877 /* juce_android_SystemStats.cpp */, - C7CA628FE3E1E3D16B24E059 /* juce_android_Threads.cpp */, - 60B1BDA3E9E14F9515963082 /* juce_BasicNativeHeaders.h */, - 3FB80C5CFD953986778DCBA2 /* juce_linux_Files.cpp */, - 5F6DCA68A982E930389644FD /* juce_linux_Network.cpp */, - D22D3958949713747DAF59A3 /* juce_linux_SystemStats.cpp */, - 4D67518E9223C1C19BD4EF2E /* juce_linux_Threads.cpp */, - A950BD747F318BF6D555CB06 /* juce_mac_Files.mm */, - 63AF6BE7FE2A9E7882743B4F /* juce_mac_Network.mm */, - 28847C807E6B05303FB8FB34 /* juce_mac_Strings.mm */, - BC06C1E8052799F4696101C3 /* juce_mac_SystemStats.mm */, - B87864B2D6A2E741D4B426A3 /* juce_mac_Threads.mm */, - 8F08D5488CE147D693BA21E2 /* juce_osx_ObjCHelpers.h */, - 28D5AEEEFC4FA8877419C829 /* juce_posix_NamedPipe.cpp */, - ECBEF88BBC974D96ED781C75 /* juce_posix_SharedCode.h */, - 86F4AAFCE3FEB34E325F3020 /* juce_win32_ComSmartPtr.h */, - BCB6A6D5A0C1417D74C29632 /* juce_win32_Files.cpp */, - 698B0EC670DA47934444381B /* juce_win32_Network.cpp */, - EE2C669B127D00C86B1B8CA8 /* juce_win32_Registry.cpp */, - C0A718EA721772EA6B837F39 /* juce_win32_SystemStats.cpp */, - 77B3E84324445076F1F907E9 /* juce_win32_Threads.cpp */, - ); - name = native; - sourceTree = "<group>"; - }; - 57F522311CAC2E8BF761B95A /* opengl */ = { - isa = PBXGroup; - children = ( - FF082466FC37DC44320B3B7E /* juce_Draggable3DOrientation.h */, - 05DCAE8CA29532E2169D7AC1 /* juce_Matrix3D.h */, - 4CF403118BBAAD5B6763542A /* juce_OpenGLContext.cpp */, - A3B6D091280930A016DF8FDA /* juce_OpenGLContext.h */, - 146C6A6E3C6B17F2AF475B50 /* juce_OpenGLFrameBuffer.cpp */, - C5F9A0F8EB81AC15D9BDD61F /* juce_OpenGLFrameBuffer.h */, - B113BC1061788A9ECB1337C5 /* juce_OpenGLGraphicsContext.cpp */, - A41AEA0D3ACB2B1E6713AE08 /* juce_OpenGLGraphicsContext.h */, - D0247929128D618A2EB01D86 /* juce_OpenGLHelpers.cpp */, - 4C4E2282C145D13C86CB23FA /* juce_OpenGLHelpers.h */, - AC116E6590D49AB2EF19CB9E /* juce_OpenGLImage.cpp */, - 9F2853D1A12B686BE3BA2C61 /* juce_OpenGLImage.h */, - 29381F22B8FDF48C3EAC3A9F /* juce_OpenGLPixelFormat.cpp */, - 455FFBB0C34B760D892D2D57 /* juce_OpenGLPixelFormat.h */, - 5D9792840E8050DCC766B368 /* juce_OpenGLRenderer.h */, - 61B0CBF705D5FC0431776286 /* juce_OpenGLShaderProgram.cpp */, - EF7B66764093D950724EFE70 /* juce_OpenGLShaderProgram.h */, - 971E49A78543AADB8CA1D2B7 /* juce_OpenGLTexture.cpp */, - D4B0BD47094D79AB6382228B /* juce_OpenGLTexture.h */, - 12B5243A9435FABAFBE20165 /* juce_Quaternion.h */, - F6EBDA368C553C37BE703BE5 /* juce_Vector3D.h */, - ); - name = opengl; - sourceTree = "<group>"; - }; - 5B916D6239703986EFCDB624 /* Buttons */ = { - isa = PBXGroup; - children = ( - C5D9C53AE4AE414244E1E19A /* muteoff.png */, - A764EF4F46F472715B250E41 /* muteon.png */, - 05C35036E964AAD6024E0766 /* MergerA-01.png */, - CD7E06ED47B243518F42DA49 /* MergerA-02.png */, - 4F4E8E3B32DB7A91B41C9FFA /* MergerB-01.png */, - 3FFC2A3429D8B1D957D18CA7 /* MergerB-02.png */, - A3CAB6B56641ED68D9784348 /* PipelineA-01.png */, - 6B7252D3F574AE21BE464327 /* PipelineA-02.png */, - 381F5DC605AE69088004DF80 /* PipelineB-01.png */, - 5EA661C13CB7197A45F20028 /* PipelineB-02.png */, - ); - name = Buttons; - sourceTree = "<group>"; - }; - 6101DBF4D993FE2CB50D4F90 /* drawables */ = { - isa = PBXGroup; - children = ( - 13212C01A5E138553FAFBE9C /* juce_Drawable.cpp */, - 9D13E0F774807670270F4790 /* juce_Drawable.h */, - C5287F057A6A88BC33D5498A /* juce_DrawableComposite.cpp */, - 766923F74E30FF5D6B12E7CE /* juce_DrawableComposite.h */, - 9EAAE3C0BFF3D753C375A5FC /* juce_DrawableImage.cpp */, - F2A500BA3500C4A9D5792A54 /* juce_DrawableImage.h */, - 25F7BEADC001FA3D1EA9B32C /* juce_DrawablePath.cpp */, - E946426F95E0240683CB3337 /* juce_DrawablePath.h */, - 911CCC0A579792DC56807DEC /* juce_DrawableRectangle.cpp */, - 617F5DFAAE97F48FA996A781 /* juce_DrawableRectangle.h */, - 4434939E139A45962C8CFB4C /* juce_DrawableShape.cpp */, - 496180D5D96088CBB59035B1 /* juce_DrawableShape.h */, - 08A7A7FD7D77C0657270E9BF /* juce_DrawableText.cpp */, - 700597338DEC9AB65C4C8A5E /* juce_DrawableText.h */, - ED86166920362E9D2BE2CB26 /* juce_SVGParser.cpp */, - ); - name = drawables; - sourceTree = "<group>"; - }; - 62693BDBB3A4F98A8A8B45F6 /* gui */ = { - isa = PBXGroup; - children = ( - 67BB47E709B643D4C01AB34C /* juce_AudioDeviceSelectorComponent.cpp */, - 45A66E543B62A2C32AB3BA23 /* juce_AudioDeviceSelectorComponent.h */, - EF3F9AA8D70E1D4D55F13182 /* juce_AudioThumbnail.cpp */, - C1E1CCE5796B40E0A45FB021 /* juce_AudioThumbnail.h */, - 482A60A44EE6CB84FCB9DC88 /* juce_AudioThumbnailBase.h */, - BD59A961F87AB628777894DC /* juce_AudioThumbnailCache.cpp */, - DFFB7396DCE9DF1253217584 /* juce_AudioThumbnailCache.h */, - 7C71195623459A6C2524D418 /* juce_MidiKeyboardComponent.cpp */, - 784233150B26826701C09103 /* juce_MidiKeyboardComponent.h */, - ); - name = gui; - sourceTree = "<group>"; - }; - 6415B8D280F206E770758A6A /* streams */ = { - isa = PBXGroup; - children = ( - 9B178E9015CF469CFD41BC79 /* juce_BufferedInputStream.cpp */, - F5642B98949DC0FA45EF904E /* juce_BufferedInputStream.h */, - 32976762B1DB850DB65B9504 /* juce_FileInputSource.cpp */, - 27548017AB2ABAF17E1D5DF5 /* juce_FileInputSource.h */, - 09160DF53438B400BFE85E07 /* juce_InputSource.h */, - 7555A13E69B99B1B6C7295FD /* juce_InputStream.cpp */, - D056D7F6C8EA8A6BBCC5C092 /* juce_InputStream.h */, - 66FE597910F6A68CBB6FA055 /* juce_MemoryInputStream.cpp */, - 8C077447B0DFC739C7D2E437 /* juce_MemoryInputStream.h */, - E666E60CC07666669FC77C7D /* juce_MemoryOutputStream.cpp */, - BF8B07C8BC86002C3DC94DEE /* juce_MemoryOutputStream.h */, - D679982E05B9510FE239D690 /* juce_OutputStream.cpp */, - 0B5B63E563EFA7E816DE3DCA /* juce_OutputStream.h */, - 0CCB1C4D687001E04DE1DD9C /* juce_SubregionStream.cpp */, - 4978EF4C5F506F3289BC0D99 /* juce_SubregionStream.h */, - ); - name = streams; - sourceTree = "<group>"; - }; - 6783EE5E12C56ECE3D7FD1E2 /* app_properties */ = { - isa = PBXGroup; - children = ( - 31A3925602D128195100B74D /* juce_ApplicationProperties.cpp */, - 5B6B25AA065FB6CDE7D6C507 /* juce_ApplicationProperties.h */, - 1CCC1D4213B17ABF6222EC82 /* juce_PropertiesFile.cpp */, - 2AE12F85965B8BE4A0E12F67 /* juce_PropertiesFile.h */, - ); - name = app_properties; - sourceTree = "<group>"; - }; - 6837ABCAE2AD67F0AD5F9AE3 /* fonts */ = { - isa = PBXGroup; - children = ( - C916444FD4BFB79D4DE9FCAF /* juce_AttributedString.cpp */, - 1AEEC114AFAB6E81205FBCD1 /* juce_AttributedString.h */, - C1435AB0105CDC29A3124E4F /* juce_CustomTypeface.cpp */, - E0ADC34D69113B79C2F4FF24 /* juce_CustomTypeface.h */, - 8822ADC9DB83FAF39B841E31 /* juce_Font.cpp */, - 1777330D3BDAE99A93F98943 /* juce_Font.h */, - C209C7633D01E525231EE894 /* juce_GlyphArrangement.cpp */, - 14DD0220B41F74C01A9DC676 /* juce_GlyphArrangement.h */, - 4650B5724FE3C0608FB07A04 /* juce_TextLayout.cpp */, - 8077C8D1C544F458947D693E /* juce_TextLayout.h */, - AF8ADA74003E96998A5E4404 /* juce_Typeface.cpp */, - 9F845E950F19FEC4E6C88F91 /* juce_Typeface.h */, - ); - name = fonts; - sourceTree = "<group>"; - }; - 689A94018921FED3F037B194 /* messages */ = { - isa = PBXGroup; - children = ( - D7807913367AD1B1FCBDEFAC /* juce_ApplicationBase.cpp */, - 9EC1C0A21FDCB81BE0EA60EA /* juce_ApplicationBase.h */, - 6CA98F8581CEAE2DC9AEBCE9 /* juce_CallbackMessage.h */, - 7F49EA0CD3379397520AA6F1 /* juce_DeletedAtShutdown.cpp */, - 996E4EA6B532E4E436F50243 /* juce_DeletedAtShutdown.h */, - 7EBB3F8185EB597DEF77534D /* juce_Message.h */, - 5A7D81B70480B40EEBC2FF54 /* juce_MessageListener.cpp */, - 2924B990E35D3B51AA245978 /* juce_MessageListener.h */, - 18A730DF335EEB3A4D13FDCA /* juce_MessageManager.cpp */, - C844D1792A91BE2D8808CB14 /* juce_MessageManager.h */, - 670987D88775D6B240C34820 /* juce_NotificationType.h */, - ); - name = messages; - sourceTree = "<group>"; - }; - 6956236084207D7C136E5032 /* audio_io */ = { - isa = PBXGroup; - children = ( - 693E9C5C9A435F791921DAAE /* juce_AudioDeviceManager.cpp */, - 642C4CFA27846188E3D53688 /* juce_AudioDeviceManager.h */, - F94BFC6B5057806EEF8B59DA /* juce_AudioIODevice.cpp */, - 2D1BF69121265C83C7937EB6 /* juce_AudioIODevice.h */, - 9BE34B4DECBF4EBFD27C9792 /* juce_AudioIODeviceType.cpp */, - ED887A521EEB8F3EBA7DDB31 /* juce_AudioIODeviceType.h */, - ); - name = audio_io; - sourceTree = "<group>"; - }; - 6DD8D8DBBBD09193A15803D0 /* properties */ = { - isa = PBXGroup; - children = ( - D2CCDDF54D6D6F2BF4281F2D /* juce_BooleanPropertyComponent.cpp */, - 18B410DA5435C02C82BA13F8 /* juce_BooleanPropertyComponent.h */, - 174842EA681FA29BE38A6272 /* juce_ButtonPropertyComponent.cpp */, - 434E153E6C8337C1E4A2709A /* juce_ButtonPropertyComponent.h */, - A9F5A8F835A1A734DF7F6775 /* juce_ChoicePropertyComponent.cpp */, - C10DC7C6E887B4EAAB8EDF38 /* juce_ChoicePropertyComponent.h */, - 651E9B78A5139F7A5BCA4D90 /* juce_PropertyComponent.cpp */, - C7A68BAFB04A7D5FD81FA82B /* juce_PropertyComponent.h */, - 9070DC685E666BBFC2E19DA9 /* juce_PropertyPanel.cpp */, - 0D8ECE32F7D0FE74185F6EF4 /* juce_PropertyPanel.h */, - 6D4DFC260B2966E3EBFC0C79 /* juce_SliderPropertyComponent.cpp */, - 58958CC3F750D383261E2FBC /* juce_SliderPropertyComponent.h */, - 414D8E6E4EE98E66C2583A50 /* juce_TextPropertyComponent.cpp */, - 208DCD7025D0DF2740C01E4A /* juce_TextPropertyComponent.h */, - ); - name = properties; - sourceTree = "<group>"; - }; - 6DDA36A41852F78F61C4BA23 /* codecs */ = { - isa = PBXGroup; - children = ( - 4AE1520FF569371665090B39 /* juce_AiffAudioFormat.cpp */, - 822A504EE33F35F18A7F21AF /* juce_AiffAudioFormat.h */, - F8E202A1374401022F87F26E /* juce_CoreAudioFormat.cpp */, - 2BC005B37A0FB3179C2F3AC7 /* juce_CoreAudioFormat.h */, - 02DA588D3B873F1971ACD912 /* juce_FlacAudioFormat.cpp */, - 266FC6DA3123E576811DD828 /* juce_FlacAudioFormat.h */, - 2F2EDBE0623561191234AF21 /* juce_LAMEEncoderAudioFormat.cpp */, - 4CA9556E9C18029A47F34C7C /* juce_LAMEEncoderAudioFormat.h */, - F1A3975235880CAC1D5757F4 /* juce_MP3AudioFormat.cpp */, - 72C33BA70B9EE82E39F1EC6C /* juce_MP3AudioFormat.h */, - ACAE4A2D65AAC6A36DA9DBCF /* juce_OggVorbisAudioFormat.cpp */, - E040EA8B5BB61ABBBD14F12F /* juce_OggVorbisAudioFormat.h */, - BAE93A5EEC37D7B4C793BFA2 /* juce_QuickTimeAudioFormat.cpp */, - BBC386B5A369262583AD4DDA /* juce_QuickTimeAudioFormat.h */, - 0052A4FD257928E5D83927E6 /* juce_WavAudioFormat.cpp */, - F70B7D65EF56B8A0ED36478C /* juce_WavAudioFormat.h */, - 0C646E9950FB580B21E1F2BD /* juce_WindowsMediaAudioFormat.cpp */, - 8F0549459970F529587D6CDD /* juce_WindowsMediaAudioFormat.h */, - ); - name = codecs; - sourceTree = "<group>"; - }; - 702A741EEADCBB982DDE18B0 /* juce_audio_utils */ = { - isa = PBXGroup; - children = ( - 62693BDBB3A4F98A8A8B45F6 /* gui */, - 09F214A405A08FDFC47244A5 /* players */, - 80D57E78015C789503FE24B4 /* juce_module_info */, - 8515A61F1E3BD62B9B95B495 /* juce_audio_utils.h */, - ); - name = juce_audio_utils; - sourceTree = "<group>"; - }; - 7333A0F468D3745057EB2368 /* juce_core */ = { - isa = PBXGroup; - children = ( - CDD260628D8AFE969895A610 /* text */, - 1E253D48AC292849CD3054CB /* maths */, - 85E7ADCD4C773A42B7F493E8 /* memory */, - B49948DDB0E13018A81FFF94 /* containers */, - E5D588C725B362D52B7F0801 /* threads */, - 8C76D67898D8A6B0FB7F62D5 /* time */, - FD67C32AD7A3D9BDC3CB7896 /* files */, - 1DF9A40DB990AEC6AD278C31 /* network */, - 6415B8D280F206E770758A6A /* streams */, - 3CAB707CFF748C665802E65E /* logging */, - 9D740F320C13F9B82EB64461 /* system */, - 17BAAA5A77781988BAA8CDEF /* xml */, - E4BC8B84B396D69A78DD829B /* json */, - 7C859D548450DEE24AE009E4 /* zip */, - D72CD5E87BC67DDD61A82105 /* unit_tests */, - DE30EC58A5AE1CD381356739 /* misc */, - 572BB2781CE421A968F9D023 /* native */, - CD492AC7B458FA6C321B9D0B /* juce_module_info */, - 97431963DB8D535DEDA9AD47 /* juce_core.h */, - ); - name = juce_core; - sourceTree = "<group>"; - }; - 7377EF4F37D5F898D74C4C2D /* encryption */ = { - isa = PBXGroup; - children = ( - 0BB4380EDFEAAE0DAB255B90 /* juce_BlowFish.cpp */, - 7719FB81DDF23CF0164B131D /* juce_BlowFish.h */, - 511C443A0A806706A772E981 /* juce_Primes.cpp */, - F2EDB88302B8A9356F43B834 /* juce_Primes.h */, - 8D9DD6147EC0553B092FD367 /* juce_RSAKey.cpp */, - 57C6DD2537116B30FB948A08 /* juce_RSAKey.h */, - ); - name = encryption; - sourceTree = "<group>"; - }; - 78AACAE5A74DDE52FE5848AF /* Images */ = { - isa = PBXGroup; - children = ( - 048B10371EA2D5C7D883CC70 /* Icons */, - 5B916D6239703986EFCDB624 /* Buttons */, - ); - name = Images; - sourceTree = "<group>"; - }; - 795DACC07989C186924B5DA3 /* capture */ = { - isa = PBXGroup; - children = ( - E48A7B152993BCF473725A19 /* juce_CameraDevice.h */, - ); - name = capture; - sourceTree = "<group>"; - }; - 7C6BF9E0D166E4E5C3F2A005 /* native */ = { - isa = PBXGroup; - children = ( - 917988BE74F2180BFC0583A3 /* juce_MissingGLDefinitions.h */, - 3AC9B61C10692BBA96D2F775 /* juce_OpenGL_android.h */, - 3C18EC09535EA506FC0CBC62 /* juce_OpenGL_ios.h */, - CC62E20B1189C697DD238810 /* juce_OpenGL_linux.h */, - 205E9A5C31827555F1CAC30D /* juce_OpenGL_osx.h */, - 72FCE41894123FC5DB01566B /* juce_OpenGL_win32.h */, - 61481DD4AAC7731CE984937D /* juce_OpenGLExtensions.h */, - ); - name = native; - sourceTree = "<group>"; - }; - 7C859D548450DEE24AE009E4 /* zip */ = { - isa = PBXGroup; - children = ( - D162391A46FF93093C328F9D /* juce_GZIPCompressorOutputStream.cpp */, - 23C7EA9C89CC98A5EFEC12FA /* juce_GZIPCompressorOutputStream.h */, - A65F5AD9D0C532EBB3A2067D /* juce_GZIPDecompressorInputStream.cpp */, - 5343D594AA7D444A7C6AD924 /* juce_GZIPDecompressorInputStream.h */, - AD7311B9A37893CA0C4BC119 /* juce_ZipFile.cpp */, - D60F42AEB8551E83215691C3 /* juce_ZipFile.h */, - ); - name = zip; - sourceTree = "<group>"; - }; - 7E444D9FB4474A6546E9B779 /* image_formats */ = { - isa = PBXGroup; - children = ( - D55137DE3404D7DF2A1F50D0 /* juce_GIFLoader.cpp */, - EA354D7D8E48D461415D52D8 /* juce_JPEGLoader.cpp */, - 98D2D452F48C86F47FB90BAD /* juce_PNGLoader.cpp */, - ); - name = image_formats; - sourceTree = "<group>"; - }; - 826D8EF5D0C6BF7B9F2AEAF0 /* Juce Library Code */ = { - isa = PBXGroup; - children = ( - D30880F1F9F514CEEDB9F48B /* AppConfig.h */, - A512C5B237A77EF6FB8E11A0 /* BinaryData.cpp */, - 837D266B3F62C3B05C2BC28C /* BinaryData.h */, - DF3C9A1DD67E879E4E0A2727 /* juce_audio_basics.mm */, - 65F4459CC1832883FFF6C166 /* juce_audio_devices.mm */, - 6B28CEAF75E22F2CCCACBCC7 /* juce_audio_formats.mm */, - B20469D88488F0809126CC80 /* juce_audio_processors.mm */, - 56728EC77C65482B9C86FF4D /* juce_audio_utils.mm */, - A6A579E4E4AEA865BC71148C /* juce_core.mm */, - 488D1B00C9E5FE4DAB035EDF /* juce_cryptography.mm */, - DBCA7E2FFCFD1354DD19DDD6 /* juce_data_structures.mm */, - C29E664781AA2396C8D59543 /* juce_events.mm */, - BBDFB328C3D5FC72A0446E6A /* juce_graphics.mm */, - 23609D430A25F54723269E91 /* juce_gui_basics.mm */, - 27DC0E650D6D54DF29E6DB68 /* juce_gui_extra.mm */, - 5915DB02FB7CA8CEC1BF38A9 /* juce_opengl.mm */, - 4A7695E93CE32F4E95042FCB /* juce_video.mm */, - 87B4BA68E49DD11197B7AFDB /* JuceHeader.h */, - ); - name = "Juce Library Code"; - sourceTree = "<group>"; - }; - 83416B76189CFC2030936CCA /* juce_audio_devices */ = { - isa = PBXGroup; - children = ( - 6956236084207D7C136E5032 /* audio_io */, - 42F1804D0EC2EB60625F783F /* midi_io */, - 2097A54F0DC05D433BEB7C81 /* sources */, - 2512062DBF7A12B895E6F6D9 /* audio_cd */, - FCD30A3CA425C3FDE6CEBAED /* native */, - 6EF4EFD6D74D2573AC6B6A6F /* juce_module_info */, - 9069CE21141F5A4C5721BCF3 /* juce_audio_devices.h */, - ); - name = juce_audio_devices; - sourceTree = "<group>"; - }; - 83A3E005DDFCC55F277EEDA5 /* Processors */ = { - isa = PBXGroup; - children = ( - BBD9C2AED6F500D090069007 /* ReferenceNode.cpp */, - F230A4C0186379F9EB0B0F74 /* ReferenceNode.h */, - 9FFD9560522567A033226BD7 /* PhaseDetector.cpp */, - 229989EC8A6F145C81348CA9 /* PhaseDetector.h */, - 76F569AE7B444D8F69EE0E86 /* AudioResamplingNode.cpp */, - 17CE6B2913E72ED8727ECD56 /* AudioResamplingNode.h */, - 9BC055494F9FEE3F90630541 /* Channel.cpp */, - FF450FAFD49105CE7157DFC0 /* Channel.h */, - 3DE49DED45C5CDD8D184E248 /* Serial */, - 39464D2A22940DA2DDCCCFC6 /* EventDetector.cpp */, - 91D7B1F8B94AE9CFCC53771F /* EventDetector.h */, - 9D78F50147005EDB0E89E2B4 /* FPGAOutput.cpp */, - DB702F259EF24DAB9EC99D0A /* FPGAOutput.h */, - D38E60AC4854B6E1EDE488EB /* ArduinoOutput.cpp */, - D128F31F18331117287F5EC5 /* ArduinoOutput.h */, - CD2370F8F4A44446558A08FB /* Parameter.cpp */, - E2F46E110416D628C11392CA /* Parameter.h */, - DAA04A0FD47097893712B241 /* SpikeDisplayNode.cpp */, - 5EA61EDD64BE1E401DD0AA5E /* SpikeDisplayNode.h */, - 2D41C43686CDE35E86A389D7 /* WiFiOutput.cpp */, - B917780A75945062761B6945 /* WiFiOutput.h */, - EA535EA158451360B7B8AE52 /* LfpDisplayNode.cpp */, - DBB86AD59BA3F6EC09AF2C02 /* LfpDisplayNode.h */, - 4E3C60995CC567F1A839CAE3 /* Utilities */, - C4B85C0286AC2510730355E3 /* Visualization */, - BC3B7E4E25505D9044BFACC7 /* SpikeDetector.cpp */, - B70D836E0756C3D4EE8E20F2 /* SpikeDetector.h */, - B27F558F42AC78F0E564B5AF /* AudioNode.cpp */, - 5F64FDAFCA899A16C7FDDBCA /* AudioNode.h */, - F94DD42C7BBF81C101D3F605 /* EventNode.cpp */, - E42B745B4D2DCADE54F94757 /* EventNode.h */, - 9F16043BF599BCE0C02A00A5 /* Editors */, - DEA24DC5AC8325310FB40395 /* DataThreads */, - A4E2CAAF556D557B24182414 /* RecordNode.cpp */, - 3EAE25787DBFBA8EFC42A277 /* RecordNode.h */, - 5522973FA48A13C6BED293FE /* SignalGenerator.cpp */, - 23EAFAEA6457DB4E452F8715 /* SignalGenerator.h */, - A98A22CF5F208ED6DBE08063 /* ResamplingNode.cpp */, - C29BC68B2721471F32906FEB /* ResamplingNode.h */, - B0E8FAD5AC445F612E3468B9 /* FilterNode.cpp */, - 886E18520E8BD77234E1B686 /* FilterNode.h */, - ECA6FDB1366BE7EC30F1539B /* SourceNode.cpp */, - 154303EE3929F26B93792187 /* SourceNode.h */, - 3AE038CACE48AF85C4FB1ED5 /* GenericProcessor.cpp */, - 5B2A4DD7133CDE5AEC24CC07 /* GenericProcessor.h */, - 555D34D0CD8776EE5996CC3A /* ProcessorGraph.cpp */, - 0FDD7551AC98348D4A98ADC7 /* ProcessorGraph.h */, - ); - name = Processors; - sourceTree = "<group>"; - }; - 83E1A8B708A967FC7D5B9FE4 /* juce_gui_basics */ = { - isa = PBXGroup; - children = ( - DA98B2B8AD88362017D0133B /* components */, - 8EB93734459D15BBDF8EF722 /* mouse */, - 9A37C74D88FB91820F829E3C /* keyboard */, - 9627D3CCE9D6810CB06B5D77 /* widgets */, - 3DA4EA9C737426FDAF1484AD /* windows */, - 23BCC80BAA5B674946A538A4 /* menus */, - DAA118DDF10823819CE57BF1 /* layout */, - 444DE4CB4BD092CB31057DFC /* buttons */, - DE87FCC919AE658D7931F3BA /* positioning */, - 6101DBF4D993FE2CB50D4F90 /* drawables */, - 6DD8D8DBBBD09193A15803D0 /* properties */, - 09C2000EFECCE35F3F793E55 /* lookandfeel */, - 4CA0453E4C12495F1018A4E1 /* filebrowser */, - 45BA9E76F27503E30F331299 /* commands */, - BB094F61F6A8A5737BCC4CF6 /* misc */, - 9519CC8E6EF00140A3B507BA /* application */, - B324A7959C768520ED46A064 /* native */, - BF9B6B0B73FF87595307D858 /* juce_module_info */, - 3A9826A8C3B668BCC760BEB7 /* juce_gui_basics.h */, - ); - name = juce_gui_basics; - sourceTree = "<group>"; - }; - 85E7ADCD4C773A42B7F493E8 /* memory */ = { - isa = PBXGroup; - children = ( - F7F374C05CDE0DB7712D18D1 /* juce_Atomic.h */, - 816EB8024DD50DE4B7E84CB8 /* juce_ByteOrder.h */, - FB1EA9CB3C695925627B0AC6 /* juce_HeapBlock.h */, - 420843E39C285B620B220C1D /* juce_LeakedObjectDetector.h */, - C0C6335FEE0844872FDF4EE2 /* juce_Memory.h */, - D11BC618E53E6605B3A579E1 /* juce_MemoryBlock.cpp */, - 8A026DB58E3555F7B070DA61 /* juce_MemoryBlock.h */, - 3663C981D28BF165C1B601A7 /* juce_OptionalScopedPointer.h */, - D5D6DAA3CFDD395096D2B072 /* juce_ReferenceCountedObject.h */, - E0C264CF6345ABB4CAB98B92 /* juce_ScopedPointer.h */, - 0D884C2CF25F23CE6B99B2A1 /* juce_Singleton.h */, - 8B49B07BC7534B247ADC756A /* juce_WeakReference.h */, - ); - name = memory; - sourceTree = "<group>"; - }; - 860DF78DDC42F4C5093B46B0 /* sources */ = { - isa = PBXGroup; - children = ( - 605C7ACB09E7739EBE4F1539 /* juce_AudioSource.h */, - 3F8DFB0DB8B82F0C2CFBCA05 /* juce_BufferingAudioSource.cpp */, - E4A2E203101AF37C169F1569 /* juce_BufferingAudioSource.h */, - 5C1D2D28960C7957A15B3FE4 /* juce_ChannelRemappingAudioSource.cpp */, - 3FA24B406E4A9F9F54421C6A /* juce_ChannelRemappingAudioSource.h */, - 4AD95B75DC581E32650FEDF6 /* juce_IIRFilterAudioSource.cpp */, - 6D619C7A3A14981DC4EFF223 /* juce_IIRFilterAudioSource.h */, - E3D9DABE0A9C1DCE6A6515CB /* juce_MixerAudioSource.cpp */, - 178AD28BF5BC92B58A3A3539 /* juce_MixerAudioSource.h */, - FD770E73FD462E9C9F6DBFB2 /* juce_PositionableAudioSource.h */, - 1B27BF1CF3F235A55CD5107D /* juce_ResamplingAudioSource.cpp */, - 6535D85C084292220330EDD9 /* juce_ResamplingAudioSource.h */, - 9C5F99C38CC703FBB871401A /* juce_ReverbAudioSource.cpp */, - 1D1ABA743E533A4B7A50DBB0 /* juce_ReverbAudioSource.h */, - 458A112D564ED066211FD482 /* juce_ToneGeneratorAudioSource.cpp */, - 3B307527FC3241258EA68519 /* juce_ToneGeneratorAudioSource.h */, - ); - name = sources; - sourceTree = "<group>"; - }; - 89F126369D1761C7A09E35C3 /* placement */ = { - isa = PBXGroup; - children = ( - 7F1E84C068D3E6AA13CDD699 /* juce_Justification.cpp */, - 5DB6A07B827D62571BB51943 /* juce_Justification.h */, - 18CFDBCD4A5B80E78DADCFEB /* juce_RectanglePlacement.cpp */, - 5265AD5F97C9E813E14937A7 /* juce_RectanglePlacement.h */, - ); - name = placement; - sourceTree = "<group>"; - }; - 8A5AC1CA1E8CB52621B64DA4 /* format */ = { - isa = PBXGroup; - children = ( - 5C7EEDD80F88872A87FD561B /* juce_AudioFormat.cpp */, - F28414731D9EE1F75D7B7043 /* juce_AudioFormat.h */, - B5B417E4196236A2CDE7F0CF /* juce_AudioFormatManager.cpp */, - EDA209B0E7D124EA581023AD /* juce_AudioFormatManager.h */, - 4CCA36B2A6C4821E493E74D2 /* juce_AudioFormatReader.cpp */, - 789139D88F449BE488BF3CCB /* juce_AudioFormatReader.h */, - 5CE99545433261F3B4A46252 /* juce_AudioFormatReaderSource.cpp */, - 314955FB1E6DD74C71EB8907 /* juce_AudioFormatReaderSource.h */, - 6B90F5150FA8E114E8AE98BF /* juce_AudioFormatWriter.cpp */, - 3BC3A723444252E177C1B1BD /* juce_AudioFormatWriter.h */, - 8551342E7D16FCA4F9A80BC5 /* juce_AudioSubsectionReader.cpp */, - 3A6E9EC3DA618EBA06B9DEEB /* juce_AudioSubsectionReader.h */, - 86515FD9AD34D6FF96C0D8B6 /* juce_BufferingAudioFormatReader.cpp */, - 8D6A419A4678968762A59B28 /* juce_BufferingAudioFormatReader.h */, - 6B32691AA8B3D304B68CFA64 /* juce_MemoryMappedAudioFormatReader.h */, - ); - name = format; - sourceTree = "<group>"; - }; - 8C76D67898D8A6B0FB7F62D5 /* time */ = { - isa = PBXGroup; - children = ( - 73ACB7A051EDE5F676E35FFD /* juce_PerformanceCounter.cpp */, - 65DA1366481AB10AFB3AF344 /* juce_PerformanceCounter.h */, - 5DC1AF69A773401DB1E8FB32 /* juce_RelativeTime.cpp */, - 562E4A50364EEDC3AA2AACB8 /* juce_RelativeTime.h */, - A769611E9CBFC127AF5AFB0D /* juce_Time.cpp */, - D8A40F2BFBEC65019C867786 /* juce_Time.h */, - ); - name = time; - sourceTree = "<group>"; - }; - 8EB93734459D15BBDF8EF722 /* mouse */ = { - isa = PBXGroup; - children = ( - E91A272EF06892937CB4B9CE /* juce_ComponentDragger.cpp */, - 9A29EBC10219D89919E12FCB /* juce_ComponentDragger.h */, - 8E78AAA58721DE609F6FFC61 /* juce_DragAndDropContainer.cpp */, - A54886FC74BE0DDC74094EF5 /* juce_DragAndDropContainer.h */, - F9E2371F1A99B292F2947FF5 /* juce_DragAndDropTarget.h */, - 9C96B0CBFF3D34885BB8B020 /* juce_FileDragAndDropTarget.h */, - 4EC254B133A7AAE377B9B3AE /* juce_LassoComponent.h */, - 686FA8DDF2848517CBFB9E4A /* juce_MouseCursor.cpp */, - 4E520E7960CC5098C2352E70 /* juce_MouseCursor.h */, - 565EEC8F429ABF5F9A867137 /* juce_MouseEvent.cpp */, - 11A5824E0239C86801BE2EB8 /* juce_MouseEvent.h */, - 3E22E947444B5849011B6C4E /* juce_MouseInputSource.cpp */, - EF059B26886B32000BCF8CFF /* juce_MouseInputSource.h */, - B00A9C0BAD3AF9F48E36A38F /* juce_MouseListener.cpp */, - FEB3730E084D7DD433D14A6C /* juce_MouseListener.h */, - 8F3C158B4FB92CFC48324896 /* juce_SelectedItemSet.h */, - 05997833A4AA137FD64348AD /* juce_TextDragAndDropTarget.h */, - AA3209223925B66A97AB4509 /* juce_TooltipClient.h */, - ); - name = mouse; - sourceTree = "<group>"; - }; - 91DA3CD69EAB03C727AA39C8 /* geometry */ = { - isa = PBXGroup; - children = ( - 9F61AF101B43110732BB8814 /* juce_AffineTransform.cpp */, - A5C9A0FBD818AEF57858FB31 /* juce_AffineTransform.h */, - EAB2319C7AA57E06A2247CDF /* juce_BorderSize.h */, - 7B674BB1DA11A4E58EA71624 /* juce_EdgeTable.cpp */, - B5ADA0C1BDBFAE2A2F8ECB48 /* juce_EdgeTable.h */, - CD2E26CFD0DC7F6090E15A20 /* juce_Line.h */, - 2A3230DEAAC86A9090950703 /* juce_Path.cpp */, - C660716FDD337EFB1A7C6C72 /* juce_Path.h */, - 04C474E0F2F7FDEC714A673C /* juce_PathIterator.cpp */, - 13D9DC48F19699485F9888A4 /* juce_PathIterator.h */, - 4C3EA47E012B2D63ADE599DD /* juce_PathStrokeType.cpp */, - 6D77949E9C7C9B5A7795C0E0 /* juce_PathStrokeType.h */, - 463A302B39C7815EB981CEBD /* juce_Point.h */, - 9380932BED279F91B8C1C04B /* juce_Rectangle.h */, - BDFF189EC742274DD2629196 /* juce_RectangleList.cpp */, - D88B0ADDC9BF206E3D2EE9F6 /* juce_RectangleList.h */, - ); - name = geometry; - sourceTree = "<group>"; - }; - 9311E4762BC3218510204A0F /* juce_audio_basics */ = { - isa = PBXGroup; - children = ( - C7E3612878FFD65D522A32A7 /* buffers */, - 18CF6DB446071363AB4F1EC4 /* midi */, - 553F5880E9CFE9C4A045C0C0 /* effects */, - 860DF78DDC42F4C5093B46B0 /* sources */, - 14AA2721588E8A9253FFA98B /* synthesisers */, - 786F6A40506C2094B812F4D5 /* juce_module_info */, - DB550BAB034060FF4578BB64 /* juce_audio_basics.h */, - ); - name = juce_audio_basics; - sourceTree = "<group>"; - }; - 94D3CC2AE4B67AAA936F9DEA /* values */ = { - isa = PBXGroup; - children = ( - 967138FE8A086734ADC8CABB /* juce_Value.cpp */, - 7CE1E34F6A0091E720854E75 /* juce_Value.h */, - 74A81014471CC0EB0D5E6571 /* juce_ValueTree.cpp */, - C5D0E0996D20BEEEDBFD64FA /* juce_ValueTree.h */, - ); - name = values; - sourceTree = "<group>"; - }; - 9519CC8E6EF00140A3B507BA /* application */ = { - isa = PBXGroup; - children = ( - 2AB1CC4252DB09507ED31482 /* juce_Application.cpp */, - 753B81CCB5A6B6929679E7B7 /* juce_Application.h */, - B24098EC4FD79D5EDC9383EC /* juce_Initialisation.h */, - ); - name = application; - sourceTree = "<group>"; - }; - 95530BD93D8ECFCC072C0850 /* juce_audio_processors */ = { - isa = PBXGroup; - children = ( - 21BB3DD364DC0C39CC9594B9 /* processors */, - 14805A0D1A6C3ED796515AD6 /* format */, - 208431C2D4A7C383FD247CE3 /* format_types */, - AF98861ADFF70900F6FD1833 /* scanning */, - 475824F60D47C28C392954A7 /* juce_module_info */, - F463A19E6EFEB2837582B117 /* juce_audio_processors.h */, - ); - name = juce_audio_processors; - sourceTree = "<group>"; - }; - 9627D3CCE9D6810CB06B5D77 /* widgets */ = { - isa = PBXGroup; - children = ( - 9D2510B5E6180456C53A455E /* juce_ComboBox.cpp */, - A7875D5F8D2A632C99791002 /* juce_ComboBox.h */, - FFBB9CE85A7C91FB11E4AEC8 /* juce_ImageComponent.cpp */, - 45D440B69BDB210B17CD424B /* juce_ImageComponent.h */, - 8C3B6865F2053C80A6E692F1 /* juce_Label.cpp */, - C7A76C0D1B3DC4A1F059E59B /* juce_Label.h */, - B3BAC48D01C49D8727D08097 /* juce_ListBox.cpp */, - 95EC6B1536DC65070D0ADCEE /* juce_ListBox.h */, - B123E2F4439DAD65196A2A9D /* juce_ProgressBar.cpp */, - 6BA113C799640798D3F29A06 /* juce_ProgressBar.h */, - 53C8A2696FE4389E4AB4441C /* juce_Slider.cpp */, - 21C11A58CAA0F9E86AA204EC /* juce_Slider.h */, - CD83E301AE42E6E3317D575D /* juce_TableHeaderComponent.cpp */, - B60D02B5BF564ABC88841B1F /* juce_TableHeaderComponent.h */, - D171071934C8F7F925B0D113 /* juce_TableListBox.cpp */, - 3C1E0B87DA3E9AC60D2894F7 /* juce_TableListBox.h */, - 921F5D04122F324502DA4E75 /* juce_TextEditor.cpp */, - 9FDCF1E2B4651E58240400B9 /* juce_TextEditor.h */, - 649F22404167E0D0EA244196 /* juce_Toolbar.cpp */, - AE6786E4659DAC92F52E9FA3 /* juce_Toolbar.h */, - 6917A53BAA3CA2819E4C10BF /* juce_ToolbarItemComponent.cpp */, - 17FB020EFEAED8493D3CB121 /* juce_ToolbarItemComponent.h */, - E37140E9E8F7CFDDEEEF6148 /* juce_ToolbarItemFactory.h */, - 4BB38A2CD55BF23C7C3E3387 /* juce_ToolbarItemPalette.cpp */, - 7F93E4F0CC8B842AC1D3E560 /* juce_ToolbarItemPalette.h */, - 564380494D23DB70680FB0B5 /* juce_TreeView.cpp */, - 38E493BFC36AC80B1CDAAF35 /* juce_TreeView.h */, - ); - name = widgets; - sourceTree = "<group>"; - }; - 9924BF5224418D631DE02DA4 /* native */ = { - isa = PBXGroup; - children = ( - 5E94E897783BEEFE61E61A2C /* juce_android_WebBrowserComponent.cpp */, - 6FE8B0DD6116E6A3456ECF09 /* juce_ios_UIViewComponent.mm */, - 5284E69CC601457D5C7C1063 /* juce_linux_SystemTrayIcon.cpp */, - D952A208CC8164F0B459EC9E /* juce_linux_WebBrowserComponent.cpp */, - 5A746CDDE80FEA2E45B5BA66 /* juce_mac_AppleRemote.mm */, - 3A71F2C959CA7DD3C33DC411 /* juce_mac_CarbonViewWrapperComponent.h */, - D357A886F6365DA33D639FF5 /* juce_mac_NSViewComponent.mm */, - 3C92F249799E7CBF41FABEA0 /* juce_mac_WebBrowserComponent.mm */, - 7C0F2759385C66CAC3EC362D /* juce_win32_ActiveXComponent.cpp */, - 1D7FEC587CFE464A21830C4D /* juce_win32_SystemTrayIcon.cpp */, - 1BF01252E3A30560525CE057 /* juce_win32_WebBrowserComponent.cpp */, - ); - name = native; - sourceTree = "<group>"; - }; - 9A37C74D88FB91820F829E3C /* keyboard */ = { - isa = PBXGroup; - children = ( - 7BCE1C09508E1B9CFC79C185 /* juce_CaretComponent.cpp */, - 2FE6DAFB634FF3C20F1D6FD7 /* juce_CaretComponent.h */, - D840E516B1DE9F3F730283D5 /* juce_KeyboardFocusTraverser.cpp */, - FB33617B5082CC0CDC189F2C /* juce_KeyboardFocusTraverser.h */, - 880CC7C325EFF665AC3006D2 /* juce_KeyListener.cpp */, - 40C22F3CD61DDB9C7B3DCCA6 /* juce_KeyListener.h */, - 33A69BDDCFCD4A4DC14A9961 /* juce_KeyPress.cpp */, - 78CC9639B933CE2497264EF2 /* juce_KeyPress.h */, - 8C268C3D0B8EC2BB8953E7F7 /* juce_ModifierKeys.cpp */, - C6E19D3864B40A52BCC49315 /* juce_ModifierKeys.h */, - 6C36C3C304EB066B1DFCCD9C /* juce_SystemClipboard.h */, - 9C701D5A7298B83CE05ECEBB /* juce_TextEditorKeyMapper.h */, - 8689288B66B16EFB106CB2F4 /* juce_TextInputTarget.h */, - ); - name = keyboard; - sourceTree = "<group>"; - }; - 9ADB0069D1F40FF3865041E3 /* code_editor */ = { - isa = PBXGroup; - children = ( - 1D7578F927EC030203A11978 /* juce_CodeDocument.cpp */, - 5BB1E90842FD8A212CC2D132 /* juce_CodeDocument.h */, - 586B1E0743FFBE9081A25F4F /* juce_CodeEditorComponent.cpp */, - 106E81B939C6B35E34DD71FE /* juce_CodeEditorComponent.h */, - 96F2A45DCB9BB53844B0ED4F /* juce_CodeTokeniser.h */, - 081E86FE0B991469CFA8D7EA /* juce_CPlusPlusCodeTokeniser.cpp */, - DFAA7B563CEFB94D9ADB5D6A /* juce_CPlusPlusCodeTokeniser.h */, - F4D2A03314AB1CF852CC4F2A /* juce_CPlusPlusCodeTokeniserFunctions.h */, - ); - name = code_editor; - sourceTree = "<group>"; - }; - 9ADE9FD3E8A58C12B4B2D8B2 /* Fonts */ = { - isa = PBXGroup; - children = ( - B081687E52C6A5157CFCCB17 /* cpmono-black-serialized */, - E7ACE8C1456403A574236451 /* cpmono-bold-serialized */, - 38A9627672C2562DBE257A05 /* cpmono-extralight-serialized */, - E835BEB3C42E4B241804BE13 /* cpmono-light-serialized */, - 1719507D8A73EA71F1C3F306 /* cpmono-plain-serialized */, - 50DB7E5C152DDD03F2FA4C2D /* BebasNeue.otf */, - FC85D30C66E7A4E4A6CA29AE /* cpmono_bold.otf */, - 24D86195580EFB86AC084DCC /* cpmono_extra_light.otf */, - AA7F6609B897B9E134377A62 /* cpmono_light.otf */, - 783D8922D5C687E170FA1A2C /* cpmono_plain.otf */, - 32B658D7A44849A6F640AF37 /* miso-bold.ttf */, - 847F6986DFA468BA8D80A531 /* miso-light.ttf */, - 0A2AD4AB14F93364EFB9611E /* miso-regular.ttf */, - B13BDA434DEF56BB48B26896 /* miso-serialized */, - EC95A2CF4B33EA37DA5FC1AC /* nordic.ttf */, - 9D050A509BEB9E3879DA35C6 /* ostrich.ttf */, - 66F524552E8DE88CDC2E40FD /* silkscreen-serialized */, - D01254FA41688494C3CB0889 /* silkscreen.ttf */, - 61317B5191E05925F232E18C /* unibody-8.otf */, - ); - name = Fonts; - sourceTree = "<group>"; - }; - 9D44948383EAABF451302146 /* open-ephys */ = { - isa = PBXGroup; - children = ( - B9646290EA6B6995F8AEEAFB /* Resources */, - 3564F28A16A2BDF3B1D5035E /* Source */, - ); - name = "open-ephys"; - sourceTree = "<group>"; - }; - 9D740F320C13F9B82EB64461 /* system */ = { - isa = PBXGroup; - children = ( - 7F17077973FFDD70C4B78E7E /* juce_PlatformDefs.h */, - A5E8E0CF6DA1AEAEE9D872DE /* juce_StandardHeader.h */, - 9978BC2A359BC506F69E545F /* juce_SystemStats.cpp */, - DB4F34DA0F04B40EB6A50FB1 /* juce_SystemStats.h */, - C446923C1950EB5BE5E67F15 /* juce_TargetPlatform.h */, - ); - name = system; - sourceTree = "<group>"; - }; - 9F16043BF599BCE0C02A00A5 /* Editors */ = { - isa = PBXGroup; - children = ( - 1552007C6C6AF750278C5BE5 /* RecordControlEditor.cpp */, - 0B2B7732073D56E484950C8D /* RecordControlEditor.h */, - 9C39C584DA6F507E773687EE /* ReferenceNodeEditor.cpp */, - 1C93ECD2B04F39923E66B529 /* ReferenceNodeEditor.h */, - C5ABE6BDCA91410BA92A7BD9 /* ResamplingNodeEditor.cpp */, - 0CCE619599DB39323E49FF3C /* ResamplingNodeEditor.h */, - 169F1B20FC9FFE88C53D2735 /* FPGAOutputEditor.cpp */, - 92528D6653802FACF658D8EA /* FPGAOutputEditor.h */, - 1AD76E8111A738A8F3717060 /* ArduinoOutputEditor.cpp */, - 8B9C0831BE4E09B7C0078B7E /* ArduinoOutputEditor.h */, - E216D095C98F850A5FB6FB0F /* ChannelSelector.cpp */, - 70F06DBCA3948BCC1062E36F /* ChannelSelector.h */, - 46E3A634686BFEF787229582 /* ParameterEditor.cpp */, - 8B745839B225E44C9EB5C6FA /* ParameterEditor.h */, - 1EC95CD1D830F6D85ADB3B9D /* SpikeDisplayEditor.cpp */, - 25ABEB43042E98C668A16432 /* SpikeDisplayEditor.h */, - CAA3B9396EA62166234DAEF1 /* VisualizerEditor.cpp */, - B23E6EBB5F99CF7FC72FAC4E /* VisualizerEditor.h */, - 29FD7B383C5DDACAA7B8DFD3 /* MergerEditor.cpp */, - FC887C6CD74FE33F8BA784A6 /* MergerEditor.h */, - 04C6B933E1603B4D0916570D /* ImageIcon.cpp */, - C51CD15B311D0AAC08D0B908 /* ImageIcon.h */, - C79249376E3FDF10615E16EA /* WiFiOutputEditor.cpp */, - BA2923571505AD47CA1EF878 /* WiFiOutputEditor.h */, - 70151263C4CB8A4F79431E11 /* EventNodeEditor.cpp */, - 985F2B5047476B272B1A4BD4 /* EventNodeEditor.h */, - 9136BD46BE1E28A96FBBD440 /* SignalGeneratorEditor.cpp */, - 265EDA19C88E74249FD66609 /* SignalGeneratorEditor.h */, - 8A91849BE6B96EB8C0663469 /* LfpDisplayEditor.cpp */, - E594A85A291E0625E0410A85 /* LfpDisplayEditor.h */, - 6328434A329C353DB8D9512C /* SourceNodeEditor.cpp */, - 028D4D3C0862B4B1312E2395 /* SourceNodeEditor.h */, - D51315B4241B019BE43EE4F1 /* SplitterEditor.cpp */, - CCC20313AD0D0993F9EDD1B3 /* SplitterEditor.h */, - A252FE4E6A360CBC4AF694B3 /* SpikeDetectorEditor.cpp */, - 83E5EA2AA0CB928889AC80AB /* SpikeDetectorEditor.h */, - 10BE33089BA6F3468F36CD6C /* AudioEditor.cpp */, - A0E3B98412D88921BB0AA58E /* AudioEditor.h */, - D90290A0AA2C36CE757E46D5 /* FilterEditor.cpp */, - 49FA151B1837E543D18858EB /* FilterEditor.h */, - D3AE8303545E28D793312F46 /* GenericEditor.cpp */, - 984BC60C0AFF3EDED692FA01 /* GenericEditor.h */, - ); - name = Editors; - sourceTree = "<group>"; - }; - A7589AF92E6E958E1F866761 /* Source */ = { - isa = PBXGroup; - children = ( - 9D44948383EAABF451302146 /* open-ephys */, - 328BE41789531FE4F91F7DA1 /* Juce Modules */, - 826D8EF5D0C6BF7B9F2AEAF0 /* Juce Library Code */, - 469F0AB7234589951A8F29FA /* Resources */, - 008433D940C09C1A15B916BA /* Frameworks */, - FA0E0597ED415901958AD5AE /* Products */, - ); - name = Source; - sourceTree = "<group>"; - }; - A7F7E551BA5A75737261BB4C /* juce_data_structures */ = { - isa = PBXGroup; - children = ( - 94D3CC2AE4B67AAA936F9DEA /* values */, - 42DE5996B56B332A5B6C636D /* undomanager */, - 6783EE5E12C56ECE3D7FD1E2 /* app_properties */, - E21CA41B44E191F1804F9662 /* juce_module_info */, - 5962848AA3DD93A29EFF5B94 /* juce_data_structures.h */, - ); - name = juce_data_structures; - sourceTree = "<group>"; - }; - AADD3015266C1EF879776CBB /* playback */ = { - isa = PBXGroup; - children = ( - 59389DC8664617FD51740F36 /* juce_DirectShowComponent.h */, - 7C15112E5F287ACDD74480F5 /* juce_QuickTimeMovieComponent.h */, - ); - name = playback; - sourceTree = "<group>"; - }; - AD985677A45CD32AB58EECA5 /* juce_video */ = { - isa = PBXGroup; - children = ( - AADD3015266C1EF879776CBB /* playback */, - 795DACC07989C186924B5DA3 /* capture */, - C55C0342ACE444BC42092159 /* native */, - F88A99110564C87FBA281F2C /* juce_module_info */, - C0B54E0803BA87C8BC353551 /* juce_video.h */, - ); - name = juce_video; - sourceTree = "<group>"; - }; - AF98861ADFF70900F6FD1833 /* scanning */ = { - isa = PBXGroup; - children = ( - E53FEAA3754E6B5D99516D56 /* juce_KnownPluginList.cpp */, - 4D84A3A970FB67566A1E5B0B /* juce_KnownPluginList.h */, - 390EA3109658E8C51EFC8F61 /* juce_PluginDirectoryScanner.cpp */, - 894C0CAC31D382477E7A122E /* juce_PluginDirectoryScanner.h */, - F17DF27524262A21A3EC932D /* juce_PluginListComponent.cpp */, - 75E0C433EC27CFB712CD9F75 /* juce_PluginListComponent.h */, - ); - name = scanning; - sourceTree = "<group>"; - }; - B016FBDF648372A23D7EAAD8 /* Network */ = { - isa = PBXGroup; - children = ( - 9F577889CB6C54A2F7B1CA80 /* PracticalSocket.cpp */, - 7B42B28FDB2E3AC67EF296F8 /* PracticalSocket.h */, - ); - name = Network; - sourceTree = "<group>"; - }; - B324A7959C768520ED46A064 /* native */ = { - isa = PBXGroup; - children = ( - CF5BC8DB7D66C655DABA9129 /* juce_android_FileChooser.cpp */, - 54339ADDCB6F8E9E7721A986 /* juce_android_Windowing.cpp */, - 47EE021D6C891095140ED7A9 /* juce_ios_UIViewComponentPeer.mm */, - A8B4D80D55E48F50809DC5E4 /* juce_ios_Windowing.mm */, - 41AF61914A96159E9EA194B0 /* juce_linux_Clipboard.cpp */, - 48E4FA55FD4440AF44EEA437 /* juce_linux_FileChooser.cpp */, - 558E925DAC57ADF8810559AC /* juce_linux_Windowing.cpp */, - 6514FD7E6C5EC12735E49FBC /* juce_mac_FileChooser.mm */, - 1819C1C4DE5FEEDEA143E3D2 /* juce_mac_MainMenu.mm */, - 14FE601229C9A40C6E182F28 /* juce_mac_MouseCursor.mm */, - C17E85281A455245543930E5 /* juce_mac_NSViewComponentPeer.mm */, - 20EB4F22A76954F2986F364A /* juce_mac_Windowing.mm */, - 45258533F9F65AC96D3080B3 /* juce_MultiTouchMapper.h */, - 81D578AA5F277EB0946050E5 /* juce_win32_DragAndDrop.cpp */, - 159790C750B1F8B485DBB499 /* juce_win32_FileChooser.cpp */, - 1518D2BA7FCAF267EF1F02E6 /* juce_win32_Windowing.cpp */, - ); - name = native; - sourceTree = "<group>"; - }; - B43FF50BCF27E5D575CEF309 /* Plugins */ = { - isa = PBXGroup; - children = ( - ); - name = Plugins; - sourceTree = "<group>"; - }; - B49948DDB0E13018A81FFF94 /* containers */ = { - isa = PBXGroup; - children = ( - F0F3834D46EA8FC8ADB206DB /* juce_AbstractFifo.cpp */, - 47BDFDD28759B342B1C50BC0 /* juce_AbstractFifo.h */, - 7E40891072657FB5ADC2FAB7 /* juce_Array.h */, - 7D8100DC3A532980AEAAD909 /* juce_ArrayAllocationBase.h */, - 7291F19253205B1A5138908E /* juce_DynamicObject.cpp */, - 0E98E81084F183B8426EDA7F /* juce_DynamicObject.h */, - 193FED8339417E8E6264957A /* juce_ElementComparator.h */, - 893E1A681FF162F6C9069F62 /* juce_HashMap.h */, - 66D3F831CE4F6AE89E4C869A /* juce_LinkedListPointer.h */, - 35C0963BAB9A82F12CDC9F76 /* juce_NamedValueSet.cpp */, - F3F48717927A4E24F7373C09 /* juce_NamedValueSet.h */, - 6C24163DC4ECD731489CC4F6 /* juce_OwnedArray.h */, - E3C4B6B362320594789E1297 /* juce_PropertySet.cpp */, - 66C663401829E0F7E787F708 /* juce_PropertySet.h */, - B5FBD4DBD2CFE0FFF457D7F6 /* juce_ReferenceCountedArray.h */, - 19AB6653E818B409554C5606 /* juce_ScopedValueSetter.h */, - 76E89CBE70BF8F2476B7AA34 /* juce_SortedSet.h */, - 49D837FD08100AF0DB797DB4 /* juce_SparseSet.h */, - F8EFE3709FDDC2D5F0843058 /* juce_Variant.cpp */, - 172FA5C9EC4B16BC0C45F269 /* juce_Variant.h */, - ); - name = containers; - sourceTree = "<group>"; - }; - B9646290EA6B6995F8AEEAFB /* Resources */ = { - isa = PBXGroup; - children = ( - 9ADE9FD3E8A58C12B4B2D8B2 /* Fonts */, - 78AACAE5A74DDE52FE5848AF /* Images */, - ); - name = Resources; - sourceTree = "<group>"; - }; - BB094F61F6A8A5737BCC4CF6 /* misc */ = { - isa = PBXGroup; - children = ( - 04ED2387517934A84ACF9865 /* juce_BubbleComponent.cpp */, - ECE3BE71EB6B9CF1CE869BBE /* juce_BubbleComponent.h */, - 8D4FBD30E1C9EC0DA749BC83 /* juce_DropShadower.cpp */, - BCBBF8764A2101CD0E91DB5D /* juce_DropShadower.h */, - ); - name = misc; - sourceTree = "<group>"; - }; - BCD632E634E0F8A50827F9B6 /* Dsp */ = { - isa = PBXGroup; - children = ( - 1989E86F8DFDE34887AC0326 /* Bessel.cpp */, - 29D7893C278FFE00782637B6 /* Bessel.h */, - 22801F75289646F6A85E5583 /* Biquad.cpp */, - 361D8C54B3E54766CBC48046 /* Biquad.h */, - B47B3368AA1A182B0CA1AB26 /* Butterworth.cpp */, - 6D59D5780ECD2CC9703CB499 /* Butterworth.h */, - 09BCBD414282A3AA4F66A3A5 /* Cascade.cpp */, - E8174B3346AA69361BF73AE1 /* Cascade.h */, - AC2CFF4DA5CE431FCC628BA3 /* ChebyshevI.cpp */, - EC780F52ABBD7317A5CE2F33 /* ChebyshevI.h */, - B767A249792EB15A87054409 /* ChebyshevII.cpp */, - 9CEDA04DB321755AF74D6FAF /* ChebyshevII.h */, - E8480C4ED7F9579F6172F7B5 /* Common.h */, - D8D895B3AD895C6E7FD446BF /* Custom.cpp */, - 3063CF211ABB734A9FD452EC /* Custom.h */, - 2B93450006102A0093F5EACB /* Design.cpp */, - 7ACB1CB66D69738904358F43 /* Design.h */, - E90FCB43DA2FF766597DA75E /* Documentation.cpp */, - 1086169B0EE86E04B64575C2 /* Dsp.h */, - 392408C1943AC6234BAAC743 /* Elliptic.cpp */, - A95D898F0998F4609E992B5F /* Elliptic.h */, - 587FCA2485B9C89C2A99C23A /* Filter.cpp */, - C39772F796D85E8FE98474D5 /* Filter.h */, - 38313692308D501E4CADF1D5 /* Layout.h */, - C4B0DF8094C90543A65E03E3 /* Legendre.cpp */, - 4939A8B8300394AAD0926C0B /* Legendre.h */, - A41C5A4CD5CF8EEFF993A8B1 /* MathSupplement.h */, - 3F6C67E29CDEDF2EF61C054F /* Param.cpp */, - C3BD84D9B090F98DD09F5958 /* Params.h */, - 65312FAD0900119CDF6CF414 /* PoleFilter.cpp */, - 5A8D46BEB81DDF24462E3D92 /* PoleFilter.h */, - 9A21A229CFACC67E31F4F727 /* RBJ.cpp */, - E44B26F5D97CB483242DE05B /* RBJ.h */, - 3F69480D6145C77992FA59BA /* RootFinder.cpp */, - 7EFF8622168303A4391D6CAE /* RootFinder.h */, - F0CA3600E09054D7DB3B0067 /* SmoothedFilter.h */, - C1CB526B75E406851FA918C6 /* State.cpp */, - 9428D7423971764AC0BA9CB7 /* State.h */, - 6340B1D2FECEABBBE6C0DE28 /* Types.h */, - CFB86C1F2A6076ADC36692AA /* Utilities.h */, - ); - name = Dsp; - sourceTree = "<group>"; - }; - C451728043944D40C69166C1 /* Audio */ = { - isa = PBXGroup; - children = ( - B04D87ED6AA4897B6CD3CCF6 /* AudioComponent.cpp */, - E79259F2164D16553A69B458 /* AudioComponent.h */, - ); - name = Audio; - sourceTree = "<group>"; - }; - C4B85C0286AC2510730355E3 /* Visualization */ = { - isa = PBXGroup; - children = ( - 4C669ADBEAE5CF82CBABD50D /* SpikePlotting */, - 5894D40A0E8FA6E9B3EBF9D9 /* SpikeObject.cpp */, - ADCB42E4C5641007A4B78025 /* SpikeObject.h */, - A7D4C9E3ED3763847C087F46 /* SpikeDisplayCanvas.cpp */, - 4E6EE225098D32E7D5DE60B2 /* SpikeDisplayCanvas.h */, - 215E1BD79B5870D5356810F0 /* Visualizer.h */, - 66463AB11EA4D6341C32F27E /* DataWindow.cpp */, - FFFBDB9A00240D797751FEE6 /* DataWindow.h */, - 4A94E809624F99387E600399 /* LfpDisplayCanvas.cpp */, - 12B5DDCB6E5ECD93A4C55BB5 /* LfpDisplayCanvas.h */, - F2FDC07162CAEDE524F09CFC /* OpenGLCanvas.cpp */, - DA4A6BD7079F2BC73B5035F3 /* OpenGLCanvas.h */, - ); - name = Visualization; - sourceTree = "<group>"; - }; - C55C0342ACE444BC42092159 /* native */ = { - isa = PBXGroup; - children = ( - 70ECB490BD59F59D003F3BEE /* juce_android_CameraDevice.cpp */, - 6ABF91320A2EB6D307091AEE /* juce_mac_CameraDevice.mm */, - EB5F9A50EB53A57D6AE303C2 /* juce_mac_QuickTimeMovieComponent.mm */, - D1D8F82F848413581B274A5D /* juce_win32_CameraDevice.cpp */, - 65980344D141B0008A94E2E4 /* juce_win32_DirectShowComponent.cpp */, - 020205BB77179A9BE3FFF1E1 /* juce_win32_QuickTimeMovieComponent.cpp */, - ); - name = native; - sourceTree = "<group>"; - }; - C7E3612878FFD65D522A32A7 /* buffers */ = { - isa = PBXGroup; - children = ( - 563F35B171FAF2540923CE45 /* juce_AudioDataConverters.cpp */, - EA73332E3D5AEC04ADDFBB2A /* juce_AudioDataConverters.h */, - 80E8C07F5807C65BCDFCCF94 /* juce_AudioSampleBuffer.cpp */, - 1CB0D7AC988EDEC838A1C546 /* juce_AudioSampleBuffer.h */, - BE506F381B90833512348968 /* juce_FloatVectorOperations.cpp */, - 42BF0530EADF336E58D39CD3 /* juce_FloatVectorOperations.h */, - ); - name = buffers; - sourceTree = "<group>"; - }; - C8A65F145D072BB3DA28595B /* misc */ = { - isa = PBXGroup; - children = ( - 3F56A025C4D83EBDB66E3676 /* juce_AppleRemote.h */, - F46843B979D0385C733C797A /* juce_BubbleMessageComponent.cpp */, - AD1950C0733B3470777BF861 /* juce_BubbleMessageComponent.h */, - CE2BD40797A6E7647FDBE736 /* juce_ColourSelector.cpp */, - 23D82A4C165DD596474F30E4 /* juce_ColourSelector.h */, - 1E9FE44F0CCC6604B5469412 /* juce_KeyMappingEditorComponent.cpp */, - F0D9A28C206D7A8BA7089D29 /* juce_KeyMappingEditorComponent.h */, - 88E5D0906646465409715828 /* juce_PreferencesPanel.cpp */, - D4F94F0232F0CD426DFC44C5 /* juce_PreferencesPanel.h */, - 0AA8F001A50408977E76ED96 /* juce_RecentlyOpenedFilesList.cpp */, - FD88DA941838FC91D222DF35 /* juce_RecentlyOpenedFilesList.h */, - 92E07CA13571893873565AC7 /* juce_SplashScreen.cpp */, - 6D4BA4399FDEB6D2195B257D /* juce_SplashScreen.h */, - 7A9F37527280A470F201FB6E /* juce_SystemTrayIconComponent.cpp */, - 73C69D948D33899821536025 /* juce_SystemTrayIconComponent.h */, - 8E696460A8A860B7A4044DFC /* juce_WebBrowserComponent.h */, - ); - name = misc; - sourceTree = "<group>"; - }; - CDD260628D8AFE969895A610 /* text */ = { - isa = PBXGroup; - children = ( - AFE835E175F7159E1E7C6CC7 /* juce_CharacterFunctions.cpp */, - 2DA0032B6DF10345C4842BF5 /* juce_CharacterFunctions.h */, - B64893F699A10B03AA4AFF6B /* juce_CharPointer_ASCII.h */, - 9200FC900D22733AE716C364 /* juce_CharPointer_UTF16.h */, - 6596D69CCD1502DC6BBD15F1 /* juce_CharPointer_UTF32.h */, - 55F7467B96E236DD558228C9 /* juce_CharPointer_UTF8.h */, - 05BD169B8574607A6F6AD3B6 /* juce_Identifier.cpp */, - 6C8489C41782E3D391AF0C26 /* juce_Identifier.h */, - 1246C8A62803B7E115713705 /* juce_LocalisedStrings.cpp */, - E91923510CB2280C3A3B9E9C /* juce_LocalisedStrings.h */, - 1F12D1392E5DF34C3A3C445D /* juce_NewLine.h */, - 0A413228C75C046CE683E0E6 /* juce_String.cpp */, - 09A159213372995F3CCEB85B /* juce_String.h */, - 38B5A37F33AE3FB2014BF095 /* juce_StringArray.cpp */, - 2847E92BB432EEB9D5A59260 /* juce_StringArray.h */, - B9E2607F1605D308CB331FCC /* juce_StringPairArray.cpp */, - EAEA49B9394D802B79CA8164 /* juce_StringPairArray.h */, - C67AA7952D9EF7E248118B85 /* juce_StringPool.cpp */, - EAC262A83CD2BEA14542AE89 /* juce_StringPool.h */, - B7BEB7779860FE877E4D1BC8 /* juce_TextDiff.cpp */, - C98D4FF283E598244E89CD83 /* juce_TextDiff.h */, - ); - name = text; - sourceTree = "<group>"; - }; - D3C338AADE455AEA6C248E21 /* colour */ = { - isa = PBXGroup; - children = ( - FC080F7DF94ABCB7EA09224A /* juce_Colour.cpp */, - 4C81E05B39376F54775A1027 /* juce_Colour.h */, - 90F2939F533A26AC021E42B1 /* juce_ColourGradient.cpp */, - A708E79EB9EB7CC44030F5D5 /* juce_ColourGradient.h */, - 6BBBC0907D7A62E2F3AB9BDF /* juce_Colours.cpp */, - FB7E91937D3BBE00F64F0B72 /* juce_Colours.h */, - AFB684CE06F9256324EE0B4C /* juce_FillType.cpp */, - B87C1BD13762817BE27DC2F7 /* juce_FillType.h */, - 7A93BFD2180B5E00B124CB1A /* juce_PixelFormats.h */, - ); - name = colour; - sourceTree = "<group>"; - }; - D6EA061B97C039BF4BAAB444 /* effects */ = { - isa = PBXGroup; - children = ( - 1191BF3048664183033BFF89 /* juce_DropShadowEffect.cpp */, - 8B7EB54E1F773517A65D935C /* juce_DropShadowEffect.h */, - 0AAFE3F4D106138401C190C5 /* juce_GlowEffect.cpp */, - AADBA8C0AD524CE677428AFF /* juce_GlowEffect.h */, - B2FA9CC4754E136F22281176 /* juce_ImageEffectFilter.h */, - ); - name = effects; - sourceTree = "<group>"; - }; - D70BE7E6ECFBD4AD6F29AA64 /* interprocess */ = { - isa = PBXGroup; - children = ( - 9360657FDE33FA37D80075D1 /* juce_InterprocessConnection.cpp */, - E7460F066237871A704733E7 /* juce_InterprocessConnection.h */, - EAC7A64301F0BF2C5E33A1F9 /* juce_InterprocessConnectionServer.cpp */, - 946FDFCA107B3F4C74C471B4 /* juce_InterprocessConnectionServer.h */, - ); - name = interprocess; - sourceTree = "<group>"; - }; - D72CD5E87BC67DDD61A82105 /* unit_tests */ = { - isa = PBXGroup; - children = ( - 4D8F94CA49DB11E07918B4C9 /* juce_UnitTest.cpp */, - 53130F5F47EB211416C028F6 /* juce_UnitTest.h */, - ); - name = unit_tests; - sourceTree = "<group>"; - }; - DA98B2B8AD88362017D0133B /* components */ = { - isa = PBXGroup; - children = ( - 085F51FEE5C5FDAA321090A0 /* juce_CachedComponentImage.h */, - 01C313C323E5CB995C939E0B /* juce_Component.cpp */, - EEFC66D2DF5FD66B4D83B22F /* juce_Component.h */, - 4F4234DC14D3689C22655D0C /* juce_ComponentListener.cpp */, - 50DD8D693741DD18106C0BA7 /* juce_ComponentListener.h */, - A15596CDCC27B86FC070D7FA /* juce_Desktop.cpp */, - CD41C1D09F6D73FA33993F45 /* juce_Desktop.h */, - 1DF5FD417930A62110DF0419 /* juce_ModalComponentManager.cpp */, - 45883809F1335E6C745F8155 /* juce_ModalComponentManager.h */, - ); - name = components; - sourceTree = "<group>"; - }; - DAA118DDF10823819CE57BF1 /* layout */ = { - isa = PBXGroup; - children = ( - B674DCA2C2A6AF6B58AA7820 /* juce_ComponentAnimator.cpp */, - BABBEE3876B90C8A57C3074D /* juce_ComponentAnimator.h */, - 17B29FF3D3EA14EF2BE149BB /* juce_ComponentBoundsConstrainer.cpp */, - 674FDCCEF6A1379A0F689004 /* juce_ComponentBoundsConstrainer.h */, - 6DD526F86CBF2C3B3487FFE1 /* juce_ComponentBuilder.cpp */, - 2FF422D0633A28558D0227EC /* juce_ComponentBuilder.h */, - 313970BBDAAA4EDC8B322F3A /* juce_ComponentMovementWatcher.cpp */, - EE4DD055D31F7D9DC718DBD8 /* juce_ComponentMovementWatcher.h */, - 570299171BCE863C54FBBA54 /* juce_ConcertinaPanel.cpp */, - 4E71B355F2BABAF69CC4114D /* juce_ConcertinaPanel.h */, - 7D88F7083884A5ED2DBE7534 /* juce_GroupComponent.cpp */, - 5E0F8A60411A03461FD687CE /* juce_GroupComponent.h */, - C195559D311BAB51CFB545BA /* juce_MultiDocumentPanel.cpp */, - 6E2F243D8F70CC92391204A4 /* juce_MultiDocumentPanel.h */, - 75FCE8908DD9055F90E93716 /* juce_ResizableBorderComponent.cpp */, - 5E1EFF4EEA5684FA00CAA353 /* juce_ResizableBorderComponent.h */, - 94BD861806F8EA598EC09370 /* juce_ResizableCornerComponent.cpp */, - E23FA5E940A1434B0305875D /* juce_ResizableCornerComponent.h */, - EE0336B43A39FD585DF638EE /* juce_ResizableEdgeComponent.cpp */, - CC42C4D4230BE4F1071CB2D3 /* juce_ResizableEdgeComponent.h */, - F1099BFF0BC1656A23D62E84 /* juce_ScrollBar.cpp */, - 5B411F4FCF0F69798C9E4A88 /* juce_ScrollBar.h */, - 43420911407CC35CE2A02B38 /* juce_StretchableLayoutManager.cpp */, - DDE157BB06373ECDBB23469C /* juce_StretchableLayoutManager.h */, - 918837CC0447C50774036664 /* juce_StretchableLayoutResizerBar.cpp */, - D06A8FDAD8B22537EA594383 /* juce_StretchableLayoutResizerBar.h */, - 3E0942A2D72F50FDE27C14AE /* juce_StretchableObjectResizer.cpp */, - 416B99B14B44CB16B725C4B2 /* juce_StretchableObjectResizer.h */, - 0D3C20D1F00B7B1381E6B987 /* juce_TabbedButtonBar.cpp */, - F10FB240E10A5742CE366A91 /* juce_TabbedButtonBar.h */, - 4AE36D25675E32A897F97BFA /* juce_TabbedComponent.cpp */, - 510ACDAD798813D7FC110197 /* juce_TabbedComponent.h */, - AEF53FD0FBBFF5242EDD7032 /* juce_Viewport.cpp */, - 9F6664EB2C39D224C6BCC75E /* juce_Viewport.h */, - ); - name = layout; - sourceTree = "<group>"; - }; - DE30EC58A5AE1CD381356739 /* misc */ = { - isa = PBXGroup; - children = ( - 3FFD5E5D5C1D8B48DBBB9D18 /* juce_Result.cpp */, - 0BCAC20DAB10B957168B85D6 /* juce_Result.h */, - F796260525BD82FFC1D1732C /* juce_Uuid.cpp */, - 215B159836CE40810964B773 /* juce_Uuid.h */, - 349C9FCEDC32E73DCB7AE806 /* juce_WindowsRegistry.h */, - ); - name = misc; - sourceTree = "<group>"; - }; - DE87FCC919AE658D7931F3BA /* positioning */ = { - isa = PBXGroup; - children = ( - C454DFC77F19AB044372610E /* juce_MarkerList.cpp */, - A93F302B8D91A997F54D231B /* juce_MarkerList.h */, - BB0BB31575E1377F0C560D53 /* juce_RelativeCoordinate.cpp */, - B43C27BEC3AB681389FC5FC5 /* juce_RelativeCoordinate.h */, - 75A4EEE127FAB86D65FF5F6E /* juce_RelativeCoordinatePositioner.cpp */, - EDAC82BD742A54182E8DF2FE /* juce_RelativeCoordinatePositioner.h */, - FD3A6BD3A8898E137DF257B9 /* juce_RelativeParallelogram.cpp */, - EF4A6E0E1232071252ACCD7B /* juce_RelativeParallelogram.h */, - 51926BEEA63BF141D93A5B36 /* juce_RelativePoint.cpp */, - C41504F388D0B181B003B627 /* juce_RelativePoint.h */, - 08907A4BA0D5628476D19C48 /* juce_RelativePointPath.cpp */, - 4A28A492852AEFBF508C1FC1 /* juce_RelativePointPath.h */, - DA30BA6BF482A353393D5926 /* juce_RelativeRectangle.cpp */, - DAA4306D30617137463ED247 /* juce_RelativeRectangle.h */, - ); - name = positioning; - sourceTree = "<group>"; - }; - DEA24DC5AC8325310FB40395 /* DataThreads */ = { - isa = PBXGroup; - children = ( - EBA825AF6FDB51EBA368CB8D /* rhythm-api */, - A3FB0EA0264580F6B00D993B /* RHD2000Thread.cpp */, - 23A6BA852B71DAAF3F709428 /* RHD2000Thread.h */, - 1718EC50691D8421EC00F8B3 /* FileReaderThread.cpp */, - 95B57108E929DD11F898B7B1 /* FileReaderThread.h */, - FA23A1334E4CFA77BC18A153 /* FPGAThread.cpp */, - 8751DF970A9E3598683BACAF /* FPGAThread.h */, - 788F8B7719B70465762B634B /* DataBuffer.cpp */, - F09FD6D9CA4997216ADBF54F /* DataBuffer.h */, - 9C089C090E400CC0E8BBB827 /* IntanThread.cpp */, - DD91BA89F53CB299B8A30B26 /* IntanThread.h */, - 92602D7166325C7232B85EDD /* DataThread.cpp */, - 0287B009511521BEAAE8A52C /* DataThread.h */, - ); - name = DataThreads; - sourceTree = "<group>"; - }; - E2198B85DAA7C61CCD912DD5 /* documents */ = { - isa = PBXGroup; - children = ( - D1F9878B45ABC403F3749567 /* juce_FileBasedDocument.cpp */, - C679AE9BBB9B1EE3BAB09E11 /* juce_FileBasedDocument.h */, - ); - name = documents; - sourceTree = "<group>"; - }; - E2F864696FA2DDDAD60C7E83 /* juce_audio_formats */ = { - isa = PBXGroup; - children = ( - 8A5AC1CA1E8CB52621B64DA4 /* format */, - 6DDA36A41852F78F61C4BA23 /* codecs */, - 147EC1A2CF770171DFB61105 /* sampler */, - D0E568AD5445AF061317E01D /* juce_module_info */, - 07FD5E530E9E6BFB2ACA4B8C /* juce_audio_formats.h */, - ); - name = juce_audio_formats; - sourceTree = "<group>"; - }; - E30221BFC59C887A6337E8C8 /* native */ = { - isa = PBXGroup; - children = ( - 89B0B267EF0A2A19A082EB86 /* juce_android_Fonts.cpp */, - 6DCDFF2618CFEECEACE87630 /* juce_android_GraphicsContext.cpp */, - D48EB74E1B5AAC7846196B01 /* juce_linux_Fonts.cpp */, - 3D100F6FDB04756402F3BCC9 /* juce_mac_CoreGraphicsContext.h */, - 6832130272774CD542793762 /* juce_mac_CoreGraphicsContext.mm */, - E33F167E4AA1C44596A1EBED /* juce_mac_CoreGraphicsHelpers.h */, - CA09B0483969444C7CD106DC /* juce_mac_Fonts.mm */, - B021D393D0E2625741512320 /* juce_RenderingHelpers.h */, - 603764889DE750F8E87F6428 /* juce_win32_Direct2DGraphicsContext.cpp */, - 7D36B006AE0B139D8A3D8641 /* juce_win32_DirectWriteTypeface.cpp */, - 55EBFCA56B915C8CD043365C /* juce_win32_DirectWriteTypeLayout.cpp */, - A0D768F1B92568344DAC9F0B /* juce_win32_Fonts.cpp */, - ); - name = native; - sourceTree = "<group>"; - }; - E3229181F8CC2BD5E409AF00 /* juce_gui_extra */ = { - isa = PBXGroup; - children = ( - 9ADB0069D1F40FF3865041E3 /* code_editor */, - E2198B85DAA7C61CCD912DD5 /* documents */, - 4DD214F6A346B4C4F28B3C5A /* embedding */, - 2A882D30C0E50E70FCD95554 /* lookandfeel */, - C8A65F145D072BB3DA28595B /* misc */, - 9924BF5224418D631DE02DA4 /* native */, - 1C639F4C139C8D7753AA9BB6 /* juce_module_info */, - 586448E180F8ACBF5A1565B0 /* juce_gui_extra.h */, - ); - name = juce_gui_extra; - sourceTree = "<group>"; - }; - E4BC8B84B396D69A78DD829B /* json */ = { - isa = PBXGroup; - children = ( - 8AA1009705E8A9531C707ED1 /* juce_JSON.cpp */, - 4179FCF100DC52282D0F9753 /* juce_JSON.h */, - ); - name = json; - sourceTree = "<group>"; - }; - E5D588C725B362D52B7F0801 /* threads */ = { - isa = PBXGroup; - children = ( - 47041E3794FA20F67F39AE63 /* juce_ChildProcess.cpp */, - 901DB6D5FE9134F2ADB9AE46 /* juce_ChildProcess.h */, - 4608E765A643BC0CB2C1BB02 /* juce_CriticalSection.h */, - 515213CC3271E8DEA8125D33 /* juce_DynamicLibrary.h */, - DE4861552DB1976665B25DFD /* juce_HighResolutionTimer.cpp */, - EAB6A66678B122C578B16445 /* juce_HighResolutionTimer.h */, - DB7866AFC8A4894810DBD05E /* juce_InterProcessLock.h */, - EA9518CDEA7049C21D5CE2D5 /* juce_Process.h */, - E34E535DA9CBF248E32F7B45 /* juce_ReadWriteLock.cpp */, - 113404D3FDE3745DF1E8D014 /* juce_ReadWriteLock.h */, - ABA3FCD5D762336535D56D94 /* juce_ScopedLock.h */, - 7C6921FE817699C1B95AEBF6 /* juce_ScopedReadLock.h */, - 2D20F49E12A7D313049E0258 /* juce_ScopedWriteLock.h */, - 36A9736F04AAA2F8E9D711BB /* juce_SpinLock.h */, - 222AC2E9BEFE12BE7FF88879 /* juce_Thread.cpp */, - 8EB76CA261F62A89B3D25F81 /* juce_Thread.h */, - A6736FBDFBB0B82E22D2B1C0 /* juce_ThreadLocalValue.h */, - 748E62D05C8FFF74DCA234C7 /* juce_ThreadPool.cpp */, - 0B382285EEDD8A3FDB45C074 /* juce_ThreadPool.h */, - 4133FE7830C52BBA035D82B8 /* juce_TimeSliceThread.cpp */, - DEE2959DBBC84EA8448A0F77 /* juce_TimeSliceThread.h */, - DAC81FECCE54087394BE69F7 /* juce_WaitableEvent.h */, - ); - name = threads; - sourceTree = "<group>"; - }; - EBA825AF6FDB51EBA368CB8D /* rhythm-api */ = { - isa = PBXGroup; - children = ( - 235A8987D99A191D07208D2F /* okFrontPanelDLL.cpp */, - 14F594C425F332F455A16D35 /* okFrontPanelDLL.h */, - ECB5A75A81B90327F58CBD9E /* rhd2000datablock.cpp */, - 80EEDD40F49120ADBE9DCBDF /* rhd2000datablock.h */, - 2D2BAC4320470CF68743F58E /* rhd2000evalboard.cpp */, - FA2F04BA4E146ABF649BBE89 /* rhd2000evalboard.h */, - 5DB3B3197F8C1E5EE159D6FC /* rhd2000registers.cpp */, - 8A989F74B1957BCB3B9BA398 /* rhd2000registers.h */, - ); - name = "rhythm-api"; - sourceTree = "<group>"; - }; - F196226BFBA15D76688C61C6 /* juce_cryptography */ = { - isa = PBXGroup; - children = ( - 7377EF4F37D5F898D74C4C2D /* encryption */, - 2A96C9BD7209F57EE8E19BBA /* hashing */, - 01859D6E7D95E44BD8E17D91 /* juce_module_info */, - C16065CD5A8054262B81C1A3 /* juce_cryptography.h */, - ); - name = juce_cryptography; - sourceTree = "<group>"; - }; - F61CCB10A356CE4278F74478 /* juce_events */ = { - isa = PBXGroup; - children = ( - 689A94018921FED3F037B194 /* messages */, - 530413F49A2E29570D8A9761 /* timers */, - 259BB14332EF6F524455BF3C /* broadcasters */, - D70BE7E6ECFBD4AD6F29AA64 /* interprocess */, - 0A3CD1724922FB098543C013 /* native */, - 31FDA03EF1B527B336FA6263 /* juce_module_info */, - CF758CB1E06DDA1AB7F5C9CC /* juce_events.h */, - ); - name = juce_events; - sourceTree = "<group>"; - }; - FA0E0597ED415901958AD5AE /* Products */ = { - isa = PBXGroup; - children = ( - 99E1BC08B886CFDD2CCFD462 /* open-ephys.app */, - ); - name = Products; - sourceTree = "<group>"; - }; - FCD30A3CA425C3FDE6CEBAED /* native */ = { - isa = PBXGroup; - children = ( - 0A42FFB89531588E51762D3E /* juce_android_Audio.cpp */, - 7D363D7B36A55EEB3198A827 /* juce_android_Midi.cpp */, - 21D3C1095D2B5A834D998B74 /* juce_android_OpenSL.cpp */, - FF1B5858C942CA02EEC38E69 /* juce_ios_Audio.cpp */, - 601654292170CD2D60E912A6 /* juce_linux_ALSA.cpp */, - B7D848E4F85AE11FDE4D164D /* juce_linux_AudioCDReader.cpp */, - FEF0A4E3C8D22A830BCE2B67 /* juce_linux_JackAudio.cpp */, - E8964C0BE264A55753BC6B7B /* juce_linux_Midi.cpp */, - 9FC97A1CFD250F7215B4E397 /* juce_mac_AudioCDBurner.mm */, - AEC2DABFC0517B4BE0CD704C /* juce_mac_AudioCDReader.mm */, - AF3E3AE70160C3392B237316 /* juce_mac_CoreAudio.cpp */, - 39422C7D01635DD9C00B5136 /* juce_mac_CoreMidi.cpp */, - 17CACEC7EA0A4B55A06A0993 /* juce_MidiDataConcatenator.h */, - B0A076D9536B6754F34E4606 /* juce_win32_ASIO.cpp */, - 6CBD8647DB17F1B58B14A3BC /* juce_win32_AudioCDBurner.cpp */, - F2F11D7C596DAE5579610CCC /* juce_win32_AudioCDReader.cpp */, - 5B7EC53FD2232CA799D6C018 /* juce_win32_DirectSound.cpp */, - 25DCA4D0E86DFB51AF637D21 /* juce_win32_Midi.cpp */, - E5B10AA248D400FDB2645084 /* juce_win32_WASAPI.cpp */, - ); - name = native; - sourceTree = "<group>"; - }; - FD67C32AD7A3D9BDC3CB7896 /* files */ = { - isa = PBXGroup; - children = ( - 0DE9D2FE41553B4D4316DD55 /* juce_DirectoryIterator.cpp */, - B2241E3C5C9F93389586F357 /* juce_DirectoryIterator.h */, - B4C52FC94D6C680C33ED85C9 /* juce_File.cpp */, - 108DF32ADFBA5CA48F928A92 /* juce_File.h */, - B2EF409A1F459E964756BA7C /* juce_FileInputStream.cpp */, - 5E663D5A55F191AB92A1383F /* juce_FileInputStream.h */, - DD5695DE97CEF7BE76869232 /* juce_FileOutputStream.cpp */, - F8322ED101601866FFB1698C /* juce_FileOutputStream.h */, - 21A0260D2DB039B81DF4970C /* juce_FileSearchPath.cpp */, - AE9359DBA841F88EF3DA9700 /* juce_FileSearchPath.h */, - AD960F561259904BA68DDA73 /* juce_MemoryMappedFile.h */, - 6EA1CC7DACDDBA863179521A /* juce_TemporaryFile.cpp */, - ECCE033FF2ACE42188FA4A7F /* juce_TemporaryFile.h */, - ); - name = files; - sourceTree = "<group>"; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 609761DEC9151D2CDD50270C /* open-ephys */ = { - isa = PBXNativeTarget; - buildConfigurationList = B0259CB1FA28CEC89ED4FA14 /* Build configuration list for PBXNativeTarget "open-ephys" */; - buildPhases = ( - 256EEB2E7946EFA9B0774D25 /* Resources */, - 0C1B429379FBBA77A635B49A /* Sources */, - 7BE915E5A64C787EBF13A8E7 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "open-ephys"; - productInstallPath = "$(HOME)/Applications"; - productName = "open-ephys"; - productReference = 99E1BC08B886CFDD2CCFD462 /* open-ephys.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 41375E3272D6505F75FDEEEB /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0440; - }; - buildConfigurationList = 3B096175C0B17BFA58475A08 /* Build configuration list for PBXProject "open-ephys" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = A7589AF92E6E958E1F866761 /* Source */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 609761DEC9151D2CDD50270C /* open-ephys */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 256EEB2E7946EFA9B0774D25 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2D2BDB63CBD0BED07FF9E44B /* RecentFilesMenuTemplate.nib in Resources */, - 4FA2949D3023FC2E377AFFB6 /* unibody-8.otf in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 0C1B429379FBBA77A635B49A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 14BDAEA656AAFA60334CC55C /* AccessClass.cpp in Sources */, - C853FCE2F6C91B3643322CF0 /* PracticalSocket.cpp in Sources */, - 00A0D05390DB9F2B74DDAA78 /* Bessel.cpp in Sources */, - 4AD3281B0CCF122A25E33667 /* Biquad.cpp in Sources */, - F505DF3C2BA492B5A2F28D05 /* Butterworth.cpp in Sources */, - B226387EB0FCE3BE6773FF61 /* Cascade.cpp in Sources */, - B3B08037F49EC7540586828F /* ChebyshevI.cpp in Sources */, - B6C73582C501D8C3C03A4860 /* ChebyshevII.cpp in Sources */, - 129ADFA8B25DE091AFA2D9E3 /* Custom.cpp in Sources */, - 285FF16149C85F2793EBCBAE /* Design.cpp in Sources */, - D19775DC99C67AD20F98EF17 /* Documentation.cpp in Sources */, - CB470032BC92A30906C96258 /* Elliptic.cpp in Sources */, - 4FEC4EC2796E37A3B11B50B9 /* Filter.cpp in Sources */, - A44FEA7117CFE2F06B9889B4 /* Legendre.cpp in Sources */, - C0E966234C8AF91C19CF6EA4 /* Param.cpp in Sources */, - BBE886EA79C50D0D68A5A753 /* PoleFilter.cpp in Sources */, - 9D17609E468FC65EB70ED7F4 /* RBJ.cpp in Sources */, - AE06672D2CBF8F64465B2126 /* RootFinder.cpp in Sources */, - 69630D3ECA4D6014EE3734CD /* State.cpp in Sources */, - 0AE243437B40602D35435C32 /* AudioComponent.cpp in Sources */, - FDCFDC9CC6D7A82131190FB0 /* ReferenceNode.cpp in Sources */, - 11D82BA398E9433440B76F66 /* PhaseDetector.cpp in Sources */, - EDEE5E21F0C9BDB7DB796083 /* AudioResamplingNode.cpp in Sources */, - C6F08BF3EF53274A42BB88EB /* Channel.cpp in Sources */, - DDDFAE2042D8AD20CC78CE3C /* ofArduino.cpp in Sources */, - 582C224AA50C9395810C8E27 /* ofSerial.cpp in Sources */, - 704484388E63CDE33491E1AB /* EventDetector.cpp in Sources */, - 1691EC0AC4C7083D65B925E2 /* FPGAOutput.cpp in Sources */, - AD032CEA5DBE4D4C76D3D2D1 /* ArduinoOutput.cpp in Sources */, - 9E8544C3983B3203530B5A49 /* Parameter.cpp in Sources */, - 685151FF4FB872983524A5C3 /* SpikeDisplayNode.cpp in Sources */, - 627C7B84F5FD275FAF43663A /* WiFiOutput.cpp in Sources */, - C59764685E62E7C4D323F84B /* LfpDisplayNode.cpp in Sources */, - E4DA638CDD4DD574A6CD843E /* RecordControl.cpp in Sources */, - 2B4A80DCF867DC025C21966B /* Merger.cpp in Sources */, - D0E9E20F9D8FDA700BB6D820 /* Splitter.cpp in Sources */, - 0BD17A4E45BB5A2A05731A1A /* SpikePlot.cpp in Sources */, - 23E05FAB008AC5755DB85BB5 /* BaseUIElement.cpp in Sources */, - 251E09656F171E3F0733B33C /* GenericAxes.cpp in Sources */, - AB6FC90FA7FACBC78BAD23F8 /* PlotUtils.cpp in Sources */, - 52472ED70173042204958538 /* ProjectionAxes.cpp in Sources */, - 895102FADC23C73AA37D79C1 /* WaveAxes.cpp in Sources */, - 19BB86C918F89D1377F8A0E1 /* SpikeObject.cpp in Sources */, - EE56A6BBBFA4A27A4BCF7279 /* SpikeDisplayCanvas.cpp in Sources */, - 1B620FC17AAECA4C5DE741E2 /* DataWindow.cpp in Sources */, - 5570682BF1A39FB3E3FAC182 /* LfpDisplayCanvas.cpp in Sources */, - 3C464BC802026D6EF6AD3818 /* OpenGLCanvas.cpp in Sources */, - ED8CB527B27C67E9E4DA027C /* SpikeDetector.cpp in Sources */, - DE758AF46844DF951655966C /* AudioNode.cpp in Sources */, - 80E5365461A5A7A32C48C563 /* EventNode.cpp in Sources */, - 0CEFF81CD8861F959DB13362 /* RecordControlEditor.cpp in Sources */, - 352F3875222B1D233013AAF9 /* ReferenceNodeEditor.cpp in Sources */, - F0EC60AEFAFF3D289F8110BE /* ResamplingNodeEditor.cpp in Sources */, - C3406F00595AEFF068EDB162 /* FPGAOutputEditor.cpp in Sources */, - 3A2E957EB8D117C535F119E9 /* ArduinoOutputEditor.cpp in Sources */, - 52AE3F7AEED81BA9ED5C4830 /* ChannelSelector.cpp in Sources */, - 3933895CA488855A23943F61 /* ParameterEditor.cpp in Sources */, - AF67C81811F18FCE6AA9C895 /* SpikeDisplayEditor.cpp in Sources */, - AA16BE5A6BBD024C8FCFCDA8 /* VisualizerEditor.cpp in Sources */, - 992137E90F9D41522FD56875 /* MergerEditor.cpp in Sources */, - 7F188166D38DA7FB23311413 /* ImageIcon.cpp in Sources */, - A454D138EC507C01D299AB0F /* WiFiOutputEditor.cpp in Sources */, - 784125612E2B7AC6CD89D835 /* EventNodeEditor.cpp in Sources */, - 21539690A9A5DD20AFAF41D3 /* SignalGeneratorEditor.cpp in Sources */, - 0836C50051EF59BF91D7B12D /* LfpDisplayEditor.cpp in Sources */, - 55CD2E9F373B69C3E8363B78 /* SourceNodeEditor.cpp in Sources */, - 2B29D90B985E9EB788472EFE /* SplitterEditor.cpp in Sources */, - D0873C347977633B4421B94D /* SpikeDetectorEditor.cpp in Sources */, - BF3254F07C15D467D6DB3FEF /* AudioEditor.cpp in Sources */, - 6029B20DF2BD523AC0F78896 /* FilterEditor.cpp in Sources */, - 6702EEA4E99D503C0EE933C4 /* GenericEditor.cpp in Sources */, - 89FCE8890946693CD5FC4A70 /* okFrontPanelDLL.cpp in Sources */, - C9AC286A46B3A1318F298DEF /* rhd2000datablock.cpp in Sources */, - DA836EC803E4FF4EDEBE6386 /* rhd2000evalboard.cpp in Sources */, - 702C9BFCE865CB6C6B8BFB0D /* rhd2000registers.cpp in Sources */, - 739573501D1D440A72C5C2E5 /* RHD2000Thread.cpp in Sources */, - 955561F4FF4484648FDB9F73 /* FileReaderThread.cpp in Sources */, - 6B67D7B6301182C7621294B6 /* FPGAThread.cpp in Sources */, - FAE745870674A07A65690433 /* DataBuffer.cpp in Sources */, - 96142DE6467CA74A74E669D4 /* IntanThread.cpp in Sources */, - 24CC7E9A7E87F762D4AB0467 /* DataThread.cpp in Sources */, - 66F3B79BDF9BFB631D7E3584 /* RecordNode.cpp in Sources */, - 996F9E4989EB47941D8100DA /* SignalGenerator.cpp in Sources */, - BE54C019A73BBAE05BFD7D17 /* ResamplingNode.cpp in Sources */, - 5AE42EF7A713B1EC0ACF9EDE /* FilterNode.cpp in Sources */, - 71111DE81104B1536ECB6DFB /* SourceNode.cpp in Sources */, - 85A60568B3DC342C76B4E679 /* GenericProcessor.cpp in Sources */, - 8A5BACA019DA9B0EFAD5CE93 /* ProcessorGraph.cpp in Sources */, - 95AE939ADE096394CCD2526F /* EditorViewportButtons.cpp in Sources */, - E85DA5FC9A162F129ABA7113 /* SignalChainManager.cpp in Sources */, - 6A13D8F42A330E2C410B43E3 /* EditorViewport.cpp in Sources */, - 13F1111511DD01E843E631CA /* ProcessorList.cpp in Sources */, - 9A80E3D1D1758A31D2169497 /* CustomLookAndFeel.cpp in Sources */, - F4397EAE00E0B9F96C8B6C07 /* InfoLabel.cpp in Sources */, - 09673DA3B4D6EA61DEFC0C46 /* DataViewport.cpp in Sources */, - 591CED1277A8C945EF60841C /* MessageCenter.cpp in Sources */, - 58D3FF3B1F462634167BDFB5 /* ControlPanel.cpp in Sources */, - 3162B66BC8118715AAA527D7 /* UIComponent.cpp in Sources */, - 004E78BC139419671A9EA137 /* MainWindow.cpp in Sources */, - 6306AA945375749C4FE834E6 /* Main.cpp in Sources */, - AD7D05519200FB0EE1C7617A /* BinaryData.cpp in Sources */, - C2475E008FEB33B3EA7B6C7F /* juce_audio_basics.mm in Sources */, - 9227961C07C0EE73E89C90B5 /* juce_audio_devices.mm in Sources */, - A2EE65335FB2810C04ECBFAF /* juce_audio_formats.mm in Sources */, - 3FF289281D3318A7BA8BB44D /* juce_audio_processors.mm in Sources */, - 9E30156DBCE4EAF9EFAF0AC4 /* juce_audio_utils.mm in Sources */, - 6510492BAE00C95DC620F493 /* juce_core.mm in Sources */, - 06BCB79AE267E5841F641E38 /* juce_cryptography.mm in Sources */, - A0DAD4E5F7583349DC9275F2 /* juce_data_structures.mm in Sources */, - FCB767F14565886C9D823916 /* juce_events.mm in Sources */, - 7015D104F55D5B128341CEA8 /* juce_graphics.mm in Sources */, - A269A876BDF3B7011FA4C681 /* juce_gui_basics.mm in Sources */, - 58E0EC510F2A88E14AE55439 /* juce_gui_extra.mm in Sources */, - 002427B013C43CE3E6D4E9B5 /* juce_opengl.mm in Sources */, - FA2A052548AAD146F3F5AD83 /* juce_video.mm in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 747300E66AC17ACE193A6C37 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_INLINES_ARE_PRIVATE_EXTERN = YES; - GCC_MODEL_TUNING = G5; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; - GCC_WARN_MISSING_PARENTHESES = YES; - GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; - GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - PRODUCT_NAME = "open-ephys"; - WARNING_CFLAGS = "-Wreorder"; - ZERO_LINK = NO; - }; - name = Release; - }; - 7A6F9B742B69F66DC3E29FA8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; - CLANG_LINK_OBJC_RUNTIME = NO; - COMBINE_HIDPI_IMAGES = YES; - CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)"; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_OPTIMIZATION_LEVEL = 3; - GCC_PREPROCESSOR_DEFINITIONS = ( - "_NDEBUG=1", - "NDEBUG=1", - "JUCER_XCODE_MAC_F6D2F4CF=1", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = YES; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - HEADER_SEARCH_PATHS = ( - ../../JuceLibraryCode, - "$(inherited),", - /usr/local/include/freetype2, - /opt/local/include, - /usr/local/include, - ); + 0D3DFADD627629AD52668186 = { isa = PBXBuildFile; fileRef = 39F287BE4C0B4F3BD4A949FD; }; + 38568B2E6C61E2F07173B568 = { isa = PBXBuildFile; fileRef = C868329EBC1BBA606AB2EB88; }; + C8D7AC0B88A9A2C182B2B752 = { isa = PBXBuildFile; fileRef = DBB769DEBCD6468C13A3CD25; }; + A94130738A9973148544664A = { isa = PBXBuildFile; fileRef = F5A00ACFA3D76168F22F1205; }; + E5CBEA12D7AD7788C9BF5737 = { isa = PBXBuildFile; fileRef = 27313EA12BC45638321922CA; }; + 9212DC2AEE118398CC970DDF = { isa = PBXBuildFile; fileRef = 243817BA562AD7FA76C834C9; }; + 3D0C7CA4AD9E3963D52E89BD = { isa = PBXBuildFile; fileRef = D685CFEA6344360FBFC355B6; }; + 3130878C465F3294A89CA142 = { isa = PBXBuildFile; fileRef = E31563D2E7DDD8315F369233; }; + E100912B2FCE36A30D097C95 = { isa = PBXBuildFile; fileRef = 9C21DBFB38865E5AFE367C6F; }; + CAB9D9DEF279F93132B45F90 = { isa = PBXBuildFile; fileRef = 80C1B737D2C2CB519D1787D7; }; + CA4DCF67B48352BE633A616D = { isa = PBXBuildFile; fileRef = C055D09224D84121A3EBB29F; }; + FD4865450F4C47FF3C6327FE = { isa = PBXBuildFile; fileRef = 56169D835A3E3029D6E3904C; }; + 512D7D16D0A95BDD0D6D6E45 = { isa = PBXBuildFile; fileRef = 4FD13AA663EEE7CC2F83033D; }; + 2D2BDB63CBD0BED07FF9E44B = { isa = PBXBuildFile; fileRef = BBE1DB78E35135B41537DCB5; }; + 4FA2949D3023FC2E377AFFB6 = { isa = PBXBuildFile; fileRef = 61317B5191E05925F232E18C; }; + 14BDAEA656AAFA60334CC55C = { isa = PBXBuildFile; fileRef = 420B0E95F1300ABFDC125DBF; }; + C853FCE2F6C91B3643322CF0 = { isa = PBXBuildFile; fileRef = 9F577889CB6C54A2F7B1CA80; }; + 00A0D05390DB9F2B74DDAA78 = { isa = PBXBuildFile; fileRef = 1989E86F8DFDE34887AC0326; }; + 4AD3281B0CCF122A25E33667 = { isa = PBXBuildFile; fileRef = 22801F75289646F6A85E5583; }; + F505DF3C2BA492B5A2F28D05 = { isa = PBXBuildFile; fileRef = B47B3368AA1A182B0CA1AB26; }; + B226387EB0FCE3BE6773FF61 = { isa = PBXBuildFile; fileRef = 09BCBD414282A3AA4F66A3A5; }; + B3B08037F49EC7540586828F = { isa = PBXBuildFile; fileRef = AC2CFF4DA5CE431FCC628BA3; }; + B6C73582C501D8C3C03A4860 = { isa = PBXBuildFile; fileRef = B767A249792EB15A87054409; }; + 129ADFA8B25DE091AFA2D9E3 = { isa = PBXBuildFile; fileRef = D8D895B3AD895C6E7FD446BF; }; + 285FF16149C85F2793EBCBAE = { isa = PBXBuildFile; fileRef = 2B93450006102A0093F5EACB; }; + D19775DC99C67AD20F98EF17 = { isa = PBXBuildFile; fileRef = E90FCB43DA2FF766597DA75E; }; + CB470032BC92A30906C96258 = { isa = PBXBuildFile; fileRef = 392408C1943AC6234BAAC743; }; + 4FEC4EC2796E37A3B11B50B9 = { isa = PBXBuildFile; fileRef = 587FCA2485B9C89C2A99C23A; }; + A44FEA7117CFE2F06B9889B4 = { isa = PBXBuildFile; fileRef = C4B0DF8094C90543A65E03E3; }; + C0E966234C8AF91C19CF6EA4 = { isa = PBXBuildFile; fileRef = 3F6C67E29CDEDF2EF61C054F; }; + BBE886EA79C50D0D68A5A753 = { isa = PBXBuildFile; fileRef = 65312FAD0900119CDF6CF414; }; + 9D17609E468FC65EB70ED7F4 = { isa = PBXBuildFile; fileRef = 9A21A229CFACC67E31F4F727; }; + AE06672D2CBF8F64465B2126 = { isa = PBXBuildFile; fileRef = 3F69480D6145C77992FA59BA; }; + 69630D3ECA4D6014EE3734CD = { isa = PBXBuildFile; fileRef = C1CB526B75E406851FA918C6; }; + 0AE243437B40602D35435C32 = { isa = PBXBuildFile; fileRef = B04D87ED6AA4897B6CD3CCF6; }; + FDCFDC9CC6D7A82131190FB0 = { isa = PBXBuildFile; fileRef = BBD9C2AED6F500D090069007; }; + 11D82BA398E9433440B76F66 = { isa = PBXBuildFile; fileRef = 9FFD9560522567A033226BD7; }; + EDEE5E21F0C9BDB7DB796083 = { isa = PBXBuildFile; fileRef = 76F569AE7B444D8F69EE0E86; }; + C6F08BF3EF53274A42BB88EB = { isa = PBXBuildFile; fileRef = 9BC055494F9FEE3F90630541; }; + DDDFAE2042D8AD20CC78CE3C = { isa = PBXBuildFile; fileRef = 3753B3B311AE0A9F4CC5AD40; }; + 582C224AA50C9395810C8E27 = { isa = PBXBuildFile; fileRef = 308F614D30DCB9AE3767C928; }; + 704484388E63CDE33491E1AB = { isa = PBXBuildFile; fileRef = 39464D2A22940DA2DDCCCFC6; }; + 1691EC0AC4C7083D65B925E2 = { isa = PBXBuildFile; fileRef = 9D78F50147005EDB0E89E2B4; }; + AD032CEA5DBE4D4C76D3D2D1 = { isa = PBXBuildFile; fileRef = D38E60AC4854B6E1EDE488EB; }; + 9E8544C3983B3203530B5A49 = { isa = PBXBuildFile; fileRef = CD2370F8F4A44446558A08FB; }; + 685151FF4FB872983524A5C3 = { isa = PBXBuildFile; fileRef = DAA04A0FD47097893712B241; }; + 627C7B84F5FD275FAF43663A = { isa = PBXBuildFile; fileRef = 2D41C43686CDE35E86A389D7; }; + C59764685E62E7C4D323F84B = { isa = PBXBuildFile; fileRef = EA535EA158451360B7B8AE52; }; + E4DA638CDD4DD574A6CD843E = { isa = PBXBuildFile; fileRef = 258938780F93A7CF41366F26; }; + 2B4A80DCF867DC025C21966B = { isa = PBXBuildFile; fileRef = 4867923F31CC3EDC9B1A5BE5; }; + D0E9E20F9D8FDA700BB6D820 = { isa = PBXBuildFile; fileRef = 2C4730CAFED4F6292B575318; }; + 19BB86C918F89D1377F8A0E1 = { isa = PBXBuildFile; fileRef = 5894D40A0E8FA6E9B3EBF9D9; }; + EE56A6BBBFA4A27A4BCF7279 = { isa = PBXBuildFile; fileRef = A7D4C9E3ED3763847C087F46; }; + 1B620FC17AAECA4C5DE741E2 = { isa = PBXBuildFile; fileRef = 66463AB11EA4D6341C32F27E; }; + 5570682BF1A39FB3E3FAC182 = { isa = PBXBuildFile; fileRef = 4A94E809624F99387E600399; }; + 3C464BC802026D6EF6AD3818 = { isa = PBXBuildFile; fileRef = F2FDC07162CAEDE524F09CFC; }; + ED8CB527B27C67E9E4DA027C = { isa = PBXBuildFile; fileRef = BC3B7E4E25505D9044BFACC7; }; + DE758AF46844DF951655966C = { isa = PBXBuildFile; fileRef = B27F558F42AC78F0E564B5AF; }; + 80E5365461A5A7A32C48C563 = { isa = PBXBuildFile; fileRef = F94DD42C7BBF81C101D3F605; }; + AF26E388BF6536803E762CB1 = { isa = PBXBuildFile; fileRef = 45D78C8EF660EECE64BAA33F; }; + 0CEFF81CD8861F959DB13362 = { isa = PBXBuildFile; fileRef = 1552007C6C6AF750278C5BE5; }; + 352F3875222B1D233013AAF9 = { isa = PBXBuildFile; fileRef = 9C39C584DA6F507E773687EE; }; + F0EC60AEFAFF3D289F8110BE = { isa = PBXBuildFile; fileRef = C5ABE6BDCA91410BA92A7BD9; }; + C3406F00595AEFF068EDB162 = { isa = PBXBuildFile; fileRef = 169F1B20FC9FFE88C53D2735; }; + 3A2E957EB8D117C535F119E9 = { isa = PBXBuildFile; fileRef = 1AD76E8111A738A8F3717060; }; + 52AE3F7AEED81BA9ED5C4830 = { isa = PBXBuildFile; fileRef = E216D095C98F850A5FB6FB0F; }; + 3933895CA488855A23943F61 = { isa = PBXBuildFile; fileRef = 46E3A634686BFEF787229582; }; + AF67C81811F18FCE6AA9C895 = { isa = PBXBuildFile; fileRef = 1EC95CD1D830F6D85ADB3B9D; }; + AA16BE5A6BBD024C8FCFCDA8 = { isa = PBXBuildFile; fileRef = CAA3B9396EA62166234DAEF1; }; + 992137E90F9D41522FD56875 = { isa = PBXBuildFile; fileRef = 29FD7B383C5DDACAA7B8DFD3; }; + 7F188166D38DA7FB23311413 = { isa = PBXBuildFile; fileRef = 04C6B933E1603B4D0916570D; }; + A454D138EC507C01D299AB0F = { isa = PBXBuildFile; fileRef = C79249376E3FDF10615E16EA; }; + 784125612E2B7AC6CD89D835 = { isa = PBXBuildFile; fileRef = 70151263C4CB8A4F79431E11; }; + 21539690A9A5DD20AFAF41D3 = { isa = PBXBuildFile; fileRef = 9136BD46BE1E28A96FBBD440; }; + 0836C50051EF59BF91D7B12D = { isa = PBXBuildFile; fileRef = 8A91849BE6B96EB8C0663469; }; + 55CD2E9F373B69C3E8363B78 = { isa = PBXBuildFile; fileRef = 6328434A329C353DB8D9512C; }; + 2B29D90B985E9EB788472EFE = { isa = PBXBuildFile; fileRef = D51315B4241B019BE43EE4F1; }; + D0873C347977633B4421B94D = { isa = PBXBuildFile; fileRef = A252FE4E6A360CBC4AF694B3; }; + BF3254F07C15D467D6DB3FEF = { isa = PBXBuildFile; fileRef = 10BE33089BA6F3468F36CD6C; }; + 6029B20DF2BD523AC0F78896 = { isa = PBXBuildFile; fileRef = D90290A0AA2C36CE757E46D5; }; + 6702EEA4E99D503C0EE933C4 = { isa = PBXBuildFile; fileRef = D3AE8303545E28D793312F46; }; + 89FCE8890946693CD5FC4A70 = { isa = PBXBuildFile; fileRef = 235A8987D99A191D07208D2F; }; + C9AC286A46B3A1318F298DEF = { isa = PBXBuildFile; fileRef = ECB5A75A81B90327F58CBD9E; }; + DA836EC803E4FF4EDEBE6386 = { isa = PBXBuildFile; fileRef = 2D2BAC4320470CF68743F58E; }; + 702C9BFCE865CB6C6B8BFB0D = { isa = PBXBuildFile; fileRef = 5DB3B3197F8C1E5EE159D6FC; }; + 739573501D1D440A72C5C2E5 = { isa = PBXBuildFile; fileRef = A3FB0EA0264580F6B00D993B; }; + 955561F4FF4484648FDB9F73 = { isa = PBXBuildFile; fileRef = 1718EC50691D8421EC00F8B3; }; + 6B67D7B6301182C7621294B6 = { isa = PBXBuildFile; fileRef = FA23A1334E4CFA77BC18A153; }; + FAE745870674A07A65690433 = { isa = PBXBuildFile; fileRef = 788F8B7719B70465762B634B; }; + 96142DE6467CA74A74E669D4 = { isa = PBXBuildFile; fileRef = 9C089C090E400CC0E8BBB827; }; + 24CC7E9A7E87F762D4AB0467 = { isa = PBXBuildFile; fileRef = 92602D7166325C7232B85EDD; }; + 66F3B79BDF9BFB631D7E3584 = { isa = PBXBuildFile; fileRef = A4E2CAAF556D557B24182414; }; + 996F9E4989EB47941D8100DA = { isa = PBXBuildFile; fileRef = 5522973FA48A13C6BED293FE; }; + BE54C019A73BBAE05BFD7D17 = { isa = PBXBuildFile; fileRef = A98A22CF5F208ED6DBE08063; }; + 5AE42EF7A713B1EC0ACF9EDE = { isa = PBXBuildFile; fileRef = B0E8FAD5AC445F612E3468B9; }; + 71111DE81104B1536ECB6DFB = { isa = PBXBuildFile; fileRef = ECA6FDB1366BE7EC30F1539B; }; + 85A60568B3DC342C76B4E679 = { isa = PBXBuildFile; fileRef = 3AE038CACE48AF85C4FB1ED5; }; + 8A5BACA019DA9B0EFAD5CE93 = { isa = PBXBuildFile; fileRef = 555D34D0CD8776EE5996CC3A; }; + 95AE939ADE096394CCD2526F = { isa = PBXBuildFile; fileRef = 9F3B3184EC6D42CEA35D6ED8; }; + E85DA5FC9A162F129ABA7113 = { isa = PBXBuildFile; fileRef = 0987F7E90136D0E08A606A22; }; + 6A13D8F42A330E2C410B43E3 = { isa = PBXBuildFile; fileRef = 7E875E681E18D693D5ADB2FB; }; + 13F1111511DD01E843E631CA = { isa = PBXBuildFile; fileRef = 79C91DDF3BC3F15D0338E504; }; + 9A80E3D1D1758A31D2169497 = { isa = PBXBuildFile; fileRef = 3774BBCA6CB133D9A854CF71; }; + F4397EAE00E0B9F96C8B6C07 = { isa = PBXBuildFile; fileRef = 17E13CCDA0C82F92EAB05BE6; }; + 09673DA3B4D6EA61DEFC0C46 = { isa = PBXBuildFile; fileRef = 47A3942AC30A3212C01F1CAF; }; + 591CED1277A8C945EF60841C = { isa = PBXBuildFile; fileRef = 7BD2C39F13FDE202141C4B41; }; + 58D3FF3B1F462634167BDFB5 = { isa = PBXBuildFile; fileRef = 610E487E060C42B52FD5AAC9; }; + 3162B66BC8118715AAA527D7 = { isa = PBXBuildFile; fileRef = D2A3B4CDD296B4CEC6902FD7; }; + 004E78BC139419671A9EA137 = { isa = PBXBuildFile; fileRef = E08E877C3A6283CF5C803957; }; + 6306AA945375749C4FE834E6 = { isa = PBXBuildFile; fileRef = 2C89EC72FF6A7118EF459DC3; }; + AD7D05519200FB0EE1C7617A = { isa = PBXBuildFile; fileRef = A512C5B237A77EF6FB8E11A0; }; + C2475E008FEB33B3EA7B6C7F = { isa = PBXBuildFile; fileRef = DF3C9A1DD67E879E4E0A2727; }; + 9227961C07C0EE73E89C90B5 = { isa = PBXBuildFile; fileRef = 65F4459CC1832883FFF6C166; }; + A2EE65335FB2810C04ECBFAF = { isa = PBXBuildFile; fileRef = 6B28CEAF75E22F2CCCACBCC7; }; + 3FF289281D3318A7BA8BB44D = { isa = PBXBuildFile; fileRef = B20469D88488F0809126CC80; }; + 9E30156DBCE4EAF9EFAF0AC4 = { isa = PBXBuildFile; fileRef = 56728EC77C65482B9C86FF4D; }; + 6510492BAE00C95DC620F493 = { isa = PBXBuildFile; fileRef = A6A579E4E4AEA865BC71148C; }; + 06BCB79AE267E5841F641E38 = { isa = PBXBuildFile; fileRef = 488D1B00C9E5FE4DAB035EDF; }; + A0DAD4E5F7583349DC9275F2 = { isa = PBXBuildFile; fileRef = DBCA7E2FFCFD1354DD19DDD6; }; + FCB767F14565886C9D823916 = { isa = PBXBuildFile; fileRef = C29E664781AA2396C8D59543; }; + 7015D104F55D5B128341CEA8 = { isa = PBXBuildFile; fileRef = BBDFB328C3D5FC72A0446E6A; }; + A269A876BDF3B7011FA4C681 = { isa = PBXBuildFile; fileRef = 23609D430A25F54723269E91; }; + 58E0EC510F2A88E14AE55439 = { isa = PBXBuildFile; fileRef = 27DC0E650D6D54DF29E6DB68; }; + 002427B013C43CE3E6D4E9B5 = { isa = PBXBuildFile; fileRef = 5915DB02FB7CA8CEC1BF38A9; }; + FA2A052548AAD146F3F5AD83 = { isa = PBXBuildFile; fileRef = 4A7695E93CE32F4E95042FCB; }; + 0052A4FD257928E5D83927E6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WavAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 01859D6E7D95E44BD8E17D91 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_cryptography/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 018F4E079EB12A78C4F8F773 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiBuffer.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h"; sourceTree = "SOURCE_ROOT"; }; + 01C313C323E5CB995C939E0B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Component.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp"; sourceTree = "SOURCE_ROOT"; }; + 01D791730840EB0BA7FD61BA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Socket.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_Socket.h"; sourceTree = "SOURCE_ROOT"; }; + 020205BB77179A9BE3FFF1E1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_QuickTimeMovieComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_win32_QuickTimeMovieComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0242AB5BCD8C002DC2E30BAC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiOutput.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h"; sourceTree = "SOURCE_ROOT"; }; + 027C1143CC66EA8F73C39A74 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadWithProgressWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 0287B009511521BEAAE8A52C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataThread.h; path = ../../Source/Processors/DataThreads/DataThread.h; sourceTree = "SOURCE_ROOT"; }; + 028D4D3C0862B4B1312E2395 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SourceNodeEditor.h; path = ../../Source/Processors/Editors/SourceNodeEditor.h; sourceTree = "SOURCE_ROOT"; }; + 02DA588D3B873F1971ACD912 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FlacAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0316B49B86725305C70783CA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioPluginFormatManager.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 033AE5DE19F0EEDC47D41C80 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooserDialogBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + 03D7B457E0915E43A6AFF4B4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioUnitPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 04C474E0F2F7FDEC714A673C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PathIterator.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp"; sourceTree = "SOURCE_ROOT"; }; + 04C6B933E1603B4D0916570D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ImageIcon.cpp; path = ../../Source/Processors/Editors/ImageIcon.cpp; sourceTree = "SOURCE_ROOT"; }; + 04ED2387517934A84ACF9865 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BubbleComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 05997833A4AA137FD64348AD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextDragAndDropTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 05BD169B8574607A6F6AD3B6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Identifier.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp"; sourceTree = "SOURCE_ROOT"; }; + 05C35036E964AAD6024E0766 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "MergerA-01.png"; path = "../../Resources/Images/Buttons/MergerA-01.png"; sourceTree = "SOURCE_ROOT"; }; + 05DCAE8CA29532E2169D7AC1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Matrix3D.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_Matrix3D.h"; sourceTree = "SOURCE_ROOT"; }; + 06072EC6BCD3B7D8C17C2402 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessor.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 078625CF5C083AD538D23401 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0790CCE2FCFDFA6944DFC402 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PopupMenu.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp"; sourceTree = "SOURCE_ROOT"; }; + 07FD5E530E9E6BFB2ACA4B8C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_formats.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h"; sourceTree = "SOURCE_ROOT"; }; + 081E86FE0B991469CFA8D7EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CPlusPlusCodeTokeniser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 085F51FEE5C5FDAA321090A0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; }; + 087FA26464FB283EC6FD4795 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_NamedPipe.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp"; sourceTree = "SOURCE_ROOT"; }; + 08907A4BA0D5628476D19C48 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativePointPath.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp"; sourceTree = "SOURCE_ROOT"; }; + 08A7A7FD7D77C0657270E9BF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableText.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp"; sourceTree = "SOURCE_ROOT"; }; + 08DAD5894A480950C66F5873 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ArrowButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h"; sourceTree = "SOURCE_ROOT"; }; + 09160DF53438B400BFE85E07 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputSource.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h"; sourceTree = "SOURCE_ROOT"; }; + 0987F7E90136D0E08A606A22 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SignalChainManager.cpp; path = ../../Source/UI/SignalChainManager.cpp; sourceTree = "SOURCE_ROOT"; }; + 09A159213372995F3CCEB85B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_String.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_String.h"; sourceTree = "SOURCE_ROOT"; }; + 09BCBD414282A3AA4F66A3A5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Cascade.cpp; path = ../../Source/Dsp/Cascade.cpp; sourceTree = "SOURCE_ROOT"; }; + 0A2AD4AB14F93364EFB9611E = { isa = PBXFileReference; lastKnownFileType = file.ttf; name = "miso-regular.ttf"; path = "../../Resources/Fonts/miso-regular.ttf"; sourceTree = "SOURCE_ROOT"; }; + 0A351ED88CF00C0697701E73 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Logger.h"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.h"; sourceTree = "SOURCE_ROOT"; }; + 0A413228C75C046CE683E0E6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_String.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_String.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0A42FFB89531588E51762D3E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Audio.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0A46EF94E558D5E19F96E646 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Timer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0A8BC957DBEE226346C1EA25 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BigInteger.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0AA8F001A50408977E76ED96 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RecentlyOpenedFilesList.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0AAFE3F4D106138401C190C5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GlowEffect.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0B2502A656E77E00AF15A343 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandInfo.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h"; sourceTree = "SOURCE_ROOT"; }; + 0B2B7732073D56E484950C8D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RecordControlEditor.h; path = ../../Source/Processors/Editors/RecordControlEditor.h; sourceTree = "SOURCE_ROOT"; }; + 0B382285EEDD8A3FDB45C074 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadPool.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h"; sourceTree = "SOURCE_ROOT"; }; + 0B5B63E563EFA7E816DE3DCA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 0BB4380EDFEAAE0DAB255B90 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BlowFish.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0BCAC20DAB10B957168B85D6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Result.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Result.h"; sourceTree = "SOURCE_ROOT"; }; + 0C646E9950FB580B21E1F2BD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WindowsMediaAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0CCB1C4D687001E04DE1DD9C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SubregionStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0CCE619599DB39323E49FF3C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ResamplingNodeEditor.h; path = ../../Source/Processors/Editors/ResamplingNodeEditor.h; sourceTree = "SOURCE_ROOT"; }; + 0D3C20D1F00B7B1381E6B987 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TabbedButtonBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0D884C2CF25F23CE6B99B2A1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Singleton.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h"; sourceTree = "SOURCE_ROOT"; }; + 0D8ECE32F7D0FE74185F6EF4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertyPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h"; sourceTree = "SOURCE_ROOT"; }; + 0DBB88B6BEC06FCECE4CBD28 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandInfo.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0DD0CBF9BBD4A503F2B7868D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListenerList.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h"; sourceTree = "SOURCE_ROOT"; }; + 0DE9D2FE41553B4D4316DD55 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryIterator.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0E4B0B8425DBA19B6F3FE4BF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UIViewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_UIViewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 0E98E81084F183B8426EDA7F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DynamicObject.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h"; sourceTree = "SOURCE_ROOT"; }; + 0FA84E49DB493BCC886A355F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MD5.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.h"; sourceTree = "SOURCE_ROOT"; }; + 0FDD7551AC98348D4A98ADC7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProcessorGraph.h; path = ../../Source/Processors/ProcessorGraph.h; sourceTree = "SOURCE_ROOT"; }; + 0FE8ACC50ED8E7FFC9E6B9B4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ControlPanel.h; path = ../../Source/UI/ControlPanel.h; sourceTree = "SOURCE_ROOT"; }; + 105B1452DF6CE1D80D69A9D1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProcessorList.h; path = ../../Source/UI/ProcessorList.h; sourceTree = "SOURCE_ROOT"; }; + 106E81B939C6B35E34DD71FE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeEditorComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 1086169B0EE86E04B64575C2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Dsp.h; path = ../../Source/Dsp/Dsp.h; sourceTree = "SOURCE_ROOT"; }; + 108DF32ADFBA5CA48F928A92 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_File.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_File.h"; sourceTree = "SOURCE_ROOT"; }; + 10BE33089BA6F3468F36CD6C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioEditor.cpp; path = ../../Source/Processors/Editors/AudioEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 113404D3FDE3745DF1E8D014 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReadWriteLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h"; sourceTree = "SOURCE_ROOT"; }; + 1191BF3048664183033BFF89 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadowEffect.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1194EE0956A9645270582979 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Messaging.cpp"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; + 11A5824E0239C86801BE2EB8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseEvent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h"; sourceTree = "SOURCE_ROOT"; }; + 11D619EEF63C1827EA91F593 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UndoManager.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1246C8A62803B7E115713705 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LocalisedStrings.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp"; sourceTree = "SOURCE_ROOT"; }; + 12B5243A9435FABAFBE20165 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Quaternion.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_Quaternion.h"; sourceTree = "SOURCE_ROOT"; }; + 12B5DDCB6E5ECD93A4C55BB5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LfpDisplayCanvas.h; path = ../../Source/Processors/Visualization/LfpDisplayCanvas.h; sourceTree = "SOURCE_ROOT"; }; + 1307DAE32BA702565A67D127 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiFile.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + 13212C01A5E138553FAFBE9C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Drawable.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp"; sourceTree = "SOURCE_ROOT"; }; + 13D9868B08E941F6827E157C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 13D9DC48F19699485F9888A4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PathIterator.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h"; sourceTree = "SOURCE_ROOT"; }; + 1463D2DAB3A1D8CEE825056A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioCDReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h"; sourceTree = "SOURCE_ROOT"; }; + 146C6A6E3C6B17F2AF475B50 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLFrameBuffer.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 14DD0220B41F74C01A9DC676 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlyphArrangement.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h"; sourceTree = "SOURCE_ROOT"; }; + 14F594C425F332F455A16D35 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = okFrontPanelDLL.h; path = "../../Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.h"; sourceTree = "SOURCE_ROOT"; }; + 14FE601229C9A40C6E182F28 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MouseCursor.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm"; sourceTree = "SOURCE_ROOT"; }; + 1518D2BA7FCAF267EF1F02E6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Windowing.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; }; + 154303EE3929F26B93792187 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SourceNode.h; path = ../../Source/Processors/SourceNode.h; sourceTree = "SOURCE_ROOT"; }; + 1552007C6C6AF750278C5BE5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RecordControlEditor.cpp; path = ../../Source/Processors/Editors/RecordControlEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 159790C750B1F8B485DBB499 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 161E095C716133CB255B6CCD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiKeyboardState.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h"; sourceTree = "SOURCE_ROOT"; }; + 167524110873F9888CF1B9E8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandID.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h"; sourceTree = "SOURCE_ROOT"; }; + 168823A9EBD85BFBFD2CE2EE = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons-03.png"; path = "../../Resources/Images/Icons/RadioButtons-03.png"; sourceTree = "SOURCE_ROOT"; }; + 169F1B20FC9FFE88C53D2735 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FPGAOutputEditor.cpp; path = ../../Source/Processors/Editors/FPGAOutputEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 1712916024EC787B6C231732 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-03.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-03.png"; sourceTree = "SOURCE_ROOT"; }; + 1718EC50691D8421EC00F8B3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FileReaderThread.cpp; path = ../../Source/Processors/DataThreads/FileReaderThread.cpp; sourceTree = "SOURCE_ROOT"; }; + 1719507D8A73EA71F1C3F306 = { isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-plain-serialized"; path = "../../Resources/Fonts/cpmono-plain-serialized"; sourceTree = "SOURCE_ROOT"; }; + 172FA5C9EC4B16BC0C45F269 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Variant.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.h"; sourceTree = "SOURCE_ROOT"; }; + 174842EA681FA29BE38A6272 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ButtonPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1777330D3BDAE99A93F98943 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Font.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h"; sourceTree = "SOURCE_ROOT"; }; + 178AD28BF5BC92B58A3A3539 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MixerAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 17B29FF3D3EA14EF2BE149BB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentBoundsConstrainer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 17CACEC7EA0A4B55A06A0993 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiDataConcatenator.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h"; sourceTree = "SOURCE_ROOT"; }; + 17CE6B2913E72ED8727ECD56 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioResamplingNode.h; path = ../../Source/Processors/AudioResamplingNode.h; sourceTree = "SOURCE_ROOT"; }; + 17E13CCDA0C82F92EAB05BE6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = InfoLabel.cpp; path = ../../Source/UI/InfoLabel.cpp; sourceTree = "SOURCE_ROOT"; }; + 17FB020EFEAED8493D3CB121 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 1819C1C4DE5FEEDEA143E3D2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MainMenu.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MainMenu.mm"; sourceTree = "SOURCE_ROOT"; }; + 18A730DF335EEB3A4D13FDCA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MessageManager.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 18B410DA5435C02C82BA13F8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BooleanPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 18C2F9CA38393D106FB834E2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioPluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 18CFDBCD4A5B80E78DADCFEB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RectanglePlacement.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp"; sourceTree = "SOURCE_ROOT"; }; + 19043050D1DADAEAB48FB803 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioCDBurner.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h"; sourceTree = "SOURCE_ROOT"; }; + 19148DBA36B94FA639DF3A72 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CustomLookAndFeel.h; path = ../../Source/UI/CustomLookAndFeel.h; sourceTree = "SOURCE_ROOT"; }; + 193FED8339417E8E6264957A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ElementComparator.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h"; sourceTree = "SOURCE_ROOT"; }; + 1989E86F8DFDE34887AC0326 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Bessel.cpp; path = ../../Source/Dsp/Bessel.cpp; sourceTree = "SOURCE_ROOT"; }; + 19A8A8E1BF043B390E02C429 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Messaging.cpp"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; + 19AB6653E818B409554C5606 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedValueSetter.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h"; sourceTree = "SOURCE_ROOT"; }; + 1A22BB28E65B6D6636CCEBF1 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-02.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-02.png"; sourceTree = "SOURCE_ROOT"; }; + 1AD76E8111A738A8F3717060 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ArduinoOutputEditor.cpp; path = ../../Source/Processors/Editors/ArduinoOutputEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 1AEEC114AFAB6E81205FBCD1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AttributedString.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h"; sourceTree = "SOURCE_ROOT"; }; + 1B27BF1CF3F235A55CD5107D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResamplingAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1BF01252E3A30560525CE057 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_WebBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1C474C73937D98E9D3FFEEC0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FilePreviewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 1C639F4C139C8D7753AA9BB6 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_gui_extra/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 1C93ECD2B04F39923E66B529 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ReferenceNodeEditor.h; path = ../../Source/Processors/Editors/ReferenceNodeEditor.h; sourceTree = "SOURCE_ROOT"; }; + 1CB0D7AC988EDEC838A1C546 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSampleBuffer.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"; sourceTree = "SOURCE_ROOT"; }; + 1CCC1D4213B17ABF6222EC82 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertiesFile.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1CFA355CD6811C253C72BDDA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyPressMappingSet.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h"; sourceTree = "SOURCE_ROOT"; }; + 1D1ABA743E533A4B7A50DBB0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReverbAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 1D7578F927EC030203A11978 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeDocument.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1D7FEC587CFE464A21830C4D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_SystemTrayIcon.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1DF5FD417930A62110DF0419 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ModalComponentManager.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1E9FE44F0CCC6604B5469412 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyMappingEditorComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1EC95CD1D830F6D85ADB3B9D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeDisplayEditor.cpp; path = ../../Source/Processors/Editors/SpikeDisplayEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 1F12D1392E5DF34C3A3C445D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NewLine.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_NewLine.h"; sourceTree = "SOURCE_ROOT"; }; + 205E9A5C31827555F1CAC30D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_osx.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_osx.h"; sourceTree = "SOURCE_ROOT"; }; + 208DCD7025D0DF2740C01E4A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 20EB4F22A76954F2986F364A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Windowing.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_Windowing.mm"; sourceTree = "SOURCE_ROOT"; }; + 215B159836CE40810964B773 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Uuid.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h"; sourceTree = "SOURCE_ROOT"; }; + 215E1BD79B5870D5356810F0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Visualizer.h; path = ../../Source/Processors/Visualization/Visualizer.h; sourceTree = "SOURCE_ROOT"; }; + 217032322A2570ABAC47194C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Image.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.h"; sourceTree = "SOURCE_ROOT"; }; + 21A0260D2DB039B81DF4970C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPath.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp"; sourceTree = "SOURCE_ROOT"; }; + 21C11A58CAA0F9E86AA204EC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Slider.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.h"; sourceTree = "SOURCE_ROOT"; }; + 21D3C1095D2B5A834D998B74 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_OpenSL.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp"; sourceTree = "SOURCE_ROOT"; }; + 222AC2E9BEFE12BE7FF88879 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Thread.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp"; sourceTree = "SOURCE_ROOT"; }; + 22801F75289646F6A85E5583 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Biquad.cpp; path = ../../Source/Dsp/Biquad.cpp; sourceTree = "SOURCE_ROOT"; }; + 229989EC8A6F145C81348CA9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PhaseDetector.h; path = ../../Source/Processors/PhaseDetector.h; sourceTree = "SOURCE_ROOT"; }; + 235A8987D99A191D07208D2F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = okFrontPanelDLL.cpp; path = "../../Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.cpp"; sourceTree = "SOURCE_ROOT"; }; + 23609D430A25F54723269E91 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_gui_basics.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; }; + 23A6BA852B71DAAF3F709428 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RHD2000Thread.h; path = ../../Source/Processors/DataThreads/RHD2000Thread.h; sourceTree = "SOURCE_ROOT"; }; + 23C7EA9C89CC98A5EFEC12FA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GZIPCompressorOutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 23D82A4C165DD596474F30E4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourSelector.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.h"; sourceTree = "SOURCE_ROOT"; }; + 23EAFAEA6457DB4E452F8715 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SignalGenerator.h; path = ../../Source/Processors/SignalGenerator.h; sourceTree = "SOURCE_ROOT"; }; + 23F048594D4C9AD8C3399877 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + 243817BA562AD7FA76C834C9 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; + 24D86195580EFB86AC084DCC = { isa = PBXFileReference; lastKnownFileType = file.otf; name = "cpmono_extra_light.otf"; path = "../../Resources/Fonts/cpmono_extra_light.otf"; sourceTree = "SOURCE_ROOT"; }; + 25433DB6D2EAEBB307EFB960 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_graphics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 256E22D98B16B09BD521C4A4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorEditor.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h"; sourceTree = "SOURCE_ROOT"; }; + 258938780F93A7CF41366F26 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RecordControl.cpp; path = ../../Source/Processors/Utilities/RecordControl.cpp; sourceTree = "SOURCE_ROOT"; }; + 25ABEB43042E98C668A16432 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikeDisplayEditor.h; path = ../../Source/Processors/Editors/SpikeDisplayEditor.h; sourceTree = "SOURCE_ROOT"; }; + 25DCA4D0E86DFB51AF637D21 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Midi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp"; sourceTree = "SOURCE_ROOT"; }; + 25F7BEADC001FA3D1EA9B32C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawablePath.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp"; sourceTree = "SOURCE_ROOT"; }; + 261B5AA82F2A86CC5500D8D2 = { isa = PBXFileReference; lastKnownFileType = image.png; name = ArduinoIcon.png; path = ../../Resources/Images/Icons/ArduinoIcon.png; sourceTree = "SOURCE_ROOT"; }; + 265EDA19C88E74249FD66609 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SignalGeneratorEditor.h; path = ../../Source/Processors/Editors/SignalGeneratorEditor.h; sourceTree = "SOURCE_ROOT"; }; + 266FC6DA3123E576811DD828 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FlacAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 26FF78F12CCB8725C0DAF9C2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiInput.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h"; sourceTree = "SOURCE_ROOT"; }; + 27313EA12BC45638321922CA = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + 27548017AB2ABAF17E1D5DF5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileInputSource.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h"; sourceTree = "SOURCE_ROOT"; }; + 27DC0E650D6D54DF29E6DB68 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_gui_extra.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; }; + 2847E92BB432EEB9D5A59260 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringArray.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.h"; sourceTree = "SOURCE_ROOT"; }; + 284F3E94F0C96EA1DD89E606 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 28847C807E6B05303FB8FB34 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Strings.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm"; sourceTree = "SOURCE_ROOT"; }; + 28D5AEEEFC4FA8877419C829 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_posix_NamedPipe.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2924B990E35D3B51AA245978 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MessageListener.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h"; sourceTree = "SOURCE_ROOT"; }; + 29381F22B8FDF48C3EAC3A9F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLPixelFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 29D7893C278FFE00782637B6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Bessel.h; path = ../../Source/Dsp/Bessel.h; sourceTree = "SOURCE_ROOT"; }; + 29FD7B383C5DDACAA7B8DFD3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MergerEditor.cpp; path = ../../Source/Processors/Editors/MergerEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 2A3230DEAAC86A9090950703 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Path.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2AB1CC4252DB09507ED31482 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Application.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2AE12F85965B8BE4A0E12F67 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertiesFile.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h"; sourceTree = "SOURCE_ROOT"; }; + 2B134713E91426120A994CB7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Random.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2B19F2DE42A91F56C2380F9A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Expression.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2B93450006102A0093F5EACB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Design.cpp; path = ../../Source/Dsp/Design.cpp; sourceTree = "SOURCE_ROOT"; }; + 2BC005B37A0FB3179C2F3AC7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CoreAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 2C4730CAFED4F6292B575318 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Splitter.cpp; path = ../../Source/Processors/Utilities/Splitter.cpp; sourceTree = "SOURCE_ROOT"; }; + 2C89EC72FF6A7118EF459DC3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; }; + 2D1BF69121265C83C7937EB6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioIODevice.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h"; sourceTree = "SOURCE_ROOT"; }; + 2D20F49E12A7D313049E0258 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedWriteLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h"; sourceTree = "SOURCE_ROOT"; }; + 2D2BAC4320470CF68743F58E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rhd2000evalboard.cpp; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2D41C43686CDE35E86A389D7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WiFiOutput.cpp; path = ../../Source/Processors/WiFiOutput.cpp; sourceTree = "SOURCE_ROOT"; }; + 2D577016FEEE23DD5703C924 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DialogWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2DA0032B6DF10345C4842BF5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharacterFunctions.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h"; sourceTree = "SOURCE_ROOT"; }; + 2F2EDBE0623561191234AF21 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LAMEEncoderAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2F8252D3FF527D6559B12615 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LowLevelGraphicsSoftwareRenderer.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2F9BB379BCFCFE0D88CC0408 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorGraph.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"; sourceTree = "SOURCE_ROOT"; }; + 2FE6DAFB634FF3C20F1D6FD7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CaretComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 2FF422D0633A28558D0227EC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentBuilder.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h"; sourceTree = "SOURCE_ROOT"; }; + 301783FC4E3B19CA3C0AC85B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsSoftwareRenderer.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h"; sourceTree = "SOURCE_ROOT"; }; + 3063CF211ABB734A9FD452EC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Custom.h; path = ../../Source/Dsp/Custom.h; sourceTree = "SOURCE_ROOT"; }; + 308F614D30DCB9AE3767C928 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ofSerial.cpp; path = ../../Source/Processors/Serial/ofSerial.cpp; sourceTree = "SOURCE_ROOT"; }; + 313970BBDAAA4EDC8B322F3A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentMovementWatcher.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp"; sourceTree = "SOURCE_ROOT"; }; + 314955FB1E6DD74C71EB8907 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatReaderSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h"; sourceTree = "SOURCE_ROOT"; }; + 316FB94579DA666A388F429A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WildcardFileFilter.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_WildcardFileFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 31A3925602D128195100B74D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationProperties.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp"; sourceTree = "SOURCE_ROOT"; }; + 31BE5E435604D33173940048 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToggleButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 31FDA03EF1B527B336FA6263 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_events/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 32976762B1DB850DB65B9504 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileInputSource.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 32A1325430309CF4114C9618 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GenericAudioProcessorEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 32B658D7A44849A6F640AF37 = { isa = PBXFileReference; lastKnownFileType = file.ttf; name = "miso-bold.ttf"; path = "../../Resources/Fonts/miso-bold.ttf"; sourceTree = "SOURCE_ROOT"; }; + 32CEF6C84CD06B18035B035C = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected-05.png"; path = "../../Resources/Images/Icons/RadioButtons_selected-05.png"; sourceTree = "SOURCE_ROOT"; }; + 32D568631762765C07D4BF0D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NSViewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_NSViewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 33A69BDDCFCD4A4DC14A9961 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyPress.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp"; sourceTree = "SOURCE_ROOT"; }; + 349C9FCEDC32E73DCB7AE806 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WindowsRegistry.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h"; sourceTree = "SOURCE_ROOT"; }; + 353937A4E68C8C6916C6D1F9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 35AEAE0CC0B546625E163B9B = { isa = PBXFileReference; lastKnownFileType = image.png; name = "sine_wave.png"; path = "../../Resources/Images/Icons/sine_wave.png"; sourceTree = "SOURCE_ROOT"; }; + 35C0963BAB9A82F12CDC9F76 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_NamedValueSet.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp"; sourceTree = "SOURCE_ROOT"; }; + 361D8C54B3E54766CBC48046 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Biquad.h; path = ../../Source/Dsp/Biquad.h; sourceTree = "SOURCE_ROOT"; }; + 361E3A46C9BFAD1530593487 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PopupMenu.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h"; sourceTree = "SOURCE_ROOT"; }; + 3663C981D28BF165C1B601A7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OptionalScopedPointer.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h"; sourceTree = "SOURCE_ROOT"; }; + 36A9736F04AAA2F8E9D711BB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SpinLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h"; sourceTree = "SOURCE_ROOT"; }; + 3753B3B311AE0A9F4CC5AD40 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ofArduino.cpp; path = ../../Source/Processors/Serial/ofArduino.cpp; sourceTree = "SOURCE_ROOT"; }; + 3774BBCA6CB133D9A854CF71 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CustomLookAndFeel.cpp; path = ../../Source/UI/CustomLookAndFeel.cpp; sourceTree = "SOURCE_ROOT"; }; + 381F5DC605AE69088004DF80 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "PipelineB-01.png"; path = "../../Resources/Images/Buttons/PipelineB-01.png"; sourceTree = "SOURCE_ROOT"; }; + 38313692308D501E4CADF1D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Layout.h; path = ../../Source/Dsp/Layout.h; sourceTree = "SOURCE_ROOT"; }; + 38711221C089A16CC29E93D2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActionListener.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h"; sourceTree = "SOURCE_ROOT"; }; + 38A9627672C2562DBE257A05 = { isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-extralight-serialized"; path = "../../Resources/Fonts/cpmono-extralight-serialized"; sourceTree = "SOURCE_ROOT"; }; + 38B5A37F33AE3FB2014BF095 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StringArray.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp"; sourceTree = "SOURCE_ROOT"; }; + 38E493BFC36AC80B1CDAAF35 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TreeView.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.h"; sourceTree = "SOURCE_ROOT"; }; + 390856DF83DAC70909D5B397 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Button.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h"; sourceTree = "SOURCE_ROOT"; }; + 390EA3109658E8C51EFC8F61 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginDirectoryScanner.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp"; sourceTree = "SOURCE_ROOT"; }; + 392408C1943AC6234BAAC743 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Elliptic.cpp; path = ../../Source/Dsp/Elliptic.cpp; sourceTree = "SOURCE_ROOT"; }; + 393801D2B91773D376D874B0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h"; sourceTree = "SOURCE_ROOT"; }; + 39422C7D01635DD9C00B5136 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_CoreMidi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp"; sourceTree = "SOURCE_ROOT"; }; + 39464D2A22940DA2DDCCCFC6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EventDetector.cpp; path = ../../Source/Processors/EventDetector.cpp; sourceTree = "SOURCE_ROOT"; }; + 39F287BE4C0B4F3BD4A949FD = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; + 3A2C762575D9728B1F822ED3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AsyncUpdater.cpp"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3A6E9EC3DA618EBA06B9DEEB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSubsectionReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h"; sourceTree = "SOURCE_ROOT"; }; + 3A6FE617A781EEFFD39E1216 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_neutral-02.png"; path = "../../Resources/Images/Icons/RadioButtons_neutral-02.png"; sourceTree = "SOURCE_ROOT"; }; + 3A71F2C959CA7DD3C33DC411 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CarbonViewWrapperComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 3A9826A8C3B668BCC760BEB7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_basics.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h"; sourceTree = "SOURCE_ROOT"; }; + 3AC9B61C10692BBA96D2F775 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_android.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_android.h"; sourceTree = "SOURCE_ROOT"; }; + 3AE038CACE48AF85C4FB1ED5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GenericProcessor.cpp; path = ../../Source/Processors/GenericProcessor.cpp; sourceTree = "SOURCE_ROOT"; }; + 3B307527FC3241258EA68519 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToneGeneratorAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 3BC3A723444252E177C1B1BD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatWriter.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h"; sourceTree = "SOURCE_ROOT"; }; + 3BEB59C6E8F833331C0783D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3C18EC09535EA506FC0CBC62 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_ios.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_ios.h"; sourceTree = "SOURCE_ROOT"; }; + 3C1E0B87DA3E9AC60D2894F7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TableListBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.h"; sourceTree = "SOURCE_ROOT"; }; + 3C92F249799E7CBF41FABEA0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_WebBrowserComponent.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm"; sourceTree = "SOURCE_ROOT"; }; + 3D100F6FDB04756402F3BCC9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + 3DA70F9AAA904543B519874B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginInstance.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h"; sourceTree = "SOURCE_ROOT"; }; + 3E0942A2D72F50FDE27C14AE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableObjectResizer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3E22E947444B5849011B6C4E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseInputSource.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3EAE25787DBFBA8EFC42A277 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RecordNode.h; path = ../../Source/Processors/RecordNode.h; sourceTree = "SOURCE_ROOT"; }; + 3EAF57CE45DBACE2F88DA4C5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3EE92345839A4E5F608D82AC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Sampler.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h"; sourceTree = "SOURCE_ROOT"; }; + 3F56A025C4D83EBDB66E3676 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AppleRemote.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AppleRemote.h"; sourceTree = "SOURCE_ROOT"; }; + 3F69480D6145C77992FA59BA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RootFinder.cpp; path = ../../Source/Dsp/RootFinder.cpp; sourceTree = "SOURCE_ROOT"; }; + 3F6C67E29CDEDF2EF61C054F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Param.cpp; path = ../../Source/Dsp/Param.cpp; sourceTree = "SOURCE_ROOT"; }; + 3F8DFB0DB8B82F0C2CFBCA05 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferingAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3FA24B406E4A9F9F54421C6A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChannelRemappingAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 3FB80C5CFD953986778DCBA2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Files.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3FC794735FA8DDA39A62224B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = UIComponent.h; path = ../../Source/UI/UIComponent.h; sourceTree = "SOURCE_ROOT"; }; + 3FFC2A3429D8B1D957D18CA7 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "MergerB-02.png"; path = "../../Resources/Images/Buttons/MergerB-02.png"; sourceTree = "SOURCE_ROOT"; }; + 3FFD5E5D5C1D8B48DBBB9D18 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Result.cpp"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp"; sourceTree = "SOURCE_ROOT"; }; + 402BC572EE3E8EC418946CE0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioTransportSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h"; sourceTree = "SOURCE_ROOT"; }; + 405298E6CE1C80EC7CC43A87 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileTreeComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 40C22F3CD61DDB9C7B3DCCA6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h"; sourceTree = "SOURCE_ROOT"; }; + 4133FE7830C52BBA035D82B8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TimeSliceThread.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp"; sourceTree = "SOURCE_ROOT"; }; + 414D8E6E4EE98E66C2583A50 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 416B99B14B44CB16B725C4B2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableObjectResizer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h"; sourceTree = "SOURCE_ROOT"; }; + 4179FCF100DC52282D0F9753 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_JSON.h"; path = "../../JuceLibraryCode/modules/juce_core/json/juce_JSON.h"; sourceTree = "SOURCE_ROOT"; }; + 41AF61914A96159E9EA194B0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Clipboard.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Clipboard.cpp"; sourceTree = "SOURCE_ROOT"; }; + 420843E39C285B620B220C1D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LeakedObjectDetector.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h"; sourceTree = "SOURCE_ROOT"; }; + 420B0E95F1300ABFDC125DBF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AccessClass.cpp; path = ../../Source/AccessClass.cpp; sourceTree = "SOURCE_ROOT"; }; + 42BF0530EADF336E58D39CD3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FloatVectorOperations.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"; sourceTree = "SOURCE_ROOT"; }; + 43420911407CC35CE2A02B38 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutManager.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 434E153E6C8337C1E4A2709A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ButtonPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 4434939E139A45962C8CFB4C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableShape.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp"; sourceTree = "SOURCE_ROOT"; }; + 44E04E5F584A8BFAD062A09D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ShapeButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h"; sourceTree = "SOURCE_ROOT"; }; + 45258533F9F65AC96D3080B3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTouchMapper.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h"; sourceTree = "SOURCE_ROOT"; }; + 4540694F9744C9F4D29149CE = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_opengl/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 455FFBB0C34B760D892D2D57 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLPixelFormat.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 45883809F1335E6C745F8155 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ModalComponentManager.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h"; sourceTree = "SOURCE_ROOT"; }; + 458A112D564ED066211FD482 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToneGeneratorAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 45A66E543B62A2C32AB3BA23 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDeviceSelectorComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 45D440B69BDB210B17CD424B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 45D78C8EF660EECE64BAA33F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RHD2000Editor.cpp; path = ../../Source/Processors/Editors/RHD2000Editor.cpp; sourceTree = "SOURCE_ROOT"; }; + 4608E765A643BC0CB2C1BB02 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CriticalSection.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h"; sourceTree = "SOURCE_ROOT"; }; + 463A302B39C7815EB981CEBD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Point.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h"; sourceTree = "SOURCE_ROOT"; }; + 4650B5724FE3C0608FB07A04 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextLayout.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp"; sourceTree = "SOURCE_ROOT"; }; + 46E3A634686BFEF787229582 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ParameterEditor.cpp; path = ../../Source/Processors/Editors/ParameterEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 46EF49B14DF7357A8287D9D8 = { isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Info.plist; sourceTree = "SOURCE_ROOT"; }; + 47041E3794FA20F67F39AE63 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChildProcess.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; }; + 475824F60D47C28C392954A7 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 47976F6BE2942EED64AEA4D2 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-04.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-04.png"; sourceTree = "SOURCE_ROOT"; }; + 47A3942AC30A3212C01F1CAF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DataViewport.cpp; path = ../../Source/UI/DataViewport.cpp; sourceTree = "SOURCE_ROOT"; }; + 47BDFDD28759B342B1C50BC0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AbstractFifo.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h"; sourceTree = "SOURCE_ROOT"; }; + 47EE021D6C891095140ED7A9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_UIViewComponentPeer.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm"; sourceTree = "SOURCE_ROOT"; }; + 482A60A44EE6CB84FCB9DC88 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnailBase.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h"; sourceTree = "SOURCE_ROOT"; }; + 483ABD5C1CF789943AB4AFB6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentPeer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.h"; sourceTree = "SOURCE_ROOT"; }; + 4867923F31CC3EDC9B1A5BE5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Merger.cpp; path = ../../Source/Processors/Utilities/Merger.cpp; sourceTree = "SOURCE_ROOT"; }; + 488D1B00C9E5FE4DAB035EDF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_cryptography.mm"; path = "../../JuceLibraryCode/modules/juce_cryptography/juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; }; + 48E4FA55FD4440AF44EEA437 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 48F6281AB92B232E5187D00C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SignalChainManager.h; path = ../../Source/UI/SignalChainManager.h; sourceTree = "SOURCE_ROOT"; }; + 4939A8B8300394AAD0926C0B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Legendre.h; path = ../../Source/Dsp/Legendre.h; sourceTree = "SOURCE_ROOT"; }; + 496180D5D96088CBB59035B1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableShape.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h"; sourceTree = "SOURCE_ROOT"; }; + 4978EF4C5F506F3289BC0D99 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SubregionStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h"; sourceTree = "SOURCE_ROOT"; }; + 499A12199A8A8C5AEDAA47E4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FilenameComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 49D837FD08100AF0DB797DB4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SparseSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h"; sourceTree = "SOURCE_ROOT"; }; + 49FA151B1837E543D18858EB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterEditor.h; path = ../../Source/Processors/Editors/FilterEditor.h; sourceTree = "SOURCE_ROOT"; }; + 4A28A492852AEFBF508C1FC1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativePointPath.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h"; sourceTree = "SOURCE_ROOT"; }; + 4A7695E93CE32F4E95042FCB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_video.mm"; path = "../../JuceLibraryCode/modules/juce_video/juce_video.mm"; sourceTree = "SOURCE_ROOT"; }; + 4A94E809624F99387E600399 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpDisplayCanvas.cpp; path = ../../Source/Processors/Visualization/LfpDisplayCanvas.cpp; sourceTree = "SOURCE_ROOT"; }; + 4AD95B75DC581E32650FEDF6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilterAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4AE1520FF569371665090B39 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AiffAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4AE36D25675E32A897F97BFA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TabbedComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4B3DBFE485F45E62C53A90B8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarModel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h"; sourceTree = "SOURCE_ROOT"; }; + 4B5998D72503BD73D28E828A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_MessageQueue.h"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h"; sourceTree = "SOURCE_ROOT"; }; + 4B74A7F0FDCE3E1706E5B320 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandTarget.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4BB38A2CD55BF23C7C3E3387 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemPalette.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4C3EA47E012B2D63ADE599DD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PathStrokeType.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4C4E2282C145D13C86CB23FA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLHelpers.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + 4C81E05B39376F54775A1027 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colour.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h"; sourceTree = "SOURCE_ROOT"; }; + 4CA9556E9C18029A47F34C7C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LAMEEncoderAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 4CCA36B2A6C4821E493E74D2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4CF403118BBAAD5B6763542A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLContext.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4D67518E9223C1C19BD4EF2E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Threads.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4D84A3A970FB67566A1E5B0B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KnownPluginList.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h"; sourceTree = "SOURCE_ROOT"; }; + 4D8F94CA49DB11E07918B4C9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UnitTest.cpp"; path = "../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4E520E7960CC5098C2352E70 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseCursor.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h"; sourceTree = "SOURCE_ROOT"; }; + 4E6EE225098D32E7D5DE60B2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikeDisplayCanvas.h; path = ../../Source/Processors/Visualization/SpikeDisplayCanvas.h; sourceTree = "SOURCE_ROOT"; }; + 4E71B355F2BABAF69CC4114D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; }; + 4EC254B133A7AAE377B9B3AE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LassoComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 4F31D61C0C2AB3472C6C1429 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MACAddress.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4F4234DC14D3689C22655D0C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4F4E8E3B32DB7A91B41C9FFA = { isa = PBXFileReference; lastKnownFileType = image.png; name = "MergerB-01.png"; path = "../../Resources/Images/Buttons/MergerB-01.png"; sourceTree = "SOURCE_ROOT"; }; + 4FD13AA663EEE7CC2F83033D = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + 50DB7E5C152DDD03F2FA4C2D = { isa = PBXFileReference; lastKnownFileType = file.otf; name = BebasNeue.otf; path = ../../Resources/Fonts/BebasNeue.otf; sourceTree = "SOURCE_ROOT"; }; + 50DD8D693741DD18106C0BA7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h"; sourceTree = "SOURCE_ROOT"; }; + 510ACDAD798813D7FC110197 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 511C443A0A806706A772E981 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Primes.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.cpp"; sourceTree = "SOURCE_ROOT"; }; + 515213CC3271E8DEA8125D33 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DynamicLibrary.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h"; sourceTree = "SOURCE_ROOT"; }; + 51926BEEA63BF141D93A5B36 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativePoint.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5265AD5F97C9E813E14937A7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RectanglePlacement.h"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h"; sourceTree = "SOURCE_ROOT"; }; + 5284E69CC601457D5C7C1063 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_SystemTrayIcon.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; }; + 52A8F84DCDDF0186B511B9CD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FilenameComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 53130F5F47EB211416C028F6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UnitTest.h"; path = "../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h"; sourceTree = "SOURCE_ROOT"; }; + 5343D594AA7D444A7C6AD924 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GZIPDecompressorInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 5379FC603780F30A2F05FE78 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AsyncUpdater.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h"; sourceTree = "SOURCE_ROOT"; }; + 53C8A2696FE4389E4AB4441C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Slider.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.cpp"; sourceTree = "SOURCE_ROOT"; }; + 54339ADDCB6F8E9E7721A986 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Windowing.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5522973FA48A13C6BED293FE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SignalGenerator.cpp; path = ../../Source/Processors/SignalGenerator.cpp; sourceTree = "SOURCE_ROOT"; }; + 555D34D0CD8776EE5996CC3A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ProcessorGraph.cpp; path = ../../Source/Processors/ProcessorGraph.cpp; sourceTree = "SOURCE_ROOT"; }; + 55811E331B55E0547326CF22 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TopLevelWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 558E925DAC57ADF8810559AC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Windowing.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; }; + 55EBFCA56B915C8CD043365C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeLayout.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp"; sourceTree = "SOURCE_ROOT"; }; + 55F7467B96E236DD558228C9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF8.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h"; sourceTree = "SOURCE_ROOT"; }; + 560A28C1966B1817873CF764 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessageSequence.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp"; sourceTree = "SOURCE_ROOT"; }; + 56169D835A3E3029D6E3904C = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = System/Library/Frameworks/QuickTime.framework; sourceTree = SDKROOT; }; + 562E4A50364EEDC3AA2AACB8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeTime.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h"; sourceTree = "SOURCE_ROOT"; }; + 563F35B171FAF2540923CE45 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDataConverters.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"; sourceTree = "SOURCE_ROOT"; }; + 564380494D23DB70680FB0B5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TreeView.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.cpp"; sourceTree = "SOURCE_ROOT"; }; + 565EEC8F429ABF5F9A867137 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseEvent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 56728EC77C65482B9C86FF4D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_utils.mm"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; }; + 570299171BCE863C54FBBA54 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConcertinaPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 57941E5B2E1FF6028A68D4A7 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons-02.png"; path = "../../Resources/Images/Icons/RadioButtons-02.png"; sourceTree = "SOURCE_ROOT"; }; + 57C6DD2537116B30FB948A08 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RSAKey.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.h"; sourceTree = "SOURCE_ROOT"; }; + 57F66B4A911601169AF195E9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorPlayer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 57FBA8BC3104D3AF41FBECD8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EditorViewport.h; path = ../../Source/UI/EditorViewport.h; sourceTree = "SOURCE_ROOT"; }; + 581287A24510A9EACEE09CE4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DocumentWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 586448E180F8ACBF5A1565B0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_extra.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.h"; sourceTree = "SOURCE_ROOT"; }; + 586B1E0743FFBE9081A25F4F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeEditorComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 587FCA2485B9C89C2A99C23A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Filter.cpp; path = ../../Source/Dsp/Filter.cpp; sourceTree = "SOURCE_ROOT"; }; + 5894D40A0E8FA6E9B3EBF9D9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeObject.cpp; path = ../../Source/Processors/Visualization/SpikeObject.cpp; sourceTree = "SOURCE_ROOT"; }; + 58958CC3F750D383261E2FBC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SliderPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 5915DB02FB7CA8CEC1BF38A9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_opengl.mm"; path = "../../JuceLibraryCode/modules/juce_opengl/juce_opengl.mm"; sourceTree = "SOURCE_ROOT"; }; + 59389DC8664617FD51740F36 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectShowComponent.h"; path = "../../JuceLibraryCode/modules/juce_video/playback/juce_DirectShowComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 5962848AA3DD93A29EFF5B94 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_data_structures.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h"; sourceTree = "SOURCE_ROOT"; }; + 5A746CDDE80FEA2E45B5BA66 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AppleRemote.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm"; sourceTree = "SOURCE_ROOT"; }; + 5A7D81B70480B40EEBC2FF54 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MessageListener.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5A8D46BEB81DDF24462E3D92 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PoleFilter.h; path = ../../Source/Dsp/PoleFilter.h; sourceTree = "SOURCE_ROOT"; }; + 5AB3809F029824EE2DE0A798 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageFileFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5B2A4DD7133CDE5AEC24CC07 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GenericProcessor.h; path = ../../Source/Processors/GenericProcessor.h; sourceTree = "SOURCE_ROOT"; }; + 5B2CDF3CF10A92F6CA45F3DE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPlayHead.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h"; sourceTree = "SOURCE_ROOT"; }; + 5B411F4FCF0F69798C9E4A88 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScrollBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h"; sourceTree = "SOURCE_ROOT"; }; + 5B6B25AA065FB6CDE7D6C507 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationProperties.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h"; sourceTree = "SOURCE_ROOT"; }; + 5B7EC53FD2232CA799D6C018 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectSound.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5BB1E90842FD8A212CC2D132 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeDocument.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.h"; sourceTree = "SOURCE_ROOT"; }; + 5C1D2D28960C7957A15B3FE4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChannelRemappingAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5C5E4C396CD83C46F58644A2 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "triangle_wave.png"; path = "../../Resources/Images/Icons/triangle_wave.png"; sourceTree = "SOURCE_ROOT"; }; + 5C7EEDD80F88872A87FD561B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5CE99545433261F3B4A46252 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatReaderSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5D9792840E8050DCC766B368 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLRenderer.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLRenderer.h"; sourceTree = "SOURCE_ROOT"; }; + 5DB3B3197F8C1E5EE159D6FC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rhd2000registers.cpp; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000registers.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5DB6A07B827D62571BB51943 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Justification.h"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h"; sourceTree = "SOURCE_ROOT"; }; + 5DC1AF69A773401DB1E8FB32 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeTime.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5E0F8A60411A03461FD687CE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GroupComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 5E1EFF4EEA5684FA00CAA353 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableBorderComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 5E663D5A55F191AB92A1383F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 5E94E897783BEEFE61E61A2C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_WebBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5EA61EDD64BE1E401DD0AA5E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikeDisplayNode.h; path = ../../Source/Processors/SpikeDisplayNode.h; sourceTree = "SOURCE_ROOT"; }; + 5EA661C13CB7197A45F20028 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "PipelineB-02.png"; path = "../../Resources/Images/Buttons/PipelineB-02.png"; sourceTree = "SOURCE_ROOT"; }; + 5F64FDAFCA899A16C7FDDBCA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioNode.h; path = ../../Source/Processors/AudioNode.h; sourceTree = "SOURCE_ROOT"; }; + 5F6DCA68A982E930389644FD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5FEBF3F722DB6191BF659816 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ArrowButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5FEFF62D585CF777C950E569 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 601654292170CD2D60E912A6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_ALSA.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp"; sourceTree = "SOURCE_ROOT"; }; + 603764889DE750F8E87F6428 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Direct2DGraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + 605C7ACB09E7739EBE4F1539 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 60B1BDA3E9E14F9515963082 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BasicNativeHeaders.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h"; sourceTree = "SOURCE_ROOT"; }; + 610E487E060C42B52FD5AAC9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ControlPanel.cpp; path = ../../Source/UI/ControlPanel.cpp; sourceTree = "SOURCE_ROOT"; }; + 61317B5191E05925F232E18C = { isa = PBXFileReference; lastKnownFileType = file.otf; name = "unibody-8.otf"; path = "../../Resources/Fonts/unibody-8.otf"; sourceTree = "SOURCE_ROOT"; }; + 61481DD4AAC7731CE984937D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLExtensions.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGLExtensions.h"; sourceTree = "SOURCE_ROOT"; }; + 617F5DFAAE97F48FA996A781 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableRectangle.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h"; sourceTree = "SOURCE_ROOT"; }; + 61B0CBF705D5FC0431776286 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLShaderProgram.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp"; sourceTree = "SOURCE_ROOT"; }; + 627956A7A1CB15251D02C8C5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedXLock.h"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h"; sourceTree = "SOURCE_ROOT"; }; + 6328434A329C353DB8D9512C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SourceNodeEditor.cpp; path = ../../Source/Processors/Editors/SourceNodeEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 6340B1D2FECEABBBE6C0DE28 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Types.h; path = ../../Source/Dsp/Types.h; sourceTree = "SOURCE_ROOT"; }; + 63AF6BE7FE2A9E7882743B4F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Network.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm"; sourceTree = "SOURCE_ROOT"; }; + 63F4150ABBA43B2215230034 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IIRFilter.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 642C4CFA27846188E3D53688 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDeviceManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h"; sourceTree = "SOURCE_ROOT"; }; + 649F22404167E0D0EA244196 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Toolbar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6514FD7E6C5EC12735E49FBC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_FileChooser.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_FileChooser.mm"; sourceTree = "SOURCE_ROOT"; }; + 651E9B78A5139F7A5BCA4D90 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 65312FAD0900119CDF6CF414 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PoleFilter.cpp; path = ../../Source/Dsp/PoleFilter.cpp; sourceTree = "SOURCE_ROOT"; }; + 6535D85C084292220330EDD9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResamplingAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 65751E743D5EFD4066E50746 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LagrangeInterpolator.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h"; sourceTree = "SOURCE_ROOT"; }; + 6589EAEF497ABA76A295B121 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VSTPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 658D08592154525DA1C40826 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileLogger.cpp"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6596D69CCD1502DC6BBD15F1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF32.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h"; sourceTree = "SOURCE_ROOT"; }; + 65980344D141B0008A94E2E4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectShowComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_win32_DirectShowComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 65A447DCF8A68BAABC20FC7D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileFilter.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 65BE7542749DCCAE33ACF40F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OldSchoolLookAndFeel.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/lookandfeel/juce_OldSchoolLookAndFeel.h"; sourceTree = "SOURCE_ROOT"; }; + 65DA1366481AB10AFB3AF344 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PerformanceCounter.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h"; sourceTree = "SOURCE_ROOT"; }; + 65F4459CC1832883FFF6C166 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_devices.mm"; path = "../../JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; }; + 66463AB11EA4D6341C32F27E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DataWindow.cpp; path = ../../Source/Processors/Visualization/DataWindow.cpp; sourceTree = "SOURCE_ROOT"; }; + 66C663401829E0F7E787F708 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertySet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h"; sourceTree = "SOURCE_ROOT"; }; + 66D3F831CE4F6AE89E4C869A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LinkedListPointer.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h"; sourceTree = "SOURCE_ROOT"; }; + 66F524552E8DE88CDC2E40FD = { isa = PBXFileReference; lastKnownFileType = file; name = "silkscreen-serialized"; path = "../../Resources/Fonts/silkscreen-serialized"; sourceTree = "SOURCE_ROOT"; }; + 66FE597910F6A68CBB6FA055 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 670987D88775D6B240C34820 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NotificationType.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h"; sourceTree = "SOURCE_ROOT"; }; + 674FDCCEF6A1379A0F689004 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentBoundsConstrainer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h"; sourceTree = "SOURCE_ROOT"; }; + 67BB47E709B643D4C01AB34C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDeviceSelectorComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6832130272774CD542793762 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_CoreGraphicsContext.mm"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm"; sourceTree = "SOURCE_ROOT"; }; + 686FA8DDF2848517CBFB9E4A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseCursor.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6880C148A38A5C8D0092E358 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Merger.h; path = ../../Source/Processors/Utilities/Merger.h; sourceTree = "SOURCE_ROOT"; }; + 6917A53BAA3CA2819E4C10BF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 693E9C5C9A435F791921DAAE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDeviceManager.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 696F2DC49934E6F01A2DF9FE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileTreeComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 698B0EC670DA47934444381B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6A559D9595A54EF52BF0773A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Range.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Range.h"; sourceTree = "SOURCE_ROOT"; }; + 6A63308EBE68478531604BA4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsList.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6ABF91320A2EB6D307091AEE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_CameraDevice.mm"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_mac_CameraDevice.mm"; sourceTree = "SOURCE_ROOT"; }; + 6B28CEAF75E22F2CCCACBCC7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_formats.mm"; path = "../../JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; }; + 6B32691AA8B3D304B68CFA64 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryMappedAudioFormatReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h"; sourceTree = "SOURCE_ROOT"; }; + 6B7252D3F574AE21BE464327 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "PipelineA-02.png"; path = "../../Resources/Images/Buttons/PipelineA-02.png"; sourceTree = "SOURCE_ROOT"; }; + 6B90F5150FA8E114E8AE98BF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatWriter.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6BA113C799640798D3F29A06 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ProgressBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.h"; sourceTree = "SOURCE_ROOT"; }; + 6BA7D7A7E3E2E646E50D334A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPathListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6BBBC0907D7A62E2F3AB9BDF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Colours.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6C24163DC4ECD731489CC4F6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OwnedArray.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h"; sourceTree = "SOURCE_ROOT"; }; + 6C36C3C304EB066B1DFCCD9C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemClipboard.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h"; sourceTree = "SOURCE_ROOT"; }; + 6C8489C41782E3D391AF0C26 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Identifier.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_Identifier.h"; sourceTree = "SOURCE_ROOT"; }; + 6CA98F8581CEAE2DC9AEBCE9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallbackMessage.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h"; sourceTree = "SOURCE_ROOT"; }; + 6CBD8647DB17F1B58B14A3BC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDBurner.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6D34DD9AB987A67BADE71C65 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons-05.png"; path = "../../Resources/Images/Icons/RadioButtons-05.png"; sourceTree = "SOURCE_ROOT"; }; + 6D4BA4399FDEB6D2195B257D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SplashScreen.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.h"; sourceTree = "SOURCE_ROOT"; }; + 6D4DFC260B2966E3EBFC0C79 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SliderPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6D59D5780ECD2CC9703CB499 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Butterworth.h; path = ../../Source/Dsp/Butterworth.h; sourceTree = "SOURCE_ROOT"; }; + 6D619C7A3A14981DC4EFF223 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IIRFilterAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 6D77949E9C7C9B5A7795C0E0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PathStrokeType.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h"; sourceTree = "SOURCE_ROOT"; }; + 6DA8EC2F779DEBB701FE33CA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_win32_HiddenMessageWindow.h"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 6DCDFF2618CFEECEACE87630 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_GraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6DD526F86CBF2C3B3487FFE1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentBuilder.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6E2F243D8F70CC92391204A4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiDocumentPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h"; sourceTree = "SOURCE_ROOT"; }; + 6EA1CC7DACDDBA863179521A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TemporaryFile.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6EF4EFD6D74D2573AC6B6A6F = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_devices/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 6F9B89F7AD0E13887871D4FE = { isa = PBXFileReference; lastKnownFileType = image.png; name = SourceDrop.png; path = ../../Resources/Images/Icons/SourceDrop.png; sourceTree = "SOURCE_ROOT"; }; + 6FE8B0DD6116E6A3456ECF09 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_UIViewComponent.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm"; sourceTree = "SOURCE_ROOT"; }; + 700597338DEC9AB65C4C8A5E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableText.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h"; sourceTree = "SOURCE_ROOT"; }; + 70151263C4CB8A4F79431E11 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EventNodeEditor.cpp; path = ../../Source/Processors/Editors/EventNodeEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 70BF68C222D1E0A0368EB845 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandManager.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 70ECB490BD59F59D003F3BEE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_CameraDevice.cpp"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_android_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; }; + 70F06DBCA3948BCC1062E36F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ChannelSelector.h; path = ../../Source/Processors/Editors/ChannelSelector.h; sourceTree = "SOURCE_ROOT"; }; + 71CF8F6995DF1BA2038C21D6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AlertWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 7291F19253205B1A5138908E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DynamicObject.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp"; sourceTree = "SOURCE_ROOT"; }; + 72C33BA70B9EE82E39F1EC6C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MP3AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 72FCE41894123FC5DB01566B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_win32.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_win32.h"; sourceTree = "SOURCE_ROOT"; }; + 7387114E34496F4606550863 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 73ACB7A051EDE5F676E35FFD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PerformanceCounter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 73C69D948D33899821536025 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemTrayIconComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 748E62D05C8FFF74DCA234C7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadPool.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp"; sourceTree = "SOURCE_ROOT"; }; + 74A81014471CC0EB0D5E6571 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ValueTree.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp"; sourceTree = "SOURCE_ROOT"; }; + 74DE857CEFA10BC49FF591DB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Synthesiser.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h"; sourceTree = "SOURCE_ROOT"; }; + 753B81CCB5A6B6929679E7B7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Application.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h"; sourceTree = "SOURCE_ROOT"; }; + 7555A13E69B99B1B6C7295FD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 758BC480F153DEA79304366B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ofArduino.h; path = ../../Source/Processors/Serial/ofArduino.h; sourceTree = "SOURCE_ROOT"; }; + 75A4EEE127FAB86D65FF5F6E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeCoordinatePositioner.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp"; sourceTree = "SOURCE_ROOT"; }; + 75E0C433EC27CFB712CD9F75 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginListComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 75FCE8908DD9055F90E93716 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableBorderComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 76140C0485FDDA98C3D98E2A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OldSchoolLookAndFeel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/lookandfeel/juce_OldSchoolLookAndFeel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 766923F74E30FF5D6B12E7CE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableComposite.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h"; sourceTree = "SOURCE_ROOT"; }; + 76E89CBE70BF8F2476B7AA34 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SortedSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h"; sourceTree = "SOURCE_ROOT"; }; + 76F569AE7B444D8F69EE0E86 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioResamplingNode.cpp; path = ../../Source/Processors/AudioResamplingNode.cpp; sourceTree = "SOURCE_ROOT"; }; + 7719FB81DDF23CF0164B131D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BlowFish.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.h"; sourceTree = "SOURCE_ROOT"; }; + 77B3E84324445076F1F907E9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Threads.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; + 783D8922D5C687E170FA1A2C = { isa = PBXFileReference; lastKnownFileType = file.otf; name = "cpmono_plain.otf"; path = "../../Resources/Fonts/cpmono_plain.otf"; sourceTree = "SOURCE_ROOT"; }; + 784233150B26826701C09103 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiKeyboardComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 786A97B2B4E2BB6406546647 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileSearchPathListComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 786F6A40506C2094B812F4D5 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_basics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 788F8B7719B70465762B634B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DataBuffer.cpp; path = ../../Source/Processors/DataThreads/DataBuffer.cpp; sourceTree = "SOURCE_ROOT"; }; + 789139D88F449BE488BF3CCB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h"; sourceTree = "SOURCE_ROOT"; }; + 78BA978C614603B5E9ECFFF1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentPeer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 78CC9639B933CE2497264EF2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyPress.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h"; sourceTree = "SOURCE_ROOT"; }; + 793A4A777FEFA450F86C78EE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + 79BBD2F2F31D76CC4F5BD012 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected-04.png"; path = "../../Resources/Images/Icons/RadioButtons_selected-04.png"; sourceTree = "SOURCE_ROOT"; }; + 79C91DDF3BC3F15D0338E504 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ProcessorList.cpp; path = ../../Source/UI/ProcessorList.cpp; sourceTree = "SOURCE_ROOT"; }; + 7A93BFD2180B5E00B124CB1A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PixelFormats.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h"; sourceTree = "SOURCE_ROOT"; }; + 7A9F37527280A470F201FB6E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemTrayIconComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7ACB1CB66D69738904358F43 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Design.h; path = ../../Source/Dsp/Design.h; sourceTree = "SOURCE_ROOT"; }; + 7B42B28FDB2E3AC67EF296F8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PracticalSocket.h; path = ../../Source/Network/PracticalSocket.h; sourceTree = "SOURCE_ROOT"; }; + 7B674BB1DA11A4E58EA71624 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_EdgeTable.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7BCE1C09508E1B9CFC79C185 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CaretComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7BD2C39F13FDE202141C4B41 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MessageCenter.cpp; path = ../../Source/UI/MessageCenter.cpp; sourceTree = "SOURCE_ROOT"; }; + 7BE7EBBCC4DCF760A1AA697E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsList.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h"; sourceTree = "SOURCE_ROOT"; }; + 7C0F2759385C66CAC3EC362D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_ActiveXComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7C15112E5F287ACDD74480F5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_QuickTimeMovieComponent.h"; path = "../../JuceLibraryCode/modules/juce_video/playback/juce_QuickTimeMovieComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 7C1D87A0C78F661FB459786B = { isa = PBXFileReference; lastKnownFileType = image.png; name = "saw_wave.png"; path = "../../Resources/Images/Icons/saw_wave.png"; sourceTree = "SOURCE_ROOT"; }; + 7C6921FE817699C1B95AEBF6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedReadLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h"; sourceTree = "SOURCE_ROOT"; }; + 7C71195623459A6C2524D418 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiKeyboardComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7CD03E334269D693E1B84856 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioTransportSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7CE1E34F6A0091E720854E75 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Value.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h"; sourceTree = "SOURCE_ROOT"; }; + 7CF939BD59D45EB41B5FE628 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Button.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7D363D7B36A55EEB3198A827 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Midi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7D36B006AE0B139D8A3D8641 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeface.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7D8100DC3A532980AEAAD909 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ArrayAllocationBase.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h"; sourceTree = "SOURCE_ROOT"; }; + 7D88F7083884A5ED2DBE7534 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GroupComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7D9374931D760ADC65DCBFC6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataViewport.h; path = ../../Source/UI/DataViewport.h; sourceTree = "SOURCE_ROOT"; }; + 7E40891072657FB5ADC2FAB7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Array.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_Array.h"; sourceTree = "SOURCE_ROOT"; }; + 7E581214A64A535E03EA759B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AlertWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7E875E681E18D693D5ADB2FB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EditorViewport.cpp; path = ../../Source/UI/EditorViewport.cpp; sourceTree = "SOURCE_ROOT"; }; + 7EA46209F07B2C8A83D0873A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorGraph.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7EBB3F8185EB597DEF77534D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Message.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_Message.h"; sourceTree = "SOURCE_ROOT"; }; + 7EBEBC6DBA8DCA5A5D8C72E1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Timer.h"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_Timer.h"; sourceTree = "SOURCE_ROOT"; }; + 7ECD5DB4BEBC44559D064E08 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Logger.cpp"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7EFF8622168303A4391D6CAE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RootFinder.h; path = ../../Source/Dsp/RootFinder.h; sourceTree = "SOURCE_ROOT"; }; + 7F17077973FFDD70C4B78E7E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PlatformDefs.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h"; sourceTree = "SOURCE_ROOT"; }; + 7F1E84C068D3E6AA13CDD699 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Justification.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7F49EA0CD3379397520AA6F1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DeletedAtShutdown.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7F92025F0B8FD4FA725CC70B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageConvolutionKernel.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7F93E4F0CC8B842AC1D3E560 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemPalette.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h"; sourceTree = "SOURCE_ROOT"; }; + 7FDFE493862CE27EFCAC3F7F = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons-04.png"; path = "../../Resources/Images/Icons/RadioButtons-04.png"; sourceTree = "SOURCE_ROOT"; }; + 803D306CDAC2BD3BA04534EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8077C8D1C544F458947D693E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextLayout.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h"; sourceTree = "SOURCE_ROOT"; }; + 80A612858FA1177A262744C6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HyperlinkButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h"; sourceTree = "SOURCE_ROOT"; }; + 80C1B737D2C2CB519D1787D7 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; + 80D57E78015C789503FE24B4 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 80E8C07F5807C65BCDFCCF94 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSampleBuffer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 80EEDD40F49120ADBE9DCBDF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rhd2000datablock.h; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000datablock.h"; sourceTree = "SOURCE_ROOT"; }; + 811C4D165AD7AABF4055059C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Expression.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.h"; sourceTree = "SOURCE_ROOT"; }; + 816EB8024DD50DE4B7E84CB8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ByteOrder.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h"; sourceTree = "SOURCE_ROOT"; }; + 81D578AA5F277EB0946050E5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DragAndDrop.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp"; sourceTree = "SOURCE_ROOT"; }; + 822A504EE33F35F18A7F21AF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AiffAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 82EB2BDE7B9A4D5D945497B9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessageSequence.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h"; sourceTree = "SOURCE_ROOT"; }; + 837D266B3F62C3B05C2BC28C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; }; + 83803D96768258DA20710764 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XmlElement.h"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h"; sourceTree = "SOURCE_ROOT"; }; + 83950E9D0D7C100B7DCA0E55 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h"; sourceTree = "SOURCE_ROOT"; }; + 83E5EA2AA0CB928889AC80AB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikeDetectorEditor.h; path = ../../Source/Processors/Editors/SpikeDetectorEditor.h; sourceTree = "SOURCE_ROOT"; }; + 847F6986DFA468BA8D80A531 = { isa = PBXFileReference; lastKnownFileType = file.ttf; name = "miso-light.ttf"; path = "../../Resources/Fonts/miso-light.ttf"; sourceTree = "SOURCE_ROOT"; }; + 8515A61F1E3BD62B9B95B495 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_utils.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.h"; sourceTree = "SOURCE_ROOT"; }; + 8515E367462BEF36233E2447 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_AudioUnitPluginFormat.mm"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"; sourceTree = "SOURCE_ROOT"; }; + 8551342E7D16FCA4F9A80BC5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSubsectionReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 85928E2EF1C438EBC9EB07EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageCache.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp"; sourceTree = "SOURCE_ROOT"; }; + 85C3F7CDF87409A56082DF67 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 86515FD9AD34D6FF96C0D8B6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferingAudioFormatReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8689288B66B16EFB106CB2F4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextInputTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 86E8E44A13F17083ED300BD5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeListener.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h"; sourceTree = "SOURCE_ROOT"; }; + 86F4AAFCE3FEB34E325F3020 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_win32_ComSmartPtr.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h"; sourceTree = "SOURCE_ROOT"; }; + 8751DF970A9E3598683BACAF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FPGAThread.h; path = ../../Source/Processors/DataThreads/FPGAThread.h; sourceTree = "SOURCE_ROOT"; }; + 879B0383EF2A8B116903A500 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageCache.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h"; sourceTree = "SOURCE_ROOT"; }; + 87B4BA68E49DD11197B7AFDB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; }; + 880CC7C325EFF665AC3006D2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + 881237D5E366342B117C0ED7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WildcardFileFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_WildcardFileFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8822ADC9DB83FAF39B841E31 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Font.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp"; sourceTree = "SOURCE_ROOT"; }; + 886E18520E8BD77234E1B686 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FilterNode.h; path = ../../Source/Processors/FilterNode.h; sourceTree = "SOURCE_ROOT"; }; + 8882F8EBE55F52FA8E519249 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Files.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + 88E5D0906646465409715828 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PreferencesPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 891B132A0355007B4F37454C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + 893E1A681FF162F6C9069F62 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HashMap.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h"; sourceTree = "SOURCE_ROOT"; }; + 894C0CAC31D382477E7A122E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginDirectoryScanner.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h"; sourceTree = "SOURCE_ROOT"; }; + 89B0B267EF0A2A19A082EB86 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8A026DB58E3555F7B070DA61 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryBlock.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h"; sourceTree = "SOURCE_ROOT"; }; + 8A91849BE6B96EB8C0663469 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpDisplayEditor.cpp; path = ../../Source/Processors/Editors/LfpDisplayEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 8A989F74B1957BCB3B9BA398 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rhd2000registers.h; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000registers.h"; sourceTree = "SOURCE_ROOT"; }; + 8AA1009705E8A9531C707ED1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JSON.cpp"; path = "../../JuceLibraryCode/modules/juce_core/json/juce_JSON.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8AE2DDA47B2DFDEEEF69B12F = { isa = PBXFileReference; lastKnownFileType = image.png; name = FileReaderIcon.png; path = ../../Resources/Images/Icons/FileReaderIcon.png; sourceTree = "SOURCE_ROOT"; }; + 8B0C9D288C428BA5D956AE13 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessage.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8B49B07BC7534B247ADC756A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WeakReference.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h"; sourceTree = "SOURCE_ROOT"; }; + 8B745839B225E44C9EB5C6FA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ParameterEditor.h; path = ../../Source/Processors/Editors/ParameterEditor.h; sourceTree = "SOURCE_ROOT"; }; + 8B7EB54E1F773517A65D935C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadowEffect.h"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h"; sourceTree = "SOURCE_ROOT"; }; + 8B9C0831BE4E09B7C0078B7E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ArduinoOutputEditor.h; path = ../../Source/Processors/Editors/ArduinoOutputEditor.h; sourceTree = "SOURCE_ROOT"; }; + 8C077447B0DFC739C7D2E437 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 8C268C3D0B8EC2BB8953E7F7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ModifierKeys.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8C38407151E149A7E2A15801 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SHA256.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.h"; sourceTree = "SOURCE_ROOT"; }; + 8C3B6865F2053C80A6E692F1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Label.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8CAEF601359DB6CB50E89D1A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ActionBroadcaster.cpp"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8D4FBD30E1C9EC0DA749BC83 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadower.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8D6A419A4678968762A59B28 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferingAudioFormatReader.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h"; sourceTree = "SOURCE_ROOT"; }; + 8D9DD6147EC0553B092FD367 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RSAKey.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8E61792F6D6FC75CF18095CC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginFormatManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; + 8E696460A8A860B7A4044DFC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WebBrowserComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 8E78AAA58721DE609F6FFC61 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DragAndDropContainer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8EB76CA261F62A89B3D25F81 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Thread.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Thread.h"; sourceTree = "SOURCE_ROOT"; }; + 8F0549459970F529587D6CDD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WindowsMediaAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 8F08D5488CE147D693BA21E2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_ObjCHelpers.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + 8F29CAC0059E3697A5A3652F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_URL.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_URL.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8F3C158B4FB92CFC48324896 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SelectedItemSet.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h"; sourceTree = "SOURCE_ROOT"; }; + 8F7B13BF318C11900A2277DD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XmlDocument.h"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h"; sourceTree = "SOURCE_ROOT"; }; + 901C720965646841A94EB099 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActiveXControlComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 901DB6D5FE9134F2ADB9AE46 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChildProcess.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h"; sourceTree = "SOURCE_ROOT"; }; + 90607327D7A1BB3C2C4E9264 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Random.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Random.h"; sourceTree = "SOURCE_ROOT"; }; + 9069CE21141F5A4C5721BCF3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_devices.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h"; sourceTree = "SOURCE_ROOT"; }; + 9070DC685E666BBFC2E19DA9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertyPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 90AD1B6A2293F625D786507A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MathsFunctions.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h"; sourceTree = "SOURCE_ROOT"; }; + 90F2939F533A26AC021E42B1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ColourGradient.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp"; sourceTree = "SOURCE_ROOT"; }; + 911CCC0A579792DC56807DEC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableRectangle.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9136BD46BE1E28A96FBBD440 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SignalGeneratorEditor.cpp; path = ../../Source/Processors/Editors/SignalGeneratorEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 917988BE74F2180BFC0583A3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MissingGLDefinitions.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_MissingGLDefinitions.h"; sourceTree = "SOURCE_ROOT"; }; + 918837CC0447C50774036664 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutResizerBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 91D7B1F8B94AE9CFCC53771F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EventDetector.h; path = ../../Source/Processors/EventDetector.h; sourceTree = "SOURCE_ROOT"; }; + 9200FC900D22733AE716C364 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF16.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h"; sourceTree = "SOURCE_ROOT"; }; + 921F5D04122F324502DA4E75 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 92528D6653802FACF658D8EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FPGAOutputEditor.h; path = ../../Source/Processors/Editors/FPGAOutputEditor.h; sourceTree = "SOURCE_ROOT"; }; + 92602D7166325C7232B85EDD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DataThread.cpp; path = ../../Source/Processors/DataThreads/DataThread.cpp; sourceTree = "SOURCE_ROOT"; }; + 927AE946A1371490D809876E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessage.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h"; sourceTree = "SOURCE_ROOT"; }; + 927FCF11005E78D499DAF197 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallOutBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.h"; sourceTree = "SOURCE_ROOT"; }; + 92CB21BEE17D1DD03106AD87 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ofSerial.h; path = ../../Source/Processors/Serial/ofSerial.h; sourceTree = "SOURCE_ROOT"; }; + 92E07CA13571893873565AC7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SplashScreen.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.cpp"; sourceTree = "SOURCE_ROOT"; }; + 92E3405CB31ACFE3F80BBAD4 = { isa = PBXFileReference; lastKnownFileType = image.png; name = OpenEphysBoardLogoBlack.png; path = ../../Resources/Images/Icons/OpenEphysBoardLogoBlack.png; sourceTree = "SOURCE_ROOT"; }; + 92EC6BB8A8C4C5A61F43C233 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToggleButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h"; sourceTree = "SOURCE_ROOT"; }; + 9360657FDE33FA37D80075D1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnection.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9380932BED279F91B8C1C04B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Rectangle.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h"; sourceTree = "SOURCE_ROOT"; }; + 93EFC1AA800FC5DA2F04A213 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_neutral-04.png"; path = "../../Resources/Images/Icons/RadioButtons_neutral-04.png"; sourceTree = "SOURCE_ROOT"; }; + 93F842958BCE6A9E09862CF7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LADSPAPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 9428D7423971764AC0BA9CB7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = State.h; path = ../../Source/Dsp/State.h; sourceTree = "SOURCE_ROOT"; }; + 945DC754F2EACDFFB7926DE8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileChooser.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h"; sourceTree = "SOURCE_ROOT"; }; + 946FDFCA107B3F4C74C471B4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterprocessConnectionServer.h"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"; sourceTree = "SOURCE_ROOT"; }; + 94BD861806F8EA598EC09370 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableCornerComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 95B57108E929DD11F898B7B1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FileReaderThread.h; path = ../../Source/Processors/DataThreads/FileReaderThread.h; sourceTree = "SOURCE_ROOT"; }; + 95EC6B1536DC65070D0ADCEE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.h"; sourceTree = "SOURCE_ROOT"; }; + 967138FE8A086734ADC8CABB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Value.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp"; sourceTree = "SOURCE_ROOT"; }; + 96E99CD031BD069997E387FE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiBuffer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 96F2A45DCB9BB53844B0ED4F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + 971E49A78543AADB8CA1D2B7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLTexture.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9731D54410B06C1000370316 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Image.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp"; sourceTree = "SOURCE_ROOT"; }; + 97431963DB8D535DEDA9AD47 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_core.h"; path = "../../JuceLibraryCode/modules/juce_core/juce_core.h"; sourceTree = "SOURCE_ROOT"; }; + 97C4F046D88561EEE245BE99 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-05.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-05.png"; sourceTree = "SOURCE_ROOT"; }; + 982E1A954C316920557F029C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + 984BC60C0AFF3EDED692FA01 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GenericEditor.h; path = ../../Source/Processors/Editors/GenericEditor.h; sourceTree = "SOURCE_ROOT"; }; + 985F2B5047476B272B1A4BD4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EventNodeEditor.h; path = ../../Source/Processors/Editors/EventNodeEditor.h; sourceTree = "SOURCE_ROOT"; }; + 988F01B2B51B2AC7293D07DA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessageCollector.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp"; sourceTree = "SOURCE_ROOT"; }; + 98C81B13A0C34D8A4E93ADD1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h"; sourceTree = "SOURCE_ROOT"; }; + 98D2D452F48C86F47FB90BAD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PNGLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 996E4EA6B532E4E436F50243 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DeletedAtShutdown.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h"; sourceTree = "SOURCE_ROOT"; }; + 9978BC2A359BC506F69E545F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9A21A229CFACC67E31F4F727 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RBJ.cpp; path = ../../Source/Dsp/RBJ.cpp; sourceTree = "SOURCE_ROOT"; }; + 9A29EBC10219D89919E12FCB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentDragger.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h"; sourceTree = "SOURCE_ROOT"; }; + 9B178E9015CF469CFD41BC79 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferedInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9B4EA34E8F90B7CC77694B7E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DialogWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 9B5D838CB6224E82C9B36AA3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Misc.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9B9EDDFA0AE4991BC7FC7263 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MessageCenter.h; path = ../../Source/UI/MessageCenter.h; sourceTree = "SOURCE_ROOT"; }; + 9BC055494F9FEE3F90630541 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Channel.cpp; path = ../../Source/Processors/Channel.cpp; sourceTree = "SOURCE_ROOT"; }; + 9BE34B4DECBF4EBFD27C9792 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioIODeviceType.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9C089C090E400CC0E8BBB827 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = IntanThread.cpp; path = ../../Source/Processors/DataThreads/IntanThread.cpp; sourceTree = "SOURCE_ROOT"; }; + 9C21DBFB38865E5AFE367C6F = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; + 9C39C584DA6F507E773687EE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ReferenceNodeEditor.cpp; path = ../../Source/Processors/Editors/ReferenceNodeEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 9C4342320D2DD65E2BD6351C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9C5F99C38CC703FBB871401A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReverbAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9C701D5A7298B83CE05ECEBB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditorKeyMapper.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h"; sourceTree = "SOURCE_ROOT"; }; + 9C864C7DBAF37CD0719996A9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBrowserListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h"; sourceTree = "SOURCE_ROOT"; }; + 9C96B0CBFF3D34885BB8B020 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileDragAndDropTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 9CEDA04DB321755AF74D6FAF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ChebyshevII.h; path = ../../Source/Dsp/ChebyshevII.h; sourceTree = "SOURCE_ROOT"; }; + 9D050A509BEB9E3879DA35C6 = { isa = PBXFileReference; lastKnownFileType = file.ttf; name = ostrich.ttf; path = ../../Resources/Fonts/ostrich.ttf; sourceTree = "SOURCE_ROOT"; }; + 9D13E0F774807670270F4790 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Drawable.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h"; sourceTree = "SOURCE_ROOT"; }; + 9D2510B5E6180456C53A455E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComboBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9D78F50147005EDB0E89E2B4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FPGAOutput.cpp; path = ../../Source/Processors/FPGAOutput.cpp; sourceTree = "SOURCE_ROOT"; }; + 9EAAE3C0BFF3D753C375A5FC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableImage.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9EC1C0A21FDCB81BE0EA60EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationBase.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h"; sourceTree = "SOURCE_ROOT"; }; + 9F2853D1A12B686BE3BA2C61 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLImage.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.h"; sourceTree = "SOURCE_ROOT"; }; + 9F2BCD132F453B9D9EF09F15 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons-01.png"; path = "../../Resources/Images/Icons/RadioButtons-01.png"; sourceTree = "SOURCE_ROOT"; }; + 9F3B3184EC6D42CEA35D6ED8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EditorViewportButtons.cpp; path = ../../Source/UI/EditorViewportButtons.cpp; sourceTree = "SOURCE_ROOT"; }; + 9F577889CB6C54A2F7B1CA80 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PracticalSocket.cpp; path = ../../Source/Network/PracticalSocket.cpp; sourceTree = "SOURCE_ROOT"; }; + 9F61AF101B43110732BB8814 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AffineTransform.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9F6664EB2C39D224C6BCC75E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Viewport.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h"; sourceTree = "SOURCE_ROOT"; }; + 9F845E950F19FEC4E6C88F91 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Typeface.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h"; sourceTree = "SOURCE_ROOT"; }; + 9FC97A1CFD250F7215B4E397 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AudioCDBurner.mm"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm"; sourceTree = "SOURCE_ROOT"; }; + 9FDCF1E2B4651E58240400B9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditor.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.h"; sourceTree = "SOURCE_ROOT"; }; + 9FFD9560522567A033226BD7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PhaseDetector.cpp; path = ../../Source/Processors/PhaseDetector.cpp; sourceTree = "SOURCE_ROOT"; }; + A0D768F1B92568344DAC9F0B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + A0E3B98412D88921BB0AA58E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioEditor.h; path = ../../Source/Processors/Editors/AudioEditor.h; sourceTree = "SOURCE_ROOT"; }; + A15596CDCC27B86FC070D7FA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Desktop.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp"; sourceTree = "SOURCE_ROOT"; }; + A17E8162EC7A0E513DDEB23C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginDescription.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp"; sourceTree = "SOURCE_ROOT"; }; + A19C4BB4BD69D4351B344A17 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MenuBarComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + A252FE4E6A360CBC4AF694B3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeDetectorEditor.cpp; path = ../../Source/Processors/Editors/SpikeDetectorEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + A3B6D091280930A016DF8FDA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLContext.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLContext.h"; sourceTree = "SOURCE_ROOT"; }; + A3CAB6B56641ED68D9784348 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "PipelineA-01.png"; path = "../../Resources/Images/Buttons/PipelineA-01.png"; sourceTree = "SOURCE_ROOT"; }; + A3FB0EA0264580F6B00D993B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RHD2000Thread.cpp; path = ../../Source/Processors/DataThreads/RHD2000Thread.cpp; sourceTree = "SOURCE_ROOT"; }; + A41AEA0D3ACB2B1E6713AE08 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLGraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + A41C5A4CD5CF8EEFF993A8B1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MathSupplement.h; path = ../../Source/Dsp/MathSupplement.h; sourceTree = "SOURCE_ROOT"; }; + A4E2CAAF556D557B24182414 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = RecordNode.cpp; path = ../../Source/Processors/RecordNode.cpp; sourceTree = "SOURCE_ROOT"; }; + A4FC82A8339698B6C1AC5F18 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h"; sourceTree = "SOURCE_ROOT"; }; + A512C5B237A77EF6FB8E11A0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; }; + A540869F28EE158A0A348C28 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageConvolutionKernel.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h"; sourceTree = "SOURCE_ROOT"; }; + A54886FC74BE0DDC74094EF5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropContainer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h"; sourceTree = "SOURCE_ROOT"; }; + A5C9A0FBD818AEF57858FB31 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AffineTransform.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h"; sourceTree = "SOURCE_ROOT"; }; + A5E8E0CF6DA1AEAEE9D872DE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StandardHeader.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h"; sourceTree = "SOURCE_ROOT"; }; + A65F5AD9D0C532EBB3A2067D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GZIPDecompressorInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + A6736FBDFBB0B82E22D2B1C0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadLocalValue.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h"; sourceTree = "SOURCE_ROOT"; }; + A6A579E4E4AEA865BC71148C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_core.mm"; path = "../../JuceLibraryCode/modules/juce_core/juce_core.mm"; sourceTree = "SOURCE_ROOT"; }; + A708E79EB9EB7CC44030F5D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourGradient.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h"; sourceTree = "SOURCE_ROOT"; }; + A764EF4F46F472715B250E41 = { isa = PBXFileReference; lastKnownFileType = image.png; name = muteon.png; path = ../../Resources/Images/Buttons/muteon.png; sourceTree = "SOURCE_ROOT"; }; + A769611E9CBFC127AF5AFB0D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Time.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_Time.cpp"; sourceTree = "SOURCE_ROOT"; }; + A7875D5F8D2A632C99791002 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComboBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h"; sourceTree = "SOURCE_ROOT"; }; + A7D4C9E3ED3763847C087F46 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeDisplayCanvas.cpp; path = ../../Source/Processors/Visualization/SpikeDisplayCanvas.cpp; sourceTree = "SOURCE_ROOT"; }; + A7FE538FF09AC8A58DE8F1BD = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected-02.png"; path = "../../Resources/Images/Icons/RadioButtons_selected-02.png"; sourceTree = "SOURCE_ROOT"; }; + A8B4D80D55E48F50809DC5E4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_Windowing.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm"; sourceTree = "SOURCE_ROOT"; }; + A93F302B8D91A997F54D231B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MarkerList.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h"; sourceTree = "SOURCE_ROOT"; }; + A950BD747F318BF6D555CB06 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Files.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm"; sourceTree = "SOURCE_ROOT"; }; + A95D898F0998F4609E992B5F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Elliptic.h; path = ../../Source/Dsp/Elliptic.h; sourceTree = "SOURCE_ROOT"; }; + A98A22CF5F208ED6DBE08063 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ResamplingNode.cpp; path = ../../Source/Processors/ResamplingNode.cpp; sourceTree = "SOURCE_ROOT"; }; + A9A0BC63EB466C75D1B9326A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessageCollector.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h"; sourceTree = "SOURCE_ROOT"; }; + A9F5A8F835A1A734DF7F6775 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChoicePropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + AA3209223925B66A97AB4509 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TooltipClient.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h"; sourceTree = "SOURCE_ROOT"; }; + AA3DAC9A4A3FF9E7D279FB23 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected-03.png"; path = "../../Resources/Images/Icons/RadioButtons_selected-03.png"; sourceTree = "SOURCE_ROOT"; }; + AA7F6609B897B9E134377A62 = { isa = PBXFileReference; lastKnownFileType = file.otf; name = "cpmono_light.otf"; path = "../../Resources/Fonts/cpmono_light.otf"; sourceTree = "SOURCE_ROOT"; }; + AADBA8C0AD524CE677428AFF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlowEffect.h"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h"; sourceTree = "SOURCE_ROOT"; }; + AB4C7059669AC385B02179C1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileLogger.h"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h"; sourceTree = "SOURCE_ROOT"; }; + ABA3FCD5D762336535D56D94 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h"; sourceTree = "SOURCE_ROOT"; }; + AC116E6590D49AB2EF19CB9E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLImage.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.cpp"; sourceTree = "SOURCE_ROOT"; }; + AC2CFF4DA5CE431FCC628BA3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ChebyshevI.cpp; path = ../../Source/Dsp/ChebyshevI.cpp; sourceTree = "SOURCE_ROOT"; }; + ACA28D2B1FECD2C57F0250A6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsDisplayComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h"; sourceTree = "SOURCE_ROOT"; }; + ACAE4A2D65AAC6A36DA9DBCF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OggVorbisAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + AD1950C0733B3470777BF861 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleMessageComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h"; sourceTree = "SOURCE_ROOT"; }; + AD7311B9A37893CA0C4BC119 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ZipFile.cpp"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + AD7D35FCD8CF66B6C393A7F7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBrowserComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; }; + AD960F561259904BA68DDA73 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryMappedFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h"; sourceTree = "SOURCE_ROOT"; }; + ADCB42E4C5641007A4B78025 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikeObject.h; path = ../../Source/Processors/Visualization/SpikeObject.h; sourceTree = "SOURCE_ROOT"; }; + AE1EA04666EAD34D0CA0373D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_opengl.h"; path = "../../JuceLibraryCode/modules/juce_opengl/juce_opengl.h"; sourceTree = "SOURCE_ROOT"; }; + AE6786E4659DAC92F52E9FA3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Toolbar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.h"; sourceTree = "SOURCE_ROOT"; }; + AE9359DBA841F88EF3DA9700 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileSearchPath.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h"; sourceTree = "SOURCE_ROOT"; }; + AEC2DABFC0517B4BE0CD704C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AudioCDReader.mm"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm"; sourceTree = "SOURCE_ROOT"; }; + AEF53FD0FBBFF5242EDD7032 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Viewport.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp"; sourceTree = "SOURCE_ROOT"; }; + AF1F3010721A6B29062E4838 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + AF3E3AE70160C3392B237316 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_CoreAudio.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp"; sourceTree = "SOURCE_ROOT"; }; + AF8ADA74003E96998A5E4404 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Typeface.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + AFB684CE06F9256324EE0B4C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FillType.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp"; sourceTree = "SOURCE_ROOT"; }; + AFE835E175F7159E1E7C6CC7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CharacterFunctions.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp"; sourceTree = "SOURCE_ROOT"; }; + B00A9C0BAD3AF9F48E36A38F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + B021D393D0E2625741512320 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + B04D87ED6AA4897B6CD3CCF6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioComponent.cpp; path = ../../Source/Audio/AudioComponent.cpp; sourceTree = "SOURCE_ROOT"; }; + B081687E52C6A5157CFCCB17 = { isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-black-serialized"; path = "../../Resources/Fonts/cpmono-black-serialized"; sourceTree = "SOURCE_ROOT"; }; + B0A076D9536B6754F34E4606 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_ASIO.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp"; sourceTree = "SOURCE_ROOT"; }; + B0DCDCB162FDBF972FA5B548 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MessageManager.mm"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; }; + B0E8FAD5AC445F612E3468B9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterNode.cpp; path = ../../Source/Processors/FilterNode.cpp; sourceTree = "SOURCE_ROOT"; }; + B1082A8A306A1947F5B0E5FC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Splitter.h; path = ../../Source/Processors/Utilities/Splitter.h; sourceTree = "SOURCE_ROOT"; }; + B113BC1061788A9ECB1337C5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLGraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + B11E5B5E4483AF89E6DCBAB3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + B123E2F4439DAD65196A2A9D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ProgressBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + B13BDA434DEF56BB48B26896 = { isa = PBXFileReference; lastKnownFileType = file; name = "miso-serialized"; path = "../../Resources/Fonts/miso-serialized"; sourceTree = "SOURCE_ROOT"; }; + B174EBEF82212C8624300F59 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + B17AA637E5C357FACC38EBB7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SHA256.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.cpp"; sourceTree = "SOURCE_ROOT"; }; + B1887A7D2E27FF4DD03D16C1 = { isa = PBXFileReference; lastKnownFileType = image.png; name = DefaultDataSource.png; path = ../../Resources/Images/Icons/DefaultDataSource.png; sourceTree = "SOURCE_ROOT"; }; + B1A8C18C6E4B3572B8B750AD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MultiTimer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp"; sourceTree = "SOURCE_ROOT"; }; + B1ECBE9C48227CBDB16E3702 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ShapeButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + B2017626F9A05C8C0EBE9B7E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MD5.cpp"; path = "../../JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.cpp"; sourceTree = "SOURCE_ROOT"; }; + B20469D88488F0809126CC80 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_processors.mm"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; }; + B2241E3C5C9F93389586F357 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryIterator.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h"; sourceTree = "SOURCE_ROOT"; }; + B23E6EBB5F99CF7FC72FAC4E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = VisualizerEditor.h; path = ../../Source/Processors/Editors/VisualizerEditor.h; sourceTree = "SOURCE_ROOT"; }; + B24098EC4FD79D5EDC9383EC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Initialisation.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Initialisation.h"; sourceTree = "SOURCE_ROOT"; }; + B27F558F42AC78F0E564B5AF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioNode.cpp; path = ../../Source/Processors/AudioNode.cpp; sourceTree = "SOURCE_ROOT"; }; + B2EF409A1F459E964756BA7C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + B2FA9CC4754E136F22281176 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageEffectFilter.h"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h"; sourceTree = "SOURCE_ROOT"; }; + B3BAC48D01C49D8727D08097 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ListBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + B43C27BEC3AB681389FC5FC5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinate.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h"; sourceTree = "SOURCE_ROOT"; }; + B47B3368AA1A182B0CA1AB26 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Butterworth.cpp; path = ../../Source/Dsp/Butterworth.cpp; sourceTree = "SOURCE_ROOT"; }; + B4C52FC94D6C680C33ED85C9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_File.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_File.cpp"; sourceTree = "SOURCE_ROOT"; }; + B4F0C0B262654C4782B5AC49 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileChooserDialogBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h"; sourceTree = "SOURCE_ROOT"; }; + B5ADA0C1BDBFAE2A2F8ECB48 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_EdgeTable.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h"; sourceTree = "SOURCE_ROOT"; }; + B5B417E4196236A2CDE7F0CF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatManager.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + B5E8A19FF91BEAD02C63E05B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsPostScriptRenderer.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h"; sourceTree = "SOURCE_ROOT"; }; + B5FBD4DBD2CFE0FFF457D7F6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedArray.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h"; sourceTree = "SOURCE_ROOT"; }; + B60D02B5BF564ABC88841B1F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TableHeaderComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h"; sourceTree = "SOURCE_ROOT"; }; + B64193A23B69D4A88CDEDD0C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiOutput.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp"; sourceTree = "SOURCE_ROOT"; }; + B64893F699A10B03AA4AFF6B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_ASCII.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h"; sourceTree = "SOURCE_ROOT"; }; + B6567CAE2B538E79E7DA814C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadWithProgressWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + B674DCA2C2A6AF6B58AA7820 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentAnimator.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp"; sourceTree = "SOURCE_ROOT"; }; + B678CFC6B378A58834D2E41F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LowLevelGraphicsPostScriptRenderer.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp"; sourceTree = "SOURCE_ROOT"; }; + B70D836E0756C3D4EE8E20F2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SpikeDetector.h; path = ../../Source/Processors/SpikeDetector.h; sourceTree = "SOURCE_ROOT"; }; + B767A249792EB15A87054409 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ChebyshevII.cpp; path = ../../Source/Dsp/ChebyshevII.cpp; sourceTree = "SOURCE_ROOT"; }; + B7BEB7779860FE877E4D1BC8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextDiff.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp"; sourceTree = "SOURCE_ROOT"; }; + B7D848E4F85AE11FDE4D164D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + B83EBFAE6306941F79044523 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsDisplayComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + B87864B2D6A2E741D4B426A3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Threads.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm"; sourceTree = "SOURCE_ROOT"; }; + B87C1BD13762817BE27DC2F7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FillType.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h"; sourceTree = "SOURCE_ROOT"; }; + B8A9063181FEE1920095F824 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeBroadcaster.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; + B8D19858CC01BB5F7C35ED58 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XmlDocument.cpp"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; + B917780A75945062761B6945 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WiFiOutput.h; path = ../../Source/Processors/WiFiOutput.h; sourceTree = "SOURCE_ROOT"; }; + B93B8666F8AF2E5D2E851B1C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_VSTPluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + B9E2607F1605D308CB331FCC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StringPairArray.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp"; sourceTree = "SOURCE_ROOT"; }; + BA03776682290FF1AF4C0106 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginDescription.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h"; sourceTree = "SOURCE_ROOT"; }; + BA09F5CDB1C01E0FC153DB8E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NativeMessageBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_NativeMessageBox.h"; sourceTree = "SOURCE_ROOT"; }; + BA2923571505AD47CA1EF878 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WiFiOutputEditor.h; path = ../../Source/Processors/Editors/WiFiOutputEditor.h; sourceTree = "SOURCE_ROOT"; }; + BABBEE3876B90C8A57C3074D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentAnimator.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h"; sourceTree = "SOURCE_ROOT"; }; + BAE93A5EEC37D7B4C793BFA2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_QuickTimeAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + BB0BB31575E1377F0C560D53 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeCoordinate.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp"; sourceTree = "SOURCE_ROOT"; }; + BB26BA9CFAE8C836251E8EAF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainWindow.h; path = ../../Source/MainWindow.h; sourceTree = "SOURCE_ROOT"; }; + BBC386B5A369262583AD4DDA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_QuickTimeAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + BBCDE855BD0A58D3779D96A8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RHD2000Editor.h; path = ../../Source/Processors/Editors/RHD2000Editor.h; sourceTree = "SOURCE_ROOT"; }; + BBD9C2AED6F500D090069007 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ReferenceNode.cpp; path = ../../Source/Processors/ReferenceNode.cpp; sourceTree = "SOURCE_ROOT"; }; + BBDFB328C3D5FC72A0446E6A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_graphics.mm"; path = "../../JuceLibraryCode/modules/juce_graphics/juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; }; + BBE1DB78E35135B41537DCB5 = { isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; }; + BBF5345C0570D87C01A73FF9 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "noise_wave.png"; path = "../../Resources/Images/Icons/noise_wave.png"; sourceTree = "SOURCE_ROOT"; }; + BC06C1E8052799F4696101C3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_SystemStats.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm"; sourceTree = "SOURCE_ROOT"; }; + BC3B7E4E25505D9044BFACC7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeDetector.cpp; path = ../../Source/Processors/SpikeDetector.cpp; sourceTree = "SOURCE_ROOT"; }; + BC953E395B22FB1D305E483E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MACAddress.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h"; sourceTree = "SOURCE_ROOT"; }; + BCB6A6D5A0C1417D74C29632 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Files.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + BCBBF8764A2101CD0E91DB5D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadower.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h"; sourceTree = "SOURCE_ROOT"; }; + BD1D02C70CCE095217581A5F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_MessageManager.mm"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; }; + BD59A961F87AB628777894DC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnailCache.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp"; sourceTree = "SOURCE_ROOT"; }; + BDFF189EC742274DD2629196 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RectangleList.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.cpp"; sourceTree = "SOURCE_ROOT"; }; + BE506F381B90833512348968 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FloatVectorOperations.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"; sourceTree = "SOURCE_ROOT"; }; + BEC4B69320BE492526794DFB = { isa = PBXFileReference; lastKnownFileType = image.png; name = wifi.png; path = ../../Resources/Images/Icons/wifi.png; sourceTree = "SOURCE_ROOT"; }; + BF647E1FAE73208AC29C14F7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Sampler.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp"; sourceTree = "SOURCE_ROOT"; }; + BF8B07C8BC86002C3DC94DEE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryOutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + BF9B6B0B73FF87595307D858 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_gui_basics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + BFF368651E3CEE5A900391A6 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "square_wave.png"; path = "../../Resources/Images/Icons/square_wave.png"; sourceTree = "SOURCE_ROOT"; }; + C055D09224D84121A3EBB29F = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + C0A718EA721772EA6B837F39 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + C0B54E0803BA87C8BC353551 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_video.h"; path = "../../JuceLibraryCode/modules/juce_video/juce_video.h"; sourceTree = "SOURCE_ROOT"; }; + C0C6335FEE0844872FDF4EE2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Memory.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Memory.h"; sourceTree = "SOURCE_ROOT"; }; + C10DC7C6E887B4EAAB8EDF38 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChoicePropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + C1435AB0105CDC29A3124E4F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CustomTypeface.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + C16065CD5A8054262B81C1A3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_cryptography.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/juce_cryptography.h"; sourceTree = "SOURCE_ROOT"; }; + C17E85281A455245543930E5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_NSViewComponentPeer.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm"; sourceTree = "SOURCE_ROOT"; }; + C195559D311BAB51CFB545BA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MultiDocumentPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + C1CB526B75E406851FA918C6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = State.cpp; path = ../../Source/Dsp/State.cpp; sourceTree = "SOURCE_ROOT"; }; + C1E1CCE5796B40E0A45FB021 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnail.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.h"; sourceTree = "SOURCE_ROOT"; }; + C209C7633D01E525231EE894 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GlyphArrangement.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"; sourceTree = "SOURCE_ROOT"; }; + C2746A86EC16D3EA9FAC2C1D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XmlElement.cpp"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp"; sourceTree = "SOURCE_ROOT"; }; + C29BC68B2721471F32906FEB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ResamplingNode.h; path = ../../Source/Processors/ResamplingNode.h; sourceTree = "SOURCE_ROOT"; }; + C29E664781AA2396C8D59543 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_events.mm"; path = "../../JuceLibraryCode/modules/juce_events/juce_events.mm"; sourceTree = "SOURCE_ROOT"; }; + C2D1409D20E154E43569C725 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImagePreviewComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + C2F9D279FCC5C4AD56A0C1DF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Decibels.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h"; sourceTree = "SOURCE_ROOT"; }; + C39772F796D85E8FE98474D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Filter.h; path = ../../Source/Dsp/Filter.h; sourceTree = "SOURCE_ROOT"; }; + C3BD84D9B090F98DD09F5958 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Params.h; path = ../../Source/Dsp/Params.h; sourceTree = "SOURCE_ROOT"; }; + C41504F388D0B181B003B627 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativePoint.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h"; sourceTree = "SOURCE_ROOT"; }; + C446923C1950EB5BE5E67F15 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TargetPlatform.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h"; sourceTree = "SOURCE_ROOT"; }; + C454DFC77F19AB044372610E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MarkerList.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp"; sourceTree = "SOURCE_ROOT"; }; + C4B0DF8094C90543A65E03E3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Legendre.cpp; path = ../../Source/Dsp/Legendre.cpp; sourceTree = "SOURCE_ROOT"; }; + C51CD15B311D0AAC08D0B908 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ImageIcon.h; path = ../../Source/Processors/Editors/ImageIcon.h; sourceTree = "SOURCE_ROOT"; }; + C5287F057A6A88BC33D5498A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableComposite.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"; sourceTree = "SOURCE_ROOT"; }; + C54760E4888674CF3CF022E6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessor.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h"; sourceTree = "SOURCE_ROOT"; }; + C5785E58E6F915165729EF16 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RecordControl.h; path = ../../Source/Processors/Utilities/RecordControl.h; sourceTree = "SOURCE_ROOT"; }; + C5ABE6BDCA91410BA92A7BD9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ResamplingNodeEditor.cpp; path = ../../Source/Processors/Editors/ResamplingNodeEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + C5D0E0996D20BEEEDBFD64FA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ValueTree.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h"; sourceTree = "SOURCE_ROOT"; }; + C5D9C53AE4AE414244E1E19A = { isa = PBXFileReference; lastKnownFileType = image.png; name = muteoff.png; path = ../../Resources/Images/Buttons/muteoff.png; sourceTree = "SOURCE_ROOT"; }; + C5F9A0F8EB81AC15D9BDD61F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLFrameBuffer.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h"; sourceTree = "SOURCE_ROOT"; }; + C660716FDD337EFB1A7C6C72 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Path.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h"; sourceTree = "SOURCE_ROOT"; }; + C679AE9BBB9B1EE3BAB09E11 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBasedDocument.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.h"; sourceTree = "SOURCE_ROOT"; }; + C67AA7952D9EF7E248118B85 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StringPool.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp"; sourceTree = "SOURCE_ROOT"; }; + C67C5EC0EE8DBC501C8AA395 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedPipe.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h"; sourceTree = "SOURCE_ROOT"; }; + C6BDC4DAD5B40321DA67462A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h"; sourceTree = "SOURCE_ROOT"; }; + C6E19D3864B40A52BCC49315 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ModifierKeys.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h"; sourceTree = "SOURCE_ROOT"; }; + C74399C81B1A0552CC52093E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GenericAudioProcessorEditor.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h"; sourceTree = "SOURCE_ROOT"; }; + C79249376E3FDF10615E16EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WiFiOutputEditor.cpp; path = ../../Source/Processors/Editors/WiFiOutputEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + C7A68BAFB04A7D5FD81FA82B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + C7A76C0D1B3DC4A1F059E59B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Label.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.h"; sourceTree = "SOURCE_ROOT"; }; + C7CA628FE3E1E3D16B24E059 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Threads.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; + C844D1792A91BE2D8808CB14 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MessageManager.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h"; sourceTree = "SOURCE_ROOT"; }; + C868329EBC1BBA606AB2EB88 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + C916444FD4BFB79D4DE9FCAF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AttributedString.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp"; sourceTree = "SOURCE_ROOT"; }; + C98D4FF283E598244E89CD83 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextDiff.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h"; sourceTree = "SOURCE_ROOT"; }; + CA09B0483969444C7CD106DC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Fonts.mm"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm"; sourceTree = "SOURCE_ROOT"; }; + CAA3B9396EA62166234DAEF1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = VisualizerEditor.cpp; path = ../../Source/Processors/Editors/VisualizerEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + CB2C4FD47184B2FE84408CAD = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_neutral-03.png"; path = "../../Resources/Images/Icons/RadioButtons_neutral-03.png"; sourceTree = "SOURCE_ROOT"; }; + CC35C78D5B446ABF57DDDAE0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageFileFormat.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h"; sourceTree = "SOURCE_ROOT"; }; + CC42C4D4230BE4F1071CB2D3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableEdgeComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h"; sourceTree = "SOURCE_ROOT"; }; + CC62E20B1189C697DD238810 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGL_linux.h"; path = "../../JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_linux.h"; sourceTree = "SOURCE_ROOT"; }; + CCC20313AD0D0993F9EDD1B3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SplitterEditor.h; path = ../../Source/Processors/Editors/SplitterEditor.h; sourceTree = "SOURCE_ROOT"; }; + CD2370F8F4A44446558A08FB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Parameter.cpp; path = ../../Source/Processors/Parameter.cpp; sourceTree = "SOURCE_ROOT"; }; + CD2E26CFD0DC7F6090E15A20 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Line.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h"; sourceTree = "SOURCE_ROOT"; }; + CD41C1D09F6D73FA33993F45 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Desktop.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h"; sourceTree = "SOURCE_ROOT"; }; + CD492AC7B458FA6C321B9D0B = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_core/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + CD7E06ED47B243518F42DA49 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "MergerA-02.png"; path = "../../Resources/Images/Buttons/MergerA-02.png"; sourceTree = "SOURCE_ROOT"; }; + CD83E301AE42E6E3317D575D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableHeaderComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + CDC18ABAFEF000C720CE8622 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CallOutBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + CE2BD40797A6E7647FDBE736 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ColourSelector.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.cpp"; sourceTree = "SOURCE_ROOT"; }; + CF5BC8DB7D66C655DABA9129 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_android_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + CF758CB1E06DDA1AB7F5C9CC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_events.h"; path = "../../JuceLibraryCode/modules/juce_events/juce_events.h"; sourceTree = "SOURCE_ROOT"; }; + CFB86C1F2A6076ADC36692AA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Utilities.h; path = ../../Source/Dsp/Utilities.h; sourceTree = "SOURCE_ROOT"; }; + D01254FA41688494C3CB0889 = { isa = PBXFileReference; lastKnownFileType = file.ttf; name = silkscreen.ttf; path = ../../Resources/Fonts/silkscreen.ttf; sourceTree = "SOURCE_ROOT"; }; + D0247929128D618A2EB01D86 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OpenGLHelpers.cpp"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp"; sourceTree = "SOURCE_ROOT"; }; + D056D7F6C8EA8A6BBCC5C092 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h"; sourceTree = "SOURCE_ROOT"; }; + D06A8FDAD8B22537EA594383 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableLayoutResizerBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h"; sourceTree = "SOURCE_ROOT"; }; + D0D7CE266BD7CC5455926700 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSourcePlayer.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h"; sourceTree = "SOURCE_ROOT"; }; + D0E568AD5445AF061317E01D = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_formats/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + D11BC618E53E6605B3A579E1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryBlock.cpp"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp"; sourceTree = "SOURCE_ROOT"; }; + D128F31F18331117287F5EC5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ArduinoOutput.h; path = ../../Source/Processors/ArduinoOutput.h; sourceTree = "SOURCE_ROOT"; }; + D162391A46FF93093C328F9D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GZIPCompressorOutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + D171071934C8F7F925B0D113 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableListBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + D1D8F82F848413581B274A5D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_CameraDevice.cpp"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_win32_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; }; + D1F9878B45ABC403F3749567 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileBasedDocument.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; + D22D3958949713747DAF59A3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + D2696B30CBEAD7CE72510AFA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InfoLabel.h; path = ../../Source/UI/InfoLabel.h; sourceTree = "SOURCE_ROOT"; }; + D2A3B4CDD296B4CEC6902FD7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = UIComponent.cpp; path = ../../Source/UI/UIComponent.cpp; sourceTree = "SOURCE_ROOT"; }; + D2CCDDF54D6D6F2BF4281F2D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BooleanPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + D30880F1F9F514CEEDB9F48B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; }; + D357A886F6365DA33D639FF5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_NSViewComponent.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm"; sourceTree = "SOURCE_ROOT"; }; + D38E60AC4854B6E1EDE488EB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ArduinoOutput.cpp; path = ../../Source/Processors/ArduinoOutput.cpp; sourceTree = "SOURCE_ROOT"; }; + D3AE8303545E28D793312F46 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GenericEditor.cpp; path = ../../Source/Processors/Editors/GenericEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + D41ED9ADBE3B27E185B2E3F3 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_neutral-05.png"; path = "../../Resources/Images/Icons/RadioButtons_neutral-05.png"; sourceTree = "SOURCE_ROOT"; }; + D48EB74E1B5AAC7846196B01 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + D4B0BD47094D79AB6382228B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLTexture.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLTexture.h"; sourceTree = "SOURCE_ROOT"; }; + D4F94F0232F0CD426DFC44C5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PreferencesPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.h"; sourceTree = "SOURCE_ROOT"; }; + D51315B4241B019BE43EE4F1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SplitterEditor.cpp; path = ../../Source/Processors/Editors/SplitterEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + D51575B9AA7216CCE4B558E4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TopLevelWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.h"; sourceTree = "SOURCE_ROOT"; }; + D55137DE3404D7DF2A1F50D0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GIFLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + D5D6DAA3CFDD395096D2B072 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedObject.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h"; sourceTree = "SOURCE_ROOT"; }; + D60F42AEB8551E83215691C3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ZipFile.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h"; sourceTree = "SOURCE_ROOT"; }; + D679982E05B9510FE239D690 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + D685CFEA6344360FBFC355B6 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; }; + D71AD519382D547C958B0175 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UndoableAction.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h"; sourceTree = "SOURCE_ROOT"; }; + D7807913367AD1B1FCBDEFAC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationBase.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp"; sourceTree = "SOURCE_ROOT"; }; + D7E51310BD1B8EF6A2A77177 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MenuBarModel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp"; sourceTree = "SOURCE_ROOT"; }; + D840E516B1DE9F3F730283D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyboardFocusTraverser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp"; sourceTree = "SOURCE_ROOT"; }; + D88B0ADDC9BF206E3D2EE9F6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RectangleList.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h"; sourceTree = "SOURCE_ROOT"; }; + D8A40F2BFBEC65019C867786 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Time.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_Time.h"; sourceTree = "SOURCE_ROOT"; }; + D8AA3ED11D45FACF74B5FC05 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_neutral-01.png"; path = "../../Resources/Images/Icons/RadioButtons_neutral-01.png"; sourceTree = "SOURCE_ROOT"; }; + D8AFDCC674A7514B7019EEA6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h"; sourceTree = "SOURCE_ROOT"; }; + D8D895B3AD895C6E7FD446BF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Custom.cpp; path = ../../Source/Dsp/Custom.cpp; sourceTree = "SOURCE_ROOT"; }; + D90290A0AA2C36CE757E46D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FilterEditor.cpp; path = ../../Source/Processors/Editors/FilterEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + D952A208CC8164F0B459EC9E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_WebBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + D960588B732D973B82500E2D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorListener.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"; sourceTree = "SOURCE_ROOT"; }; + D9C9FCA6D705B72B80DB1142 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Socket.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp"; sourceTree = "SOURCE_ROOT"; }; + D9CB4CEC2C07346BE69262A0 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected-01.png"; path = "../../Resources/Images/Icons/RadioButtons_selected-01.png"; sourceTree = "SOURCE_ROOT"; }; + DA0AE9F4A1DDC3555247216F = { isa = PBXFileReference; lastKnownFileType = image.png; name = IntanIcon.png; path = ../../Resources/Images/Icons/IntanIcon.png; sourceTree = "SOURCE_ROOT"; }; + DA30BA6BF482A353393D5926 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeRectangle.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp"; sourceTree = "SOURCE_ROOT"; }; + DA4A6BD7079F2BC73B5035F3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OpenGLCanvas.h; path = ../../Source/Processors/Visualization/OpenGLCanvas.h; sourceTree = "SOURCE_ROOT"; }; + DAA04A0FD47097893712B241 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SpikeDisplayNode.cpp; path = ../../Source/Processors/SpikeDisplayNode.cpp; sourceTree = "SOURCE_ROOT"; }; + DAA4306D30617137463ED247 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeRectangle.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h"; sourceTree = "SOURCE_ROOT"; }; + DAC81FECCE54087394BE69F7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WaitableEvent.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h"; sourceTree = "SOURCE_ROOT"; }; + DACD0879E139527D971D3AC4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileListComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h"; sourceTree = "SOURCE_ROOT"; }; + DB4F34DA0F04B40EB6A50FB1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemStats.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h"; sourceTree = "SOURCE_ROOT"; }; + DB4FB8EAFA1714529E527C3D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Messaging.cpp"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; + DB4FF7675E5C98CF62DA8A2E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AccessClass.h; path = ../../Source/AccessClass.h; sourceTree = "SOURCE_ROOT"; }; + DB550BAB034060FF4578BB64 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_basics.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h"; sourceTree = "SOURCE_ROOT"; }; + DB702F259EF24DAB9EC99D0A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FPGAOutput.h; path = ../../Source/Processors/FPGAOutput.h; sourceTree = "SOURCE_ROOT"; }; + DB7866AFC8A4894810DBD05E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterProcessLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h"; sourceTree = "SOURCE_ROOT"; }; + DBB769DEBCD6468C13A3CD25 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; + DBB86AD59BA3F6EC09AF2C02 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LfpDisplayNode.h; path = ../../Source/Processors/LfpDisplayNode.h; sourceTree = "SOURCE_ROOT"; }; + DBCA7E2FFCFD1354DD19DDD6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_data_structures.mm"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; }; + DBED17FBB262C4DACEEDA9B0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiKeyboardState.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp"; sourceTree = "SOURCE_ROOT"; }; + DC200873B263C55E82B5384D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTimer.h"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h"; sourceTree = "SOURCE_ROOT"; }; + DD5695DE97CEF7BE76869232 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileOutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + DD91BA89F53CB299B8A30B26 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IntanThread.h; path = ../../Source/Processors/DataThreads/IntanThread.h; sourceTree = "SOURCE_ROOT"; }; + DDE157BB06373ECDBB23469C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableLayoutManager.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h"; sourceTree = "SOURCE_ROOT"; }; + DDE89F0D5E01F079323CC89C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorPlayer.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h"; sourceTree = "SOURCE_ROOT"; }; + DE4861552DB1976665B25DFD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HighResolutionTimer.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp"; sourceTree = "SOURCE_ROOT"; }; + DEB9A630503639D42056236B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UndoManager.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h"; sourceTree = "SOURCE_ROOT"; }; + DEE2959DBBC84EA8448A0F77 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TimeSliceThread.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h"; sourceTree = "SOURCE_ROOT"; }; + DEF465116BB906FD116DA5EB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ofConstants.h; path = ../../Source/Processors/Serial/ofConstants.h; sourceTree = "SOURCE_ROOT"; }; + DF3C9A1DD67E879E4E0A2727 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_basics.mm"; path = "../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; }; + DFAA7B563CEFB94D9ADB5D6A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + DFFB7396DCE9DF1253217584 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnailCache.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h"; sourceTree = "SOURCE_ROOT"; }; + E040EA8B5BB61ABBBD14F12F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OggVorbisAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + E08E877C3A6283CF5C803957 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainWindow.cpp; path = ../../Source/MainWindow.cpp; sourceTree = "SOURCE_ROOT"; }; + E0ADC34D69113B79C2F4FF24 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CustomTypeface.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h"; sourceTree = "SOURCE_ROOT"; }; + E0C264CF6345ABB4CAB98B92 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedPointer.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h"; sourceTree = "SOURCE_ROOT"; }; + E20D5F2F75478DA4943CEDBD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActionBroadcaster.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; + E216D095C98F850A5FB6FB0F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ChannelSelector.cpp; path = ../../Source/Processors/Editors/ChannelSelector.cpp; sourceTree = "SOURCE_ROOT"; }; + E21CA41B44E191F1804F9662 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + E23FA5E940A1434B0305875D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableCornerComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h"; sourceTree = "SOURCE_ROOT"; }; + E2F46E110416D628C11392CA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Parameter.h; path = ../../Source/Processors/Parameter.h; sourceTree = "SOURCE_ROOT"; }; + E31563D2E7DDD8315F369233 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; + E33F167E4AA1C44596A1EBED = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsHelpers.h"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + E34E535DA9CBF248E32F7B45 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReadWriteLock.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp"; sourceTree = "SOURCE_ROOT"; }; + E37140E9E8F7CFDDEEEF6148 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemFactory.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h"; sourceTree = "SOURCE_ROOT"; }; + E3C4B6B362320594789E1297 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertySet.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp"; sourceTree = "SOURCE_ROOT"; }; + E3D9DABE0A9C1DCE6A6515CB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MixerAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + E419C9DA3202B8B6EC2DB723 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Reverb.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h"; sourceTree = "SOURCE_ROOT"; }; + E44B26F5D97CB483242DE05B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RBJ.h; path = ../../Source/Dsp/RBJ.h; sourceTree = "SOURCE_ROOT"; }; + E48A7B152993BCF473725A19 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CameraDevice.h"; path = "../../JuceLibraryCode/modules/juce_video/capture/juce_CameraDevice.h"; sourceTree = "SOURCE_ROOT"; }; + E4A2E203101AF37C169F1569 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferingAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + E53FEAA3754E6B5D99516D56 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KnownPluginList.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp"; sourceTree = "SOURCE_ROOT"; }; + E58A18793D25A1D75811A052 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImagePreviewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + E5B10AA248D400FDB2645084 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_WASAPI.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp"; sourceTree = "SOURCE_ROOT"; }; + E666E60CC07666669FC77C7D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryOutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + E67C5ACDC8208CDE200EC8C6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_graphics.h"; path = "../../JuceLibraryCode/modules/juce_graphics/juce_graphics.h"; sourceTree = "SOURCE_ROOT"; }; + E6D3A973D5CEF18CA2BAFF59 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + E7460F066237871A704733E7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterprocessConnection.h"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h"; sourceTree = "SOURCE_ROOT"; }; + E79259F2164D16553A69B458 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioComponent.h; path = ../../Source/Audio/AudioComponent.h; sourceTree = "SOURCE_ROOT"; }; + E79B7DC03F81DA1F8CDE21CA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandManager.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h"; sourceTree = "SOURCE_ROOT"; }; + E7ACE8C1456403A574236451 = { isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-bold-serialized"; path = "../../Resources/Fonts/cpmono-bold-serialized"; sourceTree = "SOURCE_ROOT"; }; + E7EE416EF527C7506B499070 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BigInteger.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h"; sourceTree = "SOURCE_ROOT"; }; + E8174B3346AA69361BF73AE1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Cascade.h; path = ../../Source/Dsp/Cascade.h; sourceTree = "SOURCE_ROOT"; }; + E835BEB3C42E4B241804BE13 = { isa = PBXFileReference; lastKnownFileType = file; name = "cpmono-light-serialized"; path = "../../Resources/Fonts/cpmono-light-serialized"; sourceTree = "SOURCE_ROOT"; }; + E8480C4ED7F9579F6172F7B5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Common.h; path = ../../Source/Dsp/Common.h; sourceTree = "SOURCE_ROOT"; }; + E8964C0BE264A55753BC6B7B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Midi.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp"; sourceTree = "SOURCE_ROOT"; }; + E90E364612E6D6EACBE0C063 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectXPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_DirectXPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + E90FCB43DA2FF766597DA75E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Documentation.cpp; path = ../../Source/Dsp/Documentation.cpp; sourceTree = "SOURCE_ROOT"; }; + E91923510CB2280C3A3B9E9C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LocalisedStrings.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h"; sourceTree = "SOURCE_ROOT"; }; + E93BE115650B1CB80EACB841 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EditorViewportButtons.h; path = ../../Source/UI/EditorViewportButtons.h; sourceTree = "SOURCE_ROOT"; }; + E946426F95E0240683CB3337 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawablePath.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h"; sourceTree = "SOURCE_ROOT"; }; + EA535EA158451360B7B8AE52 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpDisplayNode.cpp; path = ../../Source/Processors/LfpDisplayNode.cpp; sourceTree = "SOURCE_ROOT"; }; + EA9518CDEA7049C21D5CE2D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Process.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Process.h"; sourceTree = "SOURCE_ROOT"; }; + EAB6A66678B122C578B16445 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HighResolutionTimer.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h"; sourceTree = "SOURCE_ROOT"; }; + EC780F52ABBD7317A5CE2F33 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ChebyshevI.h; path = ../../Source/Dsp/ChebyshevI.h; sourceTree = "SOURCE_ROOT"; }; + F5A00ACFA3D76168F22F1205 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 99E1BC08B886CFDD2CCFD462 = { isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "open-ephys.app"; sourceTree = "BUILT_PRODUCTS_DIR"; }; + E42B745B4D2DCADE54F94757 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EventNode.h; path = ../../Source/Processors/EventNode.h; sourceTree = "SOURCE_ROOT"; }; + E594A85A291E0625E0410A85 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LfpDisplayEditor.h; path = ../../Source/Processors/Editors/LfpDisplayEditor.h; sourceTree = "SOURCE_ROOT"; }; + E7366E169158F5A2D1D7B55A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiFile.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h"; sourceTree = "SOURCE_ROOT"; }; + E91A272EF06892937CB4B9CE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentDragger.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"; sourceTree = "SOURCE_ROOT"; }; + E97684DCE824DEDA6683C6CD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Synthesiser.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp"; sourceTree = "SOURCE_ROOT"; }; + EA2FC92CECD1EDA1F07DC59C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TooltipWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.h"; sourceTree = "SOURCE_ROOT"; }; + EA354D7D8E48D461415D52D8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + EA73332E3D5AEC04ADDFBB2A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDataConverters.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"; sourceTree = "SOURCE_ROOT"; }; + EAB2319C7AA57E06A2247CDF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BorderSize.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h"; sourceTree = "SOURCE_ROOT"; }; + EAB637B566FEBBDADA654262 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VSTMidiEventList.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h"; sourceTree = "SOURCE_ROOT"; }; + EAC262A83CD2BEA14542AE89 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPool.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.h"; sourceTree = "SOURCE_ROOT"; }; + EAC7A64301F0BF2C5E33A1F9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnectionServer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"; sourceTree = "SOURCE_ROOT"; }; + EAEA49B9394D802B79CA8164 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPairArray.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h"; sourceTree = "SOURCE_ROOT"; }; + EB5F9A50EB53A57D6AE303C2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_QuickTimeMovieComponent.mm"; path = "../../JuceLibraryCode/modules/juce_video/native/juce_mac_QuickTimeMovieComponent.mm"; sourceTree = "SOURCE_ROOT"; }; + EBD8622EAEF10558809888B7 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-01.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-01.png"; sourceTree = "SOURCE_ROOT"; }; + EC95A2CF4B33EA37DA5FC1AC = { isa = PBXFileReference; lastKnownFileType = file.ttf; name = nordic.ttf; path = ../../Resources/Fonts/nordic.ttf; sourceTree = "SOURCE_ROOT"; }; + ECA6FDB1366BE7EC30F1539B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SourceNode.cpp; path = ../../Source/Processors/SourceNode.cpp; sourceTree = "SOURCE_ROOT"; }; + ECB5A75A81B90327F58CBD9E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = rhd2000datablock.cpp; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000datablock.cpp"; sourceTree = "SOURCE_ROOT"; }; + ECBEF88BBC974D96ED781C75 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_posix_SharedCode.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h"; sourceTree = "SOURCE_ROOT"; }; + ECCE033FF2ACE42188FA4A7F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TemporaryFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h"; sourceTree = "SOURCE_ROOT"; }; + ECE3BE71EB6B9CF1CE869BBE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h"; sourceTree = "SOURCE_ROOT"; }; + ED86166920362E9D2BE2CB26 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SVGParser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp"; sourceTree = "SOURCE_ROOT"; }; + ED887A521EEB8F3EBA7DDB31 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioIODeviceType.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"; sourceTree = "SOURCE_ROOT"; }; + EDA209B0E7D124EA581023AD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; + EDAC82BD742A54182E8DF2FE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinatePositioner.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h"; sourceTree = "SOURCE_ROOT"; }; + EE0336B43A39FD585DF638EE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableEdgeComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + EE2C669B127D00C86B1B8CA8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Registry.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp"; sourceTree = "SOURCE_ROOT"; }; + EE4DD055D31F7D9DC718DBD8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentMovementWatcher.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h"; sourceTree = "SOURCE_ROOT"; }; + EEA51B7EF1CF19028C6672E0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DocumentWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + EEFC66D2DF5FD66B4D83B22F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Component.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h"; sourceTree = "SOURCE_ROOT"; }; + EF059B26886B32000BCF8CFF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInputSource.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h"; sourceTree = "SOURCE_ROOT"; }; + EF3F9AA8D70E1D4D55F13182 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnail.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp"; sourceTree = "SOURCE_ROOT"; }; + EF4A6E0E1232071252ACCD7B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeParallelogram.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h"; sourceTree = "SOURCE_ROOT"; }; + EF610B2A17D9B1C0D24DCE67 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_android_JNIHelpers.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + EF7B66764093D950724EFE70 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLShaderProgram.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h"; sourceTree = "SOURCE_ROOT"; }; + EFC21F3CD0EB87D67E044E06 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; }; + F09FD6D9CA4997216ADBF54F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataBuffer.h; path = ../../Source/Processors/DataThreads/DataBuffer.h; sourceTree = "SOURCE_ROOT"; }; + F0CA3600E09054D7DB3B0067 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SmoothedFilter.h; path = ../../Source/Dsp/SmoothedFilter.h; sourceTree = "SOURCE_ROOT"; }; + F0D9A28C206D7A8BA7089D29 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyMappingEditorComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + F0F3834D46EA8FC8ADB206DB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AbstractFifo.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp"; sourceTree = "SOURCE_ROOT"; }; + F1099BFF0BC1656A23D62E84 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ScrollBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + F10FB240E10A5742CE366A91 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedButtonBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h"; sourceTree = "SOURCE_ROOT"; }; + F17DF27524262A21A3EC932D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + F1A3975235880CAC1D5757F4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MP3AudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + F1DBAE92084D9D90234AC436 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSourcePlayer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp"; sourceTree = "SOURCE_ROOT"; }; + F230A4C0186379F9EB0B0F74 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ReferenceNode.h; path = ../../Source/Processors/ReferenceNode.h; sourceTree = "SOURCE_ROOT"; }; + F28414731D9EE1F75D7B7043 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + F2A500BA3500C4A9D5792A54 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableImage.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h"; sourceTree = "SOURCE_ROOT"; }; + F2EDB88302B8A9356F43B834 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Primes.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h"; sourceTree = "SOURCE_ROOT"; }; + F2F11D7C596DAE5579610CCC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + F2FDC07162CAEDE524F09CFC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OpenGLCanvas.cpp; path = ../../Source/Processors/Visualization/OpenGLCanvas.cpp; sourceTree = "SOURCE_ROOT"; }; + F3D0224E4247BCB06A9E4DDF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyPressMappingSet.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp"; sourceTree = "SOURCE_ROOT"; }; + F3F48717927A4E24F7373C09 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedValueSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h"; sourceTree = "SOURCE_ROOT"; }; + F463A19E6EFEB2837582B117 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_processors.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h"; sourceTree = "SOURCE_ROOT"; }; + F46843B979D0385C733C797A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BubbleMessageComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + F4D2A03314AB1CF852CC4F2A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniserFunctions.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h"; sourceTree = "SOURCE_ROOT"; }; + F5642B98949DC0FA45EF904E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferedInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + F6EBDA368C553C37BE703BE5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Vector3D.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_Vector3D.h"; sourceTree = "SOURCE_ROOT"; }; + F70B7D65EF56B8A0ED36478C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WavAudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; + F796260525BD82FFC1D1732C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Uuid.cpp"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp"; sourceTree = "SOURCE_ROOT"; }; + F7979AFD5780D9B2208736EE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TooltipWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + F7F374C05CDE0DB7712D18D1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Atomic.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h"; sourceTree = "SOURCE_ROOT"; }; + F8322ED101601866FFB1698C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileOutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + F88A99110564C87FBA281F2C = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_video/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + F8E202A1374401022F87F26E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CoreAudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + F8EFE3709FDDC2D5F0843058 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Variant.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp"; sourceTree = "SOURCE_ROOT"; }; + F94BFC6B5057806EEF8B59DA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioIODevice.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp"; sourceTree = "SOURCE_ROOT"; }; + F94DD42C7BBF81C101D3F605 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EventNode.cpp; path = ../../Source/Processors/EventNode.cpp; sourceTree = "SOURCE_ROOT"; }; + F9E2371F1A99B292F2947FF5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; }; + F9F37AD1C3E7CA932FF44E69 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LagrangeInterpolator.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp"; sourceTree = "SOURCE_ROOT"; }; + FA1F1E9C7DEA48CAE6C247F4 = { isa = PBXFileReference; lastKnownFileType = image.png; name = OpenEphysBoardLogoGray.png; path = ../../Resources/Images/Icons/OpenEphysBoardLogoGray.png; sourceTree = "SOURCE_ROOT"; }; + FA23A1334E4CFA77BC18A153 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FPGAThread.cpp; path = ../../Source/Processors/DataThreads/FPGAThread.cpp; sourceTree = "SOURCE_ROOT"; }; + FA2F04BA4E146ABF649BBE89 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = rhd2000evalboard.h; path = "../../Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h"; sourceTree = "SOURCE_ROOT"; }; + FAC7E62CC15CA977A6FC72D1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChangeBroadcaster.cpp"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp"; sourceTree = "SOURCE_ROOT"; }; + FB1B880F24F376D1AC52F2A6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + FB1EA9CB3C695925627B0AC6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HeapBlock.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h"; sourceTree = "SOURCE_ROOT"; }; + FB33617B5082CC0CDC189F2C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyboardFocusTraverser.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h"; sourceTree = "SOURCE_ROOT"; }; + FB7E91937D3BBE00F64F0B72 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colours.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h"; sourceTree = "SOURCE_ROOT"; }; + FC080F7DF94ABCB7EA09224A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Colour.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp"; sourceTree = "SOURCE_ROOT"; }; + FC85D30C66E7A4E4A6CA29AE = { isa = PBXFileReference; lastKnownFileType = file.otf; name = "cpmono_bold.otf"; path = "../../Resources/Fonts/cpmono_bold.otf"; sourceTree = "SOURCE_ROOT"; }; + FC887C6CD74FE33F8BA784A6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MergerEditor.h; path = ../../Source/Processors/Editors/MergerEditor.h; sourceTree = "SOURCE_ROOT"; }; + FD3A6BD3A8898E137DF257B9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeParallelogram.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp"; sourceTree = "SOURCE_ROOT"; }; + FD770E73FD462E9C9F6DBFB2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PositionableAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + FD88DA941838FC91D222DF35 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RecentlyOpenedFilesList.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h"; sourceTree = "SOURCE_ROOT"; }; + FDAAB4F0D2A15A6F0F71945A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + FEB3730E084D7DD433D14A6C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h"; sourceTree = "SOURCE_ROOT"; }; + FEF0A4E3C8D22A830BCE2B67 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_JackAudio.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp"; sourceTree = "SOURCE_ROOT"; }; + FF082466FC37DC44320B3B7E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Draggable3DOrientation.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_Draggable3DOrientation.h"; sourceTree = "SOURCE_ROOT"; }; + FF1B5858C942CA02EEC38E69 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ios_Audio.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp"; sourceTree = "SOURCE_ROOT"; }; + FF3E5A9F8B9250790C6DA089 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_URL.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_URL.h"; sourceTree = "SOURCE_ROOT"; }; + FF450FAFD49105CE7157DFC0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Channel.h; path = ../../Source/Processors/Channel.h; sourceTree = "SOURCE_ROOT"; }; + FFBB9CE85A7C91FB11E4AEC8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + FFFBDB9A00240D797751FEE6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataWindow.h; path = ../../Source/Processors/Visualization/DataWindow.h; sourceTree = "SOURCE_ROOT"; }; + 9ADE9FD3E8A58C12B4B2D8B2 = { isa = PBXGroup; children = ( + B081687E52C6A5157CFCCB17, + E7ACE8C1456403A574236451, + 38A9627672C2562DBE257A05, + E835BEB3C42E4B241804BE13, + 1719507D8A73EA71F1C3F306, + 50DB7E5C152DDD03F2FA4C2D, + FC85D30C66E7A4E4A6CA29AE, + 24D86195580EFB86AC084DCC, + AA7F6609B897B9E134377A62, + 783D8922D5C687E170FA1A2C, + 32B658D7A44849A6F640AF37, + 847F6986DFA468BA8D80A531, + 0A2AD4AB14F93364EFB9611E, + B13BDA434DEF56BB48B26896, + EC95A2CF4B33EA37DA5FC1AC, + 9D050A509BEB9E3879DA35C6, + 66F524552E8DE88CDC2E40FD, + D01254FA41688494C3CB0889, + 61317B5191E05925F232E18C ); name = Fonts; sourceTree = "<group>"; }; + 048B10371EA2D5C7D883CC70 = { isa = PBXGroup; children = ( + 261B5AA82F2A86CC5500D8D2, + 92E3405CB31ACFE3F80BBAD4, + FA1F1E9C7DEA48CAE6C247F4, + 9F2BCD132F453B9D9EF09F15, + 57941E5B2E1FF6028A68D4A7, + 168823A9EBD85BFBFD2CE2EE, + 7FDFE493862CE27EFCAC3F7F, + 6D34DD9AB987A67BADE71C65, + D8AA3ED11D45FACF74B5FC05, + 3A6FE617A781EEFFD39E1216, + CB2C4FD47184B2FE84408CAD, + 93EFC1AA800FC5DA2F04A213, + D41ED9ADBE3B27E185B2E3F3, + D9CB4CEC2C07346BE69262A0, + A7FE538FF09AC8A58DE8F1BD, + AA3DAC9A4A3FF9E7D279FB23, + 79BBD2F2F31D76CC4F5BD012, + 32CEF6C84CD06B18035B035C, + EBD8622EAEF10558809888B7, + 1A22BB28E65B6D6636CCEBF1, + 1712916024EC787B6C231732, + 47976F6BE2942EED64AEA4D2, + 97C4F046D88561EEE245BE99, + BBF5345C0570D87C01A73FF9, + 7C1D87A0C78F661FB459786B, + 35AEAE0CC0B546625E163B9B, + BFF368651E3CEE5A900391A6, + 5C5E4C396CD83C46F58644A2, + BEC4B69320BE492526794DFB, + 6F9B89F7AD0E13887871D4FE, + B1887A7D2E27FF4DD03D16C1, + 8AE2DDA47B2DFDEEEF69B12F, + DA0AE9F4A1DDC3555247216F ); name = Icons; sourceTree = "<group>"; }; + 5B916D6239703986EFCDB624 = { isa = PBXGroup; children = ( + C5D9C53AE4AE414244E1E19A, + A764EF4F46F472715B250E41, + 05C35036E964AAD6024E0766, + CD7E06ED47B243518F42DA49, + 4F4E8E3B32DB7A91B41C9FFA, + 3FFC2A3429D8B1D957D18CA7, + A3CAB6B56641ED68D9784348, + 6B7252D3F574AE21BE464327, + 381F5DC605AE69088004DF80, + 5EA661C13CB7197A45F20028 ); name = Buttons; sourceTree = "<group>"; }; + 78AACAE5A74DDE52FE5848AF = { isa = PBXGroup; children = ( + 048B10371EA2D5C7D883CC70, + 5B916D6239703986EFCDB624 ); name = Images; sourceTree = "<group>"; }; + B9646290EA6B6995F8AEEAFB = { isa = PBXGroup; children = ( + 9ADE9FD3E8A58C12B4B2D8B2, + 78AACAE5A74DDE52FE5848AF ); name = Resources; sourceTree = "<group>"; }; + B43FF50BCF27E5D575CEF309 = { isa = PBXGroup; children = ( ); name = Plugins; sourceTree = "<group>"; }; + B016FBDF648372A23D7EAAD8 = { isa = PBXGroup; children = ( + 9F577889CB6C54A2F7B1CA80, + 7B42B28FDB2E3AC67EF296F8 ); name = Network; sourceTree = "<group>"; }; + BCD632E634E0F8A50827F9B6 = { isa = PBXGroup; children = ( + 1989E86F8DFDE34887AC0326, + 29D7893C278FFE00782637B6, + 22801F75289646F6A85E5583, + 361D8C54B3E54766CBC48046, + B47B3368AA1A182B0CA1AB26, + 6D59D5780ECD2CC9703CB499, + 09BCBD414282A3AA4F66A3A5, + E8174B3346AA69361BF73AE1, + AC2CFF4DA5CE431FCC628BA3, + EC780F52ABBD7317A5CE2F33, + B767A249792EB15A87054409, + 9CEDA04DB321755AF74D6FAF, + E8480C4ED7F9579F6172F7B5, + D8D895B3AD895C6E7FD446BF, + 3063CF211ABB734A9FD452EC, + 2B93450006102A0093F5EACB, + 7ACB1CB66D69738904358F43, + E90FCB43DA2FF766597DA75E, + 1086169B0EE86E04B64575C2, + 392408C1943AC6234BAAC743, + A95D898F0998F4609E992B5F, + 587FCA2485B9C89C2A99C23A, + C39772F796D85E8FE98474D5, + 38313692308D501E4CADF1D5, + C4B0DF8094C90543A65E03E3, + 4939A8B8300394AAD0926C0B, + A41C5A4CD5CF8EEFF993A8B1, + 3F6C67E29CDEDF2EF61C054F, + C3BD84D9B090F98DD09F5958, + 65312FAD0900119CDF6CF414, + 5A8D46BEB81DDF24462E3D92, + 9A21A229CFACC67E31F4F727, + E44B26F5D97CB483242DE05B, + 3F69480D6145C77992FA59BA, + 7EFF8622168303A4391D6CAE, + F0CA3600E09054D7DB3B0067, + C1CB526B75E406851FA918C6, + 9428D7423971764AC0BA9CB7, + 6340B1D2FECEABBBE6C0DE28, + CFB86C1F2A6076ADC36692AA ); name = Dsp; sourceTree = "<group>"; }; + C451728043944D40C69166C1 = { isa = PBXGroup; children = ( + B04D87ED6AA4897B6CD3CCF6, + E79259F2164D16553A69B458 ); name = Audio; sourceTree = "<group>"; }; + 3DE49DED45C5CDD8D184E248 = { isa = PBXGroup; children = ( + 3753B3B311AE0A9F4CC5AD40, + 758BC480F153DEA79304366B, + DEF465116BB906FD116DA5EB, + 308F614D30DCB9AE3767C928, + 92CB21BEE17D1DD03106AD87 ); name = Serial; sourceTree = "<group>"; }; + 4E3C60995CC567F1A839CAE3 = { isa = PBXGroup; children = ( + 258938780F93A7CF41366F26, + C5785E58E6F915165729EF16, + 4867923F31CC3EDC9B1A5BE5, + 6880C148A38A5C8D0092E358, + 2C4730CAFED4F6292B575318, + B1082A8A306A1947F5B0E5FC ); name = Utilities; sourceTree = "<group>"; }; + C4B85C0286AC2510730355E3 = { isa = PBXGroup; children = ( + 5894D40A0E8FA6E9B3EBF9D9, + ADCB42E4C5641007A4B78025, + A7D4C9E3ED3763847C087F46, + 4E6EE225098D32E7D5DE60B2, + 215E1BD79B5870D5356810F0, + 66463AB11EA4D6341C32F27E, + FFFBDB9A00240D797751FEE6, + 4A94E809624F99387E600399, + 12B5DDCB6E5ECD93A4C55BB5, + F2FDC07162CAEDE524F09CFC, + DA4A6BD7079F2BC73B5035F3 ); name = Visualization; sourceTree = "<group>"; }; + 9F16043BF599BCE0C02A00A5 = { isa = PBXGroup; children = ( + 45D78C8EF660EECE64BAA33F, + BBCDE855BD0A58D3779D96A8, + 1552007C6C6AF750278C5BE5, + 0B2B7732073D56E484950C8D, + 9C39C584DA6F507E773687EE, + 1C93ECD2B04F39923E66B529, + C5ABE6BDCA91410BA92A7BD9, + 0CCE619599DB39323E49FF3C, + 169F1B20FC9FFE88C53D2735, + 92528D6653802FACF658D8EA, + 1AD76E8111A738A8F3717060, + 8B9C0831BE4E09B7C0078B7E, + E216D095C98F850A5FB6FB0F, + 70F06DBCA3948BCC1062E36F, + 46E3A634686BFEF787229582, + 8B745839B225E44C9EB5C6FA, + 1EC95CD1D830F6D85ADB3B9D, + 25ABEB43042E98C668A16432, + CAA3B9396EA62166234DAEF1, + B23E6EBB5F99CF7FC72FAC4E, + 29FD7B383C5DDACAA7B8DFD3, + FC887C6CD74FE33F8BA784A6, + 04C6B933E1603B4D0916570D, + C51CD15B311D0AAC08D0B908, + C79249376E3FDF10615E16EA, + BA2923571505AD47CA1EF878, + 70151263C4CB8A4F79431E11, + 985F2B5047476B272B1A4BD4, + 9136BD46BE1E28A96FBBD440, + 265EDA19C88E74249FD66609, + 8A91849BE6B96EB8C0663469, + E594A85A291E0625E0410A85, + 6328434A329C353DB8D9512C, + 028D4D3C0862B4B1312E2395, + D51315B4241B019BE43EE4F1, + CCC20313AD0D0993F9EDD1B3, + A252FE4E6A360CBC4AF694B3, + 83E5EA2AA0CB928889AC80AB, + 10BE33089BA6F3468F36CD6C, + A0E3B98412D88921BB0AA58E, + D90290A0AA2C36CE757E46D5, + 49FA151B1837E543D18858EB, + D3AE8303545E28D793312F46, + 984BC60C0AFF3EDED692FA01 ); name = Editors; sourceTree = "<group>"; }; + EBA825AF6FDB51EBA368CB8D = { isa = PBXGroup; children = ( + 235A8987D99A191D07208D2F, + 14F594C425F332F455A16D35, + ECB5A75A81B90327F58CBD9E, + 80EEDD40F49120ADBE9DCBDF, + 2D2BAC4320470CF68743F58E, + FA2F04BA4E146ABF649BBE89, + 5DB3B3197F8C1E5EE159D6FC, + 8A989F74B1957BCB3B9BA398 ); name = "rhythm-api"; sourceTree = "<group>"; }; + DEA24DC5AC8325310FB40395 = { isa = PBXGroup; children = ( + EBA825AF6FDB51EBA368CB8D, + A3FB0EA0264580F6B00D993B, + 23A6BA852B71DAAF3F709428, + 1718EC50691D8421EC00F8B3, + 95B57108E929DD11F898B7B1, + FA23A1334E4CFA77BC18A153, + 8751DF970A9E3598683BACAF, + 788F8B7719B70465762B634B, + F09FD6D9CA4997216ADBF54F, + 9C089C090E400CC0E8BBB827, + DD91BA89F53CB299B8A30B26, + 92602D7166325C7232B85EDD, + 0287B009511521BEAAE8A52C ); name = DataThreads; sourceTree = "<group>"; }; + 83A3E005DDFCC55F277EEDA5 = { isa = PBXGroup; children = ( + BBD9C2AED6F500D090069007, + F230A4C0186379F9EB0B0F74, + 9FFD9560522567A033226BD7, + 229989EC8A6F145C81348CA9, + 76F569AE7B444D8F69EE0E86, + 17CE6B2913E72ED8727ECD56, + 9BC055494F9FEE3F90630541, + FF450FAFD49105CE7157DFC0, + 3DE49DED45C5CDD8D184E248, + 39464D2A22940DA2DDCCCFC6, + 91D7B1F8B94AE9CFCC53771F, + 9D78F50147005EDB0E89E2B4, + DB702F259EF24DAB9EC99D0A, + D38E60AC4854B6E1EDE488EB, + D128F31F18331117287F5EC5, + CD2370F8F4A44446558A08FB, + E2F46E110416D628C11392CA, + DAA04A0FD47097893712B241, + 5EA61EDD64BE1E401DD0AA5E, + 2D41C43686CDE35E86A389D7, + B917780A75945062761B6945, + EA535EA158451360B7B8AE52, + DBB86AD59BA3F6EC09AF2C02, + 4E3C60995CC567F1A839CAE3, + C4B85C0286AC2510730355E3, + BC3B7E4E25505D9044BFACC7, + B70D836E0756C3D4EE8E20F2, + B27F558F42AC78F0E564B5AF, + 5F64FDAFCA899A16C7FDDBCA, + F94DD42C7BBF81C101D3F605, + E42B745B4D2DCADE54F94757, + 9F16043BF599BCE0C02A00A5, + DEA24DC5AC8325310FB40395, + A4E2CAAF556D557B24182414, + 3EAE25787DBFBA8EFC42A277, + 5522973FA48A13C6BED293FE, + 23EAFAEA6457DB4E452F8715, + A98A22CF5F208ED6DBE08063, + C29BC68B2721471F32906FEB, + B0E8FAD5AC445F612E3468B9, + 886E18520E8BD77234E1B686, + ECA6FDB1366BE7EC30F1539B, + 154303EE3929F26B93792187, + 3AE038CACE48AF85C4FB1ED5, + 5B2A4DD7133CDE5AEC24CC07, + 555D34D0CD8776EE5996CC3A, + 0FDD7551AC98348D4A98ADC7 ); name = Processors; sourceTree = "<group>"; }; + 1D78FCCF430CD91FD1DBD95B = { isa = PBXGroup; children = ( + 9F3B3184EC6D42CEA35D6ED8, + E93BE115650B1CB80EACB841, + 0987F7E90136D0E08A606A22, + 48F6281AB92B232E5187D00C, + 7E875E681E18D693D5ADB2FB, + 57FBA8BC3104D3AF41FBECD8, + 79C91DDF3BC3F15D0338E504, + 105B1452DF6CE1D80D69A9D1, + 3774BBCA6CB133D9A854CF71, + 19148DBA36B94FA639DF3A72, + 17E13CCDA0C82F92EAB05BE6, + D2696B30CBEAD7CE72510AFA, + 47A3942AC30A3212C01F1CAF, + 7D9374931D760ADC65DCBFC6, + 7BD2C39F13FDE202141C4B41, + 9B9EDDFA0AE4991BC7FC7263, + 610E487E060C42B52FD5AAC9, + 0FE8ACC50ED8E7FFC9E6B9B4, + D2A3B4CDD296B4CEC6902FD7, + 3FC794735FA8DDA39A62224B ); name = UI; sourceTree = "<group>"; }; + 3564F28A16A2BDF3B1D5035E = { isa = PBXGroup; children = ( + B43FF50BCF27E5D575CEF309, + 420B0E95F1300ABFDC125DBF, + DB4FF7675E5C98CF62DA8A2E, + B016FBDF648372A23D7EAAD8, + BCD632E634E0F8A50827F9B6, + C451728043944D40C69166C1, + 83A3E005DDFCC55F277EEDA5, + 1D78FCCF430CD91FD1DBD95B, + E08E877C3A6283CF5C803957, + BB26BA9CFAE8C836251E8EAF, + 2C89EC72FF6A7118EF459DC3 ); name = Source; sourceTree = "<group>"; }; + 9D44948383EAABF451302146 = { isa = PBXGroup; children = ( + B9646290EA6B6995F8AEEAFB, + 3564F28A16A2BDF3B1D5035E ); name = "open-ephys"; sourceTree = "<group>"; }; + C7E3612878FFD65D522A32A7 = { isa = PBXGroup; children = ( + 563F35B171FAF2540923CE45, + EA73332E3D5AEC04ADDFBB2A, + 80E8C07F5807C65BCDFCCF94, + 1CB0D7AC988EDEC838A1C546, + BE506F381B90833512348968, + 42BF0530EADF336E58D39CD3 ); name = buffers; sourceTree = "<group>"; }; + 18CF6DB446071363AB4F1EC4 = { isa = PBXGroup; children = ( + 96E99CD031BD069997E387FE, + 018F4E079EB12A78C4F8F773, + 1307DAE32BA702565A67D127, + E7366E169158F5A2D1D7B55A, + DBED17FBB262C4DACEEDA9B0, + 161E095C716133CB255B6CCD, + 8B0C9D288C428BA5D956AE13, + 927AE946A1371490D809876E, + 560A28C1966B1817873CF764, + 82EB2BDE7B9A4D5D945497B9 ); name = midi; sourceTree = "<group>"; }; + 553F5880E9CFE9C4A045C0C0 = { isa = PBXGroup; children = ( + C2F9D279FCC5C4AD56A0C1DF, + 3BEB59C6E8F833331C0783D5, + 63F4150ABBA43B2215230034, + F9F37AD1C3E7CA932FF44E69, + 65751E743D5EFD4066E50746, + E419C9DA3202B8B6EC2DB723 ); name = effects; sourceTree = "<group>"; }; + 860DF78DDC42F4C5093B46B0 = { isa = PBXGroup; children = ( + 605C7ACB09E7739EBE4F1539, + 3F8DFB0DB8B82F0C2CFBCA05, + E4A2E203101AF37C169F1569, + 5C1D2D28960C7957A15B3FE4, + 3FA24B406E4A9F9F54421C6A, + 4AD95B75DC581E32650FEDF6, + 6D619C7A3A14981DC4EFF223, + E3D9DABE0A9C1DCE6A6515CB, + 178AD28BF5BC92B58A3A3539, + FD770E73FD462E9C9F6DBFB2, + 1B27BF1CF3F235A55CD5107D, + 6535D85C084292220330EDD9, + 9C5F99C38CC703FBB871401A, + 1D1ABA743E533A4B7A50DBB0, + 458A112D564ED066211FD482, + 3B307527FC3241258EA68519 ); name = sources; sourceTree = "<group>"; }; + 14AA2721588E8A9253FFA98B = { isa = PBXGroup; children = ( + E97684DCE824DEDA6683C6CD, + 74DE857CEFA10BC49FF591DB ); name = synthesisers; sourceTree = "<group>"; }; + 9311E4762BC3218510204A0F = { isa = PBXGroup; children = ( + C7E3612878FFD65D522A32A7, + 18CF6DB446071363AB4F1EC4, + 553F5880E9CFE9C4A045C0C0, + 860DF78DDC42F4C5093B46B0, + 14AA2721588E8A9253FFA98B, + 786F6A40506C2094B812F4D5, + DB550BAB034060FF4578BB64 ); name = "juce_audio_basics"; sourceTree = "<group>"; }; + 6956236084207D7C136E5032 = { isa = PBXGroup; children = ( + 693E9C5C9A435F791921DAAE, + 642C4CFA27846188E3D53688, + F94BFC6B5057806EEF8B59DA, + 2D1BF69121265C83C7937EB6, + 9BE34B4DECBF4EBFD27C9792, + ED887A521EEB8F3EBA7DDB31 ); name = "audio_io"; sourceTree = "<group>"; }; + 42F1804D0EC2EB60625F783F = { isa = PBXGroup; children = ( + 26FF78F12CCB8725C0DAF9C2, + 988F01B2B51B2AC7293D07DA, + A9A0BC63EB466C75D1B9326A, + B64193A23B69D4A88CDEDD0C, + 0242AB5BCD8C002DC2E30BAC ); name = "midi_io"; sourceTree = "<group>"; }; + 2097A54F0DC05D433BEB7C81 = { isa = PBXGroup; children = ( + F1DBAE92084D9D90234AC436, + D0D7CE266BD7CC5455926700, + 7CD03E334269D693E1B84856, + 402BC572EE3E8EC418946CE0 ); name = sources; sourceTree = "<group>"; }; + 2512062DBF7A12B895E6F6D9 = { isa = PBXGroup; children = ( + 19043050D1DADAEAB48FB803, + 078625CF5C083AD538D23401, + 1463D2DAB3A1D8CEE825056A ); name = "audio_cd"; sourceTree = "<group>"; }; + FCD30A3CA425C3FDE6CEBAED = { isa = PBXGroup; children = ( + 0A42FFB89531588E51762D3E, + 7D363D7B36A55EEB3198A827, + 21D3C1095D2B5A834D998B74, + FF1B5858C942CA02EEC38E69, + 601654292170CD2D60E912A6, + B7D848E4F85AE11FDE4D164D, + FEF0A4E3C8D22A830BCE2B67, + E8964C0BE264A55753BC6B7B, + 9FC97A1CFD250F7215B4E397, + AEC2DABFC0517B4BE0CD704C, + AF3E3AE70160C3392B237316, + 39422C7D01635DD9C00B5136, + 17CACEC7EA0A4B55A06A0993, + B0A076D9536B6754F34E4606, + 6CBD8647DB17F1B58B14A3BC, + F2F11D7C596DAE5579610CCC, + 5B7EC53FD2232CA799D6C018, + 25DCA4D0E86DFB51AF637D21, + E5B10AA248D400FDB2645084 ); name = native; sourceTree = "<group>"; }; + 83416B76189CFC2030936CCA = { isa = PBXGroup; children = ( + 6956236084207D7C136E5032, + 42F1804D0EC2EB60625F783F, + 2097A54F0DC05D433BEB7C81, + 2512062DBF7A12B895E6F6D9, + FCD30A3CA425C3FDE6CEBAED, + 6EF4EFD6D74D2573AC6B6A6F, + 9069CE21141F5A4C5721BCF3 ); name = "juce_audio_devices"; sourceTree = "<group>"; }; + 8A5AC1CA1E8CB52621B64DA4 = { isa = PBXGroup; children = ( + 5C7EEDD80F88872A87FD561B, + F28414731D9EE1F75D7B7043, + B5B417E4196236A2CDE7F0CF, + EDA209B0E7D124EA581023AD, + 4CCA36B2A6C4821E493E74D2, + 789139D88F449BE488BF3CCB, + 5CE99545433261F3B4A46252, + 314955FB1E6DD74C71EB8907, + 6B90F5150FA8E114E8AE98BF, + 3BC3A723444252E177C1B1BD, + 8551342E7D16FCA4F9A80BC5, + 3A6E9EC3DA618EBA06B9DEEB, + 86515FD9AD34D6FF96C0D8B6, + 8D6A419A4678968762A59B28, + 6B32691AA8B3D304B68CFA64 ); name = format; sourceTree = "<group>"; }; + 6DDA36A41852F78F61C4BA23 = { isa = PBXGroup; children = ( + 4AE1520FF569371665090B39, + 822A504EE33F35F18A7F21AF, + F8E202A1374401022F87F26E, + 2BC005B37A0FB3179C2F3AC7, + 02DA588D3B873F1971ACD912, + 266FC6DA3123E576811DD828, + 2F2EDBE0623561191234AF21, + 4CA9556E9C18029A47F34C7C, + F1A3975235880CAC1D5757F4, + 72C33BA70B9EE82E39F1EC6C, + ACAE4A2D65AAC6A36DA9DBCF, + E040EA8B5BB61ABBBD14F12F, + BAE93A5EEC37D7B4C793BFA2, + BBC386B5A369262583AD4DDA, + 0052A4FD257928E5D83927E6, + F70B7D65EF56B8A0ED36478C, + 0C646E9950FB580B21E1F2BD, + 8F0549459970F529587D6CDD ); name = codecs; sourceTree = "<group>"; }; + 147EC1A2CF770171DFB61105 = { isa = PBXGroup; children = ( + BF647E1FAE73208AC29C14F7, + 3EE92345839A4E5F608D82AC ); name = sampler; sourceTree = "<group>"; }; + E2F864696FA2DDDAD60C7E83 = { isa = PBXGroup; children = ( + 8A5AC1CA1E8CB52621B64DA4, + 6DDA36A41852F78F61C4BA23, + 147EC1A2CF770171DFB61105, + D0E568AD5445AF061317E01D, + 07FD5E530E9E6BFB2ACA4B8C ); name = "juce_audio_formats"; sourceTree = "<group>"; }; + 21BB3DD364DC0C39CC9594B9 = { isa = PBXGroup; children = ( + 5B2CDF3CF10A92F6CA45F3DE, + 3DA70F9AAA904543B519874B, + 06072EC6BCD3B7D8C17C2402, + C54760E4888674CF3CF022E6, + 803D306CDAC2BD3BA04534EA, + 256E22D98B16B09BD521C4A4, + 7EA46209F07B2C8A83D0873A, + 2F9BB379BCFCFE0D88CC0408, + D960588B732D973B82500E2D, + 32A1325430309CF4114C9618, + C74399C81B1A0552CC52093E, + A17E8162EC7A0E513DDEB23C, + BA03776682290FF1AF4C0106 ); name = processors; sourceTree = "<group>"; }; + 14805A0D1A6C3ED796515AD6 = { isa = PBXGroup; children = ( + 18C2F9CA38393D106FB834E2, + B174EBEF82212C8624300F59, + 0316B49B86725305C70783CA, + 8E61792F6D6FC75CF18095CC ); name = format; sourceTree = "<group>"; }; + 208431C2D4A7C383FD247CE3 = { isa = PBXGroup; children = ( + 03D7B457E0915E43A6AFF4B4, + 8515E367462BEF36233E2447, + E90E364612E6D6EACBE0C063, + 93F842958BCE6A9E09862CF7, + EAB637B566FEBBDADA654262, + B93B8666F8AF2E5D2E851B1C, + 6589EAEF497ABA76A295B121 ); name = "format_types"; sourceTree = "<group>"; }; + AF98861ADFF70900F6FD1833 = { isa = PBXGroup; children = ( + E53FEAA3754E6B5D99516D56, + 4D84A3A970FB67566A1E5B0B, + 390EA3109658E8C51EFC8F61, + 894C0CAC31D382477E7A122E, + F17DF27524262A21A3EC932D, + 75E0C433EC27CFB712CD9F75 ); name = scanning; sourceTree = "<group>"; }; + 95530BD93D8ECFCC072C0850 = { isa = PBXGroup; children = ( + 21BB3DD364DC0C39CC9594B9, + 14805A0D1A6C3ED796515AD6, + 208431C2D4A7C383FD247CE3, + AF98861ADFF70900F6FD1833, + 475824F60D47C28C392954A7, + F463A19E6EFEB2837582B117 ); name = "juce_audio_processors"; sourceTree = "<group>"; }; + 62693BDBB3A4F98A8A8B45F6 = { isa = PBXGroup; children = ( + 67BB47E709B643D4C01AB34C, + 45A66E543B62A2C32AB3BA23, + EF3F9AA8D70E1D4D55F13182, + C1E1CCE5796B40E0A45FB021, + 482A60A44EE6CB84FCB9DC88, + BD59A961F87AB628777894DC, + DFFB7396DCE9DF1253217584, + 7C71195623459A6C2524D418, + 784233150B26826701C09103 ); name = gui; sourceTree = "<group>"; }; + 09F214A405A08FDFC47244A5 = { isa = PBXGroup; children = ( + 57F66B4A911601169AF195E9, + DDE89F0D5E01F079323CC89C ); name = players; sourceTree = "<group>"; }; + 702A741EEADCBB982DDE18B0 = { isa = PBXGroup; children = ( + 62693BDBB3A4F98A8A8B45F6, + 09F214A405A08FDFC47244A5, + 80D57E78015C789503FE24B4, + 8515A61F1E3BD62B9B95B495 ); name = "juce_audio_utils"; sourceTree = "<group>"; }; + CDD260628D8AFE969895A610 = { isa = PBXGroup; children = ( + AFE835E175F7159E1E7C6CC7, + 2DA0032B6DF10345C4842BF5, + B64893F699A10B03AA4AFF6B, + 9200FC900D22733AE716C364, + 6596D69CCD1502DC6BBD15F1, + 55F7467B96E236DD558228C9, + 05BD169B8574607A6F6AD3B6, + 6C8489C41782E3D391AF0C26, + 1246C8A62803B7E115713705, + E91923510CB2280C3A3B9E9C, + 1F12D1392E5DF34C3A3C445D, + 0A413228C75C046CE683E0E6, + 09A159213372995F3CCEB85B, + 38B5A37F33AE3FB2014BF095, + 2847E92BB432EEB9D5A59260, + B9E2607F1605D308CB331FCC, + EAEA49B9394D802B79CA8164, + C67AA7952D9EF7E248118B85, + EAC262A83CD2BEA14542AE89, + B7BEB7779860FE877E4D1BC8, + C98D4FF283E598244E89CD83 ); name = text; sourceTree = "<group>"; }; + 1E253D48AC292849CD3054CB = { isa = PBXGroup; children = ( + 0A8BC957DBEE226346C1EA25, + E7EE416EF527C7506B499070, + 2B19F2DE42A91F56C2380F9A, + 811C4D165AD7AABF4055059C, + 90AD1B6A2293F625D786507A, + 2B134713E91426120A994CB7, + 90607327D7A1BB3C2C4E9264, + 6A559D9595A54EF52BF0773A ); name = maths; sourceTree = "<group>"; }; + 85E7ADCD4C773A42B7F493E8 = { isa = PBXGroup; children = ( + F7F374C05CDE0DB7712D18D1, + 816EB8024DD50DE4B7E84CB8, + FB1EA9CB3C695925627B0AC6, + 420843E39C285B620B220C1D, + C0C6335FEE0844872FDF4EE2, + D11BC618E53E6605B3A579E1, + 8A026DB58E3555F7B070DA61, + 3663C981D28BF165C1B601A7, + D5D6DAA3CFDD395096D2B072, + E0C264CF6345ABB4CAB98B92, + 0D884C2CF25F23CE6B99B2A1, + 8B49B07BC7534B247ADC756A ); name = memory; sourceTree = "<group>"; }; + B49948DDB0E13018A81FFF94 = { isa = PBXGroup; children = ( + F0F3834D46EA8FC8ADB206DB, + 47BDFDD28759B342B1C50BC0, + 7E40891072657FB5ADC2FAB7, + 7D8100DC3A532980AEAAD909, + 7291F19253205B1A5138908E, + 0E98E81084F183B8426EDA7F, + 193FED8339417E8E6264957A, + 893E1A681FF162F6C9069F62, + 66D3F831CE4F6AE89E4C869A, + 35C0963BAB9A82F12CDC9F76, + F3F48717927A4E24F7373C09, + 6C24163DC4ECD731489CC4F6, + E3C4B6B362320594789E1297, + 66C663401829E0F7E787F708, + B5FBD4DBD2CFE0FFF457D7F6, + 19AB6653E818B409554C5606, + 76E89CBE70BF8F2476B7AA34, + 49D837FD08100AF0DB797DB4, + F8EFE3709FDDC2D5F0843058, + 172FA5C9EC4B16BC0C45F269 ); name = containers; sourceTree = "<group>"; }; + E5D588C725B362D52B7F0801 = { isa = PBXGroup; children = ( + 47041E3794FA20F67F39AE63, + 901DB6D5FE9134F2ADB9AE46, + 4608E765A643BC0CB2C1BB02, + 515213CC3271E8DEA8125D33, + DE4861552DB1976665B25DFD, + EAB6A66678B122C578B16445, + DB7866AFC8A4894810DBD05E, + EA9518CDEA7049C21D5CE2D5, + E34E535DA9CBF248E32F7B45, + 113404D3FDE3745DF1E8D014, + ABA3FCD5D762336535D56D94, + 7C6921FE817699C1B95AEBF6, + 2D20F49E12A7D313049E0258, + 36A9736F04AAA2F8E9D711BB, + 222AC2E9BEFE12BE7FF88879, + 8EB76CA261F62A89B3D25F81, + A6736FBDFBB0B82E22D2B1C0, + 748E62D05C8FFF74DCA234C7, + 0B382285EEDD8A3FDB45C074, + 4133FE7830C52BBA035D82B8, + DEE2959DBBC84EA8448A0F77, + DAC81FECCE54087394BE69F7 ); name = threads; sourceTree = "<group>"; }; + 8C76D67898D8A6B0FB7F62D5 = { isa = PBXGroup; children = ( + 73ACB7A051EDE5F676E35FFD, + 65DA1366481AB10AFB3AF344, + 5DC1AF69A773401DB1E8FB32, + 562E4A50364EEDC3AA2AACB8, + A769611E9CBFC127AF5AFB0D, + D8A40F2BFBEC65019C867786 ); name = time; sourceTree = "<group>"; }; + FD67C32AD7A3D9BDC3CB7896 = { isa = PBXGroup; children = ( + 0DE9D2FE41553B4D4316DD55, + B2241E3C5C9F93389586F357, + B4C52FC94D6C680C33ED85C9, + 108DF32ADFBA5CA48F928A92, + B2EF409A1F459E964756BA7C, + 5E663D5A55F191AB92A1383F, + DD5695DE97CEF7BE76869232, + F8322ED101601866FFB1698C, + 21A0260D2DB039B81DF4970C, + AE9359DBA841F88EF3DA9700, + AD960F561259904BA68DDA73, + 6EA1CC7DACDDBA863179521A, + ECCE033FF2ACE42188FA4A7F ); name = files; sourceTree = "<group>"; }; + 1DF9A40DB990AEC6AD278C31 = { isa = PBXGroup; children = ( + 4F31D61C0C2AB3472C6C1429, + BC953E395B22FB1D305E483E, + 087FA26464FB283EC6FD4795, + C67C5EC0EE8DBC501C8AA395, + D9C9FCA6D705B72B80DB1142, + 01D791730840EB0BA7FD61BA, + 8F29CAC0059E3697A5A3652F, + FF3E5A9F8B9250790C6DA089 ); name = network; sourceTree = "<group>"; }; + 6415B8D280F206E770758A6A = { isa = PBXGroup; children = ( + 9B178E9015CF469CFD41BC79, + F5642B98949DC0FA45EF904E, + 32976762B1DB850DB65B9504, + 27548017AB2ABAF17E1D5DF5, + 09160DF53438B400BFE85E07, + 7555A13E69B99B1B6C7295FD, + D056D7F6C8EA8A6BBCC5C092, + 66FE597910F6A68CBB6FA055, + 8C077447B0DFC739C7D2E437, + E666E60CC07666669FC77C7D, + BF8B07C8BC86002C3DC94DEE, + D679982E05B9510FE239D690, + 0B5B63E563EFA7E816DE3DCA, + 0CCB1C4D687001E04DE1DD9C, + 4978EF4C5F506F3289BC0D99 ); name = streams; sourceTree = "<group>"; }; + 3CAB707CFF748C665802E65E = { isa = PBXGroup; children = ( + 658D08592154525DA1C40826, + AB4C7059669AC385B02179C1, + 7ECD5DB4BEBC44559D064E08, + 0A351ED88CF00C0697701E73 ); name = logging; sourceTree = "<group>"; }; + 9D740F320C13F9B82EB64461 = { isa = PBXGroup; children = ( + 7F17077973FFDD70C4B78E7E, + A5E8E0CF6DA1AEAEE9D872DE, + 9978BC2A359BC506F69E545F, + DB4F34DA0F04B40EB6A50FB1, + C446923C1950EB5BE5E67F15 ); name = system; sourceTree = "<group>"; }; + 17BAAA5A77781988BAA8CDEF = { isa = PBXGroup; children = ( + B8D19858CC01BB5F7C35ED58, + 8F7B13BF318C11900A2277DD, + C2746A86EC16D3EA9FAC2C1D, + 83803D96768258DA20710764 ); name = xml; sourceTree = "<group>"; }; + E4BC8B84B396D69A78DD829B = { isa = PBXGroup; children = ( + 8AA1009705E8A9531C707ED1, + 4179FCF100DC52282D0F9753 ); name = json; sourceTree = "<group>"; }; + 7C859D548450DEE24AE009E4 = { isa = PBXGroup; children = ( + D162391A46FF93093C328F9D, + 23C7EA9C89CC98A5EFEC12FA, + A65F5AD9D0C532EBB3A2067D, + 5343D594AA7D444A7C6AD924, + AD7311B9A37893CA0C4BC119, + D60F42AEB8551E83215691C3 ); name = zip; sourceTree = "<group>"; }; + D72CD5E87BC67DDD61A82105 = { isa = PBXGroup; children = ( + 4D8F94CA49DB11E07918B4C9, + 53130F5F47EB211416C028F6 ); name = "unit_tests"; sourceTree = "<group>"; }; + DE30EC58A5AE1CD381356739 = { isa = PBXGroup; children = ( + 3FFD5E5D5C1D8B48DBBB9D18, + 0BCAC20DAB10B957168B85D6, + F796260525BD82FFC1D1732C, + 215B159836CE40810964B773, + 349C9FCEDC32E73DCB7AE806 ); name = misc; sourceTree = "<group>"; }; + 572BB2781CE421A968F9D023 = { isa = PBXGroup; children = ( + 8882F8EBE55F52FA8E519249, + EF610B2A17D9B1C0D24DCE67, + 9B5D838CB6224E82C9B36AA3, + 982E1A954C316920557F029C, + 23F048594D4C9AD8C3399877, + C7CA628FE3E1E3D16B24E059, + 60B1BDA3E9E14F9515963082, + 3FB80C5CFD953986778DCBA2, + 5F6DCA68A982E930389644FD, + D22D3958949713747DAF59A3, + 4D67518E9223C1C19BD4EF2E, + A950BD747F318BF6D555CB06, + 63AF6BE7FE2A9E7882743B4F, + 28847C807E6B05303FB8FB34, + BC06C1E8052799F4696101C3, + B87864B2D6A2E741D4B426A3, + 8F08D5488CE147D693BA21E2, + 28D5AEEEFC4FA8877419C829, + ECBEF88BBC974D96ED781C75, + 86F4AAFCE3FEB34E325F3020, + BCB6A6D5A0C1417D74C29632, + 698B0EC670DA47934444381B, + EE2C669B127D00C86B1B8CA8, + C0A718EA721772EA6B837F39, + 77B3E84324445076F1F907E9 ); name = native; sourceTree = "<group>"; }; + 7333A0F468D3745057EB2368 = { isa = PBXGroup; children = ( + CDD260628D8AFE969895A610, + 1E253D48AC292849CD3054CB, + 85E7ADCD4C773A42B7F493E8, + B49948DDB0E13018A81FFF94, + E5D588C725B362D52B7F0801, + 8C76D67898D8A6B0FB7F62D5, + FD67C32AD7A3D9BDC3CB7896, + 1DF9A40DB990AEC6AD278C31, + 6415B8D280F206E770758A6A, + 3CAB707CFF748C665802E65E, + 9D740F320C13F9B82EB64461, + 17BAAA5A77781988BAA8CDEF, + E4BC8B84B396D69A78DD829B, + 7C859D548450DEE24AE009E4, + D72CD5E87BC67DDD61A82105, + DE30EC58A5AE1CD381356739, + 572BB2781CE421A968F9D023, + CD492AC7B458FA6C321B9D0B, + 97431963DB8D535DEDA9AD47 ); name = "juce_core"; sourceTree = "<group>"; }; + 7377EF4F37D5F898D74C4C2D = { isa = PBXGroup; children = ( + 0BB4380EDFEAAE0DAB255B90, + 7719FB81DDF23CF0164B131D, + 511C443A0A806706A772E981, + F2EDB88302B8A9356F43B834, + 8D9DD6147EC0553B092FD367, + 57C6DD2537116B30FB948A08 ); name = encryption; sourceTree = "<group>"; }; + 2A96C9BD7209F57EE8E19BBA = { isa = PBXGroup; children = ( + B2017626F9A05C8C0EBE9B7E, + 0FA84E49DB493BCC886A355F, + B17AA637E5C357FACC38EBB7, + 8C38407151E149A7E2A15801 ); name = hashing; sourceTree = "<group>"; }; + F196226BFBA15D76688C61C6 = { isa = PBXGroup; children = ( + 7377EF4F37D5F898D74C4C2D, + 2A96C9BD7209F57EE8E19BBA, + 01859D6E7D95E44BD8E17D91, + C16065CD5A8054262B81C1A3 ); name = "juce_cryptography"; sourceTree = "<group>"; }; + 94D3CC2AE4B67AAA936F9DEA = { isa = PBXGroup; children = ( + 967138FE8A086734ADC8CABB, + 7CE1E34F6A0091E720854E75, + 74A81014471CC0EB0D5E6571, + C5D0E0996D20BEEEDBFD64FA ); name = values; sourceTree = "<group>"; }; + 42DE5996B56B332A5B6C636D = { isa = PBXGroup; children = ( + D71AD519382D547C958B0175, + 11D619EEF63C1827EA91F593, + DEB9A630503639D42056236B ); name = undomanager; sourceTree = "<group>"; }; + 6783EE5E12C56ECE3D7FD1E2 = { isa = PBXGroup; children = ( + 31A3925602D128195100B74D, + 5B6B25AA065FB6CDE7D6C507, + 1CCC1D4213B17ABF6222EC82, + 2AE12F85965B8BE4A0E12F67 ); name = "app_properties"; sourceTree = "<group>"; }; + A7F7E551BA5A75737261BB4C = { isa = PBXGroup; children = ( + 94D3CC2AE4B67AAA936F9DEA, + 42DE5996B56B332A5B6C636D, + 6783EE5E12C56ECE3D7FD1E2, + E21CA41B44E191F1804F9662, + 5962848AA3DD93A29EFF5B94 ); name = "juce_data_structures"; sourceTree = "<group>"; }; + 689A94018921FED3F037B194 = { isa = PBXGroup; children = ( + D7807913367AD1B1FCBDEFAC, + 9EC1C0A21FDCB81BE0EA60EA, + 6CA98F8581CEAE2DC9AEBCE9, + 7F49EA0CD3379397520AA6F1, + 996E4EA6B532E4E436F50243, + 7EBB3F8185EB597DEF77534D, + 5A7D81B70480B40EEBC2FF54, + 2924B990E35D3B51AA245978, + 18A730DF335EEB3A4D13FDCA, + C844D1792A91BE2D8808CB14, + 670987D88775D6B240C34820 ); name = messages; sourceTree = "<group>"; }; + 530413F49A2E29570D8A9761 = { isa = PBXGroup; children = ( + B1A8C18C6E4B3572B8B750AD, + DC200873B263C55E82B5384D, + 0A46EF94E558D5E19F96E646, + 7EBEBC6DBA8DCA5A5D8C72E1 ); name = timers; sourceTree = "<group>"; }; + 259BB14332EF6F524455BF3C = { isa = PBXGroup; children = ( + 8CAEF601359DB6CB50E89D1A, + E20D5F2F75478DA4943CEDBD, + 38711221C089A16CC29E93D2, + 3A2C762575D9728B1F822ED3, + 5379FC603780F30A2F05FE78, + FAC7E62CC15CA977A6FC72D1, + B8A9063181FEE1920095F824, + 86E8E44A13F17083ED300BD5, + 0DD0CBF9BBD4A503F2B7868D ); name = broadcasters; sourceTree = "<group>"; }; + D70BE7E6ECFBD4AD6F29AA64 = { isa = PBXGroup; children = ( + 9360657FDE33FA37D80075D1, + E7460F066237871A704733E7, + EAC7A64301F0BF2C5E33A1F9, + 946FDFCA107B3F4C74C471B4 ); name = interprocess; sourceTree = "<group>"; }; + 0A3CD1724922FB098543C013 = { isa = PBXGroup; children = ( + 1194EE0956A9645270582979, + BD1D02C70CCE095217581A5F, + 19A8A8E1BF043B390E02C429, + B0DCDCB162FDBF972FA5B548, + 4B5998D72503BD73D28E828A, + 627956A7A1CB15251D02C8C5, + 6DA8EC2F779DEBB701FE33CA, + DB4FB8EAFA1714529E527C3D ); name = native; sourceTree = "<group>"; }; + F61CCB10A356CE4278F74478 = { isa = PBXGroup; children = ( + 689A94018921FED3F037B194, + 530413F49A2E29570D8A9761, + 259BB14332EF6F524455BF3C, + D70BE7E6ECFBD4AD6F29AA64, + 0A3CD1724922FB098543C013, + 31FDA03EF1B527B336FA6263, + CF758CB1E06DDA1AB7F5C9CC ); name = "juce_events"; sourceTree = "<group>"; }; + D3C338AADE455AEA6C248E21 = { isa = PBXGroup; children = ( + FC080F7DF94ABCB7EA09224A, + 4C81E05B39376F54775A1027, + 90F2939F533A26AC021E42B1, + A708E79EB9EB7CC44030F5D5, + 6BBBC0907D7A62E2F3AB9BDF, + FB7E91937D3BBE00F64F0B72, + AFB684CE06F9256324EE0B4C, + B87C1BD13762817BE27DC2F7, + 7A93BFD2180B5E00B124CB1A ); name = colour; sourceTree = "<group>"; }; + 1BF4F68D4169491DD79D0B01 = { isa = PBXGroup; children = ( + 793A4A777FEFA450F86C78EE, + 891B132A0355007B4F37454C, + AF1F3010721A6B29062E4838, + B678CFC6B378A58834D2E41F, + B5E8A19FF91BEAD02C63E05B, + 2F8252D3FF527D6559B12615, + 301783FC4E3B19CA3C0AC85B ); name = contexts; sourceTree = "<group>"; }; + 328279397CFDFC5C31C08F49 = { isa = PBXGroup; children = ( + 9731D54410B06C1000370316, + 217032322A2570ABAC47194C, + 85928E2EF1C438EBC9EB07EA, + 879B0383EF2A8B116903A500, + 7F92025F0B8FD4FA725CC70B, + A540869F28EE158A0A348C28, + 5AB3809F029824EE2DE0A798, + CC35C78D5B446ABF57DDDAE0 ); name = images; sourceTree = "<group>"; }; + 7E444D9FB4474A6546E9B779 = { isa = PBXGroup; children = ( + D55137DE3404D7DF2A1F50D0, + EA354D7D8E48D461415D52D8, + 98D2D452F48C86F47FB90BAD ); name = "image_formats"; sourceTree = "<group>"; }; + 91DA3CD69EAB03C727AA39C8 = { isa = PBXGroup; children = ( + 9F61AF101B43110732BB8814, + A5C9A0FBD818AEF57858FB31, + EAB2319C7AA57E06A2247CDF, + 7B674BB1DA11A4E58EA71624, + B5ADA0C1BDBFAE2A2F8ECB48, + CD2E26CFD0DC7F6090E15A20, + 2A3230DEAAC86A9090950703, + C660716FDD337EFB1A7C6C72, + 04C474E0F2F7FDEC714A673C, + 13D9DC48F19699485F9888A4, + 4C3EA47E012B2D63ADE599DD, + 6D77949E9C7C9B5A7795C0E0, + 463A302B39C7815EB981CEBD, + 9380932BED279F91B8C1C04B, + BDFF189EC742274DD2629196, + D88B0ADDC9BF206E3D2EE9F6 ); name = geometry; sourceTree = "<group>"; }; + 89F126369D1761C7A09E35C3 = { isa = PBXGroup; children = ( + 7F1E84C068D3E6AA13CDD699, + 5DB6A07B827D62571BB51943, + 18CFDBCD4A5B80E78DADCFEB, + 5265AD5F97C9E813E14937A7 ); name = placement; sourceTree = "<group>"; }; + 6837ABCAE2AD67F0AD5F9AE3 = { isa = PBXGroup; children = ( + C916444FD4BFB79D4DE9FCAF, + 1AEEC114AFAB6E81205FBCD1, + C1435AB0105CDC29A3124E4F, + E0ADC34D69113B79C2F4FF24, + 8822ADC9DB83FAF39B841E31, + 1777330D3BDAE99A93F98943, + C209C7633D01E525231EE894, + 14DD0220B41F74C01A9DC676, + 4650B5724FE3C0608FB07A04, + 8077C8D1C544F458947D693E, + AF8ADA74003E96998A5E4404, + 9F845E950F19FEC4E6C88F91 ); name = fonts; sourceTree = "<group>"; }; + D6EA061B97C039BF4BAAB444 = { isa = PBXGroup; children = ( + 1191BF3048664183033BFF89, + 8B7EB54E1F773517A65D935C, + 0AAFE3F4D106138401C190C5, + AADBA8C0AD524CE677428AFF, + B2FA9CC4754E136F22281176 ); name = effects; sourceTree = "<group>"; }; + E30221BFC59C887A6337E8C8 = { isa = PBXGroup; children = ( + 89B0B267EF0A2A19A082EB86, + 6DCDFF2618CFEECEACE87630, + D48EB74E1B5AAC7846196B01, + 3D100F6FDB04756402F3BCC9, + 6832130272774CD542793762, + E33F167E4AA1C44596A1EBED, + CA09B0483969444C7CD106DC, + B021D393D0E2625741512320, + 603764889DE750F8E87F6428, + 7D36B006AE0B139D8A3D8641, + 55EBFCA56B915C8CD043365C, + A0D768F1B92568344DAC9F0B ); name = native; sourceTree = "<group>"; }; + 448EFC87A2DEF32F9547F801 = { isa = PBXGroup; children = ( + D3C338AADE455AEA6C248E21, + 1BF4F68D4169491DD79D0B01, + 328279397CFDFC5C31C08F49, + 7E444D9FB4474A6546E9B779, + 91DA3CD69EAB03C727AA39C8, + 89F126369D1761C7A09E35C3, + 6837ABCAE2AD67F0AD5F9AE3, + D6EA061B97C039BF4BAAB444, + E30221BFC59C887A6337E8C8, + 25433DB6D2EAEBB307EFB960, + E67C5ACDC8208CDE200EC8C6 ); name = "juce_graphics"; sourceTree = "<group>"; }; + DA98B2B8AD88362017D0133B = { isa = PBXGroup; children = ( + 085F51FEE5C5FDAA321090A0, + 01C313C323E5CB995C939E0B, + EEFC66D2DF5FD66B4D83B22F, + 4F4234DC14D3689C22655D0C, + 50DD8D693741DD18106C0BA7, + A15596CDCC27B86FC070D7FA, + CD41C1D09F6D73FA33993F45, + 1DF5FD417930A62110DF0419, + 45883809F1335E6C745F8155 ); name = components; sourceTree = "<group>"; }; + 8EB93734459D15BBDF8EF722 = { isa = PBXGroup; children = ( + E91A272EF06892937CB4B9CE, + 9A29EBC10219D89919E12FCB, + 8E78AAA58721DE609F6FFC61, + A54886FC74BE0DDC74094EF5, + F9E2371F1A99B292F2947FF5, + 9C96B0CBFF3D34885BB8B020, + 4EC254B133A7AAE377B9B3AE, + 686FA8DDF2848517CBFB9E4A, + 4E520E7960CC5098C2352E70, + 565EEC8F429ABF5F9A867137, + 11A5824E0239C86801BE2EB8, + 3E22E947444B5849011B6C4E, + EF059B26886B32000BCF8CFF, + B00A9C0BAD3AF9F48E36A38F, + FEB3730E084D7DD433D14A6C, + 8F3C158B4FB92CFC48324896, + 05997833A4AA137FD64348AD, + AA3209223925B66A97AB4509 ); name = mouse; sourceTree = "<group>"; }; + 9A37C74D88FB91820F829E3C = { isa = PBXGroup; children = ( + 7BCE1C09508E1B9CFC79C185, + 2FE6DAFB634FF3C20F1D6FD7, + D840E516B1DE9F3F730283D5, + FB33617B5082CC0CDC189F2C, + 880CC7C325EFF665AC3006D2, + 40C22F3CD61DDB9C7B3DCCA6, + 33A69BDDCFCD4A4DC14A9961, + 78CC9639B933CE2497264EF2, + 8C268C3D0B8EC2BB8953E7F7, + C6E19D3864B40A52BCC49315, + 6C36C3C304EB066B1DFCCD9C, + 9C701D5A7298B83CE05ECEBB, + 8689288B66B16EFB106CB2F4 ); name = keyboard; sourceTree = "<group>"; }; + 9627D3CCE9D6810CB06B5D77 = { isa = PBXGroup; children = ( + 9D2510B5E6180456C53A455E, + A7875D5F8D2A632C99791002, + FFBB9CE85A7C91FB11E4AEC8, + 45D440B69BDB210B17CD424B, + 8C3B6865F2053C80A6E692F1, + C7A76C0D1B3DC4A1F059E59B, + B3BAC48D01C49D8727D08097, + 95EC6B1536DC65070D0ADCEE, + B123E2F4439DAD65196A2A9D, + 6BA113C799640798D3F29A06, + 53C8A2696FE4389E4AB4441C, + 21C11A58CAA0F9E86AA204EC, + CD83E301AE42E6E3317D575D, + B60D02B5BF564ABC88841B1F, + D171071934C8F7F925B0D113, + 3C1E0B87DA3E9AC60D2894F7, + 921F5D04122F324502DA4E75, + 9FDCF1E2B4651E58240400B9, + 649F22404167E0D0EA244196, + AE6786E4659DAC92F52E9FA3, + 6917A53BAA3CA2819E4C10BF, + 17FB020EFEAED8493D3CB121, + E37140E9E8F7CFDDEEEF6148, + 4BB38A2CD55BF23C7C3E3387, + 7F93E4F0CC8B842AC1D3E560, + 564380494D23DB70680FB0B5, + 38E493BFC36AC80B1CDAAF35 ); name = widgets; sourceTree = "<group>"; }; + 3DA4EA9C737426FDAF1484AD = { isa = PBXGroup; children = ( + 7E581214A64A535E03EA759B, + 71CF8F6995DF1BA2038C21D6, + CDC18ABAFEF000C720CE8622, + 927FCF11005E78D499DAF197, + 78BA978C614603B5E9ECFFF1, + 483ABD5C1CF789943AB4AFB6, + 2D577016FEEE23DD5703C924, + 9B4EA34E8F90B7CC77694B7E, + EEA51B7EF1CF19028C6672E0, + 581287A24510A9EACEE09CE4, + BA09F5CDB1C01E0FC153DB8E, + FDAAB4F0D2A15A6F0F71945A, + 13D9868B08E941F6827E157C, + B6567CAE2B538E79E7DA814C, + 027C1143CC66EA8F73C39A74, + F7979AFD5780D9B2208736EE, + EA2FC92CECD1EDA1F07DC59C, + 55811E331B55E0547326CF22, + D51575B9AA7216CCE4B558E4 ); name = windows; sourceTree = "<group>"; }; + 23BCC80BAA5B674946A538A4 = { isa = PBXGroup; children = ( + A19C4BB4BD69D4351B344A17, + EFC21F3CD0EB87D67E044E06, + D7E51310BD1B8EF6A2A77177, + 4B3DBFE485F45E62C53A90B8, + 0790CCE2FCFDFA6944DFC402, + 361E3A46C9BFAD1530593487 ); name = menus; sourceTree = "<group>"; }; + DAA118DDF10823819CE57BF1 = { isa = PBXGroup; children = ( + B674DCA2C2A6AF6B58AA7820, + BABBEE3876B90C8A57C3074D, + 17B29FF3D3EA14EF2BE149BB, + 674FDCCEF6A1379A0F689004, + 6DD526F86CBF2C3B3487FFE1, + 2FF422D0633A28558D0227EC, + 313970BBDAAA4EDC8B322F3A, + EE4DD055D31F7D9DC718DBD8, + 570299171BCE863C54FBBA54, + 4E71B355F2BABAF69CC4114D, + 7D88F7083884A5ED2DBE7534, + 5E0F8A60411A03461FD687CE, + C195559D311BAB51CFB545BA, + 6E2F243D8F70CC92391204A4, + 75FCE8908DD9055F90E93716, + 5E1EFF4EEA5684FA00CAA353, + 94BD861806F8EA598EC09370, + E23FA5E940A1434B0305875D, + EE0336B43A39FD585DF638EE, + CC42C4D4230BE4F1071CB2D3, + F1099BFF0BC1656A23D62E84, + 5B411F4FCF0F69798C9E4A88, + 43420911407CC35CE2A02B38, + DDE157BB06373ECDBB23469C, + 918837CC0447C50774036664, + D06A8FDAD8B22537EA594383, + 3E0942A2D72F50FDE27C14AE, + 416B99B14B44CB16B725C4B2, + 0D3C20D1F00B7B1381E6B987, + F10FB240E10A5742CE366A91, + 4AE36D25675E32A897F97BFA, + 510ACDAD798813D7FC110197, + AEF53FD0FBBFF5242EDD7032, + 9F6664EB2C39D224C6BCC75E ); name = layout; sourceTree = "<group>"; }; + 444DE4CB4BD092CB31057DFC = { isa = PBXGroup; children = ( + 5FEBF3F722DB6191BF659816, + 08DAD5894A480950C66F5873, + 7CF939BD59D45EB41B5FE628, + 390856DF83DAC70909D5B397, + FB1B880F24F376D1AC52F2A6, + D8AFDCC674A7514B7019EEA6, + 7387114E34496F4606550863, + 80A612858FA1177A262744C6, + B11E5B5E4483AF89E6DCBAB3, + 393801D2B91773D376D874B0, + B1ECBE9C48227CBDB16E3702, + 44E04E5F584A8BFAD062A09D, + E6D3A973D5CEF18CA2BAFF59, + 83950E9D0D7C100B7DCA0E55, + 31BE5E435604D33173940048, + 92EC6BB8A8C4C5A61F43C233, + 9C4342320D2DD65E2BD6351C, + 98C81B13A0C34D8A4E93ADD1 ); name = buttons; sourceTree = "<group>"; }; + DE87FCC919AE658D7931F3BA = { isa = PBXGroup; children = ( + C454DFC77F19AB044372610E, + A93F302B8D91A997F54D231B, + BB0BB31575E1377F0C560D53, + B43C27BEC3AB681389FC5FC5, + 75A4EEE127FAB86D65FF5F6E, + EDAC82BD742A54182E8DF2FE, + FD3A6BD3A8898E137DF257B9, + EF4A6E0E1232071252ACCD7B, + 51926BEEA63BF141D93A5B36, + C41504F388D0B181B003B627, + 08907A4BA0D5628476D19C48, + 4A28A492852AEFBF508C1FC1, + DA30BA6BF482A353393D5926, + DAA4306D30617137463ED247 ); name = positioning; sourceTree = "<group>"; }; + 6101DBF4D993FE2CB50D4F90 = { isa = PBXGroup; children = ( + 13212C01A5E138553FAFBE9C, + 9D13E0F774807670270F4790, + C5287F057A6A88BC33D5498A, + 766923F74E30FF5D6B12E7CE, + 9EAAE3C0BFF3D753C375A5FC, + F2A500BA3500C4A9D5792A54, + 25F7BEADC001FA3D1EA9B32C, + E946426F95E0240683CB3337, + 911CCC0A579792DC56807DEC, + 617F5DFAAE97F48FA996A781, + 4434939E139A45962C8CFB4C, + 496180D5D96088CBB59035B1, + 08A7A7FD7D77C0657270E9BF, + 700597338DEC9AB65C4C8A5E, + ED86166920362E9D2BE2CB26 ); name = drawables; sourceTree = "<group>"; }; + 6DD8D8DBBBD09193A15803D0 = { isa = PBXGroup; children = ( + D2CCDDF54D6D6F2BF4281F2D, + 18B410DA5435C02C82BA13F8, + 174842EA681FA29BE38A6272, + 434E153E6C8337C1E4A2709A, + A9F5A8F835A1A734DF7F6775, + C10DC7C6E887B4EAAB8EDF38, + 651E9B78A5139F7A5BCA4D90, + C7A68BAFB04A7D5FD81FA82B, + 9070DC685E666BBFC2E19DA9, + 0D8ECE32F7D0FE74185F6EF4, + 6D4DFC260B2966E3EBFC0C79, + 58958CC3F750D383261E2FBC, + 414D8E6E4EE98E66C2583A50, + 208DCD7025D0DF2740C01E4A ); name = properties; sourceTree = "<group>"; }; + 09C2000EFECCE35F3F793E55 = { isa = PBXGroup; children = ( + 5FEFF62D585CF777C950E569, + A4FC82A8339698B6C1AC5F18 ); name = lookandfeel; sourceTree = "<group>"; }; + 4CA0453E4C12495F1018A4E1 = { isa = PBXGroup; children = ( + B83EBFAE6306941F79044523, + ACA28D2B1FECD2C57F0250A6, + 6A63308EBE68478531604BA4, + 7BE7EBBCC4DCF760A1AA697E, + 353937A4E68C8C6916C6D1F9, + AD7D35FCD8CF66B6C393A7F7, + 9C864C7DBAF37CD0719996A9, + 3EAF57CE45DBACE2F88DA4C5, + 945DC754F2EACDFFB7926DE8, + 033AE5DE19F0EEDC47D41C80, + B4F0C0B262654C4782B5AC49, + 284F3E94F0C96EA1DD89E606, + 65A447DCF8A68BAABC20FC7D, + 85C3F7CDF87409A56082DF67, + DACD0879E139527D971D3AC4, + 52A8F84DCDDF0186B511B9CD, + 499A12199A8A8C5AEDAA47E4, + 1C474C73937D98E9D3FFEEC0, + 6BA7D7A7E3E2E646E50D334A, + 786A97B2B4E2BB6406546647, + 696F2DC49934E6F01A2DF9FE, + 405298E6CE1C80EC7CC43A87, + C2D1409D20E154E43569C725, + E58A18793D25A1D75811A052, + 881237D5E366342B117C0ED7, + 316FB94579DA666A388F429A ); name = filebrowser; sourceTree = "<group>"; }; + 45BA9E76F27503E30F331299 = { isa = PBXGroup; children = ( + 167524110873F9888CF1B9E8, + 0DBB88B6BEC06FCECE4CBD28, + 0B2502A656E77E00AF15A343, + 70BF68C222D1E0A0368EB845, + E79B7DC03F81DA1F8CDE21CA, + 4B74A7F0FDCE3E1706E5B320, + C6BDC4DAD5B40321DA67462A, + F3D0224E4247BCB06A9E4DDF, + 1CFA355CD6811C253C72BDDA ); name = commands; sourceTree = "<group>"; }; + BB094F61F6A8A5737BCC4CF6 = { isa = PBXGroup; children = ( + 04ED2387517934A84ACF9865, + ECE3BE71EB6B9CF1CE869BBE, + 8D4FBD30E1C9EC0DA749BC83, + BCBBF8764A2101CD0E91DB5D ); name = misc; sourceTree = "<group>"; }; + 9519CC8E6EF00140A3B507BA = { isa = PBXGroup; children = ( + 2AB1CC4252DB09507ED31482, + 753B81CCB5A6B6929679E7B7, + B24098EC4FD79D5EDC9383EC ); name = application; sourceTree = "<group>"; }; + B324A7959C768520ED46A064 = { isa = PBXGroup; children = ( + CF5BC8DB7D66C655DABA9129, + 54339ADDCB6F8E9E7721A986, + 47EE021D6C891095140ED7A9, + A8B4D80D55E48F50809DC5E4, + 41AF61914A96159E9EA194B0, + 48E4FA55FD4440AF44EEA437, + 558E925DAC57ADF8810559AC, + 6514FD7E6C5EC12735E49FBC, + 1819C1C4DE5FEEDEA143E3D2, + 14FE601229C9A40C6E182F28, + C17E85281A455245543930E5, + 20EB4F22A76954F2986F364A, + 45258533F9F65AC96D3080B3, + 81D578AA5F277EB0946050E5, + 159790C750B1F8B485DBB499, + 1518D2BA7FCAF267EF1F02E6 ); name = native; sourceTree = "<group>"; }; + 83E1A8B708A967FC7D5B9FE4 = { isa = PBXGroup; children = ( + DA98B2B8AD88362017D0133B, + 8EB93734459D15BBDF8EF722, + 9A37C74D88FB91820F829E3C, + 9627D3CCE9D6810CB06B5D77, + 3DA4EA9C737426FDAF1484AD, + 23BCC80BAA5B674946A538A4, + DAA118DDF10823819CE57BF1, + 444DE4CB4BD092CB31057DFC, + DE87FCC919AE658D7931F3BA, + 6101DBF4D993FE2CB50D4F90, + 6DD8D8DBBBD09193A15803D0, + 09C2000EFECCE35F3F793E55, + 4CA0453E4C12495F1018A4E1, + 45BA9E76F27503E30F331299, + BB094F61F6A8A5737BCC4CF6, + 9519CC8E6EF00140A3B507BA, + B324A7959C768520ED46A064, + BF9B6B0B73FF87595307D858, + 3A9826A8C3B668BCC760BEB7 ); name = "juce_gui_basics"; sourceTree = "<group>"; }; + 9ADB0069D1F40FF3865041E3 = { isa = PBXGroup; children = ( + 1D7578F927EC030203A11978, + 5BB1E90842FD8A212CC2D132, + 586B1E0743FFBE9081A25F4F, + 106E81B939C6B35E34DD71FE, + 96F2A45DCB9BB53844B0ED4F, + 081E86FE0B991469CFA8D7EA, + DFAA7B563CEFB94D9ADB5D6A, + F4D2A03314AB1CF852CC4F2A ); name = "code_editor"; sourceTree = "<group>"; }; + E2198B85DAA7C61CCD912DD5 = { isa = PBXGroup; children = ( + D1F9878B45ABC403F3749567, + C679AE9BBB9B1EE3BAB09E11 ); name = documents; sourceTree = "<group>"; }; + 4DD214F6A346B4C4F28B3C5A = { isa = PBXGroup; children = ( + 901C720965646841A94EB099, + 32D568631762765C07D4BF0D, + 0E4B0B8425DBA19B6F3FE4BF ); name = embedding; sourceTree = "<group>"; }; + 2A882D30C0E50E70FCD95554 = { isa = PBXGroup; children = ( + 76140C0485FDDA98C3D98E2A, + 65BE7542749DCCAE33ACF40F ); name = lookandfeel; sourceTree = "<group>"; }; + C8A65F145D072BB3DA28595B = { isa = PBXGroup; children = ( + 3F56A025C4D83EBDB66E3676, + F46843B979D0385C733C797A, + AD1950C0733B3470777BF861, + CE2BD40797A6E7647FDBE736, + 23D82A4C165DD596474F30E4, + 1E9FE44F0CCC6604B5469412, + F0D9A28C206D7A8BA7089D29, + 88E5D0906646465409715828, + D4F94F0232F0CD426DFC44C5, + 0AA8F001A50408977E76ED96, + FD88DA941838FC91D222DF35, + 92E07CA13571893873565AC7, + 6D4BA4399FDEB6D2195B257D, + 7A9F37527280A470F201FB6E, + 73C69D948D33899821536025, + 8E696460A8A860B7A4044DFC ); name = misc; sourceTree = "<group>"; }; + 9924BF5224418D631DE02DA4 = { isa = PBXGroup; children = ( + 5E94E897783BEEFE61E61A2C, + 6FE8B0DD6116E6A3456ECF09, + 5284E69CC601457D5C7C1063, + D952A208CC8164F0B459EC9E, + 5A746CDDE80FEA2E45B5BA66, + 3A71F2C959CA7DD3C33DC411, + D357A886F6365DA33D639FF5, + 3C92F249799E7CBF41FABEA0, + 7C0F2759385C66CAC3EC362D, + 1D7FEC587CFE464A21830C4D, + 1BF01252E3A30560525CE057 ); name = native; sourceTree = "<group>"; }; + E3229181F8CC2BD5E409AF00 = { isa = PBXGroup; children = ( + 9ADB0069D1F40FF3865041E3, + E2198B85DAA7C61CCD912DD5, + 4DD214F6A346B4C4F28B3C5A, + 2A882D30C0E50E70FCD95554, + C8A65F145D072BB3DA28595B, + 9924BF5224418D631DE02DA4, + 1C639F4C139C8D7753AA9BB6, + 586448E180F8ACBF5A1565B0 ); name = "juce_gui_extra"; sourceTree = "<group>"; }; + 57F522311CAC2E8BF761B95A = { isa = PBXGroup; children = ( + FF082466FC37DC44320B3B7E, + 05DCAE8CA29532E2169D7AC1, + 4CF403118BBAAD5B6763542A, + A3B6D091280930A016DF8FDA, + 146C6A6E3C6B17F2AF475B50, + C5F9A0F8EB81AC15D9BDD61F, + B113BC1061788A9ECB1337C5, + A41AEA0D3ACB2B1E6713AE08, + D0247929128D618A2EB01D86, + 4C4E2282C145D13C86CB23FA, + AC116E6590D49AB2EF19CB9E, + 9F2853D1A12B686BE3BA2C61, + 29381F22B8FDF48C3EAC3A9F, + 455FFBB0C34B760D892D2D57, + 5D9792840E8050DCC766B368, + 61B0CBF705D5FC0431776286, + EF7B66764093D950724EFE70, + 971E49A78543AADB8CA1D2B7, + D4B0BD47094D79AB6382228B, + 12B5243A9435FABAFBE20165, + F6EBDA368C553C37BE703BE5 ); name = opengl; sourceTree = "<group>"; }; + 7C6BF9E0D166E4E5C3F2A005 = { isa = PBXGroup; children = ( + 917988BE74F2180BFC0583A3, + 3AC9B61C10692BBA96D2F775, + 3C18EC09535EA506FC0CBC62, + CC62E20B1189C697DD238810, + 205E9A5C31827555F1CAC30D, + 72FCE41894123FC5DB01566B, + 61481DD4AAC7731CE984937D ); name = native; sourceTree = "<group>"; }; + 2D49786EE07B37713213F905 = { isa = PBXGroup; children = ( + 57F522311CAC2E8BF761B95A, + 7C6BF9E0D166E4E5C3F2A005, + 4540694F9744C9F4D29149CE, + AE1EA04666EAD34D0CA0373D ); name = "juce_opengl"; sourceTree = "<group>"; }; + AADD3015266C1EF879776CBB = { isa = PBXGroup; children = ( + 59389DC8664617FD51740F36, + 7C15112E5F287ACDD74480F5 ); name = playback; sourceTree = "<group>"; }; + 795DACC07989C186924B5DA3 = { isa = PBXGroup; children = ( + E48A7B152993BCF473725A19 ); name = capture; sourceTree = "<group>"; }; + C55C0342ACE444BC42092159 = { isa = PBXGroup; children = ( + 70ECB490BD59F59D003F3BEE, + 6ABF91320A2EB6D307091AEE, + EB5F9A50EB53A57D6AE303C2, + D1D8F82F848413581B274A5D, + 65980344D141B0008A94E2E4, + 020205BB77179A9BE3FFF1E1 ); name = native; sourceTree = "<group>"; }; + AD985677A45CD32AB58EECA5 = { isa = PBXGroup; children = ( + AADD3015266C1EF879776CBB, + 795DACC07989C186924B5DA3, + C55C0342ACE444BC42092159, + F88A99110564C87FBA281F2C, + C0B54E0803BA87C8BC353551 ); name = "juce_video"; sourceTree = "<group>"; }; + 328BE41789531FE4F91F7DA1 = { isa = PBXGroup; children = ( + 9311E4762BC3218510204A0F, + 83416B76189CFC2030936CCA, + E2F864696FA2DDDAD60C7E83, + 95530BD93D8ECFCC072C0850, + 702A741EEADCBB982DDE18B0, + 7333A0F468D3745057EB2368, + F196226BFBA15D76688C61C6, + A7F7E551BA5A75737261BB4C, + F61CCB10A356CE4278F74478, + 448EFC87A2DEF32F9547F801, + 83E1A8B708A967FC7D5B9FE4, + E3229181F8CC2BD5E409AF00, + 2D49786EE07B37713213F905, + AD985677A45CD32AB58EECA5 ); name = "Juce Modules"; sourceTree = "<group>"; }; + 826D8EF5D0C6BF7B9F2AEAF0 = { isa = PBXGroup; children = ( + D30880F1F9F514CEEDB9F48B, + A512C5B237A77EF6FB8E11A0, + 837D266B3F62C3B05C2BC28C, + DF3C9A1DD67E879E4E0A2727, + 65F4459CC1832883FFF6C166, + 6B28CEAF75E22F2CCCACBCC7, + B20469D88488F0809126CC80, + 56728EC77C65482B9C86FF4D, + A6A579E4E4AEA865BC71148C, + 488D1B00C9E5FE4DAB035EDF, + DBCA7E2FFCFD1354DD19DDD6, + C29E664781AA2396C8D59543, + BBDFB328C3D5FC72A0446E6A, + 23609D430A25F54723269E91, + 27DC0E650D6D54DF29E6DB68, + 5915DB02FB7CA8CEC1BF38A9, + 4A7695E93CE32F4E95042FCB, + 87B4BA68E49DD11197B7AFDB ); name = "Juce Library Code"; sourceTree = "<group>"; }; + 469F0AB7234589951A8F29FA = { isa = PBXGroup; children = ( + 46EF49B14DF7357A8287D9D8, + BBE1DB78E35135B41537DCB5, + 61317B5191E05925F232E18C ); name = Resources; sourceTree = "<group>"; }; + 008433D940C09C1A15B916BA = { isa = PBXGroup; children = ( + 39F287BE4C0B4F3BD4A949FD, + C868329EBC1BBA606AB2EB88, + DBB769DEBCD6468C13A3CD25, + F5A00ACFA3D76168F22F1205, + 27313EA12BC45638321922CA, + 243817BA562AD7FA76C834C9, + D685CFEA6344360FBFC355B6, + E31563D2E7DDD8315F369233, + 9C21DBFB38865E5AFE367C6F, + 80C1B737D2C2CB519D1787D7, + C055D09224D84121A3EBB29F, + 56169D835A3E3029D6E3904C, + 4FD13AA663EEE7CC2F83033D ); name = Frameworks; sourceTree = "<group>"; }; + FA0E0597ED415901958AD5AE = { isa = PBXGroup; children = ( + 99E1BC08B886CFDD2CCFD462 ); name = Products; sourceTree = "<group>"; }; + A7589AF92E6E958E1F866761 = { isa = PBXGroup; children = ( + 9D44948383EAABF451302146, + 328BE41789531FE4F91F7DA1, + 826D8EF5D0C6BF7B9F2AEAF0, + 469F0AB7234589951A8F29FA, + 008433D940C09C1A15B916BA, + FA0E0597ED415901958AD5AE ); name = Source; sourceTree = "<group>"; }; + 95F63B27BAC6E72226C3E356 = { isa = XCBuildConfiguration; buildSettings = { + HEADER_SEARCH_PATHS = "../../JuceLibraryCode $(inherited)"; + GCC_OPTIMIZATION_LEVEL = 0; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)"; MACOSX_DEPLOYMENT_TARGET_ppc = 10.4; - OTHER_LDFLAGS = ( - "-lftdi", - "-lftgl", - ); SDKROOT_ppc = macosx10.5; - }; - name = Release; - }; - 95F63B27BAC6E72226C3E356 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_LINK_OBJC_RUNTIME = NO; COMBINE_HIDPI_IMAGES = YES; - CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)"; + OTHER_LDFLAGS = "-lftdi -lftgl"; + ONLY_ACTIVE_ARCH = YES; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - "_DEBUG=1", - "DEBUG=1", - "JUCER_XCODE_MAC_F6D2F4CF=1", - ); - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - HEADER_SEARCH_PATHS = ( - ../../JuceLibraryCode, - "$(inherited),", - /usr/local/include/freetype2, - /opt/local/include, - /usr/local/include, - ); + "_DEBUG=1", + "DEBUG=1", + "JUCER_XCODE_MAC_F6D2F4CF=1"); }; name = Debug; }; + 7A6F9B742B69F66DC3E29FA8 = { isa = XCBuildConfiguration; buildSettings = { + HEADER_SEARCH_PATHS = "../../JuceLibraryCode $(inherited)"; + GCC_OPTIMIZATION_LEVEL = 3; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)"; MACOSX_DEPLOYMENT_TARGET_ppc = 10.4; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = ( - "-lftdi", - "-lftgl", - ); SDKROOT_ppc = macosx10.5; - }; - name = Debug; - }; - C8018C9A4DA633CA60663294 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_LINK_OBJC_RUNTIME = NO; + COMBINE_HIDPI_IMAGES = YES; + OTHER_LDFLAGS = "-lftdi -lftgl"; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_NDEBUG=1", + "NDEBUG=1", + "JUCER_XCODE_MAC_F6D2F4CF=1"); }; name = Release; }; + C8018C9A4DA633CA60663294 = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = c99; - GCC_INLINES_ARE_PRIVATE_EXTERN = YES; - GCC_MODEL_TUNING = G5; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_MISSING_PARENTHESES = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + WARNING_CFLAGS = -Wreorder; + GCC_MODEL_TUNING = G5; + GCC_INLINES_ARE_PRIVATE_EXTERN = YES; + ZERO_LINK = NO; + DEBUG_INFORMATION_FORMAT = "dwarf"; + PRODUCT_NAME = "open-ephys"; }; name = Debug; }; + 747300E66AC17ACE193A6C37 = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - PRODUCT_NAME = "open-ephys"; - WARNING_CFLAGS = "-Wreorder"; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + WARNING_CFLAGS = -Wreorder; + GCC_MODEL_TUNING = G5; + GCC_INLINES_ARE_PRIVATE_EXTERN = YES; ZERO_LINK = NO; - }; - name = Debug; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 3B096175C0B17BFA58475A08 /* Build configuration list for PBXProject "open-ephys" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C8018C9A4DA633CA60663294 /* Debug */, - 747300E66AC17ACE193A6C37 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - B0259CB1FA28CEC89ED4FA14 /* Build configuration list for PBXNativeTarget "open-ephys" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 95F63B27BAC6E72226C3E356 /* Debug */, - 7A6F9B742B69F66DC3E29FA8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; -/* End XCConfigurationList section */ + DEBUG_INFORMATION_FORMAT = "dwarf"; + PRODUCT_NAME = "open-ephys"; }; name = Release; }; + 3B096175C0B17BFA58475A08 = { isa = XCConfigurationList; buildConfigurations = ( + C8018C9A4DA633CA60663294, + 747300E66AC17ACE193A6C37 ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + B0259CB1FA28CEC89ED4FA14 = { isa = XCConfigurationList; buildConfigurations = ( + 95F63B27BAC6E72226C3E356, + 7A6F9B742B69F66DC3E29FA8 ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 256EEB2E7946EFA9B0774D25 = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 2D2BDB63CBD0BED07FF9E44B, + 4FA2949D3023FC2E377AFFB6 ); runOnlyForDeploymentPostprocessing = 0; }; + 0C1B429379FBBA77A635B49A = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 14BDAEA656AAFA60334CC55C, + C853FCE2F6C91B3643322CF0, + 00A0D05390DB9F2B74DDAA78, + 4AD3281B0CCF122A25E33667, + F505DF3C2BA492B5A2F28D05, + B226387EB0FCE3BE6773FF61, + B3B08037F49EC7540586828F, + B6C73582C501D8C3C03A4860, + 129ADFA8B25DE091AFA2D9E3, + 285FF16149C85F2793EBCBAE, + D19775DC99C67AD20F98EF17, + CB470032BC92A30906C96258, + 4FEC4EC2796E37A3B11B50B9, + A44FEA7117CFE2F06B9889B4, + C0E966234C8AF91C19CF6EA4, + BBE886EA79C50D0D68A5A753, + 9D17609E468FC65EB70ED7F4, + AE06672D2CBF8F64465B2126, + 69630D3ECA4D6014EE3734CD, + 0AE243437B40602D35435C32, + FDCFDC9CC6D7A82131190FB0, + 11D82BA398E9433440B76F66, + EDEE5E21F0C9BDB7DB796083, + C6F08BF3EF53274A42BB88EB, + DDDFAE2042D8AD20CC78CE3C, + 582C224AA50C9395810C8E27, + 704484388E63CDE33491E1AB, + 1691EC0AC4C7083D65B925E2, + AD032CEA5DBE4D4C76D3D2D1, + 9E8544C3983B3203530B5A49, + 685151FF4FB872983524A5C3, + 627C7B84F5FD275FAF43663A, + C59764685E62E7C4D323F84B, + E4DA638CDD4DD574A6CD843E, + 2B4A80DCF867DC025C21966B, + D0E9E20F9D8FDA700BB6D820, + 19BB86C918F89D1377F8A0E1, + EE56A6BBBFA4A27A4BCF7279, + 1B620FC17AAECA4C5DE741E2, + 5570682BF1A39FB3E3FAC182, + 3C464BC802026D6EF6AD3818, + ED8CB527B27C67E9E4DA027C, + DE758AF46844DF951655966C, + 80E5365461A5A7A32C48C563, + AF26E388BF6536803E762CB1, + 0CEFF81CD8861F959DB13362, + 352F3875222B1D233013AAF9, + F0EC60AEFAFF3D289F8110BE, + C3406F00595AEFF068EDB162, + 3A2E957EB8D117C535F119E9, + 52AE3F7AEED81BA9ED5C4830, + 3933895CA488855A23943F61, + AF67C81811F18FCE6AA9C895, + AA16BE5A6BBD024C8FCFCDA8, + 992137E90F9D41522FD56875, + 7F188166D38DA7FB23311413, + A454D138EC507C01D299AB0F, + 784125612E2B7AC6CD89D835, + 21539690A9A5DD20AFAF41D3, + 0836C50051EF59BF91D7B12D, + 55CD2E9F373B69C3E8363B78, + 2B29D90B985E9EB788472EFE, + D0873C347977633B4421B94D, + BF3254F07C15D467D6DB3FEF, + 6029B20DF2BD523AC0F78896, + 6702EEA4E99D503C0EE933C4, + 89FCE8890946693CD5FC4A70, + C9AC286A46B3A1318F298DEF, + DA836EC803E4FF4EDEBE6386, + 702C9BFCE865CB6C6B8BFB0D, + 739573501D1D440A72C5C2E5, + 955561F4FF4484648FDB9F73, + 6B67D7B6301182C7621294B6, + FAE745870674A07A65690433, + 96142DE6467CA74A74E669D4, + 24CC7E9A7E87F762D4AB0467, + 66F3B79BDF9BFB631D7E3584, + 996F9E4989EB47941D8100DA, + BE54C019A73BBAE05BFD7D17, + 5AE42EF7A713B1EC0ACF9EDE, + 71111DE81104B1536ECB6DFB, + 85A60568B3DC342C76B4E679, + 8A5BACA019DA9B0EFAD5CE93, + 95AE939ADE096394CCD2526F, + E85DA5FC9A162F129ABA7113, + 6A13D8F42A330E2C410B43E3, + 13F1111511DD01E843E631CA, + 9A80E3D1D1758A31D2169497, + F4397EAE00E0B9F96C8B6C07, + 09673DA3B4D6EA61DEFC0C46, + 591CED1277A8C945EF60841C, + 58D3FF3B1F462634167BDFB5, + 3162B66BC8118715AAA527D7, + 004E78BC139419671A9EA137, + 6306AA945375749C4FE834E6, + AD7D05519200FB0EE1C7617A, + C2475E008FEB33B3EA7B6C7F, + 9227961C07C0EE73E89C90B5, + A2EE65335FB2810C04ECBFAF, + 3FF289281D3318A7BA8BB44D, + 9E30156DBCE4EAF9EFAF0AC4, + 6510492BAE00C95DC620F493, + 06BCB79AE267E5841F641E38, + A0DAD4E5F7583349DC9275F2, + FCB767F14565886C9D823916, + 7015D104F55D5B128341CEA8, + A269A876BDF3B7011FA4C681, + 58E0EC510F2A88E14AE55439, + 002427B013C43CE3E6D4E9B5, + FA2A052548AAD146F3F5AD83 ); runOnlyForDeploymentPostprocessing = 0; }; + 7BE915E5A64C787EBF13A8E7 = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 0D3DFADD627629AD52668186, + 38568B2E6C61E2F07173B568, + C8D7AC0B88A9A2C182B2B752, + A94130738A9973148544664A, + E5CBEA12D7AD7788C9BF5737, + 9212DC2AEE118398CC970DDF, + 3D0C7CA4AD9E3963D52E89BD, + 3130878C465F3294A89CA142, + E100912B2FCE36A30D097C95, + CAB9D9DEF279F93132B45F90, + CA4DCF67B48352BE633A616D, + FD4865450F4C47FF3C6327FE, + 512D7D16D0A95BDD0D6D6E45 ); runOnlyForDeploymentPostprocessing = 0; }; + 609761DEC9151D2CDD50270C = { isa = PBXNativeTarget; buildConfigurationList = B0259CB1FA28CEC89ED4FA14; buildPhases = ( + 256EEB2E7946EFA9B0774D25, + 0C1B429379FBBA77A635B49A, + 7BE915E5A64C787EBF13A8E7 ); buildRules = ( ); dependencies = ( ); name = "open-ephys"; productName = "open-ephys"; productReference = 99E1BC08B886CFDD2CCFD462; productInstallPath = "$(HOME)/Applications"; productType = "com.apple.product-type.application"; }; + 41375E3272D6505F75FDEEEB = { isa = PBXProject; buildConfigurationList = 3B096175C0B17BFA58475A08; attributes = { LastUpgradeCheck = 0440; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = A7589AF92E6E958E1F866761; projectDirPath = ""; projectRoot = ""; targets = ( 609761DEC9151D2CDD50270C ); }; }; - rootObject = 41375E3272D6505F75FDEEEB /* Project object */; + rootObject = 41375E3272D6505F75FDEEEB; } diff --git a/Builds/VisualStudio2010/open-ephys.vcxproj b/Builds/VisualStudio2010/open-ephys.vcxproj index cfb7c42fa2211cb4f81b5620ec8f27b4763a44b9..f1f9cddd8b46bcb63140effffc2f80a234758818 100644 --- a/Builds/VisualStudio2010/open-ephys.vcxproj +++ b/Builds/VisualStudio2010/open-ephys.vcxproj @@ -165,12 +165,6 @@ <ClCompile Include="..\..\Source\Processors\Utilities\RecordControl.cpp"/> <ClCompile Include="..\..\Source\Processors\Utilities\Merger.cpp"/> <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp"/> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\SpikePlot.cpp"/> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\BaseUIElement.cpp"/> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\GenericAxes.cpp"/> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\PlotUtils.cpp"/> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\ProjectionAxes.cpp"/> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\WaveAxes.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\DataWindow.cpp"/> @@ -179,6 +173,7 @@ <ClCompile Include="..\..\Source\Processors\SpikeDetector.cpp"/> <ClCompile Include="..\..\Source\Processors\AudioNode.cpp"/> <ClCompile Include="..\..\Source\Processors\EventNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\RHD2000Editor.cpp"/> <ClCompile Include="..\..\Source\Processors\Editors\RecordControlEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Editors\ReferenceNodeEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Editors\ResamplingNodeEditor.cpp"/> @@ -1345,13 +1340,6 @@ <ClInclude Include="..\..\Source\Processors\Utilities\RecordControl.h"/> <ClInclude Include="..\..\Source\Processors\Utilities\Merger.h"/> <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\SpikePlot.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\BaseUIElement.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\GenericAxes.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\PlotUtils.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\ProjectionAxes.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\SimpleKeyEvent.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\WaveAxes.h"/> <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h"/> <ClInclude Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.h"/> <ClInclude Include="..\..\Source\Processors\Visualization\Visualizer.h"/> @@ -1361,6 +1349,7 @@ <ClInclude Include="..\..\Source\Processors\SpikeDetector.h"/> <ClInclude Include="..\..\Source\Processors\AudioNode.h"/> <ClInclude Include="..\..\Source\Processors\EventNode.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\RHD2000Editor.h"/> <ClInclude Include="..\..\Source\Processors\Editors\RecordControlEditor.h"/> <ClInclude Include="..\..\Source\Processors\Editors\ReferenceNodeEditor.h"/> <ClInclude Include="..\..\Source\Processors\Editors\ResamplingNodeEditor.h"/> diff --git a/Builds/VisualStudio2010/open-ephys.vcxproj.filters b/Builds/VisualStudio2010/open-ephys.vcxproj.filters index c02f79fa189c0b6f82fed7c6a7a9f2b8e5e53064..9993432feb16699c4eedf2c10ac1794330ec9e6b 100644 --- a/Builds/VisualStudio2010/open-ephys.vcxproj.filters +++ b/Builds/VisualStudio2010/open-ephys.vcxproj.filters @@ -47,9 +47,6 @@ <Filter Include="open-ephys\Source\Processors\Visualization"> <UniqueIdentifier>{851942D5-FED6-A7B2-6FAB-C278A247FE7A}</UniqueIdentifier> </Filter> - <Filter Include="open-ephys\Source\Processors\Visualization\SpikePlotting"> - <UniqueIdentifier>{513EA02D-1407-2B30-B177-63B08F784C08}</UniqueIdentifier> - </Filter> <Filter Include="open-ephys\Source\Processors\Editors"> <UniqueIdentifier>{E65874A6-23B2-9D76-B12A-15730E2192BC}</UniqueIdentifier> </Filter> @@ -469,24 +466,6 @@ <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp"> <Filter>open-ephys\Source\Processors\Utilities</Filter> </ClCompile> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\SpikePlot.cpp"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\BaseUIElement.cpp"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\GenericAxes.cpp"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\PlotUtils.cpp"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\ProjectionAxes.cpp"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\WaveAxes.cpp"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClCompile> <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp"> <Filter>open-ephys\Source\Processors\Visualization</Filter> </ClCompile> @@ -511,6 +490,9 @@ <ClCompile Include="..\..\Source\Processors\EventNode.cpp"> <Filter>open-ephys\Source\Processors</Filter> </ClCompile> + <ClCompile Include="..\..\Source\Processors\Editors\RHD2000Editor.cpp"> + <Filter>open-ephys\Source\Processors\Editors</Filter> + </ClCompile> <ClCompile Include="..\..\Source\Processors\Editors\RecordControlEditor.cpp"> <Filter>open-ephys\Source\Processors\Editors</Filter> </ClCompile> @@ -1968,27 +1950,6 @@ <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h"> <Filter>open-ephys\Source\Processors\Utilities</Filter> </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\SpikePlot.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\BaseUIElement.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\GenericAxes.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\PlotUtils.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\ProjectionAxes.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\SimpleKeyEvent.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\WaveAxes.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h"> <Filter>open-ephys\Source\Processors\Visualization</Filter> </ClInclude> @@ -2016,6 +1977,9 @@ <ClInclude Include="..\..\Source\Processors\EventNode.h"> <Filter>open-ephys\Source\Processors</Filter> </ClInclude> + <ClInclude Include="..\..\Source\Processors\Editors\RHD2000Editor.h"> + <Filter>open-ephys\Source\Processors\Editors</Filter> + </ClInclude> <ClInclude Include="..\..\Source\Processors\Editors\RecordControlEditor.h"> <Filter>open-ephys\Source\Processors\Editors</Filter> </ClInclude> diff --git a/Builds/VisualStudio2012/open-ephys.vcxproj b/Builds/VisualStudio2012/open-ephys.vcxproj index 0ce8be3d25248ec041ce26a841a923d33b16e43a..8ba9ba395bc2567d001a4597a9067cff95ebce42 100644 --- a/Builds/VisualStudio2012/open-ephys.vcxproj +++ b/Builds/VisualStudio2012/open-ephys.vcxproj @@ -169,12 +169,6 @@ <ClCompile Include="..\..\Source\Processors\Utilities\RecordControl.cpp"/> <ClCompile Include="..\..\Source\Processors\Utilities\Merger.cpp"/> <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp"/> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\SpikePlot.cpp"/> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\BaseUIElement.cpp"/> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\GenericAxes.cpp"/> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\PlotUtils.cpp"/> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\ProjectionAxes.cpp"/> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\WaveAxes.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\DataWindow.cpp"/> @@ -183,6 +177,7 @@ <ClCompile Include="..\..\Source\Processors\SpikeDetector.cpp"/> <ClCompile Include="..\..\Source\Processors\AudioNode.cpp"/> <ClCompile Include="..\..\Source\Processors\EventNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\RHD2000Editor.cpp"/> <ClCompile Include="..\..\Source\Processors\Editors\RecordControlEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Editors\ReferenceNodeEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Editors\ResamplingNodeEditor.cpp"/> @@ -1349,13 +1344,6 @@ <ClInclude Include="..\..\Source\Processors\Utilities\RecordControl.h"/> <ClInclude Include="..\..\Source\Processors\Utilities\Merger.h"/> <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\SpikePlot.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\BaseUIElement.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\GenericAxes.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\PlotUtils.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\ProjectionAxes.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\SimpleKeyEvent.h"/> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\WaveAxes.h"/> <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h"/> <ClInclude Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.h"/> <ClInclude Include="..\..\Source\Processors\Visualization\Visualizer.h"/> @@ -1365,6 +1353,7 @@ <ClInclude Include="..\..\Source\Processors\SpikeDetector.h"/> <ClInclude Include="..\..\Source\Processors\AudioNode.h"/> <ClInclude Include="..\..\Source\Processors\EventNode.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\RHD2000Editor.h"/> <ClInclude Include="..\..\Source\Processors\Editors\RecordControlEditor.h"/> <ClInclude Include="..\..\Source\Processors\Editors\ReferenceNodeEditor.h"/> <ClInclude Include="..\..\Source\Processors\Editors\ResamplingNodeEditor.h"/> diff --git a/Builds/VisualStudio2012/open-ephys.vcxproj.filters b/Builds/VisualStudio2012/open-ephys.vcxproj.filters index c02f79fa189c0b6f82fed7c6a7a9f2b8e5e53064..9993432feb16699c4eedf2c10ac1794330ec9e6b 100644 --- a/Builds/VisualStudio2012/open-ephys.vcxproj.filters +++ b/Builds/VisualStudio2012/open-ephys.vcxproj.filters @@ -47,9 +47,6 @@ <Filter Include="open-ephys\Source\Processors\Visualization"> <UniqueIdentifier>{851942D5-FED6-A7B2-6FAB-C278A247FE7A}</UniqueIdentifier> </Filter> - <Filter Include="open-ephys\Source\Processors\Visualization\SpikePlotting"> - <UniqueIdentifier>{513EA02D-1407-2B30-B177-63B08F784C08}</UniqueIdentifier> - </Filter> <Filter Include="open-ephys\Source\Processors\Editors"> <UniqueIdentifier>{E65874A6-23B2-9D76-B12A-15730E2192BC}</UniqueIdentifier> </Filter> @@ -469,24 +466,6 @@ <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp"> <Filter>open-ephys\Source\Processors\Utilities</Filter> </ClCompile> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\SpikePlot.cpp"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\BaseUIElement.cpp"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\GenericAxes.cpp"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\PlotUtils.cpp"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\ProjectionAxes.cpp"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\Visualization\SpikePlotting\WaveAxes.cpp"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClCompile> <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp"> <Filter>open-ephys\Source\Processors\Visualization</Filter> </ClCompile> @@ -511,6 +490,9 @@ <ClCompile Include="..\..\Source\Processors\EventNode.cpp"> <Filter>open-ephys\Source\Processors</Filter> </ClCompile> + <ClCompile Include="..\..\Source\Processors\Editors\RHD2000Editor.cpp"> + <Filter>open-ephys\Source\Processors\Editors</Filter> + </ClCompile> <ClCompile Include="..\..\Source\Processors\Editors\RecordControlEditor.cpp"> <Filter>open-ephys\Source\Processors\Editors</Filter> </ClCompile> @@ -1968,27 +1950,6 @@ <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h"> <Filter>open-ephys\Source\Processors\Utilities</Filter> </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\SpikePlot.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\BaseUIElement.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\GenericAxes.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\PlotUtils.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\ProjectionAxes.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\SimpleKeyEvent.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> - <ClInclude Include="..\..\Source\Processors\Visualization\SpikePlotting\WaveAxes.h"> - <Filter>open-ephys\Source\Processors\Visualization\SpikePlotting</Filter> - </ClInclude> <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h"> <Filter>open-ephys\Source\Processors\Visualization</Filter> </ClInclude> @@ -2016,6 +1977,9 @@ <ClInclude Include="..\..\Source\Processors\EventNode.h"> <Filter>open-ephys\Source\Processors</Filter> </ClInclude> + <ClInclude Include="..\..\Source\Processors\Editors\RHD2000Editor.h"> + <Filter>open-ephys\Source\Processors\Editors</Filter> + </ClInclude> <ClInclude Include="..\..\Source\Processors\Editors\RecordControlEditor.h"> <Filter>open-ephys\Source\Processors\Editors</Filter> </ClInclude> diff --git a/Source/AccessClass.cpp b/Source/AccessClass.cpp index aa7b84bb702966eac2beec24ef163f8f2874ec00..b169c2cf1aaf45aa42c21f99a1de42c34f45db3b 100644 --- a/Source/AccessClass.cpp +++ b/Source/AccessClass.cpp @@ -1,23 +1,23 @@ - /* - ------------------------------------------------------------------ +/* + ------------------------------------------------------------------ - This file is part of the Open Ephys GUI - Copyright (C) 2013 Open Ephys + This file is part of the Open Ephys GUI + Copyright (C) 2013 Open Ephys - ------------------------------------------------------------------ + ------------------------------------------------------------------ - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -35,17 +35,17 @@ void AccessClass::setUIComponent(UIComponent* ui_) { - ui = ui_; + ui = ui_; - ev = ui->getEditorViewport(); - dv = ui->getDataViewport(); - pl = ui->getProcessorList(); - pg = ui->getProcessorGraph(); - cp = ui->getControlPanel(); - mc = ui->getMessageCenter(); - ac = ui->getAudioComponent(); + ev = ui->getEditorViewport(); + dv = ui->getDataViewport(); + pl = ui->getProcessorList(); + pg = ui->getProcessorGraph(); + cp = ui->getControlPanel(); + mc = ui->getMessageCenter(); + ac = ui->getAudioComponent(); - addActionListener(mc); + addActionListener(mc); updateChildComponents(); } diff --git a/Source/AccessClass.h b/Source/AccessClass.h index 0991c8513420b314315bdc3fa2d0267cb7ebb69d..ee6a0fc5f32a0e8f8ea0d1a61d8e25135248e304 100644 --- a/Source/AccessClass.h +++ b/Source/AccessClass.h @@ -24,9 +24,6 @@ #ifndef __ACCESSCLASS_H_CE1DC2DE__ #define __ACCESSCLASS_H_CE1DC2DE__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../JuceLibraryCode/JuceHeader.h" class UIComponent; @@ -39,14 +36,14 @@ class ControlPanel; class AudioComponent; /** - + Allows subclasses to access important pointers within the application. When an object inherits from AccessClass, it makes it much more convenient to get and set pointers to other objects, such as the EditorViewport, ProcessorList, and - ProcessorGraph that are used throughout the application. In addition, every subclass + ProcessorGraph that are used throughout the application. In addition, every subclass of AccessClass automatically adds the MessageCenter as an ActionListener, which means - messages sent by that object [using sendActionMessage("Message.")] will appear + messages sent by that object [using sendActionMessage("Message.")] will appear in the MessageCenter by default. @see UIComponent, MessageCenter @@ -57,56 +54,80 @@ class AccessClass : public ActionBroadcaster { public: - AccessClass() { } - ~AccessClass() { } - - /** Sets the object's UIComponent and copies all the necessary pointers - from the UIComponent. - - Automatically adds the MessageCenter as an ActionListener, which causes - messages sent using sendActionMessage("Message") to appear in the - MessageCenter. */ - void setUIComponent(UIComponent*); - - /** Called within setUIComponent() to enable subclasses to update their - members' pointers. */ - virtual void updateChildComponents() {} - - - /** Returns a pointer to the application's EditorViewport. */ - EditorViewport* getEditorViewport() {return ev;} - - /** Returns a pointer to the application's DataViewport. */ - DataViewport* getDataViewport() {return dv;} - - /** Returns a pointer to the application's ProcessorList. */ - ProcessorList* getProcessorList() {return pl;} - - /** Returns a pointer to the application's ProcessorGraph. */ - ProcessorGraph* getProcessorGraph() {return pg;} - - /** Returns a pointer to the application's DataViewport. */ - ControlPanel* getControlPanel() {return cp;} - - /** Returns a pointer to the application's MessageCenter. */ - MessageCenter* getMessageCenter() {return mc;} - - /** Returns a pointer to the application's UIComponent. */ - UIComponent* getUIComponent() {return ui;} - - /** Returns a pointer to the application's AudioComponent. */ - AudioComponent* getAudioComponent() {return ac;} + AccessClass() { } + ~AccessClass() { } + + /** Sets the object's UIComponent and copies all the necessary pointers + from the UIComponent. + + Automatically adds the MessageCenter as an ActionListener, which causes + messages sent using sendActionMessage("Message") to appear in the + MessageCenter. */ + void setUIComponent(UIComponent*); + + /** Called within setUIComponent() to enable subclasses to update their + members' pointers. */ + virtual void updateChildComponents() {} + + + /** Returns a pointer to the application's EditorViewport. */ + EditorViewport* getEditorViewport() + { + return ev; + } + + /** Returns a pointer to the application's DataViewport. */ + DataViewport* getDataViewport() + { + return dv; + } + + /** Returns a pointer to the application's ProcessorList. */ + ProcessorList* getProcessorList() + { + return pl; + } + + /** Returns a pointer to the application's ProcessorGraph. */ + ProcessorGraph* getProcessorGraph() + { + return pg; + } + + /** Returns a pointer to the application's DataViewport. */ + ControlPanel* getControlPanel() + { + return cp; + } + + /** Returns a pointer to the application's MessageCenter. */ + MessageCenter* getMessageCenter() + { + return mc; + } + + /** Returns a pointer to the application's UIComponent. */ + UIComponent* getUIComponent() + { + return ui; + } + + /** Returns a pointer to the application's AudioComponent. */ + AudioComponent* getAudioComponent() + { + return ac; + } private: - UIComponent* ui; - EditorViewport* ev; - ProcessorList* pl; - DataViewport* dv; - ProcessorGraph* pg; - ControlPanel* cp; - MessageCenter* mc; - AudioComponent* ac; + UIComponent* ui; + EditorViewport* ev; + ProcessorList* pl; + DataViewport* dv; + ProcessorGraph* pg; + ControlPanel* cp; + MessageCenter* mc; + AudioComponent* ac; }; diff --git a/Source/Audio/AudioComponent.cpp b/Source/Audio/AudioComponent.cpp index a6b38954906bc1d9399447b2029247dcbb0ad5f1..c504ed1b135d804efc6d56222917a86ef9197795 100644 --- a/Source/Audio/AudioComponent.cpp +++ b/Source/Audio/AudioComponent.cpp @@ -27,143 +27,149 @@ AudioComponent::AudioComponent() : isPlaying(false) { - // if this is nonempty, we got an error - String error = deviceManager.initialise(0, // numInputChannelsNeeded - 2, // numOutputChannelsNeeded - 0, // *savedState (XmlElement) - true, // selectDefaultDeviceOnFailure - String::empty, // preferred device - 0); // preferred device setup options - if (error != String::empty) - { - String titleMessage = String("Audio device initialization error"); - String contentMessage = String("There was a problem initializing the audio device:\n" + error); - // this uses a bool since there are only two options - // also, omitting parameters works fine, even though the docs don't show defaults - bool retryButtonClicked = AlertWindow::showOkCancelBox(AlertWindow::QuestionIcon, - titleMessage, - contentMessage, - String("Retry"), - String("Quit")); - - if (retryButtonClicked) - { - // as above - error = deviceManager.initialise(0, 2, 0, true, String::empty, 0); - } else { // quit button clicked - JUCEApplication::quit(); - } - } - - - AudioIODevice* aIOd = deviceManager.getCurrentAudioDevice(); - - // the error string doesn't tell you if there's no audio device found... - if (aIOd == 0) - { - String titleMessage = String("No audio device found"); - String contentMessage = String("Couldn't find an audio device. ") + - String("Perhaps some other program has control of the default one."); - AlertWindow::showMessageBox(AlertWindow::InfoIcon, - titleMessage, - contentMessage); - JUCEApplication::quit(); - } - - - std::cout << "Got audio device." << std::endl; - - String devName = aIOd->getName(); - - std::cout << std::endl << "Audio device name: " << devName << std::endl; - - AudioDeviceManager::AudioDeviceSetup setup; - deviceManager.getAudioDeviceSetup(setup); - - setup.bufferSize = 1024; /// larger buffer = fewer empty blocks, but longer latencies - setup.useDefaultInputChannels = false; - setup.inputChannels = 0; - setup.useDefaultOutputChannels = true; - setup.outputChannels = 2; - setup.sampleRate = 44100.0; - - String msg = deviceManager.setAudioDeviceSetup(setup, false); - - String devType = deviceManager.getCurrentAudioDeviceType(); - std::cout << "Audio device type: " << devType << std::endl; - - float sr = setup.sampleRate; - int buffSize = setup.bufferSize; - String oDN = setup.outputDeviceName; - BigInteger oC = setup.outputChannels; - - std::cout << "Audio output channels: " << oC.toInteger() << std::endl; - std::cout << "Audio device sample rate: " << sr << std::endl; - std::cout << "Audio device buffer size: " << buffSize << std::endl << std::endl; - - graphPlayer = new AudioProcessorPlayer(); - - stopDevice(); // reduces the amount of background processing when - // device is not in use + // if this is nonempty, we got an error + String error = deviceManager.initialise(0, // numInputChannelsNeeded + 2, // numOutputChannelsNeeded + 0, // *savedState (XmlElement) + true, // selectDefaultDeviceOnFailure + String::empty, // preferred device + 0); // preferred device setup options + if (error != String::empty) + { + String titleMessage = String("Audio device initialization error"); + String contentMessage = String("There was a problem initializing the audio device:\n" + error); + // this uses a bool since there are only two options + // also, omitting parameters works fine, even though the docs don't show defaults + bool retryButtonClicked = AlertWindow::showOkCancelBox(AlertWindow::QuestionIcon, + titleMessage, + contentMessage, + String("Retry"), + String("Quit")); + + if (retryButtonClicked) + { + // as above + error = deviceManager.initialise(0, 2, 0, true, String::empty, 0); + } + else // quit button clicked + { + JUCEApplication::quit(); + } + } + + + AudioIODevice* aIOd = deviceManager.getCurrentAudioDevice(); + + // the error string doesn't tell you if there's no audio device found... + if (aIOd == 0) + { + String titleMessage = String("No audio device found"); + String contentMessage = String("Couldn't find an audio device. ") + + String("Perhaps some other program has control of the default one."); + AlertWindow::showMessageBox(AlertWindow::InfoIcon, + titleMessage, + contentMessage); + JUCEApplication::quit(); + } + + + std::cout << "Got audio device." << std::endl; + + String devName = aIOd->getName(); + + std::cout << std::endl << "Audio device name: " << devName << std::endl; + + AudioDeviceManager::AudioDeviceSetup setup; + deviceManager.getAudioDeviceSetup(setup); + + setup.bufferSize = 1024; /// larger buffer = fewer empty blocks, but longer latencies + setup.useDefaultInputChannels = false; + setup.inputChannels = 0; + setup.useDefaultOutputChannels = true; + setup.outputChannels = 2; + setup.sampleRate = 44100.0; + + String msg = deviceManager.setAudioDeviceSetup(setup, false); + + String devType = deviceManager.getCurrentAudioDeviceType(); + std::cout << "Audio device type: " << devType << std::endl; + + float sr = setup.sampleRate; + int buffSize = setup.bufferSize; + String oDN = setup.outputDeviceName; + BigInteger oC = setup.outputChannels; + + std::cout << "Audio output channels: " << oC.toInteger() << std::endl; + std::cout << "Audio device sample rate: " << sr << std::endl; + std::cout << "Audio device buffer size: " << buffSize << std::endl << std::endl; + + graphPlayer = new AudioProcessorPlayer(); + + stopDevice(); // reduces the amount of background processing when + // device is not in use } -AudioComponent::~AudioComponent() { - - if (callbacksAreActive()) - endCallbacks(); +AudioComponent::~AudioComponent() +{ + + if (callbacksAreActive()) + endCallbacks(); - deleteAndZero(graphPlayer); + deleteAndZero(graphPlayer); } void AudioComponent::connectToProcessorGraph(AudioProcessorGraph* processorGraph) { - - graphPlayer->setProcessor(processorGraph); + + graphPlayer->setProcessor(processorGraph); } void AudioComponent::disconnectProcessorGraph() { - - graphPlayer->setProcessor(0); + + graphPlayer->setProcessor(0); } -bool AudioComponent::callbacksAreActive() { - return isPlaying; +bool AudioComponent::callbacksAreActive() +{ + return isPlaying; } void AudioComponent::restartDevice() { - deviceManager.restartLastAudioDevice(); + deviceManager.restartLastAudioDevice(); } void AudioComponent::stopDevice() { - deviceManager.closeAudioDevice(); + deviceManager.closeAudioDevice(); } -void AudioComponent::beginCallbacks() { - - restartDevice(); +void AudioComponent::beginCallbacks() +{ + + restartDevice(); - std::cout << std::endl << "Adding audio callback." << std::endl; - deviceManager.addAudioCallback(graphPlayer); - isPlaying = true; + std::cout << std::endl << "Adding audio callback." << std::endl; + deviceManager.addAudioCallback(graphPlayer); + isPlaying = true; } -void AudioComponent::endCallbacks() { - - std::cout << std::endl << "Removing audio callback." << std::endl; - deviceManager.removeAudioCallback(graphPlayer); - isPlaying = false; +void AudioComponent::endCallbacks() +{ + + std::cout << std::endl << "Removing audio callback." << std::endl; + deviceManager.removeAudioCallback(graphPlayer); + isPlaying = false; - stopDevice(); + stopDevice(); } diff --git a/Source/Audio/AudioComponent.h b/Source/Audio/AudioComponent.h index 021737cb4939585adb3f5dbf33a143c0635d2921..f553ab9c37238c4c31b1a7e3d915b16118899b92 100644 --- a/Source/Audio/AudioComponent.h +++ b/Source/Audio/AudioComponent.h @@ -24,13 +24,10 @@ #ifndef __AUDIOCOMPONENT_H_D97C73CF__ #define __AUDIOCOMPONENT_H_D97C73CF__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" /** - + Interfaces with system audio hardware. Uses the audio card to generate the callbacks to run the ProcessorGraph @@ -45,48 +42,49 @@ */ -class AudioComponent { +class AudioComponent +{ public: - /** Constructor. Finds the audio component (if there is one), and sets the - default sample rate and buffer size.*/ - AudioComponent(); - ~AudioComponent(); + /** Constructor. Finds the audio component (if there is one), and sets the + default sample rate and buffer size.*/ + AudioComponent(); + ~AudioComponent(); - /** Begins the audio callbacks that drive data acquisition.*/ - void beginCallbacks(); + /** Begins the audio callbacks that drive data acquisition.*/ + void beginCallbacks(); - /** Stops the audio callbacks that drive data acquisition.*/ - void endCallbacks(); + /** Stops the audio callbacks that drive data acquisition.*/ + void endCallbacks(); - /** Connects the AudioComponent to the ProcessorGraph (crucial for any sort of - data acquisition; done at startup).*/ - void connectToProcessorGraph(AudioProcessorGraph* processorGraph); + /** Connects the AudioComponent to the ProcessorGraph (crucial for any sort of + data acquisition; done at startup).*/ + void connectToProcessorGraph(AudioProcessorGraph* processorGraph); - /** Disconnects the AudioComponent to the ProcessorGraph (only done when the application - is about to close).*/ - void disconnectProcessorGraph(); + /** Disconnects the AudioComponent to the ProcessorGraph (only done when the application + is about to close).*/ + void disconnectProcessorGraph(); - /** Returns true if the audio callbacks are active, false otherwise.*/ - bool callbacksAreActive(); + /** Returns true if the audio callbacks are active, false otherwise.*/ + bool callbacksAreActive(); - /** Restarts communication with the audio device in order to update settings - or just prior the start of data acquisition callbacks.*/ - void restartDevice(); + /** Restarts communication with the audio device in order to update settings + or just prior the start of data acquisition callbacks.*/ + void restartDevice(); - /** Stops communication with the selected audio device (to conserve CPU load - when callbacks are not active).*/ - void stopDevice(); + /** Stops communication with the selected audio device (to conserve CPU load + when callbacks are not active).*/ + void stopDevice(); - AudioDeviceManager deviceManager; + AudioDeviceManager deviceManager; private: - bool isPlaying; + bool isPlaying; - AudioProcessorPlayer* graphPlayer; + AudioProcessorPlayer* graphPlayer; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioComponent); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AudioComponent); }; diff --git a/Source/DoxygenMainPage.h b/Source/DoxygenMainPage.h index 6970e0f0e0e8e32c9e592ac8d095549f64f54cf1..c72a095f7d8508d484dfb5fcf8d3ec67ae62e571 100644 --- a/Source/DoxygenMainPage.h +++ b/Source/DoxygenMainPage.h @@ -4,7 +4,7 @@ \section intro Introduction This is the introduction. - + \section install More info \subsection step1 More info will appear here soon! diff --git a/Source/Dsp/Bessel.cpp b/Source/Dsp/Bessel.cpp index ed2036ab7391776745c2f7b8d69accbc04c04dd4..db0b0422ea47791712bbbd87a095230d75d60a85 100644 --- a/Source/Dsp/Bessel.cpp +++ b/Source/Dsp/Bessel.cpp @@ -37,186 +37,188 @@ THE SOFTWARE. #include "Bessel.h" #include "RootFinder.h" -namespace Dsp { +namespace Dsp +{ -namespace Bessel { +namespace Bessel +{ // returns fact(n) = n! -static double fact (int n) +static double fact(int n) { - if (n == 0) - return 1; + if (n == 0) + return 1; - double y = n; - for (double m = n; --m;) - y *= m; + double y = n; + for (double m = n; --m;) + y *= m; - return y; + return y; } // returns the k-th zero based coefficient of the reverse bessel polynomial of degree n -static double reversebessel (int k, int n) +static double reversebessel(int k, int n) { - return fact (2 * n - k) / - ((fact (n - k) * fact(k)) * pow(2., n - k)); + return fact(2 * n - k) / + ((fact(n - k) * fact(k)) * pow(2., n - k)); } //------------------------------------------------------------------------------ -AnalogLowPass::AnalogLowPass () - : m_numPoles (-1) +AnalogLowPass::AnalogLowPass() + : m_numPoles(-1) { - setNormal (0, 1); + setNormal(0, 1); } -void AnalogLowPass::design (int numPoles, - WorkspaceBase* w) +void AnalogLowPass::design(int numPoles, + WorkspaceBase* w) { - if (m_numPoles != numPoles) - { - m_numPoles = numPoles; + if (m_numPoles != numPoles) + { + m_numPoles = numPoles; - reset (); + reset(); - RootFinderBase& solver (w->roots); - for (int i = 0; i < numPoles + 1; ++i) - solver.coef()[i] = reversebessel (i, numPoles); - solver.solve (numPoles); + RootFinderBase& solver(w->roots); + for (int i = 0; i < numPoles + 1; ++i) + solver.coef()[i] = reversebessel(i, numPoles); + solver.solve(numPoles); - const int pairs = numPoles / 2; - for (int i = 0; i < pairs; ++i) - { - complex_t c = solver.root()[i]; - addPoleZeroConjugatePairs (c, infinity()); - } + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + complex_t c = solver.root()[i]; + addPoleZeroConjugatePairs(c, infinity()); + } - if (numPoles & 1) - add (solver.root()[pairs].real(), infinity()); - } + if (numPoles & 1) + add(solver.root()[pairs].real(), infinity()); + } } //------------------------------------------------------------------------------ -AnalogLowShelf::AnalogLowShelf () - : m_numPoles (-1) +AnalogLowShelf::AnalogLowShelf() + : m_numPoles(-1) { - setNormal (doublePi, 1); + setNormal(doublePi, 1); } -void AnalogLowShelf::design (int numPoles, - double gainDb, - WorkspaceBase* w) +void AnalogLowShelf::design(int numPoles, + double gainDb, + WorkspaceBase* w) { - if (m_numPoles != numPoles || - m_gainDb != gainDb) - { - m_numPoles = numPoles; - m_gainDb = gainDb; - - reset (); - - const double G = pow (10., gainDb / 20) - 1; - - RootFinderBase& poles (w->roots); - for (int i = 0; i < numPoles + 1; ++i) - poles.coef()[i] = reversebessel (i, numPoles); - poles.solve (numPoles); - - RootFinder<50> zeros; - for (int i = 0; i < numPoles + 1; ++i) - zeros.coef()[i] = reversebessel (i, numPoles); - double a0 = reversebessel (0, numPoles); - zeros.coef()[0] += G * a0; - zeros.solve (numPoles); - - const int pairs = numPoles / 2; - for (int i = 0; i < pairs; ++i) + if (m_numPoles != numPoles || + m_gainDb != gainDb) { - complex_t p = poles.root()[i]; - complex_t z = zeros.root()[i]; - addPoleZeroConjugatePairs (p, z); + m_numPoles = numPoles; + m_gainDb = gainDb; + + reset(); + + const double G = pow(10., gainDb / 20) - 1; + + RootFinderBase& poles(w->roots); + for (int i = 0; i < numPoles + 1; ++i) + poles.coef()[i] = reversebessel(i, numPoles); + poles.solve(numPoles); + + RootFinder<50> zeros; + for (int i = 0; i < numPoles + 1; ++i) + zeros.coef()[i] = reversebessel(i, numPoles); + double a0 = reversebessel(0, numPoles); + zeros.coef()[0] += G * a0; + zeros.solve(numPoles); + + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + complex_t p = poles.root()[i]; + complex_t z = zeros.root()[i]; + addPoleZeroConjugatePairs(p, z); + } + + if (numPoles & 1) + add(poles.root()[pairs].real(), zeros.root()[pairs].real()); } - - if (numPoles & 1) - add (poles.root()[pairs].real(), zeros.root()[pairs].real()); - } } //------------------------------------------------------------------------------ -void LowPassBase::setup (int order, - double sampleRate, - double cutoffFrequency, - WorkspaceBase* w) +void LowPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + WorkspaceBase* w) { - m_analogProto.design (order, w); + m_analogProto.design(order, w); - LowPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void HighPassBase::setup (int order, - double sampleRate, - double cutoffFrequency, - WorkspaceBase* w) +void HighPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + WorkspaceBase* w) { - m_analogProto.design (order, w); + m_analogProto.design(order, w); - HighPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandPassBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - WorkspaceBase* w) +void BandPassBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + WorkspaceBase* w) { - m_analogProto.design (order, w); + m_analogProto.design(order, w); - BandPassTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandStopBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - WorkspaceBase* w) +void BandStopBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + WorkspaceBase* w) { - m_analogProto.design (order, w); + m_analogProto.design(order, w); - BandStopTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandStopTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void LowShelfBase::setup (int order, - double sampleRate, - double cutoffFrequency, - double gainDb, - WorkspaceBase* w) +void LowShelfBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb, + WorkspaceBase* w) { - m_analogProto.design (order, gainDb, w); + m_analogProto.design(order, gainDb, w); - LowPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } } diff --git a/Source/Dsp/Bessel.h b/Source/Dsp/Bessel.h index e133cd72c124a5d63d7d0d0d98b4d3dce6e64969..10e4593aa3de732a2249c367afe6d240db871918 100644 --- a/Source/Dsp/Bessel.h +++ b/Source/Dsp/Bessel.h @@ -43,41 +43,43 @@ THE SOFTWARE. #include "PoleFilter.h" #include "RootFinder.h" -namespace Dsp { +namespace Dsp +{ /* * Filters with Bessel response characteristics * */ -namespace Bessel { +namespace Bessel +{ // A Workspace is necessary to find roots struct WorkspaceBase { - WorkspaceBase (RootFinderBase* rootsBase) - : roots (*rootsBase) - { - } + WorkspaceBase(RootFinderBase* rootsBase) + : roots(*rootsBase) + { + } - RootFinderBase& roots; + RootFinderBase& roots; private: - WorkspaceBase (WorkspaceBase&); - WorkspaceBase& operator= (WorkspaceBase&); + WorkspaceBase(WorkspaceBase&); + WorkspaceBase& operator= (WorkspaceBase&); }; template <int MaxOrder> struct Workspace : WorkspaceBase { - Workspace () - : WorkspaceBase (&m_roots) - { - } + Workspace() + : WorkspaceBase(&m_roots) + { + } private: - RootFinder <MaxOrder> m_roots; + RootFinder <MaxOrder> m_roots; }; //------------------------------------------------------------------------------ @@ -87,13 +89,13 @@ private: class AnalogLowPass : public LayoutBase { public: - AnalogLowPass (); + AnalogLowPass(); - void design (const int numPoles, - WorkspaceBase* w); + void design(const int numPoles, + WorkspaceBase* w); private: - int m_numPoles; + int m_numPoles; }; //------------------------------------------------------------------------------ @@ -101,15 +103,15 @@ private: class AnalogLowShelf : public LayoutBase { public: - AnalogLowShelf (); + AnalogLowShelf(); - void design (int numPoles, - double gainDb, - WorkspaceBase* w); + void design(int numPoles, + double gainDb, + WorkspaceBase* w); private: - int m_numPoles; - double m_gainDb; + int m_numPoles; + double m_gainDb; }; //------------------------------------------------------------------------------ @@ -118,45 +120,45 @@ private: struct LowPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - WorkspaceBase* w); + void setup(int order, + double sampleRate, + double cutoffFrequency, + WorkspaceBase* w); }; struct HighPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - WorkspaceBase* w); + void setup(int order, + double sampleRate, + double cutoffFrequency, + WorkspaceBase* w); }; struct BandPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - WorkspaceBase* w); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + WorkspaceBase* w); }; struct BandStopBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - WorkspaceBase* w); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + WorkspaceBase* w); }; struct LowShelfBase : PoleFilterBase <AnalogLowShelf> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double gainDb, - WorkspaceBase* w); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb, + WorkspaceBase* w); }; //------------------------------------------------------------------------------ @@ -168,82 +170,82 @@ struct LowShelfBase : PoleFilterBase <AnalogLowShelf> template <int MaxOrder> struct LowPass : PoleFilter <LowPassBase, MaxOrder> { - void setup (int order, - double sampleRate, - double cutoffFrequency) - { - Workspace <MaxOrder> w; - LowPassBase::setup (order, - sampleRate, - cutoffFrequency, - &w); - } + void setup(int order, + double sampleRate, + double cutoffFrequency) + { + Workspace <MaxOrder> w; + LowPassBase::setup(order, + sampleRate, + cutoffFrequency, + &w); + } }; template <int MaxOrder> struct HighPass : PoleFilter <HighPassBase, MaxOrder> { - void setup (int order, - double sampleRate, - double cutoffFrequency) - { - Workspace <MaxOrder> w; - HighPassBase::setup (order, - sampleRate, - cutoffFrequency, - &w); - } + void setup(int order, + double sampleRate, + double cutoffFrequency) + { + Workspace <MaxOrder> w; + HighPassBase::setup(order, + sampleRate, + cutoffFrequency, + &w); + } }; template <int MaxOrder> struct BandPass : PoleFilter <BandPassBase, MaxOrder, MaxOrder*2> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency) - { - Workspace <MaxOrder> w; - BandPassBase::setup (order, - sampleRate, - centerFrequency, - widthFrequency, - &w); - } + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency) + { + Workspace <MaxOrder> w; + BandPassBase::setup(order, + sampleRate, + centerFrequency, + widthFrequency, + &w); + } }; template <int MaxOrder> struct BandStop : PoleFilter <BandStopBase, MaxOrder, MaxOrder*2> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency) - { - Workspace <MaxOrder> w; - BandStopBase::setup (order, - sampleRate, - centerFrequency, - widthFrequency, - &w); - } + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency) + { + Workspace <MaxOrder> w; + BandStopBase::setup(order, + sampleRate, + centerFrequency, + widthFrequency, + &w); + } }; template <int MaxOrder> struct LowShelf : PoleFilter <LowShelfBase, MaxOrder, MaxOrder*2> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double gainDb) - { - Workspace <MaxOrder> w; - LowShelfBase::setup (order, - sampleRate, - cutoffFrequency, - gainDb, - &w); - } + void setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb) + { + Workspace <MaxOrder> w; + LowShelfBase::setup(order, + sampleRate, + cutoffFrequency, + gainDb, + &w); + } }; //------------------------------------------------------------------------------ @@ -252,186 +254,217 @@ struct LowShelf : PoleFilter <LowShelfBase, MaxOrder, MaxOrder*2> // Gui-friendly Design layer // -namespace Design { +namespace Design +{ struct TypeIBase : DesignBase { - enum - { - NumParams = 3 - }; + enum + { + NumParams = 3 + }; - static int getNumParams () - { - return 3; - } + static int getNumParams() + { + return 3; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCutoffFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCutoffFrequencyParam(); + } }; template <class FilterClass> struct TypeI : TypeIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2]); + } }; struct TypeIIBase : DesignBase { - enum - { - NumParams = 4 - }; + enum + { + NumParams = 4 + }; - static int getNumParams () - { - return 4; - } + static int getNumParams() + { + return 4; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCenterFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCenterFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultBandwidthHzParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultBandwidthHzParam(); + } }; template <class FilterClass> struct TypeII : TypeIIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3]); + } }; struct TypeIIIBase : DesignBase { - enum - { - NumParams = 4 - }; + enum + { + NumParams = 4 + }; - static int getNumParams () - { - return 4; - } + static int getNumParams() + { + return 4; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCutoffFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCutoffFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultGainParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultGainParam(); + } }; template <class FilterClass> struct TypeIII : TypeIIIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), - params[0], - params[2], - params[3]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), + params[0], + params[2], + params[3]); + } }; struct TypeIVBase : DesignBase { - enum - { - NumParams = 5 - }; + enum + { + NumParams = 5 + }; - static int getNumParams () - { - return 5; - } + static int getNumParams() + { + return 5; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCenterFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCenterFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultBandwidthHzParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultBandwidthHzParam(); + } - static const ParamInfo getParamInfo_4 () - { - return ParamInfo::defaultGainParam (); - } + static const ParamInfo getParamInfo_4() + { + return ParamInfo::defaultGainParam(); + } }; template <class FilterClass> struct TypeIV : TypeIVBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3], params[4]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); + } }; // Factored kind and name struct LowPassDescription { - static Kind getKind () { return kindLowPass; } - static const char* getName() { return "Bessel Low Pass"; } + static Kind getKind() + { + return kindLowPass; + } + static const char* getName() + { + return "Bessel Low Pass"; + } }; struct HighPassDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Bessel High Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Bessel High Pass"; + } }; struct BandPassDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Bessel Band Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Bessel Band Pass"; + } }; struct BandStopDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Bessel Band Stop"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Bessel Band Stop"; + } }; struct LowShelfDescription { - static Kind getKind () { return kindLowShelf; } - static const char* getName() { return "Bessel Low Shelf"; } + static Kind getKind() + { + return kindLowShelf; + } + static const char* getName() + { + return "Bessel Low Shelf"; + } }; // This glues on the Order parameter template <int MaxOrder, - template <class> class TypeClass, - template <int> class FilterClass> + template <class> class TypeClass, + template <int> class FilterClass> struct OrderBase : TypeClass <FilterClass <MaxOrder> > { - const ParamInfo getParamInfo_1 () const - { - return ParamInfo (idOrder, "Order", "Order", - 1, MaxOrder, 2, - &ParamInfo::Int_toControlValue, - &ParamInfo::Int_toNativeValue, - &ParamInfo::Int_toString); + const ParamInfo getParamInfo_1() const + { + return ParamInfo(idOrder, "Order", "Order", + 1, MaxOrder, 2, + &ParamInfo::Int_toControlValue, + &ParamInfo::Int_toNativeValue, + &ParamInfo::Int_toString); - } + } }; //------------------------------------------------------------------------------ @@ -442,25 +475,25 @@ struct OrderBase : TypeClass <FilterClass <MaxOrder> > template <int MaxOrder> struct LowPass : OrderBase <MaxOrder, TypeI, Bessel::LowPass>, - LowPassDescription + LowPassDescription { }; template <int MaxOrder> struct HighPass : OrderBase <MaxOrder, TypeI, Bessel::HighPass>, - HighPassDescription + HighPassDescription { }; template <int MaxOrder> struct BandPass : OrderBase <MaxOrder, TypeII, Bessel::BandPass>, - BandPassDescription + BandPassDescription { }; template <int MaxOrder> struct BandStop : OrderBase <MaxOrder, TypeII, Bessel::BandStop>, - BandStopDescription + BandStopDescription { }; @@ -470,7 +503,7 @@ struct BandStop : OrderBase <MaxOrder, TypeII, Bessel::BandStop>, */ template <int MaxOrder> struct LowShelf : OrderBase <MaxOrder, TypeIII, Bessel::LowShelf>, - LowShelfDescription + LowShelfDescription { }; diff --git a/Source/Dsp/Biquad.cpp b/Source/Dsp/Biquad.cpp index 16b2b8f77296db2ad5e42de5c18add99c3232974..eedb3dda99cd5b3234bac25b9c68c40b793caf8f 100644 --- a/Source/Dsp/Biquad.cpp +++ b/Source/Dsp/Biquad.cpp @@ -37,198 +37,199 @@ THE SOFTWARE. #include "MathSupplement.h" #include "Biquad.h" -namespace Dsp { +namespace Dsp +{ -BiquadPoleState::BiquadPoleState (const BiquadBase& s) +BiquadPoleState::BiquadPoleState(const BiquadBase& s) { - const double a0 = s.getA0 (); - const double a1 = s.getA1 (); - const double a2 = s.getA2 (); - const double b0 = s.getB0 (); - const double b1 = s.getB1 (); - const double b2 = s.getB2 (); - - if (a2 == 0 && b2 == 0) - { - // single pole - poles.first = -a1; - zeros.first = -b0 / b1; - poles.second = 0; - zeros.second = 0; - } - else - { + const double a0 = s.getA0(); + const double a1 = s.getA1(); + const double a2 = s.getA2(); + const double b0 = s.getB0(); + const double b1 = s.getB1(); + const double b2 = s.getB2(); + + if (a2 == 0 && b2 == 0) { - const complex_t c = sqrt (complex_t (a1 * a1 - 4 * a0 * a2, 0)); - double d = 2. * a0; - poles.first = -(a1 + c) / d; - poles.second = (c - a1) / d; - assert (!poles.is_nan()); + // single pole + poles.first = -a1; + zeros.first = -b0 / b1; + poles.second = 0; + zeros.second = 0; } - + else { - const complex_t c = sqrt (complex_t ( - b1 * b1 - 4 * b0 * b2, 0)); - double d = 2. * b0; - zeros.first = -(b1 + c) / d; - zeros.second = (c - b1) / d; - assert (!zeros.is_nan()); + { + const complex_t c = sqrt(complex_t (a1 * a1 - 4 * a0 * a2, 0)); + double d = 2. * a0; + poles.first = -(a1 + c) / d; + poles.second = (c - a1) / d; + assert(!poles.is_nan()); + } + + { + const complex_t c = sqrt(complex_t ( + b1 * b1 - 4 * b0 * b2, 0)); + double d = 2. * b0; + zeros.first = -(b1 + c) / d; + zeros.second = (c - b1) / d; + assert(!zeros.is_nan()); + } } - } - gain = b0 / a0; + gain = b0 / a0; } //------------------------------------------------------------------------------ -complex_t BiquadBase::response (double normalizedFrequency) const +complex_t BiquadBase::response(double normalizedFrequency) const { - const double a0 = getA0 (); - const double a1 = getA1 (); - const double a2 = getA2 (); - const double b0 = getB0 (); - const double b1 = getB1 (); - const double b2 = getB2 (); - - const double w = 2 * doublePi * normalizedFrequency; - const complex_t czn1 = std::polar (1., -w); - const complex_t czn2 = std::polar (1., -2 * w); - complex_t ch (1); - complex_t cbot (1); - - complex_t ct (b0/a0); - complex_t cb (1); - ct = addmul (ct, b1/a0, czn1); - ct = addmul (ct, b2/a0, czn2); - cb = addmul (cb, a1/a0, czn1); - cb = addmul (cb, a2/a0, czn2); - ch *= ct; - cbot *= cb; - - return ch / cbot; + const double a0 = getA0(); + const double a1 = getA1(); + const double a2 = getA2(); + const double b0 = getB0(); + const double b1 = getB1(); + const double b2 = getB2(); + + const double w = 2 * doublePi * normalizedFrequency; + const complex_t czn1 = std::polar(1., -w); + const complex_t czn2 = std::polar(1., -2 * w); + complex_t ch(1); + complex_t cbot(1); + + complex_t ct(b0/a0); + complex_t cb(1); + ct = addmul(ct, b1/a0, czn1); + ct = addmul(ct, b2/a0, czn2); + cb = addmul(cb, a1/a0, czn1); + cb = addmul(cb, a2/a0, czn2); + ch *= ct; + cbot *= cb; + + return ch / cbot; } -std::vector<PoleZeroPair> BiquadBase::getPoleZeros () const +std::vector<PoleZeroPair> BiquadBase::getPoleZeros() const { - std::vector<PoleZeroPair> vpz; - BiquadPoleState bps (*this); - vpz.push_back (bps); - return vpz; + std::vector<PoleZeroPair> vpz; + BiquadPoleState bps(*this); + vpz.push_back(bps); + return vpz; } -void BiquadBase::setCoefficients (double a0, double a1, double a2, - double b0, double b1, double b2) +void BiquadBase::setCoefficients(double a0, double a1, double a2, + double b0, double b1, double b2) { - assert (!Dsp::is_nan (a0) && !Dsp::is_nan (a1) && !Dsp::is_nan (a2) && - !Dsp::is_nan (b0) && !Dsp::is_nan (b1) && !Dsp::is_nan (b2)); - - m_a0 = a0; - m_a1 = a1/a0; - m_a2 = a2/a0; - m_b0 = b0/a0; - m_b1 = b1/a0; - m_b2 = b2/a0; + assert(!Dsp::is_nan(a0) && !Dsp::is_nan(a1) && !Dsp::is_nan(a2) && + !Dsp::is_nan(b0) && !Dsp::is_nan(b1) && !Dsp::is_nan(b2)); + + m_a0 = a0; + m_a1 = a1/a0; + m_a2 = a2/a0; + m_b0 = b0/a0; + m_b1 = b1/a0; + m_b2 = b2/a0; } -void BiquadBase::setOnePole (complex_t pole, complex_t zero) +void BiquadBase::setOnePole(complex_t pole, complex_t zero) { #if 0 - pole = adjust_imag (pole); - zero = adjust_imag (zero); + pole = adjust_imag(pole); + zero = adjust_imag(zero); #else - assert (pole.imag() == 0); - assert (zero.imag() == 0); + assert(pole.imag() == 0); + assert(zero.imag() == 0); #endif - - const double a0 = 1; - const double a1 = -pole.real(); - const double a2 = 0; - const double b0 = -zero.real(); - const double b1 = 1; - const double b2 = 0; - - setCoefficients (a0, a1, a2, b0, b1, b2); + + const double a0 = 1; + const double a1 = -pole.real(); + const double a2 = 0; + const double b0 = -zero.real(); + const double b1 = 1; + const double b2 = 0; + + setCoefficients(a0, a1, a2, b0, b1, b2); } -void BiquadBase::setTwoPole (complex_t pole1, complex_t zero1, - complex_t pole2, complex_t zero2) +void BiquadBase::setTwoPole(complex_t pole1, complex_t zero1, + complex_t pole2, complex_t zero2) { #if 0 - pole1 = adjust_imag (pole1); - pole2 = adjust_imag (pole2); - zero1 = adjust_imag (zero1); - zero2 = adjust_imag (zero2); + pole1 = adjust_imag(pole1); + pole2 = adjust_imag(pole2); + zero1 = adjust_imag(zero1); + zero2 = adjust_imag(zero2); #endif - const double a0 = 1; - double a1; - double a2; - - if (pole1.imag() != 0) - { - assert (pole2 == std::conj (pole1)); - - a1 = -2 * pole1.real(); - a2 = std::norm (pole1); - } - else - { - assert (pole2.imag() == 0); - - a1 = -(pole1.real() + pole2.real()); - a2 = pole1.real() * pole2.real(); - } - - const double b0 = 1; - double b1; - double b2; - - if (zero1.imag() != 0) - { - assert (zero2 == std::conj (zero1)); - - b1 = -2 * zero1.real(); - b2 = std::norm (zero1); - } - else - { - assert (zero2.imag() == 0); - - b1 = -(zero1.real() + zero2.real()); - b2 = zero1.real() * zero2.real(); - } - - setCoefficients (a0, a1, a2, b0, b1, b2); + const double a0 = 1; + double a1; + double a2; + + if (pole1.imag() != 0) + { + assert(pole2 == std::conj(pole1)); + + a1 = -2 * pole1.real(); + a2 = std::norm(pole1); + } + else + { + assert(pole2.imag() == 0); + + a1 = -(pole1.real() + pole2.real()); + a2 = pole1.real() * pole2.real(); + } + + const double b0 = 1; + double b1; + double b2; + + if (zero1.imag() != 0) + { + assert(zero2 == std::conj(zero1)); + + b1 = -2 * zero1.real(); + b2 = std::norm(zero1); + } + else + { + assert(zero2.imag() == 0); + + b1 = -(zero1.real() + zero2.real()); + b2 = zero1.real() * zero2.real(); + } + + setCoefficients(a0, a1, a2, b0, b1, b2); } -void BiquadBase::setPoleZeroForm (const BiquadPoleState& bps) +void BiquadBase::setPoleZeroForm(const BiquadPoleState& bps) { - setPoleZeroPair (bps); - applyScale (bps.gain); + setPoleZeroPair(bps); + applyScale(bps.gain); } -void BiquadBase::setIdentity () +void BiquadBase::setIdentity() { - setCoefficients (1, 0, 0, 1, 0, 0); + setCoefficients(1, 0, 0, 1, 0, 0); } -void BiquadBase::applyScale (double scale) +void BiquadBase::applyScale(double scale) { - m_b0 *= scale; - m_b1 *= scale; - m_b2 *= scale; + m_b0 *= scale; + m_b1 *= scale; + m_b2 *= scale; } //------------------------------------------------------------------------------ -Biquad::Biquad () +Biquad::Biquad() { } // Construct a second order section from a pair of poles and zeroes -Biquad::Biquad (const BiquadPoleState& bps) +Biquad::Biquad(const BiquadPoleState& bps) { - setPoleZeroForm (bps); + setPoleZeroForm(bps); } //------------------------------------------------------------------------------ diff --git a/Source/Dsp/Biquad.h b/Source/Dsp/Biquad.h index 3fbafd94819b6c72897d2e804077d9625c140fb8..396fc8f254ab6f2ff7a4a86414e991f2453e452d 100644 --- a/Source/Dsp/Biquad.h +++ b/Source/Dsp/Biquad.h @@ -40,7 +40,8 @@ THE SOFTWARE. #include "MathSupplement.h" #include "Types.h" -namespace Dsp { +namespace Dsp +{ struct BiquadPoleState; @@ -54,74 +55,93 @@ struct BiquadPoleState; class BiquadBase { public: - template <class StateType> - struct State : StateType, private DenormalPrevention - { - template <typename Sample> - inline Sample process (const Sample in, const BiquadBase& b) + template <class StateType> + struct State : StateType, private DenormalPrevention { - return static_cast<Sample> (StateType::process1 (in, b, ac())); - } - }; + template <typename Sample> + inline Sample process(const Sample in, const BiquadBase& b) + { + return static_cast<Sample>(StateType::process1(in, b, ac())); + } + }; public: - // Calculate filter response at the given normalized frequency. - complex_t response (double normalizedFrequency) const; - - std::vector<PoleZeroPair> getPoleZeros () const; - - double getA0 () const { return m_a0; } - double getA1 () const { return m_a1*m_a0; } - double getA2 () const { return m_a2*m_a0; } - double getB0 () const { return m_b0*m_a0; } - double getB1 () const { return m_b1*m_a0; } - double getB2 () const { return m_b2*m_a0; } - - // Process a block of samples in the given form - template <class StateType, typename Sample> - void process (int numSamples, Sample* dest, StateType& state) const - { - while (--numSamples >= 0) { - *dest = state.process (*dest, *this); - dest++; + // Calculate filter response at the given normalized frequency. + complex_t response(double normalizedFrequency) const; + + std::vector<PoleZeroPair> getPoleZeros() const; + + double getA0() const + { + return m_a0; + } + double getA1() const + { + return m_a1*m_a0; + } + double getA2() const + { + return m_a2*m_a0; + } + double getB0() const + { + return m_b0*m_a0; + } + double getB1() const + { + return m_b1*m_a0; + } + double getB2() const + { + return m_b2*m_a0; + } + + // Process a block of samples in the given form + template <class StateType, typename Sample> + void process(int numSamples, Sample* dest, StateType& state) const + { + while (--numSamples >= 0) + { + *dest = state.process(*dest, *this); + dest++; + } } - } protected: - // - // These are protected so you can't mess with RBJ biquads - // + // + // These are protected so you can't mess with RBJ biquads + // - void setCoefficients (double a0, double a1, double a2, - double b0, double b1, double b2); + void setCoefficients(double a0, double a1, double a2, + double b0, double b1, double b2); - void setOnePole (complex_t pole, complex_t zero); + void setOnePole(complex_t pole, complex_t zero); - void setTwoPole (complex_t pole1, complex_t zero1, - complex_t pole2, complex_t zero2); + void setTwoPole(complex_t pole1, complex_t zero1, + complex_t pole2, complex_t zero2); - void setPoleZeroPair (const PoleZeroPair& pair) - { - if (pair.isSinglePole ()) - setOnePole (pair.poles.first, pair.zeros.first); - else - setTwoPole (pair.poles.first, pair.zeros.first, - pair.poles.second, pair.zeros.second); - } + void setPoleZeroPair(const PoleZeroPair& pair) + { + if (pair.isSinglePole()) + setOnePole(pair.poles.first, pair.zeros.first); + else + setTwoPole(pair.poles.first, pair.zeros.first, + pair.poles.second, pair.zeros.second); + } - void setPoleZeroForm (const BiquadPoleState& bps); + void setPoleZeroForm(const BiquadPoleState& bps); - void setIdentity (); + void setIdentity(); - void applyScale (double scale); + void applyScale(double scale); public: - double m_a0; - double m_a1; - double m_a2; - double m_b1; - double m_b2; - double m_b0; + double m_a0; + double m_a1; + double m_a2; + double m_b1; + double m_b2; + double m_b0; }; //------------------------------------------------------------------------------ @@ -130,103 +150,103 @@ public: // values so that the coefficients can be reconstructed precisely. struct BiquadPoleState : PoleZeroPair { - BiquadPoleState () { } + BiquadPoleState() { } - explicit BiquadPoleState (const BiquadBase& s); + explicit BiquadPoleState(const BiquadBase& s); - double gain; + double gain; }; // More permissive interface for fooling around class Biquad : public BiquadBase { public: - Biquad (); + Biquad(); - explicit Biquad (const BiquadPoleState& bps); + explicit Biquad(const BiquadPoleState& bps); public: - // Process a block of samples, interpolating from the old section's coefficients - // to this section's coefficients, over numSamples. This implements smooth - // parameter changes. - - template <class StateType, typename Sample> - void smoothProcess1 (int numSamples, - Sample* dest, - StateType& state, - Biquad sectionPrev) const - { - double t = 1. / numSamples; - double da1 = (m_a1 - sectionPrev.m_a1) * t; - double da2 = (m_a2 - sectionPrev.m_a2) * t; - double db0 = (m_b0 - sectionPrev.m_b0) * t; - double db1 = (m_b1 - sectionPrev.m_b1) * t; - double db2 = (m_b2 - sectionPrev.m_b2) * t; - - while (--numSamples >= 0) + // Process a block of samples, interpolating from the old section's coefficients + // to this section's coefficients, over numSamples. This implements smooth + // parameter changes. + + template <class StateType, typename Sample> + void smoothProcess1(int numSamples, + Sample* dest, + StateType& state, + Biquad sectionPrev) const + { + double t = 1. / numSamples; + double da1 = (m_a1 - sectionPrev.m_a1) * t; + double da2 = (m_a2 - sectionPrev.m_a2) * t; + double db0 = (m_b0 - sectionPrev.m_b0) * t; + double db1 = (m_b1 - sectionPrev.m_b1) * t; + double db2 = (m_b2 - sectionPrev.m_b2) * t; + + while (--numSamples >= 0) + { + sectionPrev.m_a1 += da1; + sectionPrev.m_a2 += da2; + sectionPrev.m_b0 += db0; + sectionPrev.m_b1 += db1; + sectionPrev.m_b2 += db2; + + *dest++ = state.process(*dest, sectionPrev); + } + } + + // Process a block of samples, interpolating from the old section's pole/zeros + // to this section's pole/zeros, over numSamples. The interpolation is done + // in the z-plane using polar coordinates. + template <class StateType, typename Sample> + void smoothProcess2(int numSamples, + Sample* dest, + StateType& state, + BiquadPoleState zPrev) const { - sectionPrev.m_a1 += da1; - sectionPrev.m_a2 += da2; - sectionPrev.m_b0 += db0; - sectionPrev.m_b1 += db1; - sectionPrev.m_b2 += db2; + BiquadPoleState z(*this); + double t = 1. / numSamples; + complex_t dp0 = (z.poles.first - zPrev.poles.first) * t; + complex_t dp1 = (z.poles.second - zPrev.poles.second) * t; + complex_t dz0 = (z.zeros.first - zPrev.zeros.first) * t; + complex_t dz1 = (z.zeros.second - zPrev.zeros.second) * t; + double dg = (z.gain - zPrev.gain) * t; + + while (--numSamples >= 0) + { + zPrev.poles.first += dp0; + zPrev.poles.second += dp1; + zPrev.zeros.first += dz0; + zPrev.zeros.second += dz1; + zPrev.gain += dg; + + *dest++ = state.process(*dest, Biquad(zPrev)); + } + } + +public: + // Export these as public - *dest++ = state.process (*dest, sectionPrev); + void setOnePole(complex_t pole, complex_t zero) + { + BiquadBase::setOnePole(pole, zero); } - } - - // Process a block of samples, interpolating from the old section's pole/zeros - // to this section's pole/zeros, over numSamples. The interpolation is done - // in the z-plane using polar coordinates. - template <class StateType, typename Sample> - void smoothProcess2 (int numSamples, - Sample* dest, - StateType& state, - BiquadPoleState zPrev) const - { - BiquadPoleState z (*this); - double t = 1. / numSamples; - complex_t dp0 = (z.poles.first - zPrev.poles.first) * t; - complex_t dp1 = (z.poles.second - zPrev.poles.second) * t; - complex_t dz0 = (z.zeros.first - zPrev.zeros.first) * t; - complex_t dz1 = (z.zeros.second - zPrev.zeros.second) * t; - double dg = (z.gain - zPrev.gain) * t; - - while (--numSamples >= 0) + + void setTwoPole(complex_t pole1, complex_t zero1, + complex_t pole2, complex_t zero2) { - zPrev.poles.first += dp0; - zPrev.poles.second += dp1; - zPrev.zeros.first += dz0; - zPrev.zeros.second += dz1; - zPrev.gain += dg; + BiquadBase::setTwoPole(pole1, zero1, pole2, zero2); + } - *dest++ = state.process (*dest, Biquad (zPrev)); + void setPoleZeroPair(const PoleZeroPair& pair) + { + BiquadBase::setPoleZeroPair(pair); } - } -public: - // Export these as public - - void setOnePole (complex_t pole, complex_t zero) - { - BiquadBase::setOnePole (pole, zero); - } - - void setTwoPole (complex_t pole1, complex_t zero1, - complex_t pole2, complex_t zero2) - { - BiquadBase::setTwoPole (pole1, zero1, pole2, zero2); - } - - void setPoleZeroPair (const PoleZeroPair& pair) - { - BiquadBase::setPoleZeroPair (pair); - } - - void applyScale (double scale) - { - BiquadBase::applyScale (scale); - } + void applyScale(double scale) + { + BiquadBase::applyScale(scale); + } }; } diff --git a/Source/Dsp/Butterworth.cpp b/Source/Dsp/Butterworth.cpp index 26113a8b461f6597d277ffaea97bb6b4c377ecca..1260b8b4bf6d131dd6172955e58b006241d3a8ff 100644 --- a/Source/Dsp/Butterworth.cpp +++ b/Source/Dsp/Butterworth.cpp @@ -36,175 +36,177 @@ THE SOFTWARE. #include "Common.h" #include "Butterworth.h" -namespace Dsp { +namespace Dsp +{ -namespace Butterworth { +namespace Butterworth +{ -AnalogLowPass::AnalogLowPass () - : m_numPoles (-1) +AnalogLowPass::AnalogLowPass() + : m_numPoles(-1) { - setNormal (0, 1); + setNormal(0, 1); } -void AnalogLowPass::design (int numPoles) +void AnalogLowPass::design(int numPoles) { - if (m_numPoles != numPoles) - { - m_numPoles = numPoles; + if (m_numPoles != numPoles) + { + m_numPoles = numPoles; - reset (); + reset(); - const double n2 = 2 * numPoles; - const int pairs = numPoles / 2; - for (int i = 0; i < pairs; ++i) - { - complex_t c = std::polar (1., doublePi_2 + (2 * i + 1) * doublePi / n2); - addPoleZeroConjugatePairs (c, infinity()); - } + const double n2 = 2 * numPoles; + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + complex_t c = std::polar(1., doublePi_2 + (2 * i + 1) * doublePi / n2); + addPoleZeroConjugatePairs(c, infinity()); + } - if (numPoles & 1) - add (-1, infinity()); - } + if (numPoles & 1) + add(-1, infinity()); + } } //------------------------------------------------------------------------------ -AnalogLowShelf::AnalogLowShelf () - : m_numPoles (-1) +AnalogLowShelf::AnalogLowShelf() + : m_numPoles(-1) { - setNormal (doublePi, 1); + setNormal(doublePi, 1); } -void AnalogLowShelf::design (int numPoles, double gainDb) +void AnalogLowShelf::design(int numPoles, double gainDb) { - if (m_numPoles != numPoles || - m_gainDb != gainDb) - { - m_numPoles = numPoles; - m_gainDb = gainDb; + if (m_numPoles != numPoles || + m_gainDb != gainDb) + { + m_numPoles = numPoles; + m_gainDb = gainDb; - reset (); + reset(); - const double n2 = numPoles * 2; - const double g = pow (pow (10., gainDb/20), 1. / n2); - const double gp = -1. / g; - const double gz = -g; + const double n2 = numPoles * 2; + const double g = pow(pow(10., gainDb/20), 1. / n2); + const double gp = -1. / g; + const double gz = -g; - const int pairs = numPoles / 2; - for (int i = 1; i <= pairs; ++i) - { - const double theta = doublePi * (0.5 - (2 * i - 1) / n2); - addPoleZeroConjugatePairs (std::polar (gp, theta), std::polar (gz, theta)); + const int pairs = numPoles / 2; + for (int i = 1; i <= pairs; ++i) + { + const double theta = doublePi * (0.5 - (2 * i - 1) / n2); + addPoleZeroConjugatePairs(std::polar(gp, theta), std::polar(gz, theta)); + } + + if (numPoles & 1) + add(gp, gz); } - - if (numPoles & 1) - add (gp, gz); - } } //------------------------------------------------------------------------------ -void LowPassBase::setup (int order, - double sampleRate, - double cutoffFrequency) +void LowPassBase::setup(int order, + double sampleRate, + double cutoffFrequency) { - m_analogProto.design (order); + m_analogProto.design(order); - LowPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void HighPassBase::setup (int order, - double sampleRate, - double cutoffFrequency) +void HighPassBase::setup(int order, + double sampleRate, + double cutoffFrequency) { - m_analogProto.design (order); + m_analogProto.design(order); - HighPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandPassBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency) +void BandPassBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency) { - m_analogProto.design (order); + m_analogProto.design(order); - BandPassTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandStopBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency) +void BandStopBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency) { - m_analogProto.design (order); + m_analogProto.design(order); - BandStopTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandStopTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void LowShelfBase::setup (int order, +void LowShelfBase::setup(int order, double sampleRate, double cutoffFrequency, double gainDb) { - m_analogProto.design (order, gainDb); + m_analogProto.design(order, gainDb); - LowPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void HighShelfBase::setup (int order, - double sampleRate, - double cutoffFrequency, - double gainDb) +void HighShelfBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb) { - m_analogProto.design (order, gainDb); + m_analogProto.design(order, gainDb); - HighPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandShelfBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double gainDb) +void BandShelfBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double gainDb) { - m_analogProto.design (order, gainDb); + m_analogProto.design(order, gainDb); - BandPassTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - // HACK! - m_digitalProto.setNormal (((centerFrequency/sampleRate) < 0.25) ? doublePi : 0, 1); + // HACK! + m_digitalProto.setNormal(((centerFrequency/sampleRate) < 0.25) ? doublePi : 0, 1); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } } diff --git a/Source/Dsp/Butterworth.h b/Source/Dsp/Butterworth.h index da222eae1251df02c45db24c58a5470d75092ac7..bcc94c600c18f90735a5207e301a61bed691b0dc 100644 --- a/Source/Dsp/Butterworth.h +++ b/Source/Dsp/Butterworth.h @@ -42,26 +42,28 @@ THE SOFTWARE. #include "Filter.h" #include "PoleFilter.h" -namespace Dsp { +namespace Dsp +{ /* * Filters with Butterworth response characteristics * */ -namespace Butterworth { +namespace Butterworth +{ // Half-band analog prototypes (s-plane) class AnalogLowPass : public LayoutBase { public: - AnalogLowPass (); + AnalogLowPass(); - void design (const int numPoles); + void design(const int numPoles); private: - int m_numPoles; + int m_numPoles; }; //------------------------------------------------------------------------------ @@ -69,13 +71,13 @@ private: class AnalogLowShelf : public LayoutBase { public: - AnalogLowShelf (); + AnalogLowShelf(); - void design (int numPoles, double gainDb); + void design(int numPoles, double gainDb); private: - int m_numPoles; - double m_gainDb; + int m_numPoles; + double m_gainDb; }; //------------------------------------------------------------------------------ @@ -84,57 +86,57 @@ private: struct LowPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double cutoffFrequency); + void setup(int order, + double sampleRate, + double cutoffFrequency); }; struct HighPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double cutoffFrequency); + void setup(int order, + double sampleRate, + double cutoffFrequency); }; struct BandPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency); }; struct BandStopBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency); }; struct LowShelfBase : PoleFilterBase <AnalogLowShelf> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double gainDb); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb); }; struct HighShelfBase : PoleFilterBase <AnalogLowShelf> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double gainDb); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb); }; struct BandShelfBase : PoleFilterBase <AnalogLowShelf> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double gainDb); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double gainDb); }; //------------------------------------------------------------------------------ @@ -184,198 +186,241 @@ struct BandShelf : PoleFilter <BandShelfBase, MaxOrder, MaxOrder*2> // Gui-friendly Design layer // -namespace Design { +namespace Design +{ struct TypeIBase : DesignBase { - enum - { - NumParams = 3 - }; + enum + { + NumParams = 3 + }; - static int getNumParams () - { - return 3; - } + static int getNumParams() + { + return 3; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCutoffFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCutoffFrequencyParam(); + } }; template <class FilterClass> struct TypeI : TypeIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2]); + } }; struct TypeIIBase : DesignBase { - enum - { - NumParams = 4 - }; + enum + { + NumParams = 4 + }; - static int getNumParams () - { - return 4; - } + static int getNumParams() + { + return 4; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCenterFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCenterFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultBandwidthHzParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultBandwidthHzParam(); + } }; template <class FilterClass> struct TypeII : TypeIIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3]); + } }; struct TypeIIIBase : DesignBase { - enum - { - NumParams = 4 - }; + enum + { + NumParams = 4 + }; - static int getNumParams () - { - return 4; - } + static int getNumParams() + { + return 4; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCutoffFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCutoffFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultGainParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultGainParam(); + } }; template <class FilterClass> struct TypeIII : TypeIIIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), - params[0], - params[2], - params[3]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), + params[0], + params[2], + params[3]); + } }; struct TypeIVBase : DesignBase { - enum - { - NumParams = 5 - }; + enum + { + NumParams = 5 + }; - static int getNumParams () - { - return 5; - } + static int getNumParams() + { + return 5; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCenterFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCenterFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultBandwidthHzParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultBandwidthHzParam(); + } - static const ParamInfo getParamInfo_4 () - { - return ParamInfo::defaultGainParam (); - } + static const ParamInfo getParamInfo_4() + { + return ParamInfo::defaultGainParam(); + } }; template <class FilterClass> struct TypeIV : TypeIVBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3], params[4]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); + } }; // Factored kind and name struct LowPassDescription { - static Kind getKind () { return kindLowPass; } - static const char* getName() { return "Butterworth Low Pass"; } + static Kind getKind() + { + return kindLowPass; + } + static const char* getName() + { + return "Butterworth Low Pass"; + } }; struct HighPassDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Butterworth High Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Butterworth High Pass"; + } }; struct BandPassDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Butterworth Band Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Butterworth Band Pass"; + } }; struct BandStopDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Butterworth Band Stop"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Butterworth Band Stop"; + } }; struct LowShelfDescription { - static Kind getKind () { return kindLowShelf; } - static const char* getName() { return "Butterworth Low Shelf"; } + static Kind getKind() + { + return kindLowShelf; + } + static const char* getName() + { + return "Butterworth Low Shelf"; + } }; struct HighShelfDescription { - static Kind getKind () { return kindHighShelf; } - static const char* getName() { return "Butterworth High Shelf"; } + static Kind getKind() + { + return kindHighShelf; + } + static const char* getName() + { + return "Butterworth High Shelf"; + } }; struct BandShelfDescription { - static Kind getKind () { return kindBandShelf; } - static const char* getName() { return "Butterworth Band Shelf"; } + static Kind getKind() + { + return kindBandShelf; + } + static const char* getName() + { + return "Butterworth Band Shelf"; + } }; // This glues on the Order parameter template <int MaxOrder, - template <class> class TypeClass, - template <int> class FilterClass> + template <class> class TypeClass, + template <int> class FilterClass> struct OrderBase : TypeClass <FilterClass <MaxOrder> > { - const ParamInfo getParamInfo_1 () const - { - return ParamInfo (idOrder, "Order", "Order", - 1, MaxOrder, 2, - &ParamInfo::Int_toControlValue, - &ParamInfo::Int_toNativeValue, - &ParamInfo::Int_toString); + const ParamInfo getParamInfo_1() const + { + return ParamInfo(idOrder, "Order", "Order", + 1, MaxOrder, 2, + &ParamInfo::Int_toControlValue, + &ParamInfo::Int_toNativeValue, + &ParamInfo::Int_toString); - } + } }; //------------------------------------------------------------------------------ @@ -386,43 +431,43 @@ struct OrderBase : TypeClass <FilterClass <MaxOrder> > template <int MaxOrder> struct LowPass : OrderBase <MaxOrder, TypeI, Butterworth::LowPass>, - LowPassDescription + LowPassDescription { }; template <int MaxOrder> struct HighPass : OrderBase <MaxOrder, TypeI, Butterworth::HighPass>, - HighPassDescription + HighPassDescription { }; template <int MaxOrder> struct BandPass : OrderBase <MaxOrder, TypeII, Butterworth::BandPass>, - BandPassDescription + BandPassDescription { }; template <int MaxOrder> struct BandStop : OrderBase <MaxOrder, TypeII, Butterworth::BandStop>, - BandStopDescription + BandStopDescription { }; template <int MaxOrder> struct LowShelf : OrderBase <MaxOrder, TypeIII, Butterworth::LowShelf>, - LowShelfDescription + LowShelfDescription { }; template <int MaxOrder> struct HighShelf : OrderBase <MaxOrder, TypeIII, Butterworth::HighShelf>, - HighShelfDescription + HighShelfDescription { }; template <int MaxOrder> struct BandShelf : OrderBase <MaxOrder, TypeIV, Butterworth::BandShelf>, - BandShelfDescription + BandShelfDescription { }; diff --git a/Source/Dsp/Cascade.cpp b/Source/Dsp/Cascade.cpp index 1efa7ecc982eb9819524637296522989b6c3dc2a..4d4f31e12354dab05aa7d93a6c419d0f6ee4b8f2 100644 --- a/Source/Dsp/Cascade.cpp +++ b/Source/Dsp/Cascade.cpp @@ -36,82 +36,83 @@ THE SOFTWARE. #include "Common.h" #include "Cascade.h" -namespace Dsp { +namespace Dsp +{ -Cascade::Cascade () - : m_numStages (0) - , m_maxStages (0) - , m_stageArray (0) +Cascade::Cascade() + : m_numStages(0) + , m_maxStages(0) + , m_stageArray(0) { } -void Cascade::setCascadeStorage (const Storage& storage) +void Cascade::setCascadeStorage(const Storage& storage) { - m_numStages = 0; - m_maxStages = storage.maxStages; - m_stageArray = storage.stageArray; + m_numStages = 0; + m_maxStages = storage.maxStages; + m_stageArray = storage.stageArray; } -complex_t Cascade::response (double normalizedFrequency) const +complex_t Cascade::response(double normalizedFrequency) const { - double w = 2 * doublePi * normalizedFrequency; - const complex_t czn1 = std::polar (1., -w); - const complex_t czn2 = std::polar (1., -2 * w); - complex_t ch (1); - complex_t cbot (1); - - const Biquad* stage = m_stageArray; - for (int i = m_numStages; --i >=0; ++stage) - { - complex_t cb (1); - complex_t ct (stage->getB0()/stage->getA0()); - ct = addmul (ct, stage->getB1()/stage->getA0(), czn1); - ct = addmul (ct, stage->getB2()/stage->getA0(), czn2); - cb = addmul (cb, stage->getA1()/stage->getA0(), czn1); - cb = addmul (cb, stage->getA2()/stage->getA0(), czn2); - ch *= ct; - cbot *= cb; - } - - return ch / cbot; + double w = 2 * doublePi * normalizedFrequency; + const complex_t czn1 = std::polar(1., -w); + const complex_t czn2 = std::polar(1., -2 * w); + complex_t ch(1); + complex_t cbot(1); + + const Biquad* stage = m_stageArray; + for (int i = m_numStages; --i >=0; ++stage) + { + complex_t cb(1); + complex_t ct(stage->getB0()/stage->getA0()); + ct = addmul(ct, stage->getB1()/stage->getA0(), czn1); + ct = addmul(ct, stage->getB2()/stage->getA0(), czn2); + cb = addmul(cb, stage->getA1()/stage->getA0(), czn1); + cb = addmul(cb, stage->getA2()/stage->getA0(), czn2); + ch *= ct; + cbot *= cb; + } + + return ch / cbot; } -std::vector<PoleZeroPair> Cascade::getPoleZeros () const +std::vector<PoleZeroPair> Cascade::getPoleZeros() const { - std::vector<PoleZeroPair> vpz; - vpz.reserve (m_numStages); - - const Stage* stage = m_stageArray; - for (int i = m_numStages; --i >=0;) - { - BiquadPoleState bps (*stage++); - assert (!bps.isSinglePole() || i == 0); - vpz.push_back (bps); - } - - return vpz; + std::vector<PoleZeroPair> vpz; + vpz.reserve(m_numStages); + + const Stage* stage = m_stageArray; + for (int i = m_numStages; --i >=0;) + { + BiquadPoleState bps(*stage++); + assert(!bps.isSinglePole() || i == 0); + vpz.push_back(bps); + } + + return vpz; } -void Cascade::applyScale (double scale) +void Cascade::applyScale(double scale) { - // For higher order filters it might be helpful - // to spread this factor between all the stages. - assert (m_numStages > 0); - m_stageArray->applyScale (scale); + // For higher order filters it might be helpful + // to spread this factor between all the stages. + assert(m_numStages > 0); + m_stageArray->applyScale(scale); } -void Cascade::setLayout (const LayoutBase& proto) +void Cascade::setLayout(const LayoutBase& proto) { - const int numPoles = proto.getNumPoles(); - m_numStages = (numPoles + 1)/ 2; - assert (m_numStages <= m_maxStages); - - Biquad* stage = m_stageArray; - for (int i = 0; i < m_numStages; ++i, ++stage) - stage->setPoleZeroPair (proto[i]); - - applyScale (proto.getNormalGain() / - std::abs (response (proto.getNormalW() / (2 * doublePi)))); + const int numPoles = proto.getNumPoles(); + m_numStages = (numPoles + 1)/ 2; + assert(m_numStages <= m_maxStages); + + Biquad* stage = m_stageArray; + for (int i = 0; i < m_numStages; ++i, ++stage) + stage->setPoleZeroPair(proto[i]); + + applyScale(proto.getNormalGain() / + std::abs(response(proto.getNormalW() / (2 * doublePi)))); } } diff --git a/Source/Dsp/Cascade.h b/Source/Dsp/Cascade.h index 6e6cf9e8414a13f039eabc5a21ae13bd964b1909..4a47b08561d027be1b8bcf4474f5d9db4ce8a01d 100644 --- a/Source/Dsp/Cascade.h +++ b/Source/Dsp/Cascade.h @@ -42,7 +42,8 @@ THE SOFTWARE. #include "Layout.h" #include "MathSupplement.h" -namespace Dsp { +namespace Dsp +{ /* * Holds coefficients for a cascade of second order sections. @@ -53,91 +54,92 @@ namespace Dsp { class Cascade { public: - template <class StateType> - class StateBase : private DenormalPrevention - { - public: - template <typename Sample> - inline Sample process (const Sample in, const Cascade& c) + template <class StateType> + class StateBase : private DenormalPrevention { - double out = in; - StateType* state = m_stateArray; - Biquad const* stage = c.m_stageArray; - const double vsa = ac(); - int i = c.m_numStages - 1; - out = (state++)->process1 (out, *stage++, vsa); - for (; --i >= 0;) - out = (state++)->process1 (out, *stage++, 0); - //for (int i = c.m_numStages; --i >= 0; ++state, ++stage) - // out = state->process1 (out, *stage, vsa); - return static_cast<Sample> (out); - } - - protected: - StateBase (StateType* stateArray) - : m_stateArray (stateArray) + public: + template <typename Sample> + inline Sample process(const Sample in, const Cascade& c) + { + double out = in; + StateType* state = m_stateArray; + Biquad const* stage = c.m_stageArray; + const double vsa = ac(); + int i = c.m_numStages - 1; + out = (state++)->process1(out, *stage++, vsa); + for (; --i >= 0;) + out = (state++)->process1(out, *stage++, 0); + //for (int i = c.m_numStages; --i >= 0; ++state, ++stage) + // out = state->process1 (out, *stage, vsa); + return static_cast<Sample>(out); + } + + protected: + StateBase(StateType* stateArray) + : m_stateArray(stateArray) + { + } + + protected: + StateType* m_stateArray; + }; + + struct Stage : Biquad { - } + }; - protected: - StateType* m_stateArray; - }; + struct Storage + { + Storage(int maxStages_, Stage* stageArray_) + : maxStages(maxStages_) + , stageArray(stageArray_) + { + } - struct Stage : Biquad - { - }; + int maxStages; + Stage* stageArray; + }; - struct Storage - { - Storage (int maxStages_, Stage* stageArray_) - : maxStages (maxStages_) - , stageArray (stageArray_) + int getNumStages() const { + return m_numStages; } - int maxStages; - Stage* stageArray; - }; + const Stage& operator[](int index) + { + assert(index >= 0 && index <= m_numStages); + return m_stageArray[index]; + } - int getNumStages () const - { - return m_numStages; - } +public: + // Calculate filter response at the given normalized frequency. + complex_t response(double normalizedFrequency) const; - const Stage& operator[] (int index) - { - assert (index >= 0 && index <= m_numStages); - return m_stageArray[index]; - } + std::vector<PoleZeroPair> getPoleZeros() const; -public: - // Calculate filter response at the given normalized frequency. - complex_t response (double normalizedFrequency) const; - - std::vector<PoleZeroPair> getPoleZeros () const; - - // Process a block of samples in the given form - template <class StateType, typename Sample> - void process (int numSamples, Sample* dest, StateType& state) const - { - while (--numSamples >= 0) { - *dest = state.process (*dest, *this); - dest++; + // Process a block of samples in the given form + template <class StateType, typename Sample> + void process(int numSamples, Sample* dest, StateType& state) const + { + while (--numSamples >= 0) + { + *dest = state.process(*dest, *this); + dest++; + } } - } protected: - Cascade (); + Cascade(); - void setCascadeStorage (const Storage& storage); + void setCascadeStorage(const Storage& storage); - void applyScale (double scale); - void setLayout (const LayoutBase& proto); + void applyScale(double scale); + void setLayout(const LayoutBase& proto); private: - int m_numStages; - int m_maxStages; - Stage* m_stageArray; + int m_numStages; + int m_maxStages; + Stage* m_stageArray; }; //------------------------------------------------------------------------------ @@ -147,35 +149,35 @@ template <int MaxStages> class CascadeStages { public: - template <class StateType> - class State : public Cascade::StateBase <StateType> - { - public: - State() : Cascade::StateBase <StateType> (m_states) + template <class StateType> + class State : public Cascade::StateBase <StateType> { - Cascade::StateBase <StateType>::m_stateArray = m_states; - reset (); - } - - void reset () + public: + State() : Cascade::StateBase <StateType> (m_states) + { + Cascade::StateBase <StateType>::m_stateArray = m_states; + reset(); + } + + void reset() + { + StateType* state = m_states; + for (int i = MaxStages; --i >= 0; ++state) + state->reset(); + } + + private: + StateType m_states[MaxStages]; + }; + + /*@Internal*/ + Cascade::Storage getCascadeStorage() { - StateType* state = m_states; - for (int i = MaxStages; --i >= 0; ++state) - state->reset(); + return Cascade::Storage(MaxStages, m_stages); } - private: - StateType m_states[MaxStages]; - }; - - /*@Internal*/ - Cascade::Storage getCascadeStorage() - { - return Cascade::Storage (MaxStages, m_stages); - } - private: - Cascade::Stage m_stages[MaxStages]; + Cascade::Stage m_stages[MaxStages]; }; } diff --git a/Source/Dsp/ChebyshevI.cpp b/Source/Dsp/ChebyshevI.cpp index 06fb2b454f491181ab7941fb08aaf33fde505e11..303bfd68b8e465790c375eca31987bf9c5a21cfb 100644 --- a/Source/Dsp/ChebyshevI.cpp +++ b/Source/Dsp/ChebyshevI.cpp @@ -36,54 +36,56 @@ THE SOFTWARE. #include "Common.h" #include "ChebyshevI.h" -namespace Dsp { +namespace Dsp +{ -namespace ChebyshevI { +namespace ChebyshevI +{ -AnalogLowPass::AnalogLowPass () - : m_numPoles (-1) +AnalogLowPass::AnalogLowPass() + : m_numPoles(-1) { } -void AnalogLowPass::design (int numPoles, - double rippleDb) +void AnalogLowPass::design(int numPoles, + double rippleDb) { - if (m_numPoles != numPoles || - m_rippleDb != rippleDb) - { - m_numPoles = numPoles; - m_rippleDb = rippleDb; - - reset (); - - const double eps = std::sqrt (1. / std::exp (-rippleDb * 0.1 * doubleLn10) - 1); - const double v0 = asinh (1 / eps) / numPoles; - const double sinh_v0 = -sinh (v0); - const double cosh_v0 = cosh (v0); - - const double n2 = 2 * numPoles; - const int pairs = numPoles / 2; - for (int i = 0; i < pairs; ++i) - { - const int k = 2 * i + 1 - numPoles; - double a = sinh_v0 * cos (k * doublePi / n2); - double b = cosh_v0 * sin (k * doublePi / n2); - - //addPoleZero (complex_t (a, b), infinity()); - //addPoleZero (complex_t (a, -b), infinity()); - addPoleZeroConjugatePairs (complex_t (a, b), infinity()); - } - - if (numPoles & 1) + if (m_numPoles != numPoles || + m_rippleDb != rippleDb) { - add (complex_t (sinh_v0, 0), infinity()); - setNormal (0, 1); + m_numPoles = numPoles; + m_rippleDb = rippleDb; + + reset(); + + const double eps = std::sqrt(1. / std::exp(-rippleDb * 0.1 * doubleLn10) - 1); + const double v0 = asinh(1 / eps) / numPoles; + const double sinh_v0 = -sinh(v0); + const double cosh_v0 = cosh(v0); + + const double n2 = 2 * numPoles; + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + const int k = 2 * i + 1 - numPoles; + double a = sinh_v0 * cos(k * doublePi / n2); + double b = cosh_v0 * sin(k * doublePi / n2); + + //addPoleZero (complex_t (a, b), infinity()); + //addPoleZero (complex_t (a, -b), infinity()); + addPoleZeroConjugatePairs(complex_t (a, b), infinity()); + } + + if (numPoles & 1) + { + add(complex_t (sinh_v0, 0), infinity()); + setNormal(0, 1); + } + else + { + setNormal(0, pow(10, -rippleDb/20.)); + } } - else - { - setNormal (0, pow (10, -rippleDb/20.)); - } - } } //------------------------------------------------------------------------------ @@ -95,176 +97,176 @@ void AnalogLowPass::design (int numPoles, // http://www.ece.rutgers.edu/~orfanidi/ece521/hpeq.pdf // -AnalogLowShelf::AnalogLowShelf () +AnalogLowShelf::AnalogLowShelf() { - setNormal (doublePi, 1); + setNormal(doublePi, 1); } -void AnalogLowShelf::design (int numPoles, - double gainDb, - double rippleDb) +void AnalogLowShelf::design(int numPoles, + double gainDb, + double rippleDb) { - if (m_numPoles != numPoles || - m_rippleDb != rippleDb || - m_gainDb != gainDb) - { - m_numPoles = numPoles; - m_rippleDb = rippleDb; - m_gainDb = gainDb; - - reset (); - - gainDb = -gainDb; - - if (rippleDb >= abs(gainDb)) - rippleDb = abs (gainDb); - if (gainDb<0) - rippleDb = -rippleDb; - - const double G = std::pow (10., gainDb / 20.0 ); - const double Gb = std::pow (10., (gainDb - rippleDb) / 20.0); - const double G0 = 1; - const double g0 = pow (G0 , 1. / numPoles); - - double eps; - if (Gb != G0 ) - eps = sqrt((G*G-Gb*Gb)/(Gb*Gb-G0*G0)); - else - eps = G-1; // This is surely wrong - - const double b = pow (G/eps+Gb*sqrt(1+1/(eps*eps)), 1./numPoles); - const double u = log (b / g0); - const double v = log (pow (1. / eps+sqrt(1+1/(eps*eps)),1./numPoles)); - - const double sinh_u = sinh (u); - const double sinh_v = sinh (v); - const double cosh_u = cosh (u); - const double cosh_v = cosh (v); - const double n2 = 2 * numPoles; - const int pairs = numPoles / 2; - for (int i = 1; i <= pairs; ++i) + if (m_numPoles != numPoles || + m_rippleDb != rippleDb || + m_gainDb != gainDb) { - const double a = doublePi * (2 * i - 1) / n2; - const double sn = sin (a); - const double cs = cos (a); - addPoleZeroConjugatePairs (complex_t (-sn * sinh_u, cs * cosh_u), - complex_t (-sn * sinh_v, cs * cosh_v)); + m_numPoles = numPoles; + m_rippleDb = rippleDb; + m_gainDb = gainDb; + + reset(); + + gainDb = -gainDb; + + if (rippleDb >= abs(gainDb)) + rippleDb = abs(gainDb); + if (gainDb<0) + rippleDb = -rippleDb; + + const double G = std::pow(10., gainDb / 20.0); + const double Gb = std::pow(10., (gainDb - rippleDb) / 20.0); + const double G0 = 1; + const double g0 = pow(G0 , 1. / numPoles); + + double eps; + if (Gb != G0) + eps = sqrt((G*G-Gb*Gb)/(Gb*Gb-G0*G0)); + else + eps = G-1; // This is surely wrong + + const double b = pow(G/eps+Gb*sqrt(1+1/(eps*eps)), 1./numPoles); + const double u = log(b / g0); + const double v = log(pow(1. / eps+sqrt(1+1/(eps*eps)),1./numPoles)); + + const double sinh_u = sinh(u); + const double sinh_v = sinh(v); + const double cosh_u = cosh(u); + const double cosh_v = cosh(v); + const double n2 = 2 * numPoles; + const int pairs = numPoles / 2; + for (int i = 1; i <= pairs; ++i) + { + const double a = doublePi * (2 * i - 1) / n2; + const double sn = sin(a); + const double cs = cos(a); + addPoleZeroConjugatePairs(complex_t (-sn * sinh_u, cs * cosh_u), + complex_t (-sn * sinh_v, cs * cosh_v)); + } + + if (numPoles & 1) + add(-sinh_u, -sinh_v); } - - if (numPoles & 1) - add (-sinh_u, -sinh_v); - } } //------------------------------------------------------------------------------ -void LowPassBase::setup (int order, +void LowPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double rippleDb) +{ + m_analogProto.design(order, rippleDb); + + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + Cascade::setLayout(m_digitalProto); +} + +void HighPassBase::setup(int order, double sampleRate, double cutoffFrequency, double rippleDb) { - m_analogProto.design (order, rippleDb); + m_analogProto.design(order, rippleDb); - LowPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void HighPassBase::setup (int order, - double sampleRate, - double cutoffFrequency, - double rippleDb) +void BandPassBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double rippleDb) { - m_analogProto.design (order, rippleDb); + m_analogProto.design(order, rippleDb); - HighPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandPassBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double rippleDb) +void BandStopBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double rippleDb) { - m_analogProto.design (order, rippleDb); + m_analogProto.design(order, rippleDb); - BandPassTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandStopTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandStopBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double rippleDb) +void LowShelfBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb, + double rippleDb) { - m_analogProto.design (order, rippleDb); + m_analogProto.design(order, gainDb, rippleDb); - BandStopTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, + LowPassTransform(cutoffFrequency / sampleRate, m_digitalProto, m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void LowShelfBase::setup (int order, +void HighShelfBase::setup(int order, double sampleRate, double cutoffFrequency, double gainDb, double rippleDb) { - m_analogProto.design (order, gainDb, rippleDb); - - LowPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); - - Cascade::setLayout (m_digitalProto); -} - -void HighShelfBase::setup (int order, - double sampleRate, - double cutoffFrequency, - double gainDb, - double rippleDb) -{ - m_analogProto.design (order, gainDb, rippleDb); + m_analogProto.design(order, gainDb, rippleDb); - HighPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandShelfBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double gainDb, - double rippleDb) +void BandShelfBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double gainDb, + double rippleDb) { - m_analogProto.design (order, gainDb, rippleDb); + m_analogProto.design(order, gainDb, rippleDb); - BandPassTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - m_digitalProto.setNormal (((centerFrequency/sampleRate) < 0.25) ? doublePi : 0, 1); + m_digitalProto.setNormal(((centerFrequency/sampleRate) < 0.25) ? doublePi : 0, 1); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } } diff --git a/Source/Dsp/ChebyshevI.h b/Source/Dsp/ChebyshevI.h index 791105ca21bfa21da06b697e025be933cea8e80e..67b5b14790717d24588ac059321bd99af0217d05 100644 --- a/Source/Dsp/ChebyshevI.h +++ b/Source/Dsp/ChebyshevI.h @@ -42,28 +42,30 @@ THE SOFTWARE. #include "Filter.h" #include "PoleFilter.h" -namespace Dsp { +namespace Dsp +{ /* * Filters with Chebyshev response characteristics * */ -namespace ChebyshevI { +namespace ChebyshevI +{ // Half-band analog prototypes (s-plane) class AnalogLowPass : public LayoutBase { public: - AnalogLowPass (); + AnalogLowPass(); - void design (const int numPoles, - double rippleDb); + void design(const int numPoles, + double rippleDb); private: - int m_numPoles; - double m_rippleDb; + int m_numPoles; + double m_rippleDb; }; //------------------------------------------------------------------------------ @@ -71,16 +73,16 @@ private: class AnalogLowShelf : public LayoutBase { public: - AnalogLowShelf (); + AnalogLowShelf(); - void design (int numPoles, - double gainDb, - double rippleDb); + void design(int numPoles, + double gainDb, + double rippleDb); private: - int m_numPoles; - double m_rippleDb; - double m_gainDb; + int m_numPoles; + double m_rippleDb; + double m_gainDb; }; //------------------------------------------------------------------------------ @@ -89,64 +91,64 @@ private: struct LowPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double rippleDb); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double rippleDb); }; struct HighPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double rippleDb); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double rippleDb); }; struct BandPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double rippleDb); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double rippleDb); }; struct BandStopBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double rippleDb); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double rippleDb); }; struct LowShelfBase : PoleFilterBase <AnalogLowShelf> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double gainDb, - double rippleDb); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb, + double rippleDb); }; struct HighShelfBase : PoleFilterBase <AnalogLowShelf> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double gainDb, - double rippleDb); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb, + double rippleDb); }; struct BandShelfBase : PoleFilterBase <AnalogLowShelf> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double gainDb, - double rippleDb); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double gainDb, + double rippleDb); }; //------------------------------------------------------------------------------ @@ -196,215 +198,258 @@ struct BandShelf : PoleFilter <BandShelfBase, MaxOrder, MaxOrder*2> // Gui-friendly Design layer // -namespace Design { +namespace Design +{ struct TypeIBase : DesignBase { - enum - { - NumParams = 4 - }; + enum + { + NumParams = 4 + }; - static int getNumParams () - { - return 4; - } + static int getNumParams() + { + return 4; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCutoffFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCutoffFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultRippleDbParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultRippleDbParam(); + } }; template <class FilterClass> struct TypeI : TypeIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3]); + } }; struct TypeIIBase : DesignBase { - enum - { - NumParams = 5 - }; + enum + { + NumParams = 5 + }; - static int getNumParams () - { - return 5; - } + static int getNumParams() + { + return 5; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCenterFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCenterFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultBandwidthHzParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultBandwidthHzParam(); + } - static const ParamInfo getParamInfo_4 () - { - return ParamInfo::defaultRippleDbParam (); - } + static const ParamInfo getParamInfo_4() + { + return ParamInfo::defaultRippleDbParam(); + } }; template <class FilterClass> struct TypeII : TypeIIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3], params[4]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); + } }; struct TypeIIIBase : DesignBase { - enum - { - NumParams = 5 - }; + enum + { + NumParams = 5 + }; - static int getNumParams () - { - return 5; - } + static int getNumParams() + { + return 5; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCutoffFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCutoffFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultGainParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultGainParam(); + } - static const ParamInfo getParamInfo_4 () - { - return ParamInfo::defaultRippleDbParam (); - } + static const ParamInfo getParamInfo_4() + { + return ParamInfo::defaultRippleDbParam(); + } }; template <class FilterClass> struct TypeIII : TypeIIIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3], params[4]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); + } }; struct TypeIVBase : DesignBase { - enum - { - NumParams = 6 - }; + enum + { + NumParams = 6 + }; - static int getNumParams () - { - return 6; - } + static int getNumParams() + { + return 6; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCenterFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCenterFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultBandwidthHzParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultBandwidthHzParam(); + } - static const ParamInfo getParamInfo_4 () - { - return ParamInfo::defaultGainParam (); - } + static const ParamInfo getParamInfo_4() + { + return ParamInfo::defaultGainParam(); + } - static const ParamInfo getParamInfo_5 () - { - return ParamInfo::defaultRippleDbParam (); - } + static const ParamInfo getParamInfo_5() + { + return ParamInfo::defaultRippleDbParam(); + } }; template <class FilterClass> struct TypeIV : TypeIVBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3], params[4], params[5]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4], params[5]); + } }; // Factored kind and name struct LowPassDescription { - static Kind getKind () { return kindLowPass; } - static const char* getName() { return "Chebyshev I Low Pass"; } + static Kind getKind() + { + return kindLowPass; + } + static const char* getName() + { + return "Chebyshev I Low Pass"; + } }; struct HighPassDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Chebyshev I High Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Chebyshev I High Pass"; + } }; struct BandPassDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Chebyshev I Band Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Chebyshev I Band Pass"; + } }; struct BandStopDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Chebyshev I Band Stop"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Chebyshev I Band Stop"; + } }; struct LowShelfDescription { - static Kind getKind () { return kindLowShelf; } - static const char* getName() { return "Chebyshev I Low Shelf"; } + static Kind getKind() + { + return kindLowShelf; + } + static const char* getName() + { + return "Chebyshev I Low Shelf"; + } }; struct HighShelfDescription { - static Kind getKind () { return kindHighShelf; } - static const char* getName() { return "Chebyshev I High Shelf"; } + static Kind getKind() + { + return kindHighShelf; + } + static const char* getName() + { + return "Chebyshev I High Shelf"; + } }; struct BandShelfDescription { - static Kind getKind () { return kindBandShelf; } - static const char* getName() { return "Chebyshev I Band Shelf"; } + static Kind getKind() + { + return kindBandShelf; + } + static const char* getName() + { + return "Chebyshev I Band Shelf"; + } }; // This glues on the Order parameter template <int MaxOrder, - template <class> class TypeClass, - template <int> class FilterClass> + template <class> class TypeClass, + template <int> class FilterClass> struct OrderBase : TypeClass <FilterClass <MaxOrder> > { - const ParamInfo getParamInfo_1 () const - { - return ParamInfo (idOrder, "Order", "Order", - 1, MaxOrder, 2, - &ParamInfo::Int_toControlValue, - &ParamInfo::Int_toNativeValue, - &ParamInfo::Int_toString); + const ParamInfo getParamInfo_1() const + { + return ParamInfo(idOrder, "Order", "Order", + 1, MaxOrder, 2, + &ParamInfo::Int_toControlValue, + &ParamInfo::Int_toNativeValue, + &ParamInfo::Int_toString); - } + } }; //------------------------------------------------------------------------------ @@ -415,43 +460,43 @@ struct OrderBase : TypeClass <FilterClass <MaxOrder> > template <int MaxOrder> struct LowPass : OrderBase <MaxOrder, TypeI, ChebyshevI::LowPass>, - LowPassDescription + LowPassDescription { }; template <int MaxOrder> struct HighPass : OrderBase <MaxOrder, TypeI, ChebyshevI::HighPass>, - HighPassDescription + HighPassDescription { }; template <int MaxOrder> struct BandPass : OrderBase <MaxOrder, TypeII, ChebyshevI::BandPass>, - BandPassDescription + BandPassDescription { }; template <int MaxOrder> struct BandStop : OrderBase <MaxOrder, TypeII, ChebyshevI::BandStop>, - BandStopDescription + BandStopDescription { }; template <int MaxOrder> struct LowShelf : OrderBase <MaxOrder, TypeIII, ChebyshevI::LowShelf>, - LowShelfDescription + LowShelfDescription { }; template <int MaxOrder> struct HighShelf : OrderBase <MaxOrder, TypeIII, ChebyshevI::HighShelf>, - HighShelfDescription + HighShelfDescription { }; template <int MaxOrder> struct BandShelf : OrderBase <MaxOrder, TypeIV, ChebyshevI::BandShelf>, - BandShelfDescription + BandShelfDescription { }; diff --git a/Source/Dsp/ChebyshevII.cpp b/Source/Dsp/ChebyshevII.cpp index fc482ccd80f6f2bf91a8e6a643c8b2ecbe09e0e9..a6e0d5953da0045242fc3d753a35463646f69ff5 100644 --- a/Source/Dsp/ChebyshevII.cpp +++ b/Source/Dsp/ChebyshevII.cpp @@ -36,52 +36,54 @@ THE SOFTWARE. #include "Common.h" #include "ChebyshevII.h" -namespace Dsp { +namespace Dsp +{ -namespace ChebyshevII { +namespace ChebyshevII +{ // "Chebyshev Filter Properties" // http://cnx.org/content/m16906/latest/ -AnalogLowPass::AnalogLowPass () - : m_numPoles (-1) +AnalogLowPass::AnalogLowPass() + : m_numPoles(-1) { - setNormal (0, 1); + setNormal(0, 1); } -void AnalogLowPass::design (int numPoles, - double stopBandDb) +void AnalogLowPass::design(int numPoles, + double stopBandDb) { - if (m_numPoles != numPoles || - m_stopBandDb != stopBandDb) - { - m_numPoles = numPoles; - m_stopBandDb = stopBandDb; - - reset (); - - const double eps = std::sqrt (1. / (std::exp (stopBandDb * 0.1 * doubleLn10) - 1)); - const double v0 = asinh (1 / eps) / numPoles; - const double sinh_v0 = -sinh (v0); - const double cosh_v0 = cosh (v0); - const double fn = doublePi / (2 * numPoles); - - int k = 1; - for (int i = numPoles / 2; --i >= 0; k+=2) - { - const double a = sinh_v0 * cos ((k - numPoles) * fn); - const double b = cosh_v0 * sin ((k - numPoles) * fn); - const double d2 = a * a + b * b; - const double im = 1 / cos (k * fn); - addPoleZeroConjugatePairs (complex_t (a / d2, b / d2), - complex_t (0, im)); - } - - if (numPoles & 1) + if (m_numPoles != numPoles || + m_stopBandDb != stopBandDb) { - add (1 / sinh_v0, infinity()); + m_numPoles = numPoles; + m_stopBandDb = stopBandDb; + + reset(); + + const double eps = std::sqrt(1. / (std::exp(stopBandDb * 0.1 * doubleLn10) - 1)); + const double v0 = asinh(1 / eps) / numPoles; + const double sinh_v0 = -sinh(v0); + const double cosh_v0 = cosh(v0); + const double fn = doublePi / (2 * numPoles); + + int k = 1; + for (int i = numPoles / 2; --i >= 0; k+=2) + { + const double a = sinh_v0 * cos((k - numPoles) * fn); + const double b = cosh_v0 * sin((k - numPoles) * fn); + const double d2 = a * a + b * b; + const double im = 1 / cos(k * fn); + addPoleZeroConjugatePairs(complex_t (a / d2, b / d2), + complex_t (0, im)); + } + + if (numPoles & 1) + { + add(1 / sinh_v0, infinity()); + } } - } } //------------------------------------------------------------------------------ @@ -93,177 +95,177 @@ void AnalogLowPass::design (int numPoles, // http://www.ece.rutgers.edu/~orfanidi/ece521/hpeq.pdf // -AnalogLowShelf::AnalogLowShelf () - : m_numPoles (-1) +AnalogLowShelf::AnalogLowShelf() + : m_numPoles(-1) { - setNormal (doublePi, 1); + setNormal(doublePi, 1); } -void AnalogLowShelf::design (int numPoles, - double gainDb, - double stopBandDb) +void AnalogLowShelf::design(int numPoles, + double gainDb, + double stopBandDb) { - if (m_numPoles != numPoles || - m_stopBandDb != stopBandDb || - m_gainDb != gainDb) - { - m_numPoles = numPoles; - m_stopBandDb = stopBandDb; - m_gainDb = gainDb; - - reset (); - - gainDb = -gainDb; - - if (stopBandDb >= abs(gainDb)) - stopBandDb = abs (gainDb); - if (gainDb<0) - stopBandDb = -stopBandDb; - - const double G = std::pow (10., gainDb / 20.0 ); - const double Gb = std::pow (10., (gainDb - stopBandDb) / 20.0); - const double G0 = 1; - const double g0 = pow (G0 , 1. / numPoles); - - double eps; - if (Gb != G0 ) - eps = sqrt((G*G-Gb*Gb)/(Gb*Gb-G0*G0)); - else - eps = G-1; // This is surely wrong - - const double b = pow (G/eps+Gb*sqrt(1+1/(eps*eps)), 1./numPoles); - const double u = log (b / g0); - const double v = log (pow (1. / eps+sqrt(1+1/(eps*eps)),1./numPoles)); - - const double sinh_u = sinh (u); - const double sinh_v = sinh (v); - const double cosh_u = cosh (u); - const double cosh_v = cosh (v); - const double n2 = 2 * numPoles; - const int pairs = numPoles / 2; - for (int i = 1; i <= pairs; ++i) + if (m_numPoles != numPoles || + m_stopBandDb != stopBandDb || + m_gainDb != gainDb) { - const double a = doublePi * (2 * i - 1) / n2; - const double sn = sin (a); - const double cs = cos (a); - addPoleZeroConjugatePairs (complex_t (-sn * sinh_u, cs * cosh_u), - complex_t (-sn * sinh_v, cs * cosh_v)); + m_numPoles = numPoles; + m_stopBandDb = stopBandDb; + m_gainDb = gainDb; + + reset(); + + gainDb = -gainDb; + + if (stopBandDb >= abs(gainDb)) + stopBandDb = abs(gainDb); + if (gainDb<0) + stopBandDb = -stopBandDb; + + const double G = std::pow(10., gainDb / 20.0); + const double Gb = std::pow(10., (gainDb - stopBandDb) / 20.0); + const double G0 = 1; + const double g0 = pow(G0 , 1. / numPoles); + + double eps; + if (Gb != G0) + eps = sqrt((G*G-Gb*Gb)/(Gb*Gb-G0*G0)); + else + eps = G-1; // This is surely wrong + + const double b = pow(G/eps+Gb*sqrt(1+1/(eps*eps)), 1./numPoles); + const double u = log(b / g0); + const double v = log(pow(1. / eps+sqrt(1+1/(eps*eps)),1./numPoles)); + + const double sinh_u = sinh(u); + const double sinh_v = sinh(v); + const double cosh_u = cosh(u); + const double cosh_v = cosh(v); + const double n2 = 2 * numPoles; + const int pairs = numPoles / 2; + for (int i = 1; i <= pairs; ++i) + { + const double a = doublePi * (2 * i - 1) / n2; + const double sn = sin(a); + const double cs = cos(a); + addPoleZeroConjugatePairs(complex_t (-sn * sinh_u, cs * cosh_u), + complex_t (-sn * sinh_v, cs * cosh_v)); + } + + if (numPoles & 1) + add(-sinh_u, -sinh_v); } - - if (numPoles & 1) - add (-sinh_u, -sinh_v); - } } //------------------------------------------------------------------------------ -void LowPassBase::setup (int order, +void LowPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double stopBandDb) +{ + m_analogProto.design(order, stopBandDb); + + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + Cascade::setLayout(m_digitalProto); +} + +void HighPassBase::setup(int order, double sampleRate, double cutoffFrequency, double stopBandDb) { - m_analogProto.design (order, stopBandDb); + m_analogProto.design(order, stopBandDb); - LowPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void HighPassBase::setup (int order, - double sampleRate, - double cutoffFrequency, - double stopBandDb) +void BandPassBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double stopBandDb) { - m_analogProto.design (order, stopBandDb); + m_analogProto.design(order, stopBandDb); - HighPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandPassBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double stopBandDb) +void BandStopBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double stopBandDb) { - m_analogProto.design (order, stopBandDb); + m_analogProto.design(order, stopBandDb); - BandPassTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandStopTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandStopBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double stopBandDb) +void LowShelfBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb, + double stopBandDb) { - m_analogProto.design (order, stopBandDb); + m_analogProto.design(order, gainDb, stopBandDb); - BandStopTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, + LowPassTransform(cutoffFrequency / sampleRate, m_digitalProto, m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void LowShelfBase::setup (int order, +void HighShelfBase::setup(int order, double sampleRate, double cutoffFrequency, double gainDb, double stopBandDb) { - m_analogProto.design (order, gainDb, stopBandDb); + m_analogProto.design(order, gainDb, stopBandDb); - LowPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void HighShelfBase::setup (int order, - double sampleRate, - double cutoffFrequency, - double gainDb, - double stopBandDb) -{ - m_analogProto.design (order, gainDb, stopBandDb); - - HighPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); - - Cascade::setLayout (m_digitalProto); -} - -void BandShelfBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double gainDb, - double stopBandDb) +void BandShelfBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double gainDb, + double stopBandDb) { - m_analogProto.design (order, gainDb, stopBandDb); + m_analogProto.design(order, gainDb, stopBandDb); - BandPassTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - m_digitalProto.setNormal (((centerFrequency/sampleRate) < 0.25) ? doublePi : 0, 1); + m_digitalProto.setNormal(((centerFrequency/sampleRate) < 0.25) ? doublePi : 0, 1); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } } diff --git a/Source/Dsp/ChebyshevII.h b/Source/Dsp/ChebyshevII.h index 62fbcba86a2931d3da8c9f026a7ab120733b90c4..3b8e7446a27620ba2469da77e74eed59fbf9c5f2 100644 --- a/Source/Dsp/ChebyshevII.h +++ b/Source/Dsp/ChebyshevII.h @@ -42,28 +42,30 @@ THE SOFTWARE. #include "Filter.h" #include "PoleFilter.h" -namespace Dsp { +namespace Dsp +{ /* * Filters with Inverse Chebyshev response characteristics * */ -namespace ChebyshevII { +namespace ChebyshevII +{ // Half-band analog prototypes (s-plane) class AnalogLowPass : public LayoutBase { public: - AnalogLowPass (); + AnalogLowPass(); - void design (const int numPoles, - double stopBandDb); + void design(const int numPoles, + double stopBandDb); private: - int m_numPoles; - double m_stopBandDb; + int m_numPoles; + double m_stopBandDb; }; //------------------------------------------------------------------------------ @@ -71,16 +73,16 @@ private: class AnalogLowShelf : public LayoutBase { public: - AnalogLowShelf (); + AnalogLowShelf(); - void design (int numPoles, - double gainDb, - double stopBandDb); + void design(int numPoles, + double gainDb, + double stopBandDb); private: - int m_numPoles; - double m_stopBandDb; - double m_gainDb; + int m_numPoles; + double m_stopBandDb; + double m_gainDb; }; //------------------------------------------------------------------------------ @@ -89,64 +91,64 @@ private: struct LowPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double stopBandDb); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double stopBandDb); }; struct HighPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double stopBandDb); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double stopBandDb); }; struct BandPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double stopBandDb); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double stopBandDb); }; struct BandStopBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double stopBandDb); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double stopBandDb); }; struct LowShelfBase : PoleFilterBase <AnalogLowShelf> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double gainDb, - double stopBandDb); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb, + double stopBandDb); }; struct HighShelfBase : PoleFilterBase <AnalogLowShelf> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double gainDb, - double stopBandDb); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb, + double stopBandDb); }; struct BandShelfBase : PoleFilterBase <AnalogLowShelf> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double gainDb, - double stopBandDb); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double gainDb, + double stopBandDb); }; //------------------------------------------------------------------------------ @@ -196,215 +198,258 @@ struct BandShelf : PoleFilter <BandShelfBase, MaxOrder, MaxOrder*2> // Gui-friendly Design layer // -namespace Design { +namespace Design +{ struct TypeIBase : DesignBase { - enum - { - NumParams = 4 - }; + enum + { + NumParams = 4 + }; - static int getNumParams () - { - return 4; - } + static int getNumParams() + { + return 4; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCutoffFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCutoffFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultStopDbParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultStopDbParam(); + } }; template <class FilterClass> struct TypeI : TypeIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3]); + } }; struct TypeIIBase : DesignBase { - enum - { - NumParams = 5 - }; + enum + { + NumParams = 5 + }; - static int getNumParams () - { - return 5; - } + static int getNumParams() + { + return 5; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCenterFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCenterFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultBandwidthHzParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultBandwidthHzParam(); + } - static const ParamInfo getParamInfo_4 () - { - return ParamInfo::defaultStopDbParam (); - } + static const ParamInfo getParamInfo_4() + { + return ParamInfo::defaultStopDbParam(); + } }; template <class FilterClass> struct TypeII : TypeIIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3], params[4]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); + } }; struct TypeIIIBase : DesignBase { - enum - { - NumParams = 5 - }; + enum + { + NumParams = 5 + }; - static int getNumParams () - { - return 5; - } + static int getNumParams() + { + return 5; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCutoffFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCutoffFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultGainParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultGainParam(); + } - static const ParamInfo getParamInfo_4 () - { - return ParamInfo::defaultStopDbParam (); - } + static const ParamInfo getParamInfo_4() + { + return ParamInfo::defaultStopDbParam(); + } }; template <class FilterClass> struct TypeIII : TypeIIIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3], params[4]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); + } }; struct TypeIVBase : DesignBase { - enum - { - NumParams = 6 - }; + enum + { + NumParams = 6 + }; - static int getNumParams () - { - return 6; - } + static int getNumParams() + { + return 6; + } - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCenterFrequencyParam (); - } + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCenterFrequencyParam(); + } - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultBandwidthHzParam (); - } + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultBandwidthHzParam(); + } - static const ParamInfo getParamInfo_4 () - { - return ParamInfo::defaultGainParam (); - } + static const ParamInfo getParamInfo_4() + { + return ParamInfo::defaultGainParam(); + } - static const ParamInfo getParamInfo_5 () - { - return ParamInfo::defaultStopDbParam (); - } + static const ParamInfo getParamInfo_5() + { + return ParamInfo::defaultStopDbParam(); + } }; template <class FilterClass> struct TypeIV : TypeIVBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3], params[4], params[5]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4], params[5]); + } }; // Factored kind and name struct LowPassDescription { - static Kind getKind () { return kindLowPass; } - static const char* getName() { return "Chebyshev II Low Pass"; } + static Kind getKind() + { + return kindLowPass; + } + static const char* getName() + { + return "Chebyshev II Low Pass"; + } }; struct HighPassDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Chebyshev II High Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Chebyshev II High Pass"; + } }; struct BandPassDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Chebyshev II Band Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Chebyshev II Band Pass"; + } }; struct BandStopDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Chebyshev II Band Stop"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Chebyshev II Band Stop"; + } }; struct LowShelfDescription { - static Kind getKind () { return kindLowShelf; } - static const char* getName() { return "Chebyshev II Low Shelf"; } + static Kind getKind() + { + return kindLowShelf; + } + static const char* getName() + { + return "Chebyshev II Low Shelf"; + } }; struct HighShelfDescription { - static Kind getKind () { return kindHighShelf; } - static const char* getName() { return "Chebyshev II High Shelf"; } + static Kind getKind() + { + return kindHighShelf; + } + static const char* getName() + { + return "Chebyshev II High Shelf"; + } }; struct BandShelfDescription { - static Kind getKind () { return kindBandShelf; } - static const char* getName() { return "Chebyshev II Band Shelf"; } + static Kind getKind() + { + return kindBandShelf; + } + static const char* getName() + { + return "Chebyshev II Band Shelf"; + } }; // This glues on the Order parameter template <int MaxOrder, - template <class> class TypeClass, - template <int> class FilterClass> + template <class> class TypeClass, + template <int> class FilterClass> struct OrderBase : TypeClass <FilterClass <MaxOrder> > { - const ParamInfo getParamInfo_1 () const - { - return ParamInfo (idOrder, "Order", "Order", - 1, MaxOrder, 2, - &ParamInfo::Int_toControlValue, - &ParamInfo::Int_toNativeValue, - &ParamInfo::Int_toString); + const ParamInfo getParamInfo_1() const + { + return ParamInfo(idOrder, "Order", "Order", + 1, MaxOrder, 2, + &ParamInfo::Int_toControlValue, + &ParamInfo::Int_toNativeValue, + &ParamInfo::Int_toString); - } + } }; //------------------------------------------------------------------------------ @@ -415,43 +460,43 @@ struct OrderBase : TypeClass <FilterClass <MaxOrder> > template <int MaxOrder> struct LowPass : OrderBase <MaxOrder, TypeI, ChebyshevII::LowPass>, - LowPassDescription + LowPassDescription { }; template <int MaxOrder> struct HighPass : OrderBase <MaxOrder, TypeI, ChebyshevII::HighPass>, - HighPassDescription + HighPassDescription { }; template <int MaxOrder> struct BandPass : OrderBase <MaxOrder, TypeII, ChebyshevII::BandPass>, - BandPassDescription + BandPassDescription { }; template <int MaxOrder> struct BandStop : OrderBase <MaxOrder, TypeII, ChebyshevII::BandStop>, - BandStopDescription + BandStopDescription { }; template <int MaxOrder> struct LowShelf : OrderBase <MaxOrder, TypeIII, ChebyshevII::LowShelf>, - LowShelfDescription + LowShelfDescription { }; template <int MaxOrder> struct HighShelf : OrderBase <MaxOrder, TypeIII, ChebyshevII::HighShelf>, - HighShelfDescription + HighShelfDescription { }; template <int MaxOrder> struct BandShelf : OrderBase <MaxOrder, TypeIV, ChebyshevII::BandShelf>, - BandShelfDescription + BandShelfDescription { }; diff --git a/Source/Dsp/Custom.cpp b/Source/Dsp/Custom.cpp index f3139e5dd8661a87f6879d09a58d5847383c16c3..26dfb3199133c574150702a4f9a61f768cadffa9 100644 --- a/Source/Dsp/Custom.cpp +++ b/Source/Dsp/Custom.cpp @@ -36,29 +36,31 @@ THE SOFTWARE. #include "Common.h" #include "Custom.h" -namespace Dsp { +namespace Dsp +{ -namespace Custom { +namespace Custom +{ -void OnePole::setup (double scale, - double pole, - double zero) +void OnePole::setup(double scale, + double pole, + double zero) { - setOnePole (pole, zero); - applyScale (scale); + setOnePole(pole, zero); + applyScale(scale); } -void TwoPole::setup (double scale, - double poleRho, - double poleTheta, - double zeroRho, - double zeroTheta) +void TwoPole::setup(double scale, + double poleRho, + double poleTheta, + double zeroRho, + double zeroTheta) { - complex_t pole = std::polar (poleRho, poleTheta); - complex_t zero = std::polar (zeroRho, zeroTheta); + complex_t pole = std::polar(poleRho, poleTheta); + complex_t zero = std::polar(zeroRho, zeroTheta); - setTwoPole (pole, zero, std::conj(pole), std::conj(zero)); - applyScale (scale); + setTwoPole(pole, zero, std::conj(pole), std::conj(zero)); + applyScale(scale); } } diff --git a/Source/Dsp/Custom.h b/Source/Dsp/Custom.h index 24d4ade000a58706cce28121d0e0bac73c3573e9..a92403bfb68c9f5d80a17e57a54beb2d982c546b 100644 --- a/Source/Dsp/Custom.h +++ b/Source/Dsp/Custom.h @@ -41,7 +41,8 @@ THE SOFTWARE. #include "Design.h" #include "Filter.h" -namespace Dsp { +namespace Dsp +{ /* * Single pole and Biquad with parameters allowing @@ -49,7 +50,8 @@ namespace Dsp { * */ -namespace Custom { +namespace Custom +{ // // Raw filters @@ -57,18 +59,18 @@ namespace Custom { struct OnePole : Biquad { - void setup (double scale, - double pole, - double zero); + void setup(double scale, + double pole, + double zero); }; struct TwoPole : Biquad { - void setup (double scale, - double poleRho, - double poleTheta, - double zeroRho, - double zeroTheta); + void setup(double scale, + double poleRho, + double poleTheta, + double zeroRho, + double zeroTheta); }; //------------------------------------------------------------------------------ @@ -77,95 +79,108 @@ struct TwoPole : Biquad // Gui-friendly Design layer // -namespace Design { +namespace Design +{ struct OnePole : DesignBase, Custom::OnePole { - enum - { - NumParams = 4 - }; - - static int getNumParams () - { - return 4; - } - - static const ParamInfo getParamInfo_1 () - { - return ParamInfo::defaultGainParam (); - } - - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultPoleRealParam (); - } - - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultZeroRealParam (); - } - - static Kind getKind () { return kindOther; } - static const char* getName() { return "Custom One-Pole"; } - - void setParams (const Params& params) - { - setup (pow (10., params[1]/20), - params[2], - params[3]); - } + enum + { + NumParams = 4 + }; + + static int getNumParams() + { + return 4; + } + + static const ParamInfo getParamInfo_1() + { + return ParamInfo::defaultGainParam(); + } + + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultPoleRealParam(); + } + + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultZeroRealParam(); + } + + static Kind getKind() + { + return kindOther; + } + static const char* getName() + { + return "Custom One-Pole"; + } + + void setParams(const Params& params) + { + setup(pow(10., params[1]/20), + params[2], + params[3]); + } }; struct TwoPole : DesignBase, Custom::TwoPole { - enum - { - NumParams = 6 - }; - - static int getNumParams () - { - return 6; - } - - static const ParamInfo getParamInfo_1 () - { - return ParamInfo::defaultGainParam (); - } - - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultPoleRhoParam (); - } - - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultPoleThetaParam (); - } - - static const ParamInfo getParamInfo_4 () - { - return ParamInfo::defaultZeroRhoParam (); - } - - static const ParamInfo getParamInfo_5 () - { - return ParamInfo::defaultZeroThetaParam (); - } - - - static Kind getKind () { return kindOther; } - static const char* getName() { return "Custom Two-Pole"; } - - void setParams (const Params& params) - { - setup (pow (10., params[1]/20), - params[2], - params[3], - params[4], - params[5]); - } + enum + { + NumParams = 6 + }; + + static int getNumParams() + { + return 6; + } + + static const ParamInfo getParamInfo_1() + { + return ParamInfo::defaultGainParam(); + } + + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultPoleRhoParam(); + } + + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultPoleThetaParam(); + } + + static const ParamInfo getParamInfo_4() + { + return ParamInfo::defaultZeroRhoParam(); + } + + static const ParamInfo getParamInfo_5() + { + return ParamInfo::defaultZeroThetaParam(); + } + + + static Kind getKind() + { + return kindOther; + } + static const char* getName() + { + return "Custom Two-Pole"; + } + + void setParams(const Params& params) + { + setup(pow(10., params[1]/20), + params[2], + params[3], + params[4], + params[5]); + } }; } diff --git a/Source/Dsp/Design.cpp b/Source/Dsp/Design.cpp index af4263f3a15d248254269ebb7cb30964d2a0e308..6cf9f6b5b6bd75d0a0cdc835436bc8d2c1ae66e4 100644 --- a/Source/Dsp/Design.cpp +++ b/Source/Dsp/Design.cpp @@ -36,6 +36,7 @@ THE SOFTWARE. #include "Common.h" #include "Design.h" -namespace Dsp { +namespace Dsp +{ } diff --git a/Source/Dsp/Design.h b/Source/Dsp/Design.h index e7dcf09f0a7b0c2a970835532a8ab9433d268bbb..b1375cd952774f19debe22952d5311b26441753b 100644 --- a/Source/Dsp/Design.h +++ b/Source/Dsp/Design.h @@ -39,24 +39,46 @@ THE SOFTWARE. #include "Common.h" #include "Params.h" -namespace Dsp { +namespace Dsp +{ struct DesignBase { - // Sampling rate is the first param for every Design filter - static const ParamInfo getParamInfo_0 () - { - return ParamInfo::defaultSampleRateParam (); - } - - // These should never get called - static const ParamInfo getParamInfo_1 () { return ParamInfo(); } - static const ParamInfo getParamInfo_2 () { return ParamInfo(); } - static const ParamInfo getParamInfo_3 () { return ParamInfo(); } - static const ParamInfo getParamInfo_4 () { return ParamInfo(); } - static const ParamInfo getParamInfo_5 () { return ParamInfo(); } - static const ParamInfo getParamInfo_6 () { return ParamInfo(); } - static const ParamInfo getParamInfo_7 () { return ParamInfo(); } + // Sampling rate is the first param for every Design filter + static const ParamInfo getParamInfo_0() + { + return ParamInfo::defaultSampleRateParam(); + } + + // These should never get called + static const ParamInfo getParamInfo_1() + { + return ParamInfo(); + } + static const ParamInfo getParamInfo_2() + { + return ParamInfo(); + } + static const ParamInfo getParamInfo_3() + { + return ParamInfo(); + } + static const ParamInfo getParamInfo_4() + { + return ParamInfo(); + } + static const ParamInfo getParamInfo_5() + { + return ParamInfo(); + } + static const ParamInfo getParamInfo_6() + { + return ParamInfo(); + } + static const ParamInfo getParamInfo_7() + { + return ParamInfo(); + } }; } diff --git a/Source/Dsp/Documentation.cpp b/Source/Dsp/Documentation.cpp index 1ed3006fd48c0cb4a09b8203e2ef5f0e47bc6f88..a98ebffcb076ecdb5b6d29e360c8c05ef406f168 100644 --- a/Source/Dsp/Documentation.cpp +++ b/Source/Dsp/Documentation.cpp @@ -111,7 +111,7 @@ Bibliography (Journal of the Audio Engineering Society, vol 53. pp 1026-1046) http://crca.ucsd.edu/~msp/techniques/v0.08/book-html/node1.html - + "Spectral Transformations for digital filters" A. G. Constantinides, B.Sc.(Eng.) Ph.D. (Proceedings of the IEEE, vol. 117, pp. 1585-1590, August 1970) @@ -296,167 +296,168 @@ Filter family namespaces #include <iostream> #include <iomanip> -namespace { +namespace +{ -void UsageExamples () +void UsageExamples() { - // create a two channel audio buffer - int numSamples = 2000; - float* audioData[2]; - audioData[0] = new float[numSamples]; - audioData[1] = new float[numSamples]; - - // create a 2-channel RBJ Low Pass with parameter smoothing - // and apply it to the audio data - { - // "1024" is the number of samples over which to fade parameter changes - Dsp::Filter* f = new Dsp::SmoothedFilterDesign - <Dsp::RBJ::Design::LowPass, 2> (1024); - Dsp::Params params; - params[0] = 44100; // sample rate - params[1] = 4000; // cutoff frequency - params[2] = 1.25; // Q - f->setParams (params); - f->process (numSamples, audioData); - } - - // set up a 2-channel RBJ High Pass with parameter smoothing, - // but bypass virtual function overhead - { - // the difference here is that we don't go through a pointer. - Dsp::SmoothedFilterDesign <Dsp::RBJ::Design::LowPass, 2> f (1024); - Dsp::Params params; - params[0] = 44100; // sample rate - params[1] = 4000; // cutoff frequency - params[2] = 1.25; // Q - f.setParams (params); - f.process (numSamples, audioData); - } - - // create a 2-channel Butterworth Band Pass of order 4, - // with parameter smoothing and apply it to the audio data. - // Output samples are generated using Direct Form II realization. - { - Dsp::Filter* f = new Dsp::SmoothedFilterDesign - <Dsp::Butterworth::Design::BandPass <4>, 2, Dsp::DirectFormII> (1024); - Dsp::Params params; - params[0] = 44100; // sample rate - params[1] = 4; // order - params[2] = 4000; // center frequency - params[3] = 880; // band width - f->setParams (params); - f->process (numSamples, audioData); - } - - // create a 2-channel Inverse Chebyshev Low Shelf of order 5 - // and passband ripple 0.1dB, without parameter smoothing and apply it. - { - Dsp::Filter* f = new Dsp::FilterDesign - <Dsp::ChebyshevII::Design::LowShelf <5>, 2>; - Dsp::Params params; - params[0] = 44100; // sample rate - params[1] = 5; // order - params[2] = 4000; // corner frequency - params[3] = 6; // shelf gain - params[4] = 0.1; // passband ripple - f->setParams (params); - f->process (numSamples, audioData); - } - - // create an abstract Butterworth High Pass of order 4. - // This one can't process channels, it can only be used for analysis - // (i.e. extract poles and zeros). - { - Dsp::Filter* f = new Dsp::FilterDesign - <Dsp::Butterworth::Design::HighPass <4> >; - Dsp::Params params; - params[0] = 44100; // sample rate - params[1] = 4; // order - params[2] = 4000; // cutoff frequency - f->setParams (params); - // this will cause a runtime assertion - f->process (numSamples, audioData); - } - - // Use the simple filter API to create a Chebyshev Band Stop of order 3 - // and 1dB ripple in the passband. The simle API has a smaller - // footprint, but no introspection or smoothing. - { - // Note we use the raw filter instead of the one - // from the Design namespace. - Dsp::SimpleFilter <Dsp::ChebyshevI::BandStop <3>, 2> f; - f.setup (3, // order - 44100,// sample rate - 4000, // center frequency - 880, // band width - 1); // ripple dB - f.process (numSamples, audioData); - } - - // Set up a filter, extract the coefficients and print them to standard - // output. Note that this filter is not capable of processing samples, - // as it has no state. It only has coefficients. - { - Dsp::SimpleFilter <Dsp::RBJ::LowPass> f; - f.setup (44100, // sample rate Hz - 440, // cutoff frequency Hz - 1); // "Q" (resonance) - - std::ostringstream os; - - os << "a0 = " << f.getA0 () << "\n" - << "a1 = " << f.getA1 () << "\n" - << "a2 = " << f.getA2 () << "\n" - << "b0 = " << f.getB0 () << "\n" - << "b1 = " << f.getB1 () << "\n" - << "b2 = " << f.getB2 () << "\n"; - ; - - std::cout << os.str(); - } - - // Create an instance of a raw filter. This is as low as it gets, any - // lower and we will just have either a Biquad or a Cascade, and you'll - // be setting the coefficients manually. - { - // This is basically like eating uncooked food - Dsp::RBJ::LowPass f; - f.setup (44100, 440, 1); - - // calculate response at frequency 440 Hz - Dsp::complex_t response = f.response (440./44100); - - std::ostringstream os; - - os << "response = " << response << "\n"; - - std::cout << os.str(); - } - - // Extract coefficients from a Cascade - { - Dsp::SimpleFilter <Dsp::Butterworth::HighPass <3> > f; - f.setup (3, 44100, 2000); - - std::ostringstream os; - - os << "numStages = " << f.getNumStages() << "\n" - << "a0[0] = " << f[0].getA0 () << "\n" - << "a1[0] = " << f[0].getA1 () << "\n" - << "a2[0] = " << f[0].getA2 () << "\n" - << "b0[0] = " << f[0].getB0 () << "\n" - << "b1[0] = " << f[0].getB1 () << "\n" - << "b2[0] = " << f[0].getB2 () << "\n" - << "a0[1] = " << f[1].getA0 () << "\n" - << "a1[1] = " << f[1].getA1 () << "\n" - << "a2[1] = " << f[1].getA2 () << "\n" - << "b0[1] = " << f[1].getB0 () << "\n" - << "b1[1] = " << f[1].getB1 () << "\n" - << "b2[1] = " << f[1].getB2 () << "\n" - ; - - std::cout << os.str(); - } + // create a two channel audio buffer + int numSamples = 2000; + float* audioData[2]; + audioData[0] = new float[numSamples]; + audioData[1] = new float[numSamples]; + + // create a 2-channel RBJ Low Pass with parameter smoothing + // and apply it to the audio data + { + // "1024" is the number of samples over which to fade parameter changes + Dsp::Filter* f = new Dsp::SmoothedFilterDesign + <Dsp::RBJ::Design::LowPass, 2> (1024); + Dsp::Params params; + params[0] = 44100; // sample rate + params[1] = 4000; // cutoff frequency + params[2] = 1.25; // Q + f->setParams(params); + f->process(numSamples, audioData); + } + + // set up a 2-channel RBJ High Pass with parameter smoothing, + // but bypass virtual function overhead + { + // the difference here is that we don't go through a pointer. + Dsp::SmoothedFilterDesign <Dsp::RBJ::Design::LowPass, 2> f(1024); + Dsp::Params params; + params[0] = 44100; // sample rate + params[1] = 4000; // cutoff frequency + params[2] = 1.25; // Q + f.setParams(params); + f.process(numSamples, audioData); + } + + // create a 2-channel Butterworth Band Pass of order 4, + // with parameter smoothing and apply it to the audio data. + // Output samples are generated using Direct Form II realization. + { + Dsp::Filter* f = new Dsp::SmoothedFilterDesign + <Dsp::Butterworth::Design::BandPass <4>, 2, Dsp::DirectFormII> (1024); + Dsp::Params params; + params[0] = 44100; // sample rate + params[1] = 4; // order + params[2] = 4000; // center frequency + params[3] = 880; // band width + f->setParams(params); + f->process(numSamples, audioData); + } + + // create a 2-channel Inverse Chebyshev Low Shelf of order 5 + // and passband ripple 0.1dB, without parameter smoothing and apply it. + { + Dsp::Filter* f = new Dsp::FilterDesign + <Dsp::ChebyshevII::Design::LowShelf <5>, 2>; + Dsp::Params params; + params[0] = 44100; // sample rate + params[1] = 5; // order + params[2] = 4000; // corner frequency + params[3] = 6; // shelf gain + params[4] = 0.1; // passband ripple + f->setParams(params); + f->process(numSamples, audioData); + } + + // create an abstract Butterworth High Pass of order 4. + // This one can't process channels, it can only be used for analysis + // (i.e. extract poles and zeros). + { + Dsp::Filter* f = new Dsp::FilterDesign + <Dsp::Butterworth::Design::HighPass <4> >; + Dsp::Params params; + params[0] = 44100; // sample rate + params[1] = 4; // order + params[2] = 4000; // cutoff frequency + f->setParams(params); + // this will cause a runtime assertion + f->process(numSamples, audioData); + } + + // Use the simple filter API to create a Chebyshev Band Stop of order 3 + // and 1dB ripple in the passband. The simle API has a smaller + // footprint, but no introspection or smoothing. + { + // Note we use the raw filter instead of the one + // from the Design namespace. + Dsp::SimpleFilter <Dsp::ChebyshevI::BandStop <3>, 2> f; + f.setup(3, // order + 44100,// sample rate + 4000, // center frequency + 880, // band width + 1); // ripple dB + f.process(numSamples, audioData); + } + + // Set up a filter, extract the coefficients and print them to standard + // output. Note that this filter is not capable of processing samples, + // as it has no state. It only has coefficients. + { + Dsp::SimpleFilter <Dsp::RBJ::LowPass> f; + f.setup(44100, // sample rate Hz + 440, // cutoff frequency Hz + 1); // "Q" (resonance) + + std::ostringstream os; + + os << "a0 = " << f.getA0() << "\n" + << "a1 = " << f.getA1() << "\n" + << "a2 = " << f.getA2() << "\n" + << "b0 = " << f.getB0() << "\n" + << "b1 = " << f.getB1() << "\n" + << "b2 = " << f.getB2() << "\n"; + ; + + std::cout << os.str(); + } + + // Create an instance of a raw filter. This is as low as it gets, any + // lower and we will just have either a Biquad or a Cascade, and you'll + // be setting the coefficients manually. + { + // This is basically like eating uncooked food + Dsp::RBJ::LowPass f; + f.setup(44100, 440, 1); + + // calculate response at frequency 440 Hz + Dsp::complex_t response = f.response(440./44100); + + std::ostringstream os; + + os << "response = " << response << "\n"; + + std::cout << os.str(); + } + + // Extract coefficients from a Cascade + { + Dsp::SimpleFilter <Dsp::Butterworth::HighPass <3> > f; + f.setup(3, 44100, 2000); + + std::ostringstream os; + + os << "numStages = " << f.getNumStages() << "\n" + << "a0[0] = " << f[0].getA0() << "\n" + << "a1[0] = " << f[0].getA1() << "\n" + << "a2[0] = " << f[0].getA2() << "\n" + << "b0[0] = " << f[0].getB0() << "\n" + << "b1[0] = " << f[0].getB1() << "\n" + << "b2[0] = " << f[0].getB2() << "\n" + << "a0[1] = " << f[1].getA0() << "\n" + << "a1[1] = " << f[1].getA1() << "\n" + << "a2[1] = " << f[1].getA2() << "\n" + << "b0[1] = " << f[1].getB0() << "\n" + << "b1[1] = " << f[1].getB1() << "\n" + << "b2[1] = " << f[1].getB2() << "\n" + ; + + std::cout << os.str(); + } } } diff --git a/Source/Dsp/Elliptic.cpp b/Source/Dsp/Elliptic.cpp index 7b2ff44ddaaa9317c82269232dca58bf0e86859b..3ad7a01def0e96174806412abf06d446e5b4c8f1 100644 --- a/Source/Dsp/Elliptic.cpp +++ b/Source/Dsp/Elliptic.cpp @@ -36,347 +36,349 @@ THE SOFTWARE. #include "Common.h" #include "Elliptic.h" -namespace Dsp { +namespace Dsp +{ -namespace Elliptic { +namespace Elliptic +{ // shit ton of math in here // approximation to complete elliptic integral of the first kind. // fast convergence, peak error less than 2e-16. -double Solver::ellipticK (double k) +double Solver::ellipticK(double k) { - double m = k*k; - double a = 1; - double b = sqrt (1 - m); - double c = a - b; - double co; - do - { - co = c; - c = (a - b) / 2; - double ao = (a + b) / 2; - b = sqrt (a*b); - a = ao; - } - while (c<co); - - return doublePi / (a + a); + double m = k*k; + double a = 1; + double b = sqrt(1 - m); + double c = a - b; + double co; + do + { + co = c; + c = (a - b) / 2; + double ao = (a + b) / 2; + b = sqrt(a*b); + a = ao; + } + while (c<co); + + return doublePi / (a + a); } //------------------------------------------------------------------------------ -AnalogLowPass::AnalogLowPass () - : m_numPoles (-1) +AnalogLowPass::AnalogLowPass() + : m_numPoles(-1) { - setNormal (0, 1); + setNormal(0, 1); } -void AnalogLowPass::design (int numPoles, - double rippleDb, - double rolloff) +void AnalogLowPass::design(int numPoles, + double rippleDb, + double rolloff) { - if (m_numPoles != numPoles || - m_rippleDb != rippleDb || - m_rolloff != rolloff) - { - m_numPoles = numPoles; - m_rippleDb = rippleDb; - m_rolloff = rolloff; - - reset (); - - // calculate - //const double ep = rippleDb; // passband ripple - - const int n = numPoles; - - double e2=pow(10.,rippleDb/10)-1; - //double xi = rolloff + 1; - double xi = 5 * exp (rolloff - 1) + 1; - - m_K = Solver::ellipticK(1/xi); - m_Kprime = Solver::ellipticK(sqrt(1-1/(xi*xi))); - - int ni = ((n & 1) == 1) ? 0 : 1; - int i; - double f[100]; // HACK!!! - for (i = 1; i <= n/2; i++) - { - double u = (2*i-ni)*m_K/n; - double sn = calcsn(u); - sn *= 2*doublePi/m_K; - f[i] = m_zeros[i-1] = 1/sn; - } - m_zeros[n/2] = std::numeric_limits<double>::infinity(); - double fb = 1/(2*doublePi); - m_nin = n % 2; - m_n2 = n/2; - for (i = 1; i <= m_n2; i++) - { - double x = f[m_n2+1-i]; - m_z1[i] = sqrt(1-1/(x*x)); - } - double ee = e2;//pow(10., rippleDb/20)-1; - m_e = sqrt(ee); - double fbb = fb*fb; - m_m = m_nin+2*m_n2; - m_em = 2*(m_m/2); - double tp = 2*doublePi; - calcfz(); - calcqz(); - if (m_m > m_em) - m_c1[2*m_m] = 0; - for (i = 0; i <= 2*m_m; i += 2) - m_a1[m_m-i/2] = m_c1[i] + m_d1[i]; - double a0 = findfact(m_m); - int r = 0; - while (r < m_em/2) - { - r++; - m_p[r] /= 10; - m_q1[r] /= 100; - double d = 1+m_p[r]+m_q1[r]; - m_b1[r] = (1+m_p[r]/2)*fbb/d; - m_zf1[r] = fb/pow(d, .25); - m_zq1[r] = 1/sqrt(abs(2*(1-m_b1[r]/(m_zf1[r]*m_zf1[r])))); - m_zw1[r] = tp*m_zf1[r]; - - m_rootR[r] = -.5*m_zw1[r]/m_zq1[r]; - m_rootR[r+m_em/2] = m_rootR[r]; - m_rootI[r] = .5*sqrt(abs(m_zw1[r]*m_zw1[r]/(m_zq1[r]*m_zq1[r]) - 4*m_zw1[r]*m_zw1[r])); - m_rootI[r+m_em/2] = -m_rootI[r]; - - complex_t pole ( - -.5*m_zw1[r]/m_zq1[r], - .5*sqrt(abs(m_zw1[r]*m_zw1[r]/(m_zq1[r]*m_zq1[r]) - 4*m_zw1[r]*m_zw1[r]))); - - complex_t zero (0, m_zeros[r-1]); - - addPoleZeroConjugatePairs (pole, zero); - } - - if (a0 != 0) + if (m_numPoles != numPoles || + m_rippleDb != rippleDb || + m_rolloff != rolloff) { - m_rootR[r+1+m_em/2] = -sqrt(fbb/(.1*a0-1))*tp; - m_rootI[r+1+m_em/2] = 0; - - add (-sqrt(fbb/(.1*a0-1))*tp, infinity()); + m_numPoles = numPoles; + m_rippleDb = rippleDb; + m_rolloff = rolloff; + + reset(); + + // calculate + //const double ep = rippleDb; // passband ripple + + const int n = numPoles; + + double e2=pow(10.,rippleDb/10)-1; + //double xi = rolloff + 1; + double xi = 5 * exp(rolloff - 1) + 1; + + m_K = Solver::ellipticK(1/xi); + m_Kprime = Solver::ellipticK(sqrt(1-1/(xi*xi))); + + int ni = ((n & 1) == 1) ? 0 : 1; + int i; + double f[100]; // HACK!!! + for (i = 1; i <= n/2; i++) + { + double u = (2*i-ni)*m_K/n; + double sn = calcsn(u); + sn *= 2*doublePi/m_K; + f[i] = m_zeros[i-1] = 1/sn; + } + m_zeros[n/2] = std::numeric_limits<double>::infinity(); + double fb = 1/(2*doublePi); + m_nin = n % 2; + m_n2 = n/2; + for (i = 1; i <= m_n2; i++) + { + double x = f[m_n2+1-i]; + m_z1[i] = sqrt(1-1/(x*x)); + } + double ee = e2;//pow(10., rippleDb/20)-1; + m_e = sqrt(ee); + double fbb = fb*fb; + m_m = m_nin+2*m_n2; + m_em = 2*(m_m/2); + double tp = 2*doublePi; + calcfz(); + calcqz(); + if (m_m > m_em) + m_c1[2*m_m] = 0; + for (i = 0; i <= 2*m_m; i += 2) + m_a1[m_m-i/2] = m_c1[i] + m_d1[i]; + double a0 = findfact(m_m); + int r = 0; + while (r < m_em/2) + { + r++; + m_p[r] /= 10; + m_q1[r] /= 100; + double d = 1+m_p[r]+m_q1[r]; + m_b1[r] = (1+m_p[r]/2)*fbb/d; + m_zf1[r] = fb/pow(d, .25); + m_zq1[r] = 1/sqrt(abs(2*(1-m_b1[r]/(m_zf1[r]*m_zf1[r])))); + m_zw1[r] = tp*m_zf1[r]; + + m_rootR[r] = -.5*m_zw1[r]/m_zq1[r]; + m_rootR[r+m_em/2] = m_rootR[r]; + m_rootI[r] = .5*sqrt(abs(m_zw1[r]*m_zw1[r]/(m_zq1[r]*m_zq1[r]) - 4*m_zw1[r]*m_zw1[r])); + m_rootI[r+m_em/2] = -m_rootI[r]; + + complex_t pole( + -.5*m_zw1[r]/m_zq1[r], + .5*sqrt(abs(m_zw1[r]*m_zw1[r]/(m_zq1[r]*m_zq1[r]) - 4*m_zw1[r]*m_zw1[r]))); + + complex_t zero(0, m_zeros[r-1]); + + addPoleZeroConjugatePairs(pole, zero); + } + + if (a0 != 0) + { + m_rootR[r+1+m_em/2] = -sqrt(fbb/(.1*a0-1))*tp; + m_rootI[r+1+m_em/2] = 0; + + add(-sqrt(fbb/(.1*a0-1))*tp, infinity()); + } + + setNormal(0, (numPoles&1) ? 1. : pow(10., -rippleDb / 20.0)); } - - setNormal (0, (numPoles&1) ? 1. : pow (10., -rippleDb / 20.0)); - } } // generate the product of (z+s1[i]) for i = 1 .. sn and store it in b1[] // (i.e. f[z] = b1[0] + b1[1] z + b1[2] z^2 + ... b1[sn] z^sn) -void AnalogLowPass::prodpoly( int sn ) +void AnalogLowPass::prodpoly(int sn) { - m_b1[0] = m_s1[1]; - m_b1[1] = 1; - int i, j; - for (j = 2; j <= sn; j++) - { - m_a1[0] = m_s1[j]*m_b1[0]; - for (i = 1; i <= j-1; i++) - m_a1[i] = m_b1[i-1]+m_s1[j]*m_b1[i]; - for (i = 0; i != j; i++) - m_b1[i] = m_a1[i]; - m_b1[j] = 1; - } + m_b1[0] = m_s1[1]; + m_b1[1] = 1; + int i, j; + for (j = 2; j <= sn; j++) + { + m_a1[0] = m_s1[j]*m_b1[0]; + for (i = 1; i <= j-1; i++) + m_a1[i] = m_b1[i-1]+m_s1[j]*m_b1[i]; + for (i = 0; i != j; i++) + m_b1[i] = m_a1[i]; + m_b1[j] = 1; + } } // determine f(z)^2 -void AnalogLowPass::calcfz2( int i ) +void AnalogLowPass::calcfz2(int i) { - int ji = 0; - int jf = 0; - if (i < m_em+2) - { - ji = 0; - jf = i; - } - if (i > m_em) - { - ji = i-m_em; - jf = m_em; - } - m_c1[i] = 0; - int j; - for(j = ji; j <= jf; j += 2) - m_c1[i] += m_a1[j]*(m_a1[i-j]*pow(10., m_m-i/2)); + int ji = 0; + int jf = 0; + if (i < m_em+2) + { + ji = 0; + jf = i; + } + if (i > m_em) + { + ji = i-m_em; + jf = m_em; + } + m_c1[i] = 0; + int j; + for (j = ji; j <= jf; j += 2) + m_c1[i] += m_a1[j]*(m_a1[i-j]*pow(10., m_m-i/2)); } // calculate f(z) -void AnalogLowPass::calcfz( void ) +void AnalogLowPass::calcfz(void) { - int i = 1; - if( m_nin == 1 ) - m_s1[i++] = 1; - for (; i <= m_nin+m_n2; i++) - m_s1[i] = m_s1[i+m_n2] = m_z1[i-m_nin]; - prodpoly(m_nin+2*m_n2); - for (i = 0; i <= m_em; i += 2) - m_a1[i] = m_e*m_b1[i]; - for (i = 0; i <= 2*m_em; i += 2) - calcfz2(i); + int i = 1; + if (m_nin == 1) + m_s1[i++] = 1; + for (; i <= m_nin+m_n2; i++) + m_s1[i] = m_s1[i+m_n2] = m_z1[i-m_nin]; + prodpoly(m_nin+2*m_n2); + for (i = 0; i <= m_em; i += 2) + m_a1[i] = m_e*m_b1[i]; + for (i = 0; i <= 2*m_em; i += 2) + calcfz2(i); } // determine q(z) -void AnalogLowPass::calcqz( void ) +void AnalogLowPass::calcqz(void) { - int i; - for (i = 1; i <= m_nin; i++) - m_s1[i] = -10; - for (; i <= m_nin+m_n2; i++) - m_s1[i] = -10*m_z1[i-m_nin]*m_z1[i-m_nin]; - for (; i <= m_nin+2*m_n2; i++) - m_s1[i] = m_s1[i-m_n2]; - prodpoly(m_m); - int dd = ((m_nin & 1) == 1) ? -1 : 1; - for (i = 0; i <= 2*m_m; i += 2) - m_d1[i] = dd*m_b1[i/2]; + int i; + for (i = 1; i <= m_nin; i++) + m_s1[i] = -10; + for (; i <= m_nin+m_n2; i++) + m_s1[i] = -10*m_z1[i-m_nin]*m_z1[i-m_nin]; + for (; i <= m_nin+2*m_n2; i++) + m_s1[i] = m_s1[i-m_n2]; + prodpoly(m_m); + int dd = ((m_nin & 1) == 1) ? -1 : 1; + for (i = 0; i <= 2*m_m; i += 2) + m_d1[i] = dd*m_b1[i/2]; } // compute factors double AnalogLowPass::findfact(int t) { - int i; - double a = 0; - for (i = 1; i <= t; i++) - m_a1[i] /= m_a1[0]; - m_a1[0] = m_b1[0] = m_c1[0] = 1; - int i1 = 0; - for(;;) - { - if (t <= 2) - break; - double p0 = 0, q0 = 0; - i1++; - for(;;) + int i; + double a = 0; + for (i = 1; i <= t; i++) + m_a1[i] /= m_a1[0]; + m_a1[0] = m_b1[0] = m_c1[0] = 1; + int i1 = 0; + for (;;) + { + if (t <= 2) + break; + double p0 = 0, q0 = 0; + i1++; + for (;;) + { + m_b1[1] = m_a1[1] - p0; + m_c1[1] = m_b1[1] - p0; + for (i = 2; i <= t; i++) + m_b1[i] = m_a1[i]-p0*m_b1[i-1]-q0*m_b1[i-2]; + for (i = 2; i < t; i++) + m_c1[i] = m_b1[i]-p0*m_c1[i-1]-q0*m_c1[i-2]; + int x1 = t-1; + int x2 = t-2; + int x3 = t-3; + double x4 = m_c1[x2]*m_c1[x2]+m_c1[x3]*(m_b1[x1]-m_c1[x1]); + if (x4 == 0) + x4 = 1e-3; + double ddp = (m_b1[x1]*m_c1[x2]-m_b1[t]*m_c1[x3])/x4; + p0 += ddp; + double dq = (m_b1[t]*m_c1[x2]-m_b1[x1]*(m_c1[x1]-m_b1[x1]))/x4; + q0 += dq; + if (abs(ddp+dq) < 1e-6) + break; + } + m_p[i1] = p0; + m_q1[i1] = q0; + m_a1[1] = m_a1[1]-p0; + t -= 2; + for (i = 2; i <= t; i++) + m_a1[i] -= p0*m_a1[i-1]+q0*m_a1[i-2]; + if (t <= 2) + break; + } + + if (t == 2) { - m_b1[1] = m_a1[1] - p0; - m_c1[1] = m_b1[1] - p0; - for (i = 2; i <= t; i++) - m_b1[i] = m_a1[i]-p0*m_b1[i-1]-q0*m_b1[i-2]; - for (i = 2; i < t; i++) - m_c1[i] = m_b1[i]-p0*m_c1[i-1]-q0*m_c1[i-2]; - int x1 = t-1; - int x2 = t-2; - int x3 = t-3; - double x4 = m_c1[x2]*m_c1[x2]+m_c1[x3]*(m_b1[x1]-m_c1[x1]); - if (x4 == 0) - x4 = 1e-3; - double ddp = (m_b1[x1]*m_c1[x2]-m_b1[t]*m_c1[x3])/x4; - p0 += ddp; - double dq = (m_b1[t]*m_c1[x2]-m_b1[x1]*(m_c1[x1]-m_b1[x1]))/x4; - q0 += dq; - if (abs(ddp+dq) < 1e-6) - break; + i1++; + m_p[i1] = m_a1[1]; + m_q1[i1] = m_a1[2]; } - m_p[i1] = p0; - m_q1[i1] = q0; - m_a1[1] = m_a1[1]-p0; - t -= 2; - for (i = 2; i <= t; i++) - m_a1[i] -= p0*m_a1[i-1]+q0*m_a1[i-2]; - if (t <= 2) - break; - } - - if (t == 2) - { - i1++; - m_p[i1] = m_a1[1]; - m_q1[i1] = m_a1[2]; - } - if (t == 1) - a = -m_a1[1]; - - return a; + if (t == 1) + a = -m_a1[1]; + + return a; } double AnalogLowPass::calcsn(double u) { - double sn = 0; - int j; - // q = modular constant - double q = exp(-doublePi*m_Kprime/m_K); - double v = doublePi*.5*u/m_K; - for (j = 0; ; j++) - { - double w = pow(q, j+.5); - sn += w*sin((2*j+1)*v)/(1-w*w); - if (w < 1e-7) - break; - } - return sn; + double sn = 0; + int j; + // q = modular constant + double q = exp(-doublePi*m_Kprime/m_K); + double v = doublePi*.5*u/m_K; + for (j = 0; ; j++) + { + double w = pow(q, j+.5); + sn += w*sin((2*j+1)*v)/(1-w*w); + if (w < 1e-7) + break; + } + return sn; } //------------------------------------------------------------------------------ -void LowPassBase::setup (int order, - double sampleRate, - double cutoffFrequency, - double rippleDb, - double rolloff) +void LowPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double rippleDb, + double rolloff) { - m_analogProto.design (order, rippleDb, rolloff); + m_analogProto.design(order, rippleDb, rolloff); - LowPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void HighPassBase::setup (int order, - double sampleRate, - double cutoffFrequency, - double rippleDb, - double rolloff) +void HighPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double rippleDb, + double rolloff) { - m_analogProto.design (order, rippleDb, rolloff); + m_analogProto.design(order, rippleDb, rolloff); - HighPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandPassBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double rippleDb, - double rolloff) +void BandPassBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double rippleDb, + double rolloff) { - m_analogProto.design (order, rippleDb, rolloff); + m_analogProto.design(order, rippleDb, rolloff); - BandPassTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandStopBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double rippleDb, - double rolloff) +void BandStopBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double rippleDb, + double rolloff) { - m_analogProto.design (order, rippleDb, rolloff); + m_analogProto.design(order, rippleDb, rolloff); - BandStopTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandStopTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } } diff --git a/Source/Dsp/Elliptic.h b/Source/Dsp/Elliptic.h index 86e8d9cfcc5d460401fc60a9225c193a65ab66a4..28037af6d6e42840cb1c08c4886c29ab80378c24 100644 --- a/Source/Dsp/Elliptic.h +++ b/Source/Dsp/Elliptic.h @@ -42,20 +42,22 @@ THE SOFTWARE. #include "Filter.h" #include "PoleFilter.h" -namespace Dsp { +namespace Dsp +{ /* * Filters with Elliptic response characteristics * */ -namespace Elliptic { +namespace Elliptic +{ // Solves for Jacobi elliptics class Solver { public: - static double ellipticK (double k); + static double ellipticK(double k); }; // Half-band analog prototype (s-plane) @@ -63,63 +65,63 @@ public: class AnalogLowPass : public LayoutBase { public: - AnalogLowPass (); + AnalogLowPass(); - void design (const int numPoles, - double rippleDb, - double rolloff); + void design(const int numPoles, + double rippleDb, + double rolloff); private: - void prodpoly (int sn); - void calcfz2 (int i); - void calcfz (); - void calcqz (); - double findfact (int t); - double calcsn (double u); + void prodpoly(int sn); + void calcfz2(int i); + void calcfz(); + void calcqz(); + double findfact(int t); + double calcsn(double u); #if 0 - template<int n> - struct CalcArray - { - double& operator[](size_t index) + template<int n> + struct CalcArray { - assert( index<n ); - return m_a[index]; - } - private: - double m_a[n]; - }; + double& operator[](size_t index) + { + assert(index<n); + return m_a[index]; + } + private: + double m_a[n]; + }; #else #endif - double m_p0; - double m_q; - double m_K; - double m_Kprime; - double m_e; - int m_nin; - int m_m; - int m_n2; - int m_em; - double m_zeros[100]; - double m_c1[100]; - double m_b1[100]; - double m_a1[100]; - double m_d1[100]; - double m_q1[100]; - double m_z1[100]; - double m_f1[100]; - double m_s1[100]; - double m_p [100]; - double m_zw1[100]; - double m_zf1[100]; - double m_zq1[100]; - double m_rootR[100]; - double m_rootI[100]; - - int m_numPoles; - double m_rippleDb; - double m_rolloff; + double m_p0; + double m_q; + double m_K; + double m_Kprime; + double m_e; + int m_nin; + int m_m; + int m_n2; + int m_em; + double m_zeros[100]; + double m_c1[100]; + double m_b1[100]; + double m_a1[100]; + double m_d1[100]; + double m_q1[100]; + double m_z1[100]; + double m_f1[100]; + double m_s1[100]; + double m_p [100]; + double m_zw1[100]; + double m_zf1[100]; + double m_zq1[100]; + double m_rootR[100]; + double m_rootI[100]; + + int m_numPoles; + double m_rippleDb; + double m_rolloff; }; //------------------------------------------------------------------------------ @@ -128,40 +130,40 @@ private: struct LowPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double rippleDb, - double rolloff); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double rippleDb, + double rolloff); }; struct HighPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - double rippleDb, - double rolloff); + void setup(int order, + double sampleRate, + double cutoffFrequency, + double rippleDb, + double rolloff); }; struct BandPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double rippleDb, - double rolloff); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double rippleDb, + double rolloff); }; struct BandStopBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - double rippleDb, - double rolloff); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double rippleDb, + double rolloff); }; //------------------------------------------------------------------------------ @@ -196,128 +198,153 @@ struct BandStop : PoleFilter <BandStopBase, MaxOrder, MaxOrder*2> // Gui-friendly Design layer // -namespace Design { +namespace Design +{ struct TypeIBase : DesignBase { - enum - { - NumParams = 5 - }; - - static int getNumParams () - { - return 5; - } - - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCutoffFrequencyParam (); - } - - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultRippleDbParam (); - } - - static const ParamInfo getParamInfo_4 () - { - return ParamInfo::defaultRolloffParam (); - } + enum + { + NumParams = 5 + }; + + static int getNumParams() + { + return 5; + } + + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCutoffFrequencyParam(); + } + + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultRippleDbParam(); + } + + static const ParamInfo getParamInfo_4() + { + return ParamInfo::defaultRolloffParam(); + } }; template <class FilterClass> struct TypeI : TypeIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3], params[4]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); + } }; struct TypeIIBase : DesignBase { - enum - { - NumParams = 6 - }; - - static int getNumParams () - { - return 6; - } - - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCenterFrequencyParam (); - } - - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultBandwidthHzParam (); - } - - static const ParamInfo getParamInfo_4 () - { - return ParamInfo::defaultRippleDbParam (); - } - - static const ParamInfo getParamInfo_5 () - { - return ParamInfo::defaultRolloffParam (); - } + enum + { + NumParams = 6 + }; + + static int getNumParams() + { + return 6; + } + + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCenterFrequencyParam(); + } + + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultBandwidthHzParam(); + } + + static const ParamInfo getParamInfo_4() + { + return ParamInfo::defaultRippleDbParam(); + } + + static const ParamInfo getParamInfo_5() + { + return ParamInfo::defaultRolloffParam(); + } }; template <class FilterClass> struct TypeII : TypeIIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3], params[4], params[5]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4], params[5]); + } }; // Factored kind and name struct LowPassDescription { - static Kind getKind () { return kindLowPass; } - static const char* getName() { return "Elliptic Low Pass"; } + static Kind getKind() + { + return kindLowPass; + } + static const char* getName() + { + return "Elliptic Low Pass"; + } }; struct HighPassDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Elliptic High Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Elliptic High Pass"; + } }; struct BandPassDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Elliptic Band Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Elliptic Band Pass"; + } }; struct BandStopDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Elliptic Band Stop"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Elliptic Band Stop"; + } }; // This glues on the Order parameter template <int MaxOrder, - template <class> class TypeClass, - template <int> class FilterClass> + template <class> class TypeClass, + template <int> class FilterClass> struct OrderBase : TypeClass <FilterClass <MaxOrder> > { - const ParamInfo getParamInfo_1 () const - { - return ParamInfo (idOrder, "Order", "Order", - 1, MaxOrder, 2, - &ParamInfo::Int_toControlValue, - &ParamInfo::Int_toNativeValue, - &ParamInfo::Int_toString); - - } + const ParamInfo getParamInfo_1() const + { + return ParamInfo(idOrder, "Order", "Order", + 1, MaxOrder, 2, + &ParamInfo::Int_toControlValue, + &ParamInfo::Int_toNativeValue, + &ParamInfo::Int_toString); + + } }; //------------------------------------------------------------------------------ @@ -327,25 +354,25 @@ struct OrderBase : TypeClass <FilterClass <MaxOrder> > template <int MaxOrder> struct LowPass : OrderBase <MaxOrder, TypeI, Elliptic::LowPass>, - LowPassDescription + LowPassDescription { }; template <int MaxOrder> struct HighPass : OrderBase <MaxOrder, TypeI, Elliptic::HighPass>, - HighPassDescription + HighPassDescription { }; template <int MaxOrder> struct BandPass : OrderBase <MaxOrder, TypeII, Elliptic::BandPass>, - BandPassDescription + BandPassDescription { }; template <int MaxOrder> struct BandStop : OrderBase <MaxOrder, TypeII, Elliptic::BandStop>, - BandStopDescription + BandStopDescription { }; diff --git a/Source/Dsp/Filter.cpp b/Source/Dsp/Filter.cpp index 40e7a01b129fe91603d59ebe5f27ed191ba28a79..b1542292c9fe78d1dce12d8cfe90eba89f72ca89 100644 --- a/Source/Dsp/Filter.cpp +++ b/Source/Dsp/Filter.cpp @@ -36,82 +36,83 @@ THE SOFTWARE. #include "Common.h" #include "Filter.h" -namespace Dsp { +namespace Dsp +{ Params Filter::getDefaultParams() const { - Params params; + Params params; - params.clear(); + params.clear(); - for (int i = 0; i < getNumParams(); ++i) - params[i] = getParamInfo(i).getDefaultValue(); + for (int i = 0; i < getNumParams(); ++i) + params[i] = getParamInfo(i).getDefaultValue(); - return params; + return params; } Filter::~Filter() { } -int Filter::findParamId (int paramId) +int Filter::findParamId(int paramId) { - int index = -1; + int index = -1; - for (int i = getNumParams(); --i >= 0;) - { - if (getParamInfo (i).getId () == paramId) + for (int i = getNumParams(); --i >= 0;) { - index = i; - break; + if (getParamInfo(i).getId() == paramId) + { + index = i; + break; + } } - } - return index; + return index; } -void Filter::setParamById (int paramId, double nativeValue) +void Filter::setParamById(int paramId, double nativeValue) { - for (int i = getNumParams(); --i >= 0;) - { - if (getParamInfo (i).getId () == paramId) + for (int i = getNumParams(); --i >= 0;) { - setParam (i, nativeValue); - return; + if (getParamInfo(i).getId() == paramId) + { + setParam(i, nativeValue); + return; + } } - } - - assert (0); + + assert(0); } -void Filter::copyParamsFrom (Dsp::Filter const* other) +void Filter::copyParamsFrom(Dsp::Filter const* other) { - // first, set reasonable defaults - m_params = getDefaultParams (); + // first, set reasonable defaults + m_params = getDefaultParams(); - if (other) - { - // now loop - for (int i = 0; i < getNumParams (); ++i) + if (other) { - const ParamInfo& paramInfo = getParamInfo (i); - - // find a match - for (int j = 0; j < other->getNumParams(); ++j) - { - const ParamInfo& otherParamInfo = other->getParamInfo (j); - - if (paramInfo.getId() == otherParamInfo.getId()) + // now loop + for (int i = 0; i < getNumParams(); ++i) { - // match! - m_params [i] = paramInfo.clamp (other->getParam (j)); - break; + const ParamInfo& paramInfo = getParamInfo(i); + + // find a match + for (int j = 0; j < other->getNumParams(); ++j) + { + const ParamInfo& otherParamInfo = other->getParamInfo(j); + + if (paramInfo.getId() == otherParamInfo.getId()) + { + // match! + m_params [i] = paramInfo.clamp(other->getParam(j)); + break; + } + } } - } } - } - doSetParams (m_params); + doSetParams(m_params); } } diff --git a/Source/Dsp/Filter.h b/Source/Dsp/Filter.h index 9f3be4bd46af38147519f45108dd3abc4b5dc035..45a6375f6fbc02473a02479341464c77257fb76c 100644 --- a/Source/Dsp/Filter.h +++ b/Source/Dsp/Filter.h @@ -42,7 +42,8 @@ THE SOFTWARE. #include "State.h" #include "Types.h" -namespace Dsp { +namespace Dsp +{ /* * Filter @@ -55,65 +56,65 @@ namespace Dsp { class Filter { public: - virtual ~Filter(); + virtual ~Filter(); + + virtual Kind getKind() const = 0; - virtual Kind getKind () const = 0; + virtual const std::string getName() const = 0; - virtual const std::string getName () const = 0; + virtual int getNumParams() const = 0; - virtual int getNumParams () const = 0; + virtual ParamInfo getParamInfo(int index) const = 0; - virtual ParamInfo getParamInfo (int index) const = 0; + Params getDefaultParams() const; - Params getDefaultParams() const; + const Params& getParams() const + { + return m_params; + } - const Params& getParams() const - { - return m_params; - } + double getParam(int paramIndex) const + { + assert(paramIndex >= 0 && paramIndex <= getNumParams()); + return m_params[paramIndex]; + } - double getParam (int paramIndex) const - { - assert (paramIndex >= 0 && paramIndex <= getNumParams()); - return m_params[paramIndex]; - } + void setParam(int paramIndex, double nativeValue) + { + assert(paramIndex >= 0 && paramIndex <= getNumParams()); + m_params[paramIndex] = nativeValue; + doSetParams(m_params); + } - void setParam (int paramIndex, double nativeValue) - { - assert (paramIndex >= 0 && paramIndex <= getNumParams()); - m_params[paramIndex] = nativeValue; - doSetParams (m_params); - } + int findParamId(int paramId); - int findParamId (int paramId); + void setParamById(int paramId, double nativeValue); - void setParamById (int paramId, double nativeValue); + void setParams(const Params& parameters) + { + m_params = parameters; + doSetParams(parameters); + } - void setParams (const Params& parameters) - { - m_params = parameters; - doSetParams (parameters); - } + // This makes a best-effort to pick up the values + // of matching parameters from another set. It uses + // the ParamID information to make the match. + void copyParamsFrom(Dsp::Filter const* other); - // This makes a best-effort to pick up the values - // of matching parameters from another set. It uses - // the ParamID information to make the match. - void copyParamsFrom (Dsp::Filter const* other); + virtual std::vector<PoleZeroPair> getPoleZeros() const = 0; - virtual std::vector<PoleZeroPair> getPoleZeros() const = 0; - - virtual complex_t response (double normalizedFrequency) const = 0; + virtual complex_t response(double normalizedFrequency) const = 0; - virtual int getNumChannels() = 0; - virtual void reset () = 0; - virtual void process (int numSamples, float* const* arrayOfChannels) = 0; - virtual void process (int numSamples, double* const* arrayOfChannels) = 0; + virtual int getNumChannels() = 0; + virtual void reset() = 0; + virtual void process(int numSamples, float* const* arrayOfChannels) = 0; + virtual void process(int numSamples, double* const* arrayOfChannels) = 0; protected: - virtual void doSetParams (const Params& parameters) = 0; + virtual void doSetParams(const Params& parameters) = 0; private: - Params m_params; + Params m_params; }; //------------------------------------------------------------------------------ @@ -132,100 +133,108 @@ template <class DesignClass> class FilterDesignBase : public Filter { public: - Kind getKind () const - { - return m_design.getKind (); - } - - const std::string getName () const - { - return m_design.getName (); - } - - int getNumParams () const - { - return DesignClass::NumParams; - } - - Params getDefaultParams() const - { - return m_design.getDefaultParams(); - } - - ParamInfo getParamInfo (int index) const - { - switch (index) + Kind getKind() const + { + return m_design.getKind(); + } + + const std::string getName() const + { + return m_design.getName(); + } + + int getNumParams() const + { + return DesignClass::NumParams; + } + + Params getDefaultParams() const + { + return m_design.getDefaultParams(); + } + + ParamInfo getParamInfo(int index) const + { + switch (index) + { + case 0: + return m_design.getParamInfo_0(); + case 1: + return m_design.getParamInfo_1(); + case 2: + return m_design.getParamInfo_2(); + case 3: + return m_design.getParamInfo_3(); + case 4: + return m_design.getParamInfo_4(); + case 5: + return m_design.getParamInfo_5(); + case 6: + return m_design.getParamInfo_6(); + case 7: + return m_design.getParamInfo_7(); + }; + + return ParamInfo(); + } + + std::vector<PoleZeroPair> getPoleZeros() const + { + return m_design.getPoleZeros(); + } + + complex_t response(double normalizedFrequency) const { - case 0: return m_design.getParamInfo_0 (); - case 1: return m_design.getParamInfo_1 (); - case 2: return m_design.getParamInfo_2 (); - case 3: return m_design.getParamInfo_3 (); - case 4: return m_design.getParamInfo_4 (); - case 5: return m_design.getParamInfo_5 (); - case 6: return m_design.getParamInfo_6 (); - case 7: return m_design.getParamInfo_7 (); - }; - - return ParamInfo(); - } - - std::vector<PoleZeroPair> getPoleZeros() const - { - return m_design.getPoleZeros(); - } - - complex_t response (double normalizedFrequency) const - { - return m_design.response (normalizedFrequency); - } + return m_design.response(normalizedFrequency); + } protected: - void doSetParams (const Params& parameters) - { - m_design.setParams (parameters); - } + void doSetParams(const Params& parameters) + { + m_design.setParams(parameters); + } protected: - DesignClass m_design; + DesignClass m_design; }; template <class DesignClass, - int Channels = 0, - class StateType = DirectFormII> + int Channels = 0, + class StateType = DirectFormII> class FilterDesign : public FilterDesignBase <DesignClass> { public: - FilterDesign () - { - } - - int getNumChannels() - { - return Channels; - } - - void reset () - { - m_state.reset(); - } - - void process (int numSamples, float* const* arrayOfChannels) - { - m_state.process (numSamples, arrayOfChannels, - FilterDesignBase<DesignClass>::m_design); - } - - void process (int numSamples, double* const* arrayOfChannels) - { - m_state.process (numSamples, arrayOfChannels, - FilterDesignBase<DesignClass>::m_design); - } + FilterDesign() + { + } + + int getNumChannels() + { + return Channels; + } + + void reset() + { + m_state.reset(); + } + + void process(int numSamples, float* const* arrayOfChannels) + { + m_state.process(numSamples, arrayOfChannels, + FilterDesignBase<DesignClass>::m_design); + } + + void process(int numSamples, double* const* arrayOfChannels) + { + m_state.process(numSamples, arrayOfChannels, + FilterDesignBase<DesignClass>::m_design); + } protected: - ChannelsState <Channels, - typename DesignClass::template State <StateType> > m_state; + ChannelsState <Channels, + typename DesignClass::template State <StateType> > m_state; }; //------------------------------------------------------------------------------ @@ -238,30 +247,30 @@ protected: * */ template <class FilterClass, - int Channels = 0, - class StateType = DirectFormII> + int Channels = 0, + class StateType = DirectFormII> class SimpleFilter : public FilterClass { public: - int getNumChannels() - { - return Channels; - } - - void reset () - { - m_state.reset(); - } - - template <typename Sample> - void process (int numSamples, Sample* const* arrayOfChannels) - { - m_state.process (numSamples, arrayOfChannels, *((FilterClass*)this)); - } + int getNumChannels() + { + return Channels; + } + + void reset() + { + m_state.reset(); + } + + template <typename Sample> + void process(int numSamples, Sample* const* arrayOfChannels) + { + m_state.process(numSamples, arrayOfChannels, *((FilterClass*)this)); + } protected: - ChannelsState <Channels, - typename FilterClass::template State <StateType> > m_state; + ChannelsState <Channels, + typename FilterClass::template State <StateType> > m_state; }; } diff --git a/Source/Dsp/Layout.h b/Source/Dsp/Layout.h index 57fc5d4fcfded0ac63c276a60e8010dd6f3b2799..00809d5acf53984be44c12a97767c88c2091c6b6 100644 --- a/Source/Dsp/Layout.h +++ b/Source/Dsp/Layout.h @@ -39,7 +39,8 @@ THE SOFTWARE. #include "Common.h" #include "MathSupplement.h" -namespace Dsp { +namespace Dsp +{ // // Describes a filter as a collection of poles and zeros along with @@ -51,102 +52,102 @@ namespace Dsp { class LayoutBase { public: - LayoutBase () - : m_numPoles (0) - , m_maxPoles (0) - { - } - - LayoutBase (int maxPoles, PoleZeroPair* pairs) - : m_numPoles (0) - , m_maxPoles (maxPoles) - , m_pair (pairs) - { - } - - void setStorage (const LayoutBase& other) - { - m_numPoles = 0; - m_maxPoles = other.m_maxPoles; - m_pair = other.m_pair; - } - - void reset () - { - m_numPoles = 0; - } - - int getNumPoles () const - { - return m_numPoles; - } - - int getMaxPoles () const - { - return m_maxPoles; - } - - void add (const complex_t& pole, const complex_t& zero) - { - assert (!(m_numPoles&1)); // single comes last - assert (!Dsp::is_nan (pole)); - m_pair[m_numPoles/2] = PoleZeroPair (pole, zero); - ++m_numPoles; - } - - void addPoleZeroConjugatePairs (const complex_t pole, - const complex_t zero) - { - assert (!(m_numPoles&1)); // single comes last - assert (!Dsp::is_nan (pole)); - m_pair[m_numPoles/2] = PoleZeroPair ( - pole, zero, std::conj (pole), std::conj (zero)); - m_numPoles += 2; - } - - void add (const ComplexPair& poles, const ComplexPair& zeros) - { - assert (!(m_numPoles&1)); // single comes last - assert (poles.isMatchedPair ()); - assert (zeros.isMatchedPair ()); - m_pair[m_numPoles/2] = PoleZeroPair (poles.first, zeros.first, - poles.second, zeros.second); - m_numPoles += 2; - } - - const PoleZeroPair& getPair (int pairIndex) const - { - assert (pairIndex >= 0 && pairIndex < (m_numPoles+1)/2); - return m_pair[pairIndex]; - } - - const PoleZeroPair& operator[] (int pairIndex) const - { - return getPair (pairIndex); - } - - double getNormalW () const - { - return m_normalW; - } - - double getNormalGain () const - { - return m_normalGain; - } - - void setNormal (double w, double g) - { - m_normalW = w; - m_normalGain = g; - } + LayoutBase() + : m_numPoles(0) + , m_maxPoles(0) + { + } + + LayoutBase(int maxPoles, PoleZeroPair* pairs) + : m_numPoles(0) + , m_maxPoles(maxPoles) + , m_pair(pairs) + { + } + + void setStorage(const LayoutBase& other) + { + m_numPoles = 0; + m_maxPoles = other.m_maxPoles; + m_pair = other.m_pair; + } + + void reset() + { + m_numPoles = 0; + } + + int getNumPoles() const + { + return m_numPoles; + } + + int getMaxPoles() const + { + return m_maxPoles; + } + + void add(const complex_t& pole, const complex_t& zero) + { + assert(!(m_numPoles&1)); // single comes last + assert(!Dsp::is_nan(pole)); + m_pair[m_numPoles/2] = PoleZeroPair(pole, zero); + ++m_numPoles; + } + + void addPoleZeroConjugatePairs(const complex_t pole, + const complex_t zero) + { + assert(!(m_numPoles&1)); // single comes last + assert(!Dsp::is_nan(pole)); + m_pair[m_numPoles/2] = PoleZeroPair( + pole, zero, std::conj(pole), std::conj(zero)); + m_numPoles += 2; + } + + void add(const ComplexPair& poles, const ComplexPair& zeros) + { + assert(!(m_numPoles&1)); // single comes last + assert(poles.isMatchedPair()); + assert(zeros.isMatchedPair()); + m_pair[m_numPoles/2] = PoleZeroPair(poles.first, zeros.first, + poles.second, zeros.second); + m_numPoles += 2; + } + + const PoleZeroPair& getPair(int pairIndex) const + { + assert(pairIndex >= 0 && pairIndex < (m_numPoles+1)/2); + return m_pair[pairIndex]; + } + + const PoleZeroPair& operator[](int pairIndex) const + { + return getPair(pairIndex); + } + + double getNormalW() const + { + return m_normalW; + } + + double getNormalGain() const + { + return m_normalGain; + } + + void setNormal(double w, double g) + { + m_normalW = w; + m_normalGain = g; + } private: - int m_numPoles; - int m_maxPoles; - PoleZeroPair* m_pair; - double m_normalW; - double m_normalGain; + int m_numPoles; + int m_maxPoles; + PoleZeroPair* m_pair; + double m_normalW; + double m_normalGain; }; //------------------------------------------------------------------------------ @@ -156,13 +157,13 @@ template <int MaxPoles> class Layout { public: - operator LayoutBase () - { - return LayoutBase (MaxPoles, m_pairs); - } + operator LayoutBase() + { + return LayoutBase(MaxPoles, m_pairs); + } private: - PoleZeroPair m_pairs[(MaxPoles+1)/2]; + PoleZeroPair m_pairs[(MaxPoles+1)/2]; }; } diff --git a/Source/Dsp/Legendre.cpp b/Source/Dsp/Legendre.cpp index 627182d6f351420497411f66ccf23e5705ed1d37..96d3a2fe86bceaa707c7bf1658674b0c5b0d7acb 100644 --- a/Source/Dsp/Legendre.cpp +++ b/Source/Dsp/Legendre.cpp @@ -41,13 +41,15 @@ THE SOFTWARE. #include <iostream> #include <iomanip> -namespace Dsp { +namespace Dsp +{ -namespace Legendre { +namespace Legendre +{ -static inline double m_sqrt2 () +static inline double m_sqrt2() { - return 1.41421356237309504880; + return 1.41421356237309504880; } // Optimum 'L' Filter algorithm. @@ -68,43 +70,50 @@ static inline double m_sqrt2 () // // (n+1)Pn+1 = (2n+1)xPn - nPn-1 Recursion relation. // -void PolynomialFinderBase::legendre (double *p, int n) +void PolynomialFinderBase::legendre(double* p, int n) { - int i,j; - - if (n == 0) { - p[0] = 1.0; - return; - } - if (n == 1) { - p[0] = 0.0; - p[1] = 1.0; - return; - } - p[0] = -0.5; - p[1] = 0.0; - p[2] = 1.5; - - if (n == 2) return; - - for (i=0;i<=n;i++) { - m_aa[i] = m_bb[i] = 0.0; - } - m_bb[1] = 1.0; - - for (i=3;i<=n;i++) { - for (j=0;j<=i;j++) { - m_aa[j] = m_bb[j]; - m_bb[j] = p[j]; - p[j] = 0.0; + int i,j; + + if (n == 0) + { + p[0] = 1.0; + return; } - for (j=i-2;j>=0;j-=2) { - p[j] -= (i-1)*m_aa[j]/i; + if (n == 1) + { + p[0] = 0.0; + p[1] = 1.0; + return; } - for (j=i-1;j>=0;j-=2) { - p[j+1] += (2*i-1)*m_bb[j]/i; + p[0] = -0.5; + p[1] = 0.0; + p[2] = 1.5; + + if (n == 2) return; + + for (i=0; i<=n; i++) + { + m_aa[i] = m_bb[i] = 0.0; + } + m_bb[1] = 1.0; + + for (i=3; i<=n; i++) + { + for (j=0; j<=i; j++) + { + m_aa[j] = m_bb[j]; + m_bb[j] = p[j]; + p[j] = 0.0; + } + for (j=i-2; j>=0; j-=2) + { + p[j] -= (i-1)*m_aa[j]/i; + } + for (j=i-1; j>=0; j-=2) + { + p[j+1] += (2*i-1)*m_bb[j]/i; + } } - } } // @@ -123,220 +132,242 @@ void PolynomialFinderBase::legendre (double *p, int n) // 6 2 // -void PolynomialFinderBase::solve (int n) +void PolynomialFinderBase::solve(int n) { - assert (n <= m_maxN); - - double c0,c1; - int i,j,k; - - k = (n-1)/2; - // - // form vector of 'a' constants - // - if (n & 1) { // odd - for (i=0;i<=k;i++) { - m_a[i] = (2.0*i+1.0)/(m_sqrt2()*(k+1.0)); + assert(n <= m_maxN); + + double c0,c1; + int i,j,k; + + k = (n-1)/2; + // + // form vector of 'a' constants + // + if (n & 1) // odd + { + for (i=0; i<=k; i++) + { + m_a[i] = (2.0*i+1.0)/(m_sqrt2()*(k+1.0)); + } + } // even + else + { + for (i=0; i<k+1; i++) + { + m_a[i] = 0.0; + } + if (k & 1) + { + for (i=1; i<=k; i+=2) + { + m_a[i] = (2*i+1)/sqrt(double((k+1)*(k+2))); + } + } + else + { + for (i=0; i<=k; i+=2) + { + m_a[i] = (2*i+1)/sqrt(double((k+1)*(k+2))); + } + } } - } // even - else { - for (i=0;i<k+1;i++) { - m_a[i] = 0.0; + for (i=0; i<=n; i++) + { + m_s[i] = 0.0; + m_w[i] = 0.0; } - if (k & 1) { - for (i=1;i<=k;i+=2) { - m_a[i] = (2*i+1)/sqrt(double((k+1)*(k+2))); - } + // + // form s[] = sum of a[i]*P[i] + // + m_s[0] = m_a[0]; + m_s[1] = m_a[1]; + for (i=2; i<=k; i++) + { + legendre(m_p,i); + for (j=0; j<=i; j++) + { + m_s[j] += m_a[i]*m_p[j]; + } } - else { - for (i=0;i<=k;i+=2) { - m_a[i] = (2*i+1)/sqrt(double((k+1)*(k+2))); - } + // + // form v[] = square of s[] + // + for (i=0; i<=2*k+2; i++) + { + m_v[i] = 0.0; } - } - for (i=0;i<=n;i++){ - m_s[i] = 0.0; - m_w[i] = 0.0; - } - // - // form s[] = sum of a[i]*P[i] - // - m_s[0] = m_a[0]; - m_s[1] = m_a[1]; - for (i=2;i<=k;i++) { - legendre(m_p,i); - for (j=0;j<=i;j++) { - m_s[j] += m_a[i]*m_p[j]; + for (i=0; i<=k; i++) + { + for (j=0; j<=k; j++) + { + m_v[i+j] += m_s[i]*m_s[j]; + } } - } - // - // form v[] = square of s[] - // - for (i=0;i<=2*k+2;i++) { - m_v[i] = 0.0; - } - for (i=0;i<=k;i++) { - for (j=0;j<=k;j++) { - m_v[i+j] += m_s[i]*m_s[j]; + // + // modify integrand for even 'n' + // + m_v[2*k+1] = 0.0; + if ((n & 1) == 0) + { + for (i=n; i>=0; i--) + { + m_v[i+1] += m_v[i]; + } } - } - // - // modify integrand for even 'n' - // - m_v[2*k+1] = 0.0; - if ((n & 1) == 0) { - for (i=n;i>=0;i--) { - m_v[i+1] += m_v[i]; + // + // form integral of v[] + // + for (i=n+1; i>=0; i--) + { + m_v[i+1] = m_v[i]/(double)(i+1.0); } - } - // - // form integral of v[] - // - for (i=n+1;i>=0;i--) { - m_v[i+1] = m_v[i]/(double)(i+1.0); - } - m_v[0] = 0.0; - // - // clear s[] for use in computing definite integral - // - for (i=0;i<(n+2);i++){ - m_s[i] = 0.0; - } - m_s[0] = -1.0; - m_s[1] = 2.0; - // - // calculate definite integral - // - for (i=1;i<=n;i++) { - if (i > 1) { - c0 = -m_s[0]; - for (j=1;j<i+1;j++) { - c1 = -m_s[j] + 2.0*m_s[j-1]; - m_s[j-1] = c0; - c0 = c1; - } - c1 = 2.0*m_s[i]; - m_s[i] = c0; - m_s[i+1] = c1; + m_v[0] = 0.0; + // + // clear s[] for use in computing definite integral + // + for (i=0; i<(n+2); i++) + { + m_s[i] = 0.0; } - for (j=i;j>0;j--) { - m_w[j] += (m_v[i]*m_s[j]); + m_s[0] = -1.0; + m_s[1] = 2.0; + // + // calculate definite integral + // + for (i=1; i<=n; i++) + { + if (i > 1) + { + c0 = -m_s[0]; + for (j=1; j<i+1; j++) + { + c1 = -m_s[j] + 2.0*m_s[j-1]; + m_s[j-1] = c0; + c0 = c1; + } + c1 = 2.0*m_s[i]; + m_s[i] = c0; + m_s[i+1] = c1; + } + for (j=i; j>0; j--) + { + m_w[j] += (m_v[i]*m_s[j]); + } } - } - if ((n & 1) == 0) m_w[1] = 0.0; + if ((n & 1) == 0) m_w[1] = 0.0; } //------------------------------------------------------------------------------ -AnalogLowPass::AnalogLowPass () - : m_numPoles (-1) +AnalogLowPass::AnalogLowPass() + : m_numPoles(-1) { - setNormal (0, 1); + setNormal(0, 1); } -void AnalogLowPass::design (int numPoles, - WorkspaceBase* w) +void AnalogLowPass::design(int numPoles, + WorkspaceBase* w) { - if (m_numPoles != numPoles) - { - m_numPoles = numPoles; - - reset (); - - PolynomialFinderBase& poly (w->poly); - RootFinderBase& poles (w->roots); - - poly.solve (numPoles); - int degree = numPoles * 2; - - poles.coef()[0] = 1 + poly.coef()[0]; - poles.coef()[1] = 0; - for (int i = 1; i <= degree; ++i) + if (m_numPoles != numPoles) { - poles.coef()[2*i] = poly.coef()[i] * ((i & 1) ? -1 : 1); - poles.coef()[2*i+1] = 0; + m_numPoles = numPoles; + + reset(); + + PolynomialFinderBase& poly(w->poly); + RootFinderBase& poles(w->roots); + + poly.solve(numPoles); + int degree = numPoles * 2; + + poles.coef()[0] = 1 + poly.coef()[0]; + poles.coef()[1] = 0; + for (int i = 1; i <= degree; ++i) + { + poles.coef()[2*i] = poly.coef()[i] * ((i & 1) ? -1 : 1); + poles.coef()[2*i+1] = 0; + } + poles.solve(degree); + + int j = 0; + for (int i = 0; i < degree; ++i) + if (poles.root()[i].real() <= 0) + poles.root()[j++] = poles.root()[i]; + // sort descending imag() and cut degree in half + poles.sort(degree/2); + + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + complex_t c = poles.root()[i]; + addPoleZeroConjugatePairs(c, infinity()); + } + + if (numPoles & 1) + add(poles.root()[pairs].real(), infinity()); } - poles.solve (degree); - - int j = 0; - for (int i = 0; i < degree; ++i) - if (poles.root()[i].real() <= 0) - poles.root()[j++] = poles.root()[i]; - // sort descending imag() and cut degree in half - poles.sort (degree/2); - - const int pairs = numPoles / 2; - for (int i = 0; i < pairs; ++i) - { - complex_t c = poles.root()[i]; - addPoleZeroConjugatePairs (c, infinity()); - } - - if (numPoles & 1) - add (poles.root()[pairs].real(), infinity()); - } } //------------------------------------------------------------------------------ -void LowPassBase::setup (int order, - double sampleRate, - double cutoffFrequency, - WorkspaceBase* w) +void LowPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + WorkspaceBase* w) { - m_analogProto.design (order, w); + m_analogProto.design(order, w); - LowPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void HighPassBase::setup (int order, - double sampleRate, - double cutoffFrequency, - WorkspaceBase* w) +void HighPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + WorkspaceBase* w) { - m_analogProto.design (order, w); + m_analogProto.design(order, w); - HighPassTransform (cutoffFrequency / sampleRate, - m_digitalProto, - m_analogProto); + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandPassBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - WorkspaceBase* w) +void BandPassBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + WorkspaceBase* w) { - m_analogProto.design (order, w); + m_analogProto.design(order, w); - BandPassTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } -void BandStopBase::setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - WorkspaceBase* w) +void BandStopBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + WorkspaceBase* w) { - m_analogProto.design (order, w); + m_analogProto.design(order, w); - BandStopTransform (centerFrequency / sampleRate, - widthFrequency / sampleRate, - m_digitalProto, - m_analogProto); + BandStopTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); - Cascade::setLayout (m_digitalProto); + Cascade::setLayout(m_digitalProto); } } diff --git a/Source/Dsp/Legendre.h b/Source/Dsp/Legendre.h index ecd577361564cb163bb0262e3dbaef1efcd8da62..8bf5cbeed746b961ef2d8c0d71f2e555ab753276 100644 --- a/Source/Dsp/Legendre.h +++ b/Source/Dsp/Legendre.h @@ -43,71 +43,73 @@ THE SOFTWARE. #include "PoleFilter.h" #include "RootFinder.h" -namespace Dsp { +namespace Dsp +{ /* * Filters with Legendre / "Optimum-L" response characteristics * */ -namespace Legendre { +namespace Legendre +{ // Numerical computation of Legendre "Optimum-L" polynomials class PolynomialFinderBase { public: - void solve (int n); + void solve(int n); - double* coef() - { - return m_w; - } + double* coef() + { + return m_w; + } private: - void legendre (double* p, int n); + void legendre(double* p, int n); protected: - int m_maxN; - double* m_w; - double* m_a; - double* m_p; - double* m_s; - double* m_v; - double* m_aa; - double* m_bb; + int m_maxN; + double* m_w; + double* m_a; + double* m_p; + double* m_s; + double* m_v; + double* m_aa; + double* m_bb; }; template <int maxN> class PolynomialFinder : public PolynomialFinderBase { public: - PolynomialFinder () - { - m_maxN = maxN; - m_w = m_ws; - m_a = m_as; - m_p = m_ps; - m_s = m_ss; - m_v = m_vs; - m_aa = m_aas; - m_bb = m_bbs; - } - - void solve (int n) - { - assert (n <= maxN); - PolynomialFinderBase::solve (n); - } + PolynomialFinder() + { + m_maxN = maxN; + m_w = m_ws; + m_a = m_as; + m_p = m_ps; + m_s = m_ss; + m_v = m_vs; + m_aa = m_aas; + m_bb = m_bbs; + } + + void solve(int n) + { + assert(n <= maxN); + PolynomialFinderBase::solve(n); + } private: - double m_ws [2 * maxN + 1]; - double m_as [ maxN + 1]; - double m_ps [2 * maxN + 1]; - double m_ss [2 * maxN + 1]; - double m_vs [2 * maxN + 4]; - double m_aas [ maxN + 1]; - double m_bbs [ maxN + 1]; + double m_ws [2 * maxN + 1]; + double m_as [ maxN + 1]; + double m_ps [2 * maxN + 1]; + double m_ss [2 * maxN + 1]; + double m_vs [2 * maxN + 4]; + double m_aas [ maxN + 1]; + double m_bbs [ maxN + 1]; }; //------------------------------------------------------------------------------ @@ -116,32 +118,32 @@ private: struct WorkspaceBase { - WorkspaceBase (PolynomialFinderBase* polyBase, - RootFinderBase* rootsBase) - : poly (*polyBase) - , roots (*rootsBase) - { - } + WorkspaceBase(PolynomialFinderBase* polyBase, + RootFinderBase* rootsBase) + : poly(*polyBase) + , roots(*rootsBase) + { + } - PolynomialFinderBase& poly; - RootFinderBase& roots; + PolynomialFinderBase& poly; + RootFinderBase& roots; private: - WorkspaceBase (WorkspaceBase&); - WorkspaceBase& operator= (WorkspaceBase&); + WorkspaceBase(WorkspaceBase&); + WorkspaceBase& operator= (WorkspaceBase&); }; template <int MaxOrder> struct Workspace : WorkspaceBase { - Workspace () - : WorkspaceBase (&m_poly, &m_roots) - { - } + Workspace() + : WorkspaceBase(&m_poly, &m_roots) + { + } private: - PolynomialFinder <MaxOrder> m_poly; - RootFinder <MaxOrder * 2> m_roots; + PolynomialFinder <MaxOrder> m_poly; + RootFinder <MaxOrder * 2> m_roots; }; //------------------------------------------------------------------------------ @@ -151,12 +153,12 @@ private: class AnalogLowPass : public LayoutBase { public: - AnalogLowPass (); + AnalogLowPass(); - void design (const int numPoles, WorkspaceBase* w); + void design(const int numPoles, WorkspaceBase* w); private: - int m_numPoles; + int m_numPoles; }; //------------------------------------------------------------------------------ @@ -165,36 +167,36 @@ private: struct LowPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - WorkspaceBase* w); + void setup(int order, + double sampleRate, + double cutoffFrequency, + WorkspaceBase* w); }; struct HighPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double cutoffFrequency, - WorkspaceBase* w); + void setup(int order, + double sampleRate, + double cutoffFrequency, + WorkspaceBase* w); }; struct BandPassBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - WorkspaceBase* w); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + WorkspaceBase* w); }; struct BandStopBase : PoleFilterBase <AnalogLowPass> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency, - WorkspaceBase* w); + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + WorkspaceBase* w); }; //------------------------------------------------------------------------------ @@ -206,65 +208,65 @@ struct BandStopBase : PoleFilterBase <AnalogLowPass> template <int MaxOrder> struct LowPass : PoleFilter <LowPassBase, MaxOrder> { - void setup (int order, - double sampleRate, - double cutoffFrequency) - { - Workspace <MaxOrder> w; - LowPassBase::setup (order, - sampleRate, - cutoffFrequency, - &w); - } + void setup(int order, + double sampleRate, + double cutoffFrequency) + { + Workspace <MaxOrder> w; + LowPassBase::setup(order, + sampleRate, + cutoffFrequency, + &w); + } }; template <int MaxOrder> struct HighPass : PoleFilter <HighPassBase, MaxOrder> { - void setup (int order, - double sampleRate, - double cutoffFrequency) - { - Workspace <MaxOrder> w; - HighPassBase::setup (order, - sampleRate, - cutoffFrequency, - &w); - } + void setup(int order, + double sampleRate, + double cutoffFrequency) + { + Workspace <MaxOrder> w; + HighPassBase::setup(order, + sampleRate, + cutoffFrequency, + &w); + } }; template <int MaxOrder> struct BandPass : PoleFilter <BandPassBase, MaxOrder, MaxOrder*2> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency) - { - Workspace <MaxOrder> w; - BandPassBase::setup (order, - sampleRate, - centerFrequency, - widthFrequency, - &w); - } + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency) + { + Workspace <MaxOrder> w; + BandPassBase::setup(order, + sampleRate, + centerFrequency, + widthFrequency, + &w); + } }; template <int MaxOrder> struct BandStop : PoleFilter <BandStopBase, MaxOrder, MaxOrder*2> { - void setup (int order, - double sampleRate, - double centerFrequency, - double widthFrequency) - { - Workspace <MaxOrder> w; - BandStopBase::setup (order, - sampleRate, - centerFrequency, - widthFrequency, - &w); - } + void setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency) + { + Workspace <MaxOrder> w; + BandStopBase::setup(order, + sampleRate, + centerFrequency, + widthFrequency, + &w); + } }; //------------------------------------------------------------------------------ @@ -273,108 +275,133 @@ struct BandStop : PoleFilter <BandStopBase, MaxOrder, MaxOrder*2> // Gui-friendly Design layer // -namespace Design { +namespace Design +{ struct TypeIBase : DesignBase { - enum - { - NumParams = 3 - }; - - static int getNumParams () - { - return 3; - } - - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCutoffFrequencyParam (); - } + enum + { + NumParams = 3 + }; + + static int getNumParams() + { + return 3; + } + + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCutoffFrequencyParam(); + } }; template <class FilterClass> struct TypeI : TypeIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2]); + } }; struct TypeIIBase : DesignBase { - enum - { - NumParams = 4 - }; - - static int getNumParams () - { - return 4; - } - - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultCenterFrequencyParam (); - } - - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultBandwidthHzParam (); - } + enum + { + NumParams = 4 + }; + + static int getNumParams() + { + return 4; + } + + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultCenterFrequencyParam(); + } + + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultBandwidthHzParam(); + } }; template <class FilterClass> struct TypeII : TypeIIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (int(params[1]), params[0], params[2], params[3]); - } + void setParams(const Params& params) + { + FilterClass::setup(int(params[1]), params[0], params[2], params[3]); + } }; // Factored kind and name struct LowPassDescription { - static Kind getKind () { return kindLowPass; } - static const char* getName() { return "Legendre Low Pass"; } + static Kind getKind() + { + return kindLowPass; + } + static const char* getName() + { + return "Legendre Low Pass"; + } }; struct HighPassDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Legendre High Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Legendre High Pass"; + } }; struct BandPassDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Legendre Band Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Legendre Band Pass"; + } }; struct BandStopDescription { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "Legendre Band Stop"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "Legendre Band Stop"; + } }; // This glues on the Order parameter template <int MaxOrder, - template <class> class TypeClass, - template <int> class FilterClass> + template <class> class TypeClass, + template <int> class FilterClass> struct OrderBase : TypeClass <FilterClass <MaxOrder> > { - const ParamInfo getParamInfo_1 () const - { - return ParamInfo (idOrder, "Order", "Order", - 1, MaxOrder, 2, - &ParamInfo::Int_toControlValue, - &ParamInfo::Int_toNativeValue, - &ParamInfo::Int_toString); - - } + const ParamInfo getParamInfo_1() const + { + return ParamInfo(idOrder, "Order", "Order", + 1, MaxOrder, 2, + &ParamInfo::Int_toControlValue, + &ParamInfo::Int_toNativeValue, + &ParamInfo::Int_toString); + + } }; //------------------------------------------------------------------------------ @@ -385,25 +412,25 @@ struct OrderBase : TypeClass <FilterClass <MaxOrder> > template <int MaxOrder> struct LowPass : OrderBase <MaxOrder, TypeI, Legendre::LowPass>, - LowPassDescription + LowPassDescription { }; template <int MaxOrder> struct HighPass : OrderBase <MaxOrder, TypeI, Legendre::HighPass>, - HighPassDescription + HighPassDescription { }; template <int MaxOrder> struct BandPass : OrderBase <MaxOrder, TypeII, Legendre::BandPass>, - BandPassDescription + BandPassDescription { }; template <int MaxOrder> struct BandStop : OrderBase <MaxOrder, TypeII, Legendre::BandStop>, - BandStopDescription + BandStopDescription { }; diff --git a/Source/Dsp/MathSupplement.h b/Source/Dsp/MathSupplement.h index 59bbc7973907be2d1d467f5dba47a2312ef7152a..8ab95fbad2515d186fe68f9bb2f40c3a23560a44 100644 --- a/Source/Dsp/MathSupplement.h +++ b/Source/Dsp/MathSupplement.h @@ -38,7 +38,8 @@ THE SOFTWARE. #include "Common.h" -namespace Dsp { +namespace Dsp +{ const double doublePi =3.1415926535897932384626433832795028841971; const double doublePi_2 =1.5707963267948966192313216916397514420986; @@ -49,69 +50,69 @@ typedef std::complex<double> complex_t; typedef std::pair<complex_t, complex_t> complex_pair_t; template<typename Real> -inline std::complex<Real> solve_quadratic_1 (Real a, Real b, Real c) +inline std::complex<Real> solve_quadratic_1(Real a, Real b, Real c) { - return (-b + sqrt (std::complex<Real> (b*b - 4*a*c, 0))) / (2. * a); + return (-b + sqrt(std::complex<Real> (b*b - 4*a*c, 0))) / (2. * a); } template<typename Real> -inline std::complex<Real> solve_quadratic_2 (Real a, Real b, Real c) +inline std::complex<Real> solve_quadratic_2(Real a, Real b, Real c) { - return (-b - sqrt (std::complex<Real> (b*b - 4*a*c, 0))) / (2. * a); + return (-b - sqrt(std::complex<Real> (b*b - 4*a*c, 0))) / (2. * a); } inline const complex_t infinity() { - return complex_t (std::numeric_limits<double>::infinity()); + return complex_t (std::numeric_limits<double>::infinity()); } -inline const complex_t adjust_imag (const complex_t& c) +inline const complex_t adjust_imag(const complex_t& c) { - if (fabs (c.imag()) < 1e-30) - return complex_t (c.real(), 0); - else - return c; + if (fabs(c.imag()) < 1e-30) + return complex_t (c.real(), 0); + else + return c; } template <typename Ty, typename To> -inline std::complex<Ty> addmul (const std::complex<Ty>& c, - Ty v, - const std::complex<To>& c1) +inline std::complex<Ty> addmul(const std::complex<Ty>& c, + Ty v, + const std::complex<To>& c1) { - return std::complex <Ty> ( - c.real() + v * c1.real(), c.imag() + v * c1.imag()); + return std::complex <Ty> ( + c.real() + v * c1.real(), c.imag() + v * c1.imag()); } template <typename Ty> -inline std::complex<Ty> recip (const std::complex<Ty>& c) +inline std::complex<Ty> recip(const std::complex<Ty>& c) { - Ty n = 1.0 / std::norm (c); - - return std::complex<Ty> (n * c.real(), n * c.imag()); + Ty n = 1.0 / std::norm(c); + + return std::complex<Ty> (n * c.real(), n * c.imag()); } template <typename Ty> -inline Ty asinh (Ty x) +inline Ty asinh(Ty x) { - return log (x + std::sqrt (x * x + 1 )); + return log(x + std::sqrt(x * x + 1)); } template <typename Ty> -inline Ty acosh (Ty x) +inline Ty acosh(Ty x) { - return log (x + std::sqrt (x * x - 1)); + return log(x + std::sqrt(x * x - 1)); } template <typename Ty> -inline bool is_nan (Ty v) +inline bool is_nan(Ty v) { - return !(v == v); + return !(v == v); } template <> inline bool is_nan<complex_t> (complex_t v) { - return Dsp::is_nan (v.real()) || Dsp::is_nan (v.imag()); + return Dsp::is_nan(v.real()) || Dsp::is_nan(v.imag()); } //------------------------------------------------------------------------------ @@ -128,25 +129,25 @@ const double anti_denormal_vsa = 1e-8; class DenormalPrevention { public: - DenormalPrevention () - : m_v (anti_denormal_vsa) - { - } - - // small alternating current - inline double ac () - { - return m_v = -m_v; - } - - // small direct current - static inline double dc () - { - return anti_denormal_vsa; - } + DenormalPrevention() + : m_v(anti_denormal_vsa) + { + } + + // small alternating current + inline double ac() + { + return m_v = -m_v; + } + + // small direct current + static inline double dc() + { + return anti_denormal_vsa; + } private: - double m_v; + double m_v; }; } diff --git a/Source/Dsp/Param.cpp b/Source/Dsp/Param.cpp index cc376c65141707c7fc673c0c5b7496db2db78bcf..f7d542a0a5df8bc2db02c0c31c911e259eaa5a20 100644 --- a/Source/Dsp/Param.cpp +++ b/Source/Dsp/Param.cpp @@ -41,265 +41,266 @@ THE SOFTWARE. #include <iostream> #include <iomanip> -namespace Dsp { +namespace Dsp +{ -ParamInfo::ParamInfo () +ParamInfo::ParamInfo() { - throw std::logic_error ("invalid usage of ParamInfo"); + throw std::logic_error("invalid usage of ParamInfo"); } -double ParamInfo::clamp (double nativeValue) const +double ParamInfo::clamp(double nativeValue) const { - const double minValue = toNativeValue (0); - const double maxValue = toNativeValue (1); - if (nativeValue < minValue) - nativeValue = minValue; - else if (nativeValue > maxValue) - nativeValue = maxValue; - return nativeValue; + const double minValue = toNativeValue(0); + const double maxValue = toNativeValue(1); + if (nativeValue < minValue) + nativeValue = minValue; + else if (nativeValue > maxValue) + nativeValue = maxValue; + return nativeValue; } //------------------------------------------------------------------------------ -double ParamInfo::Int_toControlValue (double nativeValue) const +double ParamInfo::Int_toControlValue(double nativeValue) const { - return (nativeValue - m_arg1) / (m_arg2 - m_arg1); + return (nativeValue - m_arg1) / (m_arg2 - m_arg1); } -double ParamInfo::Int_toNativeValue (double controlValue) const +double ParamInfo::Int_toNativeValue(double controlValue) const { - return std::floor (m_arg1 + controlValue * (m_arg2 - m_arg1) + 0.5); + return std::floor(m_arg1 + controlValue * (m_arg2 - m_arg1) + 0.5); } //------------------------------------------------------------------------------ -double ParamInfo::Real_toControlValue (double nativeValue) const +double ParamInfo::Real_toControlValue(double nativeValue) const { - return (nativeValue - m_arg1) / (m_arg2 - m_arg1); + return (nativeValue - m_arg1) / (m_arg2 - m_arg1); } -double ParamInfo::Real_toNativeValue (double controlValue) const +double ParamInfo::Real_toNativeValue(double controlValue) const { - return m_arg1 + controlValue * (m_arg2 - m_arg1); + return m_arg1 + controlValue * (m_arg2 - m_arg1); } //------------------------------------------------------------------------------ -double ParamInfo::Log_toControlValue (double nativeValue) const +double ParamInfo::Log_toControlValue(double nativeValue) const { - const double base = 1.5; - double l0 = log (m_arg1) / log (base); - double l1 = log (m_arg2) / log (base); - return (log (nativeValue) / log(base) - l0) / (l1 - l0); + const double base = 1.5; + double l0 = log(m_arg1) / log(base); + double l1 = log(m_arg2) / log(base); + return (log(nativeValue) / log(base) - l0) / (l1 - l0); } -double ParamInfo::Log_toNativeValue (double controlValue) const +double ParamInfo::Log_toNativeValue(double controlValue) const { - const double base = 1.5; - double l0 = log (m_arg1) / log (base); - double l1 = log (m_arg2) / log (base); - return pow (base, l0 + controlValue * (l1 - l0)); + const double base = 1.5; + double l0 = log(m_arg1) / log(base); + double l1 = log(m_arg2) / log(base); + return pow(base, l0 + controlValue * (l1 - l0)); } //------------------------------------------------------------------------------ -double ParamInfo::Pow2_toControlValue (double nativeValue) const +double ParamInfo::Pow2_toControlValue(double nativeValue) const { - return ((log (nativeValue) / log (2.)) - m_arg1) / (m_arg2 - m_arg1); + return ((log(nativeValue) / log(2.)) - m_arg1) / (m_arg2 - m_arg1); } -double ParamInfo::Pow2_toNativeValue (double controlValue) const +double ParamInfo::Pow2_toNativeValue(double controlValue) const { - return pow (2., (controlValue * (m_arg2 - m_arg1)) + m_arg1); + return pow(2., (controlValue * (m_arg2 - m_arg1)) + m_arg1); } //------------------------------------------------------------------------------ -std::string ParamInfo::Int_toString (double nativeValue) const +std::string ParamInfo::Int_toString(double nativeValue) const { - std::ostringstream os; - os << int (nativeValue); - return os.str(); + std::ostringstream os; + os << int (nativeValue); + return os.str(); } -std::string ParamInfo::Hz_toString (double nativeValue) const +std::string ParamInfo::Hz_toString(double nativeValue) const { - std::ostringstream os; - os << int (nativeValue) << " Hz"; - return os.str(); + std::ostringstream os; + os << int (nativeValue) << " Hz"; + return os.str(); } -std::string ParamInfo::Real_toString (double nativeValue) const +std::string ParamInfo::Real_toString(double nativeValue) const { - std::ostringstream os; - os << std::fixed << std::setprecision(3) << nativeValue; - return os.str(); + std::ostringstream os; + os << std::fixed << std::setprecision(3) << nativeValue; + return os.str(); } -std::string ParamInfo::Db_toString (double nativeValue) const +std::string ParamInfo::Db_toString(double nativeValue) const { - const double af = fabs (nativeValue); - int prec; - if (af < 1) - prec = 3; - else if (af < 10) - prec = 2; - else - prec = 1; - std::ostringstream os; - os << std::fixed << std::setprecision (prec) << nativeValue << " dB"; - return os.str(); + const double af = fabs(nativeValue); + int prec; + if (af < 1) + prec = 3; + else if (af < 10) + prec = 2; + else + prec = 1; + std::ostringstream os; + os << std::fixed << std::setprecision(prec) << nativeValue << " dB"; + return os.str(); } //------------------------------------------------------------------------------ -ParamInfo ParamInfo::defaultSampleRateParam () +ParamInfo ParamInfo::defaultSampleRateParam() { - return ParamInfo (idSampleRate, "Fs", "Sample Rate", + return ParamInfo(idSampleRate, "Fs", "Sample Rate", 11025, 192000, 44100, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, &ParamInfo::Hz_toString); } -ParamInfo ParamInfo::defaultCutoffFrequencyParam () +ParamInfo ParamInfo::defaultCutoffFrequencyParam() { - return ParamInfo (idFrequency, "Fc", "Cutoff Frequency", + return ParamInfo(idFrequency, "Fc", "Cutoff Frequency", 10, 22040, 2000, &ParamInfo::Log_toControlValue, &ParamInfo::Log_toNativeValue, &ParamInfo::Hz_toString); } -ParamInfo ParamInfo::defaultCenterFrequencyParam () +ParamInfo ParamInfo::defaultCenterFrequencyParam() { - return ParamInfo (idFrequency, "Fc", "Center Frequency", + return ParamInfo(idFrequency, "Fc", "Center Frequency", 10, 22040, 2000, &ParamInfo::Log_toControlValue, &ParamInfo::Log_toNativeValue, &ParamInfo::Hz_toString); } -ParamInfo ParamInfo::defaultQParam () +ParamInfo ParamInfo::defaultQParam() { - return ParamInfo (idQ, "Q", "Resonance", + return ParamInfo(idQ, "Q", "Resonance", -4, 4, 1, &ParamInfo::Pow2_toControlValue, &ParamInfo::Pow2_toNativeValue, &ParamInfo::Real_toString); } -ParamInfo ParamInfo::defaultBandwidthParam () +ParamInfo ParamInfo::defaultBandwidthParam() { - return ParamInfo (idBandwidth, "BW", "Bandwidth (Octaves)", + return ParamInfo(idBandwidth, "BW", "Bandwidth (Octaves)", -4, 4, 1, &ParamInfo::Pow2_toControlValue, &ParamInfo::Pow2_toNativeValue, &ParamInfo::Real_toString); } -ParamInfo ParamInfo::defaultBandwidthHzParam () +ParamInfo ParamInfo::defaultBandwidthHzParam() { - return ParamInfo (idBandwidthHz, "BW", "Bandwidth (Hz)", + return ParamInfo(idBandwidthHz, "BW", "Bandwidth (Hz)", 10, 22040, 1720, &ParamInfo::Log_toControlValue, &ParamInfo::Log_toNativeValue, &ParamInfo::Hz_toString); } -ParamInfo ParamInfo::defaultGainParam () +ParamInfo ParamInfo::defaultGainParam() { - return ParamInfo (idGain, "Gain", "Gain", + return ParamInfo(idGain, "Gain", "Gain", -24, 24, -6, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, &ParamInfo::Db_toString); } -ParamInfo ParamInfo::defaultSlopeParam () +ParamInfo ParamInfo::defaultSlopeParam() { - return ParamInfo (idSlope, "Slope", "Slope", + return ParamInfo(idSlope, "Slope", "Slope", -2, 2, 1, &ParamInfo::Pow2_toControlValue, &ParamInfo::Pow2_toNativeValue, &ParamInfo::Real_toString); } -ParamInfo ParamInfo::defaultRippleDbParam () +ParamInfo ParamInfo::defaultRippleDbParam() { - return ParamInfo (idRippleDb, "Ripple", "Ripple dB", + return ParamInfo(idRippleDb, "Ripple", "Ripple dB", 0.001, 12, 0.01, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, &ParamInfo::Db_toString); } -ParamInfo ParamInfo::defaultStopDbParam () +ParamInfo ParamInfo::defaultStopDbParam() { - return ParamInfo (idStopDb, "Stop", "Stopband dB", + return ParamInfo(idStopDb, "Stop", "Stopband dB", 3, 60, 48, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, &ParamInfo::Db_toString); } -ParamInfo ParamInfo::defaultRolloffParam () +ParamInfo ParamInfo::defaultRolloffParam() { - return ParamInfo (idRolloff, "W", "Transition Width", + return ParamInfo(idRolloff, "W", "Transition Width", -16, 4, 0, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, &ParamInfo::Real_toString); } -ParamInfo ParamInfo::defaultPoleRhoParam () +ParamInfo ParamInfo::defaultPoleRhoParam() { - return ParamInfo (idPoleRho, "Pd", "Pole Distance", + return ParamInfo(idPoleRho, "Pd", "Pole Distance", 0, 1, 0.5, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, &ParamInfo::Real_toString); } -ParamInfo ParamInfo::defaultPoleThetaParam () +ParamInfo ParamInfo::defaultPoleThetaParam() { - return ParamInfo (idPoleTheta, "Pa", "Pole Angle", + return ParamInfo(idPoleTheta, "Pa", "Pole Angle", 0, doublePi, doublePi/2, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, &ParamInfo::Real_toString); } -ParamInfo ParamInfo::defaultZeroRhoParam () +ParamInfo ParamInfo::defaultZeroRhoParam() { - return ParamInfo (idZeroRho, "Pd", "Zero Distance", + return ParamInfo(idZeroRho, "Pd", "Zero Distance", 0, 1, 0.5, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, &ParamInfo::Real_toString); } -ParamInfo ParamInfo::defaultZeroThetaParam () +ParamInfo ParamInfo::defaultZeroThetaParam() { - return ParamInfo (idZeroTheta, "Pa", "Zero Angle", + return ParamInfo(idZeroTheta, "Pa", "Zero Angle", 0, doublePi, doublePi/2, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, &ParamInfo::Real_toString); } -ParamInfo ParamInfo::defaultPoleRealParam () +ParamInfo ParamInfo::defaultPoleRealParam() { - return ParamInfo (idPoleReal, "A1", "Pole Real", + return ParamInfo(idPoleReal, "A1", "Pole Real", -1, 1, 0.25, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, &ParamInfo::Real_toString); } -ParamInfo ParamInfo::defaultZeroRealParam () +ParamInfo ParamInfo::defaultZeroRealParam() { - return ParamInfo (idZeroReal, "B1", "Zero Real", + return ParamInfo(idZeroReal, "B1", "Zero Real", -1, 1, -0.25, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, diff --git a/Source/Dsp/Params.h b/Source/Dsp/Params.h index 882e554c23b8860f79fe6824eef999a7d217a346..cce3868e6464698263ef4152a06569ffee37bcd0 100644 --- a/Source/Dsp/Params.h +++ b/Source/Dsp/Params.h @@ -39,7 +39,8 @@ THE SOFTWARE. #include "Common.h" #include "Types.h" -namespace Dsp { +namespace Dsp +{ /* * System for abstracting parameterizable filter specifications. @@ -54,51 +55,51 @@ namespace Dsp { // Unique IDs to help identify parameters enum ParamID { - idSampleRate, - idFrequency, - idQ, - idBandwidth, - idBandwidthHz, - idGain, - idSlope, - idOrder, - idRippleDb, - idStopDb, - idRolloff, - - idPoleRho, - idPoleTheta, - idZeroRho, - idZeroTheta, - - idPoleReal, - idZeroReal + idSampleRate, + idFrequency, + idQ, + idBandwidth, + idBandwidthHz, + idGain, + idSlope, + idOrder, + idRippleDb, + idStopDb, + idRolloff, + + idPoleRho, + idPoleTheta, + idZeroRho, + idZeroTheta, + + idPoleReal, + idZeroReal }; enum { - maxParameters = 8 + maxParameters = 8 }; struct Params { - void clear () - { - for (int i = 0; i < maxParameters; ++i) - value[i] = 0; - } - - double& operator[] (int index) - { - return value[index]; - } - - const double& operator[] (int index) const - { - return value[index]; - } - - double value[maxParameters]; + void clear() + { + for (int i = 0; i < maxParameters; ++i) + value[i] = 0; + } + + double& operator[](int index) + { + return value[index]; + } + + const double& operator[](int index) const + { + return value[index]; + } + + double value[maxParameters]; }; // @@ -108,14 +109,14 @@ struct Params class ParamInfo { public: - typedef double (ParamInfo::*toControlValue_t) (double) const; - typedef double (ParamInfo::*toNativeValue_t) (double) const; - typedef std::string (ParamInfo::*toString_t) (double) const; + typedef double(ParamInfo::*toControlValue_t)(double) const; + typedef double(ParamInfo::*toNativeValue_t)(double) const; + typedef std::string(ParamInfo::*toString_t)(double) const; - // dont use this one - ParamInfo (); // throws std::logic_error + // dont use this one + ParamInfo(); // throws std::logic_error - ParamInfo (ParamID id, + ParamInfo(ParamID id, const char* szLabel, const char* szName, double arg1, @@ -124,119 +125,119 @@ public: toControlValue_t toControlValue_proc, toNativeValue_t toNativeValue_proc, toString_t toString_proc) - : m_id (id) - , m_szLabel (szLabel) - , m_szName (szName) - , m_arg1 (arg1) - , m_arg2 (arg2) - , m_defaultNativeValue (defaultNativeValue) - , m_toControlValue (toControlValue_proc) - , m_toNativeValue (toNativeValue_proc) - , m_toString (toString_proc) - { - } - - // Used to identify well-known parameters (like cutoff frequency) - ParamID getId () const - { - return m_id; - } - - // Returns a short label suitable for placement on a control - const char* getLabel () const - { - return m_szLabel; - } - - // Returns the full name - const char* getName () const - { - return m_szName; - } - - double getDefaultValue () const - { - return m_defaultNativeValue; - } - - // - // Control value is always in the range [0..1] - // - double toControlValue (double nativeValue) const - { - return (this->*m_toControlValue) (nativeValue); - } - - // - // Native value is in filter-specific units. For example, - // cutoff frequency would probably be in Hertz. - // - double toNativeValue (double controlValue) const - { - return (this->*m_toNativeValue) (controlValue); - } - - std::string toString (double nativeValue) const - { - return (this->*m_toString) (nativeValue); - } - - double clamp (double nativeValue) const; - - // - // These routines are used as function pointers when - // constructing the various ParamInfo used by filters - // - - double Int_toControlValue (double nativeValue) const; - double Int_toNativeValue (double controlValue) const; - - double Real_toControlValue (double nativeValue) const; - double Real_toNativeValue (double controlValue) const; - - double Log_toControlValue (double nativeValue) const; - double Log_toNativeValue (double controlValue) const; - - double Pow2_toControlValue (double nativeValue) const; - double Pow2_toNativeValue (double controlValue) const; - - std::string Int_toString (double nativeValue) const; - std::string Hz_toString (double nativeValue) const; - std::string Real_toString (double nativeValue) const; - std::string Db_toString (double nativeValue) const; - - // - // Creates the specified ParamInfo - // - - static ParamInfo defaultSampleRateParam (); - static ParamInfo defaultCutoffFrequencyParam (); - static ParamInfo defaultCenterFrequencyParam (); - static ParamInfo defaultQParam (); - static ParamInfo defaultBandwidthParam (); - static ParamInfo defaultBandwidthHzParam (); - static ParamInfo defaultGainParam (); - static ParamInfo defaultSlopeParam (); - static ParamInfo defaultRippleDbParam (); - static ParamInfo defaultStopDbParam (); - static ParamInfo defaultRolloffParam (); - static ParamInfo defaultPoleRhoParam (); - static ParamInfo defaultPoleThetaParam (); - static ParamInfo defaultZeroRhoParam (); - static ParamInfo defaultZeroThetaParam (); - static ParamInfo defaultPoleRealParam (); - static ParamInfo defaultZeroRealParam (); + : m_id(id) + , m_szLabel(szLabel) + , m_szName(szName) + , m_arg1(arg1) + , m_arg2(arg2) + , m_defaultNativeValue(defaultNativeValue) + , m_toControlValue(toControlValue_proc) + , m_toNativeValue(toNativeValue_proc) + , m_toString(toString_proc) + { + } + + // Used to identify well-known parameters (like cutoff frequency) + ParamID getId() const + { + return m_id; + } + + // Returns a short label suitable for placement on a control + const char* getLabel() const + { + return m_szLabel; + } + + // Returns the full name + const char* getName() const + { + return m_szName; + } + + double getDefaultValue() const + { + return m_defaultNativeValue; + } + + // + // Control value is always in the range [0..1] + // + double toControlValue(double nativeValue) const + { + return (this->*m_toControlValue)(nativeValue); + } + + // + // Native value is in filter-specific units. For example, + // cutoff frequency would probably be in Hertz. + // + double toNativeValue(double controlValue) const + { + return (this->*m_toNativeValue)(controlValue); + } + + std::string toString(double nativeValue) const + { + return (this->*m_toString)(nativeValue); + } + + double clamp(double nativeValue) const; + + // + // These routines are used as function pointers when + // constructing the various ParamInfo used by filters + // + + double Int_toControlValue(double nativeValue) const; + double Int_toNativeValue(double controlValue) const; + + double Real_toControlValue(double nativeValue) const; + double Real_toNativeValue(double controlValue) const; + + double Log_toControlValue(double nativeValue) const; + double Log_toNativeValue(double controlValue) const; + + double Pow2_toControlValue(double nativeValue) const; + double Pow2_toNativeValue(double controlValue) const; + + std::string Int_toString(double nativeValue) const; + std::string Hz_toString(double nativeValue) const; + std::string Real_toString(double nativeValue) const; + std::string Db_toString(double nativeValue) const; + + // + // Creates the specified ParamInfo + // + + static ParamInfo defaultSampleRateParam(); + static ParamInfo defaultCutoffFrequencyParam(); + static ParamInfo defaultCenterFrequencyParam(); + static ParamInfo defaultQParam(); + static ParamInfo defaultBandwidthParam(); + static ParamInfo defaultBandwidthHzParam(); + static ParamInfo defaultGainParam(); + static ParamInfo defaultSlopeParam(); + static ParamInfo defaultRippleDbParam(); + static ParamInfo defaultStopDbParam(); + static ParamInfo defaultRolloffParam(); + static ParamInfo defaultPoleRhoParam(); + static ParamInfo defaultPoleThetaParam(); + static ParamInfo defaultZeroRhoParam(); + static ParamInfo defaultZeroThetaParam(); + static ParamInfo defaultPoleRealParam(); + static ParamInfo defaultZeroRealParam(); private: - ParamID m_id; - const char* m_szLabel; - const char* m_szName; - double m_arg1; - double m_arg2; - double m_defaultNativeValue; - toControlValue_t m_toControlValue; - toNativeValue_t m_toNativeValue; - toString_t m_toString; + ParamID m_id; + const char* m_szLabel; + const char* m_szName; + double m_arg1; + double m_arg2; + double m_defaultNativeValue; + toControlValue_t m_toControlValue; + toNativeValue_t m_toNativeValue; + toString_t m_toString; }; } diff --git a/Source/Dsp/PoleFilter.cpp b/Source/Dsp/PoleFilter.cpp index 41246ed0755f7fdf2d3328fdb9c41659b279e57d..9ea4086f5cdf208563bb925a2ce79906ea3e7425 100644 --- a/Source/Dsp/PoleFilter.cpp +++ b/Source/Dsp/PoleFilter.cpp @@ -36,301 +36,302 @@ THE SOFTWARE. #include "Common.h" #include "PoleFilter.h" -namespace Dsp { +namespace Dsp +{ //------------------------------------------------------------------------------ -complex_t LowPassTransform::transform (complex_t c) +complex_t LowPassTransform::transform(complex_t c) { - if (c == infinity()) - return complex_t (-1, 0); - - // frequency transform - c = f * c; - - // bilinear low pass transform - return (1. + c) / (1. - c); + if (c == infinity()) + return complex_t (-1, 0); + + // frequency transform + c = f * c; + + // bilinear low pass transform + return (1. + c) / (1. - c); } -LowPassTransform::LowPassTransform (double fc, - LayoutBase& digital, - LayoutBase const& analog) +LowPassTransform::LowPassTransform(double fc, + LayoutBase& digital, + LayoutBase const& analog) { - digital.reset (); - - // prewarp - f = tan (doublePi * fc); - - const int numPoles = analog.getNumPoles (); - const int pairs = numPoles / 2; - for (int i = 0; i < pairs; ++i) - { - const PoleZeroPair& pair = analog[i]; - digital.addPoleZeroConjugatePairs (transform (pair.poles.first), - transform (pair.zeros.first)); - } - - if (numPoles & 1) - { - const PoleZeroPair& pair = analog[pairs]; - digital.add (transform (pair.poles.first), - transform (pair.zeros.first)); - } - - digital.setNormal (analog.getNormalW(), - analog.getNormalGain()); + digital.reset(); + + // prewarp + f = tan(doublePi * fc); + + const int numPoles = analog.getNumPoles(); + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + const PoleZeroPair& pair = analog[i]; + digital.addPoleZeroConjugatePairs(transform(pair.poles.first), + transform(pair.zeros.first)); + } + + if (numPoles & 1) + { + const PoleZeroPair& pair = analog[pairs]; + digital.add(transform(pair.poles.first), + transform(pair.zeros.first)); + } + + digital.setNormal(analog.getNormalW(), + analog.getNormalGain()); } //------------------------------------------------------------------------------ -complex_t HighPassTransform::transform (complex_t c) +complex_t HighPassTransform::transform(complex_t c) { - if (c == infinity()) - return complex_t (1, 0); + if (c == infinity()) + return complex_t (1, 0); - // frequency transform - c = f * c; + // frequency transform + c = f * c; - // bilinear high pass transform - return - (1. + c) / (1. - c); + // bilinear high pass transform + return - (1. + c) / (1. - c); } -HighPassTransform::HighPassTransform (double fc, - LayoutBase& digital, - LayoutBase const& analog) +HighPassTransform::HighPassTransform(double fc, + LayoutBase& digital, + LayoutBase const& analog) { - digital.reset (); - - // prewarp - f = 1. / tan (doublePi * fc); - - const int numPoles = analog.getNumPoles (); - const int pairs = numPoles / 2; - for (int i = 0; i < pairs; ++i) - { - const PoleZeroPair& pair = analog[i]; - digital.addPoleZeroConjugatePairs (transform (pair.poles.first), - transform (pair.zeros.first)); - } - - if (numPoles & 1) - { - const PoleZeroPair& pair = analog[pairs]; - digital.add (transform (pair.poles.first), - transform (pair.zeros.first)); - } - - digital.setNormal (doublePi - analog.getNormalW(), - analog.getNormalGain()); + digital.reset(); + + // prewarp + f = 1. / tan(doublePi * fc); + + const int numPoles = analog.getNumPoles(); + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + const PoleZeroPair& pair = analog[i]; + digital.addPoleZeroConjugatePairs(transform(pair.poles.first), + transform(pair.zeros.first)); + } + + if (numPoles & 1) + { + const PoleZeroPair& pair = analog[pairs]; + digital.add(transform(pair.poles.first), + transform(pair.zeros.first)); + } + + digital.setNormal(doublePi - analog.getNormalW(), + analog.getNormalGain()); } //------------------------------------------------------------------------------ -BandPassTransform::BandPassTransform (double fc, - double fw, - LayoutBase& digital, - LayoutBase const& analog) +BandPassTransform::BandPassTransform(double fc, + double fw, + LayoutBase& digital, + LayoutBase const& analog) { - // handle degenerate cases efficiently - // THIS DOESNT WORK because the cascade states won't match + // handle degenerate cases efficiently + // THIS DOESNT WORK because the cascade states won't match #if 0 - const double fw_2 = fw / 2; - if (fc - fw_2 < 0) - { - LowPassTransform::transform (fc + fw_2, digital, analog); - } - else if (fc + fw_2 >= 0.5) - { - HighPassTransform::transform (fc - fw_2, digital, analog); - } - else + const double fw_2 = fw / 2; + if (fc - fw_2 < 0) + { + LowPassTransform::transform(fc + fw_2, digital, analog); + } + else if (fc + fw_2 >= 0.5) + { + HighPassTransform::transform(fc - fw_2, digital, analog); + } + else #endif - digital.reset (); - - const double ww = 2 * doublePi * fw; - - // pre-calcs - wc2 = 2 * doublePi * fc - (ww / 2); - wc = wc2 + ww; - - // what is this crap? - if (wc2 < 1e-8) - wc2 = 1e-8; - if (wc > doublePi-1e-8) - wc = doublePi-1e-8; - - a = cos ((wc + wc2) * 0.5) / - cos ((wc - wc2) * 0.5); - b = 1 / tan ((wc - wc2) * 0.5); - a2 = a * a; - b2 = b * b; - ab = a * b; - ab_2 = 2 * ab; - - const int numPoles = analog.getNumPoles (); - const int pairs = numPoles / 2; - for (int i = 0; i < pairs; ++i) - { - const PoleZeroPair& pair = analog[i]; - ComplexPair p1 = transform (pair.poles.first); - ComplexPair z1 = transform (pair.zeros.first); - - // - // Optimize out the calculations for conjugates for Release builds - // + digital.reset(); + + const double ww = 2 * doublePi * fw; + + // pre-calcs + wc2 = 2 * doublePi * fc - (ww / 2); + wc = wc2 + ww; + + // what is this crap? + if (wc2 < 1e-8) + wc2 = 1e-8; + if (wc > doublePi-1e-8) + wc = doublePi-1e-8; + + a = cos((wc + wc2) * 0.5) / + cos((wc - wc2) * 0.5); + b = 1 / tan((wc - wc2) * 0.5); + a2 = a * a; + b2 = b * b; + ab = a * b; + ab_2 = 2 * ab; + + const int numPoles = analog.getNumPoles(); + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + const PoleZeroPair& pair = analog[i]; + ComplexPair p1 = transform(pair.poles.first); + ComplexPair z1 = transform(pair.zeros.first); + + // + // Optimize out the calculations for conjugates for Release builds + // #ifndef NDEBUG - ComplexPair p2 = transform (pair.poles.second); - assert (p2.first == std::conj (p1.first)); - assert (p2.second == std::conj (p1.second)); + ComplexPair p2 = transform(pair.poles.second); + assert(p2.first == std::conj(p1.first)); + assert(p2.second == std::conj(p1.second)); #endif - digital.addPoleZeroConjugatePairs (p1.first, z1.first); - digital.addPoleZeroConjugatePairs (p1.second, z1.second); - } + digital.addPoleZeroConjugatePairs(p1.first, z1.first); + digital.addPoleZeroConjugatePairs(p1.second, z1.second); + } - if (numPoles & 1) - { - ComplexPair poles = transform (analog[pairs].poles.first); - ComplexPair zeros = transform (analog[pairs].zeros.first); + if (numPoles & 1) + { + ComplexPair poles = transform(analog[pairs].poles.first); + ComplexPair zeros = transform(analog[pairs].zeros.first); - digital.add (poles, zeros); - } + digital.add(poles, zeros); + } - double wn = analog.getNormalW(); - digital.setNormal (2 * atan (sqrt (tan ((wc + wn)* 0.5) * tan((wc2 + wn)* 0.5))), - analog.getNormalGain()); + double wn = analog.getNormalW(); + digital.setNormal(2 * atan(sqrt(tan((wc + wn)* 0.5) * tan((wc2 + wn)* 0.5))), + analog.getNormalGain()); } -ComplexPair BandPassTransform::transform (complex_t c) +ComplexPair BandPassTransform::transform(complex_t c) { - if (c == infinity()) - return ComplexPair (-1, 1); + if (c == infinity()) + return ComplexPair(-1, 1); - c = (1. + c) / (1. - c); // bilinear + c = (1. + c) / (1. - c); // bilinear - complex_t v = 0; - v = addmul (v, 4 * (b2 * (a2 - 1) + 1), c); - v += 8 * (b2 * (a2 - 1) - 1); - v *= c; - v += 4 * (b2 * (a2 - 1) + 1); - v = std::sqrt (v); + complex_t v = 0; + v = addmul(v, 4 * (b2 * (a2 - 1) + 1), c); + v += 8 * (b2 * (a2 - 1) - 1); + v *= c; + v += 4 * (b2 * (a2 - 1) + 1); + v = std::sqrt(v); - complex_t u = -v; - u = addmul (u, ab_2, c); - u += ab_2; + complex_t u = -v; + u = addmul(u, ab_2, c); + u += ab_2; - v = addmul (v, ab_2, c); - v += ab_2; + v = addmul(v, ab_2, c); + v += ab_2; - complex_t d = 0; - d = addmul (d, 2 * (b - 1), c) + 2 * (1 + b); + complex_t d = 0; + d = addmul(d, 2 * (b - 1), c) + 2 * (1 + b); - return ComplexPair (u/d, v/d); + return ComplexPair(u/d, v/d); } //------------------------------------------------------------------------------ -BandStopTransform::BandStopTransform (double fc, - double fw, - LayoutBase& digital, - LayoutBase const& analog) +BandStopTransform::BandStopTransform(double fc, + double fw, + LayoutBase& digital, + LayoutBase const& analog) { - digital.reset (); - - const double ww = 2 * doublePi * fw; - - wc2 = 2 * doublePi * fc - (ww / 2); - wc = wc2 + ww; - - // this is crap - if (wc2 < 1e-8) - wc2 = 1e-8; - if (wc > doublePi-1e-8) - wc = doublePi-1e-8; - - a = cos ((wc + wc2) * .5) / - cos ((wc - wc2) * .5); - b = tan ((wc - wc2) * .5); - a2 = a * a; - b2 = b * b; - - const int numPoles = analog.getNumPoles (); - const int pairs = numPoles / 2; - for (int i = 0; i < pairs; ++i) - { - const PoleZeroPair& pair = analog[i]; - ComplexPair p = transform (pair.poles.first); - ComplexPair z = transform (pair.zeros.first); - - // - // Optimize out the calculations for conjugates for Release builds - // + digital.reset(); + + const double ww = 2 * doublePi * fw; + + wc2 = 2 * doublePi * fc - (ww / 2); + wc = wc2 + ww; + + // this is crap + if (wc2 < 1e-8) + wc2 = 1e-8; + if (wc > doublePi-1e-8) + wc = doublePi-1e-8; + + a = cos((wc + wc2) * .5) / + cos((wc - wc2) * .5); + b = tan((wc - wc2) * .5); + a2 = a * a; + b2 = b * b; + + const int numPoles = analog.getNumPoles(); + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + const PoleZeroPair& pair = analog[i]; + ComplexPair p = transform(pair.poles.first); + ComplexPair z = transform(pair.zeros.first); + + // + // Optimize out the calculations for conjugates for Release builds + // #ifdef NDEBUG - // trick to get the conjugate - if (z.second == z.first) - z.second = std::conj (z.first); + // trick to get the conjugate + if (z.second == z.first) + z.second = std::conj(z.first); #else - // Do the full calculation to verify correctness - ComplexPair pc = transform (analog[i].poles.second); - ComplexPair zc = transform (analog[i].zeros.second); + // Do the full calculation to verify correctness + ComplexPair pc = transform(analog[i].poles.second); + ComplexPair zc = transform(analog[i].zeros.second); - // get the conjugates into pc and zc - if (zc.first == z.first) - std::swap (zc.first, zc.second); + // get the conjugates into pc and zc + if (zc.first == z.first) + std::swap(zc.first, zc.second); - assert (pc.first == std::conj (p.first)); - assert (pc.second == std::conj (p.second)); - assert (zc.first == std::conj (z.first)); - assert (zc.second == std::conj (z.second)); + assert(pc.first == std::conj(p.first)); + assert(pc.second == std::conj(p.second)); + assert(zc.first == std::conj(z.first)); + assert(zc.second == std::conj(z.second)); #endif - digital.addPoleZeroConjugatePairs (p.first, z.first); - digital.addPoleZeroConjugatePairs (p.second, z.second); - } + digital.addPoleZeroConjugatePairs(p.first, z.first); + digital.addPoleZeroConjugatePairs(p.second, z.second); + } - if (numPoles & 1) - { - ComplexPair poles = transform (analog[pairs].poles.first); - ComplexPair zeros = transform (analog[pairs].zeros.first); + if (numPoles & 1) + { + ComplexPair poles = transform(analog[pairs].poles.first); + ComplexPair zeros = transform(analog[pairs].zeros.first); - digital.add (poles, zeros); - } + digital.add(poles, zeros); + } - if (fc < 0.25) - digital.setNormal (doublePi, analog.getNormalGain()); - else - digital.setNormal (0, analog.getNormalGain()); + if (fc < 0.25) + digital.setNormal(doublePi, analog.getNormalGain()); + else + digital.setNormal(0, analog.getNormalGain()); } -ComplexPair BandStopTransform::transform (complex_t c) +ComplexPair BandStopTransform::transform(complex_t c) { - if (c == infinity()) - c = -1; - else - c = (1. + c) / (1. - c); // bilinear - - complex_t u (0); - u = addmul (u, 4 * (b2 + a2 - 1), c); - u += 8 * (b2 - a2 + 1); - u *= c; - u += 4 * (a2 + b2 - 1); - u = std::sqrt (u); - - complex_t v = u * -.5; - v += a; - v = addmul (v, -a, c); - - u *= .5; - u += a; - u = addmul (u, -a, c); - - complex_t d (b + 1); - d = addmul (d, b-1, c); - - return ComplexPair (u/d, v/d); + if (c == infinity()) + c = -1; + else + c = (1. + c) / (1. - c); // bilinear + + complex_t u(0); + u = addmul(u, 4 * (b2 + a2 - 1), c); + u += 8 * (b2 - a2 + 1); + u *= c; + u += 4 * (a2 + b2 - 1); + u = std::sqrt(u); + + complex_t v = u * -.5; + v += a; + v = addmul(v, -a, c); + + u *= .5; + u += a; + u = addmul(u, -a, c); + + complex_t d(b + 1); + d = addmul(d, b-1, c); + + return ComplexPair(u/d, v/d); } } diff --git a/Source/Dsp/PoleFilter.h b/Source/Dsp/PoleFilter.h index 76eeb6eff77e9cb5ca75552898104bdab06aa2ef..bbd0b956750a709817104c4d8ebfea3dcb7a4086 100644 --- a/Source/Dsp/PoleFilter.h +++ b/Source/Dsp/PoleFilter.h @@ -40,7 +40,8 @@ THE SOFTWARE. #include "MathSupplement.h" #include "Cascade.h" -namespace Dsp { +namespace Dsp +{ /* * Base for filters designed via algorithmic placement of poles and zeros. @@ -57,30 +58,30 @@ namespace Dsp { class PoleFilterBase2 : public Cascade { public: - // This gets the poles/zeros directly from the digital - // prototype. It is used to double check the correctness - // of the recovery of pole/zeros from biquad coefficients. - // - // It can also be used to accelerate the interpolation - // of pole/zeros for parameter modulation, since a pole - // filter already has them calculated + // This gets the poles/zeros directly from the digital + // prototype. It is used to double check the correctness + // of the recovery of pole/zeros from biquad coefficients. + // + // It can also be used to accelerate the interpolation + // of pole/zeros for parameter modulation, since a pole + // filter already has them calculated #if 1 - // Commenting this out will pass the call to the Cascade, - // which tries to compute the poles and zeros from the biquad - // coefficients. - std::vector<PoleZeroPair> getPoleZeros () const - { - std::vector<PoleZeroPair> vpz; - const int pairs = (m_digitalProto.getNumPoles () + 1) / 2; - for (int i = 0; i < pairs; ++i) - vpz.push_back (m_digitalProto[i]); - return vpz; - } + // Commenting this out will pass the call to the Cascade, + // which tries to compute the poles and zeros from the biquad + // coefficients. + std::vector<PoleZeroPair> getPoleZeros() const + { + std::vector<PoleZeroPair> vpz; + const int pairs = (m_digitalProto.getNumPoles() + 1) / 2; + for (int i = 0; i < pairs; ++i) + vpz.push_back(m_digitalProto[i]); + return vpz; + } #endif protected: - LayoutBase m_digitalProto; + LayoutBase m_digitalProto; }; // Serves a container to hold the analog prototype @@ -89,37 +90,37 @@ template <class AnalogPrototype> class PoleFilterBase : public PoleFilterBase2 { protected: - void setPrototypeStorage (const LayoutBase& analogStorage, - const LayoutBase& digitalStorage) - { - m_analogProto.setStorage (analogStorage); - m_digitalProto = digitalStorage; - } + void setPrototypeStorage(const LayoutBase& analogStorage, + const LayoutBase& digitalStorage) + { + m_analogProto.setStorage(analogStorage); + m_digitalProto = digitalStorage; + } protected: - AnalogPrototype m_analogProto; + AnalogPrototype m_analogProto; }; //------------------------------------------------------------------------------ // Storage for pole filters template <class BaseClass, - int MaxAnalogPoles, - int MaxDigitalPoles = MaxAnalogPoles> + int MaxAnalogPoles, + int MaxDigitalPoles = MaxAnalogPoles> struct PoleFilter : BaseClass - , CascadeStages <(MaxDigitalPoles + 1) / 2> +, CascadeStages <(MaxDigitalPoles + 1) / 2> +{ + PoleFilter() { - PoleFilter () - { // This glues together the factored base classes // with the templatized storage classes. - BaseClass::setCascadeStorage (this->getCascadeStorage()); - BaseClass::setPrototypeStorage (m_analogStorage, m_digitalStorage); - } + BaseClass::setCascadeStorage(this->getCascadeStorage()); + BaseClass::setPrototypeStorage(m_analogStorage, m_digitalStorage); +} private: - Layout <MaxAnalogPoles> m_analogStorage; - Layout <MaxDigitalPoles> m_digitalStorage; +Layout <MaxAnalogPoles> m_analogStorage; +Layout <MaxDigitalPoles> m_digitalStorage; }; //------------------------------------------------------------------------------ @@ -135,18 +136,18 @@ private: * */ -// low pass to low pass +// low pass to low pass class LowPassTransform { public: - LowPassTransform (double fc, - LayoutBase& digital, - LayoutBase const& analog); + LowPassTransform(double fc, + LayoutBase& digital, + LayoutBase const& analog); private: - complex_t transform (complex_t c); + complex_t transform(complex_t c); - double f; + double f; }; //------------------------------------------------------------------------------ @@ -155,14 +156,14 @@ private: class HighPassTransform { public: - HighPassTransform (double fc, - LayoutBase& digital, - LayoutBase const& analog); + HighPassTransform(double fc, + LayoutBase& digital, + LayoutBase const& analog); private: - complex_t transform (complex_t c); + complex_t transform(complex_t c); - double f; + double f; }; //------------------------------------------------------------------------------ @@ -172,22 +173,22 @@ class BandPassTransform { public: - BandPassTransform (double fc, - double fw, - LayoutBase& digital, - LayoutBase const& analog); + BandPassTransform(double fc, + double fw, + LayoutBase& digital, + LayoutBase const& analog); private: - ComplexPair transform (complex_t c); - - double wc; - double wc2; - double a; - double b; - double a2; - double b2; - double ab; - double ab_2; + ComplexPair transform(complex_t c); + + double wc; + double wc2; + double a; + double b; + double a2; + double b2; + double ab; + double ab_2; }; //------------------------------------------------------------------------------ @@ -196,20 +197,20 @@ private: class BandStopTransform { public: - BandStopTransform (double fc, - double fw, - LayoutBase& digital, - LayoutBase const& analog); + BandStopTransform(double fc, + double fw, + LayoutBase& digital, + LayoutBase const& analog); private: - ComplexPair transform (complex_t c); - - double wc; - double wc2; - double a; - double b; - double a2; - double b2; + ComplexPair transform(complex_t c); + + double wc; + double wc2; + double a; + double b; + double a2; + double b2; }; } diff --git a/Source/Dsp/RBJ.cpp b/Source/Dsp/RBJ.cpp index 2a71b98af86c1bb5d0cec3fbf0b5710eb5fdbcc3..a38d43d3831869469ea27ab9fbee657f048cbab7 100644 --- a/Source/Dsp/RBJ.cpp +++ b/Source/Dsp/RBJ.cpp @@ -36,170 +36,172 @@ THE SOFTWARE. #include "Common.h" #include "RBJ.h" -namespace Dsp { +namespace Dsp +{ + +namespace RBJ +{ -namespace RBJ { +void LowPass::setup(double sampleRate, + double cutoffFrequency, + double q) +{ + double w0 = 2 * doublePi * cutoffFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / (2 * q); + double b0 = (1 - cs) / 2; + double b1 = 1 - cs; + double b2 = (1 - cs) / 2; + double a0 = 1 + AL; + double a1 = -2 * cs; + double a2 = 1 - AL; + setCoefficients(a0, a1, a2, b0, b1, b2); +} -void LowPass::setup (double sampleRate, +void HighPass::setup(double sampleRate, double cutoffFrequency, double q) { - double w0 = 2 * doublePi * cutoffFrequency / sampleRate; - double cs = cos (w0); - double sn = sin (w0); - double AL = sn / (2 * q); - double b0 = (1 - cs) / 2; - double b1 = 1 - cs; - double b2 = (1 - cs) / 2; - double a0 = 1 + AL; - double a1 = -2 * cs; - double a2 = 1 - AL; - setCoefficients (a0, a1, a2, b0, b1, b2); + double w0 = 2 * doublePi * cutoffFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / (2 * q); + double b0 = (1 + cs) / 2; + double b1 = -(1 + cs); + double b2 = (1 + cs) / 2; + double a0 = 1 + AL; + double a1 = -2 * cs; + double a2 = 1 - AL; + setCoefficients(a0, a1, a2, b0, b1, b2); } -void HighPass::setup (double sampleRate, - double cutoffFrequency, - double q) +void BandPass1::setup(double sampleRate, + double centerFrequency, + double bandWidth) { - double w0 = 2 * doublePi * cutoffFrequency / sampleRate; - double cs = cos (w0); - double sn = sin (w0); - double AL = sn / ( 2 * q ); - double b0 = (1 + cs) / 2; - double b1 = -(1 + cs); - double b2 = (1 + cs) / 2; - double a0 = 1 + AL; - double a1 = -2 * cs; - double a2 = 1 - AL; - setCoefficients (a0, a1, a2, b0, b1, b2); + double w0 = 2 * doublePi * centerFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / (2 * bandWidth); + double b0 = bandWidth * AL;// sn / 2; + double b1 = 0; + double b2 = -bandWidth * AL;//-sn / 2; + double a0 = 1 + AL; + double a1 = -2 * cs; + double a2 = 1 - AL; + setCoefficients(a0, a1, a2, b0, b1, b2); } -void BandPass1::setup (double sampleRate, - double centerFrequency, - double bandWidth) +void BandPass2::setup(double sampleRate, + double centerFrequency, + double bandWidth) { - double w0 = 2 * doublePi * centerFrequency / sampleRate; - double cs = cos (w0); - double sn = sin (w0); - double AL = sn / ( 2 * bandWidth ); - double b0 = bandWidth * AL;// sn / 2; - double b1 = 0; - double b2 = -bandWidth * AL;//-sn / 2; - double a0 = 1 + AL; - double a1 = -2 * cs; - double a2 = 1 - AL; - setCoefficients (a0, a1, a2, b0, b1, b2); + double w0 = 2 * doublePi * centerFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / (2 * bandWidth); + double b0 = AL; + double b1 = 0; + double b2 = -AL; + double a0 = 1 + AL; + double a1 = -2 * cs; + double a2 = 1 - AL; + setCoefficients(a0, a1, a2, b0, b1, b2); } -void BandPass2::setup (double sampleRate, - double centerFrequency, - double bandWidth) +void BandStop::setup(double sampleRate, + double centerFrequency, + double bandWidth) { - double w0 = 2 * doublePi * centerFrequency / sampleRate; - double cs = cos (w0); - double sn = sin (w0); - double AL = sn / ( 2 * bandWidth ); - double b0 = AL; - double b1 = 0; - double b2 = -AL; - double a0 = 1 + AL; - double a1 = -2 * cs; - double a2 = 1 - AL; - setCoefficients (a0, a1, a2, b0, b1, b2); + double w0 = 2 * doublePi * centerFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / (2 * bandWidth); + double b0 = 1; + double b1 = -2 * cs; + double b2 = 1; + double a0 = 1 + AL; + double a1 = -2 * cs; + double a2 = 1 - AL; + setCoefficients(a0, a1, a2, b0, b1, b2); } -void BandStop::setup (double sampleRate, - double centerFrequency, - double bandWidth) +void LowShelf::setup(double sampleRate, + double cutoffFrequency, + double gainDb, + double shelfSlope) { - double w0 = 2 * doublePi * centerFrequency / sampleRate; - double cs = cos (w0); - double sn = sin (w0); - double AL = sn / ( 2 * bandWidth ); - double b0 = 1; - double b1 = -2 * cs; - double b2 = 1; - double a0 = 1 + AL; - double a1 = -2 * cs; - double a2 = 1 - AL; - setCoefficients (a0, a1, a2, b0, b1, b2); + double A = pow(10, gainDb/40); + double w0 = 2 * doublePi * cutoffFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / 2 * ::std::sqrt((A + 1/A) * (1/shelfSlope - 1) + 2); + double sq = 2 * sqrt(A) * AL; + double b0 = A*((A+1) - (A-1)*cs + sq); + double b1 = 2*A*((A-1) - (A+1)*cs); + double b2 = A*((A+1) - (A-1)*cs - sq); + double a0 = (A+1) + (A-1)*cs + sq; + double a1 = -2*((A-1) + (A+1)*cs); + double a2 = (A+1) + (A-1)*cs - sq; + setCoefficients(a0, a1, a2, b0, b1, b2); } -void LowShelf::setup (double sampleRate, +void HighShelf::setup(double sampleRate, double cutoffFrequency, double gainDb, double shelfSlope) { - double A = pow (10, gainDb/40); - double w0 = 2 * doublePi * cutoffFrequency / sampleRate; - double cs = cos (w0); - double sn = sin (w0); - double AL = sn / 2 * ::std::sqrt ((A + 1/A) * (1/shelfSlope - 1) + 2); - double sq = 2 * sqrt(A) * AL; - double b0 = A*( (A+1) - (A-1)*cs + sq ); - double b1 = 2*A*( (A-1) - (A+1)*cs ); - double b2 = A*( (A+1) - (A-1)*cs - sq ); - double a0 = (A+1) + (A-1)*cs + sq; - double a1 = -2*( (A-1) + (A+1)*cs ); - double a2 = (A+1) + (A-1)*cs - sq; - setCoefficients (a0, a1, a2, b0, b1, b2); -} - -void HighShelf::setup (double sampleRate, - double cutoffFrequency, - double gainDb, - double shelfSlope) -{ - double A = pow (10, gainDb/40); - double w0 = 2 * doublePi * cutoffFrequency / sampleRate; - double cs = cos (w0); - double sn = sin (w0); - double AL = sn / 2 * ::std::sqrt ((A + 1/A) * (1/shelfSlope - 1) + 2); - double sq = 2 * sqrt(A) * AL; - double b0 = A*( (A+1) - (A-1)*cs + sq ); - double b1 = -2*A*( (A-1) - (A+1)*cs ); - double b2 = A*( (A+1) - (A-1)*cs - sq ); - double a0 = (A+1) + (A-1)*cs + sq; - double a1 = 2*( (A-1) + (A+1)*cs ); - double a2 = (A+1) + (A-1)*cs - sq; - setCoefficients (a0, a1, a2, b0, b1, b2); + double A = pow(10, gainDb/40); + double w0 = 2 * doublePi * cutoffFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / 2 * ::std::sqrt((A + 1/A) * (1/shelfSlope - 1) + 2); + double sq = 2 * sqrt(A) * AL; + double b0 = A*((A+1) - (A-1)*cs + sq); + double b1 = -2*A*((A-1) - (A+1)*cs); + double b2 = A*((A+1) - (A-1)*cs - sq); + double a0 = (A+1) + (A-1)*cs + sq; + double a1 = 2*((A-1) + (A+1)*cs); + double a2 = (A+1) + (A-1)*cs - sq; + setCoefficients(a0, a1, a2, b0, b1, b2); } -void BandShelf::setup (double sampleRate, - double centerFrequency, - double gainDb, - double bandWidth) +void BandShelf::setup(double sampleRate, + double centerFrequency, + double gainDb, + double bandWidth) { - double A = pow (10, gainDb/40); - double w0 = 2 * doublePi * centerFrequency / sampleRate; - double cs = cos(w0); - double sn = sin(w0); - double AL = sn * sinh( doubleLn2/2 * bandWidth * w0/sn ); - assert (!Dsp::is_nan (AL)); - double b0 = 1 + AL * A; - double b1 = -2 * cs; - double b2 = 1 - AL * A; - double a0 = 1 + AL / A; - double a1 = -2 * cs; - double a2 = 1 - AL / A; - setCoefficients (a0, a1, a2, b0, b1, b2); + double A = pow(10, gainDb/40); + double w0 = 2 * doublePi * centerFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn * sinh(doubleLn2/2 * bandWidth * w0/sn); + assert(!Dsp::is_nan(AL)); + double b0 = 1 + AL * A; + double b1 = -2 * cs; + double b2 = 1 - AL * A; + double a0 = 1 + AL / A; + double a1 = -2 * cs; + double a2 = 1 - AL / A; + setCoefficients(a0, a1, a2, b0, b1, b2); } -void AllPass::setup (double sampleRate, - double phaseFrequency, - double q) +void AllPass::setup(double sampleRate, + double phaseFrequency, + double q) { - double w0 = 2 * doublePi * phaseFrequency / sampleRate; - double cs = cos (w0); - double sn = sin (w0); - double AL = sn / ( 2 * q ); - double b0 = 1 - AL; - double b1 = -2 * cs; - double b2 = 1 + AL; - double a0 = 1 + AL; - double a1 = -2 * cs; - double a2 = 1 - AL; - setCoefficients (a0, a1, a2, b0, b1, b2); + double w0 = 2 * doublePi * phaseFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / (2 * q); + double b0 = 1 - AL; + double b1 = -2 * cs; + double b2 = 1 + AL; + double a0 = 1 + AL; + double a1 = -2 * cs; + double a2 = 1 - AL; + setCoefficients(a0, a1, a2, b0, b1, b2); } } diff --git a/Source/Dsp/RBJ.h b/Source/Dsp/RBJ.h index 35899522e6a715c258bf4d1b56c715308225ff40..40ee742622650e0f9f84e6b7368a94969f58cae0 100644 --- a/Source/Dsp/RBJ.h +++ b/Source/Dsp/RBJ.h @@ -41,7 +41,8 @@ THE SOFTWARE. #include "Design.h" #include "Filter.h" -namespace Dsp { +namespace Dsp +{ /* * Filter realizations based on Robert Bristol-Johnson formulae: @@ -50,7 +51,8 @@ namespace Dsp { * */ -namespace RBJ { +namespace RBJ +{ // // Raw filters @@ -58,70 +60,70 @@ namespace RBJ { struct LowPass : BiquadBase { - void setup (double sampleRate, - double cutoffFrequency, - double q); + void setup(double sampleRate, + double cutoffFrequency, + double q); }; struct HighPass : BiquadBase { - void setup (double sampleRate, - double cutoffFrequency, - double q); + void setup(double sampleRate, + double cutoffFrequency, + double q); }; struct BandPass1 : BiquadBase { - // (constant skirt gain, peak gain = Q) - void setup (double sampleRate, - double centerFrequency, - double bandWidth); + // (constant skirt gain, peak gain = Q) + void setup(double sampleRate, + double centerFrequency, + double bandWidth); }; struct BandPass2 : BiquadBase { - // (constant 0 dB peak gain) - void setup (double sampleRate, - double centerFrequency, - double bandWidth); + // (constant 0 dB peak gain) + void setup(double sampleRate, + double centerFrequency, + double bandWidth); }; struct BandStop : BiquadBase { - void setup (double sampleRate, - double centerFrequency, - double bandWidth); + void setup(double sampleRate, + double centerFrequency, + double bandWidth); }; struct LowShelf : BiquadBase { - void setup (double sampleRate, - double cutoffFrequency, - double gainDb, - double shelfSlope); + void setup(double sampleRate, + double cutoffFrequency, + double gainDb, + double shelfSlope); }; struct HighShelf : BiquadBase { - void setup (double sampleRate, - double cutoffFrequency, - double gainDb, - double shelfSlope); + void setup(double sampleRate, + double cutoffFrequency, + double gainDb, + double shelfSlope); }; struct BandShelf : BiquadBase { - void setup (double sampleRate, - double centerFrequency, - double gainDb, - double bandWidth); + void setup(double sampleRate, + double centerFrequency, + double gainDb, + double bandWidth); }; struct AllPass : BiquadBase { - void setup (double sampleRate, - double phaseFrequency, - double q); + void setup(double sampleRate, + double phaseFrequency, + double q); }; //------------------------------------------------------------------------------ @@ -130,200 +132,255 @@ struct AllPass : BiquadBase // Gui-friendly Design layer // -namespace Design { +namespace Design +{ struct TypeIBase : DesignBase { - enum - { - NumParams = 3 - }; - - static int getNumParams () - { - return 3; - } - - static const ParamInfo getParamInfo_1 () - { - return ParamInfo::defaultCutoffFrequencyParam (); - } - - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultQParam (); - } + enum + { + NumParams = 3 + }; + + static int getNumParams() + { + return 3; + } + + static const ParamInfo getParamInfo_1() + { + return ParamInfo::defaultCutoffFrequencyParam(); + } + + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultQParam(); + } }; template <class FilterClass> struct TypeI : TypeIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (params[0], params[1], params[2]); - } + void setParams(const Params& params) + { + FilterClass::setup(params[0], params[1], params[2]); + } }; struct TypeIIBase : DesignBase { - enum - { - NumParams = 3 - }; - - static int getNumParams () - { - return 3; - } - - static const ParamInfo getParamInfo_1 () - { - return ParamInfo::defaultCenterFrequencyParam (); - } - - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultBandwidthParam (); - } + enum + { + NumParams = 3 + }; + + static int getNumParams() + { + return 3; + } + + static const ParamInfo getParamInfo_1() + { + return ParamInfo::defaultCenterFrequencyParam(); + } + + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultBandwidthParam(); + } }; template <class FilterClass> struct TypeII : TypeIIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (params[0], params[1], params[2]); - } + void setParams(const Params& params) + { + FilterClass::setup(params[0], params[1], params[2]); + } }; struct TypeIIIBase : DesignBase { - enum - { - NumParams = 4 - }; - - static int getNumParams () - { - return 4; - } - - static const ParamInfo getParamInfo_1 () - { - return ParamInfo::defaultCutoffFrequencyParam (); - } - - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultGainParam (); - } - - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultSlopeParam (); - } + enum + { + NumParams = 4 + }; + + static int getNumParams() + { + return 4; + } + + static const ParamInfo getParamInfo_1() + { + return ParamInfo::defaultCutoffFrequencyParam(); + } + + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultGainParam(); + } + + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultSlopeParam(); + } }; template <class FilterClass> struct TypeIII : TypeIIIBase, FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (params[0], params[1], params[2], params[3]); - } + void setParams(const Params& params) + { + FilterClass::setup(params[0], params[1], params[2], params[3]); + } }; struct TypeIVBase : DesignBase { - enum - { - NumParams = 4 - }; - - static int getNumParams () - { - return 4; - } - - static const ParamInfo getParamInfo_1 () - { - return ParamInfo::defaultCenterFrequencyParam (); - } - - static const ParamInfo getParamInfo_2 () - { - return ParamInfo::defaultGainParam (); - } - - static const ParamInfo getParamInfo_3 () - { - return ParamInfo::defaultBandwidthParam (); - } + enum + { + NumParams = 4 + }; + + static int getNumParams() + { + return 4; + } + + static const ParamInfo getParamInfo_1() + { + return ParamInfo::defaultCenterFrequencyParam(); + } + + static const ParamInfo getParamInfo_2() + { + return ParamInfo::defaultGainParam(); + } + + static const ParamInfo getParamInfo_3() + { + return ParamInfo::defaultBandwidthParam(); + } }; template <class FilterClass> struct TypeIV : TypeIVBase , FilterClass { - void setParams (const Params& params) - { - FilterClass::setup (params[0], params[1], params[2], params[3]); - } + void setParams(const Params& params) + { + FilterClass::setup(params[0], params[1], params[2], params[3]); + } }; //------------------------------------------------------------------------------ struct LowPass : TypeI <RBJ::LowPass> { - static Kind getKind () { return kindLowPass; } - static const char* getName() { return "RBJ Low Pass"; } + static Kind getKind() + { + return kindLowPass; + } + static const char* getName() + { + return "RBJ Low Pass"; + } }; struct HighPass : TypeI <RBJ::HighPass> { - static Kind getKind () { return kindHighPass; } - static const char* getName() { return "RBJ High Pass"; } + static Kind getKind() + { + return kindHighPass; + } + static const char* getName() + { + return "RBJ High Pass"; + } }; struct BandPass1 : TypeII <RBJ::BandPass1> { - static Kind getKind () { return kindBandPass; } - static const char* getName() { return "RBJ Band Pass 1"; } + static Kind getKind() + { + return kindBandPass; + } + static const char* getName() + { + return "RBJ Band Pass 1"; + } }; struct BandPass2 : TypeII <RBJ::BandPass2> { - static Kind getKind () { return kindBandPass; } - static const char* getName() { return "RBJ Band Pass 2"; } + static Kind getKind() + { + return kindBandPass; + } + static const char* getName() + { + return "RBJ Band Pass 2"; + } }; struct BandStop : TypeII <RBJ::BandStop> { - static Kind getKind () { return kindBandStop; } - static const char* getName() { return "RBJ Band Stop"; } + static Kind getKind() + { + return kindBandStop; + } + static const char* getName() + { + return "RBJ Band Stop"; + } }; struct LowShelf : TypeIII <RBJ::LowShelf> { - static Kind getKind () { return kindLowShelf; } - static const char* getName() { return "RBJ Low Shelf"; } + static Kind getKind() + { + return kindLowShelf; + } + static const char* getName() + { + return "RBJ Low Shelf"; + } }; struct HighShelf : TypeIII <RBJ::HighShelf> { - static Kind getKind () { return kindHighShelf; } - static const char* getName() { return "RBJ High Shelf"; } + static Kind getKind() + { + return kindHighShelf; + } + static const char* getName() + { + return "RBJ High Shelf"; + } }; struct BandShelf : TypeIV <RBJ::BandShelf> { - static Kind getKind () { return kindBandShelf; } - static const char* getName() { return "RBJ Band Shelf"; } + static Kind getKind() + { + return kindBandShelf; + } + static const char* getName() + { + return "RBJ Band Shelf"; + } }; struct AllPass : TypeI <RBJ::AllPass> { - static Kind getKind () { return kindOther; } - static const char* getName() { return "RBJ All Pass"; } + static Kind getKind() + { + return kindOther; + } + static const char* getName() + { + return "RBJ All Pass"; + } }; } diff --git a/Source/Dsp/RootFinder.cpp b/Source/Dsp/RootFinder.cpp index f00cca087d49d99f6b18f198558efcbe1a89656e..c1d1e428049f494f50a05bc18bb94f5566feadde 100644 --- a/Source/Dsp/RootFinder.cpp +++ b/Source/Dsp/RootFinder.cpp @@ -37,150 +37,151 @@ THE SOFTWARE. #include "RootFinder.h" #include <stdexcept> -namespace Dsp { - -void RootFinderBase::solve (int degree, - bool polish, - bool doSort) +namespace Dsp { - assert (degree <= m_maxdegree); - - const double EPS = 1.0e-30; - int its; - complex_t x, b, c; +void RootFinderBase::solve(int degree, + bool polish, + bool doSort) +{ + assert(degree <= m_maxdegree); - int m = degree; + const double EPS = 1.0e-30; - // copy coefficients - for (int j = 0; j <= m; ++j) - m_ad[j] = m_a[j]; + int its; + complex_t x, b, c; - // for each root - for (int j = m - 1; j >= 0; --j) - { - // initial guess at 0 - x = 0.0; - laguerre (j + 1, m_ad, x, its); - - if (fabs (std::imag(x)) <= 2.0 * EPS * fabs (std::real(x))) - x = complex_t (std::real(x), 0.0); + int m = degree; - m_root[j] = x; + // copy coefficients + for (int j = 0; j <= m; ++j) + m_ad[j] = m_a[j]; - // deflate - b = m_ad[j+1]; - for (int jj = j; jj >= 0; --jj) + // for each root + for (int j = m - 1; j >= 0; --j) { - c = m_ad[jj]; - m_ad[jj] = b; - b = x * b + c; + // initial guess at 0 + x = 0.0; + laguerre(j + 1, m_ad, x, its); + + if (fabs(std::imag(x)) <= 2.0 * EPS * fabs(std::real(x))) + x = complex_t (std::real(x), 0.0); + + m_root[j] = x; + + // deflate + b = m_ad[j+1]; + for (int jj = j; jj >= 0; --jj) + { + c = m_ad[jj]; + m_ad[jj] = b; + b = x * b + c; + } } - } - if (polish) - for (int j = 0; j < m; ++j) - laguerre (degree, m_a, m_root[j], its); + if (polish) + for (int j = 0; j < m; ++j) + laguerre(degree, m_a, m_root[j], its); - if (doSort) - sort (degree); + if (doSort) + sort(degree); } -void RootFinderBase::sort (int degree) +void RootFinderBase::sort(int degree) { - for (int j = 1; j < degree; ++j) - { - complex_t x = m_root[j]; - - int i; - for (i = j - 1; i >= 0; --i ) + for (int j = 1; j < degree; ++j) { - if (m_root[i].imag() >= x.imag()) - break; + complex_t x = m_root[j]; - m_root[i+1] = m_root[i]; - } + int i; + for (i = j - 1; i >= 0; --i) + { + if (m_root[i].imag() >= x.imag()) + break; + + m_root[i+1] = m_root[i]; + } - m_root[i+1] = x; - } + m_root[i+1] = x; + } } //------------------------------------------------------------------------------ -void RootFinderBase::laguerre (int degree, - complex_t a[], - complex_t& x, - int& its) +void RootFinderBase::laguerre(int degree, + complex_t a[], + complex_t& x, + int& its) { - const int MR = 8, MT = 10, MAXIT = MT * MR; - const double EPS = std::numeric_limits<double>::epsilon(); + const int MR = 8, MT = 10, MAXIT = MT * MR; + const double EPS = std::numeric_limits<double>::epsilon(); - static const double frac[MR + 1] = + static const double frac[MR + 1] = {0.0, 0.5, 0.25, 0.75, 0.13, 0.38, 0.62, 0.88, 1.0}; - complex_t dx, x1, b, d, f, g, h, sq, gp, gm, g2; + complex_t dx, x1, b, d, f, g, h, sq, gp, gm, g2; - int m = degree; - for (int iter = 1; iter <= MAXIT; ++iter) - { - its = iter; - b = a[m]; - double err = std::abs(b); - d = f = 0.0; - double abx = std::abs(x); - for (int j = m - 1; j >= 0; --j) + int m = degree; + for (int iter = 1; iter <= MAXIT; ++iter) { - f = x * f + d; - d = x * d + b; - b = x * b + a[j]; - err = std::abs(b) + abx * err; + its = iter; + b = a[m]; + double err = std::abs(b); + d = f = 0.0; + double abx = std::abs(x); + for (int j = m - 1; j >= 0; --j) + { + f = x * f + d; + d = x * d + b; + b = x * b + a[j]; + err = std::abs(b) + abx * err; + } + err *= EPS; + if (std::abs(b) <= err) + return; + g = d / b; + g2 = g * g; + h = g2 - 2.0 * f / b; + + sq = sqrt(double(m - 1) * (double(m) * h - g2)); + gp = g + sq; + gm = g - sq; + + double abp = std::abs(gp); + double abm = std::abs(gm); + if (abp < abm) + gp = gm; + dx = std::max(abp, abm) > 0.0 ? double(m) / gp : std::polar(1 + abx, double(iter)); + x1 = x - dx; + if (x == x1) + return; + if (iter % MT != 0) + x = x1; + else + x -= frac[iter / MT] * dx; } - err *= EPS; - if (std::abs(b) <= err) - return; - g = d / b; - g2 = g * g; - h = g2 - 2.0 * f / b; - - sq = sqrt (double(m - 1) * (double(m) * h - g2)); - gp = g + sq; - gm = g - sq; - - double abp = std::abs (gp); - double abm = std::abs (gm); - if (abp < abm) - gp = gm; - dx = std::max(abp, abm) > 0.0 ? double(m) / gp : std::polar (1 + abx, double(iter)); - x1 = x - dx; - if (x == x1) - return; - if (iter % MT != 0) - x = x1; - else - x -= frac[iter / MT] * dx; - } - throw std::logic_error ("laguerre failed"); + throw std::logic_error("laguerre failed"); } //------------------------------------------------------------------------------ -complex_t RootFinderBase::eval (int degree, - const complex_t& x ) +complex_t RootFinderBase::eval(int degree, + const complex_t& x) { - complex_t y; - - if (x != 0.) - { - for (int i = 0; i <= degree; ++i) - y += m_a[i] * pow (x, double(i)); - } - else - { - y = m_a[0]; - } - - return y; + complex_t y; + + if (x != 0.) + { + for (int i = 0; i <= degree; ++i) + y += m_a[i] * pow(x, double(i)); + } + else + { + y = m_a[0]; + } + + return y; } diff --git a/Source/Dsp/RootFinder.h b/Source/Dsp/RootFinder.h index 2202ba98eb4e0bd9d1f10533021eea1a22010da5..bc49cc838f7487cbd3f1f4c727372ef1ff925e94 100644 --- a/Source/Dsp/RootFinder.h +++ b/Source/Dsp/RootFinder.h @@ -39,7 +39,8 @@ THE SOFTWARE. #include "Common.h" #include "Types.h" -namespace Dsp { +namespace Dsp +{ // // Finds the complex roots of the given polynomial with @@ -49,60 +50,60 @@ namespace Dsp { class RootFinderBase { public: - struct Array - { - Array (int max, complex_t* values) - // : m_max (max) - // , m_values (values) + struct Array + { + Array(int max, complex_t* values) + // : m_max (max) + // , m_values (values) + { + } + + //complex_t& operator[] (int index) + //{ + //}; + }; + + // + // Find roots of polynomial f(x)=a[0]+a[1]*x+a[2]*x^2...+a[degree]*x^degree + // The input coefficients are set using coef()[]. + // The solutions are placed in roots. + // + void solve(int degree, + bool polish = true, + bool doSort = true); + + // Evaluates the polynomial at x + complex_t eval(int degree, + const complex_t& x); + + // Direct access to the input coefficient array of size degree+1. + complex_t* coef() { + return m_a; } - //complex_t& operator[] (int index) - //{ - //}; - }; - - // - // Find roots of polynomial f(x)=a[0]+a[1]*x+a[2]*x^2...+a[degree]*x^degree - // The input coefficients are set using coef()[]. - // The solutions are placed in roots. - // - void solve (int degree, - bool polish = true, - bool doSort = true); - - // Evaluates the polynomial at x - complex_t eval (int degree, - const complex_t& x); - - // Direct access to the input coefficient array of size degree+1. - complex_t* coef() - { - return m_a; - } - - // Direct access to the resulting roots array of size degree - complex_t* root() - { - return m_root; - } - - // sort the roots by descending imaginary part - void sort (int degree); + // Direct access to the resulting roots array of size degree + complex_t* root() + { + return m_root; + } + + // sort the roots by descending imaginary part + void sort(int degree); private: - // Improves x as a root using Laguerre's method. - // The input coefficient array has degree+1 elements. - void laguerre (int degree, - complex_t a[], - complex_t& x, - int& its); + // Improves x as a root using Laguerre's method. + // The input coefficient array has degree+1 elements. + void laguerre(int degree, + complex_t a[], + complex_t& x, + int& its); protected: - int m_maxdegree; - complex_t* m_a; // input coefficients (m_maxdegree+1 elements) - complex_t* m_ad; // copy of deflating coefficients - complex_t* m_root; // array of roots (maxdegree elements) + int m_maxdegree; + complex_t* m_a; // input coefficients (m_maxdegree+1 elements) + complex_t* m_ad; // copy of deflating coefficients + complex_t* m_root; // array of roots (maxdegree elements) }; //------------------------------------------------------------------------------ @@ -110,18 +111,18 @@ protected: template<int maxdegree> struct RootFinder : RootFinderBase { - RootFinder() - { - m_maxdegree = maxdegree; - m_a = m_a0; - m_ad = m_ad0; - m_root = m_r; - } + RootFinder() + { + m_maxdegree = maxdegree; + m_a = m_a0; + m_ad = m_ad0; + m_root = m_r; + } private: - complex_t m_a0 [maxdegree+1]; - complex_t m_ad0[maxdegree+1]; - complex_t m_r [maxdegree]; + complex_t m_a0 [maxdegree+1]; + complex_t m_ad0[maxdegree+1]; + complex_t m_r [maxdegree]; }; } diff --git a/Source/Dsp/SmoothedFilter.h b/Source/Dsp/SmoothedFilter.h index 72e089d1691a8048b98e576614b0aa3cf5ff43e8..0625820e0172fdc3e3f3fe5b1ea2ae3f4b5868fa 100644 --- a/Source/Dsp/SmoothedFilter.h +++ b/Source/Dsp/SmoothedFilter.h @@ -39,114 +39,115 @@ THE SOFTWARE. #include "Common.h" #include "Filter.h" -namespace Dsp { +namespace Dsp +{ /* * Implements smooth modulation of time-varying filter parameters * */ template <class DesignClass, - int Channels, - class StateType = DirectFormII> + int Channels, + class StateType = DirectFormII> class SmoothedFilterDesign - : public FilterDesign <DesignClass, - Channels, - StateType> + : public FilterDesign <DesignClass, + Channels, + StateType> { public: - typedef FilterDesign <DesignClass, Channels, StateType> filter_type_t; + typedef FilterDesign <DesignClass, Channels, StateType> filter_type_t; - SmoothedFilterDesign (int transitionSamples) - : m_transitionSamples (transitionSamples) - , m_remainingSamples (-1) // first time flag - { - } + SmoothedFilterDesign(int transitionSamples) + : m_transitionSamples(transitionSamples) + , m_remainingSamples(-1) // first time flag + { + } - // Process a block of samples. - template <typename Sample> - void processBlock (int numSamples, - Sample* const* destChannelArray) - { - const int numChannels = this->getNumChannels(); + // Process a block of samples. + template <typename Sample> + void processBlock(int numSamples, + Sample* const* destChannelArray) + { + const int numChannels = this->getNumChannels(); - // If this goes off it means setup() was never called - assert (m_remainingSamples >= 0); + // If this goes off it means setup() was never called + assert(m_remainingSamples >= 0); - // first handle any transition samples - int remainingSamples = std::min (m_remainingSamples, numSamples); + // first handle any transition samples + int remainingSamples = std::min(m_remainingSamples, numSamples); - if (remainingSamples > 0) - { - // interpolate parameters for each sample - const double t = 1. / m_remainingSamples; - double dp[maxParameters]; - for (int i = 0; i < DesignClass::NumParams; ++i) - dp[i] = (this->getParams()[i] - m_transitionParams[i]) * t; - - for (int n = 0; n < remainingSamples; ++n) - { - for (int i = DesignClass::NumParams; --i >=0;) - m_transitionParams[i] += dp[i]; - - m_transitionFilter.setParams (m_transitionParams); - - for (int i = numChannels; --i >= 0;) + if (remainingSamples > 0) { - Sample* dest = destChannelArray[i]+n; - *dest = this->m_state[i].process (*dest, m_transitionFilter); + // interpolate parameters for each sample + const double t = 1. / m_remainingSamples; + double dp[maxParameters]; + for (int i = 0; i < DesignClass::NumParams; ++i) + dp[i] = (this->getParams()[i] - m_transitionParams[i]) * t; + + for (int n = 0; n < remainingSamples; ++n) + { + for (int i = DesignClass::NumParams; --i >=0;) + m_transitionParams[i] += dp[i]; + + m_transitionFilter.setParams(m_transitionParams); + + for (int i = numChannels; --i >= 0;) + { + Sample* dest = destChannelArray[i]+n; + *dest = this->m_state[i].process(*dest, m_transitionFilter); + } + } + + m_remainingSamples -= remainingSamples; + + if (m_remainingSamples == 0) + m_transitionParams = this->getParams(); } - } - m_remainingSamples -= remainingSamples; - - if (m_remainingSamples == 0) - m_transitionParams = this->getParams(); + // do what's left + if (numSamples - remainingSamples > 0) + { + // no transition + for (int i = 0; i < numChannels; ++i) + this->m_design.process(numSamples - remainingSamples, + destChannelArray[i] + remainingSamples, + this->m_state[i]); + } } - // do what's left - if (numSamples - remainingSamples > 0) + void process(int numSamples, float* const* arrayOfChannels) { - // no transition - for (int i = 0; i < numChannels; ++i) - this->m_design.process (numSamples - remainingSamples, - destChannelArray[i] + remainingSamples, - this->m_state[i]); + processBlock(numSamples, arrayOfChannels); } - } - - void process (int numSamples, float* const* arrayOfChannels) - { - processBlock (numSamples, arrayOfChannels); - } - - void process (int numSamples, double* const* arrayOfChannels) - { - processBlock (numSamples, arrayOfChannels); - } -protected: - void doSetParams (const Params& parameters) - { - if (m_remainingSamples >= 0) + void process(int numSamples, double* const* arrayOfChannels) { - m_remainingSamples = m_transitionSamples; + processBlock(numSamples, arrayOfChannels); } - else + +protected: + void doSetParams(const Params& parameters) { - // first time - m_remainingSamples = 0; - m_transitionParams = parameters; - } + if (m_remainingSamples >= 0) + { + m_remainingSamples = m_transitionSamples; + } + else + { + // first time + m_remainingSamples = 0; + m_transitionParams = parameters; + } - filter_type_t::doSetParams (parameters); - } + filter_type_t::doSetParams(parameters); + } protected: - Params m_transitionParams; - DesignClass m_transitionFilter; - int m_transitionSamples; + Params m_transitionParams; + DesignClass m_transitionFilter; + int m_transitionSamples; - int m_remainingSamples; // remaining transition samples + int m_remainingSamples; // remaining transition samples }; } diff --git a/Source/Dsp/State.cpp b/Source/Dsp/State.cpp index 61c07cb3020ccccdf08dcd984decb497798f8411..df6d192489a1d32618fe23e80b5b257f85eaf5a6 100644 --- a/Source/Dsp/State.cpp +++ b/Source/Dsp/State.cpp @@ -36,7 +36,8 @@ THE SOFTWARE. #include "Common.h" #include "State.h" -namespace Dsp { +namespace Dsp +{ //------------------------------------------------------------------------------ diff --git a/Source/Dsp/State.h b/Source/Dsp/State.h index eed4edb934052c631f96b65b38ba4cb36e37ab85..e0c4f2c6f03723c97cd5d72c4ac5d7b6b6564eb9 100644 --- a/Source/Dsp/State.h +++ b/Source/Dsp/State.h @@ -41,7 +41,8 @@ THE SOFTWARE. #include <stdexcept> -namespace Dsp { +namespace Dsp +{ /* * Various forms of state information required to @@ -57,45 +58,45 @@ namespace Dsp { * Difference equation: * * y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2] - * - (a1/a0)*y[n-1] - (a2/a0)*y[n-2] + * - (a1/a0)*y[n-1] - (a2/a0)*y[n-2] */ class DirectFormI { public: - DirectFormI () - { - reset(); - } - - void reset () - { - m_x1 = 0; - m_x2 = 0; - m_y1 = 0; - m_y2 = 0; - } - - template <typename Sample> - inline Sample process1 (const Sample in, - const BiquadBase& s, - const double vsa) // very small amount - { - double out = s.m_b0*in + s.m_b1*m_x1 + s.m_b2*m_x2 - - s.m_a1*m_y1 - s.m_a2*m_y2 - + vsa; - m_x2 = m_x1; - m_y2 = m_y1; - m_x1 = in; - m_y1 = out; - - return static_cast<Sample> (out); - } + DirectFormI() + { + reset(); + } + + void reset() + { + m_x1 = 0; + m_x2 = 0; + m_y1 = 0; + m_y2 = 0; + } + + template <typename Sample> + inline Sample process1(const Sample in, + const BiquadBase& s, + const double vsa) // very small amount + { + double out = s.m_b0*in + s.m_b1*m_x1 + s.m_b2*m_x2 + - s.m_a1*m_y1 - s.m_a2*m_y2 + + vsa; + m_x2 = m_x1; + m_y2 = m_y1; + m_x1 = in; + m_y1 = out; + + return static_cast<Sample>(out); + } protected: - double m_x2; // x[n-2] - double m_y2; // y[n-2] - double m_x1; // x[n-1] - double m_y1; // y[n-1] + double m_x2; // x[n-2] + double m_y2; // y[n-2] + double m_x1; // x[n-1] + double m_y1; // y[n-1] }; //------------------------------------------------------------------------------ @@ -112,34 +113,34 @@ protected: class DirectFormII { public: - DirectFormII () - { - reset (); - } - - void reset () - { - m_v1 = 0; - m_v2 = 0; - } - - template <typename Sample> - Sample process1 (const Sample in, - const BiquadBase& s, - const double vsa) - { - double w = in - s.m_a1*m_v1 - s.m_a2*m_v2 + vsa; - double out = s.m_b0*w + s.m_b1*m_v1 + s.m_b2*m_v2; - - m_v2 = m_v1; - m_v1 = w; - - return static_cast<Sample> (out); - } + DirectFormII() + { + reset(); + } + + void reset() + { + m_v1 = 0; + m_v2 = 0; + } + + template <typename Sample> + Sample process1(const Sample in, + const BiquadBase& s, + const double vsa) + { + double w = in - s.m_a1*m_v1 - s.m_a2*m_v2 + vsa; + double out = s.m_b0*w + s.m_b1*m_v1 + s.m_b2*m_v2; + + m_v2 = m_v1; + m_v1 = w; + + return static_cast<Sample>(out); + } private: - double m_v1; // v[-1] - double m_v2; // v[-2] + double m_v1; // v[-1] + double m_v2; // v[-2] }; //------------------------------------------------------------------------------ @@ -157,57 +158,57 @@ private: class TransposedDirectFormI { public: - TransposedDirectFormI () - { - reset (); - } - - void reset () - { - m_v = 0; - m_s1 = 0; - m_s1_1 = 0; - m_s2 = 0; - m_s2_1 = 0; - m_s3 = 0; - m_s3_1 = 0; - m_s4 = 0; - m_s4_1 = 0; - } - - template <typename Sample> - inline Sample process1 (const Sample in, - const BiquadBase& s, - const double vsa) - { - double out; - - // can be: in += m_s1_1; - m_v = in + m_s1_1; - out = s.m_b0*m_v + m_s3_1; - m_s1 = m_s2_1 - s.m_a1*m_v; - m_s2 = -s.m_a2*m_v; - m_s3 = s.m_b1*m_v + m_s4_1; - m_s4 = s.m_b2*m_v; - - m_s4_1 = m_s4; - m_s3_1 = m_s3; - m_s2_1 = m_s2; - m_s1_1 = m_s1; - - return static_cast<Sample> (out); - } + TransposedDirectFormI() + { + reset(); + } + + void reset() + { + m_v = 0; + m_s1 = 0; + m_s1_1 = 0; + m_s2 = 0; + m_s2_1 = 0; + m_s3 = 0; + m_s3_1 = 0; + m_s4 = 0; + m_s4_1 = 0; + } + + template <typename Sample> + inline Sample process1(const Sample in, + const BiquadBase& s, + const double vsa) + { + double out; + + // can be: in += m_s1_1; + m_v = in + m_s1_1; + out = s.m_b0*m_v + m_s3_1; + m_s1 = m_s2_1 - s.m_a1*m_v; + m_s2 = -s.m_a2*m_v; + m_s3 = s.m_b1*m_v + m_s4_1; + m_s4 = s.m_b2*m_v; + + m_s4_1 = m_s4; + m_s3_1 = m_s3; + m_s2_1 = m_s2; + m_s1_1 = m_s1; + + return static_cast<Sample>(out); + } private: - double m_v; - double m_s1; - double m_s1_1; - double m_s2; - double m_s2_1; - double m_s3; - double m_s3_1; - double m_s4; - double m_s4_1; + double m_v; + double m_s1; + double m_s1_1; + double m_s2; + double m_s2_1; + double m_s3; + double m_s3_1; + double m_s4; + double m_s4_1; }; //------------------------------------------------------------------------------ @@ -215,40 +216,40 @@ private: class TransposedDirectFormII { public: - TransposedDirectFormII () - { - reset (); - } - - void reset () - { - m_s1 = 0; - m_s1_1 = 0; - m_s2 = 0; - m_s2_1 = 0; - } - - template <typename Sample> - inline Sample process1 (const Sample in, - const BiquadBase& s, - const double vsa) - { - double out; - - out = m_s1_1 + s.m_b0*in + vsa; - m_s1 = m_s2_1 + s.m_b1*in - s.m_a1*out; - m_s2 = s.m_b2*in - s.m_a2*out; - m_s1_1 = m_s1; - m_s2_1 = m_s2; - - return static_cast<Sample> (out); - } + TransposedDirectFormII() + { + reset(); + } + + void reset() + { + m_s1 = 0; + m_s1_1 = 0; + m_s2 = 0; + m_s2_1 = 0; + } + + template <typename Sample> + inline Sample process1(const Sample in, + const BiquadBase& s, + const double vsa) + { + double out; + + out = m_s1_1 + s.m_b0*in + vsa; + m_s1 = m_s2_1 + s.m_b1*in - s.m_a1*out; + m_s2 = s.m_b2*in - s.m_a2*out; + m_s1_1 = m_s1; + m_s2_1 = m_s2; + + return static_cast<Sample>(out); + } private: - double m_s1; - double m_s1_1; - double m_s2; - double m_s2_1; + double m_s1; + double m_s1_1; + double m_s2; + double m_s2_1; }; //------------------------------------------------------------------------------ @@ -258,38 +259,38 @@ template <int Channels, class StateType> class ChannelsState { public: - ChannelsState () - { - } - - const int getNumChannels() const - { - return Channels; - } - - void reset () - { - for (int i = 0; i < Channels; ++i) - m_state[i].reset(); - } - - StateType& operator[] (int index) - { - assert (index >= 0 && index < Channels); - return m_state[index]; - } - - template <class Filter, typename Sample> - void process (int numSamples, - Sample* const* arrayOfChannels, - Filter& filter) - { - for (int i = 0; i < Channels; ++i) - filter.process (numSamples, arrayOfChannels[i], m_state[i]); - } + ChannelsState() + { + } + + const int getNumChannels() const + { + return Channels; + } + + void reset() + { + for (int i = 0; i < Channels; ++i) + m_state[i].reset(); + } + + StateType& operator[](int index) + { + assert(index >= 0 && index < Channels); + return m_state[index]; + } + + template <class Filter, typename Sample> + void process(int numSamples, + Sample* const* arrayOfChannels, + Filter& filter) + { + for (int i = 0; i < Channels; ++i) + filter.process(numSamples, arrayOfChannels[i], m_state[i]); + } private: - StateType m_state[Channels]; + StateType m_state[Channels]; }; // Empty state, can't process anything @@ -297,23 +298,23 @@ template <class StateType> class ChannelsState <0, StateType> { public: - const int getNumChannels() const - { - return 0; - } - - void reset () - { - throw std::logic_error ("attempt to reset empty ChannelState"); - } - - template <class FilterDesign, typename Sample> - void process (int numSamples, - Sample* const* arrayOfChannels, - FilterDesign& filter) - { - throw std::logic_error ("attempt to process empty ChannelState"); - } + const int getNumChannels() const + { + return 0; + } + + void reset() + { + throw std::logic_error("attempt to reset empty ChannelState"); + } + + template <class FilterDesign, typename Sample> + void process(int numSamples, + Sample* const* arrayOfChannels, + FilterDesign& filter) + { + throw std::logic_error("attempt to process empty ChannelState"); + } }; //------------------------------------------------------------------------------ diff --git a/Source/Dsp/Types.h b/Source/Dsp/Types.h index c9445a7eb5abc833703d6ab309f124a7c040edb8..00703061982bee1c5c77a21308b73c67971b391d 100644 --- a/Source/Dsp/Types.h +++ b/Source/Dsp/Types.h @@ -39,99 +39,100 @@ THE SOFTWARE. #include "Common.h" #include "MathSupplement.h" -namespace Dsp { +namespace Dsp +{ // A conjugate or real pair struct ComplexPair : complex_pair_t { - ComplexPair () - { - } - - explicit ComplexPair (const complex_t& c1) - : complex_pair_t (c1, 0.) - { - assert (isReal()); - } - - ComplexPair (const complex_t& c1, - const complex_t& c2) - : complex_pair_t (c1, c2) - { - } - - bool isConjugate () const - { - return second == std::conj (first); - } - - bool isReal () const - { - return first.imag() == 0 && second.imag() == 0; - } - - // Returns true if this is either a conjugate pair, - // or a pair of reals where neither is zero. - bool isMatchedPair () const - { - if (first.imag() != 0) - return second == std::conj (first); - else - return second.imag () == 0 && - second.real () != 0 && - first.real () != 0; - } - - bool is_nan () const - { - return Dsp::is_nan (first) || Dsp::is_nan (second); - } + ComplexPair() + { + } + + explicit ComplexPair(const complex_t& c1) + : complex_pair_t (c1, 0.) + { + assert(isReal()); + } + + ComplexPair(const complex_t& c1, + const complex_t& c2) + : complex_pair_t (c1, c2) + { + } + + bool isConjugate() const + { + return second == std::conj(first); + } + + bool isReal() const + { + return first.imag() == 0 && second.imag() == 0; + } + + // Returns true if this is either a conjugate pair, + // or a pair of reals where neither is zero. + bool isMatchedPair() const + { + if (first.imag() != 0) + return second == std::conj(first); + else + return second.imag() == 0 && + second.real() != 0 && + first.real() != 0; + } + + bool is_nan() const + { + return Dsp::is_nan(first) || Dsp::is_nan(second); + } }; // A pair of pole/zeros. This fits in a biquad (but is missing the gain) struct PoleZeroPair { - ComplexPair poles; - ComplexPair zeros; - - PoleZeroPair () { } - - // single pole/zero - PoleZeroPair (const complex_t& p, const complex_t& z) - : poles (p), zeros (z) - { - } - - // pole/zero pair - PoleZeroPair (const complex_t& p1, const complex_t& z1, - const complex_t& p2, const complex_t& z2) - : poles (p1, p2) - , zeros (z1, z2) - { - } - - bool isSinglePole () const - { - return poles.second == 0. && zeros.second == 0.; - } - - bool is_nan () const - { - return poles.is_nan() || zeros.is_nan(); - } + ComplexPair poles; + ComplexPair zeros; + + PoleZeroPair() { } + + // single pole/zero + PoleZeroPair(const complex_t& p, const complex_t& z) + : poles(p), zeros(z) + { + } + + // pole/zero pair + PoleZeroPair(const complex_t& p1, const complex_t& z1, + const complex_t& p2, const complex_t& z2) + : poles(p1, p2) + , zeros(z1, z2) + { + } + + bool isSinglePole() const + { + return poles.second == 0. && zeros.second == 0.; + } + + bool is_nan() const + { + return poles.is_nan() || zeros.is_nan(); + } }; // Identifies the general class of filter enum Kind { - kindLowPass, - kindHighPass, - kindBandPass, - kindBandStop, - kindLowShelf, - kindHighShelf, - kindBandShelf, - kindOther + kindLowPass, + kindHighPass, + kindBandPass, + kindBandStop, + kindLowShelf, + kindHighShelf, + kindBandShelf, + kindOther }; } diff --git a/Source/Dsp/Utilities.h b/Source/Dsp/Utilities.h index d0d3612bf9593933d403dd1859338ce3de356d7f..9d20a9a6187a114cebab7144bf9dc9d8dd413eb4 100644 --- a/Source/Dsp/Utilities.h +++ b/Source/Dsp/Utilities.h @@ -38,7 +38,8 @@ THE SOFTWARE. #include "Common.h" -namespace Dsp { +namespace Dsp +{ /* * Utilities @@ -51,41 +52,41 @@ namespace Dsp { // Add src samples to dest, without clip or overflow checking. template <class Td, - class Ts> -void add (int samples, - Td* dest, - Ts const* src, - int destSkip = 0, - int srcSkip = 0) + class Ts> +void add(int samples, + Td* dest, + Ts const* src, + int destSkip = 0, + int srcSkip = 0) { - if (srcSkip !=0 || destSkip != 0) - { - ++srcSkip; - ++destSkip; - while (--samples >= 0) + if (srcSkip !=0 || destSkip != 0) { - *dest = static_cast<Td>(*src); - dest += destSkip; - src += srcSkip; + ++srcSkip; + ++destSkip; + while (--samples >= 0) + { + *dest = static_cast<Td>(*src); + dest += destSkip; + src += srcSkip; + } + } + else + { + while (--samples >= 0) + *dest++ += static_cast<Td>(*src++); } - } - else - { - while (--samples >= 0) - *dest++ += static_cast<Td>(*src++); - } } // Multichannel add template <typename Td, - typename Ts> -void add (int channels, - int samples, - Td* const* dest, - Ts const* const* src) + typename Ts> +void add(int channels, + int samples, + Td* const* dest, + Ts const* const* src) { - for (int i = channels; --i >= 0;) - add (samples, dest[i], src[i]); + for (int i = channels; --i >= 0;) + add(samples, dest[i], src[i]); } //-------------------------------------------------------------------------- @@ -93,174 +94,190 @@ void add (int channels, // Copy samples from src to dest, which may not overlap. Performs an implicit // type conversion if Ts and Td are different (for example, float to double). template <typename Td, - typename Ts> -void copy (int samples, - Td* dest, - Ts const* src, - int destSkip = 0, - int srcSkip = 0) + typename Ts> +void copy(int samples, + Td* dest, + Ts const* src, + int destSkip = 0, + int srcSkip = 0) { - if (srcSkip != 0) - { - if (destSkip != 0) + if (srcSkip != 0) { - ++srcSkip; - ++destSkip; - while (--samples >= 0) - { - *dest++ = *src++; - dest += destSkip; - src += srcSkip; - } + if (destSkip != 0) + { + ++srcSkip; + ++destSkip; + while (--samples >= 0) + { + *dest++ = *src++; + dest += destSkip; + src += srcSkip; + } + } + else + { + ++srcSkip; + while (--samples >= 0) + { + *dest++ = *src++; + src += srcSkip; + } + } } - else + else if (destSkip != 0) { - ++srcSkip; - while (--samples >= 0) - { - *dest++ = *src++; - src += srcSkip; - } + ++destSkip; + while (--samples >= 0) + { + *dest = *src++; + dest += destSkip; + } } - } - else if (destSkip != 0) - { - ++destSkip; - while (--samples >= 0) + else { - *dest = *src++; - dest += destSkip; + while (--samples >= 0) + *dest++ = *src++; } - } - else - { - while (--samples >= 0) - *dest++ = *src++; - } } // Wrapper that uses memcpy if there is no skip and the types are the same template <typename Ty> -void copy (int samples, - Ty* dest, - Ty const* src, - int destSkip = 0, - int srcSkip = 0) +void copy(int samples, + Ty* dest, + Ty const* src, + int destSkip = 0, + int srcSkip = 0) { - if (destSkip != 0 || srcSkip != 0) - copy<Ty,Ty> (samples, dest, src, destSkip, srcSkip); - else - ::memcpy (dest, src, samples * sizeof(src[0])); + if (destSkip != 0 || srcSkip != 0) + copy<Ty,Ty> (samples, dest, src, destSkip, srcSkip); + else + ::memcpy(dest, src, samples * sizeof(src[0])); } // Copy a set of channels from src to dest, with implicit type conversion. template <typename Td, - typename Ts> -void copy (int channels, - int samples, - Td* const* dest, - Ts const* const* src, - int destSkip = 0, - int srcSkip = 0) + typename Ts> +void copy(int channels, + int samples, + Td* const* dest, + Ts const* const* src, + int destSkip = 0, + int srcSkip = 0) { - for (int i = channels; --i >= 0;) - copy (samples, dest[i], src[i], destSkip, srcSkip); + for (int i = channels; --i >= 0;) + copy(samples, dest[i], src[i], destSkip, srcSkip); } //-------------------------------------------------------------------------- // Deinterleave channels. Performs implicit type conversion. template <typename Td, typename Ts> -void deinterleave (int channels, - int samples, - Td* const* dest, - Ts const* src) +void deinterleave(int channels, + int samples, + Td* const* dest, + Ts const* src) { - assert (channels > 1); - - switch (channels) - { - case 2: - { - Td* l = dest[0]; - Td* r = dest[1]; - int n = (samples + 7) / 8; - switch (samples % 8) - { - case 0: do - { - *l++ = *src++; *r++ = *src++; - case 7: *l++ = *src++; *r++ = *src++; - case 6: *l++ = *src++; *r++ = *src++; - case 5: *l++ = *src++; *r++ = *src++; - case 4: *l++ = *src++; *r++ = *src++; - case 3: *l++ = *src++; *r++ = *src++; - case 2: *l++ = *src++; *r++ = *src++; - case 1: *l++ = *src++; *r++ = *src++; - } - while (--n > 0); - } - } - break; + assert(channels > 1); - default: + switch (channels) { - for (int i = channels; --i >= 0;) - copy (samples, dest[i], src + i, 0, channels - 1); - } - break; - }; + case 2: + { + Td* l = dest[0]; + Td* r = dest[1]; + int n = (samples + 7) / 8; + switch (samples % 8) + { + case 0: + do + { + *l++ = *src++; + *r++ = *src++; + case 7: + *l++ = *src++; + *r++ = *src++; + case 6: + *l++ = *src++; + *r++ = *src++; + case 5: + *l++ = *src++; + *r++ = *src++; + case 4: + *l++ = *src++; + *r++ = *src++; + case 3: + *l++ = *src++; + *r++ = *src++; + case 2: + *l++ = *src++; + *r++ = *src++; + case 1: + *l++ = *src++; + *r++ = *src++; + } + while (--n > 0); + } + } + break; + + default: + { + for (int i = channels; --i >= 0;) + copy(samples, dest[i], src + i, 0, channels - 1); + } + break; + }; } // Convenience for a stereo pair of channels template <typename Td, - typename Ts> -void deinterleave (int samples, - Td* left, - Td* right, - Ts const* src) + typename Ts> +void deinterleave(int samples, + Td* left, + Td* right, + Ts const* src) { - Td* dest[2]; - dest[0] = left; - dest[1] = right; - deinterleave (2, samples, dest, src); + Td* dest[2]; + dest[0] = left; + dest[1] = right; + deinterleave(2, samples, dest, src); } //-------------------------------------------------------------------------- // Fade src into dest template <typename Td, - typename Ts, - typename Ty> -void fade (int samples, - Td* dest, - Ts const* src, - Ty start = 0, - Ty end = 1) + typename Ts, + typename Ty> +void fade(int samples, + Td* dest, + Ts const* src, + Ty start = 0, + Ty end = 1) { - Ty t = start; - Ty dt = (end - start) / samples; - - while (--samples >= 0) - { - *dest++ = static_cast<Td>(*dest + t * (*src++ - *dest)); - t += dt; - } + Ty t = start; + Ty dt = (end - start) / samples; + + while (--samples >= 0) + { + *dest++ = static_cast<Td>(*dest + t * (*src++ - *dest)); + t += dt; + } } // Fade src channels into dest channels template <typename Td, - typename Ts, - typename Ty> -void fade (int channels, - int samples, - Td* const* dest, - Ts const* const* src, - Ty start = 0, - Ty end = 1) + typename Ts, + typename Ty> +void fade(int channels, + int samples, + Td* const* dest, + Ts const* const* src, + Ty start = 0, + Ty end = 1) { - for (int i = channels; --i >= 0;) - fade (samples, dest[i], src[i], start, end); + for (int i = channels; --i >= 0;) + fade(samples, dest[i], src[i], start, end); } //-------------------------------------------------------------------------- @@ -269,106 +286,122 @@ void fade (int channels, // (Destination requires channels*frames samples of storage). Performs // implicit type conversion. template <typename Td, - typename Ts> -void interleave (int channels, - size_t samples, - Td* dest, - Ts const* const* src) + typename Ts> +void interleave(int channels, + size_t samples, + Td* dest, + Ts const* const* src) { - assert (channels>1); + assert(channels>1); - if (samples==0) - return; - - switch (channels) - { - case 2: - { - const Ts* l = src[0]; - const Ts* r = src[1]; - - // note that Duff's Device only works when samples>0 - int n = (samples + 7) / 8; - switch (samples % 8) - { - case 0: do - { - *dest++ = *l++; *dest++ = *r++; - case 7: *dest++ = *l++; *dest++ = *r++; - case 6: *dest++ = *l++; *dest++ = *r++; - case 5: *dest++ = *l++; *dest++ = *r++; - case 4: *dest++ = *l++; *dest++ = *r++; - case 3: *dest++ = *l++; *dest++ = *r++; - case 2: *dest++ = *l++; *dest++ = *r++; - case 1: *dest++ = *l++; *dest++ = *r++; - } - while (--n > 0); - } - } - break; + if (samples==0) + return; - default: + switch (channels) { - for (int i = channels; --i >= 0;) - copy (samples, dest + i, src[i], channels - 1, 0); - } - break; - }; + case 2: + { + const Ts* l = src[0]; + const Ts* r = src[1]; + + // note that Duff's Device only works when samples>0 + int n = (samples + 7) / 8; + switch (samples % 8) + { + case 0: + do + { + *dest++ = *l++; + *dest++ = *r++; + case 7: + *dest++ = *l++; + *dest++ = *r++; + case 6: + *dest++ = *l++; + *dest++ = *r++; + case 5: + *dest++ = *l++; + *dest++ = *r++; + case 4: + *dest++ = *l++; + *dest++ = *r++; + case 3: + *dest++ = *l++; + *dest++ = *r++; + case 2: + *dest++ = *l++; + *dest++ = *r++; + case 1: + *dest++ = *l++; + *dest++ = *r++; + } + while (--n > 0); + } + } + break; + + default: + { + for (int i = channels; --i >= 0;) + copy(samples, dest + i, src[i], channels - 1, 0); + } + break; + }; } //-------------------------------------------------------------------------- // Convenience for a stereo channel pair template <typename Td, - typename Ts> -void interleave (int samples, - Td* dest, - Ts const* left, - Ts const* right) + typename Ts> +void interleave(int samples, + Td* dest, + Ts const* left, + Ts const* right) { - const Ts* src[2]; - src[0] = left; - src[1] = right; - interleave (2, samples, dest, src); + const Ts* src[2]; + src[0] = left; + src[1] = right; + interleave(2, samples, dest, src); } //-------------------------------------------------------------------------- // Multiply samples by a constant, without clip or overflow checking. template <typename Td, - typename Ty> -void multiply (int samples, - Td* dest, - Ty factor, - int destSkip = 0) + typename Ty> +void multiply(int samples, + Td* dest, + Ty factor, + int destSkip = 0) { - if (destSkip != 0) - { - ++destSkip; - while (--samples >= 0) + if (destSkip != 0) { - *dest = static_cast<Td>(*dest * factor); - dest += destSkip; + ++destSkip; + while (--samples >= 0) + { + *dest = static_cast<Td>(*dest * factor); + dest += destSkip; + } + } + else + { + while (--samples >= 0) + *dest++ = static_cast<Td>(*dest * factor); } - } - else - { - while (--samples >= 0) - *dest++ = static_cast<Td>(*dest * factor); - } } // Multiply a set of channels by a constant. template <typename Td, - typename Ty> -void multiply (int channels, - int samples, - Td* const* dest, - Ty factor, - int destSkip = 0) + typename Ty> +void multiply(int channels, + int samples, + Td* const* dest, + Ty factor, + int destSkip = 0) { - for (int i = channels; --i >= 0;) - multiply (samples, dest[i], factor, destSkip); + for (int i = channels; --i >= 0;) + multiply(samples, dest[i], factor, destSkip); } //-------------------------------------------------------------------------- @@ -376,68 +409,68 @@ void multiply (int channels, // Copy samples from src to dest in reversed order. Performs implicit // type conversion. src and dest may not overlap. template <typename Td, - typename Ts> -void reverse (int samples, - Td* dest, - Ts const* src, - int destSkip = 0, - int srcSkip = 0 ) + typename Ts> +void reverse(int samples, + Td* dest, + Ts const* src, + int destSkip = 0, + int srcSkip = 0) { - src += (srcSkip + 1) * samples; + src += (srcSkip + 1) * samples; - if (srcSkip != 0 || destSkip == 0) - { - ++srcSkip; - ++destSkip; - while (--samples >= 0) + if (srcSkip != 0 || destSkip == 0) { - src -= srcSkip; - *dest = *src; - dest += destSkip; + ++srcSkip; + ++destSkip; + while (--samples >= 0) + { + src -= srcSkip; + *dest = *src; + dest += destSkip; + } + } + else + { + while (--samples >= 0) + *dest++ = *--src; } - } - else - { - while (--samples >= 0) - *dest++ = *--src; - } } template <typename Td, typename Ts> -void reverse (int channels, size_t frames, Td* const* dest, const Ts* const* src) +void reverse(int channels, size_t frames, Td* const* dest, const Ts* const* src) { - for (int i = channels; --i >= 0;) - reverse (frames, dest[i], src[i]); + for (int i = channels; --i >= 0;) + reverse(frames, dest[i], src[i]); } //-------------------------------------------------------------------------- template <typename Tn> -void to_mono (int samples, Tn* dest, Tn const* left, Tn const* right) +void to_mono(int samples, Tn* dest, Tn const* left, Tn const* right) { #if 1 - while (samples-- > 0) - *dest++ = (*left++ + *right++) * Tn(0.70710678118654752440084436210485); + while (samples-- > 0) + *dest++ = (*left++ + *right++) * Tn(0.70710678118654752440084436210485); #else - while (samples-- > 0) - *dest++ = (*left++ + *right++) * Tn(0.5); + while (samples-- > 0) + *dest++ = (*left++ + *right++) * Tn(0.5); #endif } //-------------------------------------------------------------------------- template <typename T> -void validate (int numChannels, int numSamples, T const* const* src) +void validate(int numChannels, int numSamples, T const* const* src) { - for (int i = 0; i < numChannels; ++i) - { - T const* p = src [i]; - for (int j = numSamples; j > 0; --j) + for (int i = 0; i < numChannels; ++i) { - T v = *p++; - assert (v < 2 && v > -2); + T const* p = src [i]; + for (int j = numSamples; j > 0; --j) + { + T v = *p++; + assert(v < 2 && v > -2); + } } - } } //-------------------------------------------------------------------------- @@ -447,90 +480,91 @@ void validate (int numChannels, int numSamples, T const* const* src) * this stuff all depends on is_pod which is not always available * */ -namespace detail { +namespace detail +{ template <typename Ty, - bool isPod> + bool isPod> struct zero { - static void process (int samples, - Ty* dest, - int destSkip) - { - if (destSkip != 0) - { - ++destSkip; - while (--samples >= 0) - { - *dest = Ty(); - dest += destSkip; - } - } - else + static void process(int samples, + Ty* dest, + int destSkip) { - std::fill (dest, dest + samples, Ty()); + if (destSkip != 0) + { + ++destSkip; + while (--samples >= 0) + { + *dest = Ty(); + dest += destSkip; + } + } + else + { + std::fill(dest, dest + samples, Ty()); + } } - } }; template <typename Ty> struct zero<Ty, true> { - static void process (int samples, - Ty* dest, - int destSkip) - { - if (destSkip != 0) - zero<Ty,false>::process (samples, dest, destSkip); - else - ::memset (dest, 0, samples * sizeof(dest[0])); - } + static void process(int samples, + Ty* dest, + int destSkip) + { + if (destSkip != 0) + zero<Ty,false>::process(samples, dest, destSkip); + else + ::memset(dest, 0, samples * sizeof(dest[0])); + } }; } // Fill a channel with zeros. This works even if Ty is not a basic type. template <typename Ty> -void zero (int samples, - Ty* dest, - int destSkip = 0) +void zero(int samples, + Ty* dest, + int destSkip = 0) { - detail::zero<Ty, tr1::is_pod<Ty>::value>::process (samples, dest, destSkip ); + detail::zero<Ty, tr1::is_pod<Ty>::value>::process(samples, dest, destSkip); } #else // Fill a channel with zeros. This works even if Ty is not a basic type. template <typename Ty> -void zero (int samples, - Ty* dest, - int destSkip = 0) +void zero(int samples, + Ty* dest, + int destSkip = 0) { - if (destSkip != 0) - { - ++destSkip; - while (--samples >= 0) + if (destSkip != 0) + { + ++destSkip; + while (--samples >= 0) + { + *dest = Ty(); + dest += destSkip; + } + } + else { - *dest = Ty(); - dest += destSkip; + std::fill(dest, dest + samples, Ty()); } - } - else - { - std::fill (dest, dest + samples, Ty()); - } } #endif // Fill a set of channels with zero. template <typename Ty> -void zero (int channels, - int samples, - Ty* const* dest, - int destSkip = 0) +void zero(int channels, + int samples, + Ty* const* dest, + int destSkip = 0) { - for (int i = channels; --i >= 0;) - zero (samples, dest[i], destSkip); + for (int i = channels; --i >= 0;) + zero(samples, dest[i], destSkip); } //------------------------------------------------------------------------------ @@ -548,100 +582,100 @@ void zero (int channels, template <class TFunction> double BrentMinimize ( - TFunction& f, // [in] objective function to minimize - double leftEnd, // [in] smaller value of bracketing interval - double rightEnd, // [in] larger value of bracketing interval - double epsilon, // [in] stopping tolerance - double& minLoc // [out] location of minimum + TFunction& f, // [in] objective function to minimize + double leftEnd, // [in] smaller value of bracketing interval + double rightEnd, // [in] larger value of bracketing interval + double epsilon, // [in] stopping tolerance + double& minLoc // [out] location of minimum ) { - double d, e, m, p, q, r, tol, t2, u, v, w, fu, fv, fw, fx; - static const double c = 0.5*(3.0 - ::std::sqrt(5.0)); - static const double SQRT_DBL_EPSILON = ::std::sqrt(DBL_EPSILON); - - double& a = leftEnd; - double& b = rightEnd; - double& x = minLoc; - - v = w = x = a + c*(b - a); - d = e = 0.0; - fv = fw = fx = f(x); - int counter = 0; + double d, e, m, p, q, r, tol, t2, u, v, w, fu, fv, fw, fx; + static const double c = 0.5*(3.0 - ::std::sqrt(5.0)); + static const double SQRT_DBL_EPSILON = ::std::sqrt(DBL_EPSILON); + + double& a = leftEnd; + double& b = rightEnd; + double& x = minLoc; + + v = w = x = a + c*(b - a); + d = e = 0.0; + fv = fw = fx = f(x); + int counter = 0; loop: - counter++; - m = 0.5*(a + b); - tol = SQRT_DBL_EPSILON*::fabs(x) + epsilon; - t2 = 2.0*tol; - // Check stopping criteria - if (::fabs(x - m) > t2 - 0.5*(b - a)) - { - p = q = r = 0.0; - if (::fabs(e) > tol) + counter++; + m = 0.5*(a + b); + tol = SQRT_DBL_EPSILON*::fabs(x) + epsilon; + t2 = 2.0*tol; + // Check stopping criteria + if (::fabs(x - m) > t2 - 0.5*(b - a)) { - // fit parabola - r = (x - w)*(fx - fv); - q = (x - v)*(fx - fw); - p = (x - v)*q - (x - w)*r; - q = 2.0*(q - r); - (q > 0.0) ? p = -p : q = -q; - r = e; - e = d; - } - if (::fabs(p) < ::fabs(0.5*q*r) && p < q*(a - x) && p < q*(b - x)) - { - // A parabolic interpolation step - d = p/q; - u = x + d; - // f must not be evaluated too close to a or b - if (u - a < t2 || b - u < t2) - d = (x < m) ? tol : -tol; - } - else - { - // A golden section step - e = (x < m) ? b : a; - e -= x; - d = c*e; - } - // f must not be evaluated too close to x - if (::fabs(d) >= tol) - u = x + d; - else if (d > 0.0) - u = x + tol; - else - u = x - tol; - fu = f(u); - // Update a, b, v, w, and x - if (fu <= fx) - { - (u < x) ? b = x : a = x; - v = w; - fv = fw; - w = x; - fw = fx; - x = u; - fx = fu; - } - else - { - (u < x) ? a = u : b = u; - if (fu <= fw || w == x) - { - v = w; - fv = fw; - w = u; - fw = fu; - } - else if (fu <= fv || v == x || v == w) - { - v = u; - fv = fu; - } + p = q = r = 0.0; + if (::fabs(e) > tol) + { + // fit parabola + r = (x - w)*(fx - fv); + q = (x - v)*(fx - fw); + p = (x - v)*q - (x - w)*r; + q = 2.0*(q - r); + (q > 0.0) ? p = -p : q = -q; + r = e; + e = d; + } + if (::fabs(p) < ::fabs(0.5*q*r) && p < q*(a - x) && p < q*(b - x)) + { + // A parabolic interpolation step + d = p/q; + u = x + d; + // f must not be evaluated too close to a or b + if (u - a < t2 || b - u < t2) + d = (x < m) ? tol : -tol; + } + else + { + // A golden section step + e = (x < m) ? b : a; + e -= x; + d = c*e; + } + // f must not be evaluated too close to x + if (::fabs(d) >= tol) + u = x + d; + else if (d > 0.0) + u = x + tol; + else + u = x - tol; + fu = f(u); + // Update a, b, v, w, and x + if (fu <= fx) + { + (u < x) ? b = x : a = x; + v = w; + fv = fw; + w = x; + fw = fx; + x = u; + fx = fu; + } + else + { + (u < x) ? a = u : b = u; + if (fu <= fw || w == x) + { + v = w; + fv = fw; + w = u; + fw = fu; + } + else if (fu <= fv || v == x || v == w) + { + v = u; + fv = fu; + } + } + goto loop; // Yes, the dreaded goto statement. But the code + // here is faithful to Brent's orginal pseudocode. } - goto loop; // Yes, the dreaded goto statement. But the code - // here is faithful to Brent's orginal pseudocode. - } - return fx; + return fx; } //------------------------------------------------------------------------------ @@ -651,47 +685,47 @@ template <int Channels=2, typename Value=float> class EnvelopeFollower { public: - EnvelopeFollower() - { - for (int i = 0; i < Channels; i++) - m_env[i]=0; - } - - Value operator[] (int channel) const - { - return m_env[channel]; - } - - void Setup (int sampleRate, double attackMs, double releaseMs) - { - m_a = pow (0.01, 1.0 / (attackMs * sampleRate * 0.001)); - m_r = pow (0.01, 1.0 / (releaseMs * sampleRate * 0.001)); - } - - void Process (size_t samples, const Value** src) - { - for( int i=0; i<Channels; i++ ) + EnvelopeFollower() { - const Value* cur = src[i]; - - double e = m_env[i]; - for (int n = samples; n; n--) - { - double v = ::fabs(*cur++); - if (v > e) - e = m_a * (e - v) + v; - else - e = m_r * (e - v) + v; - } - m_env[i]=e; + for (int i = 0; i < Channels; i++) + m_env[i]=0; + } + + Value operator[](int channel) const + { + return m_env[channel]; + } + + void Setup(int sampleRate, double attackMs, double releaseMs) + { + m_a = pow(0.01, 1.0 / (attackMs * sampleRate * 0.001)); + m_r = pow(0.01, 1.0 / (releaseMs * sampleRate * 0.001)); + } + + void Process(size_t samples, const Value** src) + { + for (int i=0; i<Channels; i++) + { + const Value* cur = src[i]; + + double e = m_env[i]; + for (int n = samples; n; n--) + { + double v = ::fabs(*cur++); + if (v > e) + e = m_a * (e - v) + v; + else + e = m_r * (e - v) + v; + } + m_env[i]=e; + } } - } - double m_env[Channels]; + double m_env[Channels]; protected: - double m_a; - double m_r; + double m_a; + double m_r; }; } diff --git a/Source/Main.cpp b/Source/Main.cpp index 0d73d5c5db07a9e04426caf65daadf7d70350bce..bc7b7c57ca6c429807666573f6e4dc0f31a2e564 100644 --- a/Source/Main.cpp +++ b/Source/Main.cpp @@ -35,24 +35,24 @@ //Initializer function to load OpenGL Extensions on Windows void glWinInit() { -glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT"); -glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) wglGetProcAddress("glGenerateMipmap"); -glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) wglGetProcAddress("glFramebufferRenderbufferEXT"); -glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT"); -glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) wglGetProcAddress("glRenderbufferStorageEXT"); -glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) wglGetProcAddress("glBindRenderbufferEXT"); -glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) wglGetProcAddress("glGenRenderbuffersEXT"); -glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT"); -glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT"); -glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) wglGetProcAddress("glDeleteRenderbuffers"); -glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) wglGetProcAddress("glDeleteFramebuffers"); + glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT"); + glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) wglGetProcAddress("glGenerateMipmap"); + glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) wglGetProcAddress("glFramebufferRenderbufferEXT"); + glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT"); + glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) wglGetProcAddress("glRenderbufferStorageEXT"); + glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) wglGetProcAddress("glBindRenderbufferEXT"); + glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) wglGetProcAddress("glGenRenderbuffersEXT"); + glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT"); + glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT"); + glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) wglGetProcAddress("glDeleteRenderbuffers"); + glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) wglGetProcAddress("glDeleteFramebuffers"); } #endif //------------------------------------------------------------------ /** - + Launches the application and creates the CustomLookAndFeelClass. The OpenEphysApplication class own the application's MainWindow (via @@ -72,29 +72,32 @@ public: ~OpenEphysApplication() {} //============================================================================== - void initialise (const String& commandLine) + void initialise(const String& commandLine) { - StringArray parameters; - parameters.addTokens(commandLine," ","\""); + StringArray parameters; + parameters.addTokens(commandLine," ","\""); #ifdef WIN32 - glWinInit(); + //glWinInit(); - if (parameters.contains("--console",true)) { - if (AllocConsole()) - { - freopen("CONOUT$","w",stdout); - SetConsoleTitle("Debug Console"); - } - } + if (parameters.contains("--console",true)) + { + if (AllocConsole()) + { + freopen("CONOUT$","w",stdout); + SetConsoleTitle("Debug Console"); + } + } #endif - mainWindow = new MainWindow(); - customLookAndFeel = new CustomLookAndFeel(); LookAndFeel::setDefaultLookAndFeel(customLookAndFeel); - + + mainWindow = new MainWindow(); + + + } void shutdown() { } @@ -107,10 +110,19 @@ public: } //============================================================================== - const String getApplicationName() { return "Open Ephys GUI";} - const String getApplicationVersion() {return ProjectInfo::versionString;} - bool moreThanOneInstanceAllowed() {return true;} - void anotherInstanceStarted (const String& commandLine) + const String getApplicationName() + { + return "Open Ephys GUI"; + } + const String getApplicationVersion() + { + return ProjectInfo::versionString; + } + bool moreThanOneInstanceAllowed() + { + return true; + } + void anotherInstanceStarted(const String& commandLine) {} private: diff --git a/Source/MainWindow.cpp b/Source/MainWindow.cpp index e254417248c9057b9ea2743c03d431d15e376aa8..631107341811d569986e8597ab86fc043c867305 100644 --- a/Source/MainWindow.cpp +++ b/Source/MainWindow.cpp @@ -27,13 +27,13 @@ //----------------------------------------------------------------------- MainWindow::MainWindow() - : DocumentWindow (JUCEApplication::getInstance()->getApplicationName(), - Colour(Colours::black), - DocumentWindow::allButtons) + : DocumentWindow(JUCEApplication::getInstance()->getApplicationName(), + Colour(Colours::black), + DocumentWindow::allButtons) { - setResizable (true, // isResizable - false); // useBottomCornerRisizer -- doesn't work very well + setResizable(true, // isResizable + false); // useBottomCornerRisizer -- doesn't work very well // Constraining the window's size doesn't seem to work: // setResizeLimits(500, 400, 10000, 10000); @@ -41,56 +41,58 @@ MainWindow::MainWindow() // Create ProcessorGraph and AudioComponent, and connect them. // Callbacks will be set by the play button in the control panel - processorGraph = new ProcessorGraph(); - audioComponent = new AudioComponent(); - audioComponent->connectToProcessorGraph(processorGraph); + processorGraph = new ProcessorGraph(); + audioComponent = new AudioComponent(); + audioComponent->connectToProcessorGraph(processorGraph); - setContentOwned (new UIComponent(this, processorGraph, audioComponent), true); + setContentOwned(new UIComponent(this, processorGraph, audioComponent), true); - UIComponent* ui = (UIComponent*) getContentComponent(); + UIComponent* ui = (UIComponent*) getContentComponent(); - commandManager.registerAllCommandsForTarget (ui); - commandManager.registerAllCommandsForTarget (JUCEApplication::getInstance()); + commandManager.registerAllCommandsForTarget(ui); + commandManager.registerAllCommandsForTarget(JUCEApplication::getInstance()); - ui->setApplicationCommandManagerToWatch(&commandManager); + ui->setApplicationCommandManagerToWatch(&commandManager); - addKeyListener(commandManager.getKeyMappings()); + addKeyListener(commandManager.getKeyMappings()); + + loadWindowBounds(); + setUsingNativeTitleBar(true); + Component::addToDesktop(getDesktopWindowStyleFlags()); // prevents the maximize + // button from randomly disappearing + setVisible(true); - loadWindowBounds(); - setUsingNativeTitleBar (true); - Component::addToDesktop (getDesktopWindowStyleFlags()); // prevents the maximize - // button from randomly disappearing - setVisible (true); - } MainWindow::~MainWindow() { - if (audioComponent->callbacksAreActive()) { - audioComponent->endCallbacks(); - processorGraph->disableProcessors(); - } + if (audioComponent->callbacksAreActive()) + { + audioComponent->endCallbacks(); + processorGraph->disableProcessors(); + } - saveWindowBounds(); + saveWindowBounds(); - audioComponent->disconnectProcessorGraph(); - UIComponent* ui = (UIComponent*) getContentComponent(); - ui->disableDataViewport(); + audioComponent->disconnectProcessorGraph(); + UIComponent* ui = (UIComponent*) getContentComponent(); + ui->disableDataViewport(); - setMenuBar(0); + setMenuBar(0); - #if JUCE_MAC - MenuBarModel::setMacMainMenu (0); - #endif +#if JUCE_MAC + MenuBarModel::setMacMainMenu(0); +#endif } void MainWindow::closeButtonPressed() -{ - if (audioComponent->callbacksAreActive()) { - audioComponent->endCallbacks(); - processorGraph->disableProcessors(); +{ + if (audioComponent->callbacksAreActive()) + { + audioComponent->endCallbacks(); + processorGraph->disableProcessors(); } JUCEApplication::getInstance()->systemRequestedQuit(); @@ -103,7 +105,7 @@ void MainWindow::saveWindowBounds() std::cout << "Saving window bounds." << std::endl; #ifdef WIN32 - File file = File::getCurrentWorkingDirectory().getChildFile("windowState.xml"); + File file = File::getCurrentWorkingDirectory().getChildFile("windowState.xml"); #else File file = File("./windowState.xml"); #endif @@ -121,39 +123,41 @@ void MainWindow::saveWindowBounds() xml->addChildElement(bounds); String error; - - if (! xml->writeToFile (file, String::empty)) + + if (! xml->writeToFile(file, String::empty)) error = "Couldn't write to file"; - + delete xml; } void MainWindow::loadWindowBounds() { - + std::cout << "Loading window bounds." << std::endl; - + #ifdef WIN32 - File file = File::getCurrentWorkingDirectory().getChildFile("windowState.xml"); + File file = File::getCurrentWorkingDirectory().getChildFile("windowState.xml"); #else File file = File("./windowState.xml"); #endif - XmlDocument doc (file); + XmlDocument doc(file); XmlElement* xml = doc.getDocumentElement(); - if (xml == 0 || ! xml->hasTagName ("MAINWINDOW")) + if (xml == 0 || ! xml->hasTagName("MAINWINDOW")) { - + std::cout << "File not found." << std::endl; delete xml; - centreWithSize (800, 600); + centreWithSize(800, 600); - } else { + } + else + { String description; - forEachXmlChildElement (*xml, e) + forEachXmlChildElement(*xml, e) { int x = e->getIntAttribute("x"); @@ -165,7 +169,7 @@ void MainWindow::loadWindowBounds() // without the correction, you get drift over time #ifdef WIN32 - setTopLeftPosition(x,y); //Windows doesn't need correction + setTopLeftPosition(x,y); //Windows doesn't need correction #else setTopLeftPosition(x,y-27); #endif @@ -176,5 +180,5 @@ void MainWindow::loadWindowBounds() delete xml; } - // return "Everything went ok."; + // return "Everything went ok."; } diff --git a/Source/MainWindow.h b/Source/MainWindow.h index 07dc204187a8a0329ae55bb86e0e879401961f88..7592b0432c4c062d255a7804bf2b1b2a79858a52 100644 --- a/Source/MainWindow.h +++ b/Source/MainWindow.h @@ -24,9 +24,6 @@ #ifndef __MAINWINDOW_H_BA75E17__ #define __MAINWINDOW_H_BA75E17__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../JuceLibraryCode/JuceHeader.h" #include "UI/UIComponent.h" #include "Audio/AudioComponent.h" @@ -58,12 +55,12 @@ public: the MainWindow and closes the application. */ void closeButtonPressed(); - /** A JUCE class that allows the MainWindow to respond to keyboard and menubar - commands. */ + /** A JUCE class that allows the MainWindow to respond to keyboard and menubar + commands. */ ApplicationCommandManager commandManager; private: - + /** Saves the MainWindow's boundaries into the file "windowState.xml", located in the directory from which the GUI is run. */ void saveWindowBounds(); @@ -73,12 +70,12 @@ private: void loadWindowBounds(); /** A pointer to the application's AudioComponent (owned by the MainWindow). */ - ScopedPointer<AudioComponent> audioComponent; + ScopedPointer<AudioComponent> audioComponent; - /** A pointer to the application's ProcessorGraph (owned by the MainWindow). */ - ScopedPointer<ProcessorGraph> processorGraph; + /** A pointer to the application's ProcessorGraph (owned by the MainWindow). */ + ScopedPointer<ProcessorGraph> processorGraph; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow) + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MainWindow) }; diff --git a/Source/Network/PracticalSocket.cpp b/Source/Network/PracticalSocket.cpp index 0e997022a08c9fc01bcbd8514c3cdc7922781145..97d67e055a5bc4b00b40ba387c96211c8590ddd1 100644 --- a/Source/Network/PracticalSocket.cpp +++ b/Source/Network/PracticalSocket.cpp @@ -20,17 +20,17 @@ #include "PracticalSocket.h" #ifdef WIN32 - #include <winsock.h> // For socket(), connect(), send(), and recv() - typedef int socklen_t; - typedef char raw_type; // Type used for raw data on this platform +#include <winsock.h> // For socket(), connect(), send(), and recv() +typedef int socklen_t; +typedef char raw_type; // Type used for raw data on this platform #else - #include <sys/types.h> // For data types - #include <sys/socket.h> // For socket(), connect(), send(), and recv() - #include <netdb.h> // For gethostbyname() - #include <arpa/inet.h> // For inet_addr() - #include <unistd.h> // For close() - #include <netinet/in.h> // For sockaddr_in - typedef void raw_type; // Type used for raw data on this platform +#include <sys/types.h> // For data types +#include <sys/socket.h> // For socket(), connect(), send(), and recv() +#include <netdb.h> // For gethostbyname() +#include <arpa/inet.h> // For inet_addr() +#include <unistd.h> // For close() +#include <netinet/in.h> // For sockaddr_in +typedef void raw_type; // Type used for raw data on this platform #endif #include <errno.h> // For errno @@ -43,338 +43,400 @@ static bool initialized = false; // SocketException Code -SocketException::SocketException(const string &message, bool inclSysMsg) - throw() : userMessage(message) { - if (inclSysMsg) { - userMessage.append(": "); - userMessage.append(strerror(errno)); - } +SocketException::SocketException(const string& message, bool inclSysMsg) +throw() : userMessage(message) +{ + if (inclSysMsg) + { + userMessage.append(": "); + userMessage.append(strerror(errno)); + } } -SocketException::~SocketException() throw() { +SocketException::~SocketException() throw() +{ } -const char *SocketException::what() const throw() { - return userMessage.c_str(); +const char* SocketException::what() const throw() +{ + return userMessage.c_str(); } // Function to fill in address structure given an address and port -static void fillAddr(const string &address, unsigned short port, - sockaddr_in &addr) { - memset(&addr, 0, sizeof(addr)); // Zero out address structure - addr.sin_family = AF_INET; // Internet address - - hostent *host; // Resolve name - if ((host = gethostbyname(address.c_str())) == NULL) { - // strerror() will not work for gethostbyname() and hstrerror() - // is supposedly obsolete - throw SocketException("Failed to resolve name (gethostbyname())"); - } - addr.sin_addr.s_addr = *((unsigned long *) host->h_addr_list[0]); +static void fillAddr(const string& address, unsigned short port, + sockaddr_in& addr) +{ + memset(&addr, 0, sizeof(addr)); // Zero out address structure + addr.sin_family = AF_INET; // Internet address + + hostent* host; // Resolve name + if ((host = gethostbyname(address.c_str())) == NULL) + { + // strerror() will not work for gethostbyname() and hstrerror() + // is supposedly obsolete + throw SocketException("Failed to resolve name (gethostbyname())"); + } + addr.sin_addr.s_addr = *((unsigned long*) host->h_addr_list[0]); - addr.sin_port = htons(port); // Assign port in network byte order + addr.sin_port = htons(port); // Assign port in network byte order } // Socket Code -Socket::Socket(int type, int protocol) throw(SocketException) { - #ifdef WIN32 - if (!initialized) { - WORD wVersionRequested; - WSADATA wsaData; - - wVersionRequested = MAKEWORD(2, 0); // Request WinSock v2.0 - if (WSAStartup(wVersionRequested, &wsaData) != 0) { // Load WinSock DLL - throw SocketException("Unable to load WinSock DLL"); - } - initialized = true; +Socket::Socket(int type, int protocol) throw(SocketException) +{ +#ifdef WIN32 + if (!initialized) + { + WORD wVersionRequested; + WSADATA wsaData; + + wVersionRequested = MAKEWORD(2, 0); // Request WinSock v2.0 + if (WSAStartup(wVersionRequested, &wsaData) != 0) // Load WinSock DLL + { + throw SocketException("Unable to load WinSock DLL"); + } + initialized = true; } - #endif +#endif - // Make a new socket - if ((sockDesc = socket(PF_INET, type, protocol)) < 0) { - throw SocketException("Socket creation failed (socket())", true); - } + // Make a new socket + if ((sockDesc = socket(PF_INET, type, protocol)) < 0) + { + throw SocketException("Socket creation failed (socket())", true); + } } -Socket::Socket(int sockDesc) { - this->sockDesc = sockDesc; +Socket::Socket(int sockDesc) +{ + this->sockDesc = sockDesc; } -Socket::~Socket() { - #ifdef WIN32 +Socket::~Socket() +{ +#ifdef WIN32 ::closesocket(sockDesc); - #else +#else ::close(sockDesc); - #endif - sockDesc = -1; +#endif + sockDesc = -1; } -string Socket::getLocalAddress() throw(SocketException) { - sockaddr_in addr; - unsigned int addr_len = sizeof(addr); +string Socket::getLocalAddress() throw(SocketException) +{ + sockaddr_in addr; + unsigned int addr_len = sizeof(addr); - if (getsockname(sockDesc, (sockaddr *) &addr, (socklen_t *) &addr_len) < 0) { - throw SocketException("Fetch of local address failed (getsockname())", true); - } - return inet_ntoa(addr.sin_addr); + if (getsockname(sockDesc, (sockaddr*) &addr, (socklen_t*) &addr_len) < 0) + { + throw SocketException("Fetch of local address failed (getsockname())", true); + } + return inet_ntoa(addr.sin_addr); } -unsigned short Socket::getLocalPort() throw(SocketException) { - sockaddr_in addr; - unsigned int addr_len = sizeof(addr); +unsigned short Socket::getLocalPort() throw(SocketException) +{ + sockaddr_in addr; + unsigned int addr_len = sizeof(addr); - if (getsockname(sockDesc, (sockaddr *) &addr, (socklen_t *) &addr_len) < 0) { - throw SocketException("Fetch of local port failed (getsockname())", true); - } - return ntohs(addr.sin_port); + if (getsockname(sockDesc, (sockaddr*) &addr, (socklen_t*) &addr_len) < 0) + { + throw SocketException("Fetch of local port failed (getsockname())", true); + } + return ntohs(addr.sin_port); } -void Socket::setLocalPort(unsigned short localPort) throw(SocketException) { - // Bind the socket to its port - sockaddr_in localAddr; - memset(&localAddr, 0, sizeof(localAddr)); - localAddr.sin_family = AF_INET; - localAddr.sin_addr.s_addr = htonl(INADDR_ANY); - localAddr.sin_port = htons(localPort); +void Socket::setLocalPort(unsigned short localPort) throw(SocketException) +{ + // Bind the socket to its port + sockaddr_in localAddr; + memset(&localAddr, 0, sizeof(localAddr)); + localAddr.sin_family = AF_INET; + localAddr.sin_addr.s_addr = htonl(INADDR_ANY); + localAddr.sin_port = htons(localPort); - if (bind(sockDesc, (sockaddr *) &localAddr, sizeof(sockaddr_in)) < 0) { - throw SocketException("Set of local port failed (bind())", true); - } + if (bind(sockDesc, (sockaddr*) &localAddr, sizeof(sockaddr_in)) < 0) + { + throw SocketException("Set of local port failed (bind())", true); + } } -void Socket::setLocalAddressAndPort(const string &localAddress, - unsigned short localPort) throw(SocketException) { - // Get the address of the requested host - sockaddr_in localAddr; - fillAddr(localAddress, localPort, localAddr); +void Socket::setLocalAddressAndPort(const string& localAddress, + unsigned short localPort) throw(SocketException) +{ + // Get the address of the requested host + sockaddr_in localAddr; + fillAddr(localAddress, localPort, localAddr); - if (bind(sockDesc, (sockaddr *) &localAddr, sizeof(sockaddr_in)) < 0) { - throw SocketException("Set of local address and port failed (bind())", true); - } + if (bind(sockDesc, (sockaddr*) &localAddr, sizeof(sockaddr_in)) < 0) + { + throw SocketException("Set of local address and port failed (bind())", true); + } } -void Socket::cleanUp() throw(SocketException) { - #ifdef WIN32 - if (WSACleanup() != 0) { - throw SocketException("WSACleanup() failed"); +void Socket::cleanUp() throw(SocketException) +{ +#ifdef WIN32 + if (WSACleanup() != 0) + { + throw SocketException("WSACleanup() failed"); } - #endif +#endif } -unsigned short Socket::resolveService(const string &service, - const string &protocol) { - struct servent *serv; /* Structure containing service information */ +unsigned short Socket::resolveService(const string& service, + const string& protocol) +{ + struct servent* serv; /* Structure containing service information */ - if ((serv = getservbyname(service.c_str(), protocol.c_str())) == NULL) - return atoi(service.c_str()); /* Service is port number */ - else - return ntohs(serv->s_port); /* Found port (network byte order) by name */ + if ((serv = getservbyname(service.c_str(), protocol.c_str())) == NULL) + return atoi(service.c_str()); /* Service is port number */ + else + return ntohs(serv->s_port); /* Found port (network byte order) by name */ } // CommunicatingSocket Code -CommunicatingSocket::CommunicatingSocket(int type, int protocol) - throw(SocketException) : Socket(type, protocol) { +CommunicatingSocket::CommunicatingSocket(int type, int protocol) +throw(SocketException) : Socket(type, protocol) +{ } -CommunicatingSocket::CommunicatingSocket(int newConnSD) : Socket(newConnSD) { +CommunicatingSocket::CommunicatingSocket(int newConnSD) : Socket(newConnSD) +{ } -void CommunicatingSocket::connect(const string &foreignAddress, - unsigned short foreignPort) throw(SocketException) { - // Get the address of the requested host - sockaddr_in destAddr; - fillAddr(foreignAddress, foreignPort, destAddr); +void CommunicatingSocket::connect(const string& foreignAddress, + unsigned short foreignPort) throw(SocketException) +{ + // Get the address of the requested host + sockaddr_in destAddr; + fillAddr(foreignAddress, foreignPort, destAddr); - // Try to connect to the given port - if (::connect(sockDesc, (sockaddr *) &destAddr, sizeof(destAddr)) < 0) { - throw SocketException("Connect failed (connect())", true); - } + // Try to connect to the given port + if (::connect(sockDesc, (sockaddr*) &destAddr, sizeof(destAddr)) < 0) + { + throw SocketException("Connect failed (connect())", true); + } } -void CommunicatingSocket::send(const void *buffer, int bufferLen) - throw(SocketException) { - if (::send(sockDesc, (raw_type *) buffer, bufferLen, 0) < 0) { - throw SocketException("Send failed (send())", true); - } +void CommunicatingSocket::send(const void* buffer, int bufferLen) +throw(SocketException) +{ + if (::send(sockDesc, (raw_type*) buffer, bufferLen, 0) < 0) + { + throw SocketException("Send failed (send())", true); + } } -int CommunicatingSocket::recv(void *buffer, int bufferLen) - throw(SocketException) { - int rtn; - if ((rtn = ::recv(sockDesc, (raw_type *) buffer, bufferLen, 0)) < 0) { - throw SocketException("Received failed (recv())", true); - } +int CommunicatingSocket::recv(void* buffer, int bufferLen) +throw(SocketException) +{ + int rtn; + if ((rtn = ::recv(sockDesc, (raw_type*) buffer, bufferLen, 0)) < 0) + { + throw SocketException("Received failed (recv())", true); + } - return rtn; + return rtn; } -string CommunicatingSocket::getForeignAddress() - throw(SocketException) { - sockaddr_in addr; - unsigned int addr_len = sizeof(addr); +string CommunicatingSocket::getForeignAddress() +throw(SocketException) +{ + sockaddr_in addr; + unsigned int addr_len = sizeof(addr); - if (getpeername(sockDesc, (sockaddr *) &addr,(socklen_t *) &addr_len) < 0) { - throw SocketException("Fetch of foreign address failed (getpeername())", true); - } - return inet_ntoa(addr.sin_addr); + if (getpeername(sockDesc, (sockaddr*) &addr,(socklen_t*) &addr_len) < 0) + { + throw SocketException("Fetch of foreign address failed (getpeername())", true); + } + return inet_ntoa(addr.sin_addr); } -unsigned short CommunicatingSocket::getForeignPort() throw(SocketException) { - sockaddr_in addr; - unsigned int addr_len = sizeof(addr); +unsigned short CommunicatingSocket::getForeignPort() throw(SocketException) +{ + sockaddr_in addr; + unsigned int addr_len = sizeof(addr); - if (getpeername(sockDesc, (sockaddr *) &addr, (socklen_t *) &addr_len) < 0) { - throw SocketException("Fetch of foreign port failed (getpeername())", true); - } - return ntohs(addr.sin_port); + if (getpeername(sockDesc, (sockaddr*) &addr, (socklen_t*) &addr_len) < 0) + { + throw SocketException("Fetch of foreign port failed (getpeername())", true); + } + return ntohs(addr.sin_port); } // TCPSocket Code -TCPSocket::TCPSocket() - throw(SocketException) : CommunicatingSocket(SOCK_STREAM, - IPPROTO_TCP) { +TCPSocket::TCPSocket() +throw(SocketException) : CommunicatingSocket(SOCK_STREAM, + IPPROTO_TCP) +{ } -TCPSocket::TCPSocket(const string &foreignAddress, unsigned short foreignPort) - throw(SocketException) : CommunicatingSocket(SOCK_STREAM, IPPROTO_TCP) { - connect(foreignAddress, foreignPort); +TCPSocket::TCPSocket(const string& foreignAddress, unsigned short foreignPort) +throw(SocketException) : CommunicatingSocket(SOCK_STREAM, IPPROTO_TCP) +{ + connect(foreignAddress, foreignPort); } -TCPSocket::TCPSocket(int newConnSD) : CommunicatingSocket(newConnSD) { +TCPSocket::TCPSocket(int newConnSD) : CommunicatingSocket(newConnSD) +{ } // TCPServerSocket Code -TCPServerSocket::TCPServerSocket(unsigned short localPort, int queueLen) - throw(SocketException) : Socket(SOCK_STREAM, IPPROTO_TCP) { - setLocalPort(localPort); - setListen(queueLen); +TCPServerSocket::TCPServerSocket(unsigned short localPort, int queueLen) +throw(SocketException) : Socket(SOCK_STREAM, IPPROTO_TCP) +{ + setLocalPort(localPort); + setListen(queueLen); } -TCPServerSocket::TCPServerSocket(const string &localAddress, - unsigned short localPort, int queueLen) - throw(SocketException) : Socket(SOCK_STREAM, IPPROTO_TCP) { - setLocalAddressAndPort(localAddress, localPort); - setListen(queueLen); +TCPServerSocket::TCPServerSocket(const string& localAddress, + unsigned short localPort, int queueLen) +throw(SocketException) : Socket(SOCK_STREAM, IPPROTO_TCP) +{ + setLocalAddressAndPort(localAddress, localPort); + setListen(queueLen); } -TCPSocket *TCPServerSocket::accept() throw(SocketException) { - int newConnSD; - if ((newConnSD = ::accept(sockDesc, NULL, 0)) < 0) { - throw SocketException("Accept failed (accept())", true); - } +TCPSocket* TCPServerSocket::accept() throw(SocketException) +{ + int newConnSD; + if ((newConnSD = ::accept(sockDesc, NULL, 0)) < 0) + { + throw SocketException("Accept failed (accept())", true); + } - return new TCPSocket(newConnSD); + return new TCPSocket(newConnSD); } -void TCPServerSocket::setListen(int queueLen) throw(SocketException) { - if (listen(sockDesc, queueLen) < 0) { - throw SocketException("Set listening socket failed (listen())", true); - } +void TCPServerSocket::setListen(int queueLen) throw(SocketException) +{ + if (listen(sockDesc, queueLen) < 0) + { + throw SocketException("Set listening socket failed (listen())", true); + } } // UDPSocket Code UDPSocket::UDPSocket() throw(SocketException) : CommunicatingSocket(SOCK_DGRAM, - IPPROTO_UDP) { - setBroadcast(); + IPPROTO_UDP) +{ + setBroadcast(); } -UDPSocket::UDPSocket(unsigned short localPort) throw(SocketException) : - CommunicatingSocket(SOCK_DGRAM, IPPROTO_UDP) { - setLocalPort(localPort); - setBroadcast(); +UDPSocket::UDPSocket(unsigned short localPort) throw(SocketException) : + CommunicatingSocket(SOCK_DGRAM, IPPROTO_UDP) +{ + setLocalPort(localPort); + setBroadcast(); } -UDPSocket::UDPSocket(const string &localAddress, unsigned short localPort) - throw(SocketException) : CommunicatingSocket(SOCK_DGRAM, IPPROTO_UDP) { - setLocalAddressAndPort(localAddress, localPort); - setBroadcast(); +UDPSocket::UDPSocket(const string& localAddress, unsigned short localPort) +throw(SocketException) : CommunicatingSocket(SOCK_DGRAM, IPPROTO_UDP) +{ + setLocalAddressAndPort(localAddress, localPort); + setBroadcast(); } -void UDPSocket::setBroadcast() { - // If this fails, we'll hear about it when we try to send. This will allow - // system that cannot broadcast to continue if they don't plan to broadcast - int broadcastPermission = 1; - setsockopt(sockDesc, SOL_SOCKET, SO_BROADCAST, - (raw_type *) &broadcastPermission, sizeof(broadcastPermission)); +void UDPSocket::setBroadcast() +{ + // If this fails, we'll hear about it when we try to send. This will allow + // system that cannot broadcast to continue if they don't plan to broadcast + int broadcastPermission = 1; + setsockopt(sockDesc, SOL_SOCKET, SO_BROADCAST, + (raw_type*) &broadcastPermission, sizeof(broadcastPermission)); +} + +void UDPSocket::disconnect() throw(SocketException) +{ + sockaddr_in nullAddr; + memset(&nullAddr, 0, sizeof(nullAddr)); + nullAddr.sin_family = AF_UNSPEC; + + // Try to disconnect + if (::connect(sockDesc, (sockaddr*) &nullAddr, sizeof(nullAddr)) < 0) + { +#ifdef WIN32 + if (errno != WSAEAFNOSUPPORT) + { +#else + if (errno != EAFNOSUPPORT) + { +#endif + throw SocketException("Disconnect failed (connect())", true); + } + } +} + +void UDPSocket::sendTo(const void* buffer, int bufferLen, + const string& foreignAddress, unsigned short foreignPort) +throw(SocketException) +{ + sockaddr_in destAddr; + fillAddr(foreignAddress, foreignPort, destAddr); + + // Write out the whole buffer as a single message. + if (sendto(sockDesc, (raw_type*) buffer, bufferLen, 0, + (sockaddr*) &destAddr, sizeof(destAddr)) != bufferLen) + { + throw SocketException("Send failed (sendto())", true); + } +} + +int UDPSocket::recvFrom(void* buffer, int bufferLen, string& sourceAddress, + unsigned short& sourcePort) throw(SocketException) +{ + sockaddr_in clntAddr; + socklen_t addrLen = sizeof(clntAddr); + int rtn; + if ((rtn = recvfrom(sockDesc, (raw_type*) buffer, bufferLen, 0, + (sockaddr*) &clntAddr, (socklen_t*) &addrLen)) < 0) + { + throw SocketException("Receive failed (recvfrom())", true); + } + sourceAddress = inet_ntoa(clntAddr.sin_addr); + sourcePort = ntohs(clntAddr.sin_port); + + return rtn; +} + +void UDPSocket::setMulticastTTL(unsigned char multicastTTL) throw(SocketException) +{ + if (setsockopt(sockDesc, IPPROTO_IP, IP_MULTICAST_TTL, + (raw_type*) &multicastTTL, sizeof(multicastTTL)) < 0) + { + throw SocketException("Multicast TTL set failed (setsockopt())", true); + } +} + +void UDPSocket::joinGroup(const string& multicastGroup) throw(SocketException) +{ + struct ip_mreq multicastRequest; + + multicastRequest.imr_multiaddr.s_addr = inet_addr(multicastGroup.c_str()); + multicastRequest.imr_interface.s_addr = htonl(INADDR_ANY); + if (setsockopt(sockDesc, IPPROTO_IP, IP_ADD_MEMBERSHIP, + (raw_type*) &multicastRequest, + sizeof(multicastRequest)) < 0) + { + throw SocketException("Multicast group join failed (setsockopt())", true); + } } -void UDPSocket::disconnect() throw(SocketException) { - sockaddr_in nullAddr; - memset(&nullAddr, 0, sizeof(nullAddr)); - nullAddr.sin_family = AF_UNSPEC; +void UDPSocket::leaveGroup(const string& multicastGroup) throw(SocketException) +{ + struct ip_mreq multicastRequest; - // Try to disconnect - if (::connect(sockDesc, (sockaddr *) &nullAddr, sizeof(nullAddr)) < 0) { - #ifdef WIN32 - if (errno != WSAEAFNOSUPPORT) { - #else - if (errno != EAFNOSUPPORT) { - #endif - throw SocketException("Disconnect failed (connect())", true); + multicastRequest.imr_multiaddr.s_addr = inet_addr(multicastGroup.c_str()); + multicastRequest.imr_interface.s_addr = htonl(INADDR_ANY); + if (setsockopt(sockDesc, IPPROTO_IP, IP_DROP_MEMBERSHIP, + (raw_type*) &multicastRequest, + sizeof(multicastRequest)) < 0) + { + throw SocketException("Multicast group leave failed (setsockopt())", true); } - } -} - -void UDPSocket::sendTo(const void *buffer, int bufferLen, - const string &foreignAddress, unsigned short foreignPort) - throw(SocketException) { - sockaddr_in destAddr; - fillAddr(foreignAddress, foreignPort, destAddr); - - // Write out the whole buffer as a single message. - if (sendto(sockDesc, (raw_type *) buffer, bufferLen, 0, - (sockaddr *) &destAddr, sizeof(destAddr)) != bufferLen) { - throw SocketException("Send failed (sendto())", true); - } -} - -int UDPSocket::recvFrom(void *buffer, int bufferLen, string &sourceAddress, - unsigned short &sourcePort) throw(SocketException) { - sockaddr_in clntAddr; - socklen_t addrLen = sizeof(clntAddr); - int rtn; - if ((rtn = recvfrom(sockDesc, (raw_type *) buffer, bufferLen, 0, - (sockaddr *) &clntAddr, (socklen_t *) &addrLen)) < 0) { - throw SocketException("Receive failed (recvfrom())", true); - } - sourceAddress = inet_ntoa(clntAddr.sin_addr); - sourcePort = ntohs(clntAddr.sin_port); - - return rtn; -} - -void UDPSocket::setMulticastTTL(unsigned char multicastTTL) throw(SocketException) { - if (setsockopt(sockDesc, IPPROTO_IP, IP_MULTICAST_TTL, - (raw_type *) &multicastTTL, sizeof(multicastTTL)) < 0) { - throw SocketException("Multicast TTL set failed (setsockopt())", true); - } -} - -void UDPSocket::joinGroup(const string &multicastGroup) throw(SocketException) { - struct ip_mreq multicastRequest; - - multicastRequest.imr_multiaddr.s_addr = inet_addr(multicastGroup.c_str()); - multicastRequest.imr_interface.s_addr = htonl(INADDR_ANY); - if (setsockopt(sockDesc, IPPROTO_IP, IP_ADD_MEMBERSHIP, - (raw_type *) &multicastRequest, - sizeof(multicastRequest)) < 0) { - throw SocketException("Multicast group join failed (setsockopt())", true); - } -} - -void UDPSocket::leaveGroup(const string &multicastGroup) throw(SocketException) { - struct ip_mreq multicastRequest; - - multicastRequest.imr_multiaddr.s_addr = inet_addr(multicastGroup.c_str()); - multicastRequest.imr_interface.s_addr = htonl(INADDR_ANY); - if (setsockopt(sockDesc, IPPROTO_IP, IP_DROP_MEMBERSHIP, - (raw_type *) &multicastRequest, - sizeof(multicastRequest)) < 0) { - throw SocketException("Multicast group leave failed (setsockopt())", true); - } } diff --git a/Source/Network/PracticalSocket.h b/Source/Network/PracticalSocket.h index e4a106ad2f94ce1cf276e22500a60b36089b51d6..2c27376971d9cfa8af8787f9b45fc26abdb69aee 100644 --- a/Source/Network/PracticalSocket.h +++ b/Source/Network/PracticalSocket.h @@ -30,312 +30,318 @@ using namespace std; /** * Signals a problem with the execution of a socket call. */ -class SocketException : public exception { +class SocketException : public exception +{ public: - /** - * Construct a SocketException with a explanatory message. - * @param message explanatory message - * @param incSysMsg true if system message (from strerror(errno)) - * should be postfixed to the user provided message - */ - SocketException(const string &message, bool inclSysMsg = false) throw(); - - /** - * Provided just to guarantee that no exceptions are thrown. - */ - ~SocketException() throw(); - - /** - * Get the exception message - * @return exception message - */ - const char *what() const throw(); + /** + * Construct a SocketException with a explanatory message. + * @param message explanatory message + * @param incSysMsg true if system message (from strerror(errno)) + * should be postfixed to the user provided message + */ + SocketException(const string& message, bool inclSysMsg = false) throw(); + + /** + * Provided just to guarantee that no exceptions are thrown. + */ + ~SocketException() throw(); + + /** + * Get the exception message + * @return exception message + */ + const char* what() const throw(); private: - string userMessage; // Exception message + string userMessage; // Exception message }; /** * Base class representing basic communication endpoint */ -class Socket { +class Socket +{ public: - /** - * Close and deallocate this socket - */ - ~Socket(); - - /** - * Get the local address - * @return local address of socket - * @exception SocketException thrown if fetch fails - */ - string getLocalAddress() throw(SocketException); - - /** - * Get the local port - * @return local port of socket - * @exception SocketException thrown if fetch fails - */ - unsigned short getLocalPort() throw(SocketException); - - /** - * Set the local port to the specified port and the local address - * to any interface - * @param localPort local port - * @exception SocketException thrown if setting local port fails - */ - void setLocalPort(unsigned short localPort) throw(SocketException); - - /** - * Set the local port to the specified port and the local address - * to the specified address. If you omit the port, a random port - * will be selected. - * @param localAddress local address - * @param localPort local port - * @exception SocketException thrown if setting local port or address fails - */ - void setLocalAddressAndPort(const string &localAddress, - unsigned short localPort = 0) throw(SocketException); - - /** - * If WinSock, unload the WinSock DLLs; otherwise do nothing. We ignore - * this in our sample client code but include it in the library for - * completeness. If you are running on Windows and you are concerned - * about DLL resource consumption, call this after you are done with all - * Socket instances. If you execute this on Windows while some instance of - * Socket exists, you are toast. For portability of client code, this is - * an empty function on non-Windows platforms so you can always include it. - * @param buffer buffer to receive the data - * @param bufferLen maximum number of bytes to read into buffer - * @return number of bytes read, 0 for EOF, and -1 for error - * @exception SocketException thrown WinSock clean up fails - */ - static void cleanUp() throw(SocketException); - - /** - * Resolve the specified service for the specified protocol to the - * corresponding port number in host byte order - * @param service service to resolve (e.g., "http") - * @param protocol protocol of service to resolve. Default is "tcp". - */ - static unsigned short resolveService(const string &service, - const string &protocol = "tcp"); + /** + * Close and deallocate this socket + */ + ~Socket(); + + /** + * Get the local address + * @return local address of socket + * @exception SocketException thrown if fetch fails + */ + string getLocalAddress() throw(SocketException); + + /** + * Get the local port + * @return local port of socket + * @exception SocketException thrown if fetch fails + */ + unsigned short getLocalPort() throw(SocketException); + + /** + * Set the local port to the specified port and the local address + * to any interface + * @param localPort local port + * @exception SocketException thrown if setting local port fails + */ + void setLocalPort(unsigned short localPort) throw(SocketException); + + /** + * Set the local port to the specified port and the local address + * to the specified address. If you omit the port, a random port + * will be selected. + * @param localAddress local address + * @param localPort local port + * @exception SocketException thrown if setting local port or address fails + */ + void setLocalAddressAndPort(const string& localAddress, + unsigned short localPort = 0) throw(SocketException); + + /** + * If WinSock, unload the WinSock DLLs; otherwise do nothing. We ignore + * this in our sample client code but include it in the library for + * completeness. If you are running on Windows and you are concerned + * about DLL resource consumption, call this after you are done with all + * Socket instances. If you execute this on Windows while some instance of + * Socket exists, you are toast. For portability of client code, this is + * an empty function on non-Windows platforms so you can always include it. + * @param buffer buffer to receive the data + * @param bufferLen maximum number of bytes to read into buffer + * @return number of bytes read, 0 for EOF, and -1 for error + * @exception SocketException thrown WinSock clean up fails + */ + static void cleanUp() throw(SocketException); + + /** + * Resolve the specified service for the specified protocol to the + * corresponding port number in host byte order + * @param service service to resolve (e.g., "http") + * @param protocol protocol of service to resolve. Default is "tcp". + */ + static unsigned short resolveService(const string& service, + const string& protocol = "tcp"); private: - // Prevent the user from trying to use value semantics on this object - Socket(const Socket &sock); - void operator=(const Socket &sock); + // Prevent the user from trying to use value semantics on this object + Socket(const Socket& sock); + void operator=(const Socket& sock); protected: - int sockDesc; // Socket descriptor - Socket(int type, int protocol) throw(SocketException); - Socket(int sockDesc); + int sockDesc; // Socket descriptor + Socket(int type, int protocol) throw(SocketException); + Socket(int sockDesc); }; /** * Socket which is able to connect, send, and receive */ -class CommunicatingSocket : public Socket { +class CommunicatingSocket : public Socket +{ public: - /** - * Establish a socket connection with the given foreign - * address and port - * @param foreignAddress foreign address (IP address or name) - * @param foreignPort foreign port - * @exception SocketException thrown if unable to establish connection - */ - void connect(const string &foreignAddress, unsigned short foreignPort) + /** + * Establish a socket connection with the given foreign + * address and port + * @param foreignAddress foreign address (IP address or name) + * @param foreignPort foreign port + * @exception SocketException thrown if unable to establish connection + */ + void connect(const string& foreignAddress, unsigned short foreignPort) throw(SocketException); - /** - * Write the given buffer to this socket. Call connect() before - * calling send() - * @param buffer buffer to be written - * @param bufferLen number of bytes from buffer to be written - * @exception SocketException thrown if unable to send data - */ - void send(const void *buffer, int bufferLen) throw(SocketException); - - /** - * Read into the given buffer up to bufferLen bytes data from this - * socket. Call connect() before calling recv() - * @param buffer buffer to receive the data - * @param bufferLen maximum number of bytes to read into buffer - * @return number of bytes read, 0 for EOF, and -1 for error - * @exception SocketException thrown if unable to receive data - */ - int recv(void *buffer, int bufferLen) throw(SocketException); - - /** - * Get the foreign address. Call connect() before calling recv() - * @return foreign address - * @exception SocketException thrown if unable to fetch foreign address - */ - string getForeignAddress() throw(SocketException); - - /** - * Get the foreign port. Call connect() before calling recv() - * @return foreign port - * @exception SocketException thrown if unable to fetch foreign port - */ - unsigned short getForeignPort() throw(SocketException); + /** + * Write the given buffer to this socket. Call connect() before + * calling send() + * @param buffer buffer to be written + * @param bufferLen number of bytes from buffer to be written + * @exception SocketException thrown if unable to send data + */ + void send(const void* buffer, int bufferLen) throw(SocketException); + + /** + * Read into the given buffer up to bufferLen bytes data from this + * socket. Call connect() before calling recv() + * @param buffer buffer to receive the data + * @param bufferLen maximum number of bytes to read into buffer + * @return number of bytes read, 0 for EOF, and -1 for error + * @exception SocketException thrown if unable to receive data + */ + int recv(void* buffer, int bufferLen) throw(SocketException); + + /** + * Get the foreign address. Call connect() before calling recv() + * @return foreign address + * @exception SocketException thrown if unable to fetch foreign address + */ + string getForeignAddress() throw(SocketException); + + /** + * Get the foreign port. Call connect() before calling recv() + * @return foreign port + * @exception SocketException thrown if unable to fetch foreign port + */ + unsigned short getForeignPort() throw(SocketException); protected: - CommunicatingSocket(int type, int protocol) throw(SocketException); - CommunicatingSocket(int newConnSD); + CommunicatingSocket(int type, int protocol) throw(SocketException); + CommunicatingSocket(int newConnSD); }; /** * TCP socket for communication with other TCP sockets */ -class TCPSocket : public CommunicatingSocket { +class TCPSocket : public CommunicatingSocket +{ public: - /** - * Construct a TCP socket with no connection - * @exception SocketException thrown if unable to create TCP socket - */ - TCPSocket() throw(SocketException); - - /** - * Construct a TCP socket with a connection to the given foreign address - * and port - * @param foreignAddress foreign address (IP address or name) - * @param foreignPort foreign port - * @exception SocketException thrown if unable to create TCP socket - */ - TCPSocket(const string &foreignAddress, unsigned short foreignPort) - throw(SocketException); + /** + * Construct a TCP socket with no connection + * @exception SocketException thrown if unable to create TCP socket + */ + TCPSocket() throw(SocketException); + + /** + * Construct a TCP socket with a connection to the given foreign address + * and port + * @param foreignAddress foreign address (IP address or name) + * @param foreignPort foreign port + * @exception SocketException thrown if unable to create TCP socket + */ + TCPSocket(const string& foreignAddress, unsigned short foreignPort) + throw(SocketException); private: - // Access for TCPServerSocket::accept() connection creation - friend class TCPServerSocket; - TCPSocket(int newConnSD); + // Access for TCPServerSocket::accept() connection creation + friend class TCPServerSocket; + TCPSocket(int newConnSD); }; /** * TCP socket class for servers */ -class TCPServerSocket : public Socket { +class TCPServerSocket : public Socket +{ public: - /** - * Construct a TCP socket for use with a server, accepting connections - * on the specified port on any interface - * @param localPort local port of server socket, a value of zero will - * give a system-assigned unused port - * @param queueLen maximum queue length for outstanding - * connection requests (default 5) - * @exception SocketException thrown if unable to create TCP server socket - */ - TCPServerSocket(unsigned short localPort, int queueLen = 5) - throw(SocketException); - - /** - * Construct a TCP socket for use with a server, accepting connections - * on the specified port on the interface specified by the given address - * @param localAddress local interface (address) of server socket - * @param localPort local port of server socket - * @param queueLen maximum queue length for outstanding - * connection requests (default 5) - * @exception SocketException thrown if unable to create TCP server socket - */ - TCPServerSocket(const string &localAddress, unsigned short localPort, - int queueLen = 5) throw(SocketException); - - /** - * Blocks until a new connection is established on this socket or error - * @return new connection socket - * @exception SocketException thrown if attempt to accept a new connection fails - */ - TCPSocket *accept() throw(SocketException); + /** + * Construct a TCP socket for use with a server, accepting connections + * on the specified port on any interface + * @param localPort local port of server socket, a value of zero will + * give a system-assigned unused port + * @param queueLen maximum queue length for outstanding + * connection requests (default 5) + * @exception SocketException thrown if unable to create TCP server socket + */ + TCPServerSocket(unsigned short localPort, int queueLen = 5) + throw(SocketException); + + /** + * Construct a TCP socket for use with a server, accepting connections + * on the specified port on the interface specified by the given address + * @param localAddress local interface (address) of server socket + * @param localPort local port of server socket + * @param queueLen maximum queue length for outstanding + * connection requests (default 5) + * @exception SocketException thrown if unable to create TCP server socket + */ + TCPServerSocket(const string& localAddress, unsigned short localPort, + int queueLen = 5) throw(SocketException); + + /** + * Blocks until a new connection is established on this socket or error + * @return new connection socket + * @exception SocketException thrown if attempt to accept a new connection fails + */ + TCPSocket* accept() throw(SocketException); private: - void setListen(int queueLen) throw(SocketException); + void setListen(int queueLen) throw(SocketException); }; /** * UDP socket class */ -class UDPSocket : public CommunicatingSocket { +class UDPSocket : public CommunicatingSocket +{ public: - /** - * Construct a UDP socket - * @exception SocketException thrown if unable to create UDP socket - */ - UDPSocket() throw(SocketException); - - /** - * Construct a UDP socket with the given local port - * @param localPort local port - * @exception SocketException thrown if unable to create UDP socket - */ - UDPSocket(unsigned short localPort) throw(SocketException); - - /** - * Construct a UDP socket with the given local port and address - * @param localAddress local address - * @param localPort local port - * @exception SocketException thrown if unable to create UDP socket - */ - UDPSocket(const string &localAddress, unsigned short localPort) - throw(SocketException); - - /** - * Unset foreign address and port - * @return true if disassociation is successful - * @exception SocketException thrown if unable to disconnect UDP socket - */ - void disconnect() throw(SocketException); - - /** - * Send the given buffer as a UDP datagram to the - * specified address/port - * @param buffer buffer to be written - * @param bufferLen number of bytes to write - * @param foreignAddress address (IP address or name) to send to - * @param foreignPort port number to send to - * @return true if send is successful - * @exception SocketException thrown if unable to send datagram - */ - void sendTo(const void *buffer, int bufferLen, const string &foreignAddress, - unsigned short foreignPort) throw(SocketException); - - /** - * Read read up to bufferLen bytes data from this socket. The given buffer - * is where the data will be placed - * @param buffer buffer to receive data - * @param bufferLen maximum number of bytes to receive - * @param sourceAddress address of datagram source - * @param sourcePort port of data source - * @return number of bytes received and -1 for error - * @exception SocketException thrown if unable to receive datagram - */ - int recvFrom(void *buffer, int bufferLen, string &sourceAddress, - unsigned short &sourcePort) throw(SocketException); - - /** - * Set the multicast TTL - * @param multicastTTL multicast TTL - * @exception SocketException thrown if unable to set TTL - */ - void setMulticastTTL(unsigned char multicastTTL) throw(SocketException); - - /** - * Join the specified multicast group - * @param multicastGroup multicast group address to join - * @exception SocketException thrown if unable to join group - */ - void joinGroup(const string &multicastGroup) throw(SocketException); - - /** - * Leave the specified multicast group - * @param multicastGroup multicast group address to leave - * @exception SocketException thrown if unable to leave group - */ - void leaveGroup(const string &multicastGroup) throw(SocketException); + /** + * Construct a UDP socket + * @exception SocketException thrown if unable to create UDP socket + */ + UDPSocket() throw(SocketException); + + /** + * Construct a UDP socket with the given local port + * @param localPort local port + * @exception SocketException thrown if unable to create UDP socket + */ + UDPSocket(unsigned short localPort) throw(SocketException); + + /** + * Construct a UDP socket with the given local port and address + * @param localAddress local address + * @param localPort local port + * @exception SocketException thrown if unable to create UDP socket + */ + UDPSocket(const string& localAddress, unsigned short localPort) + throw(SocketException); + + /** + * Unset foreign address and port + * @return true if disassociation is successful + * @exception SocketException thrown if unable to disconnect UDP socket + */ + void disconnect() throw(SocketException); + + /** + * Send the given buffer as a UDP datagram to the + * specified address/port + * @param buffer buffer to be written + * @param bufferLen number of bytes to write + * @param foreignAddress address (IP address or name) to send to + * @param foreignPort port number to send to + * @return true if send is successful + * @exception SocketException thrown if unable to send datagram + */ + void sendTo(const void* buffer, int bufferLen, const string& foreignAddress, + unsigned short foreignPort) throw(SocketException); + + /** + * Read read up to bufferLen bytes data from this socket. The given buffer + * is where the data will be placed + * @param buffer buffer to receive data + * @param bufferLen maximum number of bytes to receive + * @param sourceAddress address of datagram source + * @param sourcePort port of data source + * @return number of bytes received and -1 for error + * @exception SocketException thrown if unable to receive datagram + */ + int recvFrom(void* buffer, int bufferLen, string& sourceAddress, + unsigned short& sourcePort) throw(SocketException); + + /** + * Set the multicast TTL + * @param multicastTTL multicast TTL + * @exception SocketException thrown if unable to set TTL + */ + void setMulticastTTL(unsigned char multicastTTL) throw(SocketException); + + /** + * Join the specified multicast group + * @param multicastGroup multicast group address to join + * @exception SocketException thrown if unable to join group + */ + void joinGroup(const string& multicastGroup) throw(SocketException); + + /** + * Leave the specified multicast group + * @param multicastGroup multicast group address to leave + * @exception SocketException thrown if unable to leave group + */ + void leaveGroup(const string& multicastGroup) throw(SocketException); private: - void setBroadcast(); + void setBroadcast(); }; #endif diff --git a/Source/Processors/ArduinoOutput.cpp b/Source/Processors/ArduinoOutput.cpp index d507adbcb7314606dea1685adfb8096cebd60c0c..8422dfabb905bcc33f08c7501f32e83e707ce4fa 100755 --- a/Source/Processors/ArduinoOutput.cpp +++ b/Source/Processors/ArduinoOutput.cpp @@ -26,7 +26,7 @@ #include <stdio.h> ArduinoOutput::ArduinoOutput() - : GenericProcessor("Arduino Output"), state(false) + : GenericProcessor("Arduino Output"), state(false) { } @@ -39,28 +39,30 @@ ArduinoOutput::~ArduinoOutput() AudioProcessorEditor* ArduinoOutput::createEditor() { editor = new ArduinoOutputEditor(this, true); - return editor; + return editor; } void ArduinoOutput::handleEvent(int eventType, MidiMessage& event, int sampleNum) { if (eventType == TTL) { - const uint8* dataptr = event.getRawData(); + const uint8* dataptr = event.getRawData(); - int eventNodeId = *(dataptr+1); - int eventId = *(dataptr+2); - int eventChannel = *(dataptr+3); + int eventNodeId = *(dataptr+1); + int eventId = *(dataptr+2); + int eventChannel = *(dataptr+3); - std::cout << "Received event from " << eventNodeId << - " on channel " << eventChannel << - " with value " << eventId << std::endl; + std::cout << "Received event from " << eventNodeId << + " on channel " << eventChannel << + " with value " << eventId << std::endl; - if (state) + if (state) { arduino.sendDigital(13, ARD_LOW); state = false; - } else { + } + else + { arduino.sendDigital(13, ARD_HIGH); state = true; } @@ -68,10 +70,10 @@ void ArduinoOutput::handleEvent(int eventType, MidiMessage& event, int sampleNum //ArduinoOutputEditor* ed = (ArduinoOutputEditor*) getEditor(); //ed->receivedEvent(); } - + } -void ArduinoOutput::setParameter (int parameterIndex, float newValue) +void ArduinoOutput::setParameter(int parameterIndex, float newValue) { } @@ -81,22 +83,22 @@ bool ArduinoOutput::enable() Time timer; - // FIXME: Remove hard-coded serial port paths. These aren't always - // right, and in some cases (JUCE_MAC) are almost certainly wrong. - std::cout << "Warning: using hard-coded path to Arduino." << std::endl; + // FIXME: Remove hard-coded serial port paths. These aren't always + // right, and in some cases (JUCE_MAC) are almost certainly wrong. + std::cout << "Warning: using hard-coded path to Arduino." << std::endl; #if JUCE_LINUX - arduino.connect("ttyACM0"); + arduino.connect("ttyACM0"); #endif #if JUCE_WIN32 - arduino.connect("COM1"); + arduino.connect("COM1"); #endif #if JUCE_MAC arduino.connect("tty.usbmodemfd121"); #endif - - if (arduino.isArduinoReady()) - { + + if (arduino.isArduinoReady()) + { uint32 currentTime = timer.getMillisecondCounter(); @@ -107,9 +109,9 @@ bool ArduinoOutput::enable() timer.waitForMillisecondCounter(currentTime + 4000); arduino.update(); - - std::cout << "firmata v" << arduino.getMajorFirmwareVersion() - << "." << arduino.getMinorFirmwareVersion() << std::endl; + + std::cout << "firmata v" << arduino.getMajorFirmwareVersion() + << "." << arduino.getMinorFirmwareVersion() << std::endl; } @@ -118,27 +120,29 @@ bool ArduinoOutput::enable() std::cout << "Arduino is initialized." << std::endl; arduino.sendDigitalPinMode(13, ARD_OUTPUT); - return true; - } else { + return true; + } + else + { std::cout << "Arduino is NOT initialized." << std::endl; - return false; + return false; } } bool ArduinoOutput::disable() { - if (arduino.isInitialized()) - arduino.disconnect(); - return true; + if (arduino.isInitialized()) + arduino.disconnect(); + return true; } -void ArduinoOutput::process(AudioSampleBuffer &buffer, - MidiBuffer &events, +void ArduinoOutput::process(AudioSampleBuffer& buffer, + MidiBuffer& events, int& nSamples) { - - checkForEvents(events); - + + checkForEvents(events); + } diff --git a/Source/Processors/ArduinoOutput.h b/Source/Processors/ArduinoOutput.h index c2757a4078b6fd646bc275614ed8a01f45caf41d..451a7d21f10dd31dd3188c9ffc8e46c456e2c6e8 100755 --- a/Source/Processors/ArduinoOutput.h +++ b/Source/Processors/ArduinoOutput.h @@ -24,9 +24,6 @@ #ifndef __ARDUINOOUTPUT_H_F7BDA585__ #define __ARDUINOOUTPUT_H_F7BDA585__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "Editors/ArduinoOutputEditor.h" @@ -34,7 +31,7 @@ #include "GenericProcessor.h" -/** +/** *UNDER CONSTRUCTION* @@ -49,18 +46,18 @@ class ArduinoOutput : public GenericProcessor { public: - - ArduinoOutput(); - ~ArduinoOutput(); - - /** Searches for events and triggers the Arduino output when appropriate. */ - void process(AudioSampleBuffer &buffer, MidiBuffer &events, int& nSamples); - - /** Currently unused. Future uses may include changing the TTL trigger channel - or the output channel of the Arduino. */ - void setParameter (int parameterIndex, float newValue); - - /** Convenient interface for responding to incoming events. */ + + ArduinoOutput(); + ~ArduinoOutput(); + + /** Searches for events and triggers the Arduino output when appropriate. */ + void process(AudioSampleBuffer& buffer, MidiBuffer& events, int& nSamples); + + /** Currently unused. Future uses may include changing the TTL trigger channel + or the output channel of the Arduino. */ + void setParameter(int parameterIndex, float newValue); + + /** Convenient interface for responding to incoming events. */ void handleEvent(int eventType, MidiMessage& event, int sampleNum); /** Called immediately prior to the start of data acquisition. */ @@ -68,21 +65,24 @@ public: /** Called immediately after the end of data acquisition. */ bool disable(); - + /** Creates the ArduinoOutputEditor. */ - AudioProcessorEditor* createEditor(); + AudioProcessorEditor* createEditor(); + + /** Defines the ArduinoOutput processor as a sink. */ + bool isSink() + { + return true; + } - /** Defines the ArduinoOutput processor as a sink. */ - bool isSink() {return true;} - private: - /** An open-frameworks Arduino object. */ - ofArduino arduino; + /** An open-frameworks Arduino object. */ + ofArduino arduino; - bool state; + bool state; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ArduinoOutput); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ArduinoOutput); }; diff --git a/Source/Processors/AudioNode.cpp b/Source/Processors/AudioNode.cpp index 9a4f132d6a70031ddfeabbf1feeaea68adeecaff..f13fffc366336f6a0132b3ffcf01549b05e07918 100755 --- a/Source/Processors/AudioNode.cpp +++ b/Source/Processors/AudioNode.cpp @@ -26,25 +26,26 @@ #include "Channel.h" AudioNode::AudioNode() - : GenericProcessor("Audio Node"), audioEditor(0), volume(0.00001f) + : GenericProcessor("Audio Node"), audioEditor(0), volume(0.00001f) { - settings.numInputs = 128; - settings.numOutputs = 2; + settings.numInputs = 128; + settings.numOutputs = 2; - // 128 inputs, 2 outputs (left and right channel) - setPlayConfigDetails(getNumInputs(),getNumOutputs(),44100.0,128); + // 128 inputs, 2 outputs (left and right channel) + setPlayConfigDetails(getNumInputs(),getNumOutputs(),44100.0,128); - //leftChan.clear(); - //rightChan.clear(); + //leftChan.clear(); + //rightChan.clear(); - nextAvailableChannel = 2; // keep first two channels empty + nextAvailableChannel = 2; // keep first two channels empty } -AudioNode::~AudioNode() { +AudioNode::~AudioNode() +{ @@ -52,150 +53,154 @@ AudioNode::~AudioNode() { AudioProcessorEditor* AudioNode::createEditor() { - - audioEditor = new AudioEditor(this); - //setEditor(editor); - - return audioEditor; + audioEditor = new AudioEditor(this); + + //setEditor(editor); + + return audioEditor; } void AudioNode::resetConnections() { - nextAvailableChannel = 2; // start connections at channel 2 - wasConnected = false; + nextAvailableChannel = 2; // start connections at channel 2 + wasConnected = false; - channelPointers.clear(); + channelPointers.clear(); } void AudioNode::setChannel(Channel* ch) { - int channelNum = channelPointers.indexOf(ch); + int channelNum = channelPointers.indexOf(ch); - std::cout << "Audio node setting channel to " << channelNum << std::endl; + std::cout << "Audio node setting channel to " << channelNum << std::endl; - setCurrentChannel(channelNum); + setCurrentChannel(channelNum); } void AudioNode::setChannelStatus(Channel* chan, bool status) { - setChannel(chan); // add 2 to account for 2 output channels + setChannel(chan); // add 2 to account for 2 output channels - enableCurrentChannel(status); + enableCurrentChannel(status); } void AudioNode::enableCurrentChannel(bool state) { - //setCurrentChannel(nextAvailableChannel); + //setCurrentChannel(nextAvailableChannel); - if (state) - { - setParameter(100, 0.0f); - } else { - setParameter(-100, 0.0f); - } + if (state) + { + setParameter(100, 0.0f); + } + else + { + setParameter(-100, 0.0f); + } } void AudioNode::addInputChannel(GenericProcessor* sourceNode, int chan) { - //if (chan != getProcessorGraph()->midiChannelIndex) - //{ - - int channelIndex = getNextChannel(false); + //if (chan != getProcessorGraph()->midiChannelIndex) + //{ + + int channelIndex = getNextChannel(false); + + setPlayConfigDetails(channelIndex+1,0,44100.0,128); - setPlayConfigDetails(channelIndex+1,0,44100.0,128); + channelPointers.add(sourceNode->channels[chan]); - channelPointers.add(sourceNode->channels[chan]); - - //} else { + //} else { - // Can't monitor events at the moment! -// } + // Can't monitor events at the moment! + // } } -void AudioNode::setParameter (int parameterIndex, float newValue) +void AudioNode::setParameter(int parameterIndex, float newValue) { - // change left channel, right channel, or volume - if (parameterIndex == 1) - { - // volume level - volume = newValue*0.1f; - - } else if (parameterIndex == 100) - { - - channelPointers[currentChannel]->isMonitored = true; - - // add current channel - // if (!leftChan.contains(currentChannel)) - // { - // leftChan.add(currentChannel); - // rightChan.add(currentChannel); - // } - } else if (parameterIndex == -100) - { - - channelPointers[currentChannel]->isMonitored = false; - // remove current channel - // if (leftChan.contains(currentChannel)) - // { - // leftChan.remove(leftChan.indexOf(currentChannel)); - // rightChan.remove(rightChan.indexOf(currentChannel)); - // } - } + // change left channel, right channel, or volume + if (parameterIndex == 1) + { + // volume level + volume = newValue*0.1f; + + } + else if (parameterIndex == 100) + { + + channelPointers[currentChannel]->isMonitored = true; + + // add current channel + // if (!leftChan.contains(currentChannel)) + // { + // leftChan.add(currentChannel); + // rightChan.add(currentChannel); + // } + } + else if (parameterIndex == -100) + { + + channelPointers[currentChannel]->isMonitored = false; + // remove current channel + // if (leftChan.contains(currentChannel)) + // { + // leftChan.remove(leftChan.indexOf(currentChannel)); + // rightChan.remove(rightChan.indexOf(currentChannel)); + // } + } } -void AudioNode::process(AudioSampleBuffer &buffer, - MidiBuffer &midiMessages, - int& nSamples) +void AudioNode::process(AudioSampleBuffer& buffer, + MidiBuffer& midiMessages, + int& nSamples) { - float gain; - //std::cout << "Audio node sample count: " << nSamples << std::endl; ///buffer.getNumSamples() << std::endl; - - // clear the left and right channels - buffer.clear(0,0,buffer.getNumSamples()); - buffer.clear(1,0,buffer.getNumSamples()); - - if (channelPointers.size() > 0) - { - for (int i = 2; i < buffer.getNumChannels(); i++) - { - - if (channelPointers[i-2]->isMonitored) - { - gain=volume/( float(0x7fff) * channelPointers[i-2]->bitVolts ); - buffer.addFrom(0, // destination channel - 0, // destination start sample - buffer, // source - i, // source channel - 0, // source start sample - buffer.getNumSamples(), // number of samples - gain // gain to apply - ); - - buffer.addFrom(1, // destination channel - 0, // destination start sample - buffer, // source - i, // source channel - 0, // source start sample - buffer.getNumSamples(), // number of samples - gain // gain to apply - ); - - } - - } - } + float gain; + //std::cout << "Audio node sample count: " << nSamples << std::endl; ///buffer.getNumSamples() << std::endl; + + // clear the left and right channels + buffer.clear(0,0,buffer.getNumSamples()); + buffer.clear(1,0,buffer.getNumSamples()); + + if (channelPointers.size() > 0) + { + for (int i = 2; i < buffer.getNumChannels(); i++) + { + + if (channelPointers[i-2]->isMonitored) + { + gain=volume/(float(0x7fff) * channelPointers[i-2]->bitVolts); + buffer.addFrom(0, // destination channel + 0, // destination start sample + buffer, // source + i, // source channel + 0, // source start sample + buffer.getNumSamples(), // number of samples + gain // gain to apply + ); + + buffer.addFrom(1, // destination channel + 0, // destination start sample + buffer, // source + i, // source channel + 0, // source start sample + buffer.getNumSamples(), // number of samples + gain // gain to apply + ); + + } + + } + } } diff --git a/Source/Processors/AudioNode.h b/Source/Processors/AudioNode.h index 746912865a6607b5187a2d1c81883fd69ed3ec66..48a1c19105cb60da50cfbcf5e49b8cd3c97cb1ce 100755 --- a/Source/Processors/AudioNode.h +++ b/Source/Processors/AudioNode.h @@ -25,9 +25,6 @@ #define __AUDIONODE_H_AF61F3C5__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include <stdio.h> @@ -46,13 +43,13 @@ class AudioEditor; Every channel of every processor (that's not a sink or a utility) is automatically connected to both of these nodes. The AudioNode is used to filter out channels to be sent to the audio output device, which can be selected by the user through the AudioEditor - (located in the ControlPanel). + (located in the ControlPanel). Since the AudioNode exists no matter what, it doesn't appear in the ProcessorList. Instead, it's created by the ProcessorGraph at startup. Each processor has an "Audio" tab within its channel-selector drawer that determines - which channels will be monitored. At the moment's there's no centralized way to + which channels will be monitored. At the moment's there's no centralized way to control the channels going to the audio monitor; it all happens in a distributed way through the individual processors. @@ -63,50 +60,50 @@ class AudioEditor; class AudioNode : public GenericProcessor { public: - - AudioNode(); - ~AudioNode(); + AudioNode(); + ~AudioNode(); - /** Handle incoming data and decide which channels to monitor - */ - void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); - /** Used to change audio monitoring parameters (such as channels to monitor and volume) while acquisition is active. - */ - void setParameter (int parameterIndex, float newValue); + /** Handle incoming data and decide which channels to monitor + */ + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); - /** Creates the AudioEditor (located in the ControlPanel). */ - AudioProcessorEditor* createEditor(); + /** Used to change audio monitoring parameters (such as channels to monitor and volume) while acquisition is active. + */ + void setParameter(int parameterIndex, float newValue); - /** Sets the current channel (in advance of a parameter change). */ - void setChannel(Channel* ch); + /** Creates the AudioEditor (located in the ControlPanel). */ + AudioProcessorEditor* createEditor(); - /** Used to turn audio monitoring on and off for individual channels. */ - void setChannelStatus(Channel* ch, bool status); + /** Sets the current channel (in advance of a parameter change). */ + void setChannel(Channel* ch); - /** Resets the connections prior to a new round of data acquisition. */ - void resetConnections(); + /** Used to turn audio monitoring on and off for individual channels. */ + void setChannelStatus(Channel* ch, bool status); - /** Resets the connections prior to a new round of data acquisition. */ - void enableCurrentChannel(bool); + /** Resets the connections prior to a new round of data acquisition. */ + void resetConnections(); - /** Establishes a connection between a channel of a GenericProcessor and the AudioNode. */ - void addInputChannel(GenericProcessor* source, int chan); + /** Resets the connections prior to a new round of data acquisition. */ + void enableCurrentChannel(bool); + + /** Establishes a connection between a channel of a GenericProcessor and the AudioNode. */ + void addInputChannel(GenericProcessor* source, int chan); + + /** A pointer to the AudioNode's editor. */ + ScopedPointer<AudioEditor> audioEditor; - /** A pointer to the AudioNode's editor. */ - ScopedPointer<AudioEditor> audioEditor; - private: - Array<int> leftChan; - Array<int> rightChan; - float volume; + Array<int> leftChan; + Array<int> rightChan; + float volume; - /** An array of pointers to the channels that feed into the AudioNode. */ - Array<Channel*> channelPointers; + /** An array of pointers to the channels that feed into the AudioNode. */ + Array<Channel*> channelPointers; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioNode); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AudioNode); }; diff --git a/Source/Processors/AudioResamplingNode.cpp b/Source/Processors/AudioResamplingNode.cpp index 7c194a06fa27a8f82464f0e5e3af3ae7a449ba60..293be0ab07f5070c57cffdb150e9d43132c8bfff 100644 --- a/Source/Processors/AudioResamplingNode.cpp +++ b/Source/Processors/AudioResamplingNode.cpp @@ -25,182 +25,195 @@ #include <stdio.h> AudioResamplingNode::AudioResamplingNode() - : GenericProcessor("Resampling Node"), - sourceBufferSampleRate(40000.0), destBufferSampleRate(44100.0), - ratio(1.0), lastRatio(1.0), destBuffer(0), tempBuffer(0), - destBufferIsTempBuffer(true), isTransmitting(false), destBufferPos(0) + : GenericProcessor("Resampling Node"), + sourceBufferSampleRate(40000.0), destBufferSampleRate(44100.0), + ratio(1.0), lastRatio(1.0), destBuffer(0), tempBuffer(0), + destBufferIsTempBuffer(true), isTransmitting(false), destBufferPos(0) { - settings.numInputs = 2; - settings.numOutputs = 2; + settings.numInputs = 2; + settings.numOutputs = 2; - setPlayConfigDetails(getNumInputs(), // number of inputs - getNumOutputs(), // number of outputs - 44100.0, // sampleRate - 128); // blockSize + setPlayConfigDetails(getNumInputs(), // number of inputs + getNumOutputs(), // number of outputs + 44100.0, // sampleRate + 128); // blockSize - filter = new Dsp::SmoothedFilterDesign - <Dsp::RBJ::Design::LowPass, 1> (1024); + filter = new Dsp::SmoothedFilterDesign + <Dsp::RBJ::Design::LowPass, 1> (1024); - if (destBufferIsTempBuffer) - destBufferWidth = 1024; - else - destBufferWidth = 1000; + if (destBufferIsTempBuffer) + destBufferWidth = 1024; + else + destBufferWidth = 1000; - destBufferTimebaseSecs = 1.0; + destBufferTimebaseSecs = 1.0; - destBuffer = new AudioSampleBuffer(16, destBufferWidth); - tempBuffer = new AudioSampleBuffer(16, destBufferWidth); + destBuffer = new AudioSampleBuffer(16, destBufferWidth); + tempBuffer = new AudioSampleBuffer(16, destBufferWidth); - continuousDataBuffer = new int16[10000]; + continuousDataBuffer = new int16[10000]; } AudioResamplingNode::~AudioResamplingNode() { - filter = 0; - deleteAndZero(destBuffer); - deleteAndZero(tempBuffer); + filter = 0; + deleteAndZero(destBuffer); + deleteAndZero(tempBuffer); } -void AudioResamplingNode::setParameter (int parameterIndex, float newValue) +void AudioResamplingNode::setParameter(int parameterIndex, float newValue) { - switch (parameterIndex) { - - case 0: destBufferTimebaseSecs = newValue; break; - case 1: destBufferWidth = roundToInt(newValue); + switch (parameterIndex) + { + + case 0: + destBufferTimebaseSecs = newValue; + break; + case 1: + destBufferWidth = roundToInt(newValue); - } + } - // reset to zero and clear if timebase or width has changed. - destBufferPos = 0; - destBuffer->clear(); + // reset to zero and clear if timebase or width has changed. + destBufferPos = 0; + destBuffer->clear(); } -void AudioResamplingNode::prepareToPlay (double sampleRate_, int estimatedSamplesPerBlock) +void AudioResamplingNode::prepareToPlay(double sampleRate_, int estimatedSamplesPerBlock) { - std::cout << "AudioResamplingNode preparing to play." << std::endl; + std::cout << "AudioResamplingNode preparing to play." << std::endl; - if (destBufferIsTempBuffer) { - destBufferSampleRate = sampleRate_; - tempBuffer->setSize(getNumInputs(), 4096); - } - else { - destBufferSampleRate = float(destBufferWidth) / destBufferTimebaseSecs; - destBuffer->setSize(getNumInputs(), destBufferWidth); - } + if (destBufferIsTempBuffer) + { + destBufferSampleRate = sampleRate_; + tempBuffer->setSize(getNumInputs(), 4096); + } + else + { + destBufferSampleRate = float(destBufferWidth) / destBufferTimebaseSecs; + destBuffer->setSize(getNumInputs(), destBufferWidth); + } - destBuffer->clear(); - tempBuffer->clear(); + destBuffer->clear(); + tempBuffer->clear(); - destBufferPos = 0; + destBufferPos = 0; - std::cout << "Temp buffer size: " << tempBuffer->getNumChannels() << " x " - << tempBuffer->getNumSamples() << std::endl; + std::cout << "Temp buffer size: " << tempBuffer->getNumChannels() << " x " + << tempBuffer->getNumSamples() << std::endl; - updateFilter(); + updateFilter(); } -void AudioResamplingNode::updateFilter() { - - double cutoffFreq = (ratio > 1.0) ? 2 * destBufferSampleRate // downsample - : destBufferSampleRate / 2; // upsample +void AudioResamplingNode::updateFilter() +{ + + double cutoffFreq = (ratio > 1.0) ? 2 * destBufferSampleRate // downsample + : destBufferSampleRate / 2; // upsample double sampleFreq = (ratio > 1.0) ? sourceBufferSampleRate // downsample - : destBufferSampleRate; // upsample - - Dsp::Params params; - params[0] = sampleFreq; // sample rate - params[1] = cutoffFreq; // cutoff frequency - params[2] = 1.25; //Q // - - filter->setParams (params); - + : destBufferSampleRate; // upsample + + Dsp::Params params; + params[0] = sampleFreq; // sample rate + params[1] = cutoffFreq; // cutoff frequency + params[2] = 1.25; //Q // + + filter->setParams(params); + } -void AudioResamplingNode::releaseResources() -{ +void AudioResamplingNode::releaseResources() +{ } -void AudioResamplingNode::process(AudioSampleBuffer &buffer, - MidiBuffer &midiMessages, - int& nSamples) +void AudioResamplingNode::process(AudioSampleBuffer& buffer, + MidiBuffer& midiMessages, + int& nSamples) { - int nSamps = nSamples; - int valuesNeeded; + int nSamps = nSamples; + int valuesNeeded; - if (destBufferIsTempBuffer) { - ratio = float(nSamps) / float(buffer.getNumSamples()); - valuesNeeded = buffer.getNumSamples(); - } else { - ratio = sourceBufferSampleRate / destBufferSampleRate; - valuesNeeded = (int) buffer.getNumSamples() / ratio; - //std::cout << std::endl; - //std::cout << "Ratio: " << ratio << std::endl; - //std::cout << "Values needed: " << valuesNeeded << std::endl; - } + if (destBufferIsTempBuffer) + { + ratio = float(nSamps) / float(buffer.getNumSamples()); + valuesNeeded = buffer.getNumSamples(); + } + else + { + ratio = sourceBufferSampleRate / destBufferSampleRate; + valuesNeeded = (int) buffer.getNumSamples() / ratio; + //std::cout << std::endl; + //std::cout << "Ratio: " << ratio << std::endl; + //std::cout << "Values needed: " << valuesNeeded << std::endl; + } - if (lastRatio != ratio) { - updateFilter(); - lastRatio = ratio; - } + if (lastRatio != ratio) + { + updateFilter(); + lastRatio = ratio; + } - if (ratio > 1.0001) { - // pre-apply filter before downsampling - filter->process (nSamps, buffer.getArrayOfChannels()); - } + if (ratio > 1.0001) + { + // pre-apply filter before downsampling + filter->process(nSamps, buffer.getArrayOfChannels()); + } - // initialize variables - tempBuffer->clear(); - int sourceBufferPos = 0; - int sourceBufferSize = buffer.getNumSamples(); - float subSampleOffset = 0.0; - int nextPos = (sourceBufferPos + 1) % sourceBufferSize; + // initialize variables + tempBuffer->clear(); + int sourceBufferPos = 0; + int sourceBufferSize = buffer.getNumSamples(); + float subSampleOffset = 0.0; + int nextPos = (sourceBufferPos + 1) % sourceBufferSize; - int tempBufferPos; - //int totalSamples = 0; + int tempBufferPos; + //int totalSamples = 0; - // code modified from "juce_ResamplingAudioSource.cpp": + // code modified from "juce_ResamplingAudioSource.cpp": for (tempBufferPos = 0; tempBufferPos < valuesNeeded; tempBufferPos++) { - float gain = 1.0; + float gain = 1.0; float alpha = (float) subSampleOffset; float invAlpha = 1.0f - alpha; - for (int channel = 0; channel < buffer.getNumChannels(); ++channel) { - - tempBuffer->addFrom(channel, // destChannel - tempBufferPos, // destSampleOffset - buffer, // source - channel, // sourceChannel - sourceBufferPos,// sourceSampleOffset - 1, // number of samples - invAlpha*gain); // gain to apply to source - - tempBuffer->addFrom(channel, // destChannel - tempBufferPos, // destSampleOffset - buffer, // source - channel, // sourceChannel - nextPos, // sourceSampleOffset - 1, // number of samples - alpha*gain); // gain to apply to source - - } + for (int channel = 0; channel < buffer.getNumChannels(); ++channel) + { + + tempBuffer->addFrom(channel, // destChannel + tempBufferPos, // destSampleOffset + buffer, // source + channel, // sourceChannel + sourceBufferPos,// sourceSampleOffset + 1, // number of samples + invAlpha*gain); // gain to apply to source + + tempBuffer->addFrom(channel, // destChannel + tempBufferPos, // destSampleOffset + buffer, // source + channel, // sourceChannel + nextPos, // sourceSampleOffset + 1, // number of samples + alpha*gain); // gain to apply to source + + } subSampleOffset += ratio; @@ -216,70 +229,77 @@ void AudioResamplingNode::process(AudioSampleBuffer &buffer, } } - // std::cout << sourceBufferPos << " " << tempBufferPos << std::endl; + // std::cout << sourceBufferPos << " " << tempBufferPos << std::endl; - if (ratio < 0.9999) { + if (ratio < 0.9999) + { - filter->process (tempBufferPos, tempBuffer->getArrayOfChannels()); - // apply the filter after upsampling - ///////filter->process (totalSamples, buffer.getArrayOfChannels()); - } else if (ratio <= 1.0001) { - - // no resampling is being applied, no need to filter, BUT... - // keep the filter stoked with samples to avoid discontinuities + filter->process(tempBufferPos, tempBuffer->getArrayOfChannels()); + // apply the filter after upsampling + ///////filter->process (totalSamples, buffer.getArrayOfChannels()); + } + else if (ratio <= 1.0001) + { - } + // no resampling is being applied, no need to filter, BUT... + // keep the filter stoked with samples to avoid discontinuities - if (destBufferIsTempBuffer) { - - // copy the temp buffer into the original buffer - buffer = AudioSampleBuffer(tempBuffer->getArrayOfChannels(), 2, tempBufferPos);//buffer.getNumSamples()); + } - } else { + if (destBufferIsTempBuffer) + { + + // copy the temp buffer into the original buffer + buffer = AudioSampleBuffer(tempBuffer->getArrayOfChannels(), 2, tempBufferPos);//buffer.getNumSamples()); + + } + else + { - //std::cout << "Copying into dest buffer..." << std::endl; - - // copy the temp buffer into the destination buffer + //std::cout << "Copying into dest buffer..." << std::endl; - int pos = 0; + // copy the temp buffer into the destination buffer - while (*tempBuffer->getSampleData(0,pos) != 0) - pos++; + int pos = 0; - int spaceAvailable = destBufferWidth - destBufferPos; - int blockSize1 = (spaceAvailable > pos) ? pos : spaceAvailable; - int blockSize2 = (spaceAvailable > pos) ? 0 : (pos - spaceAvailable); + while (*tempBuffer->getSampleData(0,pos) != 0) + pos++; - for (int channel = 0; channel < destBuffer->getNumChannels(); channel++) { + int spaceAvailable = destBufferWidth - destBufferPos; + int blockSize1 = (spaceAvailable > pos) ? pos : spaceAvailable; + int blockSize2 = (spaceAvailable > pos) ? 0 : (pos - spaceAvailable); - // copy first block - destBuffer->copyFrom(channel, //destChannel - destBufferPos, //destStartSample - *tempBuffer, //source - channel, //sourceChannel - 0, //sourceStartSample - blockSize1 //numSamples - ); + for (int channel = 0; channel < destBuffer->getNumChannels(); channel++) + { + + // copy first block + destBuffer->copyFrom(channel, //destChannel + destBufferPos, //destStartSample + *tempBuffer, //source + channel, //sourceChannel + 0, //sourceStartSample + blockSize1 //numSamples + ); + + // copy second block + destBuffer->copyFrom(channel, //destChannel + 0, //destStartSample + *tempBuffer, //source + channel, //sourceChannel + blockSize1, //sourceStartSample + blockSize2 //numSamples + ); + + } - // copy second block - destBuffer->copyFrom(channel, //destChannel - 0, //destStartSample - *tempBuffer, //source - channel, //sourceChannel - blockSize1, //sourceStartSample - blockSize2 //numSamples - ); - - } - - //destBufferPos = (spaceAvailable > tempBufferPos) ? destBufferPos + //destBufferPos = (spaceAvailable > tempBufferPos) ? destBufferPos - destBufferPos += pos; - destBufferPos %= destBufferWidth; + destBufferPos += pos; + destBufferPos %= destBufferWidth; - //std::cout << "Temp buffer position: " << tempBufferPos << std::endl; - //std::cout << "Resampling node value:" << *destBuffer->getSampleData(0,0) << std::endl; + //std::cout << "Temp buffer position: " << tempBufferPos << std::endl; + //std::cout << "Resampling node value:" << *destBuffer->getSampleData(0,0) << std::endl; } @@ -289,27 +309,27 @@ void AudioResamplingNode::process(AudioSampleBuffer &buffer, void AudioResamplingNode::writeContinuousBuffer(float* data, int nSamples, int channel) { - // find file and write samples to disk - timestamp = timer.getHighResolutionTicks(); + // find file and write samples to disk + timestamp = timer.getHighResolutionTicks(); - AudioDataConverters::convertFloatToInt16BE(data, continuousDataBuffer, nSamples); + AudioDataConverters::convertFloatToInt16BE(data, continuousDataBuffer, nSamples); - //int16 samps = nSamples; + //int16 samps = nSamples; - fwrite(×tamp, // ptr - 8, // size of each element - 1, // count - file); // ptr to FILE object + fwrite(×tamp, // ptr + 8, // size of each element + 1, // count + file); // ptr to FILE object - fwrite(&nSamples, // ptr - sizeof(nSamples), // size of each element - 1, // count - file); // ptr to FILE object + fwrite(&nSamples, // ptr + sizeof(nSamples), // size of each element + 1, // count + file); // ptr to FILE object - fwrite(continuousDataBuffer, // ptr - 2, // size of each element - nSamples, // count - file); // ptr to FILE object - // FIXME: check that return value of each fwrite() equals "count"; - // otherwise, there was an error. + fwrite(continuousDataBuffer, // ptr + 2, // size of each element + nSamples, // count + file); // ptr to FILE object + // FIXME: check that return value of each fwrite() equals "count"; + // otherwise, there was an error. } diff --git a/Source/Processors/AudioResamplingNode.h b/Source/Processors/AudioResamplingNode.h index b5eb052cb57804eaa51f8fc52b4c08961125648e..b3a85b7bcd6dfd8fe387b562fe897d29f3b2617d 100644 --- a/Source/Processors/AudioResamplingNode.h +++ b/Source/Processors/AudioResamplingNode.h @@ -26,9 +26,6 @@ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "../Dsp/Dsp.h" #include "GenericProcessor.h" @@ -41,7 +38,7 @@ Code is based on Juce's ResamplingAudioSource class. This processor could be vastly improved by implementing a scheme to handle - inputs that do not provide the same amount of samples in each buffer. At the + inputs that do not provide the same amount of samples in each buffer. At the moment, the resampling process shifts the pitch of the incoming signal. @see GenericProcessor @@ -52,51 +49,57 @@ class AudioResamplingNode : public GenericProcessor { public: - - AudioResamplingNode(); - ~AudioResamplingNode(); - - AudioSampleBuffer* getBufferAddress() { return destBuffer; } - void updateFilter(); - - void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock); - void releaseResources(); - void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); - void setParameter (int parameterIndex, float newValue); - AudioSampleBuffer* getContinuousBuffer() {return destBuffer;} + AudioResamplingNode(); + ~AudioResamplingNode(); + + AudioSampleBuffer* getBufferAddress() + { + return destBuffer; + } + void updateFilter(); + + void prepareToPlay(double sampleRate, int estimatedSamplesPerBlock); + void releaseResources(); + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); + void setParameter(int parameterIndex, float newValue); + + AudioSampleBuffer* getContinuousBuffer() + { + return destBuffer; + } private: - // sample rate, timebase, and ratio info: - double sourceBufferSampleRate, destBufferSampleRate; - double ratio, lastRatio; - double destBufferTimebaseSecs; - int destBufferWidth; - - // major objects: - Dsp::Filter* filter; - AudioSampleBuffer* destBuffer; - AudioSampleBuffer* tempBuffer; + // sample rate, timebase, and ratio info: + double sourceBufferSampleRate, destBufferSampleRate; + double ratio, lastRatio; + double destBufferTimebaseSecs; + int destBufferWidth; + + // major objects: + Dsp::Filter* filter; + AudioSampleBuffer* destBuffer; + AudioSampleBuffer* tempBuffer; - // is the destBuffer a temp buffer or not? - bool destBufferIsTempBuffer; - bool isTransmitting; + // is the destBuffer a temp buffer or not? + bool destBufferIsTempBuffer; + bool isTransmitting; - // indexing objects that persist between rounds: - int destBufferPos; + // indexing objects that persist between rounds: + int destBufferPos; - // for testing purposes only: - void writeContinuousBuffer(float*, int, int); + // for testing purposes only: + void writeContinuousBuffer(float*, int, int); - FILE* file; - int64 timestamp; - Time timer; + FILE* file; + int64 timestamp; + Time timer; - int16* continuousDataBuffer; + int16* continuousDataBuffer; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioResamplingNode); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AudioResamplingNode); }; diff --git a/Source/Processors/Channel.cpp b/Source/Processors/Channel.cpp index 1970a6e7e6f25b898b57ba43b244314485e4e9fd..19bf8e2222b08e06384104f381e00e8442c1a768 100644 --- a/Source/Processors/Channel.cpp +++ b/Source/Processors/Channel.cpp @@ -25,53 +25,53 @@ Channel::Channel(GenericProcessor* p, int n) : - num(n), eventType(0), isEventChannel(false), isRecording(false), - isMonitored(false), isEnabled(true), processor(p), - sampleRate(44100.0f), bitVolts(1.0f) + num(n), eventType(0), isEventChannel(false), isRecording(false), + isMonitored(false), isEnabled(true), processor(p), + sampleRate(44100.0f), bitVolts(1.0f) { - nodeId = p->getNodeId(); + nodeId = p->getNodeId(); - createDefaultName(); + createDefaultName(); } Channel::Channel(const Channel& ch) { - processor = ch.processor; - isEventChannel = ch.isEventChannel; - isEnabled = ch.isEnabled; - isRecording = false; - isMonitored = false; - sampleRate = ch.sampleRate; - bitVolts = ch.bitVolts; - name = ch.name; - eventType = ch.eventType; - nodeId = ch.nodeId; - num = ch.num; + processor = ch.processor; + isEventChannel = ch.isEventChannel; + isEnabled = ch.isEnabled; + isRecording = false; + isMonitored = false; + sampleRate = ch.sampleRate; + bitVolts = ch.bitVolts; + name = ch.name; + eventType = ch.eventType; + nodeId = ch.nodeId; + num = ch.num; } void Channel::setProcessor(GenericProcessor* p) { - processor = p; - nodeId = p->getNodeId(); + processor = p; + nodeId = p->getNodeId(); } String Channel::getName() { - return name; + return name; } void Channel::reset() { - createDefaultName(); + createDefaultName(); + + sampleRate = 44100.0f; + bitVolts = 1.0f; - sampleRate = 44100.0f; - bitVolts = 1.0f; - } void Channel::createDefaultName() { - name = String("CH"); - name += (num + 1); + name = String("CH"); + name += (num + 1); } diff --git a/Source/Processors/Channel.h b/Source/Processors/Channel.h index d30bbbd832251bb43f58d4d15caa2ba7e1bfe632..af30c38c8cd32e3fa0225e9218625422dd049b9a 100644 --- a/Source/Processors/Channel.h +++ b/Source/Processors/Channel.h @@ -25,10 +25,6 @@ #define __CHANNEL_H_DABDFE3F__ -#ifdef WIN32 -#include <Windows.h> -#endif - #include "../../JuceLibraryCode/JuceHeader.h" #include "GenericProcessor.h" @@ -38,7 +34,7 @@ class GenericProcessor; /** - + Holds metadata about a given channel within a processor. The Channel class provides a convenient way to store settings @@ -56,53 +52,53 @@ class Channel { public: - /** Default constructor for creating Channels from scratch. */ - Channel(GenericProcessor* p, int n); + /** Default constructor for creating Channels from scratch. */ + Channel(GenericProcessor* p, int n); - /** Copy constructor. */ - Channel(const Channel& ch); + /** Copy constructor. */ + Channel(const Channel& ch); - /** Returns the name of a given channel. */ - String getName(); + /** Returns the name of a given channel. */ + String getName(); - /** Restores the default settings for a given channel. */ - void reset(); + /** Restores the default settings for a given channel. */ + void reset(); - /** Sets the processor to which a channel belongs. */ - void setProcessor(GenericProcessor*); + /** Sets the processor to which a channel belongs. */ + void setProcessor(GenericProcessor*); - /** The channel number.*/ - int num; + /** The channel number.*/ + int num; - /** The ID of the channel's processor.*/ - int nodeId; + /** The ID of the channel's processor.*/ + int nodeId; - /** Used for EventChannels only.*/ - int eventType; + /** Used for EventChannels only.*/ + int eventType; - // boolean values: - bool isEventChannel; - bool isRecording; - bool isMonitored; - bool isEnabled; + // boolean values: + bool isEventChannel; + bool isRecording; + bool isMonitored; + bool isEnabled; - /** Pointer to the channel's parent processor. */ - GenericProcessor* processor; + /** Pointer to the channel's parent processor. */ + GenericProcessor* processor; - // crucial information: - float sampleRate; - float bitVolts; + // crucial information: + float sampleRate; + float bitVolts; - // file info (for disk writing): - String filename; - FILE* file; + // file info (for disk writing): + String filename; + FILE* file; - String name; + String name; private: - /** Generates a default name, based on the channel number. */ - void createDefaultName(); + /** Generates a default name, based on the channel number. */ + void createDefaultName(); }; diff --git a/Source/Processors/DataThreads/DataBuffer.cpp b/Source/Processors/DataThreads/DataBuffer.cpp index 7d78d28bfd7982f9e07e8059d3976864cde7c72c..be94870fb0e874c2d29757be9b73b139c64b2824 100755 --- a/Source/Processors/DataThreads/DataBuffer.cpp +++ b/Source/Processors/DataThreads/DataBuffer.cpp @@ -24,85 +24,95 @@ #include "DataBuffer.h" DataBuffer::DataBuffer(int chans, int size) - : abstractFifo (size), buffer(chans, size), numChans(chans) + : abstractFifo(size), buffer(chans, size), numChans(chans) { - timestampBuffer = new uint64[size]; - eventCodeBuffer = new int16[size]; + timestampBuffer = new uint64[size]; + eventCodeBuffer = new int16[size]; } DataBuffer::~DataBuffer() {} -void DataBuffer::clear() { - buffer.clear(); +void DataBuffer::clear() +{ + buffer.clear(); } -void DataBuffer::addToBuffer(float* data, uint64* timestamps, int16* eventCodes, int numItems) { - // writes one sample for all channels - int startIndex1, blockSize1, startIndex2, blockSize2; - abstractFifo.prepareToWrite(numItems, startIndex1, blockSize1, startIndex2, blockSize2); +void DataBuffer::addToBuffer(float* data, uint64* timestamps, int16* eventCodes, int numItems) +{ + // writes one sample for all channels + int startIndex1, blockSize1, startIndex2, blockSize2; + abstractFifo.prepareToWrite(numItems, startIndex1, blockSize1, startIndex2, blockSize2); + + for (int chan = 0; chan < numChans; chan++) + { - for (int chan = 0; chan < numChans; chan++) { + buffer.copyFrom(chan, // int destChannel + startIndex1, // int destStartSample + data + chan, // const float* source + 1); // int num samples + } - buffer.copyFrom(chan, // int destChannel - startIndex1, // int destStartSample - data + chan, // const float* source - 1); // int num samples - } - - *(timestampBuffer + startIndex1) = *timestamps; - *(eventCodeBuffer + startIndex1) = *eventCodes; + *(timestampBuffer + startIndex1) = *timestamps; + *(eventCodeBuffer + startIndex1) = *eventCodes; - abstractFifo.finishedWrite(numItems); + abstractFifo.finishedWrite(numItems); } -int DataBuffer::getNumSamples() { - return abstractFifo.getNumReady(); +int DataBuffer::getNumSamples() +{ + return abstractFifo.getNumReady(); } -int DataBuffer::readAllFromBuffer (AudioSampleBuffer& data, uint64* timestamp, int16* eventCodes, int maxSize) +int DataBuffer::readAllFromBuffer(AudioSampleBuffer& data, uint64* timestamp, int16* eventCodes, int maxSize) { - // check to see if the maximum size is smaller than the total number of available ints - int numItems = (maxSize < abstractFifo.getNumReady()) ? - maxSize : abstractFifo.getNumReady(); - - int startIndex1, blockSize1, startIndex2, blockSize2; - abstractFifo.prepareToRead(numItems, startIndex1, blockSize1, startIndex2, blockSize2); - - if (blockSize1 > 0) { - - for (int chan = 0; chan < data.getNumChannels(); chan++) { - data.copyFrom(chan, // destChan - 0, // destStartSample - buffer, // source - chan, // sourceChannel - startIndex1, // sourceStartSample - blockSize1); // numSamples - } - - memcpy(timestamp, timestampBuffer+startIndex1, 8); - memcpy(eventCodes, eventCodeBuffer+startIndex1, blockSize1*2); - } else { - memcpy(timestamp, timestampBuffer+startIndex2, 8); - } - - if (blockSize2 > 0) { - - for (int chan = 0; chan < data.getNumChannels(); chan++) { - data.copyFrom(chan, // destChan - blockSize1, // destStartSample - buffer, // source - chan, // sourceChannel - startIndex2, // sourceStartSample - blockSize2); // numSamples - } - memcpy(eventCodes + blockSize1, eventCodeBuffer+startIndex2, blockSize2*2); - } - - abstractFifo.finishedRead(numItems); - - return numItems; + // check to see if the maximum size is smaller than the total number of available ints + int numItems = (maxSize < abstractFifo.getNumReady()) ? + maxSize : abstractFifo.getNumReady(); + + int startIndex1, blockSize1, startIndex2, blockSize2; + abstractFifo.prepareToRead(numItems, startIndex1, blockSize1, startIndex2, blockSize2); + + if (blockSize1 > 0) + { + + for (int chan = 0; chan < data.getNumChannels(); chan++) + { + data.copyFrom(chan, // destChan + 0, // destStartSample + buffer, // source + chan, // sourceChannel + startIndex1, // sourceStartSample + blockSize1); // numSamples + } + + memcpy(timestamp, timestampBuffer+startIndex1, 8); + memcpy(eventCodes, eventCodeBuffer+startIndex1, blockSize1*2); + } + else + { + memcpy(timestamp, timestampBuffer+startIndex2, 8); + } + + if (blockSize2 > 0) + { + + for (int chan = 0; chan < data.getNumChannels(); chan++) + { + data.copyFrom(chan, // destChan + blockSize1, // destStartSample + buffer, // source + chan, // sourceChannel + startIndex2, // sourceStartSample + blockSize2); // numSamples + } + memcpy(eventCodes + blockSize1, eventCodeBuffer+startIndex2, blockSize2*2); + } + + abstractFifo.finishedRead(numItems); + + return numItems; } \ No newline at end of file diff --git a/Source/Processors/DataThreads/DataBuffer.h b/Source/Processors/DataThreads/DataBuffer.h index f2cb4864ba9d7a6c7e736e35feea18573e735984..08eb4efa0289e7189f1cb386f508decaf308e6da 100755 --- a/Source/Processors/DataThreads/DataBuffer.h +++ b/Source/Processors/DataThreads/DataBuffer.h @@ -24,9 +24,6 @@ #ifndef __DATABUFFER_H_11C6C591__ #define __DATABUFFER_H_11C6C591__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" /** @@ -39,33 +36,33 @@ class DataBuffer { - + public: - DataBuffer(int chans, int size); - ~DataBuffer(); + DataBuffer(int chans, int size); + ~DataBuffer(); /** Clears the buffer.*/ - void clear(); + void clear(); /** Add an array of floats to the buffer.*/ - void addToBuffer(float* data, uint64* ts, int16* eventCodes, int numItems); + void addToBuffer(float* data, uint64* ts, int16* eventCodes, int numItems); /** Returns the number of samples currently available in the buffer.*/ - int getNumSamples(); + int getNumSamples(); /** Copies as many samples as possible from the DataBuffer to an AudioSampleBuffer.*/ - int readAllFromBuffer(AudioSampleBuffer& data, uint64* ts, int16* eventCodes, int maxSize); + int readAllFromBuffer(AudioSampleBuffer& data, uint64* ts, int16* eventCodes, int maxSize); private: - AbstractFifo abstractFifo; - AudioSampleBuffer buffer; + AbstractFifo abstractFifo; + AudioSampleBuffer buffer; uint64* timestampBuffer; int16* eventCodeBuffer; - int numChans; + int numChans; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DataBuffer); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DataBuffer); }; diff --git a/Source/Processors/DataThreads/DataThread.cpp b/Source/Processors/DataThreads/DataThread.cpp index bd2374fb4a91dcac8deb334c9e064a32c7a27b8c..bdfebaaef6a735fafbbdd0260ecc233e11c700a9 100755 --- a/Source/Processors/DataThreads/DataThread.cpp +++ b/Source/Processors/DataThreads/DataThread.cpp @@ -25,40 +25,43 @@ #include "../SourceNode.h" -DataThread::DataThread(SourceNode* s) : Thread ("Data Thread"), dataBuffer(0) +DataThread::DataThread(SourceNode* s) : Thread("Data Thread"), dataBuffer(0) { - sn = s; - setPriority(10); + sn = s; + setPriority(10); } -DataThread::~DataThread() +DataThread::~DataThread() { //deleteAndZero(dataBuffer); } -void DataThread::run() { +void DataThread::run() +{ - while (!threadShouldExit()) - { + while (!threadShouldExit()) + { - if (!updateBuffer()) { + if (!updateBuffer()) + { - const MessageManagerLock mmLock (Thread::getCurrentThread()); + const MessageManagerLock mmLock(Thread::getCurrentThread()); - std::cout << "Aquisition error...stopping thread." << std::endl; - signalThreadShouldExit(); - std::cout << "Notifying source node to stop acqusition." << std::endl; - sn->acquisitionStopped(); - } + std::cout << "Aquisition error...stopping thread." << std::endl; + signalThreadShouldExit(); + std::cout << "Notifying source node to stop acqusition." << std::endl; + sn->acquisitionStopped(); + } - } + } } -DataBuffer* DataThread::getBufferAddress() { +DataBuffer* DataThread::getBufferAddress() +{ std::cout << "Setting buffer address to " << dataBuffer << std::endl; - return dataBuffer; + return dataBuffer; } diff --git a/Source/Processors/DataThreads/DataThread.h b/Source/Processors/DataThreads/DataThread.h index 094c4adf4c30118dd84446bf2fb16eff2680aad8..03a18aa30679b23f4b10f207d65d0926439a6f0e 100755 --- a/Source/Processors/DataThreads/DataThread.h +++ b/Source/Processors/DataThreads/DataThread.h @@ -24,9 +24,6 @@ #ifndef __DATATHREAD_H_C454F4DB__ #define __DATATHREAD_H_C454F4DB__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include <stdio.h> #include "DataBuffer.h" @@ -51,64 +48,70 @@ class DataThread : public Thread public: - DataThread(SourceNode* sn); - ~DataThread(); + DataThread(SourceNode* sn); + ~DataThread(); /** Calls 'updateBuffer()' continuously while the thread is being run.*/ - void run(); + void run(); /** Returns the address of the DataBuffer that the input source will fill.*/ - DataBuffer* getBufferAddress(); + DataBuffer* getBufferAddress(); - /** Fills the DataBuffer with incoming data. This is the most important + /** Fills the DataBuffer with incoming data. This is the most important method for each DataThread.*/ - virtual bool updateBuffer() = 0; - + virtual bool updateBuffer() = 0; + /** Experimental method used for testing data sources that can deliver outputs.*/ virtual void setOutputHigh() {} /** Experimental method used for testing data sources that can deliver outputs.*/ virtual void setOutputLow() {} - ScopedPointer<DataBuffer> dataBuffer; + ScopedPointer<DataBuffer> dataBuffer; /** Returns true if the data source is connected, false otherwise.*/ - virtual bool foundInputSource() = 0; + virtual bool foundInputSource() = 0; /** Initializes data transfer.*/ - virtual bool startAcquisition() = 0; + virtual bool startAcquisition() = 0; /** Stops data transfer.*/ - virtual bool stopAcquisition() = 0; + virtual bool stopAcquisition() = 0; /** Returns the number of continuous channels the data source can provide.*/ - virtual int getNumChannels() = 0; + virtual int getNumChannels() = 0; /** Returns the sample rate of the data source.*/ - virtual float getSampleRate() = 0; + virtual float getSampleRate() = 0; /** Returns the volts per bit of the data source.*/ virtual float getBitVolts() = 0; /** Returns the number of event channels of the data source.*/ - virtual int getNumEventChannels() {return 0;} + virtual int getNumEventChannels() + { + return 0; + } - SourceNode* sn; + SourceNode* sn; int16 eventCode; uint64 timestamp; Time timer; - + /** Returns a pointer to the data input device, in case other processors need to communicate with it.*/ - virtual void* getDevice() {return 0;} + virtual void* getDevice() + { + return 0; + } private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DataThread); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DataThread); }; diff --git a/Source/Processors/DataThreads/FPGAThread.cpp b/Source/Processors/DataThreads/FPGAThread.cpp index 5b837a6d35aa03c892c382c5f5e29818c88aac9a..25064928dd1c05b165ae5159e0831f829287dd2e 100644 --- a/Source/Processors/DataThreads/FPGAThread.cpp +++ b/Source/Processors/DataThreads/FPGAThread.cpp @@ -29,71 +29,76 @@ #define M_PI 3.14159265358979323846 FPGAThread::FPGAThread(SourceNode* sn) - : DataThread(sn), - isTransmitting(false), deviceFound(false), bytesToRead(20000), - ttlState(0), ttlOutputVal(0), bufferWasAligned(false), numchannels(32) + : DataThread(sn), + isTransmitting(false), deviceFound(false), bytesToRead(20000), + ttlState(0), ttlOutputVal(0), bufferWasAligned(false), numchannels(32) { - //const char* bitfilename = "./pipetest.bit"; + //const char* bitfilename = "./pipetest.bit"; #if JUCE_LINUX - const char* bitfilename = "./pipetest.bit"; + const char* bitfilename = "./pipetest.bit"; const char* libname = "./libokFrontPanel.so"; #endif #if JUCE_WIN32 - const char* bitfilename = "pipetest.bit"; + const char* bitfilename = "pipetest.bit"; const char* libname = NULL; #endif #if JUCE_MAC const char* bitfilename = "/Users/Josh/Programming/open-ephys/GUI/Resources/DLLs/pipetest.bit"; const char* libname = "/Users/Josh/Programming/open-ephys/GUI/Resources/DLLs/libokFrontPanel.dylib"; #endif - - if (!okFrontPanelDLL_LoadLib(libname)) { - printf("FrontPanel DLL could not be loaded.\n"); - } - - okFrontPanelDLL_GetVersion(dll_date, dll_time); - //printf("FrontPanel DLL loaded. Built: %s %s\n", dll_date, dll_time); - dev = new okCFrontPanel; + if (!okFrontPanelDLL_LoadLib(libname)) + { + printf("FrontPanel DLL could not be loaded.\n"); + } - strncpy(bitfile, bitfilename, 128); + okFrontPanelDLL_GetVersion(dll_date, dll_time); + //printf("FrontPanel DLL loaded. Built: %s %s\n", dll_date, dll_time); - // Initialize the FPGA with our configuration bitfile. - deviceFound = initializeFPGA(true); + dev = new okCFrontPanel; - if (!deviceFound) { - printf("FPGA could not be initialized.\n"); - } else { - printf("FPGA interface initialized.\n"); - } + strncpy(bitfile, bitfilename, 128); - Ndatabytes = numchannels*3; - - dataBuffer = new DataBuffer(numchannels, 10000); + // Initialize the FPGA with our configuration bitfile. + deviceFound = initializeFPGA(true); + + if (!deviceFound) + { + printf("FPGA could not be initialized.\n"); + } + else + { + printf("FPGA interface initialized.\n"); + } - eventCode = 0; + Ndatabytes = numchannels*3; - //High-Pass filter - const double fL=0.5; + dataBuffer = new DataBuffer(numchannels, 10000); - filter_A = exp(-2*M_PI*fL/getSampleRate()); - filter_B = (double)1.0 - filter_A; + eventCode = 0; + + //High-Pass filter + const double fL=0.5; + + filter_A = exp(-2*M_PI*fL/getSampleRate()); + filter_B = (double)1.0 - filter_A; } -FPGAThread::~FPGAThread() { - - std::cout << "FPGA interface destroyed." << std::endl; +FPGAThread::~FPGAThread() +{ + + std::cout << "FPGA interface destroyed." << std::endl; - deleteAndZero(dev); + deleteAndZero(dev); } int FPGAThread::getNumChannels() { - return numchannels; + return numchannels; } int FPGAThread::getNumEventChannels() @@ -103,71 +108,72 @@ int FPGAThread::getNumEventChannels() float FPGAThread::getSampleRate() { - return 28344.67;//12520.0; + return 28344.67;//12520.0; } float FPGAThread::getBitVolts() { - return 0.1907; + return 0.1907; } bool FPGAThread::foundInputSource() { - return true; + return true; - // if (deviceFound) - // { - // if (okCFrontPanel::NoError != dev->ConfigureFPGA(bitfile)) - // { - // printf("FPGA configuration failed.\n"); - // deviceFound = false; - // return false; - // } + // if (deviceFound) + // { + // if (okCFrontPanel::NoError != dev->ConfigureFPGA(bitfile)) + // { + // printf("FPGA configuration failed.\n"); + // deviceFound = false; + // return false; + // } - // } else { + // } else { - // // if (!initializeFPGA(false)) - // // { - // // return false; - // // } else { - // // deviceFound = true; - // // } + // // if (!initializeFPGA(false)) + // // { + // // return false; + // // } else { + // // deviceFound = true; + // // } - // } + // } } bool FPGAThread::startAcquisition() { - - //alignBuffer(200); - //alignBuffer(200); - //alignBuffer(200); - // alignBuffer(); + //alignBuffer(200); + //alignBuffer(200); + //alignBuffer(200); + + // alignBuffer(); - // alignBuffer(); + // alignBuffer(); - bufferWasAligned = false; + bufferWasAligned = false; - memset(filter_states,0,256*sizeof(double)); + memset(filter_states,0,256*sizeof(double)); - startThread(); + startThread(); - isTransmitting = true; - accumulator = 0; + isTransmitting = true; + accumulator = 0; - return true; + return true; } bool FPGAThread::stopAcquisition() { - isTransmitting = false; + isTransmitting = false; - if (isThreadRunning()) { + if (isThreadRunning()) + { signalThreadShouldExit(); } @@ -178,76 +184,76 @@ bool FPGAThread::stopAcquisition() int FPGAThread::alignBuffer(int nBytes) { - long return_code; + long return_code; + + return_code = dev->ReadFromPipeOut(0xA0, nBytes, pBuffer); - return_code = dev->ReadFromPipeOut(0xA0, nBytes, pBuffer); + //std::cout << "Bytes read: " << return_code << std::endl; - //std::cout << "Bytes read: " << return_code << std::endl; + int j = 0; - int j = 0; + while (j < nBytes) + { - while (j < nBytes) - { - - // look for timecode block (6 bytes) - if ( (pBuffer[j] & 1) - && (pBuffer[j+1] & 1) - && (pBuffer[j+2] & 1) - && (pBuffer[j+3] & 1) - && (pBuffer[j+4] & 1) - && (pBuffer[j+5] & 1) ) - //&& (j+5+Ndatabytes <= bytesToRead) ) // indicated by last bit being 1 - { - int numNeeded = j; + // look for timecode block (6 bytes) + if ((pBuffer[j] & 1) + && (pBuffer[j+1] & 1) + && (pBuffer[j+2] & 1) + && (pBuffer[j+3] & 1) + && (pBuffer[j+4] & 1) + && (pBuffer[j+5] & 1)) + //&& (j+5+Ndatabytes <= bytesToRead) ) // indicated by last bit being 1 + { + int numNeeded = j; - std::cout << j << " "; + std::cout << j << " "; - return_code = dev->ReadFromPipeOut(0xA0, numNeeded, pBuffer); - //std::cout << "First sample is " << j << std::endl; - //std::cout << "Samples needed: " << numNeeded << std::endl; - break; - } + return_code = dev->ReadFromPipeOut(0xA0, numNeeded, pBuffer); + //std::cout << "First sample is " << j << std::endl; + //std::cout << "Samples needed: " << numNeeded << std::endl; + break; + } - j++; - } + j++; + } - return j; + return j; } -bool FPGAThread::updateBuffer() +bool FPGAThread::updateBuffer() { - long return_code; - double currentSample; - - if (!bufferWasAligned) - { - alignBuffer(100000); - alignBuffer(2000); - //return_code = dev->ReadFromPipeOut(0xA0, 206, pBuffer); - //alignBuffer(2000); - //alignBuffer(200); - bufferWasAligned = true; - } - - return_code = dev->ReadFromPipeOut(0xA0, bytesToRead, pBuffer); + long return_code; + double currentSample; + + if (!bufferWasAligned) + { + alignBuffer(100000); + alignBuffer(2000); + //return_code = dev->ReadFromPipeOut(0xA0, 206, pBuffer); + //alignBuffer(2000); + //alignBuffer(200); + bufferWasAligned = true; + } + + return_code = dev->ReadFromPipeOut(0xA0, bytesToRead, pBuffer); //std::cout << return_code << std::endl; should return number of bytes read [sizeof(pBuffer)] - - if (return_code == 0) - return false; + + if (return_code == 0) + return false; int j = 0; // coding scheme: - // the code works on a per-byte level where each byte ends in a 0 for data bytes - // or in 1 for timecode bytes. This is some overhead but makes data integrity checks - // pretty trivial. - // - // headstages are A,B,C,D and another one for the breakout box T for the 0-5v TTL input - // A1 is stage A channel 1 etc + // the code works on a per-byte level where each byte ends in a 0 for data bytes + // or in 1 for timecode bytes. This is some overhead but makes data integrity checks + // pretty trivial. + // + // headstages are A,B,C,D and another one for the breakout box T for the 0-5v TTL input + // A1 is stage A channel 1 etc // ............... // tc ttttttt1 // tc ttttttt1 (6*7bit timecode gives 42 bit gives 4.3980e+12 samples max @@ -269,186 +275,190 @@ bool FPGAThread::updateBuffer() // // ... next sample ... // - + int i = 0; - // int samplesUsed = 0; - // int startSample = 0; - + // int samplesUsed = 0; + // int startSample = 0; + // new strategy: read in 201 bytes & find the first sample // int firstSample; - - while (j < bytesToRead) - { - - // look for timecode block (6 bytes) - if ( (pBuffer[j] & 1) - && (pBuffer[j+1] & 1) - && (pBuffer[j+2] & 1) - && (pBuffer[j+3] & 1) - && (pBuffer[j+4] & 1) - && (pBuffer[j+5] & 1) - && (j+5+Ndatabytes <= bytesToRead) ) // indicated by last bit being 1 - { //read 6 bytes, assemble to 6*7 = 42 bits, arranged in 6 bytes - - //std::cout << j << std::endl; - + + while (j < bytesToRead) + { + + // look for timecode block (6 bytes) + if ((pBuffer[j] & 1) + && (pBuffer[j+1] & 1) + && (pBuffer[j+2] & 1) + && (pBuffer[j+3] & 1) + && (pBuffer[j+4] & 1) + && (pBuffer[j+5] & 1) + && (j+5+Ndatabytes <= bytesToRead)) // indicated by last bit being 1 + { + //read 6 bytes, assemble to 6*7 = 42 bits, arranged in 6 bytes + + //std::cout << j << std::endl; + i++; - + if (j % 200 != 0) { - std::cout << "Buffer not aligned " << j << " " << accumulator << std::endl; - //return false; + std::cout << "Buffer not aligned " << j << " " << accumulator << std::endl; + //return false; } if (i == 1) { // firstSample = j; - - // " Bytes read: " << bytesToRead << std::endl; + + // " Bytes read: " << bytesToRead << std::endl; } - - unsigned char timecode[6]; // 1st byte throw out last bit of each byte and just concatenate the other bytes in ascending order - timecode[0] = (pBuffer[j] >> 1) | ((pBuffer[j+1] >> 1) << 7); // 2nd byte - timecode[1] = (pBuffer[j+1] >> 2) | ((pBuffer[j+2] >> 1) << 6); // 3rd byte - timecode[2] = (pBuffer[j+2] >> 3) | ((pBuffer[j+3] >> 1) << 5); // 4th byte - timecode[3] = (pBuffer[j+3] >> 4) | ((pBuffer[j+4] >> 1) << 4); // 5th byte - timecode[4] = (pBuffer[j+4] >> 5) | ((pBuffer[j+5] >> 1) << 3); // 6th byte - timecode[5] = (pBuffer[j+5] >> 6); - + + unsigned char timecode[6]; // 1st byte throw out last bit of each byte and just concatenate the other bytes in ascending order + timecode[0] = (pBuffer[j] >> 1) | ((pBuffer[j+1] >> 1) << 7); // 2nd byte + timecode[1] = (pBuffer[j+1] >> 2) | ((pBuffer[j+2] >> 1) << 6); // 3rd byte + timecode[2] = (pBuffer[j+2] >> 3) | ((pBuffer[j+3] >> 1) << 5); // 4th byte + timecode[3] = (pBuffer[j+3] >> 4) | ((pBuffer[j+4] >> 1) << 4); // 5th byte + timecode[4] = (pBuffer[j+4] >> 5) | ((pBuffer[j+5] >> 1) << 3); // 6th byte + timecode[5] = (pBuffer[j+5] >> 6); + timestamp = (uint64(timecode[5]) << 35) + (uint64(timecode[4]) << 28) + (uint64(timecode[3]) << 32) + (uint64(timecode[2]) << 16) + (uint64(timecode[1]) << 8) + (uint64(timecode[0])); - - - + + + eventCode = pBuffer[j+6]; // TTL input ttl_out = pBuffer[j+7]; if (ttl_out > 0) { - eventCode |= 0x100; // TTL output - //std::cout << "TLL out!" << std::endl; + eventCode |= 0x100; // TTL output + //std::cout << "TLL out!" << std::endl; } - - - j += 8; //move cursor to 1st data byte - // loop through sample data and condense from 3 bytes to 2 bytes - uint16 hi; uint16 lo; + + j += 8; //move cursor to 1st data byte + + // loop through sample data and condense from 3 bytes to 2 bytes + uint16 hi; + uint16 lo; // only take data from the first headstage (i.e., skip every other channel) - for (int n = 0; n < numchannels*2 ; n++) - { - + for (int n = 0; n < numchannels*2 ; n++) + { + if (n % 2 == 0) { - + // last bit of first 2 is zero, replace with bits 1 and 2 from 3rd byte - hi = (pBuffer[j]) | ((( pBuffer[j+2] >> 2) & ~(1<<6)) & ~(1<<7)) ; - lo = (pBuffer[j+1]) | ((( pBuffer[j+2] >> 1) & ~(1<<1)) & ~(1<<7)) ; + hi = (pBuffer[j]) | (((pBuffer[j+2] >> 2) & ~(1<<6)) & ~(1<<7)) ; + lo = (pBuffer[j+1]) | (((pBuffer[j+2] >> 1) & ~(1<<1)) & ~(1<<7)) ; uint16 samp = ((hi << 8) + lo); - //high-pass filter - currentSample = double(samp) * 0.1907f - 3000.0f; //- 6175.0f; - thisSample[n/2] = float(currentSample - filter_states[n/2]); - filter_states[n/2] = filter_B*currentSample + filter_A*filter_states[n/2]; + //high-pass filter + currentSample = double(samp) * 0.1907f - 3000.0f; //- 6175.0f; + thisSample[n/2] = float(currentSample - filter_states[n/2]); + filter_states[n/2] = filter_B*currentSample + filter_A*filter_states[n/2]; } - + j += 3; - } - + } + j -= 1; // step back in time - dataBuffer->addToBuffer(thisSample, ×tamp, &eventCode, 1); - - // samplesUsed += 200; - - } - - j++; // keep scanning for timecodes - } - - // if (startSample != 0 && bytesToRead > 10000) + dataBuffer->addToBuffer(thisSample, ×tamp, &eventCode, 1); + + // samplesUsed += 200; + + } + + j++; // keep scanning for timecodes + } + + // if (startSample != 0 && bytesToRead > 10000) // bytesToRead -= 2; //else - // bytesToRead = 20000; - - + // bytesToRead = 20000; + + // - startSample - 199;// + (200-startSample) - 1;// + startSample +1; - + //overflowSize = sizeof(pBuffer) - samplesUsed; - -// if (overflowSize != 0) -// { -// memcpy(&overflowBuffer, &pBuffer[j-overflowSize], overflowSize); -// -// } - - // std::cout << "Overflow size: " << overflowSize << std::endl; - - // std::cout << "End time: " << timestamp << std::endl; - - - - // std::cout << "TTL out:" << ttl_out << std::endl; - - //accumulator++; - + + // if (overflowSize != 0) + // { + // memcpy(&overflowBuffer, &pBuffer[j-overflowSize], overflowSize); + // + // } + + // std::cout << "Overflow size: " << overflowSize << std::endl; + + // std::cout << "End time: " << timestamp << std::endl; + + + + // std::cout << "TTL out:" << ttl_out << std::endl; + + //accumulator++; + checkTTLState(); -// if (accumulator == 50) -// { -// //dev->SetWireInValue(0x01, 0x00); //, 0x06); -// ttlOutputVal = 0; -// //accumulator = 0; -// //dev->UpdateWireIns(); -// // std::cout << return_code << " " << i << std::endl; // number of samples found -// // std::cout << "Start sample: " << firstSample << std::endl; -// } else if (accumulator > 100) { -// //dev->SetWireInValue(0x01, 0xFF);//, 0x06); -// //ttlOutputVal = 1; -// accumulator = 0; -// //dev->UpdateWireIns(); -// } - - - - return true; + // if (accumulator == 50) + // { + // //dev->SetWireInValue(0x01, 0x00); //, 0x06); + // ttlOutputVal = 0; + // //accumulator = 0; + // //dev->UpdateWireIns(); + // // std::cout << return_code << " " << i << std::endl; // number of samples found + // // std::cout << "Start sample: " << firstSample << std::endl; + // } else if (accumulator > 100) { + // //dev->SetWireInValue(0x01, 0xFF);//, 0x06); + // //ttlOutputVal = 1; + // accumulator = 0; + // //dev->UpdateWireIns(); + // } + + + + return true; } void FPGAThread::checkTTLState() - { +{ if (sn->getTTLState() != ttlState) { ttlState = sn->getTTLState(); - + if (ttlState == 1) { dev->SetWireInValue(0x01, 0xFF); - } else { + } + else + { dev->SetWireInValue(0x01, 0x00); } - + dev->UpdateWireIns(); } } - + void FPGAThread::setOutputHigh() { dev->SetWireInValue(0x01, 0x01); //, 0x06); - + dev->UpdateWireIns(); - + } void FPGAThread::setOutputLow() @@ -461,55 +471,61 @@ void FPGAThread::setOutputLow() bool FPGAThread::initializeFPGA(bool verbose) { - std::cout << "okCFrontPanel found " << dev->GetDeviceCount() << " devices." << std::endl; - - if (okCFrontPanel::NoError != dev->OpenBySerial()) { - if (verbose) - printf("Device could not be opened. Is one connected?\n"); - return false; - } - - if (verbose) - printf("Found a device: %s\n", dev->GetBoardModelString(dev->GetBoardModel()).c_str()); - - dev->LoadDefaultPLLConfiguration(); - - // Get some general information about the XEM. - if (verbose) { - std::string str; - printf("Device firmware version: %d.%d\n", dev->GetDeviceMajorVersion(), dev->GetDeviceMinorVersion()); - str = dev->GetSerialNumber(); - printf("Device serial number: %s\n", str.c_str()); - str = dev->GetDeviceID(); - printf("Device device ID: %s\n", str.c_str()); - } - // Download the configuration file. - if (okCFrontPanel::NoError != dev->ConfigureFPGA(bitfile)) { - if (verbose) - printf("FPGA configuration failed.\n"); - return false; - } else { - printf("Bitfile uploaded.\n"); - } - - // Check for FrontPanel support in the FPGA configuration. - if (verbose) { - if (dev->IsFrontPanelEnabled()) - printf("FrontPanel support is enabled.\n"); - else - printf("FrontPanel support is not enabled.\n"); - } - - dev->SetWireInValue(0x01, 0); + std::cout << "okCFrontPanel found " << dev->GetDeviceCount() << " devices." << std::endl; + + if (okCFrontPanel::NoError != dev->OpenBySerial()) + { + if (verbose) + printf("Device could not be opened. Is one connected?\n"); + return false; + } + + if (verbose) + printf("Found a device: %s\n", dev->GetBoardModelString(dev->GetBoardModel()).c_str()); + + dev->LoadDefaultPLLConfiguration(); + + // Get some general information about the XEM. + if (verbose) + { + std::string str; + printf("Device firmware version: %d.%d\n", dev->GetDeviceMajorVersion(), dev->GetDeviceMinorVersion()); + str = dev->GetSerialNumber(); + printf("Device serial number: %s\n", str.c_str()); + str = dev->GetDeviceID(); + printf("Device device ID: %s\n", str.c_str()); + } + // Download the configuration file. + if (okCFrontPanel::NoError != dev->ConfigureFPGA(bitfile)) + { + if (verbose) + printf("FPGA configuration failed.\n"); + return false; + } + else + { + printf("Bitfile uploaded.\n"); + } + + // Check for FrontPanel support in the FPGA configuration. + if (verbose) + { + if (dev->IsFrontPanelEnabled()) + printf("FrontPanel support is enabled.\n"); + else + printf("FrontPanel support is not enabled.\n"); + } + + dev->SetWireInValue(0x01, 0); dev->UpdateWireIns(); - return true; + return true; - // this is not executed (after returning true) - dev->SetWireInValue(0x00, 1<<2); // set reset bit in cmd wire to 1 and back to 0 - dev->UpdateWireIns(); - dev->SetWireInValue(0x00, 0<<2); - dev->UpdateWireIns(); + // this is not executed (after returning true) + dev->SetWireInValue(0x00, 1<<2); // set reset bit in cmd wire to 1 and back to 0 + dev->UpdateWireIns(); + dev->SetWireInValue(0x00, 0<<2); + dev->UpdateWireIns(); } diff --git a/Source/Processors/DataThreads/FPGAThread.h b/Source/Processors/DataThreads/FPGAThread.h index 27af4852f1dd03562b2f60ccae663a5efcb67ef6..a1f1dce5216fedb38b4415c1968661ccc29dba89 100755 --- a/Source/Processors/DataThreads/FPGAThread.h +++ b/Source/Processors/DataThreads/FPGAThread.h @@ -24,9 +24,6 @@ #ifndef __FPGATHREAD_H_FBB22A45__ #define __FPGATHREAD_H_FBB22A45__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include <stdio.h> @@ -38,7 +35,7 @@ class SourceNode; /** - + Communicates with the Open Ephys acquisition board via an Opal Kelly FPGA. @see DataThread, SourceNode @@ -49,14 +46,14 @@ class FPGAThread : public DataThread { public: - FPGAThread(SourceNode* sn); - ~FPGAThread(); - - bool foundInputSource(); - int getNumChannels(); - float getSampleRate(); - float getBitVolts(); - + FPGAThread(SourceNode* sn); + ~FPGAThread(); + + bool foundInputSource(); + int getNumChannels(); + float getSampleRate(); + float getBitVolts(); + int getNumEventChannels(); void setOutputHigh(); @@ -64,50 +61,50 @@ public: private: - okCFrontPanel* dev; - char bitfile[128]; - char dll_date[32], dll_time[32]; - bool isTransmitting; - bool deviceFound; + okCFrontPanel* dev; + char bitfile[128]; + char dll_date[32], dll_time[32]; + bool isTransmitting; + bool deviceFound; - double filter_A; - double filter_B; - double filter_states[256]; + double filter_A; + double filter_B; + double filter_states[256]; - bool initializeFPGA(bool); - bool closeFPGA(); + bool initializeFPGA(bool); + bool closeFPGA(); - bool startAcquisition(); - bool stopAcquisition(); + bool startAcquisition(); + bool stopAcquisition(); int alignBuffer(int nBytes); - + void checkTTLState(); - unsigned char pBuffer[500000]; // size of the data requested in each buffer + unsigned char pBuffer[500000]; // size of the data requested in each buffer int bytesToRead; unsigned char overflowBuffer[20000]; - + int overflowSize; - + int ttl_out; - + int ttlState; - + int ttlOutputVal; int accumulator; bool bufferWasAligned; - float thisSample[256]; + float thisSample[256]; + + int numchannels; + int Ndatabytes; - int numchannels; - int Ndatabytes; + bool updateBuffer(); - bool updateBuffer(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FPGAThread); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FPGAThread); }; diff --git a/Source/Processors/DataThreads/FileReaderThread.cpp b/Source/Processors/DataThreads/FileReaderThread.cpp index 33e82dc467f3392e64e30c604f90c58493673c82..3f26cd08eaf29528a7595b102563e105c4f83d8f 100755 --- a/Source/Processors/DataThreads/FileReaderThread.cpp +++ b/Source/Processors/DataThreads/FileReaderThread.cpp @@ -42,15 +42,16 @@ FileReaderThread::FileReaderThread(SourceNode* sn) : // mechanism for accepting arguments (the above commented-out code // is a layering violation that's best avoided). #if JUCE_MAC - const char *path = "/Users/Josh/Programming/open-ephys/GUI/Builds/Linux/build/data_stream_16ch_2"; + const char* path = "/Users/Josh/Programming/open-ephys/GUI/Builds/Linux/build/data_stream_16ch_2"; #else - const char *path = "./data_stream_16ch_2"; + const char* path = "./data_stream_16ch_2"; #endif input = fopen(path, "r"); // Avoid a segfault if crock above fails. - if (!input) { + if (!input) + { std::cout << "Can't find data file " << '"' << path << "\", " << "either make sure you're Josh on OS X, " @@ -64,15 +65,16 @@ FileReaderThread::FileReaderThread(SourceNode* sn) : rewind(input); bufferSize = 1600; - dataBuffer = new DataBuffer(16, bufferSize*3); + dataBuffer = new DataBuffer(16, bufferSize*3); - eventCode = 0; + eventCode = 0; - std::cout << "File Reader Thread initialized." << std::endl; + std::cout << "File Reader Thread initialized." << std::endl; } -FileReaderThread::~FileReaderThread() { +FileReaderThread::~FileReaderThread() +{ if (input) fclose(input); } @@ -109,7 +111,8 @@ bool FileReaderThread::startAcquisition() bool FileReaderThread::stopAcquisition() { std::cout << "File reader received disable signal." << std::endl; - if (isThreadRunning()) { + if (isThreadRunning()) + { signalThreadShouldExit(); } @@ -122,16 +125,16 @@ bool FileReaderThread::updateBuffer() { if (!input) return false; - if (dataBuffer->getNumSamples() < bufferSize) - { - // // std::cout << dataBuffer->getNumSamples() << std::endl; + if (dataBuffer->getNumSamples() < bufferSize) + { + // // std::cout << dataBuffer->getNumSamples() << std::endl; - if (ftell(input) >= lengthOfInputFile - bufferSize) - { - rewind(input); - } + if (ftell(input) >= lengthOfInputFile - bufferSize) + { + rewind(input); + } - fread(readBuffer, 2, bufferSize, input); + fread(readBuffer, 2, bufferSize, input); int chan = 0; @@ -144,17 +147,21 @@ bool FileReaderThread::updateBuffer() timestamp = timer.getHighResolutionTicks(); dataBuffer->addToBuffer(thisSample, ×tamp, &eventCode, 1); chan = 0; - } else { + } + else + { chan++; } - } + } - } else { + } + else + { wait(50); // pause for 50 ms to decrease sample rate - } + } return true; } diff --git a/Source/Processors/DataThreads/FileReaderThread.h b/Source/Processors/DataThreads/FileReaderThread.h index e67ae2fc3b07f57dcac29fe4444182aa011f7c7c..4da05fa953a0484435e18e51a2d56b3a2b5c1159 100755 --- a/Source/Processors/DataThreads/FileReaderThread.h +++ b/Source/Processors/DataThreads/FileReaderThread.h @@ -24,9 +24,6 @@ #ifndef __FILEREADERTHREAD_H_82594504__ #define __FILEREADERTHREAD_H_82594504__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include <stdio.h> @@ -49,28 +46,28 @@ class FileReaderThread : public DataThread { public: - FileReaderThread(SourceNode* sn); - ~FileReaderThread(); - - bool foundInputSource(); - bool startAcquisition(); - bool stopAcquisition(); - int getNumChannels(); - float getSampleRate(); + FileReaderThread(SourceNode* sn); + ~FileReaderThread(); + + bool foundInputSource(); + bool startAcquisition(); + bool stopAcquisition(); + int getNumChannels(); + float getSampleRate(); float getBitVolts(); - + private: int lengthOfInputFile; FILE* input; - float thisSample[16]; + float thisSample[16]; int16 readBuffer[1600]; int bufferSize; - bool updateBuffer(); + bool updateBuffer(); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileReaderThread); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FileReaderThread); }; diff --git a/Source/Processors/DataThreads/IntanThread.cpp b/Source/Processors/DataThreads/IntanThread.cpp index 5133f1d5639353650070df0261d283695be77484..04fb6f681fcb70402ce79f0496924008d82e8877 100755 --- a/Source/Processors/DataThreads/IntanThread.cpp +++ b/Source/Processors/DataThreads/IntanThread.cpp @@ -24,23 +24,23 @@ #include "IntanThread.h" IntanThread::IntanThread(SourceNode* sn) - : DataThread(sn), - vendorID(0x0403), productID(0x6010), baudrate(115200), - isTransmitting(false), startCode(83), stopCode(115), ch(-1) + : DataThread(sn), + vendorID(0x0403), productID(0x6010), baudrate(115200), + isTransmitting(false), startCode(83), stopCode(115), ch(-1) { - dataBuffer = new DataBuffer(17,4096); + dataBuffer = new DataBuffer(17,4096); - deviceFound = initializeUSB(true); + deviceFound = initializeUSB(true); - eventCode = 0; + eventCode = 0; } -IntanThread::~IntanThread() +IntanThread::~IntanThread() { - //closeUSB(); - //deleteAndZero(dataBuffer); + //closeUSB(); + //deleteAndZero(dataBuffer); } int IntanThread::getNumChannels() @@ -50,7 +50,7 @@ int IntanThread::getNumChannels() int IntanThread::getNumEventChannels() { - return 6; + return 6; } float IntanThread::getSampleRate() @@ -77,12 +77,16 @@ bool IntanThread::foundInputSource() deviceFound = false; return false; } - } else { + } + else + { // try to initialize USB if (!initializeUSB(false)) { return false; - } else { + } + else + { deviceFound = true; } } @@ -110,8 +114,9 @@ bool IntanThread::stopAcquisition() isTransmitting = false; std::cout << "Received signal to terminate thread." << std::endl; - - if (isThreadRunning()) { + + if (isThreadRunning()) + { signalThreadShouldExit(); } @@ -119,11 +124,14 @@ bool IntanThread::stopAcquisition() int return_value; - if ((return_value = ftdi_write_data(&ftdic, &stopCode, 1)) > 0) { + if ((return_value = ftdi_write_data(&ftdic, &stopCode, 1)) > 0) + { unsigned char buf[4097]; // has to be bigger than the on-chip buffer ftdi_read_data(&ftdic, buf, sizeof(buf)); //closeUSB(); - } else { + } + else + { std::cout << "No device found." << std::endl; deviceFound = false; } @@ -134,46 +142,53 @@ bool IntanThread::stopAcquisition() bool IntanThread::initializeUSB(bool verbose) { - int return_value; + int return_value; - // Step 1: initialise the ftdi_context: - if (ftdi_init(&ftdic) < 0) {// -1 = couldn't allocate read buffer - // -2 = couldn't allocate struct buffer + // Step 1: initialise the ftdi_context: + if (ftdi_init(&ftdic) < 0) // -1 = couldn't allocate read buffer + { + // -2 = couldn't allocate struct buffer if (verbose) fprintf(stderr, "ftdi_init failed\n"); return false; - } else { + } + else + { if (verbose) std::cout << "FTDI context initialized." << std::endl; } - // Step 2: open USB device + // Step 2: open USB device // -3 = device not found // -8 = wrong permissions - if ((return_value = ftdi_usb_open(&ftdic, vendorID, productID)) < 0) + if ((return_value = ftdi_usb_open(&ftdic, vendorID, productID)) < 0) { if (verbose) fprintf(stderr, "unable to open FTDI device: %d (%s)\n", - return_value, - ftdi_get_error_string(&ftdic)); + return_value, + ftdi_get_error_string(&ftdic)); return false; - } else { + } + else + { std::cout << "USB connection opened." << std::endl; } - // Step 3: set the baud rate - if ((return_value = ftdi_set_baudrate(&ftdic, baudrate)) < 0) + // Step 3: set the baud rate + if ((return_value = ftdi_set_baudrate(&ftdic, baudrate)) < 0) { if (verbose) fprintf(stderr, "unable to set baud rate: %d (%s)\n", - return_value, - ftdi_get_error_string(&ftdic)); + return_value, + ftdi_get_error_string(&ftdic)); return false; - } else { + } + else + { std::cout << "Baud rate set to 115200" << std::endl; } - return true; + return true; } @@ -204,35 +219,36 @@ bool IntanThread::updateBuffer() return false; } - // Step 2: sort data - int TTLval, channelVal; + // Step 2: sort data + int TTLval, channelVal; - for (size_t index = 0; index < sizeof(buffer); index += 3) { - - ++ch; - - // for (int n = 0; n < 1; n++) { // + for (size_t index = 0; index < sizeof(buffer); index += 3) + { + + ++ch; + + // for (int n = 0; n < 1; n++) { // // after accounting for bit volts: - thisSample[ch%16] = float((buffer[index] & 127) + - ((buffer[index+1] & 127) << 7) + - ((buffer[index+2] & 3) << 14)) * 0.1907f - 6175.0f; + thisSample[ch%16] = float((buffer[index] & 127) + + ((buffer[index+1] & 127) << 7) + + ((buffer[index+2] & 3) << 14)) * 0.1907f - 6175.0f; // these samples should now be in microvolts! - // bit volt calculation: - // 2.5 V range / 2^16 = 38.14 uV - // 38.14 uV / 200x gain = 0.1907 - // also need to account for 1.235 V offset (where does this come from?) - // 1.235 / 200 * 1e6 = 6175 uV + // bit volt calculation: + // 2.5 V range / 2^16 = 38.14 uV + // 38.14 uV / 200x gain = 0.1907 + // also need to account for 1.235 V offset (where does this come from?) + // 1.235 / 200 * 1e6 = 6175 uV - // before accounting for bit volts: - // thisSample[ch%16+n*16] = float((buffer[index] & 127) + - // ((buffer[index+1] & 127) << 7) + - // ((buffer[index+2] & 3) << 14) - 32768)/32768; + // before accounting for bit volts: + // thisSample[ch%16+n*16] = float((buffer[index] & 127) + + // ((buffer[index+1] & 127) << 7) + + // ((buffer[index+2] & 3) << 14) - 32768)/32768; - //} + //} - if (ch > 0 && ch < 7) // event channels + if (ch > 0 && ch < 7) // event channels { TTLval = (buffer[index+2] & 4) >> 2; // extract TTL value (bit 3) @@ -240,20 +256,21 @@ bool IntanThread::updateBuffer() } - channelVal = buffer[index+2] & 60; // extract channel value + channelVal = buffer[index+2] & 60; // extract channel value - if (channelVal == 60) { + if (channelVal == 60) + { timestamp = timer.getHighResolutionTicks(); - - dataBuffer->addToBuffer(thisSample, ×tamp, &eventCode, 1); + + dataBuffer->addToBuffer(thisSample, ×tamp, &eventCode, 1); // reset values - ch = -1; + ch = -1; eventCode = 0; - } + } } diff --git a/Source/Processors/DataThreads/IntanThread.h b/Source/Processors/DataThreads/IntanThread.h index 8ce792f8704ce335177c664692b1b1fddeb44f74..d09eaf3c74921f11763d4cddc44c41c29aaa69bb 100755 --- a/Source/Processors/DataThreads/IntanThread.h +++ b/Source/Processors/DataThreads/IntanThread.h @@ -24,9 +24,6 @@ #ifndef __INTANTHREAD_H_D9135C03__ #define __INTANTHREAD_H_D9135C03__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include <ftdi.h> #include <stdio.h> @@ -46,39 +43,39 @@ class IntanThread : public DataThread { public: - IntanThread(SourceNode* sn); - ~IntanThread(); - - bool foundInputSource(); - int getNumChannels(); - float getSampleRate(); - float getBitVolts(); - int getNumEventChannels(); - + IntanThread(SourceNode* sn); + ~IntanThread(); + + bool foundInputSource(); + int getNumChannels(); + float getSampleRate(); + float getBitVolts(); + int getNumEventChannels(); + private: - struct ftdi_context ftdic; - int vendorID, productID; - int baudrate; - bool isTransmitting; - bool deviceFound; + struct ftdi_context ftdic; + int vendorID, productID; + int baudrate; + bool isTransmitting; + bool deviceFound; + + bool initializeUSB(bool); + bool closeUSB(); - bool initializeUSB(bool); - bool closeUSB(); + bool startAcquisition(); + bool stopAcquisition(); - bool startAcquisition(); - bool stopAcquisition(); - - unsigned char startCode, stopCode; - unsigned char buffer[240]; // should be 5 samples per channel + unsigned char startCode, stopCode; + unsigned char buffer[240]; // should be 5 samples per channel - float thisSample[17]; // 17 continuous channels and one event channel + float thisSample[17]; // 17 continuous channels and one event channel - int ch; + int ch; - bool updateBuffer(); + bool updateBuffer(); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IntanThread); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(IntanThread); }; diff --git a/Source/Processors/DataThreads/RHD2000Thread.cpp b/Source/Processors/DataThreads/RHD2000Thread.cpp index 64afb905463351f31d68c29fa5add09707464690..2c66ea353bf3884fc23d721e788a1bb939f897d3 100644 --- a/Source/Processors/DataThreads/RHD2000Thread.cpp +++ b/Source/Processors/DataThreads/RHD2000Thread.cpp @@ -26,85 +26,88 @@ RHD2000Thread::RHD2000Thread(SourceNode* sn) : DataThread(sn) { - evalBoard = new Rhd2000EvalBoard; + evalBoard = new Rhd2000EvalBoard; - // Open Opal Kelly XEM6010 board. + // Open Opal Kelly XEM6010 board. int return_code = evalBoard->open(); if (return_code == 1) { - deviceFound = true; - } else { - deviceFound = false; + deviceFound = true; + } + else + { + deviceFound = false; } if (deviceFound) { - string bitfilename; - bitfilename = "rhd2000.bit"; - evalBoard->uploadFpgaBitfile(bitfilename); + string bitfilename; + bitfilename = "rhd2000.bit"; + evalBoard->uploadFpgaBitfile(bitfilename); - // Initialize board. - evalBoard->initialize(); - evalBoard->setDataSource(0, Rhd2000EvalBoard::PortA1); - evalBoard->setDataSource(1, Rhd2000EvalBoard::PortB1); - evalBoard->setContinuousRunMode(false); + // Initialize board. + evalBoard->initialize(); + evalBoard->setDataSource(0, Rhd2000EvalBoard::PortA1); + evalBoard->setDataSource(1, Rhd2000EvalBoard::PortB1); + evalBoard->setContinuousRunMode(false); - numChannelsPerDataStream.add(32); - numChannelsPerDataStream.add(32); + numChannelsPerDataStream.add(32); + numChannelsPerDataStream.add(32); - numChannels = 64; + numChannels = 64; - // Select per-channel amplifier sampling rate. - evalBoard->setSampleRate(Rhd2000EvalBoard::SampleRate10000Hz); + // Select per-channel amplifier sampling rate. + evalBoard->setSampleRate(Rhd2000EvalBoard::SampleRate10000Hz); - // Now that we have set our sampling rate, we can set the MISO sampling delay - // which is dependent on the sample rate. We assume a 3-foot cable. - evalBoard->setCableLengthFeet(Rhd2000EvalBoard::PortA, 3.0); - evalBoard->setCableLengthFeet(Rhd2000EvalBoard::PortB, 3.0); + // Now that we have set our sampling rate, we can set the MISO sampling delay + // which is dependent on the sample rate. We assume a 3-foot cable. + evalBoard->setCableLengthFeet(Rhd2000EvalBoard::PortA, 3.0); + evalBoard->setCableLengthFeet(Rhd2000EvalBoard::PortB, 3.0); - // Let's turn one LED on to indicate that the program is running. - int ledArray[8] = {1, 0, 0, 0, 0, 0, 0, 0}; - evalBoard->setLedDisplay(ledArray); + // Let's turn one LED on to indicate that the program is running. + int ledArray[8] = {1, 0, 0, 0, 0, 0, 0, 0}; + evalBoard->setLedDisplay(ledArray); - // Set up an RHD2000 register object using this sample rate to optimize MUX-related - // register settings. - chipRegisters = new Rhd2000Registers(evalBoard->getSampleRate()); + // Set up an RHD2000 register object using this sample rate to optimize MUX-related + // register settings. + chipRegisters = new Rhd2000Registers(evalBoard->getSampleRate()); - // Before generating register configuration command sequences, set amplifier - // bandwidth paramters. - double dspCutoffFreq; - dspCutoffFreq = chipRegisters->setDspCutoffFreq(10.0); - cout << "Actual DSP cutoff frequency: " << dspCutoffFreq << " Hz" << endl; + // Before generating register configuration command sequences, set amplifier + // bandwidth paramters. + double dspCutoffFreq; + dspCutoffFreq = chipRegisters->setDspCutoffFreq(10.0); + cout << "Actual DSP cutoff frequency: " << dspCutoffFreq << " Hz" << endl; - chipRegisters->setLowerBandwidth(1.0); - chipRegisters->setUpperBandwidth(7500.0); + chipRegisters->setLowerBandwidth(1.0); + chipRegisters->setUpperBandwidth(7500.0); - dataBlock = new Rhd2000DataBlock(evalBoard->getNumEnabledDataStreams()); + dataBlock = new Rhd2000DataBlock(evalBoard->getNumEnabledDataStreams()); - dataBuffer = new DataBuffer(numChannels, 10000); + dataBuffer = new DataBuffer(numChannels, 10000); - } + } } -RHD2000Thread::~RHD2000Thread() { - - std::cout << "RHD2000 interface destroyed." << std::endl; +RHD2000Thread::~RHD2000Thread() +{ + + std::cout << "RHD2000 interface destroyed." << std::endl; - if (deviceFound) - { - int ledArray[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - evalBoard->setLedDisplay(ledArray); - } + if (deviceFound) + { + int ledArray[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + evalBoard->setLedDisplay(ledArray); + } } int RHD2000Thread::getNumChannels() { - return numChannels; + return numChannels; } int RHD2000Thread::getNumEventChannels() @@ -114,27 +117,27 @@ int RHD2000Thread::getNumEventChannels() float RHD2000Thread::getSampleRate() { - return 10000.00; + return 10000.00; } float RHD2000Thread::getBitVolts() { - return 0.1907; + return 0.1907; } bool RHD2000Thread::foundInputSource() { - return deviceFound; + return deviceFound; } bool RHD2000Thread::startAcquisition() { - //memset(filter_states,0,256*sizeof(double)); + //memset(filter_states,0,256*sizeof(double)); - int ledArray[8] = {1, 1, 0, 0, 0, 0, 0, 0}; + int ledArray[8] = {1, 1, 0, 0, 0, 0, 0, 0}; evalBoard->setLedDisplay(ledArray); cout << "Number of 16-bit words in FIFO: " << evalBoard->numWordsInFifo() << endl; @@ -146,40 +149,41 @@ bool RHD2000Thread::startAcquisition() evalBoard->flush(); - std::cout << "Setting max timestep." << std::endl; + //std::cout << "Setting max timestep." << std::endl; //evalBoard->setMaxTimeStep(100); - evalBoard->setContinuousRunMode(true); + evalBoard->setContinuousRunMode(true); - std::cout << "Starting acquisition." << std::endl; - evalBoard->run(); + std::cout << "Starting acquisition." << std::endl; + evalBoard->run(); - blockSize = dataBlock->calculateDataBlockSizeInWords(evalBoard->getNumEnabledDataStreams()); + blockSize = dataBlock->calculateDataBlockSizeInWords(evalBoard->getNumEnabledDataStreams()); startThread(); - // isTransmitting = true; - // accumulator = 0; + // isTransmitting = true; + // accumulator = 0; - return true; + return true; } bool RHD2000Thread::stopAcquisition() { -// isTransmitting = false; - std::cout << "RHD2000 data thread stopping acquisition." << std::endl; + // isTransmitting = false; + std::cout << "RHD2000 data thread stopping acquisition." << std::endl; - if (isThreadRunning()) { + if (isThreadRunning()) + { signalThreadShouldExit(); } - evalBoard->setContinuousRunMode(false); - evalBoard->setMaxTimeStep(0); + evalBoard->setContinuousRunMode(false); + evalBoard->setMaxTimeStep(0); - cout << "Number of 16-bit words in FIFO: " << evalBoard->numWordsInFifo() << endl; + cout << "Number of 16-bit words in FIFO: " << evalBoard->numWordsInFifo() << endl; - std::cout << "Stopped eval board." << std::endl; + std::cout << "Stopped eval board." << std::endl; int ledArray[8] = {1, 0, 0, 0, 0, 0, 0, 0}; @@ -191,44 +195,44 @@ bool RHD2000Thread::stopAcquisition() bool RHD2000Thread::updateBuffer() { - //cout << "Number of 16-bit words in FIFO: " << evalBoard->numWordsInFifo() << endl; - //cout << "Block size: " << blockSize << endl; + //cout << "Number of 16-bit words in FIFO: " << evalBoard->numWordsInFifo() << endl; + //cout << "Block size: " << blockSize << endl; - bool return_code; + bool return_code; - for (int n = 0; n < 10; n++) - { - if (evalBoard->numWordsInFifo() >= blockSize) - { + for (int n = 0; n < 10; n++) + { + if (evalBoard->numWordsInFifo() >= blockSize) + { - return_code = evalBoard->readDataBlock(dataBlock); + return_code = evalBoard->readDataBlock(dataBlock); - for (int samp = 0; samp < dataBlock->getSamplesPerDataBlock(); samp++) - { + for (int samp = 0; samp < dataBlock->getSamplesPerDataBlock(); samp++) + { - for (int dataStream = 0; dataStream < 1; dataStream++) - { + for (int dataStream = 0; dataStream < 1; dataStream++) + { - for (int chan = 0; chan < numChannelsPerDataStream[dataStream]; chan++) - { + for (int chan = 0; chan < numChannelsPerDataStream[dataStream]; chan++) + { - int value = dataBlock->amplifierData[dataStream][chan][samp]; + int value = dataBlock->amplifierData[dataStream][chan][samp]; - thisSample[chan] = float(value-32768)*0.195f; - } + thisSample[chan] = float(value-32768)*0.195f; + } - } + } - timestamp = dataBlock->timeStamp[samp]; - eventCode = dataBlock->ttlIn[samp]; + timestamp = dataBlock->timeStamp[samp]; + eventCode = dataBlock->ttlIn[samp]; - dataBuffer->addToBuffer(thisSample, ×tamp, &eventCode, 1); - } + dataBuffer->addToBuffer(thisSample, ×tamp, &eventCode, 1); + } + + } + } - } - } - - return true; + return true; } \ No newline at end of file diff --git a/Source/Processors/DataThreads/RHD2000Thread.h b/Source/Processors/DataThreads/RHD2000Thread.h index 306502f2bdbec4356489de7c5fc128bcbadf1179..40859a4e3ebcaa092fbab634c8b5032c15c781eb 100644 --- a/Source/Processors/DataThreads/RHD2000Thread.h +++ b/Source/Processors/DataThreads/RHD2000Thread.h @@ -20,15 +20,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ - + #ifndef __RHD2000THREAD_H_2C4CBD67__ #define __RHD2000THREAD_H_2C4CBD67__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include <stdio.h> @@ -45,7 +42,7 @@ class SourceNode; /** - + Communicates with the RHD2000 Evaluation Board from Intan Technologies @see DataThread, SourceNode @@ -56,37 +53,37 @@ class RHD2000Thread : public DataThread { public: - RHD2000Thread(SourceNode* sn); - ~RHD2000Thread(); - - bool foundInputSource(); - int getNumChannels(); - float getSampleRate(); - float getBitVolts(); - + RHD2000Thread(SourceNode* sn); + ~RHD2000Thread(); + + bool foundInputSource(); + int getNumChannels(); + float getSampleRate(); + float getBitVolts(); + int getNumEventChannels(); private: - ScopedPointer<Rhd2000EvalBoard> evalBoard; - ScopedPointer<Rhd2000Registers> chipRegisters; - ScopedPointer<Rhd2000DataBlock> dataBlock; + ScopedPointer<Rhd2000EvalBoard> evalBoard; + ScopedPointer<Rhd2000Registers> chipRegisters; + ScopedPointer<Rhd2000DataBlock> dataBlock; + + Array<int> numChannelsPerDataStream; - Array<int> numChannelsPerDataStream; + int numChannels; + bool deviceFound; - int numChannels; - bool deviceFound; + float thisSample[256]; - float thisSample[256]; + int blockSize; - int blockSize; + bool startAcquisition(); + bool stopAcquisition(); - bool startAcquisition(); - bool stopAcquisition(); + bool updateBuffer(); - bool updateBuffer(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RHD2000Thread); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RHD2000Thread); }; #endif // __RHD2000THREAD_H_2C4CBD67__ diff --git a/Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.cpp b/Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.cpp index ede3f6d0bdf5789879a718f7420ede20a9d2079e..45b7e186c2ae70720042a103339727282b2806cb 100755 --- a/Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.cpp +++ b/Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.cpp @@ -1,13 +1,13 @@ //------------------------------------------------------------------------ // okFrontPanelDLL.c/cpp // -// This is the import source for the FrontPanel API DLL. If you are +// This is the import source for the FrontPanel API DLL. If you are // building an application using the DLL, this source should be included // within your C++/C project. It includes methods that will // automatically load the DLL and map function calls to the DLL entry // points. // -// This library is not necessary when you call the DLL methods from +// This library is not necessary when you call the DLL methods from // another application or language such as LabVIEW or VisualBasic. // // This methods in this DLL correspond closely with the C++ API. @@ -35,57 +35,58 @@ #include "okFrontPanelDLL.h" #if defined(_WIN32) - #include "windows.h" - #if !defined(okLIB_NAME) - #if defined(_UNICODE) - #define okLIB_NAME L"okFrontPanel.dll" - #else - #define okLIB_NAME "okFrontPanel.dll" - #endif - #endif +#include "windows.h" +#if !defined(okLIB_NAME) +#if defined(_UNICODE) +#define okLIB_NAME L"okFrontPanel.dll" +#else +#define okLIB_NAME "okFrontPanel.dll" +#endif +#endif #elif defined(__APPLE__) - #include <dlfcn.h> - #define okLIB_NAME "libokFrontPanel.dylib" +#include <dlfcn.h> +#define okLIB_NAME "libokFrontPanel.dylib" #elif defined(__linux__) - #include <dlfcn.h> - #define okLIB_NAME "./libokFrontPanel.so" +#include <dlfcn.h> +#define okLIB_NAME "./libokFrontPanel.so" #elif defined(__QNX__) - #include <dlfcn.h> - #define okLIB_NAME "./libokFrontPanel.so.1" +#include <dlfcn.h> +#define okLIB_NAME "./libokFrontPanel.so.1" #endif typedef void DLL; -static DLL *hLib = NULL; +static DLL* hLib = NULL; static char VERSION_STRING[32]; static DLL_EP -dll_entrypoint(DLL *dll, const char *name) +dll_entrypoint(DLL* dll, const char* name) { #if defined(_WIN32) - FARPROC proc; - proc = GetProcAddress((HMODULE) dll, (LPCSTR) name); - if (NULL == proc) { - printf( "Failed to load %s. Error code %d\n", name, GetLastError() ); - } - return((DLL_EP)proc); + FARPROC proc; + proc = GetProcAddress((HMODULE) dll, (LPCSTR) name); + if (NULL == proc) + { + printf("Failed to load %s. Error code %d\n", name, GetLastError()); + } + return((DLL_EP)proc); #else - void *handle = (void *)dll; - DLL_EP ep; - ep = (DLL_EP)dlsym(handle, name); - return( (dlerror()==0) ? (ep) : ((DLL_EP)NULL) ); + void* handle = (void*)dll; + DLL_EP ep; + ep = (DLL_EP)dlsym(handle, name); + return((dlerror()==0) ? (ep) : ((DLL_EP)NULL)); #endif -} +} #if defined(_WIN32) && defined(_UNICODE) -static DLL * +static DLL* dll_load(okFP_dll_pchar libname) { - return((DLL *) LoadLibraryW(libname)); + return((DLL*) LoadLibraryW(libname)); } #elif defined(_WIN32) -static DLL * +static DLL* dll_load(okFP_dll_pchar libname) { // Changed by Intan Technologies to resolve ANSI vs UNICODE problems with LoadLibrary function, 11/14/12 @@ -94,32 +95,32 @@ dll_load(okFP_dll_pchar libname) //mbstowcs_s(&pReturnValue, dest, 32767, libname, 32767); //return((DLL *) LoadLibraryW(dest)); - return((DLL *) LoadLibraryA(libname)); + return((DLL*) LoadLibraryA(libname)); - return((DLL *) LoadLibraryA(libname)); // This was the original code from Opal Kelly + return((DLL*) LoadLibraryA(libname)); // This was the original code from Opal Kelly } #else -static DLL * +static DLL* dll_load(okFP_dll_pchar libname) { - DLL *dll; - dll = dlopen(libname, RTLD_NOW); - if (!dll) - printf("%s\n", (char *)dlerror()); - return(dll); + DLL* dll; + dll = dlopen(libname, RTLD_NOW); + if (!dll) + printf("%s\n", (char*)dlerror()); + return(dll); } #endif static void -dll_unload(DLL *dll) +dll_unload(DLL* dll) { #if defined(_WIN32) - HINSTANCE hInst = (HINSTANCE) dll; - FreeLibrary(hInst); + HINSTANCE hInst = (HINSTANCE) dll; + FreeLibrary(hInst); #else - void *handle = (void *)dll; - dlclose(handle); + void* handle = (void*)dll; + dlclose(handle); #endif } @@ -131,244 +132,448 @@ dll_unload(DLL *dll) // okCPLL22150 C++ wrapper class //------------------------------------------------------------------------ bool okCPLL22150::to_bool(Bool x) - { return( (x==TRUE)?(true):(false) ); } +{ + return((x==TRUE)?(true):(false)); +} Bool okCPLL22150::from_bool(bool x) - { return( (x==true)?(TRUE):(FALSE) ); } +{ + return((x==true)?(TRUE):(FALSE)); +} okCPLL22150::okCPLL22150() - { h=okPLL22150_Construct(); } +{ + h=okPLL22150_Construct(); +} void okCPLL22150::SetCrystalLoad(double capload) - { okPLL22150_SetCrystalLoad(h, capload); } +{ + okPLL22150_SetCrystalLoad(h, capload); +} void okCPLL22150::SetReference(double freq, bool extosc) - { okPLL22150_SetReference(h, freq, from_bool(extosc)); } +{ + okPLL22150_SetReference(h, freq, from_bool(extosc)); +} double okCPLL22150::GetReference() - { return(okPLL22150_GetReference(h)); } +{ + return(okPLL22150_GetReference(h)); +} bool okCPLL22150::SetVCOParameters(int p, int q) - { return(to_bool(okPLL22150_SetVCOParameters(h,p,q))); } +{ + return(to_bool(okPLL22150_SetVCOParameters(h,p,q))); +} int okCPLL22150::GetVCOP() - { return(okPLL22150_GetVCOP(h)); } +{ + return(okPLL22150_GetVCOP(h)); +} int okCPLL22150::GetVCOQ() - { return(okPLL22150_GetVCOQ(h)); } +{ + return(okPLL22150_GetVCOQ(h)); +} double okCPLL22150::GetVCOFrequency() - { return(okPLL22150_GetVCOFrequency(h)); } +{ + return(okPLL22150_GetVCOFrequency(h)); +} void okCPLL22150::SetDiv1(DividerSource divsrc, int n) - { okPLL22150_SetDiv1(h, (ok_DividerSource)divsrc, n); } +{ + okPLL22150_SetDiv1(h, (ok_DividerSource)divsrc, n); +} void okCPLL22150::SetDiv2(DividerSource divsrc, int n) - { okPLL22150_SetDiv2(h, (ok_DividerSource)divsrc, n); } +{ + okPLL22150_SetDiv2(h, (ok_DividerSource)divsrc, n); +} okCPLL22150::DividerSource okCPLL22150::GetDiv1Source() - { return((DividerSource) okPLL22150_GetDiv1Source(h)); } +{ + return((DividerSource) okPLL22150_GetDiv1Source(h)); +} okCPLL22150::DividerSource okCPLL22150::GetDiv2Source() - { return((DividerSource) okPLL22150_GetDiv2Source(h)); } +{ + return((DividerSource) okPLL22150_GetDiv2Source(h)); +} int okCPLL22150::GetDiv1Divider() - { return(okPLL22150_GetDiv1Divider(h)); } +{ + return(okPLL22150_GetDiv1Divider(h)); +} int okCPLL22150::GetDiv2Divider() - { return(okPLL22150_GetDiv2Divider(h)); } +{ + return(okPLL22150_GetDiv2Divider(h)); +} void okCPLL22150::SetOutputSource(int output, okCPLL22150::ClockSource clksrc) - { okPLL22150_SetOutputSource(h, output, (ok_ClockSource_22150)clksrc); } +{ + okPLL22150_SetOutputSource(h, output, (ok_ClockSource_22150)clksrc); +} void okCPLL22150::SetOutputEnable(int output, bool enable) - { okPLL22150_SetOutputEnable(h, output, to_bool(enable)); } +{ + okPLL22150_SetOutputEnable(h, output, to_bool(enable)); +} okCPLL22150::ClockSource okCPLL22150::GetOutputSource(int output) - { return( (ClockSource)okPLL22150_GetOutputSource(h, output)); } +{ + return((ClockSource)okPLL22150_GetOutputSource(h, output)); +} double okCPLL22150::GetOutputFrequency(int output) - { return(okPLL22150_GetOutputFrequency(h, output)); } +{ + return(okPLL22150_GetOutputFrequency(h, output)); +} bool okCPLL22150::IsOutputEnabled(int output) - { return(to_bool(okPLL22150_IsOutputEnabled(h, output))); } -void okCPLL22150::InitFromProgrammingInfo(unsigned char *buf) - { okPLL22150_InitFromProgrammingInfo(h, buf); } -void okCPLL22150::GetProgrammingInfo(unsigned char *buf) - { okPLL22150_GetProgrammingInfo(h, buf); } +{ + return(to_bool(okPLL22150_IsOutputEnabled(h, output))); +} +void okCPLL22150::InitFromProgrammingInfo(unsigned char* buf) +{ + okPLL22150_InitFromProgrammingInfo(h, buf); +} +void okCPLL22150::GetProgrammingInfo(unsigned char* buf) +{ + okPLL22150_GetProgrammingInfo(h, buf); +} //------------------------------------------------------------------------ // okCPLL22393 C++ wrapper class //------------------------------------------------------------------------ bool okCPLL22393::to_bool(Bool x) - { return( (x==TRUE)?(true):(false) ); } +{ + return((x==TRUE)?(true):(false)); +} Bool okCPLL22393::from_bool(bool x) - { return( (x==true)?(TRUE):(FALSE) ); } +{ + return((x==true)?(TRUE):(FALSE)); +} okCPLL22393::okCPLL22393() - { h=okPLL22393_Construct(); } +{ + h=okPLL22393_Construct(); +} void okCPLL22393::SetCrystalLoad(double capload) - { okPLL22393_SetCrystalLoad(h, capload); } +{ + okPLL22393_SetCrystalLoad(h, capload); +} void okCPLL22393::SetReference(double freq) - { okPLL22393_SetReference(h, freq); } +{ + okPLL22393_SetReference(h, freq); +} double okCPLL22393::GetReference() - { return(okPLL22393_GetReference(h)); } +{ + return(okPLL22393_GetReference(h)); +} bool okCPLL22393::SetPLLParameters(int n, int p, int q, bool enable) - { return(to_bool(okPLL22393_SetPLLParameters(h, n, p, q, from_bool(enable)))); } +{ + return(to_bool(okPLL22393_SetPLLParameters(h, n, p, q, from_bool(enable)))); +} bool okCPLL22393::SetPLLLF(int n, int lf) - { return(to_bool(okPLL22393_SetPLLLF(h, n, lf))); } +{ + return(to_bool(okPLL22393_SetPLLLF(h, n, lf))); +} bool okCPLL22393::SetOutputDivider(int n, int div) - { return(to_bool(okPLL22393_SetOutputDivider(h, n, div))); } +{ + return(to_bool(okPLL22393_SetOutputDivider(h, n, div))); +} bool okCPLL22393::SetOutputSource(int n, okCPLL22393::ClockSource clksrc) - { return(to_bool(okPLL22393_SetOutputSource(h, n, (ok_ClockSource_22393)clksrc))); } +{ + return(to_bool(okPLL22393_SetOutputSource(h, n, (ok_ClockSource_22393)clksrc))); +} void okCPLL22393::SetOutputEnable(int n, bool enable) - { okPLL22393_SetOutputEnable(h, n, from_bool(enable)); } +{ + okPLL22393_SetOutputEnable(h, n, from_bool(enable)); +} int okCPLL22393::GetPLLP(int n) - { return(okPLL22393_GetPLLP(h, n)); } +{ + return(okPLL22393_GetPLLP(h, n)); +} int okCPLL22393::GetPLLQ(int n) - { return(okPLL22393_GetPLLQ(h, n)); } +{ + return(okPLL22393_GetPLLQ(h, n)); +} double okCPLL22393::GetPLLFrequency(int n) - { return(okPLL22393_GetPLLFrequency(h, n)); } +{ + return(okPLL22393_GetPLLFrequency(h, n)); +} int okCPLL22393::GetOutputDivider(int n) - { return(okPLL22393_GetOutputDivider(h, n)); } +{ + return(okPLL22393_GetOutputDivider(h, n)); +} okCPLL22393::ClockSource okCPLL22393::GetOutputSource(int n) - { return((ClockSource) okPLL22393_GetOutputSource(h, n)); } +{ + return((ClockSource) okPLL22393_GetOutputSource(h, n)); +} double okCPLL22393::GetOutputFrequency(int n) - { return(okPLL22393_GetOutputFrequency(h, n)); } +{ + return(okPLL22393_GetOutputFrequency(h, n)); +} bool okCPLL22393::IsOutputEnabled(int n) - { return(to_bool(okPLL22393_IsOutputEnabled(h, n))); } +{ + return(to_bool(okPLL22393_IsOutputEnabled(h, n))); +} bool okCPLL22393::IsPLLEnabled(int n) - { return(to_bool(okPLL22393_IsPLLEnabled(h, n))); } -void okCPLL22393::InitFromProgrammingInfo(unsigned char *buf) - { okPLL22393_InitFromProgrammingInfo(h, buf); } -void okCPLL22393::GetProgrammingInfo(unsigned char *buf) - { okPLL22393_GetProgrammingInfo(h, buf); } +{ + return(to_bool(okPLL22393_IsPLLEnabled(h, n))); +} +void okCPLL22393::InitFromProgrammingInfo(unsigned char* buf) +{ + okPLL22393_InitFromProgrammingInfo(h, buf); +} +void okCPLL22393::GetProgrammingInfo(unsigned char* buf) +{ + okPLL22393_GetProgrammingInfo(h, buf); +} //------------------------------------------------------------------------ // okCFrontPanel C++ wrapper class //------------------------------------------------------------------------ bool okCFrontPanel::to_bool(Bool x) - { return( (x==TRUE)?(true):(false) ); } +{ + return((x==TRUE)?(true):(false)); +} Bool okCFrontPanel::from_bool(bool x) - { return( (x==true)?(TRUE):(FALSE) ); } +{ + return((x==true)?(TRUE):(FALSE)); +} okCFrontPanel::okCFrontPanel() - { h=okFrontPanel_Construct(); } +{ + h=okFrontPanel_Construct(); +} okCFrontPanel::~okCFrontPanel() - { okFrontPanel_Destruct(h); } +{ + okFrontPanel_Destruct(h); +} int okCFrontPanel::GetHostInterfaceWidth() - { return(okFrontPanel_GetHostInterfaceWidth(h)); } +{ + return(okFrontPanel_GetHostInterfaceWidth(h)); +} bool okCFrontPanel::IsHighSpeed() - { return(to_bool(okFrontPanel_IsHighSpeed(h))); } +{ + return(to_bool(okFrontPanel_IsHighSpeed(h))); +} okCFrontPanel::BoardModel okCFrontPanel::GetBoardModel() - { return((okCFrontPanel::BoardModel)okFrontPanel_GetBoardModel(h)); } +{ + return((okCFrontPanel::BoardModel)okFrontPanel_GetBoardModel(h)); +} std::string okCFrontPanel::GetBoardModelString(okCFrontPanel::BoardModel m) - { - char str[MAX_BOARDMODELSTRING_LENGTH]; - okFrontPanel_GetBoardModelString(h, (ok_BoardModel)m, str); - return(std::string(str)); - } +{ + char str[MAX_BOARDMODELSTRING_LENGTH]; + okFrontPanel_GetBoardModelString(h, (ok_BoardModel)m, str); + return(std::string(str)); +} int okCFrontPanel::GetDeviceCount() - { return(okFrontPanel_GetDeviceCount(h)); } +{ + return(okFrontPanel_GetDeviceCount(h)); +} okCFrontPanel::BoardModel okCFrontPanel::GetDeviceListModel(int num) - { return((okCFrontPanel::BoardModel)okFrontPanel_GetDeviceListModel(h, num)); } +{ + return((okCFrontPanel::BoardModel)okFrontPanel_GetDeviceListModel(h, num)); +} std::string okCFrontPanel::GetDeviceListSerial(int num) - { - char str[MAX_SERIALNUMBER_LENGTH+1]; - okFrontPanel_GetDeviceListSerial(h, num, str); - str[MAX_SERIALNUMBER_LENGTH] = '\0'; - return(std::string(str)); - } -okCFrontPanel::ErrorCode okCFrontPanel::GetDeviceInfo(okTDeviceInfo *info) - { return((okCFrontPanel::ErrorCode) okFrontPanel_GetDeviceInfo(h, info)); } +{ + char str[MAX_SERIALNUMBER_LENGTH+1]; + okFrontPanel_GetDeviceListSerial(h, num, str); + str[MAX_SERIALNUMBER_LENGTH] = '\0'; + return(std::string(str)); +} +okCFrontPanel::ErrorCode okCFrontPanel::GetDeviceInfo(okTDeviceInfo* info) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_GetDeviceInfo(h, info)); +} void okCFrontPanel::EnableAsynchronousTransfers(bool enable) - { okFrontPanel_EnableAsynchronousTransfers(h, to_bool(enable)); } +{ + okFrontPanel_EnableAsynchronousTransfers(h, to_bool(enable)); +} okCFrontPanel::ErrorCode okCFrontPanel::OpenBySerial(std::string str) - { return((okCFrontPanel::ErrorCode) okFrontPanel_OpenBySerial(h, str.c_str())); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_OpenBySerial(h, str.c_str())); +} bool okCFrontPanel::IsOpen() - { return(to_bool(okFrontPanel_IsOpen(h))); } +{ + return(to_bool(okFrontPanel_IsOpen(h))); +} int okCFrontPanel::GetDeviceMajorVersion() - { return(okFrontPanel_GetDeviceMajorVersion(h)); } +{ + return(okFrontPanel_GetDeviceMajorVersion(h)); +} int okCFrontPanel::GetDeviceMinorVersion() - { return(okFrontPanel_GetDeviceMinorVersion(h)); } +{ + return(okFrontPanel_GetDeviceMinorVersion(h)); +} std::string okCFrontPanel::GetSerialNumber() - { - char str[MAX_SERIALNUMBER_LENGTH+1]; - okFrontPanel_GetSerialNumber(h, str); - return(std::string(str)); - } +{ + char str[MAX_SERIALNUMBER_LENGTH+1]; + okFrontPanel_GetSerialNumber(h, str); + return(std::string(str)); +} std::string okCFrontPanel::GetDeviceID() - { - char str[MAX_DEVICEID_LENGTH+1]; - okFrontPanel_GetDeviceID(h, str); - return(std::string(str)); - } +{ + char str[MAX_DEVICEID_LENGTH+1]; + okFrontPanel_GetDeviceID(h, str); + return(std::string(str)); +} void okCFrontPanel::SetDeviceID(const std::string str) - { okFrontPanel_SetDeviceID(h, str.c_str()); } +{ + okFrontPanel_SetDeviceID(h, str.c_str()); +} okCFrontPanel::ErrorCode okCFrontPanel::SetBTPipePollingInterval(int interval) - { return((okCFrontPanel::ErrorCode) okFrontPanel_SetBTPipePollingInterval(h, interval)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_SetBTPipePollingInterval(h, interval)); +} void okCFrontPanel::SetTimeout(int timeout) - { okFrontPanel_SetTimeout(h, timeout); } +{ + okFrontPanel_SetTimeout(h, timeout); +} okCFrontPanel::ErrorCode okCFrontPanel::ResetFPGA() - { return((okCFrontPanel::ErrorCode) okFrontPanel_ResetFPGA(h)); } -okCFrontPanel::ErrorCode okCFrontPanel::ConfigureFPGAFromMemory(unsigned char *data, const unsigned long length, void(*callback)(int, int, void *), void *arg) - { return((okCFrontPanel::ErrorCode) okFrontPanel_ConfigureFPGAFromMemory(h, data, length)); } -okCFrontPanel::ErrorCode okCFrontPanel::ConfigureFPGA(const std::string strFilename, void (*callback)(int, int, void *), void *arg) - { return((okCFrontPanel::ErrorCode) okFrontPanel_ConfigureFPGA(h, strFilename.c_str())); } -okCFrontPanel::ErrorCode okCFrontPanel::GetFPGABootResetProfile(okTFPGAResetProfile *profile) - { return((okCFrontPanel::ErrorCode) okFrontPanel_GetFPGABootResetProfile(h, profile)); } -okCFrontPanel::ErrorCode okCFrontPanel::GetFPGAJTAGResetProfile(okTFPGAResetProfile *profile) - { return((okCFrontPanel::ErrorCode) okFrontPanel_GetFPGAJTAGResetProfile(h, profile)); } -okCFrontPanel::ErrorCode okCFrontPanel::ReadRegister(UINT32 addr, UINT32 *data) - { return((okCFrontPanel::ErrorCode) okFrontPanel_ReadRegister(h, addr, data)); } -okCFrontPanel::ErrorCode okCFrontPanel::ReadRegisterSet(okTRegisterSet *set) - { return((okCFrontPanel::ErrorCode) okFrontPanel_ReadRegisterSet(h, set)); } -okCFrontPanel::ErrorCode okCFrontPanel::SetFPGABootResetProfile(okTFPGAResetProfile *profile) - { return((okCFrontPanel::ErrorCode) okFrontPanel_SetFPGABootResetProfile(h, profile)); } -okCFrontPanel::ErrorCode okCFrontPanel::SetFPGAJTAGResetProfile(okTFPGAResetProfile *profile) - { return((okCFrontPanel::ErrorCode) okFrontPanel_SetFPGAJTAGResetProfile(h, profile)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_ResetFPGA(h)); +} +okCFrontPanel::ErrorCode okCFrontPanel::ConfigureFPGAFromMemory(unsigned char* data, const unsigned long length, void(*callback)(int, int, void*), void* arg) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_ConfigureFPGAFromMemory(h, data, length)); +} +okCFrontPanel::ErrorCode okCFrontPanel::ConfigureFPGA(const std::string strFilename, void (*callback)(int, int, void*), void* arg) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_ConfigureFPGA(h, strFilename.c_str())); +} +okCFrontPanel::ErrorCode okCFrontPanel::GetFPGABootResetProfile(okTFPGAResetProfile* profile) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_GetFPGABootResetProfile(h, profile)); +} +okCFrontPanel::ErrorCode okCFrontPanel::GetFPGAJTAGResetProfile(okTFPGAResetProfile* profile) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_GetFPGAJTAGResetProfile(h, profile)); +} +okCFrontPanel::ErrorCode okCFrontPanel::ReadRegister(UINT32 addr, UINT32* data) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_ReadRegister(h, addr, data)); +} +okCFrontPanel::ErrorCode okCFrontPanel::ReadRegisterSet(okTRegisterSet* set) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_ReadRegisterSet(h, set)); +} +okCFrontPanel::ErrorCode okCFrontPanel::SetFPGABootResetProfile(okTFPGAResetProfile* profile) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_SetFPGABootResetProfile(h, profile)); +} +okCFrontPanel::ErrorCode okCFrontPanel::SetFPGAJTAGResetProfile(okTFPGAResetProfile* profile) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_SetFPGAJTAGResetProfile(h, profile)); +} okCFrontPanel::ErrorCode okCFrontPanel::FlashEraseSector(UINT32 address) - { return((okCFrontPanel::ErrorCode) okFrontPanel_FlashEraseSector(h, address)); } -okCFrontPanel::ErrorCode okCFrontPanel::FlashWrite(UINT32 address, UINT32 length, const UINT8 *buf) - { return((okCFrontPanel::ErrorCode) okFrontPanel_FlashWrite(h, address, length, buf)); } -okCFrontPanel::ErrorCode okCFrontPanel::FlashRead(UINT32 address, UINT32 length, UINT8 *buf) - { return((okCFrontPanel::ErrorCode) okFrontPanel_FlashRead(h, address, length, buf)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_FlashEraseSector(h, address)); +} +okCFrontPanel::ErrorCode okCFrontPanel::FlashWrite(UINT32 address, UINT32 length, const UINT8* buf) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_FlashWrite(h, address, length, buf)); +} +okCFrontPanel::ErrorCode okCFrontPanel::FlashRead(UINT32 address, UINT32 length, UINT8* buf) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_FlashRead(h, address, length, buf)); +} okCFrontPanel::ErrorCode okCFrontPanel::WriteRegister(UINT32 addr, UINT32 data) - { return((okCFrontPanel::ErrorCode) okFrontPanel_WriteRegister(h, addr, data)); } -okCFrontPanel::ErrorCode okCFrontPanel::WriteRegisterSet(okTRegisterSet *set) - { return((okCFrontPanel::ErrorCode) okFrontPanel_WriteRegisterSet(h, set)); } -okCFrontPanel::ErrorCode okCFrontPanel::GetWireInValue(int epAddr, UINT32 *val) - { return((okCFrontPanel::ErrorCode) okFrontPanel_GetWireInValue(h, epAddr, val)); } -okCFrontPanel::ErrorCode okCFrontPanel::WriteI2C(const int addr, int length, unsigned char *data) - { return((okCFrontPanel::ErrorCode) okFrontPanel_WriteI2C(h, addr, length, data)); } -okCFrontPanel::ErrorCode okCFrontPanel::ReadI2C(const int addr, int length, unsigned char *data) - { return((okCFrontPanel::ErrorCode) okFrontPanel_ReadI2C(h, addr, length, data)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_WriteRegister(h, addr, data)); +} +okCFrontPanel::ErrorCode okCFrontPanel::WriteRegisterSet(okTRegisterSet* set) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_WriteRegisterSet(h, set)); +} +okCFrontPanel::ErrorCode okCFrontPanel::GetWireInValue(int epAddr, UINT32* val) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_GetWireInValue(h, epAddr, val)); +} +okCFrontPanel::ErrorCode okCFrontPanel::WriteI2C(const int addr, int length, unsigned char* data) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_WriteI2C(h, addr, length, data)); +} +okCFrontPanel::ErrorCode okCFrontPanel::ReadI2C(const int addr, int length, unsigned char* data) +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_ReadI2C(h, addr, length, data)); +} okCFrontPanel::ErrorCode okCFrontPanel::GetPLL22150Configuration(okCPLL22150& pll) - { return((okCFrontPanel::ErrorCode) okFrontPanel_GetPLL22150Configuration(h, pll.h)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_GetPLL22150Configuration(h, pll.h)); +} okCFrontPanel::ErrorCode okCFrontPanel::SetPLL22150Configuration(okCPLL22150& pll) - { return((okCFrontPanel::ErrorCode) okFrontPanel_SetPLL22150Configuration(h, pll.h)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_SetPLL22150Configuration(h, pll.h)); +} okCFrontPanel::ErrorCode okCFrontPanel::GetEepromPLL22150Configuration(okCPLL22150& pll) - { return((okCFrontPanel::ErrorCode) okFrontPanel_GetEepromPLL22150Configuration(h, pll.h)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_GetEepromPLL22150Configuration(h, pll.h)); +} okCFrontPanel::ErrorCode okCFrontPanel::SetEepromPLL22150Configuration(okCPLL22150& pll) - { return((okCFrontPanel::ErrorCode) okFrontPanel_SetEepromPLL22150Configuration(h, pll.h)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_SetEepromPLL22150Configuration(h, pll.h)); +} okCFrontPanel::ErrorCode okCFrontPanel::GetPLL22393Configuration(okCPLL22393& pll) - { return((okCFrontPanel::ErrorCode) okFrontPanel_GetPLL22393Configuration(h, pll.h)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_GetPLL22393Configuration(h, pll.h)); +} okCFrontPanel::ErrorCode okCFrontPanel::SetPLL22393Configuration(okCPLL22393& pll) - { return((okCFrontPanel::ErrorCode) okFrontPanel_SetPLL22393Configuration(h, pll.h)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_SetPLL22393Configuration(h, pll.h)); +} okCFrontPanel::ErrorCode okCFrontPanel::GetEepromPLL22393Configuration(okCPLL22393& pll) - { return((okCFrontPanel::ErrorCode) okFrontPanel_GetEepromPLL22393Configuration(h, pll.h)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_GetEepromPLL22393Configuration(h, pll.h)); +} okCFrontPanel::ErrorCode okCFrontPanel::SetEepromPLL22393Configuration(okCPLL22393& pll) - { return((okCFrontPanel::ErrorCode) okFrontPanel_SetEepromPLL22393Configuration(h, pll.h)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_SetEepromPLL22393Configuration(h, pll.h)); +} okCFrontPanel::ErrorCode okCFrontPanel::LoadDefaultPLLConfiguration() - { return((okCFrontPanel::ErrorCode) okFrontPanel_LoadDefaultPLLConfiguration(h)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_LoadDefaultPLLConfiguration(h)); +} bool okCFrontPanel::IsFrontPanelEnabled() - { return(to_bool(okFrontPanel_IsFrontPanelEnabled(h))); } +{ + return(to_bool(okFrontPanel_IsFrontPanelEnabled(h))); +} bool okCFrontPanel::IsFrontPanel3Supported() - { return(to_bool(okFrontPanel_IsFrontPanel3Supported(h))); } +{ + return(to_bool(okFrontPanel_IsFrontPanel3Supported(h))); +} // void UnregisterAll(); // void AddEventHandler(okCEventHandler *handler); void okCFrontPanel::UpdateWireIns() - { okFrontPanel_UpdateWireIns(h); } +{ + okFrontPanel_UpdateWireIns(h); +} okCFrontPanel::ErrorCode okCFrontPanel::SetWireInValue(int ep, unsigned long val, unsigned long mask) - { return((okCFrontPanel::ErrorCode) okFrontPanel_SetWireInValue(h, ep, val, mask)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_SetWireInValue(h, ep, val, mask)); +} void okCFrontPanel::UpdateWireOuts() - { okFrontPanel_UpdateWireOuts(h); } +{ + okFrontPanel_UpdateWireOuts(h); +} unsigned long okCFrontPanel::GetWireOutValue(int epAddr) - { return(okFrontPanel_GetWireOutValue(h, epAddr)); } +{ + return(okFrontPanel_GetWireOutValue(h, epAddr)); +} okCFrontPanel::ErrorCode okCFrontPanel::ActivateTriggerIn(int epAddr, int bit) - { return((okCFrontPanel::ErrorCode) okFrontPanel_ActivateTriggerIn(h, epAddr, bit)); } +{ + return((okCFrontPanel::ErrorCode) okFrontPanel_ActivateTriggerIn(h, epAddr, bit)); +} void okCFrontPanel::UpdateTriggerOuts() - { okFrontPanel_UpdateTriggerOuts(h); } +{ + okFrontPanel_UpdateTriggerOuts(h); +} bool okCFrontPanel::IsTriggered(int epAddr, unsigned long mask) - { return(to_bool(okFrontPanel_IsTriggered(h, epAddr, mask))); } +{ + return(to_bool(okFrontPanel_IsTriggered(h, epAddr, mask))); +} long okCFrontPanel::GetLastTransferLength() - { return(okFrontPanel_GetLastTransferLength(h)); } -long okCFrontPanel::WriteToPipeIn(int epAddr, long length, unsigned char *data) - { return(okFrontPanel_WriteToPipeIn(h, epAddr, length, data)); } -long okCFrontPanel::ReadFromPipeOut(int epAddr, long length, unsigned char *data) - { return(okFrontPanel_ReadFromPipeOut(h, epAddr, length, data)); } -long okCFrontPanel::WriteToBlockPipeIn(int epAddr, int blockSize, long length, unsigned char *data) - { return(okFrontPanel_WriteToBlockPipeIn(h, epAddr, blockSize, length, data)); } -long okCFrontPanel::ReadFromBlockPipeOut(int epAddr, int blockSize, long length, unsigned char *data) - { return(okFrontPanel_ReadFromBlockPipeOut(h, epAddr, blockSize, length, data)); } +{ + return(okFrontPanel_GetLastTransferLength(h)); +} +long okCFrontPanel::WriteToPipeIn(int epAddr, long length, unsigned char* data) +{ + return(okFrontPanel_WriteToPipeIn(h, epAddr, length, data)); +} +long okCFrontPanel::ReadFromPipeOut(int epAddr, long length, unsigned char* data) +{ + return(okFrontPanel_ReadFromPipeOut(h, epAddr, length, data)); +} +long okCFrontPanel::WriteToBlockPipeIn(int epAddr, int blockSize, long length, unsigned char* data) +{ + return(okFrontPanel_WriteToBlockPipeIn(h, epAddr, blockSize, length, data)); +} +long okCFrontPanel::ReadFromBlockPipeOut(int epAddr, int blockSize, long length, unsigned char* data) +{ + return(okFrontPanel_ReadFromBlockPipeOut(h, epAddr, blockSize, length, data)); +} #endif // __cplusplus @@ -376,112 +581,112 @@ long okCFrontPanel::ReadFromBlockPipeOut(int epAddr, int blockSize, long length, //------------------------------------------------------------------------ // Function prototypes //------------------------------------------------------------------------ -typedef void (DLL_ENTRY *OKFRONTPANELDLL_GETVERSION_FN) (char *, char *); - -typedef okPLL22150_HANDLE (DLL_ENTRY *OKPLL22150_CONSTRUCT_FN) (void); -typedef void (DLL_ENTRY *OKPLL22150_DESTRUCT_FN) (okPLL22150_HANDLE); -typedef void (DLL_ENTRY *OKPLL22150_SETCRYSTALLOAD_FN) (okPLL22150_HANDLE, double); -typedef void (DLL_ENTRY *OKPLL22150_SETREFERENCE_FN) (okPLL22150_HANDLE, double, Bool); -typedef double (DLL_ENTRY *OKPLL22150_GETREFERENCE_FN) (okPLL22150_HANDLE); -typedef Bool (DLL_ENTRY *OKPLL22150_SETVCOPARAMETERS_FN) (okPLL22150_HANDLE, int, int); -typedef int (DLL_ENTRY *OKPLL22150_GETVCOP_FN) (okPLL22150_HANDLE); -typedef int (DLL_ENTRY *OKPLL22150_GETVCOQ_FN) (okPLL22150_HANDLE); -typedef double (DLL_ENTRY *OKPLL22150_GETVCOFREQUENCY_FN) (okPLL22150_HANDLE); -typedef void (DLL_ENTRY *OKPLL22150_SETDIV1_FN) (okPLL22150_HANDLE, ok_DividerSource, int); -typedef void (DLL_ENTRY *OKPLL22150_SETDIV2_FN) (okPLL22150_HANDLE, ok_DividerSource, int); -typedef ok_DividerSource (DLL_ENTRY *OKPLL22150_GETDIV1SOURCE_FN) (okPLL22150_HANDLE); -typedef ok_DividerSource (DLL_ENTRY *OKPLL22150_GETDIV2SOURCE_FN) (okPLL22150_HANDLE); -typedef int (DLL_ENTRY *OKPLL22150_GETDIV1DIVIDER_FN) (okPLL22150_HANDLE); -typedef int (DLL_ENTRY *OKPLL22150_GETDIV2DIVIDER_FN) (okPLL22150_HANDLE); -typedef void (DLL_ENTRY *OKPLL22150_SETOUTPUTSOURCE_FN) (okPLL22150_HANDLE, int, ok_ClockSource_22150); -typedef void (DLL_ENTRY *OKPLL22150_SETOUTPUTENABLE_FN) (okPLL22150_HANDLE, int, Bool); -typedef ok_ClockSource_22150 (DLL_ENTRY *OKPLL22150_GETOUTPUTSOURCE_FN) (okPLL22150_HANDLE, int); -typedef double (DLL_ENTRY *OKPLL22150_GETOUTPUTFREQUENCY_FN) (okPLL22150_HANDLE, int); -typedef Bool (DLL_ENTRY *OKPLL22150_ISOUTPUTENABLED_FN) (okPLL22150_HANDLE, int); -typedef void (DLL_ENTRY *OKPLL22150_INITFROMPROGRAMMINGINFO_FN) (okPLL22150_HANDLE, unsigned char *); -typedef void (DLL_ENTRY *OKPLL22150_GETPROGRAMMINGINFO_FN) (okPLL22150_HANDLE, unsigned char *); - -typedef okPLL22393_HANDLE (DLL_ENTRY *OKPLL22393_CONSTRUCT_FN) (void); -typedef void (DLL_ENTRY *OKPLL22393_DESTRUCT_FN) (okPLL22393_HANDLE); -typedef void (DLL_ENTRY *OKPLL22393_SETCRYSTALLOAD_FN) (okPLL22393_HANDLE, double); -typedef void (DLL_ENTRY *OKPLL22393_SETREFERENCE_FN) (okPLL22393_HANDLE, double); -typedef double (DLL_ENTRY *OKPLL22393_GETREFERENCE_FN) (okPLL22393_HANDLE); -typedef Bool (DLL_ENTRY *OKPLL22393_SETPLLPARAMETERS_FN) (okPLL22393_HANDLE, int, int, int, Bool); -typedef Bool (DLL_ENTRY *OKPLL22393_SETPLLLF_FN) (okPLL22393_HANDLE, int, int); -typedef Bool (DLL_ENTRY *OKPLL22393_SETOUTPUTDIVIDER_FN) (okPLL22393_HANDLE, int, int); -typedef Bool (DLL_ENTRY *OKPLL22393_SETOUTPUTSOURCE_FN) (okPLL22393_HANDLE, int, ok_ClockSource_22393); -typedef void (DLL_ENTRY *OKPLL22393_SETOUTPUTENABLE_FN) (okPLL22393_HANDLE, int, Bool); -typedef int (DLL_ENTRY *OKPLL22393_GETPLLP_FN) (okPLL22393_HANDLE, int); -typedef int (DLL_ENTRY *OKPLL22393_GETPLLQ_FN) (okPLL22393_HANDLE, int); -typedef double (DLL_ENTRY *OKPLL22393_GETPLLFREQUENCY_FN) (okPLL22393_HANDLE, int); -typedef int (DLL_ENTRY *OKPLL22393_GETOUTPUTDIVIDER_FN) (okPLL22393_HANDLE, int); -typedef ok_ClockSource_22393 (DLL_ENTRY *OKPLL22393_GETOUTPUTSOURCE_FN) (okPLL22393_HANDLE, int); -typedef double (DLL_ENTRY *OKPLL22393_GETOUTPUTFREQUENCY_FN) (okPLL22393_HANDLE, int); -typedef Bool (DLL_ENTRY *OKPLL22393_ISOUTPUTENABLED_FN) (okPLL22393_HANDLE, int); -typedef Bool (DLL_ENTRY *OKPLL22393_ISPLLENABLED_FN) (okPLL22393_HANDLE, int); -typedef void (DLL_ENTRY *OKPLL22393_INITFROMPROGRAMMINGINFO_FN) (okPLL22393_HANDLE, unsigned char *); -typedef void (DLL_ENTRY *OKPLL22393_GETPROGRAMMINGINFO_FN) (okPLL22393_HANDLE, unsigned char *); - -typedef okFrontPanel_HANDLE (DLL_ENTRY *okFrontPanel_CONSTRUCT_FN) (void); -typedef void (DLL_ENTRY *okFrontPanel_DESTRUCT_FN) (okFrontPanel_HANDLE); -typedef int (DLL_ENTRY *okFrontPanel_GETHOSTINTERFACEWIDTH_FN) (okFrontPanel_HANDLE); -typedef Bool (DLL_ENTRY *okFrontPanel_ISHIGHSPEED_FN) (okFrontPanel_HANDLE); -typedef ok_BoardModel (DLL_ENTRY *okFrontPanel_GETBOARDMODEL_FN) (okFrontPanel_HANDLE); -typedef void (DLL_ENTRY *okFrontPanel_GETBOARDMODELSTRING_FN) (okFrontPanel_HANDLE, ok_BoardModel, char *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_WRITEI2C_FN) (okFrontPanel_HANDLE, const int, int, unsigned char *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_READI2C_FN) (okFrontPanel_HANDLE, const int, int, unsigned char *); -typedef int (DLL_ENTRY *okFrontPanel_GETDEVICECOUNT_FN) (okFrontPanel_HANDLE); -typedef ok_BoardModel (DLL_ENTRY *okFrontPanel_GETDEVICELISTMODEL_FN) (okFrontPanel_HANDLE, int); -typedef void (DLL_ENTRY *okFrontPanel_GETDEVICELISTSERIAL_FN) (okFrontPanel_HANDLE, int, char *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_OPENBYSERIAL_FN) (okFrontPanel_HANDLE, const char *); -typedef Bool (DLL_ENTRY *okFrontPanel_ISOPEN_FN) (okFrontPanel_HANDLE); -typedef void (DLL_ENTRY *okFrontPanel_ENABLEASYNCHRONOUSTRANSFERS_FN) (okFrontPanel_HANDLE, Bool); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_SETBTPIPEPOLLINGINTERVAL_FN) (okFrontPanel_HANDLE, int); -typedef void (DLL_ENTRY *okFrontPanel_SETTIMEOUT_FN) (okFrontPanel_HANDLE, int); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_GETDEVICEINFO_FN) (okFrontPanel_HANDLE, okTDeviceInfo *); -typedef int (DLL_ENTRY *okFrontPanel_GETDEVICEMAJORVERSION_FN) (okFrontPanel_HANDLE); -typedef int (DLL_ENTRY *okFrontPanel_GETDEVICEMINORVERSION_FN) (okFrontPanel_HANDLE); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_RESETFPGA_FN) (okFrontPanel_HANDLE); -typedef void (DLL_ENTRY *okFrontPanel_GETSERIALNUMBER_FN) (okFrontPanel_HANDLE, char *); -typedef void (DLL_ENTRY *okFrontPanel_GETDEVICEID_FN) (okFrontPanel_HANDLE, char *); -typedef void (DLL_ENTRY *okFrontPanel_SETDEVICEID_FN) (okFrontPanel_HANDLE, const char *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_CONFIGUREFPGA_FN) (okFrontPanel_HANDLE, const char *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_CONFIGUREFPGAFROMMEMORY_FN) (okFrontPanel_HANDLE, unsigned char *, unsigned long); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_GETPLL22150CONFIGURATION_FN) (okFrontPanel_HANDLE, okPLL22150_HANDLE); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_SETPLL22150CONFIGURATION_FN) (okFrontPanel_HANDLE, okPLL22150_HANDLE); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_GETEEPROMPLL22150CONFIGURATION_FN) (okFrontPanel_HANDLE, okPLL22150_HANDLE); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_SETEEPROMPLL22150CONFIGURATION_FN) (okFrontPanel_HANDLE, okPLL22150_HANDLE); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_GETPLL22393CONFIGURATION_FN) (okFrontPanel_HANDLE, okPLL22393_HANDLE); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_SETPLL22393CONFIGURATION_FN) (okFrontPanel_HANDLE, okPLL22393_HANDLE); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_GETEEPROMPLL22393CONFIGURATION_FN) (okFrontPanel_HANDLE, okPLL22393_HANDLE); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_SETEEPROMPLL22393CONFIGURATION_FN) (okFrontPanel_HANDLE, okPLL22393_HANDLE); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_LOADDEFAULTPLLCONFIGURATION_FN) (okFrontPanel_HANDLE); -typedef Bool (DLL_ENTRY *okFrontPanel_ISFRONTPANELENABLED_FN) (okFrontPanel_HANDLE); -typedef Bool (DLL_ENTRY *okFrontPanel_ISFRONTPANEL3SUPPORTED_FN) (okFrontPanel_HANDLE); -typedef void (DLL_ENTRY *okFrontPanel_UPDATEWIREINS_FN) (okFrontPanel_HANDLE); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_SETWIREINVALUE_FN) (okFrontPanel_HANDLE, int, unsigned long, unsigned long); -typedef void (DLL_ENTRY *okFrontPanel_UPDATEWIREOUTS_FN) (okFrontPanel_HANDLE); -typedef unsigned long (DLL_ENTRY *okFrontPanel_GETWIREOUTVALUE_FN) (okFrontPanel_HANDLE, int); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_ACTIVATETRIGGERIN_FN) (okFrontPanel_HANDLE, int, int); -typedef void (DLL_ENTRY *okFrontPanel_UPDATETRIGGEROUTS_FN) (okFrontPanel_HANDLE); -typedef Bool (DLL_ENTRY *okFrontPanel_ISTRIGGERED_FN) (okFrontPanel_HANDLE, int, unsigned long); -typedef long (DLL_ENTRY *okFrontPanel_GETLASTTRANSFERLENGTH_FN) (okFrontPanel_HANDLE); -typedef long (DLL_ENTRY *okFrontPanel_WRITETOPIPEIN_FN) (okFrontPanel_HANDLE, int, long, unsigned char *); -typedef long (DLL_ENTRY *okFrontPanel_WRITETOBLOCKPIPEIN_FN) (okFrontPanel_HANDLE, int, long, int, unsigned char *); -typedef long (DLL_ENTRY *okFrontPanel_READFROMPIPEOUT_FN) (okFrontPanel_HANDLE, int, long, unsigned char *); -typedef long (DLL_ENTRY *okFrontPanel_READFROMBLOCKPIPEOUT_FN) (okFrontPanel_HANDLE, int, long, int, unsigned char *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_FLASHERASESECTOR_FN) (okFrontPanel_HANDLE, UINT32); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_FLASHWRITE_FN) (okFrontPanel_HANDLE, UINT32, UINT32, const UINT8 *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_FLASHREAD_FN) (okFrontPanel_HANDLE, UINT32, UINT32, UINT8 *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_GETFPGABOOTRESETPROFILE_FN) (okFrontPanel_HANDLE, okTFPGAResetProfile *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_GETFPGAJTAGRESETPROFILE_FN) (okFrontPanel_HANDLE, okTFPGAResetProfile *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_SETFPGABOOTRESETPROFILE_FN) (okFrontPanel_HANDLE, okTFPGAResetProfile *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_SETFPGAJTAGRESETPROFILE_FN) (okFrontPanel_HANDLE, okTFPGAResetProfile *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_READREGISTER_FN) (okFrontPanel_HANDLE, UINT32, UINT32 *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_READREGISTERSET_FN) (okFrontPanel_HANDLE, okTRegisterSet *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_WRITEREGISTER_FN) (okFrontPanel_HANDLE, UINT32, UINT32); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_WRITEREGISTERSET_FN) (okFrontPanel_HANDLE, okTRegisterSet *); -typedef ok_ErrorCode (DLL_ENTRY *okFrontPanel_GETWIREINVALUE_FN) (okFrontPanel_HANDLE, int, UINT32 *); +typedef void (DLL_ENTRY* OKFRONTPANELDLL_GETVERSION_FN)(char*, char*); + +typedef okPLL22150_HANDLE(DLL_ENTRY* OKPLL22150_CONSTRUCT_FN)(void); +typedef void (DLL_ENTRY* OKPLL22150_DESTRUCT_FN)(okPLL22150_HANDLE); +typedef void (DLL_ENTRY* OKPLL22150_SETCRYSTALLOAD_FN)(okPLL22150_HANDLE, double); +typedef void (DLL_ENTRY* OKPLL22150_SETREFERENCE_FN)(okPLL22150_HANDLE, double, Bool); +typedef double(DLL_ENTRY* OKPLL22150_GETREFERENCE_FN)(okPLL22150_HANDLE); +typedef Bool(DLL_ENTRY* OKPLL22150_SETVCOPARAMETERS_FN)(okPLL22150_HANDLE, int, int); +typedef int (DLL_ENTRY* OKPLL22150_GETVCOP_FN)(okPLL22150_HANDLE); +typedef int (DLL_ENTRY* OKPLL22150_GETVCOQ_FN)(okPLL22150_HANDLE); +typedef double(DLL_ENTRY* OKPLL22150_GETVCOFREQUENCY_FN)(okPLL22150_HANDLE); +typedef void (DLL_ENTRY* OKPLL22150_SETDIV1_FN)(okPLL22150_HANDLE, ok_DividerSource, int); +typedef void (DLL_ENTRY* OKPLL22150_SETDIV2_FN)(okPLL22150_HANDLE, ok_DividerSource, int); +typedef ok_DividerSource(DLL_ENTRY* OKPLL22150_GETDIV1SOURCE_FN)(okPLL22150_HANDLE); +typedef ok_DividerSource(DLL_ENTRY* OKPLL22150_GETDIV2SOURCE_FN)(okPLL22150_HANDLE); +typedef int (DLL_ENTRY* OKPLL22150_GETDIV1DIVIDER_FN)(okPLL22150_HANDLE); +typedef int (DLL_ENTRY* OKPLL22150_GETDIV2DIVIDER_FN)(okPLL22150_HANDLE); +typedef void (DLL_ENTRY* OKPLL22150_SETOUTPUTSOURCE_FN)(okPLL22150_HANDLE, int, ok_ClockSource_22150); +typedef void (DLL_ENTRY* OKPLL22150_SETOUTPUTENABLE_FN)(okPLL22150_HANDLE, int, Bool); +typedef ok_ClockSource_22150(DLL_ENTRY* OKPLL22150_GETOUTPUTSOURCE_FN)(okPLL22150_HANDLE, int); +typedef double(DLL_ENTRY* OKPLL22150_GETOUTPUTFREQUENCY_FN)(okPLL22150_HANDLE, int); +typedef Bool(DLL_ENTRY* OKPLL22150_ISOUTPUTENABLED_FN)(okPLL22150_HANDLE, int); +typedef void (DLL_ENTRY* OKPLL22150_INITFROMPROGRAMMINGINFO_FN)(okPLL22150_HANDLE, unsigned char*); +typedef void (DLL_ENTRY* OKPLL22150_GETPROGRAMMINGINFO_FN)(okPLL22150_HANDLE, unsigned char*); + +typedef okPLL22393_HANDLE(DLL_ENTRY* OKPLL22393_CONSTRUCT_FN)(void); +typedef void (DLL_ENTRY* OKPLL22393_DESTRUCT_FN)(okPLL22393_HANDLE); +typedef void (DLL_ENTRY* OKPLL22393_SETCRYSTALLOAD_FN)(okPLL22393_HANDLE, double); +typedef void (DLL_ENTRY* OKPLL22393_SETREFERENCE_FN)(okPLL22393_HANDLE, double); +typedef double(DLL_ENTRY* OKPLL22393_GETREFERENCE_FN)(okPLL22393_HANDLE); +typedef Bool(DLL_ENTRY* OKPLL22393_SETPLLPARAMETERS_FN)(okPLL22393_HANDLE, int, int, int, Bool); +typedef Bool(DLL_ENTRY* OKPLL22393_SETPLLLF_FN)(okPLL22393_HANDLE, int, int); +typedef Bool(DLL_ENTRY* OKPLL22393_SETOUTPUTDIVIDER_FN)(okPLL22393_HANDLE, int, int); +typedef Bool(DLL_ENTRY* OKPLL22393_SETOUTPUTSOURCE_FN)(okPLL22393_HANDLE, int, ok_ClockSource_22393); +typedef void (DLL_ENTRY* OKPLL22393_SETOUTPUTENABLE_FN)(okPLL22393_HANDLE, int, Bool); +typedef int (DLL_ENTRY* OKPLL22393_GETPLLP_FN)(okPLL22393_HANDLE, int); +typedef int (DLL_ENTRY* OKPLL22393_GETPLLQ_FN)(okPLL22393_HANDLE, int); +typedef double(DLL_ENTRY* OKPLL22393_GETPLLFREQUENCY_FN)(okPLL22393_HANDLE, int); +typedef int (DLL_ENTRY* OKPLL22393_GETOUTPUTDIVIDER_FN)(okPLL22393_HANDLE, int); +typedef ok_ClockSource_22393(DLL_ENTRY* OKPLL22393_GETOUTPUTSOURCE_FN)(okPLL22393_HANDLE, int); +typedef double(DLL_ENTRY* OKPLL22393_GETOUTPUTFREQUENCY_FN)(okPLL22393_HANDLE, int); +typedef Bool(DLL_ENTRY* OKPLL22393_ISOUTPUTENABLED_FN)(okPLL22393_HANDLE, int); +typedef Bool(DLL_ENTRY* OKPLL22393_ISPLLENABLED_FN)(okPLL22393_HANDLE, int); +typedef void (DLL_ENTRY* OKPLL22393_INITFROMPROGRAMMINGINFO_FN)(okPLL22393_HANDLE, unsigned char*); +typedef void (DLL_ENTRY* OKPLL22393_GETPROGRAMMINGINFO_FN)(okPLL22393_HANDLE, unsigned char*); + +typedef okFrontPanel_HANDLE(DLL_ENTRY* okFrontPanel_CONSTRUCT_FN)(void); +typedef void (DLL_ENTRY* okFrontPanel_DESTRUCT_FN)(okFrontPanel_HANDLE); +typedef int (DLL_ENTRY* okFrontPanel_GETHOSTINTERFACEWIDTH_FN)(okFrontPanel_HANDLE); +typedef Bool(DLL_ENTRY* okFrontPanel_ISHIGHSPEED_FN)(okFrontPanel_HANDLE); +typedef ok_BoardModel(DLL_ENTRY* okFrontPanel_GETBOARDMODEL_FN)(okFrontPanel_HANDLE); +typedef void (DLL_ENTRY* okFrontPanel_GETBOARDMODELSTRING_FN)(okFrontPanel_HANDLE, ok_BoardModel, char*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_WRITEI2C_FN)(okFrontPanel_HANDLE, const int, int, unsigned char*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_READI2C_FN)(okFrontPanel_HANDLE, const int, int, unsigned char*); +typedef int (DLL_ENTRY* okFrontPanel_GETDEVICECOUNT_FN)(okFrontPanel_HANDLE); +typedef ok_BoardModel(DLL_ENTRY* okFrontPanel_GETDEVICELISTMODEL_FN)(okFrontPanel_HANDLE, int); +typedef void (DLL_ENTRY* okFrontPanel_GETDEVICELISTSERIAL_FN)(okFrontPanel_HANDLE, int, char*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_OPENBYSERIAL_FN)(okFrontPanel_HANDLE, const char*); +typedef Bool(DLL_ENTRY* okFrontPanel_ISOPEN_FN)(okFrontPanel_HANDLE); +typedef void (DLL_ENTRY* okFrontPanel_ENABLEASYNCHRONOUSTRANSFERS_FN)(okFrontPanel_HANDLE, Bool); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_SETBTPIPEPOLLINGINTERVAL_FN)(okFrontPanel_HANDLE, int); +typedef void (DLL_ENTRY* okFrontPanel_SETTIMEOUT_FN)(okFrontPanel_HANDLE, int); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_GETDEVICEINFO_FN)(okFrontPanel_HANDLE, okTDeviceInfo*); +typedef int (DLL_ENTRY* okFrontPanel_GETDEVICEMAJORVERSION_FN)(okFrontPanel_HANDLE); +typedef int (DLL_ENTRY* okFrontPanel_GETDEVICEMINORVERSION_FN)(okFrontPanel_HANDLE); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_RESETFPGA_FN)(okFrontPanel_HANDLE); +typedef void (DLL_ENTRY* okFrontPanel_GETSERIALNUMBER_FN)(okFrontPanel_HANDLE, char*); +typedef void (DLL_ENTRY* okFrontPanel_GETDEVICEID_FN)(okFrontPanel_HANDLE, char*); +typedef void (DLL_ENTRY* okFrontPanel_SETDEVICEID_FN)(okFrontPanel_HANDLE, const char*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_CONFIGUREFPGA_FN)(okFrontPanel_HANDLE, const char*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_CONFIGUREFPGAFROMMEMORY_FN)(okFrontPanel_HANDLE, unsigned char*, unsigned long); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_GETPLL22150CONFIGURATION_FN)(okFrontPanel_HANDLE, okPLL22150_HANDLE); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_SETPLL22150CONFIGURATION_FN)(okFrontPanel_HANDLE, okPLL22150_HANDLE); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_GETEEPROMPLL22150CONFIGURATION_FN)(okFrontPanel_HANDLE, okPLL22150_HANDLE); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_SETEEPROMPLL22150CONFIGURATION_FN)(okFrontPanel_HANDLE, okPLL22150_HANDLE); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_GETPLL22393CONFIGURATION_FN)(okFrontPanel_HANDLE, okPLL22393_HANDLE); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_SETPLL22393CONFIGURATION_FN)(okFrontPanel_HANDLE, okPLL22393_HANDLE); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_GETEEPROMPLL22393CONFIGURATION_FN)(okFrontPanel_HANDLE, okPLL22393_HANDLE); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_SETEEPROMPLL22393CONFIGURATION_FN)(okFrontPanel_HANDLE, okPLL22393_HANDLE); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_LOADDEFAULTPLLCONFIGURATION_FN)(okFrontPanel_HANDLE); +typedef Bool(DLL_ENTRY* okFrontPanel_ISFRONTPANELENABLED_FN)(okFrontPanel_HANDLE); +typedef Bool(DLL_ENTRY* okFrontPanel_ISFRONTPANEL3SUPPORTED_FN)(okFrontPanel_HANDLE); +typedef void (DLL_ENTRY* okFrontPanel_UPDATEWIREINS_FN)(okFrontPanel_HANDLE); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_SETWIREINVALUE_FN)(okFrontPanel_HANDLE, int, unsigned long, unsigned long); +typedef void (DLL_ENTRY* okFrontPanel_UPDATEWIREOUTS_FN)(okFrontPanel_HANDLE); +typedef unsigned long(DLL_ENTRY* okFrontPanel_GETWIREOUTVALUE_FN)(okFrontPanel_HANDLE, int); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_ACTIVATETRIGGERIN_FN)(okFrontPanel_HANDLE, int, int); +typedef void (DLL_ENTRY* okFrontPanel_UPDATETRIGGEROUTS_FN)(okFrontPanel_HANDLE); +typedef Bool(DLL_ENTRY* okFrontPanel_ISTRIGGERED_FN)(okFrontPanel_HANDLE, int, unsigned long); +typedef long(DLL_ENTRY* okFrontPanel_GETLASTTRANSFERLENGTH_FN)(okFrontPanel_HANDLE); +typedef long(DLL_ENTRY* okFrontPanel_WRITETOPIPEIN_FN)(okFrontPanel_HANDLE, int, long, unsigned char*); +typedef long(DLL_ENTRY* okFrontPanel_WRITETOBLOCKPIPEIN_FN)(okFrontPanel_HANDLE, int, long, int, unsigned char*); +typedef long(DLL_ENTRY* okFrontPanel_READFROMPIPEOUT_FN)(okFrontPanel_HANDLE, int, long, unsigned char*); +typedef long(DLL_ENTRY* okFrontPanel_READFROMBLOCKPIPEOUT_FN)(okFrontPanel_HANDLE, int, long, int, unsigned char*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_FLASHERASESECTOR_FN)(okFrontPanel_HANDLE, UINT32); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_FLASHWRITE_FN)(okFrontPanel_HANDLE, UINT32, UINT32, const UINT8*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_FLASHREAD_FN)(okFrontPanel_HANDLE, UINT32, UINT32, UINT8*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_GETFPGABOOTRESETPROFILE_FN)(okFrontPanel_HANDLE, okTFPGAResetProfile*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_GETFPGAJTAGRESETPROFILE_FN)(okFrontPanel_HANDLE, okTFPGAResetProfile*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_SETFPGABOOTRESETPROFILE_FN)(okFrontPanel_HANDLE, okTFPGAResetProfile*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_SETFPGAJTAGRESETPROFILE_FN)(okFrontPanel_HANDLE, okTFPGAResetProfile*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_READREGISTER_FN)(okFrontPanel_HANDLE, UINT32, UINT32*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_READREGISTERSET_FN)(okFrontPanel_HANDLE, okTRegisterSet*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_WRITEREGISTER_FN)(okFrontPanel_HANDLE, UINT32, UINT32); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_WRITEREGISTERSET_FN)(okFrontPanel_HANDLE, okTRegisterSet*); +typedef ok_ErrorCode(DLL_ENTRY* okFrontPanel_GETWIREINVALUE_FN)(okFrontPanel_HANDLE, int, UINT32*); //------------------------------------------------------------------------ // Function pointers @@ -544,7 +749,7 @@ okFrontPanel_GETDEVICECOUNT_FN _okFrontPanel_GetDeviceCount = okFrontPanel_GETDEVICELISTMODEL_FN _okFrontPanel_GetDeviceListModel = NULL; okFrontPanel_GETDEVICELISTSERIAL_FN _okFrontPanel_GetDeviceListSerial = NULL; okFrontPanel_OPENBYSERIAL_FN _okFrontPanel_OpenBySerial = NULL; -okFrontPanel_ISOPEN_FN _okFrontPanel_IsOpen = NULL; +okFrontPanel_ISOPEN_FN _okFrontPanel_IsOpen = NULL; okFrontPanel_ENABLEASYNCHRONOUSTRANSFERS_FN _okFrontPanel_EnableAsynchronousTransfers = NULL; okFrontPanel_SETBTPIPEPOLLINGINTERVAL_FN _okFrontPanel_SetBTPipePollingInterval = NULL; okFrontPanel_SETTIMEOUT_FN _okFrontPanel_SetTimeout = NULL; @@ -597,196 +802,198 @@ okFrontPanel_GETWIREINVALUE_FN _okFrontPanel_GetWireInValue = //------------------------------------------------------------------------ /// Returns the version number of the DLL. -const char * +const char* okFrontPanelDLL_GetVersionString() { - return(VERSION_STRING); + return(VERSION_STRING); } -/// Loads the FrontPanel API DLL. This function returns False if the +/// Loads the FrontPanel API DLL. This function returns False if the /// DLL did not load for some reason, True otherwise. Bool okFrontPanelDLL_LoadLib(okFP_dll_pchar libname) { - // Return TRUE if the DLL is already loaded. - if (hLib) - return(TRUE); - - if (NULL == libname) - hLib = dll_load(okLIB_NAME); - else - hLib = dll_load(libname); - - if (hLib) { - _okFrontPanelDLL_GetVersion = ( OKFRONTPANELDLL_GETVERSION_FN ) dll_entrypoint( hLib, "okFrontPanelDLL_GetVersion" ); - - _okPLL22150_Construct = ( OKPLL22150_CONSTRUCT_FN ) dll_entrypoint( hLib, "okPLL22150_Construct" ); - _okPLL22150_Destruct = ( OKPLL22150_DESTRUCT_FN ) dll_entrypoint( hLib, "okPLL22150_Destruct" ); - _okPLL22150_SetCrystalLoad = ( OKPLL22150_SETCRYSTALLOAD_FN ) dll_entrypoint( hLib, "okPLL22150_SetCrystalLoad" ); - _okPLL22150_SetReference = ( OKPLL22150_SETREFERENCE_FN ) dll_entrypoint( hLib, "okPLL22150_SetReference" ); - _okPLL22150_GetReference = ( OKPLL22150_GETREFERENCE_FN ) dll_entrypoint( hLib, "okPLL22150_GetReference" ); - _okPLL22150_SetVCOParameters = ( OKPLL22150_SETVCOPARAMETERS_FN ) dll_entrypoint( hLib, "okPLL22150_SetVCOParameters" ); - _okPLL22150_GetVCOP = ( OKPLL22150_GETVCOP_FN ) dll_entrypoint( hLib, "okPLL22150_GetVCOP" ); - _okPLL22150_GetVCOQ = ( OKPLL22150_GETVCOQ_FN ) dll_entrypoint( hLib, "okPLL22150_GetVCOQ" ); - _okPLL22150_GetVCOFrequency = ( OKPLL22150_GETVCOFREQUENCY_FN ) dll_entrypoint( hLib, "okPLL22150_GetVCOFrequency" ); - _okPLL22150_SetDiv1 = ( OKPLL22150_SETDIV1_FN ) dll_entrypoint( hLib, "okPLL22150_SetDiv1" ); - _okPLL22150_SetDiv2 = ( OKPLL22150_SETDIV2_FN ) dll_entrypoint( hLib, "okPLL22150_SetDiv2" ); - _okPLL22150_GetDiv1Source = ( OKPLL22150_GETDIV1SOURCE_FN ) dll_entrypoint( hLib, "okPLL22150_GetDiv1Source" ); - _okPLL22150_GetDiv2Source = ( OKPLL22150_GETDIV2SOURCE_FN ) dll_entrypoint( hLib, "okPLL22150_GetDiv2Source" ); - _okPLL22150_GetDiv1Divider = ( OKPLL22150_GETDIV1DIVIDER_FN ) dll_entrypoint( hLib, "okPLL22150_GetDiv1Divider" ); - _okPLL22150_GetDiv2Divider = ( OKPLL22150_GETDIV2DIVIDER_FN ) dll_entrypoint( hLib, "okPLL22150_GetDiv2Divider" ); - _okPLL22150_SetOutputSource = ( OKPLL22150_SETOUTPUTSOURCE_FN ) dll_entrypoint( hLib, "okPLL22150_SetOutputSource" ); - _okPLL22150_SetOutputEnable = ( OKPLL22150_SETOUTPUTENABLE_FN ) dll_entrypoint( hLib, "okPLL22150_SetOutputEnable" ); - _okPLL22150_GetOutputSource = ( OKPLL22150_GETOUTPUTSOURCE_FN ) dll_entrypoint( hLib, "okPLL22150_GetOutputSource" ); - _okPLL22150_GetOutputFrequency = ( OKPLL22150_GETOUTPUTFREQUENCY_FN ) dll_entrypoint( hLib, "okPLL22150_GetOutputFrequency" ); - _okPLL22150_IsOutputEnabled = ( OKPLL22150_ISOUTPUTENABLED_FN ) dll_entrypoint( hLib, "okPLL22150_IsOutputEnabled" ); - _okPLL22150_InitFromProgrammingInfo = ( OKPLL22150_INITFROMPROGRAMMINGINFO_FN ) dll_entrypoint( hLib, "okPLL22150_InitFromProgrammingInfo" ); - _okPLL22150_GetProgrammingInfo = ( OKPLL22150_GETPROGRAMMINGINFO_FN ) dll_entrypoint( hLib, "okPLL22150_GetProgrammingInfo" ); - - _okPLL22393_Construct = ( OKPLL22393_CONSTRUCT_FN ) dll_entrypoint( hLib, "okPLL22393_Construct" ); - _okPLL22393_Destruct = ( OKPLL22393_DESTRUCT_FN ) dll_entrypoint( hLib, "okPLL22393_Destruct" ); - _okPLL22393_SetCrystalLoad = ( OKPLL22393_SETCRYSTALLOAD_FN ) dll_entrypoint( hLib, "okPLL22393_SetCrystalLoad" ); - _okPLL22393_SetReference = ( OKPLL22393_SETREFERENCE_FN ) dll_entrypoint( hLib, "okPLL22393_SetReference" ); - _okPLL22393_GetReference = ( OKPLL22393_GETREFERENCE_FN ) dll_entrypoint( hLib, "okPLL22393_GetReference" ); - _okPLL22393_SetPLLParameters = ( OKPLL22393_SETPLLPARAMETERS_FN ) dll_entrypoint( hLib, "okPLL22393_SetPLLParameters" ); - _okPLL22393_SetPLLLF = ( OKPLL22393_SETPLLLF_FN ) dll_entrypoint( hLib, "okPLL22393_SetPLLLF" ); - _okPLL22393_SetOutputDivider = ( OKPLL22393_SETOUTPUTDIVIDER_FN ) dll_entrypoint( hLib, "okPLL22393_SetOutputDivider" ); - _okPLL22393_SetOutputSource = ( OKPLL22393_SETOUTPUTSOURCE_FN ) dll_entrypoint( hLib, "okPLL22393_SetOutputSource" ); - _okPLL22393_SetOutputEnable = ( OKPLL22393_SETOUTPUTENABLE_FN ) dll_entrypoint( hLib, "okPLL22393_SetOutputEnable" ); - _okPLL22393_GetPLLP = ( OKPLL22393_GETPLLP_FN ) dll_entrypoint( hLib, "okPLL22393_GetPLLP" ); - _okPLL22393_GetPLLQ = ( OKPLL22393_GETPLLQ_FN ) dll_entrypoint( hLib, "okPLL22393_GetPLLQ" ); - _okPLL22393_GetPLLFrequency = ( OKPLL22393_GETPLLFREQUENCY_FN ) dll_entrypoint( hLib, "okPLL22393_GetPLLFrequency" ); - _okPLL22393_GetOutputDivider = ( OKPLL22393_GETOUTPUTDIVIDER_FN ) dll_entrypoint( hLib, "okPLL22393_GetOutputDivider" ); - _okPLL22393_GetOutputSource = ( OKPLL22393_GETOUTPUTSOURCE_FN ) dll_entrypoint( hLib, "okPLL22393_GetOutputSource" ); - _okPLL22393_GetOutputFrequency = ( OKPLL22393_GETOUTPUTFREQUENCY_FN ) dll_entrypoint( hLib, "okPLL22393_GetOutputFrequency" ); - _okPLL22393_IsOutputEnabled = ( OKPLL22393_ISOUTPUTENABLED_FN ) dll_entrypoint( hLib, "okPLL22393_IsOutputEnabled" ); - _okPLL22393_IsPLLEnabled = ( OKPLL22393_ISPLLENABLED_FN ) dll_entrypoint( hLib, "okPLL22393_IsPLLEnabled" ); - _okPLL22393_InitFromProgrammingInfo = ( OKPLL22393_INITFROMPROGRAMMINGINFO_FN ) dll_entrypoint( hLib, "okPLL22393_InitFromProgrammingInfo" ); - _okPLL22393_GetProgrammingInfo = ( OKPLL22393_GETPROGRAMMINGINFO_FN ) dll_entrypoint( hLib, "okPLL22393_GetProgrammingInfo" ); - - _okFrontPanel_Construct = ( okFrontPanel_CONSTRUCT_FN ) dll_entrypoint( hLib, "okFrontPanel_Construct" ); - _okFrontPanel_Destruct = ( okFrontPanel_DESTRUCT_FN ) dll_entrypoint( hLib, "okFrontPanel_Destruct" ); - _okFrontPanel_GetHostInterfaceWidth = ( okFrontPanel_GETHOSTINTERFACEWIDTH_FN ) dll_entrypoint( hLib, "okFrontPanel_GetHostInterfaceWidth" ); - _okFrontPanel_IsHighSpeed = ( okFrontPanel_ISHIGHSPEED_FN ) dll_entrypoint( hLib, "okFrontPanel_IsHighSpeed" ); - _okFrontPanel_GetBoardModel = ( okFrontPanel_GETBOARDMODEL_FN ) dll_entrypoint( hLib, "okFrontPanel_GetBoardModel" ); - _okFrontPanel_GetBoardModelString = ( okFrontPanel_GETBOARDMODELSTRING_FN ) dll_entrypoint( hLib, "okFrontPanel_GetBoardModelString" ); - _okFrontPanel_WriteI2C = ( okFrontPanel_WRITEI2C_FN ) dll_entrypoint( hLib, "okFrontPanel_WriteI2C" ); - _okFrontPanel_ReadI2C = ( okFrontPanel_READI2C_FN ) dll_entrypoint( hLib, "okFrontPanel_ReadI2C" ); - _okFrontPanel_GetDeviceCount = ( okFrontPanel_GETDEVICECOUNT_FN ) dll_entrypoint( hLib, "okFrontPanel_GetDeviceCount" ); - _okFrontPanel_GetDeviceListModel = ( okFrontPanel_GETDEVICELISTMODEL_FN ) dll_entrypoint( hLib, "okFrontPanel_GetDeviceListModel" ); - _okFrontPanel_GetDeviceListSerial = ( okFrontPanel_GETDEVICELISTSERIAL_FN ) dll_entrypoint( hLib, "okFrontPanel_GetDeviceListSerial" ); - _okFrontPanel_OpenBySerial = ( okFrontPanel_OPENBYSERIAL_FN ) dll_entrypoint( hLib, "okFrontPanel_OpenBySerial" ); - _okFrontPanel_IsOpen = ( okFrontPanel_ISOPEN_FN ) dll_entrypoint( hLib, "okFrontPanel_IsOpen" ); - _okFrontPanel_SetBTPipePollingInterval = ( okFrontPanel_SETBTPIPEPOLLINGINTERVAL_FN ) dll_entrypoint( hLib, "okFrontPanel_SetBTPipePollingInterval" ); - _okFrontPanel_SetTimeout = ( okFrontPanel_SETTIMEOUT_FN ) dll_entrypoint( hLib, "okFrontPanel_SetTimeout" ); - _okFrontPanel_EnableAsynchronousTransfers = ( okFrontPanel_ENABLEASYNCHRONOUSTRANSFERS_FN ) dll_entrypoint( hLib, "okFrontPanel_EnableAsynchronousTransfers" ); - _okFrontPanel_GetDeviceInfo = ( okFrontPanel_GETDEVICEINFO_FN ) dll_entrypoint( hLib, "okFrontPanel_GetDeviceInfo" ); - _okFrontPanel_GetDeviceMajorVersion = ( okFrontPanel_GETDEVICEMAJORVERSION_FN ) dll_entrypoint( hLib, "okFrontPanel_GetDeviceMajorVersion" ); - _okFrontPanel_GetDeviceMinorVersion = ( okFrontPanel_GETDEVICEMINORVERSION_FN ) dll_entrypoint( hLib, "okFrontPanel_GetDeviceMinorVersion" ); - _okFrontPanel_ResetFPGA = ( okFrontPanel_RESETFPGA_FN ) dll_entrypoint( hLib, "okFrontPanel_ResetFPGA" ); - _okFrontPanel_GetSerialNumber = ( okFrontPanel_GETSERIALNUMBER_FN ) dll_entrypoint( hLib, "okFrontPanel_GetSerialNumber" ); - _okFrontPanel_GetDeviceID = ( okFrontPanel_GETDEVICEID_FN ) dll_entrypoint( hLib, "okFrontPanel_GetDeviceID" ); - _okFrontPanel_SetDeviceID = ( okFrontPanel_SETDEVICEID_FN ) dll_entrypoint( hLib, "okFrontPanel_SetDeviceID" ); - _okFrontPanel_ConfigureFPGA = ( okFrontPanel_CONFIGUREFPGA_FN ) dll_entrypoint( hLib, "okFrontPanel_ConfigureFPGA" ); - _okFrontPanel_ConfigureFPGAFromMemory = ( okFrontPanel_CONFIGUREFPGAFROMMEMORY_FN ) dll_entrypoint( hLib, "okFrontPanel_ConfigureFPGAFromMemory" ); - _okFrontPanel_GetPLL22150Configuration = ( okFrontPanel_GETPLL22150CONFIGURATION_FN ) dll_entrypoint( hLib, "okFrontPanel_GetPLL22150Configuration" ); - _okFrontPanel_SetPLL22150Configuration = ( okFrontPanel_SETPLL22150CONFIGURATION_FN ) dll_entrypoint( hLib, "okFrontPanel_SetPLL22150Configuration" ); - _okFrontPanel_GetEepromPLL22150Configuration = ( okFrontPanel_GETEEPROMPLL22150CONFIGURATION_FN ) dll_entrypoint( hLib, "okFrontPanel_GetEepromPLL22150Configuration" ); - _okFrontPanel_SetEepromPLL22150Configuration = ( okFrontPanel_SETEEPROMPLL22150CONFIGURATION_FN ) dll_entrypoint( hLib, "okFrontPanel_SetEepromPLL22150Configuration" ); - _okFrontPanel_GetPLL22393Configuration = ( okFrontPanel_GETPLL22393CONFIGURATION_FN ) dll_entrypoint( hLib, "okFrontPanel_GetPLL22393Configuration" ); - _okFrontPanel_SetPLL22393Configuration = ( okFrontPanel_SETPLL22393CONFIGURATION_FN ) dll_entrypoint( hLib, "okFrontPanel_SetPLL22393Configuration" ); - _okFrontPanel_GetEepromPLL22393Configuration = ( okFrontPanel_GETEEPROMPLL22393CONFIGURATION_FN ) dll_entrypoint( hLib, "okFrontPanel_GetEepromPLL22393Configuration" ); - _okFrontPanel_SetEepromPLL22393Configuration = ( okFrontPanel_SETEEPROMPLL22393CONFIGURATION_FN ) dll_entrypoint( hLib, "okFrontPanel_SetEepromPLL22393Configuration" ); - _okFrontPanel_LoadDefaultPLLConfiguration = ( okFrontPanel_LOADDEFAULTPLLCONFIGURATION_FN ) dll_entrypoint( hLib, "okFrontPanel_LoadDefaultPLLConfiguration" ); - _okFrontPanel_IsFrontPanelEnabled = ( okFrontPanel_ISFRONTPANELENABLED_FN ) dll_entrypoint( hLib, "okFrontPanel_IsFrontPanelEnabled" ); - _okFrontPanel_IsFrontPanel3Supported = ( okFrontPanel_ISFRONTPANEL3SUPPORTED_FN ) dll_entrypoint( hLib, "okFrontPanel_IsFrontPanel3Supported" ); - _okFrontPanel_UpdateWireIns = ( okFrontPanel_UPDATEWIREINS_FN ) dll_entrypoint( hLib, "okFrontPanel_UpdateWireIns" ); - _okFrontPanel_SetWireInValue = ( okFrontPanel_SETWIREINVALUE_FN ) dll_entrypoint( hLib, "okFrontPanel_SetWireInValue" ); - _okFrontPanel_UpdateWireOuts = ( okFrontPanel_UPDATEWIREOUTS_FN ) dll_entrypoint( hLib, "okFrontPanel_UpdateWireOuts" ); - _okFrontPanel_GetWireOutValue = ( okFrontPanel_GETWIREOUTVALUE_FN ) dll_entrypoint( hLib, "okFrontPanel_GetWireOutValue" ); - _okFrontPanel_ActivateTriggerIn = ( okFrontPanel_ACTIVATETRIGGERIN_FN ) dll_entrypoint( hLib, "okFrontPanel_ActivateTriggerIn" ); - _okFrontPanel_UpdateTriggerOuts = ( okFrontPanel_UPDATETRIGGEROUTS_FN ) dll_entrypoint( hLib, "okFrontPanel_UpdateTriggerOuts" ); - _okFrontPanel_IsTriggered = ( okFrontPanel_ISTRIGGERED_FN ) dll_entrypoint( hLib, "okFrontPanel_IsTriggered" ); - _okFrontPanel_GetLastTransferLength = ( okFrontPanel_GETLASTTRANSFERLENGTH_FN ) dll_entrypoint( hLib, "okFrontPanel_GetLastTransferLength" ); - _okFrontPanel_WriteToPipeIn = ( okFrontPanel_WRITETOPIPEIN_FN ) dll_entrypoint( hLib, "okFrontPanel_WriteToPipeIn" ); - _okFrontPanel_WriteToBlockPipeIn = ( okFrontPanel_WRITETOBLOCKPIPEIN_FN ) dll_entrypoint( hLib, "okFrontPanel_WriteToBlockPipeIn" ); - _okFrontPanel_ReadFromPipeOut = ( okFrontPanel_READFROMPIPEOUT_FN ) dll_entrypoint( hLib, "okFrontPanel_ReadFromPipeOut" ); - _okFrontPanel_ReadFromBlockPipeOut = ( okFrontPanel_READFROMBLOCKPIPEOUT_FN ) dll_entrypoint( hLib, "okFrontPanel_ReadFromBlockPipeOut" ); - _okFrontPanel_FlashEraseSector = ( okFrontPanel_FLASHERASESECTOR_FN ) dll_entrypoint( hLib, "okFrontPanel_FlashEraseSector" ); - _okFrontPanel_FlashWrite = ( okFrontPanel_FLASHWRITE_FN ) dll_entrypoint( hLib, "okFrontPanel_FlashWrite" ); - _okFrontPanel_FlashRead = ( okFrontPanel_FLASHREAD_FN ) dll_entrypoint( hLib, "okFrontPanel_FlashRead" ); - _okFrontPanel_GetFPGABootResetProfile = ( okFrontPanel_GETFPGABOOTRESETPROFILE_FN ) dll_entrypoint( hLib, "okFrontPanel_GetFPGABootResetProfile" ); - _okFrontPanel_GetFPGAJTAGResetProfile = ( okFrontPanel_GETFPGAJTAGRESETPROFILE_FN ) dll_entrypoint( hLib, "okFrontPanel_GetFPGAJTAGResetProfile" ); - _okFrontPanel_SetFPGABootResetProfile = ( okFrontPanel_SETFPGABOOTRESETPROFILE_FN ) dll_entrypoint( hLib, "okFrontPanel_SetFPGABootResetProfile" ); - _okFrontPanel_SetFPGAJTAGResetProfile = ( okFrontPanel_SETFPGAJTAGRESETPROFILE_FN ) dll_entrypoint( hLib, "okFrontPanel_SetFPGAJTAGResetProfile" ); - _okFrontPanel_ReadRegister = ( okFrontPanel_READREGISTER_FN ) dll_entrypoint( hLib, "okFrontPanel_ReadRegister" ); - _okFrontPanel_ReadRegisterSet = ( okFrontPanel_READREGISTERSET_FN ) dll_entrypoint( hLib, "okFrontPanel_ReadRegisterSet" ); - _okFrontPanel_WriteRegister = ( okFrontPanel_WRITEREGISTER_FN ) dll_entrypoint( hLib, "okFrontPanel_WriteRegister" ); - _okFrontPanel_WriteRegisterSet = ( okFrontPanel_WRITEREGISTERSET_FN ) dll_entrypoint( hLib, "okFrontPanel_WriteRegisterSet" ); - _okFrontPanel_GetWireInValue = ( okFrontPanel_GETWIREINVALUE_FN ) dll_entrypoint( hLib, "okFrontPanel_GetWireInValue" ); - } - - if (NULL == hLib) { - return(FALSE); + // Return TRUE if the DLL is already loaded. + if (hLib) + return(TRUE); + + if (NULL == libname) + hLib = dll_load(okLIB_NAME); + else + hLib = dll_load(libname); + + if (hLib) + { + _okFrontPanelDLL_GetVersion = (OKFRONTPANELDLL_GETVERSION_FN) dll_entrypoint(hLib, "okFrontPanelDLL_GetVersion"); + + _okPLL22150_Construct = (OKPLL22150_CONSTRUCT_FN) dll_entrypoint(hLib, "okPLL22150_Construct"); + _okPLL22150_Destruct = (OKPLL22150_DESTRUCT_FN) dll_entrypoint(hLib, "okPLL22150_Destruct"); + _okPLL22150_SetCrystalLoad = (OKPLL22150_SETCRYSTALLOAD_FN) dll_entrypoint(hLib, "okPLL22150_SetCrystalLoad"); + _okPLL22150_SetReference = (OKPLL22150_SETREFERENCE_FN) dll_entrypoint(hLib, "okPLL22150_SetReference"); + _okPLL22150_GetReference = (OKPLL22150_GETREFERENCE_FN) dll_entrypoint(hLib, "okPLL22150_GetReference"); + _okPLL22150_SetVCOParameters = (OKPLL22150_SETVCOPARAMETERS_FN) dll_entrypoint(hLib, "okPLL22150_SetVCOParameters"); + _okPLL22150_GetVCOP = (OKPLL22150_GETVCOP_FN) dll_entrypoint(hLib, "okPLL22150_GetVCOP"); + _okPLL22150_GetVCOQ = (OKPLL22150_GETVCOQ_FN) dll_entrypoint(hLib, "okPLL22150_GetVCOQ"); + _okPLL22150_GetVCOFrequency = (OKPLL22150_GETVCOFREQUENCY_FN) dll_entrypoint(hLib, "okPLL22150_GetVCOFrequency"); + _okPLL22150_SetDiv1 = (OKPLL22150_SETDIV1_FN) dll_entrypoint(hLib, "okPLL22150_SetDiv1"); + _okPLL22150_SetDiv2 = (OKPLL22150_SETDIV2_FN) dll_entrypoint(hLib, "okPLL22150_SetDiv2"); + _okPLL22150_GetDiv1Source = (OKPLL22150_GETDIV1SOURCE_FN) dll_entrypoint(hLib, "okPLL22150_GetDiv1Source"); + _okPLL22150_GetDiv2Source = (OKPLL22150_GETDIV2SOURCE_FN) dll_entrypoint(hLib, "okPLL22150_GetDiv2Source"); + _okPLL22150_GetDiv1Divider = (OKPLL22150_GETDIV1DIVIDER_FN) dll_entrypoint(hLib, "okPLL22150_GetDiv1Divider"); + _okPLL22150_GetDiv2Divider = (OKPLL22150_GETDIV2DIVIDER_FN) dll_entrypoint(hLib, "okPLL22150_GetDiv2Divider"); + _okPLL22150_SetOutputSource = (OKPLL22150_SETOUTPUTSOURCE_FN) dll_entrypoint(hLib, "okPLL22150_SetOutputSource"); + _okPLL22150_SetOutputEnable = (OKPLL22150_SETOUTPUTENABLE_FN) dll_entrypoint(hLib, "okPLL22150_SetOutputEnable"); + _okPLL22150_GetOutputSource = (OKPLL22150_GETOUTPUTSOURCE_FN) dll_entrypoint(hLib, "okPLL22150_GetOutputSource"); + _okPLL22150_GetOutputFrequency = (OKPLL22150_GETOUTPUTFREQUENCY_FN) dll_entrypoint(hLib, "okPLL22150_GetOutputFrequency"); + _okPLL22150_IsOutputEnabled = (OKPLL22150_ISOUTPUTENABLED_FN) dll_entrypoint(hLib, "okPLL22150_IsOutputEnabled"); + _okPLL22150_InitFromProgrammingInfo = (OKPLL22150_INITFROMPROGRAMMINGINFO_FN) dll_entrypoint(hLib, "okPLL22150_InitFromProgrammingInfo"); + _okPLL22150_GetProgrammingInfo = (OKPLL22150_GETPROGRAMMINGINFO_FN) dll_entrypoint(hLib, "okPLL22150_GetProgrammingInfo"); + + _okPLL22393_Construct = (OKPLL22393_CONSTRUCT_FN) dll_entrypoint(hLib, "okPLL22393_Construct"); + _okPLL22393_Destruct = (OKPLL22393_DESTRUCT_FN) dll_entrypoint(hLib, "okPLL22393_Destruct"); + _okPLL22393_SetCrystalLoad = (OKPLL22393_SETCRYSTALLOAD_FN) dll_entrypoint(hLib, "okPLL22393_SetCrystalLoad"); + _okPLL22393_SetReference = (OKPLL22393_SETREFERENCE_FN) dll_entrypoint(hLib, "okPLL22393_SetReference"); + _okPLL22393_GetReference = (OKPLL22393_GETREFERENCE_FN) dll_entrypoint(hLib, "okPLL22393_GetReference"); + _okPLL22393_SetPLLParameters = (OKPLL22393_SETPLLPARAMETERS_FN) dll_entrypoint(hLib, "okPLL22393_SetPLLParameters"); + _okPLL22393_SetPLLLF = (OKPLL22393_SETPLLLF_FN) dll_entrypoint(hLib, "okPLL22393_SetPLLLF"); + _okPLL22393_SetOutputDivider = (OKPLL22393_SETOUTPUTDIVIDER_FN) dll_entrypoint(hLib, "okPLL22393_SetOutputDivider"); + _okPLL22393_SetOutputSource = (OKPLL22393_SETOUTPUTSOURCE_FN) dll_entrypoint(hLib, "okPLL22393_SetOutputSource"); + _okPLL22393_SetOutputEnable = (OKPLL22393_SETOUTPUTENABLE_FN) dll_entrypoint(hLib, "okPLL22393_SetOutputEnable"); + _okPLL22393_GetPLLP = (OKPLL22393_GETPLLP_FN) dll_entrypoint(hLib, "okPLL22393_GetPLLP"); + _okPLL22393_GetPLLQ = (OKPLL22393_GETPLLQ_FN) dll_entrypoint(hLib, "okPLL22393_GetPLLQ"); + _okPLL22393_GetPLLFrequency = (OKPLL22393_GETPLLFREQUENCY_FN) dll_entrypoint(hLib, "okPLL22393_GetPLLFrequency"); + _okPLL22393_GetOutputDivider = (OKPLL22393_GETOUTPUTDIVIDER_FN) dll_entrypoint(hLib, "okPLL22393_GetOutputDivider"); + _okPLL22393_GetOutputSource = (OKPLL22393_GETOUTPUTSOURCE_FN) dll_entrypoint(hLib, "okPLL22393_GetOutputSource"); + _okPLL22393_GetOutputFrequency = (OKPLL22393_GETOUTPUTFREQUENCY_FN) dll_entrypoint(hLib, "okPLL22393_GetOutputFrequency"); + _okPLL22393_IsOutputEnabled = (OKPLL22393_ISOUTPUTENABLED_FN) dll_entrypoint(hLib, "okPLL22393_IsOutputEnabled"); + _okPLL22393_IsPLLEnabled = (OKPLL22393_ISPLLENABLED_FN) dll_entrypoint(hLib, "okPLL22393_IsPLLEnabled"); + _okPLL22393_InitFromProgrammingInfo = (OKPLL22393_INITFROMPROGRAMMINGINFO_FN) dll_entrypoint(hLib, "okPLL22393_InitFromProgrammingInfo"); + _okPLL22393_GetProgrammingInfo = (OKPLL22393_GETPROGRAMMINGINFO_FN) dll_entrypoint(hLib, "okPLL22393_GetProgrammingInfo"); + + _okFrontPanel_Construct = (okFrontPanel_CONSTRUCT_FN) dll_entrypoint(hLib, "okFrontPanel_Construct"); + _okFrontPanel_Destruct = (okFrontPanel_DESTRUCT_FN) dll_entrypoint(hLib, "okFrontPanel_Destruct"); + _okFrontPanel_GetHostInterfaceWidth = (okFrontPanel_GETHOSTINTERFACEWIDTH_FN) dll_entrypoint(hLib, "okFrontPanel_GetHostInterfaceWidth"); + _okFrontPanel_IsHighSpeed = (okFrontPanel_ISHIGHSPEED_FN) dll_entrypoint(hLib, "okFrontPanel_IsHighSpeed"); + _okFrontPanel_GetBoardModel = (okFrontPanel_GETBOARDMODEL_FN) dll_entrypoint(hLib, "okFrontPanel_GetBoardModel"); + _okFrontPanel_GetBoardModelString = (okFrontPanel_GETBOARDMODELSTRING_FN) dll_entrypoint(hLib, "okFrontPanel_GetBoardModelString"); + _okFrontPanel_WriteI2C = (okFrontPanel_WRITEI2C_FN) dll_entrypoint(hLib, "okFrontPanel_WriteI2C"); + _okFrontPanel_ReadI2C = (okFrontPanel_READI2C_FN) dll_entrypoint(hLib, "okFrontPanel_ReadI2C"); + _okFrontPanel_GetDeviceCount = (okFrontPanel_GETDEVICECOUNT_FN) dll_entrypoint(hLib, "okFrontPanel_GetDeviceCount"); + _okFrontPanel_GetDeviceListModel = (okFrontPanel_GETDEVICELISTMODEL_FN) dll_entrypoint(hLib, "okFrontPanel_GetDeviceListModel"); + _okFrontPanel_GetDeviceListSerial = (okFrontPanel_GETDEVICELISTSERIAL_FN) dll_entrypoint(hLib, "okFrontPanel_GetDeviceListSerial"); + _okFrontPanel_OpenBySerial = (okFrontPanel_OPENBYSERIAL_FN) dll_entrypoint(hLib, "okFrontPanel_OpenBySerial"); + _okFrontPanel_IsOpen = (okFrontPanel_ISOPEN_FN) dll_entrypoint(hLib, "okFrontPanel_IsOpen"); + _okFrontPanel_SetBTPipePollingInterval = (okFrontPanel_SETBTPIPEPOLLINGINTERVAL_FN) dll_entrypoint(hLib, "okFrontPanel_SetBTPipePollingInterval"); + _okFrontPanel_SetTimeout = (okFrontPanel_SETTIMEOUT_FN) dll_entrypoint(hLib, "okFrontPanel_SetTimeout"); + _okFrontPanel_EnableAsynchronousTransfers = (okFrontPanel_ENABLEASYNCHRONOUSTRANSFERS_FN) dll_entrypoint(hLib, "okFrontPanel_EnableAsynchronousTransfers"); + _okFrontPanel_GetDeviceInfo = (okFrontPanel_GETDEVICEINFO_FN) dll_entrypoint(hLib, "okFrontPanel_GetDeviceInfo"); + _okFrontPanel_GetDeviceMajorVersion = (okFrontPanel_GETDEVICEMAJORVERSION_FN) dll_entrypoint(hLib, "okFrontPanel_GetDeviceMajorVersion"); + _okFrontPanel_GetDeviceMinorVersion = (okFrontPanel_GETDEVICEMINORVERSION_FN) dll_entrypoint(hLib, "okFrontPanel_GetDeviceMinorVersion"); + _okFrontPanel_ResetFPGA = (okFrontPanel_RESETFPGA_FN) dll_entrypoint(hLib, "okFrontPanel_ResetFPGA"); + _okFrontPanel_GetSerialNumber = (okFrontPanel_GETSERIALNUMBER_FN) dll_entrypoint(hLib, "okFrontPanel_GetSerialNumber"); + _okFrontPanel_GetDeviceID = (okFrontPanel_GETDEVICEID_FN) dll_entrypoint(hLib, "okFrontPanel_GetDeviceID"); + _okFrontPanel_SetDeviceID = (okFrontPanel_SETDEVICEID_FN) dll_entrypoint(hLib, "okFrontPanel_SetDeviceID"); + _okFrontPanel_ConfigureFPGA = (okFrontPanel_CONFIGUREFPGA_FN) dll_entrypoint(hLib, "okFrontPanel_ConfigureFPGA"); + _okFrontPanel_ConfigureFPGAFromMemory = (okFrontPanel_CONFIGUREFPGAFROMMEMORY_FN) dll_entrypoint(hLib, "okFrontPanel_ConfigureFPGAFromMemory"); + _okFrontPanel_GetPLL22150Configuration = (okFrontPanel_GETPLL22150CONFIGURATION_FN) dll_entrypoint(hLib, "okFrontPanel_GetPLL22150Configuration"); + _okFrontPanel_SetPLL22150Configuration = (okFrontPanel_SETPLL22150CONFIGURATION_FN) dll_entrypoint(hLib, "okFrontPanel_SetPLL22150Configuration"); + _okFrontPanel_GetEepromPLL22150Configuration = (okFrontPanel_GETEEPROMPLL22150CONFIGURATION_FN) dll_entrypoint(hLib, "okFrontPanel_GetEepromPLL22150Configuration"); + _okFrontPanel_SetEepromPLL22150Configuration = (okFrontPanel_SETEEPROMPLL22150CONFIGURATION_FN) dll_entrypoint(hLib, "okFrontPanel_SetEepromPLL22150Configuration"); + _okFrontPanel_GetPLL22393Configuration = (okFrontPanel_GETPLL22393CONFIGURATION_FN) dll_entrypoint(hLib, "okFrontPanel_GetPLL22393Configuration"); + _okFrontPanel_SetPLL22393Configuration = (okFrontPanel_SETPLL22393CONFIGURATION_FN) dll_entrypoint(hLib, "okFrontPanel_SetPLL22393Configuration"); + _okFrontPanel_GetEepromPLL22393Configuration = (okFrontPanel_GETEEPROMPLL22393CONFIGURATION_FN) dll_entrypoint(hLib, "okFrontPanel_GetEepromPLL22393Configuration"); + _okFrontPanel_SetEepromPLL22393Configuration = (okFrontPanel_SETEEPROMPLL22393CONFIGURATION_FN) dll_entrypoint(hLib, "okFrontPanel_SetEepromPLL22393Configuration"); + _okFrontPanel_LoadDefaultPLLConfiguration = (okFrontPanel_LOADDEFAULTPLLCONFIGURATION_FN) dll_entrypoint(hLib, "okFrontPanel_LoadDefaultPLLConfiguration"); + _okFrontPanel_IsFrontPanelEnabled = (okFrontPanel_ISFRONTPANELENABLED_FN) dll_entrypoint(hLib, "okFrontPanel_IsFrontPanelEnabled"); + _okFrontPanel_IsFrontPanel3Supported = (okFrontPanel_ISFRONTPANEL3SUPPORTED_FN) dll_entrypoint(hLib, "okFrontPanel_IsFrontPanel3Supported"); + _okFrontPanel_UpdateWireIns = (okFrontPanel_UPDATEWIREINS_FN) dll_entrypoint(hLib, "okFrontPanel_UpdateWireIns"); + _okFrontPanel_SetWireInValue = (okFrontPanel_SETWIREINVALUE_FN) dll_entrypoint(hLib, "okFrontPanel_SetWireInValue"); + _okFrontPanel_UpdateWireOuts = (okFrontPanel_UPDATEWIREOUTS_FN) dll_entrypoint(hLib, "okFrontPanel_UpdateWireOuts"); + _okFrontPanel_GetWireOutValue = (okFrontPanel_GETWIREOUTVALUE_FN) dll_entrypoint(hLib, "okFrontPanel_GetWireOutValue"); + _okFrontPanel_ActivateTriggerIn = (okFrontPanel_ACTIVATETRIGGERIN_FN) dll_entrypoint(hLib, "okFrontPanel_ActivateTriggerIn"); + _okFrontPanel_UpdateTriggerOuts = (okFrontPanel_UPDATETRIGGEROUTS_FN) dll_entrypoint(hLib, "okFrontPanel_UpdateTriggerOuts"); + _okFrontPanel_IsTriggered = (okFrontPanel_ISTRIGGERED_FN) dll_entrypoint(hLib, "okFrontPanel_IsTriggered"); + _okFrontPanel_GetLastTransferLength = (okFrontPanel_GETLASTTRANSFERLENGTH_FN) dll_entrypoint(hLib, "okFrontPanel_GetLastTransferLength"); + _okFrontPanel_WriteToPipeIn = (okFrontPanel_WRITETOPIPEIN_FN) dll_entrypoint(hLib, "okFrontPanel_WriteToPipeIn"); + _okFrontPanel_WriteToBlockPipeIn = (okFrontPanel_WRITETOBLOCKPIPEIN_FN) dll_entrypoint(hLib, "okFrontPanel_WriteToBlockPipeIn"); + _okFrontPanel_ReadFromPipeOut = (okFrontPanel_READFROMPIPEOUT_FN) dll_entrypoint(hLib, "okFrontPanel_ReadFromPipeOut"); + _okFrontPanel_ReadFromBlockPipeOut = (okFrontPanel_READFROMBLOCKPIPEOUT_FN) dll_entrypoint(hLib, "okFrontPanel_ReadFromBlockPipeOut"); + _okFrontPanel_FlashEraseSector = (okFrontPanel_FLASHERASESECTOR_FN) dll_entrypoint(hLib, "okFrontPanel_FlashEraseSector"); + _okFrontPanel_FlashWrite = (okFrontPanel_FLASHWRITE_FN) dll_entrypoint(hLib, "okFrontPanel_FlashWrite"); + _okFrontPanel_FlashRead = (okFrontPanel_FLASHREAD_FN) dll_entrypoint(hLib, "okFrontPanel_FlashRead"); + _okFrontPanel_GetFPGABootResetProfile = (okFrontPanel_GETFPGABOOTRESETPROFILE_FN) dll_entrypoint(hLib, "okFrontPanel_GetFPGABootResetProfile"); + _okFrontPanel_GetFPGAJTAGResetProfile = (okFrontPanel_GETFPGAJTAGRESETPROFILE_FN) dll_entrypoint(hLib, "okFrontPanel_GetFPGAJTAGResetProfile"); + _okFrontPanel_SetFPGABootResetProfile = (okFrontPanel_SETFPGABOOTRESETPROFILE_FN) dll_entrypoint(hLib, "okFrontPanel_SetFPGABootResetProfile"); + _okFrontPanel_SetFPGAJTAGResetProfile = (okFrontPanel_SETFPGAJTAGRESETPROFILE_FN) dll_entrypoint(hLib, "okFrontPanel_SetFPGAJTAGResetProfile"); + _okFrontPanel_ReadRegister = (okFrontPanel_READREGISTER_FN) dll_entrypoint(hLib, "okFrontPanel_ReadRegister"); + _okFrontPanel_ReadRegisterSet = (okFrontPanel_READREGISTERSET_FN) dll_entrypoint(hLib, "okFrontPanel_ReadRegisterSet"); + _okFrontPanel_WriteRegister = (okFrontPanel_WRITEREGISTER_FN) dll_entrypoint(hLib, "okFrontPanel_WriteRegister"); + _okFrontPanel_WriteRegisterSet = (okFrontPanel_WRITEREGISTERSET_FN) dll_entrypoint(hLib, "okFrontPanel_WriteRegisterSet"); + _okFrontPanel_GetWireInValue = (okFrontPanel_GETWIREINVALUE_FN) dll_entrypoint(hLib, "okFrontPanel_GetWireInValue"); + } + + if (NULL == hLib) + { + return(FALSE); } - - return(TRUE); + + return(TRUE); } void okFrontPanelDLL_FreeLib(void) { - _okFrontPanelDLL_GetVersion = NULL; - - _okFrontPanel_Construct = NULL; - _okFrontPanel_Destruct = NULL; - _okFrontPanel_GetHostInterfaceWidth = NULL; - _okFrontPanel_IsHighSpeed = NULL; - _okFrontPanel_GetBoardModel = NULL; - _okFrontPanel_GetBoardModelString = NULL; - _okFrontPanel_WriteI2C = NULL; - _okFrontPanel_ReadI2C = NULL; - _okFrontPanel_GetDeviceCount = NULL; - _okFrontPanel_GetDeviceListModel = NULL; - _okFrontPanel_GetDeviceListSerial = NULL; - _okFrontPanel_OpenBySerial = NULL; - _okFrontPanel_IsOpen = NULL; - _okFrontPanel_SetBTPipePollingInterval = NULL; - _okFrontPanel_SetTimeout = NULL; - _okFrontPanel_EnableAsynchronousTransfers = NULL; - _okFrontPanel_GetDeviceInfo = NULL; - _okFrontPanel_GetDeviceMajorVersion = NULL; - _okFrontPanel_GetDeviceMinorVersion = NULL; - _okFrontPanel_ResetFPGA = NULL; - _okFrontPanel_GetSerialNumber = NULL; - _okFrontPanel_GetDeviceID = NULL; - _okFrontPanel_SetDeviceID = NULL; - _okFrontPanel_ConfigureFPGA = NULL; - _okFrontPanel_ConfigureFPGAFromMemory = NULL; - _okFrontPanel_GetPLL22150Configuration = NULL; - _okFrontPanel_SetPLL22150Configuration = NULL; - _okFrontPanel_GetEepromPLL22150Configuration = NULL; - _okFrontPanel_SetEepromPLL22150Configuration = NULL; - _okFrontPanel_GetPLL22393Configuration = NULL; - _okFrontPanel_SetPLL22393Configuration = NULL; - _okFrontPanel_GetEepromPLL22393Configuration = NULL; - _okFrontPanel_SetEepromPLL22393Configuration = NULL; - _okFrontPanel_IsFrontPanelEnabled = NULL; - _okFrontPanel_IsFrontPanel3Supported = NULL; - _okFrontPanel_UpdateWireIns = NULL; - _okFrontPanel_SetWireInValue = NULL; - _okFrontPanel_UpdateWireOuts = NULL; - _okFrontPanel_GetWireOutValue = NULL; - _okFrontPanel_ActivateTriggerIn = NULL; - _okFrontPanel_UpdateTriggerOuts = NULL; - _okFrontPanel_IsTriggered = NULL; - _okFrontPanel_GetLastTransferLength = NULL; - _okFrontPanel_WriteToPipeIn = NULL; - _okFrontPanel_WriteToBlockPipeIn = NULL; - _okFrontPanel_ReadFromPipeOut = NULL; - _okFrontPanel_ReadFromBlockPipeOut = NULL; + _okFrontPanelDLL_GetVersion = NULL; + + _okFrontPanel_Construct = NULL; + _okFrontPanel_Destruct = NULL; + _okFrontPanel_GetHostInterfaceWidth = NULL; + _okFrontPanel_IsHighSpeed = NULL; + _okFrontPanel_GetBoardModel = NULL; + _okFrontPanel_GetBoardModelString = NULL; + _okFrontPanel_WriteI2C = NULL; + _okFrontPanel_ReadI2C = NULL; + _okFrontPanel_GetDeviceCount = NULL; + _okFrontPanel_GetDeviceListModel = NULL; + _okFrontPanel_GetDeviceListSerial = NULL; + _okFrontPanel_OpenBySerial = NULL; + _okFrontPanel_IsOpen = NULL; + _okFrontPanel_SetBTPipePollingInterval = NULL; + _okFrontPanel_SetTimeout = NULL; + _okFrontPanel_EnableAsynchronousTransfers = NULL; + _okFrontPanel_GetDeviceInfo = NULL; + _okFrontPanel_GetDeviceMajorVersion = NULL; + _okFrontPanel_GetDeviceMinorVersion = NULL; + _okFrontPanel_ResetFPGA = NULL; + _okFrontPanel_GetSerialNumber = NULL; + _okFrontPanel_GetDeviceID = NULL; + _okFrontPanel_SetDeviceID = NULL; + _okFrontPanel_ConfigureFPGA = NULL; + _okFrontPanel_ConfigureFPGAFromMemory = NULL; + _okFrontPanel_GetPLL22150Configuration = NULL; + _okFrontPanel_SetPLL22150Configuration = NULL; + _okFrontPanel_GetEepromPLL22150Configuration = NULL; + _okFrontPanel_SetEepromPLL22150Configuration = NULL; + _okFrontPanel_GetPLL22393Configuration = NULL; + _okFrontPanel_SetPLL22393Configuration = NULL; + _okFrontPanel_GetEepromPLL22393Configuration = NULL; + _okFrontPanel_SetEepromPLL22393Configuration = NULL; + _okFrontPanel_IsFrontPanelEnabled = NULL; + _okFrontPanel_IsFrontPanel3Supported = NULL; + _okFrontPanel_UpdateWireIns = NULL; + _okFrontPanel_SetWireInValue = NULL; + _okFrontPanel_UpdateWireOuts = NULL; + _okFrontPanel_GetWireOutValue = NULL; + _okFrontPanel_ActivateTriggerIn = NULL; + _okFrontPanel_UpdateTriggerOuts = NULL; + _okFrontPanel_IsTriggered = NULL; + _okFrontPanel_GetLastTransferLength = NULL; + _okFrontPanel_WriteToPipeIn = NULL; + _okFrontPanel_WriteToBlockPipeIn = NULL; + _okFrontPanel_ReadFromPipeOut = NULL; + _okFrontPanel_ReadFromBlockPipeOut = NULL; _okFrontPanel_FlashEraseSector = NULL; _okFrontPanel_FlashWrite = NULL; _okFrontPanel_FlashRead = NULL; @@ -800,53 +1007,54 @@ okFrontPanelDLL_FreeLib(void) _okFrontPanel_WriteRegisterSet = NULL; _okFrontPanel_GetWireInValue = NULL; - _okPLL22393_Construct = NULL; - _okPLL22393_Destruct = NULL; - _okPLL22393_SetCrystalLoad = NULL; - _okPLL22393_SetReference = NULL; - _okPLL22393_GetReference = NULL; - _okPLL22393_SetPLLParameters = NULL; - _okPLL22393_SetPLLLF = NULL; - _okPLL22393_SetOutputDivider = NULL; - _okPLL22393_SetOutputSource = NULL; - _okPLL22393_SetOutputEnable = NULL; - _okPLL22393_GetPLLP = NULL; - _okPLL22393_GetPLLQ = NULL; - _okPLL22393_GetPLLFrequency = NULL; - _okPLL22393_GetOutputDivider = NULL; - _okPLL22393_GetOutputSource = NULL; - _okPLL22393_GetOutputFrequency = NULL; - _okPLL22393_IsOutputEnabled = NULL; - _okPLL22393_IsPLLEnabled = NULL; - _okPLL22393_InitFromProgrammingInfo = NULL; - _okPLL22393_GetProgrammingInfo = NULL; - - _okPLL22150_Construct = NULL; - _okPLL22150_Destruct = NULL; - _okPLL22150_SetCrystalLoad = NULL; - _okPLL22150_SetReference = NULL; - _okPLL22150_GetReference = NULL; - _okPLL22150_SetVCOParameters = NULL; - _okPLL22150_GetVCOP = NULL; - _okPLL22150_GetVCOQ = NULL; - _okPLL22150_GetVCOFrequency = NULL; - _okPLL22150_SetDiv1 = NULL; - _okPLL22150_SetDiv2 = NULL; - _okPLL22150_GetDiv1Source = NULL; - _okPLL22150_GetDiv2Source = NULL; - _okPLL22150_GetDiv1Divider = NULL; - _okPLL22150_GetDiv2Divider = NULL; - _okPLL22150_SetOutputSource = NULL; - _okPLL22150_SetOutputEnable = NULL; - _okPLL22150_GetOutputSource = NULL; - _okPLL22150_GetOutputFrequency = NULL; - _okPLL22150_IsOutputEnabled = NULL; - _okPLL22150_InitFromProgrammingInfo = NULL; - _okPLL22150_GetProgrammingInfo = NULL; - - if (hLib) { - dll_unload(hLib); - hLib = NULL; + _okPLL22393_Construct = NULL; + _okPLL22393_Destruct = NULL; + _okPLL22393_SetCrystalLoad = NULL; + _okPLL22393_SetReference = NULL; + _okPLL22393_GetReference = NULL; + _okPLL22393_SetPLLParameters = NULL; + _okPLL22393_SetPLLLF = NULL; + _okPLL22393_SetOutputDivider = NULL; + _okPLL22393_SetOutputSource = NULL; + _okPLL22393_SetOutputEnable = NULL; + _okPLL22393_GetPLLP = NULL; + _okPLL22393_GetPLLQ = NULL; + _okPLL22393_GetPLLFrequency = NULL; + _okPLL22393_GetOutputDivider = NULL; + _okPLL22393_GetOutputSource = NULL; + _okPLL22393_GetOutputFrequency = NULL; + _okPLL22393_IsOutputEnabled = NULL; + _okPLL22393_IsPLLEnabled = NULL; + _okPLL22393_InitFromProgrammingInfo = NULL; + _okPLL22393_GetProgrammingInfo = NULL; + + _okPLL22150_Construct = NULL; + _okPLL22150_Destruct = NULL; + _okPLL22150_SetCrystalLoad = NULL; + _okPLL22150_SetReference = NULL; + _okPLL22150_GetReference = NULL; + _okPLL22150_SetVCOParameters = NULL; + _okPLL22150_GetVCOP = NULL; + _okPLL22150_GetVCOQ = NULL; + _okPLL22150_GetVCOFrequency = NULL; + _okPLL22150_SetDiv1 = NULL; + _okPLL22150_SetDiv2 = NULL; + _okPLL22150_GetDiv1Source = NULL; + _okPLL22150_GetDiv2Source = NULL; + _okPLL22150_GetDiv1Divider = NULL; + _okPLL22150_GetDiv2Divider = NULL; + _okPLL22150_SetOutputSource = NULL; + _okPLL22150_SetOutputEnable = NULL; + _okPLL22150_GetOutputSource = NULL; + _okPLL22150_GetOutputFrequency = NULL; + _okPLL22150_IsOutputEnabled = NULL; + _okPLL22150_InitFromProgrammingInfo = NULL; + _okPLL22150_GetProgrammingInfo = NULL; + + if (hLib) + { + dll_unload(hLib); + hLib = NULL; } } @@ -855,148 +1063,169 @@ okFrontPanelDLL_FreeLib(void) // Function calls - General //------------------------------------------------------------------------ okDLLEXPORT void DLL_ENTRY -okFrontPanelDLL_GetVersion(char *date, char *time) { +okFrontPanelDLL_GetVersion(char* date, char* time) +{ - if (_okFrontPanelDLL_GetVersion) - (*_okFrontPanelDLL_GetVersion)(date, time); + if (_okFrontPanelDLL_GetVersion) + (*_okFrontPanelDLL_GetVersion)(date, time); } //------------------------------------------------------------------------ // Function calls - okCPLL22393 //------------------------------------------------------------------------ okDLLEXPORT okPLL22393_HANDLE DLL_ENTRY -okPLL22393_Construct() { - if (_okPLL22393_Construct) - return((*_okPLL22393_Construct)()); +okPLL22393_Construct() +{ + if (_okPLL22393_Construct) + return((*_okPLL22393_Construct)()); - return(NULL); + return(NULL); } okDLLEXPORT void DLL_ENTRY -okPLL22393_Destruct(okPLL22393_HANDLE pll) { - if (_okPLL22393_Destruct) - (*_okPLL22393_Destruct)(pll); +okPLL22393_Destruct(okPLL22393_HANDLE pll) +{ + if (_okPLL22393_Destruct) + (*_okPLL22393_Destruct)(pll); } okDLLEXPORT void DLL_ENTRY -okPLL22393_SetCrystalLoad(okPLL22393_HANDLE pll, double capload) { - if (_okPLL22393_SetCrystalLoad) - (*_okPLL22393_SetCrystalLoad)(pll, capload); +okPLL22393_SetCrystalLoad(okPLL22393_HANDLE pll, double capload) +{ + if (_okPLL22393_SetCrystalLoad) + (*_okPLL22393_SetCrystalLoad)(pll, capload); } okDLLEXPORT void DLL_ENTRY -okPLL22393_SetReference(okPLL22393_HANDLE pll, double freq) { - if (_okPLL22393_SetReference) - (*_okPLL22393_SetReference)(pll, freq); +okPLL22393_SetReference(okPLL22393_HANDLE pll, double freq) +{ + if (_okPLL22393_SetReference) + (*_okPLL22393_SetReference)(pll, freq); } okDLLEXPORT double DLL_ENTRY -okPLL22393_GetReference(okPLL22393_HANDLE pll) { - if (_okPLL22393_GetReference) - return((*_okPLL22393_GetReference)(pll)); - return(0.0); +okPLL22393_GetReference(okPLL22393_HANDLE pll) +{ + if (_okPLL22393_GetReference) + return((*_okPLL22393_GetReference)(pll)); + return(0.0); } okDLLEXPORT Bool DLL_ENTRY -okPLL22393_SetPLLParameters(okPLL22393_HANDLE pll, int n, int p, int q, Bool enable) { - if (_okPLL22393_SetPLLParameters) - return((*_okPLL22393_SetPLLParameters)(pll, n, p, q, enable)); - return(FALSE); +okPLL22393_SetPLLParameters(okPLL22393_HANDLE pll, int n, int p, int q, Bool enable) +{ + if (_okPLL22393_SetPLLParameters) + return((*_okPLL22393_SetPLLParameters)(pll, n, p, q, enable)); + return(FALSE); } okDLLEXPORT Bool DLL_ENTRY -okPLL22393_SetPLLLF(okPLL22393_HANDLE pll, int n, int lf) { - if (_okPLL22393_SetPLLLF) - return((*_okPLL22393_SetPLLLF)(pll, n, lf)); - return(FALSE); +okPLL22393_SetPLLLF(okPLL22393_HANDLE pll, int n, int lf) +{ + if (_okPLL22393_SetPLLLF) + return((*_okPLL22393_SetPLLLF)(pll, n, lf)); + return(FALSE); } okDLLEXPORT Bool DLL_ENTRY -okPLL22393_SetOutputDivider(okPLL22393_HANDLE pll, int n, int div) { - if (_okPLL22393_SetOutputDivider) - return((*_okPLL22393_SetOutputDivider)(pll, n, div)); - return(FALSE); +okPLL22393_SetOutputDivider(okPLL22393_HANDLE pll, int n, int div) +{ + if (_okPLL22393_SetOutputDivider) + return((*_okPLL22393_SetOutputDivider)(pll, n, div)); + return(FALSE); } okDLLEXPORT Bool DLL_ENTRY -okPLL22393_SetOutputSource(okPLL22393_HANDLE pll, int n, ok_ClockSource_22393 clksrc) { - if (_okPLL22393_SetOutputSource) - return((*_okPLL22393_SetOutputSource)(pll, n, clksrc)); - return(FALSE); +okPLL22393_SetOutputSource(okPLL22393_HANDLE pll, int n, ok_ClockSource_22393 clksrc) +{ + if (_okPLL22393_SetOutputSource) + return((*_okPLL22393_SetOutputSource)(pll, n, clksrc)); + return(FALSE); } okDLLEXPORT void DLL_ENTRY -okPLL22393_SetOutputEnable(okPLL22393_HANDLE pll, int n, Bool enable) { - if (_okPLL22393_SetOutputEnable) - (*_okPLL22393_SetOutputEnable)(pll, n, enable); +okPLL22393_SetOutputEnable(okPLL22393_HANDLE pll, int n, Bool enable) +{ + if (_okPLL22393_SetOutputEnable) + (*_okPLL22393_SetOutputEnable)(pll, n, enable); } okDLLEXPORT int DLL_ENTRY -okPLL22393_GetPLLP(okPLL22393_HANDLE pll, int n) { - if (_okPLL22393_GetPLLP) - return((*_okPLL22393_GetPLLP)(pll, n)); - return(0); +okPLL22393_GetPLLP(okPLL22393_HANDLE pll, int n) +{ + if (_okPLL22393_GetPLLP) + return((*_okPLL22393_GetPLLP)(pll, n)); + return(0); } okDLLEXPORT int DLL_ENTRY -okPLL22393_GetPLLQ(okPLL22393_HANDLE pll, int n) { - if (_okPLL22393_GetPLLQ) - return((*_okPLL22393_GetPLLQ)(pll, n)); - return(0); +okPLL22393_GetPLLQ(okPLL22393_HANDLE pll, int n) +{ + if (_okPLL22393_GetPLLQ) + return((*_okPLL22393_GetPLLQ)(pll, n)); + return(0); } okDLLEXPORT double DLL_ENTRY -okPLL22393_GetPLLFrequency(okPLL22393_HANDLE pll, int n) { - if (_okPLL22393_GetPLLFrequency) - return((*_okPLL22393_GetPLLFrequency)(pll, n)); - return(0.0); +okPLL22393_GetPLLFrequency(okPLL22393_HANDLE pll, int n) +{ + if (_okPLL22393_GetPLLFrequency) + return((*_okPLL22393_GetPLLFrequency)(pll, n)); + return(0.0); } okDLLEXPORT int DLL_ENTRY -okPLL22393_GetOutputDivider(okPLL22393_HANDLE pll, int n) { - if (_okPLL22393_GetOutputDivider) - return((*_okPLL22393_GetOutputDivider)(pll, n)); - return(0); +okPLL22393_GetOutputDivider(okPLL22393_HANDLE pll, int n) +{ + if (_okPLL22393_GetOutputDivider) + return((*_okPLL22393_GetOutputDivider)(pll, n)); + return(0); } okDLLEXPORT ok_ClockSource_22393 DLL_ENTRY -okPLL22393_GetOutputSource(okPLL22393_HANDLE pll, int n) { - if (_okPLL22393_GetOutputSource) - return((*_okPLL22393_GetOutputSource)(pll, n)); - return(ok_ClkSrc22393_Ref); +okPLL22393_GetOutputSource(okPLL22393_HANDLE pll, int n) +{ + if (_okPLL22393_GetOutputSource) + return((*_okPLL22393_GetOutputSource)(pll, n)); + return(ok_ClkSrc22393_Ref); } okDLLEXPORT double DLL_ENTRY -okPLL22393_GetOutputFrequency(okPLL22393_HANDLE pll, int n) { - if (_okPLL22393_GetOutputFrequency) - return((*_okPLL22393_GetOutputFrequency)(pll, n)); - return(0.0); +okPLL22393_GetOutputFrequency(okPLL22393_HANDLE pll, int n) +{ + if (_okPLL22393_GetOutputFrequency) + return((*_okPLL22393_GetOutputFrequency)(pll, n)); + return(0.0); } okDLLEXPORT Bool DLL_ENTRY -okPLL22393_IsOutputEnabled(okPLL22393_HANDLE pll, int n) { - if (_okPLL22393_IsOutputEnabled) - return((*_okPLL22393_IsOutputEnabled)(pll, n)); - return(FALSE); +okPLL22393_IsOutputEnabled(okPLL22393_HANDLE pll, int n) +{ + if (_okPLL22393_IsOutputEnabled) + return((*_okPLL22393_IsOutputEnabled)(pll, n)); + return(FALSE); } okDLLEXPORT Bool DLL_ENTRY -okPLL22393_IsPLLEnabled(okPLL22393_HANDLE pll, int n) { - if (_okPLL22393_IsPLLEnabled) - return((*_okPLL22393_IsPLLEnabled)(pll, n)); - return(FALSE); +okPLL22393_IsPLLEnabled(okPLL22393_HANDLE pll, int n) +{ + if (_okPLL22393_IsPLLEnabled) + return((*_okPLL22393_IsPLLEnabled)(pll, n)); + return(FALSE); } okDLLEXPORT void DLL_ENTRY -okPLL22393_InitFromProgrammingInfo(okPLL22393_HANDLE pll, unsigned char *buf) { - if (_okPLL22393_InitFromProgrammingInfo) - (*_okPLL22393_InitFromProgrammingInfo)(pll, buf); +okPLL22393_InitFromProgrammingInfo(okPLL22393_HANDLE pll, unsigned char* buf) +{ + if (_okPLL22393_InitFromProgrammingInfo) + (*_okPLL22393_InitFromProgrammingInfo)(pll, buf); } okDLLEXPORT void DLL_ENTRY -okPLL22393_GetProgrammingInfo(okPLL22393_HANDLE pll, unsigned char *buf) { - if (_okPLL22393_GetProgrammingInfo) - (*_okPLL22393_GetProgrammingInfo)(pll, buf); +okPLL22393_GetProgrammingInfo(okPLL22393_HANDLE pll, unsigned char* buf) +{ + if (_okPLL22393_GetProgrammingInfo) + (*_okPLL22393_GetProgrammingInfo)(pll, buf); } @@ -1006,181 +1235,181 @@ okPLL22393_GetProgrammingInfo(okPLL22393_HANDLE pll, unsigned char *buf) { okDLLEXPORT okPLL22150_HANDLE DLL_ENTRY okPLL22150_Construct() { - if (_okPLL22150_Construct) - return((*_okPLL22150_Construct)()); + if (_okPLL22150_Construct) + return((*_okPLL22150_Construct)()); - return(NULL); + return(NULL); } okDLLEXPORT void DLL_ENTRY okPLL22150_Destruct(okPLL22150_HANDLE pll) { - if (_okPLL22150_Destruct) - (*_okPLL22150_Destruct)(pll); + if (_okPLL22150_Destruct) + (*_okPLL22150_Destruct)(pll); } okDLLEXPORT void DLL_ENTRY okPLL22150_SetCrystalLoad(okPLL22150_HANDLE pll, double capload) { - if (_okPLL22150_SetCrystalLoad) - (*_okPLL22150_SetCrystalLoad)(pll, capload); + if (_okPLL22150_SetCrystalLoad) + (*_okPLL22150_SetCrystalLoad)(pll, capload); } okDLLEXPORT void DLL_ENTRY okPLL22150_SetReference(okPLL22150_HANDLE pll, double freq, Bool extosc) { - if (_okPLL22150_SetReference) - (*_okPLL22150_SetReference)(pll, freq, extosc); + if (_okPLL22150_SetReference) + (*_okPLL22150_SetReference)(pll, freq, extosc); } okDLLEXPORT double DLL_ENTRY okPLL22150_GetReference(okPLL22150_HANDLE pll) { - if (_okPLL22150_GetReference) - return((*_okPLL22150_GetReference)(pll)); + if (_okPLL22150_GetReference) + return((*_okPLL22150_GetReference)(pll)); - return(0.0); + return(0.0); } okDLLEXPORT Bool DLL_ENTRY okPLL22150_SetVCOParameters(okPLL22150_HANDLE pll, int p, int q) { - if (_okPLL22150_SetVCOParameters) - return((*_okPLL22150_SetVCOParameters)(pll, p, q)); + if (_okPLL22150_SetVCOParameters) + return((*_okPLL22150_SetVCOParameters)(pll, p, q)); - return(FALSE); + return(FALSE); } okDLLEXPORT int DLL_ENTRY okPLL22150_GetVCOP(okPLL22150_HANDLE pll) { - if (_okPLL22150_GetVCOP) - return((*_okPLL22150_GetVCOP)(pll)); + if (_okPLL22150_GetVCOP) + return((*_okPLL22150_GetVCOP)(pll)); - return(0); + return(0); } okDLLEXPORT int DLL_ENTRY okPLL22150_GetVCOQ(okPLL22150_HANDLE pll) { - if (_okPLL22150_GetVCOQ) - return((*_okPLL22150_GetVCOQ)(pll)); + if (_okPLL22150_GetVCOQ) + return((*_okPLL22150_GetVCOQ)(pll)); - return(0); + return(0); } okDLLEXPORT double DLL_ENTRY okPLL22150_GetVCOFrequency(okPLL22150_HANDLE pll) { - if (_okPLL22150_GetVCOFrequency) - return((*_okPLL22150_GetVCOFrequency)(pll)); + if (_okPLL22150_GetVCOFrequency) + return((*_okPLL22150_GetVCOFrequency)(pll)); - return(0.0); + return(0.0); } okDLLEXPORT void DLL_ENTRY okPLL22150_SetDiv1(okPLL22150_HANDLE pll, ok_DividerSource divsrc, int n) { - if (_okPLL22150_SetDiv1) - (*_okPLL22150_SetDiv1)(pll, divsrc, n); + if (_okPLL22150_SetDiv1) + (*_okPLL22150_SetDiv1)(pll, divsrc, n); } okDLLEXPORT void DLL_ENTRY okPLL22150_SetDiv2(okPLL22150_HANDLE pll, ok_DividerSource divsrc, int n) { - if (_okPLL22150_SetDiv2) - (*_okPLL22150_SetDiv2)(pll, divsrc, n); + if (_okPLL22150_SetDiv2) + (*_okPLL22150_SetDiv2)(pll, divsrc, n); } okDLLEXPORT ok_DividerSource DLL_ENTRY okPLL22150_GetDiv1Source(okPLL22150_HANDLE pll) { - if (_okPLL22150_GetDiv1Source) - return((*_okPLL22150_GetDiv1Source)(pll)); + if (_okPLL22150_GetDiv1Source) + return((*_okPLL22150_GetDiv1Source)(pll)); - return(ok_DivSrc_Ref); + return(ok_DivSrc_Ref); } okDLLEXPORT ok_DividerSource DLL_ENTRY okPLL22150_GetDiv2Source(okPLL22150_HANDLE pll) { - if (_okPLL22150_GetDiv2Source) - return((*_okPLL22150_GetDiv2Source)(pll)); + if (_okPLL22150_GetDiv2Source) + return((*_okPLL22150_GetDiv2Source)(pll)); - return(ok_DivSrc_Ref); + return(ok_DivSrc_Ref); } okDLLEXPORT int DLL_ENTRY okPLL22150_GetDiv1Divider(okPLL22150_HANDLE pll) { - if (_okPLL22150_GetDiv1Divider) - return((*_okPLL22150_GetDiv1Divider)(pll)); + if (_okPLL22150_GetDiv1Divider) + return((*_okPLL22150_GetDiv1Divider)(pll)); - return(0); + return(0); } okDLLEXPORT int DLL_ENTRY okPLL22150_GetDiv2Divider(okPLL22150_HANDLE pll) { - if (_okPLL22150_GetDiv2Divider) - return((*_okPLL22150_GetDiv2Divider)(pll)); + if (_okPLL22150_GetDiv2Divider) + return((*_okPLL22150_GetDiv2Divider)(pll)); - return(0); + return(0); } okDLLEXPORT void DLL_ENTRY okPLL22150_SetOutputSource(okPLL22150_HANDLE pll, int output, ok_ClockSource_22150 clksrc) { - if (_okPLL22150_SetOutputSource) - (*_okPLL22150_SetOutputSource)(pll, output, clksrc); + if (_okPLL22150_SetOutputSource) + (*_okPLL22150_SetOutputSource)(pll, output, clksrc); } okDLLEXPORT void DLL_ENTRY okPLL22150_SetOutputEnable(okPLL22150_HANDLE pll, int output, Bool enable) { - if (_okPLL22150_SetOutputEnable) - (*_okPLL22150_SetOutputEnable)(pll, output, enable); + if (_okPLL22150_SetOutputEnable) + (*_okPLL22150_SetOutputEnable)(pll, output, enable); } okDLLEXPORT ok_ClockSource_22150 DLL_ENTRY okPLL22150_GetOutputSource(okPLL22150_HANDLE pll, int output) { - if (_okPLL22150_GetOutputSource) - return((*_okPLL22150_GetOutputSource)(pll, output)); + if (_okPLL22150_GetOutputSource) + return((*_okPLL22150_GetOutputSource)(pll, output)); - return(ok_ClkSrc22150_Ref); + return(ok_ClkSrc22150_Ref); } okDLLEXPORT double DLL_ENTRY okPLL22150_GetOutputFrequency(okPLL22150_HANDLE pll, int output) { - if (_okPLL22150_GetOutputFrequency) - return((*_okPLL22150_GetOutputFrequency)(pll, output)); + if (_okPLL22150_GetOutputFrequency) + return((*_okPLL22150_GetOutputFrequency)(pll, output)); - return(0.0); + return(0.0); } okDLLEXPORT Bool DLL_ENTRY okPLL22150_IsOutputEnabled(okPLL22150_HANDLE pll, int output) { - if (_okPLL22150_IsOutputEnabled) - return((*_okPLL22150_IsOutputEnabled)(pll, output)); + if (_okPLL22150_IsOutputEnabled) + return((*_okPLL22150_IsOutputEnabled)(pll, output)); - return(FALSE); + return(FALSE); } okDLLEXPORT void DLL_ENTRY -okPLL22150_InitFromProgrammingInfo(okPLL22150_HANDLE pll, unsigned char *buf) +okPLL22150_InitFromProgrammingInfo(okPLL22150_HANDLE pll, unsigned char* buf) { - if (_okPLL22150_InitFromProgrammingInfo) - (*_okPLL22150_InitFromProgrammingInfo)(pll, buf); + if (_okPLL22150_InitFromProgrammingInfo) + (*_okPLL22150_InitFromProgrammingInfo)(pll, buf); } okDLLEXPORT void DLL_ENTRY -okPLL22150_GetProgrammingInfo(okPLL22150_HANDLE pll, unsigned char *buf) +okPLL22150_GetProgrammingInfo(okPLL22150_HANDLE pll, unsigned char* buf) { - if (_okPLL22150_GetProgrammingInfo) - (*_okPLL22150_GetProgrammingInfo)(pll, buf); + if (_okPLL22150_GetProgrammingInfo) + (*_okPLL22150_GetProgrammingInfo)(pll, buf); } @@ -1190,541 +1419,541 @@ okPLL22150_GetProgrammingInfo(okPLL22150_HANDLE pll, unsigned char *buf) okDLLEXPORT okFrontPanel_HANDLE DLL_ENTRY okFrontPanel_Construct() { - if (_okFrontPanel_Construct) - return((*_okFrontPanel_Construct)()); + if (_okFrontPanel_Construct) + return((*_okFrontPanel_Construct)()); - return(NULL); + return(NULL); } okDLLEXPORT void DLL_ENTRY okFrontPanel_Destruct(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_Destruct) - (*_okFrontPanel_Destruct)(hnd); + if (_okFrontPanel_Destruct) + (*_okFrontPanel_Destruct)(hnd); } okDLLEXPORT int DLL_ENTRY okFrontPanel_GetHostInterfaceWidth(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_GetHostInterfaceWidth) - return((*_okFrontPanel_GetHostInterfaceWidth)(hnd)); + if (_okFrontPanel_GetHostInterfaceWidth) + return((*_okFrontPanel_GetHostInterfaceWidth)(hnd)); - return(FALSE); + return(FALSE); } okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsHighSpeed(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_IsHighSpeed) - return((*_okFrontPanel_IsHighSpeed)(hnd)); + if (_okFrontPanel_IsHighSpeed) + return((*_okFrontPanel_IsHighSpeed)(hnd)); - return(FALSE); + return(FALSE); } okDLLEXPORT ok_BoardModel DLL_ENTRY okFrontPanel_GetBoardModel(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_GetBoardModel) - return((*_okFrontPanel_GetBoardModel)(hnd)); + if (_okFrontPanel_GetBoardModel) + return((*_okFrontPanel_GetBoardModel)(hnd)); - return(ok_brdUnknown); + return(ok_brdUnknown); } okDLLEXPORT void DLL_ENTRY -okFrontPanel_GetBoardModelString(okFrontPanel_HANDLE hnd, ok_BoardModel m, char *str) +okFrontPanel_GetBoardModelString(okFrontPanel_HANDLE hnd, ok_BoardModel m, char* str) { - if (_okFrontPanel_GetBoardModelString) - (*_okFrontPanel_GetBoardModelString)(hnd, m, str); + if (_okFrontPanel_GetBoardModelString) + (*_okFrontPanel_GetBoardModelString)(hnd, m, str); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_WriteI2C(okFrontPanel_HANDLE hnd, const int addr, int length, unsigned char *data) +okFrontPanel_WriteI2C(okFrontPanel_HANDLE hnd, const int addr, int length, unsigned char* data) { - if (_okFrontPanel_WriteI2C) - return((*_okFrontPanel_WriteI2C)(hnd, addr, length, data)); + if (_okFrontPanel_WriteI2C) + return((*_okFrontPanel_WriteI2C)(hnd, addr, length, data)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_ReadI2C(okFrontPanel_HANDLE hnd, const int addr, int length, unsigned char *data) +okFrontPanel_ReadI2C(okFrontPanel_HANDLE hnd, const int addr, int length, unsigned char* data) { - if (_okFrontPanel_ReadI2C) - return((*_okFrontPanel_ReadI2C)(hnd, addr, length, data)); + if (_okFrontPanel_ReadI2C) + return((*_okFrontPanel_ReadI2C)(hnd, addr, length, data)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT int DLL_ENTRY okFrontPanel_GetDeviceCount(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_GetDeviceCount) - return((*_okFrontPanel_GetDeviceCount)(hnd)); + if (_okFrontPanel_GetDeviceCount) + return((*_okFrontPanel_GetDeviceCount)(hnd)); - return(0); + return(0); } okDLLEXPORT ok_BoardModel DLL_ENTRY okFrontPanel_GetDeviceListModel(okFrontPanel_HANDLE hnd, int num) { - if (_okFrontPanel_GetDeviceListModel) - return((*_okFrontPanel_GetDeviceListModel)(hnd, num)); + if (_okFrontPanel_GetDeviceListModel) + return((*_okFrontPanel_GetDeviceListModel)(hnd, num)); - return(ok_brdUnknown); + return(ok_brdUnknown); } okDLLEXPORT void DLL_ENTRY -okFrontPanel_GetDeviceListSerial(okFrontPanel_HANDLE hnd, int num, char *str) +okFrontPanel_GetDeviceListSerial(okFrontPanel_HANDLE hnd, int num, char* str) { - if (_okFrontPanel_GetDeviceListSerial) - (*_okFrontPanel_GetDeviceListSerial)(hnd, num, str); + if (_okFrontPanel_GetDeviceListSerial) + (*_okFrontPanel_GetDeviceListSerial)(hnd, num, str); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_OpenBySerial(okFrontPanel_HANDLE hnd, const char *serial) +okFrontPanel_OpenBySerial(okFrontPanel_HANDLE hnd, const char* serial) { - if (_okFrontPanel_OpenBySerial) - return((*_okFrontPanel_OpenBySerial)(hnd, serial)); + if (_okFrontPanel_OpenBySerial) + return((*_okFrontPanel_OpenBySerial)(hnd, serial)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsOpen(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_IsOpen) - return((*_okFrontPanel_IsOpen)(hnd)); + if (_okFrontPanel_IsOpen) + return((*_okFrontPanel_IsOpen)(hnd)); - return(FALSE); + return(FALSE); } okDLLEXPORT void DLL_ENTRY okFrontPanel_EnableAsynchronousTransfers(okFrontPanel_HANDLE hnd, Bool enable) { - if (_okFrontPanel_EnableAsynchronousTransfers) - (*_okFrontPanel_EnableAsynchronousTransfers)(hnd, enable); + if (_okFrontPanel_EnableAsynchronousTransfers) + (*_okFrontPanel_EnableAsynchronousTransfers)(hnd, enable); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetBTPipePollingInterval(okFrontPanel_HANDLE hnd, int interval) { - if (_okFrontPanel_SetBTPipePollingInterval) - return((*_okFrontPanel_SetBTPipePollingInterval)(hnd, interval)); + if (_okFrontPanel_SetBTPipePollingInterval) + return((*_okFrontPanel_SetBTPipePollingInterval)(hnd, interval)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT void DLL_ENTRY okFrontPanel_SetTimeout(okFrontPanel_HANDLE hnd, int timeout) { - if (_okFrontPanel_SetTimeout) - (*_okFrontPanel_SetTimeout)(hnd, timeout); + if (_okFrontPanel_SetTimeout) + (*_okFrontPanel_SetTimeout)(hnd, timeout); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_GetDeviceInfo(okFrontPanel_HANDLE hnd, okTDeviceInfo *info) +okFrontPanel_GetDeviceInfo(okFrontPanel_HANDLE hnd, okTDeviceInfo* info) { - if (_okFrontPanel_GetDeviceInfo) - return((*_okFrontPanel_GetDeviceInfo)(hnd, info)); + if (_okFrontPanel_GetDeviceInfo) + return((*_okFrontPanel_GetDeviceInfo)(hnd, info)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT int DLL_ENTRY okFrontPanel_GetDeviceMajorVersion(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_GetDeviceMajorVersion) - return((*_okFrontPanel_GetDeviceMajorVersion)(hnd)); + if (_okFrontPanel_GetDeviceMajorVersion) + return((*_okFrontPanel_GetDeviceMajorVersion)(hnd)); - return(0); + return(0); } okDLLEXPORT int DLL_ENTRY okFrontPanel_GetDeviceMinorVersion(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_GetDeviceMinorVersion) - return((*_okFrontPanel_GetDeviceMinorVersion)(hnd)); + if (_okFrontPanel_GetDeviceMinorVersion) + return((*_okFrontPanel_GetDeviceMinorVersion)(hnd)); - return(0); + return(0); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ResetFPGA(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_ResetFPGA) - return((*_okFrontPanel_ResetFPGA)(hnd)); + if (_okFrontPanel_ResetFPGA) + return((*_okFrontPanel_ResetFPGA)(hnd)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT void DLL_ENTRY -okFrontPanel_GetSerialNumber(okFrontPanel_HANDLE hnd, char *buf) +okFrontPanel_GetSerialNumber(okFrontPanel_HANDLE hnd, char* buf) { - if (_okFrontPanel_GetSerialNumber) - (*_okFrontPanel_GetSerialNumber)(hnd, buf); + if (_okFrontPanel_GetSerialNumber) + (*_okFrontPanel_GetSerialNumber)(hnd, buf); } okDLLEXPORT void DLL_ENTRY -okFrontPanel_GetDeviceID(okFrontPanel_HANDLE hnd, char *buf) +okFrontPanel_GetDeviceID(okFrontPanel_HANDLE hnd, char* buf) { - if (_okFrontPanel_GetDeviceID) - (*_okFrontPanel_GetDeviceID)(hnd, buf); + if (_okFrontPanel_GetDeviceID) + (*_okFrontPanel_GetDeviceID)(hnd, buf); } okDLLEXPORT void DLL_ENTRY -okFrontPanel_SetDeviceID(okFrontPanel_HANDLE hnd, const char *strID) +okFrontPanel_SetDeviceID(okFrontPanel_HANDLE hnd, const char* strID) { - if (_okFrontPanel_SetDeviceID) - (*_okFrontPanel_SetDeviceID)(hnd, strID); + if (_okFrontPanel_SetDeviceID) + (*_okFrontPanel_SetDeviceID)(hnd, strID); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_ConfigureFPGA(okFrontPanel_HANDLE hnd, const char *strFilename) +okFrontPanel_ConfigureFPGA(okFrontPanel_HANDLE hnd, const char* strFilename) { - if (_okFrontPanel_ConfigureFPGA) - return((*_okFrontPanel_ConfigureFPGA)(hnd, strFilename)); + if (_okFrontPanel_ConfigureFPGA) + return((*_okFrontPanel_ConfigureFPGA)(hnd, strFilename)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_ConfigureFPGAFromMemory(okFrontPanel_HANDLE hnd, unsigned char *data, unsigned long length) +okFrontPanel_ConfigureFPGAFromMemory(okFrontPanel_HANDLE hnd, unsigned char* data, unsigned long length) { - if (_okFrontPanel_ConfigureFPGAFromMemory) - return((*_okFrontPanel_ConfigureFPGAFromMemory)(hnd, data, length)); + if (_okFrontPanel_ConfigureFPGAFromMemory) + return((*_okFrontPanel_ConfigureFPGAFromMemory)(hnd, data, length)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetPLL22150Configuration(okFrontPanel_HANDLE hnd, okPLL22150_HANDLE pll) { - if (_okFrontPanel_GetPLL22150Configuration) - return((*_okFrontPanel_GetPLL22150Configuration)(hnd, pll)); + if (_okFrontPanel_GetPLL22150Configuration) + return((*_okFrontPanel_GetPLL22150Configuration)(hnd, pll)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetPLL22150Configuration(okFrontPanel_HANDLE hnd, okPLL22150_HANDLE pll) { - if (_okFrontPanel_SetPLL22150Configuration) - return((*_okFrontPanel_SetPLL22150Configuration)(hnd, pll)); + if (_okFrontPanel_SetPLL22150Configuration) + return((*_okFrontPanel_SetPLL22150Configuration)(hnd, pll)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetEepromPLL22150Configuration(okFrontPanel_HANDLE hnd, okPLL22150_HANDLE pll) { - if (_okFrontPanel_GetEepromPLL22150Configuration) - return((*_okFrontPanel_GetEepromPLL22150Configuration)(hnd, pll)); + if (_okFrontPanel_GetEepromPLL22150Configuration) + return((*_okFrontPanel_GetEepromPLL22150Configuration)(hnd, pll)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetEepromPLL22150Configuration(okFrontPanel_HANDLE hnd, okPLL22150_HANDLE pll) { - if (_okFrontPanel_SetEepromPLL22150Configuration) - return((*_okFrontPanel_SetEepromPLL22150Configuration)(hnd, pll)); + if (_okFrontPanel_SetEepromPLL22150Configuration) + return((*_okFrontPanel_SetEepromPLL22150Configuration)(hnd, pll)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetPLL22393Configuration(okFrontPanel_HANDLE hnd, okPLL22393_HANDLE pll) { - if (_okFrontPanel_GetPLL22393Configuration) - return((*_okFrontPanel_GetPLL22393Configuration)(hnd, pll)); + if (_okFrontPanel_GetPLL22393Configuration) + return((*_okFrontPanel_GetPLL22393Configuration)(hnd, pll)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetPLL22393Configuration(okFrontPanel_HANDLE hnd, okPLL22393_HANDLE pll) { - if (_okFrontPanel_SetPLL22393Configuration) - return((*_okFrontPanel_SetPLL22393Configuration)(hnd, pll)); + if (_okFrontPanel_SetPLL22393Configuration) + return((*_okFrontPanel_SetPLL22393Configuration)(hnd, pll)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetEepromPLL22393Configuration(okFrontPanel_HANDLE hnd, okPLL22393_HANDLE pll) { - if (_okFrontPanel_GetEepromPLL22393Configuration) - return((*_okFrontPanel_GetEepromPLL22393Configuration)(hnd, pll)); + if (_okFrontPanel_GetEepromPLL22393Configuration) + return((*_okFrontPanel_GetEepromPLL22393Configuration)(hnd, pll)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetEepromPLL22393Configuration(okFrontPanel_HANDLE hnd, okPLL22393_HANDLE pll) { - if (_okFrontPanel_SetEepromPLL22393Configuration) - return((*_okFrontPanel_SetEepromPLL22393Configuration)(hnd, pll)); + if (_okFrontPanel_SetEepromPLL22393Configuration) + return((*_okFrontPanel_SetEepromPLL22393Configuration)(hnd, pll)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_LoadDefaultPLLConfiguration(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_LoadDefaultPLLConfiguration) - return((*_okFrontPanel_LoadDefaultPLLConfiguration)(hnd)); + if (_okFrontPanel_LoadDefaultPLLConfiguration) + return((*_okFrontPanel_LoadDefaultPLLConfiguration)(hnd)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsFrontPanelEnabled(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_IsFrontPanelEnabled) - return((*_okFrontPanel_IsFrontPanelEnabled)(hnd)); + if (_okFrontPanel_IsFrontPanelEnabled) + return((*_okFrontPanel_IsFrontPanelEnabled)(hnd)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsFrontPanel3Supported(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_IsFrontPanel3Supported) - return((*_okFrontPanel_IsFrontPanel3Supported)(hnd)); + if (_okFrontPanel_IsFrontPanel3Supported) + return((*_okFrontPanel_IsFrontPanel3Supported)(hnd)); - return(FALSE); + return(FALSE); } okDLLEXPORT void DLL_ENTRY okFrontPanel_UpdateWireIns(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_UpdateWireIns) - (*_okFrontPanel_UpdateWireIns)(hnd); + if (_okFrontPanel_UpdateWireIns) + (*_okFrontPanel_UpdateWireIns)(hnd); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetWireInValue(okFrontPanel_HANDLE hnd, int ep, unsigned long val, unsigned long mask) { - if (_okFrontPanel_SetWireInValue) - return((*_okFrontPanel_SetWireInValue)(hnd, ep, val, mask)); + if (_okFrontPanel_SetWireInValue) + return((*_okFrontPanel_SetWireInValue)(hnd, ep, val, mask)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT void DLL_ENTRY okFrontPanel_UpdateWireOuts(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_UpdateWireOuts) - (*_okFrontPanel_UpdateWireOuts)(hnd); + if (_okFrontPanel_UpdateWireOuts) + (*_okFrontPanel_UpdateWireOuts)(hnd); } okDLLEXPORT unsigned long DLL_ENTRY okFrontPanel_GetWireOutValue(okFrontPanel_HANDLE hnd, int epAddr) { - if (_okFrontPanel_GetWireOutValue) - return((*_okFrontPanel_GetWireOutValue)(hnd, epAddr)); + if (_okFrontPanel_GetWireOutValue) + return((*_okFrontPanel_GetWireOutValue)(hnd, epAddr)); - return(0); + return(0); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ActivateTriggerIn(okFrontPanel_HANDLE hnd, int epAddr, int bit) { - if (_okFrontPanel_ActivateTriggerIn) - return((*_okFrontPanel_ActivateTriggerIn)(hnd, epAddr, bit)); + if (_okFrontPanel_ActivateTriggerIn) + return((*_okFrontPanel_ActivateTriggerIn)(hnd, epAddr, bit)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT void DLL_ENTRY okFrontPanel_UpdateTriggerOuts(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_UpdateTriggerOuts) - (*_okFrontPanel_UpdateTriggerOuts)(hnd); + if (_okFrontPanel_UpdateTriggerOuts) + (*_okFrontPanel_UpdateTriggerOuts)(hnd); } okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsTriggered(okFrontPanel_HANDLE hnd, int epAddr, unsigned long mask) { - if (_okFrontPanel_IsTriggered) - return((*_okFrontPanel_IsTriggered)(hnd, epAddr, mask)); + if (_okFrontPanel_IsTriggered) + return((*_okFrontPanel_IsTriggered)(hnd, epAddr, mask)); - return(FALSE); + return(FALSE); } okDLLEXPORT long DLL_ENTRY okFrontPanel_GetLastTransferLength(okFrontPanel_HANDLE hnd) { - if (_okFrontPanel_GetLastTransferLength) - return((*_okFrontPanel_GetLastTransferLength)(hnd)); + if (_okFrontPanel_GetLastTransferLength) + return((*_okFrontPanel_GetLastTransferLength)(hnd)); - return(0); + return(0); } okDLLEXPORT long DLL_ENTRY -okFrontPanel_WriteToPipeIn(okFrontPanel_HANDLE hnd, int epAddr, long length, unsigned char *data) +okFrontPanel_WriteToPipeIn(okFrontPanel_HANDLE hnd, int epAddr, long length, unsigned char* data) { - if (_okFrontPanel_WriteToPipeIn) - return((*_okFrontPanel_WriteToPipeIn)(hnd, epAddr, length, data)); + if (_okFrontPanel_WriteToPipeIn) + return((*_okFrontPanel_WriteToPipeIn)(hnd, epAddr, length, data)); - return(0); + return(0); } okDLLEXPORT long DLL_ENTRY -okFrontPanel_WriteToBlockPipeIn(okFrontPanel_HANDLE hnd, int epAddr, int blocksize, long length, unsigned char *data) +okFrontPanel_WriteToBlockPipeIn(okFrontPanel_HANDLE hnd, int epAddr, int blocksize, long length, unsigned char* data) { - if (_okFrontPanel_WriteToBlockPipeIn) - return((*_okFrontPanel_WriteToBlockPipeIn)(hnd, epAddr, blocksize, length, data)); + if (_okFrontPanel_WriteToBlockPipeIn) + return((*_okFrontPanel_WriteToBlockPipeIn)(hnd, epAddr, blocksize, length, data)); - return(0); + return(0); } okDLLEXPORT long DLL_ENTRY -okFrontPanel_ReadFromPipeOut(okFrontPanel_HANDLE hnd, int epAddr, long length, unsigned char *data) +okFrontPanel_ReadFromPipeOut(okFrontPanel_HANDLE hnd, int epAddr, long length, unsigned char* data) { - if (_okFrontPanel_ReadFromPipeOut) - return((*_okFrontPanel_ReadFromPipeOut)(hnd, epAddr, length, data)); + if (_okFrontPanel_ReadFromPipeOut) + return((*_okFrontPanel_ReadFromPipeOut)(hnd, epAddr, length, data)); - return(0); + return(0); } okDLLEXPORT long DLL_ENTRY -okFrontPanel_ReadFromBlockPipeOut(okFrontPanel_HANDLE hnd, int epAddr, int blocksize, long length, unsigned char *data) +okFrontPanel_ReadFromBlockPipeOut(okFrontPanel_HANDLE hnd, int epAddr, int blocksize, long length, unsigned char* data) { - if (_okFrontPanel_ReadFromBlockPipeOut) - return((*_okFrontPanel_ReadFromBlockPipeOut)(hnd, epAddr, blocksize, length, data)); + if (_okFrontPanel_ReadFromBlockPipeOut) + return((*_okFrontPanel_ReadFromBlockPipeOut)(hnd, epAddr, blocksize, length, data)); - return(0); + return(0); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_FlashEraseSector(okFrontPanel_HANDLE hnd, UINT32 address) { - if (_okFrontPanel_FlashEraseSector) - return((*_okFrontPanel_FlashEraseSector)(hnd, address)); + if (_okFrontPanel_FlashEraseSector) + return((*_okFrontPanel_FlashEraseSector)(hnd, address)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_FlashWrite(okFrontPanel_HANDLE hnd, UINT32 address, UINT32 length, const UINT8 *buf) +okFrontPanel_FlashWrite(okFrontPanel_HANDLE hnd, UINT32 address, UINT32 length, const UINT8* buf) { - if (_okFrontPanel_FlashWrite) - return((*_okFrontPanel_FlashWrite)(hnd, address, length, buf)); + if (_okFrontPanel_FlashWrite) + return((*_okFrontPanel_FlashWrite)(hnd, address, length, buf)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_FlashRead(okFrontPanel_HANDLE hnd, UINT32 address, UINT32 length, UINT8 *buf) +okFrontPanel_FlashRead(okFrontPanel_HANDLE hnd, UINT32 address, UINT32 length, UINT8* buf) { - if (_okFrontPanel_FlashRead) - return((*_okFrontPanel_FlashRead)(hnd, address, length, buf)); + if (_okFrontPanel_FlashRead) + return((*_okFrontPanel_FlashRead)(hnd, address, length, buf)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_GetFPGABootResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile *profile) +okFrontPanel_GetFPGABootResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile* profile) { - if (_okFrontPanel_GetFPGABootResetProfile) - return((*_okFrontPanel_GetFPGABootResetProfile)(hnd, profile)); + if (_okFrontPanel_GetFPGABootResetProfile) + return((*_okFrontPanel_GetFPGABootResetProfile)(hnd, profile)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_GetFPGAJTAGResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile *profile) +okFrontPanel_GetFPGAJTAGResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile* profile) { - if (_okFrontPanel_GetFPGAJTAGResetProfile) - return((*_okFrontPanel_GetFPGAJTAGResetProfile)(hnd, profile)); + if (_okFrontPanel_GetFPGAJTAGResetProfile) + return((*_okFrontPanel_GetFPGAJTAGResetProfile)(hnd, profile)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_SetFPGABootResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile *profile) +okFrontPanel_SetFPGABootResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile* profile) { - if (_okFrontPanel_SetFPGABootResetProfile) - return((*_okFrontPanel_SetFPGABootResetProfile)(hnd, profile)); + if (_okFrontPanel_SetFPGABootResetProfile) + return((*_okFrontPanel_SetFPGABootResetProfile)(hnd, profile)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_SetFPGAJTAGResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile *profile) +okFrontPanel_SetFPGAJTAGResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile* profile) { - if (_okFrontPanel_SetFPGAJTAGResetProfile) - return((*_okFrontPanel_SetFPGAJTAGResetProfile)(hnd, profile)); + if (_okFrontPanel_SetFPGAJTAGResetProfile) + return((*_okFrontPanel_SetFPGAJTAGResetProfile)(hnd, profile)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_ReadRegister(okFrontPanel_HANDLE hnd, UINT32 addr, UINT32 *data) +okFrontPanel_ReadRegister(okFrontPanel_HANDLE hnd, UINT32 addr, UINT32* data) { - if (_okFrontPanel_ReadRegister) - return((*_okFrontPanel_ReadRegister)(hnd, addr, data)); + if (_okFrontPanel_ReadRegister) + return((*_okFrontPanel_ReadRegister)(hnd, addr, data)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_ReadRegisterSet(okFrontPanel_HANDLE hnd, okTRegisterSet *set) +okFrontPanel_ReadRegisterSet(okFrontPanel_HANDLE hnd, okTRegisterSet* set) { - if (_okFrontPanel_ReadRegisterSet) - return((*_okFrontPanel_ReadRegisterSet)(hnd, set)); + if (_okFrontPanel_ReadRegisterSet) + return((*_okFrontPanel_ReadRegisterSet)(hnd, set)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_WriteRegister(okFrontPanel_HANDLE hnd, UINT32 addr, UINT32 data) { - if (_okFrontPanel_WriteRegister) - return((*_okFrontPanel_WriteRegister)(hnd, addr, data)); + if (_okFrontPanel_WriteRegister) + return((*_okFrontPanel_WriteRegister)(hnd, addr, data)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_WriteRegisterSet(okFrontPanel_HANDLE hnd, okTRegisterSet *set) +okFrontPanel_WriteRegisterSet(okFrontPanel_HANDLE hnd, okTRegisterSet* set) { - if (_okFrontPanel_WriteRegisterSet) - return((*_okFrontPanel_WriteRegisterSet)(hnd, set)); + if (_okFrontPanel_WriteRegisterSet) + return((*_okFrontPanel_WriteRegisterSet)(hnd, set)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } okDLLEXPORT ok_ErrorCode DLL_ENTRY -okFrontPanel_GetWireInValue(okFrontPanel_HANDLE hnd, int epAddr, UINT32 *val) +okFrontPanel_GetWireInValue(okFrontPanel_HANDLE hnd, int epAddr, UINT32* val) { - if (_okFrontPanel_GetWireInValue) - return((*_okFrontPanel_GetWireInValue)(hnd, epAddr, val)); + if (_okFrontPanel_GetWireInValue) + return((*_okFrontPanel_GetWireInValue)(hnd, epAddr, val)); - return(ok_UnsupportedFeature); + return(ok_UnsupportedFeature); } diff --git a/Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.h b/Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.h index b9a35b6f90f834308a5cdd9b0c01284d3089dbfb..deefab371f9f672447a223472483d3820c1791e8 100755 --- a/Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.h +++ b/Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.h @@ -13,29 +13,29 @@ #ifndef __okFrontPanelDLL_h__ #define __okFrontPanelDLL_h__ -// The following ifdef block is the standard way of creating macros which make exporting +// The following ifdef block is the standard way of creating macros which make exporting // from a DLL simpler. All files within this DLL are compiled with the FRONTPANELDLL_EXPORTS // symbol defined on the command line. This symbol should not be defined on any project // that uses this DLL. #if defined(_WIN32) - #define okDLLEXPORT - #define DLL_ENTRY __stdcall - typedef unsigned int UINT32; - typedef unsigned char UINT8; +#define okDLLEXPORT +#define DLL_ENTRY __stdcall +typedef unsigned int UINT32; +typedef unsigned char UINT8; #elif defined(__linux__) || defined(__APPLE__) || defined(__QNX__) - #define okDLLEXPORT - #define DLL_ENTRY - typedef unsigned int UINT32; - typedef unsigned char UINT8; +#define okDLLEXPORT +#define DLL_ENTRY +typedef unsigned int UINT32; +typedef unsigned char UINT8; #endif #if defined(_WIN32) && defined(_UNICODE) - typedef wchar_t const * okFP_dll_pchar; +typedef wchar_t const* okFP_dll_pchar; #elif defined(_WIN32) - typedef const char * okFP_dll_pchar; +typedef const char* okFP_dll_pchar; #else - typedef const char * okFP_dll_pchar; +typedef const char* okFP_dll_pchar; #endif typedef void (* DLL_EP)(void); @@ -45,99 +45,104 @@ typedef void (* DLL_EP)(void); extern "C" { #endif // __cplusplus -typedef void* okPLL22150_HANDLE; -typedef void* okPLL22393_HANDLE; -typedef void* okFrontPanel_HANDLE; -typedef int Bool; + typedef void* okPLL22150_HANDLE; + typedef void* okPLL22393_HANDLE; + typedef void* okFrontPanel_HANDLE; + typedef int Bool; #define MAX_SERIALNUMBER_LENGTH 10 // 10 characters + Does NOT include termination NULL. #define MAX_DEVICEID_LENGTH 32 // 32 characters + Does NOT include termination NULL. #define MAX_BOARDMODELSTRING_LENGTH 64 // 64 characters including termination NULL. #ifndef TRUE - #define TRUE 1 - #define FALSE 0 +#define TRUE 1 +#define FALSE 0 #endif -typedef enum { - ok_ClkSrc22150_Ref=0, - ok_ClkSrc22150_Div1ByN=1, - ok_ClkSrc22150_Div1By2=2, - ok_ClkSrc22150_Div1By3=3, - ok_ClkSrc22150_Div2ByN=4, - ok_ClkSrc22150_Div2By2=5, - ok_ClkSrc22150_Div2By4=6 -} ok_ClockSource_22150; - -typedef enum { - ok_ClkSrc22393_Ref=0, - ok_ClkSrc22393_PLL0_0=2, - ok_ClkSrc22393_PLL0_180=3, - ok_ClkSrc22393_PLL1_0=4, - ok_ClkSrc22393_PLL1_180=5, - ok_ClkSrc22393_PLL2_0=6, - ok_ClkSrc22393_PLL2_180=7 -} ok_ClockSource_22393; - -typedef enum { - ok_DivSrc_Ref = 0, - ok_DivSrc_VCO = 1 -} ok_DividerSource; - -typedef enum { - ok_brdUnknown = 0, - ok_brdXEM3001v1 = 1, - ok_brdXEM3001v2 = 2, - ok_brdXEM3010 = 3, - ok_brdXEM3005 = 4, - ok_brdXEM3001CL = 5, - ok_brdXEM3020 = 6, - ok_brdXEM3050 = 7, - ok_brdXEM9002 = 8, - ok_brdXEM3001RB = 9, - ok_brdXEM5010 = 10, - ok_brdXEM6110LX45 = 11, - ok_brdXEM6110LX150 = 15, - ok_brdXEM6001 = 12, - ok_brdXEM6010LX45 = 13, - ok_brdXEM6010LX150 = 14, - ok_brdXEM6006LX9 = 16, - ok_brdXEM6006LX16 = 17, - ok_brdXEM6006LX25 = 18, - ok_brdXEM5010LX110 = 19, - ok_brdZEM4310=20, - ok_brdXEM6310LX45=21, - ok_brdXEM6310LX150=22, - ok_brdXEM6110v2LX45=23, - ok_brdXEM6110v2LX150=24, - ok_brdXEM6002LX9=25, - ok_brdXEM6310MTLX45T=26, - ok_brdXEM6320LX130T=27 -} ok_BoardModel; - -typedef enum { - ok_NoError = 0, - ok_Failed = -1, - ok_Timeout = -2, - ok_DoneNotHigh = -3, - ok_TransferError = -4, - ok_CommunicationError = -5, - ok_InvalidBitstream = -6, - ok_FileError = -7, - ok_DeviceNotOpen = -8, - ok_InvalidEndpoint = -9, - ok_InvalidBlockSize = -10, - ok_I2CRestrictedAddress = -11, - ok_I2CBitError = -12, - ok_I2CNack = -13, - ok_I2CUnknownStatus = -14, - ok_UnsupportedFeature = -15, - ok_FIFOUnderflow = -16, - ok_FIFOOverflow = -17, - ok_DataAlignmentError = -18, - ok_InvalidResetProfile = -19, - ok_InvalidParameter = -20 -} ok_ErrorCode; + typedef enum + { + ok_ClkSrc22150_Ref=0, + ok_ClkSrc22150_Div1ByN=1, + ok_ClkSrc22150_Div1By2=2, + ok_ClkSrc22150_Div1By3=3, + ok_ClkSrc22150_Div2ByN=4, + ok_ClkSrc22150_Div2By2=5, + ok_ClkSrc22150_Div2By4=6 + } ok_ClockSource_22150; + + typedef enum + { + ok_ClkSrc22393_Ref=0, + ok_ClkSrc22393_PLL0_0=2, + ok_ClkSrc22393_PLL0_180=3, + ok_ClkSrc22393_PLL1_0=4, + ok_ClkSrc22393_PLL1_180=5, + ok_ClkSrc22393_PLL2_0=6, + ok_ClkSrc22393_PLL2_180=7 + } ok_ClockSource_22393; + + typedef enum + { + ok_DivSrc_Ref = 0, + ok_DivSrc_VCO = 1 + } ok_DividerSource; + + typedef enum + { + ok_brdUnknown = 0, + ok_brdXEM3001v1 = 1, + ok_brdXEM3001v2 = 2, + ok_brdXEM3010 = 3, + ok_brdXEM3005 = 4, + ok_brdXEM3001CL = 5, + ok_brdXEM3020 = 6, + ok_brdXEM3050 = 7, + ok_brdXEM9002 = 8, + ok_brdXEM3001RB = 9, + ok_brdXEM5010 = 10, + ok_brdXEM6110LX45 = 11, + ok_brdXEM6110LX150 = 15, + ok_brdXEM6001 = 12, + ok_brdXEM6010LX45 = 13, + ok_brdXEM6010LX150 = 14, + ok_brdXEM6006LX9 = 16, + ok_brdXEM6006LX16 = 17, + ok_brdXEM6006LX25 = 18, + ok_brdXEM5010LX110 = 19, + ok_brdZEM4310=20, + ok_brdXEM6310LX45=21, + ok_brdXEM6310LX150=22, + ok_brdXEM6110v2LX45=23, + ok_brdXEM6110v2LX150=24, + ok_brdXEM6002LX9=25, + ok_brdXEM6310MTLX45T=26, + ok_brdXEM6320LX130T=27 + } ok_BoardModel; + + typedef enum + { + ok_NoError = 0, + ok_Failed = -1, + ok_Timeout = -2, + ok_DoneNotHigh = -3, + ok_TransferError = -4, + ok_CommunicationError = -5, + ok_InvalidBitstream = -6, + ok_FileError = -7, + ok_DeviceNotOpen = -8, + ok_InvalidEndpoint = -9, + ok_InvalidBlockSize = -10, + ok_I2CRestrictedAddress = -11, + ok_I2CBitError = -12, + ok_I2CNack = -13, + ok_I2CUnknownStatus = -14, + ok_UnsupportedFeature = -15, + ok_FIFOUnderflow = -16, + ok_FIFOOverflow = -17, + ok_DataAlignmentError = -18, + ok_InvalidResetProfile = -19, + ok_InvalidParameter = -20 + } ok_ErrorCode; #ifndef FRONTPANELDLL_EXPORTS @@ -145,19 +150,19 @@ typedef enum { #define OK_MAX_SERIALNUMBER_LENGTH (11) // 10-byte content + NULL termination #define OK_MAX_BOARD_MODEL_STRING_LENGTH (128) -// ok_USBSpeed types + // ok_USBSpeed types #define OK_USBSPEED_UNKNOWN (0) #define OK_USBSPEED_FULL (1) #define OK_USBSPEED_HIGH (2) #define OK_USBSPEED_SUPER (3) -// ok_Interface types + // ok_Interface types #define OK_INTERFACE_UNKNOWN (0) #define OK_INTERFACE_USB2 (1) #define OK_INTERFACE_PCIE (2) #define OK_INTERFACE_USB3 (3) -// ok_Product types + // ok_Product types #define OK_PRODUCT_UNKNOWN (0) #define OK_PRODUCT_XEM3001V1 (1) #define OK_PRODUCT_XEM3001V2 (2) @@ -188,450 +193,464 @@ typedef enum { #define OK_PRODUCT_XEM6320LX130T (27) -typedef struct okRegisterEntry { - UINT32 address; - UINT32 data; -} okTRegisterEntry; + typedef struct okRegisterEntry + { + UINT32 address; + UINT32 data; + } okTRegisterEntry; #define okREGISTER_SET_ENTRIES (64) -typedef struct okFPGARegisterSet { - UINT32 count; - okTRegisterEntry entries[okREGISTER_SET_ENTRIES]; -} okTRegisterSet; - - -typedef struct okTriggerEntry { - UINT32 address; - UINT32 mask; -} okTTriggerEntry; - - -typedef struct okFPGAResetProfile { - // Magic number indicating the profile is valid. (4 byte = 0xBE097C3D) - UINT32 magic; - - // Location of the configuration file (Flash boot). (4 bytes) - UINT32 configFileLocation; - - // Length of the configuration file. (4 bytes) - UINT32 configFileLength; - - // Number of microseconds to wait after DONE goes high before - // starting the reset profile. (4 bytes) - UINT32 doneWaitUS; - - // Number of microseconds to wait after wires are updated - // before deasserting logic RESET. (4 bytes) - UINT32 resetWaitUS; - - // Number of microseconds to wait after RESET is deasserted - // before loading registers. (4 bytes) - UINT32 registerWaitUS; - - // Future expansion (112 bytes) - UINT32 padBytes1[28]; - - // Initial values of WireIns. These are loaded prior to - // deasserting logic RESET. (32*4 = 128 bytes) - UINT32 wireInValues[32]; - - // Number of valid Register Entries (4 bytes) - UINT32 registerEntryCount; - - // Initial register loads. (256*8 = 2048 bytes) - okTRegisterEntry registerEntries[256]; - - // Number of valid Trigger Entries (4 bytes) - UINT32 triggerEntryCount; - - // Initial trigger assertions. These are performed last. - // (32*8 = 256 bytes) - okTTriggerEntry triggerEntries[32]; - - // Padding to a 4096-byte size for future expansion - UINT8 padBytes2[1520]; -} okTFPGAResetProfile; - - -// Describes the layout of an available Flash memory on the device -typedef struct { - UINT32 sectorCount; - UINT32 sectorSize; - UINT32 pageSize; - UINT32 minUserSector; - UINT32 maxUserSector; -} okTFlashLayout; - - -typedef struct { - char deviceID[OK_MAX_DEVICEID_LENGTH]; - char serialNumber[OK_MAX_SERIALNUMBER_LENGTH]; - char productName[OK_MAX_BOARD_MODEL_STRING_LENGTH]; - int productID; - int deviceInterface; - int usbSpeed; - int deviceMajorVersion; - int deviceMinorVersion; - int hostInterfaceMajorVersion; - int hostInterfaceMinorVersion; - bool isPLL22150Supported; - bool isPLL22393Supported; - bool isFrontPanelEnabled; - int wireWidth; - int triggerWidth; - int pipeWidth; - int registerAddressWidth; - int registerDataWidth; - - okTFlashLayout flashSystem; - okTFlashLayout flashFPGA; -} okTDeviceInfo; + typedef struct okFPGARegisterSet + { + UINT32 count; + okTRegisterEntry entries[okREGISTER_SET_ENTRIES]; + } okTRegisterSet; + + + typedef struct okTriggerEntry + { + UINT32 address; + UINT32 mask; + } okTTriggerEntry; + + + typedef struct okFPGAResetProfile + { + // Magic number indicating the profile is valid. (4 byte = 0xBE097C3D) + UINT32 magic; + + // Location of the configuration file (Flash boot). (4 bytes) + UINT32 configFileLocation; + + // Length of the configuration file. (4 bytes) + UINT32 configFileLength; + + // Number of microseconds to wait after DONE goes high before + // starting the reset profile. (4 bytes) + UINT32 doneWaitUS; + + // Number of microseconds to wait after wires are updated + // before deasserting logic RESET. (4 bytes) + UINT32 resetWaitUS; + + // Number of microseconds to wait after RESET is deasserted + // before loading registers. (4 bytes) + UINT32 registerWaitUS; + + // Future expansion (112 bytes) + UINT32 padBytes1[28]; + + // Initial values of WireIns. These are loaded prior to + // deasserting logic RESET. (32*4 = 128 bytes) + UINT32 wireInValues[32]; + + // Number of valid Register Entries (4 bytes) + UINT32 registerEntryCount; + + // Initial register loads. (256*8 = 2048 bytes) + okTRegisterEntry registerEntries[256]; + + // Number of valid Trigger Entries (4 bytes) + UINT32 triggerEntryCount; + + // Initial trigger assertions. These are performed last. + // (32*8 = 256 bytes) + okTTriggerEntry triggerEntries[32]; + + // Padding to a 4096-byte size for future expansion + UINT8 padBytes2[1520]; + } okTFPGAResetProfile; + + + // Describes the layout of an available Flash memory on the device + typedef struct + { + UINT32 sectorCount; + UINT32 sectorSize; + UINT32 pageSize; + UINT32 minUserSector; + UINT32 maxUserSector; + } okTFlashLayout; + + + typedef struct + { + char deviceID[OK_MAX_DEVICEID_LENGTH]; + char serialNumber[OK_MAX_SERIALNUMBER_LENGTH]; + char productName[OK_MAX_BOARD_MODEL_STRING_LENGTH]; + int productID; + int deviceInterface; + int usbSpeed; + int deviceMajorVersion; + int deviceMinorVersion; + int hostInterfaceMajorVersion; + int hostInterfaceMinorVersion; + bool isPLL22150Supported; + bool isPLL22393Supported; + bool isFrontPanelEnabled; + int wireWidth; + int triggerWidth; + int pipeWidth; + int registerAddressWidth; + int registerDataWidth; + + okTFlashLayout flashSystem; + okTFlashLayout flashFPGA; + } okTDeviceInfo; #endif -// -// Define the LoadLib and FreeLib methods for the IMPORT side. -// + // + // Define the LoadLib and FreeLib methods for the IMPORT side. + // #ifndef FRONTPANELDLL_EXPORTS - Bool okFrontPanelDLL_LoadLib(okFP_dll_pchar libname); - void okFrontPanelDLL_FreeLib(void); + Bool okFrontPanelDLL_LoadLib(okFP_dll_pchar libname); + void okFrontPanelDLL_FreeLib(void); #endif -// -// General -// -okDLLEXPORT void DLL_ENTRY okFrontPanelDLL_GetVersion(char *date, char *time); - -// -// okPLL22393 -// -okDLLEXPORT okPLL22393_HANDLE DLL_ENTRY okPLL22393_Construct(); -okDLLEXPORT void DLL_ENTRY okPLL22393_Destruct(okPLL22393_HANDLE pll); -okDLLEXPORT void DLL_ENTRY okPLL22393_SetCrystalLoad(okPLL22393_HANDLE pll, double capload); -okDLLEXPORT void DLL_ENTRY okPLL22393_SetReference(okPLL22393_HANDLE pll, double freq); -okDLLEXPORT double DLL_ENTRY okPLL22393_GetReference(okPLL22393_HANDLE pll); -okDLLEXPORT Bool DLL_ENTRY okPLL22393_SetPLLParameters(okPLL22393_HANDLE pll, int n, int p, int q, Bool enable); -okDLLEXPORT Bool DLL_ENTRY okPLL22393_SetPLLLF(okPLL22393_HANDLE pll, int n, int lf); -okDLLEXPORT Bool DLL_ENTRY okPLL22393_SetOutputDivider(okPLL22393_HANDLE pll, int n, int div); -okDLLEXPORT Bool DLL_ENTRY okPLL22393_SetOutputSource(okPLL22393_HANDLE pll, int n, ok_ClockSource_22393 clksrc); -okDLLEXPORT void DLL_ENTRY okPLL22393_SetOutputEnable(okPLL22393_HANDLE pll, int n, Bool enable); -okDLLEXPORT int DLL_ENTRY okPLL22393_GetPLLP(okPLL22393_HANDLE pll, int n); -okDLLEXPORT int DLL_ENTRY okPLL22393_GetPLLQ(okPLL22393_HANDLE pll, int n); -okDLLEXPORT double DLL_ENTRY okPLL22393_GetPLLFrequency(okPLL22393_HANDLE pll, int n); -okDLLEXPORT int DLL_ENTRY okPLL22393_GetOutputDivider(okPLL22393_HANDLE pll, int n); -okDLLEXPORT ok_ClockSource_22393 DLL_ENTRY okPLL22393_GetOutputSource(okPLL22393_HANDLE pll, int n); -okDLLEXPORT double DLL_ENTRY okPLL22393_GetOutputFrequency(okPLL22393_HANDLE pll, int n); -okDLLEXPORT Bool DLL_ENTRY okPLL22393_IsOutputEnabled(okPLL22393_HANDLE pll, int n); -okDLLEXPORT Bool DLL_ENTRY okPLL22393_IsPLLEnabled(okPLL22393_HANDLE pll, int n); -okDLLEXPORT void DLL_ENTRY okPLL22393_InitFromProgrammingInfo(okPLL22393_HANDLE pll, unsigned char *buf); -okDLLEXPORT void DLL_ENTRY okPLL22393_GetProgrammingInfo(okPLL22393_HANDLE pll, unsigned char *buf); - - -// -// okPLL22150 -// -okDLLEXPORT okPLL22150_HANDLE DLL_ENTRY okPLL22150_Construct(); -okDLLEXPORT void DLL_ENTRY okPLL22150_Destruct(okPLL22150_HANDLE pll); -okDLLEXPORT void DLL_ENTRY okPLL22150_SetCrystalLoad(okPLL22150_HANDLE pll, double capload); -okDLLEXPORT void DLL_ENTRY okPLL22150_SetReference(okPLL22150_HANDLE pll, double freq, Bool extosc); -okDLLEXPORT double DLL_ENTRY okPLL22150_GetReference(okPLL22150_HANDLE pll); -okDLLEXPORT Bool DLL_ENTRY okPLL22150_SetVCOParameters(okPLL22150_HANDLE pll, int p, int q); -okDLLEXPORT int DLL_ENTRY okPLL22150_GetVCOP(okPLL22150_HANDLE pll); -okDLLEXPORT int DLL_ENTRY okPLL22150_GetVCOQ(okPLL22150_HANDLE pll); -okDLLEXPORT double DLL_ENTRY okPLL22150_GetVCOFrequency(okPLL22150_HANDLE pll); -okDLLEXPORT void DLL_ENTRY okPLL22150_SetDiv1(okPLL22150_HANDLE pll, ok_DividerSource divsrc, int n); -okDLLEXPORT void DLL_ENTRY okPLL22150_SetDiv2(okPLL22150_HANDLE pll, ok_DividerSource divsrc, int n); -okDLLEXPORT ok_DividerSource DLL_ENTRY okPLL22150_GetDiv1Source(okPLL22150_HANDLE pll); -okDLLEXPORT ok_DividerSource DLL_ENTRY okPLL22150_GetDiv2Source(okPLL22150_HANDLE pll); -okDLLEXPORT int DLL_ENTRY okPLL22150_GetDiv1Divider(okPLL22150_HANDLE pll); -okDLLEXPORT int DLL_ENTRY okPLL22150_GetDiv2Divider(okPLL22150_HANDLE pll); -okDLLEXPORT void DLL_ENTRY okPLL22150_SetOutputSource(okPLL22150_HANDLE pll, int output, ok_ClockSource_22150 clksrc); -okDLLEXPORT void DLL_ENTRY okPLL22150_SetOutputEnable(okPLL22150_HANDLE pll, int output, Bool enable); -okDLLEXPORT ok_ClockSource_22150 DLL_ENTRY okPLL22150_GetOutputSource(okPLL22150_HANDLE pll, int output); -okDLLEXPORT double DLL_ENTRY okPLL22150_GetOutputFrequency(okPLL22150_HANDLE pll, int output); -okDLLEXPORT Bool DLL_ENTRY okPLL22150_IsOutputEnabled(okPLL22150_HANDLE pll, int output); -okDLLEXPORT void DLL_ENTRY okPLL22150_InitFromProgrammingInfo(okPLL22150_HANDLE pll, unsigned char *buf); -okDLLEXPORT void DLL_ENTRY okPLL22150_GetProgrammingInfo(okPLL22150_HANDLE pll, unsigned char *buf); - - -// -// okFrontPanel -// -okDLLEXPORT okFrontPanel_HANDLE DLL_ENTRY okFrontPanel_Construct(); -okDLLEXPORT void DLL_ENTRY okFrontPanel_Destruct(okFrontPanel_HANDLE hnd); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_WriteI2C(okFrontPanel_HANDLE hnd, const int addr, int length, unsigned char *data); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ReadI2C(okFrontPanel_HANDLE hnd, const int addr, int length, unsigned char *data); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_FlashEraseSector(okFrontPanel_HANDLE hnd, UINT32 address); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_FlashWrite(okFrontPanel_HANDLE hnd, UINT32 address, UINT32 length, const UINT8 *buf); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_FlashRead(okFrontPanel_HANDLE hnd, UINT32 address, UINT32 length, UINT8 *buf); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetFPGABootResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile *profile); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetFPGAJTAGResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile *profile); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetFPGABootResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile *profile); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetFPGAJTAGResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile *profile); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ReadRegister(okFrontPanel_HANDLE hnd, UINT32 addr, UINT32 *data); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ReadRegisterSet(okFrontPanel_HANDLE hnd, okTRegisterSet *set); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_WriteRegister(okFrontPanel_HANDLE hnd, UINT32 addr, UINT32 data); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_WriteRegisterSet(okFrontPanel_HANDLE hnd, okTRegisterSet *set); -okDLLEXPORT int DLL_ENTRY okFrontPanel_GetHostInterfaceWidth(okFrontPanel_HANDLE hnd); -okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsHighSpeed(okFrontPanel_HANDLE hnd); -okDLLEXPORT ok_BoardModel DLL_ENTRY okFrontPanel_GetBoardModel(okFrontPanel_HANDLE hnd); -okDLLEXPORT void DLL_ENTRY okFrontPanel_GetBoardModelString(okFrontPanel_HANDLE hnd, ok_BoardModel m, char *buf); -okDLLEXPORT int DLL_ENTRY okFrontPanel_GetDeviceCount(okFrontPanel_HANDLE hnd); -okDLLEXPORT ok_BoardModel DLL_ENTRY okFrontPanel_GetDeviceListModel(okFrontPanel_HANDLE hnd, int num); -okDLLEXPORT void DLL_ENTRY okFrontPanel_GetDeviceListSerial(okFrontPanel_HANDLE hnd, int num, char *buf); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_OpenBySerial(okFrontPanel_HANDLE hnd, const char *serial); -okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsOpen(okFrontPanel_HANDLE hnd); -okDLLEXPORT void DLL_ENTRY okFrontPanel_EnableAsynchronousTransfers(okFrontPanel_HANDLE hnd, Bool enable); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetBTPipePollingInterval(okFrontPanel_HANDLE hnd, int interval); -okDLLEXPORT void DLL_ENTRY okFrontPanel_SetTimeout(okFrontPanel_HANDLE hnd, int timeout); -okDLLEXPORT int DLL_ENTRY okFrontPanel_GetDeviceMajorVersion(okFrontPanel_HANDLE hnd); -okDLLEXPORT int DLL_ENTRY okFrontPanel_GetDeviceMinorVersion(okFrontPanel_HANDLE hnd); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ResetFPGA(okFrontPanel_HANDLE hnd); -okDLLEXPORT void DLL_ENTRY okFrontPanel_GetSerialNumber(okFrontPanel_HANDLE hnd, char *buf); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetDeviceInfo(okFrontPanel_HANDLE hnd, okTDeviceInfo *info); -okDLLEXPORT void DLL_ENTRY okFrontPanel_GetDeviceID(okFrontPanel_HANDLE hnd, char *buf); -okDLLEXPORT void DLL_ENTRY okFrontPanel_SetDeviceID(okFrontPanel_HANDLE hnd, const char *strID); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ConfigureFPGA(okFrontPanel_HANDLE hnd, const char *strFilename); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ConfigureFPGAFromMemory(okFrontPanel_HANDLE hnd, unsigned char *data, unsigned long length); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetPLL22150Configuration(okFrontPanel_HANDLE hnd, okPLL22150_HANDLE pll); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetPLL22150Configuration(okFrontPanel_HANDLE hnd, okPLL22150_HANDLE pll); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetEepromPLL22150Configuration(okFrontPanel_HANDLE hnd, okPLL22150_HANDLE pll); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetEepromPLL22150Configuration(okFrontPanel_HANDLE hnd, okPLL22150_HANDLE pll); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetPLL22393Configuration(okFrontPanel_HANDLE hnd, okPLL22393_HANDLE pll); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetPLL22393Configuration(okFrontPanel_HANDLE hnd, okPLL22393_HANDLE pll); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetEepromPLL22393Configuration(okFrontPanel_HANDLE hnd, okPLL22393_HANDLE pll); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetEepromPLL22393Configuration(okFrontPanel_HANDLE hnd, okPLL22393_HANDLE pll); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_LoadDefaultPLLConfiguration(okFrontPanel_HANDLE hnd); -okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsFrontPanelEnabled(okFrontPanel_HANDLE hnd); -okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsFrontPanel3Supported(okFrontPanel_HANDLE hnd); -okDLLEXPORT void DLL_ENTRY okFrontPanel_UpdateWireIns(okFrontPanel_HANDLE hnd); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetWireInValue(okFrontPanel_HANDLE hnd, int epAddr, UINT32 *val); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetWireInValue(okFrontPanel_HANDLE hnd, int ep, unsigned long val, unsigned long mask); -okDLLEXPORT void DLL_ENTRY okFrontPanel_UpdateWireOuts(okFrontPanel_HANDLE hnd); -okDLLEXPORT unsigned long DLL_ENTRY okFrontPanel_GetWireOutValue(okFrontPanel_HANDLE hnd, int epAddr); -okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ActivateTriggerIn(okFrontPanel_HANDLE hnd, int epAddr, int bit); -okDLLEXPORT void DLL_ENTRY okFrontPanel_UpdateTriggerOuts(okFrontPanel_HANDLE hnd); -okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsTriggered(okFrontPanel_HANDLE hnd, int epAddr, unsigned long mask); -okDLLEXPORT long DLL_ENTRY okFrontPanel_GetLastTransferLength(okFrontPanel_HANDLE hnd); -okDLLEXPORT long DLL_ENTRY okFrontPanel_WriteToPipeIn(okFrontPanel_HANDLE hnd, int epAddr, long length, unsigned char *data); -okDLLEXPORT long DLL_ENTRY okFrontPanel_ReadFromPipeOut(okFrontPanel_HANDLE hnd, int epAddr, long length, unsigned char *data); -okDLLEXPORT long DLL_ENTRY okFrontPanel_WriteToBlockPipeIn(okFrontPanel_HANDLE hnd, int epAddr, int blockSize, long length, unsigned char *data); -okDLLEXPORT long DLL_ENTRY okFrontPanel_ReadFromBlockPipeOut(okFrontPanel_HANDLE hnd, int epAddr, int blockSize, long length, unsigned char *data); + // + // General + // + okDLLEXPORT void DLL_ENTRY okFrontPanelDLL_GetVersion(char* date, char* time); + + // + // okPLL22393 + // + okDLLEXPORT okPLL22393_HANDLE DLL_ENTRY okPLL22393_Construct(); + okDLLEXPORT void DLL_ENTRY okPLL22393_Destruct(okPLL22393_HANDLE pll); + okDLLEXPORT void DLL_ENTRY okPLL22393_SetCrystalLoad(okPLL22393_HANDLE pll, double capload); + okDLLEXPORT void DLL_ENTRY okPLL22393_SetReference(okPLL22393_HANDLE pll, double freq); + okDLLEXPORT double DLL_ENTRY okPLL22393_GetReference(okPLL22393_HANDLE pll); + okDLLEXPORT Bool DLL_ENTRY okPLL22393_SetPLLParameters(okPLL22393_HANDLE pll, int n, int p, int q, Bool enable); + okDLLEXPORT Bool DLL_ENTRY okPLL22393_SetPLLLF(okPLL22393_HANDLE pll, int n, int lf); + okDLLEXPORT Bool DLL_ENTRY okPLL22393_SetOutputDivider(okPLL22393_HANDLE pll, int n, int div); + okDLLEXPORT Bool DLL_ENTRY okPLL22393_SetOutputSource(okPLL22393_HANDLE pll, int n, ok_ClockSource_22393 clksrc); + okDLLEXPORT void DLL_ENTRY okPLL22393_SetOutputEnable(okPLL22393_HANDLE pll, int n, Bool enable); + okDLLEXPORT int DLL_ENTRY okPLL22393_GetPLLP(okPLL22393_HANDLE pll, int n); + okDLLEXPORT int DLL_ENTRY okPLL22393_GetPLLQ(okPLL22393_HANDLE pll, int n); + okDLLEXPORT double DLL_ENTRY okPLL22393_GetPLLFrequency(okPLL22393_HANDLE pll, int n); + okDLLEXPORT int DLL_ENTRY okPLL22393_GetOutputDivider(okPLL22393_HANDLE pll, int n); + okDLLEXPORT ok_ClockSource_22393 DLL_ENTRY okPLL22393_GetOutputSource(okPLL22393_HANDLE pll, int n); + okDLLEXPORT double DLL_ENTRY okPLL22393_GetOutputFrequency(okPLL22393_HANDLE pll, int n); + okDLLEXPORT Bool DLL_ENTRY okPLL22393_IsOutputEnabled(okPLL22393_HANDLE pll, int n); + okDLLEXPORT Bool DLL_ENTRY okPLL22393_IsPLLEnabled(okPLL22393_HANDLE pll, int n); + okDLLEXPORT void DLL_ENTRY okPLL22393_InitFromProgrammingInfo(okPLL22393_HANDLE pll, unsigned char* buf); + okDLLEXPORT void DLL_ENTRY okPLL22393_GetProgrammingInfo(okPLL22393_HANDLE pll, unsigned char* buf); + + + // + // okPLL22150 + // + okDLLEXPORT okPLL22150_HANDLE DLL_ENTRY okPLL22150_Construct(); + okDLLEXPORT void DLL_ENTRY okPLL22150_Destruct(okPLL22150_HANDLE pll); + okDLLEXPORT void DLL_ENTRY okPLL22150_SetCrystalLoad(okPLL22150_HANDLE pll, double capload); + okDLLEXPORT void DLL_ENTRY okPLL22150_SetReference(okPLL22150_HANDLE pll, double freq, Bool extosc); + okDLLEXPORT double DLL_ENTRY okPLL22150_GetReference(okPLL22150_HANDLE pll); + okDLLEXPORT Bool DLL_ENTRY okPLL22150_SetVCOParameters(okPLL22150_HANDLE pll, int p, int q); + okDLLEXPORT int DLL_ENTRY okPLL22150_GetVCOP(okPLL22150_HANDLE pll); + okDLLEXPORT int DLL_ENTRY okPLL22150_GetVCOQ(okPLL22150_HANDLE pll); + okDLLEXPORT double DLL_ENTRY okPLL22150_GetVCOFrequency(okPLL22150_HANDLE pll); + okDLLEXPORT void DLL_ENTRY okPLL22150_SetDiv1(okPLL22150_HANDLE pll, ok_DividerSource divsrc, int n); + okDLLEXPORT void DLL_ENTRY okPLL22150_SetDiv2(okPLL22150_HANDLE pll, ok_DividerSource divsrc, int n); + okDLLEXPORT ok_DividerSource DLL_ENTRY okPLL22150_GetDiv1Source(okPLL22150_HANDLE pll); + okDLLEXPORT ok_DividerSource DLL_ENTRY okPLL22150_GetDiv2Source(okPLL22150_HANDLE pll); + okDLLEXPORT int DLL_ENTRY okPLL22150_GetDiv1Divider(okPLL22150_HANDLE pll); + okDLLEXPORT int DLL_ENTRY okPLL22150_GetDiv2Divider(okPLL22150_HANDLE pll); + okDLLEXPORT void DLL_ENTRY okPLL22150_SetOutputSource(okPLL22150_HANDLE pll, int output, ok_ClockSource_22150 clksrc); + okDLLEXPORT void DLL_ENTRY okPLL22150_SetOutputEnable(okPLL22150_HANDLE pll, int output, Bool enable); + okDLLEXPORT ok_ClockSource_22150 DLL_ENTRY okPLL22150_GetOutputSource(okPLL22150_HANDLE pll, int output); + okDLLEXPORT double DLL_ENTRY okPLL22150_GetOutputFrequency(okPLL22150_HANDLE pll, int output); + okDLLEXPORT Bool DLL_ENTRY okPLL22150_IsOutputEnabled(okPLL22150_HANDLE pll, int output); + okDLLEXPORT void DLL_ENTRY okPLL22150_InitFromProgrammingInfo(okPLL22150_HANDLE pll, unsigned char* buf); + okDLLEXPORT void DLL_ENTRY okPLL22150_GetProgrammingInfo(okPLL22150_HANDLE pll, unsigned char* buf); + + + // + // okFrontPanel + // + okDLLEXPORT okFrontPanel_HANDLE DLL_ENTRY okFrontPanel_Construct(); + okDLLEXPORT void DLL_ENTRY okFrontPanel_Destruct(okFrontPanel_HANDLE hnd); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_WriteI2C(okFrontPanel_HANDLE hnd, const int addr, int length, unsigned char* data); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ReadI2C(okFrontPanel_HANDLE hnd, const int addr, int length, unsigned char* data); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_FlashEraseSector(okFrontPanel_HANDLE hnd, UINT32 address); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_FlashWrite(okFrontPanel_HANDLE hnd, UINT32 address, UINT32 length, const UINT8* buf); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_FlashRead(okFrontPanel_HANDLE hnd, UINT32 address, UINT32 length, UINT8* buf); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetFPGABootResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile* profile); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetFPGAJTAGResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile* profile); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetFPGABootResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile* profile); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetFPGAJTAGResetProfile(okFrontPanel_HANDLE hnd, okTFPGAResetProfile* profile); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ReadRegister(okFrontPanel_HANDLE hnd, UINT32 addr, UINT32* data); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ReadRegisterSet(okFrontPanel_HANDLE hnd, okTRegisterSet* set); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_WriteRegister(okFrontPanel_HANDLE hnd, UINT32 addr, UINT32 data); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_WriteRegisterSet(okFrontPanel_HANDLE hnd, okTRegisterSet* set); + okDLLEXPORT int DLL_ENTRY okFrontPanel_GetHostInterfaceWidth(okFrontPanel_HANDLE hnd); + okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsHighSpeed(okFrontPanel_HANDLE hnd); + okDLLEXPORT ok_BoardModel DLL_ENTRY okFrontPanel_GetBoardModel(okFrontPanel_HANDLE hnd); + okDLLEXPORT void DLL_ENTRY okFrontPanel_GetBoardModelString(okFrontPanel_HANDLE hnd, ok_BoardModel m, char* buf); + okDLLEXPORT int DLL_ENTRY okFrontPanel_GetDeviceCount(okFrontPanel_HANDLE hnd); + okDLLEXPORT ok_BoardModel DLL_ENTRY okFrontPanel_GetDeviceListModel(okFrontPanel_HANDLE hnd, int num); + okDLLEXPORT void DLL_ENTRY okFrontPanel_GetDeviceListSerial(okFrontPanel_HANDLE hnd, int num, char* buf); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_OpenBySerial(okFrontPanel_HANDLE hnd, const char* serial); + okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsOpen(okFrontPanel_HANDLE hnd); + okDLLEXPORT void DLL_ENTRY okFrontPanel_EnableAsynchronousTransfers(okFrontPanel_HANDLE hnd, Bool enable); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetBTPipePollingInterval(okFrontPanel_HANDLE hnd, int interval); + okDLLEXPORT void DLL_ENTRY okFrontPanel_SetTimeout(okFrontPanel_HANDLE hnd, int timeout); + okDLLEXPORT int DLL_ENTRY okFrontPanel_GetDeviceMajorVersion(okFrontPanel_HANDLE hnd); + okDLLEXPORT int DLL_ENTRY okFrontPanel_GetDeviceMinorVersion(okFrontPanel_HANDLE hnd); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ResetFPGA(okFrontPanel_HANDLE hnd); + okDLLEXPORT void DLL_ENTRY okFrontPanel_GetSerialNumber(okFrontPanel_HANDLE hnd, char* buf); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetDeviceInfo(okFrontPanel_HANDLE hnd, okTDeviceInfo* info); + okDLLEXPORT void DLL_ENTRY okFrontPanel_GetDeviceID(okFrontPanel_HANDLE hnd, char* buf); + okDLLEXPORT void DLL_ENTRY okFrontPanel_SetDeviceID(okFrontPanel_HANDLE hnd, const char* strID); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ConfigureFPGA(okFrontPanel_HANDLE hnd, const char* strFilename); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ConfigureFPGAFromMemory(okFrontPanel_HANDLE hnd, unsigned char* data, unsigned long length); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetPLL22150Configuration(okFrontPanel_HANDLE hnd, okPLL22150_HANDLE pll); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetPLL22150Configuration(okFrontPanel_HANDLE hnd, okPLL22150_HANDLE pll); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetEepromPLL22150Configuration(okFrontPanel_HANDLE hnd, okPLL22150_HANDLE pll); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetEepromPLL22150Configuration(okFrontPanel_HANDLE hnd, okPLL22150_HANDLE pll); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetPLL22393Configuration(okFrontPanel_HANDLE hnd, okPLL22393_HANDLE pll); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetPLL22393Configuration(okFrontPanel_HANDLE hnd, okPLL22393_HANDLE pll); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetEepromPLL22393Configuration(okFrontPanel_HANDLE hnd, okPLL22393_HANDLE pll); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetEepromPLL22393Configuration(okFrontPanel_HANDLE hnd, okPLL22393_HANDLE pll); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_LoadDefaultPLLConfiguration(okFrontPanel_HANDLE hnd); + okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsFrontPanelEnabled(okFrontPanel_HANDLE hnd); + okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsFrontPanel3Supported(okFrontPanel_HANDLE hnd); + okDLLEXPORT void DLL_ENTRY okFrontPanel_UpdateWireIns(okFrontPanel_HANDLE hnd); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_GetWireInValue(okFrontPanel_HANDLE hnd, int epAddr, UINT32* val); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_SetWireInValue(okFrontPanel_HANDLE hnd, int ep, unsigned long val, unsigned long mask); + okDLLEXPORT void DLL_ENTRY okFrontPanel_UpdateWireOuts(okFrontPanel_HANDLE hnd); + okDLLEXPORT unsigned long DLL_ENTRY okFrontPanel_GetWireOutValue(okFrontPanel_HANDLE hnd, int epAddr); + okDLLEXPORT ok_ErrorCode DLL_ENTRY okFrontPanel_ActivateTriggerIn(okFrontPanel_HANDLE hnd, int epAddr, int bit); + okDLLEXPORT void DLL_ENTRY okFrontPanel_UpdateTriggerOuts(okFrontPanel_HANDLE hnd); + okDLLEXPORT Bool DLL_ENTRY okFrontPanel_IsTriggered(okFrontPanel_HANDLE hnd, int epAddr, unsigned long mask); + okDLLEXPORT long DLL_ENTRY okFrontPanel_GetLastTransferLength(okFrontPanel_HANDLE hnd); + okDLLEXPORT long DLL_ENTRY okFrontPanel_WriteToPipeIn(okFrontPanel_HANDLE hnd, int epAddr, long length, unsigned char* data); + okDLLEXPORT long DLL_ENTRY okFrontPanel_ReadFromPipeOut(okFrontPanel_HANDLE hnd, int epAddr, long length, unsigned char* data); + okDLLEXPORT long DLL_ENTRY okFrontPanel_WriteToBlockPipeIn(okFrontPanel_HANDLE hnd, int epAddr, int blockSize, long length, unsigned char* data); + okDLLEXPORT long DLL_ENTRY okFrontPanel_ReadFromBlockPipeOut(okFrontPanel_HANDLE hnd, int epAddr, int blockSize, long length, unsigned char* data); #ifdef __cplusplus #if !defined(FRONTPANELDLL_EXPORTS) -//------------------------------------------------------------------------ -// okCPLL22150 C++ wrapper class -//------------------------------------------------------------------------ -class okCPLL22150 -{ -public: - okPLL22150_HANDLE h; - enum ClockSource { - ClkSrc_Ref=0, - ClkSrc_Div1ByN=1, - ClkSrc_Div1By2=2, - ClkSrc_Div1By3=3, + //------------------------------------------------------------------------ + // okCPLL22150 C++ wrapper class + //------------------------------------------------------------------------ + class okCPLL22150 + { + public: + okPLL22150_HANDLE h; + enum ClockSource + { + ClkSrc_Ref=0, + ClkSrc_Div1ByN=1, + ClkSrc_Div1By2=2, + ClkSrc_Div1By3=3, ClkSrc_Div2ByN=4, - ClkSrc_Div2By2=5, - ClkSrc_Div2By4=6 }; - - enum DividerSource { - DivSrc_Ref = 0, - DivSrc_VCO = 1 }; -private: - bool to_bool(Bool x); - Bool from_bool(bool x); -public: - okCPLL22150(); - void SetCrystalLoad(double capload); - void SetReference(double freq, bool extosc); - double GetReference(); - bool SetVCOParameters(int p, int q); - int GetVCOP(); - int GetVCOQ(); - double GetVCOFrequency(); - void SetDiv1(DividerSource divsrc, int n); - void SetDiv2(DividerSource divsrc, int n); - DividerSource GetDiv1Source(); - DividerSource GetDiv2Source(); - int GetDiv1Divider(); - int GetDiv2Divider(); - void SetOutputSource(int output, ClockSource clksrc); - void SetOutputEnable(int output, bool enable); - ClockSource GetOutputSource(int output); - double GetOutputFrequency(int output); - bool IsOutputEnabled(int output); - void InitFromProgrammingInfo(unsigned char *buf); - void GetProgrammingInfo(unsigned char *buf); -}; - -//------------------------------------------------------------------------ -// okCPLL22150 C++ wrapper class -//------------------------------------------------------------------------ -class okCPLL22393 -{ -public: - okPLL22393_HANDLE h; - enum ClockSource { - ClkSrc_Ref=0, - ClkSrc_PLL0_0=2, - ClkSrc_PLL0_180=3, - ClkSrc_PLL1_0=4, - ClkSrc_PLL1_180=5, - ClkSrc_PLL2_0=6, - ClkSrc_PLL2_180=7 }; -private: - bool to_bool(Bool x); - Bool from_bool(bool x); -public: - okCPLL22393(); - void SetCrystalLoad(double capload); - void SetReference(double freq); - double GetReference(); - bool SetPLLParameters(int n, int p, int q, bool enable=true); - bool SetPLLLF(int n, int lf); - bool SetOutputDivider(int n, int div); - bool SetOutputSource(int n, ClockSource clksrc); - void SetOutputEnable(int n, bool enable); - int GetPLLP(int n); - int GetPLLQ(int n); - double GetPLLFrequency(int n); - int GetOutputDivider(int n); - ClockSource GetOutputSource(int n); - double GetOutputFrequency(int n); - bool IsOutputEnabled(int n); - bool IsPLLEnabled(int n); - void InitFromProgrammingInfo(unsigned char *buf); - void GetProgrammingInfo(unsigned char *buf); -}; - -//------------------------------------------------------------------------ -// okCFrontPanel C++ wrapper class -//------------------------------------------------------------------------ -class okCFrontPanel -{ -public: - okFrontPanel_HANDLE h; - enum BoardModel { - brdUnknown=0, - brdXEM3001v1=1, - brdXEM3001v2=2, - brdXEM3010=3, - brdXEM3005=4, - brdXEM3001CL=5, - brdXEM3020=6, - brdXEM3050=7, - brdXEM9002=8, - brdXEM3001RB=9, - brdXEM5010=10, - brdXEM6110LX45=11, - brdXEM6110LX150=15, - brdXEM6001=12, - brdXEM6010LX45=13, - brdXEM6010LX150=14, - brdXEM6006LX9=16, - brdXEM6006LX16=17, - brdXEM6006LX25=18, - brdXEM5010LX110=19, - brdZEM4310=20, - brdXEM6310LX45=21, - brdXEM6310LX150=22, - brdXEM6110v2LX45=23, - brdXEM6110v2LX150=24 - }; - enum ErrorCode { - NoError = 0, - Failed = -1, - Timeout = -2, - DoneNotHigh = -3, - TransferError = -4, - CommunicationError = -5, - InvalidBitstream = -6, - FileError = -7, - DeviceNotOpen = -8, - InvalidEndpoint = -9, - InvalidBlockSize = -10, - I2CRestrictedAddress = -11, - I2CBitError = -12, - I2CNack = -13, - I2CUnknownStatus = -14, - UnsupportedFeature = -15, - FIFOUnderflow = -16, - FIFOOverflow = -17, - DataAlignmentError = -18, - InvalidResetProfile = -19, - InvalidParameter = -20 - }; -private: - bool to_bool(Bool x); - Bool from_bool(bool x); -public: - okCFrontPanel(); - ~okCFrontPanel(); - int GetHostInterfaceWidth(); - BoardModel GetBoardModel(); - std::string GetBoardModelString(BoardModel m); - int GetDeviceCount(); - ErrorCode GetFPGABootResetProfile(okTFPGAResetProfile *profile); - ErrorCode GetFPGAJTAGResetProfile(okTFPGAResetProfile *profile); - ErrorCode SetFPGABootResetProfile(okTFPGAResetProfile *profile); - ErrorCode SetFPGAJTAGResetProfile(okTFPGAResetProfile *profile); - ErrorCode FlashEraseSector(UINT32 address); - ErrorCode FlashWrite(UINT32 address, UINT32 length, const UINT8 *buf); - ErrorCode FlashRead(UINT32 address, UINT32 length, UINT8 *buf); - ErrorCode ReadRegister(UINT32 addr, UINT32 *data); - ErrorCode ReadRegisterSet(okTRegisterSet *set); - ErrorCode WriteRegister(UINT32 addr, UINT32 data); - ErrorCode WriteRegisterSet(okTRegisterSet *set); - BoardModel GetDeviceListModel(int num); - std::string GetDeviceListSerial(int num); - void EnableAsynchronousTransfers(bool enable); - ErrorCode OpenBySerial(std::string str = ""); - bool IsOpen(); - ErrorCode GetDeviceInfo(okTDeviceInfo *info); - int GetDeviceMajorVersion(); - int GetDeviceMinorVersion(); - std::string GetSerialNumber(); - std::string GetDeviceID(); - void SetDeviceID(const std::string str); - ErrorCode SetBTPipePollingInterval(int interval); - void SetTimeout(int timeout); - ErrorCode ResetFPGA(); - ErrorCode ConfigureFPGAFromMemory(unsigned char *data, const unsigned long length, - void(*callback)(int, int, void *) = NULL, void *arg = NULL); - ErrorCode ConfigureFPGA(const std::string strFilename, - void (*callback)(int, int, void *) = NULL, void *arg = NULL); - ErrorCode WriteI2C(const int addr, int length, unsigned char *data); - ErrorCode ReadI2C(const int addr, int length, unsigned char *data); - ErrorCode GetPLL22150Configuration(okCPLL22150& pll); - ErrorCode SetPLL22150Configuration(okCPLL22150& pll); - ErrorCode GetEepromPLL22150Configuration(okCPLL22150& pll); - ErrorCode SetEepromPLL22150Configuration(okCPLL22150& pll); - ErrorCode GetPLL22393Configuration(okCPLL22393& pll); - ErrorCode SetPLL22393Configuration(okCPLL22393& pll); - ErrorCode GetEepromPLL22393Configuration(okCPLL22393& pll); - ErrorCode SetEepromPLL22393Configuration(okCPLL22393& pll); - ErrorCode LoadDefaultPLLConfiguration(); - bool IsHighSpeed(); - bool IsFrontPanelEnabled(); - bool IsFrontPanel3Supported(); - void UpdateWireIns(); - ErrorCode GetWireInValue(int epAddr, UINT32 *val); - ErrorCode SetWireInValue(int ep, unsigned long val, unsigned long mask = 0xffffffff); - void UpdateWireOuts(); - unsigned long GetWireOutValue(int epAddr); - ErrorCode ActivateTriggerIn(int epAddr, int bit); - void UpdateTriggerOuts(); - bool IsTriggered(int epAddr, unsigned long mask); - long GetLastTransferLength(); - long WriteToPipeIn(int epAddr, long length, unsigned char *data); - long ReadFromPipeOut(int epAddr, long length, unsigned char *data); - long WriteToBlockPipeIn(int epAddr, int blockSize, long length, unsigned char *data); - long ReadFromBlockPipeOut(int epAddr, int blockSize, long length, unsigned char *data); -}; + ClkSrc_Div2By2=5, + ClkSrc_Div2By4=6 + }; + + enum DividerSource + { + DivSrc_Ref = 0, + DivSrc_VCO = 1 + }; + private: + bool to_bool(Bool x); + Bool from_bool(bool x); + public: + okCPLL22150(); + void SetCrystalLoad(double capload); + void SetReference(double freq, bool extosc); + double GetReference(); + bool SetVCOParameters(int p, int q); + int GetVCOP(); + int GetVCOQ(); + double GetVCOFrequency(); + void SetDiv1(DividerSource divsrc, int n); + void SetDiv2(DividerSource divsrc, int n); + DividerSource GetDiv1Source(); + DividerSource GetDiv2Source(); + int GetDiv1Divider(); + int GetDiv2Divider(); + void SetOutputSource(int output, ClockSource clksrc); + void SetOutputEnable(int output, bool enable); + ClockSource GetOutputSource(int output); + double GetOutputFrequency(int output); + bool IsOutputEnabled(int output); + void InitFromProgrammingInfo(unsigned char* buf); + void GetProgrammingInfo(unsigned char* buf); + }; + + //------------------------------------------------------------------------ + // okCPLL22150 C++ wrapper class + //------------------------------------------------------------------------ + class okCPLL22393 + { + public: + okPLL22393_HANDLE h; + enum ClockSource + { + ClkSrc_Ref=0, + ClkSrc_PLL0_0=2, + ClkSrc_PLL0_180=3, + ClkSrc_PLL1_0=4, + ClkSrc_PLL1_180=5, + ClkSrc_PLL2_0=6, + ClkSrc_PLL2_180=7 + }; + private: + bool to_bool(Bool x); + Bool from_bool(bool x); + public: + okCPLL22393(); + void SetCrystalLoad(double capload); + void SetReference(double freq); + double GetReference(); + bool SetPLLParameters(int n, int p, int q, bool enable=true); + bool SetPLLLF(int n, int lf); + bool SetOutputDivider(int n, int div); + bool SetOutputSource(int n, ClockSource clksrc); + void SetOutputEnable(int n, bool enable); + int GetPLLP(int n); + int GetPLLQ(int n); + double GetPLLFrequency(int n); + int GetOutputDivider(int n); + ClockSource GetOutputSource(int n); + double GetOutputFrequency(int n); + bool IsOutputEnabled(int n); + bool IsPLLEnabled(int n); + void InitFromProgrammingInfo(unsigned char* buf); + void GetProgrammingInfo(unsigned char* buf); + }; + + //------------------------------------------------------------------------ + // okCFrontPanel C++ wrapper class + //------------------------------------------------------------------------ + class okCFrontPanel + { + public: + okFrontPanel_HANDLE h; + enum BoardModel + { + brdUnknown=0, + brdXEM3001v1=1, + brdXEM3001v2=2, + brdXEM3010=3, + brdXEM3005=4, + brdXEM3001CL=5, + brdXEM3020=6, + brdXEM3050=7, + brdXEM9002=8, + brdXEM3001RB=9, + brdXEM5010=10, + brdXEM6110LX45=11, + brdXEM6110LX150=15, + brdXEM6001=12, + brdXEM6010LX45=13, + brdXEM6010LX150=14, + brdXEM6006LX9=16, + brdXEM6006LX16=17, + brdXEM6006LX25=18, + brdXEM5010LX110=19, + brdZEM4310=20, + brdXEM6310LX45=21, + brdXEM6310LX150=22, + brdXEM6110v2LX45=23, + brdXEM6110v2LX150=24 + }; + enum ErrorCode + { + NoError = 0, + Failed = -1, + Timeout = -2, + DoneNotHigh = -3, + TransferError = -4, + CommunicationError = -5, + InvalidBitstream = -6, + FileError = -7, + DeviceNotOpen = -8, + InvalidEndpoint = -9, + InvalidBlockSize = -10, + I2CRestrictedAddress = -11, + I2CBitError = -12, + I2CNack = -13, + I2CUnknownStatus = -14, + UnsupportedFeature = -15, + FIFOUnderflow = -16, + FIFOOverflow = -17, + DataAlignmentError = -18, + InvalidResetProfile = -19, + InvalidParameter = -20 + }; + private: + bool to_bool(Bool x); + Bool from_bool(bool x); + public: + okCFrontPanel(); + ~okCFrontPanel(); + int GetHostInterfaceWidth(); + BoardModel GetBoardModel(); + std::string GetBoardModelString(BoardModel m); + int GetDeviceCount(); + ErrorCode GetFPGABootResetProfile(okTFPGAResetProfile* profile); + ErrorCode GetFPGAJTAGResetProfile(okTFPGAResetProfile* profile); + ErrorCode SetFPGABootResetProfile(okTFPGAResetProfile* profile); + ErrorCode SetFPGAJTAGResetProfile(okTFPGAResetProfile* profile); + ErrorCode FlashEraseSector(UINT32 address); + ErrorCode FlashWrite(UINT32 address, UINT32 length, const UINT8* buf); + ErrorCode FlashRead(UINT32 address, UINT32 length, UINT8* buf); + ErrorCode ReadRegister(UINT32 addr, UINT32* data); + ErrorCode ReadRegisterSet(okTRegisterSet* set); + ErrorCode WriteRegister(UINT32 addr, UINT32 data); + ErrorCode WriteRegisterSet(okTRegisterSet* set); + BoardModel GetDeviceListModel(int num); + std::string GetDeviceListSerial(int num); + void EnableAsynchronousTransfers(bool enable); + ErrorCode OpenBySerial(std::string str = ""); + bool IsOpen(); + ErrorCode GetDeviceInfo(okTDeviceInfo* info); + int GetDeviceMajorVersion(); + int GetDeviceMinorVersion(); + std::string GetSerialNumber(); + std::string GetDeviceID(); + void SetDeviceID(const std::string str); + ErrorCode SetBTPipePollingInterval(int interval); + void SetTimeout(int timeout); + ErrorCode ResetFPGA(); + ErrorCode ConfigureFPGAFromMemory(unsigned char* data, const unsigned long length, + void(*callback)(int, int, void*) = NULL, void* arg = NULL); + ErrorCode ConfigureFPGA(const std::string strFilename, + void (*callback)(int, int, void*) = NULL, void* arg = NULL); + ErrorCode WriteI2C(const int addr, int length, unsigned char* data); + ErrorCode ReadI2C(const int addr, int length, unsigned char* data); + ErrorCode GetPLL22150Configuration(okCPLL22150& pll); + ErrorCode SetPLL22150Configuration(okCPLL22150& pll); + ErrorCode GetEepromPLL22150Configuration(okCPLL22150& pll); + ErrorCode SetEepromPLL22150Configuration(okCPLL22150& pll); + ErrorCode GetPLL22393Configuration(okCPLL22393& pll); + ErrorCode SetPLL22393Configuration(okCPLL22393& pll); + ErrorCode GetEepromPLL22393Configuration(okCPLL22393& pll); + ErrorCode SetEepromPLL22393Configuration(okCPLL22393& pll); + ErrorCode LoadDefaultPLLConfiguration(); + bool IsHighSpeed(); + bool IsFrontPanelEnabled(); + bool IsFrontPanel3Supported(); + void UpdateWireIns(); + ErrorCode GetWireInValue(int epAddr, UINT32* val); + ErrorCode SetWireInValue(int ep, unsigned long val, unsigned long mask = 0xffffffff); + void UpdateWireOuts(); + unsigned long GetWireOutValue(int epAddr); + ErrorCode ActivateTriggerIn(int epAddr, int bit); + void UpdateTriggerOuts(); + bool IsTriggered(int epAddr, unsigned long mask); + long GetLastTransferLength(); + long WriteToPipeIn(int epAddr, long length, unsigned char* data); + long ReadFromPipeOut(int epAddr, long length, unsigned char* data); + long WriteToBlockPipeIn(int epAddr, int blockSize, long length, unsigned char* data); + long ReadFromBlockPipeOut(int epAddr, int blockSize, long length, unsigned char* data); + }; #endif // !defined(FRONTPANELDLL_EXPORTS) } diff --git a/Source/Processors/DataThreads/rhythm-api/rhd2000datablock.cpp b/Source/Processors/DataThreads/rhythm-api/rhd2000datablock.cpp index 7778b24e3acb528eaa83075d4830eb97ff1df87b..d80dc6ebc2750f75400b64eda43cb145b2c1fdb8 100755 --- a/Source/Processors/DataThreads/rhythm-api/rhd2000datablock.cpp +++ b/Source/Processors/DataThreads/rhythm-api/rhd2000datablock.cpp @@ -69,10 +69,12 @@ void Rhd2000DataBlock::allocateIntArray3D(vector<vector<vector<int> > > &array3D int i, j; array3D.resize(xSize); - for (i = 0; i < xSize; ++i) { + for (i = 0; i < xSize; ++i) + { array3D[i].resize(ySize); - for (j = 0; j < ySize; ++j) { + for (j = 0; j < ySize; ++j) + { array3D[i][j].resize(zSize); } } @@ -142,8 +144,10 @@ void Rhd2000DataBlock::fillFromUsbBuffer(unsigned char usbBuffer[], int blockInd int index, t, channel, stream, i; index = blockIndex * 2 * calculateDataBlockSizeInWords(numDataStreams); - for (t = 0; t < SAMPLES_PER_DATA_BLOCK; ++t) { - if (!checkUsbHeader(usbBuffer, index)) { + for (t = 0; t < SAMPLES_PER_DATA_BLOCK; ++t) + { + if (!checkUsbHeader(usbBuffer, index)) + { cerr << "Error in Rhd2000EvalBoard::readDataBlock: Incorrect header." << endl; } index += 8; @@ -151,16 +155,20 @@ void Rhd2000DataBlock::fillFromUsbBuffer(unsigned char usbBuffer[], int blockInd index += 4; // Read auxiliary results - for (channel = 0; channel < 3; ++channel) { - for (stream = 0; stream < numDataStreams; ++stream) { + for (channel = 0; channel < 3; ++channel) + { + for (stream = 0; stream < numDataStreams; ++stream) + { auxiliaryData[stream][channel][t] = convertUsbWord(usbBuffer, index); index += 2; } } // Read amplifier channels - for (channel = 0; channel < 32; ++channel) { - for (stream = 0; stream < numDataStreams; ++stream) { + for (channel = 0; channel < 32; ++channel) + { + for (stream = 0; stream < numDataStreams; ++stream) + { amplifierData[stream][channel][t] = convertUsbWord(usbBuffer, index); index += 2; } @@ -170,7 +178,8 @@ void Rhd2000DataBlock::fillFromUsbBuffer(unsigned char usbBuffer[], int blockInd index += 2 * numDataStreams; // Read from AD5662 ADCs - for (i = 0; i < 8; ++i) { + for (i = 0; i < 8; ++i) + { boardAdcData[i][t] = convertUsbWord(usbBuffer, index); index += 2; } @@ -194,24 +203,25 @@ void Rhd2000DataBlock::print(int stream) const cout << "RHD 2000 Data Block contents:" << endl; cout << " ROM contents:" << endl; cout << " Chip Name: " << - (char) auxiliaryData[stream][2][24] << - (char) auxiliaryData[stream][2][25] << - (char) auxiliaryData[stream][2][26] << - (char) auxiliaryData[stream][2][27] << - (char) auxiliaryData[stream][2][28] << - (char) auxiliaryData[stream][2][29] << - (char) auxiliaryData[stream][2][30] << - (char) auxiliaryData[stream][2][31] << endl; + (char) auxiliaryData[stream][2][24] << + (char) auxiliaryData[stream][2][25] << + (char) auxiliaryData[stream][2][26] << + (char) auxiliaryData[stream][2][27] << + (char) auxiliaryData[stream][2][28] << + (char) auxiliaryData[stream][2][29] << + (char) auxiliaryData[stream][2][30] << + (char) auxiliaryData[stream][2][31] << endl; cout << " Company Name:" << - (char) auxiliaryData[stream][2][32] << - (char) auxiliaryData[stream][2][33] << - (char) auxiliaryData[stream][2][34] << - (char) auxiliaryData[stream][2][35] << - (char) auxiliaryData[stream][2][36] << endl; + (char) auxiliaryData[stream][2][32] << + (char) auxiliaryData[stream][2][33] << + (char) auxiliaryData[stream][2][34] << + (char) auxiliaryData[stream][2][35] << + (char) auxiliaryData[stream][2][36] << endl; cout << " Intan Chip ID: " << auxiliaryData[stream][2][19] << endl; cout << " Number of Amps: " << auxiliaryData[stream][2][20] << endl; cout << " Unipolar/Bipolar Amps: "; - switch (auxiliaryData[stream][2][21]) { + switch (auxiliaryData[stream][2][21]) + { case 0: cout << "bipolar"; break; @@ -236,7 +246,7 @@ void Rhd2000DataBlock::print(int stream) const cout << " MUX bias: " << ((auxiliaryData[stream][2][RamOffset + 2] & 0x3f) >> 0) << endl; cout << " MUX load: " << ((auxiliaryData[stream][2][RamOffset + 3] & 0xe0) >> 5) << endl; cout << " tempS2, tempS1: " << ((auxiliaryData[stream][2][RamOffset + 3] & 0x10) >> 4) << "," << - ((auxiliaryData[stream][2][RamOffset + 3] & 0x08) >> 3) << endl; + ((auxiliaryData[stream][2][RamOffset + 3] & 0x08) >> 3) << endl; cout << " tempen: " << ((auxiliaryData[stream][2][RamOffset + 3] & 0x04) >> 2) << endl; cout << " digout HiZ: " << ((auxiliaryData[stream][2][RamOffset + 3] & 0x02) >> 1) << endl; cout << " digout: " << ((auxiliaryData[stream][2][RamOffset + 3] & 0x01) >> 0) << endl; @@ -275,45 +285,45 @@ void Rhd2000DataBlock::print(int stream) const cout << fixed << setprecision(2); cout << " RH1 DAC1, DAC2: " << rH1Dac1 << " " << rH1Dac2 << " = " << (rH1 / 1000) << - " kOhm" << endl; + " kOhm" << endl; cout << " RH2 DAC1, DAC2: " << rH2Dac1 << " " << rH2Dac2 << " = " << (rH2 / 1000) << - " kOhm" << endl; + " kOhm" << endl; cout << " RL DAC1, DAC2, DAC3: " << rLDac1 << " " << rLDac2 << " " << rLDac3 << " = " << - (rL / 1000) << " kOhm" << endl; + (rL / 1000) << " kOhm" << endl; cout << " amp power[31:0]: " << - ((auxiliaryData[stream][2][RamOffset + 17] & 0x80) >> 7) << - ((auxiliaryData[stream][2][RamOffset + 17] & 0x40) >> 6) << - ((auxiliaryData[stream][2][RamOffset + 17] & 0x20) >> 5) << - ((auxiliaryData[stream][2][RamOffset + 17] & 0x10) >> 4) << - ((auxiliaryData[stream][2][RamOffset + 17] & 0x08) >> 3) << - ((auxiliaryData[stream][2][RamOffset + 17] & 0x04) >> 2) << - ((auxiliaryData[stream][2][RamOffset + 17] & 0x02) >> 1) << - ((auxiliaryData[stream][2][RamOffset + 17] & 0x01) >> 0) << " " << - ((auxiliaryData[stream][2][RamOffset + 16] & 0x80) >> 7) << - ((auxiliaryData[stream][2][RamOffset + 16] & 0x40) >> 6) << - ((auxiliaryData[stream][2][RamOffset + 16] & 0x20) >> 5) << - ((auxiliaryData[stream][2][RamOffset + 16] & 0x10) >> 4) << - ((auxiliaryData[stream][2][RamOffset + 16] & 0x08) >> 3) << - ((auxiliaryData[stream][2][RamOffset + 16] & 0x04) >> 2) << - ((auxiliaryData[stream][2][RamOffset + 16] & 0x02) >> 1) << - ((auxiliaryData[stream][2][RamOffset + 16] & 0x01) >> 0) << " " << - ((auxiliaryData[stream][2][RamOffset + 15] & 0x80) >> 7) << - ((auxiliaryData[stream][2][RamOffset + 15] & 0x40) >> 6) << - ((auxiliaryData[stream][2][RamOffset + 15] & 0x20) >> 5) << - ((auxiliaryData[stream][2][RamOffset + 15] & 0x10) >> 4) << - ((auxiliaryData[stream][2][RamOffset + 15] & 0x08) >> 3) << - ((auxiliaryData[stream][2][RamOffset + 15] & 0x04) >> 2) << - ((auxiliaryData[stream][2][RamOffset + 15] & 0x02) >> 1) << - ((auxiliaryData[stream][2][RamOffset + 15] & 0x01) >> 0) << " " << - ((auxiliaryData[stream][2][RamOffset + 14] & 0x80) >> 7) << - ((auxiliaryData[stream][2][RamOffset + 14] & 0x40) >> 6) << - ((auxiliaryData[stream][2][RamOffset + 14] & 0x20) >> 5) << - ((auxiliaryData[stream][2][RamOffset + 14] & 0x10) >> 4) << - ((auxiliaryData[stream][2][RamOffset + 14] & 0x08) >> 3) << - ((auxiliaryData[stream][2][RamOffset + 14] & 0x04) >> 2) << - ((auxiliaryData[stream][2][RamOffset + 14] & 0x02) >> 1) << - ((auxiliaryData[stream][2][RamOffset + 14] & 0x01) >> 0) << endl; + ((auxiliaryData[stream][2][RamOffset + 17] & 0x80) >> 7) << + ((auxiliaryData[stream][2][RamOffset + 17] & 0x40) >> 6) << + ((auxiliaryData[stream][2][RamOffset + 17] & 0x20) >> 5) << + ((auxiliaryData[stream][2][RamOffset + 17] & 0x10) >> 4) << + ((auxiliaryData[stream][2][RamOffset + 17] & 0x08) >> 3) << + ((auxiliaryData[stream][2][RamOffset + 17] & 0x04) >> 2) << + ((auxiliaryData[stream][2][RamOffset + 17] & 0x02) >> 1) << + ((auxiliaryData[stream][2][RamOffset + 17] & 0x01) >> 0) << " " << + ((auxiliaryData[stream][2][RamOffset + 16] & 0x80) >> 7) << + ((auxiliaryData[stream][2][RamOffset + 16] & 0x40) >> 6) << + ((auxiliaryData[stream][2][RamOffset + 16] & 0x20) >> 5) << + ((auxiliaryData[stream][2][RamOffset + 16] & 0x10) >> 4) << + ((auxiliaryData[stream][2][RamOffset + 16] & 0x08) >> 3) << + ((auxiliaryData[stream][2][RamOffset + 16] & 0x04) >> 2) << + ((auxiliaryData[stream][2][RamOffset + 16] & 0x02) >> 1) << + ((auxiliaryData[stream][2][RamOffset + 16] & 0x01) >> 0) << " " << + ((auxiliaryData[stream][2][RamOffset + 15] & 0x80) >> 7) << + ((auxiliaryData[stream][2][RamOffset + 15] & 0x40) >> 6) << + ((auxiliaryData[stream][2][RamOffset + 15] & 0x20) >> 5) << + ((auxiliaryData[stream][2][RamOffset + 15] & 0x10) >> 4) << + ((auxiliaryData[stream][2][RamOffset + 15] & 0x08) >> 3) << + ((auxiliaryData[stream][2][RamOffset + 15] & 0x04) >> 2) << + ((auxiliaryData[stream][2][RamOffset + 15] & 0x02) >> 1) << + ((auxiliaryData[stream][2][RamOffset + 15] & 0x01) >> 0) << " " << + ((auxiliaryData[stream][2][RamOffset + 14] & 0x80) >> 7) << + ((auxiliaryData[stream][2][RamOffset + 14] & 0x40) >> 6) << + ((auxiliaryData[stream][2][RamOffset + 14] & 0x20) >> 5) << + ((auxiliaryData[stream][2][RamOffset + 14] & 0x10) >> 4) << + ((auxiliaryData[stream][2][RamOffset + 14] & 0x08) >> 3) << + ((auxiliaryData[stream][2][RamOffset + 14] & 0x04) >> 2) << + ((auxiliaryData[stream][2][RamOffset + 14] & 0x02) >> 1) << + ((auxiliaryData[stream][2][RamOffset + 14] & 0x01) >> 0) << endl; cout << endl; @@ -328,7 +338,7 @@ void Rhd2000DataBlock::print(int stream) const cout << setprecision(1); cout << " Temperature sensor (only one reading): " << tempUnitsC << " C (" << - tempUnitsF << " F)" << endl; + tempUnitsF << " F)" << endl; cout << setprecision(2); cout << " Supply voltage sensor : " << vddSense << " V" << endl; @@ -344,7 +354,7 @@ void Rhd2000DataBlock::print(int stream) const // the processor running the operating system. // // (See "Endianness" article in Wikipedia for more information.) -void Rhd2000DataBlock::writeWordLittleEndian(ofstream &outputStream, int dataWord) const +void Rhd2000DataBlock::writeWordLittleEndian(ofstream& outputStream, int dataWord) const { unsigned short msb, lsb; @@ -356,23 +366,29 @@ void Rhd2000DataBlock::writeWordLittleEndian(ofstream &outputStream, int dataWor } // Write contents of data block to a binary output stream (saveOut) in little endian format. -void Rhd2000DataBlock::write(ofstream &saveOut, int numDataStreams) const +void Rhd2000DataBlock::write(ofstream& saveOut, int numDataStreams) const { int t, channel, stream, i; - for (t = 0; t < SAMPLES_PER_DATA_BLOCK; ++t) { + for (t = 0; t < SAMPLES_PER_DATA_BLOCK; ++t) + { writeWordLittleEndian(saveOut, timeStamp[t]); - for (channel = 0; channel < 32; ++channel) { - for (stream = 0; stream < numDataStreams; ++stream) { + for (channel = 0; channel < 32; ++channel) + { + for (stream = 0; stream < numDataStreams; ++stream) + { writeWordLittleEndian(saveOut, amplifierData[stream][channel][t]); } } - for (channel = 0; channel < 3; ++channel) { - for (stream = 0; stream < numDataStreams; ++stream) { + for (channel = 0; channel < 3; ++channel) + { + for (stream = 0; stream < numDataStreams; ++stream) + { writeWordLittleEndian(saveOut, auxiliaryData[stream][channel][t]); } } - for (i = 0; i < 8; ++i) { + for (i = 0; i < 8; ++i) + { writeWordLittleEndian(saveOut, boardAdcData[i][t]); } writeWordLittleEndian(saveOut, ttlIn[t]); diff --git a/Source/Processors/DataThreads/rhythm-api/rhd2000datablock.h b/Source/Processors/DataThreads/rhythm-api/rhd2000datablock.h index 47337dde8b7358d418baf98434ed07a103fcfb4c..9f2ddab578ae6d65ee0bdb93a756db2aaa09119a 100755 --- a/Source/Processors/DataThreads/rhythm-api/rhd2000datablock.h +++ b/Source/Processors/DataThreads/rhythm-api/rhd2000datablock.h @@ -43,7 +43,7 @@ public: static unsigned int getSamplesPerDataBlock(); void fillFromUsbBuffer(unsigned char usbBuffer[], int blockIndex, int numDataStreams); void print(int stream) const; - void write(ofstream &saveOut, int numDataStreams) const; + void write(ofstream& saveOut, int numDataStreams) const; private: void allocateIntArray3D(vector<vector<vector<int> > > &array3D, int xSize, int ySize, int zSize); @@ -51,7 +51,7 @@ private: void allocateIntArray1D(vector<int> &array1D, int xSize); void allocateUIntArray1D(vector<unsigned int> &array1D, int xSize); - void writeWordLittleEndian(ofstream &outputStream, int dataWord) const; + void writeWordLittleEndian(ofstream& outputStream, int dataWord) const; bool checkUsbHeader(unsigned char usbBuffer[], int index); unsigned int convertUsbTimeStamp(unsigned char usbBuffer[], int index); diff --git a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp index 89a63125e10a6aa1a2dd591f5a5cf3f54176c81a..80d84aa07c4c213fbfcef2e1a8f372f91086fa73 100755 --- a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp +++ b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp @@ -42,7 +42,8 @@ Rhd2000EvalBoard::Rhd2000EvalBoard() sampleRate = SampleRate30000Hz; // Rhythm FPGA boots up with 30.0 kS/s/channel sampling rate numDataStreams = 0; - for (i = 0; i < MAX_NUM_DATA_STREAMS; ++i) { + for (i = 0; i < MAX_NUM_DATA_STREAMS; ++i) + { dataStreamEnabled[i] = 0; } } @@ -56,9 +57,10 @@ int Rhd2000EvalBoard::open() int i, nDevices; cout << "---- Intan Technologies ---- Rhythm RHD2000 Controller v1.0 ----" << endl << endl; - if (okFrontPanelDLL_LoadLib(NULL) == false) { + if (okFrontPanelDLL_LoadLib(NULL) == false) + { cerr << "FrontPanel DLL could not be loaded. " << - "Make sure this DLL is in the application start directory." << endl; + "Make sure this DLL is in the application start directory." << endl; return -1; } okFrontPanelDLL_GetVersion(dll_date, dll_time); @@ -69,24 +71,28 @@ int Rhd2000EvalBoard::open() cout << endl << "Scanning USB for Opal Kelly devices..." << endl << endl; nDevices = dev->GetDeviceCount(); cout << "Found " << nDevices << " Opal Kelly device" << ((nDevices == 1) ? "" : "s") << - " connected:" << endl; - for (i = 0; i < nDevices; ++i) { + " connected:" << endl; + for (i = 0; i < nDevices; ++i) + { cout << " Device #" << i + 1 << ": Opal Kelly " << - opalKellyModelName(dev->GetDeviceListModel(i)).c_str() << - " with serial number " << dev->GetDeviceListSerial(i).c_str() << endl; + opalKellyModelName(dev->GetDeviceListModel(i)).c_str() << + " with serial number " << dev->GetDeviceListSerial(i).c_str() << endl; } cout << endl; // Find first device in list of type XEM6010LX45. - for (i = 0; i < nDevices; ++i) { - if (dev->GetDeviceListModel(i) == OK_PRODUCT_XEM6010LX45) { + for (i = 0; i < nDevices; ++i) + { + if (dev->GetDeviceListModel(i) == OK_PRODUCT_XEM6010LX45) + { serialNumber = dev->GetDeviceListSerial(i); break; } } // Attempt to open device. - if (dev->OpenBySerial(serialNumber) != okCFrontPanel::NoError) { + if (dev->OpenBySerial(serialNumber) != okCFrontPanel::NoError) + { delete dev; cerr << "Device could not be opened. Is one connected?" << endl; return -2; @@ -98,7 +104,7 @@ int Rhd2000EvalBoard::open() // Get some general information about the XEM. cout << "FPGA system clock: " << getSystemClockFreq() << " MHz" << endl; // Should indicate 100 MHz cout << "Opal Kelly device firmware version: " << dev->GetDeviceMajorVersion() << "." << - dev->GetDeviceMinorVersion() << endl; + dev->GetDeviceMinorVersion() << endl; cout << "Opal Kelly device serial number: " << dev->GetSerialNumber().c_str() << endl; cout << "Opal Kelly device ID string: " << dev->GetDeviceID().c_str() << endl << endl; @@ -110,7 +116,8 @@ bool Rhd2000EvalBoard::uploadFpgaBitfile(string filename) { okCFrontPanel::ErrorCode errorCode = dev->ConfigureFPGA(filename); - switch (errorCode) { + switch (errorCode) + { case okCFrontPanel::NoError: break; case okCFrontPanel::DeviceNotOpen: @@ -140,7 +147,8 @@ bool Rhd2000EvalBoard::uploadFpgaBitfile(string filename) } // Check for Opal Kelly FrontPanel support in the FPGA configuration. - if (dev->IsFrontPanelEnabled() == false) { + if (dev->IsFrontPanelEnabled() == false) + { cerr << "Opal Kelly FrontPanel support is not enabled in this FPGA configuration." << endl; delete dev; return(false); @@ -151,12 +159,15 @@ bool Rhd2000EvalBoard::uploadFpgaBitfile(string filename) boardId = dev->GetWireOutValue(WireOutBoardId); boardVersion = dev->GetWireOutValue(WireOutBoardVersion); - if (boardId != RHYTHM_BOARD_ID) { + if (boardId != RHYTHM_BOARD_ID) + { cerr << "FPGA configuration does not support Rhythm. Incorrect board ID: " << boardId << endl; return(false); - } else { + } + else + { cout << "Rhythm configuration file successfully loaded. Rhythm version number: " << - boardVersion << endl << endl; + boardVersion << endl << endl; } return(true); @@ -215,7 +226,8 @@ void Rhd2000EvalBoard::initialize() setDataSource(7, PortD2); enableDataStream(0, true); // start with only one data stream enabled - for (i = 1; i < MAX_NUM_DATA_STREAMS; i++) { + for (i = 1; i < MAX_NUM_DATA_STREAMS; i++) + { enableDataStream(i, false); } @@ -311,7 +323,8 @@ bool Rhd2000EvalBoard::setSampleRate(AmplifierSampleRate newSampleRate) unsigned long M, D; - switch (newSampleRate) { + switch (newSampleRate) + { case SampleRate1000Hz: M = 7; D = 125; @@ -403,7 +416,8 @@ bool Rhd2000EvalBoard::setSampleRate(AmplifierSampleRate newSampleRate) // Returns the current per-channel sampling rate (in Hz) as a floating-point number. double Rhd2000EvalBoard::getSampleRate() const { - switch (sampleRate) { + switch (sampleRate) + { case SampleRate1000Hz: return 1000.0; break; @@ -472,27 +486,41 @@ void Rhd2000EvalBoard::printCommandList(const vector<int> &commandList) const int cmd, channel, reg, data; cout << endl; - for (i = 0; i < commandList.size(); ++i) { + for (i = 0; i < commandList.size(); ++i) + { cmd = commandList[i]; - if (cmd < 0 || cmd > 0xffff) { + if (cmd < 0 || cmd > 0xffff) + { cout << " command[" << i << "] = INVALID COMMAND: " << cmd << endl; - } else if ((cmd & 0xc000) == 0x0000) { + } + else if ((cmd & 0xc000) == 0x0000) + { channel = (cmd & 0x3f00) >> 8; cout << " command[" << i << "] = CONVERT(" << channel << ")" << endl; - } else if ((cmd & 0xc000) == 0xc000) { + } + else if ((cmd & 0xc000) == 0xc000) + { reg = (cmd & 0x3f00) >> 8; cout << " command[" << i << "] = READ(" << reg << ")" << endl; - } else if ((cmd & 0xc000) == 0x8000) { + } + else if ((cmd & 0xc000) == 0x8000) + { reg = (cmd & 0x3f00) >> 8; data = (cmd & 0x00ff); cout << " command[" << i << "] = WRITE(" << reg << ","; cout << hex << uppercase << internal << setfill('0') << setw(2) << data << nouppercase << dec; cout << ")" << endl; - } else if (cmd == 0x5500) { + } + else if (cmd == 0x5500) + { cout << " command[" << i << "] = CALIBRATE" << endl; - } else if (cmd == 0x6a00) { + } + else if (cmd == 0x6a00) + { cout << " command[" << i << "] = CLEAR" << endl; - } else { + } + else + { cout << " command[" << i << "] = INVALID COMMAND: "; cout << hex << uppercase << internal << setfill('0') << setw(4) << cmd << nouppercase << dec; cout << endl; @@ -507,22 +535,26 @@ void Rhd2000EvalBoard::uploadCommandList(const vector<int> &commandList, AuxCmdS { unsigned int i; - if (auxCommandSlot != AuxCmd1 && auxCommandSlot != AuxCmd2 && auxCommandSlot != AuxCmd3) { + if (auxCommandSlot != AuxCmd1 && auxCommandSlot != AuxCmd2 && auxCommandSlot != AuxCmd3) + { cerr << "Error in Rhd2000EvalBoard::uploadCommandList: auxCommandSlot out of range." << endl; return; } - if (bank < 0 || bank > 15) { + if (bank < 0 || bank > 15) + { cerr << "Error in Rhd2000EvalBoard::uploadCommandList: bank out of range." << endl; return; } - for (i = 0; i < commandList.size(); ++i) { + for (i = 0; i < commandList.size(); ++i) + { dev->SetWireInValue(WireInCmdRamData, commandList[i]); dev->SetWireInValue(WireInCmdRamAddr, i); dev->SetWireInValue(WireInCmdRamBank, bank); dev->UpdateWireIns(); - switch (auxCommandSlot) { + switch (auxCommandSlot) + { case AuxCmd1: dev->ActivateTriggerIn(TrigInRamWrite, 0); break; @@ -542,16 +574,19 @@ void Rhd2000EvalBoard::selectAuxCommandBank(BoardPort port, AuxCmdSlot auxComman { int bitShift; - if (auxCommandSlot != AuxCmd1 && auxCommandSlot != AuxCmd2 && auxCommandSlot != AuxCmd3) { + if (auxCommandSlot != AuxCmd1 && auxCommandSlot != AuxCmd2 && auxCommandSlot != AuxCmd3) + { cerr << "Error in Rhd2000EvalBoard::selectAuxCommandBank: auxCommandSlot out of range." << endl; return; } - if (bank < 0 || bank > 15) { + if (bank < 0 || bank > 15) + { cerr << "Error in Rhd2000EvalBoard::selectAuxCommandBank: bank out of range." << endl; return; } - switch (port) { + switch (port) + { case PortA: bitShift = 0; break; @@ -566,7 +601,8 @@ void Rhd2000EvalBoard::selectAuxCommandBank(BoardPort port, AuxCmdSlot auxComman break; } - switch (auxCommandSlot) { + switch (auxCommandSlot) + { case AuxCmd1: dev->SetWireInValue(WireInAuxCmdBank1, bank << bitShift, 0x000f << bitShift); break; @@ -584,22 +620,26 @@ void Rhd2000EvalBoard::selectAuxCommandBank(BoardPort port, AuxCmdSlot auxComman // auxiliary command slot (AuxCmd1, AuxCmd2, or AuxCmd3). void Rhd2000EvalBoard::selectAuxCommandLength(AuxCmdSlot auxCommandSlot, int loopIndex, int endIndex) { - if (auxCommandSlot != AuxCmd1 && auxCommandSlot != AuxCmd2 && auxCommandSlot != AuxCmd3) { + if (auxCommandSlot != AuxCmd1 && auxCommandSlot != AuxCmd2 && auxCommandSlot != AuxCmd3) + { cerr << "Error in Rhd2000EvalBoard::selectAuxCommandLength: auxCommandSlot out of range." << endl; return; } - if (loopIndex < 0 || loopIndex > 1023) { + if (loopIndex < 0 || loopIndex > 1023) + { cerr << "Error in Rhd2000EvalBoard::selectAuxCommandLength: loopIndex out of range." << endl; return; } - if (endIndex < 0 || endIndex > 1023) { + if (endIndex < 0 || endIndex > 1023) + { cerr << "Error in Rhd2000EvalBoard::selectAuxCommandLength: endIndex out of range." << endl; return; } - switch (auxCommandSlot) { + switch (auxCommandSlot) + { case AuxCmd1: dev->SetWireInValue(WireInAuxCmdLoop1, loopIndex); dev->SetWireInValue(WireInAuxCmdLength1, endIndex); @@ -630,9 +670,12 @@ void Rhd2000EvalBoard::resetBoard() // maxTimeStep is reached (if continuousMode == false). void Rhd2000EvalBoard::setContinuousRunMode(bool continuousMode) { - if (continuousMode) { + if (continuousMode) + { dev->SetWireInValue(WireInResetRun, 0x02, 0x02); - } else { + } + else + { dev->SetWireInValue(WireInResetRun, 0x00, 0x02); } dev->UpdateWireIns(); @@ -665,9 +708,12 @@ bool Rhd2000EvalBoard::isRunning() const dev->UpdateWireOuts(); value = dev->GetWireOutValue(WireOutSpiRunning); - if ((value & 0x01) == 0) { + if ((value & 0x01) == 0) + { return false; - } else { + } + else + { return true; } } @@ -696,12 +742,14 @@ void Rhd2000EvalBoard::setCableDelay(BoardPort port, int delay) { int bitShift; - if (delay < 0 || delay > 15) { + if (delay < 0 || delay > 15) + { cerr << "Error in Rhd2000EvalBoard::setCableDelay: delay out of range." << endl; return; } - switch (port) { + switch (port) + { case PortA: bitShift = 0; break; @@ -794,12 +842,14 @@ void Rhd2000EvalBoard::setDataSource(int stream, BoardDataSource dataSource) int bitShift; OkEndPoint endPoint; - if (stream < 0 || stream > 7) { + if (stream < 0 || stream > 7) + { cerr << "Error in Rhd2000EvalBoard::setDataSource: stream out of range." << endl; return; } - switch (stream) { + switch (stream) + { case 0: endPoint = WireInDataStreamSel1234; bitShift = 0; @@ -841,20 +891,26 @@ void Rhd2000EvalBoard::setDataSource(int stream, BoardDataSource dataSource) // Enable or disable one of the eight available USB data streams (0-7). void Rhd2000EvalBoard::enableDataStream(int stream, bool enabled) { - if (stream < 0 || stream > (MAX_NUM_DATA_STREAMS - 1)) { + if (stream < 0 || stream > (MAX_NUM_DATA_STREAMS - 1)) + { cerr << "Error in Rhd2000EvalBoard::setDataSource: stream out of range." << endl; return; } - if (enabled) { - if (dataStreamEnabled[stream] == 0) { + if (enabled) + { + if (dataStreamEnabled[stream] == 0) + { dev->SetWireInValue(WireInDataStreamEn, 0x0001 << stream, 0x0001 << stream); dev->UpdateWireIns(); dataStreamEnabled[stream] = 1; ++numDataStreams; } - } else { - if (dataStreamEnabled[stream] == 1) { + } + else + { + if (dataStreamEnabled[stream] == 1) + { dev->SetWireInValue(WireInDataStreamEn, 0x0000 << stream, 0x0001 << stream); dev->UpdateWireIns(); dataStreamEnabled[stream] = 0; @@ -882,7 +938,8 @@ void Rhd2000EvalBoard::setTtlOut(int ttlOutArray[]) int i, ttlOut; ttlOut = 0; - for (i = 0; i < 16; ++i) { + for (i = 0; i < 16; ++i) + { if (ttlOutArray[i] > 0) ttlOut += 1 << i; } @@ -898,7 +955,8 @@ void Rhd2000EvalBoard::getTtlIn(int ttlInArray[]) dev->UpdateWireOuts(); ttlIn = dev->GetWireOutValue(WireOutTtlIn); - for (i = 0; i < 16; ++i) { + for (i = 0; i < 16; ++i) + { ttlInArray[i] = 0; if ((ttlIn & (1 << i)) > 0) ttlInArray[i] = 1; @@ -907,12 +965,14 @@ void Rhd2000EvalBoard::getTtlIn(int ttlInArray[]) void Rhd2000EvalBoard::setDacManual(DacManual dac, int value) { - if (value < 0 || value > 65535) { + if (value < 0 || value > 65535) + { cerr << "Error in Rhd2000EvalBoard::setDacManual: value out of range." << endl; return; } - switch (dac) { + switch (dac) + { case DacManual1: dev->SetWireInValue(WireInDacManual1, value); break; @@ -929,7 +989,8 @@ void Rhd2000EvalBoard::setLedDisplay(int ledArray[]) int i, ledOut; ledOut = 0; - for (i = 0; i < 8; ++i) { + for (i = 0; i < 8; ++i) + { if (ledArray[i] > 0) ledOut += 1 << i; } @@ -940,12 +1001,14 @@ void Rhd2000EvalBoard::setLedDisplay(int ledArray[]) // Enable or disable AD5662 DAC channel (0-7) void Rhd2000EvalBoard::enableDac(int dacChannel, bool enabled) { - if (dacChannel < 0 || dacChannel > 7) { + if (dacChannel < 0 || dacChannel > 7) + { cerr << "Error in Rhd2000EvalBoard::enableDac: dacChannel out of range." << endl; return; } - switch (dacChannel) { + switch (dacChannel) + { case 0: dev->SetWireInValue(WireInDacSource1, (enabled ? 0x0200 : 0x0000), 0x0200); break; @@ -977,7 +1040,8 @@ void Rhd2000EvalBoard::enableDac(int dacChannel, bool enabled) // Set the gain level of all eight DAC channels to 2^gain (gain = 0-7). void Rhd2000EvalBoard::setDacGain(int gain) { - if (gain < 0 || gain > 7) { + if (gain < 0 || gain > 7) + { cerr << "Error in Rhd2000EvalBoard::setDacGain: gain out of range." << endl; return; } @@ -990,7 +1054,8 @@ void Rhd2000EvalBoard::setDacGain(int gain) // +16*noiseSuppress and -16*noiseSuppress LSBs. (noiseSuppress = 0-127). void Rhd2000EvalBoard::setAudioNoiseSuppress(int noiseSuppress) { - if (noiseSuppress < 0 || noiseSuppress > 127) { + if (noiseSuppress < 0 || noiseSuppress > 127) + { cerr << "Error in Rhd2000EvalBoard::setAudioNoiseSuppress: noiseSuppress out of range." << endl; return; } @@ -1002,17 +1067,20 @@ void Rhd2000EvalBoard::setAudioNoiseSuppress(int noiseSuppress) // Assign a particular data stream (0-7) to a DAC channel (0-7). void Rhd2000EvalBoard::selectDacDataStream(int dacChannel, int stream) { - if (dacChannel < 0 || dacChannel > 7) { + if (dacChannel < 0 || dacChannel > 7) + { cerr << "Error in Rhd2000EvalBoard::selectDacDataStream: dacChannel out of range." << endl; return; } - if (stream < 0 || stream > 9) { + if (stream < 0 || stream > 9) + { cerr << "Error in Rhd2000EvalBoard::selectDacDataStream: stream out of range." << endl; return; } - switch (dacChannel) { + switch (dacChannel) + { case 0: dev->SetWireInValue(WireInDacSource1, stream << 5, 0x01e0); break; @@ -1044,17 +1112,20 @@ void Rhd2000EvalBoard::selectDacDataStream(int dacChannel, int stream) // Assign a particular amplifier channel (0-31) to a DAC channel (0-7). void Rhd2000EvalBoard::selectDacDataChannel(int dacChannel, int dataChannel) { - if (dacChannel < 0 || dacChannel > 7) { + if (dacChannel < 0 || dacChannel > 7) + { cerr << "Error in Rhd2000EvalBoard::selectDacDataChannel: dacChannel out of range." << endl; return; } - if (dataChannel < 0 || dataChannel > 31) { + if (dataChannel < 0 || dataChannel > 31) + { cerr << "Error in Rhd2000EvalBoard::selectDacDataChannel: dataChannel out of range." << endl; return; } - switch (dacChannel) { + switch (dacChannel) + { case 0: dev->SetWireInValue(WireInDacSource1, dataChannel << 0, 0x001f); break; @@ -1109,25 +1180,28 @@ bool Rhd2000EvalBoard::isDataClockLocked() const // data acquisition has been stopped.) void Rhd2000EvalBoard::flush() { - while (numWordsInFifo() >= USB_BUFFER_SIZE / 2) { + while (numWordsInFifo() >= USB_BUFFER_SIZE / 2) + { dev->ReadFromPipeOut(PipeOutData, USB_BUFFER_SIZE, usbBuffer); } - while (numWordsInFifo() > 0) { + while (numWordsInFifo() > 0) + { dev->ReadFromPipeOut(PipeOutData, 2 * numWordsInFifo(), usbBuffer); } } // Read data block from the USB interface, if one is available. Returns true if data block // was available. -bool Rhd2000EvalBoard::readDataBlock(Rhd2000DataBlock *dataBlock) +bool Rhd2000EvalBoard::readDataBlock(Rhd2000DataBlock* dataBlock) { unsigned int numBytesToRead; numBytesToRead = 2 * dataBlock->calculateDataBlockSizeInWords(numDataStreams); - if (numBytesToRead > USB_BUFFER_SIZE) { + if (numBytesToRead > USB_BUFFER_SIZE) + { cerr << "Error in Rhd2000EvalBoard::readDataBlock: USB buffer size exceeded. " << - "Increase value of USB_BUFFER_SIZE." << endl; + "Increase value of USB_BUFFER_SIZE." << endl; return false; } @@ -1144,7 +1218,7 @@ bool Rhd2000EvalBoard::readDataBlocks(int numBlocks, queue<Rhd2000DataBlock> &da { unsigned int numWordsToRead, numBytesToRead; int i; - Rhd2000DataBlock *dataBlock; + Rhd2000DataBlock* dataBlock; numWordsToRead = numBlocks * dataBlock->calculateDataBlockSizeInWords(numDataStreams); @@ -1153,16 +1227,18 @@ bool Rhd2000EvalBoard::readDataBlocks(int numBlocks, queue<Rhd2000DataBlock> &da numBytesToRead = 2 * numWordsToRead; - if (numBytesToRead > USB_BUFFER_SIZE) { + if (numBytesToRead > USB_BUFFER_SIZE) + { cerr << "Error in Rhd2000EvalBoard::readDataBlocks: USB buffer size exceeded. " << - "Increase value of USB_BUFFER_SIZE." << endl; + "Increase value of USB_BUFFER_SIZE." << endl; return false; } dev->ReadFromPipeOut(PipeOutData, numBytesToRead, usbBuffer); dataBlock = new Rhd2000DataBlock(numDataStreams); - for (i = 0; i < numBlocks; ++i) { + for (i = 0; i < numBlocks; ++i) + { // dataBlock = new Rhd2000DataBlock(numDataStreams); dataBlock->fillFromUsbBuffer(usbBuffer, i, numDataStreams); dataQueue.push(*dataBlock); @@ -1175,11 +1251,12 @@ bool Rhd2000EvalBoard::readDataBlocks(int numBlocks, queue<Rhd2000DataBlock> &da // Writes the contents of a data block queue (dataQueue) to a binary output stream (saveOut). // Returns the number of data blocks written. -int Rhd2000EvalBoard::queueToFile(queue<Rhd2000DataBlock> &dataQueue, ofstream &saveOut) +int Rhd2000EvalBoard::queueToFile(queue<Rhd2000DataBlock> &dataQueue, ofstream& saveOut) { int count = 0; - while (!dataQueue.empty()) { + while (!dataQueue.empty()) + { dataQueue.front().write(saveOut, getNumEnabledDataStreams()); dataQueue.pop(); ++count; @@ -1191,7 +1268,8 @@ int Rhd2000EvalBoard::queueToFile(queue<Rhd2000DataBlock> &dataQueue, ofstream & // Return name of Opal Kelly board based on model code. string Rhd2000EvalBoard::opalKellyModelName(int model) const { - switch (model) { + switch (model) + { case OK_PRODUCT_XEM3001V1: return("XEM3001V1"); case OK_PRODUCT_XEM3001V2: diff --git a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h index 8c41b5478036493b0f4cf04b961db54a77c12ce7..51df0829f41c1dc30a63ee35611a5eb2ca76134d 100755 --- a/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h +++ b/Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h @@ -43,7 +43,8 @@ public: bool uploadFpgaBitfile(string filename); void initialize(); - enum AmplifierSampleRate { + enum AmplifierSampleRate + { SampleRate1000Hz, SampleRate1250Hz, SampleRate1500Hz, @@ -67,13 +68,15 @@ public: double getSampleRate() const; AmplifierSampleRate getSampleRateEnum() const; - enum AuxCmdSlot { + enum AuxCmdSlot + { AuxCmd1, AuxCmd2, AuxCmd3 }; - enum BoardPort { + enum BoardPort + { PortA, PortB, PortC, @@ -101,7 +104,8 @@ public: void setDspSettle(bool enabled); - enum BoardDataSource { + enum BoardDataSource + { PortA1 = 0, PortA2 = 1, PortB1 = 2, @@ -128,7 +132,8 @@ public: void setTtlOut(int ttlOutArray[]); void getTtlIn(int ttlInArray[]); - enum DacManual { + enum DacManual + { DacManual1, DacManual2 }; @@ -144,12 +149,12 @@ public: void selectDacDataChannel(int dacChannel, int dataChannel); void flush(); - bool readDataBlock(Rhd2000DataBlock *dataBlock); + bool readDataBlock(Rhd2000DataBlock* dataBlock); bool readDataBlocks(int numBlocks, queue<Rhd2000DataBlock> &dataQueue); - int queueToFile(queue<Rhd2000DataBlock> &dataQueue, std::ofstream &saveOut); + int queueToFile(queue<Rhd2000DataBlock> &dataQueue, std::ofstream& saveOut); private: - okCFrontPanel *dev; + okCFrontPanel* dev; AmplifierSampleRate sampleRate; int numDataStreams; // total number of data streams currently enabled int dataStreamEnabled[MAX_NUM_DATA_STREAMS]; // 0 (disabled) or 1 (enabled) @@ -158,7 +163,8 @@ private: unsigned char usbBuffer[USB_BUFFER_SIZE]; // Opal Kelly module USB interface endpoint addresses - enum OkEndPoint { + enum OkEndPoint + { WireInResetRun = 0x00, WireInMaxTimeStepLsb = 0x01, WireInMaxTimeStepMsb = 0x02, diff --git a/Source/Processors/DataThreads/rhythm-api/rhd2000registers.cpp b/Source/Processors/DataThreads/rhythm-api/rhd2000registers.cpp index 423a2aaaabdd142e1da6283d6dc44cdd961f3063..ee811708b457a0afe4b47d452caa21e01198ce9c 100755 --- a/Source/Processors/DataThreads/rhythm-api/rhd2000registers.cpp +++ b/Source/Processors/DataThreads/rhythm-api/rhd2000registers.cpp @@ -44,35 +44,35 @@ Rhd2000Registers::Rhd2000Registers(double sampleRate) // Set default values for all register settings adcReferenceBw = 3; // ADC reference generator bandwidth (0 [highest BW] - 3 [lowest BW]); - // always set to 3 + // always set to 3 setFastSettle(false); // amplifier fast settle (off = normal operation) ampVrefEnable = 1; // enable amplifier voltage references (0 = power down; 1 = enable); - // 1 = normal operation + // 1 = normal operation adcComparatorBias = 3; // ADC comparator preamp bias current (0 [lowest] - 3 [highest], only - // valid for comparator select = 2,3); always set to 3 + // valid for comparator select = 2,3); always set to 3 adcComparatorSelect = 2; // ADC comparator select; always set to 2 vddSenseEnable = 1; // supply voltage sensor enable (0 = disable; 1 = enable) // adcBufferBias = 32; // ADC reference buffer bias current (0 [highest current] - 63 [lowest current]); - // This value should be set according to ADC sampling rate; set in setSampleRate() + // This value should be set according to ADC sampling rate; set in setSampleRate() // muxBias = 40; // ADC input MUX bias current (0 [highest current] - 63 [lowest current]); - // This value should be set according to ADC sampling rate; set in setSampleRate() + // This value should be set according to ADC sampling rate; set in setSampleRate() // muxLoad = 0; // MUX capacitance load at ADC input (0 [min CL] - 7 [max CL]); LSB = 3 pF - // Set in setSampleRate() + // Set in setSampleRate() tempS1 = 0; // temperature sensor S1 (0-1); 0 = power saving mode when temperature sensor is - // not in use + // not in use tempS2 = 0; // temperature sensor S2 (0-1); 0 = power saving mode when temperature sensor is - // not in use + // not in use tempEn = 0; // temperature sensor enable (0 = disable; 1 = enable) setDigOutHiZ(); // auxiliary digital output state weakMiso = 1; // weak MISO (0 = MISO line is HiZ when CS is inactive; 1 = MISO line is weakly - // driven when CS is inactive) + // driven when CS is inactive) twosComp = 0; // two's complement ADC results (0 = unsigned offset representation; 1 = signed - // representation) + // representation) absMode = 0; // absolute value mode (0 = normal output; 1 = output passed through abs(x) function) enableDsp(true); // DSP offset removal enable/disable setDspCutoffFreq(1.0); // DSP offset removal HPF cutoff freqeuncy @@ -82,7 +82,7 @@ Rhd2000Registers::Rhd2000Registers(double sampleRate) setZcheckScale(ZcheckCs100fF); // impedance testing scale factor (100 fF, 1.0 pF, or 10.0 pF) zcheckConnAll = 0; // impedance testing connect all (0 = normal operation; 1 = connect all electrodes together) setZcheckPolarity(ZcheckPositiveInput); // impedance testing polarity select (RHD2216 only) (0 = test positive inputs; - // 1 = test negative inputs) + // 1 = test negative inputs) enableZcheck(false); // impedance testing enable/disable setZcheckChannel(0); // impedance testing amplifier select (0-63, but MSB is ignored, so 0-31 in practice) @@ -108,31 +108,48 @@ void Rhd2000Registers::defineSampleRate(double newSampleRate) muxLoad = 0; - if (sampleRate < 3334.0) { + if (sampleRate < 3334.0) + { muxBias = 40; adcBufferBias = 32; - } else if (sampleRate < 4001.0) { + } + else if (sampleRate < 4001.0) + { muxBias = 40; adcBufferBias = 16; - } else if (sampleRate < 5001.0) { + } + else if (sampleRate < 5001.0) + { muxBias = 40; adcBufferBias = 8; - } else if (sampleRate < 6251.0) { + } + else if (sampleRate < 6251.0) + { muxBias = 32; adcBufferBias = 8; - } else if (sampleRate < 8001.0) { + } + else if (sampleRate < 8001.0) + { muxBias = 26; adcBufferBias = 8; - } else if (sampleRate < 10001.0) { + } + else if (sampleRate < 10001.0) + { muxBias = 18; adcBufferBias = 4; - } else if (sampleRate < 12501.0) { + } + else if (sampleRate < 12501.0) + { muxBias = 16; adcBufferBias = 3; - } else if (sampleRate < 15001.0) { + } + else if (sampleRate < 15001.0) + { muxBias = 7; adcBufferBias = 3; - } else { + } + else + { muxBias = 4; adcBufferBias = 2; } @@ -203,7 +220,8 @@ double Rhd2000Registers::setDspCutoffFreq(double newDspCutoffFreq) logNewDspCutoffFreq = log10(newDspCutoffFreq); // Generate table of all possible DSP cutoff frequencies - for (n = 1; n < 16; ++n) { + for (n = 1; n < 16; ++n) + { x = pow(2.0, (double) n); fCutoff[n] = sampleRate * log(x / (x - 1.0)) / (2*Pi); logFCutoff[n] = log10(fCutoff[n]); @@ -211,14 +229,21 @@ double Rhd2000Registers::setDspCutoffFreq(double newDspCutoffFreq) } // Now find the closest value to the requested cutoff frequency (on a logarithmic scale) - if (newDspCutoffFreq > fCutoff[1]) { + if (newDspCutoffFreq > fCutoff[1]) + { dspCutoffFreq = 1; - } else if (newDspCutoffFreq < fCutoff[15]) { + } + else if (newDspCutoffFreq < fCutoff[15]) + { dspCutoffFreq = 15; - } else { + } + else + { minLogDiff = 10000000.0; - for (n = 1; n < 16; ++n) { - if (abs(logNewDspCutoffFreq - logFCutoff[n]) < minLogDiff) { + for (n = 1; n < 16; ++n) + { + if (abs(logNewDspCutoffFreq - logFCutoff[n]) < minLogDiff) + { minLogDiff = abs(logNewDspCutoffFreq - logFCutoff[n]); dspCutoffFreq = n; } @@ -256,7 +281,8 @@ void Rhd2000Registers::setZcheckDacPower(bool enabled) // (ZcheckCs100fF, ZcheckCs1pF, or Zcheck10pF). void Rhd2000Registers::setZcheckScale(ZcheckCs scale) { - switch (scale) { + switch (scale) + { case ZcheckCs100fF: zcheckScale = 0x00; // Cs = 0.1 pF break; @@ -273,11 +299,12 @@ void Rhd2000Registers::setZcheckScale(ZcheckCs scale) // on the variable polarity (ZcheckPositiveInput or ZcheckNegativeInput) void Rhd2000Registers::setZcheckPolarity(ZcheckPolarity polarity) { - switch (polarity) { + switch (polarity) + { case ZcheckPositiveInput: zcheckSelPol = 0; break; - case ZcheckNegativeInput: + case ZcheckNegativeInput: zcheckSelPol = 1; break; } @@ -286,9 +313,12 @@ void Rhd2000Registers::setZcheckPolarity(ZcheckPolarity polarity) // Select the amplifier channel (0-31) for impedance testing. int Rhd2000Registers::setZcheckChannel(int channel) { - if (channel < 0 || channel > 31) { + if (channel < 0 || channel > 31) + { return -1; - } else { + } + else + { zcheckSelect = channel; return zcheckSelect; } @@ -297,7 +327,8 @@ int Rhd2000Registers::setZcheckChannel(int channel) // Power up or down selected amplifier on chip void Rhd2000Registers::setAmpPowered(int channel, bool powered) { - if (channel >= 0 && channel <= 31) { + if (channel >= 0 && channel <= 31) + { aPwr[channel] = (powered ? 1 : 0); } } @@ -305,7 +336,8 @@ void Rhd2000Registers::setAmpPowered(int channel, bool powered) // Power up all amplifiers on chip void Rhd2000Registers::powerUpAllAmps() { - for (int channel = 0; channel < 32; ++channel) { + for (int channel = 0; channel < 32; ++channel) + { aPwr[channel] = 1; } } @@ -313,7 +345,8 @@ void Rhd2000Registers::powerUpAllAmps() // Power down all amplifiers on chip void Rhd2000Registers::powerDownAllAmps() { - for (int channel = 0; channel < 32; ++channel) { + for (int channel = 0; channel < 32; ++channel) + { aPwr[channel] = 0; } } @@ -325,10 +358,11 @@ int Rhd2000Registers::getRegisterValue(int reg) const int regout; const int zcheckDac = 128; // midrange - switch (reg) { + switch (reg) + { case 0: regout = (adcReferenceBw << 6) + (ampFastSettle << 5) + (ampVrefEnable << 4) + - (adcComparatorBias << 2) + adcComparatorSelect; + (adcComparatorBias << 2) + adcComparatorSelect; break; case 1: regout = (vddSenseEnable << 6) + adcBufferBias; @@ -338,15 +372,15 @@ int Rhd2000Registers::getRegisterValue(int reg) const break; case 3: regout = (muxLoad << 5) + (tempS2 << 4) + (tempS1 << 3) + (tempEn << 2) + - (digOutHiZ << 1) + digOut; + (digOutHiZ << 1) + digOut; break; case 4: regout = (weakMiso << 7) + (twosComp << 6) + (absMode << 5) + (dspEn << 4) + - dspCutoffFreq; + dspCutoffFreq; break; case 5: regout = (zcheckDacPower << 6) + (zcheckLoad << 5) + (zcheckScale << 3) + - (zcheckConnAll << 2) + (zcheckSelPol << 1) + zcheckEn; + (zcheckConnAll << 2) + (zcheckSelPol << 1) + zcheckEn; break; case 6: regout = zcheckDac; @@ -374,19 +408,19 @@ int Rhd2000Registers::getRegisterValue(int reg) const break; case 14: regout = (aPwr[7] << 7) + (aPwr[6] << 6) + (aPwr[5] << 5) + (aPwr[4] << 4) + - (aPwr[3] << 3) + (aPwr[2] << 2) + (aPwr[1] << 1) + aPwr[0]; + (aPwr[3] << 3) + (aPwr[2] << 2) + (aPwr[1] << 1) + aPwr[0]; break; case 15: regout = (aPwr[15] << 7) + (aPwr[14] << 6) + (aPwr[13] << 5) + (aPwr[12] << 4) + - (aPwr[11] << 3) + (aPwr[10] << 2) + (aPwr[9] << 1) + aPwr[0]; + (aPwr[11] << 3) + (aPwr[10] << 2) + (aPwr[9] << 1) + aPwr[0]; break; case 16: regout = (aPwr[23] << 7) + (aPwr[22] << 6) + (aPwr[21] << 5) + (aPwr[20] << 4) + - (aPwr[19] << 3) + (aPwr[18] << 2) + (aPwr[17] << 1) + aPwr[16]; + (aPwr[19] << 3) + (aPwr[18] << 2) + (aPwr[17] << 1) + aPwr[16]; break; case 17: regout = (aPwr[31] << 7) + (aPwr[30] << 6) + (aPwr[29] << 5) + (aPwr[28] << 4) + - (aPwr[27] << 3) + (aPwr[26] << 2) + (aPwr[25] << 1) + aPwr[24]; + (aPwr[27] << 3) + (aPwr[26] << 2) + (aPwr[25] << 1) + aPwr[24]; break; default: regout = -1; @@ -418,10 +452,13 @@ double Rhd2000Registers::rLFromLowerBandwidth(double lowerBandwidth) const { double log10f = log10(lowerBandwidth); - if (lowerBandwidth < 4.0) { + if (lowerBandwidth < 4.0) + { return 1.0061 * pow(10.0, (4.9391 - 1.2088 * log10f + 0.5698 * log10f * log10f + 0.1442 * log10f * log10f * log10f)); - } else { + } + else + { return 1.0061 * pow(10.0, (4.7351 - 0.5916 * log10f + 0.08482 * log10f * log10f)); } } @@ -459,15 +496,19 @@ double Rhd2000Registers::lowerBandwidthFromRL(double rL) const double a, b, c; // Quadratic fit below is invalid for values of RL less than 5.1 kOhm - if (rL < 5100.0) { + if (rL < 5100.0) + { rL = 5100.0; } - if (rL < 30000.0) { + if (rL < 30000.0) + { a = 0.08482; b = -0.5916; c = 4.7351 - log10(rL/1.0061); - } else { + } + else + { a = 0.3303; b = -1.2100; c = 4.9873 - log10(rL/1.0061); @@ -498,7 +539,8 @@ double Rhd2000Registers::setUpperBandwidth(double upperBandwidth) int i; // Upper bandwidths higher than 30 kHz don't work well with the RHD2000 amplifiers - if (upperBandwidth > 30000.0) { + if (upperBandwidth > 30000.0) + { upperBandwidth = 30000.0; } @@ -508,15 +550,19 @@ double Rhd2000Registers::setUpperBandwidth(double upperBandwidth) rH1Dac2 = 0; rH1Actual = RH1Base; - for (i = 0; i < RH1Dac2Steps; ++i) { - if (rH1Actual < rH1Target - (RH1Dac2Unit - RH1Dac1Unit / 2)) { + for (i = 0; i < RH1Dac2Steps; ++i) + { + if (rH1Actual < rH1Target - (RH1Dac2Unit - RH1Dac1Unit / 2)) + { rH1Actual += RH1Dac2Unit; ++rH1Dac2; } } - for (i = 0; i < RH1Dac1Steps; ++i) { - if (rH1Actual < rH1Target - (RH1Dac1Unit / 2)) { + for (i = 0; i < RH1Dac1Steps; ++i) + { + if (rH1Actual < rH1Target - (RH1Dac1Unit / 2)) + { rH1Actual += RH1Dac1Unit; ++rH1Dac1; } @@ -528,15 +574,19 @@ double Rhd2000Registers::setUpperBandwidth(double upperBandwidth) rH2Dac2 = 0; rH2Actual = RH2Base; - for (i = 0; i < RH2Dac2Steps; ++i) { - if (rH2Actual < rH2Target - (RH2Dac2Unit - RH2Dac1Unit / 2)) { + for (i = 0; i < RH2Dac2Steps; ++i) + { + if (rH2Actual < rH2Target - (RH2Dac2Unit - RH2Dac1Unit / 2)) + { rH2Actual += RH2Dac2Unit; ++rH2Dac2; } } - for (i = 0; i < RH2Dac1Steps; ++i) { - if (rH2Actual < rH2Target - (RH2Dac1Unit / 2)) { + for (i = 0; i < RH2Dac1Steps; ++i) + { + if (rH2Actual < rH2Target - (RH2Dac1Unit / 2)) + { rH2Actual += RH2Dac1Unit; ++rH2Dac1; } @@ -593,7 +643,8 @@ double Rhd2000Registers::setLowerBandwidth(double lowerBandwidth) int i; // Lower bandwidths higher than 1.5 kHz don't work well with the RHD2000 amplifiers - if (lowerBandwidth > 1500.0) { + if (lowerBandwidth > 1500.0) + { lowerBandwidth = 1500.0; } @@ -604,20 +655,25 @@ double Rhd2000Registers::setLowerBandwidth(double lowerBandwidth) rLDac3 = 0; rLActual = RLBase; - if (lowerBandwidth < 0.15) { + if (lowerBandwidth < 0.15) + { rLActual += RLDac3Unit; ++rLDac3; } - for (i = 0; i < RLDac2Steps; ++i) { - if (rLActual < rLTarget - (RLDac2Unit - RLDac1Unit / 2)) { + for (i = 0; i < RLDac2Steps; ++i) + { + if (rLActual < rLTarget - (RLDac2Unit - RLDac1Unit / 2)) + { rLActual += RLDac2Unit; ++rLDac2; } } - for (i = 0; i < RLDac1Steps; ++i) { - if (rLActual < rLTarget - (RLDac1Unit / 2)) { + for (i = 0; i < RLDac1Steps; ++i) + { + if (rLActual < rLTarget - (RLDac1Unit / 2)) + { rLActual += RLDac1Unit; ++rLDac1; } @@ -650,7 +706,8 @@ double Rhd2000Registers::setLowerBandwidth(double lowerBandwidth) // Return a 16-bit MOSI command (CALIBRATE or CLEAR) int Rhd2000Registers::createRhd2000Command(Rhd2000CommandType commandType) { - switch (commandType) { + switch (commandType) + { case Rhd2000CommandCalibrate: return 0x5500; // 0101010100000000 break; @@ -658,8 +715,8 @@ int Rhd2000Registers::createRhd2000Command(Rhd2000CommandType commandType) return 0x6a00; // 0110101000000000 break; default: - cerr << "Error in Rhd2000Registers::createRhd2000Command: " << - "Only 'Calibrate' or 'Clear Calibration' commands take zero arguments." << endl; + cerr << "Error in Rhd2000Registers::createRhd2000Command: " << + "Only 'Calibrate' or 'Clear Calibration' commands take zero arguments." << endl; return -1; } } @@ -667,27 +724,30 @@ int Rhd2000Registers::createRhd2000Command(Rhd2000CommandType commandType) // Return a 16-bit MOSI command (CONVERT or READ) int Rhd2000Registers::createRhd2000Command(Rhd2000CommandType commandType, int arg1) { - switch (commandType) { + switch (commandType) + { case Rhd2000CommandConvert: - if (arg1 < 0 || arg1 > 63) { + if (arg1 < 0 || arg1 > 63) + { cerr << "Error in Rhd2000Registers::createRhd2000Command: " << - "Channel number out of range." << endl; + "Channel number out of range." << endl; return -1; } return 0x0000 + (arg1 << 8); // 00cccccc0000000h; if the command is 'Convert', - // arg1 is the channel number + // arg1 is the channel number case Rhd2000CommandRegRead: - if (arg1 < 0 || arg1 > 63) { + if (arg1 < 0 || arg1 > 63) + { cerr << "Error in Rhd2000Registers::createRhd2000Command: " << - "Register address out of range." << endl; + "Register address out of range." << endl; return -1; } return 0xc000 + (arg1 << 8); // 11rrrrrr00000000; if the command is 'Register Read', - // arg1 is the register address + // arg1 is the register address break; default: cerr << "Error in Rhd2000Registers::createRhd2000Command: " << - "Only 'Convert' and 'Register Read' commands take one argument." << endl; + "Only 'Convert' and 'Register Read' commands take one argument." << endl; return -1; } } @@ -695,24 +755,27 @@ int Rhd2000Registers::createRhd2000Command(Rhd2000CommandType commandType, int a // Return a 16-bit MOSI command (WRITE) int Rhd2000Registers::createRhd2000Command(Rhd2000CommandType commandType, int arg1, int arg2) { - switch (commandType) { + switch (commandType) + { case Rhd2000CommandRegWrite: - if (arg1 < 0 || arg1 > 63) { + if (arg1 < 0 || arg1 > 63) + { cerr << "Error in Rhd2000Registers::createRhd2000Command: " << - "Register address out of range." << endl; + "Register address out of range." << endl; return -1; } - if (arg2 < 0 || arg2 > 255) { + if (arg2 < 0 || arg2 > 255) + { cerr << "Error in Rhd2000Registers::createRhd2000Command: " << - "Register data out of range." << endl; + "Register data out of range." << endl; return -1; } return 0x8000 + (arg1 << 8) + arg2; // 10rrrrrrdddddddd; if the command is 'Register Write', - // arg1 is the register address and arg1 is the data + // arg1 is the register address and arg1 is the data break; default: cerr << "Error in Rhd2000Registers::createRhd2000Command: " << - "Only 'Register Write' commands take two arguments." << endl; + "Only 'Register Write' commands take two arguments." << endl; return -1; } } @@ -729,17 +792,17 @@ int Rhd2000Registers::createCommandListRegisterConfig(vector<int> &commandList, commandList.push_back(createRhd2000Command(Rhd2000CommandRegRead, 63)); // Program RAM registers - commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 0, getRegisterValue( 0))); - commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 1, getRegisterValue( 1))); - commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 2, getRegisterValue( 2))); + commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 0, getRegisterValue(0))); + commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 1, getRegisterValue(1))); + commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 2, getRegisterValue(2))); // Don't program Register 3 (MUX Load, Temperature Sensor, and Auxiliary Digital Output); // control temperature sensor in another command stream - commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 4, getRegisterValue( 4))); - commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 5, getRegisterValue( 5))); + commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 4, getRegisterValue(4))); + commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 5, getRegisterValue(5))); // Don't program Register 6 (Impedance Check DAC) here; create DAC waveform in another command stream - commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 7, getRegisterValue( 7))); - commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 8, getRegisterValue( 8))); - commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 9, getRegisterValue( 9))); + commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 7, getRegisterValue(7))); + commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 8, getRegisterValue(8))); + commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 9, getRegisterValue(9))); commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 10, getRegisterValue(10))); commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 11, getRegisterValue(11))); commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 12, getRegisterValue(12))); @@ -794,9 +857,12 @@ int Rhd2000Registers::createCommandListRegisterConfig(vector<int> &commandList, commandList.push_back(createRhd2000Command(Rhd2000CommandRegRead, 17)); // Optionally, run ADC calibration (should only be run once after board is plugged in) - if (calibrate) { + if (calibrate) + { commandList.push_back(createRhd2000Command(Rhd2000CommandCalibrate)); - } else { + } + else + { commandList.push_back(createRhd2000Command(Rhd2000CommandRegRead, 63)); } @@ -873,7 +939,8 @@ int Rhd2000Registers::createCommandListTempSensor(vector<int> &commandList) commandList.push_back(createRhd2000Command(Rhd2000CommandConvert, 34)); // sample AuxIn3 commandList.push_back(createRhd2000Command(Rhd2000CommandConvert, 48)); // sample Supply Voltage Sensor - for (i = 0; i < 8; ++i) { + for (i = 0; i < 8; ++i) + { commandList.push_back(createRhd2000Command(Rhd2000CommandConvert, 32)); // sample AuxIn1 commandList.push_back(createRhd2000Command(Rhd2000CommandConvert, 33)); // sample AuxIn2 commandList.push_back(createRhd2000Command(Rhd2000CommandConvert, 34)); // sample AuxIn3 @@ -895,34 +962,49 @@ int Rhd2000Registers::createCommandListZcheckDac(vector<int> &commandList, doubl commandList.clear(); // if command list already exists, erase it and start a new one - if (amplitude < 0.0 || amplitude > 128.0) { + if (amplitude < 0.0 || amplitude > 128.0) + { cerr << "Error in Rhd2000Registers::createCommandListZcheckDac: Amplitude out of range." << endl; return -1; } - if (frequency < 0.0) { + if (frequency < 0.0) + { cerr << "Error in Rhd2000Registers::createCommandListZcheckDac: Negative frequency not allowed." << endl; return -1; - } else if (frequency > sampleRate / 4.0) { + } + else if (frequency > sampleRate / 4.0) + { cerr << "Error in Rhd2000Registers::createCommandListZcheckDac: " << - "Frequency too high relative to sampling rate." << endl; + "Frequency too high relative to sampling rate." << endl; return -1; } - if (frequency == 0.0) { - for (i = 0; i < MaxCommandLength; ++i) { + if (frequency == 0.0) + { + for (i = 0; i < MaxCommandLength; ++i) + { commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 6, 128)); } - } else { + } + else + { period = (int) floor(sampleRate / frequency + 0.5); - if (period > MaxCommandLength) { + if (period > MaxCommandLength) + { cerr << "Error in Rhd2000Registers::createCommandListZcheckDac: Frequency too low." << endl; return -1; - } else { + } + else + { t = 0.0; - for (i = 0; i < period; ++i) { + for (i = 0; i < period; ++i) + { value = (int) floor(amplitude * sin(2 * Pi * frequency * t) + 128.0 + 0.5); - if (value < 0) { + if (value < 0) + { value = 0; - } else if (value > 255) { + } + else if (value > 255) + { value = 255; } commandList.push_back(createRhd2000Command(Rhd2000CommandRegWrite, 6, value)); diff --git a/Source/Processors/DataThreads/rhythm-api/rhd2000registers.h b/Source/Processors/DataThreads/rhythm-api/rhd2000registers.h index b8990f7cb1eb117ad99f77a3f7f30b95b37d41db..71a552a1c9407bbcdf69e8fc97f7b372ad6994e3 100755 --- a/Source/Processors/DataThreads/rhythm-api/rhd2000registers.h +++ b/Source/Processors/DataThreads/rhythm-api/rhd2000registers.h @@ -49,13 +49,15 @@ public: void enableZcheck(bool enabled); void setZcheckDacPower(bool enabled); - enum ZcheckCs { + enum ZcheckCs + { ZcheckCs100fF, ZcheckCs1pF, ZcheckCs10pF }; - enum ZcheckPolarity { + enum ZcheckPolarity + { ZcheckPositiveInput, ZcheckNegativeInput }; @@ -77,7 +79,8 @@ public: int createCommandListTempSensor(vector<int> &commandList); int createCommandListZcheckDac(vector<int> &commandList, double frequency, double amplitude); - enum Rhd2000CommandType { + enum Rhd2000CommandType + { Rhd2000CommandConvert, Rhd2000CommandCalibrate, Rhd2000CommandCalClear, diff --git a/Source/Processors/Editors/ArduinoOutputEditor.cpp b/Source/Processors/Editors/ArduinoOutputEditor.cpp index 335237d8a6ec9e2eb01500a01722278e631380c8..b0b635ce7ec1e37d3a2cedcb0892099c3d5a8789 100644 --- a/Source/Processors/Editors/ArduinoOutputEditor.cpp +++ b/Source/Processors/Editors/ArduinoOutputEditor.cpp @@ -25,65 +25,70 @@ #include <stdio.h> -ArduinoOutputEditor::ArduinoOutputEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors) +ArduinoOutputEditor::ArduinoOutputEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) { - accumulator = 0; + accumulator = 0; - desiredWidth = 150; + desiredWidth = 150; - Image im; - im = ImageCache::getFromMemory (BinaryData::ArduinoIcon_png, - BinaryData::ArduinoIcon_pngSize); + Image im; + im = ImageCache::getFromMemory(BinaryData::ArduinoIcon_png, + BinaryData::ArduinoIcon_pngSize); - icon = new ImageIcon(im); - addAndMakeVisible(icon); - icon->setBounds(15,15,120,120); + icon = new ImageIcon(im); + addAndMakeVisible(icon); + icon->setBounds(15,15,120,120); - icon->setOpacity(0.3f); + icon->setOpacity(0.3f); } ArduinoOutputEditor::~ArduinoOutputEditor() { - deleteAllChildren(); + deleteAllChildren(); } void ArduinoOutputEditor::receivedEvent() { - - icon->setOpacity(0.8f); - startTimer(50); + + icon->setOpacity(0.8f); + startTimer(50); } void ArduinoOutputEditor::timerCallback() { - repaint(); - - accumulator++; - - if (isFading) { - - if (accumulator > 15.0) - { - stopTimer(); - isFading = false; - } - - } else { - - if (accumulator < 10.0) - { - icon->setOpacity(0.8f-(0.05*float(accumulator))); - accumulator++; - } else { - icon->setOpacity(0.3f); - stopTimer(); - accumulator = 0; - } - } + repaint(); + + accumulator++; + + if (isFading) + { + + if (accumulator > 15.0) + { + stopTimer(); + isFading = false; + } + + } + else + { + + if (accumulator < 10.0) + { + icon->setOpacity(0.8f-(0.05*float(accumulator))); + accumulator++; + } + else + { + icon->setOpacity(0.3f); + stopTimer(); + accumulator = 0; + } + } } \ No newline at end of file diff --git a/Source/Processors/Editors/ArduinoOutputEditor.h b/Source/Processors/Editors/ArduinoOutputEditor.h index cef7931cb7b315bdeada1fa7b740d30e9bef40e8..18bf0754a7dc1c01c7df136bdf34b16418f220b9 100644 --- a/Source/Processors/Editors/ArduinoOutputEditor.h +++ b/Source/Processors/Editors/ArduinoOutputEditor.h @@ -24,9 +24,6 @@ #ifndef __ARDUINOOUTPUTEDITOR_H_28EB4CC9__ #define __ARDUINOOUTPUTEDITOR_H_28EB4CC9__ -#ifdef _WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" @@ -46,18 +43,18 @@ class ArduinoOutputEditor : public GenericEditor { public: - ArduinoOutputEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors); - virtual ~ArduinoOutputEditor(); + ArduinoOutputEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + virtual ~ArduinoOutputEditor(); - void receivedEvent(); + void receivedEvent(); - ImageIcon* icon; + ImageIcon* icon; -private: +private: - void timerCallback(); + void timerCallback(); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ArduinoOutputEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ArduinoOutputEditor); }; diff --git a/Source/Processors/Editors/AudioEditor.cpp b/Source/Processors/Editors/AudioEditor.cpp index 6d5ffeaf6b9867e42f1fba4dc9c3a3de23984701..de5df16313072dc4b6035965f6d655bda2dd2562 100755 --- a/Source/Processors/Editors/AudioEditor.cpp +++ b/Source/Processors/Editors/AudioEditor.cpp @@ -26,19 +26,19 @@ MuteButton::MuteButton() - : ImageButton ("MuteButton") + : ImageButton("MuteButton") { - Image offimage = ImageCache::getFromMemory (BinaryData::muteoff_png, BinaryData::muteoff_pngSize); - Image onimage = ImageCache::getFromMemory (BinaryData::muteon_png, BinaryData::muteon_pngSize); + Image offimage = ImageCache::getFromMemory(BinaryData::muteoff_png, BinaryData::muteoff_pngSize); + Image onimage = ImageCache::getFromMemory(BinaryData::muteon_png, BinaryData::muteon_pngSize); - setImages(false, true, true, - offimage, 1.0f, Colours::white.withAlpha(0.0f), - offimage, 1.0f, Colours::black.withAlpha(0.0f), - onimage, 1.0f, Colours::white.withAlpha(0.0f)); + setImages(false, true, true, + offimage, 1.0f, Colours::white.withAlpha(0.0f), + offimage, 1.0f, Colours::black.withAlpha(0.0f), + onimage, 1.0f, Colours::white.withAlpha(0.0f)); - setClickingTogglesState(true); + setClickingTogglesState(true); } MuteButton::~MuteButton() @@ -46,11 +46,11 @@ MuteButton::~MuteButton() } AudioWindowButton::AudioWindowButton() - : Button ("AudioWindowButton") + : Button("AudioWindowButton") { - setClickingTogglesState(true); + setClickingTogglesState(true); - MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); + MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); Typeface::Ptr typeface = new CustomTypeface(mis); font = Font(typeface); font.setHeight(12); @@ -60,169 +60,176 @@ AudioWindowButton::~AudioWindowButton() { } -void AudioWindowButton::paintButton(Graphics &g, bool isMouseOver, bool isButtonDown) +void AudioWindowButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown) { - if (getToggleState()) - g.setColour(Colours::yellow); - else - g.setColour(Colours::black); + if (getToggleState()) + g.setColour(Colours::yellow); + else + g.setColour(Colours::black); - g.setFont(font); - //g.drawSingleLineText(" AUDIO",0,0); - g.drawSingleLineText("AUDIO",0,15); + g.setFont(font); + //g.drawSingleLineText(" AUDIO",0,0); + g.drawSingleLineText("AUDIO",0,15); } -AudioEditor::AudioEditor (AudioNode* owner) - : AudioProcessorEditor (owner), lastValue(1.0f), acw(0) +AudioEditor::AudioEditor(AudioNode* owner) + : AudioProcessorEditor(owner), lastValue(1.0f), acw(0) { - muteButton = new MuteButton(); - muteButton->addListener(this); - muteButton->setToggleState(false,false); - addAndMakeVisible(muteButton); + muteButton = new MuteButton(); + muteButton->addListener(this); + muteButton->setToggleState(false,false); + addAndMakeVisible(muteButton); - audioWindowButton = new AudioWindowButton(); - audioWindowButton->addListener(this); - audioWindowButton->setToggleState(false,false); - addAndMakeVisible(audioWindowButton); + audioWindowButton = new AudioWindowButton(); + audioWindowButton->addListener(this); + audioWindowButton->setToggleState(false,false); + addAndMakeVisible(audioWindowButton); - volumeSlider = new Slider ("High-Cut Slider"); - volumeSlider->setRange(0,100,1); - volumeSlider->addListener(this); - volumeSlider->setTextBoxStyle(Slider::NoTextBox, - false, 0, 0); - addAndMakeVisible(volumeSlider); + volumeSlider = new Slider("High-Cut Slider"); + volumeSlider->setRange(0,100,1); + volumeSlider->addListener(this); + volumeSlider->setTextBoxStyle(Slider::NoTextBox, + false, 0, 0); + addAndMakeVisible(volumeSlider); - //acw = new AudioConfigurationWindow(getAudioComponent()->deviceManager, (Button*) audioWindowButton); + //acw = new AudioConfigurationWindow(getAudioComponent()->deviceManager, (Button*) audioWindowButton); } AudioEditor::~AudioEditor() { - deleteAllChildren(); - deleteAndZero(acw); + deleteAllChildren(); + deleteAndZero(acw); } void AudioEditor::resized() { - muteButton->setBounds(0,0,30,25); - volumeSlider->setBounds(35,0,100,getHeight()); - audioWindowButton->setBounds(140,0,200,getHeight()); + muteButton->setBounds(0,0,30,25); + volumeSlider->setBounds(35,0,100,getHeight()); + audioWindowButton->setBounds(140,0,200,getHeight()); } -bool AudioEditor::keyPressed (const KeyPress& key) +bool AudioEditor::keyPressed(const KeyPress& key) { - //std::cout << name << " received " << key.getKeyCode() << std::endl; - return false; + //std::cout << name << " received " << key.getKeyCode() << std::endl; + return false; } void AudioEditor::buttonClicked(Button* button) { - if (button == muteButton) - { - - if(muteButton->getToggleState()) { - lastValue = volumeSlider->getValue(); - getAudioProcessor()->setParameter(1,0.0f); - std::cout << "Mute on." << std::endl; - } else { - getAudioProcessor()->setParameter(1,lastValue); - std::cout << "Mute off." << std::endl; - } - } else if (button == audioWindowButton) - { - if (audioWindowButton->getToggleState()) - { - if (acw == 0) { - - // AudioComponent* audioComponent = getAudioComponent(); - // audioComponent->restartDevice(); - - // if (audioComponent != 0) { - acw = new AudioConfigurationWindow(getAudioComponent()->deviceManager, (Button*) audioWindowButton); - acw->setUIComponent(getUIComponent()); - //} - } - - getAudioComponent()->restartDevice(); - acw->setVisible(true); - - } else { - - acw->setVisible(false); - //deleteAndZero(acw); - getAudioComponent()->stopDevice(); - } - } + if (button == muteButton) + { + + if (muteButton->getToggleState()) + { + lastValue = volumeSlider->getValue(); + getAudioProcessor()->setParameter(1,0.0f); + std::cout << "Mute on." << std::endl; + } + else + { + getAudioProcessor()->setParameter(1,lastValue); + std::cout << "Mute off." << std::endl; + } + } + else if (button == audioWindowButton) + { + if (audioWindowButton->getToggleState()) + { + if (acw == 0) + { + + // AudioComponent* audioComponent = getAudioComponent(); + // audioComponent->restartDevice(); + + // if (audioComponent != 0) { + acw = new AudioConfigurationWindow(getAudioComponent()->deviceManager, (Button*) audioWindowButton); + acw->setUIComponent(getUIComponent()); + //} + } + + getAudioComponent()->restartDevice(); + acw->setVisible(true); + + } + else + { + + acw->setVisible(false); + //deleteAndZero(acw); + getAudioComponent()->stopDevice(); + } + } } void AudioEditor::sliderValueChanged(Slider* slider) { - getAudioProcessor()->setParameter(1,slider->getValue()); + getAudioProcessor()->setParameter(1,slider->getValue()); } -void AudioEditor::paint (Graphics& g) +void AudioEditor::paint(Graphics& g) { - //g.setColour(Colours::grey); - // g.fillRect(1,1,getWidth()-2,getHeight()-2); + //g.setColour(Colours::grey); + // g.fillRect(1,1,getWidth()-2,getHeight()-2); } AudioConfigurationWindow::AudioConfigurationWindow(AudioDeviceManager& adm, Button* cButton) - : DocumentWindow ("Audio Settings", - Colours::red, - DocumentWindow::closeButton), - controlButton(cButton) + : DocumentWindow("Audio Settings", + Colours::red, + DocumentWindow::closeButton), + controlButton(cButton) { - centreWithSize(360,300); - setUsingNativeTitleBar(true); - setResizable(false,false); + centreWithSize(360,300); + setUsingNativeTitleBar(true); + setResizable(false,false); - //std::cout << "Audio CPU usage:" << adm.getCpuUsage() << std::endl; + //std::cout << "Audio CPU usage:" << adm.getCpuUsage() << std::endl; - AudioDeviceSelectorComponent* adsc = new AudioDeviceSelectorComponent - (adm, - 0, // minAudioInputChannels - 2, // maxAudioInputChannels - 0, // minAudioOutputChannels - 2, // maxAudioOutputChannels - false, // showMidiInputOptions - false, // showMidiOutputSelector - false, // showChannelsAsStereoPairs - false); // hideAdvancedOptionsWithButton + AudioDeviceSelectorComponent* adsc = new AudioDeviceSelectorComponent + (adm, + 0, // minAudioInputChannels + 2, // maxAudioInputChannels + 0, // minAudioOutputChannels + 2, // maxAudioOutputChannels + false, // showMidiInputOptions + false, // showMidiOutputSelector + false, // showChannelsAsStereoPairs + false); // hideAdvancedOptionsWithButton - adsc->setBounds(0,0,450,240); + adsc->setBounds(0,0,450,240); - setContentOwned (adsc, true); - setVisible(false); - //setContentComponentSize(getWidth(), getHeight()); + setContentOwned(adsc, true); + setVisible(false); + //setContentComponentSize(getWidth(), getHeight()); } AudioConfigurationWindow::~AudioConfigurationWindow() { - //setContentComponent (0); - //eleteAndZero(deviceManager); -// deleteAndZero (deviceSelector); + //setContentComponent (0); + //eleteAndZero(deviceManager); + // deleteAndZero (deviceSelector); } void AudioConfigurationWindow::closeButtonPressed() { - controlButton->setToggleState(false,false); - getAudioComponent()->stopDevice(); - setVisible(false); + controlButton->setToggleState(false,false); + getAudioComponent()->stopDevice(); + setVisible(false); } void AudioConfigurationWindow::resized() { - //deviceSelector->setBounds (8, 8, getWidth() - 16, getHeight() - 16); + //deviceSelector->setBounds (8, 8, getWidth() - 16, getHeight() - 16); } void AudioConfigurationWindow::paint(Graphics& g) { - g.fillAll(Colours::darkgrey); + g.fillAll(Colours::darkgrey); } diff --git a/Source/Processors/Editors/AudioEditor.h b/Source/Processors/Editors/AudioEditor.h index 3f2c8a199e96656aa1f920eb01d87e1dcc934664..f84b3659ef2b6d2741efcb3ccae817dd405823f1 100755 --- a/Source/Processors/Editors/AudioEditor.h +++ b/Source/Processors/Editors/AudioEditor.h @@ -24,9 +24,6 @@ #define __AUDIOEDITOR_H_9D6F1FC3__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "../AudioNode.h" #include <stdio.h> @@ -43,9 +40,9 @@ class AudioComponent; class MuteButton : public ImageButton { - public: - MuteButton(); - ~MuteButton(); +public: + MuteButton(); + ~MuteButton(); }; /** @@ -57,12 +54,12 @@ class MuteButton : public ImageButton class AudioWindowButton : public Button { - public: - AudioWindowButton(); - ~AudioWindowButton(); - void paintButton(Graphics &g, bool isMouseOver, bool isButtonDown); - private: - Font font; +public: + AudioWindowButton(); + ~AudioWindowButton(); + void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); +private: + Font font; }; /** @@ -73,20 +70,20 @@ class AudioWindowButton : public Button */ class AudioConfigurationWindow : public DocumentWindow, - public AccessClass + public AccessClass { public: - AudioConfigurationWindow(AudioDeviceManager& adm, Button* b); - ~AudioConfigurationWindow(); - - void paint (Graphics& g); - void resized(); + AudioConfigurationWindow(AudioDeviceManager& adm, Button* b); + ~AudioConfigurationWindow(); -private: + void paint(Graphics& g); + void resized(); + +private: - void closeButtonPressed(); + void closeButtonPressed(); - Button* controlButton; + Button* controlButton; }; @@ -98,35 +95,35 @@ private: */ class AudioEditor : public AudioProcessorEditor, - public Button::Listener, - public Slider::Listener, - public AccessClass + public Button::Listener, + public Slider::Listener, + public AccessClass { public: - AudioEditor (AudioNode* owner); - ~AudioEditor(); + AudioEditor(AudioNode* owner); + ~AudioEditor(); - void paint (Graphics& g); + void paint(Graphics& g); - bool keyPressed (const KeyPress& key); + bool keyPressed(const KeyPress& key); - void resized(); + void resized(); private: - void buttonClicked (Button* button); - void sliderValueChanged(Slider* slider); + void buttonClicked(Button* button); + void sliderValueChanged(Slider* slider); - float lastValue; + float lastValue; - MuteButton* muteButton; - AudioWindowButton* audioWindowButton; - AudioConfigurationWindow* acw; + MuteButton* muteButton; + AudioWindowButton* audioWindowButton; + AudioConfigurationWindow* acw; - Slider* volumeSlider; + Slider* volumeSlider; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AudioEditor); }; diff --git a/Source/Processors/Editors/ChannelSelector.cpp b/Source/Processors/Editors/ChannelSelector.cpp index 4c58238eded13fa7fc1f0ff321d43b146b9406a8..9658cfd969ad3c5f898659acd55ff1668fe66aab 100755 --- a/Source/Processors/Editors/ChannelSelector.cpp +++ b/Source/Processors/Editors/ChannelSelector.cpp @@ -29,475 +29,506 @@ #include "../ProcessorGraph.h" ChannelSelector::ChannelSelector(bool createButtons, Font& titleFont_) : - eventsOnly(false), paramsToggled(true), paramsActive(true), - radioStatus(false), isNotSink(createButtons), moveRight(false), - moveLeft(false), offsetLR(0), offsetUD(0), desiredOffset(0), - titleFont(titleFont_), acquisitionIsActive(false) + eventsOnly(false), paramsToggled(true), paramsActive(true), + radioStatus(false), isNotSink(createButtons), moveRight(false), + moveLeft(false), offsetLR(0), offsetUD(0), desiredOffset(0), + titleFont(titleFont_), acquisitionIsActive(false) { - // initialize buttons - audioButton = new EditorButton("AUDIO", titleFont); + // initialize buttons + audioButton = new EditorButton("AUDIO", titleFont); audioButton->addListener(this); addAndMakeVisible(audioButton); if (!createButtons) - audioButton->setState(false); + audioButton->setState(false); - recordButton = new EditorButton("REC", titleFont); - recordButton->addListener(this); - addAndMakeVisible(recordButton); - if (!createButtons) - recordButton->setState(false); + recordButton = new EditorButton("REC", titleFont); + recordButton->addListener(this); + addAndMakeVisible(recordButton); + if (!createButtons) + recordButton->setState(false); + + paramsButton = new EditorButton("PARAM", titleFont); + paramsButton->addListener(this); + addAndMakeVisible(paramsButton); - paramsButton = new EditorButton("PARAM", titleFont); - paramsButton->addListener(this); - addAndMakeVisible(paramsButton); - - paramsButton->setToggleState(true, false); + paramsButton->setToggleState(true, false); - audioButtons.clear(); - recordButtons.clear(); + audioButtons.clear(); + recordButtons.clear(); - // set button layout parameters - parameterOffset = 0; - recordOffset = getDesiredWidth(); - audioOffset = getDesiredWidth()*2; + // set button layout parameters + parameterOffset = 0; + recordOffset = getDesiredWidth(); + audioOffset = getDesiredWidth()*2; - parameterButtons.clear(); + parameterButtons.clear(); - allButton = new EditorButton("all", titleFont); - allButton->addListener(this); - addAndMakeVisible(allButton); + allButton = new EditorButton("all", titleFont); + allButton->addListener(this); + addAndMakeVisible(allButton); - noneButton = new EditorButton("none", titleFont); - noneButton->addListener(this); - addAndMakeVisible(noneButton); + noneButton = new EditorButton("none", titleFont); + noneButton->addListener(this); + addAndMakeVisible(noneButton); } ChannelSelector::~ChannelSelector() { - deleteAllChildren(); + deleteAllChildren(); } void ChannelSelector::paint(Graphics& g) { - ColourGradient grad1 = ColourGradient(Colours::black.withAlpha(0.8f),0.0,0.0, - Colours::black.withAlpha(0.1f),0.0,25.0f, - false); - g.setGradientFill(grad1); - g.fillRect(0, 15, getWidth(), getHeight()-30); - - ColourGradient grad2 = ColourGradient(Colours::black.withAlpha(0.2f),0.0,0.0, - Colours::black.withAlpha(0.0f),5.0f,0.0f, - false); - g.setGradientFill(grad2); - g.fillRect(0, 15, getWidth(), getHeight()-30); - - ColourGradient grad3 = ColourGradient(Colours::black.withAlpha(0.2f),(float) getDesiredWidth(),0.0, - Colours::black.withAlpha(0.0f),(float) getDesiredWidth()-5.0f,0.0f, - false); - g.setGradientFill(grad3); - g.fillRect(0, 15, getWidth(), getHeight()-30); + ColourGradient grad1 = ColourGradient(Colours::black.withAlpha(0.8f),0.0,0.0, + Colours::black.withAlpha(0.1f),0.0,25.0f, + false); + g.setGradientFill(grad1); + g.fillRect(0, 15, getWidth(), getHeight()-30); + + ColourGradient grad2 = ColourGradient(Colours::black.withAlpha(0.2f),0.0,0.0, + Colours::black.withAlpha(0.0f),5.0f,0.0f, + false); + g.setGradientFill(grad2); + g.fillRect(0, 15, getWidth(), getHeight()-30); + + ColourGradient grad3 = ColourGradient(Colours::black.withAlpha(0.2f),(float) getDesiredWidth(),0.0, + Colours::black.withAlpha(0.0f),(float) getDesiredWidth()-5.0f,0.0f, + false); + g.setGradientFill(grad3); + g.fillRect(0, 15, getWidth(), getHeight()-30); } void ChannelSelector::setNumChannels(int numChans) { - int difference = numChans - parameterButtons.size(); + int difference = numChans - parameterButtons.size(); - std::cout << difference << " buttons needed." << std::endl; + std::cout << difference << " buttons needed." << std::endl; - if (difference > 0) - { - for (int n = 0; n < difference; n++) - { - addButton(); - } - } else if (difference < 0) - { - for (int n = 0; n < -difference; n++) - { - removeButton(); - } - } + if (difference > 0) + { + for (int n = 0; n < difference; n++) + { + addButton(); + } + } + else if (difference < 0) + { + for (int n = 0; n < -difference; n++) + { + removeButton(); + } + } - refreshButtonBoundaries(); + refreshButtonBoundaries(); } void ChannelSelector::refreshButtonBoundaries() { - int nColumns = 8; - int columnWidth = getDesiredWidth()/(nColumns + 1); - int rowHeight = 14; - int topOffset = 20; - - for (int i = 0; i < parameterButtons.size(); i++) - { - parameterButtons[i]->setBounds(columnWidth/2 + offsetLR + - columnWidth*((i)%nColumns), - floor(double(i)/nColumns)*rowHeight+offsetUD + topOffset, - columnWidth, rowHeight); - - if (isNotSink) - { - recordButtons[i]->setBounds(columnWidth/2 + offsetLR + - columnWidth*((i)%nColumns) - getDesiredWidth(), - floor(double(i)/nColumns)*rowHeight+offsetUD + topOffset, - columnWidth, rowHeight); - audioButtons[i]->setBounds(columnWidth/2 + offsetLR + - columnWidth*((i)%nColumns) - - getDesiredWidth()*2, - floor(double(i)/nColumns)*rowHeight+offsetUD + topOffset, - columnWidth, rowHeight); - } - - } - - int w = getWidth()/3; - int h = 15; - - audioButton->setBounds(0, 0, w, h); - recordButton->setBounds(w, 0, w, h); - paramsButton->setBounds(w*2, 0, w, h); - - allButton->setBounds(0, getHeight()-15, getWidth()/2, 15); - noneButton->setBounds(getWidth()/2, getHeight()-15, getWidth()/2, 15); + int nColumns = 8; + int columnWidth = getDesiredWidth()/(nColumns + 1); + int rowHeight = 14; + int topOffset = 20; + + for (int i = 0; i < parameterButtons.size(); i++) + { + parameterButtons[i]->setBounds(columnWidth/2 + offsetLR + + columnWidth*((i)%nColumns), + floor(double(i)/nColumns)*rowHeight+offsetUD + topOffset, + columnWidth, rowHeight); + + if (isNotSink) + { + recordButtons[i]->setBounds(columnWidth/2 + offsetLR + + columnWidth*((i)%nColumns) - getDesiredWidth(), + floor(double(i)/nColumns)*rowHeight+offsetUD + topOffset, + columnWidth, rowHeight); + audioButtons[i]->setBounds(columnWidth/2 + offsetLR + + columnWidth*((i)%nColumns) - + getDesiredWidth()*2, + floor(double(i)/nColumns)*rowHeight+offsetUD + topOffset, + columnWidth, rowHeight); + } + + } + + int w = getWidth()/3; + int h = 15; + + audioButton->setBounds(0, 0, w, h); + recordButton->setBounds(w, 0, w, h); + paramsButton->setBounds(w*2, 0, w, h); + + allButton->setBounds(0, getHeight()-15, getWidth()/2, 15); + noneButton->setBounds(getWidth()/2, getHeight()-15, getWidth()/2, 15); } void ChannelSelector::resized() { - refreshButtonBoundaries(); + refreshButtonBoundaries(); } void ChannelSelector::timerCallback() { - //std::cout << desiredOffset - offsetLR << std::endl; + //std::cout << desiredOffset - offsetLR << std::endl; - if (offsetLR != desiredOffset) - { - if (desiredOffset - offsetLR > 0) - { - offsetLR += 25; // be careful what you set this value to! - // if it's not a multiple of the desired - // width, things could go badly! - } else { - offsetLR -= 25; - } + if (offsetLR != desiredOffset) + { + if (desiredOffset - offsetLR > 0) + { + offsetLR += 25; // be careful what you set this value to! + // if it's not a multiple of the desired + // width, things could go badly! + } + else + { + offsetLR -= 25; + } - } else { - stopTimer(); - } + } + else + { + stopTimer(); + } - refreshButtonBoundaries(); + refreshButtonBoundaries(); } void ChannelSelector::addButton() { - int size = parameterButtons.size(); + int size = parameterButtons.size(); - ChannelSelectorButton* b = new ChannelSelectorButton(size+1, PARAMETER, titleFont); - parameterButtons.add(b); - addAndMakeVisible(b); + ChannelSelectorButton* b = new ChannelSelectorButton(size+1, PARAMETER, titleFont); + parameterButtons.add(b); + addAndMakeVisible(b); - if (paramsToggled) - b->setToggleState(true, false); - else - b->setToggleState(false, false); + if (paramsToggled) + b->setToggleState(true, false); + else + b->setToggleState(false, false); - if (!paramsActive) - b->setActive(false); + if (!paramsActive) + b->setActive(false); - b->addListener(this); + b->addListener(this); - if (isNotSink) - { - ChannelSelectorButton* br = new ChannelSelectorButton(size+1, RECORD, titleFont); - recordButtons.add(br); - addAndMakeVisible(br); - br->addListener(this); + if (isNotSink) + { + ChannelSelectorButton* br = new ChannelSelectorButton(size+1, RECORD, titleFont); + recordButtons.add(br); + addAndMakeVisible(br); + br->addListener(this); - ChannelSelectorButton* ba = new ChannelSelectorButton(size+1, AUDIO, titleFont); - audioButtons.add(ba); - addAndMakeVisible(ba); - ba->addListener(this); - } + ChannelSelectorButton* ba = new ChannelSelectorButton(size+1, AUDIO, titleFont); + audioButtons.add(ba); + addAndMakeVisible(ba); + ba->addListener(this); + } } void ChannelSelector::removeButton() { - int size = parameterButtons.size(); - - ChannelSelectorButton* b = parameterButtons.remove(size-1); - removeChildComponent(b); - deleteAndZero(b); - - if (isNotSink) - { - ChannelSelectorButton* br = recordButtons.remove(size-1); - removeChildComponent(br); - deleteAndZero(br); - - ChannelSelectorButton* ba = audioButtons.remove(size-1); - removeChildComponent(ba); - deleteAndZero(ba); - } + int size = parameterButtons.size(); + + ChannelSelectorButton* b = parameterButtons.remove(size-1); + removeChildComponent(b); + deleteAndZero(b); + + if (isNotSink) + { + ChannelSelectorButton* br = recordButtons.remove(size-1); + removeChildComponent(br); + deleteAndZero(br); + + ChannelSelectorButton* ba = audioButtons.remove(size-1); + removeChildComponent(ba); + deleteAndZero(ba); + } } Array<int> ChannelSelector::getActiveChannels() { - Array<int> a; - - if (!eventsOnly) { - for (int i = 0; i < parameterButtons.size(); i++) - { - if (parameterButtons[i]->getToggleState()) - a.add(i); - } - } else { + Array<int> a; + + if (!eventsOnly) + { + for (int i = 0; i < parameterButtons.size(); i++) + { + if (parameterButtons[i]->getToggleState()) + a.add(i); + } + } + else + { a.add(0); } - return a; + return a; } void ChannelSelector::setActiveChannels(Array<int> a) { - std::cout << "Setting active channels!" << std::endl; + std::cout << "Setting active channels!" << std::endl; - for (int i = 0; i < parameterButtons.size(); i++) - { - parameterButtons[i]->setToggleState(false,false); - } + for (int i = 0; i < parameterButtons.size(); i++) + { + parameterButtons[i]->setToggleState(false,false); + } - for (int i = 0; i < a.size(); i++) - { - parameterButtons[a[i]]->setToggleState(true,false); - } + for (int i = 0; i < a.size(); i++) + { + parameterButtons[a[i]]->setToggleState(true,false); + } } void ChannelSelector::inactivateButtons() { - paramsActive = false; + paramsActive = false; - for (int i = 0; i < parameterButtons.size(); i++) - { - parameterButtons[i]->setActive(false); - parameterButtons[i]->repaint(); - } + for (int i = 0; i < parameterButtons.size(); i++) + { + parameterButtons[i]->setActive(false); + parameterButtons[i]->repaint(); + } } void ChannelSelector::activateButtons() { - paramsActive = true; + paramsActive = true; - for (int i = 0; i < parameterButtons.size(); i++) - { - parameterButtons[i]->setActive(true); - parameterButtons[i]->repaint(); - } + for (int i = 0; i < parameterButtons.size(); i++) + { + parameterButtons[i]->setActive(true); + parameterButtons[i]->repaint(); + } } void ChannelSelector::startAcquisition() { - acquisitionIsActive = true; + acquisitionIsActive = true; } void ChannelSelector::stopAcquisition() { - acquisitionIsActive = false; + acquisitionIsActive = false; } void ChannelSelector::setRadioStatus(bool radioOn) { - radioStatus = radioOn; + radioStatus = radioOn; - for (int i = 0; i < parameterButtons.size(); i++) - { - if (radioOn) { - parameterButtons[i]->setToggleState(false, false); - parameterButtons[i]->setRadioGroupId(999); - } else { - parameterButtons[i]->setToggleState(false, false); - parameterButtons[i]->setRadioGroupId(0); - } - } + for (int i = 0; i < parameterButtons.size(); i++) + { + if (radioOn) + { + parameterButtons[i]->setToggleState(false, false); + parameterButtons[i]->setRadioGroupId(999); + } + else + { + parameterButtons[i]->setToggleState(false, false); + parameterButtons[i]->setRadioGroupId(0); + } + } } bool ChannelSelector::getRecordStatus(int chan) { - if (chan >= 0 && chan < recordButtons.size()) - return recordButtons[chan]->getToggleState(); - else - return false; + if (chan >= 0 && chan < recordButtons.size()) + return recordButtons[chan]->getToggleState(); + else + return false; } bool ChannelSelector::getAudioStatus(int chan) { - if (chan >= 0 && chan < recordButtons.size()) - return audioButtons[chan]->getToggleState(); - else - return false; + if (chan >= 0 && chan < recordButtons.size()) + return audioButtons[chan]->getToggleState(); + else + return false; } int ChannelSelector::getDesiredWidth() { - return 150; + return 150; } void ChannelSelector::buttonClicked(Button* button) { - //checkChannelSelectors(); - if (button == paramsButton) - { - // make sure param buttons are visible - allButton->setState(true); - desiredOffset = parameterOffset; - startTimer(20); - return; - } else if (button == audioButton) - { - // make sure audio buttons are visible - - if (audioButton->getState()) - { - allButton->setState(false); - - desiredOffset = audioOffset; - startTimer(20); - } else { - paramsButton->setToggleState(true, false); - } - return; - } else if (button == recordButton) - { - // make sure record buttons are visible; - if (recordButton->getState()) - { - allButton->setState(true); - desiredOffset = recordOffset; - startTimer(20); - } else { - paramsButton->setToggleState(true, false); - } - return; - } - else if (button == allButton) - { - // select all active buttons - if (offsetLR == recordOffset) - { - - - for (int i = 0; i < recordButtons.size(); i++) - { - recordButtons[i]->setToggleState(true, true); - } - - } else if (offsetLR == parameterOffset) - { - - - for (int i = 0; i < parameterButtons.size(); i++) - { - parameterButtons[i]->setToggleState(true, true); - } - } else if (offsetLR == audioOffset) - { - // do nothing--> button is disabled - } - } else if (button == noneButton) - { - // deselect all active buttons - if (offsetLR == recordOffset) - { - for (int i = 0; i < recordButtons.size(); i++) - { - recordButtons[i]->setToggleState(false, true); - } - } else if (offsetLR == parameterOffset) - { - for (int i = 0; i < parameterButtons.size(); i++) - { - parameterButtons[i]->setToggleState(false, true); - } - } else if (offsetLR == audioOffset) - { - for (int i = 0; i < audioButtons.size(); i++) - { - audioButtons[i]->setToggleState(false, true); - } - } - } else { - - ChannelSelectorButton* b = (ChannelSelectorButton*) button; - - if (b->getType() == AUDIO) - { - // get audio node, and inform it of the change - GenericEditor* editor = (GenericEditor*) getParentComponent(); - - Channel* ch = editor->getChannel(b->getChannel()-1); - //int channelNum = editor->getStartChannel() + b->getChannel() - 1; - bool status = b->getToggleState(); - - if (acquisitionIsActive) // use setParameter to change parameter safely - { - editor->getProcessorGraph()-> - getAudioNode()-> - setChannelStatus(ch, status); - } else { // change parameter directly - ch->isMonitored = status; - } - - - } else if (b->getType() == RECORD) - { - // get record node, and inform it of the change - GenericEditor* editor = (GenericEditor*) getParentComponent(); - - Channel* ch = editor->getChannel(b->getChannel()-1); - //int channelNum = editor->getStartChannel() + b->getChannel() - 1; - bool status = b->getToggleState(); - - if (acquisitionIsActive) // use setParameter to change parameter safely - { - editor->getProcessorGraph()-> - getRecordNode()-> - setChannelStatus(ch, status); - } else { // change parameter directly - ch->isRecording = status; - } - - } else { - // do nothing - if (radioStatus) // if radio buttons are active - { - // send a message to parent - GenericEditor* editor = (GenericEditor*) getParentComponent(); - editor->channelChanged(b->getChannel()); - } - } - - } + //checkChannelSelectors(); + if (button == paramsButton) + { + // make sure param buttons are visible + allButton->setState(true); + desiredOffset = parameterOffset; + startTimer(20); + return; + } + else if (button == audioButton) + { + // make sure audio buttons are visible + + if (audioButton->getState()) + { + allButton->setState(false); + + desiredOffset = audioOffset; + startTimer(20); + } + else + { + paramsButton->setToggleState(true, false); + } + return; + } + else if (button == recordButton) + { + // make sure record buttons are visible; + if (recordButton->getState()) + { + allButton->setState(true); + desiredOffset = recordOffset; + startTimer(20); + } + else + { + paramsButton->setToggleState(true, false); + } + return; + } + else if (button == allButton) + { + // select all active buttons + if (offsetLR == recordOffset) + { + + + for (int i = 0; i < recordButtons.size(); i++) + { + recordButtons[i]->setToggleState(true, true); + } + + } + else if (offsetLR == parameterOffset) + { + + + for (int i = 0; i < parameterButtons.size(); i++) + { + parameterButtons[i]->setToggleState(true, true); + } + } + else if (offsetLR == audioOffset) + { + // do nothing--> button is disabled + } + } + else if (button == noneButton) + { + // deselect all active buttons + if (offsetLR == recordOffset) + { + for (int i = 0; i < recordButtons.size(); i++) + { + recordButtons[i]->setToggleState(false, true); + } + } + else if (offsetLR == parameterOffset) + { + for (int i = 0; i < parameterButtons.size(); i++) + { + parameterButtons[i]->setToggleState(false, true); + } + } + else if (offsetLR == audioOffset) + { + for (int i = 0; i < audioButtons.size(); i++) + { + audioButtons[i]->setToggleState(false, true); + } + } + } + else + { + + ChannelSelectorButton* b = (ChannelSelectorButton*) button; + + if (b->getType() == AUDIO) + { + // get audio node, and inform it of the change + GenericEditor* editor = (GenericEditor*) getParentComponent(); + + Channel* ch = editor->getChannel(b->getChannel()-1); + //int channelNum = editor->getStartChannel() + b->getChannel() - 1; + bool status = b->getToggleState(); + + if (acquisitionIsActive) // use setParameter to change parameter safely + { + editor->getProcessorGraph()-> + getAudioNode()-> + setChannelStatus(ch, status); + } + else // change parameter directly + { + ch->isMonitored = status; + } + + + } + else if (b->getType() == RECORD) + { + // get record node, and inform it of the change + GenericEditor* editor = (GenericEditor*) getParentComponent(); + + Channel* ch = editor->getChannel(b->getChannel()-1); + //int channelNum = editor->getStartChannel() + b->getChannel() - 1; + bool status = b->getToggleState(); + + if (acquisitionIsActive) // use setParameter to change parameter safely + { + editor->getProcessorGraph()-> + getRecordNode()-> + setChannelStatus(ch, status); + } + else // change parameter directly + { + ch->isRecording = status; + } + + } + else + { + // do nothing + if (radioStatus) // if radio buttons are active + { + // send a message to parent + GenericEditor* editor = (GenericEditor*) getParentComponent(); + editor->channelChanged(b->getChannel()); + } + } + + } } @@ -505,32 +536,32 @@ void ChannelSelector::buttonClicked(Button* button) ///////////// BUTTONS ////////////////////// -EditorButton::EditorButton(const String& name, Font& f) : Button(name) +EditorButton::EditorButton(const String& name, Font& f) : Button(name) { - isEnabled = true; + isEnabled = true; - buttonFont = f; - buttonFont.setHeight(10); + buttonFont = f; + buttonFont.setHeight(10); - if (!getName().equalsIgnoreCase("all") && !getName().equalsIgnoreCase("none")) - { - setRadioGroupId(999); - setClickingTogglesState(true); + if (!getName().equalsIgnoreCase("all") && !getName().equalsIgnoreCase("none")) + { + setRadioGroupId(999); + setClickingTogglesState(true); } selectedGrad = ColourGradient(Colour(240,179,12),0.0,0.0, - Colour(207,160,33),0.0, 20.0f, - false); + Colour(207,160,33),0.0, 20.0f, + false); selectedOverGrad = ColourGradient(Colour(209,162,33),0.0, 5.0f, - Colour(190,150,25),0.0, 0.0f, - false); + Colour(190,150,25),0.0, 0.0f, + false); neutralGrad = ColourGradient(Colour(220,220,220),0.0,0.0, - Colour(170,170,170),0.0, 20.0f, - false); + Colour(170,170,170),0.0, 20.0f, + false); neutralOverGrad = ColourGradient(Colour(180,180,180),0.0,5.0f, - Colour(150,150,150),0.0, 0.0, - false); + Colour(150,150,150),0.0, 0.0, + false); } @@ -542,127 +573,133 @@ void EditorButton::resized() float height = (float) getHeight(); if (getName().equalsIgnoreCase("AUDIO")) - { - //outlinePath.startNewSubPath(0, height); - outlinePath.lineTo(0, 0);//radius); - //outlinePath.addArc(0, 0, radius*2, radius*2, 1.5*double_Pi, 2.0*double_Pi ); + { + //outlinePath.startNewSubPath(0, height); + outlinePath.lineTo(0, 0);//radius); + //outlinePath.addArc(0, 0, radius*2, radius*2, 1.5*double_Pi, 2.0*double_Pi ); - outlinePath.lineTo(width, 0);//getHeight()); + outlinePath.lineTo(width, 0);//getHeight()); - outlinePath.lineTo(width, height); + outlinePath.lineTo(width, height); - outlinePath.lineTo(0, height); - //outlinePath.addArc(0, getHeight()-radius*2, radius*2, radius*2, double_Pi, 1.5*double_Pi); - //outlinePath.lineTo(0, radius); - outlinePath.closeSubPath(); + outlinePath.lineTo(0, height); + //outlinePath.addArc(0, getHeight()-radius*2, radius*2, radius*2, double_Pi, 1.5*double_Pi); + //outlinePath.lineTo(0, radius); + outlinePath.closeSubPath(); - } else if (getName().equalsIgnoreCase("PARAM")) - { - //outlinePath.startNewSubPath(0, 0); + } + else if (getName().equalsIgnoreCase("PARAM")) + { + //outlinePath.startNewSubPath(0, 0); - outlinePath.lineTo(width, 0); - - //outlinePath.addArc(width-radius*2, 0, radius*2, radius*2, 0, 0.5*double_Pi); + outlinePath.lineTo(width, 0); - outlinePath.lineTo(getWidth(), height); + //outlinePath.addArc(width-radius*2, 0, radius*2, radius*2, 0, 0.5*double_Pi); - //outlinePath.addArc(getWidth()-radius*2, getHeight()-radius*2, radius*2, radius*2, 0.5*double_Pi, double_Pi); + outlinePath.lineTo(getWidth(), height); - outlinePath.lineTo(0, height); - outlinePath.lineTo(0, 0); - //outlinePath.closeSubPath(); + //outlinePath.addArc(getWidth()-radius*2, getHeight()-radius*2, radius*2, radius*2, 0.5*double_Pi, double_Pi); + outlinePath.lineTo(0, height); + outlinePath.lineTo(0, 0); + //outlinePath.closeSubPath(); - } else if (getName().equalsIgnoreCase("REC")) - { - outlinePath.addRectangle(0,0,getWidth(),getHeight()); + } + else if (getName().equalsIgnoreCase("REC")) + { - } else if (getName().equalsIgnoreCase("all")) - { + outlinePath.addRectangle(0,0,getWidth(),getHeight()); - //outlinePath.startNewSubPath(0, 0); + } + else if (getName().equalsIgnoreCase("all")) + { - outlinePath.lineTo(width, 0); - - //outlinePath.addArc(width-radius*2, 0, radius*2, radius*2, 0, 0.5*double_Pi); + //outlinePath.startNewSubPath(0, 0); - outlinePath.lineTo(width, height); + outlinePath.lineTo(width, 0); - //outlinePath.addArc(getWidth()-radius*2, getHeight()-radius*2, radius*2, radius*2, 0.5*double_Pi, double_Pi); + //outlinePath.addArc(width-radius*2, 0, radius*2, radius*2, 0, 0.5*double_Pi); - outlinePath.lineTo(0, height); - //outlinePath.addArc(0, height-radius*2, radius*2, radius*2, double_Pi, 1.5*double_Pi); + outlinePath.lineTo(width, height); - outlinePath.lineTo(0, 0); - //outlinePath.closeSubPath(); + //outlinePath.addArc(getWidth()-radius*2, getHeight()-radius*2, radius*2, radius*2, 0.5*double_Pi, double_Pi); - } else if (getName().equalsIgnoreCase("none")) - { + outlinePath.lineTo(0, height); + //outlinePath.addArc(0, height-radius*2, radius*2, radius*2, double_Pi, 1.5*double_Pi); - //outlinePath.startNewSubPath(0, 0); + outlinePath.lineTo(0, 0); + //outlinePath.closeSubPath(); - outlinePath.lineTo(width, 0); - - //outlinePath.addArc(width-radius*2, 0, radius*2, radius*2, 0, 0.5*double_Pi); + } + else if (getName().equalsIgnoreCase("none")) + { + + //outlinePath.startNewSubPath(0, 0); - outlinePath.lineTo(width, height); + outlinePath.lineTo(width, 0); - //outlinePath.addArc(width-radius*2, height-radius*2, radius*2, radius*2, 0.5*double_Pi, double_Pi); + //outlinePath.addArc(width-radius*2, 0, radius*2, radius*2, 0, 0.5*double_Pi); - outlinePath.lineTo(0, height); + outlinePath.lineTo(width, height); - outlinePath.lineTo(0, 0); - //outlinePath.closeSubPath(); + //outlinePath.addArc(width-radius*2, height-radius*2, radius*2, radius*2, 0.5*double_Pi, double_Pi); - } + outlinePath.lineTo(0, height); + + outlinePath.lineTo(0, 0); + //outlinePath.closeSubPath(); + + } } -void EditorButton::paintButton(Graphics &g, bool isMouseOver, bool isButtonDown) +void EditorButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown) { - g.setColour(Colours::grey); - g.fillPath(outlinePath); + g.setColour(Colours::grey); + g.fillPath(outlinePath); - if (getToggleState()) - { - if (isMouseOver && isEnabled) - g.setGradientFill(selectedOverGrad); + if (getToggleState()) + { + if (isMouseOver && isEnabled) + g.setGradientFill(selectedOverGrad); else - g.setGradientFill(selectedGrad); - } else { - if (isMouseOver && isEnabled) - g.setGradientFill(neutralOverGrad); + g.setGradientFill(selectedGrad); + } + else + { + if (isMouseOver && isEnabled) + g.setGradientFill(neutralOverGrad); else - g.setGradientFill(neutralGrad); - } + g.setGradientFill(neutralGrad); + } - AffineTransform a = AffineTransform::scale(0.98f, 0.94f, float(getWidth())/2.0f, - float(getHeight())/2.0f); - g.fillPath(outlinePath, a); + AffineTransform a = AffineTransform::scale(0.98f, 0.94f, float(getWidth())/2.0f, + float(getHeight())/2.0f); + g.fillPath(outlinePath, a); - buttonFont.setHeight(10.0f); - int stringWidth = buttonFont.getStringWidth(getName()); + buttonFont.setHeight(10.0f); + int stringWidth = buttonFont.getStringWidth(getName()); - g.setFont(buttonFont); + g.setFont(buttonFont); - if (isEnabled) - g.setColour(Colours::darkgrey); - else - g.setColour(Colours::lightgrey); + if (isEnabled) + g.setColour(Colours::darkgrey); + else + g.setColour(Colours::lightgrey); - g.drawSingleLineText(getName(), getWidth()/2 - stringWidth/2, 11); + g.drawSingleLineText(getName(), getWidth()/2 - stringWidth/2, 11); } -ChannelSelectorButton::ChannelSelectorButton(int num_, int type_, Font& f) : Button("name") +ChannelSelectorButton::ChannelSelectorButton(int num_, int type_, Font& f) : Button("name") { - isActive = true; - num = num_; - type = type_; + isActive = true; + num = num_; + type = type_; setClickingTogglesState(true); @@ -671,22 +708,25 @@ ChannelSelectorButton::ChannelSelectorButton(int num_, int type_, Font& f) : But } -void ChannelSelectorButton::paintButton(Graphics &g, bool isMouseOver, bool isButtonDown) +void ChannelSelectorButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown) { - if (isActive) { - if (getToggleState() == true) - g.setColour(Colours::orange); - else - g.setColour(Colours::darkgrey); - - if (isMouseOver) - g.setColour(Colours::white); - } else { - if (getToggleState() == true) - g.setColour(Colours::yellow); - else - g.setColour(Colours::lightgrey); - } + if (isActive) + { + if (getToggleState() == true) + g.setColour(Colours::orange); + else + g.setColour(Colours::darkgrey); + + if (isMouseOver) + g.setColour(Colours::white); + } + else + { + if (getToggleState() == true) + g.setColour(Colours::yellow); + else + g.setColour(Colours::lightgrey); + } // g.fillRect(0,0,getWidth(),getHeight()); @@ -699,6 +739,6 @@ void ChannelSelectorButton::paintButton(Graphics &g, bool isMouseOver, bool isBu void ChannelSelectorButton::setActive(bool t) { - isActive = t; - setClickingTogglesState(t); + isActive = t; + setClickingTogglesState(t); } diff --git a/Source/Processors/Editors/ChannelSelector.h b/Source/Processors/Editors/ChannelSelector.h index a63e0c425b9fbd911aacacb8380f5de9b7a9689a..7d5bfeafedd6de41d17cdaa4fd3e2e8f546936a4 100755 --- a/Source/Processors/Editors/ChannelSelector.h +++ b/Source/Processors/Editors/ChannelSelector.h @@ -24,9 +24,6 @@ #ifndef __CHANNELSELECTOR_H_68124E35__ #define __CHANNELSELECTOR_H_68124E35__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" #include "../../AccessClass.h" @@ -40,7 +37,7 @@ class ChannelSelectorButton; class EditorButton; /** - + Automatically creates an interactive editor for selecting channels. Contains tabs for "Params", "Audio", and "Record", which allow @@ -52,120 +49,123 @@ class EditorButton; class ChannelSelector : public Component, - public Button::Listener, - public AccessClass, - public Timer + public Button::Listener, + public AccessClass, + public Timer { public: - /** constructor */ - ChannelSelector(bool createButtons, Font& titleFont); + /** constructor */ + ChannelSelector(bool createButtons, Font& titleFont); + + /** destructor */ + ~ChannelSelector(); - /** destructor */ - ~ChannelSelector(); + /** button callback */ + void buttonClicked(Button* button); - /** button callback */ - void buttonClicked(Button* button); + /** Return an array of selected channels. */ + Array<int> getActiveChannels(); - /** Return an array of selected channels. */ - Array<int> getActiveChannels(); + /** Set the selected channels. */ + void setActiveChannels(Array<int>); - /** Set the selected channels. */ - void setActiveChannels(Array<int>); + /** Set the total number of channels. */ + void setNumChannels(int); - /** Set the total number of channels. */ - void setNumChannels(int); + /** Return whether a particular channel should be recording. */ + bool getRecordStatus(int chan); - /** Return whether a particular channel should be recording. */ - bool getRecordStatus(int chan); + /** Return whether a particular channel should be monitored. */ + bool getAudioStatus(int chan); - /** Return whether a particular channel should be monitored. */ - bool getAudioStatus(int chan); + /** Return component's desired width. */ + int getDesiredWidth(); - /** Return component's desired width. */ - int getDesiredWidth(); + /** Called prior to the start of data acquisition.*/ + void startAcquisition(); - /** Called prior to the start of data acquisition.*/ - void startAcquisition(); + /** Called immediately after data acquisition ends.*/ + void stopAcquisition(); - /** Called immediately after data acquisition ends.*/ - void stopAcquisition(); + /** Inactivates all the ChannelSelectorButtons under the "param" tab.*/ + void inactivateButtons(); - /** Inactivates all the ChannelSelectorButtons under the "param" tab.*/ - void inactivateButtons(); + /** Activates all the ChannelSelectorButtons under the "param" tab.*/ + void activateButtons(); - /** Activates all the ChannelSelectorButtons under the "param" tab.*/ - void activateButtons(); + /** Controls the behavior of ChannelSelectorButtons; they can either behave + like radio buttons (only one selected at a time) or like toggle buttons (an + arbitrary number can be selected at once).*/ + void setRadioStatus(bool); - /** Controls the behavior of ChannelSelectorButtons; they can either behave - like radio buttons (only one selected at a time) or like toggle buttons (an - arbitrary number can be selected at once).*/ - void setRadioStatus(bool); + void paramButtonsToggledByDefault(bool t) + { + paramsToggled = t; + } + //void paramButtonsActiveByDefault(bool t) {paramsActive = t;} - void paramButtonsToggledByDefault(bool t) {paramsToggled = t;} - //void paramButtonsActiveByDefault(bool t) {paramsActive = t;} - bool eventsOnly; private: - EditorButton* audioButton; - EditorButton* recordButton; - EditorButton* paramsButton; - EditorButton* allButton; - EditorButton* noneButton; + EditorButton* audioButton; + EditorButton* recordButton; + EditorButton* paramsButton; + EditorButton* allButton; + EditorButton* noneButton; - /** An array of ChannelSelectorButtons used to select the channels that - will be updated when a parameter is changed. */ - Array<ChannelSelectorButton*> parameterButtons; + /** An array of ChannelSelectorButtons used to select the channels that + will be updated when a parameter is changed. */ + Array<ChannelSelectorButton*> parameterButtons; - /** An array of ChannelSelectorButtons used to select the channels that - are sent to the audio monitor. */ - Array<ChannelSelectorButton*> audioButtons; + /** An array of ChannelSelectorButtons used to select the channels that + are sent to the audio monitor. */ + Array<ChannelSelectorButton*> audioButtons; - /** An array of ChannelSelectorButtons used to select the channels that - will be written to disk when the record button is pressed. */ - Array<ChannelSelectorButton*> recordButtons; + /** An array of ChannelSelectorButtons used to select the channels that + will be written to disk when the record button is pressed. */ + Array<ChannelSelectorButton*> recordButtons; - bool paramsToggled; - bool paramsActive; - bool radioStatus; + bool paramsToggled; + bool paramsActive; + bool radioStatus; - bool isNotSink; - bool moveRight; - bool moveLeft; + bool isNotSink; + bool moveRight; + bool moveLeft; - int offsetLR; - int offsetUD; + int offsetLR; + int offsetUD; - int parameterOffset; - int audioOffset; - int recordOffset; + int parameterOffset; + int audioOffset; + int recordOffset; - int desiredOffset; + int desiredOffset; - void resized(); + void resized(); - void addButton(); - void removeButton(); - void refreshButtonBoundaries(); + void addButton(); + void removeButton(); + void refreshButtonBoundaries(); - /** Controls the speed of animations. */ - void timerCallback(); + /** Controls the speed of animations. */ + void timerCallback(); - /** Draws the ChannelSelector. */ - void paint(Graphics& g); + /** Draws the ChannelSelector. */ + void paint(Graphics& g); - Font& titleFont; + Font& titleFont; - enum {AUDIO, RECORD, PARAMETER}; + enum {AUDIO, RECORD, PARAMETER}; - bool acquisitionIsActive; + bool acquisitionIsActive; }; /** - + A button within the ChannelSelector that allows the user to switch between tabs of all the channels. @@ -176,42 +176,47 @@ private: class EditorButton : public Button { public: - EditorButton(const String& name, Font& f); - ~EditorButton() {} - - bool getState() {return isEnabled;} - - void setState(bool state) - { - isEnabled = state; - - if (!state) - { - removeListener((Button::Listener*) getParentComponent()); - } else { - addListener((Button::Listener*) getParentComponent()); - } - - repaint(); - } + EditorButton(const String& name, Font& f); + ~EditorButton() {} + + bool getState() + { + return isEnabled; + } + + void setState(bool state) + { + isEnabled = state; + + if (!state) + { + removeListener((Button::Listener*) getParentComponent()); + } + else + { + addListener((Button::Listener*) getParentComponent()); + } + + repaint(); + } private: - void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); - - void resized(); + void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); + + void resized(); - Path outlinePath; + Path outlinePath; - int type; - Font buttonFont; + int type; + Font buttonFont; - bool isEnabled; + bool isEnabled; - ColourGradient selectedGrad, selectedOverGrad, neutralGrad, neutralOverGrad; + ColourGradient selectedGrad, selectedOverGrad, neutralGrad, neutralOverGrad; }; /** - + A button within the ChannelSelector representing an individual channel. @see ChannelSelector @@ -221,23 +226,29 @@ private: class ChannelSelectorButton : public Button { public: - ChannelSelectorButton(int num, int type, Font& f); - ~ChannelSelectorButton() {} - - int getType() {return type;} - int getChannel() {return num;} - //Channel* getChannel() {return ch;} - void setActive(bool t); + ChannelSelectorButton(int num, int type, Font& f); + ~ChannelSelectorButton() {} + + int getType() + { + return type; + } + int getChannel() + { + return num; + } + //Channel* getChannel() {return ch;} + void setActive(bool t); private: - void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); - - //Channel* ch; - - int type; - int num; - Font buttonFont; - bool isActive; + void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); + + //Channel* ch; + + int type; + int num; + Font buttonFont; + bool isActive; }; diff --git a/Source/Processors/Editors/EventNodeEditor.cpp b/Source/Processors/Editors/EventNodeEditor.cpp index a85acccad7c5511890fb9f684076e2e514439f6a..21ef6bbb1b171fa0b10002ed09106eb151ba5bae 100755 --- a/Source/Processors/Editors/EventNodeEditor.cpp +++ b/Source/Processors/Editors/EventNodeEditor.cpp @@ -26,33 +26,33 @@ #include <stdio.h> -EventNodeEditor::EventNodeEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors) +EventNodeEditor::EventNodeEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) { - desiredWidth = 200; + desiredWidth = 200; - - //createRadioButtons(35, 65, 160, hzValues, "Event frequency"); - // for (int n = 0; n < getNumChildComponents(); n++) - // { - // Button* c = (Button*) getChildComponent(n); + //createRadioButtons(35, 65, 160, hzValues, "Event frequency"); - // if (c->isVisible()) - // c->addListener(this); + // for (int n = 0; n < getNumChildComponents(); n++) + // { + // Button* c = (Button*) getChildComponent(n); + + // if (c->isVisible()) + // c->addListener(this); + + // c->setVisible(true); + // } - // c->setVisible(true); - // } - channelSelector->eventsOnly = true; } EventNodeEditor::~EventNodeEditor() { - deleteAllChildren(); + deleteAllChildren(); } // void FilterEditor::sliderValueChanged (Slider* slider) @@ -60,32 +60,32 @@ EventNodeEditor::~EventNodeEditor() // if (slider == lowSlider) // getAudioProcessor()->setParameter(0,slider->getValue()); -// else +// else // getAudioProcessor()->setParameter(1,slider->getValue()); // } -void EventNodeEditor::buttonEvent (Button* button) +void EventNodeEditor::buttonEvent(Button* button) { - std::cout << button->getRadioGroupId() << " " << button->getName() << std::endl; - - String value = button->getName(); - //float val; - - getAudioProcessor()->setParameter(0,value.getFloatValue()); - - // if (value.getLastCharacter() == juce_wchar('k')) { - // val = value.dropLastCharacters(1).getFloatValue() * 1000.0f; - // } - // else { - // val = value.getFloatValue(); - // } - - //if (button->getRadioGroupId() == 1) - /// //getAudioProcessor()->setParameter(0,val); - //else - //getAudioProcessor()->setParameter(1,val); - - //std::cout << button->getRadioGroupId() << " " << val << std::endl; + std::cout << button->getRadioGroupId() << " " << button->getName() << std::endl; + + String value = button->getName(); + //float val; + + getAudioProcessor()->setParameter(0,value.getFloatValue()); + + // if (value.getLastCharacter() == juce_wchar('k')) { + // val = value.dropLastCharacters(1).getFloatValue() * 1000.0f; + // } + // else { + // val = value.getFloatValue(); + // } + + //if (button->getRadioGroupId() == 1) + /// //getAudioProcessor()->setParameter(0,val); + //else + //getAudioProcessor()->setParameter(1,val); + + //std::cout << button->getRadioGroupId() << " " << val << std::endl; } \ No newline at end of file diff --git a/Source/Processors/Editors/EventNodeEditor.h b/Source/Processors/Editors/EventNodeEditor.h index cd540f1b90cca92fac46a751bccfc09d7362ba96..4ee8c002b2aae2a58c5433a3b87226a3b0fbea8c 100755 --- a/Source/Processors/Editors/EventNodeEditor.h +++ b/Source/Processors/Editors/EventNodeEditor.h @@ -25,9 +25,6 @@ #define __EVENTNODEEDITOR_H_A681BEBC__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" @@ -44,13 +41,13 @@ class FilterViewport; class EventNodeEditor : public GenericEditor { public: - EventNodeEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors); - virtual ~EventNodeEditor(); - void buttonEvent(Button* button); + EventNodeEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + virtual ~EventNodeEditor(); + void buttonEvent(Button* button); -private: +private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EventNodeEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EventNodeEditor); }; diff --git a/Source/Processors/Editors/FPGAOutputEditor.cpp b/Source/Processors/Editors/FPGAOutputEditor.cpp index 62bf707474dfa6e6096b4b4ea88388928a4ccbed..b3805b6e02f002ed20cc557fc71e062bbd7d55fc 100644 --- a/Source/Processors/Editors/FPGAOutputEditor.cpp +++ b/Source/Processors/Editors/FPGAOutputEditor.cpp @@ -26,65 +26,70 @@ #include <stdio.h> -FPGAOutputEditor::FPGAOutputEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors) +FPGAOutputEditor::FPGAOutputEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) { - accumulator = 0; + accumulator = 0; - desiredWidth = 180; + desiredWidth = 180; - // Image im; - // im = ImageCache::getFromMemory (BinaryData::OpenEphysBoardLogoBlack_png, - // BinaryData::OpenEphysBoardLogoBlack_pngSize); + // Image im; + // im = ImageCache::getFromMemory (BinaryData::OpenEphysBoardLogoBlack_png, + // BinaryData::OpenEphysBoardLogoBlack_pngSize); - // icon = new ImageIcon(im); - // addAndMakeVisible(icon); - // icon->setBounds(15,15,120,120); + // icon = new ImageIcon(im); + // addAndMakeVisible(icon); + // icon->setBounds(15,15,120,120); - // icon->setOpacity(0.3f); + // icon->setOpacity(0.3f); } FPGAOutputEditor::~FPGAOutputEditor() { - deleteAllChildren(); + deleteAllChildren(); } void FPGAOutputEditor::receivedEvent() { - - //icon->setOpacity(0.8f); - //startTimer(50); + + //icon->setOpacity(0.8f); + //startTimer(50); } void FPGAOutputEditor::timerCallback() { - repaint(); - - accumulator++; - - if (isFading) { - - if (accumulator > 15.0) - { - stopTimer(); - isFading = false; - } - - } else { - - if (accumulator < 10.0) - { - icon->setOpacity(0.8f-(0.05*float(accumulator))); - accumulator++; - } else { - icon->setOpacity(0.3f); - stopTimer(); - accumulator = 0; - } - } + repaint(); + + accumulator++; + + if (isFading) + { + + if (accumulator > 15.0) + { + stopTimer(); + isFading = false; + } + + } + else + { + + if (accumulator < 10.0) + { + icon->setOpacity(0.8f-(0.05*float(accumulator))); + accumulator++; + } + else + { + icon->setOpacity(0.3f); + stopTimer(); + accumulator = 0; + } + } } \ No newline at end of file diff --git a/Source/Processors/Editors/FPGAOutputEditor.h b/Source/Processors/Editors/FPGAOutputEditor.h index b59f3ad4068cbb1032ad159c3846d2b8d77eec06..15a7f39a11306af830da125604cab0b9a1e461f2 100644 --- a/Source/Processors/Editors/FPGAOutputEditor.h +++ b/Source/Processors/Editors/FPGAOutputEditor.h @@ -24,10 +24,6 @@ #ifndef __FPGAOUTPUTEDITOR_H_5A646CD3__ #define __FPGAOUTPUTEDITOR_H_5A646CD3__ -#ifdef _WIN32 -#include <Windows.h> -#endif - #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" #include "ImageIcon.h" @@ -35,7 +31,7 @@ class ImageIcon; /** - + User interface for the FPGAOutput sink. @see FPGAOutput @@ -46,20 +42,20 @@ class FPGAOutputEditor : public GenericEditor { public: - FPGAOutputEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors); - virtual ~FPGAOutputEditor(); + FPGAOutputEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + virtual ~FPGAOutputEditor(); - void receivedEvent(); + void receivedEvent(); - // void buttonEvent(Button* button); + // void buttonEvent(Button* button); - ImageIcon* icon; + ImageIcon* icon; -private: +private: - void timerCallback(); + void timerCallback(); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FPGAOutputEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FPGAOutputEditor); }; diff --git a/Source/Processors/Editors/FilterEditor.cpp b/Source/Processors/Editors/FilterEditor.cpp index f4d936acc25d1505b3112c9bd822cca8cb63c68d..4031e53cf044c852b281c60edfd8befc41d612bb 100755 --- a/Source/Processors/Editors/FilterEditor.cpp +++ b/Source/Processors/Editors/FilterEditor.cpp @@ -26,33 +26,33 @@ #include <stdio.h> -FilterEditor::FilterEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors) +FilterEditor::FilterEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) { - desiredWidth = 180; + desiredWidth = 180; - //createRadioButtons(35, 50, 160, lowCutValues, "Low Cutoff"); - //createRadioButtons(35, 90, 160, highCutValues, "High Cutoff"); + //createRadioButtons(35, 50, 160, lowCutValues, "Low Cutoff"); + //createRadioButtons(35, 90, 160, highCutValues, "High Cutoff"); - // for (int n = 0; n < getNumChildComponents(); n++) - // { - // Button* c = (Button*) getChildComponent(n); + // for (int n = 0; n < getNumChildComponents(); n++) + // { + // Button* c = (Button*) getChildComponent(n); - // if (c->isVisible()) - // c->addListener(this); + // if (c->isVisible()) + // c->addListener(this); - // if (c->getRadioGroupId() != 999) - // c->setVisible(true); - // } + // if (c->getRadioGroupId() != 999) + // c->setVisible(true); + // } } FilterEditor::~FilterEditor() { - deleteAllChildren(); + deleteAllChildren(); } // void FilterEditor::sliderValueChanged (Slider* slider) @@ -60,38 +60,39 @@ FilterEditor::~FilterEditor() // if (slider == lowSlider) // getAudioProcessor()->setParameter(0,slider->getValue()); -// else +// else // getAudioProcessor()->setParameter(1,slider->getValue()); // } -void FilterEditor::buttonEvent (Button* button) +void FilterEditor::buttonEvent(Button* button) { - //std::cout << button->getRadioGroupId() << " " << button->getName() << std::endl; - - //if (!checkDrawerButton(button) && !checkChannelSelectors(button)) { + //std::cout << button->getRadioGroupId() << " " << button->getName() << std::endl; - String value = button->getName(); - float val; + //if (!checkDrawerButton(button) && !checkChannelSelectors(button)) { - val = value.getFloatValue(); + String value = button->getName(); + float val; - Array<int> chans = getActiveChannels(); - - GenericProcessor* p = (GenericProcessor*) getAudioProcessor(); + val = value.getFloatValue(); - for (int n = 0; n < chans.size(); n++) { - - p->setCurrentChannel(chans[n]); + Array<int> chans = getActiveChannels(); - if (button->getRadioGroupId() == 1) - getAudioProcessor()->setParameter(0,val); - else - getAudioProcessor()->setParameter(1,val*1000.0f); + GenericProcessor* p = (GenericProcessor*) getAudioProcessor(); - } + for (int n = 0; n < chans.size(); n++) + { - //std::cout << button->getRadioGroupId() << " " << val << std::endl; - // } + p->setCurrentChannel(chans[n]); + + if (button->getRadioGroupId() == 1) + getAudioProcessor()->setParameter(0,val); + else + getAudioProcessor()->setParameter(1,val*1000.0f); + + } + + //std::cout << button->getRadioGroupId() << " " << val << std::endl; + // } } \ No newline at end of file diff --git a/Source/Processors/Editors/FilterEditor.h b/Source/Processors/Editors/FilterEditor.h index 74087981d5919695d755d7a311a7364e59307c2b..f177daf496582e83ad21cdccb3503567f2ed4c3f 100755 --- a/Source/Processors/Editors/FilterEditor.h +++ b/Source/Processors/Editors/FilterEditor.h @@ -25,9 +25,6 @@ #define __FILTEREDITOR_H_969BDB5__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" @@ -44,13 +41,13 @@ class FilterViewport; class FilterEditor : public GenericEditor { public: - FilterEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors); - virtual ~FilterEditor(); - void buttonEvent(Button* button); + FilterEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + virtual ~FilterEditor(); + void buttonEvent(Button* button); -private: +private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FilterEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FilterEditor); }; diff --git a/Source/Processors/Editors/GenericEditor.cpp b/Source/Processors/Editors/GenericEditor.cpp index b189e54ae2f726690881b03af2531b410633aeae..a99c588d965f6d3c55a9ebd5cb1bce350092ce10 100755 --- a/Source/Processors/Editors/GenericEditor.cpp +++ b/Source/Processors/Editors/GenericEditor.cpp @@ -33,11 +33,11 @@ #include <math.h> -GenericEditor::GenericEditor (GenericProcessor* owner, bool useDefaultParameterEditors=true) - : AudioProcessorEditor(owner), - desiredWidth(150), isFading(false), accumulator(0.0), - drawerButton(0), channelSelector(0), - isSelected(false), isEnabled(true), tNum(-1) +GenericEditor::GenericEditor(GenericProcessor* owner, bool useDefaultParameterEditors=true) + : AudioProcessorEditor(owner), + desiredWidth(150), isFading(false), accumulator(0.0), + drawerButton(0), channelSelector(0), + isSelected(false), isEnabled(true), tNum(-1) { constructorInitialize(owner, useDefaultParameterEditors); } @@ -56,74 +56,78 @@ channelSelector(0) */ GenericEditor::~GenericEditor() { - deleteAllChildren(); + deleteAllChildren(); } -void GenericEditor::constructorInitialize(GenericProcessor* owner, bool useDefaultParameterEditors){ - - name = getAudioProcessor()->getName(); - - nodeId = owner->getNodeId(); - - //MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); +void GenericEditor::constructorInitialize(GenericProcessor* owner, bool useDefaultParameterEditors) +{ + + name = getAudioProcessor()->getName(); + + nodeId = owner->getNodeId(); + + //MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); //Typeface::Ptr typeface = new CustomTypeface(mis); titleFont = Font("Small Text", 10, Font::plain); - + if (!owner->isMerger() && !owner->isSplitter()) { - drawerButton = new DrawerButton("name"); - drawerButton->addListener(this); - addAndMakeVisible(drawerButton); - - if (!owner->isSink()) - { - channelSelector = new ChannelSelector(true, titleFont); - } else { - channelSelector = new ChannelSelector(false, titleFont); - } - - addChildComponent(channelSelector); - channelSelector->setVisible(false); - - - } - - backgroundGradient = ColourGradient(Colour(190, 190, 190), 0.0f, 0.0f, + drawerButton = new DrawerButton("name"); + drawerButton->addListener(this); + addAndMakeVisible(drawerButton); + + if (!owner->isSink()) + { + channelSelector = new ChannelSelector(true, titleFont); + } + else + { + channelSelector = new ChannelSelector(false, titleFont); + } + + addChildComponent(channelSelector); + channelSelector->setVisible(false); + + + } + + backgroundGradient = ColourGradient(Colour(190, 190, 190), 0.0f, 0.0f, Colour(185, 185, 185), 0.0f, 120.0f, false); - backgroundGradient.addColour(0.2f, Colour(155, 155, 155)); - + backgroundGradient.addColour(0.2f, Colour(155, 155, 155)); + addParameterEditors(useDefaultParameterEditors); - - backgroundColor = Colour(10,10,10); - - //fadeIn(); - + + backgroundColor = Colour(10,10,10); + + //fadeIn(); + } void GenericEditor::addParameterEditors(bool useDefaultParameterEditors) { - if (useDefaultParameterEditors) { - - int maxX = 15; - int maxY = 30; + if (useDefaultParameterEditors) + { + + int maxX = 15; + int maxY = 30; - std::cout << "Adding parameter editors." << std::endl; + std::cout << "Adding parameter editors." << std::endl; - for (int i = 0; i < getProcessor()->getNumParameters(); i++) - { - ParameterEditor* p = new ParameterEditor(getProcessor(), getProcessor()->getParameterReference(i), titleFont); - - p->setChannelSelector(channelSelector); - int dWidth = p->desiredWidth; - int dHeight = p->desiredHeight; + for (int i = 0; i < getProcessor()->getNumParameters(); i++) + { + ParameterEditor* p = new ParameterEditor(getProcessor(), getProcessor()->getParameterReference(i), titleFont); - p->setBounds(maxX, maxY, dWidth, dHeight); - addAndMakeVisible(p); - parameterEditors.add(p); + p->setChannelSelector(channelSelector); + int dWidth = p->desiredWidth; + int dHeight = p->desiredHeight; - maxY += dHeight; - maxY += 10; - } + p->setBounds(maxX, maxY, dWidth, dHeight); + addAndMakeVisible(p); + parameterEditors.add(p); + + maxY += dHeight; + maxY += 10; + } } } @@ -133,322 +137,335 @@ void GenericEditor::addParameterEditors(bool useDefaultParameterEditors) void GenericEditor::refreshColors() { - //std::cout << getName() << " refreshing colors." << std::endl; + //std::cout << getName() << " refreshing colors." << std::endl; - enum { - PROCESSOR_COLOR = 801, - FILTER_COLOR = 802, - SINK_COLOR = 803, - SOURCE_COLOR = 804, - UTILITY_COLOR = 805, - }; + enum + { + PROCESSOR_COLOR = 801, + FILTER_COLOR = 802, + SINK_COLOR = 803, + SOURCE_COLOR = 804, + UTILITY_COLOR = 805, + }; - if (getProcessor()->isSource()) - backgroundColor = getProcessorList()->findColour(SOURCE_COLOR);// Colour(255, 0, 0);//Colour(int(0.9*255.0f),int(0.019*255.0f),int(0.16*255.0f)); - else if (getProcessor()->isSink()) - backgroundColor = getProcessorList()->findColour(SINK_COLOR);//Colour(255, 149, 0);//Colour(int(0.06*255.0f),int(0.46*255.0f),int(0.9*255.0f)); - else if (getProcessor()->isSplitter() || getProcessor()->isMerger()) - backgroundColor = getProcessorList()->findColour(UTILITY_COLOR);//Colour(40, 40, 40);//Colour(int(0.7*255.0f),int(0.7*255.0f),int(0.7*255.0f)); - else - backgroundColor = getProcessorList()->findColour(FILTER_COLOR);//Colour(255, 89, 0);//Colour(int(1.0*255.0f),int(0.5*255.0f),int(0.0*255.0f)); + if (getProcessor()->isSource()) + backgroundColor = getProcessorList()->findColour(SOURCE_COLOR);// Colour(255, 0, 0);//Colour(int(0.9*255.0f),int(0.019*255.0f),int(0.16*255.0f)); + else if (getProcessor()->isSink()) + backgroundColor = getProcessorList()->findColour(SINK_COLOR);//Colour(255, 149, 0);//Colour(int(0.06*255.0f),int(0.46*255.0f),int(0.9*255.0f)); + else if (getProcessor()->isSplitter() || getProcessor()->isMerger()) + backgroundColor = getProcessorList()->findColour(UTILITY_COLOR);//Colour(40, 40, 40);//Colour(int(0.7*255.0f),int(0.7*255.0f),int(0.7*255.0f)); + else + backgroundColor = getProcessorList()->findColour(FILTER_COLOR);//Colour(255, 89, 0);//Colour(int(1.0*255.0f),int(0.5*255.0f),int(0.0*255.0f)); - repaint(); + repaint(); } void GenericEditor::resized() { - if (drawerButton != 0) - drawerButton->setBounds(getWidth()-14, 40, 10, getHeight()-60); - - if (channelSelector != 0) - channelSelector->setBounds(desiredWidth - drawerWidth, 30, channelSelector->getDesiredWidth(), getHeight()-45); + if (drawerButton != 0) + drawerButton->setBounds(getWidth()-14, 40, 10, getHeight()-60); + + if (channelSelector != 0) + channelSelector->setBounds(desiredWidth - drawerWidth, 30, channelSelector->getDesiredWidth(), getHeight()-45); } -bool GenericEditor::keyPressed (const KeyPress& key) +bool GenericEditor::keyPressed(const KeyPress& key) { - return false; + return false; } -void GenericEditor::switchSelectedState() +void GenericEditor::switchSelectedState() { - //std::cout << "Switching selected state" << std::endl; - isSelected = !isSelected; - repaint(); + //std::cout << "Switching selected state" << std::endl; + isSelected = !isSelected; + repaint(); } void GenericEditor::select() { - isSelected = true; - repaint(); - //setWantsKeyboardFocus(true); - //grabKeyboardFocus(); + isSelected = true; + repaint(); + //setWantsKeyboardFocus(true); + //grabKeyboardFocus(); - editorWasClicked(); + editorWasClicked(); } void GenericEditor::highlight() { - isSelected = true; - repaint(); + isSelected = true; + repaint(); } -bool GenericEditor::getSelectionState() { - return isSelected; +bool GenericEditor::getSelectionState() +{ + return isSelected; } void GenericEditor::deselect() { - isSelected = false; - repaint(); - //setWantsKeyboardFocus(false); + isSelected = false; + repaint(); + //setWantsKeyboardFocus(false); } -void GenericEditor::enable() +void GenericEditor::enable() { - isEnabled = true; - GenericProcessor* p = (GenericProcessor*) getProcessor(); - p->enabledState(true); + isEnabled = true; + GenericProcessor* p = (GenericProcessor*) getProcessor(); + p->enabledState(true); } void GenericEditor::disable() { - isEnabled = false; - GenericProcessor* p = (GenericProcessor*) getProcessor(); - p->enabledState(false); + isEnabled = false; + GenericProcessor* p = (GenericProcessor*) getProcessor(); + p->enabledState(false); } bool GenericEditor::getEnabledState() { - GenericProcessor* p = (GenericProcessor*) getProcessor(); - return p->enabledState(); + GenericProcessor* p = (GenericProcessor*) getProcessor(); + return p->enabledState(); } void GenericEditor::setEnabledState(bool t) { - - GenericProcessor* p = (GenericProcessor*) getProcessor(); - p->enabledState(t); - isEnabled = p->enabledState(); + + GenericProcessor* p = (GenericProcessor*) getProcessor(); + p->enabledState(t); + isEnabled = p->enabledState(); } void GenericEditor::startAcquisition() { - std::cout << "GenericEditor received message to start acquisition." << std::endl; + std::cout << "GenericEditor received message to start acquisition." << std::endl; - if (channelSelector != 0) - channelSelector->startAcquisition(); + if (channelSelector != 0) + channelSelector->startAcquisition(); - for (int n = 0; n < parameterEditors.size(); n++) - { + for (int n = 0; n < parameterEditors.size(); n++) + { - if (parameterEditors[n]->shouldDeactivateDuringAcquisition) - parameterEditors[n]->setEnabled(false); + if (parameterEditors[n]->shouldDeactivateDuringAcquisition) + parameterEditors[n]->setEnabled(false); - } + } } void GenericEditor::stopAcquisition() { - if (channelSelector != 0) - channelSelector->stopAcquisition(); + if (channelSelector != 0) + channelSelector->stopAcquisition(); - for (int n = 0; n < parameterEditors.size(); n++) - { + for (int n = 0; n < parameterEditors.size(); n++) + { - if (parameterEditors[n]->shouldDeactivateDuringAcquisition) - parameterEditors[n]->setEnabled(true); + if (parameterEditors[n]->shouldDeactivateDuringAcquisition) + parameterEditors[n]->setEnabled(true); - } + } } void GenericEditor::fadeIn() { - isFading = true; - startTimer(10); + isFading = true; + startTimer(10); } -void GenericEditor::paint (Graphics& g) +void GenericEditor::paint(Graphics& g) { - int offset = 0; + int offset = 0; - if (isEnabled) - g.setColour(backgroundColor); - else - g.setColour(Colours::lightgrey); + if (isEnabled) + g.setColour(backgroundColor); + else + g.setColour(Colours::lightgrey); // draw colored background - g.fillRect(1,1,getWidth()-(2+offset),getHeight()-2); + g.fillRect(1,1,getWidth()-(2+offset),getHeight()-2); - // draw gray workspace - g.setGradientFill(backgroundGradient); - g.fillRect(1,22,getWidth()-2, getHeight()-29); + // draw gray workspace + g.setGradientFill(backgroundGradient); + g.fillRect(1,22,getWidth()-2, getHeight()-29); - g.setFont(titleFont); - g.setFont(14); + g.setFont(titleFont); + g.setFont(14); - if (isEnabled) - { - g.setColour(Colours::white); - } else { - g.setColour(Colours::grey); - } + if (isEnabled) + { + g.setColour(Colours::white); + } + else + { + g.setColour(Colours::grey); + } - // draw title - g.drawText(name, 6, 5, 500, 15, Justification::left, false); + // draw title + g.drawText(name, 6, 5, 500, 15, Justification::left, false); - if (isSelected) { - //g.setColour(Colours::yellow); - //g.drawRect(0,0,getWidth(),getHeight(),1.0); - g.setColour(Colours::yellow.withAlpha(0.5f)); - - } else { - g.setColour(Colours::black); - } + if (isSelected) + { + //g.setColour(Colours::yellow); + //g.drawRect(0,0,getWidth(),getHeight(),1.0); + g.setColour(Colours::yellow.withAlpha(0.5f)); - // draw highlight box - g.drawRect(0,0,getWidth(),getHeight(),2.0); + } + else + { + g.setColour(Colours::black); + } + + // draw highlight box + g.drawRect(0,0,getWidth(),getHeight(),2.0); - if (isFading) - { - g.setColour(Colours::black.withAlpha((float) (10.0-accumulator)/10.0f)); - if (getWidth() > 0 && getHeight() > 0) - g.fillAll(); - } + if (isFading) + { + g.setColour(Colours::black.withAlpha((float)(10.0-accumulator)/10.0f)); + if (getWidth() > 0 && getHeight() > 0) + g.fillAll(); + } } void GenericEditor::timerCallback() { - accumulator++; + accumulator++; - repaint(); + repaint(); - if (accumulator > 10.0) - { - stopTimer(); - isFading = false; - } + if (accumulator > 10.0) + { + stopTimer(); + isFading = false; + } } void GenericEditor::buttonClicked(Button* button) { - std::cout << "Button clicked." << std::endl; - - checkDrawerButton(button); + std::cout << "Button clicked." << std::endl; + + checkDrawerButton(button); - buttonEvent(button); // needed to inform subclasses of - // button event + buttonEvent(button); // needed to inform subclasses of + // button event } bool GenericEditor::checkDrawerButton(Button* button) { - if (button == drawerButton) - { - if (drawerButton->getToggleState()) - { - - channelSelector->setVisible(true); + if (button == drawerButton) + { + if (drawerButton->getToggleState()) + { + + channelSelector->setVisible(true); - drawerWidth = channelSelector->getDesiredWidth() + 20; + drawerWidth = channelSelector->getDesiredWidth() + 20; - desiredWidth += drawerWidth; + desiredWidth += drawerWidth; - } else { - - channelSelector->setVisible(false); + } + else + { - desiredWidth -= drawerWidth; - } + channelSelector->setVisible(false); - getEditorViewport()->makeEditorVisible(this); + desiredWidth -= drawerWidth; + } - deselect(); + getEditorViewport()->makeEditorVisible(this); - return true; - } else { - return false; - } + deselect(); + + return true; + } + else + { + return false; + } } void GenericEditor::sliderValueChanged(Slider* slider) { - sliderEvent(slider); + sliderEvent(slider); } void GenericEditor::update() { - std::cout << "Editor for "; + std::cout << "Editor for "; - GenericProcessor* p = (GenericProcessor*) getProcessor(); + GenericProcessor* p = (GenericProcessor*) getProcessor(); - std::cout << p->getName() << " updating settings." << std::endl; + std::cout << p->getName() << " updating settings." << std::endl; - int numChannels; + int numChannels; - if (channelSelector != 0) - { - if (!p->isSink()) - numChannels = p->getNumOutputs(); - else - numChannels = p->getNumInputs(); + if (channelSelector != 0) + { + if (!p->isSink()) + numChannels = p->getNumOutputs(); + else + numChannels = p->getNumInputs(); - channelSelector->setNumChannels(numChannels); - } + channelSelector->setNumChannels(numChannels); + } - if (numChannels == 0) - { - if (drawerButton != 0) - drawerButton->setVisible(false); - } else { - if (drawerButton != 0) - drawerButton->setVisible(true); - } + if (numChannels == 0) + { + if (drawerButton != 0) + drawerButton->setVisible(false); + } + else + { + if (drawerButton != 0) + drawerButton->setVisible(true); + } - updateSettings(); + updateSettings(); - updateVisualizer(); // does nothing unless this method - // has been implemented + updateVisualizer(); // does nothing unless this method + // has been implemented } Channel* GenericEditor::getChannel(int chan) { - return getProcessor()->channels[chan]; + return getProcessor()->channels[chan]; } Channel* GenericEditor::getEventChannel(int chan) { - return getProcessor()->eventChannels[chan]; + return getProcessor()->eventChannels[chan]; } Array<int> GenericEditor::getActiveChannels() { - Array<int> a = channelSelector->getActiveChannels(); - return a; + Array<int> a = channelSelector->getActiveChannels(); + return a; } bool GenericEditor::getRecordStatus(int chan) { - return channelSelector->getRecordStatus(chan); + return channelSelector->getRecordStatus(chan); } bool GenericEditor::getAudioStatus(int chan) { - return channelSelector->getAudioStatus(chan); + return channelSelector->getAudioStatus(chan); } @@ -457,141 +474,145 @@ bool GenericEditor::getAudioStatus(int chan) DrawerButton::DrawerButton(const String& name) : Button(name) { - setClickingTogglesState(true); + setClickingTogglesState(true); } void DrawerButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown) { - if (isMouseOver) - g.setColour(Colour(210,210,210)); - else - g.setColour(Colour(110, 110, 110)); - - g.drawVerticalLine(3, 0.0f, getHeight()); - g.drawVerticalLine(5, 0.0f, getHeight()); - g.drawVerticalLine(7, 0.0f, getHeight()); + if (isMouseOver) + g.setColour(Colour(210,210,210)); + else + g.setColour(Colour(110, 110, 110)); + + g.drawVerticalLine(3, 0.0f, getHeight()); + g.drawVerticalLine(5, 0.0f, getHeight()); + g.drawVerticalLine(7, 0.0f, getHeight()); } UtilityButton::UtilityButton(const String& label_, Font font_) : - Button(label_), label(label_), font(font_) - { - + Button(label_), label(label_), font(font_) +{ + roundUL = true; - roundUR = true; - roundLL = true; - roundLR = true; + roundUR = true; + roundLL = true; + roundLR = true; - radius = 5.0f; + radius = 5.0f; - font.setHeight(12.0f); + font.setHeight(12.0f); - setEnabledState(true); + setEnabledState(true); - } +} void UtilityButton::setCorners(bool UL, bool UR, bool LL, bool LR) { - roundUL = UL; - roundUR = UR; - roundLL = LL; - roundLR = LR; + roundUL = UL; + roundUR = UR; + roundLL = LL; + roundLR = LR; } void UtilityButton::setEnabledState(bool state) { - isEnabled = state; - - if (state) - { - selectedGrad = ColourGradient(Colour(240,179,12),0.0,0.0, - Colour(207,160,33),0.0, 20.0f, - false); - selectedOverGrad = ColourGradient(Colour(209,162,33),0.0, 5.0f, - Colour(190,150,25),0.0, 0.0f, - false); - neutralGrad = ColourGradient(Colour(220,220,220),0.0,0.0, - Colour(170,170,170),0.0, 20.0f, - false); - neutralOverGrad = ColourGradient(Colour(180,180,180),0.0,5.0f, - Colour(150,150,150),0.0, 0.0, - false); - fontColor = Colours::darkgrey; - - } else { - - selectedGrad = ColourGradient(Colour(240,240,240),0.0,0.0, - Colour(200,200,200),0.0, 20.0f, - false); - selectedOverGrad = ColourGradient(Colour(240,240,240),0.0,0.0, - Colour(200,200,200),0.0, 20.0f, - false); - neutralGrad = ColourGradient(Colour(240,240,240),0.0,0.0, - Colour(200,200,200),0.0, 20.0f, - false); - neutralOverGrad = ColourGradient(Colour(240,240,240),0.0,0.0, - Colour(200,200,200),0.0, 20.0f, - false); - fontColor = Colours::white; - } - - repaint(); + isEnabled = state; + + if (state) + { + selectedGrad = ColourGradient(Colour(240,179,12),0.0,0.0, + Colour(207,160,33),0.0, 20.0f, + false); + selectedOverGrad = ColourGradient(Colour(209,162,33),0.0, 5.0f, + Colour(190,150,25),0.0, 0.0f, + false); + neutralGrad = ColourGradient(Colour(220,220,220),0.0,0.0, + Colour(170,170,170),0.0, 20.0f, + false); + neutralOverGrad = ColourGradient(Colour(180,180,180),0.0,5.0f, + Colour(150,150,150),0.0, 0.0, + false); + fontColor = Colours::darkgrey; + + } + else + { + + selectedGrad = ColourGradient(Colour(240,240,240),0.0,0.0, + Colour(200,200,200),0.0, 20.0f, + false); + selectedOverGrad = ColourGradient(Colour(240,240,240),0.0,0.0, + Colour(200,200,200),0.0, 20.0f, + false); + neutralGrad = ColourGradient(Colour(240,240,240),0.0,0.0, + Colour(200,200,200),0.0, 20.0f, + false); + neutralOverGrad = ColourGradient(Colour(240,240,240),0.0,0.0, + Colour(200,200,200),0.0, 20.0f, + false); + fontColor = Colours::white; + } + + repaint(); } void UtilityButton::setRadius(float r) { - radius = r; + radius = r; } void UtilityButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown) { - g.setColour(Colours::grey); - g.fillPath(outlinePath); + g.setColour(Colours::grey); + g.fillPath(outlinePath); - if (getToggleState()) - { - if (isMouseOver) - g.setGradientFill(selectedOverGrad); + if (getToggleState()) + { + if (isMouseOver) + g.setGradientFill(selectedOverGrad); else - g.setGradientFill(selectedGrad); - } else { - if (isMouseOver) - g.setGradientFill(neutralOverGrad); + g.setGradientFill(selectedGrad); + } + else + { + if (isMouseOver) + g.setGradientFill(neutralOverGrad); else - g.setGradientFill(neutralGrad); - } + g.setGradientFill(neutralGrad); + } + + AffineTransform a = AffineTransform::scale(0.98f, 0.94f, float(getWidth())/2.0f, + float(getHeight())/2.0f); + g.fillPath(outlinePath, a); - AffineTransform a = AffineTransform::scale(0.98f, 0.94f, float(getWidth())/2.0f, - float(getHeight())/2.0f); - g.fillPath(outlinePath, a); - - //int stringWidth = font.getStringWidth(getName()); + //int stringWidth = font.getStringWidth(getName()); - g.setFont(font); + g.setFont(font); - g.setColour(fontColor); - g.drawText(getName(),0,0,getWidth(),getHeight(),Justification::centred,true); + g.setColour(fontColor); + g.drawText(getName(),0,0,getWidth(),getHeight(),Justification::centred,true); - //g.drawSingleLineText(getName(), getWidth()/2 - stringWidth/2, 12); + //g.drawSingleLineText(getName(), getWidth()/2 - stringWidth/2, 12); - // if (getToggleState() == true) - // g.setColour(Colours::orange); - // else - // g.setColour(Colours::darkgrey); + // if (getToggleState() == true) + // g.setColour(Colours::orange); + // else + // g.setColour(Colours::darkgrey); - // if (isMouseOver) - // g.setColour(Colours::white); + // if (isMouseOver) + // g.setColour(Colours::white); - // g.fillRect(0,0,getWidth(),getHeight()); + // g.fillRect(0,0,getWidth(),getHeight()); - // font.setHeight(10); - // g.setFont(font); - // g.setColour(Colours::black); + // font.setHeight(10); + // g.setFont(font); + // g.setColour(Colours::black); - // g.drawRect(0,0,getWidth(),getHeight(),1.0); + // g.drawRect(0,0,getWidth(),getHeight(),1.0); //g.drawText(getName(),0,0,getWidth(),getHeight(),Justification::centred,true); // if (isButtonDown) @@ -603,7 +624,7 @@ void UtilityButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown // int offset = 3; // g.fillRect(getWidth()/2-thickness, - // offset, + // offset, // thickness*2, // getHeight()-offset*2); @@ -612,50 +633,58 @@ void UtilityButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown // getWidth()-offset*2, // thickness*2); } - + void UtilityButton::resized() { - outlinePath.clear(); - - if (roundUL) - { - outlinePath.startNewSubPath(radius, 0); - } else { - outlinePath.startNewSubPath(0, 0); - } - - if (roundUR) - { - outlinePath.lineTo(getWidth()-radius, 0); - outlinePath.addArc(getWidth()-radius*2, 0, radius*2, radius*2, 0, 0.5*double_Pi); - } else { - outlinePath.lineTo(getWidth(), 0); - } - - if (roundLR) - { - outlinePath.lineTo(getWidth(), getHeight()-radius); - outlinePath.addArc(getWidth()-radius*2, getHeight()-radius*2, radius*2, radius*2, 0.5*double_Pi, double_Pi); - } else { - outlinePath.lineTo(getWidth(), getHeight()); - } - - if (roundLL) - { - outlinePath.lineTo(radius, getHeight()); - outlinePath.addArc(0, getHeight()-radius*2, radius*2, radius*2, double_Pi, 1.5*double_Pi); - } else { - outlinePath.lineTo(0, getHeight()); - } - - if (roundUL) - { - outlinePath.lineTo(0, radius); - outlinePath.addArc(0, 0, radius*2, radius*2, 1.5*double_Pi, 2.0*double_Pi); - } - - outlinePath.closeSubPath(); + outlinePath.clear(); + + if (roundUL) + { + outlinePath.startNewSubPath(radius, 0); + } + else + { + outlinePath.startNewSubPath(0, 0); + } + + if (roundUR) + { + outlinePath.lineTo(getWidth()-radius, 0); + outlinePath.addArc(getWidth()-radius*2, 0, radius*2, radius*2, 0, 0.5*double_Pi); + } + else + { + outlinePath.lineTo(getWidth(), 0); + } + + if (roundLR) + { + outlinePath.lineTo(getWidth(), getHeight()-radius); + outlinePath.addArc(getWidth()-radius*2, getHeight()-radius*2, radius*2, radius*2, 0.5*double_Pi, double_Pi); + } + else + { + outlinePath.lineTo(getWidth(), getHeight()); + } + + if (roundLL) + { + outlinePath.lineTo(radius, getHeight()); + outlinePath.addArc(0, getHeight()-radius*2, radius*2, radius*2, double_Pi, 1.5*double_Pi); + } + else + { + outlinePath.lineTo(0, getHeight()); + } + + if (roundUL) + { + outlinePath.lineTo(0, radius); + outlinePath.addArc(0, 0, radius*2, radius*2, 1.5*double_Pi, 2.0*double_Pi); + } + + outlinePath.closeSubPath(); } @@ -669,7 +698,9 @@ void TriangleButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDow if (isMouseOver) { g.setColour(Colours::grey); - } else { + } + else + { g.setColour(Colours::black); } @@ -690,7 +721,9 @@ void TriangleButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDow y1 = getHeight()-inset; y2 = inset; - } else { + } + else + { y1 = inset; y2 = getHeight()-inset; } diff --git a/Source/Processors/Editors/GenericEditor.h b/Source/Processors/Editors/GenericEditor.h index daa142822d713dc9ad46ad901761f70057826dda..ec14f362ea99cd25b80f7286b3afccc079220bf3 100755 --- a/Source/Processors/Editors/GenericEditor.h +++ b/Source/Processors/Editors/GenericEditor.h @@ -24,9 +24,6 @@ #ifndef __GENERICEDITOR_H_DD406E71__ #define __GENERICEDITOR_H_DD406E71__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "../GenericProcessor.h" #include "../../AccessClass.h" @@ -45,7 +42,7 @@ class Channel; /** - + Base class for creating processor editors. If a processor doesn't havesign an editor defined, a GenericEditor will be used. @@ -58,211 +55,223 @@ class Channel; */ class GenericEditor : public AudioProcessorEditor, - public Timer, - public AccessClass, - public Button::Listener, - public Slider::Listener + public Timer, + public AccessClass, + public Button::Listener, + public Slider::Listener { public: - /** Constructor. Loads fonts and creates default buttons. + /** Constructor. Loads fonts and creates default buttons. useDefaultParameter Editors false means custom parameter editors will be used.*/ - GenericEditor (GenericProcessor* owner, bool useDefaultParameterEditors); - + GenericEditor(GenericProcessor* owner, bool useDefaultParameterEditors); + /** Constructor. Loads fonts and creates default buttons.*/ //GenericEditor (GenericProcessor* owner); - /** Destructor.*/ - virtual ~GenericEditor(); + /** Destructor.*/ + virtual ~GenericEditor(); - /** Draws the editor's background.*/ - void paint (Graphics& g); + /** Draws the editor's background.*/ + void paint(Graphics& g); - /** Called whenever a key is pressed and the editor has keyboard focus.*/ - bool keyPressed (const KeyPress& key); + /** Called whenever a key is pressed and the editor has keyboard focus.*/ + bool keyPressed(const KeyPress& key); - /** Toggles the editor's selection state.*/ - void switchSelectedState(); + /** Toggles the editor's selection state.*/ + void switchSelectedState(); - /** Highlights an editor and calls editorWasClicked().*/ - void select(); + /** Highlights an editor and calls editorWasClicked().*/ + void select(); - /** Highlights an editor.*/ - void highlight(); + /** Highlights an editor.*/ + void highlight(); - /** Deselects an editor.*/ - void deselect(); + /** Deselects an editor.*/ + void deselect(); - /** Returns an editor's selection state.*/ - bool getSelectionState(); + /** Returns an editor's selection state.*/ + bool getSelectionState(); - /** Used to enable an editor's processor.*/ - void enable(); + /** Used to enable an editor's processor.*/ + void enable(); - /** Used to disable an editor's processor.*/ - void disable(); + /** Used to disable an editor's processor.*/ + void disable(); - /** Returns whether or not the editor's processor is enabled (i.e., whether it's able to handle data.*/ - bool getEnabledState(); + /** Returns whether or not the editor's processor is enabled (i.e., whether it's able to handle data.*/ + bool getEnabledState(); - /** Used to enable or disable an editor's processor.*/ - void setEnabledState(bool); + /** Used to enable or disable an editor's processor.*/ + void setEnabledState(bool); - /** Called just prior to the start of acquisition, to allow the editor to prepare.*/ - void startAcquisition(); + /** Called just prior to the start of acquisition, to allow the editor to prepare.*/ + void startAcquisition(); - /** Called after the end of acquisition.*/ - void stopAcquisition(); + /** Called after the end of acquisition.*/ + void stopAcquisition(); - /** Returns the name of the editor.*/ - String getName() {return name;} + /** Returns the name of the editor.*/ + String getName() + { + return name; + } - /** Determines how wide the editor will be drawn. */ - int desiredWidth; + /** Determines how wide the editor will be drawn. */ + int desiredWidth; - /** The unique integer ID of the editor's processor. */ - int nodeId; + /** The unique integer ID of the editor's processor. */ + int nodeId; - /** Sets the number of the editor's associated tab in the DataViewport. */ - virtual void tabNumber(int t) {tNum = t;} + /** Sets the number of the editor's associated tab in the DataViewport. */ + virtual void tabNumber(int t) + { + tNum = t; + } - /** Returns the number of the editor's associated tab in the DataViewport. */ - int tabNumber() {return tNum;} + /** Returns the number of the editor's associated tab in the DataViewport. */ + int tabNumber() + { + return tNum; + } - /** Required for MergerEditor only.*/ - virtual void switchSource(int) { } + /** Required for MergerEditor only.*/ + virtual void switchSource(int) { } - /** Required for MergerEditor only.*/ - virtual void switchSource() { } + /** Required for MergerEditor only.*/ + virtual void switchSource() { } - /** Returns the processor associated with an editor.*/ - GenericProcessor* getProcessor() const {return (GenericProcessor*) getAudioProcessor();} + /** Returns the processor associated with an editor.*/ + GenericProcessor* getProcessor() const + { + return (GenericProcessor*) getAudioProcessor(); + } - /** Causes the editor to fade in when it first appears in the EditorViewport. */ - void fadeIn(); + /** Causes the editor to fade in when it first appears in the EditorViewport. */ + void fadeIn(); - /** Indicates whether or not the editor is in the processof fading in. */ - bool isFading; + /** Indicates whether or not the editor is in the processof fading in. */ + bool isFading; - /** Used to control the speed at which the editor fades in. */ - float accumulator; + /** Used to control the speed at which the editor fades in. */ + float accumulator; - /** Required for SplitterEditor only.*/ - virtual void switchDest() { } + /** Required for SplitterEditor only.*/ + virtual void switchDest() { } - /** Required for SplitterEditor and MergerEditor only.*/ - virtual void switchIO(int) { } + /** Required for SplitterEditor and MergerEditor only.*/ + virtual void switchIO(int) { } - /** Handles button clicks for all editors. Deals with clicks on the editor's + /** Handles button clicks for all editors. Deals with clicks on the editor's title bar and channel selector drawer. */ - virtual void buttonClicked(Button* button); + virtual void buttonClicked(Button* button); - /** Called by buttonClicked(). Deals with clicks on custom buttons. Subclasses of - GenericEditor should modify this method only.*/ - virtual void buttonEvent(Button* button) {} + /** Called by buttonClicked(). Deals with clicks on custom buttons. Subclasses of + GenericEditor should modify this method only.*/ + virtual void buttonEvent(Button* button) {} - /** Handles slider events for all editors. */ - virtual void sliderValueChanged(Slider* slider); + /** Handles slider events for all editors. */ + virtual void sliderValueChanged(Slider* slider); - /** Called by sliderValueChanged(). Deals with clicks on custom sliders. Subclasses - of GenericEditor should modify this method only.*/ - virtual void sliderEvent(Slider* slider) {} + /** Called by sliderValueChanged(). Deals with clicks on custom sliders. Subclasses + of GenericEditor should modify this method only.*/ + virtual void sliderEvent(Slider* slider) {} - /** Required for opening displays in a VisualizerEditor. Hopefully will be deprecated soon.*/ - virtual void editorWasClicked() {} + /** Required for opening displays in a VisualizerEditor. Hopefully will be deprecated soon.*/ + virtual void editorWasClicked() {} - /** Checks to see if a button click occurred on the ChannelSelector drawer button.*/ - bool checkDrawerButton(Button* button); + /** Checks to see if a button click occurred on the ChannelSelector drawer button.*/ + bool checkDrawerButton(Button* button); - /** Returns the record status of a given channel from the ChannelSelector.*/ - bool getRecordStatus(int chan); + /** Returns the record status of a given channel from the ChannelSelector.*/ + bool getRecordStatus(int chan); - /** Returns the audio monitoring status of a given channel from the ChannelSelector.*/ - bool getAudioStatus(int chan); + /** Returns the audio monitoring status of a given channel from the ChannelSelector.*/ + bool getAudioStatus(int chan); - /** Selects all the channels in the input array.*/ - void selectChannels(Array<int>); + /** Selects all the channels in the input array.*/ + void selectChannels(Array<int>); - /** Refreshes an editor's background colors when the user selects new ones with the ColourSelector.*/ - void refreshColors(); + /** Refreshes an editor's background colors when the user selects new ones with the ColourSelector.*/ + void refreshColors(); - /** Called when an editor's processor updates its settings (mainly to update channel count).*/ - virtual void update(); + /** Called when an editor's processor updates its settings (mainly to update channel count).*/ + virtual void update(); - /** Called by the update() method to allow the editor to update its custom settings.*/ - virtual void updateSettings() {} + /** Called by the update() method to allow the editor to update its custom settings.*/ + virtual void updateSettings() {} - /** Allows an editor to update the settings of its visualizer (such as channel count and sample rate).*/ - virtual void updateVisualizer() {} + /** Allows an editor to update the settings of its visualizer (such as channel count and sample rate).*/ + virtual void updateVisualizer() {} - /** Used by SpikeDetectorEditor. */ - virtual void channelChanged(int chan) {} + /** Used by SpikeDetectorEditor. */ + virtual void channelChanged(int chan) {} - /** Returns all selected channels from the ChannelSelector. */ - Array<int> getActiveChannels(); + /** Returns all selected channels from the ChannelSelector. */ + Array<int> getActiveChannels(); - /** An array of pointers to ParameterEditors created based on the Parameters of an editor's underlying processor. */ - Array<ParameterEditor*> parameterEditors; + /** An array of pointers to ParameterEditors created based on the Parameters of an editor's underlying processor. */ + Array<ParameterEditor*> parameterEditors; - /** Returns the Channel object for a given continuous channel number. */ - Channel* getChannel(int chan); + /** Returns the Channel object for a given continuous channel number. */ + Channel* getChannel(int chan); - /** Returns the Channel object for a given event channel number. */ - Channel* getEventChannel(int chan); + /** Returns the Channel object for a given event channel number. */ + Channel* getEventChannel(int chan); - /** Stores the font used to display the editor's name. */ - Font titleFont; + /** Stores the font used to display the editor's name. */ + Font titleFont; protected: - /** A pointer to the button that opens the drawer for the ChannelSelector. */ - DrawerButton* drawerButton; + /** A pointer to the button that opens the drawer for the ChannelSelector. */ + DrawerButton* drawerButton; - /** Determines the width of the ChannelSelector drawer when opened. */ - int drawerWidth; + /** Determines the width of the ChannelSelector drawer when opened. */ + int drawerWidth; - /** Can be overridden to customize the layout of ParameterEditors. */ + /** Can be overridden to customize the layout of ParameterEditors. */ //Ideally this would be virtual, but since it's run in the construct and because virtual functions don't get overriden in the constructor, it's not. void addParameterEditors(bool useStandard); - /** A pointer to the editor's ChannelSelector. */ - ChannelSelector* channelSelector; - - + /** A pointer to the editor's ChannelSelector. */ + ChannelSelector* channelSelector; + + private: - /** Used for fading in the editor. */ - virtual void timerCallback(); + /** Used for fading in the editor. */ + virtual void timerCallback(); + + /** Called when the boundaries of the editor are updated. */ + virtual void resized(); - /** Called when the boundaries of the editor are updated. */ - virtual void resized(); + /** Stores the editor's background color. */ + Colour backgroundColor; - /** Stores the editor's background color. */ - Colour backgroundColor; + /** Stores the editor's background gradient. */ + ColourGradient backgroundGradient; - /** Stores the editor's background gradient. */ - ColourGradient backgroundGradient; + bool isSelected; + bool isEnabled; - bool isSelected; - bool isEnabled; + int tNum; - int tNum; - /**initializing function Used to share constructor functions*/ void constructorInitialize(GenericProcessor* owner, bool useDefaultParameterEditors); - String name; + String name; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GenericEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(GenericEditor); }; /** - + Used to show and hide the ChannelSelector. Appears on the right-hand size of all editors (except SplitterEditor and MergerEditor). @@ -274,15 +283,15 @@ private: class DrawerButton : public Button { public: - DrawerButton(const String& name); - ~DrawerButton() {} + DrawerButton(const String& name); + ~DrawerButton() {} private: - void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); - + void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); + }; /** - + A button that displays a triangle facing up or down. Useful for incrementing or decrementing values (as in SpikeDetectorEditor). @@ -294,17 +303,19 @@ private: class TriangleButton : public Button { public: - TriangleButton(int direction_) : Button("Arrow") - {direction = direction_;} + TriangleButton(int direction_) : Button("Arrow") + { + direction = direction_; + } ~TriangleButton() {} private: void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); - + int direction; }; /** - + A button that displays text. @see GenericEditor @@ -321,7 +332,10 @@ public: void setRadius(float r); void setEnabledState(bool); - bool getEnabledState() {return isEnabled;} + bool getEnabledState() + { + return isEnabled; + } private: void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); diff --git a/Source/Processors/Editors/ImageIcon.cpp b/Source/Processors/Editors/ImageIcon.cpp index cb36389cbfd2f0c84d3ec22ab64322f770c24fbb..f70fa782c30e2bc1d8effa72972790813291eefa 100755 --- a/Source/Processors/Editors/ImageIcon.cpp +++ b/Source/Processors/Editors/ImageIcon.cpp @@ -25,7 +25,7 @@ void ImageIcon::setOpacity(float o) { - opacity = o; - repaint(); + opacity = o; + repaint(); } \ No newline at end of file diff --git a/Source/Processors/Editors/ImageIcon.h b/Source/Processors/Editors/ImageIcon.h index d70495a1ed1eafd8bd05d1caca14db613ee928d9..0ac7b721493d2a78087769433c7fc40b5c7d8ed1 100755 --- a/Source/Processors/Editors/ImageIcon.h +++ b/Source/Processors/Editors/ImageIcon.h @@ -24,9 +24,6 @@ #ifndef __IMAGEICON_H_ED764AE7__ #define __IMAGEICON_H_ED764AE7__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" /** @@ -40,26 +37,30 @@ class ImageIcon : public Component { public: - ImageIcon (Image& image_) { image = image_; opacity = 1.0;} - ~ImageIcon () {} - - void setOpacity(float); - -private: - - void paint (Graphics& g) - { - g.setOpacity(opacity); - g.drawImageWithin(image, // image& - 0, // destX - 0, // destY - getWidth(), // destWidth - getHeight(), // destHeight - RectanglePlacement::xLeft); - } - - Image image; - float opacity; + ImageIcon(Image& image_) + { + image = image_; + opacity = 1.0; + } + ~ImageIcon() {} + + void setOpacity(float); + +private: + + void paint(Graphics& g) + { + g.setOpacity(opacity); + g.drawImageWithin(image, // image& + 0, // destX + 0, // destY + getWidth(), // destWidth + getHeight(), // destHeight + RectanglePlacement::xLeft); + } + + Image image; + float opacity; }; diff --git a/Source/Processors/Editors/LfpDisplayEditor.cpp b/Source/Processors/Editors/LfpDisplayEditor.cpp index 4110b5b55eaa4b3f1d698d69471460009816ef37..42a6712a657359adb8fc308ad3f7cf15162ae11e 100755 --- a/Source/Processors/Editors/LfpDisplayEditor.cpp +++ b/Source/Processors/Editors/LfpDisplayEditor.cpp @@ -24,14 +24,14 @@ #include "LfpDisplayEditor.h" -LfpDisplayEditor::LfpDisplayEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : VisualizerEditor(parentNode, useDefaultParameterEditors) +LfpDisplayEditor::LfpDisplayEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : VisualizerEditor(parentNode, useDefaultParameterEditors) { - tabText = "LFP"; + tabText = "LFP"; - desiredWidth = 180; + desiredWidth = 180; } @@ -43,22 +43,23 @@ LfpDisplayEditor::~LfpDisplayEditor() Visualizer* LfpDisplayEditor::createNewCanvas() { - LfpDisplayNode* processor = (LfpDisplayNode*) getProcessor(); - return new LfpDisplayCanvas(processor); + LfpDisplayNode* processor = (LfpDisplayNode*) getProcessor(); + return new LfpDisplayCanvas(processor); } void LfpDisplayEditor::buttonCallback(Button* button) { - int gId = button->getRadioGroupId(); + int gId = button->getRadioGroupId(); - if (gId > 0) { - if (canvas != 0) - { - canvas->setParameter(gId-1, button->getName().getFloatValue()); - } + if (gId > 0) + { + if (canvas != 0) + { + canvas->setParameter(gId-1, button->getName().getFloatValue()); + } - } + } } diff --git a/Source/Processors/Editors/LfpDisplayEditor.h b/Source/Processors/Editors/LfpDisplayEditor.h index b3a5a8eaea98e3e42e0c6ac192e4249a00171c41..d93f94088db2ffff6af9e760ed2dd30639a36a20 100755 --- a/Source/Processors/Editors/LfpDisplayEditor.h +++ b/Source/Processors/Editors/LfpDisplayEditor.h @@ -24,9 +24,6 @@ #ifndef __LFPDISPLAYEDITOR_H_3438800D__ #define __LFPDISPLAYEDITOR_H_3438800D__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" #include "../../UI/UIComponent.h" @@ -39,7 +36,7 @@ class Visualizer; /** - + User interface for the LfpDisplayNode sink. @see LfpDisplayNode, LfpDisplayCanvas @@ -49,17 +46,17 @@ class Visualizer; class LfpDisplayEditor : public VisualizerEditor { public: - LfpDisplayEditor (GenericProcessor*, bool useDefaultParameterEditors); - ~LfpDisplayEditor(); + LfpDisplayEditor(GenericProcessor*, bool useDefaultParameterEditors); + ~LfpDisplayEditor(); - void buttonCallback (Button* button); + void buttonCallback(Button* button); - Visualizer* createNewCanvas(); + Visualizer* createNewCanvas(); -private: +private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LfpDisplayEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LfpDisplayEditor); }; diff --git a/Source/Processors/Editors/MergerEditor.cpp b/Source/Processors/Editors/MergerEditor.cpp index d9441396506620f5adb85f08a3846395400a443e..5bea9103c096b54cd21c400642e195ded03e7d20 100755 --- a/Source/Processors/Editors/MergerEditor.cpp +++ b/Source/Processors/Editors/MergerEditor.cpp @@ -51,105 +51,107 @@ // { // } -MergerEditor::MergerEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors) +MergerEditor::MergerEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) { - desiredWidth = 90; + desiredWidth = 90; - pipelineSelectorA = new ImageButton("Pipeline A"); + pipelineSelectorA = new ImageButton("Pipeline A"); - Image normalImageA = ImageCache::getFromMemory (BinaryData::MergerB01_png, BinaryData::MergerB01_pngSize); - Image downImageA = ImageCache::getFromMemory (BinaryData::MergerA01_png, BinaryData::MergerA01_pngSize); - Image normalImageB = ImageCache::getFromMemory (BinaryData::MergerA02_png, BinaryData::MergerA02_pngSize); - Image downImageB = ImageCache::getFromMemory (BinaryData::MergerB02_png, BinaryData::MergerB02_pngSize); + Image normalImageA = ImageCache::getFromMemory(BinaryData::MergerB01_png, BinaryData::MergerB01_pngSize); + Image downImageA = ImageCache::getFromMemory(BinaryData::MergerA01_png, BinaryData::MergerA01_pngSize); + Image normalImageB = ImageCache::getFromMemory(BinaryData::MergerA02_png, BinaryData::MergerA02_pngSize); + Image downImageB = ImageCache::getFromMemory(BinaryData::MergerB02_png, BinaryData::MergerB02_pngSize); - pipelineSelectorA->setImages(true, true, true, - normalImageA, 1.0f, Colours::white.withAlpha(0.0f), - normalImageA, 1.0f, Colours::black.withAlpha(0.0f), - downImageA, 1.0f, Colours::white.withAlpha(0.0f)); + pipelineSelectorA->setImages(true, true, true, + normalImageA, 1.0f, Colours::white.withAlpha(0.0f), + normalImageA, 1.0f, Colours::black.withAlpha(0.0f), + downImageA, 1.0f, Colours::white.withAlpha(0.0f)); - pipelineSelectorA->addListener(this); - pipelineSelectorA->setBounds(-10,25,95,50); - pipelineSelectorA->setToggleState(true,false); - addAndMakeVisible(pipelineSelectorA); + pipelineSelectorA->addListener(this); + pipelineSelectorA->setBounds(-10,25,95,50); + pipelineSelectorA->setToggleState(true,false); + addAndMakeVisible(pipelineSelectorA); - pipelineSelectorB = new ImageButton("Pipeline B"); + pipelineSelectorB = new ImageButton("Pipeline B"); - pipelineSelectorB->setImages(true, true, true, - normalImageB, 1.0f, Colours::white.withAlpha(0.0f), - normalImageB, 1.0f, Colours::black.withAlpha(0.0f), - downImageB, 1.0f, Colours::white.withAlpha(0.0f)); + pipelineSelectorB->setImages(true, true, true, + normalImageB, 1.0f, Colours::white.withAlpha(0.0f), + normalImageB, 1.0f, Colours::black.withAlpha(0.0f), + downImageB, 1.0f, Colours::white.withAlpha(0.0f)); - pipelineSelectorB->addListener(this); - pipelineSelectorB->setBounds(-10,75,95,50); - pipelineSelectorB->setToggleState(false,false); - addAndMakeVisible(pipelineSelectorB); + pipelineSelectorB->addListener(this); + pipelineSelectorB->setBounds(-10,75,95,50); + pipelineSelectorB->setToggleState(false,false); + addAndMakeVisible(pipelineSelectorB); } MergerEditor::~MergerEditor() { - deleteAllChildren(); + deleteAllChildren(); } void MergerEditor::buttonEvent(Button* button) { - if (button == pipelineSelectorA) - { - pipelineSelectorA->setToggleState(true,false); - pipelineSelectorB->setToggleState(false,false); - Merger* processor = (Merger*) getProcessor(); - processor->switchIO(0); - - } else if (button == pipelineSelectorB) - { - pipelineSelectorB->setToggleState(true,false); - pipelineSelectorA->setToggleState(false,false); - Merger* processor = (Merger*) getProcessor(); - processor->switchIO(1); - - } + if (button == pipelineSelectorA) + { + pipelineSelectorA->setToggleState(true,false); + pipelineSelectorB->setToggleState(false,false); + Merger* processor = (Merger*) getProcessor(); + processor->switchIO(0); + + } + else if (button == pipelineSelectorB) + { + pipelineSelectorB->setToggleState(true,false); + pipelineSelectorA->setToggleState(false,false); + Merger* processor = (Merger*) getProcessor(); + processor->switchIO(1); + + } } void MergerEditor::switchSource(int source) { - if (source == 0) - { - pipelineSelectorA->setToggleState(true,false); - pipelineSelectorB->setToggleState(false,false); - Merger* processor = (Merger*) getProcessor(); - processor->switchIO(0); - - } else if (source == 1) - { - pipelineSelectorB->setToggleState(true,false); - pipelineSelectorA->setToggleState(false,false); - Merger* processor = (Merger*) getProcessor(); - processor->switchIO(1); - - } + if (source == 0) + { + pipelineSelectorA->setToggleState(true,false); + pipelineSelectorB->setToggleState(false,false); + Merger* processor = (Merger*) getProcessor(); + processor->switchIO(0); + + } + else if (source == 1) + { + pipelineSelectorB->setToggleState(true,false); + pipelineSelectorA->setToggleState(false,false); + Merger* processor = (Merger*) getProcessor(); + processor->switchIO(1); + + } } void MergerEditor::switchIO(int source) { - switchSource(source); + switchSource(source); - select(); + select(); } void MergerEditor::switchSource() { - - bool isBOn = pipelineSelectorB->getToggleState(); - bool isAOn = pipelineSelectorA->getToggleState(); - pipelineSelectorB->setToggleState(!isBOn,false); - pipelineSelectorA->setToggleState(!isAOn,false); + bool isBOn = pipelineSelectorB->getToggleState(); + bool isAOn = pipelineSelectorA->getToggleState(); - Merger* processor = (Merger*) getProcessor(); - processor->switchIO(); + pipelineSelectorB->setToggleState(!isBOn,false); + pipelineSelectorA->setToggleState(!isAOn,false); + + Merger* processor = (Merger*) getProcessor(); + processor->switchIO(); } diff --git a/Source/Processors/Editors/MergerEditor.h b/Source/Processors/Editors/MergerEditor.h index fe97e4a8ffca2ce457704656460c3af04280f701..dfbf85aa8e065fd8365863aa7020a599d2556c5c 100755 --- a/Source/Processors/Editors/MergerEditor.h +++ b/Source/Processors/Editors/MergerEditor.h @@ -25,9 +25,6 @@ #define __MERGEREDITOR_H_33F644A8__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" @@ -43,22 +40,22 @@ class MergerEditor : public GenericEditor { public: - MergerEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors); - virtual ~MergerEditor(); + MergerEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + virtual ~MergerEditor(); - virtual void buttonEvent (Button* button); + virtual void buttonEvent(Button* button); void switchSource(int); - void switchSource (); + void switchSource(); void switchIO(int); -private: - - ImageButton* pipelineSelectorA; - ImageButton* pipelineSelectorB; +private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MergerEditor); + ImageButton* pipelineSelectorA; + ImageButton* pipelineSelectorB; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MergerEditor); }; diff --git a/Source/Processors/Editors/ParameterEditor.cpp b/Source/Processors/Editors/ParameterEditor.cpp index ad86a369c2a0318e999210edffb86a88e80c4abb..44296d8bd4b21c4aec2814ed3bf460d32b00d282 100755 --- a/Source/Processors/Editors/ParameterEditor.cpp +++ b/Source/Processors/Editors/ParameterEditor.cpp @@ -26,194 +26,196 @@ ParameterEditor::ParameterEditor(GenericProcessor* proc, Parameter& p, Font labelFont) { - activationState = true; - - processor = proc; - - shouldDeactivateDuringAcquisition = p.shouldDeactivateDuringAcquisition; - - if (p.isBoolean()) - { - std::cout << "Boolean parameter. Creating checkbox." << std::endl; - - // create checkbox - ParameterCheckbox* pc = new ParameterCheckbox((bool) p.getDefaultValue()); - addAndMakeVisible(pc); - pc->setBounds(0,0,12, 12); - pc->setName(String(p.getID())); - checkboxArray.add(pc); - //buttonIdArray.add(p.getID()); - pc->addListener(this); - - Label* label = new Label(p.getName(), p.getName()); - labelFont.setHeight(10); - label->setColour(Label::textColourId, Colours::darkgrey); - label->setFont(labelFont); - label->setBounds(10, 1, 100, 10); - addAndMakeVisible(label); - - desiredWidth = 120; - desiredHeight = 25; - - } else if (p.isContinuous()) - { - std::cout << "Continuous parameter. Creating slider." << std::endl; - // create slider - Array<var> possibleValues = p.getPossibleValues(); - ParameterSlider* ps = new ParameterSlider((float) possibleValues[0], - (float) possibleValues[1], - (float) p.getDefaultValue(), - labelFont); - - ps->setBounds(0,0, 80, 80); - ps->setName(String(p.getID())); - addAndMakeVisible(ps); - sliderArray.add(ps); - //sliderIdArray.add(p.getID()); - ps->addListener(this); - - Label* label = new Label(p.getName(), p.getName()); - labelFont.setHeight(10); - int width = labelFont.getStringWidth(p.getName()); - label->setColour(Label::textColourId, Colours::darkgrey); - label->setFont(labelFont); - label->setBounds((80-width)/2-5, 70, 100, 10); - addAndMakeVisible(label); - - desiredWidth = 80; - desiredHeight = 80; - - } else if (p.isDiscrete()) - { - std::cout << "Discrete parameter. Creating buttons." << std::endl; - // create buttons - Label* label = new Label(p.getName(), p.getName()); - labelFont.setHeight(10); - label->setColour(Label::textColourId, Colours::darkgrey); - label->setFont(labelFont); - label->setBounds(0, 0, 100, 10); - addAndMakeVisible(label); - - Array<var> possibleValues = p.getPossibleValues(); - - int buttonWidth = 35; - - std::cout << "Button width: " << buttonWidth << std::endl; - - std::cout << "Default value: " << (int) p.getDefaultValue() << std::endl; - - int i; - - for (i = 0; i < possibleValues.size(); i++) - { - std::cout << "Creating button " << i << std::endl; - int buttonType = MIDDLE; - if (i == 0) - buttonType = LEFT; - else if (i == possibleValues.size()-1) - buttonType = RIGHT; - - ParameterButton* pb = new ParameterButton(possibleValues[i], buttonType, labelFont); - pb->setBounds(buttonWidth*i, 12, buttonWidth, 18); - pb->setName(String(p.getID())); - buttonArray.add(pb); - //buttonIdArray.add(p.getID()); - pb->addListener(this); - - if (i == (int) p.getDefaultValue()) - pb->setToggleState(true, false); - - addAndMakeVisible(pb); - - } - - desiredWidth = buttonWidth*i; - desiredHeight = 30; - } + activationState = true; + + processor = proc; + + shouldDeactivateDuringAcquisition = p.shouldDeactivateDuringAcquisition; + + if (p.isBoolean()) + { + std::cout << "Boolean parameter. Creating checkbox." << std::endl; + + // create checkbox + ParameterCheckbox* pc = new ParameterCheckbox((bool) p.getDefaultValue()); + addAndMakeVisible(pc); + pc->setBounds(0,0,12, 12); + pc->setName(String(p.getID())); + checkboxArray.add(pc); + //buttonIdArray.add(p.getID()); + pc->addListener(this); + + Label* label = new Label(p.getName(), p.getName()); + labelFont.setHeight(10); + label->setColour(Label::textColourId, Colours::darkgrey); + label->setFont(labelFont); + label->setBounds(10, 1, 100, 10); + addAndMakeVisible(label); + + desiredWidth = 120; + desiredHeight = 25; + + } + else if (p.isContinuous()) + { + std::cout << "Continuous parameter. Creating slider." << std::endl; + // create slider + Array<var> possibleValues = p.getPossibleValues(); + ParameterSlider* ps = new ParameterSlider((float) possibleValues[0], + (float) possibleValues[1], + (float) p.getDefaultValue(), + labelFont); + + ps->setBounds(0,0, 80, 80); + ps->setName(String(p.getID())); + addAndMakeVisible(ps); + sliderArray.add(ps); + //sliderIdArray.add(p.getID()); + ps->addListener(this); + + Label* label = new Label(p.getName(), p.getName()); + labelFont.setHeight(10); + int width = labelFont.getStringWidth(p.getName()); + label->setColour(Label::textColourId, Colours::darkgrey); + label->setFont(labelFont); + label->setBounds((80-width)/2-5, 70, 100, 10); + addAndMakeVisible(label); + + desiredWidth = 80; + desiredHeight = 80; + + } + else if (p.isDiscrete()) + { + std::cout << "Discrete parameter. Creating buttons." << std::endl; + // create buttons + Label* label = new Label(p.getName(), p.getName()); + labelFont.setHeight(10); + label->setColour(Label::textColourId, Colours::darkgrey); + label->setFont(labelFont); + label->setBounds(0, 0, 100, 10); + addAndMakeVisible(label); + + Array<var> possibleValues = p.getPossibleValues(); + + int buttonWidth = 35; + + std::cout << "Button width: " << buttonWidth << std::endl; + + std::cout << "Default value: " << (int) p.getDefaultValue() << std::endl; + + int i; + + for (i = 0; i < possibleValues.size(); i++) + { + std::cout << "Creating button " << i << std::endl; + int buttonType = MIDDLE; + if (i == 0) + buttonType = LEFT; + else if (i == possibleValues.size()-1) + buttonType = RIGHT; + + ParameterButton* pb = new ParameterButton(possibleValues[i], buttonType, labelFont); + pb->setBounds(buttonWidth*i, 12, buttonWidth, 18); + pb->setName(String(p.getID())); + buttonArray.add(pb); + //buttonIdArray.add(p.getID()); + pb->addListener(this); + + if (i == (int) p.getDefaultValue()) + pb->setToggleState(true, false); + + addAndMakeVisible(pb); + + } + + desiredWidth = buttonWidth*i; + desiredHeight = 30; + } } ParameterEditor::~ParameterEditor() { - deleteAllChildren(); + deleteAllChildren(); } void ParameterEditor::parentHierarchyChanged() { - // std::cout << "Parent hierarchy changed." << std::endl; + // std::cout << "Parent hierarchy changed." << std::endl; - // // register all children with parent --> not currently working - // if (getParentComponent() != 0) { + // // register all children with parent --> not currently working + // if (getParentComponent() != 0) { - // for (int i = 0; i < sliderArray.size(); i++) - // { - // sliderArray[i]->addListener((Slider::Listener*) getParentComponent()); - // } + // for (int i = 0; i < sliderArray.size(); i++) + // { + // sliderArray[i]->addListener((Slider::Listener*) getParentComponent()); + // } - // for (int i = 0; i < buttonArray.size(); i++) - // { - // buttonArray[i]->addListener((Button::Listener*) getParentComponent()); - // } - // } + // for (int i = 0; i < buttonArray.size(); i++) + // { + // buttonArray[i]->addListener((Button::Listener*) getParentComponent()); + // } + // } } void ParameterEditor::setEnabled(bool state) { - std::cout << "Changing editor state!" << std::endl; + std::cout << "Changing editor state!" << std::endl; - if (shouldDeactivateDuringAcquisition) - { + if (shouldDeactivateDuringAcquisition) + { - for (int i = 0; i < sliderArray.size(); i++) - { - sliderArray[i]->isEnabled = state; - sliderArray[i]->setInterceptsMouseClicks(state, state); - sliderArray[i]->repaint(); - } + for (int i = 0; i < sliderArray.size(); i++) + { + sliderArray[i]->isEnabled = state; + sliderArray[i]->setInterceptsMouseClicks(state, state); + sliderArray[i]->repaint(); + } - for (int i = 0; i < buttonArray.size(); i++) - { - buttonArray[i]->isEnabled = state; - buttonArray[i]->setInterceptsMouseClicks(state, state); - buttonArray[i]->repaint(); - } + for (int i = 0; i < buttonArray.size(); i++) + { + buttonArray[i]->isEnabled = state; + buttonArray[i]->setInterceptsMouseClicks(state, state); + buttonArray[i]->repaint(); + } - for (int i = 0; i < checkboxArray.size(); i++) - { - checkboxArray[i]->isEnabled = state; - checkboxArray[i]->setInterceptsMouseClicks(state, state); - checkboxArray[i]->repaint(); - } + for (int i = 0; i < checkboxArray.size(); i++) + { + checkboxArray[i]->isEnabled = state; + checkboxArray[i]->setInterceptsMouseClicks(state, state); + checkboxArray[i]->repaint(); + } - } + } } void ParameterEditor::buttonClicked(Button* button) { - std::cout << "Button name: " << button->getName() << std::endl; - std::cout << "Button value: " << button->getButtonText() << std::endl; - - ParameterButton* b = (ParameterButton*) button; - - if (b->isEnabled) - { - - Array<int> a = channelSelector->getActiveChannels(); - { - for (int i = 0; i < a.size(); i++) - { - //std::cout << a[i] << " "; - processor->setCurrentChannel(a[i]); - processor->setParameter(button->getName().getIntValue(), - button->getButtonText().getFloatValue()); - //processor-> - } - //std::cout << std::endl; - } - } - //processor->sliderValueChanged(slider); + std::cout << "Button name: " << button->getName() << std::endl; + std::cout << "Button value: " << button->getButtonText() << std::endl; + + ParameterButton* b = (ParameterButton*) button; + + if (b->isEnabled) + { + + Array<int> a = channelSelector->getActiveChannels(); + { + for (int i = 0; i < a.size(); i++) + { + //std::cout << a[i] << " "; + processor->setCurrentChannel(a[i]); + processor->setParameter(button->getName().getIntValue(), + button->getButtonText().getFloatValue()); + //processor-> + } + //std::cout << std::endl; + } + } + //processor->sliderValueChanged(slider); } @@ -221,26 +223,26 @@ void ParameterEditor::sliderValueChanged(Slider* slider) { - //std::cout << "Slider name: " << slider->getName() << std::endl; - //std::cout << "Slider value: " << slider->getValue() << std::endl; - - ParameterSlider* s = (ParameterSlider*) slider; - - if (s->isEnabled) - { - Array<int> a = channelSelector->getActiveChannels(); - { - for (int i = 0; i < a.size(); i++) - { - //std::cout << a[i] << " "; - processor->setCurrentChannel(a[i]); - processor->setParameter(slider->getName().getIntValue(), - slider->getValue()); - //processor-> - } - //std::cout << std::endl; - } - } + //std::cout << "Slider name: " << slider->getName() << std::endl; + //std::cout << "Slider value: " << slider->getValue() << std::endl; + + ParameterSlider* s = (ParameterSlider*) slider; + + if (s->isEnabled) + { + Array<int> a = channelSelector->getActiveChannels(); + { + for (int i = 0; i < a.size(); i++) + { + //std::cout << a[i] << " "; + processor->setCurrentChannel(a[i]); + processor->setParameter(slider->getName().getIntValue(), + slider->getValue()); + //processor-> + } + //std::cout << std::endl; + } + } } @@ -248,67 +250,69 @@ void ParameterEditor::sliderValueChanged(Slider* slider) /// ============= PARAMETER BUTTON ================== ParameterButton::ParameterButton(var value, int buttonType, Font labelFont) : - Button("parameter"), isEnabled(true), type(buttonType), - valueString(value.toString()), font(labelFont) + Button("parameter"), isEnabled(true), type(buttonType), + valueString(value.toString()), font(labelFont) { - setButtonText(valueString); - setRadioGroupId(1999); - setClickingTogglesState(true); + setButtonText(valueString); + setRadioGroupId(1999); + setClickingTogglesState(true); - selectedGrad = ColourGradient(Colour(240,179,12),0.0,0.0, - Colour(207,160,33),0.0, 20.0f, - false); + selectedGrad = ColourGradient(Colour(240,179,12),0.0,0.0, + Colour(207,160,33),0.0, 20.0f, + false); selectedOverGrad = ColourGradient(Colour(209,162,33),0.0, 5.0f, - Colour(190,150,25),0.0, 0.0f, - false); + Colour(190,150,25),0.0, 0.0f, + false); neutralGrad = ColourGradient(Colour(220,220,220),0.0,0.0, - Colour(170,170,170),0.0, 20.0f, - false); + Colour(170,170,170),0.0, 20.0f, + false); neutralOverGrad = ColourGradient(Colour(180,180,180),0.0,5.0f, - Colour(150,150,150),0.0, 0.0, - false); + Colour(150,150,150),0.0, 0.0, + false); deactivatedGrad = ColourGradient(Colour(120, 120, 120), 0.0, 5.0f, - Colour(100, 100, 100), 0.0, 0.0, - false); + Colour(100, 100, 100), 0.0, 0.0, + false); } void ParameterButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown) { - g.setColour(Colours::grey); - g.fillPath(outlinePath); + g.setColour(Colours::grey); + g.fillPath(outlinePath); - if (getToggleState()) - { - if (isMouseOver) - g.setGradientFill(selectedOverGrad); + if (getToggleState()) + { + if (isMouseOver) + g.setGradientFill(selectedOverGrad); else - g.setGradientFill(selectedGrad); - } else { - if (isMouseOver) - g.setGradientFill(neutralOverGrad); + g.setGradientFill(selectedGrad); + } + else + { + if (isMouseOver) + g.setGradientFill(neutralOverGrad); else - g.setGradientFill(neutralGrad); - } + g.setGradientFill(neutralGrad); + } - if (!isEnabled) - { - g.setGradientFill(deactivatedGrad); - } + if (!isEnabled) + { + g.setGradientFill(deactivatedGrad); + } - AffineTransform a = AffineTransform::scale(0.98f, 0.94f, float(getWidth())/2.0f, - float(getHeight())/2.0f); - g.fillPath(outlinePath, a); + AffineTransform a = AffineTransform::scale(0.98f, 0.94f, float(getWidth())/2.0f, + float(getHeight())/2.0f); + g.fillPath(outlinePath, a); - font.setHeight(12.0f); - int stringWidth = font.getStringWidth(valueString); + font.setHeight(12.0f); + int stringWidth = font.getStringWidth(valueString); - g.setFont(font); + g.setFont(font); - g.setColour(Colours::darkgrey); - g.drawSingleLineText(valueString, getWidth()/2 - stringWidth/2, 12); + g.setColour(Colours::darkgrey); + g.drawSingleLineText(valueString, getWidth()/2 - stringWidth/2, 12); }; @@ -316,41 +320,43 @@ void ParameterButton::resized() { - float radius = 5.0f; + float radius = 5.0f; - if (type == LEFT) - { - outlinePath.startNewSubPath(0, radius); - outlinePath.addArc(0, 0, radius*2, radius*2, 1.5*double_Pi, 2.0*double_Pi ); + if (type == LEFT) + { + outlinePath.startNewSubPath(0, radius); + outlinePath.addArc(0, 0, radius*2, radius*2, 1.5*double_Pi, 2.0*double_Pi); - outlinePath.lineTo(getWidth(), 0);//getHeight()); + outlinePath.lineTo(getWidth(), 0);//getHeight()); - outlinePath.lineTo(getWidth(), getHeight()); + outlinePath.lineTo(getWidth(), getHeight()); - outlinePath.lineTo(radius, getHeight()); - outlinePath.addArc(0, getHeight()-radius*2, radius*2, radius*2, double_Pi, 1.5*double_Pi); - outlinePath.closeSubPath(); + outlinePath.lineTo(radius, getHeight()); + outlinePath.addArc(0, getHeight()-radius*2, radius*2, radius*2, double_Pi, 1.5*double_Pi); + outlinePath.closeSubPath(); - } else if (type == RIGHT) - { - outlinePath.startNewSubPath(0, 0); + } + else if (type == RIGHT) + { + outlinePath.startNewSubPath(0, 0); - outlinePath.lineTo(getWidth()-radius, 0); - - outlinePath.addArc(getWidth()-radius*2, 0, radius*2, radius*2, 0, 0.5*double_Pi); + outlinePath.lineTo(getWidth()-radius, 0); - outlinePath.lineTo(getWidth(), getHeight()-radius); + outlinePath.addArc(getWidth()-radius*2, 0, radius*2, radius*2, 0, 0.5*double_Pi); - outlinePath.addArc(getWidth()-radius*2, getHeight()-radius*2, radius*2, radius*2, 0.5*double_Pi, double_Pi); + outlinePath.lineTo(getWidth(), getHeight()-radius); - outlinePath.lineTo(0, getHeight()); - outlinePath.closeSubPath(); + outlinePath.addArc(getWidth()-radius*2, getHeight()-radius*2, radius*2, radius*2, 0.5*double_Pi, double_Pi); + outlinePath.lineTo(0, getHeight()); + outlinePath.closeSubPath(); - } else if (type == MIDDLE) - { - outlinePath.addRectangle(0,0,getWidth(),getHeight()); - } + + } + else if (type == MIDDLE) + { + outlinePath.addRectangle(0,0,getWidth(),getHeight()); + } } @@ -359,64 +365,66 @@ void ParameterButton::resized() ParameterCheckbox::ParameterCheckbox(bool defaultState) : Button("name"), isEnabled(true) { - setToggleState(defaultState, false); - setClickingTogglesState(true); + setToggleState(defaultState, false); + setClickingTogglesState(true); - selectedGrad = ColourGradient(Colour(240,179,12),0.0,0.0, - Colour(207,160,33),0.0, 20.0f, - true); + selectedGrad = ColourGradient(Colour(240,179,12),0.0,0.0, + Colour(207,160,33),0.0, 20.0f, + true); selectedOverGrad = ColourGradient(Colour(209,162,33),0.0, 5.0f, - Colour(190,150,25),0.0, 0.0f, - true); + Colour(190,150,25),0.0, 0.0f, + true); neutralGrad = ColourGradient(Colour(220,220,220),0.0,0.0, - Colour(170,170,170),0.0, 20.0f, - true); + Colour(170,170,170),0.0, 20.0f, + true); neutralOverGrad = ColourGradient(Colour(180,180,180),0.0,5.0f, - Colour(150,150,150),0.0, 0.0, - true); + Colour(150,150,150),0.0, 0.0, + true); deactivatedGrad = ColourGradient(Colour(120, 120, 120), 0.0, 5.0f, - Colour(100, 100, 100), 0.0, 0.0, - false); + Colour(100, 100, 100), 0.0, 0.0, + false); } void ParameterCheckbox::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown) { - g.setColour(Colours::grey); - g.fillRoundedRectangle(0, 0, getWidth(), getHeight(), 2.0f); + g.setColour(Colours::grey); + g.fillRoundedRectangle(0, 0, getWidth(), getHeight(), 2.0f); - if (getToggleState()) - { - if (isMouseOver) - g.setGradientFill(selectedOverGrad); + if (getToggleState()) + { + if (isMouseOver) + g.setGradientFill(selectedOverGrad); else - g.setGradientFill(selectedGrad); - } else { - if (isMouseOver) - g.setGradientFill(neutralOverGrad); + g.setGradientFill(selectedGrad); + } + else + { + if (isMouseOver) + g.setGradientFill(neutralOverGrad); else - g.setGradientFill(neutralGrad); - } + g.setGradientFill(neutralGrad); + } + + if (!isEnabled) + { + g.setGradientFill(deactivatedGrad); + } - if (!isEnabled) - { - g.setGradientFill(deactivatedGrad); - } + AffineTransform a = AffineTransform::scale(0.98f, 0.94f, float(getWidth())/2.0f, + float(getHeight())/2.0f); - AffineTransform a = AffineTransform::scale(0.98f, 0.94f, float(getWidth())/2.0f, - float(getHeight())/2.0f); - - g.fillRoundedRectangle(1, 1, getWidth()-2, getHeight()-2, 2.0f); + g.fillRoundedRectangle(1, 1, getWidth()-2, getHeight()-2, 2.0f); } // ========== PARAMETER SLIDER ==================== ParameterSlider::ParameterSlider(float min, float max, float def, Font labelFont) : - Slider("name"), isEnabled(true), font(labelFont) + Slider("name"), isEnabled(true), font(labelFont) { - setSliderStyle(Slider::Rotary); + setSliderStyle(Slider::Rotary); setRange(min,max,1.0f); setValue(def); setTextBoxStyle(Slider::NoTextBox, false, 40, 20); @@ -426,59 +434,59 @@ ParameterSlider::ParameterSlider(float min, float max, float def, Font labelFont void ParameterSlider::paint(Graphics& g) { - ColourGradient grad = ColourGradient(Colour(40, 40, 40), 0.0f, 0.0f, - - Colour(80, 80, 80), 0.0, 40.0f, false); + ColourGradient grad = ColourGradient(Colour(40, 40, 40), 0.0f, 0.0f, + + Colour(80, 80, 80), 0.0, 40.0f, false); + + Path p; + p.addPieSegment(3, 3, getWidth()-6, getHeight()-6, 5*double_Pi/4-0.2, 5*double_Pi/4+3*double_Pi/2+0.2, 0.5); - Path p; - p.addPieSegment(3, 3, getWidth()-6, getHeight()-6, 5*double_Pi/4-0.2, 5*double_Pi/4+3*double_Pi/2+0.2, 0.5); + g.setGradientFill(grad); + g.fillPath(p); + //g.fillEllipse(3, 3, getWidth()-6, getHeight()-6); - g.setGradientFill(grad); - g.fillPath(p); - //g.fillEllipse(3, 3, getWidth()-6, getHeight()-6); + //g.setColour(Colours::lightgrey); + //g.fillEllipse(12, 12, getWidth()-24, getHeight()-24); - //g.setColour(Colours::lightgrey); - //g.fillEllipse(12, 12, getWidth()-24, getHeight()-24); + p = makeRotaryPath(getMinimum(), getMaximum(), getValue()); - p = makeRotaryPath(getMinimum(), getMaximum(), getValue()); + if (isEnabled) + g.setColour(Colour(240,179,12)); + else + g.setColour(Colour(75,75,75)); - if (isEnabled) - g.setColour(Colour(240,179,12)); - else - g.setColour(Colour(75,75,75)); + g.fillPath(p); - g.fillPath(p); - - //g.setColour(Colours::darkgrey); - font.setHeight(9.0); - g.setFont(font); + //g.setColour(Colours::darkgrey); + font.setHeight(9.0); + g.setFont(font); - String valueString = String( (int) getValue()); + String valueString = String((int) getValue()); - int stringWidth = font.getStringWidth(valueString); + int stringWidth = font.getStringWidth(valueString); - g.setFont(font); + g.setFont(font); - g.setColour(Colours::darkgrey); - g.drawSingleLineText(valueString, getWidth()/2 - stringWidth/2, getHeight()/2+3); + g.setColour(Colours::darkgrey); + g.drawSingleLineText(valueString, getWidth()/2 - stringWidth/2, getHeight()/2+3); } Path ParameterSlider::makeRotaryPath(double min, double max, double val) { - Path p; + Path p; - double start = 5*double_Pi/4 - 0.11; + double start = 5*double_Pi/4 - 0.11; - double range = (val-min)/(max - min)*1.5*double_Pi + start + 0.22; + double range = (val-min)/(max - min)*1.5*double_Pi + start + 0.22; - p.addPieSegment(6,6, getWidth()-12, getHeight()-12, start, range, 0.65); + p.addPieSegment(6,6, getWidth()-12, getHeight()-12, start, range, 0.65); - // p.startNewSubPath(5, getHeight()-5); - // p.addArc(5, 5, getWidth()-10, getWidth()-10, 5/4*double_Pi, range); - // //p.addArc(getWidth()-5, getHeight()-5, getWidth()-16, getWidth()-16, 5/4*double_Pi, range); - // p.closeSubPath(); + // p.startNewSubPath(5, getHeight()-5); + // p.addArc(5, 5, getWidth()-10, getWidth()-10, 5/4*double_Pi, range); + // //p.addArc(getWidth()-5, getHeight()-5, getWidth()-16, getWidth()-16, 5/4*double_Pi, range); + // p.closeSubPath(); - return p; + return p; } diff --git a/Source/Processors/Editors/ParameterEditor.h b/Source/Processors/Editors/ParameterEditor.h index e4ef4211a1e313f5674f4d3b276948d0b8eb39cf..808945b9a438e6a12ebb94355ff74f8689befb5f 100755 --- a/Source/Processors/Editors/ParameterEditor.h +++ b/Source/Processors/Editors/ParameterEditor.h @@ -24,9 +24,6 @@ #ifndef __PARAMETEREDITOR_H_44537DA9__ #define __PARAMETEREDITOR_H_44537DA9__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "../GenericProcessor.h" #include "ChannelSelector.h" @@ -38,7 +35,7 @@ class ParameterSlider; class ParameterCheckbox; /** - + Automatically creates an interactive editor for a particular parameter. @@ -47,13 +44,13 @@ class ParameterCheckbox; */ class ParameterEditor : public Component, - public Button::Listener, - public Slider::Listener + public Button::Listener, + public Slider::Listener { public: - ParameterEditor(GenericProcessor* proc, Parameter& p, Font labelFont); - ~ParameterEditor(); + ParameterEditor(GenericProcessor* proc, Parameter& p, Font labelFont); + ~ParameterEditor(); int desiredWidth; @@ -66,7 +63,7 @@ public: void setChannelSelector(ChannelSelector* ch) { - channelSelector = ch; + channelSelector = ch; } // for inactivation during acquisition: @@ -76,21 +73,22 @@ public: private: - Array<ParameterSlider*> sliderArray; - Array<ParameterButton*> buttonArray; + Array<ParameterSlider*> sliderArray; + Array<ParameterButton*> buttonArray; Array<ParameterCheckbox*> checkboxArray; - Array<int> buttonIdArray; - Array<int> sliderIdArray; + Array<int> buttonIdArray; + Array<int> sliderIdArray; Array<int> checkboxIdArray; - GenericProcessor* processor; - ChannelSelector* channelSelector; + GenericProcessor* processor; + ChannelSelector* channelSelector; - enum { - LEFT, - MIDDLE, - RIGHT - }; + enum + { + LEFT, + MIDDLE, + RIGHT + }; }; @@ -111,7 +109,7 @@ public: private: void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); - + void resized(); int type; @@ -128,11 +126,12 @@ private: ColourGradient neutralOverGrad; ColourGradient deactivatedGrad; - enum { - LEFT, - MIDDLE, - RIGHT - }; + enum + { + LEFT, + MIDDLE, + RIGHT + }; }; @@ -153,7 +152,7 @@ public: private: void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); - + ColourGradient selectedGrad; ColourGradient selectedOverGrad; ColourGradient neutralGrad; @@ -178,7 +177,7 @@ public: private: void paint(Graphics& g);//Button(Graphics& g, bool isMouseOver, bool isButtonDown); - + Path makeRotaryPath(double, double, double); Font font; diff --git a/Source/Processors/Editors/RHD2000Editor.cpp b/Source/Processors/Editors/RHD2000Editor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..159e04001115c5fbde164099e87a08d2e3e20e6d --- /dev/null +++ b/Source/Processors/Editors/RHD2000Editor.cpp @@ -0,0 +1,94 @@ +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Open Ephys + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +*/ + +#include "RHD2000Editor.h" + +RHD2000Editor::RHD2000Editor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) +{ + desiredWidth = 400; + + for (int i = 0; i < 4; i++) + { + HeadstageOptionsInterface* hsOptions = new HeadstageOptionsInterface(i); + headstageOptionsInterfaces.add(hsOptions); + + addAndMakeVisible(hsOptions); + } + +} + +RHD2000Editor::~RHD2000Editor() +{ + +} + +void RHD2000Editor::resized() +{ + + int width = getWidth()/4 - 20; + + for (int i = 0; i < headstageOptionsInterfaces.size(); i++) + { + headstageOptionsInterfaces[i]->setBounds(10+i*width,30, width,getHeight()-50); + } +} + +// -------------------------------------------------------------------- + +HeadstageOptionsInterface::HeadstageOptionsInterface(int hsNum) : + hsNumber(hsNum) +{ + + switch (hsNumber) + { + case 0 : + name = "A"; + break; + case 1: + name = "B"; + break; + case 2: + name = "C"; + break; + case 3: + name = "D"; + break; + default: + name = "X"; + } + +} + +HeadstageOptionsInterface::~HeadstageOptionsInterface() +{ + +} + +void HeadstageOptionsInterface::paint(Graphics& g) +{ + g.setColour(Colours::lightgrey); + + g.fillRoundedRectangle(5,0,getWidth()-10,getHeight(),4.0f); + +} \ No newline at end of file diff --git a/Source/Processors/Editors/RHD2000Editor.h b/Source/Processors/Editors/RHD2000Editor.h new file mode 100644 index 0000000000000000000000000000000000000000..b6140c1c8f7f17900e78ada32edcbe38520f5d7e --- /dev/null +++ b/Source/Processors/Editors/RHD2000Editor.h @@ -0,0 +1,76 @@ +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Open Ephys + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +*/ + +#ifndef __RHD2000EDITOR_H_2AD3C591__ +#define __RHD2000EDITOR_H_2AD3C591__ + +#include "../../../JuceLibraryCode/JuceHeader.h" +#include "GenericEditor.h" + +/** + + User interface for the RHD2000 source module. + + @see SourceNode + +*/ + +class HeadstageOptionsInterface; + + +class RHD2000Editor : public GenericEditor + +{ +public: + RHD2000Editor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + ~RHD2000Editor(); + + void resized(); + +private: + + OwnedArray<HeadstageOptionsInterface> headstageOptionsInterfaces; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RHD2000Editor); + +}; + + +class HeadstageOptionsInterface : public Component +{ +public: + HeadstageOptionsInterface(int hsNum); + ~HeadstageOptionsInterface(); + + void paint(Graphics& g); + +private: + + int hsNumber; + String name; + +}; + + + +#endif // __RHD2000EDITOR_H_2AD3C591__ diff --git a/Source/Processors/Editors/RecordControlEditor.cpp b/Source/Processors/Editors/RecordControlEditor.cpp index 87b055e677217f6e47b9a0ac737b9e92d29425b2..d374e773994b4cdfdc0456cc2b476e973e030d39 100644 --- a/Source/Processors/Editors/RecordControlEditor.cpp +++ b/Source/Processors/Editors/RecordControlEditor.cpp @@ -26,53 +26,53 @@ #include "ChannelSelector.h" #include <stdio.h> -RecordControlEditor::RecordControlEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors) +RecordControlEditor::RecordControlEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) { - desiredWidth = 170; + desiredWidth = 170; - channelSelector->eventsOnly = true; + channelSelector->eventsOnly = true; - chanSel = new Label("Chanel Text","Available Event Channels"); - chanSel->setEditable(false); - chanSel->setJustificationType(Justification::centredLeft); - chanSel->setBounds(20,30,120,20); + chanSel = new Label("Chanel Text","Available Event Channels"); + chanSel->setEditable(false); + chanSel->setJustificationType(Justification::centredLeft); + chanSel->setBounds(20,30,120,20); - addAndMakeVisible(chanSel); + addAndMakeVisible(chanSel); - - availableChans = new ComboBox("Event Channels"); - availableChans->setEditableText(false); - availableChans->setJustificationType(Justification::centredLeft); - availableChans->addListener(this); - availableChans->setBounds(20,60,120,20); - availableChans->setSelectedId(0); + availableChans = new ComboBox("Event Channels"); + + availableChans->setEditableText(false); + availableChans->setJustificationType(Justification::centredLeft); + availableChans->addListener(this); + availableChans->setBounds(20,60,120,20); + availableChans->setSelectedId(0); + + addAndMakeVisible(availableChans); - addAndMakeVisible(availableChans); - } RecordControlEditor::~RecordControlEditor() { - deleteAllChildren(); + deleteAllChildren(); } void RecordControlEditor::comboBoxChanged(ComboBox* comboBox) { - RecordControl *processor = (RecordControl*)getProcessor(); - if (comboBox->getSelectedId() > 0) - processor->updateTriggerChannel(processor->eventChannels[comboBox->getSelectedId()-1]->num ); - else - processor->updateTriggerChannel(-1); + RecordControl* processor = (RecordControl*)getProcessor(); + if (comboBox->getSelectedId() > 0) + processor->updateTriggerChannel(processor->eventChannels[comboBox->getSelectedId()-1]->num); + else + processor->updateTriggerChannel(-1); } void RecordControlEditor::updateSettings() { - availableChans->clear(); - GenericProcessor* processor = getProcessor(); - for (int i = 0; i < processor->eventChannels.size() ; i++) - availableChans->addItem(processor->eventChannels[i]->name,i+1); + availableChans->clear(); + GenericProcessor* processor = getProcessor(); + for (int i = 0; i < processor->eventChannels.size() ; i++) + availableChans->addItem(processor->eventChannels[i]->name,i+1); } \ No newline at end of file diff --git a/Source/Processors/Editors/RecordControlEditor.h b/Source/Processors/Editors/RecordControlEditor.h index ff40e8a3fb6fb9adb62fb261403bed013bb9765b..fd750ee8b1e9767bdc7792235d89682fb92a8aca 100644 --- a/Source/Processors/Editors/RecordControlEditor.h +++ b/Source/Processors/Editors/RecordControlEditor.h @@ -24,9 +24,6 @@ #ifndef __RECORDCONTROLEDITOR_H_F9C69E2B__ #define __RECORDCONTROLEDITOR_H_F9C69E2B__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" @@ -39,20 +36,20 @@ */ class RecordControlEditor : public GenericEditor, - public ComboBox::Listener + public ComboBox::Listener { public: - RecordControlEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors); - ~RecordControlEditor(); - void comboBoxChanged(ComboBox* comboBox); - void updateSettings(); + RecordControlEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + ~RecordControlEditor(); + void comboBoxChanged(ComboBox* comboBox); + void updateSettings(); private: - ComboBox* availableChans; - Label *chanSel; + ComboBox* availableChans; + Label* chanSel; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RecordControlEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordControlEditor); }; diff --git a/Source/Processors/Editors/ReferenceNodeEditor.cpp b/Source/Processors/Editors/ReferenceNodeEditor.cpp index e8f4dccd134083c96dd52995ecec1c6bf4b3d9fe..0881fb3974df46269d74a500e5fa61ee4cbfd273 100644 --- a/Source/Processors/Editors/ReferenceNodeEditor.cpp +++ b/Source/Processors/Editors/ReferenceNodeEditor.cpp @@ -27,22 +27,22 @@ #include <stdio.h> -ReferenceNodeEditor::ReferenceNodeEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors) +ReferenceNodeEditor::ReferenceNodeEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) { - desiredWidth = 180; + desiredWidth = 180; } ReferenceNodeEditor::~ReferenceNodeEditor() { - deleteAllChildren(); + deleteAllChildren(); } -void ReferenceNodeEditor::buttonEvent (Button* button) +void ReferenceNodeEditor::buttonEvent(Button* button) { - + } \ No newline at end of file diff --git a/Source/Processors/Editors/ReferenceNodeEditor.h b/Source/Processors/Editors/ReferenceNodeEditor.h index ae0ed642660c4853179b21694e49917ecb6d60ad..e0d6e8ee717baa3c7ff6dd31b47d5c11d8385ef9 100644 --- a/Source/Processors/Editors/ReferenceNodeEditor.h +++ b/Source/Processors/Editors/ReferenceNodeEditor.h @@ -24,9 +24,6 @@ #ifndef __REFERENCENODEEDITOR_H_370C056D__ #define __REFERENCENODEEDITOR_H_370C056D__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" @@ -41,13 +38,13 @@ class ReferenceNodeEditor : public GenericEditor { public: - ReferenceNodeEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors); - virtual ~ReferenceNodeEditor(); - void buttonEvent(Button* button); + ReferenceNodeEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + virtual ~ReferenceNodeEditor(); + void buttonEvent(Button* button); -private: +private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ReferenceNodeEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ReferenceNodeEditor); }; diff --git a/Source/Processors/Editors/ResamplingNodeEditor.cpp b/Source/Processors/Editors/ResamplingNodeEditor.cpp index 51a9011e7edb9ce97502a640938063a13c3a24c6..f18846b7ded9387c74f10192dad777be1d464d30 100644 --- a/Source/Processors/Editors/ResamplingNodeEditor.cpp +++ b/Source/Processors/Editors/ResamplingNodeEditor.cpp @@ -26,15 +26,15 @@ #include <stdio.h> -ResamplingNodeEditor::ResamplingNodeEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors) +ResamplingNodeEditor::ResamplingNodeEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) { - desiredWidth = 180; + desiredWidth = 180; } ResamplingNodeEditor::~ResamplingNodeEditor() { - deleteAllChildren(); + deleteAllChildren(); } \ No newline at end of file diff --git a/Source/Processors/Editors/ResamplingNodeEditor.h b/Source/Processors/Editors/ResamplingNodeEditor.h index 259e93214f2096f526fa1123cf81dbfd6a95ac54..58878b2ec85843c495524dd16e95c3cd2e192d22 100644 --- a/Source/Processors/Editors/ResamplingNodeEditor.h +++ b/Source/Processors/Editors/ResamplingNodeEditor.h @@ -25,14 +25,11 @@ #define __RESAMPLINGNODEEDITOR_H_B7FD956A__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" /** - + User interface for the ResamplingNode processor. @see ResamplingNode @@ -42,15 +39,15 @@ class ResamplingNodeEditor : public GenericEditor { public: - ResamplingNodeEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors); - virtual ~ResamplingNodeEditor(); + ResamplingNodeEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + virtual ~ResamplingNodeEditor(); - void startAcquisition(); - void stopAcquisition(); + void startAcquisition(); + void stopAcquisition(); -private: +private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ResamplingNodeEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ResamplingNodeEditor); }; diff --git a/Source/Processors/Editors/SignalGeneratorEditor.cpp b/Source/Processors/Editors/SignalGeneratorEditor.cpp index 4450de7649936025f7a3bd4f843abefecdbbd0cc..9a05f8c842c821f25c5b37e90c5a2d9f0e5d976b 100755 --- a/Source/Processors/Editors/SignalGeneratorEditor.cpp +++ b/Source/Processors/Editors/SignalGeneratorEditor.cpp @@ -28,51 +28,51 @@ #include <stdio.h> -SignalGeneratorEditor::SignalGeneratorEditor (GenericProcessor* parentNode, bool useDefaultParameters=false) - : GenericEditor(parentNode, useDefaultParameters), amplitudeSlider(0), frequencySlider(0), phaseSlider(0) +SignalGeneratorEditor::SignalGeneratorEditor(GenericProcessor* parentNode, bool useDefaultParameters=false) + : GenericEditor(parentNode, useDefaultParameters), amplitudeSlider(0), frequencySlider(0), phaseSlider(0) { - desiredWidth = 250; - - int buttonWidth = 31; - int buttonHeight = 19; - - for (int i = 0; i < 5; i++) - { - WaveformSelector* ws = new WaveformSelector(i); - ws->setBounds(8 + (buttonWidth)*i, 30, buttonWidth, buttonHeight); - ws->addListener(this); - waveformSelectors.add(ws); - addAndMakeVisible(ws); - } - - amplitudeSlider = new Slider ("Amplitude Slider"); - amplitudeSlider->setBounds(10,60,50,60); - amplitudeSlider->setRange(0,1,0.1); - amplitudeSlider->addListener(this); - amplitudeSlider->setSliderStyle(Slider::Rotary); - amplitudeSlider->setTextBoxStyle(Slider::TextBoxBelow, false, 40, 20); - amplitudeSlider->setValue(0.5); - addAndMakeVisible(amplitudeSlider); - - frequencySlider = new Slider ("Frequency Slider"); - frequencySlider->setBounds(70,60,50,60); - frequencySlider->setRange(10,1000,10); - frequencySlider->addListener(this); - frequencySlider->setSliderStyle(Slider::Rotary); - frequencySlider->setTextBoxStyle(Slider::TextBoxBelow, false, 40, 20); - frequencySlider->setValue(1000); - addAndMakeVisible(frequencySlider); - - phaseSlider = new Slider ("Phase Slider"); - phaseSlider->setBounds(130,60,50,60); - phaseSlider->setRange(0, 360, 1); - phaseSlider->addListener(this); - phaseSlider->setSliderStyle(Slider::Rotary); - phaseSlider->setTextBoxStyle(Slider::TextBoxBelow, false, 40, 20); - addAndMakeVisible(phaseSlider); - - numChannelsLabel = new Label("Number of Channels","5"); + desiredWidth = 250; + + int buttonWidth = 31; + int buttonHeight = 19; + + for (int i = 0; i < 5; i++) + { + WaveformSelector* ws = new WaveformSelector(i); + ws->setBounds(8 + (buttonWidth)*i, 30, buttonWidth, buttonHeight); + ws->addListener(this); + waveformSelectors.add(ws); + addAndMakeVisible(ws); + } + + amplitudeSlider = new Slider("Amplitude Slider"); + amplitudeSlider->setBounds(10,60,50,60); + amplitudeSlider->setRange(0,1,0.1); + amplitudeSlider->addListener(this); + amplitudeSlider->setSliderStyle(Slider::Rotary); + amplitudeSlider->setTextBoxStyle(Slider::TextBoxBelow, false, 40, 20); + amplitudeSlider->setValue(0.5); + addAndMakeVisible(amplitudeSlider); + + frequencySlider = new Slider("Frequency Slider"); + frequencySlider->setBounds(70,60,50,60); + frequencySlider->setRange(10,1000,10); + frequencySlider->addListener(this); + frequencySlider->setSliderStyle(Slider::Rotary); + frequencySlider->setTextBoxStyle(Slider::TextBoxBelow, false, 40, 20); + frequencySlider->setValue(1000); + addAndMakeVisible(frequencySlider); + + phaseSlider = new Slider("Phase Slider"); + phaseSlider->setBounds(130,60,50,60); + phaseSlider->setRange(0, 360, 1); + phaseSlider->addListener(this); + phaseSlider->setSliderStyle(Slider::Rotary); + phaseSlider->setTextBoxStyle(Slider::TextBoxBelow, false, 40, 20); + addAndMakeVisible(phaseSlider); + + numChannelsLabel = new Label("Number of Channels","5"); numChannelsLabel->setEditable(true); numChannelsLabel->addListener(this); numChannelsLabel->setBounds(200,50,25,20); @@ -92,20 +92,20 @@ SignalGeneratorEditor::SignalGeneratorEditor (GenericProcessor* parentNode, bool SignalGeneratorEditor::~SignalGeneratorEditor() { - deleteAllChildren(); + deleteAllChildren(); } // void SignalGeneratorEditor::sliderValueChanged (Slider* slider) // { // // Array<int> chans = getActiveChannels(); - + // // //std::cout << chans.size() << " channels selected." << std::endl; // // GenericProcessor* p = (GenericProcessor*) getAudioProcessor(); // // for (int n = 0; n < chans.size(); n++) { - + // // p->setCurrentChannel(chans[n]); // // if (slider == amplitudeSlider) @@ -120,36 +120,38 @@ SignalGeneratorEditor::~SignalGeneratorEditor() // } -void SignalGeneratorEditor::buttonEvent (Button* button) +void SignalGeneratorEditor::buttonEvent(Button* button) { - for (int i = 0; i < waveformSelectors.size(); i++) - { - if (button == waveformSelectors[i]) - { + for (int i = 0; i < waveformSelectors.size(); i++) + { + if (button == waveformSelectors[i]) + { - Array<int> chans = getActiveChannels(); - - GenericProcessor* p = getProcessor(); + Array<int> chans = getActiveChannels(); - for (int n = 0; n < chans.size(); n++) { - - p->setCurrentChannel(chans[n]); - p->setParameter(3,(float) i); + GenericProcessor* p = getProcessor(); - } + for (int n = 0; n < chans.size(); n++) + { + p->setCurrentChannel(chans[n]); + p->setParameter(3,(float) i); - } - } + } - int num = numChannelsLabel->getText().getIntValue(); + + } + } + + int num = numChannelsLabel->getText().getIntValue(); if (button == upButton) { numChannelsLabel->setText(String(++num), true); - } else if (button == downButton) + } + else if (button == downButton) { if (num > 1) @@ -161,126 +163,136 @@ void SignalGeneratorEditor::buttonEvent (Button* button) void SignalGeneratorEditor::sliderEvent(Slider* slider) { - int paramIndex; + int paramIndex; - if (slider == amplitudeSlider) - { - paramIndex = 0; - } else if (slider == frequencySlider) - { - paramIndex = 1; - } else if (slider == phaseSlider) - { - paramIndex = 2; - } + if (slider == amplitudeSlider) + { + paramIndex = 0; + } + else if (slider == frequencySlider) + { + paramIndex = 1; + } + else if (slider == phaseSlider) + { + paramIndex = 2; + } - GenericProcessor* p = getProcessor(); + GenericProcessor* p = getProcessor(); - Array<int> chans = getActiveChannels(); + Array<int> chans = getActiveChannels(); - for (int n = 0; n < chans.size(); n++) { + for (int n = 0; n < chans.size(); n++) + { - p->setCurrentChannel(chans[n]); - p->setParameter(paramIndex, slider->getValue()); + p->setCurrentChannel(chans[n]); + p->setParameter(paramIndex, slider->getValue()); - } + } } -void SignalGeneratorEditor::labelTextChanged (Label* label) +void SignalGeneratorEditor::labelTextChanged(Label* label) { - SignalGenerator* sg = (SignalGenerator*) getProcessor(); - sg->nOut = numChannelsLabel->getText().getIntValue(); - getEditorViewport()->makeEditorVisible(this); + SignalGenerator* sg = (SignalGenerator*) getProcessor(); + sg->nOut = numChannelsLabel->getText().getIntValue(); + getEditorViewport()->makeEditorVisible(this); } WaveformSelector::WaveformSelector(int type) : Button("Waveform") { - setRadioGroupId(299); - setClickingTogglesState(true); - - if (type == 0) { - selected = ImageCache::getFromMemory (BinaryData::RadioButtons_selected01_png, - BinaryData::RadioButtons_selected01_pngSize); - selectedOver= ImageCache::getFromMemory (BinaryData::RadioButtons_selected_over01_png, - BinaryData::RadioButtons_selected_over01_pngSize); - neutral = ImageCache::getFromMemory (BinaryData::RadioButtons_neutral01_png, - BinaryData::RadioButtons_neutral01_pngSize); - neutralOver = ImageCache::getFromMemory (BinaryData::RadioButtons01_png, - BinaryData::RadioButtons01_pngSize); - } - else if (type == 1) { - selected = ImageCache::getFromMemory (BinaryData::RadioButtons_selected02_png, - BinaryData::RadioButtons_selected02_pngSize); - selectedOver= ImageCache::getFromMemory (BinaryData::RadioButtons_selected_over02_png, - BinaryData::RadioButtons_selected_over02_pngSize); - neutral = ImageCache::getFromMemory (BinaryData::RadioButtons_neutral02_png, - BinaryData::RadioButtons_neutral02_pngSize); - neutralOver = ImageCache::getFromMemory (BinaryData::RadioButtons02_png, - BinaryData::RadioButtons02_pngSize); - } - else if (type == 2) { - selected = ImageCache::getFromMemory (BinaryData::RadioButtons_selected03_png, - BinaryData::RadioButtons_selected03_pngSize); - selectedOver= ImageCache::getFromMemory (BinaryData::RadioButtons_selected_over03_png, - BinaryData::RadioButtons_selected_over03_pngSize); - neutral = ImageCache::getFromMemory (BinaryData::RadioButtons_neutral03_png, - BinaryData::RadioButtons_neutral03_pngSize); - neutralOver = ImageCache::getFromMemory (BinaryData::RadioButtons03_png, - BinaryData::RadioButtons03_pngSize); - } - else if (type == 3) { - selected = ImageCache::getFromMemory (BinaryData::RadioButtons_selected04_png, - BinaryData::RadioButtons_selected04_pngSize); - selectedOver= ImageCache::getFromMemory (BinaryData::RadioButtons_selected_over04_png, - BinaryData::RadioButtons_selected_over04_pngSize); - neutral = ImageCache::getFromMemory (BinaryData::RadioButtons_neutral04_png, - BinaryData::RadioButtons_neutral04_pngSize); - neutralOver = ImageCache::getFromMemory (BinaryData::RadioButtons04_png, - BinaryData::RadioButtons04_pngSize); - } - else if (type == 4) { - selected = ImageCache::getFromMemory (BinaryData::RadioButtons_selected05_png, - BinaryData::RadioButtons_selected05_pngSize); - selectedOver= ImageCache::getFromMemory (BinaryData::RadioButtons_selected_over05_png, - BinaryData::RadioButtons_selected_over05_pngSize); - neutral = ImageCache::getFromMemory (BinaryData::RadioButtons_neutral05_png, - BinaryData::RadioButtons_neutral05_pngSize); - neutralOver = ImageCache::getFromMemory (BinaryData::RadioButtons05_png, - BinaryData::RadioButtons05_pngSize); - } - // else if (type == 5) { - // selected = ImageCache::getFromMemory (BinaryData::RadioButtons_selected05_png, - // BinaryData::RadioButtons_selected05_pngSize); - // selectedOver= ImageCache::getFromMemory (BinaryData::RadioButtons_selected_over05_png, - // BinaryData::RadioButtons_selected_over05_pngSize); - // neutral = ImageCache::getFromMemory (BinaryData::RadioButtons_neutral05_png, - // BinaryData::RadioButtons_neutral05_pngSize); - // neutralOver = ImageCache::getFromMemory (BinaryData::RadioButtons05_png, - // BinaryData::RadioButtons05_pngSize); - // } + setRadioGroupId(299); + setClickingTogglesState(true); + + if (type == 0) + { + selected = ImageCache::getFromMemory(BinaryData::RadioButtons_selected01_png, + BinaryData::RadioButtons_selected01_pngSize); + selectedOver= ImageCache::getFromMemory(BinaryData::RadioButtons_selected_over01_png, + BinaryData::RadioButtons_selected_over01_pngSize); + neutral = ImageCache::getFromMemory(BinaryData::RadioButtons_neutral01_png, + BinaryData::RadioButtons_neutral01_pngSize); + neutralOver = ImageCache::getFromMemory(BinaryData::RadioButtons01_png, + BinaryData::RadioButtons01_pngSize); + } + else if (type == 1) + { + selected = ImageCache::getFromMemory(BinaryData::RadioButtons_selected02_png, + BinaryData::RadioButtons_selected02_pngSize); + selectedOver= ImageCache::getFromMemory(BinaryData::RadioButtons_selected_over02_png, + BinaryData::RadioButtons_selected_over02_pngSize); + neutral = ImageCache::getFromMemory(BinaryData::RadioButtons_neutral02_png, + BinaryData::RadioButtons_neutral02_pngSize); + neutralOver = ImageCache::getFromMemory(BinaryData::RadioButtons02_png, + BinaryData::RadioButtons02_pngSize); + } + else if (type == 2) + { + selected = ImageCache::getFromMemory(BinaryData::RadioButtons_selected03_png, + BinaryData::RadioButtons_selected03_pngSize); + selectedOver= ImageCache::getFromMemory(BinaryData::RadioButtons_selected_over03_png, + BinaryData::RadioButtons_selected_over03_pngSize); + neutral = ImageCache::getFromMemory(BinaryData::RadioButtons_neutral03_png, + BinaryData::RadioButtons_neutral03_pngSize); + neutralOver = ImageCache::getFromMemory(BinaryData::RadioButtons03_png, + BinaryData::RadioButtons03_pngSize); + } + else if (type == 3) + { + selected = ImageCache::getFromMemory(BinaryData::RadioButtons_selected04_png, + BinaryData::RadioButtons_selected04_pngSize); + selectedOver= ImageCache::getFromMemory(BinaryData::RadioButtons_selected_over04_png, + BinaryData::RadioButtons_selected_over04_pngSize); + neutral = ImageCache::getFromMemory(BinaryData::RadioButtons_neutral04_png, + BinaryData::RadioButtons_neutral04_pngSize); + neutralOver = ImageCache::getFromMemory(BinaryData::RadioButtons04_png, + BinaryData::RadioButtons04_pngSize); + } + else if (type == 4) + { + selected = ImageCache::getFromMemory(BinaryData::RadioButtons_selected05_png, + BinaryData::RadioButtons_selected05_pngSize); + selectedOver= ImageCache::getFromMemory(BinaryData::RadioButtons_selected_over05_png, + BinaryData::RadioButtons_selected_over05_pngSize); + neutral = ImageCache::getFromMemory(BinaryData::RadioButtons_neutral05_png, + BinaryData::RadioButtons_neutral05_pngSize); + neutralOver = ImageCache::getFromMemory(BinaryData::RadioButtons05_png, + BinaryData::RadioButtons05_pngSize); + } + // else if (type == 5) { + // selected = ImageCache::getFromMemory (BinaryData::RadioButtons_selected05_png, + // BinaryData::RadioButtons_selected05_pngSize); + // selectedOver= ImageCache::getFromMemory (BinaryData::RadioButtons_selected_over05_png, + // BinaryData::RadioButtons_selected_over05_pngSize); + // neutral = ImageCache::getFromMemory (BinaryData::RadioButtons_neutral05_png, + // BinaryData::RadioButtons_neutral05_pngSize); + // neutralOver = ImageCache::getFromMemory (BinaryData::RadioButtons05_png, + // BinaryData::RadioButtons05_pngSize); + // } } void WaveformSelector::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown) { - - if (getToggleState()) - { - if (isMouseOver) - g.drawImage(selectedOver, 0, 0, 31, 19, 0, 0, 31, 19); + + if (getToggleState()) + { + if (isMouseOver) + g.drawImage(selectedOver, 0, 0, 31, 19, 0, 0, 31, 19); else - g.drawImage(selected, 0, 0, 31, 19, 0, 0, 31, 19); - } else { - if (isMouseOver) - g.drawImage(neutralOver, 0, 0, 31, 19, 0, 0, 31, 19); + g.drawImage(selected, 0, 0, 31, 19, 0, 0, 31, 19); + } + else + { + if (isMouseOver) + g.drawImage(neutralOver, 0, 0, 31, 19, 0, 0, 31, 19); else - g.drawImage(neutral, 0, 0, 31, 19, 0, 0, 31, 19); - } + g.drawImage(neutral, 0, 0, 31, 19, 0, 0, 31, 19); + } // g.fillAll(); @@ -288,5 +300,5 @@ void WaveformSelector::paintButton(Graphics& g, bool isMouseOver, bool isButtonD // g.drawRect(0, 0, getWidth(), getHeight()); // g.setImageResamplingQuality(Graphics::highResamplingQuality); - + } \ No newline at end of file diff --git a/Source/Processors/Editors/SignalGeneratorEditor.h b/Source/Processors/Editors/SignalGeneratorEditor.h index 801d6f50513ad940721dc86e4b778a7fa011c986..d4c7ddcc20eb2962df4d3e0e9e0fd678b82f012e 100755 --- a/Source/Processors/Editors/SignalGeneratorEditor.h +++ b/Source/Processors/Editors/SignalGeneratorEditor.h @@ -24,9 +24,6 @@ #ifndef __SIGNALGENERATOREDITOR_H_841A7078__ #define __SIGNALGENERATOREDITOR_H_841A7078__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" @@ -44,23 +41,23 @@ class WaveformSelector; */ class SignalGeneratorEditor : public GenericEditor, - public Label::Listener + public Label::Listener { public: - SignalGeneratorEditor (GenericProcessor* parentNode, bool useDefaultParameters); - virtual ~SignalGeneratorEditor(); + SignalGeneratorEditor(GenericProcessor* parentNode, bool useDefaultParameters); + virtual ~SignalGeneratorEditor(); void sliderEvent(Slider* slider); void buttonEvent(Button* button); void labelTextChanged(Label* label); -private: +private: Label* numChannelsLabel; TriangleButton* upButton; TriangleButton* downButton; - Slider* amplitudeSlider; - Slider* frequencySlider; + Slider* amplitudeSlider; + Slider* frequencySlider; Slider* phaseSlider; Array<WaveformSelector*> waveformSelectors; @@ -69,7 +66,7 @@ private: { SINE, SQUARE, SAW, TRIANGLE, NOISE }; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SignalGeneratorEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SignalGeneratorEditor); }; @@ -90,7 +87,7 @@ public: ~WaveformSelector() {} private: void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); - + int type; Image neutral; diff --git a/Source/Processors/Editors/SourceNodeEditor.cpp b/Source/Processors/Editors/SourceNodeEditor.cpp index da90e3df054e0b4e8110db8b00d11a8f6ee19ed8..485482ad443c8679a80da543bc0af9406fa98cf2 100755 --- a/Source/Processors/Editors/SourceNodeEditor.cpp +++ b/Source/Processors/Editors/SourceNodeEditor.cpp @@ -27,53 +27,60 @@ #include <stdio.h> -SourceNodeEditor::SourceNodeEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors) +SourceNodeEditor::SourceNodeEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) { - desiredWidth = 170; + desiredWidth = 170; - Image im; + Image im; - std::cout << "I think my name is: " << getName() << std::endl; + std::cout << "I think my name is: " << getName() << std::endl; - if (getName().equalsIgnoreCase("Intan Demo Board")) - { - im = ImageCache::getFromMemory (BinaryData::IntanIcon_png, - BinaryData::IntanIcon_pngSize); - } else if (getName().equalsIgnoreCase("File Reader")) { - im = ImageCache::getFromMemory (BinaryData::FileReaderIcon_png, - BinaryData::FileReaderIcon_pngSize); + if (getName().equalsIgnoreCase("Intan Demo Board")) + { + im = ImageCache::getFromMemory(BinaryData::IntanIcon_png, + BinaryData::IntanIcon_pngSize); + } + else if (getName().equalsIgnoreCase("File Reader")) + { + im = ImageCache::getFromMemory(BinaryData::FileReaderIcon_png, + BinaryData::FileReaderIcon_pngSize); - } else if (getName().equalsIgnoreCase("Custom FPGA")) { - im = ImageCache::getFromMemory (BinaryData::OpenEphysBoardLogoGray_png, - BinaryData::OpenEphysBoardLogoGray_pngSize); + } + else if (getName().equalsIgnoreCase("Custom FPGA")) + { + im = ImageCache::getFromMemory(BinaryData::OpenEphysBoardLogoGray_png, + BinaryData::OpenEphysBoardLogoGray_pngSize); - } else { - im = ImageCache::getFromMemory (BinaryData::DefaultDataSource_png, - BinaryData::DefaultDataSource_pngSize); - } + } + else + { + im = ImageCache::getFromMemory(BinaryData::DefaultDataSource_png, + BinaryData::DefaultDataSource_pngSize); + } - icon = new ImageIcon(im); - addAndMakeVisible(icon); - icon->setBounds(50,40,70,70); + icon = new ImageIcon(im); + addAndMakeVisible(icon); + icon->setBounds(50,40,70,70); - if (getName().equalsIgnoreCase("Custom FPGA")) { - icon->setBounds(20,15,120,120); - } + if (getName().equalsIgnoreCase("Custom FPGA")) + { + icon->setBounds(20,15,120,120); + } - //Array<int> values; - //values.add(1); values.add(2), values.add(3); + //Array<int> values; + //values.add(1); values.add(2), values.add(3); - //createRadioButtons(10, 25, 100, values); + //createRadioButtons(10, 25, 100, values); } SourceNodeEditor::~SourceNodeEditor() { - deleteAllChildren(); + deleteAllChildren(); } diff --git a/Source/Processors/Editors/SourceNodeEditor.h b/Source/Processors/Editors/SourceNodeEditor.h index 6b430893a6beb5032ed044c43b3296c4082a6b12..5bf07e2bbbdcf47e68e1e7e02bc49c78beea9d48 100755 --- a/Source/Processors/Editors/SourceNodeEditor.h +++ b/Source/Processors/Editors/SourceNodeEditor.h @@ -24,14 +24,10 @@ #ifndef __SOURCENODEEDITOR_H_A1B19E1E__ #define __SOURCENODEEDITOR_H_A1B19E1E__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" #include "ImageIcon.h" -class FilterViewport; class ImageIcon; /** @@ -47,14 +43,14 @@ class SourceNodeEditor : public GenericEditor { public: - SourceNodeEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors); - virtual ~SourceNodeEditor(); + SourceNodeEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + virtual ~SourceNodeEditor(); -private: +private: - ImageIcon* icon; + ImageIcon* icon; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SourceNodeEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SourceNodeEditor); }; diff --git a/Source/Processors/Editors/SpikeDetectorEditor.cpp b/Source/Processors/Editors/SpikeDetectorEditor.cpp index 5361abb87e80b26f7efe5ecc7f16a14a98af076d..d147d04ec9273346cda6dfcb095e03b9202171b6 100755 --- a/Source/Processors/Editors/SpikeDetectorEditor.cpp +++ b/Source/Processors/Editors/SpikeDetectorEditor.cpp @@ -29,8 +29,8 @@ -SpikeDetectorEditor::SpikeDetectorEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors), isPlural(true) +SpikeDetectorEditor::SpikeDetectorEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors), isPlural(true) { @@ -38,7 +38,7 @@ SpikeDetectorEditor::SpikeDetectorEditor (GenericProcessor* parentNode, bool use Typeface::Ptr typeface = new CustomTypeface(mis); font = Font(typeface); - desiredWidth = 300; + desiredWidth = 300; electrodeTypes = new ComboBox("Electrode Types"); @@ -47,11 +47,11 @@ SpikeDetectorEditor::SpikeDetectorEditor (GenericProcessor* parentNode, bool use for (int i = 0; i < processor->electrodeTypes.size(); i++) { String type = processor->electrodeTypes[i]; - electrodeTypes->addItem (type += "s", i+1); + electrodeTypes->addItem(type += "s", i+1); } electrodeTypes->setEditableText(false); - electrodeTypes->setJustificationType (Justification::centredLeft); + electrodeTypes->setJustificationType(Justification::centredLeft); electrodeTypes->addListener(this); electrodeTypes->setBounds(65,40,110,20); electrodeTypes->setSelectedId(2); @@ -59,7 +59,7 @@ SpikeDetectorEditor::SpikeDetectorEditor (GenericProcessor* parentNode, bool use electrodeList = new ComboBox("Electrode List"); electrodeList->setEditableText(false); - electrodeList->setJustificationType (Justification::centredLeft); + electrodeList->setJustificationType(Justification::centredLeft); electrodeList->addListener(this); electrodeList->setBounds(15,75,115,20); addAndMakeVisible(electrodeList); @@ -127,11 +127,11 @@ SpikeDetectorEditor::SpikeDetectorEditor (GenericProcessor* parentNode, bool use addChildComponent(channelSelector); channelSelector->setVisible(false); - // Array<int> a; + // Array<int> a; channelSelector->inactivateButtons(); channelSelector->paramButtonsToggledByDefault(false); - // channelSelector->paramButtonsActiveByDefault(false); + // channelSelector->paramButtonsActiveByDefault(false); } @@ -143,7 +143,7 @@ SpikeDetectorEditor::~SpikeDetectorEditor() removeChildComponent(electrodeButtons[i]); } - deleteAllChildren(); + deleteAllChildren(); } @@ -160,8 +160,9 @@ void SpikeDetectorEditor::sliderEvent(Slider* slider) } } - // std::cout << "Slider value changed." << std::endl; - if (electrodeNum > -1) { + // std::cout << "Slider value changed." << std::endl; + if (electrodeNum > -1) + { SpikeDetector* processor = (SpikeDetector*) getProcessor(); processor->setChannelThreshold(electrodeList->getSelectedItemIndex(), electrodeNum, @@ -191,8 +192,8 @@ void SpikeDetectorEditor::buttonEvent(Button* button) SpikeDetector* processor = (SpikeDetector*) getProcessor(); thresholdSlider->setActive(true); - thresholdSlider->setValue(processor->getChannelThreshold(electrodeList->getSelectedItemIndex(), - electrodeButtons.indexOf((ElectrodeButton*) button))); + thresholdSlider->setValue(processor->getChannelThreshold(electrodeList->getSelectedItemIndex(), + electrodeButtons.indexOf((ElectrodeButton*) button))); } } @@ -204,7 +205,8 @@ void SpikeDetectorEditor::buttonEvent(Button* button) return; - } else if (button == downButton) + } + else if (button == downButton) { if (num > 1) @@ -212,9 +214,10 @@ void SpikeDetectorEditor::buttonEvent(Button* button) return; - } else if (button == plusButton) + } + else if (button == plusButton) { - // std::cout << "Plus button pressed!" << std::endl; + // std::cout << "Plus button pressed!" << std::endl; int type = electrodeTypes->getSelectedId(); std::cout << type << std::endl; @@ -223,39 +226,43 @@ void SpikeDetectorEditor::buttonEvent(Button* button) switch (type) { case 1: - nChans = 1; break; + nChans = 1; + break; case 2: - nChans = 2; break; + nChans = 2; + break; case 3: - nChans = 4; break; + nChans = 4; + break; default: nChans = 1; } - + for (int n = 0; n < num; n++) { if (!addElectrode(nChans)) { sendActionMessage("Not enough channels to add electrode."); - } + } } refreshElectrodeList(); - if (electrodeList->getNumItems() > 0) - { - electrodeList->setSelectedId(electrodeList->getNumItems(), true); - electrodeList->setText(electrodeList->getItemText(electrodeList->getNumItems()-1)); - lastId = electrodeList->getNumItems(); - electrodeList->setEditableText(true); + if (electrodeList->getNumItems() > 0) + { + electrodeList->setSelectedId(electrodeList->getNumItems(), true); + electrodeList->setText(electrodeList->getItemText(electrodeList->getNumItems()-1)); + lastId = electrodeList->getNumItems(); + electrodeList->setEditableText(true); - drawElectrodeButtons(electrodeList->getNumItems()-1); - } + drawElectrodeButtons(electrodeList->getNumItems()-1); + } getEditorViewport()->makeEditorVisible(this, true, true); return; - } else if (button == electrodeEditorButtons[0]) // EDIT + } + else if (button == electrodeEditorButtons[0]) // EDIT { Array<int> activeChannels; @@ -268,7 +275,9 @@ void SpikeDetectorEditor::buttonEvent(Button* button) electrodeButtons[i]->setRadioGroupId(299); channelSelector->activateButtons(); channelSelector->setRadioStatus(true); - } else { + } + else + { electrodeButtons[i]->setToggleState(true, false); electrodeButtons[i]->setRadioGroupId(0); channelSelector->inactivateButtons(); @@ -287,19 +296,23 @@ void SpikeDetectorEditor::buttonEvent(Button* button) if (selectedItemIndex != -1) { drawElectrodeButtons(selectedItemIndex); - } else { + } + else + { electrodeButtons.clear(); } } - // channelSelector->setActiveChannels(activeChannels); + // channelSelector->setActiveChannels(activeChannels); return; - } else if (button == electrodeEditorButtons[1]) // MONITOR + } + else if (button == electrodeEditorButtons[1]) // MONITOR { return; - } else if (button == electrodeEditorButtons[2]) // DELETE + } + else if (button == electrodeEditorButtons[2]) // DELETE { removeElectrode(electrodeList->getSelectedItemIndex()); @@ -317,19 +330,19 @@ void SpikeDetectorEditor::channelChanged(int chan) { //std::cout << "New channel: " << chan << std::endl; - for (int i = 0; i < electrodeButtons.size(); i++) + for (int i = 0; i < electrodeButtons.size(); i++) + { + if (electrodeButtons[i]->getToggleState()) { - if (electrodeButtons[i]->getToggleState()) - { - electrodeButtons[i]->setChannelNum(chan); - electrodeButtons[i]->repaint(); + electrodeButtons[i]->setChannelNum(chan); + electrodeButtons[i]->repaint(); - SpikeDetector* processor = (SpikeDetector*) getProcessor(); - processor->setChannel(electrodeList->getSelectedItemIndex(), - i, - chan-1); - } + SpikeDetector* processor = (SpikeDetector*) getProcessor(); + processor->setChannel(electrodeList->getSelectedItemIndex(), + i, + chan-1); } + } } @@ -343,7 +356,7 @@ void SpikeDetectorEditor::refreshElectrodeList() for (int i = 0; i < electrodeNames.size(); i++) { - electrodeList->addItem (electrodeNames[i], electrodeList->getNumItems()+1); + electrodeList->addItem(electrodeNames[i], electrodeList->getNumItems()+1); } } @@ -381,7 +394,7 @@ void SpikeDetectorEditor::labelTextChanged(Label* label) for (int n = 1; n < electrodeTypes->getNumItems()+1; n++) { electrodeTypes->changeItemText(n, - electrodeTypes->getItemText(n-1).trimCharactersAtEnd("s")); + electrodeTypes->getItemText(n-1).trimCharactersAtEnd("s")); } isPlural = false; @@ -389,7 +402,8 @@ void SpikeDetectorEditor::labelTextChanged(Label* label) String currentText = electrodeTypes->getText(); electrodeTypes->setText(currentText.trimCharactersAtEnd("s")); - } else if (!label->getText().equalsIgnoreCase("1") && !isPlural) + } + else if (!label->getText().equalsIgnoreCase("1") && !isPlural) { for (int n = 1; n < electrodeTypes->getNumItems()+1; n++) { @@ -408,7 +422,7 @@ void SpikeDetectorEditor::labelTextChanged(Label* label) void SpikeDetectorEditor::comboBoxChanged(ComboBox* comboBox) { - + if (comboBox == electrodeList) { int ID = comboBox->getSelectedId(); @@ -420,7 +434,9 @@ void SpikeDetectorEditor::comboBoxChanged(ComboBox* comboBox) processor->setElectrodeName(lastId, comboBox->getText()); refreshElectrodeList(); - } else { + } + else + { lastId = ID; @@ -460,13 +476,15 @@ void SpikeDetectorEditor::drawElectrodeButtons(int ID) { button->setToggleState(false, false); button->setRadioGroupId(299); - } else { + } + else + { activeChannels.add(processor->getChannel(ID,i)); } - + if (numChannels < 3) button->setBounds(145+(column++)*width, 78+row*height, width, 15); - else + else button->setBounds(145+(column++)*width, 70+row*height, width, 15); addAndMakeVisible(button); @@ -486,12 +504,12 @@ void SpikeDetectorEditor::drawElectrodeButtons(int ID) - -void ElectrodeButton::paintButton(Graphics &g, bool isMouseOver, bool isButtonDown) + +void ElectrodeButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown) { if (getToggleState() == true) g.setColour(Colours::orange); - else + else g.setColour(Colours::darkgrey); if (isMouseOver) @@ -499,7 +517,7 @@ void ElectrodeButton::paintButton(Graphics &g, bool isMouseOver, bool isButtonDo g.fillRect(0,0,getWidth(),getHeight()); - // g.setFont(buttonFont); + // g.setFont(buttonFont); g.setColour(Colours::black); g.drawRect(0,0,getWidth(),getHeight(),1.0); @@ -507,12 +525,12 @@ void ElectrodeButton::paintButton(Graphics &g, bool isMouseOver, bool isButtonDo g.drawText(String(chan),0,0,getWidth(),getHeight(),Justification::centred,true); } - -void ElectrodeEditorButton::paintButton(Graphics &g, bool isMouseOver, bool isButtonDown) + +void ElectrodeEditorButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown) { if (getToggleState() == true) g.setColour(Colours::darkgrey); - else + else g.setColour(Colours::lightgrey); g.setFont(font); @@ -535,7 +553,7 @@ void ThresholdSlider::paint(Graphics& g) { ColourGradient grad = ColourGradient(Colour(40, 40, 40), 0.0f, 0.0f, - Colour(80, 80, 80), 0.0, 40.0f, false); + Colour(80, 80, 80), 0.0, 40.0f, false); Path p; p.addPieSegment(3, 3, getWidth()-6, getHeight()-6, 5*double_Pi/4-0.2, 5*double_Pi/4+3*double_Pi/2+0.2, 0.5); @@ -545,13 +563,16 @@ void ThresholdSlider::paint(Graphics& g) String valueString; - if (isActive) { + if (isActive) + { p = makeRotaryPath(getMinimum(), getMaximum(), getValue()); g.setColour(Colour(240,179,12)); g.fillPath(p); - valueString = String( (int) getValue()); - } else { + valueString = String((int) getValue()); + } + else + { valueString = ""; @@ -562,11 +583,11 @@ void ThresholdSlider::paint(Graphics& g) g.fillPath(p); valueString = String((int) valueArray.getLast()); } - + } - + font.setHeight(9.0); - g.setFont(font); + g.setFont(font); int stringWidth = font.getStringWidth(valueString); g.setFont(font); diff --git a/Source/Processors/Editors/SpikeDetectorEditor.h b/Source/Processors/Editors/SpikeDetectorEditor.h index 87fab84bc456aa74557a51a5e82faa607805feae..b7c10dcee01b0f12e8658bd37e59b5d0075d4a88 100755 --- a/Source/Processors/Editors/SpikeDetectorEditor.h +++ b/Source/Processors/Editors/SpikeDetectorEditor.h @@ -25,9 +25,6 @@ #define __SPIKEDETECTOREDITOR_H_F0BD2DD9__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" @@ -45,7 +42,7 @@ class UtilityButton; class ElectrodeButton : public Button { public: - ElectrodeButton(int chan_) : Button("Electrode"), chan(chan_) + ElectrodeButton(int chan_) : Button("Electrode"), chan(chan_) { setClickingTogglesState(true); //setRadioGroupId(299); @@ -53,8 +50,14 @@ public: } ~ElectrodeButton() {} - int getChannelNum() {return chan;} - void setChannelNum(int i) {chan = i;} + int getChannelNum() + { + return chan; + } + void setChannelNum(int i) + { + chan = i; + } private: void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); @@ -98,7 +101,7 @@ private: class ThresholdSlider : public Slider { -public: +public: ThresholdSlider(Font f); ~ThresholdSlider() {} @@ -133,13 +136,13 @@ private: */ class SpikeDetectorEditor : public GenericEditor, - public Label::Listener, - public ComboBox::Listener + public Label::Listener, + public ComboBox::Listener { public: - SpikeDetectorEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors); - virtual ~SpikeDetectorEditor(); + SpikeDetectorEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + virtual ~SpikeDetectorEditor(); void buttonEvent(Button* button); void labelTextChanged(Label* label); void comboBoxChanged(ComboBox* comboBox); @@ -147,12 +150,12 @@ public: void channelChanged(int chan); -private: +private: void drawElectrodeButtons(int); void refreshElectrodeList(); - + ComboBox* electrodeTypes; ComboBox* electrodeList; Label* numElectrodes; @@ -175,7 +178,7 @@ private: Font font; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SpikeDetectorEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SpikeDetectorEditor); }; diff --git a/Source/Processors/Editors/SpikeDisplayEditor.cpp b/Source/Processors/Editors/SpikeDisplayEditor.cpp index 6e7c8e4b075e3b5f15719f83eeec89f639416b89..7d731c313dea089944481dd1ad595b259024a935 100755 --- a/Source/Processors/Editors/SpikeDisplayEditor.cpp +++ b/Source/Processors/Editors/SpikeDisplayEditor.cpp @@ -25,21 +25,21 @@ #include <string> -SpikeDisplayEditor::SpikeDisplayEditor (GenericProcessor* parentNode) - : VisualizerEditor(parentNode,200) +SpikeDisplayEditor::SpikeDisplayEditor(GenericProcessor* parentNode) + : VisualizerEditor(parentNode,200) { - // Get the number of sub channels from the parentNode - // Assume all plots have the same number of subChannels - // Otherwise we'll have to track the number of subChannels - nSubChannels = 4; + // Get the number of sub channels from the parentNode + // Assume all plots have the same number of subChannels + // Otherwise we'll have to track the number of subChannels + nSubChannels = 4; - for (int i=0; i<nSubChannels; i++) - subChanSelected[i] = true; + for (int i=0; i<nSubChannels; i++) + subChanSelected[i] = true; - initializeButtons(); + initializeButtons(); - tabText = "Spikes"; + tabText = "Spikes"; @@ -47,137 +47,138 @@ SpikeDisplayEditor::SpikeDisplayEditor (GenericProcessor* parentNode) SpikeDisplayEditor::~SpikeDisplayEditor() { - deleteAllChildren(); + deleteAllChildren(); } -void SpikeDisplayEditor::initializeButtons(){ - int w = 18; - int h = 18; - int xPad = 5; - int yPad = 6; - - int xInitial = 10; - int yInitial = 25; - int x = xInitial; - int y = yInitial; - - panLabel = new Label("PanLabel", "Pan:"); - panLabel->setBounds(x-xPad, y, w*2 + xPad, h); - panLabel->setJustificationType(Justification::centredLeft ); - x+= 2*w+2*xPad; - - zoomLabel = new Label("ZoomLabel", "Zoom:"); - zoomLabel->setBounds(x-xPad,y,w*3+xPad, h); - zoomLabel->setJustificationType(Justification::centredLeft); - x = xInitial; - y += h + yPad/2; - - - panDownBtn = new UtilityButton("-", titleFont); - panDownBtn->setCorners(true, false, true, false); - panDownBtn->setBounds(x, y, w, h); - panDownBtn->setClickingTogglesState(false); - panDownBtn->addListener(this); - x+= w;//+xPad; - - panUpBtn = new UtilityButton("+", titleFont); - panUpBtn->setCorners(false, true, false, true); - panUpBtn->setBounds(x, y, w, h); - panUpBtn->setClickingTogglesState(false); - panUpBtn->addListener(this); - x+= w+xPad*2; - - - zoomOutBtn = new UtilityButton("-", titleFont); - zoomOutBtn->setCorners(true, false, true, false); - zoomOutBtn->setBounds(x,y,w,h); - zoomOutBtn->setClickingTogglesState(false); - zoomOutBtn->addListener(this); - x += w;// + xPad; - - zoomInBtn = new UtilityButton("+", titleFont); - zoomInBtn->setCorners(false, true, false, true); - zoomInBtn->setBounds(x,y,w,h); - zoomInBtn->setClickingTogglesState(false); - zoomInBtn->addListener(this); - x += w + xPad*3; - - - clearBtn = new UtilityButton("Clear", titleFont); - clearBtn->setBounds(x, y, w*2 + xPad, h); - clearBtn->setClickingTogglesState(false); - clearBtn->addListener(this); - //x += (w + xPad) *2; - -/* - x = xInitial; - y += h + yPad; - - //panLabel->setFont(titleFont); - - saveImgBtn = new UtilityButton("Save", titleFont); - saveImgBtn->setBounds(x,y,w*2 + xPad, h); - saveImgBtn->setClickingTogglesState(false); - saveImgBtn->addListener(this); - x += (w + xPad) * 2; - - */ - - - - //zoomLabel->setFont(titleFont); - x = xInitial; - y += h + yPad; - // Button *zoomOutBtn = new EditorButton("-"); - - subChanLabel = new Label("SubChan", "Sub Channel:"); - subChanLabel->setBounds(x - xPad,y,w*8, h); - subChanLabel->setJustificationType(Justification::centredLeft); - y += h + yPad/2; - //x += w/2; - - allSubChansBtn = new UtilityButton("All", titleFont); - allSubChansBtn->setBounds(x,y,w*2+xPad,h); - allSubChansBtn->addListener(this); - allSubChansBtn->setToggleState(true, false); - x += (w+xPad) * 2; - - for (int i=0; i<nSubChannels; i++) - { - String s = ""; - s += i; - - subChanBtn[i] = new UtilityButton(s, titleFont); - subChanBtn[i]->setBounds(x,y,w,h); - subChanBtn[i]->addListener(this); - subChanBtn[i]->setToggleState(true, false); - x += w + xPad; - } - - - addAndMakeVisible(panDownBtn); - addAndMakeVisible(panUpBtn); - addAndMakeVisible(panLabel); - - addAndMakeVisible(zoomOutBtn); - addAndMakeVisible(zoomInBtn); - addAndMakeVisible(zoomLabel); - - addAndMakeVisible(clearBtn); - //addAndMakeVisible(saveImgBtn); - - addAndMakeVisible(subChanLabel); - addAndMakeVisible(allSubChansBtn); - for (int i=0; i<nSubChannels; i++) - addAndMakeVisible(subChanBtn[i]); +void SpikeDisplayEditor::initializeButtons() +{ + int w = 18; + int h = 18; + int xPad = 5; + int yPad = 6; + + int xInitial = 10; + int yInitial = 25; + int x = xInitial; + int y = yInitial; + + panLabel = new Label("PanLabel", "Pan:"); + panLabel->setBounds(x-xPad, y, w*2 + xPad, h); + panLabel->setJustificationType(Justification::centredLeft); + x+= 2*w+2*xPad; + + zoomLabel = new Label("ZoomLabel", "Zoom:"); + zoomLabel->setBounds(x-xPad,y,w*3+xPad, h); + zoomLabel->setJustificationType(Justification::centredLeft); + x = xInitial; + y += h + yPad/2; + + + panDownBtn = new UtilityButton("-", titleFont); + panDownBtn->setCorners(true, false, true, false); + panDownBtn->setBounds(x, y, w, h); + panDownBtn->setClickingTogglesState(false); + panDownBtn->addListener(this); + x+= w;//+xPad; + + panUpBtn = new UtilityButton("+", titleFont); + panUpBtn->setCorners(false, true, false, true); + panUpBtn->setBounds(x, y, w, h); + panUpBtn->setClickingTogglesState(false); + panUpBtn->addListener(this); + x+= w+xPad*2; + + + zoomOutBtn = new UtilityButton("-", titleFont); + zoomOutBtn->setCorners(true, false, true, false); + zoomOutBtn->setBounds(x,y,w,h); + zoomOutBtn->setClickingTogglesState(false); + zoomOutBtn->addListener(this); + x += w;// + xPad; + + zoomInBtn = new UtilityButton("+", titleFont); + zoomInBtn->setCorners(false, true, false, true); + zoomInBtn->setBounds(x,y,w,h); + zoomInBtn->setClickingTogglesState(false); + zoomInBtn->addListener(this); + x += w + xPad*3; + + + clearBtn = new UtilityButton("Clear", titleFont); + clearBtn->setBounds(x, y, w*2 + xPad, h); + clearBtn->setClickingTogglesState(false); + clearBtn->addListener(this); + //x += (w + xPad) *2; + + /* + x = xInitial; + y += h + yPad; + + //panLabel->setFont(titleFont); + + saveImgBtn = new UtilityButton("Save", titleFont); + saveImgBtn->setBounds(x,y,w*2 + xPad, h); + saveImgBtn->setClickingTogglesState(false); + saveImgBtn->addListener(this); + x += (w + xPad) * 2; + + */ + + + + //zoomLabel->setFont(titleFont); + x = xInitial; + y += h + yPad; + // Button *zoomOutBtn = new EditorButton("-"); + + subChanLabel = new Label("SubChan", "Sub Channel:"); + subChanLabel->setBounds(x - xPad,y,w*8, h); + subChanLabel->setJustificationType(Justification::centredLeft); + y += h + yPad/2; + //x += w/2; + + allSubChansBtn = new UtilityButton("All", titleFont); + allSubChansBtn->setBounds(x,y,w*2+xPad,h); + allSubChansBtn->addListener(this); + allSubChansBtn->setToggleState(true, false); + x += (w+xPad) * 2; + + for (int i=0; i<nSubChannels; i++) + { + String s = ""; + s += i; + + subChanBtn[i] = new UtilityButton(s, titleFont); + subChanBtn[i]->setBounds(x,y,w,h); + subChanBtn[i]->addListener(this); + subChanBtn[i]->setToggleState(true, false); + x += w + xPad; + } + + + addAndMakeVisible(panDownBtn); + addAndMakeVisible(panUpBtn); + addAndMakeVisible(panLabel); + + addAndMakeVisible(zoomOutBtn); + addAndMakeVisible(zoomInBtn); + addAndMakeVisible(zoomLabel); + + addAndMakeVisible(clearBtn); + //addAndMakeVisible(saveImgBtn); + + addAndMakeVisible(subChanLabel); + addAndMakeVisible(allSubChansBtn); + for (int i=0; i<nSubChannels; i++) + addAndMakeVisible(subChanBtn[i]); } Visualizer* SpikeDisplayEditor::createNewCanvas() { - SpikeDisplayNode* processor = (SpikeDisplayNode*) getProcessor(); - return new SpikeDisplayCanvas(processor); + SpikeDisplayNode* processor = (SpikeDisplayNode*) getProcessor(); + return new SpikeDisplayCanvas(processor); } @@ -189,73 +190,79 @@ Visualizer* SpikeDisplayEditor::createNewCanvas() // void SpikeDisplayEditor::updateVisualizer() // { - + // } void SpikeDisplayEditor::buttonCallback(Button* button) { - //std::cout<<"Got event from component:"<<button<<std::endl; - - int pIdx = 0; - if (button == panUpBtn){ - for (int i=0; i<nSubChannels; i++) - if (subChanSelected[i]) - canvas->setParameter(SPIKE_CMD_PAN_AXES, pIdx, i, 1); - } - else if (button == panDownBtn){ - for (int i=0; i<nSubChannels; i++) - if (subChanSelected[i]) - canvas->setParameter(SPIKE_CMD_PAN_AXES, pIdx, i, -1); - } - else if (button == zoomInBtn){ - for (int i=0; i<nSubChannels; i++) - if (subChanSelected[i]) - canvas->setParameter(SPIKE_CMD_ZOOM_AXES, pIdx, i, -1); - } - else if (button == zoomOutBtn) - { - for (int i=0; i<nSubChannels; i++) - if (subChanSelected[i]) - canvas->setParameter(SPIKE_CMD_ZOOM_AXES, pIdx, i, 1); - } - - else if (button == clearBtn){ - std::cout<<"Clear!"<<std::endl; - canvas->setParameter(SPIKE_CMD_CLEAR_ALL, 0); - } - else if (button == saveImgBtn) - std::cout<<"Save!"<<std::endl; - - // toggle all sub channel buttons - else if (button == allSubChansBtn) - { - bool b = allSubChansBtn->getToggleState(); - for (int i=0; i<nSubChannels; i++) - subChanBtn[i]->setToggleState(b, true); - - } - // Check the sub Channel selection buttons one by one - else{ - // If the user has clicked a sub channel button then the all channels button should be untoggled if toggled - allSubChansBtn->setToggleState(false, false); - for (int i=0; i<nSubChannels; i++) - if(button == subChanBtn[i]) - { - std::cout<<"SubChannel:"<<i<< " set to:"; - subChanSelected[i] = ((UtilityButton*) button)->getToggleState(); - std::cout<< subChanSelected[i]<<std::endl; - } - - // If the user has toggled all of the sub channels on, then set AllChans to on - bool allChansToggled = true; - for (int i=0; i<nSubChannels; i++) - { - if (subChanBtn[i]->getToggleState()!=allChansToggled){ - allChansToggled = false; - break; - } - } - allSubChansBtn->setToggleState(allChansToggled, false); - - } + //std::cout<<"Got event from component:"<<button<<std::endl; + + int pIdx = 0; + if (button == panUpBtn) + { + for (int i=0; i<nSubChannels; i++) + if (subChanSelected[i]) + canvas->setParameter(SPIKE_CMD_PAN_AXES, pIdx, i, 1); + } + else if (button == panDownBtn) + { + for (int i=0; i<nSubChannels; i++) + if (subChanSelected[i]) + canvas->setParameter(SPIKE_CMD_PAN_AXES, pIdx, i, -1); + } + else if (button == zoomInBtn) + { + for (int i=0; i<nSubChannels; i++) + if (subChanSelected[i]) + canvas->setParameter(SPIKE_CMD_ZOOM_AXES, pIdx, i, -1); + } + else if (button == zoomOutBtn) + { + for (int i=0; i<nSubChannels; i++) + if (subChanSelected[i]) + canvas->setParameter(SPIKE_CMD_ZOOM_AXES, pIdx, i, 1); + } + + else if (button == clearBtn) + { + std::cout<<"Clear!"<<std::endl; + canvas->setParameter(SPIKE_CMD_CLEAR_ALL, 0); + } + else if (button == saveImgBtn) + std::cout<<"Save!"<<std::endl; + + // toggle all sub channel buttons + else if (button == allSubChansBtn) + { + bool b = allSubChansBtn->getToggleState(); + for (int i=0; i<nSubChannels; i++) + subChanBtn[i]->setToggleState(b, true); + + } + // Check the sub Channel selection buttons one by one + else + { + // If the user has clicked a sub channel button then the all channels button should be untoggled if toggled + allSubChansBtn->setToggleState(false, false); + for (int i=0; i<nSubChannels; i++) + if (button == subChanBtn[i]) + { + std::cout<<"SubChannel:"<<i<< " set to:"; + subChanSelected[i] = ((UtilityButton*) button)->getToggleState(); + std::cout<< subChanSelected[i]<<std::endl; + } + + // If the user has toggled all of the sub channels on, then set AllChans to on + bool allChansToggled = true; + for (int i=0; i<nSubChannels; i++) + { + if (subChanBtn[i]->getToggleState()!=allChansToggled) + { + allChansToggled = false; + break; + } + } + allSubChansBtn->setToggleState(allChansToggled, false); + + } } diff --git a/Source/Processors/Editors/SpikeDisplayEditor.h b/Source/Processors/Editors/SpikeDisplayEditor.h index 6725ba6403543322f3684424cf7e30e35b9b3bfd..9a9a5e76bd7dadd1ff8e0a2e750a44f4af5f279e 100755 --- a/Source/Processors/Editors/SpikeDisplayEditor.h +++ b/Source/Processors/Editors/SpikeDisplayEditor.h @@ -24,9 +24,6 @@ #ifndef SPIKEDISPLAYEDITOR_H_ #define SPIKEDISPLAYEDITOR_H_ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" #include "../../UI/UIComponent.h" @@ -41,7 +38,7 @@ class Visualizer; class UtilityButton; /** - + User interface for the SpikeDisplayNode sink. @see SpikeDisplayNode, SpikeDisplayCanvas @@ -51,38 +48,38 @@ class UtilityButton; class SpikeDisplayEditor : public VisualizerEditor { public: - SpikeDisplayEditor (GenericProcessor*); - ~SpikeDisplayEditor(); + SpikeDisplayEditor(GenericProcessor*); + ~SpikeDisplayEditor(); - void buttonCallback (Button* button); + void buttonCallback(Button* button); // void updateSettings(); // void updateVisualizer(); - Visualizer* createNewCanvas(); + Visualizer* createNewCanvas(); -private: +private: - UtilityButton *panUpBtn; - UtilityButton *panDownBtn; - UtilityButton *zoomInBtn; - UtilityButton *zoomOutBtn; - UtilityButton *clearBtn; - UtilityButton *saveImgBtn; + UtilityButton* panUpBtn; + UtilityButton* panDownBtn; + UtilityButton* zoomInBtn; + UtilityButton* zoomOutBtn; + UtilityButton* clearBtn; + UtilityButton* saveImgBtn; - Label *panLabel; - Label *zoomLabel; + Label* panLabel; + Label* zoomLabel; - UtilityButton *allSubChansBtn; + UtilityButton* allSubChansBtn; int nSubChannels; - Label *subChanLabel; - UtilityButton *subChanBtn[MAX_N_SUB_CHAN]; + Label* subChanLabel; + UtilityButton* subChanBtn[MAX_N_SUB_CHAN]; bool subChanSelected[MAX_N_SUB_CHAN]; void initializeButtons(); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SpikeDisplayEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SpikeDisplayEditor); }; diff --git a/Source/Processors/Editors/SplitterEditor.cpp b/Source/Processors/Editors/SplitterEditor.cpp index 24bb40dc203ee067ada2a0f1784f7c41fa88b7b6..265bb0240d927df399a195b0c64a5abc6a0117a4 100755 --- a/Source/Processors/Editors/SplitterEditor.cpp +++ b/Source/Processors/Editors/SplitterEditor.cpp @@ -51,111 +51,114 @@ // { // } -SplitterEditor::SplitterEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors) +SplitterEditor::SplitterEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) { - desiredWidth = 90; + desiredWidth = 90; - pipelineSelectorA = new ImageButton("Pipeline A"); + pipelineSelectorA = new ImageButton("Pipeline A"); - Image normalImageA = ImageCache::getFromMemory (BinaryData::PipelineB01_png, BinaryData::PipelineB01_pngSize); - Image downImageA = ImageCache::getFromMemory (BinaryData::PipelineA01_png, BinaryData::PipelineA01_pngSize); - Image normalImageB = ImageCache::getFromMemory (BinaryData::PipelineA02_png, BinaryData::PipelineA02_pngSize); - Image downImageB = ImageCache::getFromMemory (BinaryData::PipelineB02_png, BinaryData::PipelineB02_pngSize); + Image normalImageA = ImageCache::getFromMemory(BinaryData::PipelineB01_png, BinaryData::PipelineB01_pngSize); + Image downImageA = ImageCache::getFromMemory(BinaryData::PipelineA01_png, BinaryData::PipelineA01_pngSize); + Image normalImageB = ImageCache::getFromMemory(BinaryData::PipelineA02_png, BinaryData::PipelineA02_pngSize); + Image downImageB = ImageCache::getFromMemory(BinaryData::PipelineB02_png, BinaryData::PipelineB02_pngSize); - pipelineSelectorA->setImages(true, true, true, - normalImageA, 1.0f, Colours::white.withAlpha(0.0f), - normalImageA, 1.0f, Colours::black.withAlpha(0.0f), - downImageA, 1.0f, Colours::white.withAlpha(0.0f)); + pipelineSelectorA->setImages(true, true, true, + normalImageA, 1.0f, Colours::white.withAlpha(0.0f), + normalImageA, 1.0f, Colours::black.withAlpha(0.0f), + downImageA, 1.0f, Colours::white.withAlpha(0.0f)); - pipelineSelectorA->addListener(this); - pipelineSelectorA->setBounds(-10,25,95,50); - pipelineSelectorA->setToggleState(true,false); - addAndMakeVisible(pipelineSelectorA); + pipelineSelectorA->addListener(this); + pipelineSelectorA->setBounds(-10,25,95,50); + pipelineSelectorA->setToggleState(true,false); + addAndMakeVisible(pipelineSelectorA); - pipelineSelectorB = new ImageButton("Pipeline B"); + pipelineSelectorB = new ImageButton("Pipeline B"); - pipelineSelectorB->setImages(true, true, true, - normalImageB, 1.0f, Colours::white.withAlpha(0.0f), - normalImageB, 1.0f, Colours::black.withAlpha(0.0f), - downImageB, 1.0f, Colours::white.withAlpha(0.0f)); + pipelineSelectorB->setImages(true, true, true, + normalImageB, 1.0f, Colours::white.withAlpha(0.0f), + normalImageB, 1.0f, Colours::black.withAlpha(0.0f), + downImageB, 1.0f, Colours::white.withAlpha(0.0f)); - pipelineSelectorB->addListener(this); - pipelineSelectorB->setBounds(-10,75,95,50); - pipelineSelectorB->setToggleState(false,false); - addAndMakeVisible(pipelineSelectorB); + pipelineSelectorB->addListener(this); + pipelineSelectorB->setBounds(-10,75,95,50); + pipelineSelectorB->setToggleState(false,false); + addAndMakeVisible(pipelineSelectorB); } SplitterEditor::~SplitterEditor() { - deleteAllChildren(); + deleteAllChildren(); } void SplitterEditor::buttonEvent(Button* button) { - if (button == pipelineSelectorA) - { - pipelineSelectorA->setToggleState(true,false); - pipelineSelectorB->setToggleState(false,false); - Splitter* processor = (Splitter*) getProcessor(); - processor->switchIO(0); - - } else if (button == pipelineSelectorB) - { - pipelineSelectorB->setToggleState(true,false); - pipelineSelectorA->setToggleState(false,false); - Splitter* processor = (Splitter*) getProcessor(); - processor->switchIO(1); - - } + if (button == pipelineSelectorA) + { + pipelineSelectorA->setToggleState(true,false); + pipelineSelectorB->setToggleState(false,false); + Splitter* processor = (Splitter*) getProcessor(); + processor->switchIO(0); + + } + else if (button == pipelineSelectorB) + { + pipelineSelectorB->setToggleState(true,false); + pipelineSelectorA->setToggleState(false,false); + Splitter* processor = (Splitter*) getProcessor(); + processor->switchIO(1); + + } } void SplitterEditor::switchDest(int dest) { - if (dest == 0) - { - pipelineSelectorA->setToggleState(true,false); - pipelineSelectorB->setToggleState(false,false); - Splitter* processor = (Splitter*) getProcessor(); - processor->switchIO(0); - - } else if (dest == 1) - { - pipelineSelectorB->setToggleState(true,false); - pipelineSelectorA->setToggleState(false,false); - Splitter* processor = (Splitter*) getProcessor(); - processor->switchIO(1); - - } + if (dest == 0) + { + pipelineSelectorA->setToggleState(true,false); + pipelineSelectorB->setToggleState(false,false); + Splitter* processor = (Splitter*) getProcessor(); + processor->switchIO(0); + + } + else if (dest == 1) + { + pipelineSelectorB->setToggleState(true,false); + pipelineSelectorA->setToggleState(false,false); + Splitter* processor = (Splitter*) getProcessor(); + processor->switchIO(1); + + } } void SplitterEditor::switchIO(int dest) { - switchDest(dest); + switchDest(dest); - select(); + select(); } void SplitterEditor::switchDest() { - Splitter* processor = (Splitter*) getProcessor(); - processor->switchIO(); - - int path = processor->getPath(); - - if (path == 0) - { - pipelineSelectorA->setToggleState(true,false); - pipelineSelectorB->setToggleState(false,false); - - } else if (path == 1) - { - pipelineSelectorB->setToggleState(true,false); - pipelineSelectorA->setToggleState(false,false); - - } + Splitter* processor = (Splitter*) getProcessor(); + processor->switchIO(); + + int path = processor->getPath(); + + if (path == 0) + { + pipelineSelectorA->setToggleState(true,false); + pipelineSelectorB->setToggleState(false,false); + + } + else if (path == 1) + { + pipelineSelectorB->setToggleState(true,false); + pipelineSelectorA->setToggleState(false,false); + + } } diff --git a/Source/Processors/Editors/SplitterEditor.h b/Source/Processors/Editors/SplitterEditor.h index 2fb1d46f62305e27ec28c3a74a36f7a0c6196059..d371debddb07915c158c47e0357a6955d57349bf 100755 --- a/Source/Processors/Editors/SplitterEditor.h +++ b/Source/Processors/Editors/SplitterEditor.h @@ -25,9 +25,6 @@ #define __SPLITTEREDITOR_H_33F644A8__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" @@ -42,22 +39,22 @@ class SplitterEditor : public GenericEditor { public: - SplitterEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors); - virtual ~SplitterEditor(); + SplitterEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + virtual ~SplitterEditor(); - void buttonEvent (Button* button); + void buttonEvent(Button* button); void switchDest(int); void switchDest(); void switchIO(int i); -private: - - ImageButton* pipelineSelectorA; - ImageButton* pipelineSelectorB; +private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SplitterEditor); + ImageButton* pipelineSelectorA; + ImageButton* pipelineSelectorB; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SplitterEditor); }; diff --git a/Source/Processors/Editors/VisualizerEditor.cpp b/Source/Processors/Editors/VisualizerEditor.cpp index a511bb65c86f98249e51e8b07bf8f657688d3b15..e62ae7026bbb05cce89ed56c2c33aecdb48653fe 100755 --- a/Source/Processors/Editors/VisualizerEditor.cpp +++ b/Source/Processors/Editors/VisualizerEditor.cpp @@ -178,16 +178,6 @@ void VisualizerEditor::buttonEvent(Button* button) tabIndex = -1; } - // Component* parent = canvas->getParentComponent(); - - // if (parent != nullptr) - // { - // std::cout << "Removing child." << std::endl; - // parent->removeChildComponent(canvas); - // } else { - // std::cout << "Parent doesn't exist." << std::endl; - // } - if (dataWindow == 0) { dataWindow = new DataWindow(windowSelector, tabText); diff --git a/Source/Processors/Editors/VisualizerEditor.h b/Source/Processors/Editors/VisualizerEditor.h index dc685291684422492f0d1c4626f83016bf7a8c3d..c4c8df334ae41d6d1d1c0de9fc12fb7c73222d01 100755 --- a/Source/Processors/Editors/VisualizerEditor.h +++ b/Source/Processors/Editors/VisualizerEditor.h @@ -24,9 +24,6 @@ #ifndef __VISUALIZEREDITOR_H_17E6D78C__ #define __VISUALIZEREDITOR_H_17E6D78C__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" #include "../../UI/UIComponent.h" @@ -39,7 +36,7 @@ class DataWindow; class Visualizer; /** - + Button for selecting the location of a visualizer. @see VisualizerEditor @@ -48,16 +45,16 @@ class Visualizer; class SelectorButton : public Button { - public: - SelectorButton(const String& name); - ~SelectorButton(); - private: - void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); +public: + SelectorButton(const String& name); + ~SelectorButton(); +private: + void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); }; /** - + Base class for creating editors with visualizers. @see GenericEditor, Visualizer @@ -67,40 +64,40 @@ class SelectorButton : public Button class VisualizerEditor : public GenericEditor { public: - VisualizerEditor (GenericProcessor*, int, bool useDefaultParameterEditors); - VisualizerEditor (GenericProcessor*, bool useDefaultParameterEditors); - ~VisualizerEditor(); + VisualizerEditor(GenericProcessor*, int, bool useDefaultParameterEditors); + VisualizerEditor(GenericProcessor*, bool useDefaultParameterEditors); + ~VisualizerEditor(); - void buttonEvent (Button* button); - virtual void buttonCallback(Button* button) {} + void buttonEvent(Button* button); + virtual void buttonCallback(Button* button) {} - virtual Visualizer* createNewCanvas() = 0; + virtual Visualizer* createNewCanvas() = 0; - virtual void enable(); - virtual void disable(); + virtual void enable(); + virtual void disable(); - void editorWasClicked(); + void editorWasClicked(); - void updateVisualizer(); + void updateVisualizer(); - ScopedPointer<DataWindow> dataWindow; - ScopedPointer<Visualizer> canvas; + ScopedPointer<DataWindow> dataWindow; + ScopedPointer<Visualizer> canvas; - String tabText; + String tabText; -private: +private: - void initializeSelectors(); - bool isPlaying; + void initializeSelectors(); + bool isPlaying; - SelectorButton* windowSelector; - SelectorButton* tabSelector; + SelectorButton* windowSelector; + SelectorButton* tabSelector; - int tabIndex; + int tabIndex; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VisualizerEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VisualizerEditor); }; diff --git a/Source/Processors/Editors/WiFiOutputEditor.cpp b/Source/Processors/Editors/WiFiOutputEditor.cpp index 062b279d021ec5f5d943d250023ea2b54d9d2249..5b8b679736f3dd4c3893431ba191d316c039ef45 100755 --- a/Source/Processors/Editors/WiFiOutputEditor.cpp +++ b/Source/Processors/Editors/WiFiOutputEditor.cpp @@ -25,65 +25,70 @@ #include <stdio.h> -WiFiOutputEditor::WiFiOutputEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors) +WiFiOutputEditor::WiFiOutputEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) { - accumulator = 0; + accumulator = 0; - desiredWidth = 150; + desiredWidth = 150; - Image im; - im = ImageCache::getFromMemory (BinaryData::wifi_png, - BinaryData::wifi_pngSize); + Image im; + im = ImageCache::getFromMemory(BinaryData::wifi_png, + BinaryData::wifi_pngSize); - icon = new ImageIcon(im); - addAndMakeVisible(icon); - icon->setBounds(35,35,80,80); + icon = new ImageIcon(im); + addAndMakeVisible(icon); + icon->setBounds(35,35,80,80); - icon->setOpacity(0.3f); + icon->setOpacity(0.3f); } WiFiOutputEditor::~WiFiOutputEditor() { - deleteAllChildren(); + deleteAllChildren(); } void WiFiOutputEditor::receivedEvent() { - - icon->setOpacity(0.8f); - startTimer(50); + + icon->setOpacity(0.8f); + startTimer(50); } void WiFiOutputEditor::timerCallback() { - repaint(); - - accumulator++; - - if (isFading) { - - if (accumulator > 15.0) - { - stopTimer(); - isFading = false; - } - - } else { - - if (accumulator < 10.0) - { - icon->setOpacity(0.8f-(0.05*float(accumulator))); - accumulator++; - } else { - icon->setOpacity(0.3f); - stopTimer(); - accumulator = 0; - } - } + repaint(); + + accumulator++; + + if (isFading) + { + + if (accumulator > 15.0) + { + stopTimer(); + isFading = false; + } + + } + else + { + + if (accumulator < 10.0) + { + icon->setOpacity(0.8f-(0.05*float(accumulator))); + accumulator++; + } + else + { + icon->setOpacity(0.3f); + stopTimer(); + accumulator = 0; + } + } } \ No newline at end of file diff --git a/Source/Processors/Editors/WiFiOutputEditor.h b/Source/Processors/Editors/WiFiOutputEditor.h index ac5809f07aee5b43d7738965ae7d08a12971e35e..be9a3f8e725060072e4b224bb8d53fe0eb2d10ff 100755 --- a/Source/Processors/Editors/WiFiOutputEditor.h +++ b/Source/Processors/Editors/WiFiOutputEditor.h @@ -23,9 +23,6 @@ #ifndef __WIFIOUTPUTEDITOR_H_7161DB44__ #define __WIFIOUTPUTEDITOR_H_7161DB44__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "GenericEditor.h" #include "ImageIcon.h" @@ -44,19 +41,19 @@ class WiFiOutputEditor : public GenericEditor { public: - WiFiOutputEditor (GenericProcessor* parentNode, bool useDefaultParameterEditors); - virtual ~WiFiOutputEditor(); + WiFiOutputEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + virtual ~WiFiOutputEditor(); - void receivedEvent(); + void receivedEvent(); - ImageIcon* icon; + ImageIcon* icon; -private: +private: - void timerCallback(); + void timerCallback(); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WiFiOutputEditor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(WiFiOutputEditor); }; diff --git a/Source/Processors/EventDetector.cpp b/Source/Processors/EventDetector.cpp index 68f33c2d8f6741004b9c235f0b708844045a7b5f..7d25ba8324696583cd147705c1021aa695b09218 100755 --- a/Source/Processors/EventDetector.cpp +++ b/Source/Processors/EventDetector.cpp @@ -28,7 +28,7 @@ EventDetector::EventDetector() - : GenericProcessor("Event Detector"), threshold(200.0), bufferZone(5.0f), state(false) + : GenericProcessor("Event Detector"), threshold(200.0), bufferZone(5.0f), state(false) { @@ -38,12 +38,12 @@ EventDetector::EventDetector() EventDetector::~EventDetector() { - + } -void EventDetector::setParameter (int parameterIndex, float newValue) +void EventDetector::setParameter(int parameterIndex, float newValue) { Parameter& p = parameters.getReference(parameterIndex); @@ -55,8 +55,8 @@ void EventDetector::setParameter (int parameterIndex, float newValue) } -void EventDetector::process(AudioSampleBuffer &buffer, - MidiBuffer &events, +void EventDetector::process(AudioSampleBuffer& buffer, + MidiBuffer& events, int& nSamples) { @@ -75,7 +75,8 @@ void EventDetector::process(AudioSampleBuffer &buffer, state = true; - } else if ((*buffer.getSampleData(0, i) > -threshold + bufferZone) && state) + } + else if ((*buffer.getSampleData(0, i) > -threshold + bufferZone) && state) { state = false; } diff --git a/Source/Processors/EventDetector.h b/Source/Processors/EventDetector.h index 005e385b0443fec2e89adcb90162e3fca5f5bc30..79ba743821441d1bfa41a6dfc4cc37311b565306 100755 --- a/Source/Processors/EventDetector.h +++ b/Source/Processors/EventDetector.h @@ -24,10 +24,6 @@ #ifndef __EVENTDETECTOR_H_91811542__ #define __EVENTDETECTOR_H_91811542__ -#ifdef _WIN32 -#include <Windows.h> -#endif - #include "../../JuceLibraryCode/JuceHeader.h" #include "GenericProcessor.h" @@ -43,20 +39,20 @@ class EventDetector : public GenericProcessor { public: - - EventDetector(); - ~EventDetector(); - - void process (AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); - void setParameter (int parameterIndex, float newValue); + + EventDetector(); + ~EventDetector(); + + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); + void setParameter(int parameterIndex, float newValue); private: - float threshold; + float threshold; float bufferZone; bool state; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EventDetector); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EventDetector); }; diff --git a/Source/Processors/EventNode.cpp b/Source/Processors/EventNode.cpp index 7bca7dccddecfb9bf5dab0d79b824b9b4a5a60e3..a9a4e05a35b04fd6bc637256e6ae563027f86f66 100755 --- a/Source/Processors/EventNode.cpp +++ b/Source/Processors/EventNode.cpp @@ -27,16 +27,16 @@ #include "Channel.h" EventNode::EventNode() - : GenericProcessor("Event Generator"), accumulator(0), Hz(1) + : GenericProcessor("Event Generator"), accumulator(0), Hz(1) { - Array<var> hzValues; - hzValues.add(0.25f); - hzValues.add(0.5f); - hzValues.add(1.0f); - hzValues.add(2.0f); + Array<var> hzValues; + hzValues.add(0.25f); + hzValues.add(0.5f); + hzValues.add(1.0f); + hzValues.add(2.0f); - parameters.add(Parameter("Frequency",hzValues, 0, 0)); + parameters.add(Parameter("Frequency",hzValues, 0, 0)); } @@ -47,18 +47,18 @@ EventNode::~EventNode() AudioProcessorEditor* EventNode::createEditor() { - editor = new EventNodeEditor(this, true); - return editor; + editor = new EventNodeEditor(this, true); + return editor; } void EventNode::updateSettings() { - // add event channels + // add event channels - Channel* ch = new Channel(this, 1); - ch->name = "Trigger"; + Channel* ch = new Channel(this, 1); + ch->name = "Trigger"; - eventChannels.add(ch); + eventChannels.add(ch); } @@ -70,35 +70,35 @@ void EventNode::updateSettings() // } -void EventNode::process(AudioSampleBuffer &buffer, - MidiBuffer &events, - int& nSamples) +void EventNode::process(AudioSampleBuffer& buffer, + MidiBuffer& events, + int& nSamples) { - events.clear(); - + events.clear(); + //std::cout << "Adding message." << std::endl; - + Parameter& p1 = parameters.getReference(0); - + //std::cout << (float) p1[0] << std::endl; - for (int i = 0; i < buffer.getNumSamples(); i++) - { - accumulator += 1.0f; + for (int i = 0; i < buffer.getNumSamples(); i++) + { + accumulator += 1.0f; - if (accumulator > getSampleRate() / (float) p1[0]) - { - std::cout << "Adding message." << std::endl; - addEvent(events, // MidiBuffer - TTL, // eventType - i, // sampleNum - 1, // eventID - 1 // eventChannel - ); + if (accumulator > getSampleRate() / (float) p1[0]) + { + std::cout << "Adding message." << std::endl; + addEvent(events, // MidiBuffer + TTL, // eventType + i, // sampleNum + 1, // eventID + 1 // eventChannel + ); - accumulator = 0; - } + accumulator = 0; + } - } + } } diff --git a/Source/Processors/EventNode.h b/Source/Processors/EventNode.h index 594f57929a9daa8244f63bdae248c0542c6df75a..1f356c7f0df0ca8480ff3b5b2db37d8850da3cba 100755 --- a/Source/Processors/EventNode.h +++ b/Source/Processors/EventNode.h @@ -24,15 +24,12 @@ #ifndef __EVENTNODE_H_9B67A789__ #define __EVENTNODE_H_9B67A789__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "GenericProcessor.h" #include "Editors/EventNodeEditor.h" /** - + Generates events at regular intervals. @see GenericProcessor, EventNodeEditor @@ -43,27 +40,33 @@ class EventNode : public GenericProcessor { public: - - EventNode(); - ~EventNode(); - - void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); - //void setParameter (int parameterIndex, float newValue); - bool isSource() {return true;} + EventNode(); + ~EventNode(); + + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); + //void setParameter (int parameterIndex, float newValue); - int getDefaultNumOutputs() {return 0;} + bool isSource() + { + return true; + } + + int getDefaultNumOutputs() + { + return 0; + } void updateSettings(); - AudioProcessorEditor* createEditor(); - + AudioProcessorEditor* createEditor(); + private: - float accumulator; - float Hz; + float accumulator; + float Hz; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EventNode); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EventNode); }; diff --git a/Source/Processors/ExampleProcessor.cpp b/Source/Processors/ExampleProcessor.cpp index 54b922db393fb084128113a71e548e2f88287c95..f2f2115d4dfa4555cbfb2318e60f358895fcd37c 100644 --- a/Source/Processors/ExampleProcessor.cpp +++ b/Source/Processors/ExampleProcessor.cpp @@ -27,7 +27,7 @@ #include "ExampleProcessor.h" ExampleProcessor::ExampleProcessor() - : GenericProcessor("Example Processor") //, threshold(200.0), state(true) + : GenericProcessor("Example Processor") //, threshold(200.0), state(true) { @@ -37,12 +37,12 @@ ExampleProcessor::ExampleProcessor() ExampleProcessor::~ExampleProcessor() { - + } -void ExampleProcessor::setParameter (int parameterIndex, float newValue) +void ExampleProcessor::setParameter(int parameterIndex, float newValue) { //Parameter& p = parameters.getReference(parameterIndex); @@ -54,9 +54,9 @@ void ExampleProcessor::setParameter (int parameterIndex, float newValue) } -void ExampleProcessor::process(AudioSampleBuffer &buffer, - MidiBuffer &events, - int& nSamples) +void ExampleProcessor::process(AudioSampleBuffer& buffer, + MidiBuffer& events, + int& nSamples) { // for (int i = 0; i < nSamples; i++) diff --git a/Source/Processors/ExampleProcessor.h b/Source/Processors/ExampleProcessor.h index e6b92bf34b6e6c46489e9bcf83e876ee0d98c57c..cdc59987986a4c888e8f262941325bef7619bf36 100644 --- a/Source/Processors/ExampleProcessor.h +++ b/Source/Processors/ExampleProcessor.h @@ -35,7 +35,7 @@ This class serves as a template for creating new processors. - If this were a real processor, this comment section would be used to + If this were a real processor, this comment section would be used to describe the processor's function. @see GenericProcessor @@ -46,19 +46,25 @@ class ExampleProcessor : public GenericProcessor { public: - + /** The class constructor, used to initialize any members. */ - ExampleProcessor(); + ExampleProcessor(); /** The class destructor, used to deallocate memory */ - ~ExampleProcessor(); + ~ExampleProcessor(); /** Determines whether the processor is treated as a source. */ - bool isSource() {return false;} + bool isSource() + { + return false; + } /** Determines whether the processor is treated as a sink. */ - bool isSink() {return false;} - + bool isSink() + { + return false; + } + /** Defines the functionality of the processor. The process method is called every time a new data buffer is available. @@ -71,23 +77,23 @@ public: number of continous samples in the current buffer (which may differ from the size of the buffer). */ - void process (AudioSampleBuffer &buffer, MidiBuffer &events, int& nSamples); + void process(AudioSampleBuffer& buffer, MidiBuffer& events, int& nSamples); /** Any variables used by the "process" function _must_ be modified only through this method while data acquisition is active. If they are modified in any other way, the application will crash. */ - void setParameter (int parameterIndex, float newValue); + void setParameter(int parameterIndex, float newValue); private: // private members and methods go here - // + // // e.g.: // // float threshold; // bool state; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ExampleProcessor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ExampleProcessor); }; diff --git a/Source/Processors/FPGAOutput.cpp b/Source/Processors/FPGAOutput.cpp index 473e070b7a9440e9763a03e2e7ed0b9c89ee5fb1..b246fbc74dced3d5248c8fb5d676f817905289c1 100755 --- a/Source/Processors/FPGAOutput.cpp +++ b/Source/Processors/FPGAOutput.cpp @@ -28,16 +28,16 @@ #include "SourceNode.h" FPGAOutput::FPGAOutput() - : GenericProcessor("FPGA Output"), TTLchannel(3), - isEnabled(true), continuousStim(false) + : GenericProcessor("FPGA Output"), TTLchannel(3), + isEnabled(true), continuousStim(false) { - + Array<var> channelNumbers; channelNumbers.add(0); channelNumbers.add(3); channelNumbers.add(5); // - // channelNumbers.add(6); + // channelNumbers.add(6); parameters.add(Parameter("TTL channel",channelNumbers, 1, 0)); @@ -57,8 +57,8 @@ FPGAOutput::~FPGAOutput() AudioProcessorEditor* FPGAOutput::createEditor() { - editor = new FPGAOutputEditor(this, true); - return editor; + editor = new FPGAOutputEditor(this, true); + return editor; } void FPGAOutput::handleEvent(int eventType, MidiMessage& event, int sampleNum) @@ -72,7 +72,7 @@ void FPGAOutput::handleEvent(int eventType, MidiMessage& event, int sampleNum) int eventId = *(dataptr+2); int eventChannel = *(dataptr+3); - // std::cout << "FPGA output received event: " << eventNodeId << " " << eventId << " " << eventChannel << std::endl; + // std::cout << "FPGA output received event: " << eventNodeId << " " << eventId << " " << eventChannel << std::endl; if (eventId == 1 && eventChannel == TTLchannel) // channel 3 only at the moment { @@ -81,54 +81,58 @@ void FPGAOutput::handleEvent(int eventType, MidiMessage& event, int sampleNum) if (!continuousStim) startTimer(5); // pulse width - // else + // else // startTimer(25); // pulse width - } else if (eventId == 0 && eventChannel == TTLchannel)// && eventChannel == TTLchannel) + } + else if (eventId == 0 && eventChannel == TTLchannel) // && eventChannel == TTLchannel) { if (continuousStim) - { /// this isn't working + { + /// this isn't working sendActionMessage("LO"); isEnabled = true; - // stopTimer(); + // stopTimer(); } } - + } - + } void FPGAOutput::updateSettings() { removeAllActionListeners(); - + GenericProcessor* src; GenericProcessor* lastSrc; - + lastSrc = getSourceNode(); src = getSourceNode(); - + while (src != 0) { lastSrc = src; src = lastSrc->getSourceNode(); } - + if (lastSrc != 0) { SourceNode* s = (SourceNode*) lastSrc; addActionListener(s); std::cout << "FPGA Output node communicating with " << lastSrc->getName() << std::endl; - } else { + } + else + { std::cout << "FPGA Output couldn't find a source" << std::endl; } - + //dataThread = (FPGAThread*) s->getThread(); } -void FPGAOutput::setParameter (int parameterIndex, float newValue) +void FPGAOutput::setParameter(int parameterIndex, float newValue) { //std::cout << "FPGAOutput received parameter change notification." << std::endl; @@ -136,52 +140,59 @@ void FPGAOutput::setParameter (int parameterIndex, float newValue) if (parameterIndex == 0) { TTLchannel = int(newValue); - } else if (parameterIndex == 1) + } + else if (parameterIndex == 1) { if (newValue == 0.0f) { continuousStim = false; - } else { + } + else + { continuousStim = true; } - } + } } -void FPGAOutput::process(AudioSampleBuffer &buffer, - MidiBuffer &events, - int& nSamples) +void FPGAOutput::process(AudioSampleBuffer& buffer, + MidiBuffer& events, + int& nSamples) { - - checkForEvents(events); - + + checkForEvents(events); + } void FPGAOutput::timerCallback() { - //dataThread->setOutputLow(); + //dataThread->setOutputLow(); if (!continuousStim) { sendActionMessage("LO"); - + isEnabled = true; stopTimer(); - } else { + } + else + { if (isEnabled) { sendActionMessage("HI"); isEnabled = false; - } else { + } + else + { sendActionMessage("LO"); isEnabled = true; } - + } - + } diff --git a/Source/Processors/FPGAOutput.h b/Source/Processors/FPGAOutput.h index d488d0a2f21a08657d61f92720ac514c37d40194..a973a6681346d2a4ef422714561b4134454f190d 100755 --- a/Source/Processors/FPGAOutput.h +++ b/Source/Processors/FPGAOutput.h @@ -24,10 +24,6 @@ #ifndef __FPGAOUTPUT_H_33275017__ #define __FPGAOUTPUT_H_33275017__ -#ifdef _WIN32 -#include <Windows.h> -#endif - #include "../../JuceLibraryCode/JuceHeader.h" #include "GenericProcessor.h" #include "Editors/FPGAOutputEditor.h" @@ -44,41 +40,44 @@ class FPGAOutput : public GenericProcessor, - public Timer - //public ActionBroadcaster + public Timer + //public ActionBroadcaster { public: - - FPGAOutput(); - ~FPGAOutput(); - - void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); - void setParameter (int parameterIndex, float newValue); + + FPGAOutput(); + ~FPGAOutput(); + + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); + void setParameter(int parameterIndex, float newValue); void handleEvent(int eventType, MidiMessage& event, int sampleNum); - - AudioProcessorEditor* createEditor(); - bool isSink() {return true;} - - void updateSettings(); - + AudioProcessorEditor* createEditor(); + + bool isSink() + { + return true; + } + + void updateSettings(); + private: int TTLchannel; - void timerCallback(); - + void timerCallback(); + bool isEnabled; bool continuousStim; - + FPGAThread* dataThread; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FPGAOutput); - - + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FPGAOutput); + + }; diff --git a/Source/Processors/FilterNode.cpp b/Source/Processors/FilterNode.cpp index 22f214577aee3bf1ab950403ceefb935ae3f216f..c83a0e716a405ec60549d18463b881cbcf84c65f 100755 --- a/Source/Processors/FilterNode.cpp +++ b/Source/Processors/FilterNode.cpp @@ -26,41 +26,41 @@ #include "Editors/FilterEditor.h" FilterNode::FilterNode() - : GenericProcessor("Bandpass Filter") + : GenericProcessor("Bandpass Filter") { - Array<var> lowCutValues; - lowCutValues.add(1.0f); - lowCutValues.add(4.0f); - lowCutValues.add(100.0f); - lowCutValues.add(600.0f); + Array<var> lowCutValues; + lowCutValues.add(1.0f); + lowCutValues.add(4.0f); + lowCutValues.add(100.0f); + lowCutValues.add(600.0f); - parameters.add(Parameter("low cut",lowCutValues, 1, 0)); + parameters.add(Parameter("low cut",lowCutValues, 1, 0)); - Array<var> highCutValues; - highCutValues.add(1000.0f); - highCutValues.add(3000.0f); - highCutValues.add(6000.0f); - highCutValues.add(9000.0f); + Array<var> highCutValues; + highCutValues.add(1000.0f); + highCutValues.add(3000.0f); + highCutValues.add(6000.0f); + highCutValues.add(9000.0f); - parameters.add(Parameter("high cut",highCutValues, 0, 1)); + parameters.add(Parameter("high cut",highCutValues, 0, 1)); } FilterNode::~FilterNode() { - filters.clear(); + filters.clear(); } AudioProcessorEditor* FilterNode::createEditor() { - editor = new FilterEditor(this, true); - //setEditor(filterEditor); - - std::cout << "Creating editor." << std::endl; + editor = new FilterEditor(this, true); + //setEditor(filterEditor); - return editor; + std::cout << "Creating editor." << std::endl; + + return editor; } @@ -119,103 +119,107 @@ AudioProcessorEditor* FilterNode::createEditor() // filter->process() void FilterNode::updateSettings() -{ +{ + + if (getNumInputs() < 100 && getNumInputs() != filters.size()) + { + + filters.clear(); - if (getNumInputs() < 100 && getNumInputs() != filters.size()) { + for (int n = 0; n < getNumInputs(); n++) + { + std::cout << "Creating filter number " << n << std::endl; - filters.clear(); + filters.add(new Dsp::SmoothedFilterDesign + <Dsp::Butterworth::Design::BandPass // design type + <3>, // order + 1, // number of channels (must be const) + Dsp::DirectFormII> // realization + (1)); - for (int n = 0; n < getNumInputs(); n++) - { - std::cout << "Creating filter number " << n << std::endl; + Parameter& p1 = parameters.getReference(0); + p1.setValue(4.0f, n); - filters.add(new Dsp::SmoothedFilterDesign - <Dsp::Butterworth::Design::BandPass // design type - <3>, // order - 1, // number of channels (must be const) - Dsp::DirectFormII> // realization - (1)); + Parameter& p2 = parameters.getReference(1); + p2.setValue(1000.0f, n); - Parameter& p1 = parameters.getReference(0); - p1.setValue(4.0f, n); + setFilterParameters(4.0f, 1000.0f, n); + } - Parameter& p2 = parameters.getReference(1); - p2.setValue(1000.0f, n); - - setFilterParameters(4.0f, 1000.0f, n); - } + } - } - } void FilterNode::setFilterParameters(double lowCut, double highCut, int chan) { - Dsp::Params params; - params[0] = getSampleRate(); // sample rate - params[1] = 3; // order - params[2] = (highCut + lowCut)/2; // center frequency - params[3] = highCut - lowCut; // bandwidth + Dsp::Params params; + params[0] = getSampleRate(); // sample rate + params[1] = 3; // order + params[2] = (highCut + lowCut)/2; // center frequency + params[3] = highCut - lowCut; // bandwidth - if (filters.size() > chan) - filters[chan]->setParams (params); + if (filters.size() > chan) + filters[chan]->setParams(params); } -void FilterNode::setParameter (int parameterIndex, float newValue) +void FilterNode::setParameter(int parameterIndex, float newValue) { - if (newValue <= 0.01 || newValue >= 10000.0f) - return; + if (newValue <= 0.01 || newValue >= 10000.0f) + return; - std::cout << "Setting channel " << currentChannel;// << std::endl; + std::cout << "Setting channel " << currentChannel;// << std::endl; - if (parameterIndex == 0) - { - std::cout << " low cut to "; - } else { - std::cout << " high cut to "; - } + if (parameterIndex == 0) + { + std::cout << " low cut to "; + } + else + { + std::cout << " high cut to "; + } - std::cout << newValue << std::endl; + std::cout << newValue << std::endl; - //if (parameterIndex) -// - Parameter& p = parameters.getReference(parameterIndex); + //if (parameterIndex) + // + Parameter& p = parameters.getReference(parameterIndex); - p.setValue(newValue, currentChannel); + p.setValue(newValue, currentChannel); - Parameter& p1 = parameters.getReference(0); - Parameter& p2 = parameters.getReference(1); + Parameter& p1 = parameters.getReference(0); + Parameter& p2 = parameters.getReference(1); - std::cout << float(p1[currentChannel]) << " "; - std::cout << float(p2[currentChannel]) << std::endl; + std::cout << float(p1[currentChannel]) << " "; + std::cout << float(p2[currentChannel]) << std::endl; - setFilterParameters(float(p1[currentChannel]), - float(p2[currentChannel]), - currentChannel); + setFilterParameters(float(p1[currentChannel]), + float(p2[currentChannel]), + currentChannel); - // if (parameterIndex == 0) { - // parameters[0].setValue(newValue, currentChannel); - // setFilterParameters(newValue, parameters[0][currentChannel], currentChannel); - // } else { - // parameters[1].setValue(newValue, currentChannel); - // setFilterParameters(lowCuts[currentChannel], newValue, currentChannel); - // } + // if (parameterIndex == 0) { + // parameters[0].setValue(newValue, currentChannel); + // setFilterParameters(newValue, parameters[0][currentChannel], currentChannel); + // } else { + // parameters[1].setValue(newValue, currentChannel); + // setFilterParameters(lowCuts[currentChannel], newValue, currentChannel); + // } } -void FilterNode::process(AudioSampleBuffer &buffer, - MidiBuffer &midiMessages, - int& nSamples) +void FilterNode::process(AudioSampleBuffer& buffer, + MidiBuffer& midiMessages, + int& nSamples) { - for (int n = 0; n < getNumOutputs(); n++) { - float* ptr = buffer.getSampleData(n); - filters[n]->process (nSamples, &ptr); + for (int n = 0; n < getNumOutputs(); n++) + { + float* ptr = buffer.getSampleData(n); + filters[n]->process(nSamples, &ptr); } } diff --git a/Source/Processors/FilterNode.h b/Source/Processors/FilterNode.h index 9979d50d7fa907a83593a280281e5da4f5f3c9ca..bcde762ea33c0f0dad0b00626c6a8ac6715c5597 100755 --- a/Source/Processors/FilterNode.h +++ b/Source/Processors/FilterNode.h @@ -24,9 +24,6 @@ #ifndef __FILTERNODE_H_CED428E__ #define __FILTERNODE_H_CED428E__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "../Dsp/Dsp.h" #include "GenericProcessor.h" @@ -45,27 +42,30 @@ class FilterNode : public GenericProcessor { public: - - FilterNode(); - ~FilterNode(); - - void process (AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); - void setParameter (int parameterIndex, float newValue); - AudioProcessorEditor* createEditor(); + FilterNode(); + ~FilterNode(); - bool hasEditor() const {return true;} + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); + void setParameter(int parameterIndex, float newValue); + + AudioProcessorEditor* createEditor(); + + bool hasEditor() const + { + return true; + } void updateSettings(); - + private: - Array<double> lowCuts, highCuts; - OwnedArray<Dsp::Filter> filters; + Array<double> lowCuts, highCuts; + OwnedArray<Dsp::Filter> filters; - void setFilterParameters(double, double, int); + void setFilterParameters(double, double, int); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FilterNode); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FilterNode); }; diff --git a/Source/Processors/GenericProcessor.cpp b/Source/Processors/GenericProcessor.cpp index d8d2d1fa77acf5f9ec300b56e9a49f1de2d9e8c4..785780fa0245cf57de29f03e3509a8c41ded73d0 100755 --- a/Source/Processors/GenericProcessor.cpp +++ b/Source/Processors/GenericProcessor.cpp @@ -25,9 +25,9 @@ #include "../UI/UIComponent.h" GenericProcessor::GenericProcessor(const String& name_) : - sourceNode(0), destNode(0), isEnabled(true), wasConnected(false), - nextAvailableChannel(0), saveOrder(-1), loadOrder(-1), currentChannel(-1), - name(name_) + sourceNode(0), destNode(0), isEnabled(true), wasConnected(false), + nextAvailableChannel(0), saveOrder(-1), loadOrder(-1), currentChannel(-1), + name(name_) { } @@ -37,58 +37,58 @@ GenericProcessor::~GenericProcessor() AudioProcessorEditor* GenericProcessor::createEditor() { - editor = new GenericEditor (this, true); - return editor; + editor = new GenericEditor(this, true); + return editor; } Parameter& GenericProcessor::getParameterByName(String name_) { - // doesn't work - for (int i = 0; i < getNumParameters(); i++) - { + // doesn't work + for (int i = 0; i < getNumParameters(); i++) + { - Parameter& p = parameters.getReference(i); - const String parameterName = p.getName(); + Parameter& p = parameters.getReference(i); + const String parameterName = p.getName(); - if (parameterName.compare(name_) == 0) // fails at this point - return p;//parameters.getReference(i); - } + if (parameterName.compare(name_) == 0) // fails at this point + return p;//parameters.getReference(i); + } - static Parameter nullParam = Parameter("VOID", false, -1); + static Parameter nullParam = Parameter("VOID", false, -1); - return nullParam; + return nullParam; } Parameter& GenericProcessor::getParameterReference(int parameterIndex) { - return parameters.getReference(parameterIndex); + return parameters.getReference(parameterIndex); } -void GenericProcessor::setParameter (int parameterIndex, float newValue) +void GenericProcessor::setParameter(int parameterIndex, float newValue) { std::cout << "Setting parameter" << std::endl; - - if (currentChannel >= 0) - { - Parameter& p = parameters.getReference(parameterIndex); - p.setValue(newValue, currentChannel); - } + + if (currentChannel >= 0) + { + Parameter& p = parameters.getReference(parameterIndex); + p.setValue(newValue, currentChannel); + } } -const String GenericProcessor::getParameterName (int parameterIndex) +const String GenericProcessor::getParameterName(int parameterIndex) { Parameter& p=parameters.getReference(parameterIndex); return p.getName(); } -const String GenericProcessor::getParameterText (int parameterIndex) +const String GenericProcessor::getParameterText(int parameterIndex) { - Parameter& p = parameters.getReference(parameterIndex); - return p.getDescription(); + Parameter& p = parameters.getReference(parameterIndex); + return p.getDescription(); } var GenericProcessor::getParameterVar(int parameterIndex, int parameterChannel) @@ -96,48 +96,49 @@ var GenericProcessor::getParameterVar(int parameterIndex, int parameterChannel) Parameter& p=parameters.getReference(parameterIndex); return p.operator[](parameterChannel); } - -void GenericProcessor::prepareToPlay (double sampleRate_, int estimatedSamplesPerBlock) + +void GenericProcessor::prepareToPlay(double sampleRate_, int estimatedSamplesPerBlock) { } -void GenericProcessor::releaseResources() -{ - // use the disable() function instead - // releaseResources() is called by Juce at unpredictable times - // disable() is only called by the ProcessorGraph at the end of acquisition +void GenericProcessor::releaseResources() +{ + // use the disable() function instead + // releaseResources() is called by Juce at unpredictable times + // disable() is only called by the ProcessorGraph at the end of acquisition } int GenericProcessor::getNextChannel(bool increment) { - int chan = nextAvailableChannel; - - //std::cout << "Next channel: " << chan << ", num inputs: " << getNumInputs() << std::endl; - - if (increment) - nextAvailableChannel++; - - if (chan < getNumInputs()) - return chan; - else - return -1; + int chan = nextAvailableChannel; + + //std::cout << "Next channel: " << chan << ", num inputs: " << getNumInputs() << std::endl; + + if (increment) + nextAvailableChannel++; + + if (chan < getNumInputs()) + return chan; + else + return -1; } void GenericProcessor::resetConnections() { - nextAvailableChannel = 0; + nextAvailableChannel = 0; - wasConnected = false; + wasConnected = false; } -void GenericProcessor::setNumSamples(MidiBuffer& events, int sampleIndex) { +void GenericProcessor::setNumSamples(MidiBuffer& events, int sampleIndex) +{ - uint8 data[2]; + uint8 data[2]; - data[0] = BUFFER_SIZE; // most-significant byte + data[0] = BUFFER_SIZE; // most-significant byte data[1] = nodeId; // least-significant byte events.addEvent(data, // spike data @@ -146,82 +147,93 @@ void GenericProcessor::setNumSamples(MidiBuffer& events, int sampleIndex) { } -int GenericProcessor::getNumSamples(MidiBuffer& events) { +int GenericProcessor::getNumSamples(MidiBuffer& events) +{ + + int numRead = 0; - int numRead = 0; + if (events.getNumEvents() > 0) + { - if (events.getNumEvents() > 0) - { - - // int m = events.getNumEvents(); + // int m = events.getNumEvents(); - //std::cout << getName() << " received " << m << " events." << std::endl; + //std::cout << getName() << " received " << m << " events." << std::endl; - MidiBuffer::Iterator i (events); - MidiMessage message(0xf4); + MidiBuffer::Iterator i(events); + MidiMessage message(0xf4); - int samplePosition = -5; + int samplePosition = -5; - while (i.getNextEvent (message, samplePosition)) { - - const uint8* dataptr = message.getRawData(); + while (i.getNextEvent(message, samplePosition)) + { - if (*dataptr == BUFFER_SIZE) - { - numRead = message.getTimeStamp(); - } - } - } + const uint8* dataptr = message.getRawData(); - return numRead; + if (*dataptr == BUFFER_SIZE) + { + numRead = message.getTimeStamp(); + } + } + } + + return numRead; } void GenericProcessor::setSourceNode(GenericProcessor* sn) { - //std::cout << "My name is " << getName() << ". Setting source node." << std::endl; - - if (!isSource()) - { - // std::cout << " I am not a source." << std::endl; - - if (sn != 0) - { - - // std::cout << " The source is not blank." << std::endl; - - if (!sn->isSink()) - { - // std::cout << " The source is not a sink." << std::endl; - - if (sourceNode != sn) { - - // std::cout << " The source is new and named " << sn->getName() << std::endl; - - if (this->isMerger()) - setMergerSourceNode(sn); - else - sourceNode = sn; - - sn->setDestNode(this); - - } else { - // std::cout << " The source node is not new." << std::endl; - } - } else { - // std::cout << " The source is a sink." << std::endl; - sourceNode = 0; - } - - } else { - // std::cout << " The source is blank." << std::endl; - sourceNode = 0; - } - } else { - // std::cout << " I am a source. I can't have a source node." << std::endl; - - if (sn != 0) - sn->setDestNode(this); - } + //std::cout << "My name is " << getName() << ". Setting source node." << std::endl; + + if (!isSource()) + { + // std::cout << " I am not a source." << std::endl; + + if (sn != 0) + { + + // std::cout << " The source is not blank." << std::endl; + + if (!sn->isSink()) + { + // std::cout << " The source is not a sink." << std::endl; + + if (sourceNode != sn) + { + + // std::cout << " The source is new and named " << sn->getName() << std::endl; + + if (this->isMerger()) + setMergerSourceNode(sn); + else + sourceNode = sn; + + sn->setDestNode(this); + + } + else + { + // std::cout << " The source node is not new." << std::endl; + } + } + else + { + // std::cout << " The source is a sink." << std::endl; + sourceNode = 0; + } + + } + else + { + // std::cout << " The source is blank." << std::endl; + sourceNode = 0; + } + } + else + { + // std::cout << " I am a source. I can't have a source node." << std::endl; + + if (sn != 0) + sn->setDestNode(this); + } } @@ -229,127 +241,137 @@ void GenericProcessor::setDestNode(GenericProcessor* dn) { -// std::cout << "My name is " << getName() << ". Setting dest node." << std::endl; + // std::cout << "My name is " << getName() << ". Setting dest node." << std::endl; - if (!isSink()) - { - // std::cout << " I am not a sink." << std::endl; + if (!isSink()) + { + // std::cout << " I am not a sink." << std::endl; - if (dn != 0) - { - // std::cout << " The dest node is not blank." << std::endl; + if (dn != 0) + { + // std::cout << " The dest node is not blank." << std::endl; - if (!dn->isSource()) - { + if (!dn->isSource()) + { - // std::cout << " The dest node is not a source." << std::endl; + // std::cout << " The dest node is not a source." << std::endl; - if (destNode != dn) - { - // std::cout << " The dest node is new and named " << dn->getName() << std::endl; -// - if (this->isSplitter()) - setSplitterDestNode(dn); - else - destNode = dn; + if (destNode != dn) + { + // std::cout << " The dest node is new and named " << dn->getName() << std::endl; + // + if (this->isSplitter()) + setSplitterDestNode(dn); + else + destNode = dn; - dn->setSourceNode(this); + dn->setSourceNode(this); - } else { - // std::cout << " The dest node is not new." << std::endl; - } - } else { + } + else + { + // std::cout << " The dest node is not new." << std::endl; + } + } + else + { - // std::cout << " The dest node is a source." << std::endl; + // std::cout << " The dest node is a source." << std::endl; - destNode = 0; - } - } else { - // std::cout << " The dest node is blank." << std::endl; + destNode = 0; + } + } + else + { + // std::cout << " The dest node is blank." << std::endl; - destNode = 0; - } - } else { + destNode = 0; + } + } + else + { - //std::cout << " I am a sink, I can't have a dest node." << std::endl; - //if (dn != 0) - // dn->setSourceNode(this); - } + //std::cout << " I am a sink, I can't have a dest node." << std::endl; + //if (dn != 0) + // dn->setSourceNode(this); + } } void GenericProcessor::clearSettings() { - settings.originalSource = 0; - settings.numInputs = 0; - settings.numOutputs = 0; - settings.sampleRate = getDefaultSampleRate(); + settings.originalSource = 0; + settings.numInputs = 0; + settings.numOutputs = 0; + settings.sampleRate = getDefaultSampleRate(); - channels.clear(); - eventChannels.clear(); + channels.clear(); + eventChannels.clear(); } void GenericProcessor::update() { - std::cout << getName() << " updating settings." << std::endl; - - clearSettings(); - - if (sourceNode != 0) - { - // everything is inherited except numOutputs - settings = sourceNode->settings; - settings.numInputs = settings.numOutputs; - settings.numOutputs = settings.numInputs; - - for (int i = 0; i < sourceNode->channels.size(); i++) - { - Channel* sourceChan = sourceNode->channels[i]; - Channel* ch = new Channel(*sourceChan); - ch->setProcessor(this); - ch->bitVolts = ch->bitVolts*getDefaultBitVolts(); - channels.add(ch); - } - - for (int i = 0; i < sourceNode->eventChannels.size(); i++) - { - Channel* sourceChan = sourceNode->eventChannels[i]; - Channel* ch = new Channel(*sourceChan); - eventChannels.add(ch); - } - - } else { - - settings.numOutputs = getDefaultNumOutputs(); - settings.sampleRate = getDefaultSampleRate(); - - for (int i = 0; i < getNumOutputs(); i++) - { - Channel* ch = new Channel(this, i); - ch->sampleRate = getDefaultSampleRate(); - ch->bitVolts = getDefaultBitVolts(); - - channels.add(ch); - } - - } - - if (this->isSink()) - { - settings.numOutputs = 0; - } - - updateSettings(); // custom settings code - - // required for the ProcessorGraph to know the - // details of this processor: - setPlayConfigDetails(getNumInputs(), // numIns - getNumOutputs(), // numOuts - 44100.0, // sampleRate - 128); // blockSize - - editor->update(); // update editor settings + std::cout << getName() << " updating settings." << std::endl; + + clearSettings(); + + if (sourceNode != 0) + { + // everything is inherited except numOutputs + settings = sourceNode->settings; + settings.numInputs = settings.numOutputs; + settings.numOutputs = settings.numInputs; + + for (int i = 0; i < sourceNode->channels.size(); i++) + { + Channel* sourceChan = sourceNode->channels[i]; + Channel* ch = new Channel(*sourceChan); + ch->setProcessor(this); + ch->bitVolts = ch->bitVolts*getDefaultBitVolts(); + channels.add(ch); + } + + for (int i = 0; i < sourceNode->eventChannels.size(); i++) + { + Channel* sourceChan = sourceNode->eventChannels[i]; + Channel* ch = new Channel(*sourceChan); + eventChannels.add(ch); + } + + } + else + { + + settings.numOutputs = getDefaultNumOutputs(); + settings.sampleRate = getDefaultSampleRate(); + + for (int i = 0; i < getNumOutputs(); i++) + { + Channel* ch = new Channel(this, i); + ch->sampleRate = getDefaultSampleRate(); + ch->bitVolts = getDefaultBitVolts(); + + channels.add(ch); + } + + } + + if (this->isSink()) + { + settings.numOutputs = 0; + } + + updateSettings(); // custom settings code + + // required for the ProcessorGraph to know the + // details of this processor: + setPlayConfigDetails(getNumInputs(), // numIns + getNumOutputs(), // numOuts + 44100.0, // sampleRate + 128); // blockSize + + editor->update(); // update editor settings } @@ -385,76 +407,77 @@ void GenericProcessor::update() void GenericProcessor::enableEditor() { - GenericEditor* ed = getEditor(); + GenericEditor* ed = getEditor(); - if (ed != 0) - ed->startAcquisition(); + if (ed != 0) + ed->startAcquisition(); } void GenericProcessor::disableEditor() { - GenericEditor* ed = getEditor(); + GenericEditor* ed = getEditor(); - if (ed != 0) - ed->stopAcquisition(); + if (ed != 0) + ed->stopAcquisition(); } int GenericProcessor::checkForEvents(MidiBuffer& midiMessages) { - if (midiMessages.getNumEvents() > 0) - { - - // int m = midiMessages.getNumEvents(); - //std::cout << m << " events received by node " << getNodeId() << std::endl; + if (midiMessages.getNumEvents() > 0) + { + + // int m = midiMessages.getNumEvents(); + //std::cout << m << " events received by node " << getNodeId() << std::endl; - MidiBuffer::Iterator i (midiMessages); - MidiMessage message(0xf4); + MidiBuffer::Iterator i(midiMessages); + MidiMessage message(0xf4); - int samplePosition = 0; - i.setNextSamplePosition(samplePosition); + int samplePosition = 0; + i.setNextSamplePosition(samplePosition); - while (i.getNextEvent (message, samplePosition)) { - - const uint8* dataptr = message.getRawData(); + while (i.getNextEvent(message, samplePosition)) + { - handleEvent(*dataptr, message, samplePosition); + const uint8* dataptr = message.getRawData(); - } + handleEvent(*dataptr, message, samplePosition); - } + } - return -1; + } + + return -1; } void GenericProcessor::addEvent(MidiBuffer& eventBuffer, - uint8 type, - int sampleNum, - uint8 eventId, - uint8 eventChannel, - uint8 numBytes, - uint8* eventData) + uint8 type, + int sampleNum, + uint8 eventId, + uint8 eventChannel, + uint8 numBytes, + uint8* eventData) { - uint8 *data = new uint8[4+numBytes]; + uint8* data = new uint8[4+numBytes]; - data[0] = type; // event type + data[0] = type; // event type data[1] = nodeId; // processor ID automatically added data[2] = eventId; // event ID data[3] = eventChannel; // event channel memcpy(&data[4], eventData, numBytes); eventBuffer.addEvent(data, // spike data - sizeof(data), // total bytes - sampleNum); // sample index + sizeof(data), // total bytes + sampleNum); // sample index //if (type == TTL) // std::cout << "Adding event for channel " << (int) eventChannel << " with ID " << (int) eventId << std::endl; - delete data; + delete data; } // void GenericProcessor::unpackEvent(int type, @@ -464,63 +487,68 @@ void GenericProcessor::addEvent(MidiBuffer& eventBuffer, // } -void GenericProcessor::processBlock (AudioSampleBuffer &buffer, MidiBuffer &eventBuffer) +void GenericProcessor::processBlock(AudioSampleBuffer& buffer, MidiBuffer& eventBuffer) { - - int nSamples = getNumSamples(eventBuffer); // removes first value from midimessages - process(buffer, eventBuffer, nSamples); + int nSamples = getNumSamples(eventBuffer); // removes first value from midimessages + + process(buffer, eventBuffer, nSamples); - setNumSamples(eventBuffer, nSamples); // adds it back, - // even if it's unchanged + setNumSamples(eventBuffer, nSamples); // adds it back, + // even if it's unchanged } -void GenericProcessor::saveParametersToChannelsXML(juce::XmlElement* channelParent, int channelNumber){ +void GenericProcessor::saveParametersToChannelsXML(juce::XmlElement* channelParent, int channelNumber) +{ //std::cout <<"Creating Parameters" << std::endl; int maxsize=parameters.size(); String parameterName; String parameterValue; XmlElement* parameterChildNode; - - for (int n=0; n<maxsize; n++){ + + for (int n=0; n<maxsize; n++) + { parameterName=getParameterName(n); - + parameterChildNode = channelParent->createNewChildElement("PARAMETER"); parameterChildNode->setAttribute("name", parameterName); - + var parameterVar=getParameterVar(n, channelNumber-1); parameterValue=parameterVar.toString(); parameterChildNode->addTextElement(parameterValue); } - + } -void GenericProcessor::saveToXML(juce::XmlElement* parentElement){ +void GenericProcessor::saveToXML(juce::XmlElement* parentElement) +{ std::cout <<"Creating Channels" << std::endl; String channelName; XmlElement* channelChildNode; int numChannels=channels.size(); //I'm unsure whether or not the name or XML elements should include whether they're normal or event channels–it probably depends on loading implementation - for (int i=1; i<=numChannels; i++) { + for (int i=1; i<=numChannels; i++) + { channelName=/**String("Ch:")+*/String(i); channelChildNode = parentElement->createNewChildElement("CHANNEL"); channelChildNode->setAttribute("name", channelName); saveParametersToChannelsXML(channelChildNode, i); } - + int numEventChannels=eventChannels.size(); - - for (int i=1; i<=numEventChannels; i++) { - + + for (int i=1; i<=numEventChannels; i++) + { + channelName=/**String("EventCh:")+*/String(i); channelChildNode = parentElement->createNewChildElement("EVENTCHANNEL"); channelChildNode->setAttribute("name", channelName); saveParametersToChannelsXML(channelChildNode, i); } - - + + } const String GenericProcessor::unusedNameString("xxx-UNUSED-OPEN-EPHYS-xxx"); diff --git a/Source/Processors/GenericProcessor.h b/Source/Processors/GenericProcessor.h index 5a316ca6eee55737f3c5c9c7a01099a905e53ef3..ac96c1d0a7f06143dc021fdc741938567d9be71d 100755 --- a/Source/Processors/GenericProcessor.h +++ b/Source/Processors/GenericProcessor.h @@ -25,9 +25,6 @@ #define __GENERICPROCESSOR_H_1F469DAF__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "Editors/GenericEditor.h" #include "Parameter.h" @@ -44,7 +41,7 @@ class Parameter; class Channel; /** - + Abstract base class for creating processors. All processors must be derived from this class, and must provide an @@ -61,386 +58,509 @@ class Channel; */ class GenericProcessor : public AudioProcessor, - public AccessClass + public AccessClass { public: - /* - ------------------------------------------------------------------------ - ----------------------------- JUCE METHODS ----------------------------- - ------------------------------------------------------------------------ - */ - - /** Constructor (sets the processor's name). */ - GenericProcessor(const String& name_); - - /** Destructor. */ - virtual ~GenericProcessor(); - - /** Returns the name of the processor. */ - const String getName() const {return name;} - - /** Called by JUCE as soon as a processor is created, as well as before the start of audio callbacks. To avoid starting data acquisition prematurely, use the enable() function instead. - */ - virtual void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock); - - /** Called by JUCE as soon as audio callbacks end. Use disable() instead. */ - void releaseResources(); - - /** Allows parameters to change while acquisition is active. If the user wants - to change ANY variables that are used within the process() method, this must - be done through setParameter(). Otherwise the application will crash. */ - virtual void setParameter (int parameterIndex, float newValue); - - /** Creates a GenericEditor.*/ - virtual AudioProcessorEditor* createEditor(); - - /** The default is to have no editor.*/ - bool hasEditor() const {return false;} - - /** JUCE method. Not used.*/ - void reset() {} - - /** JUCE method. Not used.*/ - void setCurrentProgramStateInformation(const void* data, int sizeInBytes) {} - - /** JUCE method. Not used.*/ - void setStateInformation(const void* data, int sizeInBytes) {} - - /** JUCE method. Not used.*/ - void getCurrentProgramStateInformation(MemoryBlock &destData) {} - - /** JUCE method. Not used.*/ - void getStateInformation (MemoryBlock &destData) {} - - /** JUCE method. Not used.*/ - void changeProgramName (int index, const String &newName) {} - - /** JUCE method. Not used.*/ - void setCurrentProgram (int index) {} - - /** Returns the name of the input channel with a given index.*/ - virtual const String getInputChannelName (int channelIndex) const { - return GenericProcessor::unusedNameString; - } - - /** Returns the name of the output channel with a given index.*/ - virtual const String getOutputChannelName (int channelIndex) const { - return GenericProcessor::unusedNameString; - } - - /** Returns the name of the parameter with a given index.*/ - const String getParameterName (int parameterIndex); - - /** Returns additional details about the parameter with a given index.*/ - const String getParameterText (int parameterIndex); - - /** Returns the current value of a parameter with a given index. - Currently set to always return 1. See getParameterVar below*/ - float getParameter (int parameterIndex){return 1.0;}; - - /**Returns the current value of a parameter with a give index */ - var getParameterVar (int parameterIndex, int parameterChannel); - - /** JUCE method. Not used.*/ - const String getProgramName (int index) {return "";} - - /** JUCE method. Not used.*/ - bool isInputChannelStereoPair (int index) const {return true;} - - /** JUCE method. Not used.*/ - bool isOutputChannelStereoPair (int index) const {return true;} - - /** All processors can accept MIDI (event) data by default.*/ - bool acceptsMidi () const {return true;} - - /** All processors can produce MIDI (event) data by default.*/ - bool producesMidi () const {return true;} - - /** JUCE method. Not used.*/ - bool isParameterAutomatable(int parameterIndex) {return false;} - - /** JUCE method. Not used.*/ - bool isMetaParameter(int parameterIndex) {return false;} - - /** Returns the number of user-editable parameters for this processor.*/ - int getNumParameters() {return parameters.size();} - - /** JUCE method. Not used.*/ - int getNumPrograms() {return 0;} - - /** JUCE method. Not used.*/ - int getCurrentProgram() {return 0;} - - /** JUCE method. Not used.*/ - bool silenceInProducesSilenceOut() const {return false;} - - /** JUCE method. Not used.*/ - double getTailLengthSeconds() const {return 1.0f;} - - /* - ------------------------------------------------------------------------ - ---------------------------- CUSTOM METHODS ---------------------------- - ------------------------------------------------------------------------ - */ - - /** Defines a processor's functionality. - - This is the most important function for each - processor, as it determines how it creates, modifies, or responds to incoming data - streams. Rather than use the default JUCE processBlock() method, processBlock() - automatically calls process() in order to add the 'nSamples' variable to indicate - the number of samples in the current buffer. - */ - virtual void process(AudioSampleBuffer& continuousBuffer, - MidiBuffer& eventBuffer, - int& nSamples) = 0; - - /** Pointer to a processor's immediate source node.*/ - GenericProcessor* sourceNode; - - /** Pointer to a processor's immediate destination.*/ - GenericProcessor* destNode; - - /** Returns the sample rate for a processor (assumes the same rate for all channels).*/ - virtual float getSampleRate() {return settings.sampleRate;} - - /** Returns the default sample rate, in case a processor has no source (or is itself a source).*/ - virtual float getDefaultSampleRate() {return 44100.0;} - - /** Returns the number of inputs to a processor.*/ - virtual int getNumInputs() {return settings.numInputs;} - - /** Returns the number of outputs from a processor.*/ - virtual int getNumOutputs() {return settings.numOutputs;} - - /** Returns the default number of outputs, in case a processor has no source (or is itself a source).*/ - virtual int getDefaultNumOutputs() {return 2;} + /* + ------------------------------------------------------------------------ + ----------------------------- JUCE METHODS ----------------------------- + ------------------------------------------------------------------------ + */ - /** Returns the default number of volts per bit, in case a processor is a source, of the processor gain otherwise. (assumes data comes from a 16bit source)*/ - virtual float getDefaultBitVolts() {return 1.0;} + /** Constructor (sets the processor's name). */ + GenericProcessor(const String& name_); - /** Returns the next available channel (and increments the channel if the input is set to 'true'. */ - virtual int getNextChannel(bool t); + /** Destructor. */ + virtual ~GenericProcessor(); - /** Resets all inter-processor connections prior to the start of data acquisition.*/ - virtual void resetConnections(); - - /** Sets the current channel (for purposes of updating parameter).*/ - virtual void setCurrentChannel(int chan) {currentChannel = chan;} + /** Returns the name of the processor. */ + const String getName() const + { + return name; + } - /** Returns the unique integer ID for a processor. */ - int getNodeId() {return nodeId;} + /** Called by JUCE as soon as a processor is created, as well as before the start of audio callbacks. To avoid starting data acquisition prematurely, use the enable() function instead. + */ + virtual void prepareToPlay(double sampleRate, int estimatedSamplesPerBlock); - /** Sets the unique integer ID for a processor. */ - void setNodeId(int id) {nodeId = id;} + /** Called by JUCE as soon as audio callbacks end. Use disable() instead. */ + void releaseResources(); - /** Returns a pointer to the processor immediately preceding a given processor in the signal chain. */ - GenericProcessor* getSourceNode() {return sourceNode;} + /** Allows parameters to change while acquisition is active. If the user wants + to change ANY variables that are used within the process() method, this must + be done through setParameter(). Otherwise the application will crash. */ + virtual void setParameter(int parameterIndex, float newValue); - /** Returns a pointer to the processor immediately following a given processor in the signal chain. */ - GenericProcessor* getDestNode() {return destNode;} + /** Creates a GenericEditor.*/ + virtual AudioProcessorEditor* createEditor(); - /** Sets the input or output of a splitter or merger.*/ - virtual void switchIO(int) { } + /** The default is to have no editor.*/ + bool hasEditor() const + { + return false; + } - /** Switches the input or output of a splitter or merger.*/ - virtual void switchIO() { } + /** JUCE method. Not used.*/ + void reset() {} - /** Sets the input to a merger a given processor.*/ - virtual void setPathToProcessor(GenericProcessor* p) { } + /** JUCE method. Not used.*/ + void setCurrentProgramStateInformation(const void* data, int sizeInBytes) {} - /** Sets a processor's source node.*/ - virtual void setSourceNode(GenericProcessor* sn); + /** JUCE method. Not used.*/ + void setStateInformation(const void* data, int sizeInBytes) {} - /** Sets a processor's destination node.*/ - virtual void setDestNode(GenericProcessor* dn); + /** JUCE method. Not used.*/ + void getCurrentProgramStateInformation(MemoryBlock& destData) {} - /** Sets one of two possible source nodes for a merger.*/ - virtual void setMergerSourceNode(GenericProcessor* sn) { } + /** JUCE method. Not used.*/ + void getStateInformation(MemoryBlock& destData) {} - /** Sets one of two possible source nodes for a splitter.*/ - virtual void setSplitterDestNode(GenericProcessor* dn) { } + /** JUCE method. Not used.*/ + void changeProgramName(int index, const String& newName) {} - /** Returns true if a processor is a source, false otherwise.*/ - virtual bool isSource() {return false;} + /** JUCE method. Not used.*/ + void setCurrentProgram(int index) {} - /** Returns true if a processor is a sink, false otherwise.*/ - virtual bool isSink() {return false;} + /** Returns the name of the input channel with a given index.*/ + virtual const String getInputChannelName(int channelIndex) const + { + return GenericProcessor::unusedNameString; + } - /** Returns true if a processor is a splitter, false otherwise.*/ - virtual bool isSplitter() {return false;} + /** Returns the name of the output channel with a given index.*/ + virtual const String getOutputChannelName(int channelIndex) const + { + return GenericProcessor::unusedNameString; + } - /** Returns true if a processor is a merger, false otherwise.*/ - virtual bool isMerger() {return false;} + /** Returns the name of the parameter with a given index.*/ + const String getParameterName(int parameterIndex); - /** Returns true if a processor is able to send its output to a given processor. + /** Returns additional details about the parameter with a given index.*/ + const String getParameterText(int parameterIndex); - Ideally, this should always return true, but there may be special cases - when this is not possible.*/ - virtual bool canSendSignalTo(GenericProcessor*) {return true;} - - /** Returns true if a processor is ready to process data (e.g., all of its parameters are initialized, and its data source is connected).*/ - virtual bool isReady() {return isEnabled;} - - /** Called immediately prior to the start of data acquisition, once all processors in the signal chain have indicated they are ready to process data.*/ - virtual bool enable() {return isEnabled;} - - /** Called immediately after the end of data acquisition.*/ - virtual bool disable() {return true;} - - /** Informs a processor's editor that data acquisition is about to begin. */ - virtual void enableEditor(); - - /** Informs a processor's editor that data acquisition has ended. */ - virtual void disableEditor(); - - /** Indicates whether or not a processor is currently enabled (i.e., able to process data). */ - virtual bool enabledState() {return isEnabled;} - - /** Sets whether or not a processor is enabled (i.e., able to process data). */ - virtual void enabledState(bool t) {isEnabled = t;} - - /** Turns a given channel on or off. */ - virtual void enableCurrentChannel(bool) {} - - /** Indicates whether a source node is connected to a processor (used for mergers).*/ - virtual bool stillHasSource() {return true;} - - bool isEnabled; - bool wasConnected; - - /** Returns a pointer to the processor's internal continuous buffer, if it exists. */ - virtual AudioSampleBuffer* getContinuousBuffer() {return 0;} - - /** Returns a pointer to the processor's internal event buffer, if it exists. */ - virtual MidiBuffer* getEventBuffer() {return 0;} - - int nextAvailableChannel; - - /** Can be called by processors that need to respond to incoming events. */ - virtual int checkForEvents(MidiBuffer& mb); - - /** Makes it easier for processors to add events to the MidiBuffer. */ - virtual void addEvent(MidiBuffer& mb, - uint8 type, - int sampleNum, - uint8 eventID = 0, - uint8 eventChannel = 0, - uint8 numBytes = 0, - uint8* data = 0); - - /** Makes it easier for processors to respond to incoming events, such as TTLs and spikes. - - Called by checkForEvents(). */ - virtual void handleEvent(int eventType, MidiMessage& event, int samplePosition = 0) {} + /** Returns the current value of a parameter with a given index. + Currently set to always return 1. See getParameterVar below*/ + float getParameter(int parameterIndex) + { + return 1.0; + }; - enum eventTypes - { - TIMESTAMP = 0, - BUFFER_SIZE = 1, - PARAMETER_CHANGE = 2, - TTL = 3, - SPIKE = 4, - EEG = 5, - CONTINUOUS = 6 - }; + /**Returns the current value of a parameter with a give index */ + var getParameterVar(int parameterIndex, int parameterChannel); + + /** JUCE method. Not used.*/ + const String getProgramName(int index) + { + return ""; + } + + /** JUCE method. Not used.*/ + bool isInputChannelStereoPair(int index) const + { + return true; + } + + /** JUCE method. Not used.*/ + bool isOutputChannelStereoPair(int index) const + { + return true; + } + + /** All processors can accept MIDI (event) data by default.*/ + bool acceptsMidi() const + { + return true; + } + + /** All processors can produce MIDI (event) data by default.*/ + bool producesMidi() const + { + return true; + } + + /** JUCE method. Not used.*/ + bool isParameterAutomatable(int parameterIndex) + { + return false; + } + + /** JUCE method. Not used.*/ + bool isMetaParameter(int parameterIndex) + { + return false; + } + + /** Returns the number of user-editable parameters for this processor.*/ + int getNumParameters() + { + return parameters.size(); + } + + /** JUCE method. Not used.*/ + int getNumPrograms() + { + return 0; + } + + /** JUCE method. Not used.*/ + int getCurrentProgram() + { + return 0; + } + + /** JUCE method. Not used.*/ + bool silenceInProducesSilenceOut() const + { + return false; + } + + /** JUCE method. Not used.*/ + double getTailLengthSeconds() const + { + return 1.0f; + } + + /* + ------------------------------------------------------------------------ + ---------------------------- CUSTOM METHODS ---------------------------- + ------------------------------------------------------------------------ + */ + + /** Defines a processor's functionality. + + This is the most important function for each + processor, as it determines how it creates, modifies, or responds to incoming data + streams. Rather than use the default JUCE processBlock() method, processBlock() + automatically calls process() in order to add the 'nSamples' variable to indicate + the number of samples in the current buffer. + */ + virtual void process(AudioSampleBuffer& continuousBuffer, + MidiBuffer& eventBuffer, + int& nSamples) = 0; + + /** Pointer to a processor's immediate source node.*/ + GenericProcessor* sourceNode; + + /** Pointer to a processor's immediate destination.*/ + GenericProcessor* destNode; + + /** Returns the sample rate for a processor (assumes the same rate for all channels).*/ + virtual float getSampleRate() + { + return settings.sampleRate; + } + + /** Returns the default sample rate, in case a processor has no source (or is itself a source).*/ + virtual float getDefaultSampleRate() + { + return 44100.0; + } + + /** Returns the number of inputs to a processor.*/ + virtual int getNumInputs() + { + return settings.numInputs; + } + + /** Returns the number of outputs from a processor.*/ + virtual int getNumOutputs() + { + return settings.numOutputs; + } + + /** Returns the default number of outputs, in case a processor has no source (or is itself a source).*/ + virtual int getDefaultNumOutputs() + { + return 2; + } + + /** Returns the default number of volts per bit, in case a processor is a source, of the processor gain otherwise. (assumes data comes from a 16bit source)*/ + virtual float getDefaultBitVolts() + { + return 1.0; + } + + /** Returns the next available channel (and increments the channel if the input is set to 'true'. */ + virtual int getNextChannel(bool t); + + /** Resets all inter-processor connections prior to the start of data acquisition.*/ + virtual void resetConnections(); + + /** Sets the current channel (for purposes of updating parameter).*/ + virtual void setCurrentChannel(int chan) + { + currentChannel = chan; + } + + /** Returns the unique integer ID for a processor. */ + int getNodeId() + { + return nodeId; + } + + /** Sets the unique integer ID for a processor. */ + void setNodeId(int id) + { + nodeId = id; + } + + /** Returns a pointer to the processor immediately preceding a given processor in the signal chain. */ + GenericProcessor* getSourceNode() + { + return sourceNode; + } + + /** Returns a pointer to the processor immediately following a given processor in the signal chain. */ + GenericProcessor* getDestNode() + { + return destNode; + } + + /** Sets the input or output of a splitter or merger.*/ + virtual void switchIO(int) { } + + /** Switches the input or output of a splitter or merger.*/ + virtual void switchIO() { } + + /** Sets the input to a merger a given processor.*/ + virtual void setPathToProcessor(GenericProcessor* p) { } + + /** Sets a processor's source node.*/ + virtual void setSourceNode(GenericProcessor* sn); + + /** Sets a processor's destination node.*/ + virtual void setDestNode(GenericProcessor* dn); + + /** Sets one of two possible source nodes for a merger.*/ + virtual void setMergerSourceNode(GenericProcessor* sn) { } + + /** Sets one of two possible source nodes for a splitter.*/ + virtual void setSplitterDestNode(GenericProcessor* dn) { } + + /** Returns true if a processor is a source, false otherwise.*/ + virtual bool isSource() + { + return false; + } + + /** Returns true if a processor is a sink, false otherwise.*/ + virtual bool isSink() + { + return false; + } + + /** Returns true if a processor is a splitter, false otherwise.*/ + virtual bool isSplitter() + { + return false; + } + + /** Returns true if a processor is a merger, false otherwise.*/ + virtual bool isMerger() + { + return false; + } + + /** Returns true if a processor is able to send its output to a given processor. + + Ideally, this should always return true, but there may be special cases + when this is not possible.*/ + virtual bool canSendSignalTo(GenericProcessor*) + { + return true; + } + + /** Returns true if a processor is ready to process data (e.g., all of its parameters are initialized, and its data source is connected).*/ + virtual bool isReady() + { + return isEnabled; + } + + /** Called immediately prior to the start of data acquisition, once all processors in the signal chain have indicated they are ready to process data.*/ + virtual bool enable() + { + return isEnabled; + } + + /** Called immediately after the end of data acquisition.*/ + virtual bool disable() + { + return true; + } + + /** Informs a processor's editor that data acquisition is about to begin. */ + virtual void enableEditor(); + + /** Informs a processor's editor that data acquisition has ended. */ + virtual void disableEditor(); + + /** Indicates whether or not a processor is currently enabled (i.e., able to process data). */ + virtual bool enabledState() + { + return isEnabled; + } + + /** Sets whether or not a processor is enabled (i.e., able to process data). */ + virtual void enabledState(bool t) + { + isEnabled = t; + } + + /** Turns a given channel on or off. */ + virtual void enableCurrentChannel(bool) {} + + /** Indicates whether a source node is connected to a processor (used for mergers).*/ + virtual bool stillHasSource() + { + return true; + } + + bool isEnabled; + bool wasConnected; + + /** Returns a pointer to the processor's internal continuous buffer, if it exists. */ + virtual AudioSampleBuffer* getContinuousBuffer() + { + return 0; + } + + /** Returns a pointer to the processor's internal event buffer, if it exists. */ + virtual MidiBuffer* getEventBuffer() + { + return 0; + } + + int nextAvailableChannel; + + /** Can be called by processors that need to respond to incoming events. */ + virtual int checkForEvents(MidiBuffer& mb); + + /** Makes it easier for processors to add events to the MidiBuffer. */ + virtual void addEvent(MidiBuffer& mb, + uint8 type, + int sampleNum, + uint8 eventID = 0, + uint8 eventChannel = 0, + uint8 numBytes = 0, + uint8* data = 0); + + /** Makes it easier for processors to respond to incoming events, such as TTLs and spikes. + + Called by checkForEvents(). */ + virtual void handleEvent(int eventType, MidiMessage& event, int samplePosition = 0) {} + + enum eventTypes + { + TIMESTAMP = 0, + BUFFER_SIZE = 1, + PARAMETER_CHANGE = 2, + TTL = 3, + SPIKE = 4, + EEG = 5, + CONTINUOUS = 6 + }; - enum eventChannelTypes - { - GENERIC_EVENT = 999, - SINGLE_ELECTRODE = 1, - STEREOTRODE = 2, - TETRODE = 4 - }; + enum eventChannelTypes + { + GENERIC_EVENT = 999, + SINGLE_ELECTRODE = 1, + STEREOTRODE = 2, + TETRODE = 4 + }; - /** Variable used to orchestrate saving the ProcessorGraph. */ - int saveOrder; + /** Variable used to orchestrate saving the ProcessorGraph. */ + int saveOrder; + + /** Variable used to orchestrate loading the ProcessorGraph. */ + int loadOrder; - /** Variable used to orchestrate loading the ProcessorGraph. */ - int loadOrder; + /** The channel that will be updated the next time a parameter is changed. */ + int currentChannel; - /** The channel that will be updated the next time a parameter is changed. */ - int currentChannel; + /** Returns a pointer to the processor's editor. */ + virtual GenericEditor* getEditor() + { + return editor; + } - /** Returns a pointer to the processor's editor. */ - virtual GenericEditor* getEditor() {return editor;} + /** Pointer to the processor's editor. */ + ScopedPointer<GenericEditor> editor; - /** Pointer to the processor's editor. */ - ScopedPointer<GenericEditor> editor; + /** Array of Channel objects for all continuous channels. */ + OwnedArray<Channel> channels; - /** Array of Channel objects for all continuous channels. */ - OwnedArray<Channel> channels; + /** Array of Channel objects for all event channels. */ + OwnedArray<Channel> eventChannels; - /** Array of Channel objects for all event channels. */ - OwnedArray<Channel> eventChannels; + /** Settings used by most processors. */ + struct ProcessorSettings + { - /** Settings used by most processors. */ - struct ProcessorSettings { + GenericProcessor* originalSource; - GenericProcessor* originalSource; + int numInputs; + int numOutputs; - int numInputs; - int numOutputs; + float sampleRate; - float sampleRate; + }; - }; + ProcessorSettings settings; - ProcessorSettings settings; + /** Resets the 'settings' struct to its default state.*/ + virtual void clearSettings(); - /** Resets the 'settings' struct to its default state.*/ - virtual void clearSettings(); + /** Default method for updating settings, called by every processor.*/ + virtual void update(); - /** Default method for updating settings, called by every processor.*/ - virtual void update(); + /** Custom method for updating settings, called automatically by update().*/ + virtual void updateSettings() {} - /** Custom method for updating settings, called automatically by update().*/ - virtual void updateSettings() {} + /** Each processor has a unique integer ID that can be used to identify it.*/ + int nodeId; - /** Each processor has a unique integer ID that can be used to identify it.*/ - int nodeId; + /** An array of parameters that the user can modify.*/ + Array<Parameter> parameters; - /** An array of parameters that the user can modify.*/ - Array<Parameter> parameters; - /** Initialize Parameters */ //virtual void initializeParameters(); - - /** Returns the parameter for a given name.*/ - Parameter& getParameterByName(String parameterName); - /** Returns the parameter for a given index.*/ - Parameter& getParameterReference(int parameterIndex); - + /** Returns the parameter for a given name.*/ + Parameter& getParameterByName(String parameterName); + + /** Returns the parameter for a given index.*/ + Parameter& getParameterReference(int parameterIndex); + /** Saving all settings to XML*/ void saveToXML(XmlElement* parentElement); /** Saving Parameters for each Channel */ void saveParametersToChannelsXML(XmlElement* channelParent, int channelNumber); - + private: - /** Automatically extracts the number of samples in the buffer, then - calls the process(), where custom actions take place.*/ - void processBlock (AudioSampleBuffer &buffer, MidiBuffer &midiMessages); + /** Automatically extracts the number of samples in the buffer, then + calls the process(), where custom actions take place.*/ + void processBlock(AudioSampleBuffer& buffer, MidiBuffer& midiMessages); + + /** The name of the processor.*/ + const String name; - /** The name of the processor.*/ - const String name; - - /** Returns the number of samples for the current continuous buffer (assumed to be - the same for all channels).*/ - int getNumSamples(MidiBuffer&); + /** Returns the number of samples for the current continuous buffer (assumed to be + the same for all channels).*/ + int getNumSamples(MidiBuffer&); - /** Updates the number of samples for the current continuous buffer (assumed to be - the same for all channels).*/ - void setNumSamples(MidiBuffer&, int); + /** Updates the number of samples for the current continuous buffer (assumed to be + the same for all channels).*/ + void setNumSamples(MidiBuffer&, int); - /** For getInputChannelName() and getOutputChannelName() */ - static const String unusedNameString; + /** For getInputChannelName() and getOutputChannelName() */ + static const String unusedNameString; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GenericProcessor); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(GenericProcessor); }; diff --git a/Source/Processors/LfpDisplayNode.cpp b/Source/Processors/LfpDisplayNode.cpp index 7ba36e2855dbbb6dac92a01ce23d9dd7ba08daee..a25e21fc38f0fd5114b3c7bcdf3e2452b013becf 100755 --- a/Source/Processors/LfpDisplayNode.cpp +++ b/Source/Processors/LfpDisplayNode.cpp @@ -26,98 +26,102 @@ #include <stdio.h> LfpDisplayNode::LfpDisplayNode() - : GenericProcessor("LFP Viewer"), - displayBufferIndex(0), displayGain(1), bufferLength(5.0f), - abstractFifo(100), ttlState(0) + : GenericProcessor("LFP Viewer"), + displayBufferIndex(0), displayGain(1), bufferLength(5.0f), + abstractFifo(100), ttlState(0) { std::cout << " LFPDisplayNodeConstructor" << std::endl; - displayBuffer = new AudioSampleBuffer(8, 100); - eventBuffer = new MidiBuffer(); + displayBuffer = new AudioSampleBuffer(8, 100); + eventBuffer = new MidiBuffer(); - Array<var> timeBaseValues; - timeBaseValues.add(1); - timeBaseValues.add(2); - timeBaseValues.add(5); - timeBaseValues.add(10); + Array<var> timeBaseValues; + timeBaseValues.add(1); + timeBaseValues.add(2); + timeBaseValues.add(5); + timeBaseValues.add(10); - parameters.add(Parameter("timebase",timeBaseValues, 1, 0));//true);//a,0); + parameters.add(Parameter("timebase",timeBaseValues, 1, 0));//true);//a,0); - Array<var> displayGainValues; - displayGainValues.add(1); - displayGainValues.add(2); - displayGainValues.add(4); - displayGainValues.add(8); + Array<var> displayGainValues; + displayGainValues.add(1); + displayGainValues.add(2); + displayGainValues.add(4); + displayGainValues.add(8); - parameters.add(Parameter("display gain",displayGainValues, 1, 1));//true);//a,0); + parameters.add(Parameter("display gain",displayGainValues, 1, 1));//true);//a,0); - arrayOfOnes = new float[5000]; + arrayOfOnes = new float[5000]; - for (int n = 0; n < 5000; n++) - { - arrayOfOnes[n] = 1; - } + for (int n = 0; n < 5000; n++) + { + arrayOfOnes[n] = 1; + } } LfpDisplayNode::~LfpDisplayNode() { - //deleteAndZero(displayBuffer); - //deleteAndZero(eventBuffer); + //deleteAndZero(displayBuffer); + //deleteAndZero(eventBuffer); } AudioProcessorEditor* LfpDisplayNode::createEditor() { - editor = new LfpDisplayEditor(this, true); - return editor; + editor = new LfpDisplayEditor(this, true); + return editor; } void LfpDisplayNode::updateSettings() { - std::cout << "Setting num inputs on LfpDisplayNode to " << getNumInputs() << std::endl; + std::cout << "Setting num inputs on LfpDisplayNode to " << getNumInputs() << std::endl; } bool LfpDisplayNode::resizeBuffer() { - int nSamples = (int) getSampleRate()*bufferLength; - int nInputs = getNumInputs(); - - std::cout << "Resizing buffer. Samples: " << nSamples << ", Inputs: " << nInputs << std::endl; - - if (nSamples > 0 && nInputs > 0) - { - abstractFifo.setTotalSize(nSamples); - displayBuffer->setSize(nInputs+1, nSamples); // add an extra channel for TTLs - return true; - } else { - return false; - } + int nSamples = (int) getSampleRate()*bufferLength; + int nInputs = getNumInputs(); + + std::cout << "Resizing buffer. Samples: " << nSamples << ", Inputs: " << nInputs << std::endl; + + if (nSamples > 0 && nInputs > 0) + { + abstractFifo.setTotalSize(nSamples); + displayBuffer->setSize(nInputs+1, nSamples); // add an extra channel for TTLs + return true; + } + else + { + return false; + } } bool LfpDisplayNode::enable() { - if (resizeBuffer()) - { - LfpDisplayEditor* editor = (LfpDisplayEditor*) getEditor(); - editor->enable(); - return true; - } else { - return false; - } + if (resizeBuffer()) + { + LfpDisplayEditor* editor = (LfpDisplayEditor*) getEditor(); + editor->enable(); + return true; + } + else + { + return false; + } } bool LfpDisplayNode::disable() { - LfpDisplayEditor* editor = (LfpDisplayEditor*) getEditor(); - editor->disable(); - return true; + LfpDisplayEditor* editor = (LfpDisplayEditor*) getEditor(); + editor->disable(); + return true; } -void LfpDisplayNode::setParameter (int parameterIndex, float newValue) +void LfpDisplayNode::setParameter(int parameterIndex, float newValue) { //Sets Parameter in parameters array for processor Parameter* parameterPointer=parameters.getRawDataPointer(); @@ -125,250 +129,212 @@ void LfpDisplayNode::setParameter (int parameterIndex, float newValue) parameterPointer->setValue(newValue, currentChannel); //std::cout << "Saving Parameter from " << currentChannel << ", channel "; - - LfpDisplayEditor* ed = (LfpDisplayEditor*) getEditor(); - if (ed->canvas != 0) - ed->canvas->setParameter(parameterIndex, newValue); + + LfpDisplayEditor* ed = (LfpDisplayEditor*) getEditor(); + if (ed->canvas != 0) + ed->canvas->setParameter(parameterIndex, newValue); } void LfpDisplayNode::handleEvent(int eventType, MidiMessage& event, int sampleNum) { - if (eventType == TTL) - { - const uint8* dataptr = event.getRawData(); + if (eventType == TTL) + { + const uint8* dataptr = event.getRawData(); + + // int eventNodeId = *(dataptr+1); + int eventId = *(dataptr+2); + int eventChannel = *(dataptr+3); + int eventTime = event.getTimeStamp(); - // int eventNodeId = *(dataptr+1); - int eventId = *(dataptr+2); - int eventChannel = *(dataptr+3); - int eventTime = event.getTimeStamp(); + int samplesLeft = totalSamples - eventTime; - int samplesLeft = totalSamples - eventTime; + // std::cout << "Received event from " << eventNodeId << ", channel " + // << eventChannel << ", with ID " << eventId << std::endl; + // + int bufferIndex = (displayBufferIndex + eventTime);// % displayBuffer->getNumSamples(); - // std::cout << "Received event from " << eventNodeId << ", channel " - // << eventChannel << ", with ID " << eventId << std::endl; -// - int bufferIndex = (displayBufferIndex + eventTime);// % displayBuffer->getNumSamples(); + if (eventId == 1) + { + ttlState |= (1L << eventChannel); + } + else + { + ttlState &= ~(1L << eventChannel); + } - if (eventId == 1) - { - ttlState |= (1L << eventChannel); - } else { - ttlState &= ~(1L << eventChannel); - } + if (samplesLeft + bufferIndex < displayBuffer->getNumSamples()) + { - if (samplesLeft + bufferIndex < displayBuffer->getNumSamples()) - { + // std::cout << bufferIndex << " " << samplesLeft << " " << ttlState << std::endl; - // std::cout << bufferIndex << " " << samplesLeft << " " << ttlState << std::endl; + displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel + bufferIndex, // destStartSample + arrayOfOnes, // source + samplesLeft, // numSamples + float(ttlState)); // gain + } + else + { - displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel - bufferIndex, // destStartSample - arrayOfOnes, // source - samplesLeft, // numSamples - float(ttlState)); // gain - } else { + int block2Size = (samplesLeft + bufferIndex) % displayBuffer->getNumSamples(); + int block1Size = samplesLeft - block2Size; - int block2Size = (samplesLeft + bufferIndex) % displayBuffer->getNumSamples(); - int block1Size = samplesLeft - block2Size; + //std::cout << "OVERFLOW." << std::endl; - //std::cout << "OVERFLOW." << std::endl; + //std::cout << bufferIndex << " " << block1Size << " " << ttlState << std::endl; - //std::cout << bufferIndex << " " << block1Size << " " << ttlState << std::endl; + displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel + bufferIndex, // destStartSample + arrayOfOnes, // source + block1Size, // numSamples + float(ttlState)); // gain - displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel - bufferIndex, // destStartSample - arrayOfOnes, // source - block1Size, // numSamples - float(ttlState)); // gain + //std::cout << 0 << " " << block2Size << " " << ttlState << std::endl; - //std::cout << 0 << " " << block2Size << " " << ttlState << std::endl; + displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel + 0, // destStartSample + arrayOfOnes, // source + block2Size, // numSamples + float(ttlState)); // gain - displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel - 0, // destStartSample - arrayOfOnes, // source - block2Size, // numSamples - float(ttlState)); // gain + } - } + // std::cout << "ttlState: " << ttlState << std::endl; - // std::cout << "ttlState: " << ttlState << std::endl; + // std::cout << "Received event from " << eventNodeId << + // " on channel " << eventChannel << + // " with value " << eventId << + // " at timestamp " << event.getTimeStamp() << std::endl; - // std::cout << "Received event from " << eventNodeId << - // " on channel " << eventChannel << - // " with value " << eventId << - // " at timestamp " << event.getTimeStamp() << std::endl; + } + else if (eventType == TIMESTAMP) + { - } else if (eventType == TIMESTAMP) - { + const uint8* dataptr = event.getRawData(); - const uint8* dataptr = event.getRawData(); + // int eventNodeId = *(dataptr+1); + // int eventId = *(dataptr+2); + // int eventChannel = *(dataptr+3); - // int eventNodeId = *(dataptr+1); - // int eventId = *(dataptr+2); - // int eventChannel = *(dataptr+3); - - // update the timestamp for the current buffer: - memcpy(&bufferTimestamp, dataptr+4, 4); + // update the timestamp for the current buffer: + memcpy(&bufferTimestamp, dataptr+4, 4); - // double timeInSeconds = double(ts)/Time::getHighResolutionTicksPerSecond(); - // //int64 timestamp = ts[0] << 32 + - // // ts[1] << 16 + - // // ts[2] << 8 + - // // ts[3]; - // //memcpy(ts, dataptr+4, 1); + // double timeInSeconds = double(ts)/Time::getHighResolutionTicksPerSecond(); + // //int64 timestamp = ts[0] << 32 + + // // ts[1] << 16 + + // // ts[2] << 8 + + // // ts[3]; + // //memcpy(ts, dataptr+4, 1); - // std::cout << "Time in seconds is " << timeInSeconds << std::endl; + // std::cout << "Time in seconds is " << timeInSeconds << std::endl; - // // std::cout << "Received event from " << eventNodeId << - // // " on channel " << eventChannel << - // // " with value " << eventId << - // // " for time: " << ts << std::endl; - } + // // std::cout << "Received event from " << eventNodeId << + // // " on channel " << eventChannel << + // // " with value " << eventId << + // // " for time: " << ts << std::endl; + } } void LfpDisplayNode::initializeEventChannel() { - if (displayBufferIndex + totalSamples < displayBuffer->getNumSamples()) - { - - // std::cout << getNumInputs()+1 << " " << displayBufferIndex << " " << totalSamples << " " << ttlState << std::endl; -// - displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel - displayBufferIndex, // destStartSample - arrayOfOnes, // source - totalSamples, // numSamples - float(ttlState)); // gain - } else { - - int block2Size = (displayBufferIndex + totalSamples) % displayBuffer->getNumSamples(); - int block1Size = totalSamples - block2Size; - - // std::cout << "OVERFLOW." << std::endl; - - // std::cout << bufferIndex << " " << block1Size << " " << ttlState << std::endl; - - displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel - displayBufferIndex, // destStartSample - arrayOfOnes, // source - block1Size, // numSamples - float(ttlState)); // gain - // std::cout << 0 << " " << block2Size << " " << ttlState << std::endl; - - displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel - 0, // destStartSample - arrayOfOnes, // source - block2Size, // numSamples - float(ttlState)); // gain - - - } + if (displayBufferIndex + totalSamples < displayBuffer->getNumSamples()) + { + + // std::cout << getNumInputs()+1 << " " << displayBufferIndex << " " << totalSamples << " " << ttlState << std::endl; + // + displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel + displayBufferIndex, // destStartSample + arrayOfOnes, // source + totalSamples, // numSamples + float(ttlState)); // gain + } + else + { + + int block2Size = (displayBufferIndex + totalSamples) % displayBuffer->getNumSamples(); + int block1Size = totalSamples - block2Size; + + // std::cout << "OVERFLOW." << std::endl; + + // std::cout << bufferIndex << " " << block1Size << " " << ttlState << std::endl; + + displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel + displayBufferIndex, // destStartSample + arrayOfOnes, // source + block1Size, // numSamples + float(ttlState)); // gain + // std::cout << 0 << " " << block2Size << " " << ttlState << std::endl; + + displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel + 0, // destStartSample + arrayOfOnes, // source + block2Size, // numSamples + float(ttlState)); // gain + + + } } -void LfpDisplayNode::process(AudioSampleBuffer &buffer, MidiBuffer &events, int& nSamples) +void LfpDisplayNode::process(AudioSampleBuffer& buffer, MidiBuffer& events, int& nSamples) { - // 1. place any new samples into the displayBuffer - //std::cout << "Display node sample count: " << nSamples << std::endl; ///buffer.getNumSamples() << std::endl; - - totalSamples = nSamples; - displayBufferIndexEvents = displayBufferIndex; - - initializeEventChannel(); - - - - checkForEvents(events); // update timestamp, see if we got any TTL events - - int samplesLeft = displayBuffer->getNumSamples() - displayBufferIndex; - - if (nSamples < samplesLeft) - { - - for (int chan = 0; chan < buffer.getNumChannels(); chan++) - { - displayBuffer->copyFrom(chan, // destChannel - displayBufferIndex, // destStartSample - buffer, // source - chan, // source channel - 0, // source start sample - nSamples); // numSamples - - } - displayBufferIndex += (nSamples); - - } else { - - int extraSamples = nSamples - samplesLeft; - - for (int chan = 0; chan < buffer.getNumChannels(); chan++) - { - displayBuffer->copyFrom(chan, // destChannel - displayBufferIndex, // destStartSample - buffer, // source - chan, // source channel - 0, // source start sample - samplesLeft); // numSamples - - displayBuffer->copyFrom(chan, - 0, - buffer, - chan, - samplesLeft, - extraSamples); - } - - displayBufferIndex = extraSamples; - } + // 1. place any new samples into the displayBuffer + //std::cout << "Display node sample count: " << nSamples << std::endl; ///buffer.getNumSamples() << std::endl; - //std::cout << *displayBuffer->getSampleData(displayBuffer->getNumChannels()-1, - // displayBufferIndex-1) << std::endl; + totalSamples = nSamples; + displayBufferIndexEvents = displayBufferIndex; + initializeEventChannel(); - ///// failed attempt to use abstractFifo: + checkForEvents(events); // update timestamp, see if we got any TTL events - // int start1, size1, start2, size2; + int samplesLeft = displayBuffer->getNumSamples() - displayBufferIndex; - // abstractFifo.prepareToWrite(nSamples, start1, size1, start2, size2); + if (nSamples < samplesLeft) + { - // if (size1 > 0) - // { - // for (int chan = 0; chan < buffer.getNumChannels(); chan++) - // { - // displayBuffer->copyFrom(chan, // destChannel - // start1, // destStartSample - // buffer, // source - // chan, // source channel - // 0, // source start sample - // size1); // numSamples + for (int chan = 0; chan < buffer.getNumChannels(); chan++) + { + displayBuffer->copyFrom(chan, // destChannel + displayBufferIndex, // destStartSample + buffer, // source + chan, // source channel + 0, // source start sample + nSamples); // numSamples - // } + } + displayBufferIndex += (nSamples); - // displayBufferIndex += size1; - // } + } + else + { - // if (size2 > 0) - // { - // for (int chan = 0; chan < buffer.getNumChannels(); chan++) - // { - // displayBuffer->copyFrom(chan, // destChannel - // start2, // destStartSample - // buffer, // source - // chan, // source channel - // size1, // source start sample - // size2); // numSamples + int extraSamples = nSamples - samplesLeft; - // } + for (int chan = 0; chan < buffer.getNumChannels(); chan++) + { + displayBuffer->copyFrom(chan, // destChannel + displayBufferIndex, // destStartSample + buffer, // source + chan, // source channel + 0, // source start sample + samplesLeft); // numSamples - // displayBufferIndex = size2; - // } + displayBuffer->copyFrom(chan, + 0, + buffer, + chan, + samplesLeft, + extraSamples); + } - // std::cout << displayBufferIndex << std::endl; + displayBufferIndex = extraSamples; + } - // abstractFifo.finishedWrite(size1 + size2); } diff --git a/Source/Processors/LfpDisplayNode.h b/Source/Processors/LfpDisplayNode.h index 1587282054c9931298d9008c9e641e0e0024a9cb..0f9d8027af190297ef2e56129646fd82aecb5a76 100755 --- a/Source/Processors/LfpDisplayNode.h +++ b/Source/Processors/LfpDisplayNode.h @@ -24,9 +24,6 @@ #ifndef __LFPDISPLAYNODE_H_D969A379__ #define __LFPDISPLAYNODE_H_D969A379__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "Editors/LfpDisplayEditor.h" #include "Editors/VisualizerEditor.h" @@ -35,7 +32,7 @@ class DataViewport; /** - + Holds data in a displayBuffer to be used by the LfpDisplayCanvas for rendering continuous data streams. @@ -44,56 +41,65 @@ class DataViewport; */ class LfpDisplayNode : public GenericProcessor - + { public: - LfpDisplayNode(); - ~LfpDisplayNode(); + LfpDisplayNode(); + ~LfpDisplayNode(); + + AudioProcessorEditor* createEditor(); - AudioProcessorEditor* createEditor(); + bool isSink() + { + return true; + } - bool isSink() {return true;} + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); - void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); + void setParameter(int, float); - void setParameter(int, float); - - void updateSettings(); + void updateSettings(); - bool enable(); - bool disable(); + bool enable(); + bool disable(); - void handleEvent(int, MidiMessage&, int); + void handleEvent(int, MidiMessage&, int); - AudioSampleBuffer* getDisplayBufferAddress() {return displayBuffer;} - int getDisplayBufferIndex() {return displayBufferIndex;} + AudioSampleBuffer* getDisplayBufferAddress() + { + return displayBuffer; + } + int getDisplayBufferIndex() + { + return displayBufferIndex; + } private: - void initializeEventChannel(); + void initializeEventChannel(); - ScopedPointer<AudioSampleBuffer> displayBuffer; - ScopedPointer<MidiBuffer> eventBuffer; + ScopedPointer<AudioSampleBuffer> displayBuffer; + ScopedPointer<MidiBuffer> eventBuffer; - int displayBufferIndex; - int displayBufferIndexEvents; + int displayBufferIndex; + int displayBufferIndexEvents; - float displayGain; // - float bufferLength; // s + float displayGain; // + float bufferLength; // s - AbstractFifo abstractFifo; + AbstractFifo abstractFifo; - int64 bufferTimestamp; - int ttlState; - float* arrayOfOnes; - int totalSamples; + int64 bufferTimestamp; + int ttlState; + float* arrayOfOnes; + int totalSamples; - //Time timer; + //Time timer; - bool resizeBuffer(); + bool resizeBuffer(); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LfpDisplayNode); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LfpDisplayNode); }; diff --git a/Source/Processors/Parameter.cpp b/Source/Processors/Parameter.cpp index 8c7b759b654182db7803261ff7978e48a30f6402..2750d3bd9638bfa2c343e919ae4f39b9465aa610 100755 --- a/Source/Processors/Parameter.cpp +++ b/Source/Processors/Parameter.cpp @@ -25,84 +25,91 @@ Parameter::Parameter(const String& name_, bool defaultVal, int ID, bool t) - : shouldDeactivateDuringAcquisition(t), name(name_), description(""), - parameterId(ID) + : shouldDeactivateDuringAcquisition(t), name(name_), description(""), + parameterId(ID) { - defaultValue = defaultVal; + defaultValue = defaultVal; - possibleValues.add(true); - possibleValues.add(false); + possibleValues.add(true); + possibleValues.add(false); - isBool = true; - isCont = false; - isDisc = false; + isBool = true; + isCont = false; + isDisc = false; } Parameter::Parameter(const String& name_, float low, float high, - float defaultVal, int ID, bool t) - : shouldDeactivateDuringAcquisition(t), name(name_), description(""), - parameterId(ID) + float defaultVal, int ID, bool t) + : shouldDeactivateDuringAcquisition(t), name(name_), description(""), + parameterId(ID) { - defaultValue = defaultVal; + defaultValue = defaultVal; - possibleValues.add(low); - possibleValues.add(high); + possibleValues.add(low); + possibleValues.add(high); - isCont = true; - isBool = false; - isDisc = false; + isCont = true; + isBool = false; + isDisc = false; } Parameter::Parameter(const String& name_, Array<var> a, int defaultVal, - int ID, bool t) - : shouldDeactivateDuringAcquisition(t), name(name_), description(""), - parameterId(ID) + int ID, bool t) + : shouldDeactivateDuringAcquisition(t), name(name_), description(""), + parameterId(ID) { - possibleValues = a; - defaultValue = defaultVal; //possibleValues[defaultVal]; + possibleValues = a; + defaultValue = defaultVal; //possibleValues[defaultVal]; - isCont = false; - isDisc = true; - isBool = false; + isCont = false; + isDisc = true; + isBool = false; } void Parameter::setValue(float val, int chan) { - - // std::cout << "Setting value of " << chan << " to " << val << std::endl; - - if (isBoolean()) - { - if (val > 0.0f) - values.set(chan, true); - else - values.set(chan, false); - } - else if (isContinuous()) { - - if (val < (float) possibleValues[0]) - { - values.set(chan, possibleValues[0]); - } else if (val > (float) possibleValues[1]) { - values.set(chan, possibleValues[1]); - } else { - values.set(chan, val); - } - - } else { - //int index = (int) val; - - //if (index >= 0 && index < possibleValues.size()) - //{ - values.set(chan, val); - //} - - } + + // std::cout << "Setting value of " << chan << " to " << val << std::endl; + + if (isBoolean()) + { + if (val > 0.0f) + values.set(chan, true); + else + values.set(chan, false); + } + else if (isContinuous()) + { + + if (val < (float) possibleValues[0]) + { + values.set(chan, possibleValues[0]); + } + else if (val > (float) possibleValues[1]) + { + values.set(chan, possibleValues[1]); + } + else + { + values.set(chan, val); + } + + } + else + { + //int index = (int) val; + + //if (index >= 0 && index < possibleValues.size()) + //{ + values.set(chan, val); + //} + + } } diff --git a/Source/Processors/Parameter.h b/Source/Processors/Parameter.h index 8f8cad0c55ff99e4a025c9e025b5e740d9c86634..883b6f58bd63960e4933dfc5d7833bb4423fb467 100755 --- a/Source/Processors/Parameter.h +++ b/Source/Processors/Parameter.h @@ -24,9 +24,6 @@ #ifndef __PARAMETER_H_62922AE5__ #define __PARAMETER_H_62922AE5__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" // #include "Editors/GenericEditor.h" // #include "GenericProcessor.h" @@ -35,7 +32,7 @@ #include <stdio.h> /** - + Class for holding user-definable processor parameters. Parameters can either hold boolean, categorical, or continuous (float) values. @@ -51,71 +48,101 @@ class Parameter { public: - /** Constructor for boolean parameters.*/ - Parameter(const String& name_, bool defaultVal, int ID, bool t = false); - - /** Constructor for continuous (float) parameters.*/ - Parameter(const String& name_, float low, float high, float defaultVal, int ID, bool t = false); - - /** Constructor for categorical parameters.*/ - Parameter(const String& name_, Array<var> a, int defaultVal, int ID, bool t = false); - - /** Destructor.*/ - ~Parameter() {} - - /** Returns the name of the parameter.*/ - const String& getName() {return name;} - - /** Returns a description of the parameter.*/ - const String& getDescription() {return description;} - - /** Sets the description of the parameter.*/ - void addDescription(const String& desc) {description = desc;} - - /** Returns the default value of a parameter (can be boolean, int, or float).*/ - var getDefaultValue() {return defaultValue;} - - /** Returns the unique integer ID of a parameter.*/ - int getID() {return parameterId;} - - /** Returns all the possible values that a parameter can take.*/ - Array<var> getPossibleValues() {return possibleValues;} - - /** Sets the value of a parameter for a given channel.*/ - void setValue(float val, int chan); - - /** Returns the value of a parameter for a given channel.*/ - var operator[](int chan) {return values[chan];} - - /** Copies a parameter.*/ - Parameter& operator=(const Parameter& other); - - /** Returns true if a parameter is boolean, false otherwise.*/ - bool isBoolean() {return isBool;} - - /** Returns true if a parameter is continuous, false otherwise.*/ - bool isContinuous() {return isCont;} - - /** Returns true if a parameter is discrete, false otherwise.*/ - bool isDiscrete() {return isDisc;} - - /** Certain parameters should not be changed while data acquisition is active. - - This variable indicates whether or not these parameters can be edited.*/ - bool shouldDeactivateDuringAcquisition; + /** Constructor for boolean parameters.*/ + Parameter(const String& name_, bool defaultVal, int ID, bool t = false); + + /** Constructor for continuous (float) parameters.*/ + Parameter(const String& name_, float low, float high, float defaultVal, int ID, bool t = false); + + /** Constructor for categorical parameters.*/ + Parameter(const String& name_, Array<var> a, int defaultVal, int ID, bool t = false); + + /** Destructor.*/ + ~Parameter() {} + + /** Returns the name of the parameter.*/ + const String& getName() + { + return name; + } + + /** Returns a description of the parameter.*/ + const String& getDescription() + { + return description; + } + + /** Sets the description of the parameter.*/ + void addDescription(const String& desc) + { + description = desc; + } + + /** Returns the default value of a parameter (can be boolean, int, or float).*/ + var getDefaultValue() + { + return defaultValue; + } + + /** Returns the unique integer ID of a parameter.*/ + int getID() + { + return parameterId; + } + + /** Returns all the possible values that a parameter can take.*/ + Array<var> getPossibleValues() + { + return possibleValues; + } + + /** Sets the value of a parameter for a given channel.*/ + void setValue(float val, int chan); + + /** Returns the value of a parameter for a given channel.*/ + var operator[](int chan) + { + return values[chan]; + } + + /** Copies a parameter.*/ + Parameter& operator=(const Parameter& other); + + /** Returns true if a parameter is boolean, false otherwise.*/ + bool isBoolean() + { + return isBool; + } + + /** Returns true if a parameter is continuous, false otherwise.*/ + bool isContinuous() + { + return isCont; + } + + /** Returns true if a parameter is discrete, false otherwise.*/ + bool isDiscrete() + { + return isDisc; + } + + /** Certain parameters should not be changed while data acquisition is active. + + This variable indicates whether or not these parameters can be edited.*/ + bool shouldDeactivateDuringAcquisition; private: - const String name; - String description; + const String name; + String description; - int parameterId; + int parameterId; - bool isBool, isCont, isDisc; + bool isBool, isCont, isDisc; - var defaultValue; - Array<var> values; - Array<var> possibleValues; + var defaultValue; + Array<var> values; + Array<var> possibleValues; }; diff --git a/Source/Processors/PhaseDetector.cpp b/Source/Processors/PhaseDetector.cpp index 17e4bce7c75a657ed88da305a67dbde5f1317eda..741709e1c34be6623940d24eec1b5fdd055fb07b 100644 --- a/Source/Processors/PhaseDetector.cpp +++ b/Source/Processors/PhaseDetector.cpp @@ -26,12 +26,12 @@ //#include "Editors/PhaseDetectorEditor.h" PhaseDetector::PhaseDetector() - : GenericProcessor("Phase Detector"), - maxFrequency(20), isIncreasing(true), canBeTriggered(false) + : GenericProcessor("Phase Detector"), + maxFrequency(20), isIncreasing(true), canBeTriggered(false) { - peakIntervals = new int[NUM_INTERVALS]; + peakIntervals = new int[NUM_INTERVALS]; //parameters.add(Parameter("thresh", 0.0, 500.0, 200.0, 0)); @@ -39,10 +39,10 @@ PhaseDetector::PhaseDetector() PhaseDetector::~PhaseDetector() { - + } -void PhaseDetector::setParameter (int parameterIndex, float newValue) +void PhaseDetector::setParameter(int parameterIndex, float newValue) { // Parameter& p = parameters.getReference(parameterIndex); @@ -57,99 +57,105 @@ void PhaseDetector::setParameter (int parameterIndex, float newValue) void PhaseDetector::updateSettings() { - minSamplesToNextPeak = int(getSampleRate()/maxFrequency); + minSamplesToNextPeak = int(getSampleRate()/maxFrequency); } bool PhaseDetector::enable() { - nSamplesSinceLastPeak = 0; - lastSample = 0.0f; - isIncreasing = false; - numPeakIntervals = 0; + nSamplesSinceLastPeak = 0; + lastSample = 0.0f; + isIncreasing = false; + numPeakIntervals = 0; - return true; + return true; } void PhaseDetector::handleEvent(int eventType, MidiMessage& event, int sampleNum) { - //std::cout << "GOT EVENT." << std::endl; + //std::cout << "GOT EVENT." << std::endl; - if (eventType == TTL) - { - const uint8* dataptr = event.getRawData(); + if (eventType == TTL) + { + const uint8* dataptr = event.getRawData(); - // int eventNodeId = *(dataptr+1); - int eventId = *(dataptr+2); - int eventChannel = *(dataptr+3); - //int eventTime = event.getTimeStamp(); + // int eventNodeId = *(dataptr+1); + int eventId = *(dataptr+2); + int eventChannel = *(dataptr+3); + //int eventTime = event.getTimeStamp(); - // std::cout << "Received event from " << eventNodeId << ", channel " - // << eventChannel << ", with ID " << eventId << std::endl; + // std::cout << "Received event from " << eventNodeId << ", channel " + // << eventChannel << ", with ID " << eventId << std::endl; - if (eventId == 1 && eventChannel == 5) - { - canBeTriggered = true; - } else if (eventId == 0 && eventChannel == 5) { - canBeTriggered = false; - } + if (eventId == 1 && eventChannel == 5) + { + canBeTriggered = true; + } + else if (eventId == 0 && eventChannel == 5) + { + canBeTriggered = false; + } } } -void PhaseDetector::process(AudioSampleBuffer &buffer, - MidiBuffer &events, +void PhaseDetector::process(AudioSampleBuffer& buffer, + MidiBuffer& events, int& nSamples) { - checkForEvents(events); + checkForEvents(events); - for (int i = 0; i < nSamples; i++) - { + for (int i = 0; i < nSamples; i++) + { - float sample = *buffer.getSampleData(0, i); + float sample = *buffer.getSampleData(0, i); - if (sample > lastSample && !isIncreasing) - { + if (sample > lastSample && !isIncreasing) + { - // entering rising phase - isIncreasing = true; - nSamplesSinceLastPeak++; + // entering rising phase + isIncreasing = true; + nSamplesSinceLastPeak++; - } else if (sample < lastSample && isIncreasing && nSamplesSinceLastPeak >= minSamplesToNextPeak) { + } + else if (sample < lastSample && isIncreasing && nSamplesSinceLastPeak >= minSamplesToNextPeak) + { - numPeakIntervals++; + numPeakIntervals++; - // entering falling phase (just reached peak) - if (true) - addEvent(events, TTL, i, 1, 3); + // entering falling phase (just reached peak) + if (true) + addEvent(events, TTL, i, 1, 3); - peakIntervals[numPeakIntervals % NUM_INTERVALS] = nSamplesSinceLastPeak; + peakIntervals[numPeakIntervals % NUM_INTERVALS] = nSamplesSinceLastPeak; - isIncreasing = false; + isIncreasing = false; - nSamplesSinceLastPeak = 0; + nSamplesSinceLastPeak = 0; - estimateFrequency(); + estimateFrequency(); - } else { + } + else + { - // either rising or falling - nSamplesSinceLastPeak++; + // either rising or falling + nSamplesSinceLastPeak++; - if (nSamplesSinceLastPeak == 100) - { - addEvent(events, TTL, i, 0, 3); - } + if (nSamplesSinceLastPeak == 100) + { + addEvent(events, TTL, i, 0, 3); + } - } + } - lastSample = sample; + lastSample = sample; - } + } } @@ -157,17 +163,17 @@ void PhaseDetector::process(AudioSampleBuffer &buffer, void PhaseDetector::estimateFrequency() { - int N = (numPeakIntervals < NUM_INTERVALS) ? numPeakIntervals - : NUM_INTERVALS; + int N = (numPeakIntervals < NUM_INTERVALS) ? numPeakIntervals + : NUM_INTERVALS; - int sum = 0; + int sum = 0; - for (int i = 0; i < N; i++) - { - sum += peakIntervals[i]; - } + for (int i = 0; i < N; i++) + { + sum += peakIntervals[i]; + } - estimatedFrequency = getSampleRate()/(float(sum)/float(N)); + estimatedFrequency = getSampleRate()/(float(sum)/float(N)); diff --git a/Source/Processors/PhaseDetector.h b/Source/Processors/PhaseDetector.h index 60303f824abb48db27ae1fc28496e6f6692ee120..a8fe95dc1d23133f4600cbc8e8c4d1259856a500 100644 --- a/Source/Processors/PhaseDetector.h +++ b/Source/Processors/PhaseDetector.h @@ -25,10 +25,6 @@ #define __PHASEDETECTOR_H_F411F29D__ -#ifdef _WIN32 -#include <Windows.h> -#endif - #include "../../JuceLibraryCode/JuceHeader.h" #include "GenericProcessor.h" @@ -46,44 +42,47 @@ class PhaseDetector : public GenericProcessor { public: - - PhaseDetector(); - ~PhaseDetector(); - - void process (AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); - void setParameter (int parameterIndex, float newValue); - //AudioProcessorEditor* createEditor(); + PhaseDetector(); + ~PhaseDetector(); + + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); + void setParameter(int parameterIndex, float newValue); + + //AudioProcessorEditor* createEditor(); - bool hasEditor() const {return false;} + bool hasEditor() const + { + return false; + } - bool enable(); + bool enable(); - void updateSettings(); + void updateSettings(); private: - float lastPeak; - float maxFrequency; - float lastSample; + float lastPeak; + float maxFrequency; + float lastSample; - bool isIncreasing; + bool isIncreasing; - bool canBeTriggered; + bool canBeTriggered; - void handleEvent(int eventType, MidiMessage& event, int sampleNum); + void handleEvent(int eventType, MidiMessage& event, int sampleNum); - float estimatedFrequency; + float estimatedFrequency; - int nSamplesSinceLastPeak; - int minSamplesToNextPeak; + int nSamplesSinceLastPeak; + int minSamplesToNextPeak; - int* peakIntervals; - int numPeakIntervals; + int* peakIntervals; + int numPeakIntervals; - void estimateFrequency(); + void estimateFrequency(); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PhaseDetector); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PhaseDetector); }; diff --git a/Source/Processors/ProcessorGraph.cpp b/Source/Processors/ProcessorGraph.cpp index 2566d090617914031f68921c83a9f29699b159b9..4c96f42e82cbdd8d46777227a19a10d34159a3b1 100644 --- a/Source/Processors/ProcessorGraph.cpp +++ b/Source/Processors/ProcessorGraph.cpp @@ -50,16 +50,16 @@ #include "../UI/EditorViewport.h" ProcessorGraph::ProcessorGraph() : currentNodeId(100) - { +{ - // The ProcessorGraph will always have 0 inputs (all content is generated within graph) - // but it will have N outputs, where N is the number of channels for the audio monitor - setPlayConfigDetails(0, // number of inputs - 2, // number of outputs - 44100.0, // sampleRate - 1024); // blockSize + // The ProcessorGraph will always have 0 inputs (all content is generated within graph) + // but it will have N outputs, where N is the number of channels for the audio monitor + setPlayConfigDetails(0, // number of inputs + 2, // number of outputs + 44100.0, // sampleRate + 1024); // blockSize - createDefaultNodes(); + createDefaultNodes(); } @@ -69,117 +69,123 @@ ProcessorGraph::~ProcessorGraph() { } void ProcessorGraph::createDefaultNodes() { - // add output node -- sends output to the audio card - AudioProcessorGraph::AudioGraphIOProcessor* on = - new AudioProcessorGraph::AudioGraphIOProcessor(AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode); + // add output node -- sends output to the audio card + AudioProcessorGraph::AudioGraphIOProcessor* on = + new AudioProcessorGraph::AudioGraphIOProcessor(AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode); - // add record node -- sends output to disk - RecordNode* recn = new RecordNode(); - recn->setNodeId(RECORD_NODE_ID); + // add record node -- sends output to disk + RecordNode* recn = new RecordNode(); + recn->setNodeId(RECORD_NODE_ID); - // add audio node -- takes all inputs and selects those to be used for audio monitoring - AudioNode* an = new AudioNode(); - an->setNodeId(AUDIO_NODE_ID); + // add audio node -- takes all inputs and selects those to be used for audio monitoring + AudioNode* an = new AudioNode(); + an->setNodeId(AUDIO_NODE_ID); - // add audio resampling node -- resamples continuous signals to 44.1kHz - AudioResamplingNode* arn = new AudioResamplingNode(); - arn->setNodeId(RESAMPLING_NODE_ID); + // add audio resampling node -- resamples continuous signals to 44.1kHz + AudioResamplingNode* arn = new AudioResamplingNode(); + arn->setNodeId(RESAMPLING_NODE_ID); - addNode(on, OUTPUT_NODE_ID); - addNode(recn, RECORD_NODE_ID); - addNode(an, AUDIO_NODE_ID); - addNode(arn, RESAMPLING_NODE_ID); + addNode(on, OUTPUT_NODE_ID); + addNode(recn, RECORD_NODE_ID); + addNode(an, AUDIO_NODE_ID); + addNode(arn, RESAMPLING_NODE_ID); - // connect audio subnetwork - for (int n = 0; n < 2; n++) { + // connect audio subnetwork + for (int n = 0; n < 2; n++) + { - addConnection(AUDIO_NODE_ID, n, - RESAMPLING_NODE_ID, n); + addConnection(AUDIO_NODE_ID, n, + RESAMPLING_NODE_ID, n); - addConnection(RESAMPLING_NODE_ID, n, - OUTPUT_NODE_ID, n); + addConnection(RESAMPLING_NODE_ID, n, + OUTPUT_NODE_ID, n); - } + } - addConnection(AUDIO_NODE_ID, midiChannelIndex, - RESAMPLING_NODE_ID, midiChannelIndex); + addConnection(AUDIO_NODE_ID, midiChannelIndex, + RESAMPLING_NODE_ID, midiChannelIndex); - std::cout << "Default nodes created." << std::endl; + std::cout << "Default nodes created." << std::endl; } void* ProcessorGraph::createNewProcessor(String& description)//, - // GenericProcessor* source, - // GenericProcessor* dest) +// GenericProcessor* source, +// GenericProcessor* dest) { - GenericProcessor* processor = createProcessorFromDescription(description); + GenericProcessor* processor = createProcessorFromDescription(description); - int id = currentNodeId++; + int id = currentNodeId++; - if (processor != 0) { + if (processor != 0) + { - processor->setNodeId(id); // identifier within processor graph - std::cout << " Adding node to graph with ID number " << id << std::endl; + processor->setNodeId(id); // identifier within processor graph + std::cout << " Adding node to graph with ID number " << id << std::endl; - processor->setUIComponent(getUIComponent()); // give access to important pointers + processor->setUIComponent(getUIComponent()); // give access to important pointers - addNode(processor,id); // have to add it so it can be deleted by the graph + addNode(processor,id); // have to add it so it can be deleted by the graph - return processor->createEditor(); + return processor->createEditor(); - } else { + } + else + { - sendActionMessage("Not a valid processor type."); + sendActionMessage("Not a valid processor type."); - return 0; - } + return 0; + } } void ProcessorGraph::clearSignalChain() { - int n = 0; - - while (getNumNodes() > 4) - { - Node* node = getNode(n); - int nodeId = node->nodeId; - - if (nodeId != OUTPUT_NODE_ID && - nodeId != AUDIO_NODE_ID && - nodeId != RECORD_NODE_ID && - nodeId != RESAMPLING_NODE_ID) - { - GenericProcessor* p =(GenericProcessor*) node->getProcessor(); - removeProcessor(p); - } else { - n++; - } - } + int n = 0; + + while (getNumNodes() > 4) + { + Node* node = getNode(n); + int nodeId = node->nodeId; + + if (nodeId != OUTPUT_NODE_ID && + nodeId != AUDIO_NODE_ID && + nodeId != RECORD_NODE_ID && + nodeId != RESAMPLING_NODE_ID) + { + GenericProcessor* p =(GenericProcessor*) node->getProcessor(); + removeProcessor(p); + } + else + { + n++; + } + } } void ProcessorGraph::changeListenerCallback(ChangeBroadcaster* source) { - for (int i = 0; i < getNumNodes(); i++) - { - Node* node = getNode(i); + for (int i = 0; i < getNumNodes(); i++) + { + Node* node = getNode(i); - int nodeId = node->nodeId; + int nodeId = node->nodeId; - if (nodeId != OUTPUT_NODE_ID && - nodeId != AUDIO_NODE_ID && - nodeId != RECORD_NODE_ID && - nodeId != RESAMPLING_NODE_ID) - { - GenericProcessor* p =(GenericProcessor*) node->getProcessor(); - GenericEditor* e = (GenericEditor*) p->getEditor(); - e->refreshColors(); - } - } + if (nodeId != OUTPUT_NODE_ID && + nodeId != AUDIO_NODE_ID && + nodeId != RECORD_NODE_ID && + nodeId != RESAMPLING_NODE_ID) + { + GenericProcessor* p =(GenericProcessor*) node->getProcessor(); + GenericEditor* e = (GenericEditor*) p->getEditor(); + e->refreshColors(); + } + } } @@ -187,435 +193,478 @@ void ProcessorGraph::changeListenerCallback(ChangeBroadcaster* source) void ProcessorGraph::clearConnections() { - for (int i = 0; i < getNumConnections(); i++) - { - const Connection* connection = getConnection(i); - - if (connection->destNodeId == RESAMPLING_NODE_ID || - connection->destNodeId == OUTPUT_NODE_ID) - { - ; // leave it - } else { - removeConnection(i); - } - } - - for (int i = 0; i < getNumNodes(); i++) - { - Node* node = getNode(i); - - if (node->nodeId != OUTPUT_NODE_ID) { - GenericProcessor* p =(GenericProcessor*) node->getProcessor(); - p->resetConnections(); - } - } + for (int i = 0; i < getNumConnections(); i++) + { + const Connection* connection = getConnection(i); + + if (connection->destNodeId == RESAMPLING_NODE_ID || + connection->destNodeId == OUTPUT_NODE_ID) + { + ; // leave it + } + else + { + removeConnection(i); + } + } + + for (int i = 0; i < getNumNodes(); i++) + { + Node* node = getNode(i); + + if (node->nodeId != OUTPUT_NODE_ID) + { + GenericProcessor* p =(GenericProcessor*) node->getProcessor(); + p->resetConnections(); + } + } } void ProcessorGraph::updateConnections(Array<SignalChainTabButton*, CriticalSection> tabs) { - clearConnections(); // clear processor graph + clearConnections(); // clear processor graph - std::cout << "Updating connections:" << std::endl; + std::cout << "Updating connections:" << std::endl; - Array<GenericProcessor*> splitters; + Array<GenericProcessor*> splitters; - for (int n = 0; n < tabs.size(); n++) - { - std::cout << "Signal chain " << n << std::endl; + for (int n = 0; n < tabs.size(); n++) + { + std::cout << "Signal chain " << n << std::endl; - GenericEditor* sourceEditor = (GenericEditor*) tabs[n]->getEditor(); - GenericProcessor* source = (GenericProcessor*) sourceEditor->getProcessor(); + GenericEditor* sourceEditor = (GenericEditor*) tabs[n]->getEditor(); + GenericProcessor* source = (GenericProcessor*) sourceEditor->getProcessor(); - while (source != 0)// && destEditor->isEnabled()) - { - std::cout << "Source node: " << source->getName() << ", "; - GenericProcessor* dest = (GenericProcessor*) source->getDestNode(); + while (source != 0)// && destEditor->isEnabled()) + { + std::cout << "Source node: " << source->getName() << ", "; + GenericProcessor* dest = (GenericProcessor*) source->getDestNode(); - if (dest != 0) - { - std::cout << "Dest node: " << dest->getName() << std::endl; - if (dest->isMerger()) // move it forward by one - { - dest = dest->getDestNode(); - } else if (dest->isSplitter()) - { - if (!dest->wasConnected) - splitters.add(dest); + if (dest != 0) + { + std::cout << "Dest node: " << dest->getName() << std::endl; + if (dest->isMerger()) // move it forward by one + { + dest = dest->getDestNode(); + } + else if (dest->isSplitter()) + { + if (!dest->wasConnected) + splitters.add(dest); - dest = dest->getDestNode(); - } + dest = dest->getDestNode(); + } - } else { - std::cout << "no dest node." << std::endl; - } + } + else + { + std::cout << "no dest node." << std::endl; + } - if (source->enabledState()) - { + if (source->enabledState()) + { - // add the connections to audio and record nodes if necessary - if (!(source->isSink() || - source->isSplitter() || source->isMerger()) && !(source->wasConnected)) - { - std::cout << " Connecting to audio and record nodes." << std::endl; + // add the connections to audio and record nodes if necessary + if (!(source->isSink() || + source->isSplitter() || source->isMerger()) && !(source->wasConnected)) + { + std::cout << " Connecting to audio and record nodes." << std::endl; - //source->setStartChannel(getAudioNode()->getNextChannel(false)); + //source->setStartChannel(getAudioNode()->getNextChannel(false)); - for (int chan = 0; chan < source->getNumOutputs(); chan++) { + for (int chan = 0; chan < source->getNumOutputs(); chan++) + { - getAudioNode()->addInputChannel(source, chan); + getAudioNode()->addInputChannel(source, chan); - // std::cout << "Connecting to audio channel: " << - // getAudioNode()->getNextChannel(false) << std::endl; + // std::cout << "Connecting to audio channel: " << + // getAudioNode()->getNextChannel(false) << std::endl; - //getAudioNode()->enableCurrentChannel(source->audioStatus(chan)); + //getAudioNode()->enableCurrentChannel(source->audioStatus(chan)); - addConnection(source->getNodeId(), // sourceNodeID - chan, // sourceNodeChannelIndex - AUDIO_NODE_ID, // destNodeID - getAudioNode()->getNextChannel(true)); // destNodeChannelIndex - // add 2 to account for 2 output channels + addConnection(source->getNodeId(), // sourceNodeID + chan, // sourceNodeChannelIndex + AUDIO_NODE_ID, // destNodeID + getAudioNode()->getNextChannel(true)); // destNodeChannelIndex + // add 2 to account for 2 output channels - //std::cout << getAudioNode()->getNextChannel(false) << " "; + //std::cout << getAudioNode()->getNextChannel(false) << " "; - getRecordNode()->addInputChannel(source, chan); + getRecordNode()->addInputChannel(source, chan); - // std::cout << "Connecting to record channel: " << - // getRecordNode()->getNextChannel(false) << std::endl; + // std::cout << "Connecting to record channel: " << + // getRecordNode()->getNextChannel(false) << std::endl; - addConnection(source->getNodeId(), // sourceNodeID - chan, // sourceNodeChannelIndex - RECORD_NODE_ID, // destNodeID - getRecordNode()->getNextChannel(true)); // destNodeChannelIndex + addConnection(source->getNodeId(), // sourceNodeID + chan, // sourceNodeChannelIndex + RECORD_NODE_ID, // destNodeID + getRecordNode()->getNextChannel(true)); // destNodeChannelIndex - } + } - // connect event channel - addConnection(source->getNodeId(), // sourceNodeID - midiChannelIndex, // sourceNodeChannelIndex - RECORD_NODE_ID, // destNodeID - midiChannelIndex); // destNodeChannelIndex + // connect event channel + addConnection(source->getNodeId(), // sourceNodeID + midiChannelIndex, // sourceNodeChannelIndex + RECORD_NODE_ID, // destNodeID + midiChannelIndex); // destNodeChannelIndex - // connect event channel - addConnection(source->getNodeId(), // sourceNodeID - midiChannelIndex, // sourceNodeChannelIndex - AUDIO_NODE_ID, // destNodeID - midiChannelIndex); // destNodeChannelIndex + // connect event channel + addConnection(source->getNodeId(), // sourceNodeID + midiChannelIndex, // sourceNodeChannelIndex + AUDIO_NODE_ID, // destNodeID + midiChannelIndex); // destNodeChannelIndex - getRecordNode()->addInputChannel(source, midiChannelIndex); + getRecordNode()->addInputChannel(source, midiChannelIndex); - } + } - std::cout << std::endl; + std::cout << std::endl; - if (dest != 0) { + if (dest != 0) + { - if (dest->enabledState()) - std::cout << " OK." << std::endl; - else - std::cout << " Not OK." << std::endl; + if (dest->enabledState()) + std::cout << " OK." << std::endl; + else + std::cout << " Not OK." << std::endl; - if (dest->enabledState()) - { + if (dest->enabledState()) + { - std::cout << " Connecting " << source->getName() << " channel "; + std::cout << " Connecting " << source->getName() << " channel "; - for (int chan = 0; chan < source->getNumOutputs(); chan++) - { - std::cout << chan << " "; + for (int chan = 0; chan < source->getNumOutputs(); chan++) + { + std::cout << chan << " "; - addConnection(source->getNodeId(), // sourceNodeID - chan, // sourceNodeChannelIndex - dest->getNodeId(), // destNodeID - dest->getNextChannel(true)); // destNodeChannelIndex - } + addConnection(source->getNodeId(), // sourceNodeID + chan, // sourceNodeChannelIndex + dest->getNodeId(), // destNodeID + dest->getNextChannel(true)); // destNodeChannelIndex + } - std::cout << " to " << dest->getName() << std::endl; + std::cout << " to " << dest->getName() << std::endl; - std::cout << " Connecting " << source->getName() << - " event channel to " << - dest->getName() << std::endl; + std::cout << " Connecting " << source->getName() << + " event channel to " << + dest->getName() << std::endl; - // connect event channel - addConnection(source->getNodeId(), // sourceNodeID - midiChannelIndex, // sourceNodeChannelIndex - dest->getNodeId(), // destNodeID - midiChannelIndex); // destNodeChannelIndex + // connect event channel + addConnection(source->getNodeId(), // sourceNodeID + midiChannelIndex, // sourceNodeChannelIndex + dest->getNodeId(), // destNodeID + midiChannelIndex); // destNodeChannelIndex - } + } - } - } + } + } - source->wasConnected = true; - source = dest; // switch source and dest + source->wasConnected = true; + source = dest; // switch source and dest - if (source == 0 && splitters.size() > 0) - { - dest = splitters.getFirst(); // dest is now the splitter - splitters.remove(0); // take it out of the - dest->switchIO(); // switch to the other destination - dest->wasConnected = true; // don't want to re-add splitter - source = dest->getSourceNode(); // splitter is now source - } + if (source == 0 && splitters.size() > 0) + { + dest = splitters.getFirst(); // dest is now the splitter + splitters.remove(0); // take it out of the + dest->switchIO(); // switch to the other destination + dest->wasConnected = true; // don't want to re-add splitter + source = dest->getSourceNode(); // splitter is now source + } - } // end while source != 0 - } // end "tabs" for loop + } // end while source != 0 + } // end "tabs" for loop } // end method GenericProcessor* ProcessorGraph::createProcessorFromDescription(String& description) { - int splitPoint = description.indexOf("/"); - String processorType = description.substring(0,splitPoint); - String subProcessorType = description.substring(splitPoint+1); - - std::cout << processorType << "::" << subProcessorType << std::endl; - - GenericProcessor* processor = 0; - - if (processorType.equalsIgnoreCase("Sources")) { - - if (subProcessorType.equalsIgnoreCase("Intan Demo Board") || - subProcessorType.equalsIgnoreCase("File Reader") || - subProcessorType.equalsIgnoreCase("Custom FPGA") || - subProcessorType.equalsIgnoreCase("RHD2000 USB Board")) { - - // if (subProcessorType.equalsIgnoreCase("Intan Demo Board") && - // !processorWithSameNameExists(subProcessorType)) { - // std::cout << "Only one Intan Demo Board is allowed at a time." - // << std::endl; - // } else { - std::cout << "Creating a new data source." << std::endl; - processor = new SourceNode(subProcessorType); - - //} - - } else if (subProcessorType.equalsIgnoreCase("Signal Generator")) - { - processor = new SignalGenerator(); - std::cout << "Creating a new signal generator." << std::endl; - } else if (subProcessorType.equalsIgnoreCase("Event Generator")) - { - processor = new EventNode(); - std::cout << "Creating a new event node." << std::endl; - } - - - //sendActionMessage("New source node created."); - - - } else if (processorType.equalsIgnoreCase("Filters")) { - - if (subProcessorType.equalsIgnoreCase("Bandpass Filter")) { - - std::cout << "Creating a new filter." << std::endl; - processor = new FilterNode(); - - } else if (subProcessorType.equalsIgnoreCase("Resampler")) { - std::cout << "Creating a new resampler." << std::endl; - processor = new ResamplingNode(); - - } else if (subProcessorType.equalsIgnoreCase("Spike Detector")) { - std::cout << "Creating a new spike detector." << std::endl; - processor = new SpikeDetector(); - } - else if (subProcessorType.equalsIgnoreCase("Event Detector")) { - std::cout << "Creating a new event detector." << std::endl; - processor = new EventDetector(); - } - else if (subProcessorType.equalsIgnoreCase("Phase Detector")) { - std::cout << "Creating a new phase detector." << std::endl; - processor = new PhaseDetector(); - } - else if (subProcessorType.equalsIgnoreCase("Digital Reference")) { - std::cout << "Creating a new digital reference." << std::endl; - processor = new ReferenceNode(); - } - - //sendActionMessage("New filter node created."); - - } else if (processorType.equalsIgnoreCase("Utilities")) { - - if (subProcessorType.equalsIgnoreCase("Splitter")) { - - std::cout << "Creating a new splitter." << std::endl; - processor = new Splitter(); - - //sendActionMessage("New splitter created."); - - } else if (subProcessorType.equalsIgnoreCase("Merger")) { - - std::cout << "Creating a new merger." << std::endl; - processor = new Merger(); - - //sendActionMessage("New merger created."); - - } else if (subProcessorType.equalsIgnoreCase("Record Controller")) { - - std::cout << "Creating a new record controller." << std::endl; - processor = new RecordControl(); - - } - - } else if (processorType.equalsIgnoreCase("Sinks")) { - - if (subProcessorType.equalsIgnoreCase("LFP Viewer")) { - std::cout << "Creating an LfpDisplayNode." << std::endl; - processor = new LfpDisplayNode(); - - // std::cout << "Graph data viewport: " << UI->getDataViewport() << std::endl; - // processor->setDataViewport(getDataViewport()); - //processor->setUIComponent(UI); - } - else if (subProcessorType.equalsIgnoreCase("Spike Viewer")) { - std::cout << "Creating an SpikeDisplayNode." << std::endl; - processor = new SpikeDisplayNode(); - } - else if (subProcessorType.equalsIgnoreCase("WiFi Output")) { - std::cout << "Creating a WiFi node." << std::endl; - processor = new WiFiOutput(); - } - else if (subProcessorType.equalsIgnoreCase("Arduino Output")) { - std::cout << "Creating an Arduino node." << std::endl; - processor = new ArduinoOutput(); - } - else if (subProcessorType.equalsIgnoreCase("FPGA Output")) { - std::cout << "Creating an FPGA output node." << std::endl; - processor = new FPGAOutput(); - } - - //sendActionMessage("New sink created."); - } - - return processor; + int splitPoint = description.indexOf("/"); + String processorType = description.substring(0,splitPoint); + String subProcessorType = description.substring(splitPoint+1); + + std::cout << processorType << "::" << subProcessorType << std::endl; + + GenericProcessor* processor = 0; + + if (processorType.equalsIgnoreCase("Sources")) + { + + if (subProcessorType.equalsIgnoreCase("Intan Demo Board") || + subProcessorType.equalsIgnoreCase("File Reader") || + subProcessorType.equalsIgnoreCase("Custom FPGA") || + subProcessorType.equalsIgnoreCase("RHD2000 USB Board")) + { + + // if (subProcessorType.equalsIgnoreCase("Intan Demo Board") && + // !processorWithSameNameExists(subProcessorType)) { + // std::cout << "Only one Intan Demo Board is allowed at a time." + // << std::endl; + // } else { + std::cout << "Creating a new data source." << std::endl; + processor = new SourceNode(subProcessorType); + + //} + + } + else if (subProcessorType.equalsIgnoreCase("Signal Generator")) + { + processor = new SignalGenerator(); + std::cout << "Creating a new signal generator." << std::endl; + } + else if (subProcessorType.equalsIgnoreCase("Event Generator")) + { + processor = new EventNode(); + std::cout << "Creating a new event node." << std::endl; + } + + + //sendActionMessage("New source node created."); + + + } + else if (processorType.equalsIgnoreCase("Filters")) + { + + if (subProcessorType.equalsIgnoreCase("Bandpass Filter")) + { + + std::cout << "Creating a new filter." << std::endl; + processor = new FilterNode(); + + } + else if (subProcessorType.equalsIgnoreCase("Resampler")) + { + std::cout << "Creating a new resampler." << std::endl; + processor = new ResamplingNode(); + + } + else if (subProcessorType.equalsIgnoreCase("Spike Detector")) + { + std::cout << "Creating a new spike detector." << std::endl; + processor = new SpikeDetector(); + } + else if (subProcessorType.equalsIgnoreCase("Event Detector")) + { + std::cout << "Creating a new event detector." << std::endl; + processor = new EventDetector(); + } + else if (subProcessorType.equalsIgnoreCase("Phase Detector")) + { + std::cout << "Creating a new phase detector." << std::endl; + processor = new PhaseDetector(); + } + else if (subProcessorType.equalsIgnoreCase("Digital Reference")) + { + std::cout << "Creating a new digital reference." << std::endl; + processor = new ReferenceNode(); + } + + //sendActionMessage("New filter node created."); + + } + else if (processorType.equalsIgnoreCase("Utilities")) + { + + if (subProcessorType.equalsIgnoreCase("Splitter")) + { + + std::cout << "Creating a new splitter." << std::endl; + processor = new Splitter(); + + //sendActionMessage("New splitter created."); + + } + else if (subProcessorType.equalsIgnoreCase("Merger")) + { + + std::cout << "Creating a new merger." << std::endl; + processor = new Merger(); + + //sendActionMessage("New merger created."); + + } + else if (subProcessorType.equalsIgnoreCase("Record Controller")) + { + + std::cout << "Creating a new record controller." << std::endl; + processor = new RecordControl(); + + } + + } + else if (processorType.equalsIgnoreCase("Sinks")) + { + + if (subProcessorType.equalsIgnoreCase("LFP Viewer")) + { + std::cout << "Creating an LfpDisplayNode." << std::endl; + processor = new LfpDisplayNode(); + + // std::cout << "Graph data viewport: " << UI->getDataViewport() << std::endl; + // processor->setDataViewport(getDataViewport()); + //processor->setUIComponent(UI); + } + else if (subProcessorType.equalsIgnoreCase("Spike Viewer")) + { + std::cout << "Creating an SpikeDisplayNode." << std::endl; + processor = new SpikeDisplayNode(); + } + else if (subProcessorType.equalsIgnoreCase("WiFi Output")) + { + std::cout << "Creating a WiFi node." << std::endl; + processor = new WiFiOutput(); + } + else if (subProcessorType.equalsIgnoreCase("Arduino Output")) + { + std::cout << "Creating an Arduino node." << std::endl; + processor = new ArduinoOutput(); + } + else if (subProcessorType.equalsIgnoreCase("FPGA Output")) + { + std::cout << "Creating an FPGA output node." << std::endl; + processor = new FPGAOutput(); + } + + //sendActionMessage("New sink created."); + } + + return processor; } bool ProcessorGraph::processorWithSameNameExists(const String& name) { - for (int i = 0; i < getNumNodes(); i++) - { - Node* node = getNode(i); + for (int i = 0; i < getNumNodes(); i++) + { + Node* node = getNode(i); - if (name.equalsIgnoreCase(node->getProcessor()->getName())) - return true; + if (name.equalsIgnoreCase(node->getProcessor()->getName())) + return true; - } + } - return false; + return false; } -void ProcessorGraph::removeProcessor(GenericProcessor* processor) { +void ProcessorGraph::removeProcessor(GenericProcessor* processor) +{ - std::cout << "Removing processor with ID " << processor->getNodeId() << std::endl; + std::cout << "Removing processor with ID " << processor->getNodeId() << std::endl; - removeNode(processor->getNodeId()); + removeNode(processor->getNodeId()); } -bool ProcessorGraph::enableProcessors() { +bool ProcessorGraph::enableProcessors() +{ - updateConnections(getEditorViewport()->requestSignalChain()); + updateConnections(getEditorViewport()->requestSignalChain()); - std::cout << "Enabling processors..." << std::endl; + std::cout << "Enabling processors..." << std::endl; - bool allClear; + bool allClear; - if (getNumNodes() < 5) - { - getUIComponent()->disableCallbacks(); - return false; - } + if (getNumNodes() < 5) + { + getUIComponent()->disableCallbacks(); + return false; + } - for (int i = 0; i < getNumNodes(); i++) - { + for (int i = 0; i < getNumNodes(); i++) + { - Node* node = getNode(i); + Node* node = getNode(i); - if (node->nodeId != OUTPUT_NODE_ID) - { - GenericProcessor* p = (GenericProcessor*) node->getProcessor(); - allClear = p->isReady(); + if (node->nodeId != OUTPUT_NODE_ID) + { + GenericProcessor* p = (GenericProcessor*) node->getProcessor(); + allClear = p->isReady(); - if (!allClear) { - std::cout << p->getName() << " said it's not OK." << std::endl; - // sendActionMessage("Could not initialize acquisition."); - getUIComponent()->disableCallbacks(); - return false; + if (!allClear) + { + std::cout << p->getName() << " said it's not OK." << std::endl; + // sendActionMessage("Could not initialize acquisition."); + getUIComponent()->disableCallbacks(); + return false; - } - } - } + } + } + } - for (int i = 0; i < getNumNodes(); i++) - { + for (int i = 0; i < getNumNodes(); i++) + { - Node* node = getNode(i); + Node* node = getNode(i); - if (node->nodeId != OUTPUT_NODE_ID) - { - GenericProcessor* p = (GenericProcessor*) node->getProcessor(); - p->enableEditor(); - p->enable(); - } - } + if (node->nodeId != OUTPUT_NODE_ID) + { + GenericProcessor* p = (GenericProcessor*) node->getProcessor(); + p->enableEditor(); + p->enable(); + } + } - getEditorViewport()->signalChainCanBeEdited(false); + getEditorViewport()->signalChainCanBeEdited(false); -// sendActionMessage("Acquisition started."); + // sendActionMessage("Acquisition started."); - return true; + return true; } -bool ProcessorGraph::disableProcessors() { +bool ProcessorGraph::disableProcessors() +{ - std::cout << "Disabling processors..." << std::endl; + std::cout << "Disabling processors..." << std::endl; - bool allClear; + bool allClear; - for (int i = 0; i < getNumNodes(); i++) - { - Node* node = getNode(i); - if (node->nodeId != OUTPUT_NODE_ID) - { - GenericProcessor* p = (GenericProcessor*) node->getProcessor(); - std::cout << "Disabling " << p->getName() << std::endl; - p->disableEditor(); - allClear = p->disable(); + for (int i = 0; i < getNumNodes(); i++) + { + Node* node = getNode(i); + if (node->nodeId != OUTPUT_NODE_ID) + { + GenericProcessor* p = (GenericProcessor*) node->getProcessor(); + std::cout << "Disabling " << p->getName() << std::endl; + p->disableEditor(); + allClear = p->disable(); - if (!allClear) { - // sendActionMessage("Could not stop acquisition."); - return false; - } - } - } + if (!allClear) + { + // sendActionMessage("Could not stop acquisition."); + return false; + } + } + } - getEditorViewport()->signalChainCanBeEdited(true); + getEditorViewport()->signalChainCanBeEdited(true); -// sendActionMessage("Acquisition ended."); + // sendActionMessage("Acquisition ended."); - return true; + return true; } -AudioNode* ProcessorGraph::getAudioNode() { +AudioNode* ProcessorGraph::getAudioNode() +{ - Node* node = getNodeForId(AUDIO_NODE_ID); - return (AudioNode*) node->getProcessor(); + Node* node = getNodeForId(AUDIO_NODE_ID); + return (AudioNode*) node->getProcessor(); } -RecordNode* ProcessorGraph::getRecordNode() { +RecordNode* ProcessorGraph::getRecordNode() +{ - Node* node = getNodeForId(RECORD_NODE_ID); - return (RecordNode*) node->getProcessor(); + Node* node = getNodeForId(RECORD_NODE_ID); + return (RecordNode*) node->getProcessor(); } diff --git a/Source/Processors/ProcessorGraph.h b/Source/Processors/ProcessorGraph.h index a0def0b108c4d1739764e47f771a82210d92dcdf..dcbce593b2dcf09fae05a89871dd6b064774dc2d 100755 --- a/Source/Processors/ProcessorGraph.h +++ b/Source/Processors/ProcessorGraph.h @@ -24,9 +24,6 @@ #ifndef __PROCESSORGRAPH_H_124F8B50__ #define __PROCESSORGRAPH_H_124F8B50__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "../AccessClass.h" @@ -37,10 +34,10 @@ class AudioNode; class SignalChainTabButton; /** - + Owns all processors and constructs the signal chain. - The GUI revolves around the ProcessorGraph, which enables the user to + The GUI revolves around the ProcessorGraph, which enables the user to dynamically update the signal chain. This object creates and deletes all of the processors that handle data, and holds the rules for connecting them prior to data acquisition. @@ -53,49 +50,49 @@ class SignalChainTabButton; */ class ProcessorGraph : public AudioProcessorGraph, - public AccessClass, - public ChangeListener + public AccessClass, + public ChangeListener { public: - ProcessorGraph(); - ~ProcessorGraph(); + ProcessorGraph(); + ~ProcessorGraph(); - void* createNewProcessor(String& description); - GenericProcessor* createProcessorFromDescription(String& description); + void* createNewProcessor(String& description); + GenericProcessor* createProcessorFromDescription(String& description); - void removeProcessor(GenericProcessor* processor); + void removeProcessor(GenericProcessor* processor); - void clearSignalChain(); + void clearSignalChain(); - bool enableProcessors(); - bool disableProcessors(); + bool enableProcessors(); + bool disableProcessors(); - RecordNode* getRecordNode(); - AudioNode* getAudioNode(); + RecordNode* getRecordNode(); + AudioNode* getAudioNode(); - void updateConnections(Array<SignalChainTabButton*, CriticalSection>); + void updateConnections(Array<SignalChainTabButton*, CriticalSection>); - bool processorWithSameNameExists(const String& name); + bool processorWithSameNameExists(const String& name); - void changeListenerCallback(ChangeBroadcaster* source); + void changeListenerCallback(ChangeBroadcaster* source); - // void saveState(); - // void loadState(); + // void saveState(); + // void loadState(); -private: +private: - int currentNodeId; + int currentNodeId; - enum nodeIds - { - RECORD_NODE_ID = 900, - AUDIO_NODE_ID = 901, - OUTPUT_NODE_ID = 902, - RESAMPLING_NODE_ID = 903 - }; + enum nodeIds + { + RECORD_NODE_ID = 900, + AUDIO_NODE_ID = 901, + OUTPUT_NODE_ID = 902, + RESAMPLING_NODE_ID = 903 + }; - void createDefaultNodes(); - void clearConnections(); + void createDefaultNodes(); + void clearConnections(); }; diff --git a/Source/Processors/RecordNode.cpp b/Source/Processors/RecordNode.cpp index 558d246c5d4fc5deba686b0d226faf9bc7f21995..0bd09520ed7d31a1655cf7e26fff155a73990382 100755 --- a/Source/Processors/RecordNode.cpp +++ b/Source/Processors/RecordNode.cpp @@ -27,72 +27,73 @@ #include "Channel.h" RecordNode::RecordNode() - : GenericProcessor("Record Node"), - isRecording(false), isProcessing(false), signalFilesShouldClose(false), - timestamp(0) + : GenericProcessor("Record Node"), + isRecording(false), isProcessing(false), signalFilesShouldClose(false), + timestamp(0) { - - continuousDataIntegerBuffer = new int16[10000]; - continuousDataFloatBuffer = new float[10000]; - signalFilesShouldClose = false; - settings.numInputs = 128; - settings.numOutputs = 0; + continuousDataIntegerBuffer = new int16[10000]; + continuousDataFloatBuffer = new float[10000]; + signalFilesShouldClose = false; - eventChannel = new Channel(this, 0); - eventChannel->isEventChannel = true; + settings.numInputs = 128; + settings.numOutputs = 0; - recordMarker = new char[10]; - for (int i = 0; i < 9; i++) - { - recordMarker[i] = 0; - } - recordMarker[9] = 255; + eventChannel = new Channel(this, 0); + eventChannel->isEventChannel = true; - // 128 inputs, 0 outputs - setPlayConfigDetails(getNumInputs(),getNumOutputs(),44100.0,128); + recordMarker = new char[10]; + for (int i = 0; i < 9; i++) + { + recordMarker[i] = 0; + } + recordMarker[9] = 255; + + // 128 inputs, 0 outputs + setPlayConfigDetails(getNumInputs(),getNumOutputs(),44100.0,128); } -RecordNode::~RecordNode() { +RecordNode::~RecordNode() +{ } void RecordNode::setChannel(Channel* ch) { - int channelNum = channelPointers.indexOf(ch); + int channelNum = channelPointers.indexOf(ch); - std::cout << "Record node setting channel to " << channelNum << std::endl; + std::cout << "Record node setting channel to " << channelNum << std::endl; - setCurrentChannel(channelNum); + setCurrentChannel(channelNum); - // for (int i = 0; i < con.size(); i++) - // { + // for (int i = 0; i < con.size(); i++) + // { - // if (continuousChannels[i].nodeId == id && - // continuousChannels[i].chan == chan) - // { - // std::cout << "Found channel " << i << std::endl; - // setCurrentChannel(i); - // break; - // } + // if (continuousChannels[i].nodeId == id && + // continuousChannels[i].chan == chan) + // { + // std::cout << "Found channel " << i << std::endl; + // setCurrentChannel(i); + // break; + // } - // } + // } } void RecordNode::setChannelStatus(Channel* ch, bool status) { - //std::cout << "Setting channel status!" << std::endl; - setChannel(ch); + //std::cout << "Setting channel status!" << std::endl; + setChannel(ch); - if (status) - setParameter(2, 1.0f); - else - setParameter(2, 0.0f); + if (status) + setParameter(2, 1.0f); + else + setParameter(2, 0.0f); } @@ -103,31 +104,31 @@ void RecordNode::setChannelStatus(Channel* ch, bool status) void RecordNode::resetConnections() { - //std::cout << "Resetting connections" << std::endl; - nextAvailableChannel = 0; - wasConnected = false; + //std::cout << "Resetting connections" << std::endl; + nextAvailableChannel = 0; + wasConnected = false; + + channelPointers.clear(); + eventChannelPointers.clear(); - channelPointers.clear(); - eventChannelPointers.clear(); - } void RecordNode::filenameComponentChanged(FilenameComponent* fnc) { - std::cout << "Got a new file" << std::endl; - dataDirectory = fnc->getCurrentFile(); - std::cout << "File name: " << dataDirectory.getFullPathName(); - if (dataDirectory.isDirectory()) - std::cout << " is a directory." << std::endl; - else - std::cout << " is NOT a directory." << std::endl; + std::cout << "Got a new file" << std::endl; + dataDirectory = fnc->getCurrentFile(); + std::cout << "File name: " << dataDirectory.getFullPathName(); + if (dataDirectory.isDirectory()) + std::cout << " is a directory." << std::endl; + else + std::cout << " is NOT a directory." << std::endl; + + createNewDirectory(); - createNewDirectory(); - } @@ -135,63 +136,67 @@ void RecordNode::filenameComponentChanged(FilenameComponent* fnc) void RecordNode::addInputChannel(GenericProcessor* sourceNode, int chan) { - if (chan != getProcessorGraph()->midiChannelIndex) - { - - int channelIndex = getNextChannel(false); + if (chan != getProcessorGraph()->midiChannelIndex) + { + + int channelIndex = getNextChannel(false); setPlayConfigDetails(channelIndex+1,0,44100.0,128); channelPointers.add(sourceNode->channels[chan]); - // std::cout << channelIndex << std::endl; + // std::cout << channelIndex << std::endl; updateFileName(channelPointers[channelIndex]); - - //if (channelPointers[channelIndex]->isRecording) - // std::cout << " This channel will be recorded." << std::endl; - //else - // std::cout << " This channel will NOT be recorded." << std::endl; - - //std::cout << "adding channel " << getNextChannel(false) << std::endl; - //std::pair<int, Channel> newPair (getNextChannel(false), newChannel); + //if (channelPointers[channelIndex]->isRecording) + // std::cout << " This channel will be recorded." << std::endl; + //else + // std::cout << " This channel will NOT be recorded." << std::endl; + + //std::cout << "adding channel " << getNextChannel(false) << std::endl; - //std::cout << "adding channel " << getNextChannel(false) << std::endl; + //std::pair<int, Channel> newPair (getNextChannel(false), newChannel); - //continuouschannelPointers.insert(newPair); + //std::cout << "adding channel " << getNextChannel(false) << std::endl; - - } else { + //continuouschannelPointers.insert(newPair); - for (int n = 0; n < sourceNode->eventChannels.size(); n++) - { - eventChannelPointers.add(sourceNode->eventChannels[n]); + } + else + { - } + for (int n = 0; n < sourceNode->eventChannels.size(); n++) + { - } + eventChannelPointers.add(sourceNode->eventChannels[n]); + + } + + } } void RecordNode::updateFileName(Channel* ch) { - String filename = rootFolder.getFullPathName(); - filename += rootFolder.separatorString; - - if (!ch->isEventChannel) - { - filename += ch->nodeId; - filename += "_"; - filename += ch->name; - filename += ".continuous"; - } else { - filename += "all_channels.events"; - } - + String filename = rootFolder.getFullPathName(); + filename += rootFolder.separatorString; + + if (!ch->isEventChannel) + { + filename += ch->nodeId; + filename += "_"; + filename += ch->name; + filename += ".continuous"; + } + else + { + filename += "all_channels.events"; + } + ch->filename = filename; ch->file = 0; @@ -201,411 +206,429 @@ void RecordNode::updateFileName(Channel* ch) void RecordNode::createNewDirectory() { - std::cout << "Creating new directory." << std::endl; + std::cout << "Creating new directory." << std::endl; - rootFolder = File(dataDirectory.getFullPathName() + File::separator + generateDirectoryName()); + rootFolder = File(dataDirectory.getFullPathName() + File::separator + generateDirectoryName()); - updateFileName(eventChannel); + updateFileName(eventChannel); - for (int i = 0; i < channelPointers.size(); i++) - { - updateFileName(channelPointers[i]); - } + for (int i = 0; i < channelPointers.size(); i++) + { + updateFileName(channelPointers[i]); + } } String RecordNode::generateDirectoryName() { - Time calendar = Time::getCurrentTime(); + Time calendar = Time::getCurrentTime(); - Array<int> t; - t.add(calendar.getYear()-2000); - t.add(calendar.getMonth()+1); // January = 0 - t.add(calendar.getDayOfMonth()); - t.add(calendar.getHours()); - t.add(calendar.getMinutes()); - t.add(calendar.getSeconds()); + Array<int> t; + t.add(calendar.getYear()-2000); + t.add(calendar.getMonth()+1); // January = 0 + t.add(calendar.getDayOfMonth()); + t.add(calendar.getHours()); + t.add(calendar.getMinutes()); + t.add(calendar.getSeconds()); - String filename = ""; - - for (int n = 0; n < t.size(); n++) - { - if (t[n] < 10) - filename += "0"; + String filename = ""; - filename += t[n]; + for (int n = 0; n < t.size(); n++) + { + if (t[n] < 10) + filename += "0"; - if (n == 2) - filename += "_"; - else if (n < 5) - filename += "-"; - } + filename += t[n]; - return filename; + if (n == 2) + filename += "_"; + else if (n < 5) + filename += "-"; + } + + return filename; } String RecordNode::generateDateString() { - Time calendar = Time::getCurrentTime(); - - String datestring; - - datestring += String(calendar.getDayOfMonth()); - datestring += "-"; - datestring += calendar.getMonthName(true); - datestring += "-"; - datestring += String(calendar.getYear()); - datestring += " "; - datestring += calendar.getHours(); - datestring += ":"; - datestring += calendar.getMinutes(); - datestring += ":"; - datestring += calendar.getSeconds(); - - return datestring; + Time calendar = Time::getCurrentTime(); + + String datestring; + + datestring += String(calendar.getDayOfMonth()); + datestring += "-"; + datestring += calendar.getMonthName(true); + datestring += "-"; + datestring += String(calendar.getYear()); + datestring += " "; + datestring += calendar.getHours(); + datestring += ":"; + datestring += calendar.getMinutes(); + datestring += ":"; + datestring += calendar.getSeconds(); + + return datestring; } -void RecordNode::setParameter (int parameterIndex, float newValue) +void RecordNode::setParameter(int parameterIndex, float newValue) { - // 0 = stop recording - // 1 = start recording - // 2 = toggle individual channel (0.0f = OFF, anything else = ON) + // 0 = stop recording + // 1 = start recording + // 2 = toggle individual channel (0.0f = OFF, anything else = ON) + + if (parameterIndex == 1) + { + + isRecording = true; + std::cout << "START RECORDING." << std::endl; + + if (!rootFolder.exists()) + rootFolder.createDirectory(); - if (parameterIndex == 1) { + openFile(eventChannel); - isRecording = true; - std::cout << "START RECORDING." << std::endl; + // create / open necessary files + for (int i = 0; i < channelPointers.size(); i++) + { + if (channelPointers[i]->isRecording) + { + openFile(channelPointers[i]); + } + } - if (!rootFolder.exists()) - rootFolder.createDirectory(); + } + else if (parameterIndex == 0) + { - openFile(eventChannel); - // create / open necessary files - for (int i = 0; i < channelPointers.size(); i++) - { - if (channelPointers[i]->isRecording) - { - openFile(channelPointers[i]); - } - } + std::cout << "STOP RECORDING." << std::endl; - } else if (parameterIndex == 0) { + if (isRecording) + { - - std::cout << "STOP RECORDING." << std::endl; + // close necessary files + signalFilesShouldClose = true; - if (isRecording) { + } - // close necessary files - signalFilesShouldClose = true; - - } + isRecording = false; - isRecording = false; - - } else if (parameterIndex == 2) { + } + else if (parameterIndex == 2) + { - if (isProcessing) { + if (isProcessing) + { - std::cout << "Toggling channel " << currentChannel << std::endl; + std::cout << "Toggling channel " << currentChannel << std::endl; - if (newValue == 0.0f) { - channelPointers[currentChannel]->isRecording = false; + if (newValue == 0.0f) + { + channelPointers[currentChannel]->isRecording = false; - if (isRecording) { - closeFile(channelPointers[currentChannel]); - } + if (isRecording) + { + closeFile(channelPointers[currentChannel]); + } - } - else { - channelPointers[currentChannel]->isRecording = true; + } + else + { + channelPointers[currentChannel]->isRecording = true; - if (isRecording) { + if (isRecording) + { - openFile(channelPointers[currentChannel]); - - } - } - } - } + openFile(channelPointers[currentChannel]); + + } + } + } + } } void RecordNode::openFile(Channel* ch) { - std::cout << "OPENING FILE: " << ch->filename << std::endl; + std::cout << "OPENING FILE: " << ch->filename << std::endl; - File f = File(ch->filename); - FILE *chFile; + File f = File(ch->filename); + FILE* chFile; - bool fileExists = f.exists(); + bool fileExists = f.exists(); - chFile = fopen(ch->filename.toUTF8(), "ab"); + chFile = fopen(ch->filename.toUTF8(), "ab"); - if (!fileExists) - { - // create and write header - std::cout << "Writing header." << std::endl; - String header = generateHeader(ch); - //std::cout << header << std::endl; - std::cout << "File ID: " << chFile << ", number of bytes: " << header.getNumBytesAsUTF8() << std::endl; + if (!fileExists) + { + // create and write header + std::cout << "Writing header." << std::endl; + String header = generateHeader(ch); + //std::cout << header << std::endl; + std::cout << "File ID: " << chFile << ", number of bytes: " << header.getNumBytesAsUTF8() << std::endl; - fwrite(header.toUTF8(), 1, header.getNumBytesAsUTF8(), chFile); + fwrite(header.toUTF8(), 1, header.getNumBytesAsUTF8(), chFile); - std::cout << "Wrote header." << std::endl; + std::cout << "Wrote header." << std::endl; - } else { - std::cout << "File already exists, just opening." << std::endl; - } - //To avoid a race condition resulting on data written before the header, - //do not assign the channel pointer until the header has been written - ch->file = chFile; + } + else + { + std::cout << "File already exists, just opening." << std::endl; + } + //To avoid a race condition resulting on data written before the header, + //do not assign the channel pointer until the header has been written + ch->file = chFile; } void RecordNode::closeFile(Channel* ch) { - std::cout << "CLOSING FILE: " << ch->filename << std::endl; - if (ch->file != NULL) - fclose(ch->file); + std::cout << "CLOSING FILE: " << ch->filename << std::endl; + if (ch->file != NULL) + fclose(ch->file); } String RecordNode::generateHeader(Channel* ch) { - String header = "header.format = 'OPEN EPHYS DATA FORMAT v0.0'; \n"; + String header = "header.format = 'OPEN EPHYS DATA FORMAT v0.0'; \n"; - header += "header.header_bytes = "; - header += String(HEADER_SIZE); - header += ";\n"; + header += "header.header_bytes = "; + header += String(HEADER_SIZE); + header += ";\n"; - if (ch->isEventChannel) - { - header += "header.description = 'each record contains one 64-bit timestamp, one 16-bit sample position, one uint8 event type, one uint8 processor ID, one uint8 event ID, and one uint8 event channel'; \n"; + if (ch->isEventChannel) + { + header += "header.description = 'each record contains one 64-bit timestamp, one 16-bit sample position, one uint8 event type, one uint8 processor ID, one uint8 event ID, and one uint8 event channel'; \n"; - } else { - header += "header.description = 'each record contains one 64-bit timestamp, one 16-bit sample count (N), N 16-bit samples, and one 10-byte record marker (0 0 0 0 0 0 0 0 0 255)'; \n"; - } + } + else + { + header += "header.description = 'each record contains one 64-bit timestamp, one 16-bit sample count (N), N 16-bit samples, and one 10-byte record marker (0 0 0 0 0 0 0 0 0 255)'; \n"; + } - header += "header.date_created = '"; - header += generateDateString(); - header += "';\n"; + header += "header.date_created = '"; + header += generateDateString(); + header += "';\n"; - header += "header.channel = '"; - header += ch->name; - header += "';\n"; + header += "header.channel = '"; + header += ch->name; + header += "';\n"; - if (ch->isEventChannel) - { + if (ch->isEventChannel) + { - header += "header.channelType = 'Event';\n"; + header += "header.channelType = 'Event';\n"; - } else { + } + else + { - header += "header.channelType = 'Continuous';\n"; + header += "header.channelType = 'Continuous';\n"; - header += "header.sampleRate = "; - header += String(ch->sampleRate); - header += ";\n"; - } + header += "header.sampleRate = "; + header += String(ch->sampleRate); + header += ";\n"; + } - header += "header.bitVolts = "; - header += String(ch->bitVolts); - header += ";\n"; + header += "header.bitVolts = "; + header += String(ch->bitVolts); + header += ";\n"; - header = header.paddedRight(' ', HEADER_SIZE); + header = header.paddedRight(' ', HEADER_SIZE); - //std::cout << header << std::endl; + //std::cout << header << std::endl; - return header; + return header; } void RecordNode::closeAllFiles() { - for (int i = 0; i < channelPointers.size(); i++) - { - if (channelPointers[i]->isRecording) - { - closeFile(channelPointers[i]); - } - } + for (int i = 0; i < channelPointers.size(); i++) + { + if (channelPointers[i]->isRecording) + { + closeFile(channelPointers[i]); + } + } - closeFile(eventChannel); + closeFile(eventChannel); } bool RecordNode::enable() { - //updateFileName(eventChannel); + //updateFileName(eventChannel); - isProcessing = true; - return true; + isProcessing = true; + return true; } -bool RecordNode::disable() -{ - // close files if necessary - setParameter(0, 10.0f); +bool RecordNode::disable() +{ + // close files if necessary + setParameter(0, 10.0f); - isProcessing = false; + isProcessing = false; - return true; + return true; } float RecordNode::getFreeSpace() { - return 1.0f - float(dataDirectory.getBytesFreeOnVolume())/float(dataDirectory.getVolumeTotalSize()); + return 1.0f - float(dataDirectory.getBytesFreeOnVolume())/float(dataDirectory.getVolumeTotalSize()); } void RecordNode::writeContinuousBuffer(float* data, int nSamples, int channel) { - if (channelPointers[channel]->file == NULL) - return; + if (channelPointers[channel]->file == NULL) + return; - float scaleFactor = float(0x7fff) * channelPointers[channel]->bitVolts; - // scale the data appropriately -- currently just getting it into the right - // range; actually need to take into account the gain of each channel - for (int n = 0; n < nSamples; n++) - { - *(continuousDataFloatBuffer+n) = *(data+n) / scaleFactor; // 10000.0f; - } + float scaleFactor = float(0x7fff) * channelPointers[channel]->bitVolts; + // scale the data appropriately -- currently just getting it into the right + // range; actually need to take into account the gain of each channel + for (int n = 0; n < nSamples; n++) + { + *(continuousDataFloatBuffer+n) = *(data+n) / scaleFactor; // 10000.0f; + } - // find file and write samples to disk + // find file and write samples to disk - //if (nSamples < 1000) // this is temporary, but there seems to be an error reading in the data if too many samples are written - // in the first few blocks - //{ + //if (nSamples < 1000) // this is temporary, but there seems to be an error reading in the data if too many samples are written + // in the first few blocks + //{ - AudioDataConverters::convertFloatToInt16BE(continuousDataFloatBuffer, continuousDataIntegerBuffer, nSamples); + AudioDataConverters::convertFloatToInt16BE(continuousDataFloatBuffer, continuousDataIntegerBuffer, nSamples); - int16 samps = (int16) nSamples; + int16 samps = (int16) nSamples; - //std::cout << samps << std::endl; + //std::cout << samps << std::endl; - fwrite(×tamp, // ptr - 8, // size of each element - 1, // count - channelPointers[channel]->file); // ptr to FILE object + fwrite(×tamp, // ptr + 8, // size of each element + 1, // count + channelPointers[channel]->file); // ptr to FILE object - fwrite(&samps, // ptr - 2, // size of each element - 1, // count - channelPointers[channel]->file); // ptr to FILE object + fwrite(&samps, // ptr + 2, // size of each element + 1, // count + channelPointers[channel]->file); // ptr to FILE object - fwrite(continuousDataIntegerBuffer, // ptr - 2, // size of each element - nSamples, // count - channelPointers[channel]->file); // ptr to FILE object - // FIXME: ensure fwrite returns equal "count"; otherwise, - // there was an error. + fwrite(continuousDataIntegerBuffer, // ptr + 2, // size of each element + nSamples, // count + channelPointers[channel]->file); // ptr to FILE object + // FIXME: ensure fwrite returns equal "count"; otherwise, + // there was an error. - // write a 10-byte marker indicating the end of a record - fwrite(recordMarker, // ptr - 1, // size of each element - 10, // count - channelPointers[channel]->file); // ptr to FILE object + // write a 10-byte marker indicating the end of a record + fwrite(recordMarker, // ptr + 1, // size of each element + 10, // count + channelPointers[channel]->file); // ptr to FILE object - //} + //} } - + void RecordNode::writeEventBuffer(MidiMessage& event, int samplePosition) //, int node, int channel) { - // find file and write samples to disk - //std::cout << "Received event!" << std::endl; + // find file and write samples to disk + //std::cout << "Received event!" << std::endl; - const uint8* dataptr = event.getRawData(); - int16 samplePos = (int16) samplePosition; + const uint8* dataptr = event.getRawData(); + int16 samplePos = (int16) samplePosition; - // write timestamp (for buffer only, not the actual event timestamp!!!!!) - fwrite(×tamp, // ptr - 8, // size of each element - 1, // count - eventChannel->file); // ptr to FILE object + // write timestamp (for buffer only, not the actual event timestamp!!!!!) + fwrite(×tamp, // ptr + 8, // size of each element + 1, // count + eventChannel->file); // ptr to FILE object - fwrite(&samplePos, // ptr - 2, // size of each element - 1, // count - eventChannel->file); // ptr to FILE object + fwrite(&samplePos, // ptr + 2, // size of each element + 1, // count + eventChannel->file); // ptr to FILE object - // write 1st four bytes of event (type, nodeId, eventId, eventChannel) - fwrite(dataptr, 1, 4, eventChannel->file); + // write 1st four bytes of event (type, nodeId, eventId, eventChannel) + fwrite(dataptr, 1, 4, eventChannel->file); } void RecordNode::handleEvent(int eventType, MidiMessage& event, int samplePosition) { - if (eventType == TTL) - { - writeEventBuffer(event, samplePosition); - } + if (eventType == TTL) + { + writeEventBuffer(event, samplePosition); + } } -void RecordNode::process(AudioSampleBuffer &buffer, - MidiBuffer &events, - int& nSamples) +void RecordNode::process(AudioSampleBuffer& buffer, + MidiBuffer& events, + int& nSamples) { - //std::cout << "Record node processing block." << std::endl; - //std::cout << "Num channels: " << buffer.getNumChannels() << std::endl; + //std::cout << "Record node processing block." << std::endl; + //std::cout << "Num channels: " << buffer.getNumChannels() << std::endl; + + + if (isRecording) + { + timestamp = timer.getHighResolutionTicks(); - if (isRecording) { + // WHY IS THIS AFFECTING THE LFP DISPLAY? + //buffer.applyGain(0, nSamples, 5.2438f); - timestamp = timer.getHighResolutionTicks(); + // cycle through events -- extract the samples per channel + // NOT YET IMPLEMENTED - // WHY IS THIS AFFECTING THE LFP DISPLAY? - //buffer.applyGain(0, nSamples, 5.2438f); + // cycle through buffer channels - // cycle through events -- extract the samples per channel - // NOT YET IMPLEMENTED + if (channelPointers.size() > 0) + { - // cycle through buffer channels + for (int i = 0; i < buffer.getNumChannels(); i++) + { - if (channelPointers.size() > 0) - { - for (int i = 0; i < buffer.getNumChannels(); i++) - { + if (channelPointers[i]->isRecording) + { + // write buffer to disk! + writeContinuousBuffer(buffer.getSampleData(i), + nSamples, + i); + //std::cout << "Record channel " << i << std::endl; + } - if (channelPointers[i]->isRecording) - { - // write buffer to disk! - writeContinuousBuffer(buffer.getSampleData(i), - nSamples, - i); - - //std::cout << "Record channel " << i << std::endl; - } - - } - } + } + } - // cycle through events - checkForEvents(events); + // cycle through events + checkForEvents(events); - return; + return; - } + } - // this is intended to prevent parameter changes from closing files - // before recording stops - if (signalFilesShouldClose) - { - closeAllFiles(); - signalFilesShouldClose = false; - } + // this is intended to prevent parameter changes from closing files + // before recording stops + if (signalFilesShouldClose) + { + closeAllFiles(); + signalFilesShouldClose = false; + } } diff --git a/Source/Processors/RecordNode.h b/Source/Processors/RecordNode.h index abaafc28a6d6d0a3a51848ae6d64b8e138f1395f..8135886975070ae31439b96656ffeb833f11602b 100755 --- a/Source/Processors/RecordNode.h +++ b/Source/Processors/RecordNode.h @@ -25,9 +25,6 @@ #define __RECORDNODE_H_FB9B1CA7__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include <stdio.h> #include <map> @@ -50,139 +47,139 @@ */ class RecordNode : public GenericProcessor, - public FilenameComponentListener + public FilenameComponentListener { public: - - RecordNode(); - ~RecordNode(); - /** Handle incoming data and decide which files and events to write to disk. - */ - void process(AudioSampleBuffer &buffer, MidiBuffer &eventBuffer, int& nSamples); + RecordNode(); + ~RecordNode(); - /** Overrides implementation in GenericProcessor; used to change recording parameters - on the fly. + /** Handle incoming data and decide which files and events to write to disk. + */ + void process(AudioSampleBuffer& buffer, MidiBuffer& eventBuffer, int& nSamples); - parameterIndex = 0: stop recording - parameterIndex = 1: start recording - parameterIndex = 2: - newValue = 0: turn off recording for current channel - newValue = 1: turn on recording for current channel - */ - void setParameter (int parameterIndex, float newValue); + /** Overrides implementation in GenericProcessor; used to change recording parameters + on the fly. - void addInputChannel(GenericProcessor* sourceNode, int chan); + parameterIndex = 0: stop recording + parameterIndex = 1: start recording + parameterIndex = 2: + newValue = 0: turn off recording for current channel + newValue = 1: turn on recording for current channel + */ + void setParameter(int parameterIndex, float newValue); - bool enable(); - bool disable(); + void addInputChannel(GenericProcessor* sourceNode, int chan); - /** Called by the ControlPanel to determine the amount of space - left in the current dataDirectory. - */ - float getFreeSpace(); + bool enable(); + bool disable(); - /** Selects a channel relative to a particular processor with ID = id - */ - void setChannel(Channel* ch); + /** Called by the ControlPanel to determine the amount of space + left in the current dataDirectory. + */ + float getFreeSpace(); - /** Turns recording on and off for a particular channel. + /** Selects a channel relative to a particular processor with ID = id + */ + void setChannel(Channel* ch); - Channel numbers are absolute (based on RecordNode channel mapping). - */ - void setChannelStatus(Channel* ch, bool status); + /** Turns recording on and off for a particular channel. - /** Used to clear all connections prior to the start of acquisition. - */ - void resetConnections(); + Channel numbers are absolute (based on RecordNode channel mapping). + */ + void setChannelStatus(Channel* ch, bool status); - /** Callback to indicate when user has chosen a new data directory. - */ - void filenameComponentChanged(FilenameComponent*); + /** Used to clear all connections prior to the start of acquisition. + */ + void resetConnections(); + + /** Callback to indicate when user has chosen a new data directory. + */ + void filenameComponentChanged(FilenameComponent*); + + /** Creates a new data directory in the location specified by the fileNameComponent. + */ + void createNewDirectory(); - /** Creates a new data directory in the location specified by the fileNameComponent. - */ - void createNewDirectory(); - private: - /** Keep the RecordNode informed of acquisition and record states. - */ - bool isRecording, isProcessing, signalFilesShouldClose; + /** Keep the RecordNode informed of acquisition and record states. + */ + bool isRecording, isProcessing, signalFilesShouldClose; + + /** User-selectable directory for saving data files. Currently + defaults to the user's home directory. + */ + File dataDirectory; - /** User-selectable directory for saving data files. Currently - defaults to the user's home directory. - */ - File dataDirectory; + /** Automatically generated folder for each recording session. + */ + File rootFolder; - /** Automatically generated folder for each recording session. - */ - File rootFolder; + /** Holds data that has been converted from float to int16 before + saving. + */ + int16* continuousDataIntegerBuffer; - /** Holds data that has been converted from float to int16 before - saving. - */ - int16* continuousDataIntegerBuffer; + /** Holds data that has been converted from float to int16 before + saving. + */ + float* continuousDataFloatBuffer; - /** Holds data that has been converted from float to int16 before - saving. - */ - float* continuousDataFloatBuffer; + /** Integer timestamp saved for each buffer. + */ + int64 timestamp; - /** Integer timestamp saved for each buffer. - */ - int64 timestamp; + /** Used to generate timestamps if none are given. + */ + Time timer; - /** Used to generate timestamps if none are given. - */ - Time timer; + /** Opens a single file */ + void openFile(Channel* ch); - /** Opens a single file */ - void openFile(Channel* ch); + /** Closes a single file */ + void closeFile(Channel* ch); - /** Closes a single file */ - void closeFile(Channel* ch); + /** Closes all open files after recording has finished. + */ + void closeAllFiles(); - /** Closes all open files after recording has finished. - */ - void closeAllFiles(); + /** Pointers to all continuous channels */ + Array<Channel*> channelPointers; - /** Pointers to all continuous channels */ - Array<Channel*> channelPointers; + /** Pointers to all event channels */ + Array<Channel*> eventChannelPointers; - /** Pointers to all event channels */ - Array<Channel*> eventChannelPointers; + /** Generates a header for a given channel */ + String generateHeader(Channel* ch); - /** Generates a header for a given channel */ - String generateHeader(Channel* ch); + /** Generates a default directory name, based on the current date and time */ + String generateDirectoryName(); - /** Generates a default directory name, based on the current date and time */ - String generateDirectoryName(); + /** Generate a Matlab-compatible datestring */ + String generateDateString(); - /** Generate a Matlab-compatible datestring */ - String generateDateString(); + /** Generate filename for a given channel */ + void updateFileName(Channel* ch); - /** Generate filename for a given channel */ - void updateFileName(Channel* ch); + /** Cycle through the event buffer, looking for data to save */ + void handleEvent(int eventType, MidiMessage& event, int samplePos); - /** Cycle through the event buffer, looking for data to save */ - void handleEvent(int eventType, MidiMessage& event, int samplePos); + /** Object for holding information about the events file */ + Channel* eventChannel; - /** Object for holding information about the events file */ - Channel* eventChannel; + /** Method for writing continuous buffers to disk. + */ + void writeContinuousBuffer(float* data, int nSamples, int channel); - /** Method for writing continuous buffers to disk. - */ - void writeContinuousBuffer(float* data, int nSamples, int channel); - - /** Method for writing event buffers to disk. - */ - void writeEventBuffer(MidiMessage& event, int samplePos); + /** Method for writing event buffers to disk. + */ + void writeEventBuffer(MidiMessage& event, int samplePos); - /** Used to indicate the end of each record */ - char* recordMarker; + /** Used to indicate the end of each record */ + char* recordMarker; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RecordNode); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordNode); }; diff --git a/Source/Processors/ReferenceNode.cpp b/Source/Processors/ReferenceNode.cpp index a7aa5fa930e982959d8111c9546db0c46e4a7b5a..0fe93cdcd9dbe73078cf76d1306c011d099b0944 100644 --- a/Source/Processors/ReferenceNode.cpp +++ b/Source/Processors/ReferenceNode.cpp @@ -28,7 +28,7 @@ ReferenceNode::ReferenceNode() - : GenericProcessor("Digital Reference") + : GenericProcessor("Digital Reference") { @@ -42,31 +42,31 @@ ReferenceNode::~ReferenceNode() AudioProcessorEditor* ReferenceNode::createEditor() { - editor = new ReferenceNodeEditor(this, true); - - std::cout << "Creating editor." << std::endl; + editor = new ReferenceNodeEditor(this, true); - return editor; + std::cout << "Creating editor." << std::endl; + + return editor; } void ReferenceNode::updateSettings() -{ +{ + - } -void ReferenceNode::setParameter (int parameterIndex, float newValue) +void ReferenceNode::setParameter(int parameterIndex, float newValue) { } -void ReferenceNode::process(AudioSampleBuffer &buffer, - MidiBuffer &midiMessages, +void ReferenceNode::process(AudioSampleBuffer& buffer, + MidiBuffer& midiMessages, int& nSamples) { diff --git a/Source/Processors/ReferenceNode.h b/Source/Processors/ReferenceNode.h index 96c12370af14780199b1c103c6b0ec2381c14692..142f01c0978c1817b9c4540bb24ed5394fae6630 100644 --- a/Source/Processors/ReferenceNode.h +++ b/Source/Processors/ReferenceNode.h @@ -25,9 +25,6 @@ #define __REFERENCENODE_H_786EA929__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "GenericProcessor.h" @@ -45,23 +42,26 @@ class ReferenceNode : public GenericProcessor { public: - - ReferenceNode(); - ~ReferenceNode(); - - void process (AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); - void setParameter (int parameterIndex, float newValue); - AudioProcessorEditor* createEditor(); + ReferenceNode(); + ~ReferenceNode(); - bool hasEditor() const {return true;} + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); + void setParameter(int parameterIndex, float newValue); + + AudioProcessorEditor* createEditor(); + + bool hasEditor() const + { + return true; + } void updateSettings(); - + private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ReferenceNode); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ReferenceNode); }; diff --git a/Source/Processors/ResamplingNode.cpp b/Source/Processors/ResamplingNode.cpp index 412525d851cb4d0edd677bdfab5daaf7cf629323..ffc5a7ac01a7e8a5abcb07b7c25c827510ab41f2 100755 --- a/Source/Processors/ResamplingNode.cpp +++ b/Source/Processors/ResamplingNode.cpp @@ -27,58 +27,58 @@ #include <stdio.h> ResamplingNode::ResamplingNode() - : GenericProcessor("Resampler"), - targetSampleRate(5000.0f), ratio(1.0) + : GenericProcessor("Resampler"), + targetSampleRate(5000.0f), ratio(1.0) { - filter = new Dsp::SmoothedFilterDesign - <Dsp::RBJ::Design::LowPass, 1> (1024); + filter = new Dsp::SmoothedFilterDesign + <Dsp::RBJ::Design::LowPass, 1> (1024); - parameters.add(Parameter("Hz",500.0f, 10000.0f, targetSampleRate, 0, true)); + parameters.add(Parameter("Hz",500.0f, 10000.0f, targetSampleRate, 0, true)); - tempBuffer = new AudioSampleBuffer(16, TEMP_BUFFER_WIDTH); + tempBuffer = new AudioSampleBuffer(16, TEMP_BUFFER_WIDTH); } ResamplingNode::~ResamplingNode() { - filter = 0; + filter = 0; } AudioProcessorEditor* ResamplingNode::createEditor() { - editor = new ResamplingNodeEditor(this, true); + editor = new ResamplingNodeEditor(this, true); - //std::cout << "Creating editor." << std::endl; + //std::cout << "Creating editor." << std::endl; - return editor; + return editor; } -void ResamplingNode::setParameter (int parameterIndex, float newValue) +void ResamplingNode::setParameter(int parameterIndex, float newValue) { - if (parameterIndex == 0) - { - Parameter& p = parameters.getReference(parameterIndex); - p.setValue(newValue, 0); + if (parameterIndex == 0) + { + Parameter& p = parameters.getReference(parameterIndex); + p.setValue(newValue, 0); - targetSampleRate = newValue; + targetSampleRate = newValue; - settings.sampleRate = targetSampleRate; + settings.sampleRate = targetSampleRate; - ratio = sourceBufferSampleRate / targetSampleRate; + ratio = sourceBufferSampleRate / targetSampleRate; - for (int i = 0; i < channels.size(); i++) - { - channels[i]->sampleRate = targetSampleRate; - } + for (int i = 0; i < channels.size(); i++) + { + channels[i]->sampleRate = targetSampleRate; + } - updateFilter(); + updateFilter(); - //std::cout << "Got parameter update." << std::endl; - } + //std::cout << "Got parameter update." << std::endl; + } - //std::cout << float(p[0]) << std::endl; + //std::cout << float(p[0]) << std::endl; } @@ -86,112 +86,115 @@ bool ResamplingNode::enable() { - tempBuffer->clear(); + tempBuffer->clear(); - updateFilter(); + updateFilter(); - return true; + return true; } void ResamplingNode::updateSettings() { - sourceBufferSampleRate = settings.sampleRate; - settings.sampleRate = targetSampleRate; + sourceBufferSampleRate = settings.sampleRate; + settings.sampleRate = targetSampleRate; - if (getNumInputs() > 0) - tempBuffer->setSize(getNumInputs(), TEMP_BUFFER_WIDTH); + if (getNumInputs() > 0) + tempBuffer->setSize(getNumInputs(), TEMP_BUFFER_WIDTH); - ratio = sourceBufferSampleRate / targetSampleRate; + ratio = sourceBufferSampleRate / targetSampleRate; - for (int i = 0; i < channels.size(); i++) - { - channels[i]->sampleRate = targetSampleRate; - } + for (int i = 0; i < channels.size(); i++) + { + channels[i]->sampleRate = targetSampleRate; + } - updateFilter(); + updateFilter(); } -void ResamplingNode::updateFilter() { - - double cutoffFreq = (ratio > 1.0) ? 2 * targetSampleRate // downsample - : targetSampleRate / 2; // upsample +void ResamplingNode::updateFilter() +{ + + double cutoffFreq = (ratio > 1.0) ? 2 * targetSampleRate // downsample + : targetSampleRate / 2; // upsample double sampleFreq = (ratio > 1.0) ? sourceBufferSampleRate // downsample - : targetSampleRate; // upsample - - Dsp::Params params; - params[0] = sampleFreq; // sample rate - params[1] = cutoffFreq; // cutoff frequency - params[2] = 1.25; //Q // - - filter->setParams (params); - + : targetSampleRate; // upsample + + Dsp::Params params; + params[0] = sampleFreq; // sample rate + params[1] = cutoffFreq; // cutoff frequency + params[2] = 1.25; //Q // + + filter->setParams(params); + } -// void ResamplingNode::releaseResources() -// { +// void ResamplingNode::releaseResources() +// { // //fclose(file); // } -void ResamplingNode::process(AudioSampleBuffer &buffer, - MidiBuffer &midiMessages, - int& nSamples) +void ResamplingNode::process(AudioSampleBuffer& buffer, + MidiBuffer& midiMessages, + int& nSamples) { - //std::cout << "Resampling node sample count: " << nSamples << std::endl; ///buffer.getNumSamples() << std::endl; + //std::cout << "Resampling node sample count: " << nSamples << std::endl; ///buffer.getNumSamples() << std::endl; - // save data at the beginning of each round of processing + // save data at the beginning of each round of processing //writeContinuousBuffer(buffer.getSampleData(0), nSamples, 0); - int nSamps = float(nSamples); - int valuesNeeded = int(nSamps / ratio); + int nSamps = float(nSamples); + int valuesNeeded = int(nSamps / ratio); - if (ratio > 1.0001) { - // pre-apply filter before downsampling - filter->process (nSamples, buffer.getArrayOfChannels()); - } + if (ratio > 1.0001) + { + // pre-apply filter before downsampling + filter->process(nSamples, buffer.getArrayOfChannels()); + } - // initialize variables - tempBuffer->clear(); - int sourceBufferPos = 0; - int sourceBufferSize = buffer.getNumSamples(); - float subSampleOffset = 0.0; - int nextPos = (sourceBufferPos + 1) % sourceBufferSize; + // initialize variables + tempBuffer->clear(); + int sourceBufferPos = 0; + int sourceBufferSize = buffer.getNumSamples(); + float subSampleOffset = 0.0; + int nextPos = (sourceBufferPos + 1) % sourceBufferSize; - int tempBufferPos; + int tempBufferPos; - // code modified from "juce_ResamplingAudioSource.cpp": + // code modified from "juce_ResamplingAudioSource.cpp": for (tempBufferPos = 0; tempBufferPos < valuesNeeded; tempBufferPos++) { - float gain = 1.0; + float gain = 1.0; float alpha = (float) subSampleOffset; float invAlpha = 1.0f - alpha; - for (int channel = 0; channel < buffer.getNumChannels(); ++channel) { - - tempBuffer->addFrom(channel, // destChannel - tempBufferPos, // destSampleOffset - buffer, // source - channel, // sourceChannel - sourceBufferPos,// sourceSampleOffset - 1, // number of samples - invAlpha*gain); // gain to apply to source - - tempBuffer->addFrom(channel, // destChannel - tempBufferPos, // destSampleOffset - buffer, // source - channel, // sourceChannel - nextPos, // sourceSampleOffset - 1, // number of samples - alpha*gain); // gain to apply to source - - } + for (int channel = 0; channel < buffer.getNumChannels(); ++channel) + { + + tempBuffer->addFrom(channel, // destChannel + tempBufferPos, // destSampleOffset + buffer, // source + channel, // sourceChannel + sourceBufferPos,// sourceSampleOffset + 1, // number of samples + invAlpha*gain); // gain to apply to source + + tempBuffer->addFrom(channel, // destChannel + tempBufferPos, // destSampleOffset + buffer, // source + channel, // sourceChannel + nextPos, // sourceSampleOffset + 1, // number of samples + alpha*gain); // gain to apply to source + + } subSampleOffset += ratio; @@ -205,24 +208,27 @@ void ResamplingNode::process(AudioSampleBuffer &buffer, } } - // std::cout << sourceBufferPos << " " << tempBufferPos << std::endl; + // std::cout << sourceBufferPos << " " << tempBufferPos << std::endl; - if (ratio < 0.9999) { + if (ratio < 0.9999) + { - filter->process (tempBufferPos, tempBuffer->getArrayOfChannels()); - // apply the filter after upsampling - ///////filter->process (totalSamples, buffer.getArrayOfChannels()); - } else if (ratio <= 1.0001) { - - // no resampling is being applied, no need to filter, BUT... - // keep the filter stoked with samples to avoid discontinuities + filter->process(tempBufferPos, tempBuffer->getArrayOfChannels()); + // apply the filter after upsampling + ///////filter->process (totalSamples, buffer.getArrayOfChannels()); + } + else if (ratio <= 1.0001) + { - } + // no resampling is being applied, no need to filter, BUT... + // keep the filter stoked with samples to avoid discontinuities + + } - // copy the tempBuffer back into the original buffer - buffer = AudioSampleBuffer(tempBuffer->getArrayOfChannels(), 2, tempBufferPos);//buffer.getNumSamples()); + // copy the tempBuffer back into the original buffer + buffer = AudioSampleBuffer(tempBuffer->getArrayOfChannels(), 2, tempBufferPos);//buffer.getNumSamples()); - nSamples = valuesNeeded; + nSamples = valuesNeeded; } diff --git a/Source/Processors/ResamplingNode.h b/Source/Processors/ResamplingNode.h index 650771cc898ecd243112ec0a73981742f7b34782..9cd95c4c183b12f6ad652b18063204d43b864d7c 100755 --- a/Source/Processors/ResamplingNode.h +++ b/Source/Processors/ResamplingNode.h @@ -25,9 +25,6 @@ #define __RESAMPLINGNODE_H_79663B0__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "../Dsp/Dsp.h" #include "GenericProcessor.h" @@ -48,45 +45,48 @@ class ResamplingNode : public GenericProcessor { public: - - // real member functions: - ResamplingNode(); - ~ResamplingNode(); - void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); - void setParameter (int parameterIndex, float newValue); - - void updateSettings(); + // real member functions: + ResamplingNode(); + ~ResamplingNode(); - void updateFilter(); + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); + void setParameter(int parameterIndex, float newValue); - bool enable(); - - AudioProcessorEditor* createEditor(); - bool hasEditor() const {return true;} + void updateSettings(); + + void updateFilter(); + + bool enable(); + + AudioProcessorEditor* createEditor(); + bool hasEditor() const + { + return true; + } private: - // sample rate, timebase, and ratio info: - double targetSampleRate; - double sourceBufferSampleRate; //, destBufferSampleRate; - double ratio; //, lastRatio; - //double destBufferTimebaseSecs; - //int destBufferWidth; - - // major objects: - Dsp::Filter* filter; - //ScopedPointer<AudioSampleBuffer> destBuffer; - ScopedPointer<AudioSampleBuffer> tempBuffer; - - // is the destBuffer a temp buffer or not? - //bool destBufferIsTempBuffer; - //bool isTransmitting; - - // indexing objects that persist between rounds: - //int destBufferPos; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ResamplingNode); + // sample rate, timebase, and ratio info: + double targetSampleRate; + double sourceBufferSampleRate; //, destBufferSampleRate; + double ratio; //, lastRatio; + //double destBufferTimebaseSecs; + //int destBufferWidth; + + // major objects: + Dsp::Filter* filter; + //ScopedPointer<AudioSampleBuffer> destBuffer; + ScopedPointer<AudioSampleBuffer> tempBuffer; + + // is the destBuffer a temp buffer or not? + //bool destBufferIsTempBuffer; + //bool isTransmitting; + + // indexing objects that persist between rounds: + //int destBufferPos; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ResamplingNode); }; diff --git a/Source/Processors/Serial/ofArduino.cpp b/Source/Processors/Serial/ofArduino.cpp index 7fb2facb50fbbea3b8f9420cf7dbf7a6ad89aedc..9ba603d9fcd1d5f13bbcfa18256609528d9828b9 100755 --- a/Source/Processors/Serial/ofArduino.cpp +++ b/Source/Processors/Serial/ofArduino.cpp @@ -8,10 +8,10 @@ * - fixed ability to use analog pins as digital inputs * * 3/5/11: - * - added servo support for firmata 2.2 and greater (should be + * - added servo support for firmata 2.2 and greater (should be * backwards compatible with Erik Sjodin's older firmata servo * implementation) - * + * * * Copyright 2007-2008 (c) Erik Sjodin, eriksjodin.net * @@ -53,592 +53,692 @@ // TODO thread it? // TODO throw event or exception if the serial port goes down... //--------------------------------------------------------------------------- -ofArduino::ofArduino(){ - _portStatus=-1; - _waitForData=0; - _analogHistoryLength = 2; - _digitalHistoryLength = 2; - _stringHistoryLength = 1; - _sysExHistoryLength = 1; +ofArduino::ofArduino() +{ + _portStatus=-1; + _waitForData=0; + _analogHistoryLength = 2; + _digitalHistoryLength = 2; + _stringHistoryLength = 1; + _sysExHistoryLength = 1; - _majorProtocolVersion = 0; - _minorProtocolVersion = 0; - _majorFirmwareVersion = 0; - _minorFirmwareVersion = 0; - _firmwareName = "Unknown"; + _majorProtocolVersion = 0; + _minorProtocolVersion = 0; + _majorFirmwareVersion = 0; + _minorFirmwareVersion = 0; + _firmwareName = "Unknown"; - bUseDelay = true; + bUseDelay = true; - ofArduino::startTimeMicros = ofGetSystemTimeMicros(); + ofArduino::startTimeMicros = ofGetSystemTimeMicros(); } -ofArduino::~ofArduino() { - _port.close(); +ofArduino::~ofArduino() +{ + _port.close(); } // initialize pins once we get the Firmata version back from the Arduino board // the version is sent automatically by the Arduino board on startup -void ofArduino::initPins() { +void ofArduino::initPins() +{ int firstAnalogPin; - + if (_initialized) return; // already initialized - - // support Firmata 2.3/Arduino 1.0 with backwards compatibility + + // support Firmata 2.3/Arduino 1.0 with backwards compatibility // to previous protocol versions - if (_firmwareVersionSum >= FIRMWARE2_3) { + if (_firmwareVersionSum >= FIRMWARE2_3) + { _totalDigitalPins = 20; firstAnalogPin = 14; - } else { + } + else + { _totalDigitalPins = ARD_TOTAL_DIGITAL_PINS; firstAnalogPin = 16; } - + // ports - for(int i=0; i<ARD_TOTAL_PORTS; ++i) { - _digitalPortValue[i]=0; - _digitalPortReporting[i] = ARD_OFF; - } - + for (int i=0; i<ARD_TOTAL_PORTS; ++i) + { + _digitalPortValue[i]=0; + _digitalPortReporting[i] = ARD_OFF; + } + // digital pins - for(int i=0; i<firstAnalogPin; ++i) { - _digitalPinValue[i] = -1; - _digitalPinMode[i] = ARD_OUTPUT; - _digitalPinReporting[i] = ARD_OFF; - } - - // analog in pins - for (int i=firstAnalogPin; i<_totalDigitalPins; ++i) { - _analogPinReporting[i-firstAnalogPin] = ARD_OFF; - // analog pins used as digital - _digitalPinMode[i]=ARD_ANALOG; - _digitalPinValue[i] = -1; - } - - for (int i=0; i<_totalDigitalPins; ++i) { - _servoValue[i] = -1; - } - + for (int i=0; i<firstAnalogPin; ++i) + { + _digitalPinValue[i] = -1; + _digitalPinMode[i] = ARD_OUTPUT; + _digitalPinReporting[i] = ARD_OFF; + } + + // analog in pins + for (int i=firstAnalogPin; i<_totalDigitalPins; ++i) + { + _analogPinReporting[i-firstAnalogPin] = ARD_OFF; + // analog pins used as digital + _digitalPinMode[i]=ARD_ANALOG; + _digitalPinValue[i] = -1; + } + + for (int i=0; i<_totalDigitalPins; ++i) + { + _servoValue[i] = -1; + } + _initialized = true; } -bool ofArduino::connect(string device, int baud){ - connectTime = ofGetElapsedTimef(); - _initialized = false; - _port.enumerateDevices(); - connected = _port.setup(device.c_str(), baud); - return connected; +bool ofArduino::connect(string device, int baud) +{ + connectTime = ofGetElapsedTimef(); + _initialized = false; + _port.enumerateDevices(); + connected = _port.setup(device.c_str(), baud); + return connected; } // this method is not recommended // the preferred method is to listen for the EInitialized event in your application -bool ofArduino::isArduinoReady(){ - if(bUseDelay) { - if (_initialized || (ofGetElapsedTimef() - connectTime) > OF_ARDUINO_DELAY_LENGTH) { - initPins(); - connected = true; - } - } - return connected; +bool ofArduino::isArduinoReady() +{ + if (bUseDelay) + { + if (_initialized || (ofGetElapsedTimef() - connectTime) > OF_ARDUINO_DELAY_LENGTH) + { + initPins(); + connected = true; + } + } + return connected; } -void ofArduino::setUseDelay(bool bDelay){ - bUseDelay = bDelay; +void ofArduino::setUseDelay(bool bDelay) +{ + bUseDelay = bDelay; } -void ofArduino::setDigitalHistoryLength(int length){ - if(length>=2) - _digitalHistoryLength=length; +void ofArduino::setDigitalHistoryLength(int length) +{ + if (length>=2) + _digitalHistoryLength=length; } -void ofArduino::setAnalogHistoryLength(int length){ - if(length>=2) - _analogHistoryLength=length; +void ofArduino::setAnalogHistoryLength(int length) +{ + if (length>=2) + _analogHistoryLength=length; } -void ofArduino::setSysExHistoryLength(int length){ - if(length>=1) - _sysExHistoryLength=length; +void ofArduino::setSysExHistoryLength(int length) +{ + if (length>=1) + _sysExHistoryLength=length; } -void ofArduino::setStringHistoryLength(int length){ - if(length>=1) - _stringHistoryLength=length; +void ofArduino::setStringHistoryLength(int length) +{ + if (length>=1) + _stringHistoryLength=length; } -void ofArduino::disconnect(){ - _port.close(); +void ofArduino::disconnect() +{ + _port.close(); } -void ofArduino::update(){ - static vector<unsigned char> bytesToProcess; - int bytesToRead = _port.available(); - if (bytesToRead>0) { - std::cout << "Bytes found: " << bytesToRead << std::endl; - bytesToProcess.resize(bytesToRead); - _port.readBytes(&bytesToProcess[0], bytesToRead); - for (int i = 0; i < bytesToRead; i++) { - processData((char)(bytesToProcess[i])); - } - } +void ofArduino::update() +{ + static vector<unsigned char> bytesToProcess; + int bytesToRead = _port.available(); + if (bytesToRead>0) + { + std::cout << "Bytes found: " << bytesToRead << std::endl; + bytesToProcess.resize(bytesToRead); + _port.readBytes(&bytesToProcess[0], bytesToRead); + for (int i = 0; i < bytesToRead; i++) + { + processData((char)(bytesToProcess[i])); + } + } } -int ofArduino::getAnalog(int pin){ - if(_analogHistory[pin].size()>0) - return _analogHistory[pin].front(); - else - return -1; +int ofArduino::getAnalog(int pin) +{ + if (_analogHistory[pin].size()>0) + return _analogHistory[pin].front(); + else + return -1; } -int ofArduino::getDigital(int pin){ - if(_digitalPinMode[pin]==ARD_INPUT && _digitalHistory[pin].size()>0) - return _digitalHistory[pin].front(); - else if (_digitalPinMode[pin]==ARD_OUTPUT) - return _digitalPinValue[pin]; - else - return -1; +int ofArduino::getDigital(int pin) +{ + if (_digitalPinMode[pin]==ARD_INPUT && _digitalHistory[pin].size()>0) + return _digitalHistory[pin].front(); + else if (_digitalPinMode[pin]==ARD_OUTPUT) + return _digitalPinValue[pin]; + else + return -1; } -int ofArduino::getPwm(int pin){ - if(_digitalPinMode[pin]==ARD_PWM) - return _digitalPinValue[pin]; - else - return -1; +int ofArduino::getPwm(int pin) +{ + if (_digitalPinMode[pin]==ARD_PWM) + return _digitalPinValue[pin]; + else + return -1; } -vector<unsigned char> ofArduino::getSysEx(){ - return _sysExHistory.front(); +vector<unsigned char> ofArduino::getSysEx() +{ + return _sysExHistory.front(); } -string ofArduino::getString(){ - return _stringHistory.front(); +string ofArduino::getString() +{ + return _stringHistory.front(); } -int ofArduino::getDigitalPinMode(int pin){ - return _digitalPinMode[pin]; +int ofArduino::getDigitalPinMode(int pin) +{ + return _digitalPinMode[pin]; } -void ofArduino::sendDigital(int pin, int value, bool force){ - if((_digitalPinMode[pin]==ARD_INPUT || _digitalPinMode[pin]==ARD_OUTPUT) && (_digitalPinValue[pin]!=value || force)){ +void ofArduino::sendDigital(int pin, int value, bool force) +{ + if ((_digitalPinMode[pin]==ARD_INPUT || _digitalPinMode[pin]==ARD_OUTPUT) && (_digitalPinValue[pin]!=value || force)) + { - _digitalPinValue[pin] = value; + _digitalPinValue[pin] = value; - int port=0; - int bit=0; + int port=0; + int bit=0; int port1Offset; int port2Offset; - - // support Firmata 2.3/Arduino 1.0 with backwards compatibility + + // support Firmata 2.3/Arduino 1.0 with backwards compatibility // to previous protocol versions - if (_firmwareVersionSum >= FIRMWARE2_3) { + if (_firmwareVersionSum >= FIRMWARE2_3) + { port1Offset = 16; port2Offset = 20; - } else { + } + else + { port1Offset = 14; port2Offset = 22; } - if(pin < 8 && pin >1){ - port=0; - bit = pin; - } - else if(pin>7 && pin <port1Offset){ - port = 1; - bit = pin-8; - } - else if(pin>15 && pin <port2Offset){ - port = 2; - bit = pin-16; - } + if (pin < 8 && pin >1) + { + port=0; + bit = pin; + } + else if (pin>7 && pin <port1Offset) + { + port = 1; + bit = pin-8; + } + else if (pin>15 && pin <port2Offset) + { + port = 2; + bit = pin-16; + } - // set the bit - if(value==1) - _digitalPortValue[port] |= (1 << bit); + // set the bit + if (value==1) + _digitalPortValue[port] |= (1 << bit); - // clear the bit - if(value==0) - _digitalPortValue[port] &= ~(1 << bit); + // clear the bit + if (value==0) + _digitalPortValue[port] &= ~(1 << bit); - sendByte(FIRMATA_DIGITAL_MESSAGE+port); - sendValueAsTwo7bitBytes(_digitalPortValue[port]); + sendByte(FIRMATA_DIGITAL_MESSAGE+port); + sendValueAsTwo7bitBytes(_digitalPortValue[port]); - } + } } -void ofArduino::sendPwm(int pin, int value, bool force){ - if(_digitalPinMode[pin]==ARD_PWM && (_digitalPinValue[pin]!=value || force)){ - sendByte(FIRMATA_ANALOG_MESSAGE+pin); - sendValueAsTwo7bitBytes(value); - _digitalPinValue[pin] = value; - } +void ofArduino::sendPwm(int pin, int value, bool force) +{ + if (_digitalPinMode[pin]==ARD_PWM && (_digitalPinValue[pin]!=value || force)) + { + sendByte(FIRMATA_ANALOG_MESSAGE+pin); + sendValueAsTwo7bitBytes(value); + _digitalPinValue[pin] = value; + } } -void ofArduino::sendSysEx(int command, vector<unsigned char> data){ - sendByte(FIRMATA_START_SYSEX); - sendByte(command); - vector<unsigned char>::iterator it = data.begin(); - while( it != data.end() ) { - //sendByte(*it); // need to split data into 2 bytes before sending - sendValueAsTwo7bitBytes(*it); - it++; - } - sendByte(FIRMATA_END_SYSEX); +void ofArduino::sendSysEx(int command, vector<unsigned char> data) +{ + sendByte(FIRMATA_START_SYSEX); + sendByte(command); + vector<unsigned char>::iterator it = data.begin(); + while (it != data.end()) + { + //sendByte(*it); // need to split data into 2 bytes before sending + sendValueAsTwo7bitBytes(*it); + it++; + } + sendByte(FIRMATA_END_SYSEX); } -void ofArduino::sendSysExBegin(){ - sendByte(FIRMATA_START_SYSEX); +void ofArduino::sendSysExBegin() +{ + sendByte(FIRMATA_START_SYSEX); } -void ofArduino::sendSysExEnd(){ - sendByte(FIRMATA_END_SYSEX); +void ofArduino::sendSysExEnd() +{ + sendByte(FIRMATA_END_SYSEX); } -void ofArduino::sendString(string str){ - sendByte(FIRMATA_START_SYSEX); - sendByte(FIRMATA_SYSEX_FIRMATA_STRING); - string::iterator it = str.begin(); - while( it != str.end() ) { - sendValueAsTwo7bitBytes(*it); - it++; - } - sendByte(FIRMATA_END_SYSEX); +void ofArduino::sendString(string str) +{ + sendByte(FIRMATA_START_SYSEX); + sendByte(FIRMATA_SYSEX_FIRMATA_STRING); + string::iterator it = str.begin(); + while (it != str.end()) + { + sendValueAsTwo7bitBytes(*it); + it++; + } + sendByte(FIRMATA_END_SYSEX); } -void ofArduino::sendProtocolVersionRequest(){ - sendByte(FIRMATA_REPORT_VERSION); +void ofArduino::sendProtocolVersionRequest() +{ + sendByte(FIRMATA_REPORT_VERSION); } -void ofArduino::sendFirmwareVersionRequest(){ - sendByte(FIRMATA_START_SYSEX); - sendByte(FIRMATA_SYSEX_REPORT_FIRMWARE); - sendByte(FIRMATA_END_SYSEX); +void ofArduino::sendFirmwareVersionRequest() +{ + sendByte(FIRMATA_START_SYSEX); + sendByte(FIRMATA_SYSEX_REPORT_FIRMWARE); + sendByte(FIRMATA_END_SYSEX); } -void ofArduino::sendReset(){ - sendByte(FIRMATA_SYSTEM_RESET); +void ofArduino::sendReset() +{ + sendByte(FIRMATA_SYSTEM_RESET); } -void ofArduino::sendAnalogPinReporting(int pin, int mode){ +void ofArduino::sendAnalogPinReporting(int pin, int mode) +{ int firstAnalogPin; - // support Firmata 2.3/Arduino 1.0 with backwards compatibility + // support Firmata 2.3/Arduino 1.0 with backwards compatibility // to previous protocol versions - if (_firmwareVersionSum >= FIRMWARE2_3) { + if (_firmwareVersionSum >= FIRMWARE2_3) + { firstAnalogPin = 14; - } else { + } + else + { firstAnalogPin = 16; } - + // if this analog pin is set as a digital input, disable digital pin reporting - if (_digitalPinReporting[pin + firstAnalogPin] == ARD_ON) { + if (_digitalPinReporting[pin + firstAnalogPin] == ARD_ON) + { sendDigitalPinReporting(pin + firstAnalogPin, ARD_OFF); } - _digitalPinMode[firstAnalogPin+pin]=ARD_ANALOG; + _digitalPinMode[firstAnalogPin+pin]=ARD_ANALOG; - sendByte(FIRMATA_REPORT_ANALOG+pin); - sendByte(mode); - _analogPinReporting[pin] = mode; + sendByte(FIRMATA_REPORT_ANALOG+pin); + sendByte(mode); + _analogPinReporting[pin] = mode; } -void ofArduino::sendDigitalPinMode(int pin, int mode){ - sendByte(FIRMATA_SET_PIN_MODE); - sendByte(pin); - sendByte(mode); - _digitalPinMode[pin]=mode; - - // turn on or off reporting on the port - if(mode==ARD_INPUT){ - sendDigitalPinReporting(pin, ARD_ON); - } - else { - sendDigitalPinReporting(pin, ARD_OFF); - } +void ofArduino::sendDigitalPinMode(int pin, int mode) +{ + sendByte(FIRMATA_SET_PIN_MODE); + sendByte(pin); + sendByte(mode); + _digitalPinMode[pin]=mode; + + // turn on or off reporting on the port + if (mode==ARD_INPUT) + { + sendDigitalPinReporting(pin, ARD_ON); + } + else + { + sendDigitalPinReporting(pin, ARD_OFF); + } } -int ofArduino::getAnalogPinReporting(int pin){ - return _analogPinReporting[pin]; +int ofArduino::getAnalogPinReporting(int pin) +{ + return _analogPinReporting[pin]; } -list<int>* ofArduino::getAnalogHistory(int pin){ - return &_analogHistory[pin]; +list<int>* ofArduino::getAnalogHistory(int pin) +{ + return &_analogHistory[pin]; } -list<int>* ofArduino::getDigitalHistory(int pin){ - return &_digitalHistory[pin]; +list<int>* ofArduino::getDigitalHistory(int pin) +{ + return &_digitalHistory[pin]; } -list<vector<unsigned char> >* ofArduino::getSysExHistory(){ - return &_sysExHistory; +list<vector<unsigned char> >* ofArduino::getSysExHistory() +{ + return &_sysExHistory; } -list<string>* ofArduino::getStringHistory(){ - return &_stringHistory; +list<string>* ofArduino::getStringHistory() +{ + return &_stringHistory; } -int ofArduino::getMajorProtocolVersion(){ - return _majorFirmwareVersion; +int ofArduino::getMajorProtocolVersion() +{ + return _majorFirmwareVersion; } -int ofArduino::getMinorProtocolVersion(){ - return _minorFirmwareVersion; +int ofArduino::getMinorProtocolVersion() +{ + return _minorFirmwareVersion; } -int ofArduino::getMajorFirmwareVersion(){ - return _majorFirmwareVersion; +int ofArduino::getMajorFirmwareVersion() +{ + return _majorFirmwareVersion; } -int ofArduino::getMinorFirmwareVersion(){ - return _minorFirmwareVersion; +int ofArduino::getMinorFirmwareVersion() +{ + return _minorFirmwareVersion; } -string ofArduino::getFirmwareName(){ - return _firmwareName; +string ofArduino::getFirmwareName() +{ + return _firmwareName; } -bool ofArduino::isInitialized(){ - return _initialized; +bool ofArduino::isInitialized() +{ + return _initialized; } // ------------------------------ private functions -void ofArduino::processData(unsigned char inputData){ - - char msg[100]; - sprintf(msg, "Received Byte: %i", inputData); - //Logger::get("Application").information(msg); - - // we have command data - if(_waitForData>0 && inputData<128) { - _waitForData--; - - // collect the data - _storedInputData[_waitForData] = inputData; - - // we have all data executeMultiByteCommand - if(_waitForData==0) { - switch (_executeMultiByteCommand) { - case FIRMATA_DIGITAL_MESSAGE: - processDigitalPort(_multiByteChannel, (_storedInputData[0] << 7) | _storedInputData[1]); - break; - case FIRMATA_REPORT_VERSION: // report version - printf("Received report version\n\n"); - _majorProtocolVersion = _storedInputData[1]; - _minorProtocolVersion = _storedInputData[0]; - //ofNotifyEvent(EProtocolVersionReceived, _majorProtocolVersion, this); - break; - case FIRMATA_ANALOG_MESSAGE: - if(_analogHistory[_multiByteChannel].size()>0){ - int previous = _analogHistory[_multiByteChannel].front(); - - _analogHistory[_multiByteChannel].push_front((_storedInputData[0] << 7) | _storedInputData[1]); - if((int)_analogHistory[_multiByteChannel].size()>_analogHistoryLength) - _analogHistory[_multiByteChannel].pop_back(); - - // trigger an event if the pin has changed value - if(_analogHistory[_multiByteChannel].front()!=previous) - ; - //ofNotifyEvent(EAnalogPinChanged, _multiByteChannel, this); - }else{ - _analogHistory[_multiByteChannel].push_front((_storedInputData[0] << 7) | _storedInputData[1]); - if((int)_analogHistory[_multiByteChannel].size()>_analogHistoryLength) - _analogHistory[_multiByteChannel].pop_back(); - } - break; - } - - } - } - // we have SysEx command data - else if(_waitForData<0){ - - // we have all sysex data - if(inputData==FIRMATA_END_SYSEX){ - _waitForData=0; - processSysExData(_sysExData); - _sysExData.clear(); - } - // still have data, collect it - else { - _sysExData.push_back((unsigned char)inputData); - } - } - // we have a command - else{ - - int command; - - // extract the command and channel info from a byte if it is less than 0xF0 - if(inputData < 0xF0) { - command = inputData & 0xF0; - _multiByteChannel = inputData & 0x0F; - } - else { - // commands in the 0xF* range don't use channel data - command = inputData; - } - - switch (command) { - case FIRMATA_REPORT_VERSION: - case FIRMATA_DIGITAL_MESSAGE: - case FIRMATA_ANALOG_MESSAGE: - _waitForData = 2; // 2 bytes needed - _executeMultiByteCommand = command; - break; - case FIRMATA_START_SYSEX: - _sysExData.clear(); - _waitForData = -1; // n bytes needed, -1 is used to indicate sysex message - _executeMultiByteCommand = command; - break; - } - - } +void ofArduino::processData(unsigned char inputData) +{ + + char msg[100]; + sprintf(msg, "Received Byte: %i", inputData); + //Logger::get("Application").information(msg); + + // we have command data + if (_waitForData>0 && inputData<128) + { + _waitForData--; + + // collect the data + _storedInputData[_waitForData] = inputData; + + // we have all data executeMultiByteCommand + if (_waitForData==0) + { + switch (_executeMultiByteCommand) + { + case FIRMATA_DIGITAL_MESSAGE: + processDigitalPort(_multiByteChannel, (_storedInputData[0] << 7) | _storedInputData[1]); + break; + case FIRMATA_REPORT_VERSION: // report version + printf("Received report version\n\n"); + _majorProtocolVersion = _storedInputData[1]; + _minorProtocolVersion = _storedInputData[0]; + //ofNotifyEvent(EProtocolVersionReceived, _majorProtocolVersion, this); + break; + case FIRMATA_ANALOG_MESSAGE: + if (_analogHistory[_multiByteChannel].size()>0) + { + int previous = _analogHistory[_multiByteChannel].front(); + + _analogHistory[_multiByteChannel].push_front((_storedInputData[0] << 7) | _storedInputData[1]); + if ((int)_analogHistory[_multiByteChannel].size()>_analogHistoryLength) + _analogHistory[_multiByteChannel].pop_back(); + + // trigger an event if the pin has changed value + if (_analogHistory[_multiByteChannel].front()!=previous) + ; + //ofNotifyEvent(EAnalogPinChanged, _multiByteChannel, this); + } + else + { + _analogHistory[_multiByteChannel].push_front((_storedInputData[0] << 7) | _storedInputData[1]); + if ((int)_analogHistory[_multiByteChannel].size()>_analogHistoryLength) + _analogHistory[_multiByteChannel].pop_back(); + } + break; + } + + } + } + // we have SysEx command data + else if (_waitForData<0) + { + + // we have all sysex data + if (inputData==FIRMATA_END_SYSEX) + { + _waitForData=0; + processSysExData(_sysExData); + _sysExData.clear(); + } + // still have data, collect it + else + { + _sysExData.push_back((unsigned char)inputData); + } + } + // we have a command + else + { + + int command; + + // extract the command and channel info from a byte if it is less than 0xF0 + if (inputData < 0xF0) + { + command = inputData & 0xF0; + _multiByteChannel = inputData & 0x0F; + } + else + { + // commands in the 0xF* range don't use channel data + command = inputData; + } + + switch (command) + { + case FIRMATA_REPORT_VERSION: + case FIRMATA_DIGITAL_MESSAGE: + case FIRMATA_ANALOG_MESSAGE: + _waitForData = 2; // 2 bytes needed + _executeMultiByteCommand = command; + break; + case FIRMATA_START_SYSEX: + _sysExData.clear(); + _waitForData = -1; // n bytes needed, -1 is used to indicate sysex message + _executeMultiByteCommand = command; + break; + } + + } } // sysex data is assumed to be 8-bit bytes split into two 7-bit bytes. -void ofArduino::processSysExData(vector<unsigned char> data){ - - string str; - - vector<unsigned char>::iterator it; - unsigned char buffer; - //int i = 1; - - // act on reserved sysEx messages (extended commands) or trigger SysEx event... - switch(data.front()) { //first byte in buffer is command - case FIRMATA_SYSEX_REPORT_FIRMWARE: - it = data.begin(); - it++; // skip the first byte, which is the firmware version command - _majorFirmwareVersion = *it; - it++; - _minorFirmwareVersion = *it; - it++; - - while( it != data.end() ) { - buffer = *it; - it++; - buffer += *it << 7; - it++; - str+=buffer; - } - _firmwareName = str; - - _firmwareVersionSum = _majorFirmwareVersion * 10 + _minorFirmwareVersion; - //ofNotifyEvent(EFirmwareVersionReceived, _majorFirmwareVersion, this); - - // trigger the initialization event - if (!_initialized) { +void ofArduino::processSysExData(vector<unsigned char> data) +{ + + string str; + + vector<unsigned char>::iterator it; + unsigned char buffer; + //int i = 1; + + // act on reserved sysEx messages (extended commands) or trigger SysEx event... + switch (data.front()) //first byte in buffer is command + { + case FIRMATA_SYSEX_REPORT_FIRMWARE: + it = data.begin(); + it++; // skip the first byte, which is the firmware version command + _majorFirmwareVersion = *it; + it++; + _minorFirmwareVersion = *it; + it++; + + while (it != data.end()) + { + buffer = *it; + it++; + buffer += *it << 7; + it++; + str+=buffer; + } + _firmwareName = str; + + _firmwareVersionSum = _majorFirmwareVersion * 10 + _minorFirmwareVersion; + //ofNotifyEvent(EFirmwareVersionReceived, _majorFirmwareVersion, this); + + // trigger the initialization event + if (!_initialized) + { initPins(); //ofNotifyEvent(EInitialized, _majorFirmwareVersion, this); - + } - break; - case FIRMATA_SYSEX_FIRMATA_STRING: - it = data.begin(); - it++; // skip the first byte, which is the string command - while( it != data.end() ) { - buffer = *it; - it++; - buffer += *it << 7; - it++; - str+=buffer; - } - - _stringHistory.push_front(str); - if((int)_stringHistory.size()>_stringHistoryLength) - _stringHistory.pop_back(); - - //ofNotifyEvent(EStringReceived, str, this); - break; - default: // the message isn't in Firmatas extended command set - _sysExHistory.push_front(data); - if((int)_sysExHistory.size()>_sysExHistoryLength) - _sysExHistory.pop_back(); - //ofNotifyEvent(ESysExReceived, data, this); - break; - - } -} - -void ofArduino::processDigitalPort(int port, unsigned char value){ - - unsigned char mask; - int previous; - int i; - int pin; + break; + case FIRMATA_SYSEX_FIRMATA_STRING: + it = data.begin(); + it++; // skip the first byte, which is the string command + while (it != data.end()) + { + buffer = *it; + it++; + buffer += *it << 7; + it++; + str+=buffer; + } + + _stringHistory.push_front(str); + if ((int)_stringHistory.size()>_stringHistoryLength) + _stringHistory.pop_back(); + + //ofNotifyEvent(EStringReceived, str, this); + break; + default: // the message isn't in Firmatas extended command set + _sysExHistory.push_front(data); + if ((int)_sysExHistory.size()>_sysExHistoryLength) + _sysExHistory.pop_back(); + //ofNotifyEvent(ESysExReceived, data, this); + break; + + } +} + +void ofArduino::processDigitalPort(int port, unsigned char value) +{ + + unsigned char mask; + int previous; + int i; + int pin; int port1Pins; int port2Pins; - + // support Firmata 2.3/Arduino 1.0 with backwards compatibility to previous protocol versions - if (_firmwareVersionSum >= FIRMWARE2_3) { + if (_firmwareVersionSum >= FIRMWARE2_3) + { port1Pins = 8; port2Pins = 4; - } else { + } + else + { port1Pins = 6; port2Pins = 6; } - - switch(port) { - case 0: // pins 2-7 (0,1 are ignored as serial RX/TX) - for(i=2; i<8; ++i) { - pin = i; - if(_digitalPinMode[pin]==ARD_INPUT){ - previous = _digitalHistory[pin].front(); - mask = 1 << i; - _digitalHistory[pin].push_front((value & mask)>>i); + switch (port) + { + case 0: // pins 2-7 (0,1 are ignored as serial RX/TX) + for (i=2; i<8; ++i) + { + pin = i; + if (_digitalPinMode[pin]==ARD_INPUT) + { + previous = _digitalHistory[pin].front(); + + mask = 1 << i; + _digitalHistory[pin].push_front((value & mask)>>i); - if((int)_digitalHistory[pin].size()>_digitalHistoryLength) + if ((int)_digitalHistory[pin].size()>_digitalHistoryLength) _digitalHistory[pin].pop_back(); - // trigger an event if the pin has changed value - if(_digitalHistory[pin].front()!=previous){ - //ofNotifyEvent(EDigitalPinChanged, pin, this); + // trigger an event if the pin has changed value + if (_digitalHistory[pin].front()!=previous) + { + //ofNotifyEvent(EDigitalPinChanged, pin, this); + } } } - } - break; - case 1: // pins 8-13 (in Firmata 2.3/Arduino 1.0, pins 14 and 15 are analog 0 and 1) - for(i=0; i<port1Pins; ++i) { - pin = i+8; + break; + case 1: // pins 8-13 (in Firmata 2.3/Arduino 1.0, pins 14 and 15 are analog 0 and 1) + for (i=0; i<port1Pins; ++i) + { + pin = i+8; - if(_digitalPinMode[pin]==ARD_INPUT){ - previous = _digitalHistory[pin].front(); + if (_digitalPinMode[pin]==ARD_INPUT) + { + previous = _digitalHistory[pin].front(); - mask = 1 << i; - _digitalHistory[pin].push_front((value & mask)>>i); + mask = 1 << i; + _digitalHistory[pin].push_front((value & mask)>>i); - if((int)_digitalHistory[pin].size()>_digitalHistoryLength) - _digitalHistory[pin].pop_back(); + if ((int)_digitalHistory[pin].size()>_digitalHistoryLength) + _digitalHistory[pin].pop_back(); - // trigger an event if the pin has changed value - if(_digitalHistory[pin].front()!=previous){ - //ofNotifyEvent(EDigitalPinChanged, pin, this); + // trigger an event if the pin has changed value + if (_digitalHistory[pin].front()!=previous) + { + //ofNotifyEvent(EDigitalPinChanged, pin, this); + } } } - } - break; - case 2: // analog pins used as digital pins 16-21 (in Firmata 2.3/Arduino 1.0, digital pins 14 - 19) - for(i=0; i<port2Pins; ++i) { - //pin = i+analogOffset; - pin = i+16; - if(_digitalPinMode[pin]==ARD_INPUT){ - previous = _digitalHistory[pin].front(); - - mask = 1 << i; - _digitalHistory[pin].push_front((value & mask)>>i); - - if((int)_digitalHistory[pin].size()>_digitalHistoryLength) - _digitalHistory[pin].pop_back(); - - // trigger an event if the pin has changed value - if(_digitalHistory[pin].front()!=previous){ - //ofNotifyEvent(EDigitalPinChanged, pin, this); - } - } - } - break; - } + break; + case 2: // analog pins used as digital pins 16-21 (in Firmata 2.3/Arduino 1.0, digital pins 14 - 19) + for (i=0; i<port2Pins; ++i) + { + //pin = i+analogOffset; + pin = i+16; + if (_digitalPinMode[pin]==ARD_INPUT) + { + previous = _digitalHistory[pin].front(); + + mask = 1 << i; + _digitalHistory[pin].push_front((value & mask)>>i); + + if ((int)_digitalHistory[pin].size()>_digitalHistoryLength) + _digitalHistory[pin].pop_back(); + + // trigger an event if the pin has changed value + if (_digitalHistory[pin].front()!=previous) + { + //ofNotifyEvent(EDigitalPinChanged, pin, this); + } + } + } + break; + } } // port 0: pins 2-7 (0,1 are serial RX/TX, don't change their values) @@ -646,194 +746,231 @@ void ofArduino::processDigitalPort(int port, unsigned char value){ // port 2: pins 16-21 analog pins used as digital (in Firmata 2.3/Arduino 1.0, pins 14 - 19), // all analog reporting will be turned off if this is set to ARD_ON -void ofArduino::sendDigitalPortReporting(int port, int mode){ - sendByte(FIRMATA_REPORT_DIGITAL+port); - sendByte(mode); - _digitalPortReporting[port] = mode; +void ofArduino::sendDigitalPortReporting(int port, int mode) +{ + sendByte(FIRMATA_REPORT_DIGITAL+port); + sendByte(mode); + _digitalPortReporting[port] = mode; int offset; - - if (_firmwareVersionSum >= FIRMWARE2_3) { + + if (_firmwareVersionSum >= FIRMWARE2_3) + { offset = 2; - } else { + } + else + { offset = 0; } - + // for Firmata 2.3 and higher: - if(port==1 && mode==ARD_ON) { - for (int i=0; i<2; i++) { + if (port==1 && mode==ARD_ON) + { + for (int i=0; i<2; i++) + { _analogPinReporting[i] = ARD_OFF; - } + } } - + // for Firmata 2.3 and all prior Firmata protocol versions: - if(port==2 && mode==ARD_ON){ // if reporting is turned on on port 2 then ofArduino on the Arduino disables all analog reporting + if (port==2 && mode==ARD_ON) // if reporting is turned on on port 2 then ofArduino on the Arduino disables all analog reporting + { - for (int i=offset; i<ARD_TOTAL_ANALOG_PINS; i++) { - _analogPinReporting[i] = ARD_OFF; - } - } + for (int i=offset; i<ARD_TOTAL_ANALOG_PINS; i++) + { + _analogPinReporting[i] = ARD_OFF; + } + } } -void ofArduino::sendDigitalPinReporting(int pin, int mode){ - _digitalPinReporting[pin] = mode; +void ofArduino::sendDigitalPinReporting(int pin, int mode) +{ + _digitalPinReporting[pin] = mode; int port1Offset; int port2Offset; - + // Firmata backwards compatibility mess - if (_firmwareVersionSum >= FIRMWARE2_3) { + if (_firmwareVersionSum >= FIRMWARE2_3) + { port1Offset = 15; port2Offset = 19; - } else { + } + else + { port1Offset = 13; port2Offset = 21; } - - if(mode==ARD_ON){ // enable reporting for the port - if(pin<=7 && pin>=2) - sendDigitalPortReporting(0, ARD_ON); + + if (mode==ARD_ON) // enable reporting for the port + { + if (pin<=7 && pin>=2) + sendDigitalPortReporting(0, ARD_ON); // Firmata backwards compatibility mess - if(pin<=port1Offset && pin>=8) + if (pin<=port1Offset && pin>=8) sendDigitalPortReporting(1, ARD_ON); - if(pin<=port2Offset && pin>=16) - sendDigitalPortReporting(2, ARD_ON); - } - else if(mode==ARD_OFF){ - int i; - bool send=true; - if(pin<=7 && pin>=2){ // check if all pins on the port are off, if so set port reporting to off.. - for(i=2; i<8; ++i) { - if(_digitalPinReporting[i]==ARD_ON) - send=false; - } - if(send) - sendDigitalPortReporting(0, ARD_OFF); - } + if (pin<=port2Offset && pin>=16) + sendDigitalPortReporting(2, ARD_ON); + } + else if (mode==ARD_OFF) + { + int i; + bool send=true; + if (pin<=7 && pin>=2) // check if all pins on the port are off, if so set port reporting to off.. + { + for (i=2; i<8; ++i) + { + if (_digitalPinReporting[i]==ARD_ON) + send=false; + } + if (send) + sendDigitalPortReporting(0, ARD_OFF); + } // Firmata backwards compatibility mess - if(pin<=port1Offset && pin>=8){ - for(i=8; i<=port1Offset; ++i) { - if(_digitalPinReporting[i]==ARD_ON) - send=false; + if (pin<=port1Offset && pin>=8) + { + for (i=8; i<=port1Offset; ++i) + { + if (_digitalPinReporting[i]==ARD_ON) + send=false; } - if(send) + if (send) sendDigitalPortReporting(1, ARD_OFF); } - if(pin<=port2Offset && pin>=16){ - for(i=16; i<=port2Offset; ++i) { - if(_digitalPinReporting[i]==ARD_ON) - send=false; + if (pin<=port2Offset && pin>=16) + { + for (i=16; i<=port2Offset; ++i) + { + if (_digitalPinReporting[i]==ARD_ON) + send=false; } - if(send) + if (send) sendDigitalPortReporting(2, ARD_OFF); } - } + } } -void ofArduino::sendByte(unsigned char byte){ - //char msg[100]; - //sprintf(msg, "Sending Byte: %i", byte); - //Logger::get("Application").information(msg); - _port.writeByte(byte); +void ofArduino::sendByte(unsigned char byte) +{ + //char msg[100]; + //sprintf(msg, "Sending Byte: %i", byte); + //Logger::get("Application").information(msg); + _port.writeByte(byte); } // in Firmata (and MIDI) data bytes are 7-bits. The 8th bit serves as a flag to mark a byte as either command or data. // therefore you need two data bytes to send 8-bits (a char). void ofArduino::sendValueAsTwo7bitBytes(int value) { - sendByte(value & 127); // LSB - sendByte(value >> 7 & 127); // MSB + sendByte(value & 127); // LSB + sendByte(value >> 7 & 127); // MSB } // SysEx data is sent as 8-bit bytes split into two 7-bit bytes, this function merges two 7-bit bytes back into one 8-bit byte. -int ofArduino::getValueFromTwo7bitBytes(unsigned char lsb, unsigned char msb){ - return (msb << 7) | lsb; -} - -void ofArduino::sendServo(int pin, int value, bool force){ - // for firmata v2.2 and greater - if (_firmwareVersionSum >= FIRMWARE2_2) { - if(_digitalPinMode[pin]==ARD_SERVO && (_digitalPinValue[pin]!=value || force)){ - sendByte(FIRMATA_ANALOG_MESSAGE+pin); - sendValueAsTwo7bitBytes(value); - _digitalPinValue[pin] = value; - } - } - // for versions prior to 2.2 - else { - if(_digitalPinMode[pin]==ARD_SERVO && (_servoValue[pin]!=value || force)){ - sendByte(FIRMATA_START_SYSEX); - sendByte(SYSEX_SERVO_WRITE); - sendByte(pin); - sendValueAsTwo7bitBytes(value); - sendByte(FIRMATA_END_SYSEX); - _servoValue[pin]=value; - } - } +int ofArduino::getValueFromTwo7bitBytes(unsigned char lsb, unsigned char msb) +{ + return (msb << 7) | lsb; +} + +void ofArduino::sendServo(int pin, int value, bool force) +{ + // for firmata v2.2 and greater + if (_firmwareVersionSum >= FIRMWARE2_2) + { + if (_digitalPinMode[pin]==ARD_SERVO && (_digitalPinValue[pin]!=value || force)) + { + sendByte(FIRMATA_ANALOG_MESSAGE+pin); + sendValueAsTwo7bitBytes(value); + _digitalPinValue[pin] = value; + } + } + // for versions prior to 2.2 + else + { + if (_digitalPinMode[pin]==ARD_SERVO && (_servoValue[pin]!=value || force)) + { + sendByte(FIRMATA_START_SYSEX); + sendByte(SYSEX_SERVO_WRITE); + sendByte(pin); + sendValueAsTwo7bitBytes(value); + sendByte(FIRMATA_END_SYSEX); + _servoValue[pin]=value; + } + } } // angle parameter is no longer supported. keeping for backwards compatibility -void ofArduino::sendServoAttach(int pin, int minPulse, int maxPulse, int angle) { - sendByte(FIRMATA_START_SYSEX); - // for firmata v2.2 and greater - if (_firmwareVersionSum >= FIRMWARE2_2) { - sendByte(FIRMATA_SYSEX_SERVO_CONFIG); - } - // for versions prior to 2.2 - else { - sendByte(SYSEX_SERVO_ATTACH); - } - sendByte(pin); - sendValueAsTwo7bitBytes(minPulse); - sendValueAsTwo7bitBytes(maxPulse); - sendByte(FIRMATA_END_SYSEX); - _digitalPinMode[pin]=ARD_SERVO; +void ofArduino::sendServoAttach(int pin, int minPulse, int maxPulse, int angle) +{ + sendByte(FIRMATA_START_SYSEX); + // for firmata v2.2 and greater + if (_firmwareVersionSum >= FIRMWARE2_2) + { + sendByte(FIRMATA_SYSEX_SERVO_CONFIG); + } + // for versions prior to 2.2 + else + { + sendByte(SYSEX_SERVO_ATTACH); + } + sendByte(pin); + sendValueAsTwo7bitBytes(minPulse); + sendValueAsTwo7bitBytes(maxPulse); + sendByte(FIRMATA_END_SYSEX); + _digitalPinMode[pin]=ARD_SERVO; } // sendServoDetach depricated as of Firmata 2.2 -void ofArduino::sendServoDetach(int pin) { - sendByte(FIRMATA_START_SYSEX); - sendByte(SYSEX_SERVO_DETACH); - sendByte(pin); - sendByte(FIRMATA_END_SYSEX); - _digitalPinMode[pin]=ARD_OUTPUT; -} - -int ofArduino::getServo(int pin){ - if(_digitalPinMode[pin]==ARD_SERVO) - // for firmata v2.2 and greater - if (_firmwareVersionSum >= FIRMWARE2_2) { - return _digitalPinValue[pin]; - } - // for versions prior to 2.2 - else { - return _servoValue[pin]; - } - else - return -1; +void ofArduino::sendServoDetach(int pin) +{ + sendByte(FIRMATA_START_SYSEX); + sendByte(SYSEX_SERVO_DETACH); + sendByte(pin); + sendByte(FIRMATA_END_SYSEX); + _digitalPinMode[pin]=ARD_OUTPUT; +} + +int ofArduino::getServo(int pin) +{ + if (_digitalPinMode[pin]==ARD_SERVO) + // for firmata v2.2 and greater + if (_firmwareVersionSum >= FIRMWARE2_2) + { + return _digitalPinValue[pin]; + } + // for versions prior to 2.2 + else + { + return _servoValue[pin]; + } + else + return -1; } // time functions -unsigned long ofArduino::ofGetElapsedTimeMicros(){ - return ofGetSystemTimeMicros() - startTimeMicros; +unsigned long ofArduino::ofGetElapsedTimeMicros() +{ + return ofGetSystemTimeMicros() - startTimeMicros; } //-------------------------------------- -float ofArduino::ofGetElapsedTimef(){ - return ofGetElapsedTimeMicros() / 1000000.0f; -} - -unsigned long ofArduino::ofGetSystemTimeMicros( ) { - #ifndef TARGET_WIN32 - struct timeval now; - gettimeofday( &now, NULL ); - return now.tv_usec + now.tv_sec*1000000; - #else - #if defined(_WIN32_WCE) - return GetTickCount()*1000; - #else - return timeGetTime()*1000; - #endif - #endif +float ofArduino::ofGetElapsedTimef() +{ + return ofGetElapsedTimeMicros() / 1000000.0f; +} + +unsigned long ofArduino::ofGetSystemTimeMicros() +{ +#ifndef TARGET_WIN32 + struct timeval now; + gettimeofday(&now, NULL); + return now.tv_usec + now.tv_sec*1000000; +#else +#if defined(_WIN32_WCE) + return GetTickCount()*1000; +#else + return timeGetTime()*1000; +#endif +#endif } \ No newline at end of file diff --git a/Source/Processors/Serial/ofArduino.h b/Source/Processors/Serial/ofArduino.h index 92935df781a1d263b3406b62220480af5cd8c810..3d46436780c58b3b904649edec4a13af41e26fd2 100755 --- a/Source/Processors/Serial/ofArduino.h +++ b/Source/Processors/Serial/ofArduino.h @@ -70,7 +70,7 @@ #define FIRMATA_SERVO 0x04 // digital pin in Servo output mode #define SHIFT 0x05 // shiftIn/shiftOut mode #define I2C 0x06 // pin included in I2C setup -#define TOTAL_PIN_MODES 7 +#define TOTAL_PIN_MODES 7 // extended command set using SysEx (0-127/0x00-0x7F) /* 0x00-0x0F reserved for custom commands */ #define FIRMATA_SYSEX_SERVO_CONFIG 0x70 // set max angle, minPulse, maxPulse, freq @@ -150,289 +150,290 @@ **/ -class ofArduino{ +class ofArduino +{ - public: - ofArduino(); +public: + ofArduino(); - virtual ~ofArduino(); + virtual ~ofArduino(); - // --- setup functions - bool connect(string device, int baud = 57600); - // opens a serial port connection to the arduino + // --- setup functions + bool connect(string device, int baud = 57600); + // opens a serial port connection to the arduino - void disconnect(); - // closes the serial port connection + void disconnect(); + // closes the serial port connection - bool isArduinoReady(); + bool isArduinoReady(); - void setUseDelay(bool bDelay); + void setUseDelay(bool bDelay); - void update(); - // polls data from the serial port, this has to be called periodically + void update(); + // polls data from the serial port, this has to be called periodically - bool isInitialized(); - // returns true if a succesfull connection has been established and the Arduino has reported a firmware + bool isInitialized(); + // returns true if a succesfull connection has been established and the Arduino has reported a firmware - void setDigitalHistoryLength(int length); - void setAnalogHistoryLength(int length); - void setStringHistoryLength(int length); - void setSysExHistoryLength(int nSysEx); + void setDigitalHistoryLength(int length); + void setAnalogHistoryLength(int length); + void setStringHistoryLength(int length); + void setSysExHistoryLength(int nSysEx); - // --- senders + // --- senders - void sendDigitalPinMode(int pin, int mode); - // pin: 2-13 - // mode: ARD_INPUT, ARD_OUTPUT, ARD_PWM - // setting a pins mode to ARD_INPUT turns on reporting for the port the pin is on - // Note: analog pins 0-5 can be used as digitial pins 16-21 but if the mode of _one_ of these pins is set to ARD_INPUT then _all_ analog pin reporting will be turned off + void sendDigitalPinMode(int pin, int mode); + // pin: 2-13 + // mode: ARD_INPUT, ARD_OUTPUT, ARD_PWM + // setting a pins mode to ARD_INPUT turns on reporting for the port the pin is on + // Note: analog pins 0-5 can be used as digitial pins 16-21 but if the mode of _one_ of these pins is set to ARD_INPUT then _all_ analog pin reporting will be turned off - void sendAnalogPinReporting(int pin, int mode); - // pin: 0-5 - // mode: ARD_ON or ARD_OFF - // Note: analog pins 0-5 can be used as digitial pins 16-21 but if reporting for _one_ analog pin is enabled then reporting for _all_ of digital pin 16-21 will be turned off + void sendAnalogPinReporting(int pin, int mode); + // pin: 0-5 + // mode: ARD_ON or ARD_OFF + // Note: analog pins 0-5 can be used as digitial pins 16-21 but if reporting for _one_ analog pin is enabled then reporting for _all_ of digital pin 16-21 will be turned off - void sendDigital(int pin, int value, bool force = false); - // pin: 2-13 - // value: ARD_LOW or ARD_HIGH - // the pins mode has to be set to ARD_OUTPUT or ARD_INPUT (in the latter mode pull-up resistors are enabled/disabled) - // Note: pin 16-21 can also be used if analog inputs 0-5 are used as digital pins + void sendDigital(int pin, int value, bool force = false); + // pin: 2-13 + // value: ARD_LOW or ARD_HIGH + // the pins mode has to be set to ARD_OUTPUT or ARD_INPUT (in the latter mode pull-up resistors are enabled/disabled) + // Note: pin 16-21 can also be used if analog inputs 0-5 are used as digital pins - void sendPwm(int pin, int value, bool force = false); - // pin: 3, 5, 6, 9, 10 and 11 - // value: 0 (always off) to 255 (always on). - // the pins mode has to be set to ARD_PWM - // TODO check if the PWM bug still is there causing frequent digital port reporting... + void sendPwm(int pin, int value, bool force = false); + // pin: 3, 5, 6, 9, 10 and 11 + // value: 0 (always off) to 255 (always on). + // the pins mode has to be set to ARD_PWM + // TODO check if the PWM bug still is there causing frequent digital port reporting... - void sendSysEx(int command, vector<unsigned char> data); + void sendSysEx(int command, vector<unsigned char> data); - void sendString(string str); - // firmata can not handle strings longer than 12 characters. + void sendString(string str); + // firmata can not handle strings longer than 12 characters. - void sendProtocolVersionRequest(); + void sendProtocolVersionRequest(); - void sendFirmwareVersionRequest(); + void sendFirmwareVersionRequest(); - void sendReset(); + void sendReset(); - // --- senders for SysEx communication + // --- senders for SysEx communication - void sendSysExBegin(); - // sends the FIRMATA_START_SYSEX command + void sendSysExBegin(); + // sends the FIRMATA_START_SYSEX command - void sendSysExEnd(); - // sends the FIRMATA_END_SYSEX command + void sendSysExEnd(); + // sends the FIRMATA_END_SYSEX command - void sendByte(unsigned char byte); - // sends a byte without wrapping it in a firmata message, data has to be in the 0-127 range, - // values > 127 will be interpreted as commands. + void sendByte(unsigned char byte); + // sends a byte without wrapping it in a firmata message, data has to be in the 0-127 range, + // values > 127 will be interpreted as commands. - void sendValueAsTwo7bitBytes(int value); - // sends a value as two 7-bit bytes without wrapping it in a firmata message - // values in the range 0 - 16384 will be sent as two bytes within the 0-127 data range. + void sendValueAsTwo7bitBytes(int value); + // sends a value as two 7-bit bytes without wrapping it in a firmata message + // values in the range 0 - 16384 will be sent as two bytes within the 0-127 data range. - // --- getters + // --- getters - int getPwm(int pin); - // pin: 3, 5, 6, 9, 10 and 11 - // returns the last set PWM value (0-255) for the given pin - // the pins mode has to be ARD_PWM - // Note: pin 16-21 can also be used if analog inputs 0-5 are used as digital pins + int getPwm(int pin); + // pin: 3, 5, 6, 9, 10 and 11 + // returns the last set PWM value (0-255) for the given pin + // the pins mode has to be ARD_PWM + // Note: pin 16-21 can also be used if analog inputs 0-5 are used as digital pins - int getDigital(int pin); - // pin: 2-13 - // returns the last received value (if the pin mode is ARD_INPUT) or the last set value (if the pin mode is ARD_OUTPUT) for the given pin - // Note: pin 16-21 can also be used if analog inputs 0-5 are used as digital pins + int getDigital(int pin); + // pin: 2-13 + // returns the last received value (if the pin mode is ARD_INPUT) or the last set value (if the pin mode is ARD_OUTPUT) for the given pin + // Note: pin 16-21 can also be used if analog inputs 0-5 are used as digital pins - int getAnalog(int pin); - // pin: 0-5 - // returns the last received analog value (0-1023) for the given pin + int getAnalog(int pin); + // pin: 0-5 + // returns the last received analog value (0-1023) for the given pin - vector<unsigned char> getSysEx(); - // returns the last received SysEx message + vector<unsigned char> getSysEx(); + // returns the last received SysEx message - string getString(); - // returns the last received string + string getString(); + // returns the last received string - int getMajorProtocolVersion(); - // returns the major firmware version + int getMajorProtocolVersion(); + // returns the major firmware version - int getMinorProtocolVersion(); - // returns the minor firmware version + int getMinorProtocolVersion(); + // returns the minor firmware version - int getMajorFirmwareVersion(); - // returns the major firmware version + int getMajorFirmwareVersion(); + // returns the major firmware version - int getMinorFirmwareVersion(); - // returns the minor firmware version + int getMinorFirmwareVersion(); + // returns the minor firmware version - string getFirmwareName(); - // returns the name of the firmware + string getFirmwareName(); + // returns the name of the firmware - list<int>* getDigitalHistory(int pin); - // pin: 2-13 - // returns a pointer to the digital data history list for the given pin - // Note: pin 16-21 can also be used if analog inputs 0-5 are used as digital pins + list<int>* getDigitalHistory(int pin); + // pin: 2-13 + // returns a pointer to the digital data history list for the given pin + // Note: pin 16-21 can also be used if analog inputs 0-5 are used as digital pins - list<int>* getAnalogHistory(int pin); - // pin: 0-5 - // returns a pointer to the analog data history list for the given pin + list<int>* getAnalogHistory(int pin); + // pin: 0-5 + // returns a pointer to the analog data history list for the given pin - list<vector<unsigned char> >* getSysExHistory(); - // returns a pointer to the SysEx history + list<vector<unsigned char> >* getSysExHistory(); + // returns a pointer to the SysEx history - list<string>* getStringHistory(); - // returns a pointer to the string history + list<string>* getStringHistory(); + // returns a pointer to the string history - int getDigitalPinMode(int pin); - // returns ARD_INPUT, ARD_OUTPUT, ARD_PWM, ARD_SERVO, ARD_ANALOG + int getDigitalPinMode(int pin); + // returns ARD_INPUT, ARD_OUTPUT, ARD_PWM, ARD_SERVO, ARD_ANALOG - int getAnalogPinReporting(int pin); - // returns ARD_ON, ARD_OFF + int getAnalogPinReporting(int pin); + // returns ARD_ON, ARD_OFF - int getValueFromTwo7bitBytes(unsigned char lsb, unsigned char msb); - // useful for parsing SysEx messages + int getValueFromTwo7bitBytes(unsigned char lsb, unsigned char msb); + // useful for parsing SysEx messages - // --- events + // --- events - // ofEvent<const int> EDigitalPinChanged; - // // triggered when a digital pin changes value, the pin that changed is passed as an argument + // ofEvent<const int> EDigitalPinChanged; + // // triggered when a digital pin changes value, the pin that changed is passed as an argument - // ofEvent<const int> EAnalogPinChanged; - // // triggered when an analog pin changes value, the pin that changed is passed as an argument + // ofEvent<const int> EAnalogPinChanged; + // // triggered when an analog pin changes value, the pin that changed is passed as an argument - // ofEvent<const vector<unsigned char> > ESysExReceived; - // // triggered when a SysEx message that isn't in the extended command set is received, the SysEx message is passed as an argument + // ofEvent<const vector<unsigned char> > ESysExReceived; + // // triggered when a SysEx message that isn't in the extended command set is received, the SysEx message is passed as an argument - // ofEvent<const int> EProtocolVersionReceived; - // // triggered when a protocol version is received, the major version is passed as an argument + // ofEvent<const int> EProtocolVersionReceived; + // // triggered when a protocol version is received, the major version is passed as an argument - // ofEvent<const int> EFirmwareVersionReceived; - // // triggered when a firmware version is received, the major version is passed as an argument + // ofEvent<const int> EFirmwareVersionReceived; + // // triggered when a firmware version is received, the major version is passed as an argument - // ofEvent<const int> EInitialized; - // // triggered when the firmware version is received upon connect, the major firmware version is passed as an argument - // // from this point it's safe to send to the Arduino. + // ofEvent<const int> EInitialized; + // // triggered when the firmware version is received upon connect, the major firmware version is passed as an argument + // // from this point it's safe to send to the Arduino. - // ofEvent<const string> EStringReceived; - // // triggered when a string is received, the string is passed as an argument + // ofEvent<const string> EStringReceived; + // // triggered when a string is received, the string is passed as an argument - // -- servo - void sendServo(int pin, int value, bool force=false); - // pin: 9, 10 - // the pin has to have a servo attached + // -- servo + void sendServo(int pin, int value, bool force=false); + // pin: 9, 10 + // the pin has to have a servo attached - // angle parameter DEPRECATED as of Firmata 2.2 - void sendServoAttach(int pin, int minPulse=544, int maxPulse=2400, int angle=180); - // pin: 9, 10 - // attaches a servo to a pin + // angle parameter DEPRECATED as of Firmata 2.2 + void sendServoAttach(int pin, int minPulse=544, int maxPulse=2400, int angle=180); + // pin: 9, 10 + // attaches a servo to a pin - // sendServoDetach DEPRECATED as of Firmata 2.2 - void sendServoDetach(int pin); - // pin: 9, 10 - // detaches a servo from a pin, the pin mode remains as OUTPUT + // sendServoDetach DEPRECATED as of Firmata 2.2 + void sendServoDetach(int pin); + // pin: 9, 10 + // detaches a servo from a pin, the pin mode remains as OUTPUT - int getServo(int pin); - // returns the last set servo value for a pin if the pin has a servo attached + int getServo(int pin); + // returns the last set servo value for a pin if the pin has a servo attached - protected: - bool _initialized; - - void initPins(); - int _totalDigitalPins; +protected: + bool _initialized; - void sendDigitalPinReporting(int pin, int mode); - // sets pin reporting to ARD_ON or ARD_OFF - // enables / disables reporting for the pins port + void initPins(); + int _totalDigitalPins; - void sendDigitalPortReporting(int port, int mode); - // sets port reporting to ARD_ON or ARD_OFF - // enables / disables reporting for ports 0-2 - // port 0: pins 2-7 (0,1 are serial RX/TX) - // port 1: pins 8-13 (14,15 are disabled for the crystal) - // port 2: pins 16-21 analog pins used as digital, all analog reporting will be turned off if this is set to ARD_ON + void sendDigitalPinReporting(int pin, int mode); + // sets pin reporting to ARD_ON or ARD_OFF + // enables / disables reporting for the pins port - void processData(unsigned char inputData); - void processDigitalPort(int port, unsigned char value); - virtual void processSysExData(vector<unsigned char> data); + void sendDigitalPortReporting(int port, int mode); + // sets port reporting to ARD_ON or ARD_OFF + // enables / disables reporting for ports 0-2 + // port 0: pins 2-7 (0,1 are serial RX/TX) + // port 1: pins 8-13 (14,15 are disabled for the crystal) + // port 2: pins 16-21 analog pins used as digital, all analog reporting will be turned off if this is set to ARD_ON - ofSerial _port; - int _portStatus; + void processData(unsigned char inputData); + void processDigitalPort(int port, unsigned char value); + virtual void processSysExData(vector<unsigned char> data); - // --- history variables - int _analogHistoryLength; - int _digitalHistoryLength; - int _stringHistoryLength; - int _sysExHistoryLength; + ofSerial _port; + int _portStatus; - // --- data processing variables - int _waitForData; - int _executeMultiByteCommand; - int _multiByteChannel; // indicates which pin data came from + // --- history variables + int _analogHistoryLength; + int _digitalHistoryLength; + int _stringHistoryLength; + int _sysExHistoryLength; - // --- data holders - unsigned char _storedInputData[FIRMATA_MAX_DATA_BYTES]; - vector<unsigned char> _sysExData; - int _majorProtocolVersion; - int _minorProtocolVersion; - int _majorFirmwareVersion; - int _minorFirmwareVersion; - string _firmwareName; - - // sum of majorFirmwareVersion * 10 + minorFirmwareVersion - int _firmwareVersionSum; + // --- data processing variables + int _waitForData; + int _executeMultiByteCommand; + int _multiByteChannel; // indicates which pin data came from - list<vector<unsigned char> > _sysExHistory; - // maintains a history of received sysEx messages (excluding SysEx messages in the extended command set) + // --- data holders + unsigned char _storedInputData[FIRMATA_MAX_DATA_BYTES]; + vector<unsigned char> _sysExData; + int _majorProtocolVersion; + int _minorProtocolVersion; + int _majorFirmwareVersion; + int _minorFirmwareVersion; + string _firmwareName; - list<string> _stringHistory; - // maintains a history of received strings + // sum of majorFirmwareVersion * 10 + minorFirmwareVersion + int _firmwareVersionSum; - list<int> _analogHistory[ARD_TOTAL_ANALOG_PINS]; - // a history of received data for each analog pin + list<vector<unsigned char> > _sysExHistory; + // maintains a history of received sysEx messages (excluding SysEx messages in the extended command set) - list<int> _digitalHistory[ARD_TOTAL_DIGITAL_PINS]; - // a history of received data for each digital pin + list<string> _stringHistory; + // maintains a history of received strings - int _digitalPinMode[ARD_TOTAL_DIGITAL_PINS]; - // the modes for all digital pins + list<int> _analogHistory[ARD_TOTAL_ANALOG_PINS]; + // a history of received data for each analog pin - int _digitalPinValue[ARD_TOTAL_DIGITAL_PINS]; - // the last set values (DIGITAL/PWM) on all digital pins + list<int> _digitalHistory[ARD_TOTAL_DIGITAL_PINS]; + // a history of received data for each digital pin - int _digitalPortValue[ARD_TOTAL_PORTS]; - // the last set values on all ports + int _digitalPinMode[ARD_TOTAL_DIGITAL_PINS]; + // the modes for all digital pins - int _digitalPortReporting[ARD_TOTAL_PORTS]; - // whether pin reporting is enabled / disabled + int _digitalPinValue[ARD_TOTAL_DIGITAL_PINS]; + // the last set values (DIGITAL/PWM) on all digital pins - int _digitalPinReporting[ARD_TOTAL_DIGITAL_PINS]; - // whether pin reporting is enabled / disabled + int _digitalPortValue[ARD_TOTAL_PORTS]; + // the last set values on all ports - int _analogPinReporting[ARD_TOTAL_ANALOG_PINS]; - // whether pin reporting is enabled / disabled + int _digitalPortReporting[ARD_TOTAL_PORTS]; + // whether pin reporting is enabled / disabled - bool bUseDelay; + int _digitalPinReporting[ARD_TOTAL_DIGITAL_PINS]; + // whether pin reporting is enabled / disabled - bool connected; + int _analogPinReporting[ARD_TOTAL_ANALOG_PINS]; + // whether pin reporting is enabled / disabled - float connectTime; + bool bUseDelay; - int _servoValue[ARD_TOTAL_DIGITAL_PINS]; - // the last set servo values + bool connected; - unsigned long ofGetSystemTimeMicros(); - float ofGetElapsedTimef(); - unsigned long ofGetElapsedTimeMicros(); + float connectTime; - unsigned long startTimeMicros; + int _servoValue[ARD_TOTAL_DIGITAL_PINS]; + // the last set servo values + + unsigned long ofGetSystemTimeMicros(); + float ofGetElapsedTimef(); + unsigned long ofGetElapsedTimeMicros(); + + unsigned long startTimeMicros; }; diff --git a/Source/Processors/Serial/ofConstants.h b/Source/Processors/Serial/ofConstants.h index f74437a29c5971860733eb2fee51da7a774026d8..d639a395c62a4de70efbf0d4bdf75ec819c1611d 100755 --- a/Source/Processors/Serial/ofConstants.h +++ b/Source/Processors/Serial/ofConstants.h @@ -12,139 +12,139 @@ // http://www.ogre3d.org/docs/api/html/OgrePlatform_8h-source.html #if defined( __WIN32__ ) || defined( _WIN32 ) - #define TARGET_WIN32 +#define TARGET_WIN32 #elif defined( __APPLE_CC__) - #include <TargetConditionals.h> - - #if (TARGET_OS_IPHONE_SIMULATOR) || (TARGET_OS_IPHONE) || (TARGET_IPHONE) - #define TARGET_OF_IPHONE - #define TARGET_OPENGLES - #else - #define TARGET_OSX - #endif +#include <TargetConditionals.h> + +#if (TARGET_OS_IPHONE_SIMULATOR) || (TARGET_OS_IPHONE) || (TARGET_IPHONE) +#define TARGET_OF_IPHONE +#define TARGET_OPENGLES +#else +#define TARGET_OSX +#endif #elif defined (ANDROID) - #define TARGET_ANDROID - #define TARGET_OPENGLES +#define TARGET_ANDROID +#define TARGET_OPENGLES #else - #define TARGET_LINUX +#define TARGET_LINUX #endif //------------------------------- // then the the platform specific includes: #ifdef TARGET_WIN32 - //this is for TryEnterCriticalSection - //http://www.zeroc.com/forums/help-center/351-ice-1-2-tryentercriticalsection-problem.html - #ifndef _WIN32_WINNT - # define _WIN32_WINNT 0x400 - #endif - #define WIN32_LEAN_AND_MEAN - - #if (_MSC_VER) - #define NOMINMAX - //http://stackoverflow.com/questions/1904635/warning-c4003-and-errors-c2589-and-c2059-on-x-stdnumeric-limitsintmax - #endif - - #include <windows.h> - #define GLEW_STATIC - //#include "GL\glew.h" - //#include "GL\wglew.h" - //#include "glu.h" - #define __WINDOWS_DS__ - #define __WINDOWS_MM__ - #if (_MSC_VER) // microsoft visual studio - #include <stdint.h> - #pragma warning(disable : 4068) // unknown pragmas - #pragma warning(disable : 4101) // unreferenced local variable - #pragma warning(disable : 4312) // type cast conversion (in qt vp) - #pragma warning(disable : 4311) // type cast pointer truncation (qt vp) - #pragma warning(disable : 4018) // signed/unsigned mismatch (since vector.size() is a size_t) - #pragma warning(disable : 4267) // conversion from size_t to Size warning... possible loss of data - #pragma warning(disable : 4800) // 'Boolean' : forcing value to bool 'true' or 'false' - #pragma warning(disable : 4099) // for debug, PDB 'vc80.pdb' was not found with... - #endif - - #define TARGET_LITTLE_ENDIAN // intel cpu - - // some gl.h files, like dev-c++, are old - this is pretty universal - #ifndef GL_BGR_EXT - #define GL_BGR_EXT 0x80E0 - #endif - - // #define WIN32_HIGH_RES_TIMING - - // note: this is experimental! - // uncomment to turn this on (only for windows machines) - // if you want to try setting the timer to be high resolution - // this could make camera grabbing and other low level - // operations quicker, but you must quit the app normally, - // ie, using "esc", rather than killing the process or closing - // the console window in order to set the timer resolution back - // to normal (since the high res timer might give the OS - // problems) - // info: http://www.geisswerks.com/ryan/FAQS/timing.html +//this is for TryEnterCriticalSection +//http://www.zeroc.com/forums/help-center/351-ice-1-2-tryentercriticalsection-problem.html +#ifndef _WIN32_WINNT +# define _WIN32_WINNT 0x400 +#endif +#define WIN32_LEAN_AND_MEAN + +#if (_MSC_VER) +#define NOMINMAX +//http://stackoverflow.com/questions/1904635/warning-c4003-and-errors-c2589-and-c2059-on-x-stdnumeric-limitsintmax +#endif + +#include <windows.h> +#define GLEW_STATIC +//#include "GL\glew.h" +//#include "GL\wglew.h" +//#include "glu.h" +#define __WINDOWS_DS__ +#define __WINDOWS_MM__ +#if (_MSC_VER) // microsoft visual studio +#include <stdint.h> +#pragma warning(disable : 4068) // unknown pragmas +#pragma warning(disable : 4101) // unreferenced local variable +#pragma warning(disable : 4312) // type cast conversion (in qt vp) +#pragma warning(disable : 4311) // type cast pointer truncation (qt vp) +#pragma warning(disable : 4018) // signed/unsigned mismatch (since vector.size() is a size_t) +#pragma warning(disable : 4267) // conversion from size_t to Size warning... possible loss of data +#pragma warning(disable : 4800) // 'Boolean' : forcing value to bool 'true' or 'false' +#pragma warning(disable : 4099) // for debug, PDB 'vc80.pdb' was not found with... +#endif + +#define TARGET_LITTLE_ENDIAN // intel cpu + +// some gl.h files, like dev-c++, are old - this is pretty universal +#ifndef GL_BGR_EXT +#define GL_BGR_EXT 0x80E0 +#endif + +// #define WIN32_HIGH_RES_TIMING + +// note: this is experimental! +// uncomment to turn this on (only for windows machines) +// if you want to try setting the timer to be high resolution +// this could make camera grabbing and other low level +// operations quicker, but you must quit the app normally, +// ie, using "esc", rather than killing the process or closing +// the console window in order to set the timer resolution back +// to normal (since the high res timer might give the OS +// problems) +// info: http://www.geisswerks.com/ryan/FAQS/timing.html #endif #ifdef TARGET_OSX - #ifndef __MACOSX_CORE__ - #define __MACOSX_CORE__ - #endif - #include <unistd.h> - //#include "GL/glew.h" - //#include <OpenGL/gl.h> - //#include <ApplicationServices/ApplicationServices.h> - - #if defined(__LITTLE_ENDIAN__) - #define TARGET_LITTLE_ENDIAN // intel cpu - #endif +#ifndef __MACOSX_CORE__ +#define __MACOSX_CORE__ +#endif +#include <unistd.h> +//#include "GL/glew.h" +//#include <OpenGL/gl.h> +//#include <ApplicationServices/ApplicationServices.h> + +#if defined(__LITTLE_ENDIAN__) +#define TARGET_LITTLE_ENDIAN // intel cpu +#endif #endif #ifdef TARGET_LINUX - #define GL_GLEXT_PROTOTYPES - #include <unistd.h> - //#include <GL/glew.h> - //#include <GL/gl.h> - //#include <GL/glx.h> +#define GL_GLEXT_PROTOTYPES +#include <unistd.h> +//#include <GL/glew.h> +//#include <GL/gl.h> +//#include <GL/glx.h> - // for some reason, this isn't defined at compile time, - // so this hack let's us work - // for 99% of the linux folks that are on intel - // everyone one else will have RGB / BGR issues. - //#if defined(__LITTLE_ENDIAN__) - #define TARGET_LITTLE_ENDIAN // intel cpu - //#endif +// for some reason, this isn't defined at compile time, +// so this hack let's us work +// for 99% of the linux folks that are on intel +// everyone one else will have RGB / BGR issues. +//#if defined(__LITTLE_ENDIAN__) +#define TARGET_LITTLE_ENDIAN // intel cpu +//#endif - // some things for serial compilation: - #define B14400 14400 - #define B28800 28800 +// some things for serial compilation: +#define B14400 14400 +#define B28800 28800 #endif #ifdef TARGET_OF_IPHONE - //#import <OpenGLES/ES1/gl.h> - //#import <OpenGLES/ES1/glext.h> - - #define TARGET_LITTLE_ENDIAN // arm cpu +//#import <OpenGLES/ES1/gl.h> +//#import <OpenGLES/ES1/glext.h> + +#define TARGET_LITTLE_ENDIAN // arm cpu #endif #ifdef TARGET_ANDROID - #include <typeinfo> - #include <unistd.h> - //#include <GLES/gl.h> - //#define GL_GLEXT_PROTOTYPES - //#include <GLES/glext.h> +#include <typeinfo> +#include <unistd.h> +//#include <GLES/gl.h> +//#define GL_GLEXT_PROTOTYPES +//#include <GLES/glext.h> - #define TARGET_LITTLE_ENDIAN +#define TARGET_LITTLE_ENDIAN #endif #ifdef TARGET_OPENGLES - #include "glu.h" - //typedef GLushort ofIndexType ; +#include "glu.h" +//typedef GLushort ofIndexType ; #else - //typedef GLuint ofIndexType; +//typedef GLuint ofIndexType; #endif diff --git a/Source/Processors/Serial/ofSerial.cpp b/Source/Processors/Serial/ofSerial.cpp index 3615a15c6ad8684ba2133deb646a8821b7c3f164..86178b1a3508edde6efec53e1ceb5e5b1313741f 100755 --- a/Source/Processors/Serial/ofSerial.cpp +++ b/Source/Processors/Serial/ofSerial.cpp @@ -7,9 +7,9 @@ //#include "ofTypes.h" #if defined( TARGET_OSX ) || defined( TARGET_LINUX ) - #include <sys/ioctl.h> - #include <getopt.h> - #include <dirent.h> +#include <sys/ioctl.h> +#include <getopt.h> +#include <dirent.h> #endif @@ -26,73 +26,78 @@ //--------------------------------------------- //------------------------------------ - // needed for serial bus enumeration: - //4d36e978-e325-11ce-bfc1-08002be10318} - DEFINE_GUID (GUID_SERENUM_BUS_ENUMERATOR, 0x4D36E978, 0xE325, - 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); +// needed for serial bus enumeration: +//4d36e978-e325-11ce-bfc1-08002be10318} +DEFINE_GUID(GUID_SERENUM_BUS_ENUMERATOR, 0x4D36E978, 0xE325, + 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18); //------------------------------------ -void ofSerial::enumerateWin32Ports(){ +void ofSerial::enumerateWin32Ports() +{ // thanks joerg for fixes... - if (bPortsEnumerated == true) return; - - HDEVINFO hDevInfo = NULL; - SP_DEVINFO_DATA DeviceInterfaceData; - int i = 0; - DWORD dataType, actualSize = 0; - unsigned char dataBuf[MAX_PATH + 1]; - - // Reset Port List - nPorts = 0; - // Search device set - hDevInfo = SetupDiGetClassDevs((struct _GUID *)&GUID_SERENUM_BUS_ENUMERATOR,0,0,DIGCF_PRESENT); - if ( hDevInfo ){ - while (TRUE){ - ZeroMemory(&DeviceInterfaceData, sizeof(DeviceInterfaceData)); - DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData); - if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInterfaceData)){ - // SetupDiEnumDeviceInfo failed - break; - } - - if (SetupDiGetDeviceRegistryPropertyA(hDevInfo, - &DeviceInterfaceData, - SPDRP_FRIENDLYNAME, - &dataType, - dataBuf, - sizeof(dataBuf), - &actualSize)){ - - sprintf(portNamesFriendly[nPorts], "%s", dataBuf); - portNamesShort[nPorts][0] = 0; - - // turn blahblahblah(COM4) into COM4 - - char * begin = NULL; - char * end = NULL; - begin = strstr((char *)dataBuf, "COM"); - - - if (begin) + if (bPortsEnumerated == true) return; + + HDEVINFO hDevInfo = NULL; + SP_DEVINFO_DATA DeviceInterfaceData; + int i = 0; + DWORD dataType, actualSize = 0; + unsigned char dataBuf[MAX_PATH + 1]; + + // Reset Port List + nPorts = 0; + // Search device set + hDevInfo = SetupDiGetClassDevs((struct _GUID*)&GUID_SERENUM_BUS_ENUMERATOR,0,0,DIGCF_PRESENT); + if (hDevInfo) + { + while (TRUE) + { + ZeroMemory(&DeviceInterfaceData, sizeof(DeviceInterfaceData)); + DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData); + if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInterfaceData)) + { + // SetupDiEnumDeviceInfo failed + break; + } + + if (SetupDiGetDeviceRegistryPropertyA(hDevInfo, + &DeviceInterfaceData, + SPDRP_FRIENDLYNAME, + &dataType, + dataBuf, + sizeof(dataBuf), + &actualSize)) + { + + sprintf(portNamesFriendly[nPorts], "%s", dataBuf); + portNamesShort[nPorts][0] = 0; + + // turn blahblahblah(COM4) into COM4 + + char* begin = NULL; + char* end = NULL; + begin = strstr((char*)dataBuf, "COM"); + + + if (begin) { - end = strstr(begin, ")"); - if (end) + end = strstr(begin, ")"); + if (end) { - *end = 0; // get rid of the )... - strcpy(portNamesShort[nPorts], begin); - } - if (nPorts++ > MAX_SERIAL_PORTS) + *end = 0; // get rid of the )... + strcpy(portNamesShort[nPorts], begin); + } + if (nPorts++ > MAX_SERIAL_PORTS) break; + } } - } i++; - } - } - SetupDiDestroyDeviceInfoList(hDevInfo); + } + } + SetupDiDestroyDeviceInfoList(hDevInfo); - bPortsEnumerated = false; + bPortsEnumerated = false; } @@ -103,585 +108,661 @@ void ofSerial::enumerateWin32Ports(){ //---------------------------------------------------------------- -ofSerial::ofSerial(){ - - //--------------------------------------------- - #ifdef TARGET_WIN32 - //--------------------------------------------- - nPorts = 0; - bPortsEnumerated = false; - - portNamesShort = new char * [MAX_SERIAL_PORTS]; - portNamesFriendly = new char * [MAX_SERIAL_PORTS]; - for (int i = 0; i < MAX_SERIAL_PORTS; i++){ - portNamesShort[i] = new char[10]; - portNamesFriendly[i] = new char[MAX_PATH]; - } - //--------------------------------------------- - #endif - //--------------------------------------------- - bInited = false; +ofSerial::ofSerial() +{ + + //--------------------------------------------- +#ifdef TARGET_WIN32 + //--------------------------------------------- + nPorts = 0; + bPortsEnumerated = false; + + portNamesShort = new char * [MAX_SERIAL_PORTS]; + portNamesFriendly = new char * [MAX_SERIAL_PORTS]; + for (int i = 0; i < MAX_SERIAL_PORTS; i++) + { + portNamesShort[i] = new char[10]; + portNamesFriendly[i] = new char[MAX_PATH]; + } + //--------------------------------------------- +#endif + //--------------------------------------------- + bInited = false; } //---------------------------------------------------------------- -ofSerial::~ofSerial(){ +ofSerial::~ofSerial() +{ - close(); + close(); - //--------------------------------------------- - #ifdef TARGET_WIN32 - //--------------------------------------------- - nPorts = 0; - bPortsEnumerated = false; + //--------------------------------------------- +#ifdef TARGET_WIN32 + //--------------------------------------------- + nPorts = 0; + bPortsEnumerated = false; - for (int i = 0; i < MAX_SERIAL_PORTS; i++) { - delete [] portNamesShort[i]; - delete [] portNamesFriendly[i]; - } - delete [] portNamesShort; - delete [] portNamesFriendly; + for (int i = 0; i < MAX_SERIAL_PORTS; i++) + { + delete [] portNamesShort[i]; + delete [] portNamesFriendly[i]; + } + delete [] portNamesShort; + delete [] portNamesFriendly; - //--------------------------------------------- - #endif - //--------------------------------------------- + //--------------------------------------------- +#endif + //--------------------------------------------- - bInited = false; + bInited = false; } //---------------------------------------------------------------- -static bool isDeviceArduino( ofSerialDeviceInfo & A ){ - //TODO - this should be ofStringInString - return ( strstr(A.getDeviceName().c_str(), "usbserial") != NULL ); +static bool isDeviceArduino(ofSerialDeviceInfo& A) +{ + //TODO - this should be ofStringInString + return (strstr(A.getDeviceName().c_str(), "usbserial") != NULL); } //---------------------------------------------------------------- -void ofSerial::buildDeviceList(){ - - deviceType = "serial"; - devices.clear(); - - vector <string> prefixMatch; - - #ifdef TARGET_OSX - prefixMatch.push_back("cu."); - prefixMatch.push_back("tty."); - #endif - #ifdef TARGET_LINUX - prefixMatch.push_back("ttyS"); - prefixMatch.push_back("ttyUSB"); - prefixMatch.push_back("rfc"); - prefixMatch.push_back("ttyA"); - #endif - - - #if defined( TARGET_OSX ) || defined( TARGET_LINUX ) - - DIR *dir; - struct dirent *entry; - dir = opendir("/dev"); - - string deviceName = ""; - int deviceCount = 0; - - if (dir == NULL){ - //ofLog(OF_LOG_ERROR,"ofSerial: error listing devices in /dev"); - } else { - //for each device - while((entry = readdir(dir)) != NULL){ - deviceName = (char *)entry->d_name; - - //we go through the prefixes - for(int k = 0; k < (int)prefixMatch.size(); k++){ - //if the device name is longer than the prefix - if( deviceName.size() > prefixMatch[k].size() ){ - //do they match ? - if( deviceName.substr(0, prefixMatch[k].size()) == prefixMatch[k].c_str() ){ - devices.push_back(ofSerialDeviceInfo("/dev/"+deviceName, deviceName, deviceCount)); - deviceCount++; - break; - } - } - } - } - closedir(dir); - } - - #endif - - //--------------------------------------------- - #ifdef TARGET_WIN32 - //--------------------------------------------- - enumerateWin32Ports(); - //ofLogNotice() << "ofSerial: listing devices (" << nPorts << " total)"; - for (int i = 0; i < nPorts; i++){ - //NOTE: we give the short port name for both as that is what the user should pass and the short name is more friendly - devices.push_back(ofSerialDeviceInfo(string(portNamesShort[i]), string(portNamesShort[i]), i)); - } - //--------------------------------------------- - #endif - //--------------------------------------------- - - //here we sort the device to have the aruino ones first. - partition(devices.begin(), devices.end(), isDeviceArduino); - //we are reordering the device ids. too! - for(int k = 0; k < (int)devices.size(); k++){ - devices[k].deviceID = k; - } - - bHaveEnumeratedDevices = true; +void ofSerial::buildDeviceList() +{ + + deviceType = "serial"; + devices.clear(); + + vector <string> prefixMatch; + +#ifdef TARGET_OSX + prefixMatch.push_back("cu."); + prefixMatch.push_back("tty."); +#endif +#ifdef TARGET_LINUX + prefixMatch.push_back("ttyS"); + prefixMatch.push_back("ttyUSB"); + prefixMatch.push_back("rfc"); + prefixMatch.push_back("ttyA"); +#endif + + +#if defined( TARGET_OSX ) || defined( TARGET_LINUX ) + + DIR* dir; + struct dirent* entry; + dir = opendir("/dev"); + + string deviceName = ""; + int deviceCount = 0; + + if (dir == NULL) + { + //ofLog(OF_LOG_ERROR,"ofSerial: error listing devices in /dev"); + } + else + { + //for each device + while ((entry = readdir(dir)) != NULL) + { + deviceName = (char*)entry->d_name; + + //we go through the prefixes + for (int k = 0; k < (int)prefixMatch.size(); k++) + { + //if the device name is longer than the prefix + if (deviceName.size() > prefixMatch[k].size()) + { + //do they match ? + if (deviceName.substr(0, prefixMatch[k].size()) == prefixMatch[k].c_str()) + { + devices.push_back(ofSerialDeviceInfo("/dev/"+deviceName, deviceName, deviceCount)); + deviceCount++; + break; + } + } + } + } + closedir(dir); + } + +#endif + + //--------------------------------------------- +#ifdef TARGET_WIN32 + //--------------------------------------------- + enumerateWin32Ports(); + //ofLogNotice() << "ofSerial: listing devices (" << nPorts << " total)"; + for (int i = 0; i < nPorts; i++) + { + //NOTE: we give the short port name for both as that is what the user should pass and the short name is more friendly + devices.push_back(ofSerialDeviceInfo(string(portNamesShort[i]), string(portNamesShort[i]), i)); + } + //--------------------------------------------- +#endif + //--------------------------------------------- + + //here we sort the device to have the aruino ones first. + partition(devices.begin(), devices.end(), isDeviceArduino); + //we are reordering the device ids. too! + for (int k = 0; k < (int)devices.size(); k++) + { + devices[k].deviceID = k; + } + + bHaveEnumeratedDevices = true; } //---------------------------------------------------------------- -void ofSerial::listDevices(){ - buildDeviceList(); - for(int k = 0; k < (int)devices.size(); k++){ - //std::cout << "[" << devices[k].getDeviceID() << "] = "<< devices[k].getDeviceName().c_str() << std::endl; - } +void ofSerial::listDevices() +{ + buildDeviceList(); + for (int k = 0; k < (int)devices.size(); k++) + { + //std::cout << "[" << devices[k].getDeviceID() << "] = "<< devices[k].getDeviceName().c_str() << std::endl; + } } //---------------------------------------------------------------- -vector <ofSerialDeviceInfo> ofSerial::getDeviceList(){ - buildDeviceList(); - return devices; +vector <ofSerialDeviceInfo> ofSerial::getDeviceList() +{ + buildDeviceList(); + return devices; } //---------------------------------------------------------------- -void ofSerial::enumerateDevices(){ - listDevices(); +void ofSerial::enumerateDevices() +{ + listDevices(); } //---------------------------------------------------------------- -void ofSerial::close(){ +void ofSerial::close() +{ - //--------------------------------------------- - #ifdef TARGET_WIN32 - //--------------------------------------------- - if (bInited){ - SetCommTimeouts(hComm,&oldTimeout); - CloseHandle(hComm); - hComm = INVALID_HANDLE_VALUE; - bInited = false; - } - //--------------------------------------------- - #else //--------------------------------------------- - if (bInited){ - tcsetattr(fd,TCSANOW,&oldoptions); - ::close(fd); - } - // [CHECK] -- anything else need to be reset? +#ifdef TARGET_WIN32 + //--------------------------------------------- + if (bInited) + { + SetCommTimeouts(hComm,&oldTimeout); + CloseHandle(hComm); + hComm = INVALID_HANDLE_VALUE; + bInited = false; + } //--------------------------------------------- - #endif +#else + //--------------------------------------------- + if (bInited) + { + tcsetattr(fd,TCSANOW,&oldoptions); + ::close(fd); + } + // [CHECK] -- anything else need to be reset? + //--------------------------------------------- +#endif //--------------------------------------------- } //---------------------------------------------------------------- -bool ofSerial::setup(){ - return setup(0,9600); // the first one, at 9600 is a good choice... +bool ofSerial::setup() +{ + return setup(0,9600); // the first one, at 9600 is a good choice... } //---------------------------------------------------------------- -bool ofSerial::setup(int deviceNumber, int baud){ +bool ofSerial::setup(int deviceNumber, int baud) +{ - buildDeviceList(); - if( deviceNumber < (int)devices.size() ){ - return setup(devices[deviceNumber].devicePath, baud); - }else{ - //ofLog(OF_LOG_ERROR,"ofSerial: could not find device %i - only %i devices found", deviceNumber, devices.size()); - return false; - } + buildDeviceList(); + if (deviceNumber < (int)devices.size()) + { + return setup(devices[deviceNumber].devicePath, baud); + } + else + { + //ofLog(OF_LOG_ERROR,"ofSerial: could not find device %i - only %i devices found", deviceNumber, devices.size()); + return false; + } } //---------------------------------------------------------------- -bool ofSerial::setup(string portName, int baud){ - - bInited = false; - - //--------------------------------------------- - #if defined( TARGET_OSX ) || defined( TARGET_LINUX ) - //--------------------------------------------- - - //lets account for the name being passed in instead of the device path - if( portName.size() > 5 && portName.substr(0, 5) != "/dev/" ){ - portName = "/dev/" + portName; - } - - printf("ofSerialInit: opening port %s @ %d bps\n\n", portName.c_str(), baud); - fd = open(portName.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK); - if(fd == -1){ - printf("ofSerial: unable to open port %s\n", portName.c_str()); - printf( "Error opening port: %s\n", strerror( errno ) ); - return false; - } - - struct termios options; - tcgetattr(fd,&oldoptions); - options = oldoptions; - switch(baud){ - case 300: cfsetispeed(&options,B300); - cfsetospeed(&options,B300); - break; - case 1200: cfsetispeed(&options,B1200); - cfsetospeed(&options,B1200); - break; - case 2400: cfsetispeed(&options,B2400); - cfsetospeed(&options,B2400); - break; - case 4800: cfsetispeed(&options,B4800); - cfsetospeed(&options,B4800); - break; - case 9600: cfsetispeed(&options,B9600); - cfsetospeed(&options,B9600); - break; - case 14400: cfsetispeed(&options,B14400); - cfsetospeed(&options,B14400); - break; - case 19200: cfsetispeed(&options,B19200); - cfsetospeed(&options,B19200); - break; - case 28800: cfsetispeed(&options,B28800); - cfsetospeed(&options,B28800); - break; - case 38400: cfsetispeed(&options,B38400); - cfsetospeed(&options,B38400); - break; - case 57600: cfsetispeed(&options,B57600); - cfsetospeed(&options,B57600); - break; - case 115200: cfsetispeed(&options,B115200); - cfsetospeed(&options,B115200); - break; - case 230400: cfsetispeed(&options,B230400); - cfsetospeed(&options,B230400); - break; - - default: cfsetispeed(&options,B9600); - cfsetospeed(&options,B9600); - printf("ofSerialInit: cannot set %i baud setting baud to 9600", baud); - break; - } - - options.c_cflag |= (CLOCAL | CREAD); - options.c_cflag &= ~PARENB; - options.c_cflag &= ~CSTOPB; - options.c_cflag &= ~CSIZE; - options.c_cflag |= CS8; - tcsetattr(fd,TCSANOW,&options); - - bInited = true; - printf("Success in opening serial connection!\n\n"); - - return true; - //--------------------------------------------- - #endif - //--------------------------------------------- - - - //--------------------------------------------- - #ifdef TARGET_WIN32 - //--------------------------------------------- - - // open the serial port: - // "COM4", etc... - - hComm=CreateFileA(portName.c_str(),GENERIC_READ|GENERIC_WRITE,0,0, - OPEN_EXISTING,0,0); - - if(hComm==INVALID_HANDLE_VALUE){ - printf("ofSerial: unable to open port"); - return false; - } - - - // now try the settings: - COMMCONFIG cfg; - DWORD cfgSize; - char buf[80]; - - cfgSize=sizeof(cfg); - GetCommConfig(hComm,&cfg,&cfgSize); - int bps = baud; - sprintf(buf,"baud=%d parity=N data=8 stop=1",bps); - - #if (_MSC_VER) // microsoft visual studio - // msvc doesn't like BuildCommDCB, - //so we need to use this version: BuildCommDCBA - if(!BuildCommDCBA(buf,&cfg.dcb)){ - printf("ofSerial: unable to build comm dcb; (%s)",buf); - } - #else - if(!BuildCommDCB(buf,&cfg.dcb)){ - printf("ofSerial: Can't build comm dcb; %s",buf); - } - #endif - - - // Set baudrate and bits etc. - // Note that BuildCommDCB() clears XON/XOFF and hardware control by default - - if(!SetCommState(hComm,&cfg.dcb)){ - printf("ofSerial: Can't set comm state"); - } - sprintf(buf,"bps=%d, xio=%d/%d",cfg.dcb.BaudRate,cfg.dcb.fOutX,cfg.dcb.fInX); - - // Set communication timeouts (NT) - COMMTIMEOUTS tOut; - GetCommTimeouts(hComm,&oldTimeout); - tOut = oldTimeout; - // Make timeout so that: - // - return immediately with buffered characters - tOut.ReadIntervalTimeout=MAXDWORD; - tOut.ReadTotalTimeoutMultiplier=0; - tOut.ReadTotalTimeoutConstant=0; - SetCommTimeouts(hComm,&tOut); - - bInited = true; - return true; - //--------------------------------------------- - #endif - //--------------------------------------------- +bool ofSerial::setup(string portName, int baud) +{ + + bInited = false; + + //--------------------------------------------- +#if defined( TARGET_OSX ) || defined( TARGET_LINUX ) + //--------------------------------------------- + + //lets account for the name being passed in instead of the device path + if (portName.size() > 5 && portName.substr(0, 5) != "/dev/") + { + portName = "/dev/" + portName; + } + + printf("ofSerialInit: opening port %s @ %d bps\n\n", portName.c_str(), baud); + fd = open(portName.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK); + if (fd == -1) + { + printf("ofSerial: unable to open port %s\n", portName.c_str()); + printf("Error opening port: %s\n", strerror(errno)); + return false; + } + + struct termios options; + tcgetattr(fd,&oldoptions); + options = oldoptions; + switch (baud) + { + case 300: + cfsetispeed(&options,B300); + cfsetospeed(&options,B300); + break; + case 1200: + cfsetispeed(&options,B1200); + cfsetospeed(&options,B1200); + break; + case 2400: + cfsetispeed(&options,B2400); + cfsetospeed(&options,B2400); + break; + case 4800: + cfsetispeed(&options,B4800); + cfsetospeed(&options,B4800); + break; + case 9600: + cfsetispeed(&options,B9600); + cfsetospeed(&options,B9600); + break; + case 14400: + cfsetispeed(&options,B14400); + cfsetospeed(&options,B14400); + break; + case 19200: + cfsetispeed(&options,B19200); + cfsetospeed(&options,B19200); + break; + case 28800: + cfsetispeed(&options,B28800); + cfsetospeed(&options,B28800); + break; + case 38400: + cfsetispeed(&options,B38400); + cfsetospeed(&options,B38400); + break; + case 57600: + cfsetispeed(&options,B57600); + cfsetospeed(&options,B57600); + break; + case 115200: + cfsetispeed(&options,B115200); + cfsetospeed(&options,B115200); + break; + case 230400: + cfsetispeed(&options,B230400); + cfsetospeed(&options,B230400); + break; + + default: + cfsetispeed(&options,B9600); + cfsetospeed(&options,B9600); + printf("ofSerialInit: cannot set %i baud setting baud to 9600", baud); + break; + } + + options.c_cflag |= (CLOCAL | CREAD); + options.c_cflag &= ~PARENB; + options.c_cflag &= ~CSTOPB; + options.c_cflag &= ~CSIZE; + options.c_cflag |= CS8; + tcsetattr(fd,TCSANOW,&options); + + bInited = true; + printf("Success in opening serial connection!\n\n"); + + return true; + //--------------------------------------------- +#endif + //--------------------------------------------- + + + //--------------------------------------------- +#ifdef TARGET_WIN32 + //--------------------------------------------- + + // open the serial port: + // "COM4", etc... + + hComm=CreateFileA(portName.c_str(),GENERIC_READ|GENERIC_WRITE,0,0, + OPEN_EXISTING,0,0); + + if (hComm==INVALID_HANDLE_VALUE) + { + printf("ofSerial: unable to open port"); + return false; + } + + + // now try the settings: + COMMCONFIG cfg; + DWORD cfgSize; + char buf[80]; + + cfgSize=sizeof(cfg); + GetCommConfig(hComm,&cfg,&cfgSize); + int bps = baud; + sprintf(buf,"baud=%d parity=N data=8 stop=1",bps); + +#if (_MSC_VER) // microsoft visual studio + // msvc doesn't like BuildCommDCB, + //so we need to use this version: BuildCommDCBA + if (!BuildCommDCBA(buf,&cfg.dcb)) + { + printf("ofSerial: unable to build comm dcb; (%s)",buf); + } +#else + if (!BuildCommDCB(buf,&cfg.dcb)) + { + printf("ofSerial: Can't build comm dcb; %s",buf); + } +#endif + + + // Set baudrate and bits etc. + // Note that BuildCommDCB() clears XON/XOFF and hardware control by default + + if (!SetCommState(hComm,&cfg.dcb)) + { + printf("ofSerial: Can't set comm state"); + } + sprintf(buf,"bps=%d, xio=%d/%d",cfg.dcb.BaudRate,cfg.dcb.fOutX,cfg.dcb.fInX); + + // Set communication timeouts (NT) + COMMTIMEOUTS tOut; + GetCommTimeouts(hComm,&oldTimeout); + tOut = oldTimeout; + // Make timeout so that: + // - return immediately with buffered characters + tOut.ReadIntervalTimeout=MAXDWORD; + tOut.ReadTotalTimeoutMultiplier=0; + tOut.ReadTotalTimeoutConstant=0; + SetCommTimeouts(hComm,&tOut); + + bInited = true; + return true; + //--------------------------------------------- +#endif + //--------------------------------------------- } //---------------------------------------------------------------- -int ofSerial::writeBytes(unsigned char * buffer, int length){ - - if (!bInited){ - //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); - return OF_SERIAL_ERROR; - } - - //--------------------------------------------- - #if defined( TARGET_OSX ) || defined( TARGET_LINUX ) - int numWritten = write(fd, buffer, length); - if(numWritten <= 0){ - if ( errno == EAGAIN ) - return 0; - //ofLog(OF_LOG_ERROR,"ofSerial: Can't write to com port, errno %i (%s)", errno, strerror(errno)); - return OF_SERIAL_ERROR; - } - - //ofLog(OF_LOG_VERBOSE,"ofSerial: numWritten %i", numWritten); - - return numWritten; - #endif - //--------------------------------------------- - - //--------------------------------------------- - #ifdef TARGET_WIN32 - DWORD written; - if(!WriteFile(hComm, buffer, length, &written,0)){ - //ofLog(OF_LOG_ERROR,"ofSerial: Can't write to com port"); - return OF_SERIAL_ERROR; - } - //ofLog(OF_LOG_VERBOSE,"ofSerial: numWritten %i", (int)written); - return (int)written; - #else - return 0; - #endif - //--------------------------------------------- +int ofSerial::writeBytes(unsigned char* buffer, int length) +{ + + if (!bInited) + { + //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); + return OF_SERIAL_ERROR; + } + + //--------------------------------------------- +#if defined( TARGET_OSX ) || defined( TARGET_LINUX ) + int numWritten = write(fd, buffer, length); + if (numWritten <= 0) + { + if (errno == EAGAIN) + return 0; + //ofLog(OF_LOG_ERROR,"ofSerial: Can't write to com port, errno %i (%s)", errno, strerror(errno)); + return OF_SERIAL_ERROR; + } + + //ofLog(OF_LOG_VERBOSE,"ofSerial: numWritten %i", numWritten); + + return numWritten; +#endif + //--------------------------------------------- + + //--------------------------------------------- +#ifdef TARGET_WIN32 + DWORD written; + if (!WriteFile(hComm, buffer, length, &written,0)) + { + //ofLog(OF_LOG_ERROR,"ofSerial: Can't write to com port"); + return OF_SERIAL_ERROR; + } + //ofLog(OF_LOG_VERBOSE,"ofSerial: numWritten %i", (int)written); + return (int)written; +#else + return 0; +#endif + //--------------------------------------------- } //---------------------------------------------------------------- -int ofSerial::readBytes(unsigned char * buffer, int length){ - - if (!bInited){ - //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); - return OF_SERIAL_ERROR; - } - - //--------------------------------------------- - #if defined( TARGET_OSX ) || defined( TARGET_LINUX ) - int nRead = read(fd, buffer, length); - if(nRead < 0){ - if ( errno == EAGAIN ) - return OF_SERIAL_NO_DATA; - //ofLog(OF_LOG_ERROR,"ofSerial: trouble reading from port, errno %i (%s)", errno, strerror(errno)); - return OF_SERIAL_ERROR; - } - return nRead; - #endif - //--------------------------------------------- - - //--------------------------------------------- - #ifdef TARGET_WIN32 - DWORD nRead = 0; - if (!ReadFile(hComm,buffer,length,&nRead,0)){ - //ofLog(OF_LOG_ERROR,"ofSerial: trouble reading from port"); - return OF_SERIAL_ERROR; - } - return (int)nRead; - #endif - //--------------------------------------------- +int ofSerial::readBytes(unsigned char* buffer, int length) +{ + + if (!bInited) + { + //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); + return OF_SERIAL_ERROR; + } + + //--------------------------------------------- +#if defined( TARGET_OSX ) || defined( TARGET_LINUX ) + int nRead = read(fd, buffer, length); + if (nRead < 0) + { + if (errno == EAGAIN) + return OF_SERIAL_NO_DATA; + //ofLog(OF_LOG_ERROR,"ofSerial: trouble reading from port, errno %i (%s)", errno, strerror(errno)); + return OF_SERIAL_ERROR; + } + return nRead; +#endif + //--------------------------------------------- + + //--------------------------------------------- +#ifdef TARGET_WIN32 + DWORD nRead = 0; + if (!ReadFile(hComm,buffer,length,&nRead,0)) + { + //ofLog(OF_LOG_ERROR,"ofSerial: trouble reading from port"); + return OF_SERIAL_ERROR; + } + return (int)nRead; +#endif + //--------------------------------------------- } //---------------------------------------------------------------- -bool ofSerial::writeByte(unsigned char singleByte){ - - if (!bInited){ - //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); - //return OF_SERIAL_ERROR; // this looks wrong. - return false; - } +bool ofSerial::writeByte(unsigned char singleByte) +{ + + if (!bInited) + { + //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); + //return OF_SERIAL_ERROR; // this looks wrong. + return false; + } - unsigned char tmpByte[1]; - tmpByte[0] = singleByte; + unsigned char tmpByte[1]; + tmpByte[0] = singleByte; - //--------------------------------------------- - #if defined( TARGET_OSX ) || defined( TARGET_LINUX ) - int numWritten = 0; - numWritten = write(fd, tmpByte, 1); - if(numWritten <= 0 ){ - if ( errno == EAGAIN ) - return 0; - //ofLog(OF_LOG_ERROR,"ofSerial: Can't write to com port, errno %i (%s)", errno, strerror(errno)); - return OF_SERIAL_ERROR; - } - //ofLog(OF_LOG_VERBOSE,"ofSerial: written byte"); + //--------------------------------------------- +#if defined( TARGET_OSX ) || defined( TARGET_LINUX ) + int numWritten = 0; + numWritten = write(fd, tmpByte, 1); + if (numWritten <= 0) + { + if (errno == EAGAIN) + return 0; + //ofLog(OF_LOG_ERROR,"ofSerial: Can't write to com port, errno %i (%s)", errno, strerror(errno)); + return OF_SERIAL_ERROR; + } + //ofLog(OF_LOG_VERBOSE,"ofSerial: written byte"); - return (numWritten > 0 ? true : false); - #endif + return (numWritten > 0 ? true : false); +#endif //--------------------------------------------- //--------------------------------------------- - #ifdef TARGET_WIN32 - DWORD written = 0; - if(!WriteFile(hComm, tmpByte, 1, &written,0)){ - //ofLog(OF_LOG_ERROR,"ofSerial: Can't write to com port"); - return OF_SERIAL_ERROR;; - } +#ifdef TARGET_WIN32 + DWORD written = 0; + if (!WriteFile(hComm, tmpByte, 1, &written,0)) + { + //ofLog(OF_LOG_ERROR,"ofSerial: Can't write to com port"); + return OF_SERIAL_ERROR;; + } - //ofLog(OF_LOG_VERBOSE,"ofSerial: written byte"); + //ofLog(OF_LOG_VERBOSE,"ofSerial: written byte"); - return ((int)written > 0 ? true : false); - #endif - //--------------------------------------------- + return ((int)written > 0 ? true : false); +#endif + //--------------------------------------------- } //---------------------------------------------------------------- -int ofSerial::readByte(){ - - if (!bInited){ - //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); - return OF_SERIAL_ERROR; - } - - unsigned char tmpByte[1]; - memset(tmpByte, 0, 1); - - //--------------------------------------------- - #if defined( TARGET_OSX ) || defined( TARGET_LINUX ) - int nRead = read(fd, tmpByte, 1); - if(nRead < 0){ - if ( errno == EAGAIN ) - return OF_SERIAL_NO_DATA; - //ofLog(OF_LOG_ERROR,"ofSerial: trouble reading from port, errno %i (%s)", errno, strerror(errno)); - return OF_SERIAL_ERROR; - } - if(nRead == 0) - return OF_SERIAL_NO_DATA; - #endif - //--------------------------------------------- - - //--------------------------------------------- - #ifdef TARGET_WIN32 - DWORD nRead; - if (!ReadFile(hComm, tmpByte, 1, &nRead, 0)){ - //ofLog(OF_LOG_ERROR,"ofSerial: trouble reading from port"); - return OF_SERIAL_ERROR; - } - #endif - //--------------------------------------------- - - return (int)(tmpByte[0]); +int ofSerial::readByte() +{ + + if (!bInited) + { + //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); + return OF_SERIAL_ERROR; + } + + unsigned char tmpByte[1]; + memset(tmpByte, 0, 1); + + //--------------------------------------------- +#if defined( TARGET_OSX ) || defined( TARGET_LINUX ) + int nRead = read(fd, tmpByte, 1); + if (nRead < 0) + { + if (errno == EAGAIN) + return OF_SERIAL_NO_DATA; + //ofLog(OF_LOG_ERROR,"ofSerial: trouble reading from port, errno %i (%s)", errno, strerror(errno)); + return OF_SERIAL_ERROR; + } + if (nRead == 0) + return OF_SERIAL_NO_DATA; +#endif + //--------------------------------------------- + + //--------------------------------------------- +#ifdef TARGET_WIN32 + DWORD nRead; + if (!ReadFile(hComm, tmpByte, 1, &nRead, 0)) + { + //ofLog(OF_LOG_ERROR,"ofSerial: trouble reading from port"); + return OF_SERIAL_ERROR; + } +#endif + //--------------------------------------------- + + return (int)(tmpByte[0]); } //---------------------------------------------------------------- -void ofSerial::flush(bool flushIn, bool flushOut){ +void ofSerial::flush(bool flushIn, bool flushOut) +{ - if (!bInited){ - //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); - return; - } + if (!bInited) + { + //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); + return; + } - int flushType = 0; + int flushType = 0; - //--------------------------------------------- - #if defined( TARGET_OSX ) || defined( TARGET_LINUX ) - if( flushIn && flushOut) flushType = TCIOFLUSH; - else if(flushIn) flushType = TCIFLUSH; - else if(flushOut) flushType = TCOFLUSH; - else return; + //--------------------------------------------- +#if defined( TARGET_OSX ) || defined( TARGET_LINUX ) + if (flushIn && flushOut) flushType = TCIOFLUSH; + else if (flushIn) flushType = TCIFLUSH; + else if (flushOut) flushType = TCOFLUSH; + else return; - tcflush(fd, flushType); - #endif + tcflush(fd, flushType); +#endif //--------------------------------------------- //--------------------------------------------- - #ifdef TARGET_WIN32 - if( flushIn && flushOut) flushType = PURGE_TXCLEAR | PURGE_RXCLEAR; - else if(flushIn) flushType = PURGE_RXCLEAR; - else if(flushOut) flushType = PURGE_TXCLEAR; - else return; +#ifdef TARGET_WIN32 + if (flushIn && flushOut) flushType = PURGE_TXCLEAR | PURGE_RXCLEAR; + else if (flushIn) flushType = PURGE_RXCLEAR; + else if (flushOut) flushType = PURGE_TXCLEAR; + else return; - PurgeComm(hComm, flushType); - #endif - //--------------------------------------------- + PurgeComm(hComm, flushType); +#endif + //--------------------------------------------- } -void ofSerial::drain(){ - if (!bInited){ - //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); - return; +void ofSerial::drain() +{ + if (!bInited) + { + //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); + return; } - #if defined( TARGET_OSX ) || defined( TARGET_LINUX ) - tcdrain( fd ); - #endif +#if defined( TARGET_OSX ) || defined( TARGET_LINUX ) + tcdrain(fd); +#endif } //------------------------------------------------------------- -int ofSerial::available(){ +int ofSerial::available() +{ - if (!bInited){ - //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); - return OF_SERIAL_ERROR; - } + if (!bInited) + { + //ofLog(OF_LOG_ERROR,"ofSerial: serial not inited"); + return OF_SERIAL_ERROR; + } - int numBytes = 0; + int numBytes = 0; - //--------------------------------------------- - #if defined( TARGET_OSX ) || defined( TARGET_LINUX ) - ioctl(fd,FIONREAD,&numBytes); - #endif + //--------------------------------------------- +#if defined( TARGET_OSX ) || defined( TARGET_LINUX ) + ioctl(fd,FIONREAD,&numBytes); +#endif //--------------------------------------------- //--------------------------------------------- - #ifdef TARGET_WIN32 - COMSTAT stat; - DWORD err; - if(hComm!=INVALID_HANDLE_VALUE){ - if(!ClearCommError(hComm, &err, &stat)){ - numBytes = 0; - } else { - numBytes = stat.cbInQue; - } - } else { - numBytes = 0; - } - #endif +#ifdef TARGET_WIN32 + COMSTAT stat; + DWORD err; + if (hComm!=INVALID_HANDLE_VALUE) + { + if (!ClearCommError(hComm, &err, &stat)) + { + numBytes = 0; + } + else + { + numBytes = stat.cbInQue; + } + } + else + { + numBytes = 0; + } +#endif //--------------------------------------------- - return numBytes; + return numBytes; } diff --git a/Source/Processors/Serial/ofSerial.h b/Source/Processors/Serial/ofSerial.h index 2045b3d09b4e02a4f8d4c261db814e922f8a3170..3a7bb1844d29b7b9b8ac522f9a042405b7f206c4 100755 --- a/Source/Processors/Serial/ofSerial.h +++ b/Source/Processors/Serial/ofSerial.h @@ -8,119 +8,126 @@ //#include "ofTypes.h" #if defined( TARGET_OSX ) || defined( TARGET_LINUX ) || defined (TARGET_ANDROID) - #include <termios.h> +#include <termios.h> #else - #include <winbase.h> - #include <tchar.h> - #include <iostream> - #include <string.h> - #include <setupapi.h> - #include <regstr.h> - #define MAX_SERIAL_PORTS 256 - #include <winioctl.h> - #ifdef __MINGW32__ - #define INITGUID - #include <initguid.h> // needed for dev-c++ & DEFINE_GUID - #endif +#include <winbase.h> +#include <tchar.h> +#include <iostream> +#include <string.h> +#include <setupapi.h> +#include <regstr.h> +#define MAX_SERIAL_PORTS 256 +#include <winioctl.h> +#ifdef __MINGW32__ +#define INITGUID +#include <initguid.h> // needed for dev-c++ & DEFINE_GUID +#endif #endif #define OF_SERIAL_NO_DATA -2 #define OF_SERIAL_ERROR -1 // notes below -class ofSerialDeviceInfo{ - friend class ofSerial; - - public: - - ofSerialDeviceInfo(string devicePathIn, string deviceNameIn, int deviceIDIn){ - devicePath = devicePathIn; - deviceName = deviceNameIn; - deviceID = deviceIDIn; - } - - ofSerialDeviceInfo(){ - deviceName = "device undefined"; - deviceID = -1; - } - - string getDevicePath(){ - return devicePath; - } - - string getDeviceName(){ - return deviceName; - } +class ofSerialDeviceInfo +{ + friend class ofSerial; + +public: + + ofSerialDeviceInfo(string devicePathIn, string deviceNameIn, int deviceIDIn) + { + devicePath = devicePathIn; + deviceName = deviceNameIn; + deviceID = deviceIDIn; + } + + ofSerialDeviceInfo() + { + deviceName = "device undefined"; + deviceID = -1; + } + + string getDevicePath() + { + return devicePath; + } + + string getDeviceName() + { + return deviceName; + } + + int getDeviceID() + { + return deviceID; + } + +protected: + string devicePath; //eg: /dev/tty.cu/usbdevice-a440 + string deviceName; //eg: usbdevice-a440 / COM4 + int deviceID; //eg: 0,1,2,3 etc + + //TODO: other stuff for serial ? +}; - int getDeviceID(){ - return deviceID; - } - protected: - string devicePath; //eg: /dev/tty.cu/usbdevice-a440 - string deviceName; //eg: usbdevice-a440 / COM4 - int deviceID; //eg: 0,1,2,3 etc - //TODO: other stuff for serial ? -}; +//---------------------------------------------------------------------- +class ofSerial +{ +public: + ofSerial(); + virtual ~ofSerial(); + void listDevices(); -//---------------------------------------------------------------------- -class ofSerial { + //old method - deprecated + void enumerateDevices(); - public: - ofSerial(); - virtual ~ofSerial(); + vector <ofSerialDeviceInfo> getDeviceList(); - void listDevices(); - - //old method - deprecated - void enumerateDevices(); + void close(); + bool setup(); // use default port, baud (0,9600) + bool setup(string portName, int baudrate); + bool setup(int deviceNumber, int baudrate); - vector <ofSerialDeviceInfo> getDeviceList(); - void close(); - bool setup(); // use default port, baud (0,9600) - bool setup(string portName, int baudrate); - bool setup(int deviceNumber, int baudrate); + int readBytes(unsigned char* buffer, int length); + int writeBytes(unsigned char* buffer, int length); + bool writeByte(unsigned char singleByte); + int readByte(); // returns -1 on no read or error... + void flush(bool flushIn = true, bool flushOut = true); + int available(); + void drain(); - int readBytes(unsigned char * buffer, int length); - int writeBytes(unsigned char * buffer, int length); - bool writeByte(unsigned char singleByte); - int readByte(); // returns -1 on no read or error... - void flush(bool flushIn = true, bool flushOut = true); - int available(); - void drain(); - +protected: + void buildDeviceList(); - protected: - void buildDeviceList(); - - string deviceType; - vector <ofSerialDeviceInfo> devices; + string deviceType; + vector <ofSerialDeviceInfo> devices; - bool bHaveEnumeratedDevices; + bool bHaveEnumeratedDevices; - bool bInited; + bool bInited; - #ifdef TARGET_WIN32 +#ifdef TARGET_WIN32 - char ** portNamesShort;//[MAX_SERIAL_PORTS]; - char ** portNamesFriendly; ///[MAX_SERIAL_PORTS]; - HANDLE hComm; // the handle to the serial port pc - int nPorts; - bool bPortsEnumerated; - void enumerateWin32Ports(); - COMMTIMEOUTS oldTimeout; // we alter this, so keep a record + char** portNamesShort;//[MAX_SERIAL_PORTS]; + char** portNamesFriendly; ///[MAX_SERIAL_PORTS]; + HANDLE hComm; // the handle to the serial port pc + int nPorts; + bool bPortsEnumerated; + void enumerateWin32Ports(); + COMMTIMEOUTS oldTimeout; // we alter this, so keep a record - #else - int fd; // the handle to the serial port mac - struct termios oldoptions; - #endif +#else + int fd; // the handle to the serial port mac + struct termios oldoptions; +#endif }; diff --git a/Source/Processors/SignalGenerator.cpp b/Source/Processors/SignalGenerator.cpp index 63bd63523356fa3ec93e6c1df6d97844e253e222..7c736f09a6e9b899a5b0ff36800de1f63113d694 100755 --- a/Source/Processors/SignalGenerator.cpp +++ b/Source/Processors/SignalGenerator.cpp @@ -32,9 +32,9 @@ #endif SignalGenerator::SignalGenerator() - : GenericProcessor("Signal Generator"), - nOut(5), defaultFrequency(10.0), defaultAmplitude(0.5f), - previousPhase(1000), spikeDelay(0) + : GenericProcessor("Signal Generator"), + nOut(5), defaultFrequency(10.0), defaultAmplitude(0.5f), + previousPhase(1000), spikeDelay(0) { parameters.add(Parameter("Amplitude", 0.0005f, 500.0f, .5f, 0, true)); parameters.add(Parameter("Frequency", 0.01, 10000.0, 10, 1, true)); @@ -56,249 +56,262 @@ SignalGenerator::~SignalGenerator() } */ -AudioProcessorEditor* SignalGenerator::createEditor( ) +AudioProcessorEditor* SignalGenerator::createEditor() { - editor = new SignalGeneratorEditor(this, false); - return editor; + editor = new SignalGeneratorEditor(this, false); + return editor; } void SignalGenerator::updateSettings() { - //std::cout << "Signal generator updating parameters" << std::endl; + //std::cout << "Signal generator updating parameters" << std::endl; - while (waveformType.size() < getNumOutputs()) - { - waveformType.add(SINE); - frequency.add(defaultFrequency); - amplitude.add(defaultAmplitude); - phase.add(0); - phasePerSample.add(double_Pi * 2.0 / (getSampleRate() / frequency.getLast())); - currentPhase.add(0); - } + while (waveformType.size() < getNumOutputs()) + { + waveformType.add(SINE); + frequency.add(defaultFrequency); + amplitude.add(defaultAmplitude); + phase.add(0); + phasePerSample.add(double_Pi * 2.0 / (getSampleRate() / frequency.getLast())); + currentPhase.add(0); + } - sampleRateRatio = getSampleRate() / 44100.0; + sampleRateRatio = getSampleRate() / 44100.0; - std::cout << "Sample rate ratio: " << sampleRateRatio << std::endl; + std::cout << "Sample rate ratio: " << sampleRateRatio << std::endl; } -void SignalGenerator::setParameter (int parameterIndex, float newValue) +void SignalGenerator::setParameter(int parameterIndex, float newValue) { - std::cout << "Message received." << std::endl; + std::cout << "Message received." << std::endl; Parameter* parameterPointer=parameters.getRawDataPointer(); parameterPointer=parameterPointer+parameterIndex; - - if (currentChannel > -1) { - if (parameterIndex == 0) { - amplitude.set(currentChannel,newValue*100.0f); + + if (currentChannel > -1) + { + if (parameterIndex == 0) + { + amplitude.set(currentChannel,newValue*100.0f); parameterPointer->setValue(newValue*100.0f, currentChannel); - } else if (parameterIndex == 1) { - frequency.set(currentChannel,newValue); - phasePerSample.set(currentChannel, double_Pi * 2.0 / (getSampleRate() / frequency[currentChannel])); + } + else if (parameterIndex == 1) + { + frequency.set(currentChannel,newValue); + phasePerSample.set(currentChannel, double_Pi * 2.0 / (getSampleRate() / frequency[currentChannel])); parameterPointer->setValue(newValue, currentChannel); - } else if (parameterIndex == 2) { - phase.set(currentChannel, newValue/360.0f * (double_Pi * 2.0)); + } + else if (parameterIndex == 2) + { + phase.set(currentChannel, newValue/360.0f * (double_Pi * 2.0)); parameterPointer->setValue(newValue/360.0f * (double_Pi * 2.0), currentChannel); - } else if (parameterIndex == 3) { - waveformType.set(currentChannel, (int) newValue); + } + else if (parameterIndex == 3) + { + waveformType.set(currentChannel, (int) newValue); parameterPointer->setValue(newValue, currentChannel); - } - //updateWaveform(currentChannel); - } + } + //updateWaveform(currentChannel); + } } -bool SignalGenerator::enable () { +bool SignalGenerator::enable() +{ - std::cout << "Signal generator received enable signal." << std::endl; - - // for (int n = 0; n < waveformType.size(); n++) - // { - // updateWaveform(n); - - // } + std::cout << "Signal generator received enable signal." << std::endl; - return true; + // for (int n = 0; n < waveformType.size(); n++) + // { + // updateWaveform(n); + + // } + + return true; } // void SignalGenerator::updateWaveform(int n) // { - // Array<float> cycleData; - - // int cycleLength = int(getSampleRate() / frequency[n]); - // float phasePerSample = double_Pi * 2.0 / (getSampleRate() / frequency[n]); - - // cycleData.ensureStorageAllocated(cycleLength); - - // for (int i = 0; i < cycleLength; i++) - // { - // switch (waveformType[n]) - // { - // case SINE: - // cycleData.add(amplitude[n] * std::sin(i*phasePerSample + phase[n])); - // break; - // case SQUARE: - // cycleData.add(amplitude[n] * copysign(1,std::sin(i*phasePerSample + phase[n]))); - // break; - // case TRIANGLE: - // cycleData.add(0); - // break; - // case SAW: - // cycleData.add(0); - // break; - // case NOISE: - // cycleData.add(0); - // break; - // default: - // cycleData.set(i, 0); - // } - - // } - - // waveforms.set(n, cycleData); - - // currentSample.set(n,0); +// Array<float> cycleData; + +// int cycleLength = int(getSampleRate() / frequency[n]); +// float phasePerSample = double_Pi * 2.0 / (getSampleRate() / frequency[n]); + +// cycleData.ensureStorageAllocated(cycleLength); + +// for (int i = 0; i < cycleLength; i++) +// { +// switch (waveformType[n]) +// { +// case SINE: +// cycleData.add(amplitude[n] * std::sin(i*phasePerSample + phase[n])); +// break; +// case SQUARE: +// cycleData.add(amplitude[n] * copysign(1,std::sin(i*phasePerSample + phase[n]))); +// break; +// case TRIANGLE: +// cycleData.add(0); +// break; +// case SAW: +// cycleData.add(0); +// break; +// case NOISE: +// cycleData.add(0); +// break; +// default: +// cycleData.set(i, 0); +// } // } -bool SignalGenerator::disable() { - - std::cout << "Signal generator received disable signal." << std::endl; - return true; +// waveforms.set(n, cycleData); + +// currentSample.set(n,0); + +// } + +bool SignalGenerator::disable() +{ + + std::cout << "Signal generator received disable signal." << std::endl; + return true; } -void SignalGenerator::process(AudioSampleBuffer &buffer, - MidiBuffer &midiMessages, - int& nSamps) +void SignalGenerator::process(AudioSampleBuffer& buffer, + MidiBuffer& midiMessages, + int& nSamps) { - nSamps = int((float) buffer.getNumSamples() * sampleRateRatio); + nSamps = int((float) buffer.getNumSamples() * sampleRateRatio); for (int i = 0; i < nSamps; ++i) { - for (int j = buffer.getNumChannels(); --j >= 0;) { - - float sample; - - switch (waveformType[j]) - { - case SINE: - sample = amplitude[j] * (float) std::sin (currentPhase[j] + phase[j]); - break; - case SQUARE: - sample = amplitude[j] * copysign(1,std::sin(currentPhase[j] + phase[j])); - break; - case TRIANGLE: - sample = amplitude[j] * ((currentPhase[j] + phase[j]) / double_Pi - 1) * - copysign(2,std::sin(currentPhase[j] + phase[j])); - break; - case SAW: - sample = amplitude[j] * ((currentPhase[j] + phase[j]) / double_Pi - 1); - break; - case NOISE: - // sample = amplitude[j] * (float(rand()) / float(RAND_MAX)-0.5f); - // break; + for (int j = buffer.getNumChannels(); --j >= 0;) + { + + float sample; + + switch (waveformType[j]) + { + case SINE: + sample = amplitude[j] * (float) std::sin(currentPhase[j] + phase[j]); + break; + case SQUARE: + sample = amplitude[j] * copysign(1,std::sin(currentPhase[j] + phase[j])); + break; + case TRIANGLE: + sample = amplitude[j] * ((currentPhase[j] + phase[j]) / double_Pi - 1) * + copysign(2,std::sin(currentPhase[j] + phase[j])); + break; + case SAW: + sample = amplitude[j] * ((currentPhase[j] + phase[j]) / double_Pi - 1); + break; + case NOISE: + // sample = amplitude[j] * (float(rand()) / float(RAND_MAX)-0.5f); + // break; case SPIKE: sample = generateSpikeSample(amplitude[j], currentPhase[j], phase[j]); break; - default: - sample = 0; - } - - currentPhase.set(j,currentPhase[j] + phasePerSample[j]); + default: + sample = 0; + } - if (currentPhase[j] > double_Pi*2) - currentPhase.set(j,0); + currentPhase.set(j,currentPhase[j] + phasePerSample[j]); - // dereference pointer to one of the buffer's samples - *buffer.getSampleData (j, i) = sample; + if (currentPhase[j] > double_Pi*2) + currentPhase.set(j,0); + + // dereference pointer to one of the buffer's samples + *buffer.getSampleData(j, i) = sample; } } - // for (int chan = 0; chan < buffer.getNumChannels(); chan++) - // { - - // int dataSize = waveforms[chan].size(); - // int destSample = -dataSize; - // int lastSample = dataSize; + // for (int chan = 0; chan < buffer.getNumChannels(); chan++) + // { + + // int dataSize = waveforms[chan].size(); + // int destSample = -dataSize; + // int lastSample = dataSize; - // while (lastSample < nSamps) - // { + // while (lastSample < nSamps) + // { - // destSample += dataSize; + // destSample += dataSize; - // //std::cout << lastSample << " " << destSample << " " << currentSample[chan] << " " << dataSize << std::endl; + // //std::cout << lastSample << " " << destSample << " " << currentSample[chan] << " " << dataSize << std::endl; - // // buffer.copyFrom(chan, - // // destSample, - // // waveforms[chan].getRawDataPointer() + currentSample[chan], - // // dataSize - currentSample[chan]); + // // buffer.copyFrom(chan, + // // destSample, + // // waveforms[chan].getRawDataPointer() + currentSample[chan], + // // dataSize - currentSample[chan]); - // lastSample += dataSize; + // lastSample += dataSize; - // currentSample.set(chan,0); + // currentSample.set(chan,0); - // //std::cout << "DONE" << std::endl; - // } + // //std::cout << "DONE" << std::endl; + // } - // //std::cout << lastSample << " " << destSample << " " << currentSample[chan] << " " << dataSize << std::endl; + // //std::cout << lastSample << " " << destSample << " " << currentSample[chan] << " " << dataSize << std::endl; - // if (destSample < 0) - // destSample = 0; + // if (destSample < 0) + // destSample = 0; - // int samplesLeft = nSamps - destSample; + // int samplesLeft = nSamps - destSample; - // if (samplesLeft < dataSize - currentSample[chan]) - // { - // // buffer.copyFrom(chan, - // // destSample, - // // waveforms[chan].getRawDataPointer() + currentSample[chan], - // // samplesLeft); + // if (samplesLeft < dataSize - currentSample[chan]) + // { + // // buffer.copyFrom(chan, + // // destSample, + // // waveforms[chan].getRawDataPointer() + currentSample[chan], + // // samplesLeft); - // currentSample.set(chan, currentSample[chan] + samplesLeft); + // currentSample.set(chan, currentSample[chan] + samplesLeft); - // } else { + // } else { - // int samps = dataSize - currentSample[chan]; + // int samps = dataSize - currentSample[chan]; - // // buffer.copyFrom(chan, - // // destSample, - // // waveforms[chan].getRawDataPointer() + currentSample[chan], - // // samps); + // // buffer.copyFrom(chan, + // // destSample, + // // waveforms[chan].getRawDataPointer() + currentSample[chan], + // // samps); - // destSample += samps; - // samplesLeft -= samps; + // destSample += samps; + // samplesLeft -= samps; - // // buffer.copyFrom(chan, - // // destSample, - // // waveforms[chan].getRawDataPointer(), - // // samplesLeft); + // // buffer.copyFrom(chan, + // // destSample, + // // waveforms[chan].getRawDataPointer(), + // // samplesLeft); - // currentSample.set(chan, samplesLeft); - // } + // currentSample.set(chan, samplesLeft); + // } - // } + // } } -float SignalGenerator::generateSpikeSample(double amp, double phase, double noise){ - - +float SignalGenerator::generateSpikeSample(double amp, double phase, double noise) +{ + + // if the current phase is less than the previous phase we've probably wrapped and its time to select a new spike // if we've delayed long enough then draw a new spike otherwise wait until spikeDelay==0 - if (phase < previousPhase){ - spikeIdx = rand()%5; - - if( spikeDelay <= 0) - spikeDelay = rand()%200 + 50; - if (spikeDelay > 0) - spikeDelay --; + if (phase < previousPhase) + { + spikeIdx = rand()%5; + + if (spikeDelay <= 0) + spikeDelay = rand()%200 + 50; + if (spikeDelay > 0) + spikeDelay --; } - + previousPhase = phase; @@ -307,20 +320,20 @@ float SignalGenerator::generateSpikeSample(double amp, double phase, double nois double r = ((rand() % 201) - 100) / 1000.0; // Generate random number between -.1 and .1 noise = r * noise / (double_Pi * 2); // Shrink the range of r based upon the value of noise - - int sampIdx = (int) (phase / (2 * double_Pi) * (N_WAVEFORM_SAMPLES-1)); // bind between 0 and N_SAMP-1, too tired to figure out the proper math + + int sampIdx = (int)(phase / (2 * double_Pi) * (N_WAVEFORM_SAMPLES-1)); // bind between 0 and N_SAMP-1, too tired to figure out the proper math //sampIdx = sampIdx + 8; // Right now only sample from the 3rd waveform. I need to figure out a way to only sample from a single spike until the phase wraps float baseline = shift + gain * SPIKE_WAVEFORMS[spikeIdx][1] ; - float sample = shift + gain * ( SPIKE_WAVEFORMS[spikeIdx][sampIdx] + noise );// * pow( WAVEFORM_SCALE[sampIdx], amp / 200.0 ) ) ; + float sample = shift + gain * (SPIKE_WAVEFORMS[spikeIdx][sampIdx] + noise); // * pow( WAVEFORM_SCALE[sampIdx], amp / 200.0 ) ) ; float dV = sample - baseline; dV = dV * (1 + amp / 250); sample = baseline + dV; if (spikeDelay==0) - return sample; + return sample; else - return baseline; + return baseline; } diff --git a/Source/Processors/SignalGenerator.h b/Source/Processors/SignalGenerator.h index 487810d17c72b933524bfd9c35b40c970ea696c6..7e19e74aea60e39e6f3884b1613aa31e4b464e04 100755 --- a/Source/Processors/SignalGenerator.h +++ b/Source/Processors/SignalGenerator.h @@ -25,9 +25,6 @@ #define __SIGNALGENERATOR_H_EAA44B0B__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "GenericProcessor.h" #include "Editors/SignalGeneratorEditor.h" @@ -44,63 +41,79 @@ class SignalGenerator : public GenericProcessor { public: - - SignalGenerator(); - ~SignalGenerator(); - - void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); - - void setParameter (int parameterIndex, float newValue); - float getSampleRate() {return 44100.0;} + SignalGenerator(); + ~SignalGenerator(); - float getDefaultBitVolts() { return 0.03; } + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); - AudioProcessorEditor* createEditor(); - bool hasEditor() const {return true;} + void setParameter(int parameterIndex, float newValue); - bool enable(); - bool disable(); + float getSampleRate() + { + return 44100.0; + } - bool isSource() {return true;} + float getDefaultBitVolts() + { + return 0.03; + } - void updateSettings(); + AudioProcessorEditor* createEditor(); + bool hasEditor() const + { + return true; + } - int getDefaultNumOutputs() {return nOut;} + bool enable(); + bool disable(); + + bool isSource() + { + return true; + } + + void updateSettings(); + + int getDefaultNumOutputs() + { + return nOut; + } + + int nOut; - int nOut; - private: - - double defaultFrequency; - double defaultAmplitude; - + + double defaultFrequency; + double defaultAmplitude; + float generateSpikeSample(double amp, double phase, double noise); - - float sampleRateRatio; - //void updateWaveform(int chan); + float sampleRateRatio; + + //void updateWaveform(int chan); void initializeParameters(); - enum wvfrm{ - TRIANGLE, SINE, SQUARE, SAW, NOISE, SPIKE - }; - + enum wvfrm + { + TRIANGLE, SINE, SQUARE, SAW, NOISE, SPIKE + }; + Array<var> waveformParameter; - Array<int> waveformType; - Array<double> frequency; - Array<double> amplitude; - Array<double> phase; - Array<double> phasePerSample; - Array<double> currentPhase; - - double previousPhase; - int spikeIdx; - int spikeDelay; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SignalGenerator); + Array<int> waveformType; + Array<double> frequency; + Array<double> amplitude; + Array<double> phase; + Array<double> phasePerSample; + Array<double> currentPhase; + + double previousPhase; + int spikeIdx; + int spikeDelay; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SignalGenerator); }; diff --git a/Source/Processors/SourceNode.cpp b/Source/Processors/SourceNode.cpp index 664b39f535adf722e107ca16612d9da274bb99af..7d263a23128543de08e2f4e0a13033c5e12c0c01 100755 --- a/Source/Processors/SourceNode.cpp +++ b/Source/Processors/SourceNode.cpp @@ -28,60 +28,70 @@ #include "DataThreads/FileReaderThread.h" #include "DataThreads/RHD2000Thread.h" #include "Editors/SourceNodeEditor.h" +#include "Editors/RHD2000Editor.h" #include "Channel.h" #include <stdio.h> SourceNode::SourceNode(const String& name_) - : GenericProcessor(name_), - sourceCheckInterval(2000), wasDisabled(true), dataThread(0), - inputBuffer(0), ttlState(0) + : GenericProcessor(name_), + sourceCheckInterval(2000), wasDisabled(true), dataThread(0), + inputBuffer(0), ttlState(0) { - std::cout << "creating source node." << std::endl; - - if (getName().equalsIgnoreCase("Intan Demo Board")) { - dataThread = new IntanThread(this); - } else if (getName().equalsIgnoreCase("Custom FPGA")) { - dataThread = new FPGAThread(this);//FPGAThread(this); - } else if (getName().equalsIgnoreCase("File Reader")) { - dataThread = new FileReaderThread(this); - } else if (getName().equalsIgnoreCase("RHD2000 USB Board")) { - dataThread = new RHD2000Thread(this); - } - - if (dataThread != 0) - { - if (!dataThread->foundInputSource()) - { - enabledState(false); - } - - numEventChannels = dataThread->getNumEventChannels(); - eventChannelState = new int[numEventChannels]; - for (int i = 0; i < numEventChannels; i++) - { - eventChannelState[i] = 0; - } - - } else { - enabledState(false); - eventChannelState = 0; - numEventChannels = 0; - } - - // check for input source every few seconds - startTimer(sourceCheckInterval); - - timestamp = 0; - eventCodeBuffer = new int16[10000]; //10000 samples per buffer max? + std::cout << "creating source node." << std::endl; + + if (getName().equalsIgnoreCase("Intan Demo Board")) + { + dataThread = new IntanThread(this); + } + else if (getName().equalsIgnoreCase("Custom FPGA")) + { + dataThread = new FPGAThread(this);//FPGAThread(this); + } + else if (getName().equalsIgnoreCase("File Reader")) + { + dataThread = new FileReaderThread(this); + } + else if (getName().equalsIgnoreCase("RHD2000 USB Board")) + { + dataThread = new RHD2000Thread(this); + } + + if (dataThread != 0) + { + if (!dataThread->foundInputSource()) + { + enabledState(false); + } + + numEventChannels = dataThread->getNumEventChannels(); + eventChannelState = new int[numEventChannels]; + for (int i = 0; i < numEventChannels; i++) + { + eventChannelState[i] = 0; + } + + } + else + { + enabledState(false); + eventChannelState = 0; + numEventChannels = 0; + } + + // check for input source every few seconds + startTimer(sourceCheckInterval); + + timestamp = 0; + eventCodeBuffer = new int16[10000]; //10000 samples per buffer max? } SourceNode::~SourceNode() { - if (eventChannelState) - delete[] eventChannelState; + if (eventChannelState) + delete[] eventChannelState; } DataThread* SourceNode::getThread() @@ -91,20 +101,20 @@ DataThread* SourceNode::getThread() void SourceNode::updateSettings() { - if (inputBuffer == 0 && dataThread != 0) - { + if (inputBuffer == 0 && dataThread != 0) + { - inputBuffer = dataThread->getBufferAddress(); - std::cout << "Input buffer address is " << inputBuffer << std::endl; - } + inputBuffer = dataThread->getBufferAddress(); + std::cout << "Input buffer address is " << inputBuffer << std::endl; + } - for (int i = 0; i < dataThread->getNumEventChannels(); i++) - { - Channel* ch = new Channel(this, i); - ch->eventType = TTL; - ch->isEventChannel = true; - eventChannels.add(ch); - } + for (int i = 0; i < dataThread->getNumEventChannels(); i++) + { + Channel* ch = new Channel(this, i); + ch->eventType = TTL; + ch->isEventChannel = true; + eventChannels.add(ch); + } } @@ -115,13 +125,14 @@ void SourceNode::actionListenerCallback(const String& msg) if (msg.equalsIgnoreCase("HI")) { - // std::cout << "HI." << std::endl; - // dataThread->setOutputHigh(); + // std::cout << "HI." << std::endl; + // dataThread->setOutputHigh(); ttlState = 1; - } else if (msg.equalsIgnoreCase("LO")) + } + else if (msg.equalsIgnoreCase("LO")) { - // std::cout << "LO." << std::endl; - // dataThread->setOutputLow(); + // std::cout << "LO." << std::endl; + // dataThread->setOutputLow(); ttlState = 0; } } @@ -134,209 +145,232 @@ int SourceNode::getTTLState() float SourceNode::getSampleRate() { - if (dataThread != 0) - return dataThread->getSampleRate(); - else - return 44100.0; + if (dataThread != 0) + return dataThread->getSampleRate(); + else + return 44100.0; } float SourceNode::getDefaultSampleRate() { - if (dataThread != 0) - return dataThread->getSampleRate(); - else - return 44100.0; + if (dataThread != 0) + return dataThread->getSampleRate(); + else + return 44100.0; } int SourceNode::getDefaultNumOutputs() { - if (dataThread != 0) - return dataThread->getNumChannels(); - else - return 0; + if (dataThread != 0) + return dataThread->getNumChannels(); + else + return 0; } float SourceNode::getDefaultBitVolts() { - if (dataThread != 0) - return dataThread->getBitVolts(); - else - return 1.0f; + if (dataThread != 0) + return dataThread->getBitVolts(); + else + return 1.0f; } void SourceNode::enabledState(bool t) { - if (t && !dataThread->foundInputSource()) - { - isEnabled = false; - } else { - isEnabled = t; - } + if (t && !dataThread->foundInputSource()) + { + isEnabled = false; + } + else + { + isEnabled = t; + } } -void SourceNode::setParameter (int parameterIndex, float newValue) +void SourceNode::setParameter(int parameterIndex, float newValue) { - //std::cout << "Got parameter change notification"; + //std::cout << "Got parameter change notification"; } AudioProcessorEditor* SourceNode::createEditor() { - editor = new SourceNodeEditor(this, true); - return editor; + + if (getName().equalsIgnoreCase("RHD2000 USB Board")) + { + editor = new RHD2000Editor(this, true); + } + else + { + editor = new SourceNodeEditor(this, true); + } + return editor; } bool SourceNode::tryEnablingEditor() { - if (!isReady()) { - std::cout << "No input source found." << std::endl; - return false; - } else if (isEnabled) { - // If we're already enabled (e.g. if we're being called again - // due to timerCallback()), then there's no need to go through - // the editor again. - return true; - } - - std::cout << "Input source found." << std::endl; - enabledState(true); - GenericEditor* ed = getEditor(); - getEditorViewport()->makeEditorVisible(ed); - return true; + if (!isReady()) + { + std::cout << "No input source found." << std::endl; + return false; + } + else if (isEnabled) + { + // If we're already enabled (e.g. if we're being called again + // due to timerCallback()), then there's no need to go through + // the editor again. + return true; + } + + std::cout << "Input source found." << std::endl; + enabledState(true); + GenericEditor* ed = getEditor(); + getEditorViewport()->makeEditorVisible(ed); + return true; } void SourceNode::timerCallback() { - if (!tryEnablingEditor() && isEnabled) { - std::cout << "Input source lost." << std::endl; - enabledState(false); - GenericEditor* ed = getEditor(); - getEditorViewport()->makeEditorVisible(ed); - } + if (!tryEnablingEditor() && isEnabled) + { + std::cout << "Input source lost." << std::endl; + enabledState(false); + GenericEditor* ed = getEditor(); + getEditorViewport()->makeEditorVisible(ed); + } } -bool SourceNode::isReady() { - return dataThread && dataThread->foundInputSource(); +bool SourceNode::isReady() +{ + return dataThread && dataThread->foundInputSource(); } -bool SourceNode::enable() { +bool SourceNode::enable() +{ - std::cout << "Source node received enable signal" << std::endl; + std::cout << "Source node received enable signal" << std::endl; - wasDisabled = false; + wasDisabled = false; - if (dataThread != 0) - { - dataThread->startAcquisition(); - return true; - } else { - return false; - } + if (dataThread != 0) + { + dataThread->startAcquisition(); + return true; + } + else + { + return false; + } - stopTimer(); + stopTimer(); } -bool SourceNode::disable() { +bool SourceNode::disable() +{ - std::cout << "Source node received disable signal" << std::endl; + std::cout << "Source node received disable signal" << std::endl; - if (dataThread != 0) - dataThread->stopAcquisition(); + if (dataThread != 0) + dataThread->stopAcquisition(); - startTimer(2000); + startTimer(2000); - wasDisabled = true; + wasDisabled = true; - std::cout << "SourceNode returning true." << std::endl; + std::cout << "SourceNode returning true." << std::endl; - return true; + return true; } void SourceNode::acquisitionStopped() { - //if (!dataThread->foundInputSource()) { - - if (!wasDisabled) { - std::cout << "Source node sending signal to UI." << std::endl; - getUIComponent()->disableCallbacks(); - enabledState(false); - GenericEditor* ed = (GenericEditor*) getEditor(); - getEditorViewport()->makeEditorVisible(ed); - } - //} + //if (!dataThread->foundInputSource()) { + + if (!wasDisabled) + { + std::cout << "Source node sending signal to UI." << std::endl; + getUIComponent()->disableCallbacks(); + enabledState(false); + GenericEditor* ed = (GenericEditor*) getEditor(); + getEditorViewport()->makeEditorVisible(ed); + } + //} } -void SourceNode::process(AudioSampleBuffer &buffer, - MidiBuffer &events, - int& nSamples) +void SourceNode::process(AudioSampleBuffer& buffer, + MidiBuffer& events, + int& nSamples) { - //std::cout << "SOURCE NODE" << std::endl; + //std::cout << "SOURCE NODE" << std::endl; - // clear the input buffers - events.clear(); - buffer.clear(); + // clear the input buffers + events.clear(); + buffer.clear(); - nSamples = inputBuffer->readAllFromBuffer(buffer, ×tamp, eventCodeBuffer, buffer.getNumSamples()); + nSamples = inputBuffer->readAllFromBuffer(buffer, ×tamp, eventCodeBuffer, buffer.getNumSamples()); - //std::cout << "TIMESTAMP: " << timestamp << std::endl; + //std::cout << "TIMESTAMP: " << timestamp << std::endl; //std::cout << "Samples per buffer: " << nSamples << std::endl; - uint8 data[4]; - memcpy(data, ×tamp, 4); - - // generate timestamp - addEvent(events, // MidiBuffer - TIMESTAMP, // eventType - 0, // sampleNum - nodeId, // eventID - 0, // eventChannel - 4, // numBytes - data // data - ); - - // fill event buffer - for (int i = 0; i < nSamples; i++) - { - for (int c = 0; c < numEventChannels; c++) - { - int state = eventCodeBuffer[i] & (1 << c); - - if (eventChannelState[c] != state) - { - if (state == 0) { + uint8 data[4]; + memcpy(data, ×tamp, 4); + + // generate timestamp + addEvent(events, // MidiBuffer + TIMESTAMP, // eventType + 0, // sampleNum + nodeId, // eventID + 0, // eventChannel + 4, // numBytes + data // data + ); + + // fill event buffer + for (int i = 0; i < nSamples; i++) + { + for (int c = 0; c < numEventChannels; c++) + { + int state = eventCodeBuffer[i] & (1 << c); + + if (eventChannelState[c] != state) + { + if (state == 0) + { //std::cout << "OFF" << std::endl; //std::cout << c << std::endl; - // signal channel state is OFF - addEvent(events, // MidiBuffer - TTL, // eventType - i, // sampleNum - 0, // eventID - c // eventChannel - ); - } else { - - // std::cout << "ON" << std::endl; - // std::cout << c << std::endl; - - // signal channel state is ON - addEvent(events, // MidiBuffer - TTL, // eventType - i, // sampleNum - 1, // eventID - c // eventChannel - ); - - - } - - eventChannelState[c] = state; - } - } - } + // signal channel state is OFF + addEvent(events, // MidiBuffer + TTL, // eventType + i, // sampleNum + 0, // eventID + c // eventChannel + ); + } + else + { + + // std::cout << "ON" << std::endl; + // std::cout << c << std::endl; + + // signal channel state is ON + addEvent(events, // MidiBuffer + TTL, // eventType + i, // sampleNum + 1, // eventID + c // eventChannel + ); + + + } + + eventChannelState[c] = state; + } + } + } } diff --git a/Source/Processors/SourceNode.h b/Source/Processors/SourceNode.h index 504cab9f0242963ed145928eb6875b9917152989..f8c0a190d41667803727dbd8e5a47aea209e9f2f 100755 --- a/Source/Processors/SourceNode.h +++ b/Source/Processors/SourceNode.h @@ -24,9 +24,6 @@ #ifndef __SOURCENODE_H_DCE798F1__ #define __SOURCENODE_H_DCE798F1__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include <ftdi.h> #include <stdio.h> @@ -43,38 +40,44 @@ */ class SourceNode : public GenericProcessor, - public Timer, - public ActionListener + public Timer, + public ActionListener { public: - // real member functions: - SourceNode(const String& name); - ~SourceNode(); + // real member functions: + SourceNode(const String& name); + ~SourceNode(); - void enabledState(bool t); + void enabledState(bool t); - void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); - void setParameter (int parameterIndex, float newValue); + void setParameter(int parameterIndex, float newValue); - float getSampleRate(); - float getDefaultSampleRate(); - int getDefaultNumOutputs(); - float getDefaultBitVolts(); + float getSampleRate(); + float getDefaultSampleRate(); + int getDefaultNumOutputs(); + float getDefaultBitVolts(); - AudioProcessorEditor* createEditor(); - bool hasEditor() const {return true;} + AudioProcessorEditor* createEditor(); + bool hasEditor() const + { + return true; + } - bool enable(); - bool disable(); + bool enable(); + bool disable(); - bool isReady(); + bool isReady(); - bool isSource() {return true;} + bool isSource() + { + return true; + } - void acquisitionStopped(); + void acquisitionStopped(); DataThread* getThread(); @@ -84,28 +87,28 @@ public: private: - int numEventChannels; + int numEventChannels; - int sourceCheckInterval; + int sourceCheckInterval; - bool wasDisabled; + bool wasDisabled; - void timerCallback(); + void timerCallback(); - ScopedPointer<DataThread> dataThread; - DataBuffer* inputBuffer; + ScopedPointer<DataThread> dataThread; + DataBuffer* inputBuffer; - uint64 timestamp; - int16* eventCodeBuffer; - int* eventChannelState; + uint64 timestamp; + int16* eventCodeBuffer; + int* eventChannelState; int ttlState; - void updateSettings(); - bool tryEnablingEditor(); + void updateSettings(); + bool tryEnablingEditor(); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SourceNode); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SourceNode); }; diff --git a/Source/Processors/SpikeDetector.cpp b/Source/Processors/SpikeDetector.cpp index 53fd6e2d3d1ece308badde7ed95daf65a0e3bccf..c7813bebf97e46743e2f2e6eb28d0724f02c46ee 100755 --- a/Source/Processors/SpikeDetector.cpp +++ b/Source/Processors/SpikeDetector.cpp @@ -29,7 +29,7 @@ SpikeDetector::SpikeDetector() : GenericProcessor("Spike Detector"), overflowBuffer(2,100), dataBuffer(overflowBuffer), - overflowBufferSize(100), currentElectrode(-1) + overflowBufferSize(100), currentElectrode(-1) { //// the standard form: electrodeTypes.add("single electrode"); @@ -75,8 +75,8 @@ SpikeDetector::~SpikeDetector() AudioProcessorEditor* SpikeDetector::createEditor() { - editor = new SpikeDetectorEditor(this, true); - return editor; + editor = new SpikeDetectorEditor(this, true); + return editor; } void SpikeDetector::updateSettings() @@ -88,12 +88,12 @@ void SpikeDetector::updateSettings() for (int i = 0; i < electrodes.size(); i++) { - Channel* ch = new Channel(this, i); - ch->isEventChannel = true; - ch->eventType = electrodes[i]->numChannels; - ch->name = electrodes[i]->name; + Channel* ch = new Channel(this, i); + ch->isEventChannel = true; + ch->eventType = electrodes[i]->numChannels; + ch->name = electrodes[i]->name; - eventChannels.add(ch); + eventChannels.add(ch); } } @@ -105,7 +105,9 @@ bool SpikeDetector::addElectrode(int nChans) if (electrodes.size() == 0) { firstChan = 0; - } else { + } + else + { Electrode* e = electrodes.getLast(); firstChan = *(e->channels+(e->numChannels-1))+1; } @@ -180,10 +182,10 @@ void SpikeDetector::resetElectrode(Electrode* e) e->lastBufferIndex = 0; } -bool SpikeDetector::removeElectrode(int index) +bool SpikeDetector::removeElectrode(int index) { - // std::cout << "Spike detector removing electrode" << std::endl; + // std::cout << "Spike detector removing electrode" << std::endl; if (index > electrodes.size() || index < 0) return false; @@ -197,7 +199,7 @@ void SpikeDetector::setElectrodeName(int index, String newName) electrodes[index-1]->name = newName; } -void SpikeDetector::setChannel(int electrodeIndex, int channelNum, int newChannel) +void SpikeDetector::setChannel(int electrodeIndex, int channelNum, int newChannel) { *(electrodes[electrodeIndex]->channels+channelNum) = newChannel; } @@ -224,7 +226,7 @@ double SpikeDetector::getChannelThreshold(int electrodeNum, int channelNum) return *(electrodes[electrodeNum]->thresholds+channelNum); } -void SpikeDetector::setParameter (int parameterIndex, float newValue) +void SpikeDetector::setParameter(int parameterIndex, float newValue) { if (parameterIndex == 99 && currentElectrode > -1) { @@ -240,8 +242,8 @@ bool SpikeDetector::enable() return true; } -bool SpikeDetector::disable() -{ +bool SpikeDetector::disable() +{ for (int n = 0; n < electrodes.size(); n++) { @@ -291,7 +293,7 @@ bool SpikeDetector::disable() void SpikeDetector::addSpikeEvent(SpikeObject* s, MidiBuffer& eventBuffer, int peakIndex) { - // std::cout << "Adding spike event for index " << peakIndex << std::endl; + // std::cout << "Adding spike event for index " << peakIndex << std::endl; int numBytes = packSpike(s, spikeBuffer, 256); @@ -300,23 +302,23 @@ void SpikeDetector::addSpikeEvent(SpikeObject* s, MidiBuffer& eventBuffer, int p } void SpikeDetector::addWaveformToSpikeObject(SpikeObject* s, - int& peakIndex, - int& electrodeNumber, - int& currentChannel) + int& peakIndex, + int& electrodeNumber, + int& currentChannel) { int spikeLength = electrodes[electrodeNumber]->prePeakSamples + - + electrodes[electrodeNumber]->postPeakSamples; + + electrodes[electrodeNumber]->postPeakSamples; //uint8 dataSize = spikeLength*2; - // uint8 data[dataSize]; - // uint8* dataptr = data; + // uint8 data[dataSize]; + // uint8* dataptr = data; s->nSamples = spikeLength; int chan = *(electrodes[electrodeNumber]->channels+currentChannel); - s->gain[currentChannel] = (int) (1.0f / channels[chan]->bitVolts)*1000; + s->gain[currentChannel] = (int)(1.0f / channels[chan]->bitVolts)*1000; s->threshold[currentChannel] = (int) *(electrodes[electrodeNumber]->thresholds+currentChannel) / channels[chan]->bitVolts * 1000; // cycle through buffer @@ -339,8 +341,8 @@ void SpikeDetector::addWaveformToSpikeObject(SpikeObject* s, } -void SpikeDetector::process(AudioSampleBuffer &buffer, - MidiBuffer &events, +void SpikeDetector::process(AudioSampleBuffer& buffer, + MidiBuffer& events, int& nSamples) { @@ -353,13 +355,13 @@ void SpikeDetector::process(AudioSampleBuffer &buffer, for (int i = 0; i < electrodes.size(); i++) { - // std::cout << "ELECTRODE " << i << std::endl; + // std::cout << "ELECTRODE " << i << std::endl; electrode = electrodes[i]; // refresh buffer index for this electrode sampleIndex = electrode->lastBufferIndex - 1; // subtract 1 to account for - // increment at start of getNextSample() + // increment at start of getNextSample() // cycle through samples while (samplesAvailable(nSamples)) @@ -372,7 +374,7 @@ void SpikeDetector::process(AudioSampleBuffer &buffer, for (int chan = 0; chan < electrode->numChannels; chan++) { - // std::cout << " channel " << chan << std::endl; + // std::cout << " channel " << chan << std::endl; if (*(electrode->isActive+chan)) { @@ -388,7 +390,7 @@ void SpikeDetector::process(AudioSampleBuffer &buffer, while (getCurrentSample(currentChannel) < getNextSample(currentChannel) && - sampleIndex < peakIndex + electrode->postPeakSamples) + sampleIndex < peakIndex + electrode->postPeakSamples) { sampleIndex++; } @@ -407,9 +409,9 @@ void SpikeDetector::process(AudioSampleBuffer &buffer, for (int channel = 0; channel < electrode->numChannels; channel++) { - addWaveformToSpikeObject(&newSpike, - peakIndex, - i, + addWaveformToSpikeObject(&newSpike, + peakIndex, + i, channel); // if (*(electrode->isActive+currentChannel)) @@ -431,11 +433,11 @@ void SpikeDetector::process(AudioSampleBuffer &buffer, sampleIndex = peakIndex + electrode->postPeakSamples; break; // quit spike "for" loop - } // end spike trigger + } // end spike trigger - } // end if channel is active + } // end if channel is active } // end cycle through channels on electrode - + } // end cycle through samples electrode->lastBufferIndex = sampleIndex - nSamples; // should be negative @@ -447,12 +449,12 @@ void SpikeDetector::process(AudioSampleBuffer &buffer, // copy end of this buffer into the overflow buffer //std::cout << "Copying buffer" << std::endl; - // std::cout << "nSamples: " << nSamples; + // std::cout << "nSamples: " << nSamples; //std::cout << "overflowBufferSize:" << overflowBufferSize; //std::cout << "sourceStartSample = " << nSamples-overflowBufferSize << std::endl; - // std::cout << "numSamples = " << overflowBufferSize << std::endl; - // std::cout << "buffer size = " << buffer.getNumSamples() << std::endl; + // std::cout << "numSamples = " << overflowBufferSize << std::endl; + // std::cout << "buffer size = " << buffer.getNumSamples() << std::endl; if (nSamples > overflowBufferSize) { @@ -460,52 +462,56 @@ void SpikeDetector::process(AudioSampleBuffer &buffer, for (int i = 0; i < overflowBuffer.getNumChannels(); i++) { - overflowBuffer.copyFrom(i, 0, - buffer, i, - nSamples-overflowBufferSize, + overflowBuffer.copyFrom(i, 0, + buffer, i, + nSamples-overflowBufferSize, overflowBufferSize); useOverflowBuffer = true; } - } else { + } + else + { useOverflowBuffer = false; } - - + + } float SpikeDetector::getNextSample(int& chan) { - + //if (useOverflowBuffer) //{ - if (sampleIndex < 0) - { - // std::cout << " sample index " << sampleIndex << "from overflowBuffer" << std::endl; - int ind = overflowBufferSize + sampleIndex; - - if (ind < overflowBuffer.getNumSamples()) - return *overflowBuffer.getSampleData(chan, ind); - else - return 0; - - } else { - // useOverflowBuffer = false; - // std::cout << " sample index " << sampleIndex << "from regular buffer" << std::endl; - - if (sampleIndex < dataBuffer.getNumSamples()) - return *dataBuffer.getSampleData(chan, sampleIndex); - else - return 0; - } + if (sampleIndex < 0) + { + // std::cout << " sample index " << sampleIndex << "from overflowBuffer" << std::endl; + int ind = overflowBufferSize + sampleIndex; + + if (ind < overflowBuffer.getNumSamples()) + return *overflowBuffer.getSampleData(chan, ind); + else + return 0; + + } + else + { + // useOverflowBuffer = false; + // std::cout << " sample index " << sampleIndex << "from regular buffer" << std::endl; + + if (sampleIndex < dataBuffer.getNumSamples()) + return *dataBuffer.getSampleData(chan, sampleIndex); + else + return 0; + } //} else { // std::cout << " sample index " << sampleIndex << "from regular buffer" << std::endl; - // return *dataBuffer.getSampleData(chan, sampleIndex); + // return *dataBuffer.getSampleData(chan, sampleIndex); //} } @@ -521,14 +527,16 @@ float SpikeDetector::getCurrentSample(int& chan) // } if (sampleIndex < 1) - { - //std::cout << " sample index " << sampleIndex << "from overflowBuffer" << std::endl; - return *overflowBuffer.getSampleData(chan, overflowBufferSize + sampleIndex - 1); - } else { - // useOverflowBuffer = false; - // std::cout << " sample index " << sampleIndex << "from regular buffer" << std::endl; - return *dataBuffer.getSampleData(chan, sampleIndex - 1); - } + { + //std::cout << " sample index " << sampleIndex << "from overflowBuffer" << std::endl; + return *overflowBuffer.getSampleData(chan, overflowBufferSize + sampleIndex - 1); + } + else + { + // useOverflowBuffer = false; + // std::cout << " sample index " << sampleIndex << "from regular buffer" << std::endl; + return *dataBuffer.getSampleData(chan, sampleIndex - 1); + } //} else { } @@ -540,7 +548,9 @@ bool SpikeDetector::samplesAvailable(int& nSamples) if (sampleIndex > nSamples - overflowBufferSize/2) { return false; - } else { + } + else + { return true; } diff --git a/Source/Processors/SpikeDetector.h b/Source/Processors/SpikeDetector.h index 5818a4df5567781ce163c5c067ad2ec68a1381bc..029ad99a51b959e0163af8a6d9c7c9d890d22955 100755 --- a/Source/Processors/SpikeDetector.h +++ b/Source/Processors/SpikeDetector.h @@ -24,9 +24,6 @@ #ifndef __SPIKEDETECTOR_H_3F920F95__ #define __SPIKEDETECTOR_H_3F920F95__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "GenericProcessor.h" @@ -48,136 +45,137 @@ class SpikeDetector : public GenericProcessor { public: - - // CONSTRUCTOR AND DESTRUCTOR // - /** constructor */ - SpikeDetector(); + // CONSTRUCTOR AND DESTRUCTOR // - /** destructor */ - ~SpikeDetector(); + /** constructor */ + SpikeDetector(); - - // PROCESSOR METHODS // + /** destructor */ + ~SpikeDetector(); - /** Processes an incoming continuous buffer and places new - spikes into the event buffer. */ - void process(AudioSampleBuffer &buffer, MidiBuffer &events, int& nSamples); - - /** Used to alter parameters of data acquisition. */ - void setParameter (int parameterIndex, float newValue); - /** Called whenever the signal chain is altered. */ - void updateSettings(); + // PROCESSOR METHODS // - /** Called prior to start of acquisition. */ - bool enable(); + /** Processes an incoming continuous buffer and places new + spikes into the event buffer. */ + void process(AudioSampleBuffer& buffer, MidiBuffer& events, int& nSamples); - /** Called after acquisition is finished. */ - bool disable(); + /** Used to alter parameters of data acquisition. */ + void setParameter(int parameterIndex, float newValue); - /** Creates the SpikeDetectorEditor. */ - AudioProcessorEditor* createEditor(); + /** Called whenever the signal chain is altered. */ + void updateSettings(); + /** Called prior to start of acquisition. */ + bool enable(); - // INTERNAL BUFFERS // + /** Called after acquisition is finished. */ + bool disable(); - /** Extra samples are placed in this buffer to allow seamless - transitions between callbacks. */ - AudioSampleBuffer overflowBuffer; + /** Creates the SpikeDetectorEditor. */ + AudioProcessorEditor* createEditor(); - // CREATE AND DELETE ELECTRODES // + // INTERNAL BUFFERS // - /** Adds an electrode with n channels to be processed. */ - bool addElectrode(int nChans); + /** Extra samples are placed in this buffer to allow seamless + transitions between callbacks. */ + AudioSampleBuffer overflowBuffer; - /** Removes an electrode with a given index. */ - bool removeElectrode(int index); + // CREATE AND DELETE ELECTRODES // - // EDIT AND QUERY ELECTRODE SETTINGS // + /** Adds an electrode with n channels to be processed. */ + bool addElectrode(int nChans); - /** Returns the number of channels for a given electrode. */ - int getNumChannels(int index); + /** Removes an electrode with a given index. */ + bool removeElectrode(int index); - /** Edits the mapping between input channels and electrode channels. */ - void setChannel(int electrodeIndex, int channelNum, int newChannel); - /** Returns the continuous channel that maps to a given - electrode channel. */ - int getChannel(int index, int chan); + // EDIT AND QUERY ELECTRODE SETTINGS // - /** Sets the name of a given electrode. */ - void setElectrodeName(int index, String newName); + /** Returns the number of channels for a given electrode. */ + int getNumChannels(int index); + /** Edits the mapping between input channels and electrode channels. */ + void setChannel(int electrodeIndex, int channelNum, int newChannel); - // RETURN STRING ARRAYS // + /** Returns the continuous channel that maps to a given + electrode channel. */ + int getChannel(int index, int chan); - /** Returns a StringArray containing the names of all electrodes */ - StringArray getElectrodeNames(); + /** Sets the name of a given electrode. */ + void setElectrodeName(int index, String newName); - /** Returns a list of possible electrode types (e.g., stereotrode, tetrode). */ - StringArray electrodeTypes; - void setChannelThreshold(int electrodeNum, int channelNum, float threshold); + // RETURN STRING ARRAYS // - double getChannelThreshold(int electrodeNum, int channelNum); + /** Returns a StringArray containing the names of all electrodes */ + StringArray getElectrodeNames(); + + /** Returns a list of possible electrode types (e.g., stereotrode, tetrode). */ + StringArray electrodeTypes; + + void setChannelThreshold(int electrodeNum, int channelNum, float threshold); + + double getChannelThreshold(int electrodeNum, int channelNum); private: - /** Reference to a continuous buffer. */ - AudioSampleBuffer& dataBuffer; + /** Reference to a continuous buffer. */ + AudioSampleBuffer& dataBuffer; - float getDefaultThreshold(); + float getDefaultThreshold(); - int overflowBufferSize; + int overflowBufferSize; - int sampleIndex; + int sampleIndex; - Array<int> electrodeCounter; + Array<int> electrodeCounter; - float getNextSample(int& chan); - float getCurrentSample(int& chan); - bool samplesAvailable(int& nSamples); + float getNextSample(int& chan); + float getCurrentSample(int& chan); + bool samplesAvailable(int& nSamples); - bool useOverflowBuffer; + bool useOverflowBuffer; - int currentElectrode; - int currentChannelIndex; - int currentIndex; + int currentElectrode; + int currentChannelIndex; + int currentIndex; - struct Electrode { + struct Electrode + { - String name; + String name; - int numChannels; - int prePeakSamples, postPeakSamples; - int lastBufferIndex; + int numChannels; + int prePeakSamples, postPeakSamples; + int lastBufferIndex; - int* channels; - double* thresholds; - bool* isActive; + int* channels; + double* thresholds; + bool* isActive; - }; + }; - uint8_t* spikeBuffer;///[256]; + uint8_t* spikeBuffer;///[256]; - Array<Electrode*> electrodes; + Array<Electrode*> electrodes; - // void createSpikeEvent(int& peakIndex, - // int& electrodeNumber, - // int& currentChannel, - // MidiBuffer& eventBuffer); + // void createSpikeEvent(int& peakIndex, + // int& electrodeNumber, + // int& currentChannel, + // MidiBuffer& eventBuffer); - void addSpikeEvent(SpikeObject* s, MidiBuffer& eventBuffer, int peakIndex); - void addWaveformToSpikeObject(SpikeObject* s, - int& peakIndex, - int& electrodeNumber, - int& currentChannel); + void addSpikeEvent(SpikeObject* s, MidiBuffer& eventBuffer, int peakIndex); + void addWaveformToSpikeObject(SpikeObject* s, + int& peakIndex, + int& electrodeNumber, + int& currentChannel); - void resetElectrode(Electrode*); + void resetElectrode(Electrode*); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SpikeDetector); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SpikeDetector); }; diff --git a/Source/Processors/SpikeDisplayNode.cpp b/Source/Processors/SpikeDisplayNode.cpp index 685eec36b2f000f53741c0928918a20e2d01c674..008bb1c21b9c01b45b1a95979af30ce06bcf7a73 100755 --- a/Source/Processors/SpikeDisplayNode.cpp +++ b/Source/Processors/SpikeDisplayNode.cpp @@ -27,26 +27,26 @@ #include "Channel.h" SpikeDisplayNode::SpikeDisplayNode() - : GenericProcessor("Spike Viewer"), - bufferSize(0) + : GenericProcessor("Spike Viewer"), + bufferSize(0) { -// displayBuffer = new AudioSampleBuffer(8, 100); - eventBuffer = new MidiBuffer(); + // displayBuffer = new AudioSampleBuffer(8, 100); + eventBuffer = new MidiBuffer(); } SpikeDisplayNode::~SpikeDisplayNode() { - //deleteAndZero(displayBuffer); - //deleteAndZero(eventBuffer); + //deleteAndZero(displayBuffer); + //deleteAndZero(eventBuffer); } AudioProcessorEditor* SpikeDisplayNode::createEditor() { - std::cout<<"Creating SpikeDisplayCanvas."<<std::endl; + std::cout<<"Creating SpikeDisplayCanvas."<<std::endl; - editor = new SpikeDisplayEditor(this); - return editor; + editor = new SpikeDisplayEditor(this); + return editor; } @@ -63,100 +63,101 @@ AudioProcessorEditor* SpikeDisplayNode::createEditor() bool SpikeDisplayNode::enable() { - std::cout<<"SpikeDisplayNode::enable()"<<std::endl; - SpikeDisplayEditor* editor = (SpikeDisplayEditor*) getEditor(); - editor->enable(); - return true; - + std::cout<<"SpikeDisplayNode::enable()"<<std::endl; + SpikeDisplayEditor* editor = (SpikeDisplayEditor*) getEditor(); + editor->enable(); + return true; + } bool SpikeDisplayNode::disable() { - std::cout<<"SpikeDisplayNode disabled!"<<std::endl; - SpikeDisplayEditor* editor = (SpikeDisplayEditor*) getEditor(); - editor->disable(); - return true; + std::cout<<"SpikeDisplayNode disabled!"<<std::endl; + SpikeDisplayEditor* editor = (SpikeDisplayEditor*) getEditor(); + editor->disable(); + return true; } int SpikeDisplayNode::getNumberOfChannelsForElectrode(int elec) { - std::cout<<"SpikeDisplayNode::getNumberOfChannelsForInput(" << elec << ")"<<std::endl; - - int electrodeIndex = -1; - - for (int i = 0; i < eventChannels.size(); i++) - { - if (eventChannels[i]->eventType < 999) - { - electrodeIndex++; - - if (electrodeIndex == elec) - { - std::cout << "Electrode " << elec << " has " << eventChannels[i]->eventType << " channels" << std::endl; - return eventChannels[i]->eventType; - } - } - } - - return 0; + std::cout<<"SpikeDisplayNode::getNumberOfChannelsForInput(" << elec << ")"<<std::endl; + + int electrodeIndex = -1; + + for (int i = 0; i < eventChannels.size(); i++) + { + if (eventChannels[i]->eventType < 999) + { + electrodeIndex++; + + if (electrodeIndex == elec) + { + std::cout << "Electrode " << elec << " has " << eventChannels[i]->eventType << " channels" << std::endl; + return eventChannels[i]->eventType; + } + } + } + + return 0; } int SpikeDisplayNode::getNumElectrodes() { - int nElectrodes = 0; + int nElectrodes = 0; - for (int i = 0; i < eventChannels.size(); i++) - { - if (eventChannels[i]->eventType < 999) - { - nElectrodes++; - } - } + for (int i = 0; i < eventChannels.size(); i++) + { + if (eventChannels[i]->eventType < 999) + { + nElectrodes++; + } + } - return nElectrodes; + return nElectrodes; } -void SpikeDisplayNode::setParameter (int param, float val) +void SpikeDisplayNode::setParameter(int param, float val) { - std::cout<<"Got Param:"<< param<< " with value:"<<val<<std::endl; + std::cout<<"Got Param:"<< param<< " with value:"<<val<<std::endl; } -void SpikeDisplayNode::process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples) +void SpikeDisplayNode::process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples) { - - checkForEvents(midiMessages); // automatically calls 'handleEvent + + checkForEvents(midiMessages); // automatically calls 'handleEvent } void SpikeDisplayNode::handleEvent(int eventType, MidiMessage& event, int samplePosition) { - //std::cout << "Received event of type " << eventType << std::endl; + //std::cout << "Received event of type " << eventType << std::endl; - if (eventType == SPIKE) - { - eventBuffer->addEvent(event, 0); - } + if (eventType == SPIKE) + { + eventBuffer->addEvent(event, 0); + } } -bool SpikeDisplayNode::getNextSpike(SpikeObject *spike){ - std::cout<<"SpikeDisplayNode::getNextSpike()"<<std::endl; - /* - if (bufferSize<1 || spikebuffer.empty()) - return false; - else{ - SpikeObject s = spikebuffer.front(); - spikebuffer.pop(); - bufferSize--; - *spike = s; - return true; - } - */ - return false; +bool SpikeDisplayNode::getNextSpike(SpikeObject* spike) +{ + std::cout<<"SpikeDisplayNode::getNextSpike()"<<std::endl; + /* + if (bufferSize<1 || spikebuffer.empty()) + return false; + else{ + SpikeObject s = spikebuffer.front(); + spikebuffer.pop(); + bufferSize--; + *spike = s; + return true; + } + */ + return false; } \ No newline at end of file diff --git a/Source/Processors/SpikeDisplayNode.h b/Source/Processors/SpikeDisplayNode.h index 635f164a76e3d3b79fe4c3693960dcfa5c8a3b78..c6343cba1b3b802a0a541577a2cfc62348c1c859 100755 --- a/Source/Processors/SpikeDisplayNode.h +++ b/Source/Processors/SpikeDisplayNode.h @@ -24,9 +24,6 @@ #ifndef SPIKEDISPLAYNODE_H_ #define SPIKEDISPLAYNODE_H_ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "Editors/SpikeDisplayEditor.h" #include "Editors/VisualizerEditor.h" @@ -35,14 +32,14 @@ #define SPIKE_CMD_CLEAR_ALL 10000 #define SPIKE_CMD_CLEAR_SEL 10001 -#define SPIKE_CMD_PAN_AXES 10002 +#define SPIKE_CMD_PAN_AXES 10002 #define SPIKE_CMD_ZOOM_AXES 10003 class DataViewport; /** - - Takes in MidiEvents and extracts SpikeObjects from the MidiEvent buffers. + + Takes in MidiEvents and extracts SpikeObjects from the MidiEvent buffers. Those Events are then held in a queue until they are pulled by the SpikeDisplayCanvas. @see GenericProcessor, SpikeDisplayEditor, SpikeDisplayCanvas @@ -53,43 +50,49 @@ class SpikeDisplayNode : public GenericProcessor { public: - SpikeDisplayNode(); - ~SpikeDisplayNode(); + SpikeDisplayNode(); + ~SpikeDisplayNode(); + + AudioProcessorEditor* createEditor(); - AudioProcessorEditor* createEditor(); + bool isSink() + { + return true; + } - bool isSink() {return true;} + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); - void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); + void setParameter(int, float); - void setParameter(int, float); + void handleEvent(int, MidiMessage&, int); - void handleEvent(int, MidiMessage&, int); + //void updateSettings(); - //void updateSettings(); + bool enable(); + bool disable(); - bool enable(); - bool disable(); + MidiBuffer* getSpikeBufferAddress() + { + return eventBuffer; + } - MidiBuffer* getSpikeBufferAddress() {return eventBuffer;} + int getNumberOfChannelsForElectrode(int i); + int getNumElectrodes(); - int getNumberOfChannelsForElectrode(int i); - int getNumElectrodes(); + bool getNextSpike(SpikeObject* spike); - bool getNextSpike(SpikeObject *spike); - private: - int numberOfSources; + int numberOfSources; - ScopedPointer<MidiBuffer> eventBuffer; + ScopedPointer<MidiBuffer> eventBuffer; - //std::queue<SpikeObject> spikebuffer; + //std::queue<SpikeObject> spikebuffer; - int bufferSize; + int bufferSize; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SpikeDisplayNode); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SpikeDisplayNode); }; diff --git a/Source/Processors/Utilities/Merger.cpp b/Source/Processors/Utilities/Merger.cpp index 09982d9a70fbd2a09857713fa7808c66e7630461..e972bf473869f46ca522e9bef9041748f5fd9b4e 100755 --- a/Source/Processors/Utilities/Merger.cpp +++ b/Source/Processors/Utilities/Merger.cpp @@ -29,155 +29,165 @@ #include "../Channel.h" Merger::Merger() - : GenericProcessor("Merger"), - sourceNodeA(0), sourceNodeB(0), activePath(0)//, tabA(-1), tabB(-1) + : GenericProcessor("Merger"), + sourceNodeA(0), sourceNodeB(0), activePath(0)//, tabA(-1), tabB(-1) { - + } Merger::~Merger() { - + } AudioProcessorEditor* Merger::createEditor() { - editor = new MergerEditor(this, true); - //tEditor(editor); - - //std::cout << "Creating editor." << std::endl; - return editor; + editor = new MergerEditor(this, true); + //tEditor(editor); + + //std::cout << "Creating editor." << std::endl; + return editor; } void Merger::setMergerSourceNode(GenericProcessor* sn) { - sourceNode = sn; - - if (activePath == 0) { - std::cout << "Setting source node A." << std::endl; - sourceNodeA = sn; - } else { - sourceNodeB = sn; - std::cout << "Setting source node B." << std::endl; - } + sourceNode = sn; + + if (activePath == 0) + { + std::cout << "Setting source node A." << std::endl; + sourceNodeA = sn; + } + else + { + sourceNodeB = sn; + std::cout << "Setting source node B." << std::endl; + } } -void Merger::switchIO(int sourceNum) { +void Merger::switchIO(int sourceNum) +{ + + //std::cout << "Switching to source number " << sourceNum << std::endl; - //std::cout << "Switching to source number " << sourceNum << std::endl; - - activePath = sourceNum; + activePath = sourceNum; - if (sourceNum == 0) - { - sourceNode = sourceNodeA; - //std::cout << "Source node: " << getSourceNode() << std::endl; - } else - { - sourceNode = sourceNodeB; - //std::cout << "Source node: " << getSourceNode() << std::endl; - } + if (sourceNum == 0) + { + sourceNode = sourceNodeA; + //std::cout << "Source node: " << getSourceNode() << std::endl; + } + else + { + sourceNode = sourceNodeB; + //std::cout << "Source node: " << getSourceNode() << std::endl; + } - getEditorViewport()->makeEditorVisible((GenericEditor*) getEditor(), false); + getEditorViewport()->makeEditorVisible((GenericEditor*) getEditor(), false); } bool Merger::stillHasSource() { - if (sourceNodeA == 0 || sourceNodeB == 0) - { - return false; - } else { - return true; - } + if (sourceNodeA == 0 || sourceNodeB == 0) + { + return false; + } + else + { + return true; + } } void Merger::switchIO() { - std::cout << "Merger switching source." << std::endl; + std::cout << "Merger switching source." << std::endl; - if (activePath == 0) { - activePath = 1; - sourceNode = sourceNodeB; - } - else { - activePath = 0; - sourceNode = sourceNodeA; - } + if (activePath == 0) + { + activePath = 1; + sourceNode = sourceNodeB; + } + else + { + activePath = 0; + sourceNode = sourceNodeA; + } } void Merger::addSettingsFromSourceNode(GenericProcessor* sn) { - settings.numInputs += sn->getNumOutputs(); - //settings.inputChannelNames.addArray(sn->settings.inputChannelNames); - //settings.eventChannelIds.addArray(sn->settings.eventChannelIds); - //settings.eventChannelNames.addArray(sn->settings.eventChannelNames); - //settings.bitVolts.addArray(sn->settings.bitVolts); + settings.numInputs += sn->getNumOutputs(); + //settings.inputChannelNames.addArray(sn->settings.inputChannelNames); + //settings.eventChannelIds.addArray(sn->settings.eventChannelIds); + //settings.eventChannelNames.addArray(sn->settings.eventChannelNames); + //settings.bitVolts.addArray(sn->settings.bitVolts); - for (int i = 0; i < sn->channels.size(); i++) - { - Channel* sourceChan = sn->channels[i]; - Channel* ch = new Channel(*sourceChan); - channels.add(ch); - } + for (int i = 0; i < sn->channels.size(); i++) + { + Channel* sourceChan = sn->channels[i]; + Channel* ch = new Channel(*sourceChan); + channels.add(ch); + } - for (int i = 0; i < sn->eventChannels.size(); i++) - { - Channel* sourceChan = sn->eventChannels[i]; - Channel* ch = new Channel(*sourceChan); - eventChannels.add(ch); - } + for (int i = 0; i < sn->eventChannels.size(); i++) + { + Channel* sourceChan = sn->eventChannels[i]; + Channel* ch = new Channel(*sourceChan); + eventChannels.add(ch); + } - settings.originalSource = sn->settings.originalSource; - settings.sampleRate = sn->settings.sampleRate; + settings.originalSource = sn->settings.originalSource; + settings.sampleRate = sn->settings.sampleRate; - settings.numOutputs = settings.numInputs; - //settings.outputChannelNames = settings.inputChannelNames; + settings.numOutputs = settings.numInputs; + //settings.outputChannelNames = settings.inputChannelNames; } void Merger::updateSettings() { - // default is to get everything from sourceNodeA, - // but this might not be ideal - clearSettings(); + // default is to get everything from sourceNodeA, + // but this might not be ideal + clearSettings(); - if (sourceNodeA != 0) - { - std::cout << " Merger source A found." << std::endl; - addSettingsFromSourceNode(sourceNodeA); - } + if (sourceNodeA != 0) + { + std::cout << " Merger source A found." << std::endl; + addSettingsFromSourceNode(sourceNodeA); + } - if (sourceNodeB != 0) - { - std::cout << " Merger source B found." << std::endl; - addSettingsFromSourceNode(sourceNodeB); - } + if (sourceNodeB != 0) + { + std::cout << " Merger source B found." << std::endl; + addSettingsFromSourceNode(sourceNodeB); + } - if (sourceNodeA == 0 && sourceNodeB == 0) { + if (sourceNodeA == 0 && sourceNodeB == 0) + { - settings.sampleRate = getDefaultSampleRate(); - settings.numOutputs = getDefaultNumOutputs(); + settings.sampleRate = getDefaultSampleRate(); + settings.numOutputs = getDefaultNumOutputs(); - for (int i = 0; i < getNumOutputs(); i++) - { - Channel* ch = new Channel(this, i); - ch->sampleRate = getDefaultSampleRate(); - ch->bitVolts = getDefaultBitVolts(); + for (int i = 0; i < getNumOutputs(); i++) + { + Channel* ch = new Channel(this, i); + ch->sampleRate = getDefaultSampleRate(); + ch->bitVolts = getDefaultBitVolts(); - channels.add(ch); - } + channels.add(ch); + } - //generateDefaultChannelNames(settings.outputChannelNames); - } + //generateDefaultChannelNames(settings.outputChannelNames); + } - std::cout << "Number of merger outputs: " << getNumInputs() << std::endl; + std::cout << "Number of merger outputs: " << getNumInputs() << std::endl; } diff --git a/Source/Processors/Utilities/Merger.h b/Source/Processors/Utilities/Merger.h index 593d6851f02a29e5eacace6352e810ec3a786f29..069b2da50e79d9da174a76f87f29355c3cfcf02b 100755 --- a/Source/Processors/Utilities/Merger.h +++ b/Source/Processors/Utilities/Merger.h @@ -24,9 +24,6 @@ #ifndef __MERGER_H_ED548E77__ #define __MERGER_H_ED548E77__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "../GenericProcessor.h" @@ -49,34 +46,37 @@ class Merger : public GenericProcessor { public: - Merger(); - ~Merger(); + Merger(); + ~Merger(); - AudioProcessorEditor* createEditor(); + AudioProcessorEditor* createEditor(); /** Nothing happens here, because Mergers are not part of the ProcessorGraph. */ - void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples) {} + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples) {} - bool isMerger() {return true;} + bool isMerger() + { + return true; + } - void switchIO(int); - void switchIO(); - void setMergerSourceNode(GenericProcessor* sn); + void switchIO(int); + void switchIO(); + void setMergerSourceNode(GenericProcessor* sn); void updateSettings(); void addSettingsFromSourceNode(GenericProcessor* sn); - bool stillHasSource(); + bool stillHasSource(); private: - GenericProcessor* sourceNodeA; - GenericProcessor* sourceNodeB; + GenericProcessor* sourceNodeA; + GenericProcessor* sourceNodeB; - int activePath; + int activePath; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Merger); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Merger); - }; diff --git a/Source/Processors/Utilities/RecordControl.cpp b/Source/Processors/Utilities/RecordControl.cpp index 6ce00e0177b17a25bbb42c673d5bf6061c2c5954..528488a18868b40c1888e87ab12598e485bfac3d 100644 --- a/Source/Processors/Utilities/RecordControl.cpp +++ b/Source/Processors/Utilities/RecordControl.cpp @@ -27,9 +27,9 @@ #include "../../UI/ControlPanel.h" RecordControl::RecordControl() - : GenericProcessor("Record Controller"), triggerChannel(0) + : GenericProcessor("Record Controller"), triggerChannel(0) { - + } RecordControl::~RecordControl() @@ -39,49 +39,49 @@ RecordControl::~RecordControl() AudioProcessorEditor* RecordControl::createEditor() { - editor = new RecordControlEditor(this, true); - return editor; + editor = new RecordControlEditor(this, true); + return editor; } void RecordControl::updateTriggerChannel(int newChannel) { - triggerChannel = newChannel; + triggerChannel = newChannel; } -void RecordControl::process(AudioSampleBuffer &buffer, - MidiBuffer &events, - int& nSamples) +void RecordControl::process(AudioSampleBuffer& buffer, + MidiBuffer& events, + int& nSamples) { - checkForEvents(events); + checkForEvents(events); } void RecordControl::handleEvent(int eventType, MidiMessage& event, int) { - const uint8* dataptr = event.getRawData(); + const uint8* dataptr = event.getRawData(); int eventId = *(dataptr+2); int eventChannel = *(dataptr+3); //std::cout << "Received event with id=" << eventId << " and ch=" << eventChannel << std::endl; - if (eventType == TTL && eventChannel == triggerChannel) - { + if (eventType == TTL && eventChannel == triggerChannel) + { + + //std::cout << "Trigger!" << std::endl; - //std::cout << "Trigger!" << std::endl; + const MessageManagerLock mmLock; - const MessageManagerLock mmLock; + if (eventId == 1) + { + getControlPanel()->setRecordState(true); + } + else + { + getControlPanel()->setRecordState(false); + } - if (eventId == 1) - { - getControlPanel()->setRecordState(true); - } - else - { - getControlPanel()->setRecordState(false); - } - - } + } } \ No newline at end of file diff --git a/Source/Processors/Utilities/RecordControl.h b/Source/Processors/Utilities/RecordControl.h index 77a41592add39ee93a61e91a20d0499abea12c1d..55c9bf609ef60ee23017ffdd5c4ec523d446d49f 100644 --- a/Source/Processors/Utilities/RecordControl.h +++ b/Source/Processors/Utilities/RecordControl.h @@ -24,10 +24,6 @@ #ifndef __RECORDCONTROL_H_120DD434__ #define __RECORDCONTROL_H_120DD434__ -#ifdef _WIN32 -#include <Windows.h> -#endif - #include "../../../JuceLibraryCode/JuceHeader.h" #include "../GenericProcessor.h" #include "../Editors/RecordControlEditor.h" @@ -43,19 +39,19 @@ class RecordControl : public GenericProcessor { public: - RecordControl(); - ~RecordControl(); + RecordControl(); + ~RecordControl(); - void process (AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); - void updateTriggerChannel(int newChannel); - void handleEvent(int eventType, MidiMessage& event, int); + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); + void updateTriggerChannel(int newChannel); + void handleEvent(int eventType, MidiMessage& event, int); - AudioProcessorEditor* createEditor(); + AudioProcessorEditor* createEditor(); private: - int triggerChannel; + int triggerChannel; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RecordControl); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(RecordControl); }; diff --git a/Source/Processors/Utilities/Splitter.cpp b/Source/Processors/Utilities/Splitter.cpp index b6fb4c597b4edffafd53e7d9b10882940b56f32b..4756f2d3d3b321f05b949b5896b9783ab14796d5 100755 --- a/Source/Processors/Utilities/Splitter.cpp +++ b/Source/Processors/Utilities/Splitter.cpp @@ -27,92 +27,100 @@ #include "../../UI/EditorViewport.h" Splitter::Splitter() - : GenericProcessor("Splitter"), - destNodeA(0), destNodeB(0), activePath(0) + : GenericProcessor("Splitter"), + destNodeA(0), destNodeB(0), activePath(0) { } Splitter::~Splitter() { - + } AudioProcessorEditor* Splitter::createEditor() { - editor = new SplitterEditor(this, true); - //tEditor(editor); - - //std::cout << "Creating editor." << std::endl; - return editor; + editor = new SplitterEditor(this, true); + //tEditor(editor); + + //std::cout << "Creating editor." << std::endl; + return editor; } void Splitter::setPathToProcessor(GenericProcessor* p) { - if (destNodeA == p) - { - switchIO(0); - - } else if (destNodeB == p) - { - switchIO(1); - } + if (destNodeA == p) + { + switchIO(0); + + } + else if (destNodeB == p) + { + switchIO(1); + } } void Splitter::setSplitterDestNode(GenericProcessor* dn) { - destNode = dn; + destNode = dn; + + if (activePath == 0) + { + std::cout << "Setting destination node A." << std::endl; + destNodeA = dn; + } + else + { + destNodeB = dn; + std::cout << "Setting destination node B." << std::endl; + + } +} - if (activePath == 0) { - std::cout << "Setting destination node A." << std::endl; - destNodeA = dn; - } else { - destNodeB = dn; - std::cout << "Setting destination node B." << std::endl; +void Splitter::switchIO(int destNum) +{ - } -} + std::cout << "Switching to dest number " << destNum << std::endl; -void Splitter::switchIO(int destNum) { - - std::cout << "Switching to dest number " << destNum << std::endl; - - activePath = destNum; + activePath = destNum; - if (destNum == 0) - { - destNode = destNodeA; - std::cout << "Dest node: " << getDestNode() << std::endl; - } else - { - destNode = destNodeB; - std::cout << "Dest node: " << getDestNode() << std::endl; - } + if (destNum == 0) + { + destNode = destNodeA; + std::cout << "Dest node: " << getDestNode() << std::endl; + } + else + { + destNode = destNodeB; + std::cout << "Dest node: " << getDestNode() << std::endl; + } - getEditorViewport()->makeEditorVisible(getEditor(), false); + getEditorViewport()->makeEditorVisible(getEditor(), false); } void Splitter::switchIO() { - std::cout << "Splitter switching source." << std::endl; + std::cout << "Splitter switching source." << std::endl; - if (activePath == 0) { - activePath = 1; - destNode = destNodeB; - } - else { - activePath = 0; - destNode = destNodeA; - } + if (activePath == 0) + { + activePath = 1; + destNode = destNodeB; + } + else + { + activePath = 0; + destNode = destNodeA; + } } int Splitter::getPath() { - return activePath; + return activePath; } diff --git a/Source/Processors/Utilities/Splitter.h b/Source/Processors/Utilities/Splitter.h index 54dd0d9d90280c13a0be46f8eb1bf81debf01ec1..dcb9734e5aa5792f0ff3c2976435d9cd28203e66 100755 --- a/Source/Processors/Utilities/Splitter.h +++ b/Source/Processors/Utilities/Splitter.h @@ -24,9 +24,6 @@ #ifndef __SPLITTER_H_A75239F7__ #define __SPLITTER_H_A75239F7__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "../GenericProcessor.h" @@ -50,19 +47,22 @@ class Splitter : public GenericProcessor { public: - Splitter(); - ~Splitter(); + Splitter(); + ~Splitter(); - AudioProcessorEditor* createEditor(); + AudioProcessorEditor* createEditor(); /** Nothing happens here, because Splitters are not part of the ProcessorGraph. */ - void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples) {} + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples) {} - bool isSplitter() {return true;} + bool isSplitter() + { + return true; + } - void switchIO(int); + void switchIO(int); void switchIO(); - void setSplitterDestNode(GenericProcessor* dn); + void setSplitterDestNode(GenericProcessor* dn); void setPathToProcessor(GenericProcessor* processor); @@ -70,12 +70,12 @@ public: private: - GenericProcessor* destNodeA; - GenericProcessor* destNodeB; - int activePath; + GenericProcessor* destNodeA; + GenericProcessor* destNodeB; + int activePath; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Splitter); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Splitter); - }; diff --git a/Source/Processors/Visualization/DataWindow.cpp b/Source/Processors/Visualization/DataWindow.cpp index baf740363c95c30a18616776c0b34c03b3b4d659..3085fdb357f5c51fc4b11de9eedf38c8f93e38ce 100755 --- a/Source/Processors/Visualization/DataWindow.cpp +++ b/Source/Processors/Visualization/DataWindow.cpp @@ -25,16 +25,16 @@ DataWindow::DataWindow(Button* cButton, String name) - : DocumentWindow (name, - Colours::black, - DocumentWindow::allButtons), - controlButton(cButton) + : DocumentWindow(name, + Colours::black, + DocumentWindow::allButtons), + controlButton(cButton) { - centreWithSize(800,500); - setUsingNativeTitleBar(true); - setResizable(true,false); - //setTitleBarHeight(40); + centreWithSize(800,500); + setUsingNativeTitleBar(true); + setResizable(true,false); + //setTitleBarHeight(40); } DataWindow::~DataWindow() @@ -44,6 +44,6 @@ DataWindow::~DataWindow() void DataWindow::closeButtonPressed() { - setVisible(false); - controlButton->setToggleState(false,false); + setVisible(false); + controlButton->setToggleState(false,false); } \ No newline at end of file diff --git a/Source/Processors/Visualization/DataWindow.h b/Source/Processors/Visualization/DataWindow.h index e52e14191650ab9570675d57dc02012a5acc1c1c..7545bbee98ddb8b26a0a736e9cf74dd0a56ea09f 100755 --- a/Source/Processors/Visualization/DataWindow.h +++ b/Source/Processors/Visualization/DataWindow.h @@ -24,13 +24,10 @@ #ifndef __DATAWINDOW_H_FDDAB8D0__ #define __DATAWINDOW_H_FDDAB8D0__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" /** - + Allows OpenGL visualizers to be placed in their own window. @see DataViewport, OpenGLCanvas @@ -40,15 +37,15 @@ class DataWindow : public DocumentWindow { public: - DataWindow(Button* button, String name); - ~DataWindow(); + DataWindow(Button* button, String name); + ~DataWindow(); - void closeButtonPressed(); + void closeButtonPressed(); private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DataWindow); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DataWindow); - Button* controlButton; + Button* controlButton; }; diff --git a/Source/Processors/Visualization/LfpDisplayCanvas.cpp b/Source/Processors/Visualization/LfpDisplayCanvas.cpp index 07077a67da468495fff63981c652cb04f61cbbfa..1164bc10950308b481e2bb860b27b867d0ef1c07 100755 --- a/Source/Processors/Visualization/LfpDisplayCanvas.cpp +++ b/Source/Processors/Visualization/LfpDisplayCanvas.cpp @@ -26,36 +26,40 @@ #include <math.h> LfpDisplayCanvas::LfpDisplayCanvas(LfpDisplayNode* processor_) : - timebase(1.0f), displayGain(2.f), timeOffset(0.0f), processor(processor_), - screenBufferIndex(0), displayBufferIndex(0) + timebase(1.0f), displayGain(1.0f), timeOffset(0.0f), processor(processor_), + screenBufferIndex(0), displayBufferIndex(0) { - nChans = processor->getNumInputs(); - sampleRate = processor->getSampleRate(); - std::cout << "Setting num inputs on LfpDisplayCanvas to " << nChans << std::endl; + nChans = processor->getNumInputs(); + sampleRate = processor->getSampleRate(); + std::cout << "Setting num inputs on LfpDisplayCanvas to " << nChans << std::endl; - displayBuffer = processor->getDisplayBufferAddress(); - displayBufferSize = displayBuffer->getNumSamples(); - std::cout << "Setting displayBufferSize on LfpDisplayCanvas to " << displayBufferSize << std::endl; + displayBuffer = processor->getDisplayBufferAddress(); + displayBufferSize = displayBuffer->getNumSamples(); + std::cout << "Setting displayBufferSize on LfpDisplayCanvas to " << displayBufferSize << std::endl; - viewport = new Viewport(); - lfpDisplay = new LfpDisplay(this, viewport); - timescale = new LfpTimescale(this); + screenBuffer = new AudioSampleBuffer(MAX_N_CHAN, MAX_N_SAMP); - viewport->setViewedComponent(lfpDisplay, false); - viewport->setScrollBarsShown(true, false); + viewport = new Viewport(); + lfpDisplay = new LfpDisplay(this, viewport); + timescale = new LfpTimescale(this); - scrollBarThickness = viewport->getScrollBarThickness(); + viewport->setViewedComponent(lfpDisplay, false); + viewport->setScrollBarsShown(true, false); - addAndMakeVisible(viewport); - addAndMakeVisible(timescale); + scrollBarThickness = viewport->getScrollBarThickness(); - lfpDisplay->setNumChannels(nChans); + addAndMakeVisible(viewport); + addAndMakeVisible(timescale); + + lfpDisplay->setNumChannels(nChans); } LfpDisplayCanvas::~LfpDisplayCanvas() { + + deleteAndZero(screenBuffer); } void LfpDisplayCanvas::resized() @@ -63,189 +67,218 @@ void LfpDisplayCanvas::resized() - timescale->setBounds(0,0,getWidth()-scrollBarThickness,30); - viewport->setBounds(0,30,getWidth(),getHeight()-90); + timescale->setBounds(0,0,getWidth()-scrollBarThickness,30); + viewport->setBounds(0,30,getWidth(),getHeight()-90); - lfpDisplay->setBounds(0,0,getWidth()-scrollBarThickness, lfpDisplay->getTotalHeight()); + lfpDisplay->setBounds(0,0,getWidth()-scrollBarThickness, lfpDisplay->getTotalHeight()); } void LfpDisplayCanvas::beginAnimation() { - std::cout << "Beginning animation." << std::endl; + std::cout << "Beginning animation." << std::endl; + + displayBufferSize = displayBuffer->getNumSamples(); - displayBufferSize = displayBuffer->getNumSamples(); + screenBufferIndex = 0; - screenBufferIndex = 0; - - startCallbacks(); + startCallbacks(); } void LfpDisplayCanvas::endAnimation() { - std::cout << "Ending animation." << std::endl; - - stopCallbacks(); + std::cout << "Ending animation." << std::endl; + + stopCallbacks(); } void LfpDisplayCanvas::update() { - nChans = processor->getNumInputs(); - sampleRate = processor->getSampleRate(); - - std::cout << "Setting num inputs on LfpDisplayCanvas to " << nChans << std::endl; + nChans = processor->getNumInputs(); + sampleRate = processor->getSampleRate(); - refreshScreenBuffer(); + std::cout << "Setting num inputs on LfpDisplayCanvas to " << nChans << std::endl; - lfpDisplay->setNumChannels(nChans); - lfpDisplay->setBounds(0,0,getWidth()-scrollBarThickness*2, lfpDisplay->getTotalHeight()); + refreshScreenBuffer(); + lfpDisplay->setNumChannels(nChans); + lfpDisplay->setBounds(0,0,getWidth()-scrollBarThickness*2, lfpDisplay->getTotalHeight()); - repaint(); - lfpDisplay->repaint(); + repaint(); } void LfpDisplayCanvas::setParameter(int param, float val) { - if (param == 0) { - timebase = val; - refreshScreenBuffer(); - } else { - displayGain = val; //* 0.0001f; - } - - repaint(); + if (param == 0) + { + timebase = val; + refreshScreenBuffer(); + } + else + { + displayGain = val; //* 0.0001f; + } + + repaint(); } void LfpDisplayCanvas::refreshState() { - // called when the component's tab becomes visible again - displayBufferIndex = processor->getDisplayBufferIndex(); - screenBufferIndex = 0; + // called when the component's tab becomes visible again + displayBufferIndex = processor->getDisplayBufferIndex(); + screenBufferIndex = 0; } void LfpDisplayCanvas::refreshScreenBuffer() { - screenBufferIndex = 0; + screenBufferIndex = 0; + + screenBuffer->clear(); - int w = lfpDisplay->getWidth(); - //std::cout << "Refreshing buffer size to " << w << "pixels." << std::endl; + // int w = lfpDisplay->getWidth(); + // //std::cout << "Refreshing buffer size to " << w << "pixels." << std::endl; - for (int i = 0; i < w; i++) - { - float x = float(i); + // for (int i = 0; i < w; i++) + // { + // float x = float(i); - for (int n = 0; n < nChans; n++) - { - waves[n][i*2] = x; - waves[n][i*2+1] = 0.5f; // line in center of display - } - } + // for (int n = 0; n < nChans; n++) + // { + // waves[n][i*2] = x; + // waves[n][i*2+1] = 0.5f; // line in center of display + // } + // } } void LfpDisplayCanvas::updateScreenBuffer() { - // copy new samples from the displayBuffer into the screenBuffer (waves) - int maxSamples = lfpDisplay->getWidth(); + // copy new samples from the displayBuffer into the screenBuffer (waves) + + lastScreenBufferIndex = screenBufferIndex; + + int maxSamples = lfpDisplay->getWidth(); + + int index = processor->getDisplayBufferIndex(); + + int nSamples = index - displayBufferIndex; + + if (nSamples < 0) // buffer has reset to 0 + { + nSamples = (displayBufferSize - displayBufferIndex) + index; + } + + float ratio = sampleRate * timebase / float(getWidth()); - int index = processor->getDisplayBufferIndex(); + // this number is crucial: + int valuesNeeded = (int) float(nSamples) / ratio; - int nSamples = index - displayBufferIndex; + float subSampleOffset = 0.0; + int nextPos = (displayBufferIndex + 1) % displayBufferSize; - if (nSamples < 0) // buffer has reset to 0 - { - nSamples = (displayBufferSize - displayBufferIndex) + index; - } + if (valuesNeeded > 0 && valuesNeeded < 1000) + { - float ratio = sampleRate * timebase / float(getWidth()); + for (int i = 0; i < valuesNeeded; i++) + { + float gain = 1.0; + float alpha = (float) subSampleOffset; + float invAlpha = 1.0f - alpha; - // this number is crucial: - int valuesNeeded = (int) float(nSamples) / ratio; + screenBuffer->clear(screenBufferIndex, 1); - float subSampleOffset = 0.0; - int nextPos = (displayBufferIndex + 1) % displayBufferSize; + for (int channel = 0; channel < nChans; channel++) + { - if (valuesNeeded > 0 && valuesNeeded < 1000) { + gain = 1.0f / (processor->channels[channel]->bitVolts * float(0x7fff)); - for (int i = 0; i < valuesNeeded; i++) - { - float gain = 1.0; - float alpha = (float) subSampleOffset; - float invAlpha = 1.0f - alpha; + screenBuffer->addFrom(channel, // destChannel + screenBufferIndex, // destStartSample + displayBuffer->getSampleData(channel, displayBufferIndex), // source + 1, // numSamples + invAlpha*gain*displayGain); // gain - for (int channel = 0; channel < nChans; channel++) { + screenBuffer->addFrom(channel, // destChannel + screenBufferIndex, // destStartSample + displayBuffer->getSampleData(channel, nextPos), // source + 1, // numSamples + alpha*gain*displayGain); // gain - gain = -1.0f / (processor->channels[channel]->bitVolts * float(0x7fff)); - waves[channel][screenBufferIndex*2+1] = - *(displayBuffer->getSampleData(channel, displayBufferIndex))*invAlpha*gain*displayGain; + //waves[channel][screenBufferIndex*2+1] = + // *(displayBuffer->getSampleData(channel, displayBufferIndex))*invAlpha*gain*displayGain; - waves[channel][screenBufferIndex*2+1] += - *(displayBuffer->getSampleData(channel, nextPos))*alpha*gain*displayGain; + //waves[channel][screenBufferIndex*2+1] += + // *(displayBuffer->getSampleData(channel, nextPos))*alpha*gain*displayGain; - waves[channel][screenBufferIndex*2+1] += 0.5f; // to center in viewport + //waves[channel][screenBufferIndex*2+1] += 0.5f; // to center in viewport - } + } - //// now do the event channel - //// waves[nChans][screenBufferIndex*2+1] = - // *(displayBuffer->getSampleData(nChans, displayBufferIndex)); + //// now do the event channel + //// waves[nChans][screenBufferIndex*2+1] = + // *(displayBuffer->getSampleData(nChans, displayBufferIndex)); - subSampleOffset += ratio; + subSampleOffset += ratio; - while (subSampleOffset >= 1.0) - { - if (++displayBufferIndex >= displayBufferSize) - displayBufferIndex = 0; - - nextPos = (displayBufferIndex + 1) % displayBufferSize; - subSampleOffset -= 1.0; - } + while (subSampleOffset >= 1.0) + { + if (++displayBufferIndex >= displayBufferSize) + displayBufferIndex = 0; - screenBufferIndex++; - screenBufferIndex %= maxSamples; + nextPos = (displayBufferIndex + 1) % displayBufferSize; + subSampleOffset -= 1.0; + } - } + screenBufferIndex++; + screenBufferIndex %= maxSamples; - } else { - //std::cout << "Skip." << std::endl; - } + } + + } + else + { + //std::cout << "Skip." << std::endl; + } } float LfpDisplayCanvas::getXCoord(int chan, int samp) { - return waves[chan][samp*2]; + return samp; } float LfpDisplayCanvas::getYCoord(int chan, int samp) { - return waves[chan][samp*2+1]; + return *screenBuffer->getSampleData(chan, samp); } void LfpDisplayCanvas::paint(Graphics& g) { - //std::cout << "Painting" << std::endl; + //std::cout << "Painting" << std::endl; + g.setColour(Colours::grey); + + g.fillRect(0, 0, getWidth(), getHeight()); + + // g.setColour(Colours::yellow); - updateScreenBuffer(); + // g.drawLine(screenBufferIndex, 0, screenBufferIndex, getHeight()); - g.fillAll(Colours::grey); - - g.setColour(Colours::yellow); +} + +void LfpDisplayCanvas::refresh() +{ + updateScreenBuffer(); - g.drawLine(screenBufferIndex, 0, screenBufferIndex, getHeight()); + lfpDisplay->refresh(); - lfpDisplay->repaint(); + getPeer()->performAnyPendingRepaintsNow(); - //g.drawLine(0,0, getWidth(), getHeight()); - //g.drawLine(0,getHeight(),getWidth(), 0); - } // ------------------------------------------------------------- @@ -263,120 +296,128 @@ LfpTimescale::~LfpTimescale() void LfpTimescale::paint(Graphics& g) { - g.fillAll(Colours::black); + g.fillAll(Colours::black); } // --------------------------------------------------------------- -LfpDisplay::LfpDisplay(LfpDisplayCanvas* c, Viewport* v) : - canvas(c), viewport(v) +LfpDisplay::LfpDisplay(LfpDisplayCanvas* c, Viewport* v) : + canvas(c), viewport(v) { - channelHeight = 100; - totalHeight = 0; + channelHeight = 100; + totalHeight = 0; - addMouseListener(this, true); + addMouseListener(this, true); } LfpDisplay::~LfpDisplay() { - deleteAllChildren(); + deleteAllChildren(); } void LfpDisplay::setNumChannels(int numChannels) { - numChans = numChannels; + numChans = numChannels; - deleteAllChildren(); + deleteAllChildren(); - channels.clear(); + channels.clear(); - for (int i = 0; i < numChans; i++) - { + for (int i = 0; i < numChans; i++) + { - //std::cout << "Adding new channel display." << std::endl; + //std::cout << "Adding new channel display." << std::endl; - LfpChannelDisplay* lfpChan = new LfpChannelDisplay(canvas, i); + LfpChannelDisplay* lfpChan = new LfpChannelDisplay(canvas, i); - addAndMakeVisible(lfpChan); + addAndMakeVisible(lfpChan); - channels.add(lfpChan); + channels.add(lfpChan); - totalHeight += channelHeight; + totalHeight += channelHeight; - } + } } void LfpDisplay::resized() { - int totalHeight = 0; + int totalHeight = 0; - int overlap = 50; + int overlap = 50; - for (int i = 0; i < numChans; i++) - { + for (int i = 0; i < numChans; i++) + { - getChildComponent(i)->setBounds(0,totalHeight-overlap/2,getWidth(),channelHeight+overlap); + getChildComponent(i)->setBounds(0,totalHeight-overlap/2,getWidth(),channelHeight+overlap); - totalHeight += channelHeight; + totalHeight += channelHeight; - } + } } void LfpDisplay::paint(Graphics& g) { +} + +void LfpDisplay::refresh() +{ - int topBorder = viewport->getViewPositionY(); - int bottomBorder = viewport->getViewHeight() + topBorder; - // ensure that only visible channels are redrawn - for (int i = 0; i < numChans; i++) - { + int topBorder = viewport->getViewPositionY(); + int bottomBorder = viewport->getViewHeight() + topBorder; - int componentTop = getChildComponent(i)->getY(); - int componentBottom = getChildComponent(i)->getHeight() + componentTop; + // ensure that only visible channels are redrawn + for (int i = 0; i < numChans; i++) + { - if ( (topBorder <= componentBottom && bottomBorder >= componentTop) ) - { - getChildComponent(i)->repaint(); + int componentTop = getChildComponent(i)->getY(); + int componentBottom = getChildComponent(i)->getHeight() + componentTop; - //std::cout << i << std::endl; - } + if ((topBorder <= componentBottom && bottomBorder >= componentTop)) + { + getChildComponent(i)->repaint(canvas->lastScreenBufferIndex, + 0, + canvas->screenBufferIndex, + getChildComponent(i)->getHeight()); - } + //std::cout << i << std::endl; + } + + } } void LfpDisplay::mouseDown(const MouseEvent& event) { - int x = event.getMouseDownX(); - int y = event.getMouseDownY(); + int x = event.getMouseDownX(); + int y = event.getMouseDownY(); - std::cout << "Mouse down at " << x << ", " << y << std::endl; + std::cout << "Mouse down at " << x << ", " << y << std::endl; - for (int n = 0; n < numChans; n++) - { - channels[n]->deselect(); - } + for (int n = 0; n < numChans; n++) + { + channels[n]->deselect(); + } - LfpChannelDisplay* lcd = (LfpChannelDisplay*) event.eventComponent; + LfpChannelDisplay* lcd = (LfpChannelDisplay*) event.eventComponent; - lcd->select(); + lcd->select(); - repaint(); + repaint(); } // ------------------------------------------------------------------ -LfpChannelDisplay::LfpChannelDisplay(LfpDisplayCanvas* c, int channelNumber) : - canvas(c), isSelected(false), chan(channelNumber) +LfpChannelDisplay::LfpChannelDisplay(LfpDisplayCanvas* c, int channelNumber) : + canvas(c), isSelected(false), chan(channelNumber) { } @@ -389,30 +430,32 @@ LfpChannelDisplay::~LfpChannelDisplay() void LfpChannelDisplay::paint(Graphics& g) { - if (isSelected) - g.setColour(Colours::lightgrey); - else - g.setColour(Colours::black); + if (isSelected) + g.setColour(Colours::lightgrey); + else + g.setColour(Colours::black); + + g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2); - g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2); + int stepSize = 1; - for (int i = 0; i < getWidth()-1; i++) - { + for (int i = 0; i < getWidth()-stepSize; i += stepSize) + { - g.drawLine(i, - canvas->getYCoord(chan, i)*getHeight(), - i+1, - canvas->getYCoord(chan, i+1)*getHeight()); - } + g.drawLine(i, + (canvas->getYCoord(chan, i)+0.5f)*getHeight(), + i+stepSize, + (canvas->getYCoord(chan, i+stepSize)+0.5f)*getHeight()); + } } void LfpChannelDisplay::select() { - isSelected = true; + isSelected = true; } void LfpChannelDisplay::deselect() { - isSelected = false; + isSelected = false; } diff --git a/Source/Processors/Visualization/LfpDisplayCanvas.h b/Source/Processors/Visualization/LfpDisplayCanvas.h index b87656d31ce7b2bcd5cde334316d6f34e349049b..7605a0142690cbdd711b60eafa8ef10eb01d6c8c 100755 --- a/Source/Processors/Visualization/LfpDisplayCanvas.h +++ b/Source/Processors/Visualization/LfpDisplayCanvas.h @@ -23,9 +23,6 @@ #ifndef __LFPDISPLAYCANVAS_H_B711873A__ #define __LFPDISPLAYCANVAS_H_B711873A__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "../LfpDisplayNode.h" #include "Visualizer.h" @@ -47,123 +44,133 @@ class LfpChannelDisplay; class LfpDisplayCanvas : public Visualizer { -public: - LfpDisplayCanvas(LfpDisplayNode* n); - ~LfpDisplayCanvas(); +public: + LfpDisplayCanvas(LfpDisplayNode* n); + ~LfpDisplayCanvas(); + + void beginAnimation(); + void endAnimation(); + + void refreshState(); - void beginAnimation(); - void endAnimation(); + void update(); - void refreshState(); + void setParameter(int, float); + void setParameter(int, int, int, float) {} - void update(); + void paint(Graphics& g); - void setParameter(int, float); - void setParameter(int, int, int, float){} + void refresh(); - void paint(Graphics& g); + void resized(); - void resized(); + float getXCoord(int chan, int samp); + float getYCoord(int chan, int samp); - float getXCoord(int chan, int samp); - float getYCoord(int chan, int samp); + int screenBufferIndex; + int lastScreenBufferIndex; private: - float sampleRate; - float timebase; - float displayGain; - float timeOffset; + float sampleRate; + float timebase; + float displayGain; + float timeOffset; - static const int MAX_N_CHAN = 256; // maximum number of channels - static const int MAX_N_SAMP = 5000; // maximum display size in pixels - float waves[MAX_N_CHAN][MAX_N_SAMP*2]; // we need an x and y point for each sample + static const int MAX_N_CHAN = 256; // maximum number of channels + static const int MAX_N_SAMP = 5000; // maximum display size in pixels + //float waves[MAX_N_CHAN][MAX_N_SAMP*2]; // we need an x and y point for each sample - LfpDisplayNode* processor; - AudioSampleBuffer* displayBuffer; - MidiBuffer* eventBuffer; + LfpDisplayNode* processor; + AudioSampleBuffer* displayBuffer; + AudioSampleBuffer* screenBuffer; + MidiBuffer* eventBuffer; - ScopedPointer<LfpTimescale> timescale; - ScopedPointer<LfpDisplay> lfpDisplay; - ScopedPointer<Viewport> viewport; + ScopedPointer<LfpTimescale> timescale; + ScopedPointer<LfpDisplay> lfpDisplay; + ScopedPointer<Viewport> viewport; - void refreshScreenBuffer(); - void updateScreenBuffer(); - int screenBufferIndex; - int displayBufferIndex; - int displayBufferSize; + void refreshScreenBuffer(); + void updateScreenBuffer(); - int scrollBarThickness; + int displayBufferIndex; + int displayBufferSize; - int nChans; + int scrollBarThickness; + + int nChans; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LfpDisplayCanvas); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LfpDisplayCanvas); - }; class LfpTimescale : public Component { public: - LfpTimescale(LfpDisplayCanvas*); - ~LfpTimescale(); + LfpTimescale(LfpDisplayCanvas*); + ~LfpTimescale(); - void paint(Graphics& g); + void paint(Graphics& g); private: - LfpDisplayCanvas* canvas; + LfpDisplayCanvas* canvas; }; class LfpDisplay : public Component { public: - LfpDisplay(LfpDisplayCanvas*, Viewport*); - ~LfpDisplay(); + LfpDisplay(LfpDisplayCanvas*, Viewport*); + ~LfpDisplay(); + + void setNumChannels(int numChannels); + int getTotalHeight() + { + return totalHeight; + } - void setNumChannels(int numChannels); - int getTotalHeight() {return totalHeight;} + void paint(Graphics& g); - void paint(Graphics& g); + void refresh(); - void resized(); + void resized(); - void mouseDown(const MouseEvent& event); + void mouseDown(const MouseEvent& event); private: - int numChans; - int channelHeight; - int totalHeight; + int numChans; + int channelHeight; + int totalHeight; - LfpDisplayCanvas* canvas; - Viewport* viewport; + LfpDisplayCanvas* canvas; + Viewport* viewport; - Array<LfpChannelDisplay*> channels; + Array<LfpChannelDisplay*> channels; }; class LfpChannelDisplay : public Component { public: - LfpChannelDisplay(LfpDisplayCanvas*, int channelNumber); - ~LfpChannelDisplay(); + LfpChannelDisplay(LfpDisplayCanvas*, int channelNumber); + ~LfpChannelDisplay(); - void paint(Graphics& g); + void paint(Graphics& g); - void select(); - void deselect(); + void select(); + void deselect(); private: - LfpDisplayCanvas* canvas; + LfpDisplayCanvas* canvas; - bool isSelected; + bool isSelected; - int chan; + int chan; }; #endif // __LFPDISPLAYCANVAS_H_B711873A__ - \ No newline at end of file diff --git a/Source/Processors/Visualization/OpenGLCanvas.cpp b/Source/Processors/Visualization/OpenGLCanvas.cpp index 7ca95950291fe032f69b7f4ff49a365a7a1c79d2..7b3b88b3f012fa29a830bd99ba638f03ee66e71a 100755 --- a/Source/Processors/Visualization/OpenGLCanvas.cpp +++ b/Source/Processors/Visualization/OpenGLCanvas.cpp @@ -26,243 +26,254 @@ #include <math.h> OpenGLCanvas::OpenGLCanvas() : //OpenGLComponent(OpenGLComponent::OpenGLType::openGLDefault, true), - scrollPix(0), animationIsActive(false), refreshMs(5000), - scrollBarWidth(15), scrollDiff(0), originalScrollPix(0), - scrollTime(0), showScrollTrack(true), PI(3.1415926) + scrollPix(0), animationIsActive(false), refreshMs(5000), + scrollBarWidth(15), scrollDiff(0), originalScrollPix(0), + scrollTime(0), showScrollTrack(true), PI(3.1415926) { } OpenGLCanvas::~OpenGLCanvas() { - + } void OpenGLCanvas::startCallbacks() { - startTimer(refreshMs); - animationIsActive = true; + startTimer(refreshMs); + animationIsActive = true; } void OpenGLCanvas::stopCallbacks() { - stopTimer(); - animationIsActive = false; + stopTimer(); + animationIsActive = false; } void OpenGLCanvas::paint(Graphics& g) { - paintCanvas(g); + paintCanvas(g); - drawScrollBars(g); + drawScrollBars(g); } void OpenGLCanvas::drawScrollBars(Graphics& g) { - //std::cout << "Drawing scroll bars" << std::endl; - - float scrollBarY = float(getHeight())/float(getTotalHeight()); - float timeSinceScroll = timer.getMillisecondCounter()-scrollTime; - - if (scrollBarY < 1.0f && timeSinceScroll < 1300) - { - float alpha; - - if (timeSinceScroll < 1000) - alpha = 1.0f; - else - alpha = 1.0f*(1-float(timeSinceScroll-1000)/300.0f); - - float Yoffset = float(scrollPix)/float(getTotalHeight()); - - if (showScrollTrack) - drawScrollBar(g, 0.995f, 2.0f, alpha*0.2f); - - scrollBarBottom = scrollBarY + Yoffset - 2.0f; - scrollBarTop = Yoffset + 2.0f; - - drawScrollBar(g, scrollBarBottom, scrollBarTop, alpha*0.5f); - - } else { - if (!animationIsActive) { - stopTimer(); - } - showScrollTrack = false; - } + //std::cout << "Drawing scroll bars" << std::endl; + + float scrollBarY = float(getHeight())/float(getTotalHeight()); + float timeSinceScroll = timer.getMillisecondCounter()-scrollTime; + + if (scrollBarY < 1.0f && timeSinceScroll < 1300) + { + float alpha; + + if (timeSinceScroll < 1000) + alpha = 1.0f; + else + alpha = 1.0f*(1-float(timeSinceScroll-1000)/300.0f); + + float Yoffset = float(scrollPix)/float(getTotalHeight()); + + if (showScrollTrack) + drawScrollBar(g, 0.995f, 2.0f, alpha*0.2f); + + scrollBarBottom = scrollBarY + Yoffset - 2.0f; + scrollBarTop = Yoffset + 2.0f; + + drawScrollBar(g, scrollBarBottom, scrollBarTop, alpha*0.5f); + + } + else + { + if (!animationIsActive) + { + stopTimer(); + } + showScrollTrack = false; + } } void OpenGLCanvas::drawScrollBar(Graphics& g, float y1, float y2, float alpha) { -// -// glViewport(0, getFooterHeight(), -// getWidth(), -// getHeight()-getHeaderHeight()-getFooterHeight()); -// -// float x1 = getWidth()-8.0f; -// -// g.setColour(Colours::black.withAlpha(alpha)); -// -// g.fillRect(x1, y1, 1.0f, y2-y1); + // + // glViewport(0, getFooterHeight(), + // getWidth(), + // getHeight()-getHeaderHeight()-getFooterHeight()); + // + // float x1 = getWidth()-8.0f; + // + // g.setColour(Colours::black.withAlpha(alpha)); + // + // g.fillRect(x1, y1, 1.0f, y2-y1); } void OpenGLCanvas::showScrollBars() { -// scrollTime = timer.getMillisecondCounter(); -// startTimer(refreshMs); + // scrollTime = timer.getMillisecondCounter(); + // startTimer(refreshMs); } void OpenGLCanvas::mouseMove(const MouseEvent& e) { -// if (getTotalHeight() > getHeight()) { -// -// Point<int> pos = e.getPosition(); -// int xcoord = pos.getX(); -// if (xcoord > getWidth() - scrollBarWidth) -// { -// showScrollTrack = true; showScrollBars(); -// } -// } -// -// mouseMoveInCanvas(e); + // if (getTotalHeight() > getHeight()) { + // + // Point<int> pos = e.getPosition(); + // int xcoord = pos.getX(); + // if (xcoord > getWidth() - scrollBarWidth) + // { + // showScrollTrack = true; showScrollBars(); + // } + // } + // + // mouseMoveInCanvas(e); } void OpenGLCanvas::mouseDown(const MouseEvent& e) { - if (getTotalHeight() > getHeight()) { + if (getTotalHeight() > getHeight()) + { + + Point<int> pos = e.getPosition(); + int xcoord = pos.getX(); - Point<int> pos = e.getPosition(); - int xcoord = pos.getX(); + if (xcoord > getWidth()-scrollBarWidth) + { - if (xcoord > getWidth()-scrollBarWidth) { + int ycoord = pos.getY(); - int ycoord = pos.getY(); + float targetPoint = float(ycoord)/float(getHeight()); - float targetPoint = float(ycoord)/float(getHeight()); + if (targetPoint < scrollBarTop && targetPoint < scrollBarTop) + { - if (targetPoint < scrollBarTop && targetPoint < scrollBarTop) - { + scrollPix = int(float(ycoord)/float(getHeight())*float(getTotalHeight())); - scrollPix = int(float(ycoord)/float(getHeight())*float(getTotalHeight())); + } + else if (targetPoint > scrollBarBottom && targetPoint > scrollBarBottom) + { - } else if (targetPoint > scrollBarBottom && targetPoint > scrollBarBottom) { - - scrollPix = int(float(ycoord)/float(getHeight())*float(getTotalHeight())) - - (scrollBarBottom-scrollBarTop)*float(getTotalHeight()); + scrollPix = int(float(ycoord)/float(getHeight())*float(getTotalHeight())) - + (scrollBarBottom-scrollBarTop)*float(getTotalHeight()); - } - - showScrollTrack = true; - showScrollBars(); - } - } + } - mouseDownInCanvas(e); + showScrollTrack = true; + showScrollBars(); + } + } + + mouseDownInCanvas(e); } void OpenGLCanvas::mouseDrag(const MouseEvent& e) { - if (getTotalHeight() > getHeight()) { - if (e.getMouseDownX() > getWidth()-scrollBarWidth) - { - - if (float(e.getMouseDownY()/float(getHeight())) > scrollBarTop && - float(e.getMouseDownY()/float(getHeight())) < scrollBarBottom) - { - - if (scrollDiff == 0) - { - originalScrollPix = scrollPix; - scrollDiff = 1; - } - - } - - if (scrollDiff == 1) - { - scrollPix = originalScrollPix + - float(e.getDistanceFromDragStartY())/float(getHeight()) - * float(getTotalHeight()); - - if (scrollPix < 0) - scrollPix = 0; - - if (scrollPix + getHeight() > getTotalHeight()) - scrollPix = getTotalHeight() - getHeight(); - - scrollTime = timer.getMillisecondCounter(); - showScrollTrack = true; - repaint(); - } - } - } - - mouseDragInCanvas(e); + if (getTotalHeight() > getHeight()) + { + if (e.getMouseDownX() > getWidth()-scrollBarWidth) + { + + if (float(e.getMouseDownY()/float(getHeight())) > scrollBarTop && + float(e.getMouseDownY()/float(getHeight())) < scrollBarBottom) + { + + if (scrollDiff == 0) + { + originalScrollPix = scrollPix; + scrollDiff = 1; + } + + } + + if (scrollDiff == 1) + { + scrollPix = originalScrollPix + + float(e.getDistanceFromDragStartY())/float(getHeight()) + * float(getTotalHeight()); + + if (scrollPix < 0) + scrollPix = 0; + + if (scrollPix + getHeight() > getTotalHeight()) + scrollPix = getTotalHeight() - getHeight(); + + scrollTime = timer.getMillisecondCounter(); + showScrollTrack = true; + repaint(); + } + } + } + + mouseDragInCanvas(e); } void OpenGLCanvas::mouseUp(const MouseEvent& e) { - scrollDiff = 0; + scrollDiff = 0; - mouseUpInCanvas(e); + mouseUpInCanvas(e); } -int OpenGLCanvas::mouseWheelMove(const MouseEvent&e, - float wheelIncrementX, float wheelIncrementY) +int OpenGLCanvas::mouseWheelMove(const MouseEvent& e, + float wheelIncrementX, float wheelIncrementY) { - if (getTotalHeight() > getHeight()) { - - if (wheelIncrementY > 0) - { - if (scrollPix + getHeight() < getTotalHeight()) - { - scrollPix += int(100.0f*wheelIncrementY); - if (scrollPix + getHeight() > getTotalHeight()) - scrollPix = getTotalHeight() - getHeight(); - } - } else if (wheelIncrementY < 0) - { - if (scrollPix > 0) - { - scrollPix += int(100.0f*wheelIncrementY); - if (scrollPix < 0) - scrollPix = 0; - } - } - - repaint(); - - showScrollBars(); - - } - - mouseWheelMoveInCanvas(e, wheelIncrementX, wheelIncrementY); - + if (getTotalHeight() > getHeight()) + { + + if (wheelIncrementY > 0) + { + if (scrollPix + getHeight() < getTotalHeight()) + { + scrollPix += int(100.0f*wheelIncrementY); + if (scrollPix + getHeight() > getTotalHeight()) + scrollPix = getTotalHeight() - getHeight(); + } + } + else if (wheelIncrementY < 0) + { + if (scrollPix > 0) + { + scrollPix += int(100.0f*wheelIncrementY); + if (scrollPix < 0) + scrollPix = 0; + } + } + + repaint(); + + showScrollBars(); + + } + + mouseWheelMoveInCanvas(e, wheelIncrementX, wheelIncrementY); + + return 0; //mouseWheelMove should be void according to juce's documentation. } void OpenGLCanvas::timerCallback() { - repaint(); + repaint(); } void OpenGLCanvas::resized() { - if (scrollPix + getHeight() > getTotalHeight() && getTotalHeight() > getHeight()) - scrollPix = getTotalHeight() - getHeight(); - else - scrollPix = 0; + if (scrollPix + getHeight() > getTotalHeight() && getTotalHeight() > getHeight()) + scrollPix = getTotalHeight() - getHeight(); + else + scrollPix = 0; - showScrollBars(); + showScrollBars(); - canvasWasResized(); + canvasWasResized(); } diff --git a/Source/Processors/Visualization/OpenGLCanvas.h b/Source/Processors/Visualization/OpenGLCanvas.h index 9fdb6605145bceeed4bceec683aa0f2fe5a8f06c..56e47ca39f765aec86cbf13cd464b61d44ed8724 100755 --- a/Source/Processors/Visualization/OpenGLCanvas.h +++ b/Source/Processors/Visualization/OpenGLCanvas.h @@ -24,14 +24,11 @@ #ifndef __OPENGLCANVAS_H_98F0C13D__ #define __OPENGLCANVAS_H_98F0C13D__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" -#include "../../OpenGL.h" +//#include "../../OpenGL.h" -/** +/** Can be subclassed to create OpenGL visualizers. @@ -44,68 +41,83 @@ class OpenGLCanvas : public Component, Timer { public: - OpenGLCanvas(); - ~OpenGLCanvas(); - - virtual void refreshState() {}; - - void resized(); - virtual void canvasWasResized() { } - - void mouseDown(const MouseEvent& e); - void mouseDrag(const MouseEvent& e); - void mouseMove(const MouseEvent& e); - void mouseUp(const MouseEvent& e); - int mouseWheelMove(const MouseEvent&, float, float); - - virtual void mouseDownInCanvas(const MouseEvent& e) {} - virtual void mouseDragInCanvas(const MouseEvent& e) {} - virtual void mouseMoveInCanvas(const MouseEvent& e) {} - virtual void mouseUpInCanvas(const MouseEvent& e) {} - virtual void mouseWheelMoveInCanvas(const MouseEvent&, - float, - float) {} - - void startCallbacks(); - void stopCallbacks(); - - int getScrollAmount() {return scrollPix;}; - int getScrollBarWidth() {return scrollBarWidth;} - void drawScrollBars(Graphics& g); - - virtual int getHeaderHeight() {return 0;} - virtual int getFooterHeight() {return 0;} - - void paint(Graphics& g); - - virtual void paintCanvas(Graphics& g) = 0; + OpenGLCanvas(); + ~OpenGLCanvas(); + + virtual void refreshState() {}; + + void resized(); + virtual void canvasWasResized() { } + + void mouseDown(const MouseEvent& e); + void mouseDrag(const MouseEvent& e); + void mouseMove(const MouseEvent& e); + void mouseUp(const MouseEvent& e); + int mouseWheelMove(const MouseEvent&, float, float); + + virtual void mouseDownInCanvas(const MouseEvent& e) {} + virtual void mouseDragInCanvas(const MouseEvent& e) {} + virtual void mouseMoveInCanvas(const MouseEvent& e) {} + virtual void mouseUpInCanvas(const MouseEvent& e) {} + virtual void mouseWheelMoveInCanvas(const MouseEvent&, + float, + float) {} + + void startCallbacks(); + void stopCallbacks(); + + int getScrollAmount() + { + return scrollPix; + }; + int getScrollBarWidth() + { + return scrollBarWidth; + } + void drawScrollBars(Graphics& g); + + virtual int getHeaderHeight() + { + return 0; + } + virtual int getFooterHeight() + { + return 0; + } + + void paint(Graphics& g); + + virtual void paintCanvas(Graphics& g) = 0; protected: - virtual int getTotalHeight() {return getHeight();} - int scrollPix; - void showScrollBars(); - + virtual int getTotalHeight() + { + return getHeight(); + } + int scrollPix; + void showScrollBars(); + bool animationIsActive; int refreshMs; private: - void drawScrollBar(Graphics& g, float y1, float y2, float alpha); - - int scrollBarWidth, scrollDiff, originalScrollPix; - int scrollTime; - bool showScrollTrack; + void drawScrollBar(Graphics& g, float y1, float y2, float alpha); + + int scrollBarWidth, scrollDiff, originalScrollPix; + int scrollTime; + bool showScrollTrack; - Time timer; - void timerCallback(); + Time timer; + void timerCallback(); - float scrollBarTop, scrollBarBottom; + float scrollBarTop, scrollBarBottom; - const float PI; + const float PI; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLCanvas); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(OpenGLCanvas); }; diff --git a/Source/Processors/Visualization/SpikeDisplayCanvas.cpp b/Source/Processors/Visualization/SpikeDisplayCanvas.cpp index 2dfe2bcf23f03bd5baab5fd91f6c5902ea4bbb93..efad7c5c8e1c4ce30fb79b4d586298e2aecacb70 100755 --- a/Source/Processors/Visualization/SpikeDisplayCanvas.cpp +++ b/Source/Processors/Visualization/SpikeDisplayCanvas.cpp @@ -24,172 +24,171 @@ #include "SpikeDisplayCanvas.h" SpikeDisplayCanvas::SpikeDisplayCanvas(SpikeDisplayNode* n) : - xBuffer(18), yBuffer(18), - plotsInitialized(false), newSpike(false), - processor(n), totalScrollPix(0) -{ - nCols = 6; - - update(); - - spikeBuffer = processor->getSpikeBufferAddress(); - // std::cout<<"SpikeDisplayNode has :"<<nPlots<<" outputs!"<<std::endl; - - // // for (int i=0; i<nPlots; i++) - // // nChannels[i] = processor->getNumberOfChannelsForElectrode(i); - - // std::cout << "Setting num inputs on SpikeDisplayCanvas to " << nPlots << std::endl; - - //refreshMs = 100; // override 5 s refresh rate - + newSpike(false), processor(n) +{ + + update(); + + spikeBuffer = processor->getSpikeBufferAddress(); + + viewport = new Viewport(); + spikeDisplay = new SpikeDisplay(this, viewport); + + viewport->setViewedComponent(spikeDisplay, false); + viewport->setScrollBarsShown(true, false); + + scrollBarThickness = viewport->getScrollBarThickness(); + + addAndMakeVisible(viewport); + } SpikeDisplayCanvas::~SpikeDisplayCanvas() { - -} -void SpikeDisplayCanvas::initializeSpikePlots(){ - - std::cout<<"Initializing Plots"<<std::endl; - - // This layout system really only works if plot types are aggregated together. - // It might be worthwhile to investigate the merits of using a grid system - // The canvas is defined as N grid widths wide. Each SpikePlot defines its - // dimensions in grid widths. - // - // Plots are added from left to right, top to bottom. A plot is put into place - // if it can fit into the next grid location w/o its top going above the current - // row and w/o its bottom going below the current row - // - // This would lead to dead space but it would allow the plots to all scale accoring - // to how much space they need. The current system of deciding plot sizes, isn't going - // to scale well.... this needs more thought - - if (plots.size() != nPlots) - { - - int totalWidth = getWidth(); - - int plotWidth = (totalWidth - yBuffer * ( nCols+1)) / nCols + .99; - int plotHeight = plotWidth / 2 + .5; - int rowCount = 0; - - plots.clear(); - - for (int i = 0; i < nPlots; i++) - { - int pType; - switch (processor->getNumberOfChannelsForElectrode(i)){ - case 1: - pType = SINGLE_PLOT; - break; - case 2: - pType = STEREO_PLOT; - break; - case 4: - pType = TETRODE_PLOT; - break; - default: - pType = SINGLE_PLOT; - break; - } - -// bool use_generic_plots_flag = true; - -// BaseUIElement *sp; - - // if (use_generic_plots_flag) - SpikePlot *sp = new SpikePlot(xBuffer + i%nCols * (plotWidth + xBuffer) , - yBuffer + rowCount * (plotHeight + yBuffer), - plotWidth, plotHeight, pType); - -// else -// sp = new StereotrodePlot(xBuffer + i%nCols * (plotWidth + xBuffer) , -// yBuffer + rowCount * (plotHeight + yBuffer), -// plotWidth, plotHeight); - plots.add(sp); - - if (i%nCols == nCols-1) - rowCount++; - } - //totalHeight = rowCount * (plotHeight + yBuffer) + yBuffer * 2; - // Set the total height of the Canvas to the top of the top most plot - - plotsInitialized = true; - repositionSpikePlots(); - } } -void SpikeDisplayCanvas::repositionSpikePlots(){ - - int canvasWidth = getWidth(); - int gridSize = canvasWidth / nCols; - - gridSize = (gridSize > MIN_GRID_SIZE) ? gridSize : MIN_GRID_SIZE; - gridSize = (gridSize < MAX_GRID_SIZE) ? gridSize : MAX_GRID_SIZE; - - - - int x = xBuffer; - int y = getHeight() - yBuffer; - int p = 0; - int w,h; - int yIncrement = 0; - bool loopCheck = false; - //std::cout<<"Positioning Spike Plots"<<std::endl; - while (p < plots.size()){ - - // Ask the current plot for its desired dims - plots[p]->getBestDimensions(&w, &h); - w *= gridSize; - h *= gridSize; - - // Check to see if plot exceeds width of canvas, if yes, set x back to 0 and go to the bottom most plot on the canvas - if ( (x + w + xBuffer > canvasWidth - xBuffer) && !loopCheck){ - //std::cout<<"Collision with the edge of the canvas, going down a row"<<std::endl; - x = xBuffer; - y = y - yIncrement - yBuffer; - yIncrement = 0; - loopCheck = true; - continue; - } - // else place the plot - else{ - //std::cout<<"Positioning p:"<<p<<" at "<<x<<","<<y - h<<" "<<w<<","<<h<<std::endl; - // plots[p]->setPosition(x, y - h + getScrollAmount(), w, h); - x = x + w + xBuffer; - - // set a new minimum - if (h > yIncrement) - yIncrement = h; - - // increment p - p++; - loopCheck = false; - } - } +// void SpikeDisplayCanvas::initializeSpikePlots(){ + +// std::cout<<"Initializing Plots"<<std::endl; + +// // This layout system really only works if plot types are aggregated together. +// // It might be worthwhile to investigate the merits of using a grid system +// // The canvas is defined as N grid widths wide. Each SpikePlot defines its +// // dimensions in grid widths. +// // +// // Plots are added from left to right, top to bottom. A plot is put into place +// // if it can fit into the next grid location w/o its top going above the current +// // row and w/o its bottom going below the current row +// // +// // This would lead to dead space but it would allow the plots to all scale accoring +// // to how much space they need. The current system of deciding plot sizes, isn't going +// // to scale well.... this needs more thought + +// // if (plots.size() != nPlots) +// // { + +// // int totalWidth = getWidth(); + +// // int plotWidth = (totalWidth - yBuffer * ( nCols+1)) / nCols + .99; +// // int plotHeight = plotWidth / 2 + .5; +// // int rowCount = 0; + +// // plots.clear(); + +// // for (int i = 0; i < nPlots; i++) +// // { +// // int pType; +// // switch (processor->getNumberOfChannelsForElectrode(i)){ +// // case 1: +// // pType = SINGLE_PLOT; +// // break; +// // case 2: +// // pType = STEREO_PLOT; +// // break; +// // case 4: +// // pType = TETRODE_PLOT; +// // break; +// // default: +// // pType = SINGLE_PLOT; +// // break; +// // } + +// // // bool use_generic_plots_flag = true; + +// // // BaseUIElement *sp; + +// // // if (use_generic_plots_flag) +// // SpikePlot *sp = new SpikePlot(xBuffer + i%nCols * (plotWidth + xBuffer) , +// // yBuffer + rowCount * (plotHeight + yBuffer), +// // plotWidth, plotHeight, pType); + +// // // else +// // // sp = new StereotrodePlot(xBuffer + i%nCols * (plotWidth + xBuffer) , +// // // yBuffer + rowCount * (plotHeight + yBuffer), +// // // plotWidth, plotHeight); +// // plots.add(sp); + +// // if (i%nCols == nCols-1) +// // rowCount++; +// // } +// // //totalHeight = rowCount * (plotHeight + yBuffer) + yBuffer * 2; +// // // Set the total height of the Canvas to the top of the top most plot + +// // plotsInitialized = true; +// // repositionSpikePlots(); +// // } +// } -// int plotWidth = (totalWidth - yBuffer * ( nCols+1)) / nCols + .99; -// int plotHeight = plotWidth / 2 + .5; -// int rowCount = 0; - -// for (int i=0; i < plots.size(); i++) -// { -// -// plots[i]->setPosition( xBuffer + i%nCols * (plotWidth + xBuffer) , -// getHeight() - ( yBuffer + plotHeight + rowCount * (plotHeight + yBuffer)) + getScrollAmount(), -// plotWidth, -// plotHeight); // deprecated conversion from string constant to char -// -// if (i%nCols == nCols-1) -// rowCount++; -// } - - // Set the total height of the Canvas to the top of the top most plot -// totalHeight = (rowCount + 1) * (plotHeight + yBuffer) + yBuffer; - totalHeight = getHeight() + (y + yIncrement); -} +// void SpikeDisplayCanvas::repositionSpikePlots(){ + +// // int canvasWidth = getWidth(); +// // int gridSize = canvasWidth / nCols; + +// // gridSize = (gridSize > MIN_GRID_SIZE) ? gridSize : MIN_GRID_SIZE; +// // gridSize = (gridSize < MAX_GRID_SIZE) ? gridSize : MAX_GRID_SIZE; + + + +// // int x = xBuffer; +// // int y = getHeight() - yBuffer; +// // int p = 0; +// // int w,h; +// // int yIncrement = 0; +// // bool loopCheck = false; +// // //std::cout<<"Positioning Spike Plots"<<std::endl; +// // while (p < plots.size()){ + +// // // Ask the current plot for its desired dims +// // plots[p]->getBestDimensions(&w, &h); +// // w *= gridSize; +// // h *= gridSize; + +// // // Check to see if plot exceeds width of canvas, if yes, set x back to 0 and go to the bottom most plot on the canvas +// // if ( (x + w + xBuffer > canvasWidth - xBuffer) && !loopCheck){ +// // //std::cout<<"Collision with the edge of the canvas, going down a row"<<std::endl; +// // x = xBuffer; +// // y = y - yIncrement - yBuffer; +// // yIncrement = 0; +// // loopCheck = true; +// // continue; +// // } +// // // else place the plot +// // else{ +// // //std::cout<<"Positioning p:"<<p<<" at "<<x<<","<<y - h<<" "<<w<<","<<h<<std::endl; +// // // plots[p]->setPosition(x, y - h + getScrollAmount(), w, h); +// // x = x + w + xBuffer; + +// // // set a new minimum +// // if (h > yIncrement) +// // yIncrement = h; + +// // // increment p +// // p++; +// // loopCheck = false; +// // } +// // } + +// // // int plotWidth = (totalWidth - yBuffer * ( nCols+1)) / nCols + .99; +// // // int plotHeight = plotWidth / 2 + .5; +// // // int rowCount = 0; + +// // // for (int i=0; i < plots.size(); i++) +// // // { +// // // +// // // plots[i]->setPosition( xBuffer + i%nCols * (plotWidth + xBuffer) , +// // // getHeight() - ( yBuffer + plotHeight + rowCount * (plotHeight + yBuffer)) + getScrollAmount(), +// // // plotWidth, +// // // plotHeight); // deprecated conversion from string constant to char +// // // +// // // if (i%nCols == nCols-1) +// // // rowCount++; +// // // } + +// // // Set the total height of the Canvas to the top of the top most plot +// // // totalHeight = (rowCount + 1) * (plotHeight + yBuffer) + yBuffer; +// // totalHeight = getHeight() + (y + yIncrement); +// } // void SpikeDisplayCanvas::newOpenGLContextCreated() // { @@ -205,278 +204,345 @@ void SpikeDisplayCanvas::repositionSpikePlots(){ void SpikeDisplayCanvas::beginAnimation() { - std::cout << "Beginning animation." << std::endl; - - //startCallbacks(); + std::cout << "Beginning animation." << std::endl; + + startCallbacks(); } void SpikeDisplayCanvas::endAnimation() { - std::cout << "Ending animation." << std::endl; - //stopCallbacks(); + std::cout << "Ending animation." << std::endl; + + stopCallbacks(); } void SpikeDisplayCanvas::update() { - std::cout << "UPDATING SpikeDisplayCanvas" << std::endl; + std::cout << "UPDATING SpikeDisplayCanvas" << std::endl; - nPlots = processor->getNumElectrodes(); - // numChannelsPerPlot.clear(); + //nPlots = processor->getNumElectrodes(); + // numChannelsPerPlot.clear(); - // for (int i = 0; i < nPlots; i++) - // { - // numChannelsPerPlot.add(processor->getNumberOfChannelsForElectrode(i)); - // } + // for (int i = 0; i < nPlots; i++) + // { + // numChannelsPerPlot.add(processor->getNumberOfChannelsForElectrode(i)); + // } - initializeSpikePlots(); + //initializeSpikePlots(); - repaint(); + repaint(); } -// Used for Plot specific commands, this commands target a specific PLOT and have -// no additional information, IE PARAM-> CLEAR val->plot6 -// for more complex messages use the other version of setParameter -void SpikeDisplayCanvas::setParameter(int param, float val) -{ - std::cout<<"Got Param:"<< param<< " with value:"<<val<<std::endl; - switch (param) - { - case SPIKE_CMD_CLEAR_ALL : - for (int i=0; i < plots.size(); i++) - plots[i]->clear(); - break; - - case SPIKE_CMD_CLEAR_SEL: - //clear plot number val - break; - default: - std::cout<<"Unknown command specified! "<<param<<std::endl; - } +void SpikeDisplayCanvas::refreshState() +{ + // called when the component's tab becomes visible again + // displayBufferIndex = processor->getDisplayBufferIndex(); + // screenBufferIndex = 0; + resized(); } -void SpikeDisplayCanvas::setParameter(int param, int p2, int p3, float value){ - std::cout<<"Got Parameter:"<<param<<" p2:"<<p2<<" p3:"<<p3<<" value:"<<value<<std::endl; - switch (param){ - case SPIKE_CMD_PAN_AXES: - panPlot(p2, p3, value<=0); - break; - case SPIKE_CMD_ZOOM_AXES: - zoomPlot(p2, p3, value<=0); - break; - } -} +void SpikeDisplayCanvas::resized() +{ + viewport->setBounds(0,0,getWidth(),getHeight()-90); + spikeDisplay->setBounds(0,0,getWidth()-scrollBarThickness, spikeDisplay->getTotalHeight()); +} -void SpikeDisplayCanvas::refreshState() +void SpikeDisplayCanvas::paint(Graphics& g) { - // called when the component's tab becomes visible again - // displayBufferIndex = processor->getDisplayBufferIndex(); - // screenBufferIndex = 0; - //resized(); - //totalScrollPix = 0; + g.fillAll(Colours::darkgrey); + } -void SpikeDisplayCanvas::canvasWasResized() +void SpikeDisplayCanvas::refresh() { - repositionSpikePlots(); + processSpikeEvents(); } -void SpikeDisplayCanvas::paint(Graphics& g) +void SpikeDisplayCanvas::processSpikeEvents() { - g.fillAll(Colours::cyan); + if (spikeBuffer->getNumEvents() > 0) + { + + MidiBuffer::Iterator i(*spikeBuffer); + MidiMessage message(0xf4); + + int samplePosition = 0; + + i.setNextSamplePosition(samplePosition); + + while (i.getNextEvent(message, samplePosition)) + { + + const uint8_t* dataptr = message.getRawData(); + int bufferSize = message.getRawDataSize(); + int nSamples = (bufferSize-4)/2; + + SpikeObject newSpike; + SpikeObject simSpike; + + unpackSpike(&newSpike, dataptr, bufferSize); + + int chan = newSpike.source; + + generateSimulatedSpike(&simSpike, 0, 0); - g.setColour(Colours::white); + for (int i = 0; i < newSpike.nChannels * newSpike.nSamples; i++) + { + simSpike.data[i] = newSpike.data[i%80] + 5000;// * 3 - 10000; + } - g.drawLine(0,0, getWidth(), getHeight()); - g.drawLine(0,getHeight(),getWidth(), 0); + simSpike.nSamples = 40; - // //if(!plotsInitialized) - // // initializeSpikePlots(); + spikeDisplay->plotSpike(simSpike); - // glClearColor (0.667, 0.698, 0.718, 1.0); - // glClear(GL_COLOR_BUFFER_BIT); // clear buffers to preset values + } - // // Get Spikes from the processor - // // Iterate through each spike, passing them individually to the appropriate plots and calling redraw before moving on to the next spike - // processSpikeEvents(); + } - // for (int i = 0; i < plots.size(); i++) - // { - // plots[i]->redraw(); - // drawPlotTitle(i); - // } + spikeBuffer->clear(); - // drawScrollBars(); - } -void SpikeDisplayCanvas::processSpikeEvents() + +// ---------------------------------------------------------------- + +SpikeDisplay::SpikeDisplay(SpikeDisplayCanvas* sdc, Viewport* v) : + canvas(sdc), viewport(v) { + tetrodePlotMinWidth = 500; + stereotrodePlotMinWidth = 400; + singleElectrodePlotMinWidth = 200; - if (spikeBuffer->getNumEvents() > 0) - { - - //int m = spikeBuffer->getNumEvents(); + tetrodePlotRatio = 0.5; + stereotrodePlotRatio = 0.2; + singleElectrodePlotRatio = 1.0; - //std::cout << "Received " << m << " events." << std::endl; - - //std::cout << m << " events received by node " << getNodeId() << std::endl; - MidiBuffer::Iterator i (*spikeBuffer); - MidiMessage message(0xf4); + totalHeight = 1000; - int samplePosition = 0; + for (int i = 0; i < 10; i++) + { + TetrodePlot* tetrodePlot = new TetrodePlot(canvas, i); + tetrodePlots.add(tetrodePlot); + addAndMakeVisible(tetrodePlot); + } - i.setNextSamplePosition(samplePosition); - - //int eventCount = 0; - - while (i.getNextEvent (message, samplePosition)) { - //eventCount++; - const uint8* dataptr = message.getRawData(); - int bufferSize = message.getRawDataSize(); - // int nSamples = (bufferSize-4)/2; +} - SpikeObject newSpike; - SpikeObject simSpike; +SpikeDisplay::~SpikeDisplay() +{ - //unpackSpike(&newSpike, dataptr, bufferSize); +} - // +void SpikeDisplay::addSpikePlot(int numChannels) +{ - int chan = newSpike.source; +} - generateSimulatedSpike(&simSpike, 0, 0); +void SpikeDisplay::paint(Graphics& g) +{ + g.fillAll(Colours::grey); +} + +void SpikeDisplay::resized() +{ + + int w = getWidth(); + + int numColumns = w / tetrodePlotMinWidth; + int column, row; + + float width = (float) w / (float) numColumns; + float height = width * tetrodePlotRatio; - for (int i = 0; i < newSpike.nChannels * newSpike.nSamples; i++) - { - simSpike.data[i] = newSpike.data[i%80] + 5000;// * 3 - 10000; - } + for (int i = 0; i < tetrodePlots.size(); i++) + { + + column = i % numColumns; + row = i / numColumns; + tetrodePlots[i]->setBounds(width*column,row*height,width,height); + + } + + totalHeight = (int)(height*(float(row)+1)); + + if (totalHeight < getHeight()) + { + canvas->resized(); + } - simSpike.nSamples = 40; + //setBounds(0,0,getWidth(), totalHeight); - - // std::cout << "Received spike on electrode " << chan << std::endl; + // layoutManagerX.layOutComponents((Component**) spikePlots.getRawDataPointer(), + // spikePlots.size(), + // 0, + // 0, + // getWidth(), + // getHeight(), + // false, + // false); +} - // std::cout << "Spike has " << newSpike.nChannels << " channels and " << - // newSpike.nSamples << " samples." << std::endl; +void SpikeDisplay::mouseDown(const MouseEvent& event) +{ - // std::cout << "Data: "; +} - // for (int n = 0; n < newSpike.nSamples; n++) - // { - // std::cout << newSpike.data[n] << " "; - // } +void SpikeDisplay::plotSpike(const SpikeObject& spike) +{ - // std::cout << std::endl; +} - plots[chan]->processSpikeObject(simSpike); - } +// ---------------------------------------------------------------- - } +SpikePlot::SpikePlot(SpikeDisplayCanvas* sdc, int elecNum, int numChans) : + canvas(sdc), electrodeNumber(elecNum), numChannels(numChans) - spikeBuffer->clear(); +{ + isSelected = false; } -void SpikeDisplayCanvas::drawPlotTitle(int chan){ +SpikePlot::~SpikePlot() +{ - glViewport(0,0,getWidth(), getHeight()); - setViewportRange(0, 0, getWidth(), getHeight()); +} - int x, y; - double w,h; - plots[chan]->getPosition(&x,&y,&w,&h); +void SpikePlot::paint(Graphics& g) +{ - float alpha = 0.50f; + //g.setColour(Colours::darkgrey); + //g.fillRect(2, 2, getWidth()-4, getHeight()-4); - glColor4f(0.0f,0.0f,0.0f,alpha); - glRasterPos2f(x, y+h+2); - - String s = "Source:";//String("Channel "); - s += (chan+1); +} -// getFont(cpmono_bold)->FaceSize(15); - //getFont(cpmono_bold)->Render(s); +void SpikePlot::select() +{ + isSelected = true; } -int SpikeDisplayCanvas::getTotalHeight() +void SpikePlot::deselect() { - //std::cout << "TOTAL HEIGHT = " << totalHeight << std::endl; - return totalHeight; + isSelected = false; } -void SpikeDisplayCanvas::mouseDownInCanvas(const MouseEvent& e) +// -------------------------------------------------- + + +TetrodePlot::TetrodePlot(SpikeDisplayCanvas* sdc, int elecNum) : + SpikePlot(sdc, elecNum, 4) { - /* - Point<int> pos = e.getPosition(); - int xcoord = pos.getX(); + for (int i = 0; i < numChannels; i++) + { + WaveformPlot* wp = new WaveformPlot(); + addAndMakeVisible(wp); + waveformPlots.add(wp); + } + + for (int i = 0; i < 6; i++) + { + ProjectionPlot* pp = new ProjectionPlot(); + addAndMakeVisible(pp); + projectionPlots.add(pp); + } + +} - if (xcoord < getWidth()-getScrollBarWidth()) - { - int chan = (e.getMouseDownY() + getScrollAmount())/(yBuffer+plotHeight); +void TetrodePlot::resized() +{ + float w = (float) getWidth() / 5.0f; + float h = (float) getHeight() / 2.0f; - selectedChan = chan; + waveformPlots[0]->setBounds(0, 0, w, h); + waveformPlots[1]->setBounds(w, 0, w, h); + waveformPlots[2]->setBounds(0, h, w, h); + waveformPlots[3]->setBounds(w, h, w, h); - repaint(); - }*/ + projectionPlots[0]->setBounds(w*2, 0, w, h); + projectionPlots[1]->setBounds(w*3, 0, w, h); + projectionPlots[2]->setBounds(w*4, 0, w, h); + projectionPlots[3]->setBounds(w*2, h, w, h); + projectionPlots[4]->setBounds(w*3, h, w, h); + projectionPlots[5]->setBounds(w*4, h, w, h); } -// void SpikeDisplayCanvas::mouseDrag(const MouseEvent& e) {mouseDragInCanvas(e);} -// void SpikeDisplayCanvas::mouseMove(const MouseEvent& e) {mouseMoveInCanvas(e);} -void SpikeDisplayCanvas::mouseUpInCanvas(const MouseEvent& e) { - // std::cout<<"Mouse Event!"<<std::endl; +StereotrodePlot::StereotrodePlot(SpikeDisplayCanvas* sdc, int elecNum) : + SpikePlot(sdc, elecNum, 2) +{ - // bool inout = false; + for (int i = 0; i < numChannels; i++) + { + WaveformPlot* wp = new WaveformPlot(); + addAndMakeVisible(wp); + waveformPlots.add(wp); + } - // if (e.getMouseDownX() < getWidth()/2) - // inout = false; - // else - // inout = true; + ProjectionPlot* pp = new ProjectionPlot(); + addAndMakeVisible(pp); + projectionPlots.add(pp); - // if (e.getMouseDownY() < getHeight()/2) - // zoomPlot(0,0, inout); - // else - // panPlot(0,0,inout); } -void SpikeDisplayCanvas::mouseWheelMoveInCanvas(const MouseEvent& e, float wheelIncrementX, float wheelIncrementY) + +void StereotrodePlot::resized() { + float w = (float) getWidth() / 3.0f; + float h = (float) getHeight() / 1.0f; + + waveformPlots[0]->setBounds(0, 0, w, h); + waveformPlots[1]->setBounds(w, 0, w, h); + + projectionPlots[0]->setBounds(w*2, 0, w, h); - // repositionSpikePlots(); +} + +SingleElectrodePlot::SingleElectrodePlot(SpikeDisplayCanvas* sdc, int elecNum) : + SpikePlot(sdc, elecNum, 1) +{ - // repaint(); - //repaint(); + WaveformPlot* wp = new WaveformPlot(); + addAndMakeVisible(wp); + waveformPlots.add(wp); - // mouseWheelMoveInCanvas(e, wheelIncrementX, wheelIncrementY); } -void SpikeDisplayCanvas::panPlot(int p, int c, bool up){ +void SingleElectrodePlot::resized() +{ + float w = (float) getWidth() / 1.0f; + float h = (float) getHeight() / 1.0f; + + waveformPlots[0]->setBounds(0, 0, w, h); + +} - std::cout << "SpikeDisplayCanvas::panPlot()" << std::endl; - if (p < 0 || p > plots.size()) - return; - plots[p]->pan(c, up); +WaveformPlot::WaveformPlot() +{ } -void SpikeDisplayCanvas::zoomPlot(int p, int c, bool in){ - std::cout << "SpikeDisplayCanvas::panPlot()" << std::endl; - if (p < 0 || p > plots.size()) - return; - plots[p]->zoom(c, in); +void WaveformPlot::paint(Graphics& g) +{ + g.setColour(Colours::black); + g.fillRect(5,5,getWidth()-5, getHeight()-5); } -void SpikeDisplayCanvas::disablePointSmoothing() +ProjectionPlot::ProjectionPlot() { - glDisable(GL_POINT_SMOOTH); // needed to make projections visible + } + +void ProjectionPlot::paint(Graphics& g) +{ + g.setColour(Colours::orange); + g.fillRect(5,5,getWidth()-5, getHeight()-5); +} \ No newline at end of file diff --git a/Source/Processors/Visualization/SpikeDisplayCanvas.h b/Source/Processors/Visualization/SpikeDisplayCanvas.h index 8cc8694ad37f7c6d2cc372d1c90dd6c89ffd47e6..896231d84df15b1b3e39db3aa828f7770aec5441 100755 --- a/Source/Processors/Visualization/SpikeDisplayCanvas.h +++ b/Source/Processors/Visualization/SpikeDisplayCanvas.h @@ -24,13 +24,10 @@ #ifndef SPIKEDISPLAYCANVAS_H_ #define SPIKEDISPLAYCANVAS_H_ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" #include "../SpikeDisplayNode.h" -#include "SpikePlotting/SpikePlot.h" +//#include "SpikePlotting/SpikePlot.h" #include "SpikeObject.h" #include "Visualizer.h" @@ -40,6 +37,14 @@ class SpikeDisplayNode; +class SpikeDisplay; +class SpikePlot; +class TetrodePlot; +class StereotrodePlot; +class SingleElectrodePlot; +class WaveformPlot; +class ProjectionPlot; + /** Displays spike waveforms and projections. @@ -54,11 +59,11 @@ class SpikeDisplayCanvas : public Visualizer public: SpikeDisplayCanvas(SpikeDisplayNode* n); ~SpikeDisplayCanvas(); - //void newOpenGLContextCreated(); - //void renderOpenGL(); void paint(Graphics& g); + void refresh(); + void processSpikeEvents(); void beginAnimation(); @@ -66,62 +71,159 @@ public: void refreshState(); - void update(); + void setParameter(int, float) {} + void setParameter(int, int, int, float){} - void setParameter(int, float); - void setParameter(int, int, int, float); + void update(); - void panPlot(int, int, bool); - void zoomPlot(int, int, bool); + void resized(); private: - + SpikeDisplayNode* processor; MidiBuffer* spikeBuffer; - int xBuffer, yBuffer; - - bool plotsInitialized; + ScopedPointer<SpikeDisplay> spikeDisplay; + ScopedPointer<Viewport> viewport; bool newSpike; SpikeObject spike; - SpikeDisplayNode* processor; - Array<SpikePlot*> plots; - Array<int> numChannelsPerPlot; + int scrollBarThickness; - int totalScrollPix; - - void drawPlotTitle(int chan); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SpikeDisplayCanvas); +}; + +class SpikeDisplay : public Component +{ +public: + SpikeDisplay(SpikeDisplayCanvas*, Viewport*); + ~SpikeDisplay(); + + void addSpikePlot(int numChannels); + + void paint(Graphics& g); + + void resized(); + + void mouseDown(const MouseEvent& event); + + void plotSpike(const SpikeObject& spike); + + + int getTotalHeight() {return totalHeight;} + +private: + + //void computeColumnLayout(); +//void initializeSpikePlots(); + //void repositionSpikePlots(); + + int numColumns; + int totalHeight; - int getTotalHeight(); + SpikeDisplayCanvas* canvas; + Viewport* viewport; - int nPlots; + OwnedArray<TetrodePlot> tetrodePlots; + OwnedArray<StereotrodePlot> stereotrodePlots; + OwnedArray<SingleElectrodePlot> singleElectrodePlots; - int nCols; - static const int MIN_GRID_SIZE = 10; - static const int MAX_GRID_SIZE = 125; - - int nChannels[MAX_NUMBER_OF_SPIKE_CHANNELS]; + float tetrodePlotMinWidth, stereotrodePlotMinWidth, singleElectrodePlotMinWidth; + float tetrodePlotRatio, stereotrodePlotRatio, singleElectrodePlotRatio; - void computeColumnLayout(); - void initializeSpikePlots(); - void repositionSpikePlots(); +}; - void disablePointSmoothing(); - void canvasWasResized(); - void mouseDownInCanvas(const MouseEvent& e); - //void mouseDragInCanvas(const MouseEvent& e); - //void mouseMoveInCanvas(const MouseEvent& e); - void mouseUpInCanvas(const MouseEvent& e); - void mouseWheelMoveInCanvas(const MouseEvent&, float, float); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SpikeDisplayCanvas); +class SpikePlot : public Component +{ +public: + SpikePlot(SpikeDisplayCanvas*, int elecNum, int numChans); + ~SpikePlot(); + + void paint(Graphics& g); + + void select(); + void deselect(); + + SpikeDisplayCanvas* canvas; + + bool isSelected; + + int electrodeNumber; + + int numChannels; + + OwnedArray<ProjectionPlot> projectionPlots; + OwnedArray<WaveformPlot> waveformPlots; + +private: + + +}; + + +class TetrodePlot : public SpikePlot +{ +public: + TetrodePlot(SpikeDisplayCanvas*, int elecNum); + ~TetrodePlot() {} + + void resized(); + +private: + +}; + +class StereotrodePlot : public SpikePlot +{ +public: + StereotrodePlot(SpikeDisplayCanvas*, int elecNum); + ~StereotrodePlot() {} + + void resized(); + +private: }; +class SingleElectrodePlot : public SpikePlot +{ +public: + SingleElectrodePlot(SpikeDisplayCanvas*, int elecNum); + ~SingleElectrodePlot() {} + + void resized(); + +private: + +}; + +class WaveformPlot : public Component +{ +public: + WaveformPlot(); + ~WaveformPlot() {} + + void paint(Graphics& g); + +private: + +}; + +class ProjectionPlot : public Component +{ +public: + ProjectionPlot(); + ~ProjectionPlot() {} + + void paint(Graphics& g); + +private: + +}; #endif // SPIKEDISPLAYCANVAS_H_ diff --git a/Source/Processors/Visualization/SpikeObject.cpp b/Source/Processors/Visualization/SpikeObject.cpp index 5346b76012f19033362e8f0aa0178c27efbdd64c..3f20f647d5c68753348e993889ff85af6ce31cce 100755 --- a/Source/Processors/Visualization/SpikeObject.cpp +++ b/Source/Processors/Visualization/SpikeObject.cpp @@ -25,157 +25,172 @@ #include "memory.h" #include <stdlib.h> #include "time.h" - + // Simple method for serializing a SpikeObject into a string of bytes -int packSpike(SpikeObject *s, uint8_t* buffer, int bufferSize){ - - //int reqBytes = 1 + 4 + 2 + 2 + 2 + 2 * s->nChannels * s->nSamples + 2 * s->nChannels * 2; - - int idx = 0; - - s->eventType = SPIKE_EVENT_CODE; - - - memcpy(buffer+idx, &(s->eventType), 1); - idx += 1; - - memcpy(buffer+idx, &(s->timestamp), 8); - idx += 8; - - memcpy(buffer+idx, &(s->source), 2); - idx +=2; - - memcpy(buffer+idx, &(s->nChannels), 2); - idx +=2; - - memcpy(buffer+idx, &(s->nSamples), 2); - idx +=2; - - memcpy(buffer+idx, &(s->data), s->nChannels * s->nSamples * 2); - idx += s->nChannels * s->nSamples * 2; - - memcpy(buffer+idx, &(s->gain), s->nChannels * 2); - idx += s->nChannels * 2; - - memcpy(buffer+idx, &(s->threshold), s->nChannels * 2); - idx += s->nChannels * 2; - - - - if (idx >= MAX_SPIKE_BUFFER_LEN){ - std::cout<<"Spike is larger than it should be. Size was:"<<idx<<" Max Size is:"<<MAX_SPIKE_BUFFER_LEN<<std::endl; - - } - // makeBufferValid(buffer, bufferSize); - - return idx; +int packSpike(SpikeObject* s, uint8_t* buffer, int bufferSize) +{ + + //int reqBytes = 1 + 4 + 2 + 2 + 2 + 2 * s->nChannels * s->nSamples + 2 * s->nChannels * 2; + + int idx = 0; + + s->eventType = SPIKE_EVENT_CODE; + + + memcpy(buffer+idx, &(s->eventType), 1); + idx += 1; + + memcpy(buffer+idx, &(s->timestamp), 8); + idx += 8; + + memcpy(buffer+idx, &(s->source), 2); + idx +=2; + + memcpy(buffer+idx, &(s->nChannels), 2); + idx +=2; + + memcpy(buffer+idx, &(s->nSamples), 2); + idx +=2; + + memcpy(buffer+idx, &(s->data), s->nChannels * s->nSamples * 2); + idx += s->nChannels * s->nSamples * 2; + + memcpy(buffer+idx, &(s->gain), s->nChannels * 2); + idx += s->nChannels * 2; + + memcpy(buffer+idx, &(s->threshold), s->nChannels * 2); + idx += s->nChannels * 2; + + + + if (idx >= MAX_SPIKE_BUFFER_LEN) + { + std::cout<<"Spike is larger than it should be. Size was:"<<idx<<" Max Size is:"<<MAX_SPIKE_BUFFER_LEN<<std::endl; + + } + // makeBufferValid(buffer, bufferSize); + + return idx; } // Simple method for deserializing a string of bytes into a Spike object -bool unpackSpike(SpikeObject *s, uint8_t* buffer, int bufferSize){ - // if !(isBufferValid(buffer, bufferSize)); - // return false; +bool unpackSpike(SpikeObject* s, const uint8_t* buffer, int bufferSize) +{ + // if !(isBufferValid(buffer, bufferSize)); + // return false; + + int idx = 0; - int idx = 0; + memcpy(&(s->eventType), buffer+idx, 1); + idx += 1; - memcpy (&(s->eventType), buffer+idx, 1); - idx += 1; - - memcpy( &(s->timestamp), buffer+idx, 8); - idx += 8; + memcpy(&(s->timestamp), buffer+idx, 8); + idx += 8; - memcpy( &(s->source), buffer+idx, 2); - idx += 2; + memcpy(&(s->source), buffer+idx, 2); + idx += 2; - memcpy( &(s->nChannels), buffer+idx, 2); - idx +=2; + memcpy(&(s->nChannels), buffer+idx, 2); + idx +=2; - memcpy( &(s->nSamples), buffer+idx, 2); - idx +=2; + memcpy(&(s->nSamples), buffer+idx, 2); + idx +=2; - memcpy( &(s->data), buffer+idx, s->nChannels * s->nSamples * 2); - idx += s->nChannels * s->nSamples * 2; + memcpy(&(s->data), buffer+idx, s->nChannels * s->nSamples * 2); + idx += s->nChannels * s->nSamples * 2; - memcpy( &(s->gain), buffer+idx, s->nChannels * 2); - idx += s->nChannels * 2; + memcpy(&(s->gain), buffer+idx, s->nChannels * 2); + idx += s->nChannels * 2; + + memcpy(&(s->threshold), buffer+idx, s->nChannels *2); + idx += s->nChannels * 2; + + // if (idx >= bufferSize) + // std::cout<<"Buffer Overrun! More data extracted than was given!"<<std::endl; - memcpy( &(s->threshold), buffer+idx, s->nChannels *2); - idx += s->nChannels * 2; - -// if (idx >= bufferSize) -// std::cout<<"Buffer Overrun! More data extracted than was given!"<<std::endl; - return true; - + } // Checks the validity of the buffer, this should be run before unpacking and after packing the buffer -bool isBufferValid(uint8_t *buffer, int bufferSize){ +bool isBufferValid(uint8_t* buffer, int bufferSize) +{ - if (! CHECK_BUFFER_VALIDITY ) - return true; + if (! CHECK_BUFFER_VALIDITY) + return true; - uint16_t runningSum = 0; - uint16_t value = 0; - - int idx; + uint16_t runningSum = 0; + uint16_t value = 0; - for (idx = 0; idx < bufferSize-2; idx += 2){ - memcpy(buffer + idx, &value, 2); - runningSum += value; - } + int idx; + + for (idx = 0; idx < bufferSize-2; idx += 2) + { + memcpy(buffer + idx, &value, 2); + runningSum += value; + } - uint16_t integrityCheck = 0; - memcpy(buffer + idx, &integrityCheck, 2); + uint16_t integrityCheck = 0; + memcpy(buffer + idx, &integrityCheck, 2); - std::cout<<integrityCheck<<" == "<< runningSum <<std::endl; - - return (integrityCheck == runningSum); + std::cout<<integrityCheck<<" == "<< runningSum <<std::endl; + + return (integrityCheck == runningSum); } -void makeBufferValid(uint8_t *buffer, int bufferSize){ - if (! CHECK_BUFFER_VALIDITY ) - return; +void makeBufferValid(uint8_t* buffer, int bufferSize) +{ + if (! CHECK_BUFFER_VALIDITY) + return; + + uint16_t runningSum = 0; + uint16_t value = 0; - uint16_t runningSum = 0; - uint16_t value = 0; - - int idx; + int idx; - for (idx = 0; idx < bufferSize-2; idx += 2){ - memcpy(buffer + idx, &value, 2); - runningSum += value; - } + for (idx = 0; idx < bufferSize-2; idx += 2) + { + memcpy(buffer + idx, &value, 2); + runningSum += value; + } - memcpy(&runningSum, buffer + idx, 2); + memcpy(&runningSum, buffer + idx, 2); } -void generateSimulatedSpike(SpikeObject *s, uint64_t timestamp, int noise) +void generateSimulatedSpike(SpikeObject* s, uint64_t timestamp, int noise) { - //std::cout<<"generateSimulatedSpike()"<<std::endl; - - uint16_t trace[][32] = - { - { 880, 900, 940, 1040, 1290, 1790, 2475, 2995, 3110, 2890, - 2505, 2090, 1720, 1410, 1155, 945, 775, 635, 520, 420, - 340, 265, 205, 155, 115, 80, 50, 34, 10, 34, 50, 80}, - { 1040, 1090, 1190, 1350, 1600, 1960, 2380, 2790, 3080, 3140, - 2910, 2430, 1810, 1180, 680, 380, 270, 320, 460, 630, - 770, 870, 940, 970, 990, 1000, 1000, 1000, 1000, 1000, 1000, 1000}, - { 1000, 1000, 1000, 1000, 1000, 1040, 1140, 1440, 2040, 2240, - 2400, 2340, 2280, 1880, 1640, 920, 520, 300, 140, 040, - 20, 20, 40, 100, 260, 500, 740, 900, 960, 1000, 1000, 1000} + //std::cout<<"generateSimulatedSpike()"<<std::endl; + + uint16_t trace[][32] = + { + { + 880, 900, 940, 1040, 1290, 1790, 2475, 2995, 3110, 2890, + 2505, 2090, 1720, 1410, 1155, 945, 775, 635, 520, 420, + 340, 265, 205, 155, 115, 80, 50, 34, 10, 34, 50, 80 + }, + { + 1040, 1090, 1190, 1350, 1600, 1960, 2380, 2790, 3080, 3140, + 2910, 2430, 1810, 1180, 680, 380, 270, 320, 460, 630, + 770, 870, 940, 970, 990, 1000, 1000, 1000, 1000, 1000, 1000, 1000 + }, + { + 1000, 1000, 1000, 1000, 1000, 1040, 1140, 1440, 2040, 2240, + 2400, 2340, 2280, 1880, 1640, 920, 520, 300, 140, 040, + 20, 20, 40, 100, 260, 500, 740, 900, 960, 1000, 1000, 1000 + } }; // We don't want to shift the waveform but scale it, and we don't want to scale // the baseline, just the peak of the waveform - float scale[32] = - { 1.0, 1.0, 1.0, 1.0, 1.1, 1.2, 1.3, 1.5, 1.7, 2.0, 2.1, 2.2, 2.1, 2.0, 1.7, 1.5, - 1.3, 1.2, 1.1, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; + float scale[32] = + { + 1.0, 1.0, 1.0, 1.0, 1.1, 1.2, 1.3, 1.5, 1.7, 2.0, 2.1, 2.2, 2.1, 2.0, 1.7, 1.5, + 1.3, 1.2, 1.1, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 + }; uint16_t gain = 2000; @@ -185,7 +200,7 @@ void generateSimulatedSpike(SpikeObject *s, uint64_t timestamp, int noise) s->nChannels = 4; s->nSamples = 32; int idx=0; - + int waveType = rand()%2; // Pick one of the three predefined waveshapes to generate int shift = 1000 + 32768; @@ -193,50 +208,55 @@ void generateSimulatedSpike(SpikeObject *s, uint64_t timestamp, int noise) { s->gain[i] = gain; s->threshold[i] = 4000; - double scaleExponent = (double)(rand()%26+2) / 10.0f; // Scale the wave between 50% and 150% - - for (int j=0; j<32; j++){ - - int n = 0; - if (noise>0){ - n = rand() % noise - noise/2; - } + double scaleExponent = (double)(rand()%26+2) / 10.0f; // Scale the wave between 50% and 150% + + for (int j=0; j<32; j++) + { + + int n = 0; + if (noise>0) + { + n = rand() % noise - noise/2; + } s->data[idx] = (trace[waveType][j] + n) * pow(double(scale[j]),scaleExponent) + shift; idx = idx+1; } } - + } -void generateEmptySpike(SpikeObject *s, int nChannels){ +void generateEmptySpike(SpikeObject* s, int nChannels) +{ - s->eventType = SPIKE_EVENT_CODE; - s->timestamp = 0; + s->eventType = SPIKE_EVENT_CODE; + s->timestamp = 0; s->source = 0; s->nChannels = 4; s->nSamples = 32; - + int idx = 0; for (int i=0; i<4; i++) { s->gain[i] = 0; s->threshold[i] = 0; - for (int j=0; j<32; j++){ + for (int j=0; j<32; j++) + { s->data[idx] = 0; idx = idx+1; } } } -void printSpike(SpikeObject *s){ - - std::cout<< " SpikeObject:\n"; - std::cout<< "\tTimestamp:" << s->timestamp; - std::cout<< "\tSource:" << s->source; - std::cout<< "\tnChannels:" <<s->nChannels; - std::cout<<"\tnSamples" << s->nSamples; - std::cout<<"\n\t 8 Data Samples:"; - for (int i=0; i<8; i++) - std::cout<<s->data+i<<" "; - std::cout<<std::endl; +void printSpike(SpikeObject* s) +{ + + std::cout<< " SpikeObject:\n"; + std::cout<< "\tTimestamp:" << s->timestamp; + std::cout<< "\tSource:" << s->source; + std::cout<< "\tnChannels:" <<s->nChannels; + std::cout<<"\tnSamples" << s->nSamples; + std::cout<<"\n\t 8 Data Samples:"; + for (int i=0; i<8; i++) + std::cout<<s->data+i<<" "; + std::cout<<std::endl; } diff --git a/Source/Processors/Visualization/SpikeObject.h b/Source/Processors/Visualization/SpikeObject.h index f2cf8076b524befce9ffadccc02ab1b8aff16ea7..b32f3aaa8f04b3abf1b9e1b65efeb4683cb9963a 100755 --- a/Source/Processors/Visualization/SpikeObject.h +++ b/Source/Processors/Visualization/SpikeObject.h @@ -40,124 +40,135 @@ For transmission between processors SpikeObjects must be packaged up into buffers that can fit into MidiEvents The following two methods can be used to package the above spike object into a buffer and unpackage a buffer - into a SpikeObject. + into a SpikeObject. - The buffer is LittleEndian (thank Intel) and the byte order is the same as the SpikeObject definition. + The buffer is LittleEndian (thank Intel) and the byte order is the same as the SpikeObject definition. IE. the first 2 bytes are the timestamp, the next two bytes are the source identifier, etc... with the last set of bytes corresponding to the thresholds of the different channels. Finally the buffer will have an additional byte on the end that is used to check the integerity of the entire package. The way this works is the buffer is divivded up into a series of 16 bit unsigned integers. The sum of all these integers - (except the last 16 bit integer) is taken and the sum should equal that 16 bit integer. If not then the data is corrupted + (except the last 16 bit integer) is taken and the sum should equal that 16 bit integer. If not then the data is corrupted and should be dropped or dealt with another way. */ -struct SpikeObject{ +struct SpikeObject +{ - uint8_t eventType; - uint64_t timestamp; - uint16_t source; - uint16_t nChannels; - uint16_t nSamples; - uint16_t data[MAX_NUMBER_OF_SPIKE_CHANNELS * MAX_NUMBER_OF_SPIKE_CHANNEL_SAMPLES]; - uint16_t gain[MAX_NUMBER_OF_SPIKE_CHANNELS]; - uint16_t threshold[MAX_NUMBER_OF_SPIKE_CHANNELS]; + uint8_t eventType; + uint64_t timestamp; + uint16_t source; + uint16_t nChannels; + uint16_t nSamples; + uint16_t data[MAX_NUMBER_OF_SPIKE_CHANNELS* MAX_NUMBER_OF_SPIKE_CHANNEL_SAMPLES]; + uint16_t gain[MAX_NUMBER_OF_SPIKE_CHANNELS]; + uint16_t threshold[MAX_NUMBER_OF_SPIKE_CHANNELS]; }; /** Simple method for serializing a SpikeObject into a string of bytes, returns true is the packaged spike buffer is valid */ -int packSpike(SpikeObject *s, uint8_t* buffer, int bufferLength); +int packSpike(SpikeObject* s, uint8_t* buffer, int bufferLength); /** Simple method for deserializing a string of bytes into a Spike object, returns true is the provided spike buffer is valid */ -bool unpackSpike(SpikeObject *s, uint8_t* buffer, int bufferLength); +bool unpackSpike(SpikeObject* s, const uint8_t* buffer, int bufferLength); /** Checks the validity of the buffer, this should be run before unpacking the buffer */ -bool isBufferValid(uint8_t *buffer, int bufferLength); +bool isBufferValid(uint8_t* buffer, int bufferLength); /** Computes the validity value for the buffer, this should be called after packing the buffer */ -void makeBufferValid(uint8_t *buffer, int bufferLength); +void makeBufferValid(uint8_t* buffer, int bufferLength); -/** Helper function for generating fake spikes in the absence of a real spike source. +/** Helper function for generating fake spikes in the absence of a real spike source. Can be used to generate a sign wave with a fixed Frequency of 1000 hz or a basic spike waveform Additionally noise can be added to the waveform for help in diagnosing projection plots */ -void generateSimulatedSpike(SpikeObject *s, uint64_t timestamp, int noise); +void generateSimulatedSpike(SpikeObject* s, uint64_t timestamp, int noise); // Define the << operator for the SpikeObject // std::ostream& operator<<(std::ostream &strm, const SpikeObject s); /** Helper function for zeroing out a spike object with a specified number of channels */ -void generateEmptySpike(SpikeObject *s, int nChannels); +void generateEmptySpike(SpikeObject* s, int nChannels); -void printSpike(SpikeObject *s); +void printSpike(SpikeObject* s); static const int N_WAVEFORM_SAMPLES = 120; static const double SPIKE_WAVEFORMS[5][N_WAVEFORM_SAMPLES] = { -{ 1.0000, 1.0008, 1.0016, 1.0023, 1.0030, 1.0030, 1.0031, 1.0031, 1.0032, 1.0035, 1.0038, 1.0041, - 1.0053, 1.0074, 1.0095, 1.0116, 1.0167, 1.0235, 1.0303, 1.0370, 1.0478, 1.0596, 1.0713, 1.0831, - 1.1006, 1.1183, 1.1361, 1.1544, 1.1768, 1.1992, 1.2217, 1.2415, 1.2550, 1.2685, 1.2820, 1.2881, - 1.2853, 1.2826, 1.2798, 1.2708, 1.2579, 1.2451, 1.2322, 1.2174, 1.2019, 1.1865, 1.1710, 1.1569, - 1.1428, 1.1288, 1.1149, 1.1031, 1.0912, 1.0793, 1.0681, 1.0589, 1.0496, 1.0404, 1.0318, 1.0240, - 1.0163, 1.0085, 1.0015, 0.9950, 0.9886, 0.9821, 0.9761, 0.9702, 0.9643, 0.9585, 0.9534, 0.9484, - 0.9434, 0.9385, 0.9348, 0.9311, 0.9273, 0.9239, 0.9215, 0.9191, 0.9166, 0.9142, 0.9118, 0.9094, - 0.9070, 0.9048, 0.9028, 0.9008, 0.8987, 0.8968, 0.8948, 0.8928, 0.8908, 0.8893, 0.8878, 0.8862, - 0.8847, 0.8829, 0.8811, 0.8794, 0.8777, 0.8764, 0.8751, 0.8738, 0.8727, 0.8719, 0.8710, 0.8701, - 0.8699, 0.8704, 0.8708, 0.8713, 0.8720, 0.8729, 0.8738, 0.8747, 0.8755, 0.8763, 0.8772, 0.8780}, -{ 1.0000, 0.9998, 0.9996, 0.9995, 0.9993, 0.9996, 0.9999, 1.0002, 1.0007, 1.0014, 1.0021, 1.0028, - 1.0041, 1.0062, 1.0083, 1.0103, 1.0154, 1.0220, 1.0286, 1.0353, 1.0470, 1.0599, 1.0729, 1.0858, - 1.1072, 1.1288, 1.1505, 1.1724, 1.1963, 1.2201, 1.2439, 1.2634, 1.2724, 1.2813, 1.2903, 1.2911, - 1.2822, 1.2733, 1.2643, 1.2506, 1.2339, 1.2172, 1.2006, 1.1841, 1.1678, 1.1514, 1.1351, 1.1222, - 1.1096, 1.0970, 1.0846, 1.0743, 1.0639, 1.0536, 1.0437, 1.0355, 1.0272, 1.0190, 1.0113, 1.0044, - 0.9975, 0.9906, 0.9847, 0.9794, 0.9742, 0.9689, 0.9645, 0.9603, 0.9561, 0.9520, 0.9485, 0.9451, - 0.9417, 0.9384, 0.9356, 0.9327, 0.9299, 0.9272, 0.9253, 0.9233, 0.9213, 0.9191, 0.9163, 0.9136, - 0.9109, 0.9086, 0.9067, 0.9047, 0.9028, 0.9009, 0.8991, 0.8972, 0.8954, 0.8940, 0.8927, 0.8913, - 0.8900, 0.8889, 0.8878, 0.8867, 0.8857, 0.8851, 0.8846, 0.8840, 0.8835, 0.8830, 0.8825, 0.8821, - 0.8823, 0.8830, 0.8838, 0.8846, 0.8858, 0.8872, 0.8885, 0.8899, 0.8918, 0.8937, 0.8957, 0.8977}, -{ 1.0000, 1.0001, 1.0003, 1.0004, 1.0005, 1.0003, 1.0002, 1.0000, 0.9997, 0.9992, 0.9988, 0.9983, - 0.9982, 0.9987, 0.9991, 0.9995, 1.0025, 1.0069, 1.0114, 1.0158, 1.0252, 1.0356, 1.0461, 1.0566, - 1.0732, 1.0900, 1.1068, 1.1239, 1.1425, 1.1612, 1.1799, 1.1957, 1.2043, 1.2129, 1.2215, 1.2241, - 1.2194, 1.2147, 1.2100, 1.2006, 1.1881, 1.1757, 1.1632, 1.1502, 1.1370, 1.1237, 1.1105, 1.0990, - 1.0876, 1.0761, 1.0650, 1.0558, 1.0467, 1.0376, 1.0290, 1.0218, 1.0146, 1.0075, 1.0009, 0.9953, - 0.9896, 0.9839, 0.9787, 0.9739, 0.9690, 0.9642, 0.9599, 0.9559, 0.9518, 0.9478, 0.9442, 0.9408, - 0.9373, 0.9339, 0.9308, 0.9277, 0.9246, 0.9215, 0.9188, 0.9160, 0.9132, 0.9107, 0.9087, 0.9066, - 0.9045, 0.9026, 0.9009, 0.8991, 0.8973, 0.8959, 0.8945, 0.8932, 0.8919, 0.8907, 0.8895, 0.8883, - 0.8872, 0.8861, 0.8850, 0.8839, 0.8829, 0.8824, 0.8820, 0.8815, 0.8813, 0.8818, 0.8822, 0.8827, - 0.8834, 0.8844, 0.8853, 0.8863, 0.8872, 0.8881, 0.8890, 0.8899, 0.8910, 0.8921, 0.8932, 0.8943}, -{ 1.0000, 1.0000, 1.0001, 1.0001, 1.0002, 1.0002, 1.0002, 1.0002, 1.0001, 1.0000, 0.9999, 0.9997, - 1.0000, 1.0008, 1.0016, 1.0024, 1.0053, 1.0095, 1.0137, 1.0179, 1.0261, 1.0353, 1.0444, 1.0536, - 1.0685, 1.0836, 1.0987, 1.1139, 1.1295, 1.1452, 1.1609, 1.1740, 1.1805, 1.1870, 1.1936, 1.1952, - 1.1909, 1.1866, 1.1823, 1.1745, 1.1645, 1.1545, 1.1445, 1.1335, 1.1221, 1.1108, 1.0995, 1.0894, - 1.0794, 1.0694, 1.0596, 1.0514, 1.0433, 1.0351, 1.0274, 1.0208, 1.0142, 1.0077, 1.0016, 0.9963, - 0.9910, 0.9858, 0.9812, 0.9771, 0.9731, 0.9690, 0.9657, 0.9627, 0.9597, 0.9567, 0.9541, 0.9515, - 0.9489, 0.9464, 0.9440, 0.9417, 0.9393, 0.9371, 0.9352, 0.9333, 0.9314, 0.9297, 0.9282, 0.9267, - 0.9253, 0.9238, 0.9224, 0.9210, 0.9196, 0.9184, 0.9171, 0.9159, 0.9146, 0.9139, 0.9131, 0.9124, - 0.9117, 0.9111, 0.9105, 0.9100, 0.9094, 0.9091, 0.9087, 0.9084, 0.9082, 0.9081, 0.9080, 0.9080, - 0.9080, 0.9082, 0.9083, 0.9085, 0.9089, 0.9095, 0.9100, 0.9106, 0.9116, 0.9127, 0.9138, 0.9148}, -{ 1.0000, 0.9997, 0.9994, 0.9990, 0.9987, 0.9982, 0.9977, 0.9972, 0.9969, 0.9972, 0.9975, 0.9978, - 0.9987, 1.0002, 1.0017, 1.0032, 1.0063, 1.0103, 1.0144, 1.0184, 1.0251, 1.0325, 1.0400, 1.0474, - 1.0574, 1.0676, 1.0777, 1.0880, 1.0996, 1.1111, 1.1227, 1.1332, 1.1410, 1.1489, 1.1567, 1.1612, - 1.1617, 1.1622, 1.1627, 1.1586, 1.1516, 1.1446, 1.1375, 1.1282, 1.1182, 1.1082, 1.0981, 1.0885, - 1.0789, 1.0693, 1.0598, 1.0520, 1.0442, 1.0364, 1.0290, 1.0227, 1.0165, 1.0103, 1.0046, 0.9998, - 0.9950, 0.9901, 0.9859, 0.9821, 0.9784, 0.9746, 0.9715, 0.9686, 0.9658, 0.9629, 0.9603, 0.9578, - 0.9553, 0.9528, 0.9505, 0.9481, 0.9458, 0.9435, 0.9412, 0.9390, 0.9367, 0.9347, 0.9331, 0.9314, - 0.9298, 0.9285, 0.9275, 0.9265, 0.9255, 0.9247, 0.9239, 0.9232, 0.9224, 0.9218, 0.9212, 0.9206, - 0.9200, 0.9197, 0.9194, 0.9190, 0.9187, 0.9184, 0.9181, 0.9179, 0.9177, 0.9178, 0.9179, 0.9180, - 0.9184, 0.9189, 0.9194, 0.9199, 0.9207, 0.9215, 0.9224, 0.9233, 0.9240, 0.9247, 0.9254, 0.9261} + { + 1.0000, 1.0008, 1.0016, 1.0023, 1.0030, 1.0030, 1.0031, 1.0031, 1.0032, 1.0035, 1.0038, 1.0041, + 1.0053, 1.0074, 1.0095, 1.0116, 1.0167, 1.0235, 1.0303, 1.0370, 1.0478, 1.0596, 1.0713, 1.0831, + 1.1006, 1.1183, 1.1361, 1.1544, 1.1768, 1.1992, 1.2217, 1.2415, 1.2550, 1.2685, 1.2820, 1.2881, + 1.2853, 1.2826, 1.2798, 1.2708, 1.2579, 1.2451, 1.2322, 1.2174, 1.2019, 1.1865, 1.1710, 1.1569, + 1.1428, 1.1288, 1.1149, 1.1031, 1.0912, 1.0793, 1.0681, 1.0589, 1.0496, 1.0404, 1.0318, 1.0240, + 1.0163, 1.0085, 1.0015, 0.9950, 0.9886, 0.9821, 0.9761, 0.9702, 0.9643, 0.9585, 0.9534, 0.9484, + 0.9434, 0.9385, 0.9348, 0.9311, 0.9273, 0.9239, 0.9215, 0.9191, 0.9166, 0.9142, 0.9118, 0.9094, + 0.9070, 0.9048, 0.9028, 0.9008, 0.8987, 0.8968, 0.8948, 0.8928, 0.8908, 0.8893, 0.8878, 0.8862, + 0.8847, 0.8829, 0.8811, 0.8794, 0.8777, 0.8764, 0.8751, 0.8738, 0.8727, 0.8719, 0.8710, 0.8701, + 0.8699, 0.8704, 0.8708, 0.8713, 0.8720, 0.8729, 0.8738, 0.8747, 0.8755, 0.8763, 0.8772, 0.8780 + }, + { + 1.0000, 0.9998, 0.9996, 0.9995, 0.9993, 0.9996, 0.9999, 1.0002, 1.0007, 1.0014, 1.0021, 1.0028, + 1.0041, 1.0062, 1.0083, 1.0103, 1.0154, 1.0220, 1.0286, 1.0353, 1.0470, 1.0599, 1.0729, 1.0858, + 1.1072, 1.1288, 1.1505, 1.1724, 1.1963, 1.2201, 1.2439, 1.2634, 1.2724, 1.2813, 1.2903, 1.2911, + 1.2822, 1.2733, 1.2643, 1.2506, 1.2339, 1.2172, 1.2006, 1.1841, 1.1678, 1.1514, 1.1351, 1.1222, + 1.1096, 1.0970, 1.0846, 1.0743, 1.0639, 1.0536, 1.0437, 1.0355, 1.0272, 1.0190, 1.0113, 1.0044, + 0.9975, 0.9906, 0.9847, 0.9794, 0.9742, 0.9689, 0.9645, 0.9603, 0.9561, 0.9520, 0.9485, 0.9451, + 0.9417, 0.9384, 0.9356, 0.9327, 0.9299, 0.9272, 0.9253, 0.9233, 0.9213, 0.9191, 0.9163, 0.9136, + 0.9109, 0.9086, 0.9067, 0.9047, 0.9028, 0.9009, 0.8991, 0.8972, 0.8954, 0.8940, 0.8927, 0.8913, + 0.8900, 0.8889, 0.8878, 0.8867, 0.8857, 0.8851, 0.8846, 0.8840, 0.8835, 0.8830, 0.8825, 0.8821, + 0.8823, 0.8830, 0.8838, 0.8846, 0.8858, 0.8872, 0.8885, 0.8899, 0.8918, 0.8937, 0.8957, 0.8977 + }, + { + 1.0000, 1.0001, 1.0003, 1.0004, 1.0005, 1.0003, 1.0002, 1.0000, 0.9997, 0.9992, 0.9988, 0.9983, + 0.9982, 0.9987, 0.9991, 0.9995, 1.0025, 1.0069, 1.0114, 1.0158, 1.0252, 1.0356, 1.0461, 1.0566, + 1.0732, 1.0900, 1.1068, 1.1239, 1.1425, 1.1612, 1.1799, 1.1957, 1.2043, 1.2129, 1.2215, 1.2241, + 1.2194, 1.2147, 1.2100, 1.2006, 1.1881, 1.1757, 1.1632, 1.1502, 1.1370, 1.1237, 1.1105, 1.0990, + 1.0876, 1.0761, 1.0650, 1.0558, 1.0467, 1.0376, 1.0290, 1.0218, 1.0146, 1.0075, 1.0009, 0.9953, + 0.9896, 0.9839, 0.9787, 0.9739, 0.9690, 0.9642, 0.9599, 0.9559, 0.9518, 0.9478, 0.9442, 0.9408, + 0.9373, 0.9339, 0.9308, 0.9277, 0.9246, 0.9215, 0.9188, 0.9160, 0.9132, 0.9107, 0.9087, 0.9066, + 0.9045, 0.9026, 0.9009, 0.8991, 0.8973, 0.8959, 0.8945, 0.8932, 0.8919, 0.8907, 0.8895, 0.8883, + 0.8872, 0.8861, 0.8850, 0.8839, 0.8829, 0.8824, 0.8820, 0.8815, 0.8813, 0.8818, 0.8822, 0.8827, + 0.8834, 0.8844, 0.8853, 0.8863, 0.8872, 0.8881, 0.8890, 0.8899, 0.8910, 0.8921, 0.8932, 0.8943 + }, + { + 1.0000, 1.0000, 1.0001, 1.0001, 1.0002, 1.0002, 1.0002, 1.0002, 1.0001, 1.0000, 0.9999, 0.9997, + 1.0000, 1.0008, 1.0016, 1.0024, 1.0053, 1.0095, 1.0137, 1.0179, 1.0261, 1.0353, 1.0444, 1.0536, + 1.0685, 1.0836, 1.0987, 1.1139, 1.1295, 1.1452, 1.1609, 1.1740, 1.1805, 1.1870, 1.1936, 1.1952, + 1.1909, 1.1866, 1.1823, 1.1745, 1.1645, 1.1545, 1.1445, 1.1335, 1.1221, 1.1108, 1.0995, 1.0894, + 1.0794, 1.0694, 1.0596, 1.0514, 1.0433, 1.0351, 1.0274, 1.0208, 1.0142, 1.0077, 1.0016, 0.9963, + 0.9910, 0.9858, 0.9812, 0.9771, 0.9731, 0.9690, 0.9657, 0.9627, 0.9597, 0.9567, 0.9541, 0.9515, + 0.9489, 0.9464, 0.9440, 0.9417, 0.9393, 0.9371, 0.9352, 0.9333, 0.9314, 0.9297, 0.9282, 0.9267, + 0.9253, 0.9238, 0.9224, 0.9210, 0.9196, 0.9184, 0.9171, 0.9159, 0.9146, 0.9139, 0.9131, 0.9124, + 0.9117, 0.9111, 0.9105, 0.9100, 0.9094, 0.9091, 0.9087, 0.9084, 0.9082, 0.9081, 0.9080, 0.9080, + 0.9080, 0.9082, 0.9083, 0.9085, 0.9089, 0.9095, 0.9100, 0.9106, 0.9116, 0.9127, 0.9138, 0.9148 + }, + { + 1.0000, 0.9997, 0.9994, 0.9990, 0.9987, 0.9982, 0.9977, 0.9972, 0.9969, 0.9972, 0.9975, 0.9978, + 0.9987, 1.0002, 1.0017, 1.0032, 1.0063, 1.0103, 1.0144, 1.0184, 1.0251, 1.0325, 1.0400, 1.0474, + 1.0574, 1.0676, 1.0777, 1.0880, 1.0996, 1.1111, 1.1227, 1.1332, 1.1410, 1.1489, 1.1567, 1.1612, + 1.1617, 1.1622, 1.1627, 1.1586, 1.1516, 1.1446, 1.1375, 1.1282, 1.1182, 1.1082, 1.0981, 1.0885, + 1.0789, 1.0693, 1.0598, 1.0520, 1.0442, 1.0364, 1.0290, 1.0227, 1.0165, 1.0103, 1.0046, 0.9998, + 0.9950, 0.9901, 0.9859, 0.9821, 0.9784, 0.9746, 0.9715, 0.9686, 0.9658, 0.9629, 0.9603, 0.9578, + 0.9553, 0.9528, 0.9505, 0.9481, 0.9458, 0.9435, 0.9412, 0.9390, 0.9367, 0.9347, 0.9331, 0.9314, + 0.9298, 0.9285, 0.9275, 0.9265, 0.9255, 0.9247, 0.9239, 0.9232, 0.9224, 0.9218, 0.9212, 0.9206, + 0.9200, 0.9197, 0.9194, 0.9190, 0.9187, 0.9184, 0.9181, 0.9179, 0.9177, 0.9178, 0.9179, 0.9180, + 0.9184, 0.9189, 0.9194, 0.9199, 0.9207, 0.9215, 0.9224, 0.9233, 0.9240, 0.9247, 0.9254, 0.9261 + } }; -static const double WAVEFORM_SCALE[N_WAVEFORM_SAMPLES] = +static const double WAVEFORM_SCALE[N_WAVEFORM_SAMPLES] = { - 1.0027, 1.0035, 1.0045, 1.0057, 1.0073, 1.0093, 1.0117, 1.0146, 1.0181, 1.0223, 1.0273, 1.0331, - 1.0398, 1.0474, 1.0559, 1.0652, 1.0754, 1.0862, 1.0976, 1.1092, 1.1208, 1.1321, 1.1429, 1.1526, - 1.1612, 1.1681, 1.1733, 1.1764, 1.1774, 1.1763, 1.1730, 1.1678, 1.1607, 1.1520, 1.1420, 1.1310, - 1.1194, 1.1075, 1.0956, 1.0840, 1.0729, 1.0625, 1.0529, 1.0442, 1.0365, 1.0298, 1.0240, 1.0190, - 1.0149, 1.0115, 1.0087, 1.0065, 1.0046, 1.0031, 1.0019, 1.0008, 0.9998, 0.9988, 0.9978, 0.9966, - 0.9953, 0.9937, 0.9919, 0.9897, 0.9872, 0.9842, 0.9808, 0.9769, 0.9726, 0.9679, 0.9629, 0.9575, - 0.9519, 0.9462, 0.9406, 0.9351, 0.9300, 0.9253, 0.9213, 0.9180, 0.9155, 0.9140, 0.9135, 0.9140, - 0.9155, 0.9180, 0.9213, 0.9253, 0.9300, 0.9351, 0.9406, 0.9462, 0.9519, 0.9574, 0.9628, 0.9678, - 0.9725, 0.9768, 0.9806, 0.9840, 0.9869, 0.9894, 0.9915, 0.9933, 0.9948, 0.9959, 0.9969, 0.9976, - 0.9982, 0.9987, 0.9990, 0.9993, 0.9995, 0.9996, 0.9997, 0.9998, 0.9999, 0.9999, 0.9999, 1.0000, - }; + 1.0027, 1.0035, 1.0045, 1.0057, 1.0073, 1.0093, 1.0117, 1.0146, 1.0181, 1.0223, 1.0273, 1.0331, + 1.0398, 1.0474, 1.0559, 1.0652, 1.0754, 1.0862, 1.0976, 1.1092, 1.1208, 1.1321, 1.1429, 1.1526, + 1.1612, 1.1681, 1.1733, 1.1764, 1.1774, 1.1763, 1.1730, 1.1678, 1.1607, 1.1520, 1.1420, 1.1310, + 1.1194, 1.1075, 1.0956, 1.0840, 1.0729, 1.0625, 1.0529, 1.0442, 1.0365, 1.0298, 1.0240, 1.0190, + 1.0149, 1.0115, 1.0087, 1.0065, 1.0046, 1.0031, 1.0019, 1.0008, 0.9998, 0.9988, 0.9978, 0.9966, + 0.9953, 0.9937, 0.9919, 0.9897, 0.9872, 0.9842, 0.9808, 0.9769, 0.9726, 0.9679, 0.9629, 0.9575, + 0.9519, 0.9462, 0.9406, 0.9351, 0.9300, 0.9253, 0.9213, 0.9180, 0.9155, 0.9140, 0.9135, 0.9140, + 0.9155, 0.9180, 0.9213, 0.9253, 0.9300, 0.9351, 0.9406, 0.9462, 0.9519, 0.9574, 0.9628, 0.9678, + 0.9725, 0.9768, 0.9806, 0.9840, 0.9869, 0.9894, 0.9915, 0.9933, 0.9948, 0.9959, 0.9969, 0.9976, + 0.9982, 0.9987, 0.9990, 0.9993, 0.9995, 0.9996, 0.9997, 0.9998, 0.9999, 0.9999, 0.9999, 1.0000, +}; #endif //SPIKEOBJECT_H_ \ No newline at end of file diff --git a/Source/Processors/Visualization/SpikePlotting/BaseUIElement.cpp b/Source/Processors/Visualization/SpikePlotting/BaseUIElement.cpp index ef53f11b32b3d4a02993bc4c3d27a17313b0292c..29cd1e79fbb47a42f8bed5a0f3201ea86ffa5214 100755 --- a/Source/Processors/Visualization/SpikePlotting/BaseUIElement.cpp +++ b/Source/Processors/Visualization/SpikePlotting/BaseUIElement.cpp @@ -1,90 +1,102 @@ #include "BaseUIElement.h" BaseUIElement::BaseUIElement(): - xpos(0), ypos(0), yOffset(0), - height(100), width(100), enabled(true), padding(0) + xpos(0), ypos(0), yOffset(0), + height(100), width(100), enabled(true), padding(0) { } BaseUIElement::BaseUIElement(int x, int y, double w, double h): - yOffset(0), enabled(true), padding(0) + yOffset(0), enabled(true), padding(0) { - xpos = x+padding; - ypos = y+padding; - width = w-padding*2; - height = h-padding*2; + xpos = x+padding; + ypos = y+padding; + width = w-padding*2; + height = h-padding*2; } BaseUIElement::BaseUIElement(int x, int y, double w, double h, int p): - enabled(true), padding(p) + enabled(true), padding(p) { - xpos = x+padding; - ypos = y+padding; - width = w-padding*2; - height = h-padding*2; + xpos = x+padding; + ypos = y+padding; + width = w-padding*2; + height = h-padding*2; } -void BaseUIElement::redraw(){ -// std::cout<<"BaseUIElement::redraw(), Position:"<<xpos<<","<<ypos<<" : "<<width<<","<<height<<std::endl; - setGlViewport(); - - // if (clearNextDraw || !clearNextDraw){ - // clearNextDraw = false; - glColor3f(0.0, 0.0, 0.0); - glRecti(-1,-1,1,1); - - - // } +void BaseUIElement::redraw() +{ + // std::cout<<"BaseUIElement::redraw(), Position:"<<xpos<<","<<ypos<<" : "<<width<<","<<height<<std::endl; + setGlViewport(); + + // if (clearNextDraw || !clearNextDraw){ + // clearNextDraw = false; + glColor3f(0.0, 0.0, 0.0); + glRecti(-1,-1,1,1); + + + // } } -void BaseUIElement::drawElementEdges(){ - // std::cout<<"BaseUIElement::drawBaseUIElementEdges(), Position:"<<xpos<<","<<ypos<<" : "<<width<<","<<height<<std::endl; - glColor3f(1.0, 1.0, 1.0); - setGlViewport(); - glLineWidth(2); - drawViewportEdge(); +void BaseUIElement::drawElementEdges() +{ + // std::cout<<"BaseUIElement::drawBaseUIElementEdges(), Position:"<<xpos<<","<<ypos<<" : "<<width<<","<<height<<std::endl; + glColor3f(1.0, 1.0, 1.0); + setGlViewport(); + glLineWidth(2); + drawViewportEdge(); } -void BaseUIElement::setEnabled(bool e){ - enabled = e; +void BaseUIElement::setEnabled(bool e) +{ + enabled = e; } -bool BaseUIElement::getEnabled(){ - return enabled; +bool BaseUIElement::getEnabled() +{ + return enabled; } -void BaseUIElement::setGlViewport(){ - - glLoadIdentity(); - glViewport(xpos, ypos, width, height); - - // std::cout<<xpos<<"x"<<ypos<<"-"<<width<<"x"<<height<<"\t"<<BaseUIElementName<<std::endl; +void BaseUIElement::setGlViewport() +{ + + glLoadIdentity(); + glViewport(xpos, ypos, width, height); + + // std::cout<<xpos<<"x"<<ypos<<"-"<<width<<"x"<<height<<"\t"<<BaseUIElementName<<std::endl; } -void BaseUIElement::setPosition(int x, int y, double w, double h){ - xpos = x+padding; - ypos = y+padding; - width = w - padding*2; - height = h - padding*2; +void BaseUIElement::setPosition(int x, int y, double w, double h) +{ + xpos = x+padding; + ypos = y+padding; + width = w - padding*2; + height = h - padding*2; } -void BaseUIElement::getPosition(int *x, int *y, double *w, double *h){ - *x = xpos; - *y = ypos; - *w = width; - *h = height; +void BaseUIElement::getPosition(int* x, int* y, double* w, double* h) +{ + *x = xpos; + *y = ypos; + *w = width; + *h = height; } // void BaseUIElement::clearOnNextDraw(bool c){ // clearNextDraw = c; // } -bool BaseUIElement::hitTest(int x, int y){ +bool BaseUIElement::hitTest(int x, int y) +{ return (x > xpos && x < xpos+width) && (y > ypos && y < ypos+height); } -double BaseUIElement::getHeight(){ +double BaseUIElement::getHeight() +{ return height; } -double BaseUIElement::getWidth(){ +double BaseUIElement::getWidth() +{ return width; } -int BaseUIElement::getX(){ +int BaseUIElement::getX() +{ return xpos; } -int BaseUIElement::getY(){ +int BaseUIElement::getY() +{ return ypos; } diff --git a/Source/Processors/Visualization/SpikePlotting/BaseUIElement.h b/Source/Processors/Visualization/SpikePlotting/BaseUIElement.h index 8fd968a59f748f3832d80fcc98d07158fa88d455..7c5afed103f03b686573aedef307bb4a48db7a06 100755 --- a/Source/Processors/Visualization/SpikePlotting/BaseUIElement.h +++ b/Source/Processors/Visualization/SpikePlotting/BaseUIElement.h @@ -7,50 +7,51 @@ class SpikeObject; /** - + Base class for drawing spike plots in OpenGL. @see SpikeDisplayCanvas */ -class BaseUIElement{ +class BaseUIElement +{ + +protected: + int xpos, ypos, yOffset; + double height, width; + bool enabled; + double padding; + + void setGlViewport(); -protected: - int xpos, ypos, yOffset; - double height, width; - bool enabled; - double padding; - - void setGlViewport(); - public: - BaseUIElement(); - BaseUIElement(int x, int y, double w, double h); - BaseUIElement(int x, int y, double w, double h, int p); - - virtual void redraw(); - void drawElementEdges(); - virtual void setEnabled(bool e); - virtual bool getEnabled(); - virtual void setPosition(int x, int y, double w, double h); - virtual void setPosition(int, int) {} - virtual void getPosition(int*, int*, double*, double*); + BaseUIElement(); + BaseUIElement(int x, int y, double w, double h); + BaseUIElement(int x, int y, double w, double h, int p); + + virtual void redraw(); + void drawElementEdges(); + virtual void setEnabled(bool e); + virtual bool getEnabled(); + virtual void setPosition(int x, int y, double w, double h); + virtual void setPosition(int, int) {} + virtual void getPosition(int*, int*, double*, double*); double getHeight(); double getWidth(); int getX(); int getY(); - - // needed for spike display object subclasses: - virtual void processSpikeObject(SpikeObject s) {} - virtual void pan(int, bool) {} - virtual void zoom(int, bool) {} - virtual void clear() {} - - // void clearOnNextDraw(bool); - // bool clearNextDraw; + + // needed for spike display object subclasses: + virtual void processSpikeObject(SpikeObject s) {} + virtual void pan(int, bool) {} + virtual void zoom(int, bool) {} + virtual void clear() {} + + // void clearOnNextDraw(bool); + // bool clearNextDraw; bool hitTest(int x, int y); - + }; diff --git a/Source/Processors/Visualization/SpikePlotting/GenericAxes.cpp b/Source/Processors/Visualization/SpikePlotting/GenericAxes.cpp index b8560c1513d8f3744f7b10cfbccb740a2eb08ebf..b87870d5b238007a31babdbac9602dc44a449d37 100755 --- a/Source/Processors/Visualization/SpikePlotting/GenericAxes.cpp +++ b/Source/Processors/Visualization/SpikePlotting/GenericAxes.cpp @@ -1,68 +1,80 @@ #include "GenericAxes.h" GenericAxes::GenericAxes() - : BaseUIElement(), gotFirstSpike(false), type(0) + : BaseUIElement(), gotFirstSpike(false), type(0) { - ylims[0] = 0; - ylims[1] = 1; - loadFont(); + ylims[0] = 0; + ylims[1] = 1; + loadFont(); } GenericAxes::GenericAxes(int x, int y, double w, double h, int t): - BaseUIElement(x,y,w,h), - gotFirstSpike(false) + BaseUIElement(x,y,w,h), + gotFirstSpike(false) { - type = t; - loadFont(); + type = t; + loadFont(); } -GenericAxes::~GenericAxes(){ - //delete font; +GenericAxes::~GenericAxes() +{ + //delete font; } -void GenericAxes::updateSpikeData(SpikeObject newSpike){ - if (!gotFirstSpike){ - gotFirstSpike = true; - } +void GenericAxes::updateSpikeData(SpikeObject newSpike) +{ + if (!gotFirstSpike) + { + gotFirstSpike = true; + } - s = newSpike; + s = newSpike; } -void GenericAxes::loadFont(){ - const unsigned char* buffer = reinterpret_cast<const unsigned char*>(BinaryData::cpmono_plain_otf); - size_t bufferSize = BinaryData::cpmono_plain_otfSize; - font = new FTPixmapFont(buffer, bufferSize); +void GenericAxes::loadFont() +{ + const unsigned char* buffer = reinterpret_cast<const unsigned char*>(BinaryData::cpmono_plain_otf); + size_t bufferSize = BinaryData::cpmono_plain_otfSize; + font = new FTPixmapFont(buffer, bufferSize); } -void GenericAxes::setYLims(double ymin, double ymax){ +void GenericAxes::setYLims(double ymin, double ymax) +{ - std::cout << "setting y limits to " << ymin << " " << ymax << std::endl; - ylims[0] = ymin; - ylims[1] = ymax; + std::cout << "setting y limits to " << ymin << " " << ymax << std::endl; + ylims[0] = ymin; + ylims[1] = ymax; } -void GenericAxes::getYLims(double *min, double *max){ - *min = ylims[0]; - *max = ylims[1]; +void GenericAxes::getYLims(double* min, double* max) +{ + *min = ylims[0]; + *max = ylims[1]; } -void GenericAxes::setXLims(double xmin, double xmax){ - xlims[0] = xmin; - xlims[1] = xmax; +void GenericAxes::setXLims(double xmin, double xmax) +{ + xlims[0] = xmin; + xlims[1] = xmax; } -void GenericAxes::getXLims(double *min, double *max){ - *min = xlims[0]; - *max = xlims[1]; +void GenericAxes::getXLims(double* min, double* max) +{ + *min = xlims[0]; + *max = xlims[1]; } -void GenericAxes::setType(int t){ - if (t < WAVE1 || t > PROJ3x4){ - std::cout<<"Invalid Axes type specified"; - return; - } - type = t; +void GenericAxes::setType(int t) +{ + if (t < WAVE1 || t > PROJ3x4) + { + std::cout<<"Invalid Axes type specified"; + return; + } + type = t; } -int GenericAxes::getType(){ +int GenericAxes::getType() +{ return type; } -void GenericAxes::setPosition(int x, int y, double w, double h){ - BaseUIElement::setPosition(x,y,w,h); +void GenericAxes::setPosition(int x, int y, double w, double h) +{ + BaseUIElement::setPosition(x,y,w,h); } diff --git a/Source/Processors/Visualization/SpikePlotting/GenericAxes.h b/Source/Processors/Visualization/SpikePlotting/GenericAxes.h index 347a39a4cfb75829772a9f72181e95b8e37b7697..43be58dad7a05c26e812ac45c63306e28787c958 100755 --- a/Source/Processors/Visualization/SpikePlotting/GenericAxes.h +++ b/Source/Processors/Visualization/SpikePlotting/GenericAxes.h @@ -1,14 +1,11 @@ #ifndef GENERIC_AXES_H_ #define GENERIC_AXES_H_ -#ifdef WIN32 -#include <Windows.h> -#endif #if defined(__linux__) - #include <GL/glut.h> +#include <GL/glut.h> #else - #include <GLUT/glut.h> +#include <GLUT/glut.h> #endif #include <stdlib.h> #include <FTGL/ftgl.h> @@ -27,42 +24,43 @@ */ -class GenericAxes: public BaseUIElement{ +class GenericAxes: public BaseUIElement +{ protected: - double xlims[2]; - double ylims[2]; - SpikeObject s; + double xlims[2]; + double ylims[2]; + SpikeObject s; + + bool gotFirstSpike; + + int type; + virtual void plot() {} - bool gotFirstSpike; - - int type; - virtual void plot(){} + FTPixmapFont* font; + void loadFont(); - FTPixmapFont* font; - void loadFont(); - public: - GenericAxes(); - GenericAxes(int x, int y, double w, double h, int t); - virtual ~GenericAxes(); - - void updateSpikeData(SpikeObject s); - - virtual void redraw(){} - - void setXLims(double xmin, double xmax); - void getXLims(double *xmin, double *xmax); - void setYLims(double ymin, double ymax); - void getYLims(double *ymin, double *ymax); - - void setType(int type); - int getType(); - - - void setPosition(int,int,double,double); - + GenericAxes(); + GenericAxes(int x, int y, double w, double h, int t); + virtual ~GenericAxes(); + + void updateSpikeData(SpikeObject s); + + virtual void redraw() {} + + void setXLims(double xmin, double xmax); + void getXLims(double* xmin, double* xmax); + void setYLims(double ymin, double ymax); + void getYLims(double* ymin, double* ymax); + + void setType(int type); + int getType(); + + + void setPosition(int,int,double,double); + }; diff --git a/Source/Processors/Visualization/SpikePlotting/PlotUtils.cpp b/Source/Processors/Visualization/SpikePlotting/PlotUtils.cpp index 8b88087900a80c04f7269507ceb12a0dfa622aa3..3f2e25d2f843b53f542e094313fc5d6e18845ed2 100755 --- a/Source/Processors/Visualization/SpikePlotting/PlotUtils.cpp +++ b/Source/Processors/Visualization/SpikePlotting/PlotUtils.cpp @@ -1,176 +1,198 @@ #include "PlotUtils.h" -void checkGlError(){ - GLenum errCode; - const GLubyte *errString; - if ((errCode = glGetError()) != GL_NO_ERROR) { - errString = gluErrorString(errCode); - fprintf (stderr, "OpenGL Error: %s\n", errString); - exit(1); - } - else - std::cout<<"OpenGL Okay!"<<std::endl; +void checkGlError() +{ + GLenum errCode; + const GLubyte* errString; + if ((errCode = glGetError()) != GL_NO_ERROR) + { + errString = gluErrorString(errCode); + fprintf(stderr, "OpenGL Error: %s\n", errString); + exit(1); + } + else + std::cout<<"OpenGL Okay!"<<std::endl; } -void drawString(float x, float y, void *f, const char *string){ - glRasterPos2f(x, y); - int len = strlen(string); - // glColor3f(1.0, 1.0, 1.0); - for (int i = 0; i < len; i++) { - //glutBitmapCharacter(f, string[i]); - } +void drawString(float x, float y, void* f, const char* string) +{ + glRasterPos2f(x, y); + int len = strlen(string); + // glColor3f(1.0, 1.0, 1.0); + for (int i = 0; i < len; i++) + { + //glutBitmapCharacter(f, string[i]); + } } -void drawString(float x, float y, int size, String s, FTPixmapFont* f){ - - glRasterPos2f(x, y); +void drawString(float x, float y, int size, String s, FTPixmapFont* f) +{ - //f->FaceSize(size); - //f->Render(s); + glRasterPos2f(x, y); + + //f->FaceSize(size); + //f->Render(s); } -void drawViewportEdge(){ - - glPushMatrix(); - glLoadIdentity(); - - glBegin(GL_LINE_LOOP); - glVertex2f(-.995, -.995); - glVertex2f( .995, -.995); - glVertex2f( .995, .995); - glVertex2f(-.995, .995); - glEnd(); - - glPopMatrix(); +void drawViewportEdge() +{ + + glPushMatrix(); + glLoadIdentity(); + + glBegin(GL_LINE_LOOP); + glVertex2f(-.995, -.995); + glVertex2f(.995, -.995); + glVertex2f(.995, .995); + glVertex2f(-.995, .995); + glEnd(); + + glPopMatrix(); } -void drawViewportCross(){ - - glColor3f(0.0,1.0,1.0); - - glPushMatrix(); - glLoadIdentity(); - - glBegin(GL_LINE_LOOP); - glVertex2f(-.995, -.995); - glVertex2f( .995, .995); - glVertex2f( .995, -.995); - glVertex2f(-.995, .995); - glEnd(); - - glPopMatrix(); +void drawViewportCross() +{ + + glColor3f(0.0,1.0,1.0); + + glPushMatrix(); + glLoadIdentity(); + + glBegin(GL_LINE_LOOP); + glVertex2f(-.995, -.995); + glVertex2f(.995, .995); + glVertex2f(.995, -.995); + glVertex2f(-.995, .995); + glEnd(); + + glPopMatrix(); } -void setViewportRange(int xMin,int yMin,int xMax,int yMax){ - - float dx = xMax-xMin; - float dy = yMax-yMin; - -// printf("Setting viewport to:%d,%d %d,%d with dims%d,%d %d,%d\n", x,y,w,h, xMin, xMin, xMax,yMax); -// printf("Dx:%f Dy:%f, Scaling viewport by:%f,%f \n", dx,dy,2.0/dx, 2.0/dy); - glLoadIdentity(); - glTranslatef(-1.0,-1.0,0.0); - glScalef(2.0f/dx, 2.0f/dy, 1.0); - glTranslatef(0-xMin, 0-yMin, 0); - +void setViewportRange(int xMin,int yMin,int xMax,int yMax) +{ + + float dx = xMax-xMin; + float dy = yMax-yMin; + + // printf("Setting viewport to:%d,%d %d,%d with dims%d,%d %d,%d\n", x,y,w,h, xMin, xMin, xMax,yMax); + // printf("Dx:%f Dy:%f, Scaling viewport by:%f,%f \n", dx,dy,2.0/dx, 2.0/dy); + glLoadIdentity(); + glTranslatef(-1.0,-1.0,0.0); + glScalef(2.0f/dx, 2.0f/dy, 1.0); + glTranslatef(0-xMin, 0-yMin, 0); + } -int roundUp(int numToRound, int multiple) -{ - if(multiple == 0) - { - return numToRound; - } - - int remainder = numToRound % multiple; - if (remainder == 0) - return numToRound; - return numToRound + multiple - remainder; +int roundUp(int numToRound, int multiple) +{ + if (multiple == 0) + { + return numToRound; + } + + int remainder = numToRound % multiple; + if (remainder == 0) + return numToRound; + return numToRound + multiple - remainder; } -double ad16ToUv(int x, int gain){ - int result = (double)(x * 20e6) / (double)(gain * pow(2.0,16)); - return result; +double ad16ToUv(int x, int gain) +{ + int result = (double)(x * 20e6) / (double)(gain * pow(2.0,16)); + return result; } -void makeLabel(int val, int gain, bool convert, char * s){ - if (convert){ - double volt = ad16ToUv(val, gain)/1000.; - if (abs(val)>1e6){ - //val = val/(1e6); - sprintf(s, "%.2fV", volt); - } - else if(abs(val)>1e3){ - //val = val/(1e3); - sprintf(s, "%.2fmV", volt); - } - else - sprintf(s, "%.2fuV", volt); - } - else - sprintf(s,"%d", (int)val); +void makeLabel(int val, int gain, bool convert, char* s) +{ + if (convert) + { + double volt = ad16ToUv(val, gain)/1000.; + if (abs(val)>1e6) + { + //val = val/(1e6); + sprintf(s, "%.2fV", volt); + } + else if (abs(val)>1e3) + { + //val = val/(1e3); + sprintf(s, "%.2fmV", volt); + } + else + sprintf(s, "%.2fuV", volt); + } + else + sprintf(s,"%d", (int)val); } -void n2ProjIdx(int proj, int *p1, int *p2){ +void n2ProjIdx(int proj, int* p1, int* p2) +{ int d1, d2; - if (proj==PROJ1x2){ - d1 = 0; - d2 = 1; - } - else if(proj==PROJ1x3){ - d1 = 0; - d2 = 2; - } - else if(proj==PROJ1x4){ - d1 = 0; - d2 = 3; - } - else if(proj==PROJ2x3){ - d1 = 1; - d2 = 2; - } - else if(proj==PROJ2x4){ - d1 = 1; - d2 = 3; - } - else if (proj==PROJ3x4){ - d1 = 2; - d2 = 3; - } - else{ - std::cout<<"Invalid projection:"<<proj<<"! Cannot determine d1 and d2"<<std::endl; + if (proj==PROJ1x2) + { + d1 = 0; + d2 = 1; + } + else if (proj==PROJ1x3) + { + d1 = 0; + d2 = 2; + } + else if (proj==PROJ1x4) + { + d1 = 0; + d2 = 3; + } + else if (proj==PROJ2x3) + { + d1 = 1; + d2 = 2; + } + else if (proj==PROJ2x4) + { + d1 = 1; + d2 = 3; + } + else if (proj==PROJ3x4) + { + d1 = 2; + d2 = 3; + } + else + { + std::cout<<"Invalid projection:"<<proj<<"! Cannot determine d1 and d2"<<std::endl; *p1 = -1; *p2 = -1; - return; - } + return; + } *p1 = d1; *p2 = d2; } -bool isFrameBufferExtensionSupported(){ +bool isFrameBufferExtensionSupported() +{ std::cout<<"Checking to see if the OpenGL Frame Buffer Extension is Supported"<<std::endl; - + char* str = 0; char* tok = 0; std::string fboExt = "GL_EXT_framebuffer_object"; str = (char*)glGetString(GL_EXTENSIONS); - - if(str) + + if (str) { std::vector <std::string> extensions; tok = strtok((char*)str, " "); - while(tok) - { + while (tok) + { std::string ext = tok; if (ext == fboExt) return true; - tok = strtok(0, " "); + tok = strtok(0, " "); } return false; } @@ -184,43 +206,43 @@ bool checkFramebufferStatus() GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); return status == GL_FRAMEBUFFER_COMPLETE_EXT; - switch(status) + switch (status) { - case GL_FRAMEBUFFER_COMPLETE_EXT: - std::cout << "Framebuffer complete." << std::endl; - return true; + case GL_FRAMEBUFFER_COMPLETE_EXT: + std::cout << "Framebuffer complete." << std::endl; + return true; - case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT: - std::cout << "[ERROR] Framebuffer incomplete: Attachment is NOT complete." << std::endl; - return false; + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT: + std::cout << "[ERROR] Framebuffer incomplete: Attachment is NOT complete." << std::endl; + return false; - case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT: - std::cout << "[ERROR] Framebuffer incomplete: No image is attached to FBO." << std::endl; - return false; + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT: + std::cout << "[ERROR] Framebuffer incomplete: No image is attached to FBO." << std::endl; + return false; - case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: - std::cout << "[ERROR] Framebuffer incomplete: Attached images have different dimensions." << std::endl; - return false; + case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: + std::cout << "[ERROR] Framebuffer incomplete: Attached images have different dimensions." << std::endl; + return false; - case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: - std::cout << "[ERROR] Framebuffer incomplete: Color attached images have different internal formats." << std::endl; - return false; + case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: + std::cout << "[ERROR] Framebuffer incomplete: Color attached images have different internal formats." << std::endl; + return false; - case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT: - std::cout << "[ERROR] Framebuffer incomplete: Draw buffer." << std::endl; - return false; + case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT: + std::cout << "[ERROR] Framebuffer incomplete: Draw buffer." << std::endl; + return false; - case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT: - std::cout << "[ERROR] Framebuffer incomplete: Read buffer." << std::endl; - return false; + case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT: + std::cout << "[ERROR] Framebuffer incomplete: Read buffer." << std::endl; + return false; - case GL_FRAMEBUFFER_UNSUPPORTED_EXT: - std::cout << "[ERROR] Unsupported by FBO implementation." << std::endl; - return false; + case GL_FRAMEBUFFER_UNSUPPORTED_EXT: + std::cout << "[ERROR] Unsupported by FBO implementation." << std::endl; + return false; - default: - std::cout << "[ERROR] Unknown error." << std::endl; - return false; + default: + std::cout << "[ERROR] Unknown error." << std::endl; + return false; } } diff --git a/Source/Processors/Visualization/SpikePlotting/PlotUtils.h b/Source/Processors/Visualization/SpikePlotting/PlotUtils.h index 1de516e65271eecf6d1f3ddbf4025750ef9f291f..f3ba34836ba65558ccb673c8a21da1248c02cb8a 100755 --- a/Source/Processors/Visualization/SpikePlotting/PlotUtils.h +++ b/Source/Processors/Visualization/SpikePlotting/PlotUtils.h @@ -4,17 +4,16 @@ #define GL_GLEXT_PROTOTYPES #if defined(__linux__) - #include <GL/glut.h> +#include <GL/glut.h> #elif defined(WIN32) - #undef GL_GLEXT_PROTOTYPES - #include <Windows.h> - #include <GLUT/glut.h> - #include <gl/GLU.h> - #include "..\..\..\glWinInit.h" +#undef GL_GLEXT_PROTOTYPES +#include <GLUT/glut.h> +#include <gl/GLU.h> +#include "..\..\..\glWinInit.h" #else // assume OS X - #include <GLUT/glut.h> - #include <OpenGL/glu.h> - #include <OpenGL/glext.h> +#include <GLUT/glut.h> +#include <OpenGL/glu.h> +#include <OpenGL/glext.h> #endif #include <stdio.h> @@ -41,7 +40,7 @@ void checkGlError(); void setViewportRange(int xMin,int xMax,int yMin,int yMax); -void drawString(float x, float y, void *f, const char *string); +void drawString(float x, float y, void* f, const char* string); void drawString(float x, float y, int size, String s, FTPixmapFont* f); void drawViewportEdge(); @@ -52,12 +51,13 @@ int roundUp(int, int); double ad16ToUv(int ad, int gain); -void makeLabel(int val, int gain, bool convert, char * s); +void makeLabel(int val, int gain, bool convert, char* s); -void n2ProjIdx(int i, int *p1, int *p2); +void n2ProjIdx(int i, int* p1, int* p2); template< class T > -T* addressof(T& arg) { +T* addressof(T& arg) +{ return (T*)&(char&)arg; } diff --git a/Source/Processors/Visualization/SpikePlotting/ProjectionAxes.cpp b/Source/Processors/Visualization/SpikePlotting/ProjectionAxes.cpp index b3b2cdb2660b2371f6717bbd040dee716b77a313..90567594a87feb3e40fa3ab72e18dd174e4227d1 100755 --- a/Source/Processors/Visualization/SpikePlotting/ProjectionAxes.cpp +++ b/Source/Processors/Visualization/SpikePlotting/ProjectionAxes.cpp @@ -1,205 +1,219 @@ #include "ProjectionAxes.h" ProjectionAxes::ProjectionAxes() - : GenericAxes(), - buffIdx(-1), totalSpikes(0), newSpike(false), isTextureValid(false), - fboCreated(false), allSpikesNextRender(false), overlay(false), - drawGrid(false), convertLabelUnits(true) + : GenericAxes(), + buffIdx(-1), totalSpikes(0), newSpike(false), isTextureValid(false), + fboCreated(false), allSpikesNextRender(false), overlay(false), + drawGrid(false), convertLabelUnits(true) { - GenericAxes::type = PROJ1x2; - GenericAxes::gotFirstSpike = false; + GenericAxes::type = PROJ1x2; + GenericAxes::gotFirstSpike = false; - ylims[0] = 0; - ylims[1] = 1; - setPointColor(1.0,1.0,1.0); - n2ProjIdx(type, &Dim1, &Dim2); + ylims[0] = 0; + ylims[1] = 1; + setPointColor(1.0,1.0,1.0); + n2ProjIdx(type, &Dim1, &Dim2); - clearOnNextDraw = false; + clearOnNextDraw = false; } ProjectionAxes::ProjectionAxes(int x, int y, double w, double h, int t) - : GenericAxes(x,y,w,h,t), - buffIdx(-1), totalSpikes(0), newSpike(false), isTextureValid(false), - fboCreated(false), allSpikesNextRender(false), overlay(false), - drawGrid(true), convertLabelUnits(true) + : GenericAxes(x,y,w,h,t), + buffIdx(-1), totalSpikes(0), newSpike(false), isTextureValid(false), + fboCreated(false), allSpikesNextRender(false), overlay(false), + drawGrid(true), convertLabelUnits(true) { - GenericAxes::gotFirstSpike = false; + GenericAxes::gotFirstSpike = false; - setPointColor(1.0,1.0,1.0); + setPointColor(1.0,1.0,1.0); - n2ProjIdx(type, &Dim1, &Dim2); + n2ProjIdx(type, &Dim1, &Dim2); - clearOnNextDraw = false; + clearOnNextDraw = false; } -void ProjectionAxes::updateSpikeData(SpikeObject s){ - //std::cout<<"ProjectionAxes::updateSpikeData()"<<std::endl; - GenericAxes::updateSpikeData(s); +void ProjectionAxes::updateSpikeData(SpikeObject s) +{ + //std::cout<<"ProjectionAxes::updateSpikeData()"<<std::endl; + GenericAxes::updateSpikeData(s); - buffIdx++; - if (buffIdx >= AMP_BUFF_MAX_SIZE) - buffIdx %= AMP_BUFF_MAX_SIZE; + buffIdx++; + if (buffIdx >= AMP_BUFF_MAX_SIZE) + buffIdx %= AMP_BUFF_MAX_SIZE; - int idx1, idx2; - calcWaveformPeakIdx(ampDim1,ampDim2,&idx1, &idx2); + int idx1, idx2; + calcWaveformPeakIdx(ampDim1,ampDim2,&idx1, &idx2); - ampBuffer[0][buffIdx] = (s.data[idx1] - 32768); - ampBuffer[1][buffIdx] = (s.data[idx2] - 32768); - newSpike = true; + ampBuffer[0][buffIdx] = (s.data[idx1] - 32768); + ampBuffer[1][buffIdx] = (s.data[idx2] - 32768); + newSpike = true; } -void ProjectionAxes::redraw(){ - - BaseUIElement::redraw(); - - plot(); - - BaseUIElement::drawElementEdges(); +void ProjectionAxes::redraw() +{ + + BaseUIElement::redraw(); + + plot(); + + BaseUIElement::drawElementEdges(); } -void ProjectionAxes::plot(){ - //setViewportRange(xlims[0], ylims[0], xlims[1], ylims[1]); +void ProjectionAxes::plot() +{ + //setViewportRange(xlims[0], ylims[0], xlims[1], ylims[1]); - GLenum errCode; - const GLubyte *errString; + GLenum errCode; + const GLubyte* errString; - // Should we plot all spikes to the texture or just the newest one - bool allSpikes = false; + // Should we plot all spikes to the texture or just the newest one + bool allSpikes = false; - if (!isTextureValid){ - std::cout<<"ProjectionAxes::plot() --> Texture is invalid regenerating it!"<<std::endl; + if (!isTextureValid) + { + std::cout<<"ProjectionAxes::plot() --> Texture is invalid regenerating it!"<<std::endl; createTexture(); - allSpikes = true; + allSpikes = true; } - if (clearOnNextDraw){ - clearTexture(); - clearOnNextDraw = false; - } - - drawSpikesToTexture(allSpikes); - drawTexturedQuad(); - plotNewestSpike(); - - // if there has been an openGL error we need to rerender the texture and replot everything - // errors occur when the openGL context has been destroyed and recreated. I'm not sure how to - // explicitly catch that event so instead we check for a drawing error. - if ((errCode = glGetError()) != GL_NO_ERROR) { - errString = gluErrorString(errCode); - std::cout<<"OpenGL Error:"<< errString << "! Invalidating and rerendering the texture!" << std::endl; - - invalidateTexture(); - plot(); - return; - } -// else -// std::cout<<"All is good no errors detected"<<std::endl; + if (clearOnNextDraw) + { + clearTexture(); + clearOnNextDraw = false; + } + + drawSpikesToTexture(allSpikes); + drawTexturedQuad(); + plotNewestSpike(); + + // if there has been an openGL error we need to rerender the texture and replot everything + // errors occur when the openGL context has been destroyed and recreated. I'm not sure how to + // explicitly catch that event so instead we check for a drawing error. + if ((errCode = glGetError()) != GL_NO_ERROR) + { + errString = gluErrorString(errCode); + std::cout<<"OpenGL Error:"<< errString << "! Invalidating and rerendering the texture!" << std::endl; + + invalidateTexture(); + plot(); + return; + } + // else + // std::cout<<"All is good no errors detected"<<std::endl; } -void ProjectionAxes::plotOldSpikes(bool allSpikes){ - //std::cout<<"ProjectionAxes::plotOldSpikes() allSpikes:"<<allSpikes<<std::endl; - - //set the viewport to the size of the texture - glViewport(0,0,texWidth, texHeight); - - //set the plotting range for the viewport to the limits of the plot - setViewportRange(xlims[0], ylims[0], xlims[1], ylims[1]); - - // if allSpikes plot start with 1 else start with buffIdx - int startIdx = (allSpikes) ? 1 : buffIdx; - // either plot to totalSpikes or the end of the buffer if total spikes has wrapped - int stopIdx = (totalSpikes > AMP_BUFF_MAX_SIZE) ? AMP_BUFF_MAX_SIZE : buffIdx; - - // if (allSpikes) - // std::cout<<"\tUpdating texture with all spikes: "<< stopIdx - startIdx + 1 <<std::endl; - - glColor3f(1.0, 1.0, 1.0); - glPointSize(1); - glBegin(GL_POINTS); - for (int i=startIdx; i<=stopIdx; i++) - glVertex2i(ampBuffer[0][i], ampBuffer[1][i]); - glEnd(); +void ProjectionAxes::plotOldSpikes(bool allSpikes) +{ + //std::cout<<"ProjectionAxes::plotOldSpikes() allSpikes:"<<allSpikes<<std::endl; + + //set the viewport to the size of the texture + glViewport(0,0,texWidth, texHeight); + + //set the plotting range for the viewport to the limits of the plot + setViewportRange(xlims[0], ylims[0], xlims[1], ylims[1]); + + // if allSpikes plot start with 1 else start with buffIdx + int startIdx = (allSpikes) ? 1 : buffIdx; + // either plot to totalSpikes or the end of the buffer if total spikes has wrapped + int stopIdx = (totalSpikes > AMP_BUFF_MAX_SIZE) ? AMP_BUFF_MAX_SIZE : buffIdx; + + // if (allSpikes) + // std::cout<<"\tUpdating texture with all spikes: "<< stopIdx - startIdx + 1 <<std::endl; + + glColor3f(1.0, 1.0, 1.0); + glPointSize(1); + glBegin(GL_POINTS); + for (int i=startIdx; i<=stopIdx; i++) + glVertex2i(ampBuffer[0][i], ampBuffer[1][i]); + glEnd(); } -void ProjectionAxes::plotNewestSpike(){ - - BaseUIElement::setGlViewport(); - setViewportRange(xlims[0], ylims[0], xlims[1], ylims[1]); +void ProjectionAxes::plotNewestSpike() +{ + + BaseUIElement::setGlViewport(); + setViewportRange(xlims[0], ylims[0], xlims[1], ylims[1]); + + // draw the newest spike as a big red point so it stands out against the old spikes + glColor3f(1.0, 0.0, 0.0); + glPointSize(4); - // draw the newest spike as a big red point so it stands out against the old spikes - glColor3f(1.0, 0.0, 0.0); - glPointSize(4); - if (gotFirstSpike) { - glBegin(GL_POINTS); + glBegin(GL_POINTS); glVertex2i(ampBuffer[0][buffIdx], ampBuffer[1][buffIdx]); - glEnd(); + glEnd(); } - newSpike = false; + newSpike = false; } - void ProjectionAxes::calcWaveformPeakIdx(int d1, int d2, int *idx1, int *idx2){ - - int max1 = -1*pow(2.0,15); - int max2 = max1; - - for (int i=0; i<s.nSamples ; i++){ - if (s.data[d1*s.nSamples + i] > max1) - { - *idx1 = d1*s.nSamples+i; - max1 = s.data[*idx1]; - } - if (s.data[d2*s.nSamples+i] > max2) - { - *idx2 = d2*s.nSamples+i; - max2 = s.data[*idx2]; - } - } +void ProjectionAxes::calcWaveformPeakIdx(int d1, int d2, int* idx1, int* idx2) +{ + + int max1 = -1*pow(2.0,15); + int max2 = max1; + + for (int i=0; i<s.nSamples ; i++) + { + if (s.data[d1*s.nSamples + i] > max1) + { + *idx1 = d1*s.nSamples+i; + max1 = s.data[*idx1]; + } + if (s.data[d2*s.nSamples+i] > max2) + { + *idx2 = d2*s.nSamples+i; + max2 = s.data[*idx2]; + } + } } -void ProjectionAxes::setPosition(int x, int y, int w, int h){ - // std::cout<<"ProjectionAxes::setPosition()"<<std::endl; - - // only invalidate the texture if its size has actually changed - if (w!=GenericAxes::width || h!=GenericAxes::height) - invalidateTexture(); +void ProjectionAxes::setPosition(int x, int y, int w, int h) +{ + // std::cout<<"ProjectionAxes::setPosition()"<<std::endl; + + // only invalidate the texture if its size has actually changed + if (w!=GenericAxes::width || h!=GenericAxes::height) + invalidateTexture(); - GenericAxes::setPosition(x,y,w,h); + GenericAxes::setPosition(x,y,w,h); } -void ProjectionAxes::setPointColor(GLfloat r, GLfloat g, GLfloat b){ - pointColor[0] = r; - pointColor[1] = g; - pointColor[2] = b; +void ProjectionAxes::setPointColor(GLfloat r, GLfloat g, GLfloat b) +{ + pointColor[0] = r; + pointColor[1] = g; + pointColor[2] = b; } -void ProjectionAxes::setGridColor(GLfloat r, GLfloat g, GLfloat b){ - gridColor[0] = r; - gridColor[1] = g; - gridColor[2] = b; +void ProjectionAxes::setGridColor(GLfloat r, GLfloat g, GLfloat b) +{ + gridColor[0] = r; + gridColor[1] = g; + gridColor[2] = b; } -void ProjectionAxes::createTexture(){ - - texWidth = BaseUIElement::width; - texHeight = BaseUIElement::height; +void ProjectionAxes::createTexture() +{ + + texWidth = BaseUIElement::width; + texHeight = BaseUIElement::height; - std::cout<<"Creating a new texture of size:"<<texWidth<<"x"<<texHeight;//<<std::endl; - // Delete the old texture + std::cout<<"Creating a new texture of size:"<<texWidth<<"x"<<texHeight;//<<std::endl; + // Delete the old texture glDeleteTextures(1, &textureId); - // Generate a new texture + // Generate a new texture glGenTextures(1, &textureId); std::cout<<" textureId:"<<textureId<<std::endl; // Bind the texture, and set the appropriate parameters glBindTexture(GL_TEXTURE_2D, textureId); - glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glGenerateMipmap(GL_TEXTURE_2D); // generate a new FrameBufferObject @@ -210,89 +224,95 @@ void ProjectionAxes::createTexture(){ } -void ProjectionAxes::createFBO(){ - std::cout<<"Creating a new FBO, is already created?:"<<fboCreated<<" ";//<<std::endl; +void ProjectionAxes::createFBO() +{ + std::cout<<"Creating a new FBO, is already created?:"<<fboCreated<<" ";//<<std::endl; - // if (!isTextureValid) - // createTexture(); - // Delete the old frame buffer, render buffer - if (fboCreated){ + // if (!isTextureValid) + // createTexture(); + // Delete the old frame buffer, render buffer + if (fboCreated) + { glDeleteFramebuffers(1, &fboId); glDeleteRenderbuffers(1, &rboId); } - // Generate and Bind the frame buffer - glGenFramebuffersEXT(1, &fboId); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId); + // Generate and Bind the frame buffer + glGenFramebuffersEXT(1, &fboId); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId); - // Generate and bind the new Render Buffer - glGenRenderbuffersEXT(1, &rboId); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboId); + // Generate and bind the new Render Buffer + glGenRenderbuffersEXT(1, &rboId); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboId); std::cout << " fboID:" << fboId << " rboID:" << rboId << std::endl; - - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, texWidth, texHeight); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); - - // Attach the texture to the framebuffer - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, textureId, 0); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboId); - - // If the FrameBuffer wasn't created then we have a bigger problem. Abort the program. - if(!checkFramebufferStatus()){ - std::cout<<"FrameBufferObject not created! Are you running the newest version of OpenGL?"<<std::endl; - std::cout<<"FrameBufferObjects are REQUIRED! Quitting!"<<std::endl; - exit(1); - } + + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, texWidth, texHeight); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); + + // Attach the texture to the framebuffer + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, textureId, 0); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboId); + + // If the FrameBuffer wasn't created then we have a bigger problem. Abort the program. + if (!checkFramebufferStatus()) + { + std::cout<<"FrameBufferObject not created! Are you running the newest version of OpenGL?"<<std::endl; + std::cout<<"FrameBufferObjects are REQUIRED! Quitting!"<<std::endl; + exit(1); + } glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); - - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); fboCreated = true; } -void ProjectionAxes::drawSpikesToTexture(bool allSpikes){ - - //std::cout<<"ProjectionAxes::drawSpikesToTexture() plotting all spikes:"<<allSpikes<<std::endl; - - - // For some reason if we want to plot ALL the spikes to a texture we must plot two draw cycles - // in a row, perhaps this has to do with double buffering, I'm not sure why... investigate this! - - // if the allSpikes flag is set we set the allSpikesNextRender as true so we plot next - // all spikes next render cycle too, if only the allSpikesNextRender is true we set all spikes - // to true and allSpikes next render to false. - - //Basically this logic ensures that if allSpikes is ever set to true it will be set to true - //on the next call to drawSpikesToTexture() regardless of what value it is actually set to - if (allSpikes) - allSpikesNextRender = true; - else if (!allSpikes && allSpikesNextRender) - { - allSpikes = true; - allSpikesNextRender = false; - } - // set the rendering destination to FBO - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId); - +void ProjectionAxes::drawSpikesToTexture(bool allSpikes) +{ + + //std::cout<<"ProjectionAxes::drawSpikesToTexture() plotting all spikes:"<<allSpikes<<std::endl; + + + // For some reason if we want to plot ALL the spikes to a texture we must plot two draw cycles + // in a row, perhaps this has to do with double buffering, I'm not sure why... investigate this! + + // if the allSpikes flag is set we set the allSpikesNextRender as true so we plot next + // all spikes next render cycle too, if only the allSpikesNextRender is true we set all spikes + // to true and allSpikes next render to false. + + //Basically this logic ensures that if allSpikes is ever set to true it will be set to true + //on the next call to drawSpikesToTexture() regardless of what value it is actually set to + if (allSpikes) + allSpikesNextRender = true; + else if (!allSpikes && allSpikesNextRender) + { + allSpikes = true; + allSpikesNextRender = false; + } + // set the rendering destination to FBO + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId); + // plot to the texture if (gotFirstSpike) plotOldSpikes(allSpikes); // bind the original FrameBuffer - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } -void ProjectionAxes::invalidateTexture(){ - isTextureValid = false; +void ProjectionAxes::invalidateTexture() +{ + isTextureValid = false; } -void ProjectionAxes::drawTexturedQuad(){ - BaseUIElement::setGlViewport(); - // We need to scale the viewport in this case because we want to fill it with a quad. - // if we load identity then we can use a quad bound by (-1, 1); +void ProjectionAxes::drawTexturedQuad() +{ + BaseUIElement::setGlViewport(); + // We need to scale the viewport in this case because we want to fill it with a quad. + // if we load identity then we can use a quad bound by (-1, 1); glLoadIdentity(); // Bind the texture to render @@ -302,37 +322,43 @@ void ProjectionAxes::drawTexturedQuad(){ int size = 1; int texS = 1; glBegin(GL_QUADS); - glColor4f(1, 1, 1, 1); - glTexCoord2f(texS, texS); glVertex3f(size, size,0); - glTexCoord2f(0, texS); glVertex3f(-1 * size , size,0); - glTexCoord2f(0, 0); glVertex3f(-1 * size, -1 * size,0); - glTexCoord2f(texS, 0); glVertex3f(size, -1 * size,0); + glColor4f(1, 1, 1, 1); + glTexCoord2f(texS, texS); + glVertex3f(size, size,0); + glTexCoord2f(0, texS); + glVertex3f(-1 * size , size,0); + glTexCoord2f(0, 0); + glVertex3f(-1 * size, -1 * size,0); + glTexCoord2f(texS, 0); + glVertex3f(size, -1 * size,0); glEnd(); - + // Unbind the texture glBindTexture(GL_TEXTURE_2D, 0); } -void ProjectionAxes::clear(){ - - //reset buffIDx and totalSpikes - buffIdx = 0; - totalSpikes = 0; - - // set flag to clear on next draw - clearOnNextDraw = true; +void ProjectionAxes::clear() +{ + + //reset buffIDx and totalSpikes + buffIdx = 0; + totalSpikes = 0; + + // set flag to clear on next draw + clearOnNextDraw = true; } -void ProjectionAxes::clearTexture(){ - std::cout<<"ProjectinAxes::clearTexture() --> Clearing the Texture!"<<std::endl; +void ProjectionAxes::clearTexture() +{ + std::cout<<"ProjectinAxes::clearTexture() --> Clearing the Texture!"<<std::endl; - glViewport(0,0,texWidth, texHeight); - setViewportRange(xlims[0], ylims[0], xlims[1], ylims[1]); + glViewport(0,0,texWidth, texHeight); + setViewportRange(xlims[0], ylims[0], xlims[1], ylims[1]); - // set the rendering destination to FBO - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId); + // set the rendering destination to FBO + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId); // Clear the framebufferObject - glClearColor (0, 0, 0, 1); - glClear(GL_COLOR_BUFFER_BIT); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } diff --git a/Source/Processors/Visualization/SpikePlotting/ProjectionAxes.h b/Source/Processors/Visualization/SpikePlotting/ProjectionAxes.h index 582ea7bd3a07d27ec1388dc427702fc99a93d9c5..7c2fd142b4bba4a8325e873a1c452dff7c348ccb 100755 --- a/Source/Processors/Visualization/SpikePlotting/ProjectionAxes.h +++ b/Source/Processors/Visualization/SpikePlotting/ProjectionAxes.h @@ -4,9 +4,9 @@ #define GL_GLEXT_PROTOTYPES #if defined(__linux__) - #include <GL/glut.h> +#include <GL/glut.h> #else - #include <GLUT/glut.h> +#include <GLUT/glut.h> #endif #include <stdlib.h> #include "BaseUIElement.h" @@ -16,7 +16,7 @@ #include <stdint.h> #define AMP_BUFF_MAX_SIZE 50000 - + /** Class for drawing the peak projections of spike waveforms. @@ -25,73 +25,73 @@ class ProjectionAxes: public GenericAxes { - - GLfloat pointColor[3]; - GLfloat gridColor[3]; - int ampBuffer[2][AMP_BUFF_MAX_SIZE]; - uint16_t buffIdx; // points to the most recent spike - uint64_t totalSpikes; + GLfloat pointColor[3]; + GLfloat gridColor[3]; + + int ampBuffer[2][AMP_BUFF_MAX_SIZE]; + uint16_t buffIdx; // points to the most recent spike + uint64_t totalSpikes; + + int ampDim1, ampDim2; - int ampDim1, ampDim2; - - - void drawProjectionGrid(int thold, int gain); - void calcWaveformPeakIdx(int, int, int*, int*); - void createTexture(); - void createFBO(); + void drawProjectionGrid(int thold, int gain); + void calcWaveformPeakIdx(int, int, int*, int*); - void drawSpikesToTexture(bool allSpikes); - void drawTexturedQuad(); - void plotOldSpikes(bool allSpikes); - void plotNewestSpike(); + void createTexture(); + void createFBO(); - bool newSpike; + void drawSpikesToTexture(bool allSpikes); + void drawTexturedQuad(); + void plotOldSpikes(bool allSpikes); + void plotNewestSpike(); - - GLuint fboId; // Frame Buffer Object - GLuint textureId; // Texture - GLuint rboId; // Render Buffer + bool newSpike; - int texWidth; - int texHeight; - bool clearOnNextDraw; - bool isTextureValid; + GLuint fboId; // Frame Buffer Object + GLuint textureId; // Texture + GLuint rboId; // Render Buffer + + int texWidth; + int texHeight; + + bool clearOnNextDraw; + bool isTextureValid; bool fboCreated; - void clearTexture(); + void clearTexture(); - void validateTexture(); + void validateTexture(); - bool allSpikesNextRender; + bool allSpikesNextRender; protected: - void plot(); + void plot(); public: - ProjectionAxes(); - ProjectionAxes(int x, int y, double w, double h, int t); + ProjectionAxes(); + ProjectionAxes(int x, int y, double w, double h, int t); virtual ~ProjectionAxes() {} - - void setPosition(int, int, int, int); - void updateSpikeData(SpikeObject s); - - void setPointColor(GLfloat r, GLfloat g, GLfloat b); - void setGridColor(GLfloat, GLfloat, GLfloat); - - void clear(); - void invalidateTexture(); - - void redraw(); - - bool overlay; - bool drawGrid; - bool convertLabelUnits; - - + + void setPosition(int, int, int, int); + void updateSpikeData(SpikeObject s); + + void setPointColor(GLfloat r, GLfloat g, GLfloat b); + void setGridColor(GLfloat, GLfloat, GLfloat); + + void clear(); + void invalidateTexture(); + + void redraw(); + + bool overlay; + bool drawGrid; + bool convertLabelUnits; + + }; #endif // PROJECTION_AXES_H_ diff --git a/Source/Processors/Visualization/SpikePlotting/SimpleKeyEvent.h b/Source/Processors/Visualization/SpikePlotting/SimpleKeyEvent.h index 5b620d589ac03c556701642481235500f2a1fb59..4f7d34e3a278b01186f036c7e6f0e2729f0d481c 100755 --- a/Source/Processors/Visualization/SpikePlotting/SimpleKeyEvent.h +++ b/Source/Processors/Visualization/SpikePlotting/SimpleKeyEvent.h @@ -7,8 +7,9 @@ */ -struct SimpleKeyEvent{ - +struct SimpleKeyEvent +{ + int key; bool shift; bool ctrl; diff --git a/Source/Processors/Visualization/SpikePlotting/SpikePlot.cpp b/Source/Processors/Visualization/SpikePlotting/SpikePlot.cpp index 615ae965c1a92d1d055bd473c0c827cd567211a1..aa36bff72c8089a68118da1562dac8cd3c56314a 100755 --- a/Source/Processors/Visualization/SpikePlotting/SpikePlot.cpp +++ b/Source/Processors/Visualization/SpikePlotting/SpikePlot.cpp @@ -3,16 +3,17 @@ #include "PlotUtils.h" SpikePlot::SpikePlot(): - BaseUIElement(), limitsChanged(true), nChannels(0), plotType(0), nWaveAx(1), nProjAx(0) + BaseUIElement(), limitsChanged(true), nChannels(0), plotType(0), nWaveAx(1), nProjAx(0) { } SpikePlot::SpikePlot(int x, int y, int w, int h, int p): - BaseUIElement(x,y,w,h,0), limitsChanged(true), plotType(p) + BaseUIElement(x,y,w,h,0), limitsChanged(true), plotType(p) { - switch(p){ + switch (p) + { case SINGLE_PLOT: std::cout<<"SpikePlot as SINGLE_PLOT"<<std::endl; nWaveAx = 1; @@ -31,11 +32,11 @@ SpikePlot::SpikePlot(int x, int y, int w, int h, int p): nProjAx = 6; nChannels = 4; break; -// case HIST_PLOT: -// nWaveAx = 1; -// nProjAx = 0; -// nHistAx = 1; -// break; + // case HIST_PLOT: + // nWaveAx = 1; + // nProjAx = 0; + // nHistAx = 1; + // break; default: // unsupported number of axes provided std::cout<<"SpikePlot as UNKNOWN, defaulting to SINGLE_PLOT"<<std::endl; nWaveAx = 1; @@ -43,59 +44,67 @@ SpikePlot::SpikePlot(int x, int y, int w, int h, int p): plotType = SINGLE_PLOT; nChannels = 1; } - - - - initAxes(); + + + + initAxes(); } -SpikePlot::~SpikePlot(){ +SpikePlot::~SpikePlot() +{ } // As a plot is a collection of axes simply have each axes can draw itself -void SpikePlot::redraw(){ +void SpikePlot::redraw() +{ for (int i=0; i<nWaveAx; i++) wAxes[i].redraw(); -// wAxes[1].redraw(); + // wAxes[1].redraw(); for (int i=0; i<nProjAx; i++) pAxes[i].redraw(); } // Have each axes process the spike event -void SpikePlot::processSpikeObject(SpikeObject s){ - //std::cout<<"ElectrdePlot::processSpikeObject()"<<std::endl; +void SpikePlot::processSpikeObject(SpikeObject s) +{ + //std::cout<<"ElectrdePlot::processSpikeObject()"<<std::endl; for (int i=0; i<nWaveAx; i++) wAxes[i].updateSpikeData(s); -// wAxes[1].updateSpikeData(s); + // wAxes[1].updateSpikeData(s); for (int i=0; i<nProjAx; i++) pAxes[i].updateSpikeData(s); } -void SpikePlot::setEnabled(bool e){ - BaseUIElement::enabled = e; - +void SpikePlot::setEnabled(bool e) +{ + BaseUIElement::enabled = e; + for (int i=0; i<nWaveAx; i++) wAxes[i].setEnabled(e); -// wAxes[1].setEnabled(e); + // wAxes[1].setEnabled(e); for (int i=0; i<nProjAx; i++) pAxes[i].setEnabled(e); } -bool SpikePlot::getEnabled(){ - return BaseUIElement::enabled; +bool SpikePlot::getEnabled() +{ + return BaseUIElement::enabled; } -void SpikePlot::initAxes(){ - initLimits(); - - for (int i=0; i<nWaveAx; i++){ +void SpikePlot::initAxes() +{ + initLimits(); + + for (int i=0; i<nWaveAx; i++) + { wAxes[i] = WaveAxes(0, 0, 1, 1, WAVE1 + i); // add i to increment the wave channel wAxes[i].setWaveformColor(1.0, 1.0, 1.0); } - - for (int i=0; i<nProjAx; i++){ + + for (int i=0; i<nProjAx; i++) + { pAxes[i] = ProjectionAxes(0, 0, 1, 1, PROJ1x2 + i); pAxes[i].setPointColor(1.0, 1.0, 1.0); } @@ -103,18 +112,20 @@ void SpikePlot::initAxes(){ updateAxesPositions(); // Set the position of the individual axes within the plot setLimitsOnAxes(); // initialize thel limits on the axes } -void SpikePlot::updateAxesPositions(){ +void SpikePlot::updateAxesPositions() +{ int minX = BaseUIElement::xpos; - int minY = BaseUIElement::ypos; - - double axesWidth;// = BaseUIElement::width/2; - double axesHeight;// = BaseUIElement::height; - - + int minY = BaseUIElement::ypos; + + double axesWidth;// = BaseUIElement::width/2; + double axesHeight;// = BaseUIElement::height; + + // to compute the axes positions we need to know how many columns of proj and wave axes should exist // using these two values we can calculate the positions of all of the sub axes int nProjCols, nWaveCols; - switch (plotType){ + switch (plotType) + { case SINGLE_PLOT: nProjCols = 0; nWaveCols = 1; @@ -135,7 +146,7 @@ void SpikePlot::updateAxesPositions(){ axesHeight = height/2; break; } - + for (int i=0; i<nWaveAx; i++) wAxes[i].setPosition(minX + (i % nWaveCols) * axesWidth/nWaveCols, minY + (i/nWaveCols) * axesHeight, axesWidth/nWaveCols, axesHeight); @@ -143,9 +154,10 @@ void SpikePlot::updateAxesPositions(){ pAxes[i].setPosition(minX + (1 + i%nProjCols) * axesWidth, minY + (i/nProjCols) * axesHeight, axesWidth, axesHeight); } -void SpikePlot::setLimitsOnAxes(){ +void SpikePlot::setLimitsOnAxes() +{ std::cout<<"SpikePlot::setLimitsOnAxes()"<<std::endl; - + for (int i=0; i<nWaveAx; i++) wAxes[i].setYLims(limits[i][0], limits[i][1]); @@ -154,21 +166,23 @@ void SpikePlot::setLimitsOnAxes(){ int j1, j2; for (int i=0; i<nProjAx; i++) { - n2ProjIdx(pAxes[i].getType(), &j1, &j2); - pAxes[i].setYLims(limits[j1][0], limits[j1][1]); - pAxes[i].setXLims(limits[j2][0], limits[j2][1]); + n2ProjIdx(pAxes[i].getType(), &j1, &j2); + pAxes[i].setYLims(limits[j1][0], limits[j1][1]); + pAxes[i].setXLims(limits[j2][0], limits[j2][1]); } } -void SpikePlot::setPosition(int x, int y, double w, double h){ - -// std::cout<<"SpikePlot::setPosition()"<<std::endl; - BaseUIElement::setPosition(x,y,w,h); - updateAxesPositions(); - +void SpikePlot::setPosition(int x, int y, double w, double h) +{ + + // std::cout<<"SpikePlot::setPosition()"<<std::endl; + BaseUIElement::setPosition(x,y,w,h); + updateAxesPositions(); + } -void SpikePlot::initLimits(){ +void SpikePlot::initLimits() +{ for (int i=0; i<nChannels; i++) { limits[i][0] = 1209;//-1*pow(2,11); @@ -177,8 +191,10 @@ void SpikePlot::initLimits(){ } -void SpikePlot::getBestDimensions(int* w, int* h){ - switch(plotType){ +void SpikePlot::getBestDimensions(int* w, int* h) +{ + switch (plotType) + { case TETRODE_PLOT: *w = 4; *h = 2; @@ -198,7 +214,8 @@ void SpikePlot::getBestDimensions(int* w, int* h){ } } -void SpikePlot::clear(){ +void SpikePlot::clear() +{ std::cout<<"SpikePlot::clear()"<<std::endl; for (int i=0; i<nWaveAx; i++) wAxes[i].clear(); @@ -207,18 +224,20 @@ void SpikePlot::clear(){ } -bool SpikePlot::processKeyEvent(SimpleKeyEvent k){ +bool SpikePlot::processKeyEvent(SimpleKeyEvent k) +{ return true; } -void SpikePlot::pan(int dim, bool up){ +void SpikePlot::pan(int dim, bool up) +{ std::cout<<"SpikePlot::pan() dim:"<<dim<<std::endl; - + int mean = (limits[dim][0] + limits[dim][1])/2; int dLim = limits[dim][1] - mean; - + if (up) mean = mean + dLim/20; else @@ -229,12 +248,13 @@ void SpikePlot::pan(int dim, bool up){ setLimitsOnAxes(); } -void SpikePlot::zoom(int dim, bool in){ +void SpikePlot::zoom(int dim, bool in) +{ std::cout<<"SpikePlot::zoom()"<<std::endl; - + int mean = (limits[dim][0] + limits[dim][1])/2; int dLim = limits[dim][1] - mean; - + if (in) dLim = dLim * .90; else diff --git a/Source/Processors/Visualization/SpikePlotting/SpikePlot.h b/Source/Processors/Visualization/SpikePlotting/SpikePlot.h index c674abc5dd02efdf86a1962306b0968a8c1e1629..de78863de40218f8f8b71106d0683cd82f6b3c30 100755 --- a/Source/Processors/Visualization/SpikePlotting/SpikePlot.h +++ b/Source/Processors/Visualization/SpikePlotting/SpikePlot.h @@ -2,9 +2,9 @@ #define SPIKE_PLOT_H_ #if defined(__linux__) - #include <GL/glut.h> +#include <GL/glut.h> #else - #include <GLUT/glut.h> +#include <GLUT/glut.h> #endif #include <list> #include <math.h> @@ -27,10 +27,11 @@ */ -class SpikePlot : public BaseUIElement{ - - bool enabled; - +class SpikePlot : public BaseUIElement +{ + + bool enabled; + bool limitsChanged; static const int MAX_N_CHAN = 4; @@ -40,43 +41,43 @@ class SpikePlot : public BaseUIElement{ int plotType; int nWaveAx; int nProjAx; - + double limits[MAX_N_CHAN][2]; WaveAxes wAxes[MAX_N_CHAN]; ProjectionAxes pAxes[MAX_N_PROJ]; - - - + + + // void zoomAxes(int n, bool xdim, int zoomval); // void zoomProjection (int n, bool xdim, int zoomval); // void zoomWaveform (int n, bool xdim, int zoomval); - + // void panAxes(int n, bool xdim, int panval); // void panProjection (int n, bool xdim, int panval); // void panWaveform(int n, bool xdim, int panval); - + void initLimits(); void setLimitsOnAxes(); void updateAxesPositions(); - + public: - SpikePlot(); - SpikePlot(int x, int y,int w,int h, int pType); - virtual ~SpikePlot(); - - void initAxes(); - void redraw(); - - void setEnabled(bool enabled); - bool getEnabled(); - void setPosition(int,int,double,double); - - void getBestDimensions(int*, int*); - + SpikePlot(); + SpikePlot(int x, int y,int w,int h, int pType); + virtual ~SpikePlot(); + + void initAxes(); + void redraw(); + + void setEnabled(bool enabled); + bool getEnabled(); + void setPosition(int,int,double,double); + + void getBestDimensions(int*, int*); + void mouseDown(int x, int y); - + void mouseDragX(int dx, bool shift, bool ctr); void mouseDragY(int dy, bool shift, bool ctr); diff --git a/Source/Processors/Visualization/SpikePlotting/WaveAxes.cpp b/Source/Processors/Visualization/SpikePlotting/WaveAxes.cpp index 348411daab55516b1fa159397eea8960bb5201d5..df776299ecf6cc29918c73d4ebc2ac3c4b7506d6 100755 --- a/Source/Processors/Visualization/SpikePlotting/WaveAxes.cpp +++ b/Source/Processors/Visualization/SpikePlotting/WaveAxes.cpp @@ -1,217 +1,225 @@ #include "WaveAxes.h" WaveAxes::WaveAxes() - : GenericAxes(), - drawWaveformLine(true), - drawWaveformPoints(false), - overlay(false), - drawGrid(true), - convertLabelUnits(true) + : GenericAxes(), + drawWaveformLine(true), + drawWaveformPoints(false), + overlay(false), + drawGrid(true), + convertLabelUnits(true) { - GenericAxes::gotFirstSpike = false; + GenericAxes::gotFirstSpike = false; - ylims[0] = 0; - ylims[1] = 1; - setWaveformColor(1.0,1.0,0.6); - setThresholdColor(1.0, 0.1, 0.1); - setGridColor(0.4, 0.2, 0.2); + ylims[0] = 0; + ylims[1] = 1; + setWaveformColor(1.0,1.0,0.6); + setThresholdColor(1.0, 0.1, 0.1); + setGridColor(0.4, 0.2, 0.2); } WaveAxes::WaveAxes(int x, int y, double w, double h, int t) - : GenericAxes(x,y,w,h,t), - drawWaveformLine(true), - drawWaveformPoints(false), - overlay(false), - drawGrid(true), - convertLabelUnits(true) + : GenericAxes(x,y,w,h,t), + drawWaveformLine(true), + drawWaveformPoints(false), + overlay(false), + drawGrid(true), + convertLabelUnits(true) { - GenericAxes::gotFirstSpike = false; + GenericAxes::gotFirstSpike = false; - setWaveformColor(1.0,1.0,0.6); - setThresholdColor(1.0, 0.1, 0.1); - setGridColor(0.2, 0.2, 0.2); + setWaveformColor(1.0,1.0,0.6); + setThresholdColor(1.0, 0.1, 0.1); + setGridColor(0.2, 0.2, 0.2); } -void WaveAxes::updateSpikeData(SpikeObject newSpike){ - //std::cout<<"WaveAxes::updateSpikeData()"<<std::endl; - GenericAxes::updateSpikeData(newSpike); +void WaveAxes::updateSpikeData(SpikeObject newSpike) +{ + //std::cout<<"WaveAxes::updateSpikeData()"<<std::endl; + GenericAxes::updateSpikeData(newSpike); } -void WaveAxes::redraw(){ - - BaseUIElement::redraw(); - - plot(); - - BaseUIElement::drawElementEdges(); +void WaveAxes::redraw() +{ + + BaseUIElement::redraw(); + + plot(); + + BaseUIElement::drawElementEdges(); } -void WaveAxes::plot(){ - - int chan = 0; - - // If no spikes have been received then don't plot anything - if (!gotFirstSpike) - { - //std::cout<<"\tWaiting for the first spike"<<std::endl; - return; - } - - //setYLims(-20000,20000); - - // Set the plotting range for the current axes the xlims member is ignored as the xdims are 0->number of samples per waveform minus one - // so the line goes all the way to the edges ydims are specified by the ylims vector - setViewportRange(0, ylims[0], s.nSamples-1, ylims[1]); - //setViewportRange(0, -2000, s.nSamples-1, 20000); - - //std::cout << "ylims set to " << ylims[0] << " " << ylims[1] << std::endl; - - // draw the grid lines for the waveforms? - if (drawGrid) - drawWaveformGrid(s.threshold[chan], s.gain[chan]); - - - //std::cout << "ylims set to " << ylims[0] << " " << ylims[1] << std::endl; - - //compute the spatial width for each waveform sample - float dx = 1; - float x = 0; - - // type corresponds to channel so we need to calculate the starting - // sample based upon which channel is getting plotted - // type values are defined in PlotUtils.h - int sampIdx = s.nSamples * type; // - //std::cout<<"Starting with idx:"<<sampIdx<<std::endl; - - - //Draw the individual waveform points connected with a line - glColor3fv(waveColor); - glLineWidth(2); - glBegin( GL_LINE_STRIP ); - - int dSamples = 1; - for (int i = 0; i < s.nSamples; i++) - { - //std::cout<<"\t"<<s.data[sampIdx]; - glVertex2f(x, s.data[sampIdx] - 32768); - sampIdx += dSamples; - x +=dx; - } - - glEnd(); - - - //Draw the threshold line and label - glColor3fv(thresholdColor); - glLineWidth(1); - glLineStipple(4, 0xAAAA); // make a dashed line - glEnable(GL_LINE_STIPPLE); - - glBegin( GL_LINE_STRIP ); - glVertex2f(0, s.threshold[chan]); - glVertex2f(s.nSamples, s.threshold[chan]); - glEnd(); - - glDisable(GL_LINE_STIPPLE); - - char cstr[100] = {0}; - - makeLabel(s.threshold[chan], s.gain[chan], convertLabelUnits, cstr); - String str = String(cstr); - - float yOffset = (ylims[1] - ylims[0])/BaseUIElement::height * 2; - drawString(1 ,s.threshold[chan] + yOffset, 15, str, font); +void WaveAxes::plot() +{ + + int chan = 0; + + // If no spikes have been received then don't plot anything + if (!gotFirstSpike) + { + //std::cout<<"\tWaiting for the first spike"<<std::endl; + return; + } + + //setYLims(-20000,20000); + + // Set the plotting range for the current axes the xlims member is ignored as the xdims are 0->number of samples per waveform minus one + // so the line goes all the way to the edges ydims are specified by the ylims vector + setViewportRange(0, ylims[0], s.nSamples-1, ylims[1]); + //setViewportRange(0, -2000, s.nSamples-1, 20000); + + //std::cout << "ylims set to " << ylims[0] << " " << ylims[1] << std::endl; + + // draw the grid lines for the waveforms? + if (drawGrid) + drawWaveformGrid(s.threshold[chan], s.gain[chan]); + + + //std::cout << "ylims set to " << ylims[0] << " " << ylims[1] << std::endl; + + //compute the spatial width for each waveform sample + float dx = 1; + float x = 0; + + // type corresponds to channel so we need to calculate the starting + // sample based upon which channel is getting plotted + // type values are defined in PlotUtils.h + int sampIdx = s.nSamples * type; // + //std::cout<<"Starting with idx:"<<sampIdx<<std::endl; + + + //Draw the individual waveform points connected with a line + glColor3fv(waveColor); + glLineWidth(2); + glBegin(GL_LINE_STRIP); + + int dSamples = 1; + for (int i = 0; i < s.nSamples; i++) + { + //std::cout<<"\t"<<s.data[sampIdx]; + glVertex2f(x, s.data[sampIdx] - 32768); + sampIdx += dSamples; + x +=dx; + } + + glEnd(); + + + //Draw the threshold line and label + glColor3fv(thresholdColor); + glLineWidth(1); + glLineStipple(4, 0xAAAA); // make a dashed line + glEnable(GL_LINE_STIPPLE); + + glBegin(GL_LINE_STRIP); + glVertex2f(0, s.threshold[chan]); + glVertex2f(s.nSamples, s.threshold[chan]); + glEnd(); + + glDisable(GL_LINE_STIPPLE); + + char cstr[100] = {0}; + + makeLabel(s.threshold[chan], s.gain[chan], convertLabelUnits, cstr); + String str = String(cstr); + + float yOffset = (ylims[1] - ylims[0])/BaseUIElement::height * 2; + drawString(1 ,s.threshold[chan] + yOffset, 15, str, font); } -void WaveAxes::drawWaveformGrid(int thold, int gain){ - - //setYLims(-20000,20000); - - double voltRange = ylims[1] - ylims[0]; - double pixelRange = BaseUIElement::height; - //This is a totally arbitrary value that seemed to lok the best for me - int minPixelsPerTick = 25; - int MAX_N_TICKS = 10; - - int nTicks = pixelRange / minPixelsPerTick; - while(nTicks > MAX_N_TICKS){ - minPixelsPerTick += 5; - nTicks = pixelRange / minPixelsPerTick; - } - - int voltPerTick = (voltRange / nTicks); - - glColor3fv(gridColor); - - glLineWidth(1); - char cstr[200] = {0}; - String str; - - double tickVoltage = thold; - - // If the limits are bad we don't want to hang the program trying to draw too many ticks - // so count the number of ticks drawn and kill the routine after 100 draws - int tickCount=0; - while (tickVoltage < ylims[1] - voltPerTick*1.5) // Draw the ticks above the thold line - { - tickVoltage = roundUp(tickVoltage + voltPerTick, 100); - - glBegin(GL_LINE_STRIP); - glVertex2i(0, tickVoltage); - glVertex2i(s.nSamples, tickVoltage); - glEnd(); - - makeLabel(tickVoltage, gain, convertLabelUnits, cstr); - str = String(cstr); - drawString(1, tickVoltage+voltPerTick/10, 15, str, font); - - if (tickCount++>100) - return; - } - - tickVoltage = thold; - tickCount = 0; - - while (tickVoltage > ylims[0] + voltPerTick) // draw the ticks below the thold line - { - tickVoltage = roundUp(tickVoltage - voltPerTick, 100); - - glBegin(GL_LINE_STRIP); - glVertex2i(0, tickVoltage); - glVertex2i(s.nSamples, tickVoltage); - glEnd(); - - makeLabel(tickVoltage, gain, convertLabelUnits, cstr); - str = String(cstr); - drawString(1, tickVoltage+voltPerTick/10, 15, str, font); - - if (tickCount++>100) - return; - } - - +void WaveAxes::drawWaveformGrid(int thold, int gain) +{ + + //setYLims(-20000,20000); + + double voltRange = ylims[1] - ylims[0]; + double pixelRange = BaseUIElement::height; + //This is a totally arbitrary value that seemed to lok the best for me + int minPixelsPerTick = 25; + int MAX_N_TICKS = 10; + + int nTicks = pixelRange / minPixelsPerTick; + while (nTicks > MAX_N_TICKS) + { + minPixelsPerTick += 5; + nTicks = pixelRange / minPixelsPerTick; + } + + int voltPerTick = (voltRange / nTicks); + + glColor3fv(gridColor); + + glLineWidth(1); + char cstr[200] = {0}; + String str; + + double tickVoltage = thold; + + // If the limits are bad we don't want to hang the program trying to draw too many ticks + // so count the number of ticks drawn and kill the routine after 100 draws + int tickCount=0; + while (tickVoltage < ylims[1] - voltPerTick*1.5) // Draw the ticks above the thold line + { + tickVoltage = roundUp(tickVoltage + voltPerTick, 100); + + glBegin(GL_LINE_STRIP); + glVertex2i(0, tickVoltage); + glVertex2i(s.nSamples, tickVoltage); + glEnd(); + + makeLabel(tickVoltage, gain, convertLabelUnits, cstr); + str = String(cstr); + drawString(1, tickVoltage+voltPerTick/10, 15, str, font); + + if (tickCount++>100) + return; + } + + tickVoltage = thold; + tickCount = 0; + + while (tickVoltage > ylims[0] + voltPerTick) // draw the ticks below the thold line + { + tickVoltage = roundUp(tickVoltage - voltPerTick, 100); + + glBegin(GL_LINE_STRIP); + glVertex2i(0, tickVoltage); + glVertex2i(s.nSamples, tickVoltage); + glEnd(); + + makeLabel(tickVoltage, gain, convertLabelUnits, cstr); + str = String(cstr); + drawString(1, tickVoltage+voltPerTick/10, 15, str, font); + + if (tickCount++>100) + return; + } + + } -void WaveAxes::setWaveformColor(GLfloat r, GLfloat g, GLfloat b){ - waveColor[0] = r; - waveColor[1] = g; - waveColor[2] = b; +void WaveAxes::setWaveformColor(GLfloat r, GLfloat g, GLfloat b) +{ + waveColor[0] = r; + waveColor[1] = g; + waveColor[2] = b; } -void WaveAxes::setThresholdColor(GLfloat r, GLfloat g, GLfloat b){ - thresholdColor[0] = r; - thresholdColor[1] = g; - thresholdColor[2] = b; +void WaveAxes::setThresholdColor(GLfloat r, GLfloat g, GLfloat b) +{ + thresholdColor[0] = r; + thresholdColor[1] = g; + thresholdColor[2] = b; } // void WaveAxes::setPointColor(GLfloat r, GLfloat g, GLfloat b){ // pointColor[0] = r; // pointColor[1] = g; // pointColor[2] = b; // } -void WaveAxes::setGridColor(GLfloat r, GLfloat g, GLfloat b){ - gridColor[0] = r; - gridColor[1] = g; - gridColor[2] = b; +void WaveAxes::setGridColor(GLfloat r, GLfloat g, GLfloat b) +{ + gridColor[0] = r; + gridColor[1] = g; + gridColor[2] = b; } diff --git a/Source/Processors/Visualization/SpikePlotting/WaveAxes.h b/Source/Processors/Visualization/SpikePlotting/WaveAxes.h index 3e077c53b84bb54263810c5ae2db4a93b0ba7ea6..2d45d68738b211ebd3e1a2851e5d91ad7369d7b7 100755 --- a/Source/Processors/Visualization/SpikePlotting/WaveAxes.h +++ b/Source/Processors/Visualization/SpikePlotting/WaveAxes.h @@ -2,9 +2,9 @@ #define WAVE_AXES_H #if defined(__linux__) - #include <GL/glut.h> +#include <GL/glut.h> #else - #include <GLUT/glut.h> +#include <GLUT/glut.h> #endif #include <stdlib.h> #include "BaseUIElement.h" @@ -17,39 +17,40 @@ Class for drawing spike waveforms. */ - -class WaveAxes: public GenericAxes{ - - GLfloat waveColor[3]; - GLfloat thresholdColor[3]; - GLfloat gridColor[3]; - - - void drawWaveformGrid(int thold, int gain); + +class WaveAxes: public GenericAxes +{ + + GLfloat waveColor[3]; + GLfloat thresholdColor[3]; + GLfloat gridColor[3]; + + + void drawWaveformGrid(int thold, int gain); protected: - void plot(); + void plot(); public: - WaveAxes(); - WaveAxes(int x, int y, double w, double h, int t); + WaveAxes(); + WaveAxes(int x, int y, double w, double h, int t); virtual ~WaveAxes() {} - - void updateSpikeData(SpikeObject s); - - void setWaveformColor(GLfloat r, GLfloat g, GLfloat b); - void setThresholdColor(GLfloat r, GLfloat g, GLfloat b); - void setGridColor(GLfloat, GLfloat, GLfloat); - - void redraw(); - - bool drawWaveformLine; - bool drawWaveformPoints; - bool overlay; - bool drawGrid; - bool convertLabelUnits; - + + void updateSpikeData(SpikeObject s); + + void setWaveformColor(GLfloat r, GLfloat g, GLfloat b); + void setThresholdColor(GLfloat r, GLfloat g, GLfloat b); + void setGridColor(GLfloat, GLfloat, GLfloat); + + void redraw(); + + bool drawWaveformLine; + bool drawWaveformPoints; + bool overlay; + bool drawGrid; + bool convertLabelUnits; + }; diff --git a/Source/Processors/Visualization/Visualizer.h b/Source/Processors/Visualization/Visualizer.h index d442341f57f66d03e95d737fba022fe2ffa2bb14..b9258cd4313a057b6ba20adedd9c1e1fa153454f 100755 --- a/Source/Processors/Visualization/Visualizer.h +++ b/Source/Processors/Visualization/Visualizer.h @@ -24,9 +24,6 @@ #ifndef __VISUALIZER_H_C5943EC1__ #define __VISUALIZER_H_C5943EC1__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../../JuceLibraryCode/JuceHeader.h" /** @@ -38,39 +35,54 @@ */ class Visualizer : public Component, - public Timer + public Timer { -public: - Visualizer() { refreshRate = 10; } // 10 Hz default refresh rate - ~Visualizer() {} +public: + Visualizer() + { + refreshRate = 10; // 10 Hz default refresh rate + } + ~Visualizer() {} /** Called when the component's tab becomes visible again.*/ - virtual void refreshState() = 0; + virtual void refreshState() = 0; /** Called when parameters of underlying data processor are changed.*/ - virtual void update() = 0; + virtual void update() = 0; + + /** Called instead of "repaint" to avoid redrawing underlying components if not necessary.*/ + virtual void refresh() = 0; /** Called when data acquisition is active.*/ - virtual void beginAnimation() = 0; + virtual void beginAnimation() = 0; /** Called when data acquisition ends.*/ - virtual void endAnimation() = 0; + virtual void endAnimation() = 0; /** Called by an editor to initiate a parameter change.*/ - virtual void setParameter(int, float) = 0; + virtual void setParameter(int, float) = 0; /** Called by an editor to initiate a parameter change.*/ virtual void setParameter(int, int, int, float) = 0; /** Starts the timer callbacks. */ - void startCallbacks() { startTimer(1/refreshRate); } + void startCallbacks() + { + startTimer(100); + } /** Stops the timer callbacks. */ - void stopCallbacks() { stopTimer(); } + void stopCallbacks() + { + stopTimer(); + } /** Called whenever the timer is triggered. */ - void timerCallback() { repaint(); } + void timerCallback() + { + refresh(); + } /** Refresh rate in Hz. */ float refreshRate; diff --git a/Source/Processors/WiFiOutput.cpp b/Source/Processors/WiFiOutput.cpp index 210b8c4788ab6d98719bcade7d8e84ba6474ba20..8a75331765acbf8c962ff502cc02f47c545d74f2 100755 --- a/Source/Processors/WiFiOutput.cpp +++ b/Source/Processors/WiFiOutput.cpp @@ -25,7 +25,7 @@ #include "WiFiOutput.h" WiFiOutput::WiFiOutput() - : GenericProcessor("WiFi Output") + : GenericProcessor("WiFi Output") { } @@ -36,8 +36,8 @@ WiFiOutput::~WiFiOutput() AudioProcessorEditor* WiFiOutput::createEditor() { - editor = new WiFiOutputEditor(this, true); - return editor; + editor = new WiFiOutputEditor(this, true); + return editor; } void WiFiOutput::handleEvent(int eventType, MidiMessage& event, int sampleNum) @@ -46,37 +46,40 @@ void WiFiOutput::handleEvent(int eventType, MidiMessage& event, int sampleNum) { startTimer((int) float(event.getTimeStamp())/getSampleRate()*1000.0); } - + } -void WiFiOutput::setParameter (int parameterIndex, float newValue) +void WiFiOutput::setParameter(int parameterIndex, float newValue) { } -void WiFiOutput::process(AudioSampleBuffer &buffer, - MidiBuffer &events, - int& nSamples) +void WiFiOutput::process(AudioSampleBuffer& buffer, + MidiBuffer& events, + int& nSamples) { - - checkForEvents(events); - + + checkForEvents(events); + } void WiFiOutput::timerCallback() { - std::cout << "FIRE!" << std::endl; - - try { - socket.sendTo("hi",2,"169.254.1.1",2000); - - WiFiOutputEditor* ed = (WiFiOutputEditor*) getEditor(); - ed->receivedEvent(); - } catch (SocketException &e) { - // don't do anything - } - - stopTimer(); + std::cout << "FIRE!" << std::endl; + + try + { + socket.sendTo("hi",2,"169.254.1.1",2000); + + WiFiOutputEditor* ed = (WiFiOutputEditor*) getEditor(); + ed->receivedEvent(); + } + catch (SocketException& e) + { + // don't do anything + } + + stopTimer(); } diff --git a/Source/Processors/WiFiOutput.h b/Source/Processors/WiFiOutput.h index 011678bb71c50b90f1259856e760d674cca7e154..bb9432be426cce306b78fddf73bf6527fe1f4448 100755 --- a/Source/Processors/WiFiOutput.h +++ b/Source/Processors/WiFiOutput.h @@ -25,9 +25,6 @@ #define __WIFIOUTPUT_H_94D625CE__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "GenericProcessor.h" #include "Editors/WiFiOutputEditor.h" @@ -49,30 +46,33 @@ class FilterViewport; class WiFiOutput : public GenericProcessor, - public Timer + public Timer { public: - - WiFiOutput(); - ~WiFiOutput(); - - void process(AudioSampleBuffer &buffer, MidiBuffer &midiMessages, int& nSamples); - void setParameter (int parameterIndex, float newValue); + + WiFiOutput(); + ~WiFiOutput(); + + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); + void setParameter(int parameterIndex, float newValue); void handleEvent(int eventType, MidiMessage& event, int sampleNum); - - AudioProcessorEditor* createEditor(); - bool isSink() {return true;} - + AudioProcessorEditor* createEditor(); + + bool isSink() + { + return true; + } + private: - UDPSocket socket; + UDPSocket socket; - void timerCallback(); + void timerCallback(); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WiFiOutput); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(WiFiOutput); }; diff --git a/Source/UI/ControlPanel.cpp b/Source/UI/ControlPanel.cpp index d6fab7714d022021235f5ff2956a5f26a085fc8a..1329b2ea90f49f1a79920c8b618d2d65cfef98cc 100755 --- a/Source/UI/ControlPanel.cpp +++ b/Source/UI/ControlPanel.cpp @@ -27,107 +27,108 @@ #include <math.h> PlayButton::PlayButton() - : DrawableButton ("PlayButton", DrawableButton::ImageFitted) + : DrawableButton("PlayButton", DrawableButton::ImageFitted) { - DrawablePath normal, over, down; + DrawablePath normal, over, down; - Path p; - p.addTriangle (0.0f, 0.0f, 0.0f, 20.0f, 18.0f, 10.0f); - normal.setPath (p); - normal.setFill (Colours::lightgrey); - normal.setStrokeThickness (0.0f); + Path p; + p.addTriangle(0.0f, 0.0f, 0.0f, 20.0f, 18.0f, 10.0f); + normal.setPath(p); + normal.setFill(Colours::lightgrey); + normal.setStrokeThickness(0.0f); - over.setPath (p); - over.setFill (Colours::black); - over.setStrokeFill (Colours::black); - over.setStrokeThickness (5.0f); + over.setPath(p); + over.setFill(Colours::black); + over.setStrokeFill(Colours::black); + over.setStrokeThickness(5.0f); - down.setPath (p); - down.setFill (Colours::pink); - down.setStrokeFill (Colours::pink); - down.setStrokeThickness (5.0f); + down.setPath(p); + down.setFill(Colours::pink); + down.setStrokeFill(Colours::pink); + down.setStrokeThickness(5.0f); - setImages (&normal, &over, &over); - // setBackgroundColours(Colours::darkgrey, Colours::yellow); - setClickingTogglesState (true); - setTooltip ("Start/stop acquisition"); + setImages(&normal, &over, &over); + // setBackgroundColours(Colours::darkgrey, Colours::yellow); + setClickingTogglesState(true); + setTooltip("Start/stop acquisition"); } PlayButton::~PlayButton() -{ +{ } RecordButton::RecordButton() - : DrawableButton ("RecordButton", DrawableButton::ImageFitted) + : DrawableButton("RecordButton", DrawableButton::ImageFitted) { - DrawablePath normal, over, down; + DrawablePath normal, over, down; - Path p; - p.addEllipse (0.0,0.0,20.0,20.0); - normal.setPath (p); - normal.setFill (Colours::lightgrey); - normal.setStrokeThickness (0.0f); + Path p; + p.addEllipse(0.0,0.0,20.0,20.0); + normal.setPath(p); + normal.setFill(Colours::lightgrey); + normal.setStrokeThickness(0.0f); - over.setPath (p); - over.setFill (Colours::black); - over.setStrokeFill (Colours::black); - over.setStrokeThickness (5.0f); + over.setPath(p); + over.setFill(Colours::black); + over.setStrokeFill(Colours::black); + over.setStrokeThickness(5.0f); - setImages (&normal, &over, &over); - //setBackgroundColours(Colours::darkgrey, Colours::red); - setClickingTogglesState (true); - setTooltip ("Start/stop writing to disk"); + setImages(&normal, &over, &over); + //setBackgroundColours(Colours::darkgrey, Colours::red); + setClickingTogglesState(true); + setTooltip("Start/stop writing to disk"); } RecordButton::~RecordButton() -{ +{ } CPUMeter::CPUMeter() : Label("CPU Meter","0.0"), cpu(0.0f), lastCpu(0.0f) { - MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); - Typeface::Ptr typeface = new CustomTypeface(mis); - font = Font(typeface); - font.setHeight(12); + MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); + Typeface::Ptr typeface = new CustomTypeface(mis); + font = Font(typeface); + font.setHeight(12); } CPUMeter::~CPUMeter() { } -void CPUMeter::updateCPU(float usage) { - lastCpu = cpu; - cpu = usage; +void CPUMeter::updateCPU(float usage) +{ + lastCpu = cpu; + cpu = usage; } void CPUMeter::paint(Graphics& g) { - g.fillAll(Colours::grey); - - g.setColour(Colours::yellow); - g.fillRect(0.0f,0.0f,getWidth()*cpu,float(getHeight())); + g.fillAll(Colours::grey); - g.setColour(Colours::black); - g.drawRect(0,0,getWidth(),getHeight(),1); + g.setColour(Colours::yellow); + g.fillRect(0.0f,0.0f,getWidth()*cpu,float(getHeight())); - g.setFont(font); - g.drawSingleLineText("CPU",65,12); + g.setColour(Colours::black); + g.drawRect(0,0,getWidth(),getHeight(),1); + + g.setFont(font); + g.drawSingleLineText("CPU",65,12); } DiskSpaceMeter::DiskSpaceMeter() -{ - MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); - Typeface::Ptr typeface = new CustomTypeface(mis); - font = Font(typeface); - font.setHeight(12); +{ + MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); + Typeface::Ptr typeface = new CustomTypeface(mis); + font = Font(typeface); + font.setHeight(12); } @@ -137,36 +138,36 @@ DiskSpaceMeter::~DiskSpaceMeter() void DiskSpaceMeter::updateDiskSpace(float percent) { - diskFree = percent; + diskFree = percent; } void DiskSpaceMeter::paint(Graphics& g) { - g.fillAll(Colours::grey); - - g.setColour(Colours::lightgrey); - if (diskFree > 0) - g.fillRect(0.0f,0.0f,getWidth()*diskFree,float(getHeight())); + g.fillAll(Colours::grey); + + g.setColour(Colours::lightgrey); + if (diskFree > 0) + g.fillRect(0.0f,0.0f,getWidth()*diskFree,float(getHeight())); - g.setColour(Colours::black); - g.drawRect(0,0,getWidth(),getHeight(),1); + g.setColour(Colours::black); + g.drawRect(0,0,getWidth(),getHeight(),1); + + g.setFont(font); + g.drawSingleLineText("DF",75,12); - g.setFont(font); - g.drawSingleLineText("DF",75,12); - } Clock::Clock() : isRunning(false), isRecording(false) { - MemoryInputStream mis(BinaryData::cpmonolightserialized, BinaryData::cpmonolightserializedSize, false); + MemoryInputStream mis(BinaryData::cpmonolightserialized, BinaryData::cpmonolightserializedSize, false); Typeface::Ptr typeface = new CustomTypeface(mis); clockFont = Font(typeface); clockFont.setHeight(30); - totalTime = 0; - totalRecordTime = 0; + totalTime = 0; + totalRecordTime = 0; } Clock::~Clock() @@ -176,215 +177,220 @@ Clock::~Clock() void Clock::paint(Graphics& g) { - g.fillAll(Colour(58,58,58)); - drawTime(g); + g.fillAll(Colour(58,58,58)); + drawTime(g); } void Clock::drawTime(Graphics& g) { - if (isRunning) - { - int64 now = Time::currentTimeMillis(); - int64 diff = now - lastTime; - totalTime += diff; + if (isRunning) + { + int64 now = Time::currentTimeMillis(); + int64 diff = now - lastTime; + totalTime += diff; + + if (isRecording) + { + totalRecordTime += diff; + } - if (isRecording) - { - totalRecordTime += diff; - } + lastTime = Time::currentTimeMillis(); + } - lastTime = Time::currentTimeMillis(); - } + int m; + int s; - int m; - int s; + if (isRecording) + { + g.setColour(Colours::red); + m = floor(totalRecordTime/60000.0); + s = floor((totalRecordTime - m*60000.0)/1000.0); - if (isRecording) - { - g.setColour(Colours::red); - m = floor(totalRecordTime/60000.0); - s = floor((totalRecordTime - m*60000.0)/1000.0); + } + else + { - } else { + if (isRunning) + g.setColour(Colours::yellow); + else + g.setColour(Colours::white); - if (isRunning) - g.setColour(Colours::yellow); - else - g.setColour(Colours::white); + m = floor(totalTime/60000.0); + s = floor((totalTime - m*60000.0)/1000.0); + } - m = floor(totalTime/60000.0); - s = floor((totalTime - m*60000.0)/1000.0); - } + String timeString = ""; - String timeString = ""; - - timeString += m; - timeString += " min "; - timeString += s; - timeString += " s"; + timeString += m; + timeString += " min "; + timeString += s; + timeString += " s"; - g.setFont(clockFont); - //g.setFont(30); - g.drawText(timeString, 0, 0, getWidth(), getHeight(), Justification::left, false); + g.setFont(clockFont); + //g.setFont(30); + g.drawText(timeString, 0, 0, getWidth(), getHeight(), Justification::left, false); -} +} void Clock::start() { - if (!isRunning) - { - isRunning = true; - lastTime = Time::currentTimeMillis(); - } + if (!isRunning) + { + isRunning = true; + lastTime = Time::currentTimeMillis(); + } } void Clock::resetRecordTime() { - totalRecordTime = 0; + totalRecordTime = 0; } void Clock::startRecording() { - if (!isRecording) - { - isRecording = true; - start(); - } + if (!isRecording) + { + isRecording = true; + start(); + } } void Clock::stop() { - if (isRunning) - { - isRunning = false; - isRecording = false; - } + if (isRunning) + { + isRunning = false; + isRecording = false; + } } void Clock::stopRecording() { - if (isRecording) - { - isRecording = false; - } + if (isRecording) + { + isRecording = false; + } } ControlPanelButton::ControlPanelButton(ControlPanel* cp_) : cp(cp_) { - open = false; + open = false; } ControlPanelButton::~ControlPanelButton() { - + } void ControlPanelButton::paint(Graphics& g) { - g.fillAll(Colour(58,58,58)); + g.fillAll(Colour(58,58,58)); - g.setColour(Colours::white); + g.setColour(Colours::white); - Path p; + Path p; - float h = getHeight(); - float w = getWidth(); + float h = getHeight(); + float w = getWidth(); - if (open) - { - p.addTriangle(0.5f*w, 0.8f*h, - 0.2f*w, 0.2f*h, - 0.8f*w, 0.2f*h); - } else { - p.addTriangle(0.8f*w, 0.8f*h, - 0.2f*w, 0.5f*h, - 0.8f*w, 0.2f*h); - } + if (open) + { + p.addTriangle(0.5f*w, 0.8f*h, + 0.2f*w, 0.2f*h, + 0.8f*w, 0.2f*h); + } + else + { + p.addTriangle(0.8f*w, 0.8f*h, + 0.2f*w, 0.5f*h, + 0.8f*w, 0.2f*h); + } - PathStrokeType pst = PathStrokeType(1.0f, PathStrokeType::curved, PathStrokeType::rounded); + PathStrokeType pst = PathStrokeType(1.0f, PathStrokeType::curved, PathStrokeType::rounded); - g.strokePath(p, pst); + g.strokePath(p, pst); } void ControlPanelButton::mouseDown(const MouseEvent& e) { - open = !open; - cp->openState(open); - repaint(); + open = !open; + cp->openState(open); + repaint(); } void ControlPanelButton::toggleState() { - open = !open; - repaint(); + open = !open; + repaint(); } ControlPanel::ControlPanel(ProcessorGraph* graph_, AudioComponent* audio_) - : graph (graph_), audio(audio_), initialize(true), open(false) + : graph(graph_), audio(audio_), initialize(true), open(false) { - if (1) { - MemoryInputStream mis(BinaryData::misoserialized, BinaryData::misoserializedSize, false); - Typeface::Ptr typeface = new CustomTypeface(mis); - font = Font(typeface); - font.setHeight(15); - } + if (1) + { + MemoryInputStream mis(BinaryData::misoserialized, BinaryData::misoserializedSize, false); + Typeface::Ptr typeface = new CustomTypeface(mis); + font = Font(typeface); + font.setHeight(15); + } - audioEditor = (AudioEditor*) graph->getAudioNode()->createEditor(); - addAndMakeVisible(audioEditor); + audioEditor = (AudioEditor*) graph->getAudioNode()->createEditor(); + addAndMakeVisible(audioEditor); - playButton = new PlayButton(); - playButton->addListener (this); - addAndMakeVisible(playButton); + playButton = new PlayButton(); + playButton->addListener(this); + addAndMakeVisible(playButton); - recordButton = new RecordButton(); - recordButton->addListener (this); - addAndMakeVisible(recordButton); + recordButton = new RecordButton(); + recordButton->addListener(this); + addAndMakeVisible(recordButton); - masterClock = new Clock(); - addAndMakeVisible(masterClock); + masterClock = new Clock(); + addAndMakeVisible(masterClock); - cpuMeter = new CPUMeter(); - addAndMakeVisible(cpuMeter); + cpuMeter = new CPUMeter(); + addAndMakeVisible(cpuMeter); - diskMeter = new DiskSpaceMeter(); - addAndMakeVisible(diskMeter); + diskMeter = new DiskSpaceMeter(); + addAndMakeVisible(diskMeter); - cpb = new ControlPanelButton(this); - addAndMakeVisible(cpb); + cpb = new ControlPanelButton(this); + addAndMakeVisible(cpb); - newDirectoryButton = new UtilityButton("+", font); - newDirectoryButton->setEnabledState(false); - newDirectoryButton->addListener (this); - addChildComponent(newDirectoryButton); + newDirectoryButton = new UtilityButton("+", font); + newDirectoryButton->setEnabledState(false); + newDirectoryButton->addListener(this); + addChildComponent(newDirectoryButton); - filenameComponent = new FilenameComponent("folder selector", - File::getCurrentWorkingDirectory().getFullPathName(), - true, - true, - true, - "*", - "", - ""); - addChildComponent(filenameComponent); + filenameComponent = new FilenameComponent("folder selector", + File::getCurrentWorkingDirectory().getFullPathName(), + true, + true, + true, + "*", + "", + ""); + addChildComponent(filenameComponent); - //diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace()); - //diskMeter->repaint(); - //refreshMeters(); - startTimer(10); + //diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace()); + //diskMeter->repaint(); + //refreshMeters(); + startTimer(10); - setWantsKeyboardFocus(true); + setWantsKeyboardFocus(true); } @@ -396,211 +402,224 @@ ControlPanel::~ControlPanel() void ControlPanel::setRecordState(bool t) { - //MessageManager* mm = MessageManager::getInstance(); + //MessageManager* mm = MessageManager::getInstance(); - recordButton->setToggleState(t, true); + recordButton->setToggleState(t, true); } void ControlPanel::updateChildComponents() { - filenameComponent->addListener(getProcessorGraph()->getRecordNode()); - getProcessorGraph()->getRecordNode()->filenameComponentChanged(filenameComponent); + filenameComponent->addListener(getProcessorGraph()->getRecordNode()); + getProcessorGraph()->getRecordNode()->filenameComponentChanged(filenameComponent); } void ControlPanel::createPaths() { - int w = 150; - int h1 = 32; - int h2 = 64; - int indent = 5; + int w = 150; + int h1 = 32; + int h2 = 64; + int indent = 5; - p1.clear(); - p1.startNewSubPath(0, h1); - p1.lineTo(w, h1); - p1.lineTo(w + indent, h1 + indent); - p1.lineTo(w + indent, h2 - indent); - p1.lineTo(w + indent*2, h2); - p1.lineTo(0, h2); - p1.closeSubPath(); + p1.clear(); + p1.startNewSubPath(0, h1); + p1.lineTo(w, h1); + p1.lineTo(w + indent, h1 + indent); + p1.lineTo(w + indent, h2 - indent); + p1.lineTo(w + indent*2, h2); + p1.lineTo(0, h2); + p1.closeSubPath(); - p2.clear(); - p2.startNewSubPath(getWidth(), h2-indent); - p2.lineTo(getWidth(), h2); - p2.lineTo(getWidth()-indent, h2); - p2.closeSubPath(); + p2.clear(); + p2.startNewSubPath(getWidth(), h2-indent); + p2.lineTo(getWidth(), h2); + p2.lineTo(getWidth()-indent, h2); + p2.closeSubPath(); } void ControlPanel::paint(Graphics& g) { - g.setColour(Colour(58,58,58)); - g.fillRect(0,0,getWidth(),getHeight()); + g.setColour(Colour(58,58,58)); + g.fillRect(0,0,getWidth(),getHeight()); + + if (open) + { + g.setColour(Colours::black); + g.fillPath(p1); + g.fillPath(p2); + } - if (open) - { - g.setColour(Colours::black); - g.fillPath(p1); - g.fillPath(p2); - } - } void ControlPanel::resized() { - int w = getWidth(); - int h = 32; //getHeight(); + int w = getWidth(); + int h = 32; //getHeight(); - if (playButton != 0) - playButton->setBounds(w-h*9,5,h-5,h-10); - - if (recordButton != 0) - recordButton->setBounds(w-h*8,5,h-5,h-10); + if (playButton != 0) + playButton->setBounds(w-h*9,5,h-5,h-10); - if (masterClock != 0) - masterClock->setBounds(w-h*6-15,0,h*6-15,h); - - if (cpuMeter != 0) - cpuMeter->setBounds(8,h/4,h*3,h/2); + if (recordButton != 0) + recordButton->setBounds(w-h*8,5,h-5,h-10); - if (diskMeter != 0) - diskMeter->setBounds(16+h*3,h/4,h*3,h/2); + if (masterClock != 0) + masterClock->setBounds(w-h*6-15,0,h*6-15,h); - if (audioEditor != 0) - audioEditor->setBounds(h*7,5,h*8,h-10); + if (cpuMeter != 0) + cpuMeter->setBounds(8,h/4,h*3,h/2); - if (cpb != 0) - cpb->setBounds(w-28,5,h-10,h-10); + if (diskMeter != 0) + diskMeter->setBounds(16+h*3,h/4,h*3,h/2); - createPaths(); + if (audioEditor != 0) + audioEditor->setBounds(h*7,5,h*8,h-10); - if (open) - { - filenameComponent->setBounds(200, h+5, w-250, h-10); - filenameComponent->setVisible(true); + if (cpb != 0) + cpb->setBounds(w-28,5,h-10,h-10); - newDirectoryButton->setBounds(165, h+5, h-10, h-10); - newDirectoryButton->setVisible(true); + createPaths(); - } else { - filenameComponent->setVisible(false); - newDirectoryButton->setVisible(false); - } + if (open) + { + filenameComponent->setBounds(200, h+5, w-250, h-10); + filenameComponent->setVisible(true); - repaint(); + newDirectoryButton->setBounds(165, h+5, h-10, h-10); + newDirectoryButton->setVisible(true); + + } + else + { + filenameComponent->setVisible(false); + newDirectoryButton->setVisible(false); + } + + repaint(); } void ControlPanel::openState(bool os) { - open = os; + open = os; - getUIComponent()->childComponentChanged(); + getUIComponent()->childComponentChanged(); } -void ControlPanel::buttonClicked(Button* button) +void ControlPanel::buttonClicked(Button* button) { - if (button == recordButton) - { - std::cout << "Record button pressed." << std::endl; - if (recordButton->getToggleState()) - { + if (button == recordButton) + { + std::cout << "Record button pressed." << std::endl; + if (recordButton->getToggleState()) + { + + playButton->setToggleState(true,false); + //graph->getRecordNode()->setParameter(1,10.0f); + masterClock->startRecording(); // turn on recording + - playButton->setToggleState(true,false); - //graph->getRecordNode()->setParameter(1,10.0f); - masterClock->startRecording(); // turn on recording + } + else + { + graph->getRecordNode()->setParameter(0,10.0f); // turn off recording + masterClock->stopRecording(); + newDirectoryButton->setEnabledState(true); + } + } + else if (button == playButton) + { + std::cout << "Play button pressed." << std::endl; + if (!playButton->getToggleState()) + { + if (recordButton->getToggleState()) + { + recordButton->setToggleState(false,false); + newDirectoryButton->setEnabledState(true); + } - } else { - graph->getRecordNode()->setParameter(0,10.0f); // turn off recording - masterClock->stopRecording(); - newDirectoryButton->setEnabledState(true); - } + } - } else if (button == playButton) { - std::cout << "Play button pressed." << std::endl; - if (!playButton->getToggleState()) - { - if (recordButton->getToggleState()) - { - recordButton->setToggleState(false,false); - newDirectoryButton->setEnabledState(true); - } - - } + } + else if (button == newDirectoryButton && newDirectoryButton->getEnabledState()) + { + getProcessorGraph()->getRecordNode()->createNewDirectory(); + newDirectoryButton->setEnabledState(false); + masterClock->resetRecordTime(); + return; - } else if (button == newDirectoryButton && newDirectoryButton->getEnabledState()) - { - getProcessorGraph()->getRecordNode()->createNewDirectory(); - newDirectoryButton->setEnabledState(false); - masterClock->resetRecordTime(); - return; + } - } + if (playButton->getToggleState()) + { - if (playButton->getToggleState()) - { + if (!audio->callbacksAreActive()) + { - if (!audio->callbacksAreActive()) { - - if (graph->enableProcessors()) - { - if (recordButton->getToggleState()) - graph->getRecordNode()->setParameter(1,10.0f); - - stopTimer(); - startTimer(250); // refresh every 250 ms - audio->beginCallbacks(); - masterClock->start(); - } - - } else { + if (graph->enableProcessors()) + { + if (recordButton->getToggleState()) + graph->getRecordNode()->setParameter(1,10.0f); - if (recordButton->getToggleState()) - graph->getRecordNode()->setParameter(1,10.0f); + stopTimer(); + startTimer(250); // refresh every 250 ms + audio->beginCallbacks(); + masterClock->start(); + } - } + } + else + { - } else { + if (recordButton->getToggleState()) + graph->getRecordNode()->setParameter(1,10.0f); - if (audio->callbacksAreActive()) { - audio->endCallbacks(); - graph->disableProcessors(); - refreshMeters(); - masterClock->stop(); - stopTimer(); - startTimer(10000); // back to refresh every 10 seconds + } - } + } + else + { - } + if (audio->callbacksAreActive()) + { + audio->endCallbacks(); + graph->disableProcessors(); + refreshMeters(); + masterClock->stop(); + stopTimer(); + startTimer(10000); // back to refresh every 10 seconds + + } + + } } void ControlPanel::disableCallbacks() { - std::cout << "Control panel received signal to disable callbacks." << std::endl; + std::cout << "Control panel received signal to disable callbacks." << std::endl; - if (audio->callbacksAreActive()) - { - std::cout << "Stopping audio." << std::endl; - audio->endCallbacks(); - std::cout << "Disabling processors." << std::endl; - graph->disableProcessors(); - std::cout << "Updating control panel." << std::endl; - refreshMeters(); - stopTimer(); - startTimer(10000); // back to refresh every 10 seconds - - } + if (audio->callbacksAreActive()) + { + std::cout << "Stopping audio." << std::endl; + audio->endCallbacks(); + std::cout << "Disabling processors." << std::endl; + graph->disableProcessors(); + std::cout << "Updating control panel." << std::endl; + refreshMeters(); + stopTimer(); + startTimer(10000); // back to refresh every 10 seconds - playButton->setToggleState(false,false); - recordButton->setToggleState(false,false); - masterClock->stopRecording(); - masterClock->stop(); + } + + playButton->setToggleState(false,false); + recordButton->setToggleState(false,false); + masterClock->stopRecording(); + masterClock->stop(); } @@ -616,53 +635,56 @@ void ControlPanel::disableCallbacks() // diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace()); // diskMeter->repaint(); - - + + // } void ControlPanel::timerCallback() { - //std::cout << "Message Received." << std::endl; - - refreshMeters(); - + //std::cout << "Message Received." << std::endl; + + refreshMeters(); + } void ControlPanel::refreshMeters() { - if (playButton->getToggleState()) { - cpuMeter->updateCPU(audio->deviceManager.getCpuUsage()); - } else { - cpuMeter->updateCPU(0.0f); - } + if (playButton->getToggleState()) + { + cpuMeter->updateCPU(audio->deviceManager.getCpuUsage()); + } + else + { + cpuMeter->updateCPU(0.0f); + } - cpuMeter->repaint(); + cpuMeter->repaint(); - masterClock->repaint(); + masterClock->repaint(); - diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace()); - diskMeter->repaint(); + diskMeter->updateDiskSpace(graph->getRecordNode()->getFreeSpace()); + diskMeter->repaint(); - if (initialize) - { - stopTimer(); - startTimer(5000); // check for disk updates every 5 seconds - initialize = false; - } + if (initialize) + { + stopTimer(); + startTimer(5000); // check for disk updates every 5 seconds + initialize = false; + } } bool ControlPanel::keyPressed(const KeyPress& key) { - std::cout << "Control panel received" << key.getKeyCode() << std::endl; + std::cout << "Control panel received" << key.getKeyCode() << std::endl; - return false; + return false; } void ControlPanel::toggleState() { - open = !open; + open = !open; - cpb->toggleState(); - getUIComponent()->childComponentChanged(); + cpb->toggleState(); + getUIComponent()->childComponentChanged(); } diff --git a/Source/UI/ControlPanel.h b/Source/UI/ControlPanel.h index 3bf4b6b7bc50796bf9c684608eaeb8619513a6c7..8eabeb7bc220907c24506905b3b38cc9e8d0ae9b 100755 --- a/Source/UI/ControlPanel.h +++ b/Source/UI/ControlPanel.h @@ -24,9 +24,6 @@ #ifndef __CONTROLPANEL_H_AD81E528__ #define __CONTROLPANEL_H_AD81E528__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "../Audio/AudioComponent.h" #include "../Processors/Editors/AudioEditor.h" @@ -37,16 +34,16 @@ #include "../Processors/Editors/GenericEditor.h" // for UtilityButton #include "../Processors/Visualization/OpenGLCanvas.h" -#include "../OpenGL.h" +//#include "../OpenGL.h" /** - + Toggles data acquisition on and off. The PlayButton is located in the ControlPanel. Clicking it toggles the state of the ProcessorGraph to either begin the callbacks that drive data through - the graph (acquisition on) or end these callbacks (acquisition off). + the graph (acquisition on) or end these callbacks (acquisition off). Acquisition can also be started by pressing the RecordButton (assuming callbacks are not already active). @@ -58,20 +55,20 @@ class PlayButton : public DrawableButton { - public: - PlayButton(); - ~PlayButton(); +public: + PlayButton(); + ~PlayButton(); }; /** - + Toggles recording on and off. - The RecordButton is located in the ControlPanel. Clicking it toggles the - state of the RecordNode to either begin saving data (recording on) or + The RecordButton is located in the ControlPanel. Clicking it toggles the + state of the RecordNode to either begin saving data (recording on) or stop saving data (recording off). - If the RecordButton is pressed while data acquisition is inactive, it + If the RecordButton is pressed while data acquisition is inactive, it will automatically start data acquisition before recording. @see ControlPanel, RecordNode @@ -80,13 +77,13 @@ class PlayButton : public DrawableButton class RecordButton : public DrawableButton { - public: - RecordButton(); - ~RecordButton(); +public: + RecordButton(); + ~RecordButton(); }; /** - + Displays the CPU load used up by the data processing callbacks. The CPUMeter is located in the ControlPanel. Whenever acquisition is active, @@ -95,7 +92,7 @@ class RecordButton : public DrawableButton It's not clear how accurate the meter is, nor how it deals with CPUs using multiple cores. For a more accurate measurement of CPU load, it's recommended to use a graphical - interface or type 'top' inside a terminal. + interface or type 'top' inside a terminal. @see ControlPanel @@ -103,28 +100,28 @@ class RecordButton : public DrawableButton class CPUMeter : public Label { - public: - CPUMeter(); - ~CPUMeter(); +public: + CPUMeter(); + ~CPUMeter(); + + /** Updates the load level displayed by the CPUMeter. Called by + the ControlPanel. */ + void updateCPU(float usage); - /** Updates the load level displayed by the CPUMeter. Called by - the ControlPanel. */ - void updateCPU(float usage); + /** Draws the CPUMeter. */ + void paint(Graphics& g); - /** Draws the CPUMeter. */ - void paint (Graphics& g); - - private: +private: - Font font; + Font font; - float cpu; - float lastCpu; + float cpu; + float lastCpu; }; /** - + Displays the amount of disk space left in the current data directory. The DiskSpaceMeter is located in the ControlPanel. When the GUI is launched (or the data directory @@ -139,31 +136,31 @@ class CPUMeter : public Label class DiskSpaceMeter : public Component { public: - DiskSpaceMeter(); - ~DiskSpaceMeter(); + DiskSpaceMeter(); + ~DiskSpaceMeter(); - /** Updates the free disk space displayed by the DiskSpaceMeter. Called by - the ControlPanel. */ - void updateDiskSpace(float percent); + /** Updates the free disk space displayed by the DiskSpaceMeter. Called by + the ControlPanel. */ + void updateDiskSpace(float percent); - /** Draws the DiskSpaceMeter. */ - void paint (Graphics& g); + /** Draws the DiskSpaceMeter. */ + void paint(Graphics& g); private: - Font font; + Font font; + + float diskFree; - float diskFree; - }; /** - + Displays the time. - The Clock is located in the ControlPanel. If acquisition (but not recording) is + The Clock is located in the ControlPanel. If acquisition (but not recording) is active, it displays (in yellow) the cumulative amount of time that the GUI has been acquiring data since - the application was launched. If recording is active, the Clock displays (in red) the + the application was launched. If recording is active, the Clock displays (in red) the cumulative amount of time that recording has been active. The Clock uses built-in JUCE functions for getting the system time. It does not @@ -177,50 +174,50 @@ private: class Clock : public Component { - public: - Clock(); - ~Clock(); +public: + Clock(); + ~Clock(); - /** Starts the acquisition (yellow) clock.*/ - void start(); + /** Starts the acquisition (yellow) clock.*/ + void start(); - /** Stops the acquisition (yellow) clock.*/ - void stop(); + /** Stops the acquisition (yellow) clock.*/ + void stop(); - /** Starts the recording (red) clock.*/ - void startRecording(); + /** Starts the recording (red) clock.*/ + void startRecording(); - /** Stops the recording (red) clock.*/ - void stopRecording(); + /** Stops the recording (red) clock.*/ + void stopRecording(); - /** Sets the cumulative recording time to zero.*/ - void resetRecordTime(); + /** Sets the cumulative recording time to zero.*/ + void resetRecordTime(); - /** Renders the clock.*/ - void paint(Graphics& g); + /** Renders the clock.*/ + void paint(Graphics& g); - private: +private: - /** Draws the current time.*/ - void drawTime(Graphics& g); + /** Draws the current time.*/ + void drawTime(Graphics& g); - int64 lastTime; + int64 lastTime; - int64 totalTime; - int64 totalRecordTime; + int64 totalTime; + int64 totalRecordTime; - bool isRunning; - bool isRecording; + bool isRunning; + bool isRecording; - Font clockFont; + Font clockFont; }; /** - + Used to show and hide the file browser within the ControlPanel. - The ControlPanel contains a JUCE FilenameComponent used to change the + The ControlPanel contains a JUCE FilenameComponent used to change the data directory. When not in use, this component can be hidden using the ControlPanelButton. @@ -231,33 +228,36 @@ class Clock : public Component class ControlPanelButton : public Component { public: - ControlPanelButton(ControlPanel* cp_); - ~ControlPanelButton(); + ControlPanelButton(ControlPanel* cp_); + ~ControlPanelButton(); - /** Returns the open/closed state of the ControlPanelButton.*/ - bool isOpen() {return open;} + /** Returns the open/closed state of the ControlPanelButton.*/ + bool isOpen() + { + return open; + } - /** Toggles the open/closed state of the ControlPanelButton.*/ - void toggleState(); + /** Toggles the open/closed state of the ControlPanelButton.*/ + void toggleState(); - /** Draws the button. */ - void paint(Graphics& g); + /** Draws the button. */ + void paint(Graphics& g); - /** Responds to mouse clicks within the button. */ - void mouseDown(const MouseEvent& e); + /** Responds to mouse clicks within the button. */ + void mouseDown(const MouseEvent& e); -private: +private: - ControlPanel* cp; + ControlPanel* cp; - bool open; + bool open; }; class UtilityButton; /** - + Provides general application controls along the top of the MainWindow. Displays useful information and provides buttons to control acquistion and recording. @@ -270,77 +270,83 @@ class UtilityButton; */ -class ControlPanel : public Component, - public Button::Listener, - public Timer, - public AccessClass +class ControlPanel : public Component, + public Button::Listener, + public Timer, + public AccessClass { public: - ControlPanel(ProcessorGraph* graph, AudioComponent* audio); - ~ControlPanel(); + ControlPanel(ProcessorGraph* graph, AudioComponent* audio); + ~ControlPanel(); + + /** Disables the callbacks of the ProcessorGraph (used to + drive data acquisition).*/ + void disableCallbacks(); - /** Disables the callbacks of the ProcessorGraph (used to - drive data acquisition).*/ - void disableCallbacks(); + /** Returns a pointer to the AudioEditor.*/ + AccessClass* getAudioEditor() + { + return (AccessClass*) audioEditor; + } - /** Returns a pointer to the AudioEditor.*/ - AccessClass* getAudioEditor() {return (AccessClass*) audioEditor;} + /** Sets whether or not the FilenameComponent is visible.*/ + void openState(bool isOpen); - /** Sets whether or not the FilenameComponent is visible.*/ - void openState(bool isOpen); - - /** Toggles the visibility of the FilenameComponent.*/ - void toggleState(); + /** Toggles the visibility of the FilenameComponent.*/ + void toggleState(); - /** Used to manually turn recording on and off.*/ - void setRecordState(bool isRecording); + /** Used to manually turn recording on and off.*/ + void setRecordState(bool isRecording); - /** Returns a boolean that indicates whether or not the FilenameComponet - is visible. */ - bool isOpen() {return open;} - -private: - ScopedPointer<PlayButton> playButton; - ScopedPointer<RecordButton> recordButton; - ScopedPointer<Clock> masterClock; - ScopedPointer<CPUMeter> cpuMeter; - ScopedPointer<DiskSpaceMeter> diskMeter; - ScopedPointer<FilenameComponent> filenameComponent; - ScopedPointer<UtilityButton> newDirectoryButton; - ScopedPointer<ControlPanelButton> cpb; + /** Returns a boolean that indicates whether or not the FilenameComponet + is visible. */ + bool isOpen() + { + return open; + } + +private: + ScopedPointer<PlayButton> playButton; + ScopedPointer<RecordButton> recordButton; + ScopedPointer<Clock> masterClock; + ScopedPointer<CPUMeter> cpuMeter; + ScopedPointer<DiskSpaceMeter> diskMeter; + ScopedPointer<FilenameComponent> filenameComponent; + ScopedPointer<UtilityButton> newDirectoryButton; + ScopedPointer<ControlPanelButton> cpb; - ProcessorGraph* graph; - AudioComponent* audio; - AudioEditor* audioEditor; + ProcessorGraph* graph; + AudioComponent* audio; + AudioEditor* audioEditor; - void paint(Graphics& g); + void paint(Graphics& g); - void resized(); + void resized(); - void buttonClicked(Button* button); + void buttonClicked(Button* button); - bool initialize; + bool initialize; - /** Adds the RecordNode as a listener of the FilenameComponent - (so it knows when the data directory has changed).*/ - void updateChildComponents(); + /** Adds the RecordNode as a listener of the FilenameComponent + (so it knows when the data directory has changed).*/ + void updateChildComponents(); - void timerCallback(); + void timerCallback(); - /** Updates the values displayed by the CPUMeter and DiskSpaceMeter.*/ - void refreshMeters(); + /** Updates the values displayed by the CPUMeter and DiskSpaceMeter.*/ + void refreshMeters(); - bool keyPressed(const KeyPress &key); + bool keyPressed(const KeyPress& key); - Font font; + Font font; - bool open; + bool open; - Path p1, p2; + Path p1, p2; - /** Draws the boundaries around the FilenameComponent.*/ - void createPaths(); + /** Draws the boundaries around the FilenameComponent.*/ + void createPaths(); }; diff --git a/Source/UI/CustomLookAndFeel.cpp b/Source/UI/CustomLookAndFeel.cpp index 19b056accd9d3cdc535658f513f611d5e25d19f4..0990c93753a6a3994fd6d71f84d12c219aeccd0c 100755 --- a/Source/UI/CustomLookAndFeel.cpp +++ b/Source/UI/CustomLookAndFeel.cpp @@ -60,13 +60,13 @@ CustomLookAndFeel::CustomLookAndFeel() : { // UNCOMMENT AFTER UPDATE - typefaceMap.set(String("Default Extra Light"), cpmonoExtraLight); - typefaceMap.set(String("Default Light"), cpmonoLight); - typefaceMap.set(String("Default"), cpmonoPlain); - typefaceMap.set(String("Default Bold"), cpmonoBold); - typefaceMap.set(String("Default Black"), cpmonoBlack); - typefaceMap.set(String("Miso Serialized"), misoRegular); - typefaceMap.set(String("Silkscreen"), silkscreen); + // typefaceMap.set(String("Default Extra Light"), cpmonoExtraLight); + // typefaceMap.set(String("Default Light"), cpmonoLight); + // typefaceMap.set(String("Default"), cpmonoPlain); + // typefaceMap.set(String("Default Bold"), cpmonoBold); + // typefaceMap.set(String("Default Black"), cpmonoBlack); + // typefaceMap.set(String("Paragraph"), misoRegular); + // typefaceMap.set(String("Silkscreen"), silkscreen); enum { PROCESSOR_COLOR = 0x801, @@ -77,7 +77,7 @@ CustomLookAndFeel::CustomLookAndFeel() : }; setColour(PROCESSOR_COLOR, Colour(59, 59, 59)); - setColour(FILTER_COLOR, Colour(99, 89, 0)); + setColour(FILTER_COLOR, Colour(255, 89, 0)); setColour(SINK_COLOR, Colour(255, 149, 0)); setColour(SOURCE_COLOR, Colour(255, 0, 0)); setColour(UTILITY_COLOR, Colour(90, 80, 80)); @@ -100,44 +100,38 @@ const Typeface::Ptr CustomLookAndFeel::getTypefaceForFont (const Font& font) String typefaceName = font.getTypefaceName(); // some of these names might be unnecessary, and there may be good ones - // missing. adjust as needed -// if (typefaceName.equalsIgnoreCase("Default Extra Light")) -// { -// return cpmonoExtraLight; -// } else if (typefaceName.equalsIgnoreCase("Default Light")) -// { -// return cpmonoLight; -// } else if (typefaceName.equalsIgnoreCase("Default")) -// { -// return cpmonoPlain; -// } else if (typefaceName.equalsIgnoreCase("Default Bold")) -// { -// return cpmonoBold; -// } else if (typefaceName.equalsIgnoreCase("Default Black")) -// { -// return cpmonoBlack; -// } else if (typefaceName.equalsIgnoreCase("Paragraph")) -// { -// return misoRegular; -// } else if (typefaceName.equalsIgnoreCase("Small Text")) -// { -// return silkscreen; -// } else // default -// { -// return LookAndFeel::getTypefaceForFont(font); -// } - - std::cout << "Looking for typeface named " << typefaceName << std::endl; - - // UNCOMMENT AFTER UPDATE - if (typefaceMap.contains(typefaceName)) + // missing. adjust as needed + if (typefaceName.equalsIgnoreCase("Default Extra Light")) + { + return cpmonoExtraLight; + } else if (typefaceName.equalsIgnoreCase("Default Light")) + { + return cpmonoLight; + } else if (typefaceName.equalsIgnoreCase("Default")) + { + return cpmonoPlain; + } else if (typefaceName.equalsIgnoreCase("Default Bold")) { - std::cout << "Returning custom font." << std::endl; - return typefaceMap[typefaceName]; - } else { - std::cout << "Returning standard font." << std::endl; - return LookAndFeel::getTypefaceForFont(font); + return cpmonoBold; + } else if (typefaceName.equalsIgnoreCase("Default Black")) + { + return cpmonoBlack; + } else if (typefaceName.equalsIgnoreCase("Paragraph")) + { + return misoRegular; + } else if (typefaceName.equalsIgnoreCase("Small Text")) + { + return silkscreen; + } else // default + { + return LookAndFeel::getTypefaceForFont(font); } + + // UNCOMMENT AFTER UPDATE + // if (typefaceMap.contains(typefaceName)) + // return typefaceMap[typefaceName]; + // else + // return LookAndFeel::getTypefaceForFont(font); } //================================================================== diff --git a/Source/UI/CustomLookAndFeel.h b/Source/UI/CustomLookAndFeel.h index 604b79b023f62d4cdbaede4088c93e4e460a56a9..310f49d2ba73d17467008263ecdc4bcc49fb341f 100755 --- a/Source/UI/CustomLookAndFeel.h +++ b/Source/UI/CustomLookAndFeel.h @@ -24,13 +24,10 @@ #ifndef __CUSTOMLOOKANDFEEL_H_6B021009__ #define __CUSTOMLOOKANDFEEL_H_6B021009__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" /** - + Used to modify the appearance of the application. Currently contains methods for drawing custom tabs, scroll bars, and sliders. @@ -44,74 +41,74 @@ class CustomLookAndFeel : public LookAndFeel { public: CustomLookAndFeel(); - ~CustomLookAndFeel(); - - // ======== custom typeface getter: ============================= - const Typeface::Ptr getTypefaceForFont (const Font& font); - - // ======== custom scroll bar methods: ============================= - - void drawScrollbarButton (Graphics& g, - ScrollBar& scrollbar, - int width, int height, - int buttonDirection, - bool isScrollBarVertical, - bool isMouseOverButton, - bool isButtonDown); - - void drawScrollbar (Graphics& g, - ScrollBar& scrollbar, - int x, int y, - int width, int height, - bool isScrollbarVertical, - int thumbStartPosition, - int thumbSize, - bool isMouseOver, - bool isMouseDown); - - - // ======== custom slider methods: ============================= - - void drawLinearSliderThumb (Graphics& g, - int x, int y, - int width, int height, - float sliderPos, - float minSliderPos, - float maxSliderPos, - const Slider::SliderStyle style, - Slider& slider); - - void drawLinearSliderBackground (Graphics& g, - int x, int y, - int width, int height, - float /*sliderPos*/, - float /*minSliderPos*/, - float /*maxSliderPos*/, - const Slider::SliderStyle /*style*/, - Slider& slider); - - - int getSliderThumbRadius (Slider& slider); - - void drawSliderKnob (Graphics& g, - const float x, const float y, - const float diameter, - const Colour& colour, - const float outlineThickness) throw(); - - void drawGlassPointer (Graphics& g, - const float x, const float y, - const float diameter, - const Colour& colour, const float outlineThickness, - const int direction) throw(); + ~CustomLookAndFeel(); + + // ======== custom typeface getter: ============================= + const Typeface::Ptr getTypefaceForFont(const Font& font); + + // ======== custom scroll bar methods: ============================= + + void drawScrollbarButton(Graphics& g, + ScrollBar& scrollbar, + int width, int height, + int buttonDirection, + bool isScrollBarVertical, + bool isMouseOverButton, + bool isButtonDown); + + void drawScrollbar(Graphics& g, + ScrollBar& scrollbar, + int x, int y, + int width, int height, + bool isScrollbarVertical, + int thumbStartPosition, + int thumbSize, + bool isMouseOver, + bool isMouseDown); + + + // ======== custom slider methods: ============================= + + void drawLinearSliderThumb(Graphics& g, + int x, int y, + int width, int height, + float sliderPos, + float minSliderPos, + float maxSliderPos, + const Slider::SliderStyle style, + Slider& slider); + + void drawLinearSliderBackground(Graphics& g, + int x, int y, + int width, int height, + float /*sliderPos*/, + float /*minSliderPos*/, + float /*maxSliderPos*/, + const Slider::SliderStyle /*style*/, + Slider& slider); + + + int getSliderThumbRadius(Slider& slider); + + void drawSliderKnob(Graphics& g, + const float x, const float y, + const float diameter, + const Colour& colour, + const float outlineThickness) throw(); + + void drawGlassPointer(Graphics& g, + const float x, const float y, + const float diameter, + const Colour& colour, const float outlineThickness, + const int direction) throw(); // ======== custom combo box methods: ============================= - void drawComboBox (Graphics& g, int width, int height, - const bool isButtonDown, - int buttonX, int buttonY, - int buttonW, int buttonH, - ComboBox& box); + void drawComboBox(Graphics& g, int width, int height, + const bool isButtonDown, + int buttonX, int buttonY, + int buttonW, int buttonH, + ComboBox& box); private: @@ -120,22 +117,22 @@ private: HashMap<String, Typeface::Ptr> typefaceMap; MemoryInputStream - cpmonoExtraLightStream, - cpmonoLightStream, - cpmonoPlainStream, - cpmonoBoldStream, - cpmonoBlackStream, - misoRegularStream, - silkscreenStream; + cpmonoExtraLightStream, + cpmonoLightStream, + cpmonoPlainStream, + cpmonoBoldStream, + cpmonoBlackStream, + misoRegularStream, + silkscreenStream; Typeface::Ptr - cpmonoExtraLight, - cpmonoLight, - cpmonoPlain, - cpmonoBold, - cpmonoBlack, - misoRegular, - silkscreen; + cpmonoExtraLight, + cpmonoLight, + cpmonoPlain, + cpmonoBold, + cpmonoBlack, + misoRegular, + silkscreen; }; diff --git a/Source/UI/DataViewport.cpp b/Source/UI/DataViewport.cpp index a1519583c536700e0a8245bb6ba842bf6f2c7331..ecb56c806f0b69a32686f5a9cf14b60239afb8f0 100755 --- a/Source/UI/DataViewport.cpp +++ b/Source/UI/DataViewport.cpp @@ -26,20 +26,20 @@ #include "../Processors/Visualization/Visualizer.h" DataViewport::DataViewport() : - TabbedComponent(TabbedButtonBar::TabsAtRight), - tabDepth(32), shutdown(false) + TabbedComponent(TabbedButtonBar::TabsAtRight), + tabDepth(32), shutdown(false) { tabArray.clear(); editorArray.clear(); - setTabBarDepth(tabDepth); - setIndent(8); // gap to leave around the edge - // of the content component - setColour(TabbedComponent::outlineColourId, - Colours::darkgrey); - setColour(TabbedComponent::backgroundColourId, - Colours::darkgrey); + setTabBarDepth(tabDepth); + setIndent(8); // gap to leave around the edge + // of the content component + setColour(TabbedComponent::outlineColourId, + Colours::darkgrey); + setColour(TabbedComponent::backgroundColourId, + Colours::darkgrey); } @@ -49,44 +49,47 @@ DataViewport::~DataViewport() } - int DataViewport::addTabToDataViewport(String name, Component* component, GenericEditor* editor) { +int DataViewport::addTabToDataViewport(String name, Component* component, GenericEditor* editor) +{ - if (tabArray.size() == 0) - setVisible(true); + if (tabArray.size() == 0) + setVisible(true); - int tabIndex = getTabbedButtonBar().getNumTabs(); + int tabIndex = getTabbedButtonBar().getNumTabs(); // Viewport* viewport = new Viewport(); // viewport->setViewedComponent(component, false); - // viewport->setBounds(0,0,getWidth(), getHeight()); - // viewport->setVisible(true); + // viewport->setBounds(0,0,getWidth(), getHeight()); + // viewport->setVisible(true); - addTab(name, Colours::lightgrey, component, false, tabIndex); + addTab(name, Colours::lightgrey, component, false, tabIndex); - getTabbedButtonBar().setCurrentTabIndex(tabIndex); + getTabbedButtonBar().setCurrentTabIndex(tabIndex); - getTabbedButtonBar().setTabBackgroundColour(tabIndex, Colours::darkgrey); + getTabbedButtonBar().setTabBackgroundColour(tabIndex, Colours::darkgrey); - setOutline(0); + setOutline(0); - tabArray.add(tabIndex); + tabArray.add(tabIndex); - editorArray.add(editor); + editorArray.add(editor); - return tabIndex; + return tabIndex; - } +} + +void DataViewport::selectTab(int index) +{ - void DataViewport::selectTab(int index) { - int newIndex = tabArray.indexOf(index); getTabbedButtonBar().setCurrentTabIndex(newIndex); - } +} + +void DataViewport::destroyTab(int index) +{ - void DataViewport::destroyTab(int index) { - int newIndex = tabArray.indexOf(index); tabArray.remove(newIndex); @@ -95,20 +98,20 @@ DataViewport::~DataViewport() removeTab(newIndex); if (tabArray.size() == 0) - setVisible(false); + setVisible(false); - setCurrentTabIndex(0); + setCurrentTabIndex(0); - } +} - void DataViewport::disableConnectionToEditorViewport() - { +void DataViewport::disableConnectionToEditorViewport() +{ std::cout << "DISABLING DATAVIEWPORT CONNECTION" << std::endl; shutdown = true; -} +} - void DataViewport::currentTabChanged(int newIndex, const String& newTabName) - { +void DataViewport::currentTabChanged(int newIndex, const String& newTabName) +{ // OpenGLCanvas* canvas = (OpenGLCanvas*) getTabContentComponent(newIndex); // if (canvas != 0) { @@ -116,25 +119,26 @@ DataViewport::~DataViewport() // } // std::cout << "CURRENT TAB CHANGED" << std::endl; - //std::cout << "number of editors remaining: " << editorArray.size() << std::endl; + //std::cout << "number of editors remaining: " << editorArray.size() << std::endl; - if (!shutdown) { + if (!shutdown) + { getEditorViewport()->makeEditorVisible(editorArray[newIndex]); - getTopLevelComponent()->repaint(); - } - } + getTopLevelComponent()->repaint(); + } +} void DataViewport::paint(Graphics& g) { - const TabbedButtonBar::Orientation o = getOrientation(); + const TabbedButtonBar::Orientation o = getOrientation(); - int x = 0; - int y = 0; - int r = getWidth(); - int b = getHeight(); + int x = 0; + int y = 0; + int r = getWidth(); + int b = getHeight(); - if (o == TabbedButtonBar::TabsAtTop) + if (o == TabbedButtonBar::TabsAtTop) y += tabDepth; else if (o == TabbedButtonBar::TabsAtBottom) b -= tabDepth; @@ -143,9 +147,9 @@ void DataViewport::paint(Graphics& g) else if (o == TabbedButtonBar::TabsAtRight) r -= tabDepth; - g.setColour(Colour(58,58,58)); + g.setColour(Colour(58,58,58)); g.fillRoundedRectangle(x,y,r-x,b-y,5.0f); - g.fillRect(x,y,r-20,b-y); + g.fillRect(x,y,r-20,b-y); g.fillRect(x,20,r-x,b-20); } \ No newline at end of file diff --git a/Source/UI/DataViewport.h b/Source/UI/DataViewport.h index d31a275efb0e5d6ed18412e194e60435ec815cf0..efdc9e92233d9823d313d2d97e0d9ecc5268ec58 100755 --- a/Source/UI/DataViewport.h +++ b/Source/UI/DataViewport.h @@ -24,20 +24,17 @@ #ifndef __DATAVIEWPORT_H_B38FE628__ #define __DATAVIEWPORT_H_B38FE628__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "../AccessClass.h" class GenericEditor; /** - + Holds tabs containing the application's visualizers. The DataViewport sits in the center of the MainWindow - and is always visible. Editors that create data + and is always visible. Editors that create data visualizations can place them in the DataViewport for easy access on small monitors, or in a separate window for maximum flexibility. @@ -49,42 +46,42 @@ class GenericEditor; */ class DataViewport : public TabbedComponent, - public AccessClass + public AccessClass { -public: - DataViewport(); - ~DataViewport(); +public: + DataViewport(); + ~DataViewport(); - /** Adds a new visualizer within a tab and returns the tab index.*/ - int addTabToDataViewport(String tabName, Component* componentToAdd, GenericEditor* editor); + /** Adds a new visualizer within a tab and returns the tab index.*/ + int addTabToDataViewport(String tabName, Component* componentToAdd, GenericEditor* editor); - /** Removes a tab with a specified index.*/ - void destroyTab(int); + /** Removes a tab with a specified index.*/ + void destroyTab(int); - /** Selects a tab with a specified index.*/ - void selectTab(int); + /** Selects a tab with a specified index.*/ + void selectTab(int); - /** Informs the component within the current tab that it's now active.*/ - void currentTabChanged(int newIndex, const String& newTabName); + /** Informs the component within the current tab that it's now active.*/ + void currentTabChanged(int newIndex, const String& newTabName); - /** Prevents the DataViewport from signaling EditorViewport when changing tabs.*/ - void disableConnectionToEditorViewport(); + /** Prevents the DataViewport from signaling EditorViewport when changing tabs.*/ + void disableConnectionToEditorViewport(); private: - /** Maps original tab indices to their location within the DataViewport. */ - Array<int> tabArray; + /** Maps original tab indices to their location within the DataViewport. */ + Array<int> tabArray; + + /** Maps processor editors to their respective tabs within the DataViewport. */ + Array<GenericEditor*> editorArray; + void paint(Graphics& g); + int tabDepth; - /** Maps processor editors to their respective tabs within the DataViewport. */ - Array<GenericEditor*> editorArray; - void paint(Graphics& g); - int tabDepth; + bool shutdown; - bool shutdown; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DataViewport); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DataViewport); - }; diff --git a/Source/UI/EditorViewport.cpp b/Source/UI/EditorViewport.cpp index aa8d988929e596ee0ff91b7b7b3b828b456765a0..e62fe9d384fba48fdd0d31f714091d413c64e752 100755 --- a/Source/UI/EditorViewport.cpp +++ b/Source/UI/EditorViewport.cpp @@ -28,11 +28,11 @@ EditorViewport::EditorViewport() : leftmostEditor(0), - message("Drag-and-drop some rows from the top-left box onto this component!"), - somethingIsBeingDraggedOver(false), shiftDown(false), canEdit(true), - lastEditorClicked(0), selectionIndex(0), borderSize(6), tabSize(30), - tabButtonSize(15), insertionPoint(0), componentWantsToMove(false), - indexOfMovingComponent(-1), currentTab(-1) + message("Drag-and-drop some rows from the top-left box onto this component!"), + somethingIsBeingDraggedOver(false), shiftDown(false), canEdit(true), + lastEditorClicked(0), selectionIndex(0), borderSize(6), tabSize(30), + tabButtonSize(15), insertionPoint(0), componentWantsToMove(false), + indexOfMovingComponent(-1), currentTab(-1) { addMouseListener(this, true); @@ -42,11 +42,11 @@ EditorViewport::EditorViewport() font = Font("Small Text", 10, Font::plain); font.setHeight(10); - sourceDropImage = ImageCache::getFromMemory (BinaryData::SourceDrop_png, - BinaryData::SourceDrop_pngSize); + sourceDropImage = ImageCache::getFromMemory(BinaryData::SourceDrop_png, + BinaryData::SourceDrop_pngSize); sourceDropImage = sourceDropImage.rescaled(25, 135, - Graphics::highResamplingQuality); + Graphics::highResamplingQuality); signalChainManager = new SignalChainManager(this, editorArray, signalChainArray); @@ -84,21 +84,23 @@ void EditorViewport::signalChainCanBeEdited(bool t) } -void EditorViewport::paint (Graphics& g) +void EditorViewport::paint(Graphics& g) { if (somethingIsBeingDraggedOver) { - g.setColour (Colours::yellow); + g.setColour(Colours::yellow); - } else { - g.setColour (Colour(48,48,48)); + } + else + { + g.setColour(Colour(48,48,48)); } - g.drawRect (0, 0, getWidth(), getHeight(), 2.0); + g.drawRect(0, 0, getWidth(), getHeight(), 2.0); g.drawVerticalLine(tabSize, 0, getHeight()); g.drawVerticalLine(getWidth()-tabSize, 0, getHeight()); - // g.drawHorizontalLine(getHeight()/2, getWidth()-tabSize, tabSize); + // g.drawHorizontalLine(getHeight()/2, getWidth()-tabSize, tabSize); for (int n = 0; n < 4; n++) { @@ -107,13 +109,13 @@ void EditorViewport::paint (Graphics& g) if (somethingIsBeingDraggedOver) { - float insertionX = (float) (borderSize) * 2.5 + (float) tabSize; + float insertionX = (float)(borderSize) * 2.5 + (float) tabSize; int n; for (n = 0; n < insertionPoint; n++) { insertionX += editorArray[n]->getWidth(); - + } if (n > 1) @@ -137,32 +139,37 @@ void EditorViewport::paint (Graphics& g) } -bool EditorViewport::isInterestedInDragSource (const SourceDetails& dragSourceDetails) +bool EditorViewport::isInterestedInDragSource(const SourceDetails& dragSourceDetails) { - if (canEdit && dragSourceDetails.description.toString().startsWith("Processors")) { + if (canEdit && dragSourceDetails.description.toString().startsWith("Processors")) + { return false; - } else { + } + else + { return true; } } -void EditorViewport::itemDragEnter (const SourceDetails& dragSourceDetails) +void EditorViewport::itemDragEnter(const SourceDetails& dragSourceDetails) { - if (canEdit) { + if (canEdit) + { somethingIsBeingDraggedOver = true; repaint(); - } + } } -void EditorViewport::itemDragMove (const SourceDetails& dragSourceDetails) +void EditorViewport::itemDragMove(const SourceDetails& dragSourceDetails) { int x = dragSourceDetails.localPosition.getX(); int y = dragSourceDetails.localPosition.getY(); - if (canEdit) { + if (canEdit) + { bool foundInsertionPoint = false; int lastCenterPoint = -1; @@ -173,8 +180,9 @@ void EditorViewport::itemDragMove (const SourceDetails& dragSourceDetails) { leftEdge = editorArray[n]->getX(); centerPoint = leftEdge + (editorArray[n]->getWidth())/2; - - if (x < centerPoint && x > lastCenterPoint) { + + if (x < centerPoint && x > lastCenterPoint) + { insertionPoint = n; foundInsertionPoint = true; } @@ -182,7 +190,8 @@ void EditorViewport::itemDragMove (const SourceDetails& dragSourceDetails) lastCenterPoint = centerPoint; } - if (!foundInsertionPoint) { + if (!foundInsertionPoint) + { insertionPoint = editorArray.size(); } @@ -202,12 +211,13 @@ void EditorViewport::itemDragExit(const SourceDetails& dragSourceDetails) } -void EditorViewport::itemDropped (const SourceDetails& dragSourceDetails) +void EditorViewport::itemDropped(const SourceDetails& dragSourceDetails) { String description = dragSourceDetails.description.toString(); - if (canEdit) { + if (canEdit) + { message = "last filter dropped: " + description; @@ -225,7 +235,7 @@ void EditorViewport::itemDropped (const SourceDetails& dragSourceDetails) activeEditor->setUIComponent(getUIComponent()); activeEditor->refreshColors(); addChildComponent(activeEditor); - + lastEditor = activeEditor; signalChainManager->updateVisibleEditors(activeEditor, indexOfMovingComponent, insertionPoint, ADD); @@ -238,8 +248,8 @@ void EditorViewport::itemDropped (const SourceDetails& dragSourceDetails) editorArray[i]->deselect(); } - } - + } + insertionPoint = -1; // make sure all editors are left-justified indexOfMovingComponent = -1; refreshEditors(); @@ -258,10 +268,12 @@ void EditorViewport::clearSignalChain() signalChainManager->clearSignalChain(); getProcessorGraph()->clearSignalChain(); - } else { + } + else + { sendActionMessage("Cannot clear signal chain while acquisition is active."); - + } repaint(); @@ -269,7 +281,7 @@ void EditorViewport::clearSignalChain() void EditorViewport::makeEditorVisible(GenericEditor* editor, bool highlight, bool updateSettings) { - + if (editor == 0) return; @@ -290,15 +302,16 @@ void EditorViewport::makeEditorVisible(GenericEditor* editor, bool highlight, bo } -void EditorViewport::deleteNode (GenericEditor* editor) +void EditorViewport::deleteNode(GenericEditor* editor) { - if (canEdit) { + if (canEdit) + { indexOfMovingComponent = editorArray.indexOf(editor); editor->setVisible(false); - + signalChainManager->updateVisibleEditors(editor, indexOfMovingComponent, insertionPoint, REMOVE); - + refreshEditors(); getProcessorGraph()->removeProcessor((GenericProcessor*) editor->getProcessor()); @@ -306,8 +319,9 @@ void EditorViewport::deleteNode (GenericEditor* editor) } -void EditorViewport::refreshEditors () { - +void EditorViewport::refreshEditors() +{ + int lastBound = borderSize+tabSize; int totalWidth = 0; @@ -324,22 +338,25 @@ void EditorViewport::refreshEditors () { for (int n = 0; n < editorArray.size(); n++) { - // std::cout << "Refreshing editor number" << n << std::endl; + // std::cout << "Refreshing editor number" << n << std::endl; int componentWidth = editorArray[n]->desiredWidth; - if (lastBound + componentWidth < getWidth()-tabSize && n >= leftmostEditor) { + if (lastBound + componentWidth < getWidth()-tabSize && n >= leftmostEditor) + { if (n == 0) { - if (!editorArray[n]->getEnabledState()) - { + if (!editorArray[n]->getEnabledState()) + { GenericProcessor* p = (GenericProcessor*) editorArray[n]->getProcessor(); if (!p->isSource()) lastBound += borderSize*10; - // signalChainNeedsSource = true; - } else { - // signalChainNeedsSource = false; + // signalChainNeedsSource = true; + } + else + { + // signalChainNeedsSource = false; } } @@ -349,12 +366,14 @@ void EditorViewport::refreshEditors () { { if (n != indexOfMovingComponent && n != indexOfMovingComponent+1) { - if (n == 0) - lastBound += borderSize*3; - else - lastBound += borderSize*2; + if (n == 0) + lastBound += borderSize*3; + else + lastBound += borderSize*2; } - } else { + } + else + { if (n == 0) lastBound += borderSize*3; else @@ -364,7 +383,7 @@ void EditorViewport::refreshEditors () { } editorArray[n]->setVisible(true); - // std::cout << "setting visible." << std::endl; + // std::cout << "setting visible." << std::endl; editorArray[n]->setBounds(lastBound, borderSize, componentWidth, getHeight()-borderSize*2); lastBound+=(componentWidth + borderSize); @@ -372,14 +391,16 @@ void EditorViewport::refreshEditors () { totalWidth = lastBound; - } else { + } + else + { editorArray[n]->setVisible(false); totalWidth += componentWidth + borderSize; // std::cout << "setting invisible." << std::endl; - if (lastBound + componentWidth > getWidth()-tabSize) + if (lastBound + componentWidth > getWidth()-tabSize) tooLong = true; } @@ -387,15 +408,15 @@ void EditorViewport::refreshEditors () { if (tooLong && editorArray.size() > 0) rightButton->setActive(true); - else + else rightButton->setActive(false); - + if (leftmostEditor == 0 || editorArray.size() == 0) leftButton->setActive(false); else leftButton->setActive(true); - // std::cout << totalWidth << " " << getWidth() - tabSize << std::endl; + // std::cout << totalWidth << " " << getWidth() - tabSize << std::endl; // if (totalWidth < getWidth()-tabSize && leftButton->isActive) // { @@ -405,37 +426,47 @@ void EditorViewport::refreshEditors () { } -void EditorViewport::moveSelection (const KeyPress &key) { - +void EditorViewport::moveSelection(const KeyPress& key) +{ + ModifierKeys mk = key.getModifiers(); - if (key.getKeyCode() == key.leftKey) { + if (key.getKeyCode() == key.leftKey) + { if (mk.isShiftDown()) { selectionIndex--; - } else { - + } + else + { + selectionIndex = 0; - for (int i = 0; i < editorArray.size(); i++) { - - if (editorArray[i]->getSelectionState() && i > 0) { + for (int i = 0; i < editorArray.size(); i++) + { + + if (editorArray[i]->getSelectionState() && i > 0) + { editorArray[i-1]->select(); lastEditorClicked = editorArray[i-1]; editorArray[i]->deselect(); - } + } } } - - } else if (key.getKeyCode() == key.rightKey) { - + + } + else if (key.getKeyCode() == key.rightKey) + { + if (mk.isShiftDown()) { selectionIndex++; - } else { - + } + else + { + selectionIndex = 0; // bool stopSelection = false; @@ -444,18 +475,21 @@ void EditorViewport::moveSelection (const KeyPress &key) { while (i < editorArray.size()-1) { - if (editorArray[i]->getSelectionState()) { + if (editorArray[i]->getSelectionState()) + { - // if (!stopSelection) + // if (!stopSelection) // { lastEditorClicked = editorArray[i+1]; editorArray[i+1]->select(); // stopSelection = true; - // } + // } editorArray[i]->deselect(); i += 2; - } else { + } + else + { editorArray[i]->deselect(); i++; } @@ -468,7 +502,7 @@ void EditorViewport::moveSelection (const KeyPress &key) { if (mk.isShiftDown() && lastEditorClicked != 0 && editorArray.contains(lastEditorClicked)) { - // std::cout << "Selection index: " << selectionIndex << std::endl; + // std::cout << "Selection index: " << selectionIndex << std::endl; // int startIndex = editorArray.indexOf(lastEditorClicked); @@ -492,26 +526,28 @@ void EditorViewport::moveSelection (const KeyPress &key) { } // } else if (key.getKeyCode() == key.upKey) { - + // // move one tab up // } else if (key.getKeyCode() == key.downKey) { - + // // move one tab down // } } -bool EditorViewport::keyPressed (const KeyPress &key) { - - //std::cout << "Editor viewport received " << key.getKeyCode() << std::endl; +bool EditorViewport::keyPressed(const KeyPress& key) +{ + + //std::cout << "Editor viewport received " << key.getKeyCode() << std::endl; - if (canEdit && editorArray.size() > 0) - { + if (canEdit && editorArray.size() > 0) + { ModifierKeys mk = key.getModifiers(); - if (key.getKeyCode() == key.deleteKey || key.getKeyCode() == key.backspaceKey) { + if (key.getKeyCode() == key.deleteKey || key.getKeyCode() == key.backspaceKey) + { - if (!mk.isAnyModifierKeyDown()) + if (!mk.isAnyModifierKeyDown()) { Array<GenericEditor*> editorsToRemove; @@ -528,34 +564,38 @@ bool EditorViewport::keyPressed (const KeyPress &key) { return true; } - } else if (key.getKeyCode() == key.leftKey || - key.getKeyCode() == key.rightKey) { + } + else if (key.getKeyCode() == key.leftKey || + key.getKeyCode() == key.rightKey) + { moveSelection(key); return true; - } else if (key.getKeyCode() == key.upKey) + } + else if (key.getKeyCode() == key.upKey) { lastEditorClicked->switchIO(0); - + return true; - } else if (key.getKeyCode() == key.downKey) + } + else if (key.getKeyCode() == key.downKey) { lastEditorClicked->switchIO(1); return true; } } - return false; + return false; } //void EditorViewport::modifierKeysChanged (const ModifierKeys & modifiers) { - + /* if (modifiers.isShiftDown()) { - + std::cout << "Shift key pressed." << std::endl; shiftDown = true; @@ -569,32 +609,38 @@ bool EditorViewport::keyPressed (const KeyPress &key) { //} void EditorViewport::selectEditor(GenericEditor* editor) -{ - for (int i = 0; i < editorArray.size(); i++) { - +{ + for (int i = 0; i < editorArray.size(); i++) + { + if (editor == editorArray[i] - || editor->getParentComponent() == editorArray[i]) { + || editor->getParentComponent() == editorArray[i]) + { editorArray[i]->select(); - } else { + } + else + { editorArray[i]->deselect(); } - } + } } -void EditorViewport::mouseDown(const MouseEvent &e) { - +void EditorViewport::mouseDown(const MouseEvent& e) +{ + - // std::cout << "Mouse click at " << e.x << " " << e.y << std::endl; + // std::cout << "Mouse click at " << e.x << " " << e.y << std::endl; bool clickInEditor = false; - for (int i = 0; i < editorArray.size(); i++) { - + for (int i = 0; i < editorArray.size(); i++) + { + if (e.eventComponent == editorArray[i] && e.y < 22) // event must take place along title bar - // || e.eventComponent->getParentComponent() == editorArray[i] || - // e.eventComponent->getParentComponent()->getParentComponent() == - // editorArray[i]) + // || e.eventComponent->getParentComponent() == editorArray[i] || + // e.eventComponent->getParentComponent()->getParentComponent() == + // editorArray[i]) { clickInEditor = true; @@ -614,8 +660,10 @@ void EditorViewport::mouseDown(const MouseEvent &e) { editorArray[j]->select(); } - } else { - for (int j = i-1; j >= index; j-- ) + } + else + { + for (int j = i-1; j >= index; j--) { editorArray[j]->select(); } @@ -627,7 +675,7 @@ void EditorViewport::mouseDown(const MouseEvent &e) { break; } - lastEditorClicked = editorArray[i]; + lastEditorClicked = editorArray[i]; // Array<GenericEditor*> editorsToSelect; @@ -672,35 +720,39 @@ void EditorViewport::mouseDown(const MouseEvent &e) { // break; - // } + // } - } else { + } + else + { if (!e.mods.isCtrlDown() && !e.mods.isShiftDown()) editorArray[i]->deselect(); } - } + } if (!clickInEditor) lastEditorClicked = 0; } -void EditorViewport::mouseDrag(const MouseEvent &e) { - +void EditorViewport::mouseDrag(const MouseEvent& e) +{ + - if (editorArray.contains((GenericEditor*) e.originalComponent) - && e.y < 15 + if (editorArray.contains((GenericEditor*) e.originalComponent) + && e.y < 15 && canEdit - && editorArray.size() > 1) { + && editorArray.size() > 1) + { componentWantsToMove = true; indexOfMovingComponent = editorArray.indexOf((GenericEditor*) e.originalComponent); } - if (componentWantsToMove) + if (componentWantsToMove) { somethingIsBeingDraggedOver = true; @@ -718,7 +770,7 @@ void EditorViewport::mouseDrag(const MouseEvent &e) { leftEdge = editorArray[n]->getX(); centerPoint = leftEdge + (editorArray[n]->getWidth())/2; - if (event.x < centerPoint && event.x > lastCenterPoint) + if (event.x < centerPoint && event.x > lastCenterPoint) { insertionPoint = n; foundInsertionPoint = true; @@ -727,7 +779,8 @@ void EditorViewport::mouseDrag(const MouseEvent &e) { lastCenterPoint = centerPoint; } - if (!foundInsertionPoint && indexOfMovingComponent != editorArray.size()-1) { + if (!foundInsertionPoint && indexOfMovingComponent != editorArray.size()-1) + { insertionPoint = editorArray.size(); } @@ -737,11 +790,13 @@ void EditorViewport::mouseDrag(const MouseEvent &e) { } -void EditorViewport::mouseUp(const MouseEvent &e) { +void EditorViewport::mouseUp(const MouseEvent& e) +{ - if (componentWantsToMove) { - + if (componentWantsToMove) + { + somethingIsBeingDraggedOver = false; componentWantsToMove = false; @@ -757,10 +812,12 @@ void EditorViewport::mouseUp(const MouseEvent &e) { } -void EditorViewport::mouseExit(const MouseEvent &e) { +void EditorViewport::mouseExit(const MouseEvent& e) +{ + + if (componentWantsToMove) + { - if (componentWantsToMove) { - somethingIsBeingDraggedOver = false; componentWantsToMove = false; @@ -774,18 +831,22 @@ void EditorViewport::mouseExit(const MouseEvent &e) { void EditorViewport::checkScrollButtons(int topTab) { - + if (signalChainArray.size() - topTab > 4) { downButton->setActive(true); - } else { + } + else + { downButton->setActive(false); } if (topTab > 0) { upButton->setActive(true); - } else { + } + else + { upButton->setActive(false); } @@ -801,7 +862,8 @@ bool EditorViewport::isSignalChainEmpty() } -void EditorViewport::resized() { +void EditorViewport::resized() +{ int b = 2; // border @@ -813,7 +875,7 @@ void EditorViewport::resized() { refreshEditors(); } -void EditorViewport::buttonClicked (Button* button) +void EditorViewport::buttonClicked(Button* button) { if (button == upButton) { @@ -822,20 +884,23 @@ void EditorViewport::buttonClicked (Button* button) if (upButton->isActive) signalChainManager->scrollUp(); - } else if (button == downButton) + } + else if (button == downButton) { if (downButton->isActive) signalChainManager->scrollDown(); - } else if (button == leftButton) + } + else if (button == leftButton) { if (leftButton->isActive) { leftmostEditor -= 1; refreshEditors(); } - - } else if (button == rightButton) + + } + else if (button == rightButton) { if (rightButton->isActive) { @@ -850,12 +915,12 @@ void EditorViewport::buttonClicked (Button* button) /////////////////////////////////////////////////////////////////// SignalChainTabButton::SignalChainTabButton() : Button("Name"), - configurationChanged(true) + configurationChanged(true) { setRadioGroupId(99); setClickingTogglesState(true); - // MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); + // MemoryInputStream mis(BinaryData::silkscreenserialized, BinaryData::silkscreenserializedSize, false); //Typeface::Ptr typeface = new CustomTypeface(mis); buttonFont = Font("Small Text", 10, Font::plain); buttonFont.setHeight(14); @@ -864,58 +929,62 @@ SignalChainTabButton::SignalChainTabButton() : Button("Name"), } -void SignalChainTabButton::clicked() +void SignalChainTabButton::clicked() { - + //std::cout << "Button clicked: " << firstEditor->getName() << std::endl; EditorViewport* ev = (EditorViewport*) getParentComponent(); - scm->updateVisibleEditors(firstEditor, 0, 0, ACTIVATE); + scm->updateVisibleEditors(firstEditor, 0, 0, ACTIVATE); ev->leftmostEditor = offset; - ev->refreshEditors(); + ev->refreshEditors(); + - } -void SignalChainTabButton::paintButton(Graphics &g, bool isMouseOver, bool isButtonDown) +void SignalChainTabButton::paintButton(Graphics& g, bool isMouseOver, bool isButtonDown) { ColourGradient grad1, grad2; - if (getToggleState() == true) { + if (getToggleState() == true) + { - grad1 = ColourGradient(Colour(255, 136, 34), 0.0f, 0.0f, + grad1 = ColourGradient(Colour(255, 136, 34), 0.0f, 0.0f, Colour(230, 193, 32), 0.0f, 20.0f, false); - grad2 = ColourGradient(Colour(255, 136, 34), 0.0f, 20.0f, + grad2 = ColourGradient(Colour(255, 136, 34), 0.0f, 20.0f, Colour(230, 193, 32), 0.0f, 0.0f, false); } - else { - grad2 = ColourGradient(Colour(80, 80, 80), 0.0f, 20.0f, + else + { + grad2 = ColourGradient(Colour(80, 80, 80), 0.0f, 20.0f, Colour(120, 120, 120), 0.0f, 0.0f, false); - grad1 = ColourGradient(Colour(80, 80, 80), 0.0f, 0.0f, - Colour(120, 120, 120), 0.0f, 20.0f, - false); + grad1 = ColourGradient(Colour(80, 80, 80), 0.0f, 0.0f, + Colour(120, 120, 120), 0.0f, 20.0f, + false); } - if (isMouseOver) { - + if (isMouseOver) + { + grad1.multiplyOpacity(0.7f); grad2.multiplyOpacity(0.7f); - // grad1 = ColourGradient(Colour(255, 255, 255), 0.0f, 20.0f, + // grad1 = ColourGradient(Colour(255, 255, 255), 0.0f, 20.0f, // Colour(180, 180, 180), 0.0f, 0.0f, // false); - // grad2 = ColourGradient(Colour(255, 255, 255), 0.0f, 0.0f, + // grad2 = ColourGradient(Colour(255, 255, 255), 0.0f, 0.0f, // Colour(180, 180, 180), 0.0f, 20.0f, // false); } - if (isButtonDown) { + if (isButtonDown) + { // ColourGradient grad3 = grad1; // grad1 = grad2; @@ -964,14 +1033,14 @@ void SignalChainTabButton::paintButton(Graphics &g, bool isMouseOver, bool isBut // how about some loading and saving? -XmlElement* EditorViewport::createNodeXml (GenericEditor* editor, - int insertionPt) +XmlElement* EditorViewport::createNodeXml(GenericEditor* editor, + int insertionPt) { XmlElement* e = new XmlElement("PROCESSOR"); GenericProcessor* source = (GenericProcessor*) editor->getProcessor(); - + String name = ""; if (source->isSource()) @@ -987,14 +1056,14 @@ XmlElement* EditorViewport::createNodeXml (GenericEditor* editor, std::cout << name << std::endl; - e->setAttribute ("name", name); - e->setAttribute ("insertionPoint", insertionPt); - + e->setAttribute("name", name); + e->setAttribute("insertionPoint", insertionPt); + /**Saves parameters to XML */ std::cout << "Create subnotes with parameters" << std::endl; source->saveToXML(e); - // source->stateSaved = true; - + // source->stateSaved = true; + //GenericProcessor* dest = (GenericProcessor*) source->getDestNode(); return e; @@ -1002,32 +1071,34 @@ XmlElement* EditorViewport::createNodeXml (GenericEditor* editor, } -XmlElement* EditorViewport::switchNodeXml (GenericProcessor* processor) +XmlElement* EditorViewport::switchNodeXml(GenericProcessor* processor) { XmlElement* e = new XmlElement("SWITCH"); - e->setAttribute ("number", processor->saveOrder); + e->setAttribute("number", processor->saveOrder); return e; } -const String EditorViewport::saveState() +const String EditorViewport::saveState() { - String error; + String error; - FileChooser fc ("Choose the file to save...", - File::getCurrentWorkingDirectory(), - "*", - true); + FileChooser fc("Choose the file to save...", + File::getCurrentWorkingDirectory(), + "*", + true); if (fc.browseForFileToSave(true)) { currentFile = fc.getResult(); std::cout << currentFile.getFileName() << std::endl; - } else { + } + else + { error = "No file chosen."; std::cout << "no file chosen." << std::endl; return error; @@ -1036,7 +1107,7 @@ const String EditorViewport::saveState() Array<GenericProcessor*> splitPoints; /** Used to reset saveOrder at end, to allow saving the same processor multiple times*/ Array<GenericProcessor*> allProcessors; - + bool moveForward; int saveOrder = 0; @@ -1052,38 +1123,45 @@ const String EditorViewport::saveState() GenericEditor* editor = signalChainArray[n]->getEditor(); int insertionPt = 1; - + while (editor != 0) { GenericProcessor* currentProcessor = (GenericProcessor*) editor->getProcessor(); GenericProcessor* nextProcessor; - if (currentProcessor->saveOrder < 0) { // create a new XML element + if (currentProcessor->saveOrder < 0) // create a new XML element + { signalChain->addChildElement(createNodeXml(editor, insertionPt)); currentProcessor->saveOrder = saveOrder; allProcessors.addIfNotAlreadyThere(currentProcessor); saveOrder++; - } else { + } + else + { std::cout << " Processor already saved as number " << currentProcessor->saveOrder << std::endl; } - - if (moveForward) { + + if (moveForward) + { std::cout << " Moving forward along signal chain." << std::endl; nextProcessor = currentProcessor->getDestNode(); - } else { + } + else + { std::cout << " Moving backward along signal chain." << std::endl; nextProcessor = currentProcessor->getSourceNode(); } - - if (nextProcessor != 0) { // continue until the end of the chain + + if (nextProcessor != 0) // continue until the end of the chain + { editor = (GenericEditor*) nextProcessor->getEditor(); - if ((nextProcessor->isSplitter() || nextProcessor->isMerger()) + if ((nextProcessor->isSplitter() || nextProcessor->isMerger()) && nextProcessor->saveOrder < 0) { splitPoints.add(nextProcessor); @@ -1091,30 +1169,37 @@ const String EditorViewport::saveState() nextProcessor->switchIO(0); } - } else { + } + else + { std::cout << " No processor found." << std::endl; - if (splitPoints.size() > 0) { + if (splitPoints.size() > 0) + { nextProcessor = splitPoints.getFirst(); splitPoints.remove(0); nextProcessor->switchIO(1); signalChain->addChildElement(switchNodeXml(nextProcessor)); - + if (nextProcessor->isMerger()) { insertionPt = 0; moveForward = false; - } else { + } + else + { insertionPt = 1; moveForward = true; } editor = nextProcessor->getEditor(); - } else { + } + else + { std::cout << " End of chain." << std::endl; @@ -1129,48 +1214,51 @@ const String EditorViewport::saveState() } std::cout << "Saving processor graph." << std::endl; - + //Resets Save Order for processors, allowing them to be saved again without omitting themselves from the order. int allProcessorSize=allProcessors.size(); - for (int i=0; i<allProcessorSize; i++) { + for (int i=0; i<allProcessorSize; i++) + { allProcessors.operator[](i)->saveOrder=-1; } - - if (! xml->writeToFile (currentFile, String::empty)) + + if (! xml->writeToFile(currentFile, String::empty)) error = "Couldn't write to file "; - else + else error = "Saved configuration as "; error += currentFile.getFileName(); - + delete xml; return error; } -const String EditorViewport::loadState() -{ +const String EditorViewport::loadState() +{ - FileChooser fc ("Choose a file to load...", - File::getCurrentWorkingDirectory(), - "*.xml", - true); + FileChooser fc("Choose a file to load...", + File::getCurrentWorkingDirectory(), + "*.xml", + true); if (fc.browseForFileToOpen()) { currentFile = fc.getResult(); - } else { + } + else + { return "No configuration selected."; } std::cout << "Loading processor graph." << std::endl; - Array<GenericProcessor*> splitPoints; - - XmlDocument doc (currentFile); + Array<GenericProcessor*> splitPoints; + + XmlDocument doc(currentFile); XmlElement* xml = doc.getDocumentElement(); - if (xml == 0 || ! xml->hasTagName ("PROCESSORGRAPH")) + if (xml == 0 || ! xml->hasTagName("PROCESSORGRAPH")) { std::cout << "File not found." << std::endl; delete xml; @@ -1182,7 +1270,7 @@ const String EditorViewport::loadState() String description;// = " "; int loadOrder = 0; - forEachXmlChildElement (*xml, signalChain) + forEachXmlChildElement(*xml, signalChain) { forEachXmlChildElement(*signalChain, processor) { @@ -1195,20 +1283,22 @@ const String EditorViewport::loadState() if (insertionPt == 1) { insertionPoint = editorArray.size(); - } else { + } + else + { insertionPoint = 0; } - //Point<int> pt = - SourceDetails sd = SourceDetails(processor->getStringAttribute("name"), - 0, - Point<int>(0,0)); + //Point<int> pt = + SourceDetails sd = SourceDetails(processor->getStringAttribute("name"), + 0, + Point<int>(0,0)); itemDropped(sd); GenericProcessor* p = (GenericProcessor*) lastEditor->getProcessor(); p->loadOrder = loadOrder; - + loadOrder++; if (p->isSplitter() || p->isMerger()) @@ -1216,7 +1306,8 @@ const String EditorViewport::loadState() splitPoints.add(p); } - } else if (processor->hasTagName("SWITCH")) + } + else if (processor->hasTagName("SWITCH")) { int processorNum = processor->getIntAttribute("number"); @@ -1225,8 +1316,8 @@ const String EditorViewport::loadState() for (int n = 0; n < splitPoints.size(); n++) { - std::cout << "Trying split point " << n - << ", load order: " << splitPoints[n]->loadOrder << std::endl; + std::cout << "Trying split point " << n + << ", load order: " << splitPoints[n]->loadOrder << std::endl; if (splitPoints[n]->loadOrder == processorNum) { @@ -1235,8 +1326,10 @@ const String EditorViewport::loadState() { std::cout << "Switching merger source." << std::endl; MergerEditor* editor = (MergerEditor*) splitPoints[n]->getEditor(); - editor->switchSource(1); - } else { + editor->switchSource(1); + } + else + { std::cout << "Switching splitter destination." << std::endl; SplitterEditor* editor = (SplitterEditor*) splitPoints[n]->getEditor(); editor->switchDest(1); diff --git a/Source/UI/EditorViewport.h b/Source/UI/EditorViewport.h index 43318a5249573f7608ae54646bbf99d6d5164375..b1e43dbf61ec2dcf7fdb0e0fd15ec88560bff757 100755 --- a/Source/UI/EditorViewport.h +++ b/Source/UI/EditorViewport.h @@ -24,9 +24,6 @@ #ifndef __EDITORVIEWPORT_H_80260F3F__ #define __EDITORVIEWPORT_H_80260F3F__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "../Processors/ProcessorGraph.h" #include "../Processors/Editors/GenericEditor.h" @@ -43,12 +40,12 @@ class EditorScrollButton; class SignalChainScrollButton; /** - + Allows the user to view and edit the signal chain. The EditorViewport is one of the most important classes in the GUI application. Dragging processors from the ProcessorList into the EditorViewport adds them to the signal chain. The - newly added processors appear an editors in the EditorViewport. Deleting the editor from the + newly added processors appear an editors in the EditorViewport. Deleting the editor from the EditorViewport removes its associated processor from the signal chain. Moving an editor (by dragging and dropping within the EditorViewport) rearranges the order of processing. @@ -61,9 +58,9 @@ class SignalChainScrollButton; */ class EditorViewport : public Component, - public DragAndDropTarget, - public AccessClass, - public Button::Listener + public DragAndDropTarget, + public AccessClass, + public Button::Listener { public: @@ -75,7 +72,7 @@ public: ~EditorViewport(); /** Draws the background of the EditorViewport. */ - void paint (Graphics& g); + void paint(Graphics& g); /** Removes the processor associated with a given editor. */ void deleteNode(GenericEditor* editor); @@ -92,54 +89,57 @@ public: /** Removes all processors from the signal chain(s).*/ void clearSignalChain(); - /** Used to enable and disable drag-and-drop signal chain editing. Called by the + /** Used to enable and disable drag-and-drop signal chain editing. Called by the ProcessorGraph when data acquisition begins and ends. */ void signalChainCanBeEdited(bool canEdit); - /** Determines whether or not the EditorViewport should respond to - the component that is currently being dragged. */ - bool isInterestedInDragSource (const SourceDetails& dragSourceDetails); - - /** Called when a dragged item (usually a name from the ProcessorList) enters the + /** Determines whether or not the EditorViewport should respond to + the component that is currently being dragged. */ + bool isInterestedInDragSource(const SourceDetails& dragSourceDetails); + + /** Called when a dragged item (usually a name from the ProcessorList) enters the boundaries of the EditorViewport. Causes the background of the EditorViewport to change color.*/ - void itemDragEnter (const SourceDetails& dragSourceDetails); - - /** Called when a dragged item (usually a name from the ProcessorList) moves within the + void itemDragEnter(const SourceDetails& dragSourceDetails); + + /** Called when a dragged item (usually a name from the ProcessorList) moves within the boundaries of the EditorViewport. Causes existing editors (if any) to shift their position to make room for the new processor that could be dropped.*/ - void itemDragMove (const SourceDetails& dragSourceDetails); - - /** Called when a dragged item (usually a name from the ProcessorList) leaves the + void itemDragMove(const SourceDetails& dragSourceDetails); + + /** Called when a dragged item (usually a name from the ProcessorList) leaves the boundaries of the EditorViewport. Causes the background of the EditorViewport to change color.*/ - void itemDragExit (const SourceDetails& dragSourceDetails); - - /** Called when a dragged item (usually a name from the ProcessorList) is released within the + void itemDragExit(const SourceDetails& dragSourceDetails); + + /** Called when a dragged item (usually a name from the ProcessorList) is released within the boundaries of the EditorViewport. Adds the dropped processor to the signal chain.*/ - void itemDropped (const SourceDetails& dragSourceDetails); + void itemDropped(const SourceDetails& dragSourceDetails); /** Called when a mouse click begins within the EditorViewport. Usually used to select editors.*/ - void mouseDown(const MouseEvent &e); + void mouseDown(const MouseEvent& e); /** Called when a mouse drag occurs within the EditorViewport. Usually used to move editors around in the signal chain.*/ - void mouseDrag(const MouseEvent &e); + void mouseDrag(const MouseEvent& e); /** Called when a mouse click ends within the EditorViewport. Usually used to indicate that a moving editor has been dropped.*/ - void mouseUp(const MouseEvent &e); + void mouseUp(const MouseEvent& e); /** Called when the mouse leaves the boundaries of the EditorViewport.*/ - void mouseExit(const MouseEvent &e); + void mouseExit(const MouseEvent& e); /** Called when a key is pressed an the EditorViewport has keyboard focus.*/ - bool keyPressed (const KeyPress &key); - + bool keyPressed(const KeyPress& key); + /** Changes which editor is selected, depending on the keypress (and modifier keys).*/ - void moveSelection( const KeyPress &key); - + void moveSelection(const KeyPress& key); + /** Called when one of the buttons the EditorViewport listens to has been clicked.*/ void buttonClicked(Button* button); /** Returns an array of pointers to SignalChainTabButtons (which themselves hold pointers to the sources of each signal chain). */ - Array<SignalChainTabButton*, CriticalSection> requestSignalChain() {return signalChainArray;} + Array<SignalChainTabButton*, CriticalSection> requestSignalChain() + { + return signalChainArray; + } /** Save the current configuration as an XML file. */ const String saveState(); @@ -163,7 +163,7 @@ public: int leftmostEditor; File currentFile; - + private: String message; @@ -203,16 +203,16 @@ private: void resized(); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EditorViewport); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EditorViewport); }; /** - + Allows the user to navigate between multiple parallel signal chains. Each SignalChainTabButton sits on the left-hand side of the EditorViewport - and is associated with a given signal chain. Clicking the tab button makes + and is associated with a given signal chain. Clicking the tab button makes the editors for its signal chain visible. @see EditorViewport @@ -226,22 +226,40 @@ public: ~SignalChainTabButton() {} /** Determines the first editor in the signal chain associated with a SignalChainTabButton.*/ - void setEditor(GenericEditor* p) {firstEditor = p;} - + void setEditor(GenericEditor* p) + { + firstEditor = p; + } + /** Sets the SignalChainManager for this SignalChainTabButton.*/ - void setManager(SignalChainManager* scm_) {scm = scm_;} + void setManager(SignalChainManager* scm_) + { + scm = scm_; + } /** Returns the editor associated with this SignalChainTabButton.*/ - GenericEditor* getEditor() {return firstEditor;} + GenericEditor* getEditor() + { + return firstEditor; + } /** Sets the number of this SignalChainTabButton.*/ - void setNumber(int n) {num = n;} + void setNumber(int n) + { + num = n; + } /** Returns the state of the configurationChanged variable.*/ - bool hasNewConnections() {return configurationChanged;} + bool hasNewConnections() + { + return configurationChanged; + } /** Sets the state of the configurationChanged variable.*/ - void hasNewConnections(bool t) {configurationChanged = t;} + void hasNewConnections(bool t) + { + configurationChanged = t; + } int offset; @@ -252,13 +270,13 @@ private: SignalChainManager* scm; /** Draws the SignalChainTabButton.*/ - void paintButton(Graphics &g, bool isMouseOver, bool isButtonDown); + void paintButton(Graphics& g, bool isMouseOver, bool isButtonDown); /** Called when a mouse click occurs inside a SignalChainTabButton.*/ void clicked(); - + enum actions {ADD, MOVE, REMOVE, ACTIVATE}; - + int num; bool configurationChanged; diff --git a/Source/UI/EditorViewportButtons.cpp b/Source/UI/EditorViewportButtons.cpp index cad5cb5f24df3b134f7ea0d4ada96c80f96ee908..41941caba1f6f58847bb508cdb8d2d5a9706a67f 100755 --- a/Source/UI/EditorViewportButtons.cpp +++ b/Source/UI/EditorViewportButtons.cpp @@ -24,120 +24,130 @@ #include "EditorViewportButtons.h" EditorScrollButton::EditorScrollButton(int d) - : DrawableButton ("ESB", DrawableButton::ImageFitted) + : DrawableButton("ESB", DrawableButton::ImageFitted) { - direction = d; + direction = d; - Path p; + Path p; - if (direction == RIGHT) { - p.addTriangle (0.0f, 0.0f, 0.0f, 20.0f, 18.0f, 10.0f); - } else { - p.addTriangle (0.0f, 10.0f, 18.0f, 20.0f, 18.0f, 0.0f); - } + if (direction == RIGHT) + { + p.addTriangle(0.0f, 0.0f, 0.0f, 20.0f, 18.0f, 10.0f); + } + else + { + p.addTriangle(0.0f, 10.0f, 18.0f, 20.0f, 18.0f, 0.0f); + } - inactive.setPath (p); - inactive.setFill (Colours::black); - inactive.setStrokeFill(Colours::grey); - inactive.setStrokeThickness (1.0f); + inactive.setPath(p); + inactive.setFill(Colours::black); + inactive.setStrokeFill(Colours::grey); + inactive.setStrokeThickness(1.0f); - activeNormal.setPath (p); - activeNormal.setFill (Colours::grey); - activeNormal.setStrokeFill(Colours::grey); - activeNormal.setStrokeThickness (1.0f); + activeNormal.setPath(p); + activeNormal.setFill(Colours::grey); + activeNormal.setStrokeFill(Colours::grey); + activeNormal.setStrokeThickness(1.0f); - activeOver.setPath (p); - activeOver.setFill (Colours::grey); - activeOver.setStrokeFill(Colours::grey); - activeOver.setStrokeThickness (3.0f); + activeOver.setPath(p); + activeOver.setFill(Colours::grey); + activeOver.setStrokeFill(Colours::grey); + activeOver.setStrokeThickness(3.0f); - activeDown.setPath (p); - activeDown.setFill (Colours::white); - activeDown.setStrokeFill(Colours::white); - activeDown.setStrokeThickness (3.0f); + activeDown.setPath(p); + activeDown.setFill(Colours::white); + activeDown.setStrokeFill(Colours::white); + activeDown.setStrokeThickness(3.0f); - setImages (&inactive, &inactive, &inactive); - // setBackgroundColours(Colours::black, Colours::black); - setClickingTogglesState (false); + setImages(&inactive, &inactive, &inactive); + // setBackgroundColours(Colours::black, Colours::black); + setClickingTogglesState(false); } EditorScrollButton::~EditorScrollButton() -{ +{ } void EditorScrollButton::setActive(bool state) { - isActive = state; + isActive = state; - if (state == true) - { - setImages (&activeNormal, &activeOver, &activeDown); - } else { - setImages (&inactive, &inactive, &inactive); - } + if (state == true) + { + setImages(&activeNormal, &activeOver, &activeDown); + } + else + { + setImages(&inactive, &inactive, &inactive); + } } SignalChainScrollButton::SignalChainScrollButton(int d) - : DrawableButton ("SCSB", DrawableButton::ImageFitted) + : DrawableButton("SCSB", DrawableButton::ImageFitted) { - direction = d; + direction = d; - DrawablePath normal; + DrawablePath normal; - Path p; + Path p; - if (direction == DOWN) { - p.addTriangle (0.0f, 0.0f, 9.0f, 20.0f, 18.0f, 0.0f); - } else { - p.addTriangle (0.0f, 20.0f, 9.0f, 0.0f, 18.0f, 20.0f); - } + if (direction == DOWN) + { + p.addTriangle(0.0f, 0.0f, 9.0f, 20.0f, 18.0f, 0.0f); + } + else + { + p.addTriangle(0.0f, 20.0f, 9.0f, 0.0f, 18.0f, 20.0f); + } - inactive.setPath (p); - inactive.setFill (Colours::black); - inactive.setStrokeFill(Colours::grey); - inactive.setStrokeThickness (1.0f); + inactive.setPath(p); + inactive.setFill(Colours::black); + inactive.setStrokeFill(Colours::grey); + inactive.setStrokeThickness(1.0f); - activeNormal.setPath (p); - activeNormal.setFill (Colours::grey); - activeNormal.setStrokeFill(Colours::grey); - activeNormal.setStrokeThickness (1.0f); + activeNormal.setPath(p); + activeNormal.setFill(Colours::grey); + activeNormal.setStrokeFill(Colours::grey); + activeNormal.setStrokeThickness(1.0f); - activeOver.setPath (p); - activeOver.setFill (Colours::grey); - activeOver.setStrokeFill(Colours::grey); - activeOver.setStrokeThickness (3.0f); + activeOver.setPath(p); + activeOver.setFill(Colours::grey); + activeOver.setStrokeFill(Colours::grey); + activeOver.setStrokeThickness(3.0f); - activeDown.setPath (p); - activeDown.setFill (Colours::white); - activeDown.setStrokeFill(Colours::white); - activeDown.setStrokeThickness (3.0f); + activeDown.setPath(p); + activeDown.setFill(Colours::white); + activeDown.setStrokeFill(Colours::white); + activeDown.setStrokeThickness(3.0f); - setImages (&inactive, &inactive, &inactive); - //setBackgroundColours(Colours::black, Colours::black); - setClickingTogglesState (false); + setImages(&inactive, &inactive, &inactive); + //setBackgroundColours(Colours::black, Colours::black); + setClickingTogglesState(false); } SignalChainScrollButton::~SignalChainScrollButton() -{ +{ } void SignalChainScrollButton::setActive(bool state) { - isActive = state; + isActive = state; - if (state == true) - { - setImages (&activeNormal, &activeOver, &activeDown); - } else { - setImages (&inactive, &inactive, &inactive); - } + if (state == true) + { + setImages(&activeNormal, &activeOver, &activeDown); + } + else + { + setImages(&inactive, &inactive, &inactive); + } } \ No newline at end of file diff --git a/Source/UI/EditorViewportButtons.h b/Source/UI/EditorViewportButtons.h index 6ba537fa2972f9c58d119bf6947474718ca3232f..a2c0a5fd45a4f195af3c08dfeaab0dda006eece5 100755 --- a/Source/UI/EditorViewportButtons.h +++ b/Source/UI/EditorViewportButtons.h @@ -24,13 +24,10 @@ #ifndef __EDITORVIEWPORTBUTTONS_H_2657C51D__ #define __EDITORVIEWPORTBUTTONS_H_2657C51D__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" /** - + Allows the user to scroll through visible editors when there are more than can fit within the boundaries of the EditorViewport. @@ -42,23 +39,23 @@ class EditorScrollButton : public DrawableButton { public: - EditorScrollButton(int type); - ~EditorScrollButton(); + EditorScrollButton(int type); + ~EditorScrollButton(); - void setActive(bool); + void setActive(bool); - bool isActive; + bool isActive; - enum type {LEFT, RIGHT}; + enum type {LEFT, RIGHT}; - int direction; + int direction; - DrawablePath inactive, activeNormal, activeOver, activeDown; + DrawablePath inactive, activeNormal, activeOver, activeDown; }; /** - + Allows the user to scroll through signal chains when there are more than can fit within the boundaries of the EditorViewport. @@ -70,18 +67,18 @@ public: class SignalChainScrollButton : public DrawableButton { public: - SignalChainScrollButton(int type); - ~SignalChainScrollButton(); + SignalChainScrollButton(int type); + ~SignalChainScrollButton(); - void setActive(bool); + void setActive(bool); - enum type {UP, DOWN}; + enum type {UP, DOWN}; - bool isActive; + bool isActive; - int direction; + int direction; - DrawablePath inactive, activeNormal, activeOver, activeDown; + DrawablePath inactive, activeNormal, activeOver, activeDown; }; diff --git a/Source/UI/InfoLabel.cpp b/Source/UI/InfoLabel.cpp index 49851bbf5dd5dca45b83fa3e57f96d00e55ef4e6..ca29355891cf4dd18a03c9fae0f6bb6afa3f462c 100755 --- a/Source/UI/InfoLabel.cpp +++ b/Source/UI/InfoLabel.cpp @@ -25,44 +25,46 @@ InfoLabel::InfoLabel() { - - MemoryInputStream mis(BinaryData::misoserialized, - BinaryData::misoserializedSize, - false); - Typeface::Ptr tp = new CustomTypeface(mis); - labelFont = Font(tp); - labelFont.setHeight(24); - - infoString = "Welcome to the Open Ephys GUI!\n \n" - "To get starting using the GUI, drag a processor from the list " - "on the left and drop it onto the signal chain. Each processor is " - "classified as either a source, a filter, or a sink. " - "Sources supply the data to each signal chain, filters process the " - "data, and sinks use the data to control outputs. Data always flows " - "from left to right.\n \n" - "Every signal chain must have one and only one source, and no more " - "than one sink. If a source is dropped in the middle of a signal chain, " - "it will start its own chain. Likewise, if a sink is dropped in the middle " - "of a chain, the processors to its right will form a new chain. " - "Multiple sources and sinks can be combined into a single chain through " - "the use of splitters and mergers. The current GUI allows you to construct " - "as many signal chains as you like, but be prudent.\n \n" - "Once the signal chain is in place, you can start and stop acquisition " - "by pressing the ""play"" button at the top of the screen. Acquisition will " - "only begin if all of the processors in the signal chain are enabled. Disabled " - "processors appear gray. Processors may be disabled if they aren't connected to a " - "source, or if they receive input from a processor to which they cannot connect." - " You'll have to fix these issues before you can acquire data.\n \n" - "You can also start acquisition by pressing the record button.\n \n" - "The GUI is still being actively developed, so it lacks " - "many crucial features and includes more than a few bugs. " - "There's a lot we're still planning on adding, and we will " - "be glad to have some help down the road. If you'd like to be " - "added as a contributor, please get in touch with us at " - "http://open-ephys.com/contact\n \n" - "DISCLAIMER: This software should be used for demonstration and testing purposes only. " - "It is not fit for conducting scientific experiments of any kind." - ; + + labelFont = Font("Paragraph", 24, Font::plain); + + // MemoryInputStream mis(BinaryData::misoserialized, + // BinaryData::misoserializedSize, + // false); + // Typeface::Ptr tp = new CustomTypeface(mis); + // labelFont = Font(tp); + // labelFont.setHeight(24); + + infoString = "Welcome to the Open Ephys GUI!\n \n" + "To get starting using the GUI, drag a processor from the list " + "on the left and drop it onto the signal chain. Each processor is " + "classified as either a source, a filter, or a sink. " + "Sources supply the data to each signal chain, filters process the " + "data, and sinks use the data to control outputs. Data always flows " + "from left to right.\n \n" + "Every signal chain must have one and only one source, and no more " + "than one sink. If a source is dropped in the middle of a signal chain, " + "it will start its own chain. Likewise, if a sink is dropped in the middle " + "of a chain, the processors to its right will form a new chain. " + "Multiple sources and sinks can be combined into a single chain through " + "the use of splitters and mergers. The current GUI allows you to construct " + "as many signal chains as you like, but be prudent.\n \n" + "Once the signal chain is in place, you can start and stop acquisition " + "by pressing the ""play"" button at the top of the screen. Acquisition will " + "only begin if all of the processors in the signal chain are enabled. Disabled " + "processors appear gray. Processors may be disabled if they aren't connected to a " + "source, or if they receive input from a processor to which they cannot connect." + " You'll have to fix these issues before you can acquire data.\n \n" + "You can also start acquisition by pressing the record button.\n \n" + "The GUI is still being actively developed, so it lacks " + "many crucial features and includes more than a few bugs. " + "There's a lot we're still planning on adding, and we will " + "be glad to have some help down the road. If you'd like to be " + "added as a contributor, please get in touch with us at " + "http://open-ephys.com/contact\n \n" + "DISCLAIMER: This software should be used for demonstration and testing purposes only. " + "It is not fit for conducting scientific experiments of any kind." + ; } @@ -74,12 +76,12 @@ InfoLabel::~InfoLabel() void InfoLabel::paint(Graphics& g) { - g.fillAll(Colours::grey); + g.fillAll(Colours::grey); - g.setFont(labelFont); + g.setFont(labelFont); - g.setColour(Colours::black); + g.setColour(Colours::black); - g.drawFittedText(infoString, 10, 10, getWidth()-10, getHeight()-10, Justification::left, 100); + g.drawFittedText(infoString, 10, 10, getWidth()-10, getHeight()-10, Justification::left, 100); } diff --git a/Source/UI/InfoLabel.h b/Source/UI/InfoLabel.h index f24ba1947917a50fe28b62293bd3e975e1e2e0a8..2a7ae6d448ed8834cf6593b7a7b3dfd331c99b1f 100755 --- a/Source/UI/InfoLabel.h +++ b/Source/UI/InfoLabel.h @@ -24,14 +24,11 @@ #ifndef __INFOLABEL_H_14DA9A62__ #define __INFOLABEL_H_14DA9A62__ -#ifdef WIN32 -#include <Windows.h> -#endif - + #include "../../JuceLibraryCode/JuceHeader.h" /** - + Displays general instructions about how to use the application. Inhabits a tab in the DataViewport. @@ -43,23 +40,23 @@ class InfoLabel : public Component { -public: - InfoLabel(); - ~InfoLabel(); +public: + InfoLabel(); + ~InfoLabel(); /** Draws the InfoLabel.*/ - void paint(Graphics& g); + void paint(Graphics& g); private: /** The text displayed to the user.*/ - String infoString; + String infoString; /** Font used to draw the label.*/ Font labelFont; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InfoLabel); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(InfoLabel); }; diff --git a/Source/UI/MessageCenter.cpp b/Source/UI/MessageCenter.cpp index 0618959b6ffd562961262f248c95ce39a0fe3d19..af8ea99c366585ca9a25ec2c86422148c930a507 100755 --- a/Source/UI/MessageCenter.cpp +++ b/Source/UI/MessageCenter.cpp @@ -25,48 +25,48 @@ //--------------------------------------------------------------------- -MessageCenter::MessageCenter() : - messageBackground(Colours::grey.withAlpha(0.5f)) +MessageCenter::MessageCenter() : + messageBackground(Colours::grey.withAlpha(0.5f)) { - - messageDisplayArea = new Label("Message Display Area","No new messages."); - addAndMakeVisible(messageDisplayArea); + messageDisplayArea = new Label("Message Display Area","No new messages."); + + addAndMakeVisible(messageDisplayArea); } -MessageCenter::~MessageCenter() +MessageCenter::~MessageCenter() { - + } void MessageCenter::paint(Graphics& g) { - - g.setColour (Colour(58,58,58)); - g.fillRect (0, 0, getWidth(), getHeight()); + g.setColour(Colour(58,58,58)); + + g.fillRect(0, 0, getWidth(), getHeight()); - g.setColour (messageBackground); - - g.fillRect (5, 5, getWidth()-10, getHeight()-10); + g.setColour(messageBackground); + + g.fillRect(5, 5, getWidth()-10, getHeight()-10); } -void MessageCenter::resized() +void MessageCenter::resized() { - if (messageDisplayArea != 0) - messageDisplayArea->setBounds(5,0,getWidth(),getHeight()); + if (messageDisplayArea != 0) + messageDisplayArea->setBounds(5,0,getWidth(),getHeight()); } void MessageCenter::actionListenerCallback(const String& message) { - - messageDisplayArea->setText(message,false); - messageBackground = Colours::orange; + messageDisplayArea->setText(message,false); + + messageBackground = Colours::orange; - repaint(); + repaint(); } \ No newline at end of file diff --git a/Source/UI/MessageCenter.h b/Source/UI/MessageCenter.h index 680030e8646f79b07e4f722e7f3aa9990477232f..e47d4d2d2cb5a16350ff22b068a01d4e01f2fb95 100755 --- a/Source/UI/MessageCenter.h +++ b/Source/UI/MessageCenter.h @@ -25,13 +25,10 @@ #define __MESSAGECENTER_H_2695FC38__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" /** - + Allows the application to display messages to the user. The MessageCenter is located along the bottom left of the application window. @@ -41,7 +38,7 @@ */ class MessageCenter : public Component, - public ActionListener + public ActionListener { public: @@ -49,21 +46,21 @@ public: ~MessageCenter(); /** Draws the message center.*/ - void paint (Graphics& g); + void paint(Graphics& g); private: - /** A JUCE label used to display message text. */ - ScopedPointer<Label> messageDisplayArea; + /** A JUCE label used to display message text. */ + ScopedPointer<Label> messageDisplayArea; - /** Called when the boundaries of the MessageCenter are changed. */ - void resized(); + /** Called when the boundaries of the MessageCenter are changed. */ + void resized(); - /** Called when a new message is received. */ - void actionListenerCallback(const String& message); + /** Called when a new message is received. */ + void actionListenerCallback(const String& message); - /** The background color (changes to yellow when a new message arrives). */ - Colour messageBackground; + /** The background color (changes to yellow when a new message arrives). */ + Colour messageBackground; }; diff --git a/Source/UI/ProcessorList.cpp b/Source/UI/ProcessorList.cpp index 5a8c1f3a3963374571ab53415698fa7defd7d09a..bb0051f87f52972b5b4cc1699bd790acad7f9b38 100755 --- a/Source/UI/ProcessorList.cpp +++ b/Source/UI/ProcessorList.cpp @@ -27,7 +27,8 @@ #include "UIComponent.h" -enum colorIds { +enum colorIds +{ PROCESSOR_COLOR = 801, FILTER_COLOR = 802, SINK_COLOR = 803, @@ -36,200 +37,204 @@ enum colorIds { }; ProcessorList::ProcessorList() - : isDragging(false), totalHeight(800), itemHeight(32), subItemHeight(22), - xBuffer(1), yBuffer(1) + : isDragging(false), totalHeight(800), itemHeight(32), subItemHeight(22), + xBuffer(1), yBuffer(1) { - + MemoryInputStream mis1(BinaryData::cpmonolightserialized, - BinaryData::cpmonolightserializedSize, - false); + BinaryData::cpmonolightserializedSize, + false); Typeface::Ptr tp1 = new CustomTypeface(mis1); - listFontLight = Font(tp1); + listFontLight = Font(tp1); listFontLight.setHeight(25); - + MemoryInputStream mis2(BinaryData::cpmonoplainserialized, - BinaryData::cpmonoplainserializedSize, - false); + BinaryData::cpmonoplainserializedSize, + false); Typeface::Ptr tp2 = new CustomTypeface(mis2); - listFontPlain = Font(tp2); + listFontPlain = Font(tp2); listFontPlain.setHeight(20); - setColour(PROCESSOR_COLOR, Colour(59, 59, 59)); - setColour(FILTER_COLOR, Colour(41, 76, 158));//Colour(255, 89, 0)); - setColour(SINK_COLOR, Colour(93, 125, 199));//Colour(255, 149, 0)); - setColour(SOURCE_COLOR, Colour(48, 67, 112)); //Colour(255, 0, 0)); - setColour(UTILITY_COLOR, Colour(90, 80, 80)); - - ProcessorListItem* sources = new ProcessorListItem("Sources"); - sources->addSubItem(new ProcessorListItem("Intan Demo Board")); - sources->addSubItem(new ProcessorListItem("Signal Generator")); - sources->addSubItem(new ProcessorListItem("Custom FPGA")); - sources->addSubItem(new ProcessorListItem("RHD2000 USB Board")); - sources->addSubItem(new ProcessorListItem("File Reader")); - sources->addSubItem(new ProcessorListItem("Event Generator")); - - ProcessorListItem* filters = new ProcessorListItem("Filters"); - filters->addSubItem(new ProcessorListItem("Bandpass Filter")); - filters->addSubItem(new ProcessorListItem("Event Detector")); - filters->addSubItem(new ProcessorListItem("Spike Detector")); - filters->addSubItem(new ProcessorListItem("Resampler")); - filters->addSubItem(new ProcessorListItem("Phase Detector")); - filters->addSubItem(new ProcessorListItem("Digital Reference")); - - ProcessorListItem* sinks = new ProcessorListItem("Sinks"); - sinks->addSubItem(new ProcessorListItem("LFP Viewer")); - sinks->addSubItem(new ProcessorListItem("Spike Viewer")); - sinks->addSubItem(new ProcessorListItem("WiFi Output")); - sinks->addSubItem(new ProcessorListItem("Arduino Output")); - sinks->addSubItem(new ProcessorListItem("FPGA Output")); - - ProcessorListItem* utilities = new ProcessorListItem("Utilities"); - utilities->addSubItem(new ProcessorListItem("Splitter")); - utilities->addSubItem(new ProcessorListItem("Merger")); - utilities->addSubItem(new ProcessorListItem("Record Controller")); - - baseItem = new ProcessorListItem("Processors"); - baseItem->addSubItem(sources); - baseItem->addSubItem(filters); - baseItem->addSubItem(sinks); - baseItem->addSubItem(utilities); - - // set parent names / colors - baseItem->setParentName("Processors"); - - for (int n = 0; n < baseItem->getNumSubItems(); n++) - { - - const String category = baseItem->getSubItem(n)->getName(); - baseItem->getSubItem(n)->setParentName(category); - - for (int m = 0; m < baseItem->getSubItem(n)->getNumSubItems(); m++) - { - - baseItem->getSubItem(n)->getSubItem(m)->setParentName(category);// = category; - - } - - } + setColour(PROCESSOR_COLOR, Colour(59, 59, 59)); + setColour(FILTER_COLOR, Colour(41, 76, 158));//Colour(255, 89, 0)); + setColour(SINK_COLOR, Colour(93, 125, 199));//Colour(255, 149, 0)); + setColour(SOURCE_COLOR, Colour(48, 67, 112)); //Colour(255, 0, 0)); + setColour(UTILITY_COLOR, Colour(90, 80, 80)); + + ProcessorListItem* sources = new ProcessorListItem("Sources"); + sources->addSubItem(new ProcessorListItem("Intan Demo Board")); + sources->addSubItem(new ProcessorListItem("Signal Generator")); + sources->addSubItem(new ProcessorListItem("Custom FPGA")); + sources->addSubItem(new ProcessorListItem("RHD2000 USB Board")); + sources->addSubItem(new ProcessorListItem("File Reader")); + sources->addSubItem(new ProcessorListItem("Event Generator")); + + ProcessorListItem* filters = new ProcessorListItem("Filters"); + filters->addSubItem(new ProcessorListItem("Bandpass Filter")); + filters->addSubItem(new ProcessorListItem("Event Detector")); + filters->addSubItem(new ProcessorListItem("Spike Detector")); + filters->addSubItem(new ProcessorListItem("Resampler")); + filters->addSubItem(new ProcessorListItem("Phase Detector")); + filters->addSubItem(new ProcessorListItem("Digital Reference")); + + ProcessorListItem* sinks = new ProcessorListItem("Sinks"); + sinks->addSubItem(new ProcessorListItem("LFP Viewer")); + sinks->addSubItem(new ProcessorListItem("Spike Viewer")); + sinks->addSubItem(new ProcessorListItem("WiFi Output")); + sinks->addSubItem(new ProcessorListItem("Arduino Output")); + sinks->addSubItem(new ProcessorListItem("FPGA Output")); + + ProcessorListItem* utilities = new ProcessorListItem("Utilities"); + utilities->addSubItem(new ProcessorListItem("Splitter")); + utilities->addSubItem(new ProcessorListItem("Merger")); + utilities->addSubItem(new ProcessorListItem("Record Controller")); + + baseItem = new ProcessorListItem("Processors"); + baseItem->addSubItem(sources); + baseItem->addSubItem(filters); + baseItem->addSubItem(sinks); + baseItem->addSubItem(utilities); + + // set parent names / colors + baseItem->setParentName("Processors"); + + for (int n = 0; n < baseItem->getNumSubItems(); n++) + { + + const String category = baseItem->getSubItem(n)->getName(); + baseItem->getSubItem(n)->setParentName(category); + + for (int m = 0; m < baseItem->getSubItem(n)->getNumSubItems(); m++) + { + + baseItem->getSubItem(n)->getSubItem(m)->setParentName(category);// = category; + + } + + } } ProcessorList::~ProcessorList() { - + } bool ProcessorList::isOpen() { - return baseItem->isOpen(); + return baseItem->isOpen(); } void ProcessorList::paintCanvas(Graphics& g) { - drawItems(g); + drawItems(g); - ///drawButton(g, true); + ///drawButton(g, true); } void ProcessorList::drawItems(Graphics& g) { - totalHeight = yBuffer; - - category = baseItem->getName(); - - drawItem(g, baseItem); - - if (baseItem->isOpen()) - { - for (int n = 0; n < baseItem->getNumSubItems(); n++) - { - setViewport(g, baseItem->hasSubItems()); - category = baseItem->getSubItem(n)->getName(); - drawItem(g, baseItem->getSubItem(n)); - - if (baseItem->getSubItem(n)->isOpen()) - { - for (int m = 0; m < baseItem->getSubItem(n)->getNumSubItems(); m++) - { - - setViewport(g, baseItem-> - getSubItem(n)-> - getSubItem(m)-> - hasSubItems()); - drawItem(g, baseItem->getSubItem(n)->getSubItem(m)); - - } - } - } - } + totalHeight = yBuffer; + + category = baseItem->getName(); + + drawItem(g, baseItem); + + if (baseItem->isOpen()) + { + for (int n = 0; n < baseItem->getNumSubItems(); n++) + { + setViewport(g, baseItem->hasSubItems()); + category = baseItem->getSubItem(n)->getName(); + drawItem(g, baseItem->getSubItem(n)); + + if (baseItem->getSubItem(n)->isOpen()) + { + for (int m = 0; m < baseItem->getSubItem(n)->getNumSubItems(); m++) + { + + setViewport(g, baseItem-> + getSubItem(n)-> + getSubItem(m)-> + hasSubItems()); + drawItem(g, baseItem->getSubItem(n)->getSubItem(m)); + + } + } + } + } } void ProcessorList::drawItem(Graphics& g, ProcessorListItem* item) { - Colour c = findColour(item->colorId); + Colour c = findColour(item->colorId); - g.setColour(c); + g.setColour(c); - if (item->hasSubItems()) - g.fillRect(1.0, 0.0, getWidth()-2, itemHeight); - else - g.fillRect(1.0, 10.0, getWidth()-2, subItemHeight); + if (item->hasSubItems()) + g.fillRect(1.0, 0.0, getWidth()-2, itemHeight); + else + g.fillRect(1.0, 10.0, getWidth()-2, subItemHeight); - drawItemName(g,item); + drawItemName(g,item); - if (item->hasSubItems()) - { - drawButton(g, item->isOpen()); - } + if (item->hasSubItems()) + { + drawButton(g, item->isOpen()); + } } void ProcessorList::drawItemName(Graphics& g, ProcessorListItem* item) { - String name; + String name; + + g.setColour(Colours::white); + g.setFont(listFontPlain); - g.setColour(Colours::white); - g.setFont(listFontPlain); + float offsetX, offsetY; - float offsetX, offsetY; + if (item->getNumSubItems() == 0) + { + if (item->isSelected()) + { + g.drawText(">", 5, 5, getWidth()-9, itemHeight, Justification::left, false); + // glRasterPos2f(9.0/getWidth(),0.72); + // getFont(cpmono_plain)->FaceSize(15); + // getFont(cpmono_plain)->Render(">"); + } - if (item->getNumSubItems() == 0) - { - if (item->isSelected()) - { - g.drawText(">", 5, 5, getWidth()-9, itemHeight, Justification::left, false); - // glRasterPos2f(9.0/getWidth(),0.72); - // getFont(cpmono_plain)->FaceSize(15); - // getFont(cpmono_plain)->Render(">"); - } + name = item->getName(); - name = item->getName(); + offsetX = 20.0f; - offsetX = 20.0f; + offsetY = 0.72f; + } + else + { + name = item->getName().toUpperCase(); + offsetX = 5.0f; + offsetY = 0.75f; + } - offsetY = 0.72f; - } - else { - name = item->getName().toUpperCase(); - offsetX = 5.0f; - offsetY = 0.75f; - } + if (item->getNumSubItems() == 0) + { + g.setFont(listFontPlain); + g.drawText(name, offsetX, 5, getWidth()-offsetX, itemHeight, Justification::left, false); - if (item->getNumSubItems() == 0) { - g.setFont(listFontPlain); - g.drawText(name, offsetX, 5, getWidth()-offsetX, itemHeight, Justification::left, false); + } + else + { + g.setFont(listFontLight); + g.drawText(name, offsetX, 0, getWidth()-offsetX, itemHeight, Justification::left, false); + } - } else { - g.setFont(listFontLight); - g.drawText(name, offsetX, 0, getWidth()-offsetX, itemHeight, Justification::left, false); - } - } void ProcessorList::drawButton(Graphics& g, bool isOpen) @@ -237,274 +242,290 @@ void ProcessorList::drawButton(Graphics& g, bool isOpen) - // glColor4f(1.0f,1.0f,1.0f,1.0f); - // glLineWidth(1.0f); - // glBegin(GL_LINE_LOOP); + // glColor4f(1.0f,1.0f,1.0f,1.0f); + // glLineWidth(1.0f); + // glBegin(GL_LINE_LOOP); - // if (isOpen) - // { - // glVertex2f(0.875,0.35); - // glVertex2f(0.9,0.65); - // } else { - // glVertex2f(0.925,0.65); - // glVertex2f(0.875,0.5); - // } - // glVertex2f(0.925,0.35); - // glEnd(); + // if (isOpen) + // { + // glVertex2f(0.875,0.35); + // glVertex2f(0.9,0.65); + // } else { + // glVertex2f(0.925,0.65); + // glVertex2f(0.875,0.5); + // } + // glVertex2f(0.925,0.35); + // glEnd(); } void ProcessorList::clearSelectionState() { - baseItem->setSelected(false); + baseItem->setSelected(false); - for (int n = 0; n < baseItem->getNumSubItems(); n++) - { - baseItem->getSubItem(n)->setSelected(false); + for (int n = 0; n < baseItem->getNumSubItems(); n++) + { + baseItem->getSubItem(n)->setSelected(false); - for (int m = 0; m < baseItem->getSubItem(n)->getNumSubItems(); m++) - { - baseItem->getSubItem(n)->getSubItem(m)->setSelected(false); - } - } + for (int m = 0; m < baseItem->getSubItem(n)->getNumSubItems(); m++) + { + baseItem->getSubItem(n)->getSubItem(m)->setSelected(false); + } + } } ProcessorListItem* ProcessorList::getListItemForYPos(int y) { - int bottom = (yBuffer + itemHeight) - getScrollAmount(); - - //std::cout << "Bottom: " << bottom << std::endl; - //std::cout << "Y coordinate: " << y << std::endl; - - if (y < bottom) - { - return baseItem; - - } else { - - if (baseItem->isOpen()) - { - for (int n = 0; n < baseItem->getNumSubItems(); n++) - { - bottom += (yBuffer + itemHeight); - - if (y < bottom) - { - return baseItem->getSubItem(n); - } - - if (baseItem->getSubItem(n)->isOpen()) - { - for (int m = 0; m < baseItem->getSubItem(n)->getNumSubItems(); m++) - { - bottom += (yBuffer + subItemHeight); - - if (y < bottom) - { - return baseItem->getSubItem(n)->getSubItem(m); - } - - } - } - } - } - - } - - return 0; + int bottom = (yBuffer + itemHeight) - getScrollAmount(); + + //std::cout << "Bottom: " << bottom << std::endl; + //std::cout << "Y coordinate: " << y << std::endl; + + if (y < bottom) + { + return baseItem; + + } + else + { + + if (baseItem->isOpen()) + { + for (int n = 0; n < baseItem->getNumSubItems(); n++) + { + bottom += (yBuffer + itemHeight); + + if (y < bottom) + { + return baseItem->getSubItem(n); + } + + if (baseItem->getSubItem(n)->isOpen()) + { + for (int m = 0; m < baseItem->getSubItem(n)->getNumSubItems(); m++) + { + bottom += (yBuffer + subItemHeight); + + if (y < bottom) + { + return baseItem->getSubItem(n)->getSubItem(m); + } + + } + } + } + } + + } + + return 0; } void ProcessorList::setViewport(Graphics& g, bool hasSubItems) { - int height; + int height; - if (hasSubItems) - { - height = itemHeight; - } else { - height = subItemHeight; - } + if (hasSubItems) + { + height = itemHeight; + } + else + { + height = subItemHeight; + } - g.setOrigin(0, yBuffer + height); //xBuffer, getHeight()-(totalHeight) - height + getScrollAmount()); + g.setOrigin(0, yBuffer + height); //xBuffer, getHeight()-(totalHeight) - height + getScrollAmount()); - totalHeight += yBuffer + height; + totalHeight += yBuffer + height; - //std::cout << totalHeight << std::endl; + //std::cout << totalHeight << std::endl; } int ProcessorList::getTotalHeight() { - return totalHeight; + return totalHeight; } void ProcessorList::toggleState() { - ProcessorListItem* fli = getListItemForYPos(0); - fli->reverseOpenState(); - getUIComponent()->childComponentChanged(); - repaint(); + ProcessorListItem* fli = getListItemForYPos(0); + fli->reverseOpenState(); + getUIComponent()->childComponentChanged(); + repaint(); } -void ProcessorList::mouseDownInCanvas(const MouseEvent& e) +void ProcessorList::mouseDownInCanvas(const MouseEvent& e) { - isDragging = false; - - Point<int> pos = e.getPosition(); - int xcoord = pos.getX(); - int ycoord = pos.getY(); - - //std::cout << xcoord << " " << ycoord << std::endl; - - ProcessorListItem* fli = getListItemForYPos(ycoord); - - if (fli != 0) - { - //std::cout << "Selecting: " << fli->getName() << std::endl; - if (!fli->hasSubItems()){ - clearSelectionState(); - fli->setSelected(true); - } - - } else { - //std::cout << "No selection." << std::endl; - } - - if (fli != 0) { - if (xcoord < getWidth() - getScrollBarWidth()) - { - if (e.mods.isRightButtonDown() || e.mods.isCtrlDown()) - { - - if (fli->getName().equalsIgnoreCase("Sources")) - { - currentColor = SOURCE_COLOR; - } else if (fli->getName().equalsIgnoreCase("Filters")) - { - currentColor = FILTER_COLOR; - } else if (fli->getName().equalsIgnoreCase("Utilities")) - { - currentColor = UTILITY_COLOR; - } else if (fli->getName().equalsIgnoreCase("Sinks")) - { - currentColor = SINK_COLOR; - } else { - return; - } - - int options=0; - options += (0 << 0); // showAlpha - options += (0 << 1); // showColorAtTop - options += (0 << 2); // showSliders - options += (1 << 3); // showColourSpace - - ColourSelector colourSelector(options); - colourSelector.setName ("background"); - colourSelector.setCurrentColour (findColour (currentColor)); - colourSelector.addChangeListener (this); - colourSelector.addChangeListener (getProcessorGraph()); - colourSelector.setColour (ColourSelector::backgroundColourId, Colours::transparentBlack); - colourSelector.setSize (300, 275); - - Rectangle<int> rect = Rectangle<int>(0,0,10,10); - - CallOutBox callOut (colourSelector, rect, nullptr); - callOut.setTopLeftPosition (e.getScreenX(), e.getScreenY()); - callOut.setArrowSize(0.0f); - - callOut.runModalLoop(); - - } else { - fli->reverseOpenState(); - } - } - - if (fli == baseItem) - { - if (fli->isOpen()) { - getUIComponent()->childComponentChanged(); - } - else - { - getUIComponent()->childComponentChanged(); - totalHeight = itemHeight + 2*yBuffer; - } - - } - } - - repaint(); + isDragging = false; + + Point<int> pos = e.getPosition(); + int xcoord = pos.getX(); + int ycoord = pos.getY(); + + //std::cout << xcoord << " " << ycoord << std::endl; + + ProcessorListItem* fli = getListItemForYPos(ycoord); + + if (fli != 0) + { + //std::cout << "Selecting: " << fli->getName() << std::endl; + if (!fli->hasSubItems()) + { + clearSelectionState(); + fli->setSelected(true); + } + + } + else + { + //std::cout << "No selection." << std::endl; + } + + if (fli != 0) + { + if (xcoord < getWidth() - getScrollBarWidth()) + { + if (e.mods.isRightButtonDown() || e.mods.isCtrlDown()) + { + + if (fli->getName().equalsIgnoreCase("Sources")) + { + currentColor = SOURCE_COLOR; + } + else if (fli->getName().equalsIgnoreCase("Filters")) + { + currentColor = FILTER_COLOR; + } + else if (fli->getName().equalsIgnoreCase("Utilities")) + { + currentColor = UTILITY_COLOR; + } + else if (fli->getName().equalsIgnoreCase("Sinks")) + { + currentColor = SINK_COLOR; + } + else + { + return; + } + + int options=0; + options += (0 << 0); // showAlpha + options += (0 << 1); // showColorAtTop + options += (0 << 2); // showSliders + options += (1 << 3); // showColourSpace + + ColourSelector colourSelector(options); + colourSelector.setName("background"); + colourSelector.setCurrentColour(findColour(currentColor)); + colourSelector.addChangeListener(this); + colourSelector.addChangeListener(getProcessorGraph()); + colourSelector.setColour(ColourSelector::backgroundColourId, Colours::transparentBlack); + colourSelector.setSize(300, 275); + + Rectangle<int> rect = Rectangle<int>(0,0,10,10); + + CallOutBox callOut(colourSelector, rect, nullptr); + callOut.setTopLeftPosition(e.getScreenX(), e.getScreenY()); + callOut.setArrowSize(0.0f); + + callOut.runModalLoop(); + + } + else + { + fli->reverseOpenState(); + } + } + + if (fli == baseItem) + { + if (fli->isOpen()) + { + getUIComponent()->childComponentChanged(); + } + else + { + getUIComponent()->childComponentChanged(); + totalHeight = itemHeight + 2*yBuffer; + } + + } + } + + repaint(); } void ProcessorList::changeListenerCallback(ChangeBroadcaster* source) { - ColourSelector* cs = dynamic_cast <ColourSelector*> (source); + ColourSelector* cs = dynamic_cast <ColourSelector*>(source); - setColour (currentColor, cs->getCurrentColour()); + setColour(currentColor, cs->getCurrentColour()); repaint(); } -void ProcessorList::mouseDragInCanvas(const MouseEvent& e) +void ProcessorList::mouseDragInCanvas(const MouseEvent& e) { - if (e.getMouseDownX() < getWidth()-getScrollBarWidth() && !(isDragging)) - { + if (e.getMouseDownX() < getWidth()-getScrollBarWidth() && !(isDragging)) + { - ProcessorListItem* fli = getListItemForYPos(e.getMouseDownY()); + ProcessorListItem* fli = getListItemForYPos(e.getMouseDownY()); - if (fli != 0) - { + if (fli != 0) + { - if (!fli->hasSubItems()) - { - isDragging = true; + if (!fli->hasSubItems()) + { + isDragging = true; - String b = fli->getParentName(); - b += "/"; - b += fli->getName(); + String b = fli->getParentName(); + b += "/"; + b += fli->getName(); - const String dragDescription = b; + const String dragDescription = b; - //std::cout << dragDescription << std::endl; + //std::cout << dragDescription << std::endl; - if (dragDescription.isNotEmpty()) - { - DragAndDropContainer* const dragContainer - = DragAndDropContainer::findParentDragContainerFor (this); + if (dragDescription.isNotEmpty()) + { + DragAndDropContainer* const dragContainer + = DragAndDropContainer::findParentDragContainerFor(this); - if (dragContainer != 0) - { - //pos.setSize (pos.getWidth(), 10); + if (dragContainer != 0) + { + //pos.setSize (pos.getWidth(), 10); - Image dragImage (Image::ARGB, 100, 15, true); + Image dragImage(Image::ARGB, 100, 15, true); - Graphics g(dragImage); - g.setColour (findColour(fli->colorId)); - g.fillAll(); - g.setColour(Colours::white); - g.setFont(14); - g.drawSingleLineText(fli->getName(),10,12);//,75,15,Justification::centredRight,true); + Graphics g(dragImage); + g.setColour(findColour(fli->colorId)); + g.fillAll(); + g.setColour(Colours::white); + g.setFont(14); + g.drawSingleLineText(fli->getName(),10,12);//,75,15,Justification::centredRight,true); - dragImage.multiplyAllAlphas(0.6f); + dragImage.multiplyAllAlphas(0.6f); - Point<int> imageOffset (20,10); - dragContainer->startDragging(dragDescription, this, - dragImage, true, &imageOffset); - } - } - } - } - } + Point<int> imageOffset(20,10); + dragContainer->startDragging(dragDescription, this, + dragImage, true, &imageOffset); + } + } + } + } + } } ProcessorListItem::ProcessorListItem(const String& name_) - : selected(false), open(true), name(name_) + : selected(false), open(true), name(name_) { } @@ -513,95 +534,102 @@ ProcessorListItem::~ProcessorListItem() bool ProcessorListItem::hasSubItems() { - if (subItems.size() > 0) - { - return true; - } else { - return false; - } + if (subItems.size() > 0) + { + return true; + } + else + { + return false; + } } int ProcessorListItem::getNumSubItems() { - return subItems.size(); + return subItems.size(); } -ProcessorListItem* ProcessorListItem::getSubItem (int index) +ProcessorListItem* ProcessorListItem::getSubItem(int index) { - return subItems[index]; + return subItems[index]; } void ProcessorListItem::clearSubItems() { - subItems.clear(); + subItems.clear(); } -void ProcessorListItem::addSubItem (ProcessorListItem* newItem) +void ProcessorListItem::addSubItem(ProcessorListItem* newItem) { - subItems.add(newItem); + subItems.add(newItem); } -void ProcessorListItem::removeSubItem (int index) +void ProcessorListItem::removeSubItem(int index) { - subItems.remove(index); + subItems.remove(index); } bool ProcessorListItem::isOpen() { - return open; + return open; } void ProcessorListItem::setOpen(bool t) { - open = t; + open = t; } const String& ProcessorListItem::getName() { - return name; + return name; } const String& ProcessorListItem::getParentName() { - return parentName; + return parentName; } void ProcessorListItem::setParentName(const String& name) { - parentName = name; - - if (parentName.equalsIgnoreCase("Processors")) - { - colorId = PROCESSOR_COLOR; - } else if (parentName.equalsIgnoreCase("Filters")) - { - colorId = FILTER_COLOR; - } else if (parentName.equalsIgnoreCase("Sinks")) - { - colorId = SINK_COLOR; - } else if (parentName.equalsIgnoreCase("Sources")) - { - colorId = SOURCE_COLOR; - } else { - colorId = UTILITY_COLOR; - } + parentName = name; + + if (parentName.equalsIgnoreCase("Processors")) + { + colorId = PROCESSOR_COLOR; + } + else if (parentName.equalsIgnoreCase("Filters")) + { + colorId = FILTER_COLOR; + } + else if (parentName.equalsIgnoreCase("Sinks")) + { + colorId = SINK_COLOR; + } + else if (parentName.equalsIgnoreCase("Sources")) + { + colorId = SOURCE_COLOR; + } + else + { + colorId = UTILITY_COLOR; + } } - // Blue slate: - // if (parentName.equalsIgnoreCase("Processors")) - // { - // color = Colour(59, 59, 59); - // } else if (parentName.equalsIgnoreCase("Filters")) - // { - // color = Colour(82, 101, 163); - // } else if (parentName.equalsIgnoreCase("Sinks")) - // { - // color = Colour(48, 61, 102); - // } else if (parentName.equalsIgnoreCase("Sources")) - // { - // color = Colour(151, 170, 230); - - // } else { - // color = Colour(20, 37, 92); - // } +// Blue slate: +// if (parentName.equalsIgnoreCase("Processors")) +// { +// color = Colour(59, 59, 59); +// } else if (parentName.equalsIgnoreCase("Filters")) +// { +// color = Colour(82, 101, 163); +// } else if (parentName.equalsIgnoreCase("Sinks")) +// { +// color = Colour(48, 61, 102); +// } else if (parentName.equalsIgnoreCase("Sources")) +// { +// color = Colour(151, 170, 230); + +// } else { +// color = Colour(20, 37, 92); +// } diff --git a/Source/UI/ProcessorList.h b/Source/UI/ProcessorList.h index 0d5670084482656b65771b7e42e306572aac6421..c19f47f36c183a26554ad135a83821f98732ee49 100755 --- a/Source/UI/ProcessorList.h +++ b/Source/UI/ProcessorList.h @@ -24,9 +24,6 @@ #ifndef __PROCESSORLIST_H_C3A661E9__ #define __PROCESSORLIST_H_C3A661E9__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "../Processors/Visualization/OpenGLCanvas.h" #include "../AccessClass.h" @@ -35,7 +32,7 @@ class ProcessorListItem; class UIComponent; /** - + Holds a list of processors that can be used to build the signal chain. @@ -52,84 +49,84 @@ class UIComponent; */ class ProcessorList : public OpenGLCanvas, - public DragAndDropContainer, - public AccessClass, - public ChangeListener + public DragAndDropContainer, + public AccessClass, + public ChangeListener { public: - ProcessorList(); - ~ProcessorList(); + ProcessorList(); + ~ProcessorList(); - /** Switches the open/closed state of the ProcessorList.*/ - void toggleState(); + /** Switches the open/closed state of the ProcessorList.*/ + void toggleState(); - /** Called when the user requests a colour change using a ColourSelector.*/ - void changeListenerCallback(ChangeBroadcaster* source); + /** Called when the user requests a colour change using a ColourSelector.*/ + void changeListenerCallback(ChangeBroadcaster* source); - /** Returns the open/closed state of the ProcessorList.*/ - bool isOpen(); + /** Returns the open/closed state of the ProcessorList.*/ + bool isOpen(); private: - /** Renders the canvas. */ - void paintCanvas(Graphics& g); + /** Renders the canvas. */ + void paintCanvas(Graphics& g); + + /** The main method for drawing the ProcessorList.*/ + void drawItems(Graphics& g); - /** The main method for drawing the ProcessorList.*/ - void drawItems(Graphics& g); + /** Draws a single item within the ProcessorList.*/ + void drawItem(Graphics& g, ProcessorListItem*); - /** Draws a single item within the ProcessorList.*/ - void drawItem(Graphics& g, ProcessorListItem*); + /** Draws the name of a single item within the ProcessorList.*/ + void drawItemName(Graphics& g, ProcessorListItem*); - /** Draws the name of a single item within the ProcessorList.*/ - void drawItemName(Graphics& g, ProcessorListItem*); + /** Draws the open/close button.*/ + void drawButton(Graphics& g, bool isOpen); - /** Draws the open/close button.*/ - void drawButton(Graphics& g, bool isOpen); + /** Returns the ProcessorListItem that sits at a given y coordinate.*/ + ProcessorListItem* getListItemForYPos(int y); - /** Returns the ProcessorListItem that sits at a given y coordinate.*/ - ProcessorListItem* getListItemForYPos(int y); + /** Sets the appropriate OpenGL viewport for drawing.*/ + void setViewport(Graphics& g, bool); - /** Sets the appropriate OpenGL viewport for drawing.*/ - void setViewport(Graphics& g, bool); + int currentColor; - int currentColor; + /** Returns the height requested by the ProcessorList. Determines whether or not + the OpenGLCanvas needs to draw scroll bars.*/ + int getTotalHeight(); - /** Returns the height requested by the ProcessorList. Determines whether or not - the OpenGLCanvas needs to draw scroll bars.*/ - int getTotalHeight(); + /** Deselects all items within the ProcessorList.*/ + void clearSelectionState(); - /** Deselects all items within the ProcessorList.*/ - void clearSelectionState(); + bool isDragging; + int totalHeight, itemHeight, subItemHeight; + int xBuffer, yBuffer; - bool isDragging; - int totalHeight, itemHeight, subItemHeight; - int xBuffer, yBuffer; + String category; - String category; - - /** Called when a mouse click begins within the boundaries of the ProcessorList.*/ - void mouseDownInCanvas(const MouseEvent& e); + /** Called when a mouse click begins within the boundaries of the ProcessorList.*/ + void mouseDownInCanvas(const MouseEvent& e); - /** Called when a mouse drag occurs within the boundaries of the ProcessorList.*/ - void mouseDragInCanvas(const MouseEvent& e); + /** Called when a mouse drag occurs within the boundaries of the ProcessorList.*/ + void mouseDragInCanvas(const MouseEvent& e); - /** The base item in the list.*/ - ScopedPointer<ProcessorListItem> baseItem; + /** The base item in the list.*/ + ScopedPointer<ProcessorListItem> baseItem; - Font listFontLight; - Font listFontPlain; + Font listFontLight; + Font listFontPlain; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProcessorList); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ProcessorList); }; /** - + An item within the ProcessorList. - If a ProcessorListItem has sub-items, it acts as a button that can + If a ProcessorListItem has sub-items, it acts as a button that can be used to show/hide segments of the ProcessorList. If it has no sub-items, then it holds the name of a processor which can be dragged onto the EditorViewport to construct the signal chain. @@ -141,64 +138,73 @@ private: class ProcessorListItem : public Component { public: - ProcessorListItem(const String& name); - ~ProcessorListItem(); + ProcessorListItem(const String& name); + ~ProcessorListItem(); - /** Returns the number of sub-items for a given ProcessorListItem. */ - int getNumSubItems(); + /** Returns the number of sub-items for a given ProcessorListItem. */ + int getNumSubItems(); - /** Returns the sub-item for a given index. */ - ProcessorListItem* getSubItem (int index); + /** Returns the sub-item for a given index. */ + ProcessorListItem* getSubItem(int index); - /** Clears all the sub-items owned by the ProcessorListItem. */ - void clearSubItems(); + /** Clears all the sub-items owned by the ProcessorListItem. */ + void clearSubItems(); - /** Adds a sub-item. */ - void addSubItem (ProcessorListItem* newItem); + /** Adds a sub-item. */ + void addSubItem(ProcessorListItem* newItem); - /** Removes a sub-item with a given index. */ - void removeSubItem (int index); + /** Removes a sub-item with a given index. */ + void removeSubItem(int index); - /** Returns true if a ProcessorListItem has sub-items, false otherwise. */ - bool hasSubItems(); + /** Returns true if a ProcessorListItem has sub-items, false otherwise. */ + bool hasSubItems(); - /** Removes true if a ProcessorListItem with sub-items is open, false otherwise. */ - bool isOpen(); + /** Removes true if a ProcessorListItem with sub-items is open, false otherwise. */ + bool isOpen(); - /** Sets the open/closed state of a ProcessorListItem with sub-items. */ - void setOpen(bool); + /** Sets the open/closed state of a ProcessorListItem with sub-items. */ + void setOpen(bool); - /** Toggles the open/closed state of a ProcessorListItem with sub-items. */ - void reverseOpenState() {open = !open;} + /** Toggles the open/closed state of a ProcessorListItem with sub-items. */ + void reverseOpenState() + { + open = !open; + } - /** Returns true if a ProcessorListItem has been selected by the user, false otherwise. */ - bool isSelected() {return selected;} + /** Returns true if a ProcessorListItem has been selected by the user, false otherwise. */ + bool isSelected() + { + return selected; + } - /** Sets selection state of a ProcessorListItem. */ - void setSelected(bool b) {selected = b;} + /** Sets selection state of a ProcessorListItem. */ + void setSelected(bool b) + { + selected = b; + } - /** Returns the name of a ProcessorListItem. */ - const String& getName(); + /** Returns the name of a ProcessorListItem. */ + const String& getName(); - /** Returns the name of the parent of a ProcessorListItem. */ - const String& getParentName(); + /** Returns the name of the parent of a ProcessorListItem. */ + const String& getParentName(); - /** Sets the name of the parent of a ProcessorListItem. */ - void setParentName(const String& name); + /** Sets the name of the parent of a ProcessorListItem. */ + void setParentName(const String& name); - /** Determines the color of the ProcessorListItem (based on enumerator defined in setParentName() method). */ - int colorId; + /** Determines the color of the ProcessorListItem (based on enumerator defined in setParentName() method). */ + int colorId; private: - bool selected; - bool open; - const String name; - String parentName; + bool selected; + bool open; + const String name; + String parentName; + + /** An array of all the sub-items (if any) that belong to this ProcessorListItem. */ + OwnedArray<ProcessorListItem> subItems; - /** An array of all the sub-items (if any) that belong to this ProcessorListItem. */ - OwnedArray<ProcessorListItem> subItems; - }; diff --git a/Source/UI/SignalChainManager.cpp b/Source/UI/SignalChainManager.cpp index 11689beeac7e773e7f7d6e059b89da8b26dcd09c..d9558c0648ab8078443ce4e7d7f9ea229e1df8e3 100755 --- a/Source/UI/SignalChainManager.cpp +++ b/Source/UI/SignalChainManager.cpp @@ -28,46 +28,46 @@ #include <iostream> SignalChainManager::SignalChainManager - (EditorViewport* ev_, - Array<GenericEditor*, CriticalSection>& editorArray_, - Array<SignalChainTabButton*, CriticalSection>& signalChainArray_) - : editorArray(editorArray_), signalChainArray(signalChainArray_), - ev(ev_), tabSize(30) +(EditorViewport* ev_, + Array<GenericEditor*, CriticalSection>& editorArray_, + Array<SignalChainTabButton*, CriticalSection>& signalChainArray_) + : editorArray(editorArray_), signalChainArray(signalChainArray_), + ev(ev_), tabSize(30) { - topTab = 0; + topTab = 0; } SignalChainManager::~SignalChainManager() { - + } void SignalChainManager::scrollUp() { - std::cout << "Scrolling up." << std::endl; + std::cout << "Scrolling up." << std::endl; - if (topTab > 0) - { - topTab -= 1; - } + if (topTab > 0) + { + topTab -= 1; + } - refreshTabs(); + refreshTabs(); } void SignalChainManager::scrollDown() { - std::cout << "Scrolling down." << std::endl; + std::cout << "Scrolling down." << std::endl; - if (topTab < signalChainArray.size()-4) - { - topTab += 1; - } + if (topTab < signalChainArray.size()-4) + { + topTab += 1; + } - refreshTabs(); + refreshTabs(); } @@ -104,9 +104,9 @@ void SignalChainManager::createNewTab(GenericEditor* editor) if (signalChainArray.size()-topTab > 4) { - scrollDown(); + scrollDown(); } - + refreshTabs(); } @@ -117,11 +117,12 @@ void SignalChainManager::removeTab(int tabIndex) SignalChainTabButton* t = signalChainArray.remove(tabIndex); deleteAndZero(t); - for (int n = 0; n < signalChainArray.size(); n++) + for (int n = 0; n < signalChainArray.size(); n++) { int tNum = signalChainArray[n]->getEditor()->tabNumber(); - - if (tNum > tabIndex) { + + if (tNum > tabIndex) + { signalChainArray[n]->getEditor()->tabNumber(tNum-1); signalChainArray[n]->setNumber(tNum-1); } @@ -130,7 +131,7 @@ void SignalChainManager::removeTab(int tabIndex) if (signalChainArray.size()-topTab < 4) { - scrollUp(); + scrollUp(); } refreshTabs(); @@ -139,43 +140,48 @@ void SignalChainManager::removeTab(int tabIndex) void SignalChainManager::refreshTabs() { - for (int n = 0; n < signalChainArray.size(); n++) - { - if (n >= topTab && n < topTab + 4) { - signalChainArray[n]->setVisible(true); - signalChainArray[n]->setBounds(6,(tabSize-2)*(n-topTab)+23,tabSize-10,tabSize-10); - } else { - signalChainArray[n]->setVisible(false); - } - } - - ev->checkScrollButtons(topTab); + for (int n = 0; n < signalChainArray.size(); n++) + { + if (n >= topTab && n < topTab + 4) + { + signalChainArray[n]->setVisible(true); + signalChainArray[n]->setBounds(6,(tabSize-2)*(n-topTab)+23,tabSize-10,tabSize-10); + } + else + { + signalChainArray[n]->setVisible(false); + } + } + + ev->checkScrollButtons(topTab); } void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, - int index, int insertionPoint, int action) + int index, int insertionPoint, int action) { - enum actions {ADD, MOVE, REMOVE, ACTIVATE, UPDATE}; + enum actions {ADD, MOVE, REMOVE, ACTIVATE, UPDATE}; // Step 1: update the editor array - if (action == ADD) + if (action == ADD) { std::cout << " Adding editor." << std::endl; editorArray.insert(insertionPoint, activeEditor); - } else if (action == MOVE) + } + else if (action == MOVE) { std::cout << " Moving editors." << std::endl; if (insertionPoint < index) - editorArray.move(index, insertionPoint); + editorArray.move(index, insertionPoint); else if (insertionPoint > index) - editorArray.move(index, insertionPoint-1); + editorArray.move(index, insertionPoint-1); - } else if (action == REMOVE) + } + else if (action == REMOVE) { std::cout << " Removing editor." << std::endl; @@ -185,35 +191,37 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, // need to inform the other source that its merger has disappeared if (p->isMerger()) { - p->switchIO(); - if (p->getSourceNode() != 0) - p->getSourceNode()->setDestNode(0); + p->switchIO(); + if (p->getSourceNode() != 0) + p->getSourceNode()->setDestNode(0); } editorArray.remove(index); int t = activeEditor->tabNumber(); - // std::cout << editorArray.size() << " " << t << std::endl; + // std::cout << editorArray.size() << " " << t << std::endl; - bool merger; + bool merger; - if (editorArray.size() > 0) - { - GenericProcessor* p = (GenericProcessor*) editorArray[0]->getProcessor(); - merger = (p->isMerger() && p->stillHasSource()); - if (merger) { - std::cout << "We've got a merger!" << std::endl; - //p->switchSource(); - } - } + if (editorArray.size() > 0) + { + GenericProcessor* p = (GenericProcessor*) editorArray[0]->getProcessor(); + merger = (p->isMerger() && p->stillHasSource()); + if (merger) + { + std::cout << "We've got a merger!" << std::endl; + //p->switchSource(); + } + } if (editorArray.size() > 0 && !merger) // if there are still editors in this chain { - if (t > -1) {// pass on tab - // std::cout << "passing on the tab." << std::endl; + if (t > -1) // pass on tab + { + // std::cout << "passing on the tab." << std::endl; int nextEditor = jmax(0,0);//index-1); - editorArray[nextEditor]->tabNumber(t); + editorArray[nextEditor]->tabNumber(t); signalChainArray[t]->setEditor(editorArray[nextEditor]); } @@ -221,39 +229,46 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, activeEditor = editorArray[nextEditor]; activeEditor->select(); //activeEditor->grabKeyboardFocus(); - - } else { - std::cout << "Tab number " << t << std::endl; + } + else + { + + std::cout << "Tab number " << t << std::endl; removeTab(t); if (signalChainArray.size() > 0) // if there are other chains { int nextTab = jmin(t,signalChainArray.size()-1); - activeEditor = signalChainArray[nextTab]->getEditor(); + activeEditor = signalChainArray[nextTab]->getEditor(); activeEditor->select(); - signalChainArray[nextTab]->setToggleState(true,false); // send it back to update connections - } else { + signalChainArray[nextTab]->setToggleState(true,false); // send it back to update connections + } + else + { activeEditor = 0; // nothing is active - // signalChainNeedsSource = true; + // signalChainNeedsSource = true; } } - } else { //no change - + } + else //no change + { + std::cout << "Activating editor" << std::endl; } // Step 2: update connections - if (action != ACTIVATE && action != UPDATE && editorArray.size() > 0) { + if (action != ACTIVATE && action != UPDATE && editorArray.size() > 0) + { - std::cout << "Updating connections." << std::endl; + std::cout << "Updating connections." << std::endl; GenericProcessor* source = 0; GenericProcessor* dest = (GenericProcessor*) editorArray[0]->getProcessor(); - dest->setSourceNode(source); + dest->setSourceNode(source); for (int n = 1; n < editorArray.size(); n++) { @@ -261,7 +276,7 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, dest = (GenericProcessor*) editorArray[n]->getProcessor(); source = (GenericProcessor*) editorArray[n-1]->getProcessor(); - dest->setSourceNode(source); + dest->setSourceNode(source); } dest->setDestNode(0); @@ -269,7 +284,8 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, } // Step 3: check for new tabs - if (action != ACTIVATE && action != UPDATE) { + if (action != ACTIVATE && action != UPDATE) + { std::cout << "Checking for new tabs." << std::endl; @@ -279,19 +295,21 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, if (p->getSourceNode() == 0)// && editorArray[n]->tabNumber() == -1) { - - if (editorArray[n]->tabNumber() == -1) + + if (editorArray[n]->tabNumber() == -1) { - if (!p->isMerger()) - { - std::cout << p->getName() << " has no source node. Creating a new tab." << std::endl; - createNewTab(editorArray[n]); - } + if (!p->isMerger()) + { + std::cout << p->getName() << " has no source node. Creating a new tab." << std::endl; + createNewTab(editorArray[n]); + } } - } else { - if (editorArray[n]->tabNumber() > -1) + } + else + { + if (editorArray[n]->tabNumber() > -1) { removeTab(editorArray[n]->tabNumber()); } @@ -301,8 +319,8 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, if (p->isMerger()) { - std::cout << "It's a merger!" << std::endl; - //createNewTab(editorArray[n]); + std::cout << "It's a merger!" << std::endl; + //createNewTab(editorArray[n]); } } } @@ -318,7 +336,7 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, GenericEditor* editorToAdd = activeEditor; - while (editorToAdd != 0) + while (editorToAdd != 0) { std::cout << "Inserting " << editorToAdd->getName() << " at point 0." << std::endl; @@ -342,13 +360,15 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, editorToAdd = (GenericEditor*) source->getEditor(); - } else { - + } + else + { + if (editorToAdd->tabNumber() >= 0) - signalChainArray[editorToAdd->tabNumber()]->setToggleState(true, false); + signalChainArray[editorToAdd->tabNumber()]->setToggleState(true, false); std::cout << "No source found." << std::endl; editorToAdd = 0; - + } } @@ -369,16 +389,18 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, std::cout << "Inserting " << editorToAdd->getName() << " at the end." << std::endl; if (dest->isMerger()) - { - std::cout << "It's a merger!" << std::endl; + { + std::cout << "It's a merger!" << std::endl; + + if (dest->getSourceNode() != currentProcessor) + editorToAdd->switchSource(); - if (dest->getSourceNode() != currentProcessor) - editorToAdd->switchSource(); - - } + } - } else { - std::cout << "No dest found." << std::endl; + } + else + { + std::cout << "No dest found." << std::endl; editorToAdd = 0; } @@ -386,19 +408,23 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, } // Step 5: check the validity of the signal chain - if (true) - {//action != ACTIVATE) { + if (true) + { + //action != ACTIVATE) { bool enable = true; - if (editorArray.size() == 1) { - - GenericProcessor* source = (GenericProcessor*) editorArray[0]->getProcessor(); - if (source->isSource()) + if (editorArray.size() == 1) + { + + GenericProcessor* source = (GenericProcessor*) editorArray[0]->getProcessor(); + if (source->isSource()) editorArray[0]->setEnabledState(true); - else + else editorArray[0]->setEnabledState(false); - } else { + } + else + { for (int n = 0; n < editorArray.size()-1; n++) { @@ -409,10 +435,10 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, enable = false; editorArray[n]->setEnabledState(enable); - + if (source->canSendSignalTo(dest) && source->enabledState()) enable = true; - else + else enable = false; if (source->isSplitter()) @@ -428,7 +454,7 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, std::cout << "Enabling node." << std::endl; else std::cout << "Not enabling node." << std::endl; - + editorArray[n+1]->setEnabledState(enable); } @@ -445,15 +471,17 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, } // Step 7: update all settings - if (action != ACTIVATE) { + if (action != ACTIVATE) + { std::cout << "Updating settings." << std::endl; Array<GenericProcessor*> splitters; for (int n = 0; n < signalChainArray.size(); n++) - { // iterate through signal chains - + { + // iterate through signal chains + GenericEditor* source = signalChainArray[n]->getEditor(); GenericProcessor* p = source->getProcessor(); @@ -467,7 +495,8 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, GenericProcessor* dest = p->getDestNode(); while (dest != 0) - { // iterate through processors + { + // iterate through processors dest->update(); dest = dest->getDestNode(); @@ -482,6 +511,6 @@ void SignalChainManager::updateVisibleEditors(GenericEditor* activeEditor, } - std::cout << "Finished adding new editor." << std::endl << std::endl << std::endl; - + std::cout << "Finished adding new editor." << std::endl << std::endl << std::endl; + } diff --git a/Source/UI/SignalChainManager.h b/Source/UI/SignalChainManager.h index 7ac6979f1e3c8bf6cecb10433bf1915cb1d53ea0..672a6b69399b830ab92102415d875fda19f49b5b 100755 --- a/Source/UI/SignalChainManager.h +++ b/Source/UI/SignalChainManager.h @@ -24,9 +24,6 @@ #ifndef __SIGNALCHAINMANAGER_H_948769B9__ #define __SIGNALCHAINMANAGER_H_948769B9__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "../Processors/Editors/GenericEditor.h" #include "../AccessClass.h" @@ -36,7 +33,7 @@ class SignalChainTabButton; class EditorViewport; /** - + Provides helper functions for editing the signal chain. Created and owned by the EditorViewport. @@ -48,50 +45,50 @@ class EditorViewport; class SignalChainManager : AccessClass { public: - SignalChainManager(EditorViewport*, Array<GenericEditor*, CriticalSection>&, - Array<SignalChainTabButton*, CriticalSection>&); - ~SignalChainManager(); + SignalChainManager(EditorViewport*, Array<GenericEditor*, CriticalSection>&, + Array<SignalChainTabButton*, CriticalSection>&); + ~SignalChainManager(); /** Updates the editors currently displayed by the EditorViewport.*/ - void updateVisibleEditors(GenericEditor* activeEditor, int index, int insertionPoint, int action); + void updateVisibleEditors(GenericEditor* activeEditor, int index, int insertionPoint, int action); /** Creates a tab button for a new signal chain. */ - void createNewTab(GenericEditor* editor); + void createNewTab(GenericEditor* editor); /** Removes the tab button for a deleted signal chain. */ - void removeTab(int tabIndex); + void removeTab(int tabIndex); /** Scrolls the SignalChainTabButtons up, if there are more signal chains than can be viewed at once.*/ - void scrollUp(); + void scrollUp(); /** Scrolls the SignalChainTabButtons down, if there are more signal chains than can be viewed at once.*/ - void scrollDown(); + void scrollDown(); /** Clears the signal chain.*/ void clearSignalChain(); -private: +private: /** An array of all currently visible editors.*/ - Array<GenericEditor*, CriticalSection>& editorArray; + Array<GenericEditor*, CriticalSection>& editorArray; /** An array of all existing signal chains (as referenced by their associated SignalChainTabButtons).*/ - Array<SignalChainTabButton*, CriticalSection>& signalChainArray; + Array<SignalChainTabButton*, CriticalSection>& signalChainArray; /** A pointer to the EditorViewport.*/ - EditorViewport* ev; + EditorViewport* ev; /** Updates the visibility of SignalChainTabButtons.*/ - void refreshTabs(); + void refreshTabs(); /** The index of the top tab (used for scrolling purposes).*/ - int topTab; + int topTab; + + const int tabSize; - const int tabSize; - }; diff --git a/Source/UI/UIComponent.cpp b/Source/UI/UIComponent.cpp index e1a7b0390024c74e7c912c9ac284fd9d91608ad6..fb7c2a17f81c1ca471f42ded0dd93b10cdc95ec8 100755 --- a/Source/UI/UIComponent.cpp +++ b/Source/UI/UIComponent.cpp @@ -24,65 +24,65 @@ #include "UIComponent.h" #include <stdio.h> -UIComponent::UIComponent (MainWindow* mainWindow_, ProcessorGraph* pgraph, AudioComponent* audio_) - : mainWindow(mainWindow_), processorGraph(pgraph), audio(audio_) +UIComponent::UIComponent(MainWindow* mainWindow_, ProcessorGraph* pgraph, AudioComponent* audio_) + : mainWindow(mainWindow_), processorGraph(pgraph), audio(audio_) -{ +{ + + processorGraph->setUIComponent(this); - processorGraph->setUIComponent(this); + infoLabel = new InfoLabel(); - infoLabel = new InfoLabel(); + dataViewport = new DataViewport(); + addChildComponent(dataViewport); + dataViewport->addTabToDataViewport("Info", infoLabel,0); - dataViewport = new DataViewport (); - addChildComponent(dataViewport); - dataViewport->addTabToDataViewport("Info", infoLabel,0); + std::cout << "Created data viewport." << std::endl; - std::cout << "Created data viewport." << std::endl; + editorViewport = new EditorViewport(); - editorViewport = new EditorViewport(); + addAndMakeVisible(editorViewport); - addAndMakeVisible(editorViewport); + std::cout << "Created filter viewport." << std::endl; - std::cout << "Created filter viewport." << std::endl; + editorViewportButton = new EditorViewportButton(this); + addAndMakeVisible(editorViewportButton); - editorViewportButton = new EditorViewportButton(this); - addAndMakeVisible(editorViewportButton); + controlPanel = new ControlPanel(processorGraph, audio); + addAndMakeVisible(controlPanel); - controlPanel = new ControlPanel(processorGraph, audio); - addAndMakeVisible(controlPanel); + std::cout << "Created control panel." << std::endl; - std::cout << "Created control panel." << std::endl; + processorList = new ProcessorList(); + addAndMakeVisible(processorList); - processorList = new ProcessorList(); - addAndMakeVisible(processorList); + std::cout << "Created filter list." << std::endl; - std::cout << "Created filter list." << std::endl; + messageCenter = new MessageCenter(); + addActionListener(messageCenter); + addAndMakeVisible(messageCenter); - messageCenter = new MessageCenter(); - addActionListener(messageCenter); - addAndMakeVisible(messageCenter); + std::cout << "Created message center." << std::endl; - std::cout << "Created message center." << std::endl; + setBounds(0,0,500,400); - setBounds(0,0,500,400); + std::cout << "Component width = " << getWidth() << std::endl; + std::cout << "Component height = " << getHeight() << std::endl; - std::cout << "Component width = " << getWidth() << std::endl; - std::cout << "Component height = " << getHeight() << std::endl; + std::cout << "UI component data viewport: " << dataViewport << std::endl; - std::cout << "UI component data viewport: " << dataViewport << std::endl; + std::cout << "Finished UI stuff." << std::endl << std::endl << std::endl; - std::cout << "Finished UI stuff." << std::endl << std::endl << std::endl; + processorGraph->setUIComponent(this); + processorList->setUIComponent(this); + editorViewport->setUIComponent(this); + dataViewport->setUIComponent(this); + controlPanel->getAudioEditor()->setUIComponent(this); + controlPanel->setUIComponent(this); - processorGraph->setUIComponent(this); - processorList->setUIComponent(this); - editorViewport->setUIComponent(this); - dataViewport->setUIComponent(this); - controlPanel->getAudioEditor()->setUIComponent(this); - controlPanel->setUIComponent(this); - //processorGraph->sendActionMessage("Test."); - //processorGraph->loadState(); + //processorGraph->loadState(); #if JUCE_MAC MenuBarModel::setMacMainMenu(this); @@ -90,110 +90,110 @@ UIComponent::UIComponent (MainWindow* mainWindow_, ProcessorGraph* pgraph, Audio #else mainWindow->setMenuBar(this); #endif - + } UIComponent::~UIComponent() { - dataViewport->destroyTab(0); // get rid of tab for InfoLabel + dataViewport->destroyTab(0); // get rid of tab for InfoLabel } void UIComponent::resized() { - - int w = getWidth(); - int h = getHeight(); - - if (dataViewport != 0) - { - int left, top, width, height; - left = 6; - top = 40; - - if (processorList->isOpen()) - left = 202; - else - left = 6; - - if (controlPanel->isOpen()) - top = 72; - else - top = 40; - - if (editorViewportButton->isOpen()) - height = h - top - 195; - else - height = h - top - 45; - - width = w - left - 5; - - dataViewport->setBounds(left, top, width, height); - } - - if (editorViewportButton != 0) - { - editorViewportButton->setBounds(w-230, h-40, 225, 35); - } - - if (editorViewport != 0) - { - if (editorViewportButton->isOpen() && !editorViewport->isVisible()) - editorViewport->setVisible(true); - else if (!editorViewportButton->isOpen() && editorViewport->isVisible()) - editorViewport->setVisible(false); - - editorViewport->setBounds(6,h-190,w-11,150); - } - - if (controlPanel != 0) - { - if (controlPanel->isOpen()) - controlPanel->setBounds(201,6,w-210,64); - else - controlPanel->setBounds(201,6,w-210,32); - } - - if (processorList != 0) - { - if (processorList->isOpen()) - if (editorViewportButton->isOpen()) - processorList->setBounds(5,5,195,h-200); - else - processorList->setBounds(5,5,195,h-50); - else - processorList->setBounds(5,5,195,34); - } - - if (messageCenter != 0) - messageCenter->setBounds(6,h-35,w-241,30); - - // for debugging qpurposes: - if (false) - { - dataViewport->setVisible(false); - editorViewport->setVisible(false); - processorList->setVisible(false); - messageCenter->setVisible(false); - controlPanel->setVisible(false); - editorViewportButton->setVisible(false); - } + + int w = getWidth(); + int h = getHeight(); + + if (dataViewport != 0) + { + int left, top, width, height; + left = 6; + top = 40; + + if (processorList->isOpen()) + left = 202; + else + left = 6; + + if (controlPanel->isOpen()) + top = 72; + else + top = 40; + + if (editorViewportButton->isOpen()) + height = h - top - 195; + else + height = h - top - 45; + + width = w - left - 5; + + dataViewport->setBounds(left, top, width, height); + } + + if (editorViewportButton != 0) + { + editorViewportButton->setBounds(w-230, h-40, 225, 35); + } + + if (editorViewport != 0) + { + if (editorViewportButton->isOpen() && !editorViewport->isVisible()) + editorViewport->setVisible(true); + else if (!editorViewportButton->isOpen() && editorViewport->isVisible()) + editorViewport->setVisible(false); + + editorViewport->setBounds(6,h-190,w-11,150); + } + + if (controlPanel != 0) + { + if (controlPanel->isOpen()) + controlPanel->setBounds(201,6,w-210,64); + else + controlPanel->setBounds(201,6,w-210,32); + } + + if (processorList != 0) + { + if (processorList->isOpen()) + if (editorViewportButton->isOpen()) + processorList->setBounds(5,5,195,h-200); + else + processorList->setBounds(5,5,195,h-50); + else + processorList->setBounds(5,5,195,34); + } + + if (messageCenter != 0) + messageCenter->setBounds(6,h-35,w-241,30); + + // for debugging qpurposes: + if (false) + { + dataViewport->setVisible(false); + editorViewport->setVisible(false); + processorList->setVisible(false); + messageCenter->setVisible(false); + controlPanel->setVisible(false); + editorViewportButton->setVisible(false); + } } void UIComponent::disableCallbacks() { - //sendActionMessage("Data acquisition terminated."); - controlPanel->disableCallbacks(); + //sendActionMessage("Data acquisition terminated."); + controlPanel->disableCallbacks(); } void UIComponent::disableDataViewport() { - dataViewport->disableConnectionToEditorViewport(); + dataViewport->disableConnectionToEditorViewport(); } void UIComponent::childComponentChanged() { - resized(); + resized(); } @@ -203,212 +203,218 @@ void UIComponent::childComponentChanged() // MENU BAR METHODS -StringArray UIComponent::getMenuBarNames() { +StringArray UIComponent::getMenuBarNames() +{ - // StringArray names; - // names.add("File"); - // names.add("Edit"); - // names.add("Help"); + // StringArray names; + // names.add("File"); + // names.add("Edit"); + // names.add("Help"); - const char* const names[] = { "File", "Edit", "View", "Help", 0 }; + const char* const names[] = { "File", "Edit", "View", "Help", 0 }; - return StringArray (names); + return StringArray(names); } PopupMenu UIComponent::getMenuForIndex(int menuIndex, const String& menuName) { - ApplicationCommandManager* commandManager = &(mainWindow->commandManager); + ApplicationCommandManager* commandManager = &(mainWindow->commandManager); - PopupMenu menu; + PopupMenu menu; + + if (menuIndex == 0) + { + menu.addCommandItem(commandManager, openConfiguration); + menu.addCommandItem(commandManager, saveConfiguration); - if (menuIndex == 0) - { - menu.addCommandItem (commandManager, openConfiguration); - menu.addCommandItem (commandManager, saveConfiguration); - #if !JUCE_MAC - menu.addSeparator(); - menu.addCommandItem (commandManager, StandardApplicationCommandIDs::quit); + menu.addSeparator(); + menu.addCommandItem(commandManager, StandardApplicationCommandIDs::quit); #endif - } else if (menuIndex == 1) - { - menu.addCommandItem (commandManager, undo); - menu.addCommandItem (commandManager, redo); - menu.addSeparator(); - menu.addCommandItem (commandManager, copySignalChain); - menu.addCommandItem (commandManager, pasteSignalChain); - menu.addSeparator(); - menu.addCommandItem (commandManager, clearSignalChain); - - } else if (menuIndex == 2) { - - menu.addCommandItem (commandManager, toggleProcessorList); - menu.addCommandItem (commandManager, toggleSignalChain); - menu.addCommandItem (commandManager, toggleFileInfo); - - } else if (menuIndex == 3) - { - menu.addCommandItem (commandManager, showHelp); - } - - return menu; + } + else if (menuIndex == 1) + { + menu.addCommandItem(commandManager, undo); + menu.addCommandItem(commandManager, redo); + menu.addSeparator(); + menu.addCommandItem(commandManager, copySignalChain); + menu.addCommandItem(commandManager, pasteSignalChain); + menu.addSeparator(); + menu.addCommandItem(commandManager, clearSignalChain); + + } + else if (menuIndex == 2) + { + + menu.addCommandItem(commandManager, toggleProcessorList); + menu.addCommandItem(commandManager, toggleSignalChain); + menu.addCommandItem(commandManager, toggleFileInfo); + + } + else if (menuIndex == 3) + { + menu.addCommandItem(commandManager, showHelp); + } + + return menu; } void UIComponent::menuItemSelected(int menuItemID, int topLevelMenuIndex) { - - // + + // } // ApplicationCommandTarget methods ApplicationCommandTarget* UIComponent::getNextCommandTarget() { - // this will return the next parent component that is an ApplicationCommandTarget (in this + // this will return the next parent component that is an ApplicationCommandTarget (in this // case, there probably isn't one, but it's best to use this method anyway). - return findFirstTargetParentComponent(); + return findFirstTargetParentComponent(); } -void UIComponent::getAllCommands (Array <CommandID>& commands) +void UIComponent::getAllCommands(Array <CommandID>& commands) { - const CommandID ids[] = {openConfiguration, - saveConfiguration, - undo, - redo, - copySignalChain, - pasteSignalChain, - clearSignalChain, - toggleProcessorList, - toggleSignalChain, - toggleFileInfo, - showHelp}; - - commands.addArray (ids, numElementsInArray (ids)); + const CommandID ids[] = {openConfiguration, + saveConfiguration, + undo, + redo, + copySignalChain, + pasteSignalChain, + clearSignalChain, + toggleProcessorList, + toggleSignalChain, + toggleFileInfo, + showHelp + }; + + commands.addArray(ids, numElementsInArray(ids)); } -void UIComponent::getCommandInfo (CommandID commandID, ApplicationCommandInfo& result) +void UIComponent::getCommandInfo(CommandID commandID, ApplicationCommandInfo& result) { - bool acquisitionStarted = getAudioComponent()->callbacksAreActive(); - - switch (commandID) - { - case openConfiguration: - result.setInfo("Open configuration", "Load a saved processor graph.", "General", 0); - result.addDefaultKeypress ('O', ModifierKeys::commandModifier); - result.setActive(!acquisitionStarted); - break; - - case saveConfiguration: - result.setInfo("Save configuration", "Save the current processor graph.", "General", 0); - result.addDefaultKeypress ('S', ModifierKeys::commandModifier); - result.setActive(!acquisitionStarted); - break; - - case undo: - result.setInfo("Undo", "Undo the last action.", "General", 0); - result.addDefaultKeypress ('Z', ModifierKeys::commandModifier); - result.setActive(false); - break; - - case redo: - result.setInfo("Redo", "Undo the last action.", "General", 0); - result.addDefaultKeypress ('Y', ModifierKeys::commandModifier); - result.setActive(false); - break; - - case copySignalChain: - result.setInfo("Copy", "Copy a portion of the signal chain.", "General", 0); - result.addDefaultKeypress ('C', ModifierKeys::commandModifier); - result.setActive(false); - break; - - case pasteSignalChain: - result.setInfo("Paste", "Paste a portion of the signal chain.", "General", 0); - result.addDefaultKeypress ('V', ModifierKeys::commandModifier); - result.setActive(false); - break; - - case clearSignalChain: - result.setInfo("Clear signal chain", "Clear the current signal chain.", "General", 0); - result.addDefaultKeypress (KeyPress::backspaceKey, ModifierKeys::commandModifier); - result.setActive(!getEditorViewport()->isSignalChainEmpty() && !acquisitionStarted); - break; - - case toggleProcessorList: - result.setInfo("Processor List", "Show/hide Processor List.", "General", 0); - result.addDefaultKeypress ('P', ModifierKeys::shiftModifier); - result.setTicked(processorList->isOpen()); - break; - - case toggleSignalChain: - result.setInfo("Signal Chain", "Show/hide Signal Chain.", "General", 0); - result.addDefaultKeypress ('S', ModifierKeys::shiftModifier); - result.setTicked(editorViewportButton->isOpen()); - break; - - case toggleFileInfo: - result.setInfo("File Info", "Show/hide File Info.", "General", 0); - result.addDefaultKeypress ('F', ModifierKeys::shiftModifier); - result.setTicked(controlPanel->isOpen()); - break; - - case showHelp: - result.setInfo("Show help...", "Show some freakin' help.", "General", 0); - result.setActive(false); - break; - - default: - break; - }; + bool acquisitionStarted = getAudioComponent()->callbacksAreActive(); + + switch (commandID) + { + case openConfiguration: + result.setInfo("Open configuration", "Load a saved processor graph.", "General", 0); + result.addDefaultKeypress('O', ModifierKeys::commandModifier); + result.setActive(!acquisitionStarted); + break; + + case saveConfiguration: + result.setInfo("Save configuration", "Save the current processor graph.", "General", 0); + result.addDefaultKeypress('S', ModifierKeys::commandModifier); + result.setActive(!acquisitionStarted); + break; + + case undo: + result.setInfo("Undo", "Undo the last action.", "General", 0); + result.addDefaultKeypress('Z', ModifierKeys::commandModifier); + result.setActive(false); + break; + + case redo: + result.setInfo("Redo", "Undo the last action.", "General", 0); + result.addDefaultKeypress('Y', ModifierKeys::commandModifier); + result.setActive(false); + break; + + case copySignalChain: + result.setInfo("Copy", "Copy a portion of the signal chain.", "General", 0); + result.addDefaultKeypress('C', ModifierKeys::commandModifier); + result.setActive(false); + break; + + case pasteSignalChain: + result.setInfo("Paste", "Paste a portion of the signal chain.", "General", 0); + result.addDefaultKeypress('V', ModifierKeys::commandModifier); + result.setActive(false); + break; + + case clearSignalChain: + result.setInfo("Clear signal chain", "Clear the current signal chain.", "General", 0); + result.addDefaultKeypress(KeyPress::backspaceKey, ModifierKeys::commandModifier); + result.setActive(!getEditorViewport()->isSignalChainEmpty() && !acquisitionStarted); + break; + + case toggleProcessorList: + result.setInfo("Processor List", "Show/hide Processor List.", "General", 0); + result.addDefaultKeypress('P', ModifierKeys::shiftModifier); + result.setTicked(processorList->isOpen()); + break; + + case toggleSignalChain: + result.setInfo("Signal Chain", "Show/hide Signal Chain.", "General", 0); + result.addDefaultKeypress('S', ModifierKeys::shiftModifier); + result.setTicked(editorViewportButton->isOpen()); + break; + + case toggleFileInfo: + result.setInfo("File Info", "Show/hide File Info.", "General", 0); + result.addDefaultKeypress('F', ModifierKeys::shiftModifier); + result.setTicked(controlPanel->isOpen()); + break; + + case showHelp: + result.setInfo("Show help...", "Show some freakin' help.", "General", 0); + result.setActive(false); + break; + + default: + break; + }; } -bool UIComponent::perform (const InvocationInfo& info) +bool UIComponent::perform(const InvocationInfo& info) { - switch (info.commandID) - { - case openConfiguration: - { - sendActionMessage(getEditorViewport()->loadState()); - break; - } - case saveConfiguration: - { - sendActionMessage(getEditorViewport()->saveState()); - break; - } - case clearSignalChain: - getEditorViewport()->clearSignalChain(); - break; - - case showHelp: - std::cout << "SHOW ME SOME HELP!" << std::endl; - break; - - case toggleProcessorList: - processorList->toggleState(); - break; - - case toggleFileInfo: - controlPanel->toggleState(); - break; - - case toggleSignalChain: - editorViewportButton->toggleState(); - break; - - default: - break; - - } - - return true; + switch (info.commandID) + { + case openConfiguration: + { + sendActionMessage(getEditorViewport()->loadState()); + break; + } + case saveConfiguration: + { + sendActionMessage(getEditorViewport()->saveState()); + break; + } + case clearSignalChain: + getEditorViewport()->clearSignalChain(); + break; + + case showHelp: + std::cout << "SHOW ME SOME HELP!" << std::endl; + break; + + case toggleProcessorList: + processorList->toggleState(); + break; + + case toggleFileInfo: + controlPanel->toggleState(); + break; + + case toggleSignalChain: + editorViewportButton->toggleState(); + break; + + default: + break; + + } + + return true; } @@ -416,68 +422,70 @@ bool UIComponent::perform (const InvocationInfo& info) EditorViewportButton::EditorViewportButton(UIComponent* ui) : UI(ui) { - open = true; - + open = true; + MemoryInputStream mis1(BinaryData::cpmonolightserialized, BinaryData::cpmonolightserializedSize, false); Typeface::Ptr tp1 = new CustomTypeface(mis1); - buttonFont = Font(tp1); + buttonFont = Font(tp1); buttonFont.setHeight(25); } EditorViewportButton::~EditorViewportButton() { - + } void EditorViewportButton::paint(Graphics& g) { - g.fillAll(Colour(58,58,58)); + g.fillAll(Colour(58,58,58)); - g.setColour(Colours::white); - g.setFont(buttonFont); - g.drawText("SIGNAL CHAIN", 10, 0, getWidth(), getHeight(), Justification::left, false); + g.setColour(Colours::white); + g.setFont(buttonFont); + g.drawText("SIGNAL CHAIN", 10, 0, getWidth(), getHeight(), Justification::left, false); - g.setColour(Colours::white); + g.setColour(Colours::white); - Path p; + Path p; - float h = getHeight(); - float w = getWidth()-5; + float h = getHeight(); + float w = getWidth()-5; - if (open) - { - p.addTriangle(w-h+0.2f*h, 0.8f*h, - w-h+0.5f*h, 0.2f*h, - w-h+0.8f*h, 0.8f*h); - } else { - p.addTriangle(w-h+0.2f*h, 0.5f*h, - w-h+0.8f*h, 0.2f*h, - w-h+0.8f*h, 0.8f*h); - } + if (open) + { + p.addTriangle(w-h+0.2f*h, 0.8f*h, + w-h+0.5f*h, 0.2f*h, + w-h+0.8f*h, 0.8f*h); + } + else + { + p.addTriangle(w-h+0.2f*h, 0.5f*h, + w-h+0.8f*h, 0.2f*h, + w-h+0.8f*h, 0.8f*h); + } - PathStrokeType pst = PathStrokeType(1.0f, PathStrokeType::curved, PathStrokeType::rounded); + PathStrokeType pst = PathStrokeType(1.0f, PathStrokeType::curved, PathStrokeType::rounded); - g.strokePath(p, pst); + g.strokePath(p, pst); } void EditorViewportButton::mouseDown(const MouseEvent& e) { - open = !open; - UI->childComponentChanged(); - repaint(); + open = !open; + UI->childComponentChanged(); + repaint(); } void EditorViewportButton::toggleState() { - open = !open; - UI->childComponentChanged(); - repaint(); + open = !open; + UI->childComponentChanged(); + repaint(); } diff --git a/Source/UI/UIComponent.h b/Source/UI/UIComponent.h index 3b6137448aa7e95cccb91b7714adceb088ae0c61..37ab7aa31ab3440b118553dae744c1117e72bc47 100755 --- a/Source/UI/UIComponent.h +++ b/Source/UI/UIComponent.h @@ -24,9 +24,6 @@ #ifndef __UICOMPONENT_H_D97C73CF__ #define __UICOMPONENT_H_D97C73CF__ -#ifdef WIN32 -#include <Windows.h> -#endif #include "../../JuceLibraryCode/JuceHeader.h" #include "InfoLabel.h" #include "ControlPanel.h" @@ -39,7 +36,7 @@ #include "../MainWindow.h" #include "../Processors/Visualization/OpenGLCanvas.h" -#include "../OpenGL.h" +//#include "../OpenGL.h" class MainWindow; class ProcessorList; @@ -47,7 +44,7 @@ class ProcessorList; class EditorViewportButton; /** - + Creates objects for user interaction. The UIComponent is responsible for the layout of the user interface and @@ -59,124 +56,148 @@ class EditorViewportButton; */ class UIComponent : public Component, - public ActionBroadcaster, - public MenuBarModel, - public ApplicationCommandTarget, - public DragAndDropContainer // required for - // drag-and-drop - // internal components - - -{ -public: - UIComponent(MainWindow* mainWindow_, ProcessorGraph* pgraph, AudioComponent* audio); - ~UIComponent(); - - /** Returns a pointer to the EditorViewport. */ - EditorViewport* getEditorViewport() {return editorViewport;} - - /** Returns a pointer to the ProcessorList. */ - ProcessorList* getProcessorList() {return processorList;} - - /** Returns a pointer to the DataViewport. */ - DataViewport* getDataViewport() {return dataViewport;} - - /** Returns a pointer to the ProcessorGraph. */ - ProcessorGraph* getProcessorGraph() {return processorGraph;} - - /** Returns a pointer to the ControlPanel. */ - ControlPanel* getControlPanel() {return controlPanel;} - - /** Returns a pointer to the MessageCenter. */ - MessageCenter* getMessageCenter() {return messageCenter;} - - /** Returns a pointer to the UIComponent. */ - UIComponent* getUIComponent() {return this;} - - /** Returns a pointer to the AudioComponent. */ - AudioComponent* getAudioComponent() {return audio;} - - /** Stops the callbacks to the ProcessorGraph which drive data acquisition. */ - void disableCallbacks(); + public ActionBroadcaster, + public MenuBarModel, + public ApplicationCommandTarget, + public DragAndDropContainer // required for + // drag-and-drop + // internal components - /** Disables the connection between the DataViewport and the EditorViewport. */ - void disableDataViewport(); - /** - Called whenever a major change takes place within a child component, in order - to make sure the UIComponent's other children get resized appropriately. */ - void childComponentChanged(); - - /** Returns the names of all the requested menubar drop-down lists (e.g., "File", "Edit", "Help", etc.). */ - StringArray getMenuBarNames(); - - /** Adds the commands contained within a given drop-down menu from the menubar. */ - PopupMenu getMenuForIndex(int topLevelMenuIndex, const String& menuName); - - /** Called when a particular menu item is selected. Doesn't do anything yet. */ - void menuItemSelected(int menuItemID, int topLevelMenuIndex); - - /** Doesn't do anything yet. */ - ApplicationCommandTarget* getNextCommandTarget(); - - /** Returns a list of commands the application can perform. */ - void getAllCommands (Array <CommandID>& commands); - - /** Returns the info, default keypress, and activation state of all the application's commands. */ - void getCommandInfo (CommandID commandID, ApplicationCommandInfo& result); - - /** Determines what takes place when a given command is executed by the user. */ - bool perform (const InvocationInfo& info); +{ +public: + UIComponent(MainWindow* mainWindow_, ProcessorGraph* pgraph, AudioComponent* audio); + ~UIComponent(); + + /** Returns a pointer to the EditorViewport. */ + EditorViewport* getEditorViewport() + { + return editorViewport; + } + + /** Returns a pointer to the ProcessorList. */ + ProcessorList* getProcessorList() + { + return processorList; + } + + /** Returns a pointer to the DataViewport. */ + DataViewport* getDataViewport() + { + return dataViewport; + } + + /** Returns a pointer to the ProcessorGraph. */ + ProcessorGraph* getProcessorGraph() + { + return processorGraph; + } + + /** Returns a pointer to the ControlPanel. */ + ControlPanel* getControlPanel() + { + return controlPanel; + } + + /** Returns a pointer to the MessageCenter. */ + MessageCenter* getMessageCenter() + { + return messageCenter; + } + + /** Returns a pointer to the UIComponent. */ + UIComponent* getUIComponent() + { + return this; + } + + /** Returns a pointer to the AudioComponent. */ + AudioComponent* getAudioComponent() + { + return audio; + } + + /** Stops the callbacks to the ProcessorGraph which drive data acquisition. */ + void disableCallbacks(); + + /** Disables the connection between the DataViewport and the EditorViewport. */ + void disableDataViewport(); + + /** + Called whenever a major change takes place within a child component, in order + to make sure the UIComponent's other children get resized appropriately. */ + void childComponentChanged(); + + /** Returns the names of all the requested menubar drop-down lists (e.g., "File", "Edit", "Help", etc.). */ + StringArray getMenuBarNames(); + + /** Adds the commands contained within a given drop-down menu from the menubar. */ + PopupMenu getMenuForIndex(int topLevelMenuIndex, const String& menuName); + + /** Called when a particular menu item is selected. Doesn't do anything yet. */ + void menuItemSelected(int menuItemID, int topLevelMenuIndex); + + /** Doesn't do anything yet. */ + ApplicationCommandTarget* getNextCommandTarget(); + + /** Returns a list of commands the application can perform. */ + void getAllCommands(Array <CommandID>& commands); + + /** Returns the info, default keypress, and activation state of all the application's commands. */ + void getCommandInfo(CommandID commandID, ApplicationCommandInfo& result); + + /** Determines what takes place when a given command is executed by the user. */ + bool perform(const InvocationInfo& info); private: - ScopedPointer<DataViewport> dataViewport; - ScopedPointer<EditorViewport> editorViewport; - ScopedPointer<EditorViewportButton> editorViewportButton; - ScopedPointer<ProcessorList> processorList; - ScopedPointer<ControlPanel> controlPanel; - ScopedPointer<MessageCenter> messageCenter; - ScopedPointer<InfoLabel> infoLabel; - - /** Pointer to the GUI's MainWindow, which owns the UIComponent. */ - MainWindow* mainWindow; - - /** Allows the application to use tooltips, which are messages - that appear when the mouse hovers over particular components. */ - TooltipWindow tooltipWindow; - - /** Pointer to the GUI's ProcessorGraph. Owned by the MainWindow. */ - ProcessorGraph* processorGraph; - - /** Pointer to the GUI's AudioComponent. Owned by the MainWindow. */ - AudioComponent* audio; - - /** Resizes all of components inside the UIComponent to fit the new boundaries - of the MainWindow, or to account for opening/closing events.*/ - void resized(); - - /** Contains codes for common user commands to which the application must react.*/ - enum CommandIDs - { - openConfiguration = 0x2001, - saveConfiguration = 0x2002, - undo = 0x2003, - redo = 0x2004, - copySignalChain = 0x2005, - pasteSignalChain = 0x2006, - clearSignalChain = 0x2007, - toggleProcessorList = 0x2008, - toggleSignalChain = 0x2009, - toggleFileInfo = 0x2010, - showHelp = 0x2011 - }; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIComponent); - + ScopedPointer<DataViewport> dataViewport; + ScopedPointer<EditorViewport> editorViewport; + ScopedPointer<EditorViewportButton> editorViewportButton; + ScopedPointer<ProcessorList> processorList; + ScopedPointer<ControlPanel> controlPanel; + ScopedPointer<MessageCenter> messageCenter; + ScopedPointer<InfoLabel> infoLabel; + + /** Pointer to the GUI's MainWindow, which owns the UIComponent. */ + MainWindow* mainWindow; + + /** Allows the application to use tooltips, which are messages + that appear when the mouse hovers over particular components. */ + TooltipWindow tooltipWindow; + + /** Pointer to the GUI's ProcessorGraph. Owned by the MainWindow. */ + ProcessorGraph* processorGraph; + + /** Pointer to the GUI's AudioComponent. Owned by the MainWindow. */ + AudioComponent* audio; + + /** Resizes all of components inside the UIComponent to fit the new boundaries + of the MainWindow, or to account for opening/closing events.*/ + void resized(); + + /** Contains codes for common user commands to which the application must react.*/ + enum CommandIDs + { + openConfiguration = 0x2001, + saveConfiguration = 0x2002, + undo = 0x2003, + redo = 0x2004, + copySignalChain = 0x2005, + pasteSignalChain = 0x2006, + clearSignalChain = 0x2007, + toggleProcessorList = 0x2008, + toggleSignalChain = 0x2009, + toggleFileInfo = 0x2010, + showHelp = 0x2011 + }; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UIComponent); + }; /** - + A button used to show/hide the EditorViewport. @see UIComponent, EditorViewport @@ -186,28 +207,31 @@ private: class EditorViewportButton : public Component { public: - EditorViewportButton(UIComponent* ui); - ~EditorViewportButton(); + EditorViewportButton(UIComponent* ui); + ~EditorViewportButton(); - /** Returns the open/closed state of the button. */ - bool isOpen() {return open;} + /** Returns the open/closed state of the button. */ + bool isOpen() + { + return open; + } - /** Draws the button. */ - void paint(Graphics& g); + /** Draws the button. */ + void paint(Graphics& g); - /** Switches the open/closed state of the button. */ - void toggleState(); + /** Switches the open/closed state of the button. */ + void toggleState(); - /** Called when a mouse click begins inside the boundaries of the button. Used - to toggle the button's open/closed state. */ - void mouseDown(const MouseEvent& e); + /** Called when a mouse click begins inside the boundaries of the button. Used + to toggle the button's open/closed state. */ + void mouseDown(const MouseEvent& e); -private: +private: - UIComponent* UI; - bool open; + UIComponent* UI; + bool open; - Font buttonFont; + Font buttonFont; }; diff --git a/astyle.options b/astyle.options new file mode 100644 index 0000000000000000000000000000000000000000..41954889ed6b099c809eb723cbec296991b35c9f --- /dev/null +++ b/astyle.options @@ -0,0 +1,72 @@ +# Custom options file for astyle (astyle.sourceforge.net), a source code +# formatter for C/C++ (and some other languages). +# +# Since it's clunky to use this program on windows and mac (it's a commandline +# program, but there's no installer), the real point is just to be able to +# enforce some general sanity on the codebase every once in a while. That +# said, the general prescription below will actually work on all available +# platforms, with the caveat that on windows and mac you might have to figure +# in the actual path to the astyle binary. +# +# usage: +# cd Source +# astyle --options="../astyle.options" "./*" +# + +# Special note to Josh: move Docs out of Source, or add --exclude="Docs"? + +# The above commands will format the entire source tree using a style which +# mostly conforms to that of the Juce library +# (www.juce.com/wiki/index.php/Coding_Standards). +# +# The biggest difference is with parentheses after functions: Juce uses "foo +# (bar)" except when there's no arguments (e.g. "foo()"), whereas here we +# enforce "foo(bar)" and "foo()." +# +# Some documentation of the options is provided here for convenience. For full +# options documentation, go to astyle.sourceforge.net/astyle.html. + + +# No backup file suffix, i.e. don't back up the files, since this would just +# make a mess of the source tree. If astyle screws up, we'll rely on git. +suffix=none + +recursive + +# This is the _bracket_ style (not affecting indentation, for example.) +style=allman + +# Just to be clear (even though it's the default): indentation uses 4 spaces. +indent=spaces=4 + +indent-switches +indent-cases + +# Indent multiline #defines. +indent-preprocessor + +# Comments starting in the first column of text are not special. +indent-col1-comments + +# Conditionals inside if, while, for, etc., are not indented if they have to +# break a line. +min-conditional-indent=0 + +# Don't limit the size of an in-statement indent. +# Example: +# reallyLongFunctionName(foo, +# --don't limit this---->bar); +max-instatement-indent=80 + +# Remove spaces in and around parentheses (except in front of "headers;" see the +# next rule for that exception). +# Note, this differs from the Juce style! +# Example: foo ( bar, baz ); -> foo(bar, baz);) +unpad-paren + +# insert a space after if, while, for, etc. +--pad-header + +# Pointer/reference operators go next to the type (on the left). +align-pointer=type + diff --git a/open-ephys.jucer b/open-ephys.jucer index 34e5fd3c30c70006bdf78a83beed7031a251d939..0acde5af3c8dd5d6c24ef48d1c0d58337a3efbb6 100644 --- a/open-ephys.jucer +++ b/open-ephys.jucer @@ -281,25 +281,6 @@ <FILE id="DXYynnz" name="Splitter.h" compile="0" resource="0" file="Source/Processors/Utilities/Splitter.h"/> </GROUP> <GROUP id="W4eqkOy" name="Visualization"> - <GROUP id="g8GOfh" name="SpikePlotting"> - <FILE id="AD91jR" name="SpikePlot.cpp" compile="1" resource="0" file="Source/Processors/Visualization/SpikePlotting/SpikePlot.cpp"/> - <FILE id="iO3abH" name="SpikePlot.h" compile="0" resource="0" file="Source/Processors/Visualization/SpikePlotting/SpikePlot.h"/> - <FILE id="Qq75l" name="BaseUIElement.cpp" compile="1" resource="0" - file="Source/Processors/Visualization/SpikePlotting/BaseUIElement.cpp"/> - <FILE id="PZdkKU" name="BaseUIElement.h" compile="0" resource="0" file="Source/Processors/Visualization/SpikePlotting/BaseUIElement.h"/> - <FILE id="lFRVqc" name="GenericAxes.cpp" compile="1" resource="0" file="Source/Processors/Visualization/SpikePlotting/GenericAxes.cpp"/> - <FILE id="BP8BOa" name="GenericAxes.h" compile="0" resource="0" file="Source/Processors/Visualization/SpikePlotting/GenericAxes.h"/> - <FILE id="f7vOFh" name="PlotUtils.cpp" compile="1" resource="0" file="Source/Processors/Visualization/SpikePlotting/PlotUtils.cpp"/> - <FILE id="TQfHuh" name="PlotUtils.h" compile="0" resource="0" file="Source/Processors/Visualization/SpikePlotting/PlotUtils.h"/> - <FILE id="d3ducO" name="ProjectionAxes.cpp" compile="1" resource="0" - file="Source/Processors/Visualization/SpikePlotting/ProjectionAxes.cpp"/> - <FILE id="BdHvyv" name="ProjectionAxes.h" compile="0" resource="0" - file="Source/Processors/Visualization/SpikePlotting/ProjectionAxes.h"/> - <FILE id="RnnkTt" name="SimpleKeyEvent.h" compile="0" resource="0" - file="Source/Processors/Visualization/SpikePlotting/SimpleKeyEvent.h"/> - <FILE id="yg1Xuq" name="WaveAxes.cpp" compile="1" resource="0" file="Source/Processors/Visualization/SpikePlotting/WaveAxes.cpp"/> - <FILE id="cZX4SM" name="WaveAxes.h" compile="0" resource="0" file="Source/Processors/Visualization/SpikePlotting/WaveAxes.h"/> - </GROUP> <FILE id="ajAJi" name="SpikeObject.cpp" compile="1" resource="0" file="Source/Processors/Visualization/SpikeObject.cpp"/> <FILE id="xqF5zL" name="SpikeObject.h" compile="0" resource="0" file="Source/Processors/Visualization/SpikeObject.h"/> <FILE id="jGEqDp" name="SpikeDisplayCanvas.cpp" compile="1" resource="0" @@ -326,6 +307,9 @@ <FILE id="hGnGAjh" name="EventNode.cpp" compile="1" resource="0" file="Source/Processors/EventNode.cpp"/> <FILE id="dUtRN6" name="EventNode.h" compile="0" resource="0" file="Source/Processors/EventNode.h"/> <GROUP id="AqvwO6w" name="Editors"> + <FILE id="Xy7AJu" name="RHD2000Editor.cpp" compile="1" resource="0" + file="Source/Processors/Editors/RHD2000Editor.cpp"/> + <FILE id="TKVa9h" name="RHD2000Editor.h" compile="0" resource="0" file="Source/Processors/Editors/RHD2000Editor.h"/> <FILE id="3P8oDf3" name="RecordControlEditor.cpp" compile="1" resource="0" file="Source/Processors/Editors/RecordControlEditor.cpp"/> <FILE id="hFb27ev" name="RecordControlEditor.h" compile="0" resource="0"