Field Sampler — interface walkthrough

branch develop · commit 009e7fd · Fri, 16 Oct 2026 21:08:12 GMT · iPad Air (5th gen) landscape, 1180×820 pt @2×, touch; Chromium · CI run

274/274 All checks passed 43 steps. Audio is what the app sent to the speakers, captured in the page. Grey (i) rows are measurements to look at, not pass/fail.

Listen through 39 clips · 0:59

Every sound the walkthrough played, in order, in one file: a soft tick before each clip. Tap a row to jump to it; the row playing is highlighted. Download to listen anywhere.

NowPress play, or tap a clip.

1Measuring instruments0.3 s

Before measuring the app, the walkthrough's own pitch estimator (analyze.mjs: FFT peaks of the first 8 harmonics; no code shared with the app's pitch detection) is checked on synthetic tones of known pitch: plucks and decaying harmonic tones, 130–880 Hz, with noise, each searched from a hint 100¢ off.

2First launch0.8 s

With nothing to restore (no take in the address), the app opens on a blank session with the takes menu open (the demo take under Examples), a prompt in the waveform, and every control in place.

Cold start on an iPad Air in landscape (1180×820 pt): the takes menu is open.
Cold start on an iPad Air in landscape (1180×820 pt): the takes menu is open.

3Demo take0.6 s

The demo take (takes menu → Examples) loads a built-in synthetic recording (knocks, thuds, plucked notes) so the app is playable without a microphone.

The demo take, sliced.
The demo take, sliced.

4Record from the microphone3.3 s

New starts a new take and records at once (with the demo take open, Rec would record onto its end: see the next step); the waveform scrolls in live. The Rec button turns into a red outline with a stop square, the time and the time left, at the same width, and nothing else on screen moves; Import and New wait. Rec stops, analyses and saves the take. (The microphone here is a fake device playing the demo file.)

Recording: live waveform, elapsed time on the Rec button.
Recording: live waveform, elapsed time on the Rec button.
Recorded take, sliced and saved.
Recorded take, sliced and saved.

5Record into the take11.1 s

Rec records onto the end of the open take, like tape; New starts a new take and records at once (Import, like New, makes a new take). The recording appears after the take at the scale the take was shown at, and once it reaches the right edge the view follows it; nothing else on screen moves. Each pass gets a band along the top with its time, and Rec shows the time the take has left (5:00 in all). Each pass is a file of its own, analysed alone, so every earlier hit stays exactly as it was: its start, end and id, its edits. Here a take is made with New, two passes are recorded onto it with Rec (the fake microphone plays the walkthrough file), the take is reopened, and each pass stored in its own time.

Recording onto the end of the take: the new pass scrolls in at the take’s scale, with its band.
Recording onto the end of the take: the new pass scrolls in at the take’s scale, with its band.
The waveform while recording into the take.
The waveform while recording into the take.
Two passes, each with its band and time.
Two passes, each with its band and time.

6Import a file1.6 s

Import opens a file (here the walkthrough take: footsteps, knocks, a plucked A3 29 cents sharp, a quiet knock, a wind gust, glass, bird chirps, dropped keys, a bell and a faint knock). Analysis runs off the main thread and the take is saved.

Ground truth: footstep 0.4s · footstep 1s · footstep 1.6s · knock 2.3s · knock 2.55s · pluck 3.2s · quiet knock 5.8s · glass 6.4s · bird chirp 7.6s · keys 8.3s · footstep 9.3s · bell 10.3s · faint knock 12.1s

The imported file itself.
Imported take, sliced. Faint audio is trimmed background no pad plays.
Imported take, sliced. Faint audio is trimmed background no pad plays.

7Keys arm the most tonal slice0.7 s

After analysis the keys arm the slice that makes the best instrument (pitch confidence × ring length), not slice 1. Its detected root labels the keys.

Keys panel: the armed slice, its root, and the root key (●).
Keys panel: the armed slice, its root, and the root key (●).

8Pads play trimmed slices3.7 s

A pad plays its slice from just before the attack to where the sound dies into the background, not to the next hit. Faint regions on the waveform are what gets trimmed.

Pad 1: the first footstep. Level, dBFS

Listen for: A short footstep thump that stops cleanly: no room hiss trailing after it.

-10-30-50-700.0s0.5s1.0snext hit
Pad flashes on touch; its slice is selected on the waveform.
Pad flashes on touch; its slice is selected on the waveform.

9Normalization2.7 s

Every slice plays at the same peak level, so a distant knock is as playable as a close one, up to a +18 dB lift: a near-silent slice is not turned into loud hiss. (Always on: there is no Norm switch.)

Knock. Level, dBFS

Listen for: A knock at full level.

-10-30-50-700.0s0.5s
Quiet knock (10 dB softer in the file). Level, dBFS

Listen for: Another knock, as loud as the previous one (it is 10 dB softer in the file).

-10-30-50-700.0s0.5s
Faint knock (24 dB softer in the file). Level, dBFS

Listen for: A faint knock (24 dB down in the file): lifted, but clearly softer than the knocks before it (the lift stops at +18 dB).

-20-40-60-800.0s0.5s

10Waveform: tap, double-tap, arrows4.0 s

Tapping a slice selects and auditions it (Delete acts on the selection). Double-tapping arms it on the keys. The ‹ › arrows step the armed slice. A glass and a bell have no clean harmonic series, so their roots are best guesses, marked ≈ with no cents: the glass by its lowest partial, the bell by its hum (the right note, an octave below the strike).

Tap on the second knock: auditions it. Level, dBFS

Listen for: The second knock, auditioned by tapping its slice on the waveform.

-10-30-50-700.0s0.5s
Double-tap armed the glass slice.
Double-tap armed the glass slice.
Double-tap armed the bell: its root is a best guess, marked ≈.
Double-tap armed the bell: its root is a best guess, marked ≈.

11Keys: pitch matches the label8.2 s

Each key plays the armed slice at that key's pitch, tuned against the detected root, cents included: the pluck is 29 cents sharp, and its A3 key plays A3, not A3 +29¢. Touching low on a key plays it dry (no smear). Measured: the pitch of what comes out of the speakers, by the walkthrough's own estimator (step 1), to ±2¢.

Key root (MIDI 57), held 1 s, dry. Level, dBFS

Listen for: The plucked string at A3, in tune (the recording is 29 cents sharp; the key corrects it), steady, no warble.

-10-30-50-700.0s0.5s1.0s
Key lowest (MIDI 48), held 1 s, dry. Level, dBFS

Listen for: The same pluck lower (C3), same character, no warble.

-10-30-50-700.0s0.5s1.0s
Key highest (MIDI 60), held 1 s, dry. Level, dBFS

Listen for: The same pluck higher (C4), same character, no warble.

-10-30-50-700.0s0.5s1.0s

12Keys: a held note sustains9.7 s

Held past the end of its slice, a pitched note that rings plays its natural decay, then hovers where it has fallen 12 dB: each grain comes from a random in-tune spot there, so there is no fixed loop to hear repeating. Release fades it out. Fast-decaying and unpitched sounds have nothing to sustain: held, they play once and end (see MIDI).

Root key held 4 s, then released. Level, dBFS

Listen for: The pluck rings, then settles into a steady, slightly grainy tone: no pulse, no audible loop, no re-strike. It fades at release.

-10-30-50-700.0s1.0s2.0s3.0s4.0srelease
Holding the root key: the key lights, grains show on the waveform.
Holding the root key: the key lights, grains show on the waveform.

13Smear7.2 s

Finger height on a key is the smear: low is dry, high freezes the sound into a grain cloud (live PaulStretch). Smeared notes release more slowly.

Root key touched near the top (smear ≈ 0.9), held 2.5 s. Level, dBFS

Listen for: A frozen, washy cloud made from the pluck, with a slow fade after release.

-10-30-50-700.0s1.0s2.0s3.0s4.0srelease
Smeared note: grain dots across the slice on the waveform.
Smeared note: grain dots across the slice on the waveform.

14Computer keyboard3.7 s

With a hardware keyboard: number row plays pads, A…K plays the keys, ← → step the armed slice, Z X shift octave.

Key 1 → pad 1. Level, dBFS

Listen for: Pad 1 (a footstep), from the hardware key 1.

-10-30-50-700.0s0.5s
A key held 1 s (lowest key). Level, dBFS

Listen for: The lowest key (C3), from the hardware key A.

-10-30-50-700.0s0.5s1.0s

15MIDI15.7 s

MIDI channel 1 plays pads from C1 (note 36); channels 2–16 play slices 1–15 pitched; velocity sets level; mod wheel sets smear. (Driven through the hook a native iPad wrapper uses: window.fieldSamplerMidi.)

Ch 1 note 36, velocity 127 → pad 1. Level, dBFS

Listen for: MIDI pad 1 at full velocity.

-10-30-50-700.0s0.5s
Ch 1 note 36, velocity 64. Level, dBFS

Listen for: The same pad, clearly softer (velocity 64).

-20-40-60-800.0s0.5s
Ch 1 note 36 twice at once, velocity 127: pad 1 doubled. Level, dBFS

Listen for: The same pad, louder but clean: two hits summed, held under full scale.

-10-30-50-700.0s0.5s
Ch 7 note 69 (A4) → slice 6, the pluck, an octave up. Level, dBFS

Listen for: The pluck an octave up (A4), from a MIDI channel.

-10-30-50-700.0s0.5s1.0s
Ch 7 notes 69, 73, 76 (A major) at velocity 127, held 1 s. Level, dBFS

Listen for: A three-note chord on the pluck, clean: no crackle where the notes sum.

-10-30-50-700.0s0.5s1.0s
Ch 5 note 60 → slice 4, a knock, held 1.5 s. Level, dBFS

Listen for: A knock on a MIDI channel, held: it plays once and stops, no sustain.

-10-30-50-700.0s0.5s1.0s1.5s2.0snote off
Same note with the mod wheel up (smear 1), held 1.5 s. Level, dBFS

Listen for: The same note with the mod wheel up: smeared, with a long tail.

-10-30-50-700.0s0.5s1.0s1.5s2.0s2.5snote off
A MIDI note (ch 7, note 52) held on the keys
A MIDI note (ch 7, note 52) held on the keys

16Which build this is0.2 s

A tester can be on the production site or the develop one, in a browser or in either TestFlight group's app. The takes menu ends with one line naming the build (in the app: its version and build number, which build it is, the site, the web commit), and every page that isn't production carries a small marker in the header (here LOCAL; DEV on the develop site; nothing on production).

The bottom of the takes menu
The bottom of the takes menu

17Delete and undo6.5 s

Delete a transient by flicking its marker down (or with the Delete key). Its audio is dropped; Undo brings it back.

Second knock selected, about to be flicked down.
Second knock selected, about to be flicked down.
After the flick: one hit fewer.
After the flick: one hit fewer.

18Add a transient6.2 s

Long-press on the waveform adds a transient at the finger. It gets its own natural end like any other hit, and its own pad. Added here in the middle of the ringing pluck, its pad starts mid-note: a 2 ms fade-in keeps that from clicking.

Pad 7: the added hit, mid-pluck. Level, dBFS

Listen for: A hit added by hand in the middle of the ringing pluck: it starts mid-note, softly (a 2 ms fade-in), with no click.

-10-30-50-700.0s0.5s
A transient added by long-press at 3.9 s, inside the ringing pluck.
A transient added by long-press at 3.9 s, inside the ringing pluck.

19Sensitivity7.1 s

The slider beside the waveform filters precomputed candidates: instant, no re-analysis. Short ticks along the bottom show what the next stretch of the slider would add. The setting is saved with the take.

Sensitivity near the top: more hits.
Sensitivity near the top: more hits.
Sensitivity below the default: the weakest hit drops out.
Sensitivity below the default: the weakest hit drops out.

20Name, history and link2.9 s

Tap the name to rename. The ▾ menu lists this browser's takes and copies the take's link. Edits autosave.

Takes menu: Copy link and this browser's takes.
Takes menu: Copy link and this browser's takes.

21Shared link: view only, with a preview card11.2 s

Someone opening the link (another browser) gets the same take and can play it, but not change it. Messages and Slack show a preview card with the name and waveform, in the take’s colors as the app shows them: each slice’s color on its pad, waveform and marker, the keys tinted, hidden slices muted. The card is drawn again when its colors change (a hue of its own, routing), after the edits settle. Read back as a PNG from the stack.

The link opened in a fresh browser: "View only".
The link opened in a fresh browser: "View only".
The preview card image (og:image).
The preview card image (og:image).
The stored card, timbre map.
The stored card, timbre map.
A hue of its own on the footstep (blue) and the slice after the pluck hidden.
A hue of its own on the footstep (blue) and the slice after the pluck hidden.

22Reopen a take from history1.4 s

Choosing a take in the menu opens it (its URL becomes the address), with its own slicing and edits.

The recorded take, reopened from the menu.
The recorded take, reopened from the menu.

23Switching takes keeps each take whole10.4 s

Opening another take, or starting a new one, never writes one take's edits into another, never loses an edit made just before the switch, and never lets a slow upload take over the address of the take on screen.

24Zoom and scroll the timeline3.0 s

Zoom stretches and squeezes time only: the ←|→ and →|← buttons, a sideways pinch, or Ctrl/⌘ + scroll; the waveform keeps its height. Zoomed in, a sideways drag on the waveform (away from a marker) scrolls it, the overview strip above shows the whole take with the view boxed, and a tap there moves the view. Tap still selects and plays the slice under the finger, through the zoomed mapping. Fit (or opening another take) shows the whole take again. A take opened by its link opens without the takes menu.

Zoomed in: the overview above shows the whole take, the view boxed.
Zoomed in: the overview above shows the whole take, the view boxed.

25Move a transient14.0 s

Drag a marker sideways to move it: it snaps to the nearest attack (found in Rust, from the onset detection function), a dashed ghost stays where it was, and a readout shows the time and how far it has come. On release it moves, as one undo step, with a toast to take it back; the slice then plays from there. Here the quiet knock’s marker (5.8 s) is dragged onto the glass (6.4 s, whose own marker was flicked away first): the slice plays the glass. The move is saved with the take (a moved row: the hit keeps its id, so its settings and color go with it), survives a reload, Undo takes it back, and dragging it back onto its own attack removes the row. Zoomed in, a drag on empty waveform still scrolls.

The quiet knock’s slice, before the move. Level, dBFS

Listen for: The quiet knock.

-10-30-50-700.0s0.5s
The moved slice: it plays the glass now. Level, dBFS

Listen for: The glass: the quiet knock’s marker was moved onto its attack.

0-20-40-600.0s0.5s
After Undo: the quiet knock again. Level, dBFS

Listen for: The quiet knock again, after Undo.

-10-30-50-700.0s0.5s
After a reload: still the glass. Level, dBFS

Listen for: The glass again: the move survived a reload.

0-20-40-600.0s0.5s
Dragging the quiet knock’s marker: it has snapped to the glass’s attack; the dashed line is where it was, the readout shows the time and the offset.
Dragging the quiet knock’s marker: it has snapped to the glass’s attack; the dashed line is where it was, the readout shows the time and the offset.
Moved: the marker on the glass’s attack, the toast with Undo.
Moved: the marker on the glass’s attack, the toast with Undo.

26Edits survive reopening3.8 s

A deletion is part of the saved take: opened again later (here: the page reloaded), the take comes back without the deleted hit, on screen and on the server.

The recorded take after a reload: the deleted hit stays deleted.
The recorded take after a reload: the deleted hit stays deleted.

27A take opens the same every time9.0 s

A take's analysis is stored with it, once: its candidates, their attack peaks, and one natural end per candidate. Opened again, it slices from what is stored and measures only the transients added by hand. A take stored before that (legacy) still opens: its peaks are measured on every open, as before, and never written back. Slices are read from instrument.set, through a stand-in for the iPad app's bridge; takes with a known, deliberately shifted analysis are made through the API to tell stored values from measured ones.

28A take link opens in the iPad app2.2 s

A take link (/t/:id) tapped on an iPad with the app opens in the app (Universal Links, docs/ios.md "Take links"). For a link to the site it shows, the app asks the page to open the take in place, through window.fieldSamplerOpenLink, rather than reloading it: the open take, edits on their way out and a capture being read are kept. A link that comes while a take is opening waits for it. Checked through a stand-in for the app's bridge: the page's answers, its address, and the take it sends to native.

The take a link opened, in place
The take a link opened, in place

29Color by sound12.9 s

Every slice is colored by how it sounds (docs/features.md, stage B): five timbre traits per hit, measured in Rust once when the take is made and stored with it, drawn through the timbre map: dull and low warm, bright cool. The same for everyone who opens the take; always on (no Color switch, no map picker). Colors are read from the pads' styles and the waveform's pixels.

Timbre map: thuds and knocks warm; the pluck, glass and keys cool.
Timbre map: thuds and knocks warm; the pluck, glass and keys cool.
A take stored before colors: its card drawn again in them when its owner opened it.
A take stored before colors: its card drawn again in them when its owner opened it.
The demo take.
The demo take.

30Slice settings: hold a pad17.7 s

Holding a pad for ½ s plays it at once and then opens its settings beside it; a shorter tap is an ordinary hit, and a finger that moves first opens nothing (pads can still be swept and drummed). The panel: the name as its title, Color (Auto or one hue), Tune (the root stepper and cents), Gain and Reset. Each change is undoable in one step per gesture and saved with the take: a name shows on its pad, a hue colors the pad (Auto restores it), a gain is heard, and tuning moves which key plays the slice untransposed. Holding the Keys card opens the armed slice’s settings; tapping its root note opens the tuning alone.

A short tap on the knock’s pad: it plays. Level, dBFS
-10-30-50-700.0s0.5s
Holding the knock’s pad: it plays at once, and its settings open. Level, dBFS
-10-30-50-700.0s
The knock at 0 dB (Norm on). Level, dBFS
-10-30-50-700.0s0.5s
The knock with its gain at −12.0 dB. Level, dBFS
-20-40-60-800.0s0.5s
The A♯3 key, the pluck’s root moved up a semitone: it sounds A3, as the A3 key did. Level, dBFS
-10-30-50-700.0s0.5s1.0s
The settings of the knock’s pad (unpitched): name, Color, Tune, Gain, Reset.
The settings of the knock’s pad (unpitched): name, Color, Tune, Gain, Reset.
A hue of its own: Auto off, the pad in that color.
A hue of its own: Auto off, the pad in that color.
The root note tapped: tuning alone.
The root note tapped: tuning alone.
The pluck’s settings (pitched), from the Keys card.
The pluck’s settings (pitched), from the Keys card.

31Slice settings: where slices play (Pads / Keys / Hidden)10.4 s

The control under the selected marker sets where a slice plays: Both, Pads only, Keys only or Hidden. Pads only: the keys’ ‹ › and a double-tap skip it. Keys only: it leaves the pads, and later pads move up. Hidden: muted on pads and keys, while its cut stays (the hits around it don’t change). Two thin lanes under the waveform show the mapping, upper pads and lower keys, the armed slice’s keys lane bold. Saved with the take; Undo puts it back.

Pad 1 with the first slice on the keys only: the second slice. Level, dBFS
-10-30-50-700.0s0.5s
A tap on the hidden knock in the waveform: nothing plays. Level, dBFS
-60-80-100-1200.0s0.5s
Undo: the knock back on pads and keys, a tap plays it. Level, dBFS
-10-30-50-700.0s0.5s
The route control under the selected marker (Pads only), and the lanes: this slice’s keys lane empty.
The route control under the selected marker (Pads only), and the lanes: this slice’s keys lane empty.
A hidden slice: hatched, faded, off both lanes.
A hidden slice: hatched, faded, off both lanes.

32Slice settings: shape (attack, decay, grain)58.2 s

The settings panel’s Attack, Decay and Grain sliders shape a slice on its pad and on the keys: Attack fades it in from the very start over up to 300 ms (Natural: today’s 2 ms de-click fade); Decay fades it out after the attack, 30 dB down at the time set, and ends it 60 dB down (Full: it plays to the slice end, as before); Grain sets the keys’ grain length (Auto: smear sets it). Each slider says its value, shows ↺ once changed, and previews the sound on release. Measured on the captured audio against the same pad or key played without them; back at Natural and Full the pad is the same sound, sample for sample. Saved with the take; Reset pad clears them.

The pluck’s pad, as it was: Natural, Full. Level, dBFS
-10-30-50-700.0s0.5s1.0s
The pluck’s pad with a 300 ms attack: it swells in. Level, dBFS
-20-40-60-800.0s0.5s1.0s
The pluck’s pad with a 100 ms decay: a short thump, then gone. Level, dBFS
-10-30-50-700.0s0.5s1.0s
Natural and Full again: as the first hit. Level, dBFS
-10-30-50-700.0s0.5s1.0s
The pluck’s root key, Natural. Level, dBFS
-10-30-50-700.0s0.5s1.0s
The root key with a 300 ms attack. Level, dBFS
-20-40-60-800.0s0.5s1.0s
The root key with the decay: it dies away while held. Level, dBFS
-10-30-50-700.0s0.5s1.0s
The root key with 500 ms grains. Level, dBFS
-10-30-50-700.0s0.5s1.0s
The pluck’s settings with a 300 ms attack: Attack, Decay, Gain and Grain, each with its value; ↺ beside the one changed.
The pluck’s settings with a 300 ms attack: Attack, Decay, Gain and Grain, each with its value; ↺ beside the one changed.

33Inside the iPad app: the native engine plays8.1 s

The same page with a stand-in for the iPad app's bridge (window.fieldSamplerNative and a message handler that records what it is sent). The page must hand the take to the native engine (instrument.set: its id, slice table, roots and Norm gains, armed slice), send pads and keys as messages, and make no sound of its own. The real bridge is tested in the iPad simulator (ios/scripts/build.sh --self-test-web).

In the app: the bottom of the takes menu
In the app: the bottom of the takes menu

34Inside the iPad app: native recording and import4.7 s

The app records and imports natively (features record and import): Rec is back in the app, the recording's live peaks come from native, and on stop the page reads the file through the bridge (capture.read, in slices) and saves it as a take on the server, exactly like an import. Import opens the app's document picker instead of the web file input. A refused microphone shows a message. Nothing uses getUserMedia or Web Audio output. Stand-in bridge here; the real one is tested in the simulator (ios/scripts/build.sh --self-test-record).

Recording natively: live peaks from the app.
Recording natively: live peaks from the app.

35Takes are at most 5:0010.3 s

A take is at most 5:00 long (the length whose 16-bit WAV fits the 64 MiB upload limit, with headroom). Recording stops by itself at the cap and the take is kept exactly as if Rec had been pressed; in its last 30 s the Rec button counts down. An import longer than the cap keeps its first part and the header says so. Here the cap is shortened to 4 s for the test (window.__fieldSamplerMaxTakeSeconds), and the 13 s walkthrough take is imported twice: as a WAV, which is cut before decoding, and with a 1.5 MB chunk before its audio, which is decoded whole and then cut. In the app (stand-in bridge), a recording the app ends at the cap is stopped and saved, and the app's own cut of a long import is announced.

Recording with the cap at 0:04: the Rec button counts down.
Recording with the cap at 0:04: the Rec button counts down.
Stopped by itself at the cap, sliced and saved.
Stopped by itself at the cap, sliced and saved.
A 13 s file imported with the cap at 0:04: its first 4 s are kept.
A 13 s file imported with the cap at 0:04: its first 4 s are kept.
The app cut a long import: the header says what was kept.
The app cut a long import: the header says what was kept.

36Inside the iPad app: recordings are never lost3.7 s

The app keeps every recording and import until the page confirms it saved as a take (feature recover). A page that loads while the app is still recording (it reloaded, or its process ended) picks the recording up and stops it. Opening another take while a recording is being read leaves the recording on the list of recovered recordings, from which it opens and saves; one can be discarded. While a capture is being read, Import and the takes menu (the demo take too) wait. Stand-in bridge here; the real one is tested in the simulator (ios/scripts/build.sh --self-test-recover).

A page that loads mid-recording shows the recording running.
A page that loads mid-recording shows the recording running.
Recovered recordings at the top of the takes menu.
Recovered recordings at the top of the takes menu.

37Inside the iPad app: with the library, a recording is a take before the page reads it4.3 s

With the take library, the app makes a recording (or an import) a take in iCloud Drive as soon as it stops, before the page reads a byte of it; the page then opens that take and analyses it, storing the analysis. Analysis failing (here, a recording the page can't read at first) loses nothing: the take is listed and opens later. Stand-in bridge here; the real one in the simulator (ios/scripts/build.sh --self-test-library).

38Inside the iPad app: Rec records onto a take the app just made4.8 s

With the take library and passes, a recording is a take as soon as it stops; the page opens it, analyses it and stores the analysis, and from then Rec records onto its end (stage H), as onto any take opened later. A take that can't be added to (here one saved before its analysis version was stored) says so on the Rec button, and in the header when Rec starts a new take instead. Stand-in bridge here; the real one in the simulator (ios/scripts/build.sh --self-test-record-into).

Rec added a pass to the take the app had just made
Rec added a pass to the take the app had just made
Rec on a take that can’t be added to: the header says why
Rec on a take that can’t be added to: the header says why

39Inside the iPad app: a recovered recording longer than a take can be is kept whole4.2 s

A recording left unsaved by an app build from before the take length cap can be longer than a take may now be. Opening it never cuts it: with the take library it is saved whole to the library first (as "Save to library" does; the app deletes the capture only once the library has its copy) and opens like any older take over the cap; without the library its first part opens and the capture is not confirmed saved, so the whole file stays under "Recovered recordings". Here the cap is shortened to 4 s (window.__fieldSamplerMaxTakeSeconds) and the recovered capture is the 13 s walkthrough take. Stand-in bridge.

A recovered 13 s recording with the cap at 0:04: saved whole to the library and opened whole.
A recovered 13 s recording with the cap at 0:04: saved whole to the library and opened whole.

40Inside the iPad app: takes in iCloud Drive16.6 s

With the take library (feature library), new takes go to the person's iCloud Drive through the bridge, never to the server; the menu lists them, then the older server takes, marked by where they live. Switching takes keeps each take whole here too. Sharing uploads that one take on demand and keeps its link current. Stand-in library here; the real one is tested in the simulator (ios/scripts/build.sh --self-test-library).

The takes menu in the app: iCloud Drive takes, then older server takes.
The takes menu in the app: iCloud Drive takes, then older server takes.

41Duplicate a take7.1 s

The ⧉ button, left of the take name, copies the open take with its edits as a new take, which opens at once; a toast says so, with Undo. The copy is made on the server (audio, analysis and preview copied there, nothing re-uploaded) and has its own link and key. Editing the copy leaves the original as it was; Undo deletes the copy and goes back to the original.

⧉, left of the take name: Duplicate.
⧉, left of the take name: Duplicate.
The copy is open; the toast offers Undo.
The copy is open; the toast offers Undo.

42Portrait2.0 s

Portrait works too (secondary): the same single screen, stacked.

iPad Air in portrait (820×1180 pt).
iPad Air in portrait (820×1180 pt).

43Console0.0 s

Errors the page logged during the whole walkthrough.

About the demo take

13 s, stereo, 48 kHz, built by e2e/fixture.mjs. Room tone ~−50 dBFS with a +0.01 DC offset and 6 Hz rumble; a wind gust 4.5–5.4 s. Hits: footstep 0.4 s · footstep 1 s · footstep 1.6 s · knock 2.3 s · knock 2.55 s · pluck 3.2 s (223.78 Hz) · quiet knock 5.8 s · glass 6.4 s (880.00 Hz) · bird chirp 7.6 s · keys 8.3 s · footstep 9.3 s · bell 10.3 s (440.00 Hz) · faint knock 12.1 s.