{"id":20010608,"url":"https://github.com/bradhowes/lpf","last_synced_at":"2025-09-14T23:57:48.835Z","repository":{"id":43657793,"uuid":"275667890","full_name":"bradhowes/LPF","owner":"bradhowes","description":"AUv3 AudioUnit low-pass filter for iOS and macOS","archived":false,"fork":false,"pushed_at":"2024-11-29T11:02:23.000Z","size":5701,"stargazers_count":17,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-05-04T20:40:56.279Z","etag":null,"topics":["audiounit","auv3","garageband","ios","macos","swift5"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bradhowes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"bradhowes"}},"created_at":"2020-06-28T21:04:40.000Z","updated_at":"2024-12-26T17:50:07.000Z","dependencies_parsed_at":"2024-10-27T22:50:59.380Z","dependency_job_id":"2aea5c02-9c18-41fc-af40-836951f0bb3f","html_url":"https://github.com/bradhowes/LPF","commit_stats":null,"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/bradhowes/LPF","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bradhowes%2FLPF","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bradhowes%2FLPF/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bradhowes%2FLPF/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bradhowes%2FLPF/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bradhowes","download_url":"https://codeload.github.com/bradhowes/LPF/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bradhowes%2FLPF/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275185375,"owners_count":25419919,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-14T02:00:10.474Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audiounit","auv3","garageband","ios","macos","swift5"],"created_at":"2024-11-13T07:20:45.459Z","updated_at":"2025-09-14T23:57:48.797Z","avatar_url":"https://github.com/bradhowes.png","language":"Swift","funding_links":["https://github.com/sponsors/bradhowes"],"categories":[],"sub_categories":[],"readme":"[![CI](https://github.com/bradhowes/LPF/actions/workflows/CI.yml/badge.svg)](https://github.com/bradhowes/LPF/actions/workflows/CI.yml)\n[![Swift 6](https://img.shields.io/badge/Swift-6-orange.svg?style=flat)](https://swift.org)\n[![Swift 5.9](https://img.shields.io/badge/Swift-5.9-orange.svg?style=flat)](https://swift.org)\n[![AUv3](https://img.shields.io/badge/AUv3-green.svg)](https://developer.apple.com/documentation/audiotoolbox/audio_unit_v3_plug-ins)\n[![License: MIT](https://img.shields.io/badge/License-MIT-A31F34.svg)](https://opensource.org/licenses/MIT)\n\n![](macOS/App/Assets.xcassets/AppIcon.appiconset/256px.png)\n\n# About SimplyLowPass\n\nThis project is an adaptation of Apple's [Creating Custom Audio\nEffects](https://developer.apple.com/documentation/audiotoolbox/audio_unit_v3_plug-ins/creating_custom_audio_effects)\nproject. Much has been retooled for a better experience and code understanding, as well as various bug fixes. You can\nfind Apple's original README [here](Documentation/APPLE_README.md)\n\nThe gist is still the same as in the original:\n\n* use an Objective-C/C++ kernel for audio sample manipulation in the render thread\n* provide a tiny Objective-C interface to the kernel for Swift access\n* perform all UI and most audio unit work in Swift on the main thread\n* communicate between kernel and UI using AUParameterTree\n\nUnlike Apple's example, this one uses the [Accelerate](https://developer.apple.com/documentation/accelerate)\nframework to perform the filtering (Apple's code clearly shows you what the Biquadratic IIR filter does, just in\na slightly less performant way).\n\nThe code was developed in Xcode 11.5 on macOS 10.15.5. I have tested on both macOS and iOS devices primarily in\nGarageBand and Logic, but also using test hosts on both devices as well as the excellent\n[AUM](https://apps.apple.com/us/app/aum-audio-mixer/id1055636344) app on iOS.\n\nFinally, it passes all\n[auval](https://developer.apple.com/library/archive/documentation/MusicAudio/Conceptual/AudioUnitProgrammingGuide/AudioUnitDevelopmentFundamentals/AudioUnitDevelopmentFundamentals.html)\ntests. (`auval -v aufx lpas BRay`)\n\nIf you are interested in making your own AUv3 components, feel free to fork this and adapt to your needs. However a\nbetter option might be to check out my [AUv3Template](https://github.com/bradhowes/AUv3Template) repo which provides the\nsame base functionality in iOS and macOS but allows for easier customization via the included `build.py` Python script.\n\n## Demo Targets\n\nThe macOS and iOS apps are simple AUv3 hosts that demonstrate the functionality of the AUv3 component. In the AUv3\nworld, an app serves as a delivery mechanism for an app extension like AUv3. When the app is installed, the operating\nsystem will also install and register any app extensions found in the app.\n\nThe `SimplyLowPass` apps attempt to instantiate the AUv3 component and wire it up to an audio file player and the output\nspeaker. When it runs, you can play the sample file and manipulate the filter settings -- cutoff frequency in the\nhorizontal direction and resonance in the vertical. There are also a collection of factory presets that you can choose\nwhich will apply canned settings. On macOS these are available via the `Presets` menu; on iOS there is a segment control\nthat you can touch to change to a given factory preset.\n\nFinally, the AUv3 component supports user-defined presets, and the simple host apps offer a way to create, update, \nrename, and delete them. On macOS, these functions are at the top of the `Presets` menu, followed by the factory\npresets, and then any user-defined presets (there is also a button on the window that shows the same menu). The iOS app\noffers the same functionality in a pop-up menu to the right of the factory presets segmented control.\n\n## Code Layout\n\nBoth [macOS](macOS) and [iOS](iOS) have the same code layout:\n\n* `App` -- code and configuration for the application that hosts the AUv3 app extension. Again, the app serves as a \ndemo host for the AUv3 app extension.\n* `Extension` -- code and configuration for the extension itself\n\nThe common code is found in various Swift packages under [Packages](Packages) -- including the Objective-C++ kernel\ncode. There are six packages:\n\n* [Kernel](Packages/Sources/Kernel) -- holds the signal processing kernel that does the rendering\n* [KernelBridge](Packages/Sources/KernelBridge) -- a tiny Objective-C class for Swift bridging\n* [ParameterAddress](Packages/Sources/ParameterAddress) -- holds the parameter IDs and definitions for\nthe kernel controls\n* [Parameters](Packages/Sources/Parameters) -- holds the parameter collection which includes the list of factory presets\n* [Theme](Packages/Sources/Theme) -- some attributes that affect the display of the app and app extensions.\n* [UI](Packages/Sources/UI) -- the graphical display for the kernel used by both the macOS and iOS extensions\n\nThe apps and AUv3 app extensions depend on my Swift package [AUv3Support](https://github.com/bradhowes/AUv3Support)\nwhich provides a common AUv3 hosting environment for both iOS and macOS as well as a common infrastructure for any AUv3\nfilter component.\n\n# Examples\n\nHere is LPF shown running in GarageBand on macOS:\n\n![](Documentation/GarageBand1.png)\n\nFor the LPF AUv3 Audio Unit to be available for use in GarageBand or any other Audio Unit \"host\" application,\nthe LPF app must be built and (probably) run. The macOS will detect the app extension declared in the app, and\nregister it for use by any other application that wants to work with AUv3 Audio Unit components.\n\nThe same applies to iOS Audio Units. First, build and then run the app on a device (simulators can run the app,\nbut you won't be able to run GarageBand or AUM there.) Next, fire up your host app, and you should be able to\nadd LPF as a signal processing effect.\n\n![](Documentation/GarageBand2.jpg)\n\nOn GarageBand for iOS, there are three buttons in blue at the bottom of the AudioUnit view. The one on the left\n(\"Warm\") shows the current preset, and clicking on it will let you change it or let you save the current\nsettings to a new one. The two buttons on the right let you show an alternate control view (one provided by\nGarageBand itself), and expand the existing view to use the entire height of the display.\n\n![](Documentation/GarageBand3.jpg)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbradhowes%2Flpf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbradhowes%2Flpf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbradhowes%2Flpf/lists"}