Single Engine
VisualiserBase table
Pitch110 Hz
START Patch
END Patch
Morph / Export
Pitch / MIDIRoot frequency, note, MIDI
Bulk Explorer
Bulk Explorer starts from an independent copy of the initial Morph state. Import From Morph or load an exported JSON sidecar to replace that source, including its effective Pitch, Render Format, Transition / Cleanup, MPC Layout, and workspace-local Phase-Coherent Mode settings, then render repeatable local variations from current scalar values, explicit variation amounts, and checklist choices. Explorer Export leaves the current state unchanged. To hand-edit, audition, or ordinarily export a rendered result, load that result’s JSON sidecar and then use Copy To Morph.
The orange dot and underlined name mark Explorer’s current concrete value. Copy To Morph sends current values; checked variation pools are used only when Explorer renders files. Rendering does not replace the current state. Current and rendered values are recorded separately in Explorer JSON sidecars.
Current file: –
Explorer START
Explorer END
Explorer Morph / Export
Morph VariationMode, FFT anchors, curve
Pitch / MIDIRoot frequency, note, MIDI
Transition / CleanupCycle stepping, DC, normalisation, headroom
Render / File SettingsNaming, directions, format, MPC, download
Bulk Random
Bulk export runs random iterations. Each iteration creates a random START/END pair, then renders the selected direction(s). Preset guidance and guardrails are in the Notes tab.
Current file: –
Morph / Sound DesignMorph mode, FFT, START/END, curve, directions
Pitch / MIDIRoot frequency, note, MIDI
Transition / CleanupCycle stepping, DC, normalisation, headroom
Render / File SettingsNaming, format, MPC, download
Calculators
Use these calculators to plan morph exports in terms of Root Frequency, WAV output sample rate, output PCM samples per nominal root cycle, total output PCM samples, seconds, nominal root cycles, tempo, multisample maps, Pitch Offset, and Nominal Frequency. The Set buttons write into the persistent global Pitch / MIDI and Render Format defaults; synced workspaces follow those values. The Pitch Offset & Nominal Frequency calculator is arithmetic-only and does not publish settings.
Glossary
These definitions describe how this tool uses the terms. Other synths and DAWs may use “frame” or “wavetable” differently.
| Term | Meaning in this tool |
|---|---|
| Sample | In this export context, one output PCM sample: one stored amplitude value in the mono WAV. At a 96 kHz WAV output sample rate, one second contains 96,000 output PCM samples. |
| Sample Rate | How many output PCM samples are written per second in the exported WAV. The Calculators tab offers the same fixed rate choices as the render tabs. WAV output sample rate affects output PCM sample count and file size, but it does not force a pitch after another synth imports the WAV. |
| Frequency / Hz | Frequency is the number of cycles per second; hertz (Hz) is its unit. FWG distinguishes the shared Root Frequency from a patch's Pitch-Offset-adjusted Nominal Frequency. Filter Cutoff morphs logarithmically by frequency ratio rather than linearly in Hz. |
| Root Frequency | The shared base oscillator frequency used for audition and render planning. It determines root-cycle duration, Cycles render length, Cycle-stepped boundaries, and Per Cycle cleanup blocks even when Pitch Offset changes the oscillator's Nominal Frequency. |
| Pitch Offset | A static per-patch frequency offset measured in cents. Positive values raise and negative values lower the patch oscillator relative to Root Frequency; 1200 cents equals one octave. |
| Nominal Frequency | The oscillator frequency after applying the patch's static Pitch Offset to Root Frequency, before FM or other time-varying modulation. Root Frequency remains the basis for root-cycle render and cleanup geometry. |
| Cycle | In render-planning contexts, one nominal root cycle at Root Frequency. An audible oscillator period can differ after Pitch Offset or modulation. In Cycles render mode, export length is nominal root cycles ÷ Root Frequency. |
| Samples per Cycle | WAV output sample rate ÷ Root Frequency. For example, 96,000 Hz ÷ 187.5 Hz = 512 output PCM samples per nominal root cycle. Higher values make larger files and preserve more rendered cycle detail; lower values make smaller files and preserve less cycle detail. |
| Internal Table | The generated oscillator table used by the engine. This version stores 512 internal cycle samples before export rendering and interpolation. During WAV export, the oscillator is sampled at the chosen WAV output sample rate and Root Frequency. Low Root Frequencies produce more output PCM samples per nominal root cycle; high Root Frequencies produce fewer. Outputs below 512 PCM samples per nominal root cycle can be useful, but they use fewer output points than the internal cycle point count, so sharp or chaotic detail can be under-represented. |
| Wavetable Frame | One intended destination wavetable slot or waveform snapshot. The ordinary exported WAV is still linear PCM and does not inherently store wavetable-frame markers. |
| Morph Construction State | An intermediate sound state along START→END. It is an internal construction state, not necessarily a destination wavetable frame. |
| Render Unit / Length | The Render Format length control used by Morph, Bulk Random, and Explorer. It can mean Cycles, Seconds, or Samples. A workspace follows the persistent global value while synced and uses its own session-local value while detached. |
| Duration | The actual exported length in seconds. It can be entered directly in Seconds mode and quantised to whole output samples, derived as samples ÷ sample rate in Samples mode, or derived as cycles ÷ frequency in Cycles mode. |
| Bit Depth | The amplitude precision of the WAV file. It affects quantisation/noise floor and file size, but not pitch or render duration. |
Rule of Thumb
For sample-exact wavetable planning, choose the target output PCM samples per nominal root cycle first, then calculate Root Frequency as WAV output sample rate ÷ output PCM samples per nominal root cycle. At 96 kHz, 512 output PCM samples per nominal root cycle gives 187.5 Hz. A count of 512 happens to match the v3 internal-cycle point count numerically; higher output counts oversample the rendered/interpolated result and create larger files, while lower output counts preserve less rendered cycle detail.
Notes
Fractured Wavetable Generator is a browser-native wavetable and sound-design tool. These built-in notes cover the controls and behaviours most useful while the application is open. The project wiki contains the full manual, technical reference, compatibility details, and developer history.
Keyboard shortcuts
ESCcloses the topmost dialog or import overlay first. Otherwise, on the active Bulk or Explorer tab during a render it cancels that batch; from another FWG tab it stops audition audio without cancelling the batch. With no active batch it is the ordinary panic/stop action.- Leaving an FWG workspace mutes the current audition so drones do not continue unnoticed behind another workspace.
- Transport shortcuts remain active while ordinary controls and numeric fields have focus. True text-entry fields keep their normal typing behaviour.
Ctrl/Cmd+Page Up/Page Downis left to the browser for browser-tab navigation; committing a focused FWG control during that shortcut does not auto-start audition audio.- Numeric fields:
↑/↓changes by ±1 field unit;Shift+ arrow changes by ±10, preserving any fractional part and clamping to the field bounds.
| Context | Shortcut | Action |
|---|---|---|
| Global | ESC | Close top dialog/overlay; otherwise stop audio or cancel the active batch on its own tab |
| Playground | P | Play/Pause Playground Drone |
| Morph | S | Play/Pause Drone START |
| Morph | E | Play/Pause Drone END |
| Morph | F | Play/Pause Forward Morph |
| Morph | R | Toggle Reverse Morph |
| Morph | P | Play/Pause the most recently used Morph sound |
| Morph & Explorer | 1 / 2 / 3 | Toggle START / END / MORPH & EXPORT column when focus is not in an editable control |
Workspaces, persistence, Phase-Coherent Mode, and MPC
- Morph, Bulk Random, and Bulk Explorer own independent sound-design/render settings. Cross-tab copy/import actions change the destination deliberately; ordinary edits in one workspace do not silently change the others.
- Phase-Coherent Mode is local to Morph, Bulk, or Explorer and persists between browser sessions for that workspace. A fresh workspace defaults Off.
- Enabling or applying MPC Wavetable Mode turns Phase-Coherent Mode On in that workspace. Turning MPC Mode off does not turn Phase-Coherent Mode off again; it remains an independently editable persistent setting.
- Phase-Coherent Mode is best effort. FWG registers the completed constructed wavetable to a stable phase reference where a reliable continuation exists. Difficult or ambiguous material may retain an earlier valid orientation. Downstream Morph, FM/PWM/Ring, filtering, and other processing may intentionally change the apparent seam afterward.
- In Morph, Coherent Preview is a session-only quick fresh-state registered view/audition of the current constructed wavetable. It is dormant outside Morph, does not affect Playground or Bulk/Explorer Phase-Coherent settings, and does not replay a complete path-dependent render history; it is therefore not a promise of the orientation a later deterministic render will choose.
Scanning recipes, Drawn, and visualisers
- A Scanning generator is a declarative path through one ordinary base generator. A standalone Scanning recipe stores its name, base generator, and Pot 1/2/3 paths; it is independent of Smooth/Crunchy and does not contain Drawn waveform data.
- Imported custom Scanning recipes live only for the current page session. Reloading clears them. Exact duplicate recipes are listed once; same-name/different recipes are numbered as
(Custom 1),(Custom 2), and so on; different names may describe the same trajectory. - Recipe collections and concatenated complete recipe JSON documents can be imported together. Custom recipes become available to Playground, Morph START, Morph END, and Explorer. Full Morph/Explorer JSON embeds any custom recipe definitions it needs so exported work remains self-contained.
- Drawn is the patch's editable 512-internal-cycle-sample waveform. It can be drawn by hand, populated from browser-decodable audio, or imported from standalone Drawn JSON; Export Drawn writes the current table as editable
.json.gz. Schema 13 accepts literal Drawn tables and sparse mathematical constructions. Parameterisedsteps=Naccepts any finite value from −1 through +1: zero is exact held Steps, ±1 is wrapped linear, and nonzero values use the complementary wrapped signed-Power curves. Other sparse modes includelinear,pow,pow-symmetric,superellipse,cardinal/cardinal-limit/cardinal-clip, andfourier/fourier-clip, withwrapwhere applicable. Imported authored amplitudes and completed Drawn state are bounded to ±1. Exactly 512 authored values remain literal for ordinary/local modes;fourier/fourier-clipdeliberately analyse exact-512 numeric input as global transforms. Fourier selectors address the 257 unique orders of a 512-sample real waveform: DC0, harmonics1…255, and Nyquist256. The shared selector language usesNfor exactly component N,-Nfor exactly component N with inverted coefficient polarity (a 180° phase reversal for Fourier),:Bfor 0 through B,A:for A upward,A:Bfor an inclusive range, and comma for unions; negative terms are singleton inversions only. Direct sparse Fourier may contain fewer actual orders, but a valid requested order through 256 that is unavailable simply contributes zero. Schema 13 may also add one optionaltransformstring: stage 1 first becomes the ordinary bounded 512-sample Float32 Drawn waveform, then stage 2 analyses exactly that complete waveform. Fourier/Fourier-clip remain available here and as normalresample_modechoices for direct sparse Fourier construction.haar/haar-clipare transform-only: band 0 is mean/DC and bands 1–9 run coarsest→finest detail. Haar uses the same selectors, sohaar=3selects only band 3,haar=-3selects only band 3 inverted,haar=:3selects bands 0–3, andhaar=3:selects bands 3–9. Haar's dyadic basis is alignment-sensitive: moving the same completed waveform around the cycle can redistribute energy between bands when features cross fixed half/quarter/eighth/etc. boundaries; unlike Fourier shift behavior, this is more than a change of coefficient phase. Haar does not secretly rotate or phase-align its input.walsh/walsh-clipare likewise transform-only and use all 512 real Walsh-Hadamard basis components in sequency order0…511; sequency N means N sign changes between adjacent samples across the 512-point interval; the loop seam is not counted as an additional change. The same selector grammar applies, including negative singleton inversion. Walsh is global across the cycle but uses rectangular ±1 basis functions rather than Fourier's sinusoids or Haar's localized dyadic detail functions. Fourier, Haar, and Walsh are the v3 Drawn transform collection. Optionalnormalise:trueis independent of transform and applies once to the final Drawn waveform: one uniform gain around zero raises a meaningful sub-full-scale peak to one rail while preserving DC and waveform proportions; it does not stretch both polarities separately. Morph/Explorer/result JSON preserves custom Drawn state, and Explorer START/END can copy Drawn snapshots from Playground or Morph. See the Drawn wiki for formulas, parameter domains, topology rules, and worked examples. - Current schema-13 imports are strict about Drawn dependencies: if the effective route or a Scanning wrapper uses Drawn, the JSON must supply a valid
drawn_waveform. Missing or malformed authoritative data fails visibly rather than silently becoming the default sine. - Mathematical Drawn construction and Table Safety are separate contracts. An unusual finite recipe may be a valid materialized Drawn waveform or useful Scanning contour yet still be replaced for direct audible table use if the completed table is structurally flat, impulse-like, rail-like, or otherwise invalid under the existing Table-Safety rules. Mathematical-mode legality does not bypass Table Safety.
- Visualisers are previews. Collapsed visualisers avoid unnecessary painting; reopening one repaints the current state. Animated previews may visually strobe when waveform motion is faster than the selected Animation FPS.
Randomisation and Explorer
- Playground, Morph, Bulk Random, and Explorer use deterministic named SHA-256 draws where seeded randomisation applies. The same domain, seed, planner version, and inputs reproduce the same addressed decisions; different randomisation domains remain independent.
- Bulk Random searches broadly using its selected preset/profile. Bulk Explorer instead starts from explicit current START/END/Morph state and varies only the ranges and checkbox pools you allow.
- Explorer's current values and its allowed variation pools are separate concepts. Loading a numbered Explorer result makes that result current; loading an Explorer recipe restores the source/rules captured for that batch.
- Custom Scanning recipes are available as individual Explorer generator choices but importing a recipe does not automatically add it to Explorer's random variation pool.
JSON.GZ, import, and compatibility
- Current FWG exports use JSON schema 13. The supported public compatibility boundary is schema 12 from v2.9c plus current schema 13.
- JSON sidecars export as deterministic
.json.gzby default. They contain ordinary UTF-8 JSON wrapped in gzip. Plain.jsonremains importable, and gzip is recognised by content rather than filename alone. - Drawn uses one saved waveform authority at a time. While a numeric construction pipeline remains pristine, full sidecars save that authored construction; schema 13 may also retain one optional whole-waveform
transformstage and/or finalnormalise:truegate. FWG materializes stage 1 to the current bounded 512-internal-cycle-sample Float32 table before applying an optional transform, then normalises only the final waveform when requested. Numericdata[]semantics come from data length,resample_mode, and topology; an optional numeric-arrayformatproperty is ignored like any unrelated extra metadata. After Drawn is edited or otherwise flattened, the literal Float32 numeric table becomes the saved authority; an exact canonical sine with no retained construction may usedefault_sine_v1. Standalone Export Drawn always writes literal editable points. Historical supported Drawn records remain importable through the documented compatibility paths. - Public v2.9c 0–256 window coordinates migrate to the current inclusive 1–512 controls. Historical JSON that predates Phase-Coherent Mode imports that setting as Off; current schema-13 JSON restores its explicit value.
- FWG JSON is designed primarily for reconstruction and troubleshooting, not as a claim that every historical implementation detail is emulated forever. Imported source/version information is shown when compatibility translation is relevant.
Browser requirements and limits
- The primary target is a current desktop Brave/Chromium-family browser. Web Audio is required for auditioning; Web MIDI and decoding of non-WAV audio depend on browser support.
- FWG blocks renders above 24,000,000 samples or above its conservative 768 MiB projected working-memory limit. Browser/OS suspension can still pause work even when FWG's own limits are satisfied.
- Ordinary JSON import is limited to 512 KiB after decompression; compressed input also has a 1 MiB compressed-file guard. These limits are intentionally bypassed when Render Diagnostics is enabled because diagnostic sidecars can be much larger.
- MPC Wavetable Mode validates its own frame/layout requirements. Keep
format.jsonwith the wavetable WAV files; FWG JSON sidecars belong outside the MPC wavetable library folder.
Render Diagnostics and support
- Launch FWG with
?render_diagnostics=ato addFWG-render-diagnostics-v1troubleshooting data to exported JSON and show the diagnostics banner. Diagnostics are observational: they do not change audio, DSP, or random decisions. - Diagnostic JSON can be large, so the normal JSON import byte-size limits are disabled while diagnostics mode is active. Schema and content validation still apply.
- For a GitHub support report, include the FWG version, browser/platform, steps to reproduce, and—where useful—a diagnostic JSON sidecar. The wiki explains how to remove optional runtime/provenance fields manually with
jqbefore sharing a sidecar.
License and provenance
License: This browser implementation is free software under the GNU General Public License version 2 only (GPL-2.0-only). It comes with no warranty.
Provenance: This browser implementation is inspired by Carl Hudson's Fractal Wavetable Generator concept. Carl Hudson's original C implementation is separately copyrighted and is not relicensed here.
Outputs: Audio, WAV, and JSON files generated by this tool are user-created sound-design outputs. FWG claims no ownership of those outputs. The program's GPL notice applies to the program itself; it does not, by itself, impose GPL licensing on generated outputs. Separate rights or obligations may apply to imported, user-supplied, deliberately incorporated, or later-added material.
Full manual, compatibility notes, troubleshooting, developer documentation, and project history: FWG Wiki. Source repository: Fractured-Wavetable-Generator.