Nord Modular G2 Patch Format
VERSIONDraft 1
DATE29 April 2005
CONTRIBUTORSMichael Dewberry

Sections of this document:

Text Header
Binary Header
Data Objects
Footer
Text Header

A .pch2 file begins with a text header, terminated by the first NULL byte. The text consists of key-value pairs separated by 0x0D0A (CRLF).

Typical header:
  Version=Nord Modular G2 File Format 1
  Type=Patch
  Version=22
  Info=BUILD 192
Binary Header
The next two bytes after the 0x00 that ends the text header are a binary header of sorts, repeating the version already given in the text header, and specifying whether the file is a patch or a performance.
1 byte Version Should be equal to Version= line in text header
1 byte Type 0: Patch, 1: Performance
Data Objects

The rest of the information in a patch is stored in a series of "data objects". Each begins with a unique header byte followed by two bytes giving the length (in bytes) of the data in the object. The data fields of each object are tightly packed, and as a result most fields are NOT byte aligned. This saves space but makes parsing more of a challenge.

The objects appear in the following order in a Patch file. (In a Performance, the order and quantity of the modules are different.) Some objects appear twice -- one for the Voice Area, one for the FX Area.

Patch Description
Module List (x2)
Mystery Object 1
Cable List (x2)
Patch Settings
Module Parameters (x2)
Mystery Object 2
Knob Assignments
MIDI Controller Assignments
Mystery Object 3 (x3)
Module Names (x2)
Textpad
Patch Description
1 byte 0x21 Header byte
2 bytes Length Size of object, in bytes (not including three header bytes)
7 bytes unknown All zeros
5 bits unknown
5 bits Voice count
14 bits Height of FX/VA bar
3 bits unknown
1 bit Red cable visibility 0: off, 1: on
1 bit Blue cable visibility 0: off, 1: on
1 bit Yellow cable visibility 0: off, 1: on
1 bit Orange cable visibility 0: off, 1: on
1 bit Green cable visibility 0: off, 1: on
1 bit Purple cable visibility 0: off, 1: on
1 bit White cable visibility 0: off, 1: on
2 bits Mono/Poly 0: Poly, 1: Mono, 2: Legato
1 byte Active variation 0-7
1 byte Category 0: No Cat, 1: Acoustic, 2: Sequencer, 3: Bass, 4: Classic, 5: Drum, 6: Fantasy, 7: FX, 8: Lead, 9: Organ, 10: Pad, 11: Piano, 12: Synth, 13: Audio In, 14: User 1, 15: User 2
... Padding to <length> bytes
Module List (x2)
1 byte 0x4a Header byte
2 bytes Length Size of object, in bytes
2 bitsLocation0: FX Area, 1: Voice Area
1 byteModule countNumber of modules in this area
Repeat <module count> times
1 byteModule TypeFor type codes, see the Table of Modules.
1 byteModule IndexID # of this module. Generally starts at 1 and increases as you add modules to the patch. Deleting and adding new modules will fill in holes in the sequence. This value is used to refer to the module in other tables (cables, module parameters, etc.)
7 bitsHorizontal position0: leftmost column, 1: second column, etc.
7 bitsVertical position0: top of screen, 1: one step down, etc.
1 byteColorTODO: document codes for the various colors available in the editor
1 byteunknown
4 bitsunknown
(end repeat)
... Padding to <length> bytes
Mystery object 1
The meaning of the information in this object isn't yet known.
1 byte 0x69 Header byte
2 bytes Length Size of object, in bytes
... <length> bytes of data 80 00 00 20 00 00
Cable List (x2)
1 byte 0x52 Header byte
2 bytes Length Size of object, in bytes
2 bitsLocation0: FX Area, 1: Voice Area
1 byteCable countNumber of cables in this area
Repeat <cable count> times
3 bitsColor0: Red, 1: Blue, 2: Yellow, 3: Orange, 4: Green, 5: Purple, 6: White
1 byteModule FromID # of one module that this cable is attached to. Module IDs are given in the Module List object.
6 bitsJack From0-63. Will be either an input or an output jack depending on the Type parameter. The input and output jacks on each module are numbered separately. See the Table of Modules for input and output jack numbering.
1 bitType0: Input to Input cable, 1: Output to Input cable
1 byteModule ToID # of other module that this cable is attached to
6 bitsJack To0-63. Always refers to an input jack.
(end repeat)
... Padding to <length> bytes
Patch settings
Most patch settings are repeated 9 times (for Variations 1-8, and the Init Variation.)
1 byte 0x4d Header byte
2 bytes Length Size of object, in bytes
6 bytesunknown81 c2 40 48 00 00
Repeat 9 times
6 bytesunknownAll zeros?
1 byteMorph Group 10: Group #, 1: Wheel, 2: Vel, 4: Keyb, 8: Aft.Tch, 16: Sust.Pd, 32: Ctrl.Pd, 64: P.Stick, 128+: ---
1 byteMorph Group 2
1 byteMorph Group 3
1 byteMorph Group 4
1 byteMorph Group 5
1 byteMorph Group 6
1 byteMorph Group 7
1 byteMorph Group 8
1 byteunknown
(end repeat)
Repeat 9 times
1 byteVariation0-7: Variations 1-8, 8: Init Variation
1 bytePatch volume
6 bitsActive/Muted0: Muted, 1: Active
(end repeat)
15 bitsunknown
Repeat 9 times
1 byteVariation0-7: Variations 1-8, 8: Init Variation
7 bitsGlide0: Off, 1: Normal, 2: Auto
7 bitsGlide time
(end repeat)
15 bitsunknown
Repeat 9 times
1 byteVariation0-7: Variations 1-8, 8: Init Variation
7 bitsBend0: Off, 1: On
7 bitsBend semitones0: 1 semitone, 1: 2 semitones... 23: 24 semitones
(end repeat)
15 bitsunknown
Repeat 9 times
1 byteVariation0-7: Variations 1-8, 8: Init Variation
7 bitsVibrato0: None, 1: AfTouch, 2: Wheel
7 bitsVibrato cents
7 bitsVibrato rate
(end repeat)
15 bitsunknown
Repeat 9 times
1 byteVariation0-7: Variations 1-8, 8: Init Variation
7 bitsArpeggiator0: Off, 1: On
7 bitsArpeggiator time0: 1/8, 1: 1/8T, 2: 1/16, 3: 1/16T
7 bitsArpeggiator type0: Up, 1: Down, 2: Up/Down, 3: Rnd
7 bitsArpeggiator octaves
(end repeat)
15 bitsunknown
Repeat 9 times
1 byteVariation0-7: Variations 1-8, 8: Init Variation
7 bitsOctave shift0: -2, 1: -1, 2: 0, 3: 1, 4: 2
7 bitsSustain pedal0: Off, 1: On
(end repeat)
... Padding to <length> bytes
Module Parameters (x2)
1 byte 0x4d Header byte
2 bytes Length Size of object, in bytes
2 bitsLocation0: FX Area, 1: Voice Area
1 byteModule countNumber of modules in this area
1 byteunknown
Repeat <module count> times
1 byteModule IndexID # of module, see the Module List object
1 byteParameter countNumber of parameters on this module
Repeat 9 times
1 byteVariation # (0-8)
7 bitsParameter value (0-127)
.
.
.
One 7-bit entry for each of <parameter count> parameters. For the parameters of each module, see the Table of Modules.
(end repeat)
(end repeat)
... Padding to <length> bytes
Mystery object 2
The meaning of the information in this object isn't yet known.
1 byte 0x65 Header byte
2 bytes Length Size of object, in bytes
... <length> bytes of data Example: 09 80 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 30 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 50 00 00 00 00 00 00 00 00 60 00 00 00 00 00 00 00 00 70 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 00
Knob assignments
1 byte 0x62 Header byte
2 bytes Length Size of object, in bytes
2 bytesunknown00 78
Repeat 120 times
2 bitsunknown
1 byteModule index
2 bitsunknown
7 bitsKnob index
(end repeat)
... Padding to <length> bytes
MIDI Controller Assignments
1 byte 0x60 Header byte
2 bytes Length Size of object, in bytes
7 bitsAssignment countNumber of MIDI assignments in the patch
Repeat <Assignment count> times
7 bitsMIDI CC#
2 bitsType1: User, 2: System
1 byteModule Index(purpose unknown if Type=System)
7 bitsKnob Index(purpose unknown if Type=System)
(end repeat)
... Padding to <length> bytes
Mystery object 3 (x3)
The meaning of the information in this object isn't yet known. There are three of these in a patch, each with different contents.
1 byte 0x5b Header byte
2 bytes Length Size of object, in bytes
... <length> bytes of data Example A: 80 40 54 00 42 02 11 dc 9b dd 5c 08 0c 40 42 02 51 dc 9b dd 5c 08 0c 80 42 02 91 dc 9b dd 5c 08 0c c0 42 02 d1 dc 9b dd 5c 08 0d 00 42 03 11 dc 9b dd 5c 08 0d 40 42 03 51 dc 9b dd 5c 08 0d 80 42 03 91 dc 9b dd 5c 08 0d c0 42 03 d1 dc 9b dd 5c 08 0e 00
Example B: 40 00
Example C: 00 00
Module Names (x2)
1 byte 0x5a Header byte
2 bytes Length Size of object, in bytes
2 bitsLocation0: FX Area, 1: Voice Area
1 byteModule countNumber of modules in this area
Repeat <Module count> times
1 byteModule Index
...Module NameNull-terminated string
(end repeat)
... Padding to <length> bytes
Textpad
1 byte 0x6f Header byte
2 bytes Length Size of object, in bytes
... <length> bytes of textNot null terminated
Binary Footer
Finally, the .pch file ends with two bytes that appear to be some sort of checksum or timestamp.
2 bytesunknown