Mix & connect / 09

MIDI

Choose CoreMIDI ports, route every incoming channel, play tracker or AU instruments live, and send sequenced MIDI to external gear, other apps, hosted instruments, or effects.

CoreMIDI on iOS

GlassTracker participates in Apple’s CoreMIDI system. Sources and destinations can come from class-compliant USB hardware, network sessions, other apps’ virtual ports, or paired Bluetooth MIDI controllers.

The app publishes a virtual source named GlassTracker Out and a virtual destination named GlassTracker. Loopback guards prevent those two endpoints from feeding GlassTracker back into itself.

Choose MIDI Ports

Open Device → MIDI Ports to choose which endpoints participate at all.

SectionMeaning
SourcesControllers and apps that can send MIDI into GlassTracker.
DestinationsHardware and apps that can receive GlassTracker’s external MIDI output.
GlassTracker’s own portsShown for completeness, locked because the app manages their loopback policy.

Newly discovered endpoints default on. Switch off unused ports to prevent doubled notes, feedback paths, or an unrelated app from reaching the tracker. All On restores every external endpoint.

Pair Bluetooth MIDI

  1. Put the controller in Bluetooth MIDI pairing mode.
  2. Open Device → BT MIDI.
  3. Choose the device in Apple’s Bluetooth MIDI panel and wait for Connected.
  4. Return to Device → MIDI Ports and confirm its Source/Destination switches.
  5. Test a simple note before building a complex route.
Bluetooth MIDI is not Bluetooth audio

MIDI is control data. Sound still uses the active iOS audio route: speaker, headphones, USB interface, AirPlay, and so on.

Route incoming MIDI

Open Device → MIDI Input. Receive MIDI is the master gate: when it is off, incoming notes cannot play instruments or plug-ins, and incoming realtime transport messages have no effect.

Each channel 1–16 has its own destination:

RouteWhat receives the incoming channel
InstrumentThe selected tracker instrument slot, from INS 00 through INS 3F.
AU RackEvery hosted instrument whose LISTENS ON value matches this channel.
InsertsMIDI-aware insert effects listening on this channel.
AllThe tracker instrument, matching rack slots, and matching inserts together.

The default table is enabled and maps incoming channel 1 to tracker instrument 00, channel 2 to 01, and so on. Reset restores that layout. Input routing and port choices are device-rig preferences; they do not travel in a project.

Built-in keyboard on iPad

In the full iPad landscape workspace, tap the piano button directly above LEFT to open a multi-touch keyboard in the space between the two button banks. Tap the button again, or use the panel’s close control, to dismiss it.

  • Use the arrows around Octave to choose the starting C, shown in tracker notation such as C-3. MIDI Channel is a channel 1–16 picker. The Octaves arrows choose one or two octaves and default to one.
  • The selected channel uses the same Device → MIDI Input route as an external controller, so it can play a tracker Instrument, matching AU Rack slots, Inserts, or All. Receive MIDI must be on.
  • Slide between keys or play more than one key at once. Closing the panel, changing octave/channel/range, rotating, or leaving the app releases held notes.
  • Drag the panel’s title bar to move it. Drag the lower-right corner to resize it proportionally. RESET restores its centered default position and size.

Live input behavior

  • Hosted AU and insert routes receive live channel-voice messages immediately for low latency.
  • Tracker instruments currently act on incoming Note On and Note Off. Up to eight live tracker notes can use free song channels.
  • While the sequencer runs, live tracker notes avoid song channels it is already using instead of stealing those tracks.
  • Hosted plug-ins also receive routed CC, Program Change, pressure, and pitch bend messages.
  • Every CoreMIDI source has its own running-status parser. If input bytes overflow a bounded queue, GlassTracker resets that stream and silences voices instead of risking a stuck note.

Audio buffer and live-input latency

Device → Audio Buffer Size chooses a device-wide request of 128, 256, 512, or 1024 frames. The default is 1024 for the most conservative Audio Unit and route stability. Smaller buffers reduce the delay between an external MIDI key press and audible output, but make every render deadline tighter and can expose clicks or underruns in heavier projects.

  • Try 512 first when live keyboard latency matters; use 256 or 128 only if the current project and device remain stable.
  • Stop playback and recording and wait for project audio to finish loading before changing the setting. Applying it restarts the audio graph safely.
  • iOS treats the frame count as a preference. The Device row shows the active frame count when it differs and always shows the measured active duration.
  • The choice is stored on this device, not in a project. Bluetooth audio and external hardware add latency that this setting cannot remove.

Create a MIDI output instrument

A tracker MIDI instrument generates both external and hosted MIDI. Its fields are:

FieldUse
ChannelChannel 1–16 used to select external parts, AU Rack slots, and inserts.
DestAll, MIDI Out, AU Rack, or Inserts. All is the compatibility default.
VolumeStartup MIDI CC 7 value. This is separate from note velocity.
ProgramOptional Program Change sent at sequencer start; OFF disables it.
LengthGate time in tracker ticks. 00 sustains until the voice is replaced or stopped.
Automation / TablePer-tick or per-trigger MIDI command sequencing.

DEST prevents accidental fanout. If an external synth and an AU both listen on channel 5, use separate MIDI instruments with MIDI Out and AU Rack rather than changing the Phrase channel data.

External and virtual output

The Device screen’s MIDI output setting chooses the output class:

SettingDestination
OffNo external or virtual output. The internal AU Rack route still works.
MIDI OutEvery enabled CoreMIDI destination from MIDI Ports.
Virtual OutGlassTracker’s published virtual source for other apps.
BothEnabled CoreMIDI destinations plus the virtual source.

AU channel routing

A hosted unit has two channel values. LISTENS ON selects the instance; DELIVERS AS controls the channel byte that instance receives. Most isolated synth AUs work with DELIVERS AS 1. Use AS ROUTED for a multitimbral plug-in that must retain the original channel. See Audio Unit channel routing.

Messages and support

MessageDirectionBehavior
Note On / Note OffInput & outputLive and sequenced triggering. Note On with velocity 0 is treated as Note Off.
Control ChangeInput to hosted routes; output from trackerMCC, CC 7 volume, external control, and mapped AU parameters.
Program ChangeInput to hosted routes; output from trackerInstrument Program field or MPC.
Pitch BendInput to hosted routes; output from trackerExternal controller bends; tracker PSL/LEG.
PressureInput to hosted routesPassed to matching AU Rack/insert destinations; tracker instruments do not currently act on it.
Start / StopOutputSent to selected external/virtual sync routes. Hosted AUs always receive the host transport state.
ClockOutput when enabled24 PPQN while transport moves. Hosted AUs normally use host context instead.
SysEx / MIDI 2.0 UMPNot generated by trackerThe current musical model is MIDI 1.0 channel voice plus realtime transport.

MIDI Sync and AU tempo

Device → MIDI Sync: Send sends 24-PPQN Clock while the song moves, plus Start/Stop, to the selected external/virtual outputs. Off sends no wire clock.

Hosted Audio Units receive project tempo, beat position, and transport through Apple host callbacks whether external MIDI Sync is on or off. That is the preferred clock for AU sequencers, arpeggiators, delays, and LFOs. The AU Rack’s Advanced Options has a separate per-slot MIDI Clock switch only for a plug-in verified to require wire clock.

Do not enable every clock source

A plug-in may prefer incoming MIDI Clock over host context. Sending both can double-clock it or move it away from the exact render timeline. Test with AU MIDI Clock off first.

External MIDI-slave tempo synchronization is not a release guarantee. For timing-critical work, keep GlassTracker or the external system as one clear tempo authority.

Tracker MIDI commands

ARP abcd

Cycle root and relative semitone offsets. Interior zero repeats root; trailing zero ends the sequence.

MCH abcd

Add up to four relative chord tones above the current note.

MCC aabb

Send controller aa with value bb, both clamped to 00–7F. Also drives AU parameter maps.

MPC --bb

Send Program Change bb.

VEL --bb

Set note velocity for subsequent MIDI notes.

VOL aabb

Move MIDI CC 7 volume toward bb; it does not set velocity.

PSL / LEG

Send linear or exponential pitch bend; explicitly reset center when needed.

RTG aabb

Retrigger the MIDI note using bb as the tick length.

DLY / MTT

Move the entire Phrase row in whole ticks or eighth-tick subticks before its MIDI is scheduled.

CC numbers: decimal and hex

MIDI tools commonly show decimal controllers; tracker command bytes are hexadecimal. The AU map screen accepts decimal or a 0x-prefixed hex value and shows both.

Decimal CCHex byteMCC prefix
101MCC 01bb
1610MCC 10bb
2216MCC 16bb
6440MCC 40bb
1277FMCC 7Fbb

Timing notes

  • Sequenced engine-to-AU MIDI is timestamped against the audible graph timeline and drained at each slot’s pre-render boundary.
  • External CoreMIDI events use host-time timestamps derived from that same timeline, but cable and device latency remain outside the app.
  • Live incoming MIDI is intentionally immediate rather than quantized.
  • Bluetooth introduces more timing variability than a wired route.
  • Use Phrase DLY/MTT for musical row timing; use AU MIDI Nudge only for a fixed unreported plug-in offset.

Troubleshooting a silent or stuck route

  1. Confirm the endpoint is enabled in Device → MIDI Ports.
  2. Confirm Receive MIDI is on and inspect that channel’s MIDI Input destination.
  3. For output, confirm the MIDI instrument’s DEST includes the intended route.
  4. Match Channel to AU LISTENS ON or the external part.
  5. For an AU, start with DELIVERS AS 1 and a known audible patch.
  6. Disable Program Change, tables, and commands temporarily.
  7. If notes stick after a controller flood, stop transport or toggle Receive MIDI off/on; report the device/app because overflow recovery should already silence every route.
  8. Reduce to one source and one destination, then add layers back.