Releases: nnirror/facet
v1.5.4
Here are the updates in v1.5.4:
-
The README file now has js code for blocks every method, for improved legibility and copy/pasting.
-
There were also several bug fixes:
note()
method's position argument is working as expectedstutter()
was refactored and simplified to retain pitch of the input patterndirsamp()
was fixed to address a bug where it would never find a sample if the lookup value was == 1.
- Oscillator methods no longer have a
sampleRate
argument, which was probably overkill to include to begin with:cosine()
,phasor()
,rect()
,sine()
,circle()
,square()
,tri()
v1.5.3
Facet v1.5.3 number inputs and a new code method for time signature control and metric modulation.
There are two new number inputs in the user interface at the bottom near the BPM control: time signature numerator
and time signature denominator
.
There is also a new time()
method which allows for dynamic control of the time signature with patterns.
More information is in the README.
v1.5.2
v1.5.2 focused on improvements to saving and retrieving patterns at three different levels of scale:
- Internal patterns accessible during the generation of a FacetPattern, via new methods
setlocal()
andgetlocal()
. - Global patterns via improved
set()
method. - Creating and continually modifying patterns each loop in a process, via new
drift()
method, where the coder can specify the changes to apply to the pattern each loop.
Bug fixes / improvements:
- improved implementation of
walk()
method. In its previous implementation, it would tend to converge onto a single value from the pattern if run recursively.
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.