I am fond of the help patch D.08.table.spectrum.pd. I am interested in making something similar for my JI sequencer. But, I want 8 voices with 20-note polyphony. Not 20 notes per voice, but 8 separate spectrum-lookup tables and 20 instances of the note-calculating abstraction, switching between those 8 tables depending on which voice the current note has.
I already have it set up to do 20-note polyphony reading from 8 wavetables, but spectrum lookup is far more expensive; doing it the way the help patch does means 30 oscillators per note. Is there any way to set this up so Pd can handle it in real-time? I set up the wavetables so each is calculated by the same set of oscillators, which send only to whichever one is being edited; and I set it up so each of the 20 note abstractions is switched on before each note and switched off after.
The way I'm conceiving of this, though, each of the 20 note abstractions would require 30 oscillator abstractions...
Any chance of that happening in real time?
-Chuckk
-- "It is not when truth is dirty, but when it is shallow, that the lover of knowledge is reluctant to step into its waters." -Friedrich Nietzsche, "Thus Spoke Zarathustra"
i assume you're not going to use every note at once all the time, right? in that case, putting your oscillators in subpatches with [switch] objects turning them off when not in use is going to be really helpful as far as cpu goes.
Hallo, Chuckk Hubbard hat gesagt: // Chuckk Hubbard wrote:
The way I'm conceiving of this, though, each of the 20 note abstractions would require 30 oscillator abstractions...
Any chance of that happening in real time?
600 naked [osc~ 100] objects on my machine work in realtime, however it sucks about 75 percent of the CPU ("Intel(R) Pentium(R) M processor 1.60GHz").
Basically you are doing additive synthesis here, which you can do it two or three ways. One is the oscillator bank as used in the example patch. This is very flexible but also very demanding. It normally is used when you want to independently control the amplitude and/or frequency envelope and phase of every partial during the course of the note. Another possibility to do it is resynthesizing with an inverse Fourier transform, which can be less demanding, but you loose some of the flexibility of the oscillator bank approach.
The cheapest route to go is to build the partial table in advance with "sinesum" and then just use one [tabread4~] per voice. If your partial setup doesn't change while a note is playing this would be the way to go. Instead of "sinesum" you can also built other kinds of wavetables by writing them manually with e.g. [expr].
Frank Barknecht _ ______footils.org_ __goto10.org__
On Tue, 11 Apr 2006, Frank Barknecht wrote:
Another possibility to do it is resynthesizing with an inverse Fourier transform, which can be less demanding, but you loose some of the flexibility of the oscillator bank approach.
For any sane blocksize, Fourier's lowest frequencies are too far apart, so you can't get anything interesting unless you reproduce the same spectral leakage that happens when doing [fft~] on [osc~] for most frequencies. Reproducing the leakage takes a damn lot of CPU and is fastidious to do in Pd. So don't do it.
The cheapest route to go is to build the partial table in advance with "sinesum" and then just use one [tabread4~] per voice. If your partial setup doesn't change while a note is playing this would be the way to go. Instead of "sinesum" you can also built other kinds of wavetables by writing them manually with e.g. [expr].
Agreed. I haven't used sinesum personally, but tables in general seem to be the right way. I'd have used [expr] for lack of knowing anything else appropriate...
_ _ __ ___ _____ ________ _____________ _____________________ ... | Mathieu Bouchard - tél:+1.514.383.3801 - http://artengine.ca/matju | Freelance Digital Arts Engineer, Montréal QC Canada
On 4/11/06, Frank Barknecht fbar@footils.org wrote:
Hallo, Chuckk Hubbard hat gesagt: // Chuckk Hubbard wrote:
The way I'm conceiving of this, though, each of the 20 note abstractions would require 30 oscillator abstractions...
Any chance of that happening in real time?
600 naked [osc~ 100] objects on my machine work in realtime, however it sucks about 75 percent of the CPU ("Intel(R) Pentium(R) M processor 1.60GHz").
Basically you are doing additive synthesis here, which you can do it two or three ways. One is the oscillator bank as used in the example patch. This is very flexible but also very demanding. It normally is used when you want to independently control the amplitude and/or frequency envelope and phase of every partial during the course of the note. Another possibility to do it is resynthesizing with an inverse Fourier transform, which can be less demanding, but you loose some of the flexibility of the oscillator bank approach.
The cheapest route to go is to build the partial table in advance with "sinesum" and then just use one [tabread4~] per voice. If your partial setup doesn't change while a note is playing this would be the way to go. Instead of "sinesum" you can also built other kinds of wavetables by writing them manually with e.g. [expr].
This is what I did originally, and I devised an intricate system so there was only one set of oscillators, and it wrote to whichever array was being edited. At least I thought it was intricate. I now have the exact same system, but the tabread~ is controlled by those spectrum-table-reading oscillators (now phasors). So if I want pure spectrum-reading, I put a sinewave in the graph; and if I want pure table lookup, I put a constant in the spectrum table. My PC is fast enough to handle it, but the school's Macs are having a hard time.
I am really in love with the sound of FOF and am interested in CPU-cheap ways to do it in Pd.
-Chuckk