Artscripture

Documentation

Everything Artscripture does, and the key that does it. The shortcut tables here are the same catalog the application's menus and its ⌘/ window are generated from.

Getting started

Artscripture is one uninterrupted waveform and a set of keys. There are no palettes to arrange and no modes to be in. The working loop is:

  1. Open a track — ⌘O, or drop a file on the window.
  2. Find the passage. Drag in the waveform to select it, or set the loop’s edges at the playhead with A and S.
  3. Turn looping on with D.
  4. Slow it down with Q, or jump straight to half speed with 3.
  5. Play with Space, and leave it running while you work it out.
  6. Save where you got to with ⌘S.

That is the whole product. Everything below is detail on one of those six steps.

Requirements. macOS 26 on Apple Silicon for the released build. The iPadOS target requires iPadOS 26 and is built from source.

Opening a track

Three routes in:

Recents survive a relaunch on both platforms. On iPad that list is the only route to recents, since there is no menu bar to hang Open Recent from.

Formats

MP3, AAC, M4A/MP4, ALAC, FLAC (including 24-bit), WAV, AIFF, CAF, Ogg Vorbis and Opus — all decoded by the operating system. There is no bundled ffmpeg and there are no bundled codecs.

Ogg Vorbis is macOS only. iPadOS cannot decode it, so the iPad file picker does not offer it rather than offering a file it would then refuse to open. Opus is a different codec and works on both.

Transport and preroll

Key Action
Space Play / pause — a resume rolls back by the preroll
⇧Space Play from start — of the selection, else of an active loop, else of the file
H Preroll on / off

Preroll. You stop on a note; to hear it in context you have to start slightly before it. Space therefore resumes from position − preroll rather than from exactly where it stopped. Two seconds by default, editable in Settings ▸ Playback, and 0 turns it off — that is an allowed value, not a rejected one.

It clamps at the start of the file, and when a loop is active and the playhead is inside it, at the loop’s in point — so a resume never steps outside the passage you set. Pausing and resuming twice rolls back twice: each press is a fresh resume, which is how you inch back through a phrase.

⇧Space never prerolls; it already has an explicit target.

H is not the same as setting the amount to 0. Zero is a permanent “resume exactly where I stopped”; the toggle is the mode you flip while working, and it remembers your seconds. It is also a Playback menu item and a transport-bar button, both of which show the current state.

Stop exists as a menu item and has no key, deliberately — Space is play/pause and a separate Stop key would be a third way to say the same thing.

Selection

Drag in the waveform lanes to select. Shift-drag extends. Click places the playhead; double-click places it and plays from there.

Key Action
⌘A Select all
Esc Clear the selection
⇧← ⇧→ Extend the selection left / right
C V Move the whole selection left / right (250 ms)
⌥C ⌥V Move it further (2 s)
G Turn the selection into the loop

Both move amounts are configurable in Settings, and the same amounts govern moving the loop.

Looping

This is what Artscripture is for, so it is worth knowing what it does. The time stretcher is never reset at a loop boundary — audio is fed continuously across the seam. A reset would flush the stretcher’s overlap state and click on every repetition; feeding through it means a repeat is inaudible. That is verified rather than assumed: a looped render is compared against a file with the same passage already laid out end to end, and the measured difference around every wrap is exactly zero.

Key Action
A Set loop in at the playhead
S Set loop out at the playhead
D Loop on / off
F Restart the loop
G Selection → loop

A loop region that exists but is switched off is still drawn, visibly inert — having set it is worth remembering. Clear Loop is in the Loop menu and has no key.

Moving the loop

A S D F is the loop row and reads left to right. Adding ⇧ turns “set this edge at the playhead” into “nudge it from where it is”; adding ⌥ on top makes the step bigger.

Key Action
⇧A ⇧S Move the loop’s in point left / right
⌥⇧A ⌥⇧S …further
⇧D ⇧F Move the loop’s out point left / right
⌥⇧D ⌥⇧F …further
⇧C ⇧V Move the whole loop, keeping its length
⌥⇧C ⌥⇧V …further

Speed and pitch

Speed and pitch are independent. Slowing a passage down does not transpose it, and transposing it does not change the tempo.

Key Action
Q W Slower / faster, in 5% steps
⇧Q ⇧W Slower / faster, in 1% steps
1 2 3 4 100% · 75% · 50% · 33%
[ ] Pitch down / up, one semitone
⇧[ ⇧] Pitch down / up, one cent
⌥] Reset pitch to the original key

Speed runs from 10% to 200%.

Pitch is deliberately not on the Q W cluster: the two being independent is the feature, and putting them on adjacent keys of the same row would invite exactly the confusion the separation exists to avoid. [ and ] read as down and up by shape.

How good is the slowdown?

On macOS, Artscripture uses Rubber Band 4.0’s R3 “Finer” engine — a multiresolution, phase-locked spectral stretcher. Pitch error, measured as an FFT peak against a reference tone:

Engine Mode At 50% speed At 200% speed
Rubber Band R3 Studio (default) ~0.00 cents a fraction of a cent
Signalsmith Stretch either preset within 0.05 cents within 0.05 cents
Rubber Band R2 Fast up to ~26 cents up to −108 cents

Studio is the default and earns it. The R2 “Fast” row is why the engine is not a user-facing choice — it exists for low-CPU scrubbing and is not a pitch reference. iPadOS uses Signalsmith Stretch, which measures in the same class as R3; Rubber Band has no iOS build.

Volume

Key Action
↑ ↓ Volume up / down
⇧↑ ⇧↓ …in finer steps
M Mute

The output device is chosen from the Playback menu on macOS. On iPadOS routing belongs to the system, via Control Centre.

Key Action
Z X Nudge the playhead back / forward (2 s) — ← → do the same
⇧Z ⇧X Nudge finely (50 ms)
⌥Z ⌥X Rewind / skip (10 s) — ⌥← ⌥→ do the same
R E Zoom in / out, anchored on the playhead
⌘9 Zoom to the selection — falls back to the loop when nothing is selected
⌘0 Fit the whole file

All three nudge amounts are configurable in Settings ▸ Playback.

With the pointer: pinch to zoom, two-finger scroll to pan, and drag the overview strip to move the visible window. Drag down on the time ruler — or ⌥-drag in the waveform — to zoom in smoothly. Settings ▸ Playback ▸ Invert zoom direction reverses that and the scroll wheel together.

Scroll Left and Scroll Right are View menu items with no key: Z and X are the nudge keys and a nudge brings the view with it, so moving the view alone is left to the menu, the trackpad and the overview strip.

Track marks

A single FLAC of a whole album is a wall with no landmarks. If a .cue sheet is sitting beside the audio file, Artscripture parses it and draws a lane showing where each track begins.

Key Action
T Show / hide the track-mark lane

The cue sheet is found by name next to the audio. Its own FILE line is deliberately not consulted — rippers routinely write the name of a .wav that was then encoded to FLAC and deleted, so matching on it would find nothing for most real albums.

Practice mode

Press ⌘P — or View ▸ Practice — for a separate window that plays your loop over and over while the speed climbs, so you can take a passage from slow to tempo without touching anything.

Key Action
⌘P Show / hide the Practice window
⌥P Start / stop the ramp

Give it three numbers and it works out the rest:

While it runs, the window shows which repetition you are on, the speed you are hearing, and how many are left. It advances when the loop comes round, not on a timer — a timer would drift the moment the loop length or the speed changed underneath it, and the ramp changes the speed on purpose.

When the last repetition finishes the ramp holds the final speed and keeps playing, and the window says Ramp complete — holding 100%. A ramp is a speed automation, not a transport: the end of one is the moment you have arrived at the passage, at tempo, in the loop, which is what the exercise was for.

A ramp needs a loop. With none set, the window says so and names the keys that fix it. Starting a ramp switches looping on for you if the region is set but disabled.

Sessions

Key Action
⌘S Save the session
⇧⌘S Save it elsewhere

A session is a small JSON file recording the loop region, the speed, the pitch, the playhead, the visible viewport and whether the track-mark lane is showing. It identifies the track it belongs to, and it contains no audio.

It is written next to your audio file, with .artscripture appended to the whole filename — Blackbird.flac becomes Blackbird.flac.artscripture. Replacing the extension would read better, but a transcriber routinely keeps a lossless master and a smaller copy of the same song in one folder, and a single Blackbird.artscripture between them would mean whichever you opened last silently overwrote the other’s loop points.

If the folder cannot be written to — a read-only volume, say — the session goes to ~/Library/Application Support/Artscripture/Sessions/ instead, and the app tells you so rather than failing quietly.

Every field is optional, so a hand-edited or truncated file is repaired field by field with a named explanation rather than being thrown away. You are invited to read and edit these files.

Settings

⌘, opens Settings:

Each section can be restored to its shipped defaults.

The shortcut window

Press ⌘/ — or View ▸ Keyboard Shortcuts — for a separate window with the whole keymap drawn on a keyboard and a searchable list beside it.

Drag the divider to resplit it; it stays where you left it between launches.

It is generated from the same action catalog the menus and this page are built from, so it cannot fall out of step with what the keys actually do.

Every shortcut

Seventy-one actions. Every shortcut also appears beside its item in the menus — selection in Edit, looping in Loop, transport, speed, pitch, volume and output device in Playback.

Key Action Menu
Space Play / pause Playback
⇧Space Play from start Playback
H Preroll on / off Playback
— Stop Playback
Z ← Nudge back Playback
X → Nudge forward Playback
⇧Z Nudge back (fine) Playback
⇧X Nudge forward (fine) Playback
⌥Z ⌥← Rewind Playback
⌥X ⌥→ Skip Playback
Q Slower Playback
W Faster Playback
⇧Q Slower (fine) Playback
⇧W Faster (fine) Playback
1 100% speed Playback
2 75% speed Playback
3 50% speed Playback
4 33% speed Playback
] Pitch up (one semitone) Playback
[ Pitch down (one semitone) Playback
⇧] Pitch up (one cent) Playback
⇧[ Pitch down (one cent) Playback
⌥] Reset pitch Playback
↑ Volume up Playback
↓ Volume down Playback
⇧↑ Volume up (fine) Playback
⇧↓ Volume down (fine) Playback
M Mute Playback
A Set loop in Loop
S Set loop out Loop
D Loop on / off Loop
F Restart loop Loop
G Selection → loop Loop
— Clear loop Loop
⇧A Move loop in left Loop
⇧S Move loop in right Loop
⌥⇧A Move loop in left (far) Loop
⌥⇧S Move loop in right (far) Loop
⇧D Move loop out left Loop
⇧F Move loop out right Loop
⌥⇧D Move loop out left (far) Loop
⌥⇧F Move loop out right (far) Loop
⇧C Move loop left Loop
⇧V Move loop right Loop
⌥⇧C Move loop left (far) Loop
⌥⇧V Move loop right (far) Loop
⌥P Speed ramp on / off Loop
⌘A Select all Edit
Esc Clear selection Edit
⇧← Extend selection left Edit
⇧→ Extend selection right Edit
C Move selection left Edit
V Move selection right Edit
⌥C Move selection left (far) Edit
⌥V Move selection right (far) Edit
⌘X ⌘C ⌘V Cut / copy / paste — in text fields Edit
⌘0 Fit whole file View
⌘9 Zoom to selection View
R Zoom in View
E Zoom out View
— Scroll left / right View
T Track marks View
⌘/ Keyboard shortcuts View
⌘P Practice View
⌘O Open… File
⌘S Save File
⇧⌘S Save As… File
⌘, Settings… Artscripture

Rebinding is not available yet. The bindings live in a single catalog and the app is built so a user-editable table can replace it, but the editor has not been written.


Something here wrong, or missing? Open an issue — see the support page.