JDTools
Patch conversion utility for Roland JD-800 / JD-990 and compatibles
Install / Use
/learn @sagamusix/JDToolsREADME
JDTools - Patch conversion utility for Roland JD-800 / JD-990 and compatibles
While it is easy to convert JD-800 patches to use with the JD-990 (the JD-990 itself can do it through RAM card exchange, and there are PC tools for it as well), there don't appear to be any tools to go in the opposite direction. In the general case this makes sense, because the JD-990 has more features.
However, I purchased a sound bank for the JD-800 where the original SysEx dump for the JD-800 was lost and all I got was a SysEx dump for the JD-990, which my JD-800 obviously couldn't load.
Knowing that the patches in this dump must be fully compatible with the JD-800, I started studying the SysEx dump structures of the two synths and threw together some code in half a day to convert between the two.
The tool can load both SYX files (raw SysEx dumps) and MID / SMF files (Standard MIDI Files) and convert from JD-800 patch format to JD-990 and vice versa. It can also convert special setups but other multi mode settings cannot be converted (there isn't much to convert that the two synths have in common...).
After the basic functionality was done, I wondered what would be required to support the JD-800 VST plugin or the JD-08 as well - turns out, quite a lot! Nevertheless, I managed to add support for them as well, so you can convert original JD-800 patches to the plugin's format (as long as they don't use ROM card waveforms), and also convert plugin banks to use with the original JD-800 (as long as they don't use extended features such as unison or tempo-synced LFOs). As the plugin appears to be based on Roland's ZenCore engine, don't expect conversions that sound 100% identical (there are well-known differences). Some parameters seem to have much lower internal precision than on a real JD-800. On the upside, the converted files also work with the Zenology plugin. But as the conversion process is quite complex, it's always possible there is a bug, so please report those if you find any.
Figuring out the data structures shared by the plugin, SVZ and SVD patch formats was a lot of work, so if you find this tool useful, please consider donating a few bucks. This would be especially appreciated if you are going to sell the converted files. Alternatively you can pay me by sending your converted sound sets. ;)
You can also support me by purchasing my "Explorations Vol. 1" and "Explorations Vol. 2" sound banks. They are compatible with all JD models supported by this software!
Usage
JDTools is a command line utility and has no Graphical User Interface. It can be invoked in the following ways. Values in <angled brackets> indicate user-supplied values. The angled brackets must not be entered into the command line.
Conversion
It is possible to convert between practically all format combinations:
- JD-800 SysEx dumps (SYX, MID) can be converted to...
- JD-990 SysEx dump (SYX)
- JD-800 VST / Zenology patch bank (BIN)
- JD-08 patch bank (SVD)
- ZC1 patch bank (SVZ)
- JD-990 SysEx dumps (SYX, MID) can be converted to...
- JD-800 SysEx dump (SYX)
- JD-800 VST / Zenology patch bank (BIN)
- JD-08 patch bank (SVD)
- ZC1 patch bank (SVZ)
- JD-800 VST or Zenology patch banks (BIN) can be converted to...
- JD-800 SysEx dump (SYX)
- JD-08 patch bank (SVD)
- ZC1 patch bank (SVZ)
- JD-08 patch banks (SVD) can be converted to...
- JD-800 SysEx dump (SYX)
- JD-800 VST or Zenology patch bank (BIN)
- ZC1 patch bank (SVZ)
- ZC1 patch banks (SVZ) can be converted to...
- JD-800 SysEx dump (SYX)
- JD-800 VST or Zenology patch bank (BIN)
- JD-08 patch bank (SVD)
The input format of the conversion is determined automatically, but due to the different output options, the desired target format has to be specified explicitly.
By invoking JDTools convert syx <input.file> <output.syx>, the input file is converted to a SysEx dump. If the source is a JD-800 SysEx dump, the output file is a JD-990 SysEx dump, in all other cases the output is a JD-800 SysEx dump.
By invoking JDTools convert bin <input.file> <output.bin>, the input file is converted to the JD-800 VST patch bank format (BIN).
By invoking JDTools convert svd <input.file> <JD08Backup.svd> <position>, the input file is converted to the JD-08 patch bank format (SVD). The provided output file must be an already existing JD08Backup.svd file obtained from your JD-08. The file is then overwritten, but its contents are replaced with the new patch data. The output file should be named JD08Backup.svd so that the JD-08 can find it. The last parameter is optional and specifies the starting patch position to overwrite. This can be just a bank (A/B/C/D) or a patch number (e.g. B42).
By invoking JDTools convert svz <input.file> <output.svz>, the input file is converted to the ZC1 hardware patch bank format (SVZ), for use with the Jupiter-X with the JD-800 Model Expansion and potentially other hardware synthesizers based on ZenCore.
To convert e.g. a JD-800 VST patch bank to a JD-990 SysEx dump, an intermediate conversion to a JD-800 SysEx dump is required.
As an example, the following batch script can be used to convert all SYX and MID files in the current directory and its subdirectories to BIN files to use with the plugin. It assumes that JDTools.exe is also placed in the current directory. The script also creates a conversion log file called convert.txt, which you can review to check if any of the conversions were lossy (e.g. due to missing ROM card waveforms).
@echo off
for /R %%F in (*.syx, *.mid) do (
echo %%F >> convert.txt
JDTools convert bin "%%F" "%%F.bin" >> convert.txt 2>&1
)
Merging
Merge any number of SysEx dumps (SYX, MID) containing temporary patches by invoking JDTools merge <input1.syx> <input2.syx> <input3.syx> ... <output.syx>. If an input file contains multiple dumps for the temporary patch area, they are all considered.
The following batch script can be used to pass a directory name instead of a list of individual files:
@echo off
REM Usage: merge.cmd Path\To\Directory output.syx
setlocal enabledelayedexpansion enableextensions
set baseDir=%~1
set LIST=
for %%x in ("%baseDir%\*.syx") do set LIST=!LIST! "%%x"
set LIST=%LIST:~1%
JDTools merge %LIST% %2
Listing
List all the contents of a SysEx dump (or any of the other supported input formats) by invoking JDTools list <input.syx>. This also lists objects that JDTools cannot convert (such as the JD-800 display area), but the actual contents are not shown for most of them. Useful for easily creating a patch listing of your banks.
You can also invoke JDTools list-verbose <input.syx> to list all the parameter values of each patch or special setup.
Verifying
To check if a SysEx dump (SYX or MID) contains any checksum errors, invoke JDTools verify <input.syx>.
Any number of input files can be specified.
Version History
v0.19 (2024-11-17)
- New verb "list-verbose" to list all patch or special setup parameters.
v0.18 (2024-09-19)
- New verb "verify" to check if SysEx dumps contain any errors.
- Phaser rate conversion was off-by-one. Converting a phaser rate of 0.1 from SysEx to ZenCore format resulted in a much faster phaser.
- When converting from SVZ files, disable effect section A if didn't use the JD Multi effect. Such files couldn't be loaded by the JD-800 plugin, and the JD-800 would use bogus effect settings.
- If the source file contained less than 64 patches, the resulting BIN file could not be loaded by the JD-800 VST plugin.
v0.17 (2024-01-04)
- Fewer warnings are shown when converting from JD-990 patch format, e.g. when an incompatible structure is used but both tones of the structure are muted anyway.
- When converting to ZenCore format, negative pitch envelope levels are scaled more appropriately and a warning is shown when negative pitch levels exceeding one octave are used (ZenCore only supports a +/-1 octave range, while the JD-800 supports a -3 to +1 octave range)
- When converting from a JD-990 SysEx dump, the source format was not displayed correctly.
v0.16 (2022-11-28)
- All extended JD-990 waveforms are now replaced with JD-800 waveforms when converting to JD-800 format. Obviously a lot of those approximations will not be even close, but are hopefully still more helpful than just silent tones.
- A few more simple fixups when doing a lossy JD-990 to JD-800 conversion.
- Fixed conversion of JD-990 patches that don't use the expected tone control source / destination pairs.
- When inserting patches into SVD file, the following patches are no longer overwritten with empty slots.
v0.15 (2022-09-05)
- Converting from SVD to BIN or SVZ did not split the patch banks correctly.
- Conversion to SVD could cause an incomplete SVD file to be written, which the JD-08 would then be unable to load.
v0.14 (2022-09-05)
- The
listcommand now lists all patches in BIN / SVD / SVZ files if there's more than 64 of them. - The text output now refers to patches by their source index, not the destination index. So when converting e.g. from SVD format to SYX, the text output will list patches A11...D88 instead of going through I11...I88 four times in a row.
v0.13 (2022-09-03)
- Converting to SVD format now allows to specify an optional parameter to specify the destination position of the patches, so that e.g. bank A can be preserved and converted patches are written to bank B instead.
- JD-800 and JD-990 setups can now be converted to BIN / SVD / SVZ as well. They are written to a separate files (so if the patches are written to "Patches.bin", the setup ends up in "Pa
