Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion documentation/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
# Changes

# 20.2.0 (work-in-progress)
## 20.2.0 (work-in-progress)

* New: Added support for the E-mu Emulator II (IMG, EMUIIFD, HFE). One disk becomes one multi-sample: the key map of the bank gives the zones with their key ranges and root keys and each voice its name, its loop and its audio, which is expanded from the companded bytes the sampler feeds to its AM6072 DAC. A bank which is larger than one floppy is reported as continuing on another disk. Read only.
* New: A note is logged when a loop of a converted preset audibly clicks at its wrap-around point (the step back to the loop start is many times the normal movement of the waveform and a substantial part of the level). Sample libraries ship such loops surprisingly often - 17 of 152 presets across three commercial Ensoniq libraries - and without the note the first hint is the converted preset ticking on the destination device. Nothing is changed: the loop is written as the source authored it, and the note points to the snap-to-zero-crossing and loop cross-fade processing options which remove such clicks. A loop which already has a cross-fade is not reported.
* New: The Analyse run can log for every found multi-sample what it contains (option "Log analysis details", on the command line `-ad`): the mapping of its zones with their sample format, loops with their cross-fades, envelopes, LFOs and the filter with its modulators. Only attributes which a source actually uses are logged, so searching the log finds the sources which use a specific feature - e.g. all presets of a library with a filter envelope, a loop cross-fade or a release trigger. The details describe the source as it was read, before any processing is applied.
* Fixed: The sample and program files which a preset references are now looked up ignoring the upper/lower case of their name. Sampler file systems are case-insensitive and their CD-ROMs store all names in upper case, but a preset might well reference them in lower case. On a case-sensitive file system, which is the normal case on Linux, none of those samples could be found (e.g. 'STR SEC.6 -L.WAV' referenced as 'STR SEC.6 -L.wav'). This affects the Akai S5000/S6000 (AKP/AKM), Akai MESA, Akai MPC and MPC1000, FL Studio DirectWave, Teenage Engineering OP-XY and Synclavier Regen formats as well as all formats which use the common sample search (Ableton, Deluge, EXS24, NI Kontakt, NI Maschine, 1010music, SXT and TX16Wx) - the latter did only try the file ending in all upper and all lower case, so a name which differs in its case anywhere else was still not found.
* Fixed: When a sample was not found next to its preset, the search jumped the configured number of folder levels up in one go and took whatever the recursive search found first. Two libraries below the same folder which name their samples alike - the normal case for the variants of a library - then fed a preset the sample of the other library, which sounds wrong and, since the preset keeps its own loop points, clicks at the loop. The search now goes up one level at a time and stops at the first level which contains the file, so a sample close to the preset always wins over one of the same name further away.
* Fixed: The category names 'Winds' and 'World' were not detected when they were read back from a preset which stores the category as text: 'Winds' was detected as FX - from the 'Wind' sound effect - and 'World' was not detected at all. The name of a category is now a keyword of its own, which is checked for all of them.
* User Interface
* New: Contents dialog: The new 'Export List...' button writes the listed presets - not the presets themselves - as a CSV or JSON file with the name, category, number of zones, key range (as note names and MIDI note numbers), folder, file, containers, index inside of the file and the ticked state of each of them. This gives an inventory of a disk image, a bank or a preset folder which can be used in a spreadsheet or a script. A search filter applies to the written list as well.
* New: Contents dialog: The new 'Import List...' button reads such a list back in and ticks exactly the presets which it selects, so the presets to convert can be picked in another application: export the list, tick the presets in e.g. a spreadsheet, save it as CSV again and import it. A row selects its preset when its 'Selected' field says so ('true', 'x', '1' or 'yes'); a list without that field selects every preset it contains, so deleting rows works as well. Presets are matched by their file and their index inside of it, which tells presets of the same name in different banks apart and still finds a library which was moved to another folder.
* Akai MPC
* Fixed: The Version element was created but never added to a written XPM file. Since it is the element by which the format is recognized, such a file was rejected when it was read back ("Could not read metadata: Unknown Root"). The platform is now written as well, so that the version log line is complete.
* Fairlight CMI
Expand Down
4 changes: 4 additions & 0 deletions documentation/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@ Every source format has a *Contents...* button. It reads the source without writ

This works for a format where one file simply is one preset as well, e.g. a folder of Elektron Tonverk or Synthstrom Deluge presets. The tree then lists the presets themselves - under the folder they are in and with the name which is stored inside of the file, which is not necessarily the name of that file. The name of the file is added to a preset which is named differently. Only the files of the ticked presets are read again by the conversion, so narrowing a large folder down also makes the conversion much quicker.

*Export List...* writes the list itself - not the presets - to a CSV or JSON file, which is handy to keep an inventory of a disk image, a bank or a preset folder or to work with it in a spreadsheet or a script. Every listed preset becomes one line (CSV) or one object (JSON) with its name, category, number of zones, key range as note names and as MIDI note numbers, its folder, file and containers, its index inside of the file and whether it is ticked. The file format follows the ending you pick in the file dialog and a search filter applies to the export as well, so a filtered list writes only the presets which are shown.

*Import List...* reads such a list back in and ticks exactly the presets which it selects, which is the other half of picking the presets to convert in another application: export the list, open it in a spreadsheet, tick what should go onto your sampler, save it as CSV again and import it. A row selects its preset when its *Selected* field says so - `true`, `x`, `1` and `yes` all count, in any capitalisation - and if the list has no *Selected* field at all, every row of it selects its preset, so simply deleting the rows you do not want works as well. Presets which the list does not mention are not ticked. A row is matched by its file and the index inside of it, so presets of the same name in different banks stay apart and a library which has moved to another folder is still recognized by its file name; a row which has only a name selects every preset of that name. Semicolon separated files - as a spreadsheet writes them in some countries - are read as well, and rows which match nothing are reported instead of stopping the import.

Highlighting a preset and pressing *Play* - or double-clicking it - plays one note of it. The note is rendered from the preset as it was read, with its amplitude and filter envelopes, its filter and its LFOs applied, so you hear what the conversion produces and can pick the presets by ear instead of by name. The preset is read from its file again for this, which takes about a tenth of a second even inside a large disk image. Pressing *Play* again stops the note, as does closing the dialog.

## Processing
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,28 @@ public int getNumberOfZones ()
}


/**
* Get the lowest key which is covered by any of the zones of the source.
*
* @return The MIDI note number, -1 if the source has no zones at all
*/
public int getLowestKey ()
{
return this.lowestKey;
}


/**
* Get the highest key which is covered by any of the zones of the source.
*
* @return The MIDI note number, -1 if the source has no zones at all
*/
public int getHighestKey ()
{
return this.highestKey;
}


/**
* Get the category of the source.
*
Expand Down Expand Up @@ -203,7 +225,7 @@ public String getInfo ()
* @param note The MIDI note number
* @return The formatted note
*/
private static String formatNote (final int note)
public static String formatNote (final int note)
{
return NOTE_NAMES[note % 12] + (note / 12 - 2);
}
Expand Down
Loading