Releases: nnirror/facet
v1.5.1
The following changes are in v1.5.1:
- Fixes a bug introduced in 1.5.0 where panning across channels would not be consistent during BPM changes
- Adds new
dirsamp()
method for dynamic sample selection in a directory - Adds arguments for controlling whether or not to fade chunks in
mutechunks()
andrechunk()
- Fixes a bug in
rechunk()
where if the pattern's data was not a multiple of chunks, the resulting number of chunks could be incorrect or contain zeros.
v1.5.0
- SoX is no longer used in Facet. Previously SoX was a hard dependency, hence the minor version number increase.
- Audio panning now happens in the browser and can dynamically pan signals across any number of channels. So you can send multi-channel audio from the browser to a DAW or a modular synth!
- Due to SoX being removed, the
saveas()
method only saves monophonic wav files. - Due to SoX being removed, the
stitchdir()
method has also been removed. (This command was really more of a shorthand way to run a SoX command being the scenes, and isn't worth the trouble of having SoX as a hard dependency)
v1.4.2
v1.4.2 has the following new method:
over( n )
: distributes all the events that a FacetPattern would fire overn
loops, so the pattern can last any number of loops before regenerating. Works with audio playback, MIDI note/cc/pitchbend, and OSC.
v1.4.2 also has the following improvement:
- a more efficient implementation of processing MIDI chord logic in real-time.
And v1.4.2 has the following bug fix:
- previously,
jam()
had prevented randomization of values that were 0.
v1.4.0
v1.4.0 has the following new methods:
savemidi()
for saving patterns as MIDI filessavemidi2d()
for saving 2d patterns as MIDI files
And the following updates:
- the
circle2d()
method, withfill_mode = 0
, will always return a line that is 1px wide. - the host server that the server is running on has been made into a configuration variable, making it possible to deploy beyond localhost to other servers.
v1.4.0 requires an npm update
to pull the new midi-writer-js
package.
v1.3.1
The following changes were made in v1.3.1:
- replaced
every()
withwhenmod()
(borrowing from the tidal function's name), allowing for more precise control over when to regenerate patterns. - added tuning utility functions that return arrays of tuning ratios:
just()
,pythagorean()
,equaltemp()
,meantone()
,edo19()
,edo31()
. - fixed a bug to ensure playback of new audio patterns begins at the start of the next loop.
- fixed a bug where manual BPM changes in the browser would potentially cause some audio playback events to skip.
v1.3.0
In v1.3.0, only the browser can play audio patterns synthesized with Facet.
The browser audio playback feature was added in v1.1.0, and after using it more and more, I found that I preferred it over Max for several reasons:
- No need to open another program, simplifying start-up.
- Ease of working with arbitrarily many voices in the browser (in Max, I had hard-coded the number of voices to 16, and voice management had become a bit complicated and started to feel like tech debt.)
- The second argument to the
play()
method in v1.2.5 works only with the browser, not with Max. It was very quick and easy to add this feature to the browser, which was a "sign" to me that I should focus on browser audio. - This is a guess, but I don't think anyone is using the Max object for audio playback.
The facet
Max object has been simplified into a simple UDP server to receive OSC messages from Facet. All the other Max objects and Max for Live abstractions have been deleted.
v1.2.5
v1.2.2
The following method was added in v1.2.2:
markov()
: modifies a FacetPattern using a Markov chain for probability-weighted transitions.
The following methods were updated:
circle2d()
: - added "fill mode" argument controlling whether to fill the entire shape in or only draw its outline; default is no fill.tri2d()
: - added "fill mode" argument controlling whether to fill the entire shape in or only draw its outline; default is no fill.rect2d()
: - added "fill mode" argument controlling whether to fill the entire shape in or only draw its outline; default is no fill.
v1.2.1
The following methods were added in v1.2.1:
spectral()
: applies a spectral transformation to a pattern, treating it as if it were a 2d spectrogram and applying an Inverse Fourier Fast Transform (IFFT). This allows you to generate, interpret, and resynthesize a frequency-domain representation into sound.slices2d()
: slices a pattern into n 2-dimensional slices and run code on each 2d slice individually.grow2d()
: applies a growth algorithm to the FacetPattern in 2D space. The algorithm iterates over each "pixel" in the pattern and, based on probability, spreads its value to adjacent pixels.draw2d()
: draws a polygon on the FacetPattern using the provided coordinates and fill value. The polygon is drawn by connecting each pair of consecutive points in the coordinates array with a line filled with the fill value.decide()
: randomly decides between 1 or 0, shorthand forchoose([0,1])
.
The following methods were modified:
fgate()
(added invert mode)savespectrogram()
(renamed)saveimg()
(removed width/height arguments)layer2d()
(removed width/height arguments)shift2d()
(removed width/height arguments)circle2d()
(removed width/height arguments)rect2d()
(removed width/height arguments)tri2d()
(removed width/height arguments)palindrome2d()
(removed width/height arguments; rewrote)walk2d()
(removed width/height arguments)warp2d()
(removed width/height arguments)delay2d()
(removed width/height arguments)rotate()
(removed width/height arguments)