Audio → MIDI

Audio to MIDI Converter

GarageBand audio to MIDI: why the first note lands early

The short answer: silence at the front of a GarageBand bounce never deletes a note — across 15 different leading-silence lengths from 0 to 10 seconds, all four notes returned every time, at pitches 60,62,64,67, with velocity only moving between 112 and 113. What silence does change is the timestamp: the first onset comes back early, by up to 84.4 ms. And the drift is not proportional. With 0.1 s of silence the note is 4.5 ms late; at 0.25 s it is 29.4 ms early; at 1 s it is 82.8 ms early; beyond 3 s it settles to about 73–77 ms early and stays there. The cause is not a timing bug in the detector. The voice gate is computed from the quietest tenth of the whole file: silence drags that floor from 0.29586 to 0.00000, the gate collapses from 0.29941 to 0.04497, and the 2048-sample analysis window (92.88 ms, eight frames) already contains the attack before its true frame arrives — so faint pre-attack frames clear the lowered gate and claim the note's start. Export a tight region and the whole problem disappears: with 0.2 s or less of lead-in, all 15 measurements stayed within ±4.5 ms. Conversion runs entirely in your browser — no upload, no account, nothing to install.

1. Should you convert here, install something, or stay in GarageBand?

Before the numbers, the honest decision. Three situations, three answers, each pinned to a value measured on this converter rather than to an opinion about a host application.

Convert it right here. You have one clean line and you want its pitches as editable notes. Leading silence is not a reason to re-bounce: 0 s, 0.05 s, 0.1 s, 1 s, 3 s and 10 s of silence all returned 4 of 4 notes with identical pitches. Export the region starting close to the first attack, drop the file on the converter, and take the .mid and .csv. At 0.2 s of lead-in or less, the measured onset error never exceeded 4.5 ms.

Go install a plugin, or use GarageBand's own capture. You need onsets that land exactly on the project grid, pitch bend, or note-by-note expression. With 1 s of leading silence our first note is written at tick 881 instead of 960 at 120 BPM — 79 ticks early — and the 90-byte file contains 0 pitch-bend events, 0 program-change events and 1 note channel. A tighter grid does not automatically repair that: quantizing the same padded file to 1/16 made the error worse, to 125 ms. What pitch bend detection adds sets out the gap, and when a plugin is worth installing covers the trade. Walking away is the right call here.

GarageBand is not optional. You need separate parts, stems, drums, a tempo map or a chosen instrument sound. Whatever bounced file goes in, the artifact that comes out is one 90-byte Standard MIDI File with 2 tracks, 1 note channel, 1 tempo event, 0 key-signature events and 0 text events; no export setting turns one audio file into several tracks. Do the separation in the DAW, then bring each isolated line back here. Why the converter cannot pull out just one voice and what a MIDI file actually is describe those walls in numbers.

Everything after this section assumes you are in the first case. That is the one where a browser converter is genuinely the fastest path.

2. The route, in three sentences

Export the region from GarageBand as one audio file, trimmed to start at or just before the first attack, with short auto-fades left alone. Drop it on this converter, download the .mid and the .csv, then drag the .mid back into your GarageBand project and load an instrument on the track. The rest of this page is about the one export choice left open — how much silence and fade surround the notes — and what those edges do to the reported times.

3. What we measured, and how

Every number below comes from running this site’s real dsp.js and midi.js in Node on synthesised material whose correct answer we already knew. No third-party tool was measured and no figure is estimated. The reference clip is four notes (C4 261.63 Hz, D4 293.66 Hz, E4 329.63 Hz, G4 392.00 Hz), 0.5 s each, with a mild harmonic series and 10 ms ramps, rendered at 22 050 Hz with a peak amplitude of 0.35. Unless stated: sensitivity 60, shortest note 60 ms, 120 BPM, quantize off, polyphonic mode. Leading silence was built by prepending an exact number of zero samples to the same array; nothing was recorded through a sound card.

The analysis grid is fixed by the converter, not by your GarageBand project: audio is resampled to 22 050 Hz, read with a 2048-point FFT stepped 256 samples at a time, so one frame is 11.610 ms (86.13 frames per second) and one window is 92.88 ms, or exactly eight frames. Monophonic search runs 55–1800 Hz; polyphonic peaks are read up to 4000 Hz with at most 6 peaks per frame. Your 44.1 kHz session and its time signature do not enter that arithmetic — we ran the same melody at 44.1k, 48k and 22.05k and the note list was identical every time.

Three neighbouring pages cover adjacent ground, and this one is deliberately narrower. How to prepare the input file explains that a note starting at exactly 0.000 s is analysed at almost no Hann-window weight, and advises a short lead-in so the first note is detected at all. Why a short region returns no notes measures the opposite failure — a region under 155 ms is too short to survive the window. Our four-DAW export overview has a five-row table showing that padded silence moves onsets, but it stops at “timestamps drift”. This page keeps one four-note phrase fixed, sweeps 15 silence lengths, and opens the segment() gate to show why the drift changes sign, where the cliff sits, what it does to the exported bytes, and which control actually fixes it. None of the tables below are reused from those pages; they are fresh runs made for this one.

4. Fifteen silence lengths: flat, then a cliff, then a plateau

The intuitive model is a straight line — more silence, more drift. That is not what the detector does. We prepended 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4, 0.5, 0.75, 1, 2, 3, 5 and 10 seconds of digital silence to the same clip and read back the first onset each time:

Leading silence versus first detected onset, same four-note phrase, polyphonic mode, sensitivity 60. Fresh runs, 2026-11-14.
Silence (s)First onset (s)True onset (s)Offset (ms)NotesVelocity
0.000.00000.00000.04113,113,113,113
0.050.04640.0500−3.64113,113,113,113
0.100.10450.1000+4.54113,113,113,113
0.150.15090.1500+0.94113,113,113,113
0.200.19740.2000−2.64113,113,113,113
0.250.22060.2500−29.44112,112,112,113
0.300.23220.3000−67.84112,113,112,113
0.400.32510.4000−74.94112,112,112,113
0.500.41800.5000−82.04112,113,112,113
0.750.67340.7500−76.64112,112,112,113
1.000.91721.0000−82.84112,113,112,113
2.001.91562.0000−84.44112,113,112,113
3.002.92573.0000−74.34112,112,112,113
5.004.92265.0000−77.44112,112,112,113
10.009.926510.0000−73.54112,112,112,113
Line chart of first-onset error against leading silence for 15 measured lengths: from 0 to 0.2 seconds the error stays inside plus or minus 4.5 milliseconds and 0.1 seconds is 4.5 ms late; between 0.2 and 0.4 seconds it drops steeply to minus 74.9 ms; from 0.5 to 10 seconds it stays in a band between minus 73.5 and minus 84.4 ms. All 15 points returned 4 of 4 notes at pitches 60, 62, 64, 67.
Figure 1. Three regimes, not a slope: a flat zone (≤0.2 s), a cliff between 0.2 and 0.4 s, and a plateau near −78 ms. The dashed line at −92.88 ms is the width of one analysis window — the physical ceiling on how early a note can be claimed. Every point is a real run of this site's analyser.

Three things are worth reading off that table. First, the sign flips: the 0.1 s and 0.15 s cases are late, not early, because with only a handful of silent frames the gate is still high and the onset is simply rounded to the nearest frame boundary (0.1 s is frame 9, which lands at 0.1045 s). Second, the cliff between 0.20 and 0.30 s is not gradual — the error jumps from −2.6 ms to −67.8 ms, a 26-fold change for 100 ms more silence. Third, the plateau is bounded: no measurement went beyond 84.4 ms early, which is under the 92.88 ms window length. That is the fingerprint of a window effect, not a scaling error.

Only the first note is hit this hard. In the 1 s case the four onsets were 0.9172, 1.4629, 1.9621, 2.4497 against true positions 1.0000, 1.4992, 1.9985, 2.4977 — offsets of −82.8, −36.4, −36.4 and −48.0 ms. Later notes drift too, but by roughly half as much, because the frames immediately before their attacks are already above the gate. The seven-column CSV is where these seconds are visible to four decimals.

5. Why: silence lowers a gate that belongs to the whole file

The mechanism is two lines of segment() in dsp.js. Before any note is grouped, the detector sorts the RMS of every frame in the file, takes the value at the 10th percentile as a noise floor, and interpolates between that floor and the loudest frame:

We first measured this whole-file gate on a different question — why padding a too-short region brings a note back, where the gate fell from 0.309651 to 0.044974. The gate values are clip-dependent, so the numbers below are for this four-note phrase. What is new here is the other side of the same mechanism: those lowered gates do not just rescue missing notes, they let pre-attack frames claim the start of notes that were never in danger, which is what produces the timestamp drift.

var floor = sorted[Math.floor(sorted.length * 0.10)] || 0;
var gate = floor + (an.rmsMax - floor) * (0.32 - 0.30 * sens);

At sensitivity 60 the multiplier is 0.32 − 0.30 × 0.6 = 0.14. On the unpadded 2 s clip almost every frame is loud, so the 10th percentile is nearly as loud as the peak: floor 0.29586, gate 0.29941. Once the silent prefix grows past about a tenth of the file, the 10th-percentile frame is silence, the floor goes to zero, and the gate collapses to 0.14 × rmsMax:

Whole-file floor and gate, and which frame claimed the first note. Ten of the fifteen measured lengths, fresh runs 2026-11-14.
Silence (s)FramesFloor (p10)GateClaimed frameTrue frameFrames earlyOffset (ms)
0.001650.295860.299410000.0
0.101730.295050.29872990+4.5
0.201820.293760.2976117170−2.6
0.251860.221360.2353419223−29.4
0.301910.084900.1179920266−67.8
0.401990.000000.0449728346−74.9
0.502080.000000.0449736437−82.0
1.002510.000000.0449779867−82.8
3.004230.000000.044982522586−74.3
10.0010260.000000.044978558616−73.5

Now the second half. Each FFT frame reads a window of 2048 samples forward from its own start, so a frame beginning up to eight frames (92.88 ms) before the audible attack already contains that attack in its tail, at low but non-zero energy. With the unpadded clip those faint frames sit far below the 0.29941 gate and are discarded. With the gate at 0.04497 they clear it. Here is the exact boundary for the 1 s case, where the true attack is frame 86 at 1.0000 s:

Per-frame diagnosis around the attack of a clip with 1 s of leading silence. Gate 0.04497; monophonic salience threshold 0.2000. Fresh runs, 2026-11-14.
FrameTime (s)RMSSaliencePoly peaksMono pitch
770.89400.000000.00000—
780.90560.000000.00000—
790.91720.055400.03754—
800.92880.125050.06912—
810.94040.167990.09562—
820.95200.202120.12181—
830.96360.231380.15071—
840.97520.257370.18511—
850.98680.281040.2233160
860.99850.303170.2495160
871.01010.319310.2536160
881.02170.319830.2536160
Two-panel chart of the gate-collapse mechanism. Left: as leading silence grows from 0 to 0.4 seconds, the whole-file noise floor falls from 0.29586 to 0.00000 and the voice gate falls from 0.29941 to 0.04497, while the frame count rises from 165 to 199. Right: RMS of frames 77 to 88 around an attack at frame 86, rising from 0.00000 to 0.31983; the high gate at 0.29941 rejects all frames before 86, while the collapsed gate at 0.04497 lets frame 79 claim the note start, seven frames or 81.3 ms early.
Figure 2. The same frames, two gates. Silence does not retune anything — it changes which frames are loud relative to the quietest tenth of the file. Once the floor is zero, seven faint pre-attack frames qualify, and the earliest of them becomes the note's start.

Frame 79 is the whole story. Its RMS is 0.05540 — just above the collapsed gate, far below the original one — and because its 2048-sample window already includes the attack, it reports four spectral peaks including pitch 60. Grouping consecutive frames with the same pitch then declares the note's start at frame 79, seven frames = 81.3 ms before the true frame 86. The extra peaks at that frame (84, 88, 91) are transients that never survive the shortest-note gate, which is why the file still contains exactly four notes. Note also that those faint frames have salience between 0.0375 and 0.1851, below the monophonic threshold of 0.2000 — which is why monophonic mode barely drifts at all, as section 8 shows.

This is also why the error stops growing. A frame whose window does not overlap the attack has RMS exactly zero and cannot clear any positive gate no matter how much silence you add; the earliest possible claim is bounded by the eight-frame window. From 3 s to 10 s of silence the measured offset wanders only between −73.5 and −77.4 ms, changing by one frame as the attack lands at slightly different positions inside the hop grid. The four-step troubleshooting order puts format and mode ahead of sensitivity for a related reason: no slider rewrites a gate that was computed from the file as a whole.

6. It is not only the front: position, gaps and fades

If the cause is a whole-file percentile, then silence anywhere should lower the gate — not just a prefix. It does. We placed the same four-note phrase in seven export shapes:

Silence position versus detected onsets. All rows returned 4 notes at pitches 60, 62, 64, 67. Fresh runs, 2026-11-14.
Export shapeDetected onsets (s)What moved
Bare 2 s region0.0000, 0.4992, 0.9985, 1.4977reference
1 s silence before0.9172, 1.4629, 1.9621, 2.4497first note −82.8 ms, later notes ~−36 to −48 ms
1 s silence after0.0000, 0.4644, 0.9636, 1.4512first note exact; notes 2–4 pulled ~35–46 ms early
1 s silence both sides0.9172, 1.4629, 1.9621, 2.4497identical to leading-only
0.5 s gap after note 10.0000, 0.9172, 1.4629, 1.9505note 2 lands −82.8 ms before its true 1.0000 s
0.2 s gap after note 10.0000, 0.6734, 1.1610, 1.6486note 2 lands −26.6 ms before its true 0.7000 s
1 s before + 0.5 s gap0.9172, 1.9156, 2.4613, 2.9489both effects, no new notes

Trailing silence does not leave the timing of later notes alone — a point worth stating plainly, because the common advice is that padding the end is harmless. It is harmless to the first note (still 0.0000 s) but lowers the same gate for the rest of the file, pulling notes 2–4 about 35–46 ms early. A silence gap in the middle does the same to the note that follows it: with a 0.5 s gap after the first note, note 2 was reported at 0.9172 s instead of 1.0000 s. The gate is global; the error is local to whatever attack sits after quiet frames.

Fades are the more surprising case, and they push the first onset in the opposite direction. GarageBand applies a short fade-in and fade-out to bounced regions by default. Our export overview measured that linear fades up to 100 ms leave note count, pitches and velocity untouched, but it did not measure onset times. We did, on the unpadded clip:

Linear fade-in and fade-out on both ends of the bare 2 s region, first onset measured. Fresh runs, 2026-11-14.
Fade lengthNotesFirst onset (s)Offset (ms)Velocity
0 ms40.00000.0113,113,113,113
20 ms40.0116+11.6113,113,113,113
50 ms40.0348+34.8113,113,113,113
100 ms40.0697+69.7113,113,113,113
150 ms40.1045+104.5113,113,112,112
200 ms40.1045+104.5112,113,112,112
300 ms40.1277+127.7111,113,112,111
400 ms40.1393+139.3109,113,112,109
Diverging bar chart comparing two export edges on the same four-note phrase. Leading silence pulls the first onset early: minus 29.4 ms at 0.25 s, minus 67.8 ms at 0.3 s, minus 82.0 ms at 0.5 s, minus 82.8 ms at 1 s, minus 84.4 ms at 2 s. Linear fades push the first onset late: plus 11.6 ms at 20 ms, plus 34.8 ms at 50 ms, plus 69.7 ms at 100 ms, plus 104.5 ms at 150 ms, plus 139.3 ms at 400 ms. All 4 notes survive in every case.
Figure 3. Two opposite errors from two opposite causes. Silence lowers the gate and lets early frames in; a fade suppresses the attack frames themselves, so the first frame that clears the (still high) gate comes later. Either way the note list stays 4 of 4.

The fade case has its own gate signature. Because a fade does not add silent frames, the 10th-percentile floor stays high: 0.29586, 0.29555, 0.29505 and 0.29407 for fades of 0, 20, 50 and 100 ms, with the gate holding near 0.298–0.299. The opening frames are now attenuated below that high gate, so the first qualifying frame moves from 0 to 1, 3 and 6 — exactly the +11.6, +34.8 and +69.7 ms in the table. Only past 200 ms does the floor finally start to fall (0.22485) and velocities begin to drop. So the practical advice is asymmetric: a normal short auto-fade is safe for pitch and velocity, but it is not invisible to timing, and a long fade is a different problem from long silence.

7. What the exported file actually records

A drift in seconds becomes a drift in ticks. The writer in midi.js converts each onset with round(start × 480 × bpm / 60), so at 120 BPM one second is 960 ticks and the padded first note lands at 881 instead of 960:

First note-on tick and file size at 120 BPM, computed from real runs of buildMidi(notes, 120). Fresh, 2026-11-14.
Silence (s)First onset (s)First tickTrue tick.mid sizeFirst CSV row
0.00.00000089 B1,60,C4,0.0000,0.4180,0.4180,113
0.10.10451009689 B1,60,C4,0.1045,0.5224,0.4180,113
0.50.418040148090 B1,60,C4,0.4180,0.9520,0.5341,112
1.00.917288196090 B1,60,C4,0.9172,1.4512,0.5341,112
3.02.92572809288090 B1,60,C4,2.9257,3.4482,0.5224,112
10.09.92659529960090 B1,60,C4,9.9265,10.4490,0.5224,112

Two details matter if you are aligning to a DAW grid. The .mid grows from 89 to 90 bytes once the first delta-time needs a two-byte variable-length quantity — a one-byte change that encodes the entire timing error. And the note becomes longer, not just earlier: on the bare clip the first note ran 0.0000–0.4180 s (0.4180 s), while with 1 s of lead-in it ran 0.9172–1.4512 s (0.5341 s), because the trailing end of the note also finds frames above the lowered gate. Trimming silence is therefore a timing fix and a note-length fix.

The BPM box is not a fix, and its arithmetic is worth seeing. The CSV writer has no BPM argument at all — the same padded note list produced the identical first CSV row at 60, 90, 120, 140, 173 and 200 BPM. But the .mid tick grows with the tempo you typed, so the error measured in ticks grows with it:

Same 1 s padded clip, six BPM values. The 82.8 ms time error is constant; the tick error is not. Fresh runs, 2026-11-14.
BPMFirst tickTrue tickTick error.mid size
60440480−4090 B
90660720−6090 B
120881960−7990 B
14010271120−9390 B
17312691384−11590 B
20014681600−13290 B

How accurate the written tempo is measures the other half: the BPM is written verbatim and moves no notes. Here the notes are already displaced, and a higher BPM simply expresses the same 82.8 ms as more ticks. If you want the exact seconds, the CSV is the closer record of what the analyser saw; what a MIDI file is explains why it holds instructions rather than a timeline.

8. What actually fixes the timing

The obvious controls mostly do not. We took the 1 s padded clip — first onset 0.9172 s, 82.8 ms early — and changed one setting at a time:

One control at a time on the same 1 s padded clip. Fresh runs, 2026-11-14. Default is sensitivity 60, shortest note 60 ms, polyphonic, quantize off.
ControlNotesFirst onset (s)Offset (ms)Verdict
sens 20 / 4040.9288−71.2one frame better, still early
sens 60 / 80 / 10040.9172−82.8no change at all above 40
minms 0280.9172−82.8fragments, onset unchanged
minms 60 / 150 / 30040.9172−82.8onset unchanged
minms 50020.9172−82.8loses notes, onset unchanged
mode = mono40.9868−13.2best single switch
quantize 1/441.00000.0exact here, but rewrites all times
quantize 1/841.00000.0exact here, same caveat
quantize 1/1640.8750−125.0worse than doing nothing

Monophonic mode is the real fix for a single-line part, and the frame table in section 5 explains why. It requires both the RMS gate and a harmonic-salience score above 0.35 − 0.25 × sens = 0.2000; the faint pre-attack frames score only 0.0375–0.1851, so the first accepted frame is 85 at 0.9868 s, just 13.2 ms early. The trade is that monophonic mode collapses chords — why the two modes fail differently measures that. Quantizing to 1/4 or 1/8 happens to snap this particular 1.0000 s onset back exactly, but it is a bulk rewrite of every onset in the file, and 1/16 demonstrably makes it worse; what the browser controls can and cannot change covers the general case. The reliable, no-side-effect fix is the one available in GarageBand before you export: trim the region so it starts within 0.2 s of the first attack.

9. GarageBand export checklist, in order

  1. Trim to the attack. With 0.2 s or less of lead-in, all five measured short cases stayed within ±4.5 ms and returned 4 of 4 notes at velocity 113. This single step removes the cliff, the tick error and the stretched note length.
  2. Do not leave a long tail either. 1 s of trailing silence left the first onset exact but pulled notes 2–4 about 35–46 ms early, because the floor is computed over the whole file.
  3. Keep short auto-fades, but know what they cost. Fades of 20, 50 and 100 ms kept all 4 notes and velocity 113, yet moved the first onset +11.6, +34.8 and +69.7 ms late. A 400 ms fade moved it +139.3 ms and dropped velocity to 109.
  4. Do not re-bounce to fix velocity. Across the 15 silence lengths velocity moved only between 112 and 113; the drift is timing, not loudness. Why export level changes velocity and not pitches gives the separate formula for that ladder.
  5. Use monophonic mode for one clean line. On the 1 s padded clip it cut the onset error from 82.8 ms to 13.2 ms without losing a note. For chords, stay in polyphonic and trim instead.
  6. Check the region is long enough. Silence will not delete a note, but a tightly trimmed short region can — a region under 155 ms returns none.
  7. Check the CSV before the piano roll. If pitches are right and the first start_sec is earlier than the waveform, suspect the bounce's edges, not the sensitivity slider. The CSV columns explained shows which ones come straight from the frame grid.
  8. Choose the file format on its own merits. One .m4a can be lossless ALAC or 32 kbps AAC; that choice has a measured effect of its own, separate from the timing here.

If you are bouncing several parts, do them one file at a time; why there is no folder-drop batch button explains the workflow. On a phone the same page works with a file from the share sheet; mobile audio to MIDI covers the input differences. And if the notes themselves look wrong rather than early, the cleanup passes are the next step.

What GarageBand has built in (context only, not our measurements)

GarageBand can work with MIDI regions and software instruments, and it can export or share audio regions, so there is a route that never leaves the project. That is a menu-level fact about the application, not a number from this site, and it is not what this page tests. The reason an exported file is still worth discussing is simpler: an audio file is the one artifact any host can hand to this page, and an SMF .mid is the one artifact any host can take back. For the hosts where we walked the import path separately, see FL Studio, Ableton Live and Logic Pro. If your goal is per-note expression or a tempo map rather than a note list, stay in the DAW: our 90-byte export has nowhere to store them.

Questions people actually ask

Can GarageBand convert audio to MIDI?

GarageBand can work with MIDI, but if you bring an exported audio file to this converter the thing to watch is the bounce's edges: across 15 measured leading-silence lengths from 0 to 10 s, all 4 notes survived every time at pitches 60,62,64,67, while the first onset moved up to 84.4 ms early. Keeping the lead-in under 0.2 s held the error within ±4.5 ms. Export the region, drop it on this converter, and take the .mid and .csv. Staying inside the DAW only becomes necessary when you need separate parts, a tempo map or pitch bend: the file written here has 0 pitch-bend events and 1 note channel.

Does GarageBand have audio to MIDI?

If you mean an export that this browser converter can read, yes — and the host's own features are not what decide the result. The detector's voice gate is computed from the quietest tenth of the whole file: adding 1 s of leading silence dropped the floor from 0.29586 to 0.00000 and the gate from 0.29941 to 0.04497, which let a frame seven 11.610 ms frames before the true attack claim the note start. Trim the region and the drift goes away without changing any setting. The four-DAW export overview covers the other export settings that change the result.

Why is my first MIDI note early?

On a bounce with silence at the front it is usually the gate, not the pitch detector. Each FFT frame reads 2048 samples (92.88 ms, eight frames) forward, so frames before the audible attack already contain it at low energy; once silence lowers the whole-file gate to 0.04497, a frame with RMS 0.05540 qualifies and becomes the note's start. The measured error is 82.8 ms at 1 s of silence, 84.4 ms at 2 s and 73.5 ms at 10 s — bounded by that window, not proportional to the silence. The four-step troubleshooting order covers the cases where notes are actually missing rather than early.

Do the short fades my DAW adds on bounce matter?

Not to pitches, but yes to timing. Fades of 20, 50 and 100 ms all returned the same 4 notes at velocity 113, yet pushed the first onset +11.6, +34.8 and +69.7 ms late — the opposite direction from leading silence, because the fade suppresses the opening frames below a gate that stays near 0.298. At 400 ms the offset reached +139.3 ms and velocity fell to 109. A normal short auto-fade is safe to leave on; a long one is worth checking in the CSV. How to prepare the input file covers the window-edge basics.

Convert an exported file now — runs in your browser, nothing is uploaded.

Related guides