Akai S5000 / S6000 Sampler AKP file specification & misc SCSI problems

======================================================================



Hacked by Seb Francis (seb@burnit.co.uk)



The new Akai S5000 and S6000 samplers use PC format disks and

hard drives to store their data.  Great I thought: now both my

PC and my sampler can share the same hard drives and interchange

information easily without disk swapping!  Unfortunately, it isn't

quite as straightforward as it should be:



(1) If the sampler writes to a shared hard drive, the computer will

not recognise the changes until rebooted.  The other way round is

ok if you press the 'UPDATE' button on the sampler to refresh the

disk cache.  So only a one way flow of information.



(2) If you use your system drive for both the PC and the sampler

then when saving or loading on the sampler there is a high risk

of a SCSI bus crash (both your PC and sampler will crash).  This

happens when both devices try to use the hard drive at the same

time (in contrast to the sampler, PCs tend to read from and

write to disk at 'random' moments - possibly whilst you are

saving or loading on the sampler).



So the answer is to have a separate hard drive for the sampler

which the PC can see and write to, but is not used by the PC

for general purposes.



(3) This brings me to the next problem with the Akai S5000 / S6000:

When there is no hard drive fitted inside the sampler, or in the

SCSI chain after the sampler, or if the sampler is not turned on,

then the SCSI chain is not terminated, and if your boot drive is

SCSI, then you cannot start your computer (this may not be the

case for all SCSI cards, but it certainly is for the  Adaptec

AHA-8940UW).  So you have to physically unplug the sampler or

turn it on every time you want to use the computer.



(4) Finally after all these problems just getting the sampler to

connect to the computer, there is no editing software available

for these new samplers (Akai's MESA only works up to the S3000).



So I thought I'd write some software myself.  Then I found that

the file specifications for the AKP (Akai Program File) and AKM

(Akai Multi File) were not available and not likely to be

available in the near future.  Not being the type to give up

too easily, I set about unravelling an AKP file.  This document

is the result.  I think I have managed to work out just about

every byte.  There are a couple of gaps, but these are probably

not used in the current OS version (1.11).



Armed with this file specification I am currently working on the

following bits of software:



(i)   An Akai program editor

(ii)  An SF2 (sound font file) to AKP converter

(iii) An AKP generator which assigns drum sounds produced in

      Steinberg's Recycle to the correct keys.



They are all being written in Java because it is quick and easy

and because it is (reasonably) cross-platform.  If anyone is

interested in these projects please drop me an email:



seb@burnit.co.uk



Also, if you write some software for the S5000 / S6000 yourself,

I would be very interested in hearing about it.



At some point I shall probably release a specification for AKM

files, but I think the AKP one is the most useful.





Notes on the file specification

-------------------------------



This file spec was worked out using an S6000 running OS v1.11.

An S5000 or an older OS may not support everything in this

format, but the structure should be identical.  If you have an

older OS, then upgrade it!! It's a free download from Akai's site.



The AKP file is basically in the standard RIFF file format,

however there are a couple of non-standard things:



The 4 bytes after the 'RIFF' header should indicate the number of

bytes remaining in the file.  Instead they are always set to 0.

It probably doesn't matter if they are not - I expect the sampler

just ignores them.



A RIFF file is made up of chunks: each one starting with a 4 byte

ASCII header and a 4 byte (double word) number representing the

length of the chunk.  Only two types of chunk are allowed to have

subchunks, the 'RIFF' chunk (the whole file) and any 'LIST' chunks.

In an AKP file, the 'kgrp' chunk contains 9 subchunks.  The kgrp

header is also slightly non-standard.



In a RIFF file, the name of each chunk should be unique.  In an

AKP file, this is not the case (e.g. the 2 'lfo ' chunks and the

3 'env ' chunks).  This doesn't matter as the chunks are always

written in the same order (which makes it nice and easy to write

software which reads AKP files).



Anyway, the upshot of these incompatibilities is: you will not

be able to use any of the standard libraries for reading RIFF

files.  You will have to write your own.





Where there is no description for a byte, it is recommended that

you use the hex value listed.  Certainly, the first and the last

bytes of a chunk's data are almost always 1 and 0 respectively.

The sampler may just ignore these, but who knows!



The default value for a byte is given in (parenthesis) and the

range of values is given afterwards.  These values are in decimal.

All values to the left are in hex.



Enjoy!





0000 - 0003:	'RIFF'

0004 - 0007:	00 00 00 00 (0)

0008 - 000B:	'APRG'





000C - 000F:	'prg '

0010 - 0013:	06 00 00 00 (6)



0014:	01	.

0015:	00	.

0016:	01	number of keygroups (1) 1 -> 99

0017:	00	.

0018:	02	.

0019:	00	.





001A - 001D:	'out '

001E - 0021:	08 00 00 00 (8)



0022:	01	.

0023:	55	Loudness (85) 0 -> 100

0024:	00	Amp Mod 1 (0) 0 -> 100

0025:	00	Amp Mod 2 (0) 0 -> 100

0026:	00	Pan Mod 1 (0) 0 -> 100

0027:	00	Pan Mod 2 (0) 0 -> 100

0028:	00	Pan Mod 3 (0) 0 -> 100

0029:	19	Velocity Sens (+025) -100 -> 100





002A - 002D:	'tune'

002E - 0031:	16 00 00 00 (22)



0032:	01	.

0033:	00	Semitone Tune (0) -36 -> 36

0034:	00	Fine Tune (0) -50 -> 50

0035:	00	C detune (0) -50 -> 50

0036:	00	C# detune (0) -50 -> 50

0037:	00	D detune (0) -50 -> 50

0038:	00	Eb detune (0) -50 -> 50

0039:	00	E detune (0) -50 -> 50

003A:	00	F detune (0) -50 -> 50

003B:	00	F# detune (0) -50 -> 50

003C:	00	G detune (0) -50 -> 50

003D:	00	G# detune (0) -50 -> 50

003E:	00	A detune (0) -50 -> 50

003F:	00	Bb detune (0) -50 -> 50

0040:	00	B detune (0) -50 -> 50

0041:	02	Pitchbend Up (2) 0 -> 24

0042:	02	Pitchbend Down (2) 0 -> 24

0043:	00	Bend Mode (0) 0 = NORMAL, 1 = HELD

0044:	00	Aftertouch (0) -12 -> 12

0045:	00	.

0046:	00	.

0047:	00	.





0048 - 004B:	'lfo ' (LFO 1)

004C - 004F:	0C 00 00 00 (12)



0050h:	01	.

0051h:	01	Waveform (1) 0 = SINE, 1 = TRIANGLE, 2 = SQUARE, 3 = SQUARE+,

		4 = SQUARE-, 5 = SAW BI, 6 = SAW UP, 7 = SAW DOWN, 8 = RANDOM

0052h:	2B	Rate (43) 0 -> 100

0053h:	00	Delay (0) 0 -> 100

0054h:	00	Depth (0) 0 -> 100

0055h:	00	LFO Sync (0) 0 = OFF, 1 = ON

0056h:	01	.

0057h:	0F	Modwheel (15) 0 -> 100

0058h:	00	Aftertouch (0) 0 -> 100

0059h:	00	Rate Mod (0) -100 -> 100

005Ah:	00	Delay Mod (0) -100 -> 100

005Bh:	00	Depth Mod (0) -100 -> 100





005C - 005F:	'lfo ' (LFO 2)

0060 - 0063:	0C 00 00 00 (12)



0064h:	01	.

0065h:	00	Waveform (0) 0 = SINE, 1 = TRIANGLE, 2 = SQUARE, 3 = SQUARE+,

		4 = SQUARE-, 5 = SAW BI, 6 = SAW UP, 7 = SAW DOWN, 8 = RANDOM

0066h:	00	Rate (0) 0 -> 100

0067h:	00	Delay (0) 0 -> 100

0068h:	00	Depth (0) 0 -> 100

0069h:	01	.

006Ah:	00	LFO Re-trigger (0) 0 = OFF, 1 = ON

006Bh:	00	.

006Ch:	00	.

006Dh:	00	Rate Mod (0) -100 -> 100

006Eh:	00	Delay Mod (0) -100 -> 100

006Fh:	00	Depth Mod (0) -100 -> 100





0070 - 0073:	'mods'

0074 - 0077:	26 00 00 00 (38)



0078h:	01	.

0079h:	00	.

007Ah:	11	.

007Bh:	00	.

007Ch:	02	.

007Dh:	06	Amp Mod 1 Src (6) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

007Eh:	02	.

007Fh:	03	Amp Mod 2 Src (3) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

0080h:	01	.

0081h:	08	Pan Mod 1 Src (8) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

0082h:	01	.

0083h:	06	Pan Mod 2 Src (6) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

0084h:	01	.

0085h:	01	Pan Mod 3 Src (1) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

0086h:	04	.

0087h:	06	LFO 1 Rate Mod Src (6) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

0088h:	05	.

0089h:	06	LFO 1 Delay Mod Src (6) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

008Ah:	03	.

008Bh:	06	LFO 1 Depth Mod Src (6) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

008Ch:	07	.

008Dh:	00	LFO 2 Rate Mod Src (0) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

008Eh:	08	.

008Fh:	00	LFO 2 Delay Mod Src (0) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

0090h:	06	.

0091h:	00	LFO 2 Depth Mod Src (0) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

0092h:	00	.

--- Keygroup Mod Sources: ---

0093h:	07	Pitch Mod 1 Src (7) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

0094h:	00	.

0095h:	0B	Pitch Mod 2 Src (11) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

0096h:	02	.

0097h:	05	Amp Mod Src (5) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

0098h:	09	.

0099h:	05	Filter Mod Input 1 (5) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

009Ah:	09	.

009Bh:	08	Filter Mod Input 2 (8) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL

009Ch:	09	.

009Dh:	09	Filter Mod Input 3 (9) 0 = NO SOURCE, 1 = MODWHEEL, 2 = BEND,

		3 = AFT'TOUCH, 4 = EXTERNAL, 5 = VELOCITY, 6 = KEYBOARD,

		7 = LFO1, 8 = LFO2, 9 = AMP ENV, 10 = FILT ENV, 11 = AUX ENV,

		12 = dMODWHEEL, 13 = dBEND, 14 = dEXTERNAL





------- First keygroup starts ------



009E - 00A1:	'kgrp'

00A2 - 00A5:	50 01 00 00 (336)



	00A6 - 00A9:	'kloc'

	00AA - 00AD:	10 00 00 00 (16)

	

	00AE:	01	.

	00AF:	03	.

	00B0:	01	.

	00B1:	04	.

	00B2:	15	low note (21) 21 -> 127

	00B3:	7F	high note (127) 21 -> 127

	00B4:	00	Semitone Tune (0) -36 -> 36

	00B5:	00	Fine Tune (0) -50 -> 50

	00B6:	00	Overide FX (0) 0 = OFF, 1 = FX1, 2 = FX2, 3 = RV3, 4 = RV4

	00B7:	00	FX Send Level (0) 0 -> 100

	00B8:	64	Pitch Mod 1 (100) -100 -> 100

	00B9:	00	Pitch Mod 2 (0) -100 -> 100

	00BA:	00	Amp Mod (0) -100 -> 100

	00BB:	00	Zone Xfade (0) 0 = OFF, 1 = ON

	00BC:	00	Mute Group

	00BD:	00	.

	

	

	00BE - 00C1:	'env ' (Amp Env)

	00C2 - 00C5:	12 00 00 00 (18)

	

	00C6:	01	.

	00C7:	00	Attack (0) 0 -> 100

	00C8:	00	.

	00C9:	32	Decay (50) 0 -> 100

	00CA:	0F	Release (15) 0 -> 100

	00CB:	00	.

	00CC:	00	.

	00CD:	64	Sustain (100) 0 -> 100

	00CE:	00	.

	00CF:	00	.

	00D0:	00	Velo->Attack (0) -100 -> 100

	00D1:	00	.

	00D2:	00	Keyscale (0) -100 -> 100

	00D3:	00	.

	00D4:	00	On Vel->Rel (0) -100 -> 100

	00D5:	00	Off Vel->Rel (0) -100 -> 100

	00D6:	00	.

	00D7:	00	.

	

	

	00D8 - 00DB:	'env ' (Filter Env)

	00DC - 00DF:	12 00 00 00 (18)

	

	00E0:	01	.

	00E1:	00	Attack (0) 0 -> 100

	00E2:	00	.

	00E3:	32	Decay (50) 0 -> 100

	00E4:	0F	Release (15) 0 -> 100

	00E5:	00	.

	00E6:	00	.

	00E7:	64	Sustain (100) 0 -> 100

	00E8:	00	.

	00E9:	00	Filt Env Depth (0) -100 -> 100

	00EA:	00	Velocity->Attack (0) -100 -> 100

	00EB:	00	.

	00EC:	00	Keyscale (0) -100 -> 100

	00ED:	00	.

	00EE:	00	On Vel->Rel (0) -100 -> 100

	00EF:	00	Off Vel->Rel (0) -100 -> 100

	00F0:	00	.

	00F1:	00	.

	

	

	00F2 - 00F5:	'env ' (Aux Env)

	00F6 - 00F9:	12 00 00 00 (18)

	

	00FA:	01	.

	00FB:	00	Rate 1 (0) 0 -> 100

	00FC:	32	Rate 2 (50) 0 -> 100

	00FD:	32	Rate 3 (50) 0 -> 100

	00FE:	0F	Rate 4 (15) 0 -> 100

	00FF:	64	Level 1 (100) 0 -> 100

	0100:	64	Level 2 (100) 0 -> 100

	0101:	64	Level 3 (100) 0 -> 100

	0102:	00	Level 4 (0) 0 -> 100

	0103:	00	.

	0104:	00	Vel->Rate 1 (0) -100 -> 100

	0105:	00	.

	0106:	00	Keyboard->R2/R4 (0) -100 -> 100

	0107:	00	.

	0108:	00	Vel->Rate 4 (0) -100 -> 100

	0109:	00	Off Vel->Rate 4 (0) -100 -> 100

	010A:	00	Vel->Out Level (0) -100 -> 100

	010B:	85	.

	

	

	010C - 010F:	'filt'

	0110 - 0113:	0A 00 00 00 (10)

	

	0114:	01	.

	0115:	00	Filter Mode (0) 0 = 2-POLE LP, 1 = 4-POLE LP,

			2 = 2-POLE LP+, 3 = 2-POLE BP, 4 = 4-POLE BP,

			5 = 2-POLE BP+, 6 = 1-POLE HP, 7 = 2-POLE HP,

			8 = 1-POLE HP+, 9 = LO<>HI, 10 = LO<>BAND, 11 = BAND<>HI,

			12 = NOTCH 1, 13 = NOTCH 2, 14 = NOTCH 3, 15 = WIDE NOTCH,

			16 = BI-NOTCH, 17 = PEAK 1, 18 = PEAK 2, 19 = PEAK 3,

			20 = WIDE PEAK, 21 = BI-PEAK, 22 = PHASER 1, 23 = PHASER 2,

			24 = BI-PHASE, 25 = VOWELISER

	0116:	64	Cutoff Freq (100) 0 -> 100

	0117:	00	Resonance (0) 0 -> 12

	0118:	00	Keyboard Track (0) -36 -> 36

	0119:	00	Mod Input 1 (0) -100 -> 100

	011A:	00	Mod Input 2 (0) -100 -> 100

	011B:	00	Mod Input 3 (0) -100 -> 100

	011C:	00	Headroom (0) 0 = 0db, 1 = 6db, 2 = 12db, 3 = 18db,

			4 = 24db, 5 = 30db

	011D:	00	.

	

	

	011E - 0121:	'zone' (Zone 1)

	0122 - 0125:	2E 00 00 00 (46)

	

	0126:	01	.

	0127:	nn	number of chars in Sample Name

	0128 - 013B:	Sample Name (pad with 00h)

			(if first character = 00h then no sample assigned)

	013C:	00	.

	013D:	00	.

	013E:	00	.

	013F:	00	.

	0140:	00	.

	0141:	00	.

	0142:	00	.

	0143:	00	.

	0144:	00	.

	0145:	00	.

	0146:	00	.

	0147:	00	.

	0148:	00	Low Velocity (0) 0 -> 127

	0149:	7F	High Velocity (127) 0 -> 127

	014A:	00	Fine Tune (0) -50 -> 50

	014B:	00	Semitone Tune (0) -36 -> 36

	014C:	00	Filter (0) -100 -> 100

	014D:	00	Pan/Balance (0) -50 -> 50 = L50 -> R50

	014E:	04	Playback (4) 0 = NO LOOPING, 1 = ONE SHOT, 2 = LOOP IN REL,

			3 = LOOP UNTIL REL, 4 = AS SAMPLE

	014F:	00	Output (0) 0 = MULTI, 1 = 1/2, 2 = 3/4, 3 = 5/6, 4 = 7/8,

			5 = 9/10, 6 = 11/12, 7 = 13/14, 8 = 15/16,

			9 = 1, 10 = 2, 11 = 3, 12 = 4, 13 = 5, 14 = 6, 15 = 7,

			16 = 8, 17 = 9, 18 = 10, 19 = 11, 20 = 12, 21 = 13,

			22 = 14, 23 = 15, 24 = 16

	0150:	00	Zone Level (0) -100 -> 100

	0151:	01	Keyboard Track (1) 0 = OFF, 1 = ON

	0152:	00	Velocity->Start LSB (0) }

	0153:	00	Velocity->Start MSB (0) } -9999 -> 9999

	

	

	0154 - 0157:	'zone' (Zone 2)

	0158 - 015B:	2E 00 00 00 (46)

	

	015C - 0189:	Zone 2 data

	

	

	018A - 018D:	'zone' (Zone 3)

	018E - 0191:	2E 00 00 00 (46)

	

	0192 - 01BF:	Zone 3 data

	

	

	01C0 - 01C3:	'zone' (Zone 4)

	01C4 - 01C7:	2E 00 00 00 (46)

	

	01C8 - 01F5:	Zone 4 data





------- Next keygroup starts ------