{"id":13603589,"url":"https://github.com/WeirdConstructor/HexoSynth","last_synced_at":"2025-04-11T22:31:46.954Z","repository":{"id":39341136,"uuid":"338775346","full_name":"WeirdConstructor/HexoSynth","owner":"WeirdConstructor","description":"A FLOSS (Open Source) hexagonal modular synthesizer plugin.","archived":false,"fork":false,"pushed_at":"2024-01-04T12:33:08.000Z","size":5429,"stargazers_count":236,"open_issues_count":3,"forks_count":8,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-04-10T13:11:30.780Z","etag":null,"topics":["audio","audioplugin","jackaudio","linuxaudio","modular-synth","modular-synthesizers","modularsynth","modularsynthesis","music","rust","synthesizer","vst2"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WeirdConstructor.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2021-02-14T10:04:46.000Z","updated_at":"2025-04-05T19:22:39.000Z","dependencies_parsed_at":"2024-01-04T13:39:10.351Z","dependency_job_id":"a8a25b49-4b90-457b-a039-e6823116f67a","html_url":"https://github.com/WeirdConstructor/HexoSynth","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WeirdConstructor%2FHexoSynth","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WeirdConstructor%2FHexoSynth/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WeirdConstructor%2FHexoSynth/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WeirdConstructor%2FHexoSynth/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WeirdConstructor","download_url":"https://codeload.github.com/WeirdConstructor/HexoSynth/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248489698,"owners_count":21112620,"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","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":["audio","audioplugin","jackaudio","linuxaudio","modular-synth","modular-synthesizers","modularsynth","modularsynthesis","music","rust","synthesizer","vst2"],"created_at":"2024-08-01T19:00:26.180Z","updated_at":"2025-04-11T22:31:45.077Z","avatar_url":"https://github.com/WeirdConstructor.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# HexoSynth - A hexagonal modular synthesizer\n\n[![Build](https://github.com/WeirdConstructor/HexoSynth/actions/workflows/build.yml/badge.svg)](https://github.com/WeirdConstructor/HexoSynth/actions/workflows/build.yml)\n\nThis project aims to create a modular synthesizer plugin (VST3, CLAP). Like\nthose encountered in projects like VCVRack or Bitwig's Grid.\n\nThe core idea is having a hexagonal tile map for laying out module\ninstances and connect them at the edges to route audio signals and control signals\nto inputs of other modules.\n\nA goal is to provide a simple wireless environment to build\nsound effects, synthesizers or whole generative music patches from\npredefined modules.\n\nHosting plugins (VST, LV2, ...) is out of the scope of this project.\nThe goal is rather to have a good set of predefined modules.\n\nHere is a screenshot of how it looks:\n\n![HexoSynth Screenshot from 2022-09-11](https://github.com/WeirdConstructor/HexoSynth/raw/master/screenshots/2022-09-11_08-07.png)\n\n## State of Development\n\nSince June 2022 the project is under heavy development again.  A rewrite of\nHexoTK took longer than anticipated, but provides all required features now.\nAll development currently takes place on the \"master\" branch, so don't be surprised\nif something does not work. As of\n2022-08-16 most of the functionality from end of 2021 has been rewritten and\nnew features and polish are being added right now for the next release.\n\nIf you want to stay up to date, follow my devlog:\n\n- https://m8geil.de/posts/hexosynth-1/\n- https://m8geil.de/posts/hexosynth-2/\n- https://m8geil.de/posts/hexosynth-3/\n- https://m8geil.de/posts/hexosynth-4/\n- https://m8geil.de/posts/hexosynth-5/\n- https://m8geil.de/posts/hexosynth-6/\n- https://m8geil.de/posts/hexosynth-7/\n- https://m8geil.de/posts/hexosynth-8/\n- https://m8geil.de/posts/hexosynth-9/\n- https://m8geil.de/posts/hexosynth-10/\n- https://m8geil.de/posts/hexosynth-11/\n- https://m8geil.de/posts/hexosynth-12/\n- for an up to date list, look here: https://m8geil.de/tags/hexosynth/\n\nMake sure to follow [Weird Constructors Mastodon\naccount](https://mastodon.online/@weirdconstructor) or the releases of this\nproject to be notified once I release a beta or stable release.\n\nIf you want to do chat, feel free to join the RustAudio Discord / Community\nhere: https://rust.audio/\n\n### Rough Code Structure\n\nHexoSynth leaves all GUI logic to the scripting language\n[WLambda](http://wlambda.m8geil.de/), which is an easily embeddable scripting\nlanguage for Rust. All higher level functionality will be realised in WLambda.\nAs well as the test suite for the GUI.\n\nThe Rust code contains all the low level functionality, such as the DSP code,\nthe hexagonal grid data structure and the implementation of all the GUI\nwidgets.\n\nThe scripting language code will be linked into the HexoSynth application at\ncompile time. The goal is to deploy a single binary. But you could load the\nWLambda code from a different place using an environment variable later.\n\nIn the process of developing HexoSynth I developed a series of crates (aka libraries)\nthat factor out some generic parts to be reusable by someone else maybe:\n\n- [HexoDSP - The DSP backend of HexoSynth](https://github.com/WeirdConstructor/HexoDSP)\n- [HexoTK - The GUI toolkit of HexoSynth](https://github.com/WeirdConstructor/HexoTK)\n- [SynFx-DSP - A collection of DSP functions and tools to support HexoDSP](https://github.com/WeirdConstructor/synfx-dsp)\n- [SynFx-DSP-JIT - A DSP JIT (just in time) compiler for the WBlockDSP visual langauge](https://github.com/WeirdConstructor/synfx-dsp-jit)\n\n### Implemented Features\n\n- A useable GUI with highly features parameter knobs and\na hexagonal module/node matrix that is easily changeable with the mouse.\n- Serialization/Deserialization of patches is implemented in the VST3/CLAP plugins\nand can be managed by the DAW.\n- Signal monitors for the selected node.\n- Per node and output signal feedback LEDs.\n- A simple Tracker to edit \"TSeq\" sequences.\n- A primitive sample selection browser.\n- Prototype of the WBlockDSP visual programming language for DIY DSP nodes inside HexoSynth.\n\nAnd following DSP nodes:\n\n| Category | Name | Function |\n|-|-|-|\n| IO Util | Out         | Audio output (to DAW or Jack) |\n| Osc     | Sampl       | Sample player |\n| Osc     | Sin         | Sine oscillator |\n| Osc     | BOsc        | Basic bandlimited waveform oscillator (waveforms: Sin, Tri, Saw, Pulse/Square) |\n| Osc     | VOsc        | Vector phase shaping oscillator |\n| Osc     | Noise       | Noise oscillator |\n| Osc     | FormFM      | Formant oscillator based on FM synthesis |\n| Signal  | Amp         | Amplifier/Attenuator |\n| Signal  | SFilter     | Simple collection of filters, useable for synthesis |\n| Signal  | FVaFilt     | Collection of virtual analog filters (Moog, EDP Wasp, Korg MS20) |\n| Signal  | Delay       | Single tap signal delay |\n| Signal  | PVerb       | Reverb node, based on Dattorros plate reverb algorithm |\n| Signal  | AllP        | All-Pass filter based on internal delay line feedback |\n| Signal  | Comb        | Comb filter |\n| N-\\\u003eM   | Mix3        | 3 channel mixer |\n| N-\\\u003eM   | Mux9        | 9 channel to 1 output multiplexer/switch |\n| Ctrl    | SMap        | Simple control signal mapper |\n| Ctrl    | Map         | Control signal mapper |\n| Ctrl    | CQnt        | Control signal pitch quantizer |\n| Ctrl    | Quant       | Pitch signal quantizer |\n| Mod     | TSeq        | Tracker/pattern sequencer |\n| Mod     | Ad          | Attack-Decay (AD) envelope |\n| Mod     | Adsr        | Attack-Decay-Sustain-Release (ADSR) envelope |\n| Mod     | TsLFO       | Tri/Saw waveform low frequency oscillator (LFO) |\n| Mod     | RndWk       | Random walker, a Sample \u0026 Hold noise generator |\n| IO Util | FbWr / FbRd | Utility modules for feedback in patches |\n| IO Util | Scope       | Oscilloscope for up to 3 channels |\n| IO Util | MidiP       | MIDI Pitch/Note input from plugin host, DAW or hardware |\n| IO Util | MidiCC      | MIDI CC input from plugin host, DAW or hardware |\n| IO Util | ExtA - ExtF | Access to plugin parameter sets A to F |\n\n### Road Map / TODO List\n\nI have a pretty detailed TODO list in my private notebook, but\nthis is the rough road map:\n\n- DONE: Make a UI that is more or less fluently usable and easily extendable\nwith new modules.\n- DONE: Take a bit of care that there is online help.\n- DONE: Factor out the DSP code into it's own crate.\n- DONE: Redo the UI with performance optimized and overhauled HexoTK.\n- DONE: Rebuild the UI logic of HexoSynth from 2021 with WLambda.\n- Add preset/patch management to the UI.\n- Add lots (many more than above listed) of modules (Oscillators, Filters, Envelopes, LFOs, Quantizers, ...).\n- Add a MIDI-Ctrl interface for receiving pitch control signals, gate and clock from the DAW\n- Add parameter input node for receiving automation from the DAW\n- Add audio inputs for receiving audio from the DAW\n- Comment the code for easier maintenance.\n\n## Building and Dependencies\n\nYou might need following dependencies (Ubuntu Linux):\n\n    sudo apt install libjack0 libjack-jackd2-dev qjackctl libx11-xcb-dev\n    sudo apt install libxcb-icccm4-dev libxcb-dri3-dev\n\nYou might need following dependencies (Ubuntu 20.04 Linux):\n\n    sudo apt install libgl1-mesa-dev libjack-jackd2-dev qjackctl libxcursor-dev\n    sudo apt install libx11-xcb-dev libxcb-icccm4-dev libxcb-dri2-0-dev libxcb-dri3-dev\n\nThese might work on Debian too:\n\n    sudo apt install libjack0 libjack-dev libx11-xcb-dev libxcb-icccm4-dev libxcb-dri2-dev\n\n### Compiling the VST3 and CLAP plugins\n\nCompile:\n\n    $ cargo +nightly xtask bundle hexosynth_plug --release\n\nInstall:\n\n    $ cp -vfr target/bundled/hexosynth_plug.vst3 ~/.vst3/\n    $ cp -vfr target/bundled/hexosynth_plug.clap ~/.vst3/\n\n### Running the CPAL Standalone Example\n\nCPAL is a generic audio device abstraction library. It should work\non most systems.\n\nCompile and run:\n\n    $ cargo +nightly run --release --bin hexosynth_cpal\n\n### Running the Jack Standalone Example\n\nJACK Audio Connection Kit is a sound server API, which allows\nmultiple audio applications to communicate with each other.\n\nCompile and run:\n\n    $ cargo +nightly run --release --bin hexosynth_jack\n\n## DAW Compatibility\n\nAs of 2022-08-15 HexoSynth has been tested with:\n\n    - Ubuntu Linux 20.04 and Bitwig: Works\n    - Ubuntu Linux 20.04 and Renoise: Works\n    - Ubuntu Linux 20.04 and Reaper: Works, except Keyboard support\n    - Ubuntu Linux 20.04 and Ardour: Works\n\n## Known Bugs\n\n* The ones you encounter and create as issues on GitHub.\n\n## Credits\n\n- Dimas Leenman (aka Skythedragon) contributed the `FormFM` node.\n- Frederik Halkjær (aka Fredemus, aka RocketPhysician) contributed the DSP algorithms\nfor the `FVaFilt` virtual analog filter node.\n\n## Contributions\n\nI currently have a quite precise vision of what I want to achieve and my goal\nis to make music with this project eventually.\n\nThe projects is still young, and I currently don't have that much time to\ndevote for project coordination. So please don't be offended if your issue rots\nin the GitHub issue tracker, or your pull requests is left dangling around\nfor ages.\n\nI might merge pull requests if I find the time and think that the contributions\nare in line with my vision.\n\nPlease bear in mind, that I can only accept contributions under the License\nof this project (GPLv3 or later).\n\n### Help\n\nIf you want to help this project:\n\n- **Samples**: Find drum or synth samples that I can publish in HexoSynth. I would love\nto provide a drum kit with default sounds that is always available.\n- **Binaries**: Build Windows and/or Mac OS binaries: I've decided that I won't build windows binaries\nanymore. I don't like supporting the whole Apple \u0026 Micosoft vendor lock-in directly.\nHowever, I would be fine putting links to your binaries on my release pages\nor the HexoSynth README. Given that the binaries are current enough.\n- **More DSP nodes/modules**: Implement more DSP nodes: You could extend [HexoDSP](https://github.com/WeirdConstructor/HexoDSP)\nwith new DSP implementations. Just reach out to me via Discord/IRC/Mastodon or Github\nissue to discus the name of the new node.\nI wrote up a little guide to get you started here:\nRefer to the [HexoDSP API Documentation - DSP node implementation guide](http://m8geil.de/hexodsp_doc/hexodsp/dsp/index.html).\n\n## Contact the Author\n\nYou can reach me via Discord ( WeirdConstructor#7936 ), Mastodon (\n@weirdconstructor@mastodon.online ) or IRC. I'm joined most public Rust Discord\nservers, especially the \"Rust Audio\" Discord server. And I am also on IRC on\nthe network [Libera.Chat](https://libera.chat/) in the `#lad` channel (nick `wct`).\n\nIf you don't have means to access any of them, you can alternatively\nsend me a Github issue.\n\nDon't use E-Mail, I only read them irregularly, and I might miss yours completely.\n\n## License\n\nThis project is licensed under the GNU General Public License Version 3 or\nlater.\n\nThe fonts DejaVuSerif.ttf and DejaVuSansMono.ttf under the license:\n\n    Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.\n    Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)\n\n### Why GPL?\n\nPicking a license for my code bothered me for a long time. I read many\ndiscussions about this topic. Read the license explanations. And discussed\nthis matter with other developers.\n\nFirst about _why I write code for free_ at all, the reasons are:\n\n- It's my passion to write computer programs. In my free time I can\nwrite the code I want, when I want and the way I want. I can freely\nallocate my time and freely choose the projects I want to work on.\n- To help a friend or member of my family.\n- To solve a problem I have.\n- To learn something new.\n\nThose are the reasons why I write code for free. Now the reasons\n_why I publish the code_, when I could as well keep it to myself:\n\n- So that it may bring value to users and the free software community.\n- Show my work as an artist.\n- To get into contact with other developers.\n- To exchange knowledge and help other developers.\n- And it's a nice change to put some more polish on my private projects.\n\nMost of those reasons don't yet justify GPL. The main point of the GPL, as far\nas I understand: The GPL makes sure the software stays free software until\neternity. That the _end user_ of the software always stays in control. That the users\nhave the means to adapt the software to new platforms or use cases.\nEven if the original authors don't maintain the software anymore.\nIt ultimately prevents _\"vendor lock in\"_. I really dislike vendor lock in,\nespecially as developer. Especially as developer I want and need to stay\nin control of the computers and software I use.\n\nAnother point is, that my work (and the work of any other developer) has a\nvalue. If I give away my work without _any_ strings attached, I effectively\nwork for free. This compromises the price I (and potentially other developers)\ncan demand for the skill, workforce and time.\n\nThis makes two reasons for me to choose the GPL:\n\n1. I do not want to support vendor lock in scenarios for free.\n   I want to prevent those when I have a choice, when I invest my private\n   time to bring value to the end users.\n2. I don't want to low ball my own (and other developer's) wage and prices\n   by giving away the work I spent my scarce private time on with no strings\n   attached. I do not want companies to be able to use it in closed source\n   projects to drive a vendor lock in scenario.\n\nWe can discuss relicensing of my code or project if you are interested in using\nit in a closed source project. Bear in mind, that I can only relicense the\nparts of the project I wrote. If the project contains GPL code from other\nprojects and authors, I can't relicense it.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FWeirdConstructor%2FHexoSynth","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FWeirdConstructor%2FHexoSynth","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FWeirdConstructor%2FHexoSynth/lists"}