[Share] Functions for Wave Terrain Synthesis


    Feb 23 2018 | 7:37 pm
    Yesterday I spent a bit of time copy-pasting the terrain generation algorithms from this wave terrain synth's github page:

    Wave Terrain Synthesizer

    https://github.com/aaronaanderson/WaveTerrainSynth
    This is not my own work. I feel obligated to emphasize that. Aaron Anderson did everything in the original project (which is excellent- I suggest downloading it and checking it out), and I just stuck part of it in Gen~.
    The math here isn't very stressful on CPU, so I decided to just have the output calculated rather than written into a buffer (also because I'm lazy....). These could also be used as waveshaping functions, if you were to edit them a bit. The fact that there's inputs for both x and y "coordinates" also means that trajectories are completely open ended, and not at all limited to what's generated by two sawtooth waves like I have in this example patch, so I'd recommend trying different ideas of your own. Have fun!

    • Feb 24 2018 | 1:52 am
      Great share. Thanks!
    • Mar 12 2018 | 10:54 pm
      Hi Noah!
      Thank you for doing this; I've had some fun playing with this in Max. One issue I really wish to solve is the aliasing. It becomes a super prominent issue with large/complex orbit sizes. (I'm working on an oversampling implementation in the C++ version)
      I'll be stuck in a plane for 20 hours this week so I'll try to put all my orbits in the max patch and report back here.
      For those that are interested, I discovered this synthesis method while reading 'The Computer Music Tutorial' and found a lot of deeper information through research done by Stuart James.
      I'm happy to see this is getting some mileage, thanks again!
      Aaron
    • Mar 13 2018 | 5:56 pm
      Yeah that's something I noticed too. Sadly, though I don't know a whole lot about things like bandlimiting or other AA methods outside of upsampling. It didn't cross my mind at the time, but it probably wouldn't be difficult to make a poly~ file for this, and just increase the samplerate there. Other than that though I don't have a whole lot of solutions :/
    • Mar 15 2018 | 8:03 am
      It would be very difficult to execute in Gen~, but oversampling and filtering is the only real solution to the issue in this case. If I recall correctly the DX7 had aliasing and it seemed to do alright. For now we can just call it a feature, not a bug. I've uploaded a new version of the patch with a drop down menu for orbit patterns and a few presets. Have fun!
    • Mar 15 2018 | 1:35 pm
      Thanks for sharing, this is really nice.
    • Mar 16 2018 | 2:45 am
      Very nice ! As for the oversampling in gen~ I have been quite interested in implementing it myself in gen~.
      It is definitely doable, but indeed quite difficult depending on the technique. I think for Wave Terrain Synthesis, a good solution would be to use the upsampled phasor method. There is a good example of a X8 Upsampled Phasor macro in the following link (in Reaktor Core) which can be adapted quite easily :
      The main difficulty (at least for me) is the X8 downsampling filter which should accompany this macro. I have a good macro for that in Reaktor Core, but I just haven't managed to adapt it to gen~ yet.
      Otherwise, there is a simple X4 Upsampling example in the ClingWrap patch of the Owl package.
    • Apr 15 2018 | 8:40 pm
      Thanksalot, Noah. And a very good step-up, Aaron (long-haul, were we? I use my yearly flights from NL to NZ that way ;-). The whole thing has an FM-on-steroids-quality. Very interested in the gen~ implementation. I just received my OWL pedal and I am thinking about using it just as a sophisticated Fuzz on my ebass to get that contemporary DnB crunch. It would have to be pure gen~ , though. @.QUASAR, The ClingWrap patch is one of the more interesting ones - studying it very carefully ;-)