Sno Station
Sno Station은 AI 에이전트를 하나의 팀으로 묶는 오픈소스 워크스테이션으로, 로컬 머신에서 에이전트 협업을 가능하게 함
Kirin Hypha는 무료 오픈소스 DAW 전·후 측정 플러그인으로, 일반 측정은 신호를 그대로 두고 비교 청취는 선택 시에만 시작합니다
Kirin Hypha is a free, open-source PRE / POST measurement plug-in for DAW processing chains. Normal measurement leaves the signal unchanged; comparison audition starts only when you choose it.
플러그인Rust · C++GitHub @heyalohaloha온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Free, open-source PRE/POST audio measurement for macOS (AU/VST3) and Windows (VST3). Rust + JUCE, GPLv3.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Measure before and after your processing chain, see exactly what it changed, then hear both sides at the same loudness — with the names hidden if you like. A free, open-source metering plug-in for macOS (AU · VST3 · AAX) and Windows (VST3 · AAX).
Build guide · Release qualification. Commands and prerequisites are in Building from source.
Names are optional labels. PRE and POST do not need matching names, and track position is never used to guess a pair. PRE captures the input state, while POST captures the output state and joins only verified matching observations.
Also inside: the Hybrid VU with true-peak bars and clip lamps, the SHARP and LIVE timelines, the time your chain takes between PRE and POST, and a screen in English or Japanese.
Free, and more with Kirin OS. Everything above except Reference works on its own, free — up to 12 PRE/POST pairs per project. With a Kirin OS license, Reference compares your mix with your own library, and Keep / Record saves a playback's measurements with the song. See Modes.
Hypha 1.1.53 is available for macOS and Windows. Both installers include PRE and POST.
| Platform | Installer | Plug-in formats |
|---|---|---|
| macOS 12+, Intel and Apple Silicon | Download Universal PKG | AU · VST3 · AAX Native |
| Windows 10/11 x64 | Download Windows EXE | VST3 · AAX Native |
The macOS installer and plug-ins are signed and notarized. The Windows installer and plug-ins are Authenticode-signed. Close your DAW, run the installer, then reopen the DAW. Installation details · Release notes, checksums, source and recovery ZIP.
Download the latest macOS or Windows release from the Releases page.
The macOS installer package and the plug-in bundles inside it are signed with Apple Developer ID certificates and notarized by Apple, so Gatekeeper normally opens them without a warning. If a downloaded file is still flagged — for instance when the quarantine attribute persists — you can inspect it and clear the flag yourself:
# Inspect the installer signature
pkgutil --check-signature "Kirin-Hypha-<version>-macOS-Universal.pkg"
# Verify the download against the SHA-256 shown on the Releases page
shasum -a 256 "Kirin-Hypha-<version>-macOS-Universal.pkg"
# Remove the quarantine attribute if macOS blocks the installer
xattr -d com.apple.quarantine "Kirin-Hypha-<version>-macOS-Universal.pkg"
The installer package has companion .pkg.sha256 and artifact JSON assets on the Releases page.
Each release also includes a signed, notarized macOS Universal ZIP for manual recovery. Use the PKG
for normal installation.
The Windows 10/11 x64 release is one signed installer EXE containing PRE and POST in VST3 and AAX,
built from the same release commit as macOS. The VST3 and AAX payloads, installer, and generated
uninstaller must pass their signature and acceptance gates, including pluginval, real DAW use,
same-version reinstall, upgrade from the preceding public release, and isolated uninstall.
docs/windows_external_validation.md is the repeatable
real-machine regression checklist. Each release identifies its exact source commit and artifacts.
Published artifacts are immutable. If repository maintenance changes a public commit ID after a release, the commit recorded in that artifact remains its original build commit. docs/release_commit_map.json maps an affected artifact commit to the commit currently referenced by its release tag and records the verified source-equivalence scope.
Maintainers use the public history identity contract: full commit SHAs, SemVer tags, and PR numbers are authoritative; historical B numbers are supplemental labels.
Measured, not judged: Hypha reports what it captured — no score, no target, no recommendation. The BS.1770-5 / EBU R 128 v5 measurement audit records the verified scope, including all 70 assets of the EBU Loudness Test Set v05.
Kirin Hypha is built to observe, not to advise.
It produces measurement data. During normal measurement, it does not generate, modify, attenuate, or delay audio: the same input produces the same output, every time. An explicit comparison audition is a separate output-only path; it never rewrites the input, the captured PRE/POST measurements, or Record data. Numbers are reported as captured — no interpretation, no scoring, no recommendation.
Two display filters exist in the shipping JUCE surface. They affect what is drawn, never what is measured, stored, or read back.
Watch draws the measurement engine's own Watch snapshot directly. SPACE's six-second MONO field draws observations as measured.
When playback stops, or a rest outlasts the 3-second Watch window, the pages with a six-second history (FREQ's field or landscape, LIVE, SHARP and SPACE's MONO field) keep what was measured on screen, dimmed, and withdraw only the present: the live curve and the current values. Rests shorter than 3 seconds, such as the gaps between drum hits, keep every page live.
Everything else is the measurement itself: the playback-pass and Keep maximums, LUFS-S, the FREQ
numeric readout, the six-second field, MARK, Focus Trail, peak hold, Meter Session statistics, TIME
history, the SHARP and LIVE timelines, Record, Keep, and plugin_data. A value read back later is therefore the measured
one, and FREQ's live curve can differ from its unsmoothed numeric readout while it is moving.
Every metric is backed by a known-signal golden test: the expected values are derived independently from the signal definition and the ITU-R BS.1770 filter coefficients, not asserted by hand. The measurement layer demonstrates its precision rather than claiming it.
The public BS.1770-5 / EBU R 128 v5 measurement audit
records the verified scope: BS.1770-5 Annex 1/2 for mono and stereo, all 70 assets in the EBU
Loudness Test Set v05, the source archive SHA-256, and comparison of the Hypha wrapper with the
pinned ebur128 reference. The suite was rerun on 2026-10-06. While surround is held back, the
5.0/5.1 test assets are checked against the pinned reference only and are not evidence for a
surround mode. Hypha does not claim EBU Mode conformance and does not use the EBU logo.
| Feature | Standalone | With Kirin OS |
|---|---|---|
| Watch mode | ✓ | ✓ |
| POST on-demand DRUM / FREQ / SHARP / LIVE | ✓ | ✓ |
| Local PRE/POST Blind Compare | ✓ | ✓ |
| Live PRE/POST compare | ✓ | ✓ |
| Reference A · B · C · V and VERSION BLIND | — | ✓ |
| Record mode | — | ✓ |
| plugin_data output | — | ✓ |
Kirin Hypha is free, and everything without Kirin OS above works as a standalone plug-in. Reference and Record mode require a Kirin OS license.
Hypha's screen is in English or Japanese. MENU → Display → Language chooses English or
日本語; until a choice is made, Hypha follows the system's display language. The choice is saved
for every PRE and POST, and open editors switch at once. In Japanese, what explains or reports is
Japanese: status lines, notices, hover help, menus, guidance and dialog text. Measurement labels,
abbreviations, legends, units and values (LEVEL, LUFS, TP, POST / Δ, MARK) stay as written, so the
layout and the measurement vocabulary are the same in both languages. Action labels are translated,
except Blind's REVEAL and END, which read the same in both. Names you give stay as written. The language changes
only what is drawn; plug-in names shown by the host, Record, plugin_data, the data exchanged with
Kirin OS, and every measurement stay the same.
L, R, C, LFE, Ls, Rs) LEVEL / TIME measurement-only mode, but the plug-in does not
accept a 5.1 bus until its host acceptance is complete.Pro Tools can still insert Hypha on a 5.1 track as a multi-mono plug-in. Each mono instance then measures its own channel, which is not a 5.1 measurement.
LEVEL keeps immediate loudness and dynamics facts above fixed-scale history. The large view adds M, S, I, five supporting facts, and L/R meters without changing the compact measurement definitions.
The footer at 150% and above distinguishes LIVE, HOLD, WAITING and BYPASSED; at 100% and 125% the folded strip shows only the short states (WAITING, BYPASSED, FORMAT HELD). Notifications stay in that established bottom status area, without covering the graphs or L/R meters. Longer text is abbreviated to the available width; click the notice to read its full details. The loaded version remains in the information menu, not in the narrow status rail.
At 600×400 and above, click a LEVEL history point to hold the display while measurement continues.
< TP / TP > select adjacent excursions above −1 dBTP; LIVE resumes scrolling without resetting
measurements. Only TP strictly above 0 dBTP receives strong local glow, always at its measured height.
COPY copies the selected TP and approximate host-clock window endpoint. HOST ~ does not promise
project-timeline coordinates or an exact peak sample: this history ABI does not distinguish project
and render clocks. An unavailable host position is shown as ELAPSED, never invented as a DAW position.
POST's information menu (click the POST HYPHA title) shows how long the plug-ins between PRE and POST took per audio block:
typical and peak milliseconds and their share of the block's own length. It is elapsed time, not
CPU usage, and only blocks in which PRE demonstrably ran just before POST on the same thread count;
otherwise the menu gives the reason. Show in the footer keeps the typical / peak share in view as
CHAIN LOAD 31% / 70% (at 100% and 125% in the bottom strip), highlighted when a block took longer
than its own length. It is off until turned on and applies to every POST.
TIME directly selects HISTORY, RUN (absolute facts grouped by playback run within the selected history), DRUM (per-hit attack, on a track or stem), signed SHARP, or three absolute LIVE facts. Only the selected optional analyzer runs.
DRUM answers one question: how did processing change the same hit? Put PRE before the processing chain and POST after it to compare POST − PRE; with POST alone, read the output hit's shape and level. ALL gives the full-band view, and BAND focuses that comparison on a frequency region. Adjust processing while LIVE shows incoming hits, then click a hit to LOCK and inspect its observation. Return to LIVE to see the next change. LOCK fixes the displayed hit; it does not loop or play audio. These readings support listening; they do not rate sound quality or prescribe a compressor setting.
DRUM shows six seconds of the PRE/POST envelope and four facts for the selected hit: TRANSIENT (first-30-ms RMS minus the body RMS), STRENGTH (first-30-ms RMS), CREST (sample peak minus RMS in those 30 ms), and SHARPNESS (loudness-weighted perceptual sharpness over the first 100 ms, in acum), each as POST − PRE. TRANSIENT describes the head/body contrast, STRENGTH its initial level, CREST its peakiness, and SHARPNESS its perceptual sharpness. A matched POST hit is measured at the PRE onset, so both sides read the same content samples. A TRANSIENT whose next hit leaves no 20 ms body, or whose body is below the −72 dBFS HISTORY floor, shows —, with the reason in Facts. In POST, a locked hit can show STRENGTH and CREST as soon as its first 30 ms are measured; TRANSIENT and SHARPNESS follow once its body is complete. Delta values also require a complete PRE hit and verified mapping. A hit cut off before those facts can be measured shows — and keeps its reason in Facts. Without PRE, the lanes show POST values.
BAND, on DRUM's second header row, filters each hit to one ISO octave band (63 Hz to 8 kHz) on
PRE and POST and turns the four lanes into DELAY (POST arrival − PRE arrival, where the band
envelope rises through its peak − 20 dB), ATT (10 → 90 % of the band peak), REL (peak →
−20 dB) and LEVEL (the peak of the band RMS envelope), each as POST − PRE of the same hit.
ATT and REL measure the hit's envelope, not a compressor's attack/release knobs. DELAY measures
the two band-arrival times, not the plug-in's reported audio latency. Larger views show the
hits on number lines. ALL and BAND LIVE use the latest eight completed hits inside the six-second
window. Audio, worker, publication and unverified mapping still pending are excluded before that
cohort is selected; older completed hits can fill those positions. Each lane excludes unavailable,
not-applicable and wholly uninformative intervals and shows a median from one or more informative
hits. With none it shows —. Facts keeps every cohort hit's classification, count and reason,
including the excluded observations. The UI never recalculates the median. Classification and
Age sentences and the repeated “Latest hit” or “Locked hit” lane text stay off the main view;
the existing LIVE/LOCK control and shared caption retain the selection context. Limits keep their direction and are rounded outwards. At 200 % and
300 % HISTORY shows those hits' average HEAD (−20 to +40 ms) and TAIL (0 to 300 ms) in that
band; smaller views keep the same values, units and Facts access in four cards. Click a dot (or use ← → HOME) to lock that hit and
read its own values and envelopes. LOCK keeps the selected hit when it leaves the visible window;
its completed values, envelope and original qualification stay together in one bounded snapshot.
A real source or clock binding change retires it. LIVE returns to its retained summary. ALL LIVE uses
the same completed-hit cohort as BAND; LOCK alone reads one selected hit. The band hits keep the same producer keys as the full-band navigation. Choosing
another band analyzes the retained last 7 s again, even while stopped; ALL releases the extra band
audio. Facts distinguishes silence, an earlier hit still ringing, a next hit cutting the tail,
unmeasured audio, audio/worker/publication still pending, and missing comparison proof. A measured
limit remains a limit on the production view; its reason and resolution remain in Facts.
An older PRE or a band mismatch keeps the requested Δ scope and preserves a reason such as
Update PRE or No mapping. It does not substitute POST values for an unavailable Δ. An absolute
POST snapshot is labelled POST, and its DELAY is not applicable (No PRE). Open Facts for the
same adopted values, subset medians, classification counts, per-metric age and measurement spans.
The BAND example uses synthetic measurements to show missing observations and measured bounds.
TIME's PSR has its own target and cutoff: it automatically shows Δ for a selected pair, while the
main POST/Δ choice still controls M, S, TP, PLR and CORR. TIME PLR belongs to its completed
100 ms point and uses that point's processed prefix; it does not include later pending input. A comparison that is waiting or expired
keeps the Δ label and its reason. It does not silently become POST. Current values expire from the
original 100 ms slot's completion: absolute readings last 400 ms. Matched LEVEL/TIME readings
remain active for less than 1 s while the same pair, source spans and clock run continue, and
while the local timeline lag is also less than 1 s. Polls and rejoins do not renew this deadline.
Seek, loop wrap, stop/pause, run, pair, authority or layout changes retire the comparison immediately.
FREQ uses its own spectrum freshness; LEVEL warming or delayed measurement does not hide its
Δ legend or MARK. Pair rejection reasons still appear in FREQ. A stopped POST keeps its selected PRE and reports
that comparison is stopped; it does not ask you to select the same PRE again. A PRE that stops
while POST continues is shown as inactive. Clearing the selection still reports no matching PRE.
After a playback boundary, current Δ requires a complete, continuous aperture on both sides:
400 ms for M, TP and LEVEL CREST, and 3 s for S, PSR and CORR. These LEVEL and TIME
readings also work when the DAW omits its optional presentation-latency report.
Absolute POST observations and Session statistics continue independently. A cumulative PLR
without equivalent prefix proof stays unavailable in Δ.
PSR is supplementary: its Δ −3.3 dB or POST 10.1 dB reading uses a small, regular-weight
font and secondary colour, with no equation beside it. M, S and TP remain the main readings.
DRUM reads incoming hits at 30 Hz, fetches ALL/BAND LIVE summaries at 4 Hz and adopts one complete stamp every 500 ms. Values, counts, points, envelopes and Facts change together. Within one playback pass, main numbers may retain their previous values while a nonempty cohort has newer unfinished hits; an empty or wholly unavailable cohort otherwise shows —. After a loop wrap or seek, the previous main readings and hit count stay visible in the secondary text colour, labelled Previous, until completed hits supply replacements for the displayed readings in the same observation scope. Their original POST/Δ meaning and units stay with them while waiting. Measurement and the six-second history restart for the new pass; previous readings never enter its medians, history or Facts. With no previous readings, the empty display is unchanged. HOLD retains the last value; changing the band, explicitly changing the target, changing the pair, audio format or comparison source, or restarting analysis clears previous readings. LOCK responds immediately. TIME updates at 10 Hz. Its display clock is separate from measurement and stops where available observations end. The view looks back 150 ms; a BAND reading older than 250 ms keeps its age and missing-data reason visible in Facts. These readings describe the measured audio and do not judge its quality.
Meter Session I, LRA and MAX TP include every EBU-processed 10 ms block, including the tail before
Stop. During playback, the ordinary fraction of the next 10 ms chunk keeps MAX TP and PLR
available for the processed audio. A tail left unprocessed after Stop is reported explicitly:
MAX TP shows ≥ the confirmed value and PLR shows ---. I and LRA describe the processed prefix. MAX M and current meter points keep their
100 ms update boundary. Reset clears the session; pause retains its coverage. Record semantics stay
unchanged. Capture freezes the displayed facts for a local PNG. If Work attachment v1 cannot retain
their typed meaning, attachment reports that limitation and offers the same frozen PNG for local save.
TIME HISTORY/PSR and DRUM require this typed meaning; RUN, SHARP and LIVE remain attachable in v1.
Saving over an existing PNG replaces it with the complete new image; it does not append a second
image. A failed write reports failure and preserves the previous file.
AU FREQ Δ uses the same PRE/POST timing proof as LISTEN, in a separate render coordinate. Certified Studio One / Studio Pro VST3 content clocks also use that proof. REAPER VST3 uses its certified, PDC-compensated project positions directly for measurement, without adding output latency. Complete matching windows from the current run are required, and loss of proof clears the difference until fresh data is ready. Other VST3 hosts retain their presentation-coordinate or project-timeline path, including FREQ without an output-latency report; that path does not independently prove PDC content alignment. If an uncertified VST3 host compensates the project position for a delayed insert and also includes that same delay in PRE's output-latency report, the delay can be counted twice. Hypha can then compare different parts of the audio and show a false Δ. Differences across a delayed insert have not been verified in uncertified VST3 hosts. The certified or checked host paths are Pro Tools AAX, Logic AU, Studio One 6–7 / Studio Pro 8 VST3, and REAPER VST3. The version policy and timing requirements below still apply; this list does not mean every version or configuration has been tested. The Studio Pro checks above were made on macOS and on Windows. Mixed clock kinds are never compared. Missing latency is never treated as reported zero latency.
The cyan Δ (POST − PRE) curve is the primary view. PRE and POST remain visible as references. Choose LR, MID, or SIDE; click a frequency to keep its exact six-second Focus Trail; use MARK to retain one temporary full-spectrum reference. The display scale is ±24 dB.
SHARP shows six seconds of signed Δ Sharpness in acum; without a paired PRE it shows POST's own Sharpness. It reports observation only: no target, warning colour, score, or recommendation.
SHARP differences and PSB differences use verified PRE/POST timing in AU, AAX and certified Studio One / Studio Pro VST3. REAPER VST3 also supports SHARP Δ and PSB Δ using its compensated project positions (K = 0). At a loop wrap or position change, it discards the previous analysis window and waits for complete matching windows. Other VST3 hosts retain their output-presentation-latency requirement. AU needs an independent host project timeline as well as the render timestamp. Logic AU uses a common render coordinate only when the same callback also confirms the PRE−POST output presentation-latency difference (including zero). This permits FREQ Δ, SHARP Δ, PSB Δ, LISTEN and BLIND during Cycle. Project positions do not select a cycle occurrence: Logic can wrap inside a block and move project time by one sample during pre-roll. Other AU hosts retain their linear proof and positive-difference, observed-loop rule. With Cycle off, Logic also retains project-based linear calibration when presentation reports are unavailable. An unproven AU pair waits; render time alone never establishes alignment. During Cycle, an unverified AU pair shows Turn Cycle off to compare in FREQ Δ, SHARP Δ and PSB Δ. LISTEN keeps POST playing with the same guidance, and BLIND keeps its selection. Turning Cycle off allows fresh linear proof; the same BLIND requires END and a new trial. Proven cycles remain available. LIVE, POST-only Sharpness and absolute PSB also accept the project timeline or a local render clock, so they do not need an output-latency report; in AAX they always use the project timeline. Pro Tools AAX feeds SHARP through the Native engine clock. The difference uses the same PRE/POST timing proof that LISTEN uses to play PRE: every Pro Tools build from 12.6 on proves it within the documented delay-compensation bound, including an initial loop (the proof itself was measured in Pro Tools Developer 26.4.0.5; other builds are certified by that floor, not measured). An AAX host that is not Pro Tools proves it only during linear playback, so while Loop Playback loops a selection there the view says Loop Playback on: turn it off to compare. After a start, seek, stop/play, temporary clock gap, disabled delay compensation or another audition taking output, affected views show PREPARING ANALYSIS until fresh proof and measurements are ready. Missing latency is never assumed to be zero.
| Clock supplied by the host | LIVE / POST Sharpness / absolute PSB | SHARP Δ / PSB Δ |
|---|---|---|
| Certified Studio One 6–7 / Studio Pro 8 VST3 content clock | Available | Requires the existing LISTEN timing proof |
| AU render clock with independent host project timeline | Available | Requires linear or presentation-latency loop proof |
| Other VST3 output-presentation clock | Available | Requires a matching PRE; content alignment is not independently proven |
| REAPER VST3 compensated project timeline (all readable versions) | Available | Available; complete matching windows, PDC required. LISTEN / BLIND conditions |
| Other project timelines without an output-latency report | Available | Unavailable (state 6) |
| Local render clock | Available | Unavailable (state 6) |
| AAX Native engine clock, Pro Tools 12.6 or later | Project timeline | Requires the existing PRE/POST timing proof (linear or bounded initial loop) |
| AAX Native engine clock, another AAX host | Project timeline | Requires the linear PRE/POST timing proof; waits while a selection loops |
REAPER differences rely on the host keeping project positions compensated for the audio. A reported
position or latency change clears the old windows immediately. If audio latency changes while all
clock reports stay unchanged, a brief false difference cannot be detected from those reports alone;
see the measured REAPER conditions below. Plug-ins must report their latency and the host must compensate it.
The REAPER certificate covers all versions: the native executable must be named REAPER or reaper,
and its non-empty version string must start with an ASCII digit. Missing or unreadable versions,
other executable names and other formats receive no REAPER certificate. FREQ already relies on
compensated project positions across REAPER versions; SHARP and PSB use the same assumption.
Real-host checks used REAPER 7.71: FREQ, SHARP and PSB differences were zero during normal playback,
loops and latency changes during playback. This does not claim testing every version.
This table describes the analysis clock gate. It does not replace acceptance tests in each host.
LIVE overlays POST LUFS-M, recent True Peak, and Sharpness on one six-second time axis. Each metric keeps an independent fixed scale, and the current values update at a readable rate.
SPACE shows three-second MID/SIDE density, L/R balance, and correlation. It stays absolute because Hypha does not invent PRE/POST subtraction for correlation or the stereo field.
At the largest editor it also shows MONO, beside the full-height scatter and under BAL and CORR: how much of each third-octave band survives being summed to mono. One correlation figure is one number for the whole signal, and a stereo problem is never spread evenly across the spectrum — it is a bass note, or a band an M/S move widened, or a pair of channels that ended up out of phase somewhere. MONO says which band, and by how much.
Mid and Side are built in the time domain before the transform, so a phase cancellation is already in the magnitude and the figure is what the band actually loses, not a width estimate.
Identical channels read 0 dB and a hard-panned source exactly -3.01 dB, and those two are the ends of one range: while a band's channels share polarity, its reading cannot fall below -3.01 dB, however wide the band is. A reading past -3.01 dB means the channels are partly opposed there, and a band that cancels outright falls to the floor. The scale is split on that: the top half carries 0..-6 dB, which is every same-polarity reading and the margin around it, and the bottom half -6..-24 dB, which is cancellation. A band with nothing to measure breaks the line rather than being drawn at 0 dB, which is the one reading that means the band loses nothing. Below the frequency where one observation holds fewer than three cycles, a divider and a tilde say so without hiding the values.
Under the curve, six seconds of the same bands run bottom to top: the newest observation along the bottom edge, rising as it ages. A cancellation that came and went is visible after it has gone. Those six seconds live in the editor, so closing it loses them; per-band history is not written to the TIME history or to Record.
MONO is measured on both PRE and POST, so the two can be compared by switching between the plug-ins. It adds no analyzer, consumes no analysis slot, and runs whether or not SPACE is open.
Two POST optional analyzers may stay active: one can remain on the 2MIX while the other follows the working track. A third identifies the owners and waits until one of them leaves DRUM, FREQ, SHARP or LIVE for another view, or closes.
| Metric | Window / Unit | Standard |
|---|---|---|
| LUFS-M / LUFS-S | Momentary (400 ms) and Short-term (3 s) loudness (LUFS) | ITU-R BS.1770 |
| True Peak | Recent peak, last 400 ms (dBTP) | ITU-R BS.1770 |
| Crest Factor | Peak − RMS, 400 ms (dB) | — |
PRE displays absolute values. POST shows its own values (POST) or the difference from the paired PRE (Δ). If that exact PRE is explicitly bypassed, the Δ views say PRE IS OFF — ENABLE PRE TO COMPARE without releasing the pair; choose POST for absolute values. A stop, silence, stale read, or temporary absence never claims that PRE was bypassed. An inactive PRE says PRE NOT RUNNING — CHECK PRE IS ENABLED; stopping POST pauses the comparison. A distinct POST-bypass reason is displayed only when supplied by the measurement ABI. LUFS-M and LUFS-S each keep their own MAX value for the current Watch playback pass. In LEVEL, the live 400 ms True Peak and its playback-pass MAX are distinct facts. Starting Keep (MENU → Keep) changes the presented result context; Max TP then means the maximum for the whole Keep session, including across transport stops. Watch, every MAX, and everything Keep and Record write are raw.
A paired POST uses top-level FREQ to inspect processing between PRE and POST. Spectrum runs only while FREQ is open. The signed Δ (POST − PRE) curve is the primary RAW display, with absolute PRE and POST spectra retained as reference curves. SHAPE is a one-click alternative: it removes the measured whole-aperture energy difference from each valid band to make relative spectral reshaping visible. RAW and SHAPE use the same exact PRE/POST apertures and require no additional FFT. Bands without sufficient energy remain absent, rather than being joined across a gap or shown as a zero difference. Both modes use a ±24 dB scale; the underlying difference is not clipped. A difference is produced only when PRE and POST frames have the same sample rate, aperture length, FFT layout, channel mode, channel count, and output-presentation sample endpoint.
| Control | Observation behavior |
|---|---|
| LR / MID / SIDE | Selects exactly one channel definition; the three analyzers never run in parallel |
| M/S | Overlays the POST-local (L+R)/2 Mid and (L-R)/2 Side spectra from one stereo aperture; unavailable for mono or Δ |
| RAW / SHAPE | Switches the same exact-pair curve between gain-inclusive difference and energy-normalized shape; clears a mode-specific MARK and Focus Trail |
| Hover / click | Reads frequency and the selected RAW/SHAPE value; click locks the probe, shows its six-second Focus Trail, and × releases it |
| MARK | Captures or replaces one temporary display-only reference in the selected mode; × clears it |
| PSB | Perceptual share by Bark band: how the loudness is shared across 20 Bark bands |
| Free resize / 100–300% presets | Keeps a fixed 3:2 aspect ratio from 300×200 through the native 900×600 Inspection View and remembers the exact loaded-instance size. Drag the editor's own bottom-right grip in any host (Studio One on Windows and Pro Tools have no window frame to drag) or choose a size from the size menu. Above 300% the Inspection View is magnified in steps that keep it on whole device pixels for the display (450% and 600% on a Retina display; 600% at 100% Windows scaling; 400% and 600% at 150%; none fits a 1920×1080 display at 125%) |
The page analyzes one selected channel view at a time. LR transforms L and R independently and
averages their power, so opposite-polarity channels do not cancel. MID analyzes the (L+R)/2
waveform. SIDE analyzes (L−R)/2 and is available only for stereo input; mono never fabricates a
SIDE result. Switching LR / MID / SIDE clears the old frame and waits for an exact PRE/POST match in
the newly selected mode. Record-mode N and Sharpness use their own independent-channel definition,
described below, so they can differ from MID or SIDE Spectrum on wide or phase-opposed material.
When POST has no verified PRE, Spectrum shows POST on its own: the current curve, a rolling peak hold, and the six-second field behind them. The field is a second axis inside the same rectangle — vertical is time, not level. The newest observation is drawn along the bottom edge and rises as it ages, leaving the top edge six seconds later, so a resonance that appeared, a sweep, or a level move traces a visible shape. Each of its 180 rows is one thirtieth of a second and shows the observation nearest that instant, at the full band resolution; density follows the measured level, so a loud band is far denser than a quiet one. Nothing is averaged, blended, or invented between observations. A row stays empty when the nearest observation is further away than the cadence the host is actually publishing at, so the field is continuous at any buffer size while a break in the measurement stays a break in the field.
At 200% and 300% the same six seconds are drawn as a landscape instead of a flat field. The newest
spectrum stands on the plot itself as the front ridge, on the same frequency and level axes as the
curve, and older spectra recede toward a horizon: higher, narrower, and fainter with age. Each of
the 24 ridges is the one observation nearest its age, keeping the loudest band in each of its 96
columns so a narrow peak is not thinned away. A ridge with no observation within half a ridge
spacing is left out and grid lines join only neighbouring ridges, so a gap stays a gap and two lone
observations never grow a range between them. The landscape adds no value to the reading; the
current curve drawn over it does. The paired Δ view stays flat. At these two sizes the plot also
names what it draws (Δ(f) = POST(f) - PRE(f) or L(f) = POST(f)) and the analysis behind it —
aperture, FFT size, band count, and presentation rate — read from the frame itself.
In the POST target, M/S is a fourth display choice beside LR / MID / SIDE. It overlays solid cyan Mid and violet Side curves calculated from the same aperture, with a shared 0 to −96 dBFS scale and a two-value probe at every editor size. M/S is an absolute POST observation: the Δ target is disabled until LR, MID, or SIDE is selected, and M/S is disabled while Δ is active. M/S creates no PRE request, six-second field, peak hold, MARK, or Focus Trail, and its choice never leaks into SHARP. The loaded plug-in instance remembers the choice across editor close/reopen, but new instances and restored DAW sessions start from the existing LR default.
Hovering the plot shows frequency and the selected RAW/SHAPE value; larger views also show PRE and POST values.
Below the cycle-derived low-frequency confidence boundary (about 35 Hz), the frequency alone carries
an unobtrusive ~ prefix. The measured band and Δ remain visible and are not dimmed, hidden, or
replaced by a warning. Hover help explains that ~ means an approximate low-frequency position.
All Analysis hover help wraps and repositions inside the plug-in at every size. At 300 % and above,
pointing at an item on LEVEL, TIME, FREQ, SPACE or REF's B, C and V shows its help in one line over
the footer instead of a popup: across the whole footer row for the graphs, values and tabs (what the
item is and how it is used; PLR, for one, reads as the song's average dynamics, compared between PRE
and POST to see how much limiting reduced it), and in the status at the left for the footer's own
controls, which stay in view. The popup at 200 % and below keeps the full text. MENU → Display →
Show hover help disables or restores explanatory popups for every PRE and POST; the user
preference survives plug-in and DAW restarts. FREQ inspection, click lock, Focus Trail, and MARK stay
available while help is hidden. A click in the plot
locks that readout to the same frequency until its × is pressed. While locked,
Focus Trail shows six seconds of the selected mode: compact at the smallest size and in its own lane when space
permits. Its newest point is the same exact PRE/POST presentation frame as the live Δ, not a
UI-clock estimate. A missed UI poll does not erase valid older observations: retained points keep
their true sample-time positions. The work-surface stroke joins the surrounding exact points across a
missing endpoint so Windows scheduling jitter does not look like a broken curve; the missing time is
still retained as gap metadata and no measurement is inserted. Reversed or incompatible frames, and
a forward discontinuity beyond the six-second view, start a clean trail. After a backwards transport
move, PRE and POST may resume one analysis cadence apart; FREQ waits until both have crossed the old
endpoint, then resumes from their newest exact shared endpoint. The frequency lock and MARK remain
where the user placed them across a loop, silence, temporary warming state, or short I/O gap; only
the factual trail restarts on the new exact time axis. MARK freezes one display-only full-band curve as a solid amber reference beneath
the cyan live curve; pressing MARK again replaces it, and its × clears it.
MARK is temporary and is cleared when the pair, sample rate, FFT layout, channel mode, or page changes.
It adds no analyzer and changes no measured value. Exact 3:2 size is remembered for the loaded
instance, while Spectrum itself still opens off.
Focus Trail retains only fixed-capacity display snapshots while Spectrum is open. It adds no analyzer,
does not smooth or delay the live curve, and is discarded on pair, rate, layout, channel-mode, or page
changes.
Continuity has two bounded layers. POST keeps the newest eight already-computed exact Spectrum differences in a fixed recovery ring, so a short UI scheduling stall can collect missed frames on the next poll without another FFT. If a stall exceeds that ring, Focus Trail still keeps the surviving exact points at their sample-time positions and connects only those surrounding observations for the work-surface stroke. Both layers are display transport only: no dynamic growth, extra analyzer, filesystem polling, or Audio Thread work.
The optional PRE/POST exchange is supervised by the existing 10 Hz IO update. On Windows its
short-lived request, readiness, and Analysis snapshots use a small pagefile-backed shared-memory
mapping, avoiding dependence on filesystem create/rename latency at the 30 Hz Spectrum cadence.
macOS retains the atomic-file transport. Watch, Record, and plugin_data keep their existing file
contracts on both platforms. Each shared slot is double-buffered and committed as one generation;
a reader keeps the last complete value during a contended update rather than accepting partial data.
The watchdog advances only after a request, readiness fact, or PRE snapshot was actually published. If publication stops, the stable IO path retries one non-blocking exact exchange before the 1.5-second request lease can expire. During a transient gap, the last exact FREQ or SHARP presentation is held only within that same lease boundary instead of flashing an empty page. A publication that completes after its lease has already expired is not counted as live. No second analyzer is started, no mismatched frames are joined, and no Analysis transport work enters the Audio Thread.
Where both spectra are extremely quiet, the displayed Δ alone is faded toward zero: it is fully
suppressed at and below −120 dBFS and reaches full strength at −96 dBFS. This display floor does not
alter the captured PRE or POST values. The analyzer follows the host sample rate without resampling.
Its Hann aperture is rounded from the 48 kHz reference time of 4096 / 48000 seconds (about
85.33 ms), and its FFT is the smallest power of two that preserves at least 2× zero-padding. Thus
48 kHz remains exactly 4096 samples / 8192 FFT points, while 44.1, 96, 192, and 384 kHz use
3763/8192, 8192/16384, 16384/32768, and 32768/65536 respectively. Analysis remains at 30 Hz. The live
curve presents the newest frame at 12 Hz and numeric probe values at 2 Hz, without averaging or
changing the measured endpoint. All curve points, hover interpolation, MARK, and Focus Trail use the
same logarithmic band centres (index + 0.5) / 256. The first and last edge labels remain plot
boundaries, not invented samples. It compares measured programme energy rather
than reconstructing a plug-in transfer function, so narrow low-frequency EQ shapes can appear broader
than the corresponding EQ control graph.
From TIME, SHARP opens Perceptual Δ; the top-level FREQ domain opens Spectrum. The first
Perceptual Δ observation is Δ Sharpness History. It plots the signed Sharpness difference
POST − PRE over the latest six seconds, with the newest exact value shown in acum. The measured
difference is not clipped; the stable display scale is ±2 acum. The curve is spatially rounded for
legibility, but no temporal smoothing delays it. The curve keeps the same visual strength across the
full history. Its fill is controlled only by distance from zero: quiet at zero and progressively
denser toward either display edge, never by sample age. Only a small dot identifies the newest exact
observation. All measured
10 Hz points remain in a retained six-second timeline: the curve is repainted at 5 Hz and the exact
PRE / POST / Δ numbers are held for 500 ms. A delayed UI update catches up from that factual
timeline instead of exposing scheduling jitter as broken segments. A true measurement discontinuity
starts one clean new run; no missing value is interpolated.
Each point comes from one non-overlapping 100 ms aperture and is published at 10 Hz. Before the first point, PRE reports readiness and POST commits one shared, aperture-aligned presentation epoch at least 200 ms in the future. PRE and POST reset their Phase D and optional sample-rate-converter state once at that epoch, then preserve that state continuously across later apertures. They must match in schema, host sample rate, aperture length, state epoch, channel definition, channel count, and output-presentation sample endpoint. If any of those facts differ, no Δ point is produced.
The psychoacoustic engine runs at its defined 48 kHz analysis rate after following the host-rate input; at 44.1, 48, 96, or 192 kHz each endpoint still represents exactly 100 ms of host presentation time. A non-48 kHz converter may buffer an additional chunk before publishing an already-measured endpoint; it does not shift or interpolate that endpoint. A dropped block, timeline discontinuity, mode edge, or missed epoch clears the short history and requires a new shared future epoch instead of continuing state across a gap.
LR measures L and R independently and uses their arithmetic mean, so channel polarity cannot
cancel the observation. MID measures (L+R)/2; SIDE measures (L−R)/2 and remains stereo-
only. Changing channel mode starts new history. Returning to TIME / HISTORY, another
non-analysis domain, or closing stops Sharpness and discards display history. Spectrum and
Sharpness stop each other before starting without releasing the owned optional-analysis slot.
Neither changes audio nor rewrites Watch or Record results.
From TIME, LIVE opens a POST-only absolute timeline; top-level FREQ opens Spectrum. LIVE does not subtract PRE and does not create a PRE analysis request. It overlays three measured facts on the same latest-six-second time axis:
| Trace | Colour | Fixed display scale |
|---|---|---|
| LUFS-M | Cyan | −42 to 0 LUFS |
| Recent True Peak | Pale violet | −30 to +6 dBTP |
| Sharpness | Amber | 0 to 3 acum |
Each trace has its own fixed scale, so vertical position is comparable over time within that metric, not numerically between the three metrics. Values outside a display scale remain measured facts and are only bounded at the plot edge. In a sparse source, an exact aperture whose LUFS-M or recent True Peak is below the measurement floor remains unavailable internally and in the numeric readout; the curve alone reaches the lower plot edge so silence does not resemble a dropped UI frame. There are no targets, score bands, warning colours, or verdicts.
All three values are committed at the same exact 100 ms POST endpoint in the current clock. Presentation, project and local render coordinates support absolute facts; local coordinates do not prove PRE/POST alignment. A clock-kind change rebuilds analysis state. Measurement runs at 10 Hz, Rust retains 64 exact points, the curve repaints at 5 Hz, and current numbers update at 2 Hz. No missing measurement is interpolated or stored as a value, and no temporal smoothing delays the display. A short forward observation gap retains the verified points on both sides at their exact sample times and joins only those points for presentation. A single verified point is shown as a dot, and a temporary worker re-arm does not erase the last verified field. Backward transport, an incompatible format, or a gap spanning the six-second field starts a new run. LUFS-M and recent True Peak reuse Watch's measurement definitions; recent True Peak is the latest 400 ms maximum rather than a session hold. Sharpness keeps the established independent-channel arithmetic-mean definition. Switching ATTACK, FREQ, SHARP, and LIVE replaces only the analyzer in the owned slot. A non-analysis domain or editor close releases it and discards history.
At most two of ATTACK, FREQ, SHARP, and LIVE run per DAW process. This supports a mix bus plus one working track without starting 12 costly analyzers. A third view names the two owners and waits. PRE/POST pairs, Watch, Record, and audio pass-through have no such two-slot limit. Switching optional views keeps ownership; only a non-analysis domain or editor close releases it.
| Metric | Window / Unit | Standard |
|---|---|---|
| LUFS-M / LUFS-S | Momentary (400 ms) and Short-term (3 s) loudness (LUFS) | ITU-R BS.1770 |
| Integrated Loudness | Current Keep session (LUFS) | ITU-R BS.1770 |
| Max True Peak | Current Keep session maximum (dBTP) | ITU-R BS.1770 |
| Crest Factor | Peak − RMS, 400 ms (dB) | — |
| PSR | Peak-to-Short-term Ratio, 3 s (dB) | — |
| Sharpness | acum, independent-channel arithmetic mean | DIN 45692 |
PRE displays all six values. A paired POST displays Δ for LUFS-M and LUFS-S, PSR, Crest, and Sharpness; Integrated Loudness and Max True Peak remain absolute POST session values. The Integrated value spans transport stops within one Keep. After Stop, the final Record result remains visible until the first newly computed Watch result arrives. PSR always uses the engine's 3 s Short-term loudness.
On True Peak. Two distinct True Peak quantities are reported. The recent peak is the maximum inter-sample peak within the last 400 ms (the same window as LUFS-M) and is shown live in Watch mode; it is not held, so a transient drops out of the reading once that window has passed. The session maximum is the running maximum inter-sample peak over the whole recording and is what the Record data stores. When a single dBTP figure is quoted for a file, it is the session maximum. Peak windows are tracked by sample count, so offline / faster-than-real-time rendering does not shift them.
On Crest Factor. Crest Factor is the sample-peak level minus the RMS level (both in dBFS) over the same 400 ms window. Peak and RMS are both computed across the pooled samples of all channels — not a mono sum — and the peak is a sample peak, not the inter-sample True Peak. A silent window produces no value (shown as ---).
On the psychoacoustic metrics. N (Zwicker loudness) remains measured and stored for Kirin OS
even though it is no longer one of the six DAW display cells. For multichannel Record data, N and
Sharpness are measured independently per input channel and combined by arithmetic mean. They do not
sum the waveform before the nonlinear psychoacoustic pipeline. Perceptual Δ uses that same definition
for LR, while its explicit MID and SIDE selections intentionally measure (L+R)/2 and (L−R)/2.
Kirin-Hypha-<version>-macOS-Universal.pkg from the Releases page./Library/Audio/Plug-Ins/VST3/./Library/Audio/Plug-Ins/Components/./Library/Application Support/Avid/Audio/Plug-Ins/.Kirin-Hypha-<version>-Windows-x64-Setup.exe and its .sha256 companion
from the Releases page.%ProgramFiles%\Common Files\VST3; AAX goes to
%ProgramFiles%\Common Files\Avid\Audio\Plug-Ins.
The manual VST3 ZIP is a diagnostic and recovery fallback, not the normal installation path.
The Audio Unit preserves its file-access declaration (temporary-exception.files.all.read-write) for
session and plug-in data. Builds without the official update verification key declare no network
access. A deliberately provisioned update build additionally declares network.client and the
update protocol marker; signing and packaging gates check these together.
SHARP Δ and PSB Δ follow the clock table above. AU, AAX and certified Studio One / Studio Pro VST3 wait for fresh pair proof. REAPER VST3 uses its measurement-only project certificate. Other VST3 hosts without output latency use ABI state 6, showing a fixed unavailable reason. LIVE, POST-only Sharpness and absolute PSB use the available local clock without this requirement. Switching views retires the previous view's missing-latency flag. Format support alone does not prove PRE/POST timing alignment.
Automatic update checking is disabled in this release. Use the Information menu's English or Japanese official download link to get a newer version. Hypha does not install updates automatically.
The source contains an optional checker and offline tests. No production verification key or published update service is provisioned, so this release hides update status, automatic checking and Check now, and makes no update-check HTTP request.
When a future release enables the service, checks use one fixed official manifest and a shared 24-hour limit including failures and cancellations. Update storage is separate from Kirin OS identity, Reference and Record data. Network, verification and storage work runs outside audio processing; no installation, license, Work or audio identifiers are sent. Invalid, expired or unsigned information cannot announce a release. Normal use works offline.
See update implementation and acceptance for the protocol, clock handling, storage failures and service qualification requirements.
Pairing is an explicit selection of one exact PRE instance. It is not inferred from track position or matching names.
Giving PRE a name such as Mix, Drum, or Vocal makes the menu easier to scan, but naming is
optional. UTF-8 labels, including Japanese, are supported. An unnamed PRE can still be selected by
its exact instance identity. POST never accepts a typed pair name or retargets another PRE by name.
When an active PRE or POST is duplicated, the copy receives a different instance identity. Select the intended PRE again in a copied POST. Saved identities are retained when reopening a session if no running instance already owns them.
Multiple PRE / POST pairs can run simultaneously (up to 12 active pairs per project).
Kirin OS automatically publishes its saved Reference library to POST; there is nothing to connect. A small OS indicator reports the connection; received settings remain visible when media is unavailable. Hypha does not substitute its own Factory library.
Reference has four roles, each with its own button in the same place at every size: A B C V.
Only one role sounds at a time. The A/B/C/V buttons change the sound; the pages change only the display. Choosing a different song, Check, Cue or Version changes only that role: if it was playing, it fades to A and plays the new choice with a new MATCH as soon as it is ready; the other roles keep playing. Receiving or restoring settings never starts a role.
Level matching. B and V follow A: every second Hypha measures A's gated loudness over the last 10 seconds (BS.1770 gating of the 100 ms momentary history) and moves the audition copy toward "A − the source's level" with a 50 ms ramp, ignoring changes within 0.5 dB. B uses its Cue's Integrated loudness from Kirin OS (the whole song when the Cue has no value); V pairs A with the aligned V content over the same window. Following never raises the copy above max(−1 dBTP, A's maximum true peak, the source's maximum true peak) and never moves more than 6 dB from the gain of the MATCH you started (as AUTO in the live PRE/POST compare); at either limit it stops, keeps the current gain and says so. After stopping at the ceiling, following resumes as soon as A gets quieter and the copy needs to come down, because lowering never crosses the ceiling; it stops again if A gets louder, and the notice is shown once while you listen to the same role. C matches once and stays fixed: it compares A's gated loudness over the Cue's length (at least 10 s, at most 10 minutes) with the Cue's Integrated loudness, and waits until A has played for the Cue's length (at most 30 s) so that a fixed gain is not set from a few seconds; pressing C earlier queues it and C starts once A is measured, and until then the C page shows how much of A it has (for example A 12 / 30 S) instead of a gain. MATCH on the C page matches again from the current A window. A match without enough A keeps the current gain and says why. A Check set to original level in Kirin OS plays as is.
Lowering A to match. A loud master and a quieter reference cannot be matched by raising the reference past the ceiling. When the reference falls short by 0.5 dB or less, which the ear cannot tell, Hypha plays it at the ceiling without asking, and the status line says how far it is under A (0.1 DB UNDER A (PEAK LIMIT)); following and MATCH again do the same. Beyond that Hypha offers, on the page of that role, to lower A by the difference: the line says the amount (B NEEDS A 8.0 DB LOWER) and its button the fix (LOWER A 8.0 DB & PLAY B), sized to what it says. The reference then plays at its own level and A is lowered to it. Nothing is lowered without that approval. A stays lowered after the audition, through the other roles, until RETURN in the footer; RETURN stops the role and raises A over half a second. The roles' readouts then name the gain against the lowered A, and RETURN in the footer says how far A is lowered (the status line says it below 150 %, where the footer has no RETURN). Offline renders and host bypass are never lowered, and the measurements and Record are taken before it. While A is lowered, the live PRE/POST compare and Blind wait for RETURN, so POST is never lowered twice.
One comparison takes POST at a time. Every button and every internal start asks the same rule: a Blind or Keep waits while B, C or V plays (press A in REF first); other auditions wait while the live PRE/POST compare holds or returns POST; and B, C, V or a Blind takes over a running live compare session, whose PRE then needs selecting again. Keep remains available during held LISTEN attenuation when no Blind owns the output; it records the canonical measurements before that attenuation. A refused start says why and changes nothing.
A stop or seek keeps the selection: the same source returns at the same gain once it is ready again, as in the live PRE/POST compare. An offline render, a local Blind or starting the live PRE/POST compare clears that held selection, so nothing returns on its own afterwards. Sample-rate conversion of the audition copy is automatic (the source file is never changed). On B, C and V (and Version Blind), a mono source on a stereo track plays its one channel on both sides, unchanged. Two equal channels read 3.01 LU louder (BS.1770) than the mono file Kirin OS measured, so MATCH, following and the gains shown before the role plays add 3.01 LU to Kirin OS's value; the LUFS-I figures still show Kirin OS's value. A stereo source on a mono track is not mixed down: the role says so and A stays live. Lowering A for a Blind whose match exceeds the ceiling still requires explicit approval. Offline render, a missing or changed source, or a failed check leaves A playing.
Status. The status line says one of three things, with a dot: ready (cyan: what plays and how its level is held — following A, matched and fixed, stopped at the ceiling, or original level), waiting (gold: what it waits for and how it proceeds, such as playing the DAW), or unavailable (grey: the reason and its one fix, such as ranking a Reference set in Kirin OS). Its parts are in order of importance — how the role plays, how far it is under A, then the rest — and where the line is narrower than all of them it shows the parts that fit whole instead of cutting one; pointing at a shortened line shows it whole across the footer row. At 150% and above it sits at the bottom left of the footer on every Reference page, where the other pages show LIVE or HOLD, so the charts keep that row; at 100% and 125% it is the bottom row of the page. A notice in the footer takes its place while it shows; when the line carries an approval or VERSION BLIND, the line moves back to the bottom of the page instead, so neither is hidden. A role that cannot be heard yet is drawn dimmed but stays clickable and explains itself. A wait never runs on silently: past its limit (Kirin OS answering, 5 s; checking, loading or preparing a source, 10 s; alignment, 30 s of play; A's level for MATCH, 10 s of play, or 35 s for C) it turns unavailable with its reason and fix, shown even under the start guide, and returns to ready once the source is. While Kirin OS prepares the song of a Reference set or CHECK set, the line says what Kirin OS is doing in its own terms — how many songs it prepares first, checking the file, waiting for another measurement — and a file Kirin OS cannot find turns the line unavailable with the retry as its fix (Kirin OS publishes this beside its heartbeat; nothing is shown once Kirin OS closes). Blind keeps its own line and never says which source plays or how it is matched. Pressing a role while it is still preparing (publishing a new choice, verifying, loading or aligning its source, or measuring A) waits for it and plays it as soon as it is ready, as when you press it while the DAW is stopped; a step only you can change (outside the Cue, no match in this passage) or a match that cannot be made is explained instead.
Pages. Each role has its page at 300% (900×600) and above. Below 300%, C and V are drawn dimmed; pressing them opens 300% without changing the sound (press again to listen), as Blind does. At 100% the B page shows the song and the status; songs are switched from 125%.
At 300 % on B, C and V, pointing at an item shows one line over the footer on what the item measures and what it is for (CREST, the four bands, Blauert's bands, WHOLE and so on), as a loudness meter's help bar does, across the whole footer row as on the other pages; it returns to the status when the pointer leaves. The controls' own help goes to the same line instead of a popup there. Show hover help turns both off; below 300 % the popups stay as they were.
A is gold and the compared role is cyan on every page; colour never scores a result. A is drawn as the thicker line underneath, so both lines stay visible where they agree. Spectrum charts carry frequency ticks (50 Hz to 10 kHz, or 30 to 200 Hz for a low-band Check). Full-range spectrum charts (B's Balance, C, and V's TONE) also shade Blauert's directional bands — 300–400 Hz, around 1 kHz (891–1122 Hz) and 3–4 kHz — and read at the top right how A's 1 kHz sits against the mean of the other two compared with the other role (1k vs 300-400·3-4k / A 1.2 dB LOWER; 300-400·3-4kに対する1k / Aが1.2 dB低い). In loudspeaker stereo, more at 300–400 Hz and 3–4 kHz tends to sound present and near, more around 1 kHz diffuse and far, mostly on familiar sounds; Hypha shows the decibels only, never near or far. It is a difference within each song, so it needs no level matching; it reads the 64-band medians of both sides, and is not shown when a band is near silence (−100 dBFS or below). The four-band Balance cannot show it: its 250 Hz–2 kHz band holds both 300–400 Hz and 1 kHz. A Check that Kirin OS compares by listening (no measured view, such as Vocal balance) says so on C instead of showing a chart. V's tabs are matched with the alignment's level even while V is not playing. Until Kirin OS has measured a Cue, C is compared over its whole song, as MATCH is, and the status line says so with the fix (measure the Cue in Kirin OS). The whole-song spectrum stands in only when Kirin OS measured the song every 100 ms, A's definition; for a longer song C shows no spectrum and the status line says why. Standard names from Kirin OS (Check sets, Checks, automatic Cues, a new Reference set's default name) read as Kirin OS's English names, whatever language they were saved in. On the Japanese screen a name reads in Japanese where Hypha has its Japanese (the Check sets, for example, also when ranked "1 / 3"); simple English names (Dynamics, Stereo, Set 1) stay in English rather than turning into katakana. Names you give stay as written. A role waiting for the DAW is marked on its button and named in the status line.
Same definition, same section, same level. For each Cue Kirin OS publishes values computed every 100 ms: the 64-band spectrum (the largest bin of each band of a periodic-Hann FFT, p10, median and p90 over the Cue) and the four-band Balance (band power sums). Hypha measures A with the same definition — not the FREQ page's spectrum, whose definition reads several dB differently on noise — over the same length, and compares at the level the role plays at. V is measured by Hypha the same way over the section aligned with A.
A is compared live: while REF is open and the song plays, Hypha measures A for the role you are looking at (B, C or V) and fills V's WHOLE timeline as you play. There is no separate step to capture A; the page of the role you open decides what is compared, and the space goes to the charts. A capture saved in a session by an older version is skipped on reopen (it neither changes the display nor uses analysis) and is dropped at the next save.
The user decision of 2026-10-13 makes ordinary experimentation continuous: adjust intervening plug-ins, track faders, mute/solo or automation, edit loop ranges, and open or close windows while comparing. Unrelated project edits do not change the chain proof. Unverified PRE is never played; LISTEN and BLIND retain your choice and return automatically when fresh proof is available.
Switch between PRE and POST of the same chain while the song keeps playing. When you select PRE, POST plays the input that PRE received, lined up with what POST is processing by the DAW's timing and delay compensation. Where Hypha cannot confirm that line-up, you hear POST, and PRE comes back by itself as soon as it can confirm it again. Short checks are quiet and the selected PRE button stays selected. Measurement and Records are never changed.
LISTEN, level matching and BLIND are available in macOS AU, VST3 and AAX, and Windows VST3 and AAX. Logic AU supports continuous and cycle playback. REAPER VST3 uses its processing counter, calibrated against compensated project positions; its measurement clocks keep their own rules. REAPER loop conditions are described below.
Pro Tools: use the signed AAX Native release in regular Pro Tools, with delay compensation enabled. PRE and POST can be true mono or stereo (multichannel) instances. A multi-mono insert measures each channel independently and does not offer live comparison, because Pro Tools can process those channels in parallel. The comparison clock uses Pro Tools' reported timing and delay-compensation state, available from Pro Tools 12.6. Loop playback without a selected range is treated as linear playback. If timing cannot be confirmed, POST remains audible and the comparison resumes when confirmation returns. END stays available throughout.
The signed 1.1.51 release has passed PRE/POST loading, exact pairing, normal audio, Keep, offline bounce, and saving/reopening in regular Pro Tools Native on Intel macOS and Windows x64.
Studio One / Studio Pro: the VST3 comparison profile accepts Studio One 6–7 and Studio Pro 8 with a readable native version. The measured profile is Studio Pro 8.1.2.113407. Separate real-host measurement checks confirmed zero FREQ, SHARP and PSB differences with a 4096-sample delay and loops in Studio One 6.6.3 / 7.2.3 and Studio Pro 8.0.2 / 8.1.2 on macOS, and Studio Pro 8.1.2 on Windows.
In another AAX host, a looped selection that cannot be proven asks you to turn loop playback off while POST plays. Brief timing checks keep your selected controls and stay quiet. After three seconds without recovery, the status area explains the observed cause and remedy.
REAPER LISTEN timing (1.1.51; stereo output checked in REAPER 7.71 on Intel macOS). Both PRE and POST must use VST3, mono or stereo, in the same compensated chain. The executable/version policy is the same as REAPER's measurement certificate above. Each instance counts the frames it actually processes; eight consecutive agreeing linear blocks establish the offset between those independent counters. An unverified block plays POST immediately. Named LISTEN can reacquire after an identified stop or seek; BLIND keeps the same hidden assignment and resumes after fresh proof. Saving or reopening restores no selection or MATCH permission.
The first loop can establish its offset using REAPER's live chain_pdc_actual observation.
The supported route is a normal two-channel track with mono/stereo inserts, exactly one PRE and
one POST in that order in the main serial FX chain. Input/take FX, containers, parallel FX,
oversampling, external hardware inserts, special PDC modes and unreadable identities are withheld from this new route.
The message thread reads the public host API, binds every FX GUID and its order to the live
project/track/process, and discards pre-playback observations even when the API reports success.
Two agreeing observations with callback progress are required. API/identity/configuration changes,
stop/seek, prepare or stale audio callbacks revoke the observation. Project-wide edit counts only
reject edits during a read; unrelated track edits do not change the chain fingerprint.
The address limit is actual chain delay + 8192 samples; the supported actual delay is at most 65536 samples. The allowance covers relative PRE processing and block boundaries, not the DAW's playhead render-ahead time. The complete age interval must lie in PRE's measured native linear segments and have exactly one matching address. At PRE's first observed block-boundary wrap, both the segment before the wrap and the segment after it remain available, so POST can still read the delayed tail. Once the loop length is measured it must exceed the limit; the ring must also exceed it. Incomplete coverage, ambiguous addresses and unverified wrap boundaries keep POST playing. This permits entry during the first lap after observation/calibration and PCM availability; it does not promise immediate output on the first callback. MATCH still needs at least three seconds of continuous proven audio. Without the API proof, the existing linear calibration and its 73728-sample verified-address envelope remain available.
The timer normally reads at 50 ms. Evidence expires after 500 ms without refresh or two seconds of processed samples without a fresh observation. Expiry withholds PRE for that block; the same fingerprint and delay in the same run can resume LISTEN or BLIND with its approved gain. A changed proof still revokes K; both LISTEN and BLIND resume only after new proof. Idle instances check at 250 ms; only relevant playing instances inspect the API at 50 ms. These are freshness limits, not a guarantee that a host report precedes an audible PDC change. Dynamic API notification order, scheduling outside the measured conditions remain host tests.
Timing measurements used REAPER 7.71 on macOS, 96 kHz, stereo, 512-frame blocks, anticipative FX processing off and on (200 ms render-ahead). Reported 4096→0 latency changes and bypass reductions were detected in the same POST block in all 12 measured transitions: the observed undetected window was 0 ms, at callback resolution. Reported 0→4096 increases, including bypass release, preserved the correspondence because REAPER processed upstream FX ahead. This is a reduced timing sample, not a guarantee for every host version. Separate signed-release checks in REAPER 7.71 on Intel macOS verified LISTEN and BLIND output, recovery during the tested edits, END, and session reopen; the timing measurements above retain their own narrower scope. Unreported latency changes were not detected by the clocks; an independent negative test remained misaligned for about seven seconds until playback stopped. As required by R-12, every intervening plug-in must report latency correctly and REAPER must compensate it. No clock-only rule can repair an unreported delay. The REAPER results do not establish native Windows REAPER acceptance or coverage of every rate, buffer size, delay, and plug-in configuration. Timing contract and regression coverage.
In POST, select the exact PRE pair. At 200% and above, press LISTEN (PRE/POST LISTEN at 300% and above) in the footer.
Play the DAW and choose PRE or POST. Each switch crossfades over 5 ms.
Press MATCH to level PRE to POST. Hypha measures the latest four seconds of playback (at least three, BS.1770 loudness, up to ±24 dB) and applies that gain to PRE only; the PRE control shows it, for example PRE +3.2 dB. If PRE would have to rise above the larger of −1 dBTP and the measured true peaks, which is common with a loud, limited master, MATCH asks first:
Closing the menu changes nothing. MATCH is fixed: it does not follow later level changes, so press it again after changing the chain. Each session starts PRE at unity gain. If a raised PRE would still peak above the ceiling later in the song, that block plays POST. PRE returns automatically when it is safe at the approved gain. A new gain while PRE plays glides over 50 ms instead of jumping.
Once matched, pressing MATCH offers MATCH again or AUTO. With AUTO, PRE follows POST: every second of playback Hypha measures again and moves PRE once it is 0.5 dB or more away. The control reads AUTO. AUTO never moves POST, never raises PRE above the ceiling approved at MATCH and never moves PRE more than 6 dB from that MATCH; it stops and says why instead. Silence changes nothing. AUTO is not available after a TP LIMIT match, and it stops at END. Hiding the editor also stops AUTO and holds its last gain; the next time you show the editor, it reports the stop. Select AUTO again explicitly to resume following. These values are experimental until listening tests settle them.
Press END once to end the comparison and clear MATCH. If POST was lowered, the button names the rise in advance, for example END +7.0 dB. Hypha first returns from PRE to POST, then restores normal POST level with the existing slow ramp (500 ms for the full gain range). Completion waits for actual audio output at unity; without callbacks it stays pending.
Closing and reopening the window keeps LISTEN, MATCH and the same BLIND trial running. A changed pair, format or restored saved state ends the old comparison and holds approved attenuation. RETURN +7.0 dB, for example, explicitly restores normal level. Offline render, a bypass the DAW reports, and another audition are never attenuated. Measurements remain before this path.
Logic's cycle path relies on every intervening plug-in reporting its latency correctly and Logic compensating it, as required by R-12. Set Logic’s Plug-in Latency Compensation to All. Off, Audio and Instrument Tracks on auxiliary/output chains, and Low Latency Mode require separate host acceptance; an unreported bypass or delay cannot be inferred from clock equality. Equal presentation values are accepted together with the render proof; they cannot distinguish zero latency from an unreported delay. A latency-changing setting can also leave a short interval before its change becomes observable. Hypha cannot repair that missing host information. The callback proof and regression fixtures do not replace actual host acceptance for low-latency mode, auxiliary buses, live inputs, other buffers/rates or dynamic PDC changes. An unverified block plays POST; fresh proof resumes the same BLIND trial.
For a DAW loop, press LISTEN or BLIND during loop playback. No Hypha LOOP button, LOOP-off step or per-lap approval is needed. Initial comparison needs independent timing proof:
Logic Pro executable with a
readable version; the discovery measurements used 12.2. Missing, reversed or contradictory
reports are refused. Other AU hosts retain the positive-difference and unique observed-loop
rule. Initial VST3/AU mixed-clock pairs are not certified.If proof stays unavailable for three seconds or the loop is too short, Hypha explains the condition and keeps POST playing and leaves END available. It does not present LOOP-off or re-MATCH as the normal workflow. The rules also allow ordinary LISTEN → MATCH playback followed by LOOP, while retaining the fixed gain and selection at confirmed wraps. Short loops can accumulate real playback time for MATCH again; Hypha does not duplicate recorded samples.
The approved MATCH gain and ceiling stay fixed during timing recovery. A stop, seek, latency change, missing clock, callback gap or brief API expiry withholds only unverified PRE. Both LISTEN and BLIND resume automatically after fresh timing and PCM proof. This is not a new level match. State restore and pair, format or PRE-owner changes end the old authority. A failed or cancelled rematch never discards the previous gain.
Some hosts hold POST's reported position at the loop start while delayed audio is still arriving. That interval stays on POST until the occurrence is proven, not on unverified PRE. Native full-frame tests cover initial entry, dynamic processing, clamped wraps and failure paths. Real-host evidence belongs to its exact commit, host, format and configuration; it does not certify every host, all transitions or signed retail AAX merely because a bundle builds.
While a session runs, END and MENU stay at every size; MENU includes any controls that do not fit the footer. You can close Hypha or open another plug-in while comparing; reopening Hypha shows the existing comparison, including the same BLIND assignment. MATCH accepts a request before enough audio is available and completes on the processor, including while its editor is closed. If lowering POST is needed, it still asks for approval when the editor is available.
BLIND is a one-pass live blind comparison, without Capture or rewinding. Press BLIND, keep the DAW playing, and Hypha prepares a fixed level match. Switch SOURCE 1 / SOURCE 2 as often as needed during that same playback. Once both have actually sounded, REVEAL shows the PRE/POST assignment in one click, without a preference question or another playback. You can keep switching after reveal, or press END. Live Blind does not collect preference answers, save a vote, learn from it, or change audio from it. No Kirin OS is required.
Alternatively use LISTEN → MATCH → BLIND. A valid, fully applied MATCH is reused without another measurement; AUTO stops and the gain is frozen. TP LIMIT is not a full match. If matching requires lowering POST, approval names both the reduction and the rise on END before applying it. END ends the entire comparison, not a return to matched LISTEN. Any rise is shown before pressing END, ramped, and confirmed by the Audio Thread. Closing the window alone never raises the level. If restoring state leaves POST attenuated, use the displayed RETURN +x dB before starting a new LISTEN or BLIND session. Only a still-active session can carry its own approved attenuation into BLIND. A match outside the final ±24 dB range reports why it cannot start; it does not remain in preparation without an explanation.
Live Blind compares different moments within one continuous playback; it does not claim identical sample ranges, an ABX identification test, or proof of better sound. A confirmed loop may continue the same trial across timing interruptions. Each unverified block plays POST, and fresh proof returns to the same hidden assignment without END or reselection. A fallback is never counted as hearing PRE; REVEAL adds one short note if a PRE interval used POST. Source buttons show your selection, while internal played receipts count only the source that actually sounded.
Restoring plug-in state also cancels the old trial and MATCH, even if the same PRE pair is restored. Existing attenuation stays held; an END already requested continues to actual normal level. The first detected interruption reason survives teardown internally. An actual LISTEN interruption is explained once in the footer; at normal output level that notice clears after three seconds. Pairing PRE or reopening saved settings alone does not show a listening warning. A later callback cannot overwrite the retained reason or attribute an old failure to a new attempt. The notice describes the detected condition, not an inferred fault in another plug-in. Initial calibration and level preparation are quiet. LISTEN, MATCH and BLIND accept the request and use fresh, complete evidence when ready. Short recovery has no WAIT, HELD or checking notice. After three seconds without usable evidence, a brief reason and recovery action appear. END and any held attenuation keep their existing explicit level-return controls.
Blind interruption and its first reason are committed together for the sampled trial; named PRE selection uses the same command-bound rule, so a late callback cannot clear a newer selection. Reference and its access panel follow the parent editor's current body bounds when a recovery line appears or disappears. Unchanged geometry does not relayout those panes. Meters, names, gain details and their accessibility are isolated until the comparison ends. The signed 1.1.51 release has passed the one-pass/END flow and safe session reopen in REAPER 7.71 VST3 stereo on Intel macOS. That result does not establish the same acceptance in every format or host configuration.
The normal header's Meter Context control opens a descriptive choice rather than switching on one click. Blind inherits it when opened and keeps any override within that comparison. 2MIX identifies a mix or master bus and uses continuous active sections for Gain Match. TRACK/STEM identifies an individual track or stem and uses short or sparse event energy. Hypha never infers or changes this choice from channel count, names, routing, or signal level.
Reference Version Blind is a separate whole-song comparison between live DAW A and a measured, acoustically matched Version V from Kirin OS, shown on the same screen as BLIND. Its four-second A observation proves calibration only; it neither replaces live A nor claims whole-song loudness or an immutable whole-song identity for the current DAW input.
Real-time display of LUFS-M and LUFS-S, True Peak (recent), and Crest Factor during playback. LUFS-M and LUFS-S keep independent playback-pass maximums. POST displays the difference between its own measurements and the paired PRE. Top-level FREQ shows signed POST − PRE spectrum. Under TIME, DRUM, SHARP and LIVE provide their on-demand time observations. Only the visible optional analyzer runs; two POST instances may own slots, while a third identifies the owners and waits.
Closing the GUI does not stop measurement. The audio thread continues running as long as the plugin is loaded in the DAW.
At 100% and 125% the footer folds into the header's second row: the domain cycle, VU, MENU, the size and POST / Δ share one row, and the measurement reaches the bottom edge. Status lines (a toast, a persistent status, a running capture, or WAITING and BYPASSED when nothing else is shown) appear in a bounded one-line strip over the bottom edge of the measurement while they last; clicking feedback opens the full details. At 150% and above, feedback stays in the footer's left status area even when the full text is longer than the available width. On Hybrid VU, the bottom notice and the centred calibration legend occupy separate parts of the existing row.
100% is for reading, not operating. The buttons that take room (CURRENT / MAX, the history range and FOCUS, LR / MID / SIDE, M/S, PSB, MARK, RAW / SHAPE, and DRUM's VIEW and BAND) are chosen at 125% and above; a choice made there stays in force at 100%, where only a non-default one (MID, SIDE, SHAPE, MARK, HOLD, LOCK, a DRUM band) is named. Clicking the plot itself (FREQ's frequency lock, DRUM's hit selection) works at every size. The room goes to the measurement: LEVEL reads S, I (Crest for a track or stem) and the Session's MAX TP; TIME HISTORY draws S and TP; DRUM shows one row of history over its four values, large; FREQ's plot takes the control rows and the right-hand absolute axis; SPACE's scatter takes the full height with BAL and CORR beside it.
The VU button in the footer (in the header's second row at 100% and 125%) opens the same Hybrid VU during ordinary playback; it is not a separate measurement mode and does not alter the selected domain. The selection survives closing and reopening the editor while that plug-in instance remains loaded. In the Hybrid VU, CLEAR releases only the per-channel held True Peak markers and Clip indicators. Live TP, the 300 ms VU needles, Meter Session statistics and history, and Record/Keep data remain intact. A signal that is still clipping lights the indicator again on the next 100 ms observation.
Click 0 VU = −18 dBFS below the meter to choose −12, −14, −16, −18 or −20 dBFS (default −18). Both needles use the same reference, and an exact PRE/POST pair shares that reference on this computer. The choice is saved per chain; changing pairs selects that chain's reference. It changes the needle's displayed level only. Audio, LUFS, True Peak and the 300 ms response stay unchanged. Temporary identity contention retains the adopted reference and disables selection until the chain is resolved. A failed save retains the previous choice and reports the reason.
With a Kirin OS license, POST can keep a session record.
.kirin record.Integrated Loudness and session-maximum True Peak accumulate across DAW transport stops while the same Keep remains active. If the DAW loops during Keep, the Keep continues: the record's timeline holds the first continuous pass, and later passes count toward the Keep summary (Integrated, LRA, Max TP and PLR) and the live display. During an offline bounce/export, POST auto-runs the same cleanup as Stop when the host reports that offline processing has ended. If a host does not emit that offline-end edge, Keep remains armed until manual Stop or the idle auto-stop backstop after 10 minutes without Active signal.
During Keep, intermediate I/LRA readouts reuse an exact-energy cache with a bounded auxiliary node budget. This avoids rescanning the complete recording after every small input block. Stopping Keep still drains the input and uses the original canonical finalization for the saved Record; True Peak and the measured time range retain their original definitions.
After Stop, the final Record display remains visible until the next playback produces its first newly computed Watch result; that result returns the grid to Watch without showing stale Watch data in between. Multiple pairs record independently.
If measurement samples are ever dropped during a recording (for example, on a buffer overflow), the dropped-sample count and an integrity flag are written into the session data. Incomplete measurement is recorded as incomplete, never presented as complete.
Kirin Hypha is one piece of a larger ecosystem. With Kirin OS, session data is written to plugin_data in a structured JSON schema and can be bundled with C2PA provenance into a tamper-evident .kirin file alongside the audio.
Hypha itself remains standalone and free — Kirin OS is not required to use Watch mode or local PRE/POST Blind Compare.
Kirin OS is available now. More at kirinmastering.com.
macOS delivers signed, notarized PRE/POST AU, VST3 and AAX plug-ins as Universal binaries. Windows delivers PRE/POST VST3 and AAX x64 in an Authenticode-signed installer. The AAX plug-ins use Native processing; AudioSuite is not included. Format availability and the feature-specific host timing conditions documented above are separate requirements.
Not currently supported: Linux · CLAP
Contributors: read CONTRIBUTING.md and AGENTS.md. The
build guide documents unsigned native builds, and
release qualification covers signing, acceptance and publication.
node scripts/build_hypha.mjs --help and --release --help work without SDKs, credentials or iLok.
For a quick unsigned GUI/DSP test build, run node scripts/build_hypha.mjs --without-aax
(Mac: PRE/POST AU+VST3 Universal; Windows: PRE/POST VST3 x64; no AAX SDK or iLok). The default still
builds all formats; this shortcut is not a full-format or release gate.
For all supported formats in one local build, use
node scripts/build_hypha.mjs: macOS produces PRE/POST × AAX/AU/VST3
as Intel + Apple Silicon Universal bundles; Windows produces PRE/POST × AAX/VST3 for x64.
An external licensed AAX SDK is required. The same command runs natively on each OS:
node scripts/build_hypha.mjs --sdk /absolute/external/aax-sdk-root --license-confirmed
This is an unsigned diagnostic build, with no iLok, CI, installation or publication step.
Use --dry-run to inspect the plan and --verify-only to recheck saved binaries without rebuilding.
Signing and release qualification retain their independent mandatory gates.
For the complete workflow through the homepage update, use the same entry's
--release mode. It coordinates the approved signing/notarization
producers, same-commit Windows installer, the acceptance steps, Lemon Squeezy verification,
immutable GitHub Release, EN/JA homepage links, staged production deployment and public download
hash checks. Human host and Lemon Squeezy checkpoints and explicit publication authorization remain
mandatory.
node scripts/build_hypha.mjs --release --help
For a quick AAX-free GUI/DSP build on either supported OS:
git clone --recurse-submodules https://github.com/heyalohaloha/kirin_hypha.git
cd kirin_hypha
node scripts/build_hypha.mjs --without-aax
This creates PRE/POST AU + VST3 Universal on macOS and VST3 x64 on Windows. It requires no AAX SDK or iLok and does not replace the full-format release gates. Follow the build guide for toolchains, output paths and validation.
Requires Node.js, Git, CMake, Rust stable and the pinned JUCE submodule. macOS also needs the Xcode toolchain and both Rust CPU targets; Windows needs Visual Studio Build Tools with C++ and the Windows SDK, Git Bash and the Rust MSVC x64 target. The build guide lists the platform prerequisites. The shipping formats share one JUCE role-parameterised processor/editor: PRE/POST × AU/VST3/AAX on macOS and PRE/POST × VST3/AAX on Windows. The VST3 wrapper preserves the original component IDs and migrates legacy nih-plug state so existing DAW sessions keep their identities and pair names.
For the AAX-free macOS build above, run the VST3 gate before manual DAW validation:
scripts/validate_macos_pluginval.sh target/hypha-build/macos-universal-no-aax
For the default full-format diagnostic build, pass target/hypha-build/macos-universal instead.
This VST3 check recreates the exact role-first installed layout (PRE Kirin Hypha.vst3 / POST Kirin Hypha.vst3) in an isolated runtime directory, resolves each executable through CFBundleExecutable, verifies the preserved component IDs and host names, and then runs pluginval at strictness level 5 against those staged bundles. Logs are written to target/pluginval/logs/macos, while plug-in runtime writes stay under target/pluginval/runtime/macos/. Override with PLUGINVAL_STRICTNESS_LEVEL=10 only for the slower stress pass. If Steinberg's VST3 validator is installed, pass it with VST3_VALIDATOR_BIN=/path/to/validator.
Start with the release entry and the AAX build and signing guide. The unified command coordinates Mac signing/notarization/PACE, the reviewed Windows factory, exact-candidate acceptance, package creation and the three publication channels:
node scripts/build_hypha.mjs --release --help
The full release contains six Mac bundles (PRE/POST × AU/VST3/AAX) and four Windows bundles (PRE/POST × VST3/AAX). The coordinator uses the existing release-set producer to prepare the signed/notarized macOS PKG, the same-release recovery ZIP and the qualified Windows installer. Inspect and resume the private profile according to the release guide; do not substitute the legacy VST3-only packaging command for this full release.
release_state/ is deliberately ignored: it contains release-operator targets and upload readiness, not source. Fill the local state from the generated .pkg.json sidecar and keep it out of commits. Publish the .pkg.json artifact manifest and .pkg.sha256 with the GitHub Release.
The installer package requires a Developer ID Installer certificate in the keychain. A Developer ID Application certificate signs the plug-in bundles, but it is not enough to sign the .pkg.
Unsigned smoke-test packages are intentionally marked UNSIGNED-DO-NOT-UPLOAD and are written under /tmp/kirin_hypha_pkg_smoke/:
KIRIN_SKIP_PKG_SIGN=1 KIRIN_SKIP_PKG_NOTARIZE=1 \
node scripts/ls_release/build_kirin_hypha_pkg.mjs
Signed Windows installers require an independently controlled signing environment and reviewed exact source. A successful exact-source public CI run and a reviewed private unsigned producer on windows-latest bind the signed PRE/POST payload, installer and uninstaller to that commit. The same reviewed factory signs a pending candidate, then promotes it after dedicated-host validation; the release entry qualifies the complete signed-full delivery and its origin. Same-version reinstall, prior-release upgrade, isolated uninstall, pluginval and dedicated-host acceptance remain mandatory release gates. Signing credentials and operator configuration must remain outside this public GPL repository. Public CI remains unsigned and its held binary uploads do not supply the formal candidate. It has no signing credential or persistent-runner route; manual dispatch cannot enable signing. Follow the four operator gates in the distribution gate: before Windows AAX signing or build_only, before candidate signing, after promotion before coordinator/macOS operations, and before A4 and each A5 resume. Windows external validation precedes promotion; A3 means the coordinator freeze. The current formal Windows route accepts only an empty update key; public CI key inputs do not produce a formal candidate. See the release entry.
The exposure report records the trust boundary.
The macOS recovery ZIP is a required artifact of the same full release, with the same signed payloads and release identity as the normal PKG. The Windows manual VST3 ZIP is a separate diagnostic/recovery fallback; it does not replace the full signed installer.
Do not run the signed release checks inside a sandboxed child process; macOS codesign can report a false invalid signature for valid notarized plugin bundles in that context.
After verification passes, upload Kirin-Hypha-<version>-macOS-Universal.pkg and
Kirin-Hypha-<version>-Windows-x64-Setup.exe to each configured Lemon Squeezy product.
Public diagnostic CI retains all required build/validation jobs and logs. Preview artifacts are published only for inputs accepted for that use; binary/installer uploads remain held pending actual NOTICE, component license and Corresponding Source delivery evidence. Unresolved materials keep individual holds in the distribution registry.
GNU General Public License v3.0
Kirin Hypha is released under GPLv3 to keep the measurement layer auditable. The numbers a tool produces should be inspectable — any user, researcher, or engineer can read the code that generated them. Derivative works inherit the same openness.
Release downloads include the Corresponding Source archive and third-party license notices. The archive retains the GPL-covered AAX SDK source used by the build. The PACE signature verification component included with AAX is covered by its separate PACE terms; see the Legal notices delivered with the installer and recovery ZIP.
Built on JUCE. The legacy VST3 identity and state compatibility path uses nih-plug by Robbert van der Helm.
Kirin Hypha — observation, kept simple.