Loopy Pro: Create music, your way.

What is Loopy Pro?Loopy Pro is a powerful, flexible, and intuitive live looper, sampler, clip launcher and DAW for iPhone and iPad. At its core, it allows you to record and layer sounds in real-time to create complex musical arrangements. But it doesn’t stop there—Loopy Pro offers advanced tools to customize your workflow, build dynamic performance setups, and create a seamless connection between instruments, effects, and external gear.

Use it for live looping, sequencing, arranging, mixing, and much more. Whether you're a live performer, a producer, or just experimenting with sound, Loopy Pro helps you take control of your creative process.

Download on the App Store

Loopy Pro is your all-in-one musical toolkit. Try it for free today.

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

13435373940106

Comments

  • @brambos said:

    @Peblin said:
    @brambos Question re: array size...

    What’s the rationale for 1000 items per array? Would it be possible to change this to allow for larger arrays? It seems slightly arbitrary and makes it really hard to do anything that would benefit from a multi-dimensional array (for example, a sequencer of N patterns, with M steps, having X subdivisions and Y voices). 1000 items can only fit 31x31.

    If it’s feasible it would be amazing to be able to have arrays of 100 000+ items. If not then at least maybe 1024 so I can have an 8-pattern/128-step sequencer in one array :dizzy:

    It has to do with the realtime loop not allowing dynamic memory allocation. So variables are pre-allocated so they can be used in the fastest way possible whenever an event needs them (a sort of memory heap). Therefore I have to set limits. Whatever I’d pick, it would always seem arbitrary for some use cases.

    Ah. I see. When is the allocation done? Would it be possible to have size declaration in the language, like dim patterns(8*64*6) and allocate based on that during OnLoad? (Mainly asking from a curiosity perspective, I fully respect if you don’t want to bloat Mozaic)

    However...would be neat to have the ”arbitrary” 1000 upped to 1024 to have the max array size a power of two to support many sequencer use cases. :smiley:

  • edited July 2019

    Just catching up on some of these amazing scripts.

    A huge thanks to @recccp for his stop recording script that has made AUM so dreamy to record with. https://www.dropbox.com/s/1q816e5ql4jdwlt/StopRec.mozaic?dl=0

    @Bryan Metroplex is insane!

    Plus it really helped me understand how to make some things I was struggling to do myself.

  • edited July 2019

    Please help
    How can i use midi cc,s for external control each of these 4 knobs? For example cc13 for knob 1 cc14 knob 2 cc15 knob 3 cc16 knob 4

    @Onload
    
     ShowLayout 0
    
     LabelKnobs {humaniz} 
     LabelKnob 0, {min time} 
     LabelKnob 1, {max time} 
     LabelKnob 2, {min vel}
     LabelKnob 3, {max vel} 
    
    @End 
    
    @OnMIDINoteOn
      delayMax = TranslateScale (GetKnobValue 1), 0, 127, 0, 500
      delayMin = TranslateScale (GetKnobValue 0), 0, 127, 0, 500
      delay = Random delayMin, delayMax
      vel = Random (GetKnobValue 2), (GetKnobValue 3)
      SendMIDINoteOn MIDIChannel, MIDINote, vel, delay
    
      // remember the delay we're using for Note Off
      SetNoteState MIDIChannel, MIDINote, delay
    
    
    @End
    
    @OnMIDINoteOff
      // get the delay we used for this note
      delay = GetNoteState MIDIChannel, MIDINote
      SendMIDINoteOff MIDIChannel, MIDINote, 0, delay
    @End
    
  • wimwim
    edited July 2019

    @pejman said:
    Please help
    How can i use midi cc,s for external control each of these 4 knobs? For example cc13 for knob 1 cc14 knob 2 cc15 knob 3 cc16 knob 4

    @Onload
    
     ShowLayout 0
      
     LabelKnobs {humaniz} 
     LabelKnob 0, {min time} 
     LabelKnob 1, {max time} 
     LabelKnob 2, {min vel}
     LabelKnob 3, {max vel} 
    
    @End 
    
    @OnMIDINoteOn
      delayMax = TranslateScale (GetKnobValue 1), 0, 127, 0, 500
      delayMin = TranslateScale (GetKnobValue 0), 0, 127, 0, 500
      delay = Random delayMin, delayMax
      vel = Random (GetKnobValue 2), (GetKnobValue 3)
      SendMIDINoteOn MIDIChannel, MIDINote, vel, delay
    
      // remember the delay we're using for Note Off
      SetNoteState MIDIChannel, MIDINote, delay
    
    
    @End
    
    @OnMIDINoteOff
      // get the delay we used for this note
      delay = GetNoteState MIDIChannel, MIDINote
      SendMIDINoteOff MIDIChannel, MIDINote, 0, delay
    @End
    

    The best way IMO is to map the cc's to the AU parameters for those knobs in the host. This is the most flexible and requires no code at all. But if you really want to do it that way, I'll post some code.

  • edited July 2019

    @wim said:

    @pejman said:
    Please help
    How can i use midi cc,s for external control each of these 4 knobs? For example cc13 for knob 1 cc14 knob 2 cc15 knob 3 cc16 knob 4

    ```

    The best way IMO is to map the cc's to the AU parameters for those knobs in the host. This is the most flexible and requires no code at all. But if you really want to do it that way, I'll post some code.

    Hi wim
    How can i map cc’s to AU parameters ? I use mozaic in cubasis app .
    Although I'm very interested in knowing those codes .To raise my knowledge , if possible please.

  • wimwim
    edited July 2019

    @pejman said:

    @wim said:

    @pejman said:
    Please help
    How can i use midi cc,s for external control each of these 4 knobs? For example cc13 for knob 1 cc14 knob 2 cc15 knob 3 cc16 knob 4

    ```

    The best way IMO is to map the cc's to the AU parameters for those knobs in the host. This is the most flexible and requires no code at all. But if you really want to do it that way, I'll post some code.

    Hi wim
    How can i map cc’s to AU parameters ? I use mozaic in cubasis app .
    Although I'm very interested in knowing those codes .To raise my knowledge , if possible please.

    Hi @pejman, I’m pretty sure there must be a way to do that in Cubasis, but I don’t know it well enough to say how. Maybe someone else can answer that.

    In the meantime, here’s some added code that should do what you want.

    @Onload
    
     ShowLayout 0
    
     LabelKnobs {humaniz} 
     LabelKnob 0, {min time} 
     LabelKnob 1, {max time} 
     LabelKnob 2, {min vel}
     LabelKnob 3, {max vel}
    
     // change these to assign different cc's to the knobs
     cc[0] = [13, 14, 15, 16]
    
    @End 
    
    @OnMIDINoteOn
      delayMax = TranslateScale (GetKnobValue 1), 0, 127, 0, 500
      delayMin = TranslateScale (GetKnobValue 0), 0, 127, 0, 500
      delay = Random delayMin, delayMax
      vel = Random (GetKnobValue 2), (GetKnobValue 3)
      SendMIDINoteOn MIDIChannel, MIDINote, vel, delay
    
      // remember the delay we're using for Note Off
      SetNoteState MIDIChannel, MIDINote, delay
    
    @End
    
    @OnMIDINoteOff
      // get the delay we used for this note
      delay = GetNoteState MIDIChannel, MIDINote
      SendMIDINoteOff MIDIChannel, MIDINote, 0, delay
    @End
    
    @OnMidiCC
    
      // check the array to see if the cc is assigned to a knob
      // MIDIByte2 is the cc number
      // MIDIByte3 is the cc value
      for i = 0 to 3
        if cc[i] = MIDIByte2
          SetKnobValue i, MIDIByte3
          Exit
        endif
      endfor
    
      // Remove this if you don't want other cc's being passed thru
      SendMIDIThru
    
    @End
    
  • wimwim
    edited July 2019

    @pejman, here’s one that does the same thing but in a less abstract way. This one is probably easier to understand and modify.

    @Onload
    
      // change these to the cc's you want to use
      mintimecc = 13
      maxtimecc = 14
      minvelcc = 15
      maxvelcc = 16
    
     ShowLayout 0
    
     LabelKnobs {humaniz} 
     LabelKnob 0, {min time} 
     LabelKnob 1, {max time} 
     LabelKnob 2, {min vel}
     LabelKnob 3, {max vel} 
    
    @End
    
    @OnMidiCC
      if MIDIByte2 = mintimecc
        SetKnobValue 0, MIDIByte3
      elseif MIDIByte2 = maxtimecc
        SetKnobValue 1, MIDIByte3
      elseif MIDIByte2 = minvelcc
        SetKnobValue 2, MIDIByte3
      elseif MIDIByte2 = maxvelcc
        SetKnobValue 3, MIDIByte3
      else
        // comment this out if you don’t want other cc’s to pass thru
        SendMIDIThru
      endif
    @End  
    
    @OnMIDINoteOn
      delayMax = TranslateScale (GetKnobValue 1), 0, 127, 0, 500
      delayMin = TranslateScale (GetKnobValue 0), 0, 127, 0, 500
      delay = Random delayMin, delayMax
      vel = Random (GetKnobValue 2), (GetKnobValue 3)
      SendMIDINoteOn MIDIChannel, MIDINote, vel, delay
    
      // remember the delay we're using for Note Off
      SetNoteState MIDIChannel, MIDINote, delay
    
    @End
    
    @OnMIDINoteOff
      // get the delay we used for this note
      delay = GetNoteState MIDIChannel, MIDINote
      SendMIDINoteOff MIDIChannel, MIDINote, 0, delay
    @End
    
  • edited July 2019

    @wim said:
    @pejman, here’s one that does the same thing but in a less abstract way. This one is probably easier to understand and modify.

    Very very thanks. They were , very informative ,( both codes ) .Each time I learn something new, I become more hopeful , that one day I can make my own patches ,with the help of you all .
    Although some of my ideas, seem to be very difficult .

  • edited July 2019

    @wim said:

    The best way IMO is to map the cc's to the AU parameters for those knobs in the host. This is the most flexible and requires no code at all. But if you really want to do it that way, I'll post some code.

    Hi @pejman, I’m pretty sure there must be a way to do that in Cubasis, but I don’t know it well enough to say how. Maybe someone else can answer that.

    Do you mean midi learn , that the AUM app has it ? I haven’t AUM app . So I'm not exactly familiar with how it works .There is no midi learn option in cubasis for triggers to AU or plugins .
    Anyway if anyone knows anything about this please help .
    Thanks.

  • @pejman said:

    @wim said:

    The best way IMO is to map the cc's to the AU parameters for those knobs in the host. This is the most flexible and requires no code at all. But if you really want to do it that way, I'll post some code.

    Hi @pejman, I’m pretty sure there must be a way to do that in Cubasis, but I don’t know it well enough to say how. Maybe someone else can answer that.

    Do you mean midi learn , that the AUM app has it ? I haven’t AUM app . So I'm not exactly familiar with how it works .There is no midi learn option in cubasis for triggers to AU or plugins .
    Anyway if anyone knows anything about this please help .
    Thanks.

    Yes, I was speaking of AUM, AudioBus, and other apps where you can midi-learn any cc to AU parameters. I’m just not familiar enough with Cubasis to know if this is possible or not. It should be though.

  • edited July 2019

    When creating the Flow sequencer script (https://forum.audiob.us/discussion/34063/flow-multi-track-pattern-midi-sequencer-looper-for-mozaic) I compiled a little wish-list for Mozaic. Some stuff are probably specific to my use case but I think there are some things that would make Mozaic even greater without adding bloat.

    First of all I want to say that I really enjoy the constraints in Mozaic with predefined layouts. It helps staying focused and fuels creativity :) so custom views are NOT on my list.

    Here's my wishes to Santa Bram @brambos :

    • Additional general purpose labelable buttons like SHIFT would make creating UIs easier. Having just SHIFT makes the UIs too convoluted and forces them to use "hold" or "double-tap" for various actions which is super hard to remember.
    • Multi-line labels for pads, breaking on space and with explicit line break marker as well.
    • Pad color, or border, or dot - anything that could be used to indicate a pad state that is not latch.
    • Set secondary knob description - for value. Like SetKnobValueLabel {50%} with SetKnobLabel {Probability}. Eventide Blackhole is a good example showing both label and value.
    • SetKnobRange knob, min, max to get rid of value-translation from the script
    • Realtime CurrentTimeMillis for better timing implementations overall
    • Debug option to be warned when event processing takes more than a pulse in time. It's hard to know if you're doing stuff that will make the script miss pulses.
    • If arrays could be larger than 1000 it would be amazing.
    • String or label concatenation to provide better feedback to the user.
    • Brace syntax is hard to read and external editors doesn’t recognize them as strings. "" would be more convenient. And easier to type on Nordic keyboards :)
    • A layout with faders and a few pads, but no X/Y would be neat :)
  • wimwim
    edited July 2019

    @Peblin said:
    Set secondary knob description - for value. Like SetKnobValueLabel {50%} with SetKnobLabel {Probability}. Eventide Blackhole is a good example showing both label and value.

    I'm curious about this one. I combine description with value in label knobs similar to the example below, and it works OK for me. I think I must not be understanding the request.

    @OnKnobChange
      if LastKnob = 0 then
        LabelKnob 0, {cc }, (Round(GetKnobValue LastKnob))
      endif
    @End
    

    Realtime CurrentTimeMillis for better timing implementations overall

    +1

    Debug option to be warned when event processing takes more than a pulse in time. It's hard to know if you're doing stuff that will make the script miss pulses.

    This is a good one.

    String or label concatenation to provide better feedback to the user.

    Is this something different than the existing LabelKnobs {Hello }, {world!}?

    A layout with faders and a few pads, but no X/Y would be neat :)

    I'd love to see predefined blocks of controls that could be combined on a page. Something like a square of 4 knobs, square of 4 pads, X-Y pad by itself, square of two faders, Text Box square, Blank square ... that one could combine 4 of on a page in any way they like. I can envision a couple of simple functions to define a module by type and the numbers of the controls shown on it, then a layout and the modules used on it. I think this would respect the simplicity and healthy design constraints, while doing a lot to make layouts more practical.

  • edited July 2019

    I wanted a millisecond-resolution time to make a totally unquantized midi looper (and I didn't want to set a per-millisecond timer!)

    I tried to use a combination of a once-per-second timer that would increment a "seconds" count, and a ramp LFO with 1hz frequency and 0-999 range. I would reset the LFO in the timer, and then in the MIDI event handler I would look at the LFO value as the milliseconds timer.

    I couldn't get it working stable unfortunately.

  • @Peblin said:
    When creating the Flow sequencer script (https://forum.audiob.us/discussion/34063/flow-multi-track-pattern-midi-sequencer-looper-for-mozaic) I compiled a little wish-list for Mozaic. Some stuff are probably specific to my use case but I think there are some things that would make Mozaic even greater without adding bloat.

    First of all I want to say that I really enjoy the constraints in Mozaic with predefined layouts. It helps staying focused and fuels creativity :) so custom views are NOT on my list.

    Here's my wishes to Santa Bram @brambos :

    • Additional general purpose labelable buttons like SHIFT would make creating UIs easier. Having just SHIFT makes the UIs too convoluted and forces them to use "hold" or "double-tap" for various actions which is super hard to remember.
    • Multi-line labels for pads, breaking on space and with explicit line break marker as well.
    • Pad color, or border, or dot - anything that could be used to indicate a pad state that is not latch.
    • Set secondary knob description - for value. Like SetKnobValueLabel {50%} with SetKnobLabel {Probability}. Eventide Blackhole is a good example showing both label and value.
    • SetKnobRange knob, min, max to get rid of value-translation from the script
    • Realtime CurrentTimeMillis for better timing implementations overall
    • Debug option to be warned when event processing takes more than a pulse in time. It's hard to know if you're doing stuff that will make the script miss pulses.
    • If arrays could be larger than 1000 it would be amazing.
    • String or label concatenation to provide better feedback to the user.
    • Brace syntax is hard to read and external editors doesn’t recognize them as strings. "" would be more convenient. And easier to type on Nordic keyboards :)
    • A layout with faders and a few pads, but no X/Y would be neat :)

    These are ALL great feature requests. For debugging purposes, I have a few more:

    • statement numbering. It would sure be nice to be able to pinpoint where an error occurs.
    • Increase the maximum number of messages (per pass?) allowed for the Log.
    • Add the ability to clear the log.

    The manual describes the Log as

    “ ... a great tool for passing runtime information about your script to the user or for checking values
    while debugging your script.”

    but the limits of the Log inhibit that.

    I just finished a substantial Mozaic development consisting of 7 scripts which allow for triggering of output MIDI “phrases” based on input MIDI “triggers”. As soon as I’ve stress-tested it, I’ll provide the scripts and a “manual” for its use. It was during the development that I determined the need for my additional features.

  • Sounds interesting! Sort of like some kind of arranger keyboard or auto accompanying script?

    @motmeister said:

    @Peblin said:
    When creating the Flow sequencer script (https://forum.audiob.us/discussion/34063/flow-multi-track-pattern-midi-sequencer-looper-for-mozaic) I compiled a little wish-list for Mozaic. Some stuff are probably specific to my use case but I think there are some things that would make Mozaic even greater without adding bloat.

    First of all I want to say that I really enjoy the constraints in Mozaic with predefined layouts. It helps staying focused and fuels creativity :) so custom views are NOT on my list.

    Here's my wishes to Santa Bram @brambos :

    • Additional general purpose labelable buttons like SHIFT would make creating UIs easier. Having just SHIFT makes the UIs too convoluted and forces them to use "hold" or "double-tap" for various actions which is super hard to remember.
    • Multi-line labels for pads, breaking on space and with explicit line break marker as well.
    • Pad color, or border, or dot - anything that could be used to indicate a pad state that is not latch.
    • Set secondary knob description - for value. Like SetKnobValueLabel {50%} with SetKnobLabel {Probability}. Eventide Blackhole is a good example showing both label and value.
    • SetKnobRange knob, min, max to get rid of value-translation from the script
    • Realtime CurrentTimeMillis for better timing implementations overall
    • Debug option to be warned when event processing takes more than a pulse in time. It's hard to know if you're doing stuff that will make the script miss pulses.
    • If arrays could be larger than 1000 it would be amazing.
    • String or label concatenation to provide better feedback to the user.
    • Brace syntax is hard to read and external editors doesn’t recognize them as strings. "" would be more convenient. And easier to type on Nordic keyboards :)
    • A layout with faders and a few pads, but no X/Y would be neat :)

    These are ALL great feature requests. For debugging purposes, I have a few more:

    • statement numbering. It would sure be nice to be able to pinpoint where an error occurs.
    • Increase the maximum number of messages (per pass?) allowed for the Log.
    • Add the ability to clear the log.

    The manual describes the Log as

    “ ... a great tool for passing runtime information about your script to the user or for checking values
    while debugging your script.”

    but the limits of the Log inhibit that.

    I just finished a substantial Mozaic development consisting of 7 scripts which allow for triggering of output MIDI “phrases” based on input MIDI “triggers”. As soon as I’ve stress-tested it, I’ll provide the scripts and a “manual” for its use. It was during the development that I determined the need for my additional features.

  • I just uploaded a new script on patchstorage.com called CC Processor. This script provides four independent CC processors, each with control over CC level and ballistics in the style of West Coast control voltage processors made by Buchla, Serge, and others.

    The SHIFT key switches between banks, where each bank has controls for two CCs.

    Set the CC to be controlled using the CC knob on the left side of the plugin.

    The RANGE pads on the far left side set the range of the CC knobs to make dialing in specific CCs easier.

    The GAIN knob is an attenuverter; at 12:00 o’clock no CC will pass; fully clockwise the CC will pass at full value with no attenuation and in between, various levels of attenuation are available. Turning counter-clockwise from noon inverts the CC, also with variable attenuation.

    The OFFSET knobs add a static offset to the CC level.

    RISE and FALL set the rise and fall time of the slew limiter. A slew limiter controls how fast a signal can change. Set fully counter-clockwise, CCs can change rapidly, but as the dials are turned clockwise only slow movements will pass through while rapid changes are blocked.

    The LINK SLEW pads control whether the RISE and FALL knobs are linked or can be adjusted independently.

    The XY PAD displays the output levels for the two CC being controlled on the current bank.

    This script is extensible; if you need to control more than the default four CCs, you can easily add as many banks as you wish by modifying the variable “numBanks” in the code. You will find this variable a few lines down from the top of the code.

  • @Tones4Christ said:
    Sounds interesting! Sort of like some kind of arranger keyboard or auto accompanying script?

    @motmeister said:

    @Peblin said:
    When creating the Flow sequencer script (https://forum.audiob.us/discussion/34063/flow-multi-track-pattern-midi-sequencer-looper-for-mozaic) I compiled a little wish-list for Mozaic. Some stuff are probably specific to my use case but I think there are some things that would make Mozaic even greater without adding bloat.

    First of all I want to say that I really enjoy the constraints in Mozaic with predefined layouts. It helps staying focused and fuels creativity :) so custom views are NOT on my list.

    Here's my wishes to Santa Bram @brambos :

    • Additional general purpose labelable buttons like SHIFT would make creating UIs easier. Having just SHIFT makes the UIs too convoluted and forces them to use "hold" or "double-tap" for various actions which is super hard to remember.
    • Multi-line labels for pads, breaking on space and with explicit line break marker as well.
    • Pad color, or border, or dot - anything that could be used to indicate a pad state that is not latch.
    • Set secondary knob description - for value. Like SetKnobValueLabel {50%} with SetKnobLabel {Probability}. Eventide Blackhole is a good example showing both label and value.
    • SetKnobRange knob, min, max to get rid of value-translation from the script
    • Realtime CurrentTimeMillis for better timing implementations overall
    • Debug option to be warned when event processing takes more than a pulse in time. It's hard to know if you're doing stuff that will make the script miss pulses.
    • If arrays could be larger than 1000 it would be amazing.
    • String or label concatenation to provide better feedback to the user.
    • Brace syntax is hard to read and external editors doesn’t recognize them as strings. "" would be more convenient. And easier to type on Nordic keyboards :)
    • A layout with faders and a few pads, but no X/Y would be neat :)

    These are ALL great feature requests. For debugging purposes, I have a few more:

    • statement numbering. It would sure be nice to be able to pinpoint where an error occurs.
    • Increase the maximum number of messages (per pass?) allowed for the Log.
    • Add the ability to clear the log.

    The manual describes the Log as

    “ ... a great tool for passing runtime information about your script to the user or for checking values
    while debugging your script.”

    but the limits of the Log inhibit that.

    I just finished a substantial Mozaic development consisting of 7 scripts which allow for triggering of output MIDI “phrases” based on input MIDI “triggers”. As soon as I’ve stress-tested it, I’ll provide the scripts and a “manual” for its use. It was during the development that I determined the need for my additional features.

    Is this like a “pre-announce”? [grin]. Here are the script names and a minimal description:

    Newf1_phrases_keys - Accepts a MIDI stream as input from almost any source. It uses MetroPulse to create a time base. Phrases are stored with a trigger number, which is assigned in a few different ways. It creates GLOBALs which I refer to as a “notes” file. The limitation for the number of entries in this notes file then is the limitation of GLOBAL arrays, 999.

    Newf2_triggers - also uses MetroPulse for a time base. Input for triggers can also come from almost any MIDI source. It’s data is stored as a pulse number and trigger number. It’s also stored in GLOBALS as a pseudo “triggers” file with a max of 999.

    Newf3_commands - meshes “notes” and “triggers” to create a “commands” file in GLOBALs (limited to 999), which contains the data needed to send a MIDI command (CC, note on, note off) at a MetroPulse point in time.

    Newf4_player - uses a MetroPulse time base. When the pulse time for a command matches the MetroPulse, it translates the commands data to a real MIDI command and sends it to MIDI out, which could be any app that accepts MIDI input.

    Newf5_CCs_randomizer - has three functions: 1) add data to the “notes” file for a single CC event, 2) add data to “notes” for a “range” CC, which is translated to multiple CC events, one per pulse, for a range of values over a period of time, and 3) create a phrase of random MIDI notes/velocities/lengths and add them as a phrase to the “notes” file.

    Newf6_delete_by_trig - will delete all “notes” data for a specific trigger number, or deletes all “triggers” data for a specific trigger. They’re done separately for flexibility.

    Newf7_reports - writes summary information to the Mozaic Log so you can see what’s contained in each of the “files”.

    ==========

    I originally tried to incorporate more functionality into fewer scripts, but when trying to do too much, I was getting CPU >100, and actually had all scripts crash several times. I opted for scripts with more or less dedicated functionality. There are occurrences of a basic “bubble sort” (techie stuff) to make sure events happen in time order. This means I can add stuff to “notes” and “triggers” in any order, and they get sorted into time order in Newf3_commands. Frankly, knowing that bubble sorts can be inefficient, I was pleasantly surprised at how fast they processed.

    Any more information about the scripts is premature, but it sure has been interesting!

  • @Bryan said:
    I just uploaded a new script on patchstorage.com called CC Processor.

    Brilliant! Will have a look later on.
    Thanks.

  • Just uploaded a new script. It’s a basic MIDI recorder/looper, allowing you to record incoming MIDI and replay it (with or without host running). Looping is possible when host is running and can be triggered automatically.

    https://patchstorage.com/simple-recorder-looper

    Also uploaded an update (2.2) to Chord Magic script, adding:
    – Edit option to transpose chord sequences up/down half steps
    – Arpeggiator style step types for the pattern sequencer (up/down movement, randomness etc)
    – New mode for thru processing: map input to closest chord note

    https://patchstorage.com/chord-magic/

  • @NoonienS said:
    Just uploaded a new script. It’s a basic MIDI recorder/looper, allowing you to record incoming MIDI and replay it (with or without host running). Looping is possible when host is running and can be triggered automatically.

    https://patchstorage.com/simple-recorder-looper

    Also uploaded an update (2.2) to Chord Magic script, adding:
    – Edit option to transpose chord sequences up/down half steps
    – Arpeggiator style step types for the pattern sequencer (up/down movement, randomness etc)
    – New mode for thru processing: map input to closest chord note

    https://patchstorage.com/chord-magic/

    @NoonienS Just tried the simple looper works good. Maybe add in overdub that would be cool.

  • _ki_ki
    edited August 2019

    @motmeister Nice and complex script idea :)

    I have some remarks regarding globals:

    • IIRC the manual stated 100 globals (just looked: its on page 12) and their are accessed with global00 to global99, but you were still right:
      Practical tests show that there are actually 1000 globals that can be accessed with global[0] to global[999]

    • I also have scripts in the works that use globals for plugin script to plugin script communication (ToggleChannels and its Snapshot companion) :

      • I guarded my data blocks with ‚magic numbers‘ infront of the exchanged structure and a checksum over the data so that the receiver can test if the sender is present and check the data validity.
        = The receiver tests for the magic and only reads data if the checksum is valid.
        = The sender tests before sending if its magic is still there. If not, it stops sending to no longer interfere and produces a log warning.
        = If the checksum is not correct, some other plugin modified values inside the data structure. Thats why the sender also verifies the checksum of the old data block before sending new data.

      • A sequence id inside the data block allows the receiving plugin to notice changes. The sender increments that number on changes, and the receiver compares it with the last seq id picked up.

      • For the needed bi directional communication, i use two data structures and both scripts are sender and receiver each with its own magic, seq id and checksum.
  • edited August 2019

    Some great little scripts coming out this week plus loads of update thanks to all the kind devs putting in the time and they are free!

    Looking forward to the Mozaic update “refresh” so I don’t have to keep closing down the app to install via open in!

    I assume the best way if a script gets a update is to delete the old script first and then download install the new update. That’s what I’ve been doing anyhow. It’s a bit long winded compared to say updating an app but for what this brings can live with it.

  • @Jumpercollins said:
    I assume the best way if a script gets a update is to delete the old script first and then download install the new update. That’s what I’ve been doing anyhow. It’s a bit long winded compared to say updating an app but for what this brings can live with it.

    Currently the best way is if all script writers include the version number in the script name, as mentioned earlier by @_ki (I think). Then you could just download the new script, and later decide to swipe away the old version in Mozaic.
    Any way to enforce version number as part of script name on patchstorage.com, @brambos?

  • @Jumpercollins said:
    Some great little scripts coming out this week plus loads of update thanks to all the kind devs putting in the time and they are free!

    Looking forward to the Mozaic update “refresh” so I don’t have to keep closing down the app to install via open in!

    I assume the best way if a script gets a update is to delete the old script first and then download install the new update. That’s what I’ve been doing anyhow. It’s a bit long winded compared to say updating an app but for what this brings can live with it.

    The current version of Mozaic has already the REFRESH button - it's on the Load dialog. What can be confusing is that presets/patches are sorted case sensitive, so f.e. flow 1.01 comes after Velocity randomizer.... I hope @brambos will change that to case insensitive sorting...

  • @Harro said:
    .... I hope @brambos will change that to case insensitive sorting...

    +1

  • @wim said:

    @Harro said:
    .... I hope @brambos will change that to case insensitive sorting...

    +1

    I can see if iOS allows this. It's an iOS filesystem feature, and we all know how 'advanced' the iOS file system is.

  • _ki_ki
    edited August 2019

    @Brambos: Another thing i wonder about is that downloading a patch from patchstorage adds the patch named in lowercase and with dashes instead of blanks - but if right after downloading i ‚refresh‘ and ‚load‘ that patch and then do a ‚save‘ the orginal name with caps and blanks is presented to save :)

    I just downloaded CC Processor which downloaded as cc-processor-1.0.1.mozaic and was presented as cc-processor-1.0.1 in the list sorted after all the scripts starting with capital letters.
    After loading that script, when i press the save button, the name in the Save-Popup is CC Processor 1.0.1.

    .

    Here another of my Mozaic poweruser tips:

    To organize my scripts, i add one of the emojiis in front of the name. These will sort to the end of the presets list. I distinguish between several categories:

    • All my WIP and other scripts without any prefix. These are at the start of the preset list.
    • Own patchstorage scripts starting with ♓️
    • AB forum scripts published in source code with 🆎
    • And then at the end all scripts downloaded from patchstorage starting with 🈚️

    Of coarse i have to ‚save‘ each downloaded patch to add the prefix, but i also add a version number if not specified. And then i need to open preset ‚load‘ again to delete the downloaded script with its lower-case letters (and without prefix) to not mix with my own scripts starting the preset list.
    All in all, this does not take long and as result the scripts are nicely organized and easy to find - even without user folders.

    .

    And no - i don‘t know/want to know what these chinese symbols mean. They have an imaginary meaning to me, so please don‘t spoil the real meaning :) Hope they are not offensive

  • @_ki said:
    @Brambos: Another thing i wonder about is that downloading a patch from patchstorage adds the patch named in lowercase and with dashes instead of blanks - but if right after downloading i ‚refresh‘ and ‚load‘ that patch and then do a ‚save‘ the orginal name with caps and blanks is presented to save :)

    Hah.. I never noticed that. I save the original name made up by the user inside the project so I can use it for saving and exporting even when the script is loaded from a project/saved state instead of a preset file. I guess that PatchStorage changes the actual filename to be "safe" for all operating systems (e.g. by removing spaces etc.). I don't control what PatchStorage does to the name so there's not much I can do about that.

  • Hi peblin
    Thanks for your nice patch and sharing. I have wrote my feedback in mozaic patch storage .

Sign In or Register to comment.