All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Prepares for the registry.
- Adds optimizations from the new
hyrule
.
- Bumps Hyrule to new fix and bumps deku in docs.
- Bumps Hyrule to simplified signatures.
- Bumps Hyrule to Zora.
- Changes namem to Ocarina
- Upgrades to new Bolson
- Upgrades to new Bolson
- Adds necessary export statement
- Adds better type annotation for child.
- Updates Bolson.
- Uses Bolson for core logic.
- Fixes disconnection bug in FFI.
- Adds non-effectful curves for waveshapers.
- Allows for Audio Units to control Audio units.
- Updates to 0.15.0.
- Removes subgraphs, using a nested-event syntax.
- Migrates ocarina to an event-based architecture
- Significantly reduces type-level machinery.
- Adds documentation. As this is a complete rewrite of ocarina, please see the documentation (https://mikesol.github.io/purescript-ocarina) for information on how it all works.
- Adds dynamic subgraphs.
- Removes
SafeToFFI
, speeding up the rendering a bit.
- Simplifies subgraph signature
- Simplifies patched subgraph signature
- Adds updating for single subgraph
- Changes representation of audio parameters to better mirror the API.
- Fixes bugs in the
noLoop
version ofrun
. - Adds support for
setValueCurveAtTime
- Fixes clicks in certain scenarios where gain is 0.
- Better MIDI out functionality (@TristanCacqueray).
- Allows media recorder to output blob.
- Changes the definition of
isOn
to bothon
andoffOn
, smoothing out the switching on of buffers and oscillators.
- Simplifies rendering algorithm in
Run.purs
.
- Makes
control
parameter of looper more robust by turning it into a function. This allows initial controls to be informed by the environment in cases where the environment and control are otherwise decoupled.
- Makes
run
start at 0.0 seconds all the time, allowing for smoother starts of works. Additional optimizations can be done, like graph pre-rendering for the 0 time frame (not sure if this is in fact an optimization, could even be slower, but theoretically it would optimize things), but this sounds good enough on first blush to leave it as-is for the time being.
- Moves
Maybe'
to separate package.
- A new
MediaElement
node for playing back from audio and video elements.
- More instances for
Maybe'
likeTraversable
,Foldable
, etc.
- Uses rows and variants for most important types, reducing the need for pattern matching on instances. Duck typing is important when the environment changes, as tags on tagged unions do not transfer from environment to environment.
- Treat FFIAudioSnapshot as a blob.
- Looping scene now allows for the adding of a residual monoid.
- removes unused libs, codegen & tests
- splits
decodeAudioBufferFromUri
into two separate functions and changes the signature from Promise to Aff.
- upgrades to
arraybuffer
12.0.0 to avoid breaking polyfill.
- returns correct value from filter in
Interpret.js
.
- adds a hack that spews 0s to a context.
- sets value instead of main for
gain
.
- resume and state method for audio context.
- better error logging when the decoding of audio files goes South.
- nubs the input of tumultuous graphs so that one input can be used multiple times.
- updates tumult when connection and tag holds constant but unit changes.
- adds tumult command for dynamic subgraphs.
- adds subgraph command.
- fixes
onOff
logic in generators, which would cause clipping in certain instances.
- from template no longer exists and should be replaced with subgraph.
- updates
purescript-event
- fixes
bufferToList
's callback function, which had an erroneous unsubscribe.
- upgrades essential libraries.
modifyRes
no longer requires audio interpret constraint.
- All generators are now disconnected only after stopping, avoiding abrupt disconnects and pops.
- Buffer offset is now changeable on PlayBuf instead of LoopBuf.
- Graphs are now rows.
Bind
andMonad
instances forIxWAG
where the graphs are equal.
stop()
on generators is now sensitive toAudioParamter
offset.- all read-only properties of
BrowserAudioBuffer
are now accessible
- Assets, environment and polls have been merged into just environment.
AudioWorkletNode
AnalyserNode
- type-safe asset cache. This is a breaking change!
Scene
,Frame
,WAG
andIxWAG
all take anasset
type with the current asset cache and fail the build if it is not coherent with the asset being used (ie if a buffer or recorder is used that is not in the cache).
- there were missing transitive dependencies that a newer version of
spago
failed the build for. These are now added to the relevant.dhall
files.
- the vector iterator in
fromTemplate
was backwards, leading to backwards-sounding music. This is now fixed!
- hints of a graph can now include be derived from a tuple were the graph is in the functorial position.
- outputs diagnostic info on rendering deadlines.
- passes headroom in seconds to
BehavingScene
.
fromTemplate
now works on row types in addition to sized vectors.
- unnamed units are now possible in create and change commands. When they exist, a name will be chosen by the compiler. The compiler tries to optimize for maximal reuse of audio units to avoid disjunction.
startUsingWithHint
allows the quick bootstrapping of audio graphs at the beginning of a scene for instances where a fully-determined graph type is not present but a term or function producing that graph is.
startUsing
allows the quick bootstrapping of audio graphs at the beginning of a scene.
BehavingScene
is now a newtype implementingNewtype
. This allows it to be used in typeclass instance definitions.
- Microphones, buffers, float arrays, wavetables and recorders are now polls instead of static objects. This means that it is possible to make and use new buffers mid-flight! Note that this is a breaking change, meaning that all microphones, buffers, float arrays, wavetables and recorders will need to become polls. This can be done by prepending existing ones with
pure
. - The
active
field no longer exists onBehavingScene
. Instead, the event is aMaybe
, withNothing
representing an inactive state. This is also a breaking change.
- Type-level
CreateT
now can handleAudioParameter OnOff
.
- Make
OnOff
anAudioParameter
, which allows for more fine-grained starting and stopping in situations with loops.
CreateT
andChangeT
types now allow one to do type-level operations on audio graphs without constructing terms on the JS level, saving up to a millisecond in rendering time depending on the size and complexity of the graphs being used.
- Typeclasses for
create
andchange
no longer usehfoldlWithIndex
.
- By popular demand, adds a looping piecewise function.
- Changes
sysTime
fromInstant
toMilliseconds
for easier testing in repl.
- Simplifies
change
instructions. Now, instead of writing{ sinOsc: sinOsc_ 440.0 }
it is possible to write{ sinOsc: 440.0 }
. - Speeds up rendering by avoiding unnecessary checks.
- The
Optional
files are now split betweenCreate
andChange
. This fixes many bugs where a default parameter in aCreate
accidentally modulated a value during aChange
. Now, theChange
default isNothing
, meaning nothing changes. Furthermore, the underscore syntax (sinOsc_
) has been removed.
- Audio parameter now has functor, apply, applicative, bind, monad, semigroup and monoid instances.
- Utility functions for working with audio parameters.
- Inlined periodic wave definitions.
- Several functions for working with cofree comonads whose functor varies over time.
- Math functions for working with interpolation.
- Eliminates
iwag
andwag
functions in favor oficont
.
- An
icont
function for easier continuations using indexed monads.
- Eliminates custom
do
binding in favor ofIx.do
. - Simplifies several signatures and conventions.
- Eliminates reflection of
proof
on the term level. - Reduces code base size by ~15%.
- A new
forceSet
parameter allows for parameters to be set irrespective of what the previous value was. This eliminates clicks in some situations.
- A new
patch
function allows for the automatic creation, connection, disconnection and destruction of audio units.
- Some bugs in
Interpret.js
caused audio generators to be initialized incorrectly in certain cases when resuming playback. These are fixed.
- Uses
cancelScheduledValues
to cancel future values for an audio parameter.
- New instances for audio parameter make doing math with them easier.
- Makes validation of audio graphs optional in
makeScene
. As audio graphs are already validated as they are built, the extra validation step inmakeScene
mostly catches corner cases. By making validation optional inmakeScene
, projects with complex graphs compile ~100x faster and can opt into validation when needed.
- Audio graphs no longer have additional validation by default. Validation is now opt-in.
- Uses extensible records to represent audio graphs.
- Simplifies many function signatures.
- Setting the time of a delay would cause an error due to a misspelled property name. This is now fixed.
- Returns an object from
change
,changeAt
,changes
andchange'
that reflects the changed audio unit. Previously, these functions had returnedUnit
(akin toset
in many libraries), whereas now they return an updated value (akin tomodify
). - Adds an
asGetter
function to transform any graph into a getter. Onchange
, this will get the previous values instead of modifying them. - Adds a
get
family of functions,get
,getAt
,gets
andget'
that work exactly like their analogue from thechange
family of functions but act as getters by usingasGetter
internally. Importantly, theget
family of functions does not increment the change bit.
- Uses strings instead of symbols for setting buffered content. This is a breaking change that moves buffers conceptually closer to other generators. For example, in a sine-wave oscillator, a frequency that changes over time determines what one hears. In a buffer, the buffered audio can be thought of in the same way: it can change over time. That said, changing buffers mid-flight leads to glitchy sound, so the change only takes effect once the buffer is off.
- Uses strings instead of symbols for setting the real and imaginary parts of periodic oscillators (see above).
- Pulls in correct bower.json packages for compatibility with projects that do not use spago.
- Adds a bower.json file for publishing to Pursuit.
- Exposes the WebAudio API via a FRP Poll by using induction on existentially-quantified and linearly-typed indexed cofree comonads.
- A README.
- A CHANGELOG.
- Several tests.
- Several examples.