Kitten for OSX

so it would not help, if pattern change is only possible “quantized”

= first the current pattern plays the next 8th or 16th

and THEN it can change to the following pattern ?

Ahhhh I’d love a MEGAMIX type thing on the Analogs.

One of the best things about the ridiculous, orange Roland D2 which I’ve still got.

@ void:pm’d

Thanks for putting in the work, void :+1:

MEGAMIX works and it kicks ass, just needs some fixes with regards to track lengths…
stay tuned

WOW!

awesome! this would be fun for sure.
it’s almost sounds like ‘motifs’, like quasimidi used in all its stuff.

Hi void,

do i understand correctly? you can choose an empty pattern and then copy different tracks from different patterns into the running pattern including soundsettings? so you can use one pattern, that is like “the master” that can be updated with all pattern inputs live on the fly?

hell, this would be the jam-super-killer feature… combined with the fill modes you can do a 4 hour set with one pattern :-)))

man… you should hire at elektron (yeah, i know… everybody wants you to do so :-)))

keep that great ideas up!!!

ok - new version with megamix (maybe there’s a better name? kitkat?)

https://dl.dropboxusercontent.com/u/50830178/Kitten.1.0.2.app.zip

It works a bit different than before.

It is awesome, and less complicated than the long post ahead might suggest.

But, it needs some learning because there are a few different modes & possible pitfalls. The following guide hopefully explains the whole thing sufficiently:

you can do the following things by pressing a pad/trig button:
[ul]
[li]copy a sound from any kit into the current kit (pad chooses which track)[/li]
[li]copy sequencer track & sound from any pattern to the current pattern AKA MEGAMIX (pad chooses which track)[/li]
[/ul]

on the FX track:
SYN: enable/disable kitten - this also disables/enables internal triggering of the pads, respectively.
SMP: choose between kit (0) and pattern (1) mode
VEL: choose source kit/pattern (1-127) - note that 128 is not available.

so if SYN is 1:
[ul]
[li]if SMP is 0, press a pad/trig to copy sound from selected kit (VEL) to current kit[/li]
[li]if SMP is 1, press a pad/trig to copy seq.track+sound from the selected pattern (1 = A01, 17 = B01 etc.) to the current pattern+kit[/li]
[/ul]

you can copy individual sounds and/or sequencer tracks from any kit/pattern. this is pretty funky for jamming/mixing a live set from your existing stuff.

so, sounds 1-12 and sequencer tracks 1-12 can be copied, but:
what about FX settings/scenes/macros?
what about copying entire patterns, or kits?

there are only 12 pads and they are used to select tracks, so the app uses the ENV/LFO toggles on the FX trig page for copying kit settings and entire patterns or kits. so the ENV/LFO toggles actually perform an ACTION.

ENV: get kit fx settings
LFO: get kit/pattern

if SYN is 1:
[ul]
[li]if SMP is 0, set the ENV toggle to 1 to copy KIT settings (FX etc…) from the selected kit to the current kit.[/li]
[li]if SMP is 1, set ENV toggle to 1 to copy KIT settings + sequencer FX track from the selected pattern/kit to the current pattern/kit[/li]
[li]if SMP is 0, set LFO toggle to 1 to copy the entire selected KIT to the current KIT[/li]
[li]if SMP is 1, set LFO to 1 to copy the entire selected PATTERN+KIT to the current PATTERN+KIT[/li]
[/ul]

so this is a bit weird and takes some practise to learn, but it does work really well once you feel it.

Ok for example, you are in pattern A and want to mix into pattern B track by track.
[ul]
[li]go to FX track[/li]
[li]set SYN to 1[/li]
[li]set SMP to 1, to enable MEGAMIX[/li]
[li]select pattern B’s position using VEL[/li]
[li]press a pad or trig to copy a track from pattern B to pattern A[/li]
[li]repeat with more tracks[/li]
[li]note that the kit’s FX/scenes etc. are still from pattern A’s kit.[/li]
[li]set ENV to 0, then to 1, to grab pattern B’s kit’s FX/Scenes etc.[/li]
[li]set LFO to 0, then to 1, to grab the entire pattern B with its kit. transition complete.[/li]
[/ul]

of course you can go crazy and mash up all the patterns/kit that you have by messing with the VEL thing. :imp:

so, about copying/overwriting etc:

[ul]
[li]anything which happens to the PATTERNS, will overwrite your current pattern, and there is NO UNDO.[/li]
[li]anything with KITS will copy data into the current KIT. you can reload KIT or SOUND.[/li]
[/ul]

so it’s best to start out with an empty pattern, and load an empty/unused kit into it, unless you deliberately want to mess up your existing patterns.

another thing to keep in mind:
the parameter’s on the FX trig page may not always reflect the state of the app correctly.
after launching the app, or manually changing pattern on the AR, settings may be incorrect.
if in doubt, set the relevant parameters (VEL, SYN, SMP, ENV, LFO) to the settings you want, to let the app pick up the right values.

as before, there’s some settings in the Rytm GLOBALS which you need to set up:
[ul]
[li]MIDI CHANNELS: track channels must be 1-12, FX = 13 (which is the default)[/li]
[li]MIDI Port Config: IN/OUT must be USB or USB & MIDI[/li]
[li]MIDI Port Config: OUTPUT CHANNEL must be TRACK CHANNEL[/li]
[li]MIDI Port Config: PARAM OUTPUT must be CC[/li]
[li]SYSTEM/USB-Config must be USB-MIDI ONLY[/li]
[/ul]

BÄMM… sounds freaktastic…
so this will be my next free weekend :-)))

Cheers to you!!!

AMAZEBALLZ

I would love to make a pattern generator or drag and drop midi pattern sender, but I think I am too stupid. I managed to dissect a kit dump, even randomise a few bits, but, that was pretty intense… My single triumph was getting the correct checksum. But Sysex packing and unpacking is a deep mystery to me. Anyone who can do that is the Hex Lord.

it wasn’t easy! :stuck_out_tongue_winking_eye:

learned a ton about bits/bytes and computer memory during the process…
at some point even wrote my own little hex analyser thing just for this, to compare diffs between different kits/patterns/etc…:

it can read data straight from the machine, unwrap it from the sysex container and has a few modes for highlighting structures, comparing diffs etc…
basically: press space, tweak a knob, press space, look at data, rinse repeat… made things much easier.

then for every data type, there’s an OOP wrapper class and a bunch of helper functions so that working with the data is straightforward.

e.g. copying a track between two patterns, including p-locks & proper handling of track lengths etc.:

- (void)copyPattern:(ARPattern *)patternA track:(uint8_t)trackA
          toPattern:(ARPattern *)patternB track:(uint8_t)trackB
{
    [patternB clearTrack:trackB];
    
    ARPatternTimeMode sourceTimeMode = patternA.timeMode;
    ARPatternTimeMode targetTimeMode = patternB.timeMode;
    int sourceLen = sourceTimeMode == ARPatternTimeModeNormal ? patternA.masterLength : [patternA track:trackA].settings->trackLength;
    int targetLen = targetTimeMode == ARPatternTimeModeNormal ? patternB.masterLength : sourceLen;
    
    *[patternB track:trackB].settings = *[patternA track:trackA].settings;
    [patternB track:trackB].settings->trackLength = targetLen;
    
    int sourceStep = 0, targetStep = 0;
    for(; targetStep < targetLen; targetStep++)
    {
        ARTrig sourceTrig = [patternA trigAtStep:sourceStep inTrack:trackA];
        [patternB setTrig:sourceTrig atStep:targetStep inTrack:trackB];
        
        ARPVal locks[72];
        uint8_t numLocks = 0;
        if(ARLocksForTrackAndStep(patternA, sourceStep, trackA, locks, &numLocks))
        {
            for(int i = 0; i < numLocks; i++)
            {
                [patternB setLock:locks[i] atStep:targetStep inTrack:trackB];
            }
        }
        
        sourceStep++;
        if(sourceStep == sourceLen)
            sourceStep = 0;
    }
}

the entire MIDI communication is similarly abstracted away…

e.g. in the Kitten app, to load any kit into the current kit buffer, it’s just:

- (void) switchKit:(int)offset
{
    // keys is an array of string descriptors of the stuff you want to read from the machine.
    NSString *key = [NSString stringWithFormat:@"kit.%d", offset];
    NSLog(@"switching to %@", key);
    
    [ARRequest requestWithKeys:@[key]
             completionHandler:^(NSDictionary *dict) {
                 
                 ARKit *kit = dict[key];
                 [kit sendTemp]; // sendTemp sends kit to the current buffer
                 
             } errorHandler:^(NSError *err) {
                 
             }];
}

pretty much like a http request :smiley:
so yeah this stuff was so a ton of work but it’s very reliable now and allows new features to be developed quickly…

Now that is a thing of beauty! I made a kind of difference analyser in max to spot which bytes are changing, but looks like you made the red pill…

Thanks for the work void!

How many times a day do I need to feed my new Kitten? :joy:

128^12 times :stuck_out_tongue_winking_eye:

(the beginning got a bit weird, somehow there’s some stray button-pressing sounds in there :confused: )

you’re a genius !

and the slo mo jungle kinda beats around 4 min deserve a fat track on vinyl
:wink:

great :+1:

this is pretty fantastic. awesome work, void!

holy shit, you are an animal. thanks void! can’t wait to try this out.

whiners are so boring.

so uh, anybody using this?

I’ve been too busy with projects to give it a proper go.
Things are calming down now though and I’m hoping to use it this month…if it proves stable enough I’ll use it in a live set at the end of the month.