The Sampler Sound Generator is the most complex sound generator in HISE.
The Sampler is a disk streaming sampler with round robin groups, cross-fade looping and SFZ import. All audio files that are loaded in a sampler are organized in this pretty simple structure (again a tree, like everything in HISE:
The Sampler is a disk streaming sampler with round robin groups, cross-fade looping and SFZ import.
All audio files that are loaded in a sampler are organized in this pretty simple structure (again a tree, like everything in HISE:
Every sample is loaded in an object called Samplemap, which contains a arbitrary amount of Round Robin Groups, which contain all samples.
The sampler has no further organization logic - robin groups are normally processed the same way, so it makes sense to put them all into one sound generator. For everything else (eg. release trigger), use another Sampler with a Midi Processor that provides this functionality.
The sampler interface consists of four parts, which can be shown by clicking on the respective button below the Modulator Chain button bar:
The sampler uses a global sample selection. That means you can select multiple samples in any panel, and they will be updated in the other panels too.
Also every editing operation has full Undo / Redo support. Simply use Ctrl+Z / Strg+Y (the sampler needs to have keyboard focus for this).
You can use this panel to change the behaviour of the sampler and its global properties:
|4||Preload Size||-1 ... 11000 ...||The preload size in samples for all samples that are loaded into the sampler. If the preload size is
|5||Buffer Size||0 ... 4096 ...||The buffer size of the streaming buffers in samples. The sampler uses two buffers per voice which are swapped (one is used for reading from disk and one is used to supply the sampler with the audio data)|
|6||Voice Amount||0 ... 64||The amount of voices that the sampler can play. This is not the same as Voice Limit (which is a property of all Sound Generators).|
|7||RR Groups||0 ... x||The number of groups that are cycled in a round robin manier. Warning: If you set this value, all samples with a bigger group index loose their group information (it truncates all group numbers to this value)|
|8||Retrigger Mode||Kill Note, Note off, Do nothing||determines how the sampler treats repeated notes.|
|9||Pitch Tracking||On, Off||Enables pitch ratio modification for different notes than the root note. Disable this for drum samples.|
|10||OneShot||On, Off||plays the whole sample (ignores the note off) if set to enabled.|
You can see the memory usage and the disk performance of this sampler instance on the left. The memory usage includes the streaming buffers, so if you want to decrease the memory usage, consider lowering the streaming buffers (which increases the disk performance) or reduce the voice amount.
The Sample Editor has three panels: A toolbar with some handy actions, a audio waveform which displays the selected sound and some Value Setters to change the audio-related properties of the selected samples.
HISE uses a global selection which can include multiple samples. The waveform will only show the last selected sample, where the Value Setters show the range of each property (the minimum value of any sample and the maximum value of any sample)
|Zoom In||Zooms in the audio waveform horizontally.|
|ZoomOut||Zooms out the audio waveform horizontally.|
|SelectWithMidi||If enabled, the most recently triggered sample will be selected for editing.|
|Enable Sample Start Area Dragging||If enabled, the Sample Start Area can be dragged around|
|Enable Strg Loop Area Dragging||If enabled, the Loop Area can be dragged around|
|Enable Play Area Dragging||If enabled, the Playback Area can be dragged around|
|NormalizeVolume||This normalizes the volume to 0dB.|
|LoopEnabled||This toggles the loop playback.|
The sample waveform shows the selected sample and if the sample is played, the current playing position.
You can enable dragging with the toolbar and then drag around one of the areas.
The sample editor has a Value Setter for all audio-related properties.
|Volume||-100dB ... +18dB||The gain in decibels.|
|Pan||-100L ... 100R||the balance of the sample.|
|Normalized||On, Off||enables normalization of the sample data|
|Pitch||-100ct ... +100ct||the pitch factor in cents (+- 100). This is for fine tuning, for anything else, use RootNote.|
|SampleStart||0 ... sample length||the start sample|
|SampleEnd||sample start ... sample length||the end sample,|
|SampleStartMod||0 ... sample length||the amount of samples that the sample start modulation chain can modulate.|
|LoopStart||0 ... sample length||the loop start in samples.|
|LoopEnd||loop start ... sample end||the loop end in samples.|
|LoopXFade||0 ... loop start||the loop crossfade at the end of the loop|
|LoopEnabled||On ... Off||Enable loop playback|
If you crossfade the loop section, the memory size will increase because it calculates the crossfade area and saves it into a internal buffer.
|RootNote||the root note. This is the reference pitch note.|
|KeyHigh||the highest mapped key.|
|KeyLow||the lowest mapped key.|
|VeloLow||the lowest mapped velocity.|
|VeloHigh||the highest mapped velocity.|
|RR Group||the group index for round robin / random group start behaviour|
The sample table is a list of all loaded samples and can be sorted. There is also a search bar with a full RegEx parser
Getting audio files into the sampler can be achieved in multiple ways. You can simply drag the files into the map editor, use a pitch detection algorithm to determine the root note or use a filename parser to extract properties from the file name of the sample.
You can import collections of samples as SFZ format or as internal SampleMap XML-File.
You can drag a selection of samples into the map editor and they will be mapped according to the drop point:
The drop-point behaviour is nicked from another well-known sampler ...
The Sampler has a powerful filename parser which divides the filename into
Tokens and maps them to properties of the sample zone.
Let's assume we have two samples with the filenames
Using the filename parser, we can automap the samples so that they have these properties:
1. Sample: First RR Group, Root Note D2, Velocity Range 25-50
2. Sample: Second RR Group, Root Note C3, Velocity Range 75-100
Load some audio files into the sampler and choose Automap root based on file name. You will see a window like this above where you can define the file name parse logic.
Enter the correct separator (the parser needs one character that is used to divide the filename into tokens. The default separator is
_, but you can use any character.) The file name should now be divided into the tokens and every token will be a row in the dialog window. Step through every token and tell the parser what to do.
The token content of the first filename (it will iterate over all files, but it displays only the first file so you can see what the parser is doing)
defines the property that should be set. You can set pretty much all midi related sample properties:
||maps the velocity range to (
||spreads the velocity evenly to the complete Range. You must use the data type
||Maps the value to RootNote, KeyLow and KeyHigh.|
||moves the sound into the specified group (starting with 1)|
|Ignore||-||Do nothing with this token. Use this for every token that does not contain special information (it is the default value anyway).|
The data type column defines the formatting of the token and how the parser extracts information from it (the result is always a number). Depending on the data type, you need to enter additional information into the Items and the Values columns.
|Data Type||Description||Item List||Value List|
|Number||Simply uses the number||-||-|
|Number with Range||Uses the number and a upper limit to define a range (for
||the upper limit as number||-|
|Note Name||if the token is a note name (format: "D#3"), use this data type to get the right midi note number (middle octave is 3).||-||-|
|Custom||Maps any string in the item list to a number in the value list.
|the string token list (seperated by space)||the number list (seperated by space)|
|Fixed Value||Simply sets a value that can be entered in the item list||the constant value as number||-|
|Ignored||Ignores the token. You should not have to use this directly, as it's the datatype for ignored tokens.||-||-|
After you filled out all required fields, you can store the parse settings to a file or copy it to clipboard - in case you entered a wrong value somewhere, you don't want to repeat the whole process.
Now press OK and the parser tries to automap all samples to the right place.
There is a handy tool called "Close Gaps" which can be useful after importing the files with this method.
SFZ is a free file exchange format for samplers. However, HISE is not designed to be a SFZ sample player. The SFZ parser makes it more easy to transfer other sample formats to HISE. Although there are opcodes for almost any property of a sampler, I limited the supported opcodes to the following list:
sample, lokey, hikey, lovel, hivel, offset, end, loop_mode, loopstart, loopend, tune, pitch_keycenter, volume, group_volume, pan, groupName, key
These are pretty much all opcodes thich relate to a HISE sampler property.
If you want to convert NI KONTAKT libraries, check out the Chicken Translator SFZ edition.
Loading SFZ files is remarkably easy, just use the SFZ button, or drop a .sfz file on the sampler. If there are multiple groups in the SFZ file, you will see a dialog window where you can consolidate the sfz groups to RR Groups or ignore dedicated sfz groups (and drop the same sfz on another sampler with a inverted selection to split the sfz file to two independant samplers)
You can load and save SampleMaps independently from the sampler patch as human-readable XML file, which makes it an own sampler file format (similar to SFZ but a lot easier to parse)
Pro-Tip: If you have a multimic sample library, create a Samplemap for one mic position, export the samplemap and replace the audio reference files with a text editor and "Search and Replace"...
Then create a new sampler and load this samplemap. With this trick you don't have to import and edit the other samples, as they will use the same properties as the first mic position.