Forums > MaxMSP

comb~ and alternatives


kp*
April 18, 2008 | 8:14 pm

Is there another comb filter option in Max? other than comb~ ?

I find the comb filter in MSP to be less than perfect for my
application, particularly in comparison to what i am used to in Cmix
and Csound and others (i know i know there is rtcmix~ and csound~ i
may go that route but i am hoping for a maxcentric solution).

In Csound you set the looptime to be 1/ frequency as you would expect,
but you can also set the filter ringtime to to arbitrarily long (or
short) reverb times. So you could set a short sample through the comb
and set it to buzz away for like 10 seconds if you felt like it.

Is there another way to get a really resonant comb filter in max that
lets you use employ csoundesque long ring times?

cheers,

kevin


April 19, 2008 | 1:09 am

On 2008 Apr 18, at 3:14 PM, kevin parks wrote:
> Is there another comb filter option in Max? other than comb~ ?

In MSP there is also the teeth~ object, though it doesn’t sound like
it will help you too much. There is also tap.comb~ in Tap.Tools which
may be better — check the URL in my signature.

best,
Tim
____________________________________
Tap.Tools – Objects for Max, MSP, and Jitter

http://electrotap.com/taptoolsmax/


April 19, 2008 | 3:00 am


April 19, 2008 | 3:05 pm

regarding comb tone, I recently played with a friends eventide harmonizer, which had the most incredible sounding combs ive ever heard. Im curious if anyone here has played with out and knows of a way to get a similar tone?

also, I reccomend creating your own comb using tapin and tapout, and encapsulating it in a poly so that you can set the vector size to 1, which will allow you to get extremely tight delay times needed for combing, this will also allow for greater control over the things taking place within the comb, I added a highpass and lowpass to mine, as well as an overdrive and limiter to give the comb more tone and keep it from feeding back too much.


April 19, 2008 | 3:15 pm

>
> Non-math answer, the higher you make the last inlet of comb~/teeth~
> the longer the ringing should be.

that’s right. but the problem with [comb~] and [teeth~] is, that they
use linear delay time interpolation instead of slightly more
expensive cubic or allpass interpolation.
this becomes apparent if you set the delay time to non-integer
multiples of the sample interval – which is most often the case.
this results in high frequency loss in the output signal, which is
pretty audible if you work with high feedback settings.

if you set the delay time with a float (not a signal) teeth~, comb~
and also tapin/tapout~ don’t do sub-sample delay times at all.
so the ringing frequencies are out of tune.

don’t know exactly what kevin’s problem is with [comb~], but i would
rather go with tapin~/tapout~ and set the delay time with a signal.
then again the highest possible pitch is limited by the sigvs.
but tapin/tapout’s interpolation sounds much better than comb/teeth
(still not perfect).
aha, and if you go for distinct pitches, make sure you set the delay
time 1 sample shorter than the pitch period you want to obtain.

finally, i got a delay external somewhere on my disk that uses
allpass-interpolation (osx only).
this is slightly more cpu intensive and not made for rapid delay time
modulation, but gives you ‘endless’ ringing without
any unwanted high frequency loss. kevin, get back to me, if you want
to try it.

volker.

#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P comment 562 126 100 196617 feedback;
#P newex 103 87 48 196617 loadbang;
#P message 149 157 78 196617 set 1 1 1 1 0.5;
#P newex 427 55 81 196617 loadmess 300.5;
#P newex 514 58 81 196617 loadmess 0.995;
#P window setfont "Sans Serif" 12.;
#P user umenu 43 477 81 196659 1 64 497 1;
#X add comb nosig;
#X add comb sig;
#X add tapin/out;
#P window setfont "Sans Serif" 9.;
#P newex 70 507 27 196617 + 1;
#P newex 506 422 25 196617 r fb;
#P newex 533 287 65 196617 r del_samps;
#P newex 572 368 29 196617 sig~;
#P newex 469 444 47 196617 *~ 0.99;
#P newex 533 332 66 196617 sampstoms~;
#P newex 533 310 27 196617 – 1.;
#P newex 455 420 44 196617 tapout~;
#P newex 455 389 65 196617 tapin~ 1000;
#P user ezdac~ 101 631 145 664 0;
#P user gain~ 112 535 27 60 158 0 1.071519 7.94321 10.;
#P newex 112 508 214 196617 selector~ 3 1;
#P flonum 443 124 45 9 0. 0 1 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 513 124 42 9 -1. 1. 3 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 513 150 25 196617 s fb;
#P newex 443 150 65 196617 s del_samps;
#P newex 219 319 65 196617 r del_samps;
#P newex 248 442 120 196617 comb~ 100 10. 1. 0. 0.9;
#P newex 275 381 29 196617 sig~;
#P flonum 148 381 50 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 326 386 25 196617 r fb;
#P newex 219 342 66 196617 sampstoms~;
#P newex 121 442 120 196617 comb~ 100 10. 1. 0. 0.9;
#P toggle 61 131 15 0;
#P newex 61 150 64 196617 metro 6000;
#P button 61 174 23 0;
#P newex 61 212 37 196617 click~;
#P comment 337 126 100 196617 del time in samples;
#P connect 20 0 16 3;
#P connect 20 0 23 0;
#P connect 26 0 23 1;
#P fasten 23 0 19 0 474 469 436 462 436 383 460 383;
#P connect 32 0 4 0;
#P connect 4 0 3 0;
#P connect 3 0 2 0;
#P connect 31 0 1 0;
#P connect 2 0 1 0;
#P connect 28 0 27 0;
#P connect 17 0 18 0;
#P connect 27 0 16 0;
#P connect 16 0 17 0;
#P fasten 1 0 5 0 66 416 126 416;
#P connect 17 0 18 1;
#P connect 6 1 8 0;
#P connect 8 0 5 1;
#P connect 32 0 31 0;
#P fasten 5 0 16 1 126 468 185 468;
#P connect 11 0 6 0;
#P connect 7 0 5 4;
#P fasten 1 0 10 0 66 408 253 408;
#P connect 10 0 16 2;
#P connect 6 1 9 0;
#P connect 9 0 10 1;
#P connect 7 0 10 4;
#P connect 30 0 15 0;
#P connect 15 0 12 0;
#P fasten 1 0 19 0 66 254 460 254;
#P connect 19 0 20 0;
#P fasten 24 0 20 0 577 412 460 412;
#P connect 29 0 14 0;
#P connect 14 0 13 0;
#P connect 25 0 21 0;
#P connect 21 0 22 0;
#P connect 22 1 24 0;
#P window clipboard copycount 34;


April 19, 2008 | 4:03 pm


April 19, 2008 | 4:59 pm


April 19, 2008 | 8:11 pm

Oh, I forgot to ask before,

> aha, and if you go for distinct pitches, make sure you set the delay
> time 1 sample shorter than the pitch period you want to obtain.

This suggestion I was not aware of, why exactly should you need to do this? Is this to make up for some interpolation error? If you could fill me in that would be great :)


April 20, 2008 | 10:13 am

On 19 Apr 2008, at 18:59, Roth Michaels wrote:
>
> thanks for remembering to mention this. Not necessarily a
> "problem" (I’ve been known to use comb~ and tapin~/tapout~ for
> slightly different processes) but it is good to know that when you
> use comb~/teeth~ they could have different spectral effects.

not necessarily a problem, true – often it is desirable to have a
high frequency rolloff.
but you can’t control the filter effect independently since it is
connected to the delay time setting, i.e. you get changing spectral
results for different delay times.

>
> When I was looking at Volker’s example, I noticed something that I
> was unaware of. Signal vector seems to be an issue setting delay
> time for tapin~/tapout~ (see Axiom’s suggestion to put it in a
> poly~), but not for comb~. Is comb~ one of the lucky objects that
> can take delay times smaller than allowed by the signal vector? I
> guess I feel silly for taking signal vector precautions with comb~
> in the past.

the sigvs limit is only a problem if you build the feedback path in
max (tapin/tapout or send/receive stuff).
inside an external you have access to all samples of a vector.
otherwise you couldn’t build any useful filters, e.g.

>
>> finally, i got a delay external somewhere on my disk that uses
>> allpass-interpolation (osx only).
>> this is slightly more cpu intensive and not made for rapid delay time
>> modulation, but gives you ‘endless’ ringing without
>> any unwanted high frequency loss. kevin, get back to me, if you want
>> to try it.
> Also not Kevin, but would like to see that external ;)

for anyone interested in trying it, i’ve put a version + helpfile here

http://www.esbasel.ch/Downloads/MaxMSP-Objects.htm

volker.


April 20, 2008 | 10:29 am

On 19 Apr 2008, at 22:11, Roth Michaels wrote:
>
>
>> aha, and if you go for distinct pitches, make sure you set the delay
>> time 1 sample shorter than the pitch period you want to obtain.
>
> This suggestion I was not aware of, why exactly should you need to
> do this? Is this to make up for some interpolation error? If you
> could fill me in that would be great :)
> –

no, afaik this is not linked to interpolation.
we had a little discussion on the chuck-list about that issue not
long ago.
if you let the user provide the feedback path (as with tapin/tapout)
you can only access the feedbacked signal one sample later (assuming
a sigvs of 1). so in case you use the feedback delay to produce
periodic oscillation, the period will be 1 sample longer than the
actual delay time specified. i.e. the ringing sounds out of tune.
in an external, with built in feedback path, you can compensate the
one sample delay and get correct tuning if you pay attention to read-
write order.
this is what i _think_ it is, as i don’t know the inner workings of
tapin/tapout.
but maybe someone from cycling wants to shed some light it?

well, you can always just test it yourself – see the patch below.

volker.

#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P hidden message 203 172 69 196617 set 1 1 1 0.5;
#P user gain~ 403 451 24 100 158 0 1.071519 7.94321 10.;
#P flonum 417 275 46 9 0 0 0 3 0 0 0 255 227 23 222 222 222 0 0 0;
#N vpatcher 10 59 610 459;
#P outlet 89 297 15 0;
#P window setfont "Sans Serif" 9.;
#P newex 159 127 21 196617 t 1;
#P newex 159 87 48 196617 loadbang;
#P window linecount 1;
#P newex 89 239 45 196617 – 0.022;
#P flonum 215 185 50 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 159 154 66 196617 sampstoms~;
#P inlet 89 89 15 0;
#P connect 0 0 3 0;
#P connect 3 0 6 0;
#P connect 2 0 3 1;
#P connect 0 0 5 0;
#P connect 4 0 5 0;
#P connect 5 0 1 0;
#P connect 1 1 2 0;
#P pop;
#P newobj 417 250 63 196617 p m1sample;
#P newex 417 331 29 196617 sig~;
#P newex 461 410 53 196617 *~ 0.999;
#P newex 461 369 44 196617 tapout~;
#P newex 461 330 65 196617 tapin~ 1000;
#P newex 244 329 29 196617 sig~;
#P comment 101 112 100 196617 delay time;
#P toggle 280 114 22 0;
#P newex 280 144 64 196617 metro 5000;
#P hidden newex 101 78 60 196617 loadmess 3;
#P comment 160 342 48 196617 Hz;
#P flonum 100 129 46 9 0 0 0 3 0 0 0 255 227 23 222 222 222 0 0 0;
#P flonum 100 341 59 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 100 314 49 196617 !/ 1000.;
#P user gain~ 100 451 24 100 158 0 1.071519 7.94321 10.;
#P newex 100 362 40 196617 tri~;
#P user led 191 600 17 17 0 150;
#P newex 208 600 30 196617 dac~;
#P user gain~ 212 451 24 100 158 0 1.071519 7.94321 10.;
#P button 280 168 23 0;
#P newex 280 408 53 196617 *~ 0.999;
#P newex 280 206 37 196617 click~;
#P newex 280 367 44 196617 tapout~;
#P newex 280 328 65 196617 tapin~ 1000;
#P comment 146 131 100 196617 ms;
#P comment 48 432 100 196617 test tuning;
#P comment 469 276 143 196617 delay time minus 1 sample;
#P window setfont "Sans Serif" 14.;
#P window linecount 3;
#P comment 419 81 160 196622 make sure your sigvs is set small enough
(e.g. < = 128);
#P connect 20 0 19 0;
#P connect 19 0 8 0;
#P connect 24 0 29 0;
#P connect 24 0 25 0;
#P connect 16 0 14 0;
#P fasten 16 0 22 0 105 262 249 262;
#P fasten 16 0 27 0 105 241 422 241;
#P connect 6 0 4 0;
#P fasten 6 0 23 0 285 299 466 299;
#P connect 5 0 9 0;
#P connect 5 0 7 0;
#P hidden connect 18 0 16 0;
#P hidden connect 18 0 30 0;
#P hidden connect 30 0 6 0;
#P connect 8 0 6 0;
#P hidden connect 11 0 10 0;
#P connect 29 0 10 0;
#P connect 29 0 10 1;
#P connect 28 0 26 0;
#P connect 27 0 28 0;
#P fasten 25 0 23 0 466 437 535 437 535 317 466 317;
#P connect 23 0 24 0;
#P connect 26 0 24 0;
#P connect 22 0 5 0;
#P connect 4 0 5 0;
#P fasten 7 0 4 0 285 435 353 435 353 315 285 315;
#P connect 9 0 10 1;
#P connect 13 0 10 0;
#P connect 13 0 10 1;
#P connect 9 0 10 0;
#P connect 12 0 13 0;
#P connect 15 0 12 0;
#P connect 14 0 15 0;
#P window clipboard copycount 31;


April 20, 2008 | 12:13 pm

> finally, i got a delay external somewhere on my disk that uses
> allpass-interpolation (osx only).
> this is slightly more cpu intensive and not made for rapid delay time
> modulation, but gives you ‘endless’ ringing without
> any unwanted high frequency loss. kevin, get back to me, if you want
> to try it.
>
> volker.

Hello volker,
Id like to try out this external, sounds like it may have the tone Im looking for.

Thanks


April 20, 2008 | 12:49 pm

On 20 Apr 2008, at 14:13, Nicholas C. Raftis III wrote:
>
> Hello volker,
> Id like to try out this external, sounds like it may have the tone
> Im looking for.

>> for anyone interested in trying it, i’ve put a version + helpfile
>> here
>> http://www.esbasel.ch/Downloads/MaxMSP-Objects.htm

let me know if you experience any problems.
vb



kjg
April 20, 2008 | 2:30 pm


April 20, 2008 | 4:20 pm


April 21, 2008 | 1:29 am

cool yeah that comb is great, thank you very much, the feed back oscillator seems to crash and sounds incredibly strange.. im not sure whats going on with it but I don’t think it sounds the way its supposed to on my system.



kp*
April 21, 2008 | 2:19 am

On Apr 18, 2008, at 11:00 PM, Roth Michaels wrote:

> If you want to ring comb~, you need a very high feedback coefficient

which still isn’t enough (for my purposes, in this particular project)

Perhaps i was not clear.

A patch is worth a thousand words. Observe MSP’s somewhat wimpy comb~
even with the feedback cranked
and compare that with the ringfest that is on hand using rtcmix~ (i
could have done this with csound~ as well).

you will need rtcmix~

cheers,

kevin

#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P comment 339 53 100 196617 limited only by RAM;
#P user meter~ 555 457 943 522 50 0 168 0 0 0 0 255 153 0 255 0 0 217
217 0 153 186 0 12 3 3 3 3;
#P window linecount 2;
#P comment 618 166 181 196617 p8 = ring-down duration [optional \,
default is first reverb time value] ;;
#P window linecount 1;
#P comment 618 152 170 196617 p7 = pan (percent to left) [optional];
#P comment 618 137 133 196617 p6 = input channel [optional];
#P comment 618 122 100 196617 p5 = reverb time;
#P comment 618 93 126 196617 p3 = amplitude multiplier;
#P comment 618 77 100 196617 p2 = input duration;
#P comment 618 107 100 196617 p4 = frequency (cps);
#P comment 618 63 100 196617 p1 = input start time;
#P hidden newex 174 296 66 196617 loadmess 57;
#P number 148 367 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P number 110 366 35 9 0 0 4096 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P number 141 194 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P number 103 193 35 9 0 0 4096 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P hidden newex 113 94 66 196617 loadmess 55;
#P newex 197 391 75 196617 loadmess 0.99;
#P newex 75 366 27 196617 mtof;
#P newex 75 390 48 196617 !/ 1000.;
#P user kslider 75 325 35 1 36 48 19 7 0 128 128 128 128 128 128 255
255 255 0 0 0 0 0 0;
#P flonum 75 415 76 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 197 413 93 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 47 437 123 196617 comb~ 15 1 0.25 0. 0.99;
#P comment 296 413 53 196617 < feedback;
#P button 36 29 20 0;
#P newex 36 65 35 196617 click~;
#B color 5;
#P number 511 611 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P user gain~ 488 483 33 62 158 5 1.071519 7.94321 10.;
#P newex 186 219 75 196617 loadmess 0.99;
#P newex 64 194 27 196617 mtof;
#P newex 64 218 48 196617 !/ 1000.;
#P user kslider 64 153 35 1 36 48 19 7 0 128 128 128 128 128 128 255
255 255 0 0 0 0 0 0;
#P flonum 64 243 76 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 186 241 93 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 36 265 123 196617 comb~ 15 1 0.25 0. 0.99;
#P comment 285 241 53 196617 < feedback;
#P button 567 52 20 0;
#P newex 567 88 35 196617 click~;
#B color 5;
#P button 320 104 24 0;
#P user textedit 320 137 565 194 32896 3 9 rtinput("AUDIO") ;
load("COMBIT") COMBIT(0 , 0 , 1 , 0.08 , cpspch(7.09) , 25 , 0
, 0) COMBIT(0 , 0 , 1 , 0.08 , cpspch(7.07) , 25 , 0 , 1);
#N rtcmix~ 2 0;
#X restore 4 72 112
"load(xRTCMIX_DQxCOMBITxRTCMIX_DQx)xRTCMIX_CRxCOMBIT(0, 0, 3.5,
0.08, cpspch(7.09), .5, 0, 0)xRTCMIX_CRxCOMBIT(0.";
#X restore 4 40 112 "2, 0, 3.5, 0.08, cpspch(7.07), .5, 0, 1)";
#P newobj 373 280 55 196617 rtcmix~ 2;
#P number 469 611 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P hidden newex 360 494 72 196617 loadmess 127;
#P user gain~ 446 483 33 62 158 5 1.071519 7.94321 10.;
#P user meter~ 555 525 943 590 50 0 168 0 0 0 0 255 153 0 255 0 0 217
217 0 153 186 0 12 3 3 3 3;
#P hidden toggle 343 561 15 0;
#P hidden newex 343 539 35 196617 sel 32;
#B color 5;
#P hidden newex 343 519 40 196617 key;
#B color 5;
#P user ezdac~ 392 530 436 563 0;
#P comment 618 47 116 196617 p0 = output start time;
#P window linecount 2;
#P comment 120 56 126 196617 the most ringtime comb~ can do;
#P window linecount 1;
#P comment 308 39 100 196617 compare rtcmix~;
#P window linecount 2;
#P comment 339 66 100 196617 ring to your heart’s delight;
#P connect 28 0 27 0;
#P connect 27 0 18 0;
#P fasten 27 0 30 0 41 237 15 237 15 298 52 298;
#P hidden connect 37 0 21 0;
#P connect 21 0 23 0;
#P connect 23 0 22 0;
#P connect 22 0 20 0;
#P connect 20 0 18 1;
#P hidden connect 42 0 33 0;
#P connect 33 0 35 0;
#P connect 35 0 34 0;
#P connect 34 0 32 0;
#P connect 32 0 30 1;
#P fasten 21 0 38 0 69 190 108 190;
#P fasten 33 0 40 0 80 363 115 363;
#P fasten 38 0 39 0 108 213 181 213 181 190 146 190;
#P fasten 19 0 18 4 191 260 153 260;
#P fasten 40 0 41 0 115 386 188 386 188 363 153 363;
#P fasten 31 0 30 4 202 432 164 432;
#P connect 24 0 19 0;
#P connect 36 0 31 0;
#P connect 16 0 14 0;
#P connect 14 0 13 0;
#P hidden connect 5 0 6 0;
#P hidden connect 6 0 7 0;
#P connect 13 0 12 0;
#P fasten 15 0 12 0 572 202 378 202;
#P lcolor 6;
#P hidden connect 9 0 4 0;
#P lcolor 6;
#P hidden connect 7 0 4 0;
#P hidden connect 25 0 4 1;
#P lcolor 6;
#P fasten 18 0 9 0 41 316 451 316;
#P lcolor 6;
#P fasten 12 0 9 0 378 330 451 330;
#P lcolor 6;
#P hidden connect 10 0 9 0;
#P connect 9 1 11 0;
#P connect 9 1 25 0;
#P fasten 30 0 25 0 52 471 493 471;
#P lcolor 6;
#P fasten 12 1 25 0 400 330 493 330;
#P lcolor 6;
#P connect 25 1 26 0;
#P hidden connect 25 0 51 0;
#P hidden connect 9 0 8 0;
#P connect 16 0 15 0;
#P window clipboard copycount 53;


April 21, 2008 | 3:02 am

Quote: kevin parks wrote on Sun, 20 April 2008 22:19
—————————————————-
>
> On Apr 18, 2008, at 11:00 PM, Roth Michaels wrote:
>
> > If you want to ring comb~, you need a very high feedback coefficient
>
> which still isn’t enough (for my purposes, in this particular project)
>
I’m not sure how long of a ring you need or how high you cranked the feedback, but a feedback coefficient of 0.998 seems to give a similar ring time to your rtcmix~ example. I’m guessing that comb~, tapin~/tapout~, and Volker’s object should all be able to ring long enough if the feedback is set close enough to 1–the biggest difficulty is describing the delay time with the feedback factor. The problem with the formula I gave for that is that it only really gives an approximation of what would happen to the amplitude of a single sample entering the filter and this probably does not accurately describe the ringing effect.

While I am sure all of these delay concepts mentioned here can create long enough delay times for you, it may just be easier to use csound or rtcmix if you need to specify an exact ring time vs. a feedback coefficient. ^^



kp*
April 21, 2008 | 3:59 am

On Apr 20, 2008, at 11:02 PM, Roth Michaels wrote:

>>
> I’m not sure how long of a ring you need or how high you cranked the
> feedback,

.99

> but a feedback coefficient of 0.998 seems to give a similar ring
> time to your rtcmix~ example.

and yet i could make that even longer….. i just picked something
arbitrarily longish ring time on the rtcmix side.
and to my ears the cmix example rings much longer.

> While I am sure all of these delay concepts mentioned here can
> create long enough delay times for you, it may just be easier to use
> csound or rtcmix if you need to specify an exact ring time vs. a
> feedback coefficient. ^^

yeah, i still think the cmix one sounds better, and since i am a
musician and not a computer scientist i would much rather specify a
ring time than a feedback coefficient

I hate having my patches littered with third party objects. I been
bitten by that so many times in the past. You use a third party
external and it no longer is available for your machine ( so many of
my patches from my old set up used Trond Lossius’s wonderful
externals, now PPC only, sadly) or you go to a gig or demo w/o your
own laptop and your patches on a thumb drive and you have to spend all
that time installing stuff (and installing third party max objects is
really not my idea of fun unless they come with one folder to drop in
externals and one to drop in help) … hey for obscure stuff i don’t
expect much, for comb? I was hoping to get comb~ to work a little
better.

I’ll use rtcmix~ (thankfully Brad’s made it an easy install and i use
Cmix for other stuff outside of Max/MSP anyway)

so now i’ll spend an hour installing rtcmix~ on a dozen machines in
the lab.

rtcmix~ rocks


April 21, 2008 | 4:03 pm

On 21 Apr 2008, at 05:59, kevin parks wrote:

>> I’m not sure how long of a ring you need or how high you cranked
>> the feedback,
>
> .99
>
>> but a feedback coefficient of 0.998 seems to give a similar ring
>> time to your rtcmix~ example.
>
> and yet i could make that even longer….. i just picked something
> arbitrarily longish ring time on the rtcmix side.
> and to my ears the cmix example rings much longer.

go figure, 0.99 is not enough. so why not set it higher? there’s
still plenty of room until you hit 1 (= eternity).

from the way you set up comb~ in your example, you don’t seem to care
for correct pitch.
then i see no reason not to use comb~.

> i would much rather specify a ring time than a feedback coefficient.

#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P newex 371 46 66 196617 loadmess 30;
#P comment 382 140 100 196617 ringtime in sec.;
#P flonum 371 157 50 9 0 0 0 3 0 0 0 255 227 23 222 222 222 0 0 0;
#P newex 160 39 72 196617 loadmess 220;
#P newex 371 182 29 196617 t b f;
#P flonum 160 67 50 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 200 221 200 196617 expr pow(10\,(-60.*$f1)/(20000*$f2));
#P button 63 63 50 0;
#P newex 121 255 35 196617 click~;
#B color 5;
#P newex 160 93 48 196617 !/ 1000.;
#P flonum 160 157 76 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 200 264 69 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 121 298 169 196617 comb~ 150 1 0.8 0. 0.99;
#P comment 271 265 53 196617 < feedback;
#P user gain~ 121 332 33 62 158 5 1.071519 7.94321 10.;
#P user ezdac~ 111 436 155 469 0;
#P comment 173 142 100 196617 deltime in ms;
#P connect 6 0 4 1;
#P fasten 6 0 10 0 165 192 205 192;
#P connect 8 0 4 0;
#P fasten 5 0 4 4 205 288 282 288;
#P connect 4 0 2 0;
#P connect 2 0 1 0;
#P connect 2 0 1 1;
#P connect 16 0 14 0;
#P connect 14 0 12 0;
#P connect 13 0 11 0;
#P connect 12 1 10 1;
#P connect 10 0 5 0;
#P fasten 12 0 10 0 376 208 205 208;
#P connect 7 0 6 0;
#P connect 11 0 7 0;
#P connect 9 0 8 0;
#P window clipboard copycount 17;



kp*
April 22, 2008 | 7:20 am


April 22, 2008 | 10:52 pm

I think the only thing we were assuming is that it was going to be thought to convince you that comb~ can ring for a VERY VERY long time and while it has some limitations compared to other comb filter arrangements, ring time isn’t one of them. Half of why I post responses on here is to get other people to correct me, so don’t take it too personally if a response makes you feel dumb–I’m sure most of us are not trying to be jerks, just to the point. Responses to my responses often make me feel silly, so I just feel dumb for about a minute and then move on and keep responding because every time someone jumps in on my responses it will make me a better teacher down the road; either because I overlooked mentioning an important detail that should be included or correcting my self-taught understanding of things. It is great everyone on this forum is quick on amending the answers of others.

Anyway, some more comb filter info for you:

It is too bad that you can only drag the contents of a number box to two decimal places (maybe this will change in Max 5, but it too late to ask). When I was messing around with your example and found a feedback number that worked, I was just typing in values to the box. Volker’s [expr] object is the key for implementing feedback factor in terms of delay time using the formula I posted earlier (and btw, sorry for giving the equation solving for current amplitude not ring time. I was tired and lazy and didn’t feel like solving for c at the time). Another easy way to get better resolution for a number box is to take one number box and divide by 100. or something going into another number box like this:

#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P newex 73 79 40 196617 / 100.;
#P flonum 73 105 60 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 73 56 60 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P connect 2 0 1 0;
#P connect 0 0 2 0;
#P window clipboard copycount 3;

Yeah, it is a little weird to control, but lets you drag a number box and get better decimal precision but that’s a pretty lame solution if you ask me.

As far as the assumption you did not care about pitch, I think I can jump in and explain (Volker, please correct me if I am wrong). To be very accurate with specifying delay time you will need to use a signal, not a float. As far as the minus one sample goes, I am pretty sure this only applies if you are building your own filters using tapin~/tapout~.

Now, even though you can specify very long ring times with [comb~] there are other reasons to consider using [comb~] or other filter configurations. First of all there is frequency response, both Volker’s external, your cmix example, and using tapin~/tapout~ will all have a more even frequency response than comb~/teeth~. Personally, I like the tone of comb~ and use it for a lot of things because of the high frequency loss.

Something else I noticed about your cmix example was that the initial amplitude passed through the filter seemed lower than with comb~ and so when set to decay over the same amount of time the decay will be more gradual with combit/cmix than with comb~. Now I am not 100% sure that this is the case and won’t be until I mess around with it some more when I get some free time, but I think combit actually uses a variable feedback coefficient that starts farther away from 1.0, gets closer, and then falls again to create that more gradual fadeout to the ring. I will experiment more later this weekend or something to confirm/deny that theory. I tried looking at some cmix documentation to find out the algorithm behind combit and the description seemed more brief than other filter examples. Anyone know if there is a cmix list we could ask about this because I’d be curious what is going on behind the scenes with combit.

Yay for poorly crafted sentences!


April 22, 2008 | 11:42 pm

On Apr 22, 2008, at 6:52 PM, Roth Michaels wrote:

> Something else I noticed about your cmix example was that the
> initial amplitude passed through the filter seemed lower than with
> comb~ and so when set to decay over the same amount of time the
> decay will be more gradual with combit/cmix than with comb~. Now I
> am not 100% sure that this is the case and won’t be until I mess
> around with it some more when I get some free time, but I think
> combit actually uses a variable feedback coefficient that starts
> farther away from 1.0, gets closer, and then falls again to create
> that more gradual fadeout to the ring.

We don’t use a variable gain coefficient in COMBIT; what I suspect
you are hearing is a consequence of specifying the reverb time in
seconds instead of as a multiplier of the feedback coeff. Here’s the
code in the Ocomb ugen used by the instrument:

void Ocomb::setReverbTime(float reverbTime)
{
assert(reverbTime > 0.0);
_gain = pow(0.001, (_delsamps / _sr) / reverbTime);
}

float Ocomb::next(float input)
{
float tmp = input + (_gain * _delay->last());
_lastout = _delay->next(tmp);
return _lastout;
}

so the _gain factor is determined by the (user-input) reverbTime. We
also have the option to apply an amp envelope to the resulting
output, so you *could* get a simulation of a variable feedback gain.
(note: the COMBIT instrument uses an interpolating delay, so pitch
is accurate.)

> I tried looking at some cmix documentation to find out the
> algorithm behind combit and the description seemed more brief than
> other filter examples.

That’s my fault — COMBIT is one of the most ancient instruments in
the distro (and source is all there for perusing, of course). I
wrote the original in FORTRAN for the MIX language running on an IBM
3081 back in, like 1983 or something, I’m so old my memory don’t work
so good no more. As it mutated into C and then C++ the docs stayed
rather terse.

> Anyone know if there is a cmix list we could ask about this because
> I’d be curious what is going on behind the scenes with combit.

Certainly! Go here:

http://music.columbia.edu/mailman/listinfo/rtcmix-discuss

or go to http://rtcmix.org/ and look at the ‘links’ (the mailing list
is linked there). We are a happy group.

> Yay for poorly crafted sentences!

Always and forever…

brad

http://music.columbia.edu/~brad


April 23, 2008 | 12:25 am

Thanks Brad, exactly what I was looking for. This weekend when I’m done with my new piece I’ll mess around with combit and meditate on this issue some.


April 23, 2008 | 12:28 am

P.S. thanks for the links too. While I used to do some Csound work a few years ago, the CMix/RTCMix Music-N (this is from music N right?) world is new to me as of 2008 and I’ve been too busy with other projects to do any proper research into it.


April 23, 2008 | 4:19 pm

On Apr 22, 2008, at 8:28 PM, Roth Michaels wrote:

> the CMix/RTCMix Music-N (this is from music N right?)

They all are… :-)

brad

http://music.columbia.edu/~brad



May 18, 2008 | 3:34 am

You wrote:
"It is too bad that you can only drag the contents of a number box to two decimal places (maybe this will change in Max 5, but it too late to ask)."

FWIW, you CAN already drag any decimal place in the float number box in Max 5 (without even asking).

–C


Viewing 27 posts - 1 through 27 (of 27 total)