Hi Oliver! Superb video! The shortcut for updating the poly~ object is to simply put a space at the end of the arguments and press enter and it will update itself. No need to delete the name or anything tedious like that.
I know how hard these videos can be to put together Oliver, so bravo. I'm also very familiar with making frequent patching mistakes along the way myself! One other useful thing I've found with poly~ is that rather than bothering with the whole mute 1, 0 malarkey, you can just route your audio signal out into thispoly~, and when the note finishes and the signal is 0, it will release the voice. I've built many polyphonic synths doing this and have never had any problems, I just find it so much easier to do than worry about which mute message goes where and in which order etc.
Thanks for a very lovely series! Granular synthesis has been fascinating me for a long time already, and these two videos cleared it up for me! Keep up the good work man!
For people learning all this stuff: there is a big difference between an abstraction and a subpatch. Abstractions take replaceable arguments (starting with #). The replaceable argument #0 is special because it will be replaced by max with a unique number. Replaceable arguments starting from #1 are replaced by what you put as an argument in the object box you use to load the abstraction. The "arg" argument in poly~ in this case is called "#0", which replaces the replaceable argument called #1 in the abstraction. So if you edit the abstraction it is called #1, if you take the abstraction out of edit-mode you can see what the argument in poly is, which is #0... So using #0 in front of the buffer names in the main patch has no use. The main patch is not an abstraction. Check out the reference files to learn more about this. Abstractions inside poly are not automatically updated. So: if the abstraction with the name you give in poly~ does not exist, and you change the file name of the abstraction to the name in poly~, poly~ will not check automatically what happened. You have to reinstantiate poly~. The trick to do this easily is to add a space to poly~ and hit enter. Also, don't put UI object inside an abstraction that is to be used in poly~. It is a waste of resources. Also to balance to load when using many voices: poly~ can be used in a parallel processing mode (check out in the reference doucmentation).
I would have loved to finish this patch but got stuck around 31.27 when you had triggered the wrong thing. I could not get anything to work after that very sadly
Hi Oliver! Great tutorial. I was wondering if you had an update on polyphonic pitch/chord based granular synth as you mentioned you might cover this topic in another video? I would be really interested learning this as I'm super struggling atm with it haha! Thanks :)
Hey Oliver, this is great. I have been messing around with this patch for a couple of weeks and was running into an issue with mine. Whenever metro triggered a midi note I would still get two pitches even though I was using the [stripnote] inside the [Poly~] patch as you were. I did a bunch of testing and figured out that these double notes we separate by the note-duration-parameter inside of [makenote] and that what was happening was the midi-on and midi-off messages were getting sent to separate voices. Once I moved [stripnote] outside of the [poly~] patch and into the main patch the whole thing started working as intended. Just figured it would be something to share in case anyone was coming across the same issue, it made for a great little "learn how to troubleshoot [poly~] " exercise!
Hello Oliver, it is a really guide and I have followed along from part 1 to 2. May I ask what book should I look into to achieve a high level understanding on MaxMSP and in general Synthesis ?
Oooh interesting question! I think I would say, rather than look for a book, try to spend some time reading through Max's own tutorials and object references. The Help files are the BEST teacher for Max, and you'll learn so much from reading them and trying stuff yourself!
Hey Oliver! THanks for the the great tutorials! Was wandering whether you'd ahve any further pointers on making the synth "truly polyphonic", as in allowing us to play chords? I've tried everything from nested poly objects and tried figurin out the coll solution you hinted on but to no avail. Thanks again!
Love your videos. I can't figure out why my grains don't overlap though. I followed thru step by step and tried to trouble shoot but I am curious at which point you explain how you fixed it to make the grains sustain across the start of the next grain to get that cloud swarm effect. thanks
hey hey! Wonderful video! I'm having an issue with a modification I'm doing at the patch: I've replaced the buffer with a polybuffer˜ because I want to use more than one sound. I've updated the "play" object inside the "poly˜" and it works just fine. The issue is that I'm trying to multiply the signal coming out of the "play"˜ object with some number to increase or decrease the volume (the final idea is to be able to have a fading effect with another sample in the buffer). But as soon as I place the "*˜", the sounds starts to get turned on ritmically with the input from outside the poly˜and the sound lasts all the times for less than half a second and that's just it. Seems like the granulation breaks as soon as I just add something to the signal outputted from the play˜object! Am I doing something wrong? cause I wouldn't say it looks like it and I can't find a solution to this T.T UPDATE: I was rewatching you video and it seems very similar to what happens to you around minute 32, before you add that steal and parallel message. Unfortunately that doesn't seem to be what fixes the issue and you didn't explain it in the video :-/ Thank you in advance!
Hmmm, sounds tricky. The polybuffer~ isn't something I've used much so I can't say for certain, but it sounds like its not working the way you want here. I *think* I'd first check that all the buffers are being named and called correctly, then see if you can play all of them simultaneously just to check that it's possible before even getting into the poly~/granular stuff... For the sound turning on/off rhythmically (you mean like a tremolo effect?) that suggests that you're amplifying the signal with *~ at the wrong point in your signal (or using the wrong value?) Beyond that, I'd suggest the really boring (but most effective) debugging process of walking through your patch step by step and checking everything is doing what you think it should be, until you find what's going wrong! Good Luck!
Hi, great video, thank you so much! I have a question, why do we need makenote 60 100, pack and midinote $1 $2 at all? It seems that inside the grainGen all you need are the bangs? I don't understand where/how you're using the midi note value inside the setup. Would be great if you could enlighten me there. If I bypass all of that and simply feed the bang into grainGen it works, so I'm confused. Perhaps there's something I'm missing. Thanks!
*I* am probably missing something to be honest! My understanding is that 'midinote' prepend tells poly that "okay, this is a midi note" and that allows poly to assign a voice index for the multi-voice stuff. I think that just triggering the object, with a bang might not give us multiple voices each time? We don't need the MIDI for the notes (unless we go down the routes of granular chords, which is _fiddly_), but I'm using them for voice targeting? I think... but there's lots of ways of doing stuff, and I might be doing a weird old way that doesn't help. Try a different route and if it works, it works! Let me know!
@@thrly from what I understand about poly~, you should just be able to prepend 'note' instead of 'midinote' and it won't require the message to be in MIDI format, while still allocating voices dynamically.
Your tutorials are great! Why are you using #0- naming conventions? The buffers and sends aren't being cloned, so their name is already unique, isn't it?
I get no sound when using the Gaussian Envelope. Also that $1 error you made is the only way I can get any sound... If I use $2, I get nothing. The sound I do get is also riddled with clicks.
Hi Oliver! Superb video! The shortcut for updating the poly~ object is to simply put a space at the end of the arguments and press enter and it will update itself. No need to delete the name or anything tedious like that.
Thanks, you've saved us!!
I know how hard these videos can be to put together Oliver, so bravo. I'm also very familiar with making frequent patching mistakes along the way myself! One other useful thing I've found with poly~ is that rather than bothering with the whole mute 1, 0 malarkey, you can just route your audio signal out into thispoly~, and when the note finishes and the signal is 0, it will release the voice. I've built many polyphonic synths doing this and have never had any problems, I just find it so much easier to do than worry about which mute message goes where and in which order etc.
great video series - and super fun to watch along with. Thanks so much!
Thanks for a very lovely series! Granular synthesis has been fascinating me for a long time already, and these two videos cleared it up for me! Keep up the good work man!
Thanks!! Glad you like them!
For people learning all this stuff: there is a big difference between an abstraction and a subpatch. Abstractions take replaceable arguments (starting with #). The replaceable argument #0 is special because it will be replaced by max with a unique number. Replaceable arguments starting from #1 are replaced by what you put as an argument in the object box you use to load the abstraction. The "arg" argument in poly~ in this case is called "#0", which replaces the replaceable argument called #1 in the abstraction. So if you edit the abstraction it is called #1, if you take the abstraction out of edit-mode you can see what the argument in poly is, which is #0... So using #0 in front of the buffer names in the main patch has no use. The main patch is not an abstraction. Check out the reference files to learn more about this. Abstractions inside poly are not automatically updated. So: if the abstraction with the name you give in poly~ does not exist, and you change the file name of the abstraction to the name in poly~, poly~ will not check automatically what happened. You have to reinstantiate poly~. The trick to do this easily is to add a space to poly~ and hit enter. Also, don't put UI object inside an abstraction that is to be used in poly~. It is a waste of resources. Also to balance to load when using many voices: poly~ can be used in a parallel processing mode (check out in the reference doucmentation).
This isn't working for me, I am using Max for live. Any ideas?
I would have loved to finish this patch but got stuck around 31.27 when you had triggered the wrong thing. I could not get anything to work after that very sadly
Hi Oliver! Great tutorial. I was wondering if you had an update on polyphonic pitch/chord based granular synth as you mentioned you might cover this topic in another video? I would be really interested learning this as I'm super struggling atm with it haha! Thanks :)
Hey Oliver, this is great. I have been messing around with this patch for a couple of weeks and was running into an issue with mine. Whenever metro triggered a midi note I would still get two pitches even though I was using the [stripnote] inside the [Poly~] patch as you were.
I did a bunch of testing and figured out that these double notes we separate by the note-duration-parameter inside of [makenote] and that what was happening was the midi-on and midi-off messages were getting sent to separate voices. Once I moved [stripnote] outside of the [poly~] patch and into the main patch the whole thing started working as intended.
Just figured it would be something to share in case anyone was coming across the same issue, it made for a great little "learn how to troubleshoot [poly~] " exercise!
That's great! Thanks for testing and sharing your findings -- appreciate it!!
Could you show what’s in the basic pan subpatch
this is fantastic (warts and all). Thanks for the info! Now the next challenge will be recreating all of this using mc~.
You can do it! mc~ is more straightforward than it seems!
Hello Oliver, it is a really guide and I have followed along from part 1 to 2. May I ask what book should I look into to achieve a high level understanding on MaxMSP and in general Synthesis ?
Oooh interesting question! I think I would say, rather than look for a book, try to spend some time reading through Max's own tutorials and object references. The Help files are the BEST teacher for Max, and you'll learn so much from reading them and trying stuff yourself!
@@thrly Thank you for your advice! I will read it and learn step by step. Hopefully I can show you something when I had the ability!
@@kwokedwin9628 looking forward to it! good luck!
Thank you very much for your tutorial. I've really been waiting for a long time hhhhh
4.05 Hey Oliver, did you forget to save the patch you did a year and a half ago...haha great moment!
Hey Oliver! THanks for the the great tutorials! Was wandering whether you'd ahve any further pointers on making the synth "truly polyphonic", as in allowing us to play chords? I've tried everything from nested poly objects and tried figurin out the coll solution you hinted on but to no avail. Thanks again!
Sorry for the late reply -- I'm rubbish with comments! Hopefully the easiest explanation is to show you! Copy the code below and in Max, select File > New From Clipboard...
----------begin_max5_patcher----------
1477.3ocyYkriaiCD8rCP9G3nKIAwoAI09.jaykbXNMG6zHfVlsMSjHEjn5z
FAy7sObQxVIwRl1gwvG5lhkV368phEKR+sW9hEAqDOSaC.+I3dvhEeSYYgwl
1xhACKBpHOWTRZMOXPgnphxkAK6uoj9rzbC4VJGH2xZAetqUB1RIqaAhGeDH
E.QWC39ZQ4t+Crogv6JIM+yNtb6CfZhrX6er+qUx3zBQG27IwCVYqMifX0me
GJY+yZdUFeymZnERKIv336fKAwwlFTtoIL5NH3gg2h2Uw3kTogMnQVEcxAyP
i0+8kuP2pZV9qqNOxJKMxPgPcwWYxs.BnjoDJwi.hxjR9.0LEinsfuptrjrC
v3tKL4yoKHqdfgllX3MirvdzHJOQKEEL4Nv6eO.BdMWHopHm2rDXBpD0lHKJ
XCQR0gSEMT8UGDv8BmVW0O4qZnUhmnuBTQaaIan2orRjp6qT55NqbWoFZyaq
eg609kGLeviq4gGQySmSyC6E8DSCNEdWHNOIMAifYYPb1RPT1sfGfi.uGHaX
a1Pa.6zdC0TTFuE755FwJxpxcJgthJaDbQE8Mej+QNiiUuye+g+5CVkWaIbv
xde46dG3CJA8KFWVWK0pyspjCpO+C.k.pzJsOnkslZybzJTuRAgad7pcfuP2
sRPZV+J0sruGnltlTdbWT7QbQgyltHseBgY9PpoQ++qkSgS+pBi+rOolT7k8
VsijbWM0B5ffCvabhwYm+GZ3V99I9p.R7j7Debdh7NOqXqY0jlV5Ljc4g+X5
328Miu73JBZdMIynFQ1FTF9t3YUkI79YWrpzmZ5mkkhRJo4b8+4Nr..NxF.D
eqD.T2PU41WCrYqO6PdHb1Y2w87LzD6mbBRitVjtiO+76Qg4Gm1gNv59ZehR
uLVi8NqeK.MOkmXN7rbEAGUWCN+DyfuZg05pXtDxBcgs8IwCuUlCaJJCehL3
SvWrKdWa4pIW3pV3eaIsZoxyOi0rycQPakHgFFmhuUxX0y3ymsQyw1zwkcEG
dqPV8FAbqdjoXc7oYMNylkFleYzNZvbK4I55OYqk9SDopN9UcR6d5Wbf4KBn
UqnFLBWNXR4UKXsLAWaNwZsWH8pfJAq.qlVQWQ3azpoocBEM8zJZ+BdHbzsx
Jd5paerrqc6EsTPlK0tZSMFeyTZigxhlJh7jk2bbdGlbZOcjMKY1oROl5aG8
jErutqp97SNl6PZh9B1yu0JXW6n0mRyYuKkXGBqi6W3Ght1w0lO8Y6IcH6jc
E8C+eBBAmfPClGNEG8PuePY70zm+sx6ISSggNbpCWEtiu9b2kh0uJbO7h4tc
rBNF6vtLQMN1I5M0AmcYg01Awbze+3ucgAp5a7CjtUz0TL3QGNsDvH3tl1JY
bhruZn6GUJ23GSk1qVnhH5GWUsF5cblZROmcnC3go8HtCwXWfn1OMCBQYlME
GaOyuw87BF0KW6hLlMKHsJWTzXLZ54ELpmm5BFQy6pQFXkX2lxgNGdAQyZZy
INOXeCZ0CgNEj6KONdemi.YjOfLzUHOS3ZTzAUdTGuDHnWm1k.gTGBVsHLyy
.LzM.BmORMwlHBYKZbTO+.RjSgl4wNkWB9c4kfQdCjtojXWlyirIlF2yOfD5
kEg5W2wd9Xi53ILl4DFQHWb2QoeWJ9T+gRGmZm6hRhFubt+l2XvH5Wcsxdsa
3WtT2CFGkGgCSxiRPvj4uWjsj7AOPXr2XWradfHG7.gvQd.SGOhQG7.gy6AP
iA43ddBkQtnj+XkWGWHyGKj49Chg9vYOHcwixbY53IPhcxaG5xhoHahqw87H
H+02GBZbRggMh.8FHca0TmJfV6zGsXJxeJIzKJYRzuSkz8pRPmpF4gpRRhlt
pj9cJSpqeh1LbR+V3ETQ9rvT6e1RaeF212dVhAMzm1+iCzahzTrkIoExtFCq
BdNo+G3InRn1IAuiMrYBs.oGZyQMvIUz1ZhUJLGIwKeg5A9e.R9U9NB
-----------end_max5_patcher-----------
Love your videos. I can't figure out why my grains don't overlap though. I followed thru step by step and tried to trouble shoot but I am curious at which point you explain how you fixed it to make the grains sustain across the start of the next grain to get that cloud swarm effect. thanks
Also what’s in the rgrain pitch subpatch ? :)
Thanks for a great video, have you done any experimenting in the mc. domain with granular stuff?
Only a tiny bit -- there's lots of potential there too. The new mc.snowfall~ particle stuff might be interesting too!
Does someone whats´s happening in that basic-pan subpatch?
I’m confused too
hey hey! Wonderful video! I'm having an issue with a modification I'm doing at the patch:
I've replaced the buffer with a polybuffer˜ because I want to use more than one sound. I've updated the "play" object inside the "poly˜" and it works just fine. The issue is that I'm trying to multiply the signal coming out of the "play"˜ object with some number to increase or decrease the volume (the final idea is to be able to have a fading effect with another sample in the buffer). But as soon as I place the "*˜", the sounds starts to get turned on ritmically with the input from outside the poly˜and the sound lasts all the times for less than half a second and that's just it. Seems like the granulation breaks as soon as I just add something to the signal outputted from the play˜object! Am I doing something wrong? cause I wouldn't say it looks like it and I can't find a solution to this T.T
UPDATE: I was rewatching you video and it seems very similar to what happens to you around minute 32, before you add that steal and parallel message. Unfortunately that doesn't seem to be what fixes the issue and you didn't explain it in the video :-/
Thank you in advance!
Hmmm, sounds tricky. The polybuffer~ isn't something I've used much so I can't say for certain, but it sounds like its not working the way you want here. I *think* I'd first check that all the buffers are being named and called correctly, then see if you can play all of them simultaneously just to check that it's possible before even getting into the poly~/granular stuff...
For the sound turning on/off rhythmically (you mean like a tremolo effect?) that suggests that you're amplifying the signal with *~ at the wrong point in your signal (or using the wrong value?)
Beyond that, I'd suggest the really boring (but most effective) debugging process of walking through your patch step by step and checking everything is doing what you think it should be, until you find what's going wrong! Good Luck!
Hi - I liked building this a lot. Thanks. Just to note that in your play out - your second split probably wants to be 75 rather than 25 :-)
Thanks for the heads up!
Hi, great video, thank you so much! I have a question, why do we need makenote 60 100, pack and midinote $1 $2 at all? It seems that inside the grainGen all you need are the bangs? I don't understand where/how you're using the midi note value inside the setup. Would be great if you could enlighten me there. If I bypass all of that and simply feed the bang into grainGen it works, so I'm confused. Perhaps there's something I'm missing. Thanks!
*I* am probably missing something to be honest! My understanding is that 'midinote' prepend tells poly that "okay, this is a midi note" and that allows poly to assign a voice index for the multi-voice stuff. I think that just triggering the object, with a bang might not give us multiple voices each time? We don't need the MIDI for the notes (unless we go down the routes of granular chords, which is _fiddly_), but I'm using them for voice targeting? I think... but there's lots of ways of doing stuff, and I might be doing a weird old way that doesn't help. Try a different route and if it works, it works! Let me know!
@@thrly from what I understand about poly~, you should just be able to prepend 'note' instead of 'midinote' and it won't require the message to be in MIDI format, while still allocating voices dynamically.
Holy crap. It finally happened!!!
Your tutorials are great!
Why are you using #0- naming conventions? The buffers and sends aren't being cloned, so their name is already unique, isn't it?
Is that Guerrilla Warfare over your shoulder there?
woohoo! thanks!
I get no sound when using the Gaussian Envelope. Also that $1 error you made is the only way I can get any sound... If I use $2, I get nothing. The sound I do get is also riddled with clicks.
any luck trying to solve this? got the same problem
Same here!