Version 0.9.59
-
Patches now support sending and receiving custom events from endpoints
A new FIFO system means that outgoing events (including console messages) can now be collected on a different thread to the render thread. In the JUCE plugin wrapper, they are delivered on the message thread. In the Blueprint wrapper, there are new javascript bindings to send and receive custom events, which will enable features like metering and other custom run-time communication between the DSP and the GUI.
-
complex primitive support
The primitive types have been extended to include
complex32
andcomplex64
support. There is acomplex
type which likefloat
provides the fastest host complex data type. The complex type support normal arithmetic operators, equality comparison, and the.real
and.imag
accessors to retrieve the real and imaginary components respectively. Imaginary constants can be created using thefi
suffix for 32 bit andi
suffix for 64 bit floating point values. -
namespace specialisation and alias support
Namespaces can now be parameterised, similar to the existing logic for processors and graphs. Namespaces are now valid specialisation parameters. Namespace aliases are created using the namespace keyword (e.g
namespace foo = bar (float32);
) -
Changes to clamp/wrap behaviour around binary operators
There was a degree of ambiguity when apply numeric operators to clamp and wrap objects - should the result be of the same type as the clamp/wrap, or should it be an int? We've moved to returning an int, which will require a cast to the clamp/wrap type if that is the desired result. It makes the resulting type clearer in some situations (e.g adding two clamp types of different ranges). The assignment operators work as expected (so will automatically keep the value within the clamp/wrap range).
-
Changes to generic function parameter binding
With this release, we've updated the logic for determining data types for generic functions. Previously, when deciding what type should be used, the rules allowed for silent casting to candidate types, which could lead to confusion (e.g. a call to
max (1, 2.0)
would compile, and would return anint
value2
whilstmax (1.0, 2)
would compile and return afloat64
value2.0
). The compiler will now fail to compile such code unless the types match exactly. -
Updated llvm backend
Resolved various issues around vector cast operations in the llvm backend.
-
Updated heart parser
Various updates to the heart parser to resolve possible issues around naming conflicts.
-
Updated voice allocator
The voice allocator now correctly forwards control events
-
Various soul command updates
The soul command has various fixes applied to resolve implementation errors.