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  
Sample Data:
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  
Pad Data:
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  
MIDI Data:
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
Slider Data:
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  
Footer Data:
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
)