First off, why will one need to do any noise reduction to the recorded samples at all? Most likely you will not only have recorded the sound of the pipe but also background noise especially from the motor and fan that delivers air to the bellows. While this might be acceptable to a certain degree in a single note it will quickly turn very ugly when you are combining many sampled pipes (files) together. As a rule of a thumb, if your noise floor is not at least around -70 dB you will need to do noise reduction to the samples.
The best free program I've found is Nick Appletons software Noise Reduce. It's available both for Linux and Windows on his webpage. Go to the Software Projects menu item and then to Noise Reduce and Download to download it. This is a collection of command line programs that really works wonders with the samples. Currently the version is 0.15b. There's also a usage guide there that, even if somewhat outdated, still provides good reading.
When you have extracted the archive you should put the executables somewhere in the path so that you can call the programs from within any folder. On recent Ubuntu versions (at least 12.04+) you can create a bin folder in your home directory (/home/username/bin) that upon your next login will automatically be in the path. That's easy to work with as it's then also within your normal users permissions to write and change the nr.conf file that's going to need lots and frequent changing.
The programs you will use the most are the gnp (get noise profile) and nr (noise reduce), but the nr.conf will supply nr with the necessary parameters so that text file you will need to become a close friend with.
The process works in such a way that you first create noise profiles with gnp from the noise audio file you cut earlier. This is normally done in the folder where you have the cut audio files with a command like:
gnp noisefile.wav nameOfYourNoiseProfile /fftsize 4096
I normally create a set of different profiles with different fftsizes (Np-4 has fftsize 4096, Np-8 has 8192, Np-16 16384 etc.) so that I can test which one will do the best work. A higher samplerate usually demand higher fftsizes, the same will usually be true with softer stops and lower frequencies especially if the signal to noise ratio is bad. There are other things one can do like changing the windowing function (that's gaussian by default and set by the /window parameter) and the number of snapshots taken (600 by default, set by /snapshots parameter) but that's rarely necessary.
To do the noice reduction on an audio file one then issues the command:
nr inputFile.wav noiseProfileToUse outputFile.wav
and wait until the process is complete.
After that I open up the noise reduced file in Audacity and listen to it, compare it with the original and start thinking about how the parameters in the nr.conf file must be changed or if another profile with different fftsize must be used.
The politically correct attitude for a good noise reduction is that you only remove that amount of noise necessary to give a tolerable end result while still trying to keep as much of the original sound as possible… More easily said than done, I'm afraid! Lot's of experimentation is necessary and that's why I nowadays always first perform the noise reduction on a small selection of the current octave so that I more quickly will get feedback on how the nr.conf settings and profile affects the sound.
A tip would be to first start by selecting a small fftsize and repeat with larger ones to compare the results with. A higher fftsize will most of the time result in a finer granularity of noise reduction but will also mess up the crispness of the attack to a certain degree. The second is to experiment with the nr.conf settings which I'll try to explain a little bit next. This is the original nr.conf file that will come with the archive:
HIGH_PASS_CUTOFF = "0"
KEEP_IF_OVER = "0.9999"
KILL_IF_UNDER = "0.998"
UPPER_CONFIDENCE = "0.99"
LOWER_CONFIDENCE = "0.66"
PROBABILITY_DYNAMICS = "0.05"
PROBABILITY_MAX_ADJUSTMENT = "0.05" # increase for louder more powerful stops
LEVEL_NOISE = "TRUE"
NOISE_OFFSET = "0"
NOISE_FLOOR = "-70"
PRECISION = "8"
REDUCE_BY_MAX = "-40"
# REDUCE_BY_MIN = "0" parameter removed
SPECTRAL_DECAY = "2"
SPECTRAL_DYNAMICS = "7"
PEAK_DELAY = "-0.1" # decrease for slower speaking stops…
High pass cutoff is as you might can guess a high pass filter that will eliminate all frequencies below the given number (in herz). This parameter will many times be necessary to use, though it's possible to do afterwards in an audio editor like Audacity too. As a starter I normally set it to the frequency of A below the lowest C (for a 8' stop it's usually around 55) and to get better clarity in the higher registers I might also increase it to the frequency of A below the current octave. This will remove lots of action noise too so you'll have to choose carefully.
Increasing the keep if over, kill if under, upper and lower confidence will result in more noise removed and lowering them will keep more of the noise.
The noise floor decides the farthest any noise will be suppressed and otherwise the reduce by max (in dB) will decide how much the noise will be lowered. (I usually have noise floor at -90 and reduce by max at -60)
The shape of the noise reduction can be affected by the probability dynamics, max adjustment and spectral dynamics that will react to how the audio signal develops, in effect makes it possible to remove lots of noise when signal is soft and less (thus keeping more of the natural sound) when the signal is strong.
The peak delay can be estimated by looking at the signal for a bass pipe of the stop and measure the time between the first chiff and a fully developed tone. Remember that this is measured backwards so that -0.1 is equivalent to a delay of 100 ms. A recommendation we got was to never use a lower value than -0.15 (or more than 150 ms delay).
I also normally boost precision to 16 and keep the spectral decay very low (usually between 0.5 and 2).
My starting test nr.conf for a flute stop of 8' pitch might look something like:
HIGH_PASS_CUTOFF = "55"
KEEP_IF_OVER = "0.999999"
KILL_IF_UNDER = "0.9998"
UPPER_CONFIDENCE = "0.99"
LOWER_CONFIDENCE = "0.66"
PROBABILITY_DYNAMICS = "0.0015"
PROBABILITY_MAX_ADJUSTMENT = "0.025" # increase for louder more powerful stops
LEVEL_NOISE = "TRUE"
NOISE_OFFSET = "0"
NOISE_FLOOR = "-90"
PRECISION = "16"
REDUCE_BY_MAX = "-60"
# REDUCE_BY_MIN = "0" parameter removed
SPECTRAL_DECAY = "1"
SPECTRAL_DYNAMICS = "10"
PEAK_DELAY = "-0.1" # decrease for slower speaking stops…
but it will most likely need considerable tweaking until I get a good result. If nothing seems to help despite testing different /fftsizes for the profile and all kinds of settings in the nr.conf it might be a good idea to revisit the noise file that was used for profiling and if possible try cutting a new part of noise that you create another set of noise profiles from.