├── .github └── workflows │ └── build.yml ├── .gitignore ├── .gitmodules ├── LICENSE ├── Makefile ├── README.md ├── VERSION ├── docs ├── user-files-1.png └── user-files-2.png ├── mod-desktop.png ├── pedalboards ├── Bata_Back_Track.pedalboard │ ├── Bata_Back_Track.ttl │ ├── addressings.json │ ├── manifest.ttl │ ├── screenshot.png │ ├── snapshots.json │ └── thumbnail.png ├── GSYNTH_Bass.pedalboard │ ├── GSYNTH_Bass.ttl │ ├── addressings.json │ ├── effect-121 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-131 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-137 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-138 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-139 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-66 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-69 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-78 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-79 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-87 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── manifest.ttl │ ├── snapshots.json │ └── thumbnail.png ├── GSYNTH_Chords-22439.pedalboard │ ├── GSYNTH_Chords.ttl │ ├── addressings.json │ ├── effect-121 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-125 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-130 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-66 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-69 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-78 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-79 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-87 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── manifest.ttl │ ├── snapshots.json │ └── thumbnail.png ├── GSYNTH_Flexible.pedalboard │ ├── GSYNTH_Flexible.ttl │ ├── addressings.json │ ├── effect-121 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-125 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-126 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-66 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-69 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-72 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-74 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-77 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-78 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-79 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-81 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-87 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-88 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-89 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-91 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-92 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-93 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-94 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-95 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── manifest.ttl │ ├── snapshots.json │ └── thumbnail.png ├── GSYNTH_Lead.pedalboard │ ├── GSYNTH_Lead.ttl │ ├── addressings.json │ ├── effect-121 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-137 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-140 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-66 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-69 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-78 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-79 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── effect-87 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── manifest.ttl │ ├── snapshots.json │ └── thumbnail.png ├── GSYNTH_Minimal.pedalboard │ ├── GSYNTH_Minimal.ttl │ ├── addressings.json │ ├── effect-66 │ │ ├── effect.ttl │ │ └── manifest.ttl │ ├── manifest.ttl │ ├── snapshots.json │ └── thumbnail.png └── INFO_USEFUL_TIPS-15734.pedalboard │ ├── INFO_USEFUL_TIPS.ttl │ ├── addressings.json │ ├── effect-18 │ ├── effect.ttl │ └── manifest.ttl │ ├── effect-19 │ ├── effect.ttl │ └── manifest.ttl │ ├── effect-20 │ ├── effect.ttl │ └── manifest.ttl │ ├── effect-4 │ ├── effect.ttl │ └── manifest.ttl │ ├── effect-5 │ ├── effect.ttl │ └── manifest.ttl │ ├── effect-7 │ ├── effect.ttl │ └── manifest.ttl │ ├── effect-9 │ ├── effect.ttl │ └── manifest.ttl │ ├── manifest.ttl │ ├── snapshots.json │ └── thumbnail.png ├── res ├── mod-logo.icns ├── mod-logo.ico └── mod-logo.svg ├── src ├── plugin │ ├── AudioRingBuffer.hpp │ ├── ChildProcess.hpp │ ├── DesktopPlugin.cpp │ ├── DesktopUI.cpp │ ├── DistrhoPluginInfo.h │ ├── Makefile │ ├── NanoButton.cpp │ ├── NanoButton.hpp │ ├── ResizeHandle.hpp │ ├── SharedMemory.hpp │ ├── utils.cpp │ ├── utils.hpp │ └── zita-resampler │ │ ├── resampler-table.cc │ │ ├── resampler-table.h │ │ ├── resampler.cc │ │ └── resampler.h └── systray │ ├── Makefile │ ├── main.cpp │ ├── mod-desktop.hpp │ ├── mod-desktop.qrc │ ├── mod-desktop.rc │ ├── mod-desktop.ui │ ├── utils.cpp │ ├── utils.hpp │ └── widgets.hpp └── utils ├── cxfreeze ├── mod-pedalboard-setup.py ├── mod-pedalboard.py ├── mod-ui-setup.py └── mod-ui.py ├── debug ├── jackd └── mod-ui ├── jack ├── jack-session-alsamidi.conf └── jack-session.conf ├── linux ├── linux-tar.sh ├── mod-desktop.desktop ├── mod-desktop.run └── mod-hardware-descriptor.json ├── macos ├── app.plist.in ├── build.plist ├── entitlements.plist ├── macos-dmg.sh ├── macos-pkg.sh ├── mod-hardware-descriptor.json ├── package.xml.in └── welcome.txt ├── pack-html.sh ├── plugin-builder ├── plugin-builder.mk ├── plugin-builder.sh └── validate-plugins.sh ├── run.sh └── win64 ├── mod-hardware-descriptor.json ├── win64-installer.iss ├── win64-installer.sh └── win64-zip.sh /.gitignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /build-*/ 3 | .DS_Store 4 | *.dll 5 | *.dmg 6 | *.exe 7 | *.o 8 | *.pkg 9 | *.tar.gz 10 | *.zip 11 | qrc_*.hpp 12 | ui_*.hpp 13 | /src/systray/mod-desktop 14 | /utils/win64/win64-pedalboards.iss 15 | /utils/win64/win64-plugins.iss 16 | /utils/win64/win64-version.iss 17 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "src/mod-desktop-asio"] 2 | path = src/mod-desktop-asio 3 | url = https://github.com/wineasio/wineasio.git 4 | [submodule "src/mod-host"] 5 | path = src/mod-host 6 | url = https://github.com/moddevices/mod-host.git 7 | [submodule "src/mod-midi-merger"] 8 | path = src/mod-midi-merger 9 | url = https://github.com/moddevices/mod-midi-merger.git 10 | [submodule "src/mod-plugin-builder"] 11 | path = src/mod-plugin-builder 12 | url = https://github.com/moddevices/mod-plugin-builder.git 13 | [submodule "src/mod-ui"] 14 | path = src/mod-ui 15 | url = https://github.com/moddevices/mod-ui.git 16 | [submodule "src/PawPaw"] 17 | path = src/PawPaw 18 | url = https://github.com/DISTRHO/PawPaw.git 19 | [submodule "src/DPF"] 20 | path = src/DPF 21 | url = https://github.com/DISTRHO/DPF.git 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MOD Desktop 2 | 3 | **MOD Audio is on the desktop!** 4 | 5 | This is the source code repository for MOD Desktop, a little tool by [MOD Audio](https://mod.audio/) that combines all the goodies from MOD for the desktop platform packaged in a convenient installer. 6 | 7 | ![screenshot](mod-desktop.png "mod-desktop") 8 | 9 | What this actually means is that you get a virtual pedalboard setup in a node/patchbay-like fashion, where you load "pedals" which are basically just LV2 audio plugins. 10 | Everything is drag & drop based, so you drop plugins from the bottom plugin bar into the main pedalboard view (called "constructor") and then drag & drop output-facing cables into either other plugins or the right side of the constructor. 11 | Unlike typical physical pedalboards where the signal flows from right to left, on MOD Desktop the signal flows from left to right as that is more common on desktop UIs. 12 | 13 | See [https://wiki.mod.audio/wiki/MOD_Web_GUI_User_Guide](https://wiki.mod.audio/wiki/MOD_Web_GUI_User_Guide) for a more in-depth explanation of UI details, though please note a few things will not be the same due to platform differences. 14 | 15 | ## Download 16 | 17 | MOD Desktop has builds for: 18 | 19 | - Linux x86_64 20 | - macOS universal (Intel + Apple Sillicon) 21 | - Windows 64bit 22 | 23 | You can find them in the [releases section](https://github.com/moddevices/mod-desktop/releases). 24 | 25 | These downloads contain both MOD Desktop and a couple of plugins ready for usage. 26 | 27 | ## Installing 28 | 29 | Installation depends on your operating system. 30 | 31 | For **Linux** systems we currently provide a binary tarball, you just extract and run the startup script inside. 32 | Eventually we want to have MOD Desktop under Flathub, please get in touch if you want to help make that happen. 33 | 34 | For **macOS** we provide a signed pkg installer, compatible with both Intel and Apple Sillicon systems. 35 | Double-click the package to install. 36 | After installation you can find "MOD Desktop" under your "Applications" folder. 37 | 38 | And finally for **Windows** there is a simple installer executable, that shows an installer wizard as typical for most Windows applications. 39 | 40 | ## Usage 41 | 42 | By default MOD Desktop will show you as few controls as possible, to not get in the way. 43 | You just need to pick a soundcard you wish to use and press "Start". 44 | This will start up the audio engine and (local) web service that manages the session and plugins. 45 | 46 | Once the engine is running, click the "Open Web GUI" button to open the MOD UI view in your default web browser. 47 | NOTE: even though this uses a web browser, the page is being served locally; the use of web technologies is an intentional design choice for making the UI cross-platform compatible. 48 | 49 | If anything fails you can enable debug logs in the "GUI Options" section, that might provide some information. 50 | 51 | MOD Desktop will close to the "system tray" by default, but this can also be changed in the "GUI Options". 52 | 53 | ### Handling files 54 | 55 | There are a few plugins on the MOD platform, like AIDA-X and NAM, that load external files. 56 | On their GUIs they will list the files as available under $Documents/MOD Desktop/user-files directory (the actual file path depends on the operating system). 57 | 58 | You are meant to copy the files you wish to load into the relevant directory for them. 59 | For convenience, MOD Desktop includes a "Open User Files" button that will automatically open your file explorer in the directory dedicated to such files. 60 | So when wishing to load NAM models for the "Neural Amp Modeller" plugin for example, simply copy your model files into the "NAM Models" subdirectory. 61 | 62 | ![screenshot](docs/user-files-1.png "user-files-1") 63 | 64 | ![screenshot](docs/user-files-2.png "user-files-2") 65 | 66 | ## Current status 67 | 68 | At this point this tool should be considered in beta state. 69 | Most things already work but we are still tweaking and fixing a lot, specially due to MOD related software and plugins never been tested on Windows systems before. 70 | Feedback and testing is very much appreciated, make sure to report issues you find during your own testing. 71 | When reporting issues make sure to create 1 ticket per issue, and give some information about your system (what OS and version, what soundcard you use) 72 | 73 | Current known issues: 74 | 75 | - Handling of Windows filepaths is not always correct (differences between POSIX vs Windows path separators) 76 | - When mod-host crashes it will stop the UI process, instead of being automatically restarted like in MOD units 77 | 78 | ## Development 79 | 80 | If you want to contribute, here are a few items where help would be appreciated: 81 | 82 | - Debugging and fixing Windows specific issues within mod-ui (*) 83 | - Documentation regarding "universal" ASIO drivers, like ASIO4ALL and FlexASIO, and how to set them nicely for MOD Desktop 84 | 85 | (*) Note: on Windows the default installation has html/css/js files in `C:\Program Files\MOD Desktop\html` and python files in `C:\Program Files\MOD Desktop\mod`, which can be directly modified, making it very easy and convenient to try out any changes. 86 | 87 | Also help in these areas, but they are much more involved: 88 | - Create a JACK-API-compatible node-based audio graph, to be used for eventually running "mod-desktop as a plugin" (there are a few opensource libs for this already, like the one included in miniaudio) 89 | - Create a virtual sound device for macOS that can send audio into a JACK client, similar to JACK-Router and WineASIO projects 90 | 91 | ## License 92 | 93 | MOD Desktop is licensed under AGPLv3+, see [LICENSE](LICENSE) for more details. 94 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | 0.0.13 2 | -------------------------------------------------------------------------------- /docs/user-files-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/docs/user-files-1.png -------------------------------------------------------------------------------- /docs/user-files-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/docs/user-files-2.png -------------------------------------------------------------------------------- /mod-desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/mod-desktop.png -------------------------------------------------------------------------------- /pedalboards/Bata_Back_Track.pedalboard/addressings.json: -------------------------------------------------------------------------------- 1 | { 2 | "/bpm": [ 3 | { 4 | "instance": "/graph/echo", 5 | "port": "ldelay", 6 | "label": "L Delay", 7 | "minimum": 0.5, 8 | "maximum": 48, 9 | "steps": 19, 10 | "tempo": true, 11 | "dividers": 5.333, 12 | "page": null 13 | }, 14 | { 15 | "instance": "/graph/echo", 16 | "port": "rhaasdelay", 17 | "label": "Right Haas Delay", 18 | "minimum": 0.5, 19 | "maximum": 48, 20 | "steps": 19, 21 | "tempo": true, 22 | "dividers": 2.666, 23 | "page": null 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /pedalboards/Bata_Back_Track.pedalboard/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix ingen: . 2 | @prefix lv2: . 3 | @prefix pedal: . 4 | @prefix rdfs: . 5 | 6 | 7 | lv2:prototype ingen:GraphPrototype ; 8 | a lv2:Plugin , 9 | ingen:Graph , 10 | pedal:Pedalboard ; 11 | rdfs:seeAlso . 12 | -------------------------------------------------------------------------------- /pedalboards/Bata_Back_Track.pedalboard/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/pedalboards/Bata_Back_Track.pedalboard/screenshot.png -------------------------------------------------------------------------------- /pedalboards/Bata_Back_Track.pedalboard/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/pedalboards/Bata_Back_Track.pedalboard/thumbnail.png -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-121/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo . 12 | 13 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-121/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-131/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """Page 1: VCO (Oscillator) 14 | Page 2: VCF (Filter) 15 | Page 3: VCA / Dynamics 16 | Page 4: FX (Delay, Reverb)""" ; 17 | "33"^^xsd:int 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-131/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-137/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """FLTR > 14 | 15 | 16 | 17 | FLTR <""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-137/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-138/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """LFO>PWM 14 | 15 | LFO>VCO""" ; 16 | "48"^^xsd:int 17 | ] . 18 | 19 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-138/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-139/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """LFO>VCF 14 | 15 | KEY>VCF 16 | 17 | DYN>VCF""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-139/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-66/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "30.0"^^xsd:float ; 14 | "0.0"^^xsd:float ; 15 | "4609"^^xsd:int ; 16 | "-1"^^xsd:int ; 17 | "1.0"^^xsd:float 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-66/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-69/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "30.0"^^xsd:float ; 14 | "0.0"^^xsd:float ; 15 | "4609"^^xsd:int ; 16 | "-1"^^xsd:int ; 17 | "1.0"^^xsd:float 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-69/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-78/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """FILTER > 14 | """ ; 15 | "48"^^xsd:int 16 | ] . 17 | 18 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-78/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-79/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """KEY>VCF 14 | 15 | 16 | 17 | DYN > VCF""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-79/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-87/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """DYN > VCA 14 | 15 | 16 | 17 | FIX > VCA""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/effect-87/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix ingen: . 2 | @prefix lv2: . 3 | @prefix pedal: . 4 | @prefix rdfs: . 5 | 6 | 7 | lv2:prototype ingen:GraphPrototype ; 8 | a lv2:Plugin , 9 | ingen:Graph , 10 | pedal:Pedalboard ; 11 | rdfs:seeAlso . 12 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Bass.pedalboard/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/pedalboards/GSYNTH_Bass.pedalboard/thumbnail.png -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-121/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo . 12 | 13 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-121/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-125/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """LFO WAVE 14 | LFO RATE 15 | LFO>VCF 16 | """ ; 17 | "48"^^xsd:int 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-125/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-130/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """Page 1: VCO (Oscillator) 14 | Page 2: VCF (Filter) 15 | Page 3: VCA / Dynamics 16 | Page 4: FX (Delay, Reverb)""" ; 17 | "33"^^xsd:int 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-130/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-66/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "30.0"^^xsd:float ; 14 | "0.0"^^xsd:float ; 15 | "4609"^^xsd:int ; 16 | "-1"^^xsd:int ; 17 | "1.0"^^xsd:float 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-66/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-69/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "30.0"^^xsd:float ; 14 | "0.0"^^xsd:float ; 15 | "4609"^^xsd:int ; 16 | "-1"^^xsd:int ; 17 | "1.0"^^xsd:float 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-69/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-78/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """FILTER > 14 | FILTER < 15 | 16 | Momentary foot addressings""" ; 17 | "48"^^xsd:int 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-78/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-79/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """LFO>VCF 14 | 15 | KEY>VCF 16 | 17 | DYN > VCF""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-79/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-87/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """DYN > VCA 14 | 15 | 16 | 17 | FIX > VCA""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/effect-87/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix ingen: . 2 | @prefix lv2: . 3 | @prefix pedal: . 4 | @prefix rdfs: . 5 | 6 | 7 | lv2:prototype ingen:GraphPrototype ; 8 | a lv2:Plugin , 9 | ingen:Graph , 10 | pedal:Pedalboard ; 11 | rdfs:seeAlso . 12 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Chords-22439.pedalboard/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/pedalboards/GSYNTH_Chords-22439.pedalboard/thumbnail.png -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-121/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo . 12 | 13 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-121/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-125/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """LFO WAVE 14 | LFO RATE 15 | LFO>VCF 16 | """ ; 17 | "48"^^xsd:int 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-125/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-126/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """Page 1: VCO (Oscillator) 14 | Page 2: VCF (Filter) 15 | Page 3: VCA / Dynamics 16 | Page 4: FX (Delay, Reverb)""" ; 17 | "32"^^xsd:int 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-126/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-66/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "30.0"^^xsd:float ; 14 | "0.0"^^xsd:float ; 15 | "4609"^^xsd:int ; 16 | "-1"^^xsd:int ; 17 | "1.0"^^xsd:float 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-66/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-69/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "30.0"^^xsd:float ; 14 | "0.0"^^xsd:float ; 15 | "4609"^^xsd:int ; 16 | "-1"^^xsd:int ; 17 | "1.0"^^xsd:float 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-69/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-72/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "Fixed Velocity Chain" ; 14 | "48"^^xsd:int 15 | ] . 16 | 17 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-72/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-74/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """LFO>VCO 14 | 15 | LFO WAVE 16 | LFO FREQ 17 | LFO>VCO""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-74/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-77/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "Three VCO3's take care of sound generation" ; 14 | "48"^^xsd:int 15 | ] . 16 | 17 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-77/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-78/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """FILTER > 14 | FILTER < 15 | 16 | Momentary foot addressings""" ; 17 | "48"^^xsd:int 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-78/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-79/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """KEY>VCF 14 | 15 | 16 | 17 | DYN > VCF""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-79/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-81/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """Dynamic Chain 14 | 15 | (Envelope Follower)""" ; 16 | "48"^^xsd:int 17 | ] . 18 | 19 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-81/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-87/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """DYN > VCA 14 | 15 | 16 | 17 | FIX > VCA""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-87/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-88/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """VCF FREQ 14 | VCF TYPE 15 | VCF RESO""" ; 16 | "48"^^xsd:int 17 | ] . 18 | 19 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-88/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-89/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "Keytracking Chain" ; 14 | "48"^^xsd:int 15 | ] . 16 | 17 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-89/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-91/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "WELCOME, INTRODUCTION HERE!" ; 14 | "48"^^xsd:int 15 | ] . 16 | 17 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-91/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-92/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """Page 1: VCO (Oscillator) 14 | 15 | --subpage 1-- 16 | MSTR OCT, VCO2 OCT, VCO3 OCT 17 | --subpage 2-- 18 | VCO1 WAVE, VCO2 SEMI, VCO3 SEMI 19 | --subpage 3-- 20 | LFO WAVE, LFO RATE, LFO>VCO 21 | 22 | --foots-- 23 | VCO2+3, LFO>VCO 24 | """ ; 25 | "20"^^xsd:int 26 | ] . 27 | 28 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-92/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-93/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """Page 3: VCA / Dynamics 14 | 15 | --subpage 1-- 16 | FIX>VCA, DYN>VCA, OUT LVL 17 | --subpage 2-- 18 | - 19 | --subpage 3-- 20 | - 21 | --foots-- 22 | CMP DYN""" ; 23 | "20"^^xsd:int 24 | ] . 25 | 26 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-93/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-94/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """Page 4: FX (Delay, Reverb) 14 | 15 | --subpage 1-- 16 | M TIME, M FEEDBK, M MIX 17 | --subpage 2-- 18 | S DECAY, S RATIO, S MIX 19 | --subpage 3-- 20 | S SHIM, S TONE, S BNDWDTH 21 | 22 | --foots-- 23 | MODULAY, SHIROVERB""" ; 24 | "20"^^xsd:int 25 | ] . 26 | 27 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-94/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-95/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """Page 2: VCF (Filter) 14 | 15 | --subpage 1-- 16 | VCF FREQ, DYN>VCF, KEY>VCF 17 | --subpage 2-- 18 | VCF TYPE, VCF RESO, FLT TIME 19 | --subpage 3-- 20 | LFO WAVE, LFO RATE, LFO>VCF 21 | 22 | --foots-- 23 | FILTER >, FILTER <""" ; 24 | "20"^^xsd:int 25 | ] . 26 | 27 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/effect-95/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix ingen: . 2 | @prefix lv2: . 3 | @prefix pedal: . 4 | @prefix rdfs: . 5 | 6 | 7 | lv2:prototype ingen:GraphPrototype ; 8 | a lv2:Plugin , 9 | ingen:Graph , 10 | pedal:Pedalboard ; 11 | rdfs:seeAlso . 12 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Flexible.pedalboard/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/pedalboards/GSYNTH_Flexible.pedalboard/thumbnail.png -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-121/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo . 12 | 13 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-121/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-137/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """Page 1: VCO (Oscillator) 14 | Page 2: VCF (Filter) 15 | Page 3: VCA / Dynamics 16 | Page 4: FX (Delay, Reverb)""" ; 17 | "32"^^xsd:int 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-137/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-140/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """LFO>PWM 14 | 15 | 16 | 17 | LFO>VCO""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-140/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-66/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "30.0"^^xsd:float ; 14 | "0.0"^^xsd:float ; 15 | "4609"^^xsd:int ; 16 | "-1"^^xsd:int ; 17 | "1.0"^^xsd:float 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-66/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-69/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "30.0"^^xsd:float ; 14 | "0.0"^^xsd:float ; 15 | "4609"^^xsd:int ; 16 | "-1"^^xsd:int ; 17 | "1.0"^^xsd:float 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-69/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-78/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """FLTR > 14 | 15 | 16 | 17 | FLTR <""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-78/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-79/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """LFO>VCF 14 | 15 | KEY>VCF 16 | 17 | DYN > VCF""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-79/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-87/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """DYN > VCA 14 | 15 | 16 | 17 | FIX > VCA""" ; 18 | "48"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/effect-87/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix ingen: . 2 | @prefix lv2: . 3 | @prefix pedal: . 4 | @prefix rdfs: . 5 | 6 | 7 | lv2:prototype ingen:GraphPrototype ; 8 | a lv2:Plugin , 9 | ingen:Graph , 10 | pedal:Pedalboard ; 11 | rdfs:seeAlso . 12 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Lead.pedalboard/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/pedalboards/GSYNTH_Lead.pedalboard/thumbnail.png -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Minimal.pedalboard/addressings.json: -------------------------------------------------------------------------------- 1 | { 2 | "/hmi/group1": [], 3 | "/cv/graph/mod_cv_control_6/Cvoutput": { 4 | "addrs": [ 5 | { 6 | "maximum": 1000.0, 7 | "label": "Rise Time", 8 | "operational_mode": "+", 9 | "instance": "/graph/mod_cv_slew_2", 10 | "steps": 33, 11 | "port": "RiseTime", 12 | "minimum": 0.10000000149011612 13 | }, 14 | { 15 | "maximum": 1000.0, 16 | "label": "Fall Time", 17 | "operational_mode": "+", 18 | "instance": "/graph/mod_cv_slew_2", 19 | "steps": 33, 20 | "port": "FallTime", 21 | "minimum": 0.10000000149011612 22 | } 23 | ], 24 | "name": "FILTER TIME" 25 | }, 26 | "/hmi/knob1": [ 27 | { 28 | "tempo": false, 29 | "label": "P Mix", 30 | "subpage": 2, 31 | "port": "blend", 32 | "steps": 201, 33 | "dividers": null, 34 | "page": 0, 35 | "maximum": 1.0, 36 | "group": null, 37 | "momentary": 0, 38 | "instance": "/graph/Plate", 39 | "coloured": false, 40 | "minimum": 0.0 41 | }, 42 | { 43 | "tempo": false, 44 | "label": "FLT FREQ", 45 | "subpage": 1, 46 | "port": "freq", 47 | "steps": 201, 48 | "dividers": null, 49 | "page": 0, 50 | "maximum": 10.0, 51 | "group": null, 52 | "momentary": 0, 53 | "instance": "/graph/vcf", 54 | "coloured": false, 55 | "minimum": 0.0 56 | }, 57 | { 58 | "tempo": false, 59 | "label": "Sensitivity", 60 | "subpage": 0, 61 | "port": "Sensitivity", 62 | "steps": 201, 63 | "dividers": null, 64 | "page": 0, 65 | "maximum": 100.0, 66 | "group": null, 67 | "momentary": 0, 68 | "instance": "/graph/cv", 69 | "coloured": false, 70 | "minimum": 0.10000000000000001 71 | } 72 | ], 73 | "/hmi/knob2": [ 74 | { 75 | "tempo": false, 76 | "label": "P Decay", 77 | "subpage": 2, 78 | "port": "tail", 79 | "steps": 201, 80 | "dividers": null, 81 | "page": 0, 82 | "maximum": 1.0, 83 | "group": null, 84 | "momentary": 0, 85 | "instance": "/graph/Plate", 86 | "coloured": false, 87 | "minimum": 0.0 88 | }, 89 | { 90 | "tempo": false, 91 | "label": "FLT Reso", 92 | "subpage": 1, 93 | "port": "resonance", 94 | "steps": 201, 95 | "dividers": null, 96 | "page": 0, 97 | "maximum": 1.0, 98 | "group": null, 99 | "momentary": 0, 100 | "instance": "/graph/vcf", 101 | "coloured": false, 102 | "minimum": 0.01 103 | }, 104 | { 105 | "tempo": false, 106 | "label": "Octave", 107 | "subpage": 0, 108 | "port": "Octave", 109 | "steps": 8, 110 | "dividers": null, 111 | "page": 0, 112 | "maximum": 4.0, 113 | "group": null, 114 | "momentary": 0, 115 | "instance": "/graph/cv", 116 | "coloured": false, 117 | "minimum": -4.0 118 | } 119 | ], 120 | "/hmi/knob3": [ 121 | { 122 | "tempo": false, 123 | "label": "FLT DEPTH", 124 | "subpage": 1, 125 | "port": "Multiplier", 126 | "steps": 201, 127 | "dividers": null, 128 | "page": 0, 129 | "maximum": 10.0, 130 | "group": null, 131 | "momentary": 0, 132 | "instance": "/graph/mod_cv_attenuverter_1", 133 | "coloured": false, 134 | "minimum": 0.0 135 | }, 136 | { 137 | "tempo": false, 138 | "label": "Waveform", 139 | "subpage": 0, 140 | "port": "waveForm", 141 | "steps": 6, 142 | "dividers": null, 143 | "page": 0, 144 | "maximum": 6.0, 145 | "group": null, 146 | "momentary": 0, 147 | "instance": "/graph/vco3", 148 | "coloured": false, 149 | "minimum": 0.0 150 | }, 151 | { 152 | "tempo": false, 153 | "label": "Out Lvl", 154 | "subpage": 2, 155 | "port": "gain", 156 | "steps": 201, 157 | "dividers": null, 158 | "page": 0, 159 | "maximum": 20.0, 160 | "group": null, 161 | "momentary": 0, 162 | "instance": "/graph/stereo", 163 | "coloured": false, 164 | "minimum": -20.0 165 | } 166 | ], 167 | "/hmi/footswitch1": [ 168 | { 169 | "tempo": false, 170 | "label": "Plate", 171 | "subpage": 0, 172 | "port": ":bypass", 173 | "steps": 33, 174 | "dividers": null, 175 | "page": 0, 176 | "maximum": 1.0, 177 | "group": null, 178 | "momentary": 0, 179 | "instance": "/graph/Plate", 180 | "coloured": false, 181 | "minimum": 0.0 182 | } 183 | ], 184 | "/hmi/footswitch2": [ 185 | { 186 | "tempo": false, 187 | "label": "FLTR >", 188 | "subpage": 0, 189 | "port": ":bypass", 190 | "steps": 33, 191 | "dividers": null, 192 | "page": 0, 193 | "maximum": 1.0, 194 | "group": null, 195 | "momentary": 1, 196 | "instance": "/graph/mod_cv_control", 197 | "coloured": false, 198 | "minimum": 0.0 199 | } 200 | ], 201 | "/bpm": [] 202 | } -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Minimal.pedalboard/effect-66/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | "30.0"^^xsd:float ; 14 | "0.0"^^xsd:float ; 15 | "4609"^^xsd:int ; 16 | "-1"^^xsd:int ; 17 | "1.0"^^xsd:float 18 | ] . 19 | 20 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Minimal.pedalboard/effect-66/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Minimal.pedalboard/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix ingen: . 2 | @prefix lv2: . 3 | @prefix pedal: . 4 | @prefix rdfs: . 5 | 6 | 7 | lv2:prototype ingen:GraphPrototype ; 8 | a lv2:Plugin , 9 | ingen:Graph , 10 | pedal:Pedalboard ; 11 | rdfs:seeAlso . 12 | -------------------------------------------------------------------------------- /pedalboards/GSYNTH_Minimal.pedalboard/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/pedalboards/GSYNTH_Minimal.pedalboard/thumbnail.png -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/addressings.json: -------------------------------------------------------------------------------- 1 | { 2 | "/hmi/group1": [], 3 | "/cv/graph/mod_cv_parameter_modulation/CVout": { 4 | "addrs": [ 5 | { 6 | "minimum": 0.0, 7 | "operational_mode": "+", 8 | "instance": "/graph/filta", 9 | "port": "frequency_control", 10 | "steps": 33, 11 | "label": "Frequency", 12 | "maximum": 1.0 13 | } 14 | ], 15 | "name": "LFO" 16 | }, 17 | "/hmi/knob1": [ 18 | { 19 | "minimum": 9.9999997473787516e-05, 20 | "instance": "/graph/lfo2_freq", 21 | "momentary": 0, 22 | "steps": 201, 23 | "coloured": false, 24 | "subpage": 0, 25 | "page": 0, 26 | "port": "freq", 27 | "group": null, 28 | "dividers": 0.33300000000000002, 29 | "label": "LFO RATE", 30 | "maximum": 20.0, 31 | "tempo": false 32 | }, 33 | { 34 | "minimum": 0.0, 35 | "instance": "/graph/mod_cv_control", 36 | "momentary": 0, 37 | "steps": 201, 38 | "coloured": false, 39 | "subpage": 1, 40 | "page": 0, 41 | "port": "Control", 42 | "group": null, 43 | "dividers": null, 44 | "label": "Macro", 45 | "maximum": 10.0, 46 | "tempo": false 47 | } 48 | ], 49 | "/hmi/knob2": [ 50 | { 51 | "minimum": -200.0, 52 | "instance": "/graph/mod_cv_parameter_modulation", 53 | "momentary": 0, 54 | "steps": 201, 55 | "coloured": false, 56 | "subpage": 0, 57 | "page": 0, 58 | "port": "ModulationDepth", 59 | "group": null, 60 | "dividers": null, 61 | "label": "LFO>Filta", 62 | "maximum": 200.0, 63 | "tempo": false 64 | }, 65 | { 66 | "minimum": 0.0, 67 | "instance": "/graph/xfade", 68 | "momentary": 0, 69 | "steps": 33, 70 | "coloured": false, 71 | "subpage": 1, 72 | "page": 0, 73 | "port": ":bypass", 74 | "group": null, 75 | "dividers": null, 76 | "label": "FX CHAIN", 77 | "maximum": 1.0, 78 | "tempo": false 79 | } 80 | ], 81 | "/hmi/knob3": [ 82 | { 83 | "minimum": 0.0, 84 | "instance": "/graph/mod_cv_parameter_modulation", 85 | "momentary": 0, 86 | "steps": 201, 87 | "coloured": false, 88 | "subpage": 0, 89 | "page": 0, 90 | "port": "ParameterValue", 91 | "group": null, 92 | "dividers": null, 93 | "label": "Filta", 94 | "maximum": 100.0, 95 | "tempo": false 96 | }, 97 | { 98 | "minimum": -1.0, 99 | "instance": "/graph/xfade", 100 | "momentary": 0, 101 | "steps": 201, 102 | "coloured": false, 103 | "subpage": 1, 104 | "page": 0, 105 | "port": "xfade", 106 | "group": null, 107 | "dividers": null, 108 | "label": "DRY/WET", 109 | "maximum": 1.0, 110 | "tempo": false 111 | } 112 | ], 113 | "/hmi/footswitch1": [ 114 | { 115 | "minimum": 0.0, 116 | "instance": "/graph/lfo2_freq", 117 | "momentary": 0, 118 | "steps": 5, 119 | "coloured": false, 120 | "subpage": 0, 121 | "page": 0, 122 | "port": "waveForm", 123 | "group": "/hmi/group1", 124 | "dividers": null, 125 | "label": "LFO", 126 | "maximum": 5.0, 127 | "tempo": false 128 | } 129 | ], 130 | "/hmi/footswitch2": [ 131 | { 132 | "minimum": 0.0, 133 | "instance": "/graph/lfo2_freq", 134 | "momentary": 0, 135 | "steps": 5, 136 | "coloured": false, 137 | "subpage": 0, 138 | "page": 0, 139 | "port": "waveForm", 140 | "group": "/hmi/group1", 141 | "dividers": null, 142 | "label": "LFO", 143 | "maximum": 5.0, 144 | "tempo": false 145 | } 146 | ], 147 | "/cv/graph/mod_cv_control/Cvoutput": { 148 | "addrs": [ 149 | { 150 | "minimum": 0.5, 151 | "operational_mode": "+", 152 | "instance": "/graph/filta_1", 153 | "port": "frequency_control", 154 | "steps": 33, 155 | "label": "Frequency", 156 | "maximum": 0.80000000000000004 157 | }, 158 | { 159 | "minimum": 0.25, 160 | "operational_mode": "+", 161 | "instance": "/graph/PlateX2", 162 | "port": "blend", 163 | "steps": 33, 164 | "label": "Mix", 165 | "maximum": 0.75 166 | }, 167 | { 168 | "minimum": 0.5, 169 | "operational_mode": "+", 170 | "instance": "/graph/PlateX2", 171 | "port": "tail", 172 | "steps": 33, 173 | "label": "Decay", 174 | "maximum": 1.0 175 | } 176 | ], 177 | "name": "Macro" 178 | }, 179 | "/bpm": [] 180 | } -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-18/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """===NAVIGATING THE WEBGUI=== 14 | 15 | -Click on a plugin to zoom in 16 | -While zoomed in, click + drag the background to move around in the pedalboard 17 | -Double click on the background to zoom out""" ; 18 | "20"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-18/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-19/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """===CHANGING PARAMETER VALUES=== 14 | 15 | While hovering over a control in the web interface, you can: 16 | -click to increase the value 17 | -shift-click to decrease the value 18 | OR 19 | -click + drag up to increase the value 20 | -click + drag down to decrease the value""" ; 21 | "21"^^xsd:int 22 | ] . 23 | 24 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-19/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-20/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """===MIDI PORTS=== 14 | 15 | -By default, there is an aggregated MIDI input and output. 16 | -This means that all incoming MIDI messages get merged and sent to the MOD device through this single port. 17 | -This also means that all MIDI messages sent to the output port will be sent to all MIDI devices 18 | """ ; 19 | "20"^^xsd:int 20 | ] . 21 | 22 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-20/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-4/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """===CV PARAMETER MODULATION=== 14 | 15 | 1. Press "MANAGE CV PORTS" 16 | 2. Enable desired CV ports 17 | 3. Adress the parameter you would like to modulate to the CV source you just created 18 | 19 | Tip: use the MOD CV Parameter Modulation plugin to have full control over the target parameter value and modulation depth.""" ; 20 | "21"^^xsd:int 21 | ] . 22 | 23 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-4/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-5/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """===CREATING MACRO CONTROLS=== 14 | 15 | 1. Press "MANAGE CV PORTS" 16 | 2. Click the checkbox next to the CV port you want to make available as a macro 17 | 3. Adress all parameters in your macro to the CV source you just created.""" ; 18 | "23"^^xsd:int 19 | ] . 20 | 21 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-5/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-7/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """===DRY/WET+BYPASS=== 14 | (using x42 stereo X-fade) 15 | 16 | 1.Patch the dry signal into the top input(s), and the wet signal into the bottom input(s) 17 | 2. Use the SIGNAL A/B parameter to control the DRY/WET ratio 18 | 3. Bypass to hear only the dry signal.""" ; 19 | "20"^^xsd:int 20 | ] . 21 | 22 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-7/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-9/effect.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | <> 10 | a pset:Preset ; 11 | lv2:appliesTo ; 12 | state:state [ 13 | """===CABLES AND ROUTING=== 14 | 15 | -Signal flow is from left-to-right 16 | -Purple cables transport audio, blue ones are for MIDI and orange ones are for CV signals. 17 | -Hover over an output, and click+drag to route. You can split the signal as many times as you like. 18 | -Hover over a plug connected to an input and click+drag to change the routing. 19 | -When multiple cables are connected to an input, click on the plugs to separate them""" ; 20 | "20"^^xsd:int 21 | ] . 22 | 23 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/effect-9/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix atom: . 2 | @prefix lv2: . 3 | @prefix pset: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix state: . 7 | @prefix xsd: . 8 | 9 | 10 | lv2:appliesTo ; 11 | a pset:Preset ; 12 | rdfs:seeAlso . 13 | 14 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/manifest.ttl: -------------------------------------------------------------------------------- 1 | @prefix ingen: . 2 | @prefix lv2: . 3 | @prefix pedal: . 4 | @prefix rdfs: . 5 | 6 | 7 | lv2:prototype ingen:GraphPrototype ; 8 | a lv2:Plugin , 9 | ingen:Graph , 10 | pedal:Pedalboard ; 11 | rdfs:seeAlso . 12 | -------------------------------------------------------------------------------- /pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/pedalboards/INFO_USEFUL_TIPS-15734.pedalboard/thumbnail.png -------------------------------------------------------------------------------- /res/mod-logo.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/res/mod-logo.icns -------------------------------------------------------------------------------- /res/mod-logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mod-audio/mod-desktop/6d502307cc9557308fbe13074a0a6c763c9888ff/res/mod-logo.ico -------------------------------------------------------------------------------- /res/mod-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 9 | 30 | 35 | 36 | -------------------------------------------------------------------------------- /src/plugin/ChildProcess.hpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023-2024 MOD Audio UG 2 | // SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | #pragma once 5 | 6 | #include "extra/Sleep.hpp" 7 | #include "extra/Time.hpp" 8 | 9 | #ifdef DISTRHO_OS_WINDOWS 10 | # include 11 | # include 12 | # include 13 | #else 14 | # include 15 | # include 16 | # include 17 | # include 18 | #endif 19 | 20 | START_NAMESPACE_DISTRHO 21 | 22 | // ----------------------------------------------------------------------------------------------------------- 23 | 24 | class ChildProcess 25 | { 26 | #ifdef _WIN32 27 | PROCESS_INFORMATION pinfo = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, 0, 0 }; 28 | #else 29 | pid_t pid = -1; 30 | #endif 31 | 32 | public: 33 | ChildProcess() 34 | { 35 | } 36 | 37 | ~ChildProcess() 38 | { 39 | stop(); 40 | } 41 | 42 | #ifdef _WIN32 43 | bool start(const char* const args[], const WCHAR* const envp) 44 | #else 45 | bool start(const char* const args[], char* const* const envp = nullptr) 46 | #endif 47 | { 48 | #ifdef _WIN32 49 | std::string cmd; 50 | 51 | for (uint i = 0; args[i] != nullptr; ++i) 52 | { 53 | if (i != 0) 54 | cmd += " "; 55 | 56 | if (args[i][0] != '"' && std::strchr(args[i], ' ') != nullptr) 57 | { 58 | cmd += "\""; 59 | cmd += args[i]; 60 | cmd += "\""; 61 | } 62 | else 63 | { 64 | cmd += args[i]; 65 | } 66 | } 67 | 68 | wchar_t wcmd[PATH_MAX]; 69 | if (MultiByteToWideChar(CP_UTF8, 0, cmd.data(), -1, wcmd, PATH_MAX) <= 0) 70 | return false; 71 | 72 | STARTUPINFOW si = {}; 73 | si.cb = sizeof(si); 74 | 75 | d_stdout("will start process with args '%s'", cmd.data()); 76 | 77 | return CreateProcessW(nullptr, // lpApplicationName 78 | wcmd, // lpCommandLine 79 | nullptr, // lpProcessAttributes 80 | nullptr, // lpThreadAttributes 81 | TRUE, // bInheritHandles 82 | CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT, // dwCreationFlags 83 | const_cast(envp), // lpEnvironment 84 | nullptr, // lpCurrentDirectory 85 | &si, // lpStartupInfo 86 | &pinfo) != FALSE; 87 | #else 88 | const pid_t ret = pid = vfork(); 89 | 90 | switch (ret) 91 | { 92 | // child process 93 | case 0: 94 | if (envp != nullptr) 95 | execve(args[0], const_cast(args), envp); 96 | else 97 | execvp(args[0], const_cast(args)); 98 | 99 | d_stderr2("exec failed: %d:%s", errno, std::strerror(errno)); 100 | _exit(1); 101 | break; 102 | 103 | // error 104 | case -1: 105 | d_stderr2("vfork() failed: %d:%s", errno, std::strerror(errno)); 106 | break; 107 | } 108 | 109 | return ret > 0; 110 | #endif 111 | } 112 | 113 | void stop(const uint32_t timeoutInMilliseconds = 2000) 114 | { 115 | const uint32_t timeout = d_gettime_ms() + timeoutInMilliseconds; 116 | bool sendTerminate = true; 117 | 118 | #ifdef _WIN32 119 | if (pinfo.hProcess == INVALID_HANDLE_VALUE) 120 | return; 121 | 122 | const PROCESS_INFORMATION opinfo = pinfo; 123 | pinfo = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, 0, 0 }; 124 | 125 | for (DWORD exitCode;;) 126 | { 127 | if (GetExitCodeProcess(opinfo.hProcess, &exitCode) == FALSE || 128 | exitCode != STILL_ACTIVE || 129 | WaitForSingleObject(opinfo.hProcess, 0) != WAIT_TIMEOUT) 130 | { 131 | CloseHandle(opinfo.hThread); 132 | CloseHandle(opinfo.hProcess); 133 | return; 134 | } 135 | 136 | if (sendTerminate) 137 | { 138 | sendTerminate = false; 139 | TerminateProcess(opinfo.hProcess, ERROR_BROKEN_PIPE); 140 | } 141 | 142 | if (d_gettime_ms() < timeout) 143 | { 144 | d_msleep(5); 145 | continue; 146 | } 147 | d_stderr("ChildProcess::stop() - timed out"); 148 | TerminateProcess(opinfo.hProcess, 9); 149 | d_msleep(5); 150 | CloseHandle(opinfo.hThread); 151 | CloseHandle(opinfo.hProcess); 152 | break; 153 | } 154 | #else 155 | if (pid <= 0) 156 | return; 157 | 158 | const pid_t opid = pid; 159 | pid = -1; 160 | 161 | for (pid_t ret;;) 162 | { 163 | try { 164 | ret = ::waitpid(opid, nullptr, WNOHANG); 165 | } DISTRHO_SAFE_EXCEPTION_BREAK("waitpid"); 166 | 167 | switch (ret) 168 | { 169 | case -1: 170 | if (errno == ECHILD) 171 | { 172 | // success, child doesn't exist 173 | return; 174 | } 175 | else 176 | { 177 | d_stderr("ChildProcess::stop() - waitpid failed: %d:%s", errno, std::strerror(errno)); 178 | return; 179 | } 180 | break; 181 | 182 | case 0: 183 | if (sendTerminate) 184 | { 185 | sendTerminate = false; 186 | kill(opid, SIGTERM); 187 | } 188 | if (d_gettime_ms() < timeout) 189 | { 190 | d_msleep(5); 191 | continue; 192 | } 193 | 194 | d_stderr("ChildProcess::stop() - timed out"); 195 | kill(opid, SIGKILL); 196 | waitpid(opid, nullptr, WNOHANG); 197 | break; 198 | 199 | default: 200 | if (ret == opid) 201 | { 202 | // success 203 | return; 204 | } 205 | else 206 | { 207 | d_stderr("ChildProcess::stop() - got wrong pid %i (requested was %i)", int(ret), int(opid)); 208 | return; 209 | } 210 | } 211 | 212 | break; 213 | } 214 | #endif 215 | } 216 | 217 | bool isRunning() 218 | { 219 | #ifdef _WIN32 220 | if (pinfo.hProcess == INVALID_HANDLE_VALUE) 221 | return false; 222 | 223 | DWORD exitCode; 224 | if (GetExitCodeProcess(pinfo.hProcess, &exitCode) == FALSE || 225 | exitCode != STILL_ACTIVE || 226 | WaitForSingleObject(pinfo.hProcess, 0) != WAIT_TIMEOUT) 227 | { 228 | const PROCESS_INFORMATION opinfo = pinfo; 229 | pinfo = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, 0, 0 }; 230 | CloseHandle(opinfo.hThread); 231 | CloseHandle(opinfo.hProcess); 232 | return false; 233 | } 234 | 235 | return true; 236 | #else 237 | if (pid <= 0) 238 | return false; 239 | 240 | const pid_t ret = ::waitpid(pid, nullptr, WNOHANG); 241 | 242 | if (ret == pid || (ret == -1 && errno == ECHILD)) 243 | { 244 | pid = 0; 245 | return false; 246 | } 247 | 248 | return true; 249 | #endif 250 | } 251 | 252 | #ifndef _WIN32 253 | void signal(const int sig) 254 | { 255 | if (pid > 0) 256 | kill(pid, sig); 257 | } 258 | #endif 259 | 260 | void terminate() 261 | { 262 | #ifdef _WIN32 263 | if (pinfo.hProcess != INVALID_HANDLE_VALUE) 264 | TerminateProcess(pinfo.hProcess, 15); 265 | #else 266 | if (pid > 0) 267 | kill(pid, SIGTERM); 268 | #endif 269 | } 270 | 271 | DISTRHO_DECLARE_NON_COPYABLE(ChildProcess) 272 | }; 273 | 274 | // ----------------------------------------------------------------------------------------------------------- 275 | 276 | END_NAMESPACE_DISTRHO 277 | -------------------------------------------------------------------------------- /src/plugin/DistrhoPluginInfo.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023-2024 MOD Audio UG 2 | // SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | #pragma once 5 | 6 | #define DISTRHO_PLUGIN_BRAND "MOD Audio" 7 | #define DISTRHO_PLUGIN_NAME "MOD Desktop" 8 | #define DISTRHO_PLUGIN_URI "https://mod.audio/desktop/" 9 | #define DISTRHO_PLUGIN_CLAP_ID "audio.mod.desktop" 10 | 11 | #define DISTRHO_PLUGIN_BRAND_ID MODa 12 | #define DISTRHO_PLUGIN_UNIQUE_ID dskt 13 | 14 | #define DISTRHO_PLUGIN_HAS_UI 1 15 | #define DISTRHO_PLUGIN_IS_RT_SAFE 0 16 | #define DISTRHO_PLUGIN_NUM_INPUTS 2 17 | #define DISTRHO_PLUGIN_NUM_OUTPUTS 2 18 | #define DISTRHO_PLUGIN_WANT_LATENCY 1 19 | #define DISTRHO_PLUGIN_WANT_MIDI_INPUT 1 20 | #define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 1 21 | #define DISTRHO_PLUGIN_WANT_STATE 1 22 | #define DISTRHO_PLUGIN_WANT_FULL_STATE 1 23 | #define DISTRHO_PLUGIN_WANT_WEBVIEW 1 24 | #define DISTRHO_UI_DEFAULT_WIDTH 1170 25 | #define DISTRHO_UI_DEFAULT_HEIGHT 600 26 | #define DISTRHO_UI_FILE_BROWSER 0 27 | #define DISTRHO_UI_USE_NANOVG 1 28 | #define DISTRHO_UI_USER_RESIZABLE 1 29 | #define DISTRHO_UI_WEB_VIEW 1 30 | 31 | static const constexpr unsigned int kVerticalOffset = 30; 32 | static const constexpr unsigned int kPortNumOffset = 18190; 33 | 34 | enum Error { 35 | kErrorAppDirNotFound = 1, 36 | kErrorJackdExecFailed, 37 | kErrorModUiExecFailed, 38 | kErrorShmSetupFailed, 39 | kErrorUndefined 40 | }; 41 | 42 | enum Parameters { 43 | kParameterBasePortNumber, 44 | kParameterCount 45 | }; 46 | -------------------------------------------------------------------------------- /src/plugin/Makefile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/make -f 2 | 3 | export DISTRHO_NAMESPACE = DesktopDISTRHO 4 | export DGL_NAMESPACE = DesktopDGL 5 | export NVG_FONT_TEXTURE_FLAGS = NVG_IMAGE_NEAREST 6 | export USE_WEB_VIEW = true 7 | 8 | include ../DPF/Makefile.base.mk 9 | 10 | # --------------------------------------------------------------------------------------------------------------------- 11 | # Project name, used for binaries 12 | 13 | NAME = mod-desktop 14 | 15 | # --------------------------------------------------------------------------------------------------------------------- 16 | # Files to build 17 | 18 | FILES_DSP = \ 19 | DesktopPlugin.cpp \ 20 | utils.cpp \ 21 | zita-resampler/resampler.cc \ 22 | zita-resampler/resampler-table.cc 23 | 24 | FILES_UI = DesktopUI.cpp NanoButton.cpp utils.cpp 25 | 26 | # --------------------------------------------------------------------------------------------------------------------- 27 | # Do some magic 28 | 29 | DPF_BUILD_DIR = ../../build-plugin/build 30 | DPF_TARGET_DIR = ../../build-plugin 31 | USING_WEBVIEW = true 32 | 33 | include ../DPF/Makefile.plugins.mk 34 | 35 | TARGETS = features jack au clap lv2_sep vst2 vst3 36 | 37 | BUILD_CXX_FLAGS += -DVERSION='"$(shell cat ../../VERSION)"' 38 | BUILD_CXX_FLAGS += -pthread 39 | LINK_FLAGS += -pthread 40 | 41 | ifeq ($(MACOS),true) 42 | LINK_FLAGS += -framework CoreFoundation -framework IOKit 43 | else ifeq ($(WINDOWS),true) 44 | LINK_FLAGS += -lole32 -luuid -lwinmm 45 | else 46 | LINK_FLAGS += -ldl -lrt 47 | endif 48 | 49 | # --------------------------------------------------------------------------------------------------------------------- 50 | 51 | all: $(TARGETS) 52 | -------------------------------------------------------------------------------- /src/plugin/NanoButton.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2018-2019 Rob van den Berg 3 | * Copyright (C) 2020-2021 Filipe Coelho 4 | * 5 | * This file is part of CharacterCompressor 6 | * 7 | * Nnjas2 is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU General Public License as published by 9 | * the Free Software Foundation, either version 3 of the License, or 10 | * (at your option) any later version. 11 | * 12 | * CharacterCompressor is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU General Public License 18 | * along with CharacterCompressor. If not, see . 19 | */ 20 | 21 | #include "NanoButton.hpp" 22 | #include "Window.hpp" 23 | 24 | START_NAMESPACE_DGL 25 | 26 | Button::Button(Widget* const parent, ButtonEventHandler::Callback* const cb) 27 | : NanoWidget(parent), 28 | ButtonEventHandler(this), 29 | backgroundColor(32, 32, 32), 30 | labelColor(255, 255, 255), 31 | label("button"), 32 | fontScale(1.0f) 33 | { 34 | #ifdef DGL_NO_SHARED_RESOURCES 35 | createFontFromFile("sans", "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf"); 36 | #else 37 | loadSharedResources(); 38 | #endif 39 | ButtonEventHandler::setCallback(cb); 40 | } 41 | 42 | Button::~Button() 43 | { 44 | } 45 | 46 | void Button::setBackgroundColor(const Color color) 47 | { 48 | backgroundColor = color; 49 | } 50 | 51 | void Button::setFontScale(const float scale) 52 | { 53 | fontScale = scale; 54 | } 55 | 56 | void Button::setLabel(const std::string& label2) 57 | { 58 | label = label2; 59 | } 60 | 61 | void Button::setLabelColor(const Color color) 62 | { 63 | labelColor = color; 64 | } 65 | 66 | void Button::onNanoDisplay() 67 | { 68 | const uint w = getWidth(); 69 | const uint h = getHeight(); 70 | const float margin = 1.0f; 71 | 72 | // Background 73 | beginPath(); 74 | fillColor(backgroundColor); 75 | strokeColor(labelColor); 76 | rect(margin, margin, w - 2 * margin, h - 2 * margin); 77 | fill(); 78 | stroke(); 79 | closePath(); 80 | 81 | // Label 82 | beginPath(); 83 | fontSize(14 * fontScale); 84 | fillColor(labelColor); 85 | Rectangle bounds; 86 | textBounds(0, 0, label.c_str(), NULL, bounds); 87 | float tx = w / 2.0f ; 88 | float ty = h / 2.0f; 89 | textAlign(ALIGN_CENTER | ALIGN_MIDDLE); 90 | 91 | fillColor(255, 255, 255, 255); 92 | text(tx, ty, label.c_str(), NULL); 93 | closePath(); 94 | } 95 | 96 | bool Button::onMouse(const MouseEvent& ev) 97 | { 98 | return ButtonEventHandler::mouseEvent(ev); 99 | } 100 | 101 | bool Button::onMotion(const MotionEvent& ev) 102 | { 103 | return ButtonEventHandler::motionEvent(ev); 104 | } 105 | 106 | END_NAMESPACE_DGL 107 | -------------------------------------------------------------------------------- /src/plugin/NanoButton.hpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2018-2019 Rob van den Berg 3 | * Copyright (C) 2020-2021 Filipe Coelho 4 | * 5 | * This file is part of CharacterCompressor 6 | * 7 | * Nnjas2 is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU General Public License as published by 9 | * the Free Software Foundation, either version 3 of the License, or 10 | * (at your option) any later version. 11 | * 12 | * CharacterCompressor is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU General Public License 18 | * along with CharacterCompressor. If not, see . 19 | */ 20 | 21 | #ifndef NANO_BUTTON_HPP_INCLUDED 22 | #define NANO_BUTTON_HPP_INCLUDED 23 | 24 | #include "NanoVG.hpp" 25 | #include "EventHandlers.hpp" 26 | 27 | #include 28 | 29 | START_NAMESPACE_DGL 30 | 31 | class Button : public NanoSubWidget, 32 | public ButtonEventHandler 33 | { 34 | public: 35 | explicit Button(Widget* parent, ButtonEventHandler::Callback* cb); 36 | ~Button() override; 37 | 38 | void setBackgroundColor(Color color); 39 | void setFontScale(float scale); 40 | void setLabel(const std::string& label); 41 | void setLabelColor(Color color); 42 | 43 | protected: 44 | void onNanoDisplay() override; 45 | bool onMouse(const MouseEvent& ev) override; 46 | bool onMotion(const MotionEvent& ev) override; 47 | 48 | private: 49 | Color backgroundColor; 50 | Color labelColor; 51 | std::string label; 52 | float fontScale; 53 | 54 | DISTRHO_LEAK_DETECTOR(Button) 55 | }; 56 | 57 | END_NAMESPACE_DGL 58 | 59 | #endif // NANO_BUTTON_HPP_INCLUDED 60 | -------------------------------------------------------------------------------- /src/plugin/ResizeHandle.hpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Resize handle for DPF 3 | * Copyright (C) 2021-2022 Filipe Coelho 4 | * 5 | * Permission to use, copy, modify, and/or distribute this software for any purpose with 6 | * or without fee is hereby granted, provided that the above copyright notice and this 7 | * permission notice appear in all copies. 8 | * 9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD 10 | * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN 11 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 12 | * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER 13 | * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 14 | * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | #pragma once 18 | 19 | #include "TopLevelWidget.hpp" 20 | #include "Color.hpp" 21 | 22 | #if defined(DGL_OPENGL) && !defined(DGL_USE_OPENGL3) 23 | #include "OpenGL-include.hpp" 24 | #endif 25 | 26 | START_NAMESPACE_DGL 27 | 28 | /** Resize handle for DPF windows, will sit on bottom-right. */ 29 | class ResizeHandle : public TopLevelWidget 30 | { 31 | public: 32 | /** Constructor for placing this handle on top of a window. */ 33 | explicit ResizeHandle(Window& window) 34 | : TopLevelWidget(window), 35 | handleSize(16), 36 | hasCursor(false), 37 | isResizing(false) 38 | { 39 | resetArea(); 40 | } 41 | 42 | /** Overloaded constructor, will fetch the window from an existing top-level widget. */ 43 | explicit ResizeHandle(TopLevelWidget* const tlw) 44 | : TopLevelWidget(tlw->getWindow()), 45 | handleSize(16), 46 | hasCursor(false), 47 | isResizing(false) 48 | { 49 | resetArea(); 50 | } 51 | 52 | /** Set the handle size, minimum 16. 53 | * Scale factor is automatically applied on top of this size as needed */ 54 | void setHandleSize(const uint size) 55 | { 56 | handleSize = std::max(16u, size); 57 | resetArea(); 58 | } 59 | 60 | protected: 61 | void onDisplay() override 62 | { 63 | const GraphicsContext& context(getGraphicsContext()); 64 | const double lineWidth = 1.0 * getScaleFactor(); 65 | 66 | glMatrixMode(GL_MODELVIEW); 67 | 68 | // draw white lines, 1px wide 69 | Color(1.0f, 1.0f, 1.0f).setFor(context); 70 | l1.draw(context, lineWidth); 71 | l2.draw(context, lineWidth); 72 | l3.draw(context, lineWidth); 73 | 74 | // draw black lines, offset by 1px and 1px wide 75 | Color(0.0f, 0.0f, 0.0f).setFor(context); 76 | Line l1b(l1), l2b(l2), l3b(l3); 77 | l1b.moveBy(lineWidth, lineWidth); 78 | l2b.moveBy(lineWidth, lineWidth); 79 | l3b.moveBy(lineWidth, lineWidth); 80 | l1b.draw(context, lineWidth); 81 | l2b.draw(context, lineWidth); 82 | l3b.draw(context, lineWidth); 83 | } 84 | 85 | bool onMouse(const MouseEvent& ev) override 86 | { 87 | if (ev.button != 1) 88 | return false; 89 | 90 | if (ev.press && area.contains(ev.pos)) 91 | { 92 | isResizing = true; 93 | resizingSize = Size(getWidth(), getHeight()); 94 | lastResizePoint = ev.pos; 95 | return true; 96 | } 97 | 98 | if (isResizing && ! ev.press) 99 | { 100 | isResizing = false; 101 | recheckCursor(ev.pos); 102 | return true; 103 | } 104 | 105 | return false; 106 | } 107 | 108 | bool onMotion(const MotionEvent& ev) override 109 | { 110 | if (! isResizing) 111 | { 112 | recheckCursor(ev.pos); 113 | return false; 114 | } 115 | 116 | const Size offset(ev.pos.getX() - lastResizePoint.getX(), 117 | ev.pos.getY() - lastResizePoint.getY()); 118 | 119 | resizingSize += offset; 120 | lastResizePoint = ev.pos; 121 | 122 | // TODO keepAspectRatio 123 | bool keepAspectRatio; 124 | const Size minSize(getWindow().getGeometryConstraints(keepAspectRatio)); 125 | const uint minWidth = minSize.getWidth(); 126 | const uint minHeight = minSize.getHeight(); 127 | 128 | if (resizingSize.getWidth() < minWidth) 129 | resizingSize.setWidth(minWidth); 130 | if (resizingSize.getWidth() > 16384) 131 | resizingSize.setWidth(16384); 132 | if (resizingSize.getHeight() < minHeight) 133 | resizingSize.setHeight(minHeight); 134 | if (resizingSize.getHeight() > 16384) 135 | resizingSize.setHeight(16384); 136 | 137 | setSize(resizingSize.getWidth(), resizingSize.getHeight()); 138 | return true; 139 | } 140 | 141 | void onResize(const ResizeEvent& ev) override 142 | { 143 | TopLevelWidget::onResize(ev); 144 | resetArea(); 145 | } 146 | 147 | private: 148 | Rectangle area; 149 | Line l1, l2, l3; 150 | uint handleSize; 151 | 152 | // event handling state 153 | bool hasCursor, isResizing; 154 | Point lastResizePoint; 155 | Size resizingSize; 156 | 157 | void recheckCursor(const Point& pos) 158 | { 159 | const bool shouldHaveCursor = area.contains(pos); 160 | 161 | if (shouldHaveCursor == hasCursor) 162 | return; 163 | 164 | hasCursor = shouldHaveCursor; 165 | setCursor(shouldHaveCursor ? kMouseCursorUpLeftDownRight : kMouseCursorArrow); 166 | } 167 | 168 | void resetArea() 169 | { 170 | const double scaleFactor = getScaleFactor(); 171 | const uint margin = 0.0 * scaleFactor; 172 | const uint size = handleSize * scaleFactor; 173 | 174 | area = Rectangle(getWidth() - size - margin, 30 * scaleFactor - size, size, size); 175 | 176 | recreateLines(area.getX(), area.getY(), size); 177 | } 178 | 179 | void recreateLines(const uint x, const uint y, const uint size) 180 | { 181 | uint linesize = size; 182 | uint offset = 0; 183 | 184 | // 1st line, full diagonal size 185 | l1.setStartPos(x + size, y); 186 | l1.setEndPos(x, y + size); 187 | 188 | // 2nd line, bit more to the right and down, cropped 189 | offset += size / 3; 190 | linesize -= size / 3; 191 | l2.setStartPos(x + linesize + offset, y + offset); 192 | l2.setEndPos(x + offset, y + linesize + offset); 193 | 194 | // 3rd line, even more right and down 195 | offset += size / 3; 196 | linesize -= size / 3; 197 | l3.setStartPos(x + linesize + offset, y + offset); 198 | l3.setEndPos(x + offset, y + linesize + offset); 199 | } 200 | 201 | DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ResizeHandle) 202 | }; 203 | 204 | END_NAMESPACE_DGL 205 | -------------------------------------------------------------------------------- /src/plugin/utils.hpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023-2024 MOD Audio UG 2 | // SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | #pragma once 5 | 6 | #include "DistrhoPluginUtils.hpp" 7 | 8 | START_NAMESPACE_DISTRHO 9 | 10 | // ----------------------------------------------------------------------------------------------------------- 11 | 12 | /* Get the MOD Desktop application directory. 13 | */ 14 | const char* getAppDir(); 15 | 16 | /* Get environment to be used for a child process. 17 | */ 18 | #ifdef _WIN32 19 | const wchar_t* getEvironment(uint portBaseNum); 20 | #else 21 | char* const* getEvironment(uint portBaseNum); 22 | 23 | // helpers 24 | void set_envp_value(char** envp, const char* const fullvalue); 25 | void set_envp_value(char** envp, const char* const key, const char* const value); 26 | #endif 27 | 28 | /* Open a web browser with the mod-ui URL as address. 29 | */ 30 | void openWebGui(uint port); 31 | 32 | /* Open the "user files" directory in a file manager/explorer. 33 | */ 34 | void openUserFilesDir(); 35 | 36 | // ----------------------------------------------------------------------------------------------------------- 37 | 38 | END_NAMESPACE_DISTRHO 39 | -------------------------------------------------------------------------------- /src/plugin/zita-resampler/resampler-table.cc: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // 3 | // Copyright (C) 2006-2023 Fons Adriaensen 4 | // 5 | // This program is free software; you can redistribute it and/or modify 6 | // it under the terms of the GNU General Public License as published by 7 | // the Free Software Foundation; either version 3 of the License, or 8 | // (at your option) any later version. 9 | // 10 | // This program is distributed in the hope that it will be useful, 11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | // GNU General Public License for more details. 14 | // 15 | // You should have received a copy of the GNU General Public License 16 | // along with this program. If not, see . 17 | // 18 | // ---------------------------------------------------------------------------- 19 | 20 | 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include "resampler-table.h" 26 | 27 | 28 | #undef ENABLE_VEC4 29 | #if (defined(__SSE2_MATH__) || defined(__ARM_NEON) || defined(__ARM_NEON__)) && !defined(_WIN32) 30 | # define ENABLE_VEC4 31 | #endif 32 | 33 | 34 | static double sinc (double x) 35 | { 36 | x = fabs (x); 37 | if (x < 1e-6) return 1.0; 38 | x *= M_PI; 39 | return sin (x) / x; 40 | } 41 | 42 | 43 | static double wind (double x) 44 | { 45 | x = fabs (x); 46 | if (x >= 1.0) return 0.0f; 47 | x *= M_PI; 48 | return 0.384 + 0.500 * cos (x) + 0.116 * cos (2 * x); 49 | } 50 | 51 | 52 | Resampler_table *Resampler_table::_list = 0; 53 | Resampler_mutex Resampler_table::_mutex; 54 | 55 | 56 | Resampler_table::Resampler_table (double fr, unsigned int hl, unsigned int np) : 57 | _next (0), 58 | _refc (0), 59 | _fr (fr), 60 | _hl (hl), 61 | _np (np) 62 | { 63 | unsigned int i, j, n; 64 | double t; 65 | float *p; 66 | 67 | n = hl * (np + 1); 68 | #ifdef ENABLE_VEC4 69 | posix_memalign ((void **) &_ctab, 16, n * sizeof (float)); 70 | #else 71 | _ctab = new float [n]; 72 | #endif 73 | p = _ctab; 74 | for (j = 0; j <= np; j++) 75 | { 76 | t = (double) j / (double) np; 77 | for (i = 0; i < hl; i++) 78 | { 79 | p [hl - i - 1] = (float)(fr * sinc (t * fr) * wind (t / hl)); 80 | t += 1; 81 | } 82 | p += hl; 83 | } 84 | } 85 | 86 | 87 | Resampler_table::~Resampler_table (void) 88 | { 89 | #ifdef ENABLE_VEC4 90 | free (_ctab); 91 | #else 92 | delete[] _ctab; 93 | #endif 94 | } 95 | 96 | 97 | Resampler_table *Resampler_table::create (double fr, unsigned int hl, unsigned int np) 98 | { 99 | Resampler_table *P; 100 | 101 | _mutex.lock (); 102 | P = _list; 103 | while (P) 104 | { 105 | if ((fr >= P->_fr * 0.999) && (fr <= P->_fr * 1.001) && (hl == P->_hl) && (np == P->_np)) 106 | { 107 | P->_refc++; 108 | _mutex.unlock (); 109 | return P; 110 | } 111 | P = P->_next; 112 | } 113 | P = new Resampler_table (fr, hl, np); 114 | P->_refc = 1; 115 | P->_next = _list; 116 | _list = P; 117 | _mutex.unlock (); 118 | return P; 119 | } 120 | 121 | 122 | void Resampler_table::destroy (Resampler_table *T) 123 | { 124 | Resampler_table *P, *Q; 125 | 126 | _mutex.lock (); 127 | if (T) 128 | { 129 | T->_refc--; 130 | if (T->_refc == 0) 131 | { 132 | P = _list; 133 | Q = 0; 134 | while (P) 135 | { 136 | if (P == T) 137 | { 138 | if (Q) Q->_next = T->_next; 139 | else _list = T->_next; 140 | break; 141 | } 142 | Q = P; 143 | P = P->_next; 144 | } 145 | delete T; 146 | } 147 | } 148 | _mutex.unlock (); 149 | } 150 | -------------------------------------------------------------------------------- /src/plugin/zita-resampler/resampler-table.h: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // 3 | // Copyright (C) 2006-2023 Fons Adriaensen 4 | // 5 | // This program is free software; you can redistribute it and/or modify 6 | // it under the terms of the GNU General Public License as published by 7 | // the Free Software Foundation; either version 3 of the License, or 8 | // (at your option) any later version. 9 | // 10 | // This program is distributed in the hope that it will be useful, 11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | // GNU General Public License for more details. 14 | // 15 | // You should have received a copy of the GNU General Public License 16 | // along with this program. If not, see . 17 | // 18 | // ---------------------------------------------------------------------------- 19 | 20 | 21 | #ifndef __RESAMPLER_TABLE_H 22 | #define __RESAMPLER_TABLE_H 23 | 24 | 25 | #include 26 | 27 | 28 | class Resampler_mutex 29 | { 30 | private: 31 | 32 | friend class Resampler_table; 33 | 34 | Resampler_mutex (void) { pthread_mutex_init (&_mutex, nullptr); } 35 | ~Resampler_mutex (void) { pthread_mutex_destroy (&_mutex); } 36 | void lock (void) { pthread_mutex_lock (&_mutex); } 37 | void unlock (void) { pthread_mutex_unlock (&_mutex); } 38 | 39 | pthread_mutex_t _mutex; 40 | }; 41 | 42 | 43 | class Resampler_table 44 | { 45 | private: 46 | 47 | Resampler_table (double fr, unsigned int hl, unsigned int np); 48 | ~Resampler_table (void); 49 | 50 | friend class Resampler; 51 | friend class VResampler; 52 | 53 | Resampler_table *_next; 54 | unsigned int _refc; 55 | float *_ctab; 56 | double _fr; 57 | unsigned int _hl; 58 | unsigned int _np; 59 | 60 | static Resampler_table *create (double fr, unsigned int hl, unsigned int np); 61 | static void destroy (Resampler_table *T); 62 | 63 | static Resampler_table *_list; 64 | static Resampler_mutex _mutex; 65 | }; 66 | 67 | 68 | #endif 69 | -------------------------------------------------------------------------------- /src/plugin/zita-resampler/resampler.h: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // 3 | // Copyright (C) 2006-2023 Fons Adriaensen 4 | // 5 | // This program is free software; you can redistribute it and/or modify 6 | // it under the terms of the GNU General Public License as published by 7 | // the Free Software Foundation; either version 3 of the License, or 8 | // (at your option) any later version. 9 | // 10 | // This program is distributed in the hope that it will be useful, 11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | // GNU General Public License for more details. 14 | // 15 | // You should have received a copy of the GNU General Public License 16 | // along with this program. If not, see . 17 | // 18 | // ---------------------------------------------------------------------------- 19 | 20 | 21 | #ifndef __RESAMPLER_H 22 | #define __RESAMPLER_H 23 | 24 | 25 | #include "resampler-table.h" 26 | 27 | 28 | class Resampler 29 | { 30 | public: 31 | 32 | Resampler (void) noexcept; 33 | ~Resampler (void); 34 | 35 | bool setup (unsigned int fs_inp, 36 | unsigned int fs_out, 37 | unsigned int nchan, 38 | unsigned int hlen); 39 | 40 | bool setup (unsigned int fs_inp, 41 | unsigned int fs_out, 42 | unsigned int nchan, 43 | unsigned int hlen, 44 | double frel); 45 | 46 | void clear (void); 47 | bool reset (void) noexcept; 48 | int nchan (void) const noexcept { return _nchan; } 49 | int filtlen (void) const noexcept { return inpsize (); } // Deprecated 50 | int inpsize (void) const noexcept; 51 | double inpdist (void) const noexcept; 52 | bool process (void); 53 | 54 | unsigned int inp_count; 55 | unsigned int out_count; 56 | const float *const *inp_data; 57 | float* *out_data; 58 | 59 | private: 60 | 61 | Resampler_table *_table; 62 | unsigned int _nchan; 63 | unsigned int _inmax; 64 | unsigned int _index; 65 | unsigned int _nread; 66 | unsigned int _nzero; 67 | unsigned int _phase; 68 | unsigned int _pstep; 69 | float *_buff; 70 | void *_dummy [8]; 71 | }; 72 | 73 | 74 | #endif 75 | -------------------------------------------------------------------------------- /src/systray/Makefile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/make -f 2 | 3 | CC ?= gcc 4 | CXX ?= g++ 5 | PKG_CONFIG ?= pkg-config 6 | 7 | CXXFLAGS += -fPIC -std=gnu++14 -I. -DVERSION='"$(shell cat ../../VERSION)"' 8 | 9 | TARGET_MACHINE := $(shell $(CC) -dumpmachine) 10 | 11 | # --------------------------------------------------------------------------------------------------------------------- 12 | 13 | ifneq (,$(findstring linux,$(TARGET_MACHINE))) 14 | LINUX = true 15 | WINDOWS = false 16 | PAWPAW_TARGET = linux-$(shell uname -m) 17 | else ifneq (,$(findstring apple,$(TARGET_MACHINE))) 18 | MACOS = true 19 | WINDOWS = false 20 | ifeq ($(shell uname -m),x86_64) 21 | PAWPAW_TARGET = macos 22 | else 23 | PAWPAW_TARGET = macos-universal-10.15 24 | endif 25 | else ifneq (,$(findstring mingw,$(TARGET_MACHINE))) 26 | WINDOWS = true 27 | PAWPAW_TARGET = win64 28 | else ifneq (,$(findstring wasm,$(TARGET_MACHINE))) 29 | WASM = true 30 | WINDOWS = false 31 | PAWPAW_TARGET = wasm 32 | else 33 | $(error unknown target, cannot continue) 34 | endif 35 | 36 | # --------------------------------------------------------------------------------------------------------------------- 37 | 38 | PAWPAW_DIR = ~/PawPawBuilds 39 | PAWPAW_PREFIX = $(PAWPAW_DIR)/targets/$(PAWPAW_TARGET) 40 | 41 | # --------------------------------------------------------------------------------------------------------------------- 42 | 43 | ifeq ($(WINDOWS),true) 44 | TARGET = mod-desktop.exe 45 | EXTRAS = Qt5Core.dll Qt5Gui.dll Qt5Svg.dll Qt5Widgets.dll 46 | LDFLAGS += -Wl,-subsystem,windows -ldwmapi 47 | WINDRES = $(subst gcc,windres,$(CC)) 48 | else 49 | TARGET = mod-desktop 50 | endif 51 | 52 | ifeq ($(LINUX),true) 53 | CXXFLAGS += $(shell $(PKG_CONFIG) --cflags alsa) 54 | LDFLAGS += $(shell $(PKG_CONFIG) --libs alsa) 55 | endif 56 | 57 | ifeq ($(MACOS),true) 58 | LDFLAGS += -framework CoreAudio -framework CoreFoundation -framework IOKit 59 | else 60 | CXXFLAGS += $(shell $(PKG_CONFIG) --cflags portaudio-2.0) 61 | LDFLAGS += $(shell $(PKG_CONFIG) --libs portaudio-2.0) 62 | endif 63 | 64 | ifneq ($(MACOS)$(WINDOWS),true) 65 | LDFLAGS += -ldl 66 | endif 67 | 68 | ifeq ($(shell $(PKG_CONFIG) --exists Qt5Core Qt5Gui Qt5Svg Qt5Widgets && echo true)$(WINDOWS),truefalse) 69 | QT5_HOSTBINS = $(shell $(PKG_CONFIG) --variable=host_bins Qt5Core) 70 | QT5_FLAGS = $(shell $(PKG_CONFIG) --cflags Qt5Core Qt5Gui Qt5Svg Qt5Widgets) 71 | QT5_LIBS = $(shell $(PKG_CONFIG) --libs Qt5Core Qt5Gui Qt5Svg Qt5Widgets) 72 | else 73 | QT5_PREFIX = $(shell $(PKG_CONFIG) --variable=prefix Qt5OpenGLExtensions) 74 | QT5_HOSTBINS = $(QT5_PREFIX)/bin 75 | QT5_FLAGS = -DQT_CORE_LIB -DQT_GUI_LIB -DQT_SVG_LIB -DQT_WIDGETS_LIB -I$(QT5_PREFIX)/include/qt5 76 | ifeq ($(MACOS),true) 77 | QT5_LIBS = -F$(QT5_PREFIX)/lib -framework QtCore -framework QtGui -framework QtSvg -framework QtWidgets 78 | else 79 | QT5_LIBS = -L$(QT5_PREFIX)/lib -lQt5Core -lQt5Gui -lQt5Svg -lQt5Widgets 80 | endif 81 | endif 82 | 83 | OBJS = main.cpp.o 84 | 85 | ifeq ($(WINDOWS),true) 86 | OBJS += mod-desktop.rc.o 87 | endif 88 | 89 | # --------------------------------------------------------------------------------------------------------------------- 90 | 91 | all: $(TARGET) $(EXTRAS) 92 | 93 | clean: 94 | rm -f $(TARGET) *.dll *.exe *.o qrc_mod-desktop.hpp ui_mod-desktop.hpp 95 | 96 | $(TARGET): $(OBJS) 97 | @$(shell mkdir -p $(@D)) 98 | $(CXX) $^ $(LDFLAGS) $(QT5_LIBS) -o $@ 99 | ifeq ($(MACOS),true) 100 | install_name_tool -change "@rpath/QtCore.framework/Versions/5/QtCore" "@executable_path/../Frameworks/QtCore.framework/QtCore" $@ 101 | install_name_tool -change "@rpath/QtGui.framework/Versions/5/QtGui" "@executable_path/../Frameworks/QtGui.framework/QtGui" $@ 102 | install_name_tool -change "@rpath/QtOpenGL.framework/Versions/5/QtOpenGL" "@executable_path/../Frameworks/QtOpenGL.framework/QtOpenGL" $@ 103 | install_name_tool -change "@rpath/QtPrintSupport.framework/Versions/5/QtPrintSupport" "@executable_path/../Frameworks/QtPrintSupport.framework/QtPrintSupport" $@ 104 | install_name_tool -change "@rpath/QtSvg.framework/Versions/5/QtSvg" "@executable_path/../Frameworks/QtSvg.framework/QtSvg" $@ 105 | install_name_tool -change "@rpath/QtWidgets.framework/Versions/5/QtWidgets" "@executable_path/../Frameworks/QtWidgets.framework/QtWidgets" $@ 106 | endif 107 | 108 | main.cpp.o: main.cpp mod-desktop.hpp qrc_mod-desktop.hpp ui_mod-desktop.hpp utils.cpp utils.hpp widgets.hpp 109 | $(CXX) $< $(CXXFLAGS) $(QT5_FLAGS) -c -o $@ 110 | 111 | mod-desktop.rc.o: mod-desktop.rc 112 | $(WINDRES) $< -O coff -o $@ 113 | 114 | qrc_mod-desktop.hpp: mod-desktop.qrc 115 | $(QT5_HOSTBINS)/rcc $< -o $@ 116 | 117 | ui_mod-desktop.hpp: mod-desktop.ui 118 | $(QT5_HOSTBINS)/uic $< -o $@ 119 | 120 | Qt5%.dll: $(PAWPAW_PREFIX)/bin/Qt5%.dll 121 | ln -sf $< $@ 122 | 123 | # --------------------------------------------------------------------------------------------------------------------- 124 | -------------------------------------------------------------------------------- /src/systray/main.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023-2024 MOD Audio UG 2 | // SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | #include "mod-desktop.hpp" 5 | #include "qrc_mod-desktop.hpp" 6 | 7 | // TODO split build 8 | #include "utils.cpp" 9 | 10 | int main(int argc, char* argv[]) 11 | { 12 | QApplication::setAttribute(Qt::AA_X11InitThreads); 13 | QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 14 | QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); 15 | 16 | initEvironment(); 17 | setupControlCloseSignal(); 18 | 19 | // TODO set up all branding here 20 | QApplication app(argc, argv); 21 | app.setApplicationName("MOD Desktop"); 22 | app.setOrganizationName("MOD Audio"); 23 | app.setWindowIcon(QIcon(":/res/mod-logo.svg")); 24 | 25 | const bool darkMode = shouldUseDarkMode(); 26 | 27 | if (darkMode) 28 | setupDarkModePalette(app); 29 | 30 | AppWindow window; 31 | 32 | if (darkMode) 33 | setupDarkModeWindow(window); 34 | 35 | return app.exec(); 36 | } 37 | -------------------------------------------------------------------------------- /src/systray/mod-desktop.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | ../../res/mod-logo.svg 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/systray/mod-desktop.rc: -------------------------------------------------------------------------------- 1 | id ICON "../../res/mod-logo.ico" 2 | 401 ICON "../../res/mod-logo.ico" 3 | -------------------------------------------------------------------------------- /src/systray/utils.hpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 MOD Audio UG 2 | // SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | #pragma once 5 | 6 | #include 7 | 8 | class QMainWindow; 9 | 10 | static inline 11 | QWidget* getLastParentOrSelf(QWidget* const w) noexcept 12 | { 13 | if (QWidget* const p = dynamic_cast(w->parent())) 14 | return getLastParentOrSelf(p); 15 | 16 | return w; 17 | } 18 | 19 | /* Setup environment, should be the first call in the application. 20 | * Also creates needed directories and changes current working directory to where this application lives in. 21 | */ 22 | void initEvironment(); 23 | 24 | /* Get the LV2 path to use, optionally including all/global plugins too. 25 | */ 26 | QString getLV2Path(bool includeSystemPlugins); 27 | 28 | /* Open a web browser with the mod-ui URL as address. 29 | */ 30 | void openWebGui(); 31 | 32 | /* Open the "user files" directory in a file manager/explorer. 33 | */ 34 | void openUserFilesDir(); 35 | 36 | /* Whether the application should try to force a dark mode. 37 | * Currently only supported on Windows. 38 | */ 39 | bool shouldUseDarkMode(); 40 | 41 | /* Setup signal handling so that Ctrl+C cleanly closes the application. 42 | */ 43 | void setupControlCloseSignal(); 44 | 45 | /* Setup dark mode for an application, also changing to "Fusion" theme. 46 | */ 47 | void setupDarkModePalette(QApplication& app); 48 | 49 | /* Setup OS-native dark mode for a window. 50 | * Currently only supported on Windows. 51 | */ 52 | void setupDarkModeWindow(QMainWindow& window); 53 | 54 | /* Save MIDI related settings to user profile. 55 | * This is meant to be used before starting mod-ui, so it then reads from these settings. 56 | */ 57 | void writeMidiChannelsToProfile(int pedalboard, int snapshot); 58 | -------------------------------------------------------------------------------- /src/systray/widgets.hpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 MOD Audio UG 2 | // SPDX-License-Identifier: AGPL-3.0-or-later 3 | 4 | #pragma once 5 | 6 | #include "utils.hpp" 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | class QToolButtonWithMouseTracking : public QToolButton 14 | { 15 | QFont _font; 16 | 17 | public: 18 | QToolButtonWithMouseTracking(QWidget* const parent) 19 | : QToolButton(parent) {} 20 | 21 | void enterEvent(QEvent* const event) override 22 | { 23 | QFont _font = font(); 24 | _font.setBold(true); 25 | setFont(_font); 26 | QToolButton::enterEvent(event); 27 | } 28 | 29 | void leaveEvent(QEvent* const event) override 30 | { 31 | QFont _font = font(); 32 | _font.setBold(false); 33 | setFont(_font); 34 | QToolButton::leaveEvent(event); 35 | } 36 | }; 37 | 38 | class CollapsibleWidget : public QWidget 39 | { 40 | QToolButtonWithMouseTracking* toggleButton = nullptr; 41 | 42 | public: 43 | CollapsibleWidget(QWidget* const parent) 44 | : QWidget(parent) {} 45 | 46 | void setCheckedInit(const bool checked) 47 | { 48 | toggleButton->blockSignals(true); 49 | toggleButton->setChecked(checked); 50 | toggleButton->blockSignals(false); 51 | 52 | toggleButton->setArrowType(checked ? Qt::DownArrow : Qt::RightArrow); 53 | setVisible(checked); 54 | } 55 | 56 | void setup(QToolButtonWithMouseTracking* const tb) 57 | { 58 | hide(); 59 | toggleButton = tb; 60 | connect(toggleButton, &QToolButton::toggled, this, &CollapsibleWidget::toolButtonPressed); 61 | } 62 | 63 | private slots: 64 | void reduceSize() 65 | { 66 | QWidget* const p = getLastParentOrSelf(this); 67 | p->resize(p->width(), p->height() - height()); 68 | } 69 | 70 | void toolButtonPressed(const bool toggled) 71 | { 72 | toggleButton->setArrowType(toggled ? Qt::DownArrow : Qt::RightArrow); 73 | setVisible(toggled); 74 | 75 | if (!toggled) 76 | { 77 | QTimer::singleShot(20, this, &CollapsibleWidget::reduceSize); 78 | } 79 | } 80 | }; 81 | -------------------------------------------------------------------------------- /utils/cxfreeze/mod-pedalboard-setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # SPDX-FileCopyrightText: 2012-2023 MOD Audio UG 3 | # SPDX-License-Identifier: AGPL-3.0-or-later 4 | 5 | # do an early import of everything we need 6 | import os 7 | import sys 8 | import json 9 | import aggdraw 10 | import PIL 11 | 12 | ROOT = os.path.abspath(os.path.dirname(sys.argv[0])) 13 | 14 | sys.path = [ROOT] + sys.path 15 | 16 | from modtools.pedalboard import main 17 | main() 18 | -------------------------------------------------------------------------------- /utils/cxfreeze/mod-pedalboard.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | # ------------------------------------------------------------------------------------------------------------ 5 | # Imports (cx_Freeze) 6 | 7 | from cx_Freeze import setup, Executable 8 | 9 | # ------------------------------------------------------------------------------------------------------------ 10 | 11 | from sys import platform 12 | 13 | if platform == 'win32': 14 | exe = '.exe' 15 | s = '\\' 16 | else: 17 | exe = '' 18 | s = '/' 19 | 20 | # ------------------------------------------------------------------------------------------------------------ 21 | 22 | options = { 23 | "zip_include_packages": ["*"], 24 | "zip_exclude_packages": ["PIL","mod","modtools"], 25 | "replace_paths": [["*",f".{s}lib{s}"]], 26 | "build_exe": f".{s}build-pedalboard", 27 | "optimize": True, 28 | } 29 | 30 | exe_options = { 31 | "script": f".{s}utils{s}cxfreeze{s}mod-pedalboard-setup.py", 32 | "copyright": "Copyright (C) 2012-2024 MOD Audio UG", 33 | "targetName": f"mod-pedalboard{exe}", 34 | } 35 | 36 | setup(name = "mod-pedalboard", 37 | version = "0.0.0", 38 | description = "MOD Pedalboard tools", 39 | options = {"build_exe": options}, 40 | executables = [Executable(**exe_options)]) 41 | 42 | # ------------------------------------------------------------------------------------------------------------ 43 | -------------------------------------------------------------------------------- /utils/cxfreeze/mod-ui-setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # SPDX-FileCopyrightText: 2012-2023 MOD Audio UG 3 | # SPDX-License-Identifier: AGPL-3.0-or-later 4 | 5 | # do an early import of everything we need 6 | import os 7 | import sys 8 | import json 9 | import uuid 10 | import aggdraw 11 | import PIL 12 | from tornado import gen, iostream, web, websocket 13 | from Cryptodome.Cipher import PKCS1_OAEP, AES 14 | from Cryptodome.Hash import SHA1 15 | from Cryptodome.PublicKey import RSA 16 | from Cryptodome.Signature import pkcs1_15 as PKCS1_v1_5 17 | 18 | ROOT = os.path.abspath(os.path.dirname(sys.argv[0])) 19 | DATA_DIR = os.getenv('MOD_DATA_DIR', os.path.join(ROOT, 'data')) 20 | DEVICE_DIR = os.path.join(DATA_DIR, 'device') 21 | 22 | sys.path = [ROOT] + sys.path 23 | 24 | if sys.platform == 'darwin': 25 | resdir = os.path.join(ROOT, '..', 'Resources') 26 | else: 27 | resdir = ROOT 28 | 29 | os.environ['MOD_DEFAULT_PEDALBOARD'] = os.path.join(resdir, 'default.pedalboard') 30 | os.environ['MOD_DESKTOP'] = '1' 31 | os.environ['MOD_DEV_ENVIRONMENT'] = '0' 32 | os.environ['MOD_DEVICE_HOST_PORT'] = os.environ.get("MOD_DEVICE_HOST_PORT", '18182') 33 | os.environ['MOD_DEVICE_WEBSERVER_PORT'] = os.environ.get("MOD_DEVICE_WEBSERVER_PORT", '18181') 34 | os.environ['MOD_HARDWARE_DESC_FILE'] = os.path.join(resdir, 'mod-hardware-descriptor.json') 35 | os.environ['MOD_HTML_DIR'] = os.path.join(resdir, 'html') 36 | os.environ['MOD_IMAGE_VERSION_PATH'] = os.path.join(resdir, 'VERSION') 37 | os.environ['MOD_KEYS_PATH'] = os.path.join(DATA_DIR, 'keys') 38 | os.environ['MOD_LOG'] = os.environ.get("MOD_LOG", '1') 39 | # MOD_MODEL_CPU 40 | os.environ['MOD_MODEL_TYPE'] = "MOD Desktop" 41 | os.environ['MOD_USER_FILES_DIR'] = os.path.join(DATA_DIR, 'user-files') 42 | os.environ['MOD_USER_PEDALBOARDS_DIR'] = os.path.join(DATA_DIR, 'pedalboards') 43 | os.environ['MOD_USER_PLUGINS_DIR'] = os.path.join(DATA_DIR, 'lv2') 44 | 45 | def makedirs(path: str): 46 | try: 47 | os.makedirs(path, exist_ok=True) 48 | except OSError: 49 | pass 50 | 51 | makedirs(os.path.join(DATA_DIR, 'user-files', 'Audio Loops')) 52 | makedirs(os.path.join(DATA_DIR, 'user-files', 'Audio Recordings')) 53 | makedirs(os.path.join(DATA_DIR, 'user-files', 'Audio Samples')) 54 | makedirs(os.path.join(DATA_DIR, 'user-files', 'Audio Tracks')) 55 | makedirs(os.path.join(DATA_DIR, 'user-files', 'MIDI Clips')) 56 | makedirs(os.path.join(DATA_DIR, 'user-files', 'MIDI Songs')) 57 | makedirs(os.path.join(DATA_DIR, 'user-files', 'Reverb IRs')) 58 | makedirs(os.path.join(DATA_DIR, 'user-files', 'Speaker Cabinets IRs')) 59 | makedirs(os.path.join(DATA_DIR, 'user-files', 'Hydrogen Drumkits')) 60 | makedirs(os.path.join(DATA_DIR, 'user-files', 'SF2 Instruments')) 61 | makedirs(os.path.join(DATA_DIR, 'user-files', 'SFZ Instruments')) 62 | makedirs(os.path.join(DATA_DIR, 'user-files', 'Aida DSP Models')) 63 | makedirs(os.path.join(DATA_DIR, 'user-files', 'NAM Models')) 64 | 65 | # fake device setup 66 | makedirs(DEVICE_DIR) 67 | #os.environ['MOD_API_KEY'] = os.path.join(resdir, '..', 'mod_api_key.pub') 68 | os.environ['MOD_DEVICE_KEY'] = os.path.join(DEVICE_DIR, 'rsa') 69 | os.environ['MOD_DEVICE_TAG'] = os.path.join(DEVICE_DIR, 'tag') 70 | 71 | from datetime import datetime 72 | from random import randint 73 | 74 | if os.path.exists(DEVICE_DIR): 75 | if not os.path.isfile(os.environ['MOD_DEVICE_TAG']): 76 | with open(os.environ['MOD_DEVICE_TAG'], 'w') as fh: 77 | tag = 'MDS-{0}-0-00-000-{1}'.format(datetime.utcnow().strftime('%Y%m%d'), randint(9000, 9999)) 78 | fh.write(tag) 79 | if not os.path.isfile(os.environ['MOD_DEVICE_KEY']): 80 | try: 81 | key = RSA.generate(2048) 82 | with open(os.environ['MOD_DEVICE_KEY'], 'wb') as fh: 83 | fh.write(key.exportKey('PEM')) 84 | with open(os.environ['MOD_DEVICE_KEY'] + '.pub', 'wb') as fh: 85 | fh.write(key.publickey().exportKey('PEM')) 86 | except Exception as ex: 87 | print('Can\'t create a device key: {0}'.format(ex)) 88 | 89 | # import webserver after setting up environment 90 | from mod import webserver 91 | webserver.run() 92 | -------------------------------------------------------------------------------- /utils/cxfreeze/mod-ui.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | # ------------------------------------------------------------------------------------------------------------ 5 | # Imports (cx_Freeze) 6 | 7 | from cx_Freeze import setup, Executable 8 | 9 | # ------------------------------------------------------------------------------------------------------------ 10 | 11 | from sys import platform 12 | 13 | if platform == 'win32': 14 | exe = '.exe' 15 | s = '\\' 16 | else: 17 | exe = '' 18 | s = '/' 19 | 20 | # ------------------------------------------------------------------------------------------------------------ 21 | 22 | options = { 23 | "zip_include_packages": ["*"], 24 | "zip_exclude_packages": ["Cryptodome","PIL","mod","modtools","PyQt5"], 25 | "replace_paths": [["*",f".{s}lib{s}"]], 26 | "build_exe": f".{s}build-ui", 27 | "optimize": True, 28 | } 29 | 30 | exe_options = { 31 | "script": f".{s}utils{s}cxfreeze{s}mod-ui-setup.py", 32 | "copyright": "Copyright (C) 2012-2024 MOD Audio UG", 33 | "targetName": f"mod-ui{exe}", 34 | } 35 | 36 | setup(name = "mod-ui", 37 | version = "0.0.0", 38 | description = "MOD Web interface", 39 | options = {"build_exe": options}, 40 | executables = [Executable(**exe_options)]) 41 | 42 | # ------------------------------------------------------------------------------------------------------------ 43 | -------------------------------------------------------------------------------- /utils/debug/jackd: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd "$(dirname $0)/../../build" 4 | 5 | export LANG=en_US.UTF-8 6 | export PAWPAW_QUIET=1 7 | export PAWPAW_SKIP_LTO=1 8 | 9 | function convert_path() { 10 | if [ -e jackd.exe ]; then 11 | echo "Z:\\$(echo ${@} | tr '/' '\\')" 12 | else 13 | echo ${@} 14 | fi 15 | } 16 | 17 | if [ -e mod-desktop.app ]; then 18 | DOCS_DIR="${HOME}/Documents" 19 | else 20 | DOCS_DIR="$(xdg-user-dir DOCUMENTS)" 21 | fi 22 | 23 | if [ -e jackd.exe ]; then 24 | source ../src/PawPaw/local.env win64 25 | JACKD="wine jackd.exe" 26 | if ! jack_wait -c | grep -q "not running"; then 27 | JACK_DRIVER="portaudio" 28 | JACK_DRIVER_OPTS="-d \"ASIO::WineASIO Driver\"" 29 | else 30 | JACK_DRIVER="dummy" 31 | JACK_DRIVER_OPTS="" 32 | fi 33 | JACK_SESSION="-C ./jack/jack-session.conf -X winmme" 34 | PATH_SEP=';' 35 | elif [ -e mod-desktop.app ]; then 36 | if [ "$(uname -m)" = "x86_64" ] && [ x"${1}" != x"macos-universal-10.15" ]; then 37 | source ../src/PawPaw/local.env macos-10.15 38 | else 39 | source ../src/PawPaw/local.env macos-universal-10.15 40 | fi 41 | JACKD="$(pwd)/mod-desktop.app/Contents/MacOS/jackd" 42 | JACK_DRIVER="coreaudio" 43 | JACK_DRIVER_OPTS="-P default" 44 | JACK_SESSION="-C ./mod-desktop.app/Contents/MacOS/jack/jack-session.conf -X coremidi" 45 | PATH_SEP=':' 46 | export DYLD_LIBRARY_PATH="${PAWPAW_PREFIX}/lib${DYLD_LIBRARY_PATH:+:$DYLD_LIBRARY_PATH}" 47 | export JACK_DRIVER_DIR="$(pwd)/mod-desktop.app/Contents/MacOS/jack" 48 | else 49 | source ../src/PawPaw/local.env linux 50 | JACKD="$(pwd)/jackd" 51 | if ! jack_wait -c | grep -q "not running"; then 52 | JACK_DRIVER="portaudio" 53 | JACK_DRIVER_OPTS="-d JACK::system" 54 | else 55 | JACK_DRIVER="dummy" 56 | JACK_DRIVER_OPTS="" 57 | fi 58 | JACK_SESSION="-C ./jack/jack-session-alsamidi.conf" 59 | PATH_SEP=':' 60 | export LD_BIND_NOW=1 61 | export LD_LIBRARY_PATH="${PAWPAW_PREFIX}/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" 62 | export JACK_DRIVER_DIR="$(pwd)/jack" 63 | if [ -e "/usr/lib/x86_64-linux-gnu/pipewire-0.3/jack/libjack.so.0" ] && [ -e "/etc/ld.so.conf.d/pipewire-jack-x86_64-linux-gnu.conf" ]; then 64 | export JACKBRIDGE_FILENAME="/usr/lib/x86_64-linux-gnu/pipewire-0.3/jack/libjack.so.0" 65 | fi 66 | fi 67 | 68 | LV2_PATH="$(convert_path "${DOCS_DIR}/MOD Desktop/lv2")" 69 | if [ -e mod-desktop.app ]; then 70 | LV2_PATH+=":$(convert_path $(pwd)/mod-desktop.app/Contents/LV2)" 71 | else 72 | LV2_PATH="${PATH_SEP}$(convert_path $(pwd)/plugins)" 73 | fi 74 | export LV2_PATH 75 | 76 | export MOD_DESKTOP=1 77 | export MOD_DEVICE_HOST_PORT=18182 78 | export MOD_KEYS_PATH="$(convert_path "${DOCS_DIR}/MOD Desktop/keys/")" 79 | export MOD_USER_FILES_DIR="$(convert_path "${DOCS_DIR}/MOD Desktop/user-files")" 80 | 81 | export JACK_NO_START_SERVER=1 82 | 83 | # export MOD_LOG=1 84 | # export MOD_PLUGIN_THREAD_PRIORITY=57 85 | 86 | mkdir -p "${DOCS_DIR}/MOD Desktop/keys" 87 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/Audio Recordings" 88 | 89 | # DEBUG="lldb --" 90 | 91 | echo ${JACKD} -R -S -n mod-desktop ${JACK_SESSION} -d ${JACK_DRIVER} ${JACK_DRIVER_OPTS} -r 48000 -p 256 92 | exec ${DEBUG} ${JACKD} -R -S -n mod-desktop ${JACK_SESSION} -d ${JACK_DRIVER} ${JACK_DRIVER_OPTS} -r 48000 -p 256 93 | -------------------------------------------------------------------------------- /utils/debug/mod-ui: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd "$(dirname $0)/../../build" 4 | 5 | export LANG=en_US.UTF-8 6 | export PAWPAW_QUIET=1 7 | export PAWPAW_SKIP_LTO=1 8 | 9 | function convert_path() { 10 | if [ -e jackd.exe ]; then 11 | echo "Z:\\$(echo ${@} | tr '/' '\\')" 12 | else 13 | echo ${@} 14 | fi 15 | } 16 | 17 | if [ -e mod-ui.exe ]; then 18 | source ../src/PawPaw/local.env win64 19 | PATH_SEP=';' 20 | elif [ -e mod-desktop.app ]; then 21 | if [ "$(uname -m)" = "x86_64" ] && [ x"${1}" != x"macos-universal-10.15" ]; then 22 | source ../src/PawPaw/local.env macos-10.15 23 | else 24 | source ../src/PawPaw/local.env macos-universal-10.15 25 | fi 26 | export DYLD_LIBRARY_PATH="${PAWPAW_PREFIX}/lib${DYLD_LIBRARY_PATH:+:$DYLD_LIBRARY_PATH}" 27 | PATH_SEP=':' 28 | else 29 | source ../src/PawPaw/local.env linux 30 | export LD_LIBRARY_PATH="${PAWPAW_PREFIX}/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" 31 | PATH_SEP=':' 32 | fi 33 | 34 | if [ -e mod-desktop.app ]; then 35 | DOCS_DIR="${HOME}/Documents" 36 | else 37 | DOCS_DIR="$(xdg-user-dir DOCUMENTS)" 38 | fi 39 | 40 | PYTHON="${EXE_WRAPPER} ${PAWPAW_PREFIX}/bin/python3${APP_EXT}" 41 | 42 | LV2_PATH="$(convert_path "${DOCS_DIR}/MOD Desktop/lv2")" 43 | if [ -e mod-desktop.app ]; then 44 | LV2_PATH+=":$(convert_path $(pwd)/mod-desktop.app/Contents/LV2)" 45 | else 46 | LV2_PATH="${PATH_SEP}$(convert_path $(pwd)/plugins)" 47 | fi 48 | export LV2_PATH 49 | 50 | export MOD_DATA_DIR="$(convert_path "${DOCS_DIR}/MOD Desktop")" 51 | export MOD_DESKTOP=1 52 | export MOD_DEV_ENVIRONMENT=0 53 | export MOD_DEVICE_HOST_PORT=18182 54 | export MOD_DEVICE_WEBSERVER_PORT=18181 55 | export MOD_HARDWARE_DESC_FILE="$(convert_path $(pwd)/mod-hardware-descriptor.json)" 56 | export MOD_KEYS_PATH="$(convert_path "${DOCS_DIR}/MOD Desktop/keys/")" 57 | export MOD_USER_FILES_DIR="$(convert_path "${DOCS_DIR}/MOD Desktop/user-files")" 58 | export MOD_USER_PEDALBOARDS_DIR="$(convert_path "${DOCS_DIR}/MOD Desktop/pedalboards")" 59 | export MOD_USER_PLUGINS_DIR="$(convert_path "${DOCS_DIR}/MOD Desktop/lv2")" 60 | # export MOD_LOG=2 61 | 62 | export JACK_NO_START_SERVER=1 63 | 64 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/Audio Loops" 65 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/Audio Recordings" 66 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/Audio Samples" 67 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/Audio Tracks" 68 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/MIDI Clips" 69 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/MIDI Songs" 70 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/Reverb IRs" 71 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/Speaker Cabinets IRs" 72 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/Hydrogen Drumkits" 73 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/SF2 Instruments" 74 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/SFZ Instruments" 75 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/Aida DSP Models" 76 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/NAM Models" 77 | 78 | cd ../src/mod-ui 79 | 80 | export MOD_DEFAULT_PEDALBOARD="$(convert_path $(pwd)/default.pedalboard)" 81 | export MOD_HTML_DIR="$(convert_path $(pwd)/html)" 82 | 83 | echo "Starting webserver using http://localhost:${MOD_DEVICE_WEBSERVER_PORT}/..." 84 | 85 | exec ${PYTHON} -c "from mod import webserver; webserver.run()" 86 | -------------------------------------------------------------------------------- /utils/jack/jack-session-alsamidi.conf: -------------------------------------------------------------------------------- 1 | l system_midi alsa_midi 2 | l mod-midi-merger mod-midi-merger 3 | l mod-midi-broadcaster mod-midi-broadcaster 4 | l mod-host mod-host 5 | -------------------------------------------------------------------------------- /utils/jack/jack-session.conf: -------------------------------------------------------------------------------- 1 | l mod-midi-merger mod-midi-merger 2 | l mod-midi-broadcaster mod-midi-broadcaster 3 | l mod-host mod-host 4 | -------------------------------------------------------------------------------- /utils/linux/linux-tar.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | if [ ! -d build ]; then 6 | echo "Please run this script from the root folder" 7 | exit 8 | fi 9 | 10 | rm -rf mod-ui/mod/__pycache__ 11 | rm -rf mod-ui/mod/communication/__pycache__ 12 | rm -rf mod-ui/modtools/__pycache__ 13 | ./utils/pack-html.sh 14 | 15 | [ -n "${PAWPAW_DEBUG}" ] && [ "${PAWPAW_DEBUG}" -eq 1 ] && SUFFIX="-debug" 16 | 17 | ARCH=$(uname -m) 18 | VERSION="$(cat VERSION)" 19 | mkdir -p mod-desktop-${VERSION}-linux-${ARCH}${SUFFIX}/plugin-variants 20 | mv build mod-desktop-${VERSION}-linux-${ARCH}${SUFFIX}/mod-desktop 21 | cp utils/linux/mod-desktop.* mod-desktop-${VERSION}-linux-${ARCH}${SUFFIX}/ 22 | cp -r build-plugin/*.* mod-desktop-${VERSION}-linux-${ARCH}${SUFFIX}/plugin-variants/ 23 | tar chJf mod-desktop-${VERSION}-linux-${ARCH}${SUFFIX}.tar.xz mod-desktop-${VERSION}-linux-${ARCH}${SUFFIX} 24 | -------------------------------------------------------------------------------- /utils/linux/mod-desktop.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Categories=AudioVideo;X-AudioEditing;Qt; 3 | Exec=bash -c '$(dirname "%k")/mod-desktop.run' 4 | GenericName=MOD Desktop 5 | Icon=audio 6 | Name=MOD Desktop 7 | Terminal=false 8 | Type=Application 9 | Version=1.0 10 | -------------------------------------------------------------------------------- /utils/linux/mod-desktop.run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | cd "$(dirname $0)/mod-desktop" 4 | exec "$(pwd)/mod-desktop" 5 | -------------------------------------------------------------------------------- /utils/linux/mod-hardware-descriptor.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "MOD Desktop", 3 | "platform": "desktop", 4 | "architecture": "x64_64", 5 | "bin-compat": "linux-x64_64", 6 | "factory_pedalboards": true 7 | } 8 | -------------------------------------------------------------------------------- /utils/macos/app.plist.in: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleDisplayName 8 | MOD Desktop 9 | CFBundleExecutable 10 | mod-desktop 11 | CFBundleIconFile 12 | mod-logo.icns 13 | CFBundleIdentifier 14 | audio.mod.desktop 15 | CFBundleShortVersionString 16 | @version@ 17 | NSHighResolutionCapable 18 | 19 | NSRequiresAquaSystemAppearance 20 | 21 | NSDocumentsFolderUsageDescription 22 | MOD Desktop stores pedalboards and user files in the Documents folder. 23 | NSMicrophoneUsageDescription 24 | MOD Desktop requires microphone permissions for audio input. 25 | CFBundleSupportedPlatforms 26 | 27 | MacOSX 28 | 29 | LSMinimumSystemVersion 30 | 10.15 31 | NSHumanReadableCopyright 32 | (C) 2023-2024 MOD Audio UG. 33 | This program is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. 34 | 35 | 36 | -------------------------------------------------------------------------------- /utils/macos/build.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | BundleHasStrictIdentifier 7 | 8 | BundleIsRelocatable 9 | 10 | BundleIsVersionChecked 11 | 12 | BundleOverwriteAction 13 | upgrade 14 | RootRelativeBundlePath 15 | MOD Desktop.app 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /utils/macos/entitlements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-jit 6 | 7 | com.apple.security.cs.allow-unsigned-executable-memory 8 | 9 | com.apple.security.device.audio-input 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /utils/macos/macos-dmg.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | if [ ! -d build ]; then 6 | echo "Please run this script from the root folder" 7 | exit 8 | fi 9 | 10 | if [ "$(uname -m)" = "x86_64" ] && [ x"${1}" != x"macos-universal-10.15" ]; then 11 | PAWPAW_PREFIX="${HOME}/PawPawBuilds/targets/macos-10.15" 12 | else 13 | PAWPAW_PREFIX="${HOME}/PawPawBuilds/targets/macos-universal-10.15" 14 | fi 15 | 16 | rm -rf build/dmg build/*.dmg 17 | rm -rf mod-ui/mod/__pycache__ 18 | rm -rf mod-ui/mod/communication/__pycache__ 19 | rm -rf mod-ui/modtools/__pycache__ 20 | ./utils/pack-html.sh 21 | 22 | # create dmg dir for placing patched app bundle inside 23 | mkdir build/dmg 24 | gcp -rL "build/mod-desktop.app" "build/dmg/MOD Desktop.app" 25 | 26 | # patch rpath for Qt libs and jack tools 27 | pushd "build/dmg/MOD Desktop.app/Contents" 28 | 29 | rm -rf Frameworks/*/*.prl 30 | rm -rf Frameworks/*/Headers 31 | rm -rf Frameworks/*/Versions 32 | rm -rf MacOS/data 33 | 34 | QTLIBS=("Core" "Gui" "OpenGL" "PrintSupport" "Svg" "Widgets") 35 | 36 | for f in $(ls Frameworks/*/Qt* PlugIns/*/libq*.dylib); do 37 | for q in "${QTLIBS[@]}"; do 38 | install_name_tool -change "@rpath/Qt${q}.framework/Versions/5/Qt${q}" "@executable_path/../Frameworks/Qt${q}.framework/Qt${q}" "${f}" 39 | done 40 | done 41 | 42 | for f in $(ls MacOS/lib/libmod_utils.so MacOS/libjack*.dylib); do 43 | install_name_tool -change "${PAWPAW_PREFIX}/lib/libjack.0.1.0.dylib" "@executable_path/libjack.0.dylib" "${f}" 44 | install_name_tool -change "${PAWPAW_PREFIX}/lib/libjackserver.0.1.0.dylib" "@executable_path/libjackserver.0.dylib" "${f}" 45 | done 46 | 47 | for f in $(ls MacOS/jackd MacOS/jack/*.so); do 48 | install_name_tool -change "${PAWPAW_PREFIX}/lib/libjack.0.1.0.dylib" "@executable_path/libjackserver.0.dylib" "${f}" 49 | install_name_tool -change "${PAWPAW_PREFIX}/lib/libjackserver.0.1.0.dylib" "@executable_path/libjackserver.0.dylib" "${f}" 50 | done 51 | 52 | popd 53 | 54 | # sign app bundle 55 | if [ -n "${CODESIGN_APP_IDENTITY}" ]; then 56 | security create-keychain -p dummypassword build.keychain 57 | security unlock-keychain -p dummypassword build.keychain 58 | security set-keychain-settings -lut 21600 build.keychain 59 | 60 | echo "${CODESIGN_APP_P12_CONTENTS}" | base64 -d -o codesign.p12 61 | security import codesign.p12 -f pkcs12 -P "${CODESIGN_APP_P12_PASSWORD}" -k build.keychain -T /usr/bin/codesign -T /usr/bin/security 62 | rm codesign.p12 63 | 64 | security set-key-partition-list -S apple-tool:,apple: -k dummypassword build.keychain 65 | security list-keychains -d user -s build.keychain login.keychain 66 | 67 | pushd "build/pkg/MOD Desktop.app/Contents/LV2" 68 | 69 | for f in $(find . -name "*.dylib"); do 70 | codesign -s "${CODESIGN_APP_IDENTITY}" \ 71 | --force \ 72 | --verbose \ 73 | --timestamp \ 74 | --option runtime \ 75 | --entitlements "../../../../../utils/macos/entitlements.plist" \ 76 | "${f}" 77 | done 78 | 79 | popd 80 | 81 | codesign -s "${CODESIGN_APP_IDENTITY}" \ 82 | --deep \ 83 | --force \ 84 | --verbose \ 85 | --timestamp \ 86 | --option runtime \ 87 | --entitlements "utils/macos/entitlements.plist" \ 88 | "build/pkg/MOD Desktop.app" 89 | fi 90 | 91 | # create dmg 92 | hdiutil create "mod-desktop-$(cat VERSION)-macOS.dmg" -srcfolder build/dmg -volname "MOD Desktop" -fs HFS+ -ov 93 | 94 | if [ -n "${CODESIGN_IDENTITY}" ]; then 95 | codesign -s "${MACOS_APP_DEV_ID}" \ 96 | --force \ 97 | --verbose \ 98 | --timestamp \ 99 | --option runtime \ 100 | --entitlements "utils/macos/entitlements.plist" \ 101 | "mod-desktop-$(cat VERSION)-macOS.dmg" 102 | security delete-keychain build.keychain 103 | fi 104 | 105 | # cleanup 106 | rm -rf build/dmg 107 | -------------------------------------------------------------------------------- /utils/macos/macos-pkg.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | if [ ! -d build ]; then 6 | echo "Please run this script from the root folder" 7 | exit 8 | fi 9 | 10 | if [ "$(uname -m)" = "x86_64" ] && [ x"${1}" != x"macos-universal-10.15" ]; then 11 | PAWPAW_PREFIX="${HOME}/PawPawBuilds/targets/macos-10.15" 12 | else 13 | PAWPAW_PREFIX="${HOME}/PawPawBuilds/targets/macos-universal-10.15" 14 | fi 15 | 16 | rm -rf build/pkg build/*.pkg 17 | rm -rf mod-ui/mod/__pycache__ 18 | rm -rf mod-ui/mod/communication/__pycache__ 19 | rm -rf mod-ui/modtools/__pycache__ 20 | ./utils/pack-html.sh 21 | 22 | # create pkg dir for placing patched app bundle inside 23 | mkdir build/pkg build/pkg/app 24 | gcp -rL "build/mod-desktop.app" "build/pkg/app/MOD Desktop.app" 25 | 26 | # create pkg dir for plugins 27 | mkdir build/pkg/au build/pkg/clap build/pkg/lv2 build/pkg/vst2 build/pkg/vst3 28 | gcp -rL build-plugin/*.component build/pkg/au/ 29 | gcp -rL build-plugin/*.clap build/pkg/clap/ 30 | gcp -rL build-plugin/*.lv2 build/pkg/lv2/ 31 | gcp -rL build-plugin/*.vst build/pkg/vst2/ 32 | gcp -rL build-plugin/*.vst3 build/pkg/vst3/ 33 | 34 | # patch rpath for Qt libs and jack tools 35 | pushd "build/pkg/app/MOD Desktop.app/Contents" 36 | 37 | rm -rf Frameworks/*/*.prl 38 | rm -rf Frameworks/*/Headers 39 | rm -rf Frameworks/*/Versions 40 | rm -rf MacOS/data 41 | 42 | QTLIBS=("Core" "Gui" "OpenGL" "PrintSupport" "Svg" "Widgets") 43 | 44 | for f in $(ls Frameworks/*/Qt* PlugIns/*/libq*.dylib); do 45 | for q in "${QTLIBS[@]}"; do 46 | install_name_tool -change "@rpath/Qt${q}.framework/Versions/5/Qt${q}" "@executable_path/../Frameworks/Qt${q}.framework/Qt${q}" "${f}" 47 | done 48 | done 49 | 50 | for f in $(ls MacOS/lib/libmod_utils.so MacOS/libjack*.dylib); do 51 | install_name_tool -change "${PAWPAW_PREFIX}/lib/libjack.0.1.0.dylib" "@executable_path/libjack.0.dylib" "${f}" 52 | install_name_tool -change "${PAWPAW_PREFIX}/lib/libjackserver.0.1.0.dylib" "@executable_path/libjackserver.0.dylib" "${f}" 53 | done 54 | 55 | for f in $(ls MacOS/jackd MacOS/jack/*.so); do 56 | install_name_tool -change "${PAWPAW_PREFIX}/lib/libjack.0.1.0.dylib" "@executable_path/libjackserver.0.dylib" "${f}" 57 | install_name_tool -change "${PAWPAW_PREFIX}/lib/libjackserver.0.1.0.dylib" "@executable_path/libjackserver.0.dylib" "${f}" 58 | done 59 | 60 | popd 61 | 62 | # sign app bundle 63 | if [ -n "${CODESIGN_APP_IDENTITY}" ]; then 64 | security create-keychain -p dummypassword build.keychain 65 | security unlock-keychain -p dummypassword build.keychain 66 | security set-keychain-settings -lut 21600 build.keychain 67 | 68 | echo "${CODESIGN_APP_P12_CONTENTS}" | base64 -d -o codesign.p12 69 | security import codesign.p12 -f pkcs12 -P "${CODESIGN_APP_P12_PASSWORD}" -k build.keychain -T /usr/bin/codesign -T /usr/bin/security 70 | rm codesign.p12 71 | 72 | echo "${CODESIGN_PKG_P12_CONTENTS}" | base64 -d -o codesign.p12 73 | security import codesign.p12 -f pkcs12 -P "${CODESIGN_PKG_P12_PASSWORD}" -k build.keychain -T /usr/bin/pkgbuild -T /usr/bin/productbuild -T /usr/bin/security 74 | rm codesign.p12 75 | 76 | security set-key-partition-list -S apple-tool:,apple: -k dummypassword build.keychain 77 | security list-keychains -d user -s build.keychain login.keychain 78 | 79 | pushd "build/pkg/app/MOD Desktop.app/Contents/LV2" 80 | 81 | for f in $(find . -name "*.dylib"); do 82 | codesign -s "${CODESIGN_APP_IDENTITY}" \ 83 | --force \ 84 | --verbose \ 85 | --timestamp \ 86 | --option runtime \ 87 | --entitlements "../../../../../../utils/macos/entitlements.plist" \ 88 | "${f}" 89 | done 90 | 91 | popd 92 | 93 | codesign -s "${CODESIGN_APP_IDENTITY}" \ 94 | --deep \ 95 | --force \ 96 | --verbose \ 97 | --timestamp \ 98 | --option runtime \ 99 | --entitlements "utils/macos/entitlements.plist" \ 100 | "build/pkg/app/MOD Desktop.app" 101 | 102 | codesign -s "${CODESIGN_APP_IDENTITY}" \ 103 | --deep \ 104 | --force \ 105 | --verbose \ 106 | --timestamp \ 107 | --option runtime \ 108 | --entitlements "utils/macos/entitlements.plist" \ 109 | build/pkg/clap/*.clap 110 | 111 | codesign -s "${CODESIGN_APP_IDENTITY}" \ 112 | --force \ 113 | --verbose \ 114 | --timestamp \ 115 | --option runtime \ 116 | --entitlements "utils/macos/entitlements.plist" \ 117 | build/pkg/lv2/*.lv2/*.dylib 118 | 119 | codesign -s "${CODESIGN_APP_IDENTITY}" \ 120 | --deep \ 121 | --force \ 122 | --verbose \ 123 | --timestamp \ 124 | --option runtime \ 125 | --entitlements "utils/macos/entitlements.plist" \ 126 | build/pkg/vst2/*.vst 127 | 128 | codesign -s "${CODESIGN_APP_IDENTITY}" \ 129 | --deep \ 130 | --force \ 131 | --verbose \ 132 | --timestamp \ 133 | --option runtime \ 134 | --entitlements "utils/macos/entitlements.plist" \ 135 | build/pkg/vst3/*.vst3 136 | 137 | PKG_SIGN_ARGS=(--sign "${CODESIGN_PKG_IDENTITY}") 138 | fi 139 | 140 | # create base app pkg 141 | pkgbuild \ 142 | --identifier "audio.mod.desktop-app" \ 143 | --component-plist "utils/macos/build.plist" \ 144 | --install-location "/Applications/" \ 145 | --root "${PWD}/build/pkg/app/" \ 146 | "${PKG_SIGN_ARGS[@]}" \ 147 | build/mod-desktop.pkg 148 | 149 | # create plugins pkgs 150 | pkgbuild \ 151 | --identifier "audio.mod.desktop-components" \ 152 | --install-location "/Library/Audio/Plug-Ins/Components/" \ 153 | --root "${PWD}/build/pkg/au/" \ 154 | "${PKG_SIGN_ARGS[@]}" \ 155 | build/mod-desktop-components.pkg 156 | 157 | pkgbuild \ 158 | --identifier "audio.mod.desktop-clapbundles" \ 159 | --install-location "/Library/Audio/Plug-Ins/CLAP/" \ 160 | --root "${PWD}/build/pkg/clap/" \ 161 | "${PKG_SIGN_ARGS[@]}" \ 162 | build/mod-desktop-clapbundles.pkg 163 | 164 | pkgbuild \ 165 | --identifier "audio.mod.desktop-lv2bundles" \ 166 | --install-location "/Library/Audio/Plug-Ins/LV2/" \ 167 | --root "${PWD}/build/pkg/lv2/" \ 168 | "${PKG_SIGN_ARGS[@]}" \ 169 | build/mod-desktop-lv2bundles.pkg 170 | 171 | pkgbuild \ 172 | --identifier "audio.mod.desktop-vst2bundles" \ 173 | --install-location "/Library/Audio/Plug-Ins/VST/" \ 174 | --root "${PWD}/build/pkg/vst2/" \ 175 | "${PKG_SIGN_ARGS[@]}" \ 176 | build/mod-desktop-vst2bundles.pkg 177 | 178 | pkgbuild \ 179 | --identifier "audio.mod.desktop-vst3bundles" \ 180 | --install-location "/Library/Audio/Plug-Ins/VST3/" \ 181 | --root "${PWD}/build/pkg/vst3/" \ 182 | "${PKG_SIGN_ARGS[@]}" \ 183 | build/mod-desktop-vst3bundles.pkg 184 | 185 | # create final pkg 186 | sed -e "s|@builddir@|${PWD}/build|" \ 187 | utils/macos/package.xml.in > build/package.xml 188 | 189 | productbuild \ 190 | --distribution build/package.xml \ 191 | --identifier "audio.mod.desktop-app" \ 192 | --package-path "${PWD}/build" \ 193 | --version 0 \ 194 | "${PKG_SIGN_ARGS[@]}" \ 195 | mod-desktop-$(cat VERSION)-macOS.pkg 196 | 197 | # cleanup 198 | rm -rf build/pkg 199 | [ -n "${CODESIGN_APP_IDENTITY}" ] && security delete-keychain build.keychain 200 | 201 | exit 0 202 | -------------------------------------------------------------------------------- /utils/macos/mod-hardware-descriptor.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "MOD Desktop", 3 | "platform": "desktop", 4 | "architecture": "universal", 5 | "bin-compat": "macos-universal", 6 | "factory_pedalboards": true 7 | } 8 | -------------------------------------------------------------------------------- /utils/macos/package.xml.in: -------------------------------------------------------------------------------- 1 | 2 | 3 | MOD Desktop 4 | 5 | 6 | 7 | 8 | 9 | 10 | mod-desktop.pkg 11 | 12 | 13 | mod-desktop-components.pkg 14 | 15 | 16 | mod-desktop-clapbundles.pkg 17 | 18 | 19 | mod-desktop-lv2bundles.pkg 20 | 21 | 22 | mod-desktop-vst2bundles.pkg 23 | 24 | 25 | mod-desktop-vst3bundles.pkg 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /utils/macos/welcome.txt: -------------------------------------------------------------------------------- 1 | MOD Audio is on the desktop! 2 | 3 | This is an installer for MOD Desktop for macOS. 4 | After installation a "MOD Desktop" app will be available on your applications folder. 5 | 6 | NOTE: At this point this tool should be considered in beta state. 7 | Most things already work but we are still tweaking and fixing a lot. 8 | Feedback and testing is very much appreciated, make sure to report issues you find during your own testing. 9 | 10 | Discussion page: https://forum.mod.audio/t/introducing-the-mod-app-for-desktops-beta-release/10495 11 | Project page: https://github.com/moddevices/mod-desktop 12 | -------------------------------------------------------------------------------- /utils/pack-html.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | if [ ! -d build ]; then 6 | echo "Please run this script from the root folder" 7 | exit 8 | fi 9 | 10 | ROOT="$(pwd)" 11 | 12 | if [ -e build/mod-desktop.app ]; then 13 | HTML_DIR="build/mod-desktop.app/Contents/Resources/html" 14 | else 15 | HTML_DIR="build/html" 16 | fi 17 | 18 | rm -rf "${HTML_DIR}" 19 | mkdir "${HTML_DIR}" 20 | cd "${HTML_DIR}" 21 | 22 | cp ${ROOT}/src/mod-ui/html/*.html ./ 23 | cp ${ROOT}/src/mod-ui/html/favicon.ico ./ 24 | 25 | mkdir ./css 26 | cp ${ROOT}/src/mod-ui/html/css/*.css ./css/ 27 | 28 | mkdir ./css/fontello 29 | mkdir ./css/fontello/css 30 | cp ${ROOT}/src/mod-ui/html/css/fontello/css/*.css ./css/fontello/css/ 31 | 32 | mkdir ./css/fontello/font 33 | cp ${ROOT}/src/mod-ui/html/css/fontello/font/*.eot ./css/fontello/font/ 34 | cp ${ROOT}/src/mod-ui/html/css/fontello/font/*.svg ./css/fontello/font/ 35 | cp ${ROOT}/src/mod-ui/html/css/fontello/font/*.ttf ./css/fontello/font/ 36 | cp ${ROOT}/src/mod-ui/html/css/fontello/font/*.woff ./css/fontello/font/ 37 | cp ${ROOT}/src/mod-ui/html/css/fontello/font/*.woff2 ./css/fontello/font/ 38 | 39 | mkdir ./fonts 40 | mkdir ./fonts/Ek-Mukta 41 | mkdir ./fonts/Ek-Mukta/Ek-Mukta-200 42 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-200/*.eot ./fonts/Ek-Mukta/Ek-Mukta-200/ 43 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-200/*.svg ./fonts/Ek-Mukta/Ek-Mukta-200/ 44 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-200/*.ttf ./fonts/Ek-Mukta/Ek-Mukta-200/ 45 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-200/*.woff ./fonts/Ek-Mukta/Ek-Mukta-200/ 46 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-200/*.woff2 ./fonts/Ek-Mukta/Ek-Mukta-200/ 47 | 48 | mkdir ./fonts/Ek-Mukta/Ek-Mukta-600 49 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-600/*.eot ./fonts/Ek-Mukta/Ek-Mukta-600/ 50 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-600/*.svg ./fonts/Ek-Mukta/Ek-Mukta-600/ 51 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-600/*.ttf ./fonts/Ek-Mukta/Ek-Mukta-600/ 52 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-600/*.woff ./fonts/Ek-Mukta/Ek-Mukta-600/ 53 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-600/*.woff2 ./fonts/Ek-Mukta/Ek-Mukta-600/ 54 | 55 | mkdir ./fonts/Ek-Mukta/Ek-Mukta-700 56 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-700/*.eot ./fonts/Ek-Mukta/Ek-Mukta-700/ 57 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-700/*.svg ./fonts/Ek-Mukta/Ek-Mukta-700/ 58 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-700/*.ttf ./fonts/Ek-Mukta/Ek-Mukta-700/ 59 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-700/*.woff ./fonts/Ek-Mukta/Ek-Mukta-700/ 60 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-700/*.woff2 ./fonts/Ek-Mukta/Ek-Mukta-700/ 61 | 62 | mkdir ./fonts/Ek-Mukta/Ek-Mukta-regular 63 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-regular/*.eot ./fonts/Ek-Mukta/Ek-Mukta-regular/ 64 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-regular/*.svg ./fonts/Ek-Mukta/Ek-Mukta-regular/ 65 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-regular/*.ttf ./fonts/Ek-Mukta/Ek-Mukta-regular/ 66 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-regular/*.woff ./fonts/Ek-Mukta/Ek-Mukta-regular/ 67 | cp ${ROOT}/src/mod-ui/html/fonts/Ek-Mukta/Ek-Mukta-regular/*.woff2 ./fonts/Ek-Mukta/Ek-Mukta-regular/ 68 | 69 | mkdir ./fonts/comforta 70 | cp ${ROOT}/src/mod-ui/html/fonts/comforta/*.ttf ./fonts/comforta/ 71 | 72 | mkdir ./fonts/cooper 73 | cp ${ROOT}/src/mod-ui/html/fonts/cooper/*.eot ./fonts/cooper/ 74 | cp ${ROOT}/src/mod-ui/html/fonts/cooper/*.ttf ./fonts/cooper/ 75 | cp ${ROOT}/src/mod-ui/html/fonts/cooper/*.woff ./fonts/cooper/ 76 | cp ${ROOT}/src/mod-ui/html/fonts/cooper/*.woff2 ./fonts/cooper/ 77 | 78 | mkdir ./fonts/css 79 | cp ${ROOT}/src/mod-ui/html/fonts/css/*.css ./fonts/css/ 80 | 81 | mkdir ./fonts/england-hand 82 | cp ${ROOT}/src/mod-ui/html/fonts/england-hand/*.css ./fonts/england-hand/ 83 | cp ${ROOT}/src/mod-ui/html/fonts/england-hand/*.eot ./fonts/england-hand/ 84 | cp ${ROOT}/src/mod-ui/html/fonts/england-hand/*.svg ./fonts/england-hand/ 85 | cp ${ROOT}/src/mod-ui/html/fonts/england-hand/*.ttf ./fonts/england-hand/ 86 | cp ${ROOT}/src/mod-ui/html/fonts/england-hand/*.woff ./fonts/england-hand/ 87 | 88 | mkdir ./fonts/epf 89 | cp ${ROOT}/src/mod-ui/html/fonts/epf/*.css ./fonts/epf/ 90 | cp ${ROOT}/src/mod-ui/html/fonts/epf/*.eot ./fonts/epf/ 91 | cp ${ROOT}/src/mod-ui/html/fonts/epf/*.svg ./fonts/epf/ 92 | cp ${ROOT}/src/mod-ui/html/fonts/epf/*.ttf ./fonts/epf/ 93 | cp ${ROOT}/src/mod-ui/html/fonts/epf/*.woff ./fonts/epf/ 94 | 95 | mkdir ./fonts/nexa 96 | cp ${ROOT}/src/mod-ui/html/fonts/nexa/*.css ./fonts/nexa/ 97 | cp ${ROOT}/src/mod-ui/html/fonts/nexa/*.eot ./fonts/nexa/ 98 | cp ${ROOT}/src/mod-ui/html/fonts/nexa/*.svg ./fonts/nexa/ 99 | cp ${ROOT}/src/mod-ui/html/fonts/nexa/*.ttf ./fonts/nexa/ 100 | cp ${ROOT}/src/mod-ui/html/fonts/nexa/*.woff ./fonts/nexa/ 101 | 102 | mkdir ./fonts/pirulen 103 | cp ${ROOT}/src/mod-ui/html/fonts/pirulen/*.css ./fonts/pirulen/ 104 | cp ${ROOT}/src/mod-ui/html/fonts/pirulen/*.eot ./fonts/pirulen/ 105 | cp ${ROOT}/src/mod-ui/html/fonts/pirulen/*.ttf ./fonts/pirulen/ 106 | cp ${ROOT}/src/mod-ui/html/fonts/pirulen/*.woff ./fonts/pirulen/ 107 | 108 | mkdir ./fonts/questrial 109 | cp ${ROOT}/src/mod-ui/html/fonts/questrial/*.css ./fonts/questrial/ 110 | cp ${ROOT}/src/mod-ui/html/fonts/questrial/*.eot ./fonts/questrial/ 111 | cp ${ROOT}/src/mod-ui/html/fonts/questrial/*.svg ./fonts/questrial/ 112 | cp ${ROOT}/src/mod-ui/html/fonts/questrial/*.ttf ./fonts/questrial/ 113 | cp ${ROOT}/src/mod-ui/html/fonts/questrial/*.woff ./fonts/questrial/ 114 | 115 | mkdir ./img 116 | cp ${ROOT}/src/mod-ui/html/img/*.gif ./img/ 117 | cp ${ROOT}/src/mod-ui/html/img/*.jpg ./img/ 118 | cp ${ROOT}/src/mod-ui/html/img/*.png ./img/ 119 | cp ${ROOT}/src/mod-ui/html/img/*.svg ./img/ 120 | 121 | mkdir ./img/cloud 122 | cp ${ROOT}/src/mod-ui/html/img/cloud/*.png ./img/cloud/ 123 | 124 | mkdir ./img/favicon 125 | cp ${ROOT}/src/mod-ui/html/img/favicon/*.png ./img/favicon/ 126 | 127 | mkdir ./img/icons 128 | cp ${ROOT}/src/mod-ui/html/img/icons/*.css ./img/icons/ 129 | cp ${ROOT}/src/mod-ui/html/img/icons/*.svg ./img/icons/ 130 | cp ${ROOT}/src/mod-ui/html/img/icons/*.png ./img/icons/ 131 | 132 | mkdir ./img/icons/25 133 | cp ${ROOT}/src/mod-ui/html/img/icons/25/*.png ./img/icons/25/ 134 | 135 | mkdir ./img/icons/36 136 | cp ${ROOT}/src/mod-ui/html/img/icons/36/*.png ./img/icons/36/ 137 | 138 | mkdir ./img/social 139 | cp ${ROOT}/src/mod-ui/html/img/social/*.png ./img/social/ 140 | 141 | mkdir ./include 142 | cp ${ROOT}/src/mod-ui/html/include/*.html ./include/ 143 | 144 | mkdir ./js 145 | cp ${ROOT}/src/mod-ui/html/js/*.js ./js/ 146 | 147 | mkdir ./js/utils 148 | cp ${ROOT}/src/mod-ui/html/js/utils/*.js ./js/utils/ 149 | 150 | mkdir ./js/lib 151 | cp ${ROOT}/src/mod-ui/html/js/lib/*.js ./js/lib/ 152 | 153 | mkdir ./js/lib/slick 154 | cp ${ROOT}/src/mod-ui/html/js/lib/slick/*.js ./js/lib/slick/ 155 | cp ${ROOT}/src/mod-ui/html/js/lib/slick/*.css ./js/lib/slick/ 156 | cp ${ROOT}/src/mod-ui/html/js/lib/slick/*.gif ./js/lib/slick/ 157 | 158 | mkdir ./js/lib/slick/fonts 159 | cp ${ROOT}/src/mod-ui/html/js/lib/slick/fonts/*.eot ./js/lib/slick/fonts/ 160 | cp ${ROOT}/src/mod-ui/html/js/lib/slick/fonts/*.svg ./js/lib/slick/fonts/ 161 | cp ${ROOT}/src/mod-ui/html/js/lib/slick/fonts/*.ttf ./js/lib/slick/fonts/ 162 | cp ${ROOT}/src/mod-ui/html/js/lib/slick/fonts/*.woff ./js/lib/slick/fonts/ 163 | 164 | mkdir ./resources 165 | cp ${ROOT}/src/mod-ui/html/resources/*.html ./resources/ 166 | 167 | mkdir ./resources/pedals 168 | cp ${ROOT}/src/mod-ui/html/resources/pedals/*.css ./resources/pedals/ 169 | cp ${ROOT}/src/mod-ui/html/resources/pedals/*.png ./resources/pedals/ 170 | 171 | mkdir ./resources/templates 172 | cp ${ROOT}/src/mod-ui/html/resources/templates/*.html ./resources/templates/ 173 | -------------------------------------------------------------------------------- /utils/plugin-builder/plugin-builder.mk: -------------------------------------------------------------------------------- 1 | 2 | # Case conversion macros. This is inspired by the 'up' macro from gmsl 3 | # (http://gmsl.sf.net). It is optimised very heavily because these macros 4 | # are used a lot. It is about 5 times faster than forking a shell and tr. 5 | # 6 | # The caseconvert-helper creates a definition of the case conversion macro. 7 | # After expansion by the outer $(eval ), the UPPERCASE macro is defined as: 8 | # $(strip $(eval __tmp := $(1)) $(eval __tmp := $(subst a,A,$(__tmp))) ... ) 9 | # In other words, every letter is substituted one by one. 10 | # 11 | # The caseconvert-helper allows us to create this definition out of the 12 | # [FROM] and [TO] lists, so we don't need to write down every substition 13 | # manually. The uses of $ and $$ quoting are chosen in order to do as 14 | # much expansion as possible up-front. 15 | # 16 | # Note that it would be possible to conceive a slightly more optimal 17 | # implementation that avoids the use of __tmp, but that would be even 18 | # more unreadable and is not worth the effort. 19 | 20 | [FROM] := a b c d e f g h i j k l m n o p q r s t u v w x y z - . 21 | [TO] := A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ _ 22 | 23 | define caseconvert-helper 24 | $(1) = $$(strip \ 25 | $$(eval __tmp := $$(1))\ 26 | $(foreach c, $(2),\ 27 | $$(eval __tmp := $$(subst $(word 1,$(subst :, ,$c)),$(word 2,$(subst :, ,$c)),$$(__tmp))))\ 28 | $$(__tmp)) 29 | endef 30 | 31 | $(eval $(call caseconvert-helper,UPPERCASE,$(join $(addsuffix :,$([FROM])),$([TO])))) 32 | $(eval $(call caseconvert-helper,LOWERCASE,$(join $(addsuffix :,$([TO])),$([FROM])))) 33 | 34 | # utilities 35 | blank = 36 | comma = , 37 | space = $(blank) $(blank) 38 | 39 | # Sanitize macro cleans up generic strings so it can be used as a filename 40 | # and in rules. Particularly useful for VCS version strings, that can contain 41 | # slashes, colons (OK in filenames but not in rules), and spaces. 42 | sanitize = $(subst $(space),_,$(subst :,_,$(subst /,_,$(strip $(1))))) 43 | 44 | # github(user,package,version): returns site of GitHub repository 45 | github = https://github.com/$(1)/$(2)/archive/$(3) 46 | 47 | # custom for PawPaw 48 | 49 | PKG = $(call UPPERCASE,$(call sanitize,$(pkgname))) 50 | $(PKG)_PKGDIR = $(CURDIR)/src/mod-plugin-builder/plugins/package/$(pkgname) 51 | 52 | RENAME_EXTENSION = $(foreach f,$(2)$(3)$(4)$(5)$(6)$(7)$(8)$(9)$(10)$(11)$(12)$(13)$(14)$(15)$(16)$(17)$(18)$(19),mv $(f) $(subst .so,.$(1),$(f));) echo 53 | 54 | BR2_PAWPAW = y 55 | BR2_SKIP_LTO = y 56 | BR2_TARGET_OPTIMIZATION = 57 | 58 | MAKE1 = make -j1 59 | 60 | ifeq ($(MACOS),true) 61 | PARALLEL_JOBS = $(shell sysctl -n hw.logicalcpu) 62 | else 63 | PARALLEL_JOBS = $(shell nproc) 64 | endif 65 | 66 | ifeq ($(WINDOWS),true) 67 | HOST_DIR = $(PAWPAW_PREFIX)-host 68 | else 69 | HOST_DIR = $(PAWPAW_PREFIX) 70 | endif 71 | 72 | TARGET_CFLAGS = $(CFLAGS) 73 | TARGET_CXXFLAGS = $(CXXFLAGS) 74 | TARGET_LDFLAGS = $(LDFLAGS) 75 | 76 | TARGET_DIR = $(PAWPAW_PREFIX) 77 | 78 | TARGET_MAKE_ENV = env 79 | TARGET_MAKE_ENV += CFLAGS="$(TARGET_CFLAGS)" 80 | TARGET_MAKE_ENV += CXXFLAGS="$(TARGET_CXXFLAGS)" 81 | TARGET_MAKE_ENV += LDFLAGS="$(TARGET_LDFLAGS)" 82 | 83 | ifneq ($(MACOS)$(WINDOWS),true) 84 | TARGET_MAKE_ENV += LD_LIBRARY_PATH="$(PAWPAW_PREFIX)/usr/lib" 85 | endif 86 | 87 | ifeq ($(MACOS),true) 88 | STRIP = true 89 | endif 90 | 91 | ifneq ($(TOOLCHAIN_PREFIX),) 92 | BR2_EXTRA_CONFIGURE_OPTS = --host=$(TOOLCHAIN_PREFIX) 93 | BR2_EXTRA_CONFIGURE_OPTS += ac_cv_host=$(TOOLCHAIN_PREFIX) 94 | BR2_EXTRA_CONFIGURE_OPTS += ac_cv_build=$(shell uname -m)-linux-gnu 95 | endif 96 | 97 | define generic-package 98 | 99 | endef 100 | 101 | define autotools-package 102 | 103 | 104 | define $$(PKG)_CONFIGURE_CMDS 105 | (cd $$($$(PKG)_BUILDDIR) && \ 106 | ./configure \ 107 | --disable-debug \ 108 | --disable-doc \ 109 | --disable-docs \ 110 | --disable-maintainer-mode \ 111 | --prefix='/usr' \ 112 | $(BR2_EXTRA_CONFIGURE_OPTS) \ 113 | $$($$(PKG)_CONF_OPTS) \ 114 | ) 115 | endef 116 | 117 | define $$(PKG)_BUILD_CMDS 118 | $(MAKE) -C $$($$(PKG)_BUILDDIR) 119 | endef 120 | 121 | ifndef $$(PKG)_INSTALL_TARGET_CMDS 122 | define $$(PKG)_INSTALL_TARGET_CMDS 123 | $(MAKE) -C $$($$(PKG)_BUILDDIR) install DESTDIR=$(PAWPAW_PREFIX) 124 | endef 125 | endif 126 | 127 | endef 128 | 129 | define cmake-package 130 | 131 | define $(PKG)_CONFIGURE_CMDS 132 | rm -f $$($$(PKG)_BUILDDIR)/CMakeCache.txt && \ 133 | $$(CMAKE) -S $$($$(PKG)_BUILDDIR) -B $$($$(PKG)_BUILDDIR) \ 134 | -DCMAKE_BUILD_TYPE=Release \ 135 | -DCMAKE_INSTALL_LIBDIR=lib \ 136 | -DCMAKE_INSTALL_PREFIX='/usr' \ 137 | --no-warn-unused-cli \ 138 | $$($$(PKG)_CONF_OPTS) 139 | endef 140 | 141 | define $(PKG)_BUILD_CMDS 142 | $(MAKE) -C $$($$(PKG)_BUILDDIR) 143 | endef 144 | 145 | ifndef $(PKG)_INSTALL_TARGET_CMDS 146 | define $(PKG)_INSTALL_TARGET_CMDS 147 | $(MAKE) -C $$($$(PKG)_BUILDDIR) install DESTDIR=$(PAWPAW_PREFIX) 148 | endef 149 | endif 150 | 151 | endef 152 | 153 | include $(CURDIR)/src/mod-plugin-builder/plugins/package/$(pkgname)/$(pkgname).mk 154 | 155 | TARGET_CFLAGS += $($(PKG)_CFLAGS) 156 | TARGET_CXXFLAGS += $($(PKG)_CXXFLAGS) 157 | 158 | $(PKG)_DLVERSION = $(call sanitize,$(strip $($(PKG)_VERSION))) 159 | $(PKG)_BUILDDIR = $(PAWPAW_BUILDDIR)/$(pkgname)-$($(PKG)_DLVERSION) 160 | 161 | ifdef $(PKG)_SOURCE 162 | $(PKG)_DLSITE = $($(PKG)_SITE)/$($(PKG)_SOURCE) 163 | else 164 | $(PKG)_SOURCE = $(pkgname)-$($(PKG)_DLVERSION).tar.gz 165 | $(PKG)_DLSITE = $($(PKG)_SITE).tar.gz 166 | endif 167 | 168 | $(PKG)_DLFILE = $(PAWPAW_DOWNLOADDIR)/$($(PKG)_SOURCE) 169 | 170 | STAMP_EXTRACTED = $($(PKG)_BUILDDIR)/.stamp_extracted 171 | STAMP_PATCHED = $($(PKG)_BUILDDIR)/.stamp_patched 172 | STAMP_CONFIGURED = $($(PKG)_BUILDDIR)/.stamp_configured 173 | STAMP_BUILT = $($(PKG)_BUILDDIR)/.stamp_built 174 | STAMP_INSTALLED = $($(PKG)_BUILDDIR)/.stamp_installed 175 | STAMP_PINSTALLED = $($(PKG)_BUILDDIR)/.stamp_post_installed 176 | 177 | PAWPAW_TMPDIR = /tmp/PawPaw 178 | PAWPAW_TMPNAME = git-dl 179 | 180 | all: $(STAMP_PINSTALLED) 181 | 182 | $(STAMP_PINSTALLED): $(STAMP_INSTALLED) 183 | $(call $($(PKG)_POST_INSTALL_TARGET_HOOKS)) 184 | ifeq ($(MACOS),true) 185 | $(foreach b,$($(PKG)_BUNDLES),sed -i 's|lv2:binary <\([_a-zA-Z0-9-]*\)\.so>|lv2:binary <\1\.dylib>|g' $(PAWPAW_PREFIX)/usr/lib/lv2/$(b)/manifest.ttl;) 186 | $(foreach b,$($(PKG)_BUNDLES),$(call RENAME_EXTENSION,dylib,$(wildcard $(PAWPAW_PREFIX)/usr/lib/lv2/$(b)/*.so));) 187 | else ifeq ($(WINDOWS),true) 188 | $(foreach b,$($(PKG)_BUNDLES),sed -i 's|lv2:binary <\([_a-zA-Z0-9-]*\)\.so>|lv2:binary <\1\.dll>|g' $(PAWPAW_PREFIX)/usr/lib/lv2/$(b)/manifest.ttl;) 189 | $(foreach b,$($(PKG)_BUNDLES),rm -f $(PAWPAW_PREFIX)/usr/lib/lv2/$(b)/*.dll.a;) 190 | $(foreach b,$($(PKG)_BUNDLES),$(call RENAME_EXTENSION,dll,$(wildcard $(PAWPAW_PREFIX)/usr/lib/lv2/$(b)/*.so));) 191 | endif 192 | touch $@ 193 | 194 | $(STAMP_INSTALLED): $(STAMP_BUILT) 195 | $($(PKG)_INSTALL_TARGET_CMDS) 196 | touch $@ 197 | 198 | $(STAMP_BUILT): $(STAMP_CONFIGURED) 199 | ifeq ($(MACOS),true) 200 | $(foreach p,$(wildcard $($(PKG)_BUILDDIR)/Makefile $($(PKG)_BUILDDIR)/*/makefile),\ 201 | sed -i -e 's/-Wl,--gc-sections//g' $(p);) 202 | $(foreach p,$(wildcard $($(PKG)_BUILDDIR)/Makefile),\ 203 | sed -i -e 's/-Wl,--as-needed//g' $(p);) 204 | $(foreach p,$(wildcard $($(PKG)_BUILDDIR)/*/makefile),\ 205 | sed -i -e 's/-Wl,--no-undefined//g' $(p);) 206 | $(foreach p,$(wildcard $($(PKG)_BUILDDIR)/*/makefile),\ 207 | sed -i -e 's/-Wl,--exclude-libs,ALL//g' $(p);) 208 | $(foreach p,$(wildcard $($(PKG)_BUILDDIR)/*/makefile),\ 209 | sed -i -e 's/-Wl,-z,relro,-z,now//g' $(p);) 210 | $(foreach p,$(wildcard $($(PKG)_BUILDDIR)/*/makefile),\ 211 | sed -i -e 's/-Wl,-z,noexecstack//g' $(p);) 212 | endif 213 | $($(PKG)_BUILD_CMDS) 214 | touch $@ 215 | 216 | $(STAMP_CONFIGURED): $(STAMP_PATCHED) 217 | ifeq ($($(PKG)_AUTORECONF),YES) 218 | (cd $($(PKG)_BUILDDIR) && \ 219 | aclocal --force && \ 220 | libtoolize --force --automake --copy && \ 221 | autoheader --force && \ 222 | autoconf --force && \ 223 | automake -a --copy \ 224 | ) 225 | endif 226 | $($(PKG)_CONFIGURE_CMDS) 227 | touch $@ 228 | 229 | $(STAMP_PATCHED): $(STAMP_EXTRACTED) 230 | $(foreach p,$(sort $(wildcard $($(PKG)_PKGDIR)/*.patch)),patch -p1 -d '$($(PKG)_BUILDDIR)' -i $(p);) 231 | touch $@ 232 | 233 | $(STAMP_EXTRACTED): $($(PKG)_DLFILE) 234 | mkdir -p '$($(PKG)_BUILDDIR)' 235 | tar -xf '$($(PKG)_DLFILE)' -C '$($(PKG)_BUILDDIR)' --strip-components=1 236 | touch $@ 237 | 238 | $($(PKG)_DLFILE): 239 | ifeq ($($(PKG)_SITE_METHOD),git) 240 | rm -rf '$(PAWPAW_TMPDIR)' 241 | git clone '$($(PKG)_SITE)' '$(PAWPAW_TMPDIR)/$(PAWPAW_TMPNAME)' && \ 242 | git -C '$(PAWPAW_TMPDIR)/$(PAWPAW_TMPNAME)' checkout '$($(PKG)_VERSION)' && \ 243 | touch '$(PAWPAW_TMPDIR)/$(PAWPAW_TMPNAME)/.gitmodules' && \ 244 | sed -i 's|git://github.com/|https://github.com/|g' '$(PAWPAW_TMPDIR)/$(PAWPAW_TMPNAME)/.gitmodules' && \ 245 | git -C '$(PAWPAW_TMPDIR)/$(PAWPAW_TMPNAME)' submodule update --recursive --init && \ 246 | tar --exclude='.git' -czf '$($(PKG)_DLFILE)' -C '$(PAWPAW_TMPDIR)' '$(PAWPAW_TMPNAME)' 247 | rm -rf '$(PAWPAW_TMPDIR)' 248 | else 249 | curl -Lo '$($(PKG)_DLFILE)' '$($(PKG)_DLSITE)' 250 | endif 251 | -------------------------------------------------------------------------------- /utils/plugin-builder/plugin-builder.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # set -e 4 | 5 | cd $(dirname "${0}")/../.. 6 | 7 | # --------------------------------------------------------------------------------------------------------------------- 8 | # check target 9 | 10 | target="${1}" 11 | plugin="${2}" 12 | 13 | if [ -z "${target}" ] || [ -z "${plugin}" ]; then 14 | echo "usage: ${0} " 15 | exit 1 16 | fi 17 | 18 | if [ ! -e src/mod-plugin-builder ]; then 19 | echo "missing src/mod-plugin-builder" 20 | exit 1 21 | fi 22 | 23 | # --------------------------------------------------------------------------------------------------------------------- 24 | # import env 25 | 26 | export PAWPAW_FAST_MATH=1 27 | export PAWPAW_MODAUDIO=1 28 | export PAWPAW_QUIET=1 29 | export PAWPAW_SKIP_LTO=1 30 | source src/PawPaw/local.env "${target}" 31 | 32 | # --------------------------------------------------------------------------------------------------------------------- 33 | 34 | export CFLAGS+="-D__MOD_DEVICES__ -D_MOD_DESKTOP" 35 | export CXXFLAGS+="-D__MOD_DEVICES__ -D_MOD_DESKTOP -DJUCE_AUDIOPROCESSOR_NO_GUI=1" 36 | 37 | export CMAKE 38 | export PAWPAW_BUILDDIR 39 | export PAWPAW_DOWNLOADDIR 40 | export PAWPAW_PREFIX 41 | export TARGET_CC 42 | export TOOLCHAIN_PREFIX 43 | 44 | if [ "${MACOS}" -eq 1 ]; then 45 | export PATH="${PAWPAW_PREFIX}-host/bin:${PATH}" 46 | fi 47 | 48 | make -f utils/plugin-builder/plugin-builder.mk pkgname="${plugin}" ${MAKE_ARGS} PREFIX=/usr NOOPT=true WITH_LTO=false VERBOSE=1 49 | 50 | # --------------------------------------------------------------------------------------------------------------------- 51 | -------------------------------------------------------------------------------- /utils/plugin-builder/validate-plugins.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd "$(dirname $0)/../../build" 4 | 5 | export LANG=en_US.UTF-8 6 | export PAWPAW_SKIP_LTO=1 7 | export PAWPAW_QUIET=1 8 | 9 | function convert_path() { 10 | if [ -e jackd.exe ]; then 11 | echo "Z:\\$(echo ${@} | tr '/' '\\')" 12 | else 13 | echo ${@} 14 | fi 15 | } 16 | 17 | if [ -e mod-ui.exe ]; then 18 | source ../src/PawPaw/local.env win64 19 | DOCS_DIR=$(xdg-user-dir DOCUMENTS) 20 | LV2_PATH="$(convert_path $(pwd)/plugins)" 21 | OS_SEP="\\" 22 | elif [ -e mod-desktop.app ]; then 23 | if [ "$(uname -m)" = "x86_64" ] && [ x"${1}" != x"macos-universal-10.15" ]; then 24 | source ../src/PawPaw/local.env macos-10.15 25 | else 26 | source ../src/PawPaw/local.env macos-universal-10.15 27 | fi 28 | DOCS_DIR=~/Documents 29 | LV2_PATH="$(pwd)/mod-desktop.app/Contents/PlugIns/LV2" 30 | OS_SEP='/' 31 | else 32 | source ../src/PawPaw/local.env linux 33 | DOCS_DIR=$(xdg-user-dir DOCUMENTS) 34 | LV2_PATH="$(pwd)/plugins" 35 | OS_SEP='/' 36 | fi 37 | 38 | export LV2_PATH 39 | 40 | export CARLA_BRIDGE_DUMMY=1 41 | export CARLA_BRIDGE_TESTING=1 42 | export MOD_KEYS_PATH="$(convert_path "${DOCS_DIR}/MOD Desktop/keys/")" 43 | export MOD_USER_FILES_DIR="$(convert_path "${DOCS_DIR}/MOD Desktop/user-files")" 44 | export WINEDEBUG=-all 45 | 46 | if [ -z "${PAWPAW_DEBUG}" ] || [ "${PAWPAW_DEBUG}" -eq 0 ]; then 47 | set -e 48 | fi 49 | 50 | mkdir -p "${DOCS_DIR}/MOD Desktop/keys" 51 | mkdir -p "${DOCS_DIR}/MOD Desktop/user-files/Audio Recordings" 52 | 53 | if [ -z "${EXE_WRAPPER}" ] && [ -n "${VALGRIND}" ] && [ "${VALGRIND}" -eq 1 ]; then 54 | EXE_WRAPPER="valgrind --leak-check=full --track-origins=yes --keep-debuginfo=yes --suppressions=../src/mod-plugin-builder/plugins-dep/valgrind-libdl.supp" 55 | fi 56 | 57 | PLUGINS=($(${EXE_WRAPPER} "${PAWPAW_PREFIX}/lib/carla/carla-discovery-native${APP_EXT}" lv2 ":all" 2>/dev/null | tr -dC '[:print:]\n' | awk 'sub("carla-discovery::label::","")')) 58 | 59 | for p in ${PLUGINS[@]}; do 60 | uri=$(echo ${p} | cut -d "${OS_SEP}" -f 2-) 61 | echo "Testing ${uri}..." 62 | ${EXE_WRAPPER} "${PAWPAW_PREFIX}/lib/carla/carla-bridge-native${APP_EXT}" lv2 "" "${uri}" 1>/dev/null 63 | done 64 | -------------------------------------------------------------------------------- /utils/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | cd $(dirname "${0}")/.. 6 | 7 | # --------------------------------------------------------------------------------------------------------------------- 8 | # check target 9 | 10 | target="${1}" 11 | 12 | if [ -z "${target}" ]; then 13 | echo "usage: ${0} " 14 | exit 1 15 | fi 16 | 17 | # --------------------------------------------------------------------------------------------------------------------- 18 | # read next CLI arg 19 | 20 | shift 21 | 22 | # --------------------------------------------------------------------------------------------------------------------- 23 | # import env 24 | 25 | export PAWPAW_SKIP_LTO=1 26 | export PAWPAW_QUIET=1 27 | source src/PawPaw/local.env ${target} 28 | 29 | # --------------------------------------------------------------------------------------------------------------------- 30 | # expand alias if needed 31 | 32 | PRE="" 33 | 34 | if [ x"${1}" = x"cmake" ] && [ x"${2}" = x"-S" ]; then 35 | PRE="${CMAKE} -S" 36 | shift 37 | shift 38 | elif [ x"${1}" = x"python3" ]; then 39 | PRE="${EXE_WRAPPER} ${PAWPAW_PREFIX}/bin/python3${APP_EXT}" 40 | shift 41 | fi 42 | 43 | if [ "${CROSS_COMPILING}" -eq 0 ] && [ "${LINUX}" -eq 1 ]; then 44 | export LD_LIBRARY_PATH="${PAWPAW_PREFIX}/lib" 45 | fi 46 | 47 | # export PYTHON_PATH="" 48 | 49 | # --------------------------------------------------------------------------------------------------------------------- 50 | # run command 51 | 52 | ${PRE} $@ 53 | 54 | # --------------------------------------------------------------------------------------------------------------------- 55 | -------------------------------------------------------------------------------- /utils/win64/mod-hardware-descriptor.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "MOD Desktop", 3 | "platform": "desktop", 4 | "architecture": "x64_64", 5 | "bin-compat": "win64", 6 | "factory_pedalboards": true 7 | } 8 | -------------------------------------------------------------------------------- /utils/win64/win64-installer.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | if [ ! -d build ]; then 6 | echo "Please run this script from the root folder" 7 | exit 8 | fi 9 | 10 | # setup innosetup 11 | dlfile="${PWD}/utils/innosetup-6.0.5.exe" 12 | innodir="${PWD}/build/innosetup-6.0.5" 13 | iscc="${innodir}/drive_c/InnoSetup/ISCC.exe" 14 | 15 | # download it 16 | if [ ! -f "${dlfile}" ]; then 17 | # FIXME proper dl version 18 | curl -L https://jrsoftware.org/download.php/is.exe -o "${dlfile}" 19 | fi 20 | 21 | # initialize wine 22 | if [ ! -d "${innodir}"/drive_c ]; then 23 | env WINEPREFIX="${innodir}" wineboot -u 24 | fi 25 | 26 | # install innosetup in custom wineprefix 27 | if [ ! -f "${innodir}"/drive_c/InnoSetup/ISCC.exe ]; then 28 | env WINEPREFIX="${innodir}" wine "${dlfile}" /allusers /dir=C:\\InnoSetup /nocancel /norestart /verysilent 29 | fi 30 | 31 | # generate pedalboards and plugins 32 | echo -n "" > utils/win64/win64-plugins.iss 33 | IFS=' 34 | ' 35 | for f in $(find -L build/plugins/ -type f); do 36 | d=$(dirname $(echo ${f} | sed "s|build/plugins/||")) 37 | echo "Source: \"..\\..\\$(echo ${f} | tr '/' '\\')\"; DestDir: \"{app}\\plugins\\$(echo ${d} | tr '/' '\\')\"; Components: plugins; Flags: ignoreversion;" >> utils/win64/win64-plugins.iss 38 | done 39 | for f in $(find -L pedalboards/ -type f); do 40 | d=$(dirname $(echo ${f} | sed "s|pedalboards/||")) 41 | echo "Source: \"..\\..\\$(echo ${f} | tr '/' '\\')\"; DestDir: \"{app}\\pedalboards\\$(echo ${d} | tr '/' '\\')\"; Components: pedalboards; Flags: ignoreversion;" >> utils/win64/win64-pedalboards.iss 42 | done 43 | 44 | # generate version 45 | echo "#define VERSION \"$(cat VERSION)\"" > utils/win64/win64-version.iss 46 | 47 | # create the installer file 48 | pushd "utils/win64" 49 | env WINEPREFIX="${innodir}" wine "${iscc}" "win64-installer.iss" 50 | popd 51 | -------------------------------------------------------------------------------- /utils/win64/win64-zip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | if [ ! -d build ]; then 6 | echo "Please run this script from the root folder" 7 | exit 8 | fi 9 | 10 | rm -rf build/innosetup-* 11 | rm -rf mod-ui/mod/__pycache__ 12 | rm -rf mod-ui/mod/communication/__pycache__ 13 | rm -rf mod-ui/modtools/__pycache__ 14 | ./utils/pack-html.sh 15 | 16 | VERSION="$(cat VERSION)" 17 | mv build mod-desktop-${VERSION}-win64 18 | zip -r -9 mod-desktop-${VERSION}-win64.zip mod-desktop-${VERSION}-win64 19 | --------------------------------------------------------------------------------