-
v0.4.8e8d8adb0 · ·
saugns v0.4.8. Add long-form value range modulation syntax. Modulation with value range. Add a new variation on the syntax with greater flexibility, for both `a` (amplitude) and `f`/`r` (frequency) parameters. Below `X` and `Y` denote optionally included range endpoint values, while `A` and `B` are the newly introduced modulator lists whose outputs are added for the endpoints only. The `C` and `D` modulator lists work as before. The old syntaxes remain as short forms unchanged: - `X[A]..Y[B].r[C].a[D]` - `X[D].rY[C]` - `X[D]` The use of the '..' changes the meaning of the first modulator list prior if included, so that it plays the part of `A` rather than of `D`. (If no `C` list is used for the generator the results of `A` and `D` modulators are identical, but the lists are built and cleared separately.)
-
v0.4.7c761cec29 · ·
saugns v0.4.7c. Bugfixes for "r" rel. freq handling. Fix bugs for `r...` relative frequency parameters in AM modulators when placed inside `A` or `N`. (Latter types don't have frequency parameters, so use of `r` inside can't apply to them as the carriers outside.) When possible, make `r1` be better than `f1`. * A script `N a0[W]` now has a default frequency of `f440` for the inner `W`, not `r1` (which is like `f1` here, as there's no carrier frequency). But, in `W a0.r1[N[W]]` it's `r1`, effectively `f440`. * A separate bug affected e.g. `W a0.r1[A0[W r1]]`, where the `r1` acted like `f1` instead of passing the nearest outer frequency from the other `W`. A pointer wasn't passed along, a typo made it NULL. * Don't allow `r` for a modulator with all carriers being of types lacking a frequency parameter. Now such modulators are more like 1st level carriers. Clarify `r` behavior fully in the `README.SAU` file.
-
v0.4.7ba6481633 · ·
saugns v0.4.7b. Bugfix for "$?variable" checks. Fix error resulting in silence rather than no script when script rejected by "$?variable" check. This bug was added in v0.4.4b. Also a little update for example scripts.
-
v0.4.706ee891b · ·
saugns v0.4.7. Improved named note frequencies. Language changes: * Add generator type `A` (Amplitude generator), for sweepable amplitude offsets i.e. DC offsets, plus adding and/or multiplying its AM modulators. * Frequencies as notes. - Support MIDI note number constants (`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. - For just intoned tuning modes, rotate scale ratios with key selection, so that the note for a key has the first ratio. Makes tuning good for non-C keys. Generator `A` is yet of limited use, but will take a greater role when distortion options etc. are added.
-
v0.4.6f9ab6e02 · ·
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.5287ac0c0 · ·
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.4d61a2bef5 · ·
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.4c8007c61b · ·
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.4b940cb812 · ·
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.4c72970ff · ·
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.3e10ab1ae · ·
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.2d603ccf3f · ·
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.2c9767f7b7 · ·
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.2b75588308 · ·
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.2d7fe43f8 · ·
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.12d984ea6 · ·
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.0dbe62c0b7 · ·
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.0c947c4ce8 · ·
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.0b0e57cb1f · ·
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.06cdf6ada · ·
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.