MyBunnyhug

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.

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 uint_16 0x2A04  
0x02 2 Padding 0x00  
0x04 16 Filetype String int_8 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 int_8 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 uint_8 0 100  
(p * 0xA4) + (s * 0x18) + 0x12 1 Range Lower uint_8 0 Range Upper  
(p * 0xA4) + (s * 0x18) + 0x13 1 Range Upper uint_8 Range Lower 127  
(p * 0xA4) + (s * 0x18) + 0x14 2 Tuning int_16 -3600 3600 Tuning in cents (1 semitone = 100 cents)
(p * 0xA4) + (s * 0x18) + 0x16 1 Play Mode int_8 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 int_8 0 1 0="Poly", 1="Mono"
(p * 0xA4) + 0x63 1 Mute Group int_8 0 32 0="Off", 1 to 32
(p * 0xA4) + 0x64 1 Padding 0x00  
(p * 0xA4) + 0x65 1 Unknown int_8 0x01  
(p * 0xA4) + 0x66 1 Attack uint_8 0 100  
(p * 0xA4) + 0x67 1 Decay uint_8 0 100  
(p * 0xA4) + 0x68 1 Decay Mode int_8 0 1 0="End", 1="Start"
(p * 0xA4) + 0x69 2 Padding 0x00  
(p * 0xA4) + 0x6B 1 Velocity to Level uint_8 0 100  
(p * 0xA4) + 0x6C 5 Padding 0x00  
(p * 0xA4) + 0x71 1 Filter 1 Type int_8 0 3 0="Off", 1="Lowpass", 2="Bandpass", 3="Highpass"
(p * 0xA4) + 0x72 1 Filter 1 Freq uint_8 0 100  
(p * 0xA4) + 0x73 1 Filter 1 Res uint_8 0 100  
(p * 0xA4) + 0x74 4 Padding 0x00  
(p * 0xA4) + 0x78 1 Filter 1 Velocity to Frequency uint_8 0 100  
(p * 0xA4) + 0x79 1 Filter 2 Type int_8 0 4 0="Off", 1="Lowpass", 2="Bandpass", 3="Highpass", 4="Link"
(p * 0xA4) + 0x7A 1 Filter 2 Freq uint_8 0 100  
(p * 0xA4) + 0x7B 1 Filter 2 Res uint_8 0 100  
(p * 0xA4) + 0x7C 4 Padding 0x00  
(p * 0xA4) + 0x80 1 Filter 2 Velocity to Frequency uint_8 0 100  
(p * 0xA4) + 0x81 14 Padding 0x00  
(p * 0xA4) + 0x8F 1 Mixer Level uint_8 0 100  
(p * 0xA4) + 0x90 1 Mixer Pan uint_8 0 100 0 to 49=Left, 50=Center, 51 to 100=Right
(p * 0xA4) + 0x91 1 Output int_8 0 2 0="Stereo", 1="1-2", 2="3-4"
(p * 0xA4) + 0x92 1 FX Send int_8 0 2 0="Off", 1="1", 2="2"
(p * 0xA4) + 0x93 1 FX Send Level uint_8 0 100  
(p * 0xA4) + 0x94 1 Filter Attenuation int_8 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 uint_8 0 127 MIDI note number associated with pad number, p (0 to 63)
0x2958 + n 1 MIDI Note Pad Values uint_8 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 uint_8 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 uint_8 0 63  
(r * 0x0D) + 0x29DA 1 Unknown int_8 0x01  
(r * 0x0D) + 0x29DB 1 Slider r Parameter int_8 0 4 0="Tune", 1="Filter", 2="Layer", 3="Attack", 4="Decay"
(r * 0x0D) + 0x29DC 1 Slider r Tune Low int_8 -120 Slider r Tune High  
(r * 0x0D) + 0x29DD 1 Slider r Tune High int_8 Slider r Tune Low 120  
(r * 0x0D) + 0x29DE 1 Slider r Filter Low int_8 -50 Slider r Filter High  
(r * 0x0D) + 0x29DF 1 Slider r Filter High int_8 Slider r Filter Low 50  
(r * 0x0D) + 0x29E0 1 Slider r Layer Low int_8 0 Slider r Layer High  
(r * 0x0D) + 0x29E1 1 Slider r Layer High int_8 Slider r Layer Low 127  
(r * 0x0D) + 0x29E2 1 Slider r Attack Low int_8 0 Slider r Attack High  
(r * 0x0D) + 0x29E3 1 Slider r Attack High int_8 Slider r Attack Low 100  
(r * 0x0D) + 0x29E4 1 Slider r Decay Low int_8 0 Slider r Decay High  
(r * 0x0D) + 0x29E5 1 Slider r Decay High int_8 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
)