Wavetable is a polyphonic wavetable synthesizer audio plugin (VST3, AU, CLAP, LV2, Standalone) built with **JUCE** and the **Gin** framework. It's developed by SocaLabs (Roland Rabien).
- **Version**: 1.0.34 (tracked in `VERSION` file)
- **Language**: C++20
- **Build system**: CMake (minimum 3.24)
- **Bundle ID**: `com.socalabs.wavetable`
## Repository Structure
```
Wavetable/
├── CMakeLists.txt # Main build config
├── CMakePresets.json # Presets: xcode (macOS), vs (Windows), ninja-gcc (Linux)
├── VERSION # Current version string
├── Changelist.txt # Version history (used by release.sh)
├── release.sh # GitHub release script
├── tag.sh # Tags current VERSION and pushes
├── plugin/
│ ├── Source/
│ │ ├── PluginProcessor.h/cpp # Main processor (WavetableAudioProcessor)
- **`gradientRect()`** helper — vertical linear gradient fill
### Custom LookAndFeel
The project uses `gin::CopperLookAndFeel` by default (set in `gin_processor.cpp`). Colors can be overridden per-component via `findColour()`.
**Important**: `ParamHeader::paint()` is **private** and has hardcoded font size and gradient colors. To customize header appearance, you must edit `gin_parambox.h` directly in the submodule. This is a local modification that will be overwritten on `git submodule update`.
2. Add changelog entry in `Changelist.txt` under the version
3. Commit and push
4. Run `./tag.sh` — tags `v{VERSION}` and pushes the tag
5. GitHub Actions (`release.yaml`) builds installers for all platforms
6. `release.sh` creates a GitHub release and uploads to socalabs.com
## Submodule Notes
The Gin submodule is pinned at commit `414fecf`. Local modifications to Gin files (e.g., `gin_parambox.h`, `gin_copperlookandfeel.cpp`) are intentional and should not be committed to the submodule. Be aware that `git submodule update` will overwrite these changes.
## Coding Conventions
- Standard JUCE/Gin code style (camelCase methods, PascalCase classes)
- `gin::Parameter::Ptr` for all synth parameters
- `gin::ParamBox` subclassed for each UI section
- Parameters defined as nested structs in `WavetableAudioProcessor` (e.g., `OSCParams`, `FilterParams`)
- No comments unless explicitly requested
- Build with `-ffast-math -fno-finite-math-only` on macOS/Release
## Common Tasks
### Changing header label appearance
Edit `modules/gin/modules/gin_plugin/components/gin_parambox.h` → `ParamHeader::paint()`. The font and gradient are hardcoded there.
### Changing header gradient colors
Edit `modules/gin/modules/gin_plugin/lookandfeel/gin_copperlookandfeel.cpp` → `title1ColourId` / `title2ColourId` in constructor.
### Adding new parameters
1. Add to the relevant Params struct in `PluginProcessor.h`
2. Initialize in `PluginProcessor.cpp` (`setup()` method)
3. Add UI control in the appropriate Box class in `Panels.h`
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\
Everyone is permitted to copy and distribute verbatim copies\
\pard\widctlpar\sa720\qj\cf1\expndtw0\kerning0\fs21\line READ THE FOLLOWING LICENCE AGREEMENT CAREFULLY! IT CONTAINS VERY IMPORTANT INFORMATION ABOUT YOUR RIGHTS AND OBLIGATIONS, AS WELL AS LIMITATIONS AND EXCLUSIONS THAT MAY APPLY TO YOU. THIS DOCUMENT CONTAINS A DISPUTE RESOLUTION CLAUSE. BY CLICKING ON THE "ACCEPT" BUTTON, YOU ARE CONSENTING TO BE BOUND BY AND ARE BECOMING A PARTY TO THIS AGREEMENT. IF YOU DO NOT AGREE TO ALL OF THE TERMS OF THIS AGREEMENT, CLICK THE "DO NOT ACCEPT" BUTTON OR LEAVE THE WEBSITE.\par
of this license document, but changing it is not allowed.\
software and other kinds of works, specifically designed to ensure\
\widctlpar\fi-360\li360\qj\cf1\b0\fs21 "We", "Our" and "Us" means SocaLabs.\par
cooperation with the community in the case of network server software.\
{\pntext\f0 2.\tab}"You" and "Your" means the person or entity who is being licenced to use the Licenced Software.\par
\
{\pntext\f0 3.\tab}"Agreement" means this Software Licence Agreement between Us and You;\par
The licenses for most software and other practical works are designed\
{\pntext\f0 4.\tab}"Licenced Materials" means the Licenced Software and the Licenced Library;\par
to take away your freedom to share and change the works. By contrast,\
{\pntext\f0 5.\tab}"Licenced Software" means certain commercial software products being provided to You under this Agreement, including executable program modules thereof, as well as related documentation, and computer readable media;\par
our General Public Licenses are intended to guarantee your freedom to\
{\pntext\f0 6.\tab}"Sub-Licenced Software" means certain third party owned software components being provided under this Agreement that are required to properly enable or operate the Licenced Software; and\par
share and change all versions of a program--to make sure it remains free\
{\pntext\f0 7.\tab}"Licenced Library" means any audio waveforms, such as melodies, music, instrument recordings, or other audible information, provided by Us for use with the Licenced Software.\par
software for all its users.\
\
\pard\widctlpar\li360\qj\par
When we speak of free software, we are referring to freedom, not\
\par
price. Our General Public Licenses are designed to make sure that you\
have the freedom to distribute copies of free software (and charge for\
\pard\widctlpar\sa120\qj\cf2\b\fs33 2. Software Licence, Rights and Restrictions\par
them if you wish), that you receive source code or can get it if you\
want it, that you can change the software or use pieces of it in new\
\pard
free programs, and that you know you can do these things.\
{\listtext\f0 1.\tab}\jclisttab\tx720\ls1\widctlpar\fi-360\li360\qj\cf1\b0\fs21 Subject to the provisions contained in this Agreement, We hereby grant to You a personal, revocable, non-exclusive licence (the "Licence") to access, read, use and download one copy of the Licenced Materials solely for the purposes provided under paragraph 3. This is not a transfer of title.\par
\
{\listtext\f0 2.\tab}Under the Licence you may not and shall not, without Our express written authorization:\par
Developers that use our General Public Licenses protect your rights\
with two steps: (1) assert copyright on the software, and (2) offer\
\pard
you this License which gives you legal permission to copy, distribute\
{\listtext\f0 a.\tab}\jclisttab\tx720\ls1\ilvl1\widctlpar\fi-360\li1080\qj own title, or transfer title to the Licenced Materials to another party;\par
and/or modify the software.\
{\listtext\f0 b.\tab}transfer the Licence;\par
\
{\listtext\f0 c.\tab}remove any copyright or other proprietary notations from the Licenced Materials;\par
A secondary benefit of defending all users' freedom is that\
{\listtext\f0 d.\tab}distribute, or sublicense or otherwise provide copies of or access to the Licenced Materials to any third party;\par
improvements made in alternate versions of the program, if they\
{\listtext\f0 e.\tab}pledge, hypothecate, alienate or otherwise encumber the Licenced Materials to any third party;\par
receive widespread use, become available for other developers to\
{\listtext\f0 f.\tab}create derivative works of, reverse engineer, decompile, disassemble, adapt, translate, transmit, arrange, modify, copy, bundle, sell, sublicense, export, merge, transfer, adapt, loan, rent, lease, assign, share, outsource, host, publish, make available to any person or otherwise use, either directly or indirectly, the Licenced Materials;\par
incorporate. Many developers of free software are heartened and\
{\listtext\f0 g.\tab}permit, allow or do anything that would infringe or otherwise prejudice the proprietary rights of Us or Our licensors;\par
encouraged by the resulting cooperation. However, in the case of\
{\listtext\f0 h.\tab}circumvent, remove, alter or otherwise impair any technological protection measures, digital rights management information, or other copy-protection mechanisms used in or by the Licenced Materials; or\par
software used on network servers, this result may fail to come about.\
{\listtext\f0 i.\tab}include, use, re-sample, mix, process, isolate or embed any content from the Licenced Library in any virtual instrument, audio sampling system, audio playback system or library of any kind, other than those provided or authorized by Us.\par
The GNU General Public License permits making a modified version and\
letting the public access it on a server without ever releasing its\
\pard
source code to the public.\
{\listtext\f0 3.\tab}\jclisttab\tx720\ls1\widctlpar\fi-360\li360\qj We are not obligated to provide any authorization referred to in paragraph 2(2), We reserve the right to charge a fee for the grant of such authorization, and We may cancel such authorization at Our sole and unfettered discretion by providing notice to You of such cancellation.\par
\
{\listtext\f0 4.\tab}The restrictions set out in this Agreement, including the restrictions listed at paragraph 2(2), shall not apply to the limited extent the restrictions are prohibited by applicable law.\par
The GNU Affero General Public License is designed specifically to\
{\listtext\f0 5.\tab}We will have the right to inspect and enforce the restrictions and covenants contained in this Agreement at Your sole expense, and You hereby agree to promptly notify Us of any known violations of such restrictions.\par
ensure that, in such cases, the modified source code becomes available\
{\listtext\f0 6.\tab}You agree to protect the Licenced Materials from unauthorized use, reproduction, distribution or publication in electronic or physical form.\par
to the community. It requires the operator of a network server to\
{\listtext\f0 7.\tab}Upon execution of this Agreement, We will:\par
provide the source code of the modified version running there to the\
users of that server. Therefore, public use of a modified version, on\
\pard
a publicly accessible server, gives the public access to the source\
{\listtext\f0 a.\tab}\jclisttab\tx720\ls1\ilvl1\widctlpar\fi-360\li1080\qj permit You to download a copy of the Licenced Materials for Your use under this Agreement; and\par
code of the modified version.\
{\listtext\f0 b.\tab}permit You to download updates to the Licenced Software as We consider needed. We are not obligated to provide updates for the Licenced Software.\par
\
An older license, called the Affero General Public License and\
\pard\widctlpar\li1080\qj\par
published by Affero, was designed to accomplish similar goals. This is\
\par
a different license, not a version of the Affero GPL, but Affero has\
released a new version of the Affero GPL which permits relicensing under\
\widctlpar\fi-360\li360\qj\cf1\b0\fs21 You are authorized to use the Licenced Materials only for personal use. Your personal use may be commercial.\par
\
{\pntext\f0 2.\tab}You may not rent out to others equipment on which the Licenced Software is installed or by which the Licenced Library is accessible without obtaining a written rental licence from Us that expressly authorizes such use. We reserve the right to charge a fee for a rental licence.\par
TERMS AND CONDITIONS\
{\pntext\f0 3.\tab}You may install the Licenced Software on as many devices as required for Your personal use provided such devices are used only by You.\par
\
0. Definitions.\
\pard\widctlpar\qj\par
\
"This License" refers to version 3 of the GNU Affero General Public License.\
\pard\widctlpar\li360\qj\par
\
"Copyright" also means copyright-like laws that apply to other kinds of\
\pard\widctlpar\sa120\qj\cf2\b\fs33 4. Ownership and Intellectual Property Rights\par
works, such as semiconductor masks.\
\
\pard
"The Program" refers to any copyrightable work licensed under this\
License. Each licensee is addressed as "you". "Licensees" and\
\widctlpar\fi-360\li360\qj\cf1\b0\fs21 All copyright in the Licenced Software, including any documentation, media, packaging and illustrations, but excluding the Sublicensed Software, is owned by Us. You do not acquire title to any copyright in the Licenced Materials or Sublicensed Software under this Agreement.\par
"recipients" may be individuals or organizations.\
{\pntext\f0 2.\tab}Certain logos, product names and trade-marks owned by Us or by third parties may be contained within the Licenced Materials or in documentation, media, packaging and illustrations relating to the Licensed Software. You do not acquire title to any such logos, product names or trade-marks under this Agreement.\par
\
To "modify" a work means to copy from or adapt all or part of the work\
\pard\widctlpar\li360\qj\par
in a fashion requiring copyright permission, other than the making of an\
\par
exact copy. The resulting work is called a "modified version" of the\
earlier work or a work "based on" the earlier work.\
\widctlpar\fi-360\li360\qj\cf1\b0\fs21 This Agreement is effective until terminated by Us, with or without cause, in Our sole and unfettered discretion. We may terminate this Agreement without notice to You if You fail to comply with any of its terms. Any such termination by Us shall be in addition to and without prejudice to such rights and remedies as may be available to Us, including injunction and other equitable remedies.\par
To "propagate" a work means to do anything with it that, without\
{\pntext\f0 2.\tab}The disclaimers, limitations on liability, ownership, termination, interpretation, Your warranty and the indemnity provisions of this Agreement shall survive the termination or expiry of this Agreement.\par
permission, would make you directly or secondarily liable for\
{\pntext\f0 3.\tab}This Agreement will automatically terminate if You violate or assist in the violation of any of the restrictions of paragraph 2(2).\par
infringement under applicable copyright law, except executing it on a\
{\pntext\f0 4.\tab}On the termination of this Agreement, you must destroy any copies of the Licenced Materials in your possession whether in electronic or printed format.\par
computer or modifying a private copy. Propagation includes copying,\
distribution (with or without modification), making available to the\
\pard\widctlpar\li360\qj\par
public, and in some countries other activities as well.\
\par
\
To "convey" a work means any kind of propagation that enables other\
parties to make or receive copies. Mere interaction with a user through\
a computer network, with no transfer of a copy, is not conveying.\
\pard\widctlpar\sa720\qj\cf1\b0\fs21 You agree to indemnify, defend and hold Us and Our partners, lawyers, staff, affiliates, successors and assigns (collectively, \ldblquote Affiliated Parties\rdblquote ) harmless from any liability, loss, claim and expense, including reasonable legal fees, related to Your violation of this Agreement or use of the Licenced Materials.\par
\
An interactive user interface displays "Appropriate Legal Notices"\
\pard\widctlpar\sa120\qj\cf2\b\fs33 7. Disclaimer and Limitation of Liability\par
to the extent that it includes a convenient and prominently visible\
feature that (1) displays an appropriate copyright notice, and (2)\
\pard
tells the user that there is no warranty for the work (except to the\
extent that warranties are provided), that licensees may convey the\
\widctlpar\fi-360\li360\qj\cf1\b0\fs21 THE LICENCED MATERIALS ARE PROVIDED "AS IS", "AS AVAILABLE" AND ALL WARRANTIES, EXPRESS OR IMPLIED, ARE DISCLAIMED (INCLUDING BUT NOT LIMITED TO THE DISCLAIMER OF ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE). THE LICENCED MATERIALS MAY CONTAIN BUGS, ERRORS, PROBLEMS OR OTHER LIMITATIONS. WE AND OUR AFFILIATED PARTIES HAVE NO LIABILITY WHATSOEVER FOR YOUR USE OF ANY OF THE MATERIALS. IN PARTICULAR, BUT NOT AS A LIMITATION THEREOF, WE AND THE AFFILIATED PARTIES ARE NOT LIABLE FOR ANY INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING DAMAGES FOR LOSS OF BUSINESS, LOSS OF PROFITS, LITIGATION OR THE LIKE), WHETHER BASED ON BREACH OF CONTRACT, BREACH OF WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THE NEGATION OF DAMAGES SET FORTH ABOVE ARE FUNDAMENTAL ELEMENTS OF THE BASIS OF THE BARGAIN BETWEEN YOU AND US. THE LICENCED MATERIALS WOULD NOT BE PROVIDED WITHOUT SUCH LIMITATIONS.\par
work under this License, and how to view a copy of this License. If\
{\pntext\f0 2.\tab}All responsibility or liability for any damages caused by the Licenced Materials, including, without limitation, damages caused by computer viruses or other malicious code contained within the Licenced Software is disclaimed.\par
the interface presents a list of user commands or options, such as a\
menu, a prominent item in the list meets this criterion.\
\pard\widctlpar\li360\qj\par
\
\par
1. Source Code.\
\
\pard\widctlpar\sa120\qj\cf2\b\fs33 8. Use of Information\par
The "source code" for a work means the preferred form of the work\
for making modifications to it. "Object code" means any non-source\
\pard\widctlpar\sa720\qj\cf1\b0\fs21 We reserve the right, and You authorize Us, to the use and assignment of all information regarding Your use of the Licenced Materials and all information provided by You in any manner consistent with Our Privacy Policy.\par
is widely used among developers working in that language.\
\widctlpar\fi-360\li360\qj\cf1\b0\fs21 This Agreement shall be treated as though it were executed and performed in the province of British Columbia, Canada, and shall be governed by and construed in accordance with the laws of the province of British Columbia (without regard to conflict of law principles).\par
\
{\pntext\f0 2.\tab}Any of Your causes of action with respect to the Licenced Materials must be instituted within six (6) months after the cause of action arose or be forever waived and barred. All actions shall be subject to the limitations set forth in paragraph 7 of this Agreement.\par
The "System Libraries" of an executable work include anything, other\
{\pntext\f0 3.\tab}The language in this Agreement shall be interpreted as to its fair meaning and not construed strictly for or against either party. The division of this Agreement into sections and the insertion of headings are for convenience of reference only and shall not affect the construction or interpretation of this Agreement.\par
than the work as a whole, that (a) is included in the normal form of\
{\pntext\f0 4.\tab}All legal proceedings arising out of or in connection with this Agreement shall be brought solely in Vancouver, British Columbia. You expressly submit to the exclusive jurisdiction of said courts and consent to extra-territorial service of process.\par
packaging a Major Component, but which is not part of that Major\
{\pntext\f0 5.\tab}Should any part of this Agreement be held invalid or unenforceable, that portion shall be construed consistent with applicable law and the remaining portions shall remain in full force and effect.\par
Component, and (b) serves only to enable use of the work with that\
{\pntext\f0 6.\tab}Failure of Us to enforce any provision of this Agreement shall not be deemed a waiver of such provision nor of the right to enforce such provision.\par
Major Component, or to implement a Standard Interface for which an\
{\pntext\f0 7.\tab}You agree to review this Agreement prior to downloading, copying, installing or using the Licenced Materials. This Agreement may be amended by Us from time to time without specific advance notice to You. The latest Agreement will be provided with updates to the Licenced Software, and You should review the Agreement prior to using the Licenced Materials.\par
implementation is available to the public in source code form. A\
{\pntext\f0 8.\tab}This Agreement, as modified from time to time as described above, and including the policies incorporated by reference, constitutes the entire and only agreement between You and Us and supersedes all prior or contemporaneous agreements, representations, warranties and understandings with respect to the Licenced Materials.\par
"Major Component", in this context, means a major essential component\
{\pntext\f0 9.\tab}To the extent that anything in or associated with the Licenced Materials is in conflict or inconsistent with this Agreement, this Agreement shall take precedence.\par
(kernel, window system, and so on) of the specific operating system\
(if any) on which the executable work runs, or a compiler used to\
\pard\widctlpar\sa160\sl252\slmult1\cf0\fs22\par
produce the work, or an object code interpreter used to run it.\