juicysfplugin/README.md

248 lines
10 KiB
Markdown
Raw Normal View History

2018-05-25 03:44:41 +08:00
<img width="436" alt="image" src="https://user-images.githubusercontent.com/6141784/40509932-f424abb4-5f92-11e8-85ae-61050955dc97.png">
2018-03-07 06:43:21 +08:00
Latest stable release:
- macOS [1.0.6](https://github.com/Birch-san/juicysfplugin/releases/tag/1.0.6)
- Windows x64 [1.0.8](https://github.com/Birch-san/juicysfplugin/releases/tag/1.0.8)
- Linux is [supported as of 1.0.8](https://github.com/Birch-san/juicysfplugin/pull/3), but you will need to build from source
2018-03-07 06:51:41 +08:00
2018-05-25 03:44:41 +08:00
Demo track: [mp3](https://github.com/Birch-san/juicysfplugin/releases/download/1.0.5/Demo_track.mp3), [FLAC](https://github.com/Birch-san/juicysfplugin/releases/download/1.0.5/Demo_track.flac), [FLAC +Soundgoodizer](https://github.com/Birch-san/juicysfplugin/releases/download/1.0.5/Demo_track_soundgoodizer.flac)
2018-05-12 01:42:29 +08:00
2018-03-07 06:50:41 +08:00
# What
juicysfplugin is a cross-platform audio plugin for playing MIDI music through a soundfont synthesizer.
2018-03-07 06:50:41 +08:00
2018-05-12 01:42:29 +08:00
It's well-suited for making videogame music. If you have a soundfont of your favourite game, you can write your own melodies with its instruments.
2018-05-12 01:22:31 +08:00
2018-03-07 06:50:41 +08:00
[JUCE](https://github.com/WeAreROLI/JUCE) is the framework for making audio plugins.
[fluidsynth](http://www.fluidsynth.org/) is the soundfont synthesizer.
2018-05-13 00:26:42 +08:00
Supports SF2 and SF3 soundfont formats.
2018-05-12 01:42:29 +08:00
**Mode 1: standalone application**
juicysfplugin.app (or .exe on Windows) is a standalone application, for playing around.
2018-05-12 01:42:29 +08:00
You can plugin your hardware MIDI keyboard, or play with the software MIDI keyboard. Or route MIDI messages into it from a virtual MIDI controller (e.g. the [macOS IAC Bus](http://re-compose.desk.com/customer/portal/articles/1382244-setting-up-the-iac-bus-on-a-mac)).
**Mode 2: audio plugin**
2018-03-07 06:50:41 +08:00
2018-05-12 01:42:29 +08:00
juicysfplugin audio plugins are provided: VST, VST3, AU, AUv3.
This means you can host it inside your DAW (e.g. GarageBand, FL Studio Mac, Sibelius…) to record the sounds you make.
2018-03-07 06:50:41 +08:00
# Why
I couldn't find a _free_, _easy-to-use_ macOS audio plugin for making music with soundfonts.
2018-03-06 08:12:06 +08:00
2018-05-12 01:22:31 +08:00
# Install
Latest release: https://github.com/Birch-san/juicysfplugin/releases
**Download Release.tar.xz, open it to unzip.**
Release contains:
```
juicysfplugin.app # standalone application, for playing around
juicysfplugin.component # AU plugin
juicysfplugin.vst # VST plugin
juicysfplugin.vst3 # VST3 plugin
```
To install plugins, move them to the following folder:
```
juicysfplugin.component -> ~/Library/Audio/Plug-Ins/Components/juicysfplugin.component
juicysfplugin.vst -> ~/Library/Audio/Plug-Ins/VST/juicysfplugin.vst
juicysfplugin.vst3 -> ~/Library/Audio/Plug-Ins/VST3/juicysfplugin.vst3
```
2018-05-12 20:33:38 +08:00
## Launch
2018-05-12 01:29:09 +08:00
Now, you may do one of the following:
2018-05-12 01:42:29 +08:00
- Open the standalone juicysfplugin.app
2018-05-12 01:29:09 +08:00
- Load the AU/VST/VST3 into your favourite DAW (e.g. GarageBand, FL Studio)
2018-05-12 20:33:38 +08:00
# Usage
2018-05-12 01:26:03 +08:00
2018-05-12 20:33:38 +08:00
You must drag-and-drop a soundfont into the file picker.
2018-05-12 01:26:03 +08:00
![image](https://user-images.githubusercontent.com/6141784/37062424-500bc91e-218e-11e8-9916-eae6d82ca566.png)
2018-05-12 01:22:31 +08:00
Here's some soundfonts to get you started:
- [Fatboy](https://fatboy.site/) (no specific license stated, but described as "free")
2018-05-12 20:33:38 +08:00
- MuseScore's [recommended soundfonts](https://musescore.org/en/handbook/soundfonts-and-sfz-files#list) (includes MIT, GPL, other licenses)
2018-05-12 01:22:31 +08:00
- FlameStudios' GPL-licensed [guitar soundfonts](http://www.flamestudios.org/free/Soundfonts)
2018-05-13 00:26:42 +08:00
I'll refrain from recommending certain General MIDI or videogame soundfonts, since the licensing and provenance are often unclear.
2018-05-12 01:26:03 +08:00
2018-05-12 20:33:38 +08:00
## Keybindings
Gain keyboard focus by clicking the plugin's keyboard.
- Up-down arrow keys to switch preset.
- Left-right to switch bank.
ASCII -> MIDI keybinding is the same as FL Studio's:
<img width="256px" alt="image" src="http://s3.amazonaws.com/fl_resource/flkeychart.png">
## Using the standalone .app
Generally the .app will Just Work™, but if your audio setup is more bespoke, then you'll need to configure.
Ignore the yellow warning about feedback. There is no feedback loop (because no audio is input).
2018-05-12 01:26:03 +08:00
**Options > Audio/MIDI settings**
<img width="256px" alt="image" src="https://user-images.githubusercontent.com/6141784/37062230-bdb128b6-218d-11e8-985a-e9b2b5fd0bb2.png">
**Set Output to Built-In Output**
Or any output device that you can hear audio through.
2018-05-12 20:33:38 +08:00
Input audio device doesn't matter. We only use MIDI as input.
2018-05-12 01:26:03 +08:00
<img width="515" alt="image" src="https://user-images.githubusercontent.com/6141784/37062266-d723c984-218d-11e8-9ded-9dc5eb701199.png">
2018-05-12 01:22:31 +08:00
# Building from source (macOS)
2018-03-07 06:43:21 +08:00
Install XCode and XCode command line tools. Accept terms.
2018-03-07 06:43:21 +08:00
Install [JUCE](https://shop.juce.com/get-juce) 5.3 in `/Applications`.
We expect to find JUCE headers in `/Applications/JUCE/modules`.
(Optional) To target VST3, install Steinberg [VST3 Audio Plug-Ins SDK](https://www.steinberg.net/en/company/developers.html).
We expect to find a folder `~/SDKs/VST_SDK/VST3_SDK`.
(Optional) Install IntelliJ AppCode if you prefer it to XCode.
Open `juicysfplugin/Builds/MacOSX/juicysfplugin.xcodeproj` in XCode (or IntelliJ AppCode).
Build & run the "juicysfplugin - Standalone Plugin" target.
All the libs we link against are project-local (see `juicysfplugin/Builds/MacOSX/lib_relinked`).
I have used `install_name_tool` to give these libs relative install names. This ensures that any product you build will be portable.
See my [blog post](https://birchlabs.co.uk/blog/alex/juicysfplugin/synth/cpp/2019/01/05/a-soundfont-vst-for-macos.html) for a deeper explanation as to how juicysfplugin is linked for portable distribution on macOS.
## Testing VST/AU plugins inside an audio plugin host
You'll notice that the schemes for [VST, VST3, AU, AUv3] targets are configured such that "Run" launches the executable `AudioPluginHost.app`. This lets you run the audio plugin as though it were hosted inside a DAW.
I recommend building (e.g. with XCode) the simple Audio Plugin Host that comes with JUCE Framework:
`/Applications/JUCE/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj`
2018-05-12 01:46:29 +08:00
Then symlink `/Applications/JUCE/AudioPluginHost.app` to the built `AudioPluginHost.app` (because that's where I told the Run configuration to look for AudioPluginHost.app):
2018-03-06 08:12:06 +08:00
```bash
ln -sf /Applications/JUCE/extras/AudioPluginHost/Builds/MacOSX/build/Debug/AudioPluginHost.app /Applications/JUCE/AudioPluginHost.app
```
2019-06-23 02:06:50 +08:00
## Visual Studio Code settings
Concerning the use of Visual Studio Code extension, [C/C++ for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools), as an IDE (i.e. instead of XCode)…
Following advice is for macOS, using brew-installed LLVM 8 Clang.
All includePath entries are shallow (no recursive globbing) for now, since I don't have any deeply-nested headers.
We don't need to dip into /usr/local, since all library/framework headers are already in this repository.
Ensure that there exists at the root of the repository, a folder named `.vscode`.
`.vscode/c_cpp_properties.json`
```json
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/include",
"${workspaceFolder}/Source",
"${workspaceFolder}/JuceLibraryCode",
"${workspaceFolder}/modules"
],
"defines": [],
"cStandard": "c11",
"cppStandard": "c++14",
"intelliSenseMode": "clang-x64",
"compilerPath": "/usr/local/Cellar/llvm/8.0.0_1/bin/clang++"
}
],
"version": 4
}
```
I've kept this minimal, but documented some other include paths worthy of consideration (e.g. if more parts of the toolchain were to be used, brew were to be used, or the standard XCode clang were to be used).
`~/Library/Application Support/Code/User/settings.json`
```json
{
"C_Cpp.updateChannel": "Insiders",
"C_Cpp.default.intelliSenseMode": "clang-x64",
"C_Cpp.default.macFrameworkPath": [
// "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks",
"/System/Library/Frameworks",
// "/Library/Frameworks"
],
"C_Cpp.default.includePath": [
// "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1",
// "/usr/local/include",
// "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/10.0.1/include",
// "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include",
// "${workspaceFolder}/include"
// "/usr/include",
"/usr/local/Cellar/llvm/8.0.0_1/Toolchains/LLVM8.0.0.xctoolchain/usr/include/c++/v1",
// "/usr/local/Cellar/llvm/8.0.0_1/Toolchains/LLVM8.0.0.xctoolchain/usr/lib/clang/8.0.0/include",
// "/usr/local/Cellar/llvm/8.0.0_1/Toolchains/LLVM8.0.0.xctoolchain/usr/include",
],
"C_Cpp.default.cStandard": "c11",
"C_Cpp.default.cppStandard": "c++14",
"C_Cpp.default.compilerPath": "/usr/local/Cellar/llvm/8.0.0_1/bin/clang++",
"C_Cpp.clang_format_fallbackStyle": "LLVM",
"C_Cpp.clang_format_style": "LLVM",
"C_Cpp.default.browse.limitSymbolsToIncludedHeaders": true,
"C_Cpp.default.enableConfigurationSquiggles": true,
"C_Cpp.errorSquiggles": "Enabled",
"C_Cpp.enhancedColorization": "Enabled"
}
```
# Dependency versions
Known working with:
- macOS High Sierra 10.13
- XCode 9.3.1
- JUCE Framework 5.3
- VST3 Audio Plug-Ins SDK 3.6.9
- fluidsynth 1.1.11
There is a [fluidsynth 2](https://github.com/Birch-san/juicysfplugin/tree/fluidsynth2) branch. It works, but there's no strong reason to justify switching to it we have no burning need for any FS2 features (well, except perhaps the [modluators API](https://github.com/Birch-san/juicysfplugin/issues/2#issuecomment-397872150)), and it'd generate some extra work to get the Windows release to parity.
# Making releases
Follow the steps in [Building from source](#building-from-source) to output a product to the build folder.
Builds are automatically portable.
```bash
cd juicysfplugin/Builds/MacOSX
# first check that you have a Release or Debug product in the `build` directory
# follows symlinks, archives Release and Debug folders as tar.xz
./archive-for-distribution.sh
```
Note: Release **and** Debug flavors _both_ output targets [VST, VST3, AU] to the same location: `~/Library/Audio/Plug-Ins/$TARGET/juicysfplugin.$EXT`.
Whichever flavor you built _most recently_, wins.
# Licenses
2018-03-07 06:50:41 +08:00
Overall, juicysfplugin is GPLv3.
See [licenses for all libraries and frameworks](https://github.com/Birch-san/juicysfplugin/tree/master/licenses_of_dependencies).