Ensoniq Mirage MASOS template

I have been testing the code above. It works well for lower range values.
The higher ranged values include about 11 controls.
The 256 steps are never working. You keep losing some arrows. and you get out of sync easily.
I tried also to limit bulks from 5 to 3 bytes at one, limited the devices rate and different clock speeds.

Initially the script did not compile complaining about dbgTxt being nil,
I was not able to solve that so I commented the debug lines out.
The debug code is important to see what is going on.

On top of that I have issues with the logger. Have to always send a sysex string to enable it and then reconnect the usb to get it. Even that does not always works.
I wrote Martin about it.

The Mirage support a parameter request message which gives you back the current value.

F0h 0Fh 01h 01h 0Ch 03h 07h 0Dh 7Fh F7h

03h 07h is Parameter [37] for Resonance

returns F0 0F 01 0D 10 25 08 04 F7
[25] is hex [37]…
So decimal for the request and hex for the response.
Also the active keyboard half will also be send 10 for upper.
So the message will look different every time.

Why not use this message to sync the Eone with the Mirage its value?
Perhaps only for the 11 higher ranged values?

to fix the debug issue add the line:

dbgTxt = {} above the dbgTxt[14] and dbgTxt[15] lines then uncomment them and the prints and it is fine.
Also, in the sysexMsg command around line 48, there is a comma missing between the last ad and the endCommand

I was looking at the Wave Rotate control and I see the debug log says it is sending the correct number of Up or Down arrows as I turn from 0 to 255.

What the Mirage does with those particular values, I cannot say, but the EOne is sending the correct number of commands to it. There are notes in the other things you posted saying that buffering needs to happen for larger value controls, so maybe as a test, try increasing the timer time to 100ms or even more. It will may the EOne controls feel sluggish, but then you’ll know if the Mirage can handle it.

The other approach is to look at the actual source code of the editor and see how they do the buffering for those large values.

Hey Thanks a lot. I am doing some testing.

  • Value send test
    We put the filter freq [36] on Value 20 and clear the monitor

We spin back to 0 quickly.

The display shows 10 now…

I count all the arrow down bytes… And see only 10…

So does the Eone send only 10? Is the Mirage not so old in the brain after all?

  • Second test

We put the filter freq [36] on Value 32 and clear the monitor

We spin back to 0 quickly.

The display shows 12 now…
Hmm the webapp debug logs are too short so i re-did this test using the console app.
And got again 12 on the display … so there is some consistency in the behavior.

Counting the bytes from the debug log we get 22 down arrows and 2 up, so 32- 20 down = 12…
Counting the sysex bytes I got the same.

Testing with this template: Electra One App
And here is the lua code

tmrPeriod = 50

timer.setPeriod(tmrPeriod)
timer.disable()


mirageDeviceId = 9

-- set to an impossible value to force mainWorker() to process first touched control
previousParameterNumber = -1

-- holds the value and direction (up or down) for each encoder
-- this is what the timer function uses to send to the Mirage
lastValue = {}
lastDirection = {}

-- holds the current value of each encoder as a user changes different controls
-- when a user comes back to a control, we know the current value to use in the next calculations
curEncValue = {}

oldValue = 0
maxBytes = 5
upArrow= 14
downArrow = 15

-- temporary texts to make reading debug statements easier
dbgTxt = {}
dbgTxt[14] = " Up"
dbgTxt[15] = " Down"

parameterSelect = 12
valueSelect = 13
endCommand = 127

-- which control is currently being changed
currentControl = 0




function timer.onTick()
  if (currentControl ~= 0) then
    local av = math.abs(lastValue[currentControl])
    local ad = lastDirection[currentControl]
    print("currentControl = " .. currentControl)
    if ( av > 5 ) then
 
    print(" *** Sending 5 arrowBytes, direction is" .. dbgTxt[ad])
      lastValue[currentControl] = av - 5
      sysexMsg = { 15, 1, 1, ad, ad, ad, ad, ad, endCommand }
      midi.sendSysex(PORT_1, sysexMsg)

    elseif ( av < 5 ) and ( av > 0) then

      print (" *** Sending remaining bytes " .. av .. dbgTxt[ad])
      sysexMsg = {15, 1, 1}

      for i = 1,av do
        sysexMsg[3+i] = ad
      end
      -- note that the variable i does not exist after the for loop so we cannot use it here
      sysexMsg[4+av] = endCommand

      midi.sendSysex(PORT_1, sysexMsg)

      -- finished sending bytes, zero out the value so we do not send extra bytes if called again
      lastValue[currentControl] = 0
      currentControl = 0

    else
      -- catch an edge case
      -- somehow we get called for the current control, but with no change in value
      print ("Sending nothing - Edge case")
      -- lastValue[currentControl] = 0
      currentControl = 0
    end
  end
end


function mainWorker(ValueObject, Value)

  local message = ValueObject:getMessage()
  local currentParameterNumber = message:getParameterNumber ()
  local curValue = message:getValue()

  -- worker function called, save off the parameter number
  currentControl = currentParameterNumber

  if ( currentParameterNumber ~= previousParameterNumber ) then
    
    -- do not have the timer running in case it catches us with partially filled in data
    timer.disable()

    -- we store the current value as the previous for the next time
    previousParameterNumber = currentParameterNumber

    -- common way to separate the tens digit and the ones digit
    local byte1st = math.floor(currentParameterNumber / 10)
    local byte2nd = currentParameterNumber % 10

    sysexMsg = { 15, 1, 1, parameterSelect, byte1st, byte2nd, valueSelect, endCommand }
    midi.sendSysex(PORT_1, sysexMsg)

    -- NOTE - this assumes your controls have a default value of 0
    -- if they start with a default of 64 or something else, different code needs to go here 

    -- get the last value for this control
    oldValue = (curEncValue[previousParameterNumber] or 0)

    timer.enable()

  end

  -- we need to keep track of the last value for each encoder
  -- there is probably a better way to pull this from the control
  -- so we do not have to keep storing it
  curEncValue[currentParameterNumber] = curValue
  
  if ( currentParameterNumber == previousParameterNumber ) then

    -- figure out how much the encoder has changed from last time to this time
    -- note that the value can be positive or negative at this point
    local delta = curValue - oldValue

    -- save off the current value
    oldValue = curValue
    
    -- declare a local variable and set it to something
    local arrowDirection = upArrow

    -- the default is upArrow (positive) so only do things for negative or zero cases
    if ( delta == 0 ) then
      print("nothing to do")
      return
    elseif ( delta < 0 ) then
      arrowDirection = downArrow
    end

    -- for this parameter, save off the last value sent and the direction
    lastValue[currentParameterNumber] = (lastValue[currentParameterNumber] or 0) + delta
    lastDirection[currentParameterNumber] = arrowDirection
  end

end
  • Parameter response messages:

Filter freq parameter [36] hex [24]
we send 1 arrow up so value is 1

F0h 0Fh 01h 01h 0Eh 7Fh F7h
Response from the Mirage:
F0h 0Fh 01h 0Dh 00h 24h 02h 00h F7h
we send 1 more arrow up so the value on the panel and eone is 2
Response from the Mirage:
F0h 0Fh 01h 0Dh 00h 24h 04h 00h F7h
So the internal range is 00 … 198 and we have to divide the value by 2 to get the front panel value.

Header Parametermessage keyboardhalf 4bits and program parameternumber in hex value LS / MS nybble the end :slight_smile:
F0h 0Fh 01h 0Dh 00h 24h 04h 00h F7h

As I commented in the code, the starting value is assumed to be 0 the first time a control is touched.
There is only so much I can do without having a Mirage in front of me. Is it possible to twist an encoder fast enough to lose some messages? Maybe, I do not know.

The original question was to help find a way to queue up the encoder turns and delay them a bit so the Mirage was not overflowed with data. Once you start getting into areas of how the Mirage responds and whether or not the Electra One ‘catches’ all the turns of the encoder, that is where I cannot help.

Have you determined that if the encoder is twisted fast enough the Electra One loses count? Remember, it does take some time to process everything in the function mainWorker() every time an encoder it turned. The more debugs and other code (like the Electra One logging messages) that have to be executed take time away from doing the work.

I simply cannot write a full sysex parser for the Mirage at this time. Even if a Mirage was sitting here by the computer, I do not have the free weeks it will take to fully develop the sysex parser and make sure it is robust enough to work 100% of the time. What I can do is suggest ways to handle some things, but it will take cooperation with other Mirage/Electra One owners to fully complete the work.

Yeah fully understand. Anyhow your help is much appreciated.
I will play a bit more to see how I can get those “problematic” controls working.

Yes it looks the Electra One does not send all the data.
The Mirage only gets busy using the 00 … 255 ranged parameters.

The other sysex documentation you posted did say the Mirage needs more time/buffering with the 0-255 controls. Probably have to dig through how they did it.

The current mainWorker() function only has about 4 conditional checks and a few assignments when you are turning the same control. There are no midi.sendSysex() calls or library functions (which are more expensive as far as time) so in theory, it should be fast enough to keep up with turning the encoder at normal rates.

In my experiences, I like encoders for changing values through small/medium ranges like 0-127 or something, but for larger values, I think a keypad is faster or even 2 controls - one for larger jumps (like 0, 100, 200, 300, …) and one for fine control (useful for keyboard notes for example - octaves and then semi-tones).

Again - the design of a preset/editor type UI takes some time and figuring out the best way to both represent the information and the best way to allow a user to change it.

You know the state as is is already quite good.
When you turn a knob the Mirage is set to that parameter so you can easily use the up/down arrows on the panel to adjust.

Erich has only the Program parameters in his editor.
Not the sample Parameters.

I am quite happy as is. :slight_smile:

1 Like

for sure. This was a lot of work on your part to get the bulk of it implemented and running. The sampling portion will be a nice addition some day.

My hope is that even though others may not have a Mirage, they can still use some of the ideas/techniques you have implemented here to solve problems they have when creating their own presets for synths.

That was part of the attraction to this particular problem for me – over-running old synthesizers with too much sysex data is a common problem (also a problem with some new gear as well - not naming names) so coming up with one or more ways to handle that could be helpful.

1 Like

Hey yeah it was fun todo.
Thanks a lot I have been learning some stuff from you again.
The template is now ready in a sort of beta state

https://app.electra.one/preset/4CSl9Yk36xOZEPA9xruG

I will still work on:

  • patch parsing
  • loading of u1, u2, u3 or l1, l2, l3, you load and the parameters get synced.
  • some meganism to keep the large value parameters in sync perhaps.
  • commands
  • lua formating for sampling time, notes etc. Think for notes you share something on that.

Its time, my guitar is complaining I nerd to much and play to little :slight_smile:

Cheers

Tim

2 Likes

With @oldgearguy 's sysex example documentation I am getting some parts parsed now.

I keep this version public for hints.
https://app.electra.one/preset/K8zKK6hvWLwwnQF09krH

The code is quite ugly,

The wavesamples 1-8 have their parameter always 24 bytes apart


So if
waveSelect = 1
offsetStart = math.floor(( waveSelect * 24 - 24 ))  = 0
parameterMap.set(1, PT_VIRTUAL, 65, deSyx[0])

waveSelect = 2
offsetStart = math.floor(( waveSelect * 24 - 24 ))  = 24
parameterMap.set(1, PT_VIRTUAL, 65, deSyx[24])

the function waveSampleSelect selects the lower 1 … 8 or upper 1…8 wavesamples.
And requests a dump file.
Then a global variable waveSelect is set used to get offsetStart for getting the right data out of the dump.

Have to work this out… Now I hardcoded all parameters.
The config parameters are already working.
When this works then I only need the program Parameter.

1 Like

I took a quick look at the LUA code in the current version plus what you put in above.

A couple quick suggestions – the LUA documentation states that the math.floor and math.ceiling functions keep the integer portion (left of the decimal) and ‘throw away’ the fraction (again - generalization). So they are really only needed if you are doing division and only want integers.

If it doesn’t hurt your head to keep track of things, in the main waveSampleSelect() function, at the very end of the function, you could add:

-- subtract one from the waveSelect to make future calculations easier
waveSelect = waveSelect - 1

and then in the code above, it can be simplified to something like:

offsetStart = waveSelect * 24
parameterMap.set(1, PT_VIRTUAL, 65, deSyx[offsetStart])

The rest of the LUA code in the current example is generally fine. Mapping parameter data from a sysex dump to the parameterMap is usually messy because it’s not always a simple 1 → 1 assignment.
There’s often no way to just loop through assignments using a simple “for” construct.

As always - getting it to work correctly first is the goal. Once it is working, then making it smaller, cleaner can be done if needed.

Hey thanks will check that.
I am stuck on parsing the in-coming data

  1. I am not able to locate the “program bytes” block.

  2. the function that parses the wave data does not work neither.
    It seems like random data.
    Although in the sysexblock I was able to exactly pinpoint to the 8 “waveblocks”

Since I can clearly see the wave parameters I think the data should be correct although do not understand why I cannot find the “Program data”
I made the envelopes have values, 1, 2, 3, 4 etc and see nothing like it in the dump.

11:21:12.387 lua: we recieved some data. length = 1014
11:21:12.388 lua: do something, this could be a program dump... yummy
11:21:12.388 lua: Received Program dump data. length = 1014
11:21:12.388 lua: value 0 byte position 0
11:21:12.388 lua: value 4 byte position 1
11:21:12.388 lua: value 250 byte position 2
11:21:12.388 lua: value 63 byte position 3
11:21:12.388 lua: value 198 byte position 4
11:21:12.388 lua: value 80 byte position 5
11:21:12.388 lua: value 0 byte position 6
11:21:12.389 lua: value 0 byte position 7
11:21:12.389 lua: value 31 byte position 8
11:21:12.389 lua: value 30 byte position 9
11:21:12.389 lua: value 30 byte position 10
11:21:12.389 lua: value 255 byte position 11
11:21:12.389 lua: value 0 byte position 12
11:21:12.390 lua: value 0 byte position 13
11:21:12.390 lua: value 0 byte position 14
11:21:12.390 lua: value 0 byte position 15
11:21:12.390 lua: value 179 byte position 16
11:21:12.390 lua: value 254 byte position 17
11:21:12.390 lua: value 180 byte position 18
11:21:12.390 lua: value 0 byte position 19
11:21:12.390 lua: value 180 byte position 20
11:21:12.390 lua: value 0 byte position 21
11:21:12.391 lua: value 180 byte position 22
11:21:12.391 lua: value 0 byte position 23
11:21:12.391 lua: value 0 byte position 24
11:21:12.391 lua: value 3 byte position 25
11:21:12.391 lua: value 250 byte position 26
11:21:12.391 lua: value 63 byte position 27
11:21:12.391 lua: value 60 byte position 28
11:21:12.391 lua: value 198 byte position 29
11:21:12.391 lua: value 1 byte position 30
11:21:12.391 lua: value 32 byte position 31
11:21:12.391 lua: value 37 byte position 32
11:21:12.392 lua: value 36 byte position 33
11:21:12.392 lua: value 36 byte position 34
11:21:12.392 lua: value 255 byte position 35
11:21:12.394 lua: value 0 byte position 36
11:21:12.394 lua: value 0 byte position 37
11:21:12.395 lua: value 0 byte position 38
11:21:12.395 lua: value 0 byte position 39
11:21:12.395 lua: value 180 byte position 40
11:21:12.395 lua: value 30 byte position 41
11:21:12.395 lua: value 180 byte position 42
11:21:12.395 lua: value 34 byte position 43
11:21:12.395 lua: value 180 byte position 44
11:21:12.396 lua: value 30 byte position 45
11:21:12.396 lua: value 180 byte position 46
11:21:12.396 lua: value 34 byte position 47
11:21:12.396 lua: value 0 byte position 48
11:21:12.396 lua: value 6 byte position 49
11:21:12.397 lua: value 128 byte position 50
11:21:12.397 lua: value 63 byte position 51
11:21:12.397 lua: value 0 byte position 52
11:21:12.397 lua: value 198 byte position 53
11:21:12.398 lua: value 4 byte position 54
11:21:12.398 lua: value 47 byte position 55
11:21:12.398 lua: value 48 byte position 56
11:21:12.398 lua: value 47 byte position 57
11:21:12.398 lua: value 47 byte position 58
11:21:12.398 lua: value 255 byte position 59
11:21:12.398 lua: value 0 byte position 60
11:21:12.398 lua: value 0 byte position 61
11:21:12.399 lua: value 0 byte position 62
11:21:12.399 lua: value 0 byte position 63
11:21:12.399 lua: value 180 byte position 64
11:21:12.399 lua: value 62 byte position 65
11:21:12.399 lua: value 180 byte position 66
11:21:12.399 lua: value 66 byte position 67
11:21:12.399 lua: value 180 byte position 68
11:21:12.399 lua: value 62 byte position 69
11:21:12.399 lua: value 180 byte position 70
11:21:12.399 lua: value 66 byte position 71
11:21:12.399 lua: value 0 byte position 72
11:21:12.399 lua: value 3 byte position 73
11:21:12.399 lua: value 250 byte position 74
11:21:12.399 lua: value 63 byte position 75
11:21:12.399 lua: value 60 byte position 76
11:21:12.399 lua: value 198 byte position 77
11:21:12.400 lua: value 10 byte position 78
11:21:12.400 lua: value 80 byte position 79
11:21:12.400 lua: value 111 byte position 80
11:21:12.400 lua: value 110 byte position 81
11:21:12.400 lua: value 110 byte position 82
11:21:12.400 lua: value 255 byte position 83
11:21:12.400 lua: value 0 byte position 84
11:21:12.400 lua: value 0 byte position 85
11:21:12.400 lua: value 0 byte position 86
11:21:12.400 lua: value 0 byte position 87
11:21:12.400 lua: value 180 byte position 88
11:21:12.400 lua: value 94 byte position 89
11:21:12.400 lua: value 180 byte position 90
11:21:12.400 lua: value 98 byte position 91
11:21:12.401 lua: value 180 byte position 92
11:21:12.401 lua: value 94 byte position 93
11:21:12.401 lua: value 180 byte position 94
11:21:12.401 lua: value 98 byte position 95
11:21:12.401 lua: value 0 byte position 96
11:21:12.401 lua: value 3 byte position 97
11:21:12.401 lua: value 250 byte position 98
11:21:12.401 lua: value 63 byte position 99
11:21:12.401 lua: value 60 byte position 100
11:21:12.401 lua: value 198 byte position 101
11:21:12.402 lua: value 16 byte position 102
11:21:12.402 lua: value 112 byte position 103
11:21:12.402 lua: value 143 byte position 104
11:21:12.402 lua: value 142 byte position 105
11:21:12.402 lua: value 142 byte position 106
11:21:12.402 lua: value 255 byte position 107
11:21:12.402 lua: value 0 byte position 108
11:21:12.402 lua: value 0 byte position 109
11:21:12.402 lua: value 0 byte position 110
11:21:12.402 lua: value 0 byte position 111
11:21:12.402 lua: value 180 byte position 112
11:21:12.403 lua: value 126 byte position 113
11:21:12.403 lua: value 180 byte position 114
11:21:12.403 lua: value 130 byte position 115
11:21:12.403 lua: value 180 byte position 116
11:21:12.403 lua: value 126 byte position 117
11:21:12.403 lua: value 180 byte position 118
11:21:12.403 lua: value 130 byte position 119
11:21:12.404 lua: value 0 byte position 120
11:21:12.404 lua: value 1 byte position 121
11:21:12.404 lua: value 250 byte position 122
11:21:12.404 lua: value 63 byte position 123
11:21:12.404 lua: value 60 byte position 124
11:21:12.404 lua: value 198 byte position 125
11:21:12.404 lua: value 19 byte position 126
11:21:12.404 lua: value 144 byte position 127
11:21:12.405 lua: value 175 byte position 128
11:21:12.405 lua: value 174 byte position 129
11:21:12.405 lua: value 174 byte position 130
11:21:12.405 lua: value 255 byte position 131
11:21:12.405 lua: value 0 byte position 132
11:21:12.405 lua: value 0 byte position 133
11:21:12.405 lua: value 0 byte position 134
11:21:12.405 lua: value 0 byte position 135
11:21:12.406 lua: value 180 byte position 136
11:21:12.406 lua: value 158 byte position 137
11:21:12.406 lua: value 180 byte position 138
11:21:12.406 lua: value 162 byte position 139
11:21:12.406 lua: value 180 byte position 140
11:21:12.406 lua: value 158 byte position 141
11:21:12.406 lua: value 180 byte position 142
11:21:12.406 lua: value 162 byte position 143
11:21:12.406 lua: value 0 byte position 144
11:21:12.406 lua: value 1 byte position 145
11:21:12.407 lua: value 250 byte position 146
11:21:12.407 lua: value 63 byte position 147
11:21:12.407 lua: value 60 byte position 148
11:21:12.407 lua: value 198 byte position 149
11:21:12.407 lua: value 22 byte position 150
11:21:12.407 lua: value 176 byte position 151
11:21:12.407 lua: value 207 byte position 152
11:21:12.407 lua: value 206 byte position 153
11:21:12.407 lua: value 206 byte position 154
11:21:12.407 lua: value 255 byte position 155
11:21:12.407 lua: value 0 byte position 156
11:21:12.407 lua: value 0 byte position 157
11:21:12.408 lua: value 0 byte position 158
11:21:12.408 lua: value 0 byte position 159
11:21:12.408 lua: value 180 byte position 160
11:21:12.408 lua: value 190 byte position 161
11:21:12.408 lua: value 180 byte position 162
11:21:12.408 lua: value 194 byte position 163
11:21:12.408 lua: value 180 byte position 164
11:21:12.408 lua: value 190 byte position 165
11:21:12.408 lua: value 180 byte position 166
11:21:12.408 lua: value 194 byte position 167
11:21:12.408 lua: value 0 byte position 168---start of wave 8  Parameter [65] off ....
11:21:12.408 lua: value 1 byte position 169                              [67] 1
11:21:12.408 lua: value 250 byte position 170                            [68] FA
11:21:12.408 lua: value 63 byte position 171
11:21:12.409 lua: value 60 byte position 172
11:21:12.409 lua: value 198 byte position 173
11:21:12.409 lua: value 28 byte position 174
11:21:12.409 lua: value 208 byte position 175
11:21:12.409 lua: value 255 byte position 176
11:21:12.409 lua: value 254 byte position 177
11:21:12.409 lua: value 254 byte position 178
11:21:12.409 lua: value 255 byte position 179                           [64] FF
11:21:12.409 lua: value 0 byte position 180
11:21:12.409 lua: value 0 byte position 181
11:21:12.409 lua: value 0 byte position 182
11:21:12.409 lua: value 0 byte position 183-------------------------------------END OFF WAVES BLOCK
11:21:12.410 lua: value 0 byte position 184
11:21:12.410 lua: value 63 byte position 185
11:21:12.410 lua: value 128 byte position 186
11:21:12.410 lua: value 63 byte position 187
11:21:12.410 lua: value 4 byte position 188
11:21:12.410 lua: value 18 byte position 189
11:21:12.410 lua: value 8 byte position 190
11:21:12.410 lua: value 27 byte position 191
11:21:12.410 lua: value 16 byte position 192
11:21:12.410 lua: value 36 byte position 193
11:21:12.410 lua: value 32 byte position 194
11:21:12.411 lua: value 45 byte position 195
11:21:12.411 lua: value 64 byte position 196
11:21:12.411 lua: value 54 byte position 197
11:21:12.411 lua: value 128 byte position 198
11:21:12.411 lua: value 63 byte position 199
11:21:12.411 lua: value 192 byte position 200
11:21:12.411 lua: value 54 byte position 201
11:21:12.411 lua: value 255 byte position 202
11:21:12.411 lua: value 255 byte position 203
11:21:12.412 lua: value 255 byte position 204
11:21:12.412 lua: value 255 byte position 205
11:21:12.412 lua: value 255 byte position 206
11:21:12.412 lua: value 255 byte position 207
11:21:12.416 lua: value 255 byte position 208
11:21:12.416 lua: value 255 byte position 209
11:21:12.416 lua: value 255 byte position 210
11:21:12.417 lua: value 255 byte position 211
11:21:12.417 lua: value 255 byte position 212
11:21:12.417 lua: value 255 byte position 213
11:21:12.417 lua: value 255 byte position 214
11:21:12.417 lua: value 255 byte position 215
11:21:12.417 lua: value 32 byte position 216
11:21:12.417 lua: value 45 byte position 217
11:21:12.417 lua: value 33 byte position 218
11:21:12.418 lua: value 0 byte position 219
11:21:12.418 lua: value 34 byte position 220
11:21:12.418 lua: value 9 byte position 221
11:21:12.418 lua: value 24 byte position 222
11:21:12.418 lua: value 27 byte position 223
11:21:12.418 lua: value 32 byte position 224
11:21:12.418 lua: value 45 byte position 225
11:21:12.419 lua: value 64 byte position 226
11:21:12.419 lua: value 54 byte position 227
11:21:12.419 lua: value 128 byte position 228
11:21:12.419 lua: value 63 byte position 229
11:21:12.419 lua: value 128 byte position 230
11:21:12.419 lua: value 63 byte position 231
11:21:12.419 lua: value 0 byte position 232
11:21:12.419 lua: value 0 byte position 233
11:21:12.419 lua: value 0 byte position 234
11:21:12.419 lua: value 0 byte position 235
11:21:12.419 lua: value 0 byte position 236
11:21:12.419 lua: value 0 byte position 237
11:21:12.420 lua: value 0 byte position 238
11:21:12.420 lua: value 0 byte position 239
11:21:12.420 lua: value 0 byte position 240
11:21:12.420 lua: value 0 byte position 241
11:21:12.420 lua: value 0 byte position 242
11:21:12.420 lua: value 0 byte position 243
11:21:12.420 lua: value 0 byte position 244
11:21:12.420 lua: value 0 byte position 245
11:21:12.420 lua: value 0 byte position 246
11:21:12.420 lua: value 0 byte position 247
11:21:12.420 lua: value 47 byte position 248
11:21:12.420 lua: value 0 byte position 249
11:21:12.420 lua: value 48 byte position 250
11:21:12.420 lua: value 36 byte position 251
11:21:12.421 lua: value 48 byte position 252
11:21:12.421 lua: value 36 byte position 253
11:21:12.421 lua: value 48 byte position 254
11:21:12.421 lua: value 36 byte position 255
11:21:12.421 lua: value 48 byte position 256
11:21:12.421 lua: value 36 byte position 257
11:21:12.421 lua: value 64 byte position 258
11:21:12.421 lua: value 54 byte position 259
11:21:12.421 lua: value 128 byte position 260
11:21:12.421 lua: value 63 byte position 261
11:21:12.421 lua: value 128 byte position 262
11:21:12.421 lua: value 63 byte position 263
11:21:12.421 lua: value 0 byte position 264
11:21:12.421 lua: value 0 byte position 265
11:21:12.421 lua: value 0 byte position 266
11:21:12.421 lua: value 0 byte position 267
11:21:12.422 lua: value 0 byte position 268
11:21:12.422 lua: value 0 byte position 269
11:21:12.422 lua: value 0 byte position 270
11:21:12.422 lua: value 0 byte position 271
11:21:12.422 lua: value 0 byte position 272
11:21:12.422 lua: value 0 byte position 273
11:21:12.422 lua: value 0 byte position 274
11:21:12.422 lua: value 0 byte position 275
11:21:12.422 lua: value 0 byte position 276
11:21:12.423 lua: value 0 byte position 277
11:21:12.423 lua: value 0 byte position 278
11:21:12.423 lua: value 0 byte position 279
11:21:12.423 lua: value 80 byte position 280
11:21:12.423 lua: value 36 byte position 281
11:21:12.423 lua: value 45 byte position 282
11:21:12.425 lua: value 240 byte position 283
11:21:12.425 lua: value 243 byte position 284
11:21:12.425 lua: value 3 byte position 285
11:21:12.425 lua: value 63 byte position 286
11:21:12.425 lua: value 63 byte position 287
11:21:12.426 lua: value 240 byte position 288
11:21:12.426 lua: value 3 byte position 289
11:21:12.426 lua: value 63 byte position 290
11:21:12.426 lua: value 255 byte position 291
11:21:12.426 lua: value 255 byte position 292
11:21:12.426 lua: value 255 byte position 293
11:21:12.426 lua: value 255 byte position 294
11:21:12.426 lua: value 255 byte position 295
11:21:12.426 lua: value 255 byte position 296
11:21:12.427 lua: value 255 byte position 297
11:21:12.427 lua: value 255 byte position 298
11:21:12.427 lua: value 255 byte position 299
11:21:12.427 lua: value 255 byte position 300
11:21:12.427 lua: value 64 byte position 301
11:21:12.427 lua: value 242 byte position 302
11:21:12.427 lua: value 67 byte position 303
11:21:12.427 lua: value 18 byte position 304
11:21:12.427 lua: value 27 byte position 305
11:21:12.428 lua: value 240 byte position 306
11:21:12.428 lua: value 243 byte position 307
11:21:12.428 lua: value 3 byte position 308
11:21:12.428 lua: value 63 byte position 309
11:21:12.428 lua: value 240 byte position 310
11:21:12.428 lua: value 243 byte position 311
11:21:12.428 lua: value 255 byte position 312
11:21:12.428 lua: value 255 byte position 313
11:21:12.428 lua: value 255 byte position 314
11:21:12.429 lua: value 255 byte position 315
11:21:12.429 lua: value 255 byte position 316
11:21:12.429 lua: value 255 byte position 317
11:21:12.429 lua: value 255 byte position 318
11:21:12.429 lua: value 255 byte position 319
11:21:12.429 lua: value 255 byte position 320
11:21:12.429 lua: value 15 byte position 321
11:21:12.429 lua: value 36 byte position 322
11:21:12.429 lua: value 45 byte position 323
11:21:12.430 lua: value 96 byte position 324
11:21:12.430 lua: value 179 byte position 325
11:21:12.430 lua: value 1 byte position 326
11:21:12.430 lua: value 45 byte position 327
11:21:12.430 lua: value 54 byte position 328
11:21:12.430 lua: value 96 byte position 329
11:21:12.430 lua: value 3 byte position 330
11:21:12.430 lua: value 63 byte position 331
11:21:12.431 lua: value 0 byte position 332
11:21:12.431 lua: value 0 byte position 333
11:21:12.431 lua: value 0 byte position 334
11:21:12.431 lua: value 0 byte position 335
11:21:12.431 lua: value 0 byte position 336
11:21:12.431 lua: value 0 byte position 337
11:21:12.431 lua: value 0 byte position 338
11:21:12.432 lua: value 0 byte position 339
11:21:12.432 lua: value 0 byte position 340
11:21:12.432 lua: value 0 byte position 341
11:21:12.432 lua: value 64 byte position 342
11:21:12.432 lua: value 98 byte position 343
11:21:12.432 lua: value 67 byte position 344
11:21:12.433 lua: value 18 byte position 345
11:21:12.433 lua: value 27 byte position 346
11:21:12.433 lua: value 96 byte position 347
11:21:12.433 lua: value 99 byte position 348
11:21:12.433 lua: value 3 byte position 349
11:21:12.433 lua: value 54 byte position 350
11:21:12.433 lua: value 63 byte position 351
11:21:12.433 lua: value 0 byte position 352
11:21:12.434 lua: value 0 byte position 353
11:21:12.434 lua: value 0 byte position 354
11:21:12.434 lua: value 0 byte position 355
11:21:12.434 lua: value 0 byte position 356
11:21:12.434 lua: value 0 byte position 357
11:21:12.434 lua: value 0 byte position 358
11:21:12.434 lua: value 0 byte position 359
11:21:12.434 lua: value 0 byte position 360
11:21:12.434 lua: value 0 byte position 361
11:21:12.435 lua: value 0 byte position 362
11:21:12.435 lua: value 36 byte position 363
11:21:12.435 lua: value 45 byte position 364
11:21:12.435 lua: value 36 byte position 365
11:21:12.437 lua: value 177 byte position 366
11:21:12.437 lua: value 1 byte position 367
11:21:12.438 lua: value 45 byte position 368
11:21:12.438 lua: value 45 byte position 369
11:21:12.438 lua: value 96 byte position 370
11:21:12.438 lua: value 243 byte position 371
11:21:12.438 lua: value 243 byte position 372
11:21:12.438 lua: value 255 byte position 373
11:21:12.438 lua: value 255 byte position 374
11:21:12.438 lua: value 255 byte position 375
11:21:12.438 lua: value 255 byte position 376
11:21:12.439 lua: value 255 byte position 377
11:21:12.439 lua: value 255 byte position 378
11:21:12.439 lua: value 255 byte position 379
11:21:12.439 lua: value 255 byte position 380
11:21:12.439 lua: value 255 byte position 381
11:21:12.439 lua: value 255 byte position 382
11:21:12.439 lua: value 255 byte position 383
11:21:12.440 lua: value 255 byte position 384
11:21:12.440 lua: value 255 byte position 385
11:21:12.440 lua: value 255 byte position 386
11:21:12.440 lua: value 255 byte position 387
11:21:12.440 lua: value 255 byte position 388
11:21:12.442 lua: value 255 byte position 389
11:21:12.442 lua: value 255 byte position 390
11:21:12.442 lua: value 255 byte position 391
11:21:12.442 lua: value 255 byte position 392
11:21:12.442 lua: value 255 byte position 393
11:21:12.442 lua: value 255 byte position 394
11:21:12.442 lua: value 255 byte position 395
11:21:12.442 lua: value 255 byte position 396
11:21:12.443 lua: value 255 byte position 397
11:21:12.443 lua: value 255 byte position 398
11:21:12.443 lua: value 255 byte position 399
11:21:12.443 lua: value 255 byte position 400
11:21:12.443 lua: value 255 byte position 401
11:21:12.443 lua: value 255 byte position 402
11:21:12.443 lua: value 175 byte position 403
11:21:12.443 lua: value 160 byte position 404
11:21:12.443 lua: value 10 byte position 405
11:21:12.443 lua: value 136 byte position 406
11:21:12.444 lua: value 194 byte position 407
11:21:12.444 lua: value 51 byte position 408
11:21:12.444 lua: value 0 byte position 409
11:21:12.444 lua: value 1 byte position 410
11:21:12.444 lua: value 250 byte position 411
11:21:12.444 lua: value 241 byte position 412
11:21:12.444 lua: value 241 byte position 413
11:21:12.444 lua: value 40 byte position 414
11:21:12.445 lua: value 40 byte position 415
11:21:12.445 lua: value 136 byte position 416
11:21:12.445 lua: value 210 byte position 417
11:21:12.445 lua: value 30 byte position 418
11:21:12.445 lua: value 30 byte position 419
11:21:12.445 lua: value 14 byte position 420
11:21:12.445 lua: value 4 byte position 421
11:21:12.445 lua: value 4 byte position 422
11:21:12.445 lua: value 64 byte position 423
11:21:12.445 lua: value 0 byte position 424
11:21:12.446 lua: value 0 byte position 425
11:21:12.446 lua: value 0 byte position 426
11:21:12.446 lua: value 14 byte position 427
11:21:12.446 lua: value 0 byte position 428
11:21:12.446 lua: value 64 byte position 429
11:21:12.447 lua: value 0 byte position 430
11:21:12.447 lua: value 64 byte position 431
11:21:12.447 lua: value 0 byte position 432
11:21:12.447 lua: value 0 byte position 433
11:21:12.447 lua: value 0 byte position 434
11:21:12.447 lua: value 0 byte position 435
11:21:12.447 lua: value 16 byte position 436
11:21:12.447 lua: value 0 byte position 437
11:21:12.448 lua: value 0 byte position 438
11:21:12.448 lua: value 0 byte position 439
11:21:12.448 lua: value 0 byte position 440
11:21:12.448 lua: value 10 byte position 441
11:21:12.448 lua: value 10 byte position 442
11:21:12.448 lua: value 10 byte position 443
11:21:12.448 lua: value 0 byte position 444
11:21:12.450 lua: value 192 byte position 445
11:21:12.450 lua: value 0 byte position 446
11:21:12.451 lua: value 0 byte position 447
11:21:12.451 lua: value 0 byte position 448
11:21:12.451 lua: value 0 byte position 449
11:21:12.451 lua: value 14 byte position 450
11:21:12.451 lua: value 0 byte position 451
11:21:12.451 lua: value 64 byte position 452
11:21:12.451 lua: value 0 byte position 453
11:21:12.451 lua: value 64 byte position 454
11:21:12.452 lua: value 0 byte position 455
11:21:12.452 lua: value 0 byte position 456
11:21:12.452 lua: value 0 byte position 457
11:21:12.452 lua: value 240 byte position 458
11:21:12.452 lua: value 0 byte position 459
11:21:12.452 lua: value 0 byte position 460
11:21:12.452 lua: value 0 byte position 461
11:21:12.452 lua: value 0 byte position 462
11:21:12.453 lua: value 0 byte position 463
11:21:12.453 lua: value 10 byte position 464
11:21:12.453 lua: value 10 byte position 465
11:21:12.453 lua: value 10 byte position 466
11:21:12.453 lua: value 0 byte position 467
11:21:12.453 lua: value 192 byte position 468
11:21:12.453 lua: value 0 byte position 469
11:21:12.453 lua: value 0 byte position 470
11:21:12.454 lua: value 0 byte position 471
11:21:12.454 lua: value 0 byte position 472
11:21:12.454 lua: value 14 byte position 473
11:21:12.454 lua: value 0 byte position 474
11:21:12.454 lua: value 64 byte position 475
11:21:12.455 lua: value 0 byte position 476
11:21:12.455 lua: value 64 byte position 477
11:21:12.455 lua: value 0 byte position 478
11:21:12.455 lua: value 0 byte position 479
11:21:12.455 lua: value 0 byte position 480
11:21:12.456 lua: value 240 byte position 481
11:21:12.456 lua: value 0 byte position 482
11:21:12.456 lua: value 0 byte position 483
11:21:12.456 lua: value 0 byte position 484
11:21:12.456 lua: value 0 byte position 485
11:21:12.456 lua: value 0 byte position 486
11:21:12.457 lua: value 10 byte position 487
11:21:12.457 lua: value 10 byte position 488
11:21:12.457 lua: value 10 byte position 489
11:21:12.457 lua: value 192 byte position 490
11:21:12.457 lua: value 0 byte position 491
11:21:12.458 lua: value 0 byte position 492
11:21:12.458 lua: value 0 byte position 493
11:21:12.458 lua: value 0 byte position 494
11:21:12.459 lua: value 112 byte position 495

Byte position 0 above = parameter [65] of wave block 1…starting after skipBytes
If I start to count to the start of program1 I do not have enought bytes left.

edited multiple times; sorry about that. maybe another cup of coffee is needed…

If you have a full raw sysex dump of the Program data, send that to me and I can take a look through the raw data.

EDIT - from the debugs, it looks like the last (8) wave sample block is shorter than the other 7.
Either the Mirage didn’t send all the data or there was some glitch or ???

If you use Sysex Librarian/MIDI-Ox and request that same dump multiple times, do you still get 1014 bytes or do you get different size dumps?

Hey yes the size is always different.
Will test it with another midi interface as well.
I think I saw the same behavior in MidiOX.
But will still confirm.

I tested using the desktop app and did not get the values updated,

So I will first find a disk ( usb ) that gets the values updated in wavesyn and then I will capture it via the ElectraOne.

Also can capture the actions Wavsyn does.

Not sure about wave 8, wave 1 does not start at the beginning as there 8 redundant bytes at the start,
With skipBytes I move the playhead to parameter [65] of wave 1, that is position 0 in the dump .
So if wave 8 seems to have 8 bytes less then its ok.
Otherwise I just did not mark them right.

Thanks

The fact that the size is different is something to look at.
Underneath it all, these machines are computers and they should be doing repeatable things and generating the same output given the same input.

The 8 redundant bytes and other skips and jumps are why I wanted to start by looking at a full raw dump. I have some good hex editing tools that might help in the decoding and mapping the data to the documentation.

So I connected the Mirage to another interface and got steadily 1024 bytes.
Then I connected the Eone and did not got anything, then changes some buffer setting and got repeatedly 1024.
Using MidiOX on windows.

Then I got to app.electraone and got different results every time.

So we know we need 1024 bytes but get 1067 of them.

F0h 0Fh 01h 05h 00h 0Dh 03h 0Bh 0Eh 0Dh 03h 0Bh 00h 0Eh 03h 0Bh 02h 0Eh 03h 0Bh 00h 0Eh 00h 00h 04h 00h 0Ah 0Fh 0Fh 03h 06h 0Ch 40h 00h 05h 00h 00h 00h 00h 0Fh 01h 0Eh 01h 0Eh 01h 0Fh 0Fh 00h 00h 00h 00h 00h 00h 00h 00h 03h 0Bh 0Eh 0Fh 04h 0Bh 00h 00h 04h 0Bh 40h 00h 00h 04h 0Bh 00h 00h 00h 00h 03h 00h 0Ah 0Fh 0Fh 03h 0Ch 03h 06h 0Ch 01h 00h 00h 02h 05h 02h 04h 02h 04h 02h 0Fh 0Fh 00h 00h 40h 00h 00h 00h 00h 00h 00h 04h 0Bh 0Eh 01h 04h 0Bh 02h 02h 04h 0Bh 0Eh 01h 04h 0Bh 02h 02h 00h 00h 06h 00h 00h 08h 0Fh 03h 00h 00h 40h 06h 0Ch 04h 00h 0Fh 02h 00h 03h 0Fh 02h 0Fh 02h 0Fh 0Fh 00h 00h 00h 00h 00h 00h 00h 00h 04h 0Bh 0Eh 03h 04h 0Bh 02h 04h 04h 0Bh 40h 0Eh 03h 04h 0Bh 02h 04h 00h 00h 03h 00h 0Ah 0Fh 0Fh 03h 0Ch 03h 06h 0Ch 0Ah 00h 00h 05h 0Fh 06h 0Eh 06h 0Eh 06h 0Fh 0Fh 00h 00h 40h 00h 00h 00h 00h 00h 00h 04h 0Bh 0Eh 05h 04h 0Bh 02h 06h 04h 0Bh 0Eh 05h 04h 0Bh 02h 06h 00h 00h 03h 00h 0Ah 0Fh 0Fh 03h 0Ch 03h 40h 06h 0Ch 00h 01h 00h 07h 0Fh 08h 0Eh 08h 0Eh 08h 0Fh 0Fh 00h 00h 00h 00h 00h 00h 00h 00h 04h 0Bh 0Eh 07h 04h 0Bh 02h 08h 04h 0Bh 40h 0Eh 07h 04h 0Bh 02h 08h 00h 00h 01h 00h 0Ah 0Fh 0Fh 03h 0Ch 03h 06h 0Ch 03h 01h 00h 09h 0Fh 0Ah 0Eh 0Ah 0Eh 0Ah 0Fh 0Fh 00h 00h 40h 00h 00h 00h 00h 00h 00h 04h 0Bh 0Eh 09h 04h 0Bh 02h 0Ah 04h 0Bh 0Eh 09h 04h 0Bh 02h 0Ah 00h 00h 01h 00h 0Ah 0Fh 0Fh 03h 0Ch 03h 40h 06h 0Ch 06h 01h 00h 0Bh 0Fh 0Ch 0Eh 0Ch 0Eh 0Ch 0Fh 0Fh 00h 00h 00h 00h 00h 00h 00h 00h 04h 0Bh 0Eh 0Bh 04h 0Bh 02h 0Ch 04h 0Bh 40h 0Eh 0Bh 04h 0Bh 02h 0Ch 00h 00h 01h 00h 0Ah 0Fh 0Fh 03h 0Ch 03h 06h 0Ch 0Ch 01h 00h 0Dh 0Fh 0Fh 0Eh 0Fh 0Eh 0Fh 0Fh 0Fh 00h 00h 40h 00h 00h 00h 00h 00h 00h 00h 00h 0Fh 03h 00h 08h 0Fh 03h 04h 00h 02h 01h 08h 00h 0Bh 01h 00h 01h 04h 02h 00h 02h 0Dh 02h 00h 04h 40h 06h 03h 00h 08h 0Fh 03h 00h 0Ch 06h 03h 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 40h 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 00h 02h 0Dh 02h 01h 02h 00h 00h 02h 02h 09h 00h 08h 01h 0Bh 01h 00h 02h 0Dh 02h 00h 04h 06h 03h 00h 08h 40h 0Fh 03h 00h 08h 0Fh 03h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 40h 00h 00h 00h 00h 00h 00h 0Fh 02h 00h 00h 00h 03h 04h 02h 00h 03h 04h 02h 00h 03h 04h 02h 00h 03h 04h 02h 00h 04h 06h 03h 00h 08h 40h 0Fh 03h 00h 08h 0Fh 03h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 40h 00h 00h 00h 00h 00h 00h 00h 05h 04h 02h 00h 06h 0Dh 02h 00h 08h 0Fh 03h 00h 08h 0Fh 03h 00h 08h 0Fh 03h 00h 08h 0Fh 03h 00h 08h 40h 0Fh 03h 00h 08h 0Fh 03h 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 40h 0Fh 0Fh 0Fh 0Fh 0Fh 00h 04h 02h 0Fh 03h 04h 02h 01h 0Bh 01h 00h 0Fh 03h 0Fh 03h 00h 0Fh 03h 00h 0Fh 03h 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 40h 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 00h 04h 02h 0Dh 02h 00h 06h 03h 0Bh 01h 00h 0Dh 02h 06h 03h 00h 06h 03h 40h 00h 0Fh 03h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 04h 02h 06h 03h 04h 02h 01h 0Bh 40h 01h 00h 06h 03h 06h 03h 00h 06h 03h 0Fh 03h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 40h 00h 04h 02h 0Dh 02h 04h 02h 01h 0Bh 01h 00h 0Dh 02h 0Dh 02h 00h 06h 03h 0Fh 03h 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 40h 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 40h 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 0Fh 00h 00h 00h 03h 06h 00h 04h 00h 00h 00h 00h 00h 00h 00h 40h 00h 0Ch 0Fh 01h 00h 00h 09h 00h 00h 00h 00h 00h 00h 00h 01h 0Eh 01h 00h 00h 0Ch 0Ch 03h 00h 0Fh 01h 00h 00h 00h 00h 00h 00h 00h 40h 00h 0Eh 00h 00h 00h 00h 04h 00h 00h 00h 04h 00h 00h 00h 00h 00h 00h 00h 00h 00h 01h 00h 00h 00h 00h 00h 00h 00h 00h 0Ah 00h 0Ah 40h 00h 0Ah 00h 00h 00h 00h 0Ch 00h 00h 00h 00h 00h 00h 00h 00h 0Eh 00h 00h 00h 00h 04h 00h 00h 00h 04h 00h 00h 00h 00h 00h 00h 00h 40h 0Fh 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 0Ah 00h 0Ah 00h 0Ah 00h 00h 00h 00h 0Ch 00h 00h 00h 00h 00h 00h 00h 00h 0Eh 00h 00h 40h 00h 00h 04h 00h 00h 00h 04h 00h 00h 00h 00h 00h 00h 00h 0Fh 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 0Ah 00h 0Ah 00h 0Ah 00h 00h 40h 0Ch 00h 00h 00h 00h 00h 00h 00h 00h 00h F7h

Here are some of those dumps in binary format.

dump-3-1024bytes.syx (1 KB)
dump-3-1024bytes.syx (1 KB)

So It looks on the Eone the bytes are also not the correct size.
Not sure if this is related to the lua code, rate throttling or the timer.
I guess I could do a specific test.

11:21:12.387 lua: we recieved some data. length = 1014
11:21:12.388 lua: do something, this could be a program dump... yummy
11:21:12.388 lua: Received Program dump data. length = 1014

Some more test, report from LUA and the midiconsole

18:58:34.706 lua: we recieved some data. length = 1017
18:58:55.345 lua: Received Program dump data. length = 1032
18:59:12.509 lua: we recieved some data. length = 1015

another sanity check question – using MIDI OX, what are you sending to retrieve the patch dump?
The manual says:

image

so the sysex should be something like:

F0h 0Fh 01h 03h F7h for a program dump and
F0h 0Fh 01h 00h F7h for configuration dump

Note - the MIDI Ox dumps are cut off, the F7 is missing, which tells me you needed to copy the next chunk of data in the window

Yes this I am sending,

Get lower program
F0h 0Fh 01h 03h F7h
return header is F0 0F 01 05 00 0D

Get upper program
F0h 0Fh 01h 13h F7h
return header is F0h 0Fh 01h 15h 03h 0Ah

I was trying to implement you suggestion on wave select() but failed to do so.
Found some bugs and now got it fully working with this.

byte starts at 0 not 1,
Lua counts from 1
So syxByte should be 0 for [65] in the first wave block, 24 for waveblock 2 etc.

parameterOffset = ( waveSelect * 24 - 24 )  
waveParameter = { 65, 67, 68, 69, 70, 71, 72, 60, 61, 62, 63, 64 }  

for nameCount = 1, 11 do

syxByte = (parameterOffset + ( nameCount -1 ) )
print (string.format("syxByte %d", syxByte ))

if ( syxByte == ( parameterOffset + 4 ) ) or ( syxByte == ( parameterOffset + 5)) then
  deSyxHalf = math.floor(deSyx[syxByte] / 2)
  parameterMap.set(1, PT_VIRTUAL, waveParameter[nameCount], deSyxHalf)
  print (string.format("parameter %s - value / 2 = %d", waveParameter[nameCount], deSyxHalf))
else
  parameterMap.set(1, PT_VIRTUAL, waveParameter[nameCount], deSyx[syxByte])
  print (string.format("parameter %s - value = %d", waveParameter[nameCount], deSyx[syxByte]))
  end
end

This is a configuration dump:

F0h 0Fh 01h 02h 00h 00h 02h 03h 02h 00h 0Eh 01h 00h 04h 00h 00h 02h 02h 00h 0Ah 00h 00h 00h 03h 00h 00h 01h 00h 00h 00h 00h 00h 40h 01h 00h 00h 00h 00h 00h 0Fh 0Fh 0Fh 0Eh 00h 00h 00h 00h 01h 00h 00h 00h 0Fh 0Fh 01h 00h 00h 00h 00h 00h 00h 02h 00h 00h F7h

Also that is fully working.

The most challenging is the program dump.

So if my quick math is right, the total sysex dump for the program data should be: (625 *2 ) + 4 + 2 = 1256

The header data is only 4 bytes, so the entire RAW dump (before we process it) should be:

F0 0F 01 (05 or 15) + 1250 bytes + checksum byte + F7