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!

15758606263102

Comments

  • @espiegel123 said:

    @Tamir_Raz_Mataz said:

    @mbncp said:

    @MonkeyDrummer said:
    Curious, as I have not taken the plunge yet...How difficult would it be to code up a utility so that a momentary hardware button (ie blueboard) can be converted into a toggle that can send configurable note or cc within AUM... AAAAND, be set up so that regardless of the state of the toggle, whenever you restart AUM/Mosaic, the toggle is in the off state. The second part is important...

    I use this in my setup, may need some changes
    ? How is the code mark supposed to work ?

    // CC-Switch  (Mozaic v1.03)
    
    // Allows the use of a Controller to act like a switch 
    // Usefull with controllers that return to their initial position once you release them
    // The state is stored for each midi channel
    // Off course you can also use the pads 
    
    @OnLoad
      // Adjust to your needs
      TrigCC = 64         // Incoming CC to make it act like a switch
      OutCC = 64          // CC to send on switch change
      CCVal = [0,127]     // CC value on switch OFF, ON
      CCValRange = 15       // CC input value tolerance, for a knob use 64
      //    
      FillArray TrigState, 0,16   // keep state of all channels
      FillArray TrigReset, 1,16
      SetShortName {Switch}
      LabelPads {CC }, OutCC, { State for Chn 1-16}  
      ShowLayout 2
      for n = 0 to 15
        LabelPad n, n+1  
       endfor 
      Call @UpdateGUI
    @End
    
    @OnMidiInput
      If MIDICommand = 0xB0 And MIDIByte2 = TrigCC
        If MidiByte3 > (127 - CCValRange) And TrigReset[MIDIChannel]
          TrigState[MIDIChannel] = not TrigState[MIDIChannel]
          SendMIDICC MIDIChannel, OutCC, CCVal[TrigState[MIDIChannel]]
          TrigReset[MIDIChannel] = 0
          Call @UpdateGUI
        ElseIf MidiByte3 < CCValRange
          TrigReset[MIDIChannel] = 1
       EndIf  
      Else        
        SendMIDIThru  
      EndIf       
    @End
    
    @OnPadUp
      TrigState[LastPad] = not TrigState[LastPad]
      SendMIDICC LastPad, OutCC, CCVal[TrigState[LastPad]]
      TrigReset[LastPad] = 1
      Call @UpdateGUI
    @End 
    
    @UpdateGUI
      for n = 0 to 15
         LatchPad n, TrigState[n]
      endfor 
    @End
    

    Hi Mozaicsters,
    Any help would be appreciated.
    I'm a noob
    I tried editing the code and I'm puzzled - I only managed to change the cc value (hurray :)

    1.I would like to be able to have all pads on the same channel (possibly with a knob for channel selection)
    2.I would like to have a knob selecting cc number per pad

    Have you gone through the Mozaic manual? It is very well written and gives some great examples of code to get you started.

    What were you trying to do to the code that couldn't manage to do?

    It will be much easier to help you if you have specific questions.

    I attempted to read the manual several times. It’s fun and challenging for me. I was looking for a specific example to edit the channels to make it on one channel.

    Basically what I need is the cc-banks script https://patchstorage.com/cc-banks/
    With the pads toggle from cc-switch.

    How would I delete the pad section from cc-banks and add the pads from cc-switch?

  • @McD said:
    I have a question for the real programmers here that have created amazing tools using Mosaic as is but probably know where they'd like to see an extra feature or language construct.

    If you could add one language feature to the core Mosaic runtime what would it be?

    I'd like to be able to import libraries ala Python/JS. Likeimport utils/knobs as knobs where knobs has a bunch of user defined functions that can be called in the parent script like @knobs/someMethod. In order keep things simple with regards to sharing, there would need to be a 'flattening' feature/option added when exporting.

    That along with function arguments/function variable scope would be extremely helpful.

  • @brambos said:

    @rs2000 said:
    I can understand Bram not willing to go the hardware route, building such a box with an acceptable design that works reliably and conforms to all kinds of worldwide regulations certainly goes a bit further than writing code on a computer keyboard.
    It would think twice before doing something like that.

    Before I released the original Ruismaker as a mobile plugin, I was planning to make it a hardware drum machine - via the Kickstarter route.

    I had already made the code work on the ARM processor of choice, including all the necessary USB and MIDI connections. Made the hardware designs, selected all the components, etc.

    But things eventually got stuck trying to find a manufacturing partner. I never got further than a few quotes on the plastic parts. Making hardware is quite a painful process, especially when you start thinking about worldwide support/shipping/returns/repairs and (when necessary) certifications... :/

    I managed to turn the project into something good though :D

    I love that some of those angled sides ended up in the GUI <3

  • @Tamir_Raz_Mataz said:

    @espiegel123 said:

    @Tamir_Raz_Mataz said:

    @mbncp said:

    @MonkeyDrummer said:
    Curious, as I have not taken the plunge yet...How difficult would it be to code up a utility so that a momentary hardware button (ie blueboard) can be converted into a toggle that can send configurable note or cc within AUM... AAAAND, be set up so that regardless of the state of the toggle, whenever you restart AUM/Mosaic, the toggle is in the off state. The second part is important...

    I use this in my setup, may need some changes
    ? How is the code mark supposed to work ?

    // CC-Switch  (Mozaic v1.03)
    
    // Allows the use of a Controller to act like a switch 
    // Usefull with controllers that return to their initial position once you release them
    // The state is stored for each midi channel
    // Off course you can also use the pads 
    
    @OnLoad
      // Adjust to your needs
      TrigCC = 64         // Incoming CC to make it act like a switch
      OutCC = 64          // CC to send on switch change
      CCVal = [0,127]     // CC value on switch OFF, ON
      CCValRange = 15       // CC input value tolerance, for a knob use 64
      //    
      FillArray TrigState, 0,16 // keep state of all channels
      FillArray TrigReset, 1,16
      SetShortName {Switch}
      LabelPads {CC }, OutCC, { State for Chn 1-16}  
      ShowLayout 2
      for n = 0 to 15
        LabelPad n, n+1  
       endfor 
      Call @UpdateGUI
    @End
    
    @OnMidiInput
      If MIDICommand = 0xB0 And MIDIByte2 = TrigCC
        If MidiByte3 > (127 - CCValRange) And TrigReset[MIDIChannel]
          TrigState[MIDIChannel] = not TrigState[MIDIChannel]
          SendMIDICC MIDIChannel, OutCC, CCVal[TrigState[MIDIChannel]]
          TrigReset[MIDIChannel] = 0
          Call @UpdateGUI
        ElseIf MidiByte3 < CCValRange
          TrigReset[MIDIChannel] = 1
         EndIf  
      Else      
        SendMIDIThru    
      EndIf     
    @End
    
    @OnPadUp
      TrigState[LastPad] = not TrigState[LastPad]
      SendMIDICC LastPad, OutCC, CCVal[TrigState[LastPad]]
      TrigReset[LastPad] = 1
      Call @UpdateGUI
    @End 
    
    @UpdateGUI
      for n = 0 to 15
         LatchPad n, TrigState[n]
      endfor 
    @End
    

    Hi Mozaicsters,
    Any help would be appreciated.
    I'm a noob
    I tried editing the code and I'm puzzled - I only managed to change the cc value (hurray :)

    1.I would like to be able to have all pads on the same channel (possibly with a knob for channel selection)
    2.I would like to have a knob selecting cc number per pad

    Have you gone through the Mozaic manual? It is very well written and gives some great examples of code to get you started.

    What were you trying to do to the code that couldn't manage to do?

    It will be much easier to help you if you have specific questions.

    I attempted to read the manual several times. It’s fun and challenging for me. I was looking for a specific example to edit the channels to make it on one channel.

    Basically what I need is the cc-banks script https://patchstorage.com/cc-banks/
    With the pads toggle from cc-switch.

    How would I delete the pad section from cc-banks and add the pads from cc-switch?

    It is hard to advise without understanding what you understand. When you read through the code that you posted line by line, do you understand what each line does?

    The place to start might be helping you to understand anything that you don't understand in the script you quoted.

    It will also help you program, if you can precisely state what you are trying to accomplish--but you can start vague and then make it more precise. I find it useful to start by writing down in easy imprecise terms what I want and then converting that into a more specific outline. I then look at the outline and make more precise anything that could be more precise. Depending how complicated the program is this might take one or two passes. But on a more complicated program, I may have to do that several times.

  • @espiegel123 said:

    @Tamir_Raz_Mataz said:

    @espiegel123 said:

    @Tamir_Raz_Mataz said:

    @mbncp said:

    @MonkeyDrummer said:
    Curious, as I have not taken the plunge yet...How difficult would it be to code up a utility so that a momentary hardware button (ie blueboard) can be converted into a toggle that can send configurable note or cc within AUM... AAAAND, be set up so that regardless of the state of the toggle, whenever you restart AUM/Mosaic, the toggle is in the off state. The second part is important...

    I use this in my setup, may need some changes
    ? How is the code mark supposed to work ?

    // CC-Switch  (Mozaic v1.03)
    
    // Allows the use of a Controller to act like a switch 
    // Usefull with controllers that return to their initial position once you release them
    // The state is stored for each midi channel
    // Off course you can also use the pads 
    
    @OnLoad
      // Adjust to your needs
      TrigCC = 64         // Incoming CC to make it act like a switch
      OutCC = 64          // CC to send on switch change
      CCVal = [0,127]     // CC value on switch OFF, ON
      CCValRange = 15       // CC input value tolerance, for a knob use 64
      //    
      FillArray TrigState, 0,16   // keep state of all channels
      FillArray TrigReset, 1,16
      SetShortName {Switch}
      LabelPads {CC }, OutCC, { State for Chn 1-16}  
      ShowLayout 2
      for n = 0 to 15
        LabelPad n, n+1  
       endfor 
      Call @UpdateGUI
    @End
    
    @OnMidiInput
      If MIDICommand = 0xB0 And MIDIByte2 = TrigCC
        If MidiByte3 > (127 - CCValRange) And TrigReset[MIDIChannel]
          TrigState[MIDIChannel] = not TrigState[MIDIChannel]
          SendMIDICC MIDIChannel, OutCC, CCVal[TrigState[MIDIChannel]]
          TrigReset[MIDIChannel] = 0
          Call @UpdateGUI
        ElseIf MidiByte3 < CCValRange
          TrigReset[MIDIChannel] = 1
       EndIf  
      Else        
        SendMIDIThru  
      EndIf       
    @End
    
    @OnPadUp
      TrigState[LastPad] = not TrigState[LastPad]
      SendMIDICC LastPad, OutCC, CCVal[TrigState[LastPad]]
      TrigReset[LastPad] = 1
      Call @UpdateGUI
    @End 
    
    @UpdateGUI
      for n = 0 to 15
         LatchPad n, TrigState[n]
      endfor 
    @End
    

    Hi Mozaicsters,
    Any help would be appreciated.
    I'm a noob
    I tried editing the code and I'm puzzled - I only managed to change the cc value (hurray :)

    1.I would like to be able to have all pads on the same channel (possibly with a knob for channel selection)
    2.I would like to have a knob selecting cc number per pad

    Have you gone through the Mozaic manual? It is very well written and gives some great examples of code to get you started.

    What were you trying to do to the code that couldn't manage to do?

    It will be much easier to help you if you have specific questions.

    I attempted to read the manual several times. It’s fun and challenging for me. I was looking for a specific example to edit the channels to make it on one channel.

    Basically what I need is the cc-banks script https://patchstorage.com/cc-banks/
    With the pads toggle from cc-switch.

    How would I delete the pad section from cc-banks and add the pads from cc-switch?

    It is hard to advise without understanding what you understand. When you read through the code that you posted line by line, do you understand what each line does?

    The place to start might be helping you to understand anything that you don't understand in the script you quoted.

    It will also help you program, if you can precisely state what you are trying to accomplish--but you can start vague and then make it more precise. I find it useful to start by writing down in easy imprecise terms what I want and then converting that into a more specific outline. I then look at the outline and make more precise anything that could be more precise. Depending how complicated the program is this might take one or two passes. But on a more complicated program, I may have to do that several times.

    thanks for you will to explain.

    I didnt understand most of the lines of code besides the ones that made sense with the explanations:

    TrigCC = 64 // Incoming CC to make it act like a switch
    OutCC = 64 // CC to send on switch change
    CCVal = [0,127] // CC value on switch OFF, ON
    CCValRange = 15 // CC input value tolerance, for a knob use 64

    if it had simple explanation on the rest of the it would be probably easy to modify

    I tried to precisely state what I'm trying to accomplish:

    1.Have the option for a one channel with a knob selection.
    2.assignable knobs for cc number per pad. like on the script "cc-bank"

  • @Tamir_Raz_Mataz said:

    @espiegel123 said:

    @Tamir_Raz_Mataz said:

    @espiegel123 said:

    @Tamir_Raz_Mataz said:

    @mbncp said:

    @MonkeyDrummer said:
    Curious, as I have not taken the plunge yet...How difficult would it be to code up a utility so that a momentary hardware button (ie blueboard) can be converted into a toggle that can send configurable note or cc within AUM... AAAAND, be set up so that regardless of the state of the toggle, whenever you restart AUM/Mosaic, the toggle is in the off state. The second part is important...

    I use this in my setup, may need some changes
    ? How is the code mark supposed to work ?

    // CC-Switch  (Mozaic v1.03)
    
    // Allows the use of a Controller to act like a switch 
    // Usefull with controllers that return to their initial position once you release them
    // The state is stored for each midi channel
    // Off course you can also use the pads 
    
    @OnLoad
      // Adjust to your needs
      TrigCC = 64         // Incoming CC to make it act like a switch
      OutCC = 64          // CC to send on switch change
      CCVal = [0,127]     // CC value on switch OFF, ON
      CCValRange = 15       // CC input value tolerance, for a knob use 64
      //    
      FillArray TrigState, 0,16 // keep state of all channels
      FillArray TrigReset, 1,16
      SetShortName {Switch}
      LabelPads {CC }, OutCC, { State for Chn 1-16}  
      ShowLayout 2
      for n = 0 to 15
        LabelPad n, n+1  
       endfor 
      Call @UpdateGUI
    @End
    
    @OnMidiInput
      If MIDICommand = 0xB0 And MIDIByte2 = TrigCC
        If MidiByte3 > (127 - CCValRange) And TrigReset[MIDIChannel]
          TrigState[MIDIChannel] = not TrigState[MIDIChannel]
          SendMIDICC MIDIChannel, OutCC, CCVal[TrigState[MIDIChannel]]
          TrigReset[MIDIChannel] = 0
          Call @UpdateGUI
        ElseIf MidiByte3 < CCValRange
          TrigReset[MIDIChannel] = 1
         EndIf  
      Else      
        SendMIDIThru    
      EndIf     
    @End
    
    @OnPadUp
      TrigState[LastPad] = not TrigState[LastPad]
      SendMIDICC LastPad, OutCC, CCVal[TrigState[LastPad]]
      TrigReset[LastPad] = 1
      Call @UpdateGUI
    @End 
    
    @UpdateGUI
      for n = 0 to 15
         LatchPad n, TrigState[n]
      endfor 
    @End
    

    Hi Mozaicsters,
    Any help would be appreciated.
    I'm a noob
    I tried editing the code and I'm puzzled - I only managed to change the cc value (hurray :)

    1.I would like to be able to have all pads on the same channel (possibly with a knob for channel selection)
    2.I would like to have a knob selecting cc number per pad

    Have you gone through the Mozaic manual? It is very well written and gives some great examples of code to get you started.

    What were you trying to do to the code that couldn't manage to do?

    It will be much easier to help you if you have specific questions.

    I attempted to read the manual several times. It’s fun and challenging for me. I was looking for a specific example to edit the channels to make it on one channel.

    Basically what I need is the cc-banks script https://patchstorage.com/cc-banks/
    With the pads toggle from cc-switch.

    How would I delete the pad section from cc-banks and add the pads from cc-switch?

    It is hard to advise without understanding what you understand. When you read through the code that you posted line by line, do you understand what each line does?

    The place to start might be helping you to understand anything that you don't understand in the script you quoted.

    It will also help you program, if you can precisely state what you are trying to accomplish--but you can start vague and then make it more precise. I find it useful to start by writing down in easy imprecise terms what I want and then converting that into a more specific outline. I then look at the outline and make more precise anything that could be more precise. Depending how complicated the program is this might take one or two passes. But on a more complicated program, I may have to do that several times.

    thanks for you will to explain.

    I didnt understand most of the lines of code besides the ones that made sense with the explanations:

    TrigCC = 64 // Incoming CC to make it act like a switch
    OutCC = 64 // CC to send on switch change
    CCVal = [0,127] // CC value on switch OFF, ON
    CCValRange = 15 // CC input value tolerance, for a knob use 64

    if it had simple explanation on the rest of the it would be probably easy to modify

    I tried to precisely state what I'm trying to accomplish:

    1.Have the option for a one channel with a knob selection.
    2.assignable knobs for cc number per pad. like on the script "cc-bank"

    I think step one for you will be to go through this program line-by-line and understanding each one. It might be useful for you to translate the code into human language. I think once you do that, you will be much closer to being able to go in the other direction: taking an idea and turning into code.

    For instance,

    "If MIDICommand = 0xB0 And MIDIByte2 = TrigCC"

    means something like:

    "if the MIDI command is a midi CC (midiCommand = 0xB0) and the CC number (MIDIByte2) is TrigCC (the CC number that I use as a trigger)"

    Anyway, take some time to understand each line (referring to the Mozaic manual as needed) and come back here and ask for explanations of the individual lines you don't understand.

    And, if you understand the lines but not WHY they are there, ask about that with the specific lines.

  • I spent a few hours yesterday trying to get a concept to work with limited success.

    Most of what I want to do with Mosaic "at this moment in time" involves understanding how to store played notes into a memory buffer, and then play those notes back in various automated ways, when a specific event triggers playback.

    For example. A program where I play notes, and once I reach note number 4, all four notes will be played back in a "strummed" sequence. "Strummed" meaning, notes 1, 2, 3, and 4 all play sequentially, with some milliSecond time interval between the notes.

    I just can't figure out how to get more than one note into Variables, or an Array, and then get them back out again.

  • @horsetrainer said:
    For example. A program where I play notes, and once I reach note number 4, all four notes will be played back in a "strummed" sequence. "Strummed" meaning, notes 1, 2, 3, and 4 all play sequentially, with some milliSecond time interval between the notes.

    Here’s a short demo script of one way to go about it. Please don’t hesitate to ask about any parts that you don’t understand.

    @Description
    Simple demo to show how to collect four notes then send them out all at once and then start over.
    @End
    
    @OnLoad
    
      //Create an array to hold note numbers. We don't really need to
      //fill it with -1's but this will make it easier to tell which cells have 
      //notes in them later
    
      FillArray notes, -1
    
      //Send everything on channel 1 for simplicity
      channel = 0
    
      //this will be our counter for notes
      counter = 0
    
      //strumtime will be the ms offset between played notes
      strumtime = 25
    
    @End
    
    @OnMidiNoteOn
    
      //Collect four notes. After the fourth, play them all back.
    
      notes[counter] = MIDINote
      Inc counter
    
      //After we've hit the fourth note, send them all out and start over
    
      if counter = 4
        for a = 0 to 3
    
          //look up the note and send a note-on at velocity 100
          SendMidiNoteOn channel, notes[a], 100, (a * strumtime)
    
          //Send a note-off after a quarter note delay
          SendMidiNoteOff channel, notes[a], 0, (Quarternote + (a * strumtime))
    
        endfor
    
        //Clear out the array to start over
        FillArray notes, -1
        counter = 0
      endif
    
    @End
    
  • edited January 2020

    @wim said:

    @horsetrainer said:
    For example. A program where I play notes, and once I reach note number 4, all four notes will be played back in a "strummed" sequence. "Strummed" meaning, notes 1, 2, 3, and 4 all play sequentially, with some milliSecond time interval between the notes.

    Here’s a short demo script of one way to go about it. Please don’t hesitate to ask about any parts that you don’t understand.

    @Description
    Simple demo to show how to collect four notes then send them out all at once and then start over.
    @End
    
    @OnLoad
    
      //Create an array to hold note numbers. We don't really need to
      //fill it with -1's but this will make it easier to tell which cells have 
      //notes in them later
      
      FillArray notes, -1
      
      //Send everything on channel 1 for simplicity
      channel = 0
      
      //this will be our counter for notes
      counter = 0
      
      //strumtime will be the ms offset between played notes
      strumtime = 25
      
    @End
    
    @OnMidiNoteOn
    
      //Collect four notes. After the fourth, play them all back.
      
      notes[counter] = MIDINote
      Inc counter
      
      //After we've hit the fourth note, send them all out and start over
      
      if counter = 4
        for a = 0 to 3
        
          //look up the note and send a note-on at velocity 100
          SendMidiNoteOn channel, notes[a], 100, (a * strumtime)
    
          //Send a note-off after a quarter note delay
          SendMidiNoteOff channel, notes[a], 0, (Quarternote + (a * strumtime))
          
        endfor
        
        //Clear out the array to start over
        FillArray notes, -1
        counter = 0
      endif
      
    @End
    

    Thanks wim!
    Very nice of you to do this.
    I'll load it up and experiment with it tomorrow.

    I learned two new commands... "Inc" and "Quarternote".

    One question that confuses me is the purpose of "@End" in a script.

    Based on your above script I'd guess it's for separating scripts into "Event"/"@End" segments (maybe call them something like "Event Groups" (for lack of knowing the proper term).

    So once the script finishes the first "Event Group" the "whatever you'd call the code reading pointer that constantly loops through the code", only loops within one "event group" at a time. Once any "event group" has completed, that pointer travels past the @End, and then works only within the next "Event Group" (between the triggering event and the @End that follows it.

    Something like this...

    @OnLoad

    // Do stuff
    // When done

    @End
    // Once past this @End marker the code reading pointer stops and waits on the next event to happen
    // This would be a new event:
    @OnMidiNoteOn
    // When the midi note occurs it starts the code reading pointer moving again
    // The pointer processes all the next code and once there is no more to do
    // It moves past the next @end and waits on the next Event to occur before the pointer will start moving again.

    Is that how it works?

  • @espiegel123 said:

    @Tamir_Raz_Mataz said:

    @espiegel123 said:

    @Tamir_Raz_Mataz said:

    @espiegel123 said:

    @Tamir_Raz_Mataz said:

    @mbncp said:

    @MonkeyDrummer said:
    Curious, as I have not taken the plunge yet...How difficult would it be to code up a utility so that a momentary hardware button (ie blueboard) can be converted into a toggle that can send configurable note or cc within AUM... AAAAND, be set up so that regardless of the state of the toggle, whenever you restart AUM/Mosaic, the toggle is in the off state. The second part is important...

    I use this in my setup, may need some changes
    ? How is the code mark supposed to work ?

    // CC-Switch  (Mozaic v1.03)
    
    // Allows the use of a Controller to act like a switch 
    // Usefull with controllers that return to their initial position once you release them
    // The state is stored for each midi channel
    // Off course you can also use the pads 
    
    @OnLoad
      // Adjust to your needs
      TrigCC = 64         // Incoming CC to make it act like a switch
      OutCC = 64          // CC to send on switch change
      CCVal = [0,127]     // CC value on switch OFF, ON
      CCValRange = 15       // CC input value tolerance, for a knob use 64
      //    
      FillArray TrigState, 0,16   // keep state of all channels
      FillArray TrigReset, 1,16
      SetShortName {Switch}
      LabelPads {CC }, OutCC, { State for Chn 1-16}  
      ShowLayout 2
      for n = 0 to 15
        LabelPad n, n+1  
       endfor 
      Call @UpdateGUI
    @End
    
    @OnMidiInput
      If MIDICommand = 0xB0 And MIDIByte2 = TrigCC
        If MidiByte3 > (127 - CCValRange) And TrigReset[MIDIChannel]
          TrigState[MIDIChannel] = not TrigState[MIDIChannel]
          SendMIDICC MIDIChannel, OutCC, CCVal[TrigState[MIDIChannel]]
          TrigReset[MIDIChannel] = 0
          Call @UpdateGUI
        ElseIf MidiByte3 < CCValRange
          TrigReset[MIDIChannel] = 1
       EndIf  
      Else        
        SendMIDIThru  
      EndIf       
    @End
    
    @OnPadUp
      TrigState[LastPad] = not TrigState[LastPad]
      SendMIDICC LastPad, OutCC, CCVal[TrigState[LastPad]]
      TrigReset[LastPad] = 1
      Call @UpdateGUI
    @End 
    
    @UpdateGUI
      for n = 0 to 15
         LatchPad n, TrigState[n]
      endfor 
    @End
    

    Hi Mozaicsters,
    Any help would be appreciated.
    I'm a noob
    I tried editing the code and I'm puzzled - I only managed to change the cc value (hurray :)

    1.I would like to be able to have all pads on the same channel (possibly with a knob for channel selection)
    2.I would like to have a knob selecting cc number per pad

    Have you gone through the Mozaic manual? It is very well written and gives some great examples of code to get you started.

    What were you trying to do to the code that couldn't manage to do?

    It will be much easier to help you if you have specific questions.

    I attempted to read the manual several times. It’s fun and challenging for me. I was looking for a specific example to edit the channels to make it on one channel.

    Basically what I need is the cc-banks script https://patchstorage.com/cc-banks/
    With the pads toggle from cc-switch.

    How would I delete the pad section from cc-banks and add the pads from cc-switch?

    It is hard to advise without understanding what you understand. When you read through the code that you posted line by line, do you understand what each line does?

    The place to start might be helping you to understand anything that you don't understand in the script you quoted.

    It will also help you program, if you can precisely state what you are trying to accomplish--but you can start vague and then make it more precise. I find it useful to start by writing down in easy imprecise terms what I want and then converting that into a more specific outline. I then look at the outline and make more precise anything that could be more precise. Depending how complicated the program is this might take one or two passes. But on a more complicated program, I may have to do that several times.

    thanks for you will to explain.

    I didnt understand most of the lines of code besides the ones that made sense with the explanations:

    TrigCC = 64 // Incoming CC to make it act like a switch
    OutCC = 64 // CC to send on switch change
    CCVal = [0,127] // CC value on switch OFF, ON
    CCValRange = 15 // CC input value tolerance, for a knob use 64

    if it had simple explanation on the rest of the it would be probably easy to modify

    I tried to precisely state what I'm trying to accomplish:

    1.Have the option for a one channel with a knob selection.
    2.assignable knobs for cc number per pad. like on the script "cc-bank"

    I think step one for you will be to go through this program line-by-line and understanding each one. It might be useful for you to translate the code into human language. I think once you do that, you will be much closer to being able to go in the other direction: taking an idea and turning into code.

    For instance,

    "If MIDICommand = 0xB0 And MIDIByte2 = TrigCC"

    means something like:

    "if the MIDI command is a midi CC (midiCommand = 0xB0) and the CC number (MIDIByte2) is TrigCC (the CC number that I use as a trigger)"

    Anyway, take some time to understand each line (referring to the Mozaic manual as needed) and come back here and ask for explanations of the individual lines you don't understand.

    And, if you understand the lines but not WHY they are there, ask about that with the specific lines.

    Thanks for explaining me. You on to something! We need a translator that translates the code to human language . ;)

    Until then I will go through and try to understand with manual. One day hopefully I’ll be fluent. In the meanwhile I just want to jam and to have extra tools available to other musicians

  • wimwim
    edited January 2020

    @horsetrainer said:
    One question that confuses me is the purpose of "@End" in a script.

    Based on your above script I'd guess it's for separating scripts into "Event"/"@End" segments (maybe call them something like "Event Groups" (for lack of knowing the proper term).

    Yes, the @End is to signal the end of an event. Everything in between is what happens when that event is triggered. They’re just called Events, not Event Groups. Events are triggered by something happening during the execution of the script. In the above script there is the @OnLoad event that is triggered when the program first loads. Then there is the @OnMidiNote event that is triggered whenever a MIDI note is received. When an event is triggered, everything between the event name and the @Endexecutes.

    So once the script finishes the first "Event Group" the "whatever you'd call the code reading pointer that constantly loops through the code", only loops within one "event group" at a time. Once any "event group" has completed, that pointer travels past the @End, and then works only within the next "Event Group" (between the triggering event and the @End that follows it.

    Humm, it sounds like you might be seeing that wrong. It’s not like like Basic where a script executes from top to bottom. Mozaic is “event” driven. The whole script is parsed, and then Mozaic waits for things to happen. Every time they do, Mozaic executes the code in the appropriate event. In that script, every time a MIDI note is received, the @OnMidiNote code executes. If no notes are received that part of the code never does anything.

    The part about only one event executing at a time isn’t really right either. There can be more than one thing going on at a time. You can be turning knobs while midi notes are being processed, for instance. Lots of things can be happening at once.

    Under the hood, at a low level, technically only one thing is happening at a time, but at the level we are working at, it is just as though many things can be going on simultaneously.

    Something like this...

    @OnLoad

    // Do stuff
    // When done

    @End
    // Once past this @End marker the code reading pointer stops and waits on the next event to happen
    // This would be a new event:
    @OnMidiNoteOn
    // When the midi note occurs it starts the code reading pointer moving again
    // The pointer processes all the next code and once there is no more to do
    // It moves past the next @end and waits on the next Event to occur before the pointer will start moving again.

    Is that how it works?

    Well, now I’m not sure how you’re seeing it from your description. Maybe you do understand and the explanation is just different than how I’d say it. The best way I can describe it is, whenever the thing happens that the event is related to, the code in that event executes.

  • _ki_ki
    edited January 2020

    @wim and @horsetrainer

    The part about only one event executing at a time isn’t really right either. There can be more than one thing going on at a time. You can be turning knobs while midi notes are being processed, for instance. Lots of things can be happening at once.

    In Mozaic there is always just one thing happing. If several events seem too occur at the same time (like knob turn while midi arrives), then the events are still executed in a well defined specific sequence - there never will be an @OnTimer while the script code for @OnMidiNoteOn is processed.

    The sequence in which the Mozaic events will be fired is fixed, always from ‚general‘ to more specific events. A complex example for are several midi notes and CCs arriving just when the hostbar changed on metropulse 0. The order of midi input is: NoteOn 10, CC 20, NoteOff 30, PitchBend 40, NoteOn 50.

    The order of events fired by the Mozaic runtime environment (if they are defined in the script) will result to:

    • OnNewBar
    • OnNewBeat
    • OnMetroPulse
    • OnMidiInput - with noteOn 10
    • OnMidiNote - with noteOn 10
    • OnMidiNoteOn - with noteOn 10
    • OnMidiInput - with CC 20
    • OnMidiCC - with CC 20
    • OnMidiNote - with noteOff 30
    • OnMidiNoteOff - with noteOff 30
    • OnMidiInput - with PitchBend 40
    • OnMidiInput - with NoteOn 50
    • OnMidiNoteOn - with NoteOn 50

    So, first the host informations, then MetroPulses, and then the events for all incoming midi data. For these, several events are called depending of the midi command. MidiInput is called first, then if its a Note message MidiNote and after that the more specific MiniNoteOn or MidiNoteOff. The order is always from general to ‚specific‘.

    AFter beeing fired, each event function runs until its @End is reached. The Mozaic runtime environment manages a list of events to be fired next.

    If the user also turned a knob just at that time, i suspect the OnKnob event are fired afterwards.

    .

    @OnNewBar
      Log { }
      Log {T},SystemTime,{  @OnNewBar      bar=},HostBar
    @End
    
    @OnNewBeat
      Log {T},SystemTime,{  @OnNewBeat     beat=}, HostBeat
    @End
    
    @OnMetroPulse
      Log {T},SystemTime,{  @OnMetroPulse  p=},CurrentMetroPulse 
    @End
    
    @OnMidiInput
      Log {T},SystemTime,{  @OnMidiInput   ch},MIDIChannel,{ cmd=},MIDICommand,{ byte2=},MIDIByte2,{ byte3=}, MIDIByte3
    @End
    
    @OnMidiNote
      Log {T},SystemTime,{  @OnMidiNote    ch},MIDIChannel, { cmd=},MIDICommand,{ note=},MIDINote,{ vel=},MIDIVelocity 
    @End
    
    @OnMidiNoteOn
      Log {T},SystemTime,{  @OnMidiNoteOn  ch},MIDIChannel,{ note=},MIDINote,{ vel=},MIDIVelocity 
    @End
    
    @OnMidiNoteOff
      Log {T},SystemTime,{  @OnMidiNoteOff ch},MIDIChannel,{ note=},MIDINote,{ vel=},MIDIVelocity 
    @End
    
    @OnMidiCC
      Log {T},SystemTime,{  @OnMidiCC      ch},MIDIChannel,{ cc=}, MIDIByte2,{ val=},MIDIByte3
    @End
    

    .

    In other programming languages something like these Mozaic events are called functions. But you don‘t have a main function that calls all your defined functions.
    Like @wim described, its the Mozaic Runtime that calls specific functions (or events) and executed them until End is reached in that function.

    Mozaic allows to define own functions ( user events) , which can be called during the predefined Moazic events. The End in such user-event returns to the calling event.

    If any of the Mozaic event functions you defined in your script takes too long (perhaps due to nested loops with computations) you will get a CPU spike and perhaps crackles at small audio buffers.

  • wimwim
    edited January 2020

    Great explanation at a technical level @_;ki, but perhaps more in-depth than your average / beginner coder needs to be concerned with in some ways. For all intents and purposes, turning a knob, executing a timer, processing a midi note happen as close enough to one another as to be considered simultaneous. For instance one can have a timer flashing a pad, midi notes coming in, midi notes going out, and be adjusting knobs effectively all at the same time.

    Sure, for a complex and very busy script one needs to get into multitasking and load considerations. And definitely, midi event precedence is important to understand. But beyond that, I’ve only pushed the boundaries of “multitasking” to the point of overload once.

    I hesitate long and hard before contradicting anything you say because your programming ability and technical knowledge is light-years beyond mine. But I do think that a beginner is better off focusing on the basic conceptual level and doesn’t need to think of Mozaic linearly, except concerning precedence of overlapping events such as OnMidiInput, OnMidiNote, OnMidiNoteOn, etc.

    As long as my pad flashes every quarter note, I don’t need to worry that it has a lower priority than passing a midi note through, etc. I can just code my events and most times it’ll work. At least until I get about 1000 times better and start writing scripts as intense as yours.

    For instance, while this is technically true...

    In Mozaic there is always just one thing happing. If several events seem too occur at the same time (like knob turn while midi arrives), then the events are still executed in a well defined specific sequence - there never will be an @OnTimer while the script code for @OnMidiNoteOn is processed.

    ... one can have a timer running and schedule simple things to happen without having to worry about where it fits in with the midi note being processed. Mozaic sorts those things out, and until things get too busy, effectively it’s all happening all at the same time.

    At a conceptual level, for most practical beginner purposes, Mozaic is a multi-tasking, event driven environment. That’s the point I was trying to get across to @horsetrainer. Everything you said is completely correct (and as always, super useful to me), but we’re trying to keep @horsetrainer’s head from exploding here. :D

  • @_ki said:
    @wim and @horsetrainer

    The part about only one event executing at a time isn’t really right either. There can be more than one thing going on at a time. You can be turning knobs while midi notes are being processed, for instance. Lots of things can be happening at once.

    In Mozaic there is always just one thing happing. If several events seem too occur at the same time (like knob turn while midi arrives), then the events are still executed in a well defined specific sequence - there never will be an @OnTimer while the script code for @OnMidiNoteOn is processed.

    The sequence in which the Mozaic events will be fired is fixed, always from ‚general‘ to more specific events. A complex example for are several midi notes and CCs arriving just when the hostbar changed on metropulse 0. The order of midi input is: NoteOn 10, CC 20, NoteOff 30, PitchBend 40, NoteOn 50.

    The order of events fired by the Mozaic runtime environment (if they are defined in the script) will result to:

    • OnNewBar
    • OnNewBeat
    • OnMetroPulse
    • OnMidiInput - with noteOn 10
    • OnMidiNote - with noteOn 10
    • OnMidiNoteOn - with noteOn 10
    • OnMidiInput - with CC 20
    • OnMidiCC - with CC 20
    • OnMidiNote - with noteOff 30
    • OnMidiNoteOff - with noteOff 30
    • OnMidiInput - with PitchBend 40
    • OnMidiInput - with NoteOn 50
    • OnMidiNoteOn - with NoteOn 50

    So, first the host informations, then MetroPulses, and then the events for all incoming midi data. For these, several events are called depending of the midi command. MidiInput is called first, then if its a Note message MidiNote and after that the more specific MiniNoteOn or MidiNoteOff. The order is always from general to ‚specific‘.

    AFter beeing fired, each event function runs until its @End is reached. The Mozaic runtime environment manages a list of events to be fired next.

    If the user also turned a knob just at that time, i suspect the OnKnob event are fired afterwards.

    .

    @OnNewBar
      Log { }
      Log {T},SystemTime,{  @OnNewBar      bar=},HostBar
    @End
    
    @OnNewBeat
      Log {T},SystemTime,{  @OnNewBeat     beat=}, HostBeat
    @End
    
    @OnMetroPulse
      Log {T},SystemTime,{  @OnMetroPulse  p=},CurrentMetroPulse 
    @End
    
    @OnMidiInput
      Log {T},SystemTime,{  @OnMidiInput   ch},MIDIChannel,{ cmd=},MIDICommand,{ byte2=},MIDIByte2,{ byte3=}, MIDIByte3
    @End
    
    @OnMidiNote
      Log {T},SystemTime,{  @OnMidiNote    ch},MIDIChannel, { cmd=},MIDICommand,{ note=},MIDINote,{ vel=},MIDIVelocity 
    @End
    
    @OnMidiNoteOn
      Log {T},SystemTime,{  @OnMidiNoteOn  ch},MIDIChannel,{ note=},MIDINote,{ vel=},MIDIVelocity 
    @End
    
    @OnMidiNoteOff
      Log {T},SystemTime,{  @OnMidiNoteOff ch},MIDIChannel,{ note=},MIDINote,{ vel=},MIDIVelocity 
    @End
    
    @OnMidiCC
      Log {T},SystemTime,{  @OnMidiCC      ch},MIDIChannel,{ cc=}, MIDIByte2,{ val=},MIDIByte3
    @End
    

    .

    In other programming languages something like these Mozaic events are called functions. But you don‘t have a main function that calls all your defined functions.
    Like @wim described, its the Mozaic Runtime that calls specific functions (or events) and executed them until End is reached in that function.

    Mozaic allows to define own functions ( user events) , which can be called during the predefined Moazic events. The End in such user-event returns to the calling event.

    If any of the Mozaic event functions you defined in your script takes too long (perhaps due to nested loops with computations) you will get a CPU spike and perhaps crackles at small audio buffers.

    This would be great wiki fodder.

  • Don‘t worry, i don‘t mind beeing critizied :)

    From my experience teaching informatics as scientific assistant at the university many are lacking the understanding what is going on in the lower levels. The have build mental models of what they think how it works, but this can lead to problems if their model differs from how things really work.

    That why i always try to ‚open up a view through the surface‘ so that they have a change in understanding how and why things happen. I think its easier to know that Mozaic will call your code if things happen one input thing after the other - so you never will worry about what might happen if another note arrives. Nothing in a script will get overwritten or interrupted by other events. IMHO it helps understanding the system if you know how things fit together conceptually.

    Beginners in programming/scripting just see the text and have no idea why this even works. The first thing is to understand that these statements are a step-wise recipe to get things done. But then they don’t understand when and how this is going to be initiated. My admittedly too long and possibly too 'deep' explanation was only meant to fill this last gap :)

    .

    So to summarize my previous long message:

    TL;DR:
    Mozaic is the main program that calls up the defined events one after the other, when there is something to do. Each line of an event is then executed from top to bottom until its End keyword. Conditional statements allow to execute if a condition is met and looped statements Execute the contained statements multiple times.

  • @Tamir_Raz_Mataz said:

    Thanks for explaining me. You on to something! We need a translator that translates the code to human language . ;)

    Until then I will go through and try to understand with manual. One day hopefully I’ll be fluent. In the meanwhile I just want to jam and to have extra tools available to other musicians

    With just a little time spent with that example code and the manual, you will understand most of what there is to know. It won't take you that long as long as you go one line at a time -- and look up what about that line you don't understand.

    The code to language translator is your brain. The hardest part to learn about programming is converting vague ideas into the little steps needed to accomplish them. Fortunately, Bram designed Mozaic to have none of the bells-and-whistles that advanced coders love but which are confusing to a lot of people. I honestly think that with an hour or so devoted to reading the manual enough to understand that script that you will be well on your way to being able to create your own utilities and to understand most other scripts that aren't really big.

  • @espiegel123 Thats what i also though when writing it down - i intend to put it on the Mozaic tips page when i wrote/edited the message. And thats also why it got overboard and i added more and more details - the script was intended as a starting point for the curious, who want to explore the described by themselves.

    @horsetrainer Hope your head didn‘t explode !

  • Your post definitely helped me @_ki, particularly now that I've neck deep in a script that does push all the boundaries. That knowledge that deep down only one thing is happening at any one time is important when expecting a lot of "simultaneous" things to be happening.

    Mozaic seems to have a great way of prioritizing tasks. For instance, I had a pad label updating as MIDI events were being processed. When the incoming MIDI load was too high, the pad label updates were simply skipped until there was enough time to resume them. I appreciated that MIDI events were processed at a higher priority rather than being skipped. (But of course, gave up the idea of updating the pad label.)

    I got heavily tripped up until I understood the relationship of the MIDI Events. So that's all super good information.

    If @horsetrainer's head did explode, at least it's like my Dad said once when I split my head open one time. "Oh well, at least it was only your head."

  • @wim BTW i have several scripts that run into audio crackles due to heavy computation in the events. Thats why several of my scripts do the heavy stuff as pre-computation.

    For the current script (Chord Inverser) i needed to split the computation in 6 parts that get executed one by one in separate OnTimer tricks - otherwise pressing a pad that switched some chord detection settings resulted in 100% CPU.

    My main WIP script also uses a scheduler and manages several linked lists of events that need to be fired later at specific timer ticks. For instance for smooth interpolation of CCs that will start 1/4 before the next bar. These need ideally be issued 10-20 times per sec to get smooth ramps.
    And at some point i realized that my initial distribution algorithm produced spikes if many of my internal events were scheduled to the same timer tick and i needed to change strategy to distribute the updates of each of the CCs.
    I am working on that one for several month now and it‘s still only 75% finished. At least the GUI code with its 5 different pages is complete and i have a working mockup :p

  • @_ki said:
    @wim BTW i have several scripts that run into audio crackles due to heavy computation in the events. Thats why several of my scripts do the heavy stuff as pre-computation.

    For the current script (Chord Inverser) i needed to split the computation in 6 parts that get executed one by one in separate OnTimer tricks - otherwise pressing a pad that switched some chord detection settings resulted in 100% CPU.

    My main WIP script also uses a scheduler and manages several linked lists of events that need to be fired later at specific timer ticks. For instance for smooth interpolation of CCs that will start 1/4 before the next bar. These need ideally be issued 10-20 times per sec to get smooth ramps.
    And at some point i realized that my initial distribution algorithm produced spikes if many of my internal events were scheduled to the same timer tick and i needed to change strategy to distribute the updates of each of the CCs.
    I am working on that one for several month now and it‘s still only 75% finished. At least the GUI code with its 5 different pages is complete and i have a working mockup :p

    I'm working on a script that triggers some hefty array retrievals and MIDI triggering on a 1ms timer. I truly didn't think Mozaic could handle that, but have been surprised at how much I can get away with.

    I'm so skeptical that I keep going back to do more and more testing. So far I haven't found performance show stoppers, only bugs in my scripting. The saying "if it seems too good to be true then it isn't true" keeps coming to mind though. :D

    (BTW, this script would be impossible to manage without your Textastic extension. Thanks so much for that!)

  • a script to shuffle presets with midi program change commands plus favorite bank...

    https://patchstorage.com/agogo-shuffle-version-1-0/

  • edited January 2020

    This is so thoughtful and much needed @nuno_agogo !! 👏👍👍👍 thank you.
    I wrote you on patch storage:

    Can you please add support for drum jam program change?

    It’s kind of complicated.

    It’s got 4 categories for changing programs:

    Bank select MSB (CC0) = 00 - program change messages load pad
    instruments (indexed from the alphabetically ordered list)
    Bank select MSB (CC0) = 01
    with LSB (CC32) picks the FACTORY preset group, with
    program change events selecting the preset within that group.
    Bank select MSB (CC0) = 02
    with LSB (CC32) picks the USER preset group, with
    program change events selecting the preset within that group.

    I got a Midiflow “Patch” of the different program change controls if that helps.

  • Hi @nuno_agogo I realy like your script. Very usefull and direct. Thanks.

    I did encounter a problem getting the script into Mozaic. The downloaded file did not include .mozaic in the filename. Had to add that to the filename to get it into Mozaic.

    Also found a bug: When stored as a favorite the combination 0-0-0 will not be sent.

    Looking at your code I spotted something ilegal being done to the arrays. Mozaic probably substitutes [ ] with a 0. Arrays in Mozaic can only contain numbers. It is suggested to use -1 as empty or uninitialized.

  • @Alfred said:
    Hi @nuno_agogo I realy like your script. Very usefull and direct. Thanks.

    I did encounter a problem getting the script into Mozaic. The downloaded file did not include .mozaic in the filename. Had to add that to the filename to get it into Mozaic.

    Also found a bug: When stored as a favorite the combination 0-0-0 will not be sent.

    Looking at your code I spotted something ilegal being done to the arrays. Mozaic probably substitutes [ ] with a 0. Arrays in Mozaic can only contain numbers. It is suggested to use -1 as empty or uninitialized.

    Hey Alfred! Thanks man! That's odd. The uploaded file has the proper file extension. I also did download it myself but all was fine here. What browser are you using?

    Will update another version soon and get rid of those bugs as well.

    Big up!

  • @Tamir_Raz_Mataz said:
    This is so thoughtful and much needed @nuno_agogo !! 👏👍👍👍 thank you.
    I wrote you on patch storage:

    Can you please add support for drum jam program change?

    It’s kind of complicated.

    It’s got 4 categories for changing programs:

    Bank select MSB (CC0) = 00 - program change messages load pad
    instruments (indexed from the alphabetically ordered list)
    Bank select MSB (CC0) = 01
    with LSB (CC32) picks the FACTORY preset group, with
    program change events selecting the preset within that group.
    Bank select MSB (CC0) = 02
    with LSB (CC32) picks the USER preset group, with
    program change events selecting the preset within that group.

    I got a Midiflow “Patch” of the different program change controls if that helps.

    will look into it. stay tuned :)

  • @nuno_agogo you are right the missing filetype was caused by iCab. An update must have caused that because it used to work fine.
    Also the download counter on patchStorage is kind of buggy...

  • edited January 2020

    @_ki said:
    @horsetrainer Hope your head didn‘t explode !

    I understood the theories but I'm still extremely fuzzy on how to write code that does what I want.

    I think it might be helpful for myself and others, to have comprehensive overviews for using one or two events or functions at a time. Even if the output of the examples are just a Log outputs.

    I envision code as being blocks of tasks. And I guess from what's been said here, what I'm calling a block, is the stuff that goes on between some @ Triggering Event, and the @ End.

    I played with the script that Wim wrote, that plays a strum after playing four individual notes. I tried very hard to figure out a way to edit a delay into win's code so after the 4th note was pressed, there would be a delay, and then the strum would start. I tried adding in a timer function, but I just couldn't get it to work.

    My heads really is stuck in thinking like the BASIC I learned back in the 1980's.

    I like the idea of line numbers, and having goto commands to steer the direction of the code to different areas of a program.

    Here's a simple question.... Can I put a delay event into mosaic that essentially pauses the script for a desired length of time? In the old basic days I'd use a for/next loop to add a delay. Does Mosaic have a function that you can use to tell the script to stop and wait for some number number of milliseconds, and then continue on?

    I kind of wish Mosaic had a function called "Delay" and you could use it to add pauses whenever you needed one.

  • _ki_ki
    edited January 2020

    No, there is no delay function in the way you imagine it.

    Since Mozaic is a realtime midi scripting environment, all the event blocks need to finish their stuff as fast as possible. So inserting a ‚wait‘ somewhere inside such event blocks is no feasible.

    Most midi send functions have an additional delay parameter, you could use this parameter to issue the notes ‚50msec in the future‘. The SendMidiNoteOn ch,note,vel, delay will return immediately to your event block, the event is just marked for future sending.

    .

    The timer event is something that gets called regularly until stopped again. For really making use of it, you need to have understood how things work in Mozaic. Its something that seems to run in parallel to what you else do in the script - so one needs to communicate through variables with the timer event block, to implement own triggers. It is possible to write script code that will issue notes stored in an array at a defined timer tick in the fuure - but you have to code all that yourself.

    A second ‚kind of parallel running‘ event is the OnMetroPulse, which is triggered in sync to the host tempo in a user specified divisions (Pulses per Quarter Note). This event only triggers if the host is running, but its more convenient to use since with CurrentMetroPulse you already get the current position in a bar (and don‘t have to code this yourself like with OnTimer)

  • edited January 2020

    Are all the Mozaic plugins that people have written on Patch Storage? And is there a list of 'must have' scripts. I'm sure it's all in this thread, but unfortunately this thread is 60 pages long...

  • _ki_ki
    edited January 2020

    @cian You find a categorized list of all Mozaic scripts of all scripts in the wiki. There are some scripts only published in forums threada, but i‘ll try to copy them to own wiki pages and link them.

Sign In or Register to comment.