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.
| Section | Meaning |
|---|---|
| Sources | Controllers and apps that can send MIDI into GlassTracker. |
| Destinations | Hardware and apps that can receive GlassTracker’s external MIDI output. |
| GlassTracker’s own ports | Shown 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
- Put the controller in Bluetooth MIDI pairing mode.
- Open Device → BT MIDI.
- Choose the device in Apple’s Bluetooth MIDI panel and wait for Connected.
- Return to Device → MIDI Ports and confirm its Source/Destination switches.
- Test a simple note before building a complex route.
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:
| Route | What receives the incoming channel |
|---|---|
| Instrument | The selected tracker instrument slot, from INS 00 through INS 3F. |
| AU Rack | Every hosted instrument whose LISTENS ON value matches this channel. |
| Inserts | MIDI-aware insert effects listening on this channel. |
| All | The 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:
| Field | Use |
|---|---|
| Channel | Channel 1–16 used to select external parts, AU Rack slots, and inserts. |
| Dest | All, MIDI Out, AU Rack, or Inserts. All is the compatibility default. |
| Volume | Startup MIDI CC 7 value. This is separate from note velocity. |
| Program | Optional Program Change sent at sequencer start; OFF disables it. |
| Length | Gate time in tracker ticks. 00 sustains until the voice is replaced or stopped. |
| Automation / Table | Per-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:
| Setting | Destination |
|---|---|
| Off | No external or virtual output. The internal AU Rack route still works. |
| MIDI Out | Every enabled CoreMIDI destination from MIDI Ports. |
| Virtual Out | GlassTracker’s published virtual source for other apps. |
| Both | Enabled 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
| Message | Direction | Behavior |
|---|---|---|
| Note On / Note Off | Input & output | Live and sequenced triggering. Note On with velocity 0 is treated as Note Off. |
| Control Change | Input to hosted routes; output from tracker | MCC, CC 7 volume, external control, and mapped AU parameters. |
| Program Change | Input to hosted routes; output from tracker | Instrument Program field or MPC. |
| Pitch Bend | Input to hosted routes; output from tracker | External controller bends; tracker PSL/LEG. |
| Pressure | Input to hosted routes | Passed to matching AU Rack/insert destinations; tracker instruments do not currently act on it. |
| Start / Stop | Output | Sent to selected external/virtual sync routes. Hosted AUs always receive the host transport state. |
| Clock | Output when enabled | 24 PPQN while transport moves. Hosted AUs normally use host context instead. |
| SysEx / MIDI 2.0 UMP | Not generated by tracker | The 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.
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
Cycle root and relative semitone offsets. Interior zero repeats root; trailing zero ends the sequence.
Add up to four relative chord tones above the current note.
Send controller aa with value bb, both clamped to 00–7F. Also drives AU parameter maps.
Send Program Change bb.
Set note velocity for subsequent MIDI notes.
Move MIDI CC 7 volume toward bb; it does not set velocity.
Send linear or exponential pitch bend; explicitly reset center when needed.
Retrigger the MIDI note using bb as the tick length.
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 CC | Hex byte | MCC prefix |
|---|---|---|
| 1 | 01 | MCC 01bb |
| 16 | 10 | MCC 10bb |
| 22 | 16 | MCC 16bb |
| 64 | 40 | MCC 40bb |
| 127 | 7F | MCC 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/MTTfor musical row timing; use AU MIDI Nudge only for a fixed unreported plug-in offset.
Troubleshooting a silent or stuck route
- Confirm the endpoint is enabled in Device → MIDI Ports.
- Confirm Receive MIDI is on and inspect that channel’s MIDI Input destination.
- For output, confirm the MIDI instrument’s DEST includes the intended route.
- Match Channel to AU LISTENS ON or the external part.
- For an AU, start with DELIVERS AS 1 and a known audible patch.
- Disable Program Change, tables, and commands temporarily.
- 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.
- Reduce to one source and one destination, then add layers back.