Understanding MIDI CC 0 and CC 32 Bank Select
Standard MIDI Program Change commands can only recall up to 128 presets, creating a severe bottleneck for modern hardware and software instruments with extensive sound libraries. MIDI Continuous Controllers CC 0 and CC 32 solve this limitation by serving as Bank Select controllers—specifically Bank Select MSB (Most Significant Byte) and Bank Select LSB (Least Significant Byte). Working directly alongside standard Program Change messages, these two controllers allow instruments to organize, address, and access thousands of sound banks and sub-banks.
The 128-Preset Limitation
The original MIDI 1.0 specification allocates 7 bits of data to Program Change (PC) messages. Because \(2^7\) equals 128, a single MIDI channel can natively address values only from 0 to 127. While sufficient for early synthesizers, modern sound modules and virtual instruments often host thousands of patches, requiring an expanded addressing scheme.
How CC 0 and CC 32 Function Together
To expand patch memory without rewriting the core MIDI protocol, the MIDI Manufacturers Association defined CC 0 and CC 32 as Bank Select controllers. Both use 7-bit values (0–127) and work in tandem using a dual-byte, coarse/fine adjustment hierarchy:
- MIDI CC 0 (Bank Select MSB): Acts as the primary or "coarse" bank selector. It defines the overarching category, main bank, or broad collection of sounds (such as General MIDI banks, User banks, or Expansion boards).
- MIDI CC 32 (Bank Select LSB): Acts as the secondary or "fine" bank selector. It functions as the sub-bank selector, dividing the primary bank selected by CC 0 into smaller subdivisions.
By pairing CC 0 (128 possibilities) with CC 32 (128 possibilities), MIDI creates a 14-bit addressing system yielding 16,384 possible banks (\(128 \times 128\)). Because each of these banks can contain 128 individual Program Change presets, a system can theoretically address up to 2,097,152 unique presets per MIDI channel.
Sub-Bank Navigation Architecture
In practice, hardware synthesizers and sample libraries use CC 32 to organize variations of a central instrument category. For example, a manufacturer might configure sounds using the following hierarchy:
- CC 0 = 0: Acoustic Instruments (Main Bank)
- CC 32 = 0: Grand Pianos (Sub-bank 1)
- CC 32 = 1: Electric Pianos (Sub-bank 2)
- CC 32 = 2: Organs (Sub-bank 3)
- CC 0 = 1: Synthesizers (Main Bank)
- CC 32 = 0: Bass Synths (Sub-bank 1)
- CC 32 = 1: Lead Synths (Sub-bank 2)
- CC 32 = 2: Pad Synths (Sub-bank 3)
In this structure, adjusting CC 32 allows the user to switch between specialized sub-banks within a primary instrument collection.
Required Transmission Order
MIDI devices typically do not load a patch immediately upon receiving CC 0 or CC 32. Instead, the device buffers these values until it receives a Program Change command. To successfully load a preset from a specific sub-bank, data must be transmitted in this exact sequence:
- Send CC 0 (Value 0–127): Selects the target master bank.
- Send CC 32 (Value 0–127): Selects the target sub-bank within that master bank.
- Send Program Change (Value 0–127): Activates the specific patch within that sub-bank and switches the sound engine to the new preset.
If this sequence is interrupted or sent out of order, the synthesizer may either switch to an unintended sound within the currently active bank or ignore the bank change request entirely.