Skip to content

Commit 6cac190

Browse files
committed
* Added support for reading Akai MESA (*.s3p)
* Added support for reading Akai S1000/S3000 series images (*.iso)
1 parent f3df6c7 commit 6cac190

30 files changed

Lines changed: 1145 additions & 458 deletions

documentation/CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# Changes
22

3-
## 16.2.0 (unreleased)
3+
## 16.2.0
44

5+
* Added support for reading Akai MESA (*.s3p)
56
* Added support for reading Akai S1000/S3000 series images (*.iso)
67
* Fixed: Gain could not be set below +0.125dB
8+
* Fixed: Reading broken WAV files could make ConvertWithMoss hang.
79
* Ableton ADV, Sf2, TX16W, Yamaha YSFC
810
* Fixed: Negative fine tuning values could be off by 1 when written.
911
* Akai AKP, MPC XPJ/XTY, TAL Sampler, TX16W

documentation/README-FORMATS.md

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -31,28 +31,30 @@ If the format uses WAV files to store the samples, the following options to addi
3131

3232
The following multi-sample formats are supported:
3333

34-
- [1010music bento](#1010music-bento)
35-
- [1010music blackbox, tangerine, bitbox](#1010music-blackbox-tangerine-bitbox)
36-
- [Ableton Sampler](#ableton-sampler)
37-
- [Akai MPC Keygroups/Drum](#akai-mpc-keygroups--drum)
38-
- [Akai MPC Project/Track](#akai-mpc-projecttrack)
39-
- [Akai AKP/AKM (S5000/S6000/Z4/Z8/MPC4000)](#akai-akpakm-s5000s6000z4z8mpc4000)
40-
- [Bitwig Multisample](#bitwig-multisample)
41-
- [CWITEC TX16Wx](#cwitec-tx16wx)
42-
- [DecentSampler](#decentsampler)
43-
- [Expert Sleepers disting EX](#expert-sleepers-disting-ex)
44-
- [Kontakt NKI/NKM](#kontakt-nkinkm)
45-
- [Korg KSC/KMP/KSF](#korg-ksckmpksf)
46-
- [Korg wavestate/modwave](#korg-wavestatemodwave)
47-
- [Logic EXS24](#logic-exs24)
48-
- [Native Instruments Maschine](#native-instruments-maschine)
49-
- [Propellerhead Reason NN-XT](#propellerhead-reason-nn-xt)
50-
- [Sample files (AIFF, FLAC, NCW, OGG, WAV)](#sample-files-aiff-flac-ncw-ogg-wav)
51-
- [SFZ](#sfz)
52-
- [SoundFont 2](#soundfont-2)
53-
- [TAL Sampler](#tal-sampler)
54-
- [Waldorf Quantum MkI, MkII / Iridium / Iridium Core](#waldorf-quantum-mki-mkii--iridium--iridium-core)
55-
- [Yamaha YSFC](#yamaha-ysfc)
34+
* [1010music bento](#1010music-bento)
35+
* [1010music blackbox, tangerine, bitbox](#1010music-blackbox-tangerine-bitbox)
36+
* [Ableton Sampler](#ableton-sampler)
37+
* [Akai AKP/AKM (S5000/S6000/Z4/Z8/MPC4000)](#akai-akpakm-s5000s6000z4z8mpc4000) - read only
38+
* [Akai MPC Keygroups/Drum](#akai-mpc-keygroups--drum)
39+
* [Akai MPC Project/Track](#akai-mpc-projecttrack)
40+
* [Akai S1000/S3000 image](#akai-s1000s3000-series-disk-image) - read only
41+
* [Akai MESA](#akai-mesa) - read only
42+
* [Bitwig Multisample](#bitwig-multisample)
43+
* [CWITEC TX16Wx](#cwitec-tx16wx)
44+
* [DecentSampler](#decentsampler)
45+
* [Expert Sleepers disting EX](#expert-sleepers-disting-ex)
46+
* [Kontakt NKI/NKM](#kontakt-nkinkm)
47+
* [Korg KSC/KMP/KSF](#korg-ksckmpksf)
48+
* [Korg wavestate/modwave](#korg-wavestatemodwave)
49+
* [Logic EXS24](#logic-exs24)
50+
* [Native Instruments Maschine](#native-instruments-maschine)
51+
* [Propellerhead Reason NN-XT](#propellerhead-reason-nn-xt)
52+
* [Sample files (AIFF, FLAC, NCW, OGG, WAV)](#sample-files-aiff-flac-ncw-ogg-wav)
53+
* [SFZ](#sfz)
54+
* [SoundFont 2](#soundfont-2)
55+
* [TAL Sampler](#tal-sampler)
56+
* [Waldorf Quantum MkI, MkII / Iridium / Iridium Core](#waldorf-quantum-mki-mkii--iridium--iridium-core)
57+
* [Yamaha YSFC](#yamaha-ysfc)
5658

5759
## 1010music bento
5860

@@ -103,6 +105,22 @@ ConvertWithMoss can extract Sampler and Simpler presets from ADV files as well a
103105

104106
ADV files and their samples need to be placed in the Ableton user library in the correct folders to allow Ableton to open it. Therefore, ConvertWithMoss creates the necessary folder structure which can be simply copied to the user library. If the source has sub-folders the global option *Create folder structure* should be deactivated otherwise it can be quite tedious to collect all the results files with their additional Ableton sub-folder structure.
105107

108+
## Akai AKP/AKM (S5000/S6000/Z4/Z8/MPC4000)
109+
110+
This format uses a chunk based binary format with the ending AKP. It supports up to 99 key-groups. A key-group covers a note range with up to 4 velocity layers. AKM files are a multi configuration of up to 32 AKP preset files. The AKP files are only referenced from the AKM. Available parameters are the MIDI channel, panning, volume and key-range.
111+
AKP files are used if destination is Preset or Preset Library. AKM files are used if destination is Performance or Performance Library.
112+
Only reading of the AKP/AKM formats is supported.
113+
114+
## Akai S1000/S3000 series disk image
115+
116+
The Akai S1000 and S3000 series are landmark professional digital samplers first introduced by Akai in the late 1980s and early 1990s. The S1000 became widely adopted in studios and electronic music production for its 16-bit PCM sampling, extensive on-board editing, and reliable MIDI integration. The S3000 series built on that legacy with expanded memory, improved filtering, and more advanced modulation and layering capabilities, offering deeper sound design flexibility.
117+
118+
The CD format used with the S1000/S3000 series was a proprietary Akai CD-ROM structure built on standard ISO-9660 physical media but organized according to Akai’s own disk architecture. Data was stored as 16-bit linear PCM sample files along with separate program and keygroup parameter data, arranged in volumes that the sampler’s operating system could index via SCSI. Unlike generic audio CDs (Red Book), these discs were data CDs containing structured directories and allocation tables specific to Akai’s file system, enabling direct loading of samples, programs, and partitions into memory. While ConvertWithMoss cannot directly read the CDs, it can read images created from them with other tools (normally named *.iso). There is no write support.
119+
120+
## Akai MESA
121+
122+
The Akai MESA S3P format is a computer-side representation of Akai S-series program data used by the original MESA (Mac/PC Multi-Editor and Sample Accelerator) librarian/editor software for the [S-3000](#akai-s1000s3000-series-disk-image) family. In practice the .S3P extension contains a classic S3000-style Program (instrument) encoded in a format akin to MIDI SysEx dumps, with the sample waveforms stored externally as accompanying WAV files on a computer. Internally the Program’s structure—keygroups, sample references, mapping, filters and loop parameters—is essentially the same as an Akai S-series Program on disk; MESA simply encapsulates the Akai program data in its own file container for editing and transfer.
123+
106124
## Akai MPC Keygroups / Drum
107125

108126
A MPC Keygroup or MPC Drum setup is stored in a folder. It contains a description file (.xpm) and the sample files (.WAV). Both keygroup and drum types are supported.
@@ -129,12 +147,6 @@ A project file (*.xpj) contains all track and project settings. All tracks which
129147

130148
* Ignore Loops: There are XPM files which do not contain loops but the related WAV files do (seems to happen with the MPC Autosampler). ConvertWithMoss uses the loops from the WAV files in that case. This might not be what you intended if a multi-sample should be one-shot. Enable this option to ignore the loops.
131149

132-
## Akai AKP/AKM (S5000/S6000/Z4/Z8/MPC4000)
133-
134-
This format uses a chunk based binary format with the ending AKP. It supports up to 99 key-groups. A key-group covers a note range with up to 4 velocity layers. AKM files are a multi configuration of up to 32 AKP preset files. The AKP files are only referenced from the AKM. Available parameters are the MIDI channel, panning, volume and key-range.
135-
AKP files are used if destination is Preset or Preset Library. AKM files are used if destination is Performance or Performance Library.
136-
Only reading of the AKP/AKM formats is supported.
137-
138150
## Bitwig Multisample
139151

140152
This open format is currently supported by the stock sampler in Bitwig Studio and Presonus Studio One. A multisample file is a zip archive which contains all samples in WAV format and a metadata file in XML format.
4.42 KB
Binary file not shown.

src/main/java/de/mossgrabers/convertwithmoss/core/ConverterBackend.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@
2222
import de.mossgrabers.convertwithmoss.file.CSVRenameFile;
2323
import de.mossgrabers.convertwithmoss.format.ableton.AbletonCreator;
2424
import de.mossgrabers.convertwithmoss.format.ableton.AbletonDetector;
25+
import de.mossgrabers.convertwithmoss.format.akai.akp.AkpDetector;
2526
import de.mossgrabers.convertwithmoss.format.akai.mpc.xpm.MPCKeygroupCreator;
2627
import de.mossgrabers.convertwithmoss.format.akai.mpc.xpm.MPCKeygroupDetector;
2728
import de.mossgrabers.convertwithmoss.format.akai.mpc.xty.XtyDetector;
28-
import de.mossgrabers.convertwithmoss.format.akai.s5000.AkpDetector;
29+
import de.mossgrabers.convertwithmoss.format.akai.s3p.AkaiS3pDetector;
2930
import de.mossgrabers.convertwithmoss.format.bitwig.BitwigMultisampleCreator;
3031
import de.mossgrabers.convertwithmoss.format.bitwig.BitwigMultisampleDetector;
3132
import de.mossgrabers.convertwithmoss.format.decentsampler.DecentSamplerCreator;
@@ -110,6 +111,7 @@ public ConverterBackend (final INotifier notifier)
110111
new AkpDetector (notifier),
111112
new MPCKeygroupDetector (notifier),
112113
new XtyDetector (notifier),
114+
new AkaiS3pDetector (notifier),
113115
new BitwigMultisampleDetector (notifier),
114116
new TX16WxDetector (notifier),
115117
new DecentSamplerDetector (notifier),

src/main/java/de/mossgrabers/convertwithmoss/file/riff/RIFFParser.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,8 @@ private void parseFORM (final Map<Integer, RawRIFFChunk> props) throws ParseExce
219219
{
220220
final long idscan = this.getPosition ();
221221
final int id = this.in.readFourCC ();
222+
if (id == 0)
223+
throw new IOException ("Broken RIFF structure.");
222224

223225
if (id == CommonRiffChunkId.RIFF_ID.getFourCC ())
224226
this.parseFORM (props);

src/main/java/de/mossgrabers/convertwithmoss/format/akai/s5000/AkmFile.java renamed to src/main/java/de/mossgrabers/convertwithmoss/format/akai/akp/AkmFile.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// (c) 2019-2026
33
// Licensed under LGPLv3 - http://www.gnu.org/licenses/lgpl-3.0.txt
44

5-
package de.mossgrabers.convertwithmoss.format.akai.s5000;
5+
package de.mossgrabers.convertwithmoss.format.akai.akp;
66

77
import java.io.File;
88
import java.io.FileInputStream;
@@ -21,8 +21,8 @@
2121
import de.mossgrabers.convertwithmoss.file.riff.RIFFParser;
2222
import de.mossgrabers.convertwithmoss.file.riff.RawRIFFChunk;
2323
import de.mossgrabers.convertwithmoss.file.riff.RiffChunkId;
24-
import de.mossgrabers.convertwithmoss.format.akai.s5000.riff.AkmPart;
25-
import de.mossgrabers.convertwithmoss.format.akai.s5000.riff.AkmRiffChunkId;
24+
import de.mossgrabers.convertwithmoss.format.akai.akp.riff.AkmPart;
25+
import de.mossgrabers.convertwithmoss.format.akai.akp.riff.AkmRiffChunkId;
2626

2727

2828
/**

src/main/java/de/mossgrabers/convertwithmoss/format/akai/s5000/AkpDetector.java renamed to src/main/java/de/mossgrabers/convertwithmoss/format/akai/akp/AkpDetector.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// (c) 2019-2026
33
// Licensed under LGPLv3 - http://www.gnu.org/licenses/lgpl-3.0.txt
44

5-
package de.mossgrabers.convertwithmoss.format.akai.s5000;
5+
package de.mossgrabers.convertwithmoss.format.akai.akp;
66

77
import java.io.File;
88
import java.io.IOException;
@@ -22,7 +22,7 @@
2222
import de.mossgrabers.convertwithmoss.exception.ParseException;
2323
import de.mossgrabers.convertwithmoss.file.AudioFileUtils;
2424
import de.mossgrabers.convertwithmoss.format.TagDetector;
25-
import de.mossgrabers.convertwithmoss.format.akai.s5000.riff.AkmPart;
25+
import de.mossgrabers.convertwithmoss.format.akai.akp.riff.AkmPart;
2626
import de.mossgrabers.convertwithmoss.format.wav.WavFileSampleData;
2727
import de.mossgrabers.tools.FileUtils;
2828

src/main/java/de/mossgrabers/convertwithmoss/format/akai/s5000/AkpFile.java renamed to src/main/java/de/mossgrabers/convertwithmoss/format/akai/akp/AkpFile.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// (c) 2019-2026
33
// Licensed under LGPLv3 - http://www.gnu.org/licenses/lgpl-3.0.txt
44

5-
package de.mossgrabers.convertwithmoss.format.akai.s5000;
5+
package de.mossgrabers.convertwithmoss.format.akai.akp;
66

77
import java.io.File;
88
import java.io.FileInputStream;
@@ -29,12 +29,12 @@
2929
import de.mossgrabers.convertwithmoss.file.riff.RIFFParser;
3030
import de.mossgrabers.convertwithmoss.file.riff.RawRIFFChunk;
3131
import de.mossgrabers.convertwithmoss.file.riff.RiffChunkId;
32-
import de.mossgrabers.convertwithmoss.format.akai.s5000.riff.AkpKeygroup;
33-
import de.mossgrabers.convertwithmoss.format.akai.s5000.riff.AkpModulations;
34-
import de.mossgrabers.convertwithmoss.format.akai.s5000.riff.AkpOutput;
35-
import de.mossgrabers.convertwithmoss.format.akai.s5000.riff.AkpProgram;
36-
import de.mossgrabers.convertwithmoss.format.akai.s5000.riff.AkpRiffChunkId;
37-
import de.mossgrabers.convertwithmoss.format.akai.s5000.riff.AkpTuning;
32+
import de.mossgrabers.convertwithmoss.format.akai.akp.riff.AkpKeygroup;
33+
import de.mossgrabers.convertwithmoss.format.akai.akp.riff.AkpModulations;
34+
import de.mossgrabers.convertwithmoss.format.akai.akp.riff.AkpOutput;
35+
import de.mossgrabers.convertwithmoss.format.akai.akp.riff.AkpProgram;
36+
import de.mossgrabers.convertwithmoss.format.akai.akp.riff.AkpRiffChunkId;
37+
import de.mossgrabers.convertwithmoss.format.akai.akp.riff.AkpTuning;
3838
import de.mossgrabers.tools.FileUtils;
3939

4040

src/main/java/de/mossgrabers/convertwithmoss/format/akai/s5000/riff/AkmPart.java renamed to src/main/java/de/mossgrabers/convertwithmoss/format/akai/akp/riff/AkmPart.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// (c) 2019-2026
33
// Licensed under LGPLv3 - http://www.gnu.org/licenses/lgpl-3.0.txt
44

5-
package de.mossgrabers.convertwithmoss.format.akai.s5000.riff;
5+
package de.mossgrabers.convertwithmoss.format.akai.akp.riff;
66

77
import java.io.ByteArrayOutputStream;
88
import java.io.IOException;

src/main/java/de/mossgrabers/convertwithmoss/format/akai/s5000/riff/AkmRiffChunkId.java renamed to src/main/java/de/mossgrabers/convertwithmoss/format/akai/akp/riff/AkmRiffChunkId.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// (c) 2019-2026
33
// Licensed under LGPLv3 - http://www.gnu.org/licenses/lgpl-3.0.txt
44

5-
package de.mossgrabers.convertwithmoss.format.akai.s5000.riff;
5+
package de.mossgrabers.convertwithmoss.format.akai.akp.riff;
66

77
import de.mossgrabers.convertwithmoss.file.riff.RiffChunkId;
88

0 commit comments

Comments
 (0)