Best practices for creating sample packs

Hi guys,

I'm trying to compile my own sample pack. Are there any best practices that are worth taking into account? For instance, most sample packs have samples in a range of notes (and even octaves), would it make sense to only include a version in C (and resample it with up)?

All suggestions are welcome :pray:

Thnx, Niels

4 Likes

Also curious about this! One other thing I'd like to know:

As I've trawled back through various sample packs I've collected over the years, and most of them need significant refactoring (directory structure changes, filename changes) to make them useful in tidal/superdirt/supercollider

Is there a generally agreed directory structure/file naming protocol (agreed between anyone, really) for sample pack distribution?

1 Like

yeah, i'm also interested in this one! especially how tidalcycles handles naming of the samples etc.

not exactly on the topic of creating sample packs, but i finally swapped atom for visual studio code and its dedicated samples browser (where you can preview, copy or simply insert your samples to editor) is brilliant and makes my workflow so much easier. don't know how i lived without it.

1 Like

It seems to me that the sample management strategies possible with Tidal/SuperDirt are limited.

For unpitched sounds, you can have directories full of the same kind of sound, like the 90 sounds in the snare folder of the extra samples.

Or, you can have a directory that constitutes some sort of 'kit' of different kinds of sound, like the cpu and cpu2 folders.

In that kind of setup, there is a trick I have sometimes used for my own sample banks. I put an numerical index at the start of the file name, and then arrange the files into some sort of musical order, for instance:

00kick01
01hat01
03snare01
04hat02
05kick02
06hat03
07snare02
08hat04
etc up to 32 sounds

If I then n (run 32) through that folder, I get a beat of sorts, and I also know that my snares and kicks are at predictable indices. (But I do end up with an awful lot of hats!)

For pitched sounds, you can have something like the rash directory, which is I think about five octaves of a single synth sound. Again the numerical index means that you can probably then play melodic/chordal material reliably.

However… there is a caveat. The order in which SuperDirt imports samples is dependent upon the operating system, and I'm not certain that is always consistent. So, my cpu:13 might be different from yours! (Certainly with the default sample banks in the Estuary platform, I've found that the sample indices do not correspond to those on my machine.)

For consistent sample management, eg mapping samples to ranges of notes, I suspect it would be easier to send midi to an external sampler running in a DAW or similar. But then, you can't easily apply effects from Tidal.

4 Likes

Hey @niels

I think with pitched samples it's probably better (if you can) to have a range of notes, since up changes the pitch by changing the playback speed, so as you go higher the sample gets shorter, and as you go lower the sample gets longer (same as speed which I think has been introduced already).

Having said that, I myself am very lazy and many of my samples just have middle C - so I think this is ok if you don't mind things being a bit dirty (personally I quite like the old school sample keyboard vibe).

@cleary - I don't think there is a generally agreed approach. My personal approach is to try to keep things simple and easy to type (so I usually stick to 2 or 3 character names). But I tend to only use a pretty limited set of samples and I organise them in a largely flat format (often only one or two sound files in each folder).

I see a lot of people performing who clearly have much more complex sample sets than me, maybe with many samples inside each folder (like @tedthetrumpet's example). Or with lots of samples with the same name and a different number. I would say go for whatever works for you here. I am lazy and like to type as little as possible (and also I don't want to have to remember lots of numbers)

From a practical perspective, you can ask SuperDirt to load samples from different places, but again for the sake of simplicity I just keep all mine in one place.

In case it isn't clear, you will have a large folder with everything in (mine is called Dirt-Samples which I think is the default), then you will have lots of folders within this. The names of these folders relate to the sample name you type into the mininotation (e.g. cpu in d1 $ sound "cpu"). If you have any additional layers of folders, SuperDirt won't be able to read these.

Tidal will by default play the first sound file in this folder unless you specify otherwise with :, which lets you dictate which file to play (in alphabetical order). So you can use a numbering system in the names of your sound files to help manage this. Don't forget that Tidal starts counting at 0 though, so to get the 3rd file in the cpu folder you would need to do something like d1 $ sound "cpu:2"

6 Likes

There are two things I do to organize my own samples more easily:

  1. Use the leading-zero numerical prefix as @tedthetrumpet suggests. The leading zero sorting is universal on each operating system (in my experience so far).

  2. Organize categories of samples into sub-folders, and load those sub-folders separately in the SuperDirt bootup code:

On my file system:

~/kindohm/tidal-samples/drums
~/kindohm/tidal-samples/fx
~/kindohm/tidal-samples/tracks/risc-chip
~/kindohm/tidal-samples/tracks/bit-dust

Then in SuperDirt code (not tested, might have errors):

(
s.reboot { 
  s.waitForBoot {
	~dirt = SuperDirt(2, s); 
	~dirt.loadSoundFiles("~/kindohm/tidal-samples/drums/*");
	~dirt.loadSoundFiles("~/kindohm/tidal-samples/fx/*");
	~dirt.loadSoundFiles("~/kindohm/tidal-samples/tracks/risc-chip/*");
	~dirt.loadSoundFiles("~/kindohm/tidal-samples/tracks/bit-dust/*");
	s.sync; 
	~dirt.start(57120, [0]);   

  };
};
);
7 Likes

thank you for the insights and inspiration! just out of curiosity: what kind of program do you use for slicing up samples (e.g. from records)?

1 Like

I'm mainly aware of tools built in to DAWs like Ableton and FL Studio. I use Edison, which is built in to FL Studio.

Another program is sox, which is an open source command line tool.

I'm sure there are also programs out there you could buy, but I'm not knowledgeable about them. As far as free software I'm only aware of sox.

1 Like

One new idea I have is to somehow organize samples by "layer": low, low-mid, high-mid, and high.

For years I've always organized sounds by what they were sourced from: kick, stab, pad, vocal, etc. Despite this being an intuitive way to find things, I don't think it is necessarily the most musical. Clear frequency layers (low, mid, and high) allow complexity while maintaining clarity.

But I have no idea how I would do this in terms of folder structure or folder/file naming!

1 Like

sox and/or audacity :slight_smile:

sox and renoise ! :love_you_gesture:

Is there a resource you can recommend for learning to interact with sox? I remember trying to learn it a while back and being unable to get my head around it, however it seems like something I could really make use of.

Reading the man page mostly, and playing around with these ressources :

To be honest, I do prefer having a visual of what I'm doing with my samples, hence the use of Renoise most of the time those days. :roll_eyes:

1 Like

whew, these are great, thanks! actually something i've been searching for outside of tidalcycles for quite a long time :slight_smile:

1 Like

Hi, I'm dealing with my own sample folders using this piece of code and it doesn't works...

(
s.waitForBoot {
~dirt = SuperDirt(2, s); // two output channels

    // load samples from multiple folders:
~dirt.loadSoundFiles("/Users/Eloi/Library/Application Support/SuperCollider/downloaded-quarks/Dirt-Samples/");
~dirt.loadSoundFiles("/Users/Eloi/Desktop/carcelera_samples/");
~dirt.loadSoundFiles("/Users/Eloi/Desktop/els_meus_samples/");

s.sync; // wait for supercollider to finish booting up
~dirt.start(57120, [0, 0]); // start superdirt, listening on port 57120, create two orbits each sending audio to channel 0

};
);

When I define it SC says:

loading 1 sample bank:
Dirt-Samples (0)
... file reading complete. Required 0 MB of memory.

loading 1 sample bank:
carcelera_samples (0)
... file reading complete. Required 0 MB of memory.

loading 1 sample bank:
empty sample folder: /Users/Eloi/Desktop/els_meus_samples/

... file reading complete. Required 0 MB of memory.

However when I'm trying to use my samples SC only find the Dirt Samples, and doesn't find mine. What I'm doing wrong? I've to put my sampler folders in a particular place?

You're close! Make sure to add a * at the end of your paths:

~dirt.loadSoundFiles("/Users/Eloi/Desktop/els_meus_samples/*");

Thanks @kindohm !!!