windowing for simple looper


    Jun 14 2018 | 2:44 am
    I'm trying to make a very simple looper/stutter effect in gen and want to perform some windowing to remove clicks. Basically I am recording one second of audio that is played back by a [phasor] [fold] [sample] combination for the stutter. Only problem is I get terrible clicks and I'd like to window the playback.

    • Jun 14 2018 | 1:58 pm
      There's a few different ways you could do this. You could create an external buffer that defines a window, and apply that to the amplitude of the loop/stutter. You could set up some math that automatically fades in/out the amplitude when the playback gets close the beginning/end of the loop/stutter. The way you've implemented the playhead for the stutter is a bit wonky (to me, this might be what you are trying to do) - the phasor jumps back to 0 after each second, so you may want to rethink that part, using a counter and folding/wrapping would eliminate that.
    • Jun 14 2018 | 4:30 pm
      Thanks Evan ill try that out!
    • Jun 14 2018 | 4:41 pm
      I think the counter part of your suggestion is crucial for this
    • Jun 14 2018 | 4:54 pm
      I use counters all the time for reading through samples/loops. Using counter and then wrapping that to the size of the loop, then dividing by the length will give you a nice 0 - 1 ramp, which you can use to read through a window buffer using a sample operator.
    • Jun 14 2018 | 5:54 pm
      The only thing im wondering is how i would trigger the windowing at the right moment. For example if i am using peek to play back and loop say index 157 to 2341 how to i trigger the windowing to occur at the right moment? Maybe using ==157 and/or==2341 to open a gate?
    • Jun 14 2018 | 6:09 pm
      I wouldn't worry about triggering anything, just read through the window buffer at all times. Massage the playback index to a range of 0 - 1. In this case you would subtract the offset, and then divide by the length to get an index value of 0 - 1. send that value to a sample operator to read through the buffer containing the window. You would have fades at the beginning and end of the window of a certain amount of samples, effectively fading in and out at the edges of the loop.
    • Jun 14 2018 | 6:41 pm
      Hmm sounds easy enough i will try tonight. Thanks man
    • Jun 14 2018 | 6:44 pm
      Good luck! Let me know if you get stuck, I'd be happy to help with examples, etc.
    • Jun 14 2018 | 10:58 pm
      Cool man. Yeah if u wanna post an example that would be cool cuz i will prob be stuck
    • Jun 17 2018 | 10:47 pm
      How would I create a windowing buffer inside of gen~? Thing is I got it to work but I wanna load this on my OWL pedal so I have to do everything inside gen~ (ie I cannot reference a buffer object inside of MSP).
      Another viable alternative would be to do all the windowing using maths instead of using a windowing buffer which would probably also be better because it would be more computationally efficient which is important for the whole OWL thing
    • Jun 18 2018 | 3:27 pm
      I'm not sure what type of efficiency gains you'll get from doing the math as opposed from reading from a small buffer, but here's an example of each approach:
      I did an internal data object in gen, and also just used a fold, clip, and divide to get a window from the sample index of a loop.
    • Jun 18 2018 | 3:35 pm
      Hi Dario, I've attached a patch where the windowing is done using math within a codebox. There's 3 functions (some of them come from the gen pulsar examples). There is also a phase offset so that if you want you can do some time stretching and chain 2 or 4 windows with a relative phase offset. The bandwidth parameter is really nice for granular synthesis but for a stutter you might want to keep it low (==1).
      There's a really good collection of windows in Graham Wakefield's site : https://grrrwaaa.github.io/gct633/audio.html
    • Jun 18 2018 | 3:41 pm
      .quasars stuff is better than mine!
    • Jun 19 2018 | 8:42 am
      I use counters all the time for reading through samples/loops. Using counter and then wrapping that to the size of the loop, then dividing by the length will give you a nice 0 - 1 ramp, which you can use to read through a window buffer using a sample operator.