Tags give the ability to mark specific points in history as being important
  • 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.)
  • v0.3.10b
    bca45593 · Set version to v0.3.10b. ·
    saugns v0.3.10b. Various fixes. Add freqlinkPM syntax.
    
    Fixes:
     * Audio: The v0.3.9 oscillator produced jagged shapes
       and audible distortion when PM modulator amplitudes
       were large. Fixed but made generation a bit slower.
     * Numerical expressions: Fixed parsing of unary minus
       several times in a row and in combination with "^".
     * Timing syntax: Correct handling of "\" after ";" in
       compound steps for modulator operators. Re-set time
       using the last default value, not the last explicit
       "t" value. Makes implicit time handling consistent.
    
    Syntax changes:
     * Add new "p+f[...]" syntax, for frequency-linked PM.
       Multiplies the amplitude of modulators with carrier
       frequency scaled so that 632.45... Hz has 1.0 gain.
       Based on an idea I remember from 2011, before I got
       normal modulation in order, now seeming worthwhile.
    
    Rework some scripts to show the use of the new syntax.
    
    Clarify documentation a little bit more, regarding FM.
  • v0.3.10
    68e47bc3 · Set version to v0.3.10. ·
    saugns v0.3.10. Timing fixes. Rework timing modifiers.
    
    Changes of a few main varieties:
     1. Fix compound step syntax used with nesting.
     2. Fix some smaller timing-related bugs.
     3. Rework timing modifiers, replace 's' (silence) parameter.
     4. A few smaller syntax removals, and an addition.
    
    Fix a bug (design flaw) from 2011, which limited use
    of ';' for timing in a nested structure in a script.
    
    Previously, while scripts with "Osin p+[Osin; ...]"
    worked, scripts with "Osin p+[Osin; ... Osin; ...]"
    didn't. The bug affected timing, when more than one
    object (oscillator) used ';' combined with nesting,
    inside or after nesting rather than before nesting.
    Now that limitation is gone.
    
    New 'devtests/compnest.sau' script works now but not
    with earlier versions. (Note: The fix was backported
    all the way down to new "Debug compound..." commit.)
    
    Fixes for '-p' option duration
    reporting, and related things.
    
    This is the 3rd year in a row where timing bugs have
    been fixed in December-January, for whatever reason.
    
    Syntax changes:
     * Rename timing modifier '\' to '/',
       (reverses change from 2011-07-01).
     * Replace the old silent time padding 's' parameter
       with the new subshift '\' timing modifier, also a
       new feature (add delay only for a next sub-step).
     * Make '|' reset delay to add next step to duration
       rather than add it to delay from prior '/' usage.
     * Remove "default length time" ("t*", literal '*'),
       a so-far never-useful 2011 feature.
     * Remove "delay by previous time" (used to be "\t",
       literal 't'), another 2011 feature.
     * Add phase named constant 'G' for golden angle, scaled
       to cycle percentage, for use in e.g. "p(G*4)" for the
       4th leaf-around-a-stem angle.
    
    Some smaller design changes without change in features.
    
    Make nicer README (now 'README.md'), also clear in plaintext.
    Also, rewrite various parts of 'doc/README.SAU', for clarity.
    
    When adjusting scripts to use '\' instead of 's'
    (after renaming every '\' to '/') make sure that
    the '\' is always before any old 't' that is for
    the same (sub-)step. Placement is now important.
    
    As for old '\' followed by '|', swap and write a
    '|' before the new '/', to get the old behavior.
  • v0.3.9
    c0c60578 · Set version to v0.3.9. ·
    saugns v0.3.9. Anti-aliasing. Wave, ramp, math changes. Fixes.
    
    Correct some irregularities in syntax handling
    including most noticeably the O 'c' parameter,
    now behaving like other parameters (instead of
    the last value set to an object on a line with
    several objects being applied to all objects).
    
    Rework oscillator for some real anti-aliasing.
    Remove old "rounding" from 'sqr', 'saw' waves,
    use one level of DPW-like pre-integrated table
    for all wave types (and FM, PM) in oscillator.
    
    Extend num. expr. syntax, recognizing built-in
    math functions which are now usable as part of
    specifying arguments for numerical parameters.
    
    Rework design from an earlier version and peel
    off some complexity without functional change.
    
    Correct and expand README on amplitude modulation;
    describe ring modulation, also supported using the
    AM syntax since early 2011 versions.
    
    Wave types:
     * Rename:
        - 'sha' -> 'ahs' (absolute half-frequency sine).
        - 'szh' -> 'hrs' (half-rectified sine).
        - 'ssr' -> 'srs' (square root of sine).
     * Add:
        - 'ssr' (squared & square root of sine).
    
    Ramp types:
     * Rename:
        - 'esd' -> 'xpe' (eXPonential Envelope).
        - 'lsd' -> 'lge' (LoGarithmic Envelope).
     * Add:
        - 'cos' (cos-like increase or decrease).
    
    Math functions:
     * Add:
        - abs(x)  Absolute value.
        - exp(x)  Base-e exponential value.
        - log(x)  Natural logarithmic value.
        - sqrt(x) Square root.
        - met(x)  Metallic value.
    
    Also add test script for using pre-existing features
    to get an "IXA synthesis" sound.
  • v0.3.8b
    73174951 · Set version to v0.3.8b. ·
    saugns v0.3.8b. Portability, performance, and cli fixes.
    
    OSS on NetBSD: Use /dev/audio, not /dev/sound.
    
    Check for the AUDIODEV environment variable,
    using it to override the default device name
    regardless of which type (ALSA, OSS, ...) is
    used. Similar to handling in other software,
    e.g. SoX and SDL. Empty strings are ignored.
    Credit to Art Nikpal (@hyphop at GitHub) for
    the basic idea, and SoX code as a reference.
    Further refactor player/audiodev code a bit.
    
    Change cli argument parsing to allow a flag to be followed
    by its argument without a space in-between. Recognize "--"
    as meaning no further strings are flags. Uses SAU_getopt()
    derived from Christopher Wellons's public domain getopt().
    
    Makefile changes to selectively use -O3.
    Following benchmarking (repeated running
    of example/ scripts with -m to time it),
    this can have a benefit anywhere from no
    to more than 42%, depending on compiler,
    etc. (It seems to matter more with GCC.)
    
    Move ramp mulbuf use into the fill functions
    and adjust more, allowing mulbuf to be NULL.
    
    Change the mempool to use dynamic sizing of memory blocks,
    doubling size when the number of blocks exceeds a power of
    four. Use 2048 as the start block size. Doesn't change the
    performance significantly with my testing which became too
    rough for tiny differences or needs larger volumes of use.
  • v0.3.8
    951c8a93 · Set version to v0.3.8. ·
    saugns v0.3.8. Clean-up redesign. Fix timing bugs.
    
    Most commits near the top, after the renaming to 'saugns',
    have been replaced by expanded commits a bit further down.
    Superficial stylistic changes have been rolled back a bit,
    while the valuable redesign parts have been streamlined in
    redone versions.
    
    To make space for expanding list syntax, undocumented '[]'
    usage with few effects as a generic subscope is renamed to
    '<>'. The latter could be given a real semantics later on.
    
    Furthermore, the
    parser has been simplified with a new round of changes and
    default time durations in scripts debugged. The design now
    looks a bit more like 2020-06 "mgensys", in part. Next up,
    preparing to expand language features on a cleaner ground.
    
    Changes the fix for -r 1 hangs. Now data is generated, and
    this extreme case also tested within the interpreter code.
  • v0.3.7c
    c3816f23 · Set version to v0.3.7c. ·
    saugns v0.3.7c. Rearrange code. Fix hang with -r 1.
    
    Reduce design difference with 2020-06 "mgensys" a bit further;
    split "generator" pre-allocation code into prealloc (like a
    simpler runalloc), and merge voicegraph into prealloc. Also
    rename generator to interp.
    
    Fix hang with the useless, yet allowed, sample rate of 1 Hz
    due to 0 samples being generated per "run" call, and time thus
    never advancing for the interpreter. Simply end when 0 samples
    are filled in the player code.
  • v0.3.7b
    6629a3e5 · Set version to v0.3.7b. ·
    saugns v0.3.7b. Tweak cli and minor clean-up.
    
    Command-line behavior: Print -p info for each script just prior
    to generating audio for it if done, instead of printing for all
    before generating for all.
    
    Fix v0.3.6f slip-up in moving changes across branches, which
    made the usage notice say "mgensys" instead of "saugns".
    
    Flense generator, simplifying away most "event data"
    and using what's allocated at the previous stage.
    
    The code previously in renderer/ is now in player/.
  • v0.3.7
    615a802f · Set version to v0.3.7. ·
    saugns v0.3.7. New channel mixing (panning) syntax.
    
    The old P "keyword" for panning has been replaced.
    Note that more changes remain to be done to remove
    the old behavior of grouping the parameter setting
    for all operators on one line. Place each on a new
    line in the meantime to give it its own value.
    
    Syntax changes:
     * Replace panning 'P' keyword with channel mixing parameter
       'c' and 'S c' for default. The scale changes from 0.0-1.0
       left-right to (-1.0) left, 0.0 center, 1.0 right. And the
       letters 'C', 'L', and 'R' become named constants for 0.0,
       (-1.0), and 1.0.
    
    Some additional refactoring is done,
    for some more lower-hanging fruit in
    ideas from the 2020-06 "mgensys" redesign version.
    
    The commit sequence is expanded a bit further down
    for further work toward the redesign
    goals, with notes on remaining bugs.
  • v0.3.6f
    cde34919 · Set version to v0.3.6f. ·
    saugns v0.3.6f. Reduce diff for upcoming redesign.
    
    Reduce differences for various smaller modules with
    the 2020-06 "mgensys" redesign experiment now in the
    "old-dev_202006" branch. Relicense many small modules
    permissively (ISC license), while saugns as a whole is
    still LGPL'd.
    
    Change default sample rate to 96000 Hz,
    undoing the 2012-02-10 change to 44100 Hz.
    
    Change the -h option to list topics
    available with -h <topic>. For now,
    only other lists are available, the
    first built-in help consisting of a
    'wave' type list and a 'ramp' list.
    
    Rename "loader/" to "reader/".
    
    Apart from the mentioned changes to
    options, should be functionally the
    same as v0.3.6e.
  • v0.3.6e-2
    saugns v0.3.6e. (Re-tag.) Bugfixes, minor clean-up.
    
    This replaces the hasty v0.3.6e tag. Back to -std=c99,
    -pedantic removed, but the warning fixes included.
    (The -v version is also now increased.)
    
    Fix crash on opening several files
    when only some failed to open.
    
    Fix numerical expression parsing for
    several subtractions in a row.
    
    Simplify usage notice, update man page.
    
    (These changes are part of work included
    in an experimental redesign, in branches
    named beginning with mgs. Far from done,
    but will be the basis for new versions.)
  • v0.3.6e
    saugns v0.3.6e. Use -std=c11. Fix -pedantic clang warnings.
    
    Removes new warnings when building with clang 8.0,
    which appeared in previous version
    (where -pedantic was added in Makefile).
    
    No functional change.
  • v0.3.6d
    saugns v0.3.6d. Fix crash in generator. Clean-up changes.
    
    Fix crashes due to wrong-sized allocation in generator.
    This bug was added in v0.3.1, and not found for 5 months
    because things happened to work on my systems and I've
    not received any feedback from users.
    
    Also contains a smattering of clean-up changes.
  • v0.3.6c
    saugns v0.3.6c. Refactoring.
    
    Split out voicegraph from scriptconv,
    add and use mpmemdup for arrtype uses
    of memdup. Functionally the same, but
    tidier for future redesign.
  • v0.3.6b
    saugns v0.3.6b. Redesign. Fix v0.3.6 modulator list bug.
    
    Extend the v0.3.4-v0.3.6 redesigns further,
    using a common nodelist module for parser
    and parseconv output, and moving handling
    of specific modulator lists to scriptconv.
    
    Fix v0.3.6 bug introduced when removing ADJCS flag.
    Ensure that cleared modulator lists are produced
    and set when clearing modulator lists in script.
    
    Add 'devtests/pm-addremaddrem.sau' (which
    tests adding and clearing PM modulators).
  • v0.3.6
    75e6e1a0 · Refactor scriptconv. ·
    saugns v0.3.6. Redesign. Fix for undocumented feature.
    
    Make parser handling of operator sublists simpler
    and more generic, moving specifics to parseconv.
    
    Refactor scriptconv and program.h types.
    
    Make use of '[]' separately from list parameters
    function as a generic subscope with few effects.
    This feature is still undocumented. Mostly harmless.
    (Originally, as '<>', it simply allowed freer use
    of whitespace. This was broken by the time of the
    2012 releases.)
  • v0.3.5c
    saugns v0.3.5c. Fix crash on updating ignored operator, timing.
    
    Fixes:
     * Make parseconv ignore updates for operator nodes
       which weren't processed before, because the list
       in which they were created was cleared in the same
       event. Fixes crash in versions v0.3.5 and v0.3.5b.
       (Add 'devtests/ref-unused_node.sau' for testing.)
     * Add missing default time handling for
       an operator's second amp. and freq. ramps.
       (Rebased down to v0.2.13.)
     * Fix a case where the first part of a composite event
       is given infinite time by default, messing up script
       timing (negative never-ending duration, event order).
       (Rebased down to v0.2.3.)
    
    (The crash also happened with v0.3.4, but not
    v0.3.3 and v0.3.4b. Versions earlier than v0.3.3
    ran, but changed data for the wrong operator.)
  • v0.3.5b
    saugns v0.3.5b. Fixes for 'S a' and "@label" syntax.
    
    Fixes:
     * 'S a' (Set amplitude multiplier):
       Apply multiplier to amplitude ramp target,
       not only the normal or initial value.
       (This was missed a long time ago.)
       Rebased down to v0.2.3.
     * Change which flags are checked to
       allow/disallow 'r' (rel. freq.) and 'i' (inf. time),
       fixing syntax for "@label" references.
       Rebased down to v0.3.1d.
    
    Also change op list code to include pointers instead
    of direct instances for modulator lists in parse data.