Got a few questions now, and it might be that I will find some of the answers myself before you answer, but I think these descriptions will be useful to most. I am now trying to play with the Echo and Scrub parts only with one single input and one grain (not even using the Matrix), yet some things are still unclear to me. So I wrote what I found, hoping you can correct me where I am wrong:
- echoSpeed - fine and simple to understand. Negative values will play your sound backwards. This modifies the speed at which the loop is played, so if you want to play with pitch independantly from time, you should try the scrubPitch function (see below). A trick I found: with echoSpeed at -0.999999 you get a reverse sound with the same length. Then playing with scrubPitch allows you to change the reverse sound’s pitch. In this way it could be fun to trigger echoSpeed between 1 and -1 mostly, although I like its classic Varispeed effect a lot. Also, when setting scrubEnable at 1, this won’t change the pitch anymore - only the speed!
- echoTime - only useful if set between echoMin and echoMax. With echoWrap set at 0, will play a one-shot. If then the value of echoTime is above echoMax, it’ll play from echoMax. If it is below echoMin, it won’t play. With echoWrap set at 1, will restart the loop wherever you place it. If then echoTime is set outside of the range, it will set a burst (scratch-like) of sound before getting back to the loop. If set within the range, it’ll retsart the loop from that very place.
- echoWrap - choice between one-shot (0) or loop (1) between echoMin and echoMax when WriteEnable is set to 0. When WriteEnable is set to 1, seems to work as a bypass button for the whole Echo module (it still records the buffer, but won’t play it).
- echoFadeLength - very useful part, allowing to crossfade between the loop end and its beginning. Small values give a natural sound (good for long loops), large values make the crossfade quite powerful (good for very short loops). Not sure I get the “ratio to echomax-echomin” calculation though. For very short loops (echoMax-echoMin<40, for instance) it seems no fade is good enough, but in most cases you can find a sweet spot.
- echoMin and echoMax - somehow the range in time for the echo function. It seems the buffer goes from Max to Min, which is in my mind a bit confusing if I think of it as a loop, but I understand it comes from the fact that echoMin represents the echo boundary nearest to the write-head. Therefore it will show the last part of your looped sound… Also, I noticed the whole buffer seems to be looped 8 times over the 32767 possible values for echoMin and echoMax, meaning the buffer is about 4096 “values” long, and the loop can be set to more. Am I correct? And if so, why not use the full range for the buffer (here it is about 5 seconds long), or why not limit the size of the loop then?
*WriteEnable - set to 1, it will generate a single echo, providing wrap is set to 1. Set to 0, it will create a loop defined by echoMin and echoMax. Sometimes I get very weird wraps though, even with WriteEnable set to 1. Something like a very strong scratch effect, which I have no clue how to trigger. All I know is I can stop it by playing with some values like echoMin and echoMax again.
Now for the Grain Scrub function, here’s what I got:
- scrubEnable - that is very clear, although somehow even when set to 0 it sounds like something is happening within the echo module, as explained just above. I also found that when set to 0 scrubLength would become a kind of scratch function, whereas scrubPitch got disabled and scrubPitchDetect adds only a subtle watery alteration of the pitch stability.
- scrubPitch - this controls your pitch independently of the tempo. I don’t understand the need for negative values here, as they don’t play reverse (UNLESS scrubLength is set to a high value and scrubPitchDetect is on, but then there is quite some echo). In all cases it introduces a subtle change in the sound, making it less natural than positive values and that’s mostly it. Also, if I understand correctly your formula indicates that there are 256 subdivisions between a value of 1 and 2, for instance. Right? I have to say that the way this works differs strongly depending on the value of scrubLength, and it can be quite tough to master, although it’s a lot of fun.
- scrubLength - this one is, to me, the trickiest control so far. At 0 it kind of cancels anything you want to do with scrubPitch, UNLESS scrubPitchDetect is set to 1. Then with scrubPitchDetect set to 1, if you go up to about 4000 and scrubPitch set to negative values then you get a mix of normal and reverse sounds. At 30.000 it is fully reverse then, but with a lot of (nice) echo… Around 600 you can get pretty natural pitched sounds IF scrubPitch is between 0 and 2. For the rest, below 500 and with scrubPitchDetect set to 0 you get a sort of Ring Modulation, and above 1000 it creates - for me - random possibilities, somehow it changes the echo feedback while changing the scrub reaction to pitch change but I can’t relate the values to the results I get. Very interesting still, and very difficult to control apart from those simple parts I mentioned. Also, you write “Length of scrubber read distance from echo readhead before cross-fading. This is expressed as a ratio to the scrubberFadeLength” but I haven’t seen any scrubberFadeLength. Did you mean echoFadeLength? Not sure I understand this at all.
- scrubPitchDetect - this one changes the behavior of the whole, adding some more natural sounding pitch changes on the whole. BUT depending on the settings of scrubLength it can entirely change of behavior ! When scrubLength is pushed to the max for instance it will only react to the next integer value, whereas with small values for scrubLength it will act somehow linear… I could use some more precise explanations there.
That’ll be it for now. This is really something special, I am making a simple scene or two to take advantage of my new discoveries now. Hope this is something you can comment on, mostly the parts where I am very wrong - or those which I obviously don’t get!
Edit: just one more question: what is the effect bus in here? I mean, we have 4 inputs and two grains, and all can send to an effect bus which I can hear has an effect indeed, but what is it? Can’t see any detail about that anywhere, and although I suspect it is something already defined in here I would like to know. Sorry for the tremendously long post!