Here is a link to the simple synth I am starting with. It simulates the sound of a PVC type xylophone. It adjusts the delay length based on the requested note.
It is this synth that got me thinking about pre-exiting the delay line in order to get low frequency sounds.
http://www.garrett-technologies.com/Music/pvc_synth.zip
mcg
-----Original Message----- From: Michael Garrett [mailto:mgarrett@garrett-tech.com] Sent: Thursday, December 07, 2006 1:58 PM To: 'Michael Garrett'; 'derek holzer' Cc: 'pd-list@iem.at' Subject: RE: [PD] Pre Loading a Delay Line
Forgot to mention, the last synth is a standard KS synth, it does not use a pre loaded delay line!!
mcg
-----Original Message----- From: Michael Garrett [mailto:mgarrett@garrett-tech.com] Sent: Thursday, December 07, 2006 1:41 PM To: 'derek holzer' Cc: 'pd-list@iem.at' Subject: RE: [PD] Pre Loading a Delay Line
Attached is the base KS synth that I am using. It sounds like a PVC pipe Being hit which was my goal. The delay is excited with a cosine enveloped bandlimited noise pulse. If you add some spikes to the table, you can change the excitation sound.
Preloading the table, gets more low frequency energy into the table faster, allowing better generation of low frequency sounds. (I am a bass player!!)
mcg
-----Original Message----- From: derek holzer [mailto:derek@x-i.net] Sent: Thursday, December 07, 2006 12:26 PM To: Michael Garrett Cc: pd-list@iem.at Subject: Re: [PD] Pre Loading a Delay Line
I was wondering how you arrived at this idea of "preloading" the delay line. From reading this I would say definitely trigger your waveforms as samples into a delay line with feedback. The waveform should be the same length as your delay line. By setting your feedback and playback readpoints to the same, you can change the functional length of delay without changing it's actual (or theoretical maximum) length. So you'll need to be able to call up the length of the waveform (unless they are all the same in your implementation) in miliseconds and send that to the [vd~] used for playback and for feedback as a starting point, from which you would adjust to change pitch. The first thing you would hear then is the sampled waveform, and then after that iterations of that waveform decreasing in volume. Classic KS.
Or am I missing something? It seems you're taking a more complex approach to this than basic KS, and I wonder what the aim is in terms of sound...
best, d.
Michael Garrett wrote:
A little better explanation:
The idea is to read from the table, and feedback with and attenuated
delay,
back into the table, thereby modifying the table, the table at any given time, being the KS 'waveform' at that instant. So, reading attenuating and feeding Back the signal at varying rates, is equivalent to modifying the 'speed of sound' inside the 'waveguide'.
So something like this: Read out from the table at the current (or
delayed)
index, send that to the output, take that sample attenuate it, and write
it
back to the using the delay index, increment the indices (with modulo) thereby replacing the original table with the time modified data at each time (or sample index). The read .. modify.. feedback rate, is equivalent
to
the 'propagation' of waves in the 'waveguide' (or the KS 'delay' unit).
So of you were watching the table in real time, you would see the internal guts of the KS algorithm, modifying the wave (table)in real time.
Once the energy in the table has decayed to zero, silence would be
output...
Another note would be triggered, by copying the table back into the 'waveguide' (or table or delay line depending on the implementation).
mcg
-----Original Message----- From: derek holzer [mailto:derek@x-i.net] Sent: Thursday, December 07, 2006 10:16 AM To: Michael Garrett Cc: pd-list@iem.at Subject: Re: [PD] Pre Loading a Delay Line
Hi Michael,
technically, reading from a table and changing the playback speed isn't really KS. That's more like wavetable synthesis with en envelope. I always thought KS was dependent on attenuated feedback. But if it works do it!
I don't have a handy example of tabread/tabwrite as a delay, unfortunately. Frank Barknecht has a [pluck~] abstraction in CVS:
"/abstractions/footils/foo/pluck~.pd"
But I'm sure it uses [vd~]. Might be interesting to have a look at. And this abstraction from Orm Finnendahl adapted by João Miguel Pais:
http://lists.puredata.info/pipermail/pd-list/attachments/20060412/75593d59/k
s.obj
(textfile...save as "ks.pd")
Another idea, why not preload the delay line in realtime by triggering a sample when you need the note? That seems much more like "textbook" KS, which is usually triggered by a burst of noise (though I prefer a mic input).
best, d.
Michael Garrett wrote:
Thanks or the feedback!! I have a good KS synthesizer patched up That gives me good results, with the block size for the waveguide set At blocksize one as you suggested.
The table is a good idea, instead of time dialating the excitation
waveform
or changing the delay time to get different pitches, I can just read /
write
the table (delay line) at different rates (in modeling terms, changing
the
speed of sound). Easier, and only requires a constant length table copy
for
each note.
I have been peaking into the source with the intent of creating an
external
which performs the same function as the current delay object (with vd~)
but
has an input to preload the delay line from a table.
Is there an example that you know of that uses tabread and write as a
delay
line??
Thanks!!
Michael
-----Original Message----- From: derek holzer [mailto:derek@x-i.net] Sent: Wednesday, November 29, 2006 8:01 PM To: Michael Garrett Cc: pd-list@iem.at Subject: Re: [PD] Pre Loading a Delay Line
Hi Michael,
Michael Garrett wrote:
I need to pre fill a delay line, in a Karplus Strong oscillator. That data will then be overwritten during the duration
Of the 'note'. Is there a 'built in mechanism for accomplishing this, or
do I need to construct something using a table.
I need the delay line to be interpolating. I am setting the delay based on the incoming note, and ideally would fill the line with the same waveform, time dilated to fit the required length.
Short answer: no, there is no way to "pre fill" the delay that is native to the [delwrite~] object.
You're on the right track to use a table, however. You could also go a step further and build your own delay line using two tables, which transfer back and forth to each other with [tabwrite~], and could be preloaded with whatever you need. The [tabread4~] object should read your tables with enough interpolation for Karplus Strong synthesis. Otherwise, [delwrite~] and [vd~] are normally used for this, and [vd~ ] seems to interpolate well enough. You'll have to set a very low blocksize with the [block~] object to synthesize high frequencies in any case.
In the past, there's been quite a bit of discussion about KS synthesis on the list. And it sounds like you have a rather complicated approach to it (or at least more so than standard KS synthesis). If you're interested, it might be worth checking some of these threads for more
tips.
best, d.
Hallo, Michael Garrett hat gesagt: // Michael Garrett wrote:
Here is a link to the simple synth I am starting with. It simulates the sound of a PVC type xylophone. It adjusts the delay length based on the requested note.
It is this synth that got me thinking about pre-exiting the delay line in order to get low frequency sounds.
You synth sounds very nice! A little hint: You can use $0 in the name of delay lines instead of $1. That way you could get rid of the A, B, C, ... stuff that you use to differentiate between delays. As all your delays are in a seperate abstraction $0 will be unique.
Then I don't really understand why preloading the delay line should give better low frequency sounds. Is it, because with lower notes and thus longer delay times you will have to wait longer for the first result? Isn't that the same with a real double bass, which also has a certain inertia?
You have some minor bugs in your patch: First the [poly] number "4" is too small to get all possible polyphony. You could raise it to 8. Then you should check the triggering in pcv_synth_001.pd: You have to make sure, that the [1000( gets sent to the [/ ] after the [mtof] was send there. This isn't sure in your patch. Attached is a version with a fix that involves creating an additional outlet for the trigger-object.
Frank Barknecht _ ______footils.org_ __goto10.org__
Hi Michael,
thanks for the verbose answers! When I get a free moment I will check all this stuff out at length. I'm not one for "classic textbook" stuff either, so I figured there was a method to your madness ;-)
One way I've been dealing with this low frequency issue is by taking some inspiration from the Trautonium. The Doepfer synthesizer manufacturer recently started to make modules for reproducing this sound, but the basic idea is very simple. Take a note, and make a few octave or partial octave subdivisions. So for each note you could have two or three subharmonics of that octave which would fill in the low frequencies.
In practice, this would mean setting up several KS delay lines for each excitation, but pitching them at subharmonics of the highest note. Octave divisions are the "cleanest" and most natural sounding, but three or four octaves below some notes means you have a slightly pitched echo rather than a tone. So half, three quarter or other divisions are worth experimenting with. Normal, "musical" divisions with a slight detune just high or low of the target note give very nice, rich, deep sounds. From here, you can easily side-track into Just Intonation theory and all other kinds of stuff. I just like it when it sounds heavy!
good luck, d.
Michael Garrett wrote:
Here is a link to the simple synth I am starting with. It simulates the sound of a PVC type xylophone. It adjusts the delay length based on the requested note.
It is this synth that got me thinking about pre-exiting the delay line in order to get low frequency sounds.
http://www.garrett-technologies.com/Music/pvc_synth.zip
mcg
-----Original Message----- From: Michael Garrett [mailto:mgarrett@garrett-tech.com] Sent: Thursday, December 07, 2006 1:58 PM To: 'Michael Garrett'; 'derek holzer' Cc: 'pd-list@iem.at' Subject: RE: [PD] Pre Loading a Delay Line
Forgot to mention, the last synth is a standard KS synth, it does not use a pre loaded delay line!!
mcg
-----Original Message----- From: Michael Garrett [mailto:mgarrett@garrett-tech.com] Sent: Thursday, December 07, 2006 1:41 PM To: 'derek holzer' Cc: 'pd-list@iem.at' Subject: RE: [PD] Pre Loading a Delay Line
Attached is the base KS synth that I am using. It sounds like a PVC pipe Being hit which was my goal. The delay is excited with a cosine enveloped bandlimited noise pulse. If you add some spikes to the table, you can change the excitation sound.
Preloading the table, gets more low frequency energy into the table faster, allowing better generation of low frequency sounds. (I am a bass player!!)
mcg
-----Original Message----- From: derek holzer [mailto:derek@x-i.net] Sent: Thursday, December 07, 2006 12:26 PM To: Michael Garrett Cc: pd-list@iem.at Subject: Re: [PD] Pre Loading a Delay Line
I was wondering how you arrived at this idea of "preloading" the delay line. From reading this I would say definitely trigger your waveforms as samples into a delay line with feedback. The waveform should be the same length as your delay line. By setting your feedback and playback readpoints to the same, you can change the functional length of delay without changing it's actual (or theoretical maximum) length. So you'll need to be able to call up the length of the waveform (unless they are all the same in your implementation) in miliseconds and send that to the [vd~] used for playback and for feedback as a starting point, from which you would adjust to change pitch. The first thing you would hear then is the sampled waveform, and then after that iterations of that waveform decreasing in volume. Classic KS.
Or am I missing something? It seems you're taking a more complex approach to this than basic KS, and I wonder what the aim is in terms of sound...
best, d.
Michael Garrett wrote:
A little better explanation:
The idea is to read from the table, and feedback with and attenuated
delay,
back into the table, thereby modifying the table, the table at any given time, being the KS 'waveform' at that instant. So, reading attenuating and feeding Back the signal at varying rates, is equivalent to modifying the 'speed of sound' inside the 'waveguide'.
So something like this: Read out from the table at the current (or
delayed)
index, send that to the output, take that sample attenuate it, and write
it
back to the using the delay index, increment the indices (with modulo) thereby replacing the original table with the time modified data at each time (or sample index). The read .. modify.. feedback rate, is equivalent
to
the 'propagation' of waves in the 'waveguide' (or the KS 'delay' unit).
So of you were watching the table in real time, you would see the internal guts of the KS algorithm, modifying the wave (table)in real time.
Once the energy in the table has decayed to zero, silence would be
output...
Another note would be triggered, by copying the table back into the 'waveguide' (or table or delay line depending on the implementation).
mcg
-----Original Message----- From: derek holzer [mailto:derek@x-i.net] Sent: Thursday, December 07, 2006 10:16 AM To: Michael Garrett Cc: pd-list@iem.at Subject: Re: [PD] Pre Loading a Delay Line
Hi Michael,
technically, reading from a table and changing the playback speed isn't really KS. That's more like wavetable synthesis with en envelope. I always thought KS was dependent on attenuated feedback. But if it works do it!
I don't have a handy example of tabread/tabwrite as a delay, unfortunately. Frank Barknecht has a [pluck~] abstraction in CVS:
"/abstractions/footils/foo/pluck~.pd"
But I'm sure it uses [vd~]. Might be interesting to have a look at. And this abstraction from Orm Finnendahl adapted by João Miguel Pais:
http://lists.puredata.info/pipermail/pd-list/attachments/20060412/75593d59/k
s.obj
(textfile...save as "ks.pd")
Another idea, why not preload the delay line in realtime by triggering a sample when you need the note? That seems much more like "textbook" KS, which is usually triggered by a burst of noise (though I prefer a mic input).
best, d.
Michael Garrett wrote:
Thanks or the feedback!! I have a good KS synthesizer patched up That gives me good results, with the block size for the waveguide set At blocksize one as you suggested.
The table is a good idea, instead of time dialating the excitation
waveform
or changing the delay time to get different pitches, I can just read /
write
the table (delay line) at different rates (in modeling terms, changing
the
speed of sound). Easier, and only requires a constant length table copy
for
each note.
I have been peaking into the source with the intent of creating an
external
which performs the same function as the current delay object (with vd~)
but
has an input to preload the delay line from a table.
Is there an example that you know of that uses tabread and write as a
delay
line??
Thanks!!
Michael
-----Original Message----- From: derek holzer [mailto:derek@x-i.net] Sent: Wednesday, November 29, 2006 8:01 PM To: Michael Garrett Cc: pd-list@iem.at Subject: Re: [PD] Pre Loading a Delay Line
Hi Michael,
Michael Garrett wrote:
I need to pre fill a delay line, in a Karplus Strong oscillator. That data will then be overwritten during the duration
Of the 'note'. Is there a 'built in mechanism for accomplishing this, or
do I need to construct something using a table.
I need the delay line to be interpolating. I am setting the delay based on the incoming note, and ideally would fill the line with the same waveform, time dilated to fit the required length.
Short answer: no, there is no way to "pre fill" the delay that is native to the [delwrite~] object.
You're on the right track to use a table, however. You could also go a step further and build your own delay line using two tables, which transfer back and forth to each other with [tabwrite~], and could be preloaded with whatever you need. The [tabread4~] object should read your tables with enough interpolation for Karplus Strong synthesis. Otherwise, [delwrite~] and [vd~] are normally used for this, and [vd~ ] seems to interpolate well enough. You'll have to set a very low blocksize with the [block~] object to synthesize high frequencies in any case.
In the past, there's been quite a bit of discussion about KS synthesis on the list. And it sounds like you have a rather complicated approach to it (or at least more so than standard KS synthesis). If you're interested, it might be worth checking some of these threads for more
tips.
best, d.
Derek,
Thanks for the great exchange of ideas!!!
There was a lot of postings last night that I need to weed through.
One thing I realized last night is that I am getting my terminology confused. A basic KS block, the one that I have labeled waveguide, is not really a waveguide in the true sense. So the synth that I have posted really is a KS synth.
One thing about pre loading the delay line, is getting the true sound of the recalculating line itself, without the noise pulse at the beginning. You can output the delayed signal, but it appears 20 msec or so 'late' for bass notes.
I picture it similar to pulling a bass string with your finger, you are adding energy to the string, but there is no sound from adding this energy. So the string, in cross section looks like a single cycle of a saw tooth. The pickup is located someplace on the string, and start producing sound the instant the string is released, not 20 msec later, the timbre of the sound based on the energy stored by the finger being released.
The synth that I posted, does a pretty good pvc implementation. You can do what you suggest just by playing octaves on the thing...
I am going to get a little more theoretical, and possibly implement an external. I got the examples to compile, but have some kind of boneheaded error that I need to fix.
All in all, I think that I am reinventing waveguide synthesis which was patented 12 years ago.... I read the patents last night...
mcg
-----Original Message----- From: derek holzer [mailto:derek@x-i.net] Sent: Thursday, December 07, 2006 8:30 PM To: Michael Garrett Cc: pd-list@iem.at Subject: Re: [offlist] Pre Loading a Delay Line
Hi Michael,
thanks for the verbose answers! When I get a free moment I will check all this stuff out at length. I'm not one for "classic textbook" stuff either, so I figured there was a method to your madness ;-)
One way I've been dealing with this low frequency issue is by taking some inspiration from the Trautonium. The Doepfer synthesizer manufacturer recently started to make modules for reproducing this sound, but the basic idea is very simple. Take a note, and make a few octave or partial octave subdivisions. So for each note you could have two or three subharmonics of that octave which would fill in the low frequencies.
In practice, this would mean setting up several KS delay lines for each excitation, but pitching them at subharmonics of the highest note. Octave divisions are the "cleanest" and most natural sounding, but three or four octaves below some notes means you have a slightly pitched echo rather than a tone. So half, three quarter or other divisions are worth experimenting with. Normal, "musical" divisions with a slight detune just high or low of the target note give very nice, rich, deep sounds. From here, you can easily side-track into Just Intonation theory and all other kinds of stuff. I just like it when it sounds heavy!
good luck, d.
Michael Garrett wrote:
Here is a link to the simple synth I am starting with. It simulates the sound of a PVC type xylophone. It adjusts the delay length based on the requested note.
It is this synth that got me thinking about pre-exiting the delay line in order to get low frequency sounds.
http://www.garrett-technologies.com/Music/pvc_synth.zip
mcg
-----Original Message----- From: Michael Garrett [mailto:mgarrett@garrett-tech.com] Sent: Thursday, December 07, 2006 1:58 PM To: 'Michael Garrett'; 'derek holzer' Cc: 'pd-list@iem.at' Subject: RE: [PD] Pre Loading a Delay Line
Forgot to mention, the last synth is a standard KS synth, it does not use
a
pre loaded delay line!!
mcg
-----Original Message----- From: Michael Garrett [mailto:mgarrett@garrett-tech.com] Sent: Thursday, December 07, 2006 1:41 PM To: 'derek holzer' Cc: 'pd-list@iem.at' Subject: RE: [PD] Pre Loading a Delay Line
Attached is the base KS synth that I am using. It sounds like a PVC pipe Being hit which was my goal. The delay is excited with a cosine enveloped bandlimited noise pulse. If you add some spikes to the table, you can
change
the excitation sound.
Preloading the table, gets more low frequency energy into the table
faster,
allowing better generation of low frequency sounds. (I am a bass player!!)
mcg
-----Original Message----- From: derek holzer [mailto:derek@x-i.net] Sent: Thursday, December 07, 2006 12:26 PM To: Michael Garrett Cc: pd-list@iem.at Subject: Re: [PD] Pre Loading a Delay Line
I was wondering how you arrived at this idea of "preloading" the delay line. From reading this I would say definitely trigger your waveforms as samples into a delay line with feedback. The waveform should be the same length as your delay line. By setting your feedback and playback readpoints to the same, you can change the functional length of delay without changing it's actual (or theoretical maximum) length. So you'll need to be able to call up the length of the waveform (unless they are all the same in your implementation) in miliseconds and send that to the [vd~] used for playback and for feedback as a starting point, from which you would adjust to change pitch. The first thing you would hear then is the sampled waveform, and then after that iterations of that waveform decreasing in volume. Classic KS.
Or am I missing something? It seems you're taking a more complex approach to this than basic KS, and I wonder what the aim is in terms of sound...
best, d.
Michael Garrett wrote:
A little better explanation:
The idea is to read from the table, and feedback with and attenuated
delay,
back into the table, thereby modifying the table, the table at any given time, being the KS 'waveform' at that instant. So, reading attenuating
and
feeding Back the signal at varying rates, is equivalent to modifying the 'speed of sound' inside the 'waveguide'.
So something like this: Read out from the table at the current (or
delayed)
index, send that to the output, take that sample attenuate it, and write
it
back to the using the delay index, increment the indices (with modulo) thereby replacing the original table with the time modified data at each time (or sample index). The read .. modify.. feedback rate, is equivalent
to
the 'propagation' of waves in the 'waveguide' (or the KS 'delay' unit).
So of you were watching the table in real time, you would see the
internal
guts of the KS algorithm, modifying the wave (table)in real time.
Once the energy in the table has decayed to zero, silence would be
output...
Another note would be triggered, by copying the table back into the 'waveguide' (or table or delay line depending on the implementation).
mcg
-----Original Message----- From: derek holzer [mailto:derek@x-i.net] Sent: Thursday, December 07, 2006 10:16 AM To: Michael Garrett Cc: pd-list@iem.at Subject: Re: [PD] Pre Loading a Delay Line
Hi Michael,
technically, reading from a table and changing the playback speed isn't really KS. That's more like wavetable synthesis with en envelope. I always thought KS was dependent on attenuated feedback. But if it works do it!
I don't have a handy example of tabread/tabwrite as a delay, unfortunately. Frank Barknecht has a [pluck~] abstraction in CVS:
"/abstractions/footils/foo/pluck~.pd"
But I'm sure it uses [vd~]. Might be interesting to have a look at. And this abstraction from Orm Finnendahl adapted by João Miguel Pais:
http://lists.puredata.info/pipermail/pd-list/attachments/20060412/75593d59/k
s.obj
(textfile...save as "ks.pd")
Another idea, why not preload the delay line in realtime by triggering a sample when you need the note? That seems much more like "textbook" KS, which is usually triggered by a burst of noise (though I prefer a mic input).
best, d.
Michael Garrett wrote:
Thanks or the feedback!! I have a good KS synthesizer patched up That gives me good results, with the block size for the waveguide set At blocksize one as you suggested.
The table is a good idea, instead of time dialating the excitation
waveform
or changing the delay time to get different pitches, I can just read /
write
the table (delay line) at different rates (in modeling terms, changing
the
speed of sound). Easier, and only requires a constant length table copy
for
each note.
I have been peaking into the source with the intent of creating an
external
which performs the same function as the current delay object (with vd~)
but
has an input to preload the delay line from a table.
Is there an example that you know of that uses tabread and write as a
delay
line??
Thanks!!
Michael
-----Original Message----- From: derek holzer [mailto:derek@x-i.net] Sent: Wednesday, November 29, 2006 8:01 PM To: Michael Garrett Cc: pd-list@iem.at Subject: Re: [PD] Pre Loading a Delay Line
Hi Michael,
Michael Garrett wrote:
I need to pre fill a delay line, in a Karplus Strong oscillator. That data will then be overwritten during the duration
Of the 'note'. Is there a 'built in mechanism for accomplishing this,
or
do I need to construct something using a table.
I need the delay line to be interpolating. I am setting the delay based
on the incoming note, and ideally would fill the line with the same waveform, time dilated to fit the required length.
Short answer: no, there is no way to "pre fill" the delay that is native
to the [delwrite~] object.
You're on the right track to use a table, however. You could also go a step further and build your own delay line using two tables, which transfer back and forth to each other with [tabwrite~], and could be preloaded with whatever you need. The [tabread4~] object should read your tables with enough interpolation for Karplus Strong synthesis. Otherwise, [delwrite~] and [vd~] are normally used for this, and [vd~ ] seems to interpolate well enough. You'll have to set a very low blocksize with the [block~] object to synthesize high frequencies in any
case.
In the past, there's been quite a bit of discussion about KS synthesis on the list. And it sounds like you have a rather complicated approach to it (or at least more so than standard KS synthesis). If you're interested, it might be worth checking some of these threads for more
tips.
best, d.