operation manual · iOS 0.2.18
logic behind epicMIDI
This is the operator’s book as of 0.2.18.
1. What it is
epicMIDI is an iOS MIDI studio: a launch-pad sequencer, a MIDI clip bank, a piano roll, dual performance surfaces, a circle-of-fifths instrument, and (when the engine is On) a mixer that hosts third-party AUv3 generators and effects. It can make sound with a small onboard sine engine, or run silent as a MIDI brain for other apps and hardware.
- iPhone and iPad. Landscape is the native shape but it is designed to scale to all screens; the chrome collapses as width shrinks.
- Opens on SEQ.
- Pages: SEQ · BANK · ROLL · PERF · HARM · MIX (MIX only when Audio Engine is On).
- Timebase is 1920 PPQN internally. Pattern steps are 16th notes.
- Every Note On is paired. Panic flushes sounding notes and sustain.
2. Chrome
Two strips sit above every page:
- Top bar — logo tile (tap = about), record, measure, tempo/clock, SEQ/BANK/ROLL/PERF/HARM/MIX, volume, settings, panic triangle. MIDI monitor appears on the right when there is width.
- Pattern bar — play/stop (pinned left), SEQ/PAT, pattern tiles. On SEQ: screwdriver + trash pin right. On BANK: trash pins right. Pattern tiles scroll under the pin cluster.
| Control | Does |
|---|---|
| Logo 44² | Tap for credits: dimmed studio, dark card with larger geese mark, epicMIDI, © Timothy Capelle 2026. Tap anywhere to close. |
| Record ● | Arm. Live keys / incoming MIDI write into the active pattern while playing. |
| Bar.beat | Playhead readout. Stays with the clock cluster, right of the page-switch pipe. |
| Clock | When BPM no longer fits: metronome, tap-tempo, time signature, song-loop bars, ±tempo drop down from this button. Slide the BPM number horizontally to nudge; tap it to type. Tap anywhere else to close the field and the menu. While playing, the glyph pulses MIDI-green on the beat and primary on the downbeat. |
| Vol | Master for the onboard engine. Mute parks the slider at 0; dragging it unmutes. Mute icon beside it. |
| Gear | Settings rail from the right. |
| Panic △ | All notes off, sustain off, sounding table flushed. Also CC120/123. |
3. Transport
Play lives on the pattern bar, left edge, and stays pinned while tiles scroll.
| Mode | What plays |
|---|---|
| SEQ | Armed/on grid tiles. Each tile’s pattern loops or fires by its own mode. Switching SEQ/PAT while playing cuts sounding notes and rebuilds the launch list. The roll playhead maps song time into the clip. |
| PAT | Only the selected pattern-bar clip. The roll playhead loops inside that clip’s steps. |
The clock cluster’s repeat icon is the song loop,
not the clip loop. PAT already loops the selected pattern via STEPS.
Next to the icon: − N BARS + (default 4, range 1–64). Bar
length follows the time signature — 4 bars of 3/4 is four bars of 3/4,
not a leftover 4/4 span.
Time signature lives in that same popdown (2/4 … 12/8). It drives bar lines on the roll, metronome accents, and the song-loop length.
Metronome is a short wood-block click, independent of master volume; click level is in Settings. First downbeat includes the click when metronome is on.
Follow-playhead on the roll (|<|>) chases the playhead
inside the pattern length — a 1-bar clip in a 4-bar song stays on that bar,
it does not walk into empty space. In SEQ, if that clip is not on in the
grid, the playhead is ghosted.
4. Pattern bar
- Tap a tile to select it (white border). Double-tap opens ROLL for that pattern.
- Hold still ~0.2s, then drag to reorder. Linear position is the pattern number; grid tiles that point at it update. A flick without the hold scrolls the bar.
- The dashed
+after the last clip appends a new empty pattern and opens the roll. A new project starts with one empty pattern, not eight. - Selected pattern in the bar does not play from transport by itself — grid tiles (SEQ) or PAT mode do.
- There is no BANK button here. BANK is a page in the top cluster (and a jump from the SEQ edit rail).
Screwdriver + trash: SEQ page. Trash only: BANK page. Both cans accept any dragged tile.
5. Lift / drop
| Drop on | Does |
|---|---|
| Trash (any can) | Deletes that tile / clip / pattern immediately. Cans rank first in hit-test. |
| Pattern bar slot | Reorder, or insert a bank clip as a new pattern. |
| SEQ pad | Place / swap. Bank clips become a pattern on that cell. |
| Folder | Move a bank clip into that folder. |
6. SEQ
Performance (edit off)
- Tap an empty slot’s
+to drop the selected bank/pattern onto it. New tiles come on. - Loop tile: tap toggles on/off. Playing tiles fill grey left-to-right with progress.
- 1-shot: tap plays through once.
- Hold: sounds only while the finger is down.
- Last-touched tile is the implicit selection for delete / opening edit. No yellow border outside edit.
- Hold-to-delete on the trash fills that pad red at the same rate as the can.
Edit (screwdriver)
Opens the right rail (stops under the SEQ menu bar). Tapping a tile selects
it and shows its settings — it does not trigger. Double-tap a tile opens
ROLL. A MIDI-green wireframe pulses around the grid while edit is on.
The screwdriver pulses a matching green border. Hold a selected tile,
then tap another slot to duplicate there. Child copies letter A–Z after
the parent number; past 26 the label is FU.
Rail (selected tile):
| Control | Does |
|---|---|
| Project transpose | Session-wide offset. Independent of clip transpose. Does not rewrite notes. Top of the rail, under the tile title. |
| Clip transpose | This tile. Independent of project. Pad badge shows the sum of project + pattern + tile. Edit rail does not retarget a pattern-bar clip if no grid tile is selected. |
| On / off | Whether this cell is sounding. Independent of loop/1-shot/hold. Pipe between On and Edit. |
| Loop / 1-shot / Hold | Trigger behaviour. Watermark: SF infinity, repeat.1, number.square. Switching to Hold clears a carried loop-on state immediately. 1-shots can be tapped off while queued or playing. |
| Chance | 0–100% chance a loop cycle fires. Shown as a small % on the pad. |
| Undo / Redo | SEQ-edit only (32 steps). Does not share history with the roll. |
| Sync / Free | Start quantized to the measure, or immediately. |
| MIDI channel | Per-tile. Ø = off (no MIDI out). 1–16 otherwise. |
| Edit | Opens ROLL for the pattern. |
| Bank | Jumps to the BANK page. |
| Emancipate | Bakes transpose into a new pattern, retargets the tile, appends the bar, scrolls to it. |
| GRID | Columns × rows at the end of the rail, under a horizontal hairline. Default 8 × 6. |
Toggled-off tiles keep a ghost of their notes. Empty unused slots stay dark.
7. BANK
BANK is its own page. It is not an overlay on SEQ, so drops cannot fall through onto the grid. It is the MIDI clip library — independent of the pattern bar and of the grid.
- Folders at the root. Tap a folder to enter; BACK returns. Folders save and load with the bank file.
- Tap a clip to select (white / focused). Double-tap appends it to the pattern bar and scrolls to it.
- Hold still ~0.2s and drag a clip onto the pattern bar (inserts / parts existing tiles), onto a folder, or onto a trash can.
- Play in the rail auditions the selection without the main transport.
+ Dirmakes a folder.Del Dirasks ARE YOU SURE? Clips in that folder stay, moved to root.- MIDI Import / Export on the rail. Type 1 SMF splits to several clips. Export bakes clip transpose.
- BANK FILE Load / Save is the whole library (clips + folders). Settings NEW BANK asks ARE YOU SURE and wipes clips only — not the pattern bar, not the grid.
- ADD SEQ TO BANK /
+ Midwrites the current pattern-bar clip into the library. It lives only in this rail, under BANK FILE.
There is no MOVE TO list. Drag a clip onto a folder instead.
8. ROLL
Two bars. Top: ROLL | SEQ [#] | N STEPS − + | draw box drag | snap | follow.
Second (SEL): Q HUM | TRANSPOSE −1 +1 with undo / redo / trash pinned right.
Dest and channel are not on these bars — they live on the keyboard strip under the roll.
| Tool | Behaviour |
|---|---|
| Draw (pencil) | Finger-down plants a note at snap length and auditions (13ms gate so a pinch doesn’t chirp). Drag moves pitch (held audition). Tap a drawn note to delete it. Drag the body to move. Pull the tail to stretch. No selection chrome, no dup/move/stretch buttons. |
| Box | Drag a rectangle in any direction from the press. Dup | move | stretch sit on the selection, pipes between them, tracking the box. Stretch (|→) pulls tails only; starts stay. Independent tail-drag still works on one note inside a selection. |
| Drag | One-finger pan. Two-finger pinch still pans/zooms on the grid. Stretch on the measure bar locks X; stretch on the left key rail locks Y. Diagonal pinch follows the ratio. |
- SEQ # is the first control after
ROLL |. It picks which pattern the roll is editing. - N STEPS is the clip length in sixteenths (dropdown of common lengths, − / + beside). Range 1–256. Does not change note length — that’s snap. Recording into the selected pattern-bar clip grows STEPS as needed. Song loop stays at N bars.
- Batteryblock toggles snap, then the division menu (1/1 … 1/16). Snap only affects draw / quantize / stretch — not pattern length. Faint verticals follow the snap division.
- Q / HUM / TRANSPOSE on the SEL bar apply to the selection (or all notes for HUM if nothing is selected). Undo / redo / trash stay pinned on the right of that second bar. Trash is the receptacle icon only.
- Keyboard dest + CH under the roll are the active pattern’s destination and channel. Pitch and mod wheels send on that dest/CH. Ø = off.
- Automation lane (cellularbars): VEL / PROB / CC1 / PB. Velocity and probability are per-note bars (drag across; stacked notes at the same start all move together). PROB is 0–100% per note, default 100; each loop cycle rolls independently. CC1 and PB paint a lane of dots.
- Snap-to-view (eye) fills the left keyboard gutter on the measure bar — tap it to fit active steps horizontally and the used octave vertically. Not a toggle.
- Measure bar is pinned top; automation lane pinned bottom. Content does not hide behind them at the scroll extremes.
- Keyboard under the roll is pulled by the stipple bar. At max rail compression the right controls collapse to a menu, then off-screen; keys and wheels keep height to the stipple.
9. PERF
Two independent surfaces (UPPER / LOWER), defaulting to pads. Each has its own dest, channel, scale/root, left rail, and right rail.
| Strip control | Does |
|---|---|
| UPPER / LOWER | Label. In landscape at low height these become buttons with a popout (dest, channel, PM/VV, scale, root, XY assigns) and the two strips merge into one:
[UPPER]:[keys][xy][knobs][faders] | [LOWER]:… |
| Surface glyphs | pianokeys / xʸ / cooktop / lightswitch — keyboard, XY pad, knobs, faders. Always visible on the bar. |
| PM / VV | Left-rail mode, after the glyphs. PM = pitch (labelled PTCH) + mod wheels on that surface’s dest/channel. VV = XY (mod/pitch) + velocity + volume (CC7) on that dest/channel. Upper defaults VV, lower defaults PM. |
| MIDI dest + CH | Independent per surface. Channel Ø = off (no MIDI from that surface). |
| Scale + root | At the end of the bar. Chromatic, named scales, whole, m3, M3, 4th, 5th. Non-chromatic keys get note labels. |
- Left rails match the right rail width so portrait does not clip the right controls.
- Landscape + low height: hide the upper VV XY pad; vel/vol fill. Knobs and sliders scale to the pane so LOWER is not eaten. XY dest/CC move into the UPPER/LOWER popouts.
- Width under 650pt: two-octave keyboard.
- Velocity fader on VV is the strike cap for that surface’s keys.
10. HARM
Menu bar is a single full-width scrollable row:
HARMONY | C1 chord dest/ch | 1/2 circles | C2 chord dest/ch | keys dest/ch.
C1 cluster sits over circle 1, C2 over circle 2, circles selector in the middle.
Keyboard starts swiped down; the keys glyph shows/hides dest/CH for that manual.
- Hold a chord, then another — both sound. Release order does not stick notes.
- Chord readout is per circle and returns to a dash on release. C1 is C1, C2 is C2 — sequencer and the other circle do not write the name.
- Layouts live in the side rail as
1/51/41/12(fifths / fourths / chromatic). Scale + root sit above Rings. Each ring has an octave ±3. - C1 and C2 do not share held notes or lights. A chord on circle 1 does not light circle 2, and does not steal its voices.
- The HARM keyboard under the circles is a third surface. Off by default. It does not share hold-state with either circle.
- C1/C2 rails are scrollable and stop under the harmony menu bar.
11. MIX
MIX only exists when Settings → Audio Engine is On, and only in the standalone app. Off and Dummy hide the page. Hosted inside AUM, On is refused and MIX does not exist.
- Catalog of generators and effects (third-party App Store AUv3s, plus Apple units if that toggle is on). Rescan if a newly installed plug-in is missing.
- Tap icon or UI to expand the plug-in under that mixer row — no floating window. The pane width-fits the mixer; height is capped, with a stipple rail along the bottom. Drag the stipple up to shrink, down to grow. A wider right margin is there to grab the mixer scroll, not a scrollbar.
- Only one UI expanded at a time. Expanding another collapses the last.
- MIX menu bar: dest picker (loaded AUs only — no DEFAULT / CoreMIDI) is linked to whichever UI is expanded. Change the dest → that AU expands. Expand an AU → dest follows. Channel sits next to dest. Mix keys, pitch, and mod go only to that plug-in, never to the virtual MIDI out or other apps.
- Keyboard button pops an adjustable-height manual under MIX (stipple like ROLL, no velocity lane). Track picker to its left is the same dest link.
- FX rows: delete X in front, wetness, up/down at the back. Second instance of the same unit is named
NAME 2. - Loaded generators appear in MIDI destination menus (SEQ rail, ROLL dest, PERF dest, HARM dest). New grid tiles inherit dest from their parent, then stay independent.
12. Manuals / keyboard
- Visible range: three octaves, two under 650pt width. adjustable with Oct Range setting on the manuals
- Velocity from vertical position (top of the key = harder).
- Right rail: GLISS, LATCH, MONO/POLY, PEDAL (hold). Octave range and root live on the keys menubar with dest/CH, PM/VV (where that surface has it), and scale. Left rail on PERF is PM or VV (see §9). ROLL wheels follow the keyboard dest/CH. MIX wheels follow the MIX dest/CH.
- Gliss: slide across keys, polyphonic if POLY is on.
- Latch: tap to hold, tap again to release that key. Turning LATCH off sends note-offs for anything you are not still holding — unless PEDAL is down, in which case the pedal keeps them until you lift it.
- PEDAL is hold-only. Down keeps sounding notes (and sends CC64). Up sends note-offs for notes that are not still pressed and not still latched. It is not a toggle.
- Mono: last-note priority. Hold C, tap E, C goes quiet; release E and C resumes. Same surface only.
- Note on and note off use the surface’s channel. Changing CH mid-hold is a new voice — lift, then play.
- Keyboard rails can collapse at any width. Stipple bars drag to resize. Hit area is larger than the dots. Intersecting stipples blend; no hard joint line.
13. Settings
| Block | Contents |
|---|---|
| Moon / Sun | Light mode. Roll notes, tile previews, and keys shift for the cooler white bg. Keys go purer white. |
| PROJECT | New (asks ARE YOU SURE), Load, Save, SMF. Session: patterns, grid, MIDI library, tempo, key. SMF writes Type 1 — conductor + one track per pattern-bar clip (transpose and channel baked). Unnamed projects get a generated name; save dialogs are always shown. |
| BANK | New / Load / Save the MIDI clip library only (clips + folders). New Bank does not touch the pattern bar or grid. First launch seeds ~128 kit clips in CHORDS / BASS / LEADS / DRUMS. |
| AUDIO ENGINE | Off (pure MIDI — dummy sine does not run) / Dummy (onboard sine) / On (AUv3 host + MIX). On is standalone only — inside AUM/Logic the control is hidden and On remaps to Dummy. Metronome + click level. Apple AU catalog toggle lives here if present. |
| MIDI ROUTING | Input port, In CH (Ø off, Omni, 1–16), MIDI thru. Dest and channel live on each surface (ROLL keyboard, PERF upper/lower, HARM C1/C2/keys, MIX keys, SEQ tiles). There is no master Out CH. Ø on a surface does not emit channel voice. MIDI In defaults to Ø. |
| MIDI CLOCK | Off / Int (sends clock to the output and the epicMIDI virtual port) / Ext (follows incoming start/stop/clock, estimates tempo). |
| EDITOR | Default velocity, velocity curve. Loop and time signature live on the clock popdown (song loop in bars). MPE is not implemented (channel AT / CC1 / PB only). |
On a narrow or short screen the MIDI monitor and BPM cluster migrate into this rail so the top bar stays readable.
14. Files
| Kind | Default name | Contains |
|---|---|---|
| Project | clever generated title, or the last save | Everything: patterns, grid, bank, tempo, theory, routing prefs. |
| Bank | project + “ bank”, or “bank” | MIDI clips and folders only. |
| MIDI clip | clip title | SMF. Type 0 = one clip. Type 1 import = one clip per track (name from track/instrument meta). |
| Project SMF | session / project name | Type 1. Conductor (tempo) + one named track per pattern-bar clip. Transpose and channel baked. Settings → PROJECT → SMF. |
Import MIDI from Files / share sheet. New clips append and the bank list scrolls to them. Export bakes the clip transpose.
15. MIDI I/O & clock
- Virtual source name: epicMIDI. Virtual destination: Epic MIDI In. Our own published packets are not re-ingested — no self-echo on the input.
- In CH: Ø ignores channel voice (clock still works). Omni accepts all. A number filters to that channel.
- Dest + CH are per surface. The MIDI monitor prints that surface’s channel, not a master. Thru forwards incoming MIDI out the virtual source; it does not remap to a global Out CH (there isn’t one).
- You can change ports while playing.
- Background audio stays on so MIDI keeps flowing when the app is minimized.
- CC1 = mod, CC64 = sustain, pitch bend, CC120/123 = panic. Note On velocity 0 = Note Off.
- Internal PPQN 1920. Clock 24 PPQ.
The green monitor is a 4-line trace of recent channel voice / CC / bend. It is not a log you can export.
16. AUv3
Two roles, never at the same time:
| Where | What epicMIDI is |
|---|---|
| Standalone app | AUv3 host. Engine On reveals MIX. Load App Store generators and effects. UI expands in the mixer row. MIX keys target the expanded unit only. Tiles and PERF dests can target loaded generators. Inter-App Audio is on the containing app so the catalog can see third-party units. |
| Inside AUM / Logic / GarageBand | AUv3 MIDI processor only (aumi, manufacturer EpMD, subtype eMID, name epicMIDI). Not an instrument. No nested host. No dummy sine on the audio callback (silence / memset). MIDI out uses the host’s midiOutputEventBlock. |
- Hosted mode does not open CoreMIDI virtual ports (that killed AUM’s helper). Sequencer, keys, and harm emit MIDI through the AU event block into AUM’s graph.
- Onboard synth is 32-voice sine with a short ADSR, idle-silent (no per-sample loop when no voices). Standalone Dummy uses it. Hosted AUM does not.
17. Gesture sheet
| Where | Gesture | Result |
|---|---|---|
| Any tile (bar, grid, bank) | Hold still ~0.2s, then move | Lift. Scroll is cancelled. Preview follows. |
| Any tile | Flick / pan before 0.2s | Scroll only. No pickup. |
| Lifted tile | Drop on trash / bar / pad / folder | See §7 |
| Roll grid | 1 finger (draw) | Plant / move / audition |
| Roll grid | 1 finger (box) | Select rectangle, any direction |
| Roll grid | 1 finger (drag) | Pan |
| Roll grid | 2 fingers | Pan + zoom; cancels a just-planted note |
| Measure bar | Pinch / stretch | Zoom X only |
| Key gutter | Pinch / drag | Zoom / pan Y |
| Velocity / PROB lane | Drag across | Paint velocity or per-note probability from Y |
| PEDAL | Hold | Sustain (CC64). Release sends hanging note-offs |
| Velocity / key stipple | Drag | Resize lane / keyboard height |
| Side rails | Drag only | Slide in/out (not a tap) |
| Trash | Hold 1s | Deletes the can’s active item |
| Bank clip | Double-tap | Append to pattern bar |
| Pattern tile | Double-tap | Open ROLL |
| SEQ pad (edit) | Double-tap | Open ROLL |
| Circle | Multi-touch | Multiple chords held |
| Keys | Vertical position | Velocity |