├── .gitattributes ├── license.md ├── source ├── .gitignore ├── .vscode │ └── c_cpp_properties.json ├── Banner.h ├── Flutterbird.RPP ├── Flutterbird.code-workspace ├── Flutterbird.cpp ├── Flutterbird.h ├── Flutterbird.sln ├── Flutterbird.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Knob.h ├── Oscillator.h ├── SmoothToggle.h ├── SvgSwitchControl.h ├── ThemeColors.h ├── Util.h ├── config.h ├── config │ ├── Flutterbird-ios.xcconfig │ ├── Flutterbird-mac.xcconfig │ ├── Flutterbird-web.mk │ └── Flutterbird-win.props ├── installer │ ├── Flutterbird-installer-bg.png │ ├── Flutterbird.iss │ ├── Flutterbird.pkgproj │ ├── changelog.txt │ ├── intro.rtf │ ├── known-issues.txt │ ├── license.rtf │ ├── readme-osx.rtf │ └── readme-win.rtf ├── manual │ ├── Flutterbird manual.pdf │ └── Flutterbird manual.tex ├── projects │ ├── Flutterbird-Bridging-Header.h │ ├── Flutterbird-aax.vcxproj │ ├── Flutterbird-aax.vcxproj.filters │ ├── Flutterbird-aax.vcxproj.user │ ├── Flutterbird-app.vcxproj │ ├── Flutterbird-app.vcxproj.filters │ ├── Flutterbird-app.vcxproj.user │ ├── Flutterbird-iOS.entitlements │ ├── Flutterbird-iOS.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── Framework.xcscheme │ │ │ ├── iOS-APP.xcscheme │ │ │ └── iOS-AUv3.xcscheme │ ├── Flutterbird-macOS.entitlements │ ├── Flutterbird-macOS.xcodeproj │ │ ├── project.pbxproj │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── AAX.xcscheme │ │ │ ├── APP.xcscheme │ │ │ ├── AU.xcscheme │ │ │ ├── AUv3.xcscheme │ │ │ ├── All macOS.xcscheme │ │ │ ├── VST2.xcscheme │ │ │ ├── VST3 (Distributed).xcscheme │ │ │ ├── VST3 Controller Library.xcscheme │ │ │ └── VST3.xcscheme │ ├── Flutterbird-vst2.vcxproj │ ├── Flutterbird-vst2.vcxproj.filters │ ├── Flutterbird-vst2.vcxproj.user │ ├── Flutterbird-vst3.vcxproj │ ├── Flutterbird-vst3.vcxproj.filters │ ├── Flutterbird-vst3.vcxproj.user │ ├── Flutterbird-wam-controller.mk │ ├── Flutterbird-wam-processor.mk │ └── FlutterbirdFramework.h ├── resources │ ├── Flutterbird-AAX-Info.plist │ ├── Flutterbird-AU-Info.plist │ ├── Flutterbird-Pages.xml │ ├── Flutterbird-VST2-Info.plist │ ├── Flutterbird-VST3-Info.plist │ ├── Flutterbird-iOS-AUv3-Info.plist │ ├── Flutterbird-iOS-Framework-Info.plist │ ├── Flutterbird-iOS-Info.plist │ ├── Flutterbird-iOS-MainInterface.storyboard │ ├── Flutterbird-iOS-launchScreen.storyboard │ ├── Flutterbird-iOS.storyboard │ ├── Flutterbird-macOS-AUv3-Info.plist │ ├── Flutterbird-macOS-Info.plist │ ├── Flutterbird-macOS-MainMenu.xib │ ├── Flutterbird.icns │ ├── Flutterbird.ico │ ├── FlutterbirdAppViewController.swift │ ├── FlutterbirdViewController+AUAudioUnitFactory.swift │ ├── FlutterbirdViewController.swift │ ├── IPlugViewController.xib │ ├── Images.xcassets │ │ ├── Contents.json │ │ └── FlutterbirdiOSAppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Flutterbird@1x.png │ │ │ ├── Flutterbird@2x.png │ │ │ └── Flutterbird@2xPro.png │ ├── fonts │ │ ├── Caveat-Bold.ttf │ │ └── CourierPrimeSans-Italic.ttf │ ├── img │ │ ├── toggle.svg │ │ └── waveforms.svg │ ├── main.aps │ ├── main.rc │ ├── main.rc_mac_dlg │ ├── main.rc_mac_menu │ └── resource.h └── scripts │ ├── clear_audiounit_caches.command │ ├── make_zip.py │ ├── makedist-mac.sh │ ├── makedist-web.sh │ ├── makedist-win.bat │ ├── postbuild-win.bat │ ├── prebuild-win.bat │ ├── prepare_resources-ios.py │ ├── prepare_resources-mac.py │ ├── prepare_resources-win.py │ ├── update_installer_version.py │ ├── update_version.py │ └── validate_audiounit.sh └── todo.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Andrew Minnich 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /source/.gitignore: -------------------------------------------------------------------------------- 1 | *.exe 2 | *.sdf 3 | *.opensdf 4 | *.zip 5 | *.suo 6 | *.ncb 7 | *.vcproj.* 8 | *.pkg 9 | *.dmg 10 | *.depend 11 | *.layout 12 | *.mode1v3 13 | *.db 14 | *.LSOverride 15 | *.xcuserdata 16 | *.xcschememanagement.plist 17 | build-* 18 | ipch/* 19 | gui/* 20 | 21 | Icon? 22 | .DS_Stor* 23 | .vs/* -------------------------------------------------------------------------------- /source/.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Mac", 5 | "includePath": [ 6 | "${workspaceFolder}/**", 7 | "${workspaceFolder}/../../WDL/**", 8 | "${workspaceFolder}/../../IPlug/**", 9 | "${workspaceFolder}/../../IGraphics/**", 10 | "${workspaceFolder}/../../Dependencies/IPlug/**", 11 | "${workspaceFolder}/../../Dependencies/IGraphics/**", 12 | "${workspaceFolder}/../../Dependencies/Extras/**", 13 | "${workspaceFolder}/../../Dependencies/Build/mac/include/**" 14 | ], 15 | "defines": [ 16 | "OS_MAC", 17 | "APP_API", 18 | "IPLUG_DSP=1", 19 | "IPLUG_EDITOR=1", 20 | "IGRAPHICS_NANOVG", 21 | "IGRAPHICS_METAL,", 22 | "NOMINMAX" 23 | ], 24 | "macFrameworkPath": [ 25 | "/System/Library/Frameworks", 26 | "/Library/Frameworks" 27 | ], 28 | "compilerPath": "/usr/bin/clang", 29 | "cStandard": "c11", 30 | "cppStandard": "c++11", 31 | "intelliSenseMode": "clang-x64" 32 | } 33 | ], 34 | "version": 4 35 | } -------------------------------------------------------------------------------- /source/Banner.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "config.h" 4 | #include "IControl.h" 5 | #include "ThemeColors.h" 6 | 7 | class Banner : public IControl 8 | { 9 | public: 10 | Banner(IRECT bounds) : IControl(bounds.GetScaled(2), kNoParameter), mainBounds(bounds) {} 11 | 12 | void OnResize() override { shouldRedraw = true; } 13 | 14 | void Draw(IGraphics& g) override 15 | { 16 | if (shouldRedraw) 17 | { 18 | g.StartLayer(mRECT); 19 | 20 | g.PathRect(mainBounds); 21 | g.PathFill(IPattern(themeColorAccent)); 22 | 23 | auto l = mainBounds.L; 24 | auto r = mainBounds.R; 25 | float x[] = { l + (r - l) * .55, l + (r - l) * .65, mainBounds.R, mainBounds.R }; 26 | float y[] = { mainBounds.B, mainBounds.T, mainBounds.T, mainBounds.B }; 27 | g.PathConvexPolygon(x, y, 4); 28 | g.PathFill(IPattern(IColor(64, 0, 0, 0))); 29 | 30 | layerPointer = g.EndLayer(); 31 | int blurRadius = 32.0 * (float)g.Height() / (float)(PLUG_HEIGHT); 32 | g.ApplyLayerDropShadow(layerPointer, IShadow(IPattern(IColor(255, 0, 0, 0)), blurRadius, 0, 0, .5)); 33 | 34 | shouldRedraw = false; 35 | } 36 | 37 | g.DrawLayer(layerPointer); 38 | } 39 | 40 | private: 41 | IRECT mainBounds; 42 | bool shouldRedraw = true; 43 | ILayerPtr layerPointer = nullptr; 44 | }; 45 | -------------------------------------------------------------------------------- /source/Flutterbird.RPP: -------------------------------------------------------------------------------- 1 | 28 | 30 | RENDER_FILE "" 31 | RENDER_PATTERN "" 32 | RENDER_FMT 0 2 0 33 | RENDER_1X 0 34 | RENDER_RANGE 1 0 0 18 1000 35 | RENDER_RESAMPLE 3 0 1 36 | RENDER_ADDTOPROJ 0 37 | RENDER_STEMS 0 38 | RENDER_DITHER 0 39 | TIMELOCKMODE 1 40 | TEMPOENVLOCKMODE 1 41 | ITEMMIX 0 42 | DEFPITCHMODE 589824 43 | TAKELANE 1 44 | SAMPLERATE 44100 0 0 45 | 47 | LOCK 1 48 | 55 | GLOBAL_AUTO -1 56 | TEMPO 120 4 4 57 | PLAYRATE 1 0 0.25 4 58 | SELECTION 0 0 59 | SELECTION2 0 0 60 | MASTERAUTOMODE 0 61 | MASTERTRACKHEIGHT 0 0 62 | MASTERPEAKCOL 16576 63 | MASTERMUTESOLO 0 64 | MASTERTRACKVIEW 0 0.6667 0.5 0.5 0 0 0 65 | MASTERHWOUT 0 0 1 0 0 0 0 -1 66 | MASTER_NCH 2 2 67 | MASTER_VOLUME 1 0 -1 -1 1 68 | MASTER_FX 1 69 | MASTER_SEL 0 70 | 77 | 84 | 86 | 120 | PRESETNAME Empty 121 | FLOATPOS 0 0 0 0 122 | FXID {37C5AD53-676D-7444-8997-51344BC13F72} 123 | WAK 0 124 | > 125 | > 126 | 128 | > 129 | -------------------------------------------------------------------------------- /source/Flutterbird.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | } 6 | ], 7 | "settings": { 8 | "files.associations": { 9 | "algorithm": "cpp" 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /source/Flutterbird.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "Banner.h" 4 | #include 5 | #include 6 | #include "IPlug_include_in_plug_hdr.h" 7 | #include "Knob.h" 8 | #include "Oscillator.h" 9 | #include "ThemeColors.h" 10 | #include 11 | #include "Util.h" 12 | #include "SmoothToggle.h" 13 | #include 14 | #include 15 | #include "SvgSwitchControl.h" 16 | 17 | /* 18 | Flutterbird is an audio effect plugin that applies regular or 19 | chaotic fluctuations to the input audio's pitch, volume, 20 | and/or panning. 21 | 22 | Flutterbird writes audio to a circular "tape" that holds the last 23 | 10 seconds of input. The "write head" moves at a steady rate. 24 | The "read head" moves in sync with the write head or slightly behind. 25 | 26 | The target distance behind the write head that the read head should be 27 | is determined by the value of each oscillator and how much pitch 28 | modulation is applied. The read head moves smoothly to the target position. 29 | As it moves along the tape, it reads the audio slower or faster, creating 30 | the pitch fluctuation effect. 31 | */ 32 | 33 | const int tapeLength = 10; 34 | const int numOscillators = 4; // unused 35 | 36 | enum class Parameters 37 | { 38 | Osc1Waveform, 39 | Osc1Frequency, 40 | Osc1TempoSyncEnabled, 41 | Osc1TempoSyncTime, 42 | Osc1ToPitch, 43 | Osc1ToVolume, 44 | Osc1ToPanning, 45 | Osc2Waveform, 46 | Osc2Frequency, 47 | Osc2TempoSyncEnabled, 48 | Osc2TempoSyncTime, 49 | Osc2ToPitch, 50 | Osc2ToVolume, 51 | Osc2ToPanning, 52 | Osc3Waveform, 53 | Osc3Frequency, 54 | Osc3TempoSyncEnabled, 55 | Osc3TempoSyncTime, 56 | Osc3ToPitch, 57 | Osc3ToVolume, 58 | Osc3ToPanning, 59 | Osc4Waveform, 60 | Osc4Frequency, 61 | Osc4TempoSyncEnabled, 62 | Osc4TempoSyncTime, 63 | Osc4ToPitch, 64 | Osc4ToVolume, 65 | Osc4ToPanning, 66 | GlobalToPitch, 67 | GlobalToVolume, 68 | GlobalToPanning, 69 | Mix, 70 | TestTone, 71 | NumParameters, 72 | }; 73 | 74 | enum class TempoSyncTimes 75 | { 76 | EightBars, 77 | SixBars, 78 | FourBars, 79 | ThreeBars, 80 | TwoBars, 81 | DottedWhole, 82 | Whole, 83 | DottedHalf, 84 | Half, 85 | TripletHalf, 86 | DottedQuarter, 87 | Quarter, 88 | TripletQuarter, 89 | DottedEighth, 90 | Eighth, 91 | TripletEighth, 92 | DottedSixteenth, 93 | Sixteenth, 94 | TripletSixteenth, 95 | NumTempoSyncTimes, 96 | }; 97 | 98 | class Flutterbird : public IPlug 99 | { 100 | public: 101 | Flutterbird(IPlugInstanceInfo instanceInfo); 102 | 103 | #if IPLUG_DSP 104 | void ProcessBlock(sample** inputs, sample** outputs, int nFrames) override; 105 | void InitBuffer(); 106 | void OnReset() override; 107 | IParam* GetParam(Parameters parameter); 108 | void OnParamChange(int paramIdx); 109 | void OnParamChangeUI(int paramIdx, EParamSource source = kUnknown); 110 | bool SerializeState(IByteChunk& chunk) const override; 111 | int UnserializeState(const IByteChunk& chunk, int startPos); 112 | #endif 113 | 114 | private: 115 | #if IPLUG_DSP 116 | void SetWaveformParameterDisplayText(IParam * parameter); 117 | void SetTempoSyncTimeParameterDisplayText(IParam * parameter); 118 | void InitParameters(); 119 | double TempoSyncToFrequency(TempoSyncTimes value); 120 | void UpdateOscillators(); 121 | double GetReadPosition(); 122 | void UpdateVolume(); 123 | void UpdatePanning(); 124 | double GetSample(std::vector& buffer, double position); 125 | 126 | double dt = 0.0; 127 | bool playingPrevious = false; 128 | int bufferLength = 0; 129 | std::vector bufferL; 130 | std::vector bufferR; 131 | Oscillator osc1; 132 | Oscillator osc2; 133 | Oscillator osc3; 134 | Oscillator osc4; 135 | double osc1Value = 0.0; 136 | double osc2Value = 0.0; 137 | double osc3Value = 0.0; 138 | double osc4Value = 0.0; 139 | int writePosition = 0; 140 | double relativeReadPosition = 0.0; 141 | double volume = 1.0; 142 | double panning = 0.0; 143 | SmoothToggle testToneSwitch; 144 | double testTonePhase = 0.0; 145 | #endif 146 | 147 | #if IPLUG_EDITOR 148 | void InitGraphics(); 149 | 150 | ITextControl* parameterNameLabel; 151 | ITextControl* parameterValueLabel; 152 | Knob* osc1FrequencyKnob; 153 | Knob* osc2FrequencyKnob; 154 | Knob* osc3FrequencyKnob; 155 | Knob* osc4FrequencyKnob; 156 | #endif 157 | }; 158 | -------------------------------------------------------------------------------- /source/Flutterbird.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.27004.2006 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Flutterbird-app", "projects\Flutterbird-app.vcxproj", "{41785AE4-5B70-4A75-880B-4B418B4E13C6}" 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Flutterbird-vst2", "projects\Flutterbird-vst2.vcxproj", "{2EB4846A-93E0-43A0-821E-12237105168F}" 9 | EndProject 10 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Flutterbird-vst3", "projects\Flutterbird-vst3.vcxproj", "{079FC65A-F0E5-4E97-B318-A16D1D0B89DF}" 11 | EndProject 12 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Flutterbird-aax", "projects\Flutterbird-aax.vcxproj", "{DC4B5920-933D-4C82-B842-F34431D55A93}" 13 | EndProject 14 | Global 15 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 16 | Debug|Win32 = Debug|Win32 17 | Debug|x64 = Debug|x64 18 | Release|Win32 = Release|Win32 19 | Release|x64 = Release|x64 20 | Tracer|Win32 = Tracer|Win32 21 | Tracer|x64 = Tracer|x64 22 | EndGlobalSection 23 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 24 | {41785AE4-5B70-4A75-880B-4B418B4E13C6}.Debug|Win32.ActiveCfg = Debug|Win32 25 | {41785AE4-5B70-4A75-880B-4B418B4E13C6}.Debug|Win32.Build.0 = Debug|Win32 26 | {41785AE4-5B70-4A75-880B-4B418B4E13C6}.Debug|x64.ActiveCfg = Debug|x64 27 | {41785AE4-5B70-4A75-880B-4B418B4E13C6}.Debug|x64.Build.0 = Debug|x64 28 | {41785AE4-5B70-4A75-880B-4B418B4E13C6}.Release|Win32.ActiveCfg = Release|Win32 29 | {41785AE4-5B70-4A75-880B-4B418B4E13C6}.Release|Win32.Build.0 = Release|Win32 30 | {41785AE4-5B70-4A75-880B-4B418B4E13C6}.Release|x64.ActiveCfg = Release|x64 31 | {41785AE4-5B70-4A75-880B-4B418B4E13C6}.Release|x64.Build.0 = Release|x64 32 | {41785AE4-5B70-4A75-880B-4B418B4E13C6}.Tracer|Win32.ActiveCfg = Debug|Win32 33 | {41785AE4-5B70-4A75-880B-4B418B4E13C6}.Tracer|Win32.Build.0 = Debug|Win32 34 | {41785AE4-5B70-4A75-880B-4B418B4E13C6}.Tracer|x64.ActiveCfg = Debug|x64 35 | {41785AE4-5B70-4A75-880B-4B418B4E13C6}.Tracer|x64.Build.0 = Debug|x64 36 | {2EB4846A-93E0-43A0-821E-12237105168F}.Debug|Win32.ActiveCfg = Debug|Win32 37 | {2EB4846A-93E0-43A0-821E-12237105168F}.Debug|Win32.Build.0 = Debug|Win32 38 | {2EB4846A-93E0-43A0-821E-12237105168F}.Debug|x64.ActiveCfg = Debug|x64 39 | {2EB4846A-93E0-43A0-821E-12237105168F}.Debug|x64.Build.0 = Debug|x64 40 | {2EB4846A-93E0-43A0-821E-12237105168F}.Release|Win32.ActiveCfg = Release|Win32 41 | {2EB4846A-93E0-43A0-821E-12237105168F}.Release|Win32.Build.0 = Release|Win32 42 | {2EB4846A-93E0-43A0-821E-12237105168F}.Release|x64.ActiveCfg = Release|x64 43 | {2EB4846A-93E0-43A0-821E-12237105168F}.Release|x64.Build.0 = Release|x64 44 | {2EB4846A-93E0-43A0-821E-12237105168F}.Tracer|Win32.ActiveCfg = Debug|Win32 45 | {2EB4846A-93E0-43A0-821E-12237105168F}.Tracer|Win32.Build.0 = Debug|Win32 46 | {2EB4846A-93E0-43A0-821E-12237105168F}.Tracer|x64.ActiveCfg = Debug|x64 47 | {2EB4846A-93E0-43A0-821E-12237105168F}.Tracer|x64.Build.0 = Debug|x64 48 | {079FC65A-F0E5-4E97-B318-A16D1D0B89DF}.Debug|Win32.ActiveCfg = Debug|Win32 49 | {079FC65A-F0E5-4E97-B318-A16D1D0B89DF}.Debug|Win32.Build.0 = Debug|Win32 50 | {079FC65A-F0E5-4E97-B318-A16D1D0B89DF}.Debug|x64.ActiveCfg = Debug|x64 51 | {079FC65A-F0E5-4E97-B318-A16D1D0B89DF}.Debug|x64.Build.0 = Debug|x64 52 | {079FC65A-F0E5-4E97-B318-A16D1D0B89DF}.Release|Win32.ActiveCfg = Release|Win32 53 | {079FC65A-F0E5-4E97-B318-A16D1D0B89DF}.Release|Win32.Build.0 = Release|Win32 54 | {079FC65A-F0E5-4E97-B318-A16D1D0B89DF}.Release|x64.ActiveCfg = Release|x64 55 | {079FC65A-F0E5-4E97-B318-A16D1D0B89DF}.Release|x64.Build.0 = Release|x64 56 | {079FC65A-F0E5-4E97-B318-A16D1D0B89DF}.Tracer|Win32.ActiveCfg = Debug|Win32 57 | {079FC65A-F0E5-4E97-B318-A16D1D0B89DF}.Tracer|Win32.Build.0 = Debug|Win32 58 | {079FC65A-F0E5-4E97-B318-A16D1D0B89DF}.Tracer|x64.ActiveCfg = Debug|x64 59 | {079FC65A-F0E5-4E97-B318-A16D1D0B89DF}.Tracer|x64.Build.0 = Debug|x64 60 | {DC4B5920-933D-4C82-B842-F34431D55A93}.Debug|Win32.ActiveCfg = Debug|Win32 61 | {DC4B5920-933D-4C82-B842-F34431D55A93}.Debug|Win32.Build.0 = Debug|Win32 62 | {DC4B5920-933D-4C82-B842-F34431D55A93}.Debug|x64.ActiveCfg = Debug|x64 63 | {DC4B5920-933D-4C82-B842-F34431D55A93}.Debug|x64.Build.0 = Debug|x64 64 | {DC4B5920-933D-4C82-B842-F34431D55A93}.Release|Win32.ActiveCfg = Release|Win32 65 | {DC4B5920-933D-4C82-B842-F34431D55A93}.Release|Win32.Build.0 = Release|Win32 66 | {DC4B5920-933D-4C82-B842-F34431D55A93}.Release|x64.ActiveCfg = Release|x64 67 | {DC4B5920-933D-4C82-B842-F34431D55A93}.Release|x64.Build.0 = Release|x64 68 | {DC4B5920-933D-4C82-B842-F34431D55A93}.Tracer|Win32.ActiveCfg = Debug|Win32 69 | {DC4B5920-933D-4C82-B842-F34431D55A93}.Tracer|Win32.Build.0 = Debug|Win32 70 | {DC4B5920-933D-4C82-B842-F34431D55A93}.Tracer|x64.ActiveCfg = Debug|x64 71 | {DC4B5920-933D-4C82-B842-F34431D55A93}.Tracer|x64.Build.0 = Debug|x64 72 | EndGlobalSection 73 | GlobalSection(SolutionProperties) = preSolution 74 | HideSolutionNode = FALSE 75 | EndGlobalSection 76 | GlobalSection(ExtensibilityGlobals) = postSolution 77 | SolutionGuid = {39C95EA8-A7C1-4EB9-93C3-452C5E54C752} 78 | EndGlobalSection 79 | EndGlobal 80 | -------------------------------------------------------------------------------- /source/Flutterbird.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /source/Flutterbird.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /source/Knob.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "IControls.h" 4 | #include "ThemeColors.h" 5 | 6 | /* 7 | The possible "neutral positions" for a knob. The outer arc of the knob 8 | will be drawn from the origin to the angle the knob is pointing at. 9 | */ 10 | enum class KnobOrigin { 11 | Left, 12 | Center, 13 | Right, 14 | }; 15 | 16 | class Knob : public IVKnobControl { 17 | public: 18 | Knob(IRECT bounds, KnobOrigin o, int paramIdx) 19 | : IVKnobControl(bounds, paramIdx), origin(o) 20 | {} 21 | 22 | // Changes the parameter the knob is assigned to. 23 | void SetParameterIndex(int index) 24 | { 25 | mParamIdx = index; 26 | mValue = GetParam()->GetNormalized(); 27 | SetDirty(); 28 | } 29 | 30 | void Draw(IGraphics &g) override 31 | { 32 | const float cx = mRECT.MW(), cy = mRECT.MH(); 33 | const float angle = mAngleMin + ((float)mValue * (mAngleMax - mAngleMin)); 34 | const float radius = (mRECT.W() / 2.75f); 35 | float arcStartAngle, arcEndAngle; 36 | GetArcStartAndEndAngles(angle, arcStartAngle, arcEndAngle); 37 | 38 | if (IsGrayed()) 39 | { 40 | g.DrawArc(themeColorDarkGrayed, cx, cy, radius, mAngleMin, mAngleMax, 0, 12.f); 41 | g.DrawArc(themeColorAccentGrayed, cx, cy, radius, arcStartAngle, arcEndAngle, 0, 12.f); 42 | g.FillCircle(mMouseIsOver ? themeColorLightGrayed : themeColorWhiteGrayed, cx, cy, radius); 43 | g.DrawRadialLine(themeColorAccentGrayed, cx, cy, angle, 0.5f * radius, .9f * radius, 0, 3.f); 44 | } 45 | else 46 | { 47 | g.DrawArc(themeColorDark, cx, cy, radius, mAngleMin, mAngleMax, 0, 12.f); 48 | g.DrawArc(themeColorAccent, cx, cy, radius, arcStartAngle, arcEndAngle, 0, 12.f); 49 | g.FillCircle(mMouseIsOver ? themeColorLight : themeColorWhite, cx, cy, radius); 50 | g.DrawRadialLine(themeColorAccent, cx, cy, angle, 0.5f * radius, .9f * radius, 0, 3.f); 51 | } 52 | 53 | } 54 | 55 | private: 56 | KnobOrigin origin; 57 | 58 | /* 59 | Returns the start and end angles of the knob's arc, given 60 | the knob's current value and origin. 61 | */ 62 | void GetArcStartAndEndAngles(float knobAngle, float &start, float &end) 63 | { 64 | float originAngle = origin == KnobOrigin::Right ? mAngleMax : 65 | origin == KnobOrigin::Center ? mAngleMin + (mAngleMax - mAngleMin) / 2: 66 | mAngleMin; 67 | start = originAngle < knobAngle ? originAngle : knobAngle; 68 | end = start == originAngle ? knobAngle : originAngle; 69 | } 70 | }; 71 | -------------------------------------------------------------------------------- /source/Oscillator.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "Util.h" 5 | 6 | enum class Waveforms 7 | { 8 | Sine, 9 | Triangle, 10 | Saw, 11 | Square, 12 | Drift, 13 | NumWaveforms 14 | }; 15 | 16 | class Oscillator 17 | { 18 | public: 19 | void Oscillator::Reset() { phase = 0.0; } 20 | 21 | double Oscillator::Next(double dt, Waveforms waveform, double frequency) 22 | { 23 | phase += frequency * dt; 24 | while (phase > 1.0) phase -= 1.0; 25 | 26 | switch (waveform) 27 | { 28 | case Waveforms::Sine: 29 | return .5 + .5 * sin(phase * twoPi); 30 | case Waveforms::Triangle: 31 | return 1.0 - abs(2.0 * phase - 1.0); 32 | case Waveforms::Saw: 33 | return phase; 34 | case Waveforms::Square: 35 | return phase < 0.5 ? 0.0 : 1.0; 36 | case Waveforms::Drift: 37 | driftVelocity += random() * 10000.0 * frequency * dt; 38 | driftVelocity -= driftVelocity * 2.0 * sqrt(frequency) * dt; 39 | driftPhase += driftVelocity * dt; 40 | return .5 + .5 * sin(driftPhase); 41 | } 42 | } 43 | 44 | private: 45 | double phase = 0.0; 46 | double driftVelocity = 0.0; 47 | double driftPhase = 0.0; 48 | }; 49 | 50 | -------------------------------------------------------------------------------- /source/SmoothToggle.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | /* 4 | A switch that, when flipped, smoothly transitions from 0-1 or vice versa. 5 | Used for parameters that would cause popping noises if they were not 6 | transitioned smoothly. 7 | */ 8 | class SmoothToggle 9 | { 10 | public: 11 | bool on = false; 12 | double value = 0.0; 13 | double speed = 100.0; 14 | 15 | void Update(double dt) 16 | { 17 | if (on && value < 1.0) 18 | { 19 | value += speed * dt; 20 | if (value > 1.0) value = 1.0; 21 | } 22 | if (!on && value > 0.0) 23 | { 24 | value -= speed * dt; 25 | if (value < 0.0) value = 0.0; 26 | } 27 | } 28 | }; 29 | 30 | -------------------------------------------------------------------------------- /source/SvgSwitchControl.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "IControls.h" 4 | #include "ThemeColors.h" 5 | 6 | /* 7 | A switch control that uses an SVG for its inner graphics. 8 | The graphic for each state should be arranged vertically in the SVG, like a framestrip. 9 | */ 10 | class SvgSwitchControl : public IVSwitchControl 11 | { 12 | public: 13 | SvgSwitchControl(IRECT bounds, ISVG svg, int paramIdx = kNoParameter) 14 | : IVSwitchControl(bounds, paramIdx), 15 | switchContents(svg) 16 | {} 17 | 18 | void SvgSwitchControl::OnMouseDown(float x, float y, const IMouseMod& mod) override 19 | { 20 | if (mNumStates > 2) 21 | { 22 | menu = IPopupMenu(); 23 | for (int i = 0; i <= GetParam()->GetMax(); i++) 24 | menu.AddItem(new IPopupMenu::Item(GetParam()->GetDisplayTextAtIdx(i))); 25 | GetUI()->CreatePopupMenu(menu, mRECT, this); 26 | mMouseDown = true; 27 | } 28 | else 29 | { 30 | IVSwitchControl::OnMouseDown(x, y, mod); 31 | } 32 | } 33 | 34 | void SvgSwitchControl::OnPopupMenuSelection(IPopupMenu* pSelectedMenu) override 35 | { 36 | if (pSelectedMenu == nullptr) return; 37 | mValue = pSelectedMenu->GetChosenItemIdx() / ((double)mNumStates - 1.); 38 | SetDirty(true); 39 | } 40 | 41 | void Draw(IGraphics& g) override 42 | { 43 | g.FillRect(mMouseIsOver ? themeColorLight : themeColorWhite, mRECT); 44 | g.DrawRect(themeColorDark, mRECT, 0, 8.0f); 45 | 46 | auto svgY = mRECT.T - (mRECT.B - mRECT.T) * (int)GetParam()->Value(); 47 | auto svgH = (mRECT.B - mRECT.T) * mNumStates; 48 | auto svgRect = IRECT(mRECT.L, svgY, mRECT.R, svgY + svgH); 49 | g.PathClipRegion(mRECT); 50 | g.DrawSVG(switchContents, svgRect); 51 | } 52 | 53 | private: 54 | ISVG switchContents; 55 | IPopupMenu menu = IPopupMenu(); 56 | }; 57 | -------------------------------------------------------------------------------- /source/ThemeColors.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "IGraphicsStructs.h" 4 | 5 | auto themeColorAccent = IColor(255, 29, 128, 170); 6 | auto themeColorBg = IColor(255, 50, 50, 50); 7 | auto themeColorDark = IColor(255, 80, 80, 80); 8 | auto themeColorLight = IColor(255, 210, 210, 210); 9 | auto themeColorWhite = IColor(255, 240, 240, 240); 10 | 11 | auto themeColorAccentGrayed = IColor(255, 29/2, 128/2, 170/2); 12 | auto themeColorDarkGrayed = IColor(255, 80/1.25, 80/1.25, 80/1.25); 13 | auto themeColorLightGrayed = IColor(255, 210/2, 210/2, 210/2); 14 | auto themeColorWhiteGrayed = IColor(255, 240/2, 240/2, 240/2); 15 | -------------------------------------------------------------------------------- /source/Util.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "IGraphicsStructs.h" 5 | 6 | const double twoPi = 4 * acos(0.0); 7 | 8 | // https://stackoverflow.com/a/707426 9 | inline int wrap(int kX, int const kLowerBound, int const kUpperBound) 10 | { 11 | int range_size = kUpperBound - kLowerBound + 1; 12 | 13 | if (kX < kLowerBound) 14 | kX += range_size * ((kLowerBound - kX) / range_size + 1); 15 | 16 | return kLowerBound + (kX - kLowerBound) % range_size; 17 | } 18 | 19 | /* 20 | Given 4 samples and a point from 0-1 between y1 and y2, returns an 21 | approximation of what the sample would be. 22 | */ 23 | inline float interpolate(float x, float y0, float y1, float y2, float y3) 24 | { 25 | /* 26 | interpolation code from Polynomial Interpolators for 27 | High-Quality Resampling of Oversampled Audio by Olli Niemitalo (p. 48) 28 | http://yehar.com/blog/wp-content/uploads/2009/08/deip.pdf 29 | */ 30 | 31 | // 4-point, 2nd-order Watte tri-linear (x-form) 32 | float ym1py2 = y0 + y3; 33 | float c0 = y1; 34 | float c1 = (3 / 2.0) * y2 - (1 / 2.0) * (y1 + ym1py2); 35 | float c2 = 1 / 2.0 * (ym1py2 - y1 - y2); 36 | return (c2*x + c1)*x + c0; 37 | } 38 | 39 | inline void adjustPanning(double inL, double inR, double angle, double &outL, double &outR) 40 | { 41 | auto c = cos(angle); 42 | auto s = sin(angle); 43 | outL = inL * c - inR * s; 44 | outR = inL * s + inR * c; 45 | } 46 | 47 | // random numbers 48 | 49 | // https://stackoverflow.com/questions/1640258/need-a-fast-random-generator-for-c 50 | static unsigned long x = 123456789, y = 362436069, z = 521288629; 51 | 52 | // Returns a random integer 53 | inline unsigned long xorshift(void) 54 | { 55 | unsigned long t; 56 | x ^= x << 16; 57 | x ^= x >> 5; 58 | x ^= x << 1; 59 | t = x; 60 | x = y; 61 | y = z; 62 | z = t ^ x ^ y; 63 | return z; 64 | } 65 | 66 | const double xorshiftMultiplier = 2.0 / ULONG_MAX; 67 | 68 | // Returns a random number between -1 and 1 69 | inline double random() 70 | { 71 | return -1.0 + xorshift() * xorshiftMultiplier; 72 | } 73 | -------------------------------------------------------------------------------- /source/config.h: -------------------------------------------------------------------------------- 1 | #define PLUG_NAME "Flutterbird" 2 | #define PLUG_MFR "Tesselode" 3 | #define PLUG_VERSION_HEX 0x00010000 4 | #define PLUG_VERSION_STR "2.0.0" 5 | #define PLUG_UNIQUE_ID 'TesF' 6 | #define PLUG_MFR_ID 'Tesa' 7 | #define PLUG_URL_STR "tesselode.github.io" 8 | #define PLUG_EMAIL_STR "" 9 | #define PLUG_COPYRIGHT_STR "Copyright 2019 Tesselode" 10 | #define PLUG_CLASS_NAME Flutterbird 11 | 12 | #define BUNDLE_NAME "Flutterbird" 13 | #define BUNDLE_MFR "Tesselode" 14 | #define BUNDLE_DOMAIN "com" 15 | 16 | #define PLUG_CHANNEL_IO "2-2" 17 | 18 | #define PLUG_LATENCY 0 19 | #define PLUG_TYPE 0 20 | #define PLUG_DOES_MIDI_IN 0 21 | #define PLUG_DOES_MIDI_OUT 0 22 | #define PLUG_DOES_MPE 0 23 | #define PLUG_DOES_STATE_CHUNKS 1 24 | #define PLUG_HAS_UI 1 25 | #define PLUG_GUI_BASE_UNIT 80 26 | #define PLUG_WIDTH 80 * 6.625 27 | #define PLUG_HEIGHT 80 * 7 28 | #define PLUG_FPS 120 29 | #define PLUG_SHARED_RESOURCES 0 30 | 31 | #define AUV2_ENTRY Flutterbird_Entry 32 | #define AUV2_ENTRY_STR "Flutterbird_Entry" 33 | #define AUV2_FACTORY Flutterbird_Factory 34 | #define AUV2_VIEW_CLASS Flutterbird_View 35 | #define AUV2_VIEW_CLASS_STR "Flutterbird_View" 36 | 37 | #define AAX_TYPE_IDS 'EFN1', 'EFN2' 38 | #define AAX_TYPE_IDS_AUDIOSUITE 'EFA1', 'EFA2' 39 | #define AAX_PLUG_MFR_STR "Acme" 40 | #define AAX_PLUG_NAME_STR "Flutterbird\nIPEF" 41 | #define AAX_PLUG_CATEGORY_STR "Effect" 42 | #define AAX_DOES_AUDIOSUITE 1 43 | 44 | #define VST3_SUBCATEGORY "Fx" 45 | 46 | #define APP_NUM_CHANNELS 2 47 | #define APP_N_VECTOR_WAIT 0 48 | #define APP_MULT 1 49 | #define APP_COPY_AUV3 0 50 | #define APP_RESIZABLE 0 51 | #define APP_SIGNAL_VECTOR_SIZE 64 52 | 53 | #define HANDWRITING_FONT_FN "Caveat-Bold.ttf" 54 | #define MONOSPACE_FONT_FN "CourierPrimeSans-Italic.ttf" 55 | #define WAVEFORMS_SVG_FN "waveforms.svg" 56 | #define TOGGLE_SVG_FN "toggle.svg" 57 | -------------------------------------------------------------------------------- /source/config/Flutterbird-ios.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../../common-ios.xcconfig" 2 | 3 | //------------------------------ 4 | // Global build settings 5 | 6 | // the basename of the vst, vst3, app, component, aaxplugin 7 | BINARY_NAME = Flutterbird 8 | 9 | // ------------------------------ 10 | // HEADER AND LIBRARY SEARCH PATHS 11 | EXTRA_INC_PATHS = $(IGRAPHICS_INC_PATHS) 12 | EXTRA_LIB_PATHS = $(IGRAPHICS_LIB_PATHS) 13 | EXTRA_LNK_FLAGS = $(IGRAPHICS_LNK_FLAGS) 14 | 15 | //------------------------------ 16 | // PREPROCESSOR MACROS 17 | 18 | EXTRA_ALL_DEFS = OBJC_PREFIX=vFlutterbird IGRAPHICS_NANOVG IGRAPHICS_METAL SAMPLE_TYPE_FLOAT 19 | //EXTRA_DEBUG_DEFS = 20 | //EXTRA_RELEASE_DEFS = 21 | //EXTRA_TRACER_DEFS = 22 | 23 | //------------------------------ 24 | // RELEASE BUILD OPTIONS 25 | 26 | //Enable/Disable Profiling code 27 | PROFILE = NO //NO, YES - enable this if you want to use instruments to profile a plugin 28 | 29 | // GCC optimization level - 30 | // None: [-O0] Fast: [-O, -O1] Faster:[-O2] Fastest: [-O3] Fastest, smallest: Optimize for size. [-Os] 31 | RELEASE_OPTIMIZE = 3 //0,1,2,3,s 32 | 33 | //------------------------------ 34 | // DEBUG BUILD OPTIONS 35 | DEBUG_OPTIMIZE = 0 //0,1,2,3,s 36 | 37 | //------------------------------ 38 | // MISCELLANEOUS COMPILER OPTIONS 39 | 40 | GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO 41 | 42 | // Uncomment to enable relaxed IEEE compliance 43 | //GCC_FAST_MATH = YES 44 | 45 | // Flags to pass to compiler for all builds 46 | GCC_CFLAGS = -Wno-write-strings 47 | -------------------------------------------------------------------------------- /source/config/Flutterbird-mac.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../../common-mac.xcconfig" 2 | 3 | //------------------------------ 4 | // Global build settings 5 | 6 | // the basename of the vst, vst3, app, component, aaxplugin 7 | BINARY_NAME = Flutterbird 8 | 9 | // ------------------------------ 10 | // HEADER AND LIBRARY SEARCH PATHS 11 | EXTRA_INC_PATHS = $(IGRAPHICS_INC_PATHS) 12 | EXTRA_LIB_PATHS = $(IGRAPHICS_LIB_PATHS) 13 | EXTRA_LNK_FLAGS = //$(IGRAPHICS_LNK_FLAGS) 14 | 15 | // EXTRA_APP_DEFS = 16 | // EXTRA_PLUGIN_DEFS = 17 | 18 | //------------------------------ 19 | // PREPROCESSOR MACROS 20 | EXTRA_ALL_DEFS = OBJC_PREFIX=vFlutterbird SWELL_APP_PREFIX=Swell_vFlutterbird IGRAPHICS_NANOVG IGRAPHICS_METAL 21 | //EXTRA_DEBUG_DEFS = 22 | //EXTRA_RELEASE_DEFS = 23 | //EXTRA_TRACER_DEFS = 24 | 25 | //------------------------------ 26 | // RELEASE BUILD OPTIONS 27 | 28 | //Enable/Disable Profiling code 29 | PROFILE = NO //NO, YES - enable this if you want to use instruments to profile a plugin 30 | 31 | // Optimization level - 32 | // None: [-O0] Fast: [-O, -O1] Faster:[-O2] Fastest: [-O3] Fastest, smallest: Optimize for size. [-Os] 33 | RELEASE_OPTIMIZE = 3 //0,1,2,3,s 34 | 35 | //------------------------------ 36 | // DEBUG BUILD OPTIONS 37 | DEBUG_OPTIMIZE = 0 //0,1,2,3,s 38 | 39 | //------------------------------ 40 | // MISCELLANEOUS COMPILER OPTIONS 41 | 42 | //ARCHS = $(ARCHS_STANDARD_32_64_BIT) 43 | ARCHS = $(ARCHS_STANDARD_64_BIT) 44 | 45 | GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO 46 | 47 | // Flags to pass to compiler for all builds 48 | GCC_CFLAGS = -Wno-write-strings -mfpmath=sse -msse -msse2 -msse3 -mavx 49 | 50 | // Uncomment to enable relaxed IEEE compliance 51 | //GCC_FAST_MATH = YES 52 | 53 | // uncomment this to enable codesigning - necessary for AUv3 delivery 54 | //CODE_SIGN_IDENTITY=Mac Developer 55 | -------------------------------------------------------------------------------- /source/config/Flutterbird-web.mk: -------------------------------------------------------------------------------- 1 | include ./../../common-web.mk 2 | 3 | SRC += Flutterbird.cpp 4 | 5 | # WAM_SRC += 6 | 7 | # WAM_CFLAGS += 8 | 9 | WEB_CFLAGS += -DIGRAPHICS_NANOVG -DIGRAPHICS_GLES2 10 | 11 | WAM_LDFLAGS += -s EXPORT_NAME="'AudioWorkletGlobalScope.WAM.Flutterbird'" -O2 -s ASSERTIONS=0 12 | 13 | WEB_LDFLAGS += -O2 -s ASSERTIONS=0 14 | 15 | WEB_LDFLAGS += $(NANOVG_LDFLAGS) 16 | -------------------------------------------------------------------------------- /source/config/Flutterbird-win.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Flutterbird 8 | $(SolutionDir)build-win\aax\bin\$(BINARY_NAME).aaxplugin 9 | IGRAPHICS_NANOVG;IGRAPHICS_GL2 10 | 11 | 12 | 13 | 14 | 15 | $(BINARY_NAME) 16 | 17 | 18 | 19 | $(EXTRA_INC_PATHS);$(IPLUG_INC_PATHS);$(IGRAPHICS_INC_PATHS);$(GLAD_GL2_PATHS);%(AdditionalIncludeDirectories) 20 | $(EXTRA_ALL_DEFS);%(PreprocessorDefinitions) 21 | 22 | 23 | wininet.lib;comctl32.lib;Shlwapi.lib;%(AdditionalDependencies) 24 | 25 | 26 | CALL "$(SolutionDir)scripts\postbuild-win.bat" "$(TargetExt)" "$(BINARY_NAME)" "$(Platform)" "$(COPY_VST2)" "$(TargetPath)" "$(VST2_32_PATH)" "$(VST2_64_PATH)" "$(VST3_32_PATH)" "$(VST3_64_PATH)" "$(AAX_32_PATH)" "$(AAX_64_PATH)" "$(AAX_BUNDLE)" 27 | 28 | 29 | CALL "$(SolutionDir)scripts\prebuild-win.bat" "$(TargetExt)" "$(BINARY_NAME)" "$(Platform)" "$(TargetPath)" "$(OutDir)" ..\..\..\Dependencies\IPlug\AAX_SDK\Utilities\PlugIn.ico "$(AAX_BUNDLE)" 30 | 31 | 32 | 33 | 34 | $(BINARY_NAME) 35 | 36 | 37 | $(AAX_BUNDLE) 38 | 39 | 40 | $(EXTRA_ALL_DEFS) 41 | true 42 | 43 | 44 | $(EXTRA_DEBUG_DEFS) 45 | 46 | 47 | $(EXTRA_RELEASE_DEFS) 48 | 49 | 50 | $(EXTRA_TRACER_DEFS) 51 | 52 | 53 | -------------------------------------------------------------------------------- /source/installer/Flutterbird-installer-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tesselode/flutterbird/e1e0e3cfa565b232f48ece84aed35a0eda222f64/source/installer/Flutterbird-installer-bg.png -------------------------------------------------------------------------------- /source/installer/Flutterbird.iss: -------------------------------------------------------------------------------- 1 | [Setup] 2 | AppName=Flutterbird 3 | AppVersion=1.0.0 4 | DefaultDirName={pf}\Flutterbird 5 | DefaultGroupName=Flutterbird 6 | Compression=lzma2 7 | SolidCompression=yes 8 | OutputDir=.\ 9 | ArchitecturesInstallIn64BitMode=x64 10 | OutputBaseFilename=Flutterbird Installer 11 | LicenseFile=license.rtf 12 | SetupLogging=yes 13 | 14 | [Types] 15 | Name: "full"; Description: "Full installation" 16 | Name: "custom"; Description: "Custom installation"; Flags: iscustom 17 | 18 | [Components] 19 | Name: "app"; Description: "Standalone application (.exe)"; Types: full custom; 20 | Name: "vst2_32"; Description: "32-bit VST2 Plugin (.dll)"; Types: full custom; 21 | Name: "vst2_64"; Description: "64-bit VST2 Plugin (.dll)"; Types: full custom; Check: Is64BitInstallMode; 22 | Name: "vst3_32"; Description: "32-bit VST3 Plugin (.vst3)"; Types: full custom; 23 | Name: "vst3_64"; Description: "64-bit VST3 Plugin (.vst3)"; Types: full custom; Check: Is64BitInstallMode; 24 | ;Name: "aax_32"; Description: "32-bit AAX Plugin (.aaxplugin)"; Types: full custom; 25 | Name: "aax_64"; Description: "64-bit AAX Plugin (.aaxplugin)"; Types: full custom; Check: Is64BitInstallMode; 26 | Name: "manual"; Description: "User guide"; Types: full custom; Flags: fixed 27 | 28 | [Files] 29 | Source: "..\build-win\app\Win32\bin\Flutterbird.exe"; DestDir: "{app}"; Check: not Is64BitInstallMode; Components:app; Flags: ignoreversion; 30 | Source: "..\build-win\app\x64\bin\Flutterbird.exe"; DestDir: "{app}"; Check: Is64BitInstallMode; Components:app; Flags: ignoreversion; 31 | 32 | Source: "..\build-win\vst2\Win32\bin\Flutterbird.dll"; DestDir: {code:GetVST2Dir_32}; Check: not Is64BitInstallMode; Components:vst2_32; Flags: ignoreversion; 33 | Source: "..\build-win\vst2\Win32\bin\Flutterbird.dll"; DestDir: {code:GetVST2Dir_32}; Check: Is64BitInstallMode; Components:vst2_32; Flags: ignoreversion; 34 | Source: "..\build-win\vst2\x64\bin\Flutterbird.dll"; DestDir: {code:GetVST2Dir_64}; Check: Is64BitInstallMode; Components:vst2_64; Flags: ignoreversion; 35 | 36 | Source: "..\build-win\vst3\Win32\bin\Flutterbird.vst3"; DestDir: "{cf}\VST3\"; Check: not Is64BitInstallMode; Components:vst3_32; Flags: ignoreversion; 37 | Source: "..\build-win\vst3\Win32\bin\Flutterbird.vst3"; DestDir: "{cf32}\VST3\"; Check: Is64BitInstallMode; Components:vst3_32; Flags: ignoreversion; 38 | Source: "..\build-win\vst3\x64\bin\Flutterbird.vst3"; DestDir: "{cf64}\VST3\"; Check: Is64BitInstallMode; Components:vst3_64; Flags: ignoreversion; 39 | 40 | ;Source: "..\build-win\aax\bin\Flutterbird.aaxplugin\*.*"; DestDir: "{cf32}\Avid\Audio\Plug-Ins\Flutterbird.aaxplugin\"; Components:aax_32; Flags: ignoreversion recursesubdirs; 41 | Source: "..\build-win\aax\bin\Flutterbird.aaxplugin\*.*"; DestDir: "{cf}\Avid\Audio\Plug-Ins\Flutterbird.aaxplugin\"; Components:aax_64; Flags: ignoreversion recursesubdirs; 42 | 43 | Source: "..\manual\Flutterbird manual.pdf"; DestDir: "{app}" 44 | Source: "changelog.txt"; DestDir: "{app}" 45 | Source: "readme-win.rtf"; DestDir: "{app}"; DestName: "readme.rtf"; Flags: isreadme 46 | 47 | [Icons] 48 | Name: "{group}\Flutterbird"; Filename: "{app}\Flutterbird.exe" 49 | Name: "{group}\User guide"; Filename: "{app}\Flutterbird manual.pdf" 50 | Name: "{group}\Changelog"; Filename: "{app}\changelog.txt" 51 | ;Name: "{group}\readme"; Filename: "{app}\readme.rtf" 52 | Name: "{group}\Uninstall Flutterbird"; Filename: "{app}\unins000.exe" 53 | 54 | [Code] 55 | var 56 | OkToCopyLog : Boolean; 57 | VST2DirPage_32: TInputDirWizardPage; 58 | VST2DirPage_64: TInputDirWizardPage; 59 | 60 | procedure InitializeWizard; 61 | begin 62 | if IsWin64 then begin 63 | VST2DirPage_64 := CreateInputDirPage(wpSelectDir, 64 | 'Confirm 64-Bit VST2 Plugin Directory', '', 65 | 'Select the folder in which setup should install the 64-bit VST2 Plugin, then click Next.', 66 | False, ''); 67 | VST2DirPage_64.Add(''); 68 | VST2DirPage_64.Values[0] := ExpandConstant('{reg:HKLM\SOFTWARE\VST,VSTPluginsPath|{pf}\Steinberg\VSTPlugins}\'); 69 | 70 | VST2DirPage_32 := CreateInputDirPage(wpSelectDir, 71 | 'Confirm 32-Bit VST2 Plugin Directory', '', 72 | 'Select the folder in which setup should install the 32-bit VST2 Plugin, then click Next.', 73 | False, ''); 74 | VST2DirPage_32.Add(''); 75 | VST2DirPage_32.Values[0] := ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432NODE\VST,VSTPluginsPath|{pf32}\Steinberg\VSTPlugins}\'); 76 | end else begin 77 | VST2DirPage_32 := CreateInputDirPage(wpSelectDir, 78 | 'Confirm 32-Bit VST2 Plugin Directory', '', 79 | 'Select the folder in which setup should install the 32-bit VST2 Plugin, then click Next.', 80 | False, ''); 81 | VST2DirPage_32.Add(''); 82 | VST2DirPage_32.Values[0] := ExpandConstant('{reg:HKLM\SOFTWARE\VST,VSTPluginsPath|{pf}\Steinberg\VSTPlugins}\'); 83 | end; 84 | end; 85 | 86 | function GetVST2Dir_32(Param: String): String; 87 | begin 88 | Result := VST2DirPage_32.Values[0] 89 | end; 90 | 91 | function GetVST2Dir_64(Param: String): String; 92 | begin 93 | Result := VST2DirPage_64.Values[0] 94 | end; 95 | 96 | procedure CurStepChanged(CurStep: TSetupStep); 97 | begin 98 | if CurStep = ssDone then 99 | OkToCopyLog := True; 100 | end; 101 | 102 | procedure DeinitializeSetup(); 103 | begin 104 | if OkToCopyLog then 105 | FileCopy (ExpandConstant ('{log}'), ExpandConstant ('{app}\InstallationLogFile.log'), FALSE); 106 | RestartReplace (ExpandConstant ('{log}'), ''); 107 | end; 108 | 109 | [UninstallDelete] 110 | Type: files; Name: "{app}\InstallationLogFile.log" -------------------------------------------------------------------------------- /source/installer/changelog.txt: -------------------------------------------------------------------------------- 1 | Flutterbird changelog 2 | www.thedeveloperswebsite.com 3 | 4 | 00/00/00 - v1.00 initial release -------------------------------------------------------------------------------- /source/installer/intro.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 2 | \cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 LucidaGrande;} 3 | {\colortbl;\red255\green255\blue255;} 4 | {\*\expandedcolortbl;;} 5 | \paperw11900\paperh16840\margl1440\margr1440\vieww14440\viewh8920\viewkind0 6 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 7 | 8 | \f0\fs26 \cf0 BLAH BLAH BLAH BLAH THANK YOU FOR PURCHASING MY PRODUCT\ 9 | \ 10 | THE DEVELOPER\ 11 | \ 12 | contact@thedeveloperswebsite.com\ 13 | \ 14 | http://www.developerswebsite.com\ 15 | } -------------------------------------------------------------------------------- /source/installer/known-issues.txt: -------------------------------------------------------------------------------- 1 | Flutterbird changelog 2 | www.thedeveloperswebsite.com 3 | 4 | 00/00/00 - v1.00 initial release -------------------------------------------------------------------------------- /source/installer/license.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 2 | \cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 ArialMT;} 3 | {\colortbl;\red255\green255\blue255;} 4 | {\*\expandedcolortbl;;} 5 | \paperw11900\paperh16840\margl1440\margr1440\vieww17060\viewh12300\viewkind0 6 | \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 7 | 8 | \f0\b\fs20 \cf0 THIS IS AN PLACEHOLDER LICENCE PROVIDED WITH WDL-OL/IPLUG WITH NO LEGAL BASIS\ 9 | CONSULT A LAWYER BEFORE MAKING A LICENCE\ 10 | \ 11 | Caveat: 12 | \b0 \ 13 | By installing this software you agree to use it at your own risk. The developer cannot be held responsible for any damages caused as a result of it's use.\ 14 | \ 15 | 16 | \b Distribution: 17 | \b0 \ 18 | You are not permitted to distribute the software without the developer's permission. This includes, but is not limited to the distribution on magazine covers or software review websites.\ 19 | \ 20 | 21 | \b Multiple Installations*: 22 | \b0 If you purchased this product as an individual, you are licensed to install and use the software on any computer you need to use it on, providing you remove it afterwards (if it is a shared machine). If you purchased it as an institution or company, you are licensed to use it on one machine only, and must purchase additional copies for each machine you wish to use it on.\ 23 | \ 24 | 25 | \b Upgrades*: 26 | \b0 If you purchased this product you are entitled to free updates until the next major version number. The developer makes no guarantee is made that this product will be maintained indefinitely.\ 27 | \ 28 | 29 | \b License transfers*: 30 | \b0 If you purchased this product you may transfer your license to another person. As the original owner you are required to contact the developer with the details of the license transfer, so that the new owner can receive the updates and support attached to the license. Upon transferring a license the original owner must remove any copies from their machines and are no longer permitted to use the software.\ 31 | \ 32 | 33 | \b Flutterbird is \'a9 Copyright THE DEVELOPER 2004-2011\ 34 | 35 | \b0 \ 36 | http://www.thedeveloperswebsite.com\ 37 | \ 38 | VST and VST3 are trademarks of Steinberg Media Technologies GmbH. \ 39 | Audio Unit is a trademark of Apple, Inc. \ 40 | AAX is a trademarks of Avid, Inc.\ 41 | \ 42 | * Applies to full version only, not the demo version.} -------------------------------------------------------------------------------- /source/installer/readme-osx.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 2 | \cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 LucidaGrande;\f1\fnil\fcharset0 Monaco;} 3 | {\colortbl;\red255\green255\blue255;} 4 | {\*\expandedcolortbl;;} 5 | \paperw11900\paperh16840\margl1440\margr1440\vieww14320\viewh8340\viewkind0 6 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 7 | 8 | \f0\fs26 \cf0 The plugins will be installed in your system plugin folders which will make them available to all user accounts on your computer. 9 | \f1\fs20 10 | \f0\fs26 The standalone will be installed in the system Applications folder. \ 11 | \ 12 | If you don't want to install all components, click "Customize" on the "Installation Type" page.\ 13 | \ 14 | The plugins and app support both 32bit and 64bit operation.\ 15 | \ 16 | If you experience any problems with Flutterbird, please contact me at the following address:\ 17 | \ 18 | support@thedeveloperswebsite.com} -------------------------------------------------------------------------------- /source/installer/readme-win.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830 2 | {\fonttbl\f0\fnil\fcharset0 LucidaGrande-Bold;\f1\fnil\fcharset0 LucidaGrande;} 3 | {\colortbl;\red255\green255\blue255;} 4 | {\*\expandedcolortbl;;} 5 | \paperw11900\paperh16840\vieww12000\viewh15840\viewkind0 6 | \deftab720 7 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\partightenfactor0 8 | 9 | \f0\b\fs26 \cf0 Thanks for installing Flutterbird 10 | \f1\b0 \ 11 | \ 12 | BLAH BLAH BLAH\ 13 | \ 14 | THE DEVELOPER\ 15 | \ 16 | If you experience any problems with Flutterbird, please contact me at the following address:\ 17 | \ 18 | \pard\pardeftab720\partightenfactor0 19 | 20 | \f0\b \cf0 support@thedeveloperswebsite.com 21 | \f1\b0 \ 22 | } -------------------------------------------------------------------------------- /source/manual/Flutterbird manual.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tesselode/flutterbird/e1e0e3cfa565b232f48ece84aed35a0eda222f64/source/manual/Flutterbird manual.pdf -------------------------------------------------------------------------------- /source/manual/Flutterbird manual.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,14pt]{report} 2 | \begin{document} 3 | \end{document} -------------------------------------------------------------------------------- /source/projects/Flutterbird-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "IPlugAUAudioUnit.h" 2 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-aax.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-app.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-iOS.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | inter-app-audio 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-iOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-iOS.xcodeproj/xcshareddata/xcschemes/Framework.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-iOS.xcodeproj/xcshareddata/xcschemes/iOS-APP.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-iOS.xcodeproj/xcshareddata/xcschemes/iOS-AUv3.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 6 | 9 | 10 | 16 | 22 | 23 | 24 | 30 | 36 | 37 | 38 | 39 | 40 | 45 | 46 | 47 | 48 | 54 | 55 | 56 | 57 | 58 | 59 | 70 | 74 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 94 | 96 | 102 | 103 | 104 | 105 | 107 | 108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-macOS.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.application-groups 8 | 9 | group.io.github.iplug2.iplugeffect 10 | 11 | com.apple.security.assets.music.read-write 12 | 13 | com.apple.security.device.microphone 14 | 15 | com.apple.security.files.user-selected.read-write 16 | 17 | com.apple.security.network.client 18 | 19 | com.apple.security.network.server 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-macOS.xcodeproj/xcshareddata/xcschemes/AAX.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 47 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 70 | 73 | 74 | 75 | 77 | 78 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-macOS.xcodeproj/xcshareddata/xcschemes/APP.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 56 | 58 | 64 | 65 | 66 | 67 | 70 | 71 | 72 | 73 | 74 | 75 | 81 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-macOS.xcodeproj/xcshareddata/xcschemes/AU.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 47 | 50 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 72 | 73 | 74 | 76 | 77 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-macOS.xcodeproj/xcshareddata/xcschemes/AUv3.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 6 | 9 | 10 | 16 | 22 | 23 | 24 | 30 | 36 | 37 | 38 | 39 | 40 | 45 | 46 | 47 | 48 | 54 | 55 | 56 | 57 | 58 | 59 | 69 | 73 | 74 | 75 | 81 | 82 | 83 | 84 | 87 | 88 | 89 | 90 | 91 | 92 | 99 | 101 | 107 | 108 | 109 | 110 | 112 | 113 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-macOS.xcodeproj/xcshareddata/xcschemes/All macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 66 | 67 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-macOS.xcodeproj/xcshareddata/xcschemes/VST2.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 47 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 65 | 66 | 67 | 68 | 69 | 70 | 76 | 79 | 80 | 81 | 83 | 84 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-macOS.xcodeproj/xcshareddata/xcschemes/VST3 (Distributed).xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 49 | 50 | 51 | 57 | 58 | 59 | 60 | 61 | 62 | 68 | 69 | 75 | 76 | 77 | 78 | 80 | 81 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-macOS.xcodeproj/xcshareddata/xcschemes/VST3 Controller Library.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-macOS.xcodeproj/xcshareddata/xcschemes/VST3.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 47 | 50 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 72 | 73 | 74 | 76 | 77 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-vst2.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | IPlug 7 | 8 | 9 | IPlug 10 | 11 | 12 | IPlug 13 | 14 | 15 | IPlug\VST2 16 | 17 | 18 | IGraphics 19 | 20 | 21 | IGraphics\Platform 22 | 23 | 24 | IPlug 25 | 26 | 27 | IPlug 28 | 29 | 30 | IGraphics\Drawing 31 | 32 | 33 | IGraphics\Drawing 34 | 35 | 36 | IGraphics\Drawing 37 | 38 | 39 | IGraphics\Drawing 40 | 41 | 42 | IGraphics\Drawing 43 | 44 | 45 | IGraphics\Drawing 46 | 47 | 48 | IGraphics 49 | 50 | 51 | IGraphics 52 | 53 | 54 | IGraphics\Controls 55 | 56 | 57 | IGraphics\Controls 58 | 59 | 60 | IGraphics\Controls 61 | 62 | 63 | IPlug 64 | 65 | 66 | 67 | 68 | 69 | 70 | IPlug 71 | 72 | 73 | IPlug 74 | 75 | 76 | IPlug 77 | 78 | 79 | IPlug 80 | 81 | 82 | IPlug 83 | 84 | 85 | IPlug 86 | 87 | 88 | IPlug 89 | 90 | 91 | IPlug 92 | 93 | 94 | IPlug 95 | 96 | 97 | IPlug 98 | 99 | 100 | resources 101 | 102 | 103 | IPlug 104 | 105 | 106 | IPlug 107 | 108 | 109 | IPlug\VST2 110 | 111 | 112 | IPlug\VST2 113 | 114 | 115 | IPlug\VST2 116 | 117 | 118 | IGraphics 119 | 120 | 121 | IGraphics 122 | 123 | 124 | IGraphics 125 | 126 | 127 | IGraphics 128 | 129 | 130 | IGraphics 131 | 132 | 133 | IGraphics 134 | 135 | 136 | IGraphics 137 | 138 | 139 | IGraphics 140 | 141 | 142 | IGraphics 143 | 144 | 145 | IGraphics 146 | 147 | 148 | IGraphics\Drawing 149 | 150 | 151 | IGraphics\Drawing 152 | 153 | 154 | IGraphics\Drawing 155 | 156 | 157 | IGraphics\Drawing 158 | 159 | 160 | IGraphics\Drawing 161 | 162 | 163 | IGraphics\Drawing 164 | 165 | 166 | IGraphics\Platform 167 | 168 | 169 | IGraphics\Platform 170 | 171 | 172 | IGraphics\Platform 173 | 174 | 175 | IGraphics\Platform 176 | 177 | 178 | IGraphics\Platform 179 | 180 | 181 | IPlug 182 | 183 | 184 | IGraphics 185 | 186 | 187 | IGraphics 188 | 189 | 190 | IGraphics\Controls 191 | 192 | 193 | IGraphics\Controls 194 | 195 | 196 | IGraphics\Controls 197 | 198 | 199 | IGraphics\Controls 200 | 201 | 202 | IGraphics\Controls 203 | 204 | 205 | IGraphics\Controls 206 | 207 | 208 | IGraphics\Controls 209 | 210 | 211 | IGraphics\Controls 212 | 213 | 214 | IPlug 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | {2425d7db-3821-4242-b5c9-db34bda176ce} 226 | 227 | 228 | {340070a8-76f3-47eb-9d5f-c13785b65579} 229 | 230 | 231 | {35a9e026-dde0-499a-9432-4ee1754ffba8} 232 | 233 | 234 | {4867b134-9c10-4435-b4ba-5b411e34340b} 235 | 236 | 237 | {f77209f4-83aa-47eb-9a44-59880a83c238} 238 | 239 | 240 | {2731d3da-3446-4ccb-83ff-8ae3793611b5} 241 | 242 | 243 | {fa39707d-4118-45f2-92fb-d407fa5d3288} 244 | 245 | 246 | {8c338368-7512-426b-af83-0f50719ca0bd} 247 | 248 | 249 | 250 | 251 | resources 252 | 253 | 254 | 255 | 256 | config 257 | 258 | 259 | config 260 | 261 | 262 | config 263 | 264 | 265 | config 266 | 267 | 268 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-vst2.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | $(VST2_32_HOST_PATH) 5 | $(VST2_32_COMMAND_ARGS) 6 | WindowsLocalDebugger 7 | 8 | 9 | $(VST2_32_HOST_PATH) 10 | WindowsLocalDebugger 11 | $(VST2_32_COMMAND_ARGS) 12 | 13 | 14 | $(VST2_32_HOST_PATH) 15 | WindowsLocalDebugger 16 | $(VST2_32_COMMAND_ARGS) 17 | 18 | 19 | $(VST2_64_HOST_PATH) 20 | $(VST2_64_COMMAND_ARGS) 21 | WindowsLocalDebugger 22 | 23 | 24 | $(VST2_64_HOST_PATH) 25 | WindowsLocalDebugger 26 | $(VST2_64_COMMAND_ARGS) 27 | 28 | 29 | $(VST2_64_HOST_PATH) 30 | WindowsLocalDebugger 31 | $(VST2_64_COMMAND_ARGS) 32 | 33 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-vst3.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | $(VST3_32_HOST_PATH) 5 | $(VST3_32_COMMAND_ARGS) 6 | WindowsLocalDebugger 7 | 8 | 9 | $(VST3_32_HOST_PATH) 10 | WindowsLocalDebugger 11 | $(VST3_32_COMMAND_ARGS) 12 | 13 | 14 | $(VST3_32_HOST_PATH) 15 | WindowsLocalDebugger 16 | $(VST3_32_COMMAND_ARGS) 17 | 18 | 19 | $(VST3_64_HOST_PATH) 20 | $(VST3_64_COMMAND_ARGS) 21 | WindowsLocalDebugger 22 | 23 | 24 | $(VST3_64_HOST_PATH) 25 | WindowsLocalDebugger 26 | $(VST3_64_COMMAND_ARGS) 27 | 28 | 29 | $(VST3_64_HOST_PATH) 30 | WindowsLocalDebugger 31 | $(VST3_64_COMMAND_ARGS) 32 | 33 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-wam-controller.mk: -------------------------------------------------------------------------------- 1 | include ./config/Flutterbird-web.mk 2 | 3 | TARGET = ./build-web/scripts/Flutterbird-web.js 4 | 5 | SRC += $(WEB_SRC) 6 | CFLAGS += $(WEB_CFLAGS) 7 | CFLAGS += $(EXTRA_CFLAGS) 8 | LDFLAGS += $(WEB_LDFLAGS) \ 9 | -s EXPORTED_FUNCTIONS=$(WEB_EXPORTS) 10 | 11 | $(TARGET): $(OBJECTS) 12 | $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(SRC) 13 | -------------------------------------------------------------------------------- /source/projects/Flutterbird-wam-processor.mk: -------------------------------------------------------------------------------- 1 | include ./config/Flutterbird-web.mk 2 | 3 | TARGET = ./build-web/scripts/Flutterbird-wam.js 4 | 5 | SRC += $(WAM_SRC) 6 | CFLAGS += $(WAM_CFLAGS) 7 | CFLAGS += $(EXTRA_CFLAGS) 8 | LDFLAGS += $(WAM_LDFLAGS) \ 9 | -s EXPORTED_FUNCTIONS=$(WAM_EXPORTS) 10 | 11 | $(TARGET): $(OBJECTS) 12 | $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(SRC) 13 | -------------------------------------------------------------------------------- /source/projects/FlutterbirdFramework.h: -------------------------------------------------------------------------------- 1 | @import UIKit; 2 | 3 | //! Project version number for FlutterbirdFramework. 4 | FOUNDATION_EXPORT double FlutterbirdFramework_VersionNumber; 5 | 6 | //! Project version string for FlutterbirdFramework. 7 | FOUNDATION_EXPORT const unsigned char FlutterbirdFramework_VersionString[]; 8 | 9 | #import 10 | #import 11 | 12 | @class FlutterbirdViewController; 13 | 14 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-AAX-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | Flutterbird 9 | CFBundleGetInfoString 10 | Flutterbird v1.0.0 Copyright 2017 Acme Inc 11 | CFBundleIdentifier 12 | com.Tesselode.aax.Flutterbird 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Flutterbird 17 | CFBundlePackageType 18 | TDMw 19 | CFBundleShortVersionString 20 | 1.0.0 21 | CFBundleSignature 22 | PTul 23 | CFBundleVersion 24 | 1.0.0 25 | CSResourcesFileMapped 26 | 27 | LSMinimumSystemVersion 28 | 10.11.0 29 | LSMultipleInstancesProhibited 30 | true 31 | LSPrefersCarbon 32 | 33 | NSAppleScriptEnabled 34 | No 35 | 36 | 37 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-AU-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AudioComponents 6 | 7 | 8 | description 9 | Flutterbird 10 | factoryFunction 11 | Flutterbird_Factory 12 | manufacturer 13 | Acme 14 | name 15 | Tesselode: Flutterbird 16 | sandboxSafe 17 | 18 | subtype 19 | Ipef 20 | type 21 | aumf 22 | version 23 | 65536 24 | 25 | 26 | AudioUnit Version 27 | 0x00010000 28 | CFBundleDevelopmentRegion 29 | English 30 | CFBundleExecutable 31 | Flutterbird 32 | CFBundleGetInfoString 33 | Flutterbird v1.0.0 Copyright 2017 Acme Inc 34 | CFBundleIdentifier 35 | com.Tesselode.audiounit.Flutterbird 36 | CFBundleInfoDictionaryVersion 37 | 6.0 38 | CFBundleName 39 | Flutterbird 40 | CFBundlePackageType 41 | BNDL 42 | CFBundleShortVersionString 43 | 1.0.0 44 | CFBundleSignature 45 | Ipef 46 | CFBundleVersion 47 | 1.0.0 48 | CSResourcesFileMapped 49 | 50 | LSMinimumSystemVersion 51 | 10.11.0 52 | NSPrincipalClass 53 | Flutterbird_View 54 | 55 | 56 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-VST2-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | Flutterbird 9 | CFBundleGetInfoString 10 | Flutterbird v1.0.0 Copyright 2017 Acme Inc 11 | CFBundleIdentifier 12 | com.Tesselode.vst.Flutterbird 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Flutterbird 17 | CFBundlePackageType 18 | BNDL 19 | CFBundleShortVersionString 20 | 1.0.0 21 | CFBundleSignature 22 | Ipef 23 | CFBundleVersion 24 | 1.0.0 25 | CSResourcesFileMapped 26 | 27 | LSMinimumSystemVersion 28 | 10.11.0 29 | 30 | 31 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-VST3-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | Flutterbird 9 | CFBundleGetInfoString 10 | Flutterbird v1.0.0 Copyright 2017 Acme Inc 11 | CFBundleIdentifier 12 | com.Tesselode.vst3.Flutterbird 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Flutterbird 17 | CFBundlePackageType 18 | BNDL 19 | CFBundleShortVersionString 20 | 1.0.0 21 | CFBundleSignature 22 | Ipef 23 | CFBundleVersion 24 | 1.0.0 25 | CSResourcesFileMapped 26 | 27 | LSMinimumSystemVersion 28 | 10.11.0 29 | 30 | 31 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-iOS-AUv3-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | FlutterbirdAppExtension 9 | CFBundleExecutable 10 | FlutterbirdAppExtension 11 | CFBundleIdentifier 12 | com.Tesselode.app.Flutterbird.AUv3 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | FlutterbirdAppExtension 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 1.0.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0.0 25 | NSExtension 26 | 27 | NSExtensionAttributes 28 | 29 | AudioComponents 30 | 31 | 32 | description 33 | Flutterbird 34 | factoryFunction 35 | FlutterbirdViewController 36 | manufacturer 37 | Acme 38 | name 39 | Tesselode: Flutterbird 40 | sandboxSafe 41 | 42 | subtype 43 | Ipef 44 | tags 45 | 46 | Effects 47 | 48 | type 49 | aumf 50 | version 51 | 65536 52 | 53 | 54 | 55 | NSExtensionMainStoryboard 56 | Flutterbird-iOS-MainInterface 57 | NSExtensionPointIdentifier 58 | com.apple.AudioUnit-UI 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-iOS-Framework-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | FlutterbirdFramework 9 | CFBundleIdentifier 10 | com.Tesselode.FlutterbirdApp.Framework 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | FlutterbirdFramework 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0.0 23 | 24 | 25 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-iOS-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | Flutterbird 9 | CFBundleIcons 10 | 11 | 12 | CFBundleIcons~ipad 13 | 14 | 15 | CFBundleIdentifier 16 | com.Tesselode.app.Flutterbird 17 | CFBundleInfoDictionaryVersion 18 | 6.0 19 | CFBundleName 20 | Flutterbird 21 | CFBundlePackageType 22 | APPL 23 | CFBundleShortVersionString 24 | 1.0.0 25 | CFBundleSignature 26 | ???? 27 | CFBundleVersion 28 | 1.0.0 29 | LSApplicationCategoryType 30 | public.app-category.music 31 | LSRequiresIPhoneOS 32 | 33 | UILaunchStoryboardName 34 | Flutterbird-iOS-launchScreen 35 | UIMainStoryboardFile 36 | Flutterbird-iOS 37 | UIMainStoryboardFile~ipad 38 | Flutterbird-iOS 39 | UIRequiredDeviceCapabilities 40 | 41 | armv7 42 | 43 | UIRequiresFullScreen 44 | 45 | UISupportedInterfaceOrientations 46 | 47 | UIInterfaceOrientationPortrait 48 | UIInterfaceOrientationLandscapeLeft 49 | UIInterfaceOrientationLandscapeRight 50 | 51 | UISupportedInterfaceOrientations~ipad 52 | 53 | UIInterfaceOrientationPortrait 54 | UIInterfaceOrientationPortraitUpsideDown 55 | UIInterfaceOrientationLandscapeLeft 56 | UIInterfaceOrientationLandscapeRight 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-iOS-MainInterface.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-iOS-launchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-iOS.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-macOS-AUv3-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | Flutterbird 9 | CFBundleGetInfoString 10 | Flutterbird v1.0.0 Copyright 2017 Acme Inc 11 | CFBundleIdentifier 12 | com.Tesselode.app.Flutterbird.AUv3 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Flutterbird 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 1.0.0 21 | CFBundleVersion 22 | 1.0.0 23 | LSMinimumSystemVersion 24 | 10.12.0 25 | NSExtension 26 | 27 | NSExtensionAttributes 28 | 29 | AudioComponents 30 | 31 | 32 | description 33 | Flutterbird 34 | manufacturer 35 | Acme 36 | name 37 | Tesselode: Flutterbird 38 | sandboxSafe 39 | 40 | subtype 41 | Ipef 42 | tags 43 | 44 | Effects 45 | 46 | type 47 | aumf 48 | version 49 | 65536 50 | 51 | 52 | 53 | NSExtensionPointIdentifier 54 | com.apple.AudioUnit-UI 55 | NSExtensionPrincipalClass 56 | IPlugViewController 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-macOS-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | Flutterbird 9 | CFBundleGetInfoString 10 | Flutterbird v1.0.0 Copyright 2017 Acme Inc 11 | CFBundleIconFile 12 | Flutterbird.icns 13 | CFBundleIdentifier 14 | com.Tesselode.app.Flutterbird 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | Flutterbird 19 | CFBundlePackageType 20 | BNDL 21 | CFBundleShortVersionString 22 | 1.0.0 23 | CFBundleSignature 24 | Ipef 25 | CFBundleVersion 26 | 1.0.0 27 | CSResourcesFileMapped 28 | 29 | LSApplicationCategoryType 30 | public.app-category.music 31 | LSMinimumSystemVersion 32 | 10.11.0 33 | NSMainNibFile 34 | Flutterbird-macOS-MainMenu 35 | NSPrincipalClass 36 | SWELLApplication 37 | 38 | 39 | -------------------------------------------------------------------------------- /source/resources/Flutterbird-macOS-MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /source/resources/Flutterbird.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tesselode/flutterbird/e1e0e3cfa565b232f48ece84aed35a0eda222f64/source/resources/Flutterbird.icns -------------------------------------------------------------------------------- /source/resources/Flutterbird.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tesselode/flutterbird/e1e0e3cfa565b232f48ece84aed35a0eda222f64/source/resources/Flutterbird.ico -------------------------------------------------------------------------------- /source/resources/FlutterbirdAppViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import AudioToolbox 3 | import FlutterbirdFramework 4 | 5 | // thanks audiokit 6 | public func fourCC(_ string: String) -> UInt32 { 7 | let utf8 = string.utf8 8 | precondition(utf8.count == 4, "Must be a 4 char string") 9 | var out: UInt32 = 0 10 | for char in utf8 { 11 | out <<= 8 12 | out |= UInt32(char) 13 | } 14 | return out 15 | } 16 | 17 | class FlutterbirdAppViewController: UIViewController { 18 | @IBOutlet weak var playButton: UIButton! 19 | @IBOutlet weak var auContainerView: UIView! 20 | 21 | var playEngine: SimplePlayEngine! 22 | var mAudioUnitViewController: FlutterbirdViewController! 23 | 24 | override func viewDidLoad() { 25 | super.viewDidLoad() 26 | 27 | embedPlugInView() 28 | 29 | playEngine = SimplePlayEngine(componentType: kAudioUnitType_MusicDevice) 30 | 31 | var desc = AudioComponentDescription() 32 | desc.componentType = kAudioUnitType_MusicDevice 33 | desc.componentSubType = fourCC("Ipef") //TODO: hardcoded! 34 | desc.componentManufacturer = fourCC("Acme") //TODO: hardcoded! 35 | desc.componentFlags = 0 36 | desc.componentFlagsMask = 0 37 | 38 | AUAudioUnit.registerSubclass(IPlugAUAudioUnit.self, as: desc, name:"iPlug: Local Flutterbird", version: UInt32.max) 39 | 40 | playEngine.selectAudioUnitWithComponentDescription(desc) { 41 | self.mAudioUnitViewController.audioUnit = self.playEngine.testAudioUnit as? IPlugAUAudioUnit 42 | } 43 | } 44 | 45 | func embedPlugInView() { 46 | let builtInPlugInsURL = Bundle.main.builtInPlugInsURL! 47 | let pluginURL = builtInPlugInsURL.appendingPathComponent("FlutterbirdAppExtension.appex") 48 | let appExtensionBundle = Bundle(url: pluginURL) 49 | 50 | let storyboard = UIStoryboard(name: "Flutterbird-iOS-MainInterface", bundle: appExtensionBundle) 51 | mAudioUnitViewController = storyboard.instantiateInitialViewController() as? FlutterbirdViewController 52 | 53 | if let view = mAudioUnitViewController.view { 54 | addChild(mAudioUnitViewController) 55 | view.frame = auContainerView.bounds 56 | 57 | auContainerView.addSubview(view) 58 | mAudioUnitViewController.didMove(toParent: self) 59 | } 60 | } 61 | 62 | @IBAction func togglePlay(_ sender: AnyObject?) { 63 | let isPlaying = playEngine.togglePlay() 64 | let titleText = isPlaying ? "Stop" : "Play" 65 | playButton.setTitle(titleText, for: UIControl.State()) 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /source/resources/FlutterbirdViewController+AUAudioUnitFactory.swift: -------------------------------------------------------------------------------- 1 | import CoreAudioKit 2 | import FlutterbirdFramework 3 | 4 | extension FlutterbirdViewController: AUAudioUnitFactory { 5 | 6 | public override func beginRequest(with context: NSExtensionContext) { } 7 | 8 | public func createAudioUnit(with componentDescription: AudioComponentDescription) throws -> AUAudioUnit { 9 | audioUnit = try IPlugAUAudioUnit(componentDescription: componentDescription, options: []) 10 | return audioUnit! 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /source/resources/FlutterbirdViewController.swift: -------------------------------------------------------------------------------- 1 | /* 2 | This is the initial ios app extension view controller, which is referenced by Flutterbird-iOS-MainInterface storyboard 3 | */ 4 | 5 | import UIKit 6 | import CoreAudioKit 7 | 8 | public class FlutterbirdViewController: AUViewController { 9 | 10 | public var audioUnit: IPlugAUAudioUnit? { 11 | // this variable gets set when loading in process in stand-alone app, i.e. not when loaded by a host 12 | didSet { 13 | DispatchQueue.main.async { 14 | if self.isViewLoaded { 15 | self.connectViewWithAU() 16 | } 17 | } 18 | } 19 | } 20 | 21 | // this is where it happens when auv3 is loaded by a host 22 | override public func viewDidLoad() { 23 | super.viewDidLoad() 24 | guard audioUnit != nil else { return } 25 | connectViewWithAU() 26 | } 27 | 28 | override public func didReceiveMemoryWarning() { 29 | super.didReceiveMemoryWarning() 30 | } 31 | 32 | func connectViewWithAU() { 33 | // To use the generic UI (swift), change the view in Flutterbird-iOS-MainInterface.storyboard to custom class: GenericUI module: FlutterbirdFramework 34 | if let view = self.view as? GenericUI { 35 | view.createGenericUI(audioUnit!) 36 | } 37 | } 38 | 39 | override public func viewDidLayoutSubviews() 40 | { 41 | audioUnit?.resize(self.view.bounds) 42 | } 43 | 44 | override public func viewWillAppear(_ animated: Bool) { 45 | audioUnit?.openWindow(self.view) 46 | } 47 | 48 | override public func viewWillDisappear(_ animated: Bool) { 49 | audioUnit?.closeWindow() 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /source/resources/IPlugViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /source/resources/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /source/resources/Images.xcassets/FlutterbirdiOSAppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "size" : "76x76", 75 | "idiom" : "ipad", 76 | "filename" : "Flutterbird@1x.png", 77 | "scale" : "1x" 78 | }, 79 | { 80 | "size" : "76x76", 81 | "idiom" : "ipad", 82 | "filename" : "Flutterbird@2x.png", 83 | "scale" : "2x" 84 | }, 85 | { 86 | "size" : "83.5x83.5", 87 | "idiom" : "ipad", 88 | "filename" : "Flutterbird@2xPro.png", 89 | "scale" : "2x" 90 | }, 91 | { 92 | "idiom" : "ios-marketing", 93 | "size" : "1024x1024", 94 | "scale" : "1x" 95 | } 96 | ], 97 | "info" : { 98 | "version" : 1, 99 | "author" : "xcode" 100 | } 101 | } -------------------------------------------------------------------------------- /source/resources/Images.xcassets/FlutterbirdiOSAppIcon.appiconset/Flutterbird@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tesselode/flutterbird/e1e0e3cfa565b232f48ece84aed35a0eda222f64/source/resources/Images.xcassets/FlutterbirdiOSAppIcon.appiconset/Flutterbird@1x.png -------------------------------------------------------------------------------- /source/resources/Images.xcassets/FlutterbirdiOSAppIcon.appiconset/Flutterbird@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tesselode/flutterbird/e1e0e3cfa565b232f48ece84aed35a0eda222f64/source/resources/Images.xcassets/FlutterbirdiOSAppIcon.appiconset/Flutterbird@2x.png -------------------------------------------------------------------------------- /source/resources/Images.xcassets/FlutterbirdiOSAppIcon.appiconset/Flutterbird@2xPro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tesselode/flutterbird/e1e0e3cfa565b232f48ece84aed35a0eda222f64/source/resources/Images.xcassets/FlutterbirdiOSAppIcon.appiconset/Flutterbird@2xPro.png -------------------------------------------------------------------------------- /source/resources/fonts/Caveat-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tesselode/flutterbird/e1e0e3cfa565b232f48ece84aed35a0eda222f64/source/resources/fonts/Caveat-Bold.ttf -------------------------------------------------------------------------------- /source/resources/fonts/CourierPrimeSans-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tesselode/flutterbird/e1e0e3cfa565b232f48ece84aed35a0eda222f64/source/resources/fonts/CourierPrimeSans-Italic.ttf -------------------------------------------------------------------------------- /source/resources/img/toggle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 40 | 45 | 46 | 48 | 49 | 51 | image/svg+xml 52 | 54 | 55 | 56 | 57 | 58 | 63 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /source/resources/img/waveforms.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 40 | 45 | 46 | 48 | 49 | 51 | image/svg+xml 52 | 54 | 55 | 56 | 57 | 58 | 63 | 68 | 73 | 78 | 83 | 88 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /source/resources/main.aps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tesselode/flutterbird/e1e0e3cfa565b232f48ece84aed35a0eda222f64/source/resources/main.aps -------------------------------------------------------------------------------- /source/resources/main.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #include "resource.h" 4 | 5 | #define APSTUDIO_READONLY_SYMBOLS 6 | ///////////////////////////////////////////////////////////////////////////// 7 | // 8 | // Generated from the TEXTINCLUDE 2 resource. 9 | // 10 | #include "winres.h" 11 | 12 | ///////////////////////////////////////////////////////////////////////////// 13 | #undef APSTUDIO_READONLY_SYMBOLS 14 | 15 | ///////////////////////////////////////////////////////////////////////////// 16 | // English (United Kingdom) resources 17 | 18 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) 19 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK 20 | #pragma code_page(1252) 21 | 22 | ///////////////////////////////////////////////////////////////////////////// 23 | // 24 | // Dialog 25 | // 26 | 27 | IDD_DIALOG_PREF DIALOG 0, 0, 223, 309 28 | STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 29 | CAPTION "Preferences" 30 | FONT 8, "MS Sans Serif" 31 | BEGIN 32 | DEFPUSHBUTTON "OK",IDOK,110,285,50,14 33 | PUSHBUTTON "Apply",IDAPPLY,54,285,50,14 34 | PUSHBUTTON "Cancel",IDCANCEL,166,285,50,14 35 | COMBOBOX IDC_COMBO_AUDIO_DRIVER,20,35,100,100,CBS_DROPDOWNLIST | CBS_HASSTRINGS 36 | LTEXT "Driver Type",IDC_STATIC,22,25,38,8 37 | COMBOBOX IDC_COMBO_AUDIO_IN_DEV,20,65,100,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 38 | LTEXT "Input Device",IDC_STATIC,20,55,42,8 39 | COMBOBOX IDC_COMBO_AUDIO_OUT_DEV,20,95,100,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 40 | LTEXT "Output Device",IDC_STATIC,20,85,47,8 41 | COMBOBOX IDC_COMBO_AUDIO_BUF_SIZE,135,35,65,100,CBS_DROPDOWNLIST | CBS_HASSTRINGS 42 | LTEXT "Buffer Size",IDC_STATIC,137,25,46,8 43 | COMBOBOX IDC_COMBO_AUDIO_SR,135,95,65,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 44 | LTEXT "Sampling Rate",IDC_STATIC,135,85,47,8 45 | GROUPBOX "Audio Device Settings",IDC_STATIC,5,10,210,170 46 | PUSHBUTTON "Config...",IDC_BUTTON_OS_DEV_SETTINGS,135,155,65,14 47 | COMBOBOX IDC_COMBO_AUDIO_IN_L,20,125,40,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 48 | LTEXT "Input 1 (L)",IDC_STATIC,20,115,33,8 49 | COMBOBOX IDC_COMBO_AUDIO_IN_R,65,126,40,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 50 | LTEXT "Input 2 (R)",IDC_STATIC,65,115,34,8 51 | COMBOBOX IDC_COMBO_AUDIO_OUT_L,20,155,40,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 52 | LTEXT "Output 1 (L)",IDC_STATIC,20,145,38,8 53 | COMBOBOX IDC_COMBO_AUDIO_OUT_R,65,155,40,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 54 | LTEXT "Output 2 (R)",IDC_STATIC,65,145,40,8 55 | GROUPBOX "MIDI Device Settings",IDC_STATIC,5,190,210,85 56 | COMBOBOX IDC_COMBO_MIDI_OUT_DEV,15,250,100,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 57 | LTEXT "Output Device",IDC_STATIC,15,240,47,8 58 | COMBOBOX IDC_COMBO_MIDI_IN_DEV,15,220,100,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 59 | LTEXT "Input Device",IDC_STATIC,15,210,42,8 60 | LTEXT "Input Channel",IDC_STATIC,125,210,45,8 61 | COMBOBOX IDC_COMBO_MIDI_IN_CHAN,125,220,50,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 62 | LTEXT "Output Channel",IDC_STATIC,125,240,50,8 63 | COMBOBOX IDC_COMBO_MIDI_OUT_CHAN,125,250,50,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 64 | END 65 | 66 | IDD_DIALOG_MAIN DIALOG 0, 0, 300, 300 67 | STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU 68 | CAPTION "Flutterbird" 69 | MENU IDR_MENU1 70 | FONT 8, "MS Sans Serif" 71 | BEGIN 72 | END 73 | 74 | 75 | ///////////////////////////////////////////////////////////////////////////// 76 | // 77 | // Menu 78 | // 79 | 80 | IDR_MENU1 MENU 81 | BEGIN 82 | POPUP "&File" 83 | BEGIN 84 | MENUITEM "&Preferences...\tCtrl+,", ID_PREFERENCES 85 | MENUITEM "&Quit", ID_QUIT 86 | END 87 | POPUP "&Debug" 88 | BEGIN 89 | MENUITEM "&Live Edit Mode\tCtrl+E", ID_LIVE_EDIT 90 | MENUITEM "&Show Control Bounds\tCtrl+B", ID_SHOW_BOUNDS 91 | MENUITEM "&Show Drawn Area\tCtrl+D", ID_SHOW_DRAWN 92 | MENUITEM "&Show FPS\tCtrl+F", ID_SHOW_FPS 93 | END 94 | POPUP "&Help" 95 | BEGIN 96 | MENUITEM "&About", ID_ABOUT 97 | MENUITEM "&Read Manual", ID_HELP 98 | END 99 | END 100 | 101 | 102 | ///////////////////////////////////////////////////////////////////////////// 103 | // 104 | // DESIGNINFO 105 | // 106 | 107 | #ifdef APSTUDIO_INVOKED 108 | GUIDELINES DESIGNINFO 109 | BEGIN 110 | IDD_DIALOG_PREF, DIALOG 111 | BEGIN 112 | END 113 | 114 | IDD_DIALOG_MAIN, DIALOG 115 | BEGIN 116 | END 117 | END 118 | #endif // APSTUDIO_INVOKED 119 | 120 | 121 | ///////////////////////////////////////////////////////////////////////////// 122 | // 123 | // AFX_DIALOG_LAYOUT 124 | // 125 | 126 | IDD_DIALOG1 AFX_DIALOG_LAYOUT 127 | BEGIN 128 | 0 129 | END 130 | 131 | 132 | #ifdef APSTUDIO_INVOKED 133 | ///////////////////////////////////////////////////////////////////////////// 134 | // 135 | // TEXTINCLUDE 136 | // 137 | 138 | 1 TEXTINCLUDE 139 | BEGIN 140 | "resource.h\0" 141 | END 142 | 143 | 2 TEXTINCLUDE 144 | BEGIN 145 | "#include ""winres.h""\r\n" 146 | "\0" 147 | END 148 | 149 | 3 TEXTINCLUDE 150 | BEGIN 151 | "#include ""..\\config.h""\r\n" 152 | "HANDWRITING_FONT_FN TTF HANDWRITING_FONT_FN\r\n" 153 | "MONOSPACE_FONT_FN TTF MONOSPACE_FONT_FN\r\n" 154 | "TOGGLE_SVG_FN SVG TOGGLE_SVG_FN\r\n" 155 | "WAVEFORMS_SVG_FN SVG WAVEFORMS_SVG_FN\0" 156 | END 157 | 158 | #endif // APSTUDIO_INVOKED 159 | 160 | 161 | ///////////////////////////////////////////////////////////////////////////// 162 | // 163 | // Icon 164 | // 165 | 166 | // Icon with lowest ID value placed first to ensure application icon 167 | // remains consistent on all systems. 168 | IDI_ICON1 ICON "Flutterbird.ico" 169 | 170 | #endif // English (United Kingdom) resources 171 | ///////////////////////////////////////////////////////////////////////////// 172 | 173 | 174 | 175 | #ifndef APSTUDIO_INVOKED 176 | ///////////////////////////////////////////////////////////////////////////// 177 | // 178 | // Generated from the TEXTINCLUDE 3 resource. 179 | // 180 | #include "..\config.h" 181 | HANDWRITING_FONT_FN TTF HANDWRITING_FONT_FN 182 | MONOSPACE_FONT_FN TTF MONOSPACE_FONT_FN 183 | TOGGLE_SVG_FN SVG TOGGLE_SVG_FN 184 | WAVEFORMS_SVG_FN SVG WAVEFORMS_SVG_FN 185 | ///////////////////////////////////////////////////////////////////////////// 186 | #endif // not APSTUDIO_INVOKED 187 | -------------------------------------------------------------------------------- /source/resources/main.rc_mac_dlg: -------------------------------------------------------------------------------- 1 | #ifndef SWELL_DLG_SCALE_AUTOGEN 2 | #ifdef __APPLE__ 3 | #define SWELL_DLG_SCALE_AUTOGEN 1.7 4 | #else 5 | #define SWELL_DLG_SCALE_AUTOGEN 1.8 6 | #endif 7 | #endif 8 | #ifndef SWELL_DLG_FLAGS_AUTOGEN 9 | #define SWELL_DLG_FLAGS_AUTOGEN SWELL_DLG_WS_FLIPPED|SWELL_DLG_WS_NOAUTOSIZE 10 | #endif 11 | 12 | #ifndef SET_IDD_DIALOG_PREF_SCALE 13 | #define SET_IDD_DIALOG_PREF_SCALE SWELL_DLG_SCALE_AUTOGEN 14 | #endif 15 | #ifndef SET_IDD_DIALOG_PREF_STYLE 16 | #define SET_IDD_DIALOG_PREF_STYLE SWELL_DLG_FLAGS_AUTOGEN 17 | #endif 18 | SWELL_DEFINE_DIALOG_RESOURCE_BEGIN(IDD_DIALOG_PREF,SET_IDD_DIALOG_PREF_STYLE,"Preferences",223,309,SET_IDD_DIALOG_PREF_SCALE) 19 | BEGIN 20 | DEFPUSHBUTTON "OK",IDOK,110,285,50,14 21 | PUSHBUTTON "Apply",IDAPPLY,54,285,50,14 22 | PUSHBUTTON "Cancel",IDCANCEL,166,285,50,14 23 | COMBOBOX IDC_COMBO_AUDIO_DRIVER,20,35,100,100,CBS_DROPDOWNLIST | CBS_HASSTRINGS 24 | LTEXT "Driver Type",IDC_STATIC,22,25,38,8 25 | COMBOBOX IDC_COMBO_AUDIO_IN_DEV,20,65,100,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 26 | LTEXT "Input Device",IDC_STATIC,20,55,42,8 27 | COMBOBOX IDC_COMBO_AUDIO_OUT_DEV,20,95,100,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 28 | LTEXT "Output Device",IDC_STATIC,20,85,47,8 29 | COMBOBOX IDC_COMBO_AUDIO_BUF_SIZE,135,35,65,100,CBS_DROPDOWNLIST | CBS_HASSTRINGS 30 | LTEXT "Buffer Size",IDC_STATIC,137,25,46,8 31 | COMBOBOX IDC_COMBO_AUDIO_SR,135,95,65,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 32 | LTEXT "Sampling Rate",IDC_STATIC,135,85,47,8 33 | GROUPBOX "Audio Device Settings",IDC_STATIC,5,10,210,170 34 | PUSHBUTTON "Config...",IDC_BUTTON_OS_DEV_SETTINGS,135,155,65,14 35 | COMBOBOX IDC_COMBO_AUDIO_IN_L,20,125,40,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 36 | LTEXT "Input 1 (L)",IDC_STATIC,20,115,33,8 37 | COMBOBOX IDC_COMBO_AUDIO_IN_R,65,126,40,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 38 | LTEXT "Input 2 (R)",IDC_STATIC,65,115,34,8 39 | COMBOBOX IDC_COMBO_AUDIO_OUT_L,20,155,40,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 40 | LTEXT "Output 1 (L)",IDC_STATIC,20,145,38,8 41 | COMBOBOX IDC_COMBO_AUDIO_OUT_R,65,155,40,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 42 | LTEXT "Output 2 (R)",IDC_STATIC,65,145,40,8 43 | GROUPBOX "MIDI Device Settings",IDC_STATIC,5,190,210,85 44 | COMBOBOX IDC_COMBO_MIDI_OUT_DEV,15,250,100,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 45 | LTEXT "Output Device",IDC_STATIC,15,240,47,8 46 | COMBOBOX IDC_COMBO_MIDI_IN_DEV,15,220,100,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 47 | LTEXT "Input Device",IDC_STATIC,15,210,42,8 48 | LTEXT "Input Channel",IDC_STATIC,125,210,45,8 49 | COMBOBOX IDC_COMBO_MIDI_IN_CHAN,125,220,50,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 50 | LTEXT "Output Channel",IDC_STATIC,125,240,50,8 51 | COMBOBOX IDC_COMBO_MIDI_OUT_CHAN,125,250,50,200,CBS_DROPDOWNLIST | CBS_HASSTRINGS 52 | END 53 | SWELL_DEFINE_DIALOG_RESOURCE_END(IDD_DIALOG_PREF) 54 | 55 | 56 | #ifndef SET_IDD_DIALOG_MAIN_SCALE 57 | #define SET_IDD_DIALOG_MAIN_SCALE SWELL_DLG_SCALE_AUTOGEN 58 | #endif 59 | #ifndef SET_IDD_DIALOG_MAIN_STYLE 60 | #define SET_IDD_DIALOG_MAIN_STYLE SWELL_DLG_FLAGS_AUTOGEN|SWELL_DLG_WS_OPAQUE 61 | #endif 62 | SWELL_DEFINE_DIALOG_RESOURCE_BEGIN(IDD_DIALOG_MAIN,SET_IDD_DIALOG_MAIN_STYLE,"Flutterbird",300,300,SET_IDD_DIALOG_MAIN_SCALE) 63 | BEGIN 64 | END 65 | SWELL_DEFINE_DIALOG_RESOURCE_END(IDD_DIALOG_MAIN) 66 | 67 | 68 | 69 | //EOF 70 | 71 | -------------------------------------------------------------------------------- /source/resources/main.rc_mac_menu: -------------------------------------------------------------------------------- 1 | SWELL_DEFINE_MENU_RESOURCE_BEGIN(IDR_MENU1) 2 | POPUP "&File" 3 | BEGIN 4 | MENUITEM "&Preferences...\tCtrl+,", ID_PREFERENCES 5 | MENUITEM "&Quit", ID_QUIT 6 | END 7 | POPUP "&Debug" 8 | BEGIN 9 | MENUITEM "&Live Edit Mode\tCtrl+E", ID_LIVE_EDIT 10 | MENUITEM "&Show Control Bounds\tCtrl+B", ID_SHOW_BOUNDS 11 | MENUITEM "&Show Drawn Area\tCtrl+D", ID_SHOW_DRAWN 12 | MENUITEM "&Show FPS\tCtrl+F", ID_SHOW_FPS 13 | END 14 | POPUP "&Help" 15 | BEGIN 16 | MENUITEM "&About", ID_ABOUT 17 | MENUITEM "&Read Manual", ID_HELP 18 | END 19 | SWELL_DEFINE_MENU_RESOURCE_END(IDR_MENU1) 20 | 21 | 22 | 23 | //EOF 24 | 25 | -------------------------------------------------------------------------------- /source/resources/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by main.rc 4 | 5 | #define IDR_ACCELERATOR1 40000 6 | #define IDD_DIALOG_MAIN 40001 7 | #define IDD_DIALOG_PREF 40002 8 | #define IDI_ICON1 40003 9 | #define IDR_MENU1 40004 10 | #define ID_ABOUT 40005 11 | #define ID_PREFERENCES 40006 12 | #define ID_QUIT 40007 13 | #define ID_HELP 40008 14 | #define IDC_COMBO_AUDIO_DRIVER 40009 15 | #define IDC_COMBO_AUDIO_IN_DEV 40010 16 | #define IDC_COMBO_AUDIO_OUT_DEV 40011 17 | #define IDC_COMBO_AUDIO_BUF_SIZE 40012 18 | #define IDC_COMBO_AUDIO_SR 40013 19 | #define IDC_COMBO_AUDIO_IN_L 40014 20 | #define IDC_COMBO_AUDIO_IN_R 40015 21 | #define IDC_COMBO_AUDIO_OUT_R 40016 22 | #define IDC_COMBO_AUDIO_OUT_L 40017 23 | #define IDC_COMBO_MIDI_IN_DEV 40018 24 | #define IDC_COMBO_MIDI_OUT_DEV 40019 25 | #define IDC_COMBO_MIDI_IN_CHAN 40020 26 | #define IDC_COMBO_MIDI_OUT_CHAN 40021 27 | #define IDC_BUTTON_OS_DEV_SETTINGS 40022 28 | #define IDC_CB_MONO_INPUT 40023 29 | #define IDAPPLY 40024 30 | #define ID_LIVE_EDIT 40025 31 | #define ID_SHOW_DRAWN 40026 32 | #define ID_SHOW_FPS 40027 33 | #define ID_SHOW_BOUNDS 40028 34 | 35 | // Next default values for new objects 36 | // 37 | #ifdef APSTUDIO_INVOKED 38 | #ifndef APSTUDIO_READONLY_SYMBOLS 39 | #define _APS_NEXT_RESOURCE_VALUE 105 40 | #define _APS_NEXT_COMMAND_VALUE 40001 41 | #define _APS_NEXT_CONTROL_VALUE 1011 42 | #define _APS_NEXT_SYMED_VALUE 101 43 | #endif 44 | #endif 45 | -------------------------------------------------------------------------------- /source/scripts/clear_audiounit_caches.command: -------------------------------------------------------------------------------- 1 | echo CLEAR AU CACHE SCRIPT 2 | if [ -f "$HOME/Library/Application Support/AU Lab/com.apple.audio.aulab_componentcache.plist" ] 3 | then 4 | echo deleting "$HOME/Library/Application Support/AU Lab/com.apple.audio.aulab_componentcache.plist" 5 | rm "$HOME/Library/Application Support/AU Lab/com.apple.audio.aulab_componentcache.plist" 6 | fi 7 | 8 | if [ -f "$HOME/Library/Caches/AudioUnitCache/com.apple.audiounits.cache" ] 9 | then 10 | echo deleting "$HOME/Library/Caches/AudioUnitCache/com.apple.audiounits.cache" 11 | rm "$HOME/Library/Caches/AudioUnitCache/com.apple.audiounits.cache" 12 | fi 13 | 14 | if [ -f "$HOME/Library/Caches/AudioUnitCache/com.apple.audiounits.sandboxed.cache" ] 15 | then 16 | echo deleting "$HOME/Library/Caches/AudioUnitCache/com.apple.audiounits.sandboxed.cache" 17 | rm "$HOME/Library/Caches/AudioUnitCache/com.apple.audiounits.sandboxed.cache" 18 | fi 19 | -------------------------------------------------------------------------------- /source/scripts/make_zip.py: -------------------------------------------------------------------------------- 1 | import zipfile, os, fileinput, string, sys 2 | 3 | scriptpath = os.path.dirname(os.path.realpath(__file__)) 4 | projectpath = os.path.abspath(os.path.join(scriptpath, os.pardir)) 5 | 6 | MajorStr = "" 7 | MinorStr = "" 8 | BugfixStr = "" 9 | BUNDLE_NAME = "" 10 | 11 | def main(): 12 | if len(sys.argv) != 2: 13 | print("Usage: make_zip.py demo(0 or 1)") 14 | sys.exit(1) 15 | else: 16 | demo=int(sys.argv[1]) 17 | 18 | installer = "\installer\Flutterbird Installer.exe" 19 | 20 | if demo: 21 | installer = "\installer\Flutterbird Demo Installer.exe" 22 | 23 | FILES_TO_ZIP = [ 24 | projectpath + installer, 25 | projectpath + "\installer\changelog.txt", 26 | projectpath + "\installer\known-issues.txt", 27 | projectpath + "\manual\Flutterbird manual.pdf" 28 | ] 29 | 30 | # extract values from config.h 31 | for line in fileinput.input(projectpath + "\config.h",inplace=0): 32 | if "#define PLUG_VERSION_HEX " in line: 33 | PLUG_VER_STR = string.lstrip(line, "#define PLUG_VERSION_HEX ") 34 | PLUG_VER = int(PLUG_VER_STR, 16) 35 | MAJOR = PLUG_VER & 0xFFFF0000 36 | MAJORSTR = str(MAJOR >> 16) 37 | MINOR = PLUG_VER & 0x0000FF00 38 | MINORSTR = str(MINOR >> 8) 39 | BUGFIXSTR = str(PLUG_VER & 0x000000FF) 40 | 41 | if "#define BUNDLE_NAME " in line: 42 | BUNDLE_NAME = string.lstrip(line, "#define BUNDLE_NAME ") 43 | 44 | FULLVERSIONSTR = MAJORSTR + "." + MINORSTR + "." + BUGFIXSTR 45 | 46 | ZIPNAME = "Flutterbird-v" + FULLVERSIONSTR + "-win.zip" 47 | 48 | if demo: 49 | ZIPNAME = "Flutterbird-v" + FULLVERSIONSTR + "-win-demo.zip" 50 | 51 | zf = zipfile.ZipFile(projectpath + "\installer\/" + ZIPNAME, mode="w") 52 | 53 | for f in FILES_TO_ZIP: 54 | print("adding " + f) 55 | zf.write(f, os.path.basename(f)); 56 | 57 | zf.close() 58 | print("wrote ") 59 | 60 | if __name__ == '__main__': 61 | main() -------------------------------------------------------------------------------- /source/scripts/makedist-mac.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | BASEDIR=$(dirname $0) 4 | 5 | cd $BASEDIR/.. 6 | 7 | if [ -d build-mac ] 8 | then 9 | sudo rm -f -R -f build-mac 10 | fi 11 | 12 | #--------------------------------------------------------------------------------------------------------- 13 | 14 | #variables 15 | 16 | DEMO=0 17 | if [ "$1" == "demo" ] 18 | then 19 | DEMO=1 20 | fi 21 | 22 | VERSION=`echo | grep PLUG_VERSION_HEX config.h` 23 | VERSION=${VERSION//\#define PLUG_VERSION_HEX } 24 | VERSION=${VERSION//\'} 25 | MAJOR_VERSION=$(($VERSION & 0xFFFF0000)) 26 | MAJOR_VERSION=$(($MAJOR_VERSION >> 16)) 27 | MINOR_VERSION=$(($VERSION & 0x0000FF00)) 28 | MINOR_VERSION=$(($MINOR_VERSION >> 8)) 29 | BUG_FIX=$(($VERSION & 0x000000FF)) 30 | 31 | FULL_VERSION=$MAJOR_VERSION"."$MINOR_VERSION"."$BUG_FIX 32 | 33 | PLUGIN_NAME=`echo | grep BUNDLE_NAME config.h` 34 | PLUGIN_NAME=${PLUGIN_NAME//\#define BUNDLE_NAME } 35 | PLUGIN_NAME=${PLUGIN_NAME//\"} 36 | 37 | DMG_NAME=$PLUGIN_NAME-v$FULL_VERSION-mac 38 | 39 | if [ $DEMO == 1 ] 40 | then 41 | DMG_NAME=$DMG_NAME-demo 42 | fi 43 | 44 | 45 | # work out the paths to the binaries 46 | 47 | VST2=`echo | grep VST2_PATH ../../common-mac.xcconfig` 48 | VST2=${VST2//\VST2_PATH = }/$PLUGIN_NAME.vst 49 | 50 | VST3=`echo | grep VST3_PATH ../../common-mac.xcconfig` 51 | VST3=${VST3//\VST3_PATH = }/$PLUGIN_NAME.vst3 52 | 53 | AU=`echo | grep AU_PATH ../../common-mac.xcconfig` 54 | AU=${AU//\AU_PATH = }/$PLUGIN_NAME.component 55 | 56 | APP=`echo | grep APP_PATH ../../common-mac.xcconfig` 57 | APP=${APP//\APP_PATH = }/$PLUGIN_NAME.app 58 | 59 | # Dev build folder 60 | AAX=`echo | grep AAX_PATH ../../common-mac.xcconfig` 61 | AAX=${AAX//\AAX_PATH = }/$PLUGIN_NAME.aaxplugin 62 | AAX_FINAL="/Library/Application Support/Avid/Audio/Plug-Ins/$PLUGIN_NAME.aaxplugin" 63 | 64 | PKG="installer/build-mac/$PLUGIN_NAME Installer.pkg" 65 | PKG_US="installer/build-mac/$PLUGIN_NAME Installer.unsigned.pkg" 66 | 67 | CERT_ID=`echo | grep CERTIFICATE_ID ../../common-mac.xcconfig` 68 | CERT_ID=${CERT_ID//\CERTIFICATE_ID = } 69 | 70 | if [ $DEMO == 1 ] 71 | then 72 | echo "making $PLUGIN_NAME version $FULL_VERSION DEMO mac distribution..." 73 | # cp "resources/img/AboutBox_Demo.png" "resources/img/AboutBox.png" 74 | else 75 | echo "making $PLUGIN_NAME version $FULL_VERSION mac distribution..." 76 | # cp "resources/img/AboutBox_Registered.png" "resources/img/AboutBox.png" 77 | fi 78 | 79 | echo "" 80 | 81 | #--------------------------------------------------------------------------------------------------------- 82 | 83 | ./scripts/update_installer_version.py $DEMO 84 | 85 | echo "touching source to force recompile" 86 | touch *.cpp 87 | 88 | #--------------------------------------------------------------------------------------------------------- 89 | 90 | #remove existing dist folder 91 | #if [ -d installer/dist ] 92 | #then 93 | # rm -R installer/dist 94 | #fi 95 | 96 | #mkdir installer/dist 97 | 98 | #remove existing binaries 99 | if [ -d $APP ] 100 | then 101 | sudo rm -f -R -f $APP 102 | fi 103 | 104 | if [ -d $AU ] 105 | then 106 | sudo rm -f -R $AU 107 | fi 108 | 109 | if [ -d $VST2 ] 110 | then 111 | sudo rm -f -R $VST2 112 | fi 113 | 114 | if [ -d $VST3 ] 115 | then 116 | sudo rm -f -R $VST3 117 | fi 118 | 119 | if [ -d "${AAX}" ] 120 | then 121 | sudo rm -f -R "${AAX}" 122 | fi 123 | 124 | if [ -d "${AAX_FINAL}" ] 125 | then 126 | sudo rm -f -R "${AAX_FINAL}" 127 | fi 128 | 129 | #--------------------------------------------------------------------------------------------------------- 130 | 131 | # build xcode project. Change target to build individual formats 132 | 133 | xcodebuild -project ./projects/$PLUGIN_NAME-macOS.xcodeproj -xcconfig ./config/$PLUGIN_NAME-mac.xcconfig DEMO_VERSION=$DEMO -target "All" -configuration Release 2> ./build-mac.log 134 | 135 | if [ -s build-mac.log ] 136 | then 137 | echo "build failed due to following errors:" 138 | echo "" 139 | cat build-mac.log 140 | exit 1 141 | else 142 | rm build-mac.log 143 | fi 144 | 145 | #--------------------------------------------------------------------------------------------------------- 146 | 147 | #icon stuff - http://maxao.free.fr/telechargements/setfileicon.gz 148 | echo "setting icons" 149 | echo "" 150 | setfileicon resources/$PLUGIN_NAME.icns $AU 151 | setfileicon resources/$PLUGIN_NAME.icns $VST2 152 | setfileicon resources/$PLUGIN_NAME.icns $VST3 153 | setfileicon resources/$PLUGIN_NAME.icns "${AAX}" 154 | 155 | #--------------------------------------------------------------------------------------------------------- 156 | 157 | #strip debug symbols from binaries 158 | 159 | echo "stripping binaries" 160 | strip -x $AU/Contents/Resources/plugin.vst3/Contents/MacOS/$PLUGIN_NAME 161 | strip -x $VST2/Contents/MacOS/$PLUGIN_NAME 162 | strip -x $VST3/Contents/MacOS/$PLUGIN_NAME 163 | strip -x $APP/Contents/MacOS/$PLUGIN_NAME 164 | strip -x "${AAX}/Contents/MacOS/$PLUGIN_NAME" 165 | 166 | #--------------------------------------------------------------------------------------------------------- 167 | 168 | #ProTools stuff 169 | echo "copying AAX ${PLUGIN_NAME} from 3PDev to main AAX folder" 170 | sudo cp -p -R "${AAX}" "${AAX_FINAL}" 171 | mkdir "${AAX_FINAL}/Contents/Factory Presets/" 172 | 173 | echo "code sign AAX binary" 174 | /Applications/PACEAntiPiracy/Eden/Fusion/Current/bin/wraptool sign --verbose --account XXXX --wcguid XXXX --signid "Developer ID Application: ""${CERT_ID}" --in "${AAX_FINAL}" --out "${AAX_FINAL}" 175 | 176 | #--------------------------------------------------------------------------------------------------------- 177 | 178 | #Mac AppStore stuff 179 | 180 | #xcodebuild -project $PLUGIN_NAME.xcodeproj -xcconfig $PLUGIN_NAME.xcconfig -target "APP" -configuration Release 2> ./build-mac.log 181 | 182 | #echo "code signing app for appstore" 183 | #echo "" 184 | #codesign -f -s "3rd Party Mac Developer Application: ""${CERT_ID}" $APP --entitlements resources/$PLUGIN_NAME.entitlements 185 | 186 | #echo "building pkg for app store" 187 | #echo "" 188 | #productbuild \ 189 | # --component $APP /Applications \ 190 | # --sign "3rd Party Mac Developer Installer: ""${CERT_ID}" \ 191 | # --product "/Applications/$PLUGIN_NAME.app/Contents/Info.plist" installer/$PLUGIN_NAME.pkg 192 | 193 | #--------------------------------------------------------------------------------------------------------- 194 | 195 | #10.8 Gatekeeper/Developer ID stuff 196 | 197 | #echo "code app binary for Gatekeeper on 10.8" 198 | #echo "" 199 | #codesign -f -s "Developer ID Application: ""${CERT_ID}" $APP 200 | 201 | #--------------------------------------------------------------------------------------------------------- 202 | 203 | # installer, uses Packages http://s.sudre.free.fr/Software/Packages/about.html 204 | sudo sudo rm -R -f installer/$PLUGIN_NAME-mac.dmg 205 | 206 | echo "building installer" 207 | echo "" 208 | packagesbuild installer/$PLUGIN_NAME.pkgproj 209 | 210 | echo "code-sign installer for Gatekeeper on 10.8" 211 | echo "" 212 | mv "${PKG}" "${PKG_US}" 213 | productsign --sign "Developer ID Installer: ""${CERT_ID}" "${PKG_US}" "${PKG}" 214 | 215 | rm -R -f "${PKG_US}" 216 | 217 | #set installer icon 218 | setfileicon resources/$PLUGIN_NAME.icns "${PKG}" 219 | 220 | #--------------------------------------------------------------------------------------------------------- 221 | 222 | # dmg, can use dmgcanvas http://www.araelium.com/dmgcanvas/ to make a nice dmg 223 | 224 | echo "building dmg" 225 | echo "" 226 | 227 | if [ -d installer/$PLUGIN_NAME.dmgCanvas ] 228 | then 229 | dmgcanvas installer/$PLUGIN_NAME.dmgCanvas installer/$DMG_NAME.dmg 230 | else 231 | hdiutil create installer/$DMG_NAME.dmg -format UDZO -srcfolder installer/build-mac/ -ov -anyowners -volname $PLUGIN_NAME 232 | fi 233 | 234 | sudo rm -R -f installer/build-mac/ 235 | 236 | #--------------------------------------------------------------------------------------------------------- 237 | # zip 238 | 239 | # echo "copying binaries..." 240 | # echo "" 241 | # cp -R $AU installer/dist/$PLUGIN_NAME.component 242 | # cp -R $VST2 installer/dist/$PLUGIN_NAME.vst 243 | # cp -R $VST3 installer/dist/$PLUGIN_NAME.vst3 244 | # cp -R $AAX installer/dist/$PLUGIN_NAME.aaxplugin 245 | # cp -R $APP installer/dist/$PLUGIN_NAME.app 246 | # 247 | # echo "zipping binaries..." 248 | # echo "" 249 | # ditto -c -k installer/dist installer/$PLUGIN_NAME-mac.zip 250 | # rm -R installer/dist 251 | 252 | #--------------------------------------------------------------------------------------------------------- 253 | 254 | if [ $DEMO == 1 ] 255 | then 256 | git checkout installer/Flutterbird.iss 257 | git checkout installer/Flutterbird.pkgproj 258 | git checkout resources/img/AboutBox.png 259 | fi 260 | 261 | echo "done" 262 | -------------------------------------------------------------------------------- /source/scripts/makedist-web.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | cd "$(dirname "$0")" 4 | 5 | cd .. 6 | 7 | websocket=0 8 | if [ "$1" = "websocket" ] 9 | then 10 | emrunmode=2 11 | websocket=1 12 | elif [ "$1" = "off" ] 13 | then 14 | emrunmode=0 15 | else 16 | emrunmode=1 17 | fi 18 | 19 | if [ -d build-web/.git ] 20 | then 21 | # trash only the scripts folder 22 | if [ -d build-web/scripts ] 23 | then 24 | rm -r build-web/scripts 25 | fi 26 | else 27 | # trash the whole build-web folder 28 | if [ -d build-web ] 29 | then 30 | rm -r build-web 31 | fi 32 | 33 | mkdir build-web 34 | fi 35 | 36 | mkdir build-web/scripts 37 | 38 | echo BUNDLING RESOURCES ----------------------------- 39 | cd build-web 40 | 41 | if [ -f imgs.js ] 42 | then 43 | rm imgs.js 44 | fi 45 | 46 | if [ -f imgs@2x.js ] 47 | then 48 | rm imgs@2x.js 49 | fi 50 | 51 | if [ -f svgs.js ] 52 | then 53 | rm svgs.js 54 | fi 55 | 56 | if [ -f fonts.js ] 57 | then 58 | rm fonts.js 59 | fi 60 | 61 | if [ -f presets.js ] 62 | then 63 | rm presets.js 64 | fi 65 | 66 | python $EMSCRIPTEN/tools/file_packager.py fonts.data --preload ../resources/fonts/ --exclude .DS_Store --js-output=fonts.js 67 | python $EMSCRIPTEN/tools/file_packager.py svgs.data --preload ../resources/img/ --exclude *.png --exclude *DS_Store --js-output=svgs.js 68 | 69 | # echo "if(window.devicePixelRatio == 1) {\n" > imgs.js 70 | python $EMSCRIPTEN/tools/file_packager.py imgs.data --use-preload-plugins --preload ../resources/img/ --use-preload-cache --indexedDB-name="/Flutterbird_pkg" --exclude *DS_Store --exclude *@2x.png --exclude *.svg >> imgs.js 71 | # echo "\n}" >> imgs.js 72 | # package @2x resources into separate .data file 73 | mkdir ./2x/ 74 | cp ../resources/img/*@2x* ./2x 75 | # echo "if(window.devicePixelRatio > 1) {\n" > imgs@2x.js 76 | #--use-preload-cache --indexedDB-name="/Flutterbird_data" 77 | python $EMSCRIPTEN/tools/file_packager.py imgs@2x.data --use-preload-plugins --preload ./2x@/resources/img/ --use-preload-cache --indexedDB-name="/Flutterbird_pkg" --exclude *DS_Store >> imgs@2x.js 78 | # echo "\n}" >> imgs@2x.js 79 | rm -r ./2x 80 | 81 | cd .. 82 | echo - 83 | 84 | 85 | echo MAKING - WAM WASM MODULE ----------------------------- 86 | emmake make --makefile projects/Flutterbird-wam-processor.mk 87 | 88 | if [ $? -ne "0" ] 89 | then 90 | echo IPlugWAM WASM compilation failed 91 | exit 1 92 | fi 93 | 94 | cd build-web/scripts 95 | 96 | echo "AudioWorkletGlobalScope.WAM = AudioWorkletGlobalScope.WAM || {}; AudioWorkletGlobalScope.WAM.Flutterbird = { ENVIRONMENT: 'WEB' };" > Flutterbird-wam.tmp.js; 97 | cat Flutterbird-wam.js >> Flutterbird-wam.tmp.js 98 | mv Flutterbird-wam.tmp.js Flutterbird-wam.js 99 | 100 | cp ../../../../Dependencies/IPlug/WAM_SDK/wamsdk/*.js . 101 | cp ../../../../Dependencies/IPlug/WAM_AWP/*.js . 102 | cp ../../../../IPlug/WEB/Template/scripts/IPlugWAM-awn.js Flutterbird-awn.js 103 | sed -i.bak s/NAME_PLACEHOLDER/Flutterbird/g Flutterbird-awn.js 104 | cp ../../../../IPlug/WEB/Template/scripts/IPlugWAM-awp.js Flutterbird-awp.js 105 | sed -i.bak s/NAME_PLACEHOLDER/Flutterbird/g Flutterbird-awp.js 106 | rm *.bak 107 | cd .. 108 | 109 | #copy in the template html - comment if you have customised the html 110 | cp ../../../IPlug/WEB/Template/IPlugWAM-standalone.html index.html 111 | sed -i.bak s/NAME_PLACEHOLDER/Flutterbird/g index.html 112 | rm *.bak 113 | 114 | cp ../../../IPlug/WEB/Template/favicon.ico favicon.ico 115 | 116 | cd ../ 117 | 118 | echo 119 | echo MAKING - WEB WASM MODULE ----------------------------- 120 | 121 | emmake make --makefile projects/Flutterbird-wam-controller.mk EXTRA_CFLAGS=-DWEBSOCKET_CLIENT=$websocket 122 | 123 | if [ $? -ne "0" ] 124 | then 125 | echo IPlugWEB WASM compilation failed 126 | exit 1 127 | fi 128 | 129 | cd build-web 130 | 131 | echo payload: 132 | find . -maxdepth 2 -mindepth 1 -exec du -hs {} \; 133 | du -hc 134 | 135 | if [ "$emrunmode" -eq "2" ] 136 | then 137 | emrun --browser chrome --no_server --port=8001 index.html 138 | elif [ "$emrunmode" -eq "1" ] 139 | then 140 | emrun --browser chrome --no_emrun_detect index.html 141 | # emrun --browser firefox index.html 142 | else 143 | echo "Not running emrun" 144 | fi 145 | -------------------------------------------------------------------------------- /source/scripts/makedist-win.bat: -------------------------------------------------------------------------------- 1 | echo off 2 | 3 | REM - batch file to build MSVS project and zip the resulting binaries (or make installer) 4 | REM - updating version numbers requires python and python path added to %PATH% env variable 5 | REM - zipping requires 7zip in %ProgramFiles%\7-Zip\7z.exe 6 | REM - building installer requires innotsetup in "%ProgramFiles(x86)%\Inno Setup 5\iscc" 7 | REM - AAX codesigning requires wraptool tool added to %PATH% env variable and aax.key/.crt in .\..\..\..\Certificates\ 8 | 9 | if %1 == 1 (echo Making Flutterbird Windows DEMO VERSION distribution ...) else (echo Making Flutterbird Windows FULL VERSION distribution ...) 10 | 11 | echo "touching source" 12 | cd ..\source\ 13 | copy /b *.cpp+,, 14 | 15 | echo ------------------------------------------------------------------ 16 | echo Updating version numbers ... 17 | cd.. 18 | call python scripts\prepare_resources.py %1 19 | call python scripts\update_installer_version.py %1 20 | 21 | echo ------------------------------------------------------------------ 22 | echo Building ... 23 | 24 | if exist "%ProgramFiles(x86)%" (goto 64-Bit) else (goto 32-Bit) 25 | 26 | :32-Bit 27 | echo 32-Bit O/S detected 28 | call "%ProgramFiles%\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_x64 8.1 29 | goto END 30 | 31 | :64-Bit 32 | echo 64-Bit Host O/S detected 33 | call "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_x64 8.1 34 | goto END 35 | :END 36 | 37 | REM - set preprocessor macros like this, for instance to enable demo build: 38 | if %1 == 1 ( 39 | set CMDLINE_DEFINES="DEMO_VERSION=1" 40 | REM -copy ".\resources\img\AboutBox_Demo.png" ".\resources\img\AboutBox.png" 41 | ) else ( 42 | set CMDLINE_DEFINES="DEMO_VERSION=0" 43 | REM -copy ".\resources\img\AboutBox_Registered.png" ".\resources\img\AboutBox.png" 44 | ) 45 | 46 | REM - Could build individual targets like this: 47 | REM - msbuild Flutterbird-app.vcxproj /p:configuration=release /p:platform=win32 48 | 49 | echo Building 32 bit binaries... 50 | msbuild Flutterbird.sln /p:configuration=release /p:platform=win32 /nologo /verbosity:minimal /fileLogger /m /flp:logfile=build-win.log;errorsonly 51 | 52 | echo Building 64 bit binaries... 53 | msbuild Flutterbird.sln /p:configuration=release /p:platform=x64 /nologo /verbosity:minimal /fileLogger /m /flp:logfile=build-win.log;errorsonly;append 54 | 55 | REM --echo Copying AAX Presets 56 | 57 | REM --echo ------------------------------------------------------------------ 58 | REM --echo Code sign AAX binary... 59 | REM --info at pace central, login via iLok license manager https://www.paceap.com/pace-central.html 60 | REM --wraptool sign --verbose --account XXXXX --wcguid XXXXX --keyfile XXXXX.p12 --keypassword XXXXX --in .\build-win\aax\bin\Flutterbird.aaxplugin\Contents\Win32\Flutterbird.aaxplugin --out .\build-win\aax\bin\Flutterbird.aaxplugin\Contents\Win32\Flutterbird.aaxplugin 61 | REM --wraptool sign --verbose --account XXXXX --wcguid XXXXX --keyfile XXXXX.p12 --keypassword XXXXX --in .\build-win\aax\bin\Flutterbird.aaxplugin\Contents\x64\Flutterbird.aaxplugin --out .\build-win\aax\bin\Flutterbird.aaxplugin\Contents\x64\Flutterbird.aaxplugin 62 | 63 | REM - Make Installer (InnoSetup) 64 | 65 | echo ------------------------------------------------------------------ 66 | echo Making Installer ... 67 | 68 | if exist "%ProgramFiles(x86)%" (goto 64-Bit-is) else (goto 32-Bit-is) 69 | 70 | :32-Bit-is 71 | "%ProgramFiles%\Inno Setup 5\iscc" /Q /cc ".\installer\Flutterbird.iss" 72 | goto END-is 73 | 74 | :64-Bit-is 75 | "%ProgramFiles(x86)%\Inno Setup 5\iscc" /Q /cc ".\installer\Flutterbird.iss" 76 | goto END-is 77 | 78 | :END-is 79 | 80 | REM - Codesign Installer for Windows 8+ 81 | REM -"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /f "XXXXX.p12" /p XXXXX /d "Flutterbird Installer" ".\installer\Flutterbird Installer.exe" 82 | 83 | REM -if %1 == 1 ( 84 | REM -copy ".\installer\Flutterbird Installer.exe" ".\installer\Flutterbird Demo Installer.exe" 85 | REM -del ".\installer\Flutterbird Installer.exe" 86 | REM -) 87 | 88 | REM - ZIP 89 | echo ------------------------------------------------------------------ 90 | echo Making Zip File ... 91 | 92 | call python scripts\make_zip.py %1 93 | 94 | echo ------------------------------------------------------------------ 95 | echo Printing log file to console... 96 | 97 | type build-win.log 98 | 99 | pause 100 | -------------------------------------------------------------------------------- /source/scripts/postbuild-win.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | REM - CALL "$(SolutionDir)\scripts\postbuild.bat" "$(TargetExt)" "$(BINARY_NAME)" "$(Platform)" "$(COPY_VST2)" "$(TargetPath)" "$(VST2_32_PATH)" "$(VST2_64_PATH)" "$(VST3_32_PATH)" "$(VST3_64_PATH)" "$(AAX_32_PATH)" "$(AAX_64_PATH)" 3 | set FORMAT=%1 4 | set NAME=%2 5 | set PLATFORM=%3 6 | set COPY_VST2=%4 7 | set BUILT_BINARY=%5 8 | set VST2_32_PATH=%6 9 | set VST2_64_PATH=%7 10 | set VST3_32_PATH=%8 11 | set VST3_64_PATH=%9 12 | shift 13 | shift 14 | shift 15 | set AAX_32_PATH=%7 16 | set AAX_64_PATH=%8 17 | set AAX_BUNDLE=%9 18 | 19 | echo POSTBUILD SCRIPT VARIABLES ----------------------------------------------------- 20 | echo FORMAT %FORMAT% 21 | echo NAME %NAME% 22 | echo PLATFORM %PLATFORM% 23 | echo COPY_VST2 %COPY_VST2% 24 | echo BUILT_BINARY %BUILT_BINARY% 25 | echo VST2_32_PATH %VST2_32_PATH% 26 | echo VST2_64_PATH %VST2_64_PATH% 27 | echo VST3_32_PATH %VST3_32_PATH% 28 | echo VST3_64_PATH %VST3_64_PATH% 29 | echo END POSTBUILD SCRIPT VARIABLES ----------------------------------------------------- 30 | 31 | if %PLATFORM% == "Win32" ( 32 | if %FORMAT% == ".dll" ( 33 | if %COPY_VST2% == "1" ( 34 | echo copying 32bit binary to 32bit VST2 Plugins folder ... 35 | copy /y %BUILT_BINARY% %VST2_32_PATH% 36 | ) else ( 37 | echo not copying 32bit VST2 binary 38 | ) 39 | ) 40 | if %FORMAT% == ".vst3" ( 41 | echo copying 32bit binary to 32bit VST3 Plugins folder ... 42 | copy /y %BUILT_BINARY% %VST3_32_PATH% 43 | ) 44 | REM - if %FORMAT% == ".aaxplugin" ( 45 | REM - echo copying 32bit binary to 32bit AAX Plugins folder ... 46 | REM - echo %AAX_BUNDLE% %AAX_32_PATH% 47 | REM - xcopy /E /H /Y %AAX_BUNDLE%\* %AAX_32_PATH%\%NAME%.aaxplugin\ 48 | REM - ) 49 | ) 50 | 51 | if %PLATFORM% == "x64" ( 52 | if exist "%ProgramFiles(x86)%" ( 53 | if %FORMAT% == ".dll" ( 54 | if %COPY_VST2% == "1" ( 55 | echo copying 64bit binary to 64bit VST2 Plugins folder ... 56 | copy /y %BUILT_BINARY% %VST2_64_PATH% 57 | ) else ( 58 | echo not copying 64bit VST2 binary 59 | ) 60 | ) 61 | if %FORMAT% == ".vst3" ( 62 | echo copying 64bit binary to 64bit VST3 Plugins folder ... 63 | copy /y %BUILT_BINARY% %VST3_64_PATH% 64 | ) 65 | if %FORMAT% == ".aaxplugin" ( 66 | echo copying 64bit binary to 64bit AAX Plugins folder ... 67 | echo %AAX_BUNDLE% %AAX_64_PATH% 68 | xcopy /E /H /Y %AAX_BUNDLE%\* %AAX_64_PATH%\%NAME%.aaxplugin\ 69 | ) 70 | ) else ( 71 | echo not copying 64bit, since machine is 32bit 72 | ) 73 | ) -------------------------------------------------------------------------------- /source/scripts/prebuild-win.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | REM - CALL "$(ProjectDir)\scripts\prebuild.bat" "$(TargetExt)" "$(BINARY_NAME)" "$(Platform)" "$(TargetPath)" "$(OutDir)" 3 | set FORMAT=%1 4 | set NAME=%2 5 | set PLATFORM=%3 6 | set BUILT_BINARY=%4 7 | set OUT_DIR=%5 8 | set OUT_DIR=%OUT_DIR:"=% 9 | set ICON_SOURCE=%6 10 | set AAX_BUNDLE=%7 11 | 12 | if %PLATFORM% == "Win32" ( 13 | if %FORMAT% == ".aaxplugin" ( 14 | REM -DEL /Q /F /S %AAX_BUNDLE% 15 | REM -CALL ..\..\..\Dependencies\IPlug\AAX_SDK\Utilities\CreatePackage.bat "%OUT_DIR%" %ICON_SOURCE% 16 | ) 17 | ) 18 | 19 | if %PLATFORM% == "x64" ( 20 | if exist "%ProgramFiles(x86)%" ( 21 | if %FORMAT% == ".aaxplugin" ( 22 | DEL /Q /F /S %AAX_BUNDLE% 23 | CALL ..\..\..\Dependencies\IPlug\AAX_SDK\Utilities\CreatePackage.bat "%OUT_DIR%" %ICON_SOURCE% 24 | ) 25 | ) 26 | ) -------------------------------------------------------------------------------- /source/scripts/prepare_resources-ios.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | # this script will create/update info plist files based on config.h 4 | 5 | kAudioUnitType_MusicDevice = "aumu" 6 | kAudioUnitType_MusicEffect = "aumf" 7 | kAudioUnitType_Effect = "aufx" 8 | kAudioUnitType_MIDIProcessor = "aumi" 9 | 10 | import plistlib, os, datetime, fileinput, glob, sys, string, shutil 11 | 12 | scriptpath = os.path.dirname(os.path.realpath(__file__)) 13 | projectpath = os.path.abspath(os.path.join(scriptpath, os.pardir)) 14 | 15 | sys.path.insert(0, projectpath + '/../../scripts/') 16 | 17 | from parse_config import parse_config, parse_xcconfig 18 | 19 | def main(): 20 | if(len(sys.argv) == 2): 21 | if(sys.argv[1] == "app"): 22 | print "Copying resources ..." 23 | 24 | dst = os.environ["TARGET_BUILD_DIR"] + "/" + os.environ["UNLOCALIZED_RESOURCES_FOLDER_PATH"] 25 | 26 | if os.path.exists(projectpath + "/resources/img/"): 27 | imgs = os.listdir(projectpath + "/resources/img/") 28 | for img in imgs: 29 | print "copying " + img + " to " + dst 30 | shutil.copy(projectpath + "/resources/img/" + img, dst) 31 | 32 | if os.path.exists(projectpath + "/resources/fonts/"): 33 | fonts = os.listdir(projectpath + "/resources/fonts/") 34 | for font in fonts: 35 | print "copying " + font + " to " + dst 36 | shutil.copy(projectpath + "/resources/fonts/" + font, dst) 37 | 38 | config = parse_config(projectpath) 39 | xcconfig = parse_xcconfig(projectpath + '/../../common-ios.xcconfig') 40 | 41 | CFBundleGetInfoString = config['BUNDLE_NAME'] + " v" + config['FULL_VER_STR'] + " " + config['PLUG_COPYRIGHT_STR'] 42 | CFBundleVersion = config['FULL_VER_STR'] 43 | CFBundlePackageType = "BNDL" 44 | CSResourcesFileMapped = True 45 | LSMinimumSystemVersion = xcconfig['DEPLOYMENT_TARGET'] 46 | 47 | print "Processing Info.plist files..." 48 | 49 | # AUDIOUNIT v3 50 | 51 | if config['PLUG_TYPE'] == 0: 52 | if config['PLUG_DOES_MIDI_IN']: 53 | COMPONENT_TYPE = kAudioUnitType_MusicEffect 54 | else: 55 | COMPONENT_TYPE = kAudioUnitType_Effect 56 | elif config['PLUG_TYPE'] == 1: 57 | COMPONENT_TYPE = kAudioUnitType_MusicDevice 58 | elif config['PLUG_TYPE'] == 2: 59 | COMPONENT_TYPE = kAudioUnitType_MIDIProcessor 60 | 61 | NSEXTENSIONPOINTIDENTIFIER = "com.apple.AudioUnit-UI" 62 | 63 | plistpath = projectpath + "/resources/" + config['BUNDLE_NAME'] + "-iOS-AUv3-Info.plist" 64 | auv3 = plistlib.readPlist(plistpath) 65 | auv3['CFBundleExecutable'] = config['BUNDLE_NAME'] + "AppExtension" 66 | auv3['CFBundleIdentifier'] = config['BUNDLE_DOMAIN'] + "." + config['BUNDLE_MFR'] + ".app." + config['BUNDLE_NAME'] + ".AUv3" 67 | auv3['CFBundleName'] = config['BUNDLE_NAME'] + "AppExtension" 68 | auv3['CFBundleDisplayName'] = config['BUNDLE_NAME'] + "AppExtension" 69 | auv3['CFBundleVersion'] = CFBundleVersion 70 | auv3['CFBundleShortVersionString'] = CFBundleVersion 71 | auv3['CFBundlePackageType'] = "XPC!" 72 | auv3['NSExtension'] = dict( 73 | NSExtensionAttributes = dict(AudioComponents = [{}]), 74 | NSExtensionMainStoryboard = config['BUNDLE_NAME'] + "-iOS-MainInterface", 75 | NSExtensionPointIdentifier = NSEXTENSIONPOINTIDENTIFIER) 76 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'] = [{}] 77 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['description'] = config['PLUG_NAME'] 78 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['manufacturer'] = config['PLUG_MFR_ID'] 79 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['factoryFunction'] = config['BUNDLE_NAME'] + "ViewController" 80 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['name'] = config['PLUG_MFR'] + ": " + config['PLUG_NAME'] 81 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['subtype'] = config['PLUG_UNIQUE_ID'] 82 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['type'] = COMPONENT_TYPE 83 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['version'] = config['PLUG_VERSION_INT'] 84 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['sandboxSafe'] = True 85 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['tags'] = [{}] 86 | 87 | if config['PLUG_TYPE'] == 1: 88 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['tags'][0] = "Synth" 89 | else: 90 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['tags'][0] = "Effects" 91 | 92 | plistlib.writePlist(auv3, plistpath) 93 | 94 | # Standalone APP 95 | 96 | plistpath = projectpath + "/resources/" + config['BUNDLE_NAME'] + "-iOS-Info.plist" 97 | iOSapp = plistlib.readPlist(plistpath) 98 | iOSapp['CFBundleExecutable'] = config['BUNDLE_NAME'] 99 | iOSapp['CFBundleIdentifier'] = config['BUNDLE_DOMAIN'] + "." + config['BUNDLE_MFR'] + ".app." + config['BUNDLE_NAME'] 100 | iOSapp['CFBundleName'] = config['BUNDLE_NAME'] 101 | iOSapp['CFBundleVersion'] = CFBundleVersion 102 | iOSapp['CFBundleShortVersionString'] = CFBundleVersion 103 | iOSapp['CFBundlePackageType'] = "APPL" 104 | iOSapp['LSApplicationCategoryType'] = "public.app-category.music" 105 | 106 | plistlib.writePlist(iOSapp, plistpath) 107 | 108 | if __name__ == '__main__': 109 | main() 110 | -------------------------------------------------------------------------------- /source/scripts/prepare_resources-mac.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | # this script will create/update info plist files based on config.h and copy resources to the ~/Music/PLUG_NAME folder or the bundle depending on PLUG_SHARED_RESOURCES 4 | 5 | kAudioUnitType_MusicDevice = "aumu" 6 | kAudioUnitType_MusicEffect = "aumf" 7 | kAudioUnitType_Effect = "aufx" 8 | kAudioUnitType_MIDIProcessor = "aumi" 9 | 10 | DONT_COPY = ("") 11 | 12 | import plistlib, os, datetime, fileinput, glob, sys, string, shutil 13 | 14 | scriptpath = os.path.dirname(os.path.realpath(__file__)) 15 | projectpath = os.path.abspath(os.path.join(scriptpath, os.pardir)) 16 | 17 | sys.path.insert(0, projectpath + '/../../scripts/') 18 | 19 | from parse_config import parse_config, parse_xcconfig 20 | 21 | def main(): 22 | config = parse_config(projectpath) 23 | xcconfig = parse_xcconfig(projectpath + '/../../common-mac.xcconfig') 24 | 25 | CFBundleGetInfoString = config['BUNDLE_NAME'] + " v" + config['FULL_VER_STR'] + " " + config['PLUG_COPYRIGHT_STR'] 26 | CFBundleVersion = config['FULL_VER_STR'] 27 | CFBundlePackageType = "BNDL" 28 | CSResourcesFileMapped = True 29 | LSMinimumSystemVersion = xcconfig['DEPLOYMENT_TARGET'] 30 | 31 | print "Copying resources ..." 32 | 33 | if config['PLUG_SHARED_RESOURCES']: 34 | dst = os.path.expanduser("~") + "/Music/" + config['BUNDLE_NAME'] + "/Resources" 35 | else: 36 | dst = os.environ["TARGET_BUILD_DIR"] + os.environ["UNLOCALIZED_RESOURCES_FOLDER_PATH"] 37 | 38 | if os.path.exists(dst) == False: 39 | os.makedirs(dst + "/", 0755 ) 40 | 41 | if os.path.exists(projectpath + "/resources/img/"): 42 | imgs = os.listdir(projectpath + "/resources/img/") 43 | for img in imgs: 44 | print "copying " + img + " to " + dst 45 | shutil.copy(projectpath + "/resources/img/" + img, dst) 46 | 47 | if os.path.exists(projectpath + "/resources/fonts/"): 48 | fonts = os.listdir(projectpath + "/resources/fonts/") 49 | for font in fonts: 50 | print "copying " + font + " to " + dst 51 | shutil.copy(projectpath + "/resources/fonts/" + font, dst) 52 | 53 | print "Processing Info.plist files..." 54 | 55 | # VST3 56 | 57 | plistpath = projectpath + "/resources/" + config['BUNDLE_NAME'] + "-VST3-Info.plist" 58 | vst3 = plistlib.readPlist(plistpath) 59 | vst3['CFBundleExecutable'] = config['BUNDLE_NAME'] 60 | vst3['CFBundleGetInfoString'] = CFBundleGetInfoString 61 | vst3['CFBundleIdentifier'] = config['BUNDLE_DOMAIN'] + "." + config['BUNDLE_MFR'] + ".vst3." + config['BUNDLE_NAME'] + "" 62 | vst3['CFBundleName'] = config['BUNDLE_NAME'] 63 | vst3['CFBundleVersion'] = CFBundleVersion 64 | vst3['CFBundleShortVersionString'] = CFBundleVersion 65 | vst3['LSMinimumSystemVersion'] = LSMinimumSystemVersion 66 | vst3['CFBundlePackageType'] = CFBundlePackageType 67 | vst3['CFBundleSignature'] = config['PLUG_UNIQUE_ID'] 68 | vst3['CSResourcesFileMapped'] = CSResourcesFileMapped 69 | 70 | plistlib.writePlist(vst3, plistpath) 71 | 72 | # VST2 73 | 74 | plistpath = projectpath + "/resources/" + config['BUNDLE_NAME'] + "-VST2-Info.plist" 75 | vst2 = plistlib.readPlist(plistpath) 76 | vst2['CFBundleExecutable'] = config['BUNDLE_NAME'] 77 | vst2['CFBundleGetInfoString'] = CFBundleGetInfoString 78 | vst2['CFBundleIdentifier'] = config['BUNDLE_DOMAIN'] + "." + config['BUNDLE_MFR'] + ".vst." + config['BUNDLE_NAME'] + "" 79 | vst2['CFBundleName'] = config['BUNDLE_NAME'] 80 | vst2['CFBundleVersion'] = CFBundleVersion 81 | vst2['CFBundleShortVersionString'] = CFBundleVersion 82 | vst2['LSMinimumSystemVersion'] = LSMinimumSystemVersion 83 | vst2['CFBundlePackageType'] = CFBundlePackageType 84 | vst2['CFBundleSignature'] = config['PLUG_UNIQUE_ID'] 85 | vst2['CSResourcesFileMapped'] = CSResourcesFileMapped 86 | 87 | plistlib.writePlist(vst2, plistpath) 88 | 89 | # AUDIOUNIT v2 90 | 91 | plistpath = projectpath + "/resources/" + config['BUNDLE_NAME'] + "-au-Info.plist" 92 | auv2 = plistlib.readPlist(plistpath) 93 | auv2['CFBundleExecutable'] = config['BUNDLE_NAME'] 94 | auv2['CFBundleGetInfoString'] = CFBundleGetInfoString 95 | auv2['CFBundleIdentifier'] = config['BUNDLE_DOMAIN'] + "." + config['BUNDLE_MFR'] + ".audiounit." + config['BUNDLE_NAME'] + "" 96 | auv2['CFBundleName'] = config['BUNDLE_NAME'] 97 | auv2['CFBundleVersion'] = CFBundleVersion 98 | auv2['CFBundleShortVersionString'] = CFBundleVersion 99 | auv2['LSMinimumSystemVersion'] = LSMinimumSystemVersion 100 | auv2['CFBundlePackageType'] = CFBundlePackageType 101 | auv2['CFBundleSignature'] = config['PLUG_UNIQUE_ID'] 102 | auv2['CSResourcesFileMapped'] = CSResourcesFileMapped 103 | 104 | if config['PLUG_TYPE'] == 0: 105 | if config['PLUG_DOES_MIDI_IN']: 106 | COMPONENT_TYPE = kAudioUnitType_MusicEffect 107 | else: 108 | COMPONENT_TYPE = kAudioUnitType_Effect 109 | elif config['PLUG_TYPE'] == 1: 110 | COMPONENT_TYPE = kAudioUnitType_MusicDevice 111 | elif config['PLUG_TYPE'] == 2: 112 | COMPONENT_TYPE = kAudioUnitType_MIDIProcessor 113 | 114 | auv2['AudioUnit Version'] = config['PLUG_VERSION_HEX'] 115 | auv2['AudioComponents'] = [{}] 116 | auv2['AudioComponents'][0]['description'] = config['PLUG_NAME'] 117 | auv2['AudioComponents'][0]['factoryFunction'] = config['AUV2_FACTORY'] 118 | auv2['AudioComponents'][0]['manufacturer'] = config['PLUG_MFR_ID'] 119 | auv2['AudioComponents'][0]['name'] = config['PLUG_MFR'] + ": " + config['PLUG_NAME'] 120 | auv2['AudioComponents'][0]['subtype'] = config['PLUG_UNIQUE_ID'] 121 | auv2['AudioComponents'][0]['type'] = COMPONENT_TYPE 122 | auv2['AudioComponents'][0]['version'] = config['PLUG_VERSION_INT'] 123 | auv2['AudioComponents'][0]['sandboxSafe'] = True 124 | 125 | plistlib.writePlist(auv2, plistpath) 126 | 127 | # AUDIOUNIT v3 128 | 129 | if config['PLUG_HAS_UI']: 130 | NSEXTENSIONPOINTIDENTIFIER = "com.apple.AudioUnit-UI" 131 | else: 132 | NSEXTENSIONPOINTIDENTIFIER = "com.apple.AudioUnit" 133 | 134 | plistpath = projectpath + "/resources/" + config['BUNDLE_NAME'] + "-macOS-AUv3-Info.plist" 135 | auv3 = plistlib.readPlist(plistpath) 136 | auv3['CFBundleExecutable'] = config['BUNDLE_NAME'] 137 | auv3['CFBundleGetInfoString'] = CFBundleGetInfoString 138 | auv3['CFBundleIdentifier'] = config['BUNDLE_DOMAIN'] + "." + config['BUNDLE_MFR'] + ".app." + config['BUNDLE_NAME'] + ".AUv3" 139 | auv3['CFBundleName'] = config['BUNDLE_NAME'] 140 | auv3['CFBundleVersion'] = CFBundleVersion 141 | auv3['CFBundleShortVersionString'] = CFBundleVersion 142 | auv3['LSMinimumSystemVersion'] = "10.12.0" 143 | auv3['CFBundlePackageType'] = "XPC!" 144 | auv3['NSExtension'] = dict( 145 | NSExtensionAttributes = dict( 146 | # AudioComponentBundle = "com.Tesselode.app." + config['BUNDLE_NAME'] + ".AUv3.framework", 147 | AudioComponents = [{}]), 148 | # NSExtensionServiceRoleType = "NSExtensionServiceRoleTypeEditor", 149 | NSExtensionPointIdentifier = NSEXTENSIONPOINTIDENTIFIER, 150 | NSExtensionPrincipalClass = "IPlugViewController" 151 | ) 152 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'] = [{}] 153 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['description'] = config['PLUG_NAME'] 154 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['manufacturer'] = config['PLUG_MFR_ID'] 155 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['name'] = config['PLUG_MFR'] + ": " + config['PLUG_NAME'] 156 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['subtype'] = config['PLUG_UNIQUE_ID'] 157 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['type'] = COMPONENT_TYPE 158 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['version'] = config['PLUG_VERSION_INT'] 159 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['sandboxSafe'] = True 160 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['tags'] = [{}] 161 | 162 | if config['PLUG_TYPE'] == 1: 163 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['tags'][0] = "Synth" 164 | else: 165 | auv3['NSExtension']['NSExtensionAttributes']['AudioComponents'][0]['tags'][0] = "Effects" 166 | 167 | plistlib.writePlist(auv3, plistpath) 168 | 169 | # AAX 170 | 171 | plistpath = projectpath + "/resources/" + config['BUNDLE_NAME'] + "-AAX-Info.plist" 172 | aax = plistlib.readPlist(plistpath) 173 | aax['CFBundleExecutable'] = config['BUNDLE_NAME'] 174 | aax['CFBundleGetInfoString'] = CFBundleGetInfoString 175 | aax['CFBundleIdentifier'] = config['BUNDLE_DOMAIN'] + "." + config['BUNDLE_MFR'] + ".aax." + config['BUNDLE_NAME'] + "" 176 | aax['CFBundleName'] = config['BUNDLE_NAME'] 177 | aax['CFBundleVersion'] = CFBundleVersion 178 | aax['CFBundleShortVersionString'] = CFBundleVersion 179 | aax['LSMinimumSystemVersion'] = LSMinimumSystemVersion 180 | aax['CSResourcesFileMapped'] = CSResourcesFileMapped 181 | 182 | plistlib.writePlist(aax, plistpath) 183 | 184 | # APP 185 | 186 | plistpath = projectpath + "/resources/" + config['BUNDLE_NAME'] + "-macOS-Info.plist" 187 | macOSapp = plistlib.readPlist(plistpath) 188 | macOSapp['CFBundleExecutable'] = config['BUNDLE_NAME'] 189 | macOSapp['CFBundleGetInfoString'] = CFBundleGetInfoString 190 | macOSapp['CFBundleIdentifier'] = config['BUNDLE_DOMAIN'] + "." + config['BUNDLE_MFR'] + ".app." + config['BUNDLE_NAME'] + "" 191 | macOSapp['CFBundleName'] = config['BUNDLE_NAME'] 192 | macOSapp['CFBundleVersion'] = CFBundleVersion 193 | macOSapp['CFBundleShortVersionString'] = CFBundleVersion 194 | macOSapp['LSMinimumSystemVersion'] = LSMinimumSystemVersion 195 | macOSapp['CFBundlePackageType'] = CFBundlePackageType 196 | macOSapp['CFBundleSignature'] = config['PLUG_UNIQUE_ID'] 197 | macOSapp['CSResourcesFileMapped'] = CSResourcesFileMapped 198 | macOSapp['NSPrincipalClass'] = "SWELLApplication" 199 | macOSapp['NSMainNibFile'] = config['BUNDLE_NAME'] + "-macOS-MainMenu" 200 | macOSapp['LSApplicationCategoryType'] = "public.app-category.music" 201 | macOSapp['CFBundleIconFile'] = config['BUNDLE_NAME'] + ".icns" 202 | 203 | plistlib.writePlist(macOSapp, plistpath) 204 | 205 | if __name__ == '__main__': 206 | main() 207 | -------------------------------------------------------------------------------- /source/scripts/prepare_resources-win.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import plistlib, os, datetime, fileinput, glob, sys, string, shutil 4 | 5 | scriptpath = os.path.dirname(os.path.realpath(__file__)) 6 | projectpath = os.path.abspath(os.path.join(scriptpath, os.pardir)) 7 | 8 | sys.path.insert(0, projectpath + '/../../scripts/') 9 | 10 | from parse_config import parse_config 11 | 12 | def main(): 13 | config = parse_config(projectpath) 14 | 15 | rc = open(projectpath + "/" + config['BUNDLE_NAME'] + ".rc", "w") 16 | 17 | rc.write("\n") 18 | rc.write("/////////////////////////////////////////////////////////////////////////////\n") 19 | rc.write("// Version\n") 20 | rc.write("/////////////////////////////////////////////////////////////////////////////\n") 21 | rc.write("VS_VERSION_INFO VERSIONINFO\n") 22 | rc.write("FILEVERSION " + config['MAJOR_STR'] + "," + config['MINOR_STR'] + "," + config['BUGFIX_STR'] + ",0\n") 23 | rc.write("PRODUCTVERSION " + config['MAJOR_STR'] + "," + config['MINOR_STR'] + "," + config['BUGFIX_STR'] + ",0\n") 24 | rc.write(" FILEFLAGSMASK 0x3fL\n") 25 | rc.write("#ifdef _DEBUG\n") 26 | rc.write(" FILEFLAGS 0x1L\n") 27 | rc.write("#else\n") 28 | rc.write(" FILEFLAGS 0x0L\n") 29 | rc.write("#endif\n") 30 | rc.write(" FILEOS 0x40004L\n") 31 | rc.write(" FILETYPE 0x1L\n") 32 | rc.write(" FILESUBTYPE 0x0L\n") 33 | rc.write("BEGIN\n") 34 | rc.write(' BLOCK "StringFileInfo"\n') 35 | rc.write(" BEGIN\n") 36 | rc.write(' BLOCK "040004e4"\n') 37 | rc.write(" BEGIN\n") 38 | rc.write(' VALUE "FileVersion", "' + config['FULL_VER_STR'] + '"\0\n') 39 | rc.write(' VALUE "ProductVersion", "' + config['FULL_VER_STR'] + '"0\n') 40 | rc.write("#ifdef VST2_API\n") 41 | rc.write(' VALUE "OriginalFilename", "' + config['BUNDLE_NAME'] + '.dll"\0\n') 42 | rc.write("#elif defined VST3_API\n") 43 | rc.write(' VALUE "OriginalFilename", "' + config['BUNDLE_NAME'] + '.vst3"\0\n') 44 | rc.write("#elif defined AAX_API\n") 45 | rc.write(' VALUE "OriginalFilename", "' + config['BUNDLE_NAME'] + '.aaxplugin"\0\n') 46 | rc.write("#elif defined APP_API\n") 47 | rc.write(' VALUE "OriginalFilename", "' + config['BUNDLE_NAME'] + '.exe"\0\n') 48 | rc.write("#endif\n") 49 | rc.write(' VALUE "FileDescription", "' + config['PLUG_NAME'] + '"\0\n') 50 | rc.write(' VALUE "InternalName", "' + config['PLUG_NAME'] + '"\0\n') 51 | rc.write(' VALUE "ProductName", "' + config['PLUG_NAME'] + '"\0\n') 52 | rc.write(' VALUE "CompanyName", "' + config['PLUG_MFR'] + '"\0\n') 53 | rc.write(' VALUE "LegalCopyright", "' + config['PLUG_COPYRIGHT'] + '"\0\n') 54 | # rc.write(' VALUE "LegalTrademarks", "' + config['PLUG_TRADEMARKS'] + '"\0\n') 55 | rc.write(" END\n") 56 | rc.write(" END\n") 57 | rc.write(' BLOCK "VarFileInfo"\n') 58 | rc.write(" BEGIN\n") 59 | rc.write(' VALUE "Translation", 0x400, 1252\n') 60 | rc.write(" END\n") 61 | rc.write("END\n") 62 | rc.write("\n") 63 | 64 | if __name__ == '__main__': 65 | main() 66 | -------------------------------------------------------------------------------- /source/scripts/update_installer_version.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | # this script will update the versions in packages and innosetup installer files to match that in config.h 4 | 5 | import plistlib, os, datetime, fileinput, glob, sys, string 6 | scriptpath = os.path.dirname(os.path.realpath(__file__)) 7 | projectpath = os.path.abspath(os.path.join(scriptpath, os.pardir)) 8 | 9 | sys.path.insert(0, projectpath + '/../../scripts/') 10 | 11 | from parse_config import parse_config 12 | 13 | def replacestrs(filename, s, r): 14 | files = glob.glob(filename) 15 | 16 | for line in fileinput.input(files,inplace=1): 17 | string.find(line, s) 18 | line = line.replace(s, r) 19 | sys.stdout.write(line) 20 | 21 | def main(): 22 | demo = 0 23 | 24 | if len(sys.argv) != 2: 25 | print("Usage: update_installer_version.py demo(0 or 1)") 26 | sys.exit(1) 27 | else: 28 | demo=int(sys.argv[1]) 29 | 30 | config = parse_config(projectpath) 31 | 32 | # MAC INSTALLER 33 | 34 | print "Updating Mac Installer version info..." 35 | 36 | plistpath = projectpath + "/installer/" + config['BUNDLE_NAME'] + ".pkgproj" 37 | installer = plistlib.readPlist(plistpath) 38 | 39 | # range = number of items in the installer (VST 2, VST 3, app, audiounit, aax) 40 | for x in range(0,5): 41 | installer['PACKAGES'][x]['PACKAGE_SETTINGS']['VERSION'] = config['FULL_VER_STR'] 42 | 43 | if demo: 44 | installer['PROJECT']['PROJECT_PRESENTATION']['TITLE']['LOCALIZATIONS'][0]['VALUE'] = config['BUNDLE_NAME'] + " Demo" 45 | installer['PROJECT']['PROJECT_PRESENTATION']['INTRODUCTION']['LOCALIZATIONS'][0]['VALUE']['PATH'] = "intro-demo.rtf" 46 | else: 47 | installer['PROJECT']['PROJECT_PRESENTATION']['TITLE']['LOCALIZATIONS'][0]['VALUE'] = config['BUNDLE_NAME'] 48 | installer['PROJECT']['PROJECT_PRESENTATION']['INTRODUCTION']['LOCALIZATIONS'][0]['VALUE']['PATH'] = "intro.rtf" 49 | 50 | plistlib.writePlist(installer, plistpath) 51 | # replacestrs(plistpath, "//Apple//", "//Apple Computer//"); 52 | 53 | # WIN INSTALLER 54 | print "Updating Windows Installer version info..." 55 | 56 | for line in fileinput.input(projectpath + "/installer/" + config['BUNDLE_NAME'] + ".iss",inplace=1): 57 | if "AppVersion" in line: 58 | line="AppVersion=" + config['FULL_VER_STR'] + "\n" 59 | if "OutputBaseFilename" in line: 60 | if demo: 61 | line="OutputBaseFilename=Flutterbird Demo Installer\n" 62 | else: 63 | line="OutputBaseFilename=Flutterbird Installer\n" 64 | 65 | if 'Source: "readme' in line: 66 | if demo: 67 | line='Source: "readme-win-demo.rtf"; DestDir: "{app}"; DestName: "readme.rtf"; Flags: isreadme\n' 68 | else: 69 | line='Source: "readme-win.rtf"; DestDir: "{app}"; DestName: "readme.rtf"; Flags: isreadme\n' 70 | 71 | if "WelcomeLabel1" in line: 72 | if demo: 73 | line="WelcomeLabel1=Welcome to the Flutterbird Demo installer\n" 74 | else: 75 | line="WelcomeLabel1=Welcome to the Flutterbird installer\n" 76 | 77 | if "SetupWindowTitle" in line: 78 | if demo: 79 | line="SetupWindowTitle=Flutterbird Demo installer\n" 80 | else: 81 | line="SetupWindowTitle=Flutterbird installer\n" 82 | 83 | sys.stdout.write(line) 84 | 85 | 86 | 87 | if __name__ == '__main__': 88 | main() 89 | -------------------------------------------------------------------------------- /source/scripts/update_version.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | # this script will update the versions in plist and installer files to match that in config.h 4 | 5 | import plistlib, os, datetime, fileinput, glob, sys, string, shutil 6 | 7 | scriptpath = os.path.dirname(os.path.realpath(__file__)) 8 | projectpath = os.path.abspath(os.path.join(scriptpath, os.pardir)) 9 | 10 | sys.path.insert(0, projectpath + '/../../scripts/') 11 | 12 | from parse_config import parse_config, parse_xcconfig 13 | 14 | def replacestrs(filename, s, r): 15 | files = glob.glob(filename) 16 | 17 | for line in fileinput.input(files,inplace=1): 18 | string.find(line, s) 19 | line = line.replace(s, r) 20 | sys.stdout.write(line) 21 | 22 | def main(): 23 | 24 | config = parse_config(projectpath) 25 | 26 | today = datetime.date.today() 27 | 28 | CFBundleGetInfoString = config['BUNDLE_NAME'] + " v" + config['FULL_VER_STR'] + " " + config['PLUG_COPYRIGHT_STR'] 29 | CFBundleVersion = config['FULL_VER_STR'] 30 | 31 | print "update_version.py - setting version to " + config['FULL_VER_STR'] 32 | print "Updating plist version info..." 33 | 34 | plistpath = scriptpath + "/resources/Flutterbird-VST2-Info.plist" 35 | vst2 = plistlib.readPlist(plistpath) 36 | vst2['CFBundleGetInfoString'] = CFBundleGetInfoString 37 | vst2['CFBundleVersion'] = CFBundleVersion 38 | vst2['CFBundleShortVersionString'] = CFBundleVersion 39 | plistlib.writePlist(vst2, plistpath) 40 | replacestrs(plistpath, "//Apple//", "//Apple Computer//"); 41 | 42 | plistpath = scriptpath + "/resources/Flutterbird-AU-Info.plist" 43 | au = plistlib.readPlist(plistpath) 44 | au['CFBundleGetInfoString'] = CFBundleGetInfoString 45 | au['CFBundleVersion'] = CFBundleVersion 46 | au['CFBundleShortVersionString'] = CFBundleVersion 47 | plistlib.writePlist(au, plistpath) 48 | replacestrs(plistpath, "//Apple//", "//Apple Computer//"); 49 | 50 | plistpath = scriptpath + "/resources/Flutterbird-VST3-Info.plist" 51 | vst3 = plistlib.readPlist(plistpath) 52 | vst3['CFBundleGetInfoString'] = CFBundleGetInfoString 53 | vst3['CFBundleVersion'] = CFBundleVersion 54 | vst3['CFBundleShortVersionString'] = CFBundleVersion 55 | plistlib.writePlist(vst3, plistpath) 56 | replacestrs(plistpath, "//Apple//", "//Apple Computer//"); 57 | 58 | plistpath = scriptpath + "/resources/Flutterbird-macOS-Info.plist" 59 | app = plistlib.readPlist(plistpath) 60 | app['CFBundleGetInfoString'] = CFBundleGetInfoString 61 | app['CFBundleVersion'] = CFBundleVersion 62 | app['CFBundleShortVersionString'] = CFBundleVersion 63 | plistlib.writePlist(app, plistpath) 64 | replacestrs(plistpath, "//Apple//", "//Apple Computer//"); 65 | 66 | plistpath = scriptpath + "/resources/Flutterbird-AAX-Info.plist" 67 | aax = plistlib.readPlist(plistpath) 68 | aax['CFBundleGetInfoString'] = CFBundleGetInfoString 69 | aax['CFBundleVersion'] = CFBundleVersion 70 | aax['CFBundleShortVersionString'] = CFBundleVersion 71 | plistlib.writePlist(aax, plistpath) 72 | replacestrs(plistpath, "//Apple//", "//Apple Computer//"); 73 | 74 | print "Updating Mac Installer version info..." 75 | 76 | plistpath = scriptpath + "/installer/Flutterbird.pkgproj" 77 | installer = plistlib.readPlist(plistpath) 78 | 79 | for x in range(0,5): 80 | installer['PACKAGES'][x]['PACKAGE_SETTINGS']['VERSION'] = config['FULL_VER_STR'] 81 | 82 | plistlib.writePlist(installer, plistpath) 83 | replacestrs(plistpath, "//Apple//", "//Apple Computer//"); 84 | 85 | print "Updating Windows Installer version info..." 86 | 87 | for line in fileinput.input(scriptpath + "/installer/Flutterbird.iss",inplace=1): 88 | if "AppVersion" in line: 89 | line="AppVersion=" + config['FULL_VER_STR'] + "\n" 90 | sys.stdout.write(line) 91 | 92 | if __name__ == '__main__': 93 | main() 94 | -------------------------------------------------------------------------------- /source/scripts/validate_audiounit.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | # shell script to validate your iplug audiounit using auval 3 | # run from terminal with the argument leaks to perform the leaks test (See auval docs) 4 | 5 | BASEDIR=$(dirname $0) 6 | 7 | cd $BASEDIR 8 | 9 | x86_ARGS="-32" 10 | x64_ARGS="" 11 | 12 | PUID=`echo | grep PLUG_UNIQUE_ID ../config.h` 13 | PUID=${PUID//\#define PLUG_UNIQUE_ID } 14 | PUID=${PUID//\'} 15 | 16 | PMID=`echo | grep PLUG_MFR_ID ../config.h` 17 | PMID=${PMID//\#define PLUG_MFR_ID } 18 | PMID=${PMID//\'} 19 | 20 | PII=`echo | grep PLUG_IS_INST ../config.h` 21 | PII=${PII//\#define PLUG_IS_INST } 22 | 23 | PDM=`echo | grep PLUG_DOES_MIDI_IN ../config.h` 24 | PDM=${PDM//\#define PLUG_DOES_MIDI_IN } 25 | 26 | TYPE=aufx 27 | 28 | if [ $PII == 1 ] # instrument 29 | then 30 | TYPE=aumu 31 | else 32 | if [ $PDM == 1 ] # midi effect 33 | then 34 | TYPE=aumf 35 | fi 36 | fi 37 | 38 | if [ "$1" == "leaks" ] 39 | then 40 | echo "testing for leaks (i386 64 bit)" 41 | echo 'launch a new shell and type: ps axc|awk "{if (\$5==\"auvaltool\") print \$1}" to get the pid'; 42 | echo "then leaks PID" 43 | 44 | export MallocStackLogging=1 45 | set env MallocStackLoggingNoCompact=1 46 | 47 | auval $x64_ARGS -v $TYPE $PUID $PMID -w -q 48 | 49 | unset MallocStackLogging 50 | 51 | else 52 | 53 | echo "\nvalidating i386 32 bit... ------------------------" 54 | echo "--------------------------------------------------" 55 | echo "--------------------------------------------------" 56 | echo "--------------------------------------------------" 57 | echo "--------------------------------------------------" 58 | echo "--------------------------------------------------" 59 | 60 | auval $x86_ARGS -v $TYPE $PUID $PMID 61 | 62 | echo "\nvalidating i386 64 bit... ------------------------" 63 | echo "--------------------------------------------------" 64 | echo "--------------------------------------------------" 65 | echo "--------------------------------------------------" 66 | echo "--------------------------------------------------" 67 | echo "--------------------------------------------------" 68 | 69 | auval $x64_ARGS -v $TYPE $PUID $PMID 70 | 71 | fi 72 | 73 | echo "done" 74 | 75 | -------------------------------------------------------------------------------- /todo.md: -------------------------------------------------------------------------------- 1 | # Todo 2 | 3 | ## v2 4 | - [ ] UI niceties 5 | - [x] Right-click popup menu for waveform switches 6 | - [ ] Maybe make the sync on/off buttons take up less space 7 | - [ ] Try to improve compatibility with older computers 8 | - [ ] Try using different graphics backends 9 | - [ ] Add presets 10 | - [ ] Make some cool presets 11 | - [ ] Figure out a good workflow for importing .fxp files and exporting code 12 | - [ ] Start releasing VST3 builds 13 | - [ ] Make sure presets work in the VST3 version 14 | - [ ] Readme/manual 15 | 16 | ## Future 17 | - [ ] Investigate higher quality sample interpolation --------------------------------------------------------------------------------