Robbert van der Helm
ad50852aeb
Fix CLAP event output struct sizes
2022-04-11 20:53:25 +02:00
Robbert van der Helm
5e486ab3d9
Explicitly handle 0 channel IO
...
Instead of treating it as a flush. This is needed for note effect
plugins.
2022-04-11 20:46:51 +02:00
Robbert van der Helm
65d87f87ed
Add a way to output note events
...
This supports all note events supported by NIH-plug, and both CLAP and
VST3.
2022-04-11 20:46:51 +02:00
Robbert van der Helm
e4606918e7
Rename next_midi_event() to next_event()
2022-04-11 18:15:14 +02:00
Robbert van der Helm
84d91d8826
Update dependencies for CLAP
...
The signature for this function was incorrect.
2022-04-11 16:18:39 +02:00
Robbert van der Helm
5b5bbf19f7
Prefix all polyphonic expressions with Poly
...
Makes it much more obvious that they're polyphonic at a glance.
2022-04-11 15:57:27 +02:00
Robbert van der Helm
63ad2b2cb8
Parse redundant CLAP MIDI events just in case
2022-04-11 15:56:33 +02:00
Robbert van der Helm
476dfb9f81
Fix compilation failure from f0303fe
2022-04-09 12:12:34 +02:00
Robbert van der Helm
33c2d8288b
Don't warn on parameter hash overflow
...
But do mention overflows in the duplicate parameter warning.
2022-04-09 11:47:23 +02:00
Robbert van der Helm
f0303fed4b
Remove now unnecessary input events sort
...
This was added in anticipation of having to merge the parameter change
MIDI CC events into the events stream, but VST3 threw a curveball and
now we need to do the sorting one step earlier.
2022-04-09 11:32:20 +02:00
Robbert van der Helm
52d7b47a24
Improve block splitting transport information
...
Don't do any recomputations at the start of the buffer, and also
recompute the bar positions and numbers.
2022-04-08 23:10:38 +02:00
Robbert van der Helm
1a8f81e4c0
Support MIDI CCs, aftertouch, pitch bend for VST3
...
This required rewriting the way events and parameter changes are handled
for VST3 by putting them all in a single sorted array, because we can
now no longer read directly from the host's events list because we also
need to mix these new generated MIDI CC events in with it.
2022-04-08 20:53:32 +02:00
Robbert van der Helm
059c733b78
Handle predefined VST3 note expressions
2022-04-08 17:49:13 +02:00
Robbert van der Helm
2a4a61947f
Update reasoning for clearing last param ID bit
2022-04-08 00:02:28 +02:00
Robbert van der Helm
9740246d0a
Always sort VST3 note events in prep for CCs
...
So we won't forget to add this then. CC messages come from the parameter
change queues while regular note event messages come from another queue,
so they need to be merged into one sorted queue.
2022-04-07 23:57:56 +02:00
Robbert van der Helm
24837d1552
Implement full MIDI support for CLAP
2022-04-07 23:28:31 +02:00
Robbert van der Helm
0b3a5cd297
Support all of the CLAP expression types
...
These aren't supported for VST3 yet, we'll need to register note
expression controllers for that.
2022-04-07 21:17:31 +02:00
Robbert van der Helm
b9a10455bb
Add polyphonic aftertouch support
2022-04-07 20:55:31 +02:00
Robbert van der Helm
1141616466
Replace ACCEPTS_MIDI bool with new enum
...
So we can gate future MIDI CC support behind an additional option since
this involves more work on the VST3 side.
2022-04-07 20:27:37 +02:00
Robbert van der Helm
8f359feadb
Store velocity as a float
...
Instead of converting this to a 0-127 value. We may be throwing away
precision otherwise.
2022-04-07 20:12:30 +02:00
Robbert van der Helm
2af3f84416
Rename State to PluginState
...
Now that it is part of the public API.
2022-04-07 17:39:34 +02:00
Robbert van der Helm
84bac0a47c
Spool param rescan call to the GUI thread
...
Otherwise the CLAP example host std::terminates, and we can also reuse
the existing restart task for the VST3 wrapper.
2022-04-07 17:25:12 +02:00
Robbert van der Helm
d0064f87d6
Add state saving and restoring through GuiContext
...
While preventing any possible data races.
2022-04-07 17:19:24 +02:00
Robbert van der Helm
7ca855b3fc
Make State cloneable
...
This is needed for user preset support.
2022-04-07 16:50:02 +02:00
Robbert van der Helm
083885a40c
Rework Params trait API with Arc instead of Pin
...
This is a breaking change requiring a small change to plugin
implementations.
The reason why `Pin<&dyn Params>` was used was more as a hint to
indicate that the object must last for the plugin's lifetime, but `Pin`
doesn't enforce that. It also makes the APIs a lot more awkward.
Requiring the use of `Arc` fixes the following problems:
- When storing the params object in the wrapper, the `ParamPtr`s are
guaranteed to be stable.
- This makes it possible to access the `Params` object without acquiring
a lock on the plugin, this is very important for implementing
plugin-side preset management.
- It enforces immutability on the `Params` object.
- And of course the API is much nicer without a bunch of unsafe code to
work around Pin's limitations.
2022-04-07 15:31:46 +02:00
Robbert van der Helm
54371fb488
Expose the State object
...
So we can later allow plugins to save and restore state from their GUI
this way.
2022-04-07 14:12:53 +02:00
Robbert van der Helm
b1c34146ee
Get rid of automatically generated bypass params
...
I thought these were mandatory in VST3, they are not.
2022-04-06 13:34:32 +02:00
Robbert van der Helm
a49393f863
Update for CLAP 0.24
2022-04-05 16:32:00 +02:00
Robbert van der Helm
f301726f37
Fix sample accurate automation for VST3
2022-03-29 00:56:04 +02:00
Robbert van der Helm
7b9eff456c
Update for new vizia resize patch
...
This version uses a property on the context instead of events. This gets
rid of all of the problems and complexity of the previous
implementation.
2022-03-29 00:02:11 +02:00
Robbert van der Helm
c568e5d3be
Don't wait for the request resize result
...
We'll need to find a workaround for this, but this makes resizing in the
CLAP example host way too slow.
2022-03-28 00:50:08 +02:00
Robbert van der Helm
f3330aee86
Implement the resize request callback for CLAP
2022-03-27 23:11:04 +02:00
Robbert van der Helm
f9db59f4bc
Add a resize request callback to VST3 GuiContext
...
With some more work in baseview this can be used to resize windows from
the plugin.
2022-03-27 19:23:43 +02:00
Robbert van der Helm
8d71369b2e
Rename .is_bypass() to .make_bypass()
...
Because just like `.bypass()` sounds like a getter, so does
`.is_bypass()`.
2022-03-27 03:45:06 +02:00
Robbert van der Helm
7f365d1113
Update dependencies
2022-03-25 21:04:48 +01:00
Robbert van der Helm
8090d0ae41
Add explicit bypass parameter handling
...
Plugins can mark a `BoolParam` with `.is_bypass()`. Hosts can then link
use that parameter directly in their own UI.
2022-03-23 17:42:48 +01:00
Robbert van der Helm
0cb26b5b4c
Don't process audio for bypassed plugins
2022-03-23 15:49:34 +01:00
Robbert van der Helm
c6a34a63c4
Hide non-automatable parameters
2022-03-23 13:52:23 +01:00
Robbert van der Helm
e9983cf71c
Use ParamFlags::NON_AUTOMATABLE in the wrappers
...
Setting this will cause the parameter to be hidden from the host's
generic UI and automation lanes.
2022-03-23 13:11:00 +01:00
Robbert van der Helm
f084f14095
Refactor GUIs to use param's own default value
...
This removes the need to pass a lot of these `ParamSetter`s and
`GuiContext`s around. We also don't need explicit events to reset a
parameter anymore since you can get this information from the parameter
itself.
2022-03-21 13:11:36 +01:00
Robbert van der Helm
c22e522629
Greatly simplify Params trait
...
This now is a single vector with all of the information in the correct
order instead of the hashmaps and a vector. This avoids deduplication,
and it especially makes manual `Params` implementations a lot more
convenient since you can't mess up with mismatching IDs between the
methods.
To accommodate exactly this, the persistent fields methods also have a
default implementation and the trait has been marked as `unsafe` since
it's the programmer's responsibility to make sure these `ParamPtr`s will
remain valid.
2022-03-20 13:05:02 +01:00
Robbert van der Helm
b9d79771cc
Use String instead of &'static str in Params
...
This may hurt performance in generic UIs a bit, but it will allow you to
programatically generate custom Params implementations for repeated
Parameters structs.
2022-03-20 02:14:18 +01:00
Robbert van der Helm
8077f10c27
Replace index based for loop
...
This initially did a linear search within the loop so iterating over the
collection wasn't possible. Now we need to use a hashmap anyways, so
this can be simplified again.
2022-03-17 23:00:15 +01:00
Robbert van der Helm
edb492932f
Fix parent finding in VST3 unit transformation
...
Oops.
2022-03-16 22:01:47 +01:00
Robbert van der Helm
d9e943a88d
Filter out the root group
2022-03-16 22:00:31 +01:00
Robbert van der Helm
8d6a7ae861
Add Debug implementations for ParamUnits
2022-03-16 21:55:59 +01:00
Robbert van der Helm
6e31e18b88
Add parameter groups to VST3 wrapper using units
...
This was such a mess to implement, and none of the hosts I have
installed even support it.
2022-03-16 20:40:11 +01:00
Robbert van der Helm
2bf32aa771
Add the ParamUnits to the VST3 wrapper
2022-03-16 20:26:02 +01:00
Robbert van der Helm
ea30ba7ffb
Initialize parameter fields earlier
...
This seems a bit nicer than initializing them on the struct as empty and
then mutating the struct.
2022-03-16 20:26:02 +01:00
Robbert van der Helm
63a7aadb75
Add an abstraction around VST3's unit shenanigans
...
And the ability to convert group paths to them.
2022-03-16 20:26:02 +01:00
Robbert van der Helm
bbf6e009d1
Add a todo for VST3 parameter units
...
Implementing this is going to be a pain.
2022-03-16 17:18:25 +01:00
Robbert van der Helm
f18c92b3b4
Support parameter groups for CLAP
2022-03-16 17:15:33 +01:00
Robbert van der Helm
ce85874340
Implement the CLAP tail extension
2022-03-15 22:28:26 +01:00
Robbert van der Helm
1e9fdeddfb
Don't report supporting MIDI and expression events
...
Since currently these would just get thrown out anyways.
2022-03-15 22:18:37 +01:00
Robbert van der Helm
69e4bc9156
Implement the CLAP note ports extension
2022-03-15 22:16:50 +01:00
Robbert van der Helm
f53f6829f0
Implement the CLAP event filter extension
2022-03-15 22:08:29 +01:00
Robbert van der Helm
b95c833352
Don't handle CLAP modulation events
...
This would require special handling. Modulation acts as an absolute
offset for the current parameter value, not as a relative adjustment to
that value.
2022-03-15 21:26:11 +01:00
Robbert van der Helm
9232f8a51e
Derive Debug and Clone for CLAP output events
2022-03-15 18:53:35 +01:00
Robbert van der Helm
ccc8088218
Update for CLAP 0.23
2022-03-15 18:47:29 +01:00
Robbert van der Helm
6fe967f65e
Implement parameter change notifications for CLAP
2022-03-13 18:30:21 +01:00
Robbert van der Helm
e1f0f619ed
Implement parameter change notifications for VST3
2022-03-13 18:28:56 +01:00
Andrew Palm
4fbf7e0ed3
Fix compilation errors when SSE not available
...
Looks like these were missed in 7d3beb174e
and d878fd692a
.
2022-03-11 09:04:57 -05:00
Robbert van der Helm
87e447ab25
Mention potential race condition in CLAP events
2022-03-11 14:33:43 +01:00
Robbert van der Helm
f98ba70764
Comment on the CLAP gesture handling
2022-03-11 13:27:23 +01:00
Robbert van der Helm
7339e8e956
Include CLAP_EVENT_SHOULD_RECORD for gestures
...
Apparently this is what you're supposed to do.
2022-03-11 13:03:26 +01:00
Robbert van der Helm
c1ca97c78c
Fix false positive warning in CLAP GUI parameters
2022-03-11 00:49:34 +01:00
Robbert van der Helm
246c319bbf
Implement automation gestures for CLAP
2022-03-11 00:14:39 +01:00
Robbert van der Helm
5d3527c5c2
Also implement sample accurate automation for VST3
2022-03-10 23:39:58 +01:00
Robbert van der Helm
b41b4ef725
Implement sample accurate automation for CLAP
2022-03-10 20:14:42 +01:00
Robbert van der Helm
b9412657c1
Fix allocation error from thread locals
2022-03-08 14:07:29 +01:00
Robbert van der Helm
37e1b9523b
Optionally disallow allocations in reset function
2022-03-08 00:46:17 +01:00
Robbert van der Helm
70d3b5d557
Add a reset function to the plugin trait
...
This is used as part of CLAP 0.19/0.20, and we can just always call it
after the initialize function to stay consistent for VST3 plugins.
2022-03-08 00:35:55 +01:00
Robbert van der Helm
10ced981bd
Remove todos about fixing skewed discrete ranges
...
Because those have been removed.
2022-03-08 00:27:25 +01:00
Robbert van der Helm
8ee380864c
Update for CLAP 0.20
2022-03-08 00:21:51 +01:00
Robbert van der Helm
79ab0cd7ed
Add the special win32-dpi-aware feature on Windows
2022-03-05 16:02:52 +01:00
Robbert van der Helm
9267a8371c
Add DPI scaling support
...
That hopefully works.
2022-03-05 13:37:35 +01:00
Robbert van der Helm
e2605c8cee
Add transport information for VST3 and CLAP
...
This is available through the process context.
2022-03-04 15:05:00 +01:00
Robbert van der Helm
99f97978a9
Reorder ProcessContext methods
...
When we'll add more things here the more common getters should come
first and less common operations like changing latency should come last.
2022-03-04 13:22:58 +01:00
Robbert van der Helm
80457ac0f9
Fix doc links after prelude migration
2022-03-03 23:30:29 +01:00
Robbert van der Helm
4c0b07c578
💥 Move re-exports to a prelude module
...
So you can import everything at once, because you're likely going to
need at least 90% of it anyways.
2022-03-03 23:23:51 +01:00
Robbert van der Helm
f581294d7b
Update rustdoc formatting for links
...
Apparently it showed this text verbatim, and not in monospace.
2022-03-03 23:05:12 +01:00
Robbert van der Helm
542012aa0e
Request restart for latency change when processing
...
Calling this change function seems to work fine, but apparently you're
supposed to do it this way.
2022-03-03 21:58:40 +01:00
Robbert van der Helm
80b1bf12f2
Use AtomicRefCell for all uncontested locks
...
Since it would be a bug if those locks were somehow contested.
2022-03-03 21:21:08 +01:00
Robbert van der Helm
184355a886
Delay CLAP host extension query to init()
...
Or the CLAP example host will get very mad at us.
2022-03-03 21:09:12 +01:00
Robbert van der Helm
27570be4a6
Implement platform-specific CLAP GUI extensions
2022-03-03 18:29:37 +01:00
Robbert van der Helm
b5993c1bb8
Add a CLAP GuiContext for sending param changes
2022-03-03 17:47:41 +01:00
Robbert van der Helm
a4930dc887
Add parameter change outputs for CLAP
...
But without any way to send them, at least for now.
2022-03-03 17:21:32 +01:00
Robbert van der Helm
8f92669a47
Keep track of the processing status
2022-03-03 17:03:52 +01:00
Robbert van der Helm
de4921c033
Move CLAP input event handling to a function
2022-03-03 16:58:57 +01:00
Robbert van der Helm
f91958e971
Move VST3 GuiContext to a separate object
2022-03-03 16:33:41 +01:00
Robbert van der Helm
5766f037b2
Implement the general CLAP GUI extension
2022-03-03 15:52:10 +01:00
Robbert van der Helm
91f2f49fd3
Create stubs for the CLAP editor
2022-03-03 15:40:16 +01:00
Robbert van der Helm
87830abdf6
Store a reference to the wrapper on the wrapper
2022-03-03 15:13:36 +01:00
Robbert van der Helm
6d63d3f095
Rename wrapper: 👏 :plugin to *::wrapper
...
To match the struct name.
2022-03-03 15:08:14 +01:00
Robbert van der Helm
4ceb0efdc4
Use Arc instead of Box for the wrapper
...
We'll need this for the GuiContext.
2022-03-03 15:06:47 +01:00
Robbert van der Helm
d1840b8d86
Move Box creation to the CLAP wrapper
...
So the new->destroy pair makes more sense
2022-03-03 15:01:28 +01:00
Robbert van der Helm
cd070ad876
Remove todo about latency not being implemented
2022-03-03 14:42:17 +01:00
Robbert van der Helm
fa01d3bfeb
Generate most of ParamPtr with a macro
2022-03-03 14:28:52 +01:00
Robbert van der Helm
4eb35ed585
Implement the CLAP latency extension
2022-03-03 00:46:49 +01:00
Robbert van der Helm
c3efc81957
Remove old todo
2022-03-03 00:11:12 +01:00