diff --git a/TODO b/TODO
index 6630355..1bc11ac 100644
--- a/TODO
+++ b/TODO
@@ -1,9 +1,3 @@
-0.6.0
------
-
-code:
-* android, ios
-
1.0.0
-----
@@ -100,7 +94,7 @@ build system:
* VC, XCode, etc project files?
* single header(s)
* cross compile (rpi etc.)
-* consider tuist (https://tuist.io/), bazel (https://bazel.build/), pants (https://www.pantsbuild.org/), buck (https://buck2.build/), please (https://please.build/index.html) for mobile apps
+* better use of xcodegen (see xcode warnings) and/or consider tuist (https://tuist.io/), bazel (https://bazel.build/), pants (https://www.pantsbuild.org/), buck (https://buck2.build/), please (https://please.build/index.html) for mobile apps
* homogenize android and ios common code (e.g., same index)
--
diff --git a/examples/common/ios/app-Bridging-Header.h b/examples/common/ios/app-Bridging-Header.h
new file mode 100644
index 0000000..012e4b2
--- /dev/null
+++ b/examples/common/ios/app-Bridging-Header.h
@@ -0,0 +1,24 @@
+/*
+ * Brickworks
+ *
+ * Copyright (C) 2023 Orastron Srl unipersonale
+ *
+ * Brickworks is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * Brickworks is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Brickworks. If not, see .
+ *
+ * File author: Stefano D'Angelo, Paolo Marrone
+ */
+
+char audioStart();
+void audioStop();
+void setParameter(int i, float v);
+float getParameter(int i);
diff --git a/examples/common/ios/app.swift b/examples/common/ios/app.swift
new file mode 100644
index 0000000..67bea95
--- /dev/null
+++ b/examples/common/ios/app.swift
@@ -0,0 +1,102 @@
+/*
+ * Brickworks
+ *
+ * Copyright (C) 2023 Orastron Srl unipersonale
+ *
+ * Brickworks is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * Brickworks is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Brickworks. If not, see .
+ *
+ * File author: Stefano D'Angelo, Paolo Marrone
+ */
+
+import SwiftUI
+import WebKit
+import AVFoundation
+
+struct WebView: UIViewRepresentable {
+ class Coordinator: NSObject, WKScriptMessageHandlerWithReply {
+ func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage, replyHandler: @escaping (Any?, String?) -> Void) {
+ guard let body = message.body as? [String : Any] else { return }
+ guard let name = body["name"] as? String else { return }
+ switch (name) {
+ case "needAudioPermission":
+ replyHandler(AVCaptureDevice.authorizationStatus(for: .audio) != .authorized, nil)
+ break;
+ case "requestAudioPermission":
+ AVAudioSession.sharedInstance().requestRecordPermission { granted in }
+ replyHandler(nil, nil)
+ break;
+ case "audioStart":
+ replyHandler(audioStart() != 0, nil)
+ break;
+ case "audioStop":
+ audioStop()
+ replyHandler(nil, nil)
+ break;
+ case "setParameter":
+ guard let index = body["index"] as? Int32 else { return }
+ guard let value = body["value"] as? Double else { return }
+ setParameter(index, Float(value))
+ replyHandler(nil, nil)
+ break;
+ case "getParameter":
+ guard let index = body["index"] as? Int32 else { return }
+ let v = getParameter(index)
+ replyHandler(v, nil)
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ func makeCoordinator() -> Coordinator {
+ return Coordinator()
+ }
+
+ let url: URL
+
+ func makeUIView(context: Context) -> WKWebView {
+ let configuration = WKWebViewConfiguration()
+ configuration.userContentController.addScriptMessageHandler(Coordinator(), contentWorld: .page, name: "listener")
+ let webView = WKWebView(frame: .zero, configuration: configuration)
+ webView.isInspectable = true
+ return webView
+ }
+
+ func updateUIView(_ webView: WKWebView, context: Context) {
+ let request = URLRequest(url: url)
+ webView.load(request)
+ }
+}
+
+struct ContentView: View {
+ var body: some View {
+ let url = Bundle.main.url(forResource: "index", withExtension: "html")
+ WebView(url: url!)
+ }
+}
+
+struct ContentView_Previews: PreviewProvider {
+ static var previews: some View {
+ ContentView()
+ }
+}
+
+@main
+struct templateApp: App {
+ var body: some Scene {
+ WindowGroup {
+ ContentView()
+ }
+ }
+}
diff --git a/examples/common/ios/index.html b/examples/common/ios/index.html
new file mode 100644
index 0000000..40653b4
--- /dev/null
+++ b/examples/common/ios/index.html
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/common/ios/ios.mk b/examples/common/ios/ios.mk
new file mode 100644
index 0000000..06361d5
--- /dev/null
+++ b/examples/common/ios/ios.mk
@@ -0,0 +1,32 @@
+COMMON_DIR := ${ROOT_DIR}/../../common/ios
+
+COMMON_SOURCES := index.html app.swift native.mm app-Bridging-Header.h
+COMMON_SOURCES_IN := $(addprefix ${COMMON_DIR}/, ${COMMON_SOURCES})
+COMMON_SOURCES_OUT := $(addprefix build/gen/src/, ${COMMON_SOURCES})
+
+SOURCES := ${SOURCE} config.js
+SOURCES_IN := $(addprefix ${ROOT_DIR}/../src/, ${SOURCES})
+SOURCES_OUT := $(addprefix build/gen/src/, ${SOURCES})
+
+BUNDLE_NAME := $(shell echo ${NAME} | sed 's:_:-:g')
+
+all: ${COMMON_SOURCES_OUT} ${SOURCES_OUT} build/gen/${NAME}.xcodeproj
+
+${COMMON_SOURCES_OUT} ${SOURCES_OUT}: ${COMMON_SOURCES_IN} ${SOURCES_IN} | build/gen/src
+ cp $^ build/gen/src
+
+build/gen/${NAME}.xcodeproj: build/gen/project.yml
+ xcodegen generate --spec $^
+
+build/gen/project.yml: ${COMMON_DIR}/project.yml | build/gen
+ cat $^ | sed s:@NAME@:${NAME}:g | sed s:@BUNDLE_NAME@:${BUNDLE_NAME}:g > $@
+
+build/gen build/gen/src:
+ mkdir -p $@
+
+clean:
+ rm -fr build
+
+install:
+
+.PHONY: all clean install
diff --git a/examples/common/ios/native.mm b/examples/common/ios/native.mm
new file mode 100644
index 0000000..18c006c
--- /dev/null
+++ b/examples/common/ios/native.mm
@@ -0,0 +1,278 @@
+/*
+ * Brickworks
+ *
+ * Copyright (C) 2023 Orastron Srl unipersonale
+ *
+ * Brickworks is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * Brickworks is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Brickworks. If not, see .
+ *
+ * File author: Stefano D'Angelo, Paolo Marrone
+ */
+
+#include
+#include
+#include
+#define MINIAUDIO_IMPLEMENTATION
+#define MA_NO_RUNTIME_LINKING
+#include
+#include "config.h"
+
+#define BLOCK_SIZE 32
+#define NUM_BUFS (NUM_CHANNELS_IN > NUM_CHANNELS_OUT ? NUM_CHANNELS_IN : NUM_CHANNELS_OUT)
+
+ma_device device;
+#ifdef P_NOTE_ON
+CFStringRef midiClientName = NULL;
+MIDIClientRef midiClient = NULL;
+CFStringRef midiInputName = NULL;
+MIDIPortRef midiPort = NULL;
+#endif
+P_TYPE instance;
+float paramValues[NUM_PARAMETERS];
+float bufs[NUM_BUFS][BLOCK_SIZE];
+#if NUM_CHANNELS_IN != 0
+const float *inBufs[NUM_CHANNELS_IN];
+#endif
+float *outBufs[NUM_CHANNELS_OUT];
+std::mutex mutex;
+#ifdef P_MEM_REQ
+void *mem;
+#endif
+
+static void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount) {
+ (void)pDevice;
+#if NUM_CHANNELS_IN == 0
+ (void)pInput;
+#else
+ const float *x = reinterpret_cast(pInput);
+#endif
+ float *y = reinterpret_cast(pOutput);
+
+ if (mutex.try_lock()) {
+ for (int i = 0; i < NUM_PARAMETERS; i++)
+ if (config_parameters[i].out)
+ paramValues[i] = P_GET_PARAMETER(&instance, i);
+ else
+ P_SET_PARAMETER(&instance, i, paramValues[i]);
+ mutex.unlock();
+ }
+
+ ma_uint32 i = 0;
+ while (i < frameCount) {
+ ma_uint32 n = std::min(frameCount - i, static_cast(BLOCK_SIZE));
+
+ int l;
+#if NUM_CHANNELS_IN != 0
+ l = NUM_CHANNELS_IN * i;
+ for (ma_uint32 j = 0; j < n; j++)
+ for (int k = 0; k < NUM_CHANNELS_IN; k++, l++)
+ bufs[k][j] = x[l];
+#endif
+
+#if NUM_CHANNELS_IN != 0
+ P_PROCESS(&instance, inBufs, outBufs, n);
+#else
+ P_PROCESS(&instance, NULL, outBufs, n);
+#endif
+
+ l = NUM_CHANNELS_OUT * i;
+ for (ma_uint32 j = 0; j < n; j++)
+ for (int k = 0; k < NUM_CHANNELS_OUT; k++, l++)
+ y[l] = bufs[k][j];
+
+ i += n;
+ }
+}
+
+#ifdef P_NOTE_ON
+void (^midiNotifyBlock)(const MIDINotification *message) = ^(const MIDINotification *message) {
+ if (message->messageID != kMIDIMsgObjectAdded)
+ return;
+ const MIDIObjectAddRemoveNotification *n = reinterpret_cast(message);
+ MIDIEndpointRef endPoint = n->child;
+ MIDIPortConnectSource(midiPort, endPoint, NULL);
+};
+
+void (^midiReceiveBlock)(const MIDIEventList *evtlist, void *srcConnRefCon) = ^(const MIDIEventList *evtlist, void *srcConnRefCon) {
+ const MIDIEventPacket *p = evtlist->packet;
+ for (UInt32 i = 0; i < evtlist->numPackets; i++) {
+ for (UInt32 j = 0; j < p->wordCount; j++) {
+ UInt32 w = p->words[j];
+ if ((w & 0xf0000000) != 0x20000000)
+ continue;
+ switch (w & 0x00f00000) {
+ case 0x00900000:
+ mutex.lock();
+ P_NOTE_ON(&instance, (w & 0x0000ff00) >> 8, w & 0x000000ff);
+ mutex.unlock();
+ break;
+ case 0x00800000:
+ mutex.lock();
+ P_NOTE_OFF(&instance, (w & 0x0000ff00) >> 8);
+ mutex.unlock();
+ break;
+#ifdef P_PITCH_BEND
+ case 0x00e00000:
+ mutex.lock();
+ P_PITCH_BEND(&instance, ((w & 0x0000007f) << 7) | ((w & 0x00007f00) >> 8));
+ mutex.unlock();
+ break;
+#endif
+#ifdef P_MOD_WHEEL
+ case 0x00b00000:
+ if ((w & 0x0000ff00) == 0x00000100) {
+ mutex.lock();
+ P_MOD_WHEEL(&instance, w & 0x000000ff);
+ mutex.unlock();
+ }
+ break;
+#endif
+ }
+ }
+ p = MIDIEventPacketNext(p);
+ }
+};
+#endif
+
+extern "C"
+char audioStart() {
+#if NUM_CHANNELS_IN == 0
+ ma_device_config deviceConfig = ma_device_config_init(ma_device_type_playback);
+#else
+ ma_device_config deviceConfig = ma_device_config_init(ma_device_type_duplex);
+#endif
+ deviceConfig.periodSizeInFrames = BLOCK_SIZE;
+ deviceConfig.periods = 1;
+ deviceConfig.performanceProfile = ma_performance_profile_low_latency;
+ deviceConfig.noPreSilencedOutputBuffer = 1;
+ deviceConfig.noClip = 0;
+ deviceConfig.noDisableDenormals = 0;
+ deviceConfig.noFixedSizedCallback = 1;
+ deviceConfig.dataCallback = data_callback;
+ deviceConfig.capture.pDeviceID = NULL;
+ deviceConfig.capture.format = ma_format_f32;
+ deviceConfig.capture.channels = NUM_CHANNELS_IN;
+ deviceConfig.capture.shareMode = ma_share_mode_shared;
+ deviceConfig.playback.pDeviceID = NULL;
+ deviceConfig.playback.format = ma_format_f32;
+ deviceConfig.playback.channels = NUM_CHANNELS_OUT;
+ deviceConfig.playback.shareMode = ma_share_mode_shared;
+
+ if (ma_device_init(NULL, &deviceConfig, &device) != MA_SUCCESS)
+ goto err_device_init;
+
+#ifdef P_NOTE_ON
+ if (midiClientName == NULL) {
+ midiClientName = CFSTR("template");
+ if (midiClientName == NULL)
+ goto err_midiClientName;
+ }
+ if (midiClient == (MIDIClientRef)NULL) {
+ if (MIDIClientCreateWithBlock(midiClientName, &midiClient, midiNotifyBlock) != 0)
+ goto err_midiClientCreate;
+ }
+
+ if (midiInputName == NULL) {
+ midiInputName = CFSTR("Input");
+ if (midiInputName == NULL)
+ goto err_midiInputName;
+ }
+ if (midiPort == (MIDIPortRef)NULL) {
+ if (MIDIInputPortCreateWithProtocol(midiClient, midiInputName, kMIDIProtocol_1_0, &midiPort, midiReceiveBlock) != 0)
+ goto err_midiInputPort;
+
+ ItemCount n = MIDIGetNumberOfSources();
+ for (ItemCount i = 0; i < n; i++) {
+ MIDIEndpointRef endPoint = MIDIGetSource(i);
+ MIDIPortConnectSource(midiPort, endPoint, NULL);
+ }
+ }
+#endif
+
+ P_INIT(&instance);
+ P_SET_SAMPLE_RATE(&instance, (float)device.sampleRate);
+#ifdef P_MEM_REQ
+ size_t req = P_MEM_REQ(&instance);
+ if (req) {
+ mem = malloc(req);
+ if (mem == NULL)
+ goto err_mem_req;
+ P_MEM_SET(&instance, mem);
+ } else
+ mem = NULL;
+#endif
+
+ for (int i = 0; i < NUM_PARAMETERS; i++) {
+ paramValues[i] = config_parameters[i].defaultValueUnmapped;
+ if (!config_parameters[i].out)
+ P_SET_PARAMETER(&instance, i, paramValues[i]);
+ }
+
+ P_RESET(&instance);
+
+#if NUM_CHANNELS_IN != 0
+ for (int i = 0; i < NUM_CHANNELS_IN; i++)
+ inBufs[i] = bufs[i];
+#endif
+ for (int i = 0; i < NUM_CHANNELS_OUT; i++)
+ outBufs[i] = bufs[i];
+
+ if (ma_device_start(&device) != MA_SUCCESS)
+ goto err_device_start;
+
+ return 1;
+
+err_device_start:
+#ifdef P_MEM_REQ
+ free(mem);
+err_mem_req:
+#endif
+#ifdef P_FINI
+ P_FINI(&instance);
+#endif
+#ifdef P_NOTE_ON
+err_midiInputPort:
+err_midiInputName:
+err_midiClientCreate:
+err_midiClientName:
+#endif
+ ma_device_uninit(&device);
+err_device_init:
+ return 0;
+}
+
+extern "C"
+void audioStop() {
+#ifdef P_MEM_REQ
+ free(mem);
+#endif
+#ifdef P_FINI
+ P_FINI(&instance);
+#endif
+ ma_device_stop(&device);
+ ma_device_uninit(&device);
+}
+
+extern "C"
+void setParameter(int i, float v) {
+ mutex.lock();
+ paramValues[i] = v;
+ mutex.unlock();
+}
+
+extern "C"
+float getParameter(int i) {
+ mutex.lock();
+ float v = paramValues[i];
+ mutex.unlock();
+ return v;
+}
diff --git a/examples/common/ios/platform.h b/examples/common/ios/platform.h
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/examples/common/ios/platform.h
@@ -0,0 +1 @@
+
diff --git a/examples/common/ios/project.yml b/examples/common/ios/project.yml
new file mode 100644
index 0000000..57b978a
--- /dev/null
+++ b/examples/common/ios/project.yml
@@ -0,0 +1,20 @@
+name: @NAME@
+targets:
+ @NAME@:
+ platform: iOS
+ type: application
+ sources:
+ - path: src
+ settings:
+ base:
+ PRODUCT_BUNDLE_IDENTIFIER: com.orastron.@BUNDLE_NAME@
+ SWIFT_OBJC_BRIDGING_HEADER: src/app-Bridging-Header.h
+ HEADER_SEARCH_PATHS:
+ - ../../../src
+ - ../../../../common/ios
+ - ../../../../../include
+ - ../../../../../../miniaudio
+ info:
+ path: Info.plist
+ properties:
+ NSMicrophoneUsageDescription: Audio input access needed to run the example
diff --git a/examples/fx_ap1/ios/Makefile b/examples/fx_ap1/ios/Makefile
new file mode 100644
index 0000000..6609b9f
--- /dev/null
+++ b/examples/fx_ap1/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_ap1
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_ap2/ios/Makefile b/examples/fx_ap2/ios/Makefile
new file mode 100644
index 0000000..c6cae1e
--- /dev/null
+++ b/examples/fx_ap2/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_ap2
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_balance/ios/Makefile b/examples/fx_balance/ios/Makefile
new file mode 100644
index 0000000..0aca644
--- /dev/null
+++ b/examples/fx_balance/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_balance
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_bitcrush/ios/Makefile b/examples/fx_bitcrush/ios/Makefile
new file mode 100644
index 0000000..9f0734c
--- /dev/null
+++ b/examples/fx_bitcrush/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_bitcrush
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_chorus/ios/Makefile b/examples/fx_chorus/ios/Makefile
new file mode 100644
index 0000000..fdb8a02
--- /dev/null
+++ b/examples/fx_chorus/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_chorus
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_clip/ios/Makefile b/examples/fx_clip/ios/Makefile
new file mode 100644
index 0000000..ea3a3df
--- /dev/null
+++ b/examples/fx_clip/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_clip
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_comb/ios/Makefile b/examples/fx_comb/ios/Makefile
new file mode 100644
index 0000000..14ad6b6
--- /dev/null
+++ b/examples/fx_comb/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_comb
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_comp/ios/Makefile b/examples/fx_comp/ios/Makefile
new file mode 100644
index 0000000..9766a11
--- /dev/null
+++ b/examples/fx_comp/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_comp
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_delay/ios/Makefile b/examples/fx_delay/ios/Makefile
new file mode 100644
index 0000000..469bdbd
--- /dev/null
+++ b/examples/fx_delay/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_delay
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_dist/ios/Makefile b/examples/fx_dist/ios/Makefile
new file mode 100644
index 0000000..a19583f
--- /dev/null
+++ b/examples/fx_dist/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_dist
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_drive/ios/Makefile b/examples/fx_drive/ios/Makefile
new file mode 100644
index 0000000..2e12f9b
--- /dev/null
+++ b/examples/fx_drive/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_drive
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_eq_3band/ios/Makefile b/examples/fx_eq_3band/ios/Makefile
new file mode 100644
index 0000000..da70967
--- /dev/null
+++ b/examples/fx_eq_3band/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_eq_3band
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_flanger/ios/Makefile b/examples/fx_flanger/ios/Makefile
new file mode 100644
index 0000000..178378e
--- /dev/null
+++ b/examples/fx_flanger/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_flanger
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_fuzz/ios/Makefile b/examples/fx_fuzz/ios/Makefile
new file mode 100644
index 0000000..9921bf2
--- /dev/null
+++ b/examples/fx_fuzz/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_fuzz
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_hp1/ios/Makefile b/examples/fx_hp1/ios/Makefile
new file mode 100644
index 0000000..d57132b
--- /dev/null
+++ b/examples/fx_hp1/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_hp1
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_hs1/ios/Makefile b/examples/fx_hs1/ios/Makefile
new file mode 100644
index 0000000..39e233c
--- /dev/null
+++ b/examples/fx_hs1/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_hs1
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_lp1/ios/Makefile b/examples/fx_lp1/ios/Makefile
new file mode 100644
index 0000000..1f433af
--- /dev/null
+++ b/examples/fx_lp1/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_lp1
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_ls1/ios/Makefile b/examples/fx_ls1/ios/Makefile
new file mode 100644
index 0000000..24e5210
--- /dev/null
+++ b/examples/fx_ls1/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_ls1
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_mm1/ios/Makefile b/examples/fx_mm1/ios/Makefile
new file mode 100644
index 0000000..5365ea2
--- /dev/null
+++ b/examples/fx_mm1/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_mm1
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_mm2/ios/Makefile b/examples/fx_mm2/ios/Makefile
new file mode 100644
index 0000000..4b7399b
--- /dev/null
+++ b/examples/fx_mm2/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_mm2
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_noise_gate/ios/Makefile b/examples/fx_noise_gate/ios/Makefile
new file mode 100644
index 0000000..0eb278a
--- /dev/null
+++ b/examples/fx_noise_gate/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_noise_gate
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_notch/ios/Makefile b/examples/fx_notch/ios/Makefile
new file mode 100644
index 0000000..aff439d
--- /dev/null
+++ b/examples/fx_notch/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_notch
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_one_pole/ios/Makefile b/examples/fx_one_pole/ios/Makefile
new file mode 100644
index 0000000..ef659ee
--- /dev/null
+++ b/examples/fx_one_pole/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_one_pole
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_pan/ios/Makefile b/examples/fx_pan/ios/Makefile
new file mode 100644
index 0000000..5aaa1dc
--- /dev/null
+++ b/examples/fx_pan/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_pan
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_phaser/ios/Makefile b/examples/fx_phaser/ios/Makefile
new file mode 100644
index 0000000..b381d49
--- /dev/null
+++ b/examples/fx_phaser/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_phaser
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_reverb/ios/Makefile b/examples/fx_reverb/ios/Makefile
new file mode 100644
index 0000000..33bb326
--- /dev/null
+++ b/examples/fx_reverb/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_reverb
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_satur/ios/Makefile b/examples/fx_satur/ios/Makefile
new file mode 100644
index 0000000..49a85c9
--- /dev/null
+++ b/examples/fx_satur/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_satur
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_slew_lim/ios/Makefile b/examples/fx_slew_lim/ios/Makefile
new file mode 100644
index 0000000..d5428ce
--- /dev/null
+++ b/examples/fx_slew_lim/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_slew_lim
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_svf/ios/Makefile b/examples/fx_svf/ios/Makefile
new file mode 100644
index 0000000..11800c7
--- /dev/null
+++ b/examples/fx_svf/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_svf
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_trem/ios/Makefile b/examples/fx_trem/ios/Makefile
new file mode 100644
index 0000000..29f0fc0
--- /dev/null
+++ b/examples/fx_trem/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_trem
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_vibrato/ios/Makefile b/examples/fx_vibrato/ios/Makefile
new file mode 100644
index 0000000..f35dfec
--- /dev/null
+++ b/examples/fx_vibrato/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_vibrato
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fx_wah/ios/Makefile b/examples/fx_wah/ios/Makefile
new file mode 100644
index 0000000..4390299
--- /dev/null
+++ b/examples/fx_wah/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fx_wah
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_ap1/ios/Makefile b/examples/fxpp_ap1/ios/Makefile
new file mode 100644
index 0000000..b5c951e
--- /dev/null
+++ b/examples/fxpp_ap1/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_ap1
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_ap2/ios/Makefile b/examples/fxpp_ap2/ios/Makefile
new file mode 100644
index 0000000..83db85e
--- /dev/null
+++ b/examples/fxpp_ap2/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_ap2
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_balance/ios/Makefile b/examples/fxpp_balance/ios/Makefile
new file mode 100644
index 0000000..d684703
--- /dev/null
+++ b/examples/fxpp_balance/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_balance
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_bitcrush/ios/Makefile b/examples/fxpp_bitcrush/ios/Makefile
new file mode 100644
index 0000000..490946b
--- /dev/null
+++ b/examples/fxpp_bitcrush/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_bitcrush
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_chorus/ios/Makefile b/examples/fxpp_chorus/ios/Makefile
new file mode 100644
index 0000000..0cebb28
--- /dev/null
+++ b/examples/fxpp_chorus/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_chorus
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_clip/ios/Makefile b/examples/fxpp_clip/ios/Makefile
new file mode 100644
index 0000000..a8b29ff
--- /dev/null
+++ b/examples/fxpp_clip/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_clip
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_comb/ios/Makefile b/examples/fxpp_comb/ios/Makefile
new file mode 100644
index 0000000..39de890
--- /dev/null
+++ b/examples/fxpp_comb/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_comb
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_comp/ios/Makefile b/examples/fxpp_comp/ios/Makefile
new file mode 100644
index 0000000..c2521d1
--- /dev/null
+++ b/examples/fxpp_comp/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_comp
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_delay/ios/Makefile b/examples/fxpp_delay/ios/Makefile
new file mode 100644
index 0000000..124b6df
--- /dev/null
+++ b/examples/fxpp_delay/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_delay
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_dist/ios/Makefile b/examples/fxpp_dist/ios/Makefile
new file mode 100644
index 0000000..e0d74ea
--- /dev/null
+++ b/examples/fxpp_dist/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_dist
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_drive/ios/Makefile b/examples/fxpp_drive/ios/Makefile
new file mode 100644
index 0000000..648584c
--- /dev/null
+++ b/examples/fxpp_drive/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_drive
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_eq_3band/ios/Makefile b/examples/fxpp_eq_3band/ios/Makefile
new file mode 100644
index 0000000..a42026f
--- /dev/null
+++ b/examples/fxpp_eq_3band/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_eq_3band
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_flanger/ios/Makefile b/examples/fxpp_flanger/ios/Makefile
new file mode 100644
index 0000000..5e8dfcc
--- /dev/null
+++ b/examples/fxpp_flanger/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_flanger
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_fuzz/ios/Makefile b/examples/fxpp_fuzz/ios/Makefile
new file mode 100644
index 0000000..1b4cc0a
--- /dev/null
+++ b/examples/fxpp_fuzz/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_fuzz
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_hp1/ios/Makefile b/examples/fxpp_hp1/ios/Makefile
new file mode 100644
index 0000000..45d9387
--- /dev/null
+++ b/examples/fxpp_hp1/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_hp1
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_hs1/ios/Makefile b/examples/fxpp_hs1/ios/Makefile
new file mode 100644
index 0000000..fc60e06
--- /dev/null
+++ b/examples/fxpp_hs1/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_hs1
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_lp1/ios/Makefile b/examples/fxpp_lp1/ios/Makefile
new file mode 100644
index 0000000..8fe9110
--- /dev/null
+++ b/examples/fxpp_lp1/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_lp1
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_ls1/ios/Makefile b/examples/fxpp_ls1/ios/Makefile
new file mode 100644
index 0000000..f5b44db
--- /dev/null
+++ b/examples/fxpp_ls1/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_ls1
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_mm1/ios/Makefile b/examples/fxpp_mm1/ios/Makefile
new file mode 100644
index 0000000..a69aa55
--- /dev/null
+++ b/examples/fxpp_mm1/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_mm1
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_mm2/ios/Makefile b/examples/fxpp_mm2/ios/Makefile
new file mode 100644
index 0000000..81d1471
--- /dev/null
+++ b/examples/fxpp_mm2/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_mm2
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_noise_gate/ios/Makefile b/examples/fxpp_noise_gate/ios/Makefile
new file mode 100644
index 0000000..ed97cee
--- /dev/null
+++ b/examples/fxpp_noise_gate/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_noise_gate
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_notch/ios/Makefile b/examples/fxpp_notch/ios/Makefile
new file mode 100644
index 0000000..44e0856
--- /dev/null
+++ b/examples/fxpp_notch/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_notch
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_one_pole/ios/Makefile b/examples/fxpp_one_pole/ios/Makefile
new file mode 100644
index 0000000..9a03479
--- /dev/null
+++ b/examples/fxpp_one_pole/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_one_pole
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_pan/ios/Makefile b/examples/fxpp_pan/ios/Makefile
new file mode 100644
index 0000000..b1a4841
--- /dev/null
+++ b/examples/fxpp_pan/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_pan
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_phaser/ios/Makefile b/examples/fxpp_phaser/ios/Makefile
new file mode 100644
index 0000000..a9a1227
--- /dev/null
+++ b/examples/fxpp_phaser/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_phaser
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_reverb/ios/Makefile b/examples/fxpp_reverb/ios/Makefile
new file mode 100644
index 0000000..dbff83d
--- /dev/null
+++ b/examples/fxpp_reverb/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_reverb
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_satur/ios/Makefile b/examples/fxpp_satur/ios/Makefile
new file mode 100644
index 0000000..a14e6c3
--- /dev/null
+++ b/examples/fxpp_satur/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_satur
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_slew_lim/ios/Makefile b/examples/fxpp_slew_lim/ios/Makefile
new file mode 100644
index 0000000..1013e5d
--- /dev/null
+++ b/examples/fxpp_slew_lim/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_slew_lim
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_svf/ios/Makefile b/examples/fxpp_svf/ios/Makefile
new file mode 100644
index 0000000..b3d89a0
--- /dev/null
+++ b/examples/fxpp_svf/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_svf
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_trem/ios/Makefile b/examples/fxpp_trem/ios/Makefile
new file mode 100644
index 0000000..562a986
--- /dev/null
+++ b/examples/fxpp_trem/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_trem
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_vibrato/ios/Makefile b/examples/fxpp_vibrato/ios/Makefile
new file mode 100644
index 0000000..2a8c9d2
--- /dev/null
+++ b/examples/fxpp_vibrato/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_vibrato
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/fxpp_wah/ios/Makefile b/examples/fxpp_wah/ios/Makefile
new file mode 100644
index 0000000..8632511
--- /dev/null
+++ b/examples/fxpp_wah/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_fxpp_wah
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/synth_mono/ios/Makefile b/examples/synth_mono/ios/Makefile
new file mode 100644
index 0000000..4fd3a38
--- /dev/null
+++ b/examples/synth_mono/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_synth_mono
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/synth_poly/ios/Makefile b/examples/synth_poly/ios/Makefile
new file mode 100644
index 0000000..c984ed4
--- /dev/null
+++ b/examples/synth_poly/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_synth_poly
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/synth_simple/ios/Makefile b/examples/synth_simple/ios/Makefile
new file mode 100644
index 0000000..63da0c4
--- /dev/null
+++ b/examples/synth_simple/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_synth_simple
+SOURCE := ${NAME}.c
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/synthpp_mono/ios/Makefile b/examples/synthpp_mono/ios/Makefile
new file mode 100644
index 0000000..a1d8bf1
--- /dev/null
+++ b/examples/synthpp_mono/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_synthpp_mono
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/synthpp_poly/ios/Makefile b/examples/synthpp_poly/ios/Makefile
new file mode 100644
index 0000000..be438f0
--- /dev/null
+++ b/examples/synthpp_poly/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_synthpp_poly
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk
diff --git a/examples/synthpp_simple/ios/Makefile b/examples/synthpp_simple/ios/Makefile
new file mode 100644
index 0000000..66b8403
--- /dev/null
+++ b/examples/synthpp_simple/ios/Makefile
@@ -0,0 +1,6 @@
+ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
+
+NAME := bw_example_synthpp_simple
+SOURCE := ${NAME}.cpp
+
+include ${ROOT_DIR}/../../common/ios/ios.mk