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.

Request Mozaic help midi output depend on chord input

12357

Comments

  • heshes
    edited March 2020

    @Bellows said:
    Hi Hes,
    Thank you so much for your hard work. Last night I was able to use the FLY chord system as intended (minus column 6). It was very playable and fun to experiment with. I do not see any way to use column 6 which would be very good to have.

    Too bad about column 6. Glad it's working at minimal level, at least.

    Regarding column 6, remember that you wouldn't necessarily need to have it play the note the FLY system says. It could play a different note, or even one (or two) of several different notes, depending on the situation.

    Or, column 6 could play the FLY system note for that button while some other button is modified. For example, I don't know if it's useful to you, but we could get use column 6 to enable "power" chords (if by those you mean root, 5th, root-up-octave). To do this we might specify: Column 3 will play its FLY system minor 3rd pair in all cases, unless the root notes in column 2 and column 6 are both depressed when column 3 button is depressed, in which case the column 3 button will play only the 3rd of its pair, down an octave from what FLY system specifies. I think this enables power chords, e.g, C2-G2-C3 for what you call the 9th row. I don't know if that ends up screwing too much with playability or not. If it does, maybe there's some other way to get use out of column 6 by similar thinking outside the box of how FLY system is set up.

    Regarding single-note FLY system, yeah, that looks easy to set up. Again, don't know if it helps, but the Mozaic app could be set up so you could use something like a foot-control-button to switch on the fly between the two-note FLY system and one-note FLY system.

  • Thankyou for your thoughtful comments. I have some confusion though. I believe the problem with column 6 is that plays exactly the same notes as column 3. And that there is no way to differentiate between them.Please correct me if I am wrong.

    BTW, the foot switch idea to change between systems is a good one and could be very handy.

    Just an aside,
    I have reviewed some materials from the FLY people it appears they have other single note charts based mainly on different notes played on column 6. 🤪

  • heshes
    edited March 2020

    I'm talking about changing the FLY system button programming "on the fly" for a specific situation (to get a single note out of column 6 when you won't also be wanting pair of notes out of corresponding column 3 button) and in all other situations the column 3 and corresponding column 6 button would play the FLY system's column 3 pair of notes.

    So yes, column 6 will always play same note(s) as the button in column 3 one row up. But, if you were only ever going to use that column 6 note (the bass root + octave) in specific circumstances, you can program that column 6 button to play that FLY system note (the bass root + octave) only in that situation. Realize that this means the note(s) played by the corresponding button in column 3 would also change. So this method of programming column 6 to play that FLY system note can only work if you're not also pressing the corresponding button in row 3 (because they will always play the same notes).

    See if the power chord example in my previous post makes sense given that context, "on the fly temporary switching to play single note in column 6".

    I may as well program that example in and let you try it, it's easy to make that change. But really only useful if you had a desire to play a (root, fifth, root+octave) chord

  • Hi Hes,
    I am trying to grasp your concept. It sounds to me like you are saying we could have a column 6 button send out a different midi note based on what other notes are being played.
    I believe this is true of any note and I do not see the advantage because it would still apply to the button in column 3.
    I would like to reiterate that if for example an A3 note is held down it is the same as any other A3 note. Furthermore, if a second A3 button is pushed it has no effect on the program.
    My thought was that if we used a free bass system with as few repeated notes as possible we could output anything we wanted. The FLY system seemed to be possibly achievable. I think that your programming has proved that. It is remarkable that we can now emulate the FLY system on columns 1-5.
    That said, I believe column 6 action is impossible within the same parameters because it is not unique.

    The system on the accordion where all of the 12 notes of the scale are unique across the row is the Stradella system. I say the 12 notes because the repeated notes you see on the Stradella system are inconsequential and normal for an accordion.

    I think this leads us back to the Stradella system as the best input even though it is difficult to analyze the chord input. BTW, I am not adverse to a mountain of typing that I can understand. I understand that that kind of programming can slow down the cpu so maybe that would not work?

    Please tell me your thoughts. I am also glad to experiment with your “ on the fly” ideas.
    Thank you very much. As I said what you have accomplished is remarkable and very playable, which is the true test.😎

  • So sorry, disregard my previous posts. My apologies, my mind is not working well.

    Still, there is some way to control whether the col 6 note or col 3 pair of notes is sounded whenever one of that pair of col 3/col6 buttons is pressed. But as you point out, definitely not with the scenario I described for power chords, above. And maybe nothing that would be helpful or playable. I will think a little more.

    Maybe best solution for power chords would be a foot button to toggle between FLY system pair setup and FLY system single note setups.

    OR, a foot button could be used with the FLY system pair setup is always on, but it would control whether the note sounded when one of the corresponding col3/col6 pair is pressed would be the pair of col3 notes or the single col6 note. In practice, you could still disregard all col6 buttons, and the foot button would just control whether col3 buttons played their FLY system pair, or whether they would play the (root + octave) note.

  • Hi Hes, no apology needed.We are just brainstorming ideas. The more I think about it the more I like the foot switch idea for controlling different midi output from Mozaic. I recently bought an AirTurn 6 switch Bluetooth foot switch. I am setting it up for various midi controls.Being able to change the response of note output configuration by foot switch could be huge.
    I run it through AudioBus.
    Thanks for all your ideas 🙏

    Also I appreciate all the comments in the script. Everyday I try to understand a bit more but can only get tiny insights.

  • @Bellows said:
    I recently bought an AirTurn 6 switch Bluetooth foot switch. I am setting it up for various midi controls.Being able to change the response of note output configuration by foot switch could be huge.
    I run it through AudioBus.

    Just let me know what midi commands the foot switch sends (maybe use Midi Wrench) and I'll try to integrate it into the app.

  • Hi Hes,
    The foot switch is BT200S-6. There are 6 footswitches. They can be momentary or toggle. They can send CC #s with selected values or midi notes with velocity values. Each switch can also send 2 commands at once or in sequence. They can also each have a selected midi channel. There are MANY other parameters that can be set up.
    I have been using CC#s so far and have attached a MidiWrench pic. It sends it signals via Bluetooth and I have used it well with Audiobus.

  • heshes
    edited March 2020

    Okay, here's something you can try. Sort of minimal proof of concept to get a change with foot switch. Follow steps below and see if toggling buttons on the airturn makes a difference for buttons in columns 1 and 2.

    1. Start routing the notes from accordion column 1 and 2 thru Mozaic, but on a different channel than 0 (which has rows 3 thru 6). Any channel other than 0, doesn't matter which one. Those notes will be fed through and come out of Mozaic on same channel they go in on.

    2. Start sending the midi from the airturn controller into Mozaic. I don't think the channel you use will matter.

    3. Then add the following code at the top of the script, for @OnLoad and @OnMidiCC events:

    @OnLoad
      doublebass = 0
    @END
    
    @OnMidiCC
      if MidiByte3 = 127
        doublebass = 1 - doublebass
      endif
    @END
    
    1. Then add these lines to top of code in current @OnMidiNote event, right after the 'note = MidiByte2' line:
    @OnMIDINote
    
       note = MIDIByte2    ////  ******* this line is there now
    
      /// new lines below
      if MIDIChannel > 0
        SendMidiThru
        if doublebass
          SendMIDIOut MIDIByte1, note + 12, MIDIByte3
        endif
        exit
      endif
    
    // rest of current code 
    
    
    
  • Hi Hes,
    I have tried the script and so far the footswitch has no effect at all. The script still functions and I am sending pics of data.

    1. Note MidiWrench data has blue background. It is data send from my accordion and the footswitch. The footswitch is being held down for value of 127 at the midpoint of notes played. Notes played were Column1 through Column 6 two times all in the C row. You should be able to see this in the MidiWrench pic. It is the input to Mozaic. I normally have the CC data filtered out but included it so you can see the footswitch was sending a CC signal. The bellows normally sends CC #11 expression values but I keep them very still so it would not interfere. Proved by the fact that you cannot see any CC #11 evidence.

    2. The black background data is from the midi monitor on the output of Mozaic. It can only show note data and not CC. Also note that the midi channel numbers are off by one. Midi monitor uses 1-16. MidiWrench used 0-15.

    It would be helpful if we could log the CC info to prove it is being received. I experimented with my midi settings in AudioBus for D1 . It is being received there.


  • The MidiMonitor is 2 pics because it would not display all at once. Would it have been better to send text data?

  • Newest data from MidiFlow keyboard and midiflow channels
    Note MidiFlow Channels uses 1-16
    In Audiobus MidiFlow Channels before Mozaic
    Input Channel 1
    Output channel 1
    C6 on keyboard plays A#3 and G3 CH 1

    Input Channel 1
    Output channel 2
    C6 plays C6 CH 2

    Input Channel 1
    Output CH 3
    C6 plays C6 CH3

    Input Channel 1
    Output CH 4
    C6 Plays C6 CH4

    IInput channel > 1
    No output
    Conclusion MidiFlow keyboard only sends CH 1 of 1-16 channels.

    Data shows midi channel 1 (0 for Mozaic)
    Plays A#3 and G3 when C6 is played on channel 1
    Also data shows midi channel >1 (>0 for Mozaic) C6 plays C6 on the same channel used.

  • Not sure what's going on. But, yes, definitely should log to check if the cc command is triggering the proper event. Just put a log command in there like this:

    @OnMidiCC
    ************** NEW LINE ***************
      log {byte1: }, midibyte1, {       byte2: }, midibyte2, {      byte3: }, midibyte3
    **************************************
      if MidiByte3 = 127
        doublebass = 1 - doublebass
      endif
    @END
    
  • Hi Hes,
    I know this is rudimentary to you but I have put in my own script for a data logger 🥳
    Whoo Hoo. In doing so I learned that MIDIByte 2 (not 3) is the value.
    Shouldn’t the line after
    @OnMidiCC. actually be
    If MIDIByte 2 = 127. ?
    Thanks

  • My mistake I think

  • My logger shows that the CC event is 69, the value is 0 or 127 and it is on channel 1.
    Is the channel a problem?

  • How does the script know MIDIByte 3 refers to the CC event as opposed to some midi note?
    Can you show me an easy to understand script to test if a variable is true?
    For instance I would like to know if doublebass is true.
    Thanks

  • Sorry to fire questions so fast BUT
    because the @OnMidiNote event has 2 if statements should it have 2 endif statements?
    Thanks

  • heshes
    edited March 2020

    We want the logger in the code in Mozaic, in large part just to monitor whether it's getting routed to that point. So if you put the log line in I suggested, it gives us info in a couple ways: (1) we expect something to be logged, and nothing is, which means program execution isn't reaching that point, or (2) something is logged, and we can check the values that are getting logged to make sure they're what we expect.

    RE: midibyte3, it's just the way midi works, in the @OnMidiCC and midi cc commands the 3rd byte is a (generic) data value. That's different from a midi note command in @OnMidiNote, where third byte is always specifically for velocity.

  • Hi Hes,
    I understand about the MIDIByte. I just made a mistake.
    I did put my logger in the Mozaic script.
    ‘’’@OnMidiCC
    Log {CC Event Captured. }, MIDIByte2. ,{. Value. }, MIDIByte3. , {. Channel. }, MIDIChannel’’’

    It is working correctly but I will use yours if it is better or just to keep us in sync.

  • Okay, so it that logger logging anything, what does the output look like? Also, to log doublebass, you just put that in a logging statement. For example, one good spot to check would be to check that we're getting to the line that changes doublebass value:

    doublebass = 1 - doublebass
    

    You can add a log immediately before or after that line, e.g.,:

    doublebass = 1 - doublebass
    log {just changed doublebass to: }, doublebass
    

    Sometimes you might want to add a log that doesn't even record a value, just notes that program execution passed a certain spot, e.g.,:

    log {we got to here . . . }
    
  • @Bellows said:
    How does the script know MIDIByte 3 refers to the CC event as opposed to some midi note?

    For this one the answer is that if we're in the @OnMidiCC event handler, we know we're processing a cc command. Midi note commands won't trigger the @OnMidiCC event.

  • Data Logging from Mozaic

    Sending midi notes C3, D3, E3, F3 from MidiFlowKeyboard on channel 0
    Then pressing and releasing foot switch button:

    row: 1 column: 16 turning on base note: 61 and note 2: 64
    row: 2 column: 16 turning on base note: 61 and note 2: 65
    row: 1 column: 17 turning on base note: 68 and note 2: 71
    row: 0 column: 18 turning on base note: 67 and note 2: 70
    CC Event Captured. 69. Value. 0. Channel 0
    . Just changed doublebass to: 1
    CC Event Captured. 69. Value. 127. Channel 0
    row: 1 column: 16 turning on base note: 61 and note 2: 64
    row: 2 column: 16 turning on base note: 61 and note 2: 65
    row: 1 column: 17 turning on base note: 68 and note 2: 71
    row: 0 column: 18 turning on base note: 67 and note 2: 70
    CC Event Logger
    [MOZAIC] Script loaded.

    Double notes are sounded while on channel 0 input
    —————————————————————————————————

    Sending midi notes C3, D3, E3, F3 from MidiFlowKeyboard on channel 1
    Then pressing and releasing foot switch button:

    [OnMidiNote] Syntax Error: unknown or invalid argument " "
    [OnMidiNote] Syntax Error: unknown or invalid argument " "
    [OnMidiNote] Syntax Error: unknown or invalid argument " "
    [OnMidiNote] Syntax Error: unknown or invalid argument " "
    [OnMidiNote] Syntax Error: unknown or invalid argument " "
    [OnMidiNote] Syntax Error: unknown or invalid argument " "
    [OnMidiNote] Syntax Error: unknown or invalid argument " "
    [OnMidiNote] Syntax Error: unknown or invalid argument " "
    CC Event Captured. 69. Value. 0. Channel 1
    . Just changed doublebass to: 1
    CC Event Captured. 69. Value. 127. Channel 1
    CC Event Logger
    [MOZAIC] Script loaded.

    Single notes are sounded when on channel 1 input

  • I have found I only log the syntax errors when the doublebass = 1

  • That's good info, seems the foot switch stuff is working. So problem is in the new block of code in @OnMidiNote. Try changing to this:

     /// new lines below
      log {before if}
      if MIDIChannel > 0
        log {before midithru}
        SendMidiThru
        log {before if doublebass}
        if doublebass
          log {in if doublebass}
          SendMIDIOut MIDIByte1, note + 12, MIDIByte3
        endif
        log { after if doublebass }
        exit
      endif
    

    That may give more info. We'll see where the syntax error happens, in relation to the log items. Also, you can try changing the line that says 'if doublebass' to say instead 'if doublebass = 1' .

    Regarding logging, it can to "comment out" the logging of the notes toward bottom of the script. We know that parts working, and it creates output that kind of clogs up reading things. So comment those out if you want with the doubleslash (//) to start the line.

  • This is what I have now for code. I am not sure is some lines are supposed to only be comments.

    @OnLoad
    // v. 0.1 Hes latest March 13
    // fixed several remaining note pairs that
    // were sounding an octave too high,
    // revised logging
    // footswitch added
    Log {CC Event Logger}

    doublebass = 0
    @END

    @OnMidiCC
    Log {CC Event Captured. }, MIDIByte2 , {. Value. }, MIDIByte3 , {. Channel }, MIDIChannel
    if MidiByte3 = 127
    doublebass = 1 - doublebass
    Log {just changed doublebass to: }, doublebass
    endif
    @END

    @OnMidiNote

    note = MIDIByte2
    //new lines below
    if MIDIChannel > 0
    SendMidiThru
    if doublebass
      SendMIDIOut MIDIByte1, note + 12, MIDIByte3
    endif
    exit
    endif

    // rest of current code after this
    // notes in row 3 thru 5 have values
    // ranging from 40 to 99

    // first we will determine what row and column
    // of button we're dealing with, for FLY system

    // this will give us 1 - 20, left to right

    button_col = 1 + ( div (59-(note-40)), 3)

    note = note + 1 // Free Bass to FLY adjustment

    // gives us 0 to 2, which correspond to 3 to 5 on actual bank
    temp = note % 3

    // adjust b/c only middle row of
    // the three has correct FLY note right now
    if temp = 0
    row = 0
    dec note
    elseif temp=2
    row=1
    elseif temp=1
    row=2
    inc note
    endif

    // now all 3 notes in same column have same FLY note

    // let's get the base FLY note
    note = 4 + ((button_col-1) * 7)
    note = note % 12

    // and now we need to adjust octave register
    // to be what FLY system wants
    // based on what row and column it's in

    // current note value is 0 - 11, we want to
    // add 12 to get it up to the octave 0 register
    note = note + 12

    c = button_col // just to save typing

    if row = 1 // row 4 on actual bank

     if (c < 9) or (c = 12) or (c = 14) or (c = 20) or ( c = 10)
       note = note + ( 3 * 12 )
     else
       note = note + ( 4 * 12 )
     endif
    

    elseif row = 0 // row 3 on actual bank

     note = note + 4   // base FLY chord note is up major 3rd
     // now adjust register
     // start with default of 3rd octave and adjust from there
     note = note + (3 * 12)
     if (c = 1) or (c = 3) or (c = 2) or (c = 5) or (c = 7)
        note = note - 12    // adjust down
     elseif (c = 16) or (c = 18)
        note = note + 12    // adjust up
     endif
    

    elseif row = 2 // row 5 on an actual bank

     // start with default of 3rd octave and adjust from there
     note = note + (3 * 12)
     if (c < 4) or (c = 5) or (c = 7)
        note = note - 12    // adjust down
     elseif (c = 16) or (c = 18)
        note = note + 12    // adjust up
     endif
    

    endif

    // at this point the incoming note from Free Bass system
    // has been converted to a base note for FLY system
    // which we will voice according to the rules
    // for its button row

    chordnote1 = note
    if row = 0 // row 3 on actual bank
    chordnote2 = note + 3
    elseif row = 1 // row 4 ...
    chordnote2 = note + 3
    elseif row = 2 // row 5 ...
    chordnote2 = note + 4
    endif

    if MIDICommand = 144
    log {row: }, row, { column: }, c, { turning on base note: }, chordnote1, { and note 2: }, chordnote2
    endif

    // now we send the midi for the note pair
    // if note on cmd was received this will turn on
    // if note off cmd was received this will turn off
    SendMIDIOut MIDIByte1, chordnote1, MIDIByte3
    SendMIDIOut MIDIByte1, chordnote2, MIDIByte3

    @END

  • No real need to comment anything out. Just focus on that new block of code, adding the logging. It's possible the 'if doublebass = 1' change might fix things. If so it's a bug in Mozaic itself, since manual says just 'if doublebass' should work, but I'm suspicious. Don't have my ipad here to check myself.

  • edited March 2020

    Hi I changed the
    if doublebass to if doublebass = 1
    There was no change.
    There is much that I do not understand but I am curious about the line in the @MidiCC:

    ‘’doublebass = 1 - doublebass’’

    Can you explain it’s purpose?
    I am just about to make the other changes.

  • Hi Hes,
    Here is the Log. I am set for channel >0 and have pressed one note then the footswitch and one note etc.

    New Log changes for Midi note looking for Syntax error

    after if doublebass
    before if doublebass
    before midithru
    before if
    after if doublebass
    before if doublebass
    before midithru
    before if
    CC Event Captured. 69. Value. 0. Channel 1
    just changed doublebass to: 0
    CC Event Captured. 69. Value. 127. Channel 1
    after if doublebass
    [OnMidiNote] Syntax Error: unknown or invalid argument "NOTE"
    in if doublebass
    before if doublebass
    before midithru
    before if
    after if doublebass
    [OnMidiNote] Syntax Error: unknown or invalid argument "NOTE"
    in if doublebass
    before if doublebass
    before midithru
    before if
    CC Event Captured. 69. Value. 0. Channel 1
    just changed doublebass to: 1
    CC Event Captured. 69. Value. 127. Channel 1
    after if doublebass
    before if doublebass
    before midithru
    before if
    after if doublebass
    before if doublebass
    before midithru
    before if
    CC Event Logger
    [MOZAIC] Script loaded.

    I think the answer is here.
    Thanks

  • heshes
    edited March 2020

    Okay, it looks like maybe the SendMidiOut command doesn't let us include a calculation in its arguments. So we will break this line:

         SendMIDIOut MIDIByte1, note + 12, MIDIByte3
    

    into two lines:

         note = note + 12
         SendMIDIOut MIDIByte1, note, MIDIByte3
    

    See if that works.

    I will check at some point, I also wonder if maybe it would work if we removed the spaces from 'note + 12', changing to this:

         SendMIDIOut MIDIByte1, note+12, MIDIByte3
    
Sign In or Register to comment.