Posts by hepi



    What I want to Achieve?
    What I am actually trying to do is to create an "Anti-Preset", a preset which has "Release" value for ALL of the values in a given Preset.

    For example,
    If Preset-1 has a Dimmer value of 100%
    I want to create Preset-2 which has a Dimmer value of "Release".

    Then I want to use this "Anti-Preset", in a Recipe-Cue inside a tracking Sequence.

    What did I tried?
    I tried:
    Group 1

    Preset 1

    Release /Active

    Store Preset 2

    Then I saw attributes, which were NOT in Preset 1, getting "Release" values.

    So I tried without the "preset 1":

    Group 1

    Release /Active

    Store Preset 2

    And those attributes still got the "Realese" value.

    Is "Release /Active" legal?
    The documentation doesn't state it explicitly, but it makes sense.
    If I do "Release" without "/Active", then All attributes (for selected fixtures) get the "Release" value.
    When using the "/Active" then only the attributes which are active get the "Release" value + some unrelated attributes (Tilt, Green and Blue) which seems like a bug.


    1) You can't hook outgoing OSC messages 😞

    2) you can take a look at my Work-InProgress Chataigne module here.

    3) The module expects special "sync" OSC messages from an MA3 plugin with address prefix

    The plugin does something like this (This Is a snippet from my prototype code which is in TypeScript and uses my infrastructure):

    for (let page of HPage.getAllPages(of)) {  for (let exec of page.getAllExecutors()) {    if (exec.isAssigned()) {      if (exec.isTargetSequence()) {        const seqIndex = exec.getTargetObject()!.index        const faderType = exec.getObj()!.fader        const faderValue = exec.getFaderValue()         const address = addressPrefix         Cmd(           `SendOSC ${oscRemoteNumber} "${address},ssiii,${seqIndex},${faderType},${page.index},${exec.index},${faderValue}"`         )       }     }   } }

    Let me know your GitHub user name (email) and I'll give you access for that repository.


    This is very nice idea.
    I personally don't like solutions that require polling (a loop that runs every 0.5 sec or so).
    In your case, you can avoid this loop if you use hooks, and hook ALL the executors including the Page object. Then you can update the Remote mappings only when an executor is changed or created/deleted.

    Now let's talk about MIDI feedback.
    MA3 does NOT send MIDI feedback to the defined MIDI remotes. But it does send OSC feedback.
    You could solve this for MIDI if you use polling, a loop that check all executor value and send out MIDI.

    For a non-polling solution, you need to use OSC.

    I have started working on a solution involving Chataigne (grandMA3 module) and an MA3 plugin, which will work together to implement Executor feedback.
    The issue is that OSC feedback is sent out using the Sequence number and not the Executor number.
    The MA3 plugin prototype I've tried, sent the mapping of Sequences to Executors to Chataigne, so that Chataigne can do the mapping and send out the proper MIDI feedback to the controller.

    - This solution is complicated
    - It requires 3rd party App (Chataigne)
    - But it should work perfectly, without any polling.

    I have stopped development of that since I'm working on something with much more impact.
    But I meant to do it open-source.

    Let me know if you are interested in continuing it's development.
    I can share my work with you.


    The World object, for example:


    Has an "active" property.
    But this property seems to be always [nil]

    So I don't know ... )-:

    I am pretty sure the is no proper way to find that.

    I guess a hack could be to look at some UI element and check its state.

    What is your use-case?
    Maybe you can find a different solution....


    What distribution of Linux do the MA3 consoles use?

    I am asking since I am developing a plugin that uses OS features.
    Using the LUA function:

    I made it work on Mac and Windows.
    And I want to make it work on a console.
    But I don't have a console with me.

    I thought that it would be a good start to write the OS dependent part without the console, and test it later with a console.

    Any idea?

    Has anyone found a way to do text wrapping?

    If I:
    - add a uiobject element with a given width

    - and add text line which is longer than the element's width

    The text doesn't wrap onto a new line. It just gets cut off.

    Any ideas?

    BTW: I found "textAutoAdjust" but when it's enabled, the text size gets smaller in order to fit the width.

    Yeah, using yield in this case should give similar results as using Timer.

    With yield, you keep using the same thread.
    With Timer() each callback will be a different thread.

    I can not say which is better in this case.

    With that said, I am sure LUA was NOT intended for this real-time usage.
    And I suggest we keep on pressing on MA to add the real-time features we need as a native implementation.

    I encountered this issue:

    The Setup
    - I set a Sequence 1 with one cue (dimmer at 100%).
    - I set the OffCue to have type=Follow

    When I do "Go+ Seq 1", the fixtures goes to 100% and immediately to 0% (A Flash)

    The Timecode Setup

    When I create a timecode with a single event with token= "Go+" (Without an OFF event).
    And I play this timecode.
    The fixtures go to 100% and stay.
    It seems that the Follow OffCue is ignored.

    Very strange...


    The motivation to NOT have an Off event, is so that I could control the duration of the flash in a single place, the sequence.

    Any ideas?