Korg Poly800/EX800 Users group photo

Yahoo Groups archive

Korg Poly800/EX800 Users

Index last updated: 2026-04-28 23:27 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:
Show quoted textHide quoted text
>
> 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



________________________________
Show quoted textHide quoted text
 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:
Show quoted textHide quoted text
>
> 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




________________________________
Show quoted textHide quoted text
 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:
Show quoted textHide quoted text
>
> 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
>

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.