1. We're currently conducting systematic tests with the release version of macOS 11 (Big Sur) in order to offer full compatibility of our products as soon as possible. You can find our latest compatibility status - here


    Please note that although announced at the same time as macOS Big Sur, Apple Silicon processors are an independent release with separate compatibility concerns for NI products. Compatibility with macOS Big Sur will not yet ensure compatibility with Apple Silicon processors. At the moment, Native Instruments products are not supported on computers with Apple Silicon processors. Read more - here

    Dismiss Notice

New (old now ;-p) bytebeat synth "digit 8' uploaded to UL

Discussion in 'REAKTOR' started by colB, Feb 24, 2014.

  1. colB

    colB NI Product Owner

    Messages:
    3,458
    It's not a huge problem to implement. It was quite useful as I found a more general problem that needed fixing while I was looking at the possibilities. In the current version, there are two different processes internally. One handles notes that need a clock lower than the sample rate - that one sends tick only when needed, so low frequencies are low cpu. The other processes the higher frequencies, generating two results for each tick and interpolating. The way it was, the two were using incompatible clocks, so not only would a free clock have been broken, portamento crossing the boundary between the two processes would have been truly messed up!
    The current version can be switched so the clock doesn't reset, but it pauses when there is no sound. I will need to add extra logic to allow the clock to update without triggering all the iterators on each tick - not too difficult methinks. It also now has portamento.

    I like the idea of a free clock. I can imagine having some fun making sounds with changing textures, or having different parts of a pattern played with rest gaps, like a gating effect I suppose - getting more mileage out of some of the patterns. Although for that to work well, I think there needs to be some way of resetting the clock, otherwise using it for repeatable pattern effects would be difficult. Unfettered, it will run for a day or so before wrapping!

    As far as what happens when t gets very large, not much IMO. The whole magic of bytebeat is the repeating patterns as the binary keeps on wrapping around... so for any particular expression, only the less significant bits are particularly important, and the final result of each iteration is masked to 8 bits anyway. It is possible to make use of the higher bits by shifting and masking, but I can't really see the point :). Any effect you hear after 4.6 hours could be made to happen after e.g. 3 minutes by tweaking the expression.

    cheers

    Col
     
  2. colB

    colB NI Product Owner

    Messages:
    3,458
    I've uploaded version 2.0 of digit8 to the UL.
    Screen Shot 2014-04-12 at 23.02.31.png

    There are lots of changes including:

    Improved audio quality
    syntax checking
    Ternary operator
    Arrays
    Comparison operators
    logical operators
    binary NOT
    4 line display
    parameter value display
    portamento
    clock synchronisation
    switches now dragable
    space (great to make it easier to read expressions while you're working on them)

    I re-wrote much of the tokenizing and parsing code so I could add features like the ternary operator and arrays. Unfortunately, that means that patches from the old version won't load into this one. You'll have to type them in again, sorry.

    The array functionality is pretty rudimentary. There is no assignment, so you have to define and use the array in the same place, but it's really useful for setting up sequences of values.
    You use it like this: {12,3,123,45,6,8}[(some sub expression)%6]... so the comma separated list of values go between curly brackets, then the indexing expression goes between square brackets that must come immediately after the curlys. The crucial trick to getting the most out of this is using the modulo operator '%' to limit index values to valid ones. So if there are 9 array entries, you would use %9 at the end of the sub expression within the square brackets...

    The Ternary operator ?: works pretty much like it does in c. And of course, to support it there are now comparison operators: == >= <= etc. These can be used elsewhere, false will output 0 and true 1.

    There is now also syntax checking. This will catch most (not all yet) errors, and as you type in an expression, it will display red bars at the sides of the expression window while the expression is not valid

    I've added Jim's 'free' clock feature, and a system to 'arm' the clock so it waits for a key or for play to be pressed before starting. This can be useful when used along with tempo synchronisation.

    The nature of bytebeat makes it awkward to use along with other synth when using pattern/song style patches. Matching tempo and tuning is a big hassle. The new synchronisation feature makes it much easier to get the speed right, this works great alongside beatbox type instruments. Unfortunately, it also affects the tuning. To play with melodic instruments, you will either have to tune them to match digit8, or build patches that use the 'f' operand. There are some demo patches that use this approach, so check them out to see how they work. A good example would be 'drivin synch pitch hold' which is patch 27 in bank 2. Notice how when you play different notes, the pitch changes but not the tempo of the pattern, but whne you change the bpm setting, the tempo changes but not the pitch!.Of course you get nothing for free, and the 'f' approach can have a negative impact on sound quality (and sounds nasty with portamento).

    Finally, I'm sure there are bugs, so if you find a reproducible one, please post a report.

    cheers

    Col
     
    • Like Like x 1
  3. colB

    colB NI Product Owner

    Messages:
    3,458
    Just posted a small digit 8 update in the UL.

    It includes a fix that allows multiple instances to work in the same ensemble. See this thread for details of the problem and the solution.
    The other significant new thing is that I forgot to implement negative numbers in arrays in version 2.0! doh!
    This can make a big difference when using binary bit twiddling and masking techniques because small negative numbers have all the 1s :)
    e.g. -2 in 32bit binary is 11111111 11111111 11111111 11111110! numbers like that can be very useful in bytebeat expressions. and now you can use them in digit 8 arrays!

    cheers

    Col
     
  4. Porky777

    Porky777 New Member

    Messages:
    2
    Hey Col, I just stumbled upon this and love it! I'm not sure I understand the concept, and so maybe this question doesn't apply to this type of synth. Why is the tempo of the pattern recycling based on the note played (higher notes faster cycling)? Is there a way to have a consistent tempo up and down the keyboard? When I click the BPM sync the clock stays constant but so do all the notes.
    Thx
    Dave
     
  5. colB

    colB NI Product Owner

    Messages:
    3,458
    Thanks Dave.

    The tempo changes with the pitch of the note because of the underlying mechanism behind this type of synthesis - but there are ways around it :)

    Bytebeat synthesis is based on binary twos complement arithmetic. In binary twos complement, numbers wrap when the result of a calculation is greater than the maximum value that the number of bits being used can hold. So with 8bit numbers, the maximum value is 255 (unsigned) or 127 (signed) adding 3 to these would give 2 and -126 respectively.

    The original bytebeat concept as developed by Ville-Matias Heikkilä aka Viznut in 2011, was about creating short pieces of computer code that write their result directly to the audio output. There were no midi notes, and you couldn't play the sounds with a keyboard. It just generated a fixed output that depends on the sample rate of the output stream.
    Digit8 is heavily influenced by 8bitsynth from caustic3 (single cell software), this is the first synth I've seen that takes the bytebeat concept and packages it into a playable synthesiser. I liked this a lot which is why I built digit8.

    The way digit8 pitches notes is to change the internal clock rate of the bytebeat process depending on the key you play. Because the rhythmic character of the snapshots/algorithms is also dependent on the clock rate, the perceived tempo changes with the note you play. It's important to remember that the sound is purely the result of processing the complete algorithm once per tick, so if you change the clock rate, everything changes.

    The workaround is a feature unique to digit8 afaik, one of the available built in variables is 'f' which is the note frequency. It is possible to use this in your algorithms in ways that offset the change in tempo of parts of the pattern so it is constant while the pitch changes. There are example snapshots to demonstrate this technique. Bank 1 has two very simple examples that show two approaches, patch 11 and 12:

    11 "hold tempo example"
    Code:
    t<<2|(t<<6)/f
    the first part t<<2 is the tone, this is left as it is so that the pitch changes with the note you play. The second part (t<<6) is the rhythmic element. This would have been something like t>>4 which divides the clock value by 16 to drop it out of audio range so that it is perceived as rhythmic texture. It is changed to t<<6 to account for the division by frequency... Anyway, that divide by f means that as the not pitch rises, the divisor increases and the rhythm stays constant :). Downside is that there is more graininess and grit in the sound - which might be an upside depending on your perspective. And glide is messed up...

    12 "hold tempo better approach"
    Code:
     (t*f)>>7 & t>>7 | t>>8
    This is 'better' because Rather than adjusting the rhythmic part, BPM SYNC is switched on (main process ignores note pitch and uses song tempo instead), then the note pitch is added by using 'f' in the algorithm to adjust the tone part. The main advantage here is that the rhythmic component is synched to the Reaktor tempo! Additionally, there is usually only one (or maybe two) tonal component, but lots of rhythmic components, so this version means less editing. It also means better quality due to fewer divisions/multiplications by 'f' in the algorithm.

    Other patches that use these approaches are:
    bank1: hold tempo 3, arp phone, 8bit lament, chip sandwich, bit arp 1, minor KBt, (0, 1, 3 &4)
    bank2: drivin synch pitch hold
    bank6: arpy1, fishing for ears, bit rot baby, stinky arp finger, arpy carp funk, arpy carp funk chillin, determinator (0&1).
    Try playing these at different pitches.
    One of the demo examples in the UL page "digit8_demo02" uses "chip sandwich" and "bit arp 1" played with the keyboard on different notes to create chord changes.
    It would be possible to use a similar approach with an array based sequence instead of midi note frequency...
    So plenty to go on :)

    If you have any other questions, ask away. There are lots of alien concepts and tricky details hidden away in there, and I might be able to explain some of them...
     
    Last edited: Oct 22, 2016
  6. colB

    colB NI Product Owner

    Messages:
    3,458
    For an understanding of bytebeat in general go here for a great overview with lots of useful links history etc., and especially here and click on the pdf link for a paper by thy guy who invented the concept.
     
  7. Porky777

    Porky777 New Member

    Messages:
    2

    Wow...thanks for all the info!!!
     
  8. colB

    colB NI Product Owner

    Messages:
    3,458
    I've uploaded a new version to the UL with a workaround (I hope) for the Ableton Live bug where buttons set to trigger mode always output twice.

    If you use Ableton, please report back if this fix works. If you don't use Ableton please report any issues that might have been created by the workaround (None for me in initial and very brief testing).

    There are some new snapshots in this version as well !
     
    • Like Like x 1
  9. Paule

    Paule NI Product Owner

    Messages:
    6,788
    If you like votings or not I gave you a new 5-stars up to 60.
    Thanks for updating. Myself don't use Ableton Live but can enjoy your new snapshots.
    Are my old snaps inside your version 2.4?
     
    • Like Like x 1
  10. colB

    colB NI Product Owner

    Messages:
    3,458
    I think there are a couple of large banks of snapshots that you converted for digit8, thanks for those :)

    I'm not sure about all the snaps now, I have a few different versions on my system some with a few different snaps, but I think this 2.4 version has the most complete set.
     
    • Like Like x 1
  11. Paule

    Paule NI Product Owner

    Messages:
    6,788
    I miss the Underground Captures bank.