1
0
Fork 0
Commit graph

833 commits

Author SHA1 Message Date
Robbert van der Helm 4b905e28d4 Add Clone and Debug instances for Smoother 2022-07-06 14:32:18 +02:00
Robbert van der Helm 68cf0455ee Rework and optimize block smoothing API
You now need to bring your own buffer instead of the smoother having a
built in vector you would need to pre-allocate. This makes the API
simpler, and also much more flexible when doing polyphonic modulation.

In addition, the new API is much more efficient when there is no
smoothing going on anymore.
2022-07-06 14:29:29 +02:00
Robbert van der Helm ec77d3b450 Fix typo in comment 2022-07-06 13:55:26 +02:00
Robbert van der Helm 1424b98e38 Break PolyModulation into that and MonoAutomation
This is needed to properly support polyphonic modulation, since the
modulated value may still be automated in the meantime and the
polyphonic modulation must act as an offset for that value. This does
mean that the plugin must add the normalized value and normaliezd offset
by itself. The `PolyModulation` event now also contains a description of
how this can be used. It would have been nicer to be able to send
polyphonic automation-style events instead (like the PolyModulation was
doing before), but that's sadly not feasible without NIH-plug being
involved in the voice management.
2022-07-06 13:40:12 +02:00
Robbert van der Helm 9520234b57 Pass poly modulation events through to the plugin 2022-07-06 00:09:53 +02:00
Robbert van der Helm 0187325b60 Add (currently unused) PolyModulation events 2022-07-05 23:51:37 +02:00
Robbert van der Helm af4314b581 Mark poly mod parameters as such 2022-07-05 23:41:35 +02:00
Robbert van der Helm 54b47ecf71 Keep track of poly mod parameter IDs 2022-07-05 23:41:08 +02:00
Robbert van der Helm cdee721e9c Allow the plugin to change current voice capacity 2022-07-05 23:26:23 +02:00
Robbert van der Helm f828761677 Implement the CLAP voice info extension 2022-07-05 23:26:23 +02:00
Robbert van der Helm 1de561e4a0 Add poly mod config constant to ClapPlugin
Setting this will enable the 'voice-info' extension.
2022-07-05 23:26:23 +02:00
Robbert van der Helm 1466358e14 Support Plugin::HARD_REALTIME_ONLY for VST3 2022-07-05 22:24:52 +02:00
Robbert van der Helm 905925e032 Move the hard realtime constant to Plugin
Since we could indeed just add the `|OnlyRT` category to the VST3
plugin.
2022-07-05 22:20:07 +02:00
Robbert van der Helm 992fcfe969 Add polyphonic modulation IDs to parameters
In a bit we should be able to use this with a new `PolyModulation` note
event to allow polyphonic modulation.
2022-07-05 19:39:50 +02:00
Robbert van der Helm 7ea2851775 Clarify the input event timing handling in VST3 2022-07-04 22:45:52 +02:00
Robbert van der Helm 1bbb56151d Remove duplication in CLAP note timing handling 2022-07-04 22:43:48 +02:00
Robbert van der Helm 5b264179d4 Add note choke events 2022-07-04 22:42:04 +02:00
Robbert van der Helm d027a6319f Add VoiceTerminated events
These need to be output by a plugin when using polyphonic
modulation (which is currently not yet supported by NIH-plug).
2022-07-04 19:31:40 +02:00
Robbert van der Helm a2f8a9bebf Add voice ID fields for all non-MIDI note events
This will be useful when adding polyphonic modulation.
2022-07-04 18:31:59 +02:00
Robbert van der Helm f11b3c1a03 Fix typos in parameter value docstrings 2022-07-04 18:01:55 +02:00
Robbert van der Helm 7cd7294b22 Make CLAP descriptions and special URLs optional
This closes #14.
2022-07-04 12:46:34 +02:00
Robbert van der Helm 5cbd8827e9 Update clap-sys with optional function pointers
None of these function pointers are allowed to be null, yet even the
official `clap-helpers` do this. This new `clap_call!()` macro asserts
that a pointer is non-null before calling it.
2022-07-04 00:07:06 +02:00
Robbert van der Helm 97baa9d55c Remove duplicate comment 2022-07-03 17:04:33 +02:00
Robbert van der Helm c91b74355f Let rustfmt handle string wrapping 2022-07-03 16:52:38 +02:00
Robbert van der Helm ed880f5297 Handle buffered CLAP stream reads and writes
`clap-validator` now tests this.
2022-07-03 16:51:15 +02:00
Robbert van der Helm 5e6e920418 Use BTreeMaps in the state
This ensures that the order is consistent when saving the same state
file multiple times.
2022-07-02 19:13:18 +02:00
Robbert van der Helm 71efe779a5 Recompute normalized values when setting params
This makes it so that the value is consistent after reloading the
preset.
2022-07-02 19:04:43 +02:00
Robbert van der Helm 32ad1212f1 Silence clippy::type_complexity
Clippy now wants us to move any usage of the Fn* traits to a typedef.
Doing so will almost certainly not help readability.
2022-07-01 15:50:23 +02:00
Robbert van der Helm 0599780030 Remove unnecessary reborrows 2022-07-01 15:50:16 +02:00
Robbert van der Helm 1d7cbe4c4d Suppress unused_unit more locally 2022-07-01 14:58:31 +02:00
Robbert van der Helm f309f39982 More defensively check for >0 inputs and outputs
Noticed this through a bug in clapval.
2022-06-29 01:32:39 +02:00
Robbert van der Helm 4247c229ec Fix in-place pairs for output-only plugins
https://github.com/robbert-vdh/clapval reminded me of this.
2022-06-29 01:32:39 +02:00
Robbert van der Helm 05fd7fa075 Revert "Fix audio port in-place pair indices"
This reverts commit 791dc44650.

This was actually correct, this should use stable indices instead of
list indices.
2022-06-27 18:33:13 +02:00
Robbert van der Helm 791dc44650 Fix audio port in-place pair indices 2022-06-27 18:22:40 +02:00
Robbert van der Helm 9fa305206c Fix compilation on Windows 2022-06-26 23:25:21 +02:00
Robbert van der Helm 4b2435a791 Allow allocations during most panics
The panic logger is allowed to allocate now. If a panic message uses
string formatting then that may still trigger `assert_no_alloc`.
2022-06-26 23:13:35 +02:00
Robbert van der Helm fb0c1acbed Update documentation on PersistentField 2022-06-24 21:09:25 +02:00
Robbert van der Helm 8018af419f Add back lost note->frequency conversion
This somehow got lost in db135ba34f.
2022-06-22 19:40:25 +02:00
Robbert van der Helm db135ba34f Fix note note string -> MIDI ID conversion
This was added in a PR, but I never actually tested the conversion.
2022-06-22 19:35:10 +02:00
Robbert van der Helm c6c37e665b Accept note names for frequency params 2022-06-22 18:41:50 +02:00
Robbert van der Helm 2d2ff23cc4 Remove old TODO about only logging in debug builds 2022-06-19 15:28:18 +02:00
Robbert van der Helm bf725fb935 List more not yet implemented features 2022-06-18 18:50:53 +02:00
Robbert van der Helm a291e0dfb6 Always request flush when setting params from GUI 2022-06-17 18:28:15 +02:00
Brian Anderson 23947ec0b5 Dummmy -> Dummy 2022-06-15 23:28:07 -06:00
Robbert van der Helm e891e1fdb7 Use JACK transport data for JACK standalone 2022-06-15 00:48:34 +02:00
Robbert van der Helm 4219acaf83 Sort of allow GUI-less standalones
There's no way to interact with them, but they'll just keep running and
be at least somewhat useful.
2022-06-15 00:25:37 +02:00
Robbert van der Helm a4fa7e8e78 Initialize smoothers in the standalone 2022-06-15 00:18:44 +02:00
Robbert van der Helm 0b6be4de1c Fully implement MIDI support in standalone wrapper 2022-06-15 00:10:27 +02:00
Robbert van der Helm 54f4b8a026 Read and write MIDI events in JACK standalone
The standalone itself does not yet pass these to the plugin.
2022-06-14 23:43:13 +02:00
Robbert van der Helm 0d2330d773 Add conversions from note events to MIDI 2022-06-14 23:28:12 +02:00
Robbert van der Helm 66f5a0e7de Move MIDI parsing from CLAP wrapper to NoteEvent 2022-06-14 22:59:40 +02:00
Robbert van der Helm 4e021dd0bb Add input and output events to Backend trait 2022-06-14 22:56:25 +02:00
Robbert van der Helm e967e04856 Add auto connecting for JACK MIDI ports 2022-06-14 21:43:26 +02:00
Robbert van der Helm 5cd4bb8de0 Register JACK MIDI input and output ports 2022-06-14 21:32:29 +02:00
Robbert van der Helm c7f6aa15f8 Add a standalone cli arg to connect JACK inputs 2022-06-14 20:08:36 +02:00
Robbert van der Helm f30fe0dbc2 Fix macro name 2022-06-14 19:12:28 +02:00
Robbert van der Helm 73d3281816 Log which backend is used in auto mode 2022-06-14 19:03:36 +02:00
Robbert van der Helm 7e0caa4c8d Add audio support to the JACK backend 2022-06-14 18:59:54 +02:00
Robbert van der Helm 7216627a01 Create and connect JACK ports 2022-06-14 17:59:34 +02:00
Robbert van der Helm 10a55e1f00 Move standalone backends to their own modules 2022-06-14 17:31:45 +02:00
Robbert van der Helm 191d5383bd Add boilerplate for an actual JACK implementation 2022-06-14 17:27:59 +02:00
Robbert van der Helm e2099ec16c Introduce an nih_error!() macro for fatal errors 2022-06-14 16:31:46 +02:00
Robbert van der Helm 3d5f44764e Add boilerplate for a JACK backend 2022-06-14 16:27:35 +02:00
Robbert van der Helm 99fdc8975f Add a backend type option to the standalone cli 2022-06-14 16:04:39 +02:00
Robbert van der Helm d97831649e Move standalone WrapperConfig to its own module 2022-06-14 15:52:31 +02:00
Robbert van der Helm 49e683e396 Add a cli for controlling the standalone settings 2022-06-14 15:44:42 +02:00
Robbert van der Helm 34fa78a313 Update for CLAP 1.0 2022-06-10 00:36:16 +02:00
Robbert van der Helm 12a4440af0 Remove unnecessary use statement 2022-06-08 02:08:51 +02:00
Robbert van der Helm b32cd27e8c Move FIR filters to their own module 2022-06-07 15:19:18 +02:00
Robbert van der Helm 89afa8bf00 Use nih_trace!() for lesser important messages
Like the missing CLAP extensions.
2022-06-07 14:18:56 +02:00
Robbert van der Helm 449adb8bfc Add stable IDs for enum parameters 2022-06-03 22:22:36 +02:00
Robbert van der Helm bfc472e49b Introduce a new enum for CLAP features
Based on the new CLAP 0.26 clap-features.h.
2022-06-02 01:16:30 +02:00
Robbert van der Helm ce9142186e Remove the win32-dpi-aware CLAP feature on Windows
I don't think this is correct, since none of the GUI adapters are able
to communicate the detected DPI back to NIH-plug.
2022-06-02 00:54:15 +02:00
Robbert van der Helm 19f4fdadc5 Update for CLAP 0.26 2022-06-02 00:50:36 +02:00
Robbert van der Helm 37a2d86714 Add TODO on also supporting hard realtime for VST3 2022-05-30 15:30:41 +02:00
Robbert van der Helm c7f5cd1cec Fix NaNs in negative out of bounds skewed params
This would result in a NaN, and the clamping wouldn't catch that.
2022-05-29 14:33:16 +02:00
Robbert van der Helm 782b46308a Make ranges Clone and Copy 2022-05-29 14:22:14 +02:00
Robbert van der Helm 45c141c394 Make smoothing styles Debug, Clone and Copy 2022-05-29 14:21:41 +02:00
Robbert van der Helm 7a4e7b187a Clear auxiliary output buffers at start of process
This prevents uninitialized data from lingering if the plugin doesn't
write to these buffers. Seen this happen in Bitwig.
2022-05-29 14:07:13 +02:00
Robbert van der Helm c56e1eab14 Implement custom port names for CLAP 2022-05-28 00:39:16 +02:00
Robbert van der Helm 90ee514fe4 Implement custom port names for VST3 2022-05-28 00:34:44 +02:00
Robbert van der Helm 625ad06584 Add a port names field on Plugin 2022-05-28 00:20:32 +02:00
Robbert van der Helm 4b760d1c19 Move auxiliary IO handling down in process() 2022-05-28 00:11:14 +02:00
Robbert van der Helm 0242cc5235 Also implement auxiliary IO for VST3 2022-05-28 00:10:16 +02:00
Robbert van der Helm ee900f74c2 Support auxiliary inputs and outputs for CLAP
This does not yet work for VST3. You'll always get empty slices there.
2022-05-27 02:30:57 +02:00
Robbert van der Helm b2e6bd5515 Create a separate InitContext
Only a couple of these functions would be needed during initialization.
In the next couple commits ProcessContext will get a way to access
auxiliary IO, so this really had to be separated.
2022-05-27 01:17:15 +02:00
Robbert van der Helm 7eee0b032e Report at least a channel output bus for VST3
Bitwig just doesn't call the process function if plugins have no audio
IO.
2022-05-26 12:37:31 +02:00
Robbert van der Helm 4c54716cc2 Remove unnecessary pub specifier 2022-05-24 14:26:13 +02:00
Robbert van der Helm f4f54029eb Add a deactivation callback
This is the equivalent of initialize()
2022-05-24 13:05:06 +02:00
Robbert van der Helm 596b04af0a Add preliminary support for auxiliary IO
The missing parts are allocating buffers for these busses, copying data
to those buffers, and adding methods to the ProcessContext to interact
with these inputs and outputs.
2022-05-23 17:13:49 +02:00
Robbert van der Helm ad661c857c Expose CLAP note ports extension for output-only 2022-05-22 23:16:49 +02:00
Robbert van der Helm 2a58b771f3 Remove old todo 2022-05-22 23:05:18 +02:00
Robbert van der Helm d42fd41007 Buffers for zero channel plugins are always valid 2022-05-22 22:48:55 +02:00
Robbert van der Helm 937842d2c5 Suggest copying {Bus,Buffer}Config as needed 2022-05-22 13:39:19 +02:00
Robbert van der Helm 783dc2245e Store the processing mode in BufferConfig
Instead of having a function on ProcessContext.
2022-05-22 13:33:38 +02:00
Robbert van der Helm ee3b0bf8e6 Store the minimum buffer size in BufferConfig 2022-05-22 13:21:39 +02:00
Robbert van der Helm e1d4be2a03 Change NON_AUTOMATABLE semantics and add HIDDEN
This now lets you have parameters that cannot be automated but that are
still changeable through the generic UI.
2022-05-22 12:37:30 +02:00
Robbert van der Helm 985db44503 Allow marking CLAP plugins as hard realtime 2022-05-22 01:01:59 +02:00
Robbert van der Helm 2ac013df64 Fix warnings 2022-05-22 00:59:04 +02:00
Robbert van der Helm 665108721a Add a way to fetch the current processing mode 2022-05-22 00:58:53 +02:00
Robbert van der Helm 9601c9c0c1 Fix modulating non-smoothed parameters
And also get rid of duplicate code here.
2022-05-20 16:12:48 +02:00
Robbert van der Helm 4587c1405f Move VST3 buffer initialization
This was left over from the last commit.
2022-05-18 19:41:43 +02:00
Robbert van der Helm 024307872a Move VST3 initialization to set_active()
Because the host may still change the channel layouts at this point.
2022-05-18 19:29:48 +02:00
Robbert van der Helm 8239169aaf Add some pointers for getting started to the docs 2022-05-13 15:08:05 +02:00
Robbert van der Helm 6fc0b2e148 Call Plugin::initialize() for runtime preset load
It's the plugin's responsibility to not do any realtime unsafe work here
if they support runtime preset loading.
2022-05-13 14:46:25 +02:00
Robbert van der Helm e8764e7327 Use double precision for exponential step sizes
Otherwise you will get issues with rounding errors if someone ever tries
to have smoothing times over a second or so.
2022-05-12 13:50:45 +02:00
Robbert van der Helm 6a40cc9916 Remove debug print 2022-05-12 13:44:22 +02:00
Robbert van der Helm f3d02f6210 Fix updated exponential smoothing 2022-05-12 13:44:01 +02:00
Robbert van der Helm 1fea9f94df Deduplicate the smoother implementation
By introducing a new trait for conversion to and from floating point
numbers.
2022-05-12 13:34:02 +02:00
Robbert van der Helm dc5dfb06c6 Reach 99.99% of target for exponential smoothing
Instead of 99.97%. Both numbers are not based on anything, but this
calculation makes more sense.
2022-05-12 13:21:32 +02:00
Robbert van der Helm 28c7ea4843 Rename ExponentialIIR -> Exponential
The suffix was added to denote that this could do some funny things
because of the snapping to the target value, but in practice that
snapping distance will likely be so tiny that it is likely not
noticeable.
2022-05-12 02:22:12 +02:00
Robbert van der Helm 222036b335 Get rid of unnecessary loop in ExponentialIIR 2022-05-12 01:56:16 +02:00
Robbert van der Helm 116d245149 Add an exponential smoothing style
Based on a one-pole IIR low pass filter that reaches 99.97% of the
target value in the designated time before snapping to that value. This
will be less efficient than the linear FIR smoothing style.
2022-05-12 01:35:01 +02:00
Robbert van der Helm 0355ed3168 Add flush-to-zero support for AArch64 2022-05-10 23:12:52 +02:00
Robbert van der Helm c141314e30 Update for CLAP 0.25 2022-05-09 16:50:24 +02:00
Robbert van der Helm 55eeb689dd Add a padding option to StftHelper 2022-05-08 02:12:37 +02:00
Robbert van der Helm d0fcc9878e Add a Blackman window function 2022-05-08 00:47:20 +02:00
Robbert van der Helm 77b9dd3404 Reuse hann_in_place() for hann() window function 2022-05-08 00:31:55 +02:00
Robbert van der Helm ffe4642aa5 Implement IProcessContextRequirements
This is needed for VST 3.7. We claim to be a VST 3.6.14 plugin, but
implementing this anyways seems like the safe bet. I doubt many hosts
would, but under VST 3.7 hosts are allowed to not send any transport
information unless this interface is implemented.
2022-05-07 13:24:17 +02:00
Robbert van der Helm f05e31d9e3 Sort additional VST3 interace implementations
The sensible order would be IComponent, IEditController,
IAudioProcessor, and then everything else.
2022-05-07 13:18:20 +02:00
Robbert van der Helm a74d8264fb Support CLAP transport information events
This will cause the buffer to be split when the transport information
changes.
2022-05-05 17:23:46 +02:00
Robbert van der Helm 7cb671319e Properly define all predefined note expressions
This is apparently how you're supposed to do it in VST3. How would you
know? You'd ask Steinberg.
2022-05-05 15:35:14 +02:00
Robbert van der Helm 06c5e4b04a Make parameter modulation stick after automation
This is how it's supposed to be implemented in CLAP.
2022-05-02 15:46:57 +02:00
Robbert van der Helm 10ae8e1d05 Enable modulation for CLAP parameters
Everything else has already been implemented, but this is kind of
important.
2022-05-02 11:51:56 +02:00
Robbert van der Helm a4b251e5ef Support monophonic modulation for CLAP plugins
This avoids the potential for state corruption caused by modulation and
modulation can be displayed differently on the GUI.
2022-05-01 19:05:51 +02:00
Robbert van der Helm ddbaffc0bb Add ParamMut method for setting modulation offset
This will be used in the CLAP wrapper to handle `CLAP_EVENT_PARAM_MOD`.
2022-05-01 19:03:04 +02:00
Robbert van der Helm 1d3ac1b2af Move param setting functions to new ParamMut trait
This makes things slightly less confusing because these functions should
never be called from user code.
2022-05-01 18:45:35 +02:00
Robbert van der Helm a17c63bf71 Add parameter getters for unmodulated values
This is needed to be able to support modulation events in CLAP. There an
offset gets applied to the parameter's actual current value. That way
GUIs don't have to move around when parameters are being modulated and
save states cannot get influenced by modulation.
2022-05-01 18:30:30 +02:00
Robbert van der Helm 6451555f85 Add missing #[inline] attribute 2022-05-01 17:56:20 +02:00
Robbert van der Helm 2026257561 Get rid of Default implementations on ranges
These also don't make any sense anymore and will likely lead to more
problems than they solve.
2022-05-01 17:40:53 +02:00
Robbert van der Helm d6bdfd7391 Get rid of Default implementations for params
These don't make any sense anymore with the builder API.
2022-05-01 17:40:26 +02:00
Robbert van der Helm cd628e80ee Store normalized values on the param structs
This will be necessary to implement CLAP modulation later.
2022-05-01 17:34:59 +02:00
Robbert van der Helm 54d2a4cd2c Hide param fields other than value and smoothed
Direct initialization was no longer recommended anyways since now you
need to keep the default value in sync. The next couple of commits will
add a normalized value field and two more fields to help with
modulation.
2022-05-01 17:08:08 +02:00
Robbert van der Helm 40b555bfbd Document how values work in the Param trait 2022-05-01 16:40:18 +02:00
Robbert van der Helm 48d0f87e4c Mark param value getters as inline 2022-05-01 16:40:16 +02:00
Robbert van der Helm 98876670f8 Re-export debug macros from the debug module
This makes it easy to import just the macros without having to use the
oldschool `#[macro_use] extern crate ...;` syntax.
2022-04-30 02:10:54 +02:00
Robbert van der Helm 3d454bfc9c Don't process audio at all with invalid buffers
If the host does some kind of flush this way with num_samples > 0 but
without any outputs or with zero output channels then we should not try
to read from the now invalid pointers from the previous cycle.
2022-04-30 02:00:09 +02:00
Robbert van der Helm ddc28eef5e Clarify the VST3 output .take(num_outputs) 2022-04-30 01:52:53 +02:00
Robbert van der Helm e35886c216 Move window function handling out of StftHelper
And apply the window function only once at the end of the process
function for the plugins that used it.
2022-04-28 17:20:39 +02:00
Robbert van der Helm 4fb67a720b Add a todo for fallback DPI scale detection 2022-04-27 19:26:39 +02:00
Robbert van der Helm b89b4dfbb2 Add a .previous_value() method to the smoothers 2022-04-27 17:43:40 +02:00
Robbert van der Helm 6185909ddf Also safeguard against zero channel counts in CLAP 2022-04-27 17:06:19 +02:00
Robbert van der Helm 21e28fdca2 Handle hosts providing zero output channels 2022-04-27 16:52:30 +02:00
Robbert van der Helm afde489bbf Add a fixme for REAPER's broken bypass handling 2022-04-27 16:45:34 +02:00
Robbert van der Helm 76e7f67f3a Add missing backtick 2022-04-27 15:16:52 +02:00
Robbert van der Helm bb3175f68e Return -> Returns at the start of a docstring
The imperative tense doesn't make any sense when the function is a mere
getter and doesn't actually perform a nontrivial task.
2022-04-26 19:39:51 +02:00
Robbert van der Helm abe5a12461 Add a nih_dbg!() macro analog for dbg!() 2022-04-26 15:43:24 +02:00
Robbert van der Helm dedbfebb71 Add todos about potential duplicate reset calls 2022-04-26 14:15:57 +02:00
Robbert van der Helm 4779991edf Also move reset() call to process start for CLAP
So the behavior is consistent for CLAP and VST3.
2022-04-26 14:14:12 +02:00
Robbert van der Helm 4ac0c40812 Reset last processing status for CLAP on start
Just like we're doing in the VST3 wrapper.
2022-04-26 14:10:00 +02:00