[go: up one dir, main page]

Skip to content

Tags: saugns/saugns

Tags

v0.4.8c

Toggle v0.4.8c's commit message
saugns v0.4.8c. Fix minor bug, refactoring.

Fix v0.4.8b bug which gave junk results when a
0 Hz oscillator has an `f` modulator with `r`
frequency ratio. (Normally useless, but valid
in scripts.) Was due to use of uninitialized
data for that specific case only.

This script made noise with the buggy v0.4.8b,
is correctly silent now:

`W f0[W r10 a1000] t10`

v0.4.8b

Toggle v0.4.8b's commit message
saugns v0.4.8b. Value range modulation for more parameters.

For consistency, allow "Modulation with value ranges" for
every parameter which accepts value sweeps. That's all with
modulators, except the main phase & PM parameter `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.

v0.4.8

Toggle v0.4.8's commit message
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.7c

Toggle v0.4.7c's commit message
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.7b

Toggle v0.4.7b's commit message
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.7

Toggle v0.4.7's commit message
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.6

Toggle v0.4.6's commit message
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

Toggle v0.4.5's commit message
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

Toggle v0.4.4d's commit message
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

Toggle v0.4.4c's commit message
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.