Releases: reneweller-coding/Noctuary
Release list
Noctuary 2.0.3
Every source of a preset is heard, and the near layer arrives as present as the background.
The sources of a preset
13722 presets of the library play two, three or four sources, and their levels were drawn one at a
time from ranges: nothing had asked whether a texture at 0.3 is heard under a wavetable at 1.0. It
has been asked now. Every source of every such preset was rendered on its own — the preset as it is,
the other sources silent, the Foundation, Strike and Air rendered apart — and measured in ten octave
bands. The parts add up to the whole preset within a fifth of a decibel (median, over 60 presets
rendered whole). A source counts as buried when it carries under 5 % of the preset's loudness and
owns no band of its own. That was so in 6537 presets: 26 % of those with two sources, half of those
with three, 69 % of those with four.
5298 presets have new source levels. A buried source is raised until it carries 8 % of the
loudness. Where full level is not enough, the sources that are heard give way together, by 3 dB at
most, and the master gain takes the loudness back. It was done in two passes, and the library was
measured again after each: 6044 of the 6402 sources brought forward (94 %) are heard now, and the
presets with a buried source fell from 48 % to 15 %.
What a level cannot fix is left as it was. 2156 sources in 1951 presets would stay under the bar at
full level with the others giving way — a frozen spectrum on the silent end of a gong, a source that
enters after twelve seconds of a note, a source two octaves down under a band pass. Thirteen more
never sound, because a modulation route pulls their level below zero. They are for a later round.
The changed presets keep their loudness: two samples of 120 of them, rendered whole afterwards, moved
by a third of a decibel in the median, and the furthest, measured against the preset as it was, by
3 dB. Their map positions and descriptors were not measured again.
The near layer
Near events arrive as present as the background they play over. Measured against the
background, the near bank's presets lay 18 dB apart at their loudest moment, the sequences quietest.
Level cannot carry that: a blown jet, a bow and a clip each read it as part of their sound. So Near
Events has a new knob, Gain (−24 to +36 dB, after the source), and every preset of the bank
carries a measured one that brings its loudest moment to the loudness of the background. Over
backgrounds the calibration had not seen, the share of presets within ±6 LU of it rose from 61 % to
93 %.
Nine in ten presets bring a foreground. Auto gave an artist's presets a foreground at the share
the artist's table set, from 5 to 70 %, and a preset without one switches off the foreground that is
playing — so most steps of a journey were silent near the ear. The shares keep their order and now
run from 90 to 100 %: 95 % of the pack presets bring one.
Auto no longer compounds Every. Auto scales the near preset's Every by a factor of its own for
each preset, and read the value to scale from the engine, which gets a new preset a block later — so
it scaled the result of the last scaling, preset change after preset change, until the ceiling.
Whistler's 200 s at a factor of 1.18 came out as 142 s instead of 236.
Checked
The self test, the host test and the race test in the release configuration, the thread sanitizer
on Linux, and pluginval at strictness 10. The sample library is that of 2.0.0.
Noctuary 2.0.2
Journeys play what they load. During a journey the volume knob did nothing, no near event came,
a texture preset showed no grains, and most knobs seemed to have no function. One cause lay under
all four, and two more sat beside it.
Morph held the instrument at Init. The Journey row sits in the Morph section, and a closed
section shows only its switch, so the way to a journey was to switch Morph on. With Morph on, every
parameter is played from snapshots A and B rather than from the knobs, and both snapshots began at
the defaults. The volume, the near layer's level, the source type, every knob: all held at Init,
whatever was turned and whatever the journey loaded.
- A snapshot nobody has chosen now holds nothing and plays as the knobs stand. Switching Morph on
before choosing A or B changes nothing you hear, and choosing only B runs from what is playing now
to B. The box says "as played" instead of an Init that was never one. - The snapshots stay with the instrument across a preset change and a journey step. They used to
live in one of the two engines a crossfade moves between, and were gone after the first step. - A saved state remembers whether a slot was chosen. Older states wrote both slots every time, so
the session recall brought the trap back on every start; for those, a slot named Init counts as
not chosen. - The Morph section no longer closes. The Journey row is always there.
The map blend was the same kind of hold and is handled the same way: starting a journey switches
Morph, the route and the map blend off, so the journey's presets are what plays.
The volume knob now reaches both presets during a fade. While one preset fades into the next,
the leaving one keeps every setting it had, and the knob reached only the arriving one. A journey
fades for up to a minute and a half after a head start of up to eight seconds, so at every step the
knob did nothing at first and half of what it should afterwards. It now moves both, by the amount it
is turned, so the leaving preset's own level does not jump when the fade begins.
Near events still take their time: the first comes after roughly three quarters of a minute, and the
rest follow the near preset's Every, which for some packs is several minutes.
Every fix was first reproduced by a check that failed against the code before it, in the plugin
itself and on the path a journey takes. Nothing else changed: the presets and the sample library
are those of 2.0.0.
Noctuary 2.0.1
The near layer survives a preset change. A journey ran for twelve minutes without a single
event in the near field, on a preset whose pack should have brought one. Two faults met to make
that, and both are fixed.
Applying a preset begins by putting everything in its scope back to its default, so that what the
preset does not mention is not left over from what played before. The near layer was in that
scope. It should never have been: it is a bank of its own with its own selector, kept across sound
presets on purpose, and not one preset in the library carries a single fore_* key. Picking a
preset by hand applies at the Sound scope, which excludes it; a host's program change and every
journey step apply at Full, which did not. So the foreground was switched off, silently, every
time the piece moved on. What a preset clears is now a narrower question than what it may set:
a preset that names a near key still sets it.
The second half: the call that fetches the foreground a pack's artist table gives a preset stood
only at the end of the by-hand path. A crossfade never reached it, and a journey step crossfades.
It now sits on the path both take, so Auto works from a host and from a journey as it always did
from the browser. The offline renderer follows: --near-auto acted on the first step of a journey
and no other, which meant a render of a journey was not the take you heard.
Three checks were added and one rewritten. The self test witnesses that a full preset leaves the
layer standing, that everything outside it is still cleared, and that a preset naming the layer
still sets it. The host test measures both halves through the plugin: that a program change brings
the foreground its pack gives the preset, and that a program bringing none leaves the one that is
playing alone.
Nothing else changed. The instrument, the 14592 presets and the sample library are those of 2.0.0.
Noctuary 2.0.0
The instrument is called Noctuary as of this release; it was developed under the name
AmbientSynth and is otherwise unchanged. A noctuary is the record of a night.
The foreground, and a library made anew.
A near layer. Everything the instrument had was a plane — a bank, a table, a recording, a
string, all made to be sustained and sent into the far reverb. 2.0 gives it a foreground: a fifth
source of its own, played by a second, small conductor that waits, chooses a degree consonant with
what sounds (a fifth over the highest voice, never inside a critical band of it), plays one thing
close to the ear, and waits again. Its own preset bank (108 presets in twelve families) sits beside
the sound presets and stays while they change under it. The sources were made for it: a blown
flute (a jet-drive waveguide that overblows to its octave when the embouchure shortens the jet), a
singing bowl and creaking ice (friction on modes that come in doublets, so they beat as real bronze
does), water drops (a bubble whose pitch rises as it decays, into a vessel), a murmuring voice on a
radio with its squelch and its Quindar tones, and the signals — a VLF whistler falling through the
magnetosphere, a seed pod, struck bronze, a Geiger tube, a fluorescent tube, the Krell's circuits,
a beacon's data packet, a number station's Morse, a shortwave dial. A Berlin-school sequence kind
with a shift register that mutates, a breathing tempo and a filter that blooms over the run. Events
can arrive out of the horizon or leave into it (Distance and Approach), the near field lifts 120 to
300 Hz as a thing comes close, and Dry lets a click past every reverb.
Recordings, played straight. A Clip source type plays a recording once, unbroken, because a
sentence in grains is not a sentence. The library's archive holds NASA's mission loops and
sonifications, twelve episodes of Quiet, Please cut into phrases at their pauses, and seven
hundred spoken clips from the Library of Congress's Citizen DJ packs — every file's source and its
rights statement in Archive/SOURCES.md. A preset may name a folder: every event then plays
another phrase, never the same twice running.
Auto and journeys. A sound preset from a pack brings its own foreground: a table per artist
says which near presets belong to that music and how often, and the preset's name decides, the
same way every time. Journeys are presets in a row, each held for a while drawn from a range and
crossfaded into the next over a drawn fade, cyclic for an evening that plays itself; 119 come with
the instrument (two per pack, and a crossing per family of artists), and your own are a text file.
The library, made anew. 56 artist packs of 256 presets and 256 built-ins, generated from the
material rather than by hand: textures regenerated, a thousand generated rooms, a thousand
wavetables on three shelves, the rule-book conductor with thirty new parameters (register, interval
colour, breathing rate, silence, root steps, home) measured against Rene's rule book by an audit
that reads an hour of the conductor's notes. Every preset balanced, measured over a minute, mapped
and rated.
Under it: the room convolver in three partition sizes with the work spread over the block
(sixty seconds of hall for 1.4 % of a core), the cloud and memory expansions, a spectral shifter,
a stereo effect chain where the hall and the early room hear a stereo input, source envelopes of
their own, slot roles (a slot that plays only the lowest, the inner or the highest note), and the
far reverb's return after the foreground has ducked it as a parameter.
Favourites are kept by name in Documents\Noctuary\favourites.txt -- the same stars in
the standalone and in every DAW, and they survive a library made anew -- and favourites first
puts them at the top of the browser's list whatever the sort; the map rings them in gold. The
table pictures (Harmonic, Wavetable) light the cycle between two frames where the sound is,
blended as the engine blends it, and say so as a number.
Found by the release build's own tests, fixed before it shipped: a preset change within a
third of a second of the one before it could arrive without its samples; Freeze held back
every delayed source, so a preset frozen from its first note with nothing but delayed sources was
silent; and a recording with a small offset, integrated by a forty-second hall, could drive the
Patina's clipper onto its rail and the instrument into silence. The hall now blocks direct
current at its input, a loaded recording loses its offset, and the Patina's clipper has a blocker
ahead of it.
Checked: self test, host test, race test in the release configuration; the near bank measured
preset by preset; the rule-book audit; the full library rated.
The sample library — 57 archives, 100 GB: the samples, wavetables, impulse responses and the
archive the presets name — is the release library-v5. The installer offers to download it.
Noctuary sample library v5
The sample library the preset packs play: 5748 textures, 2938 field recordings, 2191 wavetables,
1100 impulse responses and an archive of 931 public-domain recordings. 99.9 GB of FLAC in 57
archives, plus a manifest that lists every part with its SHA-256 and its files.
The installer downloads and verifies these with your consent, and the portable zip points at them.
Nothing here is needed to play: the 256 built-in presets and every pack preset that does not name
a recording sound without it.
The archives are still named AmbientSynth-library-v5-*, which is what the instrument was called
when they were uploaded. They are a hundred gigabytes and byte-identical to what the manifest
describes, so they keep their names rather than being pushed again under the new one. The
installer and the manifest both refer to them as they are.
AmbientSynth 1.12.1
The grain loop, four times faster — and two things it was getting wrong.
A third of the instrument's work was in one loop. Measured with VTune over a preset with four
texture slots, SourceSlot::renderTexture was 3.11 s of 9.87 s — the largest single cost in the
synthesizer, and 59 % of it with the density knobs up. It is now 0.80 s, and the whole render went
from 9.87 s to 6.82 s of CPU.
Two steps got it there. The test that ends a grain (age >= len || pos >= len - 2) sat inside the
sample loop and belongs in front of it: when a grain runs out of window or off the end of the clip
follows from its rate, and can be worked out once a block. Then the loop was vectorised across the
SAMPLES of one grain rather than across grains — across grains they all add into the same output
sample, so every step ends in a horizontal reduction, and their lanes are never all alive at once.
Across samples the accumulation is a plain vector add and the lifetime stays scalar. AVX2 on x86-64
with a gather for the interpolation; NEON beside it for the Quest. Measured against the scalar path,
the difference is 114 dB below the signal.
Silence at the top of the keyboard. A grain reads Grain length × rate samples of its clip, and
when that was more than the clip held, no grain spawned at all — not a shorter one, silence. A
one-second clip with 300 ms grains went quiet two octaves up. The grain is now shortened to what the
clip can give. (The shipped library did not reach this below MIDI 85; a short clip of your own does.)
Grains that were cut off and lost. Grains is a ceiling on how many may be started, but the
render loop stopped there too: turning the knob down left every grain above the new value cut off
mid-waveform — a click — never finished, and still marked as in use, so its place was gone for good.
The live grains are now packed densely, so the ceiling costs nothing when it is high and means what
it says when it is low.
Grain clouds lost a comb. New grains began at sample 0 of the audio block regardless of when they
were actually due, so a dense cloud started every grain on one of 750 instants a second. They now
begin where the spawn clock says.
Checked: self test, host test, race test, pluginval at strictness 10, the thread sanitizer and the
address sanitizer — the last three on exactly this code.
The sample library -- eight archives, 10.55 GB: the samples, wavetables and impulse responses
the presets name -- is attached here. The installer offers to download it during setup.