Skip to content

Tags

Tags give the ability to mark specific points in history as being important
  • v0.4.6
    saugns v0.4.6. Added `R` flag `p` for 1D Perlin noise modes.
    
    Language changes:
     * Signal generator types. `R` mode `m` flags:
       - Add `p` (Perlin noise mode) to reshape the waveform for
         1D Perlin noise, combinable with all noise functions and
         other flags.
       - Change updating of flags when adjusting mode; now every
         flag set is kept until setting a function, which clears
         old flags. Before, any change to mode cleared old flags.
         (Makes especially the use of parameter `.a` less clunky.)
         Also fix `m.a... ma`, now handled like `ma.a...`.
     * Line types.
        - Add `smo` (Smoothstep degree 5),
          a sinuous curve traditionally used for Perlin noise.
     * Seed parameter. Make `s` recognize the same numerical
       constants as `p` (phase), currently `G`.
  • v0.4.5
    saugns v0.4.5. Added self-PM/"feedback FM". New 'R' mode 'a'.
    
    Language changes:
     * Add `p.a` amplitude feedback parameter for phase,
       for phase self-modulation. Accepts both sweep and
       modulators within `[]`. Default value is 0.0.
     * Signal generator types. `R` mode `m` noise functions:
       - Add `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.
       - Rename `r` (uniform random, default) to `u`.
       - Seeds for all modes not using the `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.
     * Numerical expressions. Changes to mathematical functions:
       - Add `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.
       - Add `arhf(x)`, additive recurrence higher frequency.
         Like `arbf(x)`, but for the closest new frequency above
         the unshifted base frequency, instead of below it.
       - Add `sgn(x)`, which returns the sign of `x` as +/- 1
         or 0. (The sign bit is also preserved for 0.)
       - Remove deprecated `seed(x)` function replaced by `$seed`.
     * Seedable common parameters. Add `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.
    
    This self-PM support requries, to preserve the performance
    when not using the feature, twice as much code for both the
    `W` and `R` implementations. Self-modulation typically takes
    at least 3 times more CPU time, sometimes more than 4 times.
    (Self-modulation precludes use of vectorizing optimations.)
    
    The parameter range uses the simplest scaling possible, like
    multiplying the value by pi. This maps 1.0 to Yamaha feedback
    level 6 in their chips. To avoid excessive ringing at that
    level, stronger filtering than Yamaha used is used: 1-zero
    (their choice) combined with 1-pole (itself a little better
    at dampening self-oscillations than a 1-zero filter alone).
  • v0.4.4d
    saugns v0.4.4d. Another minor parsing bugfix. Refactoring.
    
    Fix parsing bugs for (still undocumented) `{}` grouping.
    Refactor scope handling in parser, extend arrtype module.
    
    "Random segments oscillator" has been renamed to
    "Rumble oscillator, a.k.a. random line segments oscillator"
    in the documentation.
  • v0.4.4c
    saugns v0.4.4c. Minor parsing bugfix. Refactoring.
    
    Language changes:
     * Nesting syntax.
        - Fix parsing of num. expr. namespace for "Y" in `[X][Y]`;
          for any "X" object params, "Y" sweep namespace was lost.
        - Change undocumented generic `<...>` nesting, to `{...}`.
     * Sweep syntax. Remove deprecated support for params in `{}`.
    
    Rebased down modulator list `-` and concat, and sweep and list
    unification, to v0.2.x (modified sgensys versions pre-saugns).
    Logs kept while scripts in branch have one less syntax change.
    
    Changes in naming and code style built up, working through the
    versions. The new code is tidied similar to old rebasing work.
    Outside the parser, refactoring and more cover some more code.
  • v0.4.4b
    saugns v0.4.4b. Turn PRNG seed into cli-settable variable.
    
    Language changes:
     * Numerical expressions. Replace `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.]
    
    Improve usage warnings on failed `$?name`, `$?name=...` check.
    
    Old scripts can usually be updated with one of the below regex
    options -- the 2nd will use `?=` assignment to allow override.
    
    `perl -pi -e "s/\\/seed/\\\$seed=/g;" paths...`
    `perl -pi -e "s/\\/seed/\\\$seed\\?=/g;" paths...`
  • v0.4.4
    saugns v0.4.4. Cli and variable feature expansion.
    
    Command-line options:
     * Add "variable=value" option, to set variables and pass them
       to scripts. Each variable is passed as `$variable`, and the
       name must be valid for use as a SAU variable. Each value is
       restricted to only a number which may have a decimal point.
     * Make `-e` apply only to scripts after, not to every script.
    
    Language changes:
     * Variable syntax.
        - Change numerical variable assignment syntax to use a `$`
          as leading character: `$name=...`, unlike object labels.
          [Add backward-compatibility deprecated alias, `'name=`.]
        - Labels (`'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.
        - Add `?=` 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.
        - Add `$?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 cli option and SAU `?=` syntax work together, to allow
    passing named, numerical arguments to a script. A script makes
    predefining a value optional by using `?=` to set its default.
    Using `$?name` requires that `name` be passed, used by itself.
    
    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...`
  • v0.4.3
    saugns v0.4.3. Add 'N' noise generator. Small redesign steps.
    
    Language changes:
     * Add generator type `N` (Noise generator), a plain
       noise generator without any frequency parameters.
       It has the underlying noise types of `R` and red.
     * Variable syntax. Relax rules for use of numerical
       variable `=`, allow whitespace after `=`, and not
       only before it. This behavior is less surprising.
     * Allow `[]` list unconnected to any parameter. Its
       objects are held unused. More language constructs
       are needed to use the free list, or its contents.
     * Amplitude handling. Add `S a.m`, script-wide gain
       mix control in outermost scope. Replaces the role
       of `S a` in disabling auto-downscaling by voices.
    
    Parser redesign:
     * Turn lists into a main type, for two with the old
       audio "operator". Create objects, do type checks.
     * Make parseconv a utility header the parser simply
       uses. Simplify memory handling & code structures.
    
    Fix some parser warnings wrongly numbering position.
  • v0.4.2d
    saugns v0.4.2d. Various fixes. Beginning of new redesign.
    
    Language changes:
     * Channel mixing. Fix combination of `c[]` modulation
       and non-swept non-center values; e.g. `cL[...]` now
       is at left compared to `cC[...]`, before it wasn't.
    
    Fix minor bugs in parser timing code:
     * Make time `td` default time work properly
       for modulators; it (from v0.3.11c) always
       used to change to implicit time for them.
     * Fix bug causing default times to end up
       too short in a few situations; cleanup.
    
    Parser redesign:
     * Make postparse code in parser run once
       per durgroup just after it, not at end
       of script. Adjust, simplify time code.
       Preparation for further time redesign.
     * Move voice number allocation to parser
       from parseconv. Don't fix a number for
       each carrier, allow their renumbering.
       This made voices number optimally low.
    
    Add `CHANGELOG.md` based on tag messages and the website,
    with a few additions for clarity on parts of the history.
    
    A few scripts may now count as having fewer voices and
    consequently play louder, if auto-scaling of amplitude
    is used. One example being, `'a W cL| 'b W cR| @a t1`.
  • v0.4.2c
    saugns v0.4.2c. Add quartertone pitch names, add JI systems.
    
    Language changes:
     * Frequencies as notes.
        - Add flat 'b' alias ('f' still supported).
        - Add half-flat 'd' and half-sharp 'z'.
        - Add flat-and-a-half 'v' and sharp-and-a-half 'k'.
        - Add double-flat 'w' and double-sharp 'x'.
        - Add "S f.s" tuning systems 'c' (classic
          5-limit JI) and 'p' (Pythagorean 3-limit JI).
    
    Revise and extend frequency as note further.
    Extend default 12TET-based options to 24TET;
    use the 7-factor quartertone for JI tunings.
    
    (JI is short for just intonation.)
    
    Add a classic 5-limit JI 'c' mode with sharp
    and flat always the same size unlike in 'j'.
    Also add Pythagorean tuning system mode 'p'.
  • v0.4.2b
    saugns v0.4.2b. Allow "[X][Y]" to "[X Y]" concat.
    
    Language changes:
     * Modulator list syntax. Writing two or more lists in
       direct succession now concatenates their contents.
    
    Minor feature addition which is backward-compatible.
    
    Other than that, this is a clean-up release, removing
    obsolete and misleading looping in generator.c, and
    trimming obsolete code in parser.c.
  • v0.4.2
    saugns v0.4.2. Unify sweep syntax & reworked modulator list.
    
    Language changes:
     * Sweep syntax. The subparameters are now enclosed in
       a "[]" 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.
     * Modulator list syntax. Assigning modulators in
       a "[]" 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 "-[".
     * Channel mixing. Add support for "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...
  • v0.4.1
    saugns v0.4.1. Wave type overhaul. More line types, 'R' modes.
    
    Language changes:
     * Signal generator types. Add 'R' mode 'm' flags
       'h' (half-shape waveform, for sawtooth-like waves) and
       'z' (zig-zag flip, adds jaggedness with randomness).
     * Wave types. Rework into collection of 'sin',
       3 x 3 complementary types, and 2 extras.
        - Add 'par' and 'mto' –- with 'saw', all-harmonics trio.
        - Add 'ean', 'cat', and 'eto' –- even-harmonics trio.
        - Rename 'ahs' to 'spa' (sine parabola),
          adjust phase offset to match other wave types.
        - Rename 'hrs' to 'hsi' (half-rectified sine),
          adjust phase offset to match other wave types.
        - Remove 'ssr', little-used all-harmonics wave type.
        - Make 'saw' decreasing instead of increasing to match
          other types; flip amplitude or frequency for increasing.
     * Line types.
        - Add 'sqe' (square polynomial envelope),
          a softer alternative to 'xpe'.
        - Add 'cub' (cubic polynomial segment),
          with steep ends and a flat middle.
     * Frequencies as notes.
       - Change tuning system to 12TET, adding a new 'S f.s'
         toggle with the previous justly intoned scale as the
         other option ('j' value).
       - Don't treat 'Cf4' as belonging to the octave above 'C4'
         (2011 behavior), instead change default octave for 'Cf'
         to 5 when using key 'C'.
       - Add key-changing option 'S f.k', for handling of default
         and relative octave numbers (and rotating the microtonal
         small letter scale).
     * Variable syntax. Allow an optional letter for parameter
       namespace for an expression after numerical "=",
       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.
     * Nesting syntax. Re-add undocumented generic '<...>',
       useful for wrapping around use of 'S'. (Removed v0.3.12.)
    
    Old scripts using 'Wssr' will no longer work as expected;
    if that wave type is wanted, it could be re-added later.
    Most other old scripts will produce equivalent results after
    adjusting 'saw' uses, and adjusting phase 'p' for and
    renaming the old 'hrs' and 'ahs'.
  • v0.4.0d
    saugns v0.4.0d. x86-64 clang builds fix. Add 2 line types.
    
    Language changes:
     * Line types.
       - Add 'nhl' (noise hump line)
         -- a medium line-plus-noise type.
       - Add 'ncl' (noise camel line)
         -- a softer line-plus-noise type.
    
    Fix clang x86-64 build bug, which broke audio
    for 'R mt' and 'R mvb' in scripts in v0.4.0x.
    Did not affect x86 clang, x86-64 gcc, builds.
    Issue #4 on Codeberg has more information:
    https://codeberg.org/sau/saugns/issues/4
    
    Split out COPYING.LESSER from COPYING
    so that automated license listings on
    various websites work with this repo.
  • v0.4.0c
    saugns v0.4.0c. Some further noise feature additions.
    
    Language changes:
     * Signal generator types. Add 'R' mode 'm' flag 'v'
       -- to select from a set of violet noise functions
       instead of white noise functions, when available.
       (Currently missing for the 'g' and 't' functions.)
     * Line types. Add '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).
    
    Fix a minor parsing bug for unary sign without
    surrounding parentheses, causing bogus warning
    in scripts about missing whitespace afterward.
    
    Add, update, replace some 'R' example scripts.
    The new versions match the new online examples
    found at <https://sau.frama.io/examples.html>.
  • v0.4.0b
    saugns v0.4.0b. Small usability tweaks.
    
    Language changes:
     * Allow 'R' without initial line type (default 'cos').
     * Allow 'W' without initial wave type (default 'sin').
    
    Change Makefile install and uninstall targets
    to check whether a "share/examples" directory
    exists; if not, place the example files under
    "share/saugns/examples" (more common on Linux
    distros) rather than "share/examples/saugns".
    
    Tweak cli code to use stdout, not stderr, for
    -h (help) and -V (version) options.
  • v0.4.0
    saugns v0.4.0. Add 'R' random segments generator.
    
    Language changes:
     * Rename generator type 'O' to 'W'.
       [Add backward-compatibility deprecated alias.]
     * Add generator type 'R' (Random segments generator).
       It shares most parameters with type 'W'.
     * Rename sweep subparameter 'r' to 'l' (line fill type).
       [Add backward-compatibility deprecated alias.]
    
    Also, new example scripts actually worth
    listening to (much more so than the old).
    
    The design is minimally adjusted in this version;
    the main thing is that there's now a full-featured
    second audio generator available. More OO redesign
    will be done for adding further generator types.
    
    The "N" noise generator in the 2023-01 "mgensys"
    version ('old-dev_202301' git branch) is still
    left to bring into this main branch/program,
    but everything else of value is available,
    in a better, more polished program.
  • v0.3.12
    saugns v0.3.12. Fixes. New SAU features. Split lib.
    
    On 32-bit x86 systems, fix PM bug: use llrintf() on
    phase values meant to wrap around, not lrintf(), to
    make large phase values work properly. This audible
    2018 bug embarrassingly goes back to saugns v0.3.0.
    Didn't affect any 64-bit platform with 64-bit long.
    
    Also fix possible crashes for some odd sample rates
    in some cases. and small divergences in the output.
    Was due to an unrelated error in time/buffer logic,
    which however appeared with the same v0.3.0 change.
    
    Add cli -v verbose option (renaming version to -V).
    
    This change splits out a static library under sau/.
    
    AM/RM and FM.
     * Support lists directly under "a", "f", and "r",
       as in "a[]" (AM/RM) and "f[]", "r[]" (FM).
       Modulators in such lists have the output added
       directly to the parameter value. Can be used
       together with the older value range feature,
       and the effect is then added on top of that.
    
    Script options.
     * Make the "S" options lexically scoped,
       restoring the older values from outside
       a "[]" list when the list is exited.
     * Apply the "S a" amplitude multiplier set
       inside a "[]" list to any modulators which
       follow at the same list level. Previously
       it was 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.
     * Rename "S" option "n" to "f,n".
    
    Ramp syntax.
     * Rename ramp "hold" to "sah" (sample and hold).
     * Rename ramp "sin" back to "cos".
    
    Variable syntax.
     * Add "'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.)
     * Add "$name" expression, for using a variable
       in a numerical expression.
    
    Numerical expressions.
     * In numbers, if a decimal '.' is used, require
       digit(s) after. A trailing 0 can no longer be
       skipped but a leading 0 can still be skipped.
       (E.g. 0, 0.0, and .0 are all fine, 0. isn't.)
    
    Subnames.
     * Modulation with value range now uses e.g.
       "a.r", "f.r", rather than "a,w", "f,w".
     * Frequency-amplified PM uses "p.f", was "p,f".
  • v0.3.11c
    ac988365 · Set version to v0.3.11c. ·
    saugns v0.3.11c. More flexible value ramp usage.
    
    Syntax changes:
     * Add special value for main time 't'
       parameter with literal 'd' in place
       of the '*' feature v0.3.10 removed.
     * Ramp '{...}' and its subparameters:
       - Allow ordinary value, and/or subvalues in "{...}",
         and/or modulator list, in one go, where available.
         They can only be written in that particular order.
       - Add 'v' (start value), as alias for the ordinary
         value before the '{}'; allow use of one of them.
    
    Allow setting just any one subvalue, or any combination,
    within '{...}'. 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.
    
    Also includes a very small audio generation performance
    improvement, and an expansion of symtab code for later.
    
    Add -v verbose option, rename version to -V.
    Currently it prints which script is playing.
    
    Update documentation for website move to
    <https://sau.frama.io>. (The older pages
    redirect to the newer.)
  • v0.3.11b
    5d05112b · Set version to v0.3.11b. ·
    saugns v0.3.11b. Further syntax tweaks. Small fixes.
    
    Syntax changes:
     * For modulation with value range, change delimiters
       between the parts from "Xw,Y[...]" to "X,wY[...]".
     * For frequency-amplified PM, ',' added before 'f['.
     * Allow numerical expressions to omit "*" after ")",
       not only before "(", for shorthand multiplication.
    
    There is no longer any need to sometimes place named
    constants in parentheses to separate them from added
    "w" or "f" after, as "," is now placed between them.
    
    Reduce rounding error for numbers read from scripts.
    Precision improved from a little better than single,
    to just below double. Practically, the difference is
    small, since output from the parser is still reduced
    to single precision after the numerical expressions.
  • v0.3.11
    0c48e67e · Set version to v0.3.11. ·
    saugns v0.3.11. Fixes, cli features, syntax tweaks & more.
    
    Adjust default time behavior, document lengthening
    based on time of nested objects. Some smaller bugs
    remain, a further redesign needed. But fix two for
    modulation lists combined with timing syntax (file
    'devtests/defaulttime3.sau'). Previously durations
    could lengthen past the play time based on that in
    nested lists; also, for ';'-separated (numberless,
    older syntax) sub-steps, gaps mistakenly produced.
    
    This also includes a bugfix for a timing
    issue added in v0.3.10b. A one-line bug,
    in a new time conversion function (added
    close to that release) made longer times
    roll over and become too short. (Example
    scripts had too short "t"s to catch it.)
    
    Syntax changes:
     * Rename '\' with number to ';' with number. The same use.
     * Newlines in the top scope will no longer end the current
       step, handling now becoming more regular and permissive.
       (Previously, an exception to the rule was new sub-steps,
       allowed on the line after a linebreak. '\' was different
       and not included in that exception. Now top and subscope
       handling is more similar and should be less surprising.)
     * For modulation with value range, change delimiters
       between the parts from "X,Y~[...]" to "Xw,Y[...]".
     * For phase modulation (normal, frequency-amplified)
       remove "+" after "p" and place to set phase value.
     * Ramp '{...}' sub-parameters:
        - Rename 'v' to 'g' (goal).
        - Rename 'c' to 'r' (ramp).
     * Rename ramp 'cos' to 'sin' (sinuous curve). It's
       maybe more intuitive. Also use a new polynomial,
       producing a reasonably high-fidelity sine curve.
     * Numerical expressions:
        - Allow number signs and arithmetic operations
          (full expressions) outside parentheses, with
          any whitespace ending the expression. Undoes
          a change from v0.3.0, restoring old feature.
        - Make '^' right-associative.
        - Add '%' remainder parsed similar to division.
        - Add functions:
           + sin(x), cos(x)
           + rand(), seed(x), time()
           + rint(x)
        - Add constants:
           + mf, pi
    
    Old scripts can be converted to the new syntax
    using in part simple search-and-replace steps:
     1. Each old '\' should become ';'.
     2. Each ',' should become 'w,'; if
        there's a new 'w,' before a '~'
        the '~' should be removed, else
        it should be replaced with 'w'.
     3. Each '+[' should become '[' and
        every '+f[' should become 'f['.
     4. Each 'v' inside a '{...}'
        should be changed to 'g'.
     5. For ramp arguments 'cexp', 'clog', etc.,
        replace string with 'rexp', 'rlog', etc.
        Except for 'ccos', which becomes 'rsin'.
    
    A smaller change included is that the 'O f'
    and 'S n' default values are now 440. Seems
    less awkward than the older, whimsical 444.
    
    Add '--mono' and '--stdout' cli options.
    Also support '-o -' audio to stdout with
    AU format header. (Unlike WAV, AU always
    allows headers without a known length. A
    file written with a name (not using '-')
    is still written as a WAV file however.)