Stephen Norum—MPC 1000 PGM File Format
This page documents the Akai MPC 1000 PGM file format version 1.00. This information is provided to help developers create software for the MPC 1000. If information from this page is used in an application, I would love to hear about it.
Send me an e-mail at stephen@mybunnyhug.org if you have any questions or comments.
Take a look at my other projects!
Sample Code
Download sample MPC 1000 file loading and exporting Python code from
https://github.com/stephenn/pympc1000.
File Layout Overview
| Header |
| Pad 0 Sample 0 |
| Pad 0 Sample 1 |
| Pad 0 Sample 2 |
| Pad 0 Sample 3 |
| Pad 0 |
| Pad 1 Sample 0 |
| Pad 1 Sample 1 |
| Pad 1 Sample 2 |
| Pad 1 Sample 3 |
| Pad 1 |
| . . . |
| Pad 63 Sample 0 |
| Pad 63 Sample 1 |
| Pad 63 Sample 2 |
| Pad 63 Sample 3 |
| Pad 63 |
| MIDI |
| Slider 0 |
| Slider 1 |
| Footer |
The MPC 1000 PGM file format has five sections: Header, Sample and Pad, MIDI, Slider, and Footer.
Up to four samples can be assigned to each of the sixty-four pads.
File Information and Conventions
All file values are encoded as little-endian 2's complement or ASCII.
Data Types:
| Type | Size |
|---|---|
| char | 1 |
| int | 2 |
Symbol Definitions:
| Symbol | Description | Range |
|---|---|---|
| p | Pad number | 0 – 63 |
| s | Sample number | 0 – 3 |
| n | MIDI note number | 0 – 127 |
| r | Slider number | 0 – 1 |
File Layout
Header:| Offset | Size | Description | Type | Value | Min Value | Max Value | Notes |
|---|---|---|---|---|---|---|---|
| 0x00 | 2 | File size in bytes | unsigned int | 0x2A04 | – | – | |
| 0x02 | 2 | Padding | – | 0x00 | – | – | |
| 0x04 | 16 | Filetype String | char array | "MPC1000 PGM 1.00" | – | – | |
| 0x14 | 4 | Padding | – | 0x00 | – | – |
| Offset | Size | Description | Type | Value | Min Value | Max Value | Notes |
|---|---|---|---|---|---|---|---|
| (p * 0xA4) + (s * 0x18) + 0x00 | 16 | Sample Name | char array | – | – | – | Extensionless name of assigned sample file. ASCII, right-padded to 16 bytes with 0x00. Only space, alphanumeric characters, and !#$%&'()-@_{} are valid. |
| (p * 0xA4) + (s * 0x18) + 0x10 | 1 | Padding | – | 0x00 | – | – | |
| (p * 0xA4) + (s * 0x18) + 0x11 | 1 | Level | unsigned char | – | 0 | 100 | |
| (p * 0xA4) + (s * 0x18) + 0x12 | 1 | Range Lower | unsigned char | – | 0 | Range Upper | |
| (p * 0xA4) + (s * 0x18) + 0x13 | 1 | Range Upper | unsigned char | – | Range Lower | 127 | |
| (p * 0xA4) + (s * 0x18) + 0x14 | 2 | Tuning | int | – | -3600 | 3600 | Tuning in cents (1 semitone = 100 cents) |
| (p * 0xA4) + (s * 0x18) + 0x16 | 1 | Play Mode | char | – | 0 | 1 | 0="One Shot", 1="Note On" |
| (p * 0xA4) + (s * 0x18) + 0x17 | 1 | Padding | – | 0x00 | – | – |
| Offset | Size | Description | Type | Value | Min Value | Max Value | Notes |
|---|---|---|---|---|---|---|---|
| (p * 0xA4) + 0x60 | 2 | Padding | – | 0x00 | – | – | |
| (p * 0xA4) + 0x62 | 1 | Voice Overlap | char | – | 0 | 1 | 0="Poly", 1="Mono" |
| (p * 0xA4) + 0x63 | 1 | Mute Group | char | – | 0 | 32 | 0="Off", 1 to 32 |
| (p * 0xA4) + 0x64 | 1 | Padding | – | 0x00 | – | – | |
| (p * 0xA4) + 0x65 | 1 | Unknown | char | 0x01 | – | – | |
| (p * 0xA4) + 0x66 | 1 | Attack | unsigned char | – | 0 | 100 | |
| (p * 0xA4) + 0x67 | 1 | Decay | unsigned char | – | 0 | 100 | |
| (p * 0xA4) + 0x68 | 1 | Decay Mode | char | – | 0 | 1 | 0="End", 1="Start" |
| (p * 0xA4) + 0x69 | 2 | Padding | – | 0x00 | – | – | |
| (p * 0xA4) + 0x6B | 1 | Velocity to Level | unsigned char | – | 0 | 100 | |
| (p * 0xA4) + 0x6C | 5 | Padding | – | 0x00 | – | – | |
| (p * 0xA4) + 0x71 | 1 | Filter 1 Type | char | – | 0 | 3 | 0="Off", 1="Lowpass", 2="Bandpass", 3="Highpass" |
| (p * 0xA4) + 0x72 | 1 | Filter 1 Freq | unsigned char | – | 0 | 100 | |
| (p * 0xA4) + 0x73 | 1 | Filter 1 Res | unsigned char | – | 0 | 100 | |
| (p * 0xA4) + 0x74 | 4 | Padding | – | 0x00 | – | – | |
| (p * 0xA4) + 0x78 | 1 | Filter 1 Velocity to Frequency | unsigned char | – | 0 | 100 | |
| (p * 0xA4) + 0x79 | 1 | Filter 2 Type | char | – | 0 | 4 | 0="Off", 1="Lowpass", 2="Bandpass", 3="Highpass", 4="Link" |
| (p * 0xA4) + 0x7A | 1 | Filter 2 Freq | unsigned char | – | 0 | 100 | |
| (p * 0xA4) + 0x7B | 1 | Filter 2 Res | unsigned char | – | 0 | 100 | |
| (p * 0xA4) + 0x7C | 4 | Padding | – | 0x00 | – | – | |
| (p * 0xA4) + 0x80 | 1 | Filter 2 Velocity to Frequency | unsigned char | – | 0 | 100 | |
| (p * 0xA4) + 0x81 | 14 | Padding | – | 0x00 | – | – | |
| (p * 0xA4) + 0x8F | 1 | Mixer Level | unsigned char | – | 0 | 100 | |
| (p * 0xA4) + 0x90 | 1 | Mixer Pan | unsigned char | – | 0 | 100 | 0 to 49=Left, 50=Center, 51 to 100=Right |
| (p * 0xA4) + 0x91 | 1 | Output | char | – | 0 | 2 | 0="Stereo", 1="1-2", 2="3-4" |
| (p * 0xA4) + 0x92 | 1 | FX Send | char | – | 0 | 2 | 0="Off", 1="1", 2="2" |
| (p * 0xA4) + 0x93 | 1 | FX Send Level | unsigned char | – | 0 | 100 | |
| (p * 0xA4) + 0x94 | 1 | Filter Attenuation | char | – | 0 | 2 | 0="0dB", 1="-6dB", 2="-12dB" |
| (p * 0xA4) + 0x95 | 15 | Padding | – | 0x00 | – | – |
| Offset | Size | Description | Type | Value | Min Value | Max Value | Notes |
|---|---|---|---|---|---|---|---|
| 0x2918 + p | 1 | Pad MIDI Note Values | unsigned char | – | 0 | 127 | MIDI note number associated with pad number, p (0 to 63) |
| 0x2958 + n | 1 | MIDI Note Pad Values | unsigned char | – | 0 | 64 | Pad number (0 to 63) associated with the MIDI note number, n (0 to 127). Unassigned MIDI note numbers are padded with 64, an out-of-range pad number. |
| 0x29D8 | 1 | MIDI Program Change | unsigned char | – | 0 | 128 | 0="Off", 1 to 128 |
| Offset | Size | Description | Type | Value | Min Value | Max Value | Notes |
|---|---|---|---|---|---|---|---|
| (r * 0x0D) + 0x29D9 | 1 | Slider r Pad | unsigned char | – | 0 | 63 | |
| (r * 0x0D) + 0x29DA | 1 | Unknown | char | 0x01 | – | – | |
| (r * 0x0D) + 0x29DB | 1 | Slider r Parameter | char | – | 0 | 4 | 0="Tune", 1="Filter", 2="Layer", 3="Attack", 4="Decay" |
| (r * 0x0D) + 0x29DC | 1 | Slider r Tune Low | char | – | -120 | Slider r Tune High | |
| (r * 0x0D) + 0x29DD | 1 | Slider r Tune High | char | – | Slider r Tune Low | 120 | |
| (r * 0x0D) + 0x29DE | 1 | Slider r Filter Low | char | – | -50 | Slider r Filter High | |
| (r * 0x0D) + 0x29DF | 1 | Slider r Filter High | char | – | Slider r Filter Low | 50 | |
| (r * 0x0D) + 0x29E0 | 1 | Slider r Layer Low | char | – | 0 | Slider r Layer High | |
| (r * 0x0D) + 0x29E1 | 1 | Slider r Layer High | char | – | Slider r Layer Low | 127 | |
| (r * 0x0D) + 0x29E2 | 1 | Slider r Attack Low | char | – | 0 | Slider r Attack High | |
| (r * 0x0D) + 0x29E3 | 1 | Slider r Attack High | char | – | Slider r Attack Low | 100 | |
| (r * 0x0D) + 0x29E4 | 1 | Slider r Decay Low | char | – | 0 | Slider r Decay High | |
| (r * 0x0D) + 0x29E5 | 1 | Slider r Decay High | char | – | Slider r Decay Low | 100 |
| Offset | Size | Description | Type | Value | Min Value | Max Value | Notes |
|---|---|---|---|---|---|---|---|
| 0x29F3 | 17 | Padding | – | 0x00 | – | – |
File Layout: Python Struct Encoding
The MPC 1000 PGM file format is documented below using Python struct module format strings.
header = (
'<' # Little-endian
'H' # File size
'2x' # Padding
'16s' # "MPC1000 PGM 1.00"
'4x' # Padding
)
sample = (
'<' # Little-endian
'16s' # Sample Name
'x' # Padding
'B' # Level
'B' # Range Upper
'B' # Range Lower
'h' # Tuning
'B' # Play Mode (0="One Shot", 1="Note On")
'x' # Padding
)
pad = (
'<' # Little-endian
'2x' # Padding
'b' # Voice Overlap (0="Poly", 1="Mono")
'b' # Mute Group (0="Off", 1 to 32)
'x' # Padding
'B' # Unknown
'B' # Attack
'B' # Decay
'B' # Decay Mode (0="End", 1="Start")
'2x' # Padding
'B' # Velocity to Level
'5x' # Padding
'b' # Filter 1 Type (0="Off", 1="Lowpass", 2="Bandpass", 3="Highpass")
'B' # Filter 1 Freq
'B' # Filter 1 Res
'4x' # Padding
'B' # Filter 1 Velocity to Frequency
'B' # Filter 2 Type (0="Off", 1="Lowpass", 2="Bandpass", 3="Highpass", 4="Link")
'B' # Filter 2 Freq
'B' # Filter 2 Res
'4x' # Padding
'B' # Filter 2 Velocity to Frequency
'14x' # Padding
'B' # Mixer Level
'B' # Mixer Pan (0 to 49=Left, 50=Center, 51 to 100=Right)
'B' # Output (0="Stereo", 1="1-2", 2="3-4")
'B' # FX Send (0="Off", 1="1", 2="2")
'B' # FX Send Level
'B' # Filter Attenuation (0="0dB", 1="-6dB", 2="-12dB")
'15x' # Padding
)
midi = (
'<' # Little-endian
'64B' # Pad MIDI note mapping
'128B' # MIDI note pad mapping
'B' # MIDI Program Change (0="Off", 1 to 128)
)
slider = (
'<' # Little-endian
'B' # Slider Pad
'B' # Unknown
'B' # Slider Parameter (0="Tune", 1="Filter", 2="Layer", 3="Attack", 4="Decay")
'b' # Slider Tune Low
'b' # Slider Tune High
'b' # Slider Filter Low
'b' # Slider Filter High
'B' # Slider Layer Low
'B' # Slider Layer High
'B' # Slider Attack Low
'B' # Slider Attack High
'B' # Slider Decay Low
'B' # Slider Decay High
)
footer = (
'<' # Little-endian
'17x' # Padding
)