epicMIDI

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.

2. Chrome

epicMIDI top bar and pattern bar
Top bar (logo, record, bar/beat, clock, pages, vol, settings, panic) and pattern bar under it.

Two strips sit above every page:

  1. 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.
  2. 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.
ControlDoes
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.beatPlayhead readout. Stays with the clock cluster, right of the page-switch pipe.
ClockWhen 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.
VolMaster for the onboard engine. Mute parks the slider at 0; dragging it unmutes. Mute icon beside it.
GearSettings 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.

ModeWhat plays
SEQArmed/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.
PATOnly 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

Screwdriver + trash: SEQ page. Trash only: BANK page. Both cans accept any dragged tile.

5. Lift / drop

Drop onDoes
Trash (any can)Deletes that tile / clip / pattern immediately. Cans rank first in hit-test.
Pattern bar slotReorder, or insert a bank clip as a new pattern.
SEQ padPlace / swap. Bank clips become a pattern on that cell.
FolderMove a bank clip into that folder.

6. SEQ

epicMIDI SEQ grid and rail
SEQ grid + right rail. Yellow border = edit-mode selection only.

Performance (edit off)

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):

ControlDoes
Project transposeSession-wide offset. Independent of clip transpose. Does not rewrite notes. Top of the rail, under the tile title.
Clip transposeThis 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 / offWhether this cell is sounding. Independent of loop/1-shot/hold. Pipe between On and Edit.
Loop / 1-shot / HoldTrigger 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.
Chance0–100% chance a loop cycle fires. Shown as a small % on the pad.
Undo / RedoSEQ-edit only (32 steps). Does not share history with the roll.
Sync / FreeStart quantized to the measure, or immediately.
MIDI channelPer-tile. Ø = off (no MIDI out). 1–16 otherwise.
EditOpens ROLL for the pattern.
BankJumps to the BANK page.
EmancipateBakes transpose into a new pattern, retargets the tile, appends the bar, scrolls to it.
GRIDColumns × 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

epicMIDI BANK page
BANK page — folders, clips, file rail, trash.

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.

There is no MOVE TO list. Drag a clip onto a folder instead.

8. ROLL

epicMIDI piano roll
ROLL — SEQ #, steps, tools on the top bar; selection ops on the second.

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.

ToolBehaviour
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.
BoxDrag 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.
DragOne-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.

9. PERF

epicMIDI dual performance surfaces
PERF — upper and lower surfaces, independent dest / channel / scale.

Two independent surfaces (UPPER / LOWER), defaulting to pads. Each has its own dest, channel, scale/root, left rail, and right rail.

Strip controlDoes
UPPER / LOWERLabel. 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 glyphspianokeys / xʸ / cooktop / lightswitch — keyboard, XY pad, knobs, faders. Always visible on the bar.
PM / VVLeft-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 + CHIndependent per surface. Channel Ø = off (no MIDI from that surface).
Scale + rootAt the end of the bar. Chromatic, named scales, whole, m3, M3, 4th, 5th. Non-chromatic keys get note labels.

10. HARM

epicMIDI circle of fifths
HARM — one or two circles, independent C1 / C2.

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.

11. MIX

epicMIDI mixer with nested AUv3 UI
MIX — plug-in UI nested under the mixer row.

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.

12. Manuals / keyboard

13. Settings

epicMIDI settings rail
Settings rail. Sun/moon is light mode.
BlockContents
Moon / SunLight mode. Roll notes, tile previews, and keys shift for the cooler white bg. Keys go purer white.
PROJECTNew (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.
BANKNew / 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 ENGINEOff (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 ROUTINGInput 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 CLOCKOff / Int (sends clock to the output and the epicMIDI virtual port) / Ext (follows incoming start/stop/clock, estimates tempo).
EDITORDefault 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

KindDefault nameContains
Projectclever generated title, or the last saveEverything: patterns, grid, bank, tempo, theory, routing prefs.
Bankproject + “ bank”, or “bank”MIDI clips and folders only.
MIDI clipclip titleSMF. Type 0 = one clip. Type 1 import = one clip per track (name from track/instrument meta).
Project SMFsession / project nameType 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

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:

WhereWhat epicMIDI is
Standalone appAUv3 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 / GarageBandAUv3 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.

17. Gesture sheet

WhereGestureResult
Any tile (bar, grid, bank)Hold still ~0.2s, then moveLift. Scroll is cancelled. Preview follows.
Any tileFlick / pan before 0.2sScroll only. No pickup.
Lifted tileDrop on trash / bar / pad / folderSee §7
Roll grid1 finger (draw)Plant / move / audition
Roll grid1 finger (box)Select rectangle, any direction
Roll grid1 finger (drag)Pan
Roll grid2 fingersPan + zoom; cancels a just-planted note
Measure barPinch / stretchZoom X only
Key gutterPinch / dragZoom / pan Y
Velocity / PROB laneDrag acrossPaint velocity or per-note probability from Y
PEDALHoldSustain (CC64). Release sends hanging note-offs
Velocity / key stippleDragResize lane / keyboard height
Side railsDrag onlySlide in/out (not a tap)
TrashHold 1sDeletes the can’s active item
Bank clipDouble-tapAppend to pattern bar
Pattern tileDouble-tapOpen ROLL
SEQ pad (edit)Double-tapOpen ROLL
CircleMulti-touchMultiple chords held
KeysVertical positionVelocity