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 two.
  • 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.
  • The keyboard is non-modal: leave it open while using tracker or rack controls. Notes continue to follow the selected Device → MIDI Input route.

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.

QWERTY Musical Typing

Press M while the tracker owns keyboard focus to toggle Musical Typing. The mode uses the same project-specific destination, instrument or AU target, octave, and note lifetime as the built-in keyboard. It is transient and starts off after relaunch.

  • A W S E D F T G Y H U J K play C, C#, D, D#, E, F, F#, G, G#, A, A#, B, and the next C. At the default octave, A is C-3.
  • Z/X move the base octave down/up. Toggling off, changing route or octave, rotating, backgrounding, or losing focus releases every held note.
  • While enabled, the musical keys replace the normal A/S/D pad aliases and matching AU UI shortcuts. Command, Control, and Option combinations, text fields, search fields, and plug-in interfaces retain normal input.
  • On iPad landscape, Musical Typing opens the floating piano. Compact layouts show a keyboard launcher that opens Octave, Destination, and target controls.

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.
Table Mode / TableClock runs MIDI commands continuously; Trigger advances one row per instrument trigger.

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.

Device → Ableton Link opens Ableton’s settings panel. Turn on Link to discover compatible apps and devices on the same local network. While peers are connected, GlassTracker follows the session’s exact tempo and beat phase; changing GlassTracker’s tempo proposes that change to the shared session.

  • PLAY launches on the next matching four-beat Link boundary and a normal Stop stays synchronized. The phone companion’s explicit STOP ALL SOUND action remains immediate.
  • Start Stop Sync is optional. When enabled, GlassTracker can send and follow Link transport intent. Joining a session that is already playing does not start GlassTracker by itself.
  • Opening or switching projects does not overwrite a connected Link session. With no peers, GlassTracker behaves like the ordinary local tracker.
  • Link and MIDI Sync are separate. MIDI Sync can send the Link-disciplined clock and transport to external gear, but avoid creating a feedback loop with multiple tempo authorities.
  • Audio Sharing publishes GlassTracker’s stereo Main output to Link Audio receivers. It includes master inserts and limiting, but not count-in/metronome clicks or file renders. GlassTracker does not receive Link Audio.
Monitoring Link Audio in Live

In Live, enable Settings → Link → Sync to Incoming Audio to align the monitored GlassTracker channel with Live’s clips and metronome. Without it, incoming audio is heard after Live’s configured network latency. Monitor the signal on only one side to avoid a delayed duplicate.

Background behavior

Playing audio remains active in the background. When stopped, GlassTracker stays available only when Start Stop Sync or enabled MIDI input may need to start it; otherwise it saves and sleeps until foregrounded.

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.