-
solipp
@porres
It is based on this talk by Geraint Luff:
However, the basic structure is the same as in rev3~, early reflections are fed into a 16-channel fdn. Delay times are selected from a table of prime numbers. The "secret" lies in the mixdown of the 16 fdn channels to stereo. It was more or less trial and error, adding and subtracting the signals and listening what sounds good. -
solipp
Sorry for not posting for some ... 2 years. Just a reminder that this project is still alive and slowly but surely evolving.
I pushed an update to deken today, v0.61. New stuff since version 0.4 include:pp.fft-profile~ - esoteric spectral denoiser/vocoder
pp.loop.rec~ pp.loop.play~ - a pair of abstractions to record and play loops, but also useful for pitch shifting/reverse delays
pp.grainrev~ - a granular reverb, very cool
pp.phiverb~ - a good sounding reverbmany bugfixes and some new examples.
Make sure to use the latest version of pd (pd-0.55 at the time of posting).
In plugdata most objects should work but needs more testing.@jewelzcotard sorry for the late reply, anyway if you moved the speakers in the gui, you can save with msg [save 1( to the rightmost inlet of pp.spat8~ and save the patch. A msg [recall 1( to the same inlet will load your settings.
Happy patching and make some noise!
-
solipp
Hi @Nullstrahler
"cd" stands for "change directory". "path/to/pd" is of course a placeholder. You have to replace it with the path to the directory you chose for the source files. Alternatively, you can use your file manager to open the directory, and then right-click -> "Open Terminal Here".you'll need the following dependencies to compile pure data, some of them might be already installed on your system. Install with apt:
sudo apt install build-essential automake autoconf libtool gettext
sudo apt install libasound2-dev libjack-jackd2-dev
Then follow the install instructions. In a nutshell:
./autogen.sh
./configure --enable-jack
this compiles pd with jack support. you can check the configure options with
./configure --helpmake
if make runs without errors, you can install with:
sudo make install
-
solipp
; pd-test obj 0 0 r bnag, obj 0 100 unsig~, connect 0 0 1 0; bnag bang
-
solipp
@differencetones you can just parse $0 as an argument to clone like this:
[clone myabstraction 16 $0]
To refer to $0-grain in the parent, use [tabread4~ $2-grain] inside your abstraction ($1 is the number of the clone instance) -
solipp
@bocanegra http://www.willpirkle.com/Downloads/AN-4VirtualAnalogFilters.2.0.pdf is a good read. I translated the TPT laddder filter to pd in the [pp.ladder~] object in audiolab (you can download it with deken). Here is a version with an outlet for each pole and the "analog clipper" from above : TPT-ladder.pd
Another solution is [bob~] of course : https://github.com/pure-data/pure-data/blob/master/extra/bob~/bob~.c -
solipp
little note: your filter does not resonate at the cutoff frequency.
top: how it should be, bottom: how it is
now, solve this
-
solipp
@nicnut you can do something like this:
Edit: of course, if you need to translate from signal to control rate, threshold~ is the solution.
Edit: better use -~: -
solipp
@jameslo nja, i think you gave the wrong reason
if you run pd at samplerate 44100 and you upsample by 16, the samplerate of the patch is 705 600. Devide this by fft-split~'s default blocksize 1024 and you get a bin resolution of 705600/1024 ~ 689 hz.
This is like running fft-split~ with a blocksize of 64 at normal samplerate (44100/64 ~ 689). You can try, [pp.fft-split 64 4] will give you the same strange result (I'm not even sure why fft patches start to act weird when you run them with block sizes >256, maybe it actually is related to overlap...)
With block size 4096 you get 705600/4096 ~ 172hz resolution, but you probably want 705600/16384 ~ 43hz witch relates to 44100/1024 ~ 43hz. -
solipp
there was a short conversation about this on the mailing list:
https://www.mail-archive.com/pd-list@iem.at/msg58775.htmlIn general, I think questions about potential bugs or the internal workings of pd are better asked on the mailing list or as an issue on github.
-
solipp
@jameslo said:
- It looks like you are simply passing the bins that are below the threshold frequency to the left inverse transform, and the rest to the right (with the omitted bins on each side muted), is that correct?
yes, that's correct.
- If so, then why does the transition band sound continuous? i.e. when I output lowpass to the left and highpass to the right, as I sweep up it moves continuously from left to right around the threshold frequency.
that is the result of spectral smearing i guess https://en.wikipedia.org/wiki/Spectral_leakage
the slopes of the lowpass/highpass are not perfectly steep- I struggled to make a test to see what phase distortions occur near the threshold frequency, and there don't appear to be any. Could that be true? (I'm not confident I tested properly)
there shouldn't be any phase distortion. essentially it's a linear phase FIR filter.
@tungee thanks for the links!
I made this pp.ladder~ filter to get an idea about the concept of "zero delay filters". So I kind of mapped it out as a pd patch to get an overview (not that i fully understand it now...)
However, it makes much more sense to create externals (instead of vanilla abstractions) of this filters. Pure data is really not efficient in processing patches with one sample dsp blocks. -
-
solipp
@Obineg said:
aha, so they take messages when you name them?
no, they take messages in general. "naming" inlet/outlet is considered bad patching style.
if you want to connect signals and messages to an abstraction, you have to use something like [route start stop int float] inside the abstraction - the signal will come out of the "does not match" output of [route].
I prefer the pd method; [inlet~ fwd]. It is documented in the helpfile.
@ddw_music said:
It appears that, when you connect nothing to [inlet~], it already holds its last value and doesn't reset. You can test that, in the sample patch above, by deleting the signal connection into the right-hand side instance of the 0529 abstraction. If it went to 0, then the right channel would be silent. Instead, it holds frequency.
? if I could reproduce this, i would file a bug report on github. because this would be undesirable in many situations. However, i can't reproduce it. I wonder why it works for you?
-
solipp
since pd 0.51 it is possible to set a default value for [inlet~]. So instead of zero [inlet~] can send some unreasonable value against which you can check if there is a connection:
-
solipp
@morpheu5 you could reduce the amount of oversampling, is there a reason for oversampling by a factor of 16? And you can [X] - switch~ off grains that are not playing..
-
solipp
@morpheu5 ...you could also use a counter instead of [next(, then retrigger the previous grain when you press a key. maybe that's the best option. sorry for the confusion, it's late over here
-
solipp
@morpheu5 i almost forgot [this( message to clone! check the helpfile, [this( + pitch should do the trick
-
solipp
@morpheu5 ...of cause, this would not stop the last grain playing at the wrong pitch. So you need to stop them all, then send the pitch value and retrigger metro....
edit: hope that's not too confusing
-
solipp
@morpheu5 i guess you get the wrong pitch because the grain is already playing when you press your key (i haven't tried the patch). You can send a trigger + pitch value to [clone] when you press the key with [next(. Right now you are sending the trigger to all grains simultaneously.