Versions of and change logs for the saugns program and SAU language. The history page has a more broad and big-picture description, which also goes back before the tagged versions from 2019 and later.
The CHANGELOG included with saugns covers all tagged versions. Below, links for tags and a log focused only on the SAU language can be found.
The git tag message for most versions has text like that in the CHANGELOG for the version.
Viewing the full source difference between versions is easier with the command-line git tool than the web interfaces, as in git diff old-version new-version
. (See the project on Codeberg – git clone https://codeberg.org/sau/saugns.git
– or the main page for the project mirrors.)
Source archives of the versions for non-git users can be downloaded at Codeberg. Each version link below is for one of the tag messages at Framagit; download options can also be found on that page.
Below is a shorter list of only changes that impact how scripts in the language are written – changes which often affect what's covered on this website. It may be updated ahead of new versions being tagged (see "stable branch" below). For fuller change notes for the saugns program, instead read its CHANGELOG.
This listing of changes is not completely exhaustive; some bugfixes, changes to undocumented behavior, and other small details affecting some possible scripts may go unlisted. The oldest tagged version v0.3.0 is compared to the historical (last 2012) sgensys-20120401.tgz version.
a
(amplitude) and f
/r
(frequency) parameters. The new long-form syntax (value[A]..value[B].r[C].a[D]
, where A, B, C, and D are modulator list contents) allows modulators (A and B) whose outputs are added to the endpoints (first value, second value) prior to using range mapping modulators (C) to pick values in the range, in addition to modulators with outputs added after (D). The old, now short-form, syntax (value[D].rvalue[C]
) is kept unchanged.p
and its frequency-scaled PM subparameter p.f
, where range-mapping doesn't make sense. This means it's now supported for c
(channel mixing) and for self-PM p.a
as well.A
(Amplitude generator), for sweepable amplitude offsets i.e. DC offsets, plus adding and/or multiplying its AM modulators.M0
to M127
where M69
by default corresponds to 440 Hz). All tuning systems are supported, but for just intoned notes, numbers which don't map to any natural note get the average of the two surrounding ones. Other options include flats and sharps (which for a just note are never exactly between two notes) like for C-D-E-F-G-A-B notes.Fix modulators using the r
frequency ratio a.k.a. relative frequency parameter, when linked to a carrier of type A
or N
(which have no frequency parameter). This used to behave as if the latter had a frequency of 1 Hz set. Now the behavior is as if the A
or N
didn't exist, so that only the object using r
and any other carriers for it are considered. If there's no such other carrier, r
can't be used, just like it can't for a top-level carrier.
R
mode m
flags:p
(Perlin noise mode) to reshape the waveform for 1D Perlin noise, combinable with all noise functions and other flags..a
less clunky.) Also fix m.a... ma
, now handled like ma.a...
.smo
(Smoothstep degree 5), a sinuous curve traditionally used for Perlin noise.s
recognize the same numerical constants as p
(phase), currently G
.p.a
phase amplitude feedback parameter, for phase self-modulation. (This is more generally referred to as "feedback FM" as that's how 1980s synths label it.) Accepts both sweep and modulators within []
. Default value is 0.0.R
mode m
noise functions:a
(additive recurrence, low-discrepancy a.k.a. quasirandom sequence) by default based on the golden ratio. Add mode subparameter m.a
for changing the multiplier used to the fractional part of a number.r
(uniform random, default) to u
.h
flag now differ. Keep the highest bit from the internal 32-bit seed, sacrifice the lowest bit (odd vs. even line segment) as phase extends a bit to take over its role instead.arbf(x)
, additive recurrence base frequency. Returns a multiplier for how much the pitch will change for an R
instance when x is set to R ma.a
. The value may be negative, corresponding to direction in a sawtooth-like wave which rises rather than falls.arhf(x)
, additive recurrence higher frequency. Like arbf(x)
, but for the closest new frequency above the unshifted base frequency, instead of below it.sgn(x)
, which returns the sign of x as ± 1 or 0. (The sign bit is also preserved for 0.)seed(x)
function replaced by $seed
.s
common to N
and R
, for overriding the default seed (assigned to new instances based on the $seed
variable and a random sequence derived from it). s
takes a value modulo 1.0 as the percentage of the state space, so s0
means beginning, 0.$
as leading character: $name=...
, unlike object labels (which still use 'name
).'name
, @name
) and variables ($name
) won't conflict if they have the same name any longer. Now they are separate rather than one dynamically typed variable.?=
non-overriding numerical assignment; only takes effect for a variable that doesn't hold a number. Has no side effects when skipping evaluation of the expression.$?name
construct warning when a numerical variable isn't already set to a number. Can be used by itself, or combined with assignment ($?name=...
) to also do ?=
. If used by itself, the script won't run on failed check.The new options for assigning numerical variables are meant to be used with a new variable=value
command-line option, which allows passing values to scripts, optional or required, scripts possibly supplying fallback values.
Add backward-compatibility deprecated alias, 'name=
.
Old scripts can be updated to use the newer assignment syntax,
without any manual adjustment, using regex search-and-replace:
perl -pi -e "s/'([A-Za-z0-9_]+\\s*)=/\\$\\1=/g;" paths...
seed(x)
with $seed
magic variable, which composes with the non-overriding assignment feature for simple cli setting and script handling of seed.Add backward-compatibility deprecated seed(x)
function.
[X][Y]
list expressions, where the first part references another object (audio generator) and the second part tries to use an outer parameter namespace-specific constant to set a sweep subparameter value. Now such constants are recognized.{}
around sweep subparameters.<...>
nesting to {...}
.Fix parsing bug for undocumented {...}
grouping syntax.
N
(Noise generator), a plain noise generator without any frequency parameters. It has the underlying noise types of R
, and red (re
).=
, allow whitespace after =
, and not only before it. This behavior is less surprising.[]
list unconnected to any parameter. Its objects are held unused. More language constructs are needed to use the free list, or its contents.S a.m
script-wide gain mix control in outermost scope. Replaces the role of S a
in disabling auto-downscaling by voices.Global amplitudes in unchanged scripts may sometimes be lowered by the S a
changes. The old behavior corresponds to changing each S avalue
to S avalue.m1
.
The free []
list cannot yet be used for anything, thus remains an undocumented feature until more features for it are added.
[]
list rather than in {}
. They can be placed at the beginning of a list also used to assign modulators, for assigning both in one go.[]
list to a parameter now appends the new list, instead of replacing any old items with it. To clear old items instead of appending to them, a dash can be added before the [
, as in -[
.c[]
panning-AM modulators, in addition to value sweeps. Produces a stereo placement AM-like effect that disappears on mono downmix.Most older scripts did not remove modulators by setting new lists; those that do will require adjustment. Apart from that, a perl one-liner can be used to upgrade the sweep syntax in scripts. Deprecated support for the old sweep syntax is kept in the short term.
perl -pi -e 's/{/\[/g; s/}/\]/g; s/\]\[/ /g;' paths...
This means that pre-v0.4.2 script style can be updated turning {...}[...]
into [...][...]
, if preferred.
b
alias (f
still supported).d
and half-sharp z
.v
and sharp-and-a-half k
.w
and double-sharp x
.S f.s
tuning systems c
(classic 5-limit JI) and p
(Pythagorean 3-limit JI).c[]
modulation and non-swept non-center values; e.g. cL[...]
now is at left compared to cC[...]
, before it wasn't.This version fixes a few smaller default time bugs, and makes voices always number optimally low when counted (occasionally affecting default script amplitude) too.
R
mode m
flags h
(half-shape waveform, for sawtooth-like waves) and z
(zig-zag flip, adds jaggedness with randomness).sin
, 3 × 3 complementary types, and 2 extras.par
and mto
– with saw
, forms trio of wave types with all harmonics.ean
, cat
, and eto
– forms trio of wave types with added even harmonics.ahs
to spa
(sine parabola), adjust phase offset to match other wave types.hrs
to hsi
(half-rectified sine), adjust phase offset to match other wave types.ssr
, an extra all-harmonics wave type with little use.saw
decreasing instead of increasing, to match other wave types; flip the amplitude or the frequency for the same result.sqe
(square polynomial envelope), a softer alternative to xpe
.cub
(cubic polynomial segment), with steep ends and a flat middle.S f.s
toggle with the previous justly intoned scale as the other option (j
value).Cf4
as belonging to the octave above C4
(2011 behavior), instead merely change default octave for Cf
to 5 when using key C
.S f.k
, for handling of default and relative octave numbers (and rotating the microtonal small letter scale).=
, whitespace or a math symbol between it and math value/ID. Used to allow named constants for a paramater, for channel, frequency as note, or phase.<...>
, useful for wrapping around use of S
.Old scripts using Wssr
will no longer work as expected; if that wave type is wanted, it could be re-added. Most other old scripts will produce equivalent results after adjusting saw
uses, and adjusting phase p
for and renaming the old hrs
and ahs
.
R
(Random segments generator), an oscillator-like value noise generator.O
to W
(Wave oscillator). E.g. each Osin
should change to Wsin
.r
before line shape (formerly "Ramp type") to l
. E.g. an rexp
becomes lexp
.Backward-compatibility aliases have been added so scripts with type O
, and (in the shorter term) sweep parameter r
, still work with deprecation warnings.
R
without line type (use default cos
) and W
without wave type (use default sin
).R
mode m
flag v
– for selecting from a set of violet noise functions instead of white noise functions. (Currently, violet versions of g
and t
are missing.)uwh
(uniform white noise) – makes a sweep use uniform random numbers in the start–goal range, and R
produce chunks of noise with a random amplitude and DC offset each (if using the default mode).uwh
amplitude when used for sweep.nhl
(noise hump line), a medium line-plus-noise type.ncl
(noise camel line), a softer line-plus-noise type.This version fixes a bug affecting some builds of the program (x86-64 platform with clang compiler) – this fixes the mt
and mvb
modes for the R
generator.
S
options lexically scoped, restoring the values from outside a []
list when the list is exited.S a
amplitude multiplier set inside a []
list to any modulators which follow at the same list level. Previously this value only applied to top-level carriers. Separate this particular setting at each list level, making the multipliers independent, except apply it to sublists of the new a[]
variety.S
option n
to f.n
.hold
to sah
(sample and hold).sin
back to cos
.'name=...
variation of the syntax for variable assignment, for assigning a number. Variables are now dynamically typed. (The old and other value type is reference to object.)$name
expression, for using a variable in a numerical expression..
is used, require digit(s) after. A lone trailing 0 can no longer be skipped but a lone leading 0 can still be skipped. (E.g. 0
, 0.0
, and .0
are all still fine for the number zero – but 0.
no longer is.).
-prefix instead of a ,
-prefix. Furthermore, ,w
was renamed to use the letter r
. (This means .f
instead of ,f
and .r
instead of ,w
.)<...>
.X,Y~[...]
to Xw,Y[...]
.+
after p
and place to set phase value.\number
subshift to ;number
gapshift, since the two ;
compound step syntaxes go together.v
for goal value to g
.c
before ramp name to r
.cos
to sin
(and use more accurate polynomial).%
remainder operation. Make ^
(to the power of) right-associative.cos(x)
, rand()
, rint(x)
, seed(x)
, sin(x)
, time()
.mf
, pi
.Xw,Y[...]
to X,wY[...]
.,
just before f[...]
. This is now the case for all such subparameters.*
) for expressions like (X)Y
too, not only X(Y)
.t
parameter with literal d
in place of the *
feature v0.3.10 removed.{...}
, and/or modulator list, in one go, where available. When written together they can only be written in that particular order.v
(start value), as alias for the ordinary value before the {...}
; allow use of one of them.{...}
. Changing goal before old goal is reached now updates the start/ordinary value to the point reached on the prior trajectory. What remains of an unexpired time set for a ramp will now always be the default for its time until it runs out. And a ramp shape set is kept for any new updates for the parameter.;
.)\
to /
. Remove special value with literal t
.s
silent time padding parameter with new, more flexible \
subshift syntax.|
reset, not add, delay to add for next step to prior duration.t
parameter with literal *
.G
for golden angle.p+f[...]
syntax, for frequency-linked PM.sha
to ahs
, szh
to hrs
, and ssr
to srs
.ssr
.sqr
, saw
. Use new oscillator with DPW-ish aliasing reduction.saw
increasing rather than decreasing.esd
to xpe
, and lsd
to lge
.cos
.abs(x)
, exp(x)
, log(x)
, met(x)
, sqrt(x)
.[...]
to <...>
, still only for testing and further development.P
keyword with channel mixing parameter c
and S c
default, with named constants C
, L
, R
.[...]
for testing and further development.shh
. Use rounded corner shaped sqr
, saw
. Make saw
decreasing, not increasing, by default.#
with #!
, remainder of file comment Q
with #Q
.fX f!Y[...]
change to fX,Y~[...]
.<...>
, change to inside [...]
.[...]
, change to inside {...}
.p!
, change to p+
._
.:name
changed to @name
.S a
disables it.a
(amplitude) parameter for AM and FM modulators too.r
(relative frequency).exp
to esd
, and log
to lsd
.exp
, log
, and new hold
.srs
to ssr
.sha
, szh
, shh
./*...*/
and C++-style //
comments.