# Credits and Acknowledgements Mediante exists because of work done by other people across three decades of Amiga and Windows tracker history. This file records what we owe and to whom. Attribution for third-party code **bundled or shipped** in Mediante — which carries actual licence obligations, not just courtesy — is in [THIRD-PARTY-NOTICES.md](./THIRD-PARTY-NOTICES.md). This file covers both, and is explicit about which is which, because the distinction matters: - **Referenced** — we read it, then wrote our own implementation. - **Ported** — our code is a translation of theirs. That is a derivative work, and the upstream licence follows it into Mediante. > **Open licensing questions.** Two items below remain marked ⚠ and are under > review: the ADPCM codec's provenance, and the unlicensed Wells sources the > Shapee and Ether ports are derived from. *(Two questions flagged here earlier were > resolved on 2026-07-29 — HighLife, by moving Mediante to GPL-2-or-later, and > the OctaMED player sources, whose terms only bill commercial releases. See > those sections.)* Nothing here should be read as a settled legal position. --- ## MED, OctaMED and MED SoundStudio The MED line was created and developed by **Teijo Kinnunen** (later trading as RBF Software), from the Amiga in 1989 through OctaMED, OctaMED Pro, OctaMED SoundStudio (Amiga, 1996) and MED SoundStudio (Windows). The MMD0/MMD1/MMD2/ MMD3 formats, the effect-command set, the synth-instrument scripting language and the Windows-era filter and effect-group features are his design. Mediante's job is to play those files faithfully — every effect, quirk and creative liberty module authors relied on. The whole project is downstream of that design work. ### The OctaMED SoundStudio Amiga player sources — **ported** `proplayer.a`, `promixplayer.a`, `med-mixasm.a` and `mmd_fileformat.doc`, from **`dev/src/OcSS_src.lha`** on Aminet — "Programer player routines for the new OctaMED Soundstudio", uploaded by RBF Software on 1996-08-03, copyright Teijo Kinnunen. These are the canonical reference for effect semantics, the vibrato / slide / tremolo math and the MMD struct layouts, and Mediante's per-tick effect handlers are traced to them line-by-line, with the assembly quoted in our comments. **On licensing.** The package is copyright RBF Software (Teijo Kinnunen and Ray Burt-Frost) and is explicitly not public domain. Its `licence.doc` asks for a paid programmers' licence for commercial, shareware or licenceware releases, and encourages free use in releases made at no charge. Mediante ships **none** of their code — the player handlers are our own JavaScript — and is released free of charge, so no licence fee arises. The only material of theirs reproduced here is a handful of short assembly excerpts quoted in source comments, cited by file and line, to document where a behaviour came from. --- ## discoDSP HighLife — **ported** MED SoundStudio for Windows does not implement its own advanced sampler. It embeds **HighLife**, the sampler published by **discoDSP** and originally written by **John Argüelles Rius (Arguru)**. MED gives it a dedicated editor (the "HL" button in Instrument Properties), ships discoDSP's own manual as its HighLife help file, and stores HighLife programs inside MMD2/MMD3 modules as instrument type −3. So Mediante's support for those instruments is support for discoDSP's engine, not Teijo Kinnunen's — a debt the earlier version of this file failed to record at all. discoDSP released HighLife's C++ source in 2007. Parts of `js/audio-worker.js` are **direct JavaScript translations** of it, not independent reimplementations — our own comments say so, citing the functions: `CHighLifeEnvelope::work()` (linear ADSR with a quartic output curve), the 4-point cubic Hermite interpolator, and the `get_env_rate()` timing formula. The **mono / legato / poly voice handling is our own design**, informed by the source rather than translated from it. *(An earlier version of this file listed it as a port. Audited 2026-07-29 against `HighLifeVoice.cpp:696-773` and `HighLifePlug.cpp:391/475/571-581`, and that was wrong.)* What we took from HighLife is the `ply_mode` enum and its numbering — 0 = mono, 1 = legato, 2 = poly, default mono — plus two behavioural facts: legato re-attacks the envelope only when it is already in release, and a busy-voice retrigger writes the envelope stage directly rather than calling `trigger()`, so the envelope value carries over instead of snapping to zero. Everything around those facts is ours. HighLife uses a flat `MAX_POLYPHONY` voice array with an allocator (`plug_get_free_voice()`) that steals the earliest voice by counter; Mediante uses per-track "ghost" sub-voices with a pool cap, which is a different mechanism reached independently. We have **not** ported HighLife's voice stealing, its `plug_note_off()` legato-note tracking, or its `plug_trigger()` zone scan and resonance-group *off-by* logic. Later contributors named in that source's ChangeLog: **Chris Walton** (VST 2.4 port), **George Yohng** — who created the `.hilife` instrument format our parser is built around — and **Andreas Sumerauer**. What is ours: the MMD2/MMD3 HighLife instrument-chunk parser in `js/parser.js`. MED ships a *modified* HighLife whose on-disk structures differ from the public source, so the field map came from disassembling MED.exe and scanning real `.hilife` files, using the released source only as a guide to field order. Zone selection, pitch mapping and gain staging were established empirically against Windows MED renders. We implement zone selection, pitch, looping and the amplitude envelope; the filter, LFO, modulation envelope, glide, effects and simultaneous multi-zone layering are not implemented. **Licence — resolved 2026-07-29.** This was flagged here as an open question: the HighLife sources carry a four-clause BSD header whose clause 4 requires an acknowledgement in advertising material, which is GPL-incompatible, and Mediante was GPL-3. It resolved as follows. discoDSP published the same code twice, and both grants stand: the BSD-4 headers, and a GPL-2.0 `LICENSE` added by discoDSP's own GitHub account in June 2023. The two repositories carrying this source are byte-for-byte identical (verified by git blob SHA), so the GPL-2 offer applies to the copy we already had. **Mediante now relies on the GPL-2 grant and is licensed GPL-2.0-or-later**, because discoDSP's GPL-2 offer has no "or later" wording and so cannot combine with GPL-3. Full reasoning: `K:/Mediante/stuff/highlife-source/PROVENANCE.md`. We are therefore not bound by the advertising clause — we are not taking the BSD offer. We display the acknowledgement anyway, here and in the About box, because it costs nothing and covers any file whose GPL-2 relicensing was not discoDSP's to make: This product includes software developed by discoDSP http://www.discodsp.com/ and contributors. discoDSP and the HighLife contributors are not affiliated with Mediante, have not endorsed it, and have not reviewed this implementation. HighLife remains an active discoDSP product; what Mediante draws on is the open-source release, which is a separate artefact from what discoDSP sells today. --- ## Code we ship that others wrote Each of these is a **port** — our file is a translation of theirs. Licence text and copyright notices are in [THIRD-PARTY-NOTICES.md](./THIRD-PARTY-NOTICES.md). - **pt2-clone** — Olav Sørensen. `js/pt-replayer.js` is a faithful port of its ProTracker 2.3D replayer, and the 59-tap half-band FIR coefficients in the 2× oversampling path in `js/audio-worker.js` are copied verbatim. - **libxmp** — the MED2 / MED3 / MED4 (pre-MMD) loader in `js/parser.js` is ported from its `med2_load.c` / `med3_load.c` / `med4_load.c`. - **amigadepacker** — `ppdepack.c` by Stuart Caie and `unsqsh.c` by jah@fh-zwickau.de and Claudio Matsuoka et al. PowerPacker (PP20) and XPK-SQSH in `js/depack.js` are hand-ports of these. *(The earlier version of this file claimed these were independent implementations from published specs. That was wrong — the source file itself names them.)* - **ancient** — Teemu Suutari. The lh.library (LhArc/LZH) core behind XPK-LHLB and SFCD decompression in `js/depack.js`. - **LZO / minilzo** — Markus F.X.J. Oberhumer. Windows-MED's `OctaMEDCmpr0` payload is a stock LZO1X stream. - **Freeverb** — Jezar at Dreampoint, public domain. MED's echo type 3 is Freeverb; ours follows `revmodel.cpp` / `tuning.h`. - **Zerius Vocoder** — Emanuel Borsboom, with FFT code by Steven Trainoff. `js/zerius-vocoder.js` is a port of version 1.3 (2002); it is what the sample editor's Vocoder window runs. The original's one condition is that the copyright notice stays intact and changes are noted, and the file's header is where both live. - **Sun Microsystems g72x reference codec** — the G.721/G.723 ADPCM sample decompressor in `js/adpcm.js`. Sun's own permissive terms ("provided for unrestricted use"), confirmed against the upstream source 2026-08-20 — not public domain, as this file previously said. ### Bundled binaries Shipped in `lib/` and loaded at runtime — see the notices file: - **libopenmpt** 0.8.5 (BSD-3-Clause) — plays the non-MED formats. - **libflac.js** / **libFLAC** 1.3.3 — FLAC render and stem export. - **Web Audio Modules SDK** 0.0.12 (MIT) — `lib/wam-sdk.js`, vendored verbatim. Everything in the plugin subsystem stands on it: the host, our own seven effects, and the offline render Worker, which serialises its factories to bring processors up where there is no AudioContext to load a worklet into. ### The Web Audio Modules community The Effects picker's Featured section is 36 plugins curated from the [wam-community index](https://www.webaudiomodules.com/community/plugins.json), published by two groups: - **Wimmics** — the guitar-pedal-styled effects, 33 of the 58 indexed entries. - **Sequencer Party** (boourns) — the burns-audio collection, 25 entries, which also powers sequencer.party. We ship none of their code: the list holds identities and URLs, and the browser fetches a bundle only when someone picks that plugin. They are why Mediante has a plugin ecosystem rather than just the seven effects we wrote. Note that **none of these plugins declares a licence** — not in the index, not in either source repository (checked 2026-08-20). Fetching them at runtime is fine; bundling or mirroring them would need their authors' permission first. See [THIRD-PARTY-NOTICES.md](./THIRD-PARTY-NOTICES.md). --- ## Cloud services — called at runtime, nothing redistributed Two optional commands in the sample editor do not run on your machine. Both are off until you paste your own key and say yes once, both name where the audio goes before it goes, and neither ships a line of anybody else's code — see [THIRD-PARTY-NOTICES.md](./THIRD-PARTY-NOTICES.md) for the obligations. - **A||GO / A-SPADE** (`Online ▸ Declip with A||GO…`). A||GO is a scientific web-application platform operated by **SED, IRISA / Inria** (Rennes, France); **A-SPADE**, the Analysis SParse Audio DEclipper, was developed by the **PANAMA** project-team, a joint team of **Inria** and **CNRS**. Used under its stated non-commercial terms, which require the citation: > S. Kitić, N. Bertin and R. Gribonval. *Sparsity and cosparsity for audio > declipping: a flexible non-convex approach.* In Latent Variable Analysis and > Signal Separation, Liberec, 2015. See also S. Kitić, N. Bertin, R. Gribonval, *Audio Declipping by Cosparse Hard Thresholding*, iTwist 2014. Project page . - **MVSep** (`Online ▸ MVSep…`). A commercial source-separation service. **This integration is unofficial**: MVSep neither endorses nor maintains it, and their own documentation describes every third-party client that way. Terms , privacy . Neither is affiliated with or endorses Mediante. --- ## Reference material — read, not copied Unlike everything above, these informed our implementation without our copying from them. - **OpenMPT** (`soundlib/Load_med.cpp`). Confirmed several MMD struct offsets and the BPM-mode tempo formula; the `MMDTAG_*` names in our comments are theirs. Our MMD0–MMD3 parser is an independent implementation. OpenMPT is BSD-3-Clause. *(libopenmpt is a separate matter — we redistribute that as a binary, so it appears in the notices file.)* - **mikmod** (sezero/mikmod). Cross-checked the cmd 0A / 0D nibble-priority behaviour. *(The earlier version of this file also claimed cmd 15 finetune clamping and cmd 05 vibrato dispatch. The first was never implemented; the second came from OctaMED v1's `modplayer.a`, not mikmod.)* - **Snappymaria's mmd-convert** — cross-reference for the Windows-MED filter command encodings (cmds 23/24/25) and the cutoff→Hz mapping. - **MED help files and `mmd_fileformat.doc`** — written specs for the effect set, the multi-page cell layout and the effect-group system. ### Declipping and dequantisation — referenced `js/sample-restore.js` implements sparse-optimisation declipping and phase-aware dequantisation. It was written from the papers' equations and from our own Python ports of them; the reference MATLAB codes below were **not opened** while writing it, and no function in that file is a line-by-line translation of any of them. - **Kitić, Bertin, Gribonval — "Sparsity and cosparsity for audio declipping: a flexible non-convex approach"**, LVA/ICA 2015. — the SPADE family; our `aspade` solver is the analysis variant. This is also the paper the A||GO declipping web service asks to be cited. - **Záviška, Rajmic, Ozerov, Rencker — "A Survey and an Extensive Evaluation of Popular Audio Declipping Methods"**, IEEE JSTSP 2021, arXiv:2007.07663. — the source of the parabola-weighted ℓ1 formulation and of the finding that weights growing quadratically with frequency declip best. Reference code `rajmic/declipping2020_codes` is **GPL-3.0**; not used. - **Záviška, Rajmic, Mokrý — "Audio Declipping Performance Enhancement via Crossfading"**, Signal Processing 2021, arXiv:2104.03074. — crossfading the reconstruction into the reliable samples rather than substituting them. - **Mokrý, Rajmic, Záviška — "Flexible framework for audio restoration"**, DAFx 2020, arXiv:2008.11961. — the Chambolle-Pock formulation shared by our declipper and dequantiser. - **Záviška, Rajmic — "Analysis Social Sparsity Audio Declipper"**, arXiv:2205.10215. — the analysis empirical-Wiener shrinkage used by our `ew` preset. - **Kovanda, Rajmic — PHADQ, "Phase-aware audio dequantization"**, arXiv:2510.16813. — the iPC-DGT prior our dequantiser minimises. Reference implementation `vojtechkovanda/PHADQ`; **licence not stated in the repository**, so it was treated as all-rights-reserved and not consulted. Two constants reached our code through our Python port rather than from the paper's prose — the two eight-entry λ tables and the differentiated-Hann window formula — and are noted as such in `stuff/restore-2026-09-06.md` §6. - **Thimeo Stereo Tool** — closed source, no patent, no paper. Its published documentation describes the DETECTION layer our clip detector borrows from (tracked long/short-term peaks with an "ignore loudest N %" trim, tilted clip lines with automatic bypass, square-wave guards, a per-region accept/reject rule). No code was seen; the solver is not ours to copy and we did not try. Details in `stuff/research-stereotool-2026-09-06.md`. - **LTFAT** (`dgtreal`, `main_ltfat.m`) — the phase convention question in `stuff/restore-2026-09-06.md` §2.1 was settled against LTFAT's documented semantics. No LTFAT code is used; our Gabor frame is built on the local FFT in `js/sample-restore.js`. --- ### WaveThresh — referenced `plugins/mediante-wavethresh/` is a sinusoid/residual splitter rebuilt from Jez Wells' published research, not from his plugin. His original WaveThresh (a VST, circa 2003) was never opened and its source is not available; every line of ours was written from the papers below and settled by measurement. The plugin's descriptor links to his page, which is where the demo recordings that started this live. - **Wells, Murphy — "Real-Time Spectral Expansion for Creative and Remedial Sound Transformation"**, DAFx-03 pp. 61–64 — the original WaveThresh paper. - **Wells — "Real-Time Spectral Modelling of Audio for Creative Sound Transformation"**, PhD thesis, University of York, January 2006 — §4.5 is the five-point sinusoidality test we implement, including the two-sided comparison of its eq. 4.14 and the expected-variance correction. - **Wells, Murphy — "High Accuracy Frame-by-Frame Non-Stationary Sinusoidal Modelling"**, DAFx-06 pp. 253–258 — reassignment eqs. (2) and (3), and the iterative two-surface recovery of amplitude and frequency change. Our tables are generated from its equations by `stuff/regression/gen-rda-tables.js`, at 32×32 where the thesis uses 100×100. - **Wells, Murphy — "Short-Time Wavelet Analysis of Analytic Residuals for Real-Time Spectral Modelling"**, DAFx-07 pp. 277–284 — §3, why the residual is taken by spectral subtraction rather than in the time domain in a frame-by-frame system, and the zeroing width. - **Desainte-Catherine, Marchand — "High-Precision Fourier Analysis of Sounds Using Signal Derivatives"**, JAES 48(7/8), 2000, and **Auger, Flandrin — "Improving the Readability of Time-Frequency and Time-Scale Representations by the Reassignment Method"**, IEEE Trans. Signal Processing 43(5), 1995 — the frequency-reassignment estimate the default sinusoid test is built on: the spectrum of the signal times the window's derivative, taken here as a three-tap combination of the plain spectrum for a periodic Hann window. Wells' shipped WaveThresh 2.0 uses the same estimate, which its disassembly showed and which is how it came to be tried here. - **PyWavelets** (Lee et al., JOSS 2019, MIT) — the filter coefficients of the 48 wavelet banks are taken from its tables; the periodised transform that applies them is ours. - The Daubechies-4 wavelet transform followed the periodic formulation in *Numerical Recipes* (Press et al.), rewritten from the description; no code was taken from it. It is now the db2 bank of the general transform above, which the gate holds to it to rounding. ### Shapee and Ether — **ported** ⚠ `plugins/mediante-shapee/` and `plugins/mediante-ether/` are two-input spectral processors ported in September 2026 from **Jez Wells'** VST plug-ins of the same names (circa 2002–2004), which implement algorithms conceived and published by **Christopher Penrose**. Unlike WaveThresh above, these are not rebuilt-from-papers: they are translations, and the section heading says so. - **Shapee** — from **`Shapee.m`**, Wells' MATLAB reference implementation (November 2004), read in the clear. Our band arithmetic is a line-by-line translation of its Σ|A|/Σ|F| region scaling; the STFT around it, the measured overlap-add normalisation, the per-frame form of the Normalise switch and the parameter surface are ours. The algorithm is Penrose's "Shapee", described in his work on adaptive composite signal processing. - **Ether** — from Penrose, "Extending Musical Mixing: Adaptive Composite Signal Processing", *Proceedings of the ICMC* 1999, p. 508, and from the compositing loop of Wells' `Ether.dll` read by static disassembly (2026-09-09; capstone + pefile, the rig of `stuff/med-exe-disasm`). No source for Ether exists publicly. What the disassembly settled — and what the guide alone would not have — is that the Cross weights bias only the magnitude COMPARISON and never the output, and the exact (Composite, Mag Sense) mode table. Our code is a fresh implementation of that logic; no instruction sequence or data was copied. - Both user guides (`EtherUserGuide.pdf`, `ShapeeUserGuide.pdf`) are the source for the parameter meanings, the window set and the alpha ranges. Wells' guides also record the workaround that these ports remove: with no side-chain in the VST 2 specification, both plug-ins read the LEFT and RIGHT channels of one stereo insert as their two input signals. Mediante routes an aux bus into a second input instead, so both are stereo. > **⚠ Open question.** Neither `Shapee.m` nor either plug-in carries a stated > licence; both were published for free download on Wells' pages without > terms. A port of `Shapee.m` is a derivative work of it, so this needs either > the author's permission or a decision to rewrite Shapee from the published > description alone (Ether, having been reimplemented from a disassembly and a > paper rather than from source, is on firmer ground). Wells and Penrose both > invite contact in the guides. Not a settled legal position. ## Reverse engineering Mediante's Windows-MED filter, resampler and tempo-clock behaviour were derived from static disassembly of MED 1.4 and MED SoundStudio 2.1: - The biquad filter coefficients (cmds 23/24/25) from the per-channel sweep updater at `0x0043e2af` and the coefficient computer at `0x00421c00`. - The 2-tap linear-interpolation resampler (the "MED" resampler mode) from the routine at `0x00437e90`. - The Windows-MED multi-page sweep-rate quirk, characterised empirically against MED renders and traced to the dispatcher-1 epilogue ordering. *(An earlier version of this file described MED 2.1 as a black-box reference only. That was inaccurate — it was disassembled, and MED 2.1 addresses are cited throughout our source. Two tempo-related addresses it cited no longer correspond to anything in the tree and have been dropped.)* Reverse engineering for interoperability is permitted in the EU under Article 6 of the Software Directive (2009/24/EC) and under equivalent UK provisions. In the US, intermediate copying for interoperability has been held to be fair use in *Sega v. Accolade* (9th Cir. 1992) and *Sony v. Connectix* (9th Cir. 2000); DMCA §1201(f) is a narrower provision about circumventing technological protection measures, and is not the general authority for the above. *(The earlier version of this file conflated those two doctrines.)* Mediante redistributes no part of any MED binary — only our own implementation of the observed playback semantics. --- ## Fonts Share Tech Mono (Carrois Type Design, Ralph du Carrois) and Oswald (the Oswald Project Authors), both under the SIL Open Font License 1.1. They are fetched from Google Fonts at page load rather than redistributed here. --- ## Development with AI assistance Mediante was developed by **Philip Kaulfuss** in pair-programming collaboration with **Claude**, Anthropic's AI assistant. In the interest of transparency: a substantial portion of the JavaScript implementation, the static disassembly analysis, the MMD parser, the audio-worklet DSP, the pattern editor and the research and verification scripts were written by Claude under Phil's direction. All architecture decisions, the test strategy, the choice of which observed MED behaviours to reproduce faithfully versus intentionally fix, and all A/B null-testing were Phil's calls. Phil assembled the test corpus from his own mod collection, listened critically to every iteration, and made the empirical observations that drove the correctness work. This file was drafted with Claude's help, and every attribution in it was checked against the shipped licence text or the source it describes before being written down.