Forums > MaxMSP

analogue vs digital / Real Modular

March 12, 2007 | 11:30 am

Lately Ive been studying up on analogue synths and im trying to understand what it is that makes them sound better then most of my digital ones. Ive been impressed by two virtual analogue products, the MS20 KORG legacy, and the Arturia ARP modular. Im trying to bring this "analogue" sound quality into max and finding it rather difficult. Does anyone have any ideas on how to make MSP, the most digital of digital, sound more like analogue? Ive experimented a bit with subtle tuning instability and boosting the lows but thats not nearly enough.

Ive been looking at a bunch of modular systems, like the doepfer and modcan, and of course buchla, and I notice a difference in the general sound quality of anything over a plain oscillator. I feel like since in the end my music will end up being a series of 1s and 0s anyway, that I should be able to create that sound quality in Max/msp.

I would love to hear of anyones success in this area, or thoughts as to how to generally get a better tone quality. Warmpth?


March 12, 2007 | 6:59 pm

Im reading up a bit more about analogue oscillators. I think maybe the lookup table of the cycle is having a negative effect on the sound quality, especially when doing FM. Im curious if theres a way to get FM without aliasing?


March 12, 2007 | 10:16 pm

You could always do it higher res. Try phasor~ and then using a high
quality wave~ with a cycle~ segment stored in it.

Generally speaking, though the aliasing is not necessarily a bad thing.
(particularly around the zero frequency axis…)

Peter McCulloch

On Mar 12, 2007, at 2:59 PM, Nicholas C. Raftis III wrote:

>
> Im reading up a bit more about analogue oscillators. I think maybe
> the lookup table of the cycle is having a negative effect on the sound
> quality, especially when doing FM. Im curious if theres a way to get
> FM without aliasing?
> –
> -=ili!ili=- http://www.Axiom-Crux.net -=ili!ili=-
>
>
http://www.petermcculloch.com


March 12, 2007 | 11:30 pm

My general recommendation is to reconsider everything that is stable in
your system and make it all slightly unstable. As analog systems are
slightly unstable, this will give a lot of warmth to your sound.

For instance, portamento times should not be fixed, but should vary for
each note. Presumably, it would take more time for the synth to glide
when the notes are further apart, and the function object could help
you create a lookup table for this.

Often, you’ll need multiple LFOs for a parameter. For instance, with
pitch, I use a slow rand~ for slow drift, and a faster rand~ for
immediate fluctuations in addition to a cycle~ for a period pitch
fluctuation.

Chebychev polynomials can give you a lot of mileage especially if you
use adsr~ on the input to the waveshaping function. That way you get
the timbral change with the envelope. (sounds way better than applying
just the gain envelope after the lookup~)

Also, a little judicious distorted lowpassing (using slide~ or
rampsmooth~ with short up times and long down times e.g. slide~ 1 130)
can give you a warmer sound. (basically it sawtooths your
sinewaves…) Try subtracting the lowpassed sound from the original.
That difference will be quite edgy… Allpass filters can introduce
frequency dependent phase differences as well.

Filtering is also really important. Try using cascade~ to do multiple
copies of one filter, so that you get steeper rolloffs without steeper
Q. Try using a separate adsr~ to handle the filter sweep. Also, try
various math functions on the output of adsr~. Linear envelopes don’t
always sound so hot…

Finally, a few carefully applied stereo ping-pong delays can thicken up
the sound. Use relatively prime relationships for the delay times You
don’t need much feedback at all.

Peter McCulloch

On Mar 12, 2007, at 7:30 AM, Nicholas C. Raftis III wrote:

>
> Lately Ive been studying up on analogue synths and im trying to
> understand what it is that makes them sound better then most of my
> digital ones. Ive been impressed by two virtual analogue products,
> the MS20 KORG legacy, and the Arturia ARP modular. Im trying to bring
> this "analogue" sound quality into max and finding it rather
> difficult. Does anyone have any ideas on how to make MSP, the most
> digital of digital, sound more like analogue? Ive experimented a bit
> with subtle tuning instability and boosting the lows but thats not
> nearly enough.
>
> Ive been looking at a bunch of modular systems, like the doepfer and
> modcan, and of course buchla, and I notice a difference in the general
> sound quality of anything over a plain oscillator. I feel like since
> in the end my music will end up being a series of 1s and 0s anyway,
> that I should be able to create that sound quality in Max/msp.
>
> I would love to hear of anyones success in this area, or thoughts as
> to how to generally get a better tone quality. Warmpth?
>
>
> –
> -=ili!ili=- http://www.Axiom-Crux.net -=ili!ili=-
>
>
http://www.petermcculloch.com



March 15, 2007 | 7:32 pm

Thanks, theres lots of great info here, sorry for my slow reply, been working alot lately.

Im going to try out some of those techniques tonight. Im curious what you use for chebyshev? I have a nice TL object I think that does a good job, Is there a better one for using with envelopes?

Whats a good way of generating a higher resolution sine wave?

And finally, Anyone know how to maybe make a model of the fameous MS20 hp/lp filter with its beautifuly insane peak harshness?

Thanks so much!


March 15, 2007 | 8:00 pm

Hi,
Interesting thread. I too am a huge fan of the korg legacy stuff and I’ve had a mono/poly for decades. I couldn’t resist the MS-20 VI. I know this isn’t particularly helpful but I though I’d mention that I read somewhere that Korg programmed circuit models of the actual devices rather then tweaking DSP code. Apparently in the VIs is every component in the actual schematics- it really sounds amazing!


March 16, 2007 | 6:22 pm

> Im going to try out some of those techniques tonight. Im curious what
> you use for chebyshev? I have a nice TL object I think that does a
> good job, Is there a better one for using with envelopes?
>

I use lookup~. I’ve made an abstraction that generates chebychev
polynomials. It’s similar to the one in the example files except that
it uses the cos and acos formula rather than the polynomial expansion.
This allows for the arbitrary calculation of any set of partials.
Attached at bottom.

> Whats a good way of generating a higher resolution sine wave?

Check out Joshua Kit Clayton’s hr (hi-res) objects. There’s one for
phasor~ and one for wave~. Use hr.poke~ to store your hi-res sine or
cos wave.
>
> And finally, Anyone know how to maybe make a model of the fameous MS20
> hp/lp filter with its beautifuly insane peak harshness?
>

I don’t know this one, but I saw an article in the Csound book on
modelling a TB303 filter that had some interesting tips. IIRC, it
recommended running a bandpass and lowpass filter with the same cutoff
and Q. Subtract the bandpass from the lowpass and this is the dry
sound, then run the bandpass through a waveshaping function for
distortion, and add it back to dry sound. (so only the passband
portion is waveshaped) I haven’t done this one yet in Max, but it
seems like it would be easy enough to.

Peter McCulloch

http://www.petermcculloch.com

PM.Cheby:

max v2;
#N vpatcher 10 59 707 482;
#P window setfont "Sans Serif" 12.;
#P window linecount 1;
#P comment 311 314 135 196620 Multiples for partials;
#P newex 76 288 49 196620 t l l;
#B color 7;
#N comlet List output;
#P outlet 76 364 15 0;
#N comlet Messages to poke~;
#P inlet 292 314 15 0;
#P newex 76 254 55 196620 pack i f;
#B color 7;
#P window setfont "Arial Black" 18.;
#P comment 476 8 107 791478290 PM.Cheby;
#P user panel 468 5 193 34;
#X brgb 142 154 188;
#X frgb 0 0 0;
#X border 0;
#X rounded 15;
#X shadow 0;
#X done;
#P window setfont "Sans Serif" 12.;
#P window linecount 2;
#P comment 510 140 142 196620 Channel of buffer to write to (default 1);
#P window linecount 3;
#P comment 510 79 142 196620 Size of wavetable(default 8192);
#P window linecount 1;
#P comment 510 53 103 196620 Name of buffer;
#P comment 475 140 25 196620 $3;
#P comment 475 79 25 196620 $2;
#P comment 475 53 25 196620 $1;
#P user panel 468 45 193 288;
#X brgb 180 200 228;
#X frgb 0 0 0;
#X border 0;
#X rounded 15;
#X shadow 0;
#X done;
#P comment 474 348 176 196620 peter.mcculloch@gmail.com;
#P user panel 468 339 193 34;
#X brgb 142 154 188;
#X frgb 0 0 0;
#X border 0;
#X rounded 15;
#X shadow 0;
#X done;
#N vpatcher 10 59 610 459;
#P window setfont "Sans Serif" 9.;
#P newex 107 98 21 196617 t 2;
#P newex 79 99 21 196617 t 1;
#P newex 88 161 21 196617 t 1;
#P window setfont "Sans Serif" 18.;
#P comment 160 67 148 196626 PM.SafeLoad;
#N comlet Safely loaded argument;
#P outlet 49 195 15 0;
#P window setfont "Sans Serif" 9.;
#P newex 24 132 35 196617 gate 2;
#P newex 79 76 32 196617 sel 0;
#P newex 49 46 67 196617 loadmess $3;
#P connect 6 0 2 0;
#P connect 7 0 2 0;
#P connect 0 0 2 1;
#P connect 5 0 3 0;
#P connect 2 1 3 0;
#P connect 0 0 1 0;
#P connect 1 0 6 0;
#P connect 2 0 5 0;
#P connect 1 1 7 0;
#P pop;
#P newobj 171 286 108 196620 p SafeLoad;
#P newex 224 35 96 196620 t i i i;
#P newex 22 82 62 196620 int 8192;
#B color 7;
#P newex 76 145 43 196620 defer;
#B color 7;
#P comment 48 13 112 196620 Gain coefficients;
#N comlet Integer Multiples for Partials (e.g. 1 2 3 , or 1 3 5);
#P inlet 226 191 15 0;
#N comlet Gain coefficients (linear);
#P inlet 22 15 15 0;
#N vpatcher 10 59 610 459;
#P window setfont "Sans Serif" 9.;
#P newex 107 98 21 196617 t 2;
#P newex 79 99 21 196617 t 1;
#P newex 88 161 41 196617 t 8192;
#P window setfont "Sans Serif" 18.;
#P comment 160 67 148 196626 PM.SafeLoad;
#N comlet Safely loaded argument;
#P outlet 49 195 15 0;
#P window setfont "Sans Serif" 9.;
#P newex 24 132 35 196617 gate 2;
#P newex 79 76 32 196617 sel 0;
#P newex 49 46 67 196617 loadmess $2;
#P connect 7 0 2 0;
#P connect 6 0 2 0;
#P connect 0 0 2 1;
#P connect 5 0 3 0;
#P connect 2 1 3 0;
#P connect 0 0 1 0;
#P connect 1 0 6 0;
#P connect 2 0 5 0;
#P connect 1 1 7 0;
#P pop;
#P newobj 224 7 77 196620 p SafeLoad;
#N vpatcher 50 40 1187 751;
#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P newex 255 296 79 196617 vexpr abs($f1);
#P newex 108 398 32 196617 print;
#P newex 281 175 34 196617 zl len;
#P newex 321 241 42 196617 zl slice;
#P newex 321 209 36 196617 zl reg;
#N comlet Partials;
#P inlet 420 141 15 0;
#P newex 345 138 27 196617 – 1;
#N comlet (list) amplitudes of first eight harmonics;
#P inlet 345 40 15 0;
#P newex 66 205 104 196617 zmap 0. 8191. -1. 1.;
#P newex 163 358 27 196617 / 1.;
#N comlet (float) scaled output of transfer function;
#P outlet 163 400 15 0;
#P newex 242 142 51 196617 t l l b l;
#P newex 255 322 69 196617 mxj list.sum;
#P window linecount 2;
#P newex 347 169 223 196617 loadmess 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.;
#P window linecount 1;
#P newex 500 221 114 196617 loadmess scalarmode 1;
#P newex 163 273 169 196617 vexpr $f2*(cos($f3*(acos($f1))));
#P newex 163 322 69 196617 mxj list.sum;
#N comlet (list) amplitudes of first eight harmonics;
#P inlet 242 39 15 0;
#N comlet (float) values to put through transfer function;
#P inlet 66 116 15 0;
#P window setfont "Sans Serif" 12.;
#P window linecount 0;
#P comment 267 41 58 196620 Weights;
#P connect 1 0 11 0;
#P connect 10 0 18 0;
#P connect 13 0 11 2;
#P fasten 5 0 4 0 505 266 168 266;
#P connect 11 0 4 0;
#P connect 4 0 3 0;
#P connect 3 0 10 0;
#P connect 10 0 9 0;
#P connect 7 0 10 1;
#P connect 2 0 8 0;
#P connect 8 0 4 1;
#P connect 8 1 19 0;
#P connect 19 0 7 0;
#P connect 8 3 17 0;
#P connect 8 2 15 0;
#P connect 15 0 16 0;
#P connect 16 0 4 2;
#P connect 12 0 13 0;
#P connect 6 0 15 1;
#P connect 14 0 15 1;
#P fasten 17 0 16 1 286 234 358 234;
#P pop;
#P newobj 121 221 117 196620 p Cheby;
#B color 7;
#P newex 22 48 144 196620 t b l;
#B color 7;
#P newex 115 364 67 196620 peek~ $1;
#B color 7;
#P newex 76 190 27 196620 – 1;
#B color 7;
#P newex 22 114 64 196620 Uzi 8192;
#B color 7;
#P window linecount 3;
#P comment 251 189 135 196620 Integer multiples for partials. (e.g. 1 2
3 , or 2 4 6 7);
#P connect 7 0 4 0;
#P connect 4 0 11 0;
#P connect 11 0 1 0;
#P fasten 12 0 11 1 229 74 79 74;
#P fasten 12 1 1 1 272 106 81 106;
#P connect 1 2 10 0;
#P connect 10 0 2 0;
#P connect 2 0 25 0;
#P connect 25 0 28 0;
#P connect 28 0 27 0;
#P connect 28 1 3 0;
#P fasten 26 0 3 0 297 355 120 355;
#P fasten 2 0 5 0 81 216 126 216;
#P connect 5 0 25 1;
#P connect 4 1 5 1;
#P connect 13 0 3 2;
#P lcolor 7;
#P fasten 12 2 5 2 315 137 196 137;
#P connect 6 0 12 0;
#P connect 8 0 5 3;
#P pop;


March 17, 2007 | 9:24 pm

what about sinx~

I just found this.. seems like its not limited resolution, just a streight calculation of sin on the input phasor? Maybe better then cycle?

Thanks again for all the help, I think my new synths are going to turn out great now :D


March 17, 2007 | 10:06 pm

Heres my experiment with the simple sine osc, trying to find the best clean Frequency modulation sound. I cant even get the two wave~ based ones to work right (I must be thinking the wrong way). and so far as I notice the sinx~ sounds more interesting but not necessarily like a sine wave frequency modulation.


March 18, 2007 | 3:35 am

Beyond the obvious question about good antialiasing oscillator algorithms, I expect that you’ll eventually notice that what you probably think makes analog sound "better" or whatever will, in no small measure, be due to the design of the filters, not the oscillators. There are several interesting articles and papers out there on modelling some of the "great" filters [the Moog lowpass comes to mind here] that I’m sure you can find with a little effort.


March 18, 2007 | 7:35 am

yeah that would be great too :D

I guess Im starting from the oscillators, I noticed that the new built in rect~ saw~ and tri~ are all pretty good, now Im just finding the best sine for fm so I dont get aliasing. Then Ill move to filtes, and model as many as I can, and then Ill play with the unpredictability some more, the lfo smooth random fluctuations in everything.

Im really curuious if this "component modelling" is possible in max. Maybe I should do a thread on that. That could be amazing, have things like cp.resistor~ or cp.20491chip~ or whatnot. And max is already structured like that.

That could give way to a whole new use for max, could be huge.


March 18, 2007 | 5:25 pm

A more defined patch showing my attempts so far. Any insight onto the best source for alias free FM would be highly appreciated.

Also If Joshua feels like stepping in, I cant seem to get anything modulated to come out of the hr objects, see the downloadable file.

I still am really curious about the virtual modeled electronics components idea (ala ms20 legacy). Any thoughts on implementing that into max?

Thanks again all!


March 19, 2007 | 2:27 pm

> Im really curuious if this "component modelling" is possible in max.

Notice that the people doing the component modelling for the legacy stuff are the same people who made the original hardware unit, and thus the most likely persons to know preciesly what the specific nonlinearities associated with a general component would be. If no one seems excited about it, I wouldn’t be surprised to learn that they realize what a labor-intensive task it would be, and uncertain of what it’d amount to, in the end[since I suspect that such a project would probably begin by focusing on a few specific and crucial components in the chain, and you'd want to know which ones, etc.]. I’m sure that everyone would be happy to play with whatever you chose to share with them, of course. :-)


March 19, 2007 | 2:51 pm

>Any insight onto the best source for alias free FM would be highly appreciated.

The world is full of people who *prefer* aliasing oscillators when doing FM – better crunchiness up top where it counts. The judicious use of waveshaping at various points in the signal processing chain is a similar "secret sauce" undertaking.

And if you’re working with sine waves, then I’m not entirely sure that aliasing is that huge a problem….

max v2;
#N vpatcher 39 101 735 654;
#P origin 0 -7;
#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P comment 385 422 179 196617 Don’t see much here , though.;
#P user ezdac~ 22 453 66 486 0;
#P hidden newex 226 158 48 196617 loadbang;
#P user spectroscope~ 385 255 248 155 20 0 1 0 0 1 0 0 0 0 0 0;
#X frgb 224 224 224;
#X brgb 255 255 255;
#X rgb2 0 0 0;
#X rgb3 243 204 204;
#X rgb4 255 0 0;
#X rgb5 184 184 184;
#X rgb6 0 0 0;
#X rgb7 0 0 0;
#X rgb8 255 255 255;
#X rgb9 255 0 0;
#X rgb10 255 191 0;
#X rgb11 0 191 127;
#X rgb12 127 0 127;
#X rgb13 0 0 0;
#X range 0. 1.2;
#X domain 0. 22050.;
#X done;
#P newex 22 158 38 196617 -~ 0.5;
#P newex 22 139 65 196617 phasor~ 200;
#P hidden message 240 209 39 196617 sono 1;
#P user spectroscope~ 22 255 248 155 20 0 1 0 0 1 0 0 0 0 0 0;
#X frgb 224 224 224;
#X brgb 255 255 255;
#X rgb2 0 0 0;
#X rgb3 243 204 204;
#X rgb4 255 0 0;
#X rgb5 184 184 184;
#X rgb6 0 0 0;
#X rgb7 0 0 0;
#X rgb8 255 255 255;
#X rgb9 255 0 0;
#X rgb10 255 191 0;
#X rgb11 0 191 127;
#X rgb12 127 0 127;
#X rgb13 0 0 0;
#X range 0. 1.2;
#X domain 0. 22050.;
#X done;
#P message 47 63 31 196617 down;
#P message 22 63 18 196617 up;
#N vpatcher 216 180 489 376;
#P window setfont "Sans Serif" 9.;
#P newex 26 111 65 196617 pow~ 22000;
#P message 158 68 27 196617 stop;
#P newex 26 46 209 196617 select up down stop;
#P inlet 26 26 15 0;
#P message 92 68 62 196617 0.53 10000;
#P message 26 68 50 196617 1. 10000;
#P newex 26 90 55 196617 line~ 0.53;
#P outlet 26 133 15 0;
#P connect 4 0 5 0;
#P connect 5 0 2 0;
#P fasten 6 0 1 0 163 86 31 86;
#P fasten 3 0 1 0 97 86 31 86;
#P connect 2 0 1 0;
#P connect 1 0 7 0;
#P connect 7 0 0 0;
#P connect 5 1 3 0;
#P connect 5 2 6 0;
#P pop 1;
#P newobj 22 86 56 196617 p sweeper;
#P newex 385 139 40 196617 cycle~;
#B color 5;
#P comment 22 423 179 196617 Here’s what aliasing looks like…..;
#P fasten 3 0 2 0 27 77 27 77;
#P fasten 4 0 2 0 52 82 27 82;
#P connect 2 0 7 0;
#P connect 7 0 8 0;
#P hidden connect 6 0 5 0;
#P connect 8 0 5 0;
#P hidden connect 10 0 6 0;
#P connect 2 0 1 0;
#P connect 1 0 9 0;
#P hidden connect 6 0 9 0;
#P pop;


March 19, 2007 | 3:18 pm

the sound of digital FM (what most of us think of when we think of FM)
almost depends on aliasing and having sidebands fold back into the
specturm at the extremes, especialy on the lower end.

i’m assuming you don’t want aliasing in this instance since you’re
trying to emulate analog FM, right (since you’ve been talking about
analog)? in which case,the main problem doesn’t have anything to do
with your oscillators but rather the extreme sidebands you achieve
with FM and your sampling rate. Since right when you start generating
a modest amount of sidebands, you’re probably going to be aliasing, at
least in the lower frequencies (all depending on you carrier
frequency, etc.).

now, if you really want to FM without aliasing at all (like analog
FM), it seems to me that you would have to upsample (how much depends
on your modulation index, etc.) in a poly~, frequency shift up,
perform your FM, filter the signal (both highs and lows) to get rid of
the frequencies that will alias, frequency shift back down, and then
downsample. i may be wrong, but i think this all right…

is this what you want?

mark

On 3/19/07, Gregory Taylor wrote:
>
> >Any insight onto the best source for alias free FM would be highly appreciated.
>
> The world is full of people who *prefer* aliasing oscillators when doing FM – better crunchiness up top where it counts. The judicious use of waveshaping at various points in the signal processing chain is a similar "secret sauce" undertaking.
>
> And if you’re working with sine waves, then I’m not entirely sure that aliasing is that huge a problem….
>
> max v2;
> #N vpatcher 39 101 735 654;
> #P origin 0 -7;
> #P window setfont "Sans Serif" 9.;
> #P window linecount 1;
> #P comment 385 422 179 196617 Don’t see much here , though.;
> #P user ezdac~ 22 453 66 486 0;
> #P hidden newex 226 158 48 196617 loadbang;
> #P user spectroscope~ 385 255 248 155 20 0 1 0 0 1 0 0 0 0 0 0;
> #X frgb 224 224 224;
> #X brgb 255 255 255;
> #X rgb2 0 0 0;
> #X rgb3 243 204 204;
> #X rgb4 255 0 0;
> #X rgb5 184 184 184;
> #X rgb6 0 0 0;
> #X rgb7 0 0 0;
> #X rgb8 255 255 255;
> #X rgb9 255 0 0;
> #X rgb10 255 191 0;
> #X rgb11 0 191 127;
> #X rgb12 127 0 127;
> #X rgb13 0 0 0;
> #X range 0. 1.2;
> #X domain 0. 22050.;
> #X done;
> #P newex 22 158 38 196617 -~ 0.5;
> #P newex 22 139 65 196617 phasor~ 200;
> #P hidden message 240 209 39 196617 sono 1;
> #P user spectroscope~ 22 255 248 155 20 0 1 0 0 1 0 0 0 0 0 0;
> #X frgb 224 224 224;
> #X brgb 255 255 255;
> #X rgb2 0 0 0;
> #X rgb3 243 204 204;
> #X rgb4 255 0 0;
> #X rgb5 184 184 184;
> #X rgb6 0 0 0;
> #X rgb7 0 0 0;
> #X rgb8 255 255 255;
> #X rgb9 255 0 0;
> #X rgb10 255 191 0;
> #X rgb11 0 191 127;
> #X rgb12 127 0 127;
> #X rgb13 0 0 0;
> #X range 0. 1.2;
> #X domain 0. 22050.;
> #X done;
> #P message 47 63 31 196617 down;
> #P message 22 63 18 196617 up;
> #N vpatcher 216 180 489 376;
> #P window setfont "Sans Serif" 9.;
> #P newex 26 111 65 196617 pow~ 22000;
> #P message 158 68 27 196617 stop;
> #P newex 26 46 209 196617 select up down stop;
> #P inlet 26 26 15 0;
> #P message 92 68 62 196617 0.53 10000;
> #P message 26 68 50 196617 1. 10000;
> #P newex 26 90 55 196617 line~ 0.53;
> #P outlet 26 133 15 0;
> #P connect 4 0 5 0;
> #P connect 5 0 2 0;
> #P fasten 6 0 1 0 163 86 31 86;
> #P fasten 3 0 1 0 97 86 31 86;
> #P connect 2 0 1 0;
> #P connect 1 0 7 0;
> #P connect 7 0 0 0;
> #P connect 5 1 3 0;
> #P connect 5 2 6 0;
> #P pop 1;
> #P newobj 22 86 56 196617 p sweeper;
> #P newex 385 139 40 196617 cycle~;
> #B color 5;
> #P comment 22 423 179 196617 Here’s what aliasing looks like…..;
> #P fasten 3 0 2 0 27 77 27 77;
> #P fasten 4 0 2 0 52 82 27 82;
> #P connect 2 0 7 0;
> #P connect 7 0 8 0;
> #P hidden connect 6 0 5 0;
> #P connect 8 0 5 0;
> #P hidden connect 10 0 6 0;
> #P connect 2 0 1 0;
> #P connect 1 0 9 0;
> #P hidden connect 6 0 9 0;
> #P pop;
>
>
> –
> knowledge is not enough/science is not enough/Love is dreaming this equation
>


March 19, 2007 | 3:29 pm

actually, wait, nevermind… an analog signal would have those
negative frequency components too, wouldn’t it? or wouldn’t it?
argh… i need some more coffee.

On 3/19/07, Mark Cartwright wrote:
> the sound of digital FM (what most of us think of when we think of FM)
> almost depends on aliasing and having sidebands fold back into the
> specturm at the extremes, especialy on the lower end.
>
> i’m assuming you don’t want aliasing in this instance since you’re
> trying to emulate analog FM, right (since you’ve been talking about
> analog)? in which case,the main problem doesn’t have anything to do
> with your oscillators but rather the extreme sidebands you achieve
> with FM and your sampling rate. Since right when you start generating
> a modest amount of sidebands, you’re probably going to be aliasing, at
> least in the lower frequencies (all depending on you carrier
> frequency, etc.).
>
> now, if you really want to FM without aliasing at all (like analog
> FM), it seems to me that you would have to upsample (how much depends
> on your modulation index, etc.) in a poly~, frequency shift up,
> perform your FM, filter the signal (both highs and lows) to get rid of
> the frequencies that will alias, frequency shift back down, and then
> downsample. i may be wrong, but i think this all right…
>
> is this what you want?
>
> mark
>
>
>
> On 3/19/07, Gregory Taylor wrote:
> >
> > >Any insight onto the best source for alias free FM would be highly appreciated.
> >
> > The world is full of people who *prefer* aliasing oscillators when doing FM – better crunchiness up top where it counts. The judicious use of waveshaping at various points in the signal processing chain is a similar "secret sauce" undertaking.
> >
> > And if you’re working with sine waves, then I’m not entirely sure that aliasing is that huge a problem….
> >
> > max v2;
> > #N vpatcher 39 101 735 654;
> > #P origin 0 -7;
> > #P window setfont "Sans Serif" 9.;
> > #P window linecount 1;
> > #P comment 385 422 179 196617 Don’t see much here , though.;
> > #P user ezdac~ 22 453 66 486 0;
> > #P hidden newex 226 158 48 196617 loadbang;
> > #P user spectroscope~ 385 255 248 155 20 0 1 0 0 1 0 0 0 0 0 0;
> > #X frgb 224 224 224;
> > #X brgb 255 255 255;
> > #X rgb2 0 0 0;
> > #X rgb3 243 204 204;
> > #X rgb4 255 0 0;
> > #X rgb5 184 184 184;
> > #X rgb6 0 0 0;
> > #X rgb7 0 0 0;
> > #X rgb8 255 255 255;
> > #X rgb9 255 0 0;
> > #X rgb10 255 191 0;
> > #X rgb11 0 191 127;
> > #X rgb12 127 0 127;
> > #X rgb13 0 0 0;
> > #X range 0. 1.2;
> > #X domain 0. 22050.;
> > #X done;
> > #P newex 22 158 38 196617 -~ 0.5;
> > #P newex 22 139 65 196617 phasor~ 200;
> > #P hidden message 240 209 39 196617 sono 1;
> > #P user spectroscope~ 22 255 248 155 20 0 1 0 0 1 0 0 0 0 0 0;
> > #X frgb 224 224 224;
> > #X brgb 255 255 255;
> > #X rgb2 0 0 0;
> > #X rgb3 243 204 204;
> > #X rgb4 255 0 0;
> > #X rgb5 184 184 184;
> > #X rgb6 0 0 0;
> > #X rgb7 0 0 0;
> > #X rgb8 255 255 255;
> > #X rgb9 255 0 0;
> > #X rgb10 255 191 0;
> > #X rgb11 0 191 127;
> > #X rgb12 127 0 127;
> > #X rgb13 0 0 0;
> > #X range 0. 1.2;
> > #X domain 0. 22050.;
> > #X done;
> > #P message 47 63 31 196617 down;
> > #P message 22 63 18 196617 up;
> > #N vpatcher 216 180 489 376;
> > #P window setfont "Sans Serif" 9.;
> > #P newex 26 111 65 196617 pow~ 22000;
> > #P message 158 68 27 196617 stop;
> > #P newex 26 46 209 196617 select up down stop;
> > #P inlet 26 26 15 0;
> > #P message 92 68 62 196617 0.53 10000;
> > #P message 26 68 50 196617 1. 10000;
> > #P newex 26 90 55 196617 line~ 0.53;
> > #P outlet 26 133 15 0;
> > #P connect 4 0 5 0;
> > #P connect 5 0 2 0;
> > #P fasten 6 0 1 0 163 86 31 86;
> > #P fasten 3 0 1 0 97 86 31 86;
> > #P connect 2 0 1 0;
> > #P connect 1 0 7 0;
> > #P connect 7 0 0 0;
> > #P connect 5 1 3 0;
> > #P connect 5 2 6 0;
> > #P pop 1;
> > #P newobj 22 86 56 196617 p sweeper;
> > #P newex 385 139 40 196617 cycle~;
> > #B color 5;
> > #P comment 22 423 179 196617 Here’s what aliasing looks like…..;
> > #P fasten 3 0 2 0 27 77 27 77;
> > #P fasten 4 0 2 0 52 82 27 82;
> > #P connect 2 0 7 0;
> > #P connect 7 0 8 0;
> > #P hidden connect 6 0 5 0;
> > #P connect 8 0 5 0;
> > #P hidden connect 10 0 6 0;
> > #P connect 2 0 1 0;
> > #P connect 1 0 9 0;
> > #P hidden connect 6 0 9 0;
> > #P pop;
> >
> >
> > –
> > knowledge is not enough/science is not enough/Love is dreaming this equation
> >
>


March 20, 2007 | 2:44 am

Both analog & digital FM implementations create sidebands above &
below the carrier and/or modulator frequencies. The only way to make
sure the carrier is the lowest spectral component (fundamental) is to
make sure the modulator frequency is greater than or equal to twice
the carrier frequency, with the exception being a C:M of 1:1.

A good tutorial by Barry Truax, available online, that can help
organize C:M ratios for intended spectral properties is at:
< http://www.sfu.ca/sca/Manuals/fm/FM_Tutorial.html>

You might also check out his article "Organizational Techniques for
C:M Ratios in Frequency Modulation" (originally in CMJ 1/4 (1978),
reprinted in ‘Foundations of Computer Music’ by Roads)

On Mar 19, 2007, at 9:29 AM, Mark Cartwright wrote:

> actually, wait, nevermind… an analog signal would have those
> negative frequency components too, wouldn’t it? or wouldn’t it?
> argh… i need some more coffee.
>

—-
Steven M. Miller

Home < http://pubweb.csf.edu/~smill>
SFIFEM <
http://sfifem.csf.edu>
Atrium Sound Space <
http://atrium.csf.edu>
OVOS <
http://pubweb.csf.edu/~smill/ovos.html>


March 20, 2007 | 3:39 am

Quote: Axiom-Crux wrote on Mon, 12 March 2007 18:59
—————————————————-
> Im reading up a bit more about analogue oscillators. I think maybe the lookup table of the cycle is having a negative effect on the sound quality, especially when doing FM. Im curious if theres a way to get FM without aliasing?
—————————————————-

The way to avoid aliasing in every case is to avoid generating frequencies higher than SR/2, where SR is your sampling rate. In FM (unlike AM) you can generate an arbitrary number of sidebands. The higher the index of modulation, the more sidebands, and the more likely you are to be aliasing. If you want to tame your synthesis, you could put a spectral scope on the output and watch for when your sidebands march past the boundaries of 0 and SR/2 and then limit the index of modulation to those points.

Or you could learn to stop worrying and love the aliasing :-)

Eric


March 20, 2007 | 3:09 pm

Its not that I don’t like the aliasing, I am just tired of it, and looking for new textures. I was going to buy a whole modular eurorack setup, which I still may, but I feel like I should be able to do these things in max and be able to take my laptop on the road with me and do them anywhere rather then have a wall of modules and unsaveable patches that costs a rediculous ammount just to get good clean analogue style synthesis.

I also don’t think that modelling a resistor or other electronic components would be that hard. Or maybe I just am driven and dont typically think of things as beign difficut, as Im used to spending months and years on projects. At the same time I dont’ know C++ or the msp SDK enough to do so. I was just saying I think it would be a great idea and could lead to a whole new use for max (electronics prodotyping).


March 20, 2007 | 3:23 pm

> Or maybe I just am driven and dont typically think of things as beign difficut, as Im used to spending months and years on projects. At the same time I dont’ know C++ or the msp SDK enough to do so.

If you have no problem with investing time and if you
really do care about doing this component modelling, then
perhaps taking this as the opportunity to learn C++ and
enough SDK to actually do what you describe would be a
good idea. It’s a perfect marriage of desire and incentive,
and you’d probably make some interesting discoveries
on the subject of whether or not you *do* underestimate
the difficulties inherent in implementing an idea.

Win-win.

And making your work available to others? Win-win-win.


March 20, 2007 | 7:52 pm

Maybe one day I will get back into C++, but for now my plate is full. I have a full time job which typically goes from 9 am to 8 pm and I am also a musisican publishing albums and playing shows on a regular basis, as well as a visual artist doing installations and video artworks. I dont have enough time now to relearn C, which is a life long task, and do something like this myself. I don’t by any means concider myself the person to do such a project. Im just mostly pointing out that you have responded in this way to many things Ive said as if they are improbable. Ive seen much more complex things come out of the max community.


March 20, 2007 | 9:51 pm

Quote: Axiom-Crux wrote on Tue, 20 March 2007 15:09
—————————————————-
> Its not that I don’t like the aliasing, I am just tired of it, and looking for new textures.
>

It might be a good idea to try the same synthesis method at very low and very high sampling rates to determine if aliasing is really the main problem. (You might need Csound if you run out of processing power with MaxMSP.)

> I also don’t think that modelling a resistor or other electronic components would be that hard.
>

Neither did Max Mathews in 1957. That’s why we have computer music today.

:)

Eric


March 21, 2007 | 3:28 am

> Im just mostly pointing out that you have responded in this way to many things Ive said as if they are improbable.

I don’t consider them improbable at all. I’ve merely pointed out a few basic caveats here and there, and described what I believe some of the scope of the work to be. I’m sorry that it doesn’t interest you enough to do any work on it, but I’ll wager that I didn’t scare you off.

>Ive seen much more complex things come out of the max community.

Indeed. Done by people who decided they had the time, and – often – given freely to us all (may they be praised and prosper).


March 21, 2007 | 3:37 am

Im not sure how to take your responses sometimes.

I do infact have the desire to create them, i just don’t have the time, resources, and knowledge, which would require more time, so basically, if I were the one to do this it would probably be much later, and not so sure that it would be worth that much of a time investment for just that specific purpose. Now to learn c++ more in depth just for the sake of making my own softwares from scratch is more probable. However I feel that with max and most of the externals I have in my library I can do most everything I want, which brings me back to my original issue which is sound quality.

I feel that the only problem Im having with max overall is possibly just that since your working with such base components you have to add more then you might think to get a particular sound quality.

Does anyone know enough about electronics and the way that analogue oscillators work to give me a breakdown on how they might function differently then digital msp based ones? or for that matter filters? Maybe I could look up some schematics and try and translate some of the fameous filters. The most interesting oscillator to me right now is the cyndustries.com zeroscillator, and their sawtooth animator, both of which I hope to create something similar in max.

At any rate, I like some of the things that are coming about in this thread. Im going to do some research and run through some of the suggestions and then post again.


March 21, 2007 | 4:36 am

You may want to check out SPICE (Simulation Program with Integrated Circuit Emphasis; http://en.wikipedia.org/wiki/SPICE) for help with modeling at the component level. It’s not directly portable to Max/MSP, but the ideas involved might help you out a bit.

Erik Gavriluk, the guy behind Bomb Factory (pre-Digidesign’s buyout), said that most of the BF plugs were modeled down to the component level in SPICE.

Hope that helps,
EH


March 21, 2007 | 6:36 pm

Interesting, this spice, Ill have to look into it more. I don’t know much about electronics, but Its yet another thing I would love to delve back into, haven’t since I was a youngster.

Thanks!


March 21, 2007 | 6:46 pm

It should be relatively straightforward, it seems, to implement some
sort of ‘limiter’ on the mod index, tied to the Fc, C:M, & SR/2.

I, personally, love the aliasing…

On Mar 20, 2007, at 3:39 AM, Eric Lyon wrote:

>
> The way to avoid aliasing in every case is to avoid generating
> frequencies higher than SR/2, where SR is your sampling rate. In FM
> (unlike AM) you can generate an arbitrary number of sidebands. The
> higher the index of modulation, the more sidebands, and the more
> likely you are to be aliasing. If you want to tame your synthesis,
> you could put a spectral scope on the output and watch for when
> your sidebands march past the boundaries of 0 and SR/2 and then
> limit the index of modulation to those points.
>
> Or you could learn to stop worrying and love the aliasing :-)
>

—-
Steven M. Miller

Home < http://pubweb.csf.edu/~smill>
SFIFEM <
http://sfifem.csf.edu>
Atrium Sound Space <
http://atrium.csf.edu>
OVOS <
http://pubweb.csf.edu/~smill/ovos.html>


March 30, 2007 | 7:55 pm

so it ends up its all about the chebyshev. I tried so many things that everyone suggested and it sounds great now, I finally have a custom analoguishh max patch that sounds just as good as my friends 6 thousand dollar doepfer rack :D

Yay for max!

Thanks all so much for your help!!! Especially Peter!


March 31, 2007 | 3:04 pm

in my experiments with FM synthesis ive found that phase modulation is more stable and sounds clearer than frequency modulation, though that might not be desirable in all instances. I think the DX range all used PM rather than FM


March 31, 2007 | 5:56 pm

funny you should say that cause I used to use PM mostly, maybe Ill try that out too. Heres a demo of the two different sound qualities.

NCRIII

#P window setfont "Sans Serif" 9.;
#P flonum 294 162 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P window linecount 1;
#P newex 229 192 41 196617 *~ 0.2;
#P newex 229 144 58 196617 cycle~;
#P flonum 292 86 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 229 41 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 229 117 97 196617 *~;
#P newex 229 87 58 196617 cycle~;
#P flonum 115 157 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 52 188 41 196617 *~ 0.2;
#P flonum 50 116 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 50 139 58 196617 cycle~;
#P user ezdac~ 124 254 168 287 0;
#P flonum 161 79 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 98 110 97 196617 *~;
#P newex 98 80 58 196617 cycle~;
#P connect 5 0 4 0;
#P connect 4 0 6 0;
#P fasten 7 0 6 1 120 180 88 180;
#P fasten 10 0 0 0 234 68 103 68;
#P connect 0 0 1 0;
#P connect 1 0 4 1;
#P fasten 13 0 3 0 234 231 129 231;
#P fasten 6 0 3 0 57 229 129 229;
#P fasten 13 0 3 1 234 231 163 231;
#P fasten 6 0 3 1 57 229 163 229;
#P fasten 2 0 1 1 166 102 190 102;
#P connect 10 0 8 0;
#P connect 8 0 9 0;
#P connect 9 0 12 0;
#P connect 12 0 13 0;
#P fasten 14 0 13 1 299 185 265 185;
#P fasten 11 0 9 1 297 109 321 109;
#P window clipboard copycount 15;


March 31, 2007 | 9:56 pm

Quote: Gregory Taylor wrote on Mon, 19 March 2007 08:51
—————————————————-
> >Any insight onto the best source for alias free FM would be highly appreciated.

i agree with those who said thats more about upsampling
than about using [hr.]

normally 88 or 96 khz (i.e [poly~ foo up 2] at 44.1) should
be enough to produce clear HF content from a (non non-aliasing)
sine wave frequency modulation another.

but often i do FM synthesis using poly down 4 (resulting in 11
khz), then appending lowpass filters in root.
sometimes less is more.

-110


April 6, 2007 | 12:55 am

Hey roman, can I see an example of your two suggestions for poly fm up and down?


April 6, 2007 | 2:42 am

Quote: Axiom-Crux wrote on Thu, 05 April 2007 18:55
—————————————————-
> Hey roman, can I see an example of your two suggestions for poly fm up and down?
>
—————————————————-

couldnt find it its not here .. i rolled you a personal one now:

-110


April 6, 2007 | 6:03 am

well I certainly hear the diffference with the down sample rate (sounds bit degraded) but with the up 2 sample rate I hear not much difference. Is there maybe a way to bandlimit the harmonics?

At any rate the chebyshev did what I wanted, added some nice fatness, and the little bits of randomness I threw in my patch made it more alive and analogueish. Im happy with the tone quality Im getting now.

Heres my reply test.


April 6, 2007 | 5:26 pm

Quote: Axiom-Crux wrote on Fri, 06 April 2007 00:03
—————————————————-
> well I certainly hear the diffference with the down sample rate (sounds bit degraded) but with the up 2 sample rate I hear not much difference. Is there maybe a way to bandlimit the harmonics?
>
> At any rate the chebyshev did what I wanted, added some nice fatness, and the little bits of randomness I threw in my patch made it more alive and analogueish. Im happy with the tone quality Im getting now.
>
> Heres my reply test.
—————————————————-

if the modulator cycle f comes near nyquist (around 21,000 Hz)
there will be quite some difference between normal and poly~ up 4.

and dont forget that we use sinewaves here, with tri waves you
already have HF content when the nominal frerquency of main cycle
is 100 Hz …


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