Audiobus: Use your music apps together.

What is Audiobus?Audiobus is an award-winning music app for iPhone and iPad which lets you use your other music apps together. Chain effects on your favourite synth, run the output of apps or Audio Units into an app like GarageBand or Loopy, or select a different audio interface output for each app. Route MIDI between apps — drive a synth from a MIDI sequencer, or add an arpeggiator to your MIDI keyboard — or sync with your external MIDI gear. And control your entire setup from a MIDI controller.

Download on the App Store

Audiobus is the app that makes the rest of your setup better.

MOZAIC - Create your own AU MIDI plugins - OUT NOW!

17576788081102

Comments

  • _ki_ki
    edited August 2020

    @TheOriginalPaulB You probabbly didn‘t fully get what i wanted to achieve:

    My LabelPads look more like:

    @SetPadLabelMainModeThru // param pMode, pPad,pOff, pDrp,pVel,pTra  
      if     (pMode&0xFFF) = 0x000  // No Drop or Grid      
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{  .},{                 .},{                 .}
      elseif (pMode&0xF1F) = 0x010  // vel
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{  .       },{ Vel.}, pVel[0],{⎹},pVel[1],{%},{       .}
      elseif (pMode &0xF12) = 0x012 // vel +rndTrn 
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{  .       },{ Vel.}, pVel[0],{⎹},pVel[1],{%}, { Tra.},pTra[0],{⎹},pTra[1],{%}
      elseif (pMode &0xF11) = 0x011 // vel + trn 
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{  .       },{ Vel.}, pVel[0],{⎹},pVel[1],{%}, { Transp.},pTra[0]
      elseif (pMode&0xFF2) = 0x002  // rndTrn 
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{  .        },{         .    },{ Tra.},pTra[0],{⎹},pTra[1],{%}
      elseif (pMode&0xFF1) = 0x001  // trn
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{  .        },{         .     },{ Transp.},pTra[0]
      // Grid
      elseif (pMode&0x2FF) = 0x200  // grid 
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},pDrp[0],{/}, pDrp[1],{ }, pDrp[2],{⎹}, pDrp[3],{       . },{                .}
      elseif (pMode&0x21F) = 0x210  // grid  +  vel
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},pDrp[0],{/}, pDrp[1],{ }, pDrp[2],{⎹}, pDrp[3],{      },{ Vel.}, pVel[0],{⎹},pVel[1],{%}, {       .}
      elseif (pMode&0x212) = 0x212  // grid  +  vel + rndTrn 
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},pDrp[0],{/}, pDrp[1],{ }, pDrp[2],{⎹}, pDrp[3],{      },{ Vel.}, pVel[0],{⎹},pVel[1],{%}, { Tra.},pTra[0],{⎹},pTra[1],{%}
      elseif (pMode&0x211) = 0x211  // grid  +  vel + trn 
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},pDrp[0],{/}, pDrp[1],{ }, pDrp[2],{⎹}, pDrp[3],{      },{ Vel.}, pVel[0],{⎹},pVel[1],{%}, { Transp.},pTra[0]
      elseif (pMode&0x2F2) = 0x202  // grid  +  rndTrn 
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},pDrp[0],{/}, pDrp[1],{ }, pDrp[2],{⎹}, pDrp[3],{       .     }, { Tra.},pTra[0],{⎹},pTra[1],{%}
      elseif (pMode&0x2F1) = 0x201  // grid  +  trn 
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},pDrp[0],{/}, pDrp[1],{ }, pDrp[2],{⎹}, pDrp[3],{       .      }, { Transp.},pTra[0]
      // Drop    
      elseif (pMode&0x1FF) = 0x100  // drop
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{Drop },pDrp[2],{%         . },{                .}    
      elseif (pMode&0x11F) = 0x110  // drop + vel
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{Drop },pDrp[2],{%       },{ Vel.}, pVel[0],{⎹},pVel[1],{%}, {       .}    
      elseif (pMode&0x112) = 0x112  // drop +  vel + rndTrn     
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{Drop },pDrp[2],{%       },{ Vel.}, pVel[0],{⎹},pVel[1],{%}, { Tra.},pTra[0],{⎹},pTra[1],{%}
      elseif (pMode&0x111) = 0x111  // drop +  vel + trn 
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{Drop },pDrp[2],{%       },{ Vel.}, pVel[0],{⎹},pVel[1],{%}, { Transp.},pTra[0]
      elseif (pMode&0x1F2) = 0x102  // drop + rndTrn 
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{Drop },pDrp[2],{%        .     },{ Tra.},pTra[0],{⎹},pTra[1],{%}  
      elseif (pMode&0x1F1) = 0x101  // drop + trn 
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{Drop },pDrp[2],{%        .     }, { Transp.},pTra[0]
      // ERROR     g
      else 
        LabelPad pPad, pPad+1,{ Thru        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾},{‼️ },pMode, { d},pDrp[0],{ },pDrp[1],{ },pDrp[2],{ },pDrp[3],{ v},pVel[0],{ },pVel[1],{ t},pTra[0],{ },pTra[1]
      endif
      ColorPad pPad,0  
    @End
    

    And there are 5 function exactly the same with the only difference in the first word ‚Thru‘. There is another one for ‚Apply‘, one for ‚Mute‘ etc all with the same sub-cases.

    .

    For setting the config names (in config mode also using pad layout), i have a different code with a long if cascade for 18 different config descriptions:

    @SetPadLabelConfigMode // param pPad
      _cnf  = bank*16 + pPad
      _name = confName[_cnf]
      if _name = NAME_NONE and confChanged[_cnf]
        LabelPad pPad,{.                },  {«  »     },{        .},{    ___________ },{Config },_cnf+1
      elseif _name = NAME_NONE
        LabelPad pPad,{.},{                 .},{                 .},{    ___________ },{Config },_cnf+1
      else
        _pos = _name % 100
        _c   = (Div _name,100) % 10
        _tmp =  (Div _name,1000) + 1    
        if _pos = 0
          LabelPad pPad,{.                },{Break        },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 1
          LabelPad pPad,{.                },{Breakdown    },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 2
          LabelPad pPad,{.                },{Bridge       },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 3
          LabelPad pPad,{.                },{Buildup      },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 4
          LabelPad pPad,{.                },{Chorus       },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 5
          LabelPad pPad,{.                },{Drop         },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 6
          LabelPad pPad,{ .                },{.  Fill  .      },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 7
          LabelPad pPad,{.                },{Hook         },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 8
          LabelPad pPad,{ .                },{. Intro .       },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 9
          LabelPad pPad,{.                },{Middle 8     },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 10
          LabelPad pPad,{.                },{Motif        },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 11
          LabelPad pPad,{.                },{Outro        },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 12
          LabelPad pPad,{.                },{Part          },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 13
          LabelPad pPad,{.                },{Pre-Chorus   },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 14
          LabelPad pPad,{.                },{Refrain      },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 15
          LabelPad pPad,{.                },{Solo         },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 16
          LabelPad pPad,{.                },{Variation    },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        elseif _pos = 17
          LabelPad pPad,{.                },{Verse        },(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
        else
          LabelPad pPad,{.                },{‼️ ERROR     },_name,{    ___________ },{Config },_cnf+1
        endif
      endif
    
      if _cnf=config
        ColorPad pPad, 4
      else
        ColorPad pPad, bankCol[bank]
      endif
    @End
    

    The different length of the sub-strings is essential to keep the correct multi line layout, can‘t work with fixed string length here as the letters have different width

    .

    Using the indexed string thingy, i would set it up as

      SetString 0,  {Break         },{Breakdown. }, {Bridge       }, {Buildup      }, {Chorus       } , {Drop         }
      SetString 6, ,{.  Fill  .      } ,{Hook         }, {. Intro .       } ....
      ....
      SetStrings 30, {Thru    }, {Apply  }, {Mute    },{Apply To},{Mute To}
    

    And then can collapse the 5 Main mode funtions into just one, exactly like above, with all the various cases for outputing different 4 lines, depending on pMode. But instead of the fixed „Thru“ string all lines would have an String(30 + mode) parameter that would output one of the 5 modes. Voila 30 lines instead of 150.

    .

    And the if-cascade used in the config mode lableing would collapse to:

    @SetPadLabelConfigMode // param pPad
      _cnf  = bank*16 + pPad
      _name = confName[_cnf]
      if _name = NAME_NONE and confChanged[_cnf]
        LabelPad pPad,{.                },  {«  »     },{        .},{    ___________ },{Config },_cnf+1
      elseif _name = NAME_NONE
        LabelPad pPad,{.},{                 .},{                 .},{    ___________ },{Config },_cnf+1
      else
        _pos = _name % 100
        _c   = (Div _name,100) % 10
        _tmp =  (Div _name,1000) + 1    
        LabelPad pPad,{.                },String(pos),(NoteName ABCDEFG[_c],NO),{-},_tmp,{    ___________ },{Config },_cnf+1
      endif
    

    No if-cascade in the lower part, just a single variant using String(pos) adding one of the 17 different strings.

    .

    BTW: I can emulate the behavior of my two functions by just using the single Chr(num) function that someone suggested as a single-function alternative.
    I would setup array containg the ascii or unicode numbers for the strings i want to output (like ‚Thru‘ => [0x54, 0x72, 0x75, 0x65, 0x20] followed by the numbers for ‚Apply‘ and ‚Mute‘, each with 5 fixed letters) and then use Chr(p+0),Chr(p+1),Chr(p+2),Chr(p+3),Chr(p+4) indexing into the array and still get 5 dynamic chars.

    .

    All examples taken from the Mutator script, that contains 560 lines for setting pad and knob labels, that would compress down to about 170 lines. Still a lot, since there are many different cases but less to type and having something like this also opens up new use-cases.

    .

    @TheOriginalPaulB said:
    On reflection, Ki’s scheme would be overkill. Given that the majority of controls are not visible in any one layout, but are still referenceable, all that would be needed would be two functions, GetKnobLabel num and GetPadLabel num. These would only be useable in Log and Label calls in the same way as NoteName, etc., so they would use mechanisms that are already in place and would not affect the rest of the Mozaic engine. That way, building a dynamic compound label would be as easy as

    LabelPad 0, (GetKnobLabel 20), { : }, (GetKnobLabel 21)

    assuming one has already assigned labels to Knobs 20 and 21.

    Simples...

    Nope, Mutator features 14 different visible pages, all with dynamic updated labeling, the 2 pad view have aligned multi-line pad labels as shown above. Your idea of referencing other already assigned knobs or pads label wouldn‘t help at all in my use-cases. They are all unique and there are a lot of label variants.

    .

    But as you can see, i got my complex labeling done - even without new functions :)

  • This tells I’m going to do everything in my power to label my knobs as little as possible 😬

  • _ki_ki
    edited August 2020

    Hupps, i didn‘t want to scare you or anyone else

  • Nah, it’s the endless variables I’m inventing that are giving me the creeps right now, I’ve actually moved over to the desktop so that I can copy / paste and find / replace effectively... a good push and this thing will (hopefully) sing!

  • edited August 2020

    @_ki Don’t assume I didn’t get what you were trying to do. I just wasn’t trying to address it. Most folks would be happier with something far simpler and more obvious.

    However, a moot point, I guess. All of this can be worked around with enough lines of code, but 90% of the time people won’t bother.

  • @Krupa said:
    This tells I’m going to do everything in my power to label my knobs as little as possible 😬

    I rest my case. :)

  • @TheOriginalPaulB Sorry, i didn‘t want to offend you. And i understood you wrongly, thought it was meant as another general alternative to the if-cascade labeling topic.

    .

    I myself like to add such complex labels - and for most of the scripts i‘m probably the only user :)

  • _ki_ki
    edited August 2020

    BTW, here the visual results of the above MutatoR code snippets:

    First code snippet was for CHANNEL View:

    Pads summarize the mutations done to each channel, their mode (Apply, Mute, Thu) or output redirection (Apply >> CH) - listing only the active mutations for note drops, velocity or transpose. Thats why there are at least 9 variants. But indeed there are two different layouts for note drops and transposes, resulting in the above number of variants in the if-cascade.

    And the second snippet was for the CONFIG View:


    Configs are either default blank, un-named but different to default or use one of the 18 type descriptions as label.

    There are 13 other views, mostly in 22 knob mode.

    .

    Channel Mode page:

    3 Note Drop pages (animated gif)

    The second of them (Drop Pattern Editor) featuring an visualizer on the righ hand knobs:

    with pattern animation if the hosts timeline is running:

    Two pages for note velocity mutations

    Four pages for note transpose mutations

    SWAP/COPY with different blinking pattern in CONFIG View and in CHANNEL View

    And a Help view

    .

    For many of the ‚visual‘ FX i needed to use unicode (for instance the underlining in the Pattern Editor / VIsualizer, the different fonts in the titles and several special chars like » all over the place)

    .

    All in all thats 64 configs for 16 channels with 12 setups per channel (and several config specific things) - around 12000 possible parameters in total , dialed in with the 22 knobs.
    A script complex as this one is only usable (and maybe even user friendly) with complex labeling.

    .

    And yes - i know i‘m quite crazy :p

    .

    Developing such a moster script for such a norrow use-case (needing a multi channel midi setup with pattern generators and sequencers as input). But i use it myself and enjoy the labeling - thats enough reason to script it.

    Since multi-channel midi setups are not commonly used, i will provide a long documentation for the scripts release. And also an AudioBus session containing such a setup to experience what the script can offer. And after trying out, maybe, maybe there will one or two other musicians using MutatoR it in their live jams or sessions.

    Otherwise i just use it myself

  • @_ki said:
    @TheOriginalPaulB Sorry, i didn‘t want to offend you.

    Not a problem.

    And i understood you wrongly, thought it was meant as another general alternative to the if-cascade labeling topic.

    It kinda was... just for the 99% of scripters not coding something as complex as MutatoR. I imagine most scripts only use 1 layout, maybe 2.

  • _ki_ki
    edited August 2020

    I know its a monster script - but hope that for the ‚end-user‘ the MutatoR script is still simple to use and has a clear structure regardless of the more than 12000 possible parameters.

    The CHANNEL View shown above nicely summarizes 192 parameters for each config and since one can ‚name‘ each config (musical part from the given list plus „letter - number“) , it can be easiliy identified and issued on the CONFIG View. Its simple to copy a config, do some further modifications, change the name etc, to extend the jam session. And stuff (configs, channels) can be re-arranged via SWAP operations.

    .

    All these views (ie the summary or swap/copy) originated from using the script and trying to make it more accessible (to myself). I added what i found was lacking.

    There are also tons of ‚shortcuts‘ that are all listed in the documentation. So instead of turning the chan/CONF knob you can double tap it, or double-tap the shift button. There is one thing shown visually on the knob labels (or in the title label), but a different and maybe faster interaction for the experienced user (aehmm, me)

  • @_Ki is what happens when you apply your complete attention to a skill over a period of 10,000 hours.
    What I like is that like "MIDI recordings" of chopin I can copy his techniques without ever mastering
    all the required skills to create it in short order.

    When I want to add some labeling feature or data management trick I "read the masters":

    @_Ki (he's usually working beyond my reading level)
    @Wim often writes and comments his techniques clearly
    and any other script that I use that works like magic

    Any "patch" you download and install in Mozaic is immediately readable. Downloading it on
    a laptop is also an easy way to read it and with @_Ki syntax high-lighting for Textastic you can
    get extra enlightenment. THere's a Textastic app for MacOS from the Mac App Store. You just have to
    change the file extension to .moz from .mozaic. It looks like this in Textastic:

  • _ki_ki
    edited August 2020

    Your SetTimer (just before the @End) seems to miss a parameter, that‘s why the next available line is highlighted in error red .

    And the ... are not allowed chars for starting a line. So the first . is error highlighted and the rest of the line ‚invalidated‘ in purple.

  • _ki_ki
    edited August 2020

    The highlighter follows the Mozaic language very tightly and in several cases i managed to sneak in some error messages: Just place the cursor on the first red character and (in textastic) press shift control P (in Sublime use the Show Context command) to list the current contexts.

    • The ... case it will show ‚_SYNTAX_ERROR:_unexpected_character“ as one of the contexts.

    • For the case with the missing SetTimer parameter, there‘s no such extra handling as the error is detected too late, ie when reaching the end of line or a comment character - maybe in a future version :)

  • BTW: A .mozic file is binary and will contain several chunks of dada blocks in addition to the readable script text, that might be problematic for the text-editor. Its better to load the script into Mozaic, open the script editor, press ‚Select All‘ and then ‚Copy‘ and paste the whole lot into the external text editor.

  • @_ki said:
    Its better to load the script into Mozaic

    I like to download and read scripts on my Mac using your text highlighting for Textastic. The graphic
    above was an example of highlighting from somebodies "Chord Detect" script as displayed in Textastic
    on my Mac.

  • _ki_ki
    edited August 2020

    Just published a single view script:

    Apply Swing applies swing to all midi-streams. Notes around odd 1/16 or 1/8 are shifted to a later beat division:

    Its patchstorage page also contains a link to an AUM session to experiment with this multi channel midi script.

    Look, only 4 knobs with minimal labeling....... but i did smuggle in an optional graph in the log window :)

  • Hiya @brambos - I hope you don’t mind yet another loose thought triggered enhancement suggestion: ability to “inject” midi into the app. We have the nice delayed midi message commands. It would be totally fantastic if Mozaic had a way to internally loop a midi command back into the script. There would be hundreds of uses for this and much code could be saved, particularly where timers are now used.

    Or, or maybe additionally, being able to make a delayed call to an event: Call @Myevent [, <optionaldelay>].

    I can think of sooooo many ways this would cut down on complex code.

  • I finally (yeah!) posted MutatoR :)

    find more information and links to the scripts, its documentation and the demo session in its own thread

    .

    It's my it's my longest and most comprehensive script yet, its near Mozaic's max-script-size limit due to its complex UI featuring 14 different views which hopefully are still easy to use and distinguish.

  • @_ki said:
    I finally (yeah!) posted MutatoR :)

    Can you add a RotatuM mode?

    I'll bet this is going to be a real workhorse controller/generator for a lot of styles.

    Demos! Demos! Demos!
    As always "Free Cookies" are on me for anyone willing to contribute.

    @_ki I put your free cookie at https://www.reddit.com/r/iOSProgramming/
    Bon appetite.

  • Hello everybody,
    maybe someone can help me on this.
    I use an MPE controller, the Seaboard Rise, and I can't get all the expressive dimensions (e.g. slide, glide) when I use the following script:

    @OnMidiInput
    if MIDICommand = 0x90 or MIDICommand = 0x80
    SendMIDIOut MIDIByte1, MIDIByte2 + x, MIDIByte3
    endif
    @End

    The variable x in MIDIByte2 increments the incoming note but for some reason slide and glide don't work.

    Thanks for any suggestion or clarification.

  • _ki_ki
    edited October 2020

    @Darwin Mozaic doesn‘t forward any midi messages by itself and your script snippet only sends out notes info - thereby removing the CCs and other things needed for MPE.

    @OnMidiInput
      if MIDICommand = 0x90 or MIDICommand = 0x80
        SendMIDIOut MIDIByte1, MIDIByte2 + x, MIDIByte3
      else
        SendMIDIThru
      endif
    @End 
    

    The above ‚else‘ part forwarding all other events than NoteOn and NoteOff should help

  • @_ki said:
    @Darwin Mozaic doesn‘t forward any midi messages by itself and your script snippet only sends out notes info - thereby rmoving the CCs and other things needed for MPE.

    @OnMidiInput
      if MIDICommand = 0x90 or MIDICommand = 0x80
        SendMIDIOut MIDIByte1, MIDIByte2 + x, MIDIByte3
      else
        SendMIDIThru
      endif
    @End 
    

    The above ‚else‘ part forwarding all other events than NoteOn and NoteOff should help

    Yes!!! It work now.
    Thank you!

  • Has someone written a Mozaic script that simply records a series of incoming notes (with no timing info) and then sends those notes out in sequence (one per trigger) when a specified trigger is received? The sequence would start again from the beginning when the last in the series is sent out.

  • Sounds simple - but i didn‘t find it in the script list

  • @_ki said:
    Sounds simple - but i didn‘t find it in the script list

    I’m off to write it now.

  • McDMcD
    edited October 2020

    @espiegel123 said:
    Has someone written a Mozaic script that simply records a series of incoming notes (with no timing info) and then sends those notes out in sequence (one per trigger) when a specified trigger is received? The sequence would start again from the beginning when the last in the series is sent out.

    @hypnopad requested this type of triggered sequencer and I think @wim built it. It's called "Hypno Sequence".

  • wimwim
    edited October 2020

    @McD said:

    @espiegel123 said:
    Has someone written a Mozaic script that simply records a series of incoming notes (with no timing info) and then sends those notes out in sequence (one per trigger) when a specified trigger is received? The sequence would start again from the beginning when the last in the series is sent out.

    @hypnopad requested this type of triggered sequencer and I think @wim built it. It's called "Hypno Sequence".

    HypnoSequence is close to this, but missing the sequential recording aspect. You have to tap each step of the sequence then input a note.

  • @wim said:

    @hypnopad requested this type of triggered sequencer and I think @wim built it. It's called "Hypno Sequence".

    HypnoSequence is close to this, but missing the sequential recording aspect. You have to tap each step of the sequence then input a note.

    If your bored that would be a nice enhancement to add a "RECORD START", "RECORD STOP"
    function. I suspect you could pull it off in a few hours if there is room to move about the GUI.
    You might pull it off with a single toggling PAD. But only if you're bored. :^)

  • @espiegel123 - As an alternative, here's a really simple non-coding approach using miRack with the Write-Seq-64 sequencer, replacing the clock input with a midi-trigger in. Disengage Run 1-4 and send on channel 1 to record the sequence. Engage Run 1-4 and send C2 on channel 2 to play back step-wise.

  • @wim Cool idea 👍🏼 and sorry i forgot about the Hypno Sequence. It also was missing on the Mozaic script list on the wiki, so i just added it.

Sign In or Register to comment.