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.

Request new Mozaic Scripts *HERE*

1525355575862

Comments

  • @dobbs said:
    I think the problem with single channel and channel per part is that with these settings you don't have any poly-aftertouch etc.
    but yeah using it as a little 4 track midi sequencer is something I'm also looking forward to :D

    Roli has a new keyboard that might be fun to play around with.

    slightly different price point though :P did you buy one?

    No. I do hold back on the prices… but I’m getting bored with the toys I own. I got the Enhancia Ring for $100 and
    It can send similar types of MIDI controls. Since the company went under I could resell the Ring to offset the cost of the
    Roli.

    If your looking for a cool Moziac project consider simple sequencers… that’s a rat hole I went down for months.
    I even got a Realtime MIDI Recorder to work with a 255 note limit. Step Sequencers that save incoming notes to an array and send them out in Sync with the DAW’s clock is fun. The Realtime solution saves all the relevant stats to parallel arrays using a common index:

    Note
    Velocity
    System Time

    Play back does the “delta” calculation on the System times and requests all the notes be sent out with the “system time delta” added as a MIDI delay option. So, I can send up to 256 notes in a batch.

    Getting the time right between batch’s to do longer recordings is where I stopped on that effort. You want the batch dispatch to be really precise to make it all seemless.

  • edited November 2022

    maybe the keith mcmillen board would be worth considering, someone posted it here a short while ago. MPE pressure and you can tilt the keys?, so no glide...but still, only 100 bucks https://www.keithmcmillen.com/products/k-board/

  • edited November 2022

    @OnLoad ShowLayout 2 min = 0 max = 16383 bias = 1.0 LabelKnob 0, {min} LabelKnob 1, {max} LabelKnob 2, {bias} SetKnobValue 0, min/128 SetKnobValue 1, max/128 SetKnobValue 2, bias @End @OnPadDown value = LastPad value = TranslateScale value, 0, 15, min, max value = TranslateCurve value, bias, min, max SendMIDIPitchBend 0, value Log value @End @OnKnobChange knob = LastKnob rangeVal = GetKnobValue knob rangeVal = rangeVal * 128 if LastKnob = 0 min = rangeVal Log rangeVal endif if LastKnob = 1 max = rangeVal Log rangeVal endif if LastKnob = 2 bias = GetKnobValue knob bias = TranslateScale bias, 0, 127, 0, 2.0 endif @End

    @dobbs it’s a bit pappy but I think it works - the bias setting can be set to taste, im not sure how to set it correctly for exponential, or if that’s even the best way to do it, dealer’s choice really :smile:

  • edited November 2022

    after looking it up in the mozaic manual I still don't have the slightest clue what translatecurve does :D I guess for a version where you want to give the pads values corresponding to the frequencies of the chromatic scale you don't really need the min/max knobs because only one max-min makes sense, and then it would be easiest to just manually give each pad its value... hmm, or you put in the formula... ---redacted----
    I'm super tired and it's very late and it's been like 5 years since the last time I did maths beyond the rule of three, so maybe this is all complete nonsense :D

    edit: yes it was

  • wimwim
    edited November 2022

    Hey @krupa - to code-format a block like you have a couple of posts up, put three back-ticks (```) on a line by themselves before and after the code. The single back-tick only works for short inline code snippets.

  • McDMcD
    edited November 2022

    @dobbs

    I created a MIDI Monitor that can turn on/off MIDI types to reduce the cluttter when looking at the PitchBend output.

    A major use of a Monitor that can filter by MIDI type is when you want to send a specific MIDI stream to a target for MIDI learn. This Monitor script can be used to create custom MIDI configs in AUM mapping CCs to AU Parameters or GUI controls.

    MIDI PitchBend SPEC:
    PitchBend is a 14-bit value with 7 bits in MIDIByte2 and 7 bits in MIDIByte3.
    The numbers sent in Byte 3 are worth 128 each and Byte 2 are just their 0-127 value. So, PitchBends can swing from 0 to (127 + (128*127) or 0 to 16,383.

    The Orba only send 63 or 64 in MIDIByte 3 so the number range is 63128 to 127+64128 or 8,064 to 8,319. That's a little 256 value hole in the 0-16,383 that a synth expects. No wonder you can barely hear it. BUT with a pitch bend wheel you can assume it stings back to the middle 8,063 position.

    So, Orba PitchBends are a really small vibrato +/- 127 around the center 8,064 position of a pitch bend wheel.

    To hack a solution the value of Byte2 (63 or 64) needs to feed a scale translation for Byte2:

       If MIDIByte3 = 63
          PitchBend = ScaleTranslate MIDIByte2, 0,127,0,8191
       elseif MIDIByte3 = 64
          PitchBend = ScaleTranslate MIDIByte2 0,127,8192,16,383
       Endif
    

    The jumps might be a little rough but this shows how come the untreated PitchBend even at 100% is just a little wiggle for vibrato. But since PitchBend is mapped to the degree the finger is off the centerline this protects the Orba from sending out PitchBends that a totally out of tune.

    The 63 value covers off center to one side and 64 indicates off center to the other side.

    My montitor script works for any MIDI Logging by MIDI Type. I intend to add PADs to toggle MIDI Types on and off but here’s the current script for anyone to study or play with. The MidiType is enable by setting it’s Variable to a 1 in the Onload section:


    @Description This is a MIDI Logging Script @End @OnLoad // ShowLayOut 1 // 22 Knobs ShowLayout 2 // 16 Pads + 4 Knobs // ShowLayOut 3 // 10 Rotary Dials + X-Y Pad // ShowLayOut 4 // Description Box + 4 Knobs CC = 0 PC = 0 PolyPressure = 0 //Polyphonic AfterTouch ChannelPressure = 0 // Monophonic AfterTouch AfterTouch = 0 PitchBend = 1 Note = 0 @End @OnMidiInput if MidiCommand = 0x80 if Note Log {Note Off = }, MidiNote endif endif if MidiCommand = 0x90 if Note Log {Note On = }, MidiNote endif endif if MidiCommand = 0xA0 if PolyPressure Log {Channel = }, MidiChannel Log {PolyPressure = }, MidiByte2, { }, MidiByte3 endif endif if MidiCommand = 0xB0 if CC Log {CC = }, MidiByte2, { }, MidiByte3 endif endif if MidiCommand = 0xC0 if PC Log {Program Change = }, MidiByte2, { }, MidiByte3 endif endif if MidiCommand = 0xD0 if ChannelPressure Log {Channel = }, MidiChannel Log {ChannelPressure = }, MidiByte2, { }, MidiByte3 endif endif if MidiCommand = 0xE0 if PitchBend Log {Channel = }, MidiChannel Log {Pitch Bend = }, MidiByte2, { }, MidiByte3, { }, MidiByte2+(128*MidiByte3) endif endif // Log MidiByte1, {, }, MidiByte2, {, }, MidiByte3 @end
  • @wim said:
    Hey @krupa - to code-format a block like you have a couple of posts up, put three back-ticks (```) on a line by themselves before and after the code. The single back-tick only works for short inline code snippets.

    Cheers, I might have to try on a non mobile device as I’ve just edited it like that but it’s made it worse 😅

  • edited November 2022

    @McD very cool, thanks!

    Gosh I need to find a good resource to read up on all that stuff… at least i found the official listig midi commands now https://www.midi.org/specifications-old/item/table-2-expanded-messages-list-status-bytes

    I was already wondering how pitchbend could cover multiple octaves smoothly with just 128 steps, but yeah, that makes more sense now :p

  • “Reinventing the wheel”: I was poking around for the faster way to get the Bluetooth Midi config menu in AUM and I happened across the “Filter” menu… go figure:

    But I will continue because I want to Log MIDI event by type and have a switch to control forwarding that MIDI or not.

  • The Orba Manual has clarification about the limitations of the “Vibrato” implemented via Pitch Bend:

  • I added all the Obra specific MIDI events to my Mini Monitor script:

    Just change variables to a 1 (or anything great than zero) to Log events of that type:


    @Description This is a MIDI Logging Script with logical switches for Orba 1/2 events but also useful as a generic MIDI logger. I will add PAD switches for the Event Types and SendMIDIThru so the script can function as a filter to use for setting up MIDI Learn Associations. @End @OnLoad // ShowLayOut 1 // 22 Knobs ShowLayout 2 // 16 Pads + 4 Knobs // ShowLayOut 3 // 10 Rotary Dials + X-Y Pad // ShowLayOut 4 // Description Box + 4 Knobs CC = 0 Tilt1 = 0 Shake2 = 0 Radiate74 = 0 Spin112 = 0 Move113 = 0 PC = 0 PolyPressure = 0 ChannelPressure = 0 AfterTouch = 0 PitchBend = 0 Note = 1 Bump39 = 0 Shake69 = 0 @End @OnMidiInput if MidiCommand = 0x80 if Note if Bump39 if MidiByte2 = 39 Log {Bump Note 39} endif elseif Shake69 if MidiByte2 = 69 Log {Shake Note 69} endif endif endif endif if MidiCommand = 0x90 if Note if Bump39 Log {Bump Note 39} elseif Log {Note On = }, MidiNote endif endif endif if MidiCommand = 0xA0 if PolyPressure Log {Channel = }, MidiChannel Log {PolyPressure = }, MidiChannel, { }, MidiByte2, { }, MidiByte3 endif endif if MidiCommand = 0xB0 if CC if Tilt1 if MidiByte2 = 1 Log {Tilt_CC1 = }, MidiChannel, { }, MidiByte2, { }, MidiByte3 endif endif if Shake2 if MidiByte2 = 2 Log {Shake_CC2 = }, MidiChannel, { }, MidiByte2, { }, MidiByte3 endif endif if Radiate74 if MidiByte2 = 74 Log {Radiate_CC74 = }, MidiChannel, { }, MidiByte2, { }, MidiByte3 endif endif if Spin112 if MidiByte2 = 112 Log {Spin_CC112 = }, MidiChannel, { }, MidiByte2, { }, MidiByte3 endif endif // Log {CC = }, MidiByte2, { }, MidiByte3 if Move113 if MidiByte2 = 113 Log {Move_CC113 = }, MidiChannel, { }, MidiByte2, { }, MidiByte3 endif endif // Log {CC = }, MidiByte2, { }, MidiByte3 endif endif if MidiCommand = 0xC0 if PC Log {Program Change = }, MidiChannel, { }, MidiByte2, { }, MidiByte3 endif endif if MidiCommand = 0xD0 if ChannelPressure Log {ChannelPressure = }, MidiChannel, { }, MidiByte2, { }, MidiByte3 endif endif if MidiCommand = 0xE0 if PitchBend Log {Channel = }, MidiChannel Log {Pitch Bend = }, MidiByte2, { }, MidiByte3, { }, MidiByte2+(128*MidiByte3) endif endif // Log MidiByte1, {, }, MidiByte2, {, }, MidiByte3 @End
  • I added the PAD switches for MIDI types and specific Orba CC features. I think it might be wise to use the 4 available Knobs as CC Targets and preset them to Orba Defaults but let the user reset them to specific CC’s they would like to monitor:

    ```

    @Description

    This is a MIDI Logging Script with logical switches for Orba 1/2 events
    but also useful as a generic MIDI logger. I will add PAD switches for the
    Event Types and SendMIDIThru so the script can function as a filter to use
    for setting up MIDI Learn Associations.

    @End

    @OnLoad

    // ShowLayOut 1 // 22 Knobs
    ShowLayout 2 // 16 Pads + 4 Knobs
    // ShowLayOut 3 // 10 Rotary Dials + X-Y Pad
    // ShowLayOut 4 // Description Box + 4 Knobs

    CC = 0
    Tilt1 = 0
    Shake2 = 0
    Radiate74 = 0
    Spin112 = 0
    Move113 = 0
    PC = 0
    PolyPressure = 0
    ChannelPressure = 0
    AfterTouch = 0
    PitchBend = 0
    Note = 0
    Bump39 = 0
    Shake69 = 0
    PassThrough = 0

    LabelPad 0, {All CC's}
    LabelPad 1, {Tilt CC1}
    LabelPad 2, {Shake CC2}
    LabelPad 3, {Radiate 74}
    LabelPad 4, {Spin CC112}
    LabelPad 5, {Move CC113}
    LabelPad 6, {Prog Change}
    LabelPad 7, {Poly Pressure}
    LabelPad 8, {Ch Pressure}
    LabelPad 9, {AfterTouch}
    LabelPad 10, {Pitch Bend}
    LabelPad 11, {Notes}
    LabelPad 12, {Bump Note 39}
    LabelPad 13, {Shake Note 69}
    LabelPad 14, { }
    LabelPad 15, {Passthrough Off}

    @End

    @OnPadDown

    If LastPad = 0
    If CC = 0
    CC = 1
    ColorPad 0, 1
    else
    CC = 0
    ColorPad 0, 0
    endif

    elseif LastPad = 1
    If Tilt1 = 0
    Tilt1 = 1
    ColorPad 1, 1
    else
    Tilt1 = 0
    ColorPad 1, 0
    endif

    elseif LastPad = 2
    If Shake2 = 0
    Shake2 = 1
    ColorPad 2, 1
    else
    Shake2 = 0
    ColorPad 2, 0
    endif

    elseif LastPad = 3
    If Radiate74 = 0
    Radiate74 = 1
    ColorPad 3, 1
    else
    Radiate74 = 0
    ColorPad 3, 0
    endif

    elseif LastPad = 4
    If Spin112 = 0
    Spin112 = 1
    ColorPad 4, 1
    else
    Spin112 = 0
    ColorPad 4, 0
    endif

    elseif LastPad = 5
    if Move113 = 0
    Move113 = 1
    ColorPad 5, 1
    else
    Move113 = 0
    ColorPad 5, 0
    endif

    elseif LastPad = 6
    if PC = 0
    PC = 1
    ColorPad 6, 1
    else
    PC = 0
    ColorPad 6, 0
    endif

    elseif LastPad = 7
    if PolyPressure = 0
    PolyPressure = 1
    ColorPad 7, 1
    else
    PolyPressure = 0
    ColorPad 7, 0
    endif

    elseif LastPad = 8
    if ChannelPressure = 0
    ChannelPressure = 1
    ColorPad 8, 1
    else
    ChannelPressure = 0
    ColorPad 8, 0
    endif

    elseif LastPad = 9
    if AfterTouch = 0
    AfterTouch = 1
    ColorPad 9, 1
    else
    AfterTouch = 0
    ColorPad 9, 0
    endif

    elseif LastPad = 10
    if PitchBend = 0
    PitchBend = 1
    ColorPad 10, 1
    else
    PitchBend = 0
    ColorPad 10, 0
    endif

    elseif LastPad = 11
    if Note = 0
    Note = 1
    ColorPad 11, 1
    else
    Note = 0
    ColorPad 11, 0
    endif

    elseif LastPad = 12
    if Bump39 = 0
    Bump39 = 1
    ColorPad 12, 1
    else
    Bump39 = 0
    ColorPad 12, 0
    endif

    elseif LastPad = 13
    if Shake69 = 0
    Shake69 = 1
    ColorPad 13, 1
    else
    Shake69 = 0
    ColorPad 13, 0
    endif

    // elseif LastPad = 14

    elseif LastPad = 15
    if PassThrough = 0
    PassThrough = 1
    LabelPad 15, {Passthrough On}
    ColorPad 15, 1
    else
    PassThrough = 0
    LabelPad 15, {Passthrough Off}
    ColorPad 15, 0
    endif
    endif

    @End

    @OnMidiInput

    if MidiCommand = 0x80
    if Bump39
    if MidiByte2 = 39
    Log {Bump Note 39}
    if PassThrough
    SendMidiThru
    endif
    endif
    elseif Shake69
    if MidiByte2 = 69
    Log {Shake Note 69}
    if PassThrough
    SendMidiThru
    endif
    endif
    elseif Note
    Log {Note Off = }, MidiChannel, { }, MidiByte2, { }, MidiByte3
    if PassThrough
    SendMidiThru
    endif
    endif
    endif

    if MidiCommand = 0x90
    if Note
    if Bump39
    if MidiByte2 = 39
    Log {Bump Note 39}
    if PassThrough
    SendMidiThru
    endif
    endif
    elseif Shake69
    if MidiByte2 = 69
    Log {Shake Note 69}
    if PassThrough
    SendMidiThru
    endif
    endif
    else
    Log {Note On = }, MidiChannel, { }, MidiByte2, { }, MidiByte3
    if PassThrough
    SendMidiThru
    endif
    endif
    endif
    endif

    if MidiCommand = 0xA0
    if PolyPressure
    Log {Channel = }, MidiChannel
    Log {PolyPressure = }, MidiChannel, { }, MidiByte2, { }, MidiByte3
    endif
    endif

    if MidiCommand = 0xB0
    if Tilt1
    if MidiByte2 = 1
    Log {Tilt_CC1 = }, MidiChannel, { }, MidiByte2, { }, MidiByte3
    endif
    endif
    if Shake2
    if MidiByte2 = 2
    Log {Shake_CC2 = }, MidiChannel, { }, MidiByte2, { }, MidiByte3
    endif
    endif
    if Radiate74
    if MidiByte2 = 74
    Log {Radiate_CC74 = }, MidiChannel, { }, MidiByte2, { }, MidiByte3
    endif
    endif
    if Spin112
    if MidiByte2 = 112
    Log {Spin_CC112 = }, MidiChannel, { }, MidiByte2, { }, MidiByte3
    endif
    endif
    if Move113
    if MidiByte2 = 113
    Log {Move_CC113 = }, MidiChannel, { }, MidiByte2, { }, MidiByte3
    endif
    endif

    if CC = 1
      Log {CC = }, MidiChannel, { }, MidiByte2, {  }, MidiByte3 
    endif
    

    endif

    if MidiCommand = 0xC0
    if PC
    Log {Program Change = }, MidiChannel, { }, MidiByte2, { }, MidiByte3
    endif
    endif

    if MidiCommand = 0xD0
    if ChannelPressure
    Log {ChannelPressure = }, MidiChannel, { }, MidiByte2, { }, MidiByte3
    endif
    endif

    if MidiCommand = 0xE0
    if PitchBend
    Log {Pitch Bend = }, MidiChannel, { }, MidiByte2, { }, MidiByte3, { }, MidiByte2+(128*MidiByte3)
    endif
    endif

    // Log MidiByte1, {, }, MidiByte2, {, }, MidiByte3

    @End

    ``

  • @wim said:

    @Gavinski said:
    I imagine there is already a script for this but I wonder if one of the gurus knows which.

    Is there a script that has a bunch of pads ...

    A "bunch"? Mozaic only has 16 pads. Is that how many you had in mind, or were you somehow thinking of more, perhaps in banks or something?

    (As far as interface juggling and coding goes, limiting it to 16 pads and just using multiple instances would be significantly simpler.)

    ... where each pad can be given an assignable channel, CC number and value and turned on or off ...

    What do you mean by "on or off"? Do you mean alternating between value 0 and the assigned value with each press?

    ... with a press and / or overridden when a pad with the same channel and CC but a different value is pressed? This would be very useful for 'playing' things like the pitch slider in Objeq or the 'band' setting in Lo-fi-af in musical ways. Or does anyone else have elegant solutions for using other apps or methods to do this?

    You mention pitch. I'm not clear if the pitch slider you're referring to uses a CC or if it uses the Pitch Bend message, which is a different MIDI message ranging from 0 to 16,383 with 8,192 being no bend. Would Pitch Bend need to be an option for the pads? If so, would 8,192 be the "off" value?

    I don't want to create the expectation that I'll take this on since I'm starting a new job that is pretty much kicking my ass and may not be up for it. But understanding what you've got in mind a bit better would help to understand how much effort it could be.

    Hi Wim,

    Thanks for asking for clarification, yes I didn't express it clearly enough. As you will have seen Krupa was kind enough to take a stab at this and what he has come up with is pretty cool.

    What I really want is for Objeq to be able to play pitches from sequencers. Eg, I would like to use an impulse, put objeq on that and make a sequencer 'play' the pitch of Objeq according to the scale etc it is sending out.

    Of course you can always just sample any sound, processed by objeq and tuned by ear, into a sampler and play that via keyboard but it is a less elegant and a slower solution than what I'm asking for. As Objeq has no midi note in I guess there needs to be a way for the mozaic script to convert midi notes from a sequencer to pitch bend messages. And for the pads in Mozaic to be played by note messages?

    Yeah, 'turning off' is maybe more complicated than it sounds.

    I think a few of the other things you mentioned like pitch bend values have been discussed by other commenters and maybe this is all more complicated than I imagined.

    Cheers!

    Gav

  • mozaic doesn't have access to the phone's gyros, has it? But drambo has a gyro module that could send out MIDI?

  • @dobbs said:
    mozaic doesn't have access to the phone's gyros, has it? But drambo has a gyro module that could send out MIDI?

    Mozaic has access to the gyros. See motionpitch, motionroll and motionyaw in the docs

  • edited November 2022

    Oh cool you're right.

    Oh man I wanted to write something to use the XY pad to morph between 4 different values,but io and behold,that already exists as a function too :D

    Says in the manual that AU parameters are 32bit/way more precise than midi, is that true for all AU parameters that all the plugins expose? That would come in very handy

  • wimwim
    edited November 2022

    @dobbs said:
    Oh cool you're right.

    Oh man I wanted to write something to use the XY pad to morph between 4 different values,but io and behold,that already exists as a function too :D

    Says in the manual that AU parameters are 32bit/way more precise than midi, is that true for all AU parameters that all the plugins expose? That would come in very handy

    Generally, yes, AU parameters can be more precise, however it depends on how the plugin developer has implemented them. They can be as coarse as two values, say for an on/off switch, or anywhere up to the internal resolution of the plugin, which could be anything.

    Then there's the communication between plugins which is always via MIDI as far as I know. So that means no matter high the resolution of the AU parameter, talking from a MIDI plugin to an app is going to be limited to 8-bit (128 values), or 14-bit (16,383 values) if the host and plugin support it.

  • @dobbs said:
    Oh cool you're right.

    Oh man I wanted to write something to use the XY pad to morph between 4 different values,but io and behold,that already exists as a function too :D

    Says in the manual that AU parameters are 32bit/way more precise than midi, is that true for all AU parameters that all the plugins expose? That would come in very handy

    But there is no way to get the values from Mozaic to other AUs except via MIDI as far as I know even though internally Mozaic has better resolution…sending pitchbend gives better granularity since it is 14-bit

  • Dear programmer wizards, I got a question (before I start learning programming mozaic..):
    Is ist possible (with mozaic) to define momentary buttons which send 8 CC's on push and 1 CC on release?
    I'd like to use mosaik to trigger snapshots of the FX on my SP 404 mk2. There are 6 FX controls, 1 FX select and one FX on/off in the midi implementation (total of 8 CC's). These CC's should be sent when pressing a button and only the FX on/off should be sent on release. I tried to implement it with the Midi Designer Pro 2 app, but it's not working well for me (see picture). I got it working with my Hotone Ampero Control foot pedal, but it has only 4 buttons and preset swapping is not well implementet imho.
    So can this be done? And does something similar allready exist? (had a look on pathstorage.com but did not find any..)

  • @Samplix, yes, what you describe can be done with Mozaic. I believe it may be able to be done with Loopy Pro without programming if you own Loopy Pro.

    Can you link to the MIDI implementation chart that you're referencing? The SP 404 MKII chart that I found on a quick search doesn't have any reference to the FX cc's you mention.

  • @wim thank you for your input!
    midi implementation is on pages 137/127.
    I do have loopy pro but I switched to TouchOSC in the meantime and it works fine so far! I don’t think that mosaic nore loopy pro is the way to go in my case..

  • That's great. While I love to program, I always think it's best to avoid scripting where practical.

  • edited January 2023

    Hi

    Is it possible via Mozaic script to achieve trills or tremolo on instruments like Santoor or Hammered Dulcimer? I could not find any virtual instrument which can do this. See this video to understand the trill articulation I am referring -

    Script Logic would be as follows

    When Note On and a particular CC message:

    Split the input note into short (same) notes (say 10 notes in one second)
    
    Volume (i.e. velocity) would be gradually decreasing for those split notes
    

    When Note On and NOT that particular CC message:

    Keep the original note length
    

    Also, it will be great if I can have an interface to change the number of split notes within one second.

    Say I need to change the number of split notes from 10 to 15 for faster trills.

    I will greatly appreciate if someone can create this simple script as it would be very useful for certain types of instruments.
    May be @McD or @wim or @_ki ??.. :smile:

  • McDMcD
    edited January 2023

    No commitment yet... but it's a very intriguing little task. I would call this script a "Hammered Dulcimer" or "Mallet Percussion" and built/test the functionality in phases:

    PHASE 1 - the "roll" (I'm a percussionist by training and repeated notes to create sustain is called a "roll".

    1. Note comes in and is forwarded and the Note and Velocity are saved in variables.
    2. additional notes are send at some evenly timed rate and some lower velocity percentage of the original note

    Knobs for rate and velocity percentage exposed.

    PHASE 2 - optional "rolls"

    I would add a screen based PAD in the Mosaic GUI labeled "Roll" to turn on the above behavior.
    Later pressing this PAD could be linked to an input CC (selectable by knob). CC=1 is the standard "Mod Wheel" input and it could vary repeat rate since is sends 0-127 values. Any slider control could implement this rate variation but then we'd have to "standardize" on a MIDI controller, I suspect.

    PHASE 3 - "Trills" - in the western keyboard notation there are several scale-based trills.

    On Note one play:
    1/2 step or note above the incoming note in scale at reduced velocity
    1/2 step or note below the incoming note at reduced velocity
    Incoming Note at full velocity

    Active with a PAD labeled by trill type "whole tone" or "half step" and add CC optional activation.
    Knob to select the "scale".

    PHASE 4 - "slide" grace notes

    Similar to trills but just a 1/2 step or scale step slide up to the incoming notes. On a keyboard this
    is typically a black note to white note "slide" to create bluesy/jazzy affectations not usually present in the
    classical style where two fingers are used for all grace notes conventionally. Even a poor keyboardist can
    learn to slide into notes to sound cool.

    Again a pad to activate with optional CC.

    Are there additional techniques worth adding to the design? As a mallet player (vibes, marimba, etc) I would think of:

    1. Grace note sub-octaves.
    2. scale-based 3rds, 6ths, 4ths, 5ths (Baja Marimba band sustains/rolls)
    3. 4 mallet chords in scale (triads, 7th chords: major or minor or diminished in scale)
    4. a collection of apps would be a nice tool to enable with adjustable PPQN).
  • edited January 2023

    I don’t think that’s a trill. Trills and mordents only involve 2 pitches. A turn will use 3 pitches, but not in the order described above.

    https://www.musictheoryacademy.com/how-to-read-sheet-music/ornamentation/

  • @TheOriginalPaulB said:
    I don’t think that’s a trill. Trills and mordents only involve 2 pitches. A turn will use 3 pitches, but not in the order described above.

    https://www.musictheoryacademy.com/how-to-read-sheet-music/ornamentation/

    Thanks.

    Good catch on the nomenclature for these ornamentations. It would be nice to create code for a nice collection. The trick of course is that the CC to apply one has to precede the Note On event which is the duty of the performer.

    I was trying to label from memory. I did Google the hammering technique and there’s little concensus given that the flat beds of strings span many cultures. There’s a lot of folk innovation on the hammer materials.

  • edited January 2023

    I just saw this UI in a Kontakt instrument from precisionsoundware. Hope it will help to build the UI in Mozaic.

  • @sujoybose77 said:
    I just saw this UI in a Kontakt instrument from precisionsoundware. Hope it will help to build the UI in Mozaic.

    Interesting... I wish I had Kontakt to hear how the knobs change the results. I wonder what the "arps" are like... are they traditional Indian broken chords in some selected scale?

    I DM'ed you my first tae that implements the tremolo effect for any instrument... I have tested it on Clav's,
    guitars (acoustic mostly), world instruments like Japanese Koto's, etc.

    I haven't connected the knobs yet but it allows settings for repeat rate (notes per second), the velocity (volume) of the secondary notes relative to the primary note... then I use some randomization to vary
    velocity and repeat note spacing to humanize the results. I also tried throwing in some random adjacent 1/2 step notes into the mix because a lot of hammered dulcimer players can accidentally hit an adjacent string.

    I haven't created a decelerate option yet but it sounds interesting. I also haven't made the volume fall off over time... my tremolo makes a great mandolin effect. If you play a short note you get the typical short ring of a single note but if you hold the note it starts the repeated picking style of the mandolin soloist seeking some sustain.

    I think this will be doable and I can keep adding features. As I am prone to do until the script begins to scare me when I loose some big block of updated code in an app crash.

  • I also do not have that Kontakt app and hence can not try.

    However, I have tested your code. Here is the screen capture (with sound):

    After I played with velocity range and sensitivity in the VelocityKeyboard app - It came out really well in the third SynthMaster sound I tried. More humanization will be needed but you can gradually attempt that.

    At the first sound, something weird happened. Also, I have observed that if the Pitch Bend Range is anything other than zero either in VKB or in Synth the script crashes after a few seconds of playing. Maybe we can skip achieving glided play technique at this moment, pitch bending is difficult to tame.
    I posted here because I wanted to let the members know the good work you are doing. In future I will DM you my testing results.

Sign In or Register to comment.