Skip to content

Commit 01c4f27

Browse files
authored
version 1.2.0 (#14)
* removed sampler, sidechain * grid woes * grid * lines btwn sections * main panel * panels gradient * viz work: unfinished * hooking up orbit: 90% * orbit viz * orbit speed, knob colors * todo * 2nd osc * working on replacement osc * fixed live values * m * oscs * wt osc * opt * underwegs * monorail! * path forward * cleanup and square WT * filesystem * 1st draft rendernextblock * slimming down * stripping down * beginning os * toward oversampling: still broken * os 1st draft * clamp fixed freq, no neg * layout page 1 * page 3 * regularize mod boxes * lfos * mseg panels * mod page * various * 4x * 1st draft 4x os: mac only * ready for windows * phase is back * phase bump * files for windows * mod ui * ignore * cleanup * windows downsample / ui cleanup * timing * mod src buttons * bipolar button * todone * orbitviz cleanup * ui * popups and boxes * fonts and colors * formatting * matrix box colors * nicer chorus * volume * volume slider draft 2 * some dest selectors * mod dest selectors * adjust dest selectors * mod timings * lfo phases * lfo viz mono/poly * osc indicators in envbox * clear buffers on switch * size * ladder dest and lfo trix * update gin * lfo error on fade * volume slider * tidying up * setters * misc * volume slider * patched discontinuity in tables * dead code * tuning * pixels * default rate * os ws * oversample waveshaper * ws * simplified ws * ws pics * halfway there * adaa 1st draft * halfwave adaa * more procs * ADAA2 + 2x OS for WS * lfo rand * limiter: ws blowing up * pruning * init * profiling * ... * .. * removed subm * cleanup * aux cleanup * mseg menus * return of demod * demod dest * various futzing * level meter * phase swap and mix * voice work * level box * readme for 1.2 * Update README2.md * Update README2.md * Update README2.md * restore label * Update README2.md * Update README2.md * Update README2.md * Update README2.md * Update README2.md * Update README2.md * presets and pics * level meter on tabs 2 and 3 * two more presets * presets * prep for envelope live values * env viz * fix release * tweak * pixels and boundaries * more pixels * pops * the end of pop(s) * pesky mono * env, smoothing * various * brackets * Update README2.md * Update README2.md * .. * ws tuning * do not use * backing out * bye weird * slew limit * third time? * tuning slew limiter * Update README2.md * reorder modsrcs * adjust soft clip, overloud * lto
1 parent 48fcda4 commit 01c4f27

File tree

170 files changed

+19538
-12568
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

170 files changed

+19538
-12568
lines changed

.clang-format-old

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
BasedOnStyle: Chromium
3+
AlignAfterOpenBracket: DontAlign
4+
AllowAllArgumentsOnNextLine: 'false'
5+
AllowAllConstructorInitializersOnNextLine: 'true'
6+
AllowShortBlocksOnASingleLine: 'true'
7+
AllowShortFunctionsOnASingleLine: All
8+
AllowShortLambdasOnASingleLine: All
9+
AlwaysBreakAfterReturnType: None
10+
AlwaysBreakTemplateDeclarations: 'Yes'
11+
BreakBeforeBinaryOperators: None
12+
ColumnLimit: '0'
13+
ConstructorInitializerAllOnOneLineOrOnePerLine: 'false'
14+
ContinuationIndentWidth: '4'
15+
Cpp11BracedListStyle: 'true'
16+
FixNamespaceComments: 'true'
17+
IndentWidth: '4'
18+
IndentAccessModifiers: 'false'
19+
AccessModifierOffset: '-4'
20+
IndentCaseLabels: 'false'
21+
KeepEmptyLinesAtTheStartOfBlocks: 'false'
22+
Language: Cpp
23+
MaxEmptyLinesToKeep: '1'
24+
PointerAlignment: Right
25+
SpaceAfterCStyleCast: 'false'
26+
SpaceAfterLogicalNot: 'false'
27+
SpaceAfterTemplateKeyword: 'false'
28+
SpaceBeforeAssignmentOperators: 'true'
29+
SpaceBeforeCpp11BracedList: 'false'
30+
SpaceBeforeCtorInitializerColon: 'true'
31+
SpaceBeforeInheritanceColon: 'true'
32+
SpaceBeforeParens: ControlStatements
33+
SpaceBeforeRangeBasedForLoopColon: 'true'
34+
SpaceInEmptyParentheses: 'false'
35+
SpacesInAngles: 'false'
36+
SpacesInCStyleCastParentheses: 'false'
37+
SpacesInContainerLiterals: 'false'
38+
SpacesInParentheses: 'false'
39+
SpacesInSquareBrackets: 'false'
40+
TabWidth: '4'
41+
UseTab: ForIndentation

.gitignore

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ libs/
44
out/
55
build/
66
ninja-build/
7-
TODO
7+
xcode-build/
8+
xcb/
9+
.idea/
810
# Prerequisites
911
*.d
1012

@@ -449,5 +451,4 @@ FodyWeavers.xsd
449451

450452
# JetBrains Rider
451453
*.sln.iml
452-
modules/melatonin_perfetto/
453454
/source/.VSCodeCounter/2024-01-15_13-05-45

CMakeLists.txt

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ if (APPLE)
44
set (CMAKE_OSX_DEPLOYMENT_TARGET "12.0" CACHE STRING "Minimum OS X deployment version" FORCE)
55
set (CMAKE_OSX_ARCHITECTURES "x86_64;arm64")
66
set (CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE)
7+
add_definitions( -DUSE_NEON )
78
endif()
89

910

@@ -21,7 +22,8 @@ foreach(module_name IN ITEMS gin gin_dsp gin_graphics gin_gui gin_plugin gin_sim
2122
set_property (TARGET "${module_name}" APPEND PROPERTY LABELS Gin)
2223
endforeach()
2324

24-
set(VersionString 1.1.5)
25+
set(VersionString 1.2.0)
26+
add_definitions( -DVERSION_STRING="${VersionString}" )
2527
# also set this in PluginEditor.cpp -> showAboutInfo()
2628

2729
juce_add_plugin (${PROJECT_NAME}
@@ -30,7 +32,7 @@ juce_add_plugin (${PROJECT_NAME}
3032
COMPANY_NAME "Void-Star"
3133
COMPANY_WEBSITE "https://void-star.com/"
3234
ICON_BIG "${CMAKE_CURRENT_SOURCE_DIR}/assets/icon.png"
33-
FORMATS "VST3" #"AU" "Standalone" "LV2"
35+
FORMATS "VST3" "LV2" # "Standalone" # "AU" # "LV2"
3436
BUNDLE_ID com.void-star.audible-planets
3537
DESCRIPTION "An expressive, quasi-Ptolemaic semi-modular synthesizer."
3638
PLUGIN_MANUFACTURER_CODE "Vdst"
@@ -50,31 +52,40 @@ if (APPLE)
5052
-Wall -Wstrict-aliasing -Wunused-parameter -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wbool-conversion -Wextra-semi
5153
-Wunreachable-code -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wuninitialized -Wno-missing-field-initializers
5254
-Wno-ignored-qualifiers -Wno-missing-braces -Wno-char-subscripts -Wno-unused-private-field -fno-aligned-allocation -Wunused-private-field -Wunreachable-code
53-
-Wenum-compare -Wshadow -Wfloat-conversion -Wshadow-uncaptured-local -Wshadow-field -Wsign-compare -Wdeprecated-this-capture -Wimplicit-float-conversion
55+
-Wenum-compare -Wshadow -Wno-float-conversion -Wshadow-uncaptured-local -Wshadow-field -Wsign-compare -Wdeprecated-this-capture -Wno-implicit-float-conversion
5456
-ffast-math -fno-finite-math-only -Wfloat-equal
5557
# "$<$<CONFIG:RELEASE>:-Werror>"
5658
)
59+
add_compile_definitions(NDEBUG)
60+
#add_compile_options(-mfloat-abi=hard)
5761
endif ()
5862

5963
if (MSVC)
6064
target_compile_options(${PROJECT_NAME} PRIVATE
61-
/wd26495 /wd4459 /wd4244 /wd4996 /wd4267 /wd4244
65+
# /wd26495 /wd4459 /wd4244 /wd4996 /wd4267 /wd4244
6266
)
63-
add_compile_definitions(MIPP_ALIGNED_LOADS)
67+
add_compile_definitions(MIPP_ALIGNED_LOADS USE_SSE)
6468
endif ()
6569

6670
# Binary Data
67-
6871
set_property (DIRECTORY APPEND PROPERTY LABELS Assets)
6972

7073
file (GLOB_RECURSE source_files CONFIGURE_DEPENDS
71-
${CMAKE_CURRENT_SOURCE_DIR}/Source/*.hpp
72-
${CMAKE_CURRENT_SOURCE_DIR}/Source/*.cpp
73-
${CMAKE_CURRENT_SOURCE_DIR}/Source/*.c
74-
${CMAKE_CURRENT_SOURCE_DIR}/Source/*.h)
74+
${CMAKE_CURRENT_SOURCE_DIR}/Source/third_party/MTS-ESP/*.cpp
75+
${CMAKE_CURRENT_SOURCE_DIR}/Source/third_party/hiir/*.cpp
76+
${CMAKE_CURRENT_SOURCE_DIR}/Source/third_party/ADAAsrc/polylogarithm/Li2.cpp
77+
${CMAKE_CURRENT_SOURCE_DIR}/Source/DSP/*.cpp
78+
${CMAKE_CURRENT_SOURCE_DIR}/Source/UI/*.cpp
79+
)
7580

7681
target_sources (${PROJECT_NAME} PRIVATE ${source_files})
7782
source_group (TREE ${CMAKE_CURRENT_SOURCE_DIR}/Source PREFIX Source FILES ${source_files})
83+
target_include_directories(${PROJECT_NAME} PUBLIC
84+
"${CMAKE_CURRENT_SOURCE_DIR}/Source"
85+
"${CMAKE_CURRENT_SOURCE_DIR}/Source/DSP"
86+
"${CMAKE_CURRENT_SOURCE_DIR}/Source/UI"
87+
"${CMAKE_CURRENT_SOURCE_DIR}/Source/third_party"
88+
)
7889

7990
file(GLOB_RECURSE AssetFiles CONFIGURE_DEPENDS
8091
"${CMAKE_CURRENT_SOURCE_DIR}/assets/*.png"
@@ -100,27 +111,25 @@ target_link_libraries (${PROJECT_NAME}
100111
gin_dsp
101112
gin_plugin
102113
gin_simd
114+
juce::juce_core
115+
juce::juce_dsp
103116
juce::juce_events
104117
juce::juce_graphics
105118
juce::juce_gui_basics
106119
juce::juce_gui_extra
107-
juce::juce_core
108120
juce::juce_audio_basics
109-
110121
$<$<PLATFORM_ID:Linux>:curl>
111122
PUBLIC
112123
Assets
113124
juce::juce_recommended_config_flags
114125
juce::juce_recommended_lto_flags
115-
#juce::juce_recommended_warning_flags
126+
juce::juce_recommended_warning_flags
116127
)
117128

118129
if (APPLE)
119130
set_target_properties(${PROJECT_NAME} PROPERTIES XCODE_ATTRIBUTE_CLANG_LINK_OBJC_RUNTIME "NO")
120131
endif()
121132

122-
#juce_generate_juce_header (${PROJECT_NAME})
123-
124133
get_property (debug_configs GLOBAL PROPERTY DEBUG_CONFIGURATIONS)
125134

126135
if (NOT debug_configs)

README2.md

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
2+
# Audible Planets (v1.2!)
3+
4+
An expressive, quasi-Ptolemaic semi-modular synthesizer.
5+
6+
![main1](https://github.com/user-attachments/assets/2e30bb64-5973-412b-8d30-1bcb8c8093c1)
7+
8+
![main2](https://github.com/user-attachments/assets/739b269e-6ad7-4054-8b57-316d8c0dbd64)
9+
10+
![MODS](https://github.com/user-attachments/assets/0a483717-896c-4fc1-8e26-182f908c3b67)
11+
12+
![fx](https://github.com/user-attachments/assets/f3c06b90-ab56-4163-ac65-d8b7aebc680e)
13+
14+
## Overview
15+
16+
The synthesizer produces sound based on the position of "planets" moving in a sort of orbital simulation. Each of the planets revolves around either one of the other planets or a common center. To make sound, the engine views the planets from a point that is either at that common center of revolution or nearby, at a point called the "equant," and interprets their positions in one of two ways: either as an angle (left channel) and its perpendicular (right channel) or as a position (with each coordinate in one of the channels). Because of the likeness with FM synthesis, the first is called "modulated," and the second "demod," for short. The picture below shows one channel of both sources, with the other channel on the horizontal:
17+
18+
![orbital model](https://github.com/user-attachments/assets/ca2d5da8-9e2d-4d1b-b7c5-1708f5f7479a)
19+
20+
The relative speeds of revolution of the various bodies have their analogues in the frequencies of so-called "carrier" and "modulator" (or "operator") waves in traditional FM synthesis, so the interface allows both ("coarse") whole-number and ("fine") fractional variation of these relative frequencies, producing a wide array of timbres, from the pure and simple to the densely inharmonic. An animation of a simplified orbital model (only two planets, no equant) [can be viewed here](https://www.desmos.com/calculator/avsrrqq3nn).
21+
22+
## Features
23+
24+
- "Orbital Modulation" (OM) synthesis :tm: :wink:
25+
- Modulation matrix with monophonic and polyphonic modulation for most parameters
26+
- Built-in modulatable effects chains
27+
- Changes in version 1.2: simplified control scheme for oscillators, somewhat less aliasing, refined effects (waveshaper and chorus).
28+
29+
## *Raison d'être*
30+
31+
I wanted to know what Ptolemy's "equant" would sound like. More on that below.
32+
33+
## Demos
34+
- Audible Planets was chosen for the KVR Forums' "One Synth Challenge" in May 2024. Competitors submit tracks made using only one synth, and it's pretty impressive what they are able to accomplish under those constraints. [Here's a playlist](https://soundcloud.com/kvrosc/sets/one-synth-challenge-183).
35+
- [Demo Track by Riley Hutton](https://youtu.be/2T0ZzTWPuJg) - All sounds were generated by Audible Planets (excluding drums and transition FX).
36+
37+
## Installation
38+
The plugin is available as a VST3 plugin, [here](https://github.com/gregrecco67/AudiblePlanets/releases). Since there is no installer, you will have to place the plugin file in the right place yourself. On Windows, place the VST3 file in /Program Files/Common Files/VST3. On Mac OS, place the VST3 file in ~/Library/Audio/Plug-Ins/VST3 and/or the AU file in ~/Library/Audio/Plug-Ins/Components. (You will need the AU component if you plan to run the synth in Logic or GarageBand.) On Linux, place the VST3 file wherever your DAW looks for it, which should include ~/.vst3 as a default. More info on default VST3 file locations [here](https://steinbergmedia.github.io/vst3_dev_portal/pages/Technical+Documentation/Locations+Format/Plugin+Locations.html) and LV2 locations [here](https://lv2plug.in/pages/filesystem-hierarchy-standard.html). On a Mac, you will need to take the further step of authorizing the plugin to run, either from the Privacy & Security settings panel, or by typing `xattr -dr com.apple.quarantine <file location>` in a Terminal window.
39+
40+
Alternatively (or if you want an AU, LV2, or standalone version), you can build it from source:
41+
```
42+
git clone --recurse-submodules https://github.com/gregrecco67/AudiblePlanets.git
43+
cd AudiblePlanets
44+
```
45+
Then, if on Mac OS:
46+
```
47+
cmake -B build -G Xcode .
48+
open build/AudiblePlanets.xcodeproj
49+
```
50+
and compile the project in Xcode.
51+
52+
Or, on [Linux](https://github.com/juce-framework/JUCE/blob/master/docs/Linux%20Dependencies.md) (using Ninja):
53+
```
54+
cmake -B ninja-build -DCMAKE_BUILD_TYPE=Release -G Ninja .
55+
cd ninja-build
56+
ninja
57+
```
58+
59+
On Windows, using Visual Studio, just open the folder and wait for it to parse the CMake file. The project is configured to install the plugin in the right place after building it.
60+
61+
# Operation
62+
63+
## Pages
64+
65+
As seen above, the synth has three pages: "Main," "Mods," and "Effects." The Main page contains the main controls for sound generation. The Mods page contains controls for configurable modulation sources like LFOs and MSEGs. The Effects page contains the built-in effects arranged in one or two chains.
66+
67+
### Main Page
68+
69+
The four revolving bodies are controlled by the four panes of the OSC section. The radii of their orbits can be modulated by any of the four envelopes to the right. Their relative speeds can be adjusted with the "Coarse" and "Fine" controls, or an absolute frequency can be set with the "Fixed" control. Normally (when the wave is set to "Sine"), the motion of the body is uniform and circular. In this mode, adjusting the relative starting points of the various oscillations (with the "Phase" control) can change the sound a lot. When a different wave is selected, the sound is richer and individual phase differences matter less.
70+
71+
In the Timbre section, you can modify the position of the equant and the mix of modulated and demodulated signal. Since the size of all the orbits is variable, a planet or planets may pass very close to the equant, or even through it, resulting in sharp corners and/or discontinuities (and some aliasing, less in v1.2). This could (and can) be avoided by making the outer orbits smaller, but that also reduces their contribution to the overall sound. Finally, the "Algorithm" control switches between different arrangements of the oscillators, with different "terminal" bodies. In many cases, the first algorithm (1-2-3-4) is the harshest, and the last the least harsh (since the modulation is less compounded), but the effects vary depending on the relative sizes of the orbits and other factors, so it's worth trying out different algorithm settings as you're trying to dial in a sound. There's also a dedicated filter, with cutoff, resonance, and key tracking controls, and a variety of common filter types. There's also an auxiliary oscillator, for the sake of layering.
72+
73+
Almost every control on the main page can by modulated differently for each individual voice ("poly") or the same for all ("mono"). A quick aside about that:
74+
75+
<ul>On all three pages, the "Mod Sources" and "Mod Matrix" panels appear. Click on any of the icons to the right of modulation sources to select them for assignment to one or more controls, which can be done by clicking and dragging on any knob. Modulation sources and destinations will appear in the mod matrix, which offers further controls for different modulation curves and amounts and for selecting between unipolar or bipolar modulation. Note that many modulation destinations, and all effects controls, can only be modulated "mono."</ul>
76+
77+
### Mods Page
78+
79+
The "Mods" page contains the controls for the LFOs and MSEGs, as well as a few others. In the headers of most mod source panels (ENVs, LFOs, MSEGs), there are controls to create connections, either by direct selection, or by putting the synth in "Learning" mode, where clicking and dragging controls applies modulation. There are also some overall controls for the synth in "Global." Finally, the "Macros" panels allows modulation of several parameters at once by one knob, which can be assigned to respond to a MIDI CC message. Just click "Learn" beneath the knob, and then activate the control you want to assign to it on your MIDI controller. A CC number will appear below the knob to indicate the assignment was successful. Click on the "Clear" button below it to remove the assignment.
80+
81+
### Effects Page
82+
83+
The "Effects" page contains slots for up to eight built-in effects, arranged in one or two chains ("A -> B" or "A || B"), each with its own gain control, applied before the signal enters the chain. Ordering the effects chains differently can open up a lot of possibilities. Since the effects parameters can be modulation destinations, there's a mod sources panel on this page, too, as well as a modulation matrix panel, showing the currently active modulations, and offering controls to bypass, adjust, or delete them. In combination, the effects on this page can add a lot of boost, especially when modulated with sources that can constructively interfere. A built-in limiter is accordingly always on and meant to keep the levels below 0 dB, but be careful nonetheless.
84+
85+
## Presets
86+
87+
Presets can be viewed either as a flat list, by clicking on the current preset name, or in a browser that divides them by author and category, by clicking on the folder icon to the left of the current preset name. In case you want to install any manually, on Windows, the folder location should be ```%HOMEPATH%\AppData\Roaming\com.void-star\Audible Planets\programs```. On Mac OS, it should be ```~/Library/Application Support/com.void-star/Audible Planets/programs```. On Linux, it should be ```~/.config/com.void-star/Audible Planets/programs```. In any case, you can right-click on any preset name in the browser pane and select the option to show the file location. Also, if you come up with any patches you'd like to share, please feel free to make a pull request on that repo or just message me here on Github.
88+
89+
# Motivation / Inspiration
90+
91+
This began as a sort of recreational programming task. I had learned about Ptolemy's system and wanted to understand one of the features that made it so successful for so long (millennia). Many people who know nothing else about Ptolemy know about his use of epicycles. But epicycles predate his system. What he added was a way of making the model better fit the variations in motion that gave the "planets" their name, by use of what he called the "equant" point. As I pointed out above, the equant doesn't have to be at the center of the main circle (the "deferent"), with the result that the planet's motion appears even more accelerated or decelerated at certain points in its trajectory than it is by the mere interaction of deferent and epicycle alone. (In Ptolemy's system of planetary motion, the equant and center of observation function differently, but with a similar effect.) I set out to investigate this sonically.
92+
93+
I don't think there exists another synth with an "equant" control, but I have to admit that, in the end, its usefulness is limited. Its effect tends to get lost when the interplay of other parameters produces richer wave shapes, but when starting from purer tones, it can impart a distinctive character to the sound. The big surprise for me was how consequential it would turn out to be to either ignore or include the orbiting bodies' distance from the observer in the way the model produces sound (as controlled by the "Demod Mix" knob).
94+
95+
Another sort of oblique inspiration was [this cover](https://www.nytimes.com/1979/04/24/archives/computer-synthesizes-music-of-the-spheres-music-of-spheres.html) of the NYT "Science Times" from April 24, 1979. Just seeing familiar notation allegedly representing the "music of the spheres" was intensely provocative and the image stayed with me, as well as the idea that, somehow, people were using computers to investigate it and actually generate sound. I was a fan of Isao Tomita's take on Holst's "The Planets," which surely somehow contributed to my interest.
96+
97+
![NYT cover planets](https://github.com/gregrecco67/AudiblePlanets/assets/127459177/f82a7979-d93d-43dd-b0f2-992d408030ed)
98+
99+
A complementary inspiration is the world of FM (or PM) synthesis. I didn't set out to create an FM synth, but that's what interpreting the orbits as sound waves has led to. I joked with some friends that "Orbital Modulation" could be a marketing-friendly term for this "innovative new form of synthesis," though I hasten to add that :wink: OM is not really trademarked, as far as I know. In truth, you could probably make most of the sounds possible here (and many more) with any capable FM synth. But what I think I've accomplished by way of novelty is to expose a lot of musically or sonically relevant controls for adjustment and modulation in an arrangement that is easier to use than some. Also, the orbital model effectively limits the amount of phase modulation that is possible, and such restrictions can be aesthetically productive.
100+
101+
In playing the synth, I find a lot of single controls (especially the equant, demodulation, and individual oscillator volume and phase controls) often have a kind of significant threshold, where a lot of change happens in a small range; the controls expose a lot of "edges." Connecting these parameters with the MIDI Polyphonic Expression (MPE) modulation sources or others opens up a lot of possibilities. I hope that makes it easy to make sounds that are more or differently expressive and dynamic, and to find the sweet spots.
102+
103+
If you've made it this far, thank you for reading. I'd be interested to hear what you think of it all. Happy music-making and "safe journeys, space fans, wherever you are."

0 commit comments

Comments
 (0)