Korg Poly800/EX800 Users group photo

Yahoo Groups archive

Korg Poly800/EX800 Users

Index last updated: 2026-03-31 01:36 UTC

Thread

Decoding 800 Mk1 Cassette Data

Decoding 800 Mk1 Cassette Data

2012-08-21 by bereiden

Hi All,

I'm a new member here, having recently received a Poly 800 from a friend *for free*! I am trying to create a C program to interface with the cassette interface in order to perform backups and dumps to a laptop.

What I have been able to determine thus far is that the data is encoded using a 1/2 wave of either 700 ('0') or 1550 Hz ('1'). '0' bits are approximately twice as long as '1' bits when encoded, like so:

| 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
___ ___ ___ _______ ___ ___
| | | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
|___| |_______| |_______| |_______| |___| |

The output data (to the cassette) is filtered through a highpass filter so that bit changes are immediate. The input data (from the cassette) is passed through a low pass filter and a hard limiter before being sent to the SID pin of the uP. This leads me to believe that the Korg decodes the data using the time between zero crossings.

I have been able to successfully decode and verify the sequence and patch data, but need some help with the meaning of some of the other bytes.

byte 1: 0xB3 (I assume this is header info)
byte 2: 0xBF
byte 3: 0x00
bytes 4-259: Sequence data
bytes 260-290: ???
bytes 291-1634: Patch data
byte 1635: ???
byte 1636: Checksum (unsigned sum of bytes 4 through 1635)

Does anyone have any insight into what bytes 260-290 and byte 1635 might be? The factory cassette data is:

( 260): 00000000 (0x00)
( 261): 10110001 (0xB1)
( 262): 00000000 (0x00)
( 263): 00001001 (0x09)
( 264): 00000000 (0x00)
( 265): 00001011 (0x0B)
( 266): 00000000 (0x00)
( 267): 00000011 (0x03)
( 268): 00000010 (0x02)
( 269): 00000001 (0x01)
( 270): 00000000 (0x00)
( 271): 11111111 (0xFF)
( 272): 11111111 (0xFF)
( 273): 11111111 (0xFF)
( 274): 11111111 (0xFF)
( 275): 11111111 (0xFF)
( 276): 11111111 (0xFF)
( 277): 11111111 (0xFF)
( 278): 11111111 (0xFF)
( 279): 11111111 (0xFF)
( 280): 11111111 (0xFF)
( 281): 11111111 (0xFF)
( 282): 11111111 (0xFF)
( 283): 11111111 (0xFF)
( 284): 11111111 (0xFF)
( 285): 11111111 (0xFF)
( 286): 11111111 (0xFF)
( 287): 11111111 (0xFF)
( 288): 11111111 (0xFF)
( 289): 11111111 (0xFF)
( 290): 11111111 (0xFF)

(1635): 01011011 (0x5B)

Thanks!

Re: Decoding 800 Mk1 Cassette Data

2012-08-21 by bereiden

Sorry, the diagram is supposed to look like this (got bit by the formatting bug):

| 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
___ ___ ___ _______ ___ ___
| | | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
| | | | | | | | | | |
|___| |_______| |_______| |_______| |___| |


Re: [korgpolyex] Decoding 800 Mk1 Cassette Data

2012-08-21 by Gordon JC Pearce

On 21/08/12 13:33, bereiden wrote:
> Hi All,
>
> I'm a new member here, having recently received a Poly 800 from a
> friend *for free*! I am trying to create a C program to interface
> with the cassette interface in order to perform backups and dumps to
> a laptop.

So you're actually trying to decode the patch dumps and make sense of
them on the PC, rather than just using audacity to record them as audio?

--
Gordon JC Pearce MM0YEQ

Re: Decoding 800 Mk1 Cassette Data

2012-08-21 by bereiden

Yes.

So far I have a C program that reads a .wav file and decodes the data. If I can get an idea of what the remaining bytes are, I will then be able to write a routine to generate a .wav file.

For the dumps, I would still use Audacity to record the info, but then I could manipulate the data on the PC to create new patch files.


--- In korgpolyex@yahoogroups.com, Gordon JC Pearce <gordon@...> wrote:
>
> On 21/08/12 13:33, bereiden wrote:
> > Hi All,
> >
> > I'm a new member here, having recently received a Poly 800 from a
> > friend *for free*! I am trying to create a C program to interface
> > with the cassette interface in order to perform backups and dumps to
> > a laptop.
>
> So you're actually trying to decode the patch dumps and make sense of
> them on the PC, rather than just using audacity to record them as audio?
>
> --
> Gordon JC Pearce MM0YEQ
>

Re: [korgpolyex] Decoding 800 Mk1 Cassette Data

2012-08-21 by Michael Hawkins

Yes, the question on everyone's mind is "WHY?"

Though I must say, your work from the tape audio end of things is going to make it much easier for me to disassemble the tape assembler code that is one of only two sections of the original Korg Poly-800 code that I have not pulled apart.

I will certainly be saving the information that you have presented here. And bravo for having done what you did!

Mike

From: Gordon JC Pearce <gordon@...>
To: korgpolyex@yahoogroups.com
Sent: Tuesday, August 21, 2012 8:48 AM
Subject: Re: [korgpolyex] Decoding 800 Mk1 Cassette Data

On 21/08/12 13:33, bereiden wrote:
> Hi All,
>
> I'm a new member here, having recently received a Poly 800 from a
> friend *for free*! I am trying to create a C program to interface
> with the cassette interface in order to perform backups and dumps to
> a laptop.

So you're actually trying to decode the patch dumps and make sense of
them on the PC, rather than just using audacity to record them as audio?

--
Gordon JC Pearce MM0YEQ


Re: [korgpolyex] Re: Decoding 800 Mk1 Cassette Data

2012-08-21 by Michael Hawkins

A very interesting project/twist on the old problem of Poly-800 not having any sysex capability.

A shall have a look at the EX-800 sysex dump format again and see if I can help with those unknown bytes.

Mike


From: bereiden <bereiden@...>
To: korgpolyex@yahoogroups.com
Sent: Tuesday, August 21, 2012 9:01 AM
Subject: [korgpolyex] Re: Decoding 800 Mk1 Cassette Data

Yes.

So far I have a C program that reads a .wav file and decodes the data. If I can get an idea of what the remaining bytes are, I will then be able to write a routine to generate a .wav file.

For the dumps, I would still use Audacity to record the info, but then I could manipulate the data on the PC to create new patch files.

--- In korgpolyex@yahoogroups.com, Gordon JC Pearce <gordon@...> wrote:
>
> On 21/08/12 13:33, bereiden wrote:
> > Hi All,
> >
> > I'm a new member here, having recently received a Poly 800 from a
> > friend *for free*! I am trying to create a C program to interface
> > with the cassette interface in order to perform backups and dumps to
> > a laptop.
>
> So you're actually trying to decode the patch dumps and make sense of
> them on the PC, rather than just using audacity to record them as audio?
>
> --
> Gordon JC Pearce MM0YEQ
>



Re: Decoding 800 Mk1 Cassette Data

2012-08-29 by bereiden

Here is an update to the cassette data format:

byte 1: 0xB3 (I assume this is header info)
byte 2: 0xBF
byte 3: 0x00 (MIDI channel - 1)
bytes 4-259: Sequence data
bytes 260-270: Chord memory
bytes 271-290: ??? (so far always 0xFF)
bytes 291-1634: Patch data
byte 1635: ??? (different between the factory dump and my Poly 800)
byte 1636: Checksum (unsigned sum of bytes 3 through 1635)

The changes are identification of byte 3 as the MIDI channel, adding the chord memory region, and changing the checksum start from byte 4 to byte 3.

Note: The chord memory *should* only need 8 bytes to save an 8-note chord, but there are 11 bytes reserved. There may be some other information in that region that hasn't been identified yet.

Re: [korgpolyex] Re: Decoding 800 Mk1 Cassette Data

2012-08-29 by ASSI

On Wednesday 29 August 2012, 18:53:28, bereiden wrote:
> Here is an update to the cassette data format:
>
> byte 1: 0xB3 (I assume this is header info)
> byte 2: 0xBF
> byte 3: 0x00 (MIDI channel - 1)
> bytes 4-259: Sequence data
> bytes 260-270: Chord memory
> bytes 271-290: ??? (so far always 0xFF)

From the Poly800 MkII manual:

2. RAM data structure.

*The RAM data portion of DATA DUMP data is organized as shown here.
DATA RELATIVE ADDRESS BYTES(decimal)
---- ---------------- --------------

MIDI CHANNEL 000H 1
SEQ DATA 001H~3E8H 1000
(UNDEFINED) 3E9H~3F0H 8
CHORD MEMORY 3F1H~3F8H 8
SEQ MODE 3F9H 1
SEQ CKL 3FAH 1
PROG CHANGE DIS/ENA 3FBH 1
(UNDEFINED) 3FCH~3FFH 4
PROG DATA 4O0H~A7FH 1664


*Actually, when this data is transmitted on MIDI, each byte
is split at its least
significant four bits and sent starting from relative
address 000H.
(UNDEFINED data does not affect internal operation; it is
only used in the check sum.)

> bytes 291-1634: Patch data
> byte 1635: ??? (different between the factory dump and my Poly
> 800)
> byte 1636: Checksum (unsigned sum of bytes 3 through 1635)
>
> The changes are identification of byte 3 as the MIDI channel, adding the
> chord memory region, and changing the checksum start from byte 4 to byte
> 3.
>
> Note: The chord memory *should* only need 8 bytes to save an 8-note
> chord, but there are 11 bytes reserved. There may be some other
> information in that region that hasn't been identified yet.

Sound Untangled
---------------
0: Octave 1 (Val&0x03)
Octave 2 (Val&0x0c)>>2
0=Low
1=Mid
3=High
4=undef
Waveform 1 (Val&0x10)>>4
Waveform 2 (Val&0x40)>>6
0=Square
1=Saw
1: Harmonics 1 (Val&0x0f)
Harmonics 2 (Val&0xf0)>>4
1=16'
2= 8'
4= 4'
8= 2'
2: Detune (Val&0x03)
DCO Mode (Val&0x40)>>5
0=Whole
1=Double
Chorus (Val&0x80)>>7
0=On
1=Off
3: Interval min(Val&0x0f,12)
Noise Level (Val&0xf0)>>4
4: EG Int (Val&0x0f)
Polarity (Val&0x10)>>4
0=negative
1=positive
5: Level 1 (Val&0x1f)


6: Level 2 (Val&0x1f)
7: Cutoff min(Val&0x7f,99)

Trigger (Val&0x80)>>7
0=Single
1=Multi
8: MG Freq (Val&0x0f)
MG Delay (Val&0xf0)>>4
9: MG DCO (Val&0x0f)
MG VCF (Val&0xf0)>>4
10: DEG1 A (Val&0x1f)


11: DEG1 D (Val&0x1f)
12: DEG1 B (Val&0x1f)


13: DEG1 Sl (Val&0x1f)

14: DEG1 S (Val&0x1f)

15: DEG1 R (Val&0x1f)

16: DEG2 A (Val&0x1f)
17: DEG2 D (Val&0x1f)

18: DEG2 B (Val&0x1f)

19: DEG2 Sl (Val&0x1f)

20: DEG2 S (Val&0x1f)


21: DEG2 R (Val&0x1f)

22: DEG3 A (Val&0x1f)
23: DEG3 D (Val&0x1f)


24: DEG3 B (Val&0x1f)
25: DEG3 Sl (Val&0x1f)

26: DEG3 S (Val&0x1f)


27: DEG3 R (Val&0x1f)
28: Resonance (Val&0x0f)

Kbd Track (Val&0x30)
0=Off
1=Half
2=Full

Poly-800MkII
29: DDL Time min(Val&0x7f,99)
30: DDL FX Lev (Val&0xf0)>>4
DDL Feedbk (Val&0x0f)
31: DDL ModFreq (Val&0x1f)
32: DDL Mod Int (Val&0x1f)
33: EQ Bass (Val&0xf0)>>4
EQ Treble (Val&0x0f)


HTH,
Achim.
--
+<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+

SD adaptations for KORG EX-800 and Poly-800MkII V0.9:
http://Synth.Stromeko.net/Downloads.html#KorgSDada

Re: [korgpolyex] Re: Decoding 800 Mk1 Cassette Data

2012-08-30 by Michael Hawkins

This information relates to the MK2 sysex dump but that isn't going to work or match up to the Poly-800 (PS-800) or EX-800. I shall do my best to dredge up the EX-800 sysex format this weekend.

Mike


From: ASSI <Stromeko@...>
To: korgpolyex@yahoogroups.com
Sent: Wednesday, August 29, 2012 3:07 PM
Subject: Re: [korgpolyex] Re: Decoding 800 Mk1 Cassette Data

On Wednesday 29 August 2012, 18:53:28, bereiden wrote:
> Here is an update to the cassette data format:
>
> byte 1: 0xB3 (I assume this is header info)
> byte 2: 0xBF
> byte 3: 0x00 (MIDI channel - 1)
> bytes 4-259: Sequence data
> bytes 260-270: Chord memory
> bytes 271-290: ??? (so far always 0xFF)

From the Poly800 MkII manual:

2. RAM data structure.

*The RAM data portion of DATA DUMP data is organized as shown here.
DATA RELATIVE ADDRESS BYTES(decimal)
---- ---------------- --------------

MIDI CHANNEL 000H 1
SEQ DATA 001H~3E8H 1000
(UNDEFINED) 3E9H~3F0H 8
CHORD MEMORY 3F1H~3F8H 8
SEQ MODE 3F9H 1
SEQ CKL 3FAH 1
PROG CHANGE DIS/ENA 3FBH 1
(UNDEFINED) 3FCH~3FFH 4
PROG DATA 4O0H~A7FH 1664

*Actually, when this data is transmitted on MIDI, each byte
is split at its least
significant four bits and sent starting from relative
address 000H.
(UNDEFINED data does not affect internal operation; it is
only used in the check sum.)

> bytes 291-1634: Patch data
> byte 1635: ??? (different between the factory dump and my Poly
> 800)
> byte 1636: Checksum (unsigned sum of bytes 3 through 1635)
>
> The changes are identification of byte 3 as the MIDI channel, adding the
> chord memory region, and changing the checksum start from byte 4 to byte
> 3.
>
> Note: The chord memory *should* only need 8 bytes to save an 8-note
> chord, but there are 11 bytes reserved. There may be some other
> information in that region that hasn't been identified yet.

Sound Untangled
---------------
0: Octave 1 (Val&0x03)
Octave 2 (Val&0x0c)>>2
0=Low
1=Mid
3=High
4=undef
Waveform 1 (Val&0x10)>>4
Waveform 2 (Val&0x40)>>6
0=Square
1=Saw
1: Harmonics 1 (Val&0x0f)
Harmonics 2 (Val&0xf0)>>4
1=16'
2= 8'
4= 4'
8= 2'
2: Detune (Val&0x03)
DCO Mode (Val&0x40)>>5
0=Whole
1=Double
Chorus (Val&0x80)>>7
0=On
1=Off
3: Interval min(Val&0x0f,12)
Noise Level (Val&0xf0)>>4
4: EG Int (Val&0x0f)
Polarity (Val&0x10)>>4
0=negative
1=positive
5: Level 1 (Val&0x1f)

6: Level 2 (Val&0x1f)
7: Cutoff min(Val&0x7f,99)

Trigger (Val&0x80)>>7
0=Single
1=Multi
8: MG Freq (Val&0x0f)
MG Delay (Val&0xf0)>>4
9: MG DCO (Val&0x0f)
MG VCF (Val&0xf0)>>4
10: DEG1 A (Val&0x1f)

11: DEG1 D (Val&0x1f)
12: DEG1 B (Val&0x1f)

13: DEG1 Sl (Val&0x1f)

14: DEG1 S (Val&0x1f)

15: DEG1 R (Val&0x1f)

16: DEG2 A (Val&0x1f)
17: DEG2 D (Val&0x1f)

18: DEG2 B (Val&0x1f)

19: DEG2 Sl (Val&0x1f)

20: DEG2 S (Val&0x1f)

21: DEG2 R (Val&0x1f)

22: DEG3 A (Val&0x1f)
23: DEG3 D (Val&0x1f)

24: DEG3 B (Val&0x1f)
25: DEG3 Sl (Val&0x1f)

26: DEG3 S (Val&0x1f)

27: DEG3 R (Val&0x1f)
28: Resonance (Val&0x0f)

Kbd Track (Val&0x30)
0=Off
1=Half
2=Full

Poly-800MkII
29: DDL Time min(Val&0x7f,99)
30: DDL FX Lev (Val&0xf0)>>4
DDL Feedbk (Val&0x0f)
31: DDL ModFreq (Val&0x1f)
32: DDL Mod Int (Val&0x1f)
33: EQ Bass (Val&0xf0)>>4
EQ Treble (Val&0x0f)

HTH,
Achim.
--
+<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+

SD adaptations for KORG EX-800 and Poly-800MkII V0.9:
http://Synth.Stromeko.net/Downloads.html#KorgSDada



Re: [korgpolyex] Re: Decoding 800 Mk1 Cassette Data

2012-08-30 by ASSI

On Thursday 30 August 2012, 06:43:40, Michael Hawkins wrote:
> This information relates to the MK2 sysex dump but that isn't going to
> work or match up to the Poly-800 (PS-800) or EX-800. I shall do my best
> to dredge up the EX-800 sysex format this weekend.

TL;DR? — the differences for the MkII sound data are at the end of the post.
I don't remember how big the differences in the RAM data were, but nothing
earth-shattering. Anyway, that information was good enough for me to do the
EX800 SD adaptation, it is pretty obvious were and how the extensions of the
MkII have been bolted on.


Regards,
Achim.
--
+<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+

SD adaptation for Waldorf Blofeld V1.15B11:
http://Synth.Stromeko.net/Downloads.html#WaldorfSDada

Re: Decoding 800 Mk1 Cassette Data

2012-09-03 by korgpolyex800

I just uploaded the scan of the first five pages of the EX-800 manual which covers the sysex dump data layout.

http://f1.grp.yahoofs.com/v1/cDZFUJ_m1tQz8TUK1hgfEY5tqDl0sCmBx-xGLUb5dukJFADEKvfmsA4OO3iojr8_T6B6D3aNFAKBhyQucnca/2%29%20EX-800/Servicing/EX-800_Service_Manual_Pages_1_to_5.zip

Enjoy!

Mike

--- In korgpolyex@yahoogroups.com, ASSI <Stromeko@...> wrote:
>
> On Thursday 30 August 2012, 06:43:40, Michael Hawkins wrote:
> > This information relates to the MK2 sysex dump but that isn't going to
> > work or match up to the Poly-800 (PS-800) or EX-800. I shall do my best
> > to dredge up the EX-800 sysex format this weekend.
>
> TL;DR? â€" the differences for the MkII sound data are at the end of the post.
> I don't remember how big the differences in the RAM data were, but nothing
> earth-shattering. Anyway, that information was good enough for me to do the
> EX800 SD adaptation, it is pretty obvious were and how the extensions of the
> MkII have been bolted on.
>
>
> Regards,
> Achim.
> --
> +<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+
>
> SD adaptation for Waldorf Blofeld V1.15B11:
> http://Synth.Stromeko.net/Downloads.html#WaldorfSDada
>